From 68ee05b3fd2228cccd23041790d1b5dab9b847aa Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 22 Jun 2025 21:00:23 +0200 Subject: [PATCH] Adding upstream version 48.2. Signed-off-by: Daniel Baumann --- .editorconfig | 10 + .gitignore | 21 + .gitlab-ci.yml | 185 + .gitlab-ci/README.md | 23 + .gitlab-ci/cache-subprojects.sh | 10 + .gitlab-ci/debian.Dockerfile | 98 + .gitlab-ci/fedora.Dockerfile | 102 + .gitlab-ci/generate-help-index.py | 143 + .gitlab-ci/meson-junit-report.py | 114 + .gitlab-ci/run-docker.sh | 147 + .gitlab-ci/run-tests.sh | 49 + .gitlab/issue_templates/Default.md | 21 + .gitmodules | 3 + AUTHORS | 6 + COMMITMENT | 45 + COPYING | 339 + NEWS | 2625 +++++ README.md | 85 + RELEASE.md | 107 + build-aux/fuse-2.9.2-closefrom.patch | 24 + .../fuse-2.9.2-namespace-conflict-fix.patch | 25 + ...fuse-disable-sys-mount-under-flatpak.patch | 30 + build-aux/fusermount-wrapper.sh | 13 + build-aux/org.gnome.Software.Devel.json | 264 + .../org.gnome.Software.Devel.json.license | 2 + contrib/deployment-featured.ini | 4 + contrib/gnome-software.spec.in | 189 + .../org.gnome.Software.DeploymentFeatured.xml | 11 + data/assets/meson.build | 11 + data/assets/org.gnome.Software.Curated.xml | 121 + data/assets/org.gnome.Software.Featured.xml | 358 + data/assets/up-to-date.svg | 264 + data/autostart/org.gnome.Software.desktop.in | 7 + data/bash-completion/gnome-software | 80 + data/icons/hicolor/meson.build | 4 + .../hicolor/scalable/org.gnome.Software.svg | 24 + .../scalable/org.gnome.SoftwareDevel.svg | 69 + .../symbolic/org.gnome.Software-symbolic.svg | 5 + data/icons/meson.build | 19 + data/icons/org.gnome.Software.Create.svg | 70 + data/icons/org.gnome.Software.Develop.svg | 44 + data/icons/org.gnome.Software.Generic.svg | 37 + data/icons/org.gnome.Software.Learn.svg | 10 + data/icons/org.gnome.Software.Play.svg | 37 + data/icons/org.gnome.Software.Socialize.svg | 23 + data/icons/org.gnome.Software.Work.svg | 27 + .../symbolic/app-beta-software-symbolic.svg | 10 + .../symbolic/app-info-loading-symbolic.svg | 7 + .../icons/symbolic/app-installed-symbolic.svg | 7 + data/icons/symbolic/app-remove-symbolic.svg | 10 + .../icons/symbolic/app-safety-ok-symbolic.svg | 7 + .../symbolic/app-safety-unknown-symbolic.svg | 8 + .../symbolic/app-safety-unsafe-symbolic.svg | 8 + data/icons/symbolic/app-verified-symbolic.svg | 7 + .../symbolic/auditable-code-symbolic.svg | 8 + .../symbolic/community-approved-symbolic.svg | 8 + .../symbolic/community-blocked-symbolic.svg | 7 + .../symbolic/community-none-symbolic.svg | 9 + .../symbolic/community-supported-symbolic.svg | 8 + data/icons/symbolic/community-symbolic.svg | 8 + .../icons/symbolic/computer-fail-symbolic.svg | 8 + data/icons/symbolic/contact-symbolic.svg | 7 + .../device-support-adaptive-symbolic.svg | 7 + .../device-support-desktop-symbolic.svg | 7 + .../device-support-mobile-symbolic.svg | 8 + .../device-support-touch-symbolic.svg | 8 + .../device-support-unknown-symbolic.svg | 8 + .../symbolic/device-supported-symbolic.svg | 8 + .../icons/symbolic/document-edit-symbolic.svg | 10 + data/icons/symbolic/donate-symbolic.svg | 8 + .../icons/symbolic/external-link-symbolic.svg | 7 + data/icons/symbolic/help-link-symbolic.svg | 7 + data/icons/symbolic/info-symbolic.svg | 7 + .../symbolic/package-flatpak-symbolic.svg | 7 + .../symbolic/package-generic-symbolic.svg | 8 + data/icons/symbolic/package-snap-symbolic.svg | 8 + ...sions-legacy-windowing-system-symbolic.svg | 11 + .../permissions-microphone-symbolic.svg | 7 + .../permissions-sandboxed-symbolic.svg | 8 + .../permissions-screen-contents-symbolic.svg | 7 + .../permissions-system-devices-symbolic.svg | 8 + .../symbolic/permissions-warning-symbolic.svg | 8 + .../symbolic/proprietary-code-symbolic.svg | 8 + .../ratings/advertising-none-symbolic.svg | 7 + .../symbolic/ratings/advertising-symbolic.svg | 7 + .../ratings/alcohol-use-none-symbolic.svg | 8 + .../symbolic/ratings/alcohol-use-symbolic.svg | 8 + .../ratings/audio-chat-none-symbolic.svg | 7 + .../symbolic/ratings/audio-chat-symbolic.svg | 7 + .../symbolic/ratings/contacts-symbolic.svg | 7 + .../ratings/drug-use-none-symbolic.svg | 11 + .../symbolic/ratings/drug-use-symbolic.svg | 8 + .../ratings/gambling-none-symbolic.svg | 7 + .../symbolic/ratings/gambling-symbolic.svg | 7 + .../ratings/gay-content-none-symbolic.svg | 7 + .../symbolic/ratings/gay-content-symbolic.svg | 7 + .../ratings/human-remains-symbolic.svg | 7 + .../ratings/messaging-none-symbolic.svg | 7 + .../symbolic/ratings/messaging-symbolic.svg | 7 + .../symbolic/ratings/money-none-symbolic.svg | 7 + .../icons/symbolic/ratings/money-symbolic.svg | 7 + .../symbolic/ratings/nudity-none-symbolic.svg | 7 + .../symbolic/ratings/nudity-symbolic.svg | 7 + .../ratings/smoking-none-symbolic.svg | 8 + .../symbolic/ratings/smoking-symbolic.svg | 8 + .../symbolic/ratings/social-info-symbolic.svg | 7 + .../ratings/strong-language-none-symbolic.svg | 7 + .../ratings/strong-language-symbolic.svg | 7 + .../ratings/violence-none-symbolic.svg | 7 + .../symbolic/ratings/violence-symbolic.svg | 7 + .../review-rate-negative-symbolic.svg | 6 + .../review-rate-positive-symbolic.svg | 6 + .../icons/symbolic/review-report-symbolic.svg | 11 + data/icons/symbolic/review-symbolic.svg | 7 + .../symbolic/software-explore-symbolic.svg | 7 + .../symbolic/software-installed-symbolic.svg | 7 + .../symbolic/software-license-symbolic.svg | 8 + .../symbolic/software-updates-symbolic.svg | 7 + data/icons/symbolic/starred-symbolic.svg | 10 + data/icons/symbolic/translations-symbolic.svg | 7 + .../symbolic/warning-outline-symbolic.svg | 10 + data/icons/symbolic/webpage-symbolic.svg | 7 + data/icons/system-component-addon.svg | 35 + data/icons/system-component-application.svg | 25 + data/icons/system-component-codecs.svg | 25 + data/icons/system-component-driver.svg | 145 + data/icons/system-component-firmware.svg | 145 + data/icons/system-component-input-sources.svg | 36 + data/icons/system-component-language.svg | 28 + data/icons/system-component-os-updates.svg | 28 + data/icons/system-component-runtime.svg | 25 + data/meson.build | 65 + data/metainfo/meson.build | 22 + .../org.gnome.Software.metainfo.xml.in | 2816 ++++++ data/metainfo/ss-details.png | Bin 0 -> 69077 bytes data/metainfo/ss-details2.png | Bin 0 -> 110747 bytes data/metainfo/ss-installed.png | Bin 0 -> 64823 bytes data/metainfo/ss-overview.png | Bin 0 -> 70891 bytes data/metainfo/ss-up-to-date.png | Bin 0 -> 52734 bytes data/metainfo/ss-updates-details.png | Bin 0 -> 70319 bytes data/metainfo/ss-updates.png | Bin 0 -> 74513 bytes ...rg.gnome.software.dkms-helper.policy.in.in | 54 + ...e.software.external-appstream.policy.in.in | 20 + data/org.gnome.software.gschema.xml | 161 + data/tests/os-release | 16 + doc/api/gnome-software-docs.xml | 773 ++ doc/api/gnome-software.types | 6 + doc/api/gs-example-details.png | Bin 0 -> 53714 bytes doc/api/gs-example-installed.png | Bin 0 -> 106482 bytes doc/api/gs-example-search.png | Bin 0 -> 24934 bytes doc/api/meson.build | 11 + doc/app-developers.md | 69 + doc/debugging.md | 66 + doc/design.svg | 448 + doc/media/featured-curated.png | Bin 0 -> 91876 bytes doc/media/gnome-os-upgrade-banner.png | Bin 0 -> 117002 bytes doc/meson.build | 3 + doc/privacy-policy.html | 31 + doc/update.sh | 1 + doc/use-cases.md | 38 + doc/vendor-customisation.md | 243 + gnome-software.doap | 47 + gs-install-appstream/gs-install-appstream.c | 227 + gs-install-appstream/meson.build | 19 + help/C/figures/app-context-bar.png | Bin 0 -> 18377 bytes help/C/figures/app-screenshot.png | Bin 0 -> 31719 bytes help/C/figures/carousel.png | Bin 0 -> 27137 bytes .../figures/install-webapp-from-gnome-web.png | Bin 0 -> 113102 bytes .../scalable/license-community-built.svg | 416 + .../license-proprietary-and-special.svg | 424 + help/C/figures/scalable/license-unknown.svg | 433 + help/C/figures/scalable/links.svg | 766 ++ help/C/figures/scalable/no-links.svg | 90 + .../symbolic/computer-fail-symbolic.svg | 1 + .../scalable/symbolic/contact-symbolic.svg | 1 + .../scalable/symbolic/donate-symbolic.svg | 1 + .../scalable/symbolic/help-link-symbolic.svg | 1 + .../symbolic/image-missing-symbolic.svg | 8 + .../symbolic/translations-symbolic.svg | 1 + .../scalable/symbolic/webpage-symbolic.svg | 1 + help/C/how-to-reinstall-a-web-app.page | 42 + help/C/index.page | 14 + help/C/legal.xml | 10 + help/C/software-licensing.page | 35 + help/C/software-metadata.page | 379 + help/LINGUAS | 11 + help/cs/cs.po | 1137 +++ help/cs/figures/app-context-bar.png | Bin 0 -> 22495 bytes help/de/de.po | 1459 +++ help/de/figures/app-context-bar.png | Bin 0 -> 24330 bytes help/eu/eu.po | 1200 +++ help/fr/figures/app-context-bar.png | Bin 0 -> 22026 bytes help/fr/fr.po | 1552 +++ help/hu/figures/app-context-bar.png | Bin 0 -> 27297 bytes help/hu/hu.po | 1533 +++ help/id/id.po | 1435 +++ help/meson.build | 35 + help/pt_BR/figures/app-context-bar.png | Bin 0 -> 23915 bytes help/pt_BR/pt_BR.po | 1536 +++ help/ru/figures/app-context-bar.png | Bin 0 -> 23927 bytes help/ru/ru.po | 1530 +++ help/sv/figures/app-context-bar.png | Bin 0 -> 15589 bytes help/sv/sv.po | 1423 +++ help/uk/figures/app-context-bar.png | Bin 0 -> 8242 bytes help/uk/uk.po | 1548 +++ lib/README.md | 7 + lib/gnome-software-private.h | 24 + lib/gnome-software.h | 52 + lib/gs-app-collation.h | 21 + lib/gs-app-list-private.h | 50 + lib/gs-app-list.c | 1022 ++ lib/gs-app-list.h | 90 + lib/gs-app-permissions.c | 491 + lib/gs-app-permissions.h | 123 + lib/gs-app-private.h | 33 + lib/gs-app-query.c | 1452 +++ lib/gs-app-query.h | 145 + lib/gs-app.c | 7060 +++++++++++++ lib/gs-app.h | 572 ++ lib/gs-appstream.c | 3341 ++++++ lib/gs-appstream.h | 112 + lib/gs-build-ident.h.in | 32 + lib/gs-category-manager.c | 151 + lib/gs-category-manager.h | 32 + lib/gs-category-private.h | 21 + lib/gs-category.c | 724 ++ lib/gs-category.h | 45 + lib/gs-cmd.c | 794 ++ lib/gs-debug.c | 298 + lib/gs-debug.h | 27 + lib/gs-desktop-data.c | 320 + lib/gs-desktop-data.h | 43 + lib/gs-dkms-private.c | 514 + lib/gs-dkms-private.h | 98 + lib/gs-download-utils.c | 1013 ++ lib/gs-download-utils.h | 95 + lib/gs-external-appstream-utils.c | 723 ++ lib/gs-external-appstream-utils.h | 51 + lib/gs-fedora-third-party.c | 514 + lib/gs-fedora-third-party.h | 95 + lib/gs-icon-downloader.c | 397 + lib/gs-icon-downloader.h | 43 + lib/gs-icon.c | 315 + lib/gs-icon.h | 32 + lib/gs-ioprio.c | 197 + lib/gs-ioprio.h | 31 + lib/gs-job-manager.c | 724 ++ lib/gs-job-manager.h | 72 + lib/gs-key-colors.c | 324 + lib/gs-key-colors.h | 27 + lib/gs-metered.c | 551 + lib/gs-metered.h | 49 + lib/gs-odrs-provider.c | 2160 ++++ lib/gs-odrs-provider.h | 137 + lib/gs-os-release.c | 408 + lib/gs-os-release.h | 35 + lib/gs-plugin-event.c | 453 + lib/gs-plugin-event.h | 61 + lib/gs-plugin-helpers.c | 1010 ++ lib/gs-plugin-helpers.h | 279 + lib/gs-plugin-job-cancel-offline-update.c | 271 + lib/gs-plugin-job-cancel-offline-update.h | 25 + lib/gs-plugin-job-download-upgrade.c | 302 + lib/gs-plugin-job-download-upgrade.h | 26 + lib/gs-plugin-job-file-to-app.c | 437 + lib/gs-plugin-job-file-to-app.h | 28 + lib/gs-plugin-job-install-apps.c | 609 ++ lib/gs-plugin-job-install-apps.h | 31 + lib/gs-plugin-job-launch.c | 301 + lib/gs-plugin-job-launch.h | 26 + lib/gs-plugin-job-list-apps.c | 632 ++ lib/gs-plugin-job-list-apps.h | 31 + lib/gs-plugin-job-list-categories.c | 389 + lib/gs-plugin-job-list-categories.h | 29 + lib/gs-plugin-job-list-distro-upgrades.c | 437 + lib/gs-plugin-job-list-distro-upgrades.h | 30 + lib/gs-plugin-job-manage-repository.c | 371 + lib/gs-plugin-job-manage-repository.h | 26 + lib/gs-plugin-job-private.h | 41 + lib/gs-plugin-job-refine.c | 959 ++ lib/gs-plugin-job-refine.h | 31 + lib/gs-plugin-job-refresh-metadata.c | 586 ++ lib/gs-plugin-job-refresh-metadata.h | 28 + lib/gs-plugin-job-trigger-upgrade.c | 302 + lib/gs-plugin-job-trigger-upgrade.h | 26 + lib/gs-plugin-job-uninstall-apps.c | 578 ++ lib/gs-plugin-job-uninstall-apps.h | 31 + lib/gs-plugin-job-update-apps.c | 609 ++ lib/gs-plugin-job-update-apps.h | 31 + lib/gs-plugin-job-url-to-app.c | 512 + lib/gs-plugin-job-url-to-app.h | 28 + lib/gs-plugin-job.c | 567 ++ lib/gs-plugin-job.h | 65 + lib/gs-plugin-loader-sync.c | 249 + lib/gs-plugin-loader-sync.h | 42 + lib/gs-plugin-loader.c | 3894 +++++++ lib/gs-plugin-loader.h | 127 + lib/gs-plugin-private.h | 54 + lib/gs-plugin-types.h | 480 + lib/gs-plugin-vfuncs.h | 84 + lib/gs-plugin.c | 2128 ++++ lib/gs-plugin.h | 475 + lib/gs-profiler.h | 153 + lib/gs-remote-icon.c | 401 + lib/gs-remote-icon.h | 38 + lib/gs-rewrite-resources.c | 226 + lib/gs-rewrite-resources.h | 27 + lib/gs-self-test.c | 827 ++ lib/gs-test.c | 155 + lib/gs-test.h | 27 + lib/gs-utils.c | 1873 ++++ lib/gs-utils.h | 168 + lib/gs-worker-thread.c | 468 + lib/gs-worker-thread.h | 41 + lib/meson.build | 245 + lib/tests/app-permissions.c | 123 + lib/tests/meson.build | 49 + lib/tools/meson.build | 24 + lib/tools/profile-key-colors.c | 175 + meson.build | 338 + meson_options.txt | 29 + meson_post_install.sh | 14 + plugins/core/gs-plugin-appstream.c | 1703 ++++ plugins/core/gs-plugin-appstream.h | 22 + plugins/core/gs-plugin-generic-updates.c | 157 + plugins/core/gs-plugin-generic-updates.h | 22 + plugins/core/gs-plugin-hardcoded-blocklist.c | 121 + plugins/core/gs-plugin-hardcoded-blocklist.h | 22 + plugins/core/gs-plugin-icons.c | 227 + plugins/core/gs-plugin-icons.h | 22 + plugins/core/gs-plugin-os-release.c | 180 + plugins/core/gs-plugin-os-release.h | 22 + plugins/core/gs-plugin-provenance-license.c | 199 + plugins/core/gs-plugin-provenance-license.h | 22 + plugins/core/gs-plugin-provenance.c | 292 + plugins/core/gs-plugin-provenance.h | 22 + plugins/core/gs-self-test.c | 277 + plugins/core/meson.build | 92 + plugins/core/tests/os-release | 1 + plugins/dkms/gs-dkms-helper.c | 291 + plugins/dkms/gs-plugin-dkms.c | 351 + plugins/dkms/gs-plugin-dkms.h | 20 + plugins/dkms/meson.build | 30 + plugins/dpkg/gs-plugin-dpkg.c | 207 + plugins/dpkg/gs-plugin-dpkg.h | 22 + plugins/dpkg/gs-self-test.c | 85 + plugins/dpkg/meson.build | 31 + plugins/dpkg/tests/build-deb.sh | 1 + plugins/dpkg/tests/chiron-1.1-1.deb | Bin 0 -> 806 bytes plugins/dpkg/tests/debian/DEBIAN/control | 13 + plugins/dpkg/tests/debian/usr/bin/chiron | 0 plugins/dummy/gs-plugin-dummy.c | 1568 +++ plugins/dummy/gs-plugin-dummy.h | 22 + plugins/dummy/gs-self-test.c | 948 ++ plugins/dummy/meson.build | 39 + plugins/eos-updater/com.endlessm.Updater.xml | 311 + plugins/eos-updater/gs-plugin-eos-updater.c | 1627 +++ plugins/eos-updater/gs-plugin-eos-updater.h | 22 + plugins/eos-updater/meson.build | 22 + plugins/eos-updater/tests/eos_updater.py | 445 + plugins/eos-updater/tests/manual-test.py | 434 + plugins/epiphany/gs-plugin-epiphany.c | 1639 +++ plugins/epiphany/gs-plugin-epiphany.h | 20 + plugins/epiphany/gs-self-test.c | 238 + plugins/epiphany/meson.build | 84 + ...org.freedesktop.portal.DynamicLauncher.xml | 332 + .../org.gnome.Epiphany.WebAppProvider.xml | 85 + ...e.Software.Plugin.Epiphany.metainfo.xml.in | 11 + .../gs-plugin-fedora-langpacks.c | 138 + .../gs-plugin-fedora-langpacks.h | 22 + plugins/fedora-langpacks/gs-self-test.c | 88 + plugins/fedora-langpacks/meson.build | 30 + .../gs-plugin-fedora-pkgdb-collections.c | 841 ++ .../gs-plugin-fedora-pkgdb-collections.h | 22 + plugins/fedora-pkgdb-collections/meson.build | 10 + plugins/flatpak/gs-flatpak-app.c | 190 + plugins/flatpak/gs-flatpak-app.h | 65 + plugins/flatpak/gs-flatpak-transaction.c | 938 ++ plugins/flatpak/gs-flatpak-transaction.h | 39 + plugins/flatpak/gs-flatpak-utils.c | 274 + plugins/flatpak/gs-flatpak-utils.h | 24 + plugins/flatpak/gs-flatpak.c | 4838 +++++++++ plugins/flatpak/gs-flatpak.h | 191 + plugins/flatpak/gs-plugin-flatpak.c | 3109 ++++++ plugins/flatpak/gs-plugin-flatpak.h | 22 + plugins/flatpak/gs-self-test.c | 2011 ++++ plugins/flatpak/meson.build | 59 + ...me.Software.Plugin.Flatpak.metainfo.xml.in | 12 + .../tests/app-extension-update/.gitignore | 1 + .../org.test.Chiron.Extension/.gitignore | 1 + .../org.test.Chiron.Extension/files/.empty | 0 .../files/share/libtest/README | 1 + .../org.test.Chiron.Extension.metainfo.xml | 12 + .../org.test.Chiron.Extension/metadata | 6 + .../flatpak/tests/app-extension/.gitignore | 1 + .../org.test.Chiron.Extension/.gitignore | 1 + .../org.test.Chiron.Extension/files/.empty | 0 .../files/share/libtest/README | 0 .../org.test.Chiron.Extension.metainfo.xml | 12 + .../org.test.Chiron.Extension/metadata | 6 + .../app-extension/org.test.Chiron/.gitignore | 2 + .../org.test.Chiron/files/bin/chiron.sh | 2 + .../share/appdata/org.test.Chiron.appdata.xml | 16 + .../applications/org.test.Chiron.desktop | 6 + .../hicolor/128x128/apps/org.test.Chiron.png | Bin 0 -> 334 bytes .../app-extension/org.test.Chiron/metadata | 10 + .../tests/app-missing-runtime/.gitignore | 1 + .../tests/app-missing-runtime/org.test.Chiron | 1 + plugins/flatpak/tests/app-update/.gitignore | 1 + .../app-update/org.test.Chiron/.gitignore | 2 + .../org.test.Chiron/files/bin/chiron.sh | 2 + .../share/appdata/org.test.Chiron.appdata.xml | 19 + .../applications/org.test.Chiron.desktop | 1 + .../hicolor/128x128/apps/org.test.Chiron.png | 1 + .../tests/app-update/org.test.Chiron/metadata | 4 + .../flatpak/tests/app-with-runtime/.gitignore | 1 + .../org.test.Chiron/.gitignore | 2 + .../org.test.Chiron/files/bin/chiron.sh | 2 + .../share/appdata/org.test.Chiron.appdata.xml | 16 + .../applications/org.test.Chiron.desktop | 7 + .../hicolor/128x128/apps/org.test.Chiron.png | Bin 0 -> 334 bytes .../app-with-runtime/org.test.Chiron/metadata | 4 + .../org.test.Runtime/files/.empty | 0 .../org.test.Runtime/metadata | 3 + .../org.test.Runtime/usr/.gitignore | 1 + .../org.test.Runtime/usr/share/libtest/README | 0 .../metainfo/org.test.Runtime.metainfo.xml | 10 + plugins/flatpak/tests/build.py | 125 + plugins/flatpak/tests/chiron.flatpak | Bin 0 -> 5452 bytes plugins/flatpak/tests/flatpakrepos.tar.gz | Bin 0 -> 72252 bytes plugins/flatpak/tests/meson.build | 34 + plugins/flatpak/tests/only-runtime/.gitignore | 1 + .../tests/only-runtime/org.test.Runtime | 1 + plugins/fwupd/gs-fwupd-app.c | 419 + plugins/fwupd/gs-fwupd-app.h | 32 + plugins/fwupd/gs-plugin-fwupd.c | 2310 +++++ plugins/fwupd/gs-plugin-fwupd.h | 22 + plugins/fwupd/gs-self-test.c | 106 + plugins/fwupd/meson.build | 50 + ...nome.Software.Plugin.Fwupd.metainfo.xml.in | 12 + plugins/fwupd/tests/build-cab.sh | 4 + plugins/fwupd/tests/chiron-0.2.cab | Bin 0 -> 34376 bytes plugins/fwupd/tests/firmware.dfu | Bin 0 -> 32784 bytes plugins/fwupd/tests/firmware.dfu.asc | 11 + plugins/fwupd/tests/firmware.metainfo.xml | 30 + plugins/malcontent/gs-plugin-malcontent.c | 480 + plugins/malcontent/gs-plugin-malcontent.h | 22 + plugins/malcontent/meson.build | 10 + plugins/meson.build | 52 + plugins/modalias/gs-plugin-modalias.c | 199 + plugins/modalias/gs-plugin-modalias.h | 22 + plugins/modalias/gs-self-test.c | 113 + plugins/modalias/meson.build | 32 + .../gs-plugin-opensuse-distro-upgrade.c | 610 ++ .../gs-plugin-opensuse-distro-upgrade.h | 19 + plugins/opensuse-distro-upgrade/meson.build | 10 + plugins/packagekit/gs-markdown.c | 1067 ++ plugins/packagekit/gs-markdown.h | 41 + plugins/packagekit/gs-packagekit-helper.c | 193 + plugins/packagekit/gs-packagekit-helper.h | 40 + plugins/packagekit/gs-packagekit-task.c | 279 + plugins/packagekit/gs-packagekit-task.h | 58 + plugins/packagekit/gs-plugin-packagekit.c | 5463 ++++++++++ plugins/packagekit/gs-plugin-packagekit.h | 22 + plugins/packagekit/gs-self-test.c | 291 + plugins/packagekit/meson.build | 47 + plugins/packagekit/packagekit-common.c | 635 ++ plugins/packagekit/packagekit-common.h | 44 + plugins/packagekit/tests/build-rpm.sh | 2 + .../tests/chiron-1.1-1.fc24.x86_64.rpm | Bin 0 -> 6414 bytes plugins/packagekit/tests/chiron.spec | 22 + plugins/repos/gs-plugin-repos.c | 425 + plugins/repos/gs-plugin-repos.h | 22 + plugins/repos/gs-self-test.c | 71 + plugins/repos/meson.build | 31 + plugins/repos/tests/yum.repos.d/utopia.repo | 5 + plugins/rpm-ostree/gs-plugin-rpm-ostree.c | 3667 +++++++ plugins/rpm-ostree/gs-plugin-rpm-ostree.h | 22 + plugins/rpm-ostree/meson.build | 20 + .../org.projectatomic.rpmostree1.xml | 605 ++ plugins/snap/gs-plugin-snap.c | 2724 +++++ plugins/snap/gs-plugin-snap.h | 22 + plugins/snap/gs-self-test.c | 391 + plugins/snap/meson.build | 44 + ...gnome.Software.Plugin.Snap.metainfo.xml.in | 12 + .../gs-plugin-systemd-sysupdate.c | 2757 +++++ .../gs-plugin-systemd-sysupdate.h | 21 + plugins/systemd-sysupdate/gs-self-test.c | 1763 ++++ plugins/systemd-sysupdate/meson.build | 61 + .../org.freedesktop.sysupdate1.xml | 141 + .../systemd-sysupdate/services/meson.build | 17 + .../org.freedesktop.sysupdate1.service.in | 10 + po/LINGUAS | 71 + po/POTFILES.in | 132 + po/POTFILES.skip | 1 + po/ab.po | 8938 ++++++++++++++++ po/af.po | 5120 ++++++++++ po/ar.po | 5166 ++++++++++ po/as.po | 2007 ++++ po/be.po | 6941 +++++++++++++ po/bg.po | 6424 ++++++++++++ po/bn.po | 3883 +++++++ po/bs.po | 2321 +++++ po/ca.po | 6433 ++++++++++++ po/ca@valencia.po | 4789 +++++++++ po/ckb.po | 4174 ++++++++ po/cs.po | 6761 +++++++++++++ po/da.po | 7364 ++++++++++++++ po/de.po | 7901 +++++++++++++++ po/el.po | 8406 +++++++++++++++ po/en_GB.po | 8137 +++++++++++++++ po/eo.po | 6152 +++++++++++ po/es.po | 8922 ++++++++++++++++ po/eu.po | 7364 ++++++++++++++ po/fa.po | 7756 ++++++++++++++ po/fi.po | 8580 ++++++++++++++++ po/fil.po | 6105 +++++++++++ po/fr.po | 6498 ++++++++++++ po/fur.po | 8659 ++++++++++++++++ po/ga.po | 2331 +++++ po/gd.po | 5097 ++++++++++ po/gl.po | 6373 ++++++++++++ po/he.po | 8199 +++++++++++++++ po/hi.po | 6300 ++++++++++++ po/hr.po | 7456 ++++++++++++++ po/hu.po | 6445 ++++++++++++ po/id.po | 6357 ++++++++++++ po/ie.po | 3681 +++++++ po/is.po | 5751 +++++++++++ po/it.po | 6239 ++++++++++++ po/ja.po | 7274 +++++++++++++ po/ka.po | 6609 ++++++++++++ po/kab.po | 6276 ++++++++++++ po/kk.po | 8201 +++++++++++++++ po/km.po | 1900 ++++ po/ko.po | 6704 ++++++++++++ po/lt.po | 8652 ++++++++++++++++ po/lv.po | 7679 ++++++++++++++ po/meson.build | 6 + po/mjw.po | 4203 ++++++++ po/ml.po | 3961 ++++++++ po/mr.po | 3881 +++++++ po/ms.po | 4380 ++++++++ po/nb.po | 6388 ++++++++++++ po/ne.po | 7401 ++++++++++++++ po/nl.po | 8601 ++++++++++++++++ po/oc.po | 8977 +++++++++++++++++ po/pa.po | 8628 ++++++++++++++++ po/pl.po | 6446 ++++++++++++ po/pt.po | 7984 +++++++++++++++ po/pt_BR.po | 6986 +++++++++++++ po/ro.po | 6443 ++++++++++++ po/ru.po | 6852 +++++++++++++ po/sk.po | 8600 ++++++++++++++++ po/sl.po | 6434 ++++++++++++ po/sr.po | 8624 ++++++++++++++++ po/sr@latin.po | 8624 ++++++++++++++++ po/sv.po | 8602 ++++++++++++++++ po/te.po | 1812 ++++ po/th.po | 7000 +++++++++++++ po/tr.po | 6345 ++++++++++++ po/uk.po | 7585 ++++++++++++++ po/uz.po | 6412 ++++++++++++ po/vi.po | 7712 ++++++++++++++ po/zh_CN.po | 8325 +++++++++++++++ po/zh_HK.po | 2086 ++++ po/zh_TW.po | 8492 ++++++++++++++++ ...ome-software-local-file-flatpak.desktop.in | 11 + ...gnome-software-local-file-fwupd.desktop.in | 11 + ...-software-local-file-packagekit.desktop.in | 11 + src/gnome-software-local-file-snap.desktop.in | 11 + src/gnome-software.gresource.xml | 143 + src/gnome-software.xml | 131 + src/gs-age-rating-context-dialog.c | 1264 +++ src/gs-age-rating-context-dialog.h | 49 + src/gs-age-rating-context-dialog.ui | 72 + src/gs-app-addon-row.c | 279 + src/gs-app-addon-row.h | 27 + src/gs-app-addon-row.ui | 37 + src/gs-app-context-bar.c | 1073 ++ src/gs-app-context-bar.h | 31 + src/gs-app-context-bar.ui | 257 + src/gs-app-details-page.c | 482 + src/gs-app-details-page.h | 27 + src/gs-app-details-page.ui | 107 + src/gs-app-reviews-dialog.c | 689 ++ src/gs-app-reviews-dialog.h | 37 + src/gs-app-reviews-dialog.ui | 58 + src/gs-app-row.c | 1365 +++ src/gs-app-row.h | 57 + src/gs-app-row.ui | 287 + src/gs-app-tile.c | 183 + src/gs-app-tile.h | 32 + src/gs-app-translation-dialog.c | 275 + src/gs-app-translation-dialog.h | 32 + src/gs-app-translation-dialog.ui | 109 + src/gs-app-version-history-dialog.c | 92 + src/gs-app-version-history-dialog.h | 23 + src/gs-app-version-history-dialog.ui | 33 + src/gs-app-version-history-row.c | 198 + src/gs-app-version-history-row.h | 32 + src/gs-app-version-history-row.ui | 55 + src/gs-application.c | 1574 +++ src/gs-application.h | 31 + src/gs-basic-auth-dialog.c | 153 + src/gs-basic-auth-dialog.h | 28 + src/gs-basic-auth-dialog.ui | 76 + src/gs-category-page.c | 951 ++ src/gs-category-page.h | 25 + src/gs-category-page.ui | 158 + src/gs-category-tile.c | 213 + src/gs-category-tile.h | 26 + src/gs-category-tile.ui | 34 + src/gs-common.c | 1477 +++ src/gs-common.h | 80 + src/gs-context-dialog-row.c | 376 + src/gs-context-dialog-row.h | 71 + src/gs-context-dialog-row.ui | 22 + src/gs-css.c | 313 + src/gs-css.h | 36 + src/gs-dbus-helper.c | 970 ++ src/gs-dbus-helper.h | 23 + src/gs-description-box.c | 540 + src/gs-description-box.h | 34 + src/gs-details-page.c | 3210 ++++++ src/gs-details-page.h | 44 + src/gs-details-page.ui | 1230 +++ src/gs-dkms-dialog.c | 273 + src/gs-dkms-dialog.h | 23 + src/gs-dkms-dialog.ui | 264 + src/gs-extras-page.c | 1448 +++ src/gs-extras-page.h | 41 + src/gs-extras-page.ui | 102 + src/gs-feature-tile.c | 774 ++ src/gs-feature-tile.h | 27 + src/gs-feature-tile.ui | 86 + src/gs-featured-carousel.c | 436 + src/gs-featured-carousel.h | 31 + src/gs-featured-carousel.ui | 86 + src/gs-hardware-support-context-dialog.c | 951 ++ src/gs-hardware-support-context-dialog.h | 51 + src/gs-hardware-support-context-dialog.ui | 74 + src/gs-help-overlay.ui | 76 + src/gs-info-window.c | 122 + src/gs-info-window.h | 33 + src/gs-info-window.ui | 23 + src/gs-installed-page.c | 981 ++ src/gs-installed-page.h | 26 + src/gs-installed-page.ui | 157 + src/gs-language.c | 163 + src/gs-language.h | 26 + src/gs-layout-manager.c | 110 + src/gs-layout-manager.h | 29 + src/gs-license-tile.c | 423 + src/gs-license-tile.h | 31 + src/gs-license-tile.ui | 95 + src/gs-loading-page.c | 257 + src/gs-loading-page.h | 29 + src/gs-loading-page.ui | 33 + src/gs-lozenge.c | 470 + src/gs-lozenge.h | 38 + src/gs-lozenge.ui | 33 + src/gs-main.c | 51 + src/gs-origin-popover-row.c | 204 + src/gs-origin-popover-row.h | 30 + src/gs-origin-popover-row.ui | 155 + src/gs-os-update-page.c | 461 + src/gs-os-update-page.h | 26 + src/gs-os-update-page.ui | 19 + src/gs-overview-page.c | 1363 +++ src/gs-overview-page.h | 25 + src/gs-overview-page.ui | 224 + src/gs-page.c | 1012 ++ src/gs-page.h | 79 + src/gs-prefs-dialog.c | 142 + src/gs-prefs-dialog.h | 24 + src/gs-prefs-dialog.ui | 108 + src/gs-progress-button.c | 349 + src/gs-progress-button.h | 38 + src/gs-progress-button.ui | 36 + src/gs-removal-dialog.c | 169 + src/gs-removal-dialog.h | 26 + src/gs-removal-dialog.ui | 62 + src/gs-remove-app-dialog.ui | 53 + src/gs-repo-row.c | 596 ++ src/gs-repo-row.h | 38 + src/gs-repo-row.ui | 99 + src/gs-repos-dialog.c | 866 ++ src/gs-repos-dialog.h | 25 + src/gs-repos-dialog.ui | 61 + src/gs-repos-section.c | 282 + src/gs-repos-section.h | 34 + src/gs-restarter.c | 216 + src/gs-review-bar.c | 72 + src/gs-review-bar.h | 24 + src/gs-review-dialog.c | 360 + src/gs-review-dialog.h | 31 + src/gs-review-dialog.ui | 178 + src/gs-review-histogram.c | 138 + src/gs-review-histogram.h | 30 + src/gs-review-histogram.ui | 390 + src/gs-review-row.c | 338 + src/gs-review-row.h | 55 + src/gs-review-row.ui | 162 + src/gs-safety-context-dialog.c | 788 ++ src/gs-safety-context-dialog.h | 32 + src/gs-safety-context-dialog.ui | 161 + src/gs-screenshot-carousel.c | 364 + src/gs-screenshot-carousel.h | 27 + src/gs-screenshot-carousel.ui | 146 + src/gs-screenshot-image.c | 902 ++ src/gs-screenshot-image.h | 45 + src/gs-screenshot-image.ui | 96 + src/gs-search-page.c | 593 ++ src/gs-search-page.h | 28 + src/gs-search-page.ui | 84 + src/gs-self-test.c | 52 + src/gs-shell-search-provider.c | 415 + src/gs-shell-search-provider.h | 26 + src/gs-shell.c | 2689 +++++ src/gs-shell.h | 94 + src/gs-shell.ui | 408 + src/gs-star-image.c | 242 + src/gs-star-image.h | 25 + src/gs-star-widget.c | 392 + src/gs-star-widget.h | 38 + src/gs-star-widget.ui | 18 + src/gs-storage-context-dialog.c | 419 + src/gs-storage-context-dialog.h | 32 + src/gs-storage-context-dialog.ui | 78 + src/gs-summary-tile.c | 297 + src/gs-summary-tile.h | 21 + src/gs-summary-tile.ui | 153 + src/gs-toast.c | 193 + src/gs-toast.h | 33 + src/gs-update-dialog.c | 348 + src/gs-update-dialog.h | 27 + src/gs-update-dialog.ui | 91 + src/gs-update-list.c | 151 + src/gs-update-list.h | 32 + src/gs-update-monitor.c | 1642 +++ src/gs-update-monitor.h | 29 + src/gs-updates-page.c | 1466 +++ src/gs-updates-page.h | 26 + src/gs-updates-page.ui | 252 + src/gs-updates-paused-banner.c | 196 + src/gs-updates-paused-banner.h | 46 + src/gs-updates-section.c | 778 ++ src/gs-updates-section.h | 48 + src/gs-updates-section.ui | 110 + src/gs-upgrade-banner.c | 420 + src/gs-upgrade-banner.h | 35 + src/gs-upgrade-banner.ui | 234 + src/gs-utils-error-dialog-simple.ui | 75 + src/gs-vendor.c | 127 + src/gs-vendor.h | 33 + src/meson.build | 327 + src/org.freedesktop.PackageKit.Modify2.xml | 560 + src/org.freedesktop.PackageKit.service.in | 3 + src/org.freedesktop.PackageKit.xml | 506 + src/org.gnome.Software-search-provider.ini | 5 + src/org.gnome.Software.desktop.in | 17 + src/org.gnome.Software.service.in | 3 + src/shell-search-provider-dbus-interfaces.xml | 44 + src/style-dark.css | 117 + src/style-hc.css | 33 + src/style.css | 565 ++ subprojects/appstream.wrap | 5 + subprojects/gnome-pwa-list.wrap | 6 + subprojects/gnome-pwa-list/README.md | 61 + .../gnome-pwa-list/gnome-pwa-list-foss.csv | 10 + .../gnome-pwa-list/gnome-pwa-list-foss.xml | 310 + .../gnome-pwa-list-proprietary.csv | 2 + .../gnome-pwa-list-proprietary.xml | 62 + subprojects/gnome-pwa-list/meson.build | 14 + .../gnome-pwa-list/pwa-metainfo-generator.py | 213 + subprojects/gtk.wrap | 5 + subprojects/libadwaita.wrap | 5 + subprojects/libglib-testing.wrap | 5 + subprojects/libxmlb.wrap | 5 + subprojects/malcontent.wrap | 5 + subprojects/sysprof.wrap | 5 + tests/actions.py | 61 + tests/basic.py | 151 + tests/template.test.in | 6 + 785 files changed, 643332 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .gitlab-ci/README.md create mode 100755 .gitlab-ci/cache-subprojects.sh create mode 100644 .gitlab-ci/debian.Dockerfile create mode 100644 .gitlab-ci/fedora.Dockerfile create mode 100755 .gitlab-ci/generate-help-index.py create mode 100755 .gitlab-ci/meson-junit-report.py create mode 100755 .gitlab-ci/run-docker.sh create mode 100755 .gitlab-ci/run-tests.sh create mode 100644 .gitlab/issue_templates/Default.md create mode 100644 .gitmodules create mode 100644 AUTHORS create mode 100644 COMMITMENT create mode 100644 COPYING create mode 100644 NEWS create mode 100644 README.md create mode 100644 RELEASE.md create mode 100644 build-aux/fuse-2.9.2-closefrom.patch create mode 100644 build-aux/fuse-2.9.2-namespace-conflict-fix.patch create mode 100644 build-aux/fuse-disable-sys-mount-under-flatpak.patch create mode 100644 build-aux/fusermount-wrapper.sh create mode 100644 build-aux/org.gnome.Software.Devel.json create mode 100644 build-aux/org.gnome.Software.Devel.json.license create mode 100644 contrib/deployment-featured.ini create mode 100644 contrib/gnome-software.spec.in create mode 100644 contrib/org.gnome.Software.DeploymentFeatured.xml create mode 100644 data/assets/meson.build create mode 100644 data/assets/org.gnome.Software.Curated.xml create mode 100644 data/assets/org.gnome.Software.Featured.xml create mode 100644 data/assets/up-to-date.svg create mode 100644 data/autostart/org.gnome.Software.desktop.in create mode 100644 data/bash-completion/gnome-software create mode 100644 data/icons/hicolor/meson.build create mode 100644 data/icons/hicolor/scalable/org.gnome.Software.svg create mode 100644 data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg create mode 100644 data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg create mode 100644 data/icons/meson.build create mode 100644 data/icons/org.gnome.Software.Create.svg create mode 100644 data/icons/org.gnome.Software.Develop.svg create mode 100644 data/icons/org.gnome.Software.Generic.svg create mode 100644 data/icons/org.gnome.Software.Learn.svg create mode 100644 data/icons/org.gnome.Software.Play.svg create mode 100644 data/icons/org.gnome.Software.Socialize.svg create mode 100644 data/icons/org.gnome.Software.Work.svg create mode 100644 data/icons/symbolic/app-beta-software-symbolic.svg create mode 100644 data/icons/symbolic/app-info-loading-symbolic.svg create mode 100644 data/icons/symbolic/app-installed-symbolic.svg create mode 100644 data/icons/symbolic/app-remove-symbolic.svg create mode 100644 data/icons/symbolic/app-safety-ok-symbolic.svg create mode 100644 data/icons/symbolic/app-safety-unknown-symbolic.svg create mode 100644 data/icons/symbolic/app-safety-unsafe-symbolic.svg create mode 100644 data/icons/symbolic/app-verified-symbolic.svg create mode 100644 data/icons/symbolic/auditable-code-symbolic.svg create mode 100644 data/icons/symbolic/community-approved-symbolic.svg create mode 100644 data/icons/symbolic/community-blocked-symbolic.svg create mode 100644 data/icons/symbolic/community-none-symbolic.svg create mode 100644 data/icons/symbolic/community-supported-symbolic.svg create mode 100644 data/icons/symbolic/community-symbolic.svg create mode 100644 data/icons/symbolic/computer-fail-symbolic.svg create mode 100644 data/icons/symbolic/contact-symbolic.svg create mode 100644 data/icons/symbolic/device-support-adaptive-symbolic.svg create mode 100644 data/icons/symbolic/device-support-desktop-symbolic.svg create mode 100644 data/icons/symbolic/device-support-mobile-symbolic.svg create mode 100644 data/icons/symbolic/device-support-touch-symbolic.svg create mode 100644 data/icons/symbolic/device-support-unknown-symbolic.svg create mode 100644 data/icons/symbolic/device-supported-symbolic.svg create mode 100644 data/icons/symbolic/document-edit-symbolic.svg create mode 100644 data/icons/symbolic/donate-symbolic.svg create mode 100644 data/icons/symbolic/external-link-symbolic.svg create mode 100644 data/icons/symbolic/help-link-symbolic.svg create mode 100644 data/icons/symbolic/info-symbolic.svg create mode 100644 data/icons/symbolic/package-flatpak-symbolic.svg create mode 100644 data/icons/symbolic/package-generic-symbolic.svg create mode 100644 data/icons/symbolic/package-snap-symbolic.svg create mode 100644 data/icons/symbolic/permissions-legacy-windowing-system-symbolic.svg create mode 100644 data/icons/symbolic/permissions-microphone-symbolic.svg create mode 100644 data/icons/symbolic/permissions-sandboxed-symbolic.svg create mode 100644 data/icons/symbolic/permissions-screen-contents-symbolic.svg create mode 100644 data/icons/symbolic/permissions-system-devices-symbolic.svg create mode 100644 data/icons/symbolic/permissions-warning-symbolic.svg create mode 100644 data/icons/symbolic/proprietary-code-symbolic.svg create mode 100644 data/icons/symbolic/ratings/advertising-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/advertising-symbolic.svg create mode 100644 data/icons/symbolic/ratings/alcohol-use-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/alcohol-use-symbolic.svg create mode 100644 data/icons/symbolic/ratings/audio-chat-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/audio-chat-symbolic.svg create mode 100644 data/icons/symbolic/ratings/contacts-symbolic.svg create mode 100644 data/icons/symbolic/ratings/drug-use-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/drug-use-symbolic.svg create mode 100644 data/icons/symbolic/ratings/gambling-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/gambling-symbolic.svg create mode 100644 data/icons/symbolic/ratings/gay-content-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/gay-content-symbolic.svg create mode 100644 data/icons/symbolic/ratings/human-remains-symbolic.svg create mode 100644 data/icons/symbolic/ratings/messaging-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/messaging-symbolic.svg create mode 100644 data/icons/symbolic/ratings/money-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/money-symbolic.svg create mode 100644 data/icons/symbolic/ratings/nudity-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/nudity-symbolic.svg create mode 100644 data/icons/symbolic/ratings/smoking-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/smoking-symbolic.svg create mode 100644 data/icons/symbolic/ratings/social-info-symbolic.svg create mode 100644 data/icons/symbolic/ratings/strong-language-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/strong-language-symbolic.svg create mode 100644 data/icons/symbolic/ratings/violence-none-symbolic.svg create mode 100644 data/icons/symbolic/ratings/violence-symbolic.svg create mode 100644 data/icons/symbolic/review-rate-negative-symbolic.svg create mode 100644 data/icons/symbolic/review-rate-positive-symbolic.svg create mode 100644 data/icons/symbolic/review-report-symbolic.svg create mode 100644 data/icons/symbolic/review-symbolic.svg create mode 100644 data/icons/symbolic/software-explore-symbolic.svg create mode 100644 data/icons/symbolic/software-installed-symbolic.svg create mode 100644 data/icons/symbolic/software-license-symbolic.svg create mode 100644 data/icons/symbolic/software-updates-symbolic.svg create mode 100644 data/icons/symbolic/starred-symbolic.svg create mode 100644 data/icons/symbolic/translations-symbolic.svg create mode 100644 data/icons/symbolic/warning-outline-symbolic.svg create mode 100644 data/icons/symbolic/webpage-symbolic.svg create mode 100644 data/icons/system-component-addon.svg create mode 100644 data/icons/system-component-application.svg create mode 100644 data/icons/system-component-codecs.svg create mode 100644 data/icons/system-component-driver.svg create mode 100644 data/icons/system-component-firmware.svg create mode 100644 data/icons/system-component-input-sources.svg create mode 100644 data/icons/system-component-language.svg create mode 100644 data/icons/system-component-os-updates.svg create mode 100644 data/icons/system-component-runtime.svg create mode 100644 data/meson.build create mode 100644 data/metainfo/meson.build create mode 100644 data/metainfo/org.gnome.Software.metainfo.xml.in create mode 100644 data/metainfo/ss-details.png create mode 100644 data/metainfo/ss-details2.png create mode 100644 data/metainfo/ss-installed.png create mode 100644 data/metainfo/ss-overview.png create mode 100644 data/metainfo/ss-up-to-date.png create mode 100644 data/metainfo/ss-updates-details.png create mode 100644 data/metainfo/ss-updates.png create mode 100644 data/org.gnome.software.dkms-helper.policy.in.in create mode 100644 data/org.gnome.software.external-appstream.policy.in.in create mode 100644 data/org.gnome.software.gschema.xml create mode 100644 data/tests/os-release create mode 100644 doc/api/gnome-software-docs.xml create mode 100644 doc/api/gnome-software.types create mode 100644 doc/api/gs-example-details.png create mode 100644 doc/api/gs-example-installed.png create mode 100644 doc/api/gs-example-search.png create mode 100644 doc/api/meson.build create mode 100644 doc/app-developers.md create mode 100644 doc/debugging.md create mode 100644 doc/design.svg create mode 100644 doc/media/featured-curated.png create mode 100644 doc/media/gnome-os-upgrade-banner.png create mode 100644 doc/meson.build create mode 100644 doc/privacy-policy.html create mode 100755 doc/update.sh create mode 100644 doc/use-cases.md create mode 100644 doc/vendor-customisation.md create mode 100644 gnome-software.doap create mode 100644 gs-install-appstream/gs-install-appstream.c create mode 100644 gs-install-appstream/meson.build create mode 100644 help/C/figures/app-context-bar.png create mode 100644 help/C/figures/app-screenshot.png create mode 100644 help/C/figures/carousel.png create mode 100644 help/C/figures/install-webapp-from-gnome-web.png create mode 100644 help/C/figures/scalable/license-community-built.svg create mode 100644 help/C/figures/scalable/license-proprietary-and-special.svg create mode 100644 help/C/figures/scalable/license-unknown.svg create mode 100644 help/C/figures/scalable/links.svg create mode 100644 help/C/figures/scalable/no-links.svg create mode 120000 help/C/figures/scalable/symbolic/computer-fail-symbolic.svg create mode 120000 help/C/figures/scalable/symbolic/contact-symbolic.svg create mode 120000 help/C/figures/scalable/symbolic/donate-symbolic.svg create mode 120000 help/C/figures/scalable/symbolic/help-link-symbolic.svg create mode 100644 help/C/figures/scalable/symbolic/image-missing-symbolic.svg create mode 120000 help/C/figures/scalable/symbolic/translations-symbolic.svg create mode 120000 help/C/figures/scalable/symbolic/webpage-symbolic.svg create mode 100644 help/C/how-to-reinstall-a-web-app.page create mode 100644 help/C/index.page create mode 100644 help/C/legal.xml create mode 100644 help/C/software-licensing.page create mode 100644 help/C/software-metadata.page create mode 100644 help/LINGUAS create mode 100644 help/cs/cs.po create mode 100644 help/cs/figures/app-context-bar.png create mode 100644 help/de/de.po create mode 100644 help/de/figures/app-context-bar.png create mode 100644 help/eu/eu.po create mode 100644 help/fr/figures/app-context-bar.png create mode 100644 help/fr/fr.po create mode 100644 help/hu/figures/app-context-bar.png create mode 100644 help/hu/hu.po create mode 100644 help/id/id.po create mode 100644 help/meson.build create mode 100644 help/pt_BR/figures/app-context-bar.png create mode 100644 help/pt_BR/pt_BR.po create mode 100644 help/ru/figures/app-context-bar.png create mode 100644 help/ru/ru.po create mode 100644 help/sv/figures/app-context-bar.png create mode 100644 help/sv/sv.po create mode 100644 help/uk/figures/app-context-bar.png create mode 100644 help/uk/uk.po create mode 100644 lib/README.md create mode 100644 lib/gnome-software-private.h create mode 100644 lib/gnome-software.h create mode 100644 lib/gs-app-collation.h create mode 100644 lib/gs-app-list-private.h create mode 100644 lib/gs-app-list.c create mode 100644 lib/gs-app-list.h create mode 100644 lib/gs-app-permissions.c create mode 100644 lib/gs-app-permissions.h create mode 100644 lib/gs-app-private.h create mode 100644 lib/gs-app-query.c create mode 100644 lib/gs-app-query.h create mode 100644 lib/gs-app.c create mode 100644 lib/gs-app.h create mode 100644 lib/gs-appstream.c create mode 100644 lib/gs-appstream.h create mode 100644 lib/gs-build-ident.h.in create mode 100644 lib/gs-category-manager.c create mode 100644 lib/gs-category-manager.h create mode 100644 lib/gs-category-private.h create mode 100644 lib/gs-category.c create mode 100644 lib/gs-category.h create mode 100644 lib/gs-cmd.c create mode 100644 lib/gs-debug.c create mode 100644 lib/gs-debug.h create mode 100644 lib/gs-desktop-data.c create mode 100644 lib/gs-desktop-data.h create mode 100644 lib/gs-dkms-private.c create mode 100644 lib/gs-dkms-private.h create mode 100644 lib/gs-download-utils.c create mode 100644 lib/gs-download-utils.h create mode 100644 lib/gs-external-appstream-utils.c create mode 100644 lib/gs-external-appstream-utils.h create mode 100644 lib/gs-fedora-third-party.c create mode 100644 lib/gs-fedora-third-party.h create mode 100644 lib/gs-icon-downloader.c create mode 100644 lib/gs-icon-downloader.h create mode 100644 lib/gs-icon.c create mode 100644 lib/gs-icon.h create mode 100644 lib/gs-ioprio.c create mode 100644 lib/gs-ioprio.h create mode 100644 lib/gs-job-manager.c create mode 100644 lib/gs-job-manager.h create mode 100644 lib/gs-key-colors.c create mode 100644 lib/gs-key-colors.h create mode 100644 lib/gs-metered.c create mode 100644 lib/gs-metered.h create mode 100644 lib/gs-odrs-provider.c create mode 100644 lib/gs-odrs-provider.h create mode 100644 lib/gs-os-release.c create mode 100644 lib/gs-os-release.h create mode 100644 lib/gs-plugin-event.c create mode 100644 lib/gs-plugin-event.h create mode 100644 lib/gs-plugin-helpers.c create mode 100644 lib/gs-plugin-helpers.h create mode 100644 lib/gs-plugin-job-cancel-offline-update.c create mode 100644 lib/gs-plugin-job-cancel-offline-update.h create mode 100644 lib/gs-plugin-job-download-upgrade.c create mode 100644 lib/gs-plugin-job-download-upgrade.h create mode 100644 lib/gs-plugin-job-file-to-app.c create mode 100644 lib/gs-plugin-job-file-to-app.h create mode 100644 lib/gs-plugin-job-install-apps.c create mode 100644 lib/gs-plugin-job-install-apps.h create mode 100644 lib/gs-plugin-job-launch.c create mode 100644 lib/gs-plugin-job-launch.h create mode 100644 lib/gs-plugin-job-list-apps.c create mode 100644 lib/gs-plugin-job-list-apps.h create mode 100644 lib/gs-plugin-job-list-categories.c create mode 100644 lib/gs-plugin-job-list-categories.h create mode 100644 lib/gs-plugin-job-list-distro-upgrades.c create mode 100644 lib/gs-plugin-job-list-distro-upgrades.h create mode 100644 lib/gs-plugin-job-manage-repository.c create mode 100644 lib/gs-plugin-job-manage-repository.h create mode 100644 lib/gs-plugin-job-private.h create mode 100644 lib/gs-plugin-job-refine.c create mode 100644 lib/gs-plugin-job-refine.h create mode 100644 lib/gs-plugin-job-refresh-metadata.c create mode 100644 lib/gs-plugin-job-refresh-metadata.h create mode 100644 lib/gs-plugin-job-trigger-upgrade.c create mode 100644 lib/gs-plugin-job-trigger-upgrade.h create mode 100644 lib/gs-plugin-job-uninstall-apps.c create mode 100644 lib/gs-plugin-job-uninstall-apps.h create mode 100644 lib/gs-plugin-job-update-apps.c create mode 100644 lib/gs-plugin-job-update-apps.h create mode 100644 lib/gs-plugin-job-url-to-app.c create mode 100644 lib/gs-plugin-job-url-to-app.h create mode 100644 lib/gs-plugin-job.c create mode 100644 lib/gs-plugin-job.h create mode 100644 lib/gs-plugin-loader-sync.c create mode 100644 lib/gs-plugin-loader-sync.h create mode 100644 lib/gs-plugin-loader.c create mode 100644 lib/gs-plugin-loader.h create mode 100644 lib/gs-plugin-private.h create mode 100644 lib/gs-plugin-types.h create mode 100644 lib/gs-plugin-vfuncs.h create mode 100644 lib/gs-plugin.c create mode 100644 lib/gs-plugin.h create mode 100644 lib/gs-profiler.h create mode 100644 lib/gs-remote-icon.c create mode 100644 lib/gs-remote-icon.h create mode 100644 lib/gs-rewrite-resources.c create mode 100644 lib/gs-rewrite-resources.h create mode 100644 lib/gs-self-test.c create mode 100644 lib/gs-test.c create mode 100644 lib/gs-test.h create mode 100644 lib/gs-utils.c create mode 100644 lib/gs-utils.h create mode 100644 lib/gs-worker-thread.c create mode 100644 lib/gs-worker-thread.h create mode 100644 lib/meson.build create mode 100644 lib/tests/app-permissions.c create mode 100644 lib/tests/meson.build create mode 100644 lib/tools/meson.build create mode 100644 lib/tools/profile-key-colors.c create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100755 meson_post_install.sh create mode 100644 plugins/core/gs-plugin-appstream.c create mode 100644 plugins/core/gs-plugin-appstream.h create mode 100644 plugins/core/gs-plugin-generic-updates.c create mode 100644 plugins/core/gs-plugin-generic-updates.h create mode 100644 plugins/core/gs-plugin-hardcoded-blocklist.c create mode 100644 plugins/core/gs-plugin-hardcoded-blocklist.h create mode 100644 plugins/core/gs-plugin-icons.c create mode 100644 plugins/core/gs-plugin-icons.h create mode 100644 plugins/core/gs-plugin-os-release.c create mode 100644 plugins/core/gs-plugin-os-release.h create mode 100644 plugins/core/gs-plugin-provenance-license.c create mode 100644 plugins/core/gs-plugin-provenance-license.h create mode 100644 plugins/core/gs-plugin-provenance.c create mode 100644 plugins/core/gs-plugin-provenance.h create mode 100644 plugins/core/gs-self-test.c create mode 100644 plugins/core/meson.build create mode 120000 plugins/core/tests/os-release create mode 100644 plugins/dkms/gs-dkms-helper.c create mode 100644 plugins/dkms/gs-plugin-dkms.c create mode 100644 plugins/dkms/gs-plugin-dkms.h create mode 100644 plugins/dkms/meson.build create mode 100644 plugins/dpkg/gs-plugin-dpkg.c create mode 100644 plugins/dpkg/gs-plugin-dpkg.h create mode 100644 plugins/dpkg/gs-self-test.c create mode 100644 plugins/dpkg/meson.build create mode 100755 plugins/dpkg/tests/build-deb.sh create mode 100644 plugins/dpkg/tests/chiron-1.1-1.deb create mode 100644 plugins/dpkg/tests/debian/DEBIAN/control create mode 100644 plugins/dpkg/tests/debian/usr/bin/chiron create mode 100644 plugins/dummy/gs-plugin-dummy.c create mode 100644 plugins/dummy/gs-plugin-dummy.h create mode 100644 plugins/dummy/gs-self-test.c create mode 100644 plugins/dummy/meson.build create mode 100644 plugins/eos-updater/com.endlessm.Updater.xml create mode 100644 plugins/eos-updater/gs-plugin-eos-updater.c create mode 100644 plugins/eos-updater/gs-plugin-eos-updater.h create mode 100644 plugins/eos-updater/meson.build create mode 100644 plugins/eos-updater/tests/eos_updater.py create mode 100755 plugins/eos-updater/tests/manual-test.py create mode 100644 plugins/epiphany/gs-plugin-epiphany.c create mode 100644 plugins/epiphany/gs-plugin-epiphany.h create mode 100644 plugins/epiphany/gs-self-test.c create mode 100644 plugins/epiphany/meson.build create mode 100644 plugins/epiphany/org.freedesktop.portal.DynamicLauncher.xml create mode 100644 plugins/epiphany/org.gnome.Epiphany.WebAppProvider.xml create mode 100644 plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in create mode 100644 plugins/fedora-langpacks/gs-plugin-fedora-langpacks.c create mode 100644 plugins/fedora-langpacks/gs-plugin-fedora-langpacks.h create mode 100644 plugins/fedora-langpacks/gs-self-test.c create mode 100644 plugins/fedora-langpacks/meson.build create mode 100644 plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c create mode 100644 plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.h create mode 100644 plugins/fedora-pkgdb-collections/meson.build create mode 100644 plugins/flatpak/gs-flatpak-app.c create mode 100644 plugins/flatpak/gs-flatpak-app.h create mode 100644 plugins/flatpak/gs-flatpak-transaction.c create mode 100644 plugins/flatpak/gs-flatpak-transaction.h create mode 100644 plugins/flatpak/gs-flatpak-utils.c create mode 100644 plugins/flatpak/gs-flatpak-utils.h create mode 100644 plugins/flatpak/gs-flatpak.c create mode 100644 plugins/flatpak/gs-flatpak.h create mode 100644 plugins/flatpak/gs-plugin-flatpak.c create mode 100644 plugins/flatpak/gs-plugin-flatpak.h create mode 100644 plugins/flatpak/gs-self-test.c create mode 100644 plugins/flatpak/meson.build create mode 100644 plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in create mode 100644 plugins/flatpak/tests/app-extension-update/.gitignore create mode 100644 plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/.gitignore create mode 100644 plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/.empty create mode 100644 plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/libtest/README create mode 100644 plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml create mode 100644 plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/metadata create mode 100644 plugins/flatpak/tests/app-extension/.gitignore create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/.gitignore create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/.empty create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/libtest/README create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/metadata create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron/.gitignore create mode 100755 plugins/flatpak/tests/app-extension/org.test.Chiron/files/bin/chiron.sh create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/applications/org.test.Chiron.desktop create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png create mode 100644 plugins/flatpak/tests/app-extension/org.test.Chiron/metadata create mode 100644 plugins/flatpak/tests/app-missing-runtime/.gitignore create mode 120000 plugins/flatpak/tests/app-missing-runtime/org.test.Chiron create mode 100644 plugins/flatpak/tests/app-update/.gitignore create mode 100644 plugins/flatpak/tests/app-update/org.test.Chiron/.gitignore create mode 100644 plugins/flatpak/tests/app-update/org.test.Chiron/files/bin/chiron.sh create mode 100644 plugins/flatpak/tests/app-update/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml create mode 120000 plugins/flatpak/tests/app-update/org.test.Chiron/files/share/applications/org.test.Chiron.desktop create mode 120000 plugins/flatpak/tests/app-update/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png create mode 100644 plugins/flatpak/tests/app-update/org.test.Chiron/metadata create mode 100644 plugins/flatpak/tests/app-with-runtime/.gitignore create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Chiron/.gitignore create mode 100755 plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/bin/chiron.sh create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/applications/org.test.Chiron.desktop create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Chiron/metadata create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Runtime/files/.empty create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Runtime/metadata create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/.gitignore create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/libtest/README create mode 100644 plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/metainfo/org.test.Runtime.metainfo.xml create mode 100755 plugins/flatpak/tests/build.py create mode 100644 plugins/flatpak/tests/chiron.flatpak create mode 100644 plugins/flatpak/tests/flatpakrepos.tar.gz create mode 100644 plugins/flatpak/tests/meson.build create mode 100644 plugins/flatpak/tests/only-runtime/.gitignore create mode 120000 plugins/flatpak/tests/only-runtime/org.test.Runtime create mode 100644 plugins/fwupd/gs-fwupd-app.c create mode 100644 plugins/fwupd/gs-fwupd-app.h create mode 100644 plugins/fwupd/gs-plugin-fwupd.c create mode 100644 plugins/fwupd/gs-plugin-fwupd.h create mode 100644 plugins/fwupd/gs-self-test.c create mode 100644 plugins/fwupd/meson.build create mode 100644 plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in create mode 100755 plugins/fwupd/tests/build-cab.sh create mode 100644 plugins/fwupd/tests/chiron-0.2.cab create mode 100644 plugins/fwupd/tests/firmware.dfu create mode 100644 plugins/fwupd/tests/firmware.dfu.asc create mode 100644 plugins/fwupd/tests/firmware.metainfo.xml create mode 100644 plugins/malcontent/gs-plugin-malcontent.c create mode 100644 plugins/malcontent/gs-plugin-malcontent.h create mode 100644 plugins/malcontent/meson.build create mode 100644 plugins/meson.build create mode 100644 plugins/modalias/gs-plugin-modalias.c create mode 100644 plugins/modalias/gs-plugin-modalias.h create mode 100644 plugins/modalias/gs-self-test.c create mode 100644 plugins/modalias/meson.build create mode 100644 plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c create mode 100644 plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.h create mode 100644 plugins/opensuse-distro-upgrade/meson.build create mode 100644 plugins/packagekit/gs-markdown.c create mode 100644 plugins/packagekit/gs-markdown.h create mode 100644 plugins/packagekit/gs-packagekit-helper.c create mode 100644 plugins/packagekit/gs-packagekit-helper.h create mode 100644 plugins/packagekit/gs-packagekit-task.c create mode 100644 plugins/packagekit/gs-packagekit-task.h create mode 100644 plugins/packagekit/gs-plugin-packagekit.c create mode 100644 plugins/packagekit/gs-plugin-packagekit.h create mode 100644 plugins/packagekit/gs-self-test.c create mode 100644 plugins/packagekit/meson.build create mode 100644 plugins/packagekit/packagekit-common.c create mode 100644 plugins/packagekit/packagekit-common.h create mode 100755 plugins/packagekit/tests/build-rpm.sh create mode 100644 plugins/packagekit/tests/chiron-1.1-1.fc24.x86_64.rpm create mode 100644 plugins/packagekit/tests/chiron.spec create mode 100644 plugins/repos/gs-plugin-repos.c create mode 100644 plugins/repos/gs-plugin-repos.h create mode 100644 plugins/repos/gs-self-test.c create mode 100644 plugins/repos/meson.build create mode 100644 plugins/repos/tests/yum.repos.d/utopia.repo create mode 100644 plugins/rpm-ostree/gs-plugin-rpm-ostree.c create mode 100644 plugins/rpm-ostree/gs-plugin-rpm-ostree.h create mode 100644 plugins/rpm-ostree/meson.build create mode 100644 plugins/rpm-ostree/org.projectatomic.rpmostree1.xml create mode 100644 plugins/snap/gs-plugin-snap.c create mode 100644 plugins/snap/gs-plugin-snap.h create mode 100644 plugins/snap/gs-self-test.c create mode 100644 plugins/snap/meson.build create mode 100644 plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in create mode 100644 plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c create mode 100644 plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.h create mode 100644 plugins/systemd-sysupdate/gs-self-test.c create mode 100644 plugins/systemd-sysupdate/meson.build create mode 100644 plugins/systemd-sysupdate/org.freedesktop.sysupdate1.xml create mode 100644 plugins/systemd-sysupdate/services/meson.build create mode 100644 plugins/systemd-sysupdate/services/org.freedesktop.sysupdate1.service.in create mode 100644 po/LINGUAS create mode 100644 po/POTFILES.in create mode 100644 po/POTFILES.skip create mode 100644 po/ab.po create mode 100644 po/af.po create mode 100644 po/ar.po create mode 100644 po/as.po create mode 100644 po/be.po create mode 100644 po/bg.po create mode 100644 po/bn.po create mode 100644 po/bs.po create mode 100644 po/ca.po create mode 100644 po/ca@valencia.po create mode 100644 po/ckb.po create mode 100644 po/cs.po create mode 100644 po/da.po create mode 100644 po/de.po create mode 100644 po/el.po create mode 100644 po/en_GB.po create mode 100644 po/eo.po create mode 100644 po/es.po create mode 100644 po/eu.po create mode 100644 po/fa.po create mode 100644 po/fi.po create mode 100644 po/fil.po create mode 100644 po/fr.po create mode 100644 po/fur.po create mode 100644 po/ga.po create mode 100644 po/gd.po create mode 100644 po/gl.po create mode 100644 po/he.po create mode 100644 po/hi.po create mode 100644 po/hr.po create mode 100644 po/hu.po create mode 100644 po/id.po create mode 100644 po/ie.po create mode 100644 po/is.po create mode 100644 po/it.po create mode 100644 po/ja.po create mode 100644 po/ka.po create mode 100644 po/kab.po create mode 100644 po/kk.po create mode 100644 po/km.po create mode 100644 po/ko.po create mode 100644 po/lt.po create mode 100644 po/lv.po create mode 100644 po/meson.build create mode 100644 po/mjw.po create mode 100644 po/ml.po create mode 100644 po/mr.po create mode 100644 po/ms.po create mode 100644 po/nb.po create mode 100644 po/ne.po create mode 100644 po/nl.po create mode 100644 po/oc.po create mode 100644 po/pa.po create mode 100644 po/pl.po create mode 100644 po/pt.po create mode 100644 po/pt_BR.po create mode 100644 po/ro.po create mode 100644 po/ru.po create mode 100644 po/sk.po create mode 100644 po/sl.po create mode 100644 po/sr.po create mode 100644 po/sr@latin.po create mode 100644 po/sv.po create mode 100644 po/te.po create mode 100644 po/th.po create mode 100644 po/tr.po create mode 100644 po/uk.po create mode 100644 po/uz.po create mode 100644 po/vi.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_HK.po create mode 100644 po/zh_TW.po create mode 100644 src/gnome-software-local-file-flatpak.desktop.in create mode 100644 src/gnome-software-local-file-fwupd.desktop.in create mode 100644 src/gnome-software-local-file-packagekit.desktop.in create mode 100644 src/gnome-software-local-file-snap.desktop.in create mode 100644 src/gnome-software.gresource.xml create mode 100644 src/gnome-software.xml create mode 100644 src/gs-age-rating-context-dialog.c create mode 100644 src/gs-age-rating-context-dialog.h create mode 100644 src/gs-age-rating-context-dialog.ui create mode 100644 src/gs-app-addon-row.c create mode 100644 src/gs-app-addon-row.h create mode 100644 src/gs-app-addon-row.ui create mode 100644 src/gs-app-context-bar.c create mode 100644 src/gs-app-context-bar.h create mode 100644 src/gs-app-context-bar.ui create mode 100644 src/gs-app-details-page.c create mode 100644 src/gs-app-details-page.h create mode 100644 src/gs-app-details-page.ui create mode 100644 src/gs-app-reviews-dialog.c create mode 100644 src/gs-app-reviews-dialog.h create mode 100644 src/gs-app-reviews-dialog.ui create mode 100644 src/gs-app-row.c create mode 100644 src/gs-app-row.h create mode 100644 src/gs-app-row.ui create mode 100644 src/gs-app-tile.c create mode 100644 src/gs-app-tile.h create mode 100644 src/gs-app-translation-dialog.c create mode 100644 src/gs-app-translation-dialog.h create mode 100644 src/gs-app-translation-dialog.ui create mode 100644 src/gs-app-version-history-dialog.c create mode 100644 src/gs-app-version-history-dialog.h create mode 100644 src/gs-app-version-history-dialog.ui create mode 100644 src/gs-app-version-history-row.c create mode 100644 src/gs-app-version-history-row.h create mode 100644 src/gs-app-version-history-row.ui create mode 100644 src/gs-application.c create mode 100644 src/gs-application.h create mode 100644 src/gs-basic-auth-dialog.c create mode 100644 src/gs-basic-auth-dialog.h create mode 100644 src/gs-basic-auth-dialog.ui create mode 100644 src/gs-category-page.c create mode 100644 src/gs-category-page.h create mode 100644 src/gs-category-page.ui create mode 100644 src/gs-category-tile.c create mode 100644 src/gs-category-tile.h create mode 100644 src/gs-category-tile.ui create mode 100644 src/gs-common.c create mode 100644 src/gs-common.h create mode 100644 src/gs-context-dialog-row.c create mode 100644 src/gs-context-dialog-row.h create mode 100644 src/gs-context-dialog-row.ui create mode 100644 src/gs-css.c create mode 100644 src/gs-css.h create mode 100644 src/gs-dbus-helper.c create mode 100644 src/gs-dbus-helper.h create mode 100644 src/gs-description-box.c create mode 100644 src/gs-description-box.h create mode 100644 src/gs-details-page.c create mode 100644 src/gs-details-page.h create mode 100644 src/gs-details-page.ui create mode 100644 src/gs-dkms-dialog.c create mode 100644 src/gs-dkms-dialog.h create mode 100644 src/gs-dkms-dialog.ui create mode 100644 src/gs-extras-page.c create mode 100644 src/gs-extras-page.h create mode 100644 src/gs-extras-page.ui create mode 100644 src/gs-feature-tile.c create mode 100644 src/gs-feature-tile.h create mode 100644 src/gs-feature-tile.ui create mode 100644 src/gs-featured-carousel.c create mode 100644 src/gs-featured-carousel.h create mode 100644 src/gs-featured-carousel.ui create mode 100644 src/gs-hardware-support-context-dialog.c create mode 100644 src/gs-hardware-support-context-dialog.h create mode 100644 src/gs-hardware-support-context-dialog.ui create mode 100644 src/gs-help-overlay.ui create mode 100644 src/gs-info-window.c create mode 100644 src/gs-info-window.h create mode 100644 src/gs-info-window.ui create mode 100644 src/gs-installed-page.c create mode 100644 src/gs-installed-page.h create mode 100644 src/gs-installed-page.ui create mode 100644 src/gs-language.c create mode 100644 src/gs-language.h create mode 100644 src/gs-layout-manager.c create mode 100644 src/gs-layout-manager.h create mode 100644 src/gs-license-tile.c create mode 100644 src/gs-license-tile.h create mode 100644 src/gs-license-tile.ui create mode 100644 src/gs-loading-page.c create mode 100644 src/gs-loading-page.h create mode 100644 src/gs-loading-page.ui create mode 100644 src/gs-lozenge.c create mode 100644 src/gs-lozenge.h create mode 100644 src/gs-lozenge.ui create mode 100644 src/gs-main.c create mode 100644 src/gs-origin-popover-row.c create mode 100644 src/gs-origin-popover-row.h create mode 100644 src/gs-origin-popover-row.ui create mode 100644 src/gs-os-update-page.c create mode 100644 src/gs-os-update-page.h create mode 100644 src/gs-os-update-page.ui create mode 100644 src/gs-overview-page.c create mode 100644 src/gs-overview-page.h create mode 100644 src/gs-overview-page.ui create mode 100644 src/gs-page.c create mode 100644 src/gs-page.h create mode 100644 src/gs-prefs-dialog.c create mode 100644 src/gs-prefs-dialog.h create mode 100644 src/gs-prefs-dialog.ui create mode 100644 src/gs-progress-button.c create mode 100644 src/gs-progress-button.h create mode 100644 src/gs-progress-button.ui create mode 100644 src/gs-removal-dialog.c create mode 100644 src/gs-removal-dialog.h create mode 100644 src/gs-removal-dialog.ui create mode 100644 src/gs-remove-app-dialog.ui create mode 100644 src/gs-repo-row.c create mode 100644 src/gs-repo-row.h create mode 100644 src/gs-repo-row.ui create mode 100644 src/gs-repos-dialog.c create mode 100644 src/gs-repos-dialog.h create mode 100644 src/gs-repos-dialog.ui create mode 100644 src/gs-repos-section.c create mode 100644 src/gs-repos-section.h create mode 100644 src/gs-restarter.c create mode 100644 src/gs-review-bar.c create mode 100644 src/gs-review-bar.h create mode 100644 src/gs-review-dialog.c create mode 100644 src/gs-review-dialog.h create mode 100644 src/gs-review-dialog.ui create mode 100644 src/gs-review-histogram.c create mode 100644 src/gs-review-histogram.h create mode 100644 src/gs-review-histogram.ui create mode 100644 src/gs-review-row.c create mode 100644 src/gs-review-row.h create mode 100644 src/gs-review-row.ui create mode 100644 src/gs-safety-context-dialog.c create mode 100644 src/gs-safety-context-dialog.h create mode 100644 src/gs-safety-context-dialog.ui create mode 100644 src/gs-screenshot-carousel.c create mode 100644 src/gs-screenshot-carousel.h create mode 100644 src/gs-screenshot-carousel.ui create mode 100644 src/gs-screenshot-image.c create mode 100644 src/gs-screenshot-image.h create mode 100644 src/gs-screenshot-image.ui create mode 100644 src/gs-search-page.c create mode 100644 src/gs-search-page.h create mode 100644 src/gs-search-page.ui create mode 100644 src/gs-self-test.c create mode 100644 src/gs-shell-search-provider.c create mode 100644 src/gs-shell-search-provider.h create mode 100644 src/gs-shell.c create mode 100644 src/gs-shell.h create mode 100644 src/gs-shell.ui create mode 100644 src/gs-star-image.c create mode 100644 src/gs-star-image.h create mode 100644 src/gs-star-widget.c create mode 100644 src/gs-star-widget.h create mode 100644 src/gs-star-widget.ui create mode 100644 src/gs-storage-context-dialog.c create mode 100644 src/gs-storage-context-dialog.h create mode 100644 src/gs-storage-context-dialog.ui create mode 100644 src/gs-summary-tile.c create mode 100644 src/gs-summary-tile.h create mode 100644 src/gs-summary-tile.ui create mode 100644 src/gs-toast.c create mode 100644 src/gs-toast.h create mode 100644 src/gs-update-dialog.c create mode 100644 src/gs-update-dialog.h create mode 100644 src/gs-update-dialog.ui create mode 100644 src/gs-update-list.c create mode 100644 src/gs-update-list.h create mode 100644 src/gs-update-monitor.c create mode 100644 src/gs-update-monitor.h create mode 100644 src/gs-updates-page.c create mode 100644 src/gs-updates-page.h create mode 100644 src/gs-updates-page.ui create mode 100644 src/gs-updates-paused-banner.c create mode 100644 src/gs-updates-paused-banner.h create mode 100644 src/gs-updates-section.c create mode 100644 src/gs-updates-section.h create mode 100644 src/gs-updates-section.ui create mode 100644 src/gs-upgrade-banner.c create mode 100644 src/gs-upgrade-banner.h create mode 100644 src/gs-upgrade-banner.ui create mode 100644 src/gs-utils-error-dialog-simple.ui create mode 100644 src/gs-vendor.c create mode 100644 src/gs-vendor.h create mode 100644 src/meson.build create mode 100644 src/org.freedesktop.PackageKit.Modify2.xml create mode 100644 src/org.freedesktop.PackageKit.service.in create mode 100644 src/org.freedesktop.PackageKit.xml create mode 100644 src/org.gnome.Software-search-provider.ini create mode 100644 src/org.gnome.Software.desktop.in create mode 100644 src/org.gnome.Software.service.in create mode 100644 src/shell-search-provider-dbus-interfaces.xml create mode 100644 src/style-dark.css create mode 100644 src/style-hc.css create mode 100644 src/style.css create mode 100644 subprojects/appstream.wrap create mode 100644 subprojects/gnome-pwa-list.wrap create mode 100644 subprojects/gnome-pwa-list/README.md create mode 100644 subprojects/gnome-pwa-list/gnome-pwa-list-foss.csv create mode 100644 subprojects/gnome-pwa-list/gnome-pwa-list-foss.xml create mode 100644 subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.csv create mode 100644 subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.xml create mode 100644 subprojects/gnome-pwa-list/meson.build create mode 100755 subprojects/gnome-pwa-list/pwa-metainfo-generator.py create mode 100644 subprojects/gtk.wrap create mode 100644 subprojects/libadwaita.wrap create mode 100644 subprojects/libglib-testing.wrap create mode 100644 subprojects/libxmlb.wrap create mode 100644 subprojects/malcontent.wrap create mode 100644 subprojects/sysprof.wrap create mode 100755 tests/actions.py create mode 100755 tests/basic.py create mode 100644 tests/template.test.in diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..752ea66 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# See https://editorconfig.org/ +root = true + +[*.{c,h}] +indent_style = tab +indent_size = 8 + +[*.ui] +indent_style = space +indent_size = 2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9373fc9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +.flatpak-builder/ + +subprojects/appstream/ +subprojects/gi-docgen.wrap +subprojects/gi-docgen/ +subprojects/graphene.wrap +subprojects/graphene/ +subprojects/gtk/ +subprojects/libadwaita/ +subprojects/libglib-testing/ +subprojects/libsass.wrap +subprojects/libsass/ +subprojects/libxmlb/ +subprojects/malcontent/ +subprojects/mutest.wrap +subprojects/mutest/ +subprojects/sassc.wrap +subprojects/sassc/ +subprojects/sysprof/ +subprojects/wayland-protocols.wrap +subprojects/wayland-protocols/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..4db4e68 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,185 @@ +include: + - project: 'GNOME/citemplates' + file: '/flatpak/flatpak_ci_initiative.yml' + - component: gitlab.gnome.org/GNOME/citemplates/release-service@master + inputs: + dist-job-name: "dist" + tarball-artifact-path: "${TARBALL_ARTIFACT_PATH}" + +stages: + - build + - pages + - deploy + +cache: + paths: + - _ccache/ + +variables: + FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gnome-software/fedora:v22" + DEBIAN_IMAGE: "registry.gitlab.gnome.org/gnome/gnome-software/debian:v21" + MESON_TEST_TIMEOUT_MULTIPLIER: 4 + G_MESSAGES_DEBUG: all + MESON_COMMON_OPTIONS: "--werror --buildtype debug --wrap-mode=nodownload --prefix /usr -Dwebapps=true -Dhardcoded_foss_webapps=false -Dhardcoded_proprietary_webapps=false" + BUNDLE: "gnome-software-dev.flatpak" + # -O2 is needed for -Wnull-dereference to work: + CFLAGS: "-O2" + # expected naming scheme for the release-service job + TARBALL_ARTIFACT_PATH: "_build/meson-dist/${CI_PROJECT_NAME}-${CI_COMMIT_TAG}.tar.xz" + +# FIXME: Work around https://gitlab.com/gitlab-org/gitlab/-/issues/391756 +.submodule_workaround: + before_script: + - git config --global --add safe.directory "${PWD}" + - git submodule update --init --depth 1 + - git config --global --add safe.directory "${PWD}/subprojects/*" + variables: + GIT_SUBMODULE_STRATEGY: "none" + GIT_SUBMODULE_DEPTH: 1 + +.build: + variables: !reference [".submodule_workaround", variables] + before_script: + - cp -r $HOME/subprojects/* subprojects/ + - !reference [".submodule_workaround", "before_script"] + +fedora-x86_64: + extends: .build + image: "${FEDORA_IMAGE}" + stage: build + except: + - tags + script: + - meson setup ${MESON_COMMON_OPTIONS} + -Ddkms=true + -Drpm_ostree=true + -Dmalcontent=true + -Dsysprof=enabled + _build + - meson compile -C _build + - .gitlab-ci/run-tests.sh + --no-suite packagekit + --no-suite fwupd + --no-suite gtk + --no-suite libglib-testing + --no-suite malcontent + artifacts: + reports: + junit: "_build/${CI_JOB_NAME}-report.xml" + name: "gnome-software-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" + when: always + paths: + - "_build/config.h" + - "_build/help/" + - "_build/meson-logs" + - "_build/${CI_JOB_NAME}-report.xml" + +debian-x86_64: + extends: .build + image: "${DEBIAN_IMAGE}" + stage: build + except: + - tags + script: + - meson setup ${MESON_COMMON_OPTIONS} + -Ddkms=true + -Drpm_ostree=false + -Dmalcontent=false + -Dsysprof=disabled + _build + - meson compile -C _build + - .gitlab-ci/run-tests.sh + --no-suite packagekit + --no-suite fwupd + --no-suite gtk + --no-suite fedora-langpacks + --no-suite libxmlb + artifacts: + reports: + junit: "_build/${CI_JOB_NAME}-report.xml" + name: "gnome-software-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" + when: always + paths: + - "_build/config.h" + - "_build/meson-logs" + - "_build/${CI_JOB_NAME}-report.xml" + +# Allow building a flatpak on demand to test out the gnome-software UI +flatpak bundle: + extends: + - ".flatpak" + - ".submodule_workaround" + stage: 'build' + variables: + MANIFEST_PATH: "build-aux/org.gnome.Software.Devel.json" + FLATPAK_MODULE: "gnome-software" + RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo" + APP_ID: "org.gnome.Software.Devel" + RUN_TESTS: "no" + when: manual + allow_failure: true + +# Due to the `only` clause in .publish_nightly, this will only publish on-demand +# builds to nightly.gnome.org if they are built from a commit on `main` +nightly: + extends: '.publish_nightly' + dependencies: + - 'flatpak bundle' + needs: ['flatpak bundle'] + when: manual + +dist: + extends: .build + image: "${FEDORA_IMAGE}" + stage: build + needs: [] + only: + - schedules + - tags + script: + - meson setup ${MESON_COMMON_OPTIONS} + --buildtype release + -Dgtk_doc=true + _build + # We can’t run tests because it would run the `gtk` suite, which doesn’t work on CI + # There’s currently no way to selectively disable some suites at dist time. + - meson dist -C _build --no-tests + # Compile again to build the docs + - meson compile -C _build + - ninja -C _build gnome-software-doc + - tar -c -J -f "_build/gnome-software-docs-${CI_COMMIT_TAG}.tar.xz" -C _build/doc/api html + artifacts: + paths: + - "${CI_PROJECT_DIR}/_build/gnome-software-docs-${CI_COMMIT_TAG}.tar.xz" + - "${CI_PROJECT_DIR}/_build/meson-dist/gnome-software-*.tar.xz" + +pages: + image: "${FEDORA_IMAGE}" + stage: pages + needs: ['fedora-x86_64'] + interruptible: false + script: + - | + # yelp-build requires absolute paths + builddir="$(realpath ./_build)" + + echo "Generating help for C locale" + mkdir -p "./public/help/C/" + yelp-build html --output ./public/help/C/ ./help/C/*.page + + grep -v '^#' ./help/LINGUAS | while read -r language; do + echo "Generating help for ${language} locale" + mkdir "./public/help/${language}" + yelp-build html --ignore --output ./public/help/"${language}/" --path help/C/ "${builddir}/help/${language}/" + done + + echo "Generating index" + ./.gitlab-ci/generate-help-index.py ./public/index.html ./help/ + artifacts: + paths: + - "public" + rules: + - if: $CI_PROJECT_PATH == "GNOME/gnome-software" && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH + changes: + - "help/**/*" + - ".gitlab-ci/generate-help-index.py" diff --git a/.gitlab-ci/README.md b/.gitlab-ci/README.md new file mode 100644 index 0000000..68023d6 --- /dev/null +++ b/.gitlab-ci/README.md @@ -0,0 +1,23 @@ +# CI support stuff + +## Docker image + +GitLab CI jobs run in a Docker image, defined here. To update that image +(perhaps to install some more packages): + +1. Edit `.gitlab-ci/Dockerfile` with the changes you want +1. Run `.gitlab-ci/run-docker.sh build --base=debian --base-version=1` to + build the new image (bump the version from the latest listed for that `base` + on https://gitlab.gnome.org/GNOME/gnome-software/container_registry) +1. Run `.gitlab-ci/run-docker.sh push --base=debian --base-version=1` to + upload the new image to the GNOME GitLab Docker registry + * If this is the first time you're doing this, you'll need to log into the + registry + * If you use 2-factor authentication on your GNOME GitLab account, you'll + need to [create a personal access token][pat] and use that rather than + your normal password +1. Repeat for the other images in use (e.g. for `fedora`) +1. Edit `.gitlab-ci.yml` (in the root of this repository) to use your new + image + +[pat]: https://gitlab.gnome.org/-/profile/personal_access_tokens diff --git a/.gitlab-ci/cache-subprojects.sh b/.gitlab-ci/cache-subprojects.sh new file mode 100755 index 0000000..9375e36 --- /dev/null +++ b/.gitlab-ci/cache-subprojects.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -e + +unzip subprojects.meson.zip -d subprojects.meson +meson subprojects download --sourcedir subprojects.meson +rm subprojects.meson/subprojects/*.wrap +mv subprojects.meson/subprojects . +# allow updating this one without a docker rebuild +rm -rf subprojects.meson diff --git a/.gitlab-ci/debian.Dockerfile b/.gitlab-ci/debian.Dockerfile new file mode 100644 index 0000000..5a20191 --- /dev/null +++ b/.gitlab-ci/debian.Dockerfile @@ -0,0 +1,98 @@ +FROM debian:trixie + +RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \ + appstream \ + clang \ + clang-tools \ + dbus \ + desktop-file-utils \ + docbook-xsl \ + gcc \ + g++ \ + gettext \ + gi-docgen \ + git \ + gnome-pkg-tools \ + gobject-introspection \ + gperf \ + gsettings-desktop-schemas-dev \ + gtk-doc-tools \ + itstool \ + lcov \ + libaccountsservice-dev \ + libadwaita-1-dev \ + libappstream-dev \ + libcairo2-dev \ + libcairo-gobject2 \ + libcurl4-gnutls-dev \ + libepoxy-dev \ + libgtk-4-1 \ + libflatpak-dev \ + libfontconfig-dev \ + libfwupd-dev \ + libgdk-pixbuf-2.0-dev \ + libgirepository1.0-dev \ + libglib2.0-dev \ + libglib-testing-0-dev \ + libgoa-1.0-dev \ + libgraphene-1.0-dev \ + libgstreamer-plugins-bad1.0-dev \ + libgudev-1.0-dev \ + libjpeg62-turbo-dev \ + libjson-glib-dev \ + liblmdb-dev \ + libmalcontent-0-dev \ + libpackagekit-glib2-dev \ + libpam0g-dev \ + libpango1.0-dev \ + libpolkit-gobject-1-dev \ + librsvg2-common \ + libsoup-3.0-dev \ + libstemmer-dev \ + libxcursor-dev \ + libxdamage-dev \ + libxext-dev \ + libxfixes-dev \ + libxi-dev \ + libxinerama-dev \ + libxkbcommon-dev \ + libxmlb-dev \ + libxml2-utils \ + libxrandr-dev \ + libyaml-dev \ + ninja-build \ + packagekit \ + pkg-config \ + python3 \ + python3-pip \ + python3-setuptools \ + python3-wheel \ + sassc \ + shared-mime-info \ + sudo \ + sysprof \ + unzip \ + valgrind \ + wayland-protocols \ + wget \ + xsltproc \ + xz-utils \ + && rm -rf /usr/share/doc/* /usr/share/man/* + +RUN pip3 install --break-system-packages meson==1.0.1 + +# Enable passwordless sudo for sudo users +RUN sed -i -e '/%sudo/s/ALL$/NOPASSWD: ALL/' /etc/sudoers + +ARG HOST_USER_ID=5555 +ENV HOST_USER_ID ${HOST_USER_ID} +RUN useradd -u $HOST_USER_ID -G sudo -ms /bin/bash user + +USER user +WORKDIR /home/user + +COPY subprojects.meson.zip . +COPY cache-subprojects.sh . +RUN ./cache-subprojects.sh + +ENV LANG=C.UTF-8 LANGUAGE=C.UTF-8 LC_ALL=C.UTF-8 diff --git a/.gitlab-ci/fedora.Dockerfile b/.gitlab-ci/fedora.Dockerfile new file mode 100644 index 0000000..3a921af --- /dev/null +++ b/.gitlab-ci/fedora.Dockerfile @@ -0,0 +1,102 @@ +FROM fedora:41 + +RUN dnf -y install \ + appstream \ + accountsservice-devel \ + cairo-devel \ + cairo-gobject-devel \ + clang \ + clang-analyzer \ + dbus-daemon \ + dbus-devel \ + desktop-file-utils \ + docbook-style-xsl \ + flatpak-devel \ + fwupd-devel \ + gcc \ + gdk-pixbuf2-devel \ + gettext \ + gi-docgen \ + git \ + glib2-devel \ + glibc-locale-source \ + gnome-desktop4 \ + gobject-introspection \ + gobject-introspection-devel \ + gperf \ + graphene-devel \ + gsettings-desktop-schemas-devel \ + gstreamer1-plugins-bad-free-devel \ + gtk-doc \ + json-glib-devel \ + itstool \ + lcov \ + lmdb-devel \ + appstream-devel \ + libadwaita-devel \ + libcurl-devel \ + libepoxy-devel \ + libglib-testing-devel \ + libgudev-devel \ + libjpeg-turbo-devel \ + liboauth-devel \ + libsecret-devel \ + libsoup3-devel \ + libstemmer-devel \ + libXcursor-devel \ + libXdamage-devel \ + libXext-devel \ + libXfixes-devel \ + libXi-devel \ + libXinerama-devel \ + libxkbcommon-devel \ + libxmlb-devel \ + libXrandr-devel \ + libxslt \ + libyaml-devel \ + malcontent-devel \ + NetworkManager-libnm-devel \ + ninja-build \ + ostree-devel \ + PackageKit \ + PackageKit-glib-devel \ + pam-devel \ + pango-devel \ + pcre-devel \ + polkit-devel \ + python3 \ + python3-gobject \ + python3-pip \ + python3-wheel \ + rpm-devel \ + rpm-ostree-devel \ + sassc \ + shared-mime-info \ + snapd-glib-devel \ + sysprof-capture-devel \ + unzip \ + valgrind \ + wayland-protocols-devel \ + wget \ + xz \ + yelp-tools \ + zlib-devel \ + && dnf clean all + +RUN pip3 install meson==1.0.1 + +# Enable sudo for wheel users +RUN sed -i -e 's/# %wheel/%wheel/' -e '0,/%wheel/{s/%wheel/# %wheel/}' /etc/sudoers + +ARG HOST_USER_ID=5555 +ENV HOST_USER_ID ${HOST_USER_ID} +RUN useradd -u $HOST_USER_ID -G wheel -ms /bin/bash user + +USER user +WORKDIR /home/user + +COPY subprojects.meson.zip . +COPY cache-subprojects.sh . +RUN ./cache-subprojects.sh + +ENV LANG C.UTF-8 diff --git a/.gitlab-ci/generate-help-index.py b/.gitlab-ci/generate-help-index.py new file mode 100755 index 0000000..695e587 --- /dev/null +++ b/.gitlab-ci/generate-help-index.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +# +# Copyright 2025 GNOME Foundation, Inc. +# +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# Original author: Philip Withnall + +""" +Generate a HTML index for the help pages, for deployment to +pages.gitlab.gnome.org. +""" + +import argparse +import os +import pathlib + +import gi +from lxml import etree + +gi.require_version("GnomeDesktop", "3.0") +from gi.repository import GnomeDesktop # noqa: E402 + + +def parse_linguas(help_srcdir): + """Get a list of language names from help_srcdir/LINGUAS.""" + linguas_path = os.path.join(help_srcdir, "LINGUAS") + with open(linguas_path, "r", encoding="utf-8") as linguas: + return [l.strip() for l in linguas.readlines() if not l.startswith("#")] + + +def locale_name(locale): + """Look up the human readable name of the given locale. + + locale could be, for example, `de` or `pt_BR`. + """ + # This data actually comes from the iso-codes package, in the iso_639 and + # iso_3166 gettext domains, with extra logic to suppress the country name + # if the language is ‘unique’. + # + # Without appending .UTF-8, these come out as (eg): + # Portuguese (Brazil) [ISO-8859-1] + name = GnomeDesktop.get_language_from_locale(f"{locale}.UTF-8") + return name or locale + + +def format_index(published_subdir, linguas): + """Format the HTML.""" + translation_links = [ + f"""""" + for l in linguas + ] + + # There are a lot of nested divs here, but it means we can reuse the yelp + # CSS from the C-locale help directory + return f"""\ + + + + + Software + + + +
+
+ +
+
+ + """ + + +def main(): + parser = argparse.ArgumentParser( + description="Generate a HTML index for the help pages, for " + "deployment to pages.gitlab.gnome.org.", + ) + parser.add_argument( + "output", + help="File to save output to", + type=argparse.FileType("w", encoding="utf-8"), + ) + parser.add_argument( + "help_srcdir", + help="Source help directory (for example, ‘$srcdir/help’)", + type=pathlib.Path, + ) + parser.add_argument( + "--published-subdir", + help="Path of top of published help directory relative to published " + "location of this index file", + default="help", + ) + args = parser.parse_args() + + # Generate the index page + linguas = parse_linguas(args.help_srcdir) + index_str = format_index(args.published_subdir, linguas) + + # Reformat the XML whitespace nicely + parser = etree.XMLParser() + root = etree.XML(index_str, parser=parser) + etree.indent(root) + + args.output.write(etree.tostring(root, encoding="unicode")) + + +if __name__ == "__main__": + main() diff --git a/.gitlab-ci/meson-junit-report.py b/.gitlab-ci/meson-junit-report.py new file mode 100755 index 0000000..8bb7667 --- /dev/null +++ b/.gitlab-ci/meson-junit-report.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 + +# Turns a Meson testlog.json file into a JUnit XML report +# +# Copyright 2019 GNOME Foundation +# +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# Original author: Emmanuele Bassi + +import argparse +import datetime +import json +import os +import sys +import xml.etree.ElementTree as ET + +aparser = argparse.ArgumentParser(description='Turns a Meson test log into a JUnit report') +aparser.add_argument('--project-name', metavar='NAME', + help='The project name', + default='unknown') +aparser.add_argument('--job-id', metavar='ID', + help='The job ID for the report', + default='Unknown') +aparser.add_argument('--branch', metavar='NAME', + help='Branch of the project being tested', + default='main') +aparser.add_argument('--output', metavar='FILE', + help='The output file, stdout by default', + type=argparse.FileType('w', encoding='UTF-8'), + default=sys.stdout) +aparser.add_argument('infile', metavar='FILE', + help='The input testlog.json, stdin by default', + type=argparse.FileType('r', encoding='UTF-8'), + default=sys.stdin) + +args = aparser.parse_args() + +outfile = args.output + +testsuites = ET.Element('testsuites') +testsuites.set('id', '{}/{}'.format(args.job_id, args.branch)) +testsuites.set('package', args.project_name) +testsuites.set('timestamp', datetime.datetime.utcnow().isoformat()) + +suites = {} +for line in args.infile: + data = json.loads(line) + (full_suite, unit_name) = data['name'].split(' / ') + try: + (project_name, suite_name) = full_suite.split(':') + except ValueError: + (project_name, suite_name) = (args.project_name, full_suite) + + duration = data['duration'] + return_code = data['returncode'] + log = data['stdout'] + log_stderr = data.get('stderr', '') + + unit = { + 'suite': suite_name, + 'name': unit_name, + 'duration': duration, + 'returncode': return_code, + 'stdout': log, + 'stderr': log_stderr, + } + + units = suites.setdefault(suite_name, []) + units.append(unit) + +for name, units in suites.items(): + print('Processing suite {} (units: {})'.format(name, len(units))) + + def if_failed(unit): + if unit['returncode'] != 0: + return True + return False + + def if_succeded(unit): + if unit['returncode'] == 0: + return True + return False + + successes = list(filter(if_succeded, units)) + failures = list(filter(if_failed, units)) + print(' - {}: {} pass, {} fail'.format(name, len(successes), len(failures))) + + testsuite = ET.SubElement(testsuites, 'testsuite') + testsuite.set('name', '{}/{}'.format(args.project_name, name)) + testsuite.set('tests', str(len(units))) + testsuite.set('errors', str(len(failures))) + testsuite.set('failures', str(len(failures))) + + for unit in successes: + testcase = ET.SubElement(testsuite, 'testcase') + testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite'])) + testcase.set('name', unit['name']) + testcase.set('time', str(unit['duration'])) + + for unit in failures: + testcase = ET.SubElement(testsuite, 'testcase') + testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite'])) + testcase.set('name', unit['name']) + testcase.set('time', str(unit['duration'])) + + failure = ET.SubElement(testcase, 'failure') + failure.set('classname', '{}/{}'.format(args.project_name, unit['suite'])) + failure.set('name', unit['name']) + failure.set('type', 'error') + failure.text = unit['stdout'] + '\n' + unit['stderr'] + +output = ET.tostring(testsuites, encoding='unicode') +outfile.write(output) diff --git a/.gitlab-ci/run-docker.sh b/.gitlab-ci/run-docker.sh new file mode 100755 index 0000000..18c738b --- /dev/null +++ b/.gitlab-ci/run-docker.sh @@ -0,0 +1,147 @@ +#!/bin/bash + +read_arg() { + # $1 = arg name + # $2 = arg value + # $3 = arg parameter + local rematch='^[^=]*=(.*)$' + if [[ $2 =~ $rematch ]]; then + read -r "$1" <<< "${BASH_REMATCH[1]}" + else + read -r "$1" <<< "$3" + # There is no way to shift our callers args, so + # return 1 to indicate they should do it instead. + return 1 + fi +} + +SUDO_CMD="sudo" +if docker -v |& grep -q podman; then + # Using podman + SUDO_CMD="" + # Docker is actually implemented by podman, and its OCI output + # is incompatible with some of the dockerd instances on GitLab + # CI runners. + export BUILDAH_FORMAT=docker +fi + +set -e + +base="" +base_version="" +build=0 +run=0 +push=0 +list=0 +print_help=0 +no_login=0 + +while (($# > 0)); do + case "${1%%=*}" in + build) build=1;; + run) run=1;; + push) push=1;; + list) list=1;; + help) print_help=1;; + --base|-b) read_arg base "$@" || shift;; + --base-version) read_arg base_version "$@" || shift;; + --no-login) no_login=1;; + *) echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"; exit 1;; + esac + shift +done + +if [ $print_help == 1 ]; then + echo "$0 - Build and run Docker images" + echo "" + echo "Usage: $0 [options] [basename]" + echo "" + echo "Available commands" + echo "" + echo " build --base= - Build Docker image .Dockerfile" + echo " run --base= - Run Docker image " + echo " push --base= - Push Docker image to the registry" + echo " list - List available images" + echo " help - This help message" + echo "" + exit 0 +fi + +cd "$(dirname "$0")" + +if [ $list == 1 ]; then + echo "Available Docker images:" + for f in *.Dockerfile; do + filename=$( basename -- "$f" ) + basename="${filename%.*}" + + echo -e " \e[1;39m$basename\e[0m" + done + exit 0 +fi + +# All commands after this require --base to be set +if [ -z "${base}" ]; then + echo "Usage: $0 " + exit 1 +fi + +if [ ! -f "$base.Dockerfile" ]; then + echo -e "\e[1;31mERROR\e[0m: Dockerfile for '$base' not found" + exit 1 +fi + +if [ -z "${base_version}" ]; then + base_version="latest" +else + base_version="v$base_version" +fi + +TAG="registry.gitlab.gnome.org/gnome/gnome-software/${base}:${base_version}" + +if [ $build == 1 ]; then + echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}" + BUILDDIR=`pwd` + pushd .. + $SUDO_CMD zip -9 $BUILDDIR/subprojects.meson.zip \ + meson.build \ + meson_options.txt \ + subprojects/appstream.wrap \ + subprojects/gnome-pwa-list.wrap \ + subprojects/gtk.wrap \ + subprojects/libadwaita.wrap \ + subprojects/libglib-testing.wrap \ + subprojects/libxmlb.wrap \ + subprojects/malcontent.wrap \ + subprojects/sysprof.wrap + popd + $SUDO_CMD docker build \ + --build-arg HOST_USER_ID="$UID" \ + --tag "${TAG}" \ + --file "${base}.Dockerfile" . + $SUDO_CMD rm -r subprojects.meson.zip + exit $? +fi + +if [ $push == 1 ]; then + echo -e "\e[1;32mPUSHING\e[0m: ${base} as ${TAG}" + + if [ $no_login == 0 ]; then + $SUDO_CMD docker login registry.gitlab.gnome.org + fi + + $SUDO_CMD docker push $TAG + exit $? +fi + +if [ $run == 1 ]; then + echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}" + $SUDO_CMD docker run \ + --rm \ + --volume "$(pwd)/..:/home/user/app" \ + --workdir "/home/user/app" \ + --tty \ + --interactive "${TAG}" \ + bash + exit $? +fi diff --git a/.gitlab-ci/run-tests.sh b/.gitlab-ci/run-tests.sh new file mode 100755 index 0000000..38e7cb1 --- /dev/null +++ b/.gitlab-ci/run-tests.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +set +e + +case "$1" in + --log-file) + log_file="$2" + shift + shift + ;; + *) + log_file="_build/meson-logs/testlog.json" +esac + +# Remove Flatpak triggers, to speed up the tests (specifically on Fedora, +# they could even break the tests by a deadlock or something like that). +if [ -d /usr/share/flatpak/triggers ]; then + sudo rm -rf /usr/share/flatpak/triggers +fi + +# FIXME: The tests should be isolated and use mock services so they do not +# require a functioning system bus. This will have to do for now though. +sudo mkdir -p /run/dbus +sudo mkdir -p /var +sudo ln -s /var/run /run +sudo dbus-daemon --system --fork +#sudo /usr/lib/polkit-1/polkitd --no-debug & +#sudo /usr/libexec/fwupd/fwupd --verbose & + +# FIXME: Running the flatpak tests as root means the system helper doesn’t +# need to be used, which makes them run a lot faster. +sudo \ +dbus-run-session -- \ +meson test \ + -C _build \ + --timeout-multiplier ${MESON_TEST_TIMEOUT_MULTIPLIER} \ + --no-suite flaky \ + --print-errorlogs \ + "$@" + +exit_code=$? + +python3 .gitlab-ci/meson-junit-report.py \ + --project-name=gnome-software \ + --job-id "${CI_JOB_NAME}" \ + --output "_build/${CI_JOB_NAME}-report.xml" \ + "${log_file}" + +exit $exit_code diff --git a/.gitlab/issue_templates/Default.md b/.gitlab/issue_templates/Default.md new file mode 100644 index 0000000..4ee4965 --- /dev/null +++ b/.gitlab/issue_templates/Default.md @@ -0,0 +1,21 @@ +Firstly, please search to see if someone has already reported the same issue as you: +https://gitlab.gnome.org/GNOME/gnome-software/-/issues/?state=all + +If nobody has reported this issue yet, please provide the details below. + + +Please describe the issue you’re experiencing: +… + + +What Linux distribution are you using, and what kind of package (RPM, deb, flatpak, etc.) are you experiencing the problem with? + + +Please attach a log of the issue, by running the following commands, reproducing the issue, and then attaching `gnome-software.log` here: +```sh +pkill gnome-software +gnome-software --verbose &> gnome-software.log +``` + + +If the problem is with the user interface, please attach a screenshot or video of it. Please attach the file directly rather than linking to an external hosting service, as external files are likely to be deleted after a while. diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..634ee64 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "subprojects/gnome-pwa-list"] + path = subprojects/gnome-pwa-list + url = https://gitlab.gnome.org/mwleeds/gnome-pwa-list.git diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..611cba1 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,6 @@ +Richard Hughes +Matthias Clasen +Kalev Lember + +Backdrop image for Builder featured banner used with permission by +Adam Wyles -- http://www.flickr.com/photos/the-travelling-bum/6336397663/ diff --git a/COMMITMENT b/COMMITMENT new file mode 100644 index 0000000..bfa237f --- /dev/null +++ b/COMMITMENT @@ -0,0 +1,45 @@ +Common Cure Rights Commitment, version 1.0 + +Before filing or continuing to prosecute any legal proceeding or claim +(other than a Defensive Action) arising from termination of a Covered +License, we commit to extend to the person or entity ('you') accused +of violating the Covered License the following provisions regarding +cure and reinstatement, taken from GPL version 3. As used here, the +term 'this License' refers to the specific Covered License being +enforced. + + 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. + +We intend this Commitment to be irrevocable, and binding and +enforceable against us and assignees of or successors to our +copyrights. + +Definitions + +'Covered License' means the GNU General Public License, version 2 +(GPLv2), the GNU Lesser General Public License, version 2.1 +(LGPLv2.1), or the GNU Library General Public License, version 2 +(LGPLv2), all as published by the Free Software Foundation. + +'Defensive Action' means a legal proceeding or claim that We bring +against you in response to a prior proceeding or claim initiated by +you or your affiliate. + +'We' means each contributor to this repository as of the date of +inclusion of this file, including subsidiaries of a corporate +contributor. + +This work is available under a Creative Commons Attribution-ShareAlike +4.0 International license. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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. diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..5a7f1c8 --- /dev/null +++ b/NEWS @@ -0,0 +1,2625 @@ +Version 48.2 +~~~~~~~~~~~~ +Released: 2025-06-02 + +This is a stable release with the following changes: + * Improve memory fragmentation after checking for updates + +This release also updates translations: + * Czech (Daniel Rusek) + * French (Vincent Chatelain) + * Hindi (Scrambled 777) + * Japanese (Takayuki Kusano) + * Latvian (Rūdolfs Mazurs) + * Swedish (Anders Jonsson) + +Version 48.1 +~~~~~~~~~~~~ +Released: 2025-04-10 + +This is a stable release with the following changes: + * Improve contrast of some app safety ratings in dark mode + * Improve error handling when fetching app reviews + +This release also updates translations: + * English (United Kingdom) (Andi Chandler) + * German (Philipp Kiemle, Martin Wagner) + * Kabyle (Athmane MOKRAOUI) + * Nepali (Pawan Chitrakar) + * Panjabi (A S Alam) + * Ukrainian (Yuri Chornoivan) + * Uzbek (Baxrom Raxmatov) + * Vietnamese (Cas Pascal) + +Version 48.0 +~~~~~~~~~~~~ +Released: 2025-03-14 + +This is a stable release with the following changes: + * Correctly show update detail text not provided in markdown + +This release also updates translations: + * Basque (Asier Saratsua Garmendia) + * Belarusian (Vasil Pupkin) + * Bokmål, Norwegian (Brage Fuglseth) + * Catalan (Jordi Mas i Hernandez, Francesc Busquets) + * Danish (Alan Mortensen) + * Filipino (Iverson Briones) + * Hungarian (Balázs Úr) + * Indonesian (Andika Triwidada) + * Nepali (Pawan Chitrakar) + * Panjabi (A S Alam) + * Polish (Piotr Drąg) + * Romanian (Antonio Marin) + * Russian (Artur S0) + * Spanish (Daniel Mustieles) + +Version 48~rc +~~~~~~~~~~~~~ +Released: 2025-02-28 + +This is an unstable release with the following changes: + * Minor interface improvements on the updates page + * Various minor performance improvements + * Improve error handling for app launches and distribution upgrades + * Fix a crash on the app review dialog + * Fix version checks preventing some firmware updates when historical updates are also listed + * Fix a crash when copying error details + * Minor interface improvements to search + * Improvements to flatpak permissions checking for D-Bus + +This release also updates translations: + * Bulgarian (twlvnn kraftwerk) + * Catalan (Jordi Mas) + * Chinese (China) (Luming Zh) + * Chinese (Taiwan) (Cheng-Chia Tseng) + * Czech (Daniel Rusek) + * Finnish (Jiri Grönroos) + * French (Vincent Chatelain) + * Galician (Fran Dieguez) + * Georgian (Ekaterine Papava) + * Hebrew (Yaron Shahrabani) + * Korean (Seong-ho Cho) + * Lithuanian (Aurimas Černius) + * Persian (Danial Behzadi) + * Portuguese (Hugo Carvalho) + * Portuguese (Brazil) (Rafael Fontenelle) + * Russian (Artur S0) + * Slovenian (Martin) + * Swedish (Anders Jonsson) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 48~beta +~~~~~~~~~~~~~~~ +Released: 2025-01-31 + +This is an unstable release with the following changes: + * Support installing flatpaks via a flatpak+https: link + * Fix notifying about outdated updates when in power saver mode or offline + * Prioritise verified apps in source list + +This release also updates translations: + * Bulgarian (twlvnn kraftwerk) + * Czech (Daniel Rusek) + * Russian (Artur S0) + * Slovenian (Martin) + +Version 48~alpha3 +~~~~~~~~~~~~~~~~~ +Released: 2025-01-14 + +This is an unstable release with the following changes: + * Fix downloads of firmware updates + * Fix the release process + +This release also updates translations: + * Belarusian (Vasil Pupkin) + * Slovenian (Martin) + +Version 48~alpha2 +~~~~~~~~~~~~~~~~~ +Released: 2025-01-04 + +This is an unstable release with the following changes: + * Fix the release process + +Version 48~alpha +~~~~~~~~~~~~~~~~ +Released: 2025-01-04 + +This is an unstable release with the following changes: + * Include dependencies in estimated download size + * Improve performance when loading updates + * Fix interface freeze when upvoting/downvoting reviews + * Various minor interface improvements for keyboard navigation and small screens + * Fix crash when uninstalling snaps + * Add experimental systemd-sysupdate plugin + * Warn about microphone permissions if an app has PipeWire access + +This release also updates translations: + * Belarusian (Vasil Pupkin) + * Catalan (Jordi Mas i Hernandez, Jordi Mas) + * Dutch (Nathan Follens) + * French (Vincent Chatelain) + * Friulian (Fabio Tomat) + * German (Jürgen Benvenuti) + * Hebrew (Yaron Shahrabani) + * Kabyle (Athmane MOKRAOUI) + * Latvian (Rūdolfs Mazurs) + * Portuguese (Hugo Carvalho) + * Portuguese (Brazil) (Rafael Fontenelle) + * Russian (Artur S0) + * Serbian (Марко Костић, Милош Поповић) + * Slovak (Jose Riha) + * Slovenian (Martin) + * Thai (Aefgh Threenine) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 47.0 +~~~~~~~~~~~~ +Released: 2024-09-12 + +This is a stable release with the following changes: + * Do not install example featured software lists by default (packagers should use gnome-app-list + instead) + +This release also updates translations: + * Bokmål, Norwegian (Brage Fuglseth) + * Bulgarian (twlvnn kraftwerk, Alexander Shopov) + * Catalan (Jordi Mas i Hernandez) + * Czech (Daniel Rusek) + * Danish (Alan Mortensen) + * English (United Kingdom) (Bruce Cowan) + * Galician (Fran Dieguez) + * Hungarian (Balázs Úr) + * Indonesian (Andika Triwidada) + * Italian (Davide Ferracin) + * Kazakh (Baurzhan Muftakhidinov) + * Lithuanian (Aurimas Černius) + * Occitan (post 1500) (Quentin PAGÈS) + * Polish (Piotr Drąg) + * Portuguese (Hugo Carvalho) + * Portuguese (Brazil) (Juliano de Souza Camargo) + * Spanish (Daniel, Daniel Mustieles) + * Swedish (Anders Jonsson) + * Thai (Aefgh Threenine) + * Turkish (Emin Tufan Çetin) + +Version 47~rc +~~~~~~~~~~~~~ +Released: 2024-08-30 + +This is an unstable release with the following changes: + * Update help pages and add some translations of them + * Correct tooltips of review voting buttons + * Lower power consumption when certain pages are not visible + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Belarusian (Vasil Pupkin) + * Bokmål, Norwegian (Brage Fuglseth) + * Chinese (China) (Luming Zh) + * Czech (Daniel Rusek) + * Finnish (Jiri Grönroos) + * Georgian (Ekaterine Papava) + * German (Jürgen Benvenuti, Tim Sabsch) + * Greek, Modern (1453-) (Giannis Antypas) + * Hindi (Scrambled 777) + * Korean (Seong-ho Cho) + * Persian (Danial Behzadi) + * Portuguese (Brazil) (Rafael Fontenelle, Juliano de Souza Camargo) + * Russian (Artur S0) + * Slovak (Matej Mrenica) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 47~beta +~~~~~~~~~~~~~~~ +Released: 2024-08-02 + +This is an unstable release with the following changes: + * Shorten text in some notifications + * Fix Orca not reading the contents in Preferences dialog + * Enhance behavior of a review row + * Added plugin to ease installation of DKMS and akmods key with enabled Secure Boot + +This release also updates translations: + * Greek, Modern (1453-) (Efstathios Iosifidis) + * Hebrew (Yaron Shahrabani, Yosef Or Boczko) + * Hindi (Scrambled 777) + * Slovenian (Martin) + +Version 47~alpha +~~~~~~~~~~~~~~~~ +Released: 2024-06-28 + +This is an unstable release with the following changes: + * Fix a crash when updating apps when built with Mogwai + * Fix a crash when installing flatpak application + * Correct desktop/mobile hardware support detection + * Correct state of Fedora upgrade + * Several fixes in historical updates for rpm-ostree + * Fix a crash when no appstream data is found + * Correct app safety calculation + * Correct Flatpak system and user apps recognition + * Slightly speed-up rpm-ostree metadata refresh + * Show "Install All" button only for codecs + * Prefer vendor name from os release in app origin + * Make more jobs asynchronous + * Port to recent Adwaita widgets + +This release also updates translations: + * Catalan (Jordi Mas i Hernandez) + * Chinese (China) (Boyuan Yang) + * Czech (Daniel Rusek) + * Dutch (Nathan Follens) + * Friulian (Fabio Tomat) + * Georgian (Ekaterine Papava) + * Hebrew (Yosef Or Boczko) + * Kabyle (Athmane MOKRAOUI) + * Panjabi (A S Alam) + * Portuguese (Hugo Carvalho) + * Russian (Artur S0) + * Serbian (Милош Поповић) + * Slovenian (Martin) + * Spanish (Daniel Mustieles) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 46.0 +~~~~~~~~~~~~ +Released: 2024-03-15 + +This is a stable release with the following changes: + * Improvements for screen readers + * Stop ‘loading updates’ in a loop on Debian + +This release also updates translations: + * Czech (Daniel Rusek) + * Danish (Alan Mortensen) + * Finnish (Jiri Grönroos) + * French (Vincent Chatelain) + * Galician (Fran Dieguez) + * Georgian (Ekaterine Papava) + * Hungarian (Balázs Úr) + * Indonesian (Kukuh Syafaat) + * Korean (Seong-ho Cho) + * Latvian (Rūdolfs Mazurs) + * Persian (Danial Behzadi) + * Polish (Piotr Drąg) + * Portuguese (Brazil) (Juliano de Souza Camargo) + * Russian (Artur S0) + * Swedish (Anders Jonsson) + * Thai (Aefgh Threenine) + * Turkish (Emin Tufan Çetin) + +Version 46~rc +~~~~~~~~~~~~~ +Released: 2024-03-01 + +This is an unstable release with the following changes: + * Various UI text improvements + * Fix launch of some apps + * Fix invalid app state after it's uninstalled + * Fix read of app description text + * Do not ask to reboot after failed firmware update + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Belarusian (Vasil Pupkin) + * Bokmål, Norwegian (Brage Fuglseth) + * Catalan (Jordi Mas, Quique Serrano) + * Chinese (China) (Boyuan Yang) + * Czech (Daniel Rusek) + * Dutch (Nathan Follens) + * English (United Kingdom) (Andi Chandler) + * Galician (Fran Dieguez) + * Georgian (Ekaterine Papava) + * German (Jürgen Benvenuti, Philipp Kiemle) + * Hebrew (Yaron Shahrabani) + * Indonesian (Kukuh Syafaat) + * Kazakh (Baurzhan Muftakhidinov) + * Latvian (Rūdolfs Mazurs) + * Lithuanian (Aurimas Černius) + * Occitan (post 1500) (Quentin PAGÈS) + * Persian (Danial Behzadi) + * Russian (Artur S0) + * Slovenian (Matej Urbančič) + * Spanish (Daniel Mustieles) + * Thai (Aefgh Threenine) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 46~beta +~~~~~~~~~~~~~~~ +Released: 2024-02-09 + +This is an unstable release with the following changes: + * Show feedback for all conditions that pause automatic updates + * Various UI improvements and move to new libadwaita widgets + * Fix loading OS AppStream catalog data if it is available as YAML + * Add openSUSE Leap distro upgrade plugin + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Belarusian (Vasil Pupkin) + * Czech (Daniel Rusek) + * Galician (Fran Dieguez) + * Hebrew (Yosef Or Boczko) + * Persian (Danial Behzadi) + * Portuguese (Brazil) (Juliano de Souza Camargo) + * Russian (Artur S0) + * Turkish (Sabri Ünal) + +Version 46~alpha +~~~~~~~~~~~~~~~~ +Released: 2024-01-05 + +This is an unstable release with the following changes: + * Recognize links in package update descriptions + * Expose package names discreetly in the UI + * Increase speed of load of the category pages + * Improve search match with multiple words + * Recognize verified apps by Flathub + * Correct message when installing firmware updates + * Improve application safety checks + * Improve update preferences dialog + * Fix deadlock when cancelling app update + * Support user installation of local flatpak files + * Fix apps appearing unsorted and without tiles in category page + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Chinese (China) (Boyuan Yang) + * Chinese (Taiwan) (Andre Klapper) + * Czech (Daniel Rusek) + * Friulian (Fabio Tomat) + * Georgian (Ekaterine Papava) + * German (Jürgen Benvenuti) + * Hebrew (Yosef Or Boczko) + * Persian (Danial Behzadi) + * Romanian (Florentina Mușat) + * Russian (Artur S0) + * Turkish (Emin Tufan Çetin, Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + * Vietnamese (Ngọc Quân Trần) + +Version 45.0 +~~~~~~~~~~~~ +Released: 2023-09-15 + +This is a stable release with the following changes: + * Fix a crash when downloading resources from the Internet + * Fix a crash after cancelled Restart request + * Correct safety rating for KDE apps + * Correct version history widgets visibility in the details page + +This release also updates translations: + * Catalan (Jordi Mas) + * Greek, Modern (1453-) (Efstathios Iosifidis) + * Hebrew (Yosef Or Boczko) + * Hungarian (Balázs Úr) + * Indonesian (Kukuh Syafaat) + * Korean (Seong-ho Cho) + * Occitan (post 1500) (Quentin PAGÈS) + * Panjabi (A S Alam) + * Slovenian (Matej Urbančič) + * Spanish (Daniel Mustieles) + * Swedish (Anders Jonsson) + * Turkish (Emin Tufan Çetin) + +Version 45~rc +~~~~~~~~~~~~~ +Released: 2023-09-01 + +This is an unstable release with the following changes: + * Fix firmware's 'Restart & Update' to ask for the restart + * Fix app getting unresponsive when loading screenshots + * Improve performance for PackageKit plugin search-by-file + * Improve app license display + * Improve search to also check for 'contains' words + * Various minor styling updates + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Belarusian (Vasil Pupkin) + * Catalan (Jordi Mas) + * Chinese (China) (Luming Zh, Boyuan Yang) + * Czech (Daniel Rusek) + * Danish (Alan Mortensen) + * Dutch (Nathan Follens) + * Finnish (Jiri Grönroos) + * Galician (Fran Dieguez) + * Georgian (Ekaterine Papava) + * German (Philipp Kiemle, Christian Kirbach) + * Greek, Modern (1453-) (Efstathios Iosifidis) + * Hebrew (Yosef Or Boczko) + * Hungarian (Balázs Úr) + * Indonesian (Andika Triwidada, Kukuh Syafaat) + * Kazakh (Baurzhan Muftakhidinov) + * Lithuanian (Aurimas Černius) + * Panjabi (Amn Alam) + * Persian (Danial Behzadi) + * Polish (Piotr Drąg) + * Portuguese (Hugo Carvalho) + * Russian (Artur S0, Artur So) + * Spanish (Daniel Mustieles) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 45~beta +~~~~~~~~~~~~~~~ +Released: 2023-07-30 + +This is an unstable release with the following changes: + * Improve error notifications from failed GPG checks + * Disable animations in the UI according to the user’s accessibility settings + * Fix applying updates which require some packages to be removed to satisfy dependencies + * Stop using the software repositories dialog provided by the distribution, and always use GNOME + Software’s inbuilt dialog; this will affect Debian and Ubuntu + +This release also updates translations: + * Belarusian (Vasil Pupkin) + * Chinese (China) (Luming Zh) + * Czech (Daniel Rusek) + * English (United Kingdom) (Bruce Cowan) + * French (Guillaume Bernard) + * Friulian (Fabio Tomat) + * Georgian (Ekaterine Papava) + * Greek, Modern (1453-) (Efstathios Iosifidis) + * Hebrew (Yosef Or Boczko) + * Hungarian (Balázs Úr) + * Lithuanian (Aurimas Černius) + * Persian (Danial Behzadi) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 45~alpha +~~~~~~~~~~~~~~~~ +Released: 2023-06-30 + +This is an unstable release with the following changes: + * Indicate when OS updates includes security fixes + * Ask whether to clear app storage for Flatpak apps on uninstall + * Show a notification when system updates are downloaded + * Advertise if an installed Flatpak app has reached end of life + * Revamp Safety ratings + * Fix slow Repositories dialog open + * Fix card view and key navigation in the Explore page + * Fix a crash on startup in GNOME OS + * Fix navigation between "Other Apps by Developer" in the Details page + * Fix a crash when refining a Flatpak app + * Fix a state recover after a failed app update + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Catalan (Jordi Mas i Hernandez) + * Czech (Daniel Rusek) + * Finnish (Jiri Grönroos) + * Friulian (Fabio Tomat) + * Georgian (Ekaterine Papava) + * Hebrew (Yosef Or Boczko) + * Italian (Gianvito Cavasoli) + * Occitan (post 1500) (Quentin PAGÈS) + * Persian (Danial Behzadi) + * Polish (Piotr Drąg) + * Portuguese (Hugo Carvalho) + * Russian (Aleksandr Melman) + * Slovenian (Martin) + * Turkish (Sabri Ünal) + +Version 44.1 +~~~~~~~~~~~~ +Released: 2023-04-21 + +This is a stable release with the following changes: + * Fix firmware updates state change after update + * Fix origin reference information for PackageKit apps + * Fix a crash after dismissing firmware update warning dialog + * Fix a crash on repo removal + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Bulgarian (Alexander Shopov) + * Chinese (China) (Boyuan Yang) + * Chinese (Taiwan) (Chao-Hsiung Liao) + * Czech (Petr Kovář, Daniel Rusek) + * Dutch (Nathan Follens) + * French (Guillaume Bernard) + * Occitan (post 1500) (Quentin PAGÈS) + * Persian (Danial Behzadi) + * Slovenian (Martin) + * Vietnamese (Ngọc Quân Trần) + +Version 44.0 +~~~~~~~~~~~~ +Released: 2023-03-16 + +This is a stable release with the following changes: + * Fix missing separators in system updates dialog + +This release also updates translations: + * Bulgarian (Alexander Shopov) + * Catalan (Jordi Mas) + * Danish (Alan Mortensen) + * English (United Kingdom) (Bruce Cowan) + * Friulian (Fabio Tomat) + * Hebrew (Yosef Or Boczko) + * Korean (Seong-ho Cho) + * Polish (Piotr Drąg) + * Russian (Aleksandr Melman) + * Slovenian (Martin, Matej Urbančič) + * Swedish (Anders Jonsson) + +Version 44~rc +~~~~~~~~~~~~~ +Released: 2023-03-03 + +This is an unstable release with the following changes: + * Fix a crash during install of a firmware update + * Fix notifications of a prepared update + * Fix cancellation of an update + * Update details page on app job start/end + * Fix a crash after cancelling of a single package update + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Belarusian (Vasil Pupkin) + * Bokmål, Norwegian (Kjartan Maraas) + * Catalan (Jordi Mas) + * Finnish (Jiri Grönroos) + * Friulian (Fabio Tomat) + * Galician (Fran Dieguez) + * Georgian (Ekaterine Papava) + * German (Jürgen Benvenuti, Philipp Kiemle) + * Hebrew (Yosef Or Boczko, Yaron Shahrabani) + * Hungarian (Balázs Úr) + * Indonesian (Andika Triwidada, Kukuh Syafaat) + * Lithuanian (Aurimas Černius) + * Occitan (post 1500) (Quentin PAGÈS) + * Portuguese (Hugo Carvalho) + * Spanish (Daniel, Daniel Mustieles) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 44~beta +~~~~~~~~~~~~~~~ +Released: 2023-02-13 + +This is an unstable release with the following changes: + * Add a preference for only showing freely-licensed apps + * Improve design of Install/Uninstall buttons for app addons + * Fix loading flatpak bundles if a runtime is missing + * Improvements to the UI for ratings and reviews + * Fix refreshing the details page after searching for an app + * Improve choice of icons for apps where a themed icon is available + * Improve performance of downloading remote icons significantly + +This release also updates translations: + * Basque (Asier Sarasua Garmendia) + * Belarusian (Vasil Pupkin) + * Galician (Fran Dieguez) + * Georgian (Ekaterine Papava) + * German (Jürgen Benvenuti) + * Hebrew (Yosef Or Boczko, Yaron Shahrabani) + * Indonesian (Andika Triwidada) + * Lithuanian (Aurimas Černius) + * Occitan (post 1500) (Quentin PAGÈS) + * Portuguese (Hugo Carvalho) + * Russian (Aleksandr Melman) + * Spanish (Philip Withnall, Daniel Mustieles) + * Turkish (Sabri Ünal, Emin Tufan Çetin) + * Ukrainian (Yuri Chornoivan) + * Vietnamese (Ngọc Quân Trần) + +Version 44~alpha +~~~~~~~~~~~~~~~~ +Released: 2023-01-06 + +This is an unstable release with the following changes: + * Allow automatically removing unneeded runtimes + * Show changelogs for rpm-ostree updates + * Limit the maximum description length in context tiles + * Support a less-prominent UI for regular updates for image-based OSs + * Improvements to error notification display + * Reduce reloading/refreshing of view when installing apps + * Minor usability improvements to review lists and adding a review + * Stop using libdnf in rpm-ostree backend + * UI polish on app source chooser + * Fix distro upgrades + * Fix system-wide external AppStream support + * UI polish on Incompatible Software dialog + * Fix opening web apps + * Fix notifying about available firmware updates + * Improve scaling of Explore page on phones + * Add a placeholder to search entry + * Fix repo authentication dialog + * Periodically refresh cached app icons + * Improve labels and tooltips on Updates page + * Annotate firmware updates with their release urgency + * Adapt to GTK API deprecations + * Use the OS logo for minor update rows for image-based OSs + * Change ‘application’ to ‘app’ in translatable strings + * Stop notifying about unprepared critical updates + * Show the ‘Learn More’ link for larger updates of image-based OSs if provided + * Add translations for more firmware device categories + +This release also updates translations: + * Abkhazian (Nart Tlisha) + * Belarusian (Vasil Pupkin) + * Catalan (Jordi Mas) + * Chinese (Taiwan) (Cheng-Chia Tseng) + * Croatian (Goran Vidović) + * Czech (Daniel Rusek) + * French (Claude Paroz) + * Friulian (Fabio Tomat) + * Georgian (Zurab Kargareteli) + * German (Philipp Kiemle, Jürgen Benvenuti) + * Greek, Modern (1453-) (Kosmas Martakidis) + * Hebrew (Yosef Or Boczko) + * Hungarian (Balázs Úr) + * Icelandic (Sveinn í Felli) + * Interlingue (Olga Smirnova) + * Italian (Gianvito Cavasoli) + * Kazakh (Baurzhan Muftakhidinov) + * Panjabi (A S Alam) + * Persian (Danial Behzadi) + * Russian (Aleksandr Melman) + * Slovenian (Matej Urbančič) + * Turkish (Sabri Ünal) + * Ukrainian (Yuri Chornoivan) + +Version 43.1 +~~~~~~~~~~~~ +Released: 2022-10-21 + +This is a stable release with the following changes: + * Fix searches not completing if installing or uninstalling an app at the same time + * Notify of errors when running a flatpak app whose runtime is missing + * Fix installing local RPM packages + * Fix distribution upgrades when package conflicts are present + * Fix opening web apps from their details page + * Improve appearance of app ratings if ratings data cannot be downloaded + * Fix crash when showing offline update errors on startup + * Highlight priority of firmware updates, making security fixes more obvious + * Fix installation of pending apps in some situations + * Fix downloading of rpm-ostree app updates from the Updates page + +This release also updates translations: + * Abkhazian (Nart Tlisha) + * Catalan (Jordi Mas) + * Chinese (Taiwan) (Cheng-Chia Tseng) + * Croatian (Goran Vidović) + * French (Claude Paroz) + * Friulian (Fabio Tomat) + * Georgian (Zurab Kargareteli) + * German (Philipp Kiemle, Jürgen Benvenuti) + * Icelandic (Sveinn í Felli) + * Italian (Gianvito Cavasoli) + * Kazakh (Baurzhan Muftakhidinov) + * Panjabi (A S Alam) + * Slovenian (Matej Urbančič) + +Version 43.0 +~~~~~~~~~~~~ +Released: 2022-09-16 + +This is a stable release with translation updates: + * Bulgarian + * Catalan + * Chinese (Taiwan) + * Czech + * English (United Kingdom) + * Galician + * Georgian + * German + * Hebrew + * Hungarian + * Icelandic + * Latvian + * Lithuanian + * Nepali + * Serbian + * Slovenian + * Spanish + * Swedish + +Version 43~rc +~~~~~~~~~~~~~ +Released: 2022-09-02 + +This is the third unstable release for GNOME 43. + * Supports video as a screenshot + * Improvements of source picker in the details page + * Fixes a bug when viewing details of a package file + * Fixes a bug when reading certain .flatpakref file + +This release also updates translations: + * Abkhazian + * Basque + * Catalan + * Chinese (China) + * Croatian + * Danish + * Dutch + * Finnish + * Galician + * Georgian + * Hebrew + * Icelandic + * Indonesian + * Korean + * Lithuanian + * Persian + * Polish + * Portuguese + * Portuguese (Brazil) + * Russian + * Serbian + * Spanish + * Turkish + * Ukrainian + +Version 43~beta +~~~~~~~~~~~~~~~ +Released: 2022-08-05 + +This is the second unstable release for GNOME 43. + * Various fixes related to changed threading model + * Various UI parts updated + * Sources dropdown had been reworked + * Fixes a rare crash when showing app details + +This release also updates translations: + * Abkhazian + * Catalan + * Chinese (China) + * Dutch + * Georgian + * Hebrew + * Indonesian + * Italian + * Lithuanian + * Persian + * Portuguese + * Russian + * Serbian + * Spanish + * Turkish + * Ukrainian + * Vietnamese + +Version 43~alpha +~~~~~~~~~~~~~~~~ +Released: 2022-06-30 + +This is the first unstable release for GNOME 43. + * Various improvements to notifications + * Fix several crashes when handling flatpak apps + * Add ‘Other Apps by Author’ section in the app details page + * Improve styling of app context lozenges + * Add ‘Available for Distro’ section to the overview page (if configured by your distribution) + * Show more details about file system permissions requested by flatpak apps + * Show more types of URI from app metainfo + * Fix a few issues when using a dark mode theme + * Fix some issues with arrows in right-to-left locales + * Fix language pack installation for certain locales + * Improve debug output to make user bug reports more useful + * Add `--uninstall=ID` command line option + * Allow scrolling screenshots by clicking on next and previous screenshots + * Add support for webapps + * Allow swiping back in the shell using touch gestures + * Improved caching of downloaded metadata + * Many internal architectural changes to make the code more maintainable + * The popular-overrides GSettings key has been removed; distribution vendors wishing to mark + their apps as popular should see `doc/vendor-customisation.md` for examples of how to do this + now + * The hardcoded_popular Meson option has been renamed to hardcoded_curated. + +This release also updates translations: + * Basque + * Bulgarian + * Catalan + * Chinese (China) + * Chinese (Taiwan) + * Croatian + * Czech + * Danish + * Dutch + * English (United Kingdom) + * Finnish + * French + * Friulian + * Galician + * Georgian + * German + * Hebrew + * Hungarian + * Indonesian + * Lithuanian + * Nepali + * Occitan (post 1500) + * Persian + * Polish + * Portuguese + * Portuguese (Brazil) + * Russian + * Serbian + * Slovenian + * Spanish + * Swedish + * Turkish + * Ukrainian + * Vietnamese + +Version 42.0 +~~~~~~~~~~~~ +Released: 2022-03-18 + +This is a stable release with the following changes: + * Various fixes related to changed threading model + * Added several appstream-related fixes + +This release also updates translations: + * Basque + * Bokmål, Norwegian + * Bulgarian + * Catalan + * Chinese (China) + * Danish + * Finnish + * French + * German + * Hebrew + * Hungarian + * Japanese + * Kazakh + * Lithuanian + * Occitan (post 1500) + * Persian + * Polish + * Russian + * Serbian + * Slovenian + * Swedish + +Version 42~rc +~~~~~~~~~~~~~ +Released: 2022-03-04 + +This is the third unstable release for GNOME 42. + * Cancel ongoing update downloads when system power is low + * Numerous small user interface fixes and tweaks + * Prioritize full matches in search results + * Improvements in dark mode + * Fix disabling flatpak remotes from the ‘Software Repositories’ dialog + * Threading and performance improvements which should reduce the number of user interface freezes + * Update some icons + * Check for updates when moving from a metered to a non-metered network connection + +This release also updates translations: + * Basque + * Catalan + * Chinese (China) + * Croatian + * Czech + * Danish + * Friulian + * Galician + * Hebrew + * Indonesian + * Korean + * Lithuanian + * Persian + * Portuguese + * Portuguese (Brazil) + * Russian + * Slovenian + * Spanish + * Turkish + * Ukrainian + +Version 42~beta +~~~~~~~~~~~~~~~ +Released: 2022-02-10 + +This is the second unstable release for GNOME 42. + * Allow --verbose to be enabled at runtime + * Condense the rows in the age rating context dialog + * Update the UI for ratings and reviews of apps + * Improve the appearance of the category page loading screen + * Drop the first run dialog + * Improvements to dark theming + * Support viewing a specific metainfo file using --show-metainfo + * Several more threading improvements + * Icon updates + * Drop the hardcoded-popular plugin in favour of an appstream file + * The background image for upgrades is now looked for using several well-known (and + distribution-specific) names in ${DATADIR}/gnome-software/backgrounds, and the previous + Fedora-specific default background image is no longer distributed. Similarly, the + upgrade-background-uri GSettings key has been removed. Distributions may need to update how + they ship background images. See doc/vendor-customisation.md. + +This release also updates translations: + * Chinese (China) + * Galician + * Hebrew + * Icelandic + * Indonesian + * Japanese + * Occitan (post 1500) + * Portuguese + * Portuguese (Brazil) + * Russian + * Slovenian + * Spanish + * Ukrainian + +Version 42~alpha +~~~~~~~~~~~~~~~~ +Released: 2022-01-07 + +This is the first unstable release for GNOME 42. + * Various UI parts updated + * Support more markup in the application description + * Ask about package signature with PackageKit on signing issue + * Show better System Update progress + * Remove various cultural sensitivity badges + * Fix a crash when processing age ratings + * Reload application details only when not installing/removing the application + * Do not follow symlinks when calculating disk size usage + * Fix addons section, which could show addons for different application + * Fix showing a ‘transaction in progress’ error when using the rpm-ostree plugin + * Don’t recommend a reboot if firmware updates fail + * Fix flathub repo being considered present on Fedora 35 with filtered flathub + * Allow searching for extensions + * Fix translation of main button on updates page + * Fix codec installation process + * Add new GNOME Circle apps to the featured carousel + * Improve metadata support for snaps + * Fix update checks being missed across suspend/hibernation + * Ensure application lists are updated when repositories are enabled/installed or + disabled/removed + +This release also updates translations: + * Basque + * Belarusian + * Bulgarian + * Catalan + * Chinese (China) + * Croatian + * Dutch + * English (United Kingdom) + * Friulian + * Galician + * German + * Hebrew + * Icelandic + * Indonesian + * Latvian + * Lithuanian + * Occitan (post 1500) + * Persian + * Portuguese + * Portuguese (Brazil) + * Russian + * Serbian + * Slovak + * Slovenian + * Spanish + * Swedish + * Turkish + * Ukrainian + * Vietnamese + +Version 41.0 +~~~~~~~~~~~~ +Released: 2021-09-17 + +This is a stable release with the following changes: + * Instead of showing all package-based apps as "potentially unsafe", only use that language for + 3rd party ones + * Fix a bug where the "Show more" button on an app details page would flicker when the window is + resized + * Fix a bug where Software sometimes shows an Uninstall button after uninstalling something + * Add GNOME Circle apps to the featured carousel + * Fix a bug where Software would sometimes fail to execute an install/remove operation for + PackageKit software rather than showing a PolicyKit password prompt + * Fix a bug where Software would fail to upgrade the distribution via PackageKit + * Fix the hiding of rows on the Updates tab after they have been updated + +This release also updates translations: + * Basque + * Catalan + * Chinese (China) + * Croatian + * Czech + * Danish + * Dutch + * Finnish + * French + * Galician + * German + * Hungarian + * Indonesian + * Korean + * Lithuanian + * Occitan (post 1500) + * Polish + * Portuguese + * Portuguese (Brazil) + * Romanian + * Russian + * Slovenian + * Spanish + * Swedish + * Ukrainian + +Version 41~rc +~~~~~~~~~~~~~ +Released: 2021-09-07 + +This is the third unstable release for GNOME 41. + * Tweaks to the context tiles and dialogs + * Fixes to the details page for non-desktop apps + * Re-add support for the add-ons categories + * Sort new and updated apps by release date on the category page + +This release also updates translations: + * Basque + * Catalan + * Chinese (China) + * Chinese (Taiwan) + * Croatian + * English (United Kingdom) + * Finnish + * Galician + * Indonesian + * Kazakh + * Korean + * Lithuanian + * Occitan (post 1500) + * Persian + * Portuguese + * Portuguese (Brazil) + * Slovenian + * Spanish + * Swedish + * Ukrainian + +Version 41~beta +~~~~~~~~~~~~~~~ +Released: 2021-08-13 + +This is the second unstable release for GNOME 41. + * Many parts of the user interface reworked + * Fix when the 'Launch' button is shown after an application install + * Fix appstream:// URL handling + * Fix application freeze on Flatpak application install/remove/update + * Disable automatic update downloads when in power saver mode + +This release also updates translations: + * Belarusian + * Bulgarian + * Catalan + * Friulian + * Galician + * German + * Greek, Modern (1453-) + * Occitan (post 1500) + * Persian + * Portuguese + * Portuguese (Brazil) + * Slovenian + * Ukrainian + +Version 41~alpha +~~~~~~~~~~~~~~~~ +Released: 2021-07-20 + +This is the first unstable release for GNOME 41. + * Many parts of the user interface reworked + * Improve error reporting from flatpak when low on disk space + * Fix issues with updating the UI when uninstalling apps with add-ons + * Don’t keep rpm-ostreed alive forever + * Prevent polkit checks showing up for background operations + * Disallow submitting reviews for an app you haven’t installed + * Show download size in the Updates page + * Notify when restart is needed when uninstalling an app + * Fix some issues with searches not running + * Allow non-integer average star ratings for apps + * Reduce number of categories in the UI + * Improve ‘pending updates’ notifications + * Refine presentation of download and installed size on details page + * Remove left over gnome-online-account dependencies + +This release also updates translations: + * Basque + * Belarusian + * Bokmål, Norwegian + * Catalan + * Chinese (China) + * Chinese (Taiwan) + * Czech + * Dutch + * English (United Kingdom) + * Finnish + * Friulian + * German + * Greek, Modern (1453-) + * Hebrew + * Italian + * Lithuanian + * Nepali + * Occitan (post 1500) + * Persian + * Polish + * Portuguese + * Portuguese (Brazil) + * Romanian + * Russian + * Serbian + * Spanish + * Swedish + * Ukrainian + +Version 40 +~~~~~~~~~~ +Released: 2021-03-19 + +This is a stable release with the following changes: + * Fix handling of invalid or incomplete application icons + * Fix the plugin documentation to reflect reality + * Fix the Snap plugin to actually load icons + * Set download size to 0 after the package is downloaded + +Translation updates: + * British English + * Danish + * Greek + * Italian + * Norwegian Bokmål + * Polish + * Punjabi + * Serbian + +Version 40~rc +~~~~~~~~~~~~~ +Released: 2021-03-12 + +This is an unstable release with the following changes: + * Implement new featured apps carousel. + * List of Flatpak repositories is updated when changed using the Flatpak command line tool. + * The loading page now shows the full color icon instead of the symbolic one. + * Show release date in version history for releases that use the 'date' attribute. + * Improved icon handling, including with hiDPI screens. + * Fixed a bug in remembering when update notifications were shown. + * Build as a dynamic rather than a static library, and rearrange installation paths. + +Translation updates: + * Basque + * Catalan + * Croatian + * Czech + * Dutch + * English (United Kingdom) + * Finnish + * French + * Friulian + * Galician + * German + * Hungarian + * Indonesian + * Kazakh + * Korean + * Lithuanian + * Persian + * Portuguese + * Portuguese (Brazil) + * Romanian + * Serbian + * Slovenian + * Spanish + * Swedish + * Turkish + * Ukrainian + +Version 40~beta +~~~~~~~~~~~~~~~ +Released: 2021-02-16 + +This is an unstable release with the following changes: + * GNOME Software now uses libappstream instead of libappstream-glib to work with appstream data + which provides information about apps and other components. + * App details pages show version history information when it's available. + * The loading page now shows the full color icon instead of the symbolic one. + * UI elements for displaying app add-ons have been tweaked to more closely match the designs. + * Installed icons and the badge showing the number of updates available were changed back to blue + from green. + * The dropdown showing the available sources of an application includes the packaging format + (e.g. Flatpak vs RPM). + * A bug was fixed that prevented installation of .flatpakref files + +Translation updates: + * Catalan + * Czech + * Galician + * Indonesian + * Panjabi + * Portuguese + * Slovenian + * Spanish + * Swedish + +Version 40~alpha +~~~~~~~~~~~~~~~~ +Released: 2021-01-27 + +This is the first unstable release for GNOME 40. + * Small updates to how app descriptions and addons are presented on the details page + * Fix handling of pending app installations when going online + * Better support for dark themes (particularly Adwaita-Dark) + * Improvements to how app screenshots are loaded and presented + * Hide ‘Launch’ button if an application (for example, Wine) cannot be launched + * Make the UI clearer when loading information from flatpakref files + * Don’t update app metadata on start when download-updates is disabled + * Fix opening the updates list when clicking on an updates notification + * Fix state updates when installing flatpak apps or repos which are already installed + * Add Ctrl+Q as a keyboard shortcut for closing the window + * Rework timing and content of software update notifications + * Prevent uninstalled local apps from appearing in the installed apps list + * Support installation/uninstallation of addons for flatpak apps + * Improve presentation of age ratings for apps + * Fix a crash in the updates page + * Fix presentation of app permissions for fully sandboxed flatpak apps + * Fix deadlock on rpm-ostree systems + * Fix presentation of version number changes in right-to-left locales + * Error handling improvements for fwupd + * Performance improvements for ODRS on startup + * Improve presentation of firmware warning messages + * XML parsing performance improvements + * Automatically remove end-of-life flatpak runtimes + * Support updating flatpaks to their new name when they are renamed + * Update the GNOME Software icon + * Support more search results in the snap store + * Drop libgnome-desktop-3 dependency in favour of gsettings-desktop-schemas + +This release also updates translations: + * Basque + * Bokmål, Norwegian + * Catalan + * Chinese (Taiwan) + * Czech + * Friulian + * Galician + * German + * Greek, Modern (1453-) + * Hebrew + * Indonesian + * Italian + * Kabyle + * Kazakh + * Latvian + * Lithuanian + * Persian + * Portuguese + * Portuguese (Brazil) + * Romanian + * Slovak + * Spanish + * Turkish + * Ukrainian + * Vietnamese + +Version 3.37.92 +~~~~~~~~~~~~~~~ +Released: 2020-09-01 + +This is an unstable stable release with the following changes: + * Add sysprof support for profiling jobs + * Add webflow and basic auth support to flatpak plugin + * Coalesce refresh operations where possible + * Correctly mark layered rpm-ostree local packages as removable + * Fix flatpak bundle installation + * Handle invalid snap auth data + * Improve flatpak progress reporting for transactions + * Improve the heuristic for detecting old-style AppStream override files + * Many performance improvements in many areas of the code + * Only delete the firmware archive if we downloaded it to the cache + * Show a pulsing progress bar if progress is unknown + * Support loading appstream files from custom install prefix + * Use the runtime fwupd version for the user agent + +This release also updates existing translations. + +Version 3.36.0 +~~~~~~~~~~~~~~ +Released: 2020-03-11 + +This is the first stable release for GNOME 3.36. + +Version 3.35.92 +~~~~~~~~~~~~~~~ +Released: 2020-03-04 + +This is an unstable stable release with the following changes: + * Fix crash when viewing application details + * Fix “thrice daily” check running every 3 days + * Improve the appearance of the front page banners + * Show the correct upgrade banner contents when a reboot is requried + +This release also updates existing translations. + +Version 3.35.91 +~~~~~~~~~~~~~~~ +Released: 2020-02-19 + +This is an unstable stable release with the following changes: + * Add an info bar about automatic updates + * Avoid rpm-ostree downgrade error when doing distro upgrade + * Click on stars to open review dialog in the details view + * Fix loading of icons from AppStream YAML + * Fix weird font sizes in the batter + * Hide any in-app notifications when closing the main window + * Integrate better with snapd + * Only ignore flatpak estimated progress if >10% + * Remove color stripes on categories in the Explore page + * Remove support for Shell extensions + * Remove webapp support + * Reset star rating when loading an unrated app + * Sort applications using locale based algorithms + * Stop snaps from being automatically updated + +This release also adds and updates existing translations. + +Version 3.35.2 +~~~~~~~~~~~~~~ +Released: 2019-11-25 + +This is an unstable stable release with the following changes: + * Add missing OARS content rating descriptions + * Add new plugin for restricting access to apps + * Avoid a UI crash when switching modes + * Build libmalcontent dependency on Fedora CI + * Correctly distinguish empty content ratings from missing ones + * Correctly set the application state if autoupdate is in progress + * Do not show a crazy error when installing packages + * Do not show non-applications in the installed panel + * Download Flatpak updates in the correct installation + * Expose snap channels as app alternates + * Fix a crash on 32-bit systems + * Fix langpacks autoinstall on Fedora SilverBlue + * Fix manual detach when updating removable device firmware + * Fix third party repo enabling not working + * Hide add/remove shortcut buttons for parentally filtered apps + * Improve some front page banners + * Invalidate caches when adding or removing remotes + * Make flatpak more thread-safe to fix some crashes + * Match the exact ID when refining a wildcard + * Only set the app row's buttons as destructive when they remove an app + * Remove hardcoded-featured plugin + * Remove the app folder functionality as this is now built-in to the shell + * Remove the banner editor as this is now an app on it's own + * Rework age ratings handling to avoid hard-coded list + * Set the shell extension origin correctly in all cases + * Show the channel for snaps + * Speed up the flatpak plugin in some situations + * Use plugin API to launch apps from install notification. + +This release also adds and updates existing translations. + +Version 3.34.0 +~~~~~~~~~~~~~~ +Released: 2019-09-09 + +This is a stable release with the following changes: + * Add a link to the privacy policy in the review dialog + * Add and improve many overview banners + * Add support for download scheduling using Mogwai + * Allow installing locale data automatically + * Allow snaps to be shown by AppStream ID + * Don't apply drop shadow on stock symbolic icons + * Don't install queued apps when the network changes and is metered + * Fix the 'localised in my language' kudo + * Hide addons that are not available in repos + * Localize ESRB content rating strings + * Never show the installation progress bar going backwards + * Notify the user when an application can escape the sandbox + * Refactor screenshots and hide those unavailable when offline + * Select the rating systems selected based by territory + * Use smaller default size for main window when required + +This release also adds and updates existing translations. + +Version 3.32.4 +~~~~~~~~~~~~~~ +Released: 2019-07-11 + +This is a stable release with the following changes: + * Fix an issue that led to some packages with multiple appdata files not correctly showing up on + the updates page + * Fix various problems with flatpak branch handling that were causing issues with freedesktop.org + runtime updates + * Fix flatpak update versions to correctly show up + * Various other minor bug fixes + +Version 3.32.3 +~~~~~~~~~~~~~~ +Released: 2019-05-24 + +This is a stable release with the following changes: + * Add missing XbSilo locking, hopefully fixing a large number of reported crashes + * Fix a regression that caused the fonts category to go missing + * Show a placeholder on the details page when we don't have the actual icon + * Plug a large memory leak + * Use nicer arrows for version numbers on the updates page + * Fix an issue that led to screenshots not being correctly scaled on hidpi + * flatpak: Fix several double-uses of GErrors + * flatpak: Handle failure of a libflatpak function updating permissions + * rpm-ostree: Implement what-provides decompose + +Version 3.32.2 +~~~~~~~~~~~~~~ +Released: 2019-05-07 + +This is a stable release with the following changes: + * Avoid showing a review more than once + * Correctly update progress bar when downloading packagekit distro upgrades + * Fix a crash when closing the updates dialog before the content has loaded + * Fix CTRL+F not working right in certains conditions + * Set 022 umask to make sure flatpak system helper process can read the files we've written + * rpm-ostree: Implement getting the repo list, and enabling and disabling repos + * rpm-ostree: Implement provides search + * rpm-ostree: Make layered apps not discoverable in the UI + * Various other minor bug fixes + +This release also updates translations. + +Version 3.32.1 +~~~~~~~~~~~~~~ +Released: 2019-04-15 + +This is a stable release with the following changes: + * Add drop shadows to app icons + * Various fixes to initial loading screen + * Show a generic icon instead of empty space if we failed to load the app icon + * Update featured banners for Maps and Blender + * Update featured app IDs + * Fix a crash due to missing locking + * Fix missing back button under certain conditions + * Fix loading AppSteam data from .yml.gz files + * Fix an issue that caused flatpak repo to not be correctly shown when it matched an existing + packagekit repo name + * Hide the fwupd Vendor repo in the repos dialog + +This release also updates translations. + +Version 3.32.0 +~~~~~~~~~~~~~~ +Released: 2019-03-11 + +This is the first stable release for GNOME 3.32. Notable changes compared to 3.30 include: + * Appstream parsing is completely rewritten and now uses the new libxmlb library, instead of + appstream-glib + * Improved handling for apps that are available from multiple sources, e.g. as a flatpak from + Flathub, as a flatpak from Fedora, and as an RPM package + * New source selection drop down on the details pages + * Flatpak apps now list the permissions they need on the details pages, and also show new + permissions when updating + * The flatpak backend received a large number of bug fixes + * The rpm-ostree backend has grown many new features and bug fixes, including support for + installing layered packages and doing distro upgrades + * Numerous fixes for error reporting, including making error messages more useful and avoiding + showing network errors from background operations + * The items in the app menu were all moved to the window menu + * New redesigned icon + +Version 3.31.92 +~~~~~~~~~~~~~~~ +Released: 2019-03-05 + +This is an unstable release in the 3.31 development series, marking the end of the development +cycle. Next release will be 3.32.0! + * Add two missing description strings for flatpak permissions + * Only show permissions for flatpak apps and not for e.g. fonts + * Fix flatpak permissions to correctly show up for available apps + * Hide various details page items that don't make sense when showing .flatpakrepo files + * Fix an issue that caused descriptions to sometimes not get correctly loaded + * Sort the items in the Source drop down + * Don't show error notifications for background download and refresh errors + * Fix an issue that could cause an explosion of "A restart is required" notifications + * Various flatpak plugin fixes to make it correctly match the data when multiple flatpak repos + are available + * Fix the rpm-ostree plugin to correctly convert remote dbus errors + +This release also updates translations. + +Version 3.31.90 +~~~~~~~~~~~~~~~ +Released: 2019-02-24 + +This is an unstable release in the 3.31 development series, with the following improvements: + * Fix showing the installed check mark on tiles + * Fix crashes in the packagekit plugin due to missing locking + * Add back support for appstream data in /var/{cache,lib}/app-info directories that accidentally + got left out with the libxmlb rewrite + * Update the featured banner for gnome-chess + * Fix the details page alignment when only one screenshot is shown + * Move the Update button to the right hand side on the details page + * Fix enabling repos when installing codecs through the extras page + * Remove the Sundry folder and sync the apps in the Utilities folder with gnome-menus 3.31.90 + * Improve various content rating texts + * Drop workarounds for locales with codesets + * Use the currently selected icon theme for stock icons + * Don't hide compulsory apps in the category views + * Use the SPDX-License-Identifier in all source files + * Remove various useless error prefixes, making flatpak and packagekit error messages shorter and + easier to read + * flatpak: Show the installation type (user, system) in the Source dropdown + * flatpak: Let apps control the name suffix/prefix they have and don't force (Nightly) suffix for + everything on the master branch + * flatpak: Various fixes for matching flatpaks to appstream entries + * flatpak: Distinguish between the same app coming from multiple remotes + * rpm-ostree: Correctly resolve installed appdata files to package names + * rpm-ostree: Hook up percentage progress for install and remove + * rpm-ostree: Implement layered package install + * rpm-ostree: Implement locally downloaded rpm install + * rpm-ostree: Show the source of the packages when installing layered packages + * rpm-ostree: Various fixes making things more robust + * snap: Use new media API + +This release also updates translations. + +Version 3.31.2 +~~~~~~~~~~~~~~ +Released: 2019-01-16 + +This is an unstable release in the 3.31 development series, with the following improvements: + * Show permissions for installed flatpaks, and new permissions for updates + * Use libxmlb to parse AppStream XML, making gnome-software start up faster and use less memory + * Update the app icon + * Update categories for ESRA rating system + * Improve various error messages to have more details + * Fix an issue that caused incorrect version numbers to be shown for installed flatpaks + * Fix various thread safety related crashes + * Fix row unrevealing to not leave behind 2 pixels on the updates page + * Make the refresh button to actually refresh packagekit cache + * Fix various issues that could lead to cache refresh getting stuck + * Show updates available notifications even when automatic updates are disabled + * Fix counting apps in the updates applied notification + * Improve packagekit update loading code, hopefully making it more robust + * Fix an issue that could lead to the packagekit plugin activating on rpm-ostree based systems + * Switch flatpak updates to use a single transaction, which lets us share more code (and bugs) + with the command line flatpak utility + * Fix various issues with transitioning from the "Download" state to "Restart & Update" + * Don't error out from update downloads if the ODRS server is unavailable + * Fix old updates accumulating in the OS Updates item + * Various flatpakref installation fixes + * Fix opening the details page when clicking on "Show Details" in GNOME Shell + * Fix opening shell extensions details from GNOME Tweaks + * Various fixes for initial loading state + * Add a separate "Download" step for packagekit offline updates, so that "Restart & Update" is + instant + * Fix a version comparison issue that led to package updates sometimes showing as downgrades in + the OS Updates section (this needs latest appstream-glib) + * Show the refresh button when the updates page is in the failed state + * Notify about offline updates only after they are fully downloaded + * Fix a memory corruption issue on 32-bit arches that made gnome-software very crashy + * Fix an issue with stuck back button on the details page after closing and reopening + gnome-software + * Make distro upgrades to Fedora N+2 release show up correctly + * Various flatpak plugin fixes + * Allow opening CAB files that include more than one update + * Fix critical warnings when quickly switching between category pages + * Small memory leak fixes + +This release also updates translations. + +Version 3.31.1 +~~~~~~~~~~~~~~ +Released: 2018-10-09 + +This is an unstable release in the 3.31 development series, with the following improvements: + * Icon redesign + * Switch to using window menus instead of app menu + * Add a source selection drop down to details pages + * Move the search button to the left side in the header bar + * Various other minor UI tweaks + * GtkBuilder UI file changes to pave the way for an eventual GTK4 port (please file issues for + any UI layout regressions if you notice any!) + * Various internal plugin loader fixes and cleanups + * Remove the steam plugin + * Simplify the details page loading + * Fix an issue that caused icons to not get loaded for locally installed flatpaks + * Update Fedora distro upgrades text + * Avoid a critical warning in the fwupd plugin when the device vendor is not set + * Show verified developers for snaps + +This release also updates translations. + +Version 3.30.2 +~~~~~~~~~~~~~~ +Released: 2018-10-05 + +This is a stable release with the following changes: + * Localize the polkit policy file + * Display ongoing app-installation at top of the list + * Update apps in display order + * Fix autoupdates triggering in a feedback loop + * Tweak the prefs dialog layout + * Various fixes to the flatpak plugin, making its state keeping more robust + * Fix flatpak errors to show up instead of a generic "Aborted" error + * Avoid triggering reboots for online updatable apps (flatpak) + * Make rpm-ostree updates work again + * Fix an issue that caused duplicate lines in 'OS Updates' on rpm-ostree based systems + * Compiler warning fixes + +This release also updates translations. + +Version 3.30.1 +~~~~~~~~~~~~~~ +Released: 2018-09-25 + +This is a stable release with the following changes: + * Fix an issue that caused duplicate lines in 'OS Updates' + * Filter the application restart notification to actual desktop apps + * Fix an issue that caused automatic updates to fail during download phase + * Avoid showing duplicates in the featured apps when an app is available as both flatpak and a + package + * Fix an issue that caused gnome-software to use 100% of CPU when doing automatic updates + * Lower IO priority for gnome-software so that other apps stay responsive during flatpak installs + * Various fixes and wording changes to automatic updates notifications + * Only show "Examine Disk" button when baobab is available + * Leak and correctness fixes in the snap plugin + +This release also updates translations. + +Version 3.30.0 +~~~~~~~~~~~~~~ +Released: 2018-09-04 + +This is the first stable release for GNOME 3.30. + +Version 3.29.92 +~~~~~~~~~~~~~~~ +Released: 2018-08-28 + +This is an unstable release in the 3.27 development series, with the following improvements: + * Do not go 'back' to a previous application details panel + * Don't crash if when getting the fwupd locked status + * Download updates automatically when required + * Fix dark theme support + * Hide screenshot and support widgets when no screenshots + * Ignore non-interactive generic errors + * Implement distro upgrade downloading when using rpm-ostree + * Only update the update check timestamp when it succeeds + * Open the WiFi panel when clicking the Network Settings button + * Rotate featured apps on the overview page + * Simplify the updates panel + * Use FlatpakTransaction to install, remove and update + * Use new display name for the Snap publisher + * Use the full name for the ESRB ratings descripion + +This release also updates translations. + +Version 3.29.1 +~~~~~~~~~~~~~~ +Released: 2018-03-05 + +This is an unstable release in the 3.27 development series, with the following improvements: + * Show a better notification when a local file or URI is not supported + * snap: Use ODRS for reviews + +This release also updates translations. + +Version 3.28.2 +~~~~~~~~~~~~~~ +Released: 2018-05-09 + +This is a stable release with the following changes: + * Add a warning when enabling the LVFS remote + * Show a notification when failing to open an url or a local file + * Fix multiple flatpak refreshes with new libflatpak + * Build fixes for FreeBSD + * Icon loading fixes for snap + +This release also updates translations. + +Version 3.28.1 +~~~~~~~~~~~~~~ +Released: 2018-04-09 + +This is a stable release with the following changes: + * Fix a regression with opening results from gnome-shell search + * Show "Source: " tag in gnome-shell search when we have multiple matches + * Improve unknown license tag color scheme on details page + * Don't show installed icon on app tiles while still installing + * Fix empty items appearing under OS Updates + * Fix a regression that caused duplicate results in codec search + * Fix an issue with passing username/password to packagekit proxy + * Avoid crashing during first run with no network access + * A number of rpm-ostree fixes, making it possible to trigger offline updates + * Stop searching multiple times on search page + * Update Fedora third party repositories "Find out more..." link + * Fix an issue with in-app notifications failing with invalid markup errors + * Improve purchase failure handling for the snap store + * Fix a possible crash in snap plugin when adding screenshots + * Various other crash and correctness fixes + +This release also updates translations. + +Version 3.28.0 +~~~~~~~~~~~~~~ +Released: 2018-03-12 + +This is the first stable release for GNOME 3.28, with the following improvements: + * Fix the build on NixOS + * Fix purchasing not working after authentication + * Revert a commit that led to flatpak updates failing without any feedback + * Make front page featured tile corners round to match other tiles + * Fix in-app notification close button alignment + * Several fixes to make error notifications more useful + * snap: Fix invalid metadata after cancelled refine + * snap: Launch command line snaps with 'snap run' + +This release also updates translations. + +Version 3.27.92 +~~~~~~~~~~~~~~~ +Released: 2018-03-05 + +This is an unstable release in the 3.27 development series, marking the end of the development +cycle. Next release will be 3.28.0! + * Removal of global plugin cache, simplifying gnome-software internals + * Software Repositories dialog got another batch of improvements and UI changes + * GNOME Shell Extensions repository and fwupd repositories are now shown in the Software + Repositories dialog + * Shell extensions handling through PackageKit was improved, fixing a long standing bug where we + were unable to remove shell extension packages + * Category page rewrite that landed earlier this cycle went through UI review and got a number of + fixes + * Package version comparison in the updates dialog was fixed and should no longer incorrectly + show updates as downgrades + * Distro upgrade notifications are now rate limited to once per week + * Install buttons in codec install view that got lost in the 3.22 cycle are now back + * Various paper cuts with distro upgrades were fixed + * Various fixes to installing apps from yum repos that have enabled=0 enabled_metadata=1 + * Various other correctness and warning fixes + * Distros: Minimum supported fwupd version is now 1.0.3 + * Distros: We've released PackageKit 1.1.9 that has string changes to match gnome-software 3.28 + +This release also updates translations. + +Version 3.27.90 +~~~~~~~~~~~~~~~ +Released: 2018-02-14 + +This is an unstable release in the 3.27 development series, with the following improvements: + * The Software Sources dialog was renamed to Software Repositories and rewritten + * Fedora Workstation third party repository handling was rewritten and should be more robust + * Improved handling of metered network connections, making sure we cancel any downloads when + changing to a metered connection + * Limit the number of parallel operations depending on the installed CPU + * Improved handling of pending installs when there's no network connection + * Unused ostree and rpm plugins were dropped + * Switch from GtkSpell to gspell + * Improve alignment on the updates page + * Do not show missing screenshot error for fonts that have screenshots + * Fix various issues on Ubuntu when purchasing apps + * Fix an issue that led to duplicate categories appearing on the overview page + * Various memory leak and correctness fixes + +This release also updates translations. + +Version 3.27.4 +~~~~~~~~~~~~~~ +Released: 2018-01-08 + +This is an unstable release in the 3.27 development series, with the following improvements: + * Add missing locking to gs_plugin_cache_remove(), fixing a possible crash + * Fix various memory leaks spotted by valgrind + * Fix a possible crash triggered by the fwupd plugin + * Do not emit critical warnings when reviewing OS Updates + * fwupd: Use the custom user-agent when downloading firmware + * overview page: Fix a crash when we have no featured apps + * packagekit: Implement repository enabling + * Fix hover CSS for "unknown" and "nonfree" license buttons + +This release also updates translations. + +Version 3.27.3 +~~~~~~~~~~~~~~ +Released: 2017-11-13 + +This is an unstable release in the 3.27 development series, with the following improvements: + * Fix crashes in the repos plugin due to missing locking + * Add translated strings for the new OARS v1.1 additions + * Work around Firefox deleting rpm/deb files downloaded to /tmp when closing + * Log errors to console when starting from command line + * Do not enable distro-upgrades when updates are disabled + * Do not require the user to keep clicking 'More reviews' after each click + * Fix a critical when updating (flatpak) packages live + * fwupd: Do not crash when trying to list a locked device + * fwupd: Prepend the vendor name to the device name if not included + * Improve SPDX ID parsing when working out if it is 'free' + * packagekit: Do not crash when getting an invalid ID from PackageKit + * packagekit: Support apt:// URLs + * Various fixes to the snap plugin + * Do not crash when closing the source dialog while it is loading + +This release also updates translations. + +Version 3.27.2 +~~~~~~~~~~~~~~ +Released: 2017-11-13 + +This is an unstable release in the 3.27 development series, with the following improvements: + * Redesigned category view + * Better notifications for completed distro upgrades + * Number of test suite fixes to pave way for continuous integration tests + * Improved support for running on low res displays + * Various fixes to internal state handling + * Allow linking to specified proprietary licenses + * Don't use versioned subdirectories under ~/.cache/gnome-software + * Only show in-app notifications for interactive user actions + * Various fixes for flatpak, fwupd, and snap support + +This release also updates translations. + +Version 3.26.2 +~~~~~~~~~~~~~~ +Released: 2017-11-09 + +This is a stable release with the following changes: + * Various fixes to cancellable handling, making it more robust to cancel install/remove + operations + * Fix a common crash in Fedora distro upgrades plugin + * Fix showing N+2 Fedora upgrades + * Fix flatpak updates inadvertently triggering a reboot + * Revert plugin GType registering changes that broke app "adopting" + * Various flatpak plugin fixes + * Various snap plugin fixes + * Bump fwupd required dep to 0.9.7 and support building with new 1.0.0 API + * Avoid erroring out for operations that return more than 500 results (distro upgrades, getting + gnome-shell extensions list) + * Fix a few memory leaks + +This release also updates translations. + +Version 3.26.1 +~~~~~~~~~~~~~~ +Released: 2017-10-02 + +This is a stable release with the following changes: + * Fix memory leak in "external appstream" plugin + * Don't translate an icon name in the Punjabi translation + * Fix critical warning in the fwupd plugin if the update URI isn't set + * Fix Addon categories not showing + * Fix crash in PackageKit plugin if reporting progress with no current application + * Revert a change in the snapd plugin which can cause operations to fail or hang in some + situations + +This release also updates translations. + +Version 3.26.0 +~~~~~~~~~~~~~~ +Released: 2017-09-11 + +This is the first stable release for GNOME 3.26, with the following improvements: + * Use the new fwupd API in 0.9.7 to avoid when a reboot is required + * Pass the complete proxy settings to PackageKit + +The following bugs are also fixed: + * Do not crash when emitting an uncommon error message + * Do not show a critical warning with new versions of fwupd + * Do not show an error for a remote-less flatpakref application + * Don't refine PackageKit packages after we've been cancelled + * Fix a possible crash on 32 bit systems + * Fix GNOME Shell search results for snap applications + * Properly disable shell-extensions when not running GNOME Shell + +This release also updates translations. + +Version 3.25.91 +~~~~~~~~~~~~~~~ +Released: 2017-08-21 + +This is an unstable release in the 3.25 development series, with the following improvements: + * Add a simple donation button on the details page + +The following bugs are also fixed: + * Allow plugins to say that installation cannot be cancelled + * Fix displaying the info bar for the Shell Extensions category + * Use first featured snap as the featured app + +This release also updates translations. + +Version 3.25.90 +~~~~~~~~~~~~~~~ +Released: 2017-08-07 + +This is an unstable release in the 3.25 development series, with the following improvements: + * Add a simple donation button on the details page + +The following bugs are also fixed: + * Do not crash if the child schema is invalid + * Don't log a warning when clicking the the 'more results' search entry + * Fixed subcategory names localization + * Ensure flatpak remote names are valid + * Fix critical warning with new versions of the fwupd daemon + +This release also updates translations. + +Version 3.25.4 +~~~~~~~~~~~~~~ +Released: 2017-07-21 + +This is an unstable release in the 3.25 development series, with the following improvements: + * Add new rpm-ostree integration for Fedora Atomic Workstation + * Install the Flatpak runtime as part of the application install phase + * Split OS updates up into multiple sections and show the target version + * Support compatibility IDs when getting reviews from the ODRS + +The following bugs are also fixed: + * Cancel plugin jobs if they take too much time + * Correctly find already installed flatpak runtimes + * Do not show an error for a flatpakref when broken remotes exist + * Don't show the screenshot section for runtimes + * Fix authentication prompt not showing when using snapd + * Make license buttons buttons actually look clickable + * Make the review moderator panel easier to use + * Only show snaps as sandboxed if snapd supports confinement + * Respect the per-user or per-system install preferences + * Return the correct installed state for user/system flatpak remotes + +This release also updates translations. + +Version 3.25.3 +~~~~~~~~~~~~~~ +Released: 2017-06-22 + +This is an unstable release in the 3.25 development series, with the following improvements: + * Add a banner designer utility + * Add the initial support to support purchasable apps + * Automatically install flatpak icon themes and GTK themes + * Restyle the updates panel to have a separate sections + * Show a notification in the updates page when the OS is end of life + * Show recently updated applications on the overview page + +The following bugs are also fixed: + * Add snap self tests and provide more data to the details panel + * Allow compiling with newer versions of meson + * Do not crash when sending progress reports while refreshing + * Don't trigger systemd for every single offline update + * Ensure all related flatpak applications get installed + * Ensure we use the gnome-desktop support if enabled + * Fix searching for codecs on Ubuntu + * Show a better status messages when downloading metadata + * Show a pulsing progressbar if plugins do not report progress + * Show the PackageKit interactive dialog when required + * Support updating metadata from multiple fwupd remotes + +This release also updates translations. + +Version 3.25.2 +~~~~~~~~~~~~~~ +Released: 2017-05-08 + +This is an unstable release in the 3.25 development series, with the following improvements: + * Allow AppStream to be downloaded out-of-band per-user + +The following bugs are also fixed: + * Do not initialize plugins in every instance + * Fix the 'Show Details' context menu item in GNOME Shell + * Use headerbar in toolbar-mode in Unity + * Do not allow plugins to set the origin title in the UI + +This release also updates translations. + +Version 3.25.1 +~~~~~~~~~~~~~~ +Released: 2017-04-28 + +This is an unstable release in the 3.25 development series, with the following improvements: + * Truncate the search results if there are a large number + * Use the complete source as a search keyword + +The following bugs are also fixed: + * Fall back to a stock icon for hardware drivers + * Fix a crash when removing an addon + * Fix a critical warning in the shell search provider + * Fix popular-overrides to show the correct applications + * Fix various failures to read from snapd + * Make offline updates work when online updates are available + * Never include the size of the runtime in the installed size + * Respect the install preference when for flatpakref files + * Use the developer name in preference to the project group + +This release also updates translations. + +Version 3.23.92 +~~~~~~~~~~~~~~~ +Released: 2017-03-13 + +This is an unstable release in the 3.23 development series, with the following bug fixes: + * Allow installing broken flatpakref files + * Do not reload the updates list when updates are in progress + * Reset the headerbar title when switching to the details page + * Unconditionally show things that are in progress in the Installed page + +This release also updates translations. + +Version 3.23.91 +~~~~~~~~~~~~~~~ +Released: 2017-02-27 + +This is an unstable release in the 3.23 development series, with the following improvements: + * Add support for RuntimeRepo in flatpakref files + * Allow the user to restart the currently running gnome-software instance + * Never show components without AppData files + +The following bugs are also fixed: + * Initialize progress to zero right before and after processing an action + * Animate the removal of live updates + * Add YaST as a default folder in gnome-shell overview + +This release also updates translations. + +Version 3.23.90 +~~~~~~~~~~~~~~~ +Released: 2017-02-13 + +This is an unstable release in the 3.23 development series, with the following improvements: + * Handle apt and snap URLs + * Show the updates panel with sections + * Sort the apps in the installed panel by kind + +The following bugs are also fixed: + * Add a more detailed error message when AC power is required + * Do not hardcode the gnome-software application name + * Ensure firmware is downloaded when not cached + * Fix a rather large memory leak when loading Steam data + * Fix launching Flatpak apps after updating + * Install needed Flatpak runtimes when updating an app + * Only show the scary firmware warning for removable devices + +This release also updates translations. + +Version 3.23.3 +~~~~~~~~~~~~~~ +Released: 2016-12-15 + +This is an unstable release in the 3.23 development series, with the following improvements: + * Add an --install and --interaction CLI options + * Add the installed size of the apps in the installed view + * Always set a description for each notification + * Show an in-app notification when installed plugins are changed + * Use a set of stars to show the different star ratings + +The following bugs are also fixed: + * Add a missing error check to fix a common crash on LiveDVD media + * Add thread locking in GsApp to fix some common crashes + * Allow upgrading to Fedora EOL releases + * Don't allow review actions when offline + * Ensure we actually schedule firmware updates for download + * Fix the getting of PackageKit and flatpak update details + * Hide some notifications when the new app is launched or the window is closed + * Hide the screenshot placeholder for input methods and langpacks + +This release also updates translations. + +Version 3.23.2 +~~~~~~~~~~~~~~ +Released: 2016-11-21 + +This is an unstable release in the 3.23 development series, with the following improvements: + * Add a setting for downloading updates on metered connections + * Add content rating interface for games + * Add support for pending updates that are applied on demand + * Add support for the flatpak DefaultBranch feature + * Allow showing an application review without a display name + * Convert the modal failure dialogs to in-app notifications + * Switch to using the ODRS server hosted by GNOME + +The following bugs are also fixed: + * Always get the newest screenshot for GNOME Shell extensions + * Avoid redownloading the same screenshots for different images + * Don't download updates when low on power + * Fix the growth in memory usage for every search request + * Never show a 'back' button when showing search results + * Show the search bar when the user does ctrl+f + +This release also updates translations. + +Version 3.22.2 +~~~~~~~~~~~~~~ +Released: 2016-11-07 + +This stable release fixes the following bugs: + * Large number of fixes and improvements for flatpak support + * Improved handling for flatpak repos with multiple branches + * Initial support for installing flatpakrepo files + * Fix a crash when searching for codecs + * Fix a crash when de-duplicating applications + * Speed improvements for loading appstream data + * Refactor snapd handling code using snapd-glib + * Show the search bar when the user does Ctrl+f + +This release also updates translations. + +Version 3.22.1 +~~~~~~~~~~~~~~ +Released: 2016-10-12 + +This stable release fixes the following bugs: + * Fix several issues with flatpak bundles + * Fix installing local packages + * Fix a crash when failing to get an installed flatpak ref + * Speed up loading the details and overview pages + * Switch to using the ODRS server hosted by GNOME + +This release also updates translations. + +Version 3.22.0 +~~~~~~~~~~~~~~ +Released: 2016-09-19 + +This is the first stable release for GNOME 3.22 and updates several translations. + +Version 3.21.92 +~~~~~~~~~~~~~~~ +Released: 2016-09-13 + +This is an unstable release in the 3.21 development series, with the following improvements: + * Add a new section name in the Addons category for drivers + * Add a plugin to match a hardware modalias + +The following bugs are also fixed: + * Do not hide the origin when installing or removing an app + * Do not show the screenshot fallback image for firmware or drivers + * Fix launching app's details from the installed notification + * Fix showing the source line in the installed panel + * Unbreak the GNOME Shell search provider + * Use the same padding as a GtkStackSwitcher + +This release also updates translations for many languages. + +Version 3.21.91 +~~~~~~~~~~~~~~~ +Released: 2016-08-31 + +This is an unstable release in the 3.21 development series, with the following improvements: + * Add functionality to enable non-free sources + * Show the device bootloader screenshot when required + +The following bugs are also fixed: + * Always return consistent results by allowing plugins to share a cache + * Ensure the search text is showing when going back to search results + * Only enable the firmware 'Install' button when the device is in the right mode + * Remove an app from the installed view when it's uninstalled + * Show percentage progress when installing firmware + +This release also updates translations for many languages. + +Version 3.21.90 +~~~~~~~~~~~~~~~ +Released: 2016-08-15 + +This is an unstable release in the 3.21 development series, with the following improvements: + * Limit the ODRS moderation queue to a specific language + +The following bugs are also fixed: + * Correctly load .flatpakrepo files + * Don't get the download size for installed flatpak packages + * Fix showing the progress bar when installing apps + * Never try to modify the application name + * Only notify about upgrades once per month + +This release also updates translations for many languages. + +Version 3.21.4 +~~~~~~~~~~~~~~ +Released: 2016-07-18 + +This is an unstable release in the 3.21 development series, with the following improvements: + * Add a cancel button and progress information to the details page + * Add a dialog to confirm upgrade removals + * Add support for authenticating in plugins + * Add support for snaps + * Enable gtk-doc generation for documentation + * Show a new-style category list on the overview page + * Show origin information when applications are available from multiple sources + * Show sandboxing information for selected applications + * Show the star ratings in more places + * Support installing .flatpakrepo files + * Support launching applicatins using a appstream:// URL + +The following bugs are also fixed: + * Allow plugins to be enabled and disabled at runtime + * Always show the 'MyLanguage' kudo when in en_US locale + * Correctly trigger systemd offline updates when only processing OS updates + * Disable app folders feature when run outside GNOME + * Do not show buttons on the search results + * Do not use deprecated CSS properties + * Do not use deprecated fwupd API + * Ensure reviews are shown in the correct order + * Fix a crash when double clicking files + * Fix several UX issues when upgrading + * Show the 'More Reviews' button in the details panel + * Try really hard to have two rows of important categories + +This release also updates translations for many languages. + +Version 3.21.2 +~~~~~~~~~~~~~~ +Released: 2016-05-23 + +This is an unstable release in the 3.21 development series, with the following improvements: + * Add a --details-pkg option to the gnome-software binary + * Add support for flatpak packages + * Add a plugin to auto-add some license information + * Add depends, requires and conflicts at initialize time + * Add support for application key colors + * Export a set of headers to allow external plugins to be built + +The following bugs are also fixed: + * Do not crash if plugins are badly behaved + * Do not directly load pixbufs in the AppStream plugin + * Do not unconditionally invalidate the updates list on hardware hotplug + * Find the best AppSteam component when matching any prefixes + * Fix crash due to network change before app activation + * Fix launching various KDE4 applications + * Support getting cached content from /var/cache and /usr/share + +This release also updates translations for many languages. + +Version 3.21.1 +~~~~~~~~~~~~~~ +Released: 2016-04-25 + +This is an unstable release in the 3.21 development series, with the following improvements: + * Add an initial loading panel when there is no metadata + * Add an outline ostree plugin that just adds remotes as sources + * Add an unreviewable application quirk + * Add initial Steam support + * Add support for app shortcut addition/removal + * Add support for GNOME Shell extensions + * Allow free-but-unspecified SPDX tokens + * Allow widgets to use custom CSS in a generic way + * Do the PackageKit refresh as a background transaction + * Hide "Software Sources" menu when its action is disabled + * Make the distro upgrades dialog match the new mockup + * Split the 'size' property into size-installed and size-download + * Use a link instead of a button for history + * Use AppStream files for the popular, featured and extra category data + * Use dpkg-deb info to create a GsApp when double clicking on a .deb file + * Use FwupdClient from fwupd 0.7.0 + * Use GdkPixbuf to parse icns files + * Use gsettings to enable/disable the 'sources' action + * Use the Fedora themed image for the upgrade banner + * When there are no trusted sources mark everything as non-3rd-party + +The following bugs are also fixed: + * Actually show the error dialog for an invalid file + * Allow all functions called by g_module_symbol() to fail + * Allow popular and featured apps to match any prefix + * Do not maintain a cache of applications in the plugin loader + * Do not make the ODRS plugin depend on xdg-app + * Do not re-request the distro-upgrade when switching pages + * Do not show ratings and reviews for some component kinds + * Do not show the distro-upgrade notification if the window is open + * Do not use the header bar on Unity + * Fix a crash when double clicking package files + * Fix live installing firmware + * Get the correct icon size when installing xdg-app bundles on HiDPI + * Hide the kudo details panel for non desktop components + * Load screenshots directly if their URLs point to local files + * Lower the limits for review text + * Make all the plugins more threadsafe + * Make the provenance plugin non-specific to Fedora + * Move header bar button creation into individual pages + * Move the Install & Restart button below the upgrade banner + * Never show star ratings on the category app tiles + * Only show one modal dialog at a time + * Only show the session manager restart if there were any non-live updates + * Properly support multi-line .deb descriptions + * Show a 'Install All' button when all the updates can be installed live + * Show a modal dialog when downloading the distro-upgrade failed + * Show the upgrades banner even if there are no updates to show + * Use a cache file to respect the fedora-distro-upgrades cache-age + * Use GFile instead of a filename when converting apps + +This release also updates translations for many languages. + +Version 3.19.91 +~~~~~~~~~~~~~~~ +Released: 2016-02-29 + +This is an unstable release in the 3.19 development series, with the following improvements: + * Add an 'All' subcategory in the category shell + * Add ratings and review functionality for Ubuntu + * Install the xdg-app runtime as required automatically + * Show a confirmation dialog before reporting a review + * Show a guide label for the different star values + * Support installing local xdg-app bundles + +The following bugs are also fixed: + * Correctly identify local packages with sources + * Do not add multiple search results for the same app + * Do not show xdg-app runtimes in the installed panel + * Escape markup before showing modal dialogs + +This release also updates translations for many languages. + +Version 3.19.90 +~~~~~~~~~~~~~~~ +Released: 2016-02-15 + +This is an unstable release in the 3.19 development series, with the following improvements: + * Add end-user application review functionality + * Add support for upgrading the OS from one release to another + * Add support for xdg-app and Limba bundles + * Add tags to applications, and explain them in the details page + * Update the list of featured applications on the front page + +The following bugs are also fixed: + * Add a missing tag to the software center metadata file + * PackageKit support is now optional + * Temporarily remove the remove button in the sources dialog + * Use versioned user cache directories to pick up new screenshots + +This release also updates translations for many languages. + +Version 3.19.4 +~~~~~~~~~~~~~~ +Released: 2016-01-15 + +This is an unstable release in the 3.19 development series, with the following improvements: + * Add a link to Wikipedia to explain proprietary and public domain software + * Allow administrators to override the default popular applications + * Improve the interface for device firmware updates and some can be done live + * Make sure Characters and Disks show up in Utilities + * Show 3rd party applications in the search results + * Show a nicer installation dialog when installing local files + * Speed up the application first-start and also speed up switching pages + * Try to show if an application is free software + +The following bugs are also fixed: + * Do not crash on refresh if the fwupd daemon is not available + * Fix installing web applications + * Rework several windows to fit better on small screens + * Use the correct user agent string when downloading firmware + +This release also updates translations for many languages. + +Version 3.18.3 +~~~~~~~~~~~~~~ +Released: 2015-11-05 + +This stable release fixes the following bugs: + * Use the correct user agent string when downloading firmware + * Fix a crash in the limba plugin + * Fix installing web applications + +This release also updates translations for many languages. + +Version 3.18.2 +~~~~~~~~~~~~~~ +Released: 2015-10-15 + +This stable release fixes the following bugs: + * Fix a regression that could lead to never finding any updates + * Fix an issue with getting package details for apps without AppData + +This release also updates translations for many languages. + +Version 3.18.1 +~~~~~~~~~~~~~~ +Released: 2015-10-13 + +This stable release fixes the following bugs: + * Do not force the cache refresh and delete otherwise valid packages + * Fix several potential crashes when navigating and when installing + * Get the new application icon for local packages after installation + * Improve cold start time by only parsing AppStream data once + * Make sure Characters and Disks show up in Utilities + * Only download the fwupd metadata signature once per day + * Show an empty space for no category results + * Show applications without AppData in the installed panel + +This release also updates translations for many languages. + +Version 3.18.0 +~~~~~~~~~~~~~~ +Released: 2015-09-21 + +This is the first stable release for the GNOME 3.18 desktop! + +Version 3.17.92 +~~~~~~~~~~~~~~~ +Released: 2015-09-15 + +This is an unstable release in the 3.17 development series, with the following improvements: + * Fix getting firmware updates by parsing the metadata correctly + * Make the application menu path correct in RTL locales + * Don't keep the application running forever when run as a search provider + +This release also updates translations for many languages. + +Version 3.17.91 +~~~~~~~~~~~~~~~ +Released: 2015-09-03 + +This is an unstable release in the 3.17 development series, with the following improvements: + * Better theming for the category sidebar + * Use standard size icon in the about dialog + * Support mouse back button for going back in dialogs + * Fix incorrect alignment on the front page in RTL languages + * Misc other minor bugs fixed + +This release also updates translations for many languages. + +Version 3.17.90 +~~~~~~~~~~~~~~~ +Released: 2015-08-19 + +This is an unstable release with the following bugs fixed: + * Use CSS to style the error message details + * Correctly align labels in the Add to Folder dialog + +This release also updates translations for many languages. + +Version 3.17.3 +~~~~~~~~~~~~~~ +Released: 2015-08-12 + +This is an unstable release in the 3.17 development series, with the following improvements: + * Add basic support for Limba bundles + * Automatically download new firmware metadata from LVFS + * Hide updates UI on managed systems + * Show a new notification when security updates remain unapplied + * Show installation progress when installing applications + * Use some new applications to the picked category + +Bugs fixed in this release: + * Do not show applications that are not available when searching by category + * Don't crash when launching an app that has no desktop ID + * Don't show applications without AppData in the category view + * Fix a possible race and crash when loading icons + * Fix locking in the AppStream code to fix several crashes + * Use better error messages on offline update failure + * Withdraw the notification when prepared update gets invalidated + +This release also updates translations for many languages. + +Version 3.17.2 +~~~~~~~~~~~~~~ +Released: 2015-06-05 + +This is an unstable release in the 3.17 development series, with the following improvements: + * Make fwupd dependency automagic + +Bugs fixed in this release: + * Fix a regression from the previous unstable release that made it impossible to install updates + * Fix a crash in the screenshot loader + * Fix a crash in the sources dialog + * Fix a crash when installing rpms that lack description + * Wrap long descriptions in the update dialog + +This release also updates translations for many languages. + +Version 3.17.1 +~~~~~~~~~~~~~~ +Released: 2015-05-25 + +This is the first unstable release in the 3.17 development series, with a number of new features: + * Support getting firmware updates through the fwupd daemon + * Use a smaller number of tiles on the front page on small monitors + * Rework internal modulesets, making it easier to edit the list of featured apps + * Revert back to using a hand-picked list of featured apps + * Several improvements to the sources dialog + * Show better human readable names when searching for font scripts + * Show a spinner while loading the data for the update history dialog + +This release also updates translations for many languages. + +Version 3.16.2 +~~~~~~~~~~~~~~ +Released: 2015-05-11 + +This release fixes the following bugs: + * Remove redundant OK button from the updates installed notification + * Display a better human readable title for printer drivers + * Show a better UI for offline update failure dialog + * Set default actions for the update done notifications + * Allow searching for packages via the API without appdata + * Fix showing webapps with non-local icons + +This release also updates translations for many languages. + +Version 3.16.1 +~~~~~~~~~~~~~~ +Released: 2015-04-14 + +This release fixes the following bugs: + * Correctly save HiDPI images to HiDPI directories + * Scroll the contents of the error message dialog + +This release also updates translations for many languages. + +Version 3.16.0 +~~~~~~~~~~~~~~ +Released: 2015-03-23 + +This stable release marks the release of GNOME 3.16! + +Version 3.15.92 +~~~~~~~~~~~~~~~ +Released: 2015-03-16 + +This unstable release adds the following features: + * React to theme changes + * Rebase the HighContrast theme + +This release fixes the following bug: + * Fix HiDPI scale factor calculation + * Align section headings in all views + * Fix 'installed' overlays when using the HighContrast theme + * Fall back to showing the top level category when no sub category exists + * Fix a crash when using the pending applications feature + +This release also updates translations for many languages. + +Version 3.15.91 +~~~~~~~~~~~~~~~ +Released: 2015-03-02 + +This unstable release adds the following features: + * Enable kinetic scrolling in updates dialog + +This release fixes the following bug: + * Always ensure that the back entry focus widget is valid + * Don't show small screenshots on HiDPI hardware + * Fix a crash when starting GNOME Software for the first time + * Only show compatible projects when getting the featured list + +Version 3.15.90 +~~~~~~~~~~~~~~~ +Released: 2015-02-16 + +This unstable release adds the following features: + * Add a new panel for displaying session service results + * Add a new version of the Modify interface + * Require AppData for all available packages + +This release fixes the following bug: + * Use the new mockups for the 3rd party source install dialogs + +Version 3.15.4 +~~~~~~~~~~~~~~ +Released: 2015-01-19 + +This unstable release adds the following features: + * Fix searching with very small search terms + +This release fixes the following bugs: + * Do case-insensitive searching of suitable keywords + * Fix a crash in the screenshot loader + * Fix a crash when clicking the back button + * Fix searching for keyworks with special chars + * Show an error message when we fail to load details about a local file + +Version 3.15.2 +~~~~~~~~~~~~~~ +Released: 2014-11-24 + +This unstable release adds the following features: + * Show a blurred low-resolution screenshot while loading the HiDPI one + +This release fixes the following bugs: + * Do not show a random white line above the star rating widget + * Do not show empty app boxes if no popular results are available + * Do not try to download local web-app icons + * Use blue stars for the user-ratings rather than gold diff --git a/README.md b/README.md new file mode 100644 index 0000000..59eefbd --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +[![Build Status](https://gitlab.gnome.org/GNOME/gnome-software/badges/main/pipeline.svg)](https://gitlab.gnome.org/GNOME/gnome-software/pipelines) + +# Software + +[Software](https://apps.gnome.org/Software) allows users to easily find, +discover and install apps. It also keeps their OS, apps and devices up to date +without them having to think about it, and gives them confidence that their +system is up to date. It supports popular distributions, subject to those +distributions maintaining their own distro-specific integration code. + +The specific use cases that Software covers are [documented in more detail](./doc/use-cases.md). + +# Features + +A plugin system is used to access software from different sources. +Plugins are provided for: + - Traditional package installation via PackageKit (e.g. Debian package, RPM). + - Next generation packages: [Flatpak](https://flatpak.org/) and [Snap](https://snapcraft.io/). + - Firmware updates. + - Ratings and reviews using [ODRS](https://odrs.gnome.org/). + +Software supports showing metadata that closely matches the [AppStream](https://www.freedesktop.org/wiki/Distributions/AppStream/) format. + +Software runs as a background service to provide update notifications and be a search provider for [GNOME Shell](https://gitlab.gnome.org/GNOME/gnome-shell/). + +# Contact + +For questions about how to use Software, ask on [Discourse](https://discourse.gnome.org/tag/gnome-software). + +Bug reports and merge requests should be filed on [GNOME GitLab](https://gitlab.gnome.org/GNOME/gnome-software). + +For development discussion, join us on `#gnome-software:gnome.org` on [Matrix](https://matrix.to/#/#gnome-software:gnome.org). + +# Documentation for app developers and vendors + +Specific documentation is available for app developers who wish to test +how their apps appear in GNOME Software; and for distribution vendors +who wish to customise how GNOME Software appears in their distribution: + * [Tools in GNOME Software for app developers](./doc/app-developers.md) + * [Vendor customisation of GNOME Software](./doc/vendor-customisation.md) + +# Running a nightly build + +A [flatpak bundle](https://docs.flatpak.org/en/latest/single-file-bundles.html) +of Software can be built on demand here by running the ‘flatpak bundle’ CI job. +It is not fully functional, but is useful for development and testing of +upcoming UI changes to Software. It may become more functional over time. It +is not an official or supported release. + +The CI job saves the bundle in its artifacts list as `gnome-software-dev.flatpak`. +This can be installed and run locally by downloading it and running: +``` +$ flatpak install --bundle ./gnome-software-dev.flatpak +$ flatpak run org.gnome.SoftwareDevel +``` + +# Building locally + +Software uses a number of plugins and depending on your operating system you +may want to disable or enable certain ones. For example on Fedora Silverblue +you'd want to disable the packagekit plugin as it wouldn't work. See the list +in `meson_options.txt` and use e.g. `-Dpackagekit=false` in the `meson` command +below. + +Build locally with: +``` +$ meson --prefix $PWD/install build/ +$ ninja -C build/ all install +$ killall gnome-software +# On Fedora, RHEL, etc: +$ XDG_DATA_DIRS=install/share:$XDG_DATA_DIRS LD_LIBRARY_PATH=install/lib64/:$LD_LIBRARY_PATH ./install/bin/gnome-software +# On Debian, Ubuntu, etc: +$ XDG_DATA_DIRS=install/share:$XDG_DATA_DIRS LD_LIBRARY_PATH=install/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH ./install/bin/gnome-software +``` + +# Debugging + +See [the debugging documentation](./doc/debugging.md). + +# Maintainers + +Software is maintained by several co-maintainers, as listed in `gnome-software.doap`. +All changes to Software need to be reviewed by at least one co-maintainer (who +can’t review their own changes). Larger decisions need input from at least two +co-maintainers. diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000..f3d796d --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,107 @@ +GNOME Software Release Notes +=== + +Release schedule +--- + +GNOME Software releases are done on the timetable set by the [GNOME release schedule](https://release.gnome.org/calendar/). + +Maintainers take it in turns to make releases so that the load is spread out evenly. + +Making a release +--- + +Adapted from the [GNOME release process](https://handbook.gnome.org/maintainers/making-a-release.html). + +These instructions use the following variables: + - `new_version`: the version number of the release you are making, for example 3.38.1 + - `previous_version`: the version number of the most-recently released version in the same release series, for example 3.38.0 + - `branch`: the branch which the release is based on, for example gnome-40 or main + - `key_id`: the ID of your GPG key, see the output of `gpg --list-keys` and the note at the end of this file + +Go to https://gitlab.gnome.org/GNOME/gnome-software/-/milestones/ and +choose the corresponding milestone. Verify all issues and merge requests +tagged for this release are complete now. Move those which not to the next +milestone or merge pending fixes when possible. + +Make sure your repository is up to date and doesn’t contain local changes: +``` +git pull +git status +``` + +Check the version in `meson.build` is correct for this release. + +Download +[gitlab-changelog](https://gitlab.gnome.org/pwithnall/gitlab-changelog) and use +it to write release entries: +``` +gitlab-changelog.py GNOME/gnome-software ${previous_version}.. +``` + +Edit this down to just the user visible changes, and list them in +`data/metainfo/org.gnome.Software.metainfo.xml.in`. User visible changes are ones +which the average user might be interested to know about, such as a fix for an +impactful bug, a UI change, or a feature change. + +You can get review of your metainfo changes from other co-maintainers if you wish. + +Generate `NEWS` file: +``` +appstreamcli metainfo-to-news ./data/metainfo/org.gnome.Software.metainfo.xml.in ./NEWS +``` + +Commit the release: +``` +git add -p +git commit -S -m "Release version ${new_version}" +``` + +Tag, sign and push the release (see below for information about `git evtag`): +``` +git evtag sign -u ${key_id} ${new_version} +git push --atomic origin ${branch} ${new_version} +``` +To use a specific key add an option `-u ${keyid|email}` after the `sign` argument. + +Use `Tag ${new_version} release` as the tag message. + +The release archive will now be built in CI and automatically uploaded to +download.gnome.org using the +[release service](https://gitlab.gnome.org/Infrastructure/openshift-images/gnome-release-service). + +Post release version bump in `meson.build`: +``` +# edit meson.build, then +git commit -a -m "trivial: Post release version bump" +git push +``` + +Add the release notes to GitLab and close the milestone: + - Go to https://gitlab.gnome.org/GNOME/gnome-software/-/releases/${new_version}/edit + - set the Milestone of the release, if such exists + - copy the Release notes for the new release from the `NEWS` file, overwriting + the description from the git tag + (replace `~~~~~~~~~~~~` with `===` (only three `=`)) + - in the Links section add: + | URL | Link title | Type | + | ------ | ------ | ------ | + | `https://download.gnome.org/sources/gnome-software/${new_major_version}/gnome-software-${new_version}.tar.xz` | Release tarball | Other | + | `https://download.gnome.org/sources/gnome-software/${new_major_version}/gnome-software-${new_version}.sha256sum` | Release tarball sha256sum | Other | + - save the changes with `Save changes` button + - verify the added links for the release artifacts work + - Go to https://gitlab.gnome.org/GNOME/gnome-software/-/milestones/ + choose the milestone and close it + +`git-evtag` +--- + +Releases should be done with `git evtag` rather than `git tag`, as it provides +stronger security guarantees. See +[its documentation](https://github.com/cgwalters/git-evtag) for more details. +In particular, it calculates its checksum over all blobs reachable from the tag, +including submodules; and uses a stronger checksum than SHA-1. + +You will need a GPG key for this, ideally which has been signed by others so +that it can be verified as being yours. However, even if your GPG key is +unsigned, using `git evtag` is still beneficial over using `git tag`. diff --git a/build-aux/fuse-2.9.2-closefrom.patch b/build-aux/fuse-2.9.2-closefrom.patch new file mode 100644 index 0000000..a7ae30f --- /dev/null +++ b/build-aux/fuse-2.9.2-closefrom.patch @@ -0,0 +1,24 @@ +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: 2017 Christian Hergert +Reference: https://gitlab.gnome.org/GNOME/gnome-builder/-/blob/main/build-aux/flatpak/fuse-2.9.2-closefrom.patch?ref_type=heads + +--- fuse-2.9.2/util/ulockmgr_server.c.closefromfix 2019-01-04 05:33:33.000000000 -0800 ++++ fuse-2.9.2/util/ulockmgr_server.c 2022-07-12 12:29:56.445402244 -0700 +@@ -124,7 +124,7 @@ + return res; + } + +-static int closefrom(int minfd) ++static int _closefrom(int minfd) + { + DIR *dir = opendir("/proc/self/fd"); + if (dir) { +@@ -384,7 +384,7 @@ + dup2(nullfd, 1); + } + close(3); +- closefrom(5); ++ _closefrom(5); + while (1) { + char c; + int sock; diff --git a/build-aux/fuse-2.9.2-namespace-conflict-fix.patch b/build-aux/fuse-2.9.2-namespace-conflict-fix.patch new file mode 100644 index 0000000..e204114 --- /dev/null +++ b/build-aux/fuse-2.9.2-namespace-conflict-fix.patch @@ -0,0 +1,25 @@ +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: 2017 Christian Hergert +Reference: https://gitlab.gnome.org/GNOME/gnome-builder/-/blob/main/build-aux/flatpak/fuse-2.9.2-namespace-conflict-fix.patch?ref_type=heads + +diff -up fuse-2.9.2/include/fuse_kernel.h.conflictfix fuse-2.9.2/include/fuse_kernel.h +--- fuse-2.9.2/include/fuse_kernel.h.conflictfix 2013-06-26 09:31:57.862198038 -0400 ++++ fuse-2.9.2/include/fuse_kernel.h 2013-06-26 09:32:19.679198365 -0400 +@@ -88,12 +88,16 @@ + #ifndef _LINUX_FUSE_H + #define _LINUX_FUSE_H + +-#include ++#ifdef __linux__ ++#include ++#else ++#include + #define __u64 uint64_t + #define __s64 int64_t + #define __u32 uint32_t + #define __s32 int32_t + #define __u16 uint16_t ++#endif + + /* + * Version negotiation: diff --git a/build-aux/fuse-disable-sys-mount-under-flatpak.patch b/build-aux/fuse-disable-sys-mount-under-flatpak.patch new file mode 100644 index 0000000..cf5ef15 --- /dev/null +++ b/build-aux/fuse-disable-sys-mount-under-flatpak.patch @@ -0,0 +1,30 @@ +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: 2018 Christian Hergert +Reference: https://gitlab.gnome.org/GNOME/gnome-builder/-/blob/main/build-aux/flatpak/fuse-disable-sys-mount-under-flatpak.patch?ref_type=heads + +From 1ec935f4abecd08957affc7b21bae6bf5be78931 Mon Sep 17 00:00:00 2001 +From: Christian Hergert +Date: Thu, 12 Apr 2018 01:47:57 -0700 +Subject: [PATCH] libfuse: disable sys mount under flatpak + +--- + lib/mount.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/mount.c b/lib/mount.c +index 7a18c11..1667db2 100644 +--- a/lib/mount.c ++++ b/lib/mount.c +@@ -392,6 +392,9 @@ static int fuse_mount_sys(const char *mnt, struct mount_opts *mo, + int fd; + int res; + ++ /* disable in flatpak */ ++ return -2; ++ + if (!mnt) { + fprintf(stderr, "fuse: missing mountpoint parameter\n"); + return -1; +-- +2.17.0.rc2 + diff --git a/build-aux/fusermount-wrapper.sh b/build-aux/fusermount-wrapper.sh new file mode 100644 index 0000000..aaa96ec --- /dev/null +++ b/build-aux/fusermount-wrapper.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2020 Christian Hergert +# Reference: https://gitlab.gnome.org/GNOME/gnome-builder/-/blob/main/build-aux/flatpak/fusermount-wrapper.sh?ref_type=heads + +if [ -z "$_FUSE_COMMFD" ]; then + FD_ARGS= +else + FD_ARGS="--env=_FUSE_COMMFD=${_FUSE_COMMFD} --forward-fd=${_FUSE_COMMFD}" +fi + +exec flatpak-spawn --host --forward-fd=1 --forward-fd=2 --forward-fd=3 $FD_ARGS fusermount "$@" diff --git a/build-aux/org.gnome.Software.Devel.json b/build-aux/org.gnome.Software.Devel.json new file mode 100644 index 0000000..88010a3 --- /dev/null +++ b/build-aux/org.gnome.Software.Devel.json @@ -0,0 +1,264 @@ +{ + "app-id": "org.gnome.Software.Devel", + "runtime": "org.gnome.Platform", + "runtime-version": "master", + "sdk": "org.gnome.Sdk", + "command": "gnome-software", + "tags": [ + "devel", + "development", + "nightly" + ], + "finish-args": [ + "--device=dri", + "--share=ipc", + "--socket=x11", + "--socket=wayland", + "--socket=session-bus", + "--socket=system-bus", + "--filesystem=host", + "--share=network", + "--filesystem=xdg-run/dconf", + "--filesystem=~/.config/dconf:ro", + "--talk-name=ca.desrt.dconf", + "--env=DCONF_USER_CONFIG_DIR=.config/dconf", + "--filesystem=/var/lib/flatpak", + "--env=FLATPAK_SYSTEM_DIR=/var/lib/flatpak", + "--filesystem=xdg-data/flatpak", + "--filesystem=/usr/share/metainfo:ro", + "--filesystem=/usr/share/swcatalog:ro", + "--filesystem=/usr/share/appdata:ro", + "--filesystem=/usr/share/app-info:ro", + "--filesystem=/var/lib/swcatalog:ro", + "--filesystem=/var/lib/app-info:ro", + "--filesystem=/var/cache/swcatalog:ro", + "--filesystem=/var/cache/app-info:ro" + ], + "build-options" : { + "env" : { + "MOUNT_FUSE_PATH" : "../tmp/" + } + }, + "modules": [ + { + "name": "libyaml", + "buildsystem": "autotools", + "builddir": true, + "config-opts": [ + "--libdir=/app/lib" + ], + "sources": [ + { + "type": "git", + "url": "https://github.com/yaml/libyaml" + } + ] + }, + { + "name": "lmdb", + "buildsystem": "simple", + "subdir": "libraries/liblmdb", + "build-commands": [ + "make install prefix=/ DESTDIR=/app" + ], + "sources": [ + { + "type": "git", + "url": "https://git.openldap.org/openldap/openldap.git" + } + ] + }, + { + "name": "libxmlb", + "buildsystem": "meson", + "config-opts": [ + "-Dgtkdoc=false" + ], + "sources": [ + { + "type": "git", + "url": "https://github.com/hughsie/libxmlb.git", + "branch": "main" + } + ] + }, + { + "name": "appstream", + "buildsystem": "meson", + "config-opts": [ + "-Dstemming=false", + "-Dapidocs=false" + ], + "sources": [ + { + "type": "git", + "url": "https://github.com/ximion/appstream.git", + "tag": "v1.0.4", + "commit": "ed3be6df027cbd5f9932f3569c5948e80ea19371" + } + ] + }, + { + "name": "intltool", + "buildsystem": "autotools", + "sources": [ + { + "type": "archive", + "url": "https://download.gnome.org/sources/intltool/0.40/intltool-0.40.6.tar.bz2", + "sha256": "4d1e5f8561f09c958e303d4faa885079a5e173a61d28437d0013ff5efc9e3b64" + } + ] + }, + { + "name" : "libfuse", + "config-opts" : [ + "UDEV_RULES_PATH=/app/etc/udev/rules.d", + "INIT_D_PATH=/app/etc/init.d" + ], + "cleanup" : [ + "/bin/ulockmgr_server" + ], + "post-install" : [ + "install -m a+rx fusermount-wrapper.sh /app/bin/fusermount" + ], + "sources" : [ + { + "type" : "archive", + "url" : "https://github.com/libfuse/libfuse/releases/download/fuse-2.9.9/fuse-2.9.9.tar.gz", + "sha256" : "d0e69d5d608cc22ff4843791ad097f554dd32540ddc9bed7638cc6fea7c1b4b5" + }, + { + "type" : "patch", + "path" : "fuse-2.9.2-namespace-conflict-fix.patch" + }, + { + "type" : "patch", + "path" : "fuse-disable-sys-mount-under-flatpak.patch" + }, + { + "type" : "patch", + "path" : "fuse-2.9.2-closefrom.patch" + }, + { + "type" : "file", + "path" : "fusermount-wrapper.sh" + } + ] + }, + { + "name": "ostree", + "buildsystem": "autotools", + "config-opts": [ + "--disable-rofiles-fuse" + ], + "sources": [ + { + "type": "git", + "url": "https://github.com/ostreedev/ostree.git", + "branch": "main" + } + ] + }, + { + "name": "pyparsing", + "buildsystem": "simple", + "build-commands": [ + "pip3 install --prefix=/app --no-deps ./pyparsing-*.whl" + ], + "sources": [ + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/8a/bb/488841f56197b13700afd5658fc279a2025a39e22449b7cf29864669b15d/pyparsing-2.4.7-py2.py3-none-any.whl", + "sha256": "ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + } + ] + }, + { + "name" : "libstemmer", + "buildsystem" : "cmake-ninja", + "config-opts" : [ + "-DCMAKE_BUILD_TYPE=RelWithDebInfo", + "-DCMAKE_INSTALL_LIBDIR:PATH=/app/lib" + ], + "sources" : [ + { + "type" : "git", + "url" : "https://github.com/zvelo/libstemmer", + "branch" : "master" + } + ] + }, + { + "name" : "flatpak", + "buildsystem" : "meson", + "config-opts" : [ + "-Ddocbook_docs=disabled", + "-Dseccomp=disabled", + "-Dsandboxed_triggers=false", + "-Dsystem_helper=disabled", + "-Dsystem_install_dir=/var/lib/flatpak", + "--sysconfdir=/var/run/host/etc", + "-Dman=disabled", + "-Dhttp_backend=curl", + "-Dsystemd=disabled", + "-Dtests=false" + ], + "cleanup" : [ + "/bin/flatpak-bisect", + "/bin/flatpak-coredumpctl", + "/etc/profile.d", + "/lib/systemd", + "/share/dbus-1/interfaces/org.freedesktop.*", + "/share/dbus-1/services/org.freedesktop.*", + "/share/flatpak/triggers", + "/share/gdm", + "/share/zsh" + ], + "post-install" : [ + "cp /usr/bin/update-mime-database /app/bin", + "cp /usr/bin/update-desktop-database /app/bin" + ], + "sources" : [ + { + "type" : "git", + "url" : "https://github.com/flatpak/flatpak.git", + "tag" : "1.15.6" + } + ] + }, + { + "name": "libglib-testing", + "buildsystem": "meson", + "sources": [ + { + "type": "git", + "url": "https://gitlab.gnome.org/pwithnall/libglib-testing.git", + "tag": "0.1.1" + } + ] + }, + { + "buildsystem": "meson", + "builddir": true, + "name": "gnome-software", + "config-opts": [ + "--libdir=/app/lib", + "-Dpackagekit=false", + "-Dpackagekit_autoremove=false", + "-Dpolkit=false", + "-Dfwupd=false", + "-Dflatpak=true", + "-Dmalcontent=false", + "-Dgudev=false", + "-Dgtk_doc=false", + "-Dprofile=Devel" + ], + "sources": [ + { + "type": "dir", + "path": "../" + } + ] + } + ] +} diff --git a/build-aux/org.gnome.Software.Devel.json.license b/build-aux/org.gnome.Software.Devel.json.license new file mode 100644 index 0000000..edb83cb --- /dev/null +++ b/build-aux/org.gnome.Software.Devel.json.license @@ -0,0 +1,2 @@ +SPDX-License-Identifier: GPL-2.0-or-later +SPDX-FileCopyrightText: 2021 GNOME Foundation, Inc. \ No newline at end of file diff --git a/contrib/deployment-featured.ini b/contrib/deployment-featured.ini new file mode 100644 index 0000000..3134130 --- /dev/null +++ b/contrib/deployment-featured.ini @@ -0,0 +1,4 @@ +[Deployment Featured Apps] +Selector=foocorp +Title=Featured by Foo Corp. +Title[it]=Presentato da Foo Corp. diff --git a/contrib/gnome-software.spec.in b/contrib/gnome-software.spec.in new file mode 100644 index 0000000..90c8f5a --- /dev/null +++ b/contrib/gnome-software.spec.in @@ -0,0 +1,189 @@ +%global glib2_version 2.61.1 +%global gtk3_version 3.22.4 +%global json_glib_version 1.6.0 +%global packagekit_version 1.1.1 +%global appstream_version 0.14.0 +%global libsoup_version 2.52.0 +%global gsettings_desktop_schemas_version 3.12.0 +%global fwupd_version 1.2.10 +%global flatpak_version 1.1.3 +%global libxmlb_version 0.1.7 + +%define alphatag #ALPHATAG# + +Name: gnome-software +Version: #VERSION# +Release: 0.#BUILD#%{?alphatag}%{?dist} +Summary: A software center for GNOME + +License: GPLv2+ +URL: https://apps.gnome.org/Software +Source0: https://download.gnome.org/sources/gnome-software/3.34/%{name}-%{version}.tar.xz + +BuildRequires: gcc +BuildRequires: gettext +BuildRequires: libxslt +BuildRequires: docbook-style-xsl +BuildRequires: desktop-file-utils +BuildRequires: fwupd-devel >= %{fwupd_version} +BuildRequires: glib2-devel >= %{glib2_version} +BuildRequires: gsettings-desktop-schemas-devel >= %{gsettings_desktop_schemas_version} +BuildRequires: gtk3-devel >= %{gtk3_version} +BuildRequires: gtk-doc +BuildRequires: json-glib-devel >= %{json_glib_version} +BuildRequires: libappstream-devel >= %{appstream_version} +BuildRequires: libsoup-devel +BuildRequires: libxmlb-devel >= %{libxmlb_version} +BuildRequires: meson +BuildRequires: PackageKit-glib-devel >= %{packagekit_version} +BuildRequires: polkit-devel +BuildRequires: flatpak-devel >= %{flatpak_version} +BuildRequires: ostree-devel +BuildRequires: rpm-devel +BuildRequires: rpm-ostree-devel +BuildRequires: libgudev1-devel + +Requires: appstream-data +Requires: flatpak%{?_isa} >= %{flatpak_version} +Requires: flatpak-libs%{?_isa} >= %{flatpak_version} +Requires: fwupd%{?_isa} >= %{fwupd_version} +Requires: glib2%{?_isa} >= %{glib2_version} +# gnome-menus is needed for app folder .directory entries +Requires: gnome-menus%{?_isa} +Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version} +Requires: gtk3%{?_isa} >= %{gtk3_version} +Requires: json-glib%{?_isa} >= %{json_glib_version} +Requires: iso-codes +Requires: libappstream%{?_isa} >= %{appstream_version} +# librsvg2 is needed for gdk-pixbuf svg loader +Requires: librsvg2%{?_isa} +Requires: libsoup%{?_isa} >= %{libsoup_version} +Requires: libxmlb%{?_isa} >= %{libxmlb_version} + +Recommends: PackageKit%{?_isa} >= %{packagekit_version} + +Obsoletes: gnome-software-snap < 3.33.1 +Obsoletes: gnome-software-editor < 3.35.1 + +# this is not a library version +%define gs_plugin_version 16 +%define gs_plugin_dir %{_libdir}/gnome-software/plugins-%{gs_plugin_version} + +%description +gnome-software is an app that makes it easy to add, remove +and update software in the GNOME desktop. + +%package devel +Summary: Headers for building external gnome-software plugins +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +These development files are for building gnome-software plugins outside +the source tree. Most users do not need this subpackage installed. + +%package rpm-ostree +Summary: rpm-ostree backend for gnome-software +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: rpm-ostree%{?_isa} +Supplements: (gnome-software%{?_isa} and rpm-ostree%{?_isa}) + +%description rpm-ostree +gnome-software is an app that makes it easy to add, remove +and update software in the GNOME desktop. + +This package includes the rpm-ostree backend. + +%prep +%autosetup -p1 + +%build +%meson \ + -Dsnap=false \ + -Dgudev=true \ + -Dpackagekit=true \ + -Dexternal_appstream=false \ + -Drpm_ostree=true \ + -Dtests=false +%meson_build + +%install +%meson_install + +# remove unneeded dpkg plugin +rm %{buildroot}%{gs_plugin_dir}/libgs_plugin_dpkg.so + +# make the software center load faster +desktop-file-edit %{buildroot}%{_datadir}/applications/org.gnome.Software.desktop \ + --set-key=X-AppInstall-Package --set-value=%{name} + +# set up for Fedora +cat >> %{buildroot}%{_datadir}/glib-2.0/schemas/org.gnome.software-fedora.gschema.override << FOE +[org.gnome.software] +official-repos = [ 'anaconda', 'fedora', 'fedora-debuginfo', 'fedora-source', 'koji-override-0', 'koji-override-1', 'rawhide', 'rawhide-debuginfo', 'rawhide-source', 'updates', 'updates-debuginfo', 'updates-source', 'updates-testing', 'updates-testing-debuginfo', 'updates-testing-source', 'fedora-modular', 'fedora-modular-debuginfo', 'fedora-modular-source', 'rawhide-modular', 'rawhide-modular-debuginfo', 'rawhide-modular-source' ] +FOE + +%find_lang %name --with-gnome + +%check +desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop + +%files -f %{name}.lang +%doc AUTHORS README.md +%license COPYING +%{_bindir}/gnome-software +%{_datadir}/applications/gnome-software-local-file-flatpak.desktop +%{_datadir}/applications/gnome-software-local-file-fwupd.desktop +%{_datadir}/applications/gnome-software-local-file-packagekit.desktop +%{_datadir}/applications/org.gnome.Software.desktop +%dir %{_datadir}/gnome-software +%{_datadir}/gnome-software/*.png +%{_mandir}/man1/gnome-software.1.gz +%{_datadir}/icons/hicolor/*/apps/org.gnome.Software.svg +%{_datadir}/icons/hicolor/symbolic/apps/org.gnome.Software-symbolic.svg +%{_datadir}/gnome-software/featured-*.svg +%{_datadir}/gnome-software/featured-*.jpg +%{_datadir}/metainfo/org.gnome.Software.metainfo.xml +%{_datadir}/metainfo/org.gnome.Software.Plugin.Epiphany.metainfo.xml +%{_datadir}/metainfo/org.gnome.Software.Plugin.Flatpak.metainfo.xml +%{_datadir}/metainfo/org.gnome.Software.Plugin.Fwupd.metainfo.xml +%dir %{gs_plugin_dir} +%{gs_plugin_dir}/libgs_plugin_appstream.so +%{gs_plugin_dir}/libgs_plugin_dummy.so +%{gs_plugin_dir}/libgs_plugin_epiphany.so +%{gs_plugin_dir}/libgs_plugin_fedora-langpacks.so +%{gs_plugin_dir}/libgs_plugin_fedora-pkgdb-collections.so +%{gs_plugin_dir}/libgs_plugin_flatpak.so +%{gs_plugin_dir}/libgs_plugin_fwupd.so +%{gs_plugin_dir}/libgs_plugin_generic-updates.so +%{gs_plugin_dir}/libgs_plugin_hardcoded-blocklist.so +%{gs_plugin_dir}/libgs_plugin_icons.so +%{gs_plugin_dir}/libgs_plugin_modalias.so +%{gs_plugin_dir}/libgs_plugin_os-release.so +%{gs_plugin_dir}/libgs_plugin_packagekit.so +%{gs_plugin_dir}/libgs_plugin_provenance-license.so +%{gs_plugin_dir}/libgs_plugin_provenance.so +%{gs_plugin_dir}/libgs_plugin_repos.so +%{gs_plugin_dir}/libgs_plugin_rewrite-resource.so +%{_sysconfdir}/xdg/autostart/org.gnome.Software.desktop +%{_datadir}/app-info/xmls/org.gnome.Software.Featured.xml +%{_datadir}/dbus-1/services/org.freedesktop.PackageKit.service +%{_datadir}/dbus-1/services/org.gnome.Software.service +%{_datadir}/gnome-shell/search-providers/org.gnome.Software-search-provider.ini +%{_datadir}/glib-2.0/schemas/org.gnome.software.gschema.xml +%{_datadir}/glib-2.0/schemas/org.gnome.software-fedora.gschema.override +%{_libexecdir}/gnome-software-cmd +%{_libexecdir}/gnome-software-restarter + +%files rpm-ostree +%{gs_plugin_dir}/libgs_plugin_rpm-ostree.so + +%files devel +%{_libdir}/pkgconfig/gnome-software.pc +%dir %{_includedir}/gnome-software +%{_includedir}/gnome-software/*.h +%{_datadir}/gtk-doc/html/gnome-software + +%changelog +* #LONGDATE# Richard Hughes #VERSION#-0.#BUILD##ALPHATAG# +- Update from GIT + diff --git a/contrib/org.gnome.Software.DeploymentFeatured.xml b/contrib/org.gnome.Software.DeploymentFeatured.xml new file mode 100644 index 0000000..520f19a --- /dev/null +++ b/contrib/org.gnome.Software.DeploymentFeatured.xml @@ -0,0 +1,11 @@ + + + + + org.gnome.Software.desktop + + foocorp + + + diff --git a/data/assets/meson.build b/data/assets/meson.build new file mode 100644 index 0000000..ca2cfa1 --- /dev/null +++ b/data/assets/meson.build @@ -0,0 +1,11 @@ +if get_option('default_featured_apps') + install_data('org.gnome.Software.Featured.xml', + install_dir : join_paths(get_option('datadir'), 'swcatalog', 'xml'), + ) +endif + +if get_option('hardcoded_curated') + install_data('org.gnome.Software.Curated.xml', + install_dir : join_paths(get_option('datadir'), 'swcatalog', 'xml'), + ) +endif diff --git a/data/assets/org.gnome.Software.Curated.xml b/data/assets/org.gnome.Software.Curated.xml new file mode 100644 index 0000000..4dc828c --- /dev/null +++ b/data/assets/org.gnome.Software.Curated.xml @@ -0,0 +1,121 @@ + + + + + org.gnome.Aisleriot + + GnomeSoftware::popular + + + + org.gnome.Boxes.desktop + + GnomeSoftware::popular + + + + org.gnome.Builder.desktop + + GnomeSoftware::popular + + + + org.gnome.Calendar.desktop + + GnomeSoftware::popular + + + + org.gnome.clocks.desktop + + GnomeSoftware::popular + + + + org.gnome.Contacts.desktop + + GnomeSoftware::popular + + + + org.gnome.Dictionary + + GnomeSoftware::popular + + + + org.gnome.Evince + + GnomeSoftware::popular + + + + org.gnome.Evolution.desktop + + GnomeSoftware::popular + + + + org.gnome.Geary.desktop + + GnomeSoftware::popular + + + + org.gnome.Maps.desktop + + GnomeSoftware::popular + + + + org.gnome.Nautilus.desktop + + GnomeSoftware::popular + + + + im.bernard.Nostalgia + + GnomeSoftware::popular + + + + org.gnome.Notes.desktop + + GnomeSoftware::popular + + + + org.gnome.Photos.desktop + + GnomeSoftware::popular + + + + org.gnome.Polari.desktop + + GnomeSoftware::popular + + + + org.gnome.Todo + + GnomeSoftware::popular + + + + org.gnome.Totem.desktop + + GnomeSoftware::popular + + + + org.gnome.Weather + + GnomeSoftware::popular + + + diff --git a/data/assets/org.gnome.Software.Featured.xml b/data/assets/org.gnome.Software.Featured.xml new file mode 100644 index 0000000..63e4209 --- /dev/null +++ b/data/assets/org.gnome.Software.Featured.xml @@ -0,0 +1,358 @@ + + + + + app.drey.Dialect + + True + + + + app.drey.EarTag + + True + + + + app.drey.Elastic + + True + + + + app.drey.Warp + + True + + + + com.belmoussaoui.Authenticator + + True + + + + com.belmoussaoui.Decoder + + True + + + + com.belmoussaoui.Obfuscate + + True + + + + com.clarahobbs.chessclock + + True + + + + com.feaneron.Boatswain + + True + + + + com.github.ADBeveridge.Raider + + True + + + + com.github.alexhuntley.Plots + + True + + + + com.github.cassidyjames.clairvoyant + + True + + + + com.github.finefindus.eyedropper + + True + + + + com.github.hugolabe.Wike + + True + + + + com.github.huluti.Curtail + + True + + + + com.github.liferooter.textpieces + + True + + + + com.mardojai.ForgeSparks + + True + + + + com.rafaelmardojai.Blanket + + True + + + + com.rafaelmardojai.SharePreview + + True + + + + com.rafaelmardojai.WebfontKitGenerator + + True + + + + com.vixalien.decibels + + True + + + + de.haeckerfelix.AudioSharing + + True + + + + de.haeckerfelix.Fragments + + True + + + + de.haeckerfelix.Shortwave + + True + + + + de.schmidhuberj.DieBahn + + True + + + + dev.bragefuglseth.Fretboard + + True + + + + dev.Cogitri.Health + + True + + + + dev.geopjr.Collision + + True + + + + fr.romainvigier.MetadataCleaner + + True + + + + hu.kramo.Cartridges + + True + + + + info.febvre.Komikku + + True + + + + io.bassi.Amberol + + True + + + + io.github.diegoivan.pdf_metadata_editor + + True + + + + io.github.fkinoshita.Telegraph + + True + + + + io.github.lainsce.Khronos + + True + + + + io.github.mrvladus.List + + True + + + + io.github.seadve.Mousai + + True + + + + io.gitlab.adhami3310.Converter + + True + + + + io.gitlab.adhami3310.Impression + + True + + + + io.gitlab.gregorni.Letterpress + + True + + + + io.gitlab.news_flash.NewsFlash + + True + + + + org.gaphor.Gaphor + + True + + + + org.gnome.DejaDup + + True + + + + org.gnome.design.Emblem + + True + + + + org.gnome.design.Lorem + + True + + + + org.gnome.gitlab.somas.Apostrophe + + True + + + + org.gnome.gitlab.YaLTeR.Identity + + True + + + + org.gnome.gitlab.YaLTeR.VideoTrimmer + + True + + + + org.gnome.Podcasts + + True + + + + org.gnome.Polari + + True + + + + org.gnome.Solanum + + True + + + + org.gnome.World.Citations + + True + + + + org.gnome.World.PikaBackup + + True + + + + org.gnome.World.Secrets + + True + + + + re.sonny.Commit + + True + + + + re.sonny.Junction + + True + + + + re.sonny.Tangram + + True + + + + re.sonny.Workbench + + True + + + + se.sjoerd.Graphs + + True + + + diff --git a/data/assets/up-to-date.svg b/data/assets/up-to-date.svg new file mode 100644 index 0000000..99122cd --- /dev/null +++ b/data/assets/up-to-date.svg @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/autostart/org.gnome.Software.desktop.in b/data/autostart/org.gnome.Software.desktop.in new file mode 100644 index 0000000..6c7a77b --- /dev/null +++ b/data/autostart/org.gnome.Software.desktop.in @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Application +Name=GNOME Software +Exec=@bindir@/gnome-software --gapplication-service +OnlyShowIn=GNOME;Unity; +NotShowIn=Budgie +NoDisplay=true diff --git a/data/bash-completion/gnome-software b/data/bash-completion/gnome-software new file mode 100644 index 0000000..de72b38 --- /dev/null +++ b/data/bash-completion/gnome-software @@ -0,0 +1,80 @@ +# gnome-software(1) completion -*- shell-script -*- + +_filter_completed_options() +{ + local filtered=() + local completed_option + local completed_words=($(compgen -W '${COMP_WORDS[@]}' -- "--")) + + for option in ${COMPREPLY[@]} + do + completed_option=0 + + for completed in ${completed_words[@]} + do + # acccount for --option if applicable + if [ "${option}" == "${completed}" ]; then + completed_option=1 + break + fi + + # acccount for --option= if applicable + if [[ "${words[@]}" =~ "${option}" && "${option}" == "${completed}=" ]]; then + completed_option=1 + break + fi + done + + if [ $completed_option -eq 0 ]; then + filtered+=($option) + fi + done + + COMPREPLY=("${filtered[@]}") +} + +_gnome_software() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + '--mode') + COMPREPLY=( $(compgen -W "updates updated installed overview" -- "$cur") ) + return + ;; + '--search' | '--details' | '--details-pkg' | '--install' | '--uninstall') + # argument required but no completions available + return + ;; + '--local-filename') + _filedir + return + ;; + '--interaction') + COMPREPLY=( $(compgen -W "none notify full" -- "$cur") ) + return + ;; + '--show-metainfo') + _filedir @(xml*(.in)) + return + ;; + '?'|'-h'|'--help'|'--help-all'|'--help-gapplication'|'--version') + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi + + # Don't show already completed options + _filter_completed_options + +} && + complete -F _gnome_software gnome-software + +# ex: filetype=sh diff --git a/data/icons/hicolor/meson.build b/data/icons/hicolor/meson.build new file mode 100644 index 0000000..ef277bc --- /dev/null +++ b/data/icons/hicolor/meson.build @@ -0,0 +1,4 @@ +install_data('scalable/' + application_id + '.svg', + install_dir : 'share/icons/hicolor/scalable/apps') +install_data('symbolic/org.gnome.Software-symbolic.svg', + install_dir : 'share/icons/hicolor/symbolic/apps') diff --git a/data/icons/hicolor/scalable/org.gnome.Software.svg b/data/icons/hicolor/scalable/org.gnome.Software.svg new file mode 100644 index 0000000..fd973d8 --- /dev/null +++ b/data/icons/hicolor/scalable/org.gnome.Software.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg b/data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg new file mode 100644 index 0000000..113e867 --- /dev/null +++ b/data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg b/data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg new file mode 100644 index 0000000..8311292 --- /dev/null +++ b/data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/data/icons/meson.build b/data/icons/meson.build new file mode 100644 index 0000000..b58ff5b --- /dev/null +++ b/data/icons/meson.build @@ -0,0 +1,19 @@ +# These have to be installed system-wide so that gnome-shell can read when when showing notifications +component_icons = [ + 'system-component-addon.svg', + 'system-component-application.svg', + 'system-component-codecs.svg', + 'system-component-driver.svg', + 'system-component-firmware.svg', + 'system-component-input-sources.svg', + 'system-component-language.svg', + 'system-component-os-updates.svg', + 'system-component-runtime.svg', +] + +foreach icon: component_icons + install_data(icon, + install_dir : 'share/icons/hicolor/scalable/categories') +endforeach + +subdir('hicolor') diff --git a/data/icons/org.gnome.Software.Create.svg b/data/icons/org.gnome.Software.Create.svg new file mode 100644 index 0000000..234a6f7 --- /dev/null +++ b/data/icons/org.gnome.Software.Create.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/org.gnome.Software.Develop.svg b/data/icons/org.gnome.Software.Develop.svg new file mode 100644 index 0000000..78792bb --- /dev/null +++ b/data/icons/org.gnome.Software.Develop.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/org.gnome.Software.Generic.svg b/data/icons/org.gnome.Software.Generic.svg new file mode 100644 index 0000000..a2f038e --- /dev/null +++ b/data/icons/org.gnome.Software.Generic.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/org.gnome.Software.Learn.svg b/data/icons/org.gnome.Software.Learn.svg new file mode 100644 index 0000000..7ad3721 --- /dev/null +++ b/data/icons/org.gnome.Software.Learn.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/data/icons/org.gnome.Software.Play.svg b/data/icons/org.gnome.Software.Play.svg new file mode 100644 index 0000000..67fe0dd --- /dev/null +++ b/data/icons/org.gnome.Software.Play.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/org.gnome.Software.Socialize.svg b/data/icons/org.gnome.Software.Socialize.svg new file mode 100644 index 0000000..7c74f8e --- /dev/null +++ b/data/icons/org.gnome.Software.Socialize.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/org.gnome.Software.Work.svg b/data/icons/org.gnome.Software.Work.svg new file mode 100644 index 0000000..46433a4 --- /dev/null +++ b/data/icons/org.gnome.Software.Work.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/symbolic/app-beta-software-symbolic.svg b/data/icons/symbolic/app-beta-software-symbolic.svg new file mode 100644 index 0000000..d8f6e73 --- /dev/null +++ b/data/icons/symbolic/app-beta-software-symbolic.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/data/icons/symbolic/app-info-loading-symbolic.svg b/data/icons/symbolic/app-info-loading-symbolic.svg new file mode 100644 index 0000000..3029e68 --- /dev/null +++ b/data/icons/symbolic/app-info-loading-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/app-installed-symbolic.svg b/data/icons/symbolic/app-installed-symbolic.svg new file mode 100644 index 0000000..0ad73bc --- /dev/null +++ b/data/icons/symbolic/app-installed-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/app-remove-symbolic.svg b/data/icons/symbolic/app-remove-symbolic.svg new file mode 100644 index 0000000..4e7c23b --- /dev/null +++ b/data/icons/symbolic/app-remove-symbolic.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/data/icons/symbolic/app-safety-ok-symbolic.svg b/data/icons/symbolic/app-safety-ok-symbolic.svg new file mode 100644 index 0000000..730f674 --- /dev/null +++ b/data/icons/symbolic/app-safety-ok-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/app-safety-unknown-symbolic.svg b/data/icons/symbolic/app-safety-unknown-symbolic.svg new file mode 100644 index 0000000..838de09 --- /dev/null +++ b/data/icons/symbolic/app-safety-unknown-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/app-safety-unsafe-symbolic.svg b/data/icons/symbolic/app-safety-unsafe-symbolic.svg new file mode 100644 index 0000000..212c07c --- /dev/null +++ b/data/icons/symbolic/app-safety-unsafe-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/app-verified-symbolic.svg b/data/icons/symbolic/app-verified-symbolic.svg new file mode 100644 index 0000000..729eebc --- /dev/null +++ b/data/icons/symbolic/app-verified-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/auditable-code-symbolic.svg b/data/icons/symbolic/auditable-code-symbolic.svg new file mode 100644 index 0000000..3993b52 --- /dev/null +++ b/data/icons/symbolic/auditable-code-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/community-approved-symbolic.svg b/data/icons/symbolic/community-approved-symbolic.svg new file mode 100644 index 0000000..c50d3e8 --- /dev/null +++ b/data/icons/symbolic/community-approved-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/community-blocked-symbolic.svg b/data/icons/symbolic/community-blocked-symbolic.svg new file mode 100644 index 0000000..a71a7a2 --- /dev/null +++ b/data/icons/symbolic/community-blocked-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/community-none-symbolic.svg b/data/icons/symbolic/community-none-symbolic.svg new file mode 100644 index 0000000..e6046c2 --- /dev/null +++ b/data/icons/symbolic/community-none-symbolic.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/data/icons/symbolic/community-supported-symbolic.svg b/data/icons/symbolic/community-supported-symbolic.svg new file mode 100644 index 0000000..1a7ea57 --- /dev/null +++ b/data/icons/symbolic/community-supported-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/community-symbolic.svg b/data/icons/symbolic/community-symbolic.svg new file mode 100644 index 0000000..d33cd55 --- /dev/null +++ b/data/icons/symbolic/community-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/computer-fail-symbolic.svg b/data/icons/symbolic/computer-fail-symbolic.svg new file mode 100644 index 0000000..e581f66 --- /dev/null +++ b/data/icons/symbolic/computer-fail-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/contact-symbolic.svg b/data/icons/symbolic/contact-symbolic.svg new file mode 100644 index 0000000..db40f80 --- /dev/null +++ b/data/icons/symbolic/contact-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/device-support-adaptive-symbolic.svg b/data/icons/symbolic/device-support-adaptive-symbolic.svg new file mode 100644 index 0000000..5a5a865 --- /dev/null +++ b/data/icons/symbolic/device-support-adaptive-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/device-support-desktop-symbolic.svg b/data/icons/symbolic/device-support-desktop-symbolic.svg new file mode 100644 index 0000000..21e971a --- /dev/null +++ b/data/icons/symbolic/device-support-desktop-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/device-support-mobile-symbolic.svg b/data/icons/symbolic/device-support-mobile-symbolic.svg new file mode 100644 index 0000000..d08e682 --- /dev/null +++ b/data/icons/symbolic/device-support-mobile-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/device-support-touch-symbolic.svg b/data/icons/symbolic/device-support-touch-symbolic.svg new file mode 100644 index 0000000..18ddf8a --- /dev/null +++ b/data/icons/symbolic/device-support-touch-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/device-support-unknown-symbolic.svg b/data/icons/symbolic/device-support-unknown-symbolic.svg new file mode 100644 index 0000000..1936b8b --- /dev/null +++ b/data/icons/symbolic/device-support-unknown-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/device-supported-symbolic.svg b/data/icons/symbolic/device-supported-symbolic.svg new file mode 100644 index 0000000..eb51b4c --- /dev/null +++ b/data/icons/symbolic/device-supported-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/document-edit-symbolic.svg b/data/icons/symbolic/document-edit-symbolic.svg new file mode 100644 index 0000000..c4eaf46 --- /dev/null +++ b/data/icons/symbolic/document-edit-symbolic.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/data/icons/symbolic/donate-symbolic.svg b/data/icons/symbolic/donate-symbolic.svg new file mode 100644 index 0000000..e2109e9 --- /dev/null +++ b/data/icons/symbolic/donate-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/external-link-symbolic.svg b/data/icons/symbolic/external-link-symbolic.svg new file mode 100644 index 0000000..19237f1 --- /dev/null +++ b/data/icons/symbolic/external-link-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/help-link-symbolic.svg b/data/icons/symbolic/help-link-symbolic.svg new file mode 100644 index 0000000..1c01e54 --- /dev/null +++ b/data/icons/symbolic/help-link-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/info-symbolic.svg b/data/icons/symbolic/info-symbolic.svg new file mode 100644 index 0000000..f4e7853 --- /dev/null +++ b/data/icons/symbolic/info-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/package-flatpak-symbolic.svg b/data/icons/symbolic/package-flatpak-symbolic.svg new file mode 100644 index 0000000..a10ee5a --- /dev/null +++ b/data/icons/symbolic/package-flatpak-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/package-generic-symbolic.svg b/data/icons/symbolic/package-generic-symbolic.svg new file mode 100644 index 0000000..2cbb594 --- /dev/null +++ b/data/icons/symbolic/package-generic-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/package-snap-symbolic.svg b/data/icons/symbolic/package-snap-symbolic.svg new file mode 100644 index 0000000..53a6c87 --- /dev/null +++ b/data/icons/symbolic/package-snap-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/permissions-legacy-windowing-system-symbolic.svg b/data/icons/symbolic/permissions-legacy-windowing-system-symbolic.svg new file mode 100644 index 0000000..65254f1 --- /dev/null +++ b/data/icons/symbolic/permissions-legacy-windowing-system-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/data/icons/symbolic/permissions-microphone-symbolic.svg b/data/icons/symbolic/permissions-microphone-symbolic.svg new file mode 100644 index 0000000..3542d14 --- /dev/null +++ b/data/icons/symbolic/permissions-microphone-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/permissions-sandboxed-symbolic.svg b/data/icons/symbolic/permissions-sandboxed-symbolic.svg new file mode 100644 index 0000000..5cc07dc --- /dev/null +++ b/data/icons/symbolic/permissions-sandboxed-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/permissions-screen-contents-symbolic.svg b/data/icons/symbolic/permissions-screen-contents-symbolic.svg new file mode 100644 index 0000000..6464eda --- /dev/null +++ b/data/icons/symbolic/permissions-screen-contents-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/permissions-system-devices-symbolic.svg b/data/icons/symbolic/permissions-system-devices-symbolic.svg new file mode 100644 index 0000000..eecd6ac --- /dev/null +++ b/data/icons/symbolic/permissions-system-devices-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/permissions-warning-symbolic.svg b/data/icons/symbolic/permissions-warning-symbolic.svg new file mode 100644 index 0000000..212c07c --- /dev/null +++ b/data/icons/symbolic/permissions-warning-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/proprietary-code-symbolic.svg b/data/icons/symbolic/proprietary-code-symbolic.svg new file mode 100644 index 0000000..871b073 --- /dev/null +++ b/data/icons/symbolic/proprietary-code-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/ratings/advertising-none-symbolic.svg b/data/icons/symbolic/ratings/advertising-none-symbolic.svg new file mode 100644 index 0000000..56dda92 --- /dev/null +++ b/data/icons/symbolic/ratings/advertising-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/advertising-symbolic.svg b/data/icons/symbolic/ratings/advertising-symbolic.svg new file mode 100644 index 0000000..281fcc9 --- /dev/null +++ b/data/icons/symbolic/ratings/advertising-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/alcohol-use-none-symbolic.svg b/data/icons/symbolic/ratings/alcohol-use-none-symbolic.svg new file mode 100644 index 0000000..769d7a2 --- /dev/null +++ b/data/icons/symbolic/ratings/alcohol-use-none-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/ratings/alcohol-use-symbolic.svg b/data/icons/symbolic/ratings/alcohol-use-symbolic.svg new file mode 100644 index 0000000..04e3f44 --- /dev/null +++ b/data/icons/symbolic/ratings/alcohol-use-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/ratings/audio-chat-none-symbolic.svg b/data/icons/symbolic/ratings/audio-chat-none-symbolic.svg new file mode 100644 index 0000000..32d7cd0 --- /dev/null +++ b/data/icons/symbolic/ratings/audio-chat-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/audio-chat-symbolic.svg b/data/icons/symbolic/ratings/audio-chat-symbolic.svg new file mode 100644 index 0000000..3542d14 --- /dev/null +++ b/data/icons/symbolic/ratings/audio-chat-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/contacts-symbolic.svg b/data/icons/symbolic/ratings/contacts-symbolic.svg new file mode 100644 index 0000000..6fe22b4 --- /dev/null +++ b/data/icons/symbolic/ratings/contacts-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/drug-use-none-symbolic.svg b/data/icons/symbolic/ratings/drug-use-none-symbolic.svg new file mode 100644 index 0000000..a06ca8e --- /dev/null +++ b/data/icons/symbolic/ratings/drug-use-none-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/data/icons/symbolic/ratings/drug-use-symbolic.svg b/data/icons/symbolic/ratings/drug-use-symbolic.svg new file mode 100644 index 0000000..bfe813d --- /dev/null +++ b/data/icons/symbolic/ratings/drug-use-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/ratings/gambling-none-symbolic.svg b/data/icons/symbolic/ratings/gambling-none-symbolic.svg new file mode 100644 index 0000000..1716bb5 --- /dev/null +++ b/data/icons/symbolic/ratings/gambling-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/gambling-symbolic.svg b/data/icons/symbolic/ratings/gambling-symbolic.svg new file mode 100644 index 0000000..734a6cc --- /dev/null +++ b/data/icons/symbolic/ratings/gambling-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/gay-content-none-symbolic.svg b/data/icons/symbolic/ratings/gay-content-none-symbolic.svg new file mode 100644 index 0000000..a203f22 --- /dev/null +++ b/data/icons/symbolic/ratings/gay-content-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/gay-content-symbolic.svg b/data/icons/symbolic/ratings/gay-content-symbolic.svg new file mode 100644 index 0000000..8bca3a3 --- /dev/null +++ b/data/icons/symbolic/ratings/gay-content-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/human-remains-symbolic.svg b/data/icons/symbolic/ratings/human-remains-symbolic.svg new file mode 100644 index 0000000..5f7253e --- /dev/null +++ b/data/icons/symbolic/ratings/human-remains-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/messaging-none-symbolic.svg b/data/icons/symbolic/ratings/messaging-none-symbolic.svg new file mode 100644 index 0000000..49443ba --- /dev/null +++ b/data/icons/symbolic/ratings/messaging-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/messaging-symbolic.svg b/data/icons/symbolic/ratings/messaging-symbolic.svg new file mode 100644 index 0000000..b5036f2 --- /dev/null +++ b/data/icons/symbolic/ratings/messaging-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/money-none-symbolic.svg b/data/icons/symbolic/ratings/money-none-symbolic.svg new file mode 100644 index 0000000..a997144 --- /dev/null +++ b/data/icons/symbolic/ratings/money-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/money-symbolic.svg b/data/icons/symbolic/ratings/money-symbolic.svg new file mode 100644 index 0000000..fed9c7d --- /dev/null +++ b/data/icons/symbolic/ratings/money-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/nudity-none-symbolic.svg b/data/icons/symbolic/ratings/nudity-none-symbolic.svg new file mode 100644 index 0000000..a189c54 --- /dev/null +++ b/data/icons/symbolic/ratings/nudity-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/nudity-symbolic.svg b/data/icons/symbolic/ratings/nudity-symbolic.svg new file mode 100644 index 0000000..2660914 --- /dev/null +++ b/data/icons/symbolic/ratings/nudity-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/smoking-none-symbolic.svg b/data/icons/symbolic/ratings/smoking-none-symbolic.svg new file mode 100644 index 0000000..a2b5814 --- /dev/null +++ b/data/icons/symbolic/ratings/smoking-none-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/ratings/smoking-symbolic.svg b/data/icons/symbolic/ratings/smoking-symbolic.svg new file mode 100644 index 0000000..68a5105 --- /dev/null +++ b/data/icons/symbolic/ratings/smoking-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/ratings/social-info-symbolic.svg b/data/icons/symbolic/ratings/social-info-symbolic.svg new file mode 100644 index 0000000..b83c88c --- /dev/null +++ b/data/icons/symbolic/ratings/social-info-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/strong-language-none-symbolic.svg b/data/icons/symbolic/ratings/strong-language-none-symbolic.svg new file mode 100644 index 0000000..2a3065d --- /dev/null +++ b/data/icons/symbolic/ratings/strong-language-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/strong-language-symbolic.svg b/data/icons/symbolic/ratings/strong-language-symbolic.svg new file mode 100644 index 0000000..287bd5b --- /dev/null +++ b/data/icons/symbolic/ratings/strong-language-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/violence-none-symbolic.svg b/data/icons/symbolic/ratings/violence-none-symbolic.svg new file mode 100644 index 0000000..2889c0e --- /dev/null +++ b/data/icons/symbolic/ratings/violence-none-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/ratings/violence-symbolic.svg b/data/icons/symbolic/ratings/violence-symbolic.svg new file mode 100644 index 0000000..74f4f9a --- /dev/null +++ b/data/icons/symbolic/ratings/violence-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/review-rate-negative-symbolic.svg b/data/icons/symbolic/review-rate-negative-symbolic.svg new file mode 100644 index 0000000..309b059 --- /dev/null +++ b/data/icons/symbolic/review-rate-negative-symbolic.svg @@ -0,0 +1,6 @@ + + + diff --git a/data/icons/symbolic/review-rate-positive-symbolic.svg b/data/icons/symbolic/review-rate-positive-symbolic.svg new file mode 100644 index 0000000..f4e043f --- /dev/null +++ b/data/icons/symbolic/review-rate-positive-symbolic.svg @@ -0,0 +1,6 @@ + + + diff --git a/data/icons/symbolic/review-report-symbolic.svg b/data/icons/symbolic/review-report-symbolic.svg new file mode 100644 index 0000000..b92bea9 --- /dev/null +++ b/data/icons/symbolic/review-report-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/data/icons/symbolic/review-symbolic.svg b/data/icons/symbolic/review-symbolic.svg new file mode 100644 index 0000000..a2029db --- /dev/null +++ b/data/icons/symbolic/review-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/software-explore-symbolic.svg b/data/icons/symbolic/software-explore-symbolic.svg new file mode 100644 index 0000000..1c8c45d --- /dev/null +++ b/data/icons/symbolic/software-explore-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/software-installed-symbolic.svg b/data/icons/symbolic/software-installed-symbolic.svg new file mode 100644 index 0000000..ac61aae --- /dev/null +++ b/data/icons/symbolic/software-installed-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/software-license-symbolic.svg b/data/icons/symbolic/software-license-symbolic.svg new file mode 100644 index 0000000..f3ac2ff --- /dev/null +++ b/data/icons/symbolic/software-license-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/data/icons/symbolic/software-updates-symbolic.svg b/data/icons/symbolic/software-updates-symbolic.svg new file mode 100644 index 0000000..9db5b7d --- /dev/null +++ b/data/icons/symbolic/software-updates-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/starred-symbolic.svg b/data/icons/symbolic/starred-symbolic.svg new file mode 100644 index 0000000..b2f5f88 --- /dev/null +++ b/data/icons/symbolic/starred-symbolic.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/data/icons/symbolic/translations-symbolic.svg b/data/icons/symbolic/translations-symbolic.svg new file mode 100644 index 0000000..be23ae3 --- /dev/null +++ b/data/icons/symbolic/translations-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/symbolic/warning-outline-symbolic.svg b/data/icons/symbolic/warning-outline-symbolic.svg new file mode 100644 index 0000000..60677a9 --- /dev/null +++ b/data/icons/symbolic/warning-outline-symbolic.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/data/icons/symbolic/webpage-symbolic.svg b/data/icons/symbolic/webpage-symbolic.svg new file mode 100644 index 0000000..ca42185 --- /dev/null +++ b/data/icons/symbolic/webpage-symbolic.svg @@ -0,0 +1,7 @@ + + + + diff --git a/data/icons/system-component-addon.svg b/data/icons/system-component-addon.svg new file mode 100644 index 0000000..83c1b34 --- /dev/null +++ b/data/icons/system-component-addon.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/system-component-application.svg b/data/icons/system-component-application.svg new file mode 100644 index 0000000..32d3195 --- /dev/null +++ b/data/icons/system-component-application.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/system-component-codecs.svg b/data/icons/system-component-codecs.svg new file mode 100644 index 0000000..87ca2a2 --- /dev/null +++ b/data/icons/system-component-codecs.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/system-component-driver.svg b/data/icons/system-component-driver.svg new file mode 100644 index 0000000..957277a --- /dev/null +++ b/data/icons/system-component-driver.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/system-component-firmware.svg b/data/icons/system-component-firmware.svg new file mode 100644 index 0000000..957277a --- /dev/null +++ b/data/icons/system-component-firmware.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/system-component-input-sources.svg b/data/icons/system-component-input-sources.svg new file mode 100644 index 0000000..071034c --- /dev/null +++ b/data/icons/system-component-input-sources.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/system-component-language.svg b/data/icons/system-component-language.svg new file mode 100644 index 0000000..2c28ad7 --- /dev/null +++ b/data/icons/system-component-language.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/system-component-os-updates.svg b/data/icons/system-component-os-updates.svg new file mode 100644 index 0000000..18ec3fd --- /dev/null +++ b/data/icons/system-component-os-updates.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/system-component-runtime.svg b/data/icons/system-component-runtime.svg new file mode 100644 index 0000000..32d3195 --- /dev/null +++ b/data/icons/system-component-runtime.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/meson.build b/data/meson.build new file mode 100644 index 0000000..e49001d --- /dev/null +++ b/data/meson.build @@ -0,0 +1,65 @@ +subdir('metainfo') +subdir('icons') +subdir('assets') + +cdata = configuration_data() +cdata.set('bindir', join_paths(get_option('prefix'), + get_option('bindir'))) + +# note: the main .desktop file is in src/ +# this one is for the background service +# replace @bindir@ +configure_file( + input : 'autostart/org.gnome.Software.desktop.in', + output : 'org.gnome.Software.desktop', + install_dir: join_paths(get_option('sysconfdir'), 'xdg/autostart'), + configuration : cdata +) + +compiled_schemas = gnome.compile_schemas( + depend_files: 'org.gnome.software.gschema.xml') +install_data('org.gnome.software.gschema.xml', + install_dir : join_paths(get_option('datadir'), 'glib-2.0', 'schemas')) + +if get_option('dkms') + # replace @libexecdir@ + conf_data = configuration_data() + conf_data.set('libexecdir', join_paths(get_option('prefix'), + get_option('libexecdir'))) + out = configure_file( + input : 'org.gnome.software.dkms-helper.policy.in.in', + output : 'org.gnome.software.dkms-helper.policy.in', + install: false, + configuration : conf_data, + ) + i18n.merge_file( + input : out, + output : 'org.gnome.software.dkms-helper.policy', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'polkit-1', 'actions'), + ) +endif + +if get_option('external_appstream') + # replace @libexecdir@ + conf_data = configuration_data() + conf_data.set('libexecdir', join_paths(get_option('prefix'), + get_option('libexecdir'))) + out = configure_file( + input : 'org.gnome.software.external-appstream.policy.in.in', + output : 'org.gnome.software.external-appstream.policy.in', + install: false, + configuration : conf_data, + ) + i18n.merge_file( + input : out, + output : 'org.gnome.software.external-appstream.policy', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'polkit-1', 'actions'), + ) +endif + +install_data('bash-completion/gnome-software', + install_dir : join_paths(get_option('datadir'), 'bash-completion', 'completions')) diff --git a/data/metainfo/meson.build b/data/metainfo/meson.build new file mode 100644 index 0000000..2d056ff --- /dev/null +++ b/data/metainfo/meson.build @@ -0,0 +1,22 @@ +i18n.merge_file( + input: 'org.gnome.Software.metainfo.xml.in', + output: 'org.gnome.Software.metainfo.xml', + type: 'xml', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'metainfo') +) + +if get_option('tests') and appstream.version().version_compare('>=0.15.5') + ascli_exe = find_program('appstreamcli') + test('gs-validate-metainfo', + ascli_exe, + args: ['validate', + '--pedantic', + '--no-net', + '--explain', + 'org.gnome.Software.metainfo.xml.in'], + workdir : meson.current_source_dir(), + suite: ['lib'], + ) +endif diff --git a/data/metainfo/org.gnome.Software.metainfo.xml.in b/data/metainfo/org.gnome.Software.metainfo.xml.in new file mode 100644 index 0000000..8efeb0c --- /dev/null +++ b/data/metainfo/org.gnome.Software.metainfo.xml.in @@ -0,0 +1,2816 @@ + + + + org.gnome.Software.desktop + CC0-1.0 + GPL-2.0-or-later + Software + Install and update apps + +

+ Software allows you to find and install new apps and system + extensions and remove existing installed apps. +

+

+ Software showcases featured and popular apps with useful + descriptions and multiple screenshots per app. + Apps can be found either through browsing the list of categories + or by searching. + It also allows you to update your system using an offline update. +

+
+ + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png + Overview panel + + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png + Details panel + + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details2.png + Details panel + + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-installed.png + Installed panel + + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-up-to-date.png + Updates panel + + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-updates.png + Updates panel + + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-updates-details.png + The update details + + + + + + pointing + keyboard + touch + + + + + 360 + + + + + + +

This is a stable release with the following changes:

+
    +
  • Improve memory fragmentation after checking for updates
  • +
+

This release also updates translations:

+
    +
  • Czech (Daniel Rusek)
  • +
  • French (Vincent Chatelain)
  • +
  • Hindi (Scrambled 777)
  • +
  • Japanese (Takayuki Kusano)
  • +
  • Latvian (Rūdolfs Mazurs)
  • +
  • Swedish (Anders Jonsson)
  • +
+
+
+ + + +

This is a stable release with the following changes:

+
    +
  • Improve contrast of some app safety ratings in dark mode
  • +
  • Improve error handling when fetching app reviews
  • +
+

This release also updates translations:

+
    +
  • English (United Kingdom) (Andi Chandler)
  • +
  • German (Philipp Kiemle, Martin Wagner)
  • +
  • Kabyle (Athmane MOKRAOUI)
  • +
  • Nepali (Pawan Chitrakar)
  • +
  • Panjabi (A S Alam)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
  • Uzbek (Baxrom Raxmatov)
  • +
  • Vietnamese (Cas Pascal)
  • +
+
+
+ + + +

This is a stable release with the following changes:

+
    +
  • Correctly show update detail text not provided in markdown
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Saratsua Garmendia)
  • +
  • Belarusian (Vasil Pupkin)
  • +
  • Bokmål, Norwegian (Brage Fuglseth)
  • +
  • Catalan (Jordi Mas i Hernandez, Francesc Busquets)
  • +
  • Danish (Alan Mortensen)
  • +
  • Filipino (Iverson Briones)
  • +
  • Hungarian (Balázs Úr)
  • +
  • Indonesian (Andika Triwidada)
  • +
  • Nepali (Pawan Chitrakar)
  • +
  • Panjabi (A S Alam)
  • +
  • Polish (Piotr Drąg)
  • +
  • Romanian (Antonio Marin)
  • +
  • Russian (Artur S0)
  • +
  • Spanish (Daniel Mustieles)
  • +
+
+
+ + + +

This is an unstable release with the following changes:

+
    +
  • Minor interface improvements on the updates page
  • +
  • Various minor performance improvements
  • +
  • Improve error handling for app launches and distribution upgrades
  • +
  • Fix a crash on the app review dialog
  • +
  • Fix version checks preventing some firmware updates when historical updates are also listed
  • +
  • Fix a crash when copying error details
  • +
  • Minor interface improvements to search
  • +
  • Improvements to flatpak permissions checking for D-Bus
  • +
+

This release also updates translations:

+
    +
  • Bulgarian (twlvnn kraftwerk)
  • +
  • Catalan (Jordi Mas)
  • +
  • Chinese (China) (Luming Zh)
  • +
  • Chinese (Taiwan) (Cheng-Chia Tseng)
  • +
  • Czech (Daniel Rusek)
  • +
  • Finnish (Jiri Grönroos)
  • +
  • French (Vincent Chatelain)
  • +
  • Galician (Fran Dieguez)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • Hebrew (Yaron Shahrabani)
  • +
  • Korean (Seong-ho Cho)
  • +
  • Lithuanian (Aurimas Černius)
  • +
  • Persian (Danial Behzadi)
  • +
  • Portuguese (Hugo Carvalho)
  • +
  • Portuguese (Brazil) (Rafael Fontenelle)
  • +
  • Russian (Artur S0)
  • +
  • Slovenian (Martin)
  • +
  • Swedish (Anders Jonsson)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + + +

This is an unstable release with the following changes:

+
    +
  • Support installing flatpaks via a flatpak+https: link
  • +
  • Fix notifying about outdated updates when in power saver mode or offline
  • +
  • Prioritise verified apps in source list
  • +
+

This release also updates translations:

+
    +
  • Bulgarian (twlvnn kraftwerk)
  • +
  • Czech (Daniel Rusek)
  • +
  • Russian (Artur S0)
  • +
  • Slovenian (Martin)
  • +
+
+
+ + + +

This is an unstable release with the following changes:

+
    +
  • Fix downloads of firmware updates
  • +
  • Fix the release process
  • +
+

This release also updates translations:

+
    +
  • Belarusian (Vasil Pupkin)
  • +
  • Slovenian (Martin)
  • +
+
+
+ + + +

This is an unstable release with the following changes:

+
    +
  • Fix the release process
  • +
+
+
+ + + +

This is an unstable release with the following changes:

+
    +
  • Include dependencies in estimated download size
  • +
  • Improve performance when loading updates
  • +
  • Fix interface freeze when upvoting/downvoting reviews
  • +
  • Various minor interface improvements for keyboard navigation and small screens
  • +
  • Fix crash when uninstalling snaps
  • +
  • Add experimental systemd-sysupdate plugin
  • +
  • Warn about microphone permissions if an app has PipeWire access
  • +
+

This release also updates translations:

+
    +
  • Belarusian (Vasil Pupkin)
  • +
  • Catalan (Jordi Mas i Hernandez, Jordi Mas)
  • +
  • Dutch (Nathan Follens)
  • +
  • French (Vincent Chatelain)
  • +
  • Friulian (Fabio Tomat)
  • +
  • German (Jürgen Benvenuti)
  • +
  • Hebrew (Yaron Shahrabani)
  • +
  • Kabyle (Athmane MOKRAOUI)
  • +
  • Latvian (Rūdolfs Mazurs)
  • +
  • Portuguese (Hugo Carvalho)
  • +
  • Portuguese (Brazil) (Rafael Fontenelle)
  • +
  • Russian (Artur S0)
  • +
  • Serbian (Марко Костић, Милош Поповић)
  • +
  • Slovak (Jose Riha)
  • +
  • Slovenian (Martin)
  • +
  • Thai (Aefgh Threenine)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + + +

This is a stable release with the following changes:

+
    +
  • Do not install example featured software lists by default (packagers should use gnome-app-list instead)
  • +
+

This release also updates translations:

+
    +
  • Bokmål, Norwegian (Brage Fuglseth)
  • +
  • Bulgarian (twlvnn kraftwerk, Alexander Shopov)
  • +
  • Catalan (Jordi Mas i Hernandez)
  • +
  • Czech (Daniel Rusek)
  • +
  • Danish (Alan Mortensen)
  • +
  • English (United Kingdom) (Bruce Cowan)
  • +
  • Galician (Fran Dieguez)
  • +
  • Hungarian (Balázs Úr)
  • +
  • Indonesian (Andika Triwidada)
  • +
  • Italian (Davide Ferracin)
  • +
  • Kazakh (Baurzhan Muftakhidinov)
  • +
  • Lithuanian (Aurimas Černius)
  • +
  • Occitan (post 1500) (Quentin PAGÈS)
  • +
  • Polish (Piotr Drąg)
  • +
  • Portuguese (Hugo Carvalho)
  • +
  • Portuguese (Brazil) (Juliano de Souza Camargo)
  • +
  • Spanish (Daniel, Daniel Mustieles)
  • +
  • Swedish (Anders Jonsson)
  • +
  • Thai (Aefgh Threenine)
  • +
  • Turkish (Emin Tufan Çetin)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Update help pages and add some translations of them
  • +
  • Correct tooltips of review voting buttons
  • +
  • Lower power consumption when certain pages are not visible
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Belarusian (Vasil Pupkin)
  • +
  • Bokmål, Norwegian (Brage Fuglseth)
  • +
  • Chinese (China) (Luming Zh)
  • +
  • Czech (Daniel Rusek)
  • +
  • Finnish (Jiri Grönroos)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • German (Jürgen Benvenuti, Tim Sabsch)
  • +
  • Greek, Modern (1453-) (Giannis Antypas)
  • +
  • Hindi (Scrambled 777)
  • +
  • Korean (Seong-ho Cho)
  • +
  • Persian (Danial Behzadi)
  • +
  • Portuguese (Brazil) (Rafael Fontenelle, Juliano de Souza Camargo)
  • +
  • Russian (Artur S0)
  • +
  • Slovak (Matej Mrenica)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Shorten text in some notifications
  • +
  • Fix Orca not reading the contents in Preferences dialog
  • +
  • Enhance behavior of a review row
  • +
  • Added plugin to ease installation of DKMS and akmods key with enabled Secure Boot
  • +
+

This release also updates translations:

+
    +
  • Greek, Modern (1453-) (Efstathios Iosifidis)
  • +
  • Hebrew (Yaron Shahrabani, Yosef Or Boczko)
  • +
  • Hindi (Scrambled 777)
  • +
  • Slovenian (Martin)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Fix a crash when updating apps when built with Mogwai
  • +
  • Fix a crash when installing flatpak application
  • +
  • Correct desktop/mobile hardware support detection
  • +
  • Correct state of Fedora upgrade
  • +
  • Several fixes in historical updates for rpm-ostree
  • +
  • Fix a crash when no appstream data is found
  • +
  • Correct app safety calculation
  • +
  • Correct Flatpak system and user apps recognition
  • +
  • Slightly speed-up rpm-ostree metadata refresh
  • +
  • Show "Install All" button only for codecs
  • +
  • Prefer vendor name from os release in app origin
  • +
  • Make more jobs asynchronous
  • +
  • Port to recent Adwaita widgets
  • +
+

This release also updates translations:

+
    +
  • Catalan (Jordi Mas i Hernandez)
  • +
  • Chinese (China) (Boyuan Yang)
  • +
  • Czech (Daniel Rusek)
  • +
  • Dutch (Nathan Follens)
  • +
  • Friulian (Fabio Tomat)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Kabyle (Athmane MOKRAOUI)
  • +
  • Panjabi (A S Alam)
  • +
  • Portuguese (Hugo Carvalho)
  • +
  • Russian (Artur S0)
  • +
  • Serbian (Милош Поповић)
  • +
  • Slovenian (Martin)
  • +
  • Spanish (Daniel Mustieles)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Improvements for screen readers
  • +
  • Stop ‘loading updates’ in a loop on Debian
  • +
+

This release also updates translations:

+
    +
  • Czech (Daniel Rusek)
  • +
  • Danish (Alan Mortensen)
  • +
  • Finnish (Jiri Grönroos)
  • +
  • French (Vincent Chatelain)
  • +
  • Galician (Fran Dieguez)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • Hungarian (Balázs Úr)
  • +
  • Indonesian (Kukuh Syafaat)
  • +
  • Korean (Seong-ho Cho)
  • +
  • Latvian (Rūdolfs Mazurs)
  • +
  • Persian (Danial Behzadi)
  • +
  • Polish (Piotr Drąg)
  • +
  • Portuguese (Brazil) (Juliano de Souza Camargo)
  • +
  • Russian (Artur S0)
  • +
  • Swedish (Anders Jonsson)
  • +
  • Thai (Aefgh Threenine)
  • +
  • Turkish (Emin Tufan Çetin)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Various UI text improvements
  • +
  • Fix launch of some apps
  • +
  • Fix invalid app state after it's uninstalled
  • +
  • Fix read of app description text
  • +
  • Do not ask to reboot after failed firmware update
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Belarusian (Vasil Pupkin)
  • +
  • Bokmål, Norwegian (Brage Fuglseth)
  • +
  • Catalan (Jordi Mas, Quique Serrano)
  • +
  • Chinese (China) (Boyuan Yang)
  • +
  • Czech (Daniel Rusek)
  • +
  • Dutch (Nathan Follens)
  • +
  • English (United Kingdom) (Andi Chandler)
  • +
  • Galician (Fran Dieguez)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • German (Jürgen Benvenuti, Philipp Kiemle)
  • +
  • Hebrew (Yaron Shahrabani)
  • +
  • Indonesian (Kukuh Syafaat)
  • +
  • Kazakh (Baurzhan Muftakhidinov)
  • +
  • Latvian (Rūdolfs Mazurs)
  • +
  • Lithuanian (Aurimas Černius)
  • +
  • Occitan (post 1500) (Quentin PAGÈS)
  • +
  • Persian (Danial Behzadi)
  • +
  • Russian (Artur S0)
  • +
  • Slovenian (Matej Urbančič)
  • +
  • Spanish (Daniel Mustieles)
  • +
  • Thai (Aefgh Threenine)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Show feedback for all conditions that pause automatic updates
  • +
  • Various UI improvements and move to new libadwaita widgets
  • +
  • Fix loading OS AppStream catalog data if it is available as YAML
  • +
  • Add openSUSE Leap distro upgrade plugin
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Belarusian (Vasil Pupkin)
  • +
  • Czech (Daniel Rusek)
  • +
  • Galician (Fran Dieguez)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Persian (Danial Behzadi)
  • +
  • Portuguese (Brazil) (Juliano de Souza Camargo)
  • +
  • Russian (Artur S0)
  • +
  • Turkish (Sabri Ünal)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Recognize links in package update descriptions
  • +
  • Expose package names discreetly in the UI
  • +
  • Increase speed of load of the category pages
  • +
  • Improve search match with multiple words
  • +
  • Recognize verified apps by Flathub
  • +
  • Correct message when installing firmware updates
  • +
  • Improve application safety checks
  • +
  • Improve update preferences dialog
  • +
  • Fix deadlock when cancelling app update
  • +
  • Support user installation of local flatpak files
  • +
  • Fix apps appearing unsorted and without tiles in category page
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Chinese (China) (Boyuan Yang)
  • +
  • Chinese (Taiwan) (Andre Klapper)
  • +
  • Czech (Daniel Rusek)
  • +
  • Friulian (Fabio Tomat)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • German (Jürgen Benvenuti)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Persian (Danial Behzadi)
  • +
  • Romanian (Florentina Mușat)
  • +
  • Russian (Artur S0)
  • +
  • Turkish (Emin Tufan Çetin, Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
  • Vietnamese (Ngọc Quân Trần)
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix a crash when downloading resources from the Internet
  • +
  • Fix a crash after cancelled Restart request
  • +
  • Correct safety rating for KDE apps
  • +
  • Correct version history widgets visibility in the details page
  • +
+

This release also updates translations:

+
    +
  • Catalan (Jordi Mas)
  • +
  • Greek, Modern (1453-) (Efstathios Iosifidis)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Hungarian (Balázs Úr)
  • +
  • Indonesian (Kukuh Syafaat)
  • +
  • Korean (Seong-ho Cho)
  • +
  • Occitan (post 1500) (Quentin PAGÈS)
  • +
  • Panjabi (A S Alam)
  • +
  • Slovenian (Matej Urbančič)
  • +
  • Spanish (Daniel Mustieles)
  • +
  • Swedish (Anders Jonsson)
  • +
  • Turkish (Emin Tufan Çetin)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Fix firmware's 'Restart & Update' to ask for the restart
  • +
  • Fix app getting unresponsive when loading screenshots
  • +
  • Improve performance for PackageKit plugin search-by-file
  • +
  • Improve app license display
  • +
  • Improve search to also check for 'contains' words
  • +
  • Various minor styling updates
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Belarusian (Vasil Pupkin)
  • +
  • Catalan (Jordi Mas)
  • +
  • Chinese (China) (Luming Zh, Boyuan Yang)
  • +
  • Czech (Daniel Rusek)
  • +
  • Danish (Alan Mortensen)
  • +
  • Dutch (Nathan Follens)
  • +
  • Finnish (Jiri Grönroos)
  • +
  • Galician (Fran Dieguez)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • German (Philipp Kiemle, Christian Kirbach)
  • +
  • Greek, Modern (1453-) (Efstathios Iosifidis)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Hungarian (Balázs Úr)
  • +
  • Indonesian (Andika Triwidada, Kukuh Syafaat)
  • +
  • Kazakh (Baurzhan Muftakhidinov)
  • +
  • Lithuanian (Aurimas Černius)
  • +
  • Panjabi (Amn Alam)
  • +
  • Persian (Danial Behzadi)
  • +
  • Polish (Piotr Drąg)
  • +
  • Portuguese (Hugo Carvalho)
  • +
  • Russian (Artur S0, Artur So)
  • +
  • Spanish (Daniel Mustieles)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Improve error notifications from failed GPG checks
  • +
  • Disable animations in the UI according to the user’s accessibility settings
  • +
  • Fix applying updates which require some packages to be removed to satisfy dependencies
  • +
  • Stop using the software repositories dialog provided by the distribution, and always use GNOME Software’s inbuilt dialog; this will affect Debian and Ubuntu
  • +
+

This release also updates translations:

+
    +
  • Belarusian (Vasil Pupkin)
  • +
  • Chinese (China) (Luming Zh)
  • +
  • Czech (Daniel Rusek)
  • +
  • English (United Kingdom) (Bruce Cowan)
  • +
  • French (Guillaume Bernard)
  • +
  • Friulian (Fabio Tomat)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • Greek, Modern (1453-) (Efstathios Iosifidis)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Hungarian (Balázs Úr)
  • +
  • Lithuanian (Aurimas Černius)
  • +
  • Persian (Danial Behzadi)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Indicate when OS updates includes security fixes
  • +
  • Ask whether to clear app storage for Flatpak apps on uninstall
  • +
  • Show a notification when system updates are downloaded
  • +
  • Advertise if an installed Flatpak app has reached end of life
  • +
  • Revamp Safety ratings
  • +
  • Fix slow Repositories dialog open
  • +
  • Fix card view and key navigation in the Explore page
  • +
  • Fix a crash on startup in GNOME OS
  • +
  • Fix navigation between "Other Apps by Developer" in the Details page
  • +
  • Fix a crash when refining a Flatpak app
  • +
  • Fix a state recover after a failed app update
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Catalan (Jordi Mas i Hernandez)
  • +
  • Czech (Daniel Rusek)
  • +
  • Finnish (Jiri Grönroos)
  • +
  • Friulian (Fabio Tomat)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Italian (Gianvito Cavasoli)
  • +
  • Occitan (post 1500) (Quentin PAGÈS)
  • +
  • Persian (Danial Behzadi)
  • +
  • Polish (Piotr Drąg)
  • +
  • Portuguese (Hugo Carvalho)
  • +
  • Russian (Aleksandr Melman)
  • +
  • Slovenian (Martin)
  • +
  • Turkish (Sabri Ünal)
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix firmware updates state change after update
  • +
  • Fix origin reference information for PackageKit apps
  • +
  • Fix a crash after dismissing firmware update warning dialog
  • +
  • Fix a crash on repo removal
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Bulgarian (Alexander Shopov)
  • +
  • Chinese (China) (Boyuan Yang)
  • +
  • Chinese (Taiwan) (Chao-Hsiung Liao)
  • +
  • Czech (Petr Kovář, Daniel Rusek)
  • +
  • Dutch (Nathan Follens)
  • +
  • French (Guillaume Bernard)
  • +
  • Occitan (post 1500) (Quentin PAGÈS)
  • +
  • Persian (Danial Behzadi)
  • +
  • Slovenian (Martin)
  • +
  • Vietnamese (Ngọc Quân Trần)
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix missing separators in system updates dialog
  • +
+

This release also updates translations:

+
    +
  • Bulgarian (Alexander Shopov)
  • +
  • Catalan (Jordi Mas)
  • +
  • Danish (Alan Mortensen)
  • +
  • English (United Kingdom) (Bruce Cowan)
  • +
  • Friulian (Fabio Tomat)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Korean (Seong-ho Cho)
  • +
  • Polish (Piotr Drąg)
  • +
  • Russian (Aleksandr Melman)
  • +
  • Slovenian (Martin, Matej Urbančič)
  • +
  • Swedish (Anders Jonsson)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Fix a crash during install of a firmware update
  • +
  • Fix notifications of a prepared update
  • +
  • Fix cancellation of an update
  • +
  • Update details page on app job start/end
  • +
  • Fix a crash after cancelling of a single package update
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Belarusian (Vasil Pupkin)
  • +
  • Bokmål, Norwegian (Kjartan Maraas)
  • +
  • Catalan (Jordi Mas)
  • +
  • Finnish (Jiri Grönroos)
  • +
  • Friulian (Fabio Tomat)
  • +
  • Galician (Fran Dieguez)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • German (Jürgen Benvenuti, Philipp Kiemle)
  • +
  • Hebrew (Yosef Or Boczko, Yaron Shahrabani)
  • +
  • Hungarian (Balázs Úr)
  • +
  • Indonesian (Andika Triwidada, Kukuh Syafaat)
  • +
  • Lithuanian (Aurimas Černius)
  • +
  • Occitan (post 1500) (Quentin PAGÈS)
  • +
  • Portuguese (Hugo Carvalho)
  • +
  • Spanish (Daniel, Daniel Mustieles)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Add a preference for only showing freely-licensed apps
  • +
  • Improve design of Install/Uninstall buttons for app addons
  • +
  • Fix loading flatpak bundles if a runtime is missing
  • +
  • Improvements to the UI for ratings and reviews
  • +
  • Fix refreshing the details page after searching for an app
  • +
  • Improve choice of icons for apps where a themed icon is available
  • +
  • Improve performance of downloading remote icons significantly
  • +
+

This release also updates translations:

+
    +
  • Basque (Asier Sarasua Garmendia)
  • +
  • Belarusian (Vasil Pupkin)
  • +
  • Galician (Fran Dieguez)
  • +
  • Georgian (Ekaterine Papava)
  • +
  • German (Jürgen Benvenuti)
  • +
  • Hebrew (Yosef Or Boczko, Yaron Shahrabani)
  • +
  • Indonesian (Andika Triwidada)
  • +
  • Lithuanian (Aurimas Černius)
  • +
  • Occitan (post 1500) (Quentin PAGÈS)
  • +
  • Portuguese (Hugo Carvalho)
  • +
  • Russian (Aleksandr Melman)
  • +
  • Spanish (Philip Withnall, Daniel Mustieles)
  • +
  • Turkish (Sabri Ünal, Emin Tufan Çetin)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
  • Vietnamese (Ngọc Quân Trần)
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Allow automatically removing unneeded runtimes
  • +
  • Show changelogs for rpm-ostree updates
  • +
  • Limit the maximum description length in context tiles
  • +
  • Support a less-prominent UI for regular updates for image-based OSs
  • +
  • Improvements to error notification display
  • +
  • Reduce reloading/refreshing of view when installing apps
  • +
  • Minor usability improvements to review lists and adding a review
  • +
  • Stop using libdnf in rpm-ostree backend
  • +
  • UI polish on app source chooser
  • +
  • Fix distro upgrades
  • +
  • Fix system-wide external AppStream support
  • +
  • UI polish on Incompatible Software dialog
  • +
  • Fix opening web apps
  • +
  • Fix notifying about available firmware updates
  • +
  • Improve scaling of Explore page on phones
  • +
  • Add a placeholder to search entry
  • +
  • Fix repo authentication dialog
  • +
  • Periodically refresh cached app icons
  • +
  • Improve labels and tooltips on Updates page
  • +
  • Annotate firmware updates with their release urgency
  • +
  • Adapt to GTK API deprecations
  • +
  • Use the OS logo for minor update rows for image-based OSs
  • +
  • Change ‘application’ to ‘app’ in translatable strings
  • +
  • Stop notifying about unprepared critical updates
  • +
  • Show the ‘Learn More’ link for larger updates of image-based OSs if provided
  • +
  • Add translations for more firmware device categories
  • +
+

This release also updates translations:

+
    +
  • Abkhazian (Nart Tlisha)
  • +
  • Belarusian (Vasil Pupkin)
  • +
  • Catalan (Jordi Mas)
  • +
  • Chinese (Taiwan) (Cheng-Chia Tseng)
  • +
  • Croatian (Goran Vidović)
  • +
  • Czech (Daniel Rusek)
  • +
  • French (Claude Paroz)
  • +
  • Friulian (Fabio Tomat)
  • +
  • Georgian (Zurab Kargareteli)
  • +
  • German (Philipp Kiemle, Jürgen Benvenuti)
  • +
  • Greek, Modern (1453-) (Kosmas Martakidis)
  • +
  • Hebrew (Yosef Or Boczko)
  • +
  • Hungarian (Balázs Úr)
  • +
  • Icelandic (Sveinn í Felli)
  • +
  • Interlingue (Olga Smirnova)
  • +
  • Italian (Gianvito Cavasoli)
  • +
  • Kazakh (Baurzhan Muftakhidinov)
  • +
  • Panjabi (A S Alam)
  • +
  • Persian (Danial Behzadi)
  • +
  • Russian (Aleksandr Melman)
  • +
  • Slovenian (Matej Urbančič)
  • +
  • Turkish (Sabri Ünal)
  • +
  • Ukrainian (Yuri Chornoivan)
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix searches not completing if installing or uninstalling an app at the same time
  • +
  • Notify of errors when running a flatpak app whose runtime is missing
  • +
  • Fix installing local RPM packages
  • +
  • Fix distribution upgrades when package conflicts are present
  • +
  • Fix opening web apps from their details page
  • +
  • Improve appearance of app ratings if ratings data cannot be downloaded
  • +
  • Fix crash when showing offline update errors on startup
  • +
  • Highlight priority of firmware updates, making security fixes more obvious
  • +
  • Fix installation of pending apps in some situations
  • +
  • Fix downloading of rpm-ostree app updates from the Updates page
  • +
+

This release also updates translations:

+
    +
  • Abkhazian (Nart Tlisha)
  • +
  • Catalan (Jordi Mas)
  • +
  • Chinese (Taiwan) (Cheng-Chia Tseng)
  • +
  • Croatian (Goran Vidović)
  • +
  • French (Claude Paroz)
  • +
  • Friulian (Fabio Tomat)
  • +
  • Georgian (Zurab Kargareteli)
  • +
  • German (Philipp Kiemle, Jürgen Benvenuti)
  • +
  • Icelandic (Sveinn í Felli)
  • +
  • Italian (Gianvito Cavasoli)
  • +
  • Kazakh (Baurzhan Muftakhidinov)
  • +
  • Panjabi (A S Alam)
  • +
  • Slovenian (Matej Urbančič)
  • +
+
+
+ + +

This is a stable release with translation updates:

+
    +
  • Bulgarian
  • +
  • Catalan
  • +
  • Chinese (Taiwan)
  • +
  • Czech
  • +
  • English (United Kingdom)
  • +
  • Galician
  • +
  • Georgian
  • +
  • German
  • +
  • Hebrew
  • +
  • Hungarian
  • +
  • Icelandic
  • +
  • Latvian
  • +
  • Lithuanian
  • +
  • Nepali
  • +
  • Serbian
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Swedish
  • +
+
+
+ + +

This is the third unstable release for GNOME 43.

+
    +
  • Supports video as a screenshot
  • +
  • Improvements of source picker in the details page
  • +
  • Fixes a bug when viewing details of a package file
  • +
  • Fixes a bug when reading certain .flatpakref file
  • +
+

This release also updates translations:

+
    +
  • Abkhazian
  • +
  • Basque
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Croatian
  • +
  • Danish
  • +
  • Dutch
  • +
  • Finnish
  • +
  • Galician
  • +
  • Georgian
  • +
  • Hebrew
  • +
  • Icelandic
  • +
  • Indonesian
  • +
  • Korean
  • +
  • Lithuanian
  • +
  • Persian
  • +
  • Polish
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Russian
  • +
  • Serbian
  • +
  • Spanish
  • +
  • Turkish
  • +
  • Ukrainian
  • +
+
+
+ + +

This is the second unstable release for GNOME 43.

+
    +
  • Various fixes related to changed threading model
  • +
  • Various UI parts updated
  • +
  • Sources dropdown had been reworked
  • +
  • Fixes a rare crash when showing app details
  • +
+

This release also updates translations:

+
    +
  • Abkhazian
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Dutch
  • +
  • Georgian
  • +
  • Hebrew
  • +
  • Indonesian
  • +
  • Italian
  • +
  • Lithuanian
  • +
  • Persian
  • +
  • Portuguese
  • +
  • Russian
  • +
  • Serbian
  • +
  • Spanish
  • +
  • Turkish
  • +
  • Ukrainian
  • +
  • Vietnamese
  • +
+
+
+ + +

This is the first unstable release for GNOME 43.

+
    +
  • Various improvements to notifications
  • +
  • Fix several crashes when handling flatpak apps
  • +
  • Add ‘Other Apps by Author’ section in the app details page
  • +
  • Improve styling of app context lozenges
  • +
  • Add ‘Available for Distro’ section to the overview page (if configured by your distribution)
  • +
  • Show more details about file system permissions requested by flatpak apps
  • +
  • Show more types of URI from app metainfo
  • +
  • Fix a few issues when using a dark mode theme
  • +
  • Fix some issues with arrows in right-to-left locales
  • +
  • Fix language pack installation for certain locales
  • +
  • Improve debug output to make user bug reports more useful
  • +
  • Add `--uninstall=ID` command line option
  • +
  • Allow scrolling screenshots by clicking on next and previous screenshots
  • +
  • Add support for webapps
  • +
  • Allow swiping back in the shell using touch gestures
  • +
  • Improved caching of downloaded metadata
  • +
  • Many internal architectural changes to make the code more maintainable
  • +
  • + The popular-overrides GSettings key has been removed; + distribution vendors wishing to mark their apps as popular should + see `doc/vendor-customisation.md` for examples of how to do this now +
  • +
  • + The hardcoded_popular Meson option has been renamed to + hardcoded_curated. +
  • +
+

This release also updates translations:

+
    +
  • Basque
  • +
  • Bulgarian
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Chinese (Taiwan)
  • +
  • Croatian
  • +
  • Czech
  • +
  • Danish
  • +
  • Dutch
  • +
  • English (United Kingdom)
  • +
  • Finnish
  • +
  • French
  • +
  • Friulian
  • +
  • Galician
  • +
  • Georgian
  • +
  • German
  • +
  • Hebrew
  • +
  • Hungarian
  • +
  • Indonesian
  • +
  • Lithuanian
  • +
  • Nepali
  • +
  • Occitan (post 1500)
  • +
  • Persian
  • +
  • Polish
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Russian
  • +
  • Serbian
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Swedish
  • +
  • Turkish
  • +
  • Ukrainian
  • +
  • Vietnamese
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Various fixes related to changed threading model
  • +
  • Added several appstream-related fixes
  • +
+

This release also updates translations:

+
    +
  • Basque
  • +
  • Bokmål, Norwegian
  • +
  • Bulgarian
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Danish
  • +
  • Finnish
  • +
  • French
  • +
  • German
  • +
  • Hebrew
  • +
  • Hungarian
  • +
  • Japanese
  • +
  • Kazakh
  • +
  • Lithuanian
  • +
  • Occitan (post 1500)
  • +
  • Persian
  • +
  • Polish
  • +
  • Russian
  • +
  • Serbian
  • +
  • Slovenian
  • +
  • Swedish
  • +
+
+
+ + +

This is the third unstable release for GNOME 42.

+
    +
  • Cancel ongoing update downloads when system power is low
  • +
  • Numerous small user interface fixes and tweaks
  • +
  • Prioritize full matches in search results
  • +
  • Improvements in dark mode
  • +
  • Fix disabling flatpak remotes from the ‘Software Repositories’ dialog
  • +
  • Threading and performance improvements which should reduce the number of user interface freezes
  • +
  • Update some icons
  • +
  • Check for updates when moving from a metered to a non-metered network connection
  • +
+

This release also updates translations:

+
    +
  • Basque
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Croatian
  • +
  • Czech
  • +
  • Danish
  • +
  • Friulian
  • +
  • Galician
  • +
  • Hebrew
  • +
  • Indonesian
  • +
  • Korean
  • +
  • Lithuanian
  • +
  • Persian
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Russian
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Turkish
  • +
  • Ukrainian
  • +
+
+
+ + +

This is the second unstable release for GNOME 42.

+
    +
  • Allow --verbose to be enabled at runtime
  • +
  • Condense the rows in the age rating context dialog
  • +
  • Update the UI for ratings and reviews of apps
  • +
  • Improve the appearance of the category page loading screen
  • +
  • Drop the first run dialog
  • +
  • Improvements to dark theming
  • +
  • Support viewing a specific metainfo file using --show-metainfo
  • +
  • Several more threading improvements
  • +
  • Icon updates
  • +
  • Drop the hardcoded-popular plugin in favour of an appstream file
  • +
  • The background image for upgrades is now looked for using several + well-known (and distribution-specific) names in + ${DATADIR}/gnome-software/backgrounds, + and the previous Fedora-specific default background image is + no longer distributed. Similarly, the upgrade-background-uri + GSettings key has been removed. Distributions may need to + update how they ship background images. + See doc/vendor-customisation.md.
  • +
+

This release also updates translations:

+
    +
  • Chinese (China)
  • +
  • Galician
  • +
  • Hebrew
  • +
  • Icelandic
  • +
  • Indonesian
  • +
  • Japanese
  • +
  • Occitan (post 1500)
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Russian
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Ukrainian
  • +
+
+
+ + +

This is the first unstable release for GNOME 42.

+
    +
  • Various UI parts updated
  • +
  • Support more markup in the application description
  • +
  • Ask about package signature with PackageKit on signing issue
  • +
  • Show better System Update progress
  • +
  • Remove various cultural sensitivity badges
  • +
  • Fix a crash when processing age ratings
  • +
  • Reload application details only when not installing/removing the application
  • +
  • Do not follow symlinks when calculating disk size usage
  • +
  • Fix addons section, which could show addons for different application
  • +
  • Fix showing a ‘transaction in progress’ error when using the rpm-ostree plugin
  • +
  • Don’t recommend a reboot if firmware updates fail
  • +
  • Fix flathub repo being considered present on Fedora 35 with filtered flathub
  • +
  • Allow searching for extensions
  • +
  • Fix translation of main button on updates page
  • +
  • Fix codec installation process
  • +
  • Add new GNOME Circle apps to the featured carousel
  • +
  • Improve metadata support for snaps
  • +
  • Fix update checks being missed across suspend/hibernation
  • +
  • Ensure application lists are updated when repositories are enabled/installed or disabled/removed
  • +
+

This release also updates translations:

+
    +
  • Basque
  • +
  • Belarusian
  • +
  • Bulgarian
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Croatian
  • +
  • Dutch
  • +
  • English (United Kingdom)
  • +
  • Friulian
  • +
  • Galician
  • +
  • German
  • +
  • Hebrew
  • +
  • Icelandic
  • +
  • Indonesian
  • +
  • Latvian
  • +
  • Lithuanian
  • +
  • Occitan (post 1500)
  • +
  • Persian
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Russian
  • +
  • Serbian
  • +
  • Slovak
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Swedish
  • +
  • Turkish
  • +
  • Ukrainian
  • +
  • Vietnamese
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Instead of showing all package-based apps as "potentially unsafe", only use that language for 3rd party ones
  • +
  • Fix a bug where the "Show more" button on an app details page would flicker when the window is resized
  • +
  • Fix a bug where Software sometimes shows an Uninstall button after uninstalling something
  • +
  • Add GNOME Circle apps to the featured carousel
  • +
  • Fix a bug where Software would sometimes fail to execute an install/remove operation for PackageKit software rather than showing a PolicyKit password prompt
  • +
  • Fix a bug where Software would fail to upgrade the distribution via PackageKit
  • +
  • Fix the hiding of rows on the Updates tab after they have been updated
  • +
+

This release also updates translations:

+
    +
  • Basque
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Croatian
  • +
  • Czech
  • +
  • Danish
  • +
  • Dutch
  • +
  • Finnish
  • +
  • French
  • +
  • Galician
  • +
  • German
  • +
  • Hungarian
  • +
  • Indonesian
  • +
  • Korean
  • +
  • Lithuanian
  • +
  • Occitan (post 1500)
  • +
  • Polish
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Romanian
  • +
  • Russian
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Swedish
  • +
  • Ukrainian
  • +
+
+
+ + +

This is the third unstable release for GNOME 41.

+
    +
  • Tweaks to the context tiles and dialogs
  • +
  • Fixes to the details page for non-desktop apps
  • +
  • Re-add support for the add-ons categories
  • +
  • Sort new and updated apps by release date on the category page
  • +
+

This release also updates translations:

+
    +
  • Basque
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Chinese (Taiwan)
  • +
  • Croatian
  • +
  • English (United Kingdom)
  • +
  • Finnish
  • +
  • Galician
  • +
  • Indonesian
  • +
  • Kazakh
  • +
  • Korean
  • +
  • Lithuanian
  • +
  • Occitan (post 1500)
  • +
  • Persian
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Swedish
  • +
  • Ukrainian
  • +
+
+
+ + +

This is the second unstable release for GNOME 41.

+
    +
  • Many parts of the user interface reworked
  • +
  • Fix when the 'Launch' button is shown after an application install
  • +
  • Fix appstream:// URL handling
  • +
  • Fix application freeze on Flatpak application install/remove/update
  • +
  • Disable automatic update downloads when in power saver mode
  • +
+

This release also updates translations:

+
    +
  • Belarusian
  • +
  • Bulgarian
  • +
  • Catalan
  • +
  • Friulian
  • +
  • Galician
  • +
  • German
  • +
  • Greek, Modern (1453-)
  • +
  • Occitan (post 1500)
  • +
  • Persian
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Slovenian
  • +
  • Ukrainian
  • +
+
+
+ + +

This is the first unstable release for GNOME 41.

+
    +
  • Many parts of the user interface reworked
  • +
  • Improve error reporting from flatpak when low on disk space
  • +
  • Fix issues with updating the UI when uninstalling apps with add-ons
  • +
  • Don’t keep rpm-ostreed alive forever
  • +
  • Prevent polkit checks showing up for background operations
  • +
  • Disallow submitting reviews for an app you haven’t installed
  • +
  • Show download size in the Updates page
  • +
  • Notify when restart is needed when uninstalling an app
  • +
  • Fix some issues with searches not running
  • +
  • Allow non-integer average star ratings for apps
  • +
  • Reduce number of categories in the UI
  • +
  • Improve ‘pending updates’ notifications
  • +
  • Refine presentation of download and installed size on details page
  • +
  • Remove left over gnome-online-account dependencies
  • +
+

This release also updates translations:

+
    +
  • Basque
  • +
  • Belarusian
  • +
  • Bokmål, Norwegian
  • +
  • Catalan
  • +
  • Chinese (China)
  • +
  • Chinese (Taiwan)
  • +
  • Czech
  • +
  • Dutch
  • +
  • English (United Kingdom)
  • +
  • Finnish
  • +
  • Friulian
  • +
  • German
  • +
  • Greek, Modern (1453-)
  • +
  • Hebrew
  • +
  • Italian
  • +
  • Lithuanian
  • +
  • Nepali
  • +
  • Occitan (post 1500)
  • +
  • Persian
  • +
  • Polish
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Romanian
  • +
  • Russian
  • +
  • Serbian
  • +
  • Spanish
  • +
  • Swedish
  • +
  • Ukrainian
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix handling of invalid or incomplete application icons
  • +
  • Fix the plugin documentation to reflect reality
  • +
  • Fix the Snap plugin to actually load icons
  • +
  • Set download size to 0 after the package is downloaded
  • +
+

Translation updates:

+
    +
  • British English
  • +
  • Danish
  • +
  • Greek
  • +
  • Italian
  • +
  • Norwegian Bokmål
  • +
  • Polish
  • +
  • Punjabi
  • +
  • Serbian
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • Implement new featured apps carousel.
  • +
  • List of Flatpak repositories is updated when changed using the Flatpak command line tool.
  • +
  • The loading page now shows the full color icon instead of the symbolic one.
  • +
  • Show release date in version history for releases that use the 'date' attribute.
  • +
  • Improved icon handling, including with hiDPI screens.
  • +
  • Fixed a bug in remembering when update notifications were shown.
  • +
  • Build as a dynamic rather than a static library, and rearrange installation paths.
  • +
+

Translation updates:

+
    +
  • Basque
  • +
  • Catalan
  • +
  • Croatian
  • +
  • Czech
  • +
  • Dutch
  • +
  • English (United Kingdom)
  • +
  • Finnish
  • +
  • French
  • +
  • Friulian
  • +
  • Galician
  • +
  • German
  • +
  • Hungarian
  • +
  • Indonesian
  • +
  • Kazakh
  • +
  • Korean
  • +
  • Lithuanian
  • +
  • Persian
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Romanian
  • +
  • Serbian
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Swedish
  • +
  • Turkish
  • +
  • Ukrainian
  • +
+
+
+ + +

This is an unstable release with the following changes:

+
    +
  • GNOME Software now uses libappstream instead of libappstream-glib to work with appstream data which provides information about apps and other components.
  • +
  • App details pages show version history information when it's available.
  • +
  • The loading page now shows the full color icon instead of the symbolic one.
  • +
  • UI elements for displaying app add-ons have been tweaked to more closely match the designs.
  • +
  • Installed icons and the badge showing the number of updates available were changed back to blue from green.
  • +
  • The dropdown showing the available sources of an application includes the packaging format (e.g. Flatpak vs RPM).
  • +
  • A bug was fixed that prevented installation of .flatpakref files
  • +
+

Translation updates:

+
    +
  • Catalan
  • +
  • Czech
  • +
  • Galician
  • +
  • Indonesian
  • +
  • Panjabi
  • +
  • Portuguese
  • +
  • Slovenian
  • +
  • Spanish
  • +
  • Swedish
  • +
+
+
+ + +

This is the first unstable release for GNOME 40.

+
    +
  • Small updates to how app descriptions and addons are presented on the details page
  • +
  • Fix handling of pending app installations when going online
  • +
  • Better support for dark themes (particularly Adwaita-Dark)
  • +
  • Improvements to how app screenshots are loaded and presented
  • +
  • Hide ‘Launch’ button if an application (for example, Wine) cannot be launched
  • +
  • Make the UI clearer when loading information from flatpakref files
  • +
  • Don’t update app metadata on start when download-updates is disabled
  • +
  • Fix opening the updates list when clicking on an updates notification
  • +
  • Fix state updates when installing flatpak apps or repos which are already installed
  • +
  • Add Ctrl+Q as a keyboard shortcut for closing the window
  • +
  • Rework timing and content of software update notifications
  • +
  • Prevent uninstalled local apps from appearing in the installed apps list
  • +
  • Support installation/uninstallation of addons for flatpak apps
  • +
  • Improve presentation of age ratings for apps
  • +
  • Fix a crash in the updates page
  • +
  • Fix presentation of app permissions for fully sandboxed flatpak apps
  • +
  • Fix deadlock on rpm-ostree systems
  • +
  • Fix presentation of version number changes in right-to-left locales
  • +
  • Error handling improvements for fwupd
  • +
  • Performance improvements for ODRS on startup
  • +
  • Improve presentation of firmware warning messages
  • +
  • XML parsing performance improvements
  • +
  • Automatically remove end-of-life flatpak runtimes
  • +
  • Support updating flatpaks to their new name when they are renamed
  • +
  • Update the GNOME Software icon
  • +
  • Support more search results in the snap store
  • +
  • Drop libgnome-desktop-3 dependency in favour of gsettings-desktop-schemas
  • +
+

This release also updates translations:

+
    +
  • Basque
  • +
  • Bokmål, Norwegian
  • +
  • Catalan
  • +
  • Chinese (Taiwan)
  • +
  • Czech
  • +
  • Friulian
  • +
  • Galician
  • +
  • German
  • +
  • Greek, Modern (1453-)
  • +
  • Hebrew
  • +
  • Indonesian
  • +
  • Italian
  • +
  • Kabyle
  • +
  • Kazakh
  • +
  • Latvian
  • +
  • Lithuanian
  • +
  • Persian
  • +
  • Portuguese
  • +
  • Portuguese (Brazil)
  • +
  • Romanian
  • +
  • Slovak
  • +
  • Spanish
  • +
  • Turkish
  • +
  • Ukrainian
  • +
  • Vietnamese
  • +
+
+
+ + +

This is an unstable stable release with the following changes:

+
    +
  • Add sysprof support for profiling jobs
  • +
  • Add webflow and basic auth support to flatpak plugin
  • +
  • Coalesce refresh operations where possible
  • +
  • Correctly mark layered rpm-ostree local packages as removable
  • +
  • Fix flatpak bundle installation
  • +
  • Handle invalid snap auth data
  • +
  • Improve flatpak progress reporting for transactions
  • +
  • Improve the heuristic for detecting old-style AppStream override files
  • +
  • Many performance improvements in many areas of the code
  • +
  • Only delete the firmware archive if we downloaded it to the cache
  • +
  • Show a pulsing progress bar if progress is unknown
  • +
  • Support loading appstream files from custom install prefix
  • +
  • Use the runtime fwupd version for the user agent
  • +
+

This release also updates existing translations.

+
+
+ + +

This is the first stable release for GNOME 3.36.

+
+
+ + +

This is an unstable stable release with the following changes:

+
    +
  • Fix crash when viewing application details
  • +
  • Fix “thrice daily” check running every 3 days
  • +
  • Improve the appearance of the front page banners
  • +
  • Show the correct upgrade banner contents when a reboot is requried
  • +
+

This release also updates existing translations.

+
+
+ + +

This is an unstable stable release with the following changes:

+
    +
  • Add an info bar about automatic updates
  • +
  • Avoid rpm-ostree downgrade error when doing distro upgrade
  • +
  • Click on stars to open review dialog in the details view
  • +
  • Fix loading of icons from AppStream YAML
  • +
  • Fix weird font sizes in the batter
  • +
  • Hide any in-app notifications when closing the main window
  • +
  • Integrate better with snapd
  • +
  • Only ignore flatpak estimated progress if >10%
  • +
  • Remove color stripes on categories in the Explore page
  • +
  • Remove support for Shell extensions
  • +
  • Remove webapp support
  • +
  • Reset star rating when loading an unrated app
  • +
  • Sort applications using locale based algorithms
  • +
  • Stop snaps from being automatically updated
  • +
+

This release also adds and updates existing translations.

+
+
+ + +

This is an unstable stable release with the following changes:

+
    +
  • Add missing OARS content rating descriptions
  • +
  • Add new plugin for restricting access to apps
  • +
  • Avoid a UI crash when switching modes
  • +
  • Build libmalcontent dependency on Fedora CI
  • +
  • Correctly distinguish empty content ratings from missing ones
  • +
  • Correctly set the application state if autoupdate is in progress
  • +
  • Do not show a crazy error when installing packages
  • +
  • Do not show non-applications in the installed panel
  • +
  • Download Flatpak updates in the correct installation
  • +
  • Expose snap channels as app alternates
  • +
  • Fix a crash on 32-bit systems
  • +
  • Fix langpacks autoinstall on Fedora SilverBlue
  • +
  • Fix manual detach when updating removable device firmware
  • +
  • Fix third party repo enabling not working
  • +
  • Hide add/remove shortcut buttons for parentally filtered apps
  • +
  • Improve some front page banners
  • +
  • Invalidate caches when adding or removing remotes
  • +
  • Make flatpak more thread-safe to fix some crashes
  • +
  • Match the exact ID when refining a wildcard
  • +
  • Only set the app row's buttons as destructive when they remove an app
  • +
  • Remove hardcoded-featured plugin
  • +
  • Remove the app folder functionality as this is now built-in to the shell
  • +
  • Remove the banner editor as this is now an app on it's own
  • +
  • Rework age ratings handling to avoid hard-coded list
  • +
  • Set the shell extension origin correctly in all cases
  • +
  • Show the channel for snaps
  • +
  • Speed up the flatpak plugin in some situations
  • +
  • Use plugin API to launch apps from install notification.
  • +
+

This release also adds and updates existing translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Add a link to the privacy policy in the review dialog
  • +
  • Add and improve many overview banners
  • +
  • Add support for download scheduling using Mogwai
  • +
  • Allow installing locale data automatically
  • +
  • Allow snaps to be shown by AppStream ID
  • +
  • Don't apply drop shadow on stock symbolic icons
  • +
  • Don't install queued apps when the network changes and is metered
  • +
  • Fix the 'localised in my language' kudo
  • +
  • Hide addons that are not available in repos
  • +
  • Localize ESRB content rating strings
  • +
  • Never show the installation progress bar going backwards
  • +
  • Notify the user when an application can escape the sandbox
  • +
  • Refactor screenshots and hide those unavailable when offline
  • +
  • Select the rating systems selected based by territory
  • +
  • Use smaller default size for main window when required
  • +
+

This release also adds and updates existing translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix an issue that led to some packages with multiple appdata files not correctly showing up on the updates page
  • +
  • Fix various problems with flatpak branch handling that were causing issues with freedesktop.org runtime updates
  • +
  • Fix flatpak update versions to correctly show up
  • +
  • Various other minor bug fixes
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Add missing XbSilo locking, hopefully fixing a large number of reported crashes
  • +
  • Fix a regression that caused the fonts category to go missing
  • +
  • Show a placeholder on the details page when we don't have the actual icon
  • +
  • Plug a large memory leak
  • +
  • Use nicer arrows for version numbers on the updates page
  • +
  • Fix an issue that led to screenshots not being correctly scaled on hidpi
  • +
  • flatpak: Fix several double-uses of GErrors
  • +
  • flatpak: Handle failure of a libflatpak function updating permissions
  • +
  • rpm-ostree: Implement what-provides decompose
  • +
+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Avoid showing a review more than once
  • +
  • Correctly update progress bar when downloading packagekit distro upgrades
  • +
  • Fix a crash when closing the updates dialog before the content has loaded
  • +
  • Fix CTRL+F not working right in certains conditions
  • +
  • Set 022 umask to make sure flatpak system helper process can read the files we've written
  • +
  • rpm-ostree: Implement getting the repo list, and enabling and disabling repos
  • +
  • rpm-ostree: Implement provides search
  • +
  • rpm-ostree: Make layered apps not discoverable in the UI
  • +
  • Various other minor bug fixes
  • +
+

This release also updates translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Add drop shadows to app icons
  • +
  • Various fixes to initial loading screen
  • +
  • Show a generic icon instead of empty space if we failed to load the app icon
  • +
  • Update featured banners for Maps and Blender
  • +
  • Update featured app IDs
  • +
  • Fix a crash due to missing locking
  • +
  • Fix missing back button under certain conditions
  • +
  • Fix loading AppSteam data from .yml.gz files
  • +
  • Fix an issue that caused flatpak repo to not be correctly shown when it matched an existing packagekit repo name
  • +
  • Hide the fwupd Vendor repo in the repos dialog
  • +
+

This release also updates translations.

+
+
+ + +

This is the first stable release for GNOME 3.32. Notable changes compared to 3.30 include:

+
    +
  • Appstream parsing is completely rewritten and now uses the new libxmlb library, instead of appstream-glib
  • +
  • Improved handling for apps that are available from multiple sources, e.g. as a flatpak from Flathub, as a flatpak from Fedora, and as an RPM package
  • +
  • New source selection drop down on the details pages
  • +
  • Flatpak apps now list the permissions they need on the details pages, and also show new permissions when updating
  • +
  • The flatpak backend received a large number of bug fixes
  • +
  • The rpm-ostree backend has grown many new features and bug fixes, including support for installing layered packages and doing distro upgrades
  • +
  • Numerous fixes for error reporting, including making error messages more useful and avoiding showing network errors from background operations
  • +
  • The items in the app menu were all moved to the window menu
  • +
  • New redesigned icon
  • +
+
+
+ + +

This is an unstable release in the 3.31 development series, marking the end of the development cycle. Next release will be 3.32.0!

+
    +
  • Add two missing description strings for flatpak permissions
  • +
  • Only show permissions for flatpak apps and not for e.g. fonts
  • +
  • Fix flatpak permissions to correctly show up for available apps
  • +
  • Hide various details page items that don't make sense when showing .flatpakrepo files
  • +
  • Fix an issue that caused descriptions to sometimes not get correctly loaded
  • +
  • Sort the items in the Source drop down
  • +
  • Don't show error notifications for background download and refresh errors
  • +
  • Fix an issue that could cause an explosion of "A restart is required" notifications
  • +
  • Various flatpak plugin fixes to make it correctly match the data when multiple flatpak repos are available
  • +
  • Fix the rpm-ostree plugin to correctly convert remote dbus errors
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.31 development series, with the following improvements:

+
    +
  • Fix showing the installed check mark on tiles
  • +
  • Fix crashes in the packagekit plugin due to missing locking
  • +
  • Add back support for appstream data in /var/{cache,lib}/app-info directories that accidentally got left out with the libxmlb rewrite
  • +
  • Update the featured banner for gnome-chess
  • +
  • Fix the details page alignment when only one screenshot is shown
  • +
  • Move the Update button to the right hand side on the details page
  • +
  • Fix enabling repos when installing codecs through the extras page
  • +
  • Remove the Sundry folder and sync the apps in the Utilities folder with gnome-menus 3.31.90
  • +
  • Improve various content rating texts
  • +
  • Drop workarounds for locales with codesets
  • +
  • Use the currently selected icon theme for stock icons
  • +
  • Don't hide compulsory apps in the category views
  • +
  • Use the SPDX-License-Identifier in all source files
  • +
  • Remove various useless error prefixes, making flatpak and packagekit error messages shorter and easier to read
  • +
  • flatpak: Show the installation type (user, system) in the Source dropdown
  • +
  • flatpak: Let apps control the name suffix/prefix they have and don't force (Nightly) suffix for everything on the master branch
  • +
  • flatpak: Various fixes for matching flatpaks to appstream entries
  • +
  • flatpak: Distinguish between the same app coming from multiple remotes
  • +
  • rpm-ostree: Correctly resolve installed appdata files to package names
  • +
  • rpm-ostree: Hook up percentage progress for install and remove
  • +
  • rpm-ostree: Implement layered package install
  • +
  • rpm-ostree: Implement locally downloaded rpm install
  • +
  • rpm-ostree: Show the source of the packages when installing layered packages
  • +
  • rpm-ostree: Various fixes making things more robust
  • +
  • snap: Use new media API
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.31 development series, with the following improvements:

+
    +
  • Show permissions for installed flatpaks, and new permissions for updates
  • +
  • Use libxmlb to parse AppStream XML, making gnome-software start up faster and use less memory
  • +
  • Update the app icon
  • +
  • Update categories for ESRA rating system
  • +
  • Improve various error messages to have more details
  • +
  • Fix an issue that caused incorrect version numbers to be shown for installed flatpaks
  • +
  • Fix various thread safety related crashes
  • +
  • Fix row unrevealing to not leave behind 2 pixels on the updates page
  • +
  • Make the refresh button to actually refresh packagekit cache
  • +
  • Fix various issues that could lead to cache refresh getting stuck
  • +
  • Show updates available notifications even when automatic updates are disabled
  • +
  • Fix counting apps in the updates applied notification
  • +
  • Improve packagekit update loading code, hopefully making it more robust
  • +
  • Fix an issue that could lead to the packagekit plugin activating on rpm-ostree based systems
  • +
  • Switch flatpak updates to use a single transaction, which lets us share more code (and bugs) with the command line flatpak utility
  • +
  • Fix various issues with transitioning from the "Download" state to "Restart & Update"
  • +
  • Don't error out from update downloads if the ODRS server is unavailable
  • +
  • Fix old updates accumulating in the OS Updates item
  • +
  • Various flatpakref installation fixes
  • +
  • Fix opening the details page when clicking on "Show Details" in GNOME Shell
  • +
  • Fix opening shell extensions details from GNOME Tweaks
  • +
  • Various fixes for initial loading state
  • +
  • Add a separate "Download" step for packagekit offline updates, so that "Restart & Update" is instant
  • +
  • Fix a version comparison issue that led to package updates sometimes showing as downgrades in the OS Updates section (this needs latest appstream-glib)
  • +
  • Show the refresh button when the updates page is in the failed state
  • +
  • Notify about offline updates only after they are fully downloaded
  • +
  • Fix a memory corruption issue on 32-bit arches that made gnome-software very crashy
  • +
  • Fix an issue with stuck back button on the details page after closing and reopening gnome-software
  • +
  • Make distro upgrades to Fedora N+2 release show up correctly
  • +
  • Various flatpak plugin fixes
  • +
  • Allow opening CAB files that include more than one update
  • +
  • Fix critical warnings when quickly switching between category pages
  • +
  • Small memory leak fixes
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.31 development series, with the following improvements:

+
    +
  • Icon redesign
  • +
  • Switch to using window menus instead of app menu
  • +
  • Add a source selection drop down to details pages
  • +
  • Move the search button to the left side in the header bar
  • +
  • Various other minor UI tweaks
  • +
  • GtkBuilder UI file changes to pave the way for an eventual GTK4 port (please file issues for any UI layout regressions if you notice any!)
  • +
  • Various internal plugin loader fixes and cleanups
  • +
  • Remove the steam plugin
  • +
  • Simplify the details page loading
  • +
  • Fix an issue that caused icons to not get loaded for locally installed flatpaks
  • +
  • Update Fedora distro upgrades text
  • +
  • Avoid a critical warning in the fwupd plugin when the device vendor is not set
  • +
  • Show verified developers for snaps
  • +
+

This release also updates translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Localize the polkit policy file
  • +
  • Display ongoing app-installation at top of the list
  • +
  • Update apps in display order
  • +
  • Fix autoupdates triggering in a feedback loop
  • +
  • Tweak the prefs dialog layout
  • +
  • Various fixes to the flatpak plugin, making its state keeping more robust
  • +
  • Fix flatpak errors to show up instead of a generic "Aborted" error
  • +
  • Avoid triggering reboots for online updatable apps (flatpak)
  • +
  • Make rpm-ostree updates work again
  • +
  • Fix an issue that caused duplicate lines in 'OS Updates' on rpm-ostree based systems
  • +
  • Compiler warning fixes
  • +
+

This release also updates translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix an issue that caused duplicate lines in 'OS Updates'
  • +
  • Filter the application restart notification to actual desktop apps
  • +
  • Fix an issue that caused automatic updates to fail during download phase
  • +
  • Avoid showing duplicates in the featured apps when an app is available as both flatpak and a package
  • +
  • Fix an issue that caused gnome-software to use 100% of CPU when doing automatic updates
  • +
  • Lower IO priority for gnome-software so that other apps stay responsive during flatpak installs
  • +
  • Various fixes and wording changes to automatic updates notifications
  • +
  • Only show "Examine Disk" button when baobab is available
  • +
  • Leak and correctness fixes in the snap plugin
  • +
+

This release also updates translations.

+
+
+ + +

This is the first stable release for GNOME 3.30.

+
+
+ + +

This is an unstable release in the 3.27 development series, with the following improvements:

+
    +
  • Do not go 'back' to a previous application details panel
  • +
  • Don't crash if when getting the fwupd locked status
  • +
  • Download updates automatically when required
  • +
  • Fix dark theme support
  • +
  • Hide screenshot and support widgets when no screenshots
  • +
  • Ignore non-interactive generic errors
  • +
  • Implement distro upgrade downloading when using rpm-ostree
  • +
  • Only update the update check timestamp when it succeeds
  • +
  • Open the WiFi panel when clicking the Network Settings button
  • +
  • Rotate featured apps on the overview page
  • +
  • Simplify the updates panel
  • +
  • Use FlatpakTransaction to install, remove and update
  • +
  • Use new display name for the Snap publisher
  • +
  • Use the full name for the ESRB ratings descripion
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.27 development series, with the following improvements:

+
    +
  • Show a better notification when a local file or URI is not supported
  • +
  • snap: Use ODRS for reviews
  • +
+

This release also updates translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Add a warning when enabling the LVFS remote
  • +
  • Show a notification when failing to open an url or a local file
  • +
  • Fix multiple flatpak refreshes with new libflatpak
  • +
  • Build fixes for FreeBSD
  • +
  • Icon loading fixes for snap
  • +
+

This release also updates translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix a regression with opening results from gnome-shell search
  • +
  • Show "Source: " tag in gnome-shell search when we have multiple matches
  • +
  • Improve unknown license tag color scheme on details page
  • +
  • Don't show installed icon on app tiles while still installing
  • +
  • Fix empty items appearing under OS Updates
  • +
  • Fix a regression that caused duplicate results in codec search
  • +
  • Fix an issue with passing username/password to packagekit proxy
  • +
  • Avoid crashing during first run with no network access
  • +
  • A number of rpm-ostree fixes, making it possible to trigger offline updates
  • +
  • Stop searching multiple times on search page
  • +
  • Update Fedora third party repositories "Find out more..." link
  • +
  • Fix an issue with in-app notifications failing with invalid markup errors
  • +
  • Improve purchase failure handling for the snap store
  • +
  • Fix a possible crash in snap plugin when adding screenshots
  • +
  • Various other crash and correctness fixes
  • +
+

This release also updates translations.

+
+
+ + +

This is the first stable release for GNOME 3.28, with the following improvements:

+
    +
  • Fix the build on NixOS
  • +
  • Fix purchasing not working after authentication
  • +
  • Revert a commit that led to flatpak updates failing without any feedback
  • +
  • Make front page featured tile corners round to match other tiles
  • +
  • Fix in-app notification close button alignment
  • +
  • Several fixes to make error notifications more useful
  • +
  • snap: Fix invalid metadata after cancelled refine
  • +
  • snap: Launch command line snaps with 'snap run'
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.27 development series, marking the end of the development cycle. Next release will be 3.28.0!

+
    +
  • Removal of global plugin cache, simplifying gnome-software internals
  • +
  • Software Repositories dialog got another batch of improvements and UI changes
  • +
  • GNOME Shell Extensions repository and fwupd repositories are now shown in the Software Repositories dialog
  • +
  • Shell extensions handling through PackageKit was improved, fixing a long standing bug where we were unable to remove shell extension packages
  • +
  • Category page rewrite that landed earlier this cycle went through UI review and got a number of fixes
  • +
  • Package version comparison in the updates dialog was fixed and should no longer incorrectly show updates as downgrades
  • +
  • Distro upgrade notifications are now rate limited to once per week
  • +
  • Install buttons in codec install view that got lost in the 3.22 cycle are now back
  • +
  • Various paper cuts with distro upgrades were fixed
  • +
  • Various fixes to installing apps from yum repos that have enabled=0 enabled_metadata=1
  • +
  • Various other correctness and warning fixes
  • +
  • Distros: Minimum supported fwupd version is now 1.0.3
  • +
  • Distros: We've released PackageKit 1.1.9 that has string changes to match gnome-software 3.28
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.27 development series, with the following improvements:

+
    +
  • The Software Sources dialog was renamed to Software Repositories and rewritten
  • +
  • Fedora Workstation third party repository handling was rewritten and should be more robust
  • +
  • Improved handling of metered network connections, making sure we cancel any downloads when changing to a metered connection
  • +
  • Limit the number of parallel operations depending on the installed CPU
  • +
  • Improved handling of pending installs when there's no network connection
  • +
  • Unused ostree and rpm plugins were dropped
  • +
  • Switch from GtkSpell to gspell
  • +
  • Improve alignment on the updates page
  • +
  • Do not show missing screenshot error for fonts that have screenshots
  • +
  • Fix various issues on Ubuntu when purchasing apps
  • +
  • Fix an issue that led to duplicate categories appearing on the overview page
  • +
  • Various memory leak and correctness fixes
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.27 development series, with the following improvements:

+
    +
  • Add missing locking to gs_plugin_cache_remove(), fixing a possible crash
  • +
  • Fix various memory leaks spotted by valgrind
  • +
  • Fix a possible crash triggered by the fwupd plugin
  • +
  • Do not emit critical warnings when reviewing OS Updates
  • +
  • fwupd: Use the custom user-agent when downloading firmware
  • +
  • overview page: Fix a crash when we have no featured apps
  • +
  • packagekit: Implement repository enabling
  • +
  • Fix hover CSS for "unknown" and "nonfree" license buttons
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.27 development series, with the following improvements:

+
    +
  • Fix crashes in the repos plugin due to missing locking
  • +
  • Add translated strings for the new OARS v1.1 additions
  • +
  • Work around Firefox deleting rpm/deb files downloaded to /tmp when closing
  • +
  • Log errors to console when starting from command line
  • +
  • Do not enable distro-upgrades when updates are disabled
  • +
  • Do not require the user to keep clicking 'More reviews' after each click
  • +
  • Fix a critical when updating (flatpak) packages live
  • +
  • fwupd: Do not crash when trying to list a locked device
  • +
  • fwupd: Prepend the vendor name to the device name if not included
  • +
  • Improve SPDX ID parsing when working out if it is 'free'
  • +
  • packagekit: Do not crash when getting an invalid ID from PackageKit
  • +
  • packagekit: Support apt:// URLs
  • +
  • Various fixes to the snap plugin
  • +
  • Do not crash when closing the source dialog while it is loading
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.27 development series, with the following improvements:

+
    +
  • Redesigned category view
  • +
  • Better notifications for completed distro upgrades
  • +
  • Number of test suite fixes to pave way for continuous integration tests
  • +
  • Improved support for running on low res displays
  • +
  • Various fixes to internal state handling
  • +
  • Allow linking to specified proprietary licenses
  • +
  • Don't use versioned subdirectories under ~/.cache/gnome-software
  • +
  • Only show in-app notifications for interactive user actions
  • +
  • Various fixes for flatpak, fwupd, and snap support
  • +
+

This release also updates translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Various fixes to cancellable handling, making it more robust to cancel install/remove operations
  • +
  • Fix a common crash in Fedora distro upgrades plugin
  • +
  • Fix showing N+2 Fedora upgrades
  • +
  • Fix flatpak updates inadvertently triggering a reboot
  • +
  • Revert plugin GType registering changes that broke app "adopting"
  • +
  • Various flatpak plugin fixes
  • +
  • Various snap plugin fixes
  • +
  • Bump fwupd required dep to 0.9.7 and support building with new 1.0.0 API
  • +
  • Avoid erroring out for operations that return more than 500 results (distro upgrades, getting gnome-shell extensions list)
  • +
  • Fix a few memory leaks
  • +
+

This release also updates translations.

+
+
+ + +

This is a stable release with the following changes:

+
    +
  • Fix memory leak in "external appstream" plugin
  • +
  • Don't translate an icon name in the Punjabi translation
  • +
  • Fix critical warning in the fwupd plugin if the update URI isn't set
  • +
  • Fix Addon categories not showing
  • +
  • Fix crash in PackageKit plugin if reporting progress with no current application
  • +
  • Revert a change in the snapd plugin which can cause operations to fail or hang in some situations
  • +
+

This release also updates translations.

+
+
+ + +

This is the first stable release for GNOME 3.26, with the following improvements:

+
    +
  • Use the new fwupd API in 0.9.7 to avoid when a reboot is required
  • +
  • Pass the complete proxy settings to PackageKit
  • +
+

The following bugs are also fixed:

+
    +
  • Do not crash when emitting an uncommon error message
  • +
  • Do not show a critical warning with new versions of fwupd
  • +
  • Do not show an error for a remote-less flatpakref application
  • +
  • Don't refine PackageKit packages after we've been cancelled
  • +
  • Fix a possible crash on 32 bit systems
  • +
  • Fix GNOME Shell search results for snap applications
  • +
  • Properly disable shell-extensions when not running GNOME Shell
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.25 development series, with the following improvements:

+
    +
  • Add a simple donation button on the details page
  • +
+

The following bugs are also fixed:

+
    +
  • Allow plugins to say that installation cannot be cancelled
  • +
  • Fix displaying the info bar for the Shell Extensions category
  • +
  • Use first featured snap as the featured app
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.25 development series, with the following improvements:

+
    +
  • Add a simple donation button on the details page
  • +
+

The following bugs are also fixed:

+
    +
  • Do not crash if the child schema is invalid
  • +
  • Don't log a warning when clicking the the 'more results' search entry
  • +
  • Fixed subcategory names localization
  • +
  • Ensure flatpak remote names are valid
  • +
  • Fix critical warning with new versions of the fwupd daemon
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.25 development series, with the following improvements:

+
    +
  • Add new rpm-ostree integration for Fedora Atomic Workstation
  • +
  • Install the Flatpak runtime as part of the application install phase
  • +
  • Split OS updates up into multiple sections and show the target version
  • +
  • Support compatibility IDs when getting reviews from the ODRS
  • +
+

The following bugs are also fixed:

+
    +
  • Cancel plugin jobs if they take too much time
  • +
  • Correctly find already installed flatpak runtimes
  • +
  • Do not show an error for a flatpakref when broken remotes exist
  • +
  • Don't show the screenshot section for runtimes
  • +
  • Fix authentication prompt not showing when using snapd
  • +
  • Make license buttons buttons actually look clickable
  • +
  • Make the review moderator panel easier to use
  • +
  • Only show snaps as sandboxed if snapd supports confinement
  • +
  • Respect the per-user or per-system install preferences
  • +
  • Return the correct installed state for user/system flatpak remotes
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.25 development series, with the following improvements:

+
    +
  • Add a banner designer utility
  • +
  • Add the initial support to support purchasable apps
  • +
  • Automatically install flatpak icon themes and GTK themes
  • +
  • Restyle the updates panel to have a separate sections
  • +
  • Show a notification in the updates page when the OS is end of life
  • +
  • Show recently updated applications on the overview page
  • +
+

The following bugs are also fixed:

+
    +
  • Add snap self tests and provide more data to the details panel
  • +
  • Allow compiling with newer versions of meson
  • +
  • Do not crash when sending progress reports while refreshing
  • +
  • Don't trigger systemd for every single offline update
  • +
  • Ensure all related flatpak applications get installed
  • +
  • Ensure we use the gnome-desktop support if enabled
  • +
  • Fix searching for codecs on Ubuntu
  • +
  • Show a better status messages when downloading metadata
  • +
  • Show a pulsing progressbar if plugins do not report progress
  • +
  • Show the PackageKit interactive dialog when required
  • +
  • Support updating metadata from multiple fwupd remotes
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.25 development series, with the following improvements:

+
    +
  • Allow AppStream to be downloaded out-of-band per-user
  • +
+

The following bugs are also fixed:

+
    +
  • Do not initialize plugins in every instance
  • +
  • Fix the 'Show Details' context menu item in GNOME Shell
  • +
  • Use headerbar in toolbar-mode in Unity
  • +
  • Do not allow plugins to set the origin title in the UI
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.25 development series, with the following improvements:

+
    +
  • Truncate the search results if there are a large number
  • +
  • Use the complete source as a search keyword
  • +
+

The following bugs are also fixed:

+
    +
  • Fall back to a stock icon for hardware drivers
  • +
  • Fix a crash when removing an addon
  • +
  • Fix a critical warning in the shell search provider
  • +
  • Fix popular-overrides to show the correct applications
  • +
  • Fix various failures to read from snapd
  • +
  • Make offline updates work when online updates are available
  • +
  • Never include the size of the runtime in the installed size
  • +
  • Respect the install preference when for flatpakref files
  • +
  • Use the developer name in preference to the project group
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.23 development series, with the following bug fixes:

+
    +
  • Allow installing broken flatpakref files
  • +
  • Do not reload the updates list when updates are in progress
  • +
  • Reset the headerbar title when switching to the details page
  • +
  • Unconditionally show things that are in progress in the Installed page
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.23 development series, with the following improvements:

+
    +
  • Add support for RuntimeRepo in flatpakref files
  • +
  • Allow the user to restart the currently running gnome-software instance
  • +
  • Never show components without AppData files
  • +
+

The following bugs are also fixed:

+
    +
  • Initialize progress to zero right before and after processing an action
  • +
  • Animate the removal of live updates
  • +
  • Add YaST as a default folder in gnome-shell overview
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.23 development series, with the following improvements:

+
    +
  • Handle apt and snap URLs
  • +
  • Show the updates panel with sections
  • +
  • Sort the apps in the installed panel by kind
  • +
+

The following bugs are also fixed:

+
    +
  • Add a more detailed error message when AC power is required
  • +
  • Do not hardcode the gnome-software application name
  • +
  • Ensure firmware is downloaded when not cached
  • +
  • Fix a rather large memory leak when loading Steam data
  • +
  • Fix launching Flatpak apps after updating
  • +
  • Install needed Flatpak runtimes when updating an app
  • +
  • Only show the scary firmware warning for removable devices
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.23 development series, with the following improvements:

+
    +
  • Add an --install and --interaction CLI options
  • +
  • Add the installed size of the apps in the installed view
  • +
  • Always set a description for each notification
  • +
  • Show an in-app notification when installed plugins are changed
  • +
  • Use a set of stars to show the different star ratings
  • +
+

The following bugs are also fixed:

+
    +
  • Add a missing error check to fix a common crash on LiveDVD media
  • +
  • Add thread locking in GsApp to fix some common crashes
  • +
  • Allow upgrading to Fedora EOL releases
  • +
  • Don't allow review actions when offline
  • +
  • Ensure we actually schedule firmware updates for download
  • +
  • Fix the getting of PackageKit and flatpak update details
  • +
  • Hide some notifications when the new app is launched or the window is closed
  • +
  • Hide the screenshot placeholder for input methods and langpacks
  • +
+

This release also updates translations.

+
+
+ + +

This is an unstable release in the 3.23 development series, with the following improvements:

+
    +
  • Add a setting for downloading updates on metered connections
  • +
  • Add content rating interface for games
  • +
  • Add support for pending updates that are applied on demand
  • +
  • Add support for the flatpak DefaultBranch feature
  • +
  • Allow showing an application review without a display name
  • +
  • Convert the modal failure dialogs to in-app notifications
  • +
  • Switch to using the ODRS server hosted by GNOME
  • +
+

The following bugs are also fixed:

+
    +
  • Always get the newest screenshot for GNOME Shell extensions
  • +
  • Avoid redownloading the same screenshots for different images
  • +
  • Don't download updates when low on power
  • +
  • Fix the growth in memory usage for every search request
  • +
  • Never show a 'back' button when showing search results
  • +
  • Show the search bar when the user does ctrl+f
  • +
+

This release also updates translations.

+
+
+ + +

This stable release fixes the following bugs:

+
    +
  • Large number of fixes and improvements for flatpak support
  • +
  • Improved handling for flatpak repos with multiple branches
  • +
  • Initial support for installing flatpakrepo files
  • +
  • Fix a crash when searching for codecs
  • +
  • Fix a crash when de-duplicating applications
  • +
  • Speed improvements for loading appstream data
  • +
  • Refactor snapd handling code using snapd-glib
  • +
  • Show the search bar when the user does Ctrl+f
  • +
+

This release also updates translations.

+
+
+ + +

This stable release fixes the following bugs:

+
    +
  • Fix several issues with flatpak bundles
  • +
  • Fix installing local packages
  • +
  • Fix a crash when failing to get an installed flatpak ref
  • +
  • Speed up loading the details and overview pages
  • +
  • Switch to using the ODRS server hosted by GNOME
  • +
+

This release also updates translations.

+
+
+ + +

This is the first stable release for GNOME 3.22 and updates several translations.

+
+
+ + +

This is an unstable release in the 3.21 development series, with the following improvements:

+
    +
  • Add a new section name in the Addons category for drivers
  • +
  • Add a plugin to match a hardware modalias
  • +
+

The following bugs are also fixed:

+
    +
  • Do not hide the origin when installing or removing an app
  • +
  • Do not show the screenshot fallback image for firmware or drivers
  • +
  • Fix launching app's details from the installed notification
  • +
  • Fix showing the source line in the installed panel
  • +
  • Unbreak the GNOME Shell search provider
  • +
  • Use the same padding as a GtkStackSwitcher
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.21 development series, with the following improvements:

+
    +
  • Add functionality to enable non-free sources
  • +
  • Show the device bootloader screenshot when required
  • +
+

The following bugs are also fixed:

+
    +
  • Always return consistent results by allowing plugins to share a cache
  • +
  • Ensure the search text is showing when going back to search results
  • +
  • Only enable the firmware 'Install' button when the device is in the right mode
  • +
  • Remove an app from the installed view when it's uninstalled
  • +
  • Show percentage progress when installing firmware
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.21 development series, with the following improvements:

+
    +
  • Limit the ODRS moderation queue to a specific language
  • +
+

The following bugs are also fixed:

+
    +
  • Correctly load .flatpakrepo files
  • +
  • Don't get the download size for installed flatpak packages
  • +
  • Fix showing the progress bar when installing apps
  • +
  • Never try to modify the application name
  • +
  • Only notify about upgrades once per month
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.21 development series, with the following improvements:

+
    +
  • Add a cancel button and progress information to the details page
  • +
  • Add a dialog to confirm upgrade removals
  • +
  • Add support for authenticating in plugins
  • +
  • Add support for snaps
  • +
  • Enable gtk-doc generation for documentation
  • +
  • Show a new-style category list on the overview page
  • +
  • Show origin information when applications are available from multiple sources
  • +
  • Show sandboxing information for selected applications
  • +
  • Show the star ratings in more places
  • +
  • Support installing .flatpakrepo files
  • +
  • Support launching applicatins using a appstream:// URL
  • +
+

The following bugs are also fixed:

+
    +
  • Allow plugins to be enabled and disabled at runtime
  • +
  • Always show the 'MyLanguage' kudo when in en_US locale
  • +
  • Correctly trigger systemd offline updates when only processing OS updates
  • +
  • Disable app folders feature when run outside GNOME
  • +
  • Do not show buttons on the search results
  • +
  • Do not use deprecated CSS properties
  • +
  • Do not use deprecated fwupd API
  • +
  • Ensure reviews are shown in the correct order
  • +
  • Fix a crash when double clicking files
  • +
  • Fix several UX issues when upgrading
  • +
  • Show the 'More Reviews' button in the details panel
  • +
  • Try really hard to have two rows of important categories
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.21 development series, with the following improvements:

+
    +
  • Add a --details-pkg option to the gnome-software binary
  • +
  • Add support for flatpak packages
  • +
  • Add a plugin to auto-add some license information
  • +
  • Add depends, requires and conflicts at initialize time
  • +
  • Add support for application key colors
  • +
  • Export a set of headers to allow external plugins to be built
  • +
+

The following bugs are also fixed:

+
    +
  • Do not crash if plugins are badly behaved
  • +
  • Do not directly load pixbufs in the AppStream plugin
  • +
  • Do not unconditionally invalidate the updates list on hardware hotplug
  • +
  • Find the best AppSteam component when matching any prefixes
  • +
  • Fix crash due to network change before app activation
  • +
  • Fix launching various KDE4 applications
  • +
  • Support getting cached content from /var/cache and /usr/share
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.21 development series, with the following improvements:

+
    +
  • Add an initial loading panel when there is no metadata
  • +
  • Add an outline ostree plugin that just adds remotes as sources
  • +
  • Add an unreviewable application quirk
  • +
  • Add initial Steam support
  • +
  • Add support for app shortcut addition/removal
  • +
  • Add support for GNOME Shell extensions
  • +
  • Allow free-but-unspecified SPDX tokens
  • +
  • Allow widgets to use custom CSS in a generic way
  • +
  • Do the PackageKit refresh as a background transaction
  • +
  • Hide "Software Sources" menu when its action is disabled
  • +
  • Make the distro upgrades dialog match the new mockup
  • +
  • Split the 'size' property into size-installed and size-download
  • +
  • Use a link instead of a button for history
  • +
  • Use AppStream files for the popular, featured and extra category data
  • +
  • Use dpkg-deb info to create a GsApp when double clicking on a .deb file
  • +
  • Use FwupdClient from fwupd 0.7.0
  • +
  • Use GdkPixbuf to parse icns files
  • +
  • Use gsettings to enable/disable the 'sources' action
  • +
  • Use the Fedora themed image for the upgrade banner
  • +
  • When there are no trusted sources mark everything as non-3rd-party
  • +
+

The following bugs are also fixed:

+
    +
  • Actually show the error dialog for an invalid file
  • +
  • Allow all functions called by g_module_symbol() to fail
  • +
  • Allow popular and featured apps to match any prefix
  • +
  • Do not maintain a cache of applications in the plugin loader
  • +
  • Do not make the ODRS plugin depend on xdg-app
  • +
  • Do not re-request the distro-upgrade when switching pages
  • +
  • Do not show ratings and reviews for some component kinds
  • +
  • Do not show the distro-upgrade notification if the window is open
  • +
  • Do not use the header bar on Unity
  • +
  • Fix a crash when double clicking package files
  • +
  • Fix live installing firmware
  • +
  • Get the correct icon size when installing xdg-app bundles on HiDPI
  • +
  • Hide the kudo details panel for non desktop components
  • +
  • Load screenshots directly if their URLs point to local files
  • +
  • Lower the limits for review text
  • +
  • Make all the plugins more threadsafe
  • +
  • Make the provenance plugin non-specific to Fedora
  • +
  • Move header bar button creation into individual pages
  • +
  • Move the Install & Restart button below the upgrade banner
  • +
  • Never show star ratings on the category app tiles
  • +
  • Only show one modal dialog at a time
  • +
  • Only show the session manager restart if there were any non-live updates
  • +
  • Properly support multi-line .deb descriptions
  • +
  • Show a 'Install All' button when all the updates can be installed live
  • +
  • Show a modal dialog when downloading the distro-upgrade failed
  • +
  • Show the upgrades banner even if there are no updates to show
  • +
  • Use a cache file to respect the fedora-distro-upgrades cache-age
  • +
  • Use GFile instead of a filename when converting apps
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.19 development series, with the following improvements:

+
    +
  • Add an 'All' subcategory in the category shell
  • +
  • Add ratings and review functionality for Ubuntu
  • +
  • Install the xdg-app runtime as required automatically
  • +
  • Show a confirmation dialog before reporting a review
  • +
  • Show a guide label for the different star values
  • +
  • Support installing local xdg-app bundles
  • +
+

The following bugs are also fixed:

+
    +
  • Correctly identify local packages with sources
  • +
  • Do not add multiple search results for the same app
  • +
  • Do not show xdg-app runtimes in the installed panel
  • +
  • Escape markup before showing modal dialogs
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.19 development series, with the following improvements:

+
    +
  • Add end-user application review functionality
  • +
  • Add support for upgrading the OS from one release to another
  • +
  • Add support for xdg-app and Limba bundles
  • +
  • Add tags to applications, and explain them in the details page
  • +
  • Update the list of featured applications on the front page
  • +
+

The following bugs are also fixed:

+
    +
  • Add a missing tag to the software center metadata file
  • +
  • PackageKit support is now optional
  • +
  • Temporarily remove the remove button in the sources dialog
  • +
  • Use versioned user cache directories to pick up new screenshots
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.19 development series, with the following improvements:

+
    +
  • Add a link to Wikipedia to explain proprietary and public domain software
  • +
  • Allow administrators to override the default popular applications
  • +
  • Improve the interface for device firmware updates and some can be done live
  • +
  • Make sure Characters and Disks show up in Utilities
  • +
  • Show 3rd party applications in the search results
  • +
  • Show a nicer installation dialog when installing local files
  • +
  • Speed up the application first-start and also speed up switching pages
  • +
  • Try to show if an application is free software
  • +
+

The following bugs are also fixed:

+
    +
  • Do not crash on refresh if the fwupd daemon is not available
  • +
  • Fix installing web applications
  • +
  • Rework several windows to fit better on small screens
  • +
  • Use the correct user agent string when downloading firmware
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This stable release fixes the following bugs:

+
    +
  • Use the correct user agent string when downloading firmware
  • +
  • Fix a crash in the limba plugin
  • +
  • Fix installing web applications
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This stable release fixes the following bugs:

+
    +
  • Fix a regression that could lead to never finding any updates
  • +
  • Fix an issue with getting package details for apps without AppData
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This stable release fixes the following bugs:

+
    +
  • Do not force the cache refresh and delete otherwise valid packages
  • +
  • Fix several potential crashes when navigating and when installing
  • +
  • Get the new application icon for local packages after installation
  • +
  • Improve cold start time by only parsing AppStream data once
  • +
  • Make sure Characters and Disks show up in Utilities
  • +
  • Only download the fwupd metadata signature once per day
  • +
  • Show an empty space for no category results
  • +
  • Show applications without AppData in the installed panel
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is the first stable release for the GNOME 3.18 desktop!

+
+
+ + +

This is an unstable release in the 3.17 development series, with the following improvements:

+
    +
  • Fix getting firmware updates by parsing the metadata correctly
  • +
  • Make the application menu path correct in RTL locales
  • +
  • Don't keep the application running forever when run as a search provider
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.17 development series, with the following improvements:

+
    +
  • Better theming for the category sidebar
  • +
  • Use standard size icon in the about dialog
  • +
  • Support mouse back button for going back in dialogs
  • +
  • Fix incorrect alignment on the front page in RTL languages
  • +
  • Misc other minor bugs fixed
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release with the following bugs fixed:

+
    +
  • Use CSS to style the error message details
  • +
  • Correctly align labels in the Add to Folder dialog
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.17 development series, with the following improvements:

+
    +
  • Add basic support for Limba bundles
  • +
  • Automatically download new firmware metadata from LVFS
  • +
  • Hide updates UI on managed systems
  • +
  • Show a new notification when security updates remain unapplied
  • +
  • Show installation progress when installing applications
  • +
  • Use some new applications to the picked category
  • +
+

Bugs fixed in this release:

+
    +
  • Do not show applications that are not available when searching by category
  • +
  • Don't crash when launching an app that has no desktop ID
  • +
  • Don't show applications without AppData in the category view
  • +
  • Fix a possible race and crash when loading icons
  • +
  • Fix locking in the AppStream code to fix several crashes
  • +
  • Use better error messages on offline update failure
  • +
  • Withdraw the notification when prepared update gets invalidated
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is an unstable release in the 3.17 development series, with the following improvements:

+
    +
  • Make fwupd dependency automagic
  • +
+

Bugs fixed in this release:

+
    +
  • Fix a regression from the previous unstable release that made it impossible to install updates
  • +
  • Fix a crash in the screenshot loader
  • +
  • Fix a crash in the sources dialog
  • +
  • Fix a crash when installing rpms that lack description
  • +
  • Wrap long descriptions in the update dialog
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This is the first unstable release in the 3.17 development series, with a number of new features:

+
    +
  • Support getting firmware updates through the fwupd daemon
  • +
  • Use a smaller number of tiles on the front page on small monitors
  • +
  • Rework internal modulesets, making it easier to edit the list of featured apps
  • +
  • Revert back to using a hand-picked list of featured apps
  • +
  • Several improvements to the sources dialog
  • +
  • Show better human readable names when searching for font scripts
  • +
  • Show a spinner while loading the data for the update history dialog
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This release fixes the following bugs:

+
    +
  • Remove redundant OK button from the updates installed notification
  • +
  • Display a better human readable title for printer drivers
  • +
  • Show a better UI for offline update failure dialog
  • +
  • Set default actions for the update done notifications
  • +
  • Allow searching for packages via the API without appdata
  • +
  • Fix showing webapps with non-local icons
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This release fixes the following bugs:

+
    +
  • Correctly save HiDPI images to HiDPI directories
  • +
  • Scroll the contents of the error message dialog
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This stable release marks the release of GNOME 3.16!

+
+
+ + +

This unstable release adds the following features:

+
    +
  • React to theme changes
  • +
  • Rebase the HighContrast theme
  • +
+

This release fixes the following bug:

+
    +
  • Fix HiDPI scale factor calculation
  • +
  • Align section headings in all views
  • +
  • Fix 'installed' overlays when using the HighContrast theme
  • +
  • Fall back to showing the top level category when no sub category exists
  • +
  • Fix a crash when using the pending applications feature
  • +
+

This release also updates translations for many languages.

+
+
+ + +

This unstable release adds the following features:

+
    +
  • Enable kinetic scrolling in updates dialog
  • +
+

This release fixes the following bug:

+
    +
  • Always ensure that the back entry focus widget is valid
  • +
  • Don't show small screenshots on HiDPI hardware
  • +
  • Fix a crash when starting GNOME Software for the first time
  • +
  • Only show compatible projects when getting the featured list
  • +
+
+
+ + +

This unstable release adds the following features:

+
    +
  • Add a new panel for displaying session service results
  • +
  • Add a new version of the Modify interface
  • +
  • Require AppData for all available packages
  • +
+

This release fixes the following bug:

+
    +
  • Use the new mockups for the 3rd party source install dialogs
  • +
+
+
+ + +

This unstable release adds the following features:

+
    +
  • Fix searching with very small search terms
  • +
+

This release fixes the following bugs:

+
    +
  • Do case-insensitive searching of suitable keywords
  • +
  • Fix a crash in the screenshot loader
  • +
  • Fix a crash when clicking the back button
  • +
  • Fix searching for keyworks with special chars
  • +
  • Show an error message when we fail to load details about a local file
  • +
+
+
+ + +

This unstable release adds the following features:

+
    +
  • Show a blurred low-resolution screenshot while loading the HiDPI one
  • +
+

This release fixes the following bugs:

+
    +
  • Do not show a random white line above the star rating widget
  • +
  • Do not show empty app boxes if no popular results are available
  • +
  • Do not try to download local web-app icons
  • +
  • Use blue stars for the user-ratings rather than gold
  • +
+
+
+
+ + gnome-software.desktop + + + HiDpiIcon + ModernToolkit + Notifications + SearchProvider + + https://gitlab.gnome.org/GNOME/gnome-software/-/issues + https://discourse.gnome.org/tag/gnome-software + https://welcome.gnome.org/app/Software/ + https://www.gnome.org/donate/ + https://apps.gnome.org/Software + https://l10n.gnome.org/module/gnome-software/ + https://gitlab.gnome.org/GNOME/gnome-software/ + richard_at_hughsie.com + GNOME + GNOME + gnome-software + + The GNOME Project + + The GNOME Project + + + moderate + mild + + org.gnome.Software.desktop +
diff --git a/data/metainfo/ss-details.png b/data/metainfo/ss-details.png new file mode 100644 index 0000000000000000000000000000000000000000..68174e4eb6321686ca31f536bfd720362baf3206 GIT binary patch literal 69077 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%0DJ^4PzxzwyJud#+pu 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 literal 0 HcmV?d00001 diff --git a/data/metainfo/ss-installed.png b/data/metainfo/ss-installed.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4e02fe3ee36a707dfad5729f8682709c2b89d8 GIT binary patch literal 64823 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 AE&u=k literal 0 HcmV?d00001 diff --git a/data/metainfo/ss-up-to-date.png b/data/metainfo/ss-up-to-date.png new file mode 100644 index 0000000000000000000000000000000000000000..45d0b76989c25f0400210ef0e59d2cd2eeea9b1b GIT binary patch literal 52734 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

e;T=Uj70nA0 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%0AHgpV#`&m5`8uve|__Kp{N993E6&Ock~x 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 literal 0 HcmV?d00001 diff --git a/data/metainfo/ss-updates-details.png b/data/metainfo/ss-updates-details.png new file mode 100644 index 0000000000000000000000000000000000000000..e0bac48d9d6e74d50f7ec458f8a5260fe9e5a46c GIT binary patch literal 70319 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�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 literal 0 HcmV?d00001 diff --git a/data/metainfo/ss-updates.png b/data/metainfo/ss-updates.png new file mode 100644 index 0000000000000000000000000000000000000000..c1cf4d8539a76c5c5c4c9713e565c7c1f070a5ce GIT binary patch literal 74513 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 L#p~(U9z6d)mysHv literal 0 HcmV?d00001 diff --git a/data/org.gnome.software.dkms-helper.policy.in.in b/data/org.gnome.software.dkms-helper.policy.in.in new file mode 100644 index 0000000..134d1f7 --- /dev/null +++ b/data/org.gnome.software.dkms-helper.policy.in.in @@ -0,0 +1,54 @@ + + + + + GNOME Software + https://apps.gnome.org/Software + + Test akmods key in Shim UEFI + Authentication is required to test akmods key in Shim UEFI + + no + no + yes + + @libexecdir@/gnome-software-dkms-helper + --test-akmods + + + Enroll akmods key to Shim UEFI + Authentication is required to enroll akmods key to Shim UEFI + + auth_admin_keep + auth_admin_keep + auth_admin_keep + + @libexecdir@/gnome-software-dkms-helper + --enroll-akmods + + + Test DKMS key in Shim UEFI + Authentication is required to test DKMS key in Shim UEFI + + no + no + yes + + @libexecdir@/gnome-software-dkms-helper + --test-dkms + + + Enroll DKMS key to Shim UEFI + Authentication is required to enroll DKMS key to Shim UEFI + + auth_admin_keep + auth_admin_keep + auth_admin_keep + + @libexecdir@/gnome-software-dkms-helper + --enroll-dkms + + diff --git a/data/org.gnome.software.external-appstream.policy.in.in b/data/org.gnome.software.external-appstream.policy.in.in new file mode 100644 index 0000000..69af72a --- /dev/null +++ b/data/org.gnome.software.external-appstream.policy.in.in @@ -0,0 +1,20 @@ + + + + + GNOME + https://www.gnome.org/ + + + Install an appstream file into a system location + Installing an appstream file into a system location + + yes + yes + no + + @libexecdir@/gnome-software-install-appstream + + diff --git a/data/org.gnome.software.gschema.xml b/data/org.gnome.software.gschema.xml new file mode 100644 index 0000000..2bc33c7 --- /dev/null +++ b/data/org.gnome.software.gschema.xml @@ -0,0 +1,161 @@ + + + + ['GNOME', 'KDE', 'XFCE'] +

A list of compatible projects + This is a list of compatible projects we should show such as GNOME, KDE and XFCE. + + + true + Whether to manage updates and upgrades in GNOME Software + If disabled, GNOME Software will hide the updates panel, not perform any automatic updates actions or prompt for upgrades. + + + true + Automatically download and install updates + If enabled, GNOME Software automatically downloads software updates in the background, also installing ones that do not require a reboot. + + + true + Notify the user about software updated in the background + If enabled, GNOME Software notifies the user about updates that happened whilst the user was idle. + + + false + Whether to automatically refresh when on a metered connection + If enabled, GNOME Software automatically refreshes in the background even when using a metered connection (eventually downloading some metadata, checking for updates, etc., which may incur in costs for the user). + + + true + Whether it’s the very first run of GNOME Software + + + false + Show star ratings next to applications + + + true + Filter applications based on the default branch set for the remote + + + true + Non-free applications show a warning dialog before install + When non-free applications are installed a warning dialog can be shown. This controls if that dialog is suppressed. + + + 0 + The last update check timestamp + + + 0 + The last upgrade notification timestamp + + + 0 + The last update notification timestamp + + + 0 + The timestamp of the first security update, cleared after update + + + 0 + The last update timestamp + + + 2592000 + The age in seconds to verify the upstream screenshot is still valid + + Choosing a larger value will mean less round-trips to the remote server + but updates to the screenshots may take longer to show to the user. + A value of 0 means to never check the server if the image already exists + in the cache. + + + + 'https://odrs.gnome.org/1.0/reviews/api' + The server to use for application reviews + + + 0 + The minimum karma score for reviews + Reviews with karma less than this number will not be shown. + + + [] + A list of official repositories that should not be considered 3rd party + + + [] + A list of required repositories that cannot be disabled or removed + + + [] + A list of official repositories that should be considered free software + + + '' + The licence URL to use when an application should be considered free software + + + true + Install bundled applications for all users on the system where possible + + + true + Allow access to the Software Repositories dialog + + + false + Offer upgrades for pre-releases + + + true + Show some UI elements informing the user that an app is non-free + + + true + Show the installed size for apps in the list of installed applications + + + + 'https://en.wikipedia.org/wiki/Proprietary_software' + The URI that explains nonfree and proprietary software + + + [] + A list of URLs pointing to appstream files that will be downloaded into an swcatalog folder + + + false + Install the AppStream files to a system-wide location for all users. If false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml directory + + + [''] + Priority order of packaging formats to prefer, with more important formats listed first. An empty array means the default order. Omitted formats are assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, snap. The formats can be optionally specified with an origin name, divided by a colon, for example 'flatpak:flathub'. + + + 0 + The timestamp of the last attempt to remove unused Flatpak runtimes + + + false + Set to 'true' to show only freely licensed apps and hide any proprietary apps. + + + false + Set to 'true' to show only apps from developers whose identity has been verified. + + + 0 + The timestamp of the last received historical updates. + + + + + + '' + A string storing the gnome-online-account id used to login + + + diff --git a/data/tests/os-release b/data/tests/os-release new file mode 100644 index 0000000..79df6af --- /dev/null +++ b/data/tests/os-release @@ -0,0 +1,16 @@ +NAME=Fedora +VERSION="25 (Workstation Edition)" +ID=fedora +VERSION_ID=25 +PRETTY_NAME="Fedora 25 (Workstation Edition)" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:fedoraproject:fedora:25" +HOME_URL="https://fedoraproject.org/" +BUG_REPORT_URL="https://bugzilla.redhat.com/" +REDHAT_BUGZILLA_PRODUCT="Fedora" +REDHAT_BUGZILLA_PRODUCT_VERSION=25 +REDHAT_SUPPORT_PRODUCT="Fedora" +REDHAT_SUPPORT_PRODUCT_VERSION=25 +PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy +VARIANT="Workstation Edition" +VARIANT_ID=workstation diff --git a/doc/api/gnome-software-docs.xml b/doc/api/gnome-software-docs.xml new file mode 100644 index 0000000..d327af2 --- /dev/null +++ b/doc/api/gnome-software-docs.xml @@ -0,0 +1,773 @@ + + +]> + + + GNOME Software Reference Manual + + + + GNOME Software Plugin Tutorial + + + GNOME Software is a software installer designed to be easy to use. + + +
+ Introduction + + At the heart of gnome software the application is just a plugin loader + that has some GTK UI that gets created for various result types. + The idea is we have lots of small plugins that each do one thing and + then pass the result onto the other plugins. + These are ordered by dependencies against each other at runtime and + each one can do things like editing an existing application or adding a + new application to the result set. + This is how we can add support for things like firmware updating, + GNOME Shell web-apps and flatpak bundles without making big + changes all over the source tree. + + + There are broadly 3 types of plugin methods: + + + + Actions: Do something on a specific GsApp + + + Refine: Get details about a specific GsApp + + + Adopt: Can this plugin handle this GsApp + + + + In general, building things out-of-tree isn't something that I think is + a very good idea; the API and ABI inside gnome-software is still + changing and there's a huge benefit to getting plugins upstream where + they can undergo review and be ported as the API adapts. + I'm also super keen to provide configurability in GSettings for doing + obviously-useful things, the sort of thing Fleet Commander can set for + groups of users. + + + However, now we're shipping gnome-software in enterprise-class distros + we might want to allow customers to ship their own plugins to make + various business-specific changes that don't make sense upstream. + This might involve querying a custom LDAP server and changing the + suggested apps to reflect what groups the user is in, or might involve + showing a whole new class of applications that does not conform to the + Linux-specific application is a desktop-file paradigm. + This is where a plugin makes sense. + + + + The plugin needs to create a class derived from GsPlugin, + and define the vfuncs that it needs. The + plugin name is taken automatically from the suffix of the + .so file. The type of the plugin is exposed to + gnome-software using gs_plugin_query_type(), which + must be exported from the module. + + + A sample plugin + +/* + * Copyright (C) 2016 Richard Hughes + */ + +#include <glib.h> +#include <gnome-software.h> + +struct _GsPluginSample { + GsPlugin parent; + + /* private data here */ +}; + +G_DEFINE_TYPE (GsPluginSample, gs_plugin_sample, GS_TYPE_PLUGIN) + +static void +gs_plugin_sample_init (GsPluginSample *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "appstream"); +} + +static void +gs_plugin_sample_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSample *self = GS_PLUGIN_SAMPLE (plugin); + g_autoptr(GTask) task = NULL; + const gchar * const *keywords; + g_autoptr(GsAppList) list = gs_app_list_new (); + + task = gs_plugin_list_apps_data_new_task (plugin, query, flags, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_sample_list_apps_async); + + if (query == NULL || + gs_app_query_get_keywords (query) == NULL || + gs_app_query_get_n_properties_set (query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + keywords = gs_app_query_get_keywords (query); + + for (gsize i = 0; keywords[i] != NULL; i++) { + if (g_str_equal (keywords[i], "fotoshop")) { + g_autoptr(GsApp) app = gs_app_new ("gimp.desktop"); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app); + } + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_sample_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_sample_class_init (GsPluginSampleClass *klass) +{ + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + plugin_class->list_apps_async = gs_plugin_sample_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_sample_list_apps_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_SAMPLE; +} + + + + + We have to define when our plugin is run in reference to other plugins, + in this case, making sure we run before appstream. + As we're such a simple plugin we're relying on another plugin to run + after us to actually make the GsApp complete, + i.e. loading icons and setting a localised long description. + + + In this example we want to show GIMP as a result (from any provider, + e.g. flatpak or a distro package) when the user searches exactly for + fotoshop. + + + We can then build and install the plugin using: + + + +gcc -shared -o libgs_plugin_example.so gs-plugin-example.c -fPIC \ + $(pkg-config --libs --cflags gnome-software) \ + -DI_KNOW_THE_GNOME_SOFTWARE_API_IS_SUBJECT_TO_CHANGE && \ +cp libgs_plugin_example.so $(pkg-config gnome-software --variable=plugindir) + + + + + + + + + +
+ +
+ Distribution Specific Functionality + + Some plugins should only run on specific distributions, for instance + the fedora-pkgdb-collections plugin should only be used on + Fedora systems. + This can be achieved with a simple runtime check using the helper + gs_plugin_check_distro_id() method or the GsOsRelease + object where more complicated rules are required. + + + Self disabling on other distributions + +static void +gs_plugin_sample_init (GsPluginSample *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + if (!gs_plugin_check_distro_id (plugin, "ubuntu")) { + gs_plugin_set_enabled (plugin, FALSE); + return; + } + /* set up private data etc. */ +} + + + +
+ +
+ Custom Applications in the Installed List + + Next is returning custom applications in the installed list. + The use case here is a proprietary software distribution method that + installs custom files into your home directory, but you can use your + imagination for how this could be useful. + The example here is all hardcoded, and a true plugin would have to + derive the details about the GsApp, for example reading in an XML + file or YAML config file somewhere. + + + Example showing a custom installed application + +static void +gs_plugin_sample_init (GsPluginSample *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "icons"); +} + +static void +gs_plugin_custom_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autofree gchar *fn = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GIcon) icon = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_custom_list_apps_async); + + /* We’re only listing installed apps in this example. */ + if (query == NULL || + gs_app_query_get_is_installed (query) != GS_APP_QUERY_TRISTATE_TRUE || + gs_app_query_get_n_properties_set (query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + /* check if the app exists */ + fn = g_build_filename (g_get_home_dir (), "chiron", NULL); + if (!g_file_test (fn, G_FILE_TEST_EXISTS)) { + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + return; + } + + /* the trigger exists, so create a fake app */ + app = gs_app_new ("chiron.desktop"); + gs_app_set_management_plugin (app, plugin); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Chiron"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "A teaching application"); + gs_app_set_description (app, GS_APP_QUALITY_NORMAL, + "Chiron is the name of an application.\n\n" + "It can be used to demo some of our features"); + + /* these are all optional, but make details page looks better */ + gs_app_set_version (app, "1.2.3"); + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, 2 * 1024 * 1024); + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 3 * 1024 * 1024); + gs_app_set_origin_hostname (app, "http://www.teaching-example.org/"); + gs_app_add_category (app, "Game"); + gs_app_add_category (app, "ActionGame"); + gs_app_set_license (app, GS_APP_QUALITY_NORMAL, "GPL-2.0-or-later and LGPL-2.1-or-later"); + + /* use a stock icon */ + icon = g_themed_icon_new ("input-gaming"); + gs_app_add_icon (app, icon); + + /* return new app */ + gs_app_list_add (list, app); + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_custom_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + + + + This shows a lot of the plugin architecture in action. Some notable points: + + + + + Setting the management plugin means we can check for this string + when working out if we can handle the install or remove action. + + + + + Most applications want a kind of AS_COMPONENT_KIND_DESKTOP_APP + to be visible as an application. + + + + + The origin is where the application originated from — usually + this will be something like Fedora Updates. + + + + + Setting the license means we don't get the non-free warning — + removing the 3rd party warning can be done using + GS_APP_QUIRK_PROVENANCE + + + + + The icon will be loaded into a pixbuf of the correct size when + needed by the UI. You must ensure that icons are available at + common sizes. For icons of type GsRemoteIcon, the + icons plugin will download and cache the icon + locally. + + + + + To show this fake application just compile and install the plugin, + touch ~/chiron and then restart gnome-software. + To avoid restarting gnome-software each time a + proper plugin would create a GFileMonitor object to + monitor files. + + + + + + + + + + By filling in the optional details (which can also be filled in using + refine_async() you can also make the details + page a much more exciting place. + Adding a set of screenshots is left as an exercise to the reader. + + + + + + + + +
+ +
+ Downloading Metadata and Updates + + + The plugin loader supports a refresh_metadata_async() vfunc that + is called in various situations. + To ensure plugins have the minimum required metadata on disk it is + called at startup, but with a cache age of infinite. + This basically means the plugin must just ensure that + any data exists no matter what the age. + + + Usually once per hour, we'll call refresh_metadata_async() but + with the correct cache age set (typically a little over 24 hours) which + allows the plugin to download new metadata or payload files from remote + servers. + The gs_utils_get_file_age() utility helper can help you + work out the cache age of a file, or the plugin can handle it some other + way. + + + For the Flatpak plugin we just make sure the AppStream metadata exists + at startup, which allows us to show search results in the UI. + If the metadata did not exist (e.g. if the user had added a remote + using the command-line without gnome-software running) then we would + show a loading screen with a progress bar before showing the main UI. + On fast connections we should only show that for a couple of seconds, + but it's a good idea to try any avoid that if at all possible in the + plugin. + Once per day the gs_plugin_get_updates() method is called, + and then a GsPluginJobUpdateApps job may be run with the + GS_PLUGIN_JOB_UPDATE_APPS_FLAGS_NO_APPLY flag if the + user has configured automatic updates. + This is where the Flatpak plugin would download any ostree trees (but + not doing the deploy step) so that the applications can be updated live + in the details panel without having to wait for the download to complete. + In a similar way, the fwupd plugin downloads the tiny LVFS metadata with + refresh_metadata_async() and then downloads the large firmware + files themselves when update_apps_async() is called. + + + Note, if the downloading fails it's okay to return FALSE; + the plugin loader continues to run all plugins and just logs an error + to the console. We'll be calling into refresh_metadata_async() + again in only another hour, so there's no need to bother the user. + For actions like gs_plugin_app_install we also do the same + thing, but we also save the error on the GsApp itself so that the UI is + free to handle that how it wants, for instance showing a GtkDialog + window for example. + + + Refresh example + +static void progress_cb (gsize bytes_downloaded, + gsize total_download_size, + gpointer user_data); +static void download_file_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_example_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GError **error) +{ + const gchar *metadata_filename = "/var/cache/example/metadata.xml"; + const gchar *metadata_url = "https://www.example.com/new.xml"; + g_autoptr(GFile) file = g_file_new_for_path (metadata_filename); + g_autoptr(GTask) task = NULL; + g_autoptr(SoupSession) soup_session = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_example_refresh_metadata_async); + + soup_session = gs_build_soup_session (); + + /* is the metadata missing or too old? */ + if (gs_utils_get_file_age (file) > cache_age_secs) { + gs_download_file_async (soup_session, + metadata_url, + file, + G_PRIORITY_LOW, + progress_cb, + plugin, + cancellable, + download_file_cb, + g_steal_pointer (&task)); + return; + } + + g_task_return_boolean (task, TRUE); +} + +static void +progress_cb (gsize bytes_downloaded, + gsize total_download_size, + gpointer user_data) +{ + g_debug ("Downloaded %zu of %zu bytes", bytes_downloaded, total_download_size); +} + +static void +download_file_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + + if (!gs_download_file_finish (result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + g_debug ("successfully downloaded new metadata"); + g_task_return_boolean (task, TRUE); + } +} + +static gboolean +gs_plugin_example_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + + +
+ +
+ Adding Application Information Using Refine + + + As previous examples have shown it's very easy to add a new + application to the search results, updates list or installed list. + Some plugins don't want to add more applications, but want to modify + existing applications to add more information depending on what is + required by the UI code. + The reason we don't just add everything at once is that for + search-as-you-type to work effectively we need to return results in + less than about 50ms and querying some data can take a long time. + For example, it might take a few hundred ms to work out the download + size for an application when a plugin has to also look at what + dependencies are already installed. + We only need this information once the user has clicked the search + results and when the user is in the details panel, so we can save a + ton of time not working out properties that are not useful. + + + Refine example + +static void +gs_plugin_example_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_example_refine_async); + + /* not required */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + /* already set */ + if (gs_app_get_license (app) != NULL) { + g_task_return_boolean (task, TRUE); + return; + } + + /* FIXME, not just hardcoded! */ + if (g_strcmp0 (gs_app_get_id (app, "chiron.desktop") == 0)) + gs_app_set_license (app, "GPL-2.0 and LGPL-2.1-or-later"); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_example_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + + + + This is a simple example, but shows what a plugin needs to do. + It first checks if the action is required, in this case + GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE. + This request is more common than you might expect as even the search + results shows a non-free label if the license is unspecified or + non-free. + It then checks if the license is already set, returning with success + if so. + If not, it checks the application ID and hardcodes a license; in the + real world this would be querying a database or parsing an additional + config file. + As mentioned before, if the license value is freely available without + any extra work then it's best just to set this at the same time as + when adding the app with gs_app_list_add(). + Think of refine as adding things that cost time to + calculate only when really required. + + + The UI in gnome-software is quite forgiving for missing data, hiding + sections or labels as required. + Some things are required however, and forgetting to assign an icon or + short description will get the application vetoed so that it's not + displayed at all. + Helpfully, running gnome-software --verbose on the + command line will tell you why an application isn't shown along with + any extra data. + + +
+ +
+ Adopting AppStream Applications + + + There's a lot of flexibility in the gnome-software plugin structure; + a plugin can add custom applications and handle things like search and + icon loading in a totally custom way. + Most of the time you don't care about how search is implemented or how + icons are going to be loaded, and you can re-use a lot of the existing + code in the appstream plugin. + To do this you just save an AppStream-format XML file in either + /usr/share/swcatalog/xml/, + /var/cache/swcatalog/xml/ or + ~/.local/share/swcatalog/xml/. + GNOME Software will immediately notice any new files, or changes to + existing files as it has set up the various inotify watches. + + + This allows plugins to care a lot less about how applications are + going to be shown. + For example, the flatpak plugin downloads AppStream data + for configured remotes during refresh_metadata_async(). + + + The only extra step a plugin providing its own apps needs to do + is to implement the gs_plugin_adopt_app() function. + This is called when an application does not have a management plugin + set, and allows the plugin to claim the + application for itself so it can handle installation, removal and + updating. + + + Another good example is the fwupd that wants to handle + any firmware we've discovered in the AppStream XML. + This might be shipped by the vendor in a package using Satellite, + or downloaded from the LVFS. It wouldn't be kind to set a management + plugin explicitly in case XFCE or KDE want to handle this in a + different way. This adoption function in this case is trivial: + + + + +void +gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app) +{ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_FIRMWARE) + gs_app_set_management_plugin (app, plugin); +} + + +
+ +
+ Using The Plugin Cache + + + GNOME Software used to provide a per-process plugin cache, + automatically de-duplicating applications and trying to be smarter + than the plugins themselves. + This involved merging applications created by different plugins and + really didn't work very well. + For versions 3.20 and later we moved to a per-plugin cache which + allows the plugin to control getting and adding applications to the + cache and invalidating it when it made sense. + This seems to work a lot better and is an order of magnitude less + complicated. + Plugins can trivially be ported to using the cache using something + like this: + + + + /* create new object */ + id = gs_plugin_flatpak_build_id (inst, xref); +- app = gs_app_new (id); ++ app = gs_plugin_cache_lookup (plugin, id); ++ if (app == NULL) { ++ app = gs_app_new (id); ++ gs_plugin_cache_add (plugin, id, app); ++ } + + + + Using the cache has two main benefits for plugins. + The first is that we avoid creating duplicate GsApp objects for the + same logical thing. + This means we can query the installed list, start installing an + application, then query it again before the install has finished. + The GsApp returned from the second list_apps() + request will be the same GObject, and thus all the signals connecting + up to the UI will still be correct. + This means we don't have to care about migrating + the UI widgets as the object changes and things like progress bars just + magically work. + + + The other benefit is more obvious. + If we know the application state from a previous request we don't have + to query a daemon or do another blocking library call to get it. + This does of course imply that the plugin is properly invalidating + the cache using gs_plugin_cache_invalidate() which it + should do whenever a change is detected. + Whether a plugin uses the cache for this reason is up to the plugin, + but if it does it is up to the plugin to make sure the cache doesn't + get out of sync. + +
+ +
+
+ + + + + This documentation is auto-generated. + If you see any issues, please file bugs. + + + GNOME Software Plugin API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/doc/api/gnome-software.types b/doc/api/gnome-software.types new file mode 100644 index 0000000..5f0a7b0 --- /dev/null +++ b/doc/api/gnome-software.types @@ -0,0 +1,6 @@ +gs_app_get_type +gs_app_list_get_type +gs_category_get_type +gs_os_release_get_type +gs_plugin_event_get_type +gs_plugin_get_type diff --git a/doc/api/gs-example-details.png b/doc/api/gs-example-details.png new file mode 100644 index 0000000000000000000000000000000000000000..88c29e48679110f5713cc97a49e3c6254d8332cb GIT binary patch literal 53714 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 literal 0 HcmV?d00001 diff --git a/doc/api/gs-example-installed.png b/doc/api/gs-example-installed.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd424aef9476f5081b5d71e7d7eb863897051ea GIT binary patch literal 106482 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 z
Wfl3Mv&$j{(S8Q20S2G3)y0NO6cF##h?>u&l8HklxjYaotA|JPMR76o$T-#|8L zJm+iknHAw-tH0P*>o2*G2p$nPODH-P&-o1g#>c<$lE;UjtH@Ub3%7|Fc*u%99*zE= zSBUHS>&*EV-{!!#y;QMG*u!Oaym3RFMMu$NWqrTuXOLBLZq&fKFMSZ|uIX>m#Y-;yO7ZDmyw$*up03wL< z!Z}SVhe#F(m0{i?M>8NMMB$Yq>yl^{>ZV6BgpC62Kcn{~-g>0|s|GN9Bw6ImVPTI^ zFdw_-MFP9XF8~C8PftGU=pXV{^X2!f4Lzj&ZnsI44Cn)b&X669Nu2*|VMw~VTT3u~ zpYO}-(-n5pD~B6}ZQcq(O=`P>nPw4eF6_Iq4Z?c65^*?f zfuE|XzZVUdeV|d)$5fS-{{~{ff2-%QJhOzYJ-e1+=v%1y-!qNmaph13<8jzQNDba} zbJ_43+`48r>QX>#f%=7qaw|Hg)wjRLmIFkb;$_|tc;tR4hhKLy5XJ+-nm8VhE5IuL zgLfyP8&N@hbW2SY!eDknh~9JW$QSl~`@E4!Cv>dh6^EC^f9~RP%SDS%Ohe(Jxig`9?Kqa)y79HZ#)wU@b$TT7 zuu*`7#sJ|%yGu)1OuZFOA8imepZK#?cFEQufSr$-X1B4a^W~DK*^_0T{@m6rSI(h4 zRLOe6WqKudL-~Q=Cm# ze2tucvPrt>{D1`w9TYo$X>q&*w0Z*ZAZURxi)ZxaomoVzC|@Z5{|fnnZT+b*S)k< z#y!rioc1Wmd?dsy-~l9?e6suD_sBZI;_K5HPOo{xk?k^3EM>bBOPq6ax#OF+Fscvb+zFqQu$(Qi?d>`?W2)Lw&no)7x3=!Qp7y);ksVX5xsRD& zi2GR&a&uR3^N9!SIZ79FE^KOSWkO3k+s8)4TDoOMZPF|%dp8dZ4^Pk|4SxfvC8K?# z-Q-a6cA39slZS;C(ux3N@3F*WwRLWfkBpukv#P|*c3^%z7!3sRH6%JX*g2JcrY8D$ z7}rzhJNVD}q!5%78}3Tg$w|>%L~zZX_pspB9?U3yNBWw~BGlP*W7@}pM9=8sQGI(I zh^>4}n1Sm75*rC$ZU?;Mvv1Z=Zh(>u^{m-!I2Mr{*qYI6`e`ftZF+aQCkAF(E^4MiSKV|g zN5|ZoZZg?82ShPPlgL!EjE;8L%H3@Yv=3~{a`&Q_vW))6@5pFOGn2LLvtf2N>*YsB z-z>0&TCRkz9@MH?WlZfYv61R~-ehxlb;R3}m#<7fdBh<9k42SmZcvn~P+3+e@2#{& z>iL+NGu#=+WFH*A{dwO0%c$=_c&o7#WQ$-`zBfywl~SfL4}&@dkg{I4kUkZBdhZ*0IXsu z%d3l}t7pJckl5o2l1Pa;am@%@-pQ)X>fN9;K0!_cW}TbF|G)|G1Jf_Dv5}u;axNnc z@-FL=ne*fM{d8~U`>28G!5p7!a^_xkX>M*PNuvUyuVG+-(2g|_9yJPavbKlg;G0DL zsqJ7L$D5_!XK?XRcDsn>(eYaO$^XRHv)EM6oFSf^pAZY6%>F*~+Xx!;PDycm)uMMS z?#H!){6E7l7f1{Rs4!}+ES(^Tb#N}W%&L7dP1pGLzlG-?hJ+Ax2R@9Q5Hw4cmPAAb7Z~m1NDpAa_-kE}si@H$+N^r!?-GJ6t^j}60@!?sK@=u)Ah>(` z?68O^N&Gh6jNqHAMrRtxdeV`?P1#z5p5JRw47UQ4uSIO*Co8u~uC_3BwJ&Wg`ZNbF znYBqds$9;=T9r%{1RVuI)NK_?GBw*j6St61OmNu1NAwPucCy(Z}=ZW99!|G7FH$OHOW>VBLw8 zj%nSknz3NqI_sXv+<-Bfk3Xw0M49;!#)6Y-!+dw+>U}|ur-`M;Q ziHXPtEUl1Y@&AG7Q#k+s;3F!H%syd;B*~A6IUE3xynb(sO@fflg8|(34@0Epjslb` zyH4C~KcqF+LJMLdgi{fYA$Eu{=p7a~ALl$L7lf{6i$z%5A4EiaS{R6dT~CBKn=o2f z&W2JrdA@jVqX4S zPH&{SGmF>}p{@Rg;q#R4o99-keUs}Xa*x|R6=e=!P-2ifT1Q*{CwXL7gyF^~8#WwW ztqQgkP1`~X`n@7w90j2{Ba_S=UZw~C7gw;p!1MuthsprPsH2D1Kam*R| zmhFuK0IJfZ=7LCbSq#Vr5g>*mlSW0z_ZRvLQu_jU<4 zG9A*knKxSQQC;&gOy%fkWmP$U?4L86qf&pYN2=65&=lBpS)ys{*PBK(*K5n$i=TEYVXI#F<+k7_iT;U0 z^j}lQ1&(yICweu9c*e^_HMtqr$ea0ut`}tz;0f3kQP42_SZ@7v9mH@s&+=v(b-2Eu zoTW}vZ9C8pA4S*yRs(Sbx7F`{wOI7owd7i?gyO1ArMatG)y17<7y2tN_H(KYa1Bz& zt-oWshK2V<{Cc76XHDhC%U=ayX#S~YC(0tKr($uvr9Fy{na)?3^7-YsCt?xlTd6io zZluJXa$^k}Hj8r?E@)`zD_dEm-8i#Xp6k247`eP(N|RYYOp7{lR>ubp96Z>MJ#jxD zUl1mAT*{iq2L?~;oNbxOP`B_Jkpxf*0WJiQ5;!zY(ruDkc3 zccw#HCMRr@n&x^1&9qCrOGTTxn^i|Ju)p=E<^0-itX2Mx=Ua9kvp5T;HN4X7^z1Lz zZyJus*>!BgbKf&|`OGf@?sT*LBf%TbX|7DQ^*JJBpWd9+Cio@93vI$c|!E5qBKMkVmg=-Z((|0z6jdJh;#qUNbP?l;K{9&%piu8R4b-)sC6b z_X;1)MQA+KGpUcF+tNqVNTq!B+Nka6BlcS&4L4dhpQY%P=FRSLGQBQ(?yH(j#ITxr zbo1q&0J)r&kSyb5Av`ULq>=NJJE-EGFzHBFWi0&qGyG!8<=4WEdCxV)>DGh4{KEwW zQ@a@}l3o2ZC@aK|ohx5pm+w zsZA)HF$<%hLnhfXcnA}kTK}Ja=|+FLKGr8wyL9ucD3QHccRX$96}}R$j}P}Fz)WSZ zK%w1X-u9Evk+VK)3)EDj)NK+^D!g`WIp-Tt{-a`df5i{G-k`v@3Xb@D5}ze_WLmm7@SDaaQx%P9!8ca z@DZDd7Kdm8bmHb6f{PDsSF-rT$z)IJ4m_twt{a5(HzY5{FIc4iU);TSIM@CE_ur&p zRD={NLW#)UMJ3r8$t(>kE8a*(r6L)XqU=$~O!iJz2uVg}2-$nD>;CFIKi})Pe&6dl zj^Dr6_1}3qoTvBuHJ;DsnPCI0@%CR&`4N;aX&#PG8bK^J-F|-2CC8)sKZ&!1xHS52< zot1H`K3xu~9%5Vuv^%s(J@E<2Mkq4pru~@KasX9@W5>Vm$;&KUhPJ=Wv@|I0?;6@R zBQq`lXC&fUg2RTcnM$dUx}iF0-%%BAQ91Q-!RJG~7x&YA9<-bC-`8+?t(!bQ?-!G+ zO;_E5bJ?-}qFH4*W2G~ZC3ky1r>V8d9y1k5eNu2LD?UO@6Q7GeQcy`jq%agR^2ByccD9py6Y@M-uQNxKB3ynM)Mg@fHCxx zD}Usqd%U=kiA;*q4FV9F6Vo!H_(of!AJ?V_3iGp?jh@TFwrv(!5PhJ|V&Aom7o!t` zi;Sk_dFX)f_FTo|)^69J1X+X7V(}0J#2*70?m!k5ee4o10}&ID54}0oirZ+{*rFxT z$})!Ni`_)|23@=$k_d}pWY8dha}*&(K|r?OvC#gik7$VBtP87wi(%w$u+Dd>)>b+Kh)ozeFnAF` zEwG3Y9f8(9+@veeXKDU3%G3|7{}aTt5#X*PnEW8I)SKx2YiOKtc6R>J=P6``JsiWC zVDwk{AtNCG&4jsPQVf8%&y67 z5IJxxm#%cw{`T0j;;;G3JZr;mjI(>^+Qh`n4?j@eUHaxi$#%uWuxuwu>&WnUv#rJ$ zLwhvbAF^vHIl9+_6t1_R4FF&Ix5O7gzI5r2m6nE97V@Rc%+1g$dIvnpP>@;taJ+oo zV2KjHRg}s(mJlkA?UE7c>|Z)hvOK=pWB-0(lNf0uWut&dilGE6St-p7wzW$o(nW1& zbaYrgrrl0lo_n}UiBZDw!|F0L^MqNC&~;1y@&n}={$z}i(K-<(g#I`n!y+yezv}Z7 z5H#e;T!r}nGwDsd;0X|PFXEyTimc^T$RZo^9ITumFdplxs;e^w7-2%=0*&QonypWc zJ>gdx>HZWH1H`IKS`NY{rk(B#_FY=+X9>0zJD_*cY)jUv38QlCUKz!lMWJ%PyvMH+ znpF|S==t=7(ZYvm?U~Nyk+>@xUt$<0tf$$~paRJ7e? z!0zPthCAc#@0_Q84&+aKt#@k+;9h@79q3Xzt+LK%WS}e<8uerDVAZ!{T}|;D<>=Ri zC}_%f>q(mh5+ZTTvSj!ZW&tFqZoFi8 zzGr9Ci@T?JgjavF6CMOrrlwW9_|I{t3-~ss7)Cc4D_Qs0A1f6p-d1B^I>aL}#^5P@ zR8#}`lSc+9n7vB6|72g-8|B}Ib~8bvTEJOI#Cd@ix>qIF>G04{B{;5;Lu4*+{%N{& zBGlq03-`4f1kga+2tVt8+T)6^dGAA5+rDP)cDU+QSeWHF7bhpg2+Oj|se~S!$h5_P zmLQNLbEqF{m&r^HH@DpC(oVOHjT%g6tBlQuqYBSAAJuvO-BkW^MBi*{YvucE0>Vi{fwwZm+U#EvVly5TE zd?VbH9wo&JZmzzqxjL44y&NNLMd3MqQaD1fxXwK#zcU=V-hDrOo#I|m{>;hs)|{v7 zOC9Ri=OzLJ*Mj8+*1XnT*Dmw0h(Es6<>+6qJXbGV5+q{1D!f0t=VLX39f*6+GB~AKHfZeWXFi2fm3v>^Lnjx>P%MJ%#!$Fx%cN~+(><^NrB&cV(eQ#qrf<7>ToHa`0N zB89nv{u$fQR@P9H>WhZyv#kMB%d4&tvn;=Kbltd3`D-#NmRL=PcKXGc`ZN{t=sGdA zCX5OWTn~};G$~k^N>B_r`D%Ym$LEoXwa}+L`OjFordT&zsIJn^vy_xB7^V_XDv3O% zCv}rz|61z%(~R^~((uWizGy^U%OLXXs;tL%{v-RWLIc%U&waQ%F16uULi|F}2`%2` zZgTkxBlqbjCep$?-K$4$&ITIRvmUyiRx9B?yI*LN)`^uEH`fZ!r&Ce2)$iXzG!$X5 z%Xs$lQDz$1#(Ezo^Nht+#{%pD!|*mmevAs5n%Yryp<2{A?&S-256+`frNupayq+p> zN@;&BmL)%$z!@2z`EbLHY$vX_p~0n}s?+v4*NBFQn(Z>y6L?r{_4>^G!q}G8BebK= z?j;^lsCW>5SNf3 zJ~nAGl)-IrNL+lsezUIg_(c(x`X7e6Rb(|;75}~8U&7U4>G0I}q(#l}$9K(!kdMo4VaI^xk%80*w=jp%Yy(aXa`n zOO}SwD13h;&lVnj=DX;2w(y(JUNgzw(h`<%(HFVv{=MOp3PnVP#;L3e2V5v5-caR+ z*ZZVjJxY;%{ORf5+M6w}?|bLi?Yh)qM|mx|AjI|rLpcES%HYkq*NGxEh526j+6&=H z^AjJ^7B)JQ9?iWV4~kLKGAPGr0-{&y8#mtl$%VjRhlSQezqQB+vxHwoNwTDPu-Bxx+5)DwJ=#B)b7YazYQgjEdh}N*HWA+N*% z7e#}6698J!$KY^HeZ^&X922^VgG9n-~42f zNmacD@$#EY?NibhAo(1eB6(@)R)cS8NX%(agd90?gxie8!gMFpLVeh<`r#HZ!Z-;G zMI}8&7UkO1ZrwVL)8bqh{?^!fbj z8SD*d27z+YE&I#sn@zJh3>qHH`k|e;O!xNbiTr04ZCSRz&u=wvb}M0HtX5y2 zM{b(oEQe3ml_vTaQ>FwFh z`enc5>(pkSU%9&MeBJ%SZ$wCYnw7#ny=vAgDP!efUv57H=iQ4}ujF-ftiVv-I8o{Z zSlgp`u??I3-Di~ZA6xp02#jtckunnXmj&x2<|+JY-&Ai-WA3J>mi}Clw(he&?;-u6 zzgqA|V-rpll#dN{g551UBvx#vW0aZ7cGmC45sQ%I5q;t>0AgX3XAGDWWf(t1F=SK+ zzCf-;sINdn^>kX7MIc#&iZp>c^1HhVs@*hkX22MuA>q;qqJxiV;0EyV`U!6a%o41S zvJqfsllrJQk9%j;ll${A4GtMPlPM0{qp#I>14Fgb_AV?~O7FVtf^IyzqyO{Z* zzqJ>scEm^*)QThc9Y_?ll5}p=87xBc^alTSlAk{Z{wsWWi`)9~nfW}rwoE#$bG}K{ zCh2m^mhwzq$%EHtcyXLd9(F7+aGh(otDQT-I>*9UE}-Nzf1yM`Nosk;*6S&COB)1X zzVhy5ZXTP{tgQ?eBnDlaFn$(a)4V+2YKKjw~ouY;=t4c9}l(cHG_ ze55wer!o9Qor?Lm?=c5cQ||D0+A9>Foh!Iwk6syysb(Lm|PK_=Vw)we)pH%su->X0gNx8;|0Qik%Ck+KUzLy5sJ zlxP|UOM3^;VX+GI&VS9KRPcOeMhfH#xa*|C>8<`4qj_EZ=Pqg)5z zZO%CcgnnSquVA8){WN@PCt1B6Wl@)k>dwb&S0!3)>Gr!x$<{gfGl_dGtlFl07^=?D zc=_t0uDVb1@N2Jo^VOqrL84tZ*9#d$`)L4DK6@T<-V9``pozV;&2Ev!{@5 z&g~;XF?@I#(Owsk#}Kc+{<6u7bh$&yiT({c?b5R&#dUfMf}@Jv zYkM9Uhh<8)ZPv5vwqBd+I>EozYCd{dpQP{iI#69Hc3aOU3hqiKo#7g`AO1HfU#V*D z&CnG#Z(aY^>t(dnP1%D+PLYBtOMFJ@oy_WPI-bCt5bxCW$uuMd^K8DqAwC|GZ_%Z` zm`z^(-={XLueQo)C9ZjukUyPVUU@rH`+LN;mLti*YUTdH^<%ANV{R6)@pjZ3-S~n9 zLXE@LciI})eIB)cq@Ff4rh1g?L>aHQR$bMRhr2cqY66(E0}iQ2sXv?JEPXOvhRKDo@pB2^r5PDx1+JlA`T>+?skDbFS5 z`bp0zfZ87)zvmuTx$hyjo-NC+YF7G8(s=_s%xh(ZqvqJYt^rmCKW%AF`|RW31C#*=A|w53 z8K?nnH5I#mYFBK-{rI@K2amhE-y~?I^rW58Qq{TmppO1mNOvILXiTM^-I^$Dmx!x< z`RdY#g_63<50z2_ zOmYow6l5S}N2eWrNIX0bXbLnmuhC3y*|d?6c>hXem8%lH{dQ7dZq$6C{rmS4%C+S8 z?}4r)T0@tQFn6cSmmhoMK{Ne4HFP$S7sFp@#Q;(lI&B zP?28s$vf2|c5x3Md}e}@<0|7hlPV4LR~z+@|HT5G5n%JAsTrI&=xe>15|zlkl+Sg= zMJ$J3)128Cg^oCS3v;|*CJL;&uhd40sme&&&c<%md>Jjv7^=+S8t!sYK)>P}X~udy zBqr5ueIr^#fFhULjmzSpChaAUJJun4;o@P-tfy687X)Op==MqLJ*sHjoN@P9uA0)P z@mP}q%cXf~CdmV(@2M!t&KP+7^;{g**;D$Y-_CIteIbYP>0*ryXHy>>Q;$xM2#GIf zoDt0vPL>d6R`Dje1vlsfa!c5ql<2OUG&j^9P^Cq?hI6R??jRh5+lCmGm1J$VsA;|$ z3Syl3wke8C8K`Y*6HSc(r=NMchq#mIm*-gkI|o6TqQ~gkws;=vY}E&;uVVz61hmtj zhQgk>vUZRst9=2%?)Yd?wo&6xX!Lb40HbA8)QK`BiK!bN%6tc9yEfqrFV>sR5b)& zlKTwloKWs~Do1(m{q%fFQTaIaxA}C6J^p(pO_hfzsB__|GrbgW1yB#pmZMp7Cw3yuN48i}P#I{aN-_>jSg2>#g z%?dk{Zu;K4iJ_hhC7?-@XYJJB8O^EL7xKE>j1$+2G|%r|CdmCI}A?r8}~AV9tG2)Wwsyn;!Swk zA-p@5Eg>Y7nI|)BSCgVNy;R>uy3sLQYdafmA1bD+A|~B2`G!lm*`H=x{i@TsJ+T4` zJsRA+t#3Pd)%6b2%q_3RN$piH*#5NfL8E1vrO-94nuSm?!M!~3Hj&ZSco}&aD76!B z9!`7?qj+S6tVPn(o~S)u)BzJpu7~(i`C`e^e((izf6eZ>y#v#V>+-v)X4x3Ne==e} z*7~@_vfPO88gJ11_v&hUrP-4x^piH1eK||te2EOyQ8dQksLj&c)?M#Wu|&f|LF83pTY=K{GN>^IDZ<(9 z$TNg98>41q2MwUuBQlrK$~Q{;2{ExWCWXKEg>^J>>t-HjxC`SDF@bzKjCss+=#Nki z(rV=dq0!U>2M{}oJ=jKxtXouAWsr}Y*U+E^#N;;=RmHQx4pw?dh7t-+Ds#!Qw_qG1 z-!i6D2+F`}16Sv;7hJvvHF-uy7l}{QzJ0F@|Bd zr|O3?1qB6(z-zQeXps3M*sLcD{VM#F#V#JX0X}|7ri_FV6pElDVq!s+{v25?E-80h zZt-aRZ1dvKpok2}&@`4Q`=OOjIS`v<-Wg`ztQnpYHH?DW_SY#XX1~0)JesfssL5-J z-5=qn4h|#}wXCetjS*bMrkfda)yWv@x7)p+85TR|zEPi=;`*LHVR6y#84a?8d9P-< z#;;GjXO~#j*cmpqo_R#2VU^Q$YhKv}7gHwjtWl$tx05Y1r{)#>E5AxUwHk0+x7r8d z_~+4M9IX*H*5OZk$ys?Blzz<{sY%31Q8y+#Dco8?^$D3Vw8FN&#$Y% z*Skk?7PC)2rjt8VdjqNK#EmE)wA%w>5pu{eKRT^O3!5^aeZ<6>MXLR`0@)`l&V(im z0Xki#^Iu_IpZX?C%?GeGq5tnGdrE{t>w0%Xu=yJ@+3T}IjYMDrlBkLJQgvZNm!a0YPSi*o_F` z#OITUQ3@_+^^@4M^09?EGFfS}rY2!017@us_J?*D9)KSTMPDGdEO~U4+fZbgT2n>r z;ymaSb6Qz^3=~Ysau6i-R`^Y$hu|L;Rttk%ExH#!ho}z{pb8kP30x*CItK&{U@)_d z8TONd1QZkGh@D^~!P(}4W~spC*mp}U&WmsIJ!HyunO%+(qd68cSGqqw?991ynZvE5 zM&sl^V$tV(Hbz7oWC=`&362&O#=`ad)hniaI!UE04x9U9FKgste{5=?+;#rfrhTcq zJ0ij_^lYMzKE3g*s9@Q>2d9z5LR!i7O{cRq>v$q42dPMNVds53{@E zS6_T#czHj@^tHg=gqp9>>#Mu!))!CQS~nxN^dtAz@$FK7RC%53Y@~AI#Dd1frFYiz zp$_2WZ4lE=5=zwCUwfMa>oEif^p}!|GaxXuo?b(5ls?LYC=oO@AcqJP4WZ$7hA)o@ zJ;x9M9lcT_uO81;HYUvg#B94;1T||vOcEP6846kD4#vlE4?6A2SOr=j?{UeH(*tS&Ib+(1&B&Y zc+BMx`XjM0uO!@2O0=lprF54MfsEWkdgV}1%w$&4Dy4hzF8iFIU_5zHSZpAixe7cv zY>q1gx9E0XRq`?R4Opt!uw-UuixA0ugz^#+iaIRF!HLcFQyCfSO+)f>Lk7BSFwG5k z57oonxDPwmt~h!Gwktdx4i&L^P_(`}j?954;CXH21t`FtDd9BscEU-6D|3PYuAN;X zu|63ZEWxnYjavVdB_0-C61#?Cclmxx$?fz1JSjSOQU+7EKm6k=86|$B-B%$Tm!vx(XCYJMtG5U-@+Xq!Hhn587X~leBI%eOkG#m9Y0|nRnT(;#()L z2?g=)=Vp*NCsY)!P(K-^zB$tIeL{+?TyN}rdvOW1)F)z@zHWD1sz@eO?(8hr_3KnU zzHP3hG=9?O!hdg}AY&EEV+yW02mJ%jC2qVYu@K?bNq0SH)Az&JvD2UX3^fu&vGNc> zaHoC+5^bCyLWmCZIp;zv-VSkRZ!FTi(~CNK0YGHbn^3qeZp6_E6bXUBojBXH~Y;8a+Q-UHHk;?07xwSa>upy7>E0Aq&HLBWhlXE_Y#^;>&d^Z=s5V#DqG?dQI}of&Q>I>aK- z+8V<@tOlufLURl(JJI!DVC50ZUne*;&_8~-n$*SLdC}$8m|_+4vB#>_t?~SkMmvN% zeSi3?HjmwM?%#2!HrZ08=brj}>Apgx-`){iVr#!j{K7xE39k68#dbFf3KY8NU$V1v z_chuvQeiz*#Bhp_^AFkTk1jHAc2;)(tyYh!$gNhNmXP~h5eVXCpfCx#KvLTK-n6p4 z@DE+sT1SfG*qg4&5&oj9Wwt75Geyi-K0mBqAni>k^XeG;bTd_5%W02sjz3oE1NWE= z-O4JbZeP5JLH&Cffs;^55K;gErCvxyei33DnCpnQ7o-Rxdm7XD+}|xpBr7fDj1h-3 z0LZiZ14a0#ZM1yUJ~|$f=#lL?9dH$)HF~z0MEIXzF%z>}$pqyEBc}6^@E~64T|~q^ z$omB@8v{QGM8$Ml*V>$Sbz=hve@2JDUG6itSg#?y9eb2k^D|D)KChr*PSem3$nHZN z{Fd*fGT%nupx!GRccc5q8&$qXG**|K&yfa&eY)fbI~!pQ zP(C1C{+jRFK50vt*fm+sGgg9krmmxHL1cq~L`%Ua;0YrH`qe}}98^ARTwDod7Cz@# zVSi8dNwv^UK)FdQJ7`T2De$MW_-96%HZU zz}YENxya4F!j}mSWoEY(o3A(dt(WLa|NJo_eg{f+f@qqJg|#+Lulu9+aSPw7X2-bE zIfG!V!@exioxeMa9ntz;hqw-6A8qTM~tw4Se$RC1DicU+K;nux@OcT3b$d zpOAp?Eh3*M^y&EFcZSD6_Uf5eSr348e@v=R#!fu#Cvhzn#@E-Zl5>ZS9prWDeR))! z;3mnqs>vgn30D#91Ur+HtvK@%-ftqU8?F?bB4DH4;$Hj-Hlwb{Yiw+6fWm#qngudo<*fO^dBuispsx|c-NrSB2wKZG58X?9EP|@lzg-+ zCz)$Aeipij;}af`aC}A_*NNp6=kc)2BHw@$Kh|Ui&v%%c2dmD;@t2jBS_7wJjj#0# z7&!}zQB!x5bQ1S|!aR-r5>uDMPhfGdEE2shX%|^;#>~%lVS>+>S@hiL;*C;m>2CrJ*SOYK|3phnN&BVFR-fS0 z{ipiSKGUVN{j_bNhOk~)nWi7a3OkJt{I zHndi0@Q3q2SVz~a4<|b;SpCEq1jfLQKC_g6rM$%83rA%zrl>OMHW92?!X(q~G@Jxy zS5pR&6Ucy1j(X4tYEI&Klr)yYihXN6(+=xsE4zl|&@H04>00ibC-|Ara(0^PGqs`a zDS)enIF;f4LofDO1v~^gx8Ju6SoWJIj98S>5c`-+BUajs0i6sSg`?7>Y%zHN+Ko8t zAfRpoA@2dSaopNl#&d$RtnBR7RgJ)q_MGUL!Cc>j+<-di=4^eb-1uEGE3sThx4Wq(Sr%~A zrkI|QD}T0LwlUM{C-W59KJ_6l3omoMj!)9pML z%_kBb`Y*Z0P9rO`be}ibEnMEa70V6|XG$VALLfK2$ROs-Dct4AYL(<1?EmW3A6K_4 zA6}_*n_#m~DD#fr_o3~Uqvq(3lSdqj!jj2zFX!qVn@r`?;~&U_pit;dsovjE_icx2 zHL^NrnmZWxXVQPrGhkD!&)_v7NuM@2__`ucv3;6%7%e1bWEgzsRr zWxT{a<|MqEN_^1N)SFTC#daF@XOIy9ppK8=U&)qa{SUauQ!8U2EZbJ-iMtg|&SMW` zP!|{=t`U%lSitO79T0PffpIo4oG28{t5J4#mcT2G;?)1yvr}j`&^@TTgS$KFU`Yk;cPbl{Cr#e z)AM^c{`pUK6?p#N^yAl`^-~eJ$JP7qBjsruP#p2Fz_LXieVbJ=TJQh-{M&^KUL^*X za{miQb>gu6e-K|z?wLcO3Z^Uk z61TN_Mn`%d9c#;p$SauLP7sYI=RZ2$-uU6(Pcv!1q(*=#JpG3{WILB8`|d{819nE=*@ zhSm_iYmC;hEuj!d&+*I66$9t+3t+>wGNm%<%9@%4Jchs>Akj>A4N&}P&@(3?Bmu1p zQQQ#cHThrnpnHZC(iUfb!jyn}Mx+7cCimLsJwY24^z|*)lGI1JR0NwCSfFk^Lq}llz%H7e?Wa2FVO!YdCHiAcP^tF`N7xmdesERz z(MDm{-%yeiZK2N!l^To$1S1LrNZd+1?G0wa8LE73w}gm`i(7%X!7F%TLPTs1kMz|D z^2o(a*Xt-I=?9iCkB-cnb4GRs`jFlxGWpCBO>3y&P#stzvy7dTSTLSb-f?v!P8EJN zH+M==&n`ALrGm~#I1|8^T3B!_M1RNQc;K$6owW4ygWVFfM_h{xQ<9ULG&M)ZR3D&S zPQ&yKk&bK6h8vrkhwoXQd^3aQ^RV>lpvo*b^-SM{Z?){wbNzWEQ1G%ef{crhHaKJ2 z5HpCAckI~wGJ*aZzUKNZ=FC68}GF90CfB>zG$j`G2qQ-bbTnDZn_3G|damB>gO% zq$SkuN%VAdL(md6lJuMDk84N3X&_TqUENS!RW$=$pe%5`-_6a;f^MaehP4XbzCBZf z%5w(2tqew$l1WUDNePYd>%ed|V+JsT;LAZ`21v>a$E&*psd%eqCi-iC&>i}&pr9}d z3DzJi*GpEe)4^JP^;(zh$J*bIw`M3H&J~l4RT9%Thmn@u?e>)~jx50pJ`4Hc5WBy8 z5qNPk#6M&1umn2mEUZT)k<85G5-@URAMK>i%yrS76mI^$Xvx*Dx?BV~*9;sagTyxr zRgNu$p}%8%emJ)?RjjpDa0zG8M8EyQ%3XO5Dd4*#!Hw>TBKLnDCtCvM=Zb}ZEIf-=#g>WN{O&cS z^XI?0%_bNQLI|-0)5_m_ie>~Aa{`{Q{$?xi!gCwVaMi7*rxTK{;b!YEVfHdhTtVQh zmY~br`!Ni~7mcNXmY&{Qg+0v=hK7z66c!fdm6-G(l=R2ORp8!SzRWVdNWg(=i{V{} z_(-SL;r(kg+anB&9Q!h8(~TQfu^3UTZT{%G>csR7Or8DhmiSJ^7Oo(!4c}YK>sn1t z^Wt8U9c{}}A)mqWDb%c_tlYGYi?k)Y2t1wKpSP%_tk$;P!G|usfu%6F_{uk7tIh+? zn6wR{ELwu~et<6P4iLI_c^#c*5|kBO+}w>DU9h%T1e|WxRq4^;YQvO@bgB!?MC--x z?-XVcaFX75Ej{Zvy0J?z7Bux_!h8R19dH${g%!fgIEx3sfiu%OSyn_|FK!{&+_g~r zw$%PPLp8NX-Q#qt2v)GPDd2w}?UVAnVem)IO+>sS+6=Om7?o}zNY&j!mj@`!iV$)oC(6eU|Zm^;h51>~6=5sE(5S(GE#x7O- z$-0zG-#$Arl7Hoo-{fs`P3nivRJZzA7iJS->MuYu@623lvO(IH?f+Xy7E%=kc>Q3MQXIzUeCkdl$SY*frV7~ ziA2)$^fVu%4`}XE3qe0`v2$?5%F`#6V?~p(S2IHbL@D}sU+`8D;}OD2xR1~1jN>Dd zv%Mep{?kGI^Xs;zCQ(-2b*rhq4b}#+nS3B*ypU0dg(d}HW|mR;Nf}+yVp7|FUAbgg zg;p9j+wRi#);0WfHQGn``j1G7b3f|Kn>qg`CYLa`aA`O^kJNh^0F;I{x#st`|`yP-B2_CT* zM=97tz^?+CV>6r*IWK5$-k3q8WaIpTxFj^DjbVy1&aWfGZj13KjA_8|646-kXhFxy zE>AByqv1?kMR1c9&;hX=YT*am_hOEUd15AaDKiMO2OU z$nW#z7Tg}+26`2f)h`tpibo|>G4h}X5Fa19c4tG9n`;K?xL?KQFGaI5cEa*KK{n0J z9;-WtexmnOieZ|l{Rjh*15Au2Zv@3`brT&vjFX*Lu?4@srGX$cw zM9_ZLxA(^5q@j5O{>b8HLh>)kqe&^`d!8xZeWRBox(jjxNWmDA;WAKbObYO#Gftsjg-raqnuw5+?ZdnS~UZk*b8hT zL~IBSLol>;!%K7!ydRYC_CsvJ*eCi3XCyq>0|W^M6eps&jBkpAPOE9f?t$dR=>ftD zh``!1!u5d8rl?KN7C0pP1B+H}#OANVDEda&ikSebV^IL)nDDAnkZmURnSG;qK-JJ2 zINrw+52-3H_=0nxRaZGlmI{0NX7sIbm@Wx&8aRM~{-CVkrnR z7#sa+*Bc$Ia%3l-BNMBYnmPwvK95$QFjwCoe+Z`>#F5ZvwJBkniCy1ckIkImFXE~A zi4hmNd_X78dDjxLMDHO^$DEun%<8$!HY(+sKi2uTFKDN8c-N3~`d;<8`QkTCG$ zm=UE&vk)TU1MxM{OF7p^CzFn1wgyAXlP0QkAi@)^H&!{nEz8-#t7z3~n*g!;upFoq-#$&GWc}wk#Si109 zK&?aE>$cW)Y)*vjm57kS{kb{;+D~eSGU-R>d^-?*3V0PUcWpBpOVM~B6RII zo8rZN2Bl2*$DM~-RgUuT?BL>(R~~C?Or7Dxs(_~#-4mM}J?vbOi-L;hXy_8Q=5_cs znw43mp^WvZHyKf*ao-6*$0}h9#;`{Py>B$N^xJ~|w%O`%LB!JaJTnPiI1>|hms{=^ zymhb{?&7($TrRUKl=b9Euf)V#xHPs+zLzgvY@fRj`{mEeB#gCCQ=*1NC}nYQjf)fu z#<%!DL&HNh0pd0}bL8Y^o}Pd1xJRL#@+XvtMaTQo7W!$sjS!e_b`IOtQ;Dnsd3io$ z3Vk-quy+s{V1xUmHRJxqmfD+#>3QUP&~(~yE_ye_5oJc(+3j~_59&4u5Kuv^ACSg8 zTsaKgZHZsvIt7lV2VP>xX9WD&ovq-yniZVTk z&BnOlO?w`l@}4H=^dwATkTX+H(tjZWVh7Vl?5;#;5;U>IEc$Y~$!^$j2gg1<+-3Zx zS`#F~K^ymxPz59fUE!T+VOx?u{KVXZk_cWc*QCk!sOg=HSX_;OO4L{RV6oZxkF=ZI zxX8BpS9(`o|7;guR%3F~NR@(t;_;`Y*i7|pY}N>X&}^8K~1*O9Cuyz49q$qqx&FAM%KfJ_W+A_{W|TF z?ef~k>AcVNW<6opGH%tde@~t|wNk?a8Yk$G{~}Gh#;FURFshs}6JSieYym+$4Q^zI zCAIHCT+qKgFa39yIBbGqo@a^sWw(fcT>0?lEz9rUo76^4a|4q7|Nc%?n*5~;yDy|D z_Y4gWPdX9wA3;+KarGCk|MJ>B$JpdUwh{jyt%O$)W>1yT>&l;3EWLG-eB7`>MQM9P z{7}|>N#qrw;M6uIP-@9^$Nv56QCWW)qpe@p+~g^8W~{7SjY~+1{rGW5Y}zKwMUfE= zcizOJhCq$q7`bL+Tyipj6hn~Qy&7Gi?z!x|JO&w0<=Z$ZV%hp#>EFS0A>|SlQVf=e zTyQ9wkc<`5U_&(eB;`{qpKL~ADKaBI=quHt+@D@Vs>pSSxb*lea=nioExkMkdpl4% zmTM@A92_{KwxU}E9^^f!`TSqJ_-@hRBqmPv-a*E*Qzlp4OV!C`PjiH1$Kkzai_J2K zMN}_?rz*6M?Fc*Rs-28yKj>;fF(e0usJ*ytM3(@i^}1Zyp;?4X>)Mg_%wydA!MIE6 zAn$-p*Ka93r^@Te1vjZ~rsXL3ao4tscC1|IWng$Mh1|TMzdfKT%+m?68K!AFzSfzX zM0~MjRxkmFBQ&)=J%sxj?hq>yj--CD?tp$Ok1lH$ioD?CsB;On@gXP_QOZIr^q_f| zk_U~2{~z+Nw*6h;%n{)o&>}$(FpXZ<2;yli zpx%I?B@{jn>YD$p$Q?uu5Gjc0HsDMnip|)6HH%J8_l7>c5(=#HZtG_O0p;o{l3UXa z#>Ms+>+(I!odfuY21i0mU286uf_0TnmuX5@r+NKE{i5fW4DLqf$DO+&o$5jbF+Ebjb%E=MR`jvhbGcJky@`f584 zv4re{z)Av~Kt!k!ErnlGED%ZoQ;Va+gi`^Ll?BP4O_$63#`|n&!eI=59<4Zha!?Z_ z2^ty-Ec)SdXyO%{r2oWUg)yB$fbWDUFVeh7?o0bcZf<4 zhT&9lXB<2Zm5Qc7k`3?O8`x0!?Ea|!O_5teQ9XslcM2Joag|G`+*bxw+>8kE&we3_ zdngCV16joFi7rzr-j^3IHg&v9L0(WN#$oJFYVer4SC(J`PlPXF0T2 zDVdpcz@gx{i)!Q@V5*}$=Gm!_benv`h6C)%r8W>*j6}YSi1iiiVGs4D$F^In86 zBs4xACxk3US&U6S^u>1Hk==RWZm$A#8U#HWTn_@GK~(GB417_t%Vu1ea{(Ew72{qm zc4tIxNWvIav`}_}INc$iPb9Qf*^PY5)<9#bC=ANt~rx(D{tflwVt=t-nURliP)03LLXs|S# za6r=D`^Vbq#)Y103q>3P?ewkq18kL2vN@ESHy3R~!S+kGA)Vh9LnG9FkePI}3HiP| zBz5RagLSbM>FSGF)04($5P zgsuw)wm%bvGNx9S#d{Y*^&eYjXlfy681yJelm60SX=!<{e|eV1xH;W*^wF*;jyr3Q z0${0cJf|nMC zqb48yw)a*T3GILK)Teu;*nJsd<~-fE-T;*>tplJoQleg8wI>YTT795$3sbW7fLpu#{5 zol`;Rl*pYawsY=$ufJu?*IUrFZ}*a$FJ=CGIKj<1e7s{2|Za z8X}WSg3jSzo-WsY{aQLcpN0}n`AJs6q#y<!EEgCZOd+W1^l^P_k^Mbho;7Uj?-> z3*FO4sL!*a*(}Tx68~Fe8q5|{GpsMyLox51WrxdnSdY?Yi~j6}&^EgEs*3gTaEX~u zE-e;9$-&F|=s2QA?Rl|h16_OJ>+w!&{$@Qlnw0!GvAug=DKYXQ8Erz`>7vo5_#q%Z zyXVdCUsuw^e-RaBL~)Mw=;{*Yp~!c`Yx|fo=U&f?i>R=xepfn&Eg#8EP8&^Nno*HI zl%sM{JJqh^&d?jD>wB7?9N%QyMFWp1=fXX*@Q|Mvbll}O2&7j@wkBQzomng~3R@_X3U4U`5xi!+G<0`A9%LYC^ zwb9mEGyGWRgLchpZ!%{CVL?qzjhBJFw{sp;hOph1d1wzf4snD+O98k=sSQMk7=~QL zri*sOj-5N9y1M4y-MRlRxCRif86n37N)QO#=rBcauMWRECQ87IfWW-~JT9R!L^pfb z`s?VE6l8&+hvQC=Mp)i}wYV+7DGRgeJ!(H7X`?(bfb06dE>}>mNuef$W z|7PECPMKzm2<6W;lcX-^1w=*B6w9Gwn&$HD_Z?ZIrf;py)*&xlUFrpVHh0mI1t!E- zb-FCevpj?C4`eVt5%J)yzJ?T`Vgg{JhoJy!I;YiGaM*V zAb17Wc-P#tYQEmdJ-H-s{N`rLBC0K64z)iv;X^I2W)Ba2y22*LP6vSkR?aKDU!>b* z>{9XUV(4GDU`w3x|7kCj~E zomhG5)?IDUmNQ)Olp*BRSsVH7_IaUi)umq>NRN}R^tds1uZ$eu;F`5^`Qp-S-{W!p zou6WAbhQ`f-6pTt1_E+%cc89u-((*IY8ZW*!>eWAHJg%_A8y@AM;hc~#7*=lu=Lv(`q5^m9)$9>Q@7!-=MC~M zR%{uySJz!0Euf(CV9Jxse|}`z@8xt^*kRhOJyEwbnw>oTGHv_Lz8Uqh9av+{UmrBc zk1u~&zxmC{wFjRzoh=@+{zb|=%EfayQstyjFlE|L?E+2DL&q6jZQx5iqcXW zWoQ5HRs3!3?ND$@*>NYMyko<6-U2cL(5praJ;-PetY4~lW#CP>_?5|D8Y<;R53BKypG3EFAu2O z(-@z78bT>XuiwM-Lb9x5HM-8FD^8-UfYeA3>5hEKiR| zkLQwqGll_QvN!RiOYmNb)2# z{(EY0u}S7to6-kVL3KVIwAp?tYC)azH+`&s9p`x`#V+J%MXYng6Lk21 zKUxwLQ2sl0Anj_~dI{4{7IaSP)QdIgRU$jpD>{3)7f90dYy-bOoQ1kuE6-=@<3-4` z&qb@{YWxi$^ZWpri_9ROyq=4TWY7@$_;!-toJVfwwB(Yw#O%41VSH-5=uP<8%riG}Zon-gbMj*&Kdpsno;xBIq$& z?G@Fa8u4y9wU_KkR{zZKgKM;p2QMo$MS9Y zQd7Hptq10pk1q92ztu@^#14G9M^YI3Hj6Eq^J6=EVlLJ#wOk{L#^NOP+^P3f<6{11% zP^nPZOEp*W$>s-}gClIspokdGO%~qQSbqH^<|MlnQCAK@(V2f?Rjjg7er3#|XnSEmKtR)VUH8*hKf6fZ7}z>s z8y?hMTXU+)7 z=Q5J%*)+a1QhZW+U3o*Humk#C^KNr^CrGku%1X$jRZZsqDkGjB>YGy!kKt6D!RJTl$4m<%2;zb z=N}L^tD`zejp}24{p6&UVQcaO+1MW{{<(2}HAk*J`OQy5q>K`?My*p**RUJE%r8$> z;-y*`(Kd8tNv@*4G<@2#B24AZrQ~Bw9Nf-bPFWk|uD`=BzboQrrF*2??$o!)|3F-m zSL^5;_DJDosNfn}KS6`@RVtIVbkr#~BnR=4yZNxtP2xeeQQRjq{wu=1cj8z9ynZ zr=D>ZbV$-;w(ytTbsyQUyuWO_+)(HJR|OCbPx(y|wpL4pEAGe$ zr<9dO_-Vc)3*%x!j#qP|;aj>qxK+;B?S4r5K^s?vOESsKQF@u_MNzv0!yY6&K0S7G zwCd>PirC9=7}hY6QyQm zW*qM8OTRnIVoSLdezj!rt~Duyzxws7k142XJs(e9tM97Q!Rv~U5VKln0 zrGD#X2i*JtxiEAVDm%m<{ZP2^pm5N7`9;dtEHAI$uE%GM=DZJEtDHBdJWfL^hr3)s zM)9G(ai6$2%f0tLAFn)s<}{A%-g{MW1_UMwuMHU=e5%;ow9wr_%g*b$xD%`$kp+we z@#(7bz2r7>B>OtO-=+uYRZjN=7=RooTR?J<6|Meh2o4Q>-|ygnAw~qMsH4+rS+_&{ z3N_+;F^-KAz=fry0Eib13?#9zutY%}1t3VdsWF)4pNo=&yL7GV#kmd_G(#NH?y~;= z%v?*uJHmLCRIeLz&1~7CKjHdm-&VlFF=>KvLqkQtnB=+Ql-)O3Qfy}8<_`UQ)w-kX z8of51W>_nK7N$lnR*{AA$ZK3qRDzrQQhq1cAV4%@R@QO`#v13%_in!D|A|(Z z&!ex>b$^6vQ2S|!*FjA8I~7B*P}L!{ofc3vwlG9}=5*Q^doB&Zx3u|X%ZcmPC7~;_ za!kb1_rl}^)CB=_9Pf~vs*ea9a9;V=9h={3p!}I5E@D?#S4)_lq2WnBN5C>*ZV>9+}>OD^M8IDYgl-+iP598uK1rOE<2nasQeo8uheus4B zHSzwSySuDEFfG4$&cw?LA6(_-Ep+3(3EQ&+s!nibK|OEE#X$8QNble2ODFH%m33Wo zc)EpYnqu?Os_o1wR>wAvym&!rc1?ZP-r%hRpE58%576lsC<%%F6a3+pO@>v9JZBur z(5Ik|^9jE2D)^k#X>S<(Dq+HP3!wm@39NnnjCO797)iwo&d?nJbjFR8 z1JDD73Spv*ccl4;GV!^k!$P%bYgWL@PgHbR9<2?HVZUKSJ-{FwQ- za`|fZKz30&*h;;UlSS@z+ez5dVp61v>t5{qXr`x_xDrg|x4Ktp(6mPMbbYL#yKJ1~mn%cYTq|cu__YQ=nkI*Gu>+!A6 zr9JHvz&ry6A+nwU&)_{idi)r>Wf1b%Im|$Xp2fITHa3cBOcxae6y4X0rv|ND#__$5 z(-YqvL$~hP*sz!?AB;^~R`&LKQ?kI5^oT)MKx_WOn;dUSF1~uEE7XEo{mc&Gx@)Q7 zPs9061@QBqdwn!O>#4Vp)`3S~w$o6SP;pzvUXAbN-MQ0NLP2}6+%&87nv;EF$w+{^ zbEBeOl9s8+%Ui8K&dgoATY18W152KjhLV-Wze=3FM1*^1jVwU+xk}=AS-%sKf}(<`<{fxa6->qdb7nSp|b3bAY?o%8(P!j5>E*X{qrKw$N+SfB#xd zzPa{-CTeV*{t(>*N#E4rgK9rkr5ci=l_~B0eicHvclETXOK66M3%xD3rluw&1f|Pe zB`NL6#~BxwmXP$_{(M2mxG3A8UX8fGvyq937JtjH%CP9^{piy$V(NHc-n^}bS@jc@ znT7?agT=3dU@j7DY3-f6&rVaDBNbL1084hJShgt7O4<9Dk^_KtWI!b)WhuvwP zDINXp7c}+uR^;Dnwt)ak%g`{*WlqC`XGr>=che%iVm&~;Gdy8n;4=1G)m;&Ju4g~_ z`1@0WiMr~rSA)3mhe|Yx_k|t9*9kSYwQU2dk^E&p|M5P4@7?${K?2wIg#AY?Z^#jf zSNqSJ{;>P5kL!+&1>O&iBzuH*$N`JmbP zc{{C3|GYo^=hwftOEUh!f8Kr<6V1SX{_#0|65oHjD*wOubbp~MnIVfAT}X~$mZL0} zgKV6xATzOs@P?y?Be;XL`B~AMS3_#xI5&3QxX6JF+pX-4NiH0~_wV2LhUaVmCURhr zs!-z~i14hTA&tN4m#+66Cxj!-0LidRS+Rcq@#B)ceRy-T7Ls3RfQK;Md*6q^57CQ< zAO7rU9c4b(0W%`tDqqa8kd&n_HV%9BivQ=xh>S^<8CU2RCCAN0J8T zUr*<>Q)W`;CeUL!U^?)=6R*W2$6JlpN{X8zOAy{cOmE#$=B524E63w`&WMq#0YA#JBLZPZ{Pmb)%C8klLOmNh?x2w7E#jn?c4hfFYzKQ zjsD0kX4nwV3T>~h>fxDKUF{p~Cll^Cbos}dH{wWh;A9gv_Rh!g@wiU(wkcm zf?o+6IC=1quU+r=)a=0^CcnTyD$lh!J@A4rRV=Z85mBLp-RqE|Vr+r;^M5AW6gdsi zpg@Rh7rtv?mF8(u7;m)VE_VI9(OY*vrmx!%v8cr92)>7q7+^US;s}aLO5RmhQ!GrH z53c&(EAm*8hOJpkUq6U5_=w_*2RPTier1`QoSdGSKXy2f;n(*U6057LS{E*a9Y{?r z;@@6fp+I`|LE&>XUJWP9Qw(3?b<~QER|JIcwHELWLNGM=`CWqn1;}ps7y?m zyacb{tMqigjEszrqj&+k6cpZaoK%l_cx2ZdV`2M=%TXCAV;wHt#raKaYISAMBU10Q zRf%11&(h*|7_6m-_(ApH_T7AZBq^3Ho?V5!SqHtgjrZK5eY^0xYSd3c{nVM`b{CXr zXz$%mG!0r^RfRZpr;H4vrRAu)x~y;f+Z$#-mJ72lpWm|{q_F9ZKP5)`-H(jD=PM>w zgdmvL9{m`pSc$E!Z)z$WdgL~mK2l|4qvpu%1A>CtkWX#ew5hVHijYrMLD-&eSD2Hd z@=`NC8v^4DOR?H%ghbt`?(g&3Sm7o8^Iug})r&Z2knM08a{%Tt755y8jf!HwKGnmG z0*;)-rR1(ZwT^@OS7+{ih_L&{$M0bQ&q<@yMEyhZE-Om*u(@y3DHNz55YZF2gz*T=;)RttsofZ%98uO zeEISVvkq)*Z2Cq<0)g6Vlzr~$;lZb=X=!~!L+Mr3)Ew7WZ_c@<>fA*Yxl2@(Nmy9e z4brr^f{0XeiM)ye^cWuU|p1qEvqQa#nFIEy*Pobu|!i=B-;PkXnL|Xbs&g zcc)@5UawU#T#3HEK5uAjN8_&U-+nI#gU5)=i6;kfCu)XP27A&%Ig_(Dhl1SIR%9u55BCUBpX!S^dYTKb#-gZ{D0!mbqTe zA#eKEVQk@JXV znfvLrL)f@-aF}2HRQ(<6<_+{#*|-HyFkN9n@9#Do1Xn}zrdAsZuvKpinnr-s*h)j4c6v5Zr%6B|K9doQ%0UE zP?|C-Opj;T^scWRRM`LW{rGJ-c{Y1z7#E+L@`V1Kjx-KUv{{IlziJgsx^<*%f)j&5 zBJif0nf~L2e?ZL5`WcH(5tEV{Vbk(YFfb$O zbhVO1TzeOTNSLlr${TokD#gkpXRW(1Yq>0|^bgHAo)_X}9>5rG$Sb!}RD$HnA2xqw zlhSSuk4QRdG^jVN(-GML@!*a8KlU0w2<|FHBl=nH4|X#fNTv@SJQ%Wf-@Z41`ktU6 zLNVE1@=xCTR8KtIn{No0C)mj0$;n0}p3$WYjgEdKHey{EzKAg-7z~i6w4TCs#%%e4 zfXC@v)A0ip<>Hps7N4)v=f@@uUi$!Vd?)&>)}~OoNtY%IkEPhJ$H$bEA=k~#%hMs2 z?5Kh%9hPhfwr|jR#LE?{)yF8$+&6D7x3{;aBe_bf_S@We2S;RsIqq?Y*kHIe^dF}* zG+GT!wUse{O{n2p(LoWB$oyhHP2ouVU`f~Izm~2ejohx2Qx%;JSb8~w`?L4ghL|f> zFN>CQEx|_c2@s}*vLGhglJsqC z(%UCoD*ndHI;xgsKv?`61bg`M5;1ZW+mv;g-t4_bXujD=^Z1o*-JTeVx7pjI*y(85 z25x;PTqU8IZxa)FyK^nV+uy8X#QLYME?iE1L~ujD_8VR$UHhgFADWk5G(^3LJ{O6F zfGIOp9?Wf#6#_11pQa<1h*wKXOFNIRwfd215b5JXUOVK}2|TK;doRnD*_oM3kTk_t z<>4^yL_)?pv=EK&-o0y0bgXSo&lT|a7&VdRY5Qt*x&FCGkVLCp2!~QwfaFo8mj|$a z1r?0MsKh1Ber{g6{7d5GL)D~PTi3yu;JTW{W^R4;R< zH!xU0SJd{(ot;AP==l#N9&D+RS-X`hm}Dd*W`?|E`lc$jeo58d|NKI+54I|s9RDNu z%_I`U5BthMIBoNGqPaJwOM~KrI4JP6ruQg86I@nkc)wwY@ZzH(D_@yZm~%OWy+PH% zK@|Q6MjSl^*n-1Irr7i6%q;4)N}N}yM2-QK!Ms+&-i#@k)<1fG{NN@8+jvBMUMAe4 z!R8_^FOsCCZ{22)r1fgyJ3SqpAI`W;(~1lBM$kNy5W0K;d%w@)$J+n{pt5->Q3eEp zkb?d~W)2QRM?3}bODl_uuL^-E-4P4GfyI9QjCRA-Ya5uODO%f%LUdnNtQdj`sxV_K z!$>B1erU$+S4URjvecc!(Bf_86B7FTDi40GV0g|rl-C!Nd#oi+r{_Hv;2478!9U z0jgo@2=z^jjEt!2l5xFJpaqA89fSIs-3(WWSK7YkyUh?%_zWvPba!?6G>xe3VNp4_ zT@4@m9`-}{XxI{Q@&!tE5~_JeARbq)TzQJ&y2lm&$_g)3%h-S$t?%s6 zmNCQJJA5;TOE;TIq6^-Gv2e$$JXDuNVTL2ictnXlH8->T%5T@hUPh9`vg}qe&K4(m z#cG0=bMszW;4^Gi$_#@!fp%N1lBR#s;fTm)XpdjI>c0=x*<5Z6#f+9;T z1vPn2T+U%9^75eQuVmL&h7LUtQ5$0u_b|Dy7E=5i*cAzd*5^O|d+_i>bpcp9a9QfS z(w#eZwD?(NUB(`rwS4jX`P1jmH}Sepla;tm(6F(wl_mGYkW*0XjBJQ_^ytdp_1Z_D zzm;5{{LT>~7N>ASb9}zGm0oLI_W9KDY^1p1x}qBAOh1LE{E9dSbfInC#GelyFtM;) z)-hyYVEBe{3YgsYY_@Kb_IP@R2uD|D#u=QDN#di{7HSjiTy)$ww4=TrCkreiDM!(K(ZV7SzYLN+a<~A9ABb1T%*93b)Uocwth>z6tRK_mo=-|a z4^O_3MGjpY7x!6x9lu|{&S*JpD2Yqt-uDnGJnD7!96$TykIz*ZpALSnFujY)-dBVP zQ+O^mP5!ulGS+jCR!bnSXAlhEyYNh6111(LkzRz$;^*i0^wleB5NgxY)0HS2nYL~7 z@9Vn=Q`h#2jdcZ#ZVE;!9tl-<-;A67TUQ~Bn+gTcM@XvK6>mwRBF;fzAFRUZ7uMmY zg$T?WfC|Qo`Qf+$bHF=2KVOU9ZU%aU0ZbPld1Ib~q_xrgf(cZ47eg+6FLKPk09B4W zI<&k@cRfH`a6Ir~N5&ip_|5`#1a03mdBe&J+^!!Bg4m0ReP&Kl^~Q}G=rP!_3LIQq z-eZA@d9AyH5FkgXiRl4tB`jQ|qT*r|!N->Y$B(U;awx2wKn=dSI75v67QRsW>PCqG zDY^dYNs~i|4vF5Lw;}R_^fHZApp?tty~e36bAAo3l>3Q^SuRp4rlzJaJY0lv2%Wu; z{=s7~3@k@kx4&;`*@^=39flSo0OJnYUof0L4MPL)l}blFseh{COLS4hU}QtRP|1|W z<>d!S6EQC01wwR>Pnas~u#!>3@d5`Ckxs<^y(8*RRQ)3*auUSlb$H;;VyqG>_KSe$ z^6Otr{j>KjbL_>)IGBdvVPe1zK>pPDk`pqB+>ja5sx5FQfOr4r<=Ew$s?=i6!=>55 zIDBXJpLsL5Uo(4A`{lRRAWNIpUt*t{lwX~tjf^Vz5IlcgXieezmE>dL=GqB&FTQo1 zx|-;|EU+^3GBHn>;p?O4=L9fcd_`FragxIW1Mj%FxeahtJBfHU$XJO39FdQodU_IE zet(NFDRql@92uF5a#~zjS$VjxuM(1F-SL5I5$ZKWO+P#})r6iXs;>4mFf@FVoh`bZmp7{?(|)HPWY=vcogw*7#}vH$o^DJ{8%D7Ui0~Wk zn3a&t4DOS-f`WoH+J_YUP^j~apzE>*W}2IuYlcq49D7-_K`%ttqF8i9&AeUY!lz?l zTptVUdo%OXU!F<4iYbR{hxYFe48>G8vWsZGY;aP4`uzFyi0Y<*`m0tZX=!QSV3CcE zjAR>cPNG1~Z!G`hMB zBuvyMQl?~eVU|OuI1kak-uMhI`MZ6!TsJ&MoPT&;ImufLjDwb*-W-KF(K`?=7p{qm zVL+pd$H={;CVpGjsU8#SOFL@Wi8ZDV1H4YSv)KJO?ztJ^M4YjJ4hH=PDUqTjXydb>rk*0cOI zHN&Xs&h-RZIl0LqxK`BMNfy*Z_pYJcevs!n47g#*jUQU%HnU6Kbu8$|ZBLXQ0+UyMSm%&3tviGl`_^tatlbg> z@{qUL@x=@CBIo@(aB^?4U}?r``n|ElwuzFm?JbAQPCvAu(>IQG~Iwj4)5Vqe<*YcZLfrBpO*GQ%)N>YCEqpWI(E7~(qZ9;gOfkFHf>%W>}s7wWUA9$oOGscqQ7_wUC_v9#5W{!TI4V7SMg>h^8->2)Kd3s!>1 zaa?!5`(>)k^c)x|VrmZ`)3oF4)qUc2zY+pY{0CyEzvQa&{r%4?vTuv{#00hgb}B9o zeH-{m4d8SaZ@sNC44~%#I`;h?)rNo6Y_q+miQWY}vY$?Jb_l0>_;4!5N&4IXOG^O-%TEZIt=pC&koh{PW5+-m&{; zg%=u7v4o2|+uzRR41VjWNKZ~n`@O_t2TL#t@f6B)^$}9ShYo#*YxpE!V-|NFMlJ?6 zd>9LlRQay-CAm)y4+qHfhSUt55|CZEu}j#b{DQ^vM%fUuz3&%xK0Zl+>vGzBd*3e# zME?uYGhGfcpmao*fnP?b5a9PDEq*PlnrFMb#oY#-csE;3bgx|g)_iC2cT2dKb-M%; z^`^0jdaC2x(})2qUGF-lZ%D($>qTzSXzZ<;FI<5W8ve7vidU{J9f^0 zxQe|RTN?pb5nwf%L&VM1pwkZpvwG~Meb~q=^*!$p%LyctK(se)-i+B<+W;`@Otr+U zJ;)2Y-6@x0;#c>ixUj5qlOv5k`HjgQvdB6$Ohl>~;8fppu59WHUC$%00~EQjGPz7U zcHBdFa$l&7?#0mul-UIZU)k^6USwaZQAe>y_cZsvsi|k5 z80}%H`udf;BkN_fyDj%lzdR{ozzQ(r_OAEMAHO$r7>~8T&C6rmA#GC$6vrq>XIX%i z=FsdX3Bt#VuL}SS*GEW05q;-?_?dR$3%Lex!(+$8f^_BEy_@2#>x55i><*I$GwdyK znkT}actx#TKbc#+FEc%z?(zBaeYEx1#CEcrANygtGO(vUP+iBLqM}wM>Au;gs2qs7 zdE(;Zr-!^M?x^d$C_mQN(n66{Uc&CR;j#VW$Bn+L!zM1AA!2hCB#OZ5$|$G$J)|k4 zDAQvc{+iLVxqrrO`p@6W5B=4mwqvX%Z2ZmXw!N&MuI|Z14erjv3vwS-_N&aVN+!?d zUwx|%w5m_Gx}KS*^#Y0M|Sl$S70Bs-mde7?`A_`dp{zCUinAgsoe-Oo=yXc$_=Cc(_YLQX|R z1=p6w2&+hrKH=Ef3HqV2v5{TIjtd8{h9+T}QB7jPu17`!XZp;dDS?0_va&<~NrVV{ zL9B3VZj2HQJviQec$%%7%cZ5IiB188O5ebMkHU?~N?`Ez=xFQ~1HF(wB+#hLE)tDWSnVAXy=3!I{ zCB`oHL5lwi25w|;a{Y0WR>cx3$<|T-fPh^B0;wt!*Fdzv;p^w`pV}htwO)GbEeInV zGtBJl)M$i=6sQu$s5_;SqiHgUO?swTwpONqU;jsn0R-5btL<8+4q>pvY`SU7qOWTILg-!N%wyFBf7Nd3h*>P_TVMxqwt3{?%Qci5NS zLAI0`YUU61_3sE45*SIw3Wk=m9uMa^3jGC?9ZV=J5bU73hlL{^rR6q+*oL6Z9DvCk z<-#^hsv^?82e8c%Gi%XuT3=s68cPt+u>o{7#C-~jb*Mml2BCv+X)2#kE1%3f>N#S z^uC8x9UW}w9&_e$NPm@ZL7T=*mT*%5%14c?3iX4DIp6Fzm?mga6hPz|;fdi-3 z_Uh>UyMhFSgx(|g++k+mXr6s958U6DS_&s$oFlyY&;<~OJ190{$im!hy>$IMxYTg9 z^Bp)q3xnCU2WBa+dtx+3tw~795+UFSh}G1QFM)J}00NaNv>tCtVG2HiDgbTUZn{b9 zS6)&_dkeC&E5R)=v$9^f&dqKXC1t%GvacZIS>X2$&NeC6As*oQtRhYo{3Pl2Op|-a zS{T4mmS1S=5ShzAq1Gtyb=lpcG*-%kC!DsJFvuv~a%Ft~Ad+q1d9;a0mtoA?i5(3# zK1C=vrrnHNgRFT%F1MBQXgZ5MDB10h?<L}cfml`F+*}Df@9A^LBfvfopX~Kq5hBPl9PkLRq9MOSA`r;4mN-R-(dK|&zadYf z$XFO52WPdleJd*uyWPB*gbf2kU*s1TYI^#kU}1=j1_LJ;JUu-@6`%B-55*n<9H|+~ zt2t|&L4E+rfvSH&v5rJ}Ox#LxaB_NwRAGnFuX{$RZ> zo`)GSFs%B@-d^70VO(S+JYIBQNbeLD7T!|1i(5`4-eXhR*G4It$tVo;0D%~iCD%uN zu=LZqOLtDNgRz7+xC(qU5l4%kNk#&zRENOXd$@z!k-p?xR#sLuXmL_8^pcG!PH7%^ zB7nqDqSahnUPgX3$08C_tY5s$P~LG$ie-FqGSkx*d_umbM!b?o$=S8n0?X3KO+aFm z{W&cRI|xHBbSn$7VR|OYwogP%!!TtW;YB;~z7P%4%z1rmEHa?$`OXnmOOyIh_iL># zCd)kahaTk`=;ZFVvZ~SI=b6+tIPWh~-W6ovZ2In=NLffm@06d8;CcH*C1>gK-ZhHh zveHdWhcBT%Rg3+7YEPRRVu zRFt20*c1wvUiK?GpxL{HCz;57$VJ^3sbK)ymRuKBHIZ)2&)Q7=bu9c>8~4oXwO70! zKK^vVF6k}s(n9zAc%rJxhd~T6;l?wAt1V$=$`h_PPMd_Y69_nbiS;pu>;tu|q@+~jX>v0*609IPAu=t`Vqy;y1Ghv_<7-{mdQNBFOLMQC zS0PQ$&H3x3-Odrx{xd%_bJiY|B!w9rs7J9hu9RVOK@Sfh6icLL%;VHIFsK5_0O8t) zh6d{grDRWmP~ey!Dt1tmMzQT^aYp0#HdBWDpMEyAuNk(N9?04{BRg$$usze0qGDrNf}MT- z_u7fFjl$T%zTSq^#np%WtA7R=uT6C@yzVIX$FUj0BgL}tCf9MHM{#a_M8vozYJY-g z+QHLnTKQ$g;<0?1%YDA*leD}WhOAciKRe*v;u&u^(I&`SenDS{A)1SNqMbfdIP?C; zE3eX7t5BG8F^rW4YVQ~NvD?9gO^=M^Z)`wC>T{3->T2n~eQ%BX`G4W}e5coA6nT^U z@nh~%`!a%ps3Aij_SdYrTc~P)^;WX0A^M6)*-EY#d3=(v|07mn5T?HmA3hug7Pq6! zUM>H~e{Q&cb^j}h3Eb&bu+-SMh-sYrPRID6!5hF?jEx@HG%HjoJ9OBzm!Iwom8(tL z;0;-O*37bYg3ZXt2!bA<_Ymjd@r zDvSNcuTQpaDXV_hH$3JumS#oAeTd!Q#uOQ;zP@3mBiJq7AfLQZGwl9}y>8|+yQmKy zbXfjmAS*BX)HTu5t8mOCTJyvS6%+?V&cpSI zu5Cc^=E`MLzlvS$O=&is6O~59jh=P?W>grl@SfsGM%m3nB9tEl-$TIP@$uX!3q&v1 zP@|$SL;3?X9o-QJhwQU1sYXg>%b_`(&LI^4P!V&&F<+xf(Lsp;_(zNCfbiLUC(c9? zQRJqcOMAhG^2V>QkC~>#B@5Ea1?D-ry4Ipaq~{5L>3N!u=^}QceLsYO^&jSE<@^yD zA~&KT_fmb_y4=zyZS)Zx?eORK5z3y`G3O6lv^DqVU_O)d<_$}T*iS|MUzR-$r>0va zB*f-MN3xxp7>m3rbavAZnIA#Th01Hv4o}qc`zK#$@&By9czPeUqT=G4XdFdir+&8PtE2(yopD+@!eN)@n|mc zJBPVRqqKdJ#|L#fszytsH95Rz_);Ux8d5UUPoJzI(4U#WL~k*kBI64g7t=lEU5*d^ zJu~%l_VLij%;P($`RCV6e^TF!TUuTQT}DpJCQRfcfmFny+Q$0?f-a)aL{v$}+0Qen|m}oy;lnP5p zGMZKtBm{IdjUW^>Os6lio*|KV{+>9ZqLYAg#U1Hu;V^q&LQX8{(QDo?@IO}|Z8;-WPJ}I*O-V9_jg9xvy1Q!tz9UV+e6ent<3vT_C z$$un=<0OXSb`9@*8LcNf;#B;K`JR~5qA2#sODl~gW47o8(bCG^{42^5#;f*j#!U9c zpH1_V-!ml?hb&$VON}xrYoDi(6ptQmy>9;W`SKStt&R1fgeL(j3#TI7*2#}C@NO

@HQ?zJXa1yr1r08!XICN3GT26LO;|rlWb-?<11RLMt zSJNP6Plispqu4{qBO6}duqIpUc-PislpCU}tJ^nwvv2lMgIsrKcfQj&%VkgCiUF8* z!iRN*bK7mMP4BF+F&&Ap9IUVOZd}GC0$YW;pPCvI zv9z8{15Yn6ud)?sU97y^w(3Xj2_EwX*T-77fVv|BB1!Cr?7aWndJmNN(ueyyskdxN z&HuH9q=7_AOtTmhiSu^a83ruMu%(=??WoaG$b?Kl)Yq^sgu&6{3HjCXlHeH~C%?;q z8k0J4p=<01d$0Q}J<+|PW+il!*jHNK9`pn<4SVV7l44mzUE=x>68S#xtpxFx;5M)Y zfWT!OPWpv*+@v*PIZ5u{f82stQRho;Ood^M_v1SxWry-%TSaz9R@po!R8a&KIe>)7 zpwQ6sy)upLwQXyKYsiA*f(a2 z#_XxT*8@8QtN z=tyhx%v5-)y;)alqk)VnF~6b4e)Nf~<%Dlw1*<53c*Jl;7Z1%`FOC1RcI%j??)=%K z;Ic1`Tnrz0w+lGpYse0*+vmYvWI&*Zchq61R3;=oatmiYL?In-Z?p}jVZ#8Q{8{|R z6Q-{PxJewK0FSw9+U1(W=C7AAie`IxX>iGG_D1|Q<1;1fyu^N9IpmaMIqqs)6cwVk zUF68izKcJHMyk8II42oBuid)UPU|)`G572HSvmTJd-SH&b=|a08i|`p>aw>PRy>!s znXdKjN5Qz*JDl;M=qAO1CnCNNlPTsWH#kN__6)wYmsS;yBqM=YVe|Z6!RuP!y69RR zId+th{_%^{)UNfKV6!M0`%Ae$&+2)W&(I!?{`}sMhll4?Dsy#D6`3&)W0)ob(54PC zmJ}}?jU~>fa;lq2cH{!`tvUm|<%~t&1D)GA%=#R3HqyxDY>P;b*s7FQ&pe^1Qs8X-uFT?SlubM zc&vy}Q61MeGE&rEI=?yM6~Ts+NW8qJu(_n_b-CQkCU?JilY=zm;xa!!KW6PD$Hf3L z_ma6eJwqTx@N*(lGT%-p<)AMcgn_N2uQ2)RAlUTz{bzVyM#y?#P&8nzwD(dFh)`&g z$nQ`Bq-!5<9NTPFa%@m%#Zj(O{q@SC?(fZEp-!xt#qo;lCvGpE+7wuQmg)-QLW|;` z+Wu^+Ea!`s0^YA*({9?n{eF-&6BpMJGOm9#_F~|wx%jW$HA=dcY@4$iP!C$-_FEI{ zYb@U@vJ^vaFIY_(>FDT>7pw2_QQwm`XL#a7aF3Hf!&8r{Js#$kR-ZfPPgkWsyBAi) z9pNy4kc*3JXKF-cT^;R>sjF%pr(>&9AD6IkGaCk7(l!W{JjLcv%$OykMR|#F<2_`K!6|dr5x&b4PH6fB*gsvknte-v%EOg=Chkgsr5e+-IkdK@YBqDQbWJ zZ9F}K-mh~6_fpN-?|f>V^Qg=G3!S*Hk39dBbKM|Os{w0@A5z2iv6KIirmIFC z5j+99FaM^yWF!`gy^fIm2P9ZLEch5=ZiaGI9^6W>c}Wu2#IGI+t0UVyb9W~5S=lW) zn{7jv_i@chIhZ! zdg0}rJjs8V8)6ozqyrP+q`sfO$?tf>xFBpuA!~Mg82F65;rXOe)jRG7UK%Dl#4Pwr zNRq$gWNy_9;89eqVw>K{r2jNKn<=?29hB#-Sl%g@s~pPci5VS?A~VAH%-ZCH;_?6CQHR= zzxl#Kk8_OWXruPr_v&hHl`3vN{5r%j%)1ug6<@qp0O|tfjhm99wS7Y;S_F*7ldNt# zo4cyS0Ro8nk{l8HkpB4o{nQ6Hu}i+nlCMnLaj1=Z+v^o32liY1Cmj;T&x%}oeY=~y zLKR<~cVf(AG;Jf~IF@eIX3Q&miz2TUG4x5kAq&NJiaECy1)$B%aarg!yoVexEQ z>^%OL(7wFZ%NoE$E;kG~$i7%b4!H~;l8YimOzrY{A9Fg#jko7Yg>*^0x<@dKm3mPm; z{)wTD;%5`N$)28Lc$44$=u)+V@gEX4ySJR#XyUtcFZI<+t|GJ>!Jj_mw=+b81euf^($?G%k>-3p|H96c3< z+0BB2gR8Kl#m1@_^DyGM8d4yQlYwDd#QdQ{fTV_;Vzp{y)^R40m2_A?d~$K5_f+^= zZ`GYUIG4A&y1Gu!|F!v3(OtOpT}2sh&4AUn&Q6&zeQCB_u3!pp`1;KHyw{<2-QhYv zk2)9Owu5~?e?IRyzQP~(M~aj^{Nc+5!+_W1g;d>A_PeJYST*xcYyXfuf78;*#YM$! zQC44{x>Axfv4e^zJ64R-AGen z$I^xW#hsC#Qs&UFib;`M3APYyc3fOs-`E%piI~EHzh~S1kWa3+|DUZ7VO0yiUPqP> zro(hKh$iM3=9l6$z-VXDIo1>B6+`6`0_r)zjH2^=2Sg282I8UZT*q4<^ZfN64~e}( z@cYYzLkk7C13GYw_ycCBJMLzw>3=UgJP>Z(vlG`eyqa5CMlcdm5@zLdV z*hq*NoFEq$CV!AFW{2kGTbrch`3l4AMMOT9mX+;frGZ-FBs7?#9+*j7jb?9dGC6B4 zM3L?9oPzdzTlU9n>^?|7_*e^kD^+Ev8m!~|XtM21R=9ZUd?)dsDUV)^b zw}ebakF9j^9qs8KtbT`_kT04I+l6t3XIYPwJn9F1M5N$a|5$#C|z9(?jQJB&-eNde~wKoj01i zK4iPU2eFB$NhTl(#47}tcnoAFfB+iE4wAdob4|vr?z-ZhXKkxYMZg?eqQ^W3go}CQ z_OKfg!vq0rfynnE@E*LsG5n6iGXcx-0xMS5r_7Y6G!#wMXQ^q&Z41aYS$bUET9Zni zSh7)4TzqNijrro=+$MCA{T-RyQ2c?XZ0ZYF4#W9v#CYtBB*nhXR0*4;rP_+>Zfs)9 zw;x**)o=Oq+U}yB!ZYpAR+q`|TORHU^+({rb8!K?=e#HKoSewze>09x0-?tA#LImfK!v@;VplgTZ+S!voTlw@4i@yy73b!rlvM|wNI zp_$b4Rr;IZ<+m(BW-%bFeEnRHRzUq2H0Z=*shy%xg{PL#6sP$fvxN;j6d8Ps5GNc3 z@qq{Ddiw#;JrHDadz01k?xdn)*Rn2oDj?aNBezV^Tr_*Hx}RWzF-3{cvNN->1;Ule z0tqP|+-&)v*h4qPy;CfcQ?5~YbZA|*uo$NsAelEiuP!>Sf{0s06g0ssu3~f(yZ9CL zhaO5%U#B!W^>%n9-bhIh@w@+|W2~dbGILY%OAYjH^lr+9Sw7a1L?lysbW&^42r(V?uXMiG~vviE;Sd$L&@dEY!#fUJ5|-*Vvgr4->h@Rq>g@?^A}Us$Qc{QP@5=9x-~3-R zgpH12?UQ_ha&w#JL(KhMBuVRyk2nG`#tOw~8eYOD;^64`MIm;VtSmc#cZ@t7>-g7b z(0b<%%*VcZUv1RAt_9Cp{~y=}DvPAQ9(4(c87L*Hl>a-PAZ^88Y{KGK6no2*j_oBY zUR!>%MmAOTanXBxn%gc~hLxxK6oDKB_R`wgipG!C-{h3gZmhE zG8$PQNHe`7FciwTDU4J!+$$jfrJ_;LZSgoFe_dO;W&(3-${uoDSCz%U7R zpY#-Z^lz9lfpBJs+Bnd-G(4A<%va8q7EZffAPzj- zb+?VRg&7EzcJ1AJbZUSfCp}TytS=5SelNSt29FvsVtyK1&!9imy=aaW&w#MtB+r+f z+f(MxYQtpt-^~Lg(glyX^Q$NUNZv%1G2WhWT9-jJ$Sy-Z{#=K8oM4o8XwAR3SYKbi zZ^w{volSol^}lfm#liN#;lb5Sxkws$Qpk#jM;nRRkpUEH!KK_T!C#j+X79*8URePljI z6qRTTN>RwEQcwTRZ6bhjYHI3Acs4?BHOch4`$G9+28^BXp_Ja7{VTlkY4&eY9b zy8Y+UlzhQMS;|Hq1fz9r0P%>0a#8~L(3BQtXhV)YWJ!0LzIBq(`wnI7xI zG%Uf$2Epz3N<3ByPQLgWz5Sx{_}sMVchd*gXNONOmG?3_p0oc$*SoNyCP48rKKT*^ zP_L1k@C#;`G1s>vuBNDyjzUt>0m?y>J3v3H!`$Eru4VGM)aNK$t!!;ihw~~=X6@J? z@42qIqN(|I@{{w~gWH?jLlfQ?PDWN&t7T+mjkmql8@n!VXlmL4yZzo1U@mw3vZb7! zt#PjqKbIDjsN5SJ{ORIW28Vv0Vm{XB?g>|;Hmmd2XA-X6xS`k3;B{@NX`9eCnv*qK z-`JcA8+_F=`bu~0xuLCI+gN7IXWyQp<*1)~6;GeO9n&=OsLA4Sg9TouVVzKZmylE} z)vb#B7i=OIewi#~Y-ihk9gxY;?9I*sq3(i}@v^AyVWsW@bA$H73Rxq2NUO^LE+3tI z5yiFTK@ksm92KeJSv#X6J2wQn@mXTo)`izfDfwEfss(*3NEhX|^K2 z*Cs7nM=Mq5tCOR_l6&Stwj)!Kv0m832gh4g_3rDLZC0a2ZRe7|XuV&^FJ96GeA2bP zsFK=g09(~*lx`13Zr-gMq`36i<;R`GYSlQ~?zQP-K@=ns>7x9ppdI5Z6gm3o8>V@D zt=He0bQWaT6?QW!t9+BV{l=%uuJE<7@XNNgioE>%7fws@(!Hf$TL0z^i#rP*6tcW@ zNu|?9w_@Xou6VT0t_Yoj?K?(19j1>aDtqbL7N(qh-%-cNi_Rr;eqrIU=8HV1r8jrq zKNFAsRH^lWFNo4sKisHj;q##jcqybs9y40UDtRlFaQz~SdOAfFTE^pC1zuOL9?Lg8 ztAEAkb~epQN=d!w>@@iN`7=_EPlO&*gAE|9V;motKVl^vD=#bC{N+o8 z{DkXNpRJL0!v3a)1=HP+PYT3q9*Ebp#!GK$X~FNt)iGYTmspEN?ZRK&fc6U$OhDUF?L> z)<~uv;+x}M<^&XZb2xqS-s@4uznJ||>yyjyJBbSc9li>qYt;|KqPkVIXjM(!+At!{$$$eCrkVp#H7ka{CR|WCj;>(A{eQNKmXr;dyw|)HXVM}&8~L#_OH*S()~6v z7!A=WEGkmxc4(4$#j}ZtiQqMNuBj{!u7{rMjc@I~HZ?r&nDNliGuNo@YBP3x7foy-K6&D(=8;U*i$4DsKXD$O literal 0 HcmV?d00001 diff --git a/doc/api/gs-example-search.png b/doc/api/gs-example-search.png new file mode 100644 index 0000000000000000000000000000000000000000..77611bd3cb6a6179a5a3f49ca1deacbbfaf21703 GIT binary patch literal 24934 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 QZ*85Xs?PCD<@0y{3mTLM?*IS* literal 0 HcmV?d00001 diff --git a/doc/api/meson.build b/doc/api/meson.build new file mode 100644 index 0000000..2ccab7b --- /dev/null +++ b/doc/api/meson.build @@ -0,0 +1,11 @@ +gnome.gtkdoc( + 'gnome-software', + src_dir : join_paths(meson.project_source_root(), 'lib'), + main_xml : 'gnome-software-docs.xml', + html_assets : [ + 'gs-example-details.png', + 'gs-example-installed.png', + 'gs-example-search.png' + ], + install : true +) diff --git a/doc/app-developers.md b/doc/app-developers.md new file mode 100644 index 0000000..cdf34a5 --- /dev/null +++ b/doc/app-developers.md @@ -0,0 +1,69 @@ +Tools in GNOME Software for application developers +================================================== + +GNOME Software is often where users will first come into contact with an +application which they might later install, so the impression the user gets of +that application is important. Application developers want to see how their +application will appear in GNOME Software, and to have some control over it. + +GNOME Software provides some tools to help with this. + +If there is a supported tool which is not in this document, please +[submit a merge request](https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/new) +to document it. + +Metainfo/Appstream +------------------ + +The information about an application comes from its metainfo (or, as it was +previously known: appdata) file. Metainfo files for multiple applications are +concatenated into ‘appstream’ files. Almost all of the customisation which GNOME +Software provides for applications comes from information in metainfo or +appstream files. + +So the first thing to check for your application is that its metainfo file is +complete and valid. See the +[metainfo file specification](https://www.freedesktop.org/software/appstream/docs/). + +To validate your metainfo file, run +``` +appstreamcli validate /path/to/app.metainfo.xml +``` + +You can add this as a unit test to your application by adding the following to +the appropriate `meson.build` in your application: +``` +metainfo_file = files('com.example.MyApp.metainfo.xml') +appstreamcli = find_program('appstreamcli', required: false) +if appstreamcli.found() + test ( + 'Validate metainfo file', + appstreamcli, + args: ['validate', '--no-net', metainfo_file], + ) +endif +``` + +Context tiles +------------- + +The context tiles which are shown on an application’s details page in GNOME +Software are derived from the application’s metainfo. + +There’s more detailed information about them, and the information they are built +from, [in the GNOME Software help](https://gnome.pages.gitlab.gnome.org/gnome-software/help/C/software-metadata.html). + +Previewing the details page for an application +---------------------------------------------- + +GNOME Software allows previewing how an application will appear, by loading its +metainfo file directly. This allows previewing in-progress changes to an +application without publishing it to a repository. + +Do this with the `--show-metainfo` argument: +``` +gnome-software --show-metainfo=/path/to/app.metainfo.xml,icon=/path/to/icon.png +``` + +This will show the application in the details page of GNOME Software, and will +also display it in the featured carousel on the overview page. diff --git a/doc/debugging.md b/doc/debugging.md new file mode 100644 index 0000000..8c33bb4 --- /dev/null +++ b/doc/debugging.md @@ -0,0 +1,66 @@ +Debugging GNOME Software +======================== + +GNOME Software can be a little harder to debug than other applications, because +it is typically started early in a user’s session, and it runs in the +background. + +Runtime debugging +--- + +If gnome-software is already running and you want to enable debug output from +this point onward, run: +``` +gnome-software --verbose +``` + +This will tell the running instance to enable verbose logging, without needing +to restart. + +By default, all log messages from gnome-software are sent to +[the systemd journal](https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html). +Messages, warnings and errors are always logged; debug and info messages are +only logged if verbose output is enabled. + +To view the messages from the currently running gnome-software process, run: +``` +journalctl --user --boot "$(which gnome-software)" +``` + +Start-time debugging +--- + +If you are starting gnome-software manually, you have a little more control over +log output. + +The `--verbose` command line argument will enable verbose mode for the newly +started process. If run from a terminal, all log messages will be printed on the +terminal rather than being sent to the systemd journal. As with journal logging, +debug and info messages will only be printed if they are enabled. + +An alternative to the `--verbose` argument are the following environment +variables: + * `GS_DEBUG=1` + * `GS_DEBUG_NO_TIME=1` + * `G_MESSAGES_DEBUG=*` + +`GS_DEBUG` and `GS_DEBUG_NO_TIME` are equivalent to `--verbose`, enabling output +of all log messages. Normally messages are printed with timestamps, but +`GS_DEBUG_NO_TIME` disables that if you want to save space. + +`G_MESSAGES_DEBUG=all` is equivalent to the above, but other values can be +passed to it to filter debug log output to certain message domains. + +Persistent debugging +--- + +Verbose debug output may be made persistent by modifying the autostart +configuration file for GNOME Software to add `--verbose` to it: +``` +cp /etc/xdg/autostart/org.gnome.Software.desktop ~/.config/autostart/ +sed -i '/^Exec=/ s/$/ --verbose/' ~/.config/autostart/org.gnome.Software.desktop +``` + +Note that this will produce a lot of debug output which will consume a +noticeable amount of space in your systemd journal over time. + diff --git a/doc/design.svg b/doc/design.svg new file mode 100644 index 0000000..4f9a181 --- /dev/null +++ b/doc/design.svg @@ -0,0 +1,448 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + Plugins + + PackageKit + + AppStream + glick2 + + epiphany + + listaller + ostree + list = Search(text)list = AddInstalled()list = AddUpdates()list = AddPopular()bool = AppInstall(app)bool = AppUpdate(app)bool = AppRemove(app)bool = Refine(app)bool = SetRating(app)list = AddCategories():str name:list deps:bool enabled + + + Applications + :str app-id (e.g. foo.desktop):ptr source (e.g. pkgname):str management_plugin:str title (localized):str description (localized):str screenshots:str icon_uri:int rating:int state (e.g. installed):int app-kind (e.g. codec):int install_date + + + + diff --git a/doc/media/featured-curated.png b/doc/media/featured-curated.png new file mode 100644 index 0000000000000000000000000000000000000000..45deaee1984543c6d52bba78020ecafb3a978ee0 GIT binary patch literal 91876 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 n!f^$#B!q*t!$*SZj^rxzH~-pZ;R%$GxGu( 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

UXi&N079U;f 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 Miq5g(BWD8tKYy*~i~s-t literal 0 HcmV?d00001 diff --git a/doc/media/gnome-os-upgrade-banner.png b/doc/media/gnome-os-upgrade-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..7b69e35c1791c3c2ac3dfd629fc21e47a1cd58c3 GIT binary patch literal 117002 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%0A?j>GZ~I{>b3}N7C#Rgf!TjM)QQiNJ#M#iT;q; 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 ND9WnI)JvO({|^-B5RU)= literal 0 HcmV?d00001 diff --git a/doc/meson.build b/doc/meson.build new file mode 100644 index 0000000..1a1d9bf --- /dev/null +++ b/doc/meson.build @@ -0,0 +1,3 @@ +if get_option('gtk_doc') + subdir('api') +endif diff --git a/doc/privacy-policy.html b/doc/privacy-policy.html new file mode 100644 index 0000000..ad97cac --- /dev/null +++ b/doc/privacy-policy.html @@ -0,0 +1,31 @@ + + + GNOME Software Privacy Policy + + +

Policy

+

+ GNOME Software can optionally use a ratings and reviews service offered by + your distribution. + If enabled, GNOME Software will notify a web service that a specific + application has been installed or removed. + This information about which software you use helps us provide other users + with more accurate recommendations and helps us to choose applications to + feature on the overview page. +

+

+ When submitting ratings your IP address is sent along with the usage information. + This is exactly the same information submitted viewing this web page. + A one-way hash of this address is also stored in a database to prevent + duplicate entries being added by the same user, but this can not be used to + identify specific users or network addresses. +

+

+ We will never share the list of applications or your IP address with third + parties other than the original distribution web-service used by GNOME Software. +

+

History of Changes

+

+ Modified 2014-02-04 by Richard Hughes +

+ diff --git a/doc/update.sh b/doc/update.sh new file mode 100755 index 0000000..5abf679 --- /dev/null +++ b/doc/update.sh @@ -0,0 +1 @@ +scp api/html/* hughsient@people.freedesktop.org:~/public_html/gnome-software diff --git a/doc/use-cases.md b/doc/use-cases.md new file mode 100644 index 0000000..c60eb4c --- /dev/null +++ b/doc/use-cases.md @@ -0,0 +1,38 @@ +This document will evolve over time to indicate what goals and use cases +gnome-software targets at the moment. + +Primary goals +============= + + * Allow people to find apps by browsing or search: + - a specific app that they're looking for, or + - apps in a particular category, or with particular functionality that they require + * Allow people to effectively inspect and appraise apps before they install them (screenshots, descriptions, ratings, comments, metadata) + * Allow people to view which apps are installed and remove them + * Present a positive view of the app ecosystem + - Reinforce the sense that there are lots of high quality apps + - Encourage people to engage with that ecosystem, both as users and as contributors + - When browsing, present and promote the best apps that are available + - Facilitate accidental discovery of great apps + * Handle software updates. Make software updates as little work for users as possible. To include: apps, OS updates (PackageKit, eos, rpm-ostree), firmware + * Support multiple software repositories, defined by both the distributor and users. + - Show which repos are configured. Allow them to be added/removed. + - Handle cases where the same app can be installed from multiple sources. + +Secondary goals +=============== + + * OS upgrades + * Hardware driver installation + * Input method installation + * Respond to application queries for software (apps, codecs, languages) + * Offline and metered connections + * OS updates end of life + * App end of life + +Non-goals +========= + + * Not a package manager front-end + * Not all repos are equal + * Not all apps are equal diff --git a/doc/vendor-customisation.md b/doc/vendor-customisation.md new file mode 100644 index 0000000..ff2c51f --- /dev/null +++ b/doc/vendor-customisation.md @@ -0,0 +1,243 @@ +Vendor customisation of GNOME Software +====================================== + +GNOME Software is in an unusual position in a distribution, as it lies at the +interface of the GNOME project and the distribution’s packaging and release +infrastructure. GNOME Software is the user interface which a lot of users will +use to see updates and new releases from their distribution. Distributions +understandably want to be able to put some of their own branding on this +interface, both to publicise their distribution and to confer some level of +official authority on the updates being provided. + +For this reason, GNOME Software has a few ways which vendors can use to +customise its appearance. + +A variety of different customisations have been implemented in the past, some of +which have been removed and others are still present. This document aims to +document the ones which are still present and supported. This document is *not +necessarily complete*. It will be added to over time as different customisations +are refreshed and updated. + +If there is a supported customisation method which is not in this document, +please [submit a merge request](https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/) +to document it. + +Likewise, if your distribution would like to customise GNOME Software in a way +which isn’t currently supported, please +[open a new issue](https://gitlab.gnome.org/GNOME/gnome-software/-/issues/) +to discuss it. We don’t guarantee to implement anything, and customisations are +limited to adding branding in specific areas. + +Principles +---------- + +The principles which guide vendor customisation features in GNOME Software are: + +| Principle | Rationale | +| ---- | ---- | +| Avoid requiring vendor specific code | Otherwise vendors have to maintain and test GNOME Software plugins, which is a lot of work. | +| Don’t use GSettings unless customisations really should be per-user. | While GSettings overrides are convenient, they are designed for user preferences, not packaging customisation. | +| Don’t require downstream patching of GNOME Software, although configure-time arguments are OK. | Many distributions are derived from other ones and would not like to have to maintain a packaging fork in order to make small customisations. | +| Be mindful of release cadences. | If customisations related to a new OS version were tied to the release cycle of GNOME Software, a new GNOME Software packaging release would have to be done by a distribution in advance of making their new OS release, which is a burden. It’s easier to allow distributions to put customisations specific to a new OS version into a separate package. | + +Upgrade banner background image +------------------------------- + +The background image which is shown when a new OS upgrade is available is +customisable in several ways. It’s displayed by the `GsUpgradeBanner` widget, +and shown on the Updates page. An example upgrade banner with +background image is shown below: + + + +If your distribution has a specific GNOME Software plugin providing its upgrade +information, that plugin can provide CSS for rendering the background. See the +`fedora-pkgdb-collections` plugin for an example of this. + +Otherwise, the background image is looked up from several well-known locations, +in order: + * `${DATADIR}/gnome-software/backgrounds/${os_id}-${version}.png` + * `${DATADIR}/gnome-software/backgrounds/${os_id}.png` + +`${DATADIR}` is the configured data directory (typically `/usr/share`). +`${os_id}` is the `ID=` value from `/etc/os-release`, and `${version}` is the +version string being upgraded to. + +Featured apps and Editor’s Choice +--------------------------------- + +There are several ways to promote and highlight specific apps in GNOME +Software. On the Explore page, there’s a carousel of featured apps +(`featured_carousel`), and an “Editor’s Choice” section (`box_curated`). Both of +them highlight curated sets of apps. The same is true on each category +page: a carousel (`top_carousel`) and an “Editor’s Choice” section +(`featured_flow_box`) are present. Category page is the page shown +when one of the app categories (`Create` / `Develop` etc) in the +Explore page is clicked. This is explained in the following image: + + + +Both pages also have a “New & Updated” section (`box_recent` or +`recently_updated_flow_box`) presented below “Editor’s Choice”. The apps +listed in the new and updated section are not curated: they are chosen as the +apps which have had a recent release, according to the +`component/releases/release[@timestamp]` attribute in their metainfo. +Technically these are the results of a `GsPlugin.list_apps_async()` query with +`GsAppQuery:released-since` set. + +Apps are included in any of the curated sets through having special +metadata in their metainfo. The required metadata is different for the different +sections: + * Carousel on the Explore page: Apps are included if they have + `component/custom/value[@key='GnomeSoftware::FeatureTile]` or + `component/custom/value[@key='GnomeSoftware::FeatureTile-css]` set in their + metainfo. They are also required to have a high-resolution icon, and the set + of apps shown in the carousel is randomised and limited to (for + example) 5. Technically these are the results of a + `GsPlugin.list_apps_async()` query with `GsAppQuery:is-featured` set. + * “Editor’s Choice” on the Explore page: Apps are included if they + have `component/kudos/kudo[text()='GnomeSoftware::popular']` set in their + metainfo. Technically these are the results of a `GsPlugin.list_apps_async()` + query with `GsAppQuery:is-curated` set. + * Carousel on the category page: Apps are included if they are in the + `Featured` subcategory of the displayed category. They are also required to + have a high-resolution icon, and the set of apps shown in the carousel + is randomised and limited to (for example) 5. + * “Editor’s Choice” on the category page: Apps are included if they + meet the requirements for being in the carousel, but weren’t chosen as part + of the randomisation process. + +Example: +```xml + + + + + org.gnome.Podcasts + + + True + + + + + + org.gnome.Boxes + + + GnomeSoftware::popular + + + + + + org.gnome.Builder + + + Featured + + + + + +``` + +There are several ways to modify the metainfo for apps so that they are +highlighted as required, all of which involve providing an additional appstream +file which sets the additional metainfo for those apps. + +There are 3 main approaches to providing these additional appstream files: + +### 1. AppStream files via `gnome-app-list` package: + +In this approach, a distro-specific appstream file is installed in +`${DATADIR}/swcatalog/xml` via `gnome-app-list` package, providing and +updating it via normal distribution channels. + +If distributions wants to promote a different set of apps (than the +one provided by `gnome-app-list`), the recommended way is to provide +the additional AppStream file in a separate distribution package +(for example, `debian-app-list`). If the distribution already ships +the `gnome-app-list` package, the distribution package should mark +`gnome-app-list` as ‘conflicting’ with the distribution-specific package, +so the two cannot be installed at the same time. + +Distributions should not patch the app list provided by `gnome-app-list`, +as that app list has been curated and endorsed by GNOME. Alternative +lists of promoted apps should be labelled with their curator, not GNOME. + +### 2. AppStream files downloadable via remote URL: + +For distributions which can’t do regular updates of individual files – such as +image-based distributions – GNOME Software can download distro-specific +appstream files from the internet. List them in the `external-appstream-urls` +GSetting in `/org/gnome/software`, typically via a distribution-provided +GSettings override. Each URL must be HTTPS, and must point to a valid appstream +file. GNOME Software must be configured with `-Dexternal_appstream=true` for +this to work. + +GNOME Software will periodically check and download any updates to these +files, and will cache them locally. Ensure the `If-Modified-Since` HTTP header +functions correctly on your server, or GNOME Software’s caching will be +ineffective. + +The `external-appstream-urls` mechanism may change in future. + +### 3. AppStream files shipped with GNOME Software: (for testing purposes only) + +GNOME Software ships a default list of featured apps, chosen to match +the [GNOME Circle](https://circle.gnome.org/). See +`data/assets/org.gnome.Software.Featured.xml` for this list, and for an example +of the metainfo XML needed to feature or highlight apps. See +`data/assets/org.gnome.Software.Curated.xml` for a default hard-coded list of +curated high quality apps, which is displayed in the “Editor’s Choice” +section of the Explore page. + +Since GNOME 47, `gnome-app-list` is the recommended way to ship the +additional appstream files. AppStream files shipped with GNOME +Software should be used as an interim solution until `gnome-app-list` +or your distribution provided app list package (
as explained +above) is available in your distribution. + +Pass `-Ddefault_featured_apps=true` when configuring GNOME Software to +enable the default list of featured apps. Pass +`-Dhardcoded_curated=true` to enable the default list of “Editor’s +Choice” apps. These options are enabled by default until GNOME 46, and +disabled by default from GNOME 47 onwards to actively discourage their +usage. + +Deployment Featured Apps +------------------------ + +Deployments can feature their own apps, which will be shown in the Explore +page in its own section. To have the section shown, two files need to be provided. +The number of deployment-featured apps is limited in the UI, and if not enough +deployment-featured apps are found, then the section will not be shown at all. + +The first file is `org.gnome.Software.DeploymentFeatured.xml`, which works similarly +to `org.gnome.Software.Featured.xml` and should be saved beside it in an appstream +directory. It sets the `GnomeSoftware::DeploymentFeatured` key on apps which should +be featured for this distribution or deployment. The value of this key is a string +containing the deployment name as an identifier. + +The second file is `deployment-featured.ini`, which contains a human-readable title and +the selector for the section. The title is a localized key, and is used to set the heading +for the section on the Explore page. When the title is not provided, a fallback title +"Available for ${distro-name}" is used. The selector defines which apps should be picked. +It is a semicolon-separated list of `GnomeSoftware::DeploymentFeatured` key values, thus +the deployment can feature apps from zero or more vendors. + +The `deployment-featured.ini` file should be saved in one of the `sysconfdir`, system +config dirs or system data dirs. They are checked, in that order, for existence of +the `gnome-software/deployment-featured.ini` file. The first directory containing +it will be used. The relevant file names are `/etc/xdg/gnome-software/deployment-featured.ini`, +`/usr/local/share/gnome-software/deployment-featured.ini` and +`/usr/share/gnome-software/deployment-featured.ini`. + +Any changes to these files, including adding or removing them, will only be noticed +when GNOME Software is restarted. + +Example files can be found in the `contrib/` directory. diff --git a/gnome-software.doap b/gnome-software.doap new file mode 100644 index 0000000..d2ad43f --- /dev/null +++ b/gnome-software.doap @@ -0,0 +1,47 @@ + + + gnome-software + GNOME Software Tools + + C + + GNOME Software is for installing, removing and updating software. + + + + + + + + + + Milan Crha + + mcrha + + + + + + Philip Withnall + + pwithnall + + + + + + Richard Hughes + + + rhughes + + + + + + diff --git a/gs-install-appstream/gs-install-appstream.c b/gs-install-appstream/gs-install-appstream.c new file mode 100644 index 0000000..591073b --- /dev/null +++ b/gs-install-appstream/gs-install-appstream.c @@ -0,0 +1,227 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2009-2016 Richard Hughes + * + * Licensed under the GNU General Public License Version 2 + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "gs-external-appstream-utils.h" + +static gboolean +gs_install_appstream_move_file (GFile *file, GError **error) +{ + g_autofree gchar *basename = g_file_get_basename (file); + g_autofree gchar *legacy_cachefn = gs_external_appstream_utils_get_legacy_file_cache_path (basename); + g_autofree gchar *cachefn = gs_external_appstream_utils_get_file_cache_path (basename); + g_autoptr(GFile) cachefn_file = g_file_new_for_path (cachefn); + g_autoptr(GFile) cachedir_file = g_file_get_parent (cachefn_file); + GStatBuf stat_buf = { 0 }; + + /* Try to cleanup the old cache directory, but do not panic, when it fails */ + if (g_unlink (legacy_cachefn) == -1) { + int errn = errno; + if (errn != ENOENT) + g_debug ("Failed to unlink '%s': %s", legacy_cachefn, g_strerror (errn)); + } + + /* make sure the parent directory exists, but if not then create with + * the ownership and permissions of the current process */ + if (!g_file_query_exists (cachedir_file, NULL)) { + if (!g_file_make_directory_with_parents (cachedir_file, NULL, error)) + return FALSE; + } + + /* do the move, overwriting existing files and setting the permissions + * of the current process (so that should be -rw-r--r--) */ + if (!g_file_move (file, cachefn_file, + G_FILE_COPY_OVERWRITE | + G_FILE_COPY_NOFOLLOW_SYMLINKS | + G_FILE_COPY_TARGET_DEFAULT_PERMS, + NULL, NULL, NULL, error)) + return FALSE; + + /* verify it is "-rw-r--r--" and the root owns the file */ + if (g_stat (cachefn, &stat_buf) == 0) { + struct passwd *pwd; + mode_t expected_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; + if ((stat_buf.st_mode & expected_mode) != expected_mode && + g_chmod (cachefn, expected_mode) == -1) { + int errn = errno; + g_debug ("Failed to chmod '%s': %s", cachefn, g_strerror (errn)); + } + + /* the file should be owned by the root */ + pwd = getpwnam ("root"); + if (pwd != NULL) { + if (chown (cachefn, pwd->pw_uid, pwd->pw_gid) == -1) { + int errn = errno; + g_debug ("Failed to chown on '%s': %s", cachefn, g_strerror (errn)); + } + } else { + int errn = errno; + g_debug ("Failed to get root info: %s", g_strerror (errn)); + } + } else { + int errn = errno; + g_debug ("Failed to stat '%s': %s", cachefn, g_strerror (errn)); + } + + return TRUE; +} + +static gboolean +gs_install_appstream_check_content_type (GFile *file, GError **error) +{ + const gchar *type; + g_autoptr(GError) error_local = NULL; + g_autoptr(GFileInfo) info = NULL; + g_autoptr(GPtrArray) components = NULL; + g_autoptr(XbBuilder) builder = xb_builder_new (); + g_autoptr(XbBuilderSource) source = xb_builder_source_new (); + g_autoptr(XbSilo) silo = NULL; + + /* check is correct type */ + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + G_FILE_QUERY_INFO_NONE, + NULL, error); + if (info == NULL) + return FALSE; + type = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE); + if (g_strcmp0 (type, "application/gzip") != 0 && + g_strcmp0 (type, "application/xml") != 0) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Invalid type %s: ", type); + return FALSE; + } + + /* check is an AppStream file */ + if (!xb_builder_source_load_file (source, file, + XB_BUILDER_SOURCE_FLAG_NONE, + NULL, &error_local)) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Failed to import XML: %s", error_local->message); + return FALSE; + } + xb_builder_import_source (builder, source); + /* No need to change the thread-default main context because the silo + * doesn’t live beyond this function. */ + silo = xb_builder_compile (builder, + XB_BUILDER_COMPILE_FLAG_NONE, + NULL, &error_local); + if (silo == NULL) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Failed to parse XML: %s", error_local->message); + return FALSE; + } + components = xb_silo_query (silo, "components/component", 0, &error_local); + if (components == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "No apps found in the AppStream XML"); + return FALSE; + } + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Failed to query XML: %s", error_local->message); + return FALSE; + } + + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GOptionContext) context = NULL; + + /* setup translations */ + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + context = g_option_context_new (NULL); + /* TRANSLATORS: tool that is used when moving profiles system-wide */ + g_option_context_set_summary (context, _("GNOME Software AppStream system-wide installer")); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_print ("%s\n", _("Failed to parse command line arguments")); + return EXIT_FAILURE; + } + + /* check input */ + if (g_strv_length (argv) != 2) { + /* TRANSLATORS: user did not specify a valid filename */ + g_print ("%s\n", _("You need to specify exactly one filename")); + return EXIT_FAILURE; + } + + /* check calling process */ + if (getuid () != 0 || geteuid () != 0) { + /* TRANSLATORS: only able to install files as root */ + g_print ("%s\n", _("This program can only be used by the root user")); + return EXIT_FAILURE; + } + + /* check content type for file */ + file = g_file_new_for_path (argv[1]); + if (!gs_install_appstream_check_content_type (file, &error)) { + /* TRANSLATORS: error details */ + g_print (_("Failed to validate content type: %s"), error->message); + g_print ("\n"); + return EXIT_FAILURE; + } + + /* Set the umask to ensure it is read-only to all users except root. */ + umask (022); + + /* do the move */ + if (!gs_install_appstream_move_file (file, &error)) { + /* TRANSLATORS: error details */ + g_print (_("Failed to move: %s"), error->message); + g_print ("\n"); + return EXIT_FAILURE; + } + + /* success */ + return EXIT_SUCCESS; +} diff --git a/gs-install-appstream/meson.build b/gs-install-appstream/meson.build new file mode 100644 index 0000000..8984762 --- /dev/null +++ b/gs-install-appstream/meson.build @@ -0,0 +1,19 @@ +executable( + 'gnome-software-install-appstream', + sources : [ + 'gs-install-appstream.c', + ], + dependencies : [ + gio_unix, + libgnomesoftware_dep, + libxmlb, + ], + include_directories : [ + include_directories('..'), + include_directories('../lib'), + ], + c_args : ['-DG_LOG_DOMAIN="GsInstallAppstream"'], + install : true, + install_dir : get_option('libexecdir'), + install_rpath : gs_private_libdir, +) diff --git a/help/C/figures/app-context-bar.png b/help/C/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..3da95a769203c480a5c56a15c613643a26f35ba7 GIT binary patch literal 18377 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 literal 0 HcmV?d00001 diff --git a/help/C/figures/app-screenshot.png b/help/C/figures/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fcddd8b3dd2e7bbc0b2b0d90ec1eb2ddfc2cc38b GIT binary patch literal 31719 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 literal 0 HcmV?d00001 diff --git a/help/C/figures/carousel.png b/help/C/figures/carousel.png new file mode 100644 index 0000000000000000000000000000000000000000..acc3b0247d51391bebd275e195524929ca7d86fc GIT binary patch literal 27137 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 K$dpMLfBrv15drA{ literal 0 HcmV?d00001 diff --git a/help/C/figures/install-webapp-from-gnome-web.png b/help/C/figures/install-webapp-from-gnome-web.png new file mode 100644 index 0000000000000000000000000000000000000000..be3d1f332282b6b8bcd5bc9fb1f9455432be0e76 GIT binary patch literal 113102 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

-)rIc&GsSE$>pU1-pD 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

Wyz3y&QEC^2PYF|N@m^jqN4Io59$6t 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%0D;jtSjEND}glv(0>`m z*As79y}36?lVW829;xNMAd!MjsaCuN`)4*o8I9;$K>w^7Doc0Z6!N|I#rdkabDu`_ zz4z5~Kl&PvbU&`WpDfqOlHt)ag`nhgu)uH0*;R8cjK0T59C5wJQUm<-o8<byw0HEbYeyr`wPtxe zlRtM` zU;U^z+N9fluV>A&u#9w^wMO`Ib>g*J@v~~_&IJ9O6CqcZea1#(f#CRW4Oy*4F}Fz8 zQn#&LjgNwU&S8=Qb9#<@J_i=qu7Q3D@GbvtHAo!kEpUb-u690Z#&!wvb3FjCsX}Mr zz3!(>%*3*FuXhq_+}#$%r-?2+(FafT!83ibqc3)J4N>>l1819evqbvmwf578PW^e# zkGH3R{s{SVa3sW|cHy2=0Q`>t_MhSV2QSCFe5v&PU4y>;lj+)g4f$WQUtoU@urFI= z%P}or@0c!*$cLZBMF&81N<`Sd%}Pj(=-Pf=1OJh6Ya?r4Za@3Z(fuEGm3YDH_fGGr z(r48I{5d;oSJJbbjBtC1);F?kN)EtM`6KKPfc_g|f9OEDGc=MnI`!2j*CKU2e^Y{p zG@V>OMhf{U?B@)C-YkULIJ#UdVW~M;3-oi%@J8zsTVoK@$Vqghq>zdwA zYfysgRzHJUhD50kfyKkz8trIx=2*dA!*9Cb)y5r;TpP=#ZQbZb91rRHPs2V0-2?Gg z&ZlI29y2-7Y496FFJBY=%AP*iFQ89LpBoA(`mt7YYrdzt?I(M3uJ%5?k8aGT@4H6x zcaT5PCr#_IuGt3x_HUc=CC?@l>hguIeu4b2tEaD7=o*0Eds%DmnHA(uOqYpCWQn9r zp+}+Pct*DG`*o43>-iA}@DT&OR#Jr?A`o=GW1uy5Z~eS2H)PWG^F2Pc{(0>T#FEW( z#yCs}p#K09$7TdsU~6;}?tzG!v!K)rE`|Lb(C?iU+e$ICg1!aNN6)PVzIE0_PgA!v zGHz+kR=T}3$F>#0DP4{@hE}|NPb;P8 z$SAMU<69yB2yFF&QLDSLHIkakzOXn7dNMs)Y2PJiFI|h$?X7EZ#(a9~b+KN{)@Jyu zrd6YBM6Z(xg3j6}*QRl6w|z&BB*5`RAM8WA{zP9q(NF9b$Y-IM{nk;RmW(A&dNke! zxT1_wkqYQ@dHVAjMOP{NpX}%-cJvcZ>(^)a`fytse~jq6-FQ9PpnR>-rvUrQ*L7YX ze~IjSn&+iXKZ1UY;-|S0+6?D4s;_4LD)3M1UrWH=GZE*EJ+;YO~x+Kz^nZqSX<; zw{e~|OTaR&FBhRMJC-LEH2%kp|k=e(7^Z@osX z&t}j0wiwmcY?xYRN3Eu{Gz|fQ?y)OMh_L6<_qR^=Dx%L5eL7EHa-l1Gy7FZKedm`M z^XsE~x`rM&8|?4FUP!0ntBE+ohxdIYftG=2m^VwKhLKzvXi<>a?-EUuwtS8duobNK5D7 z42Kj1_3xEi_x*Lep2!OMGkcoZ)75#J=|WfXG*hToXH{>%j=1qF?8n*jK1snBp7ba!q*h)@;_*S{GS8h|LiXGvzzEAH_=b-LO(eb)n8#hzBb;PQ9as7+_xApI)^WDh0|=o1eA-u#&)Smkj-2z$xEvqNiERUKH6QEIDCkGv$$^-D z>|EDwivf}A`k(vR>M%%Oa|wbi&^>w{t&r3+?k)Ftx#npWz_&K`YdHg~z@K*A*FTqx z#MWy{UrWo8(K^q$>rsOJbaRT=A=Ztijs|P?hqXDS3EwZ|c^RK4P8P1GYk+4TN&%KeeX&U&$8A6=iw;;b|gjud>ZERz%r$VXxpmt5Iu*pIXqW%?pW1~AEM;8+EJdt+`v@c(mEhUM_J5ta)MSe<B>Mg$!I`dzGhXWQi#{MWHH+pV&uEN*rAEs#GG@=MUx zs=H6?;&ekeONzY3$xwor9`LY64SE)!p45HoLfl#ut&JL6^GR!l( `o@;7}68B`Z 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 WG?t&`2y!0*0O!xz!743p$NU$a + + + diff --git a/help/C/figures/scalable/license-proprietary-and-special.svg b/help/C/figures/scalable/license-proprietary-and-special.svg new file mode 100644 index 0000000..b9f3892 --- /dev/null +++ b/help/C/figures/scalable/license-proprietary-and-special.svg @@ -0,0 +1,424 @@ + + + + diff --git a/help/C/figures/scalable/license-unknown.svg b/help/C/figures/scalable/license-unknown.svg new file mode 100644 index 0000000..6b5de9b --- /dev/null +++ b/help/C/figures/scalable/license-unknown.svg @@ -0,0 +1,433 @@ + + + + diff --git a/help/C/figures/scalable/links.svg b/help/C/figures/scalable/links.svg new file mode 100644 index 0000000..92fe1ac --- /dev/null +++ b/help/C/figures/scalable/links.svg @@ -0,0 +1,766 @@ + + + + diff --git a/help/C/figures/scalable/no-links.svg b/help/C/figures/scalable/no-links.svg new file mode 100644 index 0000000..c932b9d --- /dev/null +++ b/help/C/figures/scalable/no-links.svg @@ -0,0 +1,90 @@ + + + + diff --git a/help/C/figures/scalable/symbolic/computer-fail-symbolic.svg b/help/C/figures/scalable/symbolic/computer-fail-symbolic.svg new file mode 120000 index 0000000..c481080 --- /dev/null +++ b/help/C/figures/scalable/symbolic/computer-fail-symbolic.svg @@ -0,0 +1 @@ +../../../../../data/icons/symbolic/computer-fail-symbolic.svg \ No newline at end of file diff --git a/help/C/figures/scalable/symbolic/contact-symbolic.svg b/help/C/figures/scalable/symbolic/contact-symbolic.svg new file mode 120000 index 0000000..9907811 --- /dev/null +++ b/help/C/figures/scalable/symbolic/contact-symbolic.svg @@ -0,0 +1 @@ +../../../../../data/icons/symbolic/contact-symbolic.svg \ No newline at end of file diff --git a/help/C/figures/scalable/symbolic/donate-symbolic.svg b/help/C/figures/scalable/symbolic/donate-symbolic.svg new file mode 120000 index 0000000..82b5080 --- /dev/null +++ b/help/C/figures/scalable/symbolic/donate-symbolic.svg @@ -0,0 +1 @@ +../../../../../data/icons/symbolic/donate-symbolic.svg \ No newline at end of file diff --git a/help/C/figures/scalable/symbolic/help-link-symbolic.svg b/help/C/figures/scalable/symbolic/help-link-symbolic.svg new file mode 120000 index 0000000..f61ef90 --- /dev/null +++ b/help/C/figures/scalable/symbolic/help-link-symbolic.svg @@ -0,0 +1 @@ +../../../../../data/icons/symbolic/help-link-symbolic.svg \ No newline at end of file diff --git a/help/C/figures/scalable/symbolic/image-missing-symbolic.svg b/help/C/figures/scalable/symbolic/image-missing-symbolic.svg new file mode 100644 index 0000000..fa2a705 --- /dev/null +++ b/help/C/figures/scalable/symbolic/image-missing-symbolic.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/help/C/figures/scalable/symbolic/translations-symbolic.svg b/help/C/figures/scalable/symbolic/translations-symbolic.svg new file mode 120000 index 0000000..6c41849 --- /dev/null +++ b/help/C/figures/scalable/symbolic/translations-symbolic.svg @@ -0,0 +1 @@ +../../../../../data/icons/symbolic/translations-symbolic.svg \ No newline at end of file diff --git a/help/C/figures/scalable/symbolic/webpage-symbolic.svg b/help/C/figures/scalable/symbolic/webpage-symbolic.svg new file mode 120000 index 0000000..2c0341d --- /dev/null +++ b/help/C/figures/scalable/symbolic/webpage-symbolic.svg @@ -0,0 +1 @@ +../../../../../data/icons/symbolic/webpage-symbolic.svg \ No newline at end of file diff --git a/help/C/how-to-reinstall-a-web-app.page b/help/C/how-to-reinstall-a-web-app.page new file mode 100644 index 0000000..453d9ac --- /dev/null +++ b/help/C/how-to-reinstall-a-web-app.page @@ -0,0 +1,42 @@ + + + + + + + + + Phaedrus Leeds + mwleeds@protonmail.com + + + + + How to reinstall a Webapp + + + How to reinstall a Webapp + +

Software supports managing two types of web apps:

+ +

Web apps for which AppStream metainfo has been shipped with Software. See README.md.

+

Web apps which have been installed using GNOME Web.

+
+

The first type are displayed as available to install in Software (when this functionality has been enabled by the distribution), whereas the second type only show up in Software after they have been installed via GNOME Web. If you uninstall such an app and want to reinstall it, you must do so using GNOME Web.

+ +

Here are the steps to install a web app using GNOME Web:

+ +

Click the app Menu button in the top right as shown in the image below.

+

Click on Install as Web App… menu item. This should open the web app creation dialog.

+

Click the Create button to create and install the web app.

+
+ +

The web app should now show up in Software’s Installed tab.

+ + diff --git a/help/C/index.page b/help/C/index.page new file mode 100644 index 0000000..81c0428 --- /dev/null +++ b/help/C/index.page @@ -0,0 +1,14 @@ + + + + + + + + + <app>Software</app> + diff --git a/help/C/legal.xml b/help/C/legal.xml new file mode 100644 index 0000000..c70ed60 --- /dev/null +++ b/help/C/legal.xml @@ -0,0 +1,10 @@ + + + +

This work is licensed under a Creative + Commons Attribution-ShareAlike 3.0 Unported License.

+
diff --git a/help/C/software-licensing.page b/help/C/software-licensing.page new file mode 100644 index 0000000..c1a0f31 --- /dev/null +++ b/help/C/software-licensing.page @@ -0,0 +1,35 @@ + + + + + + + + + + Philip Withnall + philip@tecnocode.co.uk + + + + + Introduction on Software Licensing + + + Software Licensing + +
+ Introduction +

Apps can be ‘free/open source software’ or ‘proprietary’. This affects the freedoms you as a user have. If an app is free/open source software (FOSS), you have the freedom to use it, copy it, study and change its source code. Proprietary software does not provide you with those freedoms. FOSS software is often available for no charge, but this is not always true.

+

Because the source code is available for FOSS software, users can get involved in its development, contributing features or translations to their language and fixing bugs which affect them. They can audit the code and check that changes to the software are not malicious. They can learn from the source code and use it as the basis for their own FOSS applications.

+

FOSS apps are a public good.

+

Proprietary apps cannot be audited by their users, so you must trust that the developers of the app have your best interests in mind, and no conflicts of interest.

+

Read more about the benefits of FOSS over proprietary software.

+
+ +
diff --git a/help/C/software-metadata.page b/help/C/software-metadata.page new file mode 100644 index 0000000..28172c0 --- /dev/null +++ b/help/C/software-metadata.page @@ -0,0 +1,379 @@ + + + + + + + + + Philip Withnall + philip@tecnocode.co.uk + + + Will Thompson + wjt@endlessos.org + + + Milan Crha + mcrha@redhat.com + + + + + How Software uses metadata + + + Software Metadata + + +
+ Screenshots + +

Software displays the screenshots on the details page for an application. This typically should include screenshots of various windows / dialogs of the application, so the user would get a quick grasp of the application’s features, look and feel etc.

+

When more than one screenshot is present in the application’s metainfo file, Software will show the screenshots in a carousel.

+

In cases when the application’s metainfo file doesn’t contain any screenshot, then a placeholder icon as below with No Screenshots will be displayed:

+ + +

Placeholder icon might look different if you're using a custom icon theme.

+
+

Screenshots might become outdated as the application’s UI changes. So, even if Software shows screenshots for an app, it’s important to check if these screenshots are up-to-date or outdated.

+

You can improve app screenshot information:

+ + +

How to add missing app screenshots

+
+
+
+ +
+ App context bar +

The app context bar in Software is a collection of tiles on the details page for an application, which display the following details.

+ + +

Storage

+
+ +

Safety

+
+ +

Hardware support

+
+ +

Age rating

+
+
+ +

This shows the app context bar for the Software app:

+

+ + +

The tiles are displayed in the order listed above (starting with Storage tile on the left).

+

Each tile is covered in detail below.

+
+ +
+ Storage +

Software displays a storage tile on the details page for an application. If the application is not installed, this displays the estimated download size needed to install it. If the application is installed, it displays the storage space used by the application.

+

The sizes are calculated from data provided by the Software backend (such as flatpak or an RPM), and are not specified in the metadata provided by the application. There is nothing you can do to affect this tile by editing an application’s metainfo file. It’s listed here for completeness.

+
+ +
+ Safety +

Software displays a safety tile on the details page for an application. This summarizes information about whether the app can be considered safe to install and run, or whether caution may be required before trusting it.

+

This tile combines information about the permissions which the app requests when it runs (such as permission to read your files), with information about how the app was developed. Free software applications, where the source code is publicly readable, can be more secure than proprietary ones, as they can be audited.

+

The dialog which appears when the tile is clicked lists the different permissions the app requests, plus some information about its license and runtime.

+

You can improve the safety information:

+ + +

How to fix incorrect safety and permissions information

+
+
+
+ +
+ Hardware support +

+ Software displays a hardware support tile on the details page + for an application. This combines information about the hardware + requirements of the application, and the hardware capabilities of + the computer, with the aim of highlighting incompatibilities or + missing requirements — or to indicate that the application should + work correctly with no incompatibilities. +

+ +

The code looks at the following hardware. More may be supported in future.

+ +

Whether a touchpad, mouse or keyboard is present/needed

+

Whether a gamepad is needed

+

The minimum and recommended display size that the app can scale to

+
+ +

It’s not possible to reliably detect whether a gamepad is present, as they are often left disconnected due to not being needed for normal computer use.

+

The dialog which appears when the tile is clicked lists the different hardware requirements of the app, and whether any of them are not met.

+

You can improve the hardware information:

+ + +

How to add missing hardware information

+
+
+
+ +
+ Age rating +

Software displays an age rating tile on the details page for an application. This shows what age range the application should be suitable for, based on different kinds of content which the application has declared it contains. This information is summarized in a format similar to the game or film rating certificates for your country.

+

For example, this will highlight whether a game contains violence, or whether an application contains in-app advertising.

+

The dialog which appears when the tile is clicked lists the different types of content in the application and how severe that content is.

+

You can improve the age rating information:

+ + +

How to add missing content rating information

+
+
+
+ +
+ License + + +

Software displays a tile indicating whether an application is free software or whether its license is proprietary, special or unknown. This tile includes more detailed information about the project’s license. This tile also lists some of the benefits of free software. Learn more

+

Sometimes the license information isn’t correct for an application, and hence an application which is actually free software will be shown as ‘proprietary’. Similarly, sometimes the license information is unknown.

+

Software highlights free and open-source licenses in green, proprietary and special licenses in yellow as shown here. Unknown licenses are highlighted in grey.

+

You can add or improve the license information:

+ + +

How to fix incorrect licensing information

+
+
+
+ + + + + +
+ Where metadata comes from +

The metadata used to specify what hardware a piece of software requires, what ages of user it is suitable for, and factors which contribute to how safe it might be to install, all come from the metainfo file for that software.

+

The metainfo file is an XML file. Its file format is specified in the AppStream specification.

+

See the metainfo file for GNOME Files app.

+ +

appdata is the older term for metainfo.

+
+
+ +
+ What happens if metadata is missing +

If some metadata is missing for an application, Software can only guess what it might be, and hence can’t present much information in its interfaces. The guesses Software makes are based on the fact that most software is designed for desktop computers.

+

You can help improve the metadata for an application!

+
+ +
+ How to contribute missing information +

If you find that an app’s page is missing information or has incorrect information, you can contribute in one of the two ways:

+ + +

You can report the missing / incorrect metadata to the respective app’s bug tracker, so the app developer can fix it.

+
+ +

You can fix the missing / incorrect metadata yourself. See the How to guide below on how to do that.

+
+
+ +

For both, you first need to find the app’s project page. The link to the project page should typically be available in the app’s page as shown here. If not, you will need to find it with a simple search on Google.

+ +

Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org.

+
+ +
+ How to add missing app screenshots +

The screenshot information for an application is stored in the <screenshots> element within the application’s <component> in its metainfo file.

+

Recommended number of screenshots for an app is between 5 to 10. Screenshots should ideally be in the PNG format with 16:9 aspect ratio and minimum width of 620 pixels.

+

For example, here are the screenshot entries for the Software app:

+ + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png + Overview panel + + + https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png + Details panel + +]]> +
+ +
+ How to fix incorrect safety and permissions information +

The safety and permissions information for an application comes from different sources depending on how the application is packaged. For traditionally packaged applications, for example in RPM or DEB format, there is no safety or permissions information available and nothing can be done to add it to an application.

+

For flatpak applications, the information comes from the application’s flatpak manifest, specifying what holes in the sandbox the application requires. Each of these holes typically contributes to lowering the displayed safety level of the application in Software — moving it from ‘safe’ to ‘potentially unsafe’ to ‘unsafe’.

+

In order to improve the safety level of an application, its sandboxing must be made as tight as possible, by removing sandbox permissions where they’re not needed, and using portals instead of sandbox permissions where possible. Use of portals does not lower the displayed safety level of an application in Software.

+

For example, if the application requests read/write access to the full file system (--filesystem=host), does it actually need that, or does it only need to access files in a few specific locations? If so, the file portal could be used, or more specific file system permissions could be specified.

+

If the application works on Wayland, and only needs to work on X11 as a fallback, without using special X11 features, could it use --socket=fallback-x11 rather than --socket=x11?

+

Guidance about specific permissions, or other packaging formats, may be added here in future.

+

Further reading:

+ + +

+
+ +

+
+ +

+
+
+
+ +
+ How to add missing hardware information +

The hardware information for an application is stored in the <requires>, <recommends> and <supports> elements within the application’s <component> in its metainfo file.

+

Software understands the <control> and <display_length> elements.

+

See this blog post or this blog post for examples of metadata.

+
+ +
+ How to add missing content rating information +

The content rating information for an application is stored in the <content_rating> element within the application’s <component> in its metainfo file.

+

Applications should use the OARS 1.1 standard to fill in this element. If the <content_rating> element is not specified, the application’s content rating is unknown. If it’s specified but empty, the application has no content which might be unsuitable for any audience.

+

Use the OARS generator to produce suitable content rating information for an application.

+
+ +
+ How to fix incorrect licensing information +

The licensing information for an application is stored in the <project_license> element within the application’s <component> in its metainfo file.

+

The content in this element should be an SPDX expression which describes the ‘main’ license for the project. This should typically be the license of the code, and not include the license of the documentation or ancillary content.

+

If the SPDX expression is a single license, or an ‘or’ combination of multiple licenses, which are all FSF or OSI approved, the application is considered ‘free software’ and the license tile says so. Otherwise, it’s considered ‘proprietary’.

+

If an application is being displayed as ‘proprietary’ when you think it shouldn’t be, it’s likely that the <project_license> element includes the documentation license for the project. Remove it.

+

For example, change the license metadata from:

+ GPL-2.0+ and CC-BY-SA-3.0]]> +

to

+ GPL-2.0+]]> +

Further reading:

+ + +

Don’t (generally) put documentation license in appdata

+
+ +

+
+
+
+ + + + + + + + +
diff --git a/help/LINGUAS b/help/LINGUAS new file mode 100644 index 0000000..9aef4b0 --- /dev/null +++ b/help/LINGUAS @@ -0,0 +1,11 @@ +# please keep this list sorted alphabetically +cs +de +eu +fr +hu +id +pt_BR +ru +sv +uk diff --git a/help/cs/cs.po b/help/cs/cs.po new file mode 100644 index 0000000..6eddf93 --- /dev/null +++ b/help/cs/cs.po @@ -0,0 +1,1137 @@ +# Czech translation for gnome-software. +# Copyright (C) 2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Daniel Rusek , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2025-03-03 10:28+0000\n" +"PO-Revision-Date: 2025-03-06 14:04+0100\n" +"Last-Translator: Daniel Rusek \n" +"Language-Team: Czech \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.5\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Daniel Rusek , 2025" + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See " +"README.md." +msgstr "" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software (when this " +"functionality has been enabled by the distribution), whereas the second type only show up " +"in Software after they have been installed via GNOME Web. If you uninstall " +"such an app and want to reinstall it, you must do so using GNOME Web." +msgstr "" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as shown in the " +"image below." +msgstr "" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This should open " +"the web app creation dialog." +msgstr "" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install the web app." +msgstr "" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Software" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "" + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the freedoms you " +"as a user have. If an app is free/open source software (FOSS), you have the freedom to use " +"it, copy it, study and change its source code. Proprietary software does not provide you " +"with those freedoms. FOSS software is often available for no charge, but this is not " +"always true." +msgstr "" + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get involved in its " +"development, contributing features or translations to their language and fixing bugs " +"which affect them. They can audit the code and check that changes to the software are not " +"malicious. They can learn from the source code and use it as the basis for their own FOSS " +"applications." +msgstr "" + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a public good." +msgstr "" + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that the developers " +"of the app have your best interests in mind, and no conflicts of interest." +msgstr "" + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS over " +"proprietary software." +msgstr "" + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an application. This " +"typically should include screenshots of various windows / dialogs of the application, so " +"the user would get a quick grasp of the application’s features, look and feel etc." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any screenshot, then a " +"placeholder icon as below with No Screenshots will be displayed:" +msgstr "" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "Placeholder icon might look different if you're using a custom icon theme." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even if " +"Software shows screenshots for an app, it’s important to check if these " +"screenshots are up-to-date or outdated." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app screenshots" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the details page " +"for an application, which display the following details." +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "" + +#. (itstool) path: section/p +#. Translators: Refer +#. https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/Help-Translation-Notes +#. for steps to localize 'figures/app-context-bar.png' image. +#: C/software-metadata.page:74 +msgid "This shows the app context bar for the Software app:" +msgstr "" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:75 +msgctxt "_" +msgid "external ref='figures/app-context-bar.png' md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "external ref='figures/app-context-bar.png' md5='79c3e716ca311add88cb0ec2ce29e787'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:78 +msgid "" +"The tiles are displayed in the order listed above (starting with Storage " +"tile on the left)." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:79 +msgid "Each tile is covered in detail below." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:83 +msgid "Storage" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:84 +msgid "" +"Software displays a storage tile on the details page for an application. If " +"the application is not installed, this displays the estimated download size needed to " +"install it. If the application is installed, it displays the storage space used by the " +"application." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:85 +msgid "" +"The sizes are calculated from data provided by the Software backend (such as " +"flatpak or an RPM), and are not specified in the metadata provided by the application. " +"There is nothing you can do to affect this tile by editing an application’s metainfo " +"file. It’s listed here for completeness." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:89 +msgid "Safety" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:90 +msgid "" +"Software displays a safety tile on the details page for an application. This " +"summarizes information about whether the app can be considered safe to install and run, " +"or whether caution may be required before trusting it." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:91 +msgid "" +"This tile combines information about the permissions which the app requests when it runs " +"(such as permission to read your files), with information about how the app was " +"developed. Free software applications, where the source code is publicly readable, can be " +"more secure than proprietary ones, as they can be audited." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:92 +msgid "" +"The dialog which appears when the tile is clicked lists the different permissions the app " +"requests, plus some information about its license and runtime." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:93 +msgid "You can improve the safety information:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:96 +msgid "" +"How to fix " +"incorrect safety and permissions information" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:102 +msgid "Hardware support" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:103 +msgid "" +"Software displays a hardware support tile on the details page for an " +"application. This combines information about the hardware requirements of the " +"application, and the hardware capabilities of the computer, with the aim of highlighting " +"incompatibilities or missing requirements — or to indicate that the application should " +"work correctly with no incompatibilities." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:112 +msgid "The code looks at the following hardware. More may be supported in future." +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:114 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:115 +msgid "Whether a gamepad is needed" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:116 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:119 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, as they are " +"often left disconnected due to not being needed for normal computer use." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:120 +msgid "" +"The dialog which appears when the tile is clicked lists the different hardware " +"requirements of the app, and whether any of them are not met." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:121 +msgid "You can improve the hardware information:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:124 +msgid "" +"How to add missing hardware " +"information" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:130 +msgid "Age rating" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:131 +msgid "" +"Software displays an age rating tile on the details page for an application. " +"This shows what age range the application should be suitable for, based on different " +"kinds of content which the application has declared it contains. This information is " +"summarized in a format similar to the game or film rating certificates for your country." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:132 +msgid "" +"For example, this will highlight whether a game contains violence, or whether an " +"application contains in-app advertising." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:133 +msgid "" +"The dialog which appears when the tile is clicked lists the different types of content in " +"the application and how severe that content is." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:134 +msgid "You can improve the age rating information:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:137 +msgid "" +"How to add missing content " +"rating information" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:143 +msgid "License" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:146 +msgid "" +"Software displays a tile indicating whether an application is free software " +"or whether its license is proprietary, special or unknown. This tile includes more " +"detailed information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:147 +msgid "" +"Sometimes the license information isn’t correct for an application, and hence an " +"application which is actually free software will be shown as ‘proprietary’. Similarly, " +"sometimes the license information is unknown." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:148 +msgid "" +"Software highlights free and open-source licenses in green, proprietary and " +"special licenses in yellow as shown here. Unknown licenses are highlighted in grey." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:149 +msgid "You can add or improve the license information:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:152 +msgid "" +"How to fix incorrect licensing " +"information" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:158 +msgid "Links" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:160 +msgid "" +"Software displays a list of application resource links in the link tile. They " +"are as follows:" +msgstr "" + +#. (itstool) path: td/p +#: C/software-metadata.page:164 +msgid "Website link" +msgstr "" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Donation link" +msgstr "" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Translation contribution link" +msgstr "" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Bug reporting link" +msgstr "" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Help link" +msgstr "" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Contact link" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:187 +msgid "" +"Some or all of these links may be present depending on whether they are listed in the " +"application’s metainfo file." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:188 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the following " +"tile with a question mark will be displayed." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:190 +msgid "You can improve the links:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:193 +msgid "How to add missing links" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:199 +msgid "Carousel tile" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:201 +msgid "" +"Applications which are featured by Software are displayed in a carousel at the " +"top of the main window as shown here. Each carousel tile has a background color which is " +"automatically extracted from the application’s icon. Sometimes this background color is " +"not quite right for the application and needs to be specified explicitly by the " +"application developer." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:202 +msgid "" +"The set of applications which are featured is decided by the Linux distribution " +"maintainers." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:203 +msgid "You can improve the carousel tile:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:206 +msgid "" +"How to set the carousel " +"tile background color" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:212 +msgid "Where metadata comes from" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:213 +msgid "" +"The metadata used to specify what hardware a piece of software requires, what ages of " +"user it is suitable for, and factors which contribute to how safe it might be to install, " +"all come from the metainfo file for that software." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:214 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream specification." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:215 +msgid "" +"See the metainfo file for GNOME Files app." +msgstr "" + +#. (itstool) path: note/p +#: C/software-metadata.page:217 +msgid "appdata is the older term for metainfo." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:222 +msgid "What happens if metadata is missing" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:223 +msgid "" +"If some metadata is missing for an application, Software can only guess what " +"it might be, and hence can’t present much information in its interfaces. The guesses " +"Software makes are based on the fact that most software is designed for " +"desktop computers." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:224 +msgid "You can help improve the metadata for an application!" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:228 +msgid "How to contribute missing information" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:229 +msgid "" +"If you find that an app’s page is missing information or has incorrect information, you " +"can contribute in one of the two ways:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:232 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug tracker, so " +"the app developer can fix it." +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:235 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How " +"to guide below on how to do that." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:239 +msgid "" +"For both, you first need to find the app’s project page. The link to the project page " +"should typically be available in the app’s page as shown here. If not, you will need to find it with a simple search on Google." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:241 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:245 +msgid "How to add missing app screenshots" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:246 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s " +"<component> in its metainfo file." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:247 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots should " +"ideally be in the PNG format with 16:9 aspect ratio and minimum width of 620 pixels." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:248 +msgid "For example, here are the screenshot entries for the Software app:" +msgstr "" + +#. (itstool) path: section/code +#: C/software-metadata.page:249 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:263 +msgid "How to fix incorrect safety and permissions information" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:264 +msgid "" +"The safety and permissions information for an application comes from different sources " +"depending on how the application is packaged. For traditionally packaged applications, " +"for example in RPM or DEB format, there is no safety or permissions information available " +"and nothing can be done to add it to an application." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:265 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, " +"specifying what holes in the sandbox the application requires. Each of these holes " +"typically contributes to lowering the displayed safety level of the application in " +"Software — moving it from ‘safe’ to ‘potentially unsafe’ to ‘unsafe’." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:266 +msgid "" +"In order to improve the safety level of an application, its sandboxing must be made as " +"tight as possible, by removing sandbox permissions where they’re not needed, and using portals instead of sandbox permissions where possible. Use of portals does not lower the " +"displayed safety level of an application in Software." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:267 +msgid "" +"For example, if the application requests read/write access to the full file system " +"(--filesystem=host), does it actually need that, or does it only need to " +"access files in a few specific locations? If so, the file portal could be used, or " +"more specific file system permissions could be specified." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a fallback, without " +"using special X11 features, could it use --socket=fallback-x11 rather than " +"--socket=x11?" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be added here in " +"future." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:270 C/software-metadata.page:308 +msgid "Further reading:" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:285 +msgid "How to add missing hardware information" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:286 +msgid "" +"The hardware information for an application is stored in the <" +"requires>, <recommends> and <supports> elements within the application’s <component> in its metainfo " +"file." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:287 +msgid "" +"Software understands the <control> and <display_length> elements." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:288 +msgid "" +"See this blog post or this blog " +"post for examples of metadata." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:292 +msgid "How to add missing content rating information" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:293 +msgid "" +"The content rating information for an application is stored in the <content_rating> element within the " +"application’s <component> in its metainfo file." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:294 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If the <" +"content_rating> element is not specified, the application’s content rating is " +"unknown. If it’s specified but empty, the application has no content which might be " +"unsuitable for any audience." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:295 +msgid "" +"Use the OARS generator to produce " +"suitable content rating information for an application." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:299 +msgid "How to fix incorrect licensing information" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:300 +msgid "" +"The licensing information for an application is stored in the <project_license> element within the " +"application’s <component> in its metainfo file." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:301 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license for the " +"project. This should typically be the license of the code, and not include the license of " +"the documentation or ancillary content." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:302 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of multiple licenses, " +"which are all FSF or OSI approved, the " +"application is considered ‘free software’ and the license tile says so. Otherwise, it’s " +"considered ‘proprietary’." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:303 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it shouldn’t be, " +"it’s likely that the <project_license> element includes the " +"documentation license for the project. Remove it." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"For example, " +"change the license metadata from:" +msgstr "" + +#. (itstool) path: section/code +#: C/software-metadata.page:305 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "to" +msgstr "" + +#. (itstool) path: section/code +#: C/software-metadata.page:307 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:311 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:320 +msgid "How to add missing links" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:321 +msgid "" +"The links for an application are stored as <url> " +"elements within the application’s <component> in its metainfo file." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:322 +msgid "" +"Add as many of the link types documented in the appstream specification as " +"are available for the application. If no suitable page exists for a given link type, it " +"doesn’t have to be included." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:323 +msgid "For example, here are the resource links for the Software app:" +msgstr "" + +#. (itstool) path: section/code +#: C/software-metadata.page:324 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:335 +msgid "How to set the carousel tile background color" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:336 +msgid "" +"The carousel tile background color is normally extracted automatically from the " +"application’s icon. If that color is unsatisfactory, however, it can be overridden by " +"using the appstream’s <branding/> element with " +"declared colors (since 47.x series). The advantage is that more clients can use the " +"colors." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:337 +msgid "For example, here are some branding entries:" +msgstr "" + +#. (itstool) path: section/code +#: C/software-metadata.page:338 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" + +#. (itstool) path: note/p +#: C/software-metadata.page:344 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses " +"the better color for the theme on its own." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:346 +msgid "" +"There is left, for backward compatibility, the possibility to add the following XML to " +"the application’s metainfo <component> element:" +msgstr "" + +#. (itstool) path: section/code +#: C/software-metadata.page:347 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:351 +msgid "but the <branding/> element has a precedence." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:352 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format GVariant with type " +"a(yyy), and represents an unordered set of key colors for the application. " +"Each element of the set is a color in RGB form ranging from (0, 0, 0) to " +"(255, 255, 255)." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:353 +msgid "Colors should be chosen so that they:" +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:356 +msgid "" +"Are identifiable to the application, matching the application’s branding in some way, if " +"possible." +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:359 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used as a " +"background behind it, the icon can be distinguished." +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:362 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and " +"in its dark variant (#eeeeec). This generally means choosing a color with a " +"medium level of brightness." +msgstr "" + +#. (itstool) path: item/p +#: C/software-metadata.page:365 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:368 +msgid "" +"At least one color should be specified. More can be specified if one color can’t satisfy " +"all the requirements above, and Software will choose the most appropriate to " +"use in the carousel tile. If exactly one color is specified, its brightness and " +"saturation may be modified to improve contrast with the foreground color. If more than " +"one color is specified, the one with the best contrast with the foreground color will be " +"chosen, and its brightness and saturation will not be modified." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:372 +msgid "How to test carousel tile background color changes" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:373 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:374 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml,icon=/path/" +"to/app/icon.png" +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:375 +msgid "" +"The details page for your application will be shown. If you navigate back to the overview " +"page of Software, your application will be the only one in the ‘featured’ " +"carousel." +msgstr "" diff --git a/help/cs/figures/app-context-bar.png b/help/cs/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..94d978226d805243a2cae803400277a1795adaa5 GIT binary patch literal 22495 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 vk53P;*zEHkyQ}|c2A6Y=a)S9v literal 0 HcmV?d00001 diff --git a/help/de/de.po b/help/de/de.po new file mode 100644 index 0000000..9641c45 --- /dev/null +++ b/help/de/de.po @@ -0,0 +1,1459 @@ +# German translation for gnome-software. +# Copyright (C) 2024 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Tim Sabsch , 2024. +# Jürgen Benvenuti , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2024-08-29 11:16+0000\n" +"PO-Revision-Date: 2024-08-30 18:32+0200\n" +"Last-Translator: Tim Sabsch \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.4.4\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "" +"Tim Sabsch , 2024\n" +"Jürgen Benvenuti »gastornis@posteo.org>, 2024" + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Phaedrus Leeds" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Wie man eine Web-Anwendung neu installiert" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "Software unterstützt die Verwaltung von zwei Arten von Web-Anwendungen:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See " +"README.md." +msgstr "" +"Web-Anwendungen, für die AppStream-metainfo mittels Software ausgeliefert " +"wurde. Siehe README.md." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" +"Web-Anwendungen, die über GNOME Web installiert wurden." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software (when this " +"functionality has been enabled by the distribution), whereas the second type only show up " +"in Software after they have been installed via GNOME Web. If you uninstall " +"such an app and want to reinstall it, you must do so using GNOME Web." +msgstr "" +"Die erste Art wird in Software als installierbar angezeigt (wenn diese " +"Funktion von der Distribution aktiviert wurde), während die zweite Art nur in " +"Software angezeigt wird, nachdem sie über GNOME Web installiert wurde. Wenn " +"Sie eine solche Anwendung deinstallieren und neu installieren möchten, müssen Sie dies " +"mit GNOME Web tun." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "So installieren Sie eine Web-Anwendung mit GNOME Web:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as shown in the " +"image below." +msgstr "" +"Klicken Sie auf Menü in der oberen rechten Ecke, wie in der " +"Abbildung unten gezeigt." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This should open " +"the web app creation dialog." +msgstr "" +"Klicken Sie auf den Menüpunkt Als Web-Anwendung installieren …. Dies sollte den Dialog zur Erstellung einer Web-Anwendung öffnen." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install the web app." +msgstr "" +"Klicken Sie auf Erstellen, um die Web-Anwendung zu erstellen " +"und zu installieren." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" +"Die Web-Anwendung sollte nun in der Registerkarte Installiert in " +"Software auftauchen." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Software" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "Dieses Werk wird unter folgender Lizenz verbreitet: <_:link-1/>." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Philip Withnall" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Einführung in Softwarelizenzierung" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Softwarelizenzierung" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Einführung" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the freedoms you " +"as a user have. If an app is free/open source software (FOSS), you have the freedom to use " +"it, copy it, study and change its source code. Proprietary software does not provide you " +"with those freedoms. FOSS software is often available for no charge, but this is not " +"always true." +msgstr "" +"Anwendungen können »freie/quelloffene Software« oder »proprietär« sein. Dies wirkt sich " +"auf die Freiheiten aus, die Sie als Nutzer haben. Wenn es sich bei einer Anwendung um " +"freie/" +"quelloffene Software (FOSS) handelt, haben Sie die Freiheit, sie zu verwenden, zu " +"kopieren, den Quellcode zu studieren und zu ändern. Proprietäre Software bietet Ihnen " +"diese Freiheiten nicht. FOSS-Software ist oft kostenlos erhältlich, das ist aber nicht " +"immer der Fall." + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get involved in its " +"development, contributing features or translations to their language and fixing bugs " +"which affect them. They can audit the code and check that changes to the software are not " +"malicious. They can learn from the source code and use it as the basis for their own FOSS " +"applications." +msgstr "" +"Da der Quellcode von FOSS-Software frei verfügbar ist, können sich die Nutzer an der " +"Entwicklung beteiligen, indem sie Funktionen oder Übersetzungen für ihre Sprache " +"beisteuern und Fehler beheben, die sie betreffen. Sie können den Code prüfen und " +"sicherstellen, dass Änderungen an der Software nicht bösartig sind. Sie können aus dem " +"Quellcode lernen und ihn als Grundlage für ihre eigenen FOSS-Anwendungen verwenden." + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a public good." +msgstr "" +"FOSS-Anwendungen sind ein " +"öffentliches Gut." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that the developers " +"of the app have your best interests in mind, and no conflicts of interest." +msgstr "" +"Proprietäre Anwendungen können von ihren Nutzern nicht überprüft werden, sodass Sie " +"darauf vertrauen müssen, dass die Entwickler der Anwendung Ihr Bestes im Sinn haben und " +"keine Interessenkonflikte bestehen." + +# Leider nur im engl. Wiki vorhanden +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS over " +"proprietary software." +msgstr "" +"Lesen Sie mehr über die Vorteile von FOSS gegenüber " +"proprietärer Software." + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Will Thompson" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Milan Crha" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Wie Software Metadaten verwendet" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Software-Metadaten" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Bildschirmfotos" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an application. This " +"typically should include screenshots of various windows / dialogs of the application, so " +"the user would get a quick grasp of the application’s features, look and feel etc." +msgstr "" +"Software zeigt die Bildschirmfotos auf der Detailseite einer Anwendung an. " +"Diese sollten typischerweise Bildschirmfotos von verschiedenen Fenstern/Dialogen der " +"Anwendung enthalten, damit der Benutzer einen schnellen Überblick über die Funktionen, " +"das Aussehen, die Bedienung usw. der Anwendung erhält." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" +"Wenn mehr als ein Bildschirmfoto in der metainfo-Datei der Anwendung vorhanden ist, zeigt " +"Software die Fotos in einem Karussell." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any screenshot, then a " +"placeholder icon as below with No Screenshots will be displayed:" +msgstr "" +"In Fällen, in denen die metainfo-Datei der Anwendung kein Bildschirmfoto enthält, wird " +"ein Platzhaltersymbol mit der Meldung Keine Bildschirmfotos angezeigt:" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "Placeholder icon might look different if you're using a custom icon theme." +msgstr "" +"Das Platzhaltersymbol kann bei Ihnen anders aussehen, wenn Sie ein anderes Symbolthema " +"verwenden." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even if " +"Software shows screenshots for an app, it’s important to check if these " +"screenshots are up-to-date or outdated." +msgstr "" +"Bildschirmfotos können veraltet sein, wenn sich die Benutzeroberfläche der Anwendung " +"ändert. Auch wenn Software Bildschirmfotos für eine Anwendung anzeigt, ist es " +"wichtig zu prüfen, ob diese Fotos aktuell oder veraltet sind." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "Sie können Informationen zu den Bildschirmfotos einer Anwendung verbessern:" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app screenshots" +msgstr "" +"So fügen Sie fehlende Anwendungs-" +"Bildschirmfotos hinzu" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Anwendungskontextleiste" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the details page " +"for an application, which display the following details." +msgstr "" +"Die Anwendungskontextleiste in Software ist eine Sammlung von Kacheln auf der " +"Detailseite einer Anwendung, die die folgenden Details anzeigen." + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Speicher" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Sicherheit" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Hardware-Unterstützung" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Altersfreigabe" + +#. (itstool) path: section/p +#. Translators: Refer below steps to localize +#. 'figures/app-context-bar.png' image: 1. Run 'gnome-software +#. --details=org.gnome.Software.desktop' in console (as normal user). 2. +#. This should launch the Software app and automatically switch to +#. Software app's details page. 3. It may take some time if some +#. background tasks are running. Wait for the app's details page to load. +#. 4. Scroll down to take the screenshot of the app context bar. +#: C/software-metadata.page:78 +msgid "This shows the app context bar for the Software app:" +msgstr "Dies zeigt die Anwendungskontextleiste für die Software Anwendung:" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:79 +msgctxt "_" +msgid "external ref='figures/app-context-bar.png' md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "check" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:82 +msgid "" +"The tiles are displayed in the order listed above (starting with Storage " +"tile on the left)." +msgstr "" +"Die Kacheln werden in der oben aufgeführten Reihenfolge angezeigt (beginnend mit der " +"Speicher-Kachel auf der linken Seite)." + +#. (itstool) path: section/p +#: C/software-metadata.page:83 +msgid "Each tile is covered in detail below." +msgstr "Jede Kachel wird im Folgenden beschrieben." + +#. (itstool) path: section/title +#: C/software-metadata.page:87 +msgid "Storage" +msgstr "Speicher" + +#. (itstool) path: section/p +#: C/software-metadata.page:88 +msgid "" +"Software displays a storage tile on the details page for an application. If " +"the application is not installed, this displays the estimated download size needed to " +"install it. If the application is installed, it displays the storage space used by the " +"application." +msgstr "" +"Software zeigt eine Speicherkachel auf der Detailseite für eine Anwendung an. " +"Wenn die Anwendung nicht installiert ist, wird die geschätzte Downloadgröße angezeigt, " +"die für die Installation benötigt wird. Wenn die Anwendung installiert ist, wird der von " +"der Anwendung belegte Speicherplatz angezeigt." + +#. (itstool) path: section/p +#: C/software-metadata.page:89 +msgid "" +"The sizes are calculated from data provided by the Software backend (such as " +"flatpak or an RPM), and are not specified in the metadata provided by the application. " +"There is nothing you can do to affect this tile by editing an application’s metainfo " +"file. It’s listed here for completeness." +msgstr "" +"Die Größen werden aus Daten berechnet, die vom Software-Backend (z. B. flatpak " +"oder ein RPM) bereitgestellt werden, und sind nicht in den Metadaten der Anwendung " +"angegeben. Sie können diese Kachel nicht beeinflussen, indem Sie die metainfo-Datei einer " +"Anwendung bearbeiten. Sie ist hier nur der Vollständigkeit halber aufgeführt." + +#. (itstool) path: section/title +#: C/software-metadata.page:93 +msgid "Safety" +msgstr "Sicherheit" + +#. (itstool) path: section/p +#: C/software-metadata.page:94 +msgid "" +"Software displays a safety tile on the details page for an application. This " +"summarizes information about whether the app can be considered safe to install and run, " +"or whether caution may be required before trusting it." +msgstr "" +"Software zeigt eine Sicherheitskachel auf der Detailseite für eine Anwendung " +"an. Diese fasst Informationen darüber zusammen, ob die Anwendung als sicher für die " +"Installation und Ausführung betrachtet werden kann oder ob Vorsicht geboten ist, bevor " +"man ihr vertraut." + +#. (itstool) path: section/p +#: C/software-metadata.page:95 +msgid "" +"This tile combines information about the permissions which the app requests when it runs " +"(such as permission to read your files), with information about how the app was " +"developed. Free software applications, where the source code is publicly readable, can be " +"more secure than proprietary ones, as they can be audited." +msgstr "" +"Diese Kachel kombiniert Informationen über die Berechtigungen, die die Anwendung bei " +"ihrer Ausführung anfordert (z. B. die Erlaubnis, Ihre Dateien zu lesen), mit " +"Informationen darüber, wie die Anwendung entwickelt wurde. Freie Softwareanwendungen, bei " +"denen der Quellcode öffentlich ist, können sicherer sein als proprietäre Anwendungen, da " +"sie überprüft werden können." + +#. (itstool) path: section/p +#: C/software-metadata.page:96 +msgid "" +"The dialog which appears when the tile is clicked lists the different permissions the app " +"requests, plus some information about its license and runtime." +msgstr "" +"Das Dialogfeld, das beim Anklicken der Kachel erscheint, listet die verschiedenen " +"Berechtigungen auf, die die Anwendung anfordert, sowie einige Informationen über die " +"Lizenz und die Laufzeitumgebung." + +#. (itstool) path: section/p +#: C/software-metadata.page:97 +msgid "You can improve the safety information:" +msgstr "Sie können die Sicherheitsinformationen verbessern:" + +#. (itstool) path: item/p +#: C/software-metadata.page:100 +msgid "" +"How to fix " +"incorrect safety and permissions information" +msgstr "" +"So korrigieren " +"Sie falsche Sicherheits- und Berechtigungsinformationen" + +#. (itstool) path: section/title +#: C/software-metadata.page:106 +msgid "Hardware support" +msgstr "Hardware-Unterstützung" + +#. (itstool) path: section/p +#: C/software-metadata.page:107 +msgid "" +"Software displays a hardware support tile on the details page for an " +"application. This combines information about the hardware requirements of the " +"application, and the hardware capabilities of the computer, with the aim of highlighting " +"incompatibilities or missing requirements — or to indicate that the application should " +"work correctly with no incompatibilities." +msgstr "" +"Software zeigt eine Kachel zur Hardware-Unterstützung auf der Detailseite " +"einer Anwendung an. Diese kombiniert Informationen über die Hardware-Anforderungen der " +"Anwendung und die Hardware-Fähigkeiten des Rechners mit dem Ziel, Inkompatibilitäten oder " +"fehlende Anforderungen hervorzuheben — oder anzuzeigen, dass die Anwendung ohne " +"Inkompatibilitäten korrekt funktionieren sollte." + +#. (itstool) path: section/p +#: C/software-metadata.page:116 +msgid "The code looks at the following hardware. More may be supported in future." +msgstr "" +"Der Code berücksichtigt die folgende Hardware. In Zukunft wird möglicherweise Weiteres " +"unterstützt." + +#. (itstool) path: item/p +#: C/software-metadata.page:118 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "Ob ein Tastfeld, eine Maus oder eine Tastatur vorhanden/benötigt wird" + +#. (itstool) path: item/p +#: C/software-metadata.page:119 +msgid "Whether a gamepad is needed" +msgstr "Ob ein Gamepad benötigt wird" + +#. (itstool) path: item/p +#: C/software-metadata.page:120 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "" +"Die minimale und empfohlene Anzeigegröße, auf die die Anwendung skaliert werden kann" + +#. (itstool) path: section/p +#: C/software-metadata.page:123 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, as they are " +"often left disconnected due to not being needed for normal computer use." +msgstr "" +"Es ist nicht möglich, zuverlässig zu erkennen, ob ein Gamepad vorhanden ist, da " +"es oft nicht angeschlossen wird, weil es für die normale Rechnernutzung nicht benötigt " +"wird." + +#. (itstool) path: section/p +#: C/software-metadata.page:124 +msgid "" +"The dialog which appears when the tile is clicked lists the different hardware " +"requirements of the app, and whether any of them are not met." +msgstr "" +"Der Dialog, der beim Anklicken der Kachel erscheint, listet die verschiedenen Hardware-" +"Anforderungen der Anwendung auf und gibt an, ob eine davon nicht erfüllt ist." + +#. (itstool) path: section/p +#: C/software-metadata.page:125 +msgid "You can improve the hardware information:" +msgstr "Sie können die Hardware-Informationen verbessern:" + +#. (itstool) path: item/p +#: C/software-metadata.page:128 +msgid "" +"How to add missing hardware " +"information" +msgstr "" +"So fügen Sie fehlende Hardware-" +"Informationen hinzu" + +#. (itstool) path: section/title +#: C/software-metadata.page:134 +msgid "Age rating" +msgstr "Altersfreigabe" + +#. (itstool) path: section/p +#: C/software-metadata.page:135 +msgid "" +"Software displays an age rating tile on the details page for an application. " +"This shows what age range the application should be suitable for, based on different " +"kinds of content which the application has declared it contains. This information is " +"summarized in a format similar to the game or film rating certificates for your country." +msgstr "" +"Software zeigt eine Kachel zur Alterseinstufung auf der Detailseite einer " +"Anwendung an. Diese zeigt an, für welche Altersgruppe die Anwendung geeignet sein sollte, " +"basierend auf verschiedenen Arten von Inhalten, die die Anwendung als enthalten " +"deklariert hat. Diese Informationen werden in einem Format zusammengefasst, das den " +"Altersfreigabe-Bescheinigungen für Spiele oder Filme in Ihrem Land ähnelt." + +#. (itstool) path: section/p +#: C/software-metadata.page:136 +msgid "" +"For example, this will highlight whether a game contains violence, or whether an " +"application contains in-app advertising." +msgstr "" +"So wird beispielsweise angezeigt, ob ein Spiel Gewalt enthält oder ob eine Anwendung In-" +"App-Werbung enthält." + +#. (itstool) path: section/p +#: C/software-metadata.page:137 +msgid "" +"The dialog which appears when the tile is clicked lists the different types of content in " +"the application and how severe that content is." +msgstr "" +"Das Dialogfeld, das beim Anklicken der Kachel erscheint, listet die verschiedenen Arten " +"von Inhalten in der Anwendung auf und gibt an, wie schwerwiegend diese Inhalte sind." + +#. (itstool) path: section/p +#: C/software-metadata.page:138 +msgid "You can improve the age rating information:" +msgstr "Sie können die Informationen zur Altersfreigabe verbessern:" + +#. (itstool) path: item/p +#: C/software-metadata.page:141 +msgid "" +"How to add missing content " +"rating information" +msgstr "" +"So fügen Sie fehlende " +"Informationen zur Inhaltsbewertung hinzu" + +#. (itstool) path: section/title +#: C/software-metadata.page:147 +msgid "License" +msgstr "Lizenz" + +#. (itstool) path: section/p +#: C/software-metadata.page:150 +msgid "" +"Software displays a tile indicating whether an application is free software " +"or whether its license is proprietary, special or unknown. This tile includes more " +"detailed information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" +"Software zeigt eine Kachel an, die angibt, ob es sich bei einer Anwendung um " +"freie " +"Software handelt oder ob die Lizenz proprietär, speziell oder unbekannt ist. Diese " +"Kachel enthält genauere Informationen über die Lizenz des Projekts. Diese Kachel listet " +"auch einige der Vorteile von freier Software auf. Weitere Informationen" + +#. (itstool) path: section/p +#: C/software-metadata.page:151 +msgid "" +"Sometimes the license information isn’t correct for an application, and hence an " +"application which is actually free software will be shown as ‘proprietary’. Similarly, " +"sometimes the license information is unknown." +msgstr "" +"Manchmal sind die Lizenzinformationen für eine Anwendung nicht korrekt, sodass eine " +"Anwendung, die eigentlich freie Software ist, als »proprietär« angezeigt wird. Ebenso " +"sind die Lizenzinformationen manchmal unbekannt." + +#. (itstool) path: section/p +#: C/software-metadata.page:152 +msgid "" +"Software highlights free and open-source licenses in green, proprietary and " +"special licenses in yellow as shown here. Unknown licenses are highlighted in grey." +msgstr "" +"Software hebt freie und quelloffene Lizenzen in Grün hervor, proprietäre und " +"spezielle Lizenzen in Gelb, wie hier gezeigt. Unbekannte Lizenzen sind grau hinterlegt." + +#. (itstool) path: section/p +#: C/software-metadata.page:153 +msgid "You can add or improve the license information:" +msgstr "Sie können die Lizenzinformationen ergänzen oder verbessern:" + +#. (itstool) path: item/p +#: C/software-metadata.page:156 +msgid "" +"How to fix incorrect licensing " +"information" +msgstr "" +"So korrigieren Sie falsche " +"Lizenzierungsinformationen" + +#. (itstool) path: section/title +#: C/software-metadata.page:162 +msgid "Links" +msgstr "Verweise" + +#. (itstool) path: section/p +#: C/software-metadata.page:164 +msgid "" +"Software displays a list of application resource links in the link tile. They " +"are as follows:" +msgstr "" +"Software zeigt eine Liste an Verweisen zu Ressourcen der Anwendung in der Link-" +"Kachel an. Sie sind wie folgt:" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Website link" +msgstr "Verweis auf die Webseite" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Donation link" +msgstr "Verweis auf Spenden" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Translation contribution link" +msgstr "Verweis auf das Beitragen von Übersetzungen" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Bug reporting link" +msgstr "Verweis auf eine Fehlerberichterstattung" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Help link" +msgstr "Verweis auf Hilfe" + +#. (itstool) path: td/p +#: C/software-metadata.page:188 +msgid "Contact link" +msgstr "Verweis auf Kontaktmöglichkeiten" + +#. (itstool) path: section/p +#: C/software-metadata.page:191 +msgid "" +"Some or all of these links may be present depending on whether they are listed in the " +"application’s metainfo file." +msgstr "" +"Einige oder alle dieser Verweise können vorhanden sein, je nachdem, ob sie in der " +"metainfo-Datei der Anwendung aufgeführt sind." + +#. (itstool) path: section/p +#: C/software-metadata.page:192 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the following " +"tile with a question mark will be displayed." +msgstr "" +"Wenn die metainfo-Datei der Anwendung keinen Verweis enthält, wird die folgende Kachel " +"mit einem Fragezeichen angezeigt." + +#. (itstool) path: section/p +#: C/software-metadata.page:194 +msgid "You can improve the links:" +msgstr "Sie können die Verweise verbessern:" + +#. (itstool) path: item/p +#: C/software-metadata.page:197 +msgid "How to add missing links" +msgstr "" +"So fügen Sie fehlende Verweise hinzu" + +#. (itstool) path: section/title +#: C/software-metadata.page:203 +msgid "Carousel tile" +msgstr "Karussellkachel" + +#. (itstool) path: section/p +#: C/software-metadata.page:205 +msgid "" +"Applications which are featured by Software are displayed in a carousel at the " +"top of the main window as shown here. Each carousel tile has a background color which is " +"automatically extracted from the application’s icon. Sometimes this background color is " +"not quite right for the application and needs to be specified explicitly by the " +"application developer." +msgstr "" +"Anwendungen, die von Software vorgestellt werden, werden in einem Karussell am " +"oberen Rand des Hauptfensters angezeigt. Jede Kachel des Karussells hat eine " +"Hintergrundfarbe, die automatisch aus dem Symbol der Anwendung extrahiert wird. Manchmal " +"ist diese Hintergrundfarbe nicht ganz passend für die Anwendung und muss vom " +"Anwendungsentwickler explizit angegeben werden." + +#. (itstool) path: section/p +#: C/software-metadata.page:206 +msgid "" +"The set of applications which are featured is decided by the Linux distribution " +"maintainers." +msgstr "" +"Die vorgestellten Anwendungen wird von den Betreuern der Linux-Distributionen ausgewählt." + +#. (itstool) path: section/p +#: C/software-metadata.page:207 +msgid "You can improve the carousel tile:" +msgstr "Sie können die Karussellkachel verbessern:" + +#. (itstool) path: item/p +#: C/software-metadata.page:210 +msgid "" +"How to set the carousel " +"tile background color" +msgstr "" +"So stellen Sie die " +"Hintergrundfarbe der Karussellkachel ein" + +#. (itstool) path: section/title +#: C/software-metadata.page:216 +msgid "Where metadata comes from" +msgstr "Woher die Metadaten kommen" + +#. (itstool) path: section/p +#: C/software-metadata.page:217 +msgid "" +"The metadata used to specify what hardware a piece of software requires, what ages of " +"user it is suitable for, and factors which contribute to how safe it might be to install, " +"all come from the metainfo file for that software." +msgstr "" +"Die Metadaten, die angeben, welche Hardware eine Software benötigt, für welche " +"Altersgruppen sie geeignet ist und welche Faktoren dazu beitragen, dass die Installation " +"sicher ist, stammen alle aus der metainfo-Datei für diese Software." + +#. (itstool) path: section/p +#: C/software-metadata.page:218 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream specification." +msgstr "" +"Die metainfo-Datei ist eine XML-Datei. Ihr Dateiformat ist in der AppStream-Spezifikation angegeben." + +#. (itstool) path: section/p +#: C/software-metadata.page:219 +msgid "" +"See the metainfo file for GNOME Files app." +msgstr "" +"Siehe die metainfo-Datei für GNOME Dateien." + +#. (itstool) path: note/p +#: C/software-metadata.page:221 +msgid "appdata is the older term for metainfo." +msgstr "appdata ist der alte Name für metainfo." + +#. (itstool) path: section/title +#: C/software-metadata.page:226 +msgid "What happens if metadata is missing" +msgstr "Was passiert, wenn die Metadaten fehlen?" + +#. (itstool) path: section/p +#: C/software-metadata.page:227 +msgid "" +"If some metadata is missing for an application, Software can only guess what " +"it might be, and hence can’t present much information in its interfaces. The guesses " +"Software makes are based on the fact that most software is designed for " +"desktop computers." +msgstr "" +"Wenn einige Metadaten für eine Anwendung fehlen, kann Software nur raten, was " +"es sein könnte, und kann daher nicht viele Informationen präsentieren. Die Annahmen, die " +"Software trifft, beruhen auf der Tatsache, dass die meiste Software für " +"Desktop-Rechner konzipiert ist." + +#. (itstool) path: section/p +#: C/software-metadata.page:228 +msgid "You can help improve the metadata for an application!" +msgstr "" +"Sie können helfen, die Metadaten für eine Anwendung zu verbessern!" + +#. (itstool) path: section/title +#: C/software-metadata.page:232 +msgid "How to contribute missing information" +msgstr "So steuern Sie fehlende Informationen bei" + +#. (itstool) path: section/p +#: C/software-metadata.page:233 +msgid "" +"If you find that an app’s page is missing information or has incorrect information, you " +"can contribute in one of the two ways:" +msgstr "" +"Wenn Sie feststellen, dass auf der Seite einer Anwendung Informationen fehlen oder falsch " +"sind, können Sie auf eine der beiden Arten dazu beitragen:" + +#. (itstool) path: item/p +#: C/software-metadata.page:236 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug tracker, so " +"the app developer can fix it." +msgstr "" +"Sie können die fehlenden/falschen Metadaten im Fehlerberichterstattungssystem der " +"jeweiligen Anwendung melden, damit der Anwendungsentwickler das Problem beheben kann." + +#. (itstool) path: item/p +#: C/software-metadata.page:239 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How " +"to guide below on how to do that." +msgstr "" +"Sie können die fehlenden/falschen Metadaten selbst korrigieren. Lesen Sie dazu die unten " +"stehende Anleitung Hinweise." + +#. (itstool) path: section/p +#: C/software-metadata.page:243 +msgid "" +"For both, you first need to find the app’s project page. The link to the project page " +"should typically be available in the app’s page as shown here. If not, you will need to find it with a simple search on Google." +msgstr "" +"Für beides müssen Sie zunächst die Projektseite der Anwendung finden. Der Verweis auf die " +"Projektseite sollte normalerweise auf der Seite der Anwendung zu finden sein, wie hier gezeigt. Falls nicht, müssen Sie ihn mit einer einfachen " +"Google-Suche finden." + +#. (itstool) path: section/p +#: C/software-metadata.page:245 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" +"Anwendungen werden normalerweise in GitLab oder GitHub verwaltet. GNOME-Anwendungen werden zum Beispiel in gitlab.gnome.org verwaltet." + +#. (itstool) path: section/title +#: C/software-metadata.page:249 +msgid "How to add missing app screenshots" +msgstr "So fügen Sie fehlende Anwendungs-Bildschirmfotos hinzu" + +#. (itstool) path: section/p +#: C/software-metadata.page:250 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s " +"<component> in its metainfo file." +msgstr "" +"Die Bildschirm-Informationen für eine Anwendung werden im <screenshots>-Element innerhalb der <" +"component> der Anwendung in deren metainfo-Datei gespeichert." + +#. (itstool) path: section/p +#: C/software-metadata.page:251 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots should " +"ideally be in the PNG format with 16:9 aspect ratio and minimum width of 620 pixels." +msgstr "" +"Es werden zwischen 5 und 10 Bildschirmfotos für eine Anwendung empfohlen. Fotos sollten " +"idealerweise im PNG-Format mit einem Seitenverhältnis von 16:9 und einer Mindestbreite " +"von 620 Pixeln vorliegen." + +#. (itstool) path: section/p +#: C/software-metadata.page:252 +msgid "For example, here are the screenshot entries for the Software app:" +msgstr "" +"Hier sind zum Beispiel die Bildschirmfoto-Einträge für die Software-Anwendung:" + +#. (itstool) path: section/code +#: C/software-metadata.page:253 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Übersichtsseite</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Seite mit Details</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:267 +msgid "How to fix incorrect safety and permissions information" +msgstr "So korrigieren Sie falsche Sicherheits- und Berechtigungsinformationen" + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"The safety and permissions information for an application comes from different sources " +"depending on how the application is packaged. For traditionally packaged applications, " +"for example in RPM or DEB format, there is no safety or permissions information available " +"and nothing can be done to add it to an application." +msgstr "" +"Die Sicherheits- und Berechtigungsinformationen für eine Anwendung stammen aus " +"unterschiedlichen Quellen, je nachdem, wie die Anwendung gepackt ist. Für traditionell " +"gepackte Anwendungen, z. B. im RPM- oder DEB-Format, sind keine Sicherheits- oder " +"Berechtigungsinformationen verfügbar, und es ist auch nicht möglich, sie zu einer " +"Anwendung hinzuzufügen." + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, " +"specifying what holes in the sandbox the application requires. Each of these holes " +"typically contributes to lowering the displayed safety level of the application in " +"Software — moving it from ‘safe’ to ‘potentially unsafe’ to ‘unsafe’." +msgstr "" +"Bei Flatpak-Anwendungen stammen die Informationen aus dem Flatpak-Manifest der Anwendung, das angibt, " +"welche Löcher in der Sandbox die Anwendung benötigt. Jedes dieser Löcher trägt " +"typischerweise dazu bei, die angezeigte Sicherheitsstufe der Anwendung in Software zu senken — sie wird von »sicher« über »potenziell unsicher« zu »unsicher«." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 +msgid "" +"In order to improve the safety level of an application, its sandboxing must be made as " +"tight as possible, by removing sandbox permissions where they’re not needed, and using portals instead of sandbox permissions where possible. Use of portals does not lower the " +"displayed safety level of an application in Software." +msgstr "" +"Um das Sicherheitsniveau einer Anwendung zu verbessern, muss ihr Sandboxing so eng wie " +"möglich gestaltet werden, indem Sandbox-Berechtigungen dort entfernt werden, wo sie nicht " +"benötigt werden, und Portale anstelle von Sandbox-Berechtigungen verwendet werden, wo " +"dies möglich ist. Die Verwendung von Portalen senkt nicht die angezeigte Sicherheitsstufe " +"einer Anwendung in Software." + +#. (itstool) path: section/p +#: C/software-metadata.page:271 +msgid "" +"For example, if the application requests read/write access to the full file system " +"(--filesystem=host), does it actually need that, or does it only need to " +"access files in a few specific locations? If so, the file portal could be used, or " +"more specific file system permissions could be specified." +msgstr "" +"Wenn die Anwendung beispielsweise Lese-/Schreibzugriff auf das gesamte Dateisystem " +"(--filesystem=host) verlangt: Braucht sie das tatsächlich, oder muss sie nur " +"auf Dateien an einigen bestimmten Stellen zugreifen? Wenn ja, könnte das Dateiportal verwendet werden, oder es könnten spezifischere Dateisystemberechtigungen angegeben werden." + +#. (itstool) path: section/p +#: C/software-metadata.page:272 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a fallback, without " +"using special X11 features, could it use --socket=fallback-x11 rather than " +"--socket=x11?" +msgstr "" +"Wenn die Anwendung auf Wayland läuft und nur als Fallback auf X11 laufen muss, ohne " +"spezielle X11-Funktionen zu verwenden, könnte sie --socket=fallback-x11 " +"statt --socket=x11 verwenden?" + +#. (itstool) path: section/p +#: C/software-metadata.page:273 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be added here in " +"future." +msgstr "" +"In Zukunft können hier Hinweise zu bestimmten Berechtigungen oder anderen " +"Verpackungsformaten hinzugefügt werden." + +#. (itstool) path: section/p +#: C/software-metadata.page:274 C/software-metadata.page:312 +msgid "Further reading:" +msgstr "Weiterer Lesestoff:" + +#. (itstool) path: section/title +#: C/software-metadata.page:289 +msgid "How to add missing hardware information" +msgstr "So fügen Sie fehlende Hardware-Informationen hinzu" + +#. (itstool) path: section/p +#: C/software-metadata.page:290 +msgid "" +"The hardware information for an application is stored in the <" +"requires>, <recommends> and <supports> elements within the application’s <component> in its metainfo " +"file." +msgstr "" +"Die Hardware-Informationen für eine Anwendung werden in den <" +"requires>, <recommends> und <supports> Elementen innerhalb der <component> in der metainfo-Datei der " +"Anwendung gespeichert." + +#. (itstool) path: section/p +#: C/software-metadata.page:291 +msgid "" +"Software understands the <control> and <display_length> elements." +msgstr "" +"Software versteht die <control> und <display_length> Elemente." + +#. (itstool) path: section/p +#: C/software-metadata.page:292 +msgid "" +"See this blog post or this blog " +"post for examples of metadata." +msgstr "" +"Beispiele für Metadaten finden Sie unter diesem " +"Blogbeitrag oder diesem Blogbeitrag." + +#. (itstool) path: section/title +#: C/software-metadata.page:296 +msgid "How to add missing content rating information" +msgstr "So fügen Sie fehlende Informationen zur Inhaltsbewertung hinzu" + +#. (itstool) path: section/p +#: C/software-metadata.page:297 +msgid "" +"The content rating information for an application is stored in the <content_rating> element within the " +"application’s <component> in its metainfo file." +msgstr "" +"Die Informationen zur Inhaltsbewertung einer Anwendung werden im <" +"content_rating>-Element innerhalb der <component> der " +"Anwendung in deren metainfo-Datei gespeichert." + +#. (itstool) path: section/p +#: C/software-metadata.page:298 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If the <" +"content_rating> element is not specified, the application’s content rating is " +"unknown. If it’s specified but empty, the application has no content which might be " +"unsuitable for any audience." +msgstr "" +"Anwendungen sollten den OARS-1.1-Standard verwenden, um dieses Element auszufüllen. Wenn " +"das <content_rating>-Element nicht angegeben ist, ist die " +"Inhaltsbewertung der Anwendung unbekannt. Wenn es angegeben, aber leer ist, hat die " +"Anwendung keinen Inhalt, der für eine bestimmte Zielgruppe ungeeignet sein könnte." + +#. (itstool) path: section/p +#: C/software-metadata.page:299 +msgid "" +"Use the OARS generator to produce " +"suitable content rating information for an application." +msgstr "" +"Verwenden Sie den OARS-Generator, " +"um geeignete Informationen zur Inhaltsbewertung für eine Anwendung zu erstellen." + +#. (itstool) path: section/title +#: C/software-metadata.page:303 +msgid "How to fix incorrect licensing information" +msgstr "So korrigieren Sie falsche Lizenzierungsinformationen" + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"The licensing information for an application is stored in the <project_license> element within the " +"application’s <component> in its metainfo file." +msgstr "" +"Die Lizenzierungsinformationen für eine Anwendung werden im <project_license>-Element innerhalb der " +"<component> der Anwendung in deren metainfo-Datei gespeichert." + +#. (itstool) path: section/p +#: C/software-metadata.page:305 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license for the " +"project. This should typically be the license of the code, and not include the license of " +"the documentation or ancillary content." +msgstr "" +"Der Inhalt dieses Elements sollte ein SPDX-" +"Ausdruck sein, der die »Hauptlizenz« für das Projekt beschreibt. Dies sollte in " +"der Regel die Lizenz des Codes sein und nicht die Lizenz der Dokumentation oder " +"zusätzlicher Inhalte umfassen." + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of multiple licenses, " +"which are all FSF or OSI approved, the " +"application is considered ‘free software’ and the license tile says so. Otherwise, it’s " +"considered ‘proprietary’." +msgstr "" +"Handelt es sich bei dem SPDX-Ausdruck um eine Einzellizenz oder um eine »oder«-" +"Kombination mehrerer Lizenzen, die alle FSF- " +"oder OSI-genehmigt sind, gilt die Anwendung als »freie Software«, was auch in der " +"Lizenzkachel angegeben ist. Andernfalls gilt sie als »proprietär«." + +#. (itstool) path: section/p +#: C/software-metadata.page:307 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it shouldn’t be, " +"it’s likely that the <project_license> element includes the " +"documentation license for the project. Remove it." +msgstr "" +"Wenn eine Anwendung als »proprietär« angezeigt wird, obwohl dies Ihrer Meinung nach nicht " +"der Fall sein sollte, ist es wahrscheinlich, dass das <project_license>-Element die Dokumentationslizenz für das Projekt enthält. Entfernen Sie es." + +#. (itstool) path: section/p +#: C/software-metadata.page:308 +msgid "" +"For example, " +"change the license metadata from:" +msgstr "" +"Zum Beispiel, " +"ändern Sie die Lizenz-Metadaten von:" + +#. (itstool) path: section/code +#: C/software-metadata.page:309 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "<project_license>GPL-2.0+ und CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:310 +msgid "to" +msgstr "zu" + +#. (itstool) path: section/code +#: C/software-metadata.page:311 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +# Blogtitel +#. (itstool) path: item/p +#: C/software-metadata.page:315 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" +"Don’t (generally) put documentation license in appdata" + +#. (itstool) path: section/title +#: C/software-metadata.page:324 +msgid "How to add missing links" +msgstr "So fügen Sie fehlende Verweise hinzu" + +#. (itstool) path: section/p +#: C/software-metadata.page:325 +msgid "" +"The links for an application are stored as <url> " +"elements within the application’s <component> in its metainfo file." +msgstr "" +"Die Verweise einer Anwendung werden als <url>-Elemente " +"innerhalb der <component> der Anwendung in ihrer metainfo-Datei " +"gespeichert." + +#. (itstool) path: section/p +#: C/software-metadata.page:326 +msgid "" +"Add as many of the link types documented in the appstream specification as " +"are available for the application. If no suitable page exists for a given link type, it " +"doesn’t have to be included." +msgstr "" +"Fügen Sie so viele der in der Appstream-Spezifikation dokumentierten Verweis-" +"Typen hinzu, wie für die Anwendung verfügbar sind. Wenn für einen bestimmten Verweistyp " +"keine geeignete Seite existiert, muss er nicht aufgenommen werden." + +#. (itstool) path: section/p +#: C/software-metadata.page:327 +msgid "For example, here are the resource links for the Software app:" +msgstr "" +"Hier sind zum Beispiel die Ressourcenverweise für die Software-Anwendung:" + +#. (itstool) path: section/code +#: C/software-metadata.page:328 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:339 +msgid "How to set the carousel tile background color" +msgstr "So stellen Sie die Hintergrundfarbe der Karussellkachel ein" + +#. (itstool) path: section/p +#: C/software-metadata.page:340 +msgid "" +"The carousel tile background color is normally extracted automatically from the " +"application’s icon. If that color is unsatisfactory, however, it can be overridden by " +"using the appstream’s <branding/> element with " +"declared colors (since 47.x series). The advantage is that more clients can use the " +"colors." +msgstr "" +"Die Hintergrundfarbe der Karussellkacheln wird normalerweise automatisch aus dem Symbol " +"der Anwendung extrahiert. Wenn diese Farbe jedoch nicht zufriedenstellend ist, kann sie " +"durch Verwendung des Appstream <branding/> Elements mit deklarierten Farben überschrieben werden (seit der 47.x Veröffentlichung). Der " +"Vorteil ist, dass auch andere Anwendungen die Farben verwenden können." + +#. (itstool) path: section/p +#: C/software-metadata.page:341 +msgid "For example, here are some branding entries:" +msgstr "Hier sind zum Beispiel einige branding-Einträge:" + +#. (itstool) path: section/code +#: C/software-metadata.page:342 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:348 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses " +"the better color for the theme on its own." +msgstr "" +"Beachten Sie, dass das scheme_preference-Attribut ignoriert wird, " +"Software wählt die bessere Farbe für das Thema selbst aus." + +#. (itstool) path: section/p +#: C/software-metadata.page:350 +msgid "" +"There is left, for backward compatibility, the possibility to add the following XML to " +"the application’s metainfo <component> element:" +msgstr "" +"Aus Gründen der Abwärtskompatibilität besteht weiterhin die Möglichkeit, das folgende XML-" +"Element in das metainfo-Element <component> der Anwendung einzufügen:" + +#. (itstool) path: section/code +#: C/software-metadata.page:351 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:355 +msgid "but the <branding/> element has a precedence." +msgstr "aber das <branding/>-Element hat Vorrang." + +#. (itstool) path: section/p +#: C/software-metadata.page:356 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format GVariant with type " +"a(yyy), and represents an unordered set of key colors for the application. " +"Each element of the set is a color in RGB form ranging from (0, 0, 0) to " +"(255, 255, 255)." +msgstr "" +"Der Wert von GnomeSoftware::key-colors ist eine GVariant im Textformat mit " +"dem Typ a(yyy) und repräsentiert eine ungeordnete Menge von Schlüsselfarben " +"für die Anwendung. Jedes Element der Menge ist eine Farbe im RGB-Format im Bereich von " +"(0, 0, 0) bis (255, 255, 255)." + +#. (itstool) path: section/p +#: C/software-metadata.page:357 +msgid "Colors should be chosen so that they:" +msgstr "Die Farben sollten so gewählt werden, dass sie:" + +#. (itstool) path: item/p +#: C/software-metadata.page:360 +msgid "" +"Are identifiable to the application, matching the application’s branding in some way, if " +"possible." +msgstr "" +"Mit der Anwendung identifizierbar sind und nach Möglichkeit der Marke der Anwendung " +"entsprechen." + +#. (itstool) path: item/p +#: C/software-metadata.page:363 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used as a " +"background behind it, the icon can be distinguished." +msgstr "" +"Mit dem Rand des Anwendungssymbols in Kontrast stehen, sodass das Symbol erkennbar ist, " +"wenn sie als Hintergrund verwendet werden." + +#. (itstool) path: item/p +#: C/software-metadata.page:366 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and " +"in its dark variant (#eeeeec). This generally means choosing a color with a " +"medium level of brightness." +msgstr "" +"Mit der Vordergrund-Textfarbe im Adwaita-Thema (#2e3436) und in seiner " +"dunklen Variante (#eeeeec) in Kontrast stehen. Dies bedeutet im Allgemeinen, " +"dass Sie eine Farbe mit mittlerer Helligkeit wählen." + +#. (itstool) path: item/p +#: C/software-metadata.page:369 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" +"Der Kontrast kann mit der Kontrast-Anwendung überprüft werden." + +#. (itstool) path: section/p +#: C/software-metadata.page:372 +msgid "" +"At least one color should be specified. More can be specified if one color can’t satisfy " +"all the requirements above, and Software will choose the most appropriate to " +"use in the carousel tile. If exactly one color is specified, its brightness and " +"saturation may be modified to improve contrast with the foreground color. If more than " +"one color is specified, the one with the best contrast with the foreground color will be " +"chosen, and its brightness and saturation will not be modified." +msgstr "" +"Es sollte mindestens eine Farbe angegeben werden. Es können mehrere Farben angegeben " +"werden, wenn eine Farbe nicht alle oben genannten Anforderungen erfüllen kann. " +"Software wählt dann die am besten geeignete Farbe für die Karussellkachel aus. " +"Wenn genau eine Farbe angegeben wird, können Helligkeit und Sättigung der Farbe verändert " +"werden, um den Kontrast zur Vordergrundfarbe zu verbessern. Wenn mehr als eine Farbe " +"angegeben wird, wird die Farbe mit dem besten Kontrast zur Vordergrundfarbe gewählt, und " +"ihre Helligkeit und Sättigung werden nicht verändert." + +#. (itstool) path: section/title +#: C/software-metadata.page:376 +msgid "How to test carousel tile background color changes" +msgstr "So testen Sie die Änderung der Hintergrundfarbe von Karussellkacheln" + +#. (itstool) path: section/p +#: C/software-metadata.page:377 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" +"Ändern Sie die metainfo-Datei für Ihre Anwendung, und führen Sie dann Software " +"aus mit:" + +#. (itstool) path: section/p +#: C/software-metadata.page:378 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml,icon=/path/" +"to/app/icon.png" +msgstr "" +"gnome-software --show-metainfo=/pfad/zur/anwendung.metainfo.xml," +"icon=/pfad/zur/anwendung/icon.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:379 +msgid "" +"The details page for your application will be shown. If you navigate back to the overview " +"page of Software, your application will be the only one in the ‘featured’ " +"carousel." +msgstr "" +"Die Detailseite für Ihre Anwendung wird angezeigt. Wenn Sie zurück zur Übersichtsseite " +"von Software navigieren, ist Ihre Anwendung die einzige im »Vorgestellt«-" +"Karussell." diff --git a/help/de/figures/app-context-bar.png b/help/de/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..e32811e01cb12849ab7ceabca7de8622bbf8b6f5 GIT binary patch literal 24330 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 literal 0 HcmV?d00001 diff --git a/help/eu/eu.po b/help/eu/eu.po new file mode 100644 index 0000000..c9d9adc --- /dev/null +++ b/help/eu/eu.po @@ -0,0 +1,1200 @@ +# Basque translation for gnome-software. +# Copyright (C) 2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Asier Saratsua Garmendia , 2025. +# +msgid "" +msgstr "Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2025-03-14 20:58+0000\n" +"PO-Revision-Date: 2025-03-14 20:58+0000\n" +"Last-Translator: Asier Saratsua Garmendia \n" +"Language-Team: Basque \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Asier Saratsua Garmendia " + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Phaedrus Leeds" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Nola instalatu web-aplikazio bat" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "Softwarea aplikazioak bi motatako web-aplikazioak kudeatzea onartzen du:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See README.md." +msgstr "Softwarea aplikazioarekin AppStream motako metainformazioa instalatuta duten web-aplikazioak. Ikusi README.md." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "GNOME Weba erabiliz instalatu diren web-aplikazioak." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software " +"(when this functionality has been enabled by the distribution), whereas the " +"second type only show up in Software after they have been " +"installed via GNOME Web. If you uninstall such an app and want to reinstall " +"it, you must do so using GNOME Web." +msgstr "Lehen motatakoak instalatzeko moduan erakusten dira Softwarea aplikazioan (banaketak funtzionaltasun hori gaitu badu), eta bigarren motatakoak Softwarean erakusten dira GNOME Weba bidez instalatu badira soilik. Horrelako aplikazio bat desinstalatzen baduzu eta berriro instalatu nahi baduzu, GNOME Webaren bidez egin behar duzu." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "Honakoak dira GNOME Weba erabiliz web-aplikazio bat instalatzeko urratsak:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as " +"shown in the image below." +msgstr "Egin klik aplikazioaren goiko eskuineko Menua botoian, beheko irudian agertzen den moduan." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This " +"should open the web app creation dialog." +msgstr "Egin klik Instalatu web-aplikazio gisa… menu-elementuan. Horrek web-aplikazioak sortzeko elkarrizketa-koadroa irekiko du." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install " +"the web app." +msgstr "Egin klik Sortu botoian web-aplikazioa sortu eta instalatzeko." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "Web-aplikazioa Softwarea aplikazioaren Instalatua fitxan agertuko da." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Softwarea" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported lizentzia" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "This work is licensed under a <_:link-1/>." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Philip Withnall" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Software-lizentziei buruzko sarrera" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Software-lizentziak" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Sarrera" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the " +"freedoms you as a user have. If an app is free/open source software (FOSS), you have the freedom to use it, copy it, study and change its source " +"code. Proprietary software does not provide you with those freedoms. FOSS " +"software is often available for no charge, but this is not always true." +msgstr "" + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get " +"involved in its development, contributing features or translations to their " +"language and fixing bugs which affect them. They can audit the code and " +"check that changes to the software are not malicious. They can learn from " +"the source code and use it as the basis for their own FOSS applications." +msgstr "" + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a " +"public good." +msgstr "FOSS aplikazioak ondasun publikoa dira." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that " +"the developers of the app have your best interests in mind, and no conflicts " +"of interest." +msgstr "Aplikazio jabedunak ezin dira ikuskatu, eta garatzaileez fidatu behar duzu." + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS " +"over proprietary software." +msgstr "" + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Will Thompson" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Milan Crha" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Softwareak nola erabiltzen dituen metadatuak" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Software-metadatuak" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Pantaila-argazkiak" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an " +"application. This typically should include screenshots of various windows / " +"dialogs of the application, so the user would get a quick grasp of the " +"application’s features, look and feel etc." +msgstr "Softwareak aplikazioen xehetasun-orrietan erakusten ditu pantaila-argazkiak. Gehienetan aplikazioaren leiho eta elkarrizketa-koadroen pantaila-argazkiak dira, erabiltzaileak aplikazioaren eginbideen, itxuraren eta beste antzeko kontu batzuen ikuspegi azkarra eduki dezan." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "Aplikazioaren metainformazio-fitxategian pantaila-argazki bat baino gehiago badago, Softwareak ikuspegi birakari gisa erakutsiko ditu." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any " +"screenshot, then a placeholder icon as below with No Screenshots will be displayed:" +msgstr "Aplikazioaren metainformazio-fitxategiak ez duenean pantaila-argazkirk, leku-marka gisa funtzionatzen duen ikono bat bistaratuko da, Pantaila-argazkirik ezdioena:" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "" +"Placeholder icon might look different if you're using a custom icon theme." +msgstr "Leku-markako ikonoak beste itxura bat izan dezake ikono-gai pertsonalizatua erabiltzen baduzu." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even " +"if Software shows screenshots for an app, it’s important to check " +"if these screenshots are up-to-date or outdated." +msgstr "Pantaila-argazkiak zaharkituta geratu daitezke aplikazioak interfazea aldatzen badu. Beraz, Softwareak aplikazio baten pantaila-argazkiak erakutsi arren, beti egiaztatu behar da pantaila-argazki horiek eguneratuta dauden." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "Pantaila-argazkiaren informazioa hobetzeko:" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app " +"screenshots" +msgstr "Nola gehitu falta diren pantaila-argazkiak" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Aplikazioaren testuinguru-barra" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the " +"details page for an application, which display the following details." +msgstr "Aplikazioen testuinguru-barra, Softwarean, aplikazio bakoitzaren xehetasun-orrian erakusten diren lauzen bilduma bat da. Honako xehetasunak erakusten ditu:" + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Tamaina" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Segurtasuna" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Hardware-euskarria" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Adinaren araberako balorazioa" + +#. (itstool) path: section/p +#. Translators: Refer +#. https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/Help-Translation-Notes +#. for steps to localize 'figures/app-context-bar.png' image. +#: C/software-metadata.page:74 +msgid "This shows the app context bar for the Software app:" +msgstr "Honek Softwarea aplikazioaren testuinguru-barra erakusten du:" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:75 +msgctxt "_" +msgid "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "external ref='figures/app-context-bar.png' md5='3badcd9309bde27a650b25eb5d89a4c6'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:78 +msgid "" +"The tiles are displayed in the order listed above (starting with " +"Storage tile on the left)." +msgstr "Lauzak goian zerrendatutako ordenan bistaratzen dira (ezkerretik hasita, lehenengo Tamaina)." + +#. (itstool) path: section/p +#: C/software-metadata.page:79 +msgid "Each tile is covered in detail below." +msgstr "Lauza bakoitza xeheago azaltzen da behean." + +#. (itstool) path: section/title +#: C/software-metadata.page:83 +msgid "Storage" +msgstr "Tamaina" + +#. (itstool) path: section/p +#: C/software-metadata.page:84 +msgid "" +"Software displays a storage tile on the details page for an " +"application. If the application is not installed, this displays the " +"estimated download size needed to install it. If the application is " +"installed, it displays the storage space used by the application." +msgstr "Softwareak tamaina erakusten du lauza batean, aplikazioen xehetasunen orrian. Aplikazioa ez badago instalatuta, hura instalatzeko gutxi gorabehera zein tamainako fitxategia deskargatu behar den erakusten du. Aplikazioa instalatuta badago, hurak erabiltzen duen biltegiratze-espazioa erakusten du." + +#. (itstool) path: section/p +#: C/software-metadata.page:85 +msgid "" +"The sizes are calculated from data provided by the Software " +"backend (such as flatpak or an RPM), and are not specified in the metadata " +"provided by the application. There is nothing you can do to affect this tile " +"by editing an application’s metainfo file. It’s listed here for completeness." +msgstr "Tamainak kalkulatzeko, Softwarea aplikazioaren motorrak (adibidez flatpak edo RPM) ematen dituen datuak erabiltzeko dira, eta ez daude zehaztuta aplikazioak eskainitako metadatuetan. Ezin da ezer egin lauza hori moldatzeko, ezta aplikazioaren metainformazio-fitxategia aldatu ere." + +#. (itstool) path: section/title +#: C/software-metadata.page:89 +msgid "Safety" +msgstr "Segurtasuna" + +#. (itstool) path: section/p +#: C/software-metadata.page:90 +msgid "" +"Software displays a safety tile on the details page for an " +"application. This summarizes information about whether the app can be " +"considered safe to install and run, or whether caution may be required " +"before trusting it." +msgstr "Softwareak segurtasuna erakusten du lauza batean, aplikazioen xehetasunen orrian. Aplikazioa instalatzeko eta exekutatzeko segurua den ala kontuz aritu behar den adierazten da lauza horretan." + +#. (itstool) path: section/p +#: C/software-metadata.page:91 +msgid "" +"This tile combines information about the permissions which the app requests " +"when it runs (such as permission to read your files), with information about " +"how the app was developed. Free software applications, where the source code " +"is publicly readable, can be more secure than proprietary ones, as they can " +"be audited." +msgstr "Lauza horrek aplikazioak exekutatzeko eskatzen dituen baimenei buruzko informazioa ematen da (adibidez, fitxategiak irakurtzeko baimena). Horrez gain, aplikazioa nola garatu den ere adierazten da. Software libreko aplikazioak, iturburu-kodea irakurgarria izanik, jabedun aplikazioak baino seguruagoak izan daitezke." + +#. (itstool) path: section/p +#: C/software-metadata.page:92 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"permissions the app requests, plus some information about its license and " +"runtime." +msgstr "Lauzan klik egitean agertzen den elkarrizketa-koadroan aplikazioak eskatu dituen baimenak zerrendatzen dira, gehi bere lizentziari eta exekuzio-denborari buruzko informazioa." + +#. (itstool) path: section/p +#: C/software-metadata.page:93 +msgid "You can improve the safety information:" +msgstr "Segurtasun-informazioa hobetzeko:" + +#. (itstool) path: item/p +#: C/software-metadata.page:96 +msgid "" +"How " +"to fix incorrect safety and permissions information" +msgstr "Nola konpondu segurtasun- eta baimen-informazio okerra" + +#. (itstool) path: section/title +#: C/software-metadata.page:102 +msgid "Hardware support" +msgstr "Hardware-euskarria" + +#. (itstool) path: section/p +#: C/software-metadata.page:103 +msgid "" +"Software displays a hardware support tile on the details page for " +"an application. This combines information about the hardware requirements of " +"the application, and the hardware capabilities of the computer, with the aim " +"of highlighting incompatibilities or missing requirements — or to indicate " +"that the application should work correctly with no incompatibilities." +msgstr "Softwareak hardware-euskarriaren informazioa erakusten du lauza batean, aplikazioen xehetasunen orrian. Aplikazioak dituen hardware-eskakizunei buruzko informazioa eta ordenagailuaren hardware-kapazitateei buruzkoa ematen da bertan, horrela bateraezintasunak edo falta diren eskakizunak nabarmen geratu daitezen - edo aplikazioak bateraezintasunik gabe eta ongi funtzionatuko duela adierazteko." + +#. (itstool) path: section/p +#: C/software-metadata.page:112 +msgid "" +"The code looks at the following hardware. More may be supported in future." +msgstr "Kodeak ondoren adierazitako hardwarea begiratzen du. Etorkizunean informazio gehiago emango da." + +#. (itstool) path: item/p +#: C/software-metadata.page:114 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "Ukipen-panel bat, sagu bat edo teklatu bat dagoen edo beharrezkoa den" + +#. (itstool) path: item/p +#: C/software-metadata.page:115 +msgid "Whether a gamepad is needed" +msgstr "Joko-aginte bat beharrezkoa den" + +#. (itstool) path: item/p +#: C/software-metadata.page:116 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "Aplikazioaren gutxieneko eta gomendatutako pantaila-tamainak" + +#. (itstool) path: section/p +#: C/software-metadata.page:119 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, " +"as they are often left disconnected due to not being needed for normal " +"computer use." +msgstr "Ezin da joko-aginte bat badagoela modu fidagarrian detektatu, sarritan deskonektatuta uzten baita, normalean ez baita beharrezkoa ordenagailua erabiltzeko." + +#. (itstool) path: section/p +#: C/software-metadata.page:120 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"hardware requirements of the app, and whether any of them are not met." +msgstr "Lauzan klik egitean agertzen den elkarrizketa-koadroan aplikazioak dituen hardware-eskakizunak zerrendatzen dira, eta haietako guztiak betetzen diren ala ez." + +#. (itstool) path: section/p +#: C/software-metadata.page:121 +msgid "You can improve the hardware information:" +msgstr "Hardware-informazioa hobetzeko:" + +#. (itstool) path: item/p +#: C/software-metadata.page:124 +msgid "" +"How to add missing " +"hardware information" +msgstr "Nola gehitu falta den hardware-informazioa" + +#. (itstool) path: section/title +#: C/software-metadata.page:130 +msgid "Age rating" +msgstr "Adinaren araberako balorazioa" + +#. (itstool) path: section/p +#: C/software-metadata.page:131 +msgid "" +"Software displays an age rating tile on the details page for an " +"application. This shows what age range the application should be suitable " +"for, based on different kinds of content which the application has declared " +"it contains. This information is summarized in a format similar to the game " +"or film rating certificates for your country." +msgstr "Softwareak adinaren araberako balorazioaren informazioa erakusten du lauza batean, aplikazioen xehetasunen orrian. Aplikazioa zein adinetarako den egokia adierazten du horrek, aplikazioak berak daukala adierazi duen edukiaren arabera. Informazio hori zure herrialdean jokoak edo filmak baloratzeko erabiltzen den modu berean ematen da." + +#. (itstool) path: section/p +#: C/software-metadata.page:132 +msgid "" +"For example, this will highlight whether a game contains violence, or " +"whether an application contains in-app advertising." +msgstr "Adibidez, joko batek indarkeria duen ala ez nabarmenduko da, edo iragarkiak dituen ala ez." + +#. (itstool) path: section/p +#: C/software-metadata.page:133 +msgid "" +"The dialog which appears when the tile is clicked lists the different types " +"of content in the application and how severe that content is." +msgstr "Lauzan klik egitean agertzen den elkarrizketa-koadroan aplikazioak dituen eduki mota desberdinak zerrendatzen dira eta zein gogortasun-mailakoak diren." + +#. (itstool) path: section/p +#: C/software-metadata.page:134 +msgid "You can improve the age rating information:" +msgstr "Adinaren araberako balorazioa hobetzeko:" + +#. (itstool) path: item/p +#: C/software-metadata.page:137 +msgid "" +"How to add " +"missing content rating information" +msgstr "Nola gehitu adinaren araberako balorazioan falta den informazioa" + +#. (itstool) path: section/title +#: C/software-metadata.page:143 +msgid "License" +msgstr "Lizentzia" + +#. (itstool) path: section/p +#: C/software-metadata.page:146 +msgid "" +"Software displays a tile indicating whether an application is " +"free software or whether its license is " +"proprietary, special or unknown. This tile includes more detailed " +"information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "Softwareak aplikazio bat software librea den ala jabeduna, berezia edo ezezaguna den adierazten duen izenburu bat erakusten du. Izenburu horrek proiektuaren lizentziari buruzko informazio xehea eskaintzen du. Software librearen onuretako batzuk ere zerrendatzen ditu. Ikasi gehiago" + +#. (itstool) path: section/p +#: C/software-metadata.page:147 +msgid "" +"Sometimes the license information isn’t correct for an application, and " +"hence an application which is actually free software will be shown as " +"‘proprietary’. Similarly, sometimes the license information is unknown." +msgstr "Batzuetan lizentziaren informazioa ez da zuzena aplikazio baterako, eta software librea den aplikazioa bat jabedun gisa agertzen da. Beste batzuetan, gerta daiteke lizentziaren informazioa ezezaguna izatea." + +#. (itstool) path: section/p +#: C/software-metadata.page:148 +msgid "" +"Software highlights free and open-source licenses in green, " +"proprietary and special licenses in yellow as shown here. Unknown licenses " +"are highlighted in grey." +msgstr "Softwarea aplikazioak lizentzia libre eta kode irekikoak berdez margotzen ditu, jabedunak eta bereziak horiz. Lizentzia ezezagunak grisez nabarmenduta agertzen dira." + +#. (itstool) path: section/p +#: C/software-metadata.page:149 +msgid "You can add or improve the license information:" +msgstr "Lizentzia-informazioa hobetzeko:" + +#. (itstool) path: item/p +#: C/software-metadata.page:152 +msgid "" +"How to fix " +"incorrect licensing information" +msgstr "Nola konpondu lizentzia-informazio okerra" + +#. (itstool) path: section/title +#: C/software-metadata.page:158 +msgid "Links" +msgstr "Estekak" + +#. (itstool) path: section/p +#: C/software-metadata.page:160 +msgid "" +"Software displays a list of application resource links in the " +"link tile. They are as follows:" +msgstr "Softwareak aplikazioaren baliabideen esteken zerrenda bat erakusten du esteen lauzan. Honakoak dirasof:" + +#. (itstool) path: td/p +#: C/software-metadata.page:164 +msgid "Website link" +msgstr "Webgunearen esteka" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Donation link" +msgstr "Diruz laguntzeko esteka" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Translation contribution link" +msgstr "Itzulpenetan laguntzeko esteka" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Bug reporting link" +msgstr "Akatsak jakinarazteko esteka" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Help link" +msgstr "Laguntzarako esteka" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Contact link" +msgstr "Harremanetarako esteka" + +#. (itstool) path: section/p +#: C/software-metadata.page:187 +msgid "" +"Some or all of these links may be present depending on whether they are " +"listed in the application’s metainfo file." +msgstr "Esteka horietako batzuk soilik edo den-denak agertu daitezke, aplikazioaren metainformazio-fitxategian adierazitakoaren arabera." + +#. (itstool) path: section/p +#: C/software-metadata.page:188 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the " +"following tile with a question mark will be displayed." +msgstr "Aplikazioaren metainformazio-fitxategiak ez badu inolako estekarik, galdera-ikurra duen lauza bat bistaratuko da." + +#. (itstool) path: section/p +#: C/software-metadata.page:190 +msgid "You can improve the links:" +msgstr "Estekak hobetzeko:" + +#. (itstool) path: item/p +#: C/software-metadata.page:193 +msgid "" +"How to add missing links" +msgstr "Nola gehitu falta diren estekak" + +#. (itstool) path: section/title +#: C/software-metadata.page:199 +msgid "Carousel tile" +msgstr "Ikuspegi birakariaren izenburua" + +#. (itstool) path: section/p +#: C/software-metadata.page:201 +msgid "" +"Applications which are featured by Software are displayed in a " +"carousel at the top of the main window as shown here. Each carousel tile has " +"a background color which is automatically extracted from the application’s " +"icon. Sometimes this background color is not quite right for the application " +"and needs to be specified explicitly by the application developer." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:202 +msgid "" +"The set of applications which are featured is decided by the Linux " +"distribution maintainers." +msgstr "Nabarmenduta ageri diren aplikazioen multzoa Linux banaketa bakoitzaren garatzaileek erabakitzen dute." + +#. (itstool) path: section/p +#: C/software-metadata.page:203 +msgid "You can improve the carousel tile:" +msgstr "Ikuspegi birakariaren lauza hobetzeko:" + +#. (itstool) path: item/p +#: C/software-metadata.page:206 +msgid "" +"How to set " +"the carousel tile background color" +msgstr "Nola ezarri ikuspegi birakariaren lauzaren atzeko planoa" + +#. (itstool) path: section/title +#: C/software-metadata.page:212 +msgid "Where metadata comes from" +msgstr "Metadatuak nondik datozen" + +#. (itstool) path: section/p +#: C/software-metadata.page:213 +msgid "" +"The metadata used to specify what hardware a piece of software requires, " +"what ages of user it is suitable for, and factors which contribute to how " +"safe it might be to install, all come from the metainfo file for that " +"software." +msgstr "Software batek zein harware behar duen, zein adinetarako den egokia, eta zein segurua den zehazteko erabiltzen diren metadatuak software horren metainformazio-fitxategian daude." + +#. (itstool) path: section/p +#: C/software-metadata.page:214 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream " +"specification." +msgstr "Metainformazioa XML fitxategi bat da. Bere fitxategi-formatua AppStream espezifikazioan dago zehaztuta." + +#. (itstool) path: section/p +#: C/software-metadata.page:215 +msgid "" +"See the metainfo file for GNOME Files " +"app." +msgstr "Ikusi GNOME Fitxategiak aplikazioaren metainformazio-fitxategia." + +#. (itstool) path: note/p +#: C/software-metadata.page:217 +msgid "appdata is the older term for metainfo." +msgstr "Lehen metainfo elementuari appdata esaten zitzaion." + +#. (itstool) path: section/title +#: C/software-metadata.page:222 +msgid "What happens if metadata is missing" +msgstr "Zer gertatzen da metadatuak falta badira" + +#. (itstool) path: section/p +#: C/software-metadata.page:223 +msgid "" +"If some metadata is missing for an application, Software can only " +"guess what it might be, and hence can’t present much information in its " +"interfaces. The guesses Software makes are based on the fact that " +"most software is designed for desktop computers." +msgstr "Aplikazio batek ez baditu metadatuetako batzuk, Softwareak horiek asmatzen saiatu daiteke, baina ezin izango du informazio askorik eman bere interfazeetan. Softwareak ulertuko du software gehiena mahaigaineko ordenagailuetarako sortu dela." + +#. (itstool) path: section/p +#: C/software-metadata.page:224 +msgid "" +"You can help improve the metadata for an application!" +msgstr "Aplikazio baten metadatuak hobetzen lagundu dezakezu." + +#. (itstool) path: section/title +#: C/software-metadata.page:228 +msgid "How to contribute missing information" +msgstr "Nola lagundu falta den informazioa osatzen" + +#. (itstool) path: section/p +#: C/software-metadata.page:229 +msgid "" +"If you find that an app’s page is missing information or has incorrect " +"information, you can contribute in one of the two ways:" +msgstr "Aplikazio baten orrian informazioa falta dela edo informazioa okerra dela ikusten baduzu, honela lagundu dezakezu:" + +#. (itstool) path: item/p +#: C/software-metadata.page:232 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug " +"tracker, so the app developer can fix it." +msgstr "Falta den edo okerra den metadatua aplikazioak akatsak jakinarazteko duen aztarnarian argitaratu dezakezu, garatzaileak hutsunea konpondu dezan." + +#. (itstool) path: item/p +#: C/software-metadata.page:235 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How to guide below on how to do that." +msgstr "Falta den edo okerra den metadatua zuk zeuk konpondu dezakezu. Ikusi Nola egin gida hori nola egiten den ikasteko." + +#. (itstool) path: section/p +#: C/software-metadata.page:239 +msgid "" +"For both, you first need to find the app’s project page. The link to the " +"project page should typically be available in the app’s page as shown here. If not, you will need to find it with " +"a simple search on Google." +msgstr "Bi kasuetan, lehenengo aplikazioaren proiektu-orria aurkitu behar duzu. Proiektu-orriaren esteka normalean aplikazioaren orrian agertuko da, hemen erakusten den moduan. Ez badago, bilatzaile baten bidez bilatu beharko duzu interneten." + +#. (itstool) path: section/p +#: C/software-metadata.page:241 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "Aplikazioak normalean GitLab edo GitHub gune batean daude. Adibidez, GNOMEren aplikazioak gitlab.gnome.org gunean daude." + +#. (itstool) path: section/title +#: C/software-metadata.page:245 +msgid "How to add missing app screenshots" +msgstr "Nola gehitu falta diren pantaila-argazkiak" + +#. (itstool) path: section/p +#: C/software-metadata.page:246 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s <component> in its " +"metainfo file." +msgstr "Aplikazioen pantaila-argazkiak <screenshots> elementuan gordetzen dira, aplikazioaren metainformazio-fitxategiko <component> osagaian." + +#. (itstool) path: section/p +#: C/software-metadata.page:247 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots " +"should ideally be in the PNG format with 16:9 aspect ratio and minimum width " +"of 620 pixels." +msgstr "Aplikazioek 5 eta 10 pantaila-argazki artean eduki ditzaten gomendatzen dugu. Hobe da PNG formatua erabiltzea, 16:9 aspektu-erlazioa eta gutxienez 620 pixeleko zabalera." + +#. (itstool) path: section/p +#: C/software-metadata.page:248 +msgid "" +"For example, here are the screenshot entries for the Software app:" +msgstr "Adibidez, hona hemen Softwarea aplikazioaren beraren pantaila-argazkiak:" + +#. (itstool) path: section/code +#: C/software-metadata.page:249 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:263 +msgid "How to fix incorrect safety and permissions information" +msgstr "Nola konpondu segurtasun- eta baimen-informazio okerra" + +#. (itstool) path: section/p +#: C/software-metadata.page:264 +msgid "" +"The safety and permissions information for an application comes from " +"different sources depending on how the application is packaged. For " +"traditionally packaged applications, for example in RPM or DEB format, there " +"is no safety or permissions information available and nothing can be done to " +"add it to an application." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:265 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, specifying what holes in the sandbox the application requires. Each " +"of these holes typically contributes to lowering the displayed safety level " +"of the application in Software — moving it from ‘safe’ to " +"‘potentially unsafe’ to ‘unsafe’." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:266 +msgid "" +"In order to improve the safety level of an application, its sandboxing must " +"be made as tight as possible, by removing sandbox permissions where " +"they’re not needed, and using portals instead of sandbox " +"permissions where possible. Use of portals does not lower the displayed " +"safety level of an application in Software." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:267 +msgid "" +"For example, if the application requests read/write access to the full file " +"system (--filesystem=host), does it actually need that, or does " +"it only need to access files in a few specific locations? If so, the file portal could be used, or more specific file system permissions could be specified." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a " +"fallback, without using special X11 features, could it use --" +"socket=fallback-x11 rather than --socket=x11?" +msgstr "Aplikazioak Wayland ingurunean funtzionatzen badu eta X11 solik arazoak daudenean behar badu, eta X11 eginbide bereziak behar ez baditu, --socket=fallback-x11 erabili al dezake, --socket=x11 erabili ordez?" + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be " +"added here in future." +msgstr "Baimen bereziei edo beste paketatze-formatu batzuei buruzko gidalerroak eman daitezke hemen etorkizunean." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 C/software-metadata.page:308 +msgid "Further reading:" +msgstr "Informazio gehiago:" + +#. (itstool) path: section/title +#: C/software-metadata.page:285 +msgid "How to add missing hardware information" +msgstr "Nola gehitu falta den harware-informazioa" + +#. (itstool) path: section/p +#: C/software-metadata.page:286 +msgid "" +"The hardware information for an application is stored in the <requires>, <recommends>" +" and <supports> elements within the " +"application’s <component> in its metainfo file." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:287 +msgid "" +"Software understands the <" +"control> and <display_length> elements." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:288 +msgid "" +"See this blog post or " +"this blog post for examples of metadata." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:292 +msgid "How to add missing content rating information" +msgstr "Nola gehitu eduki-balorazioari buruz falta den informazioa" + +#. (itstool) path: section/p +#: C/software-metadata.page:293 +msgid "" +"The content rating information for an application is stored in the <content_rating> element " +"within the application’s <component> in its metainfo file." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:294 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If " +"the <content_rating> element is not specified, the " +"application’s content rating is unknown. If it’s specified but empty, the " +"application has no content which might be unsuitable for any audience." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:295 +msgid "" +"Use the OARS generator " +"to produce suitable content rating information for an application." +msgstr "Erabili OARS sortzailea aplikazioaren balorazio-informazio egokia sortzeko." + +#. (itstool) path: section/title +#: C/software-metadata.page:299 +msgid "How to fix incorrect licensing information" +msgstr "Nola konpondu lizentzia-informazio okerra" + +#. (itstool) path: section/p +#: C/software-metadata.page:300 +msgid "" +"The licensing information for an application is stored in the <project_license> " +"element within the application’s <component> in its " +"metainfo file." +msgstr "Aplikazioen lizentzia-informazioa <project_license> elementuan gordetzen da, aplikazioaren metainformazio-fitxategiko <component> elementuan." + +#. (itstool) path: section/p +#: C/software-metadata.page:301 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license " +"for the project. This should typically be the license of the code, and not " +"include the license of the documentation or ancillary content." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:302 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of " +"multiple licenses, which are all FSF or OSI approved, the application is considered ‘free software’ " +"and the license tile says so. Otherwise, it’s considered ‘proprietary’." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:303 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it " +"shouldn’t be, it’s likely that the <project_license> " +"element includes the documentation license for the project. Remove it." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"For example, change the license metadata from:" +msgstr "Adibidez, aldatu hemengo lizentzia-metadatuak:" + +#. (itstool) path: section/code +#: C/software-metadata.page:305 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "to" +msgstr "-" + +#. (itstool) path: section/code +#: C/software-metadata.page:307 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +#. (itstool) path: item/p +#: C/software-metadata.page:311 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "Ez jarri (orokorrean) dokumentazioaren lizentzia appdata-n" + +#. (itstool) path: section/title +#: C/software-metadata.page:320 +msgid "How to add missing links" +msgstr "Nola gehitu falta diren estekak" + +#. (itstool) path: section/p +#: C/software-metadata.page:321 +msgid "" +"The links for an application are stored as <url> elements within the application’s " +"<component> in its metainfo file." +msgstr "Aplikazioen estekak <url> elementuan gordetzen da, aplikazioaren metainformazio-fitxategiko <component> elementuan." + +#. (itstool) path: section/p +#: C/software-metadata.page:322 +msgid "" +"Add as many of the link types documented in the appstream specification as are available for the application. " +"If no suitable page exists for a given link type, it doesn’t have to be " +"included." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:323 +msgid "" +"For example, here are the resource links for the Software app:" +msgstr "Adibidez, hona hemen Softwarea aplikazioaren baliabide-estekak:" + +#. (itstool) path: section/code +#: C/software-metadata.page:324 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:335 +msgid "How to set the carousel tile background color" +msgstr "Nola ezarri ikuspegi birakariaren lauzaren atzeko planoaren kolorea" + +#. (itstool) path: section/p +#: C/software-metadata.page:336 +msgid "" +"The carousel tile background color is normally extracted automatically from " +"the application’s icon. If that color is unsatisfactory, however, it can be " +"overridden by using the appstream’s <" +"branding/> element with declared colors (since 47.x " +"series). The advantage is that more clients can use the colors." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:337 +msgid "For example, here are some branding entries:" +msgstr "Adibidez, hona hemen marka ezartzeko sarrera batzuk:" + +#. (itstool) path: section/code +#: C/software-metadata.page:338 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:344 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses the better color for the theme on its own." +msgstr "Ikusi nola scheme_preference atributuari ez ikusiarena egiten zaiola, Softwarea aplikazioak berak aukeratzen du gairako kolorerik onena." + +#. (itstool) path: section/p +#: C/software-metadata.page:346 +msgid "" +"There is left, for backward compatibility, the possibility to add the " +"following XML to the application’s metainfo <component> " +"element:" +msgstr "" + +#. (itstool) path: section/code +#: C/software-metadata.page:347 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:351 +msgid "but the <branding/> element has a precedence." +msgstr "baina <branding/> elementuak lehentasuna du." + +#. (itstool) path: section/p +#: C/software-metadata.page:352 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format " +"GVariant with type a(yyy), and represents an unordered set of " +"key colors for the application. Each element of the set is a color in RGB " +"form ranging from (0, 0, 0) to (255, 255, 255)." +msgstr "" + +#. (itstool) path: section/p +#: C/software-metadata.page:353 +msgid "Colors should be chosen so that they:" +msgstr "Koloreak hautatzeko, kontuan izan:" + +#. (itstool) path: item/p +#: C/software-metadata.page:356 +msgid "" +"Are identifiable to the application, matching the application’s branding in " +"some way, if possible." +msgstr "Aplikazioa ongi identifikatzen dutela eta aplikazioaren markarekin bat datozela, posible bada." + +#. (itstool) path: item/p +#: C/software-metadata.page:359 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used " +"as a background behind it, the icon can be distinguished." +msgstr "Aplikazioaren ikonoaren ertzarekin kontraste egokia duela, haren atzeko plano gisa erabiltzen denean ikonoa ongi bereiztu dadin." + +#. (itstool) path: item/p +#: C/software-metadata.page:362 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and in its dark variant (#eeeeec). This generally means " +"choosing a color with a medium level of brightness." +msgstr "Adwaita gaiaren aurreko planoko testuen kolorearekin (#2e3436) kontraste egokia duela, baita aldaera ilunean ere (#eeeeec). Horrek esan nahi du oro har argitasun-maila ertaina duen kolore bat aukeratu behar dela." + +#. (itstool) path: item/p +#: C/software-metadata.page:365 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "Kontrastea egiaztatzeko, erabili Kontrastea izeneko aplikazioa." + +#. (itstool) path: section/p +#: C/software-metadata.page:368 +msgid "" +"At least one color should be specified. More can be specified if one color " +"can’t satisfy all the requirements above, and Software will " +"choose the most appropriate to use in the carousel tile. If exactly one " +"color is specified, its brightness and saturation may be modified to improve " +"contrast with the foreground color. If more than one color is specified, the " +"one with the best contrast with the foreground color will be chosen, and its " +"brightness and saturation will not be modified." +msgstr "" + +#. (itstool) path: section/title +#: C/software-metadata.page:372 +msgid "How to test carousel tile background color changes" +msgstr "Nola probatu ikuspegi birakariaren lauzaren atzeko planoaren kolore-aldaketak" + +#. (itstool) path: section/p +#: C/software-metadata.page:373 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "Aldatu zure aplikazioaren metainformazio-fitxategia eta, ondoren, exekutatu Softwarea aplikazioa honela:" + +#. (itstool) path: section/p +#: C/software-metadata.page:374 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml," +"icon=/path/to/app/icon.png" +msgstr "gnome-software --show-metainfo=/path/to/app.metainfo.xml,icon=/path/to/app/icon.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:375 +msgid "" +"The details page for your application will be shown. If you navigate back to " +"the overview page of Software, your application will be the only " +"one in the ‘featured’ carousel." +msgstr "Zure aplikazioaren xehetasun-orria erakutsiko da. Softwareko ikuspegi orokorreko orrira itzultzen bazara, zure aplikazioa ikuspegi birakariko aplikazio 'nabarmendu' bakarra izango da." diff --git a/help/fr/figures/app-context-bar.png b/help/fr/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..a61dcbee1cc375c592a430294827ff4590a295c7 GIT binary patch literal 22026 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, 2024-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software gnome-47\n" +"POT-Creation-Date: 2025-04-11 02:03+0000\n" +"PO-Revision-Date: 2025-04-25 16:25+0200\n" +"Last-Translator: Vincent Chatelain \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" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Vincent Chatelain , 2024, 2025" + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Phaedrus Leeds" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Réinstaller une application web" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "Logiciels prend en charge deux types d’applications web :" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See README.md." +msgstr "" +"Les applications web pour lesquelles les métadonnées AppStream ont été " +"fournies avec Logiciels. Voir le fichier README.md." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" +"Les applications web installées en utilisant Web de GNOME." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software " +"(when this functionality has been enabled by the distribution), whereas the " +"second type only show up in Software after they have been " +"installed via GNOME Web. If you uninstall such an app and want to reinstall " +"it, you must do so using GNOME Web." +msgstr "" +"Le premier type est affiché comme disponible à l’installation dans " +"Logiciels (lorsque cette fonctionnalité a été activée par la " +"distribution), tandis que le second type est affiché dans Logiciels après leur installation depuis Web de GNOME. Si vous désintallez ce " +"type d’application et que vous souhaitez la réinstaller, vous devrez passer " +"par Web de GNOME pour le faire." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "" +"Voici les étapes pour installer une application web en utilisant Web de " +"GNOME :" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as " +"shown in the image below." +msgstr "" +"Cliquer sur le bouton Menu de l’application en " +"haut à droite comme montré dans l’image ci-dessous." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This " +"should open the web app creation dialog." +msgstr "" +"Cliquer sur l’élément Installer en tant " +"qu’application web… du menu. Cela devrait ouvrir une fenêtre de " +"dialogue permettant la création de l’application web." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install " +"the web app." +msgstr "" +"Cliquer sur le bouton Créer pour créer et " +"installer l’application web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" +"L’application web devrait désormais s’afficher dans l’onglet Installées de Logiciels." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Logiciels" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "" +"Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 non " +"transposé" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "Ce travail est sous une licence <_:link-1/>." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Philip Withnall" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Introduction aux licences logicielles" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Licences logicielles" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Introduction" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the " +"freedoms you as a user have. If an app is free/open source software (FOSS), you have the freedom to use it, copy it, study and change its source " +"code. Proprietary software does not provide you with those freedoms. FOSS " +"software is often available for no charge, but this is not always true." +msgstr "" +"Les applications peuvent être « logiciel libre/open-source » ou " +"« propriétaire ». Cela impacte la liberté que vous avez en tant " +"qu’utilisateur. Si une application est un logiciel libre/open-source " +"(FLOSS), vous pouvez librement l’utiliser, le copier, l’étudier et " +"modifier son code source. Un logiciel propriétaire ne vous accorde pas de " +"telles libertés. Un logiciel FLOSS est souvent disponible gratuitement, mais " +"ce n’est pas toujours le cas." + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get " +"involved in its development, contributing features or translations to their " +"language and fixing bugs which affect them. They can audit the code and " +"check that changes to the software are not malicious. They can learn from " +"the source code and use it as the basis for their own FOSS applications." +msgstr "" +"Puisque le code source d’un logiciel FLOSS est disponible, les utilisateurs " +"peuvent s’impliquer dans son développement, contribuer à ses " +"fonctionnalités, traduire dans leur langue et corriger les bogues qui les " +"impactent. Ils peuvent contrôler le code et vérifier que les modifications " +"apportées au logiciel ne sont pas vérolées. Ils peuvent également apprendre " +"à partir du code source et l’utiliser comme base pour leurs propres " +"applications FLOSS." + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a " +"public good." +msgstr "" +"Les applications FLOSS sont considérées comme un bien public." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that " +"the developers of the app have your best interests in mind, and no conflicts " +"of interest." +msgstr "" +"Les applications propriétaires ne peuvent pas être contrôlées par leurs " +"utilisateurs. Vous devez donc vous assurer que les développeurs de " +"l’application ont vos intérêts à cœur et qu’ils n’ont pas de conflits " +"d’intérêt." + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS " +"over proprietary software." +msgstr "" +"Apprenez en plus sur les " +"bénéfices des logiciels FLOSS par rapport aux logiciels propriétaires " +"(en anglais)." + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Will Thompson" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Milan Crha" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Utilisation des métadonnées par Logiciels" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Métadonnées logicielles" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Captures d’écran" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an " +"application. This typically should include screenshots of various windows / " +"dialogs of the application, so the user would get a quick grasp of the " +"application’s features, look and feel etc." +msgstr "" +"Logiciels affiche les captures d’écran sur la page détaillée " +"d’une application. Celle-ci devrait généralement contenir des captures " +"d’écran des différentes fenêtres de l’application, pour que l’utilisateur " +"puisse avoir un aperçu rapide des fonctionnalités de l’application, du rendu " +"visuel, etc." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" +"Lorsque plusieurs captures d’écran sont présentes dans le fichier de " +"métadonnées de l’application, Logiciels les affichera dans un " +"carrousel." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any " +"screenshot, then a placeholder icon as below with No Screenshots will be displayed:" +msgstr "" +"Dans les cas où le fichier de métadonnées de l’application ne contient " +"aucune capture d’écran, une icône de remplacement sera affichée à la place " +"avec Aucune capture d’écran  :" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "" +"Placeholder icon might look different if you're using a custom icon theme." +msgstr "" +"L’icône de remplacement pourrait avoir une apparence différente si vous " +"utilisez un thème d’icônes personnalisé." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even " +"if Software shows screenshots for an app, it’s important to check " +"if these screenshots are up-to-date or outdated." +msgstr "" +"Les captures d’écran pourraient devenir obsolètes au gré des changements de " +"l’interface de l’application. Donc, même si Logiciels affiche des " +"captures d’écrans pour une application, il est important de vérifier si ces " +"captures d’écran sont à jour ou obsolètes." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "" +"Vous pouvez améliorer les informations de capture d’écran de l’application :" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app " +"screenshots" +msgstr "" +"Ajouter des captures " +"d’écran d’application manquantes" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Zone contextuelle d’application" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the " +"details page for an application, which display the following details." +msgstr "" +"La zone contextuelle d’application dans Logiciels est une " +"collection de tuiles sur la page de détails d’une application, qui contient " +"les informations suivantes." + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Stockage" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Sécurité" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Prise en charge du matériel" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Évaluation par âge" + +#. (itstool) path: section/p +#. Translators: Refer below steps to localize +#. 'figures/app-context-bar.png' image: 1. Run 'gnome-software +#. --details=org.gnome.Software.desktop' in console (as normal user). 2. +#. This should launch the Software app and automatically switch to +#. Software app's details page. 3. It may take some time if some +#. background tasks are running. Wait for the app's details page to load. +#. 4. Scroll down to take the screenshot of the app context bar. +#: C/software-metadata.page:78 +msgid "This shows the app context bar for the Software app:" +msgstr "Voici la barre contextuelle d’application pour Logiciels :" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:79 +msgctxt "_" +msgid "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:82 +msgid "" +"The tiles are displayed in the order listed above (starting with " +"Storage tile on the left)." +msgstr "" +"Les tuiles sont affichées dans l’ordre ci-dessus (en commençant par la tuile " +"Stockage sur la gauche)." + +#. (itstool) path: section/p +#: C/software-metadata.page:83 +msgid "Each tile is covered in detail below." +msgstr "Chaque tuile est présentée en détails ci-dessous." + +#. (itstool) path: section/title +#: C/software-metadata.page:87 +msgid "Storage" +msgstr "Stockage" + +#. (itstool) path: section/p +#: C/software-metadata.page:88 +msgid "" +"Software displays a storage tile on the details page for an " +"application. If the application is not installed, this displays the " +"estimated download size needed to install it. If the application is " +"installed, it displays the storage space used by the application." +msgstr "" +"Logiciels affiche une tuile concernant le stockage sur la page " +"détaillée d’une application. Si l’application n’est pas installée, cette " +"tuile affiche la taille du téléchargement estimée pour l’installer. Si " +"l’application est installée, elle affiche l’espace mémoire utilisé par celle-" +"ci." + +#. (itstool) path: section/p +#: C/software-metadata.page:89 +msgid "" +"The sizes are calculated from data provided by the Software " +"backend (such as flatpak or an RPM), and are not specified in the metadata " +"provided by the application. There is nothing you can do to affect this tile " +"by editing an application’s metainfo file. It’s listed here for completeness." +msgstr "" +"Les tailles sont calculées à partir de données fournies par le moteur de " +"Logiciels (tel que flatpak ou rpm), et ne sont pas spécifiées " +"dans les métadonnées de l’application. Modifier le fichier de métadonnées de " +"l’application n’a aucune influence sur cette tuile. Il est mentionné ici par " +"souci d’exhaustivité." + +#. (itstool) path: section/title +#: C/software-metadata.page:93 +msgid "Safety" +msgstr "Sécurité" + +#. (itstool) path: section/p +#: C/software-metadata.page:94 +msgid "" +"Software displays a safety tile on the details page for an " +"application. This summarizes information about whether the app can be " +"considered safe to install and run, or whether caution may be required " +"before trusting it." +msgstr "" +"Logiciels affiche une tuile concernant la sécurité sur la page de " +"détails d’une application. Cette tuile résume les informations indiquant si " +"l’application peut être considérée comme sûre à installer et exécuter, ou " +"s’il faut prendre des précautions avant de lui faire confiance." + +#. (itstool) path: section/p +#: C/software-metadata.page:95 +msgid "" +"This tile combines information about the permissions which the app requests " +"when it runs (such as permission to read your files), with information about " +"how the app was developed. Free software applications, where the source code " +"is publicly readable, can be more secure than proprietary ones, as they can " +"be audited." +msgstr "" +"Cette tuile combine des informations sur les autorisations requises par " +"l’application pendant son exécution (par exemple l’autorisation de lecture " +"de vos fichiers), avec des informations sur la façon dont l’application a " +"été développée. Les applications libres peuvent être plus sûres que les " +"applications propriétaires, car elles peuvent être vérifiées lorsque leur " +"code source est publiquement accessible." + +#. (itstool) path: section/p +#: C/software-metadata.page:96 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"permissions the app requests, plus some information about its license and " +"runtime." +msgstr "" +"La fenêtre apparaissant lorsque vous cliquez sur la tuile liste les " +"différentes autorisations requises par l’application, ainsi que certaines " +"informations sur sa licence et son moteur d’exécution." + +#. (itstool) path: section/p +#: C/software-metadata.page:97 +msgid "You can improve the safety information:" +msgstr "Vous pouvez améliorer les informations de sécurité :" + +#. (itstool) path: item/p +#: C/software-metadata.page:100 +msgid "" +"How " +"to fix incorrect safety and permissions information" +msgstr "" +"Corriger des informations incorrectes de sécurité et " +"d’autorisations" + +#. (itstool) path: section/title +#: C/software-metadata.page:106 +msgid "Hardware support" +msgstr "Prise en charge matérielle" + +#. (itstool) path: section/p +#: C/software-metadata.page:107 +msgid "" +"Software displays a hardware support tile on the details page for " +"an application. This combines information about the hardware requirements of " +"the application, and the hardware capabilities of the computer, with the aim " +"of highlighting incompatibilities or missing requirements — or to indicate " +"that the application should work correctly with no incompatibilities." +msgstr "" +"Logiciels affiche une tuile concernant la prise en charge " +"matérielle sur la page de détails d’une application. Cette tuile combine les " +"informations sur les exigences matérielles requises par l’application et les " +"capacités matérielles de l’ordinateur, afin de mettre en valeur des " +"incompatibilités ou des configurations matérielles manquantes — ou indiquer " +"que l’application devrait fonctionner correctement et sans incompatibilité." + +#. (itstool) path: section/p +#: C/software-metadata.page:116 +msgid "" +"The code looks at the following hardware. More may be supported in future." +msgstr "" +"Le code demande le matériel suivant. D’autres matériels pourraient être pris " +"en charge dans le futur." + +#. (itstool) path: item/p +#: C/software-metadata.page:118 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "" +"Indique si un pavé tactile, une souris ou un clavier est présent ou requis" + +#. (itstool) path: item/p +#: C/software-metadata.page:119 +msgid "Whether a gamepad is needed" +msgstr "Indique si une manette de jeu est requise" + +#. (itstool) path: item/p +#: C/software-metadata.page:120 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "" +"La taille minimale et recommandée pour la mise à l’échelle de l’application" + +#. (itstool) path: section/p +#: C/software-metadata.page:123 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, " +"as they are often left disconnected due to not being needed for normal " +"computer use." +msgstr "" +"Il est impossible de déterminer avec certitude si une manette de jeu est " +"présente, puisqu’elle est souvent déconnectée car non utile pendant " +"l’utilisation normale de l’ordinateur." + +#. (itstool) path: section/p +#: C/software-metadata.page:124 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"hardware requirements of the app, and whether any of them are not met." +msgstr "" +"La fenêtre apparaissant lorsque vous cliquez sur la tuile liste les " +"différentes configurations matérielles requises par l’application, et " +"indique si l’une d’entre elles n’est pas satisfaite." + +#. (itstool) path: section/p +#: C/software-metadata.page:125 +msgid "You can improve the hardware information:" +msgstr "Vous pouvez améliorer les informations matérielles :" + +#. (itstool) path: item/p +#: C/software-metadata.page:128 +msgid "" +"How to add missing " +"hardware information" +msgstr "" +"Ajouter des " +"informations manquantes sur le matériel" + +#. (itstool) path: section/title +#: C/software-metadata.page:134 +msgid "Age rating" +msgstr "Limite d’âge" + +#. (itstool) path: section/p +#: C/software-metadata.page:135 +msgid "" +"Software displays an age rating tile on the details page for an " +"application. This shows what age range the application should be suitable " +"for, based on different kinds of content which the application has declared " +"it contains. This information is summarized in a format similar to the game " +"or film rating certificates for your country." +msgstr "" +"Logiciels affiche une tuile concernant l’évaluation par âge sur " +"la page de détails d’une application. Cette tuile montre la tranche d’âge " +"pour laquelle l’application est adaptée, à partir des différents types de " +"contenus que l’application a déclaré contenir. Cette information est résumée " +"dans un format similaire à celui utilisé pour la classification des films et " +"des jeux dans votre pays." + +#. (itstool) path: section/p +#: C/software-metadata.page:136 +msgid "" +"For example, this will highlight whether a game contains violence, or " +"whether an application contains in-app advertising." +msgstr "" +"Par exemple, cette tuile indiquera si un jeu contient de la violence, ou si " +"une application contient de la publicité intégrée." + +#. (itstool) path: section/p +#: C/software-metadata.page:137 +msgid "" +"The dialog which appears when the tile is clicked lists the different types " +"of content in the application and how severe that content is." +msgstr "" +"La fenêtre apparaissant lorsque vous cliquez sur la tuile liste les " +"différents types de contenu de l’application et leur degré de gravité." + +#. (itstool) path: section/p +#: C/software-metadata.page:138 +msgid "You can improve the age rating information:" +msgstr "Vous pouvez améliorer les informations de limite d’âge :" + +#. (itstool) path: item/p +#: C/software-metadata.page:141 +msgid "" +"How to add " +"missing content rating information" +msgstr "" +"Ajouter des " +"informations manquantes sur l’évaluation par âge" + +#. (itstool) path: section/title +#: C/software-metadata.page:147 +msgid "License" +msgstr "Licence" + +#. (itstool) path: section/p +#: C/software-metadata.page:150 +msgid "" +"Software displays a tile indicating whether an application is " +"free software or whether its license is " +"proprietary, special or unknown. This tile includes more detailed " +"information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" +"Logiciels affiche une tuile indiquant si une application est un " +"logiciel libre ou si elle utilise une " +"licence propriétaire spéciale ou inconnue. Cette tuile intègre des " +"informations plus détaillées sur la licence du projet. Elle liste également " +"certains des atouts d’un logiciel libre. En apprendre davantage." + +#. (itstool) path: section/p +#: C/software-metadata.page:151 +msgid "" +"Sometimes the license information isn’t correct for an application, and " +"hence an application which is actually free software will be shown as " +"‘proprietary’. Similarly, sometimes the license information is unknown." +msgstr "" +"Parfois, les informations de licence sont incorrectes, et une application " +"peut être affichée comme « propriétaire » alors qu’il s’agit en réalité d’un " +"logiciel libre. De la même façon, les informations de licence sont parfois " +"inconnues." + +#. (itstool) path: section/p +#: C/software-metadata.page:152 +msgid "" +"Software highlights free and open-source licenses in green, " +"proprietary and special licenses in yellow as shown here. Unknown licenses " +"are highlighted in grey." +msgstr "" +"Logiciels met en valeur les licences libres et open-source en " +"vert, les licences propriétaires et spéciales étant en jaune comme montré " +"ici. Les licences inconnues sont indiquées en gris." + +#. (itstool) path: section/p +#: C/software-metadata.page:153 +msgid "You can add or improve the license information:" +msgstr "Vous pouvez ajouter ou améliorer les informations de licence :" + +#. (itstool) path: item/p +#: C/software-metadata.page:156 +msgid "" +"How to fix " +"incorrect licensing information" +msgstr "" +"Corriger des " +"informations de licence incorrectes" + +#. (itstool) path: section/title +#: C/software-metadata.page:162 +msgid "Links" +msgstr "Liens" + +#. (itstool) path: section/p +#: C/software-metadata.page:164 +msgid "" +"Software displays a list of application resource links in the " +"link tile. They are as follows:" +msgstr "" +"Logiciels affiche une liste de liens vers des ressources de " +"l’application dans la tuile de liens, dont :" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Website link" +msgstr "Lien du site internet" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Donation link" +msgstr "Lien de don" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Translation contribution link" +msgstr "Lien de contribution à la traduction" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Bug reporting link" +msgstr "Lien de signalement des bogues" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Help link" +msgstr "Lien d’aide" + +#. (itstool) path: td/p +#: C/software-metadata.page:188 +msgid "Contact link" +msgstr "Lien de contact" + +#. (itstool) path: section/p +#: C/software-metadata.page:191 +msgid "" +"Some or all of these links may be present depending on whether they are " +"listed in the application’s metainfo file." +msgstr "" +"Tout ou partie de ces liens peuvent être présents, en fonction de leur " +"présence dans le fichier de métadonnées de l’application." + +#. (itstool) path: section/p +#: C/software-metadata.page:192 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the " +"following tile with a question mark will be displayed." +msgstr "" +"Dans les cas où le fichier de métadonnées de l’application ne contient aucun " +"lien, la tuile ci-contre avec un point d’interrogation sera affichée." + +#. (itstool) path: section/p +#: C/software-metadata.page:194 +msgid "You can improve the links:" +msgstr "Vous pouvez améliorer les liens :" + +#. (itstool) path: item/p +#: C/software-metadata.page:197 +msgid "" +"How to add missing links" +msgstr "" +"Ajouter des liens manquants" + +#. (itstool) path: section/title +#: C/software-metadata.page:203 +msgid "Carousel tile" +msgstr "Tuile de carrousel" + +#. (itstool) path: section/p +#: C/software-metadata.page:205 +msgid "" +"Applications which are featured by Software are displayed in a " +"carousel at the top of the main window as shown here. Each carousel tile has " +"a background color which is automatically extracted from the application’s " +"icon. Sometimes this background color is not quite right for the application " +"and needs to be specified explicitly by the application developer." +msgstr "" +"Les applications mises en avant par Logiciels sont affichées dans " +"un carrousel en haut de la fenêtre principale, comme indiqué ici. La couleur " +"d’arrière-plan de chaque tuile est extraite automatiquement à partir de " +"l’icône de l’application. Parfois, cet arrière-plan ne correspond pas tout à " +"fait à l’application et doit être spécifié explicitement par les " +"développeurs de l’application." + +#. (itstool) path: section/p +#: C/software-metadata.page:206 +msgid "" +"The set of applications which are featured is decided by the Linux " +"distribution maintainers." +msgstr "" +"La mise en avant des applications est décidée par les responsables de la " +"distribution Linux." + +#. (itstool) path: section/p +#: C/software-metadata.page:207 +msgid "You can improve the carousel tile:" +msgstr "Vous pouvez améliorer la tuile de carrousel :" + +#. (itstool) path: item/p +#: C/software-metadata.page:210 +msgid "" +"How to set " +"the carousel tile background color" +msgstr "" +"Modifier " +"modifier la couleur d’arrière-plan de la tuile de carrousel" + +#. (itstool) path: section/title +#: C/software-metadata.page:216 +msgid "Where metadata comes from" +msgstr "Origine des métadonnées" + +#. (itstool) path: section/p +#: C/software-metadata.page:217 +msgid "" +"The metadata used to specify what hardware a piece of software requires, " +"what ages of user it is suitable for, and factors which contribute to how " +"safe it might be to install, all come from the metainfo file for that " +"software." +msgstr "" +"Les métadonnées viennent toutes du fichier de métadonnées du logiciel " +"concerné, que ce soit pour décrire les équipements matériels requis, pour " +"l’âge le plus adapté pour un utilisateur, ou pour connaître les facteurs " +"permettant de déterminer si l’application est sûre à installer." + +#. (itstool) path: section/p +#: C/software-metadata.page:218 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream " +"specification." +msgstr "" +"Le fichier de métadonnées est un fichier XML. Son format est décrit dans la " +"spécification AppStream." + +#. (itstool) path: section/p +#: C/software-metadata.page:219 +msgid "" +"See the metainfo file for GNOME Files " +"app." +msgstr "" +"Aller voir le fichier de métadonnées " +"pour l’application Fichiers de GNOME." + +#. (itstool) path: note/p +#: C/software-metadata.page:221 +msgid "appdata is the older term for metainfo." +msgstr "appdata est le plus ancien terme de métadonnées." + +#. (itstool) path: section/title +#: C/software-metadata.page:226 +msgid "What happens if metadata is missing" +msgstr "Conséquence d’un manque de métadonnées" + +#. (itstool) path: section/p +#: C/software-metadata.page:227 +msgid "" +"If some metadata is missing for an application, Software can only " +"guess what it might be, and hence can’t present much information in its " +"interfaces. The guesses Software makes are based on the fact that " +"most software is designed for desktop computers." +msgstr "" +"Si une partie des métadonnées manquent pour une application, Logiciels peut seulement essayer de les deviner, et ne peut donc pas afficher " +"beaucoup d’information sur son interface. Les suppositions faites par " +"Logiciels partent du principe que la plupart des logiciels sont " +"conçus pour des ordinateurs de bureau." + +#. (itstool) path: section/p +#: C/software-metadata.page:228 +msgid "" +"You can help improve the metadata for an application!" +msgstr "" +"Vous pouvez améliorer les métadonnées d’une " +"application !" + +#. (itstool) path: section/title +#: C/software-metadata.page:232 +msgid "How to contribute missing information" +msgstr "Contribuer à des informations manquantes" + +#. (itstool) path: section/p +#: C/software-metadata.page:233 +msgid "" +"If you find that an app’s page is missing information or has incorrect " +"information, you can contribute in one of the two ways:" +msgstr "" +"Si vous pensez qu’une page d’application a des informations manquantes ou " +"incorrectes, vous pouvez contribuer de deux façons :" + +#. (itstool) path: item/p +#: C/software-metadata.page:236 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug " +"tracker, so the app developer can fix it." +msgstr "" +"Signaler les métadonnées manquantes ou incorrectes dans l’outil de suivi des " +"bogues de l’application, pour que le développeur puisse corriger le problème." + +#. (itstool) path: item/p +#: C/software-metadata.page:239 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How to guide below on how to do that." +msgstr "" +"Corriger les métadonnées manquantes ou incorrectes vous-même. Référez-vous " +"au guide ci-dessous pour savoir comment procéder." + +#. (itstool) path: section/p +#: C/software-metadata.page:243 +msgid "" +"For both, you first need to find the app’s project page. The link to the " +"project page should typically be available in the app’s page as shown here. If not, you will need to find it with " +"a simple search on Google." +msgstr "" +"Pour chacune, vous devez d’abord trouver la page du projet de l’application. " +"Le lien vers la page du projet devrait généralement être disponible sur la " +"page de l’application comme montré ici. Si ce " +"n’est pas le cas, vous devrez la trouver avec une recherche sur internet." + +#. (itstool) path: section/p +#: C/software-metadata.page:245 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" +"Les applications sont généralement hébergées sur GitLab ou GitHub. Par exemple, les applications GNOME sont " +"hébergées sur gitlab.gnome.org." + +#. (itstool) path: section/title +#: C/software-metadata.page:249 +msgid "How to add missing app screenshots" +msgstr "Ajouter des captures d’écran d’application manquantes" + +#. (itstool) path: section/p +#: C/software-metadata.page:250 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s <component> in its " +"metainfo file." +msgstr "" +"Les informations de capture d’écran d’une application sont stockées dans " +"l’élément <" +"screenshots> à l’intérieur de <component> dans le fichier de métadonnées de l’application." + +#. (itstool) path: section/p +#: C/software-metadata.page:251 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots " +"should ideally be in the PNG format with 16:9 aspect ratio and minimum width " +"of 620 pixels." +msgstr "" +"Il est recommandé d’avoir entre 5 et 10 captures d’écran pour une " +"application. Idéalement, les captures doivent être au format PNG avec un " +"ratio 16:9 et une largeur minimale de 620 pixels." + +#. (itstool) path: section/p +#: C/software-metadata.page:252 +msgid "" +"For example, here are the screenshot entries for the Software app:" +msgstr "" +"Voici par exemple les captures d’écran pour l’application Logiciels :" + +#. (itstool) path: section/code +#: C/software-metadata.page:253 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Panneau de vue d’ensemble</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Panneau des descriptions</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:267 +msgid "How to fix incorrect safety and permissions information" +msgstr "Corriger des informations incorrectes de sécurité et d’autorisations" + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"The safety and permissions information for an application comes from " +"different sources depending on how the application is packaged. For " +"traditionally packaged applications, for example in RPM or DEB format, there " +"is no safety or permissions information available and nothing can be done to " +"add it to an application." +msgstr "" +"Les informations de sécurité et d’autorisation pour une application " +"proviennent de différentes sources, en fonction du format de paquet " +"l’application. Pour les formats de paquet traditionnels, par exemple RPM ou " +"DEB, il n’y a aucune information de sécurité ou d’autorisation disponible, " +"et rien ne peut être fait pour en ajouter à une application." + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, specifying what holes in the sandbox the application requires. Each " +"of these holes typically contributes to lowering the displayed safety level " +"of the application in Software — moving it from ‘safe’ to " +"‘potentially unsafe’ to ‘unsafe’." +msgstr "" +"Pour les applications flatpak, les informations proviennent du manifeste " +"flatpakde l’application, qui décrit les portails ouverts requis par " +"l’application dans son environnement isolé. Chacun de ces portails contribue " +"généralement à diminuer le niveau de sécurité affiché dans Logiciels — le faisant passer de « fiable » à « potentiellement non fiable » à " +"« non fiable »." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 +msgid "" +"In order to improve the safety level of an application, its sandboxing must " +"be made as tight as possible, by removing sandbox permissions where " +"they’re not needed, and using portals instead of sandbox " +"permissions where possible. Use of portals does not lower the displayed " +"safety level of an application in Software." +msgstr "" +"Afin d’améliorer le niveau de sécurité d’une application, son mode bac à " +"sable doit être aussi restreint que possible, en enlevant les autorisations bac à sable non nécessaires et en utilisant les " +"portailsà la place des autorisations lorsque c’est " +"possible. L’utilisation de portails ne diminuent pas le niveau de sécurité " +"d’une application affiché dans Logiciels." + +#. (itstool) path: section/p +#: C/software-metadata.page:271 +msgid "" +"For example, if the application requests read/write access to the full file " +"system (--filesystem=host), does it actually need that, or does " +"it only need to access files in a few specific locations? If so, the file portal could be used, or more specific file system permissions could be specified." +msgstr "" +"Par exemple, si une application demande un accès en lecture et écriture sur " +"l’ensemble du système de fichiers (--filesystem=host), en a-" +"t’elle vraiment besoin ? Un accès aux fichiers de certains emplacements ne " +"serait-il pas suffisant ? Si oui, le portail fichier pourrait " +"être utilisé, ou des autorisations du système de fichiers pourraient être spécifiés." + +#. (itstool) path: section/p +#: C/software-metadata.page:272 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a " +"fallback, without using special X11 features, could it use --" +"socket=fallback-x11 rather than --socket=x11?" +msgstr "" +"Si l’application fonctionne sous Wayland, et n’a besoin de travailler sous " +"X11 qu’en solution de repli, sans utiliser de fonctionnalités X11 " +"spécifiques, pourrait-elle utiliser --socket=fallback-x11 " +"plutôt que --socket=x11 ?" + +#. (itstool) path: section/p +#: C/software-metadata.page:273 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be " +"added here in future." +msgstr "" +"Des conseils sur des autorisations spécifiques, ou des formats de paquet, " +"pourraient être ajoutés ici dans le futur." + +#. (itstool) path: section/p +#: C/software-metadata.page:274 C/software-metadata.page:312 +msgid "Further reading:" +msgstr "Pour poursuivre la lecture :" + +#. (itstool) path: section/title +#: C/software-metadata.page:289 +msgid "How to add missing hardware information" +msgstr "Ajouter des informations manquantes sur le matériel" + +#. (itstool) path: section/p +#: C/software-metadata.page:290 +msgid "" +"The hardware information for an application is stored in the <requires>, <recommends>" +" and <supports> elements within the " +"application’s <component> in its metainfo file." +msgstr "" +"Les informations matérielles d’une application sont stockées dans les " +"éléments <requires>, <" +"recommends> et <supports> à l’intérieur " +"de <component> dans le fichier de métadonnées de " +"l’application." + +#. (itstool) path: section/p +#: C/software-metadata.page:291 +msgid "" +"Software understands the <" +"control> and <display_length> elements." +msgstr "" +"Logiciels sait interpréter les élements <control> et <display_length>." + +#. (itstool) path: section/p +#: C/software-metadata.page:292 +msgid "" +"See this blog post or " +"this blog post for examples of metadata." +msgstr "" +"Lire cet article de blog (en anglais) ou celui-ci " +"(en anglais) pour avoir des exemples de métadonnées." + +#. (itstool) path: section/title +#: C/software-metadata.page:296 +msgid "How to add missing content rating information" +msgstr "Ajouter des informations manquantes sur l’évaluation par âge" + +#. (itstool) path: section/p +#: C/software-metadata.page:297 +msgid "" +"The content rating information for an application is stored in the <content_rating> element " +"within the application’s <component> in its metainfo file." +msgstr "" +"Les informations d’évaluation par âge pour une application sont stockées " +"dans l’élément <content_rating> à l’intérieur de <component> dans le fichier " +"de métadonnées de l’application." + +#. (itstool) path: section/p +#: C/software-metadata.page:298 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If " +"the <content_rating> element is not specified, the " +"application’s content rating is unknown. If it’s specified but empty, the " +"application has no content which might be unsuitable for any audience." +msgstr "" +"Les applications doivent utiliser le standard OARS 1.1 pour remplir cet " +"élément. Si l’élément <content_rating> n’est pas indiqué, " +"l’évaluation par âge de l’application reste inconnue. Si l’élement est " +"indiqué mais vide, cela signifie que l’application ne contient aucun contenu " +"inapproprié." + +#. (itstool) path: section/p +#: C/software-metadata.page:299 +msgid "" +"Use the OARS generator " +"to produce suitable content rating information for an application." +msgstr "" +"Utiliser le générateur OARS pour produire une information d’évaluation par âge pour une " +"application." + +#. (itstool) path: section/title +#: C/software-metadata.page:303 +msgid "How to fix incorrect licensing information" +msgstr "Corriger des information de licence incorrectes" + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"The licensing information for an application is stored in the <project_license> " +"element within the application’s <component> in its " +"metainfo file." +msgstr "" +"Les informations de licence d’une application sont stockées dans l’élément " +"<project_license> à l’intérieur de <component> dans le fichier de " +"métadonnées de l’application." + +#. (itstool) path: section/p +#: C/software-metadata.page:305 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license " +"for the project. This should typically be the license of the code, and not " +"include the license of the documentation or ancillary content." +msgstr "" +"Le contenu pour cet élément doit être une expression SPDX décrivant la licence « principale » " +"du projet. Celle-ci correspond typiquement à la licence du code source, et " +"ne pas inclure la licence de la documentation ou de contenu annexe." + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of " +"multiple licenses, which are all FSF or OSI approved, the application is considered ‘free software’ " +"and the license tile says so. Otherwise, it’s considered ‘proprietary’." +msgstr "" +"Si l’expression SPDX correspond à une seule licence, ou une combinaison " +"« ou » de plusieurs licences, qui sont toutes approuvées par la FSF or l’OSI, alors l’application est " +"considérée comme « logiciel libre » et la tuile de licence l’indique. Sinon, " +"l’application est considérée « propriétaire »." + +#. (itstool) path: section/p +#: C/software-metadata.page:307 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it " +"shouldn’t be, it’s likely that the <project_license> " +"element includes the documentation license for the project. Remove it." +msgstr "" +"Si vous pensez qu’une application n’est pas « propriétaire » alors qu’elle " +"est affichée comme telle, c’est probablement car l’élément <" +"project_license> inclut la licence de documentation du projet. " +"Veuillez l’enlever." + +#. (itstool) path: section/p +#: C/software-metadata.page:308 +msgid "" +"For example, change the license metadata from:" +msgstr "" +"Par exemple, changez les métadonnées de licence de :" + +#. (itstool) path: section/code +#: C/software-metadata.page:309 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "<project_license>GPL-2.0+ et CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:310 +msgid "to" +msgstr "en" + +#. (itstool) path: section/code +#: C/software-metadata.page:311 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +#. (itstool) path: item/p +#: C/software-metadata.page:315 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" +"Éviter (la plupart du temps) d’indiquer la licence de " +"documentation dans appdata (en anglais)" + +#. (itstool) path: section/title +#: C/software-metadata.page:324 +msgid "How to add missing links" +msgstr "Ajouter des liens manquants" + +#. (itstool) path: section/p +#: C/software-metadata.page:325 +msgid "" +"The links for an application are stored as <url> elements within the application’s " +"<component> in its metainfo file." +msgstr "" +"Les liens d’une application sont stockés en tant qu’élement <url> à l’intérieur de <" +"component> dans le fichier de métadonnées de l’application." + +#. (itstool) path: section/p +#: C/software-metadata.page:326 +msgid "" +"Add as many of the link types documented in the appstream specification as are available for the application. " +"If no suitable page exists for a given link type, it doesn’t have to be " +"included." +msgstr "" +"Ajoutez autant de types de lien pour l’application que ceux documentés dans " +"la spécification appstream. S’il n’existe aucune " +"page correspondant à un type de lien, il n’a pas besoin d’être inclus." + +#. (itstool) path: section/p +#: C/software-metadata.page:327 +msgid "" +"For example, here are the resource links for the Software app:" +msgstr "" +"Par exemple, voci les liens de ressource pour l’application Logiciels :" + +#. (itstool) path: section/code +#: C/software-metadata.page:328 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:339 +msgid "How to set the carousel tile background color" +msgstr "Définir la couleur d’arrière-plan de la tuile du carrousel" + +#. (itstool) path: section/p +#: C/software-metadata.page:340 +msgid "" +"The carousel tile background color is normally extracted automatically from " +"the application’s icon. If that color is unsatisfactory, however, it can be " +"overridden by using the appstream’s <" +"branding/> element with declared colors (since 47.x " +"series). The advantage is that more clients can use the colors." +msgstr "" +"La couleur d’arrière-plan de la tuile du carrousel est habituellement " +"extraite automatiquement à partir de l’icône de l’application. Cependant, si " +"cette couleur n’est pas satisfaisante, elle peut être remplacée en utilisant " +"l’élément <branding/> " +"d’appstream avec les couleurs prédéfinies (depuis la série 47.x). " +"L’avantage est de permettre à davantage de clients d’utiliser les couleurs." + +#. (itstool) path: section/p +#: C/software-metadata.page:341 +msgid "For example, here are some branding entries:" +msgstr "Par exemple, voici quelques entrées de « branding » :" + +#. (itstool) path: section/code +#: C/software-metadata.page:342 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:348 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses the better color for the theme on its own." +msgstr "" +"Notez que l’attribut scheme_preference est ignoré, " +"Logiciels choisit elle-même la couleur la plus adaptée au thème." + +#. (itstool) path: section/p +#: C/software-metadata.page:350 +msgid "" +"There is left, for backward compatibility, the possibility to add the " +"following XML to the application’s metainfo <component> " +"element:" +msgstr "" +"Il est encore possible, pour des raisons de rétro-compatibilité, d’ajouter " +"les XML suivants à l’élément <component> des métadonnées " +"de l’application :" + +#. (itstool) path: section/code +#: C/software-metadata.page:351 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:355 +msgid "but the <branding/> element has a precedence." +msgstr "mais l’élément <branding/> a la priorité." + +#. (itstool) path: section/p +#: C/software-metadata.page:356 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format " +"GVariant with type a(yyy), and represents an unordered set of " +"key colors for the application. Each element of the set is a color in RGB " +"form ranging from (0, 0, 0) to (255, 255, 255)." +msgstr "" +"La valeur de GnomeSoftware::key-colors est une GVariant au " +"format texte avec le type a(yyy), et représente un ensemble non " +"ordonné de couleurs pour l’application. Chaque élément de l’ensemble est une " +"couleur au format RVB allant de (0, 0, 0) à (255, 255, " +"255)." + +#. (itstool) path: section/p +#: C/software-metadata.page:357 +msgid "Colors should be chosen so that they:" +msgstr "Les couleurs devraient être choisies pour :" + +#. (itstool) path: item/p +#: C/software-metadata.page:360 +msgid "" +"Are identifiable to the application, matching the application’s branding in " +"some way, if possible." +msgstr "" +"Être identifiable en correspondant à la charte graphique de l’application, " +"si possible." + +#. (itstool) path: item/p +#: C/software-metadata.page:363 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used " +"as a background behind it, the icon can be distinguished." +msgstr "" +"Contraster avec les bords de l’icône d’application, afin de pouvoir " +"distinguer l’icône si les couleurs sont utilisées en arrière-plan." + +#. (itstool) path: item/p +#: C/software-metadata.page:366 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and in its dark variant (#eeeeec). This generally means " +"choosing a color with a medium level of brightness." +msgstr "" +"Contraster avec la couleur de premier plan du texte dans le theme Adwaita " +"(#2e3436) et sa variant sombre (#eeeeec). Cela " +"signifie généralement choisir une couleur avec un niveau moyen de luminosité." + +#. (itstool) path: item/p +#: C/software-metadata.page:369 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" +"Le contraste peut être vérifié avec l’application Contraste." + +#. (itstool) path: section/p +#: C/software-metadata.page:372 +msgid "" +"At least one color should be specified. More can be specified if one color " +"can’t satisfy all the requirements above, and Software will " +"choose the most appropriate to use in the carousel tile. If exactly one " +"color is specified, its brightness and saturation may be modified to improve " +"contrast with the foreground color. If more than one color is specified, the " +"one with the best contrast with the foreground color will be chosen, and its " +"brightness and saturation will not be modified." +msgstr "" +"Au moins une couleur doit être définie. D’autres peuvent être définies si " +"une seule couleur ne permet pas de répondre aux contraintes ci-dessus, et " +"Logiciels choisira la couleur la plus appropriée pour la tuile de " +"carrousel. Si une seule couleur est définie, sa luminosité et sa saturation " +"peuvent être modifiées pour améliorer le contraste avec la couleur de " +"premier plan. Si plusieurs couleurs sont définies, celle avec le meilleur " +"contraste par rapport à la couleur de premier plan sera choisie, et sa " +"luminosité et saturation ne seront pas modifiées." + +#. (itstool) path: section/title +#: C/software-metadata.page:376 +msgid "How to test carousel tile background color changes" +msgstr "" +"Tester les modifications de couleur d’arrière-plan pour la tuile de carrousel" + +#. (itstool) path: section/p +#: C/software-metadata.page:377 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" +"Modifier le fichier de métadonnées pour votre application, puis exécuter " +"Logiciels avec :" + +#. (itstool) path: section/p +#: C/software-metadata.page:378 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml," +"icon=/path/to/app/icon.png" +msgstr "" +"gnome-software --show-metainfo=/chemin/vers/appli.metainfo.xml,icon=/chemin/vers/appli/icon.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:379 +msgid "" +"The details page for your application will be shown. If you navigate back to " +"the overview page of Software, your application will be the only " +"one in the ‘featured’ carousel." +msgstr "" +"La page détaillée de votre application sera affichée. Si vous revenez sur la " +"page d’accueil de Logiciels, votre application sera la seule dans " +"le carrousel de « mise en avant »." diff --git a/help/hu/figures/app-context-bar.png b/help/hu/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..846a4683b07d19e561327902724916461155413d GIT binary patch literal 27297 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 literal 0 HcmV?d00001 diff --git a/help/hu/hu.po b/help/hu/hu.po new file mode 100644 index 0000000..00e8e53 --- /dev/null +++ b/help/hu/hu.po @@ -0,0 +1,1533 @@ +# Hungarian translation for gnome-software. +# Copyright (C) 2024 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-software package. +# +# Balázs Úr , 2024. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2024-09-13 18:56+0000\n" +"PO-Revision-Date: 2024-09-16 01:11+0200\n" +"Last-Translator: Balázs Úr \n" +"Language-Team: Hungarian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 23.08.4\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Úr Balázs , 2024." + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Phaedrus Leeds" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Hogyan telepíthet újra egy webalkalmazást" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "" +"A Szoftver kétféle típusú webalkalmazás kezelését támogatja:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See README.md." +msgstr "" +"Olyan webalkalmazások, amelyekhez AppStream metainformációk lettek szállítva " +"a Szoftver alkalmazással. Nézze meg a README.md " +"fájlt." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" +"Olyan webalkalmazások, amelyek a GNOME Web használatával lettek telepítve." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software " +"(when this functionality has been enabled by the distribution), whereas the " +"second type only show up in Software after they have been " +"installed via GNOME Web. If you uninstall such an app and want to reinstall " +"it, you must do so using GNOME Web." +msgstr "" +"Az első típus a Szoftver alkalmazásban telepítésre elérhetőként " +"jelenik meg (ha ezt a funkciót a disztribúció engedélyezte), míg a második " +"típus csak akkor jelenik meg a Szoftver alkalmazásban, miután a " +"GNOME Web segítségével telepítették azokat. Ha eltávolít egy ilyen " +"alkalmazást, és újra szeretné telepíteni, akkor ezt a GNOME Web " +"használatával kell megtennie." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "" +"A következő lépésekkel telepíthet webalkalmazást a GNOME Web használatával:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as " +"shown in the image below." +msgstr "" +"Kattintson az alkalmazás Menü gombjára a jobb " +"felső sarokban az alábbi képen látható módon." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This " +"should open the web app creation dialog." +msgstr "" +"Kattintson a Telepítés webalkalmazásként… " +"menüpontra. Ez megnyitja a webalkalmazás létrehozásának párbeszédablakát." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install " +"the web app." +msgstr "" +"Kattintson a Létrehozás gombra a webalkalmazás " +"létrehozásához és telepítéséhez." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" +"A webalkalmazásnak most már meg kell jelennie a Szoftver Telepített lapján." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Szoftver" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "Creative Commons Nevezd meg!–Így add tovább! 3.0 átíratlan licenc" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "Ez a mű a <_:link-1/> szerint licencelt." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Philip Withnall" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Bevezetés a szoftverlicencelésbe" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Szoftverlicencelés" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Bevezetés" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the " +"freedoms you as a user have. If an app is free/open source software (FOSS), you have the freedom to use it, copy it, study and change its source " +"code. Proprietary software does not provide you with those freedoms. FOSS " +"software is often available for no charge, but this is not always true." +msgstr "" +"Az alkalmazások lehetnek „szabad/nyílt forráskódú szoftverek” vagy " +"„tulajdonosi szoftverek”. Ez befolyásolja az Ön, mint felhasználó " +"szabadságát. Ha egy alkalmazás szabad/nyílt forráskódú szoftver (FOSS), akkor Ön " +"szabadon használhatja, másolhatja, tanulmányozhatja és módosíthatja a " +"forráskódját. A tulajdonosi szoftverek nem biztosítják Önnek ezeket a " +"szabadságokat. A FOSS szoftverek gyakran ingyenesen elérhetők, de ez nem " +"mindig igaz." + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get " +"involved in its development, contributing features or translations to their " +"language and fixing bugs which affect them. They can audit the code and " +"check that changes to the software are not malicious. They can learn from " +"the source code and use it as the basis for their own FOSS applications." +msgstr "" +"Mivel a FOSS-szoftverek forráskódja elérhető, a felhasználók részt vehetnek " +"a fejlesztésükben, hozzájárulhatnak a funkciókhoz vagy a saját nyelvükre " +"történő fordításokhoz, és kijavíthatják az őket érintő hibákat. " +"Felülvizsgálhatják a kódot, és ellenőrizhetik, hogy a szoftverben " +"végrehajtott változtatások nem rosszindulatúak-e. Tanulhatnak a " +"forráskódból, és azt saját FOSS-alkalmazásaik alapjául használhatják." + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a " +"public good." +msgstr "" +"A FOSS-alkalmazások közjavak." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that " +"the developers of the app have your best interests in mind, and no conflicts " +"of interest." +msgstr "" +"A tulajdonosi alkalmazásokat a felhasználók nem tudják felülvizsgálni, ezért " +"meg kell bíznia abban, hogy az alkalmazás fejlesztői az Ön érdekeit tartják " +"szem előtt, és nem állnak fenn érdekellentétek." + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS " +"over proprietary software." +msgstr "" +"Olvasson többet a FOSS tulajdonosi " +"szoftverekkel szembeni előnyeiről (angolul)." + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Will Thompson" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Milan Crha" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Hogyan használja a Szoftver a metaadatokat" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Szoftverek metaadatai" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Képernyőképek" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an " +"application. This typically should include screenshots of various windows / " +"dialogs of the application, so the user would get a quick grasp of the " +"application’s features, look and feel etc." +msgstr "" +"A Szoftver megjeleníti a képernyőképeket egy alkalmazás részletes " +"oldalán. Ennek jellemzően az alkalmazás különböző ablakainak vagy " +"párbeszédablakainak képernyőképeit kell tartalmaznia, hogy a felhasználó " +"gyorsan megismerhesse az alkalmazás funkcióit, megjelenését és egyebeket." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" +"Ha egynél több képernyőkép van az alkalmazás metainformációs fájljában, " +"akkor a Szoftver a képernyőképeket körhinta módon jeleníti meg." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any " +"screenshot, then a placeholder icon as below with No Screenshots will be displayed:" +msgstr "" +"Abban az esetben, ha az alkalmazás metainformációs fájlja nem tartalmaz " +"képernyőképet, akkor egy helykitöltő ikon jelenik meg az alábbi " +"Nincsenek képernyőképek szöveggel:" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "" +"Placeholder icon might look different if you're using a custom icon theme." +msgstr "A helykitöltő ikon másképp nézhet ki, ha egyéni ikontémát használ." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even " +"if Software shows screenshots for an app, it’s important to check " +"if these screenshots are up-to-date or outdated." +msgstr "" +"A képernyőképek elavulhatnak, ahogy az alkalmazás felhasználói felülete " +"változik. Tehát ha a Szoftver képernyőképeket jelenít meg egy " +"alkalmazáshoz, fontos ellenőrizni, hogy ezek a képernyőképek naprakészek-e " +"vagy elavultak." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "Javíthatja az alkalmazás képernyőképének információit:" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app " +"screenshots" +msgstr "" +"Hogyan adhat hozzá " +"hiányzó alkalmazás-képernyőképeket" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Alkalmazás környezetsávja" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the " +"details page for an application, which display the following details." +msgstr "" +"A Szoftver alkalmazásban az alkalmazás környezetsávja csempék " +"gyűjteménye az alkalmazás részletes oldalán, amelyek a következő részleteket " +"jelenítik meg." + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Tárhely" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Biztonság" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Hardvertámogatás" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Korhatár-besorolás" + +#. (itstool) path: section/p +#. Translators: Refer below steps to localize +#. 'figures/app-context-bar.png' image: 1. Run 'gnome-software +#. --details=org.gnome.Software.desktop' in console (as normal user). 2. +#. This should launch the Software app and automatically switch to +#. Software app's details page. 3. It may take some time if some +#. background tasks are running. Wait for the app's details page to load. +#. 4. Scroll down to take the screenshot of the app context bar. +#: C/software-metadata.page:78 +msgid "This shows the app context bar for the Software app:" +msgstr "" +"Ez az alkalmazás környezetsávját jeleníti meg a Szoftver " +"alkalmazáshoz:" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:79 +msgctxt "_" +msgid "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "" +"external ref='figures/app-context-bar.png' " +"md5='0d13bb801689359b370f80943baa5082'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:82 +msgid "" +"The tiles are displayed in the order listed above (starting with " +"Storage tile on the left)." +msgstr "" +"A csempék a fenti sorrendben jelennek meg (a Tárhely csempével " +"kezdve a bal oldalon)." + +#. (itstool) path: section/p +#: C/software-metadata.page:83 +msgid "Each tile is covered in detail below." +msgstr "Az alábbiakban az egyes csempék részletes ismertetése következik." + +#. (itstool) path: section/title +#: C/software-metadata.page:87 +msgid "Storage" +msgstr "Tárhely" + +#. (itstool) path: section/p +#: C/software-metadata.page:88 +msgid "" +"Software displays a storage tile on the details page for an " +"application. If the application is not installed, this displays the " +"estimated download size needed to install it. If the application is " +"installed, it displays the storage space used by the application." +msgstr "" +"A Szoftver egy tárhely csempét jelenít meg az alkalmazás " +"részletes oldalán. Ha az alkalmazás nincs telepítve, akkor megjeleníti a " +"telepítéséhez szükséges becsült letöltési méretet. Ha az alkalmazás " +"telepítve van, akkor az alkalmazás által használt tárhelyet jeleníti meg." + +#. (itstool) path: section/p +#: C/software-metadata.page:89 +msgid "" +"The sizes are calculated from data provided by the Software " +"backend (such as flatpak or an RPM), and are not specified in the metadata " +"provided by the application. There is nothing you can do to affect this tile " +"by editing an application’s metainfo file. It’s listed here for completeness." +msgstr "" +"A méretek a Szoftver háttérprogramja (például flatpak vagy RPM) " +"által szolgáltatott adatokból kerülnek kiszámításra, és nincsenek megadva az " +"alkalmazás által biztosított metaadatokban. Semmit sem lehet tenni, hogy egy " +"alkalmazás metainformációs fájljának szerkesztésével befolyásolni lehessen " +"ezt a csempét. Ez a teljesség kedvéért van itt feltüntetve." + +#. (itstool) path: section/title +#: C/software-metadata.page:93 +msgid "Safety" +msgstr "Biztonság" + +#. (itstool) path: section/p +#: C/software-metadata.page:94 +msgid "" +"Software displays a safety tile on the details page for an " +"application. This summarizes information about whether the app can be " +"considered safe to install and run, or whether caution may be required " +"before trusting it." +msgstr "" +"A Szoftver egy biztonság csempét jelenít meg az alkalmazás " +"részletes oldalán. Ez összefoglalja az arra vonatkozó információkat, hogy az " +"alkalmazás telepítése és futtatása biztonságosnak tekinthető-e, vagy " +"óvatosságra lehet-e szükség, mielőtt megbízik benne." + +#. (itstool) path: section/p +#: C/software-metadata.page:95 +msgid "" +"This tile combines information about the permissions which the app requests " +"when it runs (such as permission to read your files), with information about " +"how the app was developed. Free software applications, where the source code " +"is publicly readable, can be more secure than proprietary ones, as they can " +"be audited." +msgstr "" +"Ez a csempe egyesíti az alkalmazás által a futtatás során kért " +"jogosultságokra vonatkozó információkat (például jogosultság a fájlok " +"olvasásához), valamint az alkalmazás fejlesztésének módjára vonatkozó " +"információkat. A szabad szoftveralkalmazások, amelyeknél a forráskód " +"nyilvánosan olvasható, biztonságosabbak lehetnek, mint a tulajdonosi " +"szoftverek, mivel felülvizsgálhatók." + +#. (itstool) path: section/p +#: C/software-metadata.page:96 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"permissions the app requests, plus some information about its license and " +"runtime." +msgstr "" +"A csempére kattintva megjelenő párbeszédablak felsorolja az alkalmazás által " +"kért különböző jogosultságokat, valamint néhány információt a licencről és a " +"futtatókörnyezetről." + +#. (itstool) path: section/p +#: C/software-metadata.page:97 +msgid "You can improve the safety information:" +msgstr "Javíthatja a biztonsági információkat:" + +#. (itstool) path: item/p +#: C/software-metadata.page:100 +msgid "" +"How " +"to fix incorrect safety and permissions information" +msgstr "" +"Hogyan javíthatja a helytelen biztonsági és jogosultsági " +"információkat" + +#. (itstool) path: section/title +#: C/software-metadata.page:106 +msgid "Hardware support" +msgstr "Hardvertámogatás" + +#. (itstool) path: section/p +#: C/software-metadata.page:107 +msgid "" +"Software displays a hardware support tile on the details page for " +"an application. This combines information about the hardware requirements of " +"the application, and the hardware capabilities of the computer, with the aim " +"of highlighting incompatibilities or missing requirements — or to indicate " +"that the application should work correctly with no incompatibilities." +msgstr "" +"A Szoftver egy hardvertámogatás csempét jelenít meg az alkalmazás " +"részletes oldalán. Ez egyesíti az alkalmazás hardverkövetelményeire és a " +"számítógép hardveres képességeire vonatkozó információkat azzal a céllal, " +"hogy kiemelje az inkompatibilitásokat vagy a hiányzó követelményeket – vagy " +"jelezze, hogy az alkalmazásnak megfelelően kell működnie inkompatibilitás " +"nélkül." + +#. (itstool) path: section/p +#: C/software-metadata.page:116 +msgid "" +"The code looks at the following hardware. More may be supported in future." +msgstr "" +"A kód a következő hardvereket vizsgálja. A jövőben több is támogatott lehet." + +#. (itstool) path: item/p +#: C/software-metadata.page:118 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "Van-e vagy szükség van-e érintőtáblára, egérre vagy billentyűzetre" + +#. (itstool) path: item/p +#: C/software-metadata.page:119 +msgid "Whether a gamepad is needed" +msgstr "Szükség van-e játékvezérlőre" + +#. (itstool) path: item/p +#: C/software-metadata.page:120 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "A legkisebb és ajánlott kijelzőméret, amelyre az alkalmazás skálázható" + +#. (itstool) path: section/p +#: C/software-metadata.page:123 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, " +"as they are often left disconnected due to not being needed for normal " +"computer use." +msgstr "" +"Nem lehet megbízhatóan megállapítani, hogy egy játékvezérlő jelen van-e, mivel gyakran kihúzva maradnak, mert a normál számítógép-használathoz " +"nincs rájuk szükség." + +#. (itstool) path: section/p +#: C/software-metadata.page:124 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"hardware requirements of the app, and whether any of them are not met." +msgstr "" +"A csempére kattintva megjelenő párbeszédablak felsorolja az alkalmazás " +"különböző hardverkövetelményeit, és azt, hogy valamelyik nem teljesül-e." + +#. (itstool) path: section/p +#: C/software-metadata.page:125 +msgid "You can improve the hardware information:" +msgstr "Javíthatja a hardverinformációkat:" + +#. (itstool) path: item/p +#: C/software-metadata.page:128 +msgid "" +"How to add missing " +"hardware information" +msgstr "" +"Hogyan adhat hozzá " +"hiányzó hardverinformációkat" + +#. (itstool) path: section/title +#: C/software-metadata.page:134 +msgid "Age rating" +msgstr "Korhatár-besorolás" + +#. (itstool) path: section/p +#: C/software-metadata.page:135 +msgid "" +"Software displays an age rating tile on the details page for an " +"application. This shows what age range the application should be suitable " +"for, based on different kinds of content which the application has declared " +"it contains. This information is summarized in a format similar to the game " +"or film rating certificates for your country." +msgstr "" +"A Szoftver egy korhatár-besorolás csempét jelenít meg az " +"alkalmazás részletes oldalán. Ez megmutatja, hogy az alkalmazás milyen " +"korosztály számára megfelelő az alkalmazás által deklarált különböző típusú " +"tartalmak alapján. Ez az információ az Ön országa játék- vagy filmminősítő " +"tanúsítványaihoz hasonló formátumban kerül összefoglalásra." + +#. (itstool) path: section/p +#: C/software-metadata.page:136 +msgid "" +"For example, this will highlight whether a game contains violence, or " +"whether an application contains in-app advertising." +msgstr "" +"Ez például kiemeli, hogy egy játék tartalmaz-e erőszakot, vagy hogy egy " +"alkalmazás tartalmaz-e alkalmazáson belüli reklámot." + +#. (itstool) path: section/p +#: C/software-metadata.page:137 +msgid "" +"The dialog which appears when the tile is clicked lists the different types " +"of content in the application and how severe that content is." +msgstr "" +"A csempére kattintva megjelenő párbeszédablak felsorolja az alkalmazásban " +"lévő különböző típusú tartalmakat és az adott tartalom súlyosságát." + +#. (itstool) path: section/p +#: C/software-metadata.page:138 +msgid "You can improve the age rating information:" +msgstr "Javíthatja a korhatár-besorolási információkat:" + +#. (itstool) path: item/p +#: C/software-metadata.page:141 +msgid "" +"How to add " +"missing content rating information" +msgstr "" +"Hogyan adhat " +"hozzá hiányzó tartalomértékelési információkat" + +#. (itstool) path: section/title +#: C/software-metadata.page:147 +msgid "License" +msgstr "Licenc" + +#. (itstool) path: section/p +#: C/software-metadata.page:150 +msgid "" +"Software displays a tile indicating whether an application is " +"free software or whether its license is " +"proprietary, special or unknown. This tile includes more detailed " +"information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" +"A Szoftver egy olyan csempét jelenít meg, amely jelzi, hogy az " +"alkalmazás szabad szoftver, vagy a licence tulajdonosi, " +"különleges vagy ismeretlen. Ez a csempe részletesebb információkat tartalmaz " +"a projekt licencéről. Ez a csempe felsorolja az ingyenes szoftverek néhány " +"előnyét is. Tudjon meg " +"többet" + +#. (itstool) path: section/p +#: C/software-metadata.page:151 +msgid "" +"Sometimes the license information isn’t correct for an application, and " +"hence an application which is actually free software will be shown as " +"‘proprietary’. Similarly, sometimes the license information is unknown." +msgstr "" +"Néha a licencinformációk nem megfelelőek egy alkalmazásnál, és így egy " +"valójában szabad szoftverként ismert alkalmazás „tulajdonosiként” jelenik " +"meg. Hasonlóképpen, néha a licencinformációk ismeretlenek." + +#. (itstool) path: section/p +#: C/software-metadata.page:152 +msgid "" +"Software highlights free and open-source licenses in green, " +"proprietary and special licenses in yellow as shown here. Unknown licenses " +"are highlighted in grey." +msgstr "" +"A Szoftver zöld színnel emeli ki az ingyenes és nyílt forráskódú " +"licenceket, sárgával pedig a tulajdonosi és különleges licenceket, ahogy itt " +"látható. Az ismeretlen licencek szürkével vannak kiemelve." + +#. (itstool) path: section/p +#: C/software-metadata.page:153 +msgid "You can add or improve the license information:" +msgstr "Hozzáadhatja vagy javíthatja a licencinformációkat:" + +#. (itstool) path: item/p +#: C/software-metadata.page:156 +msgid "" +"How to fix " +"incorrect licensing information" +msgstr "" +"Hogyan javíthatja " +"a helytelen licencelési információkat" + +#. (itstool) path: section/title +#: C/software-metadata.page:162 +msgid "Links" +msgstr "Hivatkozások" + +#. (itstool) path: section/p +#: C/software-metadata.page:164 +msgid "" +"Software displays a list of application resource links in the " +"link tile. They are as follows:" +msgstr "" +"A Szoftver megjeleníti az alkalmazás erőforrás-hivatkozásait a " +"hivatkozás csempén. Ezek a következők:" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Website link" +msgstr "Webhely hivatkozása" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Donation link" +msgstr "Adományozás hivatkozása" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Translation contribution link" +msgstr "Fordítási közreműködés hivatkozása" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Bug reporting link" +msgstr "Hibajelentés hivatkozása" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Help link" +msgstr "Súgó hivatkozása" + +#. (itstool) path: td/p +#: C/software-metadata.page:188 +msgid "Contact link" +msgstr "Kapcsolatfelvétel hivatkozása" + +#. (itstool) path: section/p +#: C/software-metadata.page:191 +msgid "" +"Some or all of these links may be present depending on whether they are " +"listed in the application’s metainfo file." +msgstr "" +"Ezen hivatkozások némelyike vagy mindegyike jelen lehet attól függően, hogy " +"szerepelnek-e az alkalmazás metainformációs fájljában." + +#. (itstool) path: section/p +#: C/software-metadata.page:192 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the " +"following tile with a question mark will be displayed." +msgstr "" +"Abban az esetben, ha az alkalmazás metainformációs fájlja nem tartalmaz " +"semmilyen hivatkozást, a következő kérdőjellel ellátott csempe jelenik meg." + +#. (itstool) path: section/p +#: C/software-metadata.page:194 +msgid "You can improve the links:" +msgstr "Javíthatja a hivatkozásokat:" + +#. (itstool) path: item/p +#: C/software-metadata.page:197 +msgid "" +"How to add missing links" +msgstr "" +"Hogyan adhat hozzá hiányzó " +"hivatkozásokat" + +#. (itstool) path: section/title +#: C/software-metadata.page:203 +msgid "Carousel tile" +msgstr "Körhinta csempe" + +#. (itstool) path: section/p +#: C/software-metadata.page:205 +msgid "" +"Applications which are featured by Software are displayed in a " +"carousel at the top of the main window as shown here. Each carousel tile has " +"a background color which is automatically extracted from the application’s " +"icon. Sometimes this background color is not quite right for the application " +"and needs to be specified explicitly by the application developer." +msgstr "" +"A Szoftver által kiemelt alkalmazások a főablak tetején lévő " +"körhintában jelennek meg, ahogy itt látható. Minden egyes körhinta csempének " +"olyan háttérszíne van, amely az alkalmazás ikonjából kerül automatikusan " +"kinyerésre. Néha ez a háttérszín nem teljesen megfelelő az alkalmazáshoz, és " +"az alkalmazás fejlesztőjének kell kifejezetten megadnia." + +#. (itstool) path: section/p +#: C/software-metadata.page:206 +msgid "" +"The set of applications which are featured is decided by the Linux " +"distribution maintainers." +msgstr "" +"A kiemelt alkalmazások halmazát a Linux disztribúció karbantartói határozzák " +"meg." + +#. (itstool) path: section/p +#: C/software-metadata.page:207 +msgid "You can improve the carousel tile:" +msgstr "Javíthatja a körhinta csempét:" + +#. (itstool) path: item/p +#: C/software-metadata.page:210 +msgid "" +"How to set " +"the carousel tile background color" +msgstr "" +"Hogyan " +"állíthatja be a körhinta csempe háttérszínét" + +#. (itstool) path: section/title +#: C/software-metadata.page:216 +msgid "Where metadata comes from" +msgstr "Honnan származnak a metaadatok" + +#. (itstool) path: section/p +#: C/software-metadata.page:217 +msgid "" +"The metadata used to specify what hardware a piece of software requires, " +"what ages of user it is suitable for, and factors which contribute to how " +"safe it might be to install, all come from the metainfo file for that " +"software." +msgstr "" +"A metaadatok, amelyekkel meghatározható, hogy egy szoftver milyen hardvert " +"igényel, milyen korú felhasználók számára alkalmas, és azok a tényezők, " +"amelyek hozzájárulnak ahhoz, hogy mennyire biztonságos a telepítése, mind az " +"adott szoftver metainformációs fájljából származnak." + +#. (itstool) path: section/p +#: C/software-metadata.page:218 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream " +"specification." +msgstr "" +"A metainformációs fájl egy XML-fájl. A fájl formátuma az AppStream " +"specifikációban van megadva." + +#. (itstool) path: section/p +#: C/software-metadata.page:219 +msgid "" +"See the metainfo file for GNOME Files " +"app." +msgstr "" +"Nézze meg a GNOME Fájlok alkalmazás " +"metainformációs fájlját." + +#. (itstool) path: note/p +#: C/software-metadata.page:221 +msgid "appdata is the older term for metainfo." +msgstr "Az appdata a metainfo régebbi elnevezése." + +#. (itstool) path: section/title +#: C/software-metadata.page:226 +msgid "What happens if metadata is missing" +msgstr "Mi történik, ha a metaadatok hiányoznak" + +#. (itstool) path: section/p +#: C/software-metadata.page:227 +msgid "" +"If some metadata is missing for an application, Software can only " +"guess what it might be, and hence can’t present much information in its " +"interfaces. The guesses Software makes are based on the fact that " +"most software is designed for desktop computers." +msgstr "" +"Ha a metaadatok hiányoznak egy alkalmazásnál, akkor a Szoftver " +"csak találgatni tudja, hogy mi lehet az, és ezért nem sok információt tud " +"megjeleníteni a felületein. A Szoftver találgatásai azon a tényen " +"alapulnak, hogy a legtöbb szoftvert asztali számítógépekre tervezik." + +#. (itstool) path: section/p +#: C/software-metadata.page:228 +msgid "" +"You can help improve the metadata for an application!" +msgstr "" +"Segíthet egy alkalmazás metaadatainak javításában!" + +#. (itstool) path: section/title +#: C/software-metadata.page:232 +msgid "How to contribute missing information" +msgstr "Hogyan adhat hozzá hiányzó információkat" + +#. (itstool) path: section/p +#: C/software-metadata.page:233 +msgid "" +"If you find that an app’s page is missing information or has incorrect " +"information, you can contribute in one of the two ways:" +msgstr "" +"Ha úgy találja, hogy egy alkalmazás oldaláról hiányoznak vagy helytelenek az " +"információk, akkor kétféleképpen járulhat hozzá:" + +#. (itstool) path: item/p +#: C/software-metadata.page:236 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug " +"tracker, so the app developer can fix it." +msgstr "" +"Jelentheti a hiányzó vagy helytelen metaadatokat az adott alkalmazás " +"hibakövetőjében, hogy az alkalmazás fejlesztője javíthassa azokat." + +#. (itstool) path: item/p +#: C/software-metadata.page:239 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How to guide below on how to do that." +msgstr "" +"A hiányzó vagy helytelen metaadatokat saját maga is kijavíthatja. Nézze meg " +"az alábbi hogyan útmutatót, hogy hogyan kell ezt " +"megtenni." + +#. (itstool) path: section/p +#: C/software-metadata.page:243 +msgid "" +"For both, you first need to find the app’s project page. The link to the " +"project page should typically be available in the app’s page as shown here. If not, you will need to find it with " +"a simple search on Google." +msgstr "" +"Mindkettőhöz először meg kell találnia az alkalmazás projektoldalát. A " +"projektoldalra mutató hivatkozásnak általában az alkalmazás oldalán " +"elérhetőnek kell lennie, ahogy itt látható. Ha " +"nem, akkor egy egyszerű kereséssel kell megtalálnia az interneten." + +#. (itstool) path: section/p +#: C/software-metadata.page:245 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" +"Az alkalmazások tárhelyét jellemzően a GitLab vagy a GitHub biztosítja. Például a GNOME alkalmazások " +"tárhelye a gitlab.gnome.org címen érhető el." + +#. (itstool) path: section/title +#: C/software-metadata.page:249 +msgid "How to add missing app screenshots" +msgstr "Hogyan adhat hozzá hiányzó alkalmazás-képernyőképeket" + +#. (itstool) path: section/p +#: C/software-metadata.page:250 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s <component> in its " +"metainfo file." +msgstr "" +"Egy alkalmazás képernyőkép-információi a metainformációs fájljában lévő " +"<screenshots> elemben vannak tárolva az alkalmazás <component> elemén belül." + +#. (itstool) path: section/p +#: C/software-metadata.page:251 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots " +"should ideally be in the PNG format with 16:9 aspect ratio and minimum width " +"of 620 pixels." +msgstr "" +"Egy alkalmazáshoz ajánlott képernyőképek száma 5-10 között van. A " +"képernyőképeknek ideális esetben PNG formátumúnak kell lenniük 16:9 " +"képaránnyal és legalább 620 képpont szélességgel." + +#. (itstool) path: section/p +#: C/software-metadata.page:252 +msgid "" +"For example, here are the screenshot entries for the Software app:" +msgstr "" +"Itt vannak például a Szoftver alkalmazás képernyőkép-bejegyzései:" + +#. (itstool) path: section/code +#: C/software-metadata.page:253 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:267 +msgid "How to fix incorrect safety and permissions information" +msgstr "Hogyan javíthatja a helytelen biztonsági és jogosultsági információkat" + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"The safety and permissions information for an application comes from " +"different sources depending on how the application is packaged. For " +"traditionally packaged applications, for example in RPM or DEB format, there " +"is no safety or permissions information available and nothing can be done to " +"add it to an application." +msgstr "" +"Egy alkalmazás biztonsági és jogosultsági információi különböző forrásokból " +"származnak, attól függően, hogy az alkalmazás hogyan van csomagolva. A " +"hagyományosan csomagolt alkalmazások esetében, például az RPM vagy DEB " +"formátumban lévőknél nem érhetők el biztonsági vagy jogosultsági " +"információk, és semmit sem lehet tenni, hogy ezek hozzáadásra kerüljenek egy " +"alkalmazáshoz." + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, specifying what holes in the sandbox the application requires. Each " +"of these holes typically contributes to lowering the displayed safety level " +"of the application in Software — moving it from ‘safe’ to " +"‘potentially unsafe’ to ‘unsafe’." +msgstr "" +"A flatpak-alkalmazások esetében az információk az alkalmazás flatpak manifest fájljából származnak, amely meghatározza, hogy az alkalmazásnak milyen " +"lyukakra van szüksége a védett környezetben. Ezen lyukak mindegyike " +"jellemzően hozzájárul az alkalmazásnak a Szoftver alkalmazásban " +"megjelenített biztonsági szintje csökkentéséhez – a „biztonságos” " +"besorolástól a „potenciálisan nem biztonságos” besoroláson keresztül a „nem " +"biztonságos” besorolásig." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 +msgid "" +"In order to improve the safety level of an application, its sandboxing must " +"be made as tight as possible, by removing sandbox permissions where " +"they’re not needed, and using portals instead of sandbox " +"permissions where possible. Use of portals does not lower the displayed " +"safety level of an application in Software." +msgstr "" +"Egy alkalmazás biztonsági szintjének javítása érdekében a védett környezetét " +"a lehető legszigorúbbá kell tenni, eltávolítva a védett környezet " +"engedélyeit ott, ahol nincs rájuk szükség, és portálokat kell használni a védett környezet engedélyei helyett, ahol ez " +"lehetséges. A portálok használata nem csökkenti egy alkalmazás megjelenített " +"biztonsági szintjét a Szoftver alkalmazásban." + +#. (itstool) path: section/p +#: C/software-metadata.page:271 +msgid "" +"For example, if the application requests read/write access to the full file " +"system (--filesystem=host), does it actually need that, or does " +"it only need to access files in a few specific locations? If so, the file portal could be used, or more specific file system permissions could be specified." +msgstr "" +"Ha például az alkalmazás írási és olvasási hozzáférést kér a teljes " +"fájlrendszerhez (--filesystem=host), akkor valóban szüksége van " +"erre, vagy csak néhány meghatározott helyen lévő fájlhoz kell hozzáférnie? " +"Ha ez a helyzet, akkor a fájlportál is használható, vagy a " +"specifikusabb fájlrendszer-jogosultságok is " +"megadhatók." + +#. (itstool) path: section/p +#: C/software-metadata.page:272 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a " +"fallback, without using special X11 features, could it use --" +"socket=fallback-x11 rather than --socket=x11?" +msgstr "" +"Ha az alkalmazás Waylanden működik, és csak tartalékként kell működnie az " +"X11-en, anélkül hogy különleges X11-funkciókat használna, használhatná a " +"--socket=fallback-x11 kapcsolót a --socket=x11 " +"helyett?" + +#. (itstool) path: section/p +#: C/software-metadata.page:273 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be " +"added here in future." +msgstr "" +"A jövőben bizonyos jogosultságokra vagy más csomagolási formátumokra " +"vonatkozó útmutatások kerülhetnek ide." + +#. (itstool) path: section/p +#: C/software-metadata.page:274 C/software-metadata.page:312 +msgid "Further reading:" +msgstr "További olvasnivaló:" + +#. (itstool) path: section/title +#: C/software-metadata.page:289 +msgid "How to add missing hardware information" +msgstr "Hogyan adhat hozzá hiányzó hardverinformációkat" + +#. (itstool) path: section/p +#: C/software-metadata.page:290 +msgid "" +"The hardware information for an application is stored in the <requires>, <recommends>" +" and <supports> elements within the " +"application’s <component> in its metainfo file." +msgstr "" +"Egy alkalmazás hardverinformációi a metainformációs fájljában lévő <requires>, <recommends>" +" és <supports> elemekben vannak tárolva az " +"alkalmazás <component> elemén belül." + +#. (itstool) path: section/p +#: C/software-metadata.page:291 +msgid "" +"Software understands the <" +"control> and <display_length> elements." +msgstr "" +"A Szoftver megérti a <" +"control> és a <display_length> elemeket." + +#. (itstool) path: section/p +#: C/software-metadata.page:292 +msgid "" +"See this blog post or " +"this blog post for examples of metadata." +msgstr "" +"Metaadatok példájáért nézze meg ezt a blogbejegyzést vagy ezt a " +"blogbejegyzést." + +#. (itstool) path: section/title +#: C/software-metadata.page:296 +msgid "How to add missing content rating information" +msgstr "Hogyan adhat hozzá hiányzó tartalomértékelési információkat" + +#. (itstool) path: section/p +#: C/software-metadata.page:297 +msgid "" +"The content rating information for an application is stored in the <content_rating> element " +"within the application’s <component> in its metainfo file." +msgstr "" +"Egy alkalmazás tartalomértékelési információi a metainformációs fájljában " +"lévő <content_rating> elemben vannak tárolva az alkalmazás <component> " +"elemén belül." + +#. (itstool) path: section/p +#: C/software-metadata.page:298 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If " +"the <content_rating> element is not specified, the " +"application’s content rating is unknown. If it’s specified but empty, the " +"application has no content which might be unsuitable for any audience." +msgstr "" +"Az alkalmazásoknak az OARS 1.1 szabványt kell használniuk ennek az elemnek a " +"kitöltéséhez. Ha a <content_rating> elem nincs megadva, " +"akkor az alkalmazás tartalombesorolása ismeretlen. Ha meg van adva, de üres, " +"akkor az alkalmazásnak nincs olyan tartalma, amely bármely közönség számára " +"alkalmatlan lehet." + +#. (itstool) path: section/p +#: C/software-metadata.page:299 +msgid "" +"Use the OARS generator " +"to produce suitable content rating information for an application." +msgstr "" +"Használja az OARS előállítót az alkalmazáshoz megfelelő tartalombesorolási információk " +"előállításához." + +#. (itstool) path: section/title +#: C/software-metadata.page:303 +msgid "How to fix incorrect licensing information" +msgstr "Hogyan javíthatja a helytelen licencelési információkat" + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"The licensing information for an application is stored in the <project_license> " +"element within the application’s <component> in its " +"metainfo file." +msgstr "" +"Egy alkalmazás licencelési információi a metainformációs fájljában lévő " +"<project_license> elemben vannak tárolva az alkalmazás <component> " +"elemén belül." + +#. (itstool) path: section/p +#: C/software-metadata.page:305 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license " +"for the project. This should typically be the license of the code, and not " +"include the license of the documentation or ancillary content." +msgstr "" +"Az ebben az elemben lévő tartalomnak SPDX-kifejezésnek kell lennie, amely a projekt „fő” " +"licencét írja le. Ez általában a kód licencét jelenti, és nem tartalmazza a " +"dokumentáció vagy a kiegészítő tartalom licencét." + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of " +"multiple licenses, which are all FSF or OSI approved, the application is considered ‘free software’ " +"and the license tile says so. Otherwise, it’s considered ‘proprietary’." +msgstr "" +"Ha az SPDX-kifejezés egyetlen licenc vagy több licenc „vagy” kombinációja, " +"amelyek mindegyike az FSF vagy OSI " +"által jóváhagyott, akkor az alkalmazás „szabad szoftvernek” " +"tekinthető, és a licenc csempe is ezt mondja róla. Ellenkező esetben " +"„tulajdonosi” szoftvernek minősül." + +#. (itstool) path: section/p +#: C/software-metadata.page:307 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it " +"shouldn’t be, it’s likely that the <project_license> " +"element includes the documentation license for the project. Remove it." +msgstr "" +"Ha egy alkalmazás „tulajdonosi” jelzéssel van megjelenítve, miközben úgy " +"gondolja, hogy nem kellene, akkor valószínűleg a <" +"project_license> elem tartalmazza a projekt dokumentációs " +"licencét. Távolítsa el." + +#. (itstool) path: section/p +#: C/software-metadata.page:308 +msgid "" +"For example, change the license metadata from:" +msgstr "" +"Például változtassa meg a licenc metaadatait erről:" + +#. (itstool) path: section/code +#: C/software-metadata.page:309 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:310 +msgid "to" +msgstr "erre:" + +#. (itstool) path: section/code +#: C/software-metadata.page:311 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +#. (itstool) path: item/p +#: C/software-metadata.page:315 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" +"Ne tegye (általában) a dokumentáció licencét az " +"alkalmazásadatokba" + +#. (itstool) path: section/title +#: C/software-metadata.page:324 +msgid "How to add missing links" +msgstr "Hogyan adhat hozzá hiányzó hivatkozásokat" + +#. (itstool) path: section/p +#: C/software-metadata.page:325 +msgid "" +"The links for an application are stored as <url> elements within the application’s " +"<component> in its metainfo file." +msgstr "" +"Egy alkalmazás hivatkozásai a metainformációs fájljában lévő <url> elemben vannak tárolva az " +"alkalmazás <component> elemén belül." + +#. (itstool) path: section/p +#: C/software-metadata.page:326 +msgid "" +"Add as many of the link types documented in the appstream specification as are available for the application. " +"If no suitable page exists for a given link type, it doesn’t have to be " +"included." +msgstr "" +"Az appstream specifikációjában dokumentált " +"hivatkozási típusok közül annyit adjon hozzá, amennyi az alkalmazáshoz " +"elérhető. Ha egy adott hivatkozási típushoz nem létezik megfelelő oldal, " +"akkor azt nem kell felvenni." + +#. (itstool) path: section/p +#: C/software-metadata.page:327 +msgid "" +"For example, here are the resource links for the Software app:" +msgstr "" +"Itt vannak például a Szoftver alkalmazás erőforrás-hivatkozásai:" + +#. (itstool) path: section/code +#: C/software-metadata.page:328 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:339 +msgid "How to set the carousel tile background color" +msgstr "Hogyan állíthatja be a körhinta csempe háttérszínét" + +#. (itstool) path: section/p +#: C/software-metadata.page:340 +msgid "" +"The carousel tile background color is normally extracted automatically from " +"the application’s icon. If that color is unsatisfactory, however, it can be " +"overridden by using the appstream’s <" +"branding/> element with declared colors (since 47.x " +"series). The advantage is that more clients can use the colors." +msgstr "" +"A körhinta csempe háttérszíne általában az alkalmazás ikonjából kerül " +"automatikusan kinyerésre. Ha azonban ez a szín nem kielégítő, akkor az appstream <branding/> elemének " +"használatával felülbírálható a deklarált színekkel (a 47.x sorozat óta). " +"Ennek előnye, hogy több ügyfél használhatja a színeket." + +#. (itstool) path: section/p +#: C/software-metadata.page:341 +msgid "For example, here are some branding entries:" +msgstr "Itt van például néhány arculati bejegyzés:" + +#. (itstool) path: section/code +#: C/software-metadata.page:342 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:348 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses the better color for the theme on its own." +msgstr "" +"Ne feledje, hogy a scheme_preference attribútum figyelmen kívül " +"marad, a Szoftver a legjobb színt maga választja ki a témához." + +#. (itstool) path: section/p +#: C/software-metadata.page:350 +msgid "" +"There is left, for backward compatibility, the possibility to add the " +"following XML to the application’s metainfo <component> " +"element:" +msgstr "" +"A visszafelé kompatibilitás érdekében megmaradt a lehetőség, hogy a " +"következő XML-t hozzáadja az alkalmazás metainformációiban lévő <" +"component> elemhez:" + +#. (itstool) path: section/code +#: C/software-metadata.page:351 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:355 +msgid "but the <branding/> element has a precedence." +msgstr "de a <branding/> elemnek elsőbbsége van." + +#. (itstool) path: section/p +#: C/software-metadata.page:356 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format " +"GVariant with type a(yyy), and represents an unordered set of " +"key colors for the application. Each element of the set is a color in RGB " +"form ranging from (0, 0, 0) to (255, 255, 255)." +msgstr "" +"A GnomeSoftware::key-colors értéke egy a(yyy) " +"típusú, szöveges formátumú GVariant, és az alkalmazás kulcsszíneinek " +"rendezetlen halmazát jelenti. A halmaz minden eleme egy RGB formában lévő " +"szín, amely a (0, 0, 0) és (255, 255, 255) közötti " +"tartományban van." + +#. (itstool) path: section/p +#: C/software-metadata.page:357 +msgid "Colors should be chosen so that they:" +msgstr "A színeket úgy kell megválasztani, hogy:" + +#. (itstool) path: item/p +#: C/software-metadata.page:360 +msgid "" +"Are identifiable to the application, matching the application’s branding in " +"some way, if possible." +msgstr "" +"Azonosíthatóak legyenek az alkalmazással, lehetőleg valamilyen módon " +"illeszkedjenek az alkalmazás arculatához." + +#. (itstool) path: item/p +#: C/software-metadata.page:363 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used " +"as a background behind it, the icon can be distinguished." +msgstr "" +"Kontrasztosak legyenek az alkalmazás ikonjának szélével, hogy ha háttérként " +"használják mögötte, akkor az ikon megkülönböztethető legyen." + +#. (itstool) path: item/p +#: C/software-metadata.page:366 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and in its dark variant (#eeeeec). This generally means " +"choosing a color with a medium level of brightness." +msgstr "" +"Kontrasztosak legyenek az Adwaita témában lévő előtér szövegszínében " +"(#2e3436) és annak sötét változatában (#eeeeec). " +"Ez általában egy közepes fényerősségszintű szín kiválasztását jelenti." + +#. (itstool) path: item/p +#: C/software-metadata.page:369 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" +"A kontrasztot a Kontraszt alkalmazás használatával lehet ellenőrizni." + +#. (itstool) path: section/p +#: C/software-metadata.page:372 +msgid "" +"At least one color should be specified. More can be specified if one color " +"can’t satisfy all the requirements above, and Software will " +"choose the most appropriate to use in the carousel tile. If exactly one " +"color is specified, its brightness and saturation may be modified to improve " +"contrast with the foreground color. If more than one color is specified, the " +"one with the best contrast with the foreground color will be chosen, and its " +"brightness and saturation will not be modified." +msgstr "" +"Legalább egy színt meg kell adni. Több szín is megadható, ha egy szín nem " +"elégíti ki a fenti követelményeket, és a Szoftver a " +"legmegfelelőbbet fogja kiválasztani a körhinta csempében való használathoz. " +"Ha pontosan egy szín van megadva, akkor annak fényereje és telítettsége " +"módosítható, hogy javítsa a kontrasztot az előtér színével. Ha egynél több " +"szín van megadva, akkor az előtérszínnel legjobban kontrasztos szín lesz " +"kiválasztva, és annak fényereje és telítettsége nem kerül módosításra." + +#. (itstool) path: section/title +#: C/software-metadata.page:376 +msgid "How to test carousel tile background color changes" +msgstr "Hogyan próbálhatja ki a körhinta csempe háttérszínének változtatásait" + +#. (itstool) path: section/p +#: C/software-metadata.page:377 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" +"Módosítsa az alkalmazás metainformációs fájlját, majd futtassa a " +"Szoftver alkalmazást a következővel:" + +#. (itstool) path: section/p +#: C/software-metadata.page:378 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml," +"icon=/path/to/app/icon.png" +msgstr "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml," +"icon=/path/to/app/icon.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:379 +msgid "" +"The details page for your application will be shown. If you navigate back to " +"the overview page of Software, your application will be the only " +"one in the ‘featured’ carousel." +msgstr "" +"Az alkalmazás részletes oldala fog megjelenni. Ha visszanavigál a " +"Szoftver áttekintő oldalára, akkor az Ön alkalmazása lesz az " +"egyetlen a „kiemelt” körhintában." diff --git a/help/id/id.po b/help/id/id.po new file mode 100644 index 0000000..d6bb6ae --- /dev/null +++ b/help/id/id.po @@ -0,0 +1,1435 @@ +# Indonesian translation for gnome-software. +# Copyright (C) 2024 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Andika Triwidada , 2024, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2025-03-14 20:58+0000\n" +"PO-Revision-Date: 2025-03-27 18:42+0700\n" +"Last-Translator: Andika Triwidada \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Andika Triwidada , 2024, 2025." + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Phaedrus Leeds" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Cara memasang ulang Webapp" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "Perangkat Lunak mendukung pengelolaan dua jenis aplikasi web:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See " +"README.md." +msgstr "" +"Aplikasi web yang metainfo AppStream telah dikirimkan dengan Perangkat Lunak. " +"Lihat README.md." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" +"Aplikasi web yang telah dipasang menggunakan GNOME Web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software (when this " +"functionality has been enabled by the distribution), whereas the second type only show up " +"in Software after they have been installed via GNOME Web. If you uninstall " +"such an app and want to reinstall it, you must do so using GNOME Web." +msgstr "" +"Tipe pertama ditampilkan sebagai tersedia untuk dipasang di Perangkat Lunak " +"(ketika fungsionalitas ini telah difungsikan oleh distribusi), sedangkan tipe kedua hanya " +"muncul di Perangkat Lunak setelah dipasang melalui GNOME Web. Jika Anda " +"membongkar instalasi aplikasi semacam itu dan ingin memasangnya kembali, Anda harus " +"melakukannya menggunakan GNOME Web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "Berikut adalah langkah-langkah untuk memasang aplikasi web menggunakan GNOME Web:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as shown in the " +"image below." +msgstr "" +"Klik tombol Menu aplikasi di kanan atas seperti yang " +"ditunjukkan pada gambar di bawah ini." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This should open " +"the web app creation dialog." +msgstr "" +"Klik pada butir menu Pasang sebagai Aplikasi Web…. Ini akan " +"membuka dialog pembuatan aplikasi web." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install the web app." +msgstr "" +"Klik tombol Buat untuk membuat dan memasang aplikasi web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" +"Aplikasi web sekarang akan muncul di tab Terpasang dari " +"Perangkat Lunak." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Perangkat lunak" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "Karya ini dilisensikan di bawah <_:link-1/>." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Philip Withnall" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Pengantar Lisensi Perangkat Lunak" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Lisensi Perangkat Lunak" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Pengantar" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the freedoms you " +"as a user have. If an app is free/open source software (FOSS), you have the freedom to use " +"it, copy it, study and change its source code. Proprietary software does not provide you " +"with those freedoms. FOSS software is often available for no charge, but this is not " +"always true." +msgstr "" +"Aplikasi dapat berupa 'perangkat lunak bebas/open source' atau 'berpemilik'. Ini " +"memengaruhi kebebasan yang Anda miliki sebagai pengguna. Jika sebuah aplikasi adalah " +"perangkat " +"lunak sumber terbuka/bebas (FOSS), Anda memiliki kebebasan untuk menggunakannya, " +"menyalinnya, mempelajari, dan mengubah kode sumbernya. Perangkat lunak berpemilik tidak " +"memberi Anda kebebasan tersebut. Perangkat lunak FOSS sering kali tersedia tanpa biaya, " +"tetapi ini tidak selalu benar." + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get involved in its " +"development, contributing features or translations to their language and fixing bugs " +"which affect them. They can audit the code and check that changes to the software are not " +"malicious. They can learn from the source code and use it as the basis for their own FOSS " +"applications." +msgstr "" +"Karena kode sumber tersedia untuk perangkat lunak FOSS, pengguna dapat terlibat dalam " +"pengembangannya, menyumbangkan fitur atau terjemahan ke bahasa mereka, dan memperbaiki " +"bug yang memengaruhi mereka. Mereka dapat mengaudit kode dan memeriksa apakah perubahan " +"pada perangkat lunak tidak berbahaya. Mereka dapat belajar dari kode sumber dan " +"menggunakannya sebagai dasar untuk aplikasi FOSS mereka sendiri." + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a public good." +msgstr "" +"Aplikasi FOSS adalah barang " +"publik." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that the developers " +"of the app have your best interests in mind, and no conflicts of interest." +msgstr "" +"Aplikasi proprietari tidak dapat diaudit oleh penggunanya, jadi Anda harus percaya bahwa " +"pengembang aplikasi mempertimbangkan kepentingan terbaik Anda, dan tidak ada konflik " +"kepentingan." + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS over " +"proprietary software." +msgstr "" +"Baca lebih lanjut tentang manfaat FOSS dibandingkan perangkat " +"lunak proprietari." + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Will Thompson" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Milan Crha" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Cara Perangkat Lunak memakai metadata" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Metadata Perangkat Lunak" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Cuplikan Layar" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an application. This " +"typically should include screenshots of various windows / dialogs of the application, so " +"the user would get a quick grasp of the application’s features, look and feel etc." +msgstr "" +"Perangkat Lunak menampilkan tangkapan layar di halaman detail untuk suatu " +"aplikasi. Ini biasanya mesti menyertakan tangkapan layar dari berbagai jendela / dialog " +"aplikasi, sehingga pengguna akan mendapatkan pemahaman cepat tentang fitur, tampilan dan " +"nuansa aplikasi, dll." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" +"Ketika lebih dari satu tangkapan layar hadir dalam berkas metainfo aplikasi, " +"Perangkat Lunak akan menampilkan tangkapan layar dalam komidi putar." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any screenshot, then a " +"placeholder icon as below with No Screenshots will be displayed:" +msgstr "" +"Jika berkas metainfo aplikasi tidak berisi tangkapan layar apa pun, maka ikon pewakil " +"seperti di bawah ini dengan Tidak Ada Cuplikan Layar akan ditampilkan:" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "Placeholder icon might look different if you're using a custom icon theme." +msgstr "Ikon pewakil mungkin terlihat berbeda jika Anda menggunakan tema ikon ubahan." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even if " +"Software shows screenshots for an app, it’s important to check if these " +"screenshots are up-to-date or outdated." +msgstr "" +"Cuplikan layar mungkin menjadi usang karena UI aplikasi berubah. Jadi, meskipun " +"Perangkat Lunak menampilkan tangkapan layar untuk aplikasi, penting untuk " +"memeriksa apakah tangkapan layar ini terbaru atau kedaluwarsa." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "Anda dapat memperbaiki informasi tangkapan layar aplikasi:" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app screenshots" +msgstr "" +"Cara menambahkan tangkapan layar " +"aplikasi yang kurang" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Bilah konteks aplikasi" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the details page " +"for an application, which display the following details." +msgstr "" +"Bilah konteks aplikasi di Perangkat Lunak adalah kumpulan ubin pada halaman " +"detail untuk aplikasi, yang menampilkan detail berikut." + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Penyimpanan" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Keselamatan" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Dukungan perangkat keras" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Peringkat usia" + +#. (itstool) path: section/p +#. Translators: Refer +#. https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/Help-Translation-Notes +#. for steps to localize 'figures/app-context-bar.png' image. +#: C/software-metadata.page:74 +msgid "This shows the app context bar for the Software app:" +msgstr "Ini menunjukkan bilah konteks aplikasi untuk aplikasi Perangkat Lunak:" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:75 +msgctxt "_" +msgid "external ref='figures/app-context-bar.png' md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "external ref='figures/app-context-bar.png' md5='3badcd9309bde27a650b25eb5d89a4c6'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:78 +msgid "" +"The tiles are displayed in the order listed above (starting with Storage " +"tile on the left)." +msgstr "" +"Ubin ditampilkan dalam urutan yang tercantum di atas (dimulai dengan ubin " +"Penyimpanan di sebelah kiri)." + +#. (itstool) path: section/p +#: C/software-metadata.page:79 +msgid "Each tile is covered in detail below." +msgstr "Setiap ubin dibahas secara rinci di bawah ini." + +#. (itstool) path: section/title +#: C/software-metadata.page:83 +msgid "Storage" +msgstr "Penyimpanan" + +#. (itstool) path: section/p +#: C/software-metadata.page:84 +msgid "" +"Software displays a storage tile on the details page for an application. If " +"the application is not installed, this displays the estimated download size needed to " +"install it. If the application is installed, it displays the storage space used by the " +"application." +msgstr "" +"Perangkat Lunak menampilkan ubin penyimpanan di halaman detail untuk aplikasi. " +"Jika aplikasi tidak terpasang, ini akan menampilkan perkiraan ukuran unduhan yang " +"diperlukan untuk memasangnya. Jika aplikasi terpasang, itu menampilkan ruang penyimpanan " +"yang digunakan oleh aplikasi." + +#. (itstool) path: section/p +#: C/software-metadata.page:85 +msgid "" +"The sizes are calculated from data provided by the Software backend (such as " +"flatpak or an RPM), and are not specified in the metadata provided by the application. " +"There is nothing you can do to affect this tile by editing an application’s metainfo " +"file. It’s listed here for completeness." +msgstr "" +"Ukuran dihitung dari data yang disediakan oleh backend Perangkat Lunak " +"(seperti flatpak atau RPM), dan tidak ditentukan dalam metadata yang disediakan oleh " +"aplikasi. Tidak ada yang dapat Anda lakukan untuk memengaruhi ubin ini dengan menyunting " +"berkas metainfo aplikasi. Ini tercantum di sini untuk kelengkapan." + +#. (itstool) path: section/title +#: C/software-metadata.page:89 +msgid "Safety" +msgstr "Keselamatan" + +#. (itstool) path: section/p +#: C/software-metadata.page:90 +msgid "" +"Software displays a safety tile on the details page for an application. This " +"summarizes information about whether the app can be considered safe to install and run, " +"or whether caution may be required before trusting it." +msgstr "" +"Perangkat Lunak menampilkan ubin keselamatan di halaman detail untuk aplikasi. " +"Ini merangkum informasi tentang apakah aplikasi dapat dianggap aman untuk dipasang dan " +"dijalankan, atau apakah kehati-hatian mungkin diperlukan sebelum memercayainya." + +#. (itstool) path: section/p +#: C/software-metadata.page:91 +msgid "" +"This tile combines information about the permissions which the app requests when it runs " +"(such as permission to read your files), with information about how the app was " +"developed. Free software applications, where the source code is publicly readable, can be " +"more secure than proprietary ones, as they can be audited." +msgstr "" +"Ubin ini menggabungkan informasi tentang izin yang diminta aplikasi saat berjalan " +"(seperti izin untuk membaca berkas Anda), dengan informasi tentang bagaimana aplikasi " +"dikembangkan. Aplikasi perangkat lunak bebas, di mana kode sumbernya dapat dibaca secara " +"publik, bisa lebih aman daripada yang berpemilik, karena dapat diaudit." + +#. (itstool) path: section/p +#: C/software-metadata.page:92 +msgid "" +"The dialog which appears when the tile is clicked lists the different permissions the app " +"requests, plus some information about its license and runtime." +msgstr "" +"Dialog yang muncul saat ubin diklik mencantumkan berbagai izin yang diminta aplikasi, " +"ditambah beberapa informasi tentang lisensi dan runtimenya." + +#. (itstool) path: section/p +#: C/software-metadata.page:93 +msgid "You can improve the safety information:" +msgstr "Anda dapat memperbaiki informasi keselamatan:" + +#. (itstool) path: item/p +#: C/software-metadata.page:96 +msgid "" +"How to fix " +"incorrect safety and permissions information" +msgstr "" +"Cara memperbaiki " +"informasi keselamatan dan izin yang salah" + +#. (itstool) path: section/title +#: C/software-metadata.page:102 +msgid "Hardware support" +msgstr "Dukungan perangkat keras" + +#. (itstool) path: section/p +#: C/software-metadata.page:103 +msgid "" +"Software displays a hardware support tile on the details page for an " +"application. This combines information about the hardware requirements of the " +"application, and the hardware capabilities of the computer, with the aim of highlighting " +"incompatibilities or missing requirements — or to indicate that the application should " +"work correctly with no incompatibilities." +msgstr "" +"Perangkat Lunak menampilkan ubin dukungan perangkat keras di halaman detail " +"untuk aplikasi. Ini menggabungkan informasi tentang persyaratan perangkat keras aplikasi, " +"dan kemampuan perangkat keras komputer, dengan tujuan menyoroti ketidakcocokan atau " +"persyaratan yang kurang — atau untuk mengindikasikan bahwa aplikasi harus bekerja dengan " +"benar tanpa ketidakcocokan." + +#. (itstool) path: section/p +#: C/software-metadata.page:112 +msgid "The code looks at the following hardware. More may be supported in future." +msgstr "" +"Kode ini mencari perangkat keras berikut. Lebih banyak lagi mungkin didukung di masa " +"mendatang." + +#. (itstool) path: item/p +#: C/software-metadata.page:114 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "Apakah touchpad, tetikus, atau papan ketik ada/diperlukan" + +#. (itstool) path: item/p +#: C/software-metadata.page:115 +msgid "Whether a gamepad is needed" +msgstr "Apakah gamepad diperlukan" + +#. (itstool) path: item/p +#: C/software-metadata.page:116 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "" +"Ukuran tampilan minimum dan yang direkomendasikan yang aplikasi dapat diskalakan ke sana" + +#. (itstool) path: section/p +#: C/software-metadata.page:119 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, as they are " +"often left disconnected due to not being needed for normal computer use." +msgstr "" +"Tidak mungkin untuk mendeteksi secara andal apakah gamepad ada, karena sering " +"kali dibiarkan terputus karena tidak diperlukan untuk penggunaan komputer normal." + +#. (itstool) path: section/p +#: C/software-metadata.page:120 +msgid "" +"The dialog which appears when the tile is clicked lists the different hardware " +"requirements of the app, and whether any of them are not met." +msgstr "" +"Dialog yang muncul saat ubin diklik mencantumkan persyaratan perangkat keras aplikasi " +"yang berbeda, dan apakah salah satu dari mereka tidak terpenuhi." + +#. (itstool) path: section/p +#: C/software-metadata.page:121 +msgid "You can improve the hardware information:" +msgstr "Anda dapat memperbaiki informasi perangkat keras:" + +#. (itstool) path: item/p +#: C/software-metadata.page:124 +msgid "" +"How to add missing hardware " +"information" +msgstr "" +"Cara menambahkan informasi " +"perangkat keras yang kurang" + +#. (itstool) path: section/title +#: C/software-metadata.page:130 +msgid "Age rating" +msgstr "Peringkat usia" + +#. (itstool) path: section/p +#: C/software-metadata.page:131 +msgid "" +"Software displays an age rating tile on the details page for an application. " +"This shows what age range the application should be suitable for, based on different " +"kinds of content which the application has declared it contains. This information is " +"summarized in a format similar to the game or film rating certificates for your country." +msgstr "" +"Perangkat Lunak menampilkan ubin peringkat usia di halaman detail untuk " +"aplikasi. Ini menunjukkan rentang usia apa yang mesti cocok untuk aplikasi, berdasarkan " +"berbagai jenis konten yang telah dinyatakan dikandung dalam aplikasi. Informasi ini " +"dirangkum dalam format yang serupa dengan sertifikat peringkat permainan atau film untuk " +"negara Anda." + +#. (itstool) path: section/p +#: C/software-metadata.page:132 +msgid "" +"For example, this will highlight whether a game contains violence, or whether an " +"application contains in-app advertising." +msgstr "" +"Misalnya, ini akan menyoroti apakah suatu permainan mengandung kekerasan, atau apakah " +"aplikasi berisi iklan dalam aplikasi." + +#. (itstool) path: section/p +#: C/software-metadata.page:133 +msgid "" +"The dialog which appears when the tile is clicked lists the different types of content in " +"the application and how severe that content is." +msgstr "" +"Dialog yang muncul saat ubin diklik mencantumkan berbagai jenis konten dalam aplikasi dan " +"seberapa parah konten tersebut." + +#. (itstool) path: section/p +#: C/software-metadata.page:134 +msgid "You can improve the age rating information:" +msgstr "Anda dapat memperbaiki informasi peringkat usia:" + +#. (itstool) path: item/p +#: C/software-metadata.page:137 +msgid "" +"How to add missing content " +"rating information" +msgstr "" +"Cara menambahkan informasi " +"peringkat konten yang kurang" + +#. (itstool) path: section/title +#: C/software-metadata.page:143 +msgid "License" +msgstr "Lisensi" + +#. (itstool) path: section/p +#: C/software-metadata.page:146 +msgid "" +"Software displays a tile indicating whether an application is free software " +"or whether its license is proprietary, special or unknown. This tile includes more " +"detailed information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" +"Perangkat Lunak menampilkan ubin yang menunjukkan apakah suatu aplikasi adalah " +"perangkat " +"lunak bebas atau apakah lisensinya proprietari, khusus, atau tidak diketahui. Ubin " +"ini mencakup informasi lebih rinci tentang lisensi proyek. Ubin ini juga mencantumkan " +"beberapa manfaat perangkat lunak bebas. Pelajari lebih lanjut" + +#. (itstool) path: section/p +#: C/software-metadata.page:147 +msgid "" +"Sometimes the license information isn’t correct for an application, and hence an " +"application which is actually free software will be shown as ‘proprietary’. Similarly, " +"sometimes the license information is unknown." +msgstr "" +"Kadang-kadang informasi lisensi tidak benar untuk suatu aplikasi, dan karenanya aplikasi " +"yang sebenarnya adalah perangkat lunak bebas akan ditampilkan sebagai 'berpemilik'. " +"Demikian pula, terkadang informasi lisensi tidak diketahui." + +#. (itstool) path: section/p +#: C/software-metadata.page:148 +msgid "" +"Software highlights free and open-source licenses in green, proprietary and " +"special licenses in yellow as shown here. Unknown licenses are highlighted in grey." +msgstr "" +"Perangkat Lunak menyoroti lisensi bebas dan sumber terbuka dalam warna hijau, " +"lisensi proprietari dan khusus berwarna kuning seperti yang ditunjukkan di sini. Lisensi " +"yang tidak dikenal disorot dengan warna abu-abu." + +#. (itstool) path: section/p +#: C/software-metadata.page:149 +msgid "You can add or improve the license information:" +msgstr "Anda dapat menambahkan atau memperbaiki informasi lisensi:" + +#. (itstool) path: item/p +#: C/software-metadata.page:152 +msgid "" +"How to fix incorrect licensing " +"information" +msgstr "" +"Cara memperbaiki informasi " +"lisensi yang salah" + +#. (itstool) path: section/title +#: C/software-metadata.page:158 +msgid "Links" +msgstr "Tautan" + +#. (itstool) path: section/p +#: C/software-metadata.page:160 +msgid "" +"Software displays a list of application resource links in the link tile. They " +"are as follows:" +msgstr "" +"Perangkat lunak menampilkan daftar tautan sumber daya aplikasi di ubin tautan. " +"Mereka adalah sebagai berikut:" + +#. (itstool) path: td/p +#: C/software-metadata.page:164 +msgid "Website link" +msgstr "Tautan situs web" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Donation link" +msgstr "Tautan donasi" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Translation contribution link" +msgstr "Tautan kontribusi terjemahan" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Bug reporting link" +msgstr "Tautan pelaporan bug" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Help link" +msgstr "Tautan bantuan" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Contact link" +msgstr "Tautan kontak" + +#. (itstool) path: section/p +#: C/software-metadata.page:187 +msgid "" +"Some or all of these links may be present depending on whether they are listed in the " +"application’s metainfo file." +msgstr "" +"Beberapa atau semua tautan ini mungkin ada tergantung pada apakah tautan tersebut " +"tercantum dalam berkas metainfo aplikasi." + +#. (itstool) path: section/p +#: C/software-metadata.page:188 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the following " +"tile with a question mark will be displayed." +msgstr "" +"Dalam kasus ketika berkas metainfo aplikasi tidak berisi tautan apa pun, ubin berikut " +"dengan tanda tanya akan ditampilkan." + +#. (itstool) path: section/p +#: C/software-metadata.page:190 +msgid "You can improve the links:" +msgstr "Anda dapat meningkatkan tautan:" + +#. (itstool) path: item/p +#: C/software-metadata.page:193 +msgid "How to add missing links" +msgstr "Cara menambahkan tautan yang kurang" + +#. (itstool) path: section/title +#: C/software-metadata.page:199 +msgid "Carousel tile" +msgstr "Ubin komidi putar" + +#. (itstool) path: section/p +#: C/software-metadata.page:201 +msgid "" +"Applications which are featured by Software are displayed in a carousel at the " +"top of the main window as shown here. Each carousel tile has a background color which is " +"automatically extracted from the application’s icon. Sometimes this background color is " +"not quite right for the application and needs to be specified explicitly by the " +"application developer." +msgstr "" +"Aplikasi yang ditampilkan oleh Perangkat Lunak ditampilkan dalam komidi putar " +"di bagian atas jendela utama seperti yang ditunjukkan di sini. Setiap ubin komidi putar " +"memiliki warna latar yang secara otomatis diekstraksi dari ikon aplikasi. Terkadang warna " +"latar ini tidak cukup tepat untuk aplikasi dan perlu ditentukan secara eksplisit oleh " +"pengembang aplikasi." + +#. (itstool) path: section/p +#: C/software-metadata.page:202 +msgid "" +"The set of applications which are featured is decided by the Linux distribution " +"maintainers." +msgstr "Kumpulan aplikasi unggulan diputuskan oleh para pengelola distribusi Linux." + +#. (itstool) path: section/p +#: C/software-metadata.page:203 +msgid "You can improve the carousel tile:" +msgstr "Anda dapat memperbaiki ubin komidi putar:" + +#. (itstool) path: item/p +#: C/software-metadata.page:206 +msgid "" +"How to set the carousel " +"tile background color" +msgstr "" +"Cara menata warna " +"latar ubin komidi putar" + +#. (itstool) path: section/title +#: C/software-metadata.page:212 +msgid "Where metadata comes from" +msgstr "Dari mana metadata berasal" + +#. (itstool) path: section/p +#: C/software-metadata.page:213 +msgid "" +"The metadata used to specify what hardware a piece of software requires, what ages of " +"user it is suitable for, and factors which contribute to how safe it might be to install, " +"all come from the metainfo file for that software." +msgstr "" +"Metadata yang digunakan untuk menentukan perangkat keras apa yang dibutuhkan perangkat " +"lunak, berapa usia pengguna yang cocok, dan faktor-faktor yang berkontribusi pada " +"seberapa aman untuk memasang, semuanya berasal dari berkas metainfo untuk perangkat lunak " +"itu." + +#. (itstool) path: section/p +#: C/software-metadata.page:214 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream specification." +msgstr "" +"Berkas metainfo adalah suatu berkas XML. Format berkasnya ditentukan dalam spesifikasi AppStream." + +#. (itstool) path: section/p +#: C/software-metadata.page:215 +msgid "" +"See the metainfo file for GNOME Files app." +msgstr "" +"Lihat berkas metainfo untuk aplikasi GNOME Berkas." + +#. (itstool) path: note/p +#: C/software-metadata.page:217 +msgid "appdata is the older term for metainfo." +msgstr "appdata adalah istilah lama untuk metainfo." + +#. (itstool) path: section/title +#: C/software-metadata.page:222 +msgid "What happens if metadata is missing" +msgstr "Apa yang terjadi jika metadata hilang" + +#. (itstool) path: section/p +#: C/software-metadata.page:223 +msgid "" +"If some metadata is missing for an application, Software can only guess what " +"it might be, and hence can’t present much information in its interfaces. The guesses " +"Software makes are based on the fact that most software is designed for " +"desktop computers." +msgstr "" +"Jika beberapa metadata hilang untuk suatu aplikasi, Perangkat Lunak hanya " +"dapat menebak apa itu, dan karenanya tidak dapat menyajikan banyak informasi dalam " +"antarmukanya. Tebakan yang dibuat Perangkat Lunak didasarkan pada fakta bahwa " +"sebagian besar perangkat lunak dirancang untuk komputer desktop." + +#. (itstool) path: section/p +#: C/software-metadata.page:224 +msgid "You can help improve the metadata for an application!" +msgstr "" +"Anda dapat membantu memperbaiki metadata untuk sebuah aplikasi!" + +#. (itstool) path: section/title +#: C/software-metadata.page:228 +msgid "How to contribute missing information" +msgstr "Cara menyumbangkan informasi yang kurang" + +#. (itstool) path: section/p +#: C/software-metadata.page:229 +msgid "" +"If you find that an app’s page is missing information or has incorrect information, you " +"can contribute in one of the two ways:" +msgstr "" +"Jika Anda menemukan bahwa halaman suatu aplikasi kurang informasi atau memiliki informasi " +"yang salah, Anda dapat berkontribusi dengan salah satu dari dua cara:" + +#. (itstool) path: item/p +#: C/software-metadata.page:232 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug tracker, so " +"the app developer can fix it." +msgstr "" +"Anda dapat melaporkan metadata yang kurang / salah ke pelacak bug aplikasi masing-masing, " +"sehingga pengembang aplikasi dapat memperbaikinya." + +#. (itstool) path: item/p +#: C/software-metadata.page:235 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How " +"to guide below on how to do that." +msgstr "" +"Anda dapat memperbaiki sendiri metadata yang kurang / salah. Lihat panduan Cara di bawah ini tentang bagaimana melakukannya." + +#. (itstool) path: section/p +#: C/software-metadata.page:239 +msgid "" +"For both, you first need to find the app’s project page. The link to the project page " +"should typically be available in the app’s page as shown here. If not, you will need to find it with a simple search on Google." +msgstr "" +"Untuk keduanya, Anda harus terlebih dahulu menemukan halaman proyek aplikasi. Tautan ke " +"halaman proyek biasanya harus tersedia di halaman aplikasi seperti " +"yang ditunjukkan di sini. Jika tidak, Anda harus menemukannya dengan pencarian " +"sederhana di Google." + +#. (itstool) path: section/p +#: C/software-metadata.page:241 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" +"Aplikasi biasanya diwadahi di GitLab atau GitHub. Misalnya, aplikasi GNOME diwadahi di gitlab.gnome.org." + +#. (itstool) path: section/title +#: C/software-metadata.page:245 +msgid "How to add missing app screenshots" +msgstr "Cara menambahkan tangkapan layar aplikasi yang kurang" + +#. (itstool) path: section/p +#: C/software-metadata.page:246 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s " +"<component> in its metainfo file." +msgstr "" +"Informasi tangkapan layar untuk aplikasi disimpan pada elemen <screenshots> dalam <component> aplikasi di berkas metainfo-nya." + +#. (itstool) path: section/p +#: C/software-metadata.page:247 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots should " +"ideally be in the PNG format with 16:9 aspect ratio and minimum width of 620 pixels." +msgstr "" +"Cacah tangkapan lahar yang disarankan untuk aplikasi adalah antara 5 hingga 10. Tangkapan " +"layar idealnya dalam format PNG dengan rasio aspek 16:9 dan lebar minimum 620 piksel." + +#. (itstool) path: section/p +#: C/software-metadata.page:248 +msgid "For example, here are the screenshot entries for the Software app:" +msgstr "" +"Misalnya, berikut adalah entri tangkapan layar untuk aplikasi Perangkat Lunak:" + +#. (itstool) path: section/code +#: C/software-metadata.page:249 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:263 +msgid "How to fix incorrect safety and permissions information" +msgstr "Cara memperbaiki informasi keselamatan dan izin yang salah" + +#. (itstool) path: section/p +#: C/software-metadata.page:264 +msgid "" +"The safety and permissions information for an application comes from different sources " +"depending on how the application is packaged. For traditionally packaged applications, " +"for example in RPM or DEB format, there is no safety or permissions information available " +"and nothing can be done to add it to an application." +msgstr "" +"Informasi keselamatan dan izin untuk aplikasi berasal dari sumber yang berbeda tergantung " +"pada bagaimana aplikasi dikemas. Untuk aplikasi yang dikemas secara tradisional, misalnya " +"dalam format RPM atau DEB, tidak ada informasi keselamatan atau izin yang tersedia dan " +"tidak ada yang dapat dilakukan untuk menambahkannya ke aplikasi." + +#. (itstool) path: section/p +#: C/software-metadata.page:265 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, " +"specifying what holes in the sandbox the application requires. Each of these holes " +"typically contributes to lowering the displayed safety level of the application in " +"Software — moving it from ‘safe’ to ‘potentially unsafe’ to ‘unsafe’." +msgstr "" +"Untuk aplikasi flatpak, informasi berasal dari manifes flatpak, yang menentukan lubang apa di sandbox " +"yang dibutuhkan aplikasi. Masing-masing lubang ini biasanya berkontribusi untuk " +"menurunkan tingkat keselamatan aplikasi yang ditampilkan di Perangkat Lunak — " +"memindahkannya dari 'aman' ke 'berpotensi tidak aman' menjadi 'tidak aman'." + +#. (itstool) path: section/p +#: C/software-metadata.page:266 +msgid "" +"In order to improve the safety level of an application, its sandboxing must be made as " +"tight as possible, by removing sandbox permissions where they’re not needed, and using portals instead of sandbox permissions where possible. Use of portals does not lower the " +"displayed safety level of an application in Software." +msgstr "" +"Untuk meningkatkan tingkat keselamatan aplikasi, sandboxing-nya harus dibuat seketat " +"mungkin, dengan menghapus izin sandbox yang tidak diperlukan, dan menggunakan portal alih-alih izin sandbox jika memungkinkan. Penggunaan portal tidak menurunkan " +"tingkat keselamatan aplikasi yang ditampilkan di Perangkat Lunak." + +#. (itstool) path: section/p +#: C/software-metadata.page:267 +msgid "" +"For example, if the application requests read/write access to the full file system " +"(--filesystem=host), does it actually need that, or does it only need to " +"access files in a few specific locations? If so, the file portal could be used, or " +"more specific file system permissions could be specified." +msgstr "" +"Misalnya, jika aplikasi meminta akses baca/tulis ke seluruh sistem berkas (--" +"filesystem=host), apakah sebenarnya membutuhkannya, atau hanya perlu mengakses " +"berkas di beberapa lokasi tertentu? Jika demikian, portal berkas dapat digunakan, atau " +"izin sistem berkas yang lebih spesifik dapat ditentukan." + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a fallback, without " +"using special X11 features, could it use --socket=fallback-x11 rather than " +"--socket=x11?" +msgstr "" +"Jika aplikasi bekerja di Wayland, dan hanya perlu bekerja pada X11 sebagai fallback, " +"tanpa menggunakan fitur khusus X11, bisakah itu menggunakan --socket=fallback-x11 daripada --socket=x11?" + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be added here in " +"future." +msgstr "" +"Panduan tentang izin tertentu, atau format pengemasan lainnya, dapat ditambahkan di sini " +"di masa mendatang." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 C/software-metadata.page:308 +msgid "Further reading:" +msgstr "Bacaan lebih lanjut:" + +#. (itstool) path: section/title +#: C/software-metadata.page:285 +msgid "How to add missing hardware information" +msgstr "Cara menambahkan informasi perangkat keras yang kurang" + +#. (itstool) path: section/p +#: C/software-metadata.page:286 +msgid "" +"The hardware information for an application is stored in the <" +"requires>, <recommends> and <supports> elements within the application’s <component> in its metainfo " +"file." +msgstr "" +"Informasi perangkat keras untuk aplikasi disimpan di elemen <" +"requires>, <recommends>, dan <supports> dalam <component> aplikasi di berkas metainfo-nya." + +#. (itstool) path: section/p +#: C/software-metadata.page:287 +msgid "" +"Software understands the <control> and <display_length> elements." +msgstr "" +"Perangkat Lunak memahami elemen <control> dan <display_length>." + +#. (itstool) path: section/p +#: C/software-metadata.page:288 +msgid "" +"See this blog post or this blog " +"post for examples of metadata." +msgstr "" +"Lihat artikel blog ini atau artikel blog ini untuk contoh metadata." + +#. (itstool) path: section/title +#: C/software-metadata.page:292 +msgid "How to add missing content rating information" +msgstr "Cara menambahkan informasi peringkat konten yang kurang" + +#. (itstool) path: section/p +#: C/software-metadata.page:293 +msgid "" +"The content rating information for an application is stored in the <content_rating> element within the " +"application’s <component> in its metainfo file." +msgstr "" +"Informasi peringkat konten untuk aplikasi disimpan di elemen <" +"content_rating> dalam <component> aplikasi di berkas " +"metainfo-nya." + +#. (itstool) path: section/p +#: C/software-metadata.page:294 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If the <" +"content_rating> element is not specified, the application’s content rating is " +"unknown. If it’s specified but empty, the application has no content which might be " +"unsuitable for any audience." +msgstr "" +"Aplikasi harus menggunakan standar OARS 1.1 untuk mengisi elemen ini. Jika elemen " +"<content_rating> tidak ditentukan, peringkat konten aplikasi tidak " +"diketahui. Jika ditentukan tetapi kosong, aplikasi tidak memiliki konten yang mungkin " +"tidak cocok untuk audiens mana pun." + +#. (itstool) path: section/p +#: C/software-metadata.page:295 +msgid "" +"Use the OARS generator to produce " +"suitable content rating information for an application." +msgstr "" +"Gunakan generator OARS untuk " +"menghasilkan informasi peringkat konten yang sesuai untuk aplikasi." + +#. (itstool) path: section/title +#: C/software-metadata.page:299 +msgid "How to fix incorrect licensing information" +msgstr "Cara memperbaiki informasi lisensi yang salah" + +#. (itstool) path: section/p +#: C/software-metadata.page:300 +msgid "" +"The licensing information for an application is stored in the <project_license> element within the " +"application’s <component> in its metainfo file." +msgstr "" +"Informasi lisensi untuk aplikasi disimpan di elemen <" +"project_license> dalam <component> aplikasi di berkas " +"metainfo-nya." + +#. (itstool) path: section/p +#: C/software-metadata.page:301 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license for the " +"project. This should typically be the license of the code, and not include the license of " +"the documentation or ancillary content." +msgstr "" +"Konten dalam elemen ini harus berupa ekspresi SPDX yang menjelaskan lisensi 'utama' untuk proyek. Ini " +"biasanya harus menjadi lisensi kode, dan tidak termasuk lisensi dokumentasi atau konten " +"tambahan." + +#. (itstool) path: section/p +#: C/software-metadata.page:302 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of multiple licenses, " +"which are all FSF or OSI approved, the " +"application is considered ‘free software’ and the license tile says so. Otherwise, it’s " +"considered ‘proprietary’." +msgstr "" +"Jika ekspresi SPDX adalah lisensi tunggal, atau kombinasi 'atau' dari beberapa lisensi, " +"yang semuanya disetujui FSF atau OSI, " +"aplikasi tersebut dianggap 'perangkat lunak bebas' dan ubin lisensi mengatakan demikian. " +"Jika tidak, itu dianggap 'berpemilik'." + +#. (itstool) path: section/p +#: C/software-metadata.page:303 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it shouldn’t be, " +"it’s likely that the <project_license> element includes the " +"documentation license for the project. Remove it." +msgstr "" +"Jika sebuah aplikasi ditampilkan sebagai 'berpemilik' ketika menurut Anda tidak " +"seharusnya, kemungkinan elemen <project_license> tersebut menyertakan " +"lisensi dokumentasi untuk proyek tersebut. Hapus itu." + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"For example, " +"change the license metadata from:" +msgstr "" +"Misalnya, ubah " +"metadata lisensi dari:" + +#. (itstool) path: section/code +#: C/software-metadata.page:305 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "<project_license>GPL-2.0+ dan CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "to" +msgstr "menjadi" + +#. (itstool) path: section/code +#: C/software-metadata.page:307 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +#. (itstool) path: item/p +#: C/software-metadata.page:311 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" +"Jangan (secara umum) memasukkan lisensi dokumentasi di appdata" + +#. (itstool) path: section/title +#: C/software-metadata.page:320 +msgid "How to add missing links" +msgstr "Cara menambahkan tautan yang kurang" + +#. (itstool) path: section/p +#: C/software-metadata.page:321 +msgid "" +"The links for an application are stored as <url> " +"elements within the application’s <component> in its metainfo file." +msgstr "" +"Tautan untuk aplikasi disimpan sebagai elemen <url> " +"dalam <component> aplikasi dalam berkas metainfo-nya." + +#. (itstool) path: section/p +#: C/software-metadata.page:322 +msgid "" +"Add as many of the link types documented in the appstream specification as " +"are available for the application. If no suitable page exists for a given link type, it " +"doesn’t have to be included." +msgstr "" +"Tambahkan sebanyak mungkin tipe tautan yang didokumentasikan dalam spesifikasi " +"appstream yang tersedia untuk aplikasi. Jika tidak ada halaman yang cocok untuk " +"tipe tautan tertentu, halaman tersebut tidak harus disertakan." + +#. (itstool) path: section/p +#: C/software-metadata.page:323 +msgid "For example, here are the resource links for the Software app:" +msgstr "" +"Misalnya, berikut adalah tautan sumber daya untuk aplikasi Perangkat Lunak:" + +#. (itstool) path: section/code +#: C/software-metadata.page:324 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:335 +msgid "How to set the carousel tile background color" +msgstr "Cara menata warna latar ubin komidi putar" + +#. (itstool) path: section/p +#: C/software-metadata.page:336 +msgid "" +"The carousel tile background color is normally extracted automatically from the " +"application’s icon. If that color is unsatisfactory, however, it can be overridden by " +"using the appstream’s <branding/> element with " +"declared colors (since 47.x series). The advantage is that more clients can use the " +"colors." +msgstr "" +"Warna latar ubin komidi putar biasanya diekstraksi secara otomatis dari ikon aplikasi. " +"Namun, jika warna tersebut tidak memuaskan, warna tersebut dapat diganti dengan " +"menggunakan elemen <branding/> appstream dengan warna " +"yang dideklarasikan (sejak seri 47.x). Keuntungannya adalah lebih banyak klien yang dapat " +"menggunakan warna tersebut." + +#. (itstool) path: section/p +#: C/software-metadata.page:337 +msgid "For example, here are some branding entries:" +msgstr "Misalnya, berikut adalah beberapa entri branding:" + +#. (itstool) path: section/code +#: C/software-metadata.page:338 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:344 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses " +"the better color for the theme on its own." +msgstr "" +"Perhatikan atribut scheme_preference diabaikan, Perangkat lunak " +"memilih sendiri warna yang lebih baik untuk tema." + +#. (itstool) path: section/p +#: C/software-metadata.page:346 +msgid "" +"There is left, for backward compatibility, the possibility to add the following XML to " +"the application’s metainfo <component> element:" +msgstr "" +"Masih ada, untuk kompatibilitas mundur, kemungkinan untuk menambahkan XML berikut ke " +"elemen metainfo <component> aplikasi:" + +#. (itstool) path: section/code +#: C/software-metadata.page:347 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:351 +msgid "but the <branding/> element has a precedence." +msgstr "tetapi elemen <branding/> memiliki preseden." + +#. (itstool) path: section/p +#: C/software-metadata.page:352 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format GVariant with type " +"a(yyy), and represents an unordered set of key colors for the application. " +"Each element of the set is a color in RGB form ranging from (0, 0, 0) to " +"(255, 255, 255)." +msgstr "" +"Nilai dari GnomeSoftware::key-colors adalah suatu GVariant format teks " +"dengan jenis a(yyy), dan mewakili sekumpulan warna kunci yang tidak " +"berurutan untuk aplikasi. Setiap elemen set adalah warna dalam bentuk RGB mulai dari " +"(0, 0, 0) hingga (255, 255, 255)." + +#. (itstool) path: section/p +#: C/software-metadata.page:353 +msgid "Colors should be chosen so that they:" +msgstr "Warna harus dipilih sehingga:" + +#. (itstool) path: item/p +#: C/software-metadata.page:356 +msgid "" +"Are identifiable to the application, matching the application’s branding in some way, if " +"possible." +msgstr "" +"Dapat diidentifikasi oleh aplikasi, cocok dengan branding aplikasi dalam beberapa cara, " +"jika memungkinkan." + +#. (itstool) path: item/p +#: C/software-metadata.page:359 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used as a " +"background behind it, the icon can be distinguished." +msgstr "" +"Kontras dengan tepi ikon aplikasi, sehingga ketika digunakan sebagai latar belakang di " +"belakangnya, ikon tersebut dapat dibedakan." + +#. (itstool) path: item/p +#: C/software-metadata.page:362 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and " +"in its dark variant (#eeeeec). This generally means choosing a color with a " +"medium level of brightness." +msgstr "" +"Kontras dengan warna teks latar depan dalam tema Adwaita (#2e3436) dan dalam " +"varian gelapnya (#eeeeec). Ini umumnya berarti memilih warna dengan tingkat " +"kecerahan sedang." + +#. (itstool) path: item/p +#: C/software-metadata.page:365 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" +"Kontras dapat diperiksa menggunakan aplikasi Kontras." + +#. (itstool) path: section/p +#: C/software-metadata.page:368 +msgid "" +"At least one color should be specified. More can be specified if one color can’t satisfy " +"all the requirements above, and Software will choose the most appropriate to " +"use in the carousel tile. If exactly one color is specified, its brightness and " +"saturation may be modified to improve contrast with the foreground color. If more than " +"one color is specified, the one with the best contrast with the foreground color will be " +"chosen, and its brightness and saturation will not be modified." +msgstr "" +"Setidaknya satu warna harus ditentukan. Lebih banyak dapat ditentukan jika satu warna " +"tidak dapat memenuhi semua persyaratan di atas, dan Perangkat Lunak akan " +"memilih yang paling tepat untuk digunakan di ubin komidi putar. Jika tepat satu warna " +"ditentukan, kecerahan dan saturasinya dapat dimodifikasi untuk meningkatkan kontras " +"dengan warna latar depan. Jika lebih dari satu warna ditentukan, warna dengan kontras " +"terbaik dengan warna latar depan akan dipilih, dan kecerahan serta saturasinya tidak akan " +"dimodifikasi." + +#. (itstool) path: section/title +#: C/software-metadata.page:372 +msgid "How to test carousel tile background color changes" +msgstr "Cara menguji perubahan warna latar ubin komidi putar" + +#. (itstool) path: section/p +#: C/software-metadata.page:373 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" +"Ubah berkas metainfo untuk aplikasi Anda, lalu jalankan Perangkat Lunak dengan:" + +#. (itstool) path: section/p +#: C/software-metadata.page:374 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml,icon=/path/" +"to/app/icon.png" +msgstr "" +"gnome-software --show-metainfo=/path/ke/app.metainfo.xml,icon=/path/" +"ke/app/icon.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:375 +msgid "" +"The details page for your application will be shown. If you navigate back to the overview " +"page of Software, your application will be the only one in the ‘featured’ " +"carousel." +msgstr "" +"Halaman detail untuk aplikasi Anda akan ditampilkan. Jika Anda menavigasi kembali ke " +"halaman ikhtisar Perangkat Lunak, aplikasi Anda akan menjadi satu-satunya di " +"komidi putar 'unggulan'." diff --git a/help/meson.build b/help/meson.build new file mode 100644 index 0000000..f555cca --- /dev/null +++ b/help/meson.build @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# SPDX-FileCopyrightText: 2024 Sid + +help_files = [ + 'how-to-reinstall-a-web-app.page', + 'index.page', + 'legal.xml', + 'software-licensing.page', + 'software-metadata.page', +] + +help_media = [ + 'figures/app-context-bar.png', + 'figures/app-screenshot.png', + 'figures/carousel.png', + 'figures/install-webapp-from-gnome-web.png', + 'figures/scalable/license-community-built.svg', + 'figures/scalable/license-proprietary-and-special.svg', + 'figures/scalable/license-unknown.svg', + 'figures/scalable/links.svg', + 'figures/scalable/no-links.svg', + 'figures/scalable/symbolic/computer-fail-symbolic.svg', + 'figures/scalable/symbolic/contact-symbolic.svg', + 'figures/scalable/symbolic/donate-symbolic.svg', + 'figures/scalable/symbolic/help-link-symbolic.svg', + 'figures/scalable/symbolic/image-missing-symbolic.svg', + 'figures/scalable/symbolic/translations-symbolic.svg', + 'figures/scalable/symbolic/webpage-symbolic.svg', +] + +gnome.yelp (meson.project_name (), + sources: help_files, + media: help_media, + symlink_media: false, +) diff --git a/help/pt_BR/figures/app-context-bar.png b/help/pt_BR/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..e23173c2767ffe2b860d8dc1367a676b3a2a37f8 GIT binary patch literal 23915 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 literal 0 HcmV?d00001 diff --git a/help/pt_BR/pt_BR.po b/help/pt_BR/pt_BR.po new file mode 100644 index 0000000..a55fc77 --- /dev/null +++ b/help/pt_BR/pt_BR.po @@ -0,0 +1,1536 @@ +# Brazilian Portuguese translation for gnome-software. +# Copyright (C) 2024 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Rafael Fontenelle , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2024-08-29 06:30+0000\n" +"PO-Revision-Date: 2024-08-30 14:12-0300\n" +"Last-Translator: Rafael Fontenelle \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 46.1\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Rafael Fontenelle , 2024" + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Phaedrus Leeds" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Como reinstalar um Webapp" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "" +"Programas dá suporte ao gerenciamento de dois tipos de " +"aplicativos da web:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See README.md." +msgstr "" +"Aplicativos web para os quais o metainfo do AppStream foi distribuído com o " +"Programas. Veja o README.md." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" +"Aplicativos web que foram instalados usando GNOME Web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software " +"(when this functionality has been enabled by the distribution), whereas the " +"second type only show up in Software after they have been " +"installed via GNOME Web. If you uninstall such an app and want to reinstall " +"it, you must do so using GNOME Web." +msgstr "" +"O primeiro tipo é exibido como disponível para instalação no Programas (quando essa funcionalidade foi habilitada pela distribuição), enquanto " +"o segundo tipo só aparece no Programas após ter sido instalado " +"via GNOME Web. Se você desinstalar tal aplicativo e quiser reinstalá-lo, " +"você deve fazer isso usando o GNOME Web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "" +"Aqui estão as etapas para instalar um aplicativo web usando o GNOME Web:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as " +"shown in the image below." +msgstr "" +"Clique no botão Menu do aplicativo no canto " +"direto superior como mostrado na imagem abaixo." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This " +"should open the web app creation dialog." +msgstr "" +"Clique no item de menu Instalar como aplicativo web…" +". Isso deve abrir a caixa de diálogo de criação do aplicativo web." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install " +"the web app." +msgstr "" +"Clique no botão Criar para criar e instalar o " +"aplicativo web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" +"O aplicativo web agora deve aparecer na aba Instalados do Programas." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Programas" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "Creative Commons Atribuição Compartilhada Igual 3.0 Não Adaptada" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "Essa obra está licenciada sob uma licença <_:link-1/>." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Philip Withnall" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Introdução ao licenciamento de software" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Licenciamento de software" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Introdução" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the " +"freedoms you as a user have. If an app is free/open source software (FOSS), you have the freedom to use it, copy it, study and change its source " +"code. Proprietary software does not provide you with those freedoms. FOSS " +"software is often available for no charge, but this is not always true." +msgstr "" +"Os aplicativos podem ser “software livre/de código aberto” ou “privativo” " +"(também conhecido como “proprietário”). Isso afeta as liberdades que você, " +"como usuário, tem. Se um aplicativo for software livre/de código aberto " +"(FOSS), você tem a liberdade de usá-lo, copiá-lo, estudar e alterar " +"seu código-fonte. O software privativo não lhe fornece essas liberdades. O " +"software FOSS geralmente está disponível sem custo, mas isso nem sempre é " +"verdade." + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get " +"involved in its development, contributing features or translations to their " +"language and fixing bugs which affect them. They can audit the code and " +"check that changes to the software are not malicious. They can learn from " +"the source code and use it as the basis for their own FOSS applications." +msgstr "" +"Como o código-fonte está disponível para o software FOSS, os usuários podem " +"se envolver em seu desenvolvimento, contribuindo com recursos ou traduções " +"para seu idioma e corrigindo bugs que os afetam. Eles podem auditar o código " +"e verificar se as alterações no software não são maliciosas. Eles podem " +"aprender com o código-fonte e usá-lo como base para seus próprios " +"aplicativos FOSS." + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a " +"public good." +msgstr "" +"Os aplicativos FOSS são um bem público." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that " +"the developers of the app have your best interests in mind, and no conflicts " +"of interest." +msgstr "" +"Os aplicativos privativos não podem ser auditados por seus usuários, então " +"você deve confiar que os desenvolvedores do aplicativo têm seus melhores " +"interesses em mente e nenhum conflito de interesses." + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS " +"over proprietary software." +msgstr "" +"Leia mais sobre os benefícios do FOSS " +"sobre software privativo." + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Will Thompson" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Milan Crha" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Como o Programas usa metadados" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Metadados dos programas" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Capturas de tela" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an " +"application. This typically should include screenshots of various windows / " +"dialogs of the application, so the user would get a quick grasp of the " +"application’s features, look and feel etc." +msgstr "" +"O Programas exibe as capturas de tela na página de detalhes de um " +"aplicativo. Isso normalmente deve incluir capturas de tela de várias janelas/" +"diálogos do aplicativo, para que o usuário tenha uma noção rápida dos " +"recursos do aplicativo, aparência e comportamento, etc." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" +"Quando mais de uma captura de tela estiver presente no arquivo de metainfo " +"do aplicativo, o Programas mostrará as capturas de tela em um " +"carrossel." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any " +"screenshot, then a placeholder icon as below with No Screenshots will be displayed:" +msgstr "" +"Nos casos em que o arquivo de metainfo do aplicativo não contiver nenhuma " +"captura de tela, um ícone de preenchimento de espaço como o abaixo com " +"Sem capturas de tela será exibido:" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "" +"Placeholder icon might look different if you're using a custom icon theme." +msgstr "" +"O ícone de preenchimento de espaço pode parecer diferente se você estiver " +"usando um tema de ícone personalizado." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even " +"if Software shows screenshots for an app, it’s important to check " +"if these screenshots are up-to-date or outdated." +msgstr "" +"As capturas de tela podem ficar desatualizadas conforme a UI do aplicativo " +"muda. Então, mesmo que o Programas mostre capturas de tela para " +"um aplicativo, é importante verificar se essas capturas de tela estão " +"atualizadas ou desatualizadas." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "Você pode melhorar as informações de captura de tela do aplicativo:" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app " +"screenshots" +msgstr "" +"Como adicionar capturas " +"de tela ausentes do aplicativo" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Barra de contexto do aplicativo" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the " +"details page for an application, which display the following details." +msgstr "" +"A barra de contexto do aplicativo no Programas é uma coleção de " +"blocos na página de detalhes de um aplicativo, que exibe os seguintes " +"detalhes." + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Armazenamento" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Segurança" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Suporte a hardware" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Classificação por idade" + +#. (itstool) path: section/p +#. Translators: Refer below steps to localize +#. 'figures/app-context-bar.png' image: 1. Run 'gnome-software +#. --details=org.gnome.Software.desktop' in console (as normal user). 2. +#. This should launch the Software app and automatically switch to +#. Software app's details page. 3. It may take some time if some +#. background tasks are running. Wait for the app's details page to load. +#. 4. Scroll down to take the screenshot of the app context bar. +#: C/software-metadata.page:78 +msgid "This shows the app context bar for the Software app:" +msgstr "" +"Isso mostra a barra de contexto do aplicativo para o aplicativo " +"Programas:" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:79 +msgctxt "_" +msgid "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "" +"external ref='figures/app-context-bar.png' " +"md5='b7541be053a14dd7479043b4a59f9203'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:82 +msgid "" +"The tiles are displayed in the order listed above (starting with " +"Storage tile on the left)." +msgstr "" +"Os blocos são exibidos na ordem listada acima (começando com o bloco " +"Armazenamento à esquerda)." + +#. (itstool) path: section/p +#: C/software-metadata.page:83 +msgid "Each tile is covered in detail below." +msgstr "Cada bloco é abordado em detalhes abaixo." + +#. (itstool) path: section/title +#: C/software-metadata.page:87 +msgid "Storage" +msgstr "Armazenamento" + +#. (itstool) path: section/p +#: C/software-metadata.page:88 +msgid "" +"Software displays a storage tile on the details page for an " +"application. If the application is not installed, this displays the " +"estimated download size needed to install it. If the application is " +"installed, it displays the storage space used by the application." +msgstr "" +"O Programas exibe um bloco de armazenamento na página de detalhes " +"de um aplicativo. Se o aplicativo não estiver instalado, isso exibe o " +"tamanho estimado de download necessário para instalá-lo. Se o aplicativo " +"estiver instalado, ele exibirá o espaço de armazenamento usado pelo " +"aplicativo." + +#. (itstool) path: section/p +#: C/software-metadata.page:89 +msgid "" +"The sizes are calculated from data provided by the Software " +"backend (such as flatpak or an RPM), and are not specified in the metadata " +"provided by the application. There is nothing you can do to affect this tile " +"by editing an application’s metainfo file. It’s listed here for completeness." +msgstr "" +"Os tamanhos são calculados a partir de dados fornecidos pelo backend do " +"Programas (como flatpak ou um RPM) e não são especificados nos " +"metadados fornecidos pelo aplicativo. Não há nada que você possa fazer para " +"afetar este bloco editando o arquivo metainfo de um aplicativo. Ele está " +"listado aqui para fins de integridade." + +#. (itstool) path: section/title +#: C/software-metadata.page:93 +msgid "Safety" +msgstr "Segurança" + +#. (itstool) path: section/p +#: C/software-metadata.page:94 +msgid "" +"Software displays a safety tile on the details page for an " +"application. This summarizes information about whether the app can be " +"considered safe to install and run, or whether caution may be required " +"before trusting it." +msgstr "" +"Programas exibe um bloco de segurança na página de detalhes de um " +"aplicativo. Isso resume as informações sobre se o aplicativo pode ser " +"considerado seguro para instalar e executar, ou se é necessário ter cuidado " +"antes de confiar nele." + +#. (itstool) path: section/p +#: C/software-metadata.page:95 +msgid "" +"This tile combines information about the permissions which the app requests " +"when it runs (such as permission to read your files), with information about " +"how the app was developed. Free software applications, where the source code " +"is publicly readable, can be more secure than proprietary ones, as they can " +"be audited." +msgstr "" +"Este bloco combina informações sobre as permissões que o aplicativo solicita " +"quando é executado (como permissão para ler seus arquivos), com informações " +"sobre como o aplicativo foi desenvolvido. Aplicativos de software livre, " +"onde o código-fonte é publicamente legível, podem ser mais seguros do que os " +"privativofs, pois podem ser auditados." + +#. (itstool) path: section/p +#: C/software-metadata.page:96 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"permissions the app requests, plus some information about its license and " +"runtime." +msgstr "" +"A caixa de diálogo que aparece quando o bloco é clicado lista as diferentes " +"permissões que o aplicativo solicita, além de algumas informações sobre sua " +"licença e tempo de execução." + +#. (itstool) path: section/p +#: C/software-metadata.page:97 +msgid "You can improve the safety information:" +msgstr "Você pode melhorar as informações de segurança:" + +#. (itstool) path: item/p +#: C/software-metadata.page:100 +msgid "" +"How " +"to fix incorrect safety and permissions information" +msgstr "" +"Como " +"corrigir informações incorretas de segurança e permissões" + +#. (itstool) path: section/title +#: C/software-metadata.page:106 +msgid "Hardware support" +msgstr "Suporte a hardware" + +#. (itstool) path: section/p +#: C/software-metadata.page:107 +msgid "" +"Software displays a hardware support tile on the details page for " +"an application. This combines information about the hardware requirements of " +"the application, and the hardware capabilities of the computer, with the aim " +"of highlighting incompatibilities or missing requirements — or to indicate " +"that the application should work correctly with no incompatibilities." +msgstr "" +"Programas exibe um bloco de suporte a hardware na página de " +"detalhes de um aplicativo. Isso combina informações sobre os requisitos de " +"hardware do aplicativo e os recursos de hardware do computador, com o " +"objetivo de destacar incompatibilidades ou requisitos ausentes — ou para " +"indicar que o aplicativo deve funcionar corretamente sem incompatibilidades." + +#. (itstool) path: section/p +#: C/software-metadata.page:116 +msgid "" +"The code looks at the following hardware. More may be supported in future." +msgstr "" +"O código analisa o seguinte hardware. Mais pode ser suportado no futuro." + +#. (itstool) path: item/p +#: C/software-metadata.page:118 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "Se um touchpad, mouse ou teclado está presente/é necessário" + +#. (itstool) path: item/p +#: C/software-metadata.page:119 +msgid "Whether a gamepad is needed" +msgstr "Se um gamepad é necessário" + +#. (itstool) path: item/p +#: C/software-metadata.page:120 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "" +"O tamanho mínimo e recomendado de exibição para o qual o aplicativo pode ser " +"dimensionado" + +#. (itstool) path: section/p +#: C/software-metadata.page:123 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, " +"as they are often left disconnected due to not being needed for normal " +"computer use." +msgstr "" +"Não é possível detectar com segurança se um gamepad está presente, " +"pois eles geralmente são deixados desconectados por não serem necessários " +"para o uso normal do computador." + +#. (itstool) path: section/p +#: C/software-metadata.page:124 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"hardware requirements of the app, and whether any of them are not met." +msgstr "" +"A caixa de diálogo que aparece quando o bloco é clicado lista os diferentes " +"requisitos de hardware do aplicativo e se algum deles não foi atendido." + +#. (itstool) path: section/p +#: C/software-metadata.page:125 +msgid "You can improve the hardware information:" +msgstr "Você pode melhorar as informações de hardware:" + +#. (itstool) path: item/p +#: C/software-metadata.page:128 +msgid "" +"How to add missing " +"hardware information" +msgstr "" +"Como adicionar " +"informações de hardware ausentes" + +#. (itstool) path: section/title +#: C/software-metadata.page:134 +msgid "Age rating" +msgstr "Classificação por idade" + +#. (itstool) path: section/p +#: C/software-metadata.page:135 +msgid "" +"Software displays an age rating tile on the details page for an " +"application. This shows what age range the application should be suitable " +"for, based on different kinds of content which the application has declared " +"it contains. This information is summarized in a format similar to the game " +"or film rating certificates for your country." +msgstr "" +"Programas exibe um bloco de classificação por idade na página de " +"detalhes de um aplicativo. Isso mostra para qual faixa etária o aplicativo " +"deve ser adequado, com base em diferentes tipos de conteúdo que o aplicativo " +"declarou conter. Essas informações são resumidas em um formato semelhante " +"aos certificados de classificação de jogos ou filmes do seu país." + +#. (itstool) path: section/p +#: C/software-metadata.page:136 +msgid "" +"For example, this will highlight whether a game contains violence, or " +"whether an application contains in-app advertising." +msgstr "" +"Por exemplo, isso destacará se um jogo contém violência ou se um aplicativo " +"contém publicidade no aplicativo." + +#. (itstool) path: section/p +#: C/software-metadata.page:137 +msgid "" +"The dialog which appears when the tile is clicked lists the different types " +"of content in the application and how severe that content is." +msgstr "" +"A caixa de diálogo que aparece quando o bloco é clicado lista os diferentes " +"tipos de conteúdo no aplicativo e quão grave esse conteúdo é." + +#. (itstool) path: section/p +#: C/software-metadata.page:138 +msgid "You can improve the age rating information:" +msgstr "Você pode melhorar as informações de classificação por idade:" + +#. (itstool) path: item/p +#: C/software-metadata.page:141 +msgid "" +"How to add " +"missing content rating information" +msgstr "" +"Como adicionar " +"informações de classificação de conteúdo ausentes" + +#. (itstool) path: section/title +#: C/software-metadata.page:147 +msgid "License" +msgstr "Licença" + +#. (itstool) path: section/p +#: C/software-metadata.page:150 +msgid "" +"Software displays a tile indicating whether an application is " +"free software or whether its license is " +"proprietary, special or unknown. This tile includes more detailed " +"information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" +"Programas exibe um bloco indicando se um aplicativo é software livre ou se sua licença " +"é proprietária, especial ou desconhecida. Este bloco inclui informações mais " +"detalhadas sobre a licença do projeto. Este bloco também lista alguns dos " +"benefícios do software livre. Saiba mais" + +#. (itstool) path: section/p +#: C/software-metadata.page:151 +msgid "" +"Sometimes the license information isn’t correct for an application, and " +"hence an application which is actually free software will be shown as " +"‘proprietary’. Similarly, sometimes the license information is unknown." +msgstr "" +"Às vezes, as informações de licença não estão corretas para um aplicativo e, " +"portanto, um aplicativo que é realmente software livre será mostrado como " +"‘privativo’. Da mesma forma, às vezes as informações da licença são " +"desconhecidas." + +#. (itstool) path: section/p +#: C/software-metadata.page:152 +msgid "" +"Software highlights free and open-source licenses in green, " +"proprietary and special licenses in yellow as shown here. Unknown licenses " +"are highlighted in grey." +msgstr "" +"Programas realça licenças livres e de código aberto em verde, " +"licenças privativas e especiais em amarelo, como mostrado aqui. Licenças " +"desconhecidas são destacadas em cinza." + +#. (itstool) path: section/p +#: C/software-metadata.page:153 +msgid "You can add or improve the license information:" +msgstr "Você pode adicionar ou melhorar as informações da licença:" + +#. (itstool) path: item/p +#: C/software-metadata.page:156 +msgid "" +"How to fix " +"incorrect licensing information" +msgstr "" +"Como corrigir " +"informações incorretas de licenciamento" + +#. (itstool) path: section/title +#: C/software-metadata.page:162 +msgid "Links" +msgstr "Links" + +#. (itstool) path: section/p +#: C/software-metadata.page:164 +msgid "" +"Software displays a list of application resource links in the " +"link tile. They are as follows:" +msgstr "" +"Programas exibe uma lista de links de recursos do aplicativo no " +"bloco de links. Eles são os seguintes:" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Website link" +msgstr "Link do site" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Donation link" +msgstr "Link de doação" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Translation contribution link" +msgstr "Link de contribuição com tradução" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Bug reporting link" +msgstr "Link de relatório de bug" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Help link" +msgstr "Link de ajuda" + +#. (itstool) path: td/p +#: C/software-metadata.page:188 +msgid "Contact link" +msgstr "Link de contato" + +#. (itstool) path: section/p +#: C/software-metadata.page:191 +msgid "" +"Some or all of these links may be present depending on whether they are " +"listed in the application’s metainfo file." +msgstr "" +"Alguns ou todos esses links podem estar presentes, dependendo se estão " +"listados no arquivo de metainfo do aplicativo." + +#. (itstool) path: section/p +#: C/software-metadata.page:192 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the " +"following tile with a question mark will be displayed." +msgstr "" +"Nos casos em que o arquivo de metainfo do aplicativo não contém nenhum link, " +"o seguinte bloco com um ponto de interrogação será exibido." + +#. (itstool) path: section/p +#: C/software-metadata.page:194 +msgid "You can improve the links:" +msgstr "Você pode melhorar os links:" + +#. (itstool) path: item/p +#: C/software-metadata.page:197 +msgid "" +"How to add missing links" +msgstr "" +"Como adicionar links ausentes" + +#. (itstool) path: section/title +#: C/software-metadata.page:203 +msgid "Carousel tile" +msgstr "Bloco de Carrossel" + +#. (itstool) path: section/p +#: C/software-metadata.page:205 +msgid "" +"Applications which are featured by Software are displayed in a " +"carousel at the top of the main window as shown here. Each carousel tile has " +"a background color which is automatically extracted from the application’s " +"icon. Sometimes this background color is not quite right for the application " +"and needs to be specified explicitly by the application developer." +msgstr "" +"Aplicativos que são postos em destaque no Programas são exibidos " +"em um carrossel na parte superior da janela principal como mostrado aqui. " +"Cada bloco de carrossel tem uma cor de fundo que é automaticamente extraída " +"do ícone do aplicativo. Às vezes, essa cor de fundo não é muito adequada " +"para o aplicativo e precisa ser especificada explicitamente pelo " +"desenvolvedor do aplicativo." + +#. (itstool) path: section/p +#: C/software-metadata.page:206 +msgid "" +"The set of applications which are featured is decided by the Linux " +"distribution maintainers." +msgstr "" +"O conjunto de aplicativos que são apresentados é decidido pelos mantenedores " +"da distribuição Linux." + +#. (itstool) path: section/p +#: C/software-metadata.page:207 +msgid "You can improve the carousel tile:" +msgstr "Você pode melhorar o bloco de carrossel:" + +#. (itstool) path: item/p +#: C/software-metadata.page:210 +msgid "" +"How to set " +"the carousel tile background color" +msgstr "" +"Como definir " +"a cor de fundo do bloco de carrossel" + +#. (itstool) path: section/title +#: C/software-metadata.page:216 +msgid "Where metadata comes from" +msgstr "De onde vêm os metadados" + +#. (itstool) path: section/p +#: C/software-metadata.page:217 +msgid "" +"The metadata used to specify what hardware a piece of software requires, " +"what ages of user it is suitable for, and factors which contribute to how " +"safe it might be to install, all come from the metainfo file for that " +"software." +msgstr "" +"Os metadados usados ​​para especificar qual hardware um software requer, para " +"quais idades de usuários ele é adequado e os fatores que contribuem para o " +"quão seguro ele pode ser para instalar, todos vêm do arquivo metainfo para " +"esse software." + +#. (itstool) path: section/p +#: C/software-metadata.page:218 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream " +"specification." +msgstr "" +"O arquivo metainfo é um arquivo XML. Seu formato de arquivo é especificado " +"na especificação AppStream." + +#. (itstool) path: section/p +#: C/software-metadata.page:219 +msgid "" +"See the metainfo file for GNOME Files " +"app." +msgstr "" +"Veja o arquivo metainfo para o aplicativo " +"Arquivos do GNOME." + +#. (itstool) path: note/p +#: C/software-metadata.page:221 +msgid "appdata is the older term for metainfo." +msgstr "appdata é o termo mais antigo para metainfo." + +#. (itstool) path: section/title +#: C/software-metadata.page:226 +msgid "What happens if metadata is missing" +msgstr "O que acontece se metadados estiverem ausentes" + +#. (itstool) path: section/p +#: C/software-metadata.page:227 +msgid "" +"If some metadata is missing for an application, Software can only " +"guess what it might be, and hence can’t present much information in its " +"interfaces. The guesses Software makes are based on the fact that " +"most software is designed for desktop computers." +msgstr "" +"Se alguns metadados estiverem ausentes em um aplicativo, Programas só pode adivinhar o que pode ser e, portanto, não consegue apresentar " +"muitas informações em suas interfaces. Os palpites que Programas " +"faz são baseados no fato de que a maioria dos softwares é projetada para " +"computadores desktop." + +#. (itstool) path: section/p +#: C/software-metadata.page:228 +msgid "" +"You can help improve the metadata for an application!" +msgstr "" +"Você pode ajudar a melhorar os metadados de um " +"aplicativo!" + +#. (itstool) path: section/title +#: C/software-metadata.page:232 +msgid "How to contribute missing information" +msgstr "Como contribuir com informações ausentes" + +#. (itstool) path: section/p +#: C/software-metadata.page:233 +msgid "" +"If you find that an app’s page is missing information or has incorrect " +"information, you can contribute in one of the two ways:" +msgstr "" +"Se você descobrir que a página de um aplicativo está faltando informações ou " +"tem informações incorretas, você pode contribuir de uma das duas maneiras:" + +#. (itstool) path: item/p +#: C/software-metadata.page:236 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug " +"tracker, so the app developer can fix it." +msgstr "" +"Você pode relatar os metadados ausentes/incorretos ao rastreador de bugs do " +"respectivo aplicativo, para que o desenvolvedor do aplicativo possa corrigi-" +"los." + +#. (itstool) path: item/p +#: C/software-metadata.page:239 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How to guide below on how to do that." +msgstr "" +"Você pode corrigir os metadados ausentes/incorretos você mesmo. Veja o aba " +"Como fazer abaixo sobre como fazer isso." + +#. (itstool) path: section/p +#: C/software-metadata.page:243 +msgid "" +"For both, you first need to find the app’s project page. The link to the " +"project page should typically be available in the app’s page as shown here. If not, you will need to find it with " +"a simple search on Google." +msgstr "" +"Para ambos, primeiro você precisa encontrar a página do projeto do " +"aplicativo. O link para a página do projeto normalmente deve estar " +"disponível na página do aplicativo conforme mostrado " +"aqui. Caso contrário, você precisará encontrá-lo com uma simples " +"pesquisa no Google." + +#. (itstool) path: section/p +#: C/software-metadata.page:245 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" +"Os aplicativos são normalmente hospedados no GitLab ou GitHub. Por exemplo, os aplicativos GNOME são hospedados em " +"gitlab.gnome." +"org." + +#. (itstool) path: section/title +#: C/software-metadata.page:249 +msgid "How to add missing app screenshots" +msgstr "Como adicionar capturas de tela de aplicativos ausentes" + +#. (itstool) path: section/p +#: C/software-metadata.page:250 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s <component> in its " +"metainfo file." +msgstr "" +"As informações de captura de tela de um aplicativo são armazenadas no " +"elemento <" +"screenshots> dentro do <component> do " +"aplicativo em seu arquivo metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:251 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots " +"should ideally be in the PNG format with 16:9 aspect ratio and minimum width " +"of 620 pixels." +msgstr "" +"O número recomendado de capturas de tela para um aplicativo é entre 5 e 10. " +"As capturas de tela devem estar idealmente no formato PNG com proporção de " +"16:9 e largura mínima de 620 pixels." + +#. (itstool) path: section/p +#: C/software-metadata.page:252 +msgid "" +"For example, here are the screenshot entries for the Software app:" +msgstr "" +"Por exemplo, aqui estão as entradas de captura de tela para o aplicativo " +"Programas:" + +#. (itstool) path: section/code +#: C/software-metadata.page:253 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:267 +msgid "How to fix incorrect safety and permissions information" +msgstr "Como corrigir informações incorretas de segurança e permissões" + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"The safety and permissions information for an application comes from " +"different sources depending on how the application is packaged. For " +"traditionally packaged applications, for example in RPM or DEB format, there " +"is no safety or permissions information available and nothing can be done to " +"add it to an application." +msgstr "" +"As informações de segurança e permissões para um aplicativo vêm de " +"diferentes fontes, dependendo de como o aplicativo é empacotado. Para " +"aplicativos empacotados tradicionalmente, por exemplo, no formato RPM ou " +"DEB, não há informações de segurança ou permissões disponíveis e nada pode " +"ser feito para adicioná-las a um aplicativo." + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, specifying what holes in the sandbox the application requires. Each " +"of these holes typically contributes to lowering the displayed safety level " +"of the application in Software — moving it from ‘safe’ to " +"‘potentially unsafe’ to ‘unsafe’." +msgstr "" +"Para aplicativos flatpak, as informações vêm do manifesto flatpak do " +"aplicativo, especificando quais buracos no isolamento (sandbox) o aplicativo " +"requer. Cada um desses buracos normalmente contribui para diminuir o nível " +"de segurança exibido do aplicativo em Programas — movendo-o de " +"‘seguro’ para ‘potencialmente inseguro’ para ‘inseguro’." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 +msgid "" +"In order to improve the safety level of an application, its sandboxing must " +"be made as tight as possible, by removing sandbox permissions where " +"they’re not needed, and using portals instead of sandbox " +"permissions where possible. Use of portals does not lower the displayed " +"safety level of an application in Software." +msgstr "" +"Para melhorar o nível de segurança de um aplicativo, seu isolamento de " +"sandbox deve ser tornado o mais fechado possível, removendo permissões de sandbox onde elas não são necessárias, e usando " +"portais em vez de permissões de sandbox quando " +"possível. O uso de portais não diminui o nível de segurança exibido de um " +"aplicativo no Programas." + +#. (itstool) path: section/p +#: C/software-metadata.page:271 +msgid "" +"For example, if the application requests read/write access to the full file " +"system (--filesystem=host), does it actually need that, or does " +"it only need to access files in a few specific locations? If so, the file portal could be used, or more specific file system permissions could be specified." +msgstr "" +"Por exemplo, se o aplicativo solicitar acesso de leitura/gravação ao sistema " +"de arquivos completo (--filesystem=host), ele realmente precisa " +"disso ou precisa acessar arquivos apenas em alguns locais específicos? Se " +"sim, o portal de arquivos pode ser usado, ou " +"permissões do sistema de arquivos mais " +"específicas podem ser especificadas." + +#. (itstool) path: section/p +#: C/software-metadata.page:272 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a " +"fallback, without using special X11 features, could it use --" +"socket=fallback-x11 rather than --socket=x11?" +msgstr "" +"Se o aplicativo funciona no Wayland e precisar funcionar no X11 apenas como " +"fallback, sem usar recursos especiais do X11, ele pode usar --" +"socket=fallback-x11 em vez de --socket=x11?" + +#. (itstool) path: section/p +#: C/software-metadata.page:273 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be " +"added here in future." +msgstr "" +"Orientações sobre permissões específicas ou outros formatos de empacotamento " +"podem ser adicionadas aqui no futuro." + +#. (itstool) path: section/p +#: C/software-metadata.page:274 C/software-metadata.page:312 +msgid "Further reading:" +msgstr "Leitura adicional:" + +#. (itstool) path: section/title +#: C/software-metadata.page:289 +msgid "How to add missing hardware information" +msgstr "Como adicionar informações de hardware ausentes" + +#. (itstool) path: section/p +#: C/software-metadata.page:290 +msgid "" +"The hardware information for an application is stored in the <requires>, <recommends>" +" and <supports> elements within the " +"application’s <component> in its metainfo file." +msgstr "" +"As informações de hardware de um aplicativo são armazenadas nos elementos " +"<requires>, <" +"recommends> e <supports> dentro do " +"<component> do aplicativo em seu arquivo metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:291 +msgid "" +"Software understands the <" +"control> and <display_length> elements." +msgstr "" +"Programas entende os elementos <control> e <display_length>." + +#. (itstool) path: section/p +#: C/software-metadata.page:292 +msgid "" +"See this blog post or " +"this blog post for examples of metadata." +msgstr "" +"Consulte esta postagem " +"de blog ou esta postagem de blog para " +"obter exemplos de metadados." + +#. (itstool) path: section/title +#: C/software-metadata.page:296 +msgid "How to add missing content rating information" +msgstr "Como adicionar informações de classificação de conteúdo ausentes" + +#. (itstool) path: section/p +#: C/software-metadata.page:297 +msgid "" +"The content rating information for an application is stored in the <content_rating> element " +"within the application’s <component> in its metainfo file." +msgstr "" +"As informações de classificação de conteúdo para um aplicativo são " +"armazenadas no elemento <" +"content_rating> dentro do <component> do " +"aplicativo em seu arquivo metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:298 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If " +"the <content_rating> element is not specified, the " +"application’s content rating is unknown. If it’s specified but empty, the " +"application has no content which might be unsuitable for any audience." +msgstr "" +"Os aplicativos devem usar o padrão OARS 1.1 para preencher este elemento. Se " +"o elemento <content_rating> não for especificado, a " +"classificação de conteúdo do aplicativo será desconhecida. Se for " +"especificado, mas estiver vazio, o aplicativo não terá conteúdo que possa " +"ser inadequado para qualquer público." + +#. (itstool) path: section/p +#: C/software-metadata.page:299 +msgid "" +"Use the OARS generator " +"to produce suitable content rating information for an application." +msgstr "" +"Use o gerador de OARS " +"para produzir informações de classificação de conteúdo adequadas para um " +"aplicativo." + +#. (itstool) path: section/title +#: C/software-metadata.page:303 +msgid "How to fix incorrect licensing information" +msgstr "Como corrigir informações de licenciamento incorretas" + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"The licensing information for an application is stored in the <project_license> " +"element within the application’s <component> in its " +"metainfo file." +msgstr "" +"As informações de licenciamento de um aplicativo são armazenadas no elemento " +"<project_license> dentro do <component> do aplicativo em seu arquivo " +"metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:305 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license " +"for the project. This should typically be the license of the code, and not " +"include the license of the documentation or ancillary content." +msgstr "" +"O conteúdo neste elemento deve ser uma expressão SPDX que descreve a licença ‘principal’ " +"para o projeto. Normalmente, deve ser a licença do código e não incluir a " +"licença da documentação ou conteúdo auxiliar." + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of " +"multiple licenses, which are all FSF or OSI approved, the application is considered ‘free software’ " +"and the license tile says so. Otherwise, it’s considered ‘proprietary’." +msgstr "" +"Se a expressão SPDX for uma licença única, ou uma combinação de várias " +"licenças, que são todas aprovadas " +"pela FSF ou OSI, o aplicativo é considerado ‘software livre’ e o " +"bloco de licença diz isso. Caso contrário, é considerado ‘privativo’." + +#. (itstool) path: section/p +#: C/software-metadata.page:307 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it " +"shouldn’t be, it’s likely that the <project_license> " +"element includes the documentation license for the project. Remove it." +msgstr "" +"Se um aplicativo estiver sendo exibido como ‘privativo’ quando você acha que " +"não deveria ser, é provável que o elemento <project_license> inclua a licença de documentação para o projeto. Remova-o." + +#. (itstool) path: section/p +#: C/software-metadata.page:308 +msgid "" +"For example, change the license metadata from:" +msgstr "" +"Por exemplo, altere os metadados da licença de:" + +#. (itstool) path: section/code +#: C/software-metadata.page:309 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:310 +msgid "to" +msgstr "para" + +#. (itstool) path: section/code +#: C/software-metadata.page:311 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +#. (itstool) path: item/p +#: C/software-metadata.page:315 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" +"Não coloque (de forma geral) a licença de documentação no " +"appdata" + +#. (itstool) path: section/title +#: C/software-metadata.page:324 +msgid "How to add missing links" +msgstr "Como adicionar links ausentes" + +#. (itstool) path: section/p +#: C/software-metadata.page:325 +msgid "" +"The links for an application are stored as <url> elements within the application’s " +"<component> in its metainfo file." +msgstr "" +"Os links para um aplicativo são armazenados como elementos <url> dentro do <" +"component> do aplicativo em seu arquivo metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:326 +msgid "" +"Add as many of the link types documented in the appstream specification as are available for the application. " +"If no suitable page exists for a given link type, it doesn’t have to be " +"included." +msgstr "" +"Adicione quantos tipos de link documentados na especificação do appstream estiverem disponíveis para o " +"aplicativo. Se nenhuma página adequada existir para um determinado tipo de " +"link, ele não precisa ser incluído." + +#. (itstool) path: section/p +#: C/software-metadata.page:327 +msgid "" +"For example, here are the resource links for the Software app:" +msgstr "" +"Por exemplo, aqui estão os links de recursos para o aplicativo " +"Programas:" + +#. (itstool) path: section/code +#: C/software-metadata.page:328 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:339 +msgid "How to set the carousel tile background color" +msgstr "Como definir a cor de fundo do bloco de carrossel" + +#. (itstool) path: section/p +#: C/software-metadata.page:340 +msgid "" +"The carousel tile background color is normally extracted automatically from " +"the application’s icon. If that color is unsatisfactory, however, it can be " +"overridden by using the appstream’s <" +"branding/> element with declared colors (since 47.x " +"series). The advantage is that more clients can use the colors." +msgstr "" +"A cor de fundo do bloco de carrossel normalmente é extraída automaticamente " +"do ícone do aplicativo. Se essa cor for insatisfatória, no entanto, ela pode " +"ser substituída usando o elemento <branding/" +"> do appstream com cores declaradas (desde a série 47.x). A " +"vantagem é que mais clientes podem usar as cores." + +#. (itstool) path: section/p +#: C/software-metadata.page:341 +msgid "For example, here are some branding entries:" +msgstr "Por exemplo, aqui estão algumas entradas de “branding”:" + +#. (itstool) path: section/code +#: C/software-metadata.page:342 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:348 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses the better color for the theme on its own." +msgstr "" +"Observe que o atributo scheme_preference é ignorado, o \n" +"Programas escolhe a melhor cor para o tema por conta própria." + +#. (itstool) path: section/p +#: C/software-metadata.page:350 +msgid "" +"There is left, for backward compatibility, the possibility to add the " +"following XML to the application’s metainfo <component> " +"element:" +msgstr "" +"Resta, para compatibilidade com versões anteriores, a possibilidade de " +"adicionar o seguinte XML ao elemento metainfo <component> " +"do aplicativo:" + +#. (itstool) path: section/code +#: C/software-metadata.page:351 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:355 +msgid "but the <branding/> element has a precedence." +msgstr "mas o elemento <branding/> tem precedência." + +#. (itstool) path: section/p +#: C/software-metadata.page:356 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format " +"GVariant with type a(yyy), and represents an unordered set of " +"key colors for the application. Each element of the set is a color in RGB " +"form ranging from (0, 0, 0) to (255, 255, 255)." +msgstr "" +"O valor de GnomeSoftware::key-colors é um GVariant de formato " +"de texto com o tipo a(yyy) e representa um conjunto não " +"ordenado de cores-chave para o aplicativo. Cada elemento do conjunto é uma " +"cor no formato RGB variando de (0, 0, 0) a (255, 255, " +"255)." + +#. (itstool) path: section/p +#: C/software-metadata.page:357 +msgid "Colors should be chosen so that they:" +msgstr "As cores devem ser escolhidas de modo que:" + +#. (itstool) path: item/p +#: C/software-metadata.page:360 +msgid "" +"Are identifiable to the application, matching the application’s branding in " +"some way, if possible." +msgstr "" +"Sejam identificáveis ​​ao aplicativo, combinando com a marca do aplicativo de " +"alguma forma, se possível." + +#. (itstool) path: item/p +#: C/software-metadata.page:363 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used " +"as a background behind it, the icon can be distinguished." +msgstr "" +"Contraste com a borda do ícone do aplicativo, para que, quando forem usadas " +"como plano de fundo atrás dele, o ícone possa ser distinguido." + +#. (itstool) path: item/p +#: C/software-metadata.page:366 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and in its dark variant (#eeeeec). This generally means " +"choosing a color with a medium level of brightness." +msgstr "" +"Contraste com a cor do texto em primeiro plano no tema Adwaita " +"(#2e3436) e em sua variante escura (#eeeeec). Isso " +"geralmente significa escolher uma cor com um nível médio de brilho." + +#. (itstool) path: item/p +#: C/software-metadata.page:369 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" +"O contraste pode ser verificado usando o aplicativo Contraste." + +#. (itstool) path: section/p +#: C/software-metadata.page:372 +msgid "" +"At least one color should be specified. More can be specified if one color " +"can’t satisfy all the requirements above, and Software will " +"choose the most appropriate to use in the carousel tile. If exactly one " +"color is specified, its brightness and saturation may be modified to improve " +"contrast with the foreground color. If more than one color is specified, the " +"one with the best contrast with the foreground color will be chosen, and its " +"brightness and saturation will not be modified." +msgstr "" +"Pelo menos uma cor deve ser especificada. Mais podem ser especificadas se " +"uma cor não puder satisfazer todos os requisitos acima, e o Programas escolherá a mais apropriada para uso no bloco do carrossel. Se " +"exatamente uma cor for especificada, seu brilho e saturação podem ser " +"modificados para melhorar o contraste com a cor de primeiro plano. Se mais " +"de uma cor for especificada, aquela com o melhor contraste com a cor de " +"primeiro plano será escolhida, e seu brilho e saturação não serão " +"modificados." + +#. (itstool) path: section/title +#: C/software-metadata.page:376 +msgid "How to test carousel tile background color changes" +msgstr "Como testar as alterações de cor de fundo do bloco de carrossel" + +#. (itstool) path: section/p +#: C/software-metadata.page:377 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" +"Modifique o arquivo metainfo para seu aplicativo e execute o Programas com:" + +#. (itstool) path: section/p +#: C/software-metadata.page:378 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml," +"icon=/path/to/app/icon.png" +msgstr "" +"gnome-software --show-metainfo=/caminho/do/app.metainfo.xml," +"icon=/caminho/do/ícone/do/aplicativo.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:379 +msgid "" +"The details page for your application will be shown. If you navigate back to " +"the overview page of Software, your application will be the only " +"one in the ‘featured’ carousel." +msgstr "" +"A página de detalhes do seu aplicativo será exibida. Se você navegar de " +"volta para a página de visão geral de Programas, seu aplicativo " +"será o único no carrossel de ‘em destaque’." diff --git a/help/ru/figures/app-context-bar.png b/help/ru/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..1220920d5b67332039207ab60ea8d1b160b9c611 GIT binary patch literal 23927 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 k>E7lACrREGQaV|SMN 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 QFiD+cyKS#cu9Zi`UqUzk(f|Me literal 0 HcmV?d00001 diff --git a/help/ru/ru.po b/help/ru/ru.po new file mode 100644 index 0000000..17fc787 --- /dev/null +++ b/help/ru/ru.po @@ -0,0 +1,1530 @@ +# Russian translation for gnome-software. +# Copyright (C) 2024 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Sergej A. , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2024-09-26 22:30+0000\n" +"PO-Revision-Date: 2024-09-27 23:15+1000\n" +"Last-Translator: Ser82-png \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 3.0.1\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Ser82-png , 2024" + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Phaedrus Leeds" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Как переустановить веб-приложение" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "" +"Центр приложений поддерживает управление двумя типами веб-" +"приложений:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See README.md." +msgstr "" +"Веб-приложения, для которых AppStream metainfo поставляется с Центром " +"приложений. Подробнее смотрите в README.md." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" +"Веб-приложения, которые были установлены с помощью GNOME Web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software " +"(when this functionality has been enabled by the distribution), whereas the " +"second type only show up in Software after they have been " +"installed via GNOME Web. If you uninstall such an app and want to reinstall " +"it, you must do so using GNOME Web." +msgstr "" +"Первый тип приложений отображается в Центре приложений как " +"доступный для установки (если эта функция включена в дистрибутиве), в то " +"время как второй тип отображается в Центре приложений только " +"после того, как приложения будут установлены через GNOME Web. Если вы " +"удалили такое приложение и хотите установить его повторно, вы должны сделать " +"это с помощью GNOME Web." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "Шаги по установке веб-приложения с помощью GNOME Web:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as " +"shown in the image below." +msgstr "" +"Нажмите в приложении на кнопку Меню в правом " +"верхнем углу, как показано на рисунке ниже." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This " +"should open the web app creation dialog." +msgstr "" +"Нажмите на пункт меню Установить как веб-" +"приложение.... Это должно открыть диалоговое окно создания веб-" +"приложения." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install " +"the web app." +msgstr "" +"Нажмите кнопку Создать, чтобы создать и " +"установить веб-приложение." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" +"Теперь веб-приложение должно появиться на вкладке Установлено Центра приложений." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Центр приложений" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "Это руководство распространяется под лицензией <_:link-1/>." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Philip Withnall" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Введение в лицензирование программного обеспечения" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Лицензирование программного обеспечения" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Введение" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the " +"freedoms you as a user have. If an app is free/open source software (FOSS), you have the freedom to use it, copy it, study and change its source " +"code. Proprietary software does not provide you with those freedoms. FOSS " +"software is often available for no charge, but this is not always true." +msgstr "" +"Приложения могут быть «свободными/с открытым исходным кодом» или " +"«проприетарными». Это накладывает соответствующие ограничения на " +"использования данного программного обеспечения. Если приложение является " +"свободным/с открытым исходным кодом программным " +"обеспечением (FOSS), вы можете свободно использовать его, копировать, " +"изучать и изменять исходный код. Несвободное программное обеспечение не " +"предоставляет вам таких возможностей. Программное обеспечение FOSS часто (но " +"не всегда) доступно бесплатно." + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get " +"involved in its development, contributing features or translations to their " +"language and fixing bugs which affect them. They can audit the code and " +"check that changes to the software are not malicious. They can learn from " +"the source code and use it as the basis for their own FOSS applications." +msgstr "" +"Поскольку исходный код программного обеспечения FOSS является доступным, " +"пользователи могут принять участие в его разработке добавляя новые функции, " +"переводы на свой язык и исправляя найденные ошибки. Они могут провести аудит " +"кода и убедиться, что изменения в программном обеспечении не являются " +"вредоносными. Они могут изучать исходный код и использовать его в качестве " +"основы для своих собственных приложений FOSS." + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a " +"public good." +msgstr "" +"Приложения FOSS являются общественным благом." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that " +"the developers of the app have your best interests in mind, and no conflicts " +"of interest." +msgstr "" +"Проприетарные приложения не могут быть проверены пользователями, поэтому вы " +"должны быть уверены в том, что разработчики таких приложений заботятся о " +"ваших интересах и не допускают конфликта интересов." + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS " +"over proprietary software." +msgstr "" +"Подробнее о преимуществах FOSS по " +"сравнению с проприетарным программным обеспечением." + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Will Thompson" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Milan Crha" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Как Центр приложений использует метаданные" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Метаданные программного обеспечения" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Снимки экрана" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an " +"application. This typically should include screenshots of various windows / " +"dialogs of the application, so the user would get a quick grasp of the " +"application’s features, look and feel etc." +msgstr "" +"В Центре приложений на странице сведений о приложении расположены " +"скриншоты. Обычно это снимки различных окон/диалоговых окон приложения. Они " +"предназначены для того, чтобы пользователь мог быстро ознакомиться с " +"функциями приложения, его внешним видом и т.д." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" +"Если в файле metainfo приложения присутствует более одного снимка, то " +"Центр приложений будет показывать эти изображения в виде карусели." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any " +"screenshot, then a placeholder icon as below with No Screenshots will be displayed:" +msgstr "" +"В тех случаях, когда файл metainfo приложения не содержит снимков, будет " +"отображён значок-заполнитель, как показано ниже, с надписью Нет " +"снимков экрана:" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "" +"Placeholder icon might look different if you're using a custom icon theme." +msgstr "" +"Значок-заполнитель может выглядеть иначе, если вы используете другую тему " +"значков." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even " +"if Software shows screenshots for an app, it’s important to check " +"if these screenshots are up-to-date or outdated." +msgstr "" +"По мере изменения пользовательского интерфейса скриншоты приложения могут " +"устаревать. Поэтому, даже если в Центре приложений имеются снимки " +"приложения, важно проверить, являются ли они актуальными или уже устарели." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "Вы можете улучшить информационные скриншоты приложения:" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app " +"screenshots" +msgstr "" +"Как добавить " +"отсутствующие скриншоты приложения" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Контекстная панель приложения" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the " +"details page for an application, which display the following details." +msgstr "" +"Контекстная панель в Центре приложений представляет собой набор " +"плиток на странице сведений о приложении, которые отображают приведённые " +"ниже сведения." + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Хранилище" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Безопасность" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Поддержка оборудования" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Возрастной рейтинг" + +#. (itstool) path: section/p +#. Translators: Refer below steps to localize +#. 'figures/app-context-bar.png' image: 1. Run 'gnome-software +#. --details=org.gnome.Software.desktop' in console (as normal user). 2. +#. This should launch the Software app and automatically switch to +#. Software app's details page. 3. It may take some time if some +#. background tasks are running. Wait for the app's details page to load. +#. 4. Scroll down to take the screenshot of the app context bar. +#: C/software-metadata.page:78 +msgid "This shows the app context bar for the Software app:" +msgstr "" +"Здесь показан пример контекстной панели для Центра приложений:" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:79 +msgctxt "_" +msgid "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:82 +msgid "" +"The tiles are displayed in the order listed above (starting with " +"Storage tile on the left)." +msgstr "" +"Плитки отображаются в указанном выше порядке (начиная с плитки " +"Хранилище)." + +#. (itstool) path: section/p +#: C/software-metadata.page:83 +msgid "Each tile is covered in detail below." +msgstr "Подробное описание каждой плитки приведено ниже." + +#. (itstool) path: section/title +#: C/software-metadata.page:87 +msgid "Storage" +msgstr "Хранилище" + +#. (itstool) path: section/p +#: C/software-metadata.page:88 +msgid "" +"Software displays a storage tile on the details page for an " +"application. If the application is not installed, this displays the " +"estimated download size needed to install it. If the application is " +"installed, it displays the storage space used by the application." +msgstr "" +"В Центре приложений на странице сведений о приложении " +"отображается плитка с информацией об объёме дискового пространства. Если " +"приложение не установлено - показан предполагаемый объём загрузки, " +"необходимый для его установки. Если приложение установлено - объём дискового " +"пространства, используемый приложением." + +#. (itstool) path: section/p +#: C/software-metadata.page:89 +msgid "" +"The sizes are calculated from data provided by the Software " +"backend (such as flatpak or an RPM), and are not specified in the metadata " +"provided by the application. There is nothing you can do to affect this tile " +"by editing an application’s metainfo file. It’s listed here for completeness." +msgstr "" +"Размеры рассчитываются на основе данных, предоставляемых Центру " +"приложений бэкендем (например, flatpak или RPM), и не могут быть " +"указаны в метаданных приложения. Вы не можете повлиять на эту плитку, " +"отредактировав файл metainfo приложения. Она приведена здесь только для " +"полноты картины." + +#. (itstool) path: section/title +#: C/software-metadata.page:93 +msgid "Safety" +msgstr "Безопасность" + +#. (itstool) path: section/p +#: C/software-metadata.page:94 +msgid "" +"Software displays a safety tile on the details page for an " +"application. This summarizes information about whether the app can be " +"considered safe to install and run, or whether caution may be required " +"before trusting it." +msgstr "" +"В Центре приложений на странице сведений о приложении " +"отображается плитка с информацией о безопасности. Здесь содержится краткая " +"информация о том, можно ли считать приложение безопасным для установки и " +"запуска и следует ли проявлять осторожность, прежде чем полагаться на него." + +#. (itstool) path: section/p +#: C/software-metadata.page:95 +msgid "" +"This tile combines information about the permissions which the app requests " +"when it runs (such as permission to read your files), with information about " +"how the app was developed. Free software applications, where the source code " +"is publicly readable, can be more secure than proprietary ones, as they can " +"be audited." +msgstr "" +"В этой плитке объединена информация о разрешениях, запрашиваемых приложением " +"при запуске (например, разрешение на чтение файлов), с информацией о том, " +"как приложение было разработано. Свободное программное обеспечение, исходный " +"код которого доступен для всеобщего ознакомления, может быть более " +"безопасным, чем проприетарное, поскольку позволяет проводить аудит." + +#. (itstool) path: section/p +#: C/software-metadata.page:96 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"permissions the app requests, plus some information about its license and " +"runtime." +msgstr "" +"В диалоговом окне, которое появляется при нажатии на плитку, приведена " +"информация о разрешениях, запрашиваемых приложением, сведения о лицензии и " +"среде выполнения." + +#. (itstool) path: section/p +#: C/software-metadata.page:97 +msgid "You can improve the safety information:" +msgstr "Вы можете улучшить сведения, приведённые в разделе о безопасности:" + +#. (itstool) path: item/p +#: C/software-metadata.page:100 +msgid "" +"How " +"to fix incorrect safety and permissions information" +msgstr "" +"Как " +"исправить неверную информацию о безопасности и разрешениях" + +#. (itstool) path: section/title +#: C/software-metadata.page:106 +msgid "Hardware support" +msgstr "Поддержка оборудования" + +#. (itstool) path: section/p +#: C/software-metadata.page:107 +msgid "" +"Software displays a hardware support tile on the details page for " +"an application. This combines information about the hardware requirements of " +"the application, and the hardware capabilities of the computer, with the aim " +"of highlighting incompatibilities or missing requirements — or to indicate " +"that the application should work correctly with no incompatibilities." +msgstr "" +"На странице сведений о приложении Центр приложений отображает " +"плитку с информацией о поддержке оборудования. Она объединяет информацию о " +"требованиях к оборудованию и аппаратных возможностях компьютера с целью " +"выявления отсутствия или наличия совместимости." + +#. (itstool) path: section/p +#: C/software-metadata.page:116 +msgid "" +"The code looks at the following hardware. More may be supported in future." +msgstr "" +"Код учитывает описанное ниже оборудование. В будущем может появиться больше " +"информации о поддерживаемом оборудовании." + +#. (itstool) path: item/p +#: C/software-metadata.page:118 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "Наличие/необходимость тачпада, мыши или клавиатуры" + +#. (itstool) path: item/p +#: C/software-metadata.page:119 +msgid "Whether a gamepad is needed" +msgstr "Требуется ли игровой контролер" + +#. (itstool) path: item/p +#: C/software-metadata.page:120 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "Минимальный и рекомендуемый размер экрана для работы приложения" + +#. (itstool) path: section/p +#: C/software-metadata.page:123 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, " +"as they are often left disconnected due to not being needed for normal " +"computer use." +msgstr "" +"Невозможно достоверно определить, присутствует ли игровой " +"контроллер, поскольку он часто остаётся отключённым из-за того, что обычно " +"не требуется при использовании компьютера." + +#. (itstool) path: section/p +#: C/software-metadata.page:124 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"hardware requirements of the app, and whether any of them are not met." +msgstr "" +"В диалоговом окне, которое появляется при нажатии на плитку, перечисляются " +"требования предъявляемые к оборудованию и указывается соответствие каким-" +"либо из них." + +#. (itstool) path: section/p +#: C/software-metadata.page:125 +msgid "You can improve the hardware information:" +msgstr "Вы можете улучшить сведения о поддержке оборудования:" + +#. (itstool) path: item/p +#: C/software-metadata.page:128 +msgid "" +"How to add missing " +"hardware information" +msgstr "" +"Как добавить " +"недостающую информацию об оборудовании" + +#. (itstool) path: section/title +#: C/software-metadata.page:134 +msgid "Age rating" +msgstr "Возрастной рейтинг" + +#. (itstool) path: section/p +#: C/software-metadata.page:135 +msgid "" +"Software displays an age rating tile on the details page for an " +"application. This shows what age range the application should be suitable " +"for, based on different kinds of content which the application has declared " +"it contains. This information is summarized in a format similar to the game " +"or film rating certificates for your country." +msgstr "" +"На странице сведений о приложении Центр приложений отображает " +"плитку с информацией о возрастном рейтинге. На ней показано, для какой " +"возрастной категории должно подходить приложение, исходя из типов контента, " +"который заявлен в приложении. Эта информация обобщена в формате, аналогичном " +"рейтинговым сертификатам игр или фильмов для вашей страны." + +#. (itstool) path: section/p +#: C/software-metadata.page:136 +msgid "" +"For example, this will highlight whether a game contains violence, or " +"whether an application contains in-app advertising." +msgstr "" +"Например, эта информация позволяет определить, содержит ли игра насилие или " +"в приложение встроена реклама." + +#. (itstool) path: section/p +#: C/software-metadata.page:137 +msgid "" +"The dialog which appears when the tile is clicked lists the different types " +"of content in the application and how severe that content is." +msgstr "" +"В диалоговом окне, появляющемся при нажатии на плитку, перечислены различные " +"типы содержимого и степень его опасности." + +#. (itstool) path: section/p +#: C/software-metadata.page:138 +msgid "You can improve the age rating information:" +msgstr "Как улучшить информацию о возрастном рейтинге:" + +#. (itstool) path: item/p +#: C/software-metadata.page:141 +msgid "" +"How to add " +"missing content rating information" +msgstr "" +"Как добавить " +"недостающую информацию о возрастном рейтинге" + +#. (itstool) path: section/title +#: C/software-metadata.page:147 +msgid "License" +msgstr "Лицензия" + +#. (itstool) path: section/p +#: C/software-metadata.page:150 +msgid "" +"Software displays a tile indicating whether an application is " +"free software or whether its license is " +"proprietary, special or unknown. This tile includes more detailed " +"information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" +"В Центре приложений отображается плитка с информацией о том, " +"является ли приложение свободным программным обеспечением " +"или его лицензия является проприетарной, специальной или информация о " +"лицензии неизвестна. Эта плитка содержит более подробную информацию о " +"лицензии проекта. Здесь также перечислены некоторые преимущества свободного " +"программного обеспечения. Узнайте больше" + +#. (itstool) path: section/p +#: C/software-metadata.page:151 +msgid "" +"Sometimes the license information isn’t correct for an application, and " +"hence an application which is actually free software will be shown as " +"‘proprietary’. Similarly, sometimes the license information is unknown." +msgstr "" +"Иногда информация о лицензии для приложения является неверной, и, " +"следовательно, приложение, которое на самом деле является свободным " +"программным обеспечением, будет отображаться как «проприетарное». " +"Аналогичная ситуация возникает когда информация о лицензии неизвестна." + +#. (itstool) path: section/p +#: C/software-metadata.page:152 +msgid "" +"Software highlights free and open-source licenses in green, " +"proprietary and special licenses in yellow as shown here. Unknown licenses " +"are highlighted in grey." +msgstr "" +"В Центре приложений свободные лицензии и лицензии с открытым " +"исходным кодом выделены зелёным цветом, приприетарные и специальные - " +"жёлтым, как показано здесь. Неизвестные лицензии выделены серым цветом." + +#. (itstool) path: section/p +#: C/software-metadata.page:153 +msgid "You can add or improve the license information:" +msgstr "Вы можете добавить или улучшить информацию о лицензии:" + +#. (itstool) path: item/p +#: C/software-metadata.page:156 +msgid "" +"How to fix " +"incorrect licensing information" +msgstr "" +"Как исправить " +"неверную информацию о лицензировании" + +#. (itstool) path: section/title +#: C/software-metadata.page:162 +msgid "Links" +msgstr "Ссылки" + +#. (itstool) path: section/p +#: C/software-metadata.page:164 +msgid "" +"Software displays a list of application resource links in the " +"link tile. They are as follows:" +msgstr "" +"В соответствующем разделе Центра приложений размещены ссылки на " +"внешние ресурсы приложения. Они могут быть следующими:" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Website link" +msgstr "Ссылка на сайт" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Donation link" +msgstr "Ссылка для пожертвований" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Translation contribution link" +msgstr "Ссылка для помощи с переводом" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Bug reporting link" +msgstr "Ссылка для сообщений об ошибках" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Help link" +msgstr "Ссылка на справку" + +#. (itstool) path: td/p +#: C/software-metadata.page:188 +msgid "Contact link" +msgstr "Ссылка на контактную информацию" + +#. (itstool) path: section/p +#: C/software-metadata.page:191 +msgid "" +"Some or all of these links may be present depending on whether they are " +"listed in the application’s metainfo file." +msgstr "" +"Представлены могут быть сразу все или только некоторые ссылки в зависимости " +"от того, что указано в метафайле приложения." + +#. (itstool) path: section/p +#: C/software-metadata.page:192 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the " +"following tile with a question mark will be displayed." +msgstr "" +"В тех случаях, когда метафайл приложения не содержит никаких ссылок, будет " +"показана следующая плитка со знаком вопроса." + +#. (itstool) path: section/p +#: C/software-metadata.page:194 +msgid "You can improve the links:" +msgstr "Вы можете улучшить раздел ссылок:" + +#. (itstool) path: item/p +#: C/software-metadata.page:197 +msgid "" +"How to add missing links" +msgstr "" +"Как добавить недостающие ссылки" + +#. (itstool) path: section/title +#: C/software-metadata.page:203 +msgid "Carousel tile" +msgstr "Карусель плиток" + +#. (itstool) path: section/p +#: C/software-metadata.page:205 +msgid "" +"Applications which are featured by Software are displayed in a " +"carousel at the top of the main window as shown here. Each carousel tile has " +"a background color which is automatically extracted from the application’s " +"icon. Sometimes this background color is not quite right for the application " +"and needs to be specified explicitly by the application developer." +msgstr "" +"Приложения, представленные в Центре приложений, отображаются в " +"виде карусели в верхней части главного окна, как показано здесь. У каждой " +"плитки карусели есть фоновый цвет, который автоматически формируется на " +"основе значка приложения. Иногда этот цвет не совсем подходит для приложения " +"и должен быть явно указан разработчиком приложения." + +#. (itstool) path: section/p +#: C/software-metadata.page:206 +msgid "" +"The set of applications which are featured is decided by the Linux " +"distribution maintainers." +msgstr "" +"Набор предлагаемых приложений определяется разработчиками дистрибутива Linux." + +#. (itstool) path: section/p +#: C/software-metadata.page:207 +msgid "You can improve the carousel tile:" +msgstr "Вы можете улучшить плитку карусели:" + +#. (itstool) path: item/p +#: C/software-metadata.page:210 +msgid "" +"How to set " +"the carousel tile background color" +msgstr "" +"Как задать " +"фоновый цвет плитки карусели" + +#. (itstool) path: section/title +#: C/software-metadata.page:216 +msgid "Where metadata comes from" +msgstr "Откуда берутся метаданные" + +#. (itstool) path: section/p +#: C/software-metadata.page:217 +msgid "" +"The metadata used to specify what hardware a piece of software requires, " +"what ages of user it is suitable for, and factors which contribute to how " +"safe it might be to install, all come from the metainfo file for that " +"software." +msgstr "" +"Сведения о необходимом оборудовании для работы программного обеспечения, для " +"какого возраста оно предназначено, а также факторы, влияющие на безопасность " +"при его установки, берутся из файла metainfo соответствующего приложения." + +#. (itstool) path: section/p +#: C/software-metadata.page:218 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream " +"specification." +msgstr "" +"Файл metainfo представляет собой XML-файл. Его формат указан в спецификации " +"AppStream." + +#. (itstool) path: section/p +#: C/software-metadata.page:219 +msgid "" +"See the metainfo file for GNOME Files " +"app." +msgstr "" +"Смотрите файл metainfo для приложения " +"GNOME Files." + +#. (itstool) path: note/p +#: C/software-metadata.page:221 +msgid "appdata is the older term for metainfo." +msgstr "appdata является более старым термином для metainfo." + +#. (itstool) path: section/title +#: C/software-metadata.page:226 +msgid "What happens if metadata is missing" +msgstr "Что произойдёт, если метаданные отсутствуют" + +#. (itstool) path: section/p +#: C/software-metadata.page:227 +msgid "" +"If some metadata is missing for an application, Software can only " +"guess what it might be, and hence can’t present much information in its " +"interfaces. The guesses Software makes are based on the fact that " +"most software is designed for desktop computers." +msgstr "" +"Если метаданные для приложения отсутствуют, то Центр приложений " +"может только догадываться какими они могут быть, и, следовательно, не может " +"предоставить исчерпывающую информацию в своём интерфейсе. Предположения, " +"сделанные Центром приложений, основаны на том факте, что большая " +"часть программного обеспечения предназначена для настольных компьютеров." + +#. (itstool) path: section/p +#: C/software-metadata.page:228 +msgid "" +"You can help improve the metadata for an application!" +msgstr "" +"Вы можете помочь улучшить метаданные для приложения!" + +#. (itstool) path: section/title +#: C/software-metadata.page:232 +msgid "How to contribute missing information" +msgstr "Как внести недостающую информацию" + +#. (itstool) path: section/p +#: C/software-metadata.page:233 +msgid "" +"If you find that an app’s page is missing information or has incorrect " +"information, you can contribute in one of the two ways:" +msgstr "" +"Если вы обнаружите, что на странице приложения отсутствует информация или " +"она неверна, то можете внести изменения одним из двух способов:" + +#. (itstool) path: item/p +#: C/software-metadata.page:236 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug " +"tracker, so the app developer can fix it." +msgstr "" +"Вы можете сообщить об отсутствующих / неверных метаданных в систему " +"отслеживания ошибок соответствующего приложения, чтобы разработчик мог это " +"исправить." + +#. (itstool) path: item/p +#: C/software-metadata.page:239 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How to guide below on how to do that." +msgstr "" +"Вы можете самостоятельно исправить отсутствующие / некорректные метаданные. " +"О том, как это сделать, читайте в руководстве, " +"приведенном ниже." + +#. (itstool) path: section/p +#: C/software-metadata.page:243 +msgid "" +"For both, you first need to find the app’s project page. The link to the " +"project page should typically be available in the app’s page as shown here. If not, you will need to find it with " +"a simple search on Google." +msgstr "" +"В любом случае вам сначала нужно перейти на страницу проекта приложения. " +"Ссылка на которую, как правило, должна быть доступна на странице приложения, " +"как показано здесь. Если нет, то вам нужно " +"будет найти его с помощью обычного поиска в Google." + +#. (itstool) path: section/p +#: C/software-metadata.page:245 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" +"Обычно приложения размещаются на GitLab или GitHub. Например, приложения GNOME расположены на gitlab.gnome.org." + +#. (itstool) path: section/title +#: C/software-metadata.page:249 +msgid "How to add missing app screenshots" +msgstr "Как добавить отсутствующие скриншоты приложения" + +#. (itstool) path: section/p +#: C/software-metadata.page:250 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s <component> in its " +"metainfo file." +msgstr "" +"Информация о скриншотах приложения хранится в элементе <screenshots> внутри " +"раздела <component> файла metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:251 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots " +"should ideally be in the PNG format with 16:9 aspect ratio and minimum width " +"of 620 pixels." +msgstr "" +"Рекомендуемое количество скриншотов для приложения - от 5 до 10. В идеале " +"скриншоты должны быть в формате PNG с соотношением сторон 16:9 и шириной не " +"менее 620 пикселей." + +#. (itstool) path: section/p +#: C/software-metadata.page:252 +msgid "" +"For example, here are the screenshot entries for the Software app:" +msgstr "" +"В качестве примера ниже представлены записи скриншотов для приложения " +"Центр приложений:" + +#. (itstool) path: section/code +#: C/software-metadata.page:253 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:267 +msgid "How to fix incorrect safety and permissions information" +msgstr "Как исправить неверную информацию о безопасности и разрешениях" + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"The safety and permissions information for an application comes from " +"different sources depending on how the application is packaged. For " +"traditionally packaged applications, for example in RPM or DEB format, there " +"is no safety or permissions information available and nothing can be done to " +"add it to an application." +msgstr "" +"Информация о безопасности и разрешениях для приложения поступает из разных " +"источников в зависимости от того, как оно упаковано. Для традиционно " +"упакованных приложений, например, в формате RPM или DEB, информация о " +"безопасности или разрешениях недоступна, и ничего с этим нельзя сделать." + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, specifying what holes in the sandbox the application requires. Each " +"of these holes typically contributes to lowering the displayed safety level " +"of the application in Software — moving it from ‘safe’ to " +"‘potentially unsafe’ to ‘unsafe’." +msgstr "" +"Для приложений flatpak информация берется из манифеста flatpak, в котором " +"указывается, какие дыры в изолированной среде требуются приложению. Каждая " +"из этих дыр, как правило, приводит к снижению уровня безопасности " +"приложения, отображаемого в Центр приложений — переводя его с " +"«безопасно» на «потенциально небезопасно» и «небезопасно»." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 +msgid "" +"In order to improve the safety level of an application, its sandboxing must " +"be made as tight as possible, by removing sandbox permissions where " +"they’re not needed, and using portals instead of sandbox " +"permissions where possible. Use of portals does not lower the displayed " +"safety level of an application in Software." +msgstr "" +"Чтобы повысить уровень безопасности приложения, его изолированность должна " +"быть максимально жёсткой, путем удаления разрешений изолированной среды там, где они не нужны, и использования порталов " +"вместо разрешений, где это возможно. Использование порталов не снижает " +"отображаемый уровень безопасности приложения в Центре приложений." + +#. (itstool) path: section/p +#: C/software-metadata.page:271 +msgid "" +"For example, if the application requests read/write access to the full file " +"system (--filesystem=host), does it actually need that, or does " +"it only need to access files in a few specific locations? If so, the file portal could be used, or more specific file system permissions could be specified." +msgstr "" +"Например, если приложение запрашивает доступ для чтения/записи ко всей " +"файловой системе (--filesystem=host): действительно ли оно в " +"этом нуждается или ему требуется доступ только к файлам в определённых " +"местах? Если это так, то можно было бы использовать файловый " +"портал или более конкретные права доступа к файловой " +"системе." + +#. (itstool) path: section/p +#: C/software-metadata.page:272 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a " +"fallback, without using special X11 features, could it use --" +"socket=fallback-x11 rather than --socket=x11?" +msgstr "" +"Если приложение работает на Wayland и, в качестве резервного варианта должно " +"работать на X11 без использования специальных функций X11, может ли оно " +"использовать --socket=fallback-x11 вместо --socket=x11?" + +#. (itstool) path: section/p +#: C/software-metadata.page:273 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be " +"added here in future." +msgstr "" +"В будущем сюда могут быть добавлены инструкции по конкретным разрешениям или " +"другим пакетным форматам." + +#. (itstool) path: section/p +#: C/software-metadata.page:274 C/software-metadata.page:312 +msgid "Further reading:" +msgstr "Дополнительный материал для чтения:" + +#. (itstool) path: section/title +#: C/software-metadata.page:289 +msgid "How to add missing hardware information" +msgstr "Как добавить недостающую информацию об оборудовании" + +#. (itstool) path: section/p +#: C/software-metadata.page:290 +msgid "" +"The hardware information for an application is stored in the <requires>, <recommends>" +" and <supports> elements within the " +"application’s <component> in its metainfo file." +msgstr "" +"Информация об оборудовании для приложения хранится в элементах <requires>, <recommends>" +" и <supports> внутри раздела <" +"component> файла metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:291 +msgid "" +"Software understands the <" +"control> and <display_length> elements." +msgstr "" +"Центр приложения понимает элементы <control> и <display_length>." + +#. (itstool) path: section/p +#: C/software-metadata.page:292 +msgid "" +"See this blog post or " +"this blog post for examples of metadata." +msgstr "" +"Примеры метаданных смотрите в этом блоге или этом блоге." + +#. (itstool) path: section/title +#: C/software-metadata.page:296 +msgid "How to add missing content rating information" +msgstr "Как добавить недостающую информацию о возрастном рейтинге" + +#. (itstool) path: section/p +#: C/software-metadata.page:297 +msgid "" +"The content rating information for an application is stored in the <content_rating> element " +"within the application’s <component> in its metainfo file." +msgstr "" +"Информация о возрастном рейтинге для приложения хранится в элементе <content_rating> внутри " +"раздела <component> файла metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:298 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If " +"the <content_rating> element is not specified, the " +"application’s content rating is unknown. If it’s specified but empty, the " +"application has no content which might be unsuitable for any audience." +msgstr "" +"Для заполнения этого элемента должен использоваться стандарт OARS 1.1. Если " +"элемент <content_rating> не указан, то рейтинг " +"содержимого будет неизвестным. Если этот элемент указан, но оставлен пустым, " +"значит, в приложении нет содержимого, которое могло бы быть неподходящим для " +"определённой аудитории." + +#. (itstool) path: section/p +#: C/software-metadata.page:299 +msgid "" +"Use the OARS generator " +"to produce suitable content rating information for an application." +msgstr "" +"Используйте генератор OARS для получения подходящей информации о возрастном рейтинге приложения." + +#. (itstool) path: section/title +#: C/software-metadata.page:303 +msgid "How to fix incorrect licensing information" +msgstr "Как исправить неверную информацию о лицензировании" + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"The licensing information for an application is stored in the <project_license> " +"element within the application’s <component> in its " +"metainfo file." +msgstr "" +"Лицензионная информация для приложения хранится в элементе <project_license> " +"внутри раздела <component> файла metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:305 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license " +"for the project. This should typically be the license of the code, and not " +"include the license of the documentation or ancillary content." +msgstr "" +"Содержимое этого элемента должно быть отражено выражением SPDX, которое описывает «основную» " +"лицензию для проекта. Обычно это должна быть лицензия на код, не включающая " +"лицензию на документацию или дополнительный материал." + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of " +"multiple licenses, which are all FSF or OSI approved, the application is considered ‘free software’ " +"and the license tile says so. Otherwise, it’s considered ‘proprietary’." +msgstr "" +"Если в выражении SPDX представлена одна лицензия или комбинация нескольких " +"лицензий через «and», все из которых одобрены FSF или OSI, то приложение считается «свободным " +"программным обеспечением» и об этом сказано на странице лицензии. В " +"противном случае оно будет считаться «проприетарным»." + +#. (itstool) path: section/p +#: C/software-metadata.page:307 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it " +"shouldn’t be, it’s likely that the <project_license> " +"element includes the documentation license for the project. Remove it." +msgstr "" +"Если приложение помечено как «проприетарное», хотя вы считаете, что это не " +"так, скорее всего, элемент <project_license> содержит " +"лицензию на документацию проекта. Удалите его." + +#. (itstool) path: section/p +#: C/software-metadata.page:308 +msgid "" +"For example, change the license metadata from:" +msgstr "" +"Пример изменения метаданных лицензии с:" + +#. (itstool) path: section/code +#: C/software-metadata.page:309 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:310 +msgid "to" +msgstr "на" + +#. (itstool) path: section/code +#: C/software-metadata.page:311 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +#. (itstool) path: item/p +#: C/software-metadata.page:315 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" +"Не размещайте (как правило) лицензию на документацию в данные " +"приложения" + +#. (itstool) path: section/title +#: C/software-metadata.page:324 +msgid "How to add missing links" +msgstr "Как добавить недостающие ссылки" + +#. (itstool) path: section/p +#: C/software-metadata.page:325 +msgid "" +"The links for an application are stored as <url> elements within the application’s " +"<component> in its metainfo file." +msgstr "" +"Информация о ссылках для приложения хранится в элементах <url> внутри раздела <" +"component> файла metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:326 +msgid "" +"Add as many of the link types documented in the appstream specification as are available for the application. " +"If no suitable page exists for a given link type, it doesn’t have to be " +"included." +msgstr "" +"Добавьте столько типов ссылок, задокументированных в спецификации appstream, сколько доступно приложению. Если для " +"определённого типа ссылок не существует подходящей страницы, то добавлять её " +"необязательно." + +#. (itstool) path: section/p +#: C/software-metadata.page:327 +msgid "" +"For example, here are the resource links for the Software app:" +msgstr "Пример ссылок на ресурсы для Центра приложений:" + +#. (itstool) path: section/code +#: C/software-metadata.page:328 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:339 +msgid "How to set the carousel tile background color" +msgstr "Как задать фоновый цвет плитки карусели" + +#. (itstool) path: section/p +#: C/software-metadata.page:340 +msgid "" +"The carousel tile background color is normally extracted automatically from " +"the application’s icon. If that color is unsatisfactory, however, it can be " +"overridden by using the appstream’s <" +"branding/> element with declared colors (since 47.x " +"series). The advantage is that more clients can use the colors." +msgstr "" +"Фоновый цвет плитки карусели обычно автоматически извлекается из значка " +"приложения. Однако, если этот цвет вас не устраивает, его можно изменить, " +"используя элемент appstream’s <" +"branding/> с заявленными цветами (начиная с 47.x). " +"Преимущество заключается в том, что другие приложения также могут " +"использовать эти цвета." + +#. (itstool) path: section/p +#: C/software-metadata.page:341 +msgid "For example, here are some branding entries:" +msgstr "Примеры записей брендинга:" + +#. (itstool) path: section/code +#: C/software-metadata.page:342 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:348 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses the better color for the theme on its own." +msgstr "" +"Обратите внимание, что атрибут scheme_preference будет " +"проигнорирован, Центр приложений самостоятельно выберет лучший " +"цвет темы." + +#. (itstool) path: section/p +#: C/software-metadata.page:350 +msgid "" +"There is left, for backward compatibility, the possibility to add the " +"following XML to the application’s metainfo <component> " +"element:" +msgstr "" +"Для обеспечения обратной совместимости оставлена возможность добавлять " +"следующий элемент XML в раздел <component> файла metainfo:" + +#. (itstool) path: section/code +#: C/software-metadata.page:351 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:355 +msgid "but the <branding/> element has a precedence." +msgstr "" +"но, при этом, элемент <branding/> имеет более высокий " +"приоритет." + +#. (itstool) path: section/p +#: C/software-metadata.page:356 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format " +"GVariant with type a(yyy), and represents an unordered set of " +"key colors for the application. Each element of the set is a color in RGB " +"form ranging from (0, 0, 0) to (255, 255, 255)." +msgstr "" +"Значение GnomeSoftware::key-colors является параметром типа " +"a(yyy) в текстовым формате GVariant и представляет собой " +"неупорядоченный набор ключевых цветов для приложения. Каждый элемент набора " +"представляет собой цвет в формате RGB в диапазоне от (0, 0, 0) " +"до (255, 255, 255)." + +#. (itstool) path: section/p +#: C/software-metadata.page:357 +msgid "Colors should be chosen so that they:" +msgstr "Цвета должны быть подобраны таким образом, чтобы они:" + +#. (itstool) path: item/p +#: C/software-metadata.page:360 +msgid "" +"Are identifiable to the application, matching the application’s branding in " +"some way, if possible." +msgstr "" +"Были легко узнаваемыми для конкретного приложения и, по возможности, " +"соответствовали фирменному стилю приложения." + +#. (itstool) path: item/p +#: C/software-metadata.page:363 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used " +"as a background behind it, the icon can be distinguished." +msgstr "" +"Контрастировали с краями значка приложения, чтобы на его фоне можно было " +"легко различить значок." + +#. (itstool) path: item/p +#: C/software-metadata.page:366 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and in its dark variant (#eeeeec). This generally means " +"choosing a color with a medium level of brightness." +msgstr "" +"Контрастировали с цветом текста переднего плана в теме Adwaita " +"(#2e3436), в том числе и её тёмного варианта (#eeeeec). Обычно это означает выбор цвета со средним уровнем яркости." + +#. (itstool) path: item/p +#: C/software-metadata.page:369 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" +"Контрастность можно проверить с помощью приложения Контраст." + +#. (itstool) path: section/p +#: C/software-metadata.page:372 +msgid "" +"At least one color should be specified. More can be specified if one color " +"can’t satisfy all the requirements above, and Software will " +"choose the most appropriate to use in the carousel tile. If exactly one " +"color is specified, its brightness and saturation may be modified to improve " +"contrast with the foreground color. If more than one color is specified, the " +"one with the best contrast with the foreground color will be chosen, and its " +"brightness and saturation will not be modified." +msgstr "" +"Должен быть указан хотя бы один цвет. Можно указать больше цветов, если один " +"не удовлетворяет всем вышеперечисленным требованиям, Центр приложений сам выберет наиболее подходящий для использования в карусели. Если " +"указан только один цвет, его яркость и насыщенность могут быть изменены для " +"улучшения контраста с цветом переднего плана. Если указано более одного " +"цвета, будет выбран тот, который наилучшим образом контрастирует с цветом " +"переднего плана, и его яркость и насыщенность не изменятся." + +#. (itstool) path: section/title +#: C/software-metadata.page:376 +msgid "How to test carousel tile background color changes" +msgstr "Как протестировать изменение фонового цвета плитки карусели" + +#. (itstool) path: section/p +#: C/software-metadata.page:377 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" +"Измените метафайл своего приложения, а затем запустите Центр " +"приложений используя:" + +#. (itstool) path: section/p +#: C/software-metadata.page:378 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml," +"icon=/path/to/app/icon.png" +msgstr "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml," +"icon=/path/to/app/icon.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:379 +msgid "" +"The details page for your application will be shown. If you navigate back to " +"the overview page of Software, your application will be the only " +"one in the ‘featured’ carousel." +msgstr "" +"Откроется страница с подробной информацией о вашем приложении. Если вы " +"вернетесь на страницу обзора Центра приложений, ваше приложение " +"будет единственным в «Избранном» карусели." diff --git a/help/sv/figures/app-context-bar.png b/help/sv/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..ca76ec003d06456b59a3cdfb0e0af3e7af00cb96 GIT binary patch literal 15589 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 PV4tPM6~szKKKTDHVy2f6 literal 0 HcmV?d00001 diff --git a/help/sv/sv.po b/help/sv/sv.po new file mode 100644 index 0000000..ba01cbd --- /dev/null +++ b/help/sv/sv.po @@ -0,0 +1,1423 @@ +# Swedish translation for gnome-software. +# Copyright © 2024 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Anders Jonsson , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2024-08-29 06:30+0000\n" +"PO-Revision-Date: 2024-09-09 16:29+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.5\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Anders Jonsson , 2024" + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Phaedrus Leeds" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Hur du ominstallerar en webbapp" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "Programvara stöder hantering av två sorters webbappar:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See " +"README.md." +msgstr "" +"Webbappar för vilka AppStream-metainfo har levererats med Programvara. Se " +"README.md." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" +"Webbappar som har installerats med GNOME " +"Webb." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software (when this " +"functionality has been enabled by the distribution), whereas the second type only show up " +"in Software after they have been installed via GNOME Web. If you uninstall " +"such an app and want to reinstall it, you must do so using GNOME Web." +msgstr "" +"Den första typen visas som tillgängliga att installera i Programvara (när " +"denna funktionalitet har aktiverats av distributionen), medan den andra typen endast " +"visas i Programvara efter att de har installerats via GNOME Webb. Om du " +"avinstallerar en sådan app och vill ominstallera den så måste du göra det med GNOME Webb." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "Här är stegen för att installera en webbapp med GNOME Webb:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as shown in the " +"image below." +msgstr "" +"Klicka på appens Meny-knapp i övre högra hörnet som kan ses i " +"bilden nedan." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This should open " +"the web app creation dialog." +msgstr "" +"Klicka på menyobjektet Installera som webbapp…. Detta bör " +"öppna dialogrutan för skapande av webbappar." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install the web app." +msgstr "" +"Klicka på knappen Skapa för att skapa och installera " +"webbappen." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" +"Webbappen bör nu dyka upp i fliken Installerat i " +"Programvara." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Programvara" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "Creative Commons Erkännande-DelaLika 3.0 Unported" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "Det här verket är licensierat under licensen <_:link-1/>." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Philip Withnall" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Introduktion till programvarulicenser" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Programvarulicenser" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Introduktion" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the freedoms you " +"as a user have. If an app is free/open source software (FOSS), you have the freedom to use " +"it, copy it, study and change its source code. Proprietary software does not provide you " +"with those freedoms. FOSS software is often available for no charge, but this is not " +"always true." +msgstr "" +"Program kan vara ”fri programvara/öppen källkod” eller ”proprietära”. Detta påverkar " +"vilka friheter du har som användare. Om ett program är fri programvara/öppen källkod (free/open source " +"software, FOSS), så har du friheten att använda det, kopiera det, studera och " +"ändra dess källkod. Proprietär programvara ger dig inte dessa friheter. FOSS-programvara " +"finns ofta tillgänglig gratis, men så är inte alltid fallet." + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get involved in its " +"development, contributing features or translations to their language and fixing bugs " +"which affect them. They can audit the code and check that changes to the software are not " +"malicious. They can learn from the source code and use it as the basis for their own FOSS " +"applications." +msgstr "" +"Eftersom källkoden är tillgänglig för FOSS-programvara så kan användare engagera sig i " +"dess utveckling, bidra med funktioner eller översättningar till sitt språk och fixa fel " +"som påverkar dem. De kan granska koden och kontrollera att ändringar till programvaran " +"inte är illvillig. De kan lära sig från källkoden och använda den till grund för sina " +"egna FOSS-program." + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a public good." +msgstr "" +"FOSS-program är allmännyttiga." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that the developers " +"of the app have your best interests in mind, and no conflicts of interest." +msgstr "" +"Proprietära program kan inte granskas av sina användare, så du får lita på att " +"programmets utvecklare har ditt bästa i åtanke, och inte har några intressekonflikter." + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS over " +"proprietary software." +msgstr "" +"Läs mer om fördelarna med FOSS över proprietär " +"programvara." + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Will Thompson" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Milan Crha" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Hur Programvara använder metadata" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Metadata för program" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Skärmbilder" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an application. This " +"typically should include screenshots of various windows / dialogs of the application, so " +"the user would get a quick grasp of the application’s features, look and feel etc." +msgstr "" +"Programvara visar skärmbilderna på detaljsidan för ett program. Detta ska " +"typiskt inkludera skärmbilder för diverse fönster / dialogrutor för programmet, så " +"användaren får en snabb överblick över programmets funktioner, utseende o.s.v." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" +"När mer än en skärmbild finns i programmets metainfo-fil kommer Programvara " +"visa skärmbilderna i en karusell." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any screenshot, then a " +"placeholder icon as below with No Screenshots will be displayed:" +msgstr "" +"I fall då programmets metainfo-fil inte innehåller någon skärmbild kommer en " +"platshållarikon visas som nedan med Inga skärmbilder:" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "Placeholder icon might look different if you're using a custom icon theme." +msgstr "Platshållarikonen kan se annars ut om du använder ett anpassat ikontema." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even if " +"Software shows screenshots for an app, it’s important to check if these " +"screenshots are up-to-date or outdated." +msgstr "" +"Skärmbilder kan bli inaktuella då programmets användargränssnitt ändras. Så även om " +"Programvara visar skärmbilder för ett program så är det viktigt att " +"kontrollera om dessa skärmbilder är uppdaterade eller inaktuella." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "Du kan förbättra skärmbildsinformation för program:" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app screenshots" +msgstr "" +"Hur du lägger till saknade skärmbilder " +"för program" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Programkontextrad" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the details page " +"for an application, which display the following details." +msgstr "" +"Programkontextraden i Programvara är en samling rutor på detaljsidan för ett " +"program, vilka visar följande detaljer." + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Lagring" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Säkerhet" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Hårdvarustöd" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Åldersklassificering" + +#. (itstool) path: section/p +#. Translators: Refer below steps to localize +#. 'figures/app-context-bar.png' image: 1. Run 'gnome-software +#. --details=org.gnome.Software.desktop' in console (as normal user). 2. +#. This should launch the Software app and automatically switch to +#. Software app's details page. 3. It may take some time if some +#. background tasks are running. Wait for the app's details page to load. +#. 4. Scroll down to take the screenshot of the app context bar. +#: C/software-metadata.page:78 +msgid "This shows the app context bar for the Software app:" +msgstr "Detta visar programkontextraden för programmet Programvara:" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:79 +msgctxt "_" +msgid "external ref='figures/app-context-bar.png' md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "external ref='figures/app-context-bar.png' md5='3badcd9309bde27a650b25eb5d89a4c6'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:82 +msgid "" +"The tiles are displayed in the order listed above (starting with Storage " +"tile on the left)." +msgstr "" +"Rutorna visas i ordningen listad ovan (med start på rutan Lagring till " +"vänster)." + +#. (itstool) path: section/p +#: C/software-metadata.page:83 +msgid "Each tile is covered in detail below." +msgstr "Varje ruta beskrivs i detalj nedan." + +#. (itstool) path: section/title +#: C/software-metadata.page:87 +msgid "Storage" +msgstr "Lagring" + +#. (itstool) path: section/p +#: C/software-metadata.page:88 +msgid "" +"Software displays a storage tile on the details page for an application. If " +"the application is not installed, this displays the estimated download size needed to " +"install it. If the application is installed, it displays the storage space used by the " +"application." +msgstr "" +"Programvara visar en lagringsruta på detaljsidan för ett program. Om " +"programmet inte är installerat visar denna den beräknade hämtningsstorleken som behövs " +"för att installera det. Om programmet är installerat visar den lagringsutrymmet som " +"används av programmet." + +#. (itstool) path: section/p +#: C/software-metadata.page:89 +msgid "" +"The sizes are calculated from data provided by the Software backend (such as " +"flatpak or an RPM), and are not specified in the metadata provided by the application. " +"There is nothing you can do to affect this tile by editing an application’s metainfo " +"file. It’s listed here for completeness." +msgstr "" +"Storlekarna beräknas från data som tillhandahålls av bakänden till Programvara " +"(såsom flatpak eller en RPM), och specificeras inte i metadata som tillhandahålls av " +"programmet. Det finns inget du kan göra för att påverka denna ruta genom att redigera ett " +"programs metainfo-fil. Den listas här för fullständighets skull." + +#. (itstool) path: section/title +#: C/software-metadata.page:93 +msgid "Safety" +msgstr "Säkerhet" + +#. (itstool) path: section/p +#: C/software-metadata.page:94 +msgid "" +"Software displays a safety tile on the details page for an application. This " +"summarizes information about whether the app can be considered safe to install and run, " +"or whether caution may be required before trusting it." +msgstr "" +"Programvara visar en säkerhetsruta på detaljsidan för ett program. Denna " +"sammanfattar information om huruvida programmet kan anses säkert att installera och köra, " +"eller om varsamhet kan behövas innan du litar på det." + +#. (itstool) path: section/p +#: C/software-metadata.page:95 +msgid "" +"This tile combines information about the permissions which the app requests when it runs " +"(such as permission to read your files), with information about how the app was " +"developed. Free software applications, where the source code is publicly readable, can be " +"more secure than proprietary ones, as they can be audited." +msgstr "" +"Denna ruta kombinerar information om rättigheterna som programmet begär när det körs " +"(såsom rättighet att läsa dina filer), med information om hur programmet utvecklats. Fri " +"programvara, där källkoden finns att läsa offentligt, kan vara säkrare än proprietär " +"sådan, eftersom den kan granskas." + +#. (itstool) path: section/p +#: C/software-metadata.page:96 +msgid "" +"The dialog which appears when the tile is clicked lists the different permissions the app " +"requests, plus some information about its license and runtime." +msgstr "" +"Dialogrutan som dyker upp när rutan klickas på listar de olika rättigheterna som " +"programmet begär, samt viss information om dess licens och exekveringsmiljö." + +#. (itstool) path: section/p +#: C/software-metadata.page:97 +msgid "You can improve the safety information:" +msgstr "Du kan förbättra säkerhetsinformationen:" + +#. (itstool) path: item/p +#: C/software-metadata.page:100 +msgid "" +"How to fix " +"incorrect safety and permissions information" +msgstr "" +"Hur du fixar " +"felaktig säkerhets- och rättighetsinformation" + +#. (itstool) path: section/title +#: C/software-metadata.page:106 +msgid "Hardware support" +msgstr "Hårdvarustöd" + +#. (itstool) path: section/p +#: C/software-metadata.page:107 +msgid "" +"Software displays a hardware support tile on the details page for an " +"application. This combines information about the hardware requirements of the " +"application, and the hardware capabilities of the computer, with the aim of highlighting " +"incompatibilities or missing requirements — or to indicate that the application should " +"work correctly with no incompatibilities." +msgstr "" +"Programvara visar en hårdvarustödruta på detaljsidan för ett program. Denna " +"kombinerar information om hårdvarukraven för programmet och datorns hårdvaruförmågor, med " +"målet att belysa ej kompatibla saker eller saknade krav — eller för att indikera att " +"programmet bör fungera korrekt utan några kompatibilitetsproblem." + +#. (itstool) path: section/p +#: C/software-metadata.page:116 +msgid "The code looks at the following hardware. More may be supported in future." +msgstr "Koden tittar på följande hårdvara. Stöd för fler kan läggas till i framtiden." + +#. (itstool) path: item/p +#: C/software-metadata.page:118 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "Huruvida en styrplatta, en mus eller ett tangentbord är närvarande/behövs" + +#. (itstool) path: item/p +#: C/software-metadata.page:119 +msgid "Whether a gamepad is needed" +msgstr "Huruvida en spelkontroll behövs" + +#. (itstool) path: item/p +#: C/software-metadata.page:120 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "Den minsta och rekommenderade visningsstorleken som programmet kan skalas till" + +#. (itstool) path: section/p +#: C/software-metadata.page:123 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, as they are " +"often left disconnected due to not being needed for normal computer use." +msgstr "" +"Det är inte möjligt att på ett tillförlitligt sätt avgöra huruvida en spelkontroll är " +"närvarande, då de ofta kopplas från för att de inte behövs vid normal " +"datoranvändning." + +#. (itstool) path: section/p +#: C/software-metadata.page:124 +msgid "" +"The dialog which appears when the tile is clicked lists the different hardware " +"requirements of the app, and whether any of them are not met." +msgstr "" +"Dialogrutan som dyker upp när rutan klickas på listar de olika hårdvarukraven för " +"programmet, samt huruvida något av dem inte uppfylls." + +#. (itstool) path: section/p +#: C/software-metadata.page:125 +msgid "You can improve the hardware information:" +msgstr "Du kan förbättra hårdvaruinformationen:" + +#. (itstool) path: item/p +#: C/software-metadata.page:128 +msgid "" +"How to add missing hardware " +"information" +msgstr "" +"Hur du lägger till saknad " +"hårdvaruinformation" + +#. (itstool) path: section/title +#: C/software-metadata.page:134 +msgid "Age rating" +msgstr "Åldersklassificering" + +#. (itstool) path: section/p +#: C/software-metadata.page:135 +msgid "" +"Software displays an age rating tile on the details page for an application. " +"This shows what age range the application should be suitable for, based on different " +"kinds of content which the application has declared it contains. This information is " +"summarized in a format similar to the game or film rating certificates for your country." +msgstr "" +"Programvara visar en åldersklassificeringsruta på detaljsidan för ett program. " +"Denna visar vilket åldersintervall programmet bör vara lämpligt för, baserat på olika " +"sorters innehåll som programmet har deklarerat att det innehåller. Denna information " +"sammanfattas i ett format liknande spel- eller filmåldersgränserna för ditt land." + +#. (itstool) path: section/p +#: C/software-metadata.page:136 +msgid "" +"For example, this will highlight whether a game contains violence, or whether an " +"application contains in-app advertising." +msgstr "" +"Detta kommer exempelvisa markera huruvida ett spel innehåller våld, eller huruvida ett " +"program innehåller reklam." + +#. (itstool) path: section/p +#: C/software-metadata.page:137 +msgid "" +"The dialog which appears when the tile is clicked lists the different types of content in " +"the application and how severe that content is." +msgstr "" +"Dialogrutan som dyker upp när rutan klickas på listar de olika typerna av innehåll i " +"programmet, samt hur grovt det innehållet är." + +#. (itstool) path: section/p +#: C/software-metadata.page:138 +msgid "You can improve the age rating information:" +msgstr "Du kan förbättra åldersklassificeringsinformationen:" + +#. (itstool) path: item/p +#: C/software-metadata.page:141 +msgid "" +"How to add missing content " +"rating information" +msgstr "" +"Hur du lägger till saknad " +"innehållsklassificeringsinformation" + +#. (itstool) path: section/title +#: C/software-metadata.page:147 +msgid "License" +msgstr "Licens" + +#. (itstool) path: section/p +#: C/software-metadata.page:150 +msgid "" +"Software displays a tile indicating whether an application is free software " +"or whether its license is proprietary, special or unknown. This tile includes more " +"detailed information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" +"Programvara visar en ruta som indikerar huruvida ett program är fri programvara eller om dess licens är proprietär, speciell eller okänd. Denna ruta innehåller mer " +"detaljerad information om projektets licens. Denna ruta listar också några av fördelarna " +"med fri programvara. Läs mer" + +#. (itstool) path: section/p +#: C/software-metadata.page:151 +msgid "" +"Sometimes the license information isn’t correct for an application, and hence an " +"application which is actually free software will be shown as ‘proprietary’. Similarly, " +"sometimes the license information is unknown." +msgstr "" +"Ibland är licensinformationen inte korrekt för ett program, så ett program som faktiskt " +"är fri programvara kommer visas som ”proprietärt”. På liknande sätt är ibland " +"licensinformationen okänd." + +#. (itstool) path: section/p +#: C/software-metadata.page:152 +msgid "" +"Software highlights free and open-source licenses in green, proprietary and " +"special licenses in yellow as shown here. Unknown licenses are highlighted in grey." +msgstr "" +"Programvara markerar fria och öppna källkodslicenser i grönt, proprietära och " +"speciella licenser i gult som visas här. Okända licenser markeras grått." + +#. (itstool) path: section/p +#: C/software-metadata.page:153 +msgid "You can add or improve the license information:" +msgstr "Du kan lägga till eller förbättra licensinformationen:" + +#. (itstool) path: item/p +#: C/software-metadata.page:156 +msgid "" +"How to fix incorrect licensing " +"information" +msgstr "" +"Hur du fixar felaktig " +"licensinformation" + +#. (itstool) path: section/title +#: C/software-metadata.page:162 +msgid "Links" +msgstr "Länkar" + +#. (itstool) path: section/p +#: C/software-metadata.page:164 +msgid "" +"Software displays a list of application resource links in the link tile. They " +"are as follows:" +msgstr "" +"Programvara visar en lista över programresurslänkar i länkrutan. De är " +"följande:" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Website link" +msgstr "Webbplatslänk" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Donation link" +msgstr "Donationslänk" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Translation contribution link" +msgstr "Länk för att bidra med översättningar" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Bug reporting link" +msgstr "Felrapporteringslänk" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Help link" +msgstr "Länk till hjälp" + +#. (itstool) path: td/p +#: C/software-metadata.page:188 +msgid "Contact link" +msgstr "Kontaktlänk" + +#. (itstool) path: section/p +#: C/software-metadata.page:191 +msgid "" +"Some or all of these links may be present depending on whether they are listed in the " +"application’s metainfo file." +msgstr "" +"Några eller alla av dessa länkar kan vara närvarande beroende på huruvida de listas i " +"programmets metainfo-fil." + +#. (itstool) path: section/p +#: C/software-metadata.page:192 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the following " +"tile with a question mark will be displayed." +msgstr "" +"I fall där programmets metainfo-fil inte innehåller någon länk så kommer följande ruta " +"med ett frågetecken att visas." + +#. (itstool) path: section/p +#: C/software-metadata.page:194 +msgid "You can improve the links:" +msgstr "Du kan förbättra länkarna:" + +#. (itstool) path: item/p +#: C/software-metadata.page:197 +msgid "How to add missing links" +msgstr "Hur du lägger till saknade länkar" + +#. (itstool) path: section/title +#: C/software-metadata.page:203 +msgid "Carousel tile" +msgstr "Karusellruta" + +#. (itstool) path: section/p +#: C/software-metadata.page:205 +msgid "" +"Applications which are featured by Software are displayed in a carousel at the " +"top of the main window as shown here. Each carousel tile has a background color which is " +"automatically extracted from the application’s icon. Sometimes this background color is " +"not quite right for the application and needs to be specified explicitly by the " +"application developer." +msgstr "" +"Program som föreslås av Programvara visas i en karusell högst upp i " +"huvudfönstret, som kan ses här. Varje karusellruta har en bakgrundsfärg som extraheras " +"automatiskt från programmets ikon. Ibland är denna bakgrundsfärg inte riktigt rätt för " +"programmet och behöver anges explicit av programutvecklaren." + +#. (itstool) path: section/p +#: C/software-metadata.page:206 +msgid "" +"The set of applications which are featured is decided by the Linux distribution " +"maintainers." +msgstr "Uppsättningen föreslagna program bestäms av de ansvariga för Linux-distributionen." + +#. (itstool) path: section/p +#: C/software-metadata.page:207 +msgid "You can improve the carousel tile:" +msgstr "Du kan förbättra karusellrutan:" + +#. (itstool) path: item/p +#: C/software-metadata.page:210 +msgid "" +"How to set the carousel " +"tile background color" +msgstr "" +"Hur du ställer in " +"karusellrutans bakgrundsfärg" + +#. (itstool) path: section/title +#: C/software-metadata.page:216 +msgid "Where metadata comes from" +msgstr "Var metadata kommer från" + +#. (itstool) path: section/p +#: C/software-metadata.page:217 +msgid "" +"The metadata used to specify what hardware a piece of software requires, what ages of " +"user it is suitable for, and factors which contribute to how safe it might be to install, " +"all come from the metainfo file for that software." +msgstr "" +"Metadata som används för att specificera vilken hårdvara en programvara kräver, vilka " +"åldrars användare den är lämplig för, och faktorer som bidrar till hur säker den kan vara " +"att installera, kommer från metainfo-filen för programvaran." + +#. (itstool) path: section/p +#: C/software-metadata.page:218 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream specification." +msgstr "" +"metainfo-filen är en XML-fil. Dess filformat anges i AppStream-specifikationen." + +#. (itstool) path: section/p +#: C/software-metadata.page:219 +msgid "" +"See the metainfo file for GNOME Files app." +msgstr "" +"Se metainfo-filen för programmet GNOME Filer." + +#. (itstool) path: note/p +#: C/software-metadata.page:221 +msgid "appdata is the older term for metainfo." +msgstr "appdata är den tidigare termen för metainfo." + +#. (itstool) path: section/title +#: C/software-metadata.page:226 +msgid "What happens if metadata is missing" +msgstr "Vad händer om metadata saknas" + +#. (itstool) path: section/p +#: C/software-metadata.page:227 +msgid "" +"If some metadata is missing for an application, Software can only guess what " +"it might be, and hence can’t present much information in its interfaces. The guesses " +"Software makes are based on the fact that most software is designed for " +"desktop computers." +msgstr "" +"Om några metadata saknas för ett program kan Programvara bara gissa vad de " +"borde vara, och kan därför inte presentera mycket information i sina gränssnitt. " +"Gissningarna som Programvara gör baseras på faktum att den mesta programvara " +"designas för skrivbordsdatorer." + +#. (itstool) path: section/p +#: C/software-metadata.page:228 +msgid "You can help improve the metadata for an application!" +msgstr "" +"Du kan hjälpa till att förbättra metadata för ett program!" + +#. (itstool) path: section/title +#: C/software-metadata.page:232 +msgid "How to contribute missing information" +msgstr "Hur du bidrar med saknad information" + +#. (itstool) path: section/p +#: C/software-metadata.page:233 +msgid "" +"If you find that an app’s page is missing information or has incorrect information, you " +"can contribute in one of the two ways:" +msgstr "" +"Om du upptäcker att ett programs sida saknar information eller innehåller felaktig " +"information så kan du bidra på ett av följande två sätt:" + +#. (itstool) path: item/p +#: C/software-metadata.page:236 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug tracker, so " +"the app developer can fix it." +msgstr "" +"Du kan rapportera saknade / felaktiga metadata till respektive programs " +"felhanteringssystem, så programmets utvecklare kan fixa det." + +#. (itstool) path: item/p +#: C/software-metadata.page:239 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How " +"to guide below on how to do that." +msgstr "" +"Du kan fixa saknade / felaktiga metadata själv. Se guiden nedan " +"för att lära dig hur." + +#. (itstool) path: section/p +#: C/software-metadata.page:243 +msgid "" +"For both, you first need to find the app’s project page. The link to the project page " +"should typically be available in the app’s page as shown here. If not, you will need to find it with a simple search on Google." +msgstr "" +"För båda behöver du först hitta programmets projektsida. Länken till projektsidan bör " +"typiskt finnas på programmets sida som visas här. Om inte " +"kommer du behöva hitta den med en enkel Google-sökning." + +#. (itstool) path: section/p +#: C/software-metadata.page:245 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" +"Program lagras typiskt på GitLab eller GitHub. Exempelvis lagras GNOME-program på gitlab.gnome.org." + +#. (itstool) path: section/title +#: C/software-metadata.page:249 +msgid "How to add missing app screenshots" +msgstr "Hur du lägger till saknade skärmbilder för program" + +#. (itstool) path: section/p +#: C/software-metadata.page:250 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s " +"<component> in its metainfo file." +msgstr "" +"Skärmbildsinformationen för ett program lagras i <" +"screenshots>-elementet i programmets <component> i " +"dess metainfo-fil." + +#. (itstool) path: section/p +#: C/software-metadata.page:251 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots should " +"ideally be in the PNG format with 16:9 aspect ratio and minimum width of 620 pixels." +msgstr "" +"Rekommenderat antal skärmbilder för ett program är mellan 5 och 10. Skärmbilder ska " +"idealiskt vara i formatet PNG med bildförhållandet 16:9 och en minsta bredd på 620 " +"bildpunkter." + +#. (itstool) path: section/p +#: C/software-metadata.page:252 +msgid "For example, here are the screenshot entries for the Software app:" +msgstr "Här är exempelvis skärmbildsposterna för programmet Programvara:" + +#. (itstool) path: section/code +#: C/software-metadata.page:253 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:267 +msgid "How to fix incorrect safety and permissions information" +msgstr "Hur du fixar felaktig säkerhets- och rättighetsinformation" + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"The safety and permissions information for an application comes from different sources " +"depending on how the application is packaged. For traditionally packaged applications, " +"for example in RPM or DEB format, there is no safety or permissions information available " +"and nothing can be done to add it to an application." +msgstr "" +"Säkerhets- och rättighetsinformation för ett program kommer från olika källor beroende på " +"hur programmet paketeras. För traditionellt paketerade program, exempelvis i RPM- eller " +"DEB-format, så finns det ingen säkerhets- och rättighetsinformation tillgänglig och inget " +"kan göras för att lägga till den till ett program." + +# TODO: eventuellt *or* unsafe +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, " +"specifying what holes in the sandbox the application requires. Each of these holes " +"typically contributes to lowering the displayed safety level of the application in " +"Software — moving it from ‘safe’ to ‘potentially unsafe’ to ‘unsafe’." +msgstr "" +"För flatpak-program kommer informationen från programmets flatpak-manifest, vilket anger vilka hål i " +"sandlådan som programmet kräver. Vart och ett av dess hål bidrar typiskt till att sänka " +"den visade säkerhetsnivån för programmet i Programvara — och flyttar det från " +"”säkert” till ”potentiellt osäkert” eller ”osäkert”." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 +msgid "" +"In order to improve the safety level of an application, its sandboxing must be made as " +"tight as possible, by removing sandbox permissions where they’re not needed, and using portals instead of sandbox permissions where possible. Use of portals does not lower the " +"displayed safety level of an application in Software." +msgstr "" +"För att förbättra säkerhetsnivån för ett program behöver dess sandlåda göras så trång som " +"möjligt genom att ta bort sandlåderättigheter där de inte behövs, och använda portaler i stället för sandlåderättigheter där möjligt. Användning av portaler sänker inte " +"den visade säkerhetsnivån för ett program i Programvara." + +#. (itstool) path: section/p +#: C/software-metadata.page:271 +msgid "" +"For example, if the application requests read/write access to the full file system " +"(--filesystem=host), does it actually need that, or does it only need to " +"access files in a few specific locations? If so, the file portal could be used, or " +"more specific file system permissions could be specified." +msgstr "" +"Om programmet exempelvis begär läs/skrivåtkomst till hela filsystemet (--" +"filesystem=host), behöver det verkligen det, eller behöver det bara komma åt filer " +"på några få specifika platser? Om så är fallet skulle filportalen kunna användas, eller " +"så skulle mer specifika filsystemsrättigheter kunna användas." + +#. (itstool) path: section/p +#: C/software-metadata.page:272 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a fallback, without " +"using special X11 features, could it use --socket=fallback-x11 rather than " +"--socket=x11?" +msgstr "" +"Om programmet fungerar i Wayland, och bara behöver fungera i X11 som en reserv, utan att " +"använda speciella X11-funktioner, skulle det kanske kunna använda --socket=fallback-" +"x11 snarare än --socket=x11?" + +#. (itstool) path: section/p +#: C/software-metadata.page:273 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be added here in " +"future." +msgstr "" +"Guider kring specifika rättigheter eller andra paketformat kan läggas till här i " +"framtiden." + +#. (itstool) path: section/p +#: C/software-metadata.page:274 C/software-metadata.page:312 +msgid "Further reading:" +msgstr "Vidare läsning:" + +#. (itstool) path: section/title +#: C/software-metadata.page:289 +msgid "How to add missing hardware information" +msgstr "Hur du lägger till saknad hårdvaruinformation" + +#. (itstool) path: section/p +#: C/software-metadata.page:290 +msgid "" +"The hardware information for an application is stored in the <" +"requires>, <recommends> and <supports> elements within the application’s <component> in its metainfo " +"file." +msgstr "" +"Hårdvaruinformationen för ett program lagras i <requires>-, <recommends>- och <supports>-element " +"i programmets <component> i dess metainfo-fil." + +#. (itstool) path: section/p +#: C/software-metadata.page:291 +msgid "" +"Software understands the <control> and <display_length> elements." +msgstr "" +"Programvara förstår elementen <control> och <display_length>." + +#. (itstool) path: section/p +#: C/software-metadata.page:292 +msgid "" +"See this blog post or this blog " +"post for examples of metadata." +msgstr "" +"Se den här bloggposten eller den här bloggposten för exempel på metadata." + +#. (itstool) path: section/title +#: C/software-metadata.page:296 +msgid "How to add missing content rating information" +msgstr "Hur du lägger till saknad innehållsklassificeringsinformation" + +#. (itstool) path: section/p +#: C/software-metadata.page:297 +msgid "" +"The content rating information for an application is stored in the <content_rating> element within the " +"application’s <component> in its metainfo file." +msgstr "" +"Innehållsklassificeringsinformationen för ett program lagras i <" +"content_rating>-elementet i programmets <component> i " +"dess metainfo-fil." + +#. (itstool) path: section/p +#: C/software-metadata.page:298 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If the <" +"content_rating> element is not specified, the application’s content rating is " +"unknown. If it’s specified but empty, the application has no content which might be " +"unsuitable for any audience." +msgstr "" +"Program bör använda OARS 1.1-standarden för att fylla i detta element. Om <" +"content_rating>-elementet inte angivits så är programmets " +"innehållsklassificering okänd. Om det angivits men är tomt så har programmet inte något " +"innehåll som skulle kunna vara olämpligt för någon publik." + +#. (itstool) path: section/p +#: C/software-metadata.page:299 +msgid "" +"Use the OARS generator to produce " +"suitable content rating information for an application." +msgstr "" +"Använd OARS-generatorn för att " +"producera lämplig innehållsklassificeringsinformation för ett program." + +#. (itstool) path: section/title +#: C/software-metadata.page:303 +msgid "How to fix incorrect licensing information" +msgstr "Hur du fixar felaktig licensinformation" + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"The licensing information for an application is stored in the <project_license> element within the " +"application’s <component> in its metainfo file." +msgstr "" +"Licensinformationen för ett program lagras i <" +"project_license>-elementet i programmets <component> " +"i dess metainfo-fil." + +#. (itstool) path: section/p +#: C/software-metadata.page:305 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license for the " +"project. This should typically be the license of the code, and not include the license of " +"the documentation or ancillary content." +msgstr "" +"Innehållet i detta element ska vara ett SPDX-uttryck som beskriver den ”huvudsakliga” licensen för " +"projektet. Detta ska typiskt vara licensen för koden, och inte inkludera licensen för " +"dokumentationen eller sekundärt innehåll." + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of multiple licenses, " +"which are all FSF or OSI approved, the " +"application is considered ‘free software’ and the license tile says so. Otherwise, it’s " +"considered ‘proprietary’." +msgstr "" +"Om SPDX-uttrycket är en ensam licens, eller en ”or”-kombination av flera licenser, vilka " +"alla är godkända av FSF eller OSI, så " +"anses programmet vara ”fri programvara” och licensrutan säger det. Annars anses det vara " +"”proprietärt”." + +#. (itstool) path: section/p +#: C/software-metadata.page:307 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it shouldn’t be, " +"it’s likely that the <project_license> element includes the " +"documentation license for the project. Remove it." +msgstr "" +"Om ett program visas som ”proprietärt” trots att du tycker det inte borde vara det så är " +"det troligt att <project_license>-elementet inkluderar licensen för " +"projektets dokumentation. Ta bort den." + +#. (itstool) path: section/p +#: C/software-metadata.page:308 +msgid "" +"For example, " +"change the license metadata from:" +msgstr "" +"Till exempel, " +"ändra licensmetadata från:" + +#. (itstool) path: section/code +#: C/software-metadata.page:309 +#, no-wrap +msgid "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:310 +msgid "to" +msgstr "till" + +#. (itstool) path: section/code +#: C/software-metadata.page:311 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +#. (itstool) path: item/p +#: C/software-metadata.page:315 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" +"Sätt (allmänt) inte dokumentationslicensen i appdata" + +#. (itstool) path: section/title +#: C/software-metadata.page:324 +msgid "How to add missing links" +msgstr "Hur du lägger till saknade länkar" + +#. (itstool) path: section/p +#: C/software-metadata.page:325 +msgid "" +"The links for an application are stored as <url> " +"elements within the application’s <component> in its metainfo file." +msgstr "" +"Länkarna för ett program lagras som <url>-element i " +"programmets <component> i dess metainfo-fil." + +#. (itstool) path: section/p +#: C/software-metadata.page:326 +msgid "" +"Add as many of the link types documented in the appstream specification as " +"are available for the application. If no suitable page exists for a given link type, it " +"doesn’t have to be included." +msgstr "" +"Lägg till så många av länktyperna dokumenterade i appstream-specifikationen " +"som finns tillgängliga för programmet. Om ingen lämplig sida finns för en viss länktyp så " +"behöver den inte inkluderas." + +#. (itstool) path: section/p +#: C/software-metadata.page:327 +msgid "For example, here are the resource links for the Software app:" +msgstr "Här är exempelvis resurslänkarna för programmet Programvara:" + +#. (itstool) path: section/code +#: C/software-metadata.page:328 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software</url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</url>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/</url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:339 +msgid "How to set the carousel tile background color" +msgstr "Hur du ställer in karusellrutans bakgrundsfärg" + +#. (itstool) path: section/p +#: C/software-metadata.page:340 +msgid "" +"The carousel tile background color is normally extracted automatically from the " +"application’s icon. If that color is unsatisfactory, however, it can be overridden by " +"using the appstream’s <branding/> element with " +"declared colors (since 47.x series). The advantage is that more clients can use the " +"colors." +msgstr "" +"Karusellrutans bakgrundsfärg extraheras vanligen automatiskt från programmets ikon. Om " +"den färgen inte är till belåtenhet kan den dock åsidosättas genom att använda appstreams <branding/>-element med deklarerade " +"färger (sedan 47.x-serien). Fördelen är att fler klienter kan använda färgerna." + +#. (itstool) path: section/p +#: C/software-metadata.page:341 +msgid "For example, here are some branding entries:" +msgstr "Här är exempelvis några branding-poster:" + +#. (itstool) path: section/code +#: C/software-metadata.page:342 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color>\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color>\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:348 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses " +"the better color for the theme on its own." +msgstr "" +"Observera att attributet scheme_preference ignoreras, Programvara " +"väljer själv den bästa färgen för temat." + +#. (itstool) path: section/p +#: C/software-metadata.page:350 +msgid "" +"There is left, for backward compatibility, the possibility to add the following XML to " +"the application’s metainfo <component> element:" +msgstr "" +"För bakåtkompatibilitet finns möjligheten kvar att lägga till följande XML till " +"programmets <component>-element i metainfo:" + +#. (itstool) path: section/code +#: C/software-metadata.page:351 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16, 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:355 +msgid "but the <branding/> element has a precedence." +msgstr "men <branding/>-elementet har prioritet." + +#. (itstool) path: section/p +#: C/software-metadata.page:356 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format GVariant with type " +"a(yyy), and represents an unordered set of key colors for the application. " +"Each element of the set is a color in RGB form ranging from (0, 0, 0) to " +"(255, 255, 255)." +msgstr "" +"Värdet på GnomeSoftware::key-colors är en GVariant av textformat med typ " +"a(yyy), och representerar en oordnad mängd nyckelfärger för programmet. " +"Varje element i mängden är en färg i RGB-format i intervallet (0, 0, 0) till " +"(255, 255, 255)." + +#. (itstool) path: section/p +#: C/software-metadata.page:357 +msgid "Colors should be chosen so that they:" +msgstr "Färger ska väljas så att de:" + +#. (itstool) path: item/p +#: C/software-metadata.page:360 +msgid "" +"Are identifiable to the application, matching the application’s branding in some way, if " +"possible." +msgstr "" +"Är identifierbara till programmet, matchande programmets färgtema på något sätt om " +"möjligt." + +#. (itstool) path: item/p +#: C/software-metadata.page:363 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used as a " +"background behind it, the icon can be distinguished." +msgstr "" +"Har kontrast med kanten på programmets ikon, så att när de används som en bakgrund bakom " +"ikonen så kan ikonen urskiljas." + +#. (itstool) path: item/p +#: C/software-metadata.page:366 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and " +"in its dark variant (#eeeeec). This generally means choosing a color with a " +"medium level of brightness." +msgstr "" +"Har kontrast med förgrundstextfärgen i Adwaita-temat (#2e3436) och i dess " +"mörka variant (#eeeeec). Detta betyder generellt att välja en färg med en " +"medelnivå av ljushet." + +#. (itstool) path: item/p +#: C/software-metadata.page:369 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" +"Kontrast kan kontrolleras med programmet Kontrast." + +#. (itstool) path: section/p +#: C/software-metadata.page:372 +msgid "" +"At least one color should be specified. More can be specified if one color can’t satisfy " +"all the requirements above, and Software will choose the most appropriate to " +"use in the carousel tile. If exactly one color is specified, its brightness and " +"saturation may be modified to improve contrast with the foreground color. If more than " +"one color is specified, the one with the best contrast with the foreground color will be " +"chosen, and its brightness and saturation will not be modified." +msgstr "" +"Minst en färg bör anges. Fler kan anges om inte en färg kan uppfylla alla kraven ovan, så " +"kommer Programvara välja den lämpligaste att använda i karusellrutan. Om exakt " +"en färg anges kan dess ljusstyrka och mättnad modifieras för att förbättra kontrast mot " +"förgrundsfärgen. Om mer än en färg anges kommer den med bäst kontrast mot förgrundsfärgen " +"att väljas, och dess ljusstyrka och mättnad kommer inte modifieras." + +#. (itstool) path: section/title +#: C/software-metadata.page:376 +msgid "How to test carousel tile background color changes" +msgstr "Hur du testar ändringar i karusellrutans bakgrundsfärg" + +#. (itstool) path: section/p +#: C/software-metadata.page:377 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" +"Modifiera metainfo-filen för ditt program, och kör sedan Programvara med:" + +#. (itstool) path: section/p +#: C/software-metadata.page:378 +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml,icon=/path/" +"to/app/icon.png" +msgstr "" +"gnome-software --show-metainfo=/sökväg/till/app.metainfo.xml,icon=/" +"sökväg/till/programmets/ikon.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:379 +msgid "" +"The details page for your application will be shown. If you navigate back to the overview " +"page of Software, your application will be the only one in the ‘featured’ " +"carousel." +msgstr "" +"Detaljsidan för ditt program kommer visas. Om du navigerar tillbaka till översiktssidan " +"för Programvara kommer ditt program vara det enda i karusellen ”i blickfånget”." diff --git a/help/uk/figures/app-context-bar.png b/help/uk/figures/app-context-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..590fb71a9124cc0d1bf2d8433e310a35485e2ee6 GIT binary patch literal 8242 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, 2024. +# Yuri Chornoivan , 2024. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"POT-Creation-Date: 2024-10-08 11:56+0000\n" +"PO-Revision-Date: 2024-10-27 18:30+0200\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=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Lokalize 23.04.3\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Юрій Чорноіван , 2024" + +#. (itstool) path: credit/name +#: C/how-to-reinstall-a-web-app.page:15 +msgid "Phaedrus Leeds" +msgstr "Федрус Лідс" + +#. (itstool) path: info/desc +#. (itstool) path: page/title +#: C/how-to-reinstall-a-web-app.page:21 C/how-to-reinstall-a-web-app.page:24 +msgid "How to reinstall a Webapp" +msgstr "Як перевстановити вебпрограму" + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:26 +msgid "Software supports managing two types of web apps:" +msgstr "У Програмах передбачено підтримку двох типів вебпрограм:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:28 +msgid "" +"Web apps for which AppStream metainfo has been shipped with Software. See README.md." +msgstr "" +"Вебпрограми, з метаданими AppStream яких постачаються Програми." +" Див. README.md." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:29 +msgid "" +"Web apps which have been installed using GNOME Web." +msgstr "" +"Вебпрограми, які було встановлено за допомогою GNOME Тенет." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:31 +msgid "" +"The first type are displayed as available to install in Software " +"(when this functionality has been enabled by the distribution), whereas the " +"second type only show up in Software after they have been " +"installed via GNOME Web. If you uninstall such an app and want to reinstall " +"it, you must do so using GNOME Web." +msgstr "" +"Програми першого типу буде показано як доступні до встановлення у Програмах (якщо цю можливість було увімкнено дистрибутивом), а" +" програми другого типу буде показано у Програмах лише після" +" встановлення за допомогою «Тенет GNOME». Якщо ви вилучите таку програму і" +" захочете повторно її встановити, вам слід робити це за допомогою «Тенет" +" GNOME»." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:33 +msgid "Here are the steps to install a web app using GNOME Web:" +msgstr "Ось інструкція, як встановити вебпрограму в GNOME Тенет:" + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:35 +msgid "" +"Click the app Menu button in the top right as " +"shown in the image below." +msgstr "" +"Натисніть кнопку Меню згори праворуч, як " +"показано на картинці внизу." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:36 +msgid "" +"Click on Install as Web App… menu item. This " +"should open the web app creation dialog." +msgstr "" +"Натисніть Встановити як вебпрограму… в меню. " +"Має відкритися вікно створення вебпрограми." + +#. (itstool) path: item/p +#: C/how-to-reinstall-a-web-app.page:37 +msgid "" +"Click the Create button to create and install " +"the web app." +msgstr "" +"Натисніть кнопку Створити, щоб створити та " +"встановити вебпрограму." + +#. (itstool) path: page/p +#: C/how-to-reinstall-a-web-app.page:40 +msgid "" +"The web app should now show up in Software’s Installed tab." +msgstr "" +"Тепер ця програма буде показана в Програмах, у вкладці Встановлено." + +#. (itstool) path: page/title +#: C/index.page:13 +msgid "Software" +msgstr "Програми" + +#. (itstool) path: p/link +#: C/legal.xml:8 +msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License" +msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License" + +#. (itstool) path: license/p +#: C/legal.xml:8 +msgid "This work is licensed under a <_:link-1/>." +msgstr "Цей текст поширено під ліцензією <_:link-1/>." + +#. (itstool) path: credit/name +#: C/software-licensing.page:15 C/software-metadata.page:17 +msgid "Philip Withnall" +msgstr "Філіп Візналл" + +#. (itstool) path: info/desc +#: C/software-licensing.page:21 +msgid "Introduction on Software Licensing" +msgstr "Вступ до ліцензування програмного забезпечення" + +#. (itstool) path: page/title +#: C/software-licensing.page:24 +msgid "Software Licensing" +msgstr "Ліцензування програмного забезпечення" + +#. (itstool) path: section/title +#: C/software-licensing.page:27 +msgid "Introduction" +msgstr "Вступ" + +#. (itstool) path: section/p +#: C/software-licensing.page:28 +msgid "" +"Apps can be ‘free/open source software’ or ‘proprietary’. This affects the " +"freedoms you as a user have. If an app is free/open source software (FOSS), you have the freedom to use it, copy it, study and change its source " +"code. Proprietary software does not provide you with those freedoms. FOSS " +"software is often available for no charge, but this is not always true." +msgstr "" +"Програми можуть бути „вільними/open-source“ або „пропрієтарними“ " +"(власницькими). Це визначає права, які ви маєте як користувач. Якщо програма " +"вільна, то ви маєте право користуватися нею, копіювати її, та вивчати і " +"редагувати її код. Власницьке ПЗ не надає вам деякі з цих прав. Вільне ПЗ " +"зазвичай безкоштовне, але це не завжди так." + +#. (itstool) path: section/p +#: C/software-licensing.page:29 +msgid "" +"Because the source code is available for FOSS software, users can get " +"involved in its development, contributing features or translations to their " +"language and fixing bugs which affect them. They can audit the code and " +"check that changes to the software are not malicious. They can learn from " +"the source code and use it as the basis for their own FOSS applications." +msgstr "" +"Через те, що код вільного ПЗ є публічним, інші можуть долучатися до розробки " +"— додавати можливості, перекладати програму рідною мовою та виправляти вади, " +"які їм заважають, навчатися, читаючи її код, а також перевіряти її, щоб " +"впевнитись, що в ній немає зловмисного коду. Будь-хто може використовувати " +"вільний код як базу для своєї програми." + +#. (itstool) path: section/p +#: C/software-licensing.page:30 +msgid "" +"FOSS apps are a " +"public good." +msgstr "" +"Вільні програми вважаються суспільним благом." + +#. (itstool) path: section/p +#: C/software-licensing.page:31 +msgid "" +"Proprietary apps cannot be audited by their users, so you must trust that " +"the developers of the app have your best interests in mind, and no conflicts " +"of interest." +msgstr "" +"Код пропрієтарних програм не доступний для перевірки іншими, тож при " +"використанні пропрієтарного ПЗ вам треба впевнитись, що ви довіряєте " +"розробникам, і не маєте з ним конфлікту інтересів." + +#. (itstool) path: section/p +#: C/software-licensing.page:32 +msgid "" +"Read more about the benefits of FOSS " +"over proprietary software." +msgstr "" +"Більше інформації про переваги вільного ПЗ можна знайти " +"тут." + +#. (itstool) path: credit/name +#: C/software-metadata.page:21 +msgid "Will Thompson" +msgstr "Вілл Томпсон" + +#. (itstool) path: credit/name +#: C/software-metadata.page:25 +msgid "Milan Crha" +msgstr "Мілан Чрха" + +#. (itstool) path: info/desc +#: C/software-metadata.page:31 +msgid "How Software uses metadata" +msgstr "Як у Програмах використано метадані" + +#. (itstool) path: page/title +#: C/software-metadata.page:34 +msgid "Software Metadata" +msgstr "Метадані програм" + +#. (itstool) path: section/title +#: C/software-metadata.page:38 +msgid "Screenshots" +msgstr "Скріншоти" + +#. (itstool) path: section/p +#: C/software-metadata.page:40 +msgid "" +"Software displays the screenshots on the details page for an " +"application. This typically should include screenshots of various windows / " +"dialogs of the application, so the user would get a quick grasp of the " +"application’s features, look and feel etc." +msgstr "" +"Програми показують знімки вікна програми на сторінці з " +"подробицями щодо неї. Зазвичай це знімки всіляких вікон програми, щоб можна " +"було швидко дізнатись про можливості програми, її вигляд тощо." + +#. (itstool) path: section/p +#: C/software-metadata.page:41 +msgid "" +"When more than one screenshot is present in the application’s metainfo file, " +"Software will show the screenshots in a carousel." +msgstr "" +"Коли у файлі метаданих декілька знімків вікно, їх буде показано у " +"Програмах у форматі «каруселі»." + +#. (itstool) path: section/p +#: C/software-metadata.page:42 +#| msgid "" +#| "In cases when the application’s metainfo file doesn’t contain any " +#| "screenshot, then a missing image icon will be displayed: <_:media-1/>" +msgid "" +"In cases when the application’s metainfo file doesn’t contain any " +"screenshot, then a placeholder icon as below with No Screenshots will be displayed:" +msgstr "" +"У випадку, якщо файл метаданих не містить жодного знімка, буде показано" +" піктограму-замінник, як нижче, з написом Немає знімків:" + +#. (itstool) path: note/p +#: C/software-metadata.page:45 +msgid "" +"Placeholder icon might look different if you're using a custom icon theme." +msgstr "" +"Піктограма-замінник може виглядати інакше, якщо ви користуєтеся нетиповою" +" темою піктограм." + +#. (itstool) path: section/p +#: C/software-metadata.page:47 +msgid "" +"Screenshots might become outdated as the application’s UI changes. So, even " +"if Software shows screenshots for an app, it’s important to check " +"if these screenshots are up-to-date or outdated." +msgstr "" +"З розвитком інтерфейсу програми знімки вікон можуть застарівати. Тому," +" навіть якщо Програми показують знімки вікон певної програми," +" важливо перевірити, чи є ці знімки актуальними." + +#. (itstool) path: section/p +#: C/software-metadata.page:48 +msgid "You can improve app screenshot information:" +msgstr "Ви можете удосконалити дані щодо знімка вікна програми:" + +#. (itstool) path: item/p +#: C/software-metadata.page:51 +msgid "" +"How to add missing app " +"screenshots" +msgstr "" +"Як додати знімки вікон" + +#. (itstool) path: section/title +#: C/software-metadata.page:57 +msgid "App context bar" +msgstr "Панель контексту програм" + +#. (itstool) path: section/p +#: C/software-metadata.page:58 +msgid "" +"The app context bar in Software is a collection of tiles on the " +"details page for an application, which display the following details." +msgstr "" +"Панель контексту програм у Програмах є набором плиток на сторінці" +" подробиць програми, де буде показано вказані нижче дані." + +#. (itstool) path: item/p +#: C/software-metadata.page:61 +msgid "Storage" +msgstr "Сховище даних" + +#. (itstool) path: item/p +#: C/software-metadata.page:64 +msgid "Safety" +msgstr "Безпека" + +#. (itstool) path: item/p +#: C/software-metadata.page:67 +msgid "Hardware support" +msgstr "Підтримка апаратної частини" + +#. (itstool) path: item/p +#: C/software-metadata.page:70 +msgid "Age rating" +msgstr "Віковий рейтинг" + +#. (itstool) path: section/p +#. Translators: Refer +#. https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/Help-Translation-Notes +#. for steps to localize 'figures/app-context-bar.png' image. +#: C/software-metadata.page:74 +msgid "This shows the app context bar for the Software app:" +msgstr "Ось панель контексту програм для програми Програми:" + +#. (itstool) path: p/media +#. This is a reference to an external file such as an image or video. When +#. the file changes, the md5 hash will change to let you know you need to +#. update your localized copy. The msgstr is not used at all. Set it to +#. whatever you like once you have updated your copy of the file. +#: C/software-metadata.page:75 +msgctxt "_" +msgid "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" +msgstr "" +"external ref='figures/app-context-bar.png' " +"md5='3badcd9309bde27a650b25eb5d89a4c6'" + +#. (itstool) path: section/p +#. Translators: This text needs to be adjusted for RTL languages as the +#. tiles will be reversed in the UI. +#: C/software-metadata.page:78 +msgid "" +"The tiles are displayed in the order listed above (starting with " +"Storage tile on the left)." +msgstr "" +"Плитки буде показано у вказаному вище порядку (починаючи з плитки Сховище даних ліворуч)." + +#. (itstool) path: section/p +#: C/software-metadata.page:79 +msgid "Each tile is covered in detail below." +msgstr "Докладні відомості щодо кожної плитки наведено нижче." + +#. (itstool) path: section/title +#: C/software-metadata.page:83 +msgid "Storage" +msgstr "Сховище даних" + +#. (itstool) path: section/p +#: C/software-metadata.page:84 +msgid "" +"Software displays a storage tile on the details page for an " +"application. If the application is not installed, this displays the " +"estimated download size needed to install it. If the application is " +"installed, it displays the storage space used by the application." +msgstr "" +"Програми показують плитку сховища даних на сторінці подробиць" +" щодо програми. Якщо програму не встановлено, тут буде показано оцінку" +" потрібного розміру отриманих даних для встановлення програми. Якщо програму" +" встановлено, тут буде показано місце на диску, яке займають файли програми." + +#. (itstool) path: section/p +#: C/software-metadata.page:85 +msgid "" +"The sizes are calculated from data provided by the Software " +"backend (such as flatpak or an RPM), and are not specified in the metadata " +"provided by the application. There is nothing you can do to affect this tile " +"by editing an application’s metainfo file. It’s listed here for completeness." +msgstr "" +"Розміри буде обчислено на основі даних, які надано модулем обробки Програм (зокрема flatpak або RPM), а не на основі даних, які вказано" +" у метаданих програми. Редагування файла метаданих програми нічого не" +" змінить на цій плитці. Тут його включено для повноти." + +#. (itstool) path: section/title +#: C/software-metadata.page:89 +msgid "Safety" +msgstr "Безпека" + +#. (itstool) path: section/p +#: C/software-metadata.page:90 +msgid "" +"Software displays a safety tile on the details page for an " +"application. This summarizes information about whether the app can be " +"considered safe to install and run, or whether caution may be required " +"before trusting it." +msgstr "" +"Програми показують плитку безпеки на сторінці подробиць щодо" +" програми. Тут буде наведено резюме щодо того, слід вважати програму" +" безпечною для встановлення і запуску, чи слід мати певні перестороги щодо" +" довіри цій програмі." + +#. (itstool) path: section/p +#: C/software-metadata.page:91 +msgid "" +"This tile combines information about the permissions which the app requests " +"when it runs (such as permission to read your files), with information about " +"how the app was developed. Free software applications, where the source code " +"is publicly readable, can be more secure than proprietary ones, as they can " +"be audited." +msgstr "" +"На цій плитці поєднано відомості щодо прав доступу, яких програма" +" потребуватиме для роботи (зокрема прав доступу до читання ваших файлів) із" +" відомостями щодо способу розробки програми. Вільне програмне забезпечення," +" початковий код якого доступний до читання будь-кому, може бути безпечнішим" +" за закрите, оскільки початковий код таких програм є придатним до вивчення." + +#. (itstool) path: section/p +#: C/software-metadata.page:92 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"permissions the app requests, plus some information about its license and " +"runtime." +msgstr "" +"У вікні, яке буде відкрито у відповідь на натискання плитки, буде показано" +" списки різних прав доступу, які потрібні для роботи програми, а також деякі" +" відомості щодо ліцензування та середовища виконання." + +#. (itstool) path: section/p +#: C/software-metadata.page:93 +msgid "You can improve the safety information:" +msgstr "Ви можете удосконалити дані щодо захисту:" + +#. (itstool) path: item/p +#: C/software-metadata.page:96 +msgid "" +"How " +"to fix incorrect safety and permissions information" +msgstr "" +"Як" +" виправити неправильні відомості щодо захисту та прав доступу" + +#. (itstool) path: section/title +#: C/software-metadata.page:102 +msgid "Hardware support" +msgstr "Підтримка апаратної частини" + +#. (itstool) path: section/p +#: C/software-metadata.page:103 +msgid "" +"Software displays a hardware support tile on the details page for " +"an application. This combines information about the hardware requirements of " +"the application, and the hardware capabilities of the computer, with the aim " +"of highlighting incompatibilities or missing requirements — or to indicate " +"that the application should work correctly with no incompatibilities." +msgstr "" +"Програми покажуть плитку підтримки обладнання на сторінці з" +" відомостями щодо програми. Тут буде поєднано відомості щодо вимог до" +" апаратного забезпечення програми та апаратних можливостей комп'ютера з" +" метою акцентування несумісностей чи невідповідностей вимогам — або щоб" +" вказати, що програма має працювати правильно без несумісностей." + +#. (itstool) path: section/p +#: C/software-metadata.page:112 +msgid "" +"The code looks at the following hardware. More may be supported in future." +msgstr "" +"Програмний код спрямовано на пошук вказаного нижче обладнання. Перелік може" +" бути розширено у майбутньому." + +#. (itstool) path: item/p +#: C/software-metadata.page:114 +msgid "Whether a touchpad, mouse or keyboard is present/needed" +msgstr "" +"Чи наявна або потрібна підтримка сенсорної панелі, миші або клавіатури" + +#. (itstool) path: item/p +#: C/software-metadata.page:115 +msgid "Whether a gamepad is needed" +msgstr "Чи потрібен ігровий пульт" + +#. (itstool) path: item/p +#: C/software-metadata.page:116 +msgid "The minimum and recommended display size that the app can scale to" +msgstr "" +"Мінімальний та рекомендований розмір дисплея, до якого може бути" +" масштабовано вікно програми" + +#. (itstool) path: section/p +#: C/software-metadata.page:119 +msgid "" +"It’s not possible to reliably detect whether a gamepad is present, " +"as they are often left disconnected due to not being needed for normal " +"computer use." +msgstr "" +"Надійних способів визначити, чи використано ігровий пульт, оскільки" +" часто пульти лишаються від'єднаними від комп'ютера, оскільки вони не" +" потрібні для звичайного користування комп'ютером." + +#. (itstool) path: section/p +#: C/software-metadata.page:120 +msgid "" +"The dialog which appears when the tile is clicked lists the different " +"hardware requirements of the app, and whether any of them are not met." +msgstr "" +"У вікні, яке буде показано у відповідь на натискання плитки, буде показано" +" різні апаратні вимоги програми та те, чи усі з них виконано." + +#. (itstool) path: section/p +#: C/software-metadata.page:121 +msgid "You can improve the hardware information:" +msgstr "Ви можете удосконалити відомості щодо обладнання:" + +#. (itstool) path: item/p +#: C/software-metadata.page:124 +msgid "" +"How to add missing " +"hardware information" +msgstr "" +"Як додати пропущені" +" відомості щодо обладнання" + +#. (itstool) path: section/title +#: C/software-metadata.page:130 +msgid "Age rating" +msgstr "Віковий рейтинг" + +#. (itstool) path: section/p +#: C/software-metadata.page:131 +msgid "" +"Software displays an age rating tile on the details page for an " +"application. This shows what age range the application should be suitable " +"for, based on different kinds of content which the application has declared " +"it contains. This information is summarized in a format similar to the game " +"or film rating certificates for your country." +msgstr "" +"Програми показують плитку вікових обмежень на сторінці подробиць" +" щодо програми. Тут буде показано віковий діапазон користувачів, для яких" +" призначено програму, на основі даних щодо вмісту програми, які надаються" +" самою програмою. Резюме цих даних буде наведено у форматі, подібному до" +" вікових обмежень ігор або фільмів у вашій країні." + +#. (itstool) path: section/p +#: C/software-metadata.page:132 +msgid "" +"For example, this will highlight whether a game contains violence, or " +"whether an application contains in-app advertising." +msgstr "" +"Наприклад, буде акцентовано, містить гра насильство або чи показує програма" +" рекламу у своєму вікні." + +#. (itstool) path: section/p +#: C/software-metadata.page:133 +msgid "" +"The dialog which appears when the tile is clicked lists the different types " +"of content in the application and how severe that content is." +msgstr "" +"У вікні, яке буде показано у відповідь на натискання плитки, буде показано" +" списки різних типів вмісту програми та дані щодо того, наскільки критичним" +" є вплив вмісту на користувача." + +#. (itstool) path: section/p +#: C/software-metadata.page:134 +msgid "You can improve the age rating information:" +msgstr "Ви можете удосконалити дані щодо вікових обмежень:" + +#. (itstool) path: item/p +#: C/software-metadata.page:137 +msgid "" +"How to add " +"missing content rating information" +msgstr "" +"Як додати" +" пропущені дані щодо вікових обмежень" + +#. (itstool) path: section/title +#: C/software-metadata.page:143 +msgid "License" +msgstr "Ліцензування" + +#. (itstool) path: section/p +#: C/software-metadata.page:146 +msgid "" +"Software displays a tile indicating whether an application is " +"free software or whether its license is " +"proprietary, special or unknown. This tile includes more detailed " +"information about the project’s license. This tile also lists some of the " +"benefits of free software. Learn more" +msgstr "" +"Програми показують плитку, що вказує на те, чи є програма вільним програмним забезпеченням, чи її ліцензування є" +" пропрієтарним, особливим або невідомим. На цій плитці буде показано" +" докладніші відомості щодо ліцензування проєкту. Також на цій плитці буде" +" показано список певних переваг вільного програмного забезпечення. Дізнатися більше" + +#. (itstool) path: section/p +#: C/software-metadata.page:147 +msgid "" +"Sometimes the license information isn’t correct for an application, and " +"hence an application which is actually free software will be shown as " +"‘proprietary’. Similarly, sometimes the license information is unknown." +msgstr "" +"Іноді дані щодо ліцензування програми є неправильними, і програми, які" +" насправді є вільним програмним забезпеченням, буде показано як" +" «пропрієтарні». Так само, іноді дані щодо ліцензування є невідомими." + +#. (itstool) path: section/p +#: C/software-metadata.page:148 +msgid "" +"Software highlights free and open-source licenses in green, " +"proprietary and special licenses in yellow as shown here. Unknown licenses " +"are highlighted in grey." +msgstr "" +"Програми підсвічують програми із вільним ліцензуванням і з" +" відкритим кодом зеленим кольором, програми із пропрієтарним та особливим" +" ліцензуванням — жовтим кольором, як це показано тут, Програми із невідомим" +" ліцензуванням буде позначено сірим кольором." + +#. (itstool) path: section/p +#: C/software-metadata.page:149 +msgid "You can add or improve the license information:" +msgstr "Ви можете додати або удосконалити дані щодо ліцензування:" + +#. (itstool) path: item/p +#: C/software-metadata.page:152 +msgid "" +"How to fix " +"incorrect licensing information" +msgstr "" +"Як виправити" +" неправильні відомості щодо ліцензування" + +#. (itstool) path: section/title +#: C/software-metadata.page:158 +msgid "Links" +msgstr "Посилання" + +#. (itstool) path: section/p +#: C/software-metadata.page:160 +msgid "" +"Software displays a list of application resource links in the " +"link tile. They are as follows:" +msgstr "" +"Програми показують список посилань на ресурси програми на плитці" +" посилань. Буде показано такі посилання:" + +#. (itstool) path: td/p +#: C/software-metadata.page:164 +msgid "Website link" +msgstr "Посилання на сайт" + +#. (itstool) path: td/p +#: C/software-metadata.page:168 +msgid "Donation link" +msgstr "Посилання на сторінку пожертв" + +#. (itstool) path: td/p +#: C/software-metadata.page:172 +msgid "Translation contribution link" +msgstr "Посилання на сторінку надсилання перекладів" + +#. (itstool) path: td/p +#: C/software-metadata.page:176 +msgid "Bug reporting link" +msgstr "Посилання на сторінку звітування про вади" + +#. (itstool) path: td/p +#: C/software-metadata.page:180 +msgid "Help link" +msgstr "Посилання на довідку" + +#. (itstool) path: td/p +#: C/software-metadata.page:184 +msgid "Contact link" +msgstr "Посилання на контактні дані" + +#. (itstool) path: section/p +#: C/software-metadata.page:187 +msgid "" +"Some or all of these links may be present depending on whether they are " +"listed in the application’s metainfo file." +msgstr "" +"Буде показано деякі або усі ці посилання, залежно від того, чи вказано їх у" +" файлі metainfo програми." + +#. (itstool) path: section/p +#: C/software-metadata.page:188 +msgid "" +"In cases when the application’s metainfo file doesn’t contain any link, the " +"following tile with a question mark will be displayed." +msgstr "" +"У випадку, якщо файл метаданих не містить жодного посилання, буде показано " +"показану нижче плитку зі знаком питання." + +#. (itstool) path: section/p +#: C/software-metadata.page:190 +msgid "You can improve the links:" +msgstr "Ви можете удосконалити посилання:" + +#. (itstool) path: item/p +#: C/software-metadata.page:193 +msgid "" +"How to add missing links" +msgstr "" +"Як додати пропущені посилання" + +#. (itstool) path: section/title +#: C/software-metadata.page:199 +msgid "Carousel tile" +msgstr "Плитка-карусель" + +#. (itstool) path: section/p +#: C/software-metadata.page:201 +msgid "" +"Applications which are featured by Software are displayed in a " +"carousel at the top of the main window as shown here. Each carousel tile has " +"a background color which is automatically extracted from the application’s " +"icon. Sometimes this background color is not quite right for the application " +"and needs to be specified explicitly by the application developer." +msgstr "" +"Програми, які рекомендують автори Програм буде показано у форматі" +" каруселі у верхній частині головного вікна, як це показано тут. У кожної" +" плитки каруселі колір тла визначається автоматично на основі видобутих з" +" піктограми програми кольорів. Іноді цей колір тла є не зовсім правильним" +" для програми, і його має бути явним чином розробником програми." + +#. (itstool) path: section/p +#: C/software-metadata.page:202 +msgid "" +"The set of applications which are featured is decided by the Linux " +"distribution maintainers." +msgstr "" +"Набір рекомендованих програм визначається супровідниками дистрибутива Linux." + +#. (itstool) path: section/p +#: C/software-metadata.page:203 +msgid "You can improve the carousel tile:" +msgstr "Ви можете удосконалити плитку-карусель:" + +#. (itstool) path: item/p +#: C/software-metadata.page:206 +msgid "" +"How to set " +"the carousel tile background color" +msgstr "" +"Як встановити" +" колір тла плитки каруселі" + +#. (itstool) path: section/title +#: C/software-metadata.page:212 +msgid "Where metadata comes from" +msgstr "Джерела метаданих" + +#. (itstool) path: section/p +#: C/software-metadata.page:213 +msgid "" +"The metadata used to specify what hardware a piece of software requires, " +"what ages of user it is suitable for, and factors which contribute to how " +"safe it might be to install, all come from the metainfo file for that " +"software." +msgstr "" +"Метадані, що використовуються для визначення, яке обладнання потрібне для" +" роботи програмного забезпечення, для якої вікової групи користувачів" +" призначено програмне забезпечення, і які фактори впливають на безпеку" +" встановлення програми, усі походять з файла metainfo програмного" +" забезпечення." + +#. (itstool) path: section/p +#: C/software-metadata.page:214 +msgid "" +"The metainfo file is an XML file. Its file format is specified in the AppStream " +"specification." +msgstr "" +"Файл metainfo є файлом XML. Формат файла визначається специфікацією" +" AppStream." + +#. (itstool) path: section/p +#: C/software-metadata.page:215 +msgid "" +"See the metainfo file for GNOME Files " +"app." +msgstr "" +"Див. файл metainfo для програми «Файли" +" GNOME»." + +#. (itstool) path: note/p +#: C/software-metadata.page:217 +msgid "appdata is the older term for metainfo." +msgstr "appdata застаріле позначення metainfo." + +#. (itstool) path: section/title +#: C/software-metadata.page:222 +msgid "What happens if metadata is missing" +msgstr "Що трапляється, якщо метаданих не вистачає" + +#. (itstool) path: section/p +#: C/software-metadata.page:223 +msgid "" +"If some metadata is missing for an application, Software can only " +"guess what it might be, and hence can’t present much information in its " +"interfaces. The guesses Software makes are based on the fact that " +"most software is designed for desktop computers." +msgstr "" +"Якщо для програми не вказано якихось метаданих, Програми можуть" +" лише вгадувати, якими вони можуть бути, а отже не зможуть показати" +" достатньо інформації у своєму інтерфейсі. Здогадки, які використано у Програмах, засновано на факті, що більшу частину програмного" +" забезпечення створено для робочих станцій." + +#. (itstool) path: section/p +#: C/software-metadata.page:224 +msgid "" +"You can help improve the metadata for an application!" +msgstr "Ви можете удосконалити метадані програми!" + +#. (itstool) path: section/title +#: C/software-metadata.page:228 +msgid "How to contribute missing information" +msgstr "Як надати відомості, яких не вистачає" + +#. (itstool) path: section/p +#: C/software-metadata.page:229 +msgid "" +"If you find that an app’s page is missing information or has incorrect " +"information, you can contribute in one of the two ways:" +msgstr "" +"Якщо ви виявите, що на сторінці програми немає певних відомостей або якісь" +" відомості є неправильними, ви можете допомогти в один з двох способів:" + +#. (itstool) path: item/p +#: C/software-metadata.page:232 +msgid "" +"You can report the missing / incorrect metadata to the respective app’s bug " +"tracker, so the app developer can fix it." +msgstr "" +"Ви можете повідомити про пропущені або неправильні дані у системі стеження" +" за вадами відповідної програми, щоб їх міг виправити розробник." + +#. (itstool) path: item/p +#: C/software-metadata.page:235 +msgid "" +"You can fix the missing / incorrect metadata yourself. See the How to guide below on how to do that." +msgstr "" +"Ви можете додати пропущені або виправити неправильні дані власноруч. Див. <" +"em style=\"strong\">настанови нижче, щоб дізнатися, як це зробити." + +#. (itstool) path: section/p +#: C/software-metadata.page:239 +msgid "" +"For both, you first need to find the app’s project page. The link to the " +"project page should typically be available in the app’s page as shown here. If not, you will need to find it with " +"a simple search on Google." +msgstr "" +"Для обох способів вам спочатку слід знайти сторінку проєкту програми." +" Посилання на сторінку проєкту типово можна знайти на сторінці програми, <" +"link xref=\"#links\">як це показано тут. Якщо це не так, вам" +" доведеться знайти її за допомогою простого пошуку у Google." + +#. (itstool) path: section/p +#: C/software-metadata.page:241 +msgid "" +"Apps are typically hosted in GitLab or GitHub. For example, GNOME apps are hosted in gitlab.gnome.org." +msgstr "" +"Код програм типово розміщується на GitLab або GitHub. Наприклад, код програм" +" GNOME зберігається на gitlab.gnome.org." + +#. (itstool) path: section/title +#: C/software-metadata.page:245 +msgid "How to add missing app screenshots" +msgstr "Як додати пропущені знімки вікон програми" + +#. (itstool) path: section/p +#: C/software-metadata.page:246 +msgid "" +"The screenshot information for an application is stored in the <screenshots> element within the application’s <component> in its " +"metainfo file." +msgstr "" +"Дані щодо знімків вікон програми зберігаються в елементі <screenshots>" +" у тезі <component> програми у її файлі metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:247 +msgid "" +"Recommended number of screenshots for an app is between 5 to 10. Screenshots " +"should ideally be in the PNG format with 16:9 aspect ratio and minimum width " +"of 620 pixels." +msgstr "" +"Рекомендуємо використовувати для програми від 5 до 10 знімків вікон." +" Ідеальні знімки вікон мають формат PNG зі співвідношенням сторін і" +" мінімальною шириною у 620 пікселів." + +#. (itstool) path: section/p +#: C/software-metadata.page:248 +msgid "" +"For example, here are the screenshot entries for the Software app:" +msgstr "Наприклад, ось записи знімків вікон для програми Програми:" + +#. (itstool) path: section/code +#: C/software-metadata.page:249 +#, no-wrap +msgid "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/" +"metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/" +"metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" +msgstr "" +"\n" +"<screenshots>\n" +" <screenshot type=\"default\">\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/" +"metainfo/ss-overview.png</image>\n" +" <caption>Overview panel</caption>\n" +" </screenshot>\n" +" <screenshot>\n" +" <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/" +"metainfo/ss-details.png</image>\n" +" <caption>Details panel</caption>\n" +" </screenshot>\n" +"</screenshots>" + +#. (itstool) path: section/title +#: C/software-metadata.page:263 +msgid "How to fix incorrect safety and permissions information" +msgstr "Як виправити неправильні відомості щодо захисту та прав доступу" + +#. (itstool) path: section/p +#: C/software-metadata.page:264 +msgid "" +"The safety and permissions information for an application comes from " +"different sources depending on how the application is packaged. For " +"traditionally packaged applications, for example in RPM or DEB format, there " +"is no safety or permissions information available and nothing can be done to " +"add it to an application." +msgstr "" +"Відомості щодо безпеки і прав доступу для програми походять із різних" +" джерел, залежно від того, як запаковано програму. Для традиційно" +" запакованих програм, наприклад у форматі RPM або DEB, немає доступної" +" інформації про безпеку чи права доступу, і ви нічого не зможете зробити," +" щоб додати її до програми." + +#. (itstool) path: section/p +#: C/software-metadata.page:265 +msgid "" +"For flatpak applications, the information comes from the application’s flatpak manifest, specifying what holes in the sandbox the application requires. Each " +"of these holes typically contributes to lowering the displayed safety level " +"of the application in Software — moving it from ‘safe’ to " +"‘potentially unsafe’ to ‘unsafe’." +msgstr "" +"Для пакунків flatpak дані беруть з маніфеста" +" flatpak програми. Ці дані вказують на «дірки» у пісочниці, які" +" потрібні для роботи програми. Кожна з цих «дірок» типово знижує показаний" +" рівень захисту програми у Програмах — пересуваючи її рейтингом" +" від «безпечної» до «потенційно небезпечної» чи «небезпечної»." + +#. (itstool) path: section/p +#: C/software-metadata.page:266 +msgid "" +"In order to improve the safety level of an application, its sandboxing must " +"be made as tight as possible, by removing sandbox permissions where " +"they’re not needed, and using portals instead of sandbox " +"permissions where possible. Use of portals does not lower the displayed " +"safety level of an application in Software." +msgstr "" +"Щоб удосконалити рівень захисту програми, пісочниця для неї має бути якомога" +" щільнішою. Слід вилучити зайві права доступу у пісочниці і використати" +" портали замість прав доступу пісочниці там, де це можливо." +" Використання порталів не знижує показаний рівень безпеки програми у Програмах." + +#. (itstool) path: section/p +#: C/software-metadata.page:267 +msgid "" +"For example, if the application requests read/write access to the full file " +"system (--filesystem=host), does it actually need that, or does " +"it only need to access files in a few specific locations? If so, the file portal could be used, or more specific file system permissions could be specified." +msgstr "" +"Наприклад, якщо програма вимагає доступу до читання і запису в усій файловій" +" системі (--filesystem=host), чи справді він їй потрібен —" +" можливо, їй потрібен доступ до файлів у декількох певних місцях? Якщо це" +" так, можна скористатися файловим порталом або можна визначити" +" точніше права доступу до файлової системи." + +#. (itstool) path: section/p +#: C/software-metadata.page:268 +msgid "" +"If the application works on Wayland, and only needs to work on X11 as a " +"fallback, without using special X11 features, could it use --" +"socket=fallback-x11 rather than --socket=x11?" +msgstr "" +"Якщо програма працює у Wayland, а можливість роботи у X11 є лише резервною," +" без використання особливих можливостей X11, можливо, вона використовуватиме" +" --" +"socket=fallback-x11, а не --socket=x11?" + +#. (itstool) path: section/p +#: C/software-metadata.page:269 +msgid "" +"Guidance about specific permissions, or other packaging formats, may be " +"added here in future." +msgstr "" +"Настанови щодо специфічних прав доступу або інших форматів пакування може" +" бути додано тут пізніше." + +#. (itstool) path: section/p +#: C/software-metadata.page:270 C/software-metadata.page:308 +msgid "Further reading:" +msgstr "Інформація для подальшого ознайомлення:" + +#. (itstool) path: section/title +#: C/software-metadata.page:285 +msgid "How to add missing hardware information" +msgstr "Як додати пропущені відомості щодо обладнання" + +#. (itstool) path: section/p +#: C/software-metadata.page:286 +msgid "" +"The hardware information for an application is stored in the <requires>, <recommends>" +" and <supports> elements within the " +"application’s <component> in its metainfo file." +msgstr "" +"Дані щодо обладнання для програми зберігаються в елементах <requires>, <recommends> і <supports> у тезі <" +"code><component> програми файла metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:287 +msgid "" +"Software understands the <" +"control> and <display_length> elements." +msgstr "" +"Програми обробляють елементи <control> і <display_length>." + +#. (itstool) path: section/p +#: C/software-metadata.page:288 +msgid "" +"See this blog post or " +"this blog post for examples of metadata." +msgstr "" +"Див. приклади метаданих у цьому або цьому дописі у блозі." + +#. (itstool) path: section/title +#: C/software-metadata.page:292 +msgid "How to add missing content rating information" +msgstr "Як додати пропущені дані щодо вікових обмежень" + +#. (itstool) path: section/p +#: C/software-metadata.page:293 +msgid "" +"The content rating information for an application is stored in the <content_rating> element " +"within the application’s <component> in its metainfo file." +msgstr "" +"Дані щодо вікових обмежень програми зберігаються в елементі <content_rating> у тезі <" +"code><component> програми у її файлі metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:294 +msgid "" +"Applications should use the OARS 1.1 standard to fill in this element. If " +"the <content_rating> element is not specified, the " +"application’s content rating is unknown. If it’s specified but empty, the " +"application has no content which might be unsuitable for any audience." +msgstr "" +"Для заповнення цього елемента слід використовувати стандарт OARS 1.1. Якщо" +" елемент <content_rating> не вказано, вікові обмеження" +" програми лишаться невідомими. Якщо елемент вказано, але він є порожнім," +" програма не містить нічого, що є неприпустимим для будь-якого кола" +" користувачів." + +#. (itstool) path: section/p +#: C/software-metadata.page:295 +msgid "" +"Use the OARS generator " +"to produce suitable content rating information for an application." +msgstr "" +"Скористайтеся генератором" +" OARS для створення відповідних відомостей щодо вікових обмежень для" +" програми." + +#. (itstool) path: section/title +#: C/software-metadata.page:299 +msgid "How to fix incorrect licensing information" +msgstr "Як виправити неправильні відомості щодо ліцензування" + +#. (itstool) path: section/p +#: C/software-metadata.page:300 +msgid "" +"The licensing information for an application is stored in the <project_license> " +"element within the application’s <component> in its " +"metainfo file." +msgstr "" +"Дані щодо ліцензування програми зберігаються в елементі <project_license> у тезі <" +"code><component> програми у її файлі metainfo." + +#. (itstool) path: section/p +#: C/software-metadata.page:301 +msgid "" +"The content in this element should be an SPDX expression which describes the ‘main’ license " +"for the project. This should typically be the license of the code, and not " +"include the license of the documentation or ancillary content." +msgstr "" +"Вмістом цього елемента має бути виразом SPDX, який описує «основну» ліцензію проєкту. Типово, це" +" мають бути умови ліцензування коду без умов ліцензування документації або" +" допоміжних даних." + +#. (itstool) path: section/p +#: C/software-metadata.page:302 +msgid "" +"If the SPDX expression is a single license, or an ‘or’ combination of " +"multiple licenses, which are all FSF or OSI approved, the application is considered ‘free software’ " +"and the license tile says so. Otherwise, it’s considered ‘proprietary’." +msgstr "" +"Якщо вираз SPDX є єдиною ліцензією або об'єднанням за допомогою «or»" +" декількох ліцензій, які усі є схваленими FSF або OSI, програма вважається «вільним програмним" +" забезпеченням» і на плитці ліцензування буде зазначено саме це. Якщо ж це" +" не так, програма вважатиметься «пропрієтарною»." + +#. (itstool) path: section/p +#: C/software-metadata.page:303 +msgid "" +"If an application is being displayed as ‘proprietary’ when you think it " +"shouldn’t be, it’s likely that the <project_license> " +"element includes the documentation license for the project. Remove it." +msgstr "" +"Якщо програму показано як «пропрієтарну», а ви вважаєте, що це не так," +" ймовірно, до елемента <project_license> включено умови" +" ліцензування документації до проєкту. Вилучіть ці умови." + +#. (itstool) path: section/p +#: C/software-metadata.page:304 +msgid "" +"For example, change the license metadata from:" +msgstr "" +"Наприклад, змініть ліцензування метаданих з:" + +#. (itstool) path: section/code +#: C/software-metadata.page:305 +#, no-wrap +msgid "" +"<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" +msgstr "" +"<project_license>GPL-2.0+ and CC-BY-SA-3.0</project_license>" + +#. (itstool) path: section/p +#: C/software-metadata.page:306 +msgid "to" +msgstr "на" + +#. (itstool) path: section/code +#: C/software-metadata.page:307 +#, no-wrap +msgid "<project_license>GPL-2.0+</project_license>" +msgstr "<project_license>GPL-2.0+</project_license>" + +#. (itstool) path: item/p +#: C/software-metadata.page:311 +msgid "" +"Don’t (generally) put documentation license in appdata" +msgstr "" +"Не вписуйте (загалом) ліцензування документації до appdata<" +"/link>" + +#. (itstool) path: section/title +#: C/software-metadata.page:320 +msgid "How to add missing links" +msgstr "Як додати пропущені посилання" + +#. (itstool) path: section/p +#: C/software-metadata.page:321 +msgid "" +"The links for an application are stored as <url> elements within the application’s " +"<component> in its metainfo file." +msgstr "" +"Посилання для програми зберігають як елементи <url> у тезі <component>" +" файла metainfo програми." + +#. (itstool) path: section/p +#: C/software-metadata.page:322 +msgid "" +"Add as many of the link types documented in the appstream specification as are available for the application. " +"If no suitable page exists for a given link type, it doesn’t have to be " +"included." +msgstr "" +"Додайте якомога більше типів посилань, які документовано у специфікації appstream. Якщо відповідної сторінки для" +" певного типу посилань немає, не слід його включати." + +#. (itstool) path: section/p +#: C/software-metadata.page:323 +msgid "" +"For example, here are the resource links for the Software app:" +msgstr "Наприклад, ось посилання на ресурси для програми Програми:" + +#. (itstool) path: section/code +#: C/software-metadata.page:324 +#, no-wrap +msgid "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/" +"-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software<" +";/url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</ur" +"l>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/&l" +"t;/url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software" +"/</url>" +msgstr "" +"\n" +"<url type=\"bugtracker\">https://gitlab.gnome.org/GNOME/gnome-software/" +"-/issues</url>\n" +"<url type=\"contact\">https://discourse.gnome.org/tag/gnome-software<" +";/url>\n" +"<url type=\"contribute\">https://welcome.gnome.org/app/Software/</ur" +"l>\n" +"<url type=\"donation\">https://www.gnome.org/donate/</url>\n" +"<url type=\"homepage\">https://apps.gnome.org/Software</url>\n" +"<url type=\"translate\">https://l10n.gnome.org/module/gnome-software/&l" +"t;/url>\n" +"<url type=\"vcs-browser\">https://gitlab.gnome.org/GNOME/gnome-software" +"/</url>" + +#. (itstool) path: section/title +#: C/software-metadata.page:335 +msgid "How to set the carousel tile background color" +msgstr "Як встановити колір тла плитки каруселі" + +#. (itstool) path: section/p +#: C/software-metadata.page:336 +msgid "" +"The carousel tile background color is normally extracted automatically from " +"the application’s icon. If that color is unsatisfactory, however, it can be " +"overridden by using the appstream’s <" +"branding/> element with declared colors (since 47.x " +"series). The advantage is that more clients can use the colors." +msgstr "" +"Колір тла плитки для каруселі зазвичай видобувається автоматично з" +" піктограми програми. Якщо цей колір є незадовільним, його можна" +" перевизначити за допомогою елемента <branding/> appstream із оголошеними кольорами" +" (починаючи з випусків 47.x). Перевагою є те, що кольори можна буде" +" використовувати у ширшому діапазоні клієнтів." + +#. (itstool) path: section/p +#: C/software-metadata.page:337 +msgid "For example, here are some branding entries:" +msgstr "Наприклад, ось деякі записи щодо бренду:" + +#. (itstool) path: section/code +#: C/software-metadata.page:338 +#, no-wrap +msgid "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color" +">\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color&" +"gt;\n" +"</branding>" +msgstr "" +"\n" +"<branding>\n" +" <color type=\"primary\" scheme_preference=\"light\">#ff00ff</color" +">\n" +" <color type=\"primary\" scheme_preference=\"dark\">#993d3d</color&" +"gt;\n" +"</branding>" + +#. (itstool) path: note/p +#: C/software-metadata.page:344 +msgid "" +"Note the scheme_preference attribute is ignored, Software chooses the better color for the theme on its own." +msgstr "" +"Зауважте, що атрибут scheme_preference проігноровано, Програми виберуть кращий колір для теми автономно." + +#. (itstool) path: section/p +#: C/software-metadata.page:346 +msgid "" +"There is left, for backward compatibility, the possibility to add the " +"following XML to the application’s metainfo <component> " +"element:" +msgstr "" +"Для зворотної сумісності залишено можливість додавати такі XML для елемента" +" <component> metainfo програми:" + +#. (itstool) path: section/code +#: C/software-metadata.page:347 +#, no-wrap +msgid "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16," +" 0)]</value>\n" +"</custom>" +msgstr "" +"\n" +"<custom>\n" +" <value key=\"GnomeSoftware::key-colors\">[(124, 53, 77), (99, 16," +" 0)]</value>\n" +"</custom>" + +#. (itstool) path: section/p +#: C/software-metadata.page:351 +msgid "but the <branding/> element has a precedence." +msgstr "але елемент <branding/> має вищий пріоритет." + +#. (itstool) path: section/p +#: C/software-metadata.page:352 +msgid "" +"The value of GnomeSoftware::key-colors is a text-format " +"GVariant with type a(yyy), and represents an unordered set of " +"key colors for the application. Each element of the set is a color in RGB " +"form ranging from (0, 0, 0) to (255, 255, 255)." +msgstr "" +"Значення GnomeSoftware::key-colors є GVariant у форматі тексту" +" з типом a(yyy). Воно відповідає невпорядкованому набору" +" ключових кольорів програми. Кожен елемент набору є кольором у формі RGB у" +" діапазоні від (0, 0, 0) до (255, 255, 255)." + +#. (itstool) path: section/p +#: C/software-metadata.page:353 +msgid "Colors should be chosen so that they:" +msgstr "Кольори слід вибирати так, щоб вони:" + +#. (itstool) path: item/p +#: C/software-metadata.page:356 +msgid "" +"Are identifiable to the application, matching the application’s branding in " +"some way, if possible." +msgstr "" +"Були характерними для програми, певним чином відповідали бренду програми," +" якщо це можливо." + +#. (itstool) path: item/p +#: C/software-metadata.page:359 +msgid "" +"Contrast with the edge of the application’s icon, so that when they are used " +"as a background behind it, the icon can be distinguished." +msgstr "" +"Були контрастними із краєм піктограми програми, щоб коли його використано як" +" колір тло за нею, піктограму можна було розрізнити." + +#. (itstool) path: item/p +#: C/software-metadata.page:362 +msgid "" +"Contrast with the foreground text color in the Adwaita theme (#2e3436) and in its dark variant (#eeeeec). This generally means " +"choosing a color with a medium level of brightness." +msgstr "" +"Були контрастними з кольором тексту у темі Adwaita (#2e3436) і" +" її темним варіантом (#eeeeec). В основному, це означає, що" +" слід вибрати колір із середнім рівнем яскравості." + +#. (itstool) path: item/p +#: C/software-metadata.page:365 +msgid "" +"Contrast can be checked using the Contrast app." +msgstr "" +"Контрастність можна перевірити за допомогою програми" +" «Контраст»." + +#. (itstool) path: section/p +#: C/software-metadata.page:368 +msgid "" +"At least one color should be specified. More can be specified if one color " +"can’t satisfy all the requirements above, and Software will " +"choose the most appropriate to use in the carousel tile. If exactly one " +"color is specified, its brightness and saturation may be modified to improve " +"contrast with the foreground color. If more than one color is specified, the " +"one with the best contrast with the foreground color will be chosen, and its " +"brightness and saturation will not be modified." +msgstr "" +"Слід вказати принаймні один колір. Можна вказати більше, якщо один колір не" +" може задовольнити всім наведеним вище вимогам, і Програми" +" виберуть найпридатніший для використання у плитці каруселі. Якщо вказано" +" точно один колір, його яскравість і насиченість можна змінити для" +" покращення контрастності з кольором переднього плану. Якщо вказано декілька" +" кольорів, буде вибрано той, який найкраще контрастує з кольором переднього" +" плану, а його яскравість і насиченість не буде змінено." + +#. (itstool) path: section/title +#: C/software-metadata.page:372 +msgid "How to test carousel tile background color changes" +msgstr "Як виконати тестування кольору тла плитки каруселі" + +#. (itstool) path: section/p +#: C/software-metadata.page:373 +msgid "" +"Modify the metainfo file for your application, and then run Software with:" +msgstr "" +"Внесіть зміни до файла metainfo вашої програми, а потім запустіть Програми так:" + +#. (itstool) path: section/p +#: C/software-metadata.page:374 +#| msgid "" +#| "gnome-software --show-metainfo=/path/to/app.metainfo.xml,icon=/path/to/" +#| "app/icon.png" +msgid "" +"gnome-software --show-metainfo=/path/to/app.metainfo.xml," +"icon=/path/to/app/icon.png" +msgstr "" +"gnome-software --show-metainfo=/шлях/до/програми.metainfo.xml,icon=/шлях/до/піктограми.png" + +#. (itstool) path: section/p +#: C/software-metadata.page:375 +msgid "" +"The details page for your application will be shown. If you navigate back to " +"the overview page of Software, your application will be the only " +"one in the ‘featured’ carousel." +msgstr "" +"Буде показано сторінку подробиць щодо вашої програми. Якщо ви повернетеся до" +" сторінки огляду Програм, ваша програма буде єдиною у каруселі" +" рекомендованих." + +#~ msgid "GNOME Software" +#~ msgstr "GNOME Програми" diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..628c58e --- /dev/null +++ b/lib/README.md @@ -0,0 +1,7 @@ +libgnomesoftware +================ + +This is a static library, and is not all API stable. + +Only the plugin headers installed into /usr/include/gnome-software should be +considered API. diff --git a/lib/gnome-software-private.h b/lib/gnome-software-private.h new file mode 100644 index 0000000..ad64b9c --- /dev/null +++ b/lib/gnome-software-private.h @@ -0,0 +1,24 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#ifndef I_KNOW_THE_GNOME_SOFTWARE_API_IS_SUBJECT_TO_CHANGE +#define I_KNOW_THE_GNOME_SOFTWARE_API_IS_SUBJECT_TO_CHANGE +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/lib/gnome-software.h b/lib/gnome-software.h new file mode 100644 index 0000000..6165fd0 --- /dev/null +++ b/lib/gnome-software.h @@ -0,0 +1,52 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#ifndef I_KNOW_THE_GNOME_SOFTWARE_API_IS_SUBJECT_TO_CHANGE +#error You have to define I_KNOW_THE_GNOME_SOFTWARE_API_IS_SUBJECT_TO_CHANGE +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/lib/gs-app-collation.h b/lib/gs-app-collation.h new file mode 100644 index 0000000..3503faa --- /dev/null +++ b/lib/gs-app-collation.h @@ -0,0 +1,21 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017-2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-app-list.h" + +G_BEGIN_DECLS + +GsAppList *gs_app_get_related (GsApp *app); +GsAppList *gs_app_dup_addons (GsApp *app); +GsAppList *gs_app_get_history (GsApp *app); + +G_END_DECLS diff --git a/lib/gs-app-list-private.h b/lib/gs-app-list-private.h new file mode 100644 index 0000000..a8eb6e6 --- /dev/null +++ b/lib/gs-app-list-private.h @@ -0,0 +1,50 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-app-list.h" + +G_BEGIN_DECLS + +/** + * GsAppListFlags: + * @GS_APP_LIST_FLAG_NONE: No flags set + * @GS_APP_LIST_FLAG_IS_TRUNCATED: List has been truncated + * @GS_APP_LIST_FLAG_WATCH_APPS: Applications will be monitored + * @GS_APP_LIST_FLAG_WATCH_APPS_RELATED: Applications related apps will be monitored + * @GS_APP_LIST_FLAG_WATCH_APPS_ADDONS: Applications addon apps will be monitored + * + * Flags used to describe the list. + **/ +typedef enum { + GS_APP_LIST_FLAG_NONE = 0, + /* empty slot */ + GS_APP_LIST_FLAG_IS_TRUNCATED = 1 << 1, + GS_APP_LIST_FLAG_WATCH_APPS = 1 << 2, + GS_APP_LIST_FLAG_WATCH_APPS_RELATED = 1 << 3, + GS_APP_LIST_FLAG_WATCH_APPS_ADDONS = 1 << 4, + GS_APP_LIST_FLAG_LAST /*< skip >*/ +} GsAppListFlags; + +guint gs_app_list_get_size_peak (GsAppList *list); +void gs_app_list_set_size_peak (GsAppList *list, + guint size_peak); +void gs_app_list_filter_duplicates (GsAppList *list, + GsAppListFilterFlags flags); +void gs_app_list_randomize (GsAppList *list); +void gs_app_list_truncate (GsAppList *list, + guint length); +gboolean gs_app_list_has_flag (GsAppList *list, + GsAppListFlags flag); +void gs_app_list_add_flag (GsAppList *list, + GsAppListFlags flag); +GsAppState gs_app_list_get_state (GsAppList *list); +guint gs_app_list_get_progress (GsAppList *list); + +G_END_DECLS diff --git a/lib/gs-app-list.c b/lib/gs-app-list.c new file mode 100644 index 0000000..6a5c64a --- /dev/null +++ b/lib/gs-app-list.c @@ -0,0 +1,1022 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2017-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-app-list + * @title: GsAppList + * @include: gnome-software.h + * @stability: Unstable + * @short_description: An application list + * + * These functions provide a refcounted list of #GsApp objects. + */ + +#include "config.h" + +#include + +#include "gs-app-private.h" +#include "gs-app-list-private.h" +#include "gs-app-collation.h" +#include "gs-enums.h" + +struct _GsAppList +{ + GObject parent_instance; + GPtrArray *array; + GMutex mutex; + guint size_peak; + GsAppListFlags flags; + GsAppState state; + guint progress; /* 0–100 inclusive, or %GS_APP_PROGRESS_UNKNOWN */ + guint custom_progress; /* overrides the 'progress', if not %GS_APP_PROGRESS_UNKNOWN */ +}; + +G_DEFINE_TYPE (GsAppList, gs_app_list, G_TYPE_OBJECT) + +enum { + PROP_STATE = 1, + PROP_PROGRESS, + PROP_LAST +}; + +enum { + SIGNAL_APP_STATE_CHANGED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +/** + * gs_app_list_get_state: + * @list: A #GsAppList + * + * Gets the state of the list. + * + * This method will only return a valid result if gs_app_list_add_flag() has + * been called with %GS_APP_LIST_FLAG_WATCH_APPS. + * + * Returns: the #GsAppState, e.g. %GS_APP_STATE_INSTALLED + * + * Since: 3.30 + **/ +GsAppState +gs_app_list_get_state (GsAppList *list) +{ + g_return_val_if_fail (GS_IS_APP_LIST (list), GS_APP_STATE_UNKNOWN); + return list->state; +} + +/** + * gs_app_list_get_progress: + * @list: A #GsAppList + * + * Gets the average percentage completion of all apps in the list. If any of the + * apps in the list has progress %GS_APP_PROGRESS_UNKNOWN, or if the app list + * is empty, %GS_APP_PROGRESS_UNKNOWN will be returned. + * + * This method will only return a valid result if gs_app_list_add_flag() has + * been called with %GS_APP_LIST_FLAG_WATCH_APPS. + * + * Returns: the percentage completion (0–100 inclusive), or %GS_APP_PROGRESS_UNKNOWN for unknown + * + * Since: 3.30 + **/ +guint +gs_app_list_get_progress (GsAppList *list) +{ + g_return_val_if_fail (GS_IS_APP_LIST (list), GS_APP_PROGRESS_UNKNOWN); + if (list->custom_progress != GS_APP_PROGRESS_UNKNOWN) + return list->custom_progress; + return list->progress; +} + +static gboolean +app_list_notify_progress_idle_cb (gpointer user_data) +{ + GsAppList *list = user_data; + + g_object_notify (G_OBJECT (list), "progress"); + g_object_unref (list); + + return G_SOURCE_REMOVE; +} + +/** + * gs_app_list_override_progress: + * @list: a #GsAppList + * @progress: a progress to set, between 0 and 100 inclusive, or %GS_APP_PROGRESS_UNKNOWN + * + * Override the progress property to be this value, or use %GS_APP_PROGRESS_UNKNOWN, + * to unset the override. This can be used when only the overall progress is known, + * instead of a per-application progress. + * + * Since: 42 + **/ +void +gs_app_list_override_progress (GsAppList *list, + guint progress) +{ + g_return_if_fail (GS_IS_APP_LIST (list)); + + if (list->custom_progress != progress) { + list->custom_progress = progress; + g_idle_add (app_list_notify_progress_idle_cb, g_object_ref (list)); + } +} + +static void +gs_app_list_add_watched_for_app (GsAppList *list, GPtrArray *apps, GsApp *app) +{ + if (list->flags & GS_APP_LIST_FLAG_WATCH_APPS) + g_ptr_array_add (apps, app); + if (list->flags & GS_APP_LIST_FLAG_WATCH_APPS_ADDONS) { + g_autoptr(GsAppList) list2 = gs_app_dup_addons (app); + + for (guint i = 0; list2 != NULL && i < gs_app_list_length (list2); i++) { + GsApp *app2 = gs_app_list_index (list2, i); + g_ptr_array_add (apps, app2); + } + } + if (list->flags & GS_APP_LIST_FLAG_WATCH_APPS_RELATED) { + GsAppList *list2 = gs_app_get_related (app); + for (guint i = 0; i < gs_app_list_length (list2); i++) { + GsApp *app2 = gs_app_list_index (list2, i); + g_ptr_array_add (apps, app2); + } + } +} + +static GPtrArray * +gs_app_list_get_watched_for_app (GsAppList *list, GsApp *app) +{ + GPtrArray *apps = g_ptr_array_new (); + gs_app_list_add_watched_for_app (list, apps, app); + return apps; +} + +static GPtrArray * +gs_app_list_get_watched (GsAppList *list) +{ + GPtrArray *apps = g_ptr_array_new (); + for (guint i = 0; i < list->array->len; i++) { + GsApp *app_tmp = g_ptr_array_index (list->array, i); + gs_app_list_add_watched_for_app (list, apps, app_tmp); + } + return apps; +} + +static void +gs_app_list_invalidate_progress (GsAppList *self) +{ + guint progress = 0; + g_autoptr(GPtrArray) apps = gs_app_list_get_watched (self); + + /* find the average percentage complete of the list */ + if (apps->len > 0) { + guint64 pc_cnt = 0; + gboolean unknown_seen = FALSE; + + for (guint i = 0; i < apps->len; i++) { + GsApp *app_tmp = g_ptr_array_index (apps, i); + guint app_progress = gs_app_get_progress (app_tmp); + + if (app_progress == GS_APP_PROGRESS_UNKNOWN) { + unknown_seen = TRUE; + break; + } + pc_cnt += gs_app_get_progress (app_tmp); + } + + progress = (!unknown_seen) ? pc_cnt / apps->len : GS_APP_PROGRESS_UNKNOWN; + } else { + progress = GS_APP_PROGRESS_UNKNOWN; + } + + if (self->progress != progress) { + self->progress = progress; + g_object_notify (G_OBJECT (self), "progress"); + } +} + +static void +gs_app_list_invalidate_state (GsAppList *self) +{ + GsAppState state = GS_APP_STATE_UNKNOWN; + g_autoptr(GPtrArray) apps = gs_app_list_get_watched (self); + + /* find any action state of the list */ + for (guint i = 0; i < apps->len; i++) { + GsApp *app_tmp = g_ptr_array_index (apps, i); + GsAppState state_tmp = gs_app_get_state (app_tmp); + if (state_tmp == GS_APP_STATE_DOWNLOADING || + state_tmp == GS_APP_STATE_INSTALLING || + state_tmp == GS_APP_STATE_REMOVING) { + state = state_tmp; + break; + } + } + if (self->state != state) { + self->state = state; + g_object_notify (G_OBJECT (self), "state"); + } +} + +static void +gs_app_list_progress_notify_cb (GsApp *app, GParamSpec *pspec, GsAppList *self) +{ + gs_app_list_invalidate_progress (self); +} + +static void +gs_app_list_state_notify_cb (GsApp *app, GParamSpec *pspec, GsAppList *self) +{ + gs_app_list_invalidate_state (self); + + g_signal_emit (self, signals[SIGNAL_APP_STATE_CHANGED], 0, app); +} + +static void +gs_app_list_maybe_watch_app (GsAppList *list, GsApp *app) +{ + g_autoptr(GPtrArray) apps = gs_app_list_get_watched_for_app (list, app); + for (guint i = 0; i < apps->len; i++) { + GsApp *app_tmp = g_ptr_array_index (apps, i); + g_signal_connect_object (app_tmp, "notify::progress", + G_CALLBACK (gs_app_list_progress_notify_cb), + list, 0); + g_signal_connect_object (app_tmp, "notify::state", + G_CALLBACK (gs_app_list_state_notify_cb), + list, 0); + } +} + +static void +gs_app_list_maybe_unwatch_app (GsAppList *list, GsApp *app) +{ + g_autoptr(GPtrArray) apps = gs_app_list_get_watched_for_app (list, app); + for (guint i = 0; i < apps->len; i++) { + GsApp *app_tmp = g_ptr_array_index (apps, i); + g_signal_handlers_disconnect_by_data (app_tmp, list); + } +} + +/** + * gs_app_list_get_size_peak: + * @list: A #GsAppList + * + * Returns the largest size the list has ever been. + * + * Returns: integer + * + * Since: 3.24 + **/ +guint +gs_app_list_get_size_peak (GsAppList *list) +{ + return list->size_peak; +} + +/** + * gs_app_list_set_size_peak: + * @list: A #GsAppList + * @size_peak: A value to set + * + * Sets the largest size the list has ever been. + * + * Since: 43 + **/ +void +gs_app_list_set_size_peak (GsAppList *list, + guint size_peak) +{ + g_return_if_fail (GS_IS_APP_LIST (list)); + list->size_peak = size_peak; +} + +static GsApp * +gs_app_list_lookup_safe (GsAppList *list, const gchar *unique_id) +{ + for (guint i = 0; i < list->array->len; i++) { + GsApp *app = g_ptr_array_index (list->array, i); + if (as_utils_data_id_equal (gs_app_get_unique_id (app), unique_id)) + return app; + } + return NULL; +} + +/** + * gs_app_list_lookup: + * @list: A #GsAppList + * @unique_id: A unique_id + * + * Finds the first matching application in the list using the usual wildcard + * rules allowed in unique_ids. + * + * Returns: (transfer none): a #GsApp, or %NULL if not found + * + * Since: 3.22 + **/ +GsApp * +gs_app_list_lookup (GsAppList *list, const gchar *unique_id) +{ + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&list->mutex); + return gs_app_list_lookup_safe (list, unique_id); +} + +/** + * gs_app_list_has_flag: + * @list: A #GsAppList + * @flag: A flag to test, e.g. %GS_APP_LIST_FLAG_IS_TRUNCATED + * + * Gets if a specific flag is set. + * + * Returns: %TRUE if the flag is set + * + * Since: 3.24 + **/ +gboolean +gs_app_list_has_flag (GsAppList *list, GsAppListFlags flag) +{ + return (list->flags & flag) > 0; +} + +/** + * gs_app_list_add_flag: + * @list: A #GsAppList + * @flag: A flag to test, e.g. %GS_APP_LIST_FLAG_IS_TRUNCATED + * + * Gets if a specific flag is set. + * + * Returns: %TRUE if the flag is set + * + * Since: 3.30 + **/ +void +gs_app_list_add_flag (GsAppList *list, GsAppListFlags flag) +{ + if (list->flags & flag) + return; + list->flags |= flag; + + /* turn this on for existing apps */ + for (guint i = 0; i < list->array->len; i++) { + GsApp *app = g_ptr_array_index (list->array, i); + gs_app_list_maybe_watch_app (list, app); + } +} + +static gboolean +gs_app_list_check_for_duplicate (GsAppList *list, GsApp *app) +{ + GsApp *app_old; + const gchar *id; + + /* adding a wildcard */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) { + for (guint i = 0; i < list->array->len; i++) { + GsApp *app_tmp = g_ptr_array_index (list->array, i); + if (!gs_app_has_quirk (app_tmp, GS_APP_QUIRK_IS_WILDCARD)) + continue; + /* not adding exactly the same wildcard */ + if (g_strcmp0 (gs_app_get_unique_id (app_tmp), + gs_app_get_unique_id (app)) == 0) + return FALSE; + } + return TRUE; + } + + for (guint i = 0; i < list->array->len; i++) { + GsApp *app_tmp = g_ptr_array_index (list->array, i); + if (app_tmp == app) + return FALSE; + } + + /* does not exist */ + id = gs_app_get_unique_id (app); + if (id == NULL) { + /* not much else we can do... */ + return TRUE; + } + + /* existing app is a wildcard */ + app_old = gs_app_list_lookup_safe (list, id); + if (app_old == NULL) + return TRUE; + if (gs_app_has_quirk (app_old, GS_APP_QUIRK_IS_WILDCARD)) + return TRUE; + + /* already exists */ + return FALSE; +} + +typedef enum { + GS_APP_LIST_ADD_FLAG_NONE = 0, + GS_APP_LIST_ADD_FLAG_CHECK_FOR_DUPE = 1 << 0, + GS_APP_LIST_ADD_FLAG_LAST +} GsAppListAddFlag; + +static void +gs_app_list_add_safe (GsAppList *list, GsApp *app, GsAppListAddFlag flag) +{ + /* check for duplicate */ + if ((flag & GS_APP_LIST_ADD_FLAG_CHECK_FOR_DUPE) > 0 && + !gs_app_list_check_for_duplicate (list, app)) + return; + + /* just use the ref */ + gs_app_list_maybe_watch_app (list, app); + g_ptr_array_add (list->array, g_object_ref (app)); + + /* update the historical max */ + if (list->array->len > list->size_peak) + list->size_peak = list->array->len; +} + +/** + * gs_app_list_add: + * @list: A #GsAppList + * @app: A #GsApp + * + * If the application does not already exist in the list then it is added, + * incrementing the reference count. + * If the application already exists then a warning is printed to the console. + * + * Applications that have the application ID lazy-loaded will always be added + * to the list, and to clean these up the plugin loader will also call the + * gs_app_list_filter_duplicates() method when all plugins have run. + * + * Since: 3.22 + **/ +void +gs_app_list_add (GsAppList *list, GsApp *app) +{ + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP_LIST (list)); + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&list->mutex); + gs_app_list_add_safe (list, app, GS_APP_LIST_ADD_FLAG_CHECK_FOR_DUPE); + + /* recalculate global state */ + gs_app_list_invalidate_state (list); + gs_app_list_invalidate_progress (list); +} + +/** + * gs_app_list_remove: + * @list: A #GsAppList + * @app: A #GsApp + * + * Removes an application from the list. If the application does not exist the + * request is ignored. + * + * Returns: %TRUE if the app was removed, %FALSE if it did not exist in the @list + * Since: 43 + **/ +gboolean +gs_app_list_remove (GsAppList *list, GsApp *app) +{ + g_autoptr(GMutexLocker) locker = NULL; + gboolean removed; + + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + locker = g_mutex_locker_new (&list->mutex); + removed = g_ptr_array_remove (list->array, app); + if (removed) { + gs_app_list_maybe_unwatch_app (list, app); + + /* recalculate global state */ + gs_app_list_invalidate_state (list); + gs_app_list_invalidate_progress (list); + } + + return removed; +} + +/** + * gs_app_list_add_list: + * @list: A #GsAppList + * @donor: Another #GsAppList + * + * Adds all the applications in @donor to @list. + * + * Since: 3.22 + **/ +void +gs_app_list_add_list (GsAppList *list, GsAppList *donor) +{ + guint i; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP_LIST (list)); + g_return_if_fail (GS_IS_APP_LIST (donor)); + g_return_if_fail (list != donor); + + locker = g_mutex_locker_new (&list->mutex); + + /* add each app */ + for (i = 0; i < donor->array->len; i++) { + GsApp *app = gs_app_list_index (donor, i); + gs_app_list_add_safe (list, app, GS_APP_LIST_ADD_FLAG_CHECK_FOR_DUPE); + } + + /* recalculate global state */ + gs_app_list_invalidate_state (list); + gs_app_list_invalidate_progress (list); +} + +/** + * gs_app_list_index: + * @list: A #GsAppList + * @idx: An index into the list + * + * Gets an application at a specific position in the list. + * + * Returns: (transfer none): a #GsApp, or %NULL if invalid + * + * Since: 3.22 + **/ +GsApp * +gs_app_list_index (GsAppList *list, guint idx) +{ + return GS_APP (g_ptr_array_index (list->array, idx)); +} + +/** + * gs_app_list_length: + * @list: A #GsAppList + * + * Gets the length of the application list. + * + * Returns: Integer + * + * Since: 3.22 + **/ +guint +gs_app_list_length (GsAppList *list) +{ + g_return_val_if_fail (GS_IS_APP_LIST (list), 0); + return list->array->len; +} + +static void +gs_app_list_remove_all_safe (GsAppList *list) +{ + for (guint i = 0; i < list->array->len; i++) { + GsApp *app = g_ptr_array_index (list->array, i); + gs_app_list_maybe_unwatch_app (list, app); + } + g_ptr_array_set_size (list->array, 0); + gs_app_list_invalidate_state (list); + gs_app_list_invalidate_progress (list); +} + +/** + * gs_app_list_remove_all: + * @list: A #GsAppList + * + * Removes all applications from the list. + * + * Since: 3.22 + **/ +void +gs_app_list_remove_all (GsAppList *list) +{ + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP_LIST (list)); + locker = g_mutex_locker_new (&list->mutex); + gs_app_list_remove_all_safe (list); +} + +/** + * gs_app_list_filter: + * @list: A #GsAppList + * @func: A #GsAppListFilterFunc + * @user_data: the user pointer to pass to @func + * + * If func() returns TRUE for the GsApp, then the app is kept. + * + * Since: 3.22 + **/ +void +gs_app_list_filter (GsAppList *list, GsAppListFilterFunc func, gpointer user_data) +{ + guint i; + GsApp *app; + g_autoptr(GsAppList) old = NULL; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP_LIST (list)); + g_return_if_fail (func != NULL); + + locker = g_mutex_locker_new (&list->mutex); + + /* deep copy to a temp list and clear the current one */ + old = gs_app_list_copy (list); + gs_app_list_remove_all_safe (list); + + /* see if any of the apps need filtering */ + for (i = 0; i < old->array->len; i++) { + app = gs_app_list_index (old, i); + if (func (app, user_data)) + gs_app_list_add_safe (list, app, GS_APP_LIST_ADD_FLAG_NONE); + } +} + +typedef struct { + GsAppListSortFunc func; + gpointer user_data; +} GsAppListSortHelper; + +static gint +gs_app_list_sort_cb (gconstpointer a, gconstpointer b, gpointer user_data) +{ + GsApp *app1 = GS_APP (*(GsApp **) a); + GsApp *app2 = GS_APP (*(GsApp **) b); + const GsAppListSortHelper *helper = (GsAppListSortHelper *) user_data; + return helper->func (app1, app2, helper->user_data); +} + +/** + * gs_app_list_sort: + * @list: A #GsAppList + * @func: A #GsAppListSortFunc + * @user_data: user data to pass to @func + * + * Sorts the application list. + * + * Since: 3.22 + **/ +void +gs_app_list_sort (GsAppList *list, GsAppListSortFunc func, gpointer user_data) +{ + g_autoptr(GMutexLocker) locker = NULL; + GsAppListSortHelper helper; + g_return_if_fail (GS_IS_APP_LIST (list)); + locker = g_mutex_locker_new (&list->mutex); + helper.func = func; + helper.user_data = user_data; + g_ptr_array_sort_with_data (list->array, gs_app_list_sort_cb, &helper); +} + +/** + * gs_app_list_truncate: + * @list: A #GsAppList + * @length: the new length + * + * Truncates the application list. It is an error if @length is larger than the + * size of the list. + * + * Since: 3.24 + **/ +void +gs_app_list_truncate (GsAppList *list, guint length) +{ + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP_LIST (list)); + g_return_if_fail (length <= list->array->len); + + /* mark this list as unworthy */ + list->flags |= GS_APP_LIST_FLAG_IS_TRUNCATED; + + /* everything */ + if (length == 0) { + gs_app_list_remove_all (list); + return; + } + + /* remove the apps in the positions larger than the length */ + locker = g_mutex_locker_new (&list->mutex); + g_ptr_array_set_size (list->array, length); +} + +/** + * gs_app_list_randomize: + * @list: A #GsAppList + * + * Randomize the order of the list, but don't change the order until + * the next day. + * + * Since: 3.22 + **/ +void +gs_app_list_randomize (GsAppList *list) +{ + GRand *rand; + g_autoptr(GDateTime) date = NULL; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP_LIST (list)); + + locker = g_mutex_locker_new (&list->mutex); + + if (!gs_app_list_length (list)) + return; + + rand = g_rand_new (); + date = g_date_time_new_now_utc (); + g_rand_set_seed (rand, (guint32) g_date_time_get_day_of_year (date)); + + /* Fisher–Yates shuffle of the array. + * See https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle */ + for (guint i = gs_app_list_length (list) - 1; i >= 1; i--) { + gpointer tmp; + guint j = g_rand_int_range (rand, 0, i + 1); + + tmp = list->array->pdata[i]; + list->array->pdata[i] = list->array->pdata[j]; + list->array->pdata[j] = tmp; + } + + g_rand_free (rand); +} + +static gboolean +gs_app_list_filter_app_is_better (GsApp *app, GsApp *found, GsAppListFilterFlags flags) +{ + /* optional 1st layer sort */ + if ((flags & GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED) > 0) { + if (gs_app_is_installed (app) && !gs_app_is_installed (found)) + return TRUE; + if (!gs_app_is_installed (app) && gs_app_is_installed (found)) + return FALSE; + } + + /* 2nd layer, priority and bundle kind */ + if (gs_app_compare_priority (app, found) < 0) + return TRUE; + + /* assume is worse */ + return FALSE; +} + +static GPtrArray * +gs_app_list_filter_app_get_keys (GsApp *app, GsAppListFilterFlags flags) +{ + GPtrArray *keys = g_ptr_array_new_with_free_func (g_free); + g_autoptr(GString) key = NULL; + + /* just use the unique ID */ + if (flags == GS_APP_LIST_FILTER_FLAG_NONE) { + if (gs_app_get_unique_id (app) != NULL) + g_ptr_array_add (keys, g_strdup (gs_app_get_unique_id (app))); + return keys; + } + + /* use the ID and any provided items */ + if (flags & GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES) { + GPtrArray *provided = gs_app_get_provided (app); + g_ptr_array_add (keys, g_strdup (gs_app_get_id (app))); + for (guint i = 0; i < provided->len; i++) { + AsProvided *prov = g_ptr_array_index (provided, i); + GPtrArray *items; + if (as_provided_get_kind (prov) != AS_PROVIDED_KIND_ID) + continue; + items = as_provided_get_items (prov); + for (guint j = 0; j < items->len; j++) + g_ptr_array_add (keys, g_strdup (g_ptr_array_index (items, j))); + } + return keys; + } + + /* specific compound type */ + key = g_string_new (NULL); + if (flags & GS_APP_LIST_FILTER_FLAG_KEY_ID) { + const gchar *tmp = gs_app_get_id (app); + if (tmp != NULL) + g_string_append (key, gs_app_get_id (app)); + } + if (flags & GS_APP_LIST_FILTER_FLAG_KEY_SOURCE) { + const gchar *tmp = gs_app_get_source_default (app); + if (tmp != NULL) + g_string_append_printf (key, ":%s", tmp); + } + if (flags & GS_APP_LIST_FILTER_FLAG_KEY_VERSION) { + const gchar *tmp = gs_app_get_version (app); + if (tmp != NULL) + g_string_append_printf (key, ":%s", tmp); + } + if (key->len == 0) + return keys; + g_ptr_array_add (keys, g_string_free (g_steal_pointer (&key), FALSE)); + return keys; +} + +/** + * gs_app_list_filter_duplicates: + * @list: A #GsAppList + * @flags: a #GsAppListFilterFlags, e.g. GS_APP_LIST_FILTER_KEY_ID + * + * Filter any duplicate applications from the list. + * + * Since: 3.22 + **/ +void +gs_app_list_filter_duplicates (GsAppList *list, GsAppListFilterFlags flags) +{ + g_autoptr(GHashTable) hash = NULL; + g_autoptr(GHashTable) kept_apps = NULL; + g_autoptr(GsAppList) old = NULL; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP_LIST (list)); + + locker = g_mutex_locker_new (&list->mutex); + + /* a hash table to hold apps with unique app ids */ + hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + /* a hash table containing apps we want to keep */ + kept_apps = g_hash_table_new (g_direct_hash, g_direct_equal); + + for (guint i = 0; i < list->array->len; i++) { + GsApp *app = gs_app_list_index (list, i); + GsApp *found = NULL; + g_autoptr(GPtrArray) keys = NULL; + + /* get all the keys used to identify this app */ + keys = gs_app_list_filter_app_get_keys (app, flags); + for (guint j = 0; j < keys->len; j++) { + const gchar *key = g_ptr_array_index (keys, j); + found = g_hash_table_lookup (hash, key); + if (found != NULL) + break; + } + + /* new app */ + if (found == NULL) { + for (guint j = 0; j < keys->len; j++) { + const gchar *key = g_ptr_array_index (keys, j); + g_hash_table_insert (hash, g_strdup (key), app); + } + g_hash_table_add (kept_apps, app); + continue; + } + + /* better? */ + if (flags != GS_APP_LIST_FILTER_FLAG_NONE && + gs_app_list_filter_app_is_better (app, found, flags)) { + for (guint j = 0; j < keys->len; j++) { + const gchar *key = g_ptr_array_index (keys, j); + g_hash_table_insert (hash, g_strdup (key), app); + } + g_hash_table_remove (kept_apps, found); + g_hash_table_add (kept_apps, app); + } + } + + /* deep copy to a temp list and clear the current one */ + old = gs_app_list_copy (list); + gs_app_list_remove_all_safe (list); + + /* add back the apps we want to keep */ + for (guint i = 0; i < old->array->len; i++) { + GsApp *app = gs_app_list_index (old, i); + if (g_hash_table_contains (kept_apps, app)) { + gs_app_list_add_safe (list, app, GS_APP_LIST_ADD_FLAG_NONE); + /* In case the same instance is in the 'list' multiple times */ + g_hash_table_remove (kept_apps, app); + } + } +} + +/** + * gs_app_list_copy: + * @list: A #GsAppList + * + * Returns a deep copy of the application list. + * + * Returns: A newly allocated #GsAppList + * + * Since: 3.22 + **/ +GsAppList * +gs_app_list_copy (GsAppList *list) +{ + GsAppList *new; + guint i; + + g_return_val_if_fail (GS_IS_APP_LIST (list), NULL); + + new = gs_app_list_new (); + for (i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + gs_app_list_add_safe (new, app, GS_APP_LIST_ADD_FLAG_NONE); + } + return new; +} + +static void +gs_app_list_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsAppList *self = GS_APP_LIST (object); + switch (prop_id) { + case PROP_STATE: + g_value_set_enum (value, self->state); + break; + case PROP_PROGRESS: + g_value_set_uint (value, self->progress); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_list_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_list_finalize (GObject *object) +{ + GsAppList *list = GS_APP_LIST (object); + g_ptr_array_unref (list->array); + g_mutex_clear (&list->mutex); + G_OBJECT_CLASS (gs_app_list_parent_class)->finalize (object); +} + +static void +gs_app_list_class_init (GsAppListClass *klass) +{ + GParamSpec *pspec; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->get_property = gs_app_list_get_property; + object_class->set_property = gs_app_list_set_property; + object_class->finalize = gs_app_list_finalize; + + /** + * GsAppList:state: + */ + pspec = g_param_spec_enum ("state", NULL, NULL, + GS_TYPE_APP_STATE, + GS_APP_STATE_UNKNOWN, + G_PARAM_READABLE); + g_object_class_install_property (object_class, PROP_STATE, pspec); + + /** + * GsAppList:progress: + * + * A percentage (0–100, inclusive) indicating the progress through the + * current task on this app list. The value may otherwise be + * %GS_APP_PROGRESS_UNKNOWN if the progress is unknown or has a wide + * confidence interval on any app, or if the app list is empty. + */ + pspec = g_param_spec_uint ("progress", NULL, NULL, + 0, GS_APP_PROGRESS_UNKNOWN, GS_APP_PROGRESS_UNKNOWN, + G_PARAM_READABLE); + g_object_class_install_property (object_class, PROP_PROGRESS, pspec); + + /** + * GsAppList:app-state-changed: + * @app: a #GsApp + * + * Emitted when any of the internal #GsApp instances changes its state. + * + * Since: 3.40 + */ + signals [SIGNAL_APP_STATE_CHANGED] = + g_signal_new ("app-state-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 1, GS_TYPE_APP); +} + +static void +gs_app_list_init (GsAppList *list) +{ + g_mutex_init (&list->mutex); + list->array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + list->custom_progress = GS_APP_PROGRESS_UNKNOWN; +} + +/** + * gs_app_list_new: + * + * Creates a new list. + * + * Returns: A newly allocated #GsAppList + * + * Since: 3.22 + **/ +GsAppList * +gs_app_list_new (void) +{ + GsAppList *list; + list = g_object_new (GS_TYPE_APP_LIST, NULL); + return GS_APP_LIST (list); +} diff --git a/lib/gs-app-list.h b/lib/gs-app-list.h new file mode 100644 index 0000000..42e0753 --- /dev/null +++ b/lib/gs-app-list.h @@ -0,0 +1,90 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012-2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-app.h" + +G_BEGIN_DECLS + +/** + * GsAppListFilterFlags: (type guint64) + * @GS_APP_LIST_FILTER_FLAG_NONE: No flags set + * @GS_APP_LIST_FILTER_FLAG_KEY_ID: Filter by ID + * @GS_APP_LIST_FILTER_FLAG_KEY_SOURCE: Filter by default source + * @GS_APP_LIST_FILTER_FLAG_KEY_VERSION: Filter by version + * @GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED: Prefer installed applications + * @GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES: Filter using the provides ID + * + * Flags to use when filtering. The priority of each #GsApp is used to choose + * which application object to keep. + * + * Since: 40 + **/ +typedef enum { + GS_APP_LIST_FILTER_FLAG_NONE = 0, + GS_APP_LIST_FILTER_FLAG_KEY_ID = 1 << 0, + GS_APP_LIST_FILTER_FLAG_KEY_SOURCE = 1 << 1, + GS_APP_LIST_FILTER_FLAG_KEY_VERSION = 1 << 2, + GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED= 1 << 3, + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES = 1 << 4, + GS_APP_LIST_FILTER_FLAG_LAST, /*< skip >*/ + GS_APP_LIST_FILTER_FLAG_MASK = G_MAXUINT64 +} GsAppListFilterFlags; + +/* All the properties which use #GsAppListFilterFlags are guint64s. */ +G_STATIC_ASSERT (sizeof (GsAppListFilterFlags) == sizeof (guint64)); + +#define GS_TYPE_APP_LIST (gs_app_list_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppList, gs_app_list, GS, APP_LIST, GObject) + +/** + * GsAppListSortFunc: + * @app1: + * @app2: + * @user_data: user data passed into the sort function + * + * A version of #GCompareFunc which is specific to #GsApps. + * + * Returns: zero if @app1 and @app2 are equal, a negative value if @app1 comes + * before @app2, or a positive value if @app1 comes after @app2 + * Since: 41 + */ +typedef gint (*GsAppListSortFunc) (GsApp *app1, + GsApp *app2, + gpointer user_data); +typedef gboolean (*GsAppListFilterFunc) (GsApp *app, + gpointer user_data); + +GsAppList *gs_app_list_new (void); +GsAppList *gs_app_list_copy (GsAppList *list); +void gs_app_list_add (GsAppList *list, + GsApp *app); +void gs_app_list_add_list (GsAppList *list, + GsAppList *donor); +gboolean gs_app_list_remove (GsAppList *list, + GsApp *app); +void gs_app_list_remove_all (GsAppList *list); +GsApp *gs_app_list_index (GsAppList *list, + guint idx); +GsApp *gs_app_list_lookup (GsAppList *list, + const gchar *unique_id); +guint gs_app_list_length (GsAppList *list); +void gs_app_list_sort (GsAppList *list, + GsAppListSortFunc func, + gpointer user_data); +void gs_app_list_filter (GsAppList *list, + GsAppListFilterFunc func, + gpointer user_data); +void gs_app_list_override_progress (GsAppList *list, + guint progress); + +G_END_DECLS diff --git a/lib/gs-app-permissions.c b/lib/gs-app-permissions.c new file mode 100644 index 0000000..7223396 --- /dev/null +++ b/lib/gs-app-permissions.c @@ -0,0 +1,491 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-app-permissions + * @short_description: A representation of the permissions requested by an app + * + * #GsAppPermissions is an object to represent the permissions requested by an app. + * + * While some common permissions are handled with the #GsAppPermissionsFlags, + * the object allows more detailed permissions to be represented, such as + * specific file system path access. + * + * Since: 43 + */ + +#include "config.h" + +#include + +#include +#include + +#include "gs-app-permissions.h" + +#define DOES_NOT_CONTAIN ((guint) ~0) + +struct _GsAppPermissions +{ + GObject parent; + + gboolean is_sealed; + GsAppPermissionsFlags flags; + GPtrArray *filesystem_read; /* (owner) (nullable) (element-type utf8) */ + GPtrArray *filesystem_full; /* (owner) (nullable) (element-type utf8) */ +}; + +G_DEFINE_TYPE (GsAppPermissions, gs_app_permissions, G_TYPE_OBJECT) + +static gint +cmp_filename_pointers (gconstpointer item1, + gconstpointer item2) +{ + const gchar * const *pitem1 = item1; + const gchar * const *pitem2 = item2; + return strcmp (*pitem1, *pitem2); +} + +static void +gs_app_permissions_finalize (GObject *object) +{ + GsAppPermissions *self = GS_APP_PERMISSIONS (object); + + g_clear_pointer (&self->filesystem_read, g_ptr_array_unref); + g_clear_pointer (&self->filesystem_full, g_ptr_array_unref); + + G_OBJECT_CLASS (gs_app_permissions_parent_class)->finalize (object); +} + +static void +gs_app_permissions_class_init (GsAppPermissionsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gs_app_permissions_finalize; +} + +static void +gs_app_permissions_init (GsAppPermissions *self) +{ +} + +/** + * gs_app_permissions_new: + * + * Create a new #GsAppPermissions containing the app permissions. + * + * Returns: (transfer full): a new #GsAppPermissions + * Since: 43 + */ +GsAppPermissions * +gs_app_permissions_new (void) +{ + return g_object_new (GS_TYPE_APP_PERMISSIONS, NULL); +} + +/** + * gs_app_permissions_seal: + * @self: a #GsAppPermissions + * + * Seal the @self. After being called, no modifications can be + * done on the @self. + * + * Since: 43 + **/ +void +gs_app_permissions_seal (GsAppPermissions *self) +{ + g_return_if_fail (GS_IS_APP_PERMISSIONS (self)); + + if (self->is_sealed) + return; + + self->is_sealed = TRUE; + + /* Sort the arrays, which will help with searching */ + if (self->filesystem_read) + qsort (self->filesystem_read->pdata, self->filesystem_read->len, sizeof (gpointer), cmp_filename_pointers); + + if (self->filesystem_full) + qsort (self->filesystem_full->pdata, self->filesystem_full->len, sizeof (gpointer), cmp_filename_pointers); +} + +/** + * gs_app_permissions_is_sealed: + * @self: a #GsAppPermissions + * + * Checks whether the @self had been sealed. Once the @self is sealed, + * no modifications can be made to it. + * + * Returns: whether the @self had been sealed + * + * Since: 43 + **/ +gboolean +gs_app_permissions_is_sealed (GsAppPermissions *self) +{ + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (self), TRUE); + + return self->is_sealed; +} + +/** + * gs_app_permissions_is_empty: + * @self: a #GsAppPermissions + * + * Gets whether the #GsAppPermissions is empty, i.e. the app is requesting no + * permissions. + * + * This function works regardless of whether the #GsAppPermissions is sealed. + * + * Returns: true if the #GsAppPermissions is empty, false otherwise + * Since: 48 + */ +gboolean +gs_app_permissions_is_empty (GsAppPermissions *self) +{ + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (self), TRUE); + + return (self->flags == GS_APP_PERMISSIONS_FLAGS_NONE && + (self->filesystem_read == NULL || self->filesystem_read->len == 0) && + (self->filesystem_full == NULL || self->filesystem_full->len == 0)); +} + +/** + * gs_app_permissions_diff: + * @self: a #GsAppPermissions + * @other: another #GsAppPermissions + * + * Calculate the difference between two #GsAppPermissions instances. + * + * This effectively calculates (`other` - `self`), i.e. it returns all the + * permissions which are set in @other but not set in @self. + * + * The returned #GsAppPermissions will be sealed. Both @self and @other must be + * sealed before calling this function. + * + * Returns: (transfer full): difference between @other and @self + * Since: 48 + */ +GsAppPermissions * +gs_app_permissions_diff (GsAppPermissions *self, + GsAppPermissions *other) +{ + g_autoptr(GsAppPermissions) diff = gs_app_permissions_new (); + const GPtrArray *new_paths; + + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (self), NULL); + g_return_val_if_fail (self->is_sealed, NULL); + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (other), NULL); + g_return_val_if_fail (other->is_sealed, NULL); + + /* Flags */ + gs_app_permissions_set_flags (diff, other->flags & ~self->flags); + + /* File access */ + new_paths = gs_app_permissions_get_filesystem_read (other); + for (unsigned int i = 0; new_paths != NULL && i < new_paths->len; i++) { + const char *new_path = g_ptr_array_index (new_paths, i); + if (!gs_app_permissions_contains_filesystem_read (self, new_path)) + gs_app_permissions_add_filesystem_read (diff, new_path); + } + + new_paths = gs_app_permissions_get_filesystem_full (other); + for (unsigned int i = 0; new_paths != NULL && i < new_paths->len; i++) { + const char *new_path = g_ptr_array_index (new_paths, i); + if (!gs_app_permissions_contains_filesystem_full (self, new_path)) + gs_app_permissions_add_filesystem_full (diff, new_path); + } + + gs_app_permissions_seal (diff); + + return g_steal_pointer (&diff); +} + +/** + * gs_app_permissions_set_flags: + * @self: a #GsAppPermissions + * @flags: a #GsAppPermissionsFlags to set + * + * Set the permission flags, overwriting any previously set flags. + * Compare to gs_app_permissions_add_flag() and + * gs_app_permissions_remove_flag(). + * + * Since: 43 + */ +void +gs_app_permissions_set_flags (GsAppPermissions *self, + GsAppPermissionsFlags flags) +{ + g_return_if_fail (GS_IS_APP_PERMISSIONS (self)); + + g_assert (!self->is_sealed); + + self->flags = flags; +} + +/** + * gs_app_permissions_get_flags: + * @self: a #GsAppPermissions + * + * Get the permission flags. + * + * Returns: the permission flags + * Since: 43 + */ +GsAppPermissionsFlags +gs_app_permissions_get_flags (GsAppPermissions *self) +{ + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (self), GS_APP_PERMISSIONS_FLAGS_NONE); + + return self->flags; +} + +/** + * gs_app_permissions_add_flag: + * @self: a #GsAppPermissions + * @flags: a #GsAppPermissionsFlags to add + * + * Add the @flags into the already set flags. The @flags cannot be + * #GS_APP_PERMISSIONS_FLAGS_NONE. + * To set that use gs_app_permissions_set_flags() instead. + * + * In case the current flags contain #GS_APP_PERMISSIONS_FLAGS_NONE, it's + * automatically unset. + * + * Since: 43 + */ +void +gs_app_permissions_add_flag (GsAppPermissions *self, + GsAppPermissionsFlags flags) +{ + g_return_if_fail (GS_IS_APP_PERMISSIONS (self)); + g_return_if_fail (flags != GS_APP_PERMISSIONS_FLAGS_NONE); + + g_assert (!self->is_sealed); + + self->flags = self->flags | flags; +} + +/** + * gs_app_permissions_remove_flag: + * @self: a #GsAppPermissions + * @flags: a #GsAppPermissionsFlags to remove + * + * Remove the @flags from the already set flags. The @flags cannot be + * #GS_APP_PERMISSIONS_FLAGS_NONE. + * To set this use gs_app_permissions_set_flags() instead. + * + * In case the result of the removal would lead to no flag set the #GS_APP_PERMISSIONS_FLAGS_NONE + * is set automatically. + * + * Since: 43 + */ +void +gs_app_permissions_remove_flag (GsAppPermissions *self, + GsAppPermissionsFlags flags) +{ + g_return_if_fail (GS_IS_APP_PERMISSIONS (self)); + g_return_if_fail (flags != GS_APP_PERMISSIONS_FLAGS_NONE); + + g_assert (!self->is_sealed); + + self->flags = (self->flags & (~flags)); +} + +static guint +app_permissions_get_array_index (GPtrArray *array, + const gchar *filename) +{ + g_return_val_if_fail (filename != NULL, DOES_NOT_CONTAIN); + + if (array == NULL) + return DOES_NOT_CONTAIN; + + for (guint i = 0; i < array->len; i++) { + const gchar *item = g_ptr_array_index (array, i); + if (g_strcmp0 (item, filename) == 0) + return 0; + } + + return DOES_NOT_CONTAIN; +} + +/** + * gs_app_permissions_add_filesystem_read: + * @self: a #GsAppPermissions + * @filename: a filename to access + * + * Add @filename as a file to access for read. The @filename + * can be either a path or a localized pretty name of it, like "Documents". + * The addition is ignored in case the same @filename is part of + * the read or full access file names. + * + * Since: 43 + */ +void +gs_app_permissions_add_filesystem_read (GsAppPermissions *self, + const gchar *filename) +{ + g_return_if_fail (GS_IS_APP_PERMISSIONS (self)); + g_return_if_fail (filename != NULL); + + g_assert (!self->is_sealed); + + /* Already known */ + if (app_permissions_get_array_index (self->filesystem_read, filename) != DOES_NOT_CONTAIN || + app_permissions_get_array_index (self->filesystem_full, filename) != DOES_NOT_CONTAIN) + return; + + if (self->filesystem_read == NULL) + self->filesystem_read = g_ptr_array_new_with_free_func (g_free); + + g_ptr_array_add (self->filesystem_read, g_strdup (filename)); +} + +/** + * gs_app_permissions_get_filesystem_read: + * @self: a #GsAppPermissions + * + * Get the list of filesystem file names requested for read access using + * gs_app_permissions_add_filesystem_read(). + * The array is owned by the @self and should not be modified by any way. + * It can be %NULL, when no file access was set. + * + * Returns: (nullable) (transfer none) (element-type utf8): an array of + * file names requesting read access or %NULL, when none was set. + * + * Since: 43 + */ +const GPtrArray * +gs_app_permissions_get_filesystem_read (GsAppPermissions *self) +{ + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (self), NULL); + + return self->filesystem_read; +} + +static gboolean +array_contains_filename (GPtrArray *array, + const gchar *filename) +{ + if (array == NULL) + return FALSE; + + return bsearch (&filename, array->pdata, array->len, sizeof (gpointer), cmp_filename_pointers) != NULL; +} + +/** + * gs_app_permissions_contains_filesystem_read: + * @self: a #GsAppPermissions + * @filename: a file name to search for + * + * Checks whether the @filename is included in the filesystem read permissions. + * This can be called only after the @self is sealed. + * + * Returns: whether the @filename is part of the filesystem read permissions + * + * Since: 43 + **/ +gboolean +gs_app_permissions_contains_filesystem_read (GsAppPermissions *self, + const gchar *filename) +{ + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (self), FALSE); + g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (self->is_sealed, FALSE); + + return array_contains_filename (self->filesystem_read, filename); +} + +/** + * gs_app_permissions_add_filesystem_full: + * @self: a #GsAppPermissions + * @filename: a filename to access + * + * Add @filename as a file to access for read and write. The @filename + * can be either a path or a localized pretty name of it, like "Documents". + * The addition is ignored in case the same @filename is include in the list + * already. The @filename is removed from the read list, if it's part of it. + * + * Since: 43 + */ +void +gs_app_permissions_add_filesystem_full (GsAppPermissions *self, + const gchar *filename) +{ + guint read_index; + + g_return_if_fail (GS_IS_APP_PERMISSIONS (self)); + g_return_if_fail (filename != NULL); + + g_assert (!self->is_sealed); + + /* Already known */ + if (app_permissions_get_array_index (self->filesystem_full, filename) != DOES_NOT_CONTAIN) + return; + + if (self->filesystem_full == NULL) + self->filesystem_full = g_ptr_array_new_with_free_func (g_free); + + g_ptr_array_add (self->filesystem_full, g_strdup (filename)); + + /* Remove from the read list and free the read list if becomes empty */ + read_index = app_permissions_get_array_index (self->filesystem_read, filename); + if (read_index != DOES_NOT_CONTAIN) { + g_ptr_array_remove_index (self->filesystem_read, read_index); + if (self->filesystem_read->len == 0) + g_clear_pointer (&self->filesystem_read, g_ptr_array_unref); + } +} + +/** + * gs_app_permissions_get_filesystem_full: + * @self: a #GsAppPermissions + * + * Get the list of filesystem file names requested for read and write access using + * gs_app_permissions_add_filesystem_full(). + * The array is owned by the @self and should not be modified by any way. + * It can be %NULL, when no file access was set. + * + * Returns: (nullable) (transfer none) (element-type utf8): an array of + * file names requesting read and write access or %NULL, when none was set. + * + * Since: 43 + */ +const GPtrArray * +gs_app_permissions_get_filesystem_full (GsAppPermissions *self) +{ + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (self), NULL); + + return self->filesystem_full; +} + +/** + * gs_app_permissions_contains_filesystem_full: + * @self: a #GsAppPermissions + * @filename: a file name to search for + * + * Checks whether the @filename is included in the filesystem full permissions. + * This can be called only after the @self is sealed. + * + * Returns: whether the @filename is part of the filesystem full permissions + * + * Since: 43 + **/ +gboolean +gs_app_permissions_contains_filesystem_full (GsAppPermissions *self, + const gchar *filename) +{ + g_return_val_if_fail (GS_IS_APP_PERMISSIONS (self), FALSE); + g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (self->is_sealed, FALSE); + + return array_contains_filename (self->filesystem_full, filename); +} diff --git a/lib/gs-app-permissions.h b/lib/gs-app-permissions.h new file mode 100644 index 0000000..85f09ca --- /dev/null +++ b/lib/gs-app-permissions.h @@ -0,0 +1,123 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +/** + * GsAppPermissionsFlags: + * @GS_APP_PERMISSIONS_FLAGS_SYSTEM_BUS: App has unfiltered access to the D-Bus + * system bus (i.e. can talk to and own any name on it). + * @GS_APP_PERMISSIONS_FLAGS_SESSION_BUS: App has unfiltered access to the D-Bus + * session bus (i.e. can talk to and own any name on it). + * @GS_APP_PERMISSIONS_FLAGS_DEVICES: App can access general purpose devices + * such as webcams or gaming controllers. + * @GS_APP_PERMISSIONS_FLAGS_SYSTEM_DEVICES: App can access non-physical + * privileged system devices, such as `/dev/shm` or `/dev/kvm` (Since: 44) + * @GS_APP_PERMISSIONS_FLAGS_SCREEN: App can access screen contents + * without asking, e.g. by reading Pipewire ScreenCast streams (Since: 46) + * @GS_APP_PERMISSIONS_FLAGS_INPUT_DEVICES: App can access input devices, under `/dev/input` (Since: 46) + * @GS_APP_PERMISSIONS_FLAGS_AUDIO_DEVICES: App can access audio devices (such as microphones and speakers) from PulseAudio and pipewire directly (Since: 48) + * + * Flags to indicate what permissions an app requires, at a high level. + */ +typedef enum { + GS_APP_PERMISSIONS_FLAGS_NONE = 0, + GS_APP_PERMISSIONS_FLAGS_NETWORK = 1 << 1, + GS_APP_PERMISSIONS_FLAGS_SYSTEM_BUS = 1 << 2, + GS_APP_PERMISSIONS_FLAGS_SESSION_BUS = 1 << 3, + GS_APP_PERMISSIONS_FLAGS_DEVICES = 1 << 4, + GS_APP_PERMISSIONS_FLAGS_HOME_FULL = 1 << 5, + GS_APP_PERMISSIONS_FLAGS_HOME_READ = 1 << 6, + GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL = 1 << 7, + GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ = 1 << 8, + GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL = 1 << 9, + GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_READ = 1 << 10, + GS_APP_PERMISSIONS_FLAGS_SETTINGS = 1 << 11, + GS_APP_PERMISSIONS_FLAGS_X11 = 1 << 12, + GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX = 1 << 13, + GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER = 1 << 14, + GS_APP_PERMISSIONS_FLAGS_SYSTEM_DEVICES = 1 << 15, + GS_APP_PERMISSIONS_FLAGS_SCREEN = 1 << 16, + GS_APP_PERMISSIONS_FLAGS_INPUT_DEVICES = 1 << 17, + GS_APP_PERMISSIONS_FLAGS_AUDIO_DEVICES = 1 << 18, + GS_APP_PERMISSIONS_FLAGS_LAST /*< skip >*/ +} GsAppPermissionsFlags; + +#define LIMITED_PERMISSIONS (GS_APP_PERMISSIONS_FLAGS_SETTINGS | \ + GS_APP_PERMISSIONS_FLAGS_NETWORK | \ + GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_READ | \ + GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL) +#define MEDIUM_PERMISSIONS (LIMITED_PERMISSIONS | \ + GS_APP_PERMISSIONS_FLAGS_X11) + +/** + * GsBusPolicyPermission: + * @GS_BUS_POLICY_PERMISSION_NONE: No permissions. The bus name is invisible to the app. + * @GS_BUS_POLICY_PERMISSION_SEE: The bus name can be enumerated by the app. + * @GS_BUS_POLICY_PERMISSION_TALK: The app can exchange messages with the bus name. + * @GS_BUS_POLICY_PERMISSION_OWN: The app can own the bus name. + * @GS_BUS_POLICY_PERMISSION_UNKNOWN: Permissions are unknown. + * + * Permissions for app interactions with services on a D-Bus bus. + * + * These are in strictly ascending order of what they allow (so each enum member + * allows all of what the lower-valued members allow). It follows exactly the + * same semantics as [flatpak](man:flatpak-metadata(5)). + * + * Since: 48 + */ +typedef enum { + GS_BUS_POLICY_PERMISSION_NONE = 0, + GS_BUS_POLICY_PERMISSION_SEE, + GS_BUS_POLICY_PERMISSION_TALK, + GS_BUS_POLICY_PERMISSION_OWN, + GS_BUS_POLICY_PERMISSION_UNKNOWN, +} GsBusPolicyPermission; + +#define GS_TYPE_APP_PERMISSIONS (gs_app_permissions_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppPermissions, gs_app_permissions, GS, APP_PERMISSIONS, GObject) + +GsAppPermissions *gs_app_permissions_new (void); +void gs_app_permissions_seal (GsAppPermissions *self); +gboolean gs_app_permissions_is_sealed (GsAppPermissions *self); + +gboolean gs_app_permissions_is_empty (GsAppPermissions *self); +GsAppPermissions *gs_app_permissions_diff (GsAppPermissions *self, + GsAppPermissions *other); + +void gs_app_permissions_set_flags (GsAppPermissions *self, + GsAppPermissionsFlags flags); +GsAppPermissionsFlags gs_app_permissions_get_flags (GsAppPermissions *self); +void gs_app_permissions_add_flag (GsAppPermissions *self, + GsAppPermissionsFlags flags); +void gs_app_permissions_remove_flag (GsAppPermissions *self, + GsAppPermissionsFlags flags); +void gs_app_permissions_add_filesystem_read + (GsAppPermissions *self, + const gchar *filename); +const GPtrArray *gs_app_permissions_get_filesystem_read + (GsAppPermissions *self); +gboolean gs_app_permissions_contains_filesystem_read + (GsAppPermissions *self, + const gchar *filename); +void gs_app_permissions_add_filesystem_full + (GsAppPermissions *self, + const gchar *filename); +const GPtrArray *gs_app_permissions_get_filesystem_full + (GsAppPermissions *self); +gboolean gs_app_permissions_contains_filesystem_full + (GsAppPermissions *self, + const gchar *filename); + +G_END_DECLS diff --git a/lib/gs-app-private.h b/lib/gs-app-private.h new file mode 100644 index 0000000..20e1b43 --- /dev/null +++ b/lib/gs-app-private.h @@ -0,0 +1,33 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-app.h" +#include "gs-plugin-types.h" + +G_BEGIN_DECLS + +void gs_app_set_priority (GsApp *app, + guint priority); +guint gs_app_get_priority (GsApp *app); +void gs_app_set_unique_id (GsApp *app, + const gchar *unique_id); +void gs_app_remove_addon (GsApp *app, + GsApp *addon); +GCancellable *gs_app_get_cancellable (GsApp *app); +GCancellable *gs_app_peek_cancellable (GsApp *app); +GsPluginAction gs_app_get_pending_action (GsApp *app); +void gs_app_set_pending_action (GsApp *app, + GsPluginAction action); +gint gs_app_compare_priority (GsApp *app1, + GsApp *app2); +void gs_app_set_icons_state (GsApp *app, + GsAppIconsState icons_state); + +G_END_DECLS diff --git a/lib/gs-app-query.c b/lib/gs-app-query.c new file mode 100644 index 0000000..dbf6d62 --- /dev/null +++ b/lib/gs-app-query.c @@ -0,0 +1,1452 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-app-query + * @short_description: Immutable representation of a query for apps + * + * #GsAppQuery is an object to represent a query for apps. + * + * It will typically be used with #GsPluginJobListApps, which searches for + * matching apps, but it may have multiple consumers. #GsAppQuery only + * represents the query and does not provide an implementation for executing + * that query. + * + * It is immutable after construction, and hence threadsafe. It may be extended + * in future by adding more query properties. The existing query properties are + * conjunctive: results should only be returned which match *all* properties + * which are set, not _any_ properties which are set. + * + * The set of apps returned for the query can be controlled with the + * #GsAppQuery:refine-flags, + * #GsAppQuery:max-results and + * #GsAppQuery:dedupe-flags properties. If `refine-flags` is + * set, all results must be refined using the given set of refine flags (see + * #GsPluginJobRefine). `max-results` and `dedupe-flags` are used to limit the + * set of results. + * + * Results must always be processed in this order: + * - Filtering using #GsAppQuery:filter-func (and any other custom filter + * functions the query executor provides). + * - Deduplication using #GsAppQuery:dedupe-flags. + * - Sorting using #GsAppQuery:sort-func. + * - Truncating result list length to #GsAppQuery:max-results. + * + * Since: 43 + */ + +#include "config.h" + +#include +#include + +#include "gs-app.h" +#include "gs-app-list.h" +#include "gs-app-query.h" +#include "gs-enums.h" +#include "gs-plugin-types.h" +#include "gs-utils.h" + +struct _GsAppQuery +{ + GObject parent; + + GsPluginRefineFlags refine_flags; + guint max_results; + GsAppListFilterFlags dedupe_flags; + + GsAppListSortFunc sort_func; + gpointer sort_user_data; + GDestroyNotify sort_user_data_notify; + + GsAppListFilterFunc filter_func; + gpointer filter_user_data; + GDestroyNotify filter_user_data_notify; + + /* This is guaranteed to either be %NULL, or a non-empty array */ + gchar **provides_files; /* (owned) (nullable) (array zero-terminated=1) */ + GDateTime *released_since; /* (owned) (nullable) */ + GsAppQueryTristate is_curated; + GsAppQueryTristate is_featured; + GsCategory *category; /* (nullable) (owned) */ + GsAppQueryTristate is_installed; + + /* This is guaranteed to either be %NULL, or a non-empty array */ + gchar **deployment_featured; /* (owned) (nullable) (array zero-terminated=1) */ + /* This is guaranteed to either be %NULL, or a non-empty array */ + gchar **developers; /* (owned) (nullable) (array zero-terminated=1) */ + + gchar **keywords; /* (owned) (nullable) (array zero-terminated=1) */ + GsApp *alternate_of; /* (nullable) (owned) */ + gchar *provides_tag; /* (owned) (nullable) */ + GsAppQueryProvidesType provides_type; + GsAppQueryLicenseType license_type; + GsAppQueryDeveloperVerifiedType developer_verified_type; + GsAppQueryTristate is_for_update; + GsAppQueryTristate is_historical_update; + GsAppQueryTristate is_source; +}; + +G_DEFINE_TYPE (GsAppQuery, gs_app_query, G_TYPE_OBJECT) + +typedef enum { + PROP_REFINE_FLAGS = 1, + PROP_MAX_RESULTS, + PROP_DEDUPE_FLAGS, + PROP_SORT_FUNC, + PROP_SORT_USER_DATA, + PROP_SORT_USER_DATA_NOTIFY, + PROP_FILTER_FUNC, + PROP_FILTER_USER_DATA, + PROP_FILTER_USER_DATA_NOTIFY, + PROP_DEPLOYMENT_FEATURED, + PROP_DEVELOPERS, + PROP_PROVIDES_FILES, + PROP_RELEASED_SINCE, + PROP_IS_CURATED, + PROP_IS_FEATURED, + PROP_CATEGORY, + PROP_IS_INSTALLED, + PROP_KEYWORDS, + PROP_ALTERNATE_OF, + PROP_PROVIDES_TAG, + PROP_PROVIDES_TYPE, + PROP_LICENSE_TYPE, + PROP_DEVELOPER_VERIFIED_TYPE, + PROP_IS_FOR_UPDATE, + PROP_IS_HISTORICAL_UPDATE, + PROP_IS_SOURCE, +} GsAppQueryProperty; + +static GParamSpec *props[PROP_IS_SOURCE + 1] = { NULL, }; + +static gchar ** +gs_app_query_sanitize_keywords (const gchar * const *terms) +{ + g_autoptr(GStrvBuilder) keywords = NULL; + gboolean any_added = FALSE; + + if (terms == NULL || terms[0] == NULL) + return NULL; + + keywords = g_strv_builder_new (); + + /* If the caller already split the terms, then use it as is */ + if (terms[1] != NULL) { + g_strv_builder_addv (keywords, (const gchar **) terms); + any_added = TRUE; + } else { + g_autofree gchar *term = g_strdup (terms[0]); + g_strstrip (term); + if (strchr (term, ' ')) { + g_auto(GStrv) split = g_strsplit (term, " ", -1); + for (guint i = 0; split[i] != NULL; i++) { + gchar *word = g_strstrip (split[i]); + if (*word != '\0') { + g_strv_builder_add (keywords, word); + any_added = TRUE; + } + } + } else if (*term != '\0') { + g_strv_builder_add (keywords, term); + any_added = TRUE; + } + } + + return any_added ? g_strv_builder_end (keywords) : NULL; +} + +static void +gs_app_query_constructed (GObject *object) +{ + GsAppQuery *self = GS_APP_QUERY (object); + + G_OBJECT_CLASS (gs_app_query_parent_class)->constructed (object); + + g_assert ((self->provides_tag != NULL) == (self->provides_type != GS_APP_QUERY_PROVIDES_UNKNOWN)); +} + +static void +gs_app_query_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsAppQuery *self = GS_APP_QUERY (object); + + switch ((GsAppQueryProperty) prop_id) { + case PROP_REFINE_FLAGS: + g_value_set_flags (value, self->refine_flags); + break; + case PROP_MAX_RESULTS: + g_value_set_uint (value, self->max_results); + break; + case PROP_DEDUPE_FLAGS: + g_value_set_flags (value, self->dedupe_flags); + break; + case PROP_SORT_FUNC: + g_value_set_pointer (value, self->sort_func); + break; + case PROP_SORT_USER_DATA: + g_value_set_pointer (value, self->sort_user_data); + break; + case PROP_SORT_USER_DATA_NOTIFY: + g_value_set_pointer (value, self->sort_user_data_notify); + break; + case PROP_FILTER_FUNC: + g_value_set_pointer (value, self->filter_func); + break; + case PROP_FILTER_USER_DATA: + g_value_set_pointer (value, self->filter_user_data); + break; + case PROP_FILTER_USER_DATA_NOTIFY: + g_value_set_pointer (value, self->filter_user_data_notify); + break; + case PROP_DEPLOYMENT_FEATURED: + g_value_set_boxed (value, self->deployment_featured); + break; + case PROP_DEVELOPERS: + g_value_set_boxed (value, self->developers); + break; + case PROP_PROVIDES_FILES: + g_value_set_boxed (value, self->provides_files); + break; + case PROP_RELEASED_SINCE: + g_value_set_boxed (value, self->released_since); + break; + case PROP_IS_CURATED: + g_value_set_enum (value, self->is_curated); + break; + case PROP_IS_FEATURED: + g_value_set_enum (value, self->is_featured); + break; + case PROP_CATEGORY: + g_value_set_object (value, self->category); + break; + case PROP_IS_INSTALLED: + g_value_set_enum (value, self->is_installed); + break; + case PROP_KEYWORDS: + g_value_set_boxed (value, self->keywords); + break; + case PROP_ALTERNATE_OF: + g_value_set_object (value, self->alternate_of); + break; + case PROP_PROVIDES_TAG: + g_value_set_string (value, self->provides_tag); + break; + case PROP_PROVIDES_TYPE: + g_value_set_enum (value, self->provides_type); + break; + case PROP_LICENSE_TYPE: + g_value_set_enum (value, self->license_type); + break; + case PROP_DEVELOPER_VERIFIED_TYPE: + g_value_set_enum (value, self->developer_verified_type); + break; + case PROP_IS_FOR_UPDATE: + g_value_set_enum (value, self->is_for_update); + break; + case PROP_IS_HISTORICAL_UPDATE: + g_value_set_enum (value, self->is_historical_update); + break; + case PROP_IS_SOURCE: + g_value_set_enum (value, self->is_source); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_query_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsAppQuery *self = GS_APP_QUERY (object); + + switch ((GsAppQueryProperty) prop_id) { + case PROP_REFINE_FLAGS: + /* Construct only. */ + g_assert (self->refine_flags == 0); + self->refine_flags = g_value_get_flags (value); + break; + case PROP_MAX_RESULTS: + /* Construct only. */ + g_assert (self->max_results == 0); + self->max_results = g_value_get_uint (value); + break; + case PROP_DEDUPE_FLAGS: + /* Construct only. */ + g_assert (self->dedupe_flags == 0); + self->dedupe_flags = g_value_get_flags (value); + break; + case PROP_SORT_FUNC: + /* Construct only. */ + g_assert (self->sort_func == NULL); + self->sort_func = g_value_get_pointer (value); + break; + case PROP_SORT_USER_DATA: + /* Construct only. */ + g_assert (self->sort_user_data == NULL); + self->sort_user_data = g_value_get_pointer (value); + break; + case PROP_SORT_USER_DATA_NOTIFY: + /* Construct only. */ + g_assert (self->sort_user_data_notify == NULL); + self->sort_user_data_notify = g_value_get_pointer (value); + break; + case PROP_FILTER_FUNC: + /* Construct only. */ + g_assert (self->filter_func == NULL); + self->filter_func = g_value_get_pointer (value); + break; + case PROP_FILTER_USER_DATA: + /* Construct only. */ + g_assert (self->filter_user_data == NULL); + self->filter_user_data = g_value_get_pointer (value); + break; + case PROP_FILTER_USER_DATA_NOTIFY: + /* Construct only. */ + g_assert (self->filter_user_data_notify == NULL); + self->filter_user_data_notify = g_value_get_pointer (value); + break; + case PROP_DEPLOYMENT_FEATURED: + /* Construct only. */ + g_assert (self->deployment_featured == NULL); + self->deployment_featured = g_value_dup_boxed (value); + + /* Squash empty arrays to %NULL. */ + if (self->deployment_featured != NULL && self->deployment_featured[0] == NULL) + g_clear_pointer (&self->deployment_featured, g_strfreev); + + break; + case PROP_DEVELOPERS: + /* Construct only. */ + g_assert (self->developers == NULL); + self->developers = g_value_dup_boxed (value); + + /* Squash empty arrays to %NULL. */ + if (self->developers != NULL && self->developers[0] == NULL) + g_clear_pointer (&self->developers, g_strfreev); + + break; + case PROP_PROVIDES_FILES: + /* Construct only. */ + g_assert (self->provides_files == NULL); + self->provides_files = g_value_dup_boxed (value); + + /* Squash empty arrays to %NULL. */ + if (self->provides_files != NULL && self->provides_files[0] == NULL) + g_clear_pointer (&self->provides_files, g_strfreev); + + break; + case PROP_RELEASED_SINCE: + /* Construct only. */ + g_assert (self->released_since == NULL); + self->released_since = g_value_dup_boxed (value); + break; + case PROP_IS_CURATED: + /* Construct only. */ + g_assert (self->is_curated == GS_APP_QUERY_TRISTATE_UNSET); + self->is_curated = g_value_get_enum (value); + break; + case PROP_IS_FEATURED: + /* Construct only. */ + g_assert (self->is_featured == GS_APP_QUERY_TRISTATE_UNSET); + self->is_featured = g_value_get_enum (value); + break; + case PROP_CATEGORY: + /* Construct only. */ + g_assert (self->category == NULL); + self->category = g_value_dup_object (value); + break; + case PROP_IS_INSTALLED: + /* Construct only. */ + g_assert (self->is_installed == GS_APP_QUERY_TRISTATE_UNSET); + self->is_installed = g_value_get_enum (value); + break; + case PROP_KEYWORDS: + /* Construct only. */ + g_assert (self->keywords == NULL); + self->keywords = gs_app_query_sanitize_keywords (g_value_get_boxed (value)); + break; + case PROP_ALTERNATE_OF: + /* Construct only. */ + g_assert (self->alternate_of == NULL); + self->alternate_of = g_value_dup_object (value); + break; + case PROP_PROVIDES_TAG: + /* Construct only. */ + g_assert (self->provides_tag == NULL); + self->provides_tag = g_value_dup_string (value); + break; + case PROP_PROVIDES_TYPE: + /* Construct only. */ + g_assert (self->provides_type == GS_APP_QUERY_PROVIDES_UNKNOWN); + self->provides_type = g_value_get_enum (value); + break; + case PROP_LICENSE_TYPE: + /* Construct only. */ + g_assert (self->license_type == GS_APP_QUERY_LICENSE_ANY); + self->license_type = g_value_get_enum (value); + break; + case PROP_DEVELOPER_VERIFIED_TYPE: + /* Construct only. */ + g_assert (self->developer_verified_type == GS_APP_QUERY_DEVELOPER_VERIFIED_ANY); + self->developer_verified_type = g_value_get_enum (value); + break; + case PROP_IS_FOR_UPDATE: + /* Construct only. */ + g_assert (self->is_for_update == GS_APP_QUERY_TRISTATE_UNSET); + self->is_for_update = g_value_get_enum (value); + break; + case PROP_IS_HISTORICAL_UPDATE: + /* Construct only. */ + g_assert (self->is_historical_update == GS_APP_QUERY_TRISTATE_UNSET); + self->is_historical_update = g_value_get_enum (value); + break; + case PROP_IS_SOURCE: + /* Construct only. */ + g_assert (self->is_source == GS_APP_QUERY_TRISTATE_UNSET); + self->is_source = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_query_dispose (GObject *object) +{ + GsAppQuery *self = GS_APP_QUERY (object); + + if (self->sort_user_data_notify != NULL && self->sort_user_data != NULL) { + self->sort_user_data_notify (g_steal_pointer (&self->sort_user_data)); + self->sort_user_data_notify = NULL; + } + + if (self->filter_user_data_notify != NULL && self->filter_user_data != NULL) { + self->filter_user_data_notify (g_steal_pointer (&self->filter_user_data)); + self->filter_user_data_notify = NULL; + } + + g_clear_object (&self->category); + g_clear_object (&self->alternate_of); + + G_OBJECT_CLASS (gs_app_query_parent_class)->dispose (object); +} + +static void +gs_app_query_finalize (GObject *object) +{ + GsAppQuery *self = GS_APP_QUERY (object); + + g_clear_pointer (&self->deployment_featured, g_strfreev); + g_clear_pointer (&self->developers, g_strfreev); + g_clear_pointer (&self->provides_files, g_strfreev); + g_clear_pointer (&self->released_since, g_date_time_unref); + g_clear_pointer (&self->keywords, g_strfreev); + g_clear_pointer (&self->provides_tag, g_free); + + G_OBJECT_CLASS (gs_app_query_parent_class)->finalize (object); +} + +static void +gs_app_query_class_init (GsAppQueryClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = gs_app_query_constructed; + object_class->get_property = gs_app_query_get_property; + object_class->set_property = gs_app_query_set_property; + object_class->dispose = gs_app_query_dispose; + object_class->finalize = gs_app_query_finalize; + + /** + * GsAppQuery:refine-flags: + * + * Flags to specify how the returned apps must be refined, if at all. + * + * Since: 43 + */ + props[PROP_REFINE_FLAGS] = + g_param_spec_flags ("refine-flags", "Refine Flags", + "Flags to specify how the returned apps must be refined, if at all.", + GS_TYPE_PLUGIN_REFINE_FLAGS, GS_PLUGIN_REFINE_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:max-results: + * + * Maximum number of results to return, or 0 for no limit. + * + * Since: 43 + */ + props[PROP_MAX_RESULTS] = + g_param_spec_uint ("max-results", "Max Results", + "Maximum number of results to return, or 0 for no limit.", + 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:dedupe-flags: + * + * Flags to specify how to deduplicate the returned apps, if at all. + * + * Since: 43 + */ + props[PROP_DEDUPE_FLAGS] = + g_param_spec_flags ("dedupe-flags", "Dedupe Flags", + "Flags to specify how to deduplicate the returned apps, if at all.", + GS_TYPE_APP_LIST_FILTER_FLAGS, GS_APP_LIST_FILTER_FLAG_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:sort-func: (nullable) + * + * A sort function to sort the returned apps. + * + * This must be of type #GsAppListSortFunc. + * + * Since: 43 + */ + props[PROP_SORT_FUNC] = + g_param_spec_pointer ("sort-func", "Sort Function", + "A sort function to sort the returned apps.", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:sort-user-data: (nullable) + * + * User data to pass to #GsAppQuery:sort-func. + * + * Since: 43 + */ + props[PROP_SORT_USER_DATA] = + g_param_spec_pointer ("sort-user-data", "Sort User Data", + "User data to pass to #GsAppQuery:sort-func.", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:sort-user-data-notify: (nullable) + * + * A function to free #GsAppQuery:sort-user-data once it is no longer + * needed. + * + * This must be of type #GDestroyNotify. + * + * This will be called exactly once between being set and when the + * #GsAppQuery is finalized. + * + * Since: 43 + */ + props[PROP_SORT_USER_DATA_NOTIFY] = + g_param_spec_pointer ("sort-user-data-notify", "Sort User Data Notify", + "A function to free #GsAppQuery:sort-user-data once it is no longer needed.", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:filter-func: (nullable) + * + * A filter function to filter the returned apps. + * + * This must be of type #GsAppListFilterFunc. + * + * Since: 43 + */ + props[PROP_FILTER_FUNC] = + g_param_spec_pointer ("filter-func", "Filter Function", + "A filter function to filter the returned apps.", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:filter-user-data: (nullable) + * + * User data to pass to #GsAppQuery:filter-func. + * + * Since: 43 + */ + props[PROP_FILTER_USER_DATA] = + g_param_spec_pointer ("filter-user-data", "Filter User Data", + "User data to pass to #GsAppQuery:filter-func.", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:filter-user-data-notify: (nullable) + * + * A function to free #GsAppQuery:filter-user-data once it is no longer + * needed. + * + * This must be of type #GDestroyNotify. + * + * This will be called exactly once between being set and when the + * #GsAppQuery is finalized. + * + * Since: 43 + */ + props[PROP_FILTER_USER_DATA_NOTIFY] = + g_param_spec_pointer ("filter-user-data-notify", "Filter User Data Notify", + "A function to free #GsAppQuery:filter-user-data once it is no longer needed.", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:deployment-featured: (nullable) + * + * A list of `GnomeSoftware::DeploymentFeatured` app keys. + * + * Search for applications that should be featured in a deployment-specific + * section on the overview page. + * This is expected to be a curated list of applications that are high quality + * and feature-complete. Only apps matching at least one of the keys in this + * list are returned. + * + * This may be %NULL to not filter on it. An empty array is + * considered equivalent to %NULL. + * + * Since: 43 + */ + props[PROP_DEPLOYMENT_FEATURED] = + g_param_spec_boxed ("deployment-featured", "Deployment Featured", + "A list of `GnomeSoftware::DeploymentFeatured` app keys.", + G_TYPE_STRV, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:developers: (nullable) + * + * A list of developers to search the apps for. + * + * Used to search for apps which are provided by given developer(s). + * + * This may be %NULL to not filter on by them. An empty array is + * considered equivalent to %NULL. + * + * Since: 43 + */ + props[PROP_DEVELOPERS] = + g_param_spec_boxed ("developers", "Developers", + "A list of developers who provide the apps.", + G_TYPE_STRV, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:provides-files: (nullable) + * + * A list of file paths which the apps must provide. + * + * Used to search for apps which provide specific files on the local + * file system. + * + * This may be %NULL to not filter on file paths. An empty array is + * considered equivalent to %NULL. + * + * Since: 43 + */ + props[PROP_PROVIDES_FILES] = + g_param_spec_boxed ("provides-files", "Provides Files", + "A list of file paths which the apps must provide.", + G_TYPE_STRV, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:released-since: (nullable) + * + * A date/time which apps must have been released since (exclusive). + * + * Used to search for apps which have been updated recently. + * + * This may be %NULL to not filter on release date. + * + * Since: 43 + */ + props[PROP_RELEASED_SINCE] = + g_param_spec_boxed ("released-since", "Released Since", + "A date/time which apps must have been released since (exclusive).", + G_TYPE_DATE_TIME, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:is-curated: + * + * Whether apps must be curated (%GS_APP_QUERY_TRISTATE_TRUE), or not + * curated (%GS_APP_QUERY_TRISTATE_FALSE). + * + * If this is %GS_APP_QUERY_TRISTATE_UNSET, apps are not filtered by + * their curation state. + * + * ‘Curated’ apps have been reviewed and picked by an editor to be + * promoted to users in some way. They should be high quality and + * feature complete. + * + * Since: 43 + */ + props[PROP_IS_CURATED] = + g_param_spec_enum ("is-curated", "Is Curated", + "Whether apps must be curated, or not curated.", + GS_TYPE_APP_QUERY_TRISTATE, + GS_APP_QUERY_TRISTATE_UNSET, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:is-featured: + * + * Whether apps must be featured (%GS_APP_QUERY_TRISTATE_TRUE), or not + * featured (%GS_APP_QUERY_TRISTATE_FALSE). + * + * If this is %GS_APP_QUERY_TRISTATE_UNSET, apps are not filtered by + * their featured state. + * + * ‘Featured’ apps have been selected by the distribution or software + * source to be highlighted or promoted to users in some way. They + * should be high quality and feature complete. + * + * Since: 43 + */ + props[PROP_IS_FEATURED] = + g_param_spec_enum ("is-featured", "Is Featured", + "Whether apps must be featured, or not featured.", + GS_TYPE_APP_QUERY_TRISTATE, + GS_APP_QUERY_TRISTATE_UNSET, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:category: (nullable) + * + * A category which apps must be in. + * + * If this is %NULL, apps are not filtered by category. + * + * Since: 43 + */ + props[PROP_CATEGORY] = + g_param_spec_object ("category", "Category", + "A category which apps must be in.", + GS_TYPE_CATEGORY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:is-installed: + * + * Whether apps must be installed (%GS_APP_QUERY_TRISTATE_TRUE), or not + * installed (%GS_APP_QUERY_TRISTATE_FALSE). + * + * If this is %GS_APP_QUERY_TRISTATE_UNSET, apps are not filtered by + * their installed state. + * + * Since: 43 + */ + props[PROP_IS_INSTALLED] = + g_param_spec_enum ("is-installed", "Is Installed", + "Whether apps must be installed, or not installed.", + GS_TYPE_APP_QUERY_TRISTATE, + GS_APP_QUERY_TRISTATE_UNSET, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:keywords: + * + * A set of search keywords which apps must match. + * + * Search matches may be done against multiple properties of the app, + * such as its name, description, supported content types, defined + * keywords, etc. The keywords in this property may be stemmed in an + * undefined way after being retrieved from #GsAppQuery. + * + * If this is %NULL, apps are not filtered by matches to this set of + * keywords. An empty array is considered equivalent to %NULL. + * + * Since: 43 + */ + props[PROP_KEYWORDS] = + g_param_spec_boxed ("keywords", "Keywords", + "A set of search keywords which apps must match.", + G_TYPE_STRV, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:alternate-of: (nullable) + * + * An app which apps must be related to. + * + * The definition of ‘related to’ depends on the code consuming + * #GsAppQuery, but it will typically be other applications which + * implement the same feature, or other applications which are packaged + * together with this one. + * + * If this is %NULL, apps are not filtered by alternatives. + * + * Since: 43 + */ + props[PROP_ALTERNATE_OF] = + g_param_spec_object ("alternate-of", "Alternate Of", + "An app which apps must be related to.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:provides-tag: (nullable) + * + * A tag which apps must provide. + * + * The interpretation of the tag depends on #GsAppQuery:provides-type, + * which must not be %GS_APP_QUERY_PROVIDES_UNKNOWN if this is + * non-%NULL. Typically a tag will be a content type which the app + * implements, or the name of a printer which the app provides the + * driver for, etc. + * + * If this is %NULL, apps are not filtered by what they provide. + * + * Since: 43 + */ + props[PROP_PROVIDES_TAG] = + g_param_spec_string ("provides-tag", "Provides Tag", + "A tag which apps must provide.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:provides-type: + * + * The type of #GsAppQuery:provides-tag. + * + * If this is %GS_APP_QUERY_PROVIDES_UNKNOWN, apps are not filtered by + * what they provide. + * + * Since: 43 + */ + props[PROP_PROVIDES_TYPE] = + g_param_spec_enum ("provides-type", "Provides Type", + "The type of #GsAppQuery:provides-tag.", + GS_TYPE_APP_QUERY_PROVIDES_TYPE, GS_APP_QUERY_PROVIDES_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:license-type: + * + * The type of license the app must be under. + * + * If this is %GS_APP_QUERY_LICENSE_ANY, apps are not filtered by + * their license type. + * + * Since: 44 + */ + props[PROP_LICENSE_TYPE] = + g_param_spec_enum ("license-type", "License Type", + "The type of license the app must be under.", + GS_TYPE_APP_QUERY_LICENSE_TYPE, GS_APP_QUERY_LICENSE_ANY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:developer-verified-type: + * + * The type of developer verified state filter. + * + * If this is %GS_APP_QUERY_DEVELOPER_VERIFIED_ANY, apps are not filtered by + * the developer verified state. + * + * Since: 46 + */ + props[PROP_DEVELOPER_VERIFIED_TYPE] = + g_param_spec_enum ("developer-verified-type", "Developer Verified Type", + "The type of developer verified state filter.", + GS_TYPE_APP_QUERY_DEVELOPER_VERIFIED_TYPE, + GS_APP_QUERY_DEVELOPER_VERIFIED_ANY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:is-for-update: + * + * Whether to include only apps which can be updated (%GS_APP_QUERY_TRISTATE_TRUE), or + * apps which cannot be updated (%GS_APP_QUERY_TRISTATE_FALSE). + * + * If this is %GS_APP_QUERY_TRISTATE_UNSET, then it doesn't matter. + * + * Since: 47 + */ + props[PROP_IS_FOR_UPDATE] = + g_param_spec_enum ("is-for-update", "Is For Update", + "Whether to include only apps which can be updated.", + GS_TYPE_APP_QUERY_TRISTATE, + GS_APP_QUERY_TRISTATE_UNSET, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:is-historical-update: + * + * Whether to include only apps which had been recently updated (%GS_APP_QUERY_TRISTATE_TRUE), or + * apps which had not been recently updated (%GS_APP_QUERY_TRISTATE_FALSE). + * + * If this is %GS_APP_QUERY_TRISTATE_UNSET, then it doesn't matter. + * + * Since: 47 + */ + props[PROP_IS_HISTORICAL_UPDATE] = + g_param_spec_enum ("is-historical-update", "Is Historical Update", + "Whether to include only apps which had been recently updated.", + GS_TYPE_APP_QUERY_TRISTATE, + GS_APP_QUERY_TRISTATE_UNSET, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppQuery:is-source: + * + * Get the list of sources, for example the repos listed in `/etc/yum.repos.d` + * or the remotes configured in flatpak. + * + * Plugins are expected to add new apps using gs_app_list_add() of type + * %AS_COMPONENT_KIND_REPOSITORY. + * + * If this is %GS_APP_QUERY_TRISTATE_UNSET, then it doesn't matter. + * + * Since: 47 + */ + props[PROP_IS_SOURCE] = + g_param_spec_enum ("is-source", "Is Source", + "Whether to include only repos.", + GS_TYPE_APP_QUERY_TRISTATE, + GS_APP_QUERY_TRISTATE_UNSET, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_app_query_init (GsAppQuery *self) +{ + self->is_curated = GS_APP_QUERY_TRISTATE_UNSET; + self->is_featured = GS_APP_QUERY_TRISTATE_UNSET; + self->is_installed = GS_APP_QUERY_TRISTATE_UNSET; + self->is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + self->is_historical_update = GS_APP_QUERY_TRISTATE_UNSET; + self->is_source = GS_APP_QUERY_TRISTATE_UNSET; + self->provides_type = GS_APP_QUERY_PROVIDES_UNKNOWN; + self->license_type = GS_APP_QUERY_LICENSE_ANY; + self->developer_verified_type = GS_APP_QUERY_DEVELOPER_VERIFIED_ANY; +} + +/** + * gs_app_query_new: + * @first_property_name: name of the first #GObject property + * @...: value for the first property, followed by additional property/value + * pairs, then a terminating %NULL + * + * Create a new #GsAppQuery containing the given query properties. + * + * Returns: (transfer full): a new #GsAppQuery + * Since: 43 + */ +GsAppQuery * +gs_app_query_new (const gchar *first_property_name, + ...) +{ + va_list args; + g_autoptr(GsAppQuery) query = NULL; + + va_start (args, first_property_name); + query = GS_APP_QUERY (g_object_new_valist (GS_TYPE_APP_QUERY, first_property_name, args)); + va_end (args); + + return g_steal_pointer (&query); +} + +/** + * gs_app_query_get_refine_flags: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:refine-flags. + * + * Returns: the refine flags for the query + * Since: 43 + */ +GsPluginRefineFlags +gs_app_query_get_refine_flags (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_PLUGIN_REFINE_FLAGS_NONE); + + return self->refine_flags; +} + +/** + * gs_app_query_get_max_results: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:max-results. + * + * Returns: the maximum number of results to return for the query, or `0` to + * indicate no limit + * Since: 43 + */ +guint +gs_app_query_get_max_results (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), 0); + + return self->max_results; +} + +/** + * gs_app_query_get_dedupe_flags: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:dedupe-flags. + * + * Returns: the dedupe flags for the query + * Since: 43 + */ +GsAppListFilterFlags +gs_app_query_get_dedupe_flags (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_LIST_FILTER_FLAG_NONE); + + return self->dedupe_flags; +} + +/** + * gs_app_query_get_sort_func: + * @self: a #GsAppQuery + * @user_data_out: (out) (transfer none) (optional) (nullable): return location + * for the #GsAppQuery:sort-user-data, or %NULL to ignore + * + * Get the value of #GsAppQuery:sort-func. + * + * Returns: (nullable): the sort function for the query + * Since: 43 + */ +GsAppListSortFunc +gs_app_query_get_sort_func (GsAppQuery *self, + gpointer *user_data_out) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + if (user_data_out != NULL) + *user_data_out = self->sort_user_data; + + return self->sort_func; +} + +/** + * gs_app_query_get_filter_func: + * @self: a #GsAppQuery + * @user_data_out: (out) (transfer none) (optional) (nullable): return location + * for the #GsAppQuery:filter-user-data, or %NULL to ignore + * + * Get the value of #GsAppQuery:filter-func. + * + * Returns: (nullable): the filter function for the query + * Since: 43 + */ +GsAppListFilterFunc +gs_app_query_get_filter_func (GsAppQuery *self, + gpointer *user_data_out) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + if (user_data_out != NULL) + *user_data_out = self->filter_user_data; + + return self->filter_func; +} + +/** + * gs_app_query_get_n_properties_set: + * @self: a #GsAppQuery + * + * Get the number of query properties which have been set. + * + * These are the properties which determine the query results, rather than ones + * which control refining the results (#GsAppQuery:refine-flags, + * #GsAppQuery:max-results, #GsAppQuery:dedupe-flags, #GsAppQuery:sort-func and + * its user data, #GsAppQuery:filter-func and its user data, + * #GsAppQuery:license-type). + * + * Returns: number of properties set so they will affect query results + * Since: 43 + */ +guint +gs_app_query_get_n_properties_set (GsAppQuery *self) +{ + guint n = 0; + + g_return_val_if_fail (GS_IS_APP_QUERY (self), 0); + + if (self->provides_files != NULL) + n++; + if (self->released_since != NULL) + n++; + if (self->is_curated != GS_APP_QUERY_TRISTATE_UNSET) + n++; + if (self->is_featured != GS_APP_QUERY_TRISTATE_UNSET) + n++; + if (self->category != NULL) + n++; + if (self->is_installed != GS_APP_QUERY_TRISTATE_UNSET) + n++; + if (self->deployment_featured != NULL) + n++; + if (self->developers != NULL) + n++; + if (self->keywords != NULL) + n++; + if (self->alternate_of != NULL) + n++; + if (self->provides_tag != NULL) + n++; + if (self->is_for_update != GS_APP_QUERY_TRISTATE_UNSET) + n++; + if (self->is_historical_update != GS_APP_QUERY_TRISTATE_UNSET) + n++; + if (self->is_source != GS_APP_QUERY_TRISTATE_UNSET) + n++; + + return n; +} + +/** + * gs_app_query_get_provides_files: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:provides-files. + * + * Returns: (nullable): a list of file paths which the apps must provide, + * or %NULL to not filter on file paths + * Since: 43 + */ +const gchar * const * +gs_app_query_get_provides_files (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + /* Always return %NULL or a non-empty array */ + g_assert (self->provides_files == NULL || self->provides_files[0] != NULL); + + return (const gchar * const *) self->provides_files; +} + +/** + * gs_app_query_get_released_since: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:released-since. + * + * Returns: (nullable): a date/time which apps must have been released since, + * or %NULL to not filter on release date + * Since: 43 + */ +GDateTime * +gs_app_query_get_released_since (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + return self->released_since; +} + +/** + * gs_app_query_get_is_curated: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:is-curated. + * + * Returns: %GS_APP_QUERY_TRISTATE_TRUE if apps must be curated, + * %GS_APP_QUERY_TRISTATE_FALSE if they must be not curated, or + * %GS_APP_QUERY_TRISTATE_UNSET if it doesn’t matter + * Since: 43 + */ +GsAppQueryTristate +gs_app_query_get_is_curated (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_TRISTATE_UNSET); + + return self->is_curated; +} + +/** + * gs_app_query_get_is_featured: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:is-featured. + * + * Returns: %GS_APP_QUERY_TRISTATE_TRUE if apps must be featured, + * %GS_APP_QUERY_TRISTATE_FALSE if they must be not featured, or + * %GS_APP_QUERY_TRISTATE_UNSET if it doesn’t matter + * Since: 43 + */ +GsAppQueryTristate +gs_app_query_get_is_featured (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_TRISTATE_UNSET); + + return self->is_featured; +} + +/** + * gs_app_query_get_category: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:category. + * + * Returns: (nullable) (transfer none): a category which apps must be part of, + * or %NULL to not filter on category + * Since: 43 + */ +GsCategory * +gs_app_query_get_category (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + return self->category; +} + +/** + * gs_app_query_get_is_installed: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:is-installed. + * + * Returns: %GS_APP_QUERY_TRISTATE_TRUE if apps must be installed, + * %GS_APP_QUERY_TRISTATE_FALSE if they must be not installed, or + * %GS_APP_QUERY_TRISTATE_UNSET if it doesn’t matter + * Since: 43 + */ +GsAppQueryTristate +gs_app_query_get_is_installed (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_TRISTATE_UNSET); + + return self->is_installed; +} + +/** + * gs_app_query_get_deployment_featured: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:deployment-featured. + * + * Returns: (nullable): a list of `GnomeSoftware::DeploymentFeatured` app keys, + * which the apps have set in a custom key, or %NULL to not filter on this + * Since: 43 + */ +const gchar * const * +gs_app_query_get_deployment_featured (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + /* Always return %NULL or a non-empty array */ + g_assert (self->deployment_featured == NULL || self->deployment_featured[0] != NULL); + + return (const gchar * const *) self->deployment_featured; +} + +/** + * gs_app_query_get_developers: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:developers. + * + * Returns: (nullable): a list of developers who provide the apps, + * or %NULL to not filter by it + * Since: 43 + */ +const gchar * const * +gs_app_query_get_developers (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + /* Always return %NULL or a non-empty array */ + g_assert (self->developers == NULL || self->developers[0] != NULL); + + return (const gchar * const *) self->developers; +} + +/** + * gs_app_query_get_keywords: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:keywords. + * + * Returns: a set of search keywords which apps must match, or %NULL to not + * filter by it + * Since: 43 + */ +const gchar * const * +gs_app_query_get_keywords (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + /* Always return %NULL or a non-empty array */ + g_assert (self->keywords == NULL || self->keywords[0] != NULL); + + return (const gchar * const *) self->keywords; +} + +/** + * gs_app_query_get_alternate_of: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:alternate-of. + * + * Returns: (nullable) (transfer none): an app which apps must be related to, + * or %NULL to not filter on alternates + * Since: 43 + */ +GsApp * +gs_app_query_get_alternate_of (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), NULL); + + return self->alternate_of; +} + +/** + * gs_app_query_get_provides: + * @self: a #GsAppQuery + * @out_provides_tag: (transfer none) (optional) (nullable) (out): return + * location for the value of #GsAppQuery:provides-tag, or %NULL to ignore + * + * Get the value of #GsAppQuery:provides-type and #GsAppQuery:provides-tag. + * + * Returns: the type of tag to filter on, or %GS_APP_QUERY_PROVIDES_UNKNOWN to + * not filter on provides + * Since: 43 + */ +GsAppQueryProvidesType +gs_app_query_get_provides (GsAppQuery *self, + const gchar **out_provides_tag) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_PROVIDES_UNKNOWN); + + if (out_provides_tag != NULL) + *out_provides_tag = self->provides_tag; + + return self->provides_type; +} + +/** + * gs_app_query_get_license_type: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:license-type. + * + * Returns: the type of license the app must be under, or + * %GS_APP_QUERY_LICENSE_ANY to not filter by license + * Since: 44 + */ +GsAppQueryLicenseType +gs_app_query_get_license_type (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_LICENSE_ANY); + + return self->license_type; +} + +/** + * gs_app_query_get_developer_verified_type: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:developer-verified-type. + * + * Returns: the type of developer verified state filter, or + * %GS_APP_QUERY_DEVELOPER_VERIFIED_ANY to not filter by it + * Since: 46 + */ +GsAppQueryDeveloperVerifiedType +gs_app_query_get_developer_verified_type (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_DEVELOPER_VERIFIED_ANY); + + return self->developer_verified_type; +} + +/** + * gs_app_query_get_is_for_update: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:is-for-update. + * + * Returns: %GS_APP_QUERY_TRISTATE_TRUE if query is only for apps which can be updated, + * %GS_APP_QUERY_TRISTATE_FALSE if query is only for apps which cannot be updated, or + * %GS_APP_QUERY_TRISTATE_UNSET if it doesn’t matter + * Since: 47 + */ +GsAppQueryTristate +gs_app_query_get_is_for_update (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_TRISTATE_UNSET); + + return self->is_for_update; +} + +/** + * gs_app_query_get_is_historical_update: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:is-historical-update. + * + * Returns: %GS_APP_QUERY_TRISTATE_TRUE if query is only for apps which had been recently updated, + * %GS_APP_QUERY_TRISTATE_FALSE if query is only for apps which had not been recently updated, or + * %GS_APP_QUERY_TRISTATE_UNSET if it doesn’t matter + * Since: 47 + */ +GsAppQueryTristate +gs_app_query_get_is_historical_update (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_TRISTATE_UNSET); + + return self->is_historical_update; +} + +/** + * gs_app_query_get_is_source: + * @self: a #GsAppQuery + * + * Get the value of #GsAppQuery:is-source. + * + * Returns: %GS_APP_QUERY_TRISTATE_TRUE if query is only for repos + * (aka #GsApps with type %AS_COMPONENT_KIND_REPOSITORY), + * %GS_APP_QUERY_TRISTATE_FALSE if query is only for non-repos apps, or + * %GS_APP_QUERY_TRISTATE_UNSET if it doesn’t matter + * Since: 47 + */ +GsAppQueryTristate +gs_app_query_get_is_source (GsAppQuery *self) +{ + g_return_val_if_fail (GS_IS_APP_QUERY (self), GS_APP_QUERY_TRISTATE_UNSET); + + return self->is_source; +} diff --git a/lib/gs-app-query.h b/lib/gs-app-query.h new file mode 100644 index 0000000..041aaff --- /dev/null +++ b/lib/gs-app-query.h @@ -0,0 +1,145 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app-list.h" +#include "gs-category.h" +#include "gs-plugin-types.h" + +G_BEGIN_DECLS + +/** + * GsAppQueryTristate: + * @GS_APP_QUERY_TRISTATE_UNSET: Value is unset. + * @GS_APP_QUERY_TRISTATE_FALSE: False. Equal in value to %FALSE. + * @GS_APP_QUERY_TRISTATE_TRUE: True. Equal in value to %TRUE. + * + * A type for storing a boolean value which can also have an ‘unknown’ or + * ‘unset’ state. + * + * Within #GsAppQuery this is used for boolean query properties which are unset + * by default so that they don’t affect the query. + * + * Since: 43 + */ +typedef enum +{ + GS_APP_QUERY_TRISTATE_UNSET = -1, + GS_APP_QUERY_TRISTATE_FALSE = 0, + GS_APP_QUERY_TRISTATE_TRUE = 1, +} GsAppQueryTristate; + +/** + * GsAppQueryProvidesType: + * @GS_APP_QUERY_PROVIDES_UNKNOWN: Format is unknown and value is unset. + * @GS_APP_QUERY_PROVIDES_PACKAGE_NAME: A package name in whatever ID format is + * used natively by the current distro. + * @GS_APP_QUERY_PROVIDES_GSTREAMER: A GStreamer plugin name which the app must + * provide. + * @GS_APP_QUERY_PROVIDES_FONT: A font name which the app must provide. + * @GS_APP_QUERY_PROVIDES_MIME_HANDLER: A MIME type/content type which the app + * must support. + * @GS_APP_QUERY_PROVIDES_PS_DRIVER: A printer/PostScript driver which the app + * must provide. + * @GS_APP_QUERY_PROVIDES_PLASMA: A Plasma ID which the app must provide. + * (FIXME: It’s not really clear what this means, but it’s historically been + * supported.) + * + * A type for identifying the format or meaning of #GsAppQuery:provides-tag. + * + * This allows querying for apps which provide various types of functionality, + * such as printer drivers or fonts. + * + * Since: 43 + */ +typedef enum { + GS_APP_QUERY_PROVIDES_UNKNOWN = 0, + GS_APP_QUERY_PROVIDES_PACKAGE_NAME, + GS_APP_QUERY_PROVIDES_GSTREAMER, + GS_APP_QUERY_PROVIDES_FONT, + GS_APP_QUERY_PROVIDES_MIME_HANDLER, + GS_APP_QUERY_PROVIDES_PS_DRIVER, + GS_APP_QUERY_PROVIDES_PLASMA, +} GsAppQueryProvidesType; + +/** + * GsAppQueryLicenseType: + * @GS_APP_QUERY_LICENSE_ANY: Any license, proprietary or free + * @GS_APP_QUERY_LICENSE_FOSS: Only free licenses (FOSS or open source) + * + * A type for categorising licenses, so that apps can be filtered by the type of + * license they have. + * + * Since: 44 + */ +typedef enum { + GS_APP_QUERY_LICENSE_ANY, + GS_APP_QUERY_LICENSE_FOSS, +} GsAppQueryLicenseType; + +/** + * GsAppQueryDeveloperVerifiedType: + * @GS_APP_QUERY_DEVELOPER_VERIFIED_ANY: Any app, with or without verified developer identity + * @GS_APP_QUERY_DEVELOPER_VERIFIED_ONLY: Only apps with verified developer identity + * + * A type to filter apps by developer verified identity. + * + * Since: 46 + */ +typedef enum { + GS_APP_QUERY_DEVELOPER_VERIFIED_ANY, + GS_APP_QUERY_DEVELOPER_VERIFIED_ONLY, +} GsAppQueryDeveloperVerifiedType; + +#define GS_TYPE_APP_QUERY (gs_app_query_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppQuery, gs_app_query, GS, APP_QUERY, GObject) + +GsAppQuery *gs_app_query_new (const gchar *first_property_name, + ...) G_GNUC_NULL_TERMINATED; + +GsPluginRefineFlags gs_app_query_get_refine_flags (GsAppQuery *self); +guint gs_app_query_get_max_results (GsAppQuery *self); +GsAppListFilterFlags gs_app_query_get_dedupe_flags (GsAppQuery *self); +GsAppListSortFunc gs_app_query_get_sort_func (GsAppQuery *self, + gpointer *user_data_out); +GsAppListFilterFunc gs_app_query_get_filter_func (GsAppQuery *self, + gpointer *user_data_out); + +guint gs_app_query_get_n_properties_set (GsAppQuery *self); + +const gchar * const *gs_app_query_get_provides_files (GsAppQuery *self); +GDateTime *gs_app_query_get_released_since (GsAppQuery *self); +GsAppQueryTristate gs_app_query_get_is_curated (GsAppQuery *self); +GsAppQueryTristate gs_app_query_get_is_featured (GsAppQuery *self); +GsCategory *gs_app_query_get_category (GsAppQuery *self); +GsAppQueryTristate gs_app_query_get_is_installed (GsAppQuery *self); +const gchar * const *gs_app_query_get_deployment_featured + (GsAppQuery *self); +const gchar * const *gs_app_query_get_developers (GsAppQuery *self); +const gchar * const *gs_app_query_get_keywords (GsAppQuery *self); +GsApp *gs_app_query_get_alternate_of (GsAppQuery *self); +GsAppQueryProvidesType gs_app_query_get_provides (GsAppQuery *self, + const gchar **out_provides_tag); +GsAppQueryLicenseType gs_app_query_get_license_type (GsAppQuery *self); +GsAppQueryDeveloperVerifiedType + gs_app_query_get_developer_verified_type + (GsAppQuery *self); +GsAppQueryTristate gs_app_query_get_is_for_update (GsAppQuery *self); +GsAppQueryTristate gs_app_query_get_is_historical_update + (GsAppQuery *self); +GsAppQueryTristate gs_app_query_get_is_source (GsAppQuery *self); + +G_END_DECLS diff --git a/lib/gs-app.c b/lib/gs-app.c new file mode 100644 index 0000000..9551208 --- /dev/null +++ b/lib/gs-app.c @@ -0,0 +1,7060 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-app + * @title: GsApp + * @include: gnome-software.h + * @stability: Unstable + * @short_description: An application that is either installed or that can be installed + * + * For GsApps of kind %AS_COMPONENT_KIND_DESKTOP_APP, this object represents a 1:1 mapping + * to a .desktop file. The design is such so you can't have different GsApp's for different + * versions or architectures of a package. For other AppStream component types, GsApp maps + * their properties and %AS_COMPONENT_KIND_GENERIC is used if their type is a generic software + * component. For GNOME Software specific app-like entries, which don't correspond to desktop + * files or distinct software components, but e.g. represent a system update and its individual + * components, use the separate #GsAppSpecialKind enum and %gs_app_set_special_kind while setting + * the AppStream component-kind to generic. + * + * The #GsPluginLoader de-duplicates the GsApp instances that are produced by + * plugins to ensure that there is a single instance of GsApp for each id, making + * the id the primary key for this object. This ensures that actions triggered on + * a #GsApp in different parts of gnome-software can be observed by connecting to + * signals on the #GsApp. + * + * Information about other #GsApp objects can be stored in this object, for + * instance in the gs_app_add_related() method or gs_app_get_history(). + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-app-collation.h" +#include "gs-app-private.h" +#include "gs-desktop-data.h" +#include "gs-enums.h" +#include "gs-icon.h" +#include "gs-key-colors.h" +#include "gs-os-release.h" +#include "gs-plugin.h" +#include "gs-plugin-private.h" +#include "gs-remote-icon.h" +#include "gs-utils.h" + +typedef struct +{ + GMutex mutex; + gchar *id; + gchar *unique_id; + gboolean unique_id_valid; + gchar *branch; + gchar *name; + gchar *renamed_from; + GsAppQuality name_quality; + GPtrArray *icons; /* (nullable) (owned) (element-type AsIcon), sorted by pixel size, smallest first */ + GPtrArray *sources; + GPtrArray *source_ids; + gchar *project_group; + gchar *developer_name; + gchar *agreement; + gchar *version; + gchar *version_ui; + gchar *summary; + GsAppQuality summary_quality; + gchar *summary_missing; + gchar *description; + GsAppQuality description_quality; + GPtrArray *screenshots; + GPtrArray *categories; + GArray *key_colors; /* (nullable) (element-type GdkRGBA) */ + gboolean user_key_colors; + GHashTable *urls; /* (element-type AsUrlKind utf8) (owned) (nullable) */ + GHashTable *launchables; + gchar *url_missing; + gchar *license; + GsAppQuality license_quality; + gchar **menu_path; + gchar *origin; + gchar *origin_ui; + gchar *origin_appstream; + gchar *origin_hostname; + gchar *update_version; + gchar *update_version_ui; + gchar *update_details_markup; + gboolean update_details_set; + AsUrgencyKind update_urgency; + GsAppPermissions *update_permissions; + GWeakRef management_plugin_weak; /* (element-type GsPlugin) */ + guint match_value; + guint priority; + gint rating; + GArray *review_ratings; + GPtrArray *reviews; /* of AsReview */ + GPtrArray *provided; /* of AsProvided */ + + GsSizeType size_installed_type; + guint64 size_installed; + GsSizeType size_download_type; + guint64 size_download; + GsSizeType size_user_data_type; + guint64 size_user_data; + GsSizeType size_cache_data_type; + guint64 size_cache_data; + + AsComponentKind kind; + GsAppSpecialKind special_kind; + GsAppState state; + GsAppState state_recover; + AsComponentScope scope; + AsBundleKind bundle_kind; + guint progress; /* integer 0–100 (inclusive), or %GS_APP_PROGRESS_UNKNOWN */ + gboolean allow_cancel; + GHashTable *metadata; + GsAppList *addons; + GsAppList *related; + GsAppList *history; + guint64 install_date; + guint64 release_date; + guint64 kudos; + gboolean to_be_installed; + GsAppQuirk quirk; + gboolean license_is_free; + GsApp *runtime; + GFile *local_file; + AsContentRating *content_rating; + AsScreenshot *action_screenshot; /* (nullable) (owned) */ + GCancellable *cancellable; + GsPluginAction pending_action; + GsAppPermissions *permissions; + gboolean is_update_downloaded; + GPtrArray *version_history; /* (element-type AsRelease) (nullable) (owned) */ + GPtrArray *relations; /* (nullable) (element-type AsRelation) (owned) */ + gboolean has_translations; + GsAppIconsState icons_state; + gboolean key_color_for_light_set; + GdkRGBA key_color_for_light; + gboolean key_color_for_dark_set; + GdkRGBA key_color_for_dark; + gboolean mok_key_pending; +} GsAppPrivate; + +typedef enum { + PROP_ID = 1, + PROP_NAME, + PROP_VERSION, + PROP_SUMMARY, + PROP_DESCRIPTION, + PROP_RATING, + PROP_KIND, + PROP_SPECIAL_KIND, + PROP_STATE, + PROP_PROGRESS, + PROP_CAN_CANCEL_INSTALLATION, + PROP_INSTALL_DATE, + PROP_RELEASE_DATE, + PROP_QUIRK, + PROP_PENDING_ACTION, + PROP_KEY_COLORS, + PROP_IS_UPDATE_DOWNLOADED, + PROP_URLS, + PROP_URL_MISSING, + PROP_CONTENT_RATING, + PROP_LICENSE, + PROP_SIZE_CACHE_DATA_TYPE, + PROP_SIZE_CACHE_DATA, + PROP_SIZE_DOWNLOAD_TYPE, + PROP_SIZE_DOWNLOAD, + PROP_SIZE_DOWNLOAD_DEPENDENCIES_TYPE, + PROP_SIZE_DOWNLOAD_DEPENDENCIES, + PROP_SIZE_INSTALLED_TYPE, + PROP_SIZE_INSTALLED, + PROP_SIZE_INSTALLED_DEPENDENCIES_TYPE, + PROP_SIZE_INSTALLED_DEPENDENCIES, + PROP_SIZE_USER_DATA_TYPE, + PROP_SIZE_USER_DATA, + PROP_PERMISSIONS, + PROP_RELATIONS, + PROP_ORIGIN_UI, + PROP_HAS_TRANSLATIONS, + PROP_ICONS_STATE, + PROP_MOK_KEY_PENDING, +} GsAppProperty; + +static GParamSpec *obj_props[PROP_MOK_KEY_PENDING + 1] = { NULL, }; + +G_DEFINE_TYPE_WITH_PRIVATE (GsApp, gs_app, G_TYPE_OBJECT) + +static gboolean +_g_set_strv (gchar ***strv_ptr, gchar **new_strv) +{ + if (*strv_ptr == new_strv) + return FALSE; + g_strfreev (*strv_ptr); + *strv_ptr = g_strdupv (new_strv); + return TRUE; +} + +static gboolean +_g_set_ptr_array (GPtrArray **array_ptr, GPtrArray *new_array) +{ + if (*array_ptr == new_array) + return FALSE; + if (new_array != NULL) + g_ptr_array_ref (new_array); + if (*array_ptr != NULL) + g_ptr_array_unref (*array_ptr); + *array_ptr = new_array; + return TRUE; +} + +static gboolean +_g_set_array (GArray **array_ptr, GArray *new_array) +{ + if (*array_ptr == new_array) + return FALSE; + if (new_array != NULL) + g_array_ref (new_array); + if (*array_ptr != NULL) + g_array_unref (*array_ptr); + *array_ptr = new_array; + return TRUE; +} + +/** + * gs_app_state_to_string: + * @state: the #GsAppState. + * + * Converts the enumerated value to an text representation. + * + * Returns: string version of @state, or %NULL for unknown + **/ +const gchar * +gs_app_state_to_string (GsAppState state) +{ + if (state == GS_APP_STATE_UNKNOWN) + return "unknown"; + if (state == GS_APP_STATE_INSTALLED) + return "installed"; + if (state == GS_APP_STATE_AVAILABLE) + return "available"; + if (state == GS_APP_STATE_PURCHASABLE) + return "purchasable"; + if (state == GS_APP_STATE_PURCHASING) + return "purchasing"; + if (state == GS_APP_STATE_AVAILABLE_LOCAL) + return "local"; + if (state == GS_APP_STATE_QUEUED_FOR_INSTALL) + return "queued"; + if (state == GS_APP_STATE_INSTALLING) + return "installing"; + if (state == GS_APP_STATE_REMOVING) + return "removing"; + if (state == GS_APP_STATE_UPDATABLE) + return "updatable"; + if (state == GS_APP_STATE_UPDATABLE_LIVE) + return "updatable-live"; + if (state == GS_APP_STATE_UNAVAILABLE) + return "unavailable"; + if (state == GS_APP_STATE_PENDING_INSTALL) + return "pending-install"; + if (state == GS_APP_STATE_PENDING_REMOVE) + return "pending-remove"; + if (state == GS_APP_STATE_DOWNLOADING) + return "downloading"; + return NULL; +} + +static void +gs_app_kv_lpad (GString *str, const gchar *key, const gchar *value) +{ + gs_utils_append_key_value (str, 20, key, value); +} + +static void +gs_app_kv_size (GString *str, + const gchar *key, + GsSizeType size_type, + guint64 value) +{ + g_autofree gchar *tmp = NULL; + + switch (size_type) { + case GS_SIZE_TYPE_UNKNOWN: + gs_app_kv_lpad (str, key, "unknown"); + break; + case GS_SIZE_TYPE_UNKNOWABLE: + gs_app_kv_lpad (str, key, "unknowable"); + break; + case GS_SIZE_TYPE_VALID: + tmp = g_format_size (value); + gs_app_kv_lpad (str, key, tmp); + break; + default: + g_assert_not_reached (); + } +} + +G_GNUC_PRINTF (3, 4) +static void +gs_app_kv_printf (GString *str, const gchar *key, const gchar *fmt, ...) +{ + va_list args; + g_autofree gchar *tmp = NULL; + va_start (args, fmt); + tmp = g_strdup_vprintf (fmt, args); + va_end (args); + gs_app_kv_lpad (str, key, tmp); +} + +static const gchar * +_as_component_quirk_flag_to_string (GsAppQuirk quirk) +{ + switch (quirk) { + case GS_APP_QUIRK_PROVENANCE: + return "provenance"; + case GS_APP_QUIRK_COMPULSORY: + return "compulsory"; + case GS_APP_QUIRK_HAS_SOURCE: + return "has-source"; + case GS_APP_QUIRK_IS_WILDCARD: + return "is-wildcard"; + case GS_APP_QUIRK_NEEDS_REBOOT: + return "needs-reboot"; + case GS_APP_QUIRK_NOT_REVIEWABLE: + return "not-reviewable"; + case GS_APP_QUIRK_NOT_LAUNCHABLE: + return "not-launchable"; + case GS_APP_QUIRK_NEEDS_USER_ACTION: + return "needs-user-action"; + case GS_APP_QUIRK_IS_PROXY: + return "is-proxy"; + case GS_APP_QUIRK_UNUSABLE_DURING_UPDATE: + return "unusable-during-update"; + case GS_APP_QUIRK_DEVELOPER_VERIFIED: + return "developer-verified"; + case GS_APP_QUIRK_PARENTAL_FILTER: + return "parental-filter"; + case GS_APP_QUIRK_NEW_PERMISSIONS: + return "new-permissions"; + case GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE: + return "parental-not-launchable"; + case GS_APP_QUIRK_HIDE_FROM_SEARCH: + return "hide-from-search"; + case GS_APP_QUIRK_HIDE_EVERYWHERE: + return "hide-everywhere"; + case GS_APP_QUIRK_DO_NOT_AUTO_UPDATE: + return "do-not-auto-update"; + default: + return NULL; + } +} + +/* mutex must be held */ +static const gchar * +gs_app_get_unique_id_unlocked (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + /* invalid */ + if (priv->id == NULL) + return NULL; + + /* hmm, do what we can */ + if (priv->unique_id == NULL || !priv->unique_id_valid) { + g_free (priv->unique_id); + priv->unique_id = gs_utils_build_unique_id (priv->scope, + priv->bundle_kind, + priv->origin, + priv->id, + priv->branch); + priv->unique_id_valid = TRUE; + } + return priv->unique_id; +} + +/** + * gs_app_compare_priority: + * @app1: a #GsApp + * @app2: a #GsApp + * + * Compares two applications using their priority. + * + * Use `gs_plugin_add_rule(plugin,GS_PLUGIN_RULE_BETTER_THAN,"plugin-name")` + * to set the application priority values. + * + * Returns: a negative value if @app1 is less than @app2, a positive value if + * @app1 is greater than @app2, and zero if @app1 is equal to @app2 + **/ +gint +gs_app_compare_priority (GsApp *app1, GsApp *app2) +{ + GsAppPrivate *priv1 = gs_app_get_instance_private (app1); + GsAppPrivate *priv2 = gs_app_get_instance_private (app2); + guint prio1, prio2; + + g_return_val_if_fail (GS_IS_APP (app1), 0); + g_return_val_if_fail (GS_IS_APP (app2), 0); + + /* prefer prio */ + prio1 = gs_app_get_priority (app1); + prio2 = gs_app_get_priority (app2); + if (prio1 > prio2) + return -1; + if (prio1 < prio2) + return 1; + + /* fall back to bundle kind */ + if (priv1->bundle_kind < priv2->bundle_kind) + return -1; + if (priv1->bundle_kind > priv2->bundle_kind) + return 1; + return 0; +} + +/** + * gs_app_quirk_to_string: + * @quirk: a #GsAppQuirk + * + * Returns the quirk bitfield as a string. + * + * Returns: (transfer full): a string + **/ +static gchar * +gs_app_quirk_to_string (GsAppQuirk quirk) +{ + GString *str = g_string_new (""); + guint64 i; + + /* nothing set */ + if (quirk == GS_APP_QUIRK_NONE) { + g_string_append (str, "none"); + return g_string_free (str, FALSE); + } + + /* get flags */ + for (i = 1; i < GS_APP_QUIRK_LAST; i *= 2) { + if ((quirk & i) == 0) + continue; + g_string_append_printf (str, "%s,", + _as_component_quirk_flag_to_string (i)); + } + + /* nothing recognised */ + if (str->len == 0) { + g_string_append (str, "unknown"); + return g_string_free (str, FALSE); + } + + /* remove trailing comma */ + g_string_truncate (str, str->len - 1); + return g_string_free (str, FALSE); +} + +static gchar * +gs_app_kudos_to_string (guint64 kudos) +{ + g_autoptr(GPtrArray) array = g_ptr_array_new (); + if ((kudos & GS_APP_KUDO_MY_LANGUAGE) > 0) + g_ptr_array_add (array, (gpointer) "my-language"); + if ((kudos & GS_APP_KUDO_RECENT_RELEASE) > 0) + g_ptr_array_add (array, (gpointer) "recent-release"); + if ((kudos & GS_APP_KUDO_FEATURED_RECOMMENDED) > 0) + g_ptr_array_add (array, (gpointer) "featured-recommended"); + if ((kudos & GS_APP_KUDO_HAS_KEYWORDS) > 0) + g_ptr_array_add (array, (gpointer) "has-keywords"); + if ((kudos & GS_APP_KUDO_HAS_SCREENSHOTS) > 0) + g_ptr_array_add (array, (gpointer) "has-screenshots"); + if ((kudos & GS_APP_KUDO_HI_DPI_ICON) > 0) + g_ptr_array_add (array, (gpointer) "hi-dpi-icon"); + if ((kudos & GS_APP_KUDO_SANDBOXED) > 0) + g_ptr_array_add (array, (gpointer) "sandboxed"); + if ((kudos & GS_APP_KUDO_SANDBOXED_SECURE) > 0) + g_ptr_array_add (array, (gpointer) "sandboxed-secure"); + g_ptr_array_add (array, NULL); + return g_strjoinv ("|", (gchar **) array->pdata); +} + +/** + * gs_app_to_string: + * @app: a #GsApp + * + * Converts the application to a string. + * This is not designed to serialize the object but to produce a string suitable + * for debugging. + * + * Returns: A multi-line string + * + * Since: 3.22 + **/ +gchar * +gs_app_to_string (GsApp *app) +{ + GString *str; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + str = g_string_new ("GsApp:"); + gs_app_to_string_append (app, str); + if (str->len > 0) + g_string_truncate (str, str->len - 1); + return g_string_free (str, FALSE); +} + +/** + * gs_app_to_string_append: + * @app: a #GsApp + * @str: a #GString + * + * Appends the application to an existing string. + * + * Since: 3.26 + **/ +void +gs_app_to_string_append (GsApp *app, GString *str) +{ + GsAppClass *klass; + GsAppPrivate *priv = gs_app_get_instance_private (app); + AsImage *im; + GList *keys; + const gchar *tmp; + guint i; + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GsPlugin) management_plugin = NULL; + GsSizeType size_download_dependencies_type, size_installed_dependencies_type; + guint64 size_download_dependencies_bytes, size_installed_dependencies_bytes; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (str != NULL); + + klass = GS_APP_GET_CLASS (app); + + locker = g_mutex_locker_new (&priv->mutex); + + g_string_append_printf (str, " [%p]\n", app); + gs_app_kv_lpad (str, "kind", as_component_kind_to_string (priv->kind)); + gs_app_kv_lpad (str, "state", gs_app_state_to_string (priv->state)); + if (priv->quirk > 0) { + g_autofree gchar *qstr = gs_app_quirk_to_string (priv->quirk); + gs_app_kv_lpad (str, "quirk", qstr); + } + if (priv->progress == GS_APP_PROGRESS_UNKNOWN) + gs_app_kv_printf (str, "progress", "unknown"); + else + gs_app_kv_printf (str, "progress", "%u%%", priv->progress); + if (priv->id != NULL) + gs_app_kv_lpad (str, "id", priv->id); + if (priv->unique_id != NULL) + gs_app_kv_lpad (str, "unique-id", priv->unique_id); + if (priv->scope != AS_COMPONENT_SCOPE_UNKNOWN) + gs_app_kv_lpad (str, "scope", as_component_scope_to_string (priv->scope)); + if (priv->bundle_kind != AS_BUNDLE_KIND_UNKNOWN) { + gs_app_kv_lpad (str, "bundle-kind", + as_bundle_kind_to_string (priv->bundle_kind)); + } + if (priv->kudos > 0) { + g_autofree gchar *kudo_str = NULL; + kudo_str = gs_app_kudos_to_string (priv->kudos); + gs_app_kv_lpad (str, "kudos", kudo_str); + } + gs_app_kv_printf (str, "kudo-percentage", "%u", + gs_app_get_kudos_percentage (app)); + if (priv->name != NULL) + gs_app_kv_lpad (str, "name", priv->name); + if (priv->action_screenshot != NULL) + gs_app_kv_printf (str, "action-screenshot", "%p", priv->action_screenshot); + for (i = 0; priv->icons != NULL && i < priv->icons->len; i++) { + GIcon *icon = g_ptr_array_index (priv->icons, i); + g_autofree gchar *icon_str = g_icon_to_string (icon); + gs_app_kv_lpad (str, "icon", icon_str); + } + if (priv->match_value != 0) + gs_app_kv_printf (str, "match-value", "%05x", priv->match_value); + if (gs_app_get_priority (app) != 0) + gs_app_kv_printf (str, "priority", "%u", gs_app_get_priority (app)); + if (priv->version != NULL) + gs_app_kv_lpad (str, "version", priv->version); + if (priv->version_ui != NULL) + gs_app_kv_lpad (str, "version-ui", priv->version_ui); + if (priv->update_version != NULL) + gs_app_kv_lpad (str, "update-version", priv->update_version); + if (priv->update_version_ui != NULL) + gs_app_kv_lpad (str, "update-version-ui", priv->update_version_ui); + if (priv->update_details_markup != NULL) + gs_app_kv_lpad (str, "update-details-markup", priv->update_details_markup); + if (priv->update_urgency != AS_URGENCY_KIND_UNKNOWN) { + gs_app_kv_printf (str, "update-urgency", "%u", + priv->update_urgency); + } + if (priv->summary != NULL) + gs_app_kv_lpad (str, "summary", priv->summary); + if (priv->description != NULL) + gs_app_kv_lpad (str, "description", priv->description); + for (i = 0; i < priv->screenshots->len; i++) { + AsScreenshot *ss = g_ptr_array_index (priv->screenshots, i); + g_autofree gchar *key = NULL; + tmp = as_screenshot_get_caption (ss); +#if AS_CHECK_VERSION(1, 0, 0) + im = as_screenshot_get_image (ss, 0, 0, 1); +#else + im = as_screenshot_get_image (ss, 0, 0); +#endif + if (im == NULL) + continue; + key = g_strdup_printf ("screenshot-%02u", i); + gs_app_kv_printf (str, key, "%s [%s]", + as_image_get_url (im), + tmp != NULL ? tmp : ""); + } + for (i = 0; i < priv->sources->len; i++) { + g_autofree gchar *key = NULL; + tmp = g_ptr_array_index (priv->sources, i); + key = g_strdup_printf ("source-%02u", i); + gs_app_kv_lpad (str, key, tmp); + } + for (i = 0; i < priv->source_ids->len; i++) { + g_autofree gchar *key = NULL; + tmp = g_ptr_array_index (priv->source_ids, i); + key = g_strdup_printf ("source-id-%02u", i); + gs_app_kv_lpad (str, key, tmp); + } + if (priv->local_file != NULL) { + g_autofree gchar *fn = g_file_get_path (priv->local_file); + gs_app_kv_lpad (str, "local-filename", fn); + } + if (priv->content_rating != NULL) { + guint age = as_content_rating_get_minimum_age (priv->content_rating); + if (age != G_MAXUINT) { + g_autofree gchar *value = g_strdup_printf ("%u", age); + gs_app_kv_lpad (str, "content-age", value); + } + gs_app_kv_lpad (str, "content-rating", + as_content_rating_get_kind (priv->content_rating)); + } + if (priv->urls != NULL) { + tmp = g_hash_table_lookup (priv->urls, GINT_TO_POINTER (AS_URL_KIND_HOMEPAGE)); + if (tmp != NULL) + gs_app_kv_lpad (str, "url{homepage}", tmp); + } + keys = g_hash_table_get_keys (priv->launchables); + for (GList *l = keys; l != NULL; l = l->next) { + g_autofree gchar *key = NULL; + key = g_strdup_printf ("launchable{%s}", (const gchar *) l->data); + tmp = g_hash_table_lookup (priv->launchables, l->data); + gs_app_kv_lpad (str, key, tmp); + } + g_list_free (keys); + if (priv->license != NULL) { + gs_app_kv_lpad (str, "license", priv->license); + gs_app_kv_lpad (str, "license-is-free", + gs_app_get_license_is_free (app) ? "yes" : "no"); + } + management_plugin = g_weak_ref_get (&priv->management_plugin_weak); + if (management_plugin != NULL) + gs_app_kv_lpad (str, "management-plugin", gs_plugin_get_name (management_plugin)); + if (priv->summary_missing != NULL) + gs_app_kv_lpad (str, "summary-missing", priv->summary_missing); + if (priv->menu_path != NULL && + priv->menu_path[0] != NULL && + priv->menu_path[0][0] != '\0') { + g_autofree gchar *path = g_strjoinv (" → ", priv->menu_path); + gs_app_kv_lpad (str, "menu-path", path); + } + if (priv->branch != NULL) + gs_app_kv_lpad (str, "branch", priv->branch); + if (priv->origin != NULL && priv->origin[0] != '\0') + gs_app_kv_lpad (str, "origin", priv->origin); + if (priv->origin_ui != NULL && priv->origin_ui[0] != '\0') + gs_app_kv_lpad (str, "origin-ui", priv->origin_ui); + if (priv->origin_appstream != NULL && priv->origin_appstream[0] != '\0') + gs_app_kv_lpad (str, "origin-appstream", priv->origin_appstream); + if (priv->origin_hostname != NULL && priv->origin_hostname[0] != '\0') + gs_app_kv_lpad (str, "origin-hostname", priv->origin_hostname); + if (priv->rating != -1) + gs_app_kv_printf (str, "rating", "%i", priv->rating); + if (priv->review_ratings != NULL) { + for (i = 0; i < priv->review_ratings->len; i++) { + guint32 rat = g_array_index (priv->review_ratings, guint32, i); + gs_app_kv_printf (str, "review-rating", "[%u:%u]", + i, rat); + } + } + if (priv->reviews != NULL) + gs_app_kv_printf (str, "reviews", "%u", priv->reviews->len); + if (priv->provided != NULL) { + guint total = 0; + for (i = 0; i < priv->provided->len; i++) + total += as_provided_get_items (AS_PROVIDED (g_ptr_array_index (priv->provided, i)))->len; + gs_app_kv_printf (str, "provided", "%u", total); + } + if (priv->install_date != 0) { + gs_app_kv_printf (str, "install-date", "%" + G_GUINT64_FORMAT "", + priv->install_date); + } + if (priv->release_date != 0) { + gs_app_kv_printf (str, "release-date", "%" + G_GUINT64_FORMAT "", + priv->release_date); + } + + gs_app_kv_size (str, "size-installed", priv->size_installed_type, priv->size_installed); + size_installed_dependencies_type = gs_app_get_size_installed_dependencies (app, &size_installed_dependencies_bytes); + gs_app_kv_size (str, "size-installed-dependencies", size_installed_dependencies_type, size_installed_dependencies_bytes); + gs_app_kv_size (str, "size-download", priv->size_download_type, priv->size_download); + size_download_dependencies_type = gs_app_get_size_download_dependencies (app, &size_download_dependencies_bytes); + gs_app_kv_size (str, "size-download-dependencies", size_download_dependencies_type, size_download_dependencies_bytes); + gs_app_kv_size (str, "size-cache-data", priv->size_cache_data_type, priv->size_cache_data); + gs_app_kv_size (str, "size-user-data", priv->size_user_data_type, priv->size_user_data); + + for (i = 0; i < gs_app_list_length (priv->related); i++) { + GsApp *app_tmp = gs_app_list_index (priv->related, i); + const gchar *id = gs_app_get_unique_id (app_tmp); + if (id == NULL) + id = gs_app_get_source_default (app_tmp); + /* For example PackageKit can create apps without id */ + if (id != NULL) + gs_app_kv_lpad (str, "related", id); + } + for (i = 0; i < gs_app_list_length (priv->history); i++) { + GsApp *app_tmp = gs_app_list_index (priv->history, i); + const gchar *id = gs_app_get_unique_id (app_tmp); + if (id == NULL) + id = gs_app_get_source_default (app_tmp); + /* For example PackageKit can create apps without id */ + if (id != NULL) + gs_app_kv_lpad (str, "history", id); + } + for (i = 0; i < priv->categories->len; i++) { + tmp = g_ptr_array_index (priv->categories, i); + gs_app_kv_lpad (str, "category", tmp); + } + if (priv->user_key_colors) + gs_app_kv_lpad (str, "user-key-colors", "yes"); + for (i = 0; priv->key_colors != NULL && i < priv->key_colors->len; i++) { + GdkRGBA *color = &g_array_index (priv->key_colors, GdkRGBA, i); + g_autofree gchar *key = NULL; + key = g_strdup_printf ("key-color-%02u", i); + gs_app_kv_printf (str, key, "%.0f,%.0f,%.0f", + color->red * 255.f, + color->green * 255.f, + color->blue * 255.f); + } + if (priv->key_color_for_light_set) { + gs_app_kv_printf (str, "key-color-for-light-scheme", "%.0f,%.0f,%.0f", + priv->key_color_for_light.red * 255.f, + priv->key_color_for_light.green * 255.f, + priv->key_color_for_light.blue * 255.f); + } + if (priv->key_color_for_dark_set) { + gs_app_kv_printf (str, "key-color-for-dark-scheme", "%.0f,%.0f,%.0f", + priv->key_color_for_dark.red * 255.f, + priv->key_color_for_dark.green * 255.f, + priv->key_color_for_dark.blue * 255.f); + } + keys = g_hash_table_get_keys (priv->metadata); + for (GList *l = keys; l != NULL; l = l->next) { + GVariant *val; + const GVariantType *val_type; + g_autofree gchar *key = NULL; + g_autofree gchar *val_str = NULL; + + key = g_strdup_printf ("{%s}", (const gchar *) l->data); + val = g_hash_table_lookup (priv->metadata, l->data); + val_type = g_variant_get_type (val); + if (g_variant_type_equal (val_type, G_VARIANT_TYPE_STRING)) { + val_str = g_variant_dup_string (val, NULL); + } else if (g_variant_type_equal (val_type, G_VARIANT_TYPE_BOOLEAN)) { + val_str = g_strdup (g_variant_get_boolean (val) ? "True" : "False"); + } else if (g_variant_type_equal (val_type, G_VARIANT_TYPE_UINT32)) { + val_str = g_strdup_printf ("%" G_GUINT32_FORMAT, + g_variant_get_uint32 (val)); + } else { + val_str = g_strdup_printf ("unknown type of %s", + g_variant_get_type_string (val)); + } + gs_app_kv_lpad (str, key, val_str); + } + g_list_free (keys); + + for (i = 0; priv->relations != NULL && i < priv->relations->len; i++) { + AsRelation *relation = g_ptr_array_index (priv->relations, i); + gs_app_kv_printf (str, "relation", "%s, %s", + as_relation_kind_to_string (as_relation_get_kind (relation)), + as_relation_item_kind_to_string (as_relation_get_item_kind (relation))); + } + + /* add subclassed info */ + if (klass->to_string != NULL) + klass->to_string (app, str); + + /* print runtime data too */ + if (priv->runtime != NULL) { + g_string_append (str, "\n\tRuntime:\n\t"); + gs_app_to_string_append (priv->runtime, str); + } + g_string_append_printf (str, "\n"); +} + +typedef struct { + GsApp *app; + GParamSpec *pspec; +} AppNotifyData; + +static gboolean +notify_idle_cb (gpointer data) +{ + AppNotifyData *notify_data = data; + + g_object_notify_by_pspec (G_OBJECT (notify_data->app), notify_data->pspec); + + g_object_unref (notify_data->app); + g_free (notify_data); + + return G_SOURCE_REMOVE; +} + +static void +gs_app_queue_notify (GsApp *app, GParamSpec *pspec) +{ + AppNotifyData *notify_data; + + notify_data = g_new (AppNotifyData, 1); + notify_data->app = g_object_ref (app); + notify_data->pspec = pspec; + + g_idle_add (notify_idle_cb, notify_data); +} + +/** + * gs_app_get_id: + * @app: a #GsApp + * + * Gets the application ID. + * + * Returns: The whole ID, e.g. "gimp.desktop" + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_id (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->id; +} + +/** + * gs_app_set_id: + * @app: a #GsApp + * @id: a application ID, e.g. "gimp.desktop" + * + * Sets the application ID. + */ +void +gs_app_set_id (GsApp *app, const gchar *id) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + if (g_set_str (&priv->id, id)) + priv->unique_id_valid = FALSE; +} + +/** + * gs_app_get_scope: + * @app: a #GsApp + * + * Gets the scope of the application. + * + * Returns: the #AsComponentScope, e.g. %AS_COMPONENT_SCOPE_USER + * + * Since: 40 + **/ +AsComponentScope +gs_app_get_scope (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), AS_COMPONENT_SCOPE_UNKNOWN); + return priv->scope; +} + +/** + * gs_app_set_scope: + * @app: a #GsApp + * @scope: a #AsComponentScope, e.g. %AS_COMPONENT_SCOPE_SYSTEM + * + * This sets the scope of the application. + * + * Since: 40 + **/ +void +gs_app_set_scope (GsApp *app, AsComponentScope scope) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_if_fail (GS_IS_APP (app)); + + /* same */ + if (scope == priv->scope) + return; + + priv->scope = scope; + + /* no longer valid */ + priv->unique_id_valid = FALSE; +} + +/** + * gs_app_get_bundle_kind: + * @app: a #GsApp + * + * Gets the bundle kind of the application. + * + * Returns: the #AsComponentScope, e.g. %AS_BUNDLE_KIND_FLATPAK + * + * Since: 40 + **/ +AsBundleKind +gs_app_get_bundle_kind (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), AS_BUNDLE_KIND_UNKNOWN); + return priv->bundle_kind; +} + +/** + * gs_app_set_bundle_kind: + * @app: a #GsApp + * @bundle_kind: a #AsComponentScope, e.g. AS_BUNDLE_KIND_FLATPAK + * + * This sets the bundle kind of the application. + * + * Since: 40 + **/ +void +gs_app_set_bundle_kind (GsApp *app, AsBundleKind bundle_kind) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_if_fail (GS_IS_APP (app)); + + /* same */ + if (bundle_kind == priv->bundle_kind) + return; + + priv->bundle_kind = bundle_kind; + + /* no longer valid */ + priv->unique_id_valid = FALSE; +} + +/** + * gs_app_get_special_kind: + * @app: a #GsApp + * + * Gets the special occupation of the application. + * + * Returns: the #GsAppSpecialKind, e.g. %GS_APP_SPECIAL_KIND_OS_UPDATE + * + * Since: 40 + **/ +GsAppSpecialKind +gs_app_get_special_kind (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), GS_APP_SPECIAL_KIND_NONE); + return priv->special_kind; +} + +/** + * gs_app_set_special_kind: + * @app: a #GsApp + * @kind: a #GsAppSpecialKind, e.g. %GS_APP_SPECIAL_KIND_OS_UPDATE + * + * This sets the special occupation of the application (making + * the #AsComponentKind of this application %AS_COMPONENT_KIND_GENERIC + * per definition). + * + * Since: 40 + **/ +void +gs_app_set_special_kind (GsApp *app, GsAppSpecialKind kind) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + + if (priv->special_kind == kind) + return; + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + priv->special_kind = kind; + gs_app_queue_notify (app, obj_props[PROP_SPECIAL_KIND]); +} + +/** + * gs_app_get_state: + * @app: a #GsApp + * + * Gets the state of the application. + * + * Returns: the #GsAppState, e.g. %GS_APP_STATE_INSTALLED + * + * Since: 40 + **/ +GsAppState +gs_app_get_state (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), GS_APP_STATE_UNKNOWN); + return priv->state; +} + +/** + * gs_app_get_progress: + * @app: a #GsApp + * + * Gets the percentage completion. + * + * Returns: the percentage completion (0–100 inclusive), or %GS_APP_PROGRESS_UNKNOWN for unknown + * + * Since: 3.22 + **/ +guint +gs_app_get_progress (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), GS_APP_PROGRESS_UNKNOWN); + return priv->progress; +} + +/** + * gs_app_get_allow_cancel: + * @app: a #GsApp + * + * Gets whether the app's installation or upgrade can be cancelled. + * + * Returns: TRUE if cancellation is possible, FALSE otherwise. + * + * Since: 3.26 + **/ +gboolean +gs_app_get_allow_cancel (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + return priv->allow_cancel; +} + +/** + * gs_app_set_state_recover: + * @app: a #GsApp + * + * Sets the application state to the last status value that was not + * transient. + * + * Since: 3.22 + **/ +void +gs_app_set_state_recover (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_if_fail (GS_IS_APP (app)); + + if (priv->state_recover == GS_APP_STATE_UNKNOWN) + return; + if (priv->state_recover == priv->state) + return; + + g_debug ("recovering state on %s from %s to %s", + priv->id, + gs_app_state_to_string (priv->state), + gs_app_state_to_string (priv->state_recover)); + + /* make sure progress gets reset when recovering state, to prevent + * confusing initial states when going through more than one attempt */ + gs_app_set_progress (app, GS_APP_PROGRESS_UNKNOWN); + + priv->state = priv->state_recover; + gs_app_queue_notify (app, obj_props[PROP_STATE]); +} + +/* mutex must be held */ +static gboolean +gs_app_set_state_internal (GsApp *app, GsAppState state) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + /* same */ + if (priv->state == state) + return FALSE; + + priv->state = state; + + if (state == GS_APP_STATE_UNKNOWN || + state == GS_APP_STATE_AVAILABLE_LOCAL || + state == GS_APP_STATE_AVAILABLE) + priv->install_date = 0; + + /* save this to simplify error handling in the plugins */ + switch (state) { + case GS_APP_STATE_DOWNLOADING: + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_QUEUED_FOR_INSTALL: + /* transient, so ignore */ + break; + default: + if (priv->state_recover != state) + priv->state_recover = state; + break; + } + + return TRUE; +} + +/** + * gs_app_set_progress: + * @app: a #GsApp + * @percentage: a percentage progress (0–100 inclusive), or %GS_APP_PROGRESS_UNKNOWN + * + * This sets the progress completion of the application. Use + * %GS_APP_PROGRESS_UNKNOWN if the progress is unknown or has a wide confidence + * interval. + * + * If called more than once with the same value then subsequent calls + * will be ignored. + * + * Since: 3.22 + **/ +void +gs_app_set_progress (GsApp *app, guint percentage) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + if (priv->progress == percentage) + return; + if (percentage != GS_APP_PROGRESS_UNKNOWN && percentage > 100) { + g_warning ("cannot set %u%% for %s, setting instead: 100%%", + percentage, gs_app_get_unique_id_unlocked (app)); + percentage = 100; + } + priv->progress = percentage; + gs_app_queue_notify (app, obj_props[PROP_PROGRESS]); +} + +/** + * gs_app_set_allow_cancel: + * @app: a #GsApp + * @allow_cancel: if the installation or upgrade can be cancelled or not + * + * This sets a flag indicating whether the operation can be cancelled or not. + * This is used by the UI to set the "Cancel" button insensitive as + * appropriate. + * + * Since: 3.26 + **/ +void +gs_app_set_allow_cancel (GsApp *app, gboolean allow_cancel) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + if (priv->allow_cancel == allow_cancel) + return; + priv->allow_cancel = allow_cancel; + gs_app_queue_notify (app, obj_props[PROP_CAN_CANCEL_INSTALLATION]); +} + +static void +gs_app_set_pending_action_internal (GsApp *app, + GsPluginAction action) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + if (priv->pending_action == action) + return; + + priv->pending_action = action; + gs_app_queue_notify (app, obj_props[PROP_PENDING_ACTION]); +} + +/** + * gs_app_set_state: + * @app: a #GsApp + * @state: a #GsAppState, e.g. GS_APP_STATE_UPDATABLE_LIVE + * + * This sets the state of the application. + * The following state diagram explains the typical states. + * All applications start in state %GS_APP_STATE_UNKNOWN, + * but the frontend is not supposed to see GsApps with this state. + * + * Plugins are responsible for changing the state to one of the other + * states before the GsApp is passed to the frontend. + * + * |[ + * UPDATABLE --> INSTALLING --> INSTALLED + * UPDATABLE --> REMOVING --> AVAILABLE + * INSTALLED --> REMOVING --> AVAILABLE + * AVAILABLE --> INSTALLING --> INSTALLED + * AVAILABLE <--> QUEUED --> INSTALLING --> INSTALLED + * UNKNOWN --> UNAVAILABLE + * ]| + * + * Since: 3.22 + **/ +void +gs_app_set_state (GsApp *app, GsAppState state) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (gs_app_set_state_internal (app, state)) { + /* since the state changed, and the pending-action refers to + * actions that usually change the state, we assign it to the + * appropriate action here */ + GsPluginAction action = GS_PLUGIN_ACTION_UNKNOWN; + if (priv->state == GS_APP_STATE_QUEUED_FOR_INSTALL) { + if (priv->kind == AS_COMPONENT_KIND_REPOSITORY) + action = GS_PLUGIN_ACTION_INSTALL_REPO; + else + action = GS_PLUGIN_ACTION_INSTALL; + } + gs_app_set_pending_action_internal (app, action); + + gs_app_queue_notify (app, obj_props[PROP_STATE]); + } +} + +/** + * gs_app_get_kind: + * @app: a #GsApp + * + * Gets the kind of the application. + * + * Returns: the #AsComponentKind, e.g. %AS_COMPONENT_KIND_UNKNOWN + * + * Since: 40 + **/ +AsComponentKind +gs_app_get_kind (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), AS_COMPONENT_KIND_UNKNOWN); + return priv->kind; +} + +/** + * gs_app_set_kind: + * @app: a #GsApp + * @kind: a #AsComponentKind, e.g. #AS_COMPONENT_KIND_DESKTOP_APP + * + * This sets the kind of the application. + * The following state diagram explains the typical states. + * All applications start with kind %AS_COMPONENT_KIND_UNKNOWN. + * + * |[ + * PACKAGE --> NORMAL + * PACKAGE --> SYSTEM + * NORMAL --> SYSTEM + * ]| + * + * Since: 40 + **/ +void +gs_app_set_kind (GsApp *app, AsComponentKind kind) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + gboolean state_change_ok = FALSE; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* same */ + if (priv->kind == kind) + return; + + /* trying to change */ + if (priv->kind != AS_COMPONENT_KIND_UNKNOWN && + kind == AS_COMPONENT_KIND_UNKNOWN) { + g_warning ("automatically prevented from changing " + "kind on %s from %s to %s!", + gs_app_get_unique_id_unlocked (app), + as_component_kind_to_string (priv->kind), + as_component_kind_to_string (kind)); + return; + } + + /* check the state change is allowed */ + switch (priv->kind) { + case AS_COMPONENT_KIND_UNKNOWN: + case AS_COMPONENT_KIND_GENERIC: + /* all others derive from generic */ + state_change_ok = TRUE; + break; + case AS_COMPONENT_KIND_DESKTOP_APP: + /* desktop has to be reset to override */ + if (kind == AS_COMPONENT_KIND_UNKNOWN) + state_change_ok = TRUE; + break; + default: + /* this can never change state */ + break; + } + + /* this state change was unexpected */ + if (!state_change_ok) { + g_warning ("Kind change on %s from %s to %s is not OK", + priv->id, + as_component_kind_to_string (priv->kind), + as_component_kind_to_string (kind)); + return; + } + + priv->kind = kind; + gs_app_queue_notify (app, obj_props[PROP_KIND]); + + /* no longer valid */ + priv->unique_id_valid = FALSE; +} + +/** + * gs_app_get_unique_id: + * @app: a #GsApp + * + * Gets the unique application ID used for de-duplication. + * + * The format is "<scope>/<kind>/<origin>/<id>/<branch>". Any unset fields will + * appear as "*". This string can be used with libappstream's functions for + * handling data IDs, e.g. + * https://www.freedesktop.org/software/appstream/docs/api/appstream-as-utils.html#as-utils-data-id-valid + * + * Returns: The unique ID, e.g. `system/flatpak/flathub/org.gnome.Notes/stable`, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_unique_id (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + locker = g_mutex_locker_new (&priv->mutex); + return gs_app_get_unique_id_unlocked (app); +} + +/** + * gs_app_set_unique_id: + * @app: a #GsApp + * @unique_id: a unique application ID, e.g. `user/fedora/\*\/gimp.desktop/\*` + * + * Sets the unique application ID used for de-duplication. See + * gs_app_get_unique_id() for information about the format. Normally you should + * not have to use this function since the unique ID can be constructed from + * other fields, but it can be useful for unit tests. + */ +void +gs_app_set_unique_id (GsApp *app, const gchar *unique_id) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* check for sanity */ + if (!as_utils_data_id_valid (unique_id)) + g_warning ("unique_id %s not valid", unique_id); + + g_free (priv->unique_id); + priv->unique_id = g_strdup (unique_id); + priv->unique_id_valid = TRUE; +} + +/** + * gs_app_get_name: + * @app: a #GsApp + * + * Gets the application name. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_name (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->name; +} + +/** + * gs_app_set_name: + * @app: a #GsApp + * @quality: A #GsAppQuality, e.g. %GS_APP_QUALITY_LOWEST + * @name: The short localized name, e.g. "Calculator" + * + * Sets the application name. + * + * Since: 3.22 + **/ +void +gs_app_set_name (GsApp *app, GsAppQuality quality, const gchar *name) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* only save this if the data is sufficiently high quality */ + if (quality < priv->name_quality) + return; + priv->name_quality = quality; + if (g_set_str (&priv->name, name)) + gs_app_queue_notify (app, obj_props[PROP_NAME]); +} + +/** + * gs_app_get_renamed_from: + * @app: a #GsApp + * + * Gets the old human-readable name of an application that's being renamed, the + * same name that was returned by gs_app_get_name() before the rename. + * + * Returns: (nullable): a string, or %NULL for unset + * + * Since: 40 + **/ +const gchar * +gs_app_get_renamed_from (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->renamed_from; +} + +/** + * gs_app_set_renamed_from: + * @app: a #GsApp + * @renamed_from: (nullable): The old name, e.g. "Iagno" + * + * Sets the old name of an application that's being renamed + * + * Since: 40 + **/ +void +gs_app_set_renamed_from (GsApp *app, const gchar *renamed_from) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_set_str (&priv->renamed_from, renamed_from); +} + +/** + * gs_app_get_branch: + * @app: a #GsApp + * + * Gets the application branch. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_branch (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->branch; +} + +/** + * gs_app_set_branch: + * @app: a #GsApp + * @branch: The branch, e.g. "master" + * + * Sets the application branch. + * + * Since: 3.22 + **/ +void +gs_app_set_branch (GsApp *app, const gchar *branch) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + if (g_set_str (&priv->branch, branch)) + priv->unique_id_valid = FALSE; +} + +/** + * gs_app_get_source_default: + * @app: a #GsApp + * + * Gets the default source. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_source_default (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + if (priv->sources->len == 0) + return NULL; + return g_ptr_array_index (priv->sources, 0); +} + +/** + * gs_app_add_source: + * @app: a #GsApp + * @source: a source name + * + * Adds a source name for the application. + * + * Since: 3.22 + **/ +void +gs_app_add_source (GsApp *app, const gchar *source) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + const gchar *tmp; + guint i; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (source != NULL); + + locker = g_mutex_locker_new (&priv->mutex); + + /* check source doesn't already exist */ + for (i = 0; i < priv->sources->len; i++) { + tmp = g_ptr_array_index (priv->sources, i); + if (g_strcmp0 (tmp, source) == 0) + return; + } + g_ptr_array_add (priv->sources, g_strdup (source)); +} + +/** + * gs_app_get_sources: + * @app: a #GsApp + * + * Gets the list of sources for the application. + * + * Returns: (element-type utf8) (transfer none): a list + * + * Since: 3.22 + **/ +GPtrArray * +gs_app_get_sources (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->sources; +} + +/** + * gs_app_set_sources: + * @app: a #GsApp + * @sources: The non-localized short names, e.g. ["gnome-calculator"] + * + * This name is used for the update page if the application is collected into + * the 'OS Updates' group. + * It is typically the package names, although this should not be relied upon. + * + * Since: 3.22 + **/ +void +gs_app_set_sources (GsApp *app, GPtrArray *sources) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + _g_set_ptr_array (&priv->sources, sources); +} + +/** + * gs_app_get_source_id_default: + * @app: a #GsApp + * + * Gets the default source ID. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_source_id_default (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + if (priv->source_ids->len == 0) + return NULL; + return g_ptr_array_index (priv->source_ids, 0); +} + +/** + * gs_app_get_source_ids: + * @app: a #GsApp + * + * Gets the list of source IDs. + * + * Returns: (element-type utf8) (transfer none): a list + * + * Since: 3.22 + **/ +GPtrArray * +gs_app_get_source_ids (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->source_ids; +} + +/** + * gs_app_clear_source_ids: + * @app: a #GsApp + * + * Clear the list of source IDs. + * + * Since: 3.22 + **/ +void +gs_app_clear_source_ids (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_ptr_array_set_size (priv->source_ids, 0); +} + +/** + * gs_app_set_source_ids: + * @app: a #GsApp + * @source_ids: The source-id, e.g. ["gnome-calculator;0.134;fedora"] + * or ["/home/hughsie/.local/share/applications/0ad.desktop"] + * + * This ID is used internally to the controlling plugin. + * + * Since: 3.22 + **/ +void +gs_app_set_source_ids (GsApp *app, GPtrArray *source_ids) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + _g_set_ptr_array (&priv->source_ids, source_ids); +} + +/** + * gs_app_add_source_id: + * @app: a #GsApp + * @source_id: a source ID, e.g. "gnome-calculator;0.134;fedora" + * + * Adds a source ID to the application. + * + * Since: 3.22 + **/ +void +gs_app_add_source_id (GsApp *app, const gchar *source_id) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + const gchar *tmp; + guint i; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (source_id != NULL); + + /* only add if not already present */ + for (i = 0; i < priv->source_ids->len; i++) { + tmp = g_ptr_array_index (priv->source_ids, i); + if (g_strcmp0 (tmp, source_id) == 0) + return; + } + g_ptr_array_add (priv->source_ids, g_strdup (source_id)); +} + +/** + * gs_app_get_project_group: + * @app: a #GsApp + * + * Gets a project group for the application. + * Applications belonging to other project groups may not be shown in + * this software center. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_project_group (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->project_group; +} + +/** + * gs_app_get_developer_name: + * @app: a #GsApp + * + * Gets the developer name for the application. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_developer_name (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->developer_name; +} + +/** + * gs_app_set_project_group: + * @app: a #GsApp + * @project_group: The non-localized project group, e.g. "GNOME" or "KDE" + * + * Sets a project group for the application. + * + * Since: 3.22 + **/ +void +gs_app_set_project_group (GsApp *app, const gchar *project_group) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_set_str (&priv->project_group, project_group); +} + +/** + * gs_app_set_developer_name: + * @app: a #GsApp + * @developer_name: The developer name, e.g. "Richard Hughes" + * + * Sets a developer name for the application. + * + * Since: 3.22 + **/ +void +gs_app_set_developer_name (GsApp *app, const gchar *developer_name) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_set_str (&priv->developer_name, developer_name); +} + +static GtkIconTheme * +get_icon_theme (void) +{ + GtkIconTheme *theme; + GdkDisplay *display = gdk_display_get_default (); + + if (display != NULL) { + theme = g_object_ref (gtk_icon_theme_get_for_display (display)); + } else { + const gchar *test_search_path; + + /* This fallback path is needed for the unit tests, + * which run without a screen, and in an environment + * where the XDG dir variables don’t point to the system + * datadir which contains the system icon theme. */ + theme = gtk_icon_theme_new (); + + test_search_path = g_getenv ("GS_SELF_TEST_ICON_THEME_PATH"); + if (test_search_path != NULL) { + g_auto(GStrv) dirs = g_strsplit (test_search_path, ":", -1); + gtk_icon_theme_set_search_path (theme, (const char * const *) dirs); + } + + gtk_icon_theme_add_resource_path (theme, "/org/gnome/Software/icons/"); + } + + return theme; +} + +/** + * gs_app_get_icon_for_size: + * @app: a #GsApp + * @size: size (width or height, square) of the icon to fetch, in device pixels + * @scale: scale of the icon to fetch, typically from gtk_widget_get_scale_factor() + * @fallback_icon_name: (nullable): name of an icon to load as a fallback if + * no other suitable one is found, or %NULL for no fallback + * + * Finds the most appropriate icon in the @app’s set of icons to be loaded at + * the given @size×@scale to represent the application. This might be provided + * by the backend at the given @size, or downsized from a larger icon provided + * by the backend. The return value is guaranteed to be suitable for loading as + * a pixbuf at @size, if it’s not %NULL. + * + * If an image at least @size pixels in width isn’t available, and + * @fallback_icon_name has not been provided, %NULL will be returned. If + * @fallback_icon_name has been provided, a #GIcon representing that will be + * returned, and %NULL is guaranteed not to be returned. + * + * Icons which come from a remote server (over HTTP or HTTPS) will be returned + * as a pointer into a local cache, which may not have been populated. You must + * call gs_remote_icon_ensure_cached() on icons of type #GsRemoteIcon to + * download them; this function will not do that for you. + * + * This function may do disk I/O or image resizing, but it will not do network + * I/O to load a pixbuf. It should be acceptable to call this from a UI thread. + * + * Returns: (transfer full) (nullable): a #GIcon, or %NULL + * + * Since: 40 + */ +GIcon * +gs_app_get_icon_for_size (GsApp *app, + guint size, + guint scale, + const gchar *fallback_icon_name) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + g_return_val_if_fail (size > 0, NULL); + g_return_val_if_fail (scale >= 1, NULL); + + g_debug ("Looking for icon for %s, at size %u×%u, with fallback %s", + gs_app_get_id (app), size, scale, fallback_icon_name); + + locker = g_mutex_locker_new (&priv->mutex); + + /* See if there’s an icon of the right size, or the first one which is too + * big which could be scaled down. Note that the icons array may be + * lazily created. */ + for (guint i = 0; priv->icons != NULL && i < priv->icons->len; i++) { + GIcon *icon = priv->icons->pdata[i]; + g_autofree gchar *icon_str = g_icon_to_string (icon); + guint icon_width = gs_icon_get_width (icon); + guint icon_scale = gs_icon_get_scale (icon); + + g_debug ("\tConsidering icon of type %s (%s), width %u@%u", + G_OBJECT_TYPE_NAME (icon), icon_str, icon_width, icon_scale); + + /* To avoid excessive I/O, the loading of AppStream data does + * not verify the existence of cached icons, which we do now. */ + if (G_IS_FILE_ICON (icon)) { + GFile *file = g_file_icon_get_file (G_FILE_ICON (icon)); + if (!g_file_query_exists (file, NULL)) { + continue; + } + } + + /* Ignore icons with unknown width and skip over ones which + * are too small. */ + if (icon_width == 0 || icon_width * icon_scale < size * scale) + continue; + + if (icon_width * icon_scale >= size * scale) + return g_object_ref (icon); + } + + /* Fallback to themed icons with no width set. Typically + * themed icons are available in any given size. */ + for (guint i = 0; priv->icons != NULL && i < priv->icons->len; i++) { + GIcon *icon = priv->icons->pdata[i]; + guint icon_width = gs_icon_get_width (icon); + + if (icon_width == 0 && G_IS_THEMED_ICON (icon)) { + g_autoptr(GtkIconTheme) theme = get_icon_theme (); + if (gtk_icon_theme_has_gicon (theme, icon)) { + g_debug ("Found themed icon"); + return g_object_ref (icon); + } + } + } + + g_clear_pointer (&locker, g_mutex_locker_free); + + if (scale > 1) { + g_debug ("Retrying at scale 1"); + return gs_app_get_icon_for_size (app, size, 1, fallback_icon_name); + } else if (fallback_icon_name != NULL) { + g_debug ("Using fallback icon %s", fallback_icon_name); + return g_themed_icon_new (fallback_icon_name); + } else { + g_debug ("No icon found"); + return NULL; + } +} + +/** + * gs_app_get_action_screenshot: + * @app: a #GsApp + * + * Gets a screenshot for the pending user action. + * + * Returns: (transfer none) (nullable): a #AsScreenshot, or %NULL + * + * Since: 40 + **/ +AsScreenshot * +gs_app_get_action_screenshot (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->action_screenshot; +} + +/** + * gs_app_get_icons: + * @app: a #GsApp + * + * Gets the icons for the application. + * + * This will never return an empty array; it will always return either %NULL or + * a non-empty array. + * + * Returns: (transfer none) (element-type GIcon) (nullable): an array of icons, + * or %NULL if there are no icons + * + * Since: 3.22 + * + * Deprecated: 45: Use gs_app_dup_icons() or gs_app_has_icons() instead. + **/ +GPtrArray * +gs_app_get_icons (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->icons == NULL || priv->icons->len == 0) + return NULL; + + return priv->icons; +} + +/** + * gs_app_dup_icons: + * @app: a #GsApp + * + * Gets the icons for the application in a thread safe way. + * + * This will never return an empty array; it will always return either %NULL or + * a non-empty array. + * + * Returns: (transfer container) (element-type GIcon) (nullable): an array of icons, + * or %NULL if there are no icons + * + * Since: 45 + **/ +GPtrArray * +gs_app_dup_icons (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + GPtrArray *copy; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->icons == NULL || priv->icons->len == 0) + return NULL; + + copy = g_ptr_array_new_full (priv->icons->len, g_object_unref); + for (guint i = 0; i < priv->icons->len; i++) { + g_ptr_array_add (copy, g_object_ref (g_ptr_array_index (priv->icons, i))); + } + + return copy; +} + +/** + * gs_app_has_icons: + * @app: a #GsApp + * + * Checks whether there are any icons set. + * + * Returns: %TRUE, when the @app has set any icons, %FALSE otherwise + * + * Since: 45 + **/ +gboolean +gs_app_has_icons (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + locker = g_mutex_locker_new (&priv->mutex); + + return priv->icons != NULL && priv->icons->len > 0; +} + +static gint +icon_sort_width_cb (gconstpointer a, + gconstpointer b) +{ + GIcon *icon_a = *((GIcon **) a); + GIcon *icon_b = *((GIcon **) b); + guint width_a = gs_icon_get_width (icon_a); + guint width_b = gs_icon_get_width (icon_b); + + /* Sort unknown widths (0 value) to the end. */ + if (width_a == 0 && width_b == 0) + return 0; + else if (width_a == 0) + return 1; + else if (width_b == 0) + return -1; + else + return width_a - width_b; +} + +/** + * gs_app_add_icon: + * @app: a #GsApp + * @icon: a #GIcon + * + * Adds an icon to use for the application. + * If the first icon added cannot be loaded then the next one is tried. + * + * Since: 40 + **/ +void +gs_app_add_icon (GsApp *app, GIcon *icon) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (G_IS_ICON (icon)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->icons == NULL) { + priv->icons = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + } else { + gboolean icon_is_remote = GS_IS_REMOTE_ICON (icon); + const gchar *icon_remote_uri = icon_is_remote ? gs_remote_icon_get_uri (GS_REMOTE_ICON (icon)) : NULL; + + /* ignore duplicate icons (with a special treatment of the GsRemoteIcon hack) */ + for (guint i = 0; i < priv->icons->len; i++) { + GIcon *existing = g_ptr_array_index (priv->icons, i); + if (g_icon_equal (existing, icon)) { + if (GS_IS_REMOTE_ICON (existing) && icon_is_remote && + g_strcmp0 (gs_remote_icon_get_uri (GS_REMOTE_ICON (existing)), icon_remote_uri) == 0) { + return; + } + } + } + } + + g_ptr_array_add (priv->icons, g_object_ref (icon)); + + /* Ensure the array is sorted by increasing width. */ + g_ptr_array_sort (priv->icons, icon_sort_width_cb); +} + +/** + * gs_app_remove_all_icons: + * @app: a #GsApp + * + * Remove all icons from @app. + * + * Since: 40 + */ +void +gs_app_remove_all_icons (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->icons != NULL) + g_ptr_array_set_size (priv->icons, 0); +} + +/** + * gs_app_get_agreement: + * @app: a #GsApp + * + * Gets the agreement text for the application. + * + * Returns: a string in AppStream description format, or %NULL for unset + * + * Since: 3.28 + **/ +const gchar * +gs_app_get_agreement (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->agreement; +} + +/** + * gs_app_set_agreement: + * @app: a #GsApp + * @agreement: The agreement text, e.g. "

Foobar

" + * + * Sets the application end-user agreement (e.g. a EULA) in AppStream + * description format. + * + * Since: 3.28 + **/ +void +gs_app_set_agreement (GsApp *app, const gchar *agreement) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_set_str (&priv->agreement, agreement); +} + +/** + * gs_app_get_local_file: + * @app: a #GsApp + * + * Gets the file that backs this application, for instance this might + * be a local file in ~/Downloads that we are installing. + * + * Returns: (transfer none): a #GFile, or %NULL + * + * Since: 3.22 + **/ +GFile * +gs_app_get_local_file (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->local_file; +} + +/** + * gs_app_set_local_file: + * @app: a #GsApp + * @local_file: a #GFile, or %NULL + * + * Sets the file that backs this application, for instance this might + * be a local file in ~/Downloads that we are installing. + * + * Since: 3.22 + **/ +void +gs_app_set_local_file (GsApp *app, GFile *local_file) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_set_object (&priv->local_file, local_file); +} + +/** + * gs_app_dup_content_rating: + * @app: a #GsApp + * + * Gets the content rating for this application. + * + * Returns: (transfer full) (nullable): a #AsContentRating, or %NULL + * + * Since: 41 + **/ +AsContentRating * +gs_app_dup_content_rating (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + locker = g_mutex_locker_new (&priv->mutex); + return (priv->content_rating != NULL) ? g_object_ref (priv->content_rating) : NULL; +} + +/** + * gs_app_set_content_rating: + * @app: a #GsApp + * @content_rating: a #AsContentRating, or %NULL + * + * Sets the content rating for this application. + * + * Since: 40 + **/ +void +gs_app_set_content_rating (GsApp *app, AsContentRating *content_rating) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + if (g_set_object (&priv->content_rating, content_rating)) + gs_app_queue_notify (app, obj_props[PROP_CONTENT_RATING]); +} + +/** + * gs_app_get_runtime: + * @app: a #GsApp + * + * Gets the runtime for the installed application. + * + * Returns: (transfer none): a #GsApp, or %NULL for unset + * + * Since: 3.22 + **/ +GsApp * +gs_app_get_runtime (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->runtime; +} + +/** + * gs_app_set_runtime: + * @app: a #GsApp + * @runtime: a #GsApp + * + * Sets the runtime that the installed application requires. + * + * Since: 3.22 + **/ +void +gs_app_set_runtime (GsApp *app, GsApp *runtime) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (GS_IS_APP (runtime)); + g_return_if_fail (app != runtime); + locker = g_mutex_locker_new (&priv->mutex); + g_set_object (&priv->runtime, runtime); + + /* The runtime adds to the main app’s sizes. */ + gs_app_queue_notify (app, obj_props[PROP_SIZE_DOWNLOAD_DEPENDENCIES_TYPE]); + gs_app_queue_notify (app, obj_props[PROP_SIZE_DOWNLOAD_DEPENDENCIES]); +} + +/** + * gs_app_set_action_screenshot: + * @app: a #GsApp + * @action_screenshot: (transfer none) (nullable): a #AsScreenshot, or %NULL + * + * Sets a screenshot used to represent the action. + * + * Since: 40 + **/ +void +gs_app_set_action_screenshot (GsApp *app, AsScreenshot *action_screenshot) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_set_object (&priv->action_screenshot, action_screenshot); +} + +typedef enum { + GS_APP_VERSION_FIXUP_RELEASE = 1, + GS_APP_VERSION_FIXUP_DISTRO_SUFFIX = 2, + GS_APP_VERSION_FIXUP_GIT_SUFFIX = 4, + GS_APP_VERSION_FIXUP_LAST, +} GsAppVersionFixup; + +/** + * gs_app_get_ui_version: + * + * convert 1:1.6.2-7.fc17 into "Version 1.6.2" + **/ +static gchar * +gs_app_get_ui_version (const gchar *version, guint64 flags) +{ + guint i; + gchar *new; + gchar *f; + + /* nothing set */ + if (version == NULL) + return NULL; + + /* first remove any epoch */ + for (i = 0; version[i] != '\0'; i++) { + if (version[i] == ':') { + version = &version[i+1]; + break; + } + if (!g_ascii_isdigit (version[i])) + break; + } + + /* then remove any distro suffix */ + new = g_strdup (version); + if ((flags & GS_APP_VERSION_FIXUP_DISTRO_SUFFIX) > 0) { + f = g_strstr_len (new, -1, ".fc"); + if (f != NULL) + *f= '\0'; + f = g_strstr_len (new, -1, ".el"); + if (f != NULL) + *f= '\0'; + } + + /* then remove any release */ + if ((flags & GS_APP_VERSION_FIXUP_RELEASE) > 0) { + f = g_strrstr_len (new, -1, "-"); + if (f != NULL) + *f= '\0'; + } + + /* then remove any git suffix */ + if ((flags & GS_APP_VERSION_FIXUP_GIT_SUFFIX) > 0) { + f = g_strrstr_len (new, -1, ".2012"); + if (f != NULL) + *f= '\0'; + f = g_strrstr_len (new, -1, ".2013"); + if (f != NULL) + *f= '\0'; + } + + return new; +} + +static void +gs_app_ui_versions_invalidate (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_free (priv->version_ui); + g_free (priv->update_version_ui); + priv->version_ui = NULL; + priv->update_version_ui = NULL; +} + +static void +gs_app_ui_versions_populate (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + guint i; + guint64 flags[] = { GS_APP_VERSION_FIXUP_RELEASE | + GS_APP_VERSION_FIXUP_DISTRO_SUFFIX | + GS_APP_VERSION_FIXUP_GIT_SUFFIX, + GS_APP_VERSION_FIXUP_DISTRO_SUFFIX | + GS_APP_VERSION_FIXUP_GIT_SUFFIX, + GS_APP_VERSION_FIXUP_DISTRO_SUFFIX, + 0 }; + + /* try each set of bitfields in order */ + for (i = 0; flags[i] != 0; i++) { + priv->version_ui = gs_app_get_ui_version (priv->version, flags[i]); + priv->update_version_ui = gs_app_get_ui_version (priv->update_version, flags[i]); + if (g_strcmp0 (priv->version_ui, priv->update_version_ui) != 0) { + gs_app_queue_notify (app, obj_props[PROP_VERSION]); + return; + } + gs_app_ui_versions_invalidate (app); + } + + /* we tried, but failed */ + priv->version_ui = g_strdup (priv->version); + priv->update_version_ui = g_strdup (priv->update_version); +} + +/** + * gs_app_get_version: + * @app: a #GsApp + * + * Gets the exact version for the application. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_version (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->version; +} + +/** + * gs_app_get_version_ui: + * @app: a #GsApp + * + * Gets a version string that can be displayed in a UI. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_version_ui (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + + /* work out the two version numbers */ + if (priv->version != NULL && + priv->version_ui == NULL) { + gs_app_ui_versions_populate (app); + } + + return priv->version_ui; +} + +/** + * gs_app_set_version: + * @app: a #GsApp + * @version: The version, e.g. "2:1.2.3.fc19" + * + * This saves the version after stripping out any non-friendly parts, such as + * distro tags, git revisions and that kind of thing. + * + * Since: 3.22 + **/ +void +gs_app_set_version (GsApp *app, const gchar *version) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (g_set_str (&priv->version, version)) { + gs_app_ui_versions_invalidate (app); + gs_app_queue_notify (app, obj_props[PROP_VERSION]); + } +} + +/** + * gs_app_get_summary: + * @app: a #GsApp + * + * Gets the single-line description of the application. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_summary (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->summary; +} + +/** + * gs_app_set_summary: + * @app: a #GsApp + * @quality: a #GsAppQuality, e.g. %GS_APP_QUALITY_LOWEST + * @summary: a string, e.g. "A graphical calculator for GNOME" + * + * The medium length one-line localized name. + * + * Since: 3.22 + **/ +void +gs_app_set_summary (GsApp *app, GsAppQuality quality, const gchar *summary) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* only save this if the data is sufficiently high quality */ + if (quality < priv->summary_quality) + return; + priv->summary_quality = quality; + if (g_set_str (&priv->summary, summary)) + gs_app_queue_notify (app, obj_props[PROP_SUMMARY]); +} + +/** + * gs_app_get_description: + * @app: a #GsApp + * + * Gets the long multi-line description of the application. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_description (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->description; +} + +/** + * gs_app_set_description: + * @app: a #GsApp + * @quality: a #GsAppQuality, e.g. %GS_APP_QUALITY_LOWEST + * @description: a string, e.g. "GNOME Calculator is a graphical calculator for GNOME..." + * + * Sets the long multi-line description of the application. + * + * Since: 3.22 + **/ +void +gs_app_set_description (GsApp *app, GsAppQuality quality, const gchar *description) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* only save this if the data is sufficiently high quality */ + if (quality < priv->description_quality) + return; + priv->description_quality = quality; + g_set_str (&priv->description, description); +} + +/** + * gs_app_get_url: + * @app: a #GsApp + * @kind: a #AsUrlKind, e.g. %AS_URL_KIND_HOMEPAGE + * + * Gets a web address of a specific type. + * + * Returns: (nullable): a string, or %NULL for unset + * + * Since: 40 + **/ +const gchar * +gs_app_get_url (GsApp *app, AsUrlKind kind) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->urls == NULL) + return NULL; + return g_hash_table_lookup (priv->urls, GINT_TO_POINTER (kind)); +} + +/** + * gs_app_set_url: + * @app: a #GsApp + * @kind: a #AsUrlKind, e.g. %AS_URL_KIND_HOMEPAGE + * @url: (nullable): a web URL, e.g. "http://www.hughsie.com/", or %NULL to + * unset the URL of this @kind + * + * Sets a web address of a specific type. + * + * Since: 40 + **/ +void +gs_app_set_url (GsApp *app, AsUrlKind kind, const gchar *url) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + gboolean changed; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->urls == NULL) + priv->urls = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, g_free); + + if (url != NULL) + changed = g_hash_table_insert (priv->urls, + GINT_TO_POINTER (kind), + g_strdup (url)); + else + changed = g_hash_table_remove (priv->urls, + GINT_TO_POINTER (kind)); + + if (changed) + gs_app_queue_notify (app, obj_props[PROP_URLS]); +} + +/** + * gs_app_get_url_missing: + * @app: a #GsApp + * + * Gets a web address for the application with explanations + * why it does not have an installation candidate. + * + * Returns: (nullable): a string, or %NULL for unset + * + * Since: 40 + **/ +const gchar * +gs_app_get_url_missing (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + locker = g_mutex_locker_new (&priv->mutex); + return priv->url_missing; +} + +/** + * gs_app_set_url_missing: + * @app: a #GsApp + * @url: (nullable): a web URL, e.g. `http://www.packagekit.org/pk-package-not-found.html`, or %NULL + * + * Sets a web address containing explanations why this app + * does not have an installation candidate. + * + * Since: 40 + **/ +void +gs_app_set_url_missing (GsApp *app, const gchar *url) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + + if (g_strcmp0 (priv->url_missing, url) == 0) + return; + g_free (priv->url_missing); + priv->url_missing = g_strdup (url); + gs_app_queue_notify (app, obj_props[PROP_URL_MISSING]); +} + +/** + * gs_app_get_launchable: + * @app: a #GsApp + * @kind: a #AsLaunchableKind, e.g. %AS_LAUNCHABLE_KIND_DESKTOP_ID + * + * Gets a launchable of a specific type. + * + * Returns: a string, or %NULL for unset + * + * Since: 40 + **/ +const gchar * +gs_app_get_launchable (GsApp *app, AsLaunchableKind kind) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + locker = g_mutex_locker_new (&priv->mutex); + return g_hash_table_lookup (priv->launchables, + as_launchable_kind_to_string (kind)); +} + +/** + * gs_app_set_launchable: + * @app: a #GsApp + * @kind: a #AsLaunchableKind, e.g. %AS_LAUNCHABLE_KIND_DESKTOP_ID + * @launchable: a way to launch, e.g. "org.gnome.Sysprof2.desktop" + * + * Sets a launchable of a specific type. + * + * Since: 40 + **/ +void +gs_app_set_launchable (GsApp *app, AsLaunchableKind kind, const gchar *launchable) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + gpointer current_value = NULL; + const gchar *key; + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + key = as_launchable_kind_to_string (kind); + if (g_hash_table_lookup_extended (priv->launchables, key, NULL, ¤t_value)) { + if (g_strcmp0 ((const gchar *) current_value, launchable) != 0) + g_debug ("Preventing app '%s' replace of %s's launchable '%s' with '%s'", + priv->name, key, (const gchar *) current_value, launchable); + } else { + g_hash_table_insert (priv->launchables, + (gpointer) as_launchable_kind_to_string (kind), + g_strdup (launchable)); + } +} + +/** + * gs_app_get_license: + * @app: a #GsApp + * + * Gets the project license of the application. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_license (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->license; +} + +/** + * gs_app_get_license_is_free: + * @app: a #GsApp + * + * Returns if the application is free software. + * + * Returns: %TRUE if the application is free software + * + * Since: 3.22 + **/ +gboolean +gs_app_get_license_is_free (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + return priv->license_is_free; +} + +/** + * gs_app_set_license: + * @app: a #GsApp + * @quality: a #GsAppQuality, e.g. %GS_APP_QUALITY_NORMAL + * @license: a SPDX license string, e.g. "GPL-3.0 AND LGPL-2.0-or-later" + * + * Sets the project licenses used in the application. + * + * Since: 3.22 + **/ +void +gs_app_set_license (GsApp *app, GsAppQuality quality, const gchar *license) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* only save this if the data is sufficiently high quality */ + if (quality <= priv->license_quality) + return; + if (license == NULL || *license == '\0') + return; + priv->license_quality = quality; + + priv->license_is_free = as_license_is_free_license (license); + + if (g_set_str (&priv->license, license)) + gs_app_queue_notify (app, obj_props[PROP_LICENSE]); +} + +/** + * gs_app_get_summary_missing: + * @app: a #GsApp + * + * Gets the one-line summary to use when this application is missing. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_summary_missing (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->summary_missing; +} + +/** + * gs_app_set_summary_missing: + * @app: a #GsApp + * @summary_missing: a string, or %NULL + * + * Sets the one-line summary to use when this application is missing. + * + * Since: 3.22 + **/ +void +gs_app_set_summary_missing (GsApp *app, const gchar *summary_missing) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_set_str (&priv->summary_missing, summary_missing); +} + +static gboolean +_gs_app_has_desktop_group (GsApp *app, const gchar *desktop_group) +{ + guint i; + g_auto(GStrv) split = g_strsplit (desktop_group, "::", -1); + for (i = 0; split[i] != NULL; i++) { + if (!gs_app_has_category (app, split[i])) + return FALSE; + } + return TRUE; +} + +/** + * gs_app_get_menu_path: + * @app: a #GsApp + * + * Returns the menu path which is an array of path elements. + * The resulting array is an internal structure and must not be + * modified or freed. + * + * Returns: (array zero-terminated=1) (element-type utf8) (transfer none): + * a %NULL-terminated array of strings + * + * Since: 3.22 + **/ +gchar ** +gs_app_get_menu_path (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + + /* Lazy load. */ + if (priv->menu_path == NULL) { + const gchar *strv[] = { "", NULL, NULL }; + const GsDesktopData *msdata; + gboolean found = FALSE; + + /* find a top level category the app has */ + msdata = gs_desktop_get_data (); + for (gsize i = 0; !found && msdata[i].id != NULL; i++) { + const GsDesktopData *data = &msdata[i]; + for (gsize j = 0; !found && data->mapping[j].id != NULL; j++) { + const GsDesktopMap *map = &data->mapping[j]; + g_autofree gchar *msgctxt = NULL; + + if (g_strcmp0 (map->id, "all") == 0) + continue; + if (g_strcmp0 (map->id, "featured") == 0) + continue; + msgctxt = g_strdup_printf ("Menu of %s", data->name); + for (gsize k = 0; !found && map->fdo_cats[k] != NULL; k++) { + const gchar *tmp = msdata[i].mapping[j].fdo_cats[k]; + if (_gs_app_has_desktop_group (app, tmp)) { + strv[0] = g_dgettext (GETTEXT_PACKAGE, msdata[i].name); + strv[1] = g_dpgettext2 (GETTEXT_PACKAGE, msgctxt, + msdata[i].mapping[j].name); + found = TRUE; + break; + } + } + } + } + + /* always set something to avoid keep searching for this */ + gs_app_set_menu_path (app, (gchar **) strv); + } + + return priv->menu_path; +} + +/** + * gs_app_set_menu_path: + * @app: a #GsApp + * @menu_path: (array zero-terminated=1) (element-type utf8) (transfer none): + * a %NULL-terminated array of strings + * + * Sets the new menu path. The menu path is an array of path elements. + * This function creates a deep copy of the path. + * + * Since: 3.22 + **/ +void +gs_app_set_menu_path (GsApp *app, gchar **menu_path) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + _g_set_strv (&priv->menu_path, menu_path); +} + +/** + * gs_app_get_origin: + * @app: a #GsApp + * + * Gets the origin for the application, e.g. "fedora". + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_origin (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->origin; +} + +/** + * gs_app_set_origin: + * @app: a #GsApp + * @origin: a string, or %NULL + * + * The origin is the original source of the application e.g. "fedora-updates" + * + * Since: 3.22 + **/ +void +gs_app_set_origin (GsApp *app, const gchar *origin) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* same */ + if (g_strcmp0 (origin, priv->origin) == 0) + return; + + /* trying to change */ + if (priv->origin != NULL && origin != NULL) { + g_warning ("automatically prevented from changing " + "origin on %s from %s to %s!", + gs_app_get_unique_id_unlocked (app), + priv->origin, origin); + return; + } + + g_free (priv->origin); + priv->origin = g_strdup (origin); + + /* no longer valid */ + priv->unique_id_valid = FALSE; +} + +/** + * gs_app_get_origin_appstream: + * @app: a #GsApp + * + * Gets the appstream origin for the application, e.g. "fedora". + * + * Returns: a string, or %NULL for unset + * + * Since: 3.28 + **/ +const gchar * +gs_app_get_origin_appstream (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->origin_appstream; +} + +/** + * gs_app_set_origin_appstream: + * @app: a #GsApp + * @origin_appstream: a string, or %NULL + * + * The appstream origin is the appstream source of the application e.g. "fedora" + * + * Since: 3.28 + **/ +void +gs_app_set_origin_appstream (GsApp *app, const gchar *origin_appstream) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* same */ + if (g_strcmp0 (origin_appstream, priv->origin_appstream) == 0) + return; + + g_free (priv->origin_appstream); + priv->origin_appstream = g_strdup (origin_appstream); +} + +/** + * gs_app_get_origin_hostname: + * @app: a #GsApp + * + * Gets the hostname of the origin used to install the application, e.g. + * "fedoraproject.org" or "sdk.gnome.org". + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_origin_hostname (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->origin_hostname; +} + +/** + * gs_app_set_origin_hostname: + * @app: a #GsApp + * @origin_hostname: a string, or %NULL + * + * The origin is the hostname of the source used to install the application + * e.g. "fedoraproject.org" + * + * You can also use a full URL as @origin_hostname and this will be parsed and + * the hostname extracted. This process will also remove any unnecessary DNS + * prefixes like "download" or "mirrors". + * + * Since: 3.22 + **/ +void +gs_app_set_origin_hostname (GsApp *app, const gchar *origin_hostname) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GUri) uri = NULL; + guint i; + const gchar *prefixes[] = { "download.", "mirrors.", NULL }; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* same */ + if (g_strcmp0 (origin_hostname, priv->origin_hostname) == 0) + return; + g_free (priv->origin_hostname); + + /* convert a URL */ + uri = g_uri_parse (origin_hostname, SOUP_HTTP_URI_FLAGS, NULL); + if (uri != NULL) + origin_hostname = g_uri_get_host (uri); + + /* remove some common prefixes */ + for (i = 0; prefixes[i] != NULL; i++) { + if (g_str_has_prefix (origin_hostname, prefixes[i])) + origin_hostname += strlen (prefixes[i]); + } + + /* fallback for localhost */ + if (g_strcmp0 (origin_hostname, "") == 0) + origin_hostname = "localhost"; + + /* success */ + priv->origin_hostname = g_strdup (origin_hostname); +} + +/** + * gs_app_add_screenshot: + * @app: a #GsApp + * @screenshot: a #AsScreenshot + * + * Adds a screenshot to the application. + * + * Since: 40 + **/ +void +gs_app_add_screenshot (GsApp *app, AsScreenshot *screenshot) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (AS_IS_SCREENSHOT (screenshot)); + + locker = g_mutex_locker_new (&priv->mutex); + g_ptr_array_add (priv->screenshots, g_object_ref (screenshot)); +} + +/** + * gs_app_get_screenshots: + * @app: a #GsApp + * + * Gets the list of screenshots. + * + * Returns: (element-type AsScreenshot) (transfer none): a list + * + * Since: 3.22 + **/ +GPtrArray * +gs_app_get_screenshots (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->screenshots; +} + +/** + * gs_app_get_update_version: + * @app: a #GsApp + * + * Gets the newest update version. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_update_version (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->update_version; +} + +/** + * gs_app_get_update_version_ui: + * @app: a #GsApp + * + * Gets the update version for the UI. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_update_version_ui (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + + /* work out the two version numbers */ + if (priv->update_version != NULL && + priv->update_version_ui == NULL) { + gs_app_ui_versions_populate (app); + } + + return priv->update_version_ui; +} + +static void +gs_app_set_update_version_internal (GsApp *app, const gchar *update_version) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + if (g_set_str (&priv->update_version, update_version)) + gs_app_ui_versions_invalidate (app); +} + +/** + * gs_app_set_update_version: + * @app: a #GsApp + * @update_version: a string, e.g. "0.1.2.3" + * + * Sets the new version number of the update. + * + * Since: 3.22 + **/ +void +gs_app_set_update_version (GsApp *app, const gchar *update_version) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + gs_app_set_update_version_internal (app, update_version); + gs_app_queue_notify (app, obj_props[PROP_VERSION]); +} + +/** + * gs_app_get_update_details_markup: + * @app: a #GsApp + * + * Gets the multi-line description for the update as a Pango markup. + * + * Returns: a string, or %NULL for unset + * + * Since: 42.0 + **/ +const gchar * +gs_app_get_update_details_markup (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->update_details_markup; +} + +/** + * gs_app_set_update_details_markup: + * @app: a #GsApp + * @markup: a Pango markup + * + * Sets the multi-line description for the update as markup. + * + * See: gs_app_set_update_details_text() + * + * Since: 42.0 + **/ +void +gs_app_set_update_details_markup (GsApp *app, + const gchar *markup) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + priv->update_details_set = TRUE; + g_set_str (&priv->update_details_markup, markup); +} + +/** + * gs_app_set_update_details_text: + * @app: a #GsApp + * @text: a text without Pango markup + * + * Sets the multi-line description for the update as text, + * escaping the @text to be safe for a Pango markup. + * + * See: gs_app_set_update_details_markup() + * + * Since: 42.0 + **/ +void +gs_app_set_update_details_text (GsApp *app, + const gchar *text) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + priv->update_details_set = TRUE; + if (text == NULL) { + g_set_str (&priv->update_details_markup, NULL); + } else { + gchar *markup = g_markup_escape_text (text, -1); + g_free (priv->update_details_markup); + priv->update_details_markup = markup; + } +} + +/** + * gs_app_get_update_details_set: + * @app: a #GsApp + * + * Returns whether update details for the @app had been set. It does + * not matter whether it was set to %NULL or an actual text. + * + * Returns: whether update details for the @app had been set + * + * Since: 45 + **/ +gboolean +gs_app_get_update_details_set (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), FALSE); + locker = g_mutex_locker_new (&priv->mutex); + return priv->update_details_set; +} + +/** + * gs_app_get_update_urgency: + * @app: a #GsApp + * + * Gets the update urgency. + * + * Returns: a #AsUrgencyKind, or %AS_URGENCY_KIND_UNKNOWN for unset + * + * Since: 40 + **/ +AsUrgencyKind +gs_app_get_update_urgency (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), AS_URGENCY_KIND_UNKNOWN); + return priv->update_urgency; +} + +/** + * gs_app_set_update_urgency: + * @app: a #GsApp + * @update_urgency: a #AsUrgencyKind + * + * Sets the update urgency. + * + * Since: 40 + **/ +void +gs_app_set_update_urgency (GsApp *app, AsUrgencyKind update_urgency) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + if (update_urgency == priv->update_urgency) + return; + priv->update_urgency = update_urgency; +} + +/** + * gs_app_dup_management_plugin: + * @app: a #GsApp + * + * Gets the management plugin. + * + * This is some metadata about the application which gives which plugin should + * handle the install, remove or upgrade actions. + * + * Returns: (nullable) (transfer full): the management plugin, or %NULL for unset + * + * Since: 42 + **/ +GsPlugin * +gs_app_dup_management_plugin (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return g_weak_ref_get (&priv->management_plugin_weak); +} + +/** + * gs_app_has_management_plugin: + * @app: a #GsApp + * @plugin: (nullable) (transfer none): a #GsPlugin to check against, or %NULL + * + * Check whether the management plugin for @app is set to @plugin. + * + * If @plugin is %NULL, %TRUE is returned only if the @app has no management + * plugin set. + * + * Returns: %TRUE if @plugin is the management plugin for @app, %FALSE otherwise + * Since: 42 + */ +gboolean +gs_app_has_management_plugin (GsApp *app, + GsPlugin *plugin) +{ + g_autoptr(GsPlugin) app_plugin = gs_app_dup_management_plugin (app); + return (app_plugin == plugin); +} + +/** + * gs_app_set_management_plugin: + * @app: a #GsApp + * @management_plugin: (nullable) (transfer none): a plugin, or %NULL + * + * The management plugin is the plugin that can handle doing install and remove + * operations on the #GsApp. + * + * It is an error to attempt to change the management plugin once it has been + * previously set or to try to use this function on a wildcard application. + * + * Since: 42 + **/ +void +gs_app_set_management_plugin (GsApp *app, + GsPlugin *management_plugin) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GsPlugin) old_plugin = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (management_plugin == NULL || GS_IS_PLUGIN (management_plugin)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* plugins cannot adopt wildcard packages */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) { + g_warning ("plugins should not set the management plugin on " + "%s to %s -- create a new GsApp in refine()!", + gs_app_get_unique_id_unlocked (app), + (management_plugin != NULL) ? gs_plugin_get_name (management_plugin) : "(null)"); + return; + } + + /* same */ + old_plugin = g_weak_ref_get (&priv->management_plugin_weak); + + if (old_plugin == management_plugin) + return; + + /* trying to change */ + if (old_plugin != NULL && management_plugin != NULL) { + g_warning ("automatically prevented from changing " + "management plugin on %s from %s to %s!", + gs_app_get_unique_id_unlocked (app), + gs_plugin_get_name (old_plugin), + gs_plugin_get_name (management_plugin)); + return; + } + + g_weak_ref_set (&priv->management_plugin_weak, management_plugin); +} + +/** + * gs_app_get_rating: + * @app: a #GsApp + * + * Gets the percentage rating of the application, where 100 is 5 stars. + * + * Returns: a percentage, or -1 for unset + * + * Since: 3.22 + **/ +gint +gs_app_get_rating (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), -1); + return priv->rating; +} + +/** + * gs_app_set_rating: + * @app: a #GsApp + * @rating: a percentage, or -1 for invalid + * + * Gets the percentage rating of the application. + * + * Since: 3.22 + **/ +void +gs_app_set_rating (GsApp *app, gint rating) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + if (rating == priv->rating) + return; + priv->rating = rating; + gs_app_queue_notify (app, obj_props[PROP_RATING]); +} + +/** + * gs_app_get_review_ratings: + * @app: a #GsApp + * + * Gets the review ratings. + * + * Returns: (element-type guint32) (transfer none): a list + * + * Since: 3.22 + **/ +GArray * +gs_app_get_review_ratings (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->review_ratings; +} + +/** + * gs_app_set_review_ratings: + * @app: a #GsApp + * @review_ratings: (element-type guint32): a list + * + * Sets the review ratings. + * + * Since: 3.22 + **/ +void +gs_app_set_review_ratings (GsApp *app, GArray *review_ratings) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + _g_set_array (&priv->review_ratings, review_ratings); +} + +/** + * gs_app_get_reviews: + * @app: a #GsApp + * + * Gets all the user-submitted reviews for the application. + * + * Returns: (element-type AsReview) (transfer none): the list of reviews + * + * Since: 3.22 + **/ +GPtrArray * +gs_app_get_reviews (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->reviews; +} + +/** + * gs_app_add_review: + * @app: a #GsApp + * @review: a #AsReview + * + * Adds a user-submitted review to the application. + * + * Since: 40 + **/ +void +gs_app_add_review (GsApp *app, AsReview *review) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (AS_IS_REVIEW (review)); + locker = g_mutex_locker_new (&priv->mutex); + g_ptr_array_add (priv->reviews, g_object_ref (review)); +} + +/** + * gs_app_remove_review: + * @app: a #GsApp + * @review: a #AsReview + * + * Removes a user-submitted review to the application. + * + * Since: 40 + **/ +void +gs_app_remove_review (GsApp *app, AsReview *review) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + g_ptr_array_remove (priv->reviews, review); +} + +/** + * gs_app_get_provided: + * @app: a #GsApp + * + * Gets all the provided item sets for the application. + * + * Returns: (element-type AsProvided) (transfer none): the list of provided items + * + * Since: 40 + **/ +GPtrArray* +gs_app_get_provided (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->provided; +} + +/** + * gs_app_get_provided_for_kind: + * @cpt: a #AsComponent instance. + * @kind: kind of the provided item, e.g. %AS_PROVIDED_KIND_MIMETYPE + * + * Get an #AsProvided object for the given interface type, or %NULL if + * none was found. + * + * Returns: (nullable) (transfer none): the #AsProvided + * + * Since: 40 + */ +AsProvided* +gs_app_get_provided_for_kind (GsApp *app, AsProvidedKind kind) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + + for (guint i = 0; i < priv->provided->len; i++) { + AsProvided *prov = AS_PROVIDED (g_ptr_array_index (priv->provided, i)); + if (as_provided_get_kind (prov) == kind) + return prov; + } + return NULL; +} + +/** + * gs_app_add_provided: + * @app: a #GsApp + * @kind: the kind of the provided item, e.g. %AS_PROVIDED_KIND_MEDIATYPE + * @item: the item to add. + * + * Adds a provided items of the given kind to the application. + * + * Since: 40 + **/ +void +gs_app_add_provided_item (GsApp *app, AsProvidedKind kind, const gchar *item) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + AsProvided *prov; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (item != NULL); + g_return_if_fail (kind != AS_PROVIDED_KIND_UNKNOWN && kind < AS_PROVIDED_KIND_LAST); + + locker = g_mutex_locker_new (&priv->mutex); + prov = gs_app_get_provided_for_kind (app, kind); + if (prov == NULL) { + prov = as_provided_new (); + as_provided_set_kind (prov, kind); + g_ptr_array_add (priv->provided, prov); + } else { + /* avoid duplicity */ + GPtrArray *items = as_provided_get_items (prov); + for (guint i = 0; i < items->len; i++) { + const gchar *value = g_ptr_array_index (items, i); + if (g_strcmp0 (value, item) == 0) + return; + } + } + as_provided_add_item (prov, item); +} + +/** + * gs_app_get_size_download: + * @app: A #GsApp + * @size_bytes_out: (optional) (out caller-allocates): return location for + * the download size, in bytes, or %NULL to ignore + * + * Get the values of #GsApp:size-download-type and #GsApp:size-download. + * + * If this returns %GS_SIZE_TYPE_VALID, @size_bytes_out (if non-%NULL) will be + * set to the download size. Otherwise, its value will be undefined. + * + * Returns: type of the download size + * Since: 43 + **/ +GsSizeType +gs_app_get_size_download (GsApp *app, + guint64 *size_bytes_out) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_val_if_fail (GS_IS_APP (app), GS_SIZE_TYPE_UNKNOWN); + + if (size_bytes_out != NULL) + *size_bytes_out = (priv->size_download_type == GS_SIZE_TYPE_VALID) ? priv->size_download : 0; + + return priv->size_download_type; +} + +/** + * gs_app_set_size_download: + * @app: a #GsApp + * @size_type: type of the download size + * @size_bytes: size in bytes + * + * Sets the download size of the application, not including any + * required runtime. + * + * @size_bytes will be ignored unless @size_type is %GS_SIZE_TYPE_VALID. + * + * Since: 43 + **/ +void +gs_app_set_size_download (GsApp *app, + GsSizeType size_type, + guint64 size_bytes) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_if_fail (GS_IS_APP (app)); + + if (size_type != GS_SIZE_TYPE_VALID) + size_bytes = 0; + + if (priv->size_download_type != size_type) { + priv->size_download_type = size_type; + gs_app_queue_notify (app, obj_props[PROP_SIZE_DOWNLOAD_TYPE]); + } + + if (priv->size_download != size_bytes) { + priv->size_download = size_bytes; + gs_app_queue_notify (app, obj_props[PROP_SIZE_DOWNLOAD]); + } +} + +/* Add two sizes, accounting for their validity, and checking for overflow. This + * is essentially `out_bytes = a_bytes + b_bytes` with additional checking. + * + * If either of @a_type or @b_type is %GS_SIZE_TYPE_UNKNOWN or + * %GS_SIZE_TYPE_UNKNOWABLE, that type will be propagated to @out_type. + * + * If the sum of @a_bytes and @b_bytes exceeds %G_MAXUINT64, the result in + * @out_bytes will silently be clamped to %G_MAXUINT64. + * + * The lifetime of @app must be at least as long as the lifetime of + * @covered_uids, which allows us to avoid some string copies. + */ +static gboolean +add_sizes (GsApp *app, + GHashTable *covered_uids, + GsSizeType a_type, + guint64 a_bytes, + GsSizeType b_type, + guint64 b_bytes, + GsSizeType *out_type, + guint64 *out_bytes) +{ + g_return_val_if_fail (out_type != NULL, FALSE); + g_return_val_if_fail (out_bytes != NULL, FALSE); + + if (app != NULL && covered_uids != NULL) { + const gchar *id = gs_app_get_unique_id (app); + if (id != NULL && + !g_hash_table_add (covered_uids, (gpointer) id)) + return TRUE; + } + + if (a_type == GS_SIZE_TYPE_VALID && b_type == GS_SIZE_TYPE_VALID) { + *out_type = GS_SIZE_TYPE_VALID; + if (!g_uint64_checked_add (out_bytes, a_bytes, b_bytes)) + *out_bytes = G_MAXUINT64; + return TRUE; + } + + *out_type = (a_type == GS_SIZE_TYPE_UNKNOWABLE || b_type == GS_SIZE_TYPE_UNKNOWABLE) ? GS_SIZE_TYPE_UNKNOWABLE : GS_SIZE_TYPE_UNKNOWN; + *out_bytes = 0; + + return FALSE; +} + +static GsSizeType +get_size_download_dependencies (GsApp *app, + guint64 *size_bytes_out, + GHashTable *covered_uids) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + GsSizeType size_type = GS_SIZE_TYPE_VALID; + guint64 size_bytes = 0; + + g_return_val_if_fail (GS_IS_APP (app), GS_SIZE_TYPE_UNKNOWN); + + /* add the runtime if this is not installed */ + if (priv->runtime != NULL && + gs_app_get_state (priv->runtime) == GS_APP_STATE_AVAILABLE) { + GsSizeType runtime_size_download_type, runtime_size_download_dependencies_type; + guint64 runtime_size_download_bytes, runtime_size_download_dependencies_bytes; + + runtime_size_download_type = gs_app_get_size_download (priv->runtime, &runtime_size_download_bytes); + + if (add_sizes (priv->runtime, covered_uids, + size_type, size_bytes, + runtime_size_download_type, runtime_size_download_bytes, + &size_type, &size_bytes)) { + runtime_size_download_dependencies_type = get_size_download_dependencies (priv->runtime, + &runtime_size_download_dependencies_bytes, + covered_uids); + + add_sizes (NULL, NULL, + size_type, size_bytes, + runtime_size_download_dependencies_type, runtime_size_download_dependencies_bytes, + &size_type, &size_bytes); + } + } + + /* add related apps */ + for (guint i = 0; i < gs_app_list_length (priv->related); i++) { + GsApp *app_related = gs_app_list_index (priv->related, i); + GsSizeType related_size_download_type, related_size_download_dependencies_type; + guint64 related_size_download_bytes, related_size_download_dependencies_bytes; + + related_size_download_type = gs_app_get_size_download (app_related, &related_size_download_bytes); + + if (!add_sizes (app_related, covered_uids, + size_type, size_bytes, + related_size_download_type, related_size_download_bytes, + &size_type, &size_bytes)) + break; + + related_size_download_dependencies_type = get_size_download_dependencies (app_related, + &related_size_download_dependencies_bytes, + covered_uids); + + if (!add_sizes (NULL, NULL, + size_type, size_bytes, + related_size_download_dependencies_type, related_size_download_dependencies_bytes, + &size_type, &size_bytes)) + break; + } + + if (size_bytes_out != NULL) + *size_bytes_out = (size_type == GS_SIZE_TYPE_VALID) ? size_bytes : 0; + + return size_type; +} + +/** + * gs_app_get_size_download_dependencies: + * @app: A #GsApp + * @size_bytes_out: (optional) (out caller-allocates): return location for + * the download size of dependencies, in bytes, or %NULL to ignore + * + * Get the value of #GsApp:size-download-dependencies-type and + * #GsApp:size-download-dependencies. + * + * If this returns %GS_SIZE_TYPE_VALID, @size_bytes_out (if non-%NULL) will be + * set to the download size of dependencies. Otherwise, its value will be + * undefined. + * + * Returns: type of the download size of dependencies + * Since: 43 + **/ +GsSizeType +gs_app_get_size_download_dependencies (GsApp *app, + guint64 *size_bytes_out) +{ + g_autoptr(GHashTable) covered_uids = NULL; + + g_return_val_if_fail (GS_IS_APP (app), GS_SIZE_TYPE_UNKNOWN); + + covered_uids = g_hash_table_new_full ((GHashFunc) as_utils_data_id_hash, (GEqualFunc) as_utils_data_id_equal, NULL, NULL); + + return get_size_download_dependencies (app, size_bytes_out, covered_uids); +} + +/** + * gs_app_get_size_installed: + * @app: a #GsApp + * @size_bytes_out: (optional) (out caller-allocates): return location for + * the installed size, in bytes, or %NULL to ignore + * + * Get the values of #GsApp:size-installed-type and #GsApp:size-installed. + * + * If this returns %GS_SIZE_TYPE_VALID, @size_bytes_out (if non-%NULL) will be + * set to the installed size. Otherwise, its value will be undefined. + * + * Returns: type of the installed size + * Since: 43 + **/ +GsSizeType +gs_app_get_size_installed (GsApp *app, + guint64 *size_bytes_out) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_val_if_fail (GS_IS_APP (app), GS_SIZE_TYPE_UNKNOWN); + + if (size_bytes_out != NULL) + *size_bytes_out = (priv->size_installed_type == GS_SIZE_TYPE_VALID) ? priv->size_installed : 0; + + return priv->size_installed_type; +} + +/** + * gs_app_set_size_installed: + * @app: a #GsApp + * @size_type: type of the installed size + * @size_bytes: size in bytes + * + * Sets the installed size of the application. + * + * @size_bytes will be ignored unless @size_type is %GS_SIZE_TYPE_VALID. + * + * Since: 43 + **/ +void +gs_app_set_size_installed (GsApp *app, + GsSizeType size_type, + guint64 size_bytes) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_if_fail (GS_IS_APP (app)); + + if (size_type != GS_SIZE_TYPE_VALID) + size_bytes = 0; + + if (priv->size_installed_type != size_type) { + priv->size_installed_type = size_type; + gs_app_queue_notify (app, obj_props[PROP_SIZE_INSTALLED_TYPE]); + } + + if (priv->size_installed != size_bytes) { + priv->size_installed = size_bytes; + gs_app_queue_notify (app, obj_props[PROP_SIZE_INSTALLED]); + } +} + +static GsSizeType +get_size_installed_dependencies (GsApp *app, + guint64 *size_bytes_out, + GHashTable *covered_uids) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + GsSizeType size_type = GS_SIZE_TYPE_VALID; + guint64 size_bytes = 0; + + g_return_val_if_fail (GS_IS_APP (app), GS_SIZE_TYPE_UNKNOWN); + + /* add related apps */ + for (guint i = 0; i < gs_app_list_length (priv->related); i++) { + GsApp *app_related = gs_app_list_index (priv->related, i); + GsSizeType related_size_installed_type, related_size_installed_dependencies_type; + guint64 related_size_installed_bytes, related_size_installed_dependencies_bytes; + + related_size_installed_type = gs_app_get_size_installed (app_related, &related_size_installed_bytes); + + if (!add_sizes (app_related, covered_uids, + size_type, size_bytes, + related_size_installed_type, related_size_installed_bytes, + &size_type, &size_bytes)) + break; + + related_size_installed_dependencies_type = get_size_installed_dependencies (app_related, + &related_size_installed_dependencies_bytes, + covered_uids); + + if (!add_sizes (NULL, NULL, + size_type, size_bytes, + related_size_installed_dependencies_type, related_size_installed_dependencies_bytes, + &size_type, &size_bytes)) + break; + } + + if (size_bytes_out != NULL) + *size_bytes_out = (size_type == GS_SIZE_TYPE_VALID) ? size_bytes : 0; + + return size_type; +} + +/** + * gs_app_get_size_installed_dependencies: + * @app: a #GsApp + * @size_bytes_out: (optional) (out caller-allocates): return location for + * the installed size of dependencies, in bytes, or %NULL to ignore + * + * Get the values of #GsApp:size-installed-dependencies-type and + * #GsApp:size-installed-dependencies. + * + * If this returns %GS_SIZE_TYPE_VALID, @size_bytes_out (if non-%NULL) will be + * set to the installed size of dependencies. Otherwise, its value will be + * undefined. + * + * Returns: type of the installed size of dependencies + * Since: 43 + **/ +GsSizeType +gs_app_get_size_installed_dependencies (GsApp *app, + guint64 *size_bytes_out) +{ + g_autoptr(GHashTable) covered_uids = NULL; + + g_return_val_if_fail (GS_IS_APP (app), GS_SIZE_TYPE_UNKNOWN); + + covered_uids = g_hash_table_new_full ((GHashFunc) as_utils_data_id_hash, (GEqualFunc) as_utils_data_id_equal, NULL, NULL); + + return get_size_installed_dependencies (app, size_bytes_out, covered_uids); +} + +/** + * gs_app_get_size_user_data: + * @app: A #GsApp + * @size_bytes_out: (optional) (out caller-allocates): return location for + * the user data size, in bytes, or %NULL to ignore + * + * Get the values of #GsApp:size-user-data-type and #GsApp:size-user-data. + * + * If this returns %GS_SIZE_TYPE_VALID, @size_bytes_out (if non-%NULL) will be + * set to the user data size. Otherwise, its value will be undefined. + * + * Returns: type of the user data size + * Since: 43 + **/ +GsSizeType +gs_app_get_size_user_data (GsApp *app, + guint64 *size_bytes_out) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_val_if_fail (GS_IS_APP (app), GS_SIZE_TYPE_UNKNOWN); + + if (size_bytes_out != NULL) + *size_bytes_out = (priv->size_user_data_type == GS_SIZE_TYPE_VALID) ? priv->size_user_data : 0; + + return priv->size_user_data_type; +} + +/** + * gs_app_set_size_user_data: + * @app: a #GsApp + * @size_type: type of the user data size + * @size_bytes: size in bytes + * + * Sets the user data size of the @app. + * + * @size_bytes will be ignored unless @size_type is %GS_SIZE_TYPE_VALID. + * + * Since: 43 + **/ +void +gs_app_set_size_user_data (GsApp *app, + GsSizeType size_type, + guint64 size_bytes) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_if_fail (GS_IS_APP (app)); + + if (size_type != GS_SIZE_TYPE_VALID) + size_bytes = 0; + + if (priv->size_user_data_type != size_type) { + priv->size_user_data_type = size_type; + gs_app_queue_notify (app, obj_props[PROP_SIZE_USER_DATA_TYPE]); + } + + if (priv->size_user_data != size_bytes) { + priv->size_user_data = size_bytes; + gs_app_queue_notify (app, obj_props[PROP_SIZE_USER_DATA]); + } +} + +/** + * gs_app_get_size_cache_data: + * @app: A #GsApp + * @size_bytes_out: (optional) (out caller-allocates): return location for + * the cache data size, in bytes, or %NULL to ignore + * + * Get the values of #GsApp:size-cache-data-type and #GsApp:size-cache-data. + * + * If this returns %GS_SIZE_TYPE_VALID, @size_bytes_out (if non-%NULL) will be + * set to the cache data size. Otherwise, its value will be undefined. + * + * Returns: type of the cache data size + * Since: 43 + **/ +GsSizeType +gs_app_get_size_cache_data (GsApp *app, + guint64 *size_bytes_out) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_val_if_fail (GS_IS_APP (app), GS_SIZE_TYPE_UNKNOWN); + + if (size_bytes_out != NULL) + *size_bytes_out = (priv->size_cache_data_type == GS_SIZE_TYPE_VALID) ? priv->size_cache_data : 0; + + return priv->size_cache_data_type; +} + +/** + * gs_app_set_size_cache_data: + * @app: a #GsApp + * @size_type: type of the cache data size + * @size_bytes: size in bytes + * + * Sets the cache data size of the @app. + * + * @size_bytes will be ignored unless @size_type is %GS_SIZE_TYPE_VALID. + * + * Since: 43 + **/ +void +gs_app_set_size_cache_data (GsApp *app, + GsSizeType size_type, + guint64 size_bytes) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_if_fail (GS_IS_APP (app)); + + if (size_type != GS_SIZE_TYPE_VALID) + size_bytes = 0; + + if (priv->size_cache_data_type != size_type) { + priv->size_cache_data_type = size_type; + gs_app_queue_notify (app, obj_props[PROP_SIZE_CACHE_DATA_TYPE]); + } + + if (priv->size_cache_data != size_bytes) { + priv->size_cache_data = size_bytes; + gs_app_queue_notify (app, obj_props[PROP_SIZE_CACHE_DATA]); + } +} + +/** + * gs_app_get_metadata_item: + * @app: a #GsApp + * @key: a string, e.g. "fwupd::device-id" + * + * Gets some metadata for the application. + * Is is expected that plugins namespace any plugin-specific metadata, + * for example `fwupd::device-id`. + * + * Returns: a string, or %NULL for unset + * + * Since: 3.22 + **/ +const gchar * +gs_app_get_metadata_item (GsApp *app, const gchar *key) +{ + GVariant *tmp; + g_return_val_if_fail (GS_IS_APP (app), NULL); + g_return_val_if_fail (key != NULL, NULL); + tmp = gs_app_get_metadata_variant (app, key); + if (tmp == NULL) + return NULL; + return g_variant_get_string (tmp, NULL); +} + +/** + * gs_app_set_metadata: + * @app: a #GsApp + * @key: a string, e.g. "fwupd::DeviceID" + * @value: a string, e.g. "fubar" + * + * Sets some metadata for the application. + * Is is expected that plugins namespace any plugin-specific metadata. + * + * Since: 3.22 + **/ +void +gs_app_set_metadata (GsApp *app, const gchar *key, const gchar *value) +{ + g_autoptr(GVariant) tmp = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (key != NULL); + if (value != NULL) + tmp = g_variant_new_string (value); + gs_app_set_metadata_variant (app, key, tmp); +} + +/** + * gs_app_get_metadata_variant: + * @app: a #GsApp + * @key: a string, e.g. "fwupd::device-id" + * + * Gets some metadata for the application. + * Is is expected that plugins namespace any plugin-specific metadata. + * + * Returns: (transfer none) (nullable): a variant, or %NULL for unset + * + * Since: 3.26 + **/ +GVariant * +gs_app_get_metadata_variant (GsApp *app, const gchar *key) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + g_return_val_if_fail (key != NULL, NULL); + return g_hash_table_lookup (priv->metadata, key); +} + +/** + * gs_app_set_metadata_variant: + * @app: a #GsApp + * @key: a string, e.g. "fwupd::DeviceID" + * @value: a #GVariant + * + * Sets some metadata for the application. + * Is is expected that plugins namespace any plugin-specific metadata, + * for example `fwupd::device-id`. + * + * Since: 3.26 + **/ +void +gs_app_set_metadata_variant (GsApp *app, const gchar *key, GVariant *value) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + GVariant *found; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* if no value, then remove the key */ + if (value == NULL) { + g_hash_table_remove (priv->metadata, key); + return; + } + + /* check we're not overwriting */ + found = g_hash_table_lookup (priv->metadata, key); + if (found != NULL) { + if (g_variant_equal (found, value)) + return; + if (g_variant_type_equal (g_variant_get_type (value), G_VARIANT_TYPE_STRING) && + g_variant_type_equal (g_variant_get_type (found), G_VARIANT_TYPE_STRING)) { + g_debug ("tried overwriting %s key %s from %s to %s", + priv->id, key, + g_variant_get_string (found, NULL), + g_variant_get_string (value, NULL)); + } else { + g_debug ("tried overwriting %s key %s (%s->%s)", + priv->id, key, + g_variant_get_type_string (found), + g_variant_get_type_string (value)); + } + return; + } + g_hash_table_insert (priv->metadata, g_strdup (key), g_variant_ref (value)); +} + +/** + * gs_app_dup_addons: + * @app: a #GsApp + * + * Gets the list of addons for the application. + * + * Returns: (transfer full) (nullable): a list of addons, or %NULL if there are none + * + * Since: 43 + */ +GsAppList * +gs_app_dup_addons (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + locker = g_mutex_locker_new (&priv->mutex); + return (priv->addons != NULL) ? g_object_ref (priv->addons) : NULL; +} + +/** + * gs_app_add_addons: + * @app: a #GsApp + * @addons: (transfer none) (not nullable): a list of #GsApps + * + * Adds zero or more addons to the list of application addons. + * + * Since: 43 + **/ +void +gs_app_add_addons (GsApp *app, + GsAppList *addons) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GsAppList) new_addons = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (GS_IS_APP_LIST (addons)); + + if (gs_app_list_length (addons) == 0) + return; + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->addons != NULL) + new_addons = gs_app_list_copy (priv->addons); + else + new_addons = gs_app_list_new (); + gs_app_list_add_list (new_addons, addons); + + g_set_object (&priv->addons, new_addons); +} + +/** + * gs_app_remove_addon: + * @app: a #GsApp + * @addon: a #GsApp + * + * Removes an addon from the list of application addons. + * + * Since: 3.22 + **/ +void +gs_app_remove_addon (GsApp *app, GsApp *addon) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (GS_IS_APP (addon)); + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->addons != NULL) + gs_app_list_remove (priv->addons, addon); +} + +/** + * gs_app_get_related: + * @app: a #GsApp + * + * Gets any related applications. + * + * Returns: (transfer none): a list of applications + * + * Since: 3.22 + **/ +GsAppList * +gs_app_get_related (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->related; +} + +/** + * gs_app_add_related: + * @app: a #GsApp + * @app2: a #GsApp + * + * Adds a related application. + * + * Since: 3.22 + **/ +void +gs_app_add_related (GsApp *app, GsApp *app2) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + GsAppPrivate *priv2 = gs_app_get_instance_private (app2); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (GS_IS_APP (app2)); + + locker = g_mutex_locker_new (&priv->mutex); + + /* if the app is updatable-live and any related app is not then + * degrade to the offline state */ + if (priv->state == GS_APP_STATE_UPDATABLE_LIVE && + priv2->state == GS_APP_STATE_UPDATABLE) + priv->state = priv2->state; + + gs_app_list_add (priv->related, app2); + + /* The related apps add to the main app’s sizes. */ + gs_app_queue_notify (app, obj_props[PROP_SIZE_DOWNLOAD_DEPENDENCIES_TYPE]); + gs_app_queue_notify (app, obj_props[PROP_SIZE_DOWNLOAD_DEPENDENCIES]); + gs_app_queue_notify (app, obj_props[PROP_SIZE_INSTALLED_DEPENDENCIES_TYPE]); + gs_app_queue_notify (app, obj_props[PROP_SIZE_INSTALLED_DEPENDENCIES]); +} + +/** + * gs_app_get_history: + * @app: a #GsApp + * + * Gets the history of this application. + * + * Returns: (transfer none): a list + * + * Since: 3.22 + **/ +GsAppList * +gs_app_get_history (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->history; +} + +/** + * gs_app_add_history: + * @app: a #GsApp + * @app2: a #GsApp + * + * Adds a history item for this package. + * + * Since: 3.22 + **/ +void +gs_app_add_history (GsApp *app, GsApp *app2) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (GS_IS_APP (app2)); + locker = g_mutex_locker_new (&priv->mutex); + gs_app_list_add (priv->history, app2); +} + +/** + * gs_app_get_install_date: + * @app: a #GsApp + * + * Gets the date that an application was installed. + * + * Returns: A UNIX epoch, or 0 for unset + * + * Since: 3.22 + **/ +guint64 +gs_app_get_install_date (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), 0); + return priv->install_date; +} + +/** + * gs_app_set_install_date: + * @app: a #GsApp + * @install_date: an epoch, or %GS_APP_INSTALL_DATE_UNKNOWN + * + * Sets the date that an application was installed. + * + * Since: 3.22 + **/ +void +gs_app_set_install_date (GsApp *app, guint64 install_date) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + if (install_date == priv->install_date) + return; + priv->install_date = install_date; +} + +/** + * gs_app_get_release_date: + * @app: a #GsApp + * + * Gets the date that an application was released. + * + * Returns: A UNIX epoch, or 0 for unset + * + * Since: 3.40 + **/ +guint64 +gs_app_get_release_date (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), 0); + return priv->release_date; +} + +/** + * gs_app_set_release_date: + * @app: a #GsApp + * @release_date: an epoch, or 0 + * + * Sets the date that an application was released. + * + * Since: 3.40 + **/ +void +gs_app_set_release_date (GsApp *app, guint64 release_date) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + if (release_date == priv->release_date) + return; + priv->release_date = release_date; + + gs_app_queue_notify (app, obj_props[PROP_RELEASE_DATE]); +} + +/** + * gs_app_is_installed: + * @app: a #GsApp + * + * Gets whether the app is installed or not. + * + * Returns: %TRUE if the app is installed, %FALSE otherwise. + * + * Since: 3.22 + **/ +gboolean +gs_app_is_installed (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + return (priv->state == GS_APP_STATE_INSTALLED) || + (priv->state == GS_APP_STATE_UPDATABLE) || + (priv->state == GS_APP_STATE_UPDATABLE_LIVE) || + (priv->state == GS_APP_STATE_REMOVING); +} + +/** + * gs_app_is_updatable: + * @app: a #GsApp + * + * Gets whether the app is updatable or not. + * + * Returns: %TRUE if the app is updatable, %FALSE otherwise. + * + * Since: 3.22 + **/ +gboolean +gs_app_is_updatable (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + if (priv->kind == AS_COMPONENT_KIND_OPERATING_SYSTEM) + return TRUE; + return (priv->state == GS_APP_STATE_UPDATABLE) || + (priv->state == GS_APP_STATE_UPDATABLE_LIVE); +} + +/** + * gs_app_get_categories: + * @app: a #GsApp + * + * Gets the list of categories for an application. + * + * Returns: (element-type utf8) (transfer none): a list + * + * Since: 3.22 + **/ +GPtrArray * +gs_app_get_categories (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + return priv->categories; +} + +/** + * gs_app_has_category: + * @app: a #GsApp + * @category: a category ID, e.g. "AudioVideo" + * + * Checks if the application is in a specific category. + * + * Returns: %TRUE for success + * + * Since: 3.22 + **/ +gboolean +gs_app_has_category (GsApp *app, const gchar *category) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + const gchar *tmp; + guint i; + + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + /* find the category */ + for (i = 0; i < priv->categories->len; i++) { + tmp = g_ptr_array_index (priv->categories, i); + if (g_strcmp0 (tmp, category) == 0) + return TRUE; + } + return FALSE; +} + +/** + * gs_app_set_categories: + * @app: a #GsApp + * @categories: a set of categories + * + * Set the list of categories for an application. + * + * Since: 3.22 + **/ +void +gs_app_set_categories (GsApp *app, GPtrArray *categories) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (categories != NULL); + locker = g_mutex_locker_new (&priv->mutex); + _g_set_ptr_array (&priv->categories, categories); +} + +/** + * gs_app_add_category: + * @app: a #GsApp + * @category: a category ID, e.g. "AudioVideo" + * + * Adds a category ID to an application. + * + * Since: 3.22 + **/ +void +gs_app_add_category (GsApp *app, const gchar *category) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (category != NULL); + locker = g_mutex_locker_new (&priv->mutex); + if (gs_app_has_category (app, category)) + return; + g_ptr_array_add (priv->categories, g_strdup (category)); +} + +/** + * gs_app_remove_category: + * @app: a #GsApp + * @category: a category ID, e.g. "AudioVideo" + * + * Removes an category ID from an application, it exists. + * + * Returns: %TRUE for success + * + * Since: 3.24 + **/ +gboolean +gs_app_remove_category (GsApp *app, const gchar *category) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + const gchar *tmp; + guint i; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + locker = g_mutex_locker_new (&priv->mutex); + + for (i = 0; i < priv->categories->len; i++) { + tmp = g_ptr_array_index (priv->categories, i); + if (g_strcmp0 (tmp, category) != 0) + continue; + g_ptr_array_remove_index_fast (priv->categories, i); + return TRUE; + } + return FALSE; +} + +/** + * gs_app_set_is_update_downloaded: + * @app: a #GsApp + * @is_update_downloaded: Whether a new update is already downloaded locally + * + * Sets if the new update is already downloaded for the app. + * + * Since: 3.36 + * Deprecated: 44: No longer supported. + **/ +void +gs_app_set_is_update_downloaded (GsApp *app, gboolean is_update_downloaded) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + priv->is_update_downloaded = is_update_downloaded; +} + +/** + * gs_app_get_is_update_downloaded: + * @app: a #GsApp + * + * Gets if the new update is already downloaded for the app and + * is locally available. + * + * Returns: (element-type gboolean): Whether a new update for the #GsApp is already downloaded. + * + * Since: 3.36 + * Deprecated: 44: No longer supported. + **/ +gboolean +gs_app_get_is_update_downloaded (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + return priv->is_update_downloaded; +} + +static void +calculate_key_colors (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GIcon) icon_small = NULL; + g_autoptr(GdkPixbuf) pb_small = NULL; + const gchar *overrides_str; + + /* Lazily create the array */ + if (priv->key_colors == NULL) + priv->key_colors = g_array_new (FALSE, FALSE, sizeof (GdkRGBA)); + priv->user_key_colors = FALSE; + + /* Look for an override first. Parse and use it if possible. This is + * typically specified in the appdata for an app as: + * |[ + * + * + * [(124, 53, 77), (99, 16, 0)] + * + * + * ]| + * + * Note it's ignored when the appstream data defines `` colors. + */ + overrides_str = gs_app_get_metadata_item (app, "GnomeSoftware::key-colors"); + if (overrides_str != NULL) { + g_autoptr(GVariant) overrides = NULL; + g_autoptr(GError) local_error = NULL; + + overrides = g_variant_parse (G_VARIANT_TYPE ("a(yyy)"), + overrides_str, + NULL, + NULL, + &local_error); + + if (overrides != NULL && g_variant_n_children (overrides) > 0) { + GVariantIter iter; + guint8 red, green, blue; + + g_variant_iter_init (&iter, overrides); + while (g_variant_iter_loop (&iter, "(yyy)", &red, &green, &blue)) { + GdkRGBA rgba; + rgba.red = (gdouble) red / 255.0; + rgba.green = (gdouble) green / 255.0; + rgba.blue = (gdouble) blue / 255.0; + rgba.alpha = 1.0; + g_array_append_val (priv->key_colors, rgba); + } + + priv->user_key_colors = TRUE; + + return; + } else { + g_warning ("Invalid value for GnomeSoftware::key-colors for %s: %s", + gs_app_get_id (app), local_error->message); + /* fall through */ + } + } + + /* Try and load the pixbuf. */ + icon_small = gs_app_get_icon_for_size (app, 32, 1, NULL); + + if (icon_small == NULL) { + g_debug ("no pixbuf, so no key colors"); + return; + } else if (G_IS_LOADABLE_ICON (icon_small)) { + g_autoptr(GInputStream) icon_stream = g_loadable_icon_load (G_LOADABLE_ICON (icon_small), 32, NULL, NULL, NULL); + if (icon_stream) + pb_small = gdk_pixbuf_new_from_stream_at_scale (icon_stream, 32, 32, TRUE, NULL, NULL); + } else if (G_IS_THEMED_ICON (icon_small)) { + g_autoptr(GtkIconPaintable) icon_paintable = NULL; + g_autoptr(GtkIconTheme) theme = get_icon_theme (); + + icon_paintable = gtk_icon_theme_lookup_by_gicon (theme, icon_small, + 32, 1, + gtk_get_locale_direction (), + 0); + if (icon_paintable != NULL) { + g_autoptr(GFile) file = NULL; + g_autofree gchar *path = NULL; + + file = gtk_icon_paintable_get_file (icon_paintable); + if (file != NULL) + path = g_file_get_path (file); + + if (path != NULL) { + pb_small = gdk_pixbuf_new_from_file_at_size (path, 32, 32, NULL); + } else { + const gchar *const *names = g_themed_icon_get_names (G_THEMED_ICON (icon_small)); + for (guint i = 0; names != NULL && names[i] != NULL && pb_small == NULL; i++) { + g_autoptr(GError) local_error = NULL; + g_autofree gchar *resource_path = NULL; + resource_path = g_strconcat ("/org/gnome/Software/icons/scalable/apps/", names[i], ".svg", NULL); + pb_small = gdk_pixbuf_new_from_resource (resource_path, &local_error); + if (pb_small == NULL) + g_warning ("Failed to load icon from resource '%s': %s", resource_path, local_error != NULL ? local_error->message : "Unknown error"); + } + } + } + + } else { + g_debug ("unsupported pixbuf, so no key colors"); + return; + } + + if (pb_small == NULL) { + g_debug ("pixbuf couldn’t be loaded, so no key colors"); + return; + } + + /* get a list of key colors */ + g_clear_pointer (&priv->key_colors, g_array_unref); + priv->key_colors = gs_calculate_key_colors (pb_small); +} + +/** + * gs_app_get_key_colors: + * @app: a #GsApp + * + * Gets the key colors used in the application icon. + * + * Returns: (element-type GdkRGBA) (transfer none): a list + * + * Since: 40 + **/ +GArray * +gs_app_get_key_colors (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), NULL); + + if (priv->key_colors == NULL) + calculate_key_colors (app); + + return priv->key_colors; +} + +/** + * gs_app_set_key_colors: + * @app: a #GsApp + * @key_colors: (element-type GdkRGBA): a set of key colors + * + * Sets the key colors used in the application icon. + * + * Since: 40 + **/ +void +gs_app_set_key_colors (GsApp *app, GArray *key_colors) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (key_colors != NULL); + locker = g_mutex_locker_new (&priv->mutex); + priv->user_key_colors = FALSE; + if (_g_set_array (&priv->key_colors, key_colors)) + gs_app_queue_notify (app, obj_props[PROP_KEY_COLORS]); +} + +/** + * gs_app_add_key_color: + * @app: a #GsApp + * @key_color: a #GdkRGBA + * + * Adds a key color used in the application icon. + * + * Since: 3.22 + **/ +void +gs_app_add_key_color (GsApp *app, GdkRGBA *key_color) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (key_color != NULL); + + /* Lazily create the array */ + if (priv->key_colors == NULL) + priv->key_colors = g_array_new (FALSE, FALSE, sizeof (GdkRGBA)); + + priv->user_key_colors = FALSE; + g_array_append_val (priv->key_colors, *key_color); + gs_app_queue_notify (app, obj_props[PROP_KEY_COLORS]); +} + +/** + * gs_app_get_user_key_colors: + * @app: a #GsApp + * + * Returns whether the key colors provided by gs_app_get_key_colors() + * are set by the user (using `GnomeSoftware::key-colors`). %FALSE + * means the colors have been calculated from the @app icon. + * + * Returns: whether the key colors have been provided by the user. + * + * Since: 42 + **/ +gboolean +gs_app_get_user_key_colors (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + return priv->user_key_colors; +} + +/** + * gs_app_set_key_color_for_color_scheme: + * @app: a #GsApp + * @for_color_scheme: for which #GsColorScheme + * @rgba: (nullable): a #GdkRGBA to use, or %NULL to unset + * + * Sets preferred app color (key color) for the specified color scheme. + * When the @for_color_scheme is %GS_COLOR_SCHEME_ANY, then covers both + * color schemes, unless they've been previously set. + * + * Use %NULL @rgba to unset the color. + * + * Since: 47 + **/ +void +gs_app_set_key_color_for_color_scheme (GsApp *app, + GsColorScheme for_color_scheme, + const GdkRGBA *rgba) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + switch (for_color_scheme) { + case GS_COLOR_SCHEME_ANY: + if (rgba != NULL) { + if (!priv->key_color_for_light_set) { + priv->key_color_for_light = *rgba; + priv->key_color_for_light_set = TRUE; + } + if (!priv->key_color_for_dark_set) { + priv->key_color_for_dark = *rgba; + priv->key_color_for_dark_set = TRUE; + } + } else { + priv->key_color_for_light_set = FALSE; + priv->key_color_for_dark_set = FALSE; + } + break; + case GS_COLOR_SCHEME_LIGHT: + if (rgba != NULL) { + priv->key_color_for_light = *rgba; + priv->key_color_for_light_set = TRUE; + } else { + priv->key_color_for_light_set = FALSE; + } + break; + case GS_COLOR_SCHEME_DARK: + if (rgba != NULL) { + priv->key_color_for_dark = *rgba; + priv->key_color_for_dark_set = TRUE; + } else { + priv->key_color_for_dark_set = FALSE; + } + break; + default: + g_assert_not_reached (); + } +} + +/** + * gs_app_get_key_color_for_color_scheme: + * @app: a #GsApp + * @for_color_scheme: for which #GsColorScheme + * @out_rgba: (out caller-allocates): a #GdkRGBA to store the value in + * + * Gets preferred app color (key color) previously set by + * the gs_app_set_key_color_for_color_scheme(). + * + * When the @for_color_scheme is %GS_COLOR_SCHEME_ANY, then returns whichever + * color scheme's color is set, in no particular order. + * + * The @out_rgba is left untouched when no color for the @for_color_scheme + * had been set and returns %FALSE. + * + * Returns: %TRUE, when the color for the @for_color_scheme had been previously set + * and the @out_rgba had been populated, %FALSE otherwise + * + * Since: 47 + **/ +gboolean +gs_app_get_key_color_for_color_scheme (GsApp *app, + GsColorScheme for_color_scheme, + GdkRGBA *out_rgba) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + switch (for_color_scheme) { + case GS_COLOR_SCHEME_ANY: + if (priv->key_color_for_light_set) { + *out_rgba = priv->key_color_for_light; + return TRUE; + } + if (priv->key_color_for_dark_set) { + *out_rgba = priv->key_color_for_dark; + return TRUE; + } + break; + case GS_COLOR_SCHEME_LIGHT: + if (priv->key_color_for_light_set) { + *out_rgba = priv->key_color_for_light; + return TRUE; + } + break; + case GS_COLOR_SCHEME_DARK: + if (priv->key_color_for_dark_set) { + *out_rgba = priv->key_color_for_dark; + return TRUE; + } + break; + default: + g_assert_not_reached (); + } + + return FALSE; +} + +/** + * gs_app_add_kudo: + * @app: a #GsApp + * @kudo: a #GsAppKudo, e.g. %GS_APP_KUDO_MY_LANGUAGE + * + * Adds a kudo to the application. + * + * Since: 3.22 + **/ +void +gs_app_add_kudo (GsApp *app, GsAppKudo kudo) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + if (kudo & GS_APP_KUDO_SANDBOXED_SECURE) + kudo |= GS_APP_KUDO_SANDBOXED; + priv->kudos |= kudo; +} + +/** + * gs_app_remove_kudo: + * @app: a #GsApp + * @kudo: a #GsAppKudo, e.g. %GS_APP_KUDO_MY_LANGUAGE + * + * Removes a kudo from the application. + * + * Since: 3.30 + **/ +void +gs_app_remove_kudo (GsApp *app, GsAppKudo kudo) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + priv->kudos &= ~kudo; +} + +/** + * gs_app_has_kudo: + * @app: a #GsApp + * @kudo: a #GsAppKudo, e.g. %GS_APP_KUDO_MY_LANGUAGE + * + * Finds out if a kudo has been awarded by the application. + * + * Returns: %TRUE if the app has the specified kudo + * + * Since: 3.22 + **/ +gboolean +gs_app_has_kudo (GsApp *app, GsAppKudo kudo) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + return (priv->kudos & kudo) > 0; +} + +/** + * gs_app_get_kudos: + * @app: a #GsApp + * + * Gets all the kudos the application has been awarded. + * + * Returns: the kudos, as a bitfield + * + * Since: 3.22 + **/ +guint64 +gs_app_get_kudos (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), 0); + return priv->kudos; +} + +/** + * gs_app_get_kudos_percentage: + * @app: a #GsApp + * + * Gets the kudos, as a percentage value. + * + * Returns: a percentage, with 0 for no kudos and a maximum of 100. + * + * Since: 3.22 + **/ +guint +gs_app_get_kudos_percentage (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + guint percentage = 0; + + g_return_val_if_fail (GS_IS_APP (app), 0); + + if ((priv->kudos & GS_APP_KUDO_MY_LANGUAGE) > 0) + percentage += 20; + if ((priv->kudos & GS_APP_KUDO_RECENT_RELEASE) > 0) + percentage += 20; + if ((priv->kudos & GS_APP_KUDO_FEATURED_RECOMMENDED) > 0) + percentage += 20; + if ((priv->kudos & GS_APP_KUDO_HAS_KEYWORDS) > 0) + percentage += 5; + if ((priv->kudos & GS_APP_KUDO_HAS_SCREENSHOTS) > 0) + percentage += 20; + if ((priv->kudos & GS_APP_KUDO_HI_DPI_ICON) > 0) + percentage += 20; + if ((priv->kudos & GS_APP_KUDO_SANDBOXED) > 0) + percentage += 20; + if ((priv->kudos & GS_APP_KUDO_SANDBOXED_SECURE) > 0) + percentage += 20; + + return MIN (percentage, 100); +} + +/** + * gs_app_get_to_be_installed: + * @app: a #GsApp + * + * Gets if the application is queued for installation. + * + * This is only set for addons when the user has selected some addons to be + * installed before installing the main application. + * Plugins should check all the addons for this property when installing + * main applications so that the chosen set of addons is also installed at the + * same time. This is never set when applications do not have addons. + * + * Returns: %TRUE for success + * + * Since: 3.22 + **/ +gboolean +gs_app_get_to_be_installed (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + return priv->to_be_installed; +} + +/** + * gs_app_set_to_be_installed: + * @app: a #GsApp + * @to_be_installed: if the app is due to be installed + * + * Sets if the application is queued for installation. + * + * Since: 3.22 + **/ +void +gs_app_set_to_be_installed (GsApp *app, gboolean to_be_installed) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + + priv->to_be_installed = to_be_installed; +} + +/** + * gs_app_has_quirk: + * @app: a #GsApp + * @quirk: a #GsAppQuirk, e.g. %GS_APP_QUIRK_COMPULSORY + * + * Finds out if an application has a specific quirk. + * + * Returns: %TRUE for success + * + * Since: 3.22 + **/ +gboolean +gs_app_has_quirk (GsApp *app, GsAppQuirk quirk) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + return (priv->quirk & quirk) > 0; +} + +/** + * gs_app_add_quirk: + * @app: a #GsApp + * @quirk: a #GsAppQuirk, e.g. %GS_APP_QUIRK_COMPULSORY + * + * Adds a quirk to an application. + * + * Since: 3.22 + **/ +void +gs_app_add_quirk (GsApp *app, GsAppQuirk quirk) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + /* same */ + if ((priv->quirk & quirk) > 0) + return; + + locker = g_mutex_locker_new (&priv->mutex); + priv->quirk |= quirk; + gs_app_queue_notify (app, obj_props[PROP_QUIRK]); +} + +/** + * gs_app_remove_quirk: + * @app: a #GsApp + * @quirk: a #GsAppQuirk, e.g. %GS_APP_QUIRK_COMPULSORY + * + * Removes a quirk from an application. + * + * Since: 3.22 + **/ +void +gs_app_remove_quirk (GsApp *app, GsAppQuirk quirk) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + /* same */ + if ((priv->quirk & quirk) == 0) + return; + + locker = g_mutex_locker_new (&priv->mutex); + priv->quirk &= ~quirk; + gs_app_queue_notify (app, obj_props[PROP_QUIRK]); +} + +/** + * gs_app_set_match_value: + * @app: a #GsApp + * @match_value: a value + * + * Set a match quality value, where higher values correspond to a + * "better" search match, and should be shown above lower results. + * + * Since: 3.22 + **/ +void +gs_app_set_match_value (GsApp *app, guint match_value) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + priv->match_value = match_value; +} + +/** + * gs_app_get_match_value: + * @app: a #GsApp + * + * Get a match quality value, where higher values correspond to a + * "better" search match, and should be shown above lower results. + * + * Note: This value is only valid when processing the result set + * and may be overwritten on subsequent searches if the plugin is using + * a cache. + * + * Returns: a value, where higher is better + * + * Since: 3.22 + **/ +guint +gs_app_get_match_value (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), 0); + return priv->match_value; +} + +/** + * gs_app_set_priority: + * @app: a #GsApp + * @priority: a value + * + * Set a priority value. + * + * Since: 3.22 + **/ +void +gs_app_set_priority (GsApp *app, guint priority) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_if_fail (GS_IS_APP (app)); + priv->priority = priority; +} + +/** + * gs_app_get_priority: + * @app: a #GsApp + * + * Get a priority value, where higher values will be chosen where + * multiple #GsApp's match a specific rule. + * + * Returns: a value, where higher is better + * + * Since: 3.22 + **/ +guint +gs_app_get_priority (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), 0); + + /* If the priority hasn’t been explicitly set, fetch it from the app’s + * management plugin. */ + if (priv->priority == 0) { + g_autoptr(GsPlugin) plugin = gs_app_dup_management_plugin (app); + if (plugin != NULL) + priv->priority = gs_plugin_get_priority (plugin); + } + + return priv->priority; +} + +/** + * gs_app_get_cancellable: + * @app: a #GsApp + * + * Get a cancellable to be used with operations related to the #GsApp. This is a + * way for views to be able to cancel an on-going operation. If the #GCancellable + * is canceled, it will be unreferenced and renewed before returning it, i.e. the + * cancellable object will always be ready to use for new operations. So be sure + * to keep a reference to it if you do more than just passing the cancellable to + * a process. + * + * Returns: a #GCancellable + * + * Since: 3.28 + **/ +GCancellable * +gs_app_get_cancellable (GsApp *app) +{ + g_autoptr(GCancellable) cancellable = NULL; + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->cancellable == NULL || g_cancellable_is_cancelled (priv->cancellable)) { + cancellable = g_cancellable_new (); + g_set_object (&priv->cancellable, cancellable); + } + return priv->cancellable; +} + +/** + * gs_app_peek_cancellable: + * @app: a #GsApp + * + * Peek the current cancellable used by the @app. It's referenced for thread safety; + * if not %NULL, free it with g_object_unref() when no longer needed. + * + * Returns: (nullable) (transfer full): the current cancellable, or %NULL + * + * Since: 44 + **/ +GCancellable * +gs_app_peek_cancellable (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + locker = g_mutex_locker_new (&priv->mutex); + if (priv->cancellable) + return g_object_ref (priv->cancellable); + + return NULL; +} + +/** + * gs_app_get_pending_action: + * @app: a #GsApp + * + * Get the pending action for this #GsApp, or %NULL if no action is pending. + * + * Returns: the #GsAppAction of the @app. + **/ +GsPluginAction +gs_app_get_pending_action (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), GS_PLUGIN_ACTION_UNKNOWN); + locker = g_mutex_locker_new (&priv->mutex); + return priv->pending_action; +} + +/** + * gs_app_set_pending_action: + * @app: a #GsApp + * @action: a #GsPluginAction + * + * Set an action that is pending on this #GsApp. + **/ +void +gs_app_set_pending_action (GsApp *app, + GsPluginAction action) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + locker = g_mutex_locker_new (&priv->mutex); + gs_app_set_pending_action_internal (app, action); +} + +static void +gs_app_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsApp *app = GS_APP (object); + GsAppPrivate *priv = gs_app_get_instance_private (app); + + switch ((GsAppProperty) prop_id) { + case PROP_ID: + g_value_set_string (value, priv->id); + break; + case PROP_NAME: + g_value_set_string (value, priv->name); + break; + case PROP_VERSION: + g_value_set_string (value, priv->version); + break; + case PROP_SUMMARY: + g_value_set_string (value, priv->summary); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, priv->description); + break; + case PROP_RATING: + g_value_set_int (value, priv->rating); + break; + case PROP_KIND: + g_value_set_uint (value, priv->kind); + break; + case PROP_SPECIAL_KIND: + g_value_set_enum (value, priv->special_kind); + break; + case PROP_STATE: + g_value_set_enum (value, priv->state); + break; + case PROP_PROGRESS: + g_value_set_uint (value, priv->progress); + break; + case PROP_CAN_CANCEL_INSTALLATION: + g_value_set_boolean (value, priv->allow_cancel); + break; + case PROP_INSTALL_DATE: + g_value_set_uint64 (value, priv->install_date); + break; + case PROP_RELEASE_DATE: + g_value_set_uint64 (value, priv->release_date); + break; + case PROP_QUIRK: + g_value_set_flags (value, priv->quirk); + break; + case PROP_PENDING_ACTION: + g_value_set_enum (value, priv->pending_action); + break; + case PROP_KEY_COLORS: + g_value_set_boxed (value, gs_app_get_key_colors (app)); + break; + case PROP_IS_UPDATE_DOWNLOADED: + g_value_set_boolean (value, priv->is_update_downloaded); + break; + case PROP_URLS: + g_value_set_boxed (value, priv->urls); + break; + case PROP_URL_MISSING: + g_value_set_string (value, priv->url_missing); + break; + case PROP_CONTENT_RATING: + g_value_set_object (value, priv->content_rating); + break; + case PROP_LICENSE: + g_value_set_string (value, priv->license); + break; + case PROP_SIZE_CACHE_DATA_TYPE: + g_value_set_enum (value, gs_app_get_size_cache_data (app, NULL)); + break; + case PROP_SIZE_CACHE_DATA: { + guint64 size_bytes; + gs_app_get_size_cache_data (app, &size_bytes); + g_value_set_uint64 (value, size_bytes); + break; + } + case PROP_SIZE_DOWNLOAD_TYPE: + g_value_set_enum (value, gs_app_get_size_download (app, NULL)); + break; + case PROP_SIZE_DOWNLOAD: { + guint64 size_bytes; + gs_app_get_size_download (app, &size_bytes); + g_value_set_uint64 (value, size_bytes); + break; + } + case PROP_SIZE_DOWNLOAD_DEPENDENCIES_TYPE: + g_value_set_enum (value, gs_app_get_size_download_dependencies (app, NULL)); + break; + case PROP_SIZE_DOWNLOAD_DEPENDENCIES: { + guint64 size_bytes; + gs_app_get_size_download_dependencies (app, &size_bytes); + g_value_set_uint64 (value, size_bytes); + break; + } + case PROP_SIZE_INSTALLED_TYPE: + g_value_set_enum (value, gs_app_get_size_installed (app, NULL)); + break; + case PROP_SIZE_INSTALLED: { + guint64 size_bytes; + gs_app_get_size_installed (app, &size_bytes); + g_value_set_uint64 (value, size_bytes); + break; + } + case PROP_SIZE_INSTALLED_DEPENDENCIES_TYPE: + g_value_set_enum (value, gs_app_get_size_installed_dependencies (app, NULL)); + break; + case PROP_SIZE_INSTALLED_DEPENDENCIES: { + guint64 size_bytes; + gs_app_get_size_installed_dependencies (app, &size_bytes); + g_value_set_uint64 (value, size_bytes); + break; + } + case PROP_SIZE_USER_DATA_TYPE: + g_value_set_enum (value, gs_app_get_size_user_data (app, NULL)); + break; + case PROP_SIZE_USER_DATA: { + guint64 size_bytes; + gs_app_get_size_user_data (app, &size_bytes); + g_value_set_uint64 (value, size_bytes); + break; + } + case PROP_PERMISSIONS: + g_value_take_object (value, gs_app_dup_permissions (app)); + break; + case PROP_RELATIONS: + g_value_take_boxed (value, gs_app_get_relations (app)); + break; + case PROP_ORIGIN_UI: + g_value_take_string (value, gs_app_dup_origin_ui (app, TRUE)); + break; + case PROP_HAS_TRANSLATIONS: + g_value_set_boolean (value, gs_app_get_has_translations (app)); + break; + case PROP_ICONS_STATE: + g_value_set_enum (value, priv->icons_state); + break; + case PROP_MOK_KEY_PENDING: + g_value_set_boolean (value, gs_app_get_mok_key_pending (app)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsApp *app = GS_APP (object); + GsAppPrivate *priv = gs_app_get_instance_private (app); + + switch ((GsAppProperty) prop_id) { + case PROP_ID: + gs_app_set_id (app, g_value_get_string (value)); + break; + case PROP_NAME: + gs_app_set_name (app, + GS_APP_QUALITY_UNKNOWN, + g_value_get_string (value)); + break; + case PROP_VERSION: + gs_app_set_version (app, g_value_get_string (value)); + break; + case PROP_SUMMARY: + gs_app_set_summary (app, + GS_APP_QUALITY_UNKNOWN, + g_value_get_string (value)); + break; + case PROP_DESCRIPTION: + gs_app_set_description (app, + GS_APP_QUALITY_UNKNOWN, + g_value_get_string (value)); + break; + case PROP_RATING: + gs_app_set_rating (app, g_value_get_int (value)); + break; + case PROP_KIND: + gs_app_set_kind (app, g_value_get_uint (value)); + break; + case PROP_SPECIAL_KIND: + gs_app_set_special_kind (app, g_value_get_enum (value)); + break; + case PROP_STATE: + gs_app_set_state_internal (app, g_value_get_enum (value)); + break; + case PROP_PROGRESS: + gs_app_set_progress (app, g_value_get_uint (value)); + break; + case PROP_CAN_CANCEL_INSTALLATION: + priv->allow_cancel = g_value_get_boolean (value); + break; + case PROP_INSTALL_DATE: + gs_app_set_install_date (app, g_value_get_uint64 (value)); + break; + case PROP_RELEASE_DATE: + gs_app_set_release_date (app, g_value_get_uint64 (value)); + break; + case PROP_QUIRK: + priv->quirk = g_value_get_flags (value); + break; + case PROP_PENDING_ACTION: + /* Read only */ + g_assert_not_reached (); + break; + case PROP_KEY_COLORS: + gs_app_set_key_colors (app, g_value_get_boxed (value)); + break; + case PROP_IS_UPDATE_DOWNLOADED: +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + gs_app_set_is_update_downloaded (app, g_value_get_boolean (value)); +G_GNUC_END_IGNORE_DEPRECATIONS + break; + case PROP_URLS: + /* Read only */ + g_assert_not_reached (); + break; + case PROP_URL_MISSING: + gs_app_set_url_missing (app, g_value_get_string (value)); + break; + case PROP_CONTENT_RATING: + gs_app_set_content_rating (app, g_value_get_object (value)); + break; + case PROP_LICENSE: + /* Read-only */ + g_assert_not_reached (); + case PROP_SIZE_CACHE_DATA_TYPE: + gs_app_set_size_cache_data (app, g_value_get_enum (value), priv->size_cache_data); + break; + case PROP_SIZE_CACHE_DATA: + gs_app_set_size_cache_data (app, priv->size_cache_data_type, g_value_get_uint64 (value)); + break; + case PROP_SIZE_DOWNLOAD_TYPE: + gs_app_set_size_download (app, g_value_get_enum (value), priv->size_download); + break; + case PROP_SIZE_DOWNLOAD: + gs_app_set_size_download (app, priv->size_download_type, g_value_get_uint64 (value)); + break; + case PROP_SIZE_DOWNLOAD_DEPENDENCIES_TYPE: + case PROP_SIZE_DOWNLOAD_DEPENDENCIES: + /* Read-only */ + g_assert_not_reached (); + case PROP_SIZE_INSTALLED_TYPE: + gs_app_set_size_installed (app, g_value_get_enum (value), priv->size_installed); + break; + case PROP_SIZE_INSTALLED: + gs_app_set_size_installed (app, priv->size_installed_type, g_value_get_uint64 (value)); + break; + case PROP_SIZE_INSTALLED_DEPENDENCIES_TYPE: + case PROP_SIZE_INSTALLED_DEPENDENCIES: + /* Read-only */ + g_assert_not_reached (); + case PROP_SIZE_USER_DATA_TYPE: + gs_app_set_size_user_data (app, g_value_get_enum (value), priv->size_user_data); + break; + case PROP_SIZE_USER_DATA: + gs_app_set_size_user_data (app, priv->size_user_data_type, g_value_get_uint64 (value)); + break; + case PROP_PERMISSIONS: + gs_app_set_permissions (app, g_value_get_object (value)); + break; + case PROP_RELATIONS: + gs_app_set_relations (app, g_value_get_boxed (value)); + break; + case PROP_ORIGIN_UI: + gs_app_set_origin_ui (app, g_value_get_string (value)); + break; + case PROP_HAS_TRANSLATIONS: + gs_app_set_has_translations (app, g_value_get_boolean (value)); + break; + case PROP_ICONS_STATE: + /* Read-only */ + g_assert_not_reached (); + break; + case PROP_MOK_KEY_PENDING: + gs_app_set_mok_key_pending (app, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_dispose (GObject *object) +{ + GsApp *app = GS_APP (object); + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_clear_object (&priv->runtime); + + g_clear_pointer (&priv->addons, g_object_unref); + g_clear_pointer (&priv->history, g_object_unref); + g_clear_pointer (&priv->related, g_object_unref); + g_clear_pointer (&priv->screenshots, g_ptr_array_unref); + g_clear_pointer (&priv->review_ratings, g_array_unref); + g_clear_pointer (&priv->reviews, g_ptr_array_unref); + g_clear_pointer (&priv->provided, g_ptr_array_unref); + g_clear_pointer (&priv->icons, g_ptr_array_unref); + g_clear_pointer (&priv->version_history, g_ptr_array_unref); + g_clear_pointer (&priv->relations, g_ptr_array_unref); + g_weak_ref_clear (&priv->management_plugin_weak); + + G_OBJECT_CLASS (gs_app_parent_class)->dispose (object); +} + +static void +gs_app_finalize (GObject *object) +{ + GsApp *app = GS_APP (object); + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_mutex_clear (&priv->mutex); + g_free (priv->id); + g_free (priv->unique_id); + g_free (priv->branch); + g_free (priv->name); + g_free (priv->renamed_from); + g_free (priv->url_missing); + g_clear_pointer (&priv->urls, g_hash_table_unref); + g_hash_table_unref (priv->launchables); + g_free (priv->license); + g_strfreev (priv->menu_path); + g_free (priv->origin); + g_free (priv->origin_ui); + g_free (priv->origin_appstream); + g_free (priv->origin_hostname); + g_ptr_array_unref (priv->sources); + g_ptr_array_unref (priv->source_ids); + g_free (priv->project_group); + g_free (priv->developer_name); + g_free (priv->agreement); + g_free (priv->version); + g_free (priv->version_ui); + g_free (priv->summary); + g_free (priv->summary_missing); + g_free (priv->description); + g_free (priv->update_version); + g_free (priv->update_version_ui); + g_free (priv->update_details_markup); + g_hash_table_unref (priv->metadata); + g_ptr_array_unref (priv->categories); + g_clear_pointer (&priv->key_colors, g_array_unref); + g_clear_object (&priv->cancellable); + g_clear_object (&priv->local_file); + g_clear_object (&priv->content_rating); + g_clear_object (&priv->action_screenshot); + g_clear_object (&priv->update_permissions); + g_clear_object (&priv->permissions); + + G_OBJECT_CLASS (gs_app_parent_class)->finalize (object); +} + +static void +gs_app_class_init (GsAppClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->dispose = gs_app_dispose; + object_class->finalize = gs_app_finalize; + object_class->get_property = gs_app_get_property; + object_class->set_property = gs_app_set_property; + + /** + * GsApp:id: + */ + obj_props[PROP_ID] = g_param_spec_string ("id", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:name: + */ + obj_props[PROP_NAME] = g_param_spec_string ("name", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:version: + */ + obj_props[PROP_VERSION] = g_param_spec_string ("version", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:summary: + */ + obj_props[PROP_SUMMARY] = g_param_spec_string ("summary", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:description: + */ + obj_props[PROP_DESCRIPTION] = g_param_spec_string ("description", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:rating: + */ + obj_props[PROP_RATING] = g_param_spec_int ("rating", NULL, NULL, + -1, 100, -1, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:kind: + */ + /* FIXME: Should use AS_TYPE_APP_KIND when it’s available */ + obj_props[PROP_KIND] = g_param_spec_uint ("kind", NULL, NULL, + AS_COMPONENT_KIND_UNKNOWN, + AS_COMPONENT_KIND_LAST, + AS_COMPONENT_KIND_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:special-kind: + * + * GNOME Software specific occupation of the #GsApp entity + * that does not reflect a software type defined by AppStream. + * + * Since: 40 + */ + obj_props[PROP_SPECIAL_KIND] = g_param_spec_enum ("special-kind", NULL, NULL, + GS_TYPE_APP_SPECIAL_KIND, + GS_APP_SPECIAL_KIND_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:state: + */ + obj_props[PROP_STATE] = g_param_spec_enum ("state", NULL, NULL, + GS_TYPE_APP_STATE, + GS_APP_STATE_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:progress: + * + * A percentage (0–100, inclusive) indicating the progress through the + * current task on this app. The value may otherwise be + * %GS_APP_PROGRESS_UNKNOWN if the progress is unknown or has a wide + * confidence interval. + */ + obj_props[PROP_PROGRESS] = g_param_spec_uint ("progress", NULL, NULL, + 0, GS_APP_PROGRESS_UNKNOWN, GS_APP_PROGRESS_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:allow-cancel: + */ + obj_props[PROP_CAN_CANCEL_INSTALLATION] = + g_param_spec_boolean ("allow-cancel", NULL, NULL, TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:install-date: + */ + obj_props[PROP_INSTALL_DATE] = g_param_spec_uint64 ("install-date", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:release-date: + * + * Set to the release date of the application on the server. Can be 0, + * which means the release date is unknown. + * + * Since: 3.40 + */ + obj_props[PROP_RELEASE_DATE] = g_param_spec_uint64 ("release-date", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:quirk: + */ + obj_props[PROP_QUIRK] = g_param_spec_flags ("quirk", NULL, NULL, + GS_TYPE_APP_QUIRK, GS_APP_QUIRK_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:pending-action: + */ + obj_props[PROP_PENDING_ACTION] = g_param_spec_enum ("pending-action", NULL, NULL, + GS_TYPE_PLUGIN_ACTION, GS_PLUGIN_ACTION_UNKNOWN, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:key-colors: + */ + obj_props[PROP_KEY_COLORS] = g_param_spec_boxed ("key-colors", NULL, NULL, + G_TYPE_ARRAY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:is-update-downloaded: + * + * Deprecated: 44: No longer supported. + */ + obj_props[PROP_IS_UPDATE_DOWNLOADED] = g_param_spec_boolean ("is-update-downloaded", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED); + + /** + * GsApp:urls: (nullable) (element-type AsUrlKind utf8) + * + * The URLs associated with the app. + * + * This is %NULL if no URLs are available. If provided, it is a mapping + * from #AsUrlKind to the URLs. + * + * This property is read-only: use gs_app_set_url() to set URLs. + * + * Since: 41 + */ + obj_props[PROP_URLS] = + g_param_spec_boxed ("urls", NULL, NULL, + G_TYPE_HASH_TABLE, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:url-missing: + * + * A web URL pointing to explanations why this app + * does not have an installation candidate. + * + * Since: 40 + */ + obj_props[PROP_URL_MISSING] = g_param_spec_string ("url-missing", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:content-rating: (nullable) + * + * The content rating for the app, which gives information on how + * suitable it is for different age ranges of user. + * + * This is %NULL if no content rating information is available. + * + * Since: 41 + */ + obj_props[PROP_CONTENT_RATING] = + g_param_spec_object ("content-rating", NULL, NULL, + /* FIXME: Use the get_type() function directly here to work + * around https://github.com/ximion/appstream/pull/318 */ + as_content_rating_get_type (), + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:license: (nullable) + * + * The license for the app, which is typically its source code license. + * + * Use gs_app_set_license() to set this. + * + * This is %NULL if no licensing information is available. + * + * Since: 41 + */ + obj_props[PROP_LICENSE] = + g_param_spec_string ("license", NULL, NULL, + NULL, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-cache-data-type + * + * The type of #GsApp:size-cache-data. + * + * Since: 43 + */ + obj_props[PROP_SIZE_CACHE_DATA_TYPE] = + g_param_spec_enum ("size-cache-data-type", NULL, NULL, + GS_TYPE_SIZE_TYPE, GS_SIZE_TYPE_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-cache-data + * + * The size on the disk for the cache data of the application. + * + * This is undefined if #GsApp:size-cache-data-type is not + * %GS_SIZE_TYPE_VALID. + * + * Since: 41 + */ + obj_props[PROP_SIZE_CACHE_DATA] = + g_param_spec_uint64 ("size-cache-data", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-download-type + * + * The type of #GsApp:size-download. + * + * Since: 43 + */ + obj_props[PROP_SIZE_DOWNLOAD_TYPE] = + g_param_spec_enum ("size-download-type", NULL, NULL, + GS_TYPE_SIZE_TYPE, GS_SIZE_TYPE_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-download + * + * The size of the total download needed to either install or update + * this application, in bytes. If the app is partially downloaded, this + * is the number of bytes remaining to download. + * + * This is undefined if #GsApp:size-download-type is not + * %GS_SIZE_TYPE_VALID. + * + * To get the runtime or other dependencies download size, + * use #GsApp:size-download-dependencies. + * + * Since: 41 + */ + obj_props[PROP_SIZE_DOWNLOAD] = + g_param_spec_uint64 ("size-download", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-download-dependencies-type + * + * The type of #GsApp:size-download-dependencies. + * + * Since: 43 + */ + obj_props[PROP_SIZE_DOWNLOAD_DEPENDENCIES_TYPE] = + g_param_spec_enum ("size-download-dependencies-type", NULL, NULL, + GS_TYPE_SIZE_TYPE, GS_SIZE_TYPE_UNKNOWN, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-download-dependencies + * + * The size of the total download needed to either install or update + * this application's dependencies, in bytes. If the dependencies are partially + * downloaded, this is the number of bytes remaining to download. + * + * This is undefined if #GsApp:size-download-dependencies-type is not + * %GS_SIZE_TYPE_VALID. + * + * Since: 41 + */ + obj_props[PROP_SIZE_DOWNLOAD_DEPENDENCIES] = + g_param_spec_uint64 ("size-download-dependencies", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-installed-type + * + * The type of #GsApp:size-installed. + * + * Since: 43 + */ + obj_props[PROP_SIZE_INSTALLED_TYPE] = + g_param_spec_enum ("size-installed-type", NULL, NULL, + GS_TYPE_SIZE_TYPE, GS_SIZE_TYPE_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-installed + * + * The size of the application on disk, in bytes. If the application is + * not yet installed, this is the size it would need, once installed. + * + * This is undefined if #GsApp:size-installed-type is not + * %GS_SIZE_TYPE_VALID. + * + * To get the application runtime or extensions installed sizes, + * use #GsApp:size-installed-dependencies. + * + * Since: 41 + */ + obj_props[PROP_SIZE_INSTALLED] = + g_param_spec_uint64 ("size-installed", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-installed-dependencies-type + * + * The type of #GsApp:size-installed-dependencies. + * + * Since: 43 + */ + obj_props[PROP_SIZE_INSTALLED_DEPENDENCIES_TYPE] = + g_param_spec_enum ("size-installed-dependencies-type", NULL, NULL, + GS_TYPE_SIZE_TYPE, GS_SIZE_TYPE_UNKNOWN, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-installed-dependencies + * + * The size of the application's dependencies on disk, in bytes. If the dependencies are + * not yet installed, this is the size it would need, once installed. + * + * This is undefined if #GsApp:size-installed-dependencies-type is not + * %GS_SIZE_TYPE_VALID. + * + * Since: 41 + */ + obj_props[PROP_SIZE_INSTALLED_DEPENDENCIES] = + g_param_spec_uint64 ("size-installed-dependencies", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-user-data-type + * + * The type of #GsApp:size-user-data. + * + * Since: 43 + */ + obj_props[PROP_SIZE_USER_DATA_TYPE] = + g_param_spec_enum ("size-user-data-type", NULL, NULL, + GS_TYPE_SIZE_TYPE, GS_SIZE_TYPE_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:size-user-data + * + * The size on the disk for the user data of the application. + * + * This is undefined if #GsApp:size-user-data-type is not + * %GS_SIZE_TYPE_VALID. + * + * Since: 41 + */ + obj_props[PROP_SIZE_USER_DATA] = + g_param_spec_uint64 ("size-user-data", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:permissions + * + * The permissions the app requires to run, as a #GsAppPermissions object. + * + * This is %NULL, if the permissions are unknown. + * + * Since: 43 + */ + obj_props[PROP_PERMISSIONS] = + g_param_spec_object ("permissions", NULL, NULL, + GS_TYPE_APP_PERMISSIONS, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:relations: (nullable) (element-type AsRelation) + * + * Relations between this app and other things. For example, + * requirements or recommendations that the computer have certain input + * devices to use the app (the app requires a touchscreen or gamepad), + * or that the screen is a certain size. + * + * %NULL is equivalent to an empty array. Relations of kind + * %AS_RELATION_KIND_REQUIRES are conjunctive, so each additional + * relation further restricts the set of computers which can run the + * app. Relations of kind %AS_RELATION_KIND_RECOMMENDS and + * %AS_RELATION_KIND_SUPPORTS are disjunctive. + * + * Since: 41 + */ + obj_props[PROP_RELATIONS] = + g_param_spec_boxed ("relations", NULL, NULL, + G_TYPE_PTR_ARRAY, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:origin-ui: (not nullable) + * + * The package origin, in a human readable format suitable for use in + * the UI. For example ‘Local file (RPM)’ or ‘Flathub (Flatpak)’. + * + * Since: 41 + */ + obj_props[PROP_ORIGIN_UI] = + g_param_spec_string ("origin-ui", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:has-translations + * + * Whether the app has any information about provided translations. If + * this is %TRUE, the app provides information about the translations + * it ships. If %FALSE, the app does not provide any information (but + * might ship translations which aren’t mentioned). + * + * Since: 41 + */ + obj_props[PROP_HAS_TRANSLATIONS] = + g_param_spec_boolean ("has-translations", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:icons-state: + * + * The state of the icons of this app. Notice that it is valid + * for the icon state to be %GS_APP_ICONS_STATE_AVAILABLE, and + * for there to be no icon for the app. This can happen, for + * example, if it downloads an icon, but the icon download has + * failed. + * + * Since: 44 + */ + obj_props[PROP_ICONS_STATE] = g_param_spec_enum ("icons-state", NULL, NULL, + GS_TYPE_APP_ICONS_STATE, + GS_APP_ICONS_STATE_UNKNOWN, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsApp:mok-key-pending + * + * Set to %TRUE, when the app requires restart to enroll a Machine + * Owner Key (MOK). The property is always %FALSE when the project is + * not built with enabled DKMS support. + * + * Since: 47 + */ + obj_props[PROP_MOK_KEY_PENDING] = + g_param_spec_boolean ("mok-key-pending", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +static void +gs_app_init (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + priv->rating = -1; + priv->sources = g_ptr_array_new_with_free_func (g_free); + priv->source_ids = g_ptr_array_new_with_free_func (g_free); + priv->categories = g_ptr_array_new_with_free_func (g_free); + priv->related = gs_app_list_new (); + priv->history = gs_app_list_new (); + priv->screenshots = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + priv->reviews = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + priv->provided = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + priv->metadata = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_variant_unref); + priv->launchables = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + g_free); + priv->allow_cancel = TRUE; + priv->size_download_type = GS_SIZE_TYPE_UNKNOWN; + priv->size_installed_type = GS_SIZE_TYPE_UNKNOWN; + priv->size_cache_data_type = GS_SIZE_TYPE_UNKNOWN; + priv->size_user_data_type = GS_SIZE_TYPE_UNKNOWN; + g_mutex_init (&priv->mutex); +} + +/** + * gs_app_new: + * @id: an application ID, or %NULL, e.g. "org.gnome.Software.desktop" + * + * Creates a new application object. + * + * The ID should only be set when the application ID (with optional prefix) is + * known; it is perfectly valid to use gs_app_new() with an @id of %NULL, and + * then relying on another plugin to set the @id using gs_app_set_id() based on + * some other information. + * + * For instance, a #GsApp is created with no ID when returning results from the + * packagekit plugin, but with the default source name set as the package name. + * The source name is read by the appstream plugin, and if matched in the + * AppStream XML the correct ID is set, along with other higher quality data + * like the application icon and long description. + * + * Returns: a new #GsApp + * + * Since: 3.22 + **/ +GsApp * +gs_app_new (const gchar *id) +{ + GsApp *app; + app = g_object_new (GS_TYPE_APP, + "id", id, + NULL); + return GS_APP (app); +} + +/** + * gs_app_set_from_unique_id: + * @app: a #GsApp + * @unique_id: an application unique ID, e.g. + * `system/flatpak/gnome/desktop/org.gnome.Software.desktop/master` + * + * Sets details on an application object. + * + * The unique ID will be parsed to set some information in the application such + * as the scope, bundle kind, id, etc. + * + * Since: 3.26 + **/ +void +gs_app_set_from_unique_id (GsApp *app, const gchar *unique_id, AsComponentKind kind) +{ + g_auto(GStrv) split = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (unique_id != NULL); + + if (kind != AS_COMPONENT_KIND_UNKNOWN) + gs_app_set_kind (app, kind); + + split = g_strsplit (unique_id, "/", -1); + if (g_strv_length (split) != 5) + return; + if (g_strcmp0 (split[0], "*") != 0) + gs_app_set_scope (app, as_component_scope_from_string (split[0])); + if (g_strcmp0 (split[1], "*") != 0) + gs_app_set_bundle_kind (app, as_bundle_kind_from_string (split[1])); + if (g_strcmp0 (split[2], "*") != 0) + gs_app_set_origin (app, split[2]); + if (g_strcmp0 (split[3], "*") != 0) + gs_app_set_id (app, split[3]); + if (g_strcmp0 (split[4], "*") != 0) + gs_app_set_branch (app, split[4]); +} + +/** + * gs_app_new_from_unique_id: + * @unique_id: an application unique ID, e.g. + * `system/flatpak/gnome/desktop/org.gnome.Software.desktop/master` + * + * Creates a new application object. + * + * The unique ID will be parsed to set some information in the application such + * as the scope, bundle kind, id, etc. Unlike gs_app_new(), it cannot take a + * %NULL argument. + * + * Returns: a new #GsApp + * + * Since: 3.22 + **/ +GsApp * +gs_app_new_from_unique_id (const gchar *unique_id) +{ + GsApp *app; + g_return_val_if_fail (unique_id != NULL, NULL); + app = gs_app_new (NULL); + gs_app_set_from_unique_id (app, unique_id, AS_COMPONENT_KIND_UNKNOWN); + return app; +} + +/** + * gs_app_dup_origin_ui: + * @app: a #GsApp + * @with_packaging_format: %TRUE, to include also packaging format + * + * Gets the package origin that's suitable for UI use, i.e. the value of + * #GsApp:origin-ui. + * + * Returns: (not nullable) (transfer full): The package origin for UI use + * + * Since: 43 + **/ +gchar * +gs_app_dup_origin_ui (GsApp *app, + gboolean with_packaging_format) +{ + GsAppPrivate *priv; + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + const gchar *origin_str = NULL; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + /* use the distro name for official packages */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_PROVENANCE) && + gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY) { + os_release = gs_os_release_new (NULL); + if (os_release != NULL) { + origin_str = gs_os_release_get_vendor_name (os_release); + if (origin_str == NULL) + origin_str = gs_os_release_get_name (os_release); + } + } + + priv = gs_app_get_instance_private (app); + locker = g_mutex_locker_new (&priv->mutex); + + if (!origin_str) { + origin_str = priv->origin_ui; + + if (origin_str == NULL || origin_str[0] == '\0') { + /* use "Local file" rather than the filename for local files */ + if (gs_app_get_state (app) == GS_APP_STATE_AVAILABLE_LOCAL || + gs_app_get_local_file (app) != NULL) + origin_str = _("Local file"); + else if (g_strcmp0 (gs_app_get_origin (app), "flathub") == 0) + origin_str = "Flathub"; + else if (g_strcmp0 (gs_app_get_origin (app), "flathub-beta") == 0) + origin_str = "Flathub Beta"; + else + origin_str = gs_app_get_origin (app); + } + } + + if (with_packaging_format) { + g_autofree gchar *packaging_format = NULL; + + packaging_format = gs_app_get_packaging_format (app); + + if (packaging_format) { + /* TRANSLATORS: the first %s is replaced with an origin name; + the second %s is replaced with the packaging format. + Example string: "Local file (RPM)" */ + return g_strdup_printf (_("%s (%s)"), origin_str, packaging_format); + } + } + + return g_strdup (origin_str); +} + +/** + * gs_app_set_origin_ui: + * @app: a #GsApp + * @origin_ui: (not nullable): the new origin UI + * + * Set the value of #GsApp:origin-ui. + */ +void +gs_app_set_origin_ui (GsApp *app, + const gchar *origin_ui) +{ + GsAppPrivate *priv; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + + priv = gs_app_get_instance_private (app); + locker = g_mutex_locker_new (&priv->mutex); + + if (origin_ui && !*origin_ui) + origin_ui = NULL; + + if (g_strcmp0 (priv->origin_ui, origin_ui) == 0) + return; + + g_free (priv->origin_ui); + priv->origin_ui = g_strdup (origin_ui); + gs_app_queue_notify (app, obj_props[PROP_ORIGIN_UI]); +} + +/** + * gs_app_get_packaging_format: + * @app: a #GsApp + * + * Gets the packaging format, e.g. 'RPM' or 'Flatpak'. + * + * Returns: The packaging format + * + * Since: 3.32 + **/ +gchar * +gs_app_get_packaging_format (GsApp *app) +{ + AsBundleKind bundle_kind; + const gchar *bundle_kind_ui; + const gchar *packaging_format; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + /* does the app have packaging format set? */ + packaging_format = gs_app_get_metadata_item (app, "GnomeSoftware::PackagingFormat"); + if (packaging_format != NULL) + return g_strdup (packaging_format); + + /* fall back to bundle kind */ + bundle_kind = gs_app_get_bundle_kind (app); + switch (bundle_kind) { + case AS_BUNDLE_KIND_UNKNOWN: + bundle_kind_ui = NULL; + break; + case AS_BUNDLE_KIND_LIMBA: + bundle_kind_ui = "Limba"; + break; + case AS_BUNDLE_KIND_FLATPAK: + bundle_kind_ui = "Flatpak"; + break; + case AS_BUNDLE_KIND_SNAP: + bundle_kind_ui = "Snap"; + break; + case AS_BUNDLE_KIND_PACKAGE: + bundle_kind_ui = _("Package"); + break; + case AS_BUNDLE_KIND_CABINET: + bundle_kind_ui = "Cabinet"; + break; + case AS_BUNDLE_KIND_APPIMAGE: + bundle_kind_ui = "AppImage"; + break; + default: + g_warning ("unhandled bundle kind %s", as_bundle_kind_to_string (bundle_kind)); + bundle_kind_ui = as_bundle_kind_to_string (bundle_kind); + } + + return g_strdup (bundle_kind_ui); +} + +/** + * gs_app_get_packaging_format_raw: + * @app: a #GsApp + * + * Similar to gs_app_get_packaging_format(), but it does not return a newly + * allocated string and the value is not suitable for the UI. Depending on + * the plugin, it can be "deb", "flatpak", "package", "RPM", "snap", .... + * + * Returns: The raw value of the packaging format + * + * Since: 41 + **/ +const gchar * +gs_app_get_packaging_format_raw (GsApp *app) +{ + const gchar *packaging_format; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + packaging_format = gs_app_get_metadata_item (app, "GnomeSoftware::PackagingFormat"); + if (packaging_format != NULL) + return packaging_format; + + return as_bundle_kind_to_string (gs_app_get_bundle_kind (app)); +} + +/** + * gs_app_subsume_metadata: + * @app: a #GsApp + * @donor: another #GsApp + * + * Copies any metadata from @donor to @app. + * + * Since: 3.32 + **/ +void +gs_app_subsume_metadata (GsApp *app, GsApp *donor) +{ + GsAppPrivate *priv = gs_app_get_instance_private (donor); + g_autoptr(GList) keys = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (GS_IS_APP (donor)); + + keys = g_hash_table_get_keys (priv->metadata); + for (GList *l = keys; l != NULL; l = l->next) { + const gchar *key = l->data; + GVariant *tmp = gs_app_get_metadata_variant (donor, key); + if (gs_app_get_metadata_variant (app, key) != NULL) + continue; + gs_app_set_metadata_variant (app, key, tmp); + } +} + +/** + * gs_app_dup_permissions: + * @app: a #GsApp + * + * Get a reference to the @app permissions. The returned value can + * be %NULL, when the app's permissions are unknown. Free the returned pointer, + * if not %NULL, with g_object_unref(), when no longer needed. + * + * Returns: (nullable) (transfer full): referenced #GsAppPermissions, + * or %NULL + * + * Since: 43 + **/ +GsAppPermissions * +gs_app_dup_permissions (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + locker = g_mutex_locker_new (&priv->mutex); + return priv->permissions ? g_object_ref (priv->permissions) : NULL; +} + +/** + * gs_app_set_permissions: + * @app: a #GsApp + * @permissions: (nullable) (transfer none): a #GsAppPermissions, or %NULL + * + * Set permissions for the @app. The @permissions is referenced, + * if not %NULL. + * + * Note the @permissions need to be sealed. + * + * Since: 43 + **/ +void +gs_app_set_permissions (GsApp *app, + GsAppPermissions *permissions) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (permissions == NULL || gs_app_permissions_is_sealed (permissions)); + + locker = g_mutex_locker_new (&priv->mutex); + if (priv->permissions == permissions) + return; + g_clear_object (&priv->permissions); + if (permissions != NULL) + priv->permissions = g_object_ref (permissions); + gs_app_queue_notify (app, obj_props[PROP_PERMISSIONS]); +} + +/** + * gs_app_dup_update_permissions: + * @app: a #GsApp + * + * Get a reference to the update permissions. The returned value can + * be %NULL, when no update permissions had been set. Free + * the returned pointer, if not %NULL, with g_object_unref(), when + * no longer needed. + * + * Returns: (nullable) (transfer full): referenced #GsAppPermissions, + * or %NULL + * + * Since: 43 + **/ +GsAppPermissions * +gs_app_dup_update_permissions (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + locker = g_mutex_locker_new (&priv->mutex); + return priv->update_permissions ? g_object_ref (priv->update_permissions) : NULL; +} + +/** + * gs_app_set_update_permissions: + * @app: a #GsApp + * @update_permissions: (nullable) (transfer none): a #GsAppPermissions, or %NULL + * + * Set update permissions for the @app, that is, the permissions, which change + * in an update or similar reasons. The @update_permissions is referenced, + * if not %NULL. + * + * Note the @update_permissions need to be sealed. + * + * Since: 43 + **/ +void +gs_app_set_update_permissions (GsApp *app, + GsAppPermissions *update_permissions) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (update_permissions == NULL || gs_app_permissions_is_sealed (update_permissions)); + locker = g_mutex_locker_new (&priv->mutex); + if (priv->update_permissions != update_permissions) { + g_clear_object (&priv->update_permissions); + if (update_permissions != NULL) + priv->update_permissions = g_object_ref (update_permissions); + } +} + +/** + * gs_app_get_version_history: + * @app: a #GsApp + * + * Gets the list of past releases for an application (including the latest + * one). + * + * Returns: (element-type AsRelease) (transfer container) (nullable): a list, or + * %NULL if the version history is not known + * + * Since: 41 + **/ +GPtrArray * +gs_app_get_version_history (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_val_if_fail (GS_IS_APP (app), NULL); + + locker = g_mutex_locker_new (&priv->mutex); + if (priv->version_history == NULL) + return NULL; + return g_ptr_array_ref (priv->version_history); +} + +/** + * gs_app_set_version_history: + * @app: a #GsApp + * @version_history: (element-type AsRelease) (nullable): a set of entries + * representing the version history, or %NULL if none are known + * + * Set the list of past releases for an application (including the latest one). + * + * Since: 40 + **/ +void +gs_app_set_version_history (GsApp *app, GPtrArray *version_history) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_return_if_fail (GS_IS_APP (app)); + + if (version_history != NULL && version_history->len == 0) + version_history = NULL; + + locker = g_mutex_locker_new (&priv->mutex); + _g_set_ptr_array (&priv->version_history, version_history); +} + +/** + * gs_app_ensure_icons_downloaded: + * @app: a #GsApp + * @soup_session: a #SoupSession + * @maximum_icon_size: maximum icon size (in logical pixels) + * @scale: icon scale factor + * @cancellable: (nullable): optional #GCancellable object + * + * Ensure all remote icons in the @app's icons are locally cached. + * + * Since: 48 + **/ +void +gs_app_ensure_icons_downloaded (GsApp *app, + SoupSession *soup_session, + guint maximum_icon_size, + guint scale, + GCancellable *cancellable) +{ + GsAppPrivate *priv; + g_autoptr(GMutexLocker) locker = NULL; + GPtrArray *icons; + guint i; + + g_return_if_fail (GS_IS_APP (app)); + + priv = gs_app_get_instance_private (app); + locker = g_mutex_locker_new (&priv->mutex); + + /* process all icons */ + icons = priv->icons; + + for (i = 0; icons != NULL && i < icons->len; i++) { + GIcon *icon = g_ptr_array_index (icons, i); + g_autoptr(GError) error_local = NULL; + + /* Only remote icons need to be cached. */ + if (!GS_IS_REMOTE_ICON (icon)) + continue; + + if (!gs_remote_icon_ensure_cached (GS_REMOTE_ICON (icon), + soup_session, + maximum_icon_size, + scale, + cancellable, + &error_local)) { + /* we failed, but keep going */ + g_debug ("failed to cache icon for %s: %s", + gs_app_get_id (app), + error_local->message); + } + } +} + +/** + * gs_app_get_relations: + * @app: a #GsApp + * + * Gets the value of #GsApp:relations. %NULL is equivalent to an empty array. + * + * The returned array should not be modified. + * + * Returns: (transfer container) (element-type AsRelation) (nullable): the value of + * #GsApp:relations, or %NULL + * Since: 41 + */ +GPtrArray * +gs_app_get_relations (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + locker = g_mutex_locker_new (&priv->mutex); + return (priv->relations != NULL) ? g_ptr_array_ref (priv->relations) : NULL; +} + +/** + * gs_app_add_relation: + * @app: a #GsApp + * @relation: (transfer none) (not nullable): a new #AsRelation to add to the app + * + * Adds @relation to #GsApp:relations. @relation must have all its properties + * set already. + * + * Since: 41 + */ +void +gs_app_add_relation (GsApp *app, + AsRelation *relation) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (AS_IS_RELATION (relation)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->relations == NULL) + priv->relations = g_ptr_array_new_with_free_func (g_object_unref); + g_ptr_array_add (priv->relations, g_object_ref (relation)); + + gs_app_queue_notify (app, obj_props[PROP_RELATIONS]); +} + +/** + * gs_app_set_relations: + * @app: a #GsApp + * @relations: (element-type AsRelation) (nullable) (transfer none): a new set + * of relations for #GsApp:relations; %NULL represents an empty array + * + * Set #GsApp:relations to @relations, replacing its previous value. %NULL is + * equivalent to an empty array. + * + * Since: 41 + */ +void +gs_app_set_relations (GsApp *app, + GPtrArray *relations) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GPtrArray) old_relations = NULL; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (relations == NULL && priv->relations == NULL) + return; + + if (priv->relations != NULL) + old_relations = g_steal_pointer (&priv->relations); + + if (relations != NULL) + priv->relations = g_ptr_array_ref (relations); + + gs_app_queue_notify (app, obj_props[PROP_RELATIONS]); +} + +/** + * gs_app_get_has_translations: + * @app: a #GsApp + * + * Get the value of #GsApp:has-translations. + * + * Returns: %TRUE if the app has translation metadata, %FALSE otherwise + * Since: 41 + */ +gboolean +gs_app_get_has_translations (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + return priv->has_translations; +} + +/** + * gs_app_set_has_translations: + * @app: a #GsApp + * @has_translations: %TRUE if the app has translation metadata, %FALSE otherwise + * + * Set the value of #GsApp:has-translations. + * + * Since: 41 + */ +void +gs_app_set_has_translations (GsApp *app, + gboolean has_translations) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->has_translations == has_translations) + return; + + priv->has_translations = has_translations; + gs_app_queue_notify (app, obj_props[PROP_HAS_TRANSLATIONS]); +} + +/** + * gs_app_is_downloaded: + * @app: a #GsApp + * + * Returns whether the @app is downloaded for updates or not, + * considering also its dependencies. + * + * Returns: %TRUE, when the @app is downloaded, %FALSE otherwise + * + * Since: 43 + **/ +gboolean +gs_app_is_downloaded (GsApp *app) +{ + GsSizeType size_type; + guint64 size_bytes = 0; + + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY)) { + size_type = gs_app_get_size_download (app, &size_bytes); + if (size_type != GS_SIZE_TYPE_VALID || size_bytes != 0) + return FALSE; + } + + size_type = gs_app_get_size_download_dependencies (app, &size_bytes); + if (size_type != GS_SIZE_TYPE_VALID || size_bytes != 0) + return FALSE; + + return TRUE; +} + +/** + * gs_app_get_icons_state: + * @app: a #GsApp + * + * Returns the state of the icons of @app. + * + * Returns: a #GsAppIconsState + * + * Since: 44 + **/ +GsAppIconsState +gs_app_get_icons_state (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_val_if_fail (GS_IS_APP (app), GS_APP_ICONS_STATE_UNKNOWN); + + return priv->icons_state; +} + +/** + * gs_app_set_icons_state: + * @app: a #GsApp + * @icons_state: a #GsAppIconsState + * + * Sets the app icons state of @app. + * + * Since: 44 + **/ +void +gs_app_set_icons_state (GsApp *app, + GsAppIconsState icons_state) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->icons_state == icons_state) + return; + + priv->icons_state = icons_state; + gs_app_queue_notify (app, obj_props[PROP_ICONS_STATE]); +} + +/** + * gs_app_is_application: + * @app: a #GsApp + * + * Returns whether the @app is an application, not a "generic" software. + * + * Returns: whether the @app is an application, not a "generic" software + * + * Since: 45 + **/ +gboolean +gs_app_is_application (GsApp *app) +{ + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + return priv->kind == AS_COMPONENT_KIND_DESKTOP_APP || + priv->kind == AS_COMPONENT_KIND_CONSOLE_APP || + priv->kind == AS_COMPONENT_KIND_WEB_APP; +} + +/** + * gs_app_get_mok_key_pending: + * @app: a #GsApp + * + * Get the value of #GsApp:mok-key-pending. + * + * Note: It returns always %FALSE, when the project is not built with + * enabled DKMS support. + * + * Returns: %TRUE, if the app requires restart to enroll a Machine + * Owner Key (MOK). + * + * Since: 47 + */ +gboolean +gs_app_get_mok_key_pending (GsApp *app) +{ + #ifdef ENABLE_DKMS + GsAppPrivate *priv = gs_app_get_instance_private (app); + + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + return priv->mok_key_pending; + #else + g_return_val_if_fail (GS_IS_APP (app), FALSE); + return FALSE; + #endif +} + +/** + * gs_app_set_mok_key_pending: + * @app: a #GsApp + * @mok_key_pending: value to set + * + * Set the value of #GsApp:mok-key-pending. Set to %TRUE, when the @app requires + * restart to enroll a Machine Owner Key (MOK). + * + * Note: The value is ignored, when the project is not built with + * enabled DKMS support. + * + * Since: 47 + */ +void +gs_app_set_mok_key_pending (GsApp *app, + gboolean mok_key_pending) +{ + #ifdef ENABLE_DKMS + GsAppPrivate *priv = gs_app_get_instance_private (app); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->mutex); + + if (priv->mok_key_pending == mok_key_pending) + return; + + priv->mok_key_pending = mok_key_pending; + gs_app_queue_notify (app, obj_props[PROP_MOK_KEY_PENDING]); + #else + g_return_if_fail (GS_IS_APP (app)); + #endif +} diff --git a/lib/gs-app.h b/lib/gs-app.h new file mode 100644 index 0000000..1184fdf --- /dev/null +++ b/lib/gs-app.h @@ -0,0 +1,572 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2018 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include + +G_BEGIN_DECLS + +/* Dependency loop means we can’t include the header. */ +typedef struct _GsPlugin GsPlugin; +typedef struct _GsAppList GsAppList; + +#define GS_TYPE_APP (gs_app_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsApp, gs_app, GS, APP, GObject) + +struct _GsAppClass +{ + GObjectClass parent_class; + void (*to_string) (GsApp *app, + GString *str); + gpointer padding[30]; +}; + +/** + * GsAppState: + * @GS_APP_STATE_UNKNOWN: Unknown state + * @GS_APP_STATE_INSTALLED: Application is installed + * @GS_APP_STATE_AVAILABLE: Application is available + * @GS_APP_STATE_AVAILABLE_LOCAL: Application is locally available as a file + * @GS_APP_STATE_UPDATABLE: Application is installed and updatable + * @GS_APP_STATE_UNAVAILABLE: Application is referenced, but not available + * @GS_APP_STATE_QUEUED_FOR_INSTALL: Application is queued for install + * @GS_APP_STATE_INSTALLING: Application is being installed + * @GS_APP_STATE_REMOVING: Application is being removed + * @GS_APP_STATE_UPDATABLE_LIVE: Application is installed and updatable live + * @GS_APP_STATE_PURCHASABLE: Application is available for purchasing + * @GS_APP_STATE_PURCHASING: Application is being purchased + * @GS_APP_STATE_PENDING_INSTALL: Application is installed, but may have pending some actions, + * like restart, to finish it + * @GS_APP_STATE_PENDING_REMOVE: Application is removed, but may have pending some actions, + * like restart, to finish it + * @GS_APP_STATE_DOWNLOADING: Application is being downloaded + * + * The application state. + **/ +typedef enum { + GS_APP_STATE_UNKNOWN, /* Since: 0.2.2 */ + GS_APP_STATE_INSTALLED, /* Since: 0.2.2 */ + GS_APP_STATE_AVAILABLE, /* Since: 0.2.2 */ + GS_APP_STATE_AVAILABLE_LOCAL, /* Since: 0.2.2 */ + GS_APP_STATE_UPDATABLE, /* Since: 0.2.2 */ + GS_APP_STATE_UNAVAILABLE, /* Since: 0.2.2 */ + GS_APP_STATE_QUEUED_FOR_INSTALL, /* Since: 0.2.2 */ + GS_APP_STATE_INSTALLING, /* Since: 0.2.2 */ + GS_APP_STATE_REMOVING, /* Since: 0.2.2 */ + GS_APP_STATE_UPDATABLE_LIVE, /* Since: 0.5.4 */ + GS_APP_STATE_PURCHASABLE, /* Since: 0.5.17 */ + GS_APP_STATE_PURCHASING, /* Since: 0.5.17 */ + GS_APP_STATE_PENDING_INSTALL, /* Since: 41 */ + GS_APP_STATE_PENDING_REMOVE, /* Since: 41 */ + GS_APP_STATE_DOWNLOADING, /* Since: 46 */ + GS_APP_STATE_LAST /*< skip >*/ +} GsAppState; + +/** + * GsAppSpecialKind: + * @GS_APP_SPECIAL_KIND_NONE: No special occupation + * @GS_APP_SPECIAL_KIND_OS_UPDATE: Application represents an OS update + * + * A special occupation for #GsApp. #AsComponentKind can not represent certain + * GNOME Software specific features, like representing a #GsApp as OS updates + * which have no associated AppStream entry. + * They are represented by a #GsApp of kind %AS_COMPONENT_KIND_GENERIC and a value + * from #GsAppSpecialKind. which does not match any AppStream component type. + **/ +typedef enum { + GS_APP_SPECIAL_KIND_NONE, /* Since: 40 */ + GS_APP_SPECIAL_KIND_OS_UPDATE, /* Since: 40 */ +} GsAppSpecialKind; + +/** + * GsAppKudo: + * @GS_APP_KUDO_MY_LANGUAGE: Localised in my language + * @GS_APP_KUDO_RECENT_RELEASE: Released recently + * @GS_APP_KUDO_FEATURED_RECOMMENDED: Chosen for the front page + * @GS_APP_KUDO_HAS_KEYWORDS: Has at least 1 keyword + * @GS_APP_KUDO_HAS_SCREENSHOTS: Supplies screenshots + * @GS_APP_KUDO_HI_DPI_ICON: Installs a HiDPI icon + * @GS_APP_KUDO_SANDBOXED: Application is sandboxed + * @GS_APP_KUDO_SANDBOXED_SECURE: Application is sandboxed securely + * + * Any awards given to the application. + **/ +typedef enum { + GS_APP_KUDO_MY_LANGUAGE = 1 << 0, + GS_APP_KUDO_RECENT_RELEASE = 1 << 1, + GS_APP_KUDO_FEATURED_RECOMMENDED = 1 << 2, + GS_APP_KUDO_HAS_KEYWORDS = 1 << 7, + GS_APP_KUDO_HAS_SCREENSHOTS = 1 << 9, + GS_APP_KUDO_HI_DPI_ICON = 1 << 14, + GS_APP_KUDO_SANDBOXED = 1 << 15, + GS_APP_KUDO_SANDBOXED_SECURE = 1 << 16, + GS_APP_KUDO_LAST /*< skip >*/ +} GsAppKudo; + +/** + * GsAppQuirk: + * @GS_APP_QUIRK_NONE: No special attributes + * @GS_APP_QUIRK_PROVENANCE: Installed by OS vendor + * @GS_APP_QUIRK_COMPULSORY: Cannot be removed + * @GS_APP_QUIRK_HAS_SOURCE: Has a source to allow staying up-to-date + * @GS_APP_QUIRK_IS_WILDCARD: Matches applications from any plugin + * @GS_APP_QUIRK_NEEDS_REBOOT: A reboot is required after the action + * @GS_APP_QUIRK_NOT_REVIEWABLE: The app is not reviewable + * @GS_APP_QUIRK_NOT_LAUNCHABLE: The app is not launchable (run-able) + * @GS_APP_QUIRK_NEEDS_USER_ACTION: The component requires some kind of user action + * @GS_APP_QUIRK_IS_PROXY: Is a proxy app that operates on other applications + * @GS_APP_QUIRK_UNUSABLE_DURING_UPDATE:The device is unusable whilst the action is performed + * @GS_APP_QUIRK_DEVELOPER_VERIFIED: The app developer has been verified + * @GS_APP_QUIRK_PARENTAL_FILTER: The app has been filtered by parental controls, and should be hidden + * @GS_APP_QUIRK_NEW_PERMISSIONS: The update requires new permissions + * @GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE: The app cannot be run by the current user due to parental controls, and should not be launchable + * @GS_APP_QUIRK_HIDE_FROM_SEARCH: The app should not be shown in search results + * @GS_APP_QUIRK_HIDE_EVERYWHERE: The app should not be shown anywhere (it’s blocklisted) + * @GS_APP_QUIRK_DO_NOT_AUTO_UPDATE: The app should not be automatically updated + * @GS_APP_QUIRK_DEVELOPMENT_SOURCE: The app is from a development source (Since: 43) + * + * The application attributes. + **/ +typedef enum { + GS_APP_QUIRK_NONE = 0, /* Since: 3.32 */ + GS_APP_QUIRK_PROVENANCE = 1 << 0, /* Since: 3.32 */ + GS_APP_QUIRK_COMPULSORY = 1 << 1, /* Since: 3.32 */ + GS_APP_QUIRK_HAS_SOURCE = 1 << 2, /* Since: 3.32 */ + GS_APP_QUIRK_IS_WILDCARD = 1 << 3, /* Since: 3.32 */ + GS_APP_QUIRK_NEEDS_REBOOT = 1 << 4, /* Since: 3.32 */ + GS_APP_QUIRK_NOT_REVIEWABLE = 1 << 5, /* Since: 3.32 */ + /* there’s a hole here where GS_APP_QUIRK_HAS_SHORTCUT used to be */ + GS_APP_QUIRK_NOT_LAUNCHABLE = 1 << 7, /* Since: 3.32 */ + GS_APP_QUIRK_NEEDS_USER_ACTION = 1 << 8, /* Since: 3.32 */ + GS_APP_QUIRK_IS_PROXY = 1 << 9, /* Since: 3.32 */ + GS_APP_QUIRK_UNUSABLE_DURING_UPDATE = 1 << 10, /* Since: 44 */ + GS_APP_QUIRK_DEVELOPER_VERIFIED = 1 << 11, /* Since: 3.32 */ + GS_APP_QUIRK_PARENTAL_FILTER = 1 << 12, /* Since: 3.32 */ + GS_APP_QUIRK_NEW_PERMISSIONS = 1 << 13, /* Since: 3.32 */ + GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE = 1 << 14, /* Since: 3.32 */ + GS_APP_QUIRK_HIDE_FROM_SEARCH = 1 << 15, /* Since: 3.32 */ + GS_APP_QUIRK_HIDE_EVERYWHERE = 1 << 16, /* Since: 3.36 */ + GS_APP_QUIRK_DO_NOT_AUTO_UPDATE = 1 << 17, /* Since: 3.36 */ + GS_APP_QUIRK_DEVELOPMENT_SOURCE = 1 << 18, /* Since: 43 */ + GS_APP_QUIRK_LAST /*< skip >*/ +} GsAppQuirk; + +#define GS_APP_INSTALL_DATE_UNSET 0 +#define GS_APP_INSTALL_DATE_UNKNOWN 1 /* 1s past the epoch */ + +/** + * GsSizeType: + * @GS_SIZE_TYPE_UNKNOWN: Size is unknown + * @GS_SIZE_TYPE_UNKNOWABLE: Size is unknown and is impossible to calculate + * @GS_SIZE_TYPE_VALID: Size is known and valid + * + * Types of download or file size for applications. + * + * These are used to represent the validity of properties like + * #GsApp:size-download. + * + * Since: 43 + */ +typedef enum { + GS_SIZE_TYPE_UNKNOWN, + GS_SIZE_TYPE_UNKNOWABLE, + GS_SIZE_TYPE_VALID, +} GsSizeType; + +/** + * GsAppQuality: + * @GS_APP_QUALITY_UNKNOWN: The quality value is unknown + * @GS_APP_QUALITY_LOWEST: Lowest quality + * @GS_APP_QUALITY_NORMAL: Normal quality + * @GS_APP_QUALITY_HIGHEST: Highest quality + * + * Any awards given to the application. + **/ +typedef enum { + GS_APP_QUALITY_UNKNOWN, + GS_APP_QUALITY_LOWEST, + GS_APP_QUALITY_NORMAL, + GS_APP_QUALITY_HIGHEST, + GS_APP_QUALITY_LAST /*< skip >*/ +} GsAppQuality; + +/** + * GsAppIconsState: + * @GS_APP_ICONS_STATE_UNKNOWN: The state of the icons is unknown + * @GS_APP_ICONS_STATE_PENDING_DOWNLOAD: Icons are in queue to be downloaded + * @GS_APP_ICONS_STATE_DOWNLOADING: Icons are downloading + * @GS_APP_ICONS_STATE_AVAILABLE: Icons are available + * + * State of the icons of the application. + * + * Since: 44 + **/ +typedef enum { + GS_APP_ICONS_STATE_UNKNOWN, + GS_APP_ICONS_STATE_PENDING_DOWNLOAD, + GS_APP_ICONS_STATE_DOWNLOADING, + GS_APP_ICONS_STATE_AVAILABLE, +} GsAppIconsState; + +/** + * GsColorScheme: + * @GS_COLOR_SCHEME_ANY: any color scheme + * @GS_COLOR_SCHEME_LIGHT: light color scheme + * @GS_COLOR_SCHEME_DARK: dark color scheme + * + * Define color scheme. + * + * Since: 47 + **/ +typedef enum { + GS_COLOR_SCHEME_ANY = 0, + GS_COLOR_SCHEME_LIGHT = 1, + GS_COLOR_SCHEME_DARK = 2 +} GsColorScheme; + +/** + * GS_APP_PROGRESS_UNKNOWN: + * + * A value returned by gs_app_get_progress() if the app’s progress is unknown + * or has a wide confidence interval. Typically this would be represented in the + * UI using a pulsing progress bar or spinner. + * + * Since: 3.38 + */ +#define GS_APP_PROGRESS_UNKNOWN G_MAXUINT + +const gchar *gs_app_state_to_string (GsAppState state); + +GsApp *gs_app_new (const gchar *id); +G_DEPRECATED_FOR(gs_app_set_from_unique_id) +GsApp *gs_app_new_from_unique_id (const gchar *unique_id); +void gs_app_set_from_unique_id (GsApp *app, + const gchar *unique_id, + AsComponentKind kind); +gchar *gs_app_to_string (GsApp *app); +void gs_app_to_string_append (GsApp *app, + GString *str); + +const gchar *gs_app_get_id (GsApp *app); +void gs_app_set_id (GsApp *app, + const gchar *id); +AsComponentKind gs_app_get_kind (GsApp *app); +void gs_app_set_kind (GsApp *app, + AsComponentKind kind); +GsAppState gs_app_get_state (GsApp *app); +void gs_app_set_state (GsApp *app, + GsAppState state); +AsComponentScope gs_app_get_scope (GsApp *app); +void gs_app_set_scope (GsApp *app, + AsComponentScope scope); +AsBundleKind gs_app_get_bundle_kind (GsApp *app); +void gs_app_set_bundle_kind (GsApp *app, + AsBundleKind bundle_kind); +GsAppSpecialKind gs_app_get_special_kind (GsApp *app); +void gs_app_set_special_kind (GsApp *app, + GsAppSpecialKind kind); +void gs_app_set_state_recover (GsApp *app); +guint gs_app_get_progress (GsApp *app); +void gs_app_set_progress (GsApp *app, + guint percentage); +gboolean gs_app_get_allow_cancel (GsApp *app); +void gs_app_set_allow_cancel (GsApp *app, + gboolean allow_cancel); +const gchar *gs_app_get_unique_id (GsApp *app); +const gchar *gs_app_get_branch (GsApp *app); +void gs_app_set_branch (GsApp *app, + const gchar *branch); +const gchar *gs_app_get_name (GsApp *app); +void gs_app_set_name (GsApp *app, + GsAppQuality quality, + const gchar *name); +const gchar *gs_app_get_renamed_from (GsApp *app); +void gs_app_set_renamed_from (GsApp *app, + const gchar *renamed_from); +const gchar *gs_app_get_source_default (GsApp *app); +void gs_app_add_source (GsApp *app, + const gchar *source); +GPtrArray *gs_app_get_sources (GsApp *app); +void gs_app_set_sources (GsApp *app, + GPtrArray *sources); +const gchar *gs_app_get_source_id_default (GsApp *app); +void gs_app_add_source_id (GsApp *app, + const gchar *source_id); +GPtrArray *gs_app_get_source_ids (GsApp *app); +void gs_app_set_source_ids (GsApp *app, + GPtrArray *source_ids); +void gs_app_clear_source_ids (GsApp *app); +const gchar *gs_app_get_project_group (GsApp *app); +void gs_app_set_project_group (GsApp *app, + const gchar *project_group); +const gchar *gs_app_get_developer_name (GsApp *app); +void gs_app_set_developer_name (GsApp *app, + const gchar *developer_name); +const gchar *gs_app_get_agreement (GsApp *app); +void gs_app_set_agreement (GsApp *app, + const gchar *agreement); +const gchar *gs_app_get_version (GsApp *app); +const gchar *gs_app_get_version_ui (GsApp *app); +void gs_app_set_version (GsApp *app, + const gchar *version); +const gchar *gs_app_get_summary (GsApp *app); +void gs_app_set_summary (GsApp *app, + GsAppQuality quality, + const gchar *summary); +const gchar *gs_app_get_summary_missing (GsApp *app); +void gs_app_set_summary_missing (GsApp *app, + const gchar *summary_missing); +const gchar *gs_app_get_description (GsApp *app); +void gs_app_set_description (GsApp *app, + GsAppQuality quality, + const gchar *description); +const gchar *gs_app_get_url (GsApp *app, + AsUrlKind kind); +void gs_app_set_url (GsApp *app, + AsUrlKind kind, + const gchar *url); +const gchar *gs_app_get_url_missing (GsApp *app); +void gs_app_set_url_missing (GsApp *app, + const gchar *url); +const gchar *gs_app_get_launchable (GsApp *app, + AsLaunchableKind kind); +void gs_app_set_launchable (GsApp *app, + AsLaunchableKind kind, + const gchar *launchable); +const gchar *gs_app_get_license (GsApp *app); +gboolean gs_app_get_license_is_free (GsApp *app); +void gs_app_set_license (GsApp *app, + GsAppQuality quality, + const gchar *license); +gchar **gs_app_get_menu_path (GsApp *app); +void gs_app_set_menu_path (GsApp *app, + gchar **menu_path); +const gchar *gs_app_get_origin (GsApp *app); +void gs_app_set_origin (GsApp *app, + const gchar *origin); +const gchar *gs_app_get_origin_appstream (GsApp *app); +void gs_app_set_origin_appstream (GsApp *app, + const gchar *origin_appstream); +const gchar *gs_app_get_origin_hostname (GsApp *app); +void gs_app_set_origin_hostname (GsApp *app, + const gchar *origin_hostname); +GPtrArray *gs_app_get_screenshots (GsApp *app); +void gs_app_add_screenshot (GsApp *app, + AsScreenshot *screenshot); +AsScreenshot *gs_app_get_action_screenshot (GsApp *app); +void gs_app_set_action_screenshot (GsApp *app, + AsScreenshot *screenshot); +const gchar *gs_app_get_update_version (GsApp *app); +const gchar *gs_app_get_update_version_ui (GsApp *app); +void gs_app_set_update_version (GsApp *app, + const gchar *update_version); +const gchar *gs_app_get_update_details_markup + (GsApp *app); +void gs_app_set_update_details_markup + (GsApp *app, + const gchar *markup); +void gs_app_set_update_details_text (GsApp *app, + const gchar *text); +gboolean gs_app_get_update_details_set (GsApp *app); +AsUrgencyKind gs_app_get_update_urgency (GsApp *app); +void gs_app_set_update_urgency (GsApp *app, + AsUrgencyKind update_urgency); +GsPlugin *gs_app_dup_management_plugin (GsApp *app); +gboolean gs_app_has_management_plugin (GsApp *app, + GsPlugin *plugin); +void gs_app_set_management_plugin (GsApp *app, + GsPlugin *management_plugin); +GIcon *gs_app_get_icon_for_size (GsApp *app, + guint size, + guint scale, + const gchar *fallback_icon_name); +G_DEPRECATED_FOR(gs_app_dup_icons) +GPtrArray *gs_app_get_icons (GsApp *app); +GPtrArray *gs_app_dup_icons (GsApp *app); +gboolean gs_app_has_icons (GsApp *app); +void gs_app_add_icon (GsApp *app, + GIcon *icon); +void gs_app_remove_all_icons (GsApp *app); +GFile *gs_app_get_local_file (GsApp *app); +void gs_app_set_local_file (GsApp *app, + GFile *local_file); +AsContentRating *gs_app_dup_content_rating (GsApp *app); +void gs_app_set_content_rating (GsApp *app, + AsContentRating *content_rating); +GsApp *gs_app_get_runtime (GsApp *app); +void gs_app_set_runtime (GsApp *app, + GsApp *runtime); +const gchar *gs_app_get_metadata_item (GsApp *app, + const gchar *key); +GVariant *gs_app_get_metadata_variant (GsApp *app, + const gchar *key); +void gs_app_set_metadata (GsApp *app, + const gchar *key, + const gchar *value); +void gs_app_set_metadata_variant (GsApp *app, + const gchar *key, + GVariant *value); +gint gs_app_get_rating (GsApp *app); +void gs_app_set_rating (GsApp *app, + gint rating); +GArray *gs_app_get_review_ratings (GsApp *app); +void gs_app_set_review_ratings (GsApp *app, + GArray *review_ratings); +GPtrArray *gs_app_get_reviews (GsApp *app); +void gs_app_add_review (GsApp *app, + AsReview *review); +void gs_app_remove_review (GsApp *app, + AsReview *review); +GPtrArray *gs_app_get_provided (GsApp *app); +AsProvided *gs_app_get_provided_for_kind (GsApp *app, + AsProvidedKind kind); +void gs_app_add_provided_item (GsApp *app, + AsProvidedKind kind, + const gchar *item); +GsSizeType gs_app_get_size_installed (GsApp *app, + guint64 *size_bytes_out); +void gs_app_set_size_installed (GsApp *app, + GsSizeType size_type, + guint64 size_bytes); +GsSizeType gs_app_get_size_installed_dependencies + (GsApp *app, + guint64 *size_bytes_out); +GsSizeType gs_app_get_size_user_data (GsApp *app, + guint64 *size_bytes_out); +void gs_app_set_size_user_data (GsApp *app, + GsSizeType size_type, + guint64 size_bytes); +GsSizeType gs_app_get_size_cache_data (GsApp *app, + guint64 *size_bytes_out); +void gs_app_set_size_cache_data (GsApp *app, + GsSizeType size_type, + guint64 size_bytes); +GsSizeType gs_app_get_size_download (GsApp *app, + guint64 *size_bytes_out); +void gs_app_set_size_download (GsApp *app, + GsSizeType size_type, + guint64 size_bytes); +GsSizeType gs_app_get_size_download_dependencies + (GsApp *app, + guint64 *size_bytes_out); +void gs_app_add_related (GsApp *app, + GsApp *app2); +void gs_app_add_addons (GsApp *app, + GsAppList *addons); +void gs_app_add_history (GsApp *app, + GsApp *app2); +guint64 gs_app_get_install_date (GsApp *app); +void gs_app_set_install_date (GsApp *app, + guint64 install_date); +guint64 gs_app_get_release_date (GsApp *app); +void gs_app_set_release_date (GsApp *app, + guint64 release_date); +GPtrArray *gs_app_get_categories (GsApp *app); +void gs_app_set_categories (GsApp *app, + GPtrArray *categories); +GArray *gs_app_get_key_colors (GsApp *app); +void gs_app_set_key_colors (GsApp *app, + GArray *key_colors); +void gs_app_add_key_color (GsApp *app, + GdkRGBA *key_color); +gboolean gs_app_get_user_key_colors (GsApp *app); +void gs_app_set_key_color_for_color_scheme + (GsApp *app, + GsColorScheme for_color_scheme, + const GdkRGBA *rgba); +gboolean gs_app_get_key_color_for_color_scheme + (GsApp *app, + GsColorScheme for_color_scheme, + GdkRGBA *out_rgba); +G_DEPRECATED +void gs_app_set_is_update_downloaded (GsApp *app, + gboolean is_update_downloaded); +G_DEPRECATED +gboolean gs_app_get_is_update_downloaded (GsApp *app); + +gboolean gs_app_has_category (GsApp *app, + const gchar *category); +void gs_app_add_category (GsApp *app, + const gchar *category); +gboolean gs_app_remove_category (GsApp *app, + const gchar *category); +void gs_app_add_kudo (GsApp *app, + GsAppKudo kudo); +void gs_app_remove_kudo (GsApp *app, + GsAppKudo kudo); +gboolean gs_app_has_kudo (GsApp *app, + GsAppKudo kudo); +guint64 gs_app_get_kudos (GsApp *app); +guint gs_app_get_kudos_percentage (GsApp *app); +gboolean gs_app_get_to_be_installed (GsApp *app); +void gs_app_set_to_be_installed (GsApp *app, + gboolean to_be_installed); +void gs_app_set_match_value (GsApp *app, + guint match_value); +guint gs_app_get_match_value (GsApp *app); + +gboolean gs_app_has_quirk (GsApp *app, + GsAppQuirk quirk); +void gs_app_add_quirk (GsApp *app, + GsAppQuirk quirk); +void gs_app_remove_quirk (GsApp *app, + GsAppQuirk quirk); +gboolean gs_app_is_installed (GsApp *app); +gboolean gs_app_is_updatable (GsApp *app); +gchar *gs_app_dup_origin_ui (GsApp *app, + gboolean with_packaging_format); +void gs_app_set_origin_ui (GsApp *app, + const gchar *origin_ui); +gchar *gs_app_get_packaging_format (GsApp *app); +const gchar *gs_app_get_packaging_format_raw(GsApp *app); +void gs_app_subsume_metadata (GsApp *app, + GsApp *donor); +GsAppPermissions * + gs_app_dup_permissions (GsApp *app); +void gs_app_set_permissions (GsApp *app, + GsAppPermissions *permissions); +GsAppPermissions * + gs_app_dup_update_permissions (GsApp *app); +void gs_app_set_update_permissions (GsApp *app, + GsAppPermissions *update_permissions); +GPtrArray *gs_app_get_version_history (GsApp *app); +void gs_app_set_version_history (GsApp *app, + GPtrArray *version_history); +void gs_app_ensure_icons_downloaded (GsApp *app, + SoupSession *soup_session, + guint maximum_icon_size, + guint scale, + GCancellable *cancellable); + +GPtrArray *gs_app_get_relations (GsApp *app); +void gs_app_add_relation (GsApp *app, + AsRelation *relation); +void gs_app_set_relations (GsApp *app, + GPtrArray *relations); + +gboolean gs_app_get_has_translations (GsApp *app); +void gs_app_set_has_translations (GsApp *app, + gboolean has_translations); +gboolean gs_app_is_downloaded (GsApp *app); + +GsAppIconsState gs_app_get_icons_state (GsApp *app); +gboolean gs_app_is_application (GsApp *app); +void gs_app_set_mok_key_pending (GsApp *app, + gboolean mok_key_pending); +gboolean gs_app_get_mok_key_pending (GsApp *app); + +G_END_DECLS diff --git a/lib/gs-appstream.c b/lib/gs-appstream.c new file mode 100644 index 0000000..7b27b01 --- /dev/null +++ b/lib/gs-appstream.c @@ -0,0 +1,3341 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2015-2017 Richard Hughes + * Copyright (C) 2018-2019 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "gs-external-appstream-utils.h" +#include "gs-appstream.h" + +#define GS_APPSTREAM_MAX_SCREENSHOTS 5 + +/* This requires changes for https://github.com/hughsie/libxmlb/issues/120 + * The libxmlb crashes when all nodes are marked for a removal in the fixup-s + */ +#if LIBXMLB_CHECK_VERSION(0, 3, 9) +#define HAVE_FIXED_LIBXMLB 1 +#endif + +GsApp * +gs_appstream_create_app (GsPlugin *plugin, + XbSilo *silo, + XbNode *component, + const gchar *appstream_source_file, + AsComponentScope default_scope, + GError **error) +{ + GsApp *app; + g_autoptr(GsApp) app_new = NULL; + + /* The 'plugin' can be NULL, when creating app for --show-metainfo */ + g_return_val_if_fail (XB_IS_SILO (silo), NULL); + g_return_val_if_fail (XB_IS_NODE (component), NULL); + + app_new = gs_app_new (NULL); + + /* refine enough to get the unique ID */ + if (!gs_appstream_refine_app (plugin, app_new, silo, component, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID, + NULL, appstream_source_file, default_scope, error)) + return NULL; + + /* never add wildcard apps to the plugin cache, and only add to + * the cache if it’s available */ + if (gs_app_has_quirk (app_new, GS_APP_QUIRK_IS_WILDCARD) || plugin == NULL) + return g_steal_pointer (&app_new); + + if (plugin == NULL) + return g_steal_pointer (&app_new); + + /* look for existing object */ + app = gs_plugin_cache_lookup (plugin, gs_app_get_unique_id (app_new)); + if (app != NULL) + return app; + + /* use the temp object we just created */ + gs_app_set_metadata (app_new, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_plugin_cache_add (plugin, NULL, app_new); + return g_steal_pointer (&app_new); +} + +/* Helper function to do the equivalent of + * *node = xb_node_get_next (*node) + * but with correct reference counting, since xb_node_get_next() returns a new + * ref. */ +static void +node_set_to_next (XbNode **node) +{ + g_autoptr(XbNode) next_node = NULL; + + g_assert (node != NULL); + g_assert (*node != NULL); + + next_node = xb_node_get_next (*node); + g_object_unref (*node); + *node = g_steal_pointer (&next_node); +} + +/* Returns escaped text */ +static gchar * +gs_appstream_format_description_text (XbNode *node) +{ + g_autoptr(GString) str = g_string_new (NULL); + const gchar *node_text; + + if (node == NULL) + return NULL; + + node_text = xb_node_get_text (node); + if (node_text != NULL && *node_text != '\0') { + g_autofree gchar *escaped = g_markup_escape_text (node_text, -1); + gchar *r_ptr = escaped, *w_ptr = escaped; + gboolean has_space; + /* skip leading spaces */ + while (g_ascii_isspace (*r_ptr)) + r_ptr++; + /* replace consecutive white-spaces with a single space */ + for (has_space = FALSE; *r_ptr != '\0'; r_ptr++) { + if (g_ascii_isspace (*r_ptr)) { + has_space = TRUE; + } else { + if (has_space) { + *w_ptr = ' '; + w_ptr++; + has_space = FALSE; + } + if (w_ptr != r_ptr) + *w_ptr = *r_ptr; + w_ptr++; + } + } + if (has_space) { + *w_ptr = ' '; + w_ptr++; + } + if (w_ptr != r_ptr) + *w_ptr = '\0'; + g_string_append (str, escaped); + } + + for (g_autoptr(XbNode) n = xb_node_get_child (node); n != NULL; node_set_to_next (&n)) { + const gchar *start_elem = "", *end_elem = ""; + g_autofree gchar *text = NULL; + if (g_strcmp0 (xb_node_get_element (n), "em") == 0) { + start_elem = ""; + end_elem = ""; + } else if (g_strcmp0 (xb_node_get_element (n), "code") == 0) { + start_elem = ""; + end_elem = ""; + } + + /* These can be nested */ + text = gs_appstream_format_description_text (n); + if (text != NULL) { + g_string_append_printf (str, "%s%s%s", start_elem, text, end_elem); + } + + node_text = xb_node_get_tail (n); + if (node_text != NULL && *node_text != '\0') { + g_autofree gchar *escaped = g_markup_escape_text (node_text, -1); + g_string_append (str, escaped); + } + } + + if (str->len == 0) + return NULL; + + return g_string_free (g_steal_pointer (&str), FALSE); +} + +static void +format_issue_link (GString *str, + const gchar *issue_content, + AsIssueKind kind, + const gchar *url) +{ + g_autofree gchar *escaped_text = NULL; + + if (url != NULL) { + escaped_text = g_markup_printf_escaped ("
%s", + url, url, issue_content); + g_string_append (str, escaped_text); + return; + } + + switch (kind) { + case AS_ISSUE_KIND_CVE: + #define CVE_URL "https://cve.mitre.org/cgi-bin/cvename.cgi?name=" + /* @issue_content is expected to be in the form ‘CVE-2023-12345’ */ + escaped_text = g_markup_printf_escaped ("%s", + issue_content, issue_content, issue_content); + #undef CVE_URL + break; + case AS_ISSUE_KIND_GENERIC: + case AS_ISSUE_KIND_UNKNOWN: + default: + escaped_text = g_markup_escape_text (issue_content, -1); + break; + } + + g_string_append (str, escaped_text); +} + +static gchar * +gs_appstream_format_description (XbNode *description_node, + XbNode *issues_node) +{ + g_autoptr(GString) str = g_string_new (NULL); + + for (g_autoptr(XbNode) n = description_node ? xb_node_get_child (description_node) : NULL; n != NULL; node_set_to_next (&n)) { + /* support

, , ,

    ,
      and
    1. , ignore all else */ + if (g_strcmp0 (xb_node_get_element (n), "p") == 0) { + g_autofree gchar *escaped = gs_appstream_format_description_text (n); + /* Treat a self-closing paragraph (`

      `) as + * nonexistent. This is consistent with Firefox. */ + if (escaped != NULL) + g_string_append_printf (str, "%s\n\n", escaped); + } else if (g_strcmp0 (xb_node_get_element (n), "ul") == 0) { + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + for (child = xb_node_get_child (n); child != NULL; g_object_unref (child), child = g_steal_pointer (&next)) { + next = xb_node_get_next (child); + if (g_strcmp0 (xb_node_get_element (child), "li") == 0) { + g_autofree gchar *escaped = gs_appstream_format_description_text (child); + + /* Treat a self-closing `

    2. ` as an empty + * list element (equivalent to `
    3. `). + * This is consistent with Firefox. */ + g_string_append_printf (str, " • %s\n", + (escaped != NULL) ? escaped : ""); + } + } + g_string_append (str, "\n"); + } else if (g_strcmp0 (xb_node_get_element (n), "ol") == 0) { + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + guint i = 0; + for (child = xb_node_get_child (n); child != NULL; i++, g_object_unref (child), child = g_steal_pointer (&next)) { + next = xb_node_get_next (child); + if (g_strcmp0 (xb_node_get_element (child), "li") == 0) { + g_autofree gchar *escaped = gs_appstream_format_description_text (child); + + /* Treat self-closing elements as with `
        ` above. */ + g_string_append_printf (str, " %u. %s\n", + i + 1, + (escaped != NULL) ? escaped : ""); + } + } + g_string_append (str, "\n"); + } + } + + /* remove extra newlines */ + while (str->len > 0 && str->str[str->len - 1] == '\n') + g_string_truncate (str, str->len - 1); + + if (issues_node) { + /* Add a single new line to delimit the description node's text from the issues */ + if (str->len) + g_string_append_c (str, '\n'); + + for (g_autoptr(XbNode) n = xb_node_get_child (issues_node); n != NULL; node_set_to_next (&n)) { + if (g_strcmp0 (xb_node_get_element (n), "issue") == 0) { + const gchar *node_text = xb_node_get_text (n); + AsIssueKind issue_kind = as_issue_kind_from_string (xb_node_get_attr (n, "type")); + const gchar *issue_url = xb_node_get_attr (n, "url"); + + if (node_text != NULL && *node_text != '\0') { + if (str->len > 0 && str->str[str->len - 1] != '\n') + g_string_append_c (str, '\n'); + g_string_append (str, " • "); + format_issue_link (str, node_text, issue_kind, issue_url); + } + } + } + + /* remove extra newlines, in case there was no text for the issues */ + while (str->len > 0 && str->str[str->len - 1] == '\n') + g_string_truncate (str, str->len - 1); + } + + /* success */ + return g_string_free (g_steal_pointer (&str), FALSE); +} + +static gchar * +gs_appstream_build_icon_prefix (XbNode *component) +{ + const gchar *origin; + const gchar *tmp; + gint npath; + g_auto(GStrv) path = NULL; + g_autoptr(XbNode) components = NULL; + + /* no parent, e.g. AppData */ + components = xb_node_get_parent (component); + if (components == NULL) + return NULL; + + /* set explicitly */ + tmp = xb_node_query_text (components, "info/icon-prefix", NULL); + if (tmp != NULL) + return g_strdup (tmp); + + /* fall back to origin */ + origin = xb_node_get_attr (components, "origin"); + if (origin == NULL) + return NULL; + + /* no metadata */ + tmp = xb_node_query_text (components, "info/filename", NULL); + if (tmp == NULL) + return NULL; + + /* check format */ + path = g_strsplit (tmp, "/", -1); + npath = g_strv_length (path); + if (npath < 3 || + !(g_strcmp0 (path[npath-2], "xmls") == 0 || + g_strcmp0 (path[npath-2], "yaml") == 0 || + g_strcmp0 (path[npath-2], "xml") == 0)) + return NULL; + + /* fix the new path */ + g_free (path[npath-1]); + g_free (path[npath-2]); + path[npath-1] = g_strdup (origin); + path[npath-2] = g_strdup ("icons"); + return g_strjoinv ("/", path); +} + +/* This function is designed to do no disk or network I/O. */ +static AsIcon * +gs_appstream_new_icon (XbNode *component, XbNode *n, AsIconKind icon_kind, guint sz) +{ + AsIcon *icon = as_icon_new (); + g_autofree gchar *icon_path = NULL; + guint64 scale = 0; + as_icon_set_kind (icon, icon_kind); + switch (icon_kind) { + case AS_ICON_KIND_LOCAL: + as_icon_set_filename (icon, xb_node_get_text (n)); + break; + case AS_ICON_KIND_REMOTE: + as_icon_set_url (icon, xb_node_get_text (n)); + break; + default: + as_icon_set_name (icon, xb_node_get_text (n)); + } + if (sz == 0) { + guint64 width = xb_node_get_attr_as_uint (n, "width"); + if (width > 0 && width < G_MAXUINT) + sz = width; + } + + if (sz > 0) { + as_icon_set_width (icon, sz); + as_icon_set_height (icon, sz); + } + + scale = xb_node_get_attr_as_uint (n, "scale"); + if (scale > 0 && scale < G_MAXUINT) + as_icon_set_scale (icon, (guint) scale); + + if (icon_kind != AS_ICON_KIND_LOCAL && icon_kind != AS_ICON_KIND_REMOTE) { + /* add partial filename for now, we will compose the full one later */ + icon_path = gs_appstream_build_icon_prefix (component); + as_icon_set_filename (icon, icon_path); + } + return icon; +} + +static void +traverse_components_for_icons (GsApp *app, + GPtrArray *components) +{ + if (components == NULL) + return; + + for (guint i = 0; i < components->len; i++) { + XbNode *component = g_ptr_array_index (components, i); + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + for (child = xb_node_get_child (component); child != NULL; g_object_unref (child), child = g_steal_pointer (&next)) { + next = xb_node_get_next (child); + if (g_strcmp0 (xb_node_get_element (child), "icon") == 0) { + /* This code deliberately does *not* check that the icon files or theme + * icons exist, as that would mean doing disk I/O for all the apps in + * the appstream file, regardless of whether the calling code is + * actually going to use the icons. Better to add all the possible icons + * and let the calling code check which ones exist, if it needs to. */ + g_autoptr(AsIcon) as_icon = NULL; + g_autoptr(GIcon) gicon = NULL; + const gchar *icon_kind_str = xb_node_get_attr (child, "type"); + AsIconKind icon_kind = as_icon_kind_from_string (icon_kind_str); + + if (icon_kind == AS_ICON_KIND_UNKNOWN) { + g_debug ("unknown icon kind ‘%s’", icon_kind_str); + continue; + } + + as_icon = gs_appstream_new_icon (component, child, icon_kind, 0); + gicon = gs_icon_new_for_appstream_icon (as_icon); + if (gicon != NULL) + gs_app_add_icon (app, gicon); + } + } + } +} + +static gboolean +gs_appstream_refine_add_addons (GsPlugin *plugin, + GsApp *app, + XbSilo *silo, + const gchar *appstream_source_file, + AsComponentScope default_scope, + GError **error) +{ + g_autofree gchar *xpath = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) addons = NULL; + g_autoptr(GsAppList) addons_list = NULL; + AsProvided *provided; + + /* get all components */ + xpath = g_strdup_printf ("components/component/extends[text()='%s']/..", + gs_app_get_id (app)); + provided = gs_app_get_provided_for_kind (app, AS_PROVIDED_KIND_ID); + if (provided != NULL) { + GString *extended_xpath = g_string_new (xpath); + GPtrArray *items = as_provided_get_items (provided); + for (guint i = 0; i < items->len; i++) { + const gchar *id = g_ptr_array_index (items, i); + g_string_append_printf (extended_xpath, "|components/component/extends[text()='%s']", id); + } + g_free (xpath); + xpath = g_string_free (extended_xpath, FALSE); + } + addons = xb_silo_query (silo, xpath, 0, &error_local); + if (addons == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return TRUE; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + + addons_list = gs_app_list_new (); + + for (guint i = 0; i < addons->len; i++) { + XbNode *addon = g_ptr_array_index (addons, i); + g_autoptr(GsApp) addon_app = NULL; + + addon_app = gs_appstream_create_app (plugin, silo, addon, appstream_source_file, default_scope, error); + if (addon_app == NULL) + return FALSE; + + gs_app_list_add (addons_list, addon_app); + } + + gs_app_add_addons (app, addons_list); + + return TRUE; +} + +static guint64 +component_get_release_timestamp (XbNode *component) +{ + guint64 timestamp; + const gchar *date_str; + + /* Spec says to prefer `timestamp` over `date` if both are provided: + * https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-releases */ + timestamp = xb_node_query_attr_as_uint (component, "releases/release", "timestamp", NULL); + date_str = xb_node_query_attr (component, "releases/release", "date", NULL); + + if (timestamp != G_MAXUINT64) { + return timestamp; + } else if (date_str != NULL) { + g_autoptr(GDateTime) date = g_date_time_new_from_iso8601 (date_str, NULL); + if (date != NULL) + return g_date_time_to_unix (date); + } + + /* Unknown. */ + return G_MAXUINT64; +} + +static gboolean +gs_appstream_is_recent_release (XbNode *component) +{ + guint64 ts; + gint64 secs; + + /* get newest release */ + ts = component_get_release_timestamp (component); + if (ts == G_MAXUINT64) + return FALSE; + + /* is last build less than one year ago? */ + secs = (g_get_real_time () / G_USEC_PER_SEC) - ts; + return secs / (60 * 60 * 24) < 365; +} + +static gboolean +gs_appstream_copy_metadata (GsApp *app, XbNode *component, GError **error) +{ + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) values = NULL; + + /* get all components */ + values = xb_node_query (component, "custom/value", 0, &error_local); + if (values == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return TRUE; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + for (guint i = 0; i < values->len; i++) { + XbNode *value = g_ptr_array_index (values, i); + const gchar *key = xb_node_get_attr (value, "key"); + if (key == NULL) + continue; + if (gs_app_get_metadata_item (app, key) != NULL) + continue; + gs_app_set_metadata (app, key, xb_node_get_text (value)); + } + return TRUE; +} + +/** + * _gs_utils_locale_has_translations: + * @locale: A locale, e.g. `en_GB` or `uz_UZ.utf8@cyrillic` + * + * Looks up if the locale is likely to have translations. + * + * Returns: %TRUE if the locale should have translations + **/ +static gboolean +_gs_utils_locale_has_translations (const gchar *locale) +{ + g_autofree gchar *locale_copy = g_strdup (locale); + gchar *separator; + + /* Strip off the territory, codeset and modifier, if present. */ + separator = strpbrk (locale_copy, "_.@"); + if (separator != NULL) + *separator = '\0'; + + if (g_strcmp0 (locale_copy, "C") == 0) + return FALSE; + if (g_strcmp0 (locale_copy, "en") == 0) + return FALSE; + return TRUE; +} + +static gboolean +gs_appstream_origin_valid (const gchar *origin) +{ + if (origin == NULL) + return FALSE; + if (g_strcmp0 (origin, "") == 0) + return FALSE; + return TRUE; +} + +static gboolean +gs_appstream_is_valid_project_group (const gchar *project_group) +{ + if (project_group == NULL) + return FALSE; + return as_utils_is_desktop_environment (project_group); +} + +static gboolean +gs_appstream_refine_app_relation (GsApp *app, + XbNode *relation_node, + AsRelationKind kind, + GError **error) +{ + g_autoptr(GPtrArray) relations = NULL; + + /* Iterate over the children, which might be any combination of zero or + * more , , , , , + * or elements. For the moment, we only + * support some of these. */ + for (g_autoptr(XbNode) child = xb_node_get_child (relation_node); child != NULL; node_set_to_next (&child)) { + const gchar *item_kind = xb_node_get_element (child); + g_autoptr(AsRelation) relation = as_relation_new (); + + as_relation_set_kind (relation, kind); + + if (g_str_equal (item_kind, "control")) { + /* https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-relations-control */ + as_relation_set_item_kind (relation, AS_RELATION_ITEM_KIND_CONTROL); + as_relation_set_value_control_kind (relation, as_control_kind_from_string (xb_node_get_text (child))); + } else if (g_str_equal (item_kind, "display_length")) { + const gchar *compare; + const gchar *side; +#if !AS_CHECK_VERSION(1, 0, 0) + AsDisplayLengthKind display_length_kind; +#endif + + /* https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-relations-display_length */ + as_relation_set_item_kind (relation, AS_RELATION_ITEM_KIND_DISPLAY_LENGTH); + + compare = xb_node_get_attr (child, "compare"); + as_relation_set_compare (relation, (compare != NULL) ? as_relation_compare_from_string (compare) : AS_RELATION_COMPARE_GE); + +#if AS_CHECK_VERSION(1, 0, 0) + side = xb_node_get_attr (child, "side"); + as_relation_set_display_side_kind (relation, (side != NULL) ? as_display_side_kind_from_string (side) : AS_DISPLAY_SIDE_KIND_SHORTEST); + as_relation_set_value_px (relation, xb_node_get_text_as_uint (child)); +#else + display_length_kind = as_display_length_kind_from_string (xb_node_get_text (child)); + if (display_length_kind != AS_DISPLAY_LENGTH_KIND_UNKNOWN) { + /* Ignore the `side` attribute */ + as_relation_set_value_display_length_kind (relation, display_length_kind); + } else { + side = xb_node_get_attr (child, "side"); + as_relation_set_display_side_kind (relation, (side != NULL) ? as_display_side_kind_from_string (side) : AS_DISPLAY_SIDE_KIND_SHORTEST); + as_relation_set_value_px (relation, xb_node_get_text_as_uint (child)); + } +#endif + } else if (g_str_equal (item_kind, "id")) { + if (kind == AS_RELATION_KIND_REQUIRES && + g_strcmp0 (xb_node_get_attr (child, "type"), "id") == 0 && + g_strcmp0 (xb_node_get_text (child), "org.gnome.Software.desktop") == 0) { + /* is compatible */ + gint rc = gs_utils_compare_versions (xb_node_get_attr (child, "version"), PACKAGE_VERSION); + if (rc > 0) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "not for this gnome-software"); + return FALSE; + } + } + } else { + g_debug ("Relation type ‘%s’ not currently supported for %s; ignoring", + item_kind, gs_app_get_id (app)); + continue; + } + + if (relations == NULL) + relations = g_ptr_array_new_with_free_func (g_object_unref); + g_ptr_array_add (relations, g_steal_pointer (&relation)); + } + + gs_app_set_relations (app, relations); + + return TRUE; +} + +static void +gs_appstream_find_description_and_issues_nodes (XbNode *release_node, + XbNode **out_description_node, /* (out) (transfer full) */ + XbNode **out_issues_node) /* (out) (transfer full) */ +{ + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + g_autoptr(XbNode) description_node = NULL; + g_autoptr(XbNode) issues_node = NULL; + + for (child = xb_node_get_child (release_node); + child != NULL && (description_node == NULL || issues_node == NULL); + g_object_unref (child), child = g_steal_pointer (&next)) { + next = xb_node_get_next (child); + if (description_node == NULL && g_strcmp0 (xb_node_get_element (child), "description") == 0) { + description_node = g_object_ref (child); + } else if (issues_node == NULL && g_strcmp0 (xb_node_get_element (child), "issues") == 0) { + issues_node = g_object_ref (child); + } + } + + if (out_description_node) + *out_description_node = g_steal_pointer (&description_node); + if (out_issues_node) + *out_issues_node = g_steal_pointer (&issues_node); +} + +typedef enum { + ELEMENT_KIND_UNKNOWN = -1, + ELEMENT_KIND_BRANDING, + ELEMENT_KIND_BUNDLE, + ELEMENT_KIND_CATEGORIES, + ELEMENT_KIND_CONTENT_RATING, + ELEMENT_KIND_CUSTOM, + ELEMENT_KIND_DESCRIPTION, + ELEMENT_KIND_DEVELOPER_NAME, + ELEMENT_KIND_DEVELOPER, + ELEMENT_KIND_ICON, + ELEMENT_KIND_ID, + ELEMENT_KIND_INFO, + ELEMENT_KIND_KEYWORDS, + ELEMENT_KIND_KUDOS, + ELEMENT_KIND_LANGUAGES, + ELEMENT_KIND_LAUNCHABLE, + ELEMENT_KIND_METADATA_LICENSE, + ELEMENT_KIND_NAME, + ELEMENT_KIND_PKGNAME, + ELEMENT_KIND_PROJECT_GROUP, + ELEMENT_KIND_PROJECT_LICENSE, + ELEMENT_KIND_PROVIDES, + ELEMENT_KIND_RECOMMENDS, + ELEMENT_KIND_RELEASES, + ELEMENT_KIND_REQUIRES, + ELEMENT_KIND_SCREENSHOTS, + ELEMENT_KIND_SUMMARY, + ELEMENT_KIND_SUPPORTS, + ELEMENT_KIND_URL +} ElementKind; + +/* This is not for speed, but to not accidentally have checked for the element name twice in the block */ +static ElementKind +gs_appstream_get_element_kind (const gchar *element_name) +{ + struct { + const gchar *name; + ElementKind kind; + } kinds[] = { + { "branding", ELEMENT_KIND_BRANDING }, + { "bundle", ELEMENT_KIND_BUNDLE }, + { "categories", ELEMENT_KIND_CATEGORIES }, + { "content_rating", ELEMENT_KIND_CONTENT_RATING }, + { "custom", ELEMENT_KIND_CUSTOM }, + { "description", ELEMENT_KIND_DESCRIPTION }, + { "developer", ELEMENT_KIND_DEVELOPER }, + { "developer_name", ELEMENT_KIND_DEVELOPER_NAME }, + { "icon", ELEMENT_KIND_ICON }, + { "id", ELEMENT_KIND_ID }, + { "info", ELEMENT_KIND_INFO }, + { "keywords", ELEMENT_KIND_KEYWORDS }, + { "kudos", ELEMENT_KIND_KUDOS }, + { "languages", ELEMENT_KIND_LANGUAGES }, + { "launchable", ELEMENT_KIND_LAUNCHABLE }, + { "metadata_license", ELEMENT_KIND_METADATA_LICENSE }, + { "name", ELEMENT_KIND_NAME }, + { "pkgname", ELEMENT_KIND_PKGNAME }, + { "project_group", ELEMENT_KIND_PROJECT_GROUP }, + { "project_license", ELEMENT_KIND_PROJECT_LICENSE }, + { "provides", ELEMENT_KIND_PROVIDES }, + { "recommends", ELEMENT_KIND_RECOMMENDS }, + { "releases", ELEMENT_KIND_RELEASES }, + { "requires", ELEMENT_KIND_REQUIRES }, + { "screenshots", ELEMENT_KIND_SCREENSHOTS }, + { "summary", ELEMENT_KIND_SUMMARY }, + { "supports", ELEMENT_KIND_SUPPORTS }, + { "url", ELEMENT_KIND_URL } + }; + for (guint i = 0; i < G_N_ELEMENTS (kinds); i++) { + if (g_strcmp0 (element_name, kinds[i].name) == 0) + return kinds[i].kind; + } + return ELEMENT_KIND_UNKNOWN; +} + +gboolean +gs_appstream_refine_app (GsPlugin *plugin, + GsApp *app, + XbSilo *silo, + XbNode *component, + GsPluginRefineFlags refine_flags, + GHashTable *installed_by_desktopid, + const gchar *appstream_source_file, + AsComponentScope default_scope, + GError **error) +{ + GsAppQuality name_quality = GS_APP_QUALITY_HIGHEST; + const gchar *tmp; + const gchar *developer_name_fallback = NULL; + gboolean has_name = FALSE, has_metadata_license = FALSE; + gboolean had_icons, had_sources; + gboolean locale_has_translations = FALSE; + g_autoptr(GPtrArray) legacy_pkgnames = NULL; + g_autoptr(XbNode) launchable_desktop_id = NULL; + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + + /* The 'plugin' can be NULL, when creating app for --show-metainfo */ + g_return_val_if_fail (GS_IS_APP (app), FALSE); + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (XB_IS_NODE (component), FALSE); + + had_icons = gs_app_has_icons (app); + had_sources = gs_app_get_sources (app)->len > 0; + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) != 0) { + tmp = setlocale (LC_MESSAGES, NULL); + locale_has_translations = _gs_utils_locale_has_translations (tmp); + } + + /* set id kind */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN || + gs_app_get_kind (app) == AS_COMPONENT_KIND_GENERIC) { + AsComponentKind kind; + tmp = xb_node_get_attr (component, "type"); + kind = as_component_kind_from_string (tmp); + if (kind != AS_COMPONENT_KIND_UNKNOWN) + gs_app_set_kind (app, kind); + } + + /* types we can never launch */ + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_REPOSITORY: + /* plugins may know better name, than what there's set in the appstream for the repos */ + name_quality = GS_APP_QUALITY_NORMAL; + /* fall-through */ + case AS_COMPONENT_KIND_ADDON: + case AS_COMPONENT_KIND_CODEC: + case AS_COMPONENT_KIND_DRIVER: + case AS_COMPONENT_KIND_FIRMWARE: + case AS_COMPONENT_KIND_FONT: + case AS_COMPONENT_KIND_GENERIC: + case AS_COMPONENT_KIND_INPUT_METHOD: + case AS_COMPONENT_KIND_LOCALIZATION: + case AS_COMPONENT_KIND_OPERATING_SYSTEM: + case AS_COMPONENT_KIND_RUNTIME: + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + break; + default: + break; + } + + /* check if the special metadata affects the not-launchable quirk */ + tmp = gs_app_get_metadata_item (app, "GnomeSoftware::quirks::not-launchable"); + if (tmp != NULL) { + if (g_strcmp0 (tmp, "true") == 0) + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + else if (g_strcmp0 (tmp, "false") == 0) + gs_app_remove_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + } + + tmp = gs_app_get_metadata_item (app, "GnomeSoftware::quirks::hide-everywhere"); + if (tmp != NULL) { + if (g_strcmp0 (tmp, "true") == 0) + gs_app_add_quirk (app, GS_APP_QUIRK_HIDE_EVERYWHERE); + else if (g_strcmp0 (tmp, "false") == 0) + gs_app_remove_quirk (app, GS_APP_QUIRK_HIDE_EVERYWHERE); + } + + tmp = gs_app_get_metadata_item (app, "flathub::verification::verified"); + if (g_strcmp0 (tmp, "true") == 0) + gs_app_add_quirk (app, GS_APP_QUIRK_DEVELOPER_VERIFIED); + else + gs_app_remove_quirk (app, GS_APP_QUIRK_DEVELOPER_VERIFIED); + + legacy_pkgnames = g_ptr_array_new_with_free_func (g_object_unref); + + for (child = xb_node_get_child (component); child != NULL; g_object_unref (child), child = g_steal_pointer (&next)) { + next = xb_node_get_next (child); + + switch (gs_appstream_get_element_kind (xb_node_get_element (child))) { + default: + case ELEMENT_KIND_UNKNOWN: + break; + case ELEMENT_KIND_BRANDING: + { + g_autoptr(XbNode) branding_child = NULL; + g_autoptr(XbNode) branding_next = NULL; + for (branding_child = xb_node_get_child (child); + branding_child != NULL; + g_object_unref (branding_child), branding_child = g_steal_pointer (&branding_next)) { + branding_next = xb_node_get_next (branding_child); + if (g_strcmp0 (xb_node_get_element (branding_child), "color") == 0) { + const gchar *type = xb_node_get_attr (branding_child, "type"); + if (g_strcmp0 (type, "primary") == 0) { + const gchar *color = xb_node_get_text (branding_child); + GdkRGBA rgba; + if (color != NULL && gdk_rgba_parse (&rgba, color)) { + const gchar *scheme_preference = xb_node_get_attr (branding_child, "scheme_preference"); + GsColorScheme color_scheme = GS_COLOR_SCHEME_ANY; + + if (g_strcmp0 (scheme_preference, "light") == 0) + color_scheme = GS_COLOR_SCHEME_LIGHT; + else if (g_strcmp0 (scheme_preference, "dark") == 0) + color_scheme = GS_COLOR_SCHEME_DARK; + + gs_app_set_key_color_for_color_scheme (app, color_scheme, &rgba); + } + } + } + } + } + break; + case ELEMENT_KIND_BUNDLE: + if (!had_sources) { + const gchar *kind = xb_node_get_attr (child, "type"); + const gchar *bundle_id = xb_node_get_text (child); + + if (bundle_id == NULL || kind == NULL) + continue; + + gs_app_add_source (app, bundle_id); + gs_app_set_bundle_kind (app, as_bundle_kind_from_string (kind)); + + /* get the type/name/arch/branch */ + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_FLATPAK) { + g_auto(GStrv) split = g_strsplit (bundle_id, "/", -1); + if (g_strv_length (split) != 4) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "invalid ID %s for a flatpak ref", + bundle_id); + return FALSE; + } + + /* we only need the branch for the unique ID */ + gs_app_set_branch (app, split[3]); + } + } + break; + case ELEMENT_KIND_CATEGORIES: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES) != 0) { + g_autoptr(XbNode) cat_child = NULL; + g_autoptr(XbNode) cat_next = NULL; + for (cat_child = xb_node_get_child (child); cat_child != NULL; g_object_unref (cat_child), cat_child = g_steal_pointer (&cat_next)) { + cat_next = xb_node_get_next (cat_child); + if (g_strcmp0 (xb_node_get_element (cat_child), "category") == 0) { + tmp = xb_node_get_text (cat_child); + if (tmp != NULL) { + gs_app_add_category (app, tmp); + + /* Special case: We used to use the `Blacklisted` + * category to hide apps from their .desktop + * file or appdata. We now use a quirk for that. + * This special case can be removed when all + * appstream files no longer use the `Blacklisted` + * category (including external-appstream files + * put together by distributions). */ + if (g_strcmp0 (tmp, "Blacklisted") == 0) + gs_app_add_quirk (app, GS_APP_QUIRK_HIDE_EVERYWHERE); + + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) != 0 && + !gs_app_has_kudo (app, GS_APP_KUDO_FEATURED_RECOMMENDED) && + g_strcmp0 (tmp, "Featured") == 0) + gs_app_add_kudo (app, GS_APP_KUDO_FEATURED_RECOMMENDED); + } + } + } + } + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) != 0 && + !gs_app_has_kudo (app, GS_APP_KUDO_FEATURED_RECOMMENDED)) { + g_autoptr(XbNode) cat_child = NULL; + g_autoptr(XbNode) cat_next = NULL; + for (cat_child = xb_node_get_child (child); cat_child != NULL; g_object_unref (cat_child), cat_child = g_steal_pointer (&cat_next)) { + cat_next = xb_node_get_next (cat_child); + if (g_strcmp0 (xb_node_get_element (cat_child), "category") == 0) { + tmp = xb_node_get_text (cat_child); + if (g_strcmp0 (tmp, "Featured") == 0) { + gs_app_add_kudo (app, GS_APP_KUDO_FEATURED_RECOMMENDED); + break; + } + } + } + } + break; + case ELEMENT_KIND_CONTENT_RATING: { + g_autoptr(AsContentRating) content_rating = gs_app_dup_content_rating (app); + if (content_rating == NULL) { + const gchar *content_rating_kind = NULL; + + /* get kind */ + content_rating_kind = xb_node_get_attr (child, "type"); + /* we only really expect/support OARS 1.0 and 1.1 */ + if (g_strcmp0 (content_rating_kind, "oars-1.0") == 0 || + g_strcmp0 (content_rating_kind, "oars-1.1") == 0) { + g_autoptr(AsContentRating) cr = as_content_rating_new (); + g_autoptr(XbNode) cr_child = NULL; + g_autoptr(XbNode) cr_next = NULL; + + as_content_rating_set_kind (cr, content_rating_kind); + for (cr_child = xb_node_get_child (child); cr_child != NULL; g_object_unref (cr_child), cr_child = g_steal_pointer (&cr_next)) { + cr_next = xb_node_get_next (cr_child); + if (g_strcmp0 (xb_node_get_element (cr_child), "content_attribute") == 0) { + as_content_rating_add_attribute (cr, + xb_node_get_attr (cr_child, "id"), + as_content_rating_value_from_string (xb_node_get_text (cr_child))); + } + } + if (cr != NULL) + gs_app_set_content_rating (app, cr); + } + } + } break; + case ELEMENT_KIND_CUSTOM: { + g_autoptr(XbNode) cus_child = NULL; + g_autoptr(XbNode) cus_next = NULL; + for (cus_child = xb_node_get_child (child); cus_child != NULL; g_object_unref (cus_child), cus_child = g_steal_pointer (&cus_next)) { + const gchar *key = xb_node_get_attr (cus_child, "key"); + cus_next = xb_node_get_next (cus_child); + if (key == NULL) + continue; + if (gs_app_get_metadata_item (app, key) != NULL) + continue; + gs_app_set_metadata (app, key, xb_node_get_text (cus_child)); + } + } break; + case ELEMENT_KIND_DESCRIPTION: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION) != 0) { + g_autofree gchar *description = gs_appstream_format_description (child, NULL); + if (description != NULL) + gs_app_set_description (app, GS_APP_QUALITY_HIGHEST, description); + } + break; + case ELEMENT_KIND_DEVELOPER: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME) > 0 && + gs_app_get_developer_name (app) == NULL) { + g_autoptr(XbNode) developer_child = NULL; + g_autoptr(XbNode) developer_next = NULL; + for (developer_child = xb_node_get_child (child); + developer_child != NULL; + g_object_unref (developer_child), developer_child = g_steal_pointer (&developer_next)) { + developer_next = xb_node_get_next (developer_child); + if (g_strcmp0 (xb_node_get_element (developer_child), "name") == 0) { + tmp = xb_node_get_text (developer_child); + if (tmp != NULL) { + gs_app_set_developer_name (app, tmp); + break; + } + } + } + } + break; + case ELEMENT_KIND_DEVELOPER_NAME: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME) > 0 && + developer_name_fallback == NULL) { + developer_name_fallback = xb_node_get_text (child); + } + break; + case ELEMENT_KIND_ICON: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) != 0 && + !had_icons) { + /* This code deliberately does *not* check that the icon files or theme + * icons exist, as that would mean doing disk I/O for all the apps in + * the appstream file, regardless of whether the calling code is + * actually going to use the icons. Better to add all the possible icons + * and let the calling code check which ones exist, if it needs to. */ + const gchar *icon_kind_str = xb_node_get_attr (child, "type"); + AsIconKind icon_kind = as_icon_kind_from_string (icon_kind_str); + + if (icon_kind == AS_ICON_KIND_UNKNOWN) { + g_debug ("unknown icon kind ‘%s’", icon_kind_str); + } else { + g_autoptr(GIcon) gicon = NULL; + g_autoptr(AsIcon) as_icon = NULL; + as_icon = gs_appstream_new_icon (component, child, icon_kind, 0); + gicon = gs_icon_new_for_appstream_icon (as_icon); + if (gicon != NULL) + gs_app_add_icon (app, gicon); + } + } + /* HiDPI icon */ + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) != 0 && + !gs_app_has_kudo (app, GS_APP_KUDO_HI_DPI_ICON) && + xb_node_get_attr_as_uint (child, "width") == 128) { + gs_app_add_kudo (app, GS_APP_KUDO_HI_DPI_ICON); + } + break; + case ELEMENT_KIND_ID: + if (gs_app_get_id (app) == NULL) { + tmp = xb_node_get_text (child); + if (tmp != NULL) + gs_app_set_id (app, tmp); + } + break; + case ELEMENT_KIND_INFO: + if (gs_app_get_metadata_item (app, "appstream::source-file") == NULL) { + g_autoptr(XbNode) info_child = NULL; + g_autoptr(XbNode) info_next = NULL; + for (info_child = xb_node_get_child (child); info_child != NULL; g_object_unref (info_child), info_child = g_steal_pointer (&info_next)) { + info_next = xb_node_get_next (info_child); + if (g_strcmp0 (xb_node_get_element (info_child), "filename") == 0) { + tmp = xb_node_get_text (info_child); + if (tmp != NULL) + gs_app_set_metadata (app, "appstream::source-file", tmp); + break; + } + } + } + break; + case ELEMENT_KIND_KEYWORDS: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) != 0 && + !gs_app_has_kudo (app, GS_APP_KUDO_HAS_KEYWORDS)) { + g_autoptr(XbNode) kw_child = NULL; + g_autoptr(XbNode) kw_next = NULL; + for (kw_child = xb_node_get_child (child); kw_child != NULL; g_object_unref (kw_child), kw_child = g_steal_pointer (&kw_next)) { + kw_next = xb_node_get_next (kw_child); + if (g_strcmp0 (xb_node_get_element (kw_child), "keyword") == 0) { + gs_app_add_kudo (app, GS_APP_KUDO_HAS_KEYWORDS); + break; + } + } + } + break; + case ELEMENT_KIND_KUDOS: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) != 0 && + !gs_app_has_kudo (app, GS_APP_KUDO_FEATURED_RECOMMENDED)) { + g_autoptr(XbNode) kudos_child = NULL; + g_autoptr(XbNode) kudos_next = NULL; + for (kudos_child = xb_node_get_child (child); kudos_child != NULL; g_object_unref (kudos_child), kudos_child = g_steal_pointer (&kudos_next)) { + kudos_next = xb_node_get_next (kudos_child); + if (g_strcmp0 (xb_node_get_element (kudos_child), "GnomeSoftware::popular") == 0) { + gs_app_add_kudo (app, GS_APP_KUDO_FEATURED_RECOMMENDED); + break; + } + } + } + break; + case ELEMENT_KIND_LANGUAGES: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) != 0) { + if (!locale_has_translations) + gs_app_add_kudo (app, GS_APP_KUDO_MY_LANGUAGE); + + if (!gs_app_get_has_translations (app) && + !gs_app_has_kudo (app, GS_APP_KUDO_MY_LANGUAGE)) { + g_autoptr(XbNode) langs_child = NULL; + g_autoptr(XbNode) langs_next = NULL; + g_auto(GStrv) variants = g_get_locale_variants (setlocale (LC_MESSAGES, NULL)); + + for (langs_child = xb_node_get_child (child); langs_child != NULL; g_object_unref (langs_child), langs_child = g_steal_pointer (&langs_next)) { + langs_next = xb_node_get_next (langs_child); + if (g_strcmp0 (xb_node_get_element (langs_child), "lang") == 0) { + tmp = xb_node_get_text (langs_child); + if (tmp != NULL) { + gboolean is_variant = FALSE; + + /* Set this under the FLAGS_REQUIRE_KUDOS flag because it’s + * only useful in combination with KUDO_MY_LANGUAGE */ + gs_app_set_has_translations (app, TRUE); + + for (gsize j = 0; variants[j]; j++) { + if (g_strcmp0 (tmp, variants[j]) == 0) { + is_variant = TRUE; + break; + } + } + if (is_variant && xb_node_get_attr_as_uint (langs_child, "percentage") > 50) { + gs_app_add_kudo (app, GS_APP_KUDO_MY_LANGUAGE); + break; + } + } + } + } + } + } + break; + case ELEMENT_KIND_LAUNCHABLE: { + const gchar *kind = xb_node_get_attr (child, "type"); + if (g_strcmp0 (kind, "desktop-id") == 0) { + gs_app_set_launchable (app, + AS_LAUNCHABLE_KIND_DESKTOP_ID, + xb_node_get_text (child)); + g_set_object (&launchable_desktop_id, child); + } else if (g_strcmp0 (kind, "url") == 0) { + gs_app_set_launchable (app, + AS_LAUNCHABLE_KIND_URL, + xb_node_get_text (child)); + } + } break; + case ELEMENT_KIND_METADATA_LICENSE: + has_metadata_license = TRUE; + break; + case ELEMENT_KIND_NAME: + tmp = xb_node_get_text (child); + if (tmp != NULL) { + gs_app_set_name (app, name_quality, tmp); + has_name = TRUE; + } + break; + case ELEMENT_KIND_PKGNAME: + g_ptr_array_add (legacy_pkgnames, g_object_ref (child)); + break; + case ELEMENT_KIND_PROJECT_GROUP: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROJECT_GROUP) > 0 && + gs_app_get_project_group (app) == NULL) { + tmp = xb_node_get_text (child); + if (tmp != NULL && gs_appstream_is_valid_project_group (tmp)) + gs_app_set_project_group (app, tmp); + } + break; + case ELEMENT_KIND_PROJECT_LICENSE: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) != 0 && + gs_app_get_license (app) == NULL) { + tmp = xb_node_get_text (child); + if (tmp != NULL) + gs_app_set_license (app, GS_APP_QUALITY_HIGHEST, tmp); + } + break; + case ELEMENT_KIND_PROVIDES: { + g_autoptr(XbNode) prov_child = NULL; + g_autoptr(XbNode) prov_next = NULL; + for (prov_child = xb_node_get_child (child); prov_child != NULL; g_object_unref (prov_child), prov_child = g_steal_pointer (&prov_next)) { + AsProvidedKind kind; + const gchar *element_name = xb_node_get_element (prov_child); + prov_next = xb_node_get_next (prov_child); + + /* try the simple case */ + kind = as_provided_kind_from_string (element_name); + if (kind == AS_PROVIDED_KIND_UNKNOWN) { + /* try the complex cases */ + + if (g_strcmp0 (element_name, "library") == 0) { + kind = AS_PROVIDED_KIND_LIBRARY; + } else if (g_strcmp0 (element_name, "binary") == 0) { + kind = AS_PROVIDED_KIND_BINARY; + } else if (g_strcmp0 (element_name, "firmware") == 0) { + const gchar *fw_type = xb_node_get_attr (prov_child, "type"); + if (g_strcmp0 (fw_type, "runtime") == 0) + kind = AS_PROVIDED_KIND_FIRMWARE_RUNTIME; + else if (g_strcmp0 (fw_type, "flashed") == 0) + kind = AS_PROVIDED_KIND_FIRMWARE_FLASHED; + } else if (g_strcmp0 (element_name, "python3") == 0) { + kind = AS_PROVIDED_KIND_PYTHON; + } else if (g_strcmp0 (element_name, "dbus") == 0) { + const gchar *dbus_type = xb_node_get_attr (prov_child, "type"); + if (g_strcmp0 (dbus_type, "system") == 0) + kind = AS_PROVIDED_KIND_DBUS_SYSTEM; + else if ((g_strcmp0 (dbus_type, "user") == 0) || (g_strcmp0 (dbus_type, "session") == 0)) + kind = AS_PROVIDED_KIND_DBUS_USER; + } + } + + if (kind == AS_PROVIDED_KIND_UNKNOWN || + xb_node_get_text (prov_child) == NULL) { + /* give up */ + g_debug ("ignoring unknown or empty provided item type:'%s' value:'%s'", element_name, xb_node_get_text (prov_child)); + continue; + } + + gs_app_add_provided_item (app, kind, xb_node_get_text (prov_child)); + } + } break; + case ELEMENT_KIND_RECOMMENDS: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS) != 0) { + if (!gs_appstream_refine_app_relation (app, child, AS_RELATION_KIND_RECOMMENDS, error)) + return FALSE; + } + break; + case ELEMENT_KIND_RELEASES: { + g_autoptr(GPtrArray) current_version_history = gs_app_get_version_history (app); + gboolean needs_version_history = current_version_history == NULL || current_version_history->len == 0; + gboolean needs_update_details = (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS) != 0 && + silo != NULL && gs_app_is_updatable (app); + /* set the release date */ + if (gs_app_get_release_date (app) == 0) { + g_autoptr(XbNode) release = xb_node_get_child (child); + if (release != NULL && g_strcmp0 (xb_node_get_element (release), "release") == 0) { + guint64 timestamp; + const gchar *date_str; + + /* Spec says to prefer `timestamp` over `date` if both are provided: + * https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-releases */ + timestamp = xb_node_get_attr_as_uint (release, "timestamp"); + date_str = xb_node_get_attr (release, "date"); + + if (timestamp != G_MAXUINT64) { + gs_app_set_release_date (app, timestamp); + } else if (date_str != NULL) { + g_autoptr(GDateTime) date = g_date_time_new_from_iso8601 (date_str, NULL); + if (date != NULL) + gs_app_set_release_date (app, g_date_time_to_unix (date)); + } + } + } + if (needs_version_history || needs_update_details) { + g_autoptr(GPtrArray) version_history = NULL; /* (element-type AsRelease) */ + g_autoptr(GHashTable) installed = NULL; + g_autoptr(GPtrArray) updates_list = NULL; + g_autoptr(XbNode) rels_child = NULL; + g_autoptr(XbNode) rels_next = NULL; + AsUrgencyKind urgency_best = AS_URGENCY_KIND_UNKNOWN; + guint i; + + if (needs_update_details) { + g_autofree gchar *xpath = NULL; + g_autoptr(GPtrArray) releases_inst = NULL; + g_autoptr(GError) local_error = NULL; + + installed = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); + updates_list = g_ptr_array_new_with_free_func (g_object_unref); + + /* find out which releases are already installed */ + xpath = g_strdup_printf ("component/id[text()='%s']/../releases/*[@version]", + gs_app_get_id (app)); + releases_inst = xb_silo_query (silo, xpath, 0, &local_error); + if (releases_inst == NULL) { + if (!g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { + g_propagate_error (error, g_steal_pointer (&local_error)); + return FALSE; + } + } else { + for (i = 0; i < releases_inst->len; i++) { + XbNode *release = g_ptr_array_index (releases_inst, i); + g_hash_table_insert (installed, + (gpointer) xb_node_get_attr (release, "version"), + g_object_ref (release)); + } + } + g_clear_error (&local_error); + } + + if (needs_version_history) + version_history = g_ptr_array_new_with_free_func (g_object_unref); + + for (i = 0, rels_child = xb_node_get_child (child); rels_child != NULL; + i++, g_object_unref (rels_child), rels_child = g_steal_pointer (&rels_next)) { + g_autoptr(XbNode) description_node = NULL; + g_autoptr(XbNode) issues_node = NULL; + const gchar *version; + + rels_next = xb_node_get_next (rels_child); + if (g_strcmp0 (xb_node_get_element (rels_child), "release") != 0) + continue; + + version = xb_node_get_attr (rels_child, "version"); + /* ignore releases with no version */ + if (version == NULL) + continue; + + gs_appstream_find_description_and_issues_nodes (rels_child, &description_node, &issues_node); + + if (version_history != NULL) { + g_autoptr(AsRelease) release = NULL; + g_autofree gchar *description = NULL; + guint64 timestamp; + const gchar *date_str; + + timestamp = xb_node_get_attr_as_uint (rels_child, "timestamp"); + date_str = xb_node_get_attr (rels_child, "date"); + + /* include updates with or without a description */ + if (description_node != NULL || issues_node != NULL) + description = gs_appstream_format_description (description_node, issues_node); + + release = as_release_new (); + as_release_set_version (release, version); + if (timestamp != G_MAXUINT64) + as_release_set_timestamp (release, timestamp); + else if (date_str != NULL) /* timestamp takes precedence over date */ + as_release_set_date (release, date_str); + if (description != NULL) + as_release_set_description (release, description, NULL); + + g_ptr_array_add (version_history, g_steal_pointer (&release)); + } + + if (needs_update_details) { + AsUrgencyKind urgency_tmp; + + /* already installed */ + if (g_hash_table_lookup (installed, version) != NULL) + continue; + + /* limit this to three versions backwards if there has never + * been a detected installed version */ + if (g_hash_table_size (installed) == 0 && i >= 3) + continue; + + /* use the 'worst' urgency, e.g. critical over enhancement */ + urgency_tmp = as_urgency_kind_from_string (xb_node_get_attr (rels_child, "urgency")); + if (urgency_tmp > urgency_best) + urgency_best = urgency_tmp; + + /* add updates with a description */ + if (description_node != NULL || issues_node != NULL) + g_ptr_array_add (updates_list, g_object_ref (rels_child)); + } + } + + if (version_history != NULL && version_history->len > 0) + gs_app_set_version_history (app, version_history); + + if (needs_update_details) { + /* only set if known */ + if (urgency_best != AS_URGENCY_KIND_UNKNOWN) + gs_app_set_update_urgency (app, urgency_best); + + /* no prefix on each release */ + if (updates_list->len == 1) { + XbNode *release = g_ptr_array_index (updates_list, 0); + g_autoptr(XbNode) description_node = NULL; + g_autoptr(XbNode) issues_node = NULL; + g_autofree gchar *desc = NULL; + gs_appstream_find_description_and_issues_nodes (release, &description_node, &issues_node); + desc = gs_appstream_format_description (description_node, issues_node); + gs_app_set_update_details_markup (app, desc); + + /* get the descriptions with a version prefix */ + } else if (updates_list->len > 1) { + const gchar *version = gs_app_get_version (app); + g_autoptr(GString) update_desc = g_string_new (""); + for (guint j = 0; j < updates_list->len; j++) { + XbNode *release = g_ptr_array_index (updates_list, j); + const gchar *release_version = xb_node_get_attr (release, "version"); + g_autofree gchar *desc = NULL; + g_autoptr(XbNode) description_node = NULL; + g_autoptr(XbNode) issues_node = NULL; + + /* use the first release description, then skip the currently installed version and all below it */ + if (i != 0 && version != NULL && gs_utils_compare_versions (version, release_version) >= 0) + continue; + + gs_appstream_find_description_and_issues_nodes (release, &description_node, &issues_node); + desc = gs_appstream_format_description (description_node, issues_node); + + g_string_append_printf (update_desc, + "Version %s:\n%s\n\n", + xb_node_get_attr (release, "version"), + desc); + } + + /* remove trailing newlines */ + if (update_desc->len > 2) + g_string_truncate (update_desc, update_desc->len - 2); + if (update_desc->len > 0) + gs_app_set_update_details_markup (app, update_desc->str); + } + + /* if there is no already set update version use the newest */ + if (gs_app_get_update_version (app) == NULL && + updates_list->len > 0) { + XbNode *release = g_ptr_array_index (updates_list, 0); + gs_app_set_update_version (app, xb_node_get_attr (release, "version")); + } + } + } + } break; + case ELEMENT_KIND_REQUIRES: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS) != 0) { + if (!gs_appstream_refine_app_relation (app, child, AS_RELATION_KIND_REQUIRES, error)) + return FALSE; + } + break; + case ELEMENT_KIND_SCREENSHOTS: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS) != 0 && + gs_app_get_screenshots (app)->len == 0) { + g_autoptr(XbNode) scrs_child = NULL; + g_autoptr(XbNode) scrs_next = NULL; + for (scrs_child = xb_node_get_child (child); scrs_child != NULL; g_object_unref (scrs_child), scrs_child = g_steal_pointer (&scrs_next)) { + scrs_next = xb_node_get_next (scrs_child); + if (g_strcmp0 (xb_node_get_element (scrs_child), "screenshot") == 0) { + g_autoptr(AsScreenshot) scr = as_screenshot_new (); + g_autoptr(XbNode) scr_child = NULL; + g_autoptr(XbNode) scr_next = NULL; + gboolean any_added = FALSE; + for (scr_child = xb_node_get_child (scrs_child); scr_child != NULL; g_object_unref (scr_child), scr_child = g_steal_pointer (&scr_next)) { + scr_next = xb_node_get_next (scr_child); + if (g_strcmp0 (xb_node_get_element (scr_child), "image") == 0) { + g_autoptr(AsImage) im = as_image_new (); + as_image_set_height (im, xb_node_get_attr_as_uint (scr_child, "height")); + as_image_set_width (im, xb_node_get_attr_as_uint (scr_child, "width")); + as_image_set_kind (im, as_image_kind_from_string (xb_node_get_attr (scr_child, "type"))); + as_image_set_url (im, xb_node_get_text (scr_child)); + as_screenshot_add_image (scr, im); + any_added = TRUE; + } else if (g_strcmp0 (xb_node_get_element (scr_child), "video") == 0) { + g_autoptr(AsVideo) vid = as_video_new (); + as_video_set_height (vid, xb_node_get_attr_as_uint (scr_child, "height")); + as_video_set_width (vid, xb_node_get_attr_as_uint (scr_child, "width")); + as_video_set_codec_kind (vid, as_video_codec_kind_from_string (xb_node_get_attr (scr_child, "codec"))); + as_video_set_container_kind (vid, as_video_container_kind_from_string (xb_node_get_attr (scr_child, "container"))); + as_video_set_url (vid, xb_node_get_text (scr_child)); + as_screenshot_add_video (scr, vid); + any_added = TRUE; + } + } + if (any_added) + gs_app_add_screenshot (app, scr); + } + } + /* FIXME: move into no refine flags section? */ + if (gs_app_get_screenshots (app)->len) + gs_app_add_kudo (app, GS_APP_KUDO_HAS_SCREENSHOTS); + } + break; + case ELEMENT_KIND_SUMMARY: + tmp = xb_node_get_text (child); + if (tmp != NULL) + gs_app_set_summary (app, name_quality, tmp); + break; + case ELEMENT_KIND_SUPPORTS: + #if AS_CHECK_VERSION(0, 15, 0) + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS) != 0) { + if (!gs_appstream_refine_app_relation (app, child, AS_RELATION_KIND_SUPPORTS, error)) + return FALSE; + } + #endif + break; + case ELEMENT_KIND_URL: + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL) != 0) { + const gchar *kind = xb_node_get_attr (child, "type"); + if (kind != NULL) { + gs_app_set_url (app, + as_url_kind_from_string (kind), + xb_node_get_text (child)); + } + } + break; + } + } + + if (developer_name_fallback != NULL && + gs_app_get_developer_name (app) == NULL) { + gs_app_set_developer_name (app, developer_name_fallback); + } + + /* try to detect old-style AppStream 'override' + * files without the merge attribute */ + if (!has_name && !has_metadata_license) + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + + if (gs_app_get_metadata_item (app, "appstream::source-file") == NULL) { + if (appstream_source_file != NULL) { + /* empty string means the node was not found by the caller */ + if (*appstream_source_file != '\0') + gs_app_set_metadata (app, "appstream::source-file", appstream_source_file); + } else { + tmp = xb_node_query_text (component, "../info/filename", NULL); + if (tmp != NULL) + gs_app_set_metadata (app, "appstream::source-file", tmp); + } + } + + /* set scope */ + if (gs_app_get_scope (app) == AS_COMPONENT_SCOPE_UNKNOWN) { + /* all callers should provide both appstream_source_file and default_scope, thus + when the appstream_source_file the "unknown" scope means "not found in the silo" */ + if (appstream_source_file != NULL) { + if (default_scope != AS_COMPONENT_SCOPE_UNKNOWN) + gs_app_set_scope (app, default_scope); + } else { + tmp = xb_node_query_text (component, "../info/scope", NULL); + if (tmp != NULL) + gs_app_set_scope (app, as_component_scope_from_string (tmp)); + } + } + + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) != 0 && + !had_icons && !gs_app_has_icons (app)) { + /* If no icon found, try to inherit the icon from the .desktop file */ + g_autofree gchar *xpath = NULL; + if (launchable_desktop_id != NULL) { + const gchar *launchable_id = xb_node_get_text (launchable_desktop_id); + if (launchable_id != NULL) { + if (installed_by_desktopid != NULL) { + GPtrArray *components = g_hash_table_lookup (installed_by_desktopid, launchable_id); + traverse_components_for_icons (app, components); + } else { + g_autoptr(GPtrArray) components = NULL; + xpath = g_strdup_printf ("/component[@type='desktop-application']/launchable[@type='desktop-id'][text()='%s']/..", + launchable_id); + components = xb_silo_query (silo, xpath, 0, NULL); + traverse_components_for_icons (app, components); + g_clear_pointer (&xpath, g_free); + } + } + } + + if (installed_by_desktopid != NULL) { + GPtrArray *components = g_hash_table_lookup (installed_by_desktopid, gs_app_get_id (app)); + traverse_components_for_icons (app, components); + } else { + g_autoptr(GPtrArray) components = NULL; + xpath = g_strdup_printf ("/component[@type='desktop-application']/launchable[@type='desktop-id'][text()='%s']/..", + gs_app_get_id (app)); + components = xb_silo_query (silo, xpath, 0, NULL); + traverse_components_for_icons (app, components); + } + } + + /* add legacy package names */ + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_UNKNOWN && + legacy_pkgnames->len > 0 && gs_app_get_sources (app)->len == 0) { + for (guint i = 0; i < legacy_pkgnames->len; i++) { + XbNode *pkgname = g_ptr_array_index (legacy_pkgnames, i); + tmp = xb_node_get_text (pkgname); + if (tmp != NULL && tmp[0] != '\0') + gs_app_add_source (app, tmp); + } + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + } + + /* set origin */ + if (gs_app_get_origin_appstream (app) == NULL || (gs_app_get_origin (app) == NULL && ( + gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_FLATPAK || + gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_PACKAGE))) { + g_autoptr(XbNode) parent = xb_node_get_parent (component); + tmp = NULL; + if (parent != NULL) { + tmp = xb_node_get_attr (parent, "origin"); + if (gs_appstream_origin_valid (tmp)) { + if (gs_app_get_origin_appstream (app) == NULL) + gs_app_set_origin_appstream (app, tmp); + + if (gs_app_get_origin (app) == NULL && ( + gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_FLATPAK || + gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_PACKAGE)) { + gs_app_set_origin (app, tmp); + } + } + } + } + + /* set addons */ + if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS) != 0 && + plugin != NULL && silo != NULL) { + if (!gs_appstream_refine_add_addons (plugin, app, silo, appstream_source_file, default_scope, error)) + return FALSE; + } + + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) { + if (!locale_has_translations) + gs_app_add_kudo (app, GS_APP_KUDO_MY_LANGUAGE); + + /* was this app released recently */ + if (gs_appstream_is_recent_release (component)) + gs_app_add_kudo (app, GS_APP_KUDO_RECENT_RELEASE); + } + + return TRUE; +} + +static void +gs_appstream_read_silo_info_from_component (XbNode *component, + gchar **out_silo_filename, + AsComponentScope *out_scope) +{ + const gchar *tmp; + + g_return_if_fail (component != NULL); + if (out_silo_filename != NULL) { + *out_silo_filename = NULL; + + tmp = xb_node_query_text (component, "info/filename", NULL); + if (tmp == NULL) + tmp = xb_node_query_text (component, "../info/filename", NULL); + if (tmp != NULL) + *out_silo_filename = g_strdup (tmp); + } + + if (out_scope) { + tmp = xb_node_query_text (component, "../info/scope", NULL); + if (tmp != NULL) + *out_scope = as_component_scope_from_string (tmp); + else + *out_scope = AS_COMPONENT_SCOPE_UNKNOWN; + } +} + +typedef struct { + guint16 match_value; + XbQuery *query; +} GsAppstreamSearchHelper; + +static void +gs_appstream_search_helper_free (GsAppstreamSearchHelper *helper) +{ + g_object_unref (helper->query); + g_free (helper); +} + +static guint16 +gs_appstream_silo_search_component2 (GPtrArray *array, XbNode *component, const gchar *search) +{ + guint16 match_value = 0; + + /* do searches */ + for (guint i = 0; i < array->len; i++) { + g_autoptr(GPtrArray) n = NULL; + GsAppstreamSearchHelper *helper = g_ptr_array_index (array, i); + g_auto(XbQueryContext) context = XB_QUERY_CONTEXT_INIT (); + xb_value_bindings_bind_str (xb_query_context_get_bindings (&context), 0, search, NULL); + n = xb_node_query_with_context (component, helper->query, &context, NULL); + if (n != NULL) + match_value |= helper->match_value; + } + return match_value; +} + +static guint16 +gs_appstream_silo_search_component (GPtrArray *array, XbNode *component, const gchar * const *search) +{ + guint16 matches_sum = 0; + + /* do *all* search keywords match */ + for (guint i = 0; search[i] != NULL; i++) { + guint tmp = gs_appstream_silo_search_component2 (array, component, search[i]); + if (tmp == 0) + return 0; + matches_sum |= tmp; + } + return matches_sum; +} + +typedef struct { + guint16 match_value; + const gchar *xpath; +} Query; + +static gboolean +gs_appstream_do_search (GsPlugin *plugin, + XbSilo *silo, + const gchar * const *values, + const Query queries[], + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + AsComponentScope default_scope = AS_COMPONENT_SCOPE_UNKNOWN; + g_autofree gchar *silo_filename = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) array = g_ptr_array_new_with_free_func ((GDestroyNotify) gs_appstream_search_helper_free); + g_autoptr(GPtrArray) components = NULL; + g_autoptr(GTimer) timer = g_timer_new (); +#if AS_CHECK_VERSION(1, 0, 0) + const guint16 component_id_weight = as_utils_get_tag_search_weight ("id"); +#else + const guint16 component_id_weight = AS_SEARCH_TOKEN_MATCH_ID; +#endif + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (values != NULL, FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + + /* add some weighted queries */ + for (guint i = 0; queries[i].xpath != NULL; i++) { + g_autoptr(GError) error_query = NULL; + g_autoptr(XbQuery) query = xb_query_new (silo, queries[i].xpath, &error_query); + if (query != NULL) { + GsAppstreamSearchHelper *helper = g_new0 (GsAppstreamSearchHelper, 1); + helper->match_value = queries[i].match_value; + helper->query = g_steal_pointer (&query); + g_ptr_array_add (array, helper); + } else { + g_debug ("ignoring: %s", error_query->message); + } + } + + /* get all components */ + components = xb_silo_query (silo, "components/component", 0, &error_local); + if (components == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return TRUE; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + if (components->len > 0) + gs_appstream_read_silo_info_from_component (g_ptr_array_index (components, 0), &silo_filename, &default_scope); + + for (guint i = 0; i < components->len; i++) { + XbNode *component = g_ptr_array_index (components, i); + guint16 match_value = gs_appstream_silo_search_component (array, component, values); + if (match_value != 0) { + g_autoptr(GsApp) app = gs_appstream_create_app (plugin, silo, component, silo_filename ? silo_filename : "", default_scope, error); + if (app == NULL) + return FALSE; + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) { + g_debug ("not returning wildcard %s", + gs_app_get_unique_id (app)); + continue; + } + g_debug ("add %s", gs_app_get_unique_id (app)); + + /* The match value is used for prioritising results. + * Drop the ID token from it as it’s the highest + * numeric value but isn’t visible to the user in the + * UI, which leads to confusing results ordering. */ + gs_app_set_match_value (app, match_value & (~component_id_weight)); + gs_app_list_add (list, app); + + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_ADDON) { + g_autoptr(GPtrArray) extends = NULL; + + /* add the parent app as a wildcard, to be refined later */ + extends = xb_node_query (component, "extends", 0, NULL); + for (guint jj = 0; extends && jj < extends->len; jj++) { + XbNode *extend = g_ptr_array_index (extends, jj); + g_autoptr(GsApp) app2 = NULL; + const gchar *tmp; + app2 = gs_app_new (xb_node_get_text (extend)); + gs_app_add_quirk (app2, GS_APP_QUIRK_IS_WILDCARD); + tmp = xb_node_query_attr (extend, "../..", "origin", NULL); + if (gs_appstream_origin_valid (tmp)) + gs_app_set_origin_appstream (app2, tmp); + gs_app_list_add (list, app2); + } + } + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + } + g_debug ("search took %fms", g_timer_elapsed (timer, NULL) * 1000); + return TRUE; +} + +/* This tokenises and stems @values internally for comparison against the + * already-stemmed tokens in the libxmlb silo */ +gboolean +gs_appstream_search (GsPlugin *plugin, + XbSilo *silo, + const gchar * const *values, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ +#if AS_CHECK_VERSION(1, 0, 0) + guint16 pkgname_weight = as_utils_get_tag_search_weight ("pkgname"); + guint16 name_weight = as_utils_get_tag_search_weight ("name"); + guint16 id_weight = as_utils_get_tag_search_weight ("id"); + const Query queries[] = { + { as_utils_get_tag_search_weight ("mediatype"), "provides/mediatype[text()~=stem(?)]" }, + /* Search once with a tokenize-and-casefold operator (`~=`) to support casefolded + * full-text search, then again using substring matching (`contains()`), to + * support prefix matching. Only do the prefix matches on a few fields, and at a + * lower priority, otherwise things will get confusing. + * + * See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2277 */ + { pkgname_weight, "pkgname[text()~=stem(?)]" }, + { pkgname_weight / 2, "pkgname[contains(text(),stem(?))]" }, + { as_utils_get_tag_search_weight ("summary"), "summary[text()~=stem(?)]" }, + { name_weight, "name[text()~=stem(?)]" }, + { name_weight / 2, "name[contains(text(),stem(?))]" }, + { as_utils_get_tag_search_weight ("keyword"), "keywords/keyword[text()~=stem(?)]" }, + { id_weight, "id[text()~=stem(?)]" }, + { id_weight, "launchable[text()~=stem(?)]" }, + { as_utils_get_tag_search_weight ("origin"), "../components[@origin~=stem(?)]" }, + { 0, NULL } + }; +#else + const Query queries[] = { + { AS_SEARCH_TOKEN_MATCH_MEDIATYPE, "mimetypes/mimetype[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_PKGNAME, "pkgname[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_PKGNAME / 2, "pkgname[contains(text(),stem(?))]" }, + { AS_SEARCH_TOKEN_MATCH_SUMMARY, "summary[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_NAME, "name[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_NAME / 2, "name[contains(text(),stem(?))]" }, + { AS_SEARCH_TOKEN_MATCH_KEYWORD, "keywords/keyword[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_ID, "id[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_ID, "launchable[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_ORIGIN, "../components[@origin~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_NONE, NULL } + }; +#endif + + return gs_appstream_do_search (plugin, silo, values, queries, list, cancellable, error); +} + +gboolean +gs_appstream_search_developer_apps (GsPlugin *plugin, + XbSilo *silo, + const gchar * const *values, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ +#if AS_CHECK_VERSION(1, 0, 0) + const Query queries[] = { + { as_utils_get_tag_search_weight ("pkgname"), "developer/name[text()~=stem(?)]" }, + { as_utils_get_tag_search_weight ("summary"), "project_group[text()~=stem(?)]" }, + /* for legacy support */ + { as_utils_get_tag_search_weight ("pkgname"), "developer_name[text()~=stem(?)]" }, + { 0, NULL } + }; +#else + const Query queries[] = { + { AS_SEARCH_TOKEN_MATCH_PKGNAME, "developer_name[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_SUMMARY, "project_group[text()~=stem(?)]" }, + { AS_SEARCH_TOKEN_MATCH_NONE, NULL } + }; +#endif + + return gs_appstream_do_search (plugin, silo, values, queries, list, cancellable, error); +} + +gboolean +gs_appstream_add_category_apps (GsPlugin *plugin, + XbSilo *silo, + GsCategory *category, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + GPtrArray *desktop_groups; + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (GS_IS_CATEGORY (category), FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + + desktop_groups = gs_category_get_desktop_groups (category); + if (desktop_groups->len == 0) { + g_warning ("no desktop_groups for %s", gs_category_get_id (category)); + return TRUE; + } + for (guint j = 0; j < desktop_groups->len; j++) { + const gchar *desktop_group = g_ptr_array_index (desktop_groups, j); + g_autofree gchar *xpath = NULL; + g_auto(GStrv) split = g_strsplit (desktop_group, "::", -1); + g_autoptr(GPtrArray) components = NULL; + g_autoptr(GError) error_local = NULL; + + /* generate query */ + if (g_strv_length (split) == 1) { + xpath = g_strdup_printf ("components/component[not(@merge)]/categories/" + "category[text()='%s']/../..", + split[0]); + } else if (g_strv_length (split) == 2) { + xpath = g_strdup_printf ("components/component[not(@merge)]/categories/" + "category[text()='%s']/../" + "category[text()='%s']/../..", + split[0], split[1]); + } + components = xb_silo_query (silo, xpath, 0, &error_local); + if (components == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + continue; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + + /* create app */ + for (guint i = 0; i < components->len; i++) { + XbNode *component = g_ptr_array_index (components, i); + g_autoptr(GsApp) app = NULL; + const gchar *id = xb_node_query_text (component, "id", NULL); + if (id == NULL) + continue; + app = gs_app_new (id); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app); + } + + } + return TRUE; +} + +static guint +gs_appstream_count_component_for_groups (XbSilo *silo, + const gchar *desktop_group) +{ + /* the overview page checks for 100 apps, then try to get them */ + const guint limit = 100; + g_autofree gchar *xpath = NULL; + g_auto(GStrv) split = g_strsplit (desktop_group, "::", -1); + g_autoptr(GPtrArray) array = NULL; + g_autoptr(GError) error_local = NULL; + + if (g_strv_length (split) == 1) { /* "all" group for a parent category */ + xpath = g_strdup_printf ("components/component[not(@merge)]/categories/" + "category[text()='%s']/../..", + split[0]); + } else if (g_strv_length (split) == 2) { + xpath = g_strdup_printf ("components/component[not(@merge)]/categories/" + "category[text()='%s']/../" + "category[text()='%s']/../..", + split[0], split[1]); + } else { + return 0; + } + + array = xb_silo_query (silo, xpath, limit, &error_local); + if (array == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return 0; + g_warning ("%s", error_local->message); + return 0; + } + return array->len; +} + +/* we're not actually adding categories here, we're just setting the number of + * apps available in each category */ +gboolean +gs_appstream_refine_category_sizes (XbSilo *silo, + GPtrArray *list, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (list != NULL, FALSE); + + for (guint j = 0; j < list->len; j++) { + GsCategory *parent = GS_CATEGORY (g_ptr_array_index (list, j)); + GPtrArray *children = gs_category_get_children (parent); + + for (guint i = 0; i < children->len; i++) { + GsCategory *cat = g_ptr_array_index (children, i); + GPtrArray *groups = gs_category_get_desktop_groups (cat); + for (guint k = 0; k < groups->len; k++) { + const gchar *group = g_ptr_array_index (groups, k); + guint cnt = gs_appstream_count_component_for_groups (silo, group); + if (cnt > 0) { + gs_category_increment_size (parent, cnt); + if (children->len > 1) { + /* Parent category has multiple groups, so increment + * each group's size too */ + gs_category_increment_size (cat, cnt); + } + } + } + } + } + return TRUE; +} + +gboolean +gs_appstream_add_installed (GsPlugin *plugin, + XbSilo *silo, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GPtrArray) components = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + + /* get all installed appdata files (notice no 'components/' prefix...) */ + components = xb_silo_query (silo, "component/description/..", 0, NULL); + if (components == NULL) + return TRUE; + + for (guint i = 0; i < components->len; i++) { + XbNode *component = g_ptr_array_index (components, i); + g_autoptr(GsApp) app = gs_appstream_create_app (plugin, silo, component, NULL, AS_COMPONENT_SCOPE_UNKNOWN, error); + if (app == NULL) + return FALSE; + + /* Can get cached GsApp, which has the state already updated */ + if (gs_app_get_state (app) != GS_APP_STATE_UPDATABLE && + gs_app_get_state (app) != GS_APP_STATE_UPDATABLE_LIVE) + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_list_add (list, app); + } + + return TRUE; +} + +gboolean +gs_appstream_add_popular (XbSilo *silo, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) array = NULL; + + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + + /* find out how many packages are in each category */ + array = xb_silo_query (silo, + "components/component/kudos/" + "kudo[text()='GnomeSoftware::popular']/../..", + 0, &error_local); + if (array == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return TRUE; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + for (guint i = 0; i < array->len; i++) { + g_autoptr(GsApp) app = NULL; + XbNode *component = g_ptr_array_index (array, i); + const gchar *component_id = xb_node_query_text (component, "id", NULL); + if (component_id == NULL) + continue; + app = gs_app_new (component_id); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app); + } + return TRUE; +} + +gboolean +gs_appstream_add_recent (GsPlugin *plugin, + XbSilo *silo, + GsAppList *list, + guint64 age, + GCancellable *cancellable, + GError **error) +{ + AsComponentScope default_scope = AS_COMPONENT_SCOPE_UNKNOWN; + guint64 now = (guint64) g_get_real_time () / G_USEC_PER_SEC, max_future_timestamp; + g_autofree gchar *xpath = NULL; + g_autofree gchar *silo_filename = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) array = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + + /* use predicate conditions to the max */ + xpath = g_strdup_printf ("components/component/releases/" + "release[@timestamp>%" G_GUINT64_FORMAT "]/../..", + now - age); + array = xb_silo_query (silo, xpath, 0, &error_local); + if (array == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return TRUE; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + if (array->len > 0) + gs_appstream_read_silo_info_from_component (g_ptr_array_index (array, 0), &silo_filename, &default_scope); + + /* This is to cover mistakes when the release date is set in the future, + to not have it picked for too long. */ + max_future_timestamp = now + (3 * 24 * 60 * 60); + for (guint i = 0; i < array->len; i++) { + XbNode *component = g_ptr_array_index (array, i); + g_autoptr(GsApp) app = NULL; + guint64 timestamp = component_get_release_timestamp (component); + /* set the release date */ + if (timestamp != G_MAXUINT64 && timestamp < max_future_timestamp) { + app = gs_appstream_create_app (plugin, silo, component, silo_filename ? silo_filename : "", default_scope, error); + if (app == NULL) + return FALSE; + + gs_app_set_release_date (app, timestamp); + gs_app_list_add (list, app); + } + } + return TRUE; +} + +gboolean +gs_appstream_add_alternates (XbSilo *silo, + GsApp *app, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + GPtrArray *sources = gs_app_get_sources (app); + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) ids = NULL; + g_autoptr(GString) xpath = g_string_new (NULL); + + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + + /* probably a package we know nothing about */ + if (gs_app_get_id (app) == NULL) + return TRUE; + + /* actual ID */ + xb_string_append_union (xpath, "components/component/id[text()='%s']", + gs_app_get_id (app)); + + /* new ID -> old ID */ + xb_string_append_union (xpath, "components/component/id[text()='%s']/../provides/id", + gs_app_get_id (app)); + + /* old ID -> new ID */ + xb_string_append_union (xpath, "components/component/provides/id[text()='%s']/../../id", + gs_app_get_id (app)); + + /* find apps that use the same pkgname */ + for (guint j = 0; j < sources->len; j++) { + const gchar *source = g_ptr_array_index (sources, j); + g_autofree gchar *source_safe = xb_string_escape (source); + xb_string_append_union (xpath, + "components/component/pkgname[text()='%s']/../id", + source_safe); + } + + /* do a big query, and return all the unique results */ + ids = xb_silo_query (silo, xpath->str, 0, &error_local); + if (ids == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return TRUE; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + for (guint i = 0; i < ids->len; i++) { + XbNode *n = g_ptr_array_index (ids, i); + g_autoptr(GsApp) app2 = NULL; + const gchar *tmp; + app2 = gs_app_new (xb_node_get_text (n)); + gs_app_add_quirk (app2, GS_APP_QUIRK_IS_WILDCARD); + + tmp = xb_node_query_attr (n, "../..", "origin", NULL); + if (gs_appstream_origin_valid (tmp)) + gs_app_set_origin_appstream (app2, tmp); + gs_app_list_add (list, app2); + } + return TRUE; +} + +static gboolean +gs_appstream_add_featured_with_query (XbSilo *silo, + const gchar *query, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) array = NULL; + + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + + /* find out how many packages are in each category */ + array = xb_silo_query (silo, query, 0, &error_local); + if (array == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return TRUE; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + for (guint i = 0; i < array->len; i++) { + g_autoptr(GsApp) app = NULL; + XbNode *component = g_ptr_array_index (array, i); + const gchar *component_id = xb_node_query_text (component, "id", NULL); + if (component_id == NULL) + continue; + app = gs_app_new (component_id); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + if (!gs_appstream_copy_metadata (app, component, error)) + return FALSE; + gs_app_list_add (list, app); + } + return TRUE; +} + +gboolean +gs_appstream_add_featured (XbSilo *silo, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + const gchar *query = "components/component/custom/value[@key='GnomeSoftware::FeatureTile']/../..|" + "components/component/custom/value[@key='GnomeSoftware::FeatureTile-css']/../.."; + return gs_appstream_add_featured_with_query (silo, query, list, cancellable, error); +} + +gboolean +gs_appstream_add_deployment_featured (XbSilo *silo, + const gchar * const *deployments, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GString) query = g_string_new (NULL); + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (deployments != NULL, FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + for (guint ii = 0; deployments[ii] != NULL; ii++) { + g_autofree gchar *escaped = xb_string_escape (deployments[ii]); + if (escaped != NULL && *escaped != '\0') { + xb_string_append_union (query, + "components/component/custom/value[@key='GnomeSoftware::DeploymentFeatured'][text()='%s']/../..", + escaped); + } + } + if (!query->len) + return TRUE; + return gs_appstream_add_featured_with_query (silo, query->str, list, cancellable, error); +} + +gboolean +gs_appstream_url_to_app (GsPlugin *plugin, + XbSilo *silo, + GsAppList *list, + const gchar *url, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *path = NULL; + g_autofree gchar *scheme = NULL; + g_autofree gchar *xpath = NULL; + g_autoptr(GPtrArray) components = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (XB_IS_SILO (silo), FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + g_return_val_if_fail (url != NULL, FALSE); + + /* not us */ + scheme = gs_utils_get_url_scheme (url); + if (g_strcmp0 (scheme, "appstream") != 0) + return TRUE; + + path = gs_utils_get_url_path (url); + xpath = g_strdup_printf ("components/component/id[text()='%s']/..", path); + components = xb_silo_query (silo, xpath, 0, NULL); + if (components == NULL) + return TRUE; + + for (guint i = 0; i < components->len; i++) { + XbNode *component = g_ptr_array_index (components, i); + g_autoptr(GsApp) app = NULL; + app = gs_appstream_create_app (plugin, silo, component, NULL, AS_COMPONENT_SCOPE_UNKNOWN, error); + if (app == NULL) + return FALSE; + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_list_add (list, app); + } + + return TRUE; +} + +static GInputStream * +gs_appstream_load_desktop_cb (XbBuilderSource *self, + XbBuilderSourceCtx *ctx, + gpointer user_data, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *xml = NULL; + g_autoptr(AsComponent) cpt = as_component_new (); + g_autoptr(AsContext) actx = as_context_new (); + g_autoptr(GBytes) bytes = NULL; + gboolean ret; + + bytes = xb_builder_source_ctx_get_bytes (ctx, cancellable, error); + if (bytes == NULL) + return NULL; + + as_component_set_id (cpt, xb_builder_source_ctx_get_filename (ctx)); + ret = as_component_load_from_bytes (cpt, + actx, + AS_FORMAT_KIND_DESKTOP_ENTRY, + bytes, + error); + if (!ret) + return NULL; + xml = as_component_to_xml_data (cpt, actx, error); + if (xml == NULL) + return NULL; + return g_memory_input_stream_new_from_data (g_steal_pointer (&xml), (gssize) -1, g_free); +} + +static gboolean +gs_appstream_load_desktop_fn (XbBuilder *builder, + const gchar *filename, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GFile) file = g_file_new_for_path (filename); + g_autoptr(XbBuilderNode) info = NULL; + g_autoptr(XbBuilderSource) source = xb_builder_source_new (); + + /* add support for desktop files */ + xb_builder_source_add_simple_adapter (source, "application/x-desktop", + gs_appstream_load_desktop_cb, NULL, NULL); + + /* add source */ + if (!xb_builder_source_load_file (source, file, 0, cancellable, error)) + return FALSE; + + /* add metadata */ + info = xb_builder_node_insert (NULL, "info", NULL); + xb_builder_node_insert_text (info, "filename", filename, NULL); + xb_builder_source_set_info (source, info); + + /* success */ + xb_builder_import_source (builder, source); + return TRUE; +} + +gboolean +gs_appstream_load_desktop_files (XbBuilder *builder, + const gchar *path, + gboolean *out_any_loaded, + GFileMonitor **out_file_monitor, + GCancellable *cancellable, + GError **error) +{ + const gchar *fn; + g_autoptr(GDir) dir = NULL; + g_autoptr(GFile) parent = g_file_new_for_path (path); + if (out_any_loaded) + *out_any_loaded = FALSE; + if (!g_file_query_exists (parent, cancellable)) { + g_debug ("appstream: Skipping desktop path '%s' as %s", path, g_cancellable_is_cancelled (cancellable) ? "cancelled" : "does not exist"); + return TRUE; + } + + g_debug ("appstream: Loading desktop path '%s'", path); + + dir = g_dir_open (path, 0, error); + if (dir == NULL) + return FALSE; + + if (out_file_monitor != NULL) { + g_autoptr(GError) error_local = NULL; + *out_file_monitor = g_file_monitor (parent, G_FILE_MONITOR_NONE, cancellable, &error_local); + if (error_local) + g_debug ("appstream: Failed to create file monitor for '%s': %s", path, error_local->message); + } + + while ((fn = g_dir_read_name (dir)) != NULL) { + if (g_str_has_suffix (fn, ".desktop")) { + g_autofree gchar *filename = g_build_filename (path, fn, NULL); + g_autoptr(GError) error_local = NULL; + if (g_strcmp0 (fn, "mimeinfo.cache") == 0) + continue; + if (!gs_appstream_load_desktop_fn (builder, + filename, + cancellable, + &error_local)) { + g_debug ("ignoring %s: %s", filename, error_local->message); + continue; + } + if (out_any_loaded) + *out_any_loaded = TRUE; + } + } + + /* success */ + return TRUE; +} + +static void +gs_add_appstream_catalog_location (GPtrArray *locations, + const gchar *root) +{ + g_autofree gchar *catalog_path = NULL; + g_autofree gchar *catalog_legacy_path = NULL; + gboolean ignore_legacy_path = FALSE; + + catalog_path = g_build_filename (root, "swcatalog", NULL); + catalog_legacy_path = g_build_filename (root, "app-info", NULL); + + /* ignore compatibility symlink if one exists, so we don't scan the same location twice */ + if (g_file_test (catalog_legacy_path, G_FILE_TEST_IS_SYMLINK)) { + g_autofree gchar *link_target = g_file_read_link (catalog_legacy_path, NULL); + if (link_target != NULL) { + if (g_strcmp0 (link_target, catalog_path) == 0) { + ignore_legacy_path = TRUE; + g_debug ("Ignoring legacy AppStream catalog location '%s'.", catalog_legacy_path); + } + } + } + + if (!ignore_legacy_path) { + g_ptr_array_add (locations, + g_build_filename (catalog_legacy_path, "xml", NULL)); + g_ptr_array_add (locations, + g_build_filename (catalog_legacy_path, "xmls", NULL)); + g_ptr_array_add (locations, + g_build_filename (catalog_legacy_path, "yaml", NULL)); + } + + /* Add the current paths _after_ the legacy, that way the data stored in the current + paths has precedence over the (possibly stale) data in the legacy paths. */ + g_ptr_array_add (locations, + g_build_filename (catalog_path, "xml", NULL)); + g_ptr_array_add (locations, + g_build_filename (catalog_path, "yaml", NULL)); +} + +GPtrArray * +gs_appstream_get_appstream_data_dirs (void) +{ + GPtrArray *appstream_data_dirs = g_ptr_array_new_with_free_func (g_free); +#ifdef ENABLE_EXTERNAL_APPSTREAM + g_autoptr(GSettings) settings = g_settings_new ("org.gnome.software"); +#endif + g_autofree gchar *state_cache_dir = NULL; + g_autofree gchar *state_lib_dir = NULL; + + /* add search paths */ + gs_add_appstream_catalog_location (appstream_data_dirs, DATADIR); + + state_cache_dir = g_build_filename (LOCALSTATEDIR, "cache", NULL); + gs_add_appstream_catalog_location (appstream_data_dirs, state_cache_dir); + state_lib_dir = g_build_filename (LOCALSTATEDIR, "lib", NULL); + gs_add_appstream_catalog_location (appstream_data_dirs, state_lib_dir); + +#ifdef ENABLE_EXTERNAL_APPSTREAM + /* check for the corresponding setting */ + if (!g_settings_get_boolean (settings, "external-appstream-system-wide")) { + g_autofree gchar *user_catalog_path = NULL; + g_autofree gchar *user_catalog_old_path = NULL; + + /* migrate data paths */ + user_catalog_path = g_build_filename (g_get_user_data_dir (), "swcatalog", NULL); + user_catalog_old_path = g_build_filename (g_get_user_data_dir (), "app-info", NULL); + if (g_file_test (user_catalog_old_path, G_FILE_TEST_IS_DIR) && + !g_file_test (user_catalog_path, G_FILE_TEST_IS_DIR)) { + g_debug ("Migrating external AppStream user location."); + if (g_rename (user_catalog_old_path, user_catalog_path) == 0) { + g_autofree gchar *user_catalog_xml_path = NULL; + g_autofree gchar *user_catalog_xml_old_path = NULL; + + user_catalog_xml_path = g_build_filename (user_catalog_path, "xml", NULL); + user_catalog_xml_old_path = g_build_filename (user_catalog_path, "xmls", NULL); + if (g_file_test (user_catalog_xml_old_path, G_FILE_TEST_IS_DIR)) { + if (g_rename (user_catalog_xml_old_path, user_catalog_xml_path) != 0) + g_warning ("Unable to migrate external XML data location from '%s' to '%s': %s", + user_catalog_xml_old_path, user_catalog_xml_path, g_strerror (errno)); + } + } else { + g_warning ("Unable to migrate external data location from '%s' to '%s': %s", + user_catalog_old_path, user_catalog_path, g_strerror (errno)); + } + } + + /* add modern locations only */ + g_ptr_array_add (appstream_data_dirs, + g_build_filename (user_catalog_path, "xml", NULL)); + g_ptr_array_add (appstream_data_dirs, + g_build_filename (user_catalog_path, "yaml", NULL)); + } +#endif + + /* Add the normal system directories if the installation prefix + * is different from normal — typically this happens when doing + * development builds. It’s useful to still list the system apps + * during development. */ + if (g_strcmp0 (DATADIR, "/usr/share") != 0) + gs_add_appstream_catalog_location (appstream_data_dirs, "/usr/share"); + if (g_strcmp0 (LOCALSTATEDIR, "/var") != 0) { + gs_add_appstream_catalog_location (appstream_data_dirs, "/var/cache"); + gs_add_appstream_catalog_location (appstream_data_dirs, "/var/lib"); + } + + return appstream_data_dirs; +} + +void +gs_appstream_add_current_locales (XbBuilder *builder) +{ + const gchar *const *locales = g_get_language_names (); + for (guint i = 0; locales[i] != NULL; i++) + xb_builder_add_locale (builder, locales[i]); +} + +static gboolean +gs_appstream_is_merge_node (XbBuilderNode *bn) +{ + const gchar *merge = xb_builder_node_get_attr (bn, "merge"); + if (merge != NULL) { + AsMergeKind kind = as_merge_kind_from_string (merge); + return kind != AS_MERGE_KIND_NONE; + } + return FALSE; +} + +#ifdef HAVE_FIXED_LIBXMLB +static gboolean +gs_appstream_remove_merge_components_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0 && + gs_appstream_is_merge_node (bn)) + xb_builder_node_add_flag (bn, XB_BUILDER_NODE_FLAG_IGNORE); + return TRUE; +} + +static gboolean +gs_appstream_remove_nonmerge_components_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0 && + !gs_appstream_is_merge_node (bn)) + xb_builder_node_add_flag (bn, XB_BUILDER_NODE_FLAG_IGNORE); + return TRUE; +} +#endif + +static GInputStream * +gs_appstream_load_dep11_cb (XbBuilderSource *self, + XbBuilderSourceCtx *ctx, + gpointer user_data, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(AsMetadata) mdata = as_metadata_new (); + g_autoptr(GBytes) bytes = NULL; + g_autoptr(GError) tmp_error = NULL; + g_autofree gchar *xml = NULL; + + bytes = xb_builder_source_ctx_get_bytes (ctx, cancellable, error); + if (bytes == NULL) + return NULL; + + as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_CATALOG); + as_metadata_parse_bytes (mdata, + bytes, + AS_FORMAT_KIND_YAML, + &tmp_error); + if (tmp_error != NULL) { + g_propagate_error (error, g_steal_pointer (&tmp_error)); + return NULL; + } + + xml = as_metadata_components_to_catalog (mdata, AS_FORMAT_KIND_XML, &tmp_error); + if (xml == NULL) { + /* This API currently returns NULL if there is nothing to serialize, so we + * have to test if this is an error or not. + * See https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/763 + * for discussion about changing this API. */ + if (tmp_error != NULL) { + g_propagate_error (error, g_steal_pointer (&tmp_error)); + return NULL; + } + + xml = g_strdup (""); + } + + return g_memory_input_stream_new_from_data (g_steal_pointer (&xml), (gssize) -1, g_free); +} + +static gboolean +gs_appstream_load_appstream_file (XbBuilder *builder, + const gchar *filename, + GCancellable *cancellable) +{ + g_autoptr(GFile) file = g_file_new_for_path (filename); + g_autoptr(GError) local_error = NULL; + g_autoptr(XbBuilderSource) source = xb_builder_source_new (); + g_autoptr(XbBuilderNode) info = NULL; + g_autoptr(XbBuilderFixup) fixup = NULL; + + if (g_cancellable_is_cancelled (cancellable)) + return FALSE; + + /* add support for DEP-11 files */ + xb_builder_source_add_adapter (source, + "application/yaml", + gs_appstream_load_dep11_cb, + NULL, NULL); + xb_builder_source_add_adapter (source, + "application/x-yaml", + gs_appstream_load_dep11_cb, + NULL, NULL); + + /* add source */ + if (!xb_builder_source_load_file (source, file, XB_BUILDER_SOURCE_FLAG_NONE, cancellable, &local_error)) { + g_debug ("Failed to load appstream file '%s': %s", filename, local_error->message); + return FALSE; + } + + /* add metadata */ + info = xb_builder_node_insert (NULL, "info", NULL); + xb_builder_node_insert_text (info, "filename", filename, NULL); + xb_builder_source_set_info (source, info); + + #ifdef HAVE_FIXED_LIBXMLB + fixup = xb_builder_fixup_new ("RemoveNonMergeComponents", + gs_appstream_remove_nonmerge_components_cb, + NULL, NULL); + xb_builder_fixup_set_max_depth (fixup, 2); + xb_builder_source_add_fixup (source, fixup); + #endif + + xb_builder_import_source (builder, source); + + return TRUE; +} + +static gboolean +gs_appstream_load_appstream_dir (XbBuilder *builder, + const gchar *path, + GCancellable *cancellable) +{ + const gchar *fn; + gboolean any_loaded = FALSE; + g_autoptr(GDir) dir = NULL; +#ifdef ENABLE_EXTERNAL_APPSTREAM + g_autoptr(GSettings) settings = g_settings_new ("org.gnome.software"); + gboolean external_appstream_system_wide = g_settings_get_boolean (settings, "external-appstream-system-wide"); +#endif + + dir = g_dir_open (path, 0, NULL); + if (dir == NULL) + return FALSE; + while ((fn = g_dir_read_name (dir)) != NULL && !g_cancellable_is_cancelled (cancellable)) { +#ifdef ENABLE_EXTERNAL_APPSTREAM + /* Ignore our own system-installed files when + external-appstream-system-wide is FALSE */ + if (!external_appstream_system_wide && + g_strcmp0 (path, gs_external_appstream_utils_get_system_dir ()) == 0 && + g_str_has_prefix (fn, EXTERNAL_APPSTREAM_PREFIX)) + continue; +#endif + if (g_str_has_suffix (fn, ".xml") || + g_str_has_suffix (fn, ".yml") || + g_str_has_suffix (fn, ".yml.gz") || + g_str_has_suffix (fn, ".xml.gz")) { + g_autofree gchar *filename = g_build_filename (path, fn, NULL); + any_loaded = gs_appstream_load_appstream_file (builder, filename, cancellable) || any_loaded; + } + } + + return any_loaded; +} + +typedef struct { + GSList *components; /* XbNode * */ +} SiloIndexData; + +static SiloIndexData * +silo_index_data_new (XbNode *node) +{ + SiloIndexData *sid = g_new0 (SiloIndexData, 1); + sid->components = g_slist_prepend (sid->components, g_object_ref (node)); + return sid; +} + +static void +silo_index_data_free (SiloIndexData *sid) +{ + if (sid != NULL) { + g_slist_free_full (sid->components, g_object_unref); + g_free (sid); + } +} + +typedef struct { + XbSilo *appstream_silo; + XbSilo *desktop_silo; + GHashTable *appstream_index; /* gchar *id ~> SiloIndexData * */ + GHashTable *desktop_index; /* gchar *id ~> SiloIndexData * */ +} MergeData; + +static MergeData * +merge_data_new (void) +{ + MergeData *md = g_new0 (MergeData, 1); + return md; +} + +static void +merge_data_free (MergeData *md) +{ + if (md == NULL) + return; + + g_clear_pointer (&md->appstream_index, g_hash_table_unref); + g_clear_pointer (&md->desktop_index, g_hash_table_unref); + g_clear_object (&md->appstream_silo); + g_clear_object (&md->desktop_silo); + g_free (md); +} + +static void +gs_appstream_add_node_to_silo_index (GHashTable *index, /* gchar *id ~> SiloIndexData * */ + const gchar *id, + XbNode *node) +{ + SiloIndexData *sid; + if (id == NULL) + return; + sid = g_hash_table_lookup (index, id); + if (sid != NULL) { + sid->components = g_slist_prepend (sid->components, g_object_ref (node)); + } else { + sid = silo_index_data_new (node); + g_hash_table_insert (index, g_strdup (id), sid); + } +} + +static void +gs_appstream_traverse_silo_for_index (XbNode *node, + GHashTable *index, + gboolean only_merges, + gint depth) +{ + if (g_strcmp0 (xb_node_get_element (node), "component") == 0) { + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + gboolean need_id = TRUE, need_provides = !only_merges, need_info = need_provides; + if (only_merges) { + gboolean is_merge = FALSE; + const gchar *merge = xb_node_get_attr (node, "merge"); + if (merge != NULL) { + AsMergeKind kind = as_merge_kind_from_string (merge); + is_merge = kind != AS_MERGE_KIND_NONE; + } + if (!is_merge) + return; + } + for (child = xb_node_get_child (node); + child != NULL && (need_id || need_provides || need_info); + g_object_unref (child), child = g_steal_pointer (&next)) { + const gchar *element = xb_node_get_element (child); + next = xb_node_get_next (child); + if (need_id && g_strcmp0 (element, "id") == 0) { + gs_appstream_add_node_to_silo_index (index, xb_node_get_text (child), node); + need_id = FALSE; + } else if (need_provides && g_strcmp0 (element, "provides") == 0) { + g_autoptr(XbNode) provides_child = NULL; + g_autoptr(XbNode) provides_next = NULL; + for (provides_child = xb_node_get_child (child); + provides_child != NULL; + g_object_unref (provides_child), provides_child = g_steal_pointer (&provides_next)) { + provides_next = xb_node_get_next (provides_child); + if (g_strcmp0 (xb_node_get_element (provides_child), "id") == 0) + gs_appstream_add_node_to_silo_index (index, xb_node_get_text (provides_child), node); + } + + need_provides = FALSE; + } else if (need_info && g_strcmp0 (element, "info") == 0) { + /* In case it's a .desktop file and the node is not there yet, then add it. + It's because the from the desktop file may not match the , + which is the file name. */ + g_autoptr(XbNode) info_child = NULL; + g_autoptr(XbNode) info_next = NULL; + for (info_child = xb_node_get_child (child); + info_child != NULL; + g_object_unref (info_child), info_child = g_steal_pointer (&info_next)) { + info_next = xb_node_get_next (info_child); + if (g_strcmp0 (xb_node_get_element (info_child), "filename") == 0) { + const gchar *filename = xb_node_get_text (info_child); + if (filename != NULL && g_str_has_suffix (filename, ".desktop")) { + filename = strrchr (filename, G_DIR_SEPARATOR); + if (filename != NULL) { + SiloIndexData *sid; + filename++; + sid = g_hash_table_lookup (index, filename); + if (sid != NULL) { + if (!g_slist_find (sid->components, node)) + sid->components = g_slist_prepend (sid->components, g_object_ref (node)); + } else { + sid = silo_index_data_new (node); + g_hash_table_insert (index, g_strdup (filename), sid); + } + } + } + } + } + + need_info = FALSE; + } + } + } else if (depth < 2) { + XbNodeChildIter iter; + XbNode *child = NULL; + xb_node_child_iter_init (&iter, node); + while (xb_node_child_iter_loop (&iter, &child)) { + gs_appstream_traverse_silo_for_index (child, index, only_merges, depth + 1); + } + } +} + +static GHashTable * /* gchar *id ~> SiloIndexData * */ +gs_appstream_create_silo_index (XbSilo *silo, + gboolean only_merges) +{ + GHashTable *index = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) silo_index_data_free); + for (g_autoptr(XbNode) node = xb_silo_get_root (silo); node != NULL; node_set_to_next (&node)) { + gs_appstream_traverse_silo_for_index (node, index, only_merges, 0); + } + return index; +} + +static MergeData * +gs_appstream_gather_merge_data (GPtrArray *appstream_paths, + GPtrArray *desktop_paths, + GCancellable *cancellable) +{ + MergeData *md = merge_data_new (); + g_autoptr(GPtrArray) common_appstream_paths = gs_appstream_get_appstream_data_dirs (); + if (appstream_paths != NULL) { + g_autoptr(GError) local_error = NULL; + g_autoptr(XbBuilder) builder = xb_builder_new (); + gboolean any_loaded = FALSE; + gs_appstream_add_current_locales (builder); + for (guint i = 0; i < appstream_paths->len && !g_cancellable_is_cancelled (cancellable); i++) { + const gchar *path = g_ptr_array_index (appstream_paths, i); + if (g_file_test (path, G_FILE_TEST_IS_DIR)) + any_loaded = gs_appstream_load_appstream_dir (builder, path, cancellable) || any_loaded; + else + any_loaded = gs_appstream_load_appstream_file (builder, path, cancellable) || any_loaded; + for (guint j = 0; j < common_appstream_paths->len; j++) { + if (g_strcmp0 (g_ptr_array_index (common_appstream_paths, j), path) == 0) { + g_ptr_array_remove_index (common_appstream_paths, j); + break; + } + } + } + for (guint i = 0; i < common_appstream_paths->len; i++) { + const gchar *path = g_ptr_array_index (common_appstream_paths, i); + any_loaded = gs_appstream_load_appstream_dir (builder, path, cancellable) || any_loaded; + } + if (any_loaded && !g_cancellable_is_cancelled (cancellable)) { + md->appstream_silo = xb_builder_compile (builder, + XB_BUILDER_COMPILE_FLAG_IGNORE_INVALID | + XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, + cancellable, &local_error); + #ifdef __GLIBC__ + /* https://gitlab.gnome.org/GNOME/gnome-software/-/issues/941 + * libxmlb <= 0.3.22 makes lots of temporary heap allocations parsing large XMLs + * trim the heap after parsing to control RSS growth. */ + malloc_trim (0); + #endif + if (md->appstream_silo != NULL) + md->appstream_index = gs_appstream_create_silo_index (md->appstream_silo, TRUE); + else + g_warning ("Failed to compile appstream silo: %s", local_error->message); + } + } else { + g_autoptr(GError) local_error = NULL; + g_autoptr(XbBuilder) builder = xb_builder_new (); + gboolean any_loaded = FALSE; + gs_appstream_add_current_locales (builder); + for (guint i = 0; i < common_appstream_paths->len && !g_cancellable_is_cancelled (cancellable); i++) { + const gchar *path = g_ptr_array_index (common_appstream_paths, i); + any_loaded = gs_appstream_load_appstream_dir (builder, path, cancellable) || any_loaded; + } + if (any_loaded && !g_cancellable_is_cancelled (cancellable)) { + md->appstream_silo = xb_builder_compile (builder, + XB_BUILDER_COMPILE_FLAG_IGNORE_INVALID | + XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, + cancellable, &local_error); + if (md->appstream_silo != NULL) + md->appstream_index = gs_appstream_create_silo_index (md->appstream_silo, TRUE); + else + g_warning ("Failed to compile common paths appstream silo: %s", local_error->message); + } + } + if (desktop_paths != NULL) { + g_autoptr(GError) local_error = NULL; + g_autoptr(XbBuilder) builder = xb_builder_new (); + gboolean any_loaded = FALSE; + gs_appstream_add_current_locales (builder); + for (guint i = 0; i < desktop_paths->len && !g_cancellable_is_cancelled (cancellable); i++) { + const gchar *path = g_ptr_array_index (desktop_paths, i); + gboolean this_loaded = FALSE; + gs_appstream_load_desktop_files (builder, path, &this_loaded, NULL, cancellable, NULL); + any_loaded = any_loaded || this_loaded; + } + if (any_loaded && !g_cancellable_is_cancelled (cancellable)) { + md->desktop_silo = xb_builder_compile (builder, + XB_BUILDER_COMPILE_FLAG_IGNORE_INVALID | + XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, + cancellable, &local_error); + if (md->desktop_silo != NULL) + md->desktop_index = gs_appstream_create_silo_index (md->desktop_silo, FALSE); + else + g_warning ("Failed to compile desktop silo: %s", local_error->message); + } + } + return md; +} + +static void +gs_appstream_copy_attrs (XbBuilderNode *des_node, + XbNode *src_node) +{ + XbNodeAttrIter iter; + const gchar *attr_name, *attr_value; + + xb_node_attr_iter_init (&iter, src_node); + while (xb_node_attr_iter_next (&iter, &attr_name, &attr_value)) { + xb_builder_node_set_attr (des_node, attr_name, attr_value); + } +} + +static void +gs_appstream_copy_node (XbBuilderNode *des_parent, + XbNode *src_node, + gint level) +{ + g_autoptr(XbBuilderNode) new_node = NULL; + g_autoptr(GPtrArray) children = NULL; + const gchar *text, *element_name; + gboolean merge_into_existing = FALSE; + element_name = xb_node_get_element (src_node); + text = xb_node_get_text (src_node); + if (level == 1 && ( + g_strcmp0 (element_name, "categories") == 0 || + g_strcmp0 (element_name, "custom") == 0 || + g_strcmp0 (element_name, "kudos") == 0 || + g_strcmp0 (element_name, "provides") == 0)) { + new_node = xb_builder_node_get_child (des_parent, element_name, text); + merge_into_existing = new_node != NULL; + } else if (level == 2 && ( + g_strcmp0 (element_name, "category") == 0 || + g_strcmp0 (element_name, "kudo") == 0)) { + /* Such category/kudo already exists */ + new_node = xb_builder_node_get_child (des_parent, element_name, text); + if (new_node != NULL) + return; + } + if (new_node == NULL) { + new_node = xb_builder_node_new (element_name); + if (text != NULL) + xb_builder_node_set_text (new_node, text, -1); + xb_builder_node_add_child (des_parent, new_node); + gs_appstream_copy_attrs (new_node, src_node); + } + children = xb_node_get_children (src_node); + for (guint i = 0; children && i < children->len; i++) { + XbNode *child = g_ptr_array_index (children, i); + gs_appstream_copy_node (new_node, child, level + 1); + } + if (!merge_into_existing) { + text = xb_node_get_tail (src_node); + if (text != NULL) + xb_builder_node_set_tail (new_node, text, -1); + } +} + +static void +gs_appstream_merge_component_children (XbBuilderNode *bn, + XbNode *node, + gboolean is_replace) +{ + g_autoptr(GHashTable) checked_elems = g_hash_table_new (g_str_hash, g_str_equal); /* gchar *name ~> NULL*/ + g_autoptr(GHashTable) existing_elems = NULL; + g_autoptr(GPtrArray) node_children = xb_node_get_children (node); + if (!is_replace) { + GPtrArray *bn_children = xb_builder_node_get_children (bn); + existing_elems = g_hash_table_new (g_str_hash, g_str_equal); /* gchar *name ~> NULL*/ + for (guint i = 0; bn_children && i < bn_children->len; i++) { + XbBuilderNode *bn_child = g_ptr_array_index (bn_children, i); + const gchar *elem_name = xb_builder_node_get_element (bn_child); + if (elem_name) + g_hash_table_add (existing_elems, (gpointer) elem_name); + } + } + for (guint i = 0; node_children != NULL && i < node_children->len; i++) { + XbNode *child = g_ptr_array_index (node_children, i); + const gchar *elem_name = xb_node_get_element (child); + if (g_strcmp0 (elem_name, "id") == 0 || + g_strcmp0 (elem_name, "info") == 0) + continue; + if (is_replace && g_hash_table_add (checked_elems, (gpointer) elem_name)) { + GPtrArray *bn_children = xb_builder_node_get_children (bn); + for (guint j = 0; bn_children && j < bn_children->len; j++) { + XbBuilderNode *bn_child = g_ptr_array_index (bn_children, j); + if (g_strcmp0 (xb_builder_node_get_element (bn_child), elem_name) == 0) + xb_builder_node_add_flag (bn, XB_BUILDER_NODE_FLAG_IGNORE); + } + } else if (!is_replace && g_hash_table_contains (existing_elems, elem_name)) { + /* list of those to skip if already exist */ + if (g_strcmp0 (elem_name, "name") == 0 || + g_strcmp0 (elem_name, "summary") == 0 || + g_strcmp0 (elem_name, "description") == 0 || + g_strcmp0 (elem_name, "launchable") == 0) + continue; + } + gs_appstream_copy_node (bn, child, 1); + } +} + +static gboolean +gs_appstream_apply_merges_for_id (MergeData *md, + XbBuilderNode *bn, + const gchar *id) +{ + SiloIndexData *sid; + + if (id == NULL || md->appstream_index == NULL) + return FALSE; + + sid = g_hash_table_lookup (md->appstream_index, id); + if (sid != NULL) { + for (GSList *link = sid->components; link != NULL; link = g_slist_next (link)) { + XbNode *node = link->data; + if (node != NULL) { + const gchar *merge = xb_node_get_attr (node, "merge"); + if (merge != NULL) { + AsMergeKind kind = as_merge_kind_from_string (merge); + if (kind == AS_MERGE_KIND_REMOVE_COMPONENT) { + xb_builder_node_add_flag (bn, XB_BUILDER_NODE_FLAG_IGNORE); + return TRUE; + } else if (kind == AS_MERGE_KIND_APPEND || + kind == AS_MERGE_KIND_REPLACE) { + gs_appstream_merge_component_children (bn, node, kind == AS_MERGE_KIND_REPLACE); + } + } + } + } + } + + return FALSE; +} + +static gboolean +gs_appstream_apply_merges_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + MergeData *md = user_data; + if (!xb_builder_node_has_flag (bn, XB_BUILDER_NODE_FLAG_IGNORE) && + g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0 && + !gs_appstream_is_merge_node (bn)) { + if (md->appstream_index != NULL) { + g_autoptr(XbBuilderNode) id_node = xb_builder_node_get_child (bn, "id", NULL); + if (id_node != NULL) { + g_autoptr(XbBuilderNode) provides_node = NULL; + const gchar *id = xb_builder_node_get_text (id_node); + gboolean skip_node = gs_appstream_apply_merges_for_id (md, bn, id); + if (skip_node) + return TRUE; + provides_node = xb_builder_node_get_child (bn, "provides", NULL); + if (provides_node != NULL) { + GPtrArray *children = xb_builder_node_get_children (provides_node); + for (guint i = 0; children != NULL && i < children->len; i++) { + XbBuilderNode *child = g_ptr_array_index (children, i); + if (g_strcmp0 (xb_builder_node_get_element (child), "id") == 0) { + id = xb_builder_node_get_text (child); + skip_node = gs_appstream_apply_merges_for_id (md, bn, id); + if (skip_node) + return TRUE; + } + } + } + } + } + if (md->desktop_index) { + GPtrArray *children = xb_builder_node_get_children (bn); + const gchar *desktop_id = NULL; + for (guint i = 0; children != NULL && i < children->len; i++) { + XbBuilderNode *child = g_ptr_array_index (children, i); + if (g_strcmp0 (xb_builder_node_get_element (child), "launchable") == 0 && + g_strcmp0 (xb_builder_node_get_attr (child, "type"), "desktop-id") == 0) { + /* Can merge, only if just one desktop-id launchable is present: + https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Application.html#tag-dapp-launchable */ + if (desktop_id != NULL) { + desktop_id = NULL; + break; + } + desktop_id = xb_builder_node_get_text (child); + if (desktop_id != NULL && *desktop_id == '\0') + desktop_id = NULL; + } else if (g_strcmp0 (xb_builder_node_get_element (child), "info") == 0) { + /* Make sure it'll not update itself, aka skip updating data + from .desktop files into .desktop files */ + g_autoptr(XbBuilderNode) filename_node = xb_builder_node_get_child (child, "filename", NULL); + if (filename_node) { + const gchar *filename = xb_builder_node_get_text (filename_node); + if (filename != NULL && g_str_has_suffix (filename, ".desktop")) { + desktop_id = NULL; + break; + } + } + } + } + if (desktop_id != NULL) { + SiloIndexData *sid = g_hash_table_lookup (md->desktop_index, desktop_id); + if (sid != NULL) { + for (GSList *link = sid->components; link != NULL; link = g_slist_next (link)) { + XbNode *node = link->data; + /* Add data from the corresponding .desktop file */ + if (node != NULL) + gs_appstream_merge_component_children (bn, node, FALSE); + } + } + } + } + } + return TRUE; +} + +void +gs_appstream_add_data_merge_fixup (XbBuilder *builder, + GPtrArray *appstream_paths, + GPtrArray *desktop_paths, + GCancellable *cancellable) +{ + #ifdef HAVE_FIXED_LIBXMLB + g_autoptr(XbBuilderFixup) fixup1 = NULL; + #endif + g_autoptr(XbBuilderFixup) fixup2 = NULL; + MergeData *md; + + /* First read all of the merge components and .desktop files (which will be merged as well) */ + md = gs_appstream_gather_merge_data (appstream_paths, desktop_paths, cancellable); + + #ifdef HAVE_FIXED_LIBXMLB + /* Then drop all the merge components from the result, because they are useless when being merged */ + fixup1 = xb_builder_fixup_new ("RemoveMergeComponents", + gs_appstream_remove_merge_components_cb, + NULL, NULL); + xb_builder_fixup_set_max_depth (fixup1, 2); + xb_builder_add_fixup (builder, fixup1); + #endif + + /* Then apply merge data to the components */ + fixup2 = xb_builder_fixup_new ("ApplyMerges", + gs_appstream_apply_merges_cb, + md, (GDestroyNotify) merge_data_free); + xb_builder_fixup_set_max_depth (fixup2, 2); + xb_builder_add_fixup (builder, fixup2); +} + +void +gs_appstream_component_add_keyword (XbBuilderNode *component, const gchar *str) +{ + g_autoptr(XbBuilderNode) keyword = NULL; + g_autoptr(XbBuilderNode) keywords = NULL; + + g_return_if_fail (XB_IS_BUILDER_NODE (component)); + g_return_if_fail (str != NULL); + + /* create if it does not already exist */ + keywords = xb_builder_node_get_child (component, "keywords", NULL); + if (keywords == NULL) + keywords = xb_builder_node_insert (component, "keywords", NULL); + + /* create str if it does not already exist */ + keyword = xb_builder_node_get_child (keywords, "keyword", str); + if (keyword == NULL) { + keyword = xb_builder_node_insert (keywords, "keyword", NULL); + xb_builder_node_set_text (keyword, str, -1); + } +} + +void +gs_appstream_component_add_provide (XbBuilderNode *component, const gchar *str) +{ + g_autoptr(XbBuilderNode) provide = NULL; + g_autoptr(XbBuilderNode) provides = NULL; + + g_return_if_fail (XB_IS_BUILDER_NODE (component)); + g_return_if_fail (str != NULL); + + /* create if it does not already exist */ + provides = xb_builder_node_get_child (component, "provides", NULL); + if (provides == NULL) + provides = xb_builder_node_insert (component, "provides", NULL); + + /* create str if it does not already exist */ + provide = xb_builder_node_get_child (provides, "id", str); + if (provide == NULL) { + provide = xb_builder_node_insert (provides, "id", NULL); + xb_builder_node_set_text (provide, str, -1); + } +} + +void +gs_appstream_component_add_category (XbBuilderNode *component, const gchar *str) +{ + g_autoptr(XbBuilderNode) category = NULL; + g_autoptr(XbBuilderNode) categories = NULL; + + g_return_if_fail (XB_IS_BUILDER_NODE (component)); + g_return_if_fail (str != NULL); + + /* create if it does not already exist */ + categories = xb_builder_node_get_child (component, "categories", NULL); + if (categories == NULL) + categories = xb_builder_node_insert (component, "categories", NULL); + + /* create str if it does not already exist */ + category = xb_builder_node_get_child (categories, "category", str); + if (category == NULL) { + category = xb_builder_node_insert (categories, "category", NULL); + xb_builder_node_set_text (category, str, -1); + } +} + +void +gs_appstream_component_add_icon (XbBuilderNode *component, const gchar *str) +{ + g_autoptr(XbBuilderNode) icon = NULL; + + g_return_if_fail (XB_IS_BUILDER_NODE (component)); + g_return_if_fail (str != NULL); + + /* create str if it does not already exist */ + icon = xb_builder_node_get_child (component, "icon", NULL); + if (icon == NULL) { + icon = xb_builder_node_insert (component, "icon", + "type", "stock", + NULL); + xb_builder_node_set_text (icon, str, -1); + } +} + +void +gs_appstream_component_add_extra_info (XbBuilderNode *component) +{ + const gchar *kind; + + g_return_if_fail (XB_IS_BUILDER_NODE (component)); + + kind = xb_builder_node_get_attr (component, "type"); + + /* add the gnome-software-specific 'Addon' group and ensure they + * all have an icon set */ + switch (as_component_kind_from_string (kind)) { + case AS_COMPONENT_KIND_WEB_APP: + gs_appstream_component_add_keyword (component, kind); + break; + case AS_COMPONENT_KIND_FONT: + gs_appstream_component_add_category (component, "Addon"); + gs_appstream_component_add_category (component, "Font"); + break; + case AS_COMPONENT_KIND_DRIVER: + gs_appstream_component_add_category (component, "Addon"); + gs_appstream_component_add_category (component, "Driver"); + gs_appstream_component_add_icon (component, "system-component-driver"); + break; + case AS_COMPONENT_KIND_LOCALIZATION: + gs_appstream_component_add_category (component, "Addon"); + gs_appstream_component_add_category (component, "Localization"); + gs_appstream_component_add_icon (component, "system-component-language"); + break; + case AS_COMPONENT_KIND_CODEC: + gs_appstream_component_add_category (component, "Addon"); + gs_appstream_component_add_category (component, "Codec"); + gs_appstream_component_add_icon (component, "system-component-codecs"); + break; + case AS_COMPONENT_KIND_INPUT_METHOD: + gs_appstream_component_add_keyword (component, kind); + gs_appstream_component_add_category (component, "Addon"); + gs_appstream_component_add_category (component, "InputSource"); + gs_appstream_component_add_icon (component, "system-component-input-sources"); + break; + case AS_COMPONENT_KIND_FIRMWARE: + gs_appstream_component_add_icon (component, "system-component-firmware"); + break; + default: + break; + } +} + +/* Resolve any media URIs which are actually relative + * paths against the media_baseurl property */ +void +gs_appstream_component_fix_url (XbBuilderNode *component, const gchar *baseurl) +{ + const gchar *text; + g_autofree gchar *url = NULL; + + g_return_if_fail (XB_IS_BUILDER_NODE (component)); + g_return_if_fail (baseurl != NULL); + + text = xb_builder_node_get_text (component); + + if (text == NULL) + return; + + if (g_str_has_prefix (text, "http:") || + g_str_has_prefix (text, "https:")) + return; + + url = g_strconcat (baseurl, "/", text, NULL); + xb_builder_node_set_text (component, url , -1); +} diff --git a/lib/gs-appstream.h b/lib/gs-appstream.h new file mode 100644 index 0000000..a58f07d --- /dev/null +++ b/lib/gs-appstream.h @@ -0,0 +1,112 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2015-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +GsApp *gs_appstream_create_app (GsPlugin *plugin, + XbSilo *silo, + XbNode *component, + const gchar *appstream_source_file, + AsComponentScope default_scope, + GError **error); +gboolean gs_appstream_refine_app (GsPlugin *plugin, + GsApp *app, + XbSilo *silo, + XbNode *component, + GsPluginRefineFlags flags, + GHashTable *installed_by_desktopid, + const gchar *appstream_source_file, + AsComponentScope default_scope, + GError **error); +gboolean gs_appstream_search (GsPlugin *plugin, + XbSilo *silo, + const gchar * const *values, + GsAppList *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_search_developer_apps (GsPlugin *plugin, + XbSilo *silo, + const gchar * const *values, + GsAppList *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_refine_category_sizes (XbSilo *silo, + GPtrArray *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_add_category_apps (GsPlugin *plugin, + XbSilo *silo, + GsCategory *category, + GsAppList *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_add_installed (GsPlugin *plugin, + XbSilo *silo, + GsAppList *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_add_popular (XbSilo *silo, + GsAppList *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_add_featured (XbSilo *silo, + GsAppList *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_add_deployment_featured (XbSilo *silo, + const gchar * const *deployments, + GsAppList *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_add_alternates (XbSilo *silo, + GsApp *app, + GsAppList *list, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_add_recent (GsPlugin *plugin, + XbSilo *silo, + GsAppList *list, + guint64 age, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_url_to_app (GsPlugin *plugin, + XbSilo *silo, + GsAppList *list, + const gchar *url, + GCancellable *cancellable, + GError **error); +gboolean gs_appstream_load_desktop_files (XbBuilder *builder, + const gchar *path, + gboolean *out_any_loaded, + GFileMonitor **out_file_monitor, + GCancellable *cancellable, + GError **error); +GPtrArray *gs_appstream_get_appstream_data_dirs (void); +void gs_appstream_add_current_locales (XbBuilder *builder); +void gs_appstream_add_data_merge_fixup (XbBuilder *builder, + GPtrArray *appstream_paths, + GPtrArray *desktop_paths, + GCancellable *cancellable); +void gs_appstream_component_add_extra_info (XbBuilderNode *component); +void gs_appstream_component_add_keyword (XbBuilderNode *component, + const gchar *str); +void gs_appstream_component_add_category (XbBuilderNode *component, + const gchar *str); +void gs_appstream_component_add_icon (XbBuilderNode *component, + const gchar *str); +void gs_appstream_component_add_provide (XbBuilderNode *component, + const gchar *str); +void gs_appstream_component_fix_url (XbBuilderNode *component, + const gchar *baseurl); + +G_END_DECLS diff --git a/lib/gs-build-ident.h.in b/lib/gs-build-ident.h.in new file mode 100644 index 0000000..1790cc7 --- /dev/null +++ b/lib/gs-build-ident.h.in @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Matthew Leeds + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +/** + * SECTION:gs-build-ident + * @title: Build Identifier + * @short_description: Identify a build by unique build identifier + * + * Since: 40 + */ + +/** + * GS_BUILD_IDENTIFIER: + * + * A string containing a tag that defines the version of Software that + * was built. Generally, this will be a small version tag plus some + * information to identify the git commit hash when applicable. + */ +#define GS_BUILD_IDENTIFIER "@VCS_TAG@" + +G_END_DECLS diff --git a/lib/gs-category-manager.c b/lib/gs-category-manager.c new file mode 100644 index 0000000..1249855 --- /dev/null +++ b/lib/gs-category-manager.c @@ -0,0 +1,151 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-category-manager + * @short_description: A container to store #GsCategory instances in + * + * #GsCategoryManager is a container object which stores #GsCategory instances, + * so that they can be consistently reused by other code, without creating + * multiple #GsCategory instances for the same category ID. + * + * It is intended to be used as a singleton, and typically accessed by calling + * gs_plugin_loader_get_category_manager(). + * + * Since: 40 + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-category-manager.h" +#include "gs-desktop-data.h" + +struct _GsCategoryManager +{ + GObject parent; + + /* Array of #GsCategory instances corresponding to the entries in gs_desktop_get_data() + * The +1 is for a NULL terminator */ + GsCategory *categories[GS_DESKTOP_DATA_N_ENTRIES + 1]; +}; + +G_DEFINE_TYPE (GsCategoryManager, gs_category_manager, G_TYPE_OBJECT) + +static void +gs_category_manager_dispose (GObject *object) +{ + GsCategoryManager *self = GS_CATEGORY_MANAGER (object); + + for (gsize i = 0; i < G_N_ELEMENTS (self->categories); i++) + g_clear_object (&self->categories[i]); + + G_OBJECT_CLASS (gs_category_manager_parent_class)->dispose (object); +} + +static void +gs_category_manager_class_init (GsCategoryManagerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = gs_category_manager_dispose; +} + +static void +gs_category_manager_init (GsCategoryManager *self) +{ + const GsDesktopData *msdata; + + /* Set up the category data, and check our expectations about the length + * of gs_desktop_get_data() match reality. */ + msdata = gs_desktop_get_data (); + for (gsize i = 0; msdata[i].id != NULL; i++) { + g_assert (i < G_N_ELEMENTS (self->categories) - 1); + self->categories[i] = gs_category_new_for_desktop_data (&msdata[i]); + } + + g_assert (self->categories[G_N_ELEMENTS (self->categories) - 2] != NULL); + g_assert (self->categories[G_N_ELEMENTS (self->categories) - 1] == NULL); +} + +/** + * gs_category_manager_new: + * + * Create a new #GsCategoryManager. It will contain all the categories, but + * their sizes will not be set until gs_category_increment_size() is called + * on them. + * + * Returns: (transfer full): a new #GsCategoryManager + * Since: 40 + */ +GsCategoryManager * +gs_category_manager_new (void) +{ + return g_object_new (GS_TYPE_CATEGORY_MANAGER, NULL); +} + +/** + * gs_category_manager_lookup: + * @self: a #GsCategoryManager + * @id: ID of the category to look up + * + * Look up a category by its ID. If the category is not found, %NULL is + * returned. + * + * Returns: (transfer full) (nullable): the #GsCategory, or %NULL + * Since: 40 + */ +GsCategory * +gs_category_manager_lookup (GsCategoryManager *self, + const gchar *id) +{ + g_return_val_if_fail (GS_IS_CATEGORY_MANAGER (self), NULL); + g_return_val_if_fail (id != NULL && *id != '\0', NULL); + + /* There are only on the order of 10 categories, so this is quick */ + for (gsize i = 0; i < G_N_ELEMENTS (self->categories) - 1; i++) { + if (g_str_equal (gs_category_get_id (self->categories[i]), id)) + return g_object_ref (self->categories[i]); + } + + return NULL; +} + +/** + * gs_category_manager_get_categories: + * @self: a #GsCategoryManager + * @out_n_categories: (optional) (out caller-allocates): return location for + * the number of categories in the return value, or %NULL to ignore + * + * Get the full list of categories from the category manager. The returned array + * is %NULL terminated and guaranteed to be non-%NULL (although it may be + * empty). + * + * If @out_n_categories is provided, it will be set to the number of #GsCategory + * objects in the return value, not including the %NULL terminator. + * + * Returns: (array length=out_n_categories) (transfer none) (not nullable): the + * categories; do not free this memory + * Since: 40 + */ +GsCategory * const * +gs_category_manager_get_categories (GsCategoryManager *self, + gsize *out_n_categories) +{ + g_return_val_if_fail (GS_IS_CATEGORY_MANAGER (self), NULL); + + if (out_n_categories != NULL) + *out_n_categories = G_N_ELEMENTS (self->categories) - 1; + + return self->categories; +} diff --git a/lib/gs-category-manager.h b/lib/gs-category-manager.h new file mode 100644 index 0000000..89676fd --- /dev/null +++ b/lib/gs-category-manager.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gs-category.h" + +G_BEGIN_DECLS + +#define GS_TYPE_CATEGORY_MANAGER (gs_category_manager_get_type ()) + +G_DECLARE_FINAL_TYPE (GsCategoryManager, gs_category_manager, GS, CATEGORY_MANAGER, GObject) + +GsCategoryManager *gs_category_manager_new (void); + +GsCategory *gs_category_manager_lookup (GsCategoryManager *self, + const gchar *id); + +GsCategory * const *gs_category_manager_get_categories (GsCategoryManager *self, + gsize *out_n_categories); + +G_END_DECLS diff --git a/lib/gs-category-private.h b/lib/gs-category-private.h new file mode 100644 index 0000000..cc623bb --- /dev/null +++ b/lib/gs-category-private.h @@ -0,0 +1,21 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-category.h" + +G_BEGIN_DECLS + +void gs_category_sort_children (GsCategory *category); +void gs_category_set_size (GsCategory *category, + guint size); +gchar *gs_category_to_string (GsCategory *category); + +G_END_DECLS diff --git a/lib/gs-category.c b/lib/gs-category.c new file mode 100644 index 0000000..1b9162a --- /dev/null +++ b/lib/gs-category.c @@ -0,0 +1,724 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-category + * @short_description: An category that contains applications + * + * This object provides functionality that allows a plugin to create + * a tree structure of categories that each contain #GsApp's. + */ + +#include "config.h" + +#include + +#include "gs-category-private.h" +#include "gs-desktop-data.h" + +struct _GsCategory +{ + GObject parent_instance; + + const GsDesktopData *desktop_data; /* NULL for subcategories */ + const GsDesktopMap *desktop_map; /* NULL for parent categories */ + + GPtrArray *desktop_groups; /* potentially NULL if empty */ + GsCategory *parent; + guint size; /* (atomic) */ + GPtrArray *children; /* potentially NULL if empty */ +}; + +G_DEFINE_TYPE (GsCategory, gs_category, G_TYPE_OBJECT) + +typedef enum { + PROP_ID = 1, + PROP_NAME, + PROP_ICON_NAME, + PROP_SCORE, + PROP_PARENT, + PROP_SIZE, +} GsCategoryProperty; + +static GParamSpec *obj_props[PROP_SIZE + 1] = { NULL, }; + +/** + * gs_category_to_string: + * @category: a #GsCategory + * + * Returns a string representation of the category + * + * Returns: a string + * + * Since: 3.22 + **/ +gchar * +gs_category_to_string (GsCategory *category) +{ + guint i; + GString *str = g_string_new (NULL); + g_string_append_printf (str, "GsCategory[%p]:\n", category); + g_string_append_printf (str, " id: %s\n", + gs_category_get_id (category)); + if (gs_category_get_name (category) != NULL) { + g_string_append_printf (str, " name: %s\n", + gs_category_get_name (category)); + } + if (gs_category_get_icon_name (category) != NULL) { + g_string_append_printf (str, " icon-name: %s\n", + gs_category_get_icon_name (category)); + } + g_string_append_printf (str, " size: %u\n", + gs_category_get_size (category)); + g_string_append_printf (str, " desktop-groups: %u\n", + (category->desktop_groups != NULL) ? category->desktop_groups->len : 0); + if (category->parent != NULL) { + g_string_append_printf (str, " parent: %s\n", + gs_category_get_id (category->parent)); + } + g_string_append_printf (str, " score: %i\n", gs_category_get_score (category)); + if (category->children == NULL || category->children->len == 0) { + g_string_append_printf (str, " children: %u\n", 0u); + } else { + g_string_append_printf (str, " children: %u\n", category->children->len); + for (i = 0; i < category->children->len; i++) { + GsCategory *child = g_ptr_array_index (category->children, i); + g_string_append_printf (str, " - %s\n", + gs_category_get_id (child)); + } + } + return g_string_free (str, FALSE); +} + +/** + * gs_category_get_size: + * @category: a #GsCategory + * + * Returns how many applications the category could contain. + * + * NOTE: This may over-estimate the number if duplicate applications are + * filtered or core applications are not shown. + * + * Returns: the number of apps in the category + * + * Since: 3.22 + **/ +guint +gs_category_get_size (GsCategory *category) +{ + g_return_val_if_fail (GS_IS_CATEGORY (category), 0); + + /* The ‘all’ subcategory is a bit special. */ + if (category->parent != NULL && g_str_equal (gs_category_get_id (category), "all")) + return gs_category_get_size (category->parent); + + return g_atomic_int_get (&category->size); +} + +/** + * gs_category_set_size: + * @category: a #GsCategory + * @size: the number of applications + * + * Sets the number of applications in the category. + * Most plugins do not need to call this function. + * + * Since: 3.22 + **/ +void +gs_category_set_size (GsCategory *category, guint size) +{ + g_return_if_fail (GS_IS_CATEGORY (category)); + + g_atomic_int_set (&category->size, size); + g_object_notify_by_pspec (G_OBJECT (category), obj_props[PROP_SIZE]); +} + +/** + * gs_category_increment_size: + * @category: a #GsCategory + * @value: how many to add + * + * Adds @value to the size count. + * + * Since: 3.22 + **/ +void +gs_category_increment_size (GsCategory *category, + guint value) +{ + g_return_if_fail (GS_IS_CATEGORY (category)); + + g_atomic_int_add (&category->size, value); + if (value != 0) + g_object_notify_by_pspec (G_OBJECT (category), obj_props[PROP_SIZE]); +} + +/** + * gs_category_get_id: + * @category: a #GsCategory + * + * Gets the category ID. + * + * Returns: the string, e.g. "other" + * + * Since: 3.22 + **/ +const gchar * +gs_category_get_id (GsCategory *category) +{ + g_return_val_if_fail (GS_IS_CATEGORY (category), NULL); + + if (category->desktop_data != NULL) + return category->desktop_data->id; + else if (category->desktop_map != NULL) + return category->desktop_map->id; + g_assert_not_reached (); +} + +/** + * gs_category_get_name: + * @category: a #GsCategory + * + * Gets the category name. + * + * Returns: the string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_category_get_name (GsCategory *category) +{ + const gchar *category_id; + + g_return_val_if_fail (GS_IS_CATEGORY (category), NULL); + + category_id = gs_category_get_id (category); + + /* special case, we don't want translations in the plugins */ + if (g_strcmp0 (category_id, "other") == 0) { + /* TRANSLATORS: this is where all apps that don't + * fit in other groups are put */ + return _("Other"); + } + if (g_strcmp0 (category_id, "all") == 0) { + /* TRANSLATORS: this is a subcategory matching all the + * different apps in the parent category, e.g. "Games" */ + return C_("Category", "All"); + } + if (g_strcmp0 (category_id, "featured") == 0) { + /* TRANSLATORS: this is a subcategory of featured apps */ + return _("Featured"); + } + + /* normal case */ + if (category->desktop_data != NULL) { + return gettext (category->desktop_data->name); + } else if (category->desktop_map != NULL) { + g_autofree gchar *msgctxt = g_strdup_printf ("Menu of %s", category->parent->desktop_data->name); + return g_dpgettext2 (GETTEXT_PACKAGE, msgctxt, category->desktop_map->name); + } + + g_assert_not_reached (); +} + +/** + * gs_category_get_icon_name: + * @category: a #GsCategory + * + * Gets the category icon name. + * + * Returns: the string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_category_get_icon_name (GsCategory *category) +{ + const gchar *category_id; + + g_return_val_if_fail (GS_IS_CATEGORY (category), NULL); + + category_id = gs_category_get_id (category); + + /* special case */ + if (g_strcmp0 (category_id, "other") == 0) + return "emblem-system-symbolic"; + if (g_strcmp0 (category_id, "all") == 0) + return "emblem-default-symbolic"; + if (g_strcmp0 (category_id, "featured") == 0) + return "emblem-favorite-symbolic"; + + if (category->desktop_data != NULL) + return category->desktop_data->icon; + else + return NULL; +} + +/** + * gs_category_get_score: + * @category: a #GsCategory + * + * Gets if the category score. + * Important categories may be shown before other categories, or tagged in a + * different way, for example with color or in a different section. + * + * Returns: the string, or %NULL + * + * Since: 3.22 + **/ +gint +gs_category_get_score (GsCategory *category) +{ + g_return_val_if_fail (GS_IS_CATEGORY (category), FALSE); + + if (category->desktop_data != NULL) + return category->desktop_data->score; + else + return 0; +} + +/** + * gs_category_get_desktop_groups: + * @category: a #GsCategory + * + * Gets the list of AppStream groups for the category. + * + * Returns: (element-type utf8) (transfer none): An array + * + * Since: 3.22 + **/ +GPtrArray * +gs_category_get_desktop_groups (GsCategory *category) +{ + g_return_val_if_fail (GS_IS_CATEGORY (category), NULL); + + if (category->desktop_groups == NULL) + category->desktop_groups = g_ptr_array_new_with_free_func (g_free); + + return category->desktop_groups; +} + +/** + * gs_category_has_desktop_group: + * @category: a #GsCategory + * @desktop_group: a group of categories found in AppStream, e.g. "AudioVisual::Player" + * + * Finds out if the category has the specific AppStream desktop group. + * + * Returns: %TRUE if found, %FALSE otherwise + * + * Since: 3.22 + **/ +gboolean +gs_category_has_desktop_group (GsCategory *category, const gchar *desktop_group) +{ + guint i; + + g_return_val_if_fail (GS_IS_CATEGORY (category), FALSE); + g_return_val_if_fail (desktop_group != NULL, FALSE); + + if (category->desktop_groups == NULL) + return FALSE; + + for (i = 0; i < category->desktop_groups->len; i++) { + const gchar *tmp = g_ptr_array_index (category->desktop_groups, i); + if (g_strcmp0 (tmp, desktop_group) == 0) + return TRUE; + } + return FALSE; +} + +/* + * gs_category_add_desktop_group: + * @category: a #GsCategory + * @desktop_group: a group of categories found in AppStream, e.g. "AudioVisual::Player" + * + * Adds a desktop group to the category. + * A desktop group is a set of category strings that all must exist. + * + * Since: 3.22 + */ +static void +gs_category_add_desktop_group (GsCategory *category, const gchar *desktop_group) +{ + g_return_if_fail (GS_IS_CATEGORY (category)); + g_return_if_fail (desktop_group != NULL); + + /* add if not already found, and lazily create the groups array + * (since it’s only needed in child categories) */ + if (gs_category_has_desktop_group (category, desktop_group)) + return; + if (category->desktop_groups == NULL) + category->desktop_groups = g_ptr_array_new_with_free_func (g_free); + g_ptr_array_add (category->desktop_groups, g_strdup (desktop_group)); +} + +/** + * gs_category_find_child: + * @category: a #GsCategory + * @id: a category ID, e.g. "other" + * + * Find a child category with a specific ID. + * + * Returns: (transfer none): the #GsCategory, or %NULL + * + * Since: 3.22 + **/ +GsCategory * +gs_category_find_child (GsCategory *category, const gchar *id) +{ + GsCategory *tmp; + guint i; + + if (category->children == NULL) + return NULL; + + /* find the subcategory */ + for (i = 0; i < category->children->len; i++) { + tmp = GS_CATEGORY (g_ptr_array_index (category->children, i)); + if (g_strcmp0 (id, gs_category_get_id (tmp)) == 0) + return tmp; + } + return NULL; +} + +/** + * gs_category_get_parent: + * @category: a #GsCategory + * + * Gets the parent category. + * + * Returns: the #GsCategory or %NULL + * + * Since: 3.22 + **/ +GsCategory * +gs_category_get_parent (GsCategory *category) +{ + g_return_val_if_fail (GS_IS_CATEGORY (category), NULL); + return category->parent; +} + +/** + * gs_category_get_children: + * @category: a #GsCategory + * + * Gets the list if children for a category. + * + * Return value: (element-type GsApp) (transfer none): A list of children + * + * Since: 3.22 + **/ +GPtrArray * +gs_category_get_children (GsCategory *category) +{ + g_return_val_if_fail (GS_IS_CATEGORY (category), NULL); + + if (category->children == NULL) + category->children = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + + return category->children; +} + +/* + * gs_category_add_child: + * @category: a #GsCategory + * @subcategory: a #GsCategory + * + * Adds a child category to a parent category. + * + * Since: 3.22 + */ +static void +gs_category_add_child (GsCategory *category, GsCategory *subcategory) +{ + g_return_if_fail (GS_IS_CATEGORY (category)); + g_return_if_fail (GS_IS_CATEGORY (subcategory)); + + /* lazily create the array to save memory in subcategories, which don’t + * recursively have children */ + if (category->children == NULL) + category->children = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + + /* FIXME: do we need this? */ + subcategory->parent = category; + g_object_add_weak_pointer (G_OBJECT (subcategory->parent), + (gpointer *) &subcategory->parent); + + g_ptr_array_add (category->children, + g_object_ref (subcategory)); +} + +static gchar * +gs_category_get_sort_key (GsCategory *category) +{ + guint sort_order = 5; + if (g_strcmp0 (gs_category_get_id (category), "featured") == 0) + sort_order = 0; + else if (g_strcmp0 (gs_category_get_id (category), "all") == 0) + sort_order = 2; + else if (g_strcmp0 (gs_category_get_id (category), "other") == 0) + sort_order = 9; + return g_strdup_printf ("%u:%s", + sort_order, + gs_category_get_name (category)); +} + +static gint +gs_category_sort_children_cb (gconstpointer a, gconstpointer b) +{ + GsCategory *ca = GS_CATEGORY (*(GsCategory **) a); + GsCategory *cb = GS_CATEGORY (*(GsCategory **) b); + g_autofree gchar *id_a = gs_category_get_sort_key (ca); + g_autofree gchar *id_b = gs_category_get_sort_key (cb); + return g_strcmp0 (id_a, id_b); +} + +/** + * gs_category_sort_children: + * @category: a #GsCategory + * + * Sorts the list of children. + * + * Since: 3.22 + **/ +void +gs_category_sort_children (GsCategory *category) +{ + if (category->children == NULL) + return; + + g_ptr_array_sort (category->children, + gs_category_sort_children_cb); +} + +static void +gs_category_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsCategory *self = GS_CATEGORY (object); + + switch ((GsCategoryProperty) prop_id) { + case PROP_ID: + g_value_set_string (value, gs_category_get_id (self)); + break; + case PROP_NAME: + g_value_set_string (value, gs_category_get_name (self)); + break; + case PROP_ICON_NAME: + g_value_set_string (value, gs_category_get_icon_name (self)); + break; + case PROP_SCORE: + g_value_set_int (value, gs_category_get_score (self)); + break; + case PROP_PARENT: + g_value_set_object (value, self->parent); + break; + case PROP_SIZE: + g_value_set_uint (value, gs_category_get_size (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_category_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsCategory *self = GS_CATEGORY (object); + + switch ((GsCategoryProperty) prop_id) { + case PROP_ID: + case PROP_NAME: + case PROP_ICON_NAME: + case PROP_SCORE: + case PROP_PARENT: + /* Read only */ + g_assert_not_reached (); + break; + case PROP_SIZE: + gs_category_set_size (self, g_value_get_uint (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_category_finalize (GObject *object) +{ + GsCategory *category = GS_CATEGORY (object); + + if (category->parent != NULL) + g_object_remove_weak_pointer (G_OBJECT (category->parent), + (gpointer *) &category->parent); + g_clear_pointer (&category->children, g_ptr_array_unref); + g_clear_pointer (&category->desktop_groups, g_ptr_array_unref); + + G_OBJECT_CLASS (gs_category_parent_class)->finalize (object); +} + +static void +gs_category_class_init (GsCategoryClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gs_category_get_property; + object_class->set_property = gs_category_set_property; + object_class->finalize = gs_category_finalize; + + /** + * GsCategory:id: + * + * A machine readable identifier for the category. Must be non-empty + * and in a valid format to be a + * [desktop category ID](https://specifications.freedesktop.org/menu-spec/latest/). + * + * Since: 40 + */ + obj_props[PROP_ID] = + g_param_spec_string ("id", NULL, NULL, + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsCategory:name: + * + * Human readable name for the category. + * + * Since: 40 + */ + obj_props[PROP_NAME] = + g_param_spec_string ("name", NULL, NULL, + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsCategory:icon-name: (nullable) + * + * Name of the icon to use for the category, or %NULL if none is set. + * + * Since: 40 + */ + obj_props[PROP_ICON_NAME] = + g_param_spec_string ("icon-name", NULL, NULL, + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsCategory:score: + * + * Score for sorting the category. Lower numeric values indicate more + * important categories. + * + * Since: 40 + */ + obj_props[PROP_SCORE] = + g_param_spec_int ("score", NULL, NULL, + G_MININT, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsCategory:parent: (nullable) + * + * The parent #GsCategory, or %NULL if this category is at the top + * level. + * + * Since: 40 + */ + obj_props[PROP_PARENT] = + g_param_spec_object ("parent", NULL, NULL, + GS_TYPE_CATEGORY, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsCategory:size: + * + * Number of apps in this category, including apps in its subcategories. + * + * This has to be initialised externally to the #GsCategory by calling + * gs_category_increment_size(). + * + * Since: 40 + */ + obj_props[PROP_SIZE] = + g_param_spec_uint ("size", NULL, NULL, + 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +static void +gs_category_init (GsCategory *category) +{ +} + +/** + * gs_category_new_for_desktop_data: + * @data: data for the category, which must be static and constant + * + * Create a new #GsCategory instance which wraps the desktop category + * information in @data. Where possible, the static data will be reused, so + * @data must be static and constant across the lifetime of the process. + * + * Returns: (transfer full): a new #GsCategory wrapping @data + * Since: 40 + */ +GsCategory * +gs_category_new_for_desktop_data (const GsDesktopData *data) +{ + g_autoptr(GsCategory) category = NULL; + GsCategory *subcategory_all = NULL; + + /* parent category */ + category = g_object_new (GS_TYPE_CATEGORY, NULL); + category->desktop_data = data; + + /* add subcategories */ + for (gsize j = 0; data->mapping[j].id != NULL; j++) { + const GsDesktopMap *map = &data->mapping[j]; + g_autoptr(GsCategory) sub = g_object_new (GS_TYPE_CATEGORY, NULL); + sub->desktop_map = map; + for (gsize k = 0; map->fdo_cats[k] != NULL; k++) + gs_category_add_desktop_group (sub, map->fdo_cats[k]); + gs_category_add_child (category, sub); + + if (g_str_equal (map->id, "all")) + subcategory_all = sub; + } + + /* set up the ‘all’ subcategory specially, adding all the desktop groups + * from all other child categories to it */ + if (subcategory_all != NULL) { + g_assert (category->children != NULL); + + for (guint i = 0; i < category->children->len; i++) { + GPtrArray *desktop_groups; + GsCategory *child; + + /* ignore the all category */ + child = g_ptr_array_index (category->children, i); + if (child == subcategory_all) + continue; + + /* add all desktop groups */ + desktop_groups = gs_category_get_desktop_groups (child); + for (guint j = 0; j < desktop_groups->len; j++) { + const gchar *tmp = g_ptr_array_index (desktop_groups, j); + gs_category_add_desktop_group (subcategory_all, tmp); + } + } + } + + return g_steal_pointer (&category); +} diff --git a/lib/gs-category.h b/lib/gs-category.h new file mode 100644 index 0000000..769b82b --- /dev/null +++ b/lib/gs-category.h @@ -0,0 +1,45 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gs-desktop-data.h" + +G_BEGIN_DECLS + +#define GS_TYPE_CATEGORY (gs_category_get_type ()) + +G_DECLARE_FINAL_TYPE (GsCategory, gs_category, GS, CATEGORY, GObject) + +GsCategory *gs_category_new_for_desktop_data (const GsDesktopData *data); + +const gchar *gs_category_get_id (GsCategory *category); +GsCategory *gs_category_get_parent (GsCategory *category); + +const gchar *gs_category_get_name (GsCategory *category); +const gchar *gs_category_get_icon_name (GsCategory *category); +gint gs_category_get_score (GsCategory *category); + +GPtrArray *gs_category_get_desktop_groups (GsCategory *category); +gboolean gs_category_has_desktop_group (GsCategory *category, + const gchar *desktop_group); + +GsCategory *gs_category_find_child (GsCategory *category, + const gchar *id); +GPtrArray *gs_category_get_children (GsCategory *category); + +guint gs_category_get_size (GsCategory *category); +void gs_category_increment_size (GsCategory *category, + guint value); + +G_END_DECLS diff --git a/lib/gs-cmd.c b/lib/gs-cmd.c new file mode 100644 index 0000000..9a1a248 --- /dev/null +++ b/lib/gs-cmd.c @@ -0,0 +1,794 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2014-2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include + +#include "gnome-software-private.h" + +#include "gs-debug.h" + +typedef struct { + GsPluginLoader *plugin_loader; + guint64 refine_flags; + guint max_results; + gboolean interactive; + gboolean only_freely_licensed; +} GsCmdSelf; + +static void +gs_cmd_show_results_apps (GsAppList *list) +{ + for (guint j = 0; j < gs_app_list_length (list); j++) { + GsApp *app = gs_app_list_index (list, j); + GsAppList *related = gs_app_get_related (app); + g_autofree gchar *tmp = gs_app_to_string (app); + g_print ("%s\n", tmp); + for (guint i = 0; i < gs_app_list_length (related); i++) { + g_autofree gchar *tmp_rel = NULL; + GsApp *app_rel = GS_APP (gs_app_list_index (related, i)); + tmp_rel = gs_app_to_string (app_rel); + g_print ("\t%s\n", tmp_rel); + } + } +} + +static gchar * +gs_cmd_pad_spaces (const gchar *text, guint length) +{ + gsize i; + GString *str; + str = g_string_sized_new (length + 1); + g_string_append (str, text); + for (i = strlen (text); i < length; i++) + g_string_append_c (str, ' '); + return g_string_free (str, FALSE); +} + +static void +gs_cmd_show_results_categories (GPtrArray *list) +{ + for (guint i = 0; i < list->len; i++) { + GsCategory *cat = GS_CATEGORY (g_ptr_array_index (list, i)); + GsCategory *parent = gs_category_get_parent (cat); + g_autofree gchar *tmp = NULL; + if (parent != NULL){ + g_autofree gchar *id = NULL; + id = g_strdup_printf ("%s/%s [%u]", + gs_category_get_id (parent), + gs_category_get_id (cat), + gs_category_get_size (cat)); + tmp = gs_cmd_pad_spaces (id, 32); + g_print ("%s : %s\n", + tmp, gs_category_get_name (cat)); + } else { + GPtrArray *subcats = gs_category_get_children (cat); + tmp = gs_cmd_pad_spaces (gs_category_get_id (cat), 32); + g_print ("%s : %s\n", + tmp, gs_category_get_name (cat)); + gs_cmd_show_results_categories (subcats); + } + } +} + +static GsPluginRefineFlags +gs_cmd_refine_flag_from_string (const gchar *flag, GError **error) +{ + if (g_strcmp0 (flag, "all") == 0) + return G_MAXINT32; + if (g_strcmp0 (flag, "license") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE; + if (g_strcmp0 (flag, "url") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL; + if (g_strcmp0 (flag, "description") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION; + if (g_strcmp0 (flag, "size") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE; + if (g_strcmp0 (flag, "rating") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING; + if (g_strcmp0 (flag, "version") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION; + if (g_strcmp0 (flag, "history") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY; + if (g_strcmp0 (flag, "setup-action") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION; + if (g_strcmp0 (flag, "update-details") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS; + if (g_strcmp0 (flag, "origin") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN; + if (g_strcmp0 (flag, "related") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED; + if (g_strcmp0 (flag, "menu-path") == 0) + /* no longer supported by itself; categories are largely equivalent */ + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES; + if (g_strcmp0 (flag, "upgrade-removed") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPGRADE_REMOVED; + if (g_strcmp0 (flag, "provenance") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE; + if (g_strcmp0 (flag, "reviews") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS; + if (g_strcmp0 (flag, "review-ratings") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS; + if (g_strcmp0 (flag, "key-colors") == 0) + /* no longer supported by itself; derived automatically from the icon */ + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON; + if (g_strcmp0 (flag, "icon") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON; + if (g_strcmp0 (flag, "permissions") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS; + if (g_strcmp0 (flag, "origin-hostname") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME; + if (g_strcmp0 (flag, "origin-ui") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI; + if (g_strcmp0 (flag, "runtime") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME; + if (g_strcmp0 (flag, "categories") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES; + if (g_strcmp0 (flag, "project-group") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROJECT_GROUP; + if (g_strcmp0 (flag, "developer-name") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME; + if (g_strcmp0 (flag, "kudos") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS; + if (g_strcmp0 (flag, "content-rating") == 0) + return GS_PLUGIN_REFINE_FLAGS_REQUIRE_CONTENT_RATING; + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "GsPluginRefineFlag '%s' not recognised", flag); + return 0; +} + +static guint64 +gs_cmd_parse_refine_flags (const gchar *extra, GError **error) +{ + GsPluginRefineFlags tmp; + guint i; + guint64 refine_flags = GS_PLUGIN_REFINE_FLAGS_NONE; + g_auto(GStrv) split = NULL; + + if (extra == NULL) + return GS_PLUGIN_REFINE_FLAGS_NONE; + + split = g_strsplit (extra, ",", -1); + for (i = 0; split[i] != NULL; i++) { + tmp = gs_cmd_refine_flag_from_string (split[i], error); + if (tmp == 0) + return G_MAXUINT64; + refine_flags |= tmp; + } + return refine_flags; +} + +static GsPluginListAppsFlags +get_list_apps_flags (GsCmdSelf *self) +{ + GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE; + + if (self->interactive) + flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE; + + return flags; +} + +static GsAppQueryLicenseType +get_query_license_type (GsCmdSelf *self) +{ + if (self->only_freely_licensed) + return GS_APP_QUERY_LICENSE_FOSS; + return GS_APP_QUERY_LICENSE_ANY; +} + +static gboolean +gs_cmd_install_remove_exec (GsCmdSelf *self, gboolean is_install, const gchar *name, GError **error) +{ + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) list_filtered = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job2 = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + gboolean show_installed = TRUE; + const gchar * const keywords[] = { name, NULL }; + + /* ensure set */ + self->refine_flags |= GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON; + self->refine_flags |= GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION; + + /* do search */ + query = gs_app_query_new ("keywords", keywords, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, NULL, error); + if (list == NULL) + return FALSE; + if (gs_app_list_length (list) == 0) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "no components matched '%s'", + name); + return FALSE; + } + + /* filter */ + if (is_install) + show_installed = FALSE; + list_filtered = gs_app_list_new (); + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app_tmp = gs_app_list_index (list, i); + if (gs_app_is_installed (app_tmp) == show_installed) + gs_app_list_add (list_filtered, app_tmp); + } + + /* nothing */ + if (gs_app_list_length (list_filtered) == 0) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "no components were in the correct state for '%s %s'", + is_install ? "install" : "remove", name); + return FALSE; + } + + /* install */ + if (is_install) { + plugin_job2 = gs_plugin_job_install_apps_new (list_filtered, + self->interactive ? GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE : GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + } else { + plugin_job2 = gs_plugin_job_uninstall_apps_new (list_filtered, + self->interactive ? GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE : GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + } + + return gs_plugin_loader_job_action (self->plugin_loader, plugin_job2, + NULL, error); +} + +static void +gs_cmd_self_free (GsCmdSelf *self) +{ + if (self->plugin_loader != NULL) + g_object_unref (self->plugin_loader); + g_free (self); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsCmdSelf, gs_cmd_self_free) + +static gint +app_sort_kind_cb (GsApp *app1, GsApp *app2, gpointer user_data) +{ + if (gs_app_get_kind (app1) == AS_COMPONENT_KIND_DESKTOP_APP) + return -1; + if (gs_app_get_kind (app2) == AS_COMPONENT_KIND_DESKTOP_APP) + return 1; + return 0; +} + +int +main (int argc, char **argv) +{ + g_autoptr(GOptionContext) context = NULL; + gboolean prefer_local = FALSE; + gboolean ret; + gboolean show_results = FALSE; + gboolean verbose = FALSE; + gint i; + guint64 cache_age_secs = 0; + gint repeat = 1; + g_auto(GStrv) plugin_blocklist = NULL; + g_auto(GStrv) plugin_allowlist = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GPtrArray) categories = NULL; + g_autoptr(GsDebug) debug = gs_debug_new_from_environment (); + g_autofree gchar *plugin_blocklist_str = NULL; + g_autofree gchar *plugin_allowlist_str = NULL; + g_autofree gchar *refine_flags_str = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GsCmdSelf) self = g_new0 (GsCmdSelf, 1); + const GOptionEntry options[] = { + { "show-results", '\0', 0, G_OPTION_ARG_NONE, &show_results, + "Show the results for the action", NULL }, + { "refine-flags", '\0', 0, G_OPTION_ARG_STRING, &refine_flags_str, + "Set any refine flags required for the action", NULL }, + { "repeat", '\0', 0, G_OPTION_ARG_INT, &repeat, + "Repeat the action this number of times", NULL }, + { "cache-age", '\0', 0, G_OPTION_ARG_INT64, &cache_age_secs, + "Use this maximum cache age in seconds", NULL }, + { "max-results", '\0', 0, G_OPTION_ARG_INT, &self->max_results, + "Return a maximum number of results", NULL }, + { "prefer-local", '\0', 0, G_OPTION_ARG_NONE, &prefer_local, + "Prefer local file sources to AppStream", NULL }, + { "plugin-blocklist", '\0', 0, G_OPTION_ARG_STRING, &plugin_blocklist_str, + "Do not load specific plugins", NULL }, + { "plugin-allowlist", '\0', 0, G_OPTION_ARG_STRING, &plugin_allowlist_str, + "Only load specific plugins", NULL }, + { "verbose", '\0', 0, G_OPTION_ARG_NONE, &verbose, + "Show verbose debugging information", NULL }, + { "interactive", 'i', 0, G_OPTION_ARG_NONE, &self->interactive, + "Allow interactive authentication", NULL }, + { "only-freely-licensed", '\0', 0, G_OPTION_ARG_NONE, &self->only_freely_licensed, + "Filter results to include only freely licensed apps", NULL }, + { NULL} + }; + + setlocale (LC_ALL, ""); + + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + gtk_init (); + + context = g_option_context_new (NULL); + g_option_context_set_summary (context, "GNOME Software Test Program"); + g_option_context_add_main_entries (context, options, NULL); + ret = g_option_context_parse (context, &argc, &argv, &error); + if (!ret) { + g_print ("Failed to parse options: %s\n", error->message); + return EXIT_FAILURE; + } + gs_debug_set_verbose (debug, verbose); + + /* prefer local sources */ + if (prefer_local) + g_setenv ("GNOME_SOFTWARE_PREFER_LOCAL", "true", TRUE); + + /* parse any refine flags */ + self->refine_flags = gs_cmd_parse_refine_flags (refine_flags_str, &error); + if (self->refine_flags == G_MAXUINT64) { + g_print ("Flag unknown: %s\n", error->message); + return EXIT_FAILURE; + } + + /* load plugins */ + self->plugin_loader = gs_plugin_loader_new (NULL, NULL); + if (g_file_test (LOCALPLUGINDIR, G_FILE_TEST_EXISTS)) + gs_plugin_loader_add_location (self->plugin_loader, LOCALPLUGINDIR); + if (plugin_allowlist_str != NULL) + plugin_allowlist = g_strsplit (plugin_allowlist_str, ",", -1); + if (plugin_blocklist_str != NULL) + plugin_blocklist = g_strsplit (plugin_blocklist_str, ",", -1); + ret = gs_plugin_loader_setup (self->plugin_loader, + (const gchar * const *) plugin_allowlist, + (const gchar * const *) plugin_blocklist, + NULL, + &error); + if (!ret) { + g_print ("Failed to setup plugins: %s\n", error->message); + return EXIT_FAILURE; + } + gs_plugin_loader_dump_state (self->plugin_loader); + + /* ensure that at least some metadata of any age is present, and also + * spin up the plugins enough as to prime caches */ + if (g_getenv ("GS_CMD_NO_INITIAL_REFRESH") == NULL) { + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPluginRefreshMetadataFlags refresh_metadata_flags = GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE; + + if (self->interactive) + refresh_metadata_flags |= GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE; + + plugin_job = gs_plugin_job_refresh_metadata_new (G_MAXUINT64, refresh_metadata_flags); + ret = gs_plugin_loader_job_action (self->plugin_loader, plugin_job, + NULL, &error); + if (!ret) { + g_print ("Failed to refresh plugins: %s\n", error->message); + return EXIT_FAILURE; + } + } + + /* do action */ + if (argc == 2 && g_strcmp0 (argv[1], "installed") == 0) { + for (i = 0; i < repeat; i++) { + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + if (list != NULL) + g_object_unref (list); + + query = gs_app_query_new ("is-installed", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, + NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 3 && g_strcmp0 (argv[1], "search") == 0) { + for (i = 0; i < repeat; i++) { + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + const gchar *keywords[2] = { argv[2], NULL }; + + if (list != NULL) + g_object_unref (list); + + query = gs_app_query_new ("keywords", keywords, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 3 && g_strcmp0 (argv[1], "get-alternates") == 0) { + app = gs_app_new (argv[2]); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + for (i = 0; i < repeat; i++) { + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + if (list != NULL) + g_object_unref (list); + + query = gs_app_query_new ("alternate-of", app, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_priority, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 3 && g_strcmp0 (argv[1], "install") == 0) { + ret = gs_cmd_install_remove_exec (self, TRUE, argv[2], &error); + } else if (argc == 3 && g_strcmp0 (argv[1], "remove") == 0) { + ret = gs_cmd_install_remove_exec (self, FALSE, argv[2], &error); + } else if (argc == 3 && g_strcmp0 (argv[1], "action-upgrade-download") == 0) { + g_autoptr(GsPluginJob) plugin_job = NULL; + app = gs_app_new (argv[2]); + gs_app_set_kind (app, AS_COMPONENT_KIND_OPERATING_SYSTEM); + plugin_job = gs_plugin_job_download_upgrade_new (app, + self->interactive ? GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE : + GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_NONE); + ret = gs_plugin_loader_job_action (self->plugin_loader, plugin_job, + NULL, &error); + if (ret) + gs_app_list_add (list, app); + } else if (argc == 3 && g_strcmp0 (argv[1], "refine") == 0) { + app = gs_app_new (argv[2]); + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + plugin_job = gs_plugin_job_refine_new_for_app (app, self->refine_flags); + ret = gs_plugin_loader_job_action (self->plugin_loader, plugin_job, + NULL, &error); + if (!ret) + break; + } + list = gs_app_list_new (); + gs_app_list_add (list, app); + } else if (argc == 3 && g_strcmp0 (argv[1], "launch") == 0) { + app = gs_app_new (argv[2]); + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + plugin_job = gs_plugin_job_launch_new (app, + self->interactive ? GS_PLUGIN_LAUNCH_FLAGS_INTERACTIVE : + GS_PLUGIN_LAUNCH_FLAGS_NONE); + ret = gs_plugin_loader_job_action (self->plugin_loader, plugin_job, + NULL, &error); + if (!ret) + break; + } + } else if (argc == 3 && g_strcmp0 (argv[1], "filename-to-app") == 0) { + g_autoptr(GsPluginJob) plugin_job = NULL; + file = g_file_new_for_path (argv[2]); + plugin_job = gs_plugin_job_file_to_app_new (file, + self->interactive ? GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE : + GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, self->refine_flags); + gs_plugin_job_set_max_results (plugin_job, self->max_results); + app = gs_plugin_loader_job_process_app (self->plugin_loader, plugin_job, NULL, &error); + if (app == NULL) { + ret = FALSE; + } else { + list = gs_app_list_new (); + gs_app_list_add (list, app); + } + } else if (argc == 3 && g_strcmp0 (argv[1], "url-to-app") == 0) { + g_autoptr(GsPluginJob) plugin_job = NULL; + plugin_job = gs_plugin_job_url_to_app_new (argv[2], + self->interactive ? GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE : + GS_PLUGIN_URL_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, self->refine_flags); + gs_plugin_job_set_max_results (plugin_job, self->max_results); + app = gs_plugin_loader_job_process_app (self->plugin_loader, plugin_job, + NULL, &error); + if (app == NULL) { + ret = FALSE; + } else { + list = gs_app_list_new (); + gs_app_list_add (list, app); + } + } else if (argc == 2 && g_strcmp0 (argv[1], "updates") == 0) { + for (i = 0; i < repeat; i++) { + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + if (list != NULL) + g_object_unref (list); + query = gs_app_query_new ("is-for-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, self->interactive ? + GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE : + GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, + NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 2 && g_strcmp0 (argv[1], "upgrades") == 0) { + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPluginListDistroUpgradesFlags upgrades_flags = GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE; + + if (list != NULL) + g_object_unref (list); + + if (self->interactive) + upgrades_flags |= GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_INTERACTIVE; + + plugin_job = gs_plugin_job_list_distro_upgrades_new (upgrades_flags, self->refine_flags); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, + NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 2 && g_strcmp0 (argv[1], "sources") == 0) { + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + query = gs_app_query_new ("is-source", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, self->interactive ? GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE : GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (self->plugin_loader, + plugin_job, + NULL, + &error); + if (list == NULL) + ret = FALSE; + } else if (argc == 2 && g_strcmp0 (argv[1], "popular") == 0) { + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + + if (list != NULL) + g_object_unref (list); + + query = gs_app_query_new ("is-curated", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + "sort-func", app_sort_kind_cb, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, + NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 2 && g_strcmp0 (argv[1], "featured") == 0) { + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + + if (list != NULL) + g_object_unref (list); + + query = gs_app_query_new ("is-featured", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, + NULL, &error); + + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 3 && g_strcmp0 (argv[1], "deployment-featured") == 0) { + g_auto(GStrv) split = g_strsplit (argv[2], ",", -1); + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + + if (list != NULL) + g_object_unref (list); + + query = gs_app_query_new ("deployment-featured", split, + "refine-flags", self->refine_flags, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_KEY_ID, + "max-results", self->max_results, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, + NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 2 && g_strcmp0 (argv[1], "recent") == 0) { + if (cache_age_secs == 0) + cache_age_secs = 60 * 60 * 24 * 60; + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GDateTime) now = NULL; + g_autoptr(GDateTime) released_since = NULL; + g_autoptr(GsAppQuery) query = NULL; + + if (list != NULL) + g_object_unref (list); + + now = g_date_time_new_now_local (); + released_since = g_date_time_add_seconds (now, -cache_age_secs); + query = gs_app_query_new ("released-since", released_since, + "refine-flags", self->refine_flags, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_KEY_ID, + "max-results", self->max_results, + "sort-func", app_sort_kind_cb, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, + NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc == 2 && g_strcmp0 (argv[1], "get-categories") == 0) { + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPluginRefineCategoriesFlags flags = GS_PLUGIN_REFINE_CATEGORIES_FLAGS_SIZE; + + if (categories != NULL) + g_ptr_array_unref (categories); + + if (self->interactive) + flags |= GS_PLUGIN_REFINE_CATEGORIES_FLAGS_INTERACTIVE; + + plugin_job = gs_plugin_job_list_categories_new (flags); + if (!gs_plugin_loader_job_action (self->plugin_loader, plugin_job, NULL, &error)) { + ret = FALSE; + break; + } + + categories = g_ptr_array_ref (gs_plugin_job_list_categories_get_result_list (GS_PLUGIN_JOB_LIST_CATEGORIES (plugin_job))); + } + } else if (argc == 3 && g_strcmp0 (argv[1], "get-category-apps") == 0) { + g_autoptr(GsCategory) category_owned = NULL; + GsCategory *category = NULL; + g_auto(GStrv) split = NULL; + GsCategoryManager *manager = gs_plugin_loader_get_category_manager (self->plugin_loader); + + split = g_strsplit (argv[2], "/", 2); + if (g_strv_length (split) == 1) { + category_owned = gs_category_manager_lookup (manager, split[0]); + category = category_owned; + } else { + g_autoptr(GsCategory) parent = gs_category_manager_lookup (manager, split[0]); + if (parent != NULL) + category = gs_category_find_child (parent, split[1]); + } + + if (category == NULL) { + g_printerr ("Error: Could not find category ‘%s’\n", argv[2]); + return EXIT_FAILURE; + } + + for (i = 0; i < repeat; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + + if (list != NULL) + g_object_unref (list); + + query = gs_app_query_new ("category", category, + "refine-flags", self->refine_flags, + "max-results", self->max_results, + "sort-func", gs_utils_app_sort_name, + "license-type", get_query_license_type (self), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, get_list_apps_flags (self)); + list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, NULL, &error); + if (list == NULL) { + ret = FALSE; + break; + } + } + } else if (argc >= 2 && g_strcmp0 (argv[1], "refresh") == 0) { + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPluginRefreshMetadataFlags refresh_metadata_flags = GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE; + + if (self->interactive) + refresh_metadata_flags |= GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE; + + plugin_job = gs_plugin_job_refresh_metadata_new (cache_age_secs, refresh_metadata_flags); + ret = gs_plugin_loader_job_action (self->plugin_loader, plugin_job, + NULL, &error); + } else if (argc >= 1 && g_strcmp0 (argv[1], "user-hash") == 0) { + g_autofree gchar *user_hash = gs_utils_get_user_hash (&error); + if (user_hash == NULL) { + ret = FALSE; + } else { + g_print ("%s\n", user_hash); + ret = TRUE; + } + } else { + ret = FALSE; + g_set_error_literal (&error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "Did not recognise option, use 'installed', " + "'updates', 'popular', 'get-categories', " + "'get-category-apps', 'get-alternates', 'filename-to-app', " + "'install', 'remove', " + "'sources', 'refresh', 'launch' or 'search'"); + } + if (!ret) { + g_print ("Failed: %s\n", error->message); + return EXIT_FAILURE; + } + + if (show_results) { + if (list != NULL) + gs_cmd_show_results_apps (list); + if (categories != NULL) + gs_cmd_show_results_categories (categories); + } + return EXIT_SUCCESS; +} diff --git a/lib/gs-debug.c b/lib/gs-debug.c new file mode 100644 index 0000000..cb81e30 --- /dev/null +++ b/lib/gs-debug.c @@ -0,0 +1,298 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * Copyright (C) 2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-os-release.h" +#include "gs-debug.h" + +struct _GsDebug +{ + GObject parent_instance; + + gchar **domains; /* (owned) (nullable), read-only after construction, guaranteed to be %NULL if empty */ + gboolean verbose; /* (atomic) */ + gboolean use_time; /* read-only after construction */ +}; + +G_DEFINE_TYPE (GsDebug, gs_debug, G_TYPE_OBJECT) + +static GLogWriterOutput +gs_log_writer_console (GLogLevelFlags log_level, + const GLogField *fields, + gsize n_fields, + gpointer user_data) +{ + GsDebug *debug = GS_DEBUG (user_data); + gboolean verbose; + const gchar * const *domains = NULL; + const gchar *log_domain = NULL; + const gchar *log_message = NULL; + g_autofree gchar *tmp = NULL; + g_autoptr(GString) domain = NULL; + + domains = (const gchar * const *) debug->domains; + verbose = g_atomic_int_get (&debug->verbose); + + /* check enabled, fast path without parsing fields */ + if ((log_level == G_LOG_LEVEL_DEBUG || + log_level == G_LOG_LEVEL_INFO) && + !verbose && + debug->domains == NULL) + return G_LOG_WRITER_HANDLED; + + /* get data from arguments */ + for (gsize i = 0; i < n_fields; i++) { + if (g_strcmp0 (fields[i].key, "MESSAGE") == 0) { + log_message = fields[i].value; + continue; + } + if (g_strcmp0 (fields[i].key, "GLIB_DOMAIN") == 0) { + log_domain = fields[i].value; + continue; + } + } + + /* check enabled, slower path */ + if ((log_level == G_LOG_LEVEL_DEBUG || + log_level == G_LOG_LEVEL_INFO) && + !verbose && + debug->domains != NULL && + g_strcmp0 (debug->domains[0], "all") != 0 && + (log_domain == NULL || !g_strv_contains (domains, log_domain))) + return G_LOG_WRITER_HANDLED; + + /* this is really verbose */ + if ((g_strcmp0 (log_domain, "dconf") == 0 || + g_strcmp0 (log_domain, "GLib-GIO") == 0 || + g_strcmp0 (log_domain, "GLib-Net") == 0 || + g_strcmp0 (log_domain, "GdkPixbuf") == 0) && + log_level == G_LOG_LEVEL_DEBUG) + return G_LOG_WRITER_HANDLED; + + /* time header */ + if (debug->use_time) { + g_autoptr(GDateTime) dt = g_date_time_new_now_utc (); + tmp = g_strdup_printf ("%02i:%02i:%02i:%03i", + g_date_time_get_hour (dt), + g_date_time_get_minute (dt), + g_date_time_get_second (dt), + g_date_time_get_microsecond (dt) / 1000); + } + + /* pad out domain */ + domain = g_string_new (log_domain); + for (guint i = domain->len; i < 3; i++) + g_string_append (domain, " "); + + switch (log_level) { + case G_LOG_LEVEL_ERROR: + case G_LOG_LEVEL_CRITICAL: + case G_LOG_LEVEL_WARNING: + /* to screen */ + if (isatty (fileno (stderr)) == 1) { + /* critical in red */ + if (tmp != NULL) + g_printerr ("%c[%dm%s ", 0x1B, 32, tmp); + g_printerr ("%s ", domain->str); + g_printerr ("%c[%dm%s\n%c[%dm", 0x1B, 31, log_message, 0x1B, 0); + } else { /* to file */ + if (tmp != NULL) + g_printerr ("%s ", tmp); + g_printerr ("%s ", domain->str); + g_printerr ("%s\n", log_message); + } + break; + default: + /* to screen */ + if (isatty (fileno (stdout)) == 1) { + /* debug in blue */ + if (tmp != NULL) + g_print ("%c[%dm%s ", 0x1B, 32, tmp); + g_print ("%s ", domain->str); + g_print ("%c[%dm%s\n%c[%dm", 0x1B, 34, log_message, 0x1B, 0); + break; + } else { /* to file */ + if (tmp != NULL) + g_print ("%s ", tmp); + g_print ("%s ", domain->str); + g_print ("%s\n", log_message); + } + } + + /* success */ + return G_LOG_WRITER_HANDLED; +} + +static GLogWriterOutput +gs_log_writer_journald (GLogLevelFlags log_level, + const GLogField *fields, + gsize n_fields, + gpointer user_data) +{ + GsDebug *debug = GS_DEBUG (user_data); + + switch (log_level) { + case G_LOG_LEVEL_ERROR: + case G_LOG_LEVEL_CRITICAL: + case G_LOG_LEVEL_WARNING: + case G_LOG_LEVEL_MESSAGE: + /* important enough to force to the journal */ + return g_log_writer_journald (log_level, fields, n_fields, user_data); + break; + case G_LOG_LEVEL_INFO: + case G_LOG_LEVEL_DEBUG: + /* Not important enough unless verbose mode has been explicitly + * enabled. */ + if (g_atomic_int_get (&debug->verbose)) + return g_log_writer_journald (log_level, fields, n_fields, user_data); + else + return G_LOG_WRITER_HANDLED; + default: + break; + } + + return G_LOG_WRITER_UNHANDLED; +} + +static GLogWriterOutput +gs_debug_log_writer (GLogLevelFlags log_level, + const GLogField *fields, + gsize n_fields, + gpointer user_data) +{ + if (g_log_writer_is_journald (fileno (stderr))) + return gs_log_writer_journald (log_level, fields, n_fields, user_data); + else + return gs_log_writer_console (log_level, fields, n_fields, user_data); +} + +static void +gs_debug_finalize (GObject *object) +{ + GsDebug *debug = GS_DEBUG (object); + + g_clear_pointer (&debug->domains, g_strfreev); + + G_OBJECT_CLASS (gs_debug_parent_class)->finalize (object); +} + +static void +gs_debug_class_init (GsDebugClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_debug_finalize; +} + +static void +gs_debug_init (GsDebug *debug) +{ + g_log_set_writer_func (gs_debug_log_writer, + g_object_ref (debug), + (GDestroyNotify) g_object_unref); +} + +/** + * gs_debug_new: + * @domains: (transfer full) (nullable): a #GStrv of debug log domains to output, + * or `{ "all", NULL }` to output all debug log domains; %NULL is equivalent + * to an empty array + * @verbose: whether to output log debug messages + * @use_time: whether to output a timestamp with each log message + * + * Create a new #GsDebug with the given configuration. + * + * Ownership of @domains is transferred to this function. It will be freed with + * g_strfreev() when the #GsDebug is destroyed. + * + * Returns: (transfer full): a new #GsDebug + * Since: 40 + */ +GsDebug * +gs_debug_new (gchar **domains, + gboolean verbose, + gboolean use_time) +{ + g_autoptr(GsDebug) debug = g_object_new (GS_TYPE_DEBUG, NULL); + + /* Strictly speaking these should be set before g_log_set_writer_func() + * is called, but threads probably haven’t been started at this point. */ + debug->domains = (domains != NULL && domains[0] != NULL) ? g_steal_pointer (&domains) : NULL; + debug->verbose = verbose; + debug->use_time = use_time; + + return g_steal_pointer (&debug); +} + +/** + * gs_debug_new_from_environment: + * + * Create a new #GsDebug with its configuration loaded from environment + * variables. + * + * Returns: (transfer full): a new #GsDebug + * Since: 40 + */ +GsDebug * +gs_debug_new_from_environment (void) +{ + g_auto(GStrv) domains = NULL; + gboolean verbose, use_time; + + if (g_getenv ("G_MESSAGES_DEBUG") != NULL) { + domains = g_strsplit (g_getenv ("G_MESSAGES_DEBUG"), " ", -1); + if (domains[0] == NULL) + g_clear_pointer (&domains, g_strfreev); + } + + verbose = (g_getenv ("GS_DEBUG") != NULL); + use_time = (g_getenv ("GS_DEBUG_NO_TIME") == NULL); + + return gs_debug_new (g_steal_pointer (&domains), verbose, use_time); +} + +/** + * gs_debug_set_verbose: + * @self: a #GsDebug + * @verbose: whether to output log debug messages + * + * Enable or disable verbose logging mode. + * + * This can be called at any time, from any thread. + * + * Since: 40 + */ +void +gs_debug_set_verbose (GsDebug *self, + gboolean verbose) +{ + g_return_if_fail (GS_IS_DEBUG (self)); + + /* If we’re changing from !verbose → verbose, print OS information. + * This is helpful in verbose logs when people file bug reports. */ + if (g_atomic_int_compare_and_exchange (&self->verbose, !verbose, verbose) && + verbose) { + g_autoptr(GsOsRelease) os_release = NULL; + g_autoptr(GError) error = NULL; + + g_debug (PACKAGE_NAME " " PACKAGE_VERSION); + + os_release = gs_os_release_new (&error); + if (os_release) { + g_debug ("OS: %s; %s", + gs_os_release_get_name (os_release), + gs_os_release_get_version (os_release)); + } else { + g_debug ("Failed to get OS Release information: %s", error->message); + } + } +} diff --git a/lib/gs-debug.h b/lib/gs-debug.h new file mode 100644 index 0000000..d12c761 --- /dev/null +++ b/lib/gs-debug.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_DEBUG (gs_debug_get_type ()) + +G_DECLARE_FINAL_TYPE (GsDebug, gs_debug, GS, DEBUG, GObject) + +GsDebug *gs_debug_new (gchar **domains, + gboolean verbose, + gboolean use_time); +GsDebug *gs_debug_new_from_environment (void); +void gs_debug_set_verbose (GsDebug *self, + gboolean verbose); + +G_END_DECLS diff --git a/lib/gs-desktop-data.c b/lib/gs-desktop-data.c new file mode 100644 index 0000000..40b19f0 --- /dev/null +++ b/lib/gs-desktop-data.c @@ -0,0 +1,320 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2015-2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-desktop-data.h" + +static const GsDesktopMap map_create[] = { + { "all", NC_("Menu of Graphics & Photography", "All"), + { "Graphics", + "AudioVideo", + NULL } }, + { "featured", NC_("Menu of Graphics & Photography", "Featured"), + { "Graphics::Featured", + "AudioVideo::Featured", + NULL} }, + { "3d", NC_("Menu of Graphics & Photography", "3D Graphics"), + { "Graphics::3DGraphics", + NULL} }, + { "photography", NC_("Menu of Graphics & Photography", "Photography"), + { "Graphics::Photography", + NULL} }, + { "scanning", NC_("Menu of Graphics & Photography", "Scanning"), + { "Graphics::Scanning", + NULL} }, + { "vector", NC_("Menu of Graphics & Photography", "Vector Graphics"), + { "Graphics::VectorGraphics", + NULL} }, + { "viewers", NC_("Menu of Graphics & Photography", "Viewers"), + { "Graphics::Viewer", + NULL} }, + { "creation-editing", NC_("Menu of Audio & Video", "Audio Creation & Editing"), + { "AudioVideo::AudioVideoEditing", + "AudioVideo::Midi", + "AudioVideo::DiscBurning", + "AudioVideo::Sequencer", + NULL} }, + { "music-players", NC_("Menu of Audio & Video", "Music Players"), + { "AudioVideo::Music", + "AudioVideo::Player", + NULL} }, + { NULL } +}; + +static const GsDesktopMap map_work[] = { + { "all", NC_("Menu of Productivity", "All"), + { "Office", + "Utility", + "Network::WebBrowser", + NULL } }, + { "featured", NC_("Menu of Productivity", "Featured"), + { "Office::Featured", + "Utility::Featured", + NULL} }, + { "calendar", NC_("Menu of Productivity", "Calendar"), + { "Office::Calendar", + "Office::ProjectManagement", + NULL} }, + { "database", NC_("Menu of Productivity", "Database"), + { "Office::Database", + NULL} }, + { "finance", NC_("Menu of Productivity", "Finance"), + { "Office::Finance", + "Office::Spreadsheet", + NULL} }, + { "word-processor", NC_("Menu of Productivity", "Word Processor"), + { "Office::WordProcessor", + "Office::Dictionary", + NULL} }, + { "text-editors", NC_("Menu of Utilities", "Text Editors"), + { "Utility::TextEditor", + NULL} }, + { "web-browsers", NC_("Menu of Communication & News", "Web Browsers"), + { "Network::WebBrowser", + NULL} }, + { NULL } +}; + +static const GsDesktopMap map_play[] = { + { "all", NC_("Menu of Audio & Video", "All"), + { "Game", + NULL } }, + { "featured", NC_("Menu of Audio & Video", "Featured"), + { "Game::Featured", + NULL} }, + { "action", NC_("Menu of Games", "Action"), + { "Game::ActionGame", + NULL} }, + { "adventure", NC_("Menu of Games", "Adventure"), + { "Game::AdventureGame", + NULL} }, + { "arcade", NC_("Menu of Games", "Arcade"), + { "Game::ArcadeGame", + NULL} }, + { "blocks", NC_("Menu of Games", "Blocks"), + { "Game::BlocksGame", + NULL} }, + { "board", NC_("Menu of Games", "Board"), + { "Game::BoardGame", + NULL} }, + { "card", NC_("Menu of Games", "Card"), + { "Game::CardGame", + NULL} }, + { "emulator", NC_("Menu of Games", "Emulators"), + { "Game::Emulator", + NULL} }, + { "kids", NC_("Menu of Games", "Kids"), + { "Game::KidsGame", + NULL} }, + { "logic", NC_("Menu of Games", "Logic"), + { "Game::LogicGame", + "Game::Simulation", + NULL} }, + { "role-playing", NC_("Menu of Games", "Role Playing"), + { "Game::RolePlaying", + NULL} }, + { "sports", NC_("Menu of Games", "Sports"), + { "Game::SportsGame", + NULL} }, + { "strategy", NC_("Menu of Games", "Strategy"), + { "Game::StrategyGame", + NULL} }, + { NULL } +}; + +static const GsDesktopMap map_socialize[] = { + { "all", NC_("Menu of Communication & News", "All"), + { "Network", + NULL } }, + { "featured", NC_("Menu of Communication & News", "Featured"), + { "Network::Featured", + NULL} }, + { "chat", NC_("Menu of Communication & News", "Chat"), + { "Network::Chat", + "Network::IRCClient", + "Network::Telephony", + "Network::VideoConference", + "Network::Email", + NULL} }, + { NULL } +}; + +static const GsDesktopMap map_learn[] = { + { "all", NC_("Menu of Education & Science", "All"), + { "Education", + "Science", + "Reference", + "Network::Feed", + "Network::News", + NULL } }, + { "featured", NC_("Menu of Education & Science", "Featured"), + { "Education::Featured", + "Science::Featured", + "Reference::Featured", + NULL} }, + { "artificial-intelligence", NC_("Menu of Education & Science", "Artificial Intelligence"), + { "Science::ArtificialIntelligence", + NULL} }, + { "astronomy", NC_("Menu of Education & Science", "Astronomy"), + { "Education::Astronomy", + "Science::Astronomy", + NULL} }, + { "chemistry", NC_("Menu of Education & Science", "Chemistry"), + { "Education::Chemistry", + "Science::Chemistry", + NULL} }, + { "languages", NC_("Menu of Education & Science", "Languages"), + { "Education::Languages", + "Education::Literature", + NULL} }, + { "math", NC_("Menu of Education & Science", "Math"), + { "Education::Math", + "Education::NumericalAnalysis", + "Science::Math", + "Science::Physics", + "Science::NumericalAnalysis", + NULL} }, + { "news", NC_("Menu of Communication & News", "News"), + { "Network::Feed", + "Network::News", + NULL} }, + { "robotics", NC_("Menu of Education & Science", "Robotics"), + { "Science::Robotics", + NULL} }, + { "art", NC_("Menu of Art", "Art"), + { "Reference::Art", + NULL} }, + { "biography", NC_("Menu of Reference", "Biography"), + { "Reference::Biography", + NULL} }, + { "comics", NC_("Menu of Reference", "Comics"), + { "Reference::Comics", + NULL} }, + { "fiction", NC_("Menu of Reference", "Fiction"), + { "Reference::Fiction", + NULL} }, + { "health", NC_("Menu of Reference", "Health"), + { "Reference::Health", + NULL} }, + { "history", NC_("Menu of Reference", "History"), + { "Reference::History", + NULL} }, + { "lifestyle", NC_("Menu of Reference", "Lifestyle"), + { "Reference::Lifestyle", + NULL} }, + { "politics", NC_("Menu of Reference", "Politics"), + { "Reference::Politics", + NULL} }, + { "sports", NC_("Menu of Reference", "Sports"), + { "Reference::Sports", + NULL} }, + { NULL } +}; + +static const GsDesktopMap map_develop[] = { + { "all", NC_("Menu of Developer Tools", "All"), + { "Development", + NULL } }, + { "featured", NC_("Menu of Developer Tools", "Featured"), + { "Development::Featured", + NULL} }, + { "debuggers", NC_("Menu of Developer Tools", "Debuggers"), + { "Development::Debugger", + NULL} }, + { "ide", NC_("Menu of Developer Tools", "IDEs"), + { "Development::IDE", + "Development::GUIDesigner", + NULL} }, + { NULL } +}; + +static const GsDesktopMap map_addon_codecs[] = { + { "all", NC_("Menu of Add-ons", "Codecs"), + { "Addon::Codec", + NULL } }, + { NULL } +}; + +static const GsDesktopMap map_addon_drivers[] = { + { "all", NC_("Menu of Add-ons", "Hardware Drivers"), + { "Addon::Driver", + NULL } }, + { NULL } +}; + +static const GsDesktopMap map_addon_fonts[] = { + { "all", NC_("Menu of Add-ons", "Fonts"), + { "Addon::Font", + NULL } }, + { NULL } +}; + +static const GsDesktopMap map_addon_input_sources[] = { + { "all", NC_("Menu of Add-ons", "Input Sources"), + { "Addon::InputSource", + NULL } }, + { NULL } +}; + +static const GsDesktopMap map_addon_language_packs[] = { + { "all", NC_("Menu of Add-ons", "Language Packs"), + { "Addon::LanguagePack", + NULL } }, + { NULL } +}; + +static const GsDesktopMap map_addon_localization[] = { + { "all", NC_("Menu of Add-ons", "Localization"), + { "Addon::Localization", + NULL } }, + { NULL } +}; + +/* main categories */ +/* Please keep category name and subcategory context synchronized!!! */ +static const GsDesktopData msdata[] = { + /* Translators: this is a menu category */ + { "create", map_create, N_("Create"), "org.gnome.Software.Create", 100 }, + /* Translators: this is a menu category */ + { "work", map_work, N_("Work"), "org.gnome.Software.Work", 90 }, + /* Translators: this is a menu category */ + { "play", map_play, N_("Play"), "org.gnome.Software.Play", 80 }, + /* Translators: this is a menu category */ + { "socialize", map_socialize, N_("Socialize"), "org.gnome.Software.Socialize", 70 }, + /* Translators: this is a menu category */ + { "learn", map_learn, N_("Learn"), "org.gnome.Software.Learn", 60 }, + /* Translators: this is a menu category */ + { "develop", map_develop, N_("Develop"), "org.gnome.Software.Develop", 50 }, + + /* Translators: this is a menu category */ + { "codecs", map_addon_codecs, N_("Codecs"), NULL, 10 }, + /* Translators: this is a menu category */ + { "drivers", map_addon_drivers, N_("Hardware Drivers"), NULL, 10 }, + /* Translators: this is a menu category */ + { "fonts", map_addon_fonts, N_("Fonts"), NULL, 10 }, + /* Translators: this is a menu category */ + { "input-sources", map_addon_input_sources, N_("Input Sources"), NULL, 10 }, + /* Translators: this is a menu category */ + { "language-packs", map_addon_language_packs, N_("Language Packs"), NULL, 10 }, + /* Translators: this is a menu category */ + { "localization", map_addon_localization, N_("Localization"), NULL, 10 }, + + { NULL } +}; + +/* the -1 is for the NULL terminator */ +G_STATIC_ASSERT (G_N_ELEMENTS (msdata) - 1 == GS_DESKTOP_DATA_N_ENTRIES); + +const GsDesktopData * +gs_desktop_get_data (void) +{ + return msdata; +} diff --git a/lib/gs-desktop-data.h b/lib/gs-desktop-data.h new file mode 100644 index 0000000..5ea42c8 --- /dev/null +++ b/lib/gs-desktop-data.h @@ -0,0 +1,43 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2011-2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +typedef struct { + const gchar *id; + const gchar *name; + const gchar *fdo_cats[16]; +} GsDesktopMap; + +typedef struct { + const gchar *id; + const GsDesktopMap *mapping; + const gchar *name; + const gchar *icon; + gint score; +} GsDesktopData; + +const GsDesktopData *gs_desktop_get_data (void); + +/** + * GS_DESKTOP_DATA_N_ENTRIES: + * + * Number of entries in the array returned by gs_desktop_get_data(). This is + * static and guaranteed to be up to date. It’s intended to be used when + * defining static arrays which need to be the same size as the array returned + * by gs_desktop_get_data(). + * + * Since: 40 + */ +#define GS_DESKTOP_DATA_N_ENTRIES 12 + +G_END_DECLS diff --git a/lib/gs-dkms-private.c b/lib/gs-dkms-private.c new file mode 100644 index 0000000..d441992 --- /dev/null +++ b/lib/gs-dkms-private.c @@ -0,0 +1,514 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-dkms-private.h" + +static void +gs_dkms_execute_communicated_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + g_autoptr(GError) result_error = NULL; + g_autofree gchar *val_stdout = NULL; + g_autofree gchar *val_stderr = NULL; + GSubprocess *subprocess = G_SUBPROCESS (source_object); + GCancellable *cancellable = g_task_get_cancellable (task); + gboolean communicate_succeeded; + + communicate_succeeded = g_subprocess_communicate_utf8_finish (subprocess, result, &val_stdout, &val_stderr, &local_error); + if (!communicate_succeeded || + /* it's safe to call it here, because the g_subprocess_communicate_utf8_async() + already waited for the process to finish, thus this does not block on I/O */ + !g_subprocess_wait_check (subprocess, cancellable, &local_error)) { + if (communicate_succeeded && (val_stdout == NULL || *val_stdout == '\0') && val_stderr != NULL && *val_stderr != '\0') { + g_set_error_literal (&result_error, local_error->domain, local_error->code, val_stderr); + } else if (communicate_succeeded) { + g_set_error (&result_error, local_error->domain, local_error->code, + "%s%s%s%s%s", + local_error->message, + val_stdout != NULL && *val_stdout != '\0' ? "\nstdout: " : "", + val_stdout != NULL && *val_stdout != '\0' ? val_stdout : "", + val_stderr != NULL && *val_stderr != '\0' ? "\nstderr: " : "", + val_stderr != NULL && *val_stderr != '\0' ? val_stderr : ""); + } else { + g_propagate_error (&result_error, g_steal_pointer (&local_error)); + } + } else { + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { + g_propagate_error (&result_error, g_steal_pointer (&local_error)); + } else if (val_stderr != NULL && *val_stderr != '\0') { + g_set_error_literal (&result_error, G_IO_ERROR, G_IO_ERROR_FAILED, val_stderr); + } else { + g_task_return_int (task, GS_DKMS_STATE_ENROLLED); + return; + } + } + + if (result_error != NULL && result_error->domain == G_SPAWN_EXIT_ERROR) { + switch (result_error->code) { + case GS_DKMS_STATE_ENROLLED: + case GS_DKMS_STATE_NOT_FOUND: + case GS_DKMS_STATE_NOT_ENROLLED: + case GS_DKMS_STATE_PENDING: + g_task_return_int (task, result_error->code); + return; + case GS_DKMS_STATE_ERROR: + default: + break; + } + } + + if (result_error != NULL) + g_task_return_error (task, g_steal_pointer (&result_error)); + else + g_task_return_int (task, GS_DKMS_STATE_ERROR); +} + +static void +gs_dkms_execute_async (const gchar * const *args, + const gchar *stdin_str, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_dkms_execute_async); + + subprocess = g_subprocess_newv (args, (stdin_str == NULL ? 0 : G_SUBPROCESS_FLAGS_STDIN_PIPE) | + G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, + &local_error); + if (local_error != NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_subprocess_communicate_utf8_async (subprocess, stdin_str, cancellable, + gs_dkms_execute_communicated_cb, g_steal_pointer (&task)); +} + +static GsDkmsState +gs_dkms_execute_finish (GAsyncResult *result, + GError **error) +{ + return (GsDkmsState) g_task_propagate_int (G_TASK (result), error); +} + +static GsDkmsState last_akmods_key_state = GS_DKMS_STATE_ERROR; +static gint64 last_akmods_key_state_time = 0; +static GsDkmsState last_dkms_key_state = GS_DKMS_STATE_ERROR; +static gint64 last_dkms_key_state_time = 0; + +static void +gs_dkms_finish_get_key_state_internal (GTask *task, + GAsyncResult *result, + GsDkmsState *out_key_state, + gint64 *out_key_state_time) +{ + g_autoptr(GError) local_error = NULL; + + *out_key_state = gs_dkms_execute_finish (result, &local_error); + *out_key_state_time = g_get_real_time (); + + if (local_error != NULL) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_int (task, *out_key_state); +} + +static void +gs_dkms_got_akmods_key_state_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + + /* accesses the global variables in the main thread */ + g_assert (g_main_context_is_owner (g_main_context_default ())); + + gs_dkms_finish_get_key_state_internal (task, result, &last_akmods_key_state, &last_akmods_key_state_time); +} + +static void +gs_dkms_got_dkms_key_state_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + + /* accesses the global variables in the main thread */ + g_assert (g_main_context_is_owner (g_main_context_default ())); + + gs_dkms_finish_get_key_state_internal (task, result, &last_dkms_key_state, &last_dkms_key_state_time); +} + +/* + * gs_dkms_get_key_state_async: + * @key_kind: which key to check + * @cancellable: a #GCancellable or %NULL + * @callback: (not nullable): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure callback) (scope async): data to pass to @callback + * + * Asynchronously checks what state the @key_kind key currently is. + * Use gs_dkms_get_key_state_finish() withing the @callback + * to complete the call. + * + * Since: 47 + **/ +void +gs_dkms_get_key_state_async (GsDkmsKeyKind key_kind, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + const gchar *args[] = { + "pkexec", + LIBEXECDIR "/gnome-software-dkms-helper", + NULL, /* one of --test arguments */ + NULL + }; + g_autoptr(GTask) task = NULL; + GsDkmsState *last_key_state = NULL; + gint64 *last_key_state_time = NULL; + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_dkms_get_key_state_async); + + if (key_kind == GS_DKMS_KEY_KIND_AKMODS) { + if (!g_file_test (GS_AKMODS_KEY_PATH, G_FILE_TEST_IS_DIR)) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY, "Akmods key directory not found."); + return; + } + args[2] = "--test-akmods"; + last_key_state = &last_akmods_key_state; + last_key_state_time = &last_akmods_key_state_time; + } else if (key_kind == GS_DKMS_KEY_KIND_DKMS) { + g_autofree gchar *dkms_key_path = gs_dkms_get_dkms_key_path (); + if (!g_file_test (dkms_key_path, G_FILE_TEST_IS_DIR)) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY, "DKMS key directory not found."); + return; + } + args[2] = "--test-dkms"; + last_key_state = &last_dkms_key_state; + last_key_state_time = &last_dkms_key_state_time; + } else { + g_assert_not_reached (); + } + + /* accesses the global variables in the main thread */ + g_assert (g_main_context_is_owner (g_main_context_default ())); + + /* consider state discovered within the last 5 seconds still valid */ + if (g_get_real_time () > (*last_key_state_time) + (G_USEC_PER_SEC * 5)) { + if (key_kind == GS_DKMS_KEY_KIND_AKMODS) + gs_dkms_execute_async ((const gchar * const *) args, NULL, cancellable, gs_dkms_got_akmods_key_state_cb, g_steal_pointer (&task)); + else + gs_dkms_execute_async ((const gchar * const *) args, NULL, cancellable, gs_dkms_got_dkms_key_state_cb, g_steal_pointer (&task)); + } else { + g_task_return_int (task, (*last_key_state)); + } +} + +/* + * gs_dkms_get_key_state_finish: + * @result: an async result + * @error: a #GError or %NULL + * + * Finishes operation started by gs_dkms_get_key_state_async(). + * + * Returns: one of #GsDkmsState + * + * Since: 47 + */ +GsDkmsState +gs_dkms_get_key_state_finish (GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (G_TASK (result), NULL), GS_DKMS_STATE_ERROR); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_dkms_get_key_state_async), GS_DKMS_STATE_ERROR); + + return (GsDkmsState) g_task_propagate_int (G_TASK (result), error); +} + +static void +gs_dkms_enrolled_key_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + GsDkmsState key_state; + + key_state = gs_dkms_execute_finish (result, &local_error); + + if (local_error != NULL) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_int (task, key_state); +} + +/* + * gs_dkms_enroll_async: + * @key_kind: which key to enroll + * @password: (not nullable): an import password + * @cancellable: a #GCancellable or %NULL + * @callback: (not nullable): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure callback) (scope async): data to pass to @callback + * + * Asynchronously enrolls the @key_kind key. It can create one, if no such exists yet. + * The import @password is to be used in MOK on reboot. Use gs_dkms_enroll_finish() + * withing the @callback to complete the call. + * + * Since: 47 + **/ +void +gs_dkms_enroll_async (GsDkmsKeyKind key_kind, + const gchar *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + const gchar *args[] = { + "pkexec", + LIBEXECDIR "/gnome-software-dkms-helper", + NULL, /* one of --enroll arguments */ + NULL + }; + g_autoptr(GTask) task = NULL; + + g_assert (password != NULL); + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_dkms_enroll_async); + + if (key_kind == GS_DKMS_KEY_KIND_AKMODS) + args[2] = "--enroll-akmods"; + else if (key_kind == GS_DKMS_KEY_KIND_DKMS) + args[2] = "--enroll-dkms"; + else + g_assert_not_reached (); + + gs_dkms_execute_async ((const gchar * const *) args, password, cancellable, gs_dkms_enrolled_key_cb, g_steal_pointer (&task)); +} + +/* + * gs_dkms_enroll_finish: + * @result: an async result + * @error: a #GError or %NULL + * + * Finishes operation started by gs_dkms_enroll_async(). + * + * Returns: one of #GsDkmsState + * + * Since: 47 + */ +GsDkmsState +gs_dkms_enroll_finish (GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (G_TASK (result), NULL), GS_DKMS_STATE_ERROR); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_dkms_enroll_async), GS_DKMS_STATE_ERROR); + + return (GsDkmsState) g_task_propagate_int (G_TASK (result), error); +} + +static GsSecurebootState secureboot_state = GS_SECUREBOOT_STATE_UNKNOWN; + +static void +gs_dkms_get_secureboot_state_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GSubprocess *subprocess = G_SUBPROCESS (source_object); + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + g_autofree gchar *standard_output = NULL; + g_autofree gchar *standard_error = NULL; + + if (!g_subprocess_communicate_utf8_finish (subprocess, result, &standard_output, &standard_error, &local_error)) { + g_debug ("dkms: Failed to enum Secure Boot state: %s", local_error->message); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (standard_output == NULL) { + g_debug ("dkms: No standard output from 'mokutil'"); + g_task_return_int (task, secureboot_state); + return; + } + + /* FIXME: use the return code instead of text parsing once the https://github.com/lcp/mokutil/issues/88 is addressed */ + #define ENABLED_OUTPUT "SecureBoot enabled\n" + #define DISABLED_OUTPUT "SecureBoot disabled\n" + #define NOT_SUPPORTED_OUTPUT "EFI variables are not supported on this system\n" + + if (g_ascii_strncasecmp (standard_output, ENABLED_OUTPUT, strlen (ENABLED_OUTPUT)) == 0) + secureboot_state = GS_SECUREBOOT_STATE_ENABLED; + else if (g_ascii_strncasecmp (standard_output, DISABLED_OUTPUT, strlen (DISABLED_OUTPUT)) == 0) + secureboot_state = GS_SECUREBOOT_STATE_DISABLED; + else if (*standard_output == '\0' && standard_error != NULL && + g_ascii_strncasecmp (standard_error, NOT_SUPPORTED_OUTPUT, strlen (NOT_SUPPORTED_OUTPUT)) == 0) + secureboot_state = GS_SECUREBOOT_STATE_NOT_SUPPORTED; + else + g_debug ("dkms: Unexpected response from 'mokutil': '%s'; stderr:'%s'", standard_output, standard_error); + + #undef ENABLED_OUTPUT + #undef DISABLED_OUTPUT + #undef NOT_SUPPORTED_OUTPUT + + g_task_return_int (task, secureboot_state); +} + +/* + * gs_dkms_get_secureboot_state_async: + * @cancellable: a #GCancellable or %NULL + * @callback: (not nullable): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure callback) (scope async): data to pass to @callback + * + * Asynchronously enumerates Secure Boot state of the system. + * Use gs_dkms_get_secureboot_state_finish() withing the @callback + * to complete the call. + * + * Since: 47 + **/ +void +gs_dkms_get_secureboot_state_async (GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + const gchar *args[] = { "mokutil", "--sb-state", NULL }; + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_dkms_get_secureboot_state_async); + + if (secureboot_state != GS_SECUREBOOT_STATE_UNKNOWN) { + g_task_return_int (task, secureboot_state); + return; + } + + subprocess = g_subprocess_newv ((const gchar * const *) args, + G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, + &local_error); + if (subprocess == NULL) { + g_debug ("dkms: Failed to create process to enum Secure Boot state: %s", local_error->message); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_set_task_data (task, g_object_ref (subprocess), g_object_unref); + + g_subprocess_communicate_utf8_async (subprocess, NULL, cancellable, gs_dkms_get_secureboot_state_ready_cb, g_steal_pointer (&task)); +} + +/* + * gs_dkms_get_secureboot_state_finish: + * @result: an async result + * @error: a #GError or %NULL + * + * Finishes operation started by gs_dkms_get_secureboot_state_async(). + * It saves the value for later use by gs_dkms_get_last_secureboot_state(). + * + * It can happen the return value is %GS_SECUREBOOT_STATE_UNKNOWN, for + * example when the mokutil is not installed or calling it failed. + * + * Returns: one of #GsSecurebootState + * + * Since: 47 + */ +GsSecurebootState +gs_dkms_get_secureboot_state_finish (GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (G_TASK (result), NULL), secureboot_state); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_dkms_get_secureboot_state_async), secureboot_state); + + return (GsSecurebootState) g_task_propagate_int (G_TASK (result), error); +} + +/* + * gs_dkms_get_last_secureboot_state: + * + * Returns last recognized state from gs_dkms_get_secureboot_state_sync(). + * + * Returns: previously enumerated secure boot state + * + * Since: 47 + **/ +GsSecurebootState +gs_dkms_get_last_secureboot_state (void) +{ + return secureboot_state; +} + +/* + * gs_dkms_get_dkms_key_path: + * + * Returns key path for the DKMS, as read from the configuration, + * or using the default. Free the returned pointer with g_free(), + * when no longer needed. + * + * Returns: (transfer full) (type filename): a path where DKMS key is stored + * + * Since: 47 + **/ +gchar * +gs_dkms_get_dkms_key_path (void) +{ + g_autofree gchar *filename = gs_dkms_get_dkms_key_filename (); + return g_path_get_dirname (filename); +} + +/* + * gs_dkms_get_dkms_key_filename: + * + * Returns key file name (with path) for the DKMS, as read from the configuration, + * or using the default. Free the returned pointer with g_free(), + * when no longer needed. + * + * Returns: (transfer full) (type filename): a file name of the DKMS key + * + * Since: 47 + **/ +gchar * +gs_dkms_get_dkms_key_filename (void) +{ + g_autofree gchar *contents = NULL; + + if (g_file_get_contents ("/etc/dkms/framework.conf", &contents, NULL, NULL)) { + /* the configuration file is almost ini-like, add a fake section + at the top to be able to use GKeyFile routines */ + g_autoptr(GString) fake_ini = g_string_new ("[keys]\n"); + g_autoptr(GKeyFile) keyfile = g_key_file_new (); + g_autoptr(GError) local_error = NULL; + + g_string_append (fake_ini, contents); + + if (g_key_file_load_from_data (keyfile, fake_ini->str, -1, G_KEY_FILE_NONE, &local_error)) { + g_autofree gchar *filename = g_key_file_get_string (keyfile, "keys", "mok_certificate", NULL); + if (filename != NULL && *filename != '\0') + return g_steal_pointer (&filename); + } else { + g_debug ("dkms: Failed to read '/etc/dkms/framework.conf': %s", local_error->message); + } + } + + /* this is the default key to be used */ + return g_strdup ("/var/lib/dkms/mok.pub"); +} diff --git a/lib/gs-dkms-private.h b/lib/gs-dkms-private.h new file mode 100644 index 0000000..7fafe5c --- /dev/null +++ b/lib/gs-dkms-private.h @@ -0,0 +1,98 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_AKMODS_KEY_PATH "/etc/pki/akmods/certs" +#define GS_AKMODS_KEY_FILENAME GS_AKMODS_KEY_PATH "/public_key.der" + +/* + * GsDkmsKeyKind: + * @GS_DKMS_KEY_KIND_AKMODS: use akmods key + * @GS_DKMS_KEY_KIND_DKMS: use DKMS key + * + * The DKMS code can handle both DKMS and akmods keys. This enum helps + * to distinguish, which one should be used. + * + * Since: 47 + **/ + +typedef enum { + GS_DKMS_KEY_KIND_AKMODS, + GS_DKMS_KEY_KIND_DKMS +} GsDkmsKeyKind; + +/* + * GsDkmsState: + * @GS_DKMS_STATE_ERROR: there was an error determining the key state + * @GS_DKMS_STATE_ENROLLED: the key is enrolled, which means it can used to sign the drivers + * @GS_DKMS_STATE_NOT_FOUND: the key was not found, it's needed to be created first + * @GS_DKMS_STATE_NOT_ENROLLED: the key exists, but is not enrolled yet + * @GS_DKMS_STATE_PENDING: the key is scheduled to be enrolled the next boot + * + * Declares DKMS or akmods key states. + * + * Since: 47 + **/ +typedef enum { + GS_DKMS_STATE_ERROR = 0, + GS_DKMS_STATE_ENROLLED = 1, + GS_DKMS_STATE_NOT_FOUND = 2, + GS_DKMS_STATE_NOT_ENROLLED = 3, + GS_DKMS_STATE_PENDING = 4 +} GsDkmsState; + +/* + * GsSecurebootState: + * @GS_SECUREBOOT_STATE_UNKNOWN: the Secure Boot state is unknown; it can + * for example mean there is not installed the tool to check its state + * @GS_SECUREBOOT_STATE_DISABLED: the Secure Boot is disabled + * @GS_SECUREBOOT_STATE_ENABLED: the Secure Boot is disabled + * @GS_SECUREBOOT_STATE_NOT_SUPPORTED: the Secure Boot is not supported + * in this installation, like for example when the system is not + * installed with UEFI + * + * Declares states of the Secure Boot. + * + * Since: 47 + **/ +typedef enum { + GS_SECUREBOOT_STATE_UNKNOWN = 0, + GS_SECUREBOOT_STATE_DISABLED = 1, + GS_SECUREBOOT_STATE_ENABLED, + GS_SECUREBOOT_STATE_NOT_SUPPORTED +} GsSecurebootState; + +void gs_dkms_get_key_state_async (GsDkmsKeyKind key_kind, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GsDkmsState gs_dkms_get_key_state_finish (GAsyncResult *result, + GError **error); +void gs_dkms_enroll_async (GsDkmsKeyKind key_kind, + const gchar *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GsDkmsState gs_dkms_enroll_finish (GAsyncResult *result, + GError **error); +void gs_dkms_get_secureboot_state_async (GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GsSecurebootState gs_dkms_get_secureboot_state_finish (GAsyncResult *result, + GError **error); +GsSecurebootState gs_dkms_get_last_secureboot_state (void); +gchar * gs_dkms_get_dkms_key_path (void); +gchar * gs_dkms_get_dkms_key_filename (void); + +G_END_DECLS diff --git a/lib/gs-download-utils.c b/lib/gs-download-utils.c new file mode 100644 index 0000000..4e7cf17 --- /dev/null +++ b/lib/gs-download-utils.c @@ -0,0 +1,1013 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021, 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-download-utils + * @short_description: Download and HTTP utilities + * + * A set of utilities for downloading things and doing HTTP requests. + * + * Since: 42 + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "gs-download-utils.h" +#include "gs-utils.h" + +G_DEFINE_QUARK (gs-download-error-quark, gs_download_error) + +/** + * gs_build_soup_session: + * + * Build a new #SoupSession configured with the gnome-software user agent. + * + * A new #SoupSession should be used for each independent download context, such + * as in different plugins. Each #SoupSession caches HTTP connections and + * authentication information, and these likely needn’t be shared between + * plugins. Using separate sessions reduces thread contention. + * + * Returns: (transfer full): a new #SoupSession + * Since: 42 + */ +SoupSession * +gs_build_soup_session (void) +{ + return soup_session_new_with_options ("user-agent", gs_user_agent (), + "timeout", 10, + NULL); +} + +/* See https://httpwg.org/specs/rfc7231.html#http.date + * For example: Sun, 06 Nov 1994 08:49:37 GMT */ +static gchar * +date_time_to_rfc7231 (GDateTime *date_time) +{ + return soup_date_time_to_string (date_time, SOUP_DATE_HTTP); +} + +static GDateTime * +date_time_from_rfc7231 (const gchar *rfc7231_str) +{ + return soup_date_time_new_from_http_string (rfc7231_str); +} + +typedef struct { + /* Input data. */ + gchar *uri; /* (not nullable) (owned) */ + GInputStream *input_stream; /* (nullable) (owned) */ + GOutputStream *output_stream; /* (nullable) (owned) */ + gsize buffer_size_bytes; + gchar *last_etag; /* (nullable) (owned) */ + GDateTime *last_modified_date; /* (nullable) (owned) */ + int io_priority; + GsDownloadProgressCallback progress_callback; /* (nullable) */ + gpointer progress_user_data; + + /* In-progress state. */ + SoupMessage *message; /* (nullable) (owned) */ + gboolean close_input_stream; + gboolean close_output_stream; + gboolean discard_output_stream; + gsize total_read_bytes; + gsize total_written_bytes; + gsize expected_stream_size_bytes; + GBytes *currently_unwritten_chunk; /* (nullable) (owned) */ + + /* Output data. */ + gchar *new_etag; /* (nullable) (owned) */ + GDateTime *new_last_modified_date; /* (nullable) (owned) */ + GError *error; /* (nullable) (owned) */ +} DownloadData; + +static void +download_data_free (DownloadData *data) +{ + g_assert (data->input_stream == NULL || g_input_stream_is_closed (data->input_stream)); + g_assert (data->output_stream == NULL || g_output_stream_is_closed (data->output_stream)); + + g_assert (data->currently_unwritten_chunk == NULL || data->error != NULL); + + g_clear_object (&data->input_stream); + g_clear_object (&data->output_stream); + + g_clear_pointer (&data->last_etag, g_free); + g_clear_pointer (&data->last_modified_date, g_date_time_unref); + g_clear_object (&data->message); + g_clear_pointer (&data->uri, g_free); + g_clear_pointer (&data->new_etag, g_free); + g_clear_pointer (&data->new_last_modified_date, g_date_time_unref); + g_clear_pointer (&data->currently_unwritten_chunk, g_bytes_unref); + g_clear_error (&data->error); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (DownloadData, download_data_free) + +static void open_input_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void read_bytes_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void write_bytes_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_download (GTask *task, + GError *error); +static void close_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void download_progress (GTask *task); + +/** + * gs_download_stream_async: + * @soup_session: a #SoupSession + * @uri: (not nullable): the URI to download + * @output_stream: (not nullable): an output stream to write the download to + * @last_etag: (nullable): the last-known ETag of the URI, or %NULL if unknown + * @last_modified_date: (nullable): the last-known Last-Modified date of the + * URI, or %NULL if unknown + * @io_priority: I/O priority to download and write at + * @progress_callback: (nullable): callback to call with progress information + * @progress_user_data: (nullable) (closure progress_callback): data to pass + * to @progress_callback + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: callback to call once the operation is complete + * @user_data: (closure callback): data to pass to @callback + * + * Download @uri and write it to @output_stream asynchronously. + * + * If @last_etag is non-%NULL or @last_modified_date is non-%NULL, they will be + * sent to the server, which may return a ‘not modified’ response. If so, + * @output_stream will not be written to, and will be closed with a cancelled + * close operation. This will ensure that the existing content of the output + * stream (if it’s a file, for example) will not be overwritten. + * + * Note that @last_etag must be the ETag value returned by the server last time + * the file was downloaded, not the local file ETag generated by GLib. + * + * If specified, @progress_callback will be called zero or more times until + * @callback is called, providing progress updates on the download. + * + * Since: 43 + */ +void +gs_download_stream_async (SoupSession *soup_session, + const gchar *uri, + GOutputStream *output_stream, + const gchar *last_etag, + GDateTime *last_modified_date, + int io_priority, + GsDownloadProgressCallback progress_callback, + gpointer progress_user_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(SoupMessage) msg = NULL; + DownloadData *data; + g_autoptr(DownloadData) data_owned = NULL; + + g_return_if_fail (SOUP_IS_SESSION (soup_session)); + g_return_if_fail (uri != NULL); + g_return_if_fail (G_IS_OUTPUT_STREAM (output_stream)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (soup_session, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_download_stream_async); + + data = data_owned = g_new0 (DownloadData, 1); + data->uri = g_strdup (uri); + data->output_stream = g_object_ref (output_stream); + data->close_output_stream = TRUE; + data->buffer_size_bytes = 8192; /* arbitrarily chosen */ + data->io_priority = io_priority; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) download_data_free); + + /* local */ + if (g_str_has_prefix (uri, "file://")) { + g_autoptr(GFile) local_file = g_file_new_for_path (uri + strlen ("file://")); + g_file_read_async (local_file, io_priority, cancellable, open_input_stream_cb, g_steal_pointer (&task)); + return; + } + + /* remote */ + g_debug ("Downloading %s to %s", uri, G_OBJECT_TYPE_NAME (output_stream)); + msg = soup_message_new (SOUP_METHOD_GET, uri); + if (msg == NULL) { + finish_download (task, + g_error_new (G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "Failed to parse URI ‘%s’", uri)); + return; + } + + data->message = g_object_ref (msg); + + /* Caching support. Prefer ETags to modification dates, as the latter + * have problems with rapid updates and clock drift. */ + if (last_etag != NULL && *last_etag == '\0') + last_etag = NULL; + data->last_etag = g_strdup (last_etag); + + if (last_modified_date != NULL) + data->last_modified_date = g_date_time_ref (last_modified_date); + + if (last_etag != NULL) { + soup_message_headers_append (soup_message_get_request_headers (msg), "If-None-Match", last_etag); + } else if (last_modified_date != NULL) { + g_autofree gchar *last_modified_date_str = date_time_to_rfc7231 (last_modified_date); + soup_message_headers_append (soup_message_get_request_headers (msg), "If-Modified-Since", last_modified_date_str); + } + + soup_session_send_async (soup_session, msg, data->io_priority, cancellable, open_input_stream_cb, g_steal_pointer (&task)); +} + +static void +open_input_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GInputStream) input_stream = NULL; + g_autoptr(GError) local_error = NULL; + + /* This function can be called as a result of either reading a local + * file, or sending an HTTP request, so @source_object’s type can vary. */ + if (G_IS_FILE (source_object)) { + GFile *local_file = G_FILE (source_object); + + /* Local file. */ + input_stream = G_INPUT_STREAM (g_file_read_finish (local_file, result, &local_error)); + + if (input_stream == NULL) { + g_prefix_error (&local_error, "Failed to read ‘%s’: ", + g_file_peek_path (local_file)); + finish_download (task, g_steal_pointer (&local_error)); + return; + } + + g_assert (data->input_stream == NULL); + data->input_stream = g_object_ref (input_stream); + data->close_input_stream = TRUE; + } else if (SOUP_IS_SESSION (source_object)) { + SoupSession *soup_session = SOUP_SESSION (source_object); + guint status_code; + const gchar *new_etag, *new_last_modified_str; + + /* HTTP request. */ + input_stream = soup_session_send_finish (soup_session, result, &local_error); + status_code = soup_message_get_status (data->message); + + if (input_stream != NULL) { + g_assert (data->input_stream == NULL); + data->input_stream = g_object_ref (input_stream); + data->close_input_stream = TRUE; + } + + if (status_code == SOUP_STATUS_NOT_MODIFIED) { + /* If the file has not been modified from the ETag or + * Last-Modified date we have, finish the download + * early. Ensure to close the output stream so that its + * existing content is *not* overwritten. + * + * Preserve the existing ETag. */ + data->discard_output_stream = TRUE; + data->new_etag = g_strdup (data->last_etag); + data->new_last_modified_date = (data->last_modified_date != NULL) ? g_date_time_ref (data->last_modified_date) : NULL; + finish_download (task, + g_error_new (GS_DOWNLOAD_ERROR, + GS_DOWNLOAD_ERROR_NOT_MODIFIED, + "Skipped downloading ‘%s’: %s", + data->uri, soup_status_get_phrase (status_code))); + return; + } else if (status_code != SOUP_STATUS_OK) { + g_autoptr(GString) str = g_string_new (NULL); + g_string_append (str, soup_status_get_phrase (status_code)); + + if (local_error != NULL) { + g_string_append (str, ": "); + g_string_append (str, local_error->message); + } + + finish_download (task, + g_error_new (G_IO_ERROR, + G_IO_ERROR_FAILED, + "Failed to download ‘%s’: %s", + data->uri, str->str)); + return; + } else if (local_error != NULL) { + g_prefix_error (&local_error, "Failed to download ‘%s’: ", data->uri); + finish_download (task, g_steal_pointer (&local_error)); + return; + } + + g_assert (input_stream != NULL); + + /* Get the expected download size. */ + data->expected_stream_size_bytes = soup_message_headers_get_content_length (soup_message_get_response_headers (data->message)); + + /* Store the new ETag for later use. */ + new_etag = soup_message_headers_get_one (soup_message_get_response_headers (data->message), "ETag"); + if (new_etag != NULL && *new_etag == '\0') + new_etag = NULL; + data->new_etag = g_strdup (new_etag); + + /* Store the Last-Modified date for later use. */ + new_last_modified_str = soup_message_headers_get_one (soup_message_get_response_headers (data->message), "Last-Modified"); + if (new_last_modified_str != NULL && *new_last_modified_str == '\0') + new_last_modified_str = NULL; + if (new_last_modified_str != NULL) + data->new_last_modified_date = date_time_from_rfc7231 (new_last_modified_str); + } else { + g_assert_not_reached (); + } + + /* Splice in an asynchronous loop. We unfortunately can’t use + * g_output_stream_splice_async() here, as it doesn’t provide a progress + * callback. The approach is the same though. */ + g_input_stream_read_bytes_async (input_stream, data->buffer_size_bytes, data->io_priority, + cancellable, read_bytes_cb, g_steal_pointer (&task)); +} + +static void +read_bytes_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GInputStream *input_stream = G_INPUT_STREAM (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GBytes) bytes = NULL; + g_autoptr(GError) local_error = NULL; + + bytes = g_input_stream_read_bytes_finish (input_stream, result, &local_error); + + if (bytes == NULL) { + finish_download (task, g_steal_pointer (&local_error)); + return; + } + + /* Report progress. */ + data->total_read_bytes += g_bytes_get_size (bytes); + data->expected_stream_size_bytes = MAX (data->expected_stream_size_bytes, data->total_read_bytes); + download_progress (task); + + /* Write the downloaded data. */ + if (g_bytes_get_size (bytes) > 0) { + g_clear_pointer (&data->currently_unwritten_chunk, g_bytes_unref); + data->currently_unwritten_chunk = g_bytes_ref (bytes); + + g_output_stream_write_bytes_async (data->output_stream, bytes, data->io_priority, + cancellable, write_bytes_cb, g_steal_pointer (&task)); + } else { + finish_download (task, NULL); + } +} + +static void +write_bytes_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GOutputStream *output_stream = G_OUTPUT_STREAM (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + gssize bytes_written_signed; + gsize bytes_written; + g_autoptr(GError) local_error = NULL; + + bytes_written_signed = g_output_stream_write_bytes_finish (output_stream, result, &local_error); + + if (bytes_written_signed < 0) { + finish_download (task, g_steal_pointer (&local_error)); + return; + } + + /* We know this is non-negative now. */ + bytes_written = (gsize) bytes_written_signed; + + /* Report progress. */ + data->total_written_bytes += bytes_written; + download_progress (task); + + g_assert (data->currently_unwritten_chunk != NULL); + + if (bytes_written < g_bytes_get_size (data->currently_unwritten_chunk)) { + /* Partial write; try again with the remaining bytes. */ + g_autoptr(GBytes) sub_bytes = g_bytes_new_from_bytes (data->currently_unwritten_chunk, bytes_written, g_bytes_get_size (data->currently_unwritten_chunk) - bytes_written); + g_assert (bytes_written > 0); + + g_clear_pointer (&data->currently_unwritten_chunk, g_bytes_unref); + data->currently_unwritten_chunk = g_bytes_ref (sub_bytes); + + g_output_stream_write_bytes_async (output_stream, sub_bytes, data->io_priority, + cancellable, write_bytes_cb, g_steal_pointer (&task)); + } else { + /* Full write succeeded. Start the next read. */ + g_clear_pointer (&data->currently_unwritten_chunk, g_bytes_unref); + + g_input_stream_read_bytes_async (data->input_stream, data->buffer_size_bytes, data->io_priority, + cancellable, read_bytes_cb, g_steal_pointer (&task)); + } +} + +static inline gboolean +is_not_modidifed_error (GError *error) +{ + return g_error_matches (error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED); +} + +/* error is (transfer full) */ +static void +finish_download (GTask *task, + GError *error) +{ + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + + /* Final progress update. */ + if (error == NULL || is_not_modidifed_error (error)) { + data->expected_stream_size_bytes = data->total_read_bytes; + download_progress (task); + } + + /* Record the error from the operation, if set. */ + g_assert (data->error == NULL); + data->error = g_steal_pointer (&error); + + g_assert (!data->discard_output_stream || data->close_output_stream); + + if (data->close_output_stream) { + g_autoptr(GCancellable) output_cancellable = NULL; + + g_assert (data->output_stream != NULL); + + /* If there’s been a prior error, or we are aborting writing the + * output stream (perhaps because of a cache hit), close the + * output stream but cancel the close operation so that the old + * output file is not overwritten. */ + if ((data->error != NULL && !is_not_modidifed_error (data->error)) || data->discard_output_stream) { + output_cancellable = g_cancellable_new (); + g_cancellable_cancel (output_cancellable); + } else if (g_task_get_cancellable (task) != NULL) { + output_cancellable = g_object_ref (g_task_get_cancellable (task)); + } + + g_output_stream_close_async (data->output_stream, data->io_priority, output_cancellable, close_stream_cb, g_object_ref (task)); + } + + if (data->close_input_stream && data->input_stream != NULL) { + g_input_stream_close_async (data->input_stream, data->io_priority, cancellable, close_stream_cb, g_object_ref (task)); + } + + /* Check in case both streams are already closed. */ + close_stream_cb (NULL, NULL, g_object_ref (task)); +} + +static void +close_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + DownloadData *data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + if (G_IS_INPUT_STREAM (source_object)) { + /* Errors in closing the input stream are not fatal. */ + if (!g_input_stream_close_finish (G_INPUT_STREAM (source_object), + result, &local_error)) + g_debug ("Error closing input stream: %s", local_error->message); + g_clear_error (&local_error); + + data->close_input_stream = FALSE; + } else if (G_IS_OUTPUT_STREAM (source_object)) { + /* Errors in closing the output stream are fatal, but don’t + * overwrite errors set earlier in the operation. */ + if (!g_output_stream_close_finish (G_OUTPUT_STREAM (source_object), + result, &local_error)) { + /* If we are aborting writing the output stream (perhaps + * because of a cache hit), don’t report the error at + * all. */ + if (data->discard_output_stream && + g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_clear_error (&local_error); + else if (data->error == NULL) + data->error = g_steal_pointer (&local_error); + else if (!g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_debug ("Error closing output stream: %s", local_error->message); + } + g_clear_error (&local_error); + + data->close_output_stream = FALSE; + data->discard_output_stream = FALSE; + } else { + /* finish_download() calls this with a NULL source_object */ + } + + /* Still waiting for one of the streams to close? */ + if (data->close_input_stream || data->close_output_stream) + return; + + if (data->error != NULL) { + g_task_return_error (task, g_error_copy (data->error)); + } else { + g_task_return_boolean (task, TRUE); + } +} + +static void +download_progress (GTask *task) +{ + DownloadData *data = g_task_get_task_data (task); + + if (data->progress_callback != NULL) { + /* This should be guaranteed by the rest of the download code. */ + g_assert (data->expected_stream_size_bytes >= data->total_written_bytes); + + data->progress_callback (data->total_written_bytes, data->expected_stream_size_bytes, + data->progress_user_data); + } +} + +/** + * gs_download_stream_finish: + * @soup_session: a #SoupSession + * @result: result of the asynchronous operation + * @new_etag_out: (out callee-allocates) (transfer full) (optional) (nullable): + * return location for the ETag of the downloaded file (which may be %NULL), + * or %NULL to ignore it + * @new_last_modified_date_out: (out callee-allocates) (transfer full) (optional) (nullable): + * return location for the new Last-Modified date of the downloaded file + * (which may be %NULL), or %NULL to ignore it + * @error: return location for a #GError + * + * Finish an asynchronous download operation started with + * gs_download_stream_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 43 + */ +gboolean +gs_download_stream_finish (SoupSession *soup_session, + GAsyncResult *result, + gchar **new_etag_out, + GDateTime **new_last_modified_date_out, + GError **error) +{ + DownloadData *data; + + g_return_val_if_fail (g_task_is_valid (result, soup_session), FALSE); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_download_stream_async, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + data = g_task_get_task_data (G_TASK (result)); + + if (new_etag_out != NULL) + *new_etag_out = g_strdup (data->new_etag); + if (new_last_modified_date_out != NULL) + *new_last_modified_date_out = (data->new_last_modified_date != NULL) ? g_date_time_ref (data->new_last_modified_date) : NULL; + + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + /* Input data. */ + gchar *uri; /* (not nullable) (owned) */ + GFile *output_file; /* (not nullable) (owned) */ + int io_priority; + GsDownloadProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + gchar *last_etag; /* (nullable) (owned) */ + GDateTime *last_modified_date; /* (nullable) (owned) */ +} DownloadFileData; + +static void +download_file_data_free (DownloadFileData *data) +{ + g_free (data->uri); + g_clear_object (&data->output_file); + g_free (data->last_etag); + g_clear_pointer (&data->last_modified_date, g_date_time_unref); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (DownloadFileData, download_file_data_free) + +static void download_replace_file_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void download_file_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/** + * gs_download_file_async: + * @soup_session: a #SoupSession + * @uri: (not nullable): the URI to download + * @output_file: (not nullable): an output file to write the download to + * @io_priority: I/O priority to download and write at + * @progress_callback: (nullable): callback to call with progress information + * @progress_user_data: (nullable) (closure progress_callback): data to pass + * to @progress_callback + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: callback to call once the operation is complete + * @user_data: (closure callback): data to pass to @callback + * + * Download @uri and write it to @output_file asynchronously, overwriting the + * existing content of @output_file. + * + * The ETag and modification time of @output_file will be queried and, if known, + * used to skip the download if @output_file is already up to date. + * + * If specified, @progress_callback will be called zero or more times until + * @callback is called, providing progress updates on the download. + * + * Since: 42 + */ +void +gs_download_file_async (SoupSession *soup_session, + const gchar *uri, + GFile *output_file, + int io_priority, + GsDownloadProgressCallback progress_callback, + gpointer progress_user_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + DownloadFileData *data; + g_autoptr(DownloadFileData) data_owned = NULL; + g_autoptr(GFile) output_file_parent = NULL; + g_autoptr(GError) local_error = NULL; + + g_return_if_fail (SOUP_IS_SESSION (soup_session)); + g_return_if_fail (uri != NULL); + g_return_if_fail (G_IS_FILE (output_file)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (soup_session, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_download_file_async); + + data = data_owned = g_new0 (DownloadFileData, 1); + data->uri = g_strdup (uri); + data->output_file = g_object_ref (output_file); + data->io_priority = io_priority; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) download_file_data_free); + + /* Create the destination file’s directory. + * FIXME: This should be made async; it hasn’t done for now as it’s + * likely to be fast. */ + output_file_parent = g_file_get_parent (output_file); + + if (output_file_parent != NULL && + !g_file_make_directory_with_parents (output_file_parent, cancellable, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_EXISTS)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_clear_error (&local_error); + + /* Query the old ETag and modification date if the file already exists. */ + data->last_etag = gs_utils_get_file_etag (output_file, &data->last_modified_date, cancellable); + + /* Create the output file. + * + * Note that `data->last_etag` is *not* passed in here, as the ETag from + * the server and the file modification ETag that GLib uses are + * different things. For g_file_replace_async(), GLib always uses an + * ETag it generates internally based on the file mtime (see + * _g_local_file_info_create_etag()), which will never match what the + * server returns in its ETag header. + * + * This is fine, as we are using the ETag to avoid an unnecessary HTTP + * download if possible. We don’t care about tracking changes to the + * file on disk. */ + g_file_replace_async (output_file, + NULL, /* ETag */ + FALSE, /* make_backup */ + G_FILE_CREATE_PRIVATE | G_FILE_CREATE_REPLACE_DESTINATION, + io_priority, + cancellable, + download_replace_file_cb, + g_steal_pointer (&task)); +} + +static void +download_replace_file_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GFile *output_file = G_FILE (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + SoupSession *soup_session = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + DownloadFileData *data = g_task_get_task_data (task); + g_autoptr(GFileOutputStream) output_stream = NULL; + g_autoptr(GError) local_error = NULL; + + output_stream = g_file_replace_finish (output_file, result, &local_error); + + if (output_stream == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Do the download. */ + gs_download_stream_async (soup_session, data->uri, G_OUTPUT_STREAM (output_stream), + data->last_etag, data->last_modified_date, data->io_priority, + data->progress_callback, data->progress_user_data, + cancellable, download_file_cb, g_steal_pointer (&task)); +} + +static void +download_file_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SoupSession *soup_session = SOUP_SESSION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GCancellable *cancellable = g_task_get_cancellable (task); + DownloadFileData *data = g_task_get_task_data (task); + g_autofree gchar *new_etag = NULL; + g_autoptr(GError) local_error = NULL; + + if (!gs_download_stream_finish (soup_session, result, &new_etag, NULL, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Update the stored HTTP ETag. + * + * Under the assumption that this code is only ever used for locally + * cached copies of remote files (i.e. the local copies are never + * modified except by downloading an updated version from the server), + * it’s safe to use the local file modification date for Last-Modified, + * and save having to update that explicitly. This is because the + * modification time of the local file equals when gnome-software last + * checked for updates to it — which is correct to send as the + * If-Modified-Since the next time gnome-software checks for updates to + * the file. */ + gs_utils_set_file_etag (data->output_file, new_etag, cancellable); + + g_task_return_boolean (task, TRUE); +} + +/** + * gs_download_file_finish: + * @soup_session: a #SoupSession + * @result: result of the asynchronous operation + * @error: return location for a #GError + * + * Finish an asynchronous download operation started with + * gs_download_file_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 42 + */ +gboolean +gs_download_file_finish (SoupSession *soup_session, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, soup_session), FALSE); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_download_file_async, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + guint n_pending_downloads; + GError *saved_error; /* (nullable) (owned) */ + GString *rewritten_resource; /* (owned) */ +} DownloadRewriteData; + +static void +download_rewrite_data_free (DownloadRewriteData *data) +{ + g_clear_error (&data->saved_error); + if (data->rewritten_resource != NULL) + g_string_free (data->rewritten_resource, TRUE); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (DownloadRewriteData, download_rewrite_data_free) + +static void download_rewrite_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_download_rewrite (GTask *task, + GError *error); + +/** + * gs_download_rewrite_resource_async: + * @resource: the CSS resource + * @cancellable: a #GCancellable, or %NULL + * @callback: a #GAsyncReadyCallback + * @user_data: data to pass to @callback + * + * Downloads remote assets and rewrites a CSS resource to use cached local URIs. + * + * Since: 45 + **/ +void +gs_download_rewrite_resource_async (const gchar *resource, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(DownloadRewriteData) data_owned = NULL; + DownloadRewriteData *data; + guint start = 0; + g_autoptr(GString) resource_str = g_string_new (resource); + g_autoptr(SoupSession) soup_session = NULL; + g_autoptr(GError) local_error = NULL; + + g_return_if_fail (resource != NULL); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_download_rewrite_resource_async); + + data = data_owned = g_new0 (DownloadRewriteData, 1); + data->n_pending_downloads = 1; /* start with 1 to represent the string rewrite */ + data->rewritten_resource = g_string_new (""); + + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) download_rewrite_data_free); + + /* replace datadir */ + gs_utils_gstring_replace (resource_str, "@datadir@", DATADIR); + resource = resource_str->str; + + /* look in string for any url() links */ + for (guint i = 0; resource[i] != '\0'; i++) { + if (i > 4 && strncmp (resource + i - 4, "url(", 4) == 0) { + start = i; + continue; + } + if (start == 0) { + g_string_append_c (data->rewritten_resource, resource[i]); + continue; + } + if (resource[i] == ')') { + guint len; + g_autofree gchar *cachefn = NULL; + g_autofree gchar *uri = NULL; + const char *unprefixed_uri; + + /* remove optional single quotes */ + if (resource[start] == '\'' || resource[start] == '"') + start++; + len = i - start; + if (i > 0 && (resource[i - 1] == '\'' || resource[i - 1] == '"')) + len--; + uri = g_strndup (resource + start, len); + + /* download them to per-user cache */ + + /* local files */ + if (g_str_has_prefix (uri, "file://")) + unprefixed_uri = uri + strlen ("file://"); + else + unprefixed_uri = uri; + + if (g_str_has_prefix (unprefixed_uri, "/")) { + if (!g_file_test (unprefixed_uri, G_FILE_TEST_EXISTS)) { + g_set_error (&local_error, + G_IO_ERROR, + G_IO_ERROR_NOT_FOUND, + "Failed to find file: %s", unprefixed_uri); + finish_download_rewrite (task, g_steal_pointer (&local_error)); + return; + } + cachefn = g_strdup (unprefixed_uri); + } else { + /* get cache location */ + cachefn = gs_utils_get_cache_filename ("cssresource", unprefixed_uri, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_USE_HASH | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &local_error); + if (cachefn == NULL) { + finish_download_rewrite (task, g_steal_pointer (&local_error)); + return; + } + + /* Download it if it doesn’t already exist */ + if (!g_file_test (cachefn, G_FILE_TEST_EXISTS)) { + g_autoptr(GFile) output_file = NULL; + + if (soup_session == NULL) + soup_session = gs_build_soup_session (); + + /* Do the download. */ + output_file = g_file_new_for_path (cachefn); + data->n_pending_downloads++; + gs_download_file_async (soup_session, unprefixed_uri, output_file, + G_PRIORITY_LOW, + NULL, NULL, + cancellable, + download_rewrite_cb, g_object_ref (task)); + } + } + + g_string_append_printf (data->rewritten_resource, "'file://%s'", cachefn); + g_string_append_c (data->rewritten_resource, resource[i]); + start = 0; + } + } + + finish_download_rewrite (task, NULL); +} + +static void +download_rewrite_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SoupSession *soup_session = SOUP_SESSION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_download_file_finish (soup_session, result, &local_error) && + g_error_matches (local_error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) { + /* Ignore cache matches. */ + g_clear_error (&local_error); + } + + finish_download_rewrite (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL. */ +static void +finish_download_rewrite (GTask *task, + GError *error) +{ + g_autoptr(GError) error_owned = g_steal_pointer (&error); + DownloadRewriteData *data = g_task_get_task_data (task); + + g_assert (data->n_pending_downloads > 0); + data->n_pending_downloads--; + + if (data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while downloading resources: %s", error_owned->message); + + if (data->n_pending_downloads == 0) { + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_pointer (task, g_string_free (g_steal_pointer (&data->rewritten_resource), FALSE), g_free); + } +} + +/** + * gs_download_rewrite_resource_finish: + * @result: a #GAsyncResult + * @error: return location for a #GError, or %NULL + * + * Finish a download/rewrite operation started with + * gs_download_rewrite_resource_async(). + * + * Returns: the rewritten CSS + * Since: 45 + */ +gchar * +gs_download_rewrite_resource_finish (GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} diff --git a/lib/gs-download-utils.h b/lib/gs-download-utils.h new file mode 100644 index 0000000..edc2ce6 --- /dev/null +++ b/lib/gs-download-utils.h @@ -0,0 +1,95 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +SoupSession *gs_build_soup_session (void); + +/** + * GsDownloadProgressCallback: + * @bytes_downloaded: number of bytes downloaded so far + * @total_download_size: the total size of the download, in bytes + * @user_data: data passed to the calling function + * + * A progress callback to indicate how far a download has progressed. + * + * @total_download_size may be zero (for example, at the start of the download), + * so implementations of this callback must be careful to avoid division by zero + * errors. + * + * @total_download_size is guaranteed to always be greater than or equal to + * @bytes_downloaded. + * + * Since: 42 + */ +typedef void (*GsDownloadProgressCallback) (gsize bytes_downloaded, + gsize total_download_size, + gpointer user_data); + +/** + * GsDownloadError: + * @GS_DOWNLOAD_ERROR_NOT_MODIFIED: The ETag matches that of the server file. + * + * Error codes for download operations. + * + * Since: 44 + */ +typedef enum { + GS_DOWNLOAD_ERROR_NOT_MODIFIED, +} GsDownloadError; + +#define GS_DOWNLOAD_ERROR gs_download_error_quark () +GQuark gs_download_error_quark (void); + +void gs_download_stream_async (SoupSession *soup_session, + const gchar *uri, + GOutputStream *output_stream, + const gchar *last_etag, + GDateTime *last_modified_date, + int io_priority, + GsDownloadProgressCallback progress_callback, + gpointer progress_user_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_download_stream_finish (SoupSession *soup_session, + GAsyncResult *result, + gchar **new_etag_out, + GDateTime **new_last_modified_date_out, + GError **error); + +void gs_download_file_async (SoupSession *soup_session, + const gchar *uri, + GFile *output_file, + int io_priority, + GsDownloadProgressCallback progress_callback, + gpointer progress_user_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_download_file_finish (SoupSession *soup_session, + GAsyncResult *result, + GError **error); + +void gs_download_rewrite_resource_async (const gchar *resource, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gchar *gs_download_rewrite_resource_finish (GAsyncResult *result, + GError **error); + +G_END_DECLS diff --git a/lib/gs-external-appstream-utils.c b/lib/gs-external-appstream-utils.c new file mode 100644 index 0000000..6876cf0 --- /dev/null +++ b/lib/gs-external-appstream-utils.c @@ -0,0 +1,723 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018 Endless Mobile, Inc. + * + * Authors: Joaquim Rocha + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + * SECTION:gs-external-appstream-urls + * @short_description: Provides support for downloading external AppStream files. + * + * This downloads the set of configured external AppStream files, and caches + * them locally. + * + * According to the `external-appstream-system-wide` GSetting, the files will + * either be downloaded to a per-user cache, or to a system-wide cache. In the + * case of a system-wide cache, they are downloaded to a temporary file writable + * by the user, and then the suexec binary `gnome-software-install-appstream` is + * run to copy them to the system location. + * + * All the downloads are done in the default #GMainContext for the thread which + * calls gs_external_appstream_refresh_async(). They are done in parallel and + * the async refresh function will only complete once the last download is + * complete. + * + * Progress data is reported via a callback, and gives the total progress of all + * parallel downloads. Internally this is done by updating #ProgressTuple + * structs as each download progresses. A periodic timeout callback sums these + * and reports the total progress to the caller. That means that progress + * reports from gs_external_appstream_refresh_async() are done at a constant + * frequency. + * + * To test this code locally you will probably want to change your GSettings + * configuration to add some external AppStream URIs: + * ``` + * gsettings set org.gnome.software external-appstream-urls '["https://example.com/appdata.xml.gz"]' + * ``` + * + * When you are done with development, run the following command to use the real + * external AppStream list again: + * ``` + * gsettings reset org.gnome.software external-appstream-urls + * ``` + * + * Since: 42 + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "gs-external-appstream-utils.h" + +#define APPSTREAM_SYSTEM_DIR LOCALSTATEDIR "/cache/swcatalog/xml" + +G_DEFINE_QUARK (gs-external-appstream-error-quark, gs_external_appstream_error) + +gchar * +gs_external_appstream_utils_get_file_cache_path (const gchar *file_name) +{ + g_autofree gchar *prefixed_file_name = g_strdup_printf (EXTERNAL_APPSTREAM_PREFIX "-%s", + file_name); + return g_build_filename (APPSTREAM_SYSTEM_DIR, prefixed_file_name, NULL); +} + +/* To be able to delete old files, when the path changed */ +gchar * +gs_external_appstream_utils_get_legacy_file_cache_path (const gchar *file_name) +{ + g_autofree gchar *prefixed_file_name = g_strdup_printf (EXTERNAL_APPSTREAM_PREFIX "-%s", + file_name); + return g_build_filename (LOCALSTATEDIR "/cache/app-info/xmls", prefixed_file_name, NULL); +} + +const gchar * +gs_external_appstream_utils_get_system_dir (void) +{ + return APPSTREAM_SYSTEM_DIR; +} + +static gboolean +gs_external_appstream_check (GFile *appstream_file, + guint64 cache_age_secs) +{ + guint64 appstream_file_age = gs_utils_get_file_age (appstream_file); + return appstream_file_age >= cache_age_secs; +} + +static gboolean +gs_external_appstream_install (const gchar *appstream_file, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GSubprocess) subprocess = NULL; + const gchar *argv[] = { "pkexec", + LIBEXECDIR "/gnome-software-install-appstream", + appstream_file, NULL}; + g_debug ("Installing the appstream file %s in the system", + appstream_file); + subprocess = g_subprocess_newv (argv, + G_SUBPROCESS_FLAGS_STDOUT_PIPE | + G_SUBPROCESS_FLAGS_STDIN_PIPE, error); + if (subprocess == NULL) + return FALSE; + return g_subprocess_wait_check (subprocess, cancellable, error); +} + +static void download_replace_file_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void download_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/* A tuple to store the last-received progress data for a single download. + * Each download (refresh_url_async()) has a pointer to the relevant + * #ProgressTuple for its download. These are stored in an array in #RefreshData + * and a timeout callback periodically sums them all and reports progress to the + * caller. */ +typedef struct { + gsize bytes_downloaded; + gsize total_download_size; +} ProgressTuple; + +typedef struct { + /* Input data. */ + gchar *url; /* (not nullable) (owned) */ + GTask *task; /* (not nullable) (owned) */ + GFile *output_file; /* (not nullable) (owned) */ + ProgressTuple *progress_tuple; /* (not nullable) */ + SoupSession *soup_session; /* (not nullable) (owned) */ + gboolean system_wide; + + /* In-progress data. */ + gchar *last_etag; /* (nullable) (owned) */ + GDateTime *last_modified_date; /* (nullable) (owned) */ +} DownloadAppStreamData; + +static void +download_appstream_data_free (DownloadAppStreamData *data) +{ + g_free (data->url); + g_clear_object (&data->task); + g_clear_object (&data->output_file); + g_clear_object (&data->soup_session); + g_free (data->last_etag); + g_clear_pointer (&data->last_modified_date, g_date_time_unref); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (DownloadAppStreamData, download_appstream_data_free) + +static void +refresh_url_progress_cb (gsize bytes_downloaded, + gsize total_download_size, + gpointer user_data) +{ + ProgressTuple *tuple = user_data; + + tuple->bytes_downloaded = bytes_downloaded; + tuple->total_download_size = total_download_size; + + /* The timeout callback in progress_cb() periodically sums these. No + * need to notify of progress from here. */ +} + +static void +refresh_url_async (GSettings *settings, + const gchar *cache_kind, + const gchar *url, + SoupSession *soup_session, + guint64 cache_age_secs, + ProgressTuple *progress_tuple, + gchar **out_appstream_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autofree gchar *basename = NULL; + g_autofree gchar *basename_url = g_path_get_basename (url); + /* make sure different uris with same basenames differ */ + g_autofree gchar *hash = NULL; + g_autofree gchar *target_file_path = NULL; + g_autoptr(GFile) target_file = NULL; + g_autoptr(GFile) tmp_file_parent = NULL; + g_autoptr(GFile) tmp_file = NULL; + g_autoptr(GsApp) app_dl = gs_app_new ("external-appstream"); + g_autoptr(GError) local_error = NULL; + DownloadAppStreamData *data; + gboolean system_wide; + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, refresh_url_async); + + /* Calculate the basename of the target file. */ + hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1, url, -1); + if (hash == NULL) { + g_task_return_new_error (task, + GS_EXTERNAL_APPSTREAM_ERROR, + GS_EXTERNAL_APPSTREAM_ERROR_DOWNLOADING, + "Failed to hash URI ‘%s’", url); + return; + } + basename = g_strdup_printf ("%s-%s", hash, basename_url); + + /* Are we downloading for a given cache kind, the user, or the system? */ + system_wide = cache_kind == NULL && g_settings_get_boolean (settings, "external-appstream-system-wide"); + + /* Check cache file age. */ + if (cache_kind != NULL) { + target_file_path = gs_utils_get_cache_filename (cache_kind, + basename, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &local_error); + if (target_file_path == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } else if (system_wide) { + target_file_path = gs_external_appstream_utils_get_file_cache_path (basename); + } else { + g_autofree gchar *legacy_file_path = NULL; + + target_file_path = g_build_filename (g_get_user_data_dir (), + "swcatalog", + "xml", + basename, + NULL); + + /* Delete an old file, from a legacy location */ + legacy_file_path = g_build_filename (g_get_user_data_dir (), + "app-info", + "xmls", + basename, + NULL); + + if (g_unlink (legacy_file_path) == -1) { + int errn = errno; + if (errn != ENOENT) + g_debug ("Failed to unlink '%s': %s", legacy_file_path, g_strerror (errn)); + + } + } + + target_file = g_file_new_for_path (target_file_path); + + if (!gs_external_appstream_check (target_file, cache_age_secs)) { + g_debug ("skipping updating external appstream file %s: " + "cache age is older than file", + target_file_path); + if (out_appstream_path != NULL) { + *out_appstream_path = g_steal_pointer (&target_file_path); + } + g_task_return_boolean (task, TRUE); + return; + } + + if (out_appstream_path != NULL) { + *out_appstream_path = g_steal_pointer (&target_file_path); + } + + /* If downloading system wide, write the download contents into a + * temporary file that will be copied into the system location later. */ + if (system_wide) { + g_autofree gchar *tmp_file_path = NULL; + + tmp_file_path = gs_utils_get_cache_filename ("external-appstream", + basename, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &local_error); + if (tmp_file_path == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + tmp_file = g_file_new_for_path (tmp_file_path); + } else { + tmp_file = g_object_ref (target_file); + } + + gs_app_set_summary_missing (app_dl, + /* TRANSLATORS: status text when downloading */ + _("Downloading extra metadata files…")); + + data = g_new0 (DownloadAppStreamData, 1); + data->url = g_strdup (url); + data->task = g_object_ref (task); + data->output_file = g_object_ref (tmp_file); + data->progress_tuple = progress_tuple; + data->soup_session = g_object_ref (soup_session); + data->system_wide = system_wide; + g_task_set_task_data (task, data, (GDestroyNotify) download_appstream_data_free); + + /* Create the destination file’s directory. + * FIXME: This should be made async; it hasn’t done for now as it’s + * likely to be fast. */ + tmp_file_parent = g_file_get_parent (tmp_file); + + if (tmp_file_parent != NULL && + !g_file_make_directory_with_parents (tmp_file_parent, cancellable, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_EXISTS)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_clear_error (&local_error); + + /* Query the ETag and modification date of the target file, if the file already exists. For + * system-wide installations, this is the ETag of the AppStream file installed system-wide. + * For local installations, this is just the local output file. */ + data->last_etag = gs_utils_get_file_etag (target_file, &data->last_modified_date, cancellable); + g_debug ("Queried ETag of file %s: %s", g_file_peek_path (target_file), data->last_etag); + + /* Create the output file */ + g_file_replace_async (tmp_file, + NULL, /* ETag */ + FALSE, /* make_backup */ + G_FILE_CREATE_PRIVATE | G_FILE_CREATE_REPLACE_DESTINATION, + G_PRIORITY_LOW, + cancellable, + download_replace_file_cb, + g_steal_pointer (&task)); +} + +static void +download_replace_file_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GFile *output_file = G_FILE (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GCancellable *cancellable = g_task_get_cancellable (task); + DownloadAppStreamData *data = g_task_get_task_data (task); + g_autoptr(GFileOutputStream) output_stream = NULL; + g_autoptr(GError) local_error = NULL; + + output_stream = g_file_replace_finish (output_file, result, &local_error); + + if (output_stream == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Do the download. */ + gs_download_stream_async (data->soup_session, + data->url, + G_OUTPUT_STREAM (output_stream), + data->last_etag, + data->last_modified_date, + G_PRIORITY_LOW, + refresh_url_progress_cb, + data->progress_tuple, + cancellable, + download_stream_cb, + g_steal_pointer (&task)); +} + +static void +download_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SoupSession *soup_session = SOUP_SESSION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GCancellable *cancellable = g_task_get_cancellable (task); + DownloadAppStreamData *data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + g_autofree gchar *new_etag = NULL; + + if (!gs_download_stream_finish (soup_session, result, &new_etag, NULL, &local_error)) { + if (data->system_wide && g_error_matches (local_error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) { + g_debug ("External AppStream file not modified, removing temporary download file %s", + g_file_peek_path (data->output_file)); + + /* System-wide installs should delete the empty file created when preparing to + * download the external AppStream file. */ + g_file_delete_async (data->output_file, G_PRIORITY_LOW, NULL, NULL, NULL); + g_task_return_boolean (task, TRUE); + } else if (!g_network_monitor_get_network_available (g_network_monitor_get_default ())) { + g_task_return_new_error (task, + GS_EXTERNAL_APPSTREAM_ERROR, + GS_EXTERNAL_APPSTREAM_ERROR_NO_NETWORK, + "External AppStream could not be downloaded due to being offline"); + } else { + g_task_return_new_error (task, + GS_EXTERNAL_APPSTREAM_ERROR, + GS_EXTERNAL_APPSTREAM_ERROR_DOWNLOADING, + "Server returned no data for external AppStream file: %s", + local_error->message); + } + return; + } + + g_debug ("Downloaded appstream file %s", g_file_peek_path (data->output_file)); + + gs_utils_set_file_etag (data->output_file, new_etag, cancellable); + + if (data->system_wide) { + /* install file systemwide */ + if (!gs_external_appstream_install (g_file_peek_path (data->output_file), + cancellable, + &local_error)) { + g_task_return_new_error (task, + GS_EXTERNAL_APPSTREAM_ERROR, + GS_EXTERNAL_APPSTREAM_ERROR_INSTALLING_ON_SYSTEM, + "Error installing external AppStream file on system: %s", local_error->message); + return; + } + g_debug ("Installed appstream file %s", g_file_peek_path (data->output_file)); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +refresh_url_finish (GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static gboolean progress_cb (gpointer user_data); +static void finish_refresh_op (GTask *task, + GError *error); + +typedef struct { + /* Input data. */ + guint64 cache_age_secs; + + /* In-progress data. */ + guint n_pending_ops; + GError *error; /* (nullable) (owned) */ + GsDownloadProgressCallback progress_callback; /* (nullable) */ + gpointer progress_user_data; /* (closure progress_callback) */ + gsize n_appstream_urls; + ProgressTuple *progress_tuples; /* (array length=n_appstream_urls) (owned) */ + GSource *progress_source; /* (owned) */ + /* This is a fixed-sized array that contains (n_appstream_urls + 1) + * items, the last one being guaranteed to be NULL. It is used like a + * fixed-sized array internally, but it turned into a NULL-terminated + * array into gs_external_appstream_refresh_finish() to avoid + * reallocation. */ + gchar **appstream_paths; /* (array length=n_appstream_urls) (owned) */ +} RefreshData; + +static void +refresh_data_free (RefreshData *data) +{ + g_assert (data->n_pending_ops == 0); + + /* If this was set it should have been stolen for g_task_return_error() + * by now. */ + g_assert (data->error == NULL); + + /* Similarly, progress reporting should have been stopped by now. */ + g_assert (g_source_is_destroyed (data->progress_source)); + g_source_unref (data->progress_source); + + g_free (data->progress_tuples); + + /* This doesn’t use g_strfreev() because it is a fixed-sized array, any + * element of data->appstream_paths may be NULL. It itself can be NULL + * if it has been stolen in gs_external_appstream_refresh_finish(). */ + if (data->appstream_paths != NULL) { + for (gsize i = 0; i < data->n_appstream_urls; i++) { + g_clear_pointer (&data->appstream_paths[i], g_free); + } + g_clear_pointer (&data->appstream_paths, g_free); + } + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (RefreshData, refresh_data_free) + +/** + * gs_external_appstream_refresh_async: + * @cache_kind: (nullable): a cache kind, e.g. "fwupd" or "screenshots/123x456", or %NULL + * @appstream_urls: a %NULL-terminated array of URLs + * @cache_age_secs: cache age, in seconds, as passed to #GsPluginClass.refresh_metadata_async() + * @progress_callback: (nullable): callback to call with progress information + * @progress_user_data: (nullable) (closure progress_callback): data to pass + * to @progress_callback + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function call when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Refresh any external appstream files, if the cache is too old. + * + * If @cache_kind is set, the files will be cached into a per-user cache + * directory, and into a global cache othwerwise. The global directory will be + * system-wide or user-specific according to the + * `external-appstream-system-wide` setting. + * + * If a plugin requests a file to be saved in the cache it is the plugins + * responsibility to remove the file when it is no longer valid or is too old + * -- gnome-software will not ever clean the cache for the plugin. + * For this reason it is a good idea to use the plugin name as @cache_kind. + * + * Since: 48 + */ +void +gs_external_appstream_refresh_async (const gchar *cache_kind, + GStrv appstream_urls, + guint64 cache_age_secs, + GsDownloadProgressCallback progress_callback, + gpointer progress_user_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GSettings) settings = NULL; + gsize n_appstream_urls; + g_autoptr(SoupSession) soup_session = NULL; + g_autoptr(GTask) task = NULL; + RefreshData *data; + g_autoptr(RefreshData) data_owned = NULL; + + /* Chosen to allow a few UI updates per second without updating the + * progress label so often it’s unreadable. */ + const guint progress_update_period_ms = 300; + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_external_appstream_refresh_async); + + settings = g_settings_new ("org.gnome.software"); + soup_session = gs_build_soup_session (); + n_appstream_urls = g_strv_length (appstream_urls); + + data = data_owned = g_new0 (RefreshData, 1); + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->n_appstream_urls = n_appstream_urls; + data->progress_tuples = g_new0 (ProgressTuple, n_appstream_urls); + data->progress_source = g_timeout_source_new (progress_update_period_ms); + /* We want to use it as a fixed-size array internally but to return it + * as a NULL-terminated array, so we have to add an extra terminating + * item at the end. */ + data->appstream_paths = g_new0 (gchar *, n_appstream_urls + 1); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) refresh_data_free); + + /* Set up the progress timeout. This periodically sums up the progress + * tuples in `data->progress_tuples` and reports them to the calling + * function via @progress_callback, giving an overall progress for all + * the parallel operations. */ + g_source_set_callback (data->progress_source, progress_cb, g_object_ref (task), g_object_unref); + g_source_attach (data->progress_source, g_main_context_get_thread_default ()); + + /* Refresh all the URIs in parallel. */ + data->n_pending_ops = 1; + + for (gsize i = 0; i < n_appstream_urls; i++) { + /* localhost is safe to communicate with in an unencrypted way. + * It is unlikely to be used in real life scenarios, but it's + * used in some tests. We could use TLS in the tests, but it + * would needlessly complexify them. */ + if (!g_str_has_prefix (appstream_urls[i], "https:") && + !g_str_has_prefix (appstream_urls[i], "http://localhost/") && + !g_str_has_prefix (appstream_urls[i], "http://localhost:")) { + g_warning ("Not considering %s as an external " + "appstream source: please use an https URL", + appstream_urls[i]); + continue; + } + + data->n_pending_ops++; + refresh_url_async (settings, + cache_kind, + appstream_urls[i], + soup_session, + cache_age_secs, + &data->progress_tuples[i], + &data->appstream_paths[i], + cancellable, + refresh_cb, + g_object_ref (task)); + } + + finish_refresh_op (task, NULL); +} + +static void +refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + refresh_url_finish (result, &local_error); + finish_refresh_op (task, g_steal_pointer (&local_error)); +} + +static gboolean +progress_cb (gpointer user_data) +{ + GTask *task = G_TASK (user_data); + RefreshData *data = g_task_get_task_data (task); + gsize parallel_bytes_downloaded = 0, parallel_total_download_size = 0; + + /* Sum up the progress numerator and denominator for all parallel + * downloads. */ + for (gsize i = 0; i < data->n_appstream_urls; i++) { + const ProgressTuple *progress_tuple = &data->progress_tuples[i]; + + if (!g_size_checked_add (¶llel_bytes_downloaded, + parallel_bytes_downloaded, + progress_tuple->bytes_downloaded)) + parallel_bytes_downloaded = G_MAXSIZE; + if (!g_size_checked_add (¶llel_total_download_size, + parallel_total_download_size, + progress_tuple->total_download_size)) + parallel_total_download_size = G_MAXSIZE; + } + + /* Report progress to the calling function. */ + if (data->progress_callback != NULL) + data->progress_callback (parallel_bytes_downloaded, + parallel_total_download_size, + data->progress_user_data); + + return G_SOURCE_CONTINUE; +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_refresh_op (GTask *task, + GError *error) +{ + RefreshData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (data->error == NULL && error_owned != NULL) + data->error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while refreshing external appstream: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Emit one final progress update, then stop any further ones. */ + progress_cb (task); + g_source_destroy (data->progress_source); + + /* All complete. */ + if (data->error != NULL) + g_task_return_error (task, g_steal_pointer (&data->error)); + else + g_task_return_boolean (task, TRUE); +} + +/** + * gs_external_appstream_refresh_finish: + * @result: a #GAsyncResult + * @out_appstream_paths: (out) (transfer full) (optional) (nullable): return + * location for the %NULL-terminated array of downloaded appstream file paths, + * or %NULL to ignore + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous refresh operation started with + * gs_external_appstream_refresh_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 48 + */ +gboolean +gs_external_appstream_refresh_finish (GAsyncResult *result, + gchar ***out_appstream_paths, + GError **error) +{ + GTask *task; + RefreshData *data; + g_auto(GStrv) appstream_paths_tmp = NULL; + gboolean success; + + g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + task = G_TASK (result); + data = g_task_get_task_data (task); + + if (out_appstream_paths != NULL) { + /* Turn the paths array from a fixed-size array into a + * NULL-terminated one, so we can return it without copying it. + */ + for (gsize i = 0, j = 0; i < data->n_appstream_urls; i++) { + if (data->appstream_paths[i] == NULL) { + continue; + } + + if (i != j) { + data->appstream_paths[j] = g_steal_pointer (&data->appstream_paths[i]); + } + + j++; + } + appstream_paths_tmp = g_steal_pointer (&data->appstream_paths); + } + + success = g_task_propagate_boolean (G_TASK (result), error); + + if (success && out_appstream_paths != NULL) { + *out_appstream_paths = g_steal_pointer (&appstream_paths_tmp); + } + + return success; +} diff --git a/lib/gs-external-appstream-utils.h b/lib/gs-external-appstream-utils.h new file mode 100644 index 0000000..d74456c --- /dev/null +++ b/lib/gs-external-appstream-utils.h @@ -0,0 +1,51 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018 Endless Mobile, Inc. + * + * Authors: Joaquim Rocha + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#define EXTERNAL_APPSTREAM_PREFIX "org.gnome.Software" + +/** + * GsExternalAppstreamError: + * @GS_EXTERNAL_APPSTREAM_ERROR_DOWNLOADING: Error while downloading external appstream data. + * @GS_EXTERNAL_APPSTREAM_ERROR_NO_NETWORK: Offline or network unavailable. + * @GS_EXTERNAL_APPSTREAM_ERROR_INSTALLING_ON_SYSTEM: Error while installing an external AppStream file system-wide. + * + * Error codes for external appstream operations. + * + * Since: 42 + */ +typedef enum { + GS_EXTERNAL_APPSTREAM_ERROR_DOWNLOADING, + GS_EXTERNAL_APPSTREAM_ERROR_NO_NETWORK, + GS_EXTERNAL_APPSTREAM_ERROR_INSTALLING_ON_SYSTEM, +} GsExternalAppstreamError; + +#define GS_EXTERNAL_APPSTREAM_ERROR gs_external_appstream_error_quark () +GQuark gs_external_appstream_error_quark (void); + +const gchar *gs_external_appstream_utils_get_system_dir (void); +gchar *gs_external_appstream_utils_get_file_cache_path (const gchar *file_name); +gchar *gs_external_appstream_utils_get_legacy_file_cache_path (const gchar *file_name); + +void gs_external_appstream_refresh_async (const gchar *cache_kind, + GStrv appstream_urls, + guint64 cache_age_secs, + GsDownloadProgressCallback progress_callback, + gpointer progress_user_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_external_appstream_refresh_finish (GAsyncResult *result, + gchar ***out_appstream_paths, + GError **error); diff --git a/lib/gs-fedora-third-party.c b/lib/gs-fedora-third-party.c new file mode 100644 index 0000000..e79bba8 --- /dev/null +++ b/lib/gs-fedora-third-party.c @@ -0,0 +1,514 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include + +#include "gs-fedora-third-party.h" + +struct _GsFedoraThirdParty +{ + GObject parent_instance; + GMutex lock; + gchar *executable; + GHashTable *repos; /* gchar *name ~> gchar *packaging format */ + gint64 last_update; + const gchar *dnf_handler; +}; + +G_DEFINE_TYPE (GsFedoraThirdParty, gs_fedora_third_party, G_TYPE_OBJECT) + +static GObject * +gs_fedora_third_party_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + static GWeakRef singleton; + GObject *result; + + result = g_weak_ref_get (&singleton); + if (result == NULL) { + result = G_OBJECT_CLASS (gs_fedora_third_party_parent_class)->constructor (type, n_construct_properties, construct_properties); + + if (result) + g_weak_ref_set (&singleton, result); + } + + return result; +} + +static void +gs_fedora_third_party_finalize (GObject *object) +{ + GsFedoraThirdParty *self = GS_FEDORA_THIRD_PARTY (object); + + g_clear_pointer (&self->executable, g_free); + g_clear_pointer (&self->repos, g_hash_table_unref); + g_mutex_clear (&self->lock); + + /* Chain up to parent's method. */ + G_OBJECT_CLASS (gs_fedora_third_party_parent_class)->finalize (object); +} + +static void +gs_fedora_third_party_class_init (GsFedoraThirdPartyClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->constructor = gs_fedora_third_party_constructor; + object_class->finalize = gs_fedora_third_party_finalize; +} + +static void +gs_fedora_third_party_init (GsFedoraThirdParty *self) +{ + g_mutex_init (&self->lock); +} + +GsFedoraThirdParty * +gs_fedora_third_party_new (GsPluginLoader *plugin_loader) +{ + GsFedoraThirdParty *self = g_object_new (GS_TYPE_FEDORA_THIRD_PARTY, NULL); + if (gs_plugin_loader_get_enabled (plugin_loader, "packagekit")) + self->dnf_handler = "packagekit"; + else if (gs_plugin_loader_get_enabled (plugin_loader, "rpm-ostree")) + self->dnf_handler = "rpm-ostree"; + return self; +} + +static gchar * +gs_fedora_third_party_ensure_executable_locked (GsFedoraThirdParty *self, + GError **error) +{ + if (self->executable == NULL) + self->executable = g_find_program_in_path ("fedora-third-party"); + + if (self->executable == NULL) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "File 'fedora-third-party' not found"); + return NULL; + } + + return g_strdup (self->executable); +} + +gboolean +gs_fedora_third_party_is_available (GsFedoraThirdParty *self) +{ + g_autofree gchar *executable = NULL; + + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + + g_mutex_lock (&self->lock); + executable = gs_fedora_third_party_ensure_executable_locked (self, NULL); + g_mutex_unlock (&self->lock); + + return (executable != NULL); +} + +void +gs_fedora_third_party_invalidate (GsFedoraThirdParty *self) +{ + g_return_if_fail (GS_IS_FEDORA_THIRD_PARTY (self)); + + g_mutex_lock (&self->lock); + g_clear_pointer (&self->executable, g_free); + g_clear_pointer (&self->repos, g_hash_table_unref); + self->last_update = 0; + g_mutex_unlock (&self->lock); +} + +typedef struct _AsyncData +{ + gboolean enable; + gboolean config_only; +} AsyncData; + +static AsyncData * +async_data_new (gboolean enable, + gboolean config_only) +{ + AsyncData *async_data = g_slice_new0 (AsyncData); + async_data->enable = enable; + async_data->config_only = config_only; + return async_data; +} + +static void +async_data_free (gpointer ptr) +{ + AsyncData *async_data = ptr; + if (async_data != NULL) + g_slice_free (AsyncData, async_data); +} + +static void +gs_fedora_third_party_query_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + g_autoptr(GError) error = NULL; + GsFedoraThirdPartyState state; + if (gs_fedora_third_party_query_sync (GS_FEDORA_THIRD_PARTY (source_object), &state, cancellable, &error)) + g_task_return_int (task, state); + else + g_task_return_error (task, g_steal_pointer (&error)); +} + +void +gs_fedora_third_party_query (GsFedoraThirdParty *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + g_return_if_fail (GS_IS_FEDORA_THIRD_PARTY (self)); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_fedora_third_party_query); + g_task_run_in_thread (task, gs_fedora_third_party_query_thread); +} + +gboolean +gs_fedora_third_party_query_finish (GsFedoraThirdParty *self, + GAsyncResult *result, + GsFedoraThirdPartyState *out_state, + GError **error) +{ + GError *local_error = NULL; + GsFedoraThirdPartyState state = GS_FEDORA_THIRD_PARTY_STATE_UNKNOWN; + + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + + state = g_task_propagate_int (G_TASK (result), &local_error); + if (local_error) { + g_propagate_error (error, local_error); + return FALSE; + } + + if (out_state) + *out_state = state; + + return TRUE; +} + +gboolean +gs_fedora_third_party_query_sync (GsFedoraThirdParty *self, + GsFedoraThirdPartyState *out_state, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *executable = NULL; + const gchar *args[] = { + "", /* executable */ + "query", + "--quiet", + NULL + }; + gboolean success = FALSE; + gint wait_status = -1; + + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + + g_mutex_lock (&self->lock); + executable = gs_fedora_third_party_ensure_executable_locked (self, error); + g_mutex_unlock (&self->lock); + + if (executable == NULL) + return FALSE; + + args[0] = executable; + success = g_spawn_sync (NULL, (gchar **) args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &wait_status, error); + if (success) { + GsFedoraThirdPartyState state = GS_FEDORA_THIRD_PARTY_STATE_UNKNOWN; + /* See https://pagure.io/fedora-third-party/blob/main/f/doc/fedora-third-party.1.md */ + switch (WEXITSTATUS (wait_status)) { + case 0: + state = GS_FEDORA_THIRD_PARTY_STATE_ENABLED; + break; + case 1: + state = GS_FEDORA_THIRD_PARTY_STATE_DISABLED; + break; + case 2: + state = GS_FEDORA_THIRD_PARTY_STATE_ASK; + break; + default: + break; + } + if (out_state) + *out_state = state; + } + + return success; +} + +static void +gs_fedora_third_party_switch_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + g_autoptr(GError) error = NULL; + AsyncData *async_data = task_data; + if (gs_fedora_third_party_switch_sync (GS_FEDORA_THIRD_PARTY (source_object), async_data->enable, async_data->config_only, cancellable, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&error)); +} + +void +gs_fedora_third_party_switch (GsFedoraThirdParty *self, + gboolean enable, + gboolean config_only, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + g_return_if_fail (GS_IS_FEDORA_THIRD_PARTY (self)); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_fedora_third_party_switch); + g_task_set_task_data (task, async_data_new (enable, config_only), async_data_free); + g_task_run_in_thread (task, gs_fedora_third_party_switch_thread); +} + +gboolean +gs_fedora_third_party_switch_finish (GsFedoraThirdParty *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + return g_task_propagate_boolean (G_TASK (result), error); +} + +gboolean +gs_fedora_third_party_switch_sync (GsFedoraThirdParty *self, + gboolean enable, + gboolean config_only, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *executable = NULL; + const gchar *args[] = { + "pkexec", + "", /* executable */ + "", /* command */ + "", /* config-only */ + NULL + }; + gint wait_status = -1; + + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + + g_mutex_lock (&self->lock); + executable = gs_fedora_third_party_ensure_executable_locked (self, error); + g_mutex_unlock (&self->lock); + + if (executable == NULL) + return FALSE; + + args[1] = executable; + args[2] = enable ? "enable" : "disable"; + args[3] = config_only ? "--config-only" : NULL; + return g_spawn_sync (NULL, (gchar **) args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &wait_status, error) && + g_spawn_check_wait_status (wait_status, error); +} + +static void +gs_fedora_third_party_opt_out_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + g_autoptr(GError) error = NULL; + if (gs_fedora_third_party_opt_out_sync (GS_FEDORA_THIRD_PARTY (source_object), cancellable, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&error)); +} + +void +gs_fedora_third_party_opt_out (GsFedoraThirdParty *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + g_return_if_fail (GS_IS_FEDORA_THIRD_PARTY (self)); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_fedora_third_party_opt_out); + g_task_run_in_thread (task, gs_fedora_third_party_opt_out_thread); +} + +gboolean +gs_fedora_third_party_opt_out_finish (GsFedoraThirdParty *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + return g_task_propagate_boolean (G_TASK (result), error); +} + +gboolean +gs_fedora_third_party_opt_out_sync (GsFedoraThirdParty *self, + GCancellable *cancellable, + GError **error) +{ + /* fedora-third-party-opt-out is a single-purpose script that changes + * the third-party status from unset => disabled. It exists to allow + * a different pkexec configuration for opting-out and thus avoid + * admin users needing to authenticate to opt-out. + */ + g_autofree gchar *executable = NULL; + const gchar *args[] = { + "pkexec", + "/usr/lib/fedora-third-party/fedora-third-party-opt-out", + NULL + }; + gint wait_status = -1; + + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + + g_mutex_lock (&self->lock); + executable = gs_fedora_third_party_ensure_executable_locked (self, error); + g_mutex_unlock (&self->lock); + + return g_spawn_sync (NULL, (gchar **) args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &wait_status, error) && + g_spawn_check_wait_status (wait_status, error); +} + +static void +gs_fedora_third_party_list_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + g_autoptr(GError) error = NULL; + g_autoptr(GHashTable) repos = NULL; + if (gs_fedora_third_party_list_sync (GS_FEDORA_THIRD_PARTY (source_object), &repos, cancellable, &error)) + g_task_return_pointer (task, g_steal_pointer (&repos), (GDestroyNotify) g_hash_table_unref); + else + g_task_return_error (task, g_steal_pointer (&error)); +} + +void +gs_fedora_third_party_list (GsFedoraThirdParty *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + g_return_if_fail (GS_IS_FEDORA_THIRD_PARTY (self)); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_fedora_third_party_list); + g_task_run_in_thread (task, gs_fedora_third_party_list_thread); +} + +gboolean +gs_fedora_third_party_list_finish (GsFedoraThirdParty *self, + GAsyncResult *result, + GHashTable **out_repos, /* gchar *name ~> gchar *management_plugin */ + GError **error) +{ + g_autoptr(GHashTable) repos = NULL; + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + repos = g_task_propagate_pointer (G_TASK (result), error); + if (repos == NULL) + return FALSE; + if (out_repos) + *out_repos = g_steal_pointer (&repos); + return TRUE; +} + +gboolean +gs_fedora_third_party_list_sync (GsFedoraThirdParty *self, + GHashTable **out_repos, /* gchar *name ~> gchar *management_plugin */ + GCancellable *cancellable, + GError **error) +{ + gboolean success = FALSE; + + g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE); + + g_mutex_lock (&self->lock); + /* Auto-recheck only twice a day */ + if (self->repos == NULL || (g_get_real_time () / G_USEC_PER_SEC) - self->last_update > 12 * 60 * 60) { + g_autofree gchar *executable = NULL; + const gchar *args[] = { + "", /* executable */ + "list", + "--csv", + "--columns=type,name", + NULL + }; + g_autoptr(GHashTable) repos = NULL; + + executable = gs_fedora_third_party_ensure_executable_locked (self, error); + g_mutex_unlock (&self->lock); + + if (executable != NULL) { + gint wait_status = -1; + g_autofree gchar *stdoutput = NULL; + args[0] = executable; + if (g_spawn_sync (NULL, (gchar **) args, NULL, G_SPAWN_DEFAULT, NULL, NULL, &stdoutput, NULL, &wait_status, error) && + g_spawn_check_wait_status (wait_status, error)) { + g_auto(GStrv) lines = NULL; + + repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + lines = g_strsplit (stdoutput != NULL ? stdoutput : "", "\n", -1); + + for (gsize ii = 0; lines != NULL && lines[ii]; ii++) { + g_auto(GStrv) tokens = g_strsplit (lines[ii], ",", 2); + if (tokens != NULL && tokens[0] != NULL && tokens[1] != NULL) { + const gchar *repo_type = tokens[0]; + /* Change the 'dnf' into an expected plugin name */ + if (self->dnf_handler != NULL && + g_str_equal (repo_type, "dnf")) + repo_type = self->dnf_handler; + /* Hash them by name, which cannot clash between types */ + g_hash_table_insert (repos, g_strdup (tokens[1]), g_strdup (repo_type)); + } + } + } + } + + g_mutex_lock (&self->lock); + g_clear_pointer (&self->repos, g_hash_table_unref); + self->repos = g_steal_pointer (&repos); + self->last_update = g_get_real_time () / G_USEC_PER_SEC; + } + success = self->repos != NULL; + if (success && out_repos) + *out_repos = g_hash_table_ref (self->repos); + g_mutex_unlock (&self->lock); + + return success; +} + +gboolean +gs_fedora_third_party_util_is_third_party_repo (GHashTable *third_party_repos, + const gchar *origin, + const gchar *management_plugin) +{ + const gchar *expected_management_plugin; + + if (third_party_repos == NULL || origin == NULL) + return FALSE; + + expected_management_plugin = g_hash_table_lookup (third_party_repos, origin); + if (expected_management_plugin == NULL) + return FALSE; + + return g_strcmp0 (management_plugin, expected_management_plugin) == 0; +} diff --git a/lib/gs-fedora-third-party.h b/lib/gs-fedora-third-party.h new file mode 100644 index 0000000..2a47b09 --- /dev/null +++ b/lib/gs-fedora-third-party.h @@ -0,0 +1,95 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gs-plugin-loader.h" + +G_BEGIN_DECLS + +#define GS_TYPE_FEDORA_THIRD_PARTY (gs_fedora_third_party_get_type ()) + +G_DECLARE_FINAL_TYPE (GsFedoraThirdParty, gs_fedora_third_party, GS, FEDORA_THIRD_PARTY, GObject) + +typedef enum _GsFedoraThirdPartyState { + GS_FEDORA_THIRD_PARTY_STATE_UNKNOWN, + GS_FEDORA_THIRD_PARTY_STATE_ENABLED, + GS_FEDORA_THIRD_PARTY_STATE_DISABLED, + GS_FEDORA_THIRD_PARTY_STATE_ASK +} GsFedoraThirdPartyState; + +GsFedoraThirdParty * + gs_fedora_third_party_new (GsPluginLoader *plugin_loader); +gboolean gs_fedora_third_party_is_available + (GsFedoraThirdParty *self); +void gs_fedora_third_party_invalidate(GsFedoraThirdParty *self); +void gs_fedora_third_party_query (GsFedoraThirdParty *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_fedora_third_party_query_finish + (GsFedoraThirdParty *self, + GAsyncResult *result, + GsFedoraThirdPartyState *out_state, + GError **error); +gboolean gs_fedora_third_party_query_sync(GsFedoraThirdParty *self, + GsFedoraThirdPartyState *out_state, + GCancellable *cancellable, + GError **error); +void gs_fedora_third_party_switch (GsFedoraThirdParty *self, + gboolean enable, + gboolean config_only, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_fedora_third_party_switch_finish + (GsFedoraThirdParty *self, + GAsyncResult *result, + GError **error); +gboolean gs_fedora_third_party_switch_sync + (GsFedoraThirdParty *self, + gboolean enable, + gboolean config_only, + GCancellable *cancellable, + GError **error); +void gs_fedora_third_party_opt_out (GsFedoraThirdParty *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_fedora_third_party_opt_out_finish + (GsFedoraThirdParty *self, + GAsyncResult *result, + GError **error); +gboolean gs_fedora_third_party_opt_out_sync + (GsFedoraThirdParty *self, + GCancellable *cancellable, + GError **error); +void gs_fedora_third_party_list (GsFedoraThirdParty *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_fedora_third_party_list_finish + (GsFedoraThirdParty *self, + GAsyncResult *result, + GHashTable **out_repos, + GError **error); +gboolean gs_fedora_third_party_list_sync (GsFedoraThirdParty *self, + GHashTable **out_repos, + GCancellable *cancellable, + GError **error); + +/* Utility functions */ +gboolean gs_fedora_third_party_util_is_third_party_repo + (GHashTable *third_party_repos, + const gchar *origin, + const gchar *management_plugin); + +G_END_DECLS diff --git a/lib/gs-icon-downloader.c b/lib/gs-icon-downloader.c new file mode 100644 index 0000000..48c5dca --- /dev/null +++ b/lib/gs-icon-downloader.c @@ -0,0 +1,397 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2023 Endless OS Foundation LLC + * + * Authors: + * - Georges Basile Stavracas Neto + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-icon-downloader + * @title: Icon downloader + * @include: gnome-software.h + * @stability: Unstable + * @short_description: Utility object to download remote icons + * + * #GsIconDownloader is a helper object that is responsible for downloading + * remote icons of #GsApp instances. Plugins can put apps in the queue to + * download using gs_icon_downloader_queue_app(). The actual download may + * happen at any arbitrary time in the future. + * + * Since: 44 + */ + +#include "gs-icon-downloader.h" + +#include "gs-app-private.h" +#include "gs-remote-icon.h" +#include "gs-worker-thread.h" + +struct _GsIconDownloader +{ + GObject parent_instance; + + guint scale; + guint maximum_size_px; + SoupSession *soup_session; /* (owned) */ + + GsWorkerThread *worker; /* (owned) */ + GCancellable *cancellable; /* (owned) */ +}; + +G_DEFINE_FINAL_TYPE (GsIconDownloader, gs_icon_downloader, G_TYPE_OBJECT) + +typedef enum { + PROP_MAXIMUM_SIZE = 1, + PROP_SCALE, + PROP_SOUP_SESSION, +} GsIconDownloaderProperty; + +static GParamSpec *properties [PROP_SOUP_SESSION + 1] = { NULL, }; + +static void +gs_icon_downloader_finalize (GObject *object) +{ + GsIconDownloader *self = (GsIconDownloader *)object; + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + g_clear_object (&self->worker); + g_clear_object (&self->soup_session); + + G_OBJECT_CLASS (gs_icon_downloader_parent_class)->finalize (object); +} + +static void +gs_icon_downloader_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsIconDownloader *self = GS_ICON_DOWNLOADER (object); + + switch ((GsIconDownloaderProperty) prop_id) { + case PROP_MAXIMUM_SIZE: + g_value_set_uint (value, self->maximum_size_px); + break; + case PROP_SCALE: + g_value_set_uint (value, self->scale); + break; + case PROP_SOUP_SESSION: + g_value_set_object (value, self->soup_session); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gs_icon_downloader_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsIconDownloader *self = GS_ICON_DOWNLOADER (object); + + switch ((GsIconDownloaderProperty) prop_id) { + case PROP_MAXIMUM_SIZE: + g_assert (self->maximum_size_px == 0); + self->maximum_size_px = g_value_get_uint (value); + g_assert (self->maximum_size_px != 0); + break; + case PROP_SCALE: + self->scale = g_value_get_uint (value); + break; + case PROP_SOUP_SESSION: + g_assert (self->soup_session == NULL); + self->soup_session = g_value_dup_object (value); + g_assert (self->soup_session != NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gs_icon_downloader_class_init (GsIconDownloaderClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gs_icon_downloader_finalize; + object_class->get_property = gs_icon_downloader_get_property; + object_class->set_property = gs_icon_downloader_set_property; + + /** + * GsIconDownloader:maximum-size: + * + * The maximum size of the icon, in pixels. + * + * Since: 44 + */ + properties[PROP_MAXIMUM_SIZE] = + g_param_spec_uint ("maximum-size", NULL, NULL, + 0, G_MAXUINT, 0, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + /** + * GsIconDownloader:soup-session: + * + * The #SoupSession to use to download remote icons. + * + * Since: 44 + */ + properties[PROP_SOUP_SESSION] = + g_param_spec_object ("soup-session", NULL, NULL, + SOUP_TYPE_SESSION, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + /** + * GsIconDownloader:scale: + * + * The window scale factor. It will be applied on the maximum-size. + * + * Since: 48 + */ + properties[PROP_SCALE] = + g_param_spec_uint ("scale", NULL, NULL, + 1, G_MAXUINT, 1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (properties), properties); +} + +static void +gs_icon_downloader_init (GsIconDownloader *self) +{ + self->scale = 1; + self->worker = gs_worker_thread_new ("gs-icon-downloader"); +} + +/** + * gs_icon_downloader_new: + * @soup_session: a #SoupSession + * @maximum_size_px: the maximum size of the icons, in pixels + * + * Creates a new #GsIconDownloader. + * + * Since: 44 + */ +GsIconDownloader * +gs_icon_downloader_new (SoupSession *soup_session, + guint maximum_size_px) +{ + return g_object_new (GS_TYPE_ICON_DOWNLOADER, + "soup-session", soup_session, + "maximum-size", maximum_size_px, + NULL); +} + + +static void download_remote_icons_of_the_app_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void app_remote_icons_download_finished (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/** + * gs_icon_downloader_queue_app: + * @self: a #GsIconDownloader + * @app: (transfer none): a #GsApp + * @interactive: whether this icon download was triggered by user action + * + * Puts @app in the queue to download icons. + * + * Since: 44 + */ +void +gs_icon_downloader_queue_app (GsIconDownloader *self, + GsApp *app, + gboolean interactive) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GPtrArray) icons = NULL; + gboolean has_remote_icon = FALSE; + + g_return_if_fail (GS_IS_ICON_DOWNLOADER (self)); + g_return_if_fail (GS_IS_APP (app)); + + icons = gs_app_dup_icons (app); + + for (guint j = 0; icons && j < icons->len; j++) { + has_remote_icon |= GS_IS_REMOTE_ICON (g_ptr_array_index (icons, j)); + if (has_remote_icon) + break; + } + + /* Nothing to download */ + if (!has_remote_icon) { + gs_app_set_icons_state (app, GS_APP_ICONS_STATE_AVAILABLE); + return; + } + + gs_app_set_icons_state (app, GS_APP_ICONS_STATE_PENDING_DOWNLOAD); + + task = g_task_new (self, self->cancellable, app_remote_icons_download_finished, NULL); + g_task_set_task_data (task, g_object_ref (app), g_object_unref); + g_task_set_source_tag (task, gs_icon_downloader_queue_app); + + gs_worker_thread_queue (self->worker, interactive ? G_PRIORITY_DEFAULT : G_PRIORITY_LOW, + download_remote_icons_of_the_app_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +download_remote_icons_of_the_app_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsIconDownloader *self = GS_ICON_DOWNLOADER (source_object); + g_autoptr(GPtrArray) remote_icons = NULL; + g_autoptr(GPtrArray) icons = NULL; + GsApp *app; + + g_assert (gs_worker_thread_is_in_worker_context (self->worker)); + + app = GS_APP (task_data); + icons = gs_app_dup_icons (app); + remote_icons = g_ptr_array_new_full (icons ? icons->len : 0, g_object_unref); + + for (guint j = 0; icons && j < icons->len; j++) { + GObject *icon = g_ptr_array_index (icons, j); + + if (GS_IS_REMOTE_ICON (icon)) + g_ptr_array_add (remote_icons, g_object_ref (icon)); + } + + g_assert (remote_icons->len > 0); + + g_debug ("Downloading %u icons for app %s", remote_icons->len, gs_app_get_id (app)); + + gs_app_set_icons_state (app, GS_APP_ICONS_STATE_DOWNLOADING); + + for (guint j = 0; j < remote_icons->len; j++) { + GObject *icon = g_ptr_array_index (remote_icons, j); + g_autoptr(GError) local_error = NULL; + + gs_remote_icon_ensure_cached (GS_REMOTE_ICON (icon), + self->soup_session, + self->maximum_size_px, + self->scale, + cancellable, + &local_error); + + if (local_error) + g_debug ("Error downloading remote icon: %s", local_error->message); + + if (g_task_return_error_if_cancelled (task)) { + gs_app_set_icons_state (app, GS_APP_ICONS_STATE_AVAILABLE); + return; + } + } + + gs_app_set_icons_state (app, GS_APP_ICONS_STATE_AVAILABLE); + + g_task_return_boolean (task, TRUE); +} + +static void +app_remote_icons_download_finished (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GError) error = NULL; + + g_assert (g_task_is_valid (result, source_object)); + + if (!g_task_propagate_boolean (G_TASK (result), &error) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Failed to download icons of one app: %s", error->message); +} + +static void shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/** + * gs_icon_downloader_shutdown_async: + * @self: a #GsIconDownloader + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: callback for once the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Shut down the icon downloader. + * + * This will shut down the internal worker thread that @self uses to + * queue app downloads. + * + * This is a no-op if called subsequently. + * + * Since: 44 + */ +void +gs_icon_downloader_shutdown_async (GsIconDownloader *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + g_return_if_fail (GS_IS_ICON_DOWNLOADER (self)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_icon_downloader_shutdown_async); + + gs_worker_thread_shutdown_async (self->worker, cancellable, shutdown_cb, + g_steal_pointer (&task)); +} + +static void +shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + GsIconDownloader *self = g_task_get_source_object (user_data); + g_autoptr(GError) local_error = NULL; + gboolean success; + + success = gs_worker_thread_shutdown_finish (self->worker, result, &local_error); + + if (local_error) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, success); +} + +/** + * gs_icon_downloader_shutdown_finish: + * @self: a #GsIconDownloader + * @result: a #GAsyncResult + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous shutdown operation started with + * gs_icon_downloader_shutdown_async(); + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 44 + */ +gboolean +gs_icon_downloader_shutdown_finish (GsIconDownloader *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_ICON_DOWNLOADER (self), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_icon_downloader_shutdown_async), FALSE); + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} diff --git a/lib/gs-icon-downloader.h b/lib/gs-icon-downloader.h new file mode 100644 index 0000000..f368c2e --- /dev/null +++ b/lib/gs-icon-downloader.h @@ -0,0 +1,43 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2023 Endless OS Foundation LLC + * + * Authors: + * - Georges Basile Stavracas Neto + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include + +#include "gs-app.h" + +G_BEGIN_DECLS + +#define GS_TYPE_ICON_DOWNLOADER (gs_icon_downloader_get_type ()) + +G_DECLARE_FINAL_TYPE (GsIconDownloader, gs_icon_downloader, GS, ICON_DOWNLOADER, GObject) + +GsIconDownloader *gs_icon_downloader_new (SoupSession *soup_session, + guint maximum_size); + +void gs_icon_downloader_queue_app (GsIconDownloader *self, + GsApp *app, + gboolean interactive); + +void gs_icon_downloader_shutdown_async (GsIconDownloader *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gs_icon_downloader_shutdown_finish (GsIconDownloader *self, + GAsyncResult *result, + GError **error); + +G_END_DECLS diff --git a/lib/gs-icon.c b/lib/gs-icon.c new file mode 100644 index 0000000..5d7f4a4 --- /dev/null +++ b/lib/gs-icon.c @@ -0,0 +1,315 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation, Inc + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-icon + * @short_description: Utilities for handling #GIcons + * + * This file provides several utilities for creating and handling #GIcon + * instances. #GIcon is used for representing icon sources throughout + * gnome-software, as it has low memory overheads, and allows the most + * appropriate icon data to be loaded when it’s needed to be used in a UI. + * + * gnome-software uses various classes which implement #GIcon, mostly the + * built-in ones provided by GIO, but also #GsRemoteIcon. All of them are tagged + * with `width` and `height` metadata (when that data was available at + * construction time). See gs_icon_get_width(). + * + * Since: 40 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-icon.h" +#include "gs-remote-icon.h" + +/** + * gs_icon_get_width: + * @icon: a #GIcon + * + * Get the width of an icon, if it was attached as metadata when the #GIcon was + * created from an #AsIcon. + * + * Returns: width of the icon (in device pixels), or `0` if unknown + * Since: 40 + */ +guint +gs_icon_get_width (GIcon *icon) +{ + g_return_val_if_fail (G_IS_ICON (icon), 0); + + return GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (icon), "width")); +} + +/** + * gs_icon_set_width: + * @icon: a #GIcon + * @width: width of the icon, in device pixels + * + * Set the width of an icon. See gs_icon_get_width(). + * + * Since: 40 + */ +void +gs_icon_set_width (GIcon *icon, + guint width) +{ + g_return_if_fail (G_IS_ICON (icon)); + + g_object_set_data (G_OBJECT (icon), "width", GUINT_TO_POINTER (width)); +} + +/** + * gs_icon_get_height: + * @icon: a #GIcon + * + * Get the height of an icon, if it was attached as metadata when the #GIcon was + * created from an #AsIcon. + * + * Returns: height of the icon (in device pixels), or `0` if unknown + * Since: 40 + */ +guint +gs_icon_get_height (GIcon *icon) +{ + g_return_val_if_fail (G_IS_ICON (icon), 0); + + return GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (icon), "height")); +} + +/** + * gs_icon_set_height: + * @icon: a #GIcon + * @height: height of the icon, in device pixels + * + * Set the height of an icon. See gs_icon_get_height(). + * + * Since: 40 + */ +void +gs_icon_set_height (GIcon *icon, + guint height) +{ + g_return_if_fail (G_IS_ICON (icon)); + + g_object_set_data (G_OBJECT (icon), "height", GUINT_TO_POINTER (height)); +} + +/** + * gs_icon_get_scale: + * @icon: a #GIcon + * + * Get the scale of an icon, if it was attached as metadata when the #GIcon was + * created from an #AsIcon. + * + * See gtk_widget_get_scale_factor() for more information about scales. + * + * Returns: scale of the icon, or `1` if unknown; guaranteed to always be + * greater than or equal to 1 + * Since: 40 + */ +guint +gs_icon_get_scale (GIcon *icon) +{ + g_return_val_if_fail (G_IS_ICON (icon), 0); + + return MAX (1, GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (icon), "scale"))); +} + +/** + * gs_icon_set_scale: + * @icon: a #GIcon + * @scale: scale of the icon, which must be greater than or equal to 1 + * + * Set the scale of an icon. See gs_icon_get_scale(). + * + * Since: 40 + */ +void +gs_icon_set_scale (GIcon *icon, + guint scale) +{ + g_return_if_fail (G_IS_ICON (icon)); + g_return_if_fail (scale >= 1); + + g_object_set_data (G_OBJECT (icon), "scale", GUINT_TO_POINTER (scale)); +} + +static GIcon * +gs_icon_load_local (AsIcon *icon) +{ + const gchar *filename = as_icon_get_filename (icon); + g_autoptr(GFile) file = NULL; + + if (filename == NULL) + return NULL; + + file = g_file_new_for_path (filename); + return g_file_icon_new (file); +} + +static GIcon * +gs_icon_load_stock (AsIcon *icon) +{ + const gchar *name = as_icon_get_name (icon); + + if (name == NULL) + return NULL; + + return g_themed_icon_new (name); +} + +static GIcon * +gs_icon_load_remote (AsIcon *icon) +{ + const gchar *url = as_icon_get_url (icon); + + if (url == NULL) + return NULL; + + /* Load local files directly. */ + if (g_str_has_prefix (url, "file:")) { + g_autoptr(GFile) file = g_file_new_for_path (url + strlen ("file:")); + return g_file_icon_new (file); + } + + /* Only HTTP and HTTPS are supported. */ + if (!g_str_has_prefix (url, "http:") && + !g_str_has_prefix (url, "https:")) + return NULL; + + return gs_remote_icon_new (url); +} + +static GIcon * +gs_icon_load_cached (AsIcon *icon) +{ + const gchar *filename = as_icon_get_filename (icon); + const gchar *name = as_icon_get_name (icon); + g_autofree gchar *name_allocated = NULL; + g_autofree gchar *full_filename = NULL; + g_autoptr(GFile) file = NULL; + + if (filename == NULL || name == NULL) + return NULL; + + /* FIXME: Work around https://github.com/hughsie/appstream-glib/pull/390 + * where appstream files generated with appstream-builder from + * appstream-glib, with its hidpi option enabled, will contain an + * unnecessary size subdirectory in the icon name. */ + if (g_str_has_prefix (name, "64x64/")) + name = name_allocated = g_strdup (name + strlen ("64x64/")); + else if (g_str_has_prefix (name, "128x128/")) + name = name_allocated = g_strdup (name + strlen ("128x128/")); + + if (!g_str_has_suffix (filename, name)) { + /* Spec: https://www.freedesktop.org/software/appstream/docs/sect-AppStream-IconCache.html#spec-iconcache-location */ + if (as_icon_get_scale (icon) <= 1) { + full_filename = g_strdup_printf ("%s/%ux%u/%s", + filename, + as_icon_get_width (icon), + as_icon_get_height (icon), + name); + } else { + full_filename = g_strdup_printf ("%s/%ux%u@%u/%s", + filename, + as_icon_get_width (icon), + as_icon_get_height (icon), + as_icon_get_scale (icon), + name); + } + + filename = full_filename; + } + + file = g_file_new_for_path (filename); + return g_file_icon_new (file); +} + +/** + * gs_icon_new_for_appstream_icon: + * @appstream_icon: an #AsIcon + * + * Create a new #GIcon representing the given #AsIcon. The actual type of the + * returned icon will vary depending on the #AsIconKind of @appstream_icon. + * + * If the width or height of the icon are set on the #AsIcon, they are stored + * as the `width` and `height` data associated with the returned object, using + * g_object_set_data(). + * + * This can fail (and return %NULL) if the @appstream_icon has invalid or + * missing properties. + * + * Returns: (transfer full) (nullable): the #GIcon, or %NULL + * Since: 40 + */ +GIcon * +gs_icon_new_for_appstream_icon (AsIcon *appstream_icon) +{ + g_autoptr(GIcon) icon = NULL; + + g_return_val_if_fail (AS_IS_ICON (appstream_icon), NULL); + + switch (as_icon_get_kind (appstream_icon)) { + case AS_ICON_KIND_LOCAL: + icon = gs_icon_load_local (appstream_icon); + break; + case AS_ICON_KIND_STOCK: + icon = gs_icon_load_stock (appstream_icon); + break; + case AS_ICON_KIND_REMOTE: + icon = gs_icon_load_remote (appstream_icon); + break; + case AS_ICON_KIND_CACHED: + icon = gs_icon_load_cached (appstream_icon); + break; + default: + g_assert_not_reached (); + } + + if (icon == NULL) { + g_debug ("Error creating GIcon for AsIcon of kind %s", + as_icon_kind_to_string (as_icon_get_kind (appstream_icon))); + return NULL; + } + + /* Store the width, height and scale as associated metadata (if + * available) so that #GsApp can sort icons by size and return the most + * appropriately sized one in gs_app_get_icon_by_size(). + * + * FIXME: Ideally we’d store these as properties on the objects, but + * GIO currently doesn’t allow subclassing of its #GIcon classes. If we + * were to implement a #GLoadableIcon with these as properties, all the + * fast paths in GTK for loading icon data (particularly named icons) + * would be ignored. + * + * Storing the width and height as associated metadata means GObject + * creates a hash table for each GIcon object. This is a waste of memory + * (compared to using properties), but seems like the least-worst + * option. + * + * See https://gitlab.gnome.org/GNOME/glib/-/issues/2345 + */ + if (as_icon_get_width (appstream_icon) != 0 || as_icon_get_height (appstream_icon) != 0) { + gs_icon_set_width (icon, as_icon_get_width (appstream_icon)); + gs_icon_set_height (icon, as_icon_get_height (appstream_icon)); + } + if (as_icon_get_scale (appstream_icon) != 0) + gs_icon_set_scale (icon, as_icon_get_scale (appstream_icon)); + + return g_steal_pointer (&icon); +} diff --git a/lib/gs-icon.h b/lib/gs-icon.h new file mode 100644 index 0000000..32aa583 --- /dev/null +++ b/lib/gs-icon.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation, Inc + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +guint gs_icon_get_width (GIcon *icon); +void gs_icon_set_width (GIcon *icon, + guint width); +guint gs_icon_get_height (GIcon *icon); +void gs_icon_set_height (GIcon *icon, + guint height); +guint gs_icon_get_scale (GIcon *icon); +void gs_icon_set_scale (GIcon *icon, + guint scale); + +GIcon *gs_icon_new_for_appstream_icon (AsIcon *appstream_icon); + +G_END_DECLS diff --git a/lib/gs-ioprio.c b/lib/gs-ioprio.c new file mode 100644 index 0000000..3a63d07 --- /dev/null +++ b/lib/gs-ioprio.c @@ -0,0 +1,197 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2005, Novell, Inc. + * Copyright (C) 2006, Jamie McCracken + * Copyright (C) 2006, Anders Aagaard + * + * Based mostly on code by Robert Love + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#ifdef __linux__ + +#include +#include + +#ifdef HAVE_LINUX_UNISTD_H +#include +#endif + +#include +#include + +#include + +#endif /* __linux__ */ + +#include "gs-ioprio.h" + +/* We assume ALL linux architectures have the syscalls defined here */ +#ifdef __linux__ + +/* Make sure the system call is supported */ +#ifndef __NR_ioprio_set + +#if defined(__i386__) +#define __NR_ioprio_set 289 +#define __NR_ioprio_get 290 +#elif defined(__powerpc__) || defined(__powerpc64__) +#define __NR_ioprio_set 273 +#define __NR_ioprio_get 274 +#elif defined(__x86_64__) +#define __NR_ioprio_set 251 +#define __NR_ioprio_get 252 +#elif defined(__ia64__) +#define __NR_ioprio_set 1274 +#define __NR_ioprio_get 1275 +#elif defined(__alpha__) +#define __NR_ioprio_set 442 +#define __NR_ioprio_get 443 +#elif defined(__s390x__) || defined(__s390__) +#define __NR_ioprio_set 282 +#define __NR_ioprio_get 283 +#elif defined(__SH4__) +#define __NR_ioprio_set 288 +#define __NR_ioprio_get 289 +#elif defined(__SH5__) +#define __NR_ioprio_set 316 +#define __NR_ioprio_get 317 +#elif defined(__sparc__) || defined(__sparc64__) +#define __NR_ioprio_set 196 +#define __NR_ioprio_get 218 +#elif defined(__arm__) +#define __NR_ioprio_set 314 +#define __NR_ioprio_get 315 +#else +#error "Unsupported architecture!" +#endif + +#endif /* __NR_ioprio_set */ + +enum { + IOPRIO_CLASS_NONE, + IOPRIO_CLASS_RT, + IOPRIO_CLASS_BE, + IOPRIO_CLASS_IDLE, +}; + +enum { + IOPRIO_WHO_PROCESS = 1, + IOPRIO_WHO_PGRP, + IOPRIO_WHO_USER, +}; + +#define IOPRIO_CLASS_SHIFT 13 + +static inline int +ioprio_set (int which, int who, int ioprio_val) +{ + return syscall (__NR_ioprio_set, which, who, ioprio_val); +} + +static int +set_io_priority (int ioprio, + int ioclass) +{ + return ioprio_set (IOPRIO_WHO_PROCESS, 0, ioprio | (ioclass << IOPRIO_CLASS_SHIFT)); +} + +static const gchar * +ioclass_to_string (int ioclass) +{ + switch (ioclass) { + case IOPRIO_CLASS_IDLE: + return "IDLE"; + case IOPRIO_CLASS_BE: + return "BE"; + default: + return "unknown"; + } +} + +/** + * gs_ioprio_set: + * @priority: I/O priority, with higher numeric values indicating lower priority; + * use %G_PRIORITY_DEFAULT as the default + * + * Set the I/O priority of the current thread using the `ioprio_set()` syscall. + * + * The @priority is quantised before being passed to the kernel. + * + * This function may fail if the process doesn’t have permission to change its + * I/O priority to the given value. If so, a warning will be printed, as the + * quantised priority values are chosen so they shouldn’t typically require + * permissions to set. + */ +void +gs_ioprio_set (gint priority) +{ + int ioprio, ioclass; + + /* If the priority is lower than default, use an idle I/O priority. The + * condition looks wrong because higher integers indicate lower priority + * in GLib. + * + * Otherwise use a default best-effort priority, which is the same as + * what all new threads get (in the absence of an I/O context with + * `CLONE_IO`). */ + if (priority > G_PRIORITY_DEFAULT) { + ioprio = 7; + ioclass = IOPRIO_CLASS_IDLE; + } else if (priority == G_PRIORITY_DEFAULT) { + ioprio = 4; /* this is the default priority in the BE class */ + ioclass = IOPRIO_CLASS_BE; + } else { + ioprio = 0; /* this is the highest priority in the BE class */ + ioclass = IOPRIO_CLASS_BE; + } + + g_debug ("Setting I/O priority of thread %p to %s, %d", + g_thread_self (), ioclass_to_string (ioclass), ioprio); + + if (set_io_priority (ioprio, ioclass) == -1) { + g_warning ("Could not set I/O priority to %s, %d", + ioclass_to_string (ioclass), ioprio); + + /* If we were trying to set to idle priority, try again with the + * lowest-possible best-effort priority. This is because kernels + * older than 2.6.25 required `CAP_SYS_ADMIN` to set + * `IOPRIO_CLASS_IDLE`. Newer kernels do not. */ + if (ioclass == IOPRIO_CLASS_IDLE) { + ioprio = 7; /* this is the lowest priority in the BE class */ + ioclass = IOPRIO_CLASS_BE; + + if (set_io_priority (ioprio, ioclass) == -1) + g_warning ("Could not set best effort IO priority either, giving up"); + } + } +} + +#else /* __linux__ */ + +void +gs_ioprio_set (gint priority) +{ +} + +#endif /* __linux__ */ diff --git a/lib/gs-ioprio.h b/lib/gs-ioprio.h new file mode 100644 index 0000000..e630b8a --- /dev/null +++ b/lib/gs-ioprio.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2006, Anders Aagaard + * Copyright (C) 2008, Nokia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +void gs_ioprio_set (gint priority); + +G_END_DECLS diff --git a/lib/gs-job-manager.c b/lib/gs-job-manager.c new file mode 100644 index 0000000..324572b --- /dev/null +++ b/lib/gs-job-manager.c @@ -0,0 +1,724 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022, 2023 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-job-manager + * @short_description: A manager to track ongoing #GsPluginJobs + * + * #GsJobManager tracks ongoing #GsPluginJobs and the #GsApps they are + * affecting. + * + * This makes it possible to track all the jobs ongoing in gnome-software, or + * in a particular backend, or for a particular app at any time. + * + * ‘Watches’ can be added to the job manager, which cause callbacks to be + * invoked when jobs are added or removed which match certain criteria, such as + * being a certain type of job or referring to a certain application. See + * gs_job_manager_add_watch() and gs_job_manager_remove_watch(). + * + * #GsJobManager is safe to use from any thread. + * + * See also: #GsPluginJob + * Since: 44 + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-install-apps.h" +#include "gs-plugin-job-uninstall-apps.h" +#include "gs-plugin-job-update-apps.h" +#include "gs-plugin-types.h" +#include "gs-utils.h" + +/* Data for a single watch, added using gs_job_manager_add_watch(). + * + * This structure is immutable after creation* which means it can be safely + * accessed from multiple threads. It might be accessed from multiple threads + * if operations happen on the #GsJobManager from one thread, but require the + * @added_handler/@removed_handler callbacks to be called in another thread. + * They, plus @user_data_free_func, are always called in the thread running + * @callback_context. + * + * * @user_data and @user_data_free_func may actually be temporarily cleared + * by watch_data_unref() while the structure is temporarily resurrected to pass + * to watch_free_data_cb(). That doesn’t affect the normal operation of the + * struct, though, which is immutable. + */ +typedef struct { + gint ref_count; /* (atomic) */ + + guint watch_id; + + gchar *match_app_unique_id; /* (nullable) */ + GType match_job_type; + + GsJobManagerJobCallback added_handler; + GsJobManagerJobCallback removed_handler; + gpointer user_data; + GDestroyNotify user_data_free_func; + GMainContext *callback_context; /* (owned) */ +} WatchData; + +static WatchData * +watch_data_ref (WatchData *data) +{ + gint old_value = g_atomic_int_add (&data->ref_count, 1); + g_assert (old_value > 0); + return data; +} + +static gboolean watch_free_data_cb (gpointer user_data); + +static void +watch_data_unref (WatchData *data) +{ + if (g_atomic_int_dec_and_test (&data->ref_count)) { + if (data->user_data_free_func != NULL) { + g_autoptr(GSource) idle_source = NULL; + GMainContext *callback_context = data->callback_context; + + /* Temporarily resurrect @data so it can be used as the + * closure for watch_free_data_cb(), so that the + * user_data is freed in the right thread. */ + g_atomic_int_inc (&data->ref_count); + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + watch_free_data_cb, + g_steal_pointer (&data), + (GDestroyNotify) watch_data_unref); + g_source_set_static_name (idle_source, G_STRFUNC); + g_source_attach (idle_source, callback_context); + + /* Freeing will eventually happen in watch_free_data_cb(). */ + return; + } + + g_free (data->match_app_unique_id); + g_main_context_unref (data->callback_context); + g_free (data); + } +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (WatchData, watch_data_unref) + +static gboolean +watch_free_data_cb (gpointer user_data) +{ + WatchData *data = user_data; + + /* We must hold the last reference to @data, and this callback must be + * executed in the right thread. */ + g_assert (g_atomic_int_get (&data->ref_count) == 1); + g_assert (data->user_data_free_func != NULL); + g_assert (g_main_context_is_owner (data->callback_context)); + + data->user_data_free_func (g_steal_pointer (&data->user_data)); + data->user_data_free_func = NULL; + + /* The callback must not somehow re-reference @data. */ + g_assert (g_atomic_int_get (&data->ref_count) == 1); + + /* Removing the source will drop the last ref on @data */ + return G_SOURCE_REMOVE; +} + +static gboolean +job_contains_app_by_unique_id (GsPluginJob *job, + const gchar *app_unique_id) +{ + GsAppList *apps = NULL; + + /* FIXME: This could be improved in future by making GsPluginJob subclasses + * implement an interface to query which apps they are acting on. */ + if (GS_IS_PLUGIN_JOB_UPDATE_APPS (job)) + apps = gs_plugin_job_update_apps_get_apps (GS_PLUGIN_JOB_UPDATE_APPS (job)); + else if (GS_IS_PLUGIN_JOB_INSTALL_APPS (job)) + apps = gs_plugin_job_install_apps_get_apps (GS_PLUGIN_JOB_INSTALL_APPS (job)); + else if (GS_IS_PLUGIN_JOB_UNINSTALL_APPS (job)) + apps = gs_plugin_job_uninstall_apps_get_apps (GS_PLUGIN_JOB_UNINSTALL_APPS (job)); + + if (apps == NULL) + return FALSE; + + return (gs_app_list_lookup (apps, app_unique_id) != NULL); +} + +static gboolean +watch_data_matches (const WatchData *data, + GsPluginJob *job) +{ + if (data->match_job_type != G_TYPE_INVALID && + data->match_job_type != G_OBJECT_TYPE (job)) + return FALSE; + + if (data->match_app_unique_id != NULL && + !job_contains_app_by_unique_id (job, data->match_app_unique_id)) + return FALSE; + + return TRUE; +} + +/* Data relating to a single invocation of a #GsJobManagerJobCallback, either + * an @added_handler or a @removed_handler. + * + * This is essentially a closure to pass the callback data from the thread where + * the job is being added/removed to the thread where the callback is invoked. + * + * This structure is immutable after creation, so is inherently thread-safe. + */ +typedef struct { + GsJobManager *job_manager; /* (owned) (not nullable) */ + WatchData *watch_data; /* (owned) (not nullable) */ + enum { + WATCH_CALL_ADDED, + WATCH_CALL_REMOVED, + } call_type; + GsPluginJob *job; /* (owned) (not nullable) */ +} WatchCallHandlerData; + +static void +watch_call_handler_data_free (WatchCallHandlerData *data) +{ + g_clear_object (&data->job); + g_clear_pointer (&data->watch_data, watch_data_unref); + g_clear_object (&data->job_manager); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (WatchCallHandlerData, watch_call_handler_data_free) + +static gboolean +watch_call_handler_cb (gpointer user_data) +{ + WatchCallHandlerData *data = user_data; + GsJobManagerJobCallback handler; + + /* Must be executed in the right thread. */ + g_assert (g_main_context_is_owner (data->watch_data->callback_context)); + + switch (data->call_type) { + case WATCH_CALL_ADDED: + handler = data->watch_data->added_handler; + break; + case WATCH_CALL_REMOVED: + handler = data->watch_data->removed_handler; + break; + default: + g_assert_not_reached (); + } + + handler (data->job_manager, data->job, data->watch_data->user_data); + + return G_SOURCE_REMOVE; +} + +struct _GsJobManager +{ + GObject parent; + + GMutex mutex; + + GPtrArray *jobs; /* (owned) (element-type GsPluginJob) (not nullable), protected by @mutex */ + + GPtrArray *watches; /* (owned) (element-type WatchData) (not nullable), protected by @mutex */ + guint next_watch_id; /* protected by @mutex */ + + GCond shutdown_cond; + gboolean shut_down; /* set to TRUE when being shut down */ +}; + +G_DEFINE_TYPE (GsJobManager, gs_job_manager, G_TYPE_OBJECT) + +static void +gs_job_manager_dispose (GObject *object) +{ + GsJobManager *self = GS_JOB_MANAGER (object); + + /* All jobs should have completed or been cancelled by now. */ + g_assert (self->jobs->len == 0); + + /* All watches should have been removed by now. */ + g_assert (self->watches->len == 0); + + G_OBJECT_CLASS (gs_job_manager_parent_class)->dispose (object); +} + +static void +gs_job_manager_finalize (GObject *object) +{ + GsJobManager *self = GS_JOB_MANAGER (object); + + g_clear_pointer (&self->jobs, g_ptr_array_unref); + g_clear_pointer (&self->watches, g_ptr_array_unref); + g_cond_clear (&self->shutdown_cond); + g_mutex_clear (&self->mutex); + + G_OBJECT_CLASS (gs_job_manager_parent_class)->finalize (object); +} + +static void +gs_job_manager_class_init (GsJobManagerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = gs_job_manager_dispose; + object_class->finalize = gs_job_manager_finalize; +} + +static void +gs_job_manager_init (GsJobManager *self) +{ + g_mutex_init (&self->mutex); + g_cond_init (&self->shutdown_cond); + self->jobs = g_ptr_array_new_with_free_func (g_object_unref); + self->watches = g_ptr_array_new_with_free_func ((GDestroyNotify) watch_data_unref); + self->next_watch_id = 1; +} + +/** + * gs_job_manager_new: + * + * Create a new #GsJobManager for tracking pending jobs. + * + * Returns: (transfer full): a new #GsJobManager + * Since: 44 + */ +GsJobManager * +gs_job_manager_new (void) +{ + return g_object_new (GS_TYPE_JOB_MANAGER, NULL); +} + +static void +job_completed_cb (GsPluginJob *job, + gpointer user_data) +{ + GsJobManager *self = GS_JOB_MANAGER (user_data); + + gs_job_manager_remove_job (self, job); +} + +/** + * gs_job_manager_add_job: + * @self: a #GsJobManager + * @job: a #GsPluginJob to add + * + * Add @job to the set of jobs tracked by the #GsJobManager. + * + * If @job is already tracked by the job manager, this function is a no-op. + * + * Returns: %TRUE if @job was added to the manager, %FALSE if it was already + * tracked + * Since: 44 + */ +gboolean +gs_job_manager_add_job (GsJobManager *self, + GsPluginJob *job) +{ + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_JOB_MANAGER (self), FALSE); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (job), FALSE); + + locker = g_mutex_locker_new (&self->mutex); + + if (g_ptr_array_find (self->jobs, job, NULL)) + return FALSE; + + g_ptr_array_add (self->jobs, g_object_ref (job)); + g_signal_connect (job, "completed", G_CALLBACK (job_completed_cb), self); + + /* Dispatch watches for this job. */ + for (guint i = 0; i < self->watches->len; i++) { + WatchData *data = g_ptr_array_index (self->watches, i); + + if (data->added_handler != NULL && + watch_data_matches (data, job)) { + g_autoptr(WatchCallHandlerData) idle_data = NULL; + g_autoptr(GSource) idle_source = NULL; + + idle_data = g_new0 (WatchCallHandlerData, 1); + idle_data->job_manager = g_object_ref (self); + idle_data->watch_data = watch_data_ref (data); + idle_data->call_type = WATCH_CALL_ADDED; + idle_data->job = g_object_ref (job); + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + watch_call_handler_cb, + g_steal_pointer (&idle_data), + (GDestroyNotify) watch_call_handler_data_free); + g_source_set_static_name (idle_source, G_STRFUNC); + g_source_attach (idle_source, data->callback_context); + } + } + + if (self->shut_down) { + g_debug ("Adding job '%s' while being shut down", G_OBJECT_TYPE_NAME (job)); + g_cond_broadcast (&self->shutdown_cond); + } + + return TRUE; +} + +/** + * gs_job_manager_remove_job: + * @self: a #GsJobManager + * @job: a #GsPluginJob to remove + * + * Remove @job from the set of jobs tracked by the #GsJobManager. + * + * If @job is not already tracked by the job manager, this function is a no-op. + * + * Returns: %TRUE if @job was removed from the manager, %FALSE if it was not + * already tracked + * Since: 44 + */ +gboolean +gs_job_manager_remove_job (GsJobManager *self, + GsPluginJob *job) +{ + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_JOB_MANAGER (self), FALSE); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (job), FALSE); + + locker = g_mutex_locker_new (&self->mutex); + + if (!g_ptr_array_remove_fast (self->jobs, job)) + return FALSE; + + /* Dispatch watches for this job. */ + for (guint i = 0; i < self->watches->len; i++) { + WatchData *data = g_ptr_array_index (self->watches, i); + + if (data->removed_handler != NULL && + watch_data_matches (data, job)) { + g_autoptr(WatchCallHandlerData) idle_data = NULL; + g_autoptr(GSource) idle_source = NULL; + + idle_data = g_new0 (WatchCallHandlerData, 1); + idle_data->job_manager = g_object_ref (self); + idle_data->watch_data = watch_data_ref (data); + idle_data->call_type = WATCH_CALL_REMOVED; + idle_data->job = g_object_ref (job); + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + watch_call_handler_cb, + g_steal_pointer (&idle_data), + (GDestroyNotify) watch_call_handler_data_free); + g_source_set_static_name (idle_source, G_STRFUNC); + g_source_attach (idle_source, data->callback_context); + } + } + + g_signal_handlers_disconnect_by_func (job, job_completed_cb, self); + + if (self->shut_down && self->jobs->len == 0) + g_cond_broadcast (&self->shutdown_cond); + + return TRUE; +} + +static gboolean +job_contains_app (GsPluginJob *job, + GsApp *app) +{ + return job_contains_app_by_unique_id (job, gs_app_get_unique_id (app)); +} + +/** + * gs_job_manager_get_pending_jobs_for_app: + * @self: a #GsJobManager + * @app: app to get pending jobs for + * + * Find the jobs which are ongoing for the given @app. + * + * Returns: (element-type GsPluginJob) (transfer container): zero or more + * ongoing jobs + * Since: 44 + */ +GPtrArray * +gs_job_manager_get_pending_jobs_for_app (GsJobManager *self, + GsApp *app) +{ + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GPtrArray) jobs_for_app = NULL; + + g_return_val_if_fail (GS_IS_JOB_MANAGER (self), NULL); + g_return_val_if_fail (GS_IS_APP (app), NULL); + + locker = g_mutex_locker_new (&self->mutex); + + jobs_for_app = g_ptr_array_new_with_free_func (g_object_unref); + + for (gsize i = 0; i < self->jobs->len; i++) { + GsPluginJob *job = g_ptr_array_index (self->jobs, i); + + if (job_contains_app (job, app)) + g_ptr_array_add (jobs_for_app, g_object_ref (job)); + } + + return g_steal_pointer (&jobs_for_app); +} + +/** + * gs_job_manager_app_has_pending_job_type: + * @self: a #GsJobManager + * @app: app to query for pending jobs for + * @pending_job_type: %GS_TYPE_PLUGIN_JOB or one of its subtypes + * + * Query whether there is at least one job of type @pending_job_type ongoing for + * @app. + * + * Returns: %TRUE if there is at least one job ongoing for @app, %FALSE + * otherwise + * Since: 44 + */ +gboolean +gs_job_manager_app_has_pending_job_type (GsJobManager *self, + GsApp *app, + GType pending_job_type) +{ + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_JOB_MANAGER (self), FALSE); + g_return_val_if_fail (GS_IS_APP (app), FALSE); + g_return_val_if_fail (g_type_is_a (pending_job_type, GS_TYPE_PLUGIN_JOB), FALSE); + + locker = g_mutex_locker_new (&self->mutex); + + for (gsize i = 0; i < self->jobs->len; i++) { + GsPluginJob *job = g_ptr_array_index (self->jobs, i); + + if (g_type_is_a (G_OBJECT_TYPE (job), pending_job_type) && + job_contains_app (job, app)) + return TRUE; + } + + return FALSE; +} + +/** + * gs_job_manager_add_watch: + * @self: a #GsJobManager + * @match_app: (nullable) (transfer none): an app to match, or %NULL to not match by app + * @match_job_type: a job type to match, or %G_TYPE_INVALID to not match by job type + * @added_handler: (nullable) (scope notified): function to call when a matching + * job is added to the manager, or %NULL to ignore + * @removed_handler: (nullable) (scope notified): function to call when a + * matching job is removed from the manager or completed, or %NULL to ignore + * @user_data: (closure): data to pass to @added_handler and @removed_handler + * @user_data_free_func: free function for @user_data + * + * Add a watch for certain job types or jobs touching a particular app. + * + * This will cause @added_handler and @removed_handler to be called whenever a + * matching job is added to or removed from the #GsJobManager. The callbacks + * and @user_data_free_func will all be invoked in the #GMainContext which is + * the thread-default at the time of calling gs_job_manager_add_watch(). + * + * Jobs are matched against @match_app and @match_job_type, if they are set. + * Jobs must match both filters if both are set. To match, a job must be of type + * @match_job_type, and must be operating on @match_app. + * + * To remove the watch, call gs_job_manager_remove_watch() using the handle + * which is returned by this function. All watches must be removed before the + * #GsJobManager is finalised. + * + * It is possible for @added_handler and/or @removed_handler to be invoked after + * gs_job_manager_remove_watch() is called, if the notifications are already in + * flight when gs_job_manager_remove_watch() is called (perhaps from another + * thread). If you need to synchronise on the watch being fully removed, use + * @user_data_free_func. + * + * Returns: a handle for the watch, guaranteed to never be zero + * Since: 44 + */ +guint +gs_job_manager_add_watch (GsJobManager *self, + GsApp *match_app, + GType match_job_type, + GsJobManagerJobCallback added_handler, + GsJobManagerJobCallback removed_handler, + gpointer user_data, + GDestroyNotify user_data_free_func) +{ + g_autoptr(GMutexLocker) locker = NULL; + guint watch_id; + g_autoptr(WatchData) data = NULL; + + g_return_val_if_fail (GS_IS_JOB_MANAGER (self), 0); + g_return_val_if_fail (match_app == NULL || GS_IS_APP (match_app), 0); + g_return_val_if_fail (match_job_type == G_TYPE_INVALID || g_type_is_a (match_job_type, GS_TYPE_PLUGIN_JOB), 0); + + locker = g_mutex_locker_new (&self->mutex); + + g_assert (self->next_watch_id < G_MAXUINT); + watch_id = self->next_watch_id++; + + data = g_new0 (WatchData, 1); + data->ref_count = 1; + data->watch_id = watch_id; + data->match_app_unique_id = (match_app != NULL) ? g_strdup (gs_app_get_unique_id (match_app)) : NULL; + data->match_job_type = match_job_type; + data->added_handler = added_handler; + data->removed_handler = removed_handler; + data->user_data = user_data; + data->user_data_free_func = user_data_free_func; + data->callback_context = g_main_context_ref_thread_default (); + + g_ptr_array_add (self->watches, g_steal_pointer (&data)); + + g_assert (watch_id != 0); + return watch_id; +} + +/** + * gs_job_manager_remove_watch: + * @self: a #GsJobManager + * @watch_id: a handle to a watch, returned by gs_job_manager_add_watch() + * + * Remove a watch previously added using gs_job_manager_add_watch(). + * + * It is an error to call this with an invalid @watch_id. + * + * Since: 44 + */ +void +gs_job_manager_remove_watch (GsJobManager *self, + guint watch_id) +{ + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_JOB_MANAGER (self)); + g_return_if_fail (watch_id != 0); + + locker = g_mutex_locker_new (&self->mutex); + + for (guint i = 0; i < self->watches->len; i++) { + const WatchData *data = g_ptr_array_index (self->watches, i); + + if (data->watch_id == watch_id) { + g_ptr_array_remove_index_fast (self->watches, i); + return; + } + } + + g_critical ("Unknown watch ID %u in call to gs_job_manager_remove_watch()", watch_id); +} + +static gpointer +copy_job_cb (gconstpointer src, + gpointer user_data) +{ + return g_object_ref ((gpointer) src); +} + +static void +gs_job_manager_shutdown_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsJobManager *self = source_object; + g_autoptr(GMutexLocker) locker = NULL; + + locker = g_mutex_locker_new (&self->mutex); + + while (self->jobs->len > 0) { + g_autoptr(GPtrArray) jobs = g_ptr_array_copy (self->jobs, copy_job_cb, NULL); + + g_clear_pointer (&locker, g_mutex_locker_free); + + for (guint i = 0; i < jobs->len; i++) { + GsPluginJob *job = g_ptr_array_index (jobs, i); + gs_plugin_job_cancel (job); + } + + locker = g_mutex_locker_new (&self->mutex); + + g_clear_pointer (&jobs, g_ptr_array_unref); + + g_cond_wait (&self->shutdown_cond, &self->mutex); + } + + g_task_return_boolean (task, TRUE); +} + +/** + * gs_job_manager_shutdown_async: + * @self: a #GsJobManager + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: (scope async): a callback to call when done + * @user_data: user data for the @callback + * + * Shuts down all running jobs. Once called, any following + * jobs are automatically cancelled too. + * + * Finish the call with gs_job_manager_shutdown_finish(). + * + * Since: 45 + **/ +void +gs_job_manager_shutdown_async (GsJobManager *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GTask) task = NULL; + + g_return_if_fail (GS_IS_JOB_MANAGER (self)); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_job_manager_shutdown_async); + + locker = g_mutex_locker_new (&self->mutex); + + self->shut_down = TRUE; + + g_task_run_in_thread (task, gs_job_manager_shutdown_thread); +} + +/** + * gs_job_manager_shutdown_finish: + * @self: a #GsJobManager + * @result: a #GAsyncResult + * @error: (out) (nullable): a reference to an #GError, or %NULL + * + * Finish the call of gs_job_manager_shutdown_async(). + * + * Returns: %TRUE, when succeeded, or %FALSE on failure with the @error set + * + * Since: 45 + **/ +gboolean +gs_job_manager_shutdown_finish (GsJobManager *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_JOB_MANAGER (self), FALSE); + g_return_val_if_fail (g_task_is_valid (G_TASK (result), self), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} diff --git a/lib/gs-job-manager.h b/lib/gs-job-manager.h new file mode 100644 index 0000000..b77327f --- /dev/null +++ b/lib/gs-job-manager.h @@ -0,0 +1,72 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022, 2023 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_JOB_MANAGER (gs_job_manager_get_type ()) + +G_DECLARE_FINAL_TYPE (GsJobManager, gs_job_manager, GS, JOB_MANAGER, GObject) + +GsJobManager *gs_job_manager_new (void); + +gboolean gs_job_manager_add_job (GsJobManager *self, + GsPluginJob *job); +gboolean gs_job_manager_remove_job (GsJobManager *self, + GsPluginJob *job); + +GPtrArray *gs_job_manager_get_pending_jobs_for_app (GsJobManager *self, + GsApp *app); +gboolean gs_job_manager_app_has_pending_job_type (GsJobManager *self, + GsApp *app, + GType pending_job_type); +void gs_job_manager_shutdown_async (GsJobManager *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_job_manager_shutdown_finish (GsJobManager *self, + GAsyncResult *result, + GError **error); + +/** + * GsJobManagerJobCallback: + * @job_manager: a #GsJobManager + * @job: (not nullable): a #GsPluginJob + * @user_data: user data + * + * A callback related to a specific job. + * + * This is used by gs_job_manager_add_watch(). + * + * Since: 44 + */ +typedef void (*GsJobManagerJobCallback) (GsJobManager *job_manager, + GsPluginJob *job, + gpointer user_data); + +guint gs_job_manager_add_watch (GsJobManager *self, + GsApp *match_app, + GType match_job_type, + GsJobManagerJobCallback added_handler, + GsJobManagerJobCallback removed_handler, + gpointer user_data, + GDestroyNotify user_data_free_func); +void gs_job_manager_remove_watch (GsJobManager *self, + guint watch_id); + +G_END_DECLS diff --git a/lib/gs-key-colors.c b/lib/gs-key-colors.c new file mode 100644 index 0000000..54589b3 --- /dev/null +++ b/lib/gs-key-colors.c @@ -0,0 +1,324 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Authors: + * - Richard Hughes + * - Kalev Lember + * - Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-key-colors + * @short_description: Helper functions for calculating key colors + * + * Key colors are RGB colors which represent an app, and they are derived from + * the app’s icon, or manually specified as an override. + * + * Use gs_calculate_key_colors() to calculate the key colors from an app’s icon. + * + * Since: 40 + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-key-colors.h" + +/* Hard-code the number of clusters to split the icon color space into. This + * gives the maximum number of key colors returned for an icon. This number has + * been chosen by examining 1000 icons to subjectively see how many key colors + * each has. The number of key colors ranged from 1 to 6, but the mode was + * definitely 3. */ +const guint n_clusters = 3; + +/* Discard pixels with less than this level of alpha. Almost all icons have a + * transparent background/border at 100% transparency, and a blending fringe + * with some intermediate level of transparency which should be ignored for + * choosing key colors. A number of icons have partially-transparent colored + * sections in the main body of the icon, which should be used if they’re above + * this threshold. About 1% of icons have no completely opaque pixels, so we + * can’t discard non-opaque pixels entirely. */ +const guint minimum_alpha = 0.5 * 255; + +typedef struct { + guint8 red; + guint8 green; + guint8 blue; +} Pixel8; + +typedef struct { + Pixel8 color; + union { + guint8 alpha; + guint8 cluster; + }; +} ClusterPixel8; + +typedef struct { + guint red; + guint green; + guint blue; + guint n_members; +} CentroidAccumulator; + +static inline guint +color_distance (const Pixel8 *a, + const Pixel8 *b) +{ + /* Take the absolute value rather than the square root to save some + * time, as the caller is comparing distances. + * + * The arithmetic here can’t overflow, as the R/G/B components have a + * maximum value of 255 but the arithmetic is done in (at least) 32-bit + * variables.*/ + gint dr = b->red - a->red; + gint dg = b->green - a->green; + gint db = b->blue - a->blue; + + return abs (dr * dr + dg * dg + db * db); +} + +/* NOTE: This has to return stable results when more than one cluster is + * equidistant from the @pixel, or the k_means() function may not terminate. */ +static inline gsize +nearest_cluster (const Pixel8 *pixel, + const Pixel8 *cluster_centres, + gsize n_cluster_centres) +{ + gsize nearest_cluster = 0; + guint nearest_cluster_distance = color_distance (&cluster_centres[0], pixel); + + for (gsize i = 1; i < n_cluster_centres; i++) { + guint distance = color_distance (&cluster_centres[i], pixel); + if (distance < nearest_cluster_distance) { + nearest_cluster = i; + nearest_cluster_distance = distance; + } + } + + return nearest_cluster; +} + +/* A variant of g_random_int_range() which chooses without replacement, + * tracking the used integers in @used_ints and @n_used_ints. + * Once all integers in 0..max_ints have been used once, it will choose + * with replacement. */ +static gint32 +random_int_range_no_replacement (guint max_ints, + gboolean *used_ints, + guint *n_used_ints) +{ + gint32 random_value = g_random_int_range (0, (gint32) max_ints); + + if (*n_used_ints < max_ints) { + while (used_ints[random_value]) + random_value = (random_value + 1) % max_ints; + + used_ints[random_value] = TRUE; + *n_used_ints = *n_used_ints + 1; + } + + return random_value; +} + +/* Extract the key colors from @pb by clustering the pixels in RGB space. + * Clustering is done using k-means, with initialisation using a + * Random Partition. + * + * This approach can be thought of as plotting every pixel in @pb in a + * three-dimensional color space, with red, green and blue axes (alpha is + * clipped to 0 (pixel is ignored) or 1 (pixel is used)). The key colors for + * the image are the ones where a large number of pixels are plotted in a group + * in the color space — either a lot of pixels with an identical color + * (repeated use of exactly the same color in the image) or a lot of pixels in + * a rough group (use of a lot of similar shades of the same color in the + * image). + * + * By transforming to a color space, information about the X and Y positions of + * each color is ignored, so a thin outline in the image of a single color + * will appear in the color space as a cluster, just as a contiguous block of + * one color would. + * + * The k-means clustering algorithm is then used to find these clusters. k-means + * is used, rather than (say) principal component analysis, because it + * inherently calculates the centroid for each cluster. In a color space, the + * centroid is itself a color, which can then be used as the key color to + * return. + * + * The number of clusters is limited to @n_clusters, as a subjective survey of + * 1000 icons found that they commonly used this number of key colors. + * + * Various other shortcuts have been taken which make this approach quite + * specific to key color extraction from icons, with the aim of making it + * faster. That’s fine — it doesn’t matter if the results this function produces + * are optimal, only that they’re good enough. */ +static void +k_means (GArray *colors, + GdkPixbuf *pb) +{ + gint rowstride, n_channels; + gint width, height; + guint8 *raw_pixels; + ClusterPixel8 *pixels; + const ClusterPixel8 *pixels_end; + Pixel8 cluster_centres[n_clusters]; + CentroidAccumulator cluster_accumulators[n_clusters]; + gboolean used_clusters[n_clusters]; + guint n_used_clusters = 0; + guint n_assignments_changed; + guint n_iterations = 0; + guint assignments_termination_limit; + + n_channels = gdk_pixbuf_get_n_channels (pb); + rowstride = gdk_pixbuf_get_rowstride (pb); + raw_pixels = gdk_pixbuf_get_pixels (pb); + width = gdk_pixbuf_get_width (pb); + height = gdk_pixbuf_get_height (pb); + + /* The pointer arithmetic over pixels can be simplified if we can assume + * there are no gaps in the @raw_pixels data. Since the caller is + * downsizing the #GdkPixbuf, this is a reasonable assumption. */ + g_assert (rowstride == width * n_channels); + g_assert (n_channels == 4); + + pixels = (ClusterPixel8 *) raw_pixels; + pixels_end = &pixels[height * width]; + + memset (cluster_centres, 0, sizeof (cluster_centres)); + memset (used_clusters, 0, sizeof (used_clusters)); + + /* Initialise the clusters using the Random Partition method: randomly + * assign a starting cluster to each pixel. + * + * The Forgy method (choosing random pixels as the starting cluster + * centroids) is not appropriate as the checks required to make sure + * they aren’t transparent or duplicated colors mean that the + * initialisation step may never complete. Consider the case of an icon + * which is a block of solid color. */ + for (ClusterPixel8 *p = pixels; p < pixels_end; p++) { + if (p->alpha < minimum_alpha) + p->cluster = G_N_ELEMENTS (cluster_centres); + else + p->cluster = random_int_range_no_replacement (G_N_ELEMENTS (cluster_centres), used_clusters, &n_used_clusters); + } + + /* Iterate until every cluster is relatively settled. This is determined + * by the number of pixels whose assignment to a cluster changes in + * each iteration — if the number of pixels is less than 1% of the image + * then subsequent iterations are not going to significantly affect the + * results. + * + * As we’re choosing key colors, finding the optimal result is not + * needed. We just need to find one which is good enough, quickly. + * + * A second termination condition is set on the number of iterations, to + * avoid a potential infinite loop. This termination condition is never + * normally expected to be hit — typically an icon will require 5–10 + * iterations to terminate based on @n_assignments_changed. */ + assignments_termination_limit = width * height * 0.01; + n_iterations = 0; + do { + /* Update step. Re-calculate the centroid of each cluster from + * the colors which are in it. */ + memset (cluster_accumulators, 0, sizeof (cluster_accumulators)); + + for (const ClusterPixel8 *p = pixels; p < pixels_end; p++) { + if (p->cluster >= G_N_ELEMENTS (cluster_centres)) + continue; + + cluster_accumulators[p->cluster].red += p->color.red; + cluster_accumulators[p->cluster].green += p->color.green; + cluster_accumulators[p->cluster].blue += p->color.blue; + cluster_accumulators[p->cluster].n_members++; + } + + for (gsize i = 0; i < G_N_ELEMENTS (cluster_centres); i++) { + if (cluster_accumulators[i].n_members == 0) + continue; + + cluster_centres[i].red = cluster_accumulators[i].red / cluster_accumulators[i].n_members; + cluster_centres[i].green = cluster_accumulators[i].green / cluster_accumulators[i].n_members; + cluster_centres[i].blue = cluster_accumulators[i].blue / cluster_accumulators[i].n_members; + } + + /* Update assignments of colors to clusters. */ + n_assignments_changed = 0; + for (ClusterPixel8 *p = pixels; p < pixels_end; p++) { + gsize new_cluster; + + if (p->cluster >= G_N_ELEMENTS (cluster_centres)) + continue; + + new_cluster = nearest_cluster (&p->color, cluster_centres, G_N_ELEMENTS (cluster_centres)); + if (new_cluster != p->cluster) + n_assignments_changed++; + p->cluster = new_cluster; + } + + n_iterations++; + } while (n_assignments_changed > assignments_termination_limit && n_iterations < 50); + + /* Output the cluster centres: these are the icon’s key colors. */ + for (gsize i = 0; i < G_N_ELEMENTS (cluster_centres); i++) { + GdkRGBA color; + + if (cluster_accumulators[i].n_members == 0) + continue; + + color.red = (gdouble) cluster_centres[i].red / 255.0; + color.green = (gdouble) cluster_centres[i].green / 255.0; + color.blue = (gdouble) cluster_centres[i].blue / 255.0; + color.alpha = 1.0; + g_array_append_val (colors, color); + } +} + +/** + * gs_calculate_key_colors: + * @pixbuf: an app icon to calculate key colors from + * + * Calculate the set of key colors present in @pixbuf. These are the colors + * which stand out the most, and they are subjective. This function does not + * guarantee to return perfect results, but should return workable results for + * most icons. + * + * @pixbuf will be scaled down to 32×32 pixels, so if it can be provided at + * that resolution by the caller, this function will return faster. + * + * Returns: (transfer full) (element-type GdkRGBA): key colors for @pixbuf + * Since: 40 + */ +GArray * +gs_calculate_key_colors (GdkPixbuf *pixbuf) +{ + g_autoptr(GdkPixbuf) pb_small = NULL; + g_autoptr(GArray) colors = g_array_new (FALSE, FALSE, sizeof (GdkRGBA)); + + /* people almost always use BILINEAR scaling with pixbufs, but we can + * use NEAREST here since we only care about the rough colour data, not + * whether the edges in the image are smooth and visually appealing; + * NEAREST is twice as fast as BILINEAR */ + pb_small = gdk_pixbuf_scale_simple (pixbuf, 32, 32, GDK_INTERP_NEAREST); + + /* require an alpha channel for storing temporary values; most images + * have one already, about 2% don’t */ + if (gdk_pixbuf_get_n_channels (pixbuf) != 4) { + g_autoptr(GdkPixbuf) temp = g_steal_pointer (&pb_small); + pb_small = gdk_pixbuf_add_alpha (temp, FALSE, 0, 0, 0); + } + + /* get a list of key colors */ + k_means (colors, pb_small); + + return g_steal_pointer (&colors); +} diff --git a/lib/gs-key-colors.h b/lib/gs-key-colors.h new file mode 100644 index 0000000..2616169 --- /dev/null +++ b/lib/gs-key-colors.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Authors: + * - Richard Hughes + * - Kalev Lember + * - Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +GArray *gs_calculate_key_colors (GdkPixbuf *pixbuf); + +G_END_DECLS diff --git a/lib/gs-metered.c b/lib/gs-metered.c new file mode 100644 index 0000000..05471ad --- /dev/null +++ b/lib/gs-metered.c @@ -0,0 +1,551 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2019 Endless Mobile, Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-metered + * @title: Metered Data Utilities + * @include: gnome-software.h + * @stability: Unstable + * @short_description: Utility functions to help with metered data handling + * + * Metered data handling is provided by Mogwai, which implements a download + * scheduler to control when, and in which order, large downloads happen on + * the system. + * + * All large downloads from #GsPlugin.update_apps_async() + * calls should be scheduled using Mogwai, which will notify gnome-software + * when those downloads can start and stop, according to system policy. + * + * The functions in this file make interacting with the scheduling daemon a + * little simpler. Since all #GsPlugin method calls happen in worker threads, + * typically without a #GMainContext, all interaction with the scheduler should + * be blocking. libmogwai-schedule-client was designed to be asynchronous; so + * these helpers make it synchronous. + * + * Since: 3.34 + */ + +#include "config.h" + +#include + +#ifdef HAVE_MOGWAI +#include +#endif + +#include "gs-metered.h" +#include "gs-utils.h" + + +static void +async_result_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **result_out = user_data; + + g_assert (*result_out == NULL); + *result_out = g_object_ref (result); + g_main_context_wakeup (g_main_context_get_thread_default ()); +} + +/** + * gs_metered_block_on_download_scheduler: + * @parameters: (nullable): a #GVariant of type `a{sv}` specifying parameters + * for the schedule entry, or %NULL to pass no parameters + * @schedule_entry_handle_out: (out) (not optional): return location for a + * handle to the resulting schedule entry + * @cancellable: (nullable): a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Create a schedule entry with the given @parameters, and block until + * permission is given to download. + * + * FIXME: This will currently ignore later revocations of that download + * permission, and does not support creating a schedule entry per app. + * The schedule entry must later be removed from the schedule by passing + * the handle from @schedule_entry_handle_out to + * gs_metered_remove_from_download_scheduler(), otherwise resources will leak. + * This is an opaque handle and should not be inspected. + * + * If a schedule entry cannot be created, or if @cancellable is cancelled, + * an error will be set and %FALSE returned. + * + * The keys understood by @parameters are listed in the documentation for + * mwsc_scheduler_schedule_async(). + * + * This function will likely be called from a #GsPluginLoader worker thread. + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 3.38 + */ +gboolean +gs_metered_block_on_download_scheduler (GVariant *parameters, + gpointer *schedule_entry_handle_out, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GMainContext) context = NULL; + g_autoptr(GMainContextPusher) pusher = NULL; + g_autoptr(GAsyncResult) result = NULL; + + context = g_main_context_new (); + pusher = g_main_context_pusher_new (context); + + gs_metered_block_on_download_scheduler_async (parameters, cancellable, async_result_cb, &result); + while (result == NULL) + g_main_context_iteration (context, TRUE); + + return gs_metered_block_on_download_scheduler_finish (result, schedule_entry_handle_out, error); +} + +#ifdef HAVE_MOGWAI +typedef struct +{ + MwscScheduleEntry *schedule_entry; /* (owned) (not nullable) */ + gulong notify_id; + gulong invalidated_id; + gulong cancelled_id; +} BlockData; + +static void +block_data_free (BlockData *data) +{ + g_clear_object (&data->schedule_entry); + + /* These should already have been disconnected. */ + g_assert (data->notify_id == 0); + g_assert (data->invalidated_id == 0); + g_assert (data->cancelled_id == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (BlockData, block_data_free) + +static void block_scheduler_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void block_scheduler_schedule_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void download_now_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data); +static void invalidated_cb (MwscScheduleEntry *entry, + const GError *error, + gpointer user_data); +static void cancelled_cb (GCancellable *cancellable, + gpointer user_data); +static void block_check_cb (GTask *task, + const GError *invalidated_error); +#endif /* HAVE_MOGWAI */ + +/** + * gs_metered_block_on_download_scheduler_async: + * @parameters: (nullable): a #GVariant of type `a{sv}` specifying parameters + * for the schedule entry, or %NULL to pass no parameters + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: callback to call when the operation is finished + * @user_data: data to pass to @callback + * + * Asynchronous version of gs_metered_block_on_download_scheduler(). + * + * Since: 44 + */ +void +gs_metered_block_on_download_scheduler_async (GVariant *parameters, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GVariant) parameters_owned = (parameters != NULL) ? g_variant_ref_sink (parameters) : NULL; +#ifdef HAVE_MOGWAI + g_autofree gchar *parameters_str = NULL; +#endif + + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_metered_block_on_download_scheduler_async); + +#ifdef HAVE_MOGWAI + parameters_str = (parameters != NULL) ? g_variant_print (parameters, TRUE) : g_strdup ("(none)"); + g_debug ("%s: Waiting with parameters: %s", G_STRFUNC, parameters_str); + + g_task_set_task_data (task, g_steal_pointer (¶meters_owned), (GDestroyNotify) g_variant_unref); + + /* Wait until the download can be scheduled. + * FIXME: In future, downloads could be split up by app, so they can all + * be scheduled separately and, for example, higher priority ones could + * be scheduled with a higher priority. This would have to be aware of + * dependencies. */ + mwsc_scheduler_new_async (cancellable, block_scheduler_new_cb, g_steal_pointer (&task)); +#else + g_debug ("%s: Allowed to download (Mogwai support compiled out)", G_STRFUNC); + g_task_return_pointer (task, NULL, NULL); +#endif +} + +#ifdef HAVE_MOGWAI +static void +block_scheduler_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GCancellable *cancellable = g_task_get_cancellable (task); + GVariant *parameters = g_task_get_task_data (task); + g_autoptr(MwscScheduler) scheduler = NULL; + g_autoptr(GError) local_error = NULL; + + scheduler = mwsc_scheduler_new_finish (result, &local_error); + if (scheduler == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Create a schedule entry for the group of downloads. + * FIXME: The underlying OSTree code supports resuming downloads + * (at a granularity of individual objects), so it should be + * possible to plumb through here. */ + mwsc_scheduler_schedule_async (scheduler, parameters, cancellable, block_scheduler_schedule_cb, g_steal_pointer (&task)); +} + +static void +block_scheduler_schedule_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + MwscScheduler *scheduler = MWSC_SCHEDULER (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(MwscScheduleEntry) schedule_entry = NULL; + g_autoptr(BlockData) data = NULL; + g_autoptr(GError) local_error = NULL; + + schedule_entry = mwsc_scheduler_schedule_finish (scheduler, result, &local_error); + if (schedule_entry == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Wait until the download is allowed to proceed. */ + data = g_new0 (BlockData, 1); + data->schedule_entry = g_object_ref (schedule_entry); + data->notify_id = g_signal_connect_object (schedule_entry, "notify::download-now", + G_CALLBACK (download_now_cb), task, G_CONNECT_DEFAULT); + data->invalidated_id = g_signal_connect_object (schedule_entry, "invalidated", + G_CALLBACK (invalidated_cb), task, G_CONNECT_DEFAULT); + data->cancelled_id = g_cancellable_connect (cancellable, + G_CALLBACK (cancelled_cb), g_object_ref (task), g_object_unref); + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) block_data_free); + + /* Do the initial check. */ + block_check_cb (task, NULL); +} + +static void +download_now_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + block_check_cb (G_TASK (user_data), NULL); +} + +static void +invalidated_cb (MwscScheduleEntry *entry, + const GError *error, + gpointer user_data) +{ + block_check_cb (G_TASK (user_data), error); +} + +static void +cancelled_cb (GCancellable *cancellable, + gpointer user_data) +{ + block_check_cb (G_TASK (user_data), NULL); +} + +static void +block_check_cb (GTask *task_unowned, + const GError *invalidated_error) +{ + g_autoptr(GTask) task = g_object_ref (task_unowned); + BlockData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + gboolean download_now = FALSE; + g_autoptr(GError) local_error = NULL; + + download_now = mwsc_schedule_entry_get_download_now (data->schedule_entry); + + /* Ignore spurious wakeups. */ + if (!download_now && invalidated_error == NULL && + !g_cancellable_is_cancelled (cancellable)) + return; + + /* At this point, either the download is permitted, the + * #MwscScheduleEntry has been invalidated, or the operation has been + * cancelled. */ + g_signal_handler_disconnect (data->schedule_entry, data->invalidated_id); + data->invalidated_id = 0; + g_signal_handler_disconnect (data->schedule_entry, data->notify_id); + data->notify_id = 0; + g_cancellable_disconnect (cancellable, data->cancelled_id); + data->cancelled_id = 0; + + if (!download_now && invalidated_error != NULL) { + /* no need to remove the schedule entry as it’s been + * invalidated */ + g_task_return_error (task, g_error_copy (invalidated_error)); + return; + } else if (!download_now && g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { + /* remove the schedule entry and fail */ + gs_metered_remove_from_download_scheduler_async (data->schedule_entry, NULL, NULL, NULL); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_assert (download_now); + + g_task_return_pointer (task, g_object_ref (data->schedule_entry), (GDestroyNotify) g_object_unref); + + g_debug ("%s: Allowed to download", G_STRFUNC); +} +#endif /* HAVE_MOGWAI */ + +/** + * gs_metered_block_on_download_scheduler_finish: + * @result: result of the async operation + * @schedule_entry_handle_out: (out) (not optional): return location for a + * handle to the resulting schedule entry + * @error: return location for a #GError, or %NULL + * + * Finish function for gs_metered_block_on_download_scheduler_async(). + * + * See gs_metered_block_on_download_scheduler(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 44 + */ +gboolean +gs_metered_block_on_download_scheduler_finish (GAsyncResult *result, + gpointer *schedule_entry_handle_out, + GError **error) +{ + g_autoptr(GError) local_error = NULL; + + g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE); + g_return_val_if_fail (schedule_entry_handle_out != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + *schedule_entry_handle_out = g_task_propagate_pointer (G_TASK (result), &local_error); + + if (local_error != NULL) { + g_propagate_error (error, g_steal_pointer (&local_error)); + return FALSE; + } + + return TRUE; +} + +/** + * gs_metered_remove_from_download_scheduler: + * @schedule_entry_handle: (transfer full) (nullable): schedule entry handle as + * returned by gs_metered_block_on_download_scheduler() + * @cancellable: (nullable): a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Remove a schedule entry previously created by + * gs_metered_block_on_download_scheduler(). This must be called after + * gs_metered_block_on_download_scheduler() has successfully returned, or + * resources will leak. It should be called once the corresponding download is + * complete. + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 3.38 + */ +gboolean +gs_metered_remove_from_download_scheduler (gpointer schedule_entry_handle, + GCancellable *cancellable, + GError **error) +{ +#ifdef HAVE_MOGWAI + g_autoptr(MwscScheduleEntry) schedule_entry = schedule_entry_handle; +#endif + + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + g_debug ("Removing schedule entry handle %p", schedule_entry_handle); + + if (schedule_entry_handle == NULL) + return TRUE; + +#ifdef HAVE_MOGWAI + return mwsc_schedule_entry_remove (schedule_entry, cancellable, error); +#else + return TRUE; +#endif +} + +#ifdef HAVE_MOGWAI +static void remove_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +#endif + +/** + * gs_metered_remove_from_download_scheduler_async: + * @schedule_entry_handle: (transfer full) (nullable): schedule entry handle as + * returned by gs_metered_block_on_download_scheduler() + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: callback to call when the operation is finished + * @user_data: data to pass to @callback + * + * Asynchronous version of gs_metered_remove_from_download_scheduler(). + * + * Since: 44 + */ +void +gs_metered_remove_from_download_scheduler_async (gpointer schedule_entry_handle, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; +#ifdef HAVE_MOGWAI + g_autoptr(MwscScheduleEntry) schedule_entry = schedule_entry_handle; +#endif + + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + g_debug ("Removing schedule entry handle %p", schedule_entry_handle); + + task = g_task_new (schedule_entry_handle, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_metered_remove_from_download_scheduler_async); + + if (schedule_entry_handle == NULL) { + g_task_return_boolean (task, TRUE); + return; + } + +#ifdef HAVE_MOGWAI + mwsc_schedule_entry_remove_async (schedule_entry, cancellable, remove_cb, g_steal_pointer (&task)); +#else + g_task_return_boolean (task, TRUE); +#endif +} + +#ifdef HAVE_MOGWAI +static void +remove_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + MwscScheduleEntry *schedule_entry = MWSC_SCHEDULE_ENTRY (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!mwsc_schedule_entry_remove_finish (schedule_entry, result, &local_error)) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} +#endif + +/** + * gs_metered_remove_from_download_scheduler_finish: + * @schedule_entry_handle: (transfer full) (nullable): schedule entry handle as + * returned by gs_metered_block_on_download_scheduler() + * result: result of the async operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous remove operation started with + * gs_metered_remove_from_download_scheduler_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 44 + */ +gboolean +gs_metered_remove_from_download_scheduler_finish (gpointer schedule_entry_handle, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/** + * gs_metered_build_scheduler_parameters_for_app: + * @app: a #GsApp to get the scheduler parameters from + * + * Build a #GVariant of scheduler parameters for downloading @app. + * + * This is suitable to pass to gs_metered_block_on_download_scheduler() or + * gs_metered_block_on_download_scheduler_async(). + * + * Returns: (transfer floating) (not nullable): scheduler parameters for @app + * Since: 44 + */ +GVariant * +gs_metered_build_scheduler_parameters_for_app (GsApp *app) +{ + g_auto(GVariantDict) parameters_dict = G_VARIANT_DICT_INIT (NULL); + guint64 download_size; + + /* Currently no plugins support resumable downloads. This may change in + * future, in which case this parameter should be refactored. */ + g_variant_dict_insert (¶meters_dict, "resumable", "b", FALSE); + + if (gs_app_get_size_download (app, &download_size) == GS_SIZE_TYPE_VALID) { + g_variant_dict_insert (¶meters_dict, "size-minimum", "t", download_size); + g_variant_dict_insert (¶meters_dict, "size-maximum", "t", download_size); + } + + return g_variant_dict_end (¶meters_dict); +} + +/** + * gs_metered_block_app_list_on_download_scheduler: + * @app_list: a #GsAppList to get the scheduler parameters from + * @schedule_entry_handle_out: (out) (not optional): return location for a + * handle to the resulting schedule entry + * @cancellable: a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Version of gs_metered_block_on_download_scheduler() which extracts the + * download parameters from the apps in the given @app_list. + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 3.38 + */ +gboolean +gs_metered_block_app_list_on_download_scheduler (GsAppList *app_list, + gpointer *schedule_entry_handle_out, + GCancellable *cancellable, + GError **error) +{ + g_auto(GVariantDict) parameters_dict = G_VARIANT_DICT_INIT (NULL); + g_autoptr(GVariant) parameters = NULL; + + /* Currently no plugins support resumable downloads. This may change in + * future, in which case this parameter should be refactored. */ + g_variant_dict_insert (¶meters_dict, "resumable", "b", FALSE); + + /* FIXME: Currently this creates a single Mogwai schedule entry for the + * entire app list. Eventually, we probably want one schedule entry per + * app being downloaded, so that they can be individually prioritised. + * However, that requires much deeper integration into the download + * code, and Mogwai does not currently support that level of + * prioritisation, so go with this simple implementation for now. */ + parameters = g_variant_ref_sink (g_variant_dict_end (¶meters_dict)); + + return gs_metered_block_on_download_scheduler (parameters, schedule_entry_handle_out, cancellable, error); +} diff --git a/lib/gs-metered.h b/lib/gs-metered.h new file mode 100644 index 0000000..d39ec99 --- /dev/null +++ b/lib/gs-metered.h @@ -0,0 +1,49 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2019 Endless Mobile, Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gs-app.h" +#include "gs-app-list.h" + +G_BEGIN_DECLS + +gboolean gs_metered_block_on_download_scheduler (GVariant *parameters, + gpointer *schedule_entry_handle_out, + GCancellable *cancellable, + GError **error); +void gs_metered_block_on_download_scheduler_async (GVariant *parameters, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_metered_block_on_download_scheduler_finish (GAsyncResult *result, + gpointer *schedule_entry_handle_out, + GError **error); + +gboolean gs_metered_remove_from_download_scheduler (gpointer schedule_entry_handle, + GCancellable *cancellable, + GError **error); +void gs_metered_remove_from_download_scheduler_async (gpointer schedule_entry_handle, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_metered_remove_from_download_scheduler_finish (gpointer schedule_entry_handle, + GAsyncResult *result, + GError **error); + +GVariant *gs_metered_build_scheduler_parameters_for_app (GsApp *app); + +gboolean gs_metered_block_app_list_on_download_scheduler (GsAppList *app_list, + gpointer *schedule_entry_handle_out, + GCancellable *cancellable, + GError **error); + +G_END_DECLS diff --git a/lib/gs-odrs-provider.c b/lib/gs-odrs-provider.c new file mode 100644 index 0000000..65f479a --- /dev/null +++ b/lib/gs-odrs-provider.c @@ -0,0 +1,2160 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * Copyright (C) 2016-2018 Kalev Lember + * Copyright (C) 2021 Endless OS Foundation LLC + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + * SECTION:gs-odrs-provider + * @short_description: Provides review data from the Open Desktop Ratings Service. + * + * To test this plugin locally you will probably want to build and run the + * `odrs-web` container, following the instructions in the + * [`odrs-web` repository](https://gitlab.gnome.org/Infrastructure/odrs-web/-/blob/HEAD/app_data/README.md), + * and then get gnome-software to use your local review server by running: + * ``` + * gsettings set org.gnome.software review-server 'http://127.0.0.1:5000/1.0/reviews/api' + * ``` + * + * When you are done with development, run the following command to use the real + * ODRS server again: + * ``` + * gsettings reset org.gnome.software review-server + * ``` + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ODRS_SOUP_DEBUG 0 + +G_DEFINE_QUARK (gs-odrs-provider-error-quark, gs_odrs_provider_error) + +/* Element in self->ratings, all allocated in one big block and sorted + * alphabetically to reduce the number of allocations and fragmentation. */ +typedef struct { + gchar *app_id; /* (owned) */ + guint32 n_star_ratings[6]; +} GsOdrsRating; + +static void +json_post_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +soup_send_and_read_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static int +rating_compare (const GsOdrsRating *a, const GsOdrsRating *b) +{ + return g_strcmp0 (a->app_id, b->app_id); +} + +static void +rating_clear (GsOdrsRating *rating) +{ + g_free (rating->app_id); +} + +struct _GsOdrsProvider +{ + GObject parent_instance; + + gchar *distro; /* (not nullable) (owned) */ + gchar *user_hash; /* (not nullable) (owned) */ + gchar *review_server; /* (not nullable) (owned) */ + GArray *ratings; /* (element-type GsOdrsRating) (mutex ratings_mutex) (owned) (nullable) */ + GMutex ratings_mutex; + guint64 max_cache_age_secs; + guint n_results_max; + SoupSession *session; /* (owned) (not nullable) */ +}; + +G_DEFINE_TYPE (GsOdrsProvider, gs_odrs_provider, G_TYPE_OBJECT) + +typedef enum { + PROP_REVIEW_SERVER = 1, + PROP_USER_HASH, + PROP_DISTRO, + PROP_MAX_CACHE_AGE_SECS, + PROP_N_RESULTS_MAX, + PROP_SESSION, +} GsOdrsProviderProperty; + +static GParamSpec *obj_props[PROP_SESSION + 1] = { NULL, }; + +static gboolean +gs_odrs_provider_load_ratings_for_app (JsonObject *json_app, + const gchar *app_id, + GsOdrsRating *rating_out) +{ + guint i; + const gchar *names[] = { "star0", "star1", "star2", "star3", + "star4", "star5", NULL }; + + for (i = 0; names[i] != NULL; i++) { + if (!json_object_has_member (json_app, names[i])) + return FALSE; + rating_out->n_star_ratings[i] = (guint64) json_object_get_int_member (json_app, names[i]); + } + + rating_out->app_id = g_strdup (app_id); + + return TRUE; +} + +static gboolean +gs_odrs_provider_load_ratings (GsOdrsProvider *self, + const gchar *filename, + GError **error) +{ + JsonNode *json_root; + JsonObject *json_item; + g_autoptr(JsonParser) json_parser = NULL; + const gchar *app_id; + JsonNode *json_app_node; + JsonObjectIter iter; + g_autoptr(GArray) new_ratings = NULL; + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GError) local_error = NULL; + + /* parse the data and find the success */ + json_parser = json_parser_new_immutable (); + if (!json_parser_load_from_mapped_file (json_parser, filename, &local_error)) { + g_set_error (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "Error parsing ODRS data: %s", local_error->message); + return FALSE; + } + json_root = json_parser_get_root (json_parser); + if (json_root == NULL) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no ratings root"); + return FALSE; + } + if (json_node_get_node_type (json_root) != JSON_NODE_OBJECT) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no ratings array"); + return FALSE; + } + + json_item = json_node_get_object (json_root); + + new_ratings = g_array_sized_new (FALSE, /* don’t zero-terminate */ + FALSE, /* don’t clear */ + sizeof (GsOdrsRating), + json_object_get_size (json_item)); + g_array_set_clear_func (new_ratings, (GDestroyNotify) rating_clear); + + /* parse each app */ + json_object_iter_init (&iter, json_item); + while (json_object_iter_next (&iter, &app_id, &json_app_node)) { + GsOdrsRating rating; + JsonObject *json_app; + + if (!JSON_NODE_HOLDS_OBJECT (json_app_node)) + continue; + json_app = json_node_get_object (json_app_node); + + if (gs_odrs_provider_load_ratings_for_app (json_app, app_id, &rating)) + g_array_append_val (new_ratings, rating); + } + + /* Allow for binary searches later. */ + g_array_sort (new_ratings, (GCompareFunc) rating_compare); + + /* Update the shared state */ + locker = g_mutex_locker_new (&self->ratings_mutex); + g_clear_pointer (&self->ratings, g_array_unref); + self->ratings = g_steal_pointer (&new_ratings); + + return TRUE; +} + +static AsReview * +gs_odrs_provider_parse_review_object (JsonObject *item) +{ + AsReview *rev = as_review_new (); + + /* date */ + if (json_object_has_member (item, "date_created")) { + gint64 timestamp; + g_autoptr(GDateTime) dt = NULL; + timestamp = json_object_get_int_member (item, "date_created"); + dt = g_date_time_new_from_unix_utc (timestamp); + as_review_set_date (rev, dt); + } + + /* assemble review */ + if (json_object_has_member (item, "rating")) + as_review_set_rating (rev, (gint) json_object_get_int_member (item, "rating")); + if (json_object_has_member (item, "score")) { + as_review_set_priority (rev, (gint) json_object_get_int_member (item, "score")); + } else if (json_object_has_member (item, "karma_up") && + json_object_has_member (item, "karma_down")) { + gdouble ku = (gdouble) json_object_get_int_member (item, "karma_up"); + gdouble kd = (gdouble) json_object_get_int_member (item, "karma_down"); + gdouble wilson = 0.f; + + /* from http://www.evanmiller.org/how-not-to-sort-by-average-rating.html */ + if (ku > 0 || kd > 0) { + wilson = ((ku + 1.9208) / (ku + kd) - + 1.96 * sqrt ((ku * kd) / (ku + kd) + 0.9604) / + (ku + kd)) / (1 + 3.8416 / (ku + kd)); + wilson *= 100.f; + } + as_review_set_priority (rev, (gint) wilson); + } + if (json_object_has_member (item, "user_hash")) + as_review_set_reviewer_id (rev, json_object_get_string_member (item, "user_hash")); + if (json_object_has_member (item, "user_display")) { + g_autofree gchar *user_display = g_strdup (json_object_get_string_member (item, "user_display")); + if (user_display) + g_strstrip (user_display); + as_review_set_reviewer_name (rev, user_display); + } + if (json_object_has_member (item, "summary")) { + g_autofree gchar *summary = g_strdup (json_object_get_string_member (item, "summary")); + if (summary) + g_strstrip (summary); + as_review_set_summary (rev, summary); + } + if (json_object_has_member (item, "description")) { + g_autofree gchar *description = g_strdup (json_object_get_string_member (item, "description")); + if (description) + g_strstrip (description); + as_review_set_description (rev, description); + } + if (json_object_has_member (item, "version")) + as_review_set_version (rev, json_object_get_string_member (item, "version")); + + /* add extra metadata for the plugin */ + if (json_object_has_member (item, "user_skey")) { + as_review_add_metadata (rev, "user_skey", + json_object_get_string_member (item, "user_skey")); + } + if (json_object_has_member (item, "app_id")) { + as_review_add_metadata (rev, "app_id", + json_object_get_string_member (item, "app_id")); + } + if (json_object_has_member (item, "review_id")) { + g_autofree gchar *review_id = NULL; + review_id = g_strdup_printf ("%" G_GINT64_FORMAT, + json_object_get_int_member (item, "review_id")); + as_review_set_id (rev, review_id); + } + + /* don't allow multiple votes */ + if (json_object_has_member (item, "vote_id")) + as_review_add_flags (rev, AS_REVIEW_FLAG_VOTED); + + return rev; +} + +/* json_parser_load*() must have been called on @json_parser before calling + * this function. */ +static GPtrArray * +gs_odrs_provider_parse_reviews (GsOdrsProvider *self, + JsonParser *json_parser, + GError **error) +{ + JsonArray *json_reviews; + JsonNode *json_root; + guint i; + g_autoptr(GHashTable) reviewer_ids = NULL; + g_autoptr(GPtrArray) reviews = NULL; + + json_root = json_parser_get_root (json_parser); + if (json_root == NULL) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no root"); + return NULL; + } + if (json_node_get_node_type (json_root) != JSON_NODE_ARRAY) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no array"); + return NULL; + } + + /* parse each rating */ + reviews = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + json_reviews = json_node_get_array (json_root); + reviewer_ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + for (i = 0; i < json_array_get_length (json_reviews); i++) { + JsonNode *json_review; + JsonObject *json_item; + const gchar *reviewer_id; + g_autoptr(AsReview) review = NULL; + + /* extract the data */ + json_review = json_array_get_element (json_reviews, i); + if (json_node_get_node_type (json_review) != JSON_NODE_OBJECT) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no object type"); + return NULL; + } + json_item = json_node_get_object (json_review); + if (json_item == NULL) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no object"); + return NULL; + } + + /* create review */ + review = gs_odrs_provider_parse_review_object (json_item); + + reviewer_id = as_review_get_reviewer_id (review); + if (reviewer_id == NULL) + continue; + + /* dedupe each on the user_hash */ + if (g_hash_table_lookup (reviewer_ids, reviewer_id) != NULL) { + g_debug ("duplicate review %s, skipping", reviewer_id); + continue; + } + g_hash_table_add (reviewer_ids, g_strdup (reviewer_id)); + g_ptr_array_add (reviews, g_object_ref (review)); + } + return g_steal_pointer (&reviews); +} + +static gboolean +gs_odrs_provider_parse_success (GInputStream *input_stream, + GError **error) +{ + JsonNode *json_root; + JsonObject *json_item; + const gchar *msg = NULL; + g_autoptr(JsonParser) json_parser = NULL; + g_autoptr(GError) local_error = NULL; + + /* parse the data and find the success + * FIXME: This should probably eventually be refactored and made async */ + json_parser = json_parser_new_immutable (); + if (!json_parser_load_from_stream (json_parser, input_stream, NULL, &local_error)) { + g_set_error (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "Error parsing ODRS data: %s", local_error->message); + return FALSE; + } + json_root = json_parser_get_root (json_parser); + if (json_root == NULL) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no error root"); + return FALSE; + } + if (json_node_get_node_type (json_root) != JSON_NODE_OBJECT) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no error object"); + return FALSE; + } + json_item = json_node_get_object (json_root); + if (json_item == NULL) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "no error object"); + return FALSE; + } + + /* failed? */ + if (json_object_has_member (json_item, "msg")) + msg = json_object_get_string_member (json_item, "msg"); + if (!json_object_get_boolean_member (json_item, "success")) { + g_set_error_literal (error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + msg != NULL ? msg : "unknown failure"); + return FALSE; + } + + /* just for the console */ + if (msg != NULL) + g_debug ("success: %s", msg); + return TRUE; +} + +typedef struct { + GInputStream *input_stream; + gssize length; + goffset read_from; +} MessageData; + +static MessageData * +message_data_new (GInputStream *input_stream, + gssize length) +{ + MessageData *md; + + md = g_slice_new0 (MessageData); + md->input_stream = g_object_ref (input_stream); + md->length = length; + + if (G_IS_SEEKABLE (input_stream)) + md->read_from = g_seekable_tell (G_SEEKABLE (input_stream)); + + return md; +} + +static void +message_data_free (gpointer ptr, + GClosure *closure) +{ + MessageData *md = ptr; + + if (md) { + g_object_unref (md->input_stream); + g_slice_free (MessageData, md); + } +} + +static void +g_odrs_provider_message_restarted_cb (SoupMessage *message, + gpointer user_data) +{ + MessageData *md = user_data; + + if (G_IS_SEEKABLE (md->input_stream) && md->read_from != g_seekable_tell (G_SEEKABLE (md->input_stream))) + g_seekable_seek (G_SEEKABLE (md->input_stream), md->read_from, G_SEEK_SET, NULL, NULL); + + soup_message_set_request_body (message, NULL, md->input_stream, md->length); +} + +static void +g_odrs_provider_set_message_request_body (SoupMessage *message, + const gchar *content_type, + gconstpointer data, + gsize length) +{ + MessageData *md; + GInputStream *input_stream; + + g_return_if_fail (SOUP_IS_MESSAGE (message)); + g_return_if_fail (data != NULL); + + input_stream = g_memory_input_stream_new_from_data (g_memdup2 (data, length), length, g_free); + md = message_data_new (input_stream, length); + + g_signal_connect_data (message, "restarted", + G_CALLBACK (g_odrs_provider_message_restarted_cb), md, message_data_free, 0); + + soup_message_set_request_body (message, content_type, input_stream, length); + + g_object_unref (input_stream); +} + +typedef struct { + GsApp *app; /* (nullable) (owned) */ + AsReview *review; /* (not nullable) (owned) */ + gboolean is_review_action; // is one of the actions in 'GsReviewAction' +} JsonPostReviewData; + +static void +json_post_review_data_free (JsonPostReviewData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->review); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (JsonPostReviewData, json_post_review_data_free); + +static void +gs_odrs_provider_json_post_async (SoupSession *session, + const gchar *uri, + const gchar *data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(SoupMessage) msg = NULL; + g_autoptr(GInputStream) input_stream = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(GTask) task = NULL; + + /* create the GET data */ + g_debug ("Sending ODRS request to %s: %s", uri, data); + msg = soup_message_new (SOUP_METHOD_POST, uri); + + task = g_task_new (session, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_odrs_provider_json_post_async); + g_task_set_task_data (task, g_object_ref (msg), g_object_unref); + + g_odrs_provider_set_message_request_body (msg, "application/json; charset=utf-8", + data, strlen (data)); + soup_session_send_and_read_async (session, msg, G_PRIORITY_DEFAULT, + cancellable, soup_send_and_read_cb, g_object_ref (task)); +} + +static gboolean +gs_odrs_provider_json_post_finish (SoupSession *session, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (SOUP_IS_SESSION (session), FALSE); + g_return_val_if_fail (g_task_is_valid (result, session), FALSE); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_odrs_provider_json_post_async, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +is_json_response (const char *content_type) +{ + if (content_type == NULL) + return FALSE; + + return (g_strcmp0 (content_type, "application/json") == 0); +} + +/* Dump few bytes from @input_stream to log */ +static void +dump_input_stream (GInputStream *input_stream) +{ + gssize count; + guint8 data[512]; + g_autoptr(GError) local_error = NULL; + + count = g_input_stream_read (input_stream, data, sizeof (data), NULL, &local_error); + + if (count < 0) + g_warning ("Error while dumping ODRS response: %s", local_error->message); + else if (count == 0) + g_warning ("Got EOF while dumping ODRS response"); + else + g_debug ("ODRS server returned data (first %" G_GSSIZE_FORMAT " bytes): %.*s", + count, (gint) count, g_strescape ((gchar *) data, "\n\\\"")); +} + +static void +soup_send_and_read_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + guint status_code; + gconstpointer downloaded_data; + gsize downloaded_data_length; + SoupMessage *msg; + SoupSession *session = SOUP_SESSION (source_object); + + g_autoptr(GInputStream) input_stream = NULL; + g_autoptr(GBytes) bytes = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(GTask) task = g_steal_pointer (&user_data); + + msg = g_task_get_task_data (task); + bytes = soup_session_send_and_read_finish (session, result, &local_error); + + if (bytes == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + downloaded_data = g_bytes_get_data (bytes, &downloaded_data_length); + status_code = soup_message_get_status (msg); + + g_debug ("ODRS server returned status %u: %.*s", status_code, (gint) downloaded_data_length, (const gchar *) downloaded_data); + if (SOUP_STATUS_IS_SUCCESSFUL (status_code)) { + /* fall through */ + } else if (SOUP_STATUS_IS_CLIENT_ERROR (status_code)) { + g_set_error (&local_error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_CLIENT_ERROR, + "Failed to submit review to ODRS: %s", soup_status_get_phrase (status_code)); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } else { + g_set_error (&local_error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_SERVER_ERROR, + "Failed to submit review to ODRS: %s", soup_status_get_phrase (status_code)); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* process returned JSON */ + input_stream = g_memory_input_stream_new_from_data (downloaded_data, downloaded_data_length, NULL); + + if (!gs_odrs_provider_parse_success (input_stream, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static GPtrArray * +_gs_app_get_reviewable_ids (GsApp *app) +{ + GPtrArray *ids = g_ptr_array_new_with_free_func (g_free); + GPtrArray *provided = gs_app_get_provided (app); + + /* add the main component id */ + g_ptr_array_add (ids, g_strdup (gs_app_get_id (app))); + + /* add any ID provides */ + for (guint i = 0; i < provided->len; i++) { + GPtrArray *items; + AsProvided *prov = g_ptr_array_index (provided, i); + if (as_provided_get_kind (prov) != AS_PROVIDED_KIND_ID) + continue; + + items = as_provided_get_items (prov); + for (guint j = 0; j < items->len; j++) { + const gchar *value = (const gchar *) g_ptr_array_index (items, j); + guint k; + if (value == NULL) + continue; + for (k = 0; k < ids->len; k++) { + const gchar *existing_id = g_ptr_array_index (ids, k); + if (g_strcmp0 (existing_id, value) == 0) + break; + } + /* when `k` is less than `ids->len`, then a match was found, thus skip a duplicate */ + if (k == ids->len) + g_ptr_array_add (ids, g_strdup (value)); + } + } + return ids; +} + +static gboolean +gs_odrs_provider_refine_ratings (GsOdrsProvider *self, + GsApp *app, + GCancellable *cancellable, + GError **error) +{ + gint rating; + guint32 ratings_raw[6] = { 0, 0, 0, 0, 0, 0 }; + guint cnt = 0; + g_autoptr(GArray) review_ratings = NULL; + g_autoptr(GPtrArray) reviewable_ids = NULL; + g_autoptr(GMutexLocker) locker = NULL; + + /* get ratings for each reviewable ID */ + reviewable_ids = _gs_app_get_reviewable_ids (app); + + locker = g_mutex_locker_new (&self->ratings_mutex); + + if (!self->ratings) { + g_autofree gchar *cache_filename = NULL; + + g_clear_pointer (&locker, g_mutex_locker_free); + + /* Load from the local cache, if available, when in offline or + when refresh/download disabled on start */ + cache_filename = gs_utils_get_cache_filename ("odrs", + "ratings.json", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + error); + + if (!cache_filename) + return TRUE; + + if (!gs_odrs_provider_load_ratings (self, cache_filename, NULL)) { + g_autoptr(GFile) cache_file = g_file_new_for_path (cache_filename); + g_debug ("Failed to load cache file ‘%s’, deleting it", cache_filename); + g_file_delete (cache_file, NULL, NULL); + return TRUE; + } + + locker = g_mutex_locker_new (&self->ratings_mutex); + + if (!self->ratings) + return TRUE; + } + + for (guint i = 0; i < reviewable_ids->len; i++) { + const gchar *id = g_ptr_array_index (reviewable_ids, i); + const GsOdrsRating search_rating = { (gchar *) id, { 0, }}; + guint found_index; + const GsOdrsRating *found_rating; + + if (!g_array_binary_search (self->ratings, &search_rating, + (GCompareFunc) rating_compare, &found_index)) + continue; + + found_rating = &g_array_index (self->ratings, GsOdrsRating, found_index); + + /* copy into accumulator array */ + for (guint j = 0; j < 6; j++) + ratings_raw[j] += found_rating->n_star_ratings[j]; + cnt++; + } + if (cnt == 0) + return TRUE; + + /* Done with self->ratings now */ + g_clear_pointer (&locker, g_mutex_locker_free); + + /* merge to accumulator array back to one GArray blob */ + review_ratings = g_array_sized_new (FALSE, TRUE, sizeof(guint32), 6); + for (guint i = 0; i < 6; i++) + g_array_append_val (review_ratings, ratings_raw[i]); + gs_app_set_review_ratings (app, review_ratings); + + /* find the wilson rating */ + rating = gs_utils_get_wilson_rating (g_array_index (review_ratings, guint32, 1), + g_array_index (review_ratings, guint32, 2), + g_array_index (review_ratings, guint32, 3), + g_array_index (review_ratings, guint32, 4), + g_array_index (review_ratings, guint32, 5)); + if (rating > 0) + gs_app_set_rating (app, rating); + return TRUE; +} + +static JsonNode * +gs_odrs_provider_get_compat_ids (GsApp *app) +{ + GPtrArray *provided = gs_app_get_provided (app); + g_autoptr(GHashTable) ids = NULL; + g_autoptr(JsonArray) json_array = json_array_new (); + g_autoptr(JsonNode) json_node = json_node_new (JSON_NODE_ARRAY); + + ids = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); + for (guint i = 0; i < provided->len; i++) { + GPtrArray *items; + AsProvided *prov = g_ptr_array_index (provided, i); + + if (as_provided_get_kind (prov) != AS_PROVIDED_KIND_ID) + continue; + + items = as_provided_get_items (prov); + for (guint j = 0; j < items->len; j++) { + const gchar *value = g_ptr_array_index (items, j); + if (value == NULL) + continue; + + if (g_hash_table_add (ids, (gpointer) value)) + json_array_add_string_element (json_array, value); + } + } + if (json_array_get_length (json_array) == 0) + return NULL; + json_node_set_array (json_node, json_array); + return g_steal_pointer (&json_node); +} + +static void open_input_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void parse_reviews_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void set_reviews_on_app (GsOdrsProvider *self, + GsApp *app, + GPtrArray *reviews); + +typedef struct { + GsApp *app; /* (not nullable) (owned) */ + gchar *cache_filename; /* (not nullable) (owned) */ + SoupMessage *message; /* (nullable) (owned) */ +} FetchReviewsForAppData; + +static void +fetch_reviews_for_app_data_free (FetchReviewsForAppData *data) +{ + g_clear_object (&data->app); + g_free (data->cache_filename); + g_clear_object (&data->message); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (FetchReviewsForAppData, fetch_reviews_for_app_data_free) + +static void +gs_odrs_provider_fetch_reviews_for_app_async (GsOdrsProvider *self, + GsApp *app, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + JsonNode *json_compat_ids; + const gchar *version; + g_autofree gchar *cachefn_basename = NULL; + g_autofree gchar *cachefn = NULL; + g_autofree gchar *request_body = NULL; + g_autofree gchar *uri = NULL; + g_autoptr(GFile) cachefn_file = NULL; + g_autoptr(GPtrArray) reviews = NULL; + g_autoptr(JsonBuilder) builder = NULL; + g_autoptr(JsonParser) json_parser = NULL; + g_autoptr(JsonGenerator) json_generator = NULL; + g_autoptr(JsonNode) json_root = NULL; + g_autoptr(SoupMessage) msg = NULL; + g_autoptr(GTask) task = NULL; + FetchReviewsForAppData *data; + g_autoptr(FetchReviewsForAppData) data_owned = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_odrs_provider_fetch_reviews_for_app_async); + + data = data_owned = g_new0 (FetchReviewsForAppData, 1); + data->app = g_object_ref (app); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) fetch_reviews_for_app_data_free); + + /* look in the cache */ + cachefn_basename = g_strdup_printf ("%s.json", gs_app_get_id (app)); + cachefn = gs_utils_get_cache_filename ("odrs", + cachefn_basename, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &local_error); + if (cachefn == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + data->cache_filename = g_strdup (cachefn); + cachefn_file = g_file_new_for_path (cachefn); + if (gs_utils_get_file_age (cachefn_file) < self->max_cache_age_secs) { + g_debug ("got review data for %s from %s", + gs_app_get_id (app), cachefn); + + /* parse the data and find the array of ratings */ + json_parser = json_parser_new_immutable (); + if (!json_parser_load_from_mapped_file (json_parser, cachefn, &local_error)) { + g_task_return_new_error (task, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "Error parsing ODRS data: %s", local_error->message); + return; + } + + reviews = gs_odrs_provider_parse_reviews (self, json_parser, &local_error); + if (reviews == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + set_reviews_on_app (self, app, reviews); + g_task_return_boolean (task, TRUE); + } + + return; + } + + /* not always available */ + version = gs_app_get_version (app); + if (version == NULL) + version = "unknown"; + + /* create object with review data */ + builder = json_builder_new (); + json_builder_begin_object (builder); + json_builder_set_member_name (builder, "user_hash"); + json_builder_add_string_value (builder, self->user_hash); + json_builder_set_member_name (builder, "app_id"); + json_builder_add_string_value (builder, gs_app_get_id (app)); + json_builder_set_member_name (builder, "locale"); + json_builder_add_string_value (builder, setlocale (LC_MESSAGES, NULL)); + json_builder_set_member_name (builder, "distro"); + json_builder_add_string_value (builder, self->distro); + json_builder_set_member_name (builder, "version"); + json_builder_add_string_value (builder, version); + json_builder_set_member_name (builder, "limit"); + json_builder_add_int_value (builder, self->n_results_max); + json_compat_ids = gs_odrs_provider_get_compat_ids (app); + if (json_compat_ids != NULL) { + json_builder_set_member_name (builder, "compat_ids"); + json_builder_add_value (builder, json_compat_ids); + } + json_builder_end_object (builder); + + /* export as a string */ + json_root = json_builder_get_root (builder); + json_generator = json_generator_new (); + json_generator_set_pretty (json_generator, TRUE); + json_generator_set_root (json_generator, json_root); + request_body = json_generator_to_data (json_generator, NULL); + + uri = g_strdup_printf ("%s/fetch", self->review_server); + g_debug ("Updating ODRS cache for %s from %s to %s; request %s", gs_app_get_id (app), + uri, cachefn, request_body); + msg = soup_message_new (SOUP_METHOD_POST, uri); + data->message = g_object_ref (msg); + + g_odrs_provider_set_message_request_body (msg, "application/json; charset=utf-8", + request_body, strlen (request_body)); + soup_session_send_async (self->session, msg, G_PRIORITY_DEFAULT, + cancellable, open_input_stream_cb, g_steal_pointer (&task)); +} + +static void +open_input_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SoupSession *soup_session = SOUP_SESSION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + FetchReviewsForAppData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GInputStream) input_stream = NULL; + guint status_code; + g_autoptr(JsonParser) json_parser = NULL; + g_autoptr(GError) local_error = NULL; + gboolean json_response; + const char *content_type; + + input_stream = soup_session_send_finish (soup_session, result, &local_error); + + if (input_stream == NULL) { + if (!g_network_monitor_get_network_available (g_network_monitor_get_default ())) + g_task_return_new_error (task, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_NO_NETWORK, + "server couldn't be reached"); + else + g_task_return_new_error (task, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "server returned no data"); + return; + } + + status_code = soup_message_get_status (data->message); + content_type = soup_message_headers_get_content_type (soup_message_get_response_headers (data->message), NULL); + json_response = is_json_response (content_type); + + g_debug ("ODRS server returned status: %u, content-type: %s", status_code, content_type); + if (SOUP_STATUS_IS_SUCCESSFUL (status_code) && json_response) { + /* fall through */ + } else { + /* + * only try parsing HTTP client errors (e.g. HTTP/400 + * from ODRS server, which contains odrs error + * messages in json), not 5xx errors which are mostly + * from CDN network (which return html error pages) + */ + if (SOUP_STATUS_IS_CLIENT_ERROR (status_code) && json_response) { + if (!gs_odrs_provider_parse_success (input_stream, &local_error)) { + /* we received a valid json error from odrs */ + } else { + /* we should not reach here */ + g_set_error_literal (&local_error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_SERVER_ERROR, + "ODRS internal error while fetching review"); + } + } else { + /* + * if we're here it's an unexpected error, so + * we dump the stream to see what we received + * than trying to parse it as json. + */ + dump_input_stream (input_stream); + + if (SOUP_STATUS_IS_CLIENT_ERROR (status_code)) { + g_set_error (&local_error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_CLIENT_ERROR, + "Failed to fetch review from ODRS: %s", soup_status_get_phrase (status_code)); + } else { + g_set_error (&local_error, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_SERVER_ERROR, + "Failed to fetch review from ODRS: %s", soup_status_get_phrase (status_code)); + } + } + + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* parse the data and find the array of ratings */ + json_parser = json_parser_new_immutable (); + json_parser_load_from_stream_async (json_parser, input_stream, cancellable, parse_reviews_cb, g_steal_pointer (&task)); +} + +static void +parse_reviews_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + JsonParser *json_parser = JSON_PARSER (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsOdrsProvider *self = g_task_get_source_object (task); + FetchReviewsForAppData *data = g_task_get_task_data (task); + g_autoptr(GPtrArray) reviews = NULL; + g_autoptr(JsonGenerator) cache_generator = NULL; + g_autoptr(GError) local_error = NULL; + + if (!json_parser_load_from_stream_finish (json_parser, result, &local_error)) { + g_task_return_new_error (task, + GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "Error parsing ODRS data: %s", local_error->message); + return; + } + + reviews = gs_odrs_provider_parse_reviews (self, json_parser, &local_error); + if (reviews == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* save to the cache */ + cache_generator = json_generator_new (); + json_generator_set_pretty (cache_generator, FALSE); + json_generator_set_root (cache_generator, json_parser_get_root (json_parser)); + + if (!json_generator_to_file (cache_generator, data->cache_filename, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + set_reviews_on_app (self, data->app, reviews); + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static void +set_reviews_on_app (GsOdrsProvider *self, + GsApp *app, + GPtrArray *reviews) +{ + for (guint i = 0; i < reviews->len; i++) { + AsReview *review = g_ptr_array_index (reviews, i); + + /* save this on the app object so we can use it for + * submitting a new review */ + if (i == 0) { + gs_app_set_metadata (app, "ODRS::user_skey", + as_review_get_metadata_item (review, "user_skey")); + } + + /* ignore invalid reviews */ + if (as_review_get_rating (review) == 0) + continue; + + /* the user_hash matches, so mark this as our own review */ + if (g_strcmp0 (as_review_get_reviewer_id (review), + self->user_hash) == 0) { + as_review_set_flags (review, AS_REVIEW_FLAG_SELF); + } + gs_app_add_review (app, review); + } +} + +static gboolean +gs_odrs_provider_fetch_reviews_for_app_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gchar * +gs_odrs_provider_trim_version (const gchar *version) +{ + gchar *str; + gchar *tmp; + + /* nothing set */ + if (version == NULL) + return g_strdup ("unknown"); + + /* remove epoch */ + str = g_strrstr (version, ":"); + if (str != NULL) + version = str + 1; + + /* remove release */ + tmp = g_strdup (version); + g_strdelimit (tmp, "-", '\0'); + + /* remove '+dfsg' suffix */ + str = g_strstr_len (tmp, -1, "+dfsg"); + if (str != NULL) + *str = '\0'; + + return tmp; +} + +static gboolean +gs_odrs_provider_invalidate_cache (AsReview *review, GError **error) +{ + g_autofree gchar *cachefn_basename = NULL; + g_autofree gchar *cachefn = NULL; + g_autoptr(GFile) cachefn_file = NULL; + + /* look in the cache */ + cachefn_basename = g_strdup_printf ("%s.json", + as_review_get_metadata_item (review, "app_id")); + cachefn = gs_utils_get_cache_filename ("odrs", + cachefn_basename, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + error); + if (cachefn == NULL) + return FALSE; + cachefn_file = g_file_new_for_path (cachefn); + if (!g_file_query_exists (cachefn_file, NULL)) + return TRUE; + return g_file_delete (cachefn_file, NULL, error); +} + +static void +gs_odrs_provider_vote_async (GsOdrsProvider *self, + AsReview *review, + const gchar *uri, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + const gchar *tmp; + g_autofree gchar *data = NULL; + g_autoptr(JsonBuilder) builder = NULL; + g_autoptr(JsonGenerator) json_generator = NULL; + g_autoptr(JsonNode) json_root = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(JsonPostReviewData) task_data = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + + task_data = g_new0 (JsonPostReviewData, 1); + task_data->review = g_object_ref (review); + task_data->is_review_action = TRUE; + + g_task_set_source_tag (task, gs_odrs_provider_vote_async); + g_task_set_task_data (task, g_steal_pointer (&task_data), (GDestroyNotify) json_post_review_data_free); + + /* create object with vote data */ + builder = json_builder_new (); + json_builder_begin_object (builder); + + json_builder_set_member_name (builder, "user_hash"); + json_builder_add_string_value (builder, self->user_hash); + json_builder_set_member_name (builder, "user_skey"); + json_builder_add_string_value (builder, + as_review_get_metadata_item (review, "user_skey")); + json_builder_set_member_name (builder, "app_id"); + json_builder_add_string_value (builder, + as_review_get_metadata_item (review, "app_id")); + tmp = as_review_get_id (review); + if (tmp != NULL) { + gint64 review_id; + if (!g_ascii_string_to_signed (tmp, 10, 1, G_MAXINT64, &review_id, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + json_builder_set_member_name (builder, "review_id"); + json_builder_add_int_value (builder, review_id); + } + json_builder_end_object (builder); + + /* export as a string */ + json_root = json_builder_get_root (builder); + json_generator = json_generator_new (); + json_generator_set_pretty (json_generator, TRUE); + json_generator_set_root (json_generator, json_root); + data = json_generator_to_data (json_generator, NULL); + + if (data == NULL) { +#if GLIB_CHECK_VERSION(2, 80, 0) + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "No data to send to ODRS server"); +#else + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "%s", "No data to send to ODRS server"); +#endif + return; + } + + /* clear cache */ + if (!gs_odrs_provider_invalidate_cache (review, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* send to server */ + gs_odrs_provider_json_post_async (self->session, uri, data, cancellable, json_post_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_odrs_provider_vote_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_ODRS_PROVIDER (self), FALSE); + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_odrs_provider_vote_async, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +json_post_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GError) local_error = NULL; + g_autoptr(GTask) task = g_steal_pointer (&user_data); + JsonPostReviewData *data = g_task_get_task_data (task); + SoupSession *session = SOUP_SESSION (source_object); + + if (!gs_odrs_provider_json_post_finish (session, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (data->is_review_action) { + /* mark as voted */ + as_review_add_flags (data->review, AS_REVIEW_FLAG_VOTED); + } else { + /* modify the local app */ + gs_app_add_review (data->app, data->review); + } + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static void +gs_odrs_provider_init (GsOdrsProvider *self) +{ + g_mutex_init (&self->ratings_mutex); +} + +static void +gs_odrs_provider_constructed (GObject *object) +{ + GsOdrsProvider *self = GS_ODRS_PROVIDER (object); + + G_OBJECT_CLASS (gs_odrs_provider_parent_class)->constructed (object); + + /* Check all required properties have been set. */ + g_assert (self->review_server != NULL); + g_assert (self->user_hash != NULL); + g_assert (self->distro != NULL); +} + +static void +gs_odrs_provider_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsOdrsProvider *self = GS_ODRS_PROVIDER (object); + + switch ((GsOdrsProviderProperty) prop_id) { + case PROP_REVIEW_SERVER: + g_value_set_string (value, self->review_server); + break; + case PROP_USER_HASH: + g_value_set_string (value, self->user_hash); + break; + case PROP_DISTRO: + g_value_set_string (value, self->distro); + break; + case PROP_MAX_CACHE_AGE_SECS: + g_value_set_uint64 (value, self->max_cache_age_secs); + break; + case PROP_N_RESULTS_MAX: + g_value_set_uint (value, self->n_results_max); + break; + case PROP_SESSION: + g_value_set_object (value, self->session); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_odrs_provider_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsOdrsProvider *self = GS_ODRS_PROVIDER (object); + + switch ((GsOdrsProviderProperty) prop_id) { + case PROP_REVIEW_SERVER: + /* Construct-only */ + g_assert (self->review_server == NULL); + self->review_server = g_value_dup_string (value); + break; + case PROP_USER_HASH: + /* Construct-only */ + g_assert (self->user_hash == NULL); + self->user_hash = g_value_dup_string (value); + break; + case PROP_DISTRO: + /* Construct-only */ + g_assert (self->distro == NULL); + self->distro = g_value_dup_string (value); + break; + case PROP_MAX_CACHE_AGE_SECS: + /* Construct-only */ + g_assert (self->max_cache_age_secs == 0); + self->max_cache_age_secs = g_value_get_uint64 (value); + break; + case PROP_N_RESULTS_MAX: + /* Construct-only */ + g_assert (self->n_results_max == 0); + self->n_results_max = g_value_get_uint (value); + break; + case PROP_SESSION: + /* Construct-only */ + g_assert (self->session == NULL); + self->session = g_value_dup_object (value); +#if ODRS_SOUP_DEBUG == 1 + soup_session_add_feature (self->session, (SoupSessionFeature *) soup_logger_new (SOUP_LOGGER_LOG_BODY)); +#endif + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_odrs_provider_dispose (GObject *object) +{ + GsOdrsProvider *self = GS_ODRS_PROVIDER (object); + + g_clear_object (&self->session); + + G_OBJECT_CLASS (gs_odrs_provider_parent_class)->dispose (object); +} + +static void +gs_odrs_provider_finalize (GObject *object) +{ + GsOdrsProvider *self = GS_ODRS_PROVIDER (object); + + g_free (self->user_hash); + g_free (self->distro); + g_free (self->review_server); + g_clear_pointer (&self->ratings, g_array_unref); + g_mutex_clear (&self->ratings_mutex); + + G_OBJECT_CLASS (gs_odrs_provider_parent_class)->finalize (object); +} + +static void +gs_odrs_provider_class_init (GsOdrsProviderClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = gs_odrs_provider_constructed; + object_class->get_property = gs_odrs_provider_get_property; + object_class->set_property = gs_odrs_provider_set_property; + object_class->dispose = gs_odrs_provider_dispose; + object_class->finalize = gs_odrs_provider_finalize; + + /** + * GsOdrsProvider:review-server: (not nullable) + * + * The URI of the ODRS review server to contact. + * + * Since: 41 + */ + obj_props[PROP_REVIEW_SERVER] = + g_param_spec_string ("review-server", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); + + /** + * GsOdrsProvider:user-hash: (not nullable) + * + * An opaque hash of the user identifier, used to identify the user on + * the server. + * + * Since: 41 + */ + obj_props[PROP_USER_HASH] = + g_param_spec_string ("user-hash", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); + + /** + * GsOdrsProvider:distro: (not nullable) + * + * A human readable string identifying the current distribution. + * + * Since: 41 + */ + obj_props[PROP_DISTRO] = + g_param_spec_string ("distro", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); + + /** + * GsOdrsProvider:max-cache-age-secs: + * + * The maximum age of the ODRS cache files, in seconds. Older files will + * be refreshed on demand. + * + * Since: 41 + */ + obj_props[PROP_MAX_CACHE_AGE_SECS] = + g_param_spec_uint64 ("max-cache-age-secs", NULL, NULL, + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); + + /** + * GsOdrsProvider:n-results-max: + * + * Maximum number of reviews or ratings to download. The default value + * of 0 means no limit is applied. + * + * Since: 41 + */ + obj_props[PROP_N_RESULTS_MAX] = + g_param_spec_uint ("n-results-max", NULL, NULL, + 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); + + /** + * GsOdrsProvider:session: (not nullable) + * + * #SoupSession to use for downloading things. + * + * Since: 41 + */ + obj_props[PROP_SESSION] = + g_param_spec_object ("session", NULL, NULL, + SOUP_TYPE_SESSION, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +/** + * gs_odrs_provider_new: + * @review_server: (not nullable): value for #GsOdrsProvider:review-server + * @user_hash: (not nullable): value for #GsOdrsProvider:user-hash + * @distro: (not nullable): value for #GsOdrsProvider:distro + * @max_cache_age_secs: value for #GsOdrsProvider:max-cache-age-secs + * @n_results_max: value for #GsOdrsProvider:n-results-max + * @session: value for #GsOdrsProvider:session + * + * Create a new #GsOdrsProvider. This does no network activity. + * + * Returns: (transfer full): a new #GsOdrsProvider + * Since: 41 + */ +GsOdrsProvider * +gs_odrs_provider_new (const gchar *review_server, + const gchar *user_hash, + const gchar *distro, + guint64 max_cache_age_secs, + guint n_results_max, + SoupSession *session) +{ + g_return_val_if_fail (review_server != NULL && *review_server != '\0', NULL); + g_return_val_if_fail (user_hash != NULL && *user_hash != '\0', NULL); + g_return_val_if_fail (distro != NULL && *distro != '\0', NULL); + g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); + + return g_object_new (GS_TYPE_ODRS_PROVIDER, + "review-server", review_server, + "user-hash", user_hash, + "distro", distro, + "max-cache-age-secs", max_cache_age_secs, + "n-results-max", n_results_max, + "session", session, + NULL); +} + +static void download_ratings_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/** + * gs_odrs_provider_refresh_ratings_async: + * @self: a #GsOdrsProvider + * @cache_age_secs: cache age, in seconds, as passed to #GsPluginClass.refresh_metadata_async() + * @progress_callback: (nullable): callback to call with progress information + * @progress_user_data: (nullable) (closure progress_callback): data to pass + * to @progress_callback + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Refresh the cached ODRS ratings and re-load them asynchronously. + * + * Since: 42 + */ +void +gs_odrs_provider_refresh_ratings_async (GsOdrsProvider *self, + guint64 cache_age_secs, + GsDownloadProgressCallback progress_callback, + gpointer progress_user_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autofree gchar *cache_filename = NULL; + g_autoptr(GFile) cache_file = NULL; + g_autofree gchar *uri = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_odrs_provider_refresh_ratings_async); + + /* check cache age */ + cache_filename = gs_utils_get_cache_filename ("odrs", + "ratings.json", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &error_local); + if (cache_filename == NULL) { + g_task_return_error (task, g_steal_pointer (&error_local)); + return; + } + + cache_file = g_file_new_for_path (cache_filename); + g_task_set_task_data (task, g_object_ref (cache_file), g_object_unref); + + if (cache_age_secs > 0) { + guint64 tmp; + + tmp = gs_utils_get_file_age (cache_file); + if (tmp < cache_age_secs) { + g_debug ("%s is only %" G_GUINT64_FORMAT " seconds old, so ignoring refresh", + cache_filename, tmp); + if (!gs_odrs_provider_load_ratings (self, cache_filename, &error_local)) { + g_debug ("Failed to load cache file ‘%s’, deleting it", cache_filename); + g_file_delete (cache_file, NULL, NULL); + + g_task_return_error (task, g_steal_pointer (&error_local)); + } else { + g_task_return_boolean (task, TRUE); + } + return; + } + } + + /* download the complete file */ + uri = g_strdup_printf ("%s/ratings", self->review_server); + g_debug ("Updating ODRS cache from %s to %s", uri, cache_filename); + + gs_download_file_async (self->session, uri, cache_file, G_PRIORITY_LOW, + progress_callback, progress_user_data, + cancellable, download_ratings_cb, g_steal_pointer (&task)); +} + +static void +download_ratings_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SoupSession *soup_session = SOUP_SESSION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsOdrsProvider *self = g_task_get_source_object (task); + GFile *cache_file = g_task_get_task_data (task); + const gchar *cache_file_path = NULL; + g_autoptr(GError) local_error = NULL; + + if (!gs_download_file_finish (soup_session, result, &local_error) && + !g_error_matches (local_error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) { + g_task_return_new_error (task, GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_DOWNLOADING, + "%s", local_error->message); + return; + } + + g_clear_error (&local_error); + + cache_file_path = g_file_peek_path (cache_file); + if (!gs_odrs_provider_load_ratings (self, cache_file_path, &local_error)) { + g_debug ("Failed to load cache file ‘%s’, deleting it", cache_file_path); + g_file_delete (cache_file, NULL, NULL); + + g_task_return_new_error (task, GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + "%s", local_error->message); + } else { + g_task_return_boolean (task, TRUE); + } +} + +/** + * gs_odrs_provider_refresh_ratings_finish: + * @self: a #GsOdrsProvider + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous refresh operation started with + * gs_odrs_provider_refresh_ratings_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 42 + */ +gboolean +gs_odrs_provider_refresh_ratings_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_ODRS_PROVIDER (self), FALSE); + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_odrs_provider_refresh_ratings_async, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void refine_app_op (GsOdrsProvider *self, + GTask *task, + GsApp *app, + GsOdrsProviderRefineFlags flags, + GCancellable *cancellable); +static void refine_reviews_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_refine_op (GTask *task, + GError *error); + +typedef struct { + /* Input data. */ + GsAppList *list; /* (owned) (not nullable) */ + GsOdrsProviderRefineFlags flags; + + /* In-progress data. */ + guint n_pending_ops; + GError *error; /* (nullable) (owned) */ +} RefineData; + +static void +refine_data_free (RefineData *data) +{ + g_assert (data->n_pending_ops == 0); + + g_clear_object (&data->list); + g_clear_error (&data->error); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (RefineData, refine_data_free) + +/** + * gs_odrs_provider_refine_async: + * @self: a #GsOdrsProvider + * @list: list of apps to refine + * @flags: refine flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: callback for asynchronous completion + * @user_data: data to pass to @callback + * + * Asynchronously refine the given @list of apps to add ratings and review data + * to them, as specified in @flags. + * + * Since: 42 + */ +void +gs_odrs_provider_refine_async (GsOdrsProvider *self, + GsAppList *list, + GsOdrsProviderRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(RefineData) data = NULL; + RefineData *data_unowned = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_odrs_provider_refine_async); + + data_unowned = data = g_new0 (RefineData, 1); + data->list = g_object_ref (list); + data->flags = flags; + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) refine_data_free); + + if ((flags & (GS_ODRS_PROVIDER_REFINE_FLAGS_GET_RATINGS | + GS_ODRS_PROVIDER_REFINE_FLAGS_GET_REVIEWS)) == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + /* Mark one operation as pending while all the operations are started, + * so the overall operation can’t complete while things are still being + * started. */ + data_unowned->n_pending_ops++; + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + /* not valid */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_ADDON) + continue; + if (gs_app_get_id (app) == NULL) + continue; + + data_unowned->n_pending_ops++; + refine_app_op (self, task, app, flags, cancellable); + } + + finish_refine_op (task, NULL); +} + +static void +refine_app_op (GsOdrsProvider *self, + GTask *task, + GsApp *app, + GsOdrsProviderRefineFlags flags, + GCancellable *cancellable) +{ + g_autoptr(GError) local_error = NULL; + + /* add ratings if possible */ + if ((flags & GS_ODRS_PROVIDER_REFINE_FLAGS_GET_RATINGS) && + gs_app_get_review_ratings (app) == NULL) { + if (!gs_odrs_provider_refine_ratings (self, app, cancellable, &local_error)) { + if (g_error_matches (local_error, GS_ODRS_PROVIDER_ERROR, GS_ODRS_PROVIDER_ERROR_NO_NETWORK)) { + g_debug ("failed to refine app %s: %s", + gs_app_get_unique_id (app), local_error->message); + } else { + g_prefix_error (&local_error, "failed to refine app: "); + finish_refine_op (task, g_steal_pointer (&local_error)); + return; + } + } + } + + /* add reviews if possible */ + if ((flags & GS_ODRS_PROVIDER_REFINE_FLAGS_GET_REVIEWS) && + gs_app_get_reviews (app)->len == 0) { + /* get from server asynchronously */ + gs_odrs_provider_fetch_reviews_for_app_async (self, app, cancellable, refine_reviews_cb, g_object_ref (task)); + } else { + finish_refine_op (task, NULL); + } +} + +static void +refine_reviews_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsOdrsProvider *self = GS_ODRS_PROVIDER (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_odrs_provider_fetch_reviews_for_app_finish (self, result, &local_error)) { + if (g_error_matches (local_error, GS_ODRS_PROVIDER_ERROR, GS_ODRS_PROVIDER_ERROR_NO_NETWORK)) { + g_debug ("failed to refine app: %s", local_error->message); + } else { + g_prefix_error (&local_error, "failed to refine app: "); + finish_refine_op (task, g_steal_pointer (&local_error)); + return; + } + } + + finish_refine_op (task, NULL); +} + +/* @error is (transfer full) if non-NULL. */ +static void +finish_refine_op (GTask *task, + GError *error) +{ + RefineData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (data->error == NULL && error_owned != NULL) + data->error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while refining ODRS data: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops == 0) { + if (data->error != NULL) + g_task_return_error (task, g_steal_pointer (&data->error)); + else + g_task_return_boolean (task, TRUE); + } +} + +/** + * gs_odrs_provider_refine_finish: + * @self: a #GsOdrsProvider + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous refine operation started with + * gs_odrs_provider_refine_finish(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 42 + */ +gboolean +gs_odrs_provider_refine_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_ODRS_PROVIDER (self), FALSE); + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_odrs_provider_refine_async), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +/** + * gs_odrs_provider_submit_review_async: + * @self: a #GsOdrsProvider + * @app: the app being reviewed + * @review: the review + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Submit a new @review for @app asynchronously. + * + * Since: 48 + */ +void +gs_odrs_provider_submit_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autofree gchar *data = NULL; + g_autofree gchar *uri = NULL; + g_autofree gchar *version = NULL; + g_autoptr(JsonBuilder) builder = NULL; + g_autoptr(JsonGenerator) json_generator = NULL; + g_autoptr(JsonNode) json_root = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(JsonPostReviewData) task_data = NULL; + const gchar *user_skey = gs_app_get_metadata_item (app, "ODRS::user_skey"); + + /* save as we don't re-request the review from the server */ + as_review_add_flags (review, AS_REVIEW_FLAG_SELF); + as_review_set_reviewer_name (review, g_get_real_name ()); + as_review_add_metadata (review, "app_id", gs_app_get_id (app)); + if (user_skey) + as_review_add_metadata (review, "user_skey", user_skey); + + /* create object with review data */ + builder = json_builder_new (); + json_builder_begin_object (builder); + json_builder_set_member_name (builder, "user_hash"); + json_builder_add_string_value (builder, self->user_hash); + + /* When 'fetch' request for an app fails due to some io / + * server issues, we might not have the 'user_skey' + * available. So, we just ignore sending 'user_skey' to the + * server than crashing, as it's not a mandatory field for a + * 'submit' request. */ + if (user_skey) { + json_builder_set_member_name (builder, "user_skey"); + json_builder_add_string_value (builder, user_skey); + } + json_builder_set_member_name (builder, "app_id"); + json_builder_add_string_value (builder, + as_review_get_metadata_item (review, "app_id")); + json_builder_set_member_name (builder, "locale"); + json_builder_add_string_value (builder, setlocale (LC_MESSAGES, NULL)); + json_builder_set_member_name (builder, "distro"); + json_builder_add_string_value (builder, self->distro); + json_builder_set_member_name (builder, "version"); + version = gs_odrs_provider_trim_version (as_review_get_version (review)); + json_builder_add_string_value (builder, version); + json_builder_set_member_name (builder, "user_display"); + json_builder_add_string_value (builder, as_review_get_reviewer_name (review)); + json_builder_set_member_name (builder, "summary"); + json_builder_add_string_value (builder, as_review_get_summary (review)); + json_builder_set_member_name (builder, "description"); + json_builder_add_string_value (builder, as_review_get_description (review)); + json_builder_set_member_name (builder, "rating"); + json_builder_add_int_value (builder, as_review_get_rating (review)); + json_builder_end_object (builder); + + /* export as a string */ + json_root = json_builder_get_root (builder); + json_generator = json_generator_new (); + json_generator_set_pretty (json_generator, TRUE); + json_generator_set_root (json_generator, json_root); + data = json_generator_to_data (json_generator, NULL); + + task_data = g_new0 (JsonPostReviewData, 1); + task_data->app = g_object_ref (app); + task_data->review = g_object_ref (review); + task_data->is_review_action = FALSE; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_odrs_provider_submit_review_async); + g_task_set_task_data (task, g_steal_pointer (&task_data), (GDestroyNotify) json_post_review_data_free); + + /* clear cache */ + if (!gs_odrs_provider_invalidate_cache (review, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* POST */ + uri = g_strdup_printf ("%s/submit", self->review_server); + gs_odrs_provider_json_post_async (self->session, uri, data, cancellable, json_post_cb, g_steal_pointer (&task)); +} + +/** + * gs_odrs_provider_submit_review_finish: + * @self: a #GsOdrsProvider + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous submit operation started with + * gs_odrs_provider_submit_review_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * + * Since: 48 + */ +gboolean +gs_odrs_provider_submit_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_ODRS_PROVIDER (self), FALSE); + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_odrs_provider_submit_review_async, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +/** + * gs_odrs_provider_upvote_review_async: + * @self: a #GsOdrsProvider + * @app: the app whose review is being upvoted + * @review: the review to upvote + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Add one vote to @review on @app asynchronously. + * + * Since: 48 + */ +void +gs_odrs_provider_upvote_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autofree gchar *uri = NULL; + uri = g_strdup_printf ("%s/upvote", self->review_server); + gs_odrs_provider_vote_async (self, review, uri, cancellable, callback, user_data); +} + +/** + * gs_odrs_provider_upvote_review_finish: + * @self: a #GsOdrsProvider + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous upvote operation started with + * gs_odrs_provider_upvote_review_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * + * Since: 48 + */ +gboolean +gs_odrs_provider_upvote_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + return gs_odrs_provider_vote_finish (self, result, error); +} + +/** + * gs_odrs_provider_downvote_review_async: + * @self: a #GsOdrsProvider + * @app: the app whose review is being downvoted + * @review: the review to downvote + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Remove one vote from @review on @app asynchronously. + * + * Since: 48 + */ +void +gs_odrs_provider_downvote_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autofree gchar *uri = NULL; + uri = g_strdup_printf ("%s/downvote", self->review_server); + gs_odrs_provider_vote_async (self, review, uri, cancellable, callback, user_data); +} + +/** + * gs_odrs_provider_downvote_review_finish: + * @self: a #GsOdrsProvider + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous downvote operation started with + * gs_odrs_provider_downvote_review_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * + * Since: 48 + */ +gboolean +gs_odrs_provider_downvote_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + return gs_odrs_provider_vote_finish (self, result, error); +} + +/** + * gs_odrs_provider_report_review_async: + * @self: a #GsOdrsProvider + * @app: the app whose review is being reported + * @review: the review to report + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Report the given @review on @app for being incorrect or breaking the code of + * conduct asynchronously. + * + * Since: 48 + */ +void +gs_odrs_provider_report_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autofree gchar *uri = NULL; + uri = g_strdup_printf ("%s/report", self->review_server); + gs_odrs_provider_vote_async (self, review, uri, cancellable, callback, user_data); +} + +/** + * gs_odrs_provider_report_review_finish: + * @self: a #GsOdrsProvider + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous report operation started with + * gs_odrs_provider_report_review_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * + * Since: 48 + */ +gboolean +gs_odrs_provider_report_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + return gs_odrs_provider_vote_finish (self, result, error); +} + +/** + * gs_odrs_provider_remove_review_async: + * @self: a #GsOdrsProvider + * @app: the app whose review is being removed + * @review: the review to remove + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Remove a @review written by the user, from @app asynchronously. + * + * Since: 48 + */ +void +gs_odrs_provider_remove_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autofree gchar *uri = NULL; + uri = g_strdup_printf ("%s/remove", self->review_server); + gs_odrs_provider_vote_async (self, review, uri, cancellable, callback, user_data); +} + +/** + * gs_odrs_provider_remove_review_finish: + * @self: a #GsOdrsProvider + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous remove operation started with + * gs_odrs_provider_remove_review_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * + * Since: 48 + */ +gboolean +gs_odrs_provider_remove_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error) +{ + return gs_odrs_provider_vote_finish (self, result, error); +} diff --git a/lib/gs-odrs-provider.h b/lib/gs-odrs-provider.h new file mode 100644 index 0000000..d96ee1e --- /dev/null +++ b/lib/gs-odrs-provider.h @@ -0,0 +1,137 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app-list.h" +#include "gs-download-utils.h" + +G_BEGIN_DECLS + +/** + * GsOdrsProviderError: + * @GS_ODRS_PROVIDER_ERROR_DOWNLOADING: Error while downloading ODRS data. + * @GS_ODRS_PROVIDER_ERROR_PARSING_DATA: Problem parsing downloaded ODRS data. + * @GS_ODRS_PROVIDER_ERROR_NO_NETWORK: Offline or network unavailable. + * @GS_ODRS_PROVIDER_ERROR_SERVER_ERROR: Server returned an error. + * @GS_ODRS_PROVIDER_ERROR_CLIENT_ERROR: Client made an invalid submission, + * such as upvoting a review twice. (Since: 48) + * + * Error codes for #GsOdrsProvider. + * + * Since: 42 + */ +typedef enum { + GS_ODRS_PROVIDER_ERROR_DOWNLOADING, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA, + GS_ODRS_PROVIDER_ERROR_NO_NETWORK, + GS_ODRS_PROVIDER_ERROR_SERVER_ERROR, + GS_ODRS_PROVIDER_ERROR_CLIENT_ERROR, +} GsOdrsProviderError; + +#define GS_ODRS_PROVIDER_ERROR gs_odrs_provider_error_quark () +GQuark gs_odrs_provider_error_quark (void); + +/** + * GsOdrsProviderRefineFlags: + * @GS_ODRS_PROVIDER_REFINE_FLAGS_GET_RATINGS: Get the numerical ratings for the app. + * @GS_ODRS_PROVIDER_REFINE_FLAGS_GET_REVIEWS: Get the written reviews for the app. + * + * The flags for refining apps to get their reviews or ratings. + * + * Since: 42 + */ +typedef enum { + GS_ODRS_PROVIDER_REFINE_FLAGS_GET_RATINGS = (1 << 0), + GS_ODRS_PROVIDER_REFINE_FLAGS_GET_REVIEWS = (1 << 1), +} GsOdrsProviderRefineFlags; + +#define GS_TYPE_ODRS_PROVIDER (gs_odrs_provider_get_type ()) + +G_DECLARE_FINAL_TYPE (GsOdrsProvider, gs_odrs_provider, GS, ODRS_PROVIDER, GObject) + +GsOdrsProvider *gs_odrs_provider_new (const gchar *review_server, + const gchar *user_hash, + const gchar *distro, + guint64 max_cache_age_secs, + guint n_results_max, + SoupSession *session); + +void gs_odrs_provider_refresh_ratings_async (GsOdrsProvider *self, + guint64 cache_age_secs, + GsDownloadProgressCallback progress_callback, + gpointer progress_user_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_odrs_provider_refresh_ratings_finish(GsOdrsProvider *self, + GAsyncResult *result, + GError **error); + +void gs_odrs_provider_refine_async (GsOdrsProvider *self, + GsAppList *list, + GsOdrsProviderRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_odrs_provider_refine_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error); + +void gs_odrs_provider_submit_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_odrs_provider_submit_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error); +void gs_odrs_provider_upvote_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_odrs_provider_upvote_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error); +void gs_odrs_provider_downvote_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_odrs_provider_downvote_review_finish(GsOdrsProvider *self, + GAsyncResult *result, + GError **error); +void gs_odrs_provider_report_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_odrs_provider_report_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error); +void gs_odrs_provider_remove_review_async (GsOdrsProvider *self, + GsApp *app, + AsReview *review, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_odrs_provider_remove_review_finish (GsOdrsProvider *self, + GAsyncResult *result, + GError **error); +G_END_DECLS diff --git a/lib/gs-os-release.c b/lib/gs-os-release.c new file mode 100644 index 0000000..1e9bd19 --- /dev/null +++ b/lib/gs-os-release.c @@ -0,0 +1,408 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Kalev Lember + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +/** + * SECTION:gs-os-release + * @title: GsOsRelease + * @include: gnome-software.h + * @stability: Unstable + * @short_description: Data from os-release + * + * This object allows plugins to parse /etc/os-release for distribution + * metadata information. + */ + +#include "config.h" + +#include + +#include "gs-os-release.h" + +struct _GsOsRelease +{ + GObject parent_instance; + gchar *name; + gchar *version; + gchar *id; + gchar **id_like; + gchar *version_id; + gchar *pretty_name; + gchar *cpe_name; + gchar *distro_codename; + gchar *home_url; + gchar *logo; + gchar *vendor_name; +}; + +static void gs_os_release_initable_iface_init (GInitableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GsOsRelease, gs_os_release, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_INITABLE, gs_os_release_initable_iface_init)) + +static void +gs_os_release_set_string_nonempty (gchar **inout_string, + const gchar *value) +{ + if (*inout_string == value) + return; + + g_clear_pointer (inout_string, g_free); + if (value != NULL && *value != '\0') + *inout_string = g_strdup (value); +} + +static gboolean +gs_os_release_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GsOsRelease *os_release = GS_OS_RELEASE (initable); + const gchar *filename; + g_autofree gchar *data = NULL; + g_auto(GStrv) lines = NULL; + guint i; + + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + /* get contents */ + filename = g_getenv ("GS_SELF_TEST_OS_RELEASE_FILENAME"); + if (filename == NULL) { + filename = "/etc/os-release"; + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) + filename = "/usr/lib/os-release"; + } + if (!g_file_get_contents (filename, &data, NULL, error)) + return FALSE; + + /* parse */ + lines = g_strsplit (data, "\n", -1); + for (i = 0; lines[i] != NULL; i++) { + gchar *tmp; + + /* split the line up into two halves */ + tmp = g_strstr_len (lines[i], -1, "="); + if (tmp == NULL) + continue; + *tmp = '\0'; + tmp++; + + /* ignore trailing quote */ + if (tmp[0] == '\"') + tmp++; + + /* ignore trailing quote */ + g_strdelimit (tmp, "\"", '\0'); + + /* match fields we're interested in */ + if (g_strcmp0 (lines[i], "NAME") == 0) { + gs_os_release_set_string_nonempty (&os_release->name, tmp); + continue; + } + if (g_strcmp0 (lines[i], "VERSION") == 0) { + gs_os_release_set_string_nonempty (&os_release->version, tmp); + continue; + } + if (g_strcmp0 (lines[i], "ID") == 0) { + gs_os_release_set_string_nonempty (&os_release->id, tmp); + continue; + } + if (g_strcmp0 (lines[i], "ID_LIKE") == 0) { + if (os_release->id_like != NULL) + g_strfreev (os_release->id_like); + os_release->id_like = g_strsplit (tmp, " ", 0); + continue; + } + if (g_strcmp0 (lines[i], "VERSION_ID") == 0) { + gs_os_release_set_string_nonempty (&os_release->version_id, tmp); + continue; + } + if (g_strcmp0 (lines[i], "PRETTY_NAME") == 0) { + gs_os_release_set_string_nonempty (&os_release->pretty_name, tmp); + continue; + } + if (g_strcmp0 (lines[i], "CPE_NAME") == 0) { + gs_os_release_set_string_nonempty (&os_release->cpe_name, tmp); + continue; + } + if (g_strcmp0 (lines[i], "UBUNTU_CODENAME") == 0) { + gs_os_release_set_string_nonempty (&os_release->distro_codename, tmp); + continue; + } + if (g_strcmp0 (lines[i], "HOME_URL") == 0) { + gs_os_release_set_string_nonempty (&os_release->home_url, tmp); + continue; + } + if (g_strcmp0 (lines[i], "LOGO") == 0) { + gs_os_release_set_string_nonempty (&os_release->logo, tmp); + continue; + } + if (g_strcmp0 (lines[i], "VENDOR_NAME") == 0) { + gs_os_release_set_string_nonempty (&os_release->vendor_name, tmp); + continue; + } + } + return TRUE; +} + +/** + * gs_os_release_get_name: + * @os_release: A #GsOsRelease + * + * Gets the name from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_os_release_get_name (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->name; +} + +/** + * gs_os_release_get_version: + * @os_release: A #GsOsRelease + * + * Gets the version from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_os_release_get_version (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->version; +} + +/** + * gs_os_release_get_id: + * @os_release: A #GsOsRelease + * + * Gets the ID from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_os_release_get_id (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->id; +} + +/** + * gs_os_release_get_id_like: + * @os_release: A #GsOsRelease + * + * Gets the ID_LIKE from the os-release parser. This is a list of operating + * systems that are "closely related" to the local operating system, possibly + * by being a derivative distribution. + * + * Returns: a %NULL terminated list + * + * Since: 3.26.2 + **/ +const gchar * const * +gs_os_release_get_id_like (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return (const gchar * const *) os_release->id_like; +} + +/** + * gs_os_release_get_version_id: + * @os_release: A #GsOsRelease + * + * Gets the version ID from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_os_release_get_version_id (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->version_id; +} + +/** + * gs_os_release_get_pretty_name: + * @os_release: A #GsOsRelease + * + * Gets the pretty name from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_os_release_get_pretty_name (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->pretty_name; +} + +/** + * gs_os_release_get_cpe_name: + * @os_release: A #GsOsRelease + * + * Gets the pretty name from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_os_release_get_cpe_name (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->cpe_name; +} + +/** + * gs_os_release_get_distro_codename: + * @os_release: A #GsOsRelease + * + * Gets the distro codename from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_os_release_get_distro_codename (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->distro_codename; +} + +/** + * gs_os_release_get_home_url: + * @os_release: A #GsOsRelease + * + * Gets the home URL from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 3.22 + **/ +const gchar * +gs_os_release_get_home_url (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->home_url; +} + +/** + * gs_os_release_get_logo: + * @os_release: A #GsOsRelease + * + * Gets the logo icon name from the os-release parser. + * + * Returns: a string, or %NULL + * + * Since: 44 + **/ +const gchar * +gs_os_release_get_logo (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->logo; +} + +/** + * gs_os_release_get_vendor_name: + * @os_release: A #GsOsRelease + * + * Gets the vendor name from the os-release parser. + * + * Returns: (nullable): a string, or %NULL + * + * Since: 47 + **/ +const gchar * +gs_os_release_get_vendor_name (GsOsRelease *os_release) +{ + g_return_val_if_fail (GS_IS_OS_RELEASE (os_release), NULL); + return os_release->vendor_name; +} + +static void +gs_os_release_finalize (GObject *object) +{ + GsOsRelease *os_release = GS_OS_RELEASE (object); + g_free (os_release->name); + g_free (os_release->version); + g_free (os_release->id); + g_strfreev (os_release->id_like); + g_free (os_release->version_id); + g_free (os_release->pretty_name); + g_free (os_release->cpe_name); + g_free (os_release->distro_codename); + g_free (os_release->home_url); + g_free (os_release->logo); + g_free (os_release->vendor_name); + + G_OBJECT_CLASS (gs_os_release_parent_class)->finalize (object); +} + +static void +gs_os_release_class_init (GsOsReleaseClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_os_release_finalize; +} + +static void +gs_os_release_initable_iface_init (GInitableIface *iface) +{ + iface->init = gs_os_release_initable_init; +} + +static void +gs_os_release_init (GsOsRelease *os_release) +{ +} + +/** + * gs_os_release_new: + * @error: a #GError, or %NULL + * + * Returns a new reference to a #GsOsRelease. The information may be cached. + * + * Returns: (transfer full): A new reference to a #GsOsRelease, or %NULL for error + * + * Since: 3.22 + **/ +GsOsRelease * +gs_os_release_new (GError **error) +{ + static gsize initialised = 0; + static GsOsRelease *os_release = NULL; + static GError *os_release_error = NULL; + + if (g_once_init_enter (&initialised)) { + os_release = g_initable_new (GS_TYPE_OS_RELEASE, NULL, &os_release_error, NULL); + g_once_init_leave (&initialised, 1); + } + + if (os_release != NULL) { + return g_object_ref (os_release); + } else { + g_propagate_error (error, g_error_copy (os_release_error)); + return NULL; + } +} diff --git a/lib/gs-os-release.h b/lib/gs-os-release.h new file mode 100644 index 0000000..6d52ecd --- /dev/null +++ b/lib/gs-os-release.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Kalev Lember + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#pragma once + +#include + +#include "gs-app.h" + +G_BEGIN_DECLS + +#define GS_TYPE_OS_RELEASE (gs_os_release_get_type ()) + +G_DECLARE_FINAL_TYPE (GsOsRelease, gs_os_release, GS, OS_RELEASE, GObject) + +GsOsRelease *gs_os_release_new (GError **error); +const gchar *gs_os_release_get_name (GsOsRelease *os_release); +const gchar *gs_os_release_get_version (GsOsRelease *os_release); +const gchar *gs_os_release_get_id (GsOsRelease *os_release); +const gchar * const *gs_os_release_get_id_like (GsOsRelease *os_release); +const gchar *gs_os_release_get_version_id (GsOsRelease *os_release); +const gchar *gs_os_release_get_pretty_name (GsOsRelease *os_release); +const gchar *gs_os_release_get_cpe_name (GsOsRelease *os_release); +const gchar *gs_os_release_get_distro_codename (GsOsRelease *os_release); +const gchar *gs_os_release_get_home_url (GsOsRelease *os_release); +const gchar *gs_os_release_get_logo (GsOsRelease *os_release); +const gchar *gs_os_release_get_vendor_name (GsOsRelease *os_release); + +G_END_DECLS diff --git a/lib/gs-plugin-event.c b/lib/gs-plugin-event.c new file mode 100644 index 0000000..ea03370 --- /dev/null +++ b/lib/gs-plugin-event.c @@ -0,0 +1,453 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * Copyright (C) 2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-event + * @title: GsPluginEvent + * @include: gnome-software.h + * @stability: Unstable + * @short_description: Information about a plugin event + * + * These functions provide a way for plugins to tell the UI layer about events + * that may require displaying to the user. Plugins should not assume that a + * specific event is actually shown to the user as it may be ignored + * automatically. + */ + +#include "config.h" + +#include + +#include "gs-enums.h" +#include "gs-plugin-private.h" +#include "gs-plugin-event.h" +#include "gs-plugin-job.h" +#include "gs-utils.h" + +struct _GsPluginEvent +{ + GObject parent_instance; + GsApp *app; + GsApp *origin; + GsPluginAction action; + GsPluginJob *job; /* (owned) (nullable) */ + GError *error; + GsPluginEventFlag flags; + gchar *unique_id; +}; + +G_DEFINE_TYPE (GsPluginEvent, gs_plugin_event, G_TYPE_OBJECT) + +typedef enum { + PROP_APP = 1, + PROP_ORIGIN, + PROP_ACTION, + PROP_JOB, + PROP_ERROR, +} GsPluginEventProperty; + +static GParamSpec *props[PROP_ERROR + 1] = { NULL, }; + +/** + * gs_plugin_event_get_app: + * @event: A #GsPluginEvent + * + * Gets an app that created the event. + * + * Returns: (transfer none): a #GsApp, or %NULL if unset + * + * Since: 3.22 + **/ +GsApp * +gs_plugin_event_get_app (GsPluginEvent *event) +{ + g_return_val_if_fail (GS_IS_PLUGIN_EVENT (event), NULL); + return event->app; +} + +/** + * gs_plugin_event_get_origin: + * @event: A #GsPluginEvent + * + * Gets an origin that created the event. + * + * Returns: (transfer none): a #GsApp, or %NULL if unset + * + * Since: 3.22 + **/ +GsApp * +gs_plugin_event_get_origin (GsPluginEvent *event) +{ + g_return_val_if_fail (GS_IS_PLUGIN_EVENT (event), NULL); + return event->origin; +} + +/** + * gs_plugin_event_get_action: + * @event: A #GsPluginEvent + * + * Gets an action that created the event. + * + * Returns: (transfer none): a #GsPluginAction + * + * Since: 3.22 + **/ +GsPluginAction +gs_plugin_event_get_action (GsPluginEvent *event) +{ + g_return_val_if_fail (GS_IS_PLUGIN_EVENT (event), 0); + return event->action; +} + +/** + * gs_plugin_event_get_job: + * @event: A #GsPluginEvent + * + * Gets the job that created the event. + * + * Returns: (transfer none) (nullable): a #GsPluginJob + * + * Since: 42 + **/ +GsPluginJob * +gs_plugin_event_get_job (GsPluginEvent *event) +{ + g_return_val_if_fail (GS_IS_PLUGIN_EVENT (event), NULL); + return event->job; +} + +/** + * gs_plugin_event_get_unique_id: + * @event: A #GsPluginEvent + * + * Gets the unique ID for the event. In most cases (if an app has been set) + * this will just be the actual #GsApp unique-id. In the cases where only error + * has been set a virtual (but plausible) ID will be generated. + * + * Returns: a string, or %NULL for invalid + * + * Since: 3.22 + **/ +const gchar * +gs_plugin_event_get_unique_id (GsPluginEvent *event) +{ + /* just proxy */ + if (event->origin != NULL && + gs_app_get_unique_id (event->origin) != NULL) { + return gs_app_get_unique_id (event->origin); + } + if (event->app != NULL && + gs_app_get_unique_id (event->app) != NULL) { + return gs_app_get_unique_id (event->app); + } + + /* generate from error */ + if (event->error != NULL) { + if (event->unique_id == NULL) { + g_autofree gchar *id = NULL; + id = g_strdup_printf ("%s.error", + gs_plugin_error_to_string (event->error->code)); + event->unique_id = gs_utils_build_unique_id (AS_COMPONENT_SCOPE_UNKNOWN, + AS_BUNDLE_KIND_UNKNOWN, + NULL, + id, + NULL); + } + return event->unique_id; + } + + /* failed */ + return NULL; +} + +/** + * gs_plugin_event_get_kind: + * @event: A #GsPluginEvent + * @flag: A #GsPluginEventFlag, e.g. %GS_PLUGIN_EVENT_FLAG_INVALID + * + * Adds a flag to the event. + * + * Since: 3.22 + **/ +void +gs_plugin_event_add_flag (GsPluginEvent *event, GsPluginEventFlag flag) +{ + g_return_if_fail (GS_IS_PLUGIN_EVENT (event)); + event->flags |= flag; +} + +/** + * gs_plugin_event_set_kind: + * @event: A #GsPluginEvent + * @flag: A #GsPluginEventFlag, e.g. %GS_PLUGIN_EVENT_FLAG_INVALID + * + * Removes a flag from the event. + * + * Since: 3.22 + **/ +void +gs_plugin_event_remove_flag (GsPluginEvent *event, GsPluginEventFlag flag) +{ + g_return_if_fail (GS_IS_PLUGIN_EVENT (event)); + event->flags &= ~flag; +} + +/** + * gs_plugin_event_has_flag: + * @event: A #GsPluginEvent + * @flag: A #GsPluginEventFlag, e.g. %GS_PLUGIN_EVENT_FLAG_INVALID + * + * Finds out if the event has a specific flag. + * + * Returns: %TRUE if the flag is set + * + * Since: 3.22 + **/ +gboolean +gs_plugin_event_has_flag (GsPluginEvent *event, GsPluginEventFlag flag) +{ + g_return_val_if_fail (GS_IS_PLUGIN_EVENT (event), FALSE); + return ((event->flags & flag) > 0); +} + +/** + * gs_plugin_event_get_error: + * @event: A #GsPluginEvent + * + * Gets the event error. + * + * Returns: a #GError, or %NULL for unset + * + * Since: 3.22 + **/ +const GError * +gs_plugin_event_get_error (GsPluginEvent *event) +{ + return event->error; +} + +static void +gs_plugin_event_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginEvent *self = GS_PLUGIN_EVENT (object); + + switch ((GsPluginEventProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, self->app); + break; + case PROP_ORIGIN: + g_value_set_object (value, self->origin); + break; + case PROP_ACTION: + g_value_set_enum (value, self->action); + break; + case PROP_JOB: + g_value_set_object (value, self->job); + break; + case PROP_ERROR: + g_value_set_boxed (value, self->error); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_event_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginEvent *self = GS_PLUGIN_EVENT (object); + + switch ((GsPluginEventProperty) prop_id) { + case PROP_APP: + /* Construct only. */ + g_assert (self->app == NULL); + self->app = g_value_dup_object (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_ORIGIN: + /* Construct only. */ + g_assert (self->origin == NULL); + self->origin = g_value_dup_object (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_ACTION: + /* Construct only. */ + g_assert (self->action == GS_PLUGIN_ACTION_UNKNOWN); + self->action = g_value_get_enum (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_JOB: + /* Construct only. */ + g_assert (self->job == NULL); + self->job = g_value_dup_object (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_ERROR: + /* Construct only. */ + g_assert (self->error == NULL); + self->error = g_value_dup_boxed (value); + if (self->error) { + /* Just in case the caller left there any D-Bus remote error notes */ + g_dbus_error_strip_remote_error (self->error); + } + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_event_dispose (GObject *object) +{ + GsPluginEvent *event = GS_PLUGIN_EVENT (object); + + g_clear_object (&event->app); + g_clear_object (&event->origin); + g_clear_object (&event->job); + + G_OBJECT_CLASS (gs_plugin_event_parent_class)->dispose (object); +} + +static void +gs_plugin_event_finalize (GObject *object) +{ + GsPluginEvent *event = GS_PLUGIN_EVENT (object); + + g_clear_error (&event->error); + g_free (event->unique_id); + + G_OBJECT_CLASS (gs_plugin_event_parent_class)->finalize (object); +} + +static void +gs_plugin_event_class_init (GsPluginEventClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gs_plugin_event_get_property; + object_class->set_property = gs_plugin_event_set_property; + object_class->dispose = gs_plugin_event_dispose; + object_class->finalize = gs_plugin_event_finalize; + + /** + * GsPluginEvent:app: (nullable) + * + * The application (or source, or whatever component) that caused the + * event to be created. + * + * Since: 42 + */ + props[PROP_APP] = + g_param_spec_object ("app", "App", + "The application (or source, or whatever component) that caused the event to be created.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginEvent:origin: (nullable) + * + * The origin that caused the event to be created. + * + * Since: 42 + */ + props[PROP_ORIGIN] = + g_param_spec_object ("origin", "Origin", + "The origin that caused the event to be created.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginEvent:action: + * + * The action that caused the event to be created. + * + * Since: 42 + */ + props[PROP_ACTION] = + g_param_spec_enum ("action", "Action", + "The action that caused the event to be created.", + GS_TYPE_PLUGIN_ACTION, GS_PLUGIN_ACTION_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginEvent:job: (nullable) + * + * The job that caused the event to be created. + * + * Since: 42 + */ + props[PROP_JOB] = + g_param_spec_object ("job", "Job", + "The job that caused the event to be created.", + GS_TYPE_PLUGIN_JOB, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginEvent:error: (nullable) + * + * The error the event is reporting. + * + * Since: 42 + */ + props[PROP_ERROR] = + g_param_spec_boxed ("error", "Error", + "The error the event is reporting.", + G_TYPE_ERROR, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_event_init (GsPluginEvent *event) +{ +} + +/** + * gs_plugin_event_new: + * @first_property_name: the name of the first property + * @...: the value of the first property, followed by zero or more pairs of + * property name/value pairs, then %NULL + * + * Creates a new event. + * + * The arguments are as for g_object_new(): property name/value pairs to set + * the properties of the event. + * + * Returns: (transfer full): A newly allocated #GsPluginEvent + * + * Since: 42 + **/ +GsPluginEvent * +gs_plugin_event_new (const gchar *first_property_name, + ...) +{ + GsPluginEvent *event; + va_list args; + + va_start (args, first_property_name); + event = GS_PLUGIN_EVENT (g_object_new_valist (GS_TYPE_PLUGIN_EVENT, first_property_name, args)); + va_end (args); + + return GS_PLUGIN_EVENT (event); +} diff --git a/lib/gs-plugin-event.h b/lib/gs-plugin-event.h new file mode 100644 index 0000000..a970dd8 --- /dev/null +++ b/lib/gs-plugin-event.h @@ -0,0 +1,61 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-app.h" +#include "gs-plugin-types.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_EVENT (gs_plugin_event_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginEvent, gs_plugin_event, GS, PLUGIN_EVENT, GObject) + +typedef struct _GsPluginJob GsPluginJob; + +/** + * GsPluginEventFlag: + * @GS_PLUGIN_EVENT_FLAG_NONE: No special flags set + * @GS_PLUGIN_EVENT_FLAG_INVALID: Event is no longer valid, e.g. was dismissed + * @GS_PLUGIN_EVENT_FLAG_VISIBLE: Event is is visible on the screen + * @GS_PLUGIN_EVENT_FLAG_WARNING: Event should be shown with more urgency + * @GS_PLUGIN_EVENT_FLAG_INTERACTIVE: The plugin job was created with interactive=True + * + * Any flags an event can have. + **/ +typedef enum { + GS_PLUGIN_EVENT_FLAG_NONE = 0, /* Since: 3.22 */ + GS_PLUGIN_EVENT_FLAG_INVALID = 1 << 0, /* Since: 3.22 */ + GS_PLUGIN_EVENT_FLAG_VISIBLE = 1 << 1, /* Since: 3.22 */ + GS_PLUGIN_EVENT_FLAG_WARNING = 1 << 2, /* Since: 3.22 */ + GS_PLUGIN_EVENT_FLAG_INTERACTIVE = 1 << 3, /* Since: 3.30 */ + GS_PLUGIN_EVENT_FLAG_LAST /*< skip >*/ +} GsPluginEventFlag; + +GsPluginEvent *gs_plugin_event_new (const gchar *first_property_name, + ...) G_GNUC_NULL_TERMINATED; + +const gchar *gs_plugin_event_get_unique_id (GsPluginEvent *event); + +GsApp *gs_plugin_event_get_app (GsPluginEvent *event); +GsApp *gs_plugin_event_get_origin (GsPluginEvent *event); +GsPluginAction gs_plugin_event_get_action (GsPluginEvent *event); +GsPluginJob *gs_plugin_event_get_job (GsPluginEvent *event); +const GError *gs_plugin_event_get_error (GsPluginEvent *event); + +void gs_plugin_event_add_flag (GsPluginEvent *event, + GsPluginEventFlag flag); +void gs_plugin_event_remove_flag (GsPluginEvent *event, + GsPluginEventFlag flag); +gboolean gs_plugin_event_has_flag (GsPluginEvent *event, + GsPluginEventFlag flag); + +G_END_DECLS diff --git a/lib/gs-plugin-helpers.c b/lib/gs-plugin-helpers.c new file mode 100644 index 0000000..8ef6f47 --- /dev/null +++ b/lib/gs-plugin-helpers.c @@ -0,0 +1,1010 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-helpers + * @short_description: Helpers for storing call closures for #GsPlugin vfuncs + * + * The helpers in this file each create a context structure to store the + * arguments passed to a standard #GsPlugin vfunc. + * + * These are intended to be used by plugin implementations to easily create + * #GTasks for handling #GsPlugin vfunc calls, without all having to write the + * same code to create a structure to wrap the vfunc arguments. + * + * Since: 42 + */ + +#include "config.h" + +#include +#include + +#include "gs-plugin-helpers.h" + +/** + * gs_plugin_refine_data_new: + * @list: list of #GsApps to refine + * @flags: refine flags + * + * Context data for a call to #GsPluginClass.refine_async. + * + * Returns: (transfer full): context data structure + * Since: 42 + */ +GsPluginRefineData * +gs_plugin_refine_data_new (GsAppList *list, + GsPluginRefineFlags flags) +{ + g_autoptr(GsPluginRefineData) data = g_new0 (GsPluginRefineData, 1); + data->list = g_object_ref (list); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_refine_data_new_task: + * @source_object: task source object + * @list: list of #GsApps to refine + * @flags: refine flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a refine operation with the given arguments. The task + * data will be set to a #GsPluginRefineData containing the given context. + * + * This is essentially a combination of gs_plugin_refine_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 42 + */ +GTask * +gs_plugin_refine_data_new_task (gpointer source_object, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_refine_data_new (list, flags), (GDestroyNotify) gs_plugin_refine_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_refine_data_free: + * @data: (transfer full): a #GsPluginRefineData + * + * Free the given @data. + * + * Since: 42 + */ +void +gs_plugin_refine_data_free (GsPluginRefineData *data) +{ + g_clear_object (&data->list); + g_free (data); +} + +/** + * gs_plugin_refresh_metadata_data_new: + * @cache_age_secs: maximum allowed age of the cache in order for it to remain valid, in seconds + * @flags: refresh metadata flags + * + * Context data for a call to #GsPluginClass.refresh_metadata_async. + * + * Returns: (transfer full): context data structure + * Since: 42 + */ +GsPluginRefreshMetadataData * +gs_plugin_refresh_metadata_data_new (guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags) +{ + g_autoptr(GsPluginRefreshMetadataData) data = g_new0 (GsPluginRefreshMetadataData, 1); + data->cache_age_secs = cache_age_secs; + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_refresh_metadata_data_free: + * @data: (transfer full): a #GsPluginRefreshMetadataData + * + * Free the given @data. + * + * Since: 42 + */ +void +gs_plugin_refresh_metadata_data_free (GsPluginRefreshMetadataData *data) +{ + g_free (data); +} + +/** + * gs_plugin_list_apps_data_new: + * @query: (nullable) (transfer none): a query to filter apps, or %NULL for + * no filtering + * @flags: list apps flags + * + * Context data for a call to #GsPluginClass.list_apps_async. + * + * Returns: (transfer full): context data structure + * Since: 43 + */ +GsPluginListAppsData * +gs_plugin_list_apps_data_new (GsAppQuery *query, + GsPluginListAppsFlags flags) +{ + g_autoptr(GsPluginListAppsData) data = g_new0 (GsPluginListAppsData, 1); + data->query = (query != NULL) ? g_object_ref (query) : NULL; + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_list_apps_data_new_task: + * @source_object: task source object + * @query: (nullable) (transfer none): a query to filter apps, or %NULL for + * no filtering + * @flags: list apps flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a list apps operation with the given arguments. The task + * data will be set to a #GsPluginListAppsData containing the given context. + * + * This is essentially a combination of gs_plugin_list_apps_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 43 + */ +GTask * +gs_plugin_list_apps_data_new_task (gpointer source_object, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_list_apps_data_new (query, flags), (GDestroyNotify) gs_plugin_list_apps_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_list_apps_data_free: + * @data: (transfer full): a #GsPluginListAppsData + * + * Free the given @data. + * + * Since: 43 + */ +void +gs_plugin_list_apps_data_free (GsPluginListAppsData *data) +{ + g_clear_object (&data->query); + g_free (data); +} + +/** + * gs_plugin_manage_repository_data_new: + * @repository: (not nullable) (transfer none): a repository to manage + * @flags: manage repository flags + * + * Common context data for a call to #GsPluginClass.install_repository_async, + * #GsPluginClass.remove_repository_async, #GsPluginClass.enable_repository_async + * and #GsPluginClass.disable_repository_async. + * + * Returns: (transfer full): context data structure + * Since: 43 + */ +GsPluginManageRepositoryData * +gs_plugin_manage_repository_data_new (GsApp *repository, + GsPluginManageRepositoryFlags flags) +{ + g_autoptr(GsPluginManageRepositoryData) data = g_new0 (GsPluginManageRepositoryData, 1); + data->repository = g_object_ref (repository); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_manage_repository_data_new_task: + * @source_object: task source object + * @repository: (not nullable) (transfer none): a repository to manage + * @flags: manage repository flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a manage repository operation with the given arguments. The task + * data will be set to a #GsPluginManageRepositoryData containing the given context. + * + * This is essentially a combination of gs_plugin_manage_repository_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 43 + */ +GTask * +gs_plugin_manage_repository_data_new_task (gpointer source_object, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_manage_repository_data_new (repository, flags), (GDestroyNotify) gs_plugin_manage_repository_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_manage_repository_data_free: + * @data: (transfer full): a #GsPluginManageRepositoryData + * + * Free the given @data. + * + * Since: 43 + */ +void +gs_plugin_manage_repository_data_free (GsPluginManageRepositoryData *data) +{ + g_clear_object (&data->repository); + g_free (data); +} + +/** + * gs_plugin_refine_categories_data_new: + * @list: (element-type GsCategory): list of #GsCategory objects to refine + * @flags: refine flags + * + * Context data for a call to #GsPluginClass.refine_categories_async. + * + * Returns: (transfer full): context data structure + * Since: 43 + */ +GsPluginRefineCategoriesData * +gs_plugin_refine_categories_data_new (GPtrArray *list, + GsPluginRefineCategoriesFlags flags) +{ + g_autoptr(GsPluginRefineCategoriesData) data = g_new0 (GsPluginRefineCategoriesData, 1); + data->list = g_ptr_array_ref (list); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_refine_categories_data_new_task: + * @source_object: task source object + * @list: (element-type GsCategory): list of #GsCategory objects to refine + * @flags: refine flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a refine categories operation with the given arguments. + * The task data will be set to a #GsPluginRefineCategoriesData containing the + * given context. + * + * This is essentially a combination of gs_plugin_refine_categories_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 43 + */ +GTask * +gs_plugin_refine_categories_data_new_task (gpointer source_object, + GPtrArray *list, + GsPluginRefineCategoriesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_refine_categories_data_new (list, flags), (GDestroyNotify) gs_plugin_refine_categories_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_refine_categories_data_free: + * @data: (transfer full): a #GsPluginRefineCategoriesData + * + * Free the given @data. + * + * Since: 43 + */ +void +gs_plugin_refine_categories_data_free (GsPluginRefineCategoriesData *data) +{ + g_clear_pointer (&data->list, g_ptr_array_unref); + g_free (data); +} + +/** + * gs_plugin_install_apps_data_new: + * @apps: list of apps to install + * @flags: install flags + * + * Context data for a call to #GsPluginClass.install_apps_async. + * + * Returns: (transfer full): context data structure + * Since: 47 + */ +GsPluginInstallAppsData * +gs_plugin_install_apps_data_new (GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data) +{ + g_autoptr(GsPluginInstallAppsData) data = g_new0 (GsPluginInstallAppsData, 1); + data->apps = g_object_ref (apps); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->app_needs_user_action_callback = app_needs_user_action_callback; + data->app_needs_user_action_data = app_needs_user_action_data; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_install_apps_data_new_task: + * @source_object: task source object + * @apps: list of apps to install + * @flags: install flags + * @progress_callback: (nullable): function to call to notify of progress + * @progress_user_data: data to pass to @progress_callback + * @app_needs_user_action_callback: (nullable): function to call to ask the + * user for a decision + * @app_needs_user_action_data: data to pass to @app_needs_user_action_callback + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for an install apps operation with the given arguments. + * The task data will be set to a #GsPluginInstallAppsData containing the + * given context. + * + * This is essentially a combination of gs_plugin_install_apps_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 47 + */ +GTask * +gs_plugin_install_apps_data_new_task (gpointer source_object, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, + gs_plugin_install_apps_data_new (apps, + flags, + progress_callback, + progress_user_data, + app_needs_user_action_callback, + app_needs_user_action_data), + (GDestroyNotify) gs_plugin_install_apps_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_install_apps_data_free: + * @data: (transfer full): a #GsPluginInstallAppsData + * + * Free the given @data. + * + * Since: 47 + */ +void +gs_plugin_install_apps_data_free (GsPluginInstallAppsData *data) +{ + g_clear_object (&data->apps); + g_free (data); +} + +/** + * gs_plugin_uninstall_apps_data_new: + * @apps: list of apps to uninstall + * @flags: uninstall flags + * + * Context data for a call to #GsPluginClass.uninstall_apps_async. + * + * Returns: (transfer full): context data structure + * Since: 47 + */ +GsPluginUninstallAppsData * +gs_plugin_uninstall_apps_data_new (GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data) +{ + g_autoptr(GsPluginUninstallAppsData) data = g_new0 (GsPluginUninstallAppsData, 1); + data->apps = g_object_ref (apps); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->app_needs_user_action_callback = app_needs_user_action_callback; + data->app_needs_user_action_data = app_needs_user_action_data; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_uninstall_apps_data_new_task: + * @source_object: task source object + * @apps: list of apps to uninstall + * @flags: uninstall flags + * @progress_callback: (nullable): function to call to notify of progress + * @progress_user_data: data to pass to @progress_callback + * @app_needs_user_action_callback: (nullable): function to call to ask the + * user for a decision + * @app_needs_user_action_data: data to pass to @app_needs_user_action_callback + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for an uninstall apps operation with the given arguments. + * The task data will be set to a #GsPluginUninstallAppsData containing the + * given context. + * + * This is essentially a combination of gs_plugin_uninstall_apps_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 47 + */ +GTask * +gs_plugin_uninstall_apps_data_new_task (gpointer source_object, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, + gs_plugin_uninstall_apps_data_new (apps, + flags, + progress_callback, + progress_user_data, + app_needs_user_action_callback, + app_needs_user_action_data), + (GDestroyNotify) gs_plugin_uninstall_apps_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_uninstall_apps_data_free: + * @data: (transfer full): a #GsPluginUninstallAppsData + * + * Free the given @data. + * + * Since: 47 + */ +void +gs_plugin_uninstall_apps_data_free (GsPluginUninstallAppsData *data) +{ + g_clear_object (&data->apps); + g_free (data); +} + +/** + * gs_plugin_update_apps_data_new: + * @apps: list of apps to update + * @flags: update flags + * + * Context data for a call to #GsPluginClass.update_apps_async. + * + * Returns: (transfer full): context data structure + * Since: 44 + */ +GsPluginUpdateAppsData * +gs_plugin_update_apps_data_new (GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data) +{ + g_autoptr(GsPluginUpdateAppsData) data = g_new0 (GsPluginUpdateAppsData, 1); + data->apps = g_object_ref (apps); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->app_needs_user_action_callback = app_needs_user_action_callback; + data->app_needs_user_action_data = app_needs_user_action_data; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_update_apps_data_new_task: + * @source_object: task source object + * @apps: list of apps to update + * @flags: update flags + * @progress_callback: (nullable): function to call to notify of progress + * @progress_user_data: data to pass to @progress_callback + * @app_needs_user_action_callback: (nullable): function to call to ask the + * user for a decision + * @app_needs_user_action_data: data to pass to @app_needs_user_action_callback + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for an update apps operation with the given arguments. + * The task data will be set to a #GsPluginUpdateAppsData containing the + * given context. + * + * This is essentially a combination of gs_plugin_update_apps_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 44 + */ +GTask * +gs_plugin_update_apps_data_new_task (gpointer source_object, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, + gs_plugin_update_apps_data_new (apps, + flags, + progress_callback, + progress_user_data, + app_needs_user_action_callback, + app_needs_user_action_data), + (GDestroyNotify) gs_plugin_update_apps_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_update_apps_data_free: + * @data: (transfer full): a #GsPluginUpdateAppsData + * + * Free the given @data. + * + * Since: 44 + */ +void +gs_plugin_update_apps_data_free (GsPluginUpdateAppsData *data) +{ + g_clear_object (&data->apps); + g_free (data); +} + +/** + * gs_plugin_cancel_offline_update_data_new: + * @flags: operation flags + * + * Common context data for a call to #GsPluginClass.cancel_offline_update_async. + * + * Returns: (transfer full): context data structure + * Since: 47 + */ +GsPluginCancelOfflineUpdateData * +gs_plugin_cancel_offline_update_data_new (GsPluginCancelOfflineUpdateFlags flags) +{ + g_autoptr(GsPluginCancelOfflineUpdateData) data = g_new0 (GsPluginCancelOfflineUpdateData, 1); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_cancel_offline_update_data_new_task: + * @source_object: task source object + * @flags: operation flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for an update-cancel operation with the given arguments. The task + * data will be set to a #GsPluginCancelOfflineUpdateData containing the given context. + * + * This is essentially a combination of gs_plugin_cancel_offline_update_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 47 + */ +GTask * +gs_plugin_cancel_offline_update_data_new_task (gpointer source_object, + GsPluginCancelOfflineUpdateFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_cancel_offline_update_data_new (flags), (GDestroyNotify) gs_plugin_cancel_offline_update_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_cancel_offline_update_data_free: + * @data: (transfer full): a #GsPluginCancelOfflineUpdateData + * + * Free the given @data. + * + * Since: 47 + */ +void +gs_plugin_cancel_offline_update_data_free (GsPluginCancelOfflineUpdateData *data) +{ + g_free (data); +} + +/** + * gs_plugin_download_upgrade_data_new: + * @app: (not nullable) (transfer none): a #GsApp, with kind %AS_COMPONENT_KIND_OPERATING_SYSTEM + * @flags: operation flags + * + * Common context data for a call to #GsPluginClass.download_upgrade_async. + * + * Returns: (transfer full): context data structure + * Since: 47 + */ +GsPluginDownloadUpgradeData * +gs_plugin_download_upgrade_data_new (GsApp *app, + GsPluginDownloadUpgradeFlags flags) +{ + g_autoptr(GsPluginDownloadUpgradeData) data = g_new0 (GsPluginDownloadUpgradeData, 1); + data->app = g_object_ref (app); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_download_upgrade_data_new_task: + * @source_object: task source object + * @app: (not nullable) (transfer none): a #GsApp, with kind %AS_COMPONENT_KIND_OPERATING_SYSTEM + * @flags: operation flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for an upgrade-download operation with the given arguments. The task + * data will be set to a #GsPluginDownloadUpgradeData containing the given context. + * + * This is essentially a combination of gs_plugin_download_upgrade_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 47 + */ +GTask * +gs_plugin_download_upgrade_data_new_task (gpointer source_object, + GsApp *app, + GsPluginDownloadUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_download_upgrade_data_new (app, flags), (GDestroyNotify) gs_plugin_download_upgrade_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_download_upgrade_data_free: + * @data: (transfer full): a #GsPluginDownloadUpgradeData + * + * Free the given @data. + * + * Since: 47 + */ +void +gs_plugin_download_upgrade_data_free (GsPluginDownloadUpgradeData *data) +{ + g_clear_object (&data->app); + g_free (data); +} + +/** + * gs_plugin_trigger_upgrade_data_new: + * @app: (not nullable) (transfer none): a #GsApp, with kind %AS_COMPONENT_KIND_OPERATING_SYSTEM + * @flags: operation flags + * + * Common context data for a call to #GsPluginClass.trigger_upgrade_async. + * + * Returns: (transfer full): context data structure + * Since: 47 + */ +GsPluginTriggerUpgradeData * +gs_plugin_trigger_upgrade_data_new (GsApp *app, + GsPluginTriggerUpgradeFlags flags) +{ + g_autoptr(GsPluginTriggerUpgradeData) data = g_new0 (GsPluginTriggerUpgradeData, 1); + data->app = g_object_ref (app); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_trigger_upgrade_data_new_task: + * @source_object: task source object + * @app: (not nullable) (transfer none): a #GsApp, with kind %AS_COMPONENT_KIND_OPERATING_SYSTEM + * @flags: operation flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for an upgrade-trigger operation with the given arguments. The task + * data will be set to a #GsPluginTriggerUpgradeData containing the given context. + * + * This is essentially a combination of gs_plugin_trigger_upgrade_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 47 + */ +GTask * +gs_plugin_trigger_upgrade_data_new_task (gpointer source_object, + GsApp *app, + GsPluginTriggerUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_trigger_upgrade_data_new (app, flags), (GDestroyNotify) gs_plugin_trigger_upgrade_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_trigger_upgrade_data_free: + * @data: (transfer full): a #GsPluginTriggerUpgradeData + * + * Free the given @data. + * + * Since: 47 + */ +void +gs_plugin_trigger_upgrade_data_free (GsPluginTriggerUpgradeData *data) +{ + g_clear_object (&data->app); + g_free (data); +} + +/** + * gs_plugin_launch_data_new: + * @app: (not nullable) (transfer none): a #GsApp + * @flags: operation flags + * + * Common context data for a call to #GsPluginClass.launch_async. + * + * Returns: (transfer full): context data structure + * Since: 47 + */ +GsPluginLaunchData * +gs_plugin_launch_data_new (GsApp *app, + GsPluginLaunchFlags flags) +{ + g_autoptr(GsPluginLaunchData) data = g_new0 (GsPluginLaunchData, 1); + data->app = g_object_ref (app); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_launch_data_new_task: + * @source_object: task source object + * @app: (not nullable) (transfer none): a #GsApp + * @flags: operation flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a launch operation with the given arguments. The task + * data will be set to a #GsPluginLaunchData containing the given context. + * + * This is essentially a combination of gs_plugin_launch_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 47 + */ +GTask * +gs_plugin_launch_data_new_task (gpointer source_object, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_launch_data_new (app, flags), (GDestroyNotify) gs_plugin_launch_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_launch_data_free: + * @data: (transfer full): a #GsPluginLaunchData + * + * Free the given @data. + * + * Since: 47 + */ +void +gs_plugin_launch_data_free (GsPluginLaunchData *data) +{ + g_clear_object (&data->app); + g_free (data); +} + +/** + * gs_plugin_file_to_app_data_new: + * @file: (not nullable) (transfer none): a #GFile + * @flags: operation flags + * + * Common context data for a call to #GsPluginClass.file_to_app_async. + * + * Returns: (transfer full): context data structure + * Since: 47 + */ +GsPluginFileToAppData * +gs_plugin_file_to_app_data_new (GFile *file, + GsPluginFileToAppFlags flags) +{ + g_autoptr(GsPluginFileToAppData) data = g_new0 (GsPluginFileToAppData, 1); + data->file = g_object_ref (file); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_file_to_app_data_new_task: + * @source_object: task source object + * @file: (not nullable) (transfer none): a #GFile + * @flags: operation flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a file-to-app operation with the given arguments. The task + * data will be set to a #GsPluginFileToAppData containing the given context. + * + * This is essentially a combination of gs_plugin_file_to_app_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 47 + */ +GTask * +gs_plugin_file_to_app_data_new_task (gpointer source_object, + GFile *file, + GsPluginFileToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_file_to_app_data_new (file, flags), (GDestroyNotify) gs_plugin_file_to_app_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_file_to_app_data_free: + * @data: (transfer full): a #GsPluginFileToAppData + * + * Free the given @data. + * + * Since: 47 + */ +void +gs_plugin_file_to_app_data_free (GsPluginFileToAppData *data) +{ + g_clear_object (&data->file); + g_free (data); +} + +/** + * gs_plugin_url_to_app_data_new: + * @url: (not nullable): a URL + * @flags: operation flags + * + * Common context data for a call to #GsPluginClass.url_to_app_async. + * + * Returns: (transfer full): context data structure + * Since: 47 + */ +GsPluginUrlToAppData * +gs_plugin_url_to_app_data_new (const gchar *url, + GsPluginUrlToAppFlags flags) +{ + g_autoptr(GsPluginUrlToAppData) data = g_new0 (GsPluginUrlToAppData, 1); + data->url = g_strdup (url); + data->flags = flags; + + return g_steal_pointer (&data); +} + +/** + * gs_plugin_url_to_app_data_new_task: + * @source_object: task source object + * @url: (not nullable): a URL + * @flags: operation flags + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once asynchronous operation is finished + * @user_data: data to pass to @callback + * + * Create a #GTask for a url-to-app operation with the given arguments. The task + * data will be set to a #GsPluginUrlToAppData containing the given context. + * + * This is essentially a combination of gs_plugin_url_to_app_data_new(), + * g_task_new() and g_task_set_task_data(). + * + * Returns: (transfer full): new #GTask with the given context data + * Since: 47 + */ +GTask * +gs_plugin_url_to_app_data_new_task (gpointer source_object, + const gchar *url, + GsPluginUrlToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = g_task_new (source_object, cancellable, callback, user_data); + g_task_set_task_data (task, gs_plugin_url_to_app_data_new (url, flags), (GDestroyNotify) gs_plugin_url_to_app_data_free); + return g_steal_pointer (&task); +} + +/** + * gs_plugin_url_to_app_data_free: + * @data: (transfer full): a #GsPluginUrlToAppData + * + * Free the given @data. + * + * Since: 47 + */ +void +gs_plugin_url_to_app_data_free (GsPluginUrlToAppData *data) +{ + g_free (data->url); + g_free (data); +} diff --git a/lib/gs-plugin-helpers.h b/lib/gs-plugin-helpers.h new file mode 100644 index 0000000..00c80db --- /dev/null +++ b/lib/gs-plugin-helpers.h @@ -0,0 +1,279 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include + +G_BEGIN_DECLS + +typedef struct { + GsAppList *list; /* (owned) (not nullable) */ + GsPluginRefineFlags flags; +} GsPluginRefineData; + +GsPluginRefineData *gs_plugin_refine_data_new (GsAppList *list, + GsPluginRefineFlags flags); +GTask *gs_plugin_refine_data_new_task (gpointer source_object, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_refine_data_free (GsPluginRefineData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginRefineData, gs_plugin_refine_data_free) + +typedef struct { + guint64 cache_age_secs; + GsPluginRefreshMetadataFlags flags; +} GsPluginRefreshMetadataData; + +GsPluginRefreshMetadataData *gs_plugin_refresh_metadata_data_new (guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags); +void gs_plugin_refresh_metadata_data_free (GsPluginRefreshMetadataData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginRefreshMetadataData, gs_plugin_refresh_metadata_data_free) + +typedef struct { + GsAppQuery *query; /* (owned) (nullable) */ + GsPluginListAppsFlags flags; +} GsPluginListAppsData; + +GsPluginListAppsData *gs_plugin_list_apps_data_new (GsAppQuery *query, + GsPluginListAppsFlags flags); +GTask *gs_plugin_list_apps_data_new_task (gpointer source_object, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_list_apps_data_free (GsPluginListAppsData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginListAppsData, gs_plugin_list_apps_data_free) + +typedef struct { + GsApp *repository; /* (owned) (nullable) */ + GsPluginManageRepositoryFlags flags; +} GsPluginManageRepositoryData; + +GsPluginManageRepositoryData * + gs_plugin_manage_repository_data_new (GsApp *repository, + GsPluginManageRepositoryFlags flags); +GTask * gs_plugin_manage_repository_data_new_task (gpointer source_object, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_manage_repository_data_free (GsPluginManageRepositoryData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginManageRepositoryData, gs_plugin_manage_repository_data_free) + +typedef struct { + GPtrArray *list; /* (element-type GsCategory) (owned) (not nullable) */ + GsPluginRefineCategoriesFlags flags; +} GsPluginRefineCategoriesData; + +GsPluginRefineCategoriesData *gs_plugin_refine_categories_data_new (GPtrArray *list, + GsPluginRefineCategoriesFlags flags); +GTask *gs_plugin_refine_categories_data_new_task (gpointer source_object, + GPtrArray *list, + GsPluginRefineCategoriesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_refine_categories_data_free (GsPluginRefineCategoriesData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginRefineCategoriesData, gs_plugin_refine_categories_data_free) + +typedef struct { + GsAppList *apps; /* (owned) (not nullable) */ + GsPluginInstallAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback; + gpointer app_needs_user_action_data; +} GsPluginInstallAppsData; + +GsPluginInstallAppsData *gs_plugin_install_apps_data_new (GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data); +GTask *gs_plugin_install_apps_data_new_task (gpointer source_object, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_install_apps_data_free (GsPluginInstallAppsData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginInstallAppsData, gs_plugin_install_apps_data_free) + +typedef struct { + GsAppList *apps; /* (owned) (not nullable) */ + GsPluginUninstallAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback; + gpointer app_needs_user_action_data; +} GsPluginUninstallAppsData; + +GsPluginUninstallAppsData *gs_plugin_uninstall_apps_data_new (GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data); +GTask *gs_plugin_uninstall_apps_data_new_task (gpointer source_object, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_uninstall_apps_data_free (GsPluginUninstallAppsData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginUninstallAppsData, gs_plugin_uninstall_apps_data_free) + +typedef struct { + GsAppList *apps; /* (owned) (not nullable) */ + GsPluginUpdateAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback; + gpointer app_needs_user_action_data; +} GsPluginUpdateAppsData; + +GsPluginUpdateAppsData *gs_plugin_update_apps_data_new (GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data); +GTask *gs_plugin_update_apps_data_new_task (gpointer source_object, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_update_apps_data_free (GsPluginUpdateAppsData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginUpdateAppsData, gs_plugin_update_apps_data_free) + +typedef struct { + GsPluginCancelOfflineUpdateFlags flags; +} GsPluginCancelOfflineUpdateData; + +GsPluginCancelOfflineUpdateData * + gs_plugin_cancel_offline_update_data_new (GsPluginCancelOfflineUpdateFlags flags); +GTask * gs_plugin_cancel_offline_update_data_new_task (gpointer source_object, + GsPluginCancelOfflineUpdateFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_cancel_offline_update_data_free (GsPluginCancelOfflineUpdateData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginCancelOfflineUpdateData, gs_plugin_cancel_offline_update_data_free) + +typedef struct { + GsApp *app; /* (owned) (not nullable) */ + GsPluginDownloadUpgradeFlags flags; +} GsPluginDownloadUpgradeData; + +GsPluginDownloadUpgradeData * + gs_plugin_download_upgrade_data_new (GsApp *app, + GsPluginDownloadUpgradeFlags flags); +GTask * gs_plugin_download_upgrade_data_new_task(gpointer source_object, + GsApp *app, + GsPluginDownloadUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_download_upgrade_data_free (GsPluginDownloadUpgradeData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginDownloadUpgradeData, gs_plugin_download_upgrade_data_free) + +typedef struct { + GsApp *app; /* (owned) (not nullable) */ + GsPluginTriggerUpgradeFlags flags; +} GsPluginTriggerUpgradeData; + +GsPluginTriggerUpgradeData * + gs_plugin_trigger_upgrade_data_new (GsApp *app, + GsPluginTriggerUpgradeFlags flags); +GTask * gs_plugin_trigger_upgrade_data_new_task (gpointer source_object, + GsApp *app, + GsPluginTriggerUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_trigger_upgrade_data_free (GsPluginTriggerUpgradeData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginTriggerUpgradeData, gs_plugin_trigger_upgrade_data_free) + +typedef struct { + GsApp *app; /* (owned) (not nullable) */ + GsPluginLaunchFlags flags; +} GsPluginLaunchData; + +GsPluginLaunchData * + gs_plugin_launch_data_new (GsApp *app, + GsPluginLaunchFlags flags); +GTask * gs_plugin_launch_data_new_task (gpointer source_object, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_launch_data_free (GsPluginLaunchData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginLaunchData, gs_plugin_launch_data_free) + +typedef struct { + GFile *file; /* (owned) */ + GsPluginFileToAppFlags flags; +} GsPluginFileToAppData; + +GsPluginFileToAppData * + gs_plugin_file_to_app_data_new (GFile *file, + GsPluginFileToAppFlags flags); +GTask * gs_plugin_file_to_app_data_new_task (gpointer source_object, + GFile *file, + GsPluginFileToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_file_to_app_data_free (GsPluginFileToAppData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginFileToAppData, gs_plugin_file_to_app_data_free) + +typedef struct { + gchar *url; /* (owned) */ + GsPluginUrlToAppFlags flags; +} GsPluginUrlToAppData; + +GsPluginUrlToAppData * + gs_plugin_url_to_app_data_new (const gchar *url, + GsPluginUrlToAppFlags flags); +GTask * gs_plugin_url_to_app_data_new_task (gpointer source_object, + const gchar *url, + GsPluginUrlToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void gs_plugin_url_to_app_data_free (GsPluginUrlToAppData *data); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginUrlToAppData, gs_plugin_url_to_app_data_free) + +G_END_DECLS diff --git a/lib/gs-plugin-job-cancel-offline-update.c b/lib/gs-plugin-job-cancel-offline-update.c new file mode 100644 index 0000000..6562792 --- /dev/null +++ b/lib/gs-plugin-job-cancel-offline-update.c @@ -0,0 +1,271 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-cancel-offline-update + * @short_description: A plugin job to cancel a pending offline update + * + * #GsPluginJobCancelOfflineUpdate is a #GsPluginJob to cancel a pending offline + * update. + * + * See https://github.com/PackageKit/PackageKit/blob/main/docs/offline-updates.txt + * and https://www.freedesktop.org/software/systemd/man/latest/systemd.offline-updates.html + * for details of how offline updates work. + * + * This class is a wrapper around #GsPluginClass.cancel_offline_update_async + * calling it for all loaded plugins. + * + * Since: 47 + */ + +#include "config.h" + +#include +#include + +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-cancel-offline-update.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-types.h" + +struct _GsPluginJobCancelOfflineUpdate +{ + GsPluginJob parent; + + /* Input arguments. */ + GsPluginCancelOfflineUpdateFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; +}; + +G_DEFINE_TYPE (GsPluginJobCancelOfflineUpdate, gs_plugin_job_cancel_offline_update, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_FLAGS = 1, +} GsPluginJobCancelOfflineUpdateProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +static void +gs_plugin_job_cancel_offline_update_dispose (GObject *object) +{ + GsPluginJobCancelOfflineUpdate *self = GS_PLUGIN_JOB_CANCEL_OFFLINE_UPDATE (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + G_OBJECT_CLASS (gs_plugin_job_cancel_offline_update_parent_class)->dispose (object); +} + +static void +gs_plugin_job_cancel_offline_update_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobCancelOfflineUpdate *self = GS_PLUGIN_JOB_CANCEL_OFFLINE_UPDATE (object); + + switch ((GsPluginJobCancelOfflineUpdateProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_cancel_offline_update_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobCancelOfflineUpdate *self = GS_PLUGIN_JOB_CANCEL_OFFLINE_UPDATE (object); + + switch ((GsPluginJobCancelOfflineUpdateProperty) prop_id) { + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void plugin_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_cancel_offline_update_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobCancelOfflineUpdate *self = GS_PLUGIN_JOB_CANCEL_OFFLINE_UPDATE (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_cancel_offline_update_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->cancel_offline_update_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->cancel_offline_update_async (plugin, self->flags, cancellable, plugin_func_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle cancel-offline-update operation"); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + gboolean success; + g_autoptr(GError) local_error = NULL; + + success = plugin_class->cancel_offline_update_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + g_assert (success || local_error != NULL); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobCancelOfflineUpdate *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while cancelling offline update: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + if (self->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + else + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_cancel_offline_update_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_cancel_offline_update_class_init (GsPluginJobCancelOfflineUpdateClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_cancel_offline_update_dispose; + object_class->get_property = gs_plugin_job_cancel_offline_update_get_property; + object_class->set_property = gs_plugin_job_cancel_offline_update_set_property; + + job_class->run_async = gs_plugin_job_cancel_offline_update_run_async; + job_class->run_finish = gs_plugin_job_cancel_offline_update_run_finish; + + /** + * GsPluginJobCancelOfflineUpdate:flags: + * + * Flags affecting how the operation runs. + * + * Since: 47 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags affecting how the operation runs.", + GS_TYPE_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS, + GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_cancel_offline_update_init (GsPluginJobCancelOfflineUpdate *self) +{ +} + +/** + * gs_plugin_job_cancel_offline_update_new: + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobCancelOfflineUpdate to cancel offline update. + * + * Returns: (transfer full): a new #GsPluginJobCancelOfflineUpdate + * Since: 47 + */ +GsPluginJob * +gs_plugin_job_cancel_offline_update_new (GsPluginCancelOfflineUpdateFlags flags) +{ + return g_object_new (GS_TYPE_PLUGIN_JOB_CANCEL_OFFLINE_UPDATE, + "flags", flags, + NULL); +} diff --git a/lib/gs-plugin-job-cancel-offline-update.h b/lib/gs-plugin-job-cancel-offline-update.h new file mode 100644 index 0000000..ee1e565 --- /dev/null +++ b/lib/gs-plugin-job-cancel-offline-update.h @@ -0,0 +1,25 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_CANCEL_OFFLINE_UPDATE (gs_plugin_job_cancel_offline_update_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobCancelOfflineUpdate, gs_plugin_job_cancel_offline_update, GS, PLUGIN_JOB_CANCEL_OFFLINE_UPDATE, GsPluginJob) + +GsPluginJob *gs_plugin_job_cancel_offline_update_new (GsPluginCancelOfflineUpdateFlags flags); + +G_END_DECLS diff --git a/lib/gs-plugin-job-download-upgrade.c b/lib/gs-plugin-job-download-upgrade.c new file mode 100644 index 0000000..c1c5bd4 --- /dev/null +++ b/lib/gs-plugin-job-download-upgrade.c @@ -0,0 +1,302 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-download-upgrade + * @short_description: A plugin job on an app + * + * #GsPluginJobDownloadUpgrade is a #GsPluginJob to start download + * of a system upgrade of @app. + * + * This class is a wrapper around #GsPluginClass.download_upgrade_async + * calling it for all loaded plugins. + * + * Since: 47 + */ + +#include "config.h" + +#include +#include + +#include "gs-app.h" +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-download-upgrade.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-types.h" + +struct _GsPluginJobDownloadUpgrade +{ + GsPluginJob parent; + + /* Input arguments. */ + GsApp *app; /* (owned) (not nullable) */ + GsPluginDownloadUpgradeFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; +}; + +G_DEFINE_TYPE (GsPluginJobDownloadUpgrade, gs_plugin_job_download_upgrade, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_FLAGS = 1, + PROP_APP, +} GsPluginJobDownloadUpgradeProperty; + +static GParamSpec *props[PROP_APP + 1] = { NULL, }; + +static void +gs_plugin_job_download_upgrade_dispose (GObject *object) +{ + GsPluginJobDownloadUpgrade *self = GS_PLUGIN_JOB_DOWNLOAD_UPGRADE (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_object (&self->app); + + G_OBJECT_CLASS (gs_plugin_job_download_upgrade_parent_class)->dispose (object); +} + +static void +gs_plugin_job_download_upgrade_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobDownloadUpgrade *self = GS_PLUGIN_JOB_DOWNLOAD_UPGRADE (object); + + switch ((GsPluginJobDownloadUpgradeProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + case PROP_APP: + g_value_set_object (value, self->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_download_upgrade_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobDownloadUpgrade *self = GS_PLUGIN_JOB_DOWNLOAD_UPGRADE (object); + + switch ((GsPluginJobDownloadUpgradeProperty) prop_id) { + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_APP: + /* Construct only. */ + g_assert (self->app == NULL); + self->app = g_value_dup_object (value); + g_assert (self->app != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_download_upgrade_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobDownloadUpgrade *self = GS_PLUGIN_JOB_DOWNLOAD_UPGRADE (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_download_upgrade_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->download_upgrade_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->download_upgrade_async (plugin, self->app, self->flags, cancellable, plugin_app_func_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle app operation"); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + gboolean success; + g_autoptr(GError) local_error = NULL; + + success = plugin_class->download_upgrade_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + g_assert (success || local_error != NULL); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobDownloadUpgrade *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while downloading upgrade: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + if (self->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + else + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_download_upgrade_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_download_upgrade_class_init (GsPluginJobDownloadUpgradeClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_download_upgrade_dispose; + object_class->get_property = gs_plugin_job_download_upgrade_get_property; + object_class->set_property = gs_plugin_job_download_upgrade_set_property; + + job_class->run_async = gs_plugin_job_download_upgrade_run_async; + job_class->run_finish = gs_plugin_job_download_upgrade_run_finish; + + /** + * GsPluginJobDownloadUpgrade:app: (not nullable) + * + * A #GsApp describing the app to run the operation on. + * + * Since: 47 + */ + props[PROP_APP] = + g_param_spec_object ("app", "App", + "A #GsApp describing the app to run the operation on.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobDownloadUpgrade:flags: + * + * Flags affecting how the operation runs. + * + * Since: 47 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags affecting how the operation runs.", + GS_TYPE_PLUGIN_DOWNLOAD_UPGRADE_FLAGS, + GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_download_upgrade_init (GsPluginJobDownloadUpgrade *self) +{ +} + +/** + * gs_plugin_job_download_upgrade_new: + * @app: (not nullable) (transfer none): an app to run the operation on + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobDownloadUpgrade to download a system upgrade represented by @app. + * + * Returns: (transfer full): a new #GsPluginJobDownloadUpgrade + * Since: 47 + */ +GsPluginJob * +gs_plugin_job_download_upgrade_new (GsApp *app, + GsPluginDownloadUpgradeFlags flags) +{ + g_return_val_if_fail (GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_DOWNLOAD_UPGRADE, + "app", app, + "flags", flags, + "interactive", (flags & GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE) != 0, + NULL); +} diff --git a/lib/gs-plugin-job-download-upgrade.h b/lib/gs-plugin-job-download-upgrade.h new file mode 100644 index 0000000..884373c --- /dev/null +++ b/lib/gs-plugin-job-download-upgrade.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_DOWNLOAD_UPGRADE (gs_plugin_job_download_upgrade_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobDownloadUpgrade, gs_plugin_job_download_upgrade, GS, PLUGIN_JOB_DOWNLOAD_UPGRADE, GsPluginJob) + +GsPluginJob *gs_plugin_job_download_upgrade_new (GsApp *app, + GsPluginDownloadUpgradeFlags flags); + +G_END_DECLS diff --git a/lib/gs-plugin-job-file-to-app.c b/lib/gs-plugin-job-file-to-app.c new file mode 100644 index 0000000..112b2cc --- /dev/null +++ b/lib/gs-plugin-job-file-to-app.c @@ -0,0 +1,437 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-file-to-app + * @short_description: A plugin job on an app + * + * #GsPluginJobFileToApp is a #GsPluginJob representing an operation to + * convert a #GFile into a #GsApp. + * + * This class is a wrapper around #GsPluginClass.file_to_app_async + * calling it for all loaded plugins, with #GsPluginJobRefine used to refine the + * results. + * + * Retrieve the resulting #GsAppList using + * gs_plugin_job_file_to_app_get_result_list(). + * + * Since: 47 + */ + +#include "config.h" + +#include +#include + +#include "gs-app.h" +#include "gs-app-list-private.h" +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-file-to-app.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-refine.h" +#include "gs-plugin-types.h" + +struct _GsPluginJobFileToApp +{ + GsPluginJob parent; + + /* Input arguments. */ + GFile *file; /* (owned) (not nullable) */ + GsPluginFileToAppFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + gboolean did_refine; + GsAppList *in_progress_list; /* (owned) (nullable) */ + + /* Results. */ + GsAppList *result_list; /* (owned) (nullable) */ +}; + +G_DEFINE_TYPE (GsPluginJobFileToApp, gs_plugin_job_file_to_app, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_FLAGS = 1, + PROP_FILE, +} GsPluginJobFileToAppProperty; + +static GParamSpec *props[PROP_FILE + 1] = { NULL, }; + +static void +gs_plugin_job_file_to_app_dispose (GObject *object) +{ + GsPluginJobFileToApp *self = GS_PLUGIN_JOB_FILE_TO_APP (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_object (&self->file); + g_clear_object (&self->result_list); + g_clear_object (&self->in_progress_list); + + G_OBJECT_CLASS (gs_plugin_job_file_to_app_parent_class)->dispose (object); +} + +static void +gs_plugin_job_file_to_app_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobFileToApp *self = GS_PLUGIN_JOB_FILE_TO_APP (object); + + switch ((GsPluginJobFileToAppProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + case PROP_FILE: + g_value_set_object (value, self->file); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_file_to_app_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobFileToApp *self = GS_PLUGIN_JOB_FILE_TO_APP (object); + + switch ((GsPluginJobFileToAppProperty) prop_id) { + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_FILE: + /* Construct only. */ + g_assert (self->file == NULL); + self->file = g_value_dup_object (value); + g_assert (self->file != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GsAppList *list, + GError *error); +static void refine_job_finished_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_refine_op (GTask *task, + GsAppList *list, + GError *error); + +static void +gs_plugin_job_file_to_app_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobFileToApp *self = GS_PLUGIN_JOB_FILE_TO_APP (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_file_to_app_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->file_to_app_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->file_to_app_async (plugin, self->file, self->flags, cancellable, plugin_app_func_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle file-to-app operation"); + + finish_op (task, NULL, g_steal_pointer (&local_error)); +} + +static void +plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + + list = plugin_class->file_to_app_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + g_assert (list != NULL || local_error != NULL); + + finish_op (task, list, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GsAppList *list, + GError *error) +{ + GsPluginJobFileToApp *self = g_task_get_source_object (task); + GsPluginLoader *plugin_loader = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while converting file to app: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (list != NULL) { + if (self->in_progress_list == NULL) + self->in_progress_list = gs_app_list_new (); + gs_app_list_add_list (self->in_progress_list, list); + } + + if (self->n_pending_ops > 0) + return; + + /* Once all the file-to-app operations are complete, refine the results. */ + if (self->in_progress_list != NULL) { + GsPluginRefineFlags refine_flags = gs_plugin_job_get_refine_flags (GS_PLUGIN_JOB (self)); + + if (refine_flags != GS_PLUGIN_REFINE_FLAGS_NONE) { + g_autoptr(GsPluginJob) refine_job = NULL; + + /* to not have filtered out repositories */ + refine_flags |= GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING; + + refine_job = gs_plugin_job_refine_new (self->in_progress_list, refine_flags); + gs_plugin_loader_job_process_async (plugin_loader, refine_job, cancellable, + refine_job_finished_cb, g_object_ref (task)); + return; + } + } + + /* Fall through without refining. */ + finish_refine_op (task, self->in_progress_list, NULL); +} + +static void +refine_job_finished_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + + list = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (source_object), result, &local_error); + g_prefix_error_literal (&local_error, "Failed to refine file-to-app apps:"); + + finish_refine_op (task, list, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_refine_op (GTask *task, + GsAppList *list, + GError *error) +{ + GsPluginJobFileToApp *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while converting file to app: %s", error_owned->message); + + g_clear_object (&self->result_list); + self->result_list = (list != NULL) ? g_object_ref (list) : NULL; + + /* only allow one result */ + if (self->saved_error == NULL) { + if (self->result_list == NULL || + gs_app_list_length (self->result_list) == 0) { + g_autofree gchar *str = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_set_error (&self->saved_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no application was created for %s", str); + } else if (gs_app_list_length (self->result_list) > 1) { + g_autofree gchar *str = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("expected one, but received %u apps for %s", gs_app_list_length (self->result_list), str); + } + + /* Ensure the icon is set on all the apps. */ + if (self->result_list != NULL) { + for (guint i = 0; i < gs_app_list_length (self->result_list); i++) { + GsApp *app = gs_app_list_index (self->result_list, i); + + if (!gs_app_has_icons (app)) { + g_autoptr(GIcon) ic = NULL; + const gchar *icon_name; + if (gs_app_has_quirk (app, GS_APP_QUIRK_HAS_SOURCE)) + icon_name = "x-package-repository"; + else + icon_name = "system-component-application"; + ic = g_themed_icon_new (icon_name); + gs_app_add_icon (app, ic); + } + } + } + } + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + if (self->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + else + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_file_to_app_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_file_to_app_class_init (GsPluginJobFileToAppClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_file_to_app_dispose; + object_class->get_property = gs_plugin_job_file_to_app_get_property; + object_class->set_property = gs_plugin_job_file_to_app_set_property; + + job_class->run_async = gs_plugin_job_file_to_app_run_async; + job_class->run_finish = gs_plugin_job_file_to_app_run_finish; + + /** + * GsPluginJobFileToApp:file: (not nullable) + * + * A #GFile to convert to a #GsApp. + * + * Since: 47 + */ + props[PROP_FILE] = + g_param_spec_object ("file", "File", + "A #GFile to convert to a #GsApp.", + G_TYPE_FILE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobFileToApp:flags: + * + * Flags affecting how the operation runs. + * + * Since: 47 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags affecting how the operation runs.", + GS_TYPE_PLUGIN_FILE_TO_APP_FLAGS, + GS_PLUGIN_FILE_TO_APP_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_file_to_app_init (GsPluginJobFileToApp *self) +{ +} + +/** + * gs_plugin_job_file_to_app_new: + * @file: (not nullable) (transfer none): an #GFile to run the operation on + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobFileToApp to convert the given @file. + * + * Returns: (transfer full): a new #GsPluginJobFileToApp + * Since: 47 + */ +GsPluginJob * +gs_plugin_job_file_to_app_new (GFile *file, + GsPluginFileToAppFlags flags) +{ + g_return_val_if_fail (G_IS_FILE (file), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_FILE_TO_APP, + "file", file, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_file_to_app_get_result_list: + * @self: a #GsPluginJobFileToApp + * + * Get the list of apps converted from the given file. + * + * If this is called before the job is complete, %NULL will be returned. + * + * Returns: (transfer none) (nullable): the job results, or %NULL on error + * or if called before the job has completed + * + * Since: 47 + */ +GsAppList * +gs_plugin_job_file_to_app_get_result_list (GsPluginJobFileToApp *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_FILE_TO_APP (self), NULL); + + return self->result_list; +} diff --git a/lib/gs-plugin-job-file-to-app.h b/lib/gs-plugin-job-file-to-app.h new file mode 100644 index 0000000..0ade0fb --- /dev/null +++ b/lib/gs-plugin-job-file-to-app.h @@ -0,0 +1,28 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_FILE_TO_APP (gs_plugin_job_file_to_app_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobFileToApp, gs_plugin_job_file_to_app, GS, PLUGIN_JOB_FILE_TO_APP, GsPluginJob) + +GsPluginJob *gs_plugin_job_file_to_app_new (GFile *file, + GsPluginFileToAppFlags flags); +GsAppList *gs_plugin_job_file_to_app_get_result_list + (GsPluginJobFileToApp *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-install-apps.c b/lib/gs-plugin-job-install-apps.c new file mode 100644 index 0000000..d96c684 --- /dev/null +++ b/lib/gs-plugin-job-install-apps.c @@ -0,0 +1,609 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2023 Endless OS Foundation LLC + * Copyright (C) 2024 GNOME Foundation, Inc. + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-install-apps + * @short_description: A plugin job to install apps + * + * #GsPluginJobInstallApps is a #GsPluginJob representing an operation to + * install apps. + * + * This class is a wrapper around #GsPluginClass.install_apps_async(), + * calling it for all loaded plugins. + * + * Unless %GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD is specified, the first step + * of this job downloads the app and any dependencies, ready to be installed or + * updated. + * + * Plugins are expected to schedule downloads using the system download + * scheduler if appropriate (if the download is not guaranteed to be under a few + * hundred kilobytes, for example), so that the user’s metered data preferences + * are honoured. + * + * Plugins are expected to send progress notifications to the UI by calling the + * provided #GsPluginProgressCallback function. Plugins may also call + * gs_app_set_progress() on apps as they are updated, but this method will + * eventually be removed as it cannot represent progress in multiple ongoing + * operations. + * + * Callbacks from this job will be executed in the #GMainContext which was + * thread-default at the time when #GsPluginJob.run_async() was called on the + * #GsPluginJobInstallApps. For plugins, this means that callbacks must be + * executed in the same #GMainContext which called + * #GsPluginClass.install_apps_async(). + * + * If the app is already downloaded, the first step of this job is a no-op. + * + * Unless %GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY is specified, the second step of + * this job applies the app and any dependencies (installing the app, and updating + * dependencies or installing missing dependencies). + * + * Once that is completed, the apps will typically be set to the state + * %GS_APP_STATE_INSTALLED, or %GS_APP_STATE_UNKNOWN. + * + * On failure the error message returned will usually only be shown on the + * console, but they can also be retrieved using gs_plugin_loader_get_events(). + * + * See also: #GsPluginClass.install_apps_async() + * Since: 47 + */ + +#include "config.h" + +#include +#include +#include + +#ifdef HAVE_SYSPROF +#include +#endif + +#include "gs-enums.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-install-apps.h" +#include "gs-plugin-types.h" +#include "gs-profiler.h" +#include "gs-utils.h" + +struct _GsPluginJobInstallApps +{ + GsPluginJob parent; + + /* Input arguments. */ + GsAppList *apps; + GsPluginInstallAppsFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + GHashTable *plugins_progress; /* (element-type GsPlugin guint) (owned) (nullable) */ + GSource *progress_source; /* (owned) (nullable) */ + guint last_reported_progress; + +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec; +#endif +}; + +G_DEFINE_TYPE (GsPluginJobInstallApps, gs_plugin_job_install_apps, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_APPS = 1, + PROP_FLAGS, +} GsPluginJobInstallAppsProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +typedef enum { + SIGNAL_APP_NEEDS_USER_ACTION, + SIGNAL_PROGRESS, +} GsPluginJobInstallAppsSignal; + +static guint signals[SIGNAL_PROGRESS + 1] = { 0, }; + +static void +gs_plugin_job_install_apps_dispose (GObject *object) +{ + GsPluginJobInstallApps *self = GS_PLUGIN_JOB_INSTALL_APPS (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* Progress reporting should have been stopped by now. */ + if (self->progress_source != NULL) { + g_assert (g_source_is_destroyed (self->progress_source)); + g_clear_pointer (&self->progress_source, g_source_unref); + } + + g_clear_pointer (&self->plugins_progress, g_hash_table_unref); + g_clear_object (&self->apps); + + G_OBJECT_CLASS (gs_plugin_job_install_apps_parent_class)->dispose (object); +} + +static void +gs_plugin_job_install_apps_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobInstallApps *self = GS_PLUGIN_JOB_INSTALL_APPS (object); + + switch ((GsPluginJobInstallAppsProperty) prop_id) { + case PROP_APPS: + g_value_set_object (value, self->apps); + break; + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_install_apps_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobInstallApps *self = GS_PLUGIN_JOB_INSTALL_APPS (object); + + switch ((GsPluginJobInstallAppsProperty) prop_id) { + case PROP_APPS: + /* Construct only. */ + g_assert (self->apps == NULL); + self->apps = g_value_dup_object (value); + g_assert (self->apps != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + + /* Perhaps we could eventually allow both of these to be + * specified at the same time, but for now it would over + * complicate the implementation of plugins, for no benefit. */ + g_assert (!(self->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD) || + !(self->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY)); + + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +app_needs_user_action_cb (GsPlugin *plugin, + GsApp *app, + AsScreenshot *action_screenshot, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPluginJobInstallApps *self = g_task_get_source_object (task); + + g_assert (g_main_context_is_owner (g_task_get_context (task))); + g_signal_emit (self, signals[SIGNAL_APP_NEEDS_USER_ACTION], 0, app, action_screenshot); +} + +static void plugin_progress_cb (GsPlugin *plugin, + guint progress, + gpointer user_data); +static gboolean progress_cb (gpointer user_data); +static void plugin_install_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_install_apps_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobInstallApps *self = GS_PLUGIN_JOB_INSTALL_APPS (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean any_plugins_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + /* Chosen to allow a few UI updates per second without updating the + * progress label so often it’s unreadable. */ + const guint progress_update_period_ms = 300; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_install_apps_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* Set up the progress timeout. This periodically sums up the progress + * tuples in `self->plugins_progress` and reports them to the calling + * function via the #GsPluginJobInstallApps::progress signal, giving + * an overall progress for all the parallel operations. */ + self->plugins_progress = g_hash_table_new (g_direct_hash, g_direct_equal); + self->last_reported_progress = GS_APP_PROGRESS_UNKNOWN; + self->progress_source = g_timeout_source_new (progress_update_period_ms); + g_source_set_callback (self->progress_source, progress_cb, self, NULL); + g_source_attach (self->progress_source, g_main_context_get_thread_default ()); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + +#ifdef HAVE_SYSPROF + self->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->install_apps_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + any_plugins_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* Set up progress reporting for this plugin. */ + g_hash_table_insert (self->plugins_progress, plugin, GUINT_TO_POINTER (0)); + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->install_apps_async (plugin, + self->apps, + self->flags, + plugin_progress_cb, + task, + app_needs_user_action_cb, + task, + cancellable, + plugin_install_apps_cb, + g_object_ref (task)); + } + + /* some functions are really required for proper operation */ + if (!any_plugins_ran) { + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no plugin could handle installing apps"); + } + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* Called in the same thread as gs_plugin_job_install_apps_run_async(), to + * report the progress for the given plugin. */ +static void +plugin_progress_cb (GsPlugin *plugin, + guint progress, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPluginJobInstallApps *self = g_task_get_source_object (task); + + g_assert (g_main_context_is_owner (g_task_get_context (task))); + g_hash_table_replace (self->plugins_progress, plugin, GUINT_TO_POINTER (progress)); +} + +static gboolean +progress_cb (gpointer user_data) +{ + GsPluginJobInstallApps *self = GS_PLUGIN_JOB_INSTALL_APPS (user_data); + gdouble progress; + guint n_portions; + GHashTableIter iter; + gpointer plugin_progress_ptr; + gboolean all_unknown = TRUE; + + /* Sum up the progress for all parallel operations. + * + * Allocate each operation an equal portion of 100 percentage points. In + * this context, an operation is a call to a plugin’s + * install_apps_async() vfunc. */ + n_portions = g_hash_table_size (self->plugins_progress); + progress = 0.0; + g_hash_table_iter_init (&iter, self->plugins_progress); + + while (g_hash_table_iter_next (&iter, NULL, &plugin_progress_ptr)) { + guint plugin_progress = GPOINTER_TO_UINT (plugin_progress_ptr); + + if (plugin_progress == GS_APP_PROGRESS_UNKNOWN) + continue; + else + all_unknown = FALSE; + + progress += (100.0 / n_portions) * ((gdouble) plugin_progress / 100.0); + } + + if (all_unknown) + progress = GS_APP_PROGRESS_UNKNOWN; + + if ((guint) progress != self->last_reported_progress) { + /* Report progress via signal emission. */ + /* FIXME: In future we could add explicit signals to notify that a + * download operation is blocked on waiting for metered data permission + * to download, so the UI can represent that better. */ + g_signal_emit (self, signals[SIGNAL_PROGRESS], 0, (guint) progress); + self->last_reported_progress = progress; + } + + return G_SOURCE_CONTINUE; +} + +static void +plugin_install_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobInstallApps *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + /* Forward cancellation errors, but ignore all other errors so + * that other plugins don’t get blocked. + * + * If plugins produce errors which should be reported to the user, they + * should report them directly by calling gs_plugin_report_event(). + * #GsPluginJobInstallApps cannot do this as it doesn’t know which errors + * are interesting to the user and which are useless. */ + if (!plugin_class->install_apps_finish (plugin, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("Plugin ‘%s‘ failed to install apps: %s", + gs_plugin_get_name (plugin), local_error->message); + g_clear_error (&local_error); + } + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + GS_PROFILER_ADD_MARK_TAKE (PluginJobInstallApps, + self->begin_time_nsec, + g_strdup_printf ("%s:%s", + G_OBJECT_TYPE_NAME (self), + gs_plugin_get_name (plugin)), + NULL); + + /* Update progress reporting. */ + g_hash_table_replace (self->plugins_progress, plugin, GUINT_TO_POINTER (100)); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobInstallApps *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while updating apps: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* Emit one final progress update, then stop any further ones. + * Ensure the emission is in the right #GMainContext. */ + g_assert (g_main_context_is_owner (g_task_get_context (task))); + progress_cb (self); + g_source_destroy (self->progress_source); + g_clear_pointer (&self->plugins_progress, g_hash_table_unref); + + /* Get the results of the parallel ops. */ + if (self->saved_error != NULL) { + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + /* Check the intermediate working values are all cleared. */ + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* success */ + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + + GS_PROFILER_ADD_MARK (PluginJobInstallApps, + self->begin_time_nsec, + G_OBJECT_TYPE_NAME (self), + NULL); +} + +static gboolean +gs_plugin_job_install_apps_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_install_apps_class_init (GsPluginJobInstallAppsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_install_apps_dispose; + object_class->get_property = gs_plugin_job_install_apps_get_property; + object_class->set_property = gs_plugin_job_install_apps_set_property; + + job_class->run_async = gs_plugin_job_install_apps_run_async; + job_class->run_finish = gs_plugin_job_install_apps_run_finish; + + /** + * GsPluginJobInstallApps:apps: + * + * List of apps to install. + * + * Since: 47 + */ + props[PROP_APPS] = + g_param_spec_object ("apps", "Apps", + "List of apps to install.", + GS_TYPE_APP_LIST, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobInstallApps:flags: + * + * Flags to specify how the install job should behave. + * + * Currently, it is forbidden to specify both + * %GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD and + * %GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY at the same time. + * + * Since: 47 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to specify how the install job should behave.", + GS_TYPE_PLUGIN_INSTALL_APPS_FLAGS, GS_PLUGIN_INSTALL_APPS_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); + + /** + * GsPluginJobInstallApps::app-needs-user-action: + * @app: (not nullable): the app which needs user action + * @action_screenshot: (not nullable): an image and caption explaining what action is needed + * + * Emitted during #GsPluginJob.run_async() if an app needs user action + * to upgrade. + * + * This is typically used for firmware upgrades where a piece of + * hardware needs user interaction to accept a firmware upgrade, such as + * being turned on and off, or having a button pressed. + * + * The image in @action_screenshot should explain to the user what to do + * to the device. + * + * It’s emitted in the thread which is running the #GMainContext which + * was the thread-default context when #GsPluginJob.run_async() was + * called. + * + * Since: 47 + */ + signals[SIGNAL_APP_NEEDS_USER_ACTION] = + g_signal_new ("app-needs-user-action", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 2, GS_TYPE_APP, AS_TYPE_SCREENSHOT); + + /** + * GsPluginJobInstallApps::progress: + * @progress_percent: percentage completion of the job, [0, 100], or + * %G_MAXUINT to indicate that progress is unknown + * + * Emitted during #GsPluginJob.run_async() when progress is made. + * + * It’s emitted in the thread which is running the #GMainContext which + * was the thread-default context when #GsPluginJob.run_async() was + * called. + * + * Since: 47 + */ + signals[SIGNAL_PROGRESS] = + g_signal_new ("progress", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); +} + +static void +gs_plugin_job_install_apps_init (GsPluginJobInstallApps *self) +{ +} + +/** + * gs_plugin_job_install_apps_new: + * @apps: (transfer none) (not nullable): list of apps to install + * @flags: flags to affect the install + * + * Create a new #GsPluginJobInstallApps for updating apps, or pre-downloading + * apps for installation. + * + * Returns: (transfer full): a new #GsPluginJobInstallApps + * Since: 47 + */ +GsPluginJob * +gs_plugin_job_install_apps_new (GsAppList *apps, + GsPluginInstallAppsFlags flags) +{ + g_return_val_if_fail (GS_IS_APP_LIST (apps), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_INSTALL_APPS, + "apps", apps, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_install_apps_get_apps: + * @self: a #GsPluginJobInstallApps + * + * Get the set of apps being installed by this #GsPluginJobInstallApps. + * + * Returns: apps being installed + * Since: 47 + */ +GsAppList * +gs_plugin_job_install_apps_get_apps (GsPluginJobInstallApps *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_INSTALL_APPS (self), NULL); + + return self->apps; +} + +/** + * gs_plugin_job_install_apps_get_flags: + * @self: a #GsPluginJobInstallApps + * + * Get the flags affecting the behaviour of this #GsPluginJobInstallApps. + * + * Returns: flags for the job + * Since: 47 + */ +GsPluginInstallAppsFlags +gs_plugin_job_install_apps_get_flags (GsPluginJobInstallApps *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_INSTALL_APPS (self), GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + + return self->flags; +} diff --git a/lib/gs-plugin-job-install-apps.h b/lib/gs-plugin-job-install-apps.h new file mode 100644 index 0000000..9341d2a --- /dev/null +++ b/lib/gs-plugin-job-install-apps.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2023 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_INSTALL_APPS (gs_plugin_job_install_apps_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobInstallApps, gs_plugin_job_install_apps, GS, PLUGIN_JOB_INSTALL_APPS, GsPluginJob) + +GsPluginJob *gs_plugin_job_install_apps_new (GsAppList *apps, + GsPluginInstallAppsFlags flags); + +GsAppList *gs_plugin_job_install_apps_get_apps (GsPluginJobInstallApps *self); +GsPluginInstallAppsFlags gs_plugin_job_install_apps_get_flags (GsPluginJobInstallApps *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-launch.c b/lib/gs-plugin-job-launch.c new file mode 100644 index 0000000..6a52510 --- /dev/null +++ b/lib/gs-plugin-job-launch.c @@ -0,0 +1,301 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-launch + * @short_description: A plugin job on an app + * + * #GsPluginJobLaunch is a #GsPluginJob to launch an app in a plugin-specific way. + * + * This class is a wrapper around #GsPluginClass.launch_async + * calling it for all loaded plugins. + * + * Since: 47 + */ + +#include "config.h" + +#include +#include + +#include "gs-app.h" +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-launch.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-types.h" + +struct _GsPluginJobLaunch +{ + GsPluginJob parent; + + /* Input arguments. */ + GsApp *app; /* (owned) (not nullable) */ + GsPluginLaunchFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; +}; + +G_DEFINE_TYPE (GsPluginJobLaunch, gs_plugin_job_launch, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_FLAGS = 1, + PROP_APP, +} GsPluginJobLaunchProperty; + +static GParamSpec *props[PROP_APP + 1] = { NULL, }; + +static void +gs_plugin_job_launch_dispose (GObject *object) +{ + GsPluginJobLaunch *self = GS_PLUGIN_JOB_LAUNCH (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_object (&self->app); + + G_OBJECT_CLASS (gs_plugin_job_launch_parent_class)->dispose (object); +} + +static void +gs_plugin_job_launch_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobLaunch *self = GS_PLUGIN_JOB_LAUNCH (object); + + switch ((GsPluginJobLaunchProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + case PROP_APP: + g_value_set_object (value, self->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_launch_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobLaunch *self = GS_PLUGIN_JOB_LAUNCH (object); + + switch ((GsPluginJobLaunchProperty) prop_id) { + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_APP: + /* Construct only. */ + g_assert (self->app == NULL); + self->app = g_value_dup_object (value); + g_assert (self->app != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_launch_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobLaunch *self = GS_PLUGIN_JOB_LAUNCH (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_launch_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->launch_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->launch_async (plugin, self->app, self->flags, cancellable, plugin_app_func_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle app operation"); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + gboolean success; + g_autoptr(GError) local_error = NULL; + + success = plugin_class->launch_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + g_assert (success || local_error != NULL); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobLaunch *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while launching app: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + if (self->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + else + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_launch_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_launch_class_init (GsPluginJobLaunchClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_launch_dispose; + object_class->get_property = gs_plugin_job_launch_get_property; + object_class->set_property = gs_plugin_job_launch_set_property; + + job_class->run_async = gs_plugin_job_launch_run_async; + job_class->run_finish = gs_plugin_job_launch_run_finish; + + /** + * GsPluginJobLaunch:app: (not nullable) + * + * A #GsApp describing the app to run the operation on. + * + * Since: 47 + */ + props[PROP_APP] = + g_param_spec_object ("app", "App", + "A #GsApp describing the app to run the operation on.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobLaunch:flags: + * + * Flags affecting how the operation runs. + * + * Since: 47 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags affecting how the operation runs.", + GS_TYPE_PLUGIN_LAUNCH_FLAGS, + GS_PLUGIN_LAUNCH_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_launch_init (GsPluginJobLaunch *self) +{ +} + +/** + * gs_plugin_job_launch_new: + * @app: (not nullable) (transfer none): an app to run the operation on + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobLaunch to launch the @app. + * + * Returns: (transfer full): a new #GsPluginJobLaunch + * Since: 47 + */ +GsPluginJob * +gs_plugin_job_launch_new (GsApp *app, + GsPluginLaunchFlags flags) +{ + g_return_val_if_fail (GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_LAUNCH, + "app", app, + "flags", flags, + "interactive", (flags & GS_PLUGIN_LAUNCH_FLAGS_INTERACTIVE) != 0, + NULL); +} diff --git a/lib/gs-plugin-job-launch.h b/lib/gs-plugin-job-launch.h new file mode 100644 index 0000000..9fa6251 --- /dev/null +++ b/lib/gs-plugin-job-launch.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_LAUNCH (gs_plugin_job_launch_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobLaunch, gs_plugin_job_launch, GS, PLUGIN_JOB_LAUNCH, GsPluginJob) + +GsPluginJob *gs_plugin_job_launch_new (GsApp *app, + GsPluginLaunchFlags flags); + +G_END_DECLS diff --git a/lib/gs-plugin-job-list-apps.c b/lib/gs-plugin-job-list-apps.c new file mode 100644 index 0000000..20bfe24 --- /dev/null +++ b/lib/gs-plugin-job-list-apps.c @@ -0,0 +1,632 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-list-apps + * @short_description: A plugin job to list apps according to a search query + * + * #GsPluginJobListApps is a #GsPluginJob representing an operation to + * list apps which match a given query, from all #GsPlugins. + * + * The known properties on the set of apps returned by this operation can be + * controlled with the #GsAppQuery:refine-flags property of the query. All + * results will be refined using the given set of refine flags. See + * #GsPluginJobRefine. + * + * This class is a wrapper around #GsPluginClass.list_apps_async, + * calling it for all loaded plugins, with #GsPluginJobRefine used to refine + * them. + * + * Retrieve the resulting #GsAppList using + * gs_plugin_job_list_apps_get_result_list(). + * + * See also: #GsPluginClass.list_apps_async + * Since: 43 + */ + +#include "config.h" + +#include +#include + +#include "gs-app.h" +#include "gs-app-list-private.h" +#include "gs-app-query.h" +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-list-apps.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-refine.h" +#include "gs-plugin-private.h" +#include "gs-plugin-types.h" +#include "gs-profiler.h" +#include "gs-utils.h" + +struct _GsPluginJobListApps +{ + GsPluginJob parent; + + /* Input arguments. */ + GsAppQuery *query; /* (owned) (nullable) */ + GsPluginListAppsFlags flags; + + /* In-progress data. */ + GsAppList *merged_list; /* (owned) (nullable) */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + + /* Results. */ + GsAppList *result_list; /* (owned) (nullable) */ + +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec; +#endif +}; + +G_DEFINE_TYPE (GsPluginJobListApps, gs_plugin_job_list_apps, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_QUERY = 1, + PROP_FLAGS, +} GsPluginJobListAppsProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +static void +gs_plugin_job_list_apps_dispose (GObject *object) +{ + GsPluginJobListApps *self = GS_PLUGIN_JOB_LIST_APPS (object); + + g_assert (self->merged_list == NULL); + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_object (&self->result_list); + g_clear_object (&self->query); + + G_OBJECT_CLASS (gs_plugin_job_list_apps_parent_class)->dispose (object); +} + +static void +gs_plugin_job_list_apps_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobListApps *self = GS_PLUGIN_JOB_LIST_APPS (object); + + switch ((GsPluginJobListAppsProperty) prop_id) { + case PROP_QUERY: + g_value_set_object (value, self->query); + break; + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_list_apps_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobListApps *self = GS_PLUGIN_JOB_LIST_APPS (object); + + switch ((GsPluginJobListAppsProperty) prop_id) { + case PROP_QUERY: + /* Construct only. */ + g_assert (self->query == NULL); + self->query = g_value_dup_object (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +filter_valid_apps (GsApp *app, + gpointer user_data) +{ + GsPluginJobListApps *self = GS_PLUGIN_JOB_LIST_APPS (user_data); + GsPluginRefineFlags refine_flags = GS_PLUGIN_REFINE_FLAGS_NONE; + + if (self->query) + refine_flags = gs_app_query_get_refine_flags (self->query); + + return gs_plugin_loader_app_is_valid (app, refine_flags); +} + +static gboolean +filter_freely_licensed_apps (GsApp *app, + gpointer user_data) +{ + return (gs_app_get_kind (app) != AS_COMPONENT_KIND_GENERIC && + gs_app_get_kind (app) != AS_COMPONENT_KIND_DESKTOP_APP && + gs_app_get_kind (app) != AS_COMPONENT_KIND_CONSOLE_APP && + gs_app_get_kind (app) != AS_COMPONENT_KIND_WEB_APP) || + gs_app_get_state (app) == GS_APP_STATE_INSTALLED || + gs_app_get_state (app) == GS_APP_STATE_UPDATABLE || + gs_app_get_state (app) == GS_APP_STATE_UPDATABLE_LIVE || + gs_app_get_license_is_free (app); +} + +static gboolean +filter_developer_verified_apps (GsApp *app, + gpointer user_data) +{ + return gs_app_has_quirk (app, GS_APP_QUIRK_DEVELOPER_VERIFIED); +} + +static gboolean +filter_updatable_apps (GsApp *app, + gpointer user_data) +{ + return (gs_app_is_updatable (app) || + gs_app_get_state (app) == GS_APP_STATE_DOWNLOADING || + gs_app_get_state (app) == GS_APP_STATE_INSTALLING); +} + +static gboolean +filter_nonupdatable_apps (GsApp *app, + gpointer user_data) +{ + return !gs_app_is_updatable (app); +} + +static gboolean +filter_sources (GsApp *app, + gpointer user_data) +{ + return (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY); +} + +static gboolean +app_filter_qt_for_gtk_and_compatible (GsApp *app, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (user_data); + + /* hide the QT versions in preference to the GTK ones */ + if (g_strcmp0 (gs_app_get_id (app), "transmission-qt.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "nntpgrab_qt.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "gimagereader-qt4.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "gimagereader-qt5.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "nntpgrab_server_qt.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "hotot-qt.desktop") == 0) { + g_debug ("removing QT version of %s", + gs_app_get_unique_id (app)); + return FALSE; + } + + /* hide the KDE version in preference to the GTK one */ + if (g_strcmp0 (gs_app_get_id (app), "qalculate_kde.desktop") == 0) { + g_debug ("removing KDE version of %s", + gs_app_get_unique_id (app)); + return FALSE; + } + + /* hide the KDE version in preference to the Qt one */ + if (g_strcmp0 (gs_app_get_id (app), "kid3.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "kchmviewer.desktop") == 0) { + g_debug ("removing KDE version of %s", + gs_app_get_unique_id (app)); + return FALSE; + } + + return gs_plugin_loader_app_is_compatible (plugin_loader, app); +} + +static void plugin_list_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); +static void refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_task (GTask *task, + GsAppList *merged_list); + +static void +gs_plugin_job_list_apps_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobListApps *self = GS_PLUGIN_JOB_LIST_APPS (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_list_apps_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + self->merged_list = gs_app_list_new (); + plugins = gs_plugin_loader_get_plugins (plugin_loader); + +#ifdef HAVE_SYSPROF + self->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->list_apps_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->list_apps_async (plugin, self->query, self->flags, cancellable, plugin_list_apps_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle listing apps"); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_list_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobListApps *self = g_task_get_source_object (task); + g_autoptr(GsAppList) plugin_apps = NULL; + g_autoptr(GError) local_error = NULL; + + plugin_apps = plugin_class->list_apps_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + if (plugin_apps != NULL) + gs_app_list_add_list (self->merged_list, plugin_apps); + + /* Only log errors from plugins. No need to discard everything when one plugin fails. */ + if (local_error != NULL && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("plugin '%s' failed to list apps: %s", + gs_plugin_get_name (plugin), + local_error->message); + g_clear_error (&local_error); + } + + GS_PROFILER_ADD_MARK_TAKE (PluginJobListApps, + self->begin_time_nsec, + g_strdup_printf ("%s:%s", + G_OBJECT_TYPE_NAME (self), + gs_plugin_get_name (plugin)), + NULL); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobListApps *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginLoader *plugin_loader = g_task_get_task_data (task); + g_autoptr(GsAppList) merged_list = NULL; + GsPluginRefineFlags refine_flags = GS_PLUGIN_REFINE_FLAGS_NONE; + GsAppQueryLicenseType license_type = GS_APP_QUERY_LICENSE_ANY; + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while listing apps: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + merged_list = g_steal_pointer (&self->merged_list); + + if (self->saved_error != NULL) { + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + /* run refine() on each one if required */ + if (self->query != NULL) { + refine_flags = gs_app_query_get_refine_flags (self->query); + license_type = gs_app_query_get_license_type (self->query); + } + + if (!(refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) && + license_type != GS_APP_QUERY_LICENSE_ANY) { + /* Needs the license information when filtering with it */ + refine_flags |= GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE; + } + + if (merged_list != NULL && + gs_app_list_length (merged_list) > 0 && + refine_flags != GS_PLUGIN_REFINE_FLAGS_NONE) { + g_autoptr(GsPluginJob) refine_job = NULL; + + refine_job = gs_plugin_job_refine_new (merged_list, + refine_flags | + GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING); + gs_plugin_loader_job_process_async (plugin_loader, refine_job, + cancellable, + refine_cb, + g_object_ref (task)); + } else { + g_debug ("No apps to refine"); + finish_task (task, merged_list); + } +} + +static void +refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobListApps *self = g_task_get_source_object (task); + g_autoptr(GsAppList) new_list = NULL; + g_autoptr(GError) local_error = NULL; + + new_list = gs_plugin_loader_job_process_finish (plugin_loader, result, &local_error); + if (new_list == NULL) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + finish_task (task, new_list); +} + +static void +finish_task (GTask *task, + GsAppList *merged_list) +{ + GsPluginJobListApps *self = g_task_get_source_object (task); + GsPluginLoader *plugin_loader = g_task_get_task_data (task); + GsAppListFilterFlags dedupe_flags = GS_APP_LIST_FILTER_FLAG_NONE; + GsAppListSortFunc sort_func = NULL; + gpointer sort_func_data = NULL; + GsAppQueryLicenseType license_type = GS_APP_QUERY_LICENSE_ANY; + GsAppQueryDeveloperVerifiedType developer_verified_type = GS_APP_QUERY_DEVELOPER_VERIFIED_ANY; + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_source = GS_APP_QUERY_TRISTATE_UNSET; + GsAppListFilterFunc filter_func = NULL; + gpointer filter_func_data = NULL; + guint max_results = 0; + g_autofree gchar *job_debug = NULL; + + if (self->query != NULL) { + license_type = gs_app_query_get_license_type (self->query); + developer_verified_type = gs_app_query_get_developer_verified_type (self->query); + is_for_update = gs_app_query_get_is_for_update (self->query); + is_source = gs_app_query_get_is_source (self->query); + } + + if (is_source == GS_APP_QUERY_TRISTATE_UNSET || + is_source == GS_APP_QUERY_TRISTATE_FALSE) { + /* Standard filtering for apps. + * + * FIXME: It feels like this filter should be done in a different layer. */ + gs_app_list_filter (merged_list, filter_valid_apps, self); + gs_app_list_filter (merged_list, app_filter_qt_for_gtk_and_compatible, plugin_loader); + + if (license_type == GS_APP_QUERY_LICENSE_FOSS) + gs_app_list_filter (merged_list, filter_freely_licensed_apps, self); + if (developer_verified_type == GS_APP_QUERY_DEVELOPER_VERIFIED_ONLY) + gs_app_list_filter (merged_list, filter_developer_verified_apps, self); + if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE) + gs_app_list_filter (merged_list, filter_updatable_apps, self); + else if (is_for_update == GS_APP_QUERY_TRISTATE_FALSE) + gs_app_list_filter (merged_list, filter_nonupdatable_apps, self); + } else if (is_source == GS_APP_QUERY_TRISTATE_TRUE) { + /* Filtering for sources/repositories. */ + gs_app_list_filter (merged_list, filter_sources, self); + } + + /* Caller-specified filtering. */ + if (self->query != NULL) + filter_func = gs_app_query_get_filter_func (self->query, &filter_func_data); + + if (filter_func != NULL) + gs_app_list_filter (merged_list, filter_func, filter_func_data); + + /* Filter duplicates with priority, taking into account the source name + * & version, so we combine available updates with the installed app */ + if (self->query != NULL) + dedupe_flags = gs_app_query_get_dedupe_flags (self->query); + + if (dedupe_flags != GS_APP_LIST_FILTER_FLAG_NONE) + gs_app_list_filter_duplicates (merged_list, dedupe_flags); + + /* Sort the results. The refine may have added useful metadata. */ + if (self->query != NULL) + sort_func = gs_app_query_get_sort_func (self->query, &sort_func_data); + + if (sort_func != NULL) { + gs_app_list_sort (merged_list, sort_func, sort_func_data); + } else { + g_debug ("no ->sort_func() set, using random!"); + gs_app_list_randomize (merged_list); + } + + /* Truncate the results if needed. */ + if (self->query != NULL) + max_results = gs_app_query_get_max_results (self->query); + + if (max_results > 0 && gs_app_list_length (merged_list) > max_results) { + g_debug ("truncating results from %u to %u", + gs_app_list_length (merged_list), max_results); + gs_app_list_truncate (merged_list, max_results); + } + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + /* Check the intermediate working values are all cleared. */ + g_assert (self->merged_list == NULL); + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* success */ + g_set_object (&self->result_list, merged_list); + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + +#ifdef HAVE_SYSPROF + sysprof_collector_mark (self->begin_time_nsec, + SYSPROF_CAPTURE_CURRENT_TIME - self->begin_time_nsec, + "gnome-software", + G_OBJECT_TYPE_NAME (self), + NULL); +#endif +} + +static gboolean +gs_plugin_job_list_apps_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_list_apps_class_init (GsPluginJobListAppsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_list_apps_dispose; + object_class->get_property = gs_plugin_job_list_apps_get_property; + object_class->set_property = gs_plugin_job_list_apps_set_property; + + job_class->run_async = gs_plugin_job_list_apps_run_async; + job_class->run_finish = gs_plugin_job_list_apps_run_finish; + + /** + * GsPluginJobListApps:query: (nullable) + * + * A #GsAppQuery defining the query parameters. + * + * If this is %NULL, all apps will be returned. + * + * Since: 43 + */ + props[PROP_QUERY] = + g_param_spec_object ("query", "Query", + "A #GsAppQuery defining the query parameters.", + GS_TYPE_APP_QUERY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobListApps:flags: + * + * Flags to specify how the operation should run. + * + * Since: 43 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to specify how the operation should run.", + GS_TYPE_PLUGIN_LIST_APPS_FLAGS, + GS_PLUGIN_LIST_APPS_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_list_apps_init (GsPluginJobListApps *self) +{ +} + +/** + * gs_plugin_job_list_apps_new: + * @query: (nullable) (transfer none): query to affect which apps to return + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobListApps for listing apps according to the given + * @query. + * + * Returns: (transfer full): a new #GsPluginJobListApps + * Since: 43 + */ +GsPluginJob * +gs_plugin_job_list_apps_new (GsAppQuery *query, + GsPluginListAppsFlags flags) +{ + g_return_val_if_fail (query == NULL || GS_IS_APP_QUERY (query), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_LIST_APPS, + "query", query, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_list_apps_get_result_list: + * @self: a #GsPluginJobListApps + * + * Get the full list of apps matching the query. + * + * If this is called before the job is complete, %NULL will be returned. + * + * Returns: (transfer none) (nullable): the job results, or %NULL on error + * or if called before the job has completed + * Since: 43 + */ +GsAppList * +gs_plugin_job_list_apps_get_result_list (GsPluginJobListApps *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_LIST_APPS (self), NULL); + + return self->result_list; +} diff --git a/lib/gs-plugin-job-list-apps.h b/lib/gs-plugin-job-list-apps.h new file mode 100644 index 0000000..13d5697 --- /dev/null +++ b/lib/gs-plugin-job-list-apps.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app-query.h" +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_LIST_APPS (gs_plugin_job_list_apps_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobListApps, gs_plugin_job_list_apps, GS, PLUGIN_JOB_LIST_APPS, GsPluginJob) + +GsPluginJob *gs_plugin_job_list_apps_new (GsAppQuery *query, + GsPluginListAppsFlags flags); + +GsAppList *gs_plugin_job_list_apps_get_result_list (GsPluginJobListApps *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-list-categories.c b/lib/gs-plugin-job-list-categories.c new file mode 100644 index 0000000..775325d --- /dev/null +++ b/lib/gs-plugin-job-list-categories.c @@ -0,0 +1,389 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-list-categories + * @short_description: A plugin job to list categories + * + * #GsPluginJobListCategories is a #GsPluginJob representing an operation to + * list categories. + * + * All results will be refined using the given set of refine flags, similarly to + * how #GsPluginJobRefine refines apps. + * + * This class is a wrapper around #GsPluginClass.refine_categories_async, + * calling it for all loaded plugins on the list of categories exposed by a + * #GsCategoryManager. + * + * Retrieve the resulting #GPtrArray of #GsCategory objects using + * gs_plugin_job_list_categories_get_result_list(). + * + * See also: #GsPluginClass.refine_categories_async + * Since: 43 + */ + +#include "config.h" + +#include +#include + +#include "gs-category.h" +#include "gs-category-private.h" +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-list-categories.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-private.h" +#include "gs-plugin-types.h" +#include "gs-profiler.h" +#include "gs-utils.h" + +struct _GsPluginJobListCategories +{ + GsPluginJob parent; + + /* Input arguments. */ + GsPluginRefineCategoriesFlags flags; + + /* In-progress data. */ + GPtrArray *category_list; /* (element-type GsCategory) (owned) (nullable) */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + + /* Results. */ + GPtrArray *result_list; /* (element-type GsCategory) (owned) (nullable) */ + +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec; +#endif +}; + +G_DEFINE_TYPE (GsPluginJobListCategories, gs_plugin_job_list_categories, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_FLAGS = 1, +} GsPluginJobListCategoriesProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +static void +gs_plugin_job_list_categories_dispose (GObject *object) +{ + GsPluginJobListCategories *self = GS_PLUGIN_JOB_LIST_CATEGORIES (object); + + g_assert (self->category_list == NULL); + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_pointer (&self->result_list, g_ptr_array_unref); + + G_OBJECT_CLASS (gs_plugin_job_list_categories_parent_class)->dispose (object); +} + +static void +gs_plugin_job_list_categories_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobListCategories *self = GS_PLUGIN_JOB_LIST_CATEGORIES (object); + + switch ((GsPluginJobListCategoriesProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_list_categories_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobListCategories *self = GS_PLUGIN_JOB_LIST_CATEGORIES (object); + + switch ((GsPluginJobListCategoriesProperty) prop_id) { + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void plugin_refine_categories_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_list_categories_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobListCategories *self = GS_PLUGIN_JOB_LIST_CATEGORIES (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + GsCategory * const *categories = NULL; + gsize n_categories; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_list_categories_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* get the categories */ + categories = gs_category_manager_get_categories (gs_plugin_loader_get_category_manager (plugin_loader), &n_categories); + self->category_list = g_ptr_array_new_full (n_categories, (GDestroyNotify) g_object_unref); + + for (gsize i = 0; i < n_categories; i++) { + /* reset the sizes to 0, because the plugins just increment the current value */ + gs_category_set_size (categories[i], 0); + + g_ptr_array_add (self->category_list, g_object_ref (categories[i])); + } + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + +#ifdef HAVE_SYSPROF + self->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->refine_categories_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->refine_categories_async (plugin, self->category_list, self->flags, cancellable, plugin_refine_categories_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle listing categories"); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_refine_categories_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + g_autoptr(GError) local_error = NULL; +#ifdef HAVE_SYSPROF + GsPluginJobListCategories *self = g_task_get_source_object (task); +#endif + + GS_PROFILER_ADD_MARK_TAKE (PluginJobListCategories, + self->begin_time_nsec, + g_strdup_printf ("%s:%s", + G_OBJECT_TYPE_NAME (self), + gs_plugin_get_name (plugin)), + NULL); + + if (!plugin_class->refine_categories_finish (plugin, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("plugin '%s' failed to refine categories: %s", + gs_plugin_get_name (plugin), + local_error->message); + g_clear_error (&local_error); + } + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static gint +category_sort_cb (gconstpointer a, + gconstpointer b) +{ + GsCategory *category_a = GS_CATEGORY (*(GsCategory **) a); + GsCategory *category_b = GS_CATEGORY (*(GsCategory **) b); + gint score_a = gs_category_get_score (category_a); + gint score_b = gs_category_get_score (category_b); + + if (score_a != score_b) + return score_b - score_a; + return gs_utils_sort_strcmp (gs_category_get_name (category_a), + gs_category_get_name (category_b)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobListCategories *self = g_task_get_source_object (task); + g_autoptr(GPtrArray) category_list = NULL; + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while listing categories: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + category_list = g_steal_pointer (&self->category_list); + + if (self->saved_error != NULL) { + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + /* sort by name */ + g_ptr_array_sort (category_list, category_sort_cb); + for (guint i = 0; i < category_list->len; i++) { + GsCategory *category = GS_CATEGORY (g_ptr_array_index (category_list, i)); + gs_category_sort_children (category); + } + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + /* Check the intermediate working values are all cleared. */ + g_assert (self->category_list == NULL); + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* success */ + self->result_list = g_ptr_array_ref (category_list); + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + +#ifdef HAVE_SYSPROF + sysprof_collector_mark (self->begin_time_nsec, + SYSPROF_CAPTURE_CURRENT_TIME - self->begin_time_nsec, + "gnome-software", + G_OBJECT_TYPE_NAME (self), + NULL); +#endif +} + +static gboolean +gs_plugin_job_list_categories_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_list_categories_class_init (GsPluginJobListCategoriesClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_list_categories_dispose; + object_class->get_property = gs_plugin_job_list_categories_get_property; + object_class->set_property = gs_plugin_job_list_categories_set_property; + + job_class->run_async = gs_plugin_job_list_categories_run_async; + job_class->run_finish = gs_plugin_job_list_categories_run_finish; + + /** + * GsPluginJobListCategories:flags: + * + * Flags to specify how the operation should run. + * + * Since: 43 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to specify how the operation should run.", + GS_TYPE_PLUGIN_REFINE_CATEGORIES_FLAGS, + GS_PLUGIN_REFINE_CATEGORIES_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_list_categories_init (GsPluginJobListCategories *self) +{ +} + +/** + * gs_plugin_job_list_categories_new: + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobListCategories for listing categories. + * + * Returns: (transfer full): a new #GsPluginJobListCategories + * Since: 43 + */ +GsPluginJob * +gs_plugin_job_list_categories_new (GsPluginRefineCategoriesFlags flags) +{ + return g_object_new (GS_TYPE_PLUGIN_JOB_LIST_CATEGORIES, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_list_categories_get_result_list: + * @self: a #GsPluginJobListCategories + * + * Get the full list of categories. + * + * If this is called before the job is complete, %NULL will be returned. + * + * Returns: (transfer none) (nullable) (element-type GsCategory): the job + * results, or %NULL on error or if called before the job has completed + * Since: 43 + */ +GPtrArray * +gs_plugin_job_list_categories_get_result_list (GsPluginJobListCategories *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_LIST_CATEGORIES (self), NULL); + + return self->result_list; +} diff --git a/lib/gs-plugin-job-list-categories.h b/lib/gs-plugin-job-list-categories.h new file mode 100644 index 0000000..5d20134 --- /dev/null +++ b/lib/gs-plugin-job-list-categories.h @@ -0,0 +1,29 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_LIST_CATEGORIES (gs_plugin_job_list_categories_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobListCategories, gs_plugin_job_list_categories, GS, PLUGIN_JOB_LIST_CATEGORIES, GsPluginJob) + +GsPluginJob *gs_plugin_job_list_categories_new (GsPluginRefineCategoriesFlags flags); + +GPtrArray *gs_plugin_job_list_categories_get_result_list (GsPluginJobListCategories *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-list-distro-upgrades.c b/lib/gs-plugin-job-list-distro-upgrades.c new file mode 100644 index 0000000..6fd4497 --- /dev/null +++ b/lib/gs-plugin-job-list-distro-upgrades.c @@ -0,0 +1,437 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-list-distro-upgrades + * @short_description: A plugin job to list distro upgrades + * + * #GsPluginJobListDistroUpgrades is a #GsPluginJob representing an operation to + * list available upgrades for the distro, from all #GsPlugins. + * + * Upgrades for the distro are large upgrades, such as from Fedora 34 to + * Fedora 35. They are not small package updates. + * + * This job will list the available upgrades, but will not download them or + * install them. Due to the typical size of an upgrade, these should not be + * downloaded until the user has explicitly requested it. + * + * The known properties on the set of apps returned by this operation can be + * controlled with the #GsPluginJobListDistroUpgrades:refine-flags property. All + * results will be refined using %GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION + * plus the given set of refine flags. See #GsPluginJobRefine. + * + * This class is a wrapper around #GsPluginClass.list_distro_upgrades_async, + * calling it for all loaded plugins, with some additional filtering + * done on the results and #GsPluginJobRefine used to refine them. + * + * Retrieve the resulting #GsAppList using + * gs_plugin_job_list_distro_upgrades_get_result_list(). Components in the list + * are expected to be of type %AS_COMPONENT_KIND_OPERATING_SYSTEM. + * + * See also: #GsPluginClass.list_distro_upgrades_async + * Since: 42 + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-app.h" +#include "gs-app-list-private.h" +#include "gs-enums.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-list-distro-upgrades.h" +#include "gs-plugin-job-refine.h" +#include "gs-plugin-private.h" +#include "gs-plugin-types.h" +#include "gs-utils.h" + +struct _GsPluginJobListDistroUpgrades +{ + GsPluginJob parent; + + /* Input arguments. */ + GsPluginListDistroUpgradesFlags flags; + GsPluginRefineFlags refine_flags; + + /* In-progress data. */ + GsAppList *merged_list; /* (owned) (nullable) */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + + /* Results. */ + GsAppList *result_list; /* (owned) (nullable) */ +}; + +G_DEFINE_TYPE (GsPluginJobListDistroUpgrades, gs_plugin_job_list_distro_upgrades, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_REFINE_FLAGS = 1, + PROP_FLAGS, +} GsPluginJobListDistroUpgradesProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +static void +gs_plugin_job_list_distro_upgrades_dispose (GObject *object) +{ + GsPluginJobListDistroUpgrades *self = GS_PLUGIN_JOB_LIST_DISTRO_UPGRADES (object); + + g_assert (self->merged_list == NULL); + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_object (&self->result_list); + + G_OBJECT_CLASS (gs_plugin_job_list_distro_upgrades_parent_class)->dispose (object); +} + +static void +gs_plugin_job_list_distro_upgrades_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobListDistroUpgrades *self = GS_PLUGIN_JOB_LIST_DISTRO_UPGRADES (object); + + switch ((GsPluginJobListDistroUpgradesProperty) prop_id) { + case PROP_REFINE_FLAGS: + g_value_set_flags (value, self->refine_flags); + break; + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_list_distro_upgrades_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobListDistroUpgrades *self = GS_PLUGIN_JOB_LIST_DISTRO_UPGRADES (object); + + switch ((GsPluginJobListDistroUpgradesProperty) prop_id) { + case PROP_REFINE_FLAGS: + /* Construct only. */ + g_assert (self->refine_flags == 0); + self->refine_flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gint +app_sort_version_cb (GsApp *app1, + GsApp *app2, + gpointer user_data) +{ + return gs_utils_compare_versions (gs_app_get_version (app1), + gs_app_get_version (app2)); +} + +static void plugin_list_distro_upgrades_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); +static void refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_task (GTask *task, + GsAppList *merged_list); + +static void +gs_plugin_job_list_distro_upgrades_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobListDistroUpgrades *self = GS_PLUGIN_JOB_LIST_DISTRO_UPGRADES (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + /* check required args */ + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_list_distro_upgrades_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + self->merged_list = gs_app_list_new (); + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->list_distro_upgrades_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->list_distro_upgrades_async (plugin, self->flags, cancellable, plugin_list_distro_upgrades_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle listing distro upgrades"); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_list_distro_upgrades_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobListDistroUpgrades *self = g_task_get_source_object (task); + g_autoptr(GsAppList) plugin_apps = NULL; + g_autoptr(GError) local_error = NULL; + + plugin_apps = plugin_class->list_distro_upgrades_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + if (plugin_apps != NULL) + gs_app_list_add_list (self->merged_list, plugin_apps); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobListDistroUpgrades *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginLoader *plugin_loader = g_task_get_task_data (task); + g_autoptr(GsAppList) merged_list = NULL; + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while listing distro upgrades: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + merged_list = g_steal_pointer (&self->merged_list); + + if (self->saved_error != NULL) { + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + /* run refine() on each one if required */ + if (merged_list != NULL && + gs_app_list_length (merged_list) > 0) { + g_autoptr(GsPluginJob) refine_job = NULL; + + /* Always specify REQUIRE_SETUP_ACTION, as that requires enough + * information to be able to install the upgrade later if + * requested. */ + refine_job = gs_plugin_job_refine_new (merged_list, + self->refine_flags | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION | + GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING); + gs_plugin_loader_job_process_async (plugin_loader, refine_job, + cancellable, + refine_cb, + g_object_ref (task)); + } else { + g_debug ("No distro upgrades to refine"); + finish_task (task, merged_list); + } +} + +static void +refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobListDistroUpgrades *self = g_task_get_source_object (task); + g_autoptr(GsAppList) new_list = NULL; + g_autoptr(GError) local_error = NULL; + + new_list = gs_plugin_loader_job_process_finish (plugin_loader, result, &local_error); + if (new_list == NULL) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + finish_task (task, new_list); +} + +static void +finish_task (GTask *task, + GsAppList *merged_list) +{ + GsPluginJobListDistroUpgrades *self = g_task_get_source_object (task); + g_autofree gchar *job_debug = NULL; + + /* Sort the results. The refine may have added useful metadata. */ + gs_app_list_sort (merged_list, app_sort_version_cb, NULL); + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + /* Check the intermediate working values are all cleared. */ + g_assert (self->merged_list == NULL); + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* success */ + g_set_object (&self->result_list, merged_list); + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_list_distro_upgrades_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_list_distro_upgrades_class_init (GsPluginJobListDistroUpgradesClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_list_distro_upgrades_dispose; + object_class->get_property = gs_plugin_job_list_distro_upgrades_get_property; + object_class->set_property = gs_plugin_job_list_distro_upgrades_set_property; + + job_class->run_async = gs_plugin_job_list_distro_upgrades_run_async; + job_class->run_finish = gs_plugin_job_list_distro_upgrades_run_finish; + + /** + * GsPluginJobListDistroUpgrades:refine-flags: + * + * Flags to specify how to refine the returned apps. + * + * %GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION will always be used. + * + * Since: 42 + */ + props[PROP_REFINE_FLAGS] = + g_param_spec_flags ("refine-flags", "Refine Flags", + "Flags to specify how to refine the returned apps.", + GS_TYPE_PLUGIN_REFINE_FLAGS, GS_PLUGIN_REFINE_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobListDistroUpgrades:flags: + * + * Flags to specify how the operation should run. + * + * Since: 42 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to specify how the operation should run.", + GS_TYPE_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS, + GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_list_distro_upgrades_init (GsPluginJobListDistroUpgrades *self) +{ +} + +/** + * gs_plugin_job_list_distro_upgrades_new: + * @flags: flags affecting how the operation runs + * @refine_flags: flags to affect how the results are refined + * + * Create a new #GsPluginJobListDistroUpgrades for listing the available distro + * upgrades. + * + * Returns: (transfer full): a new #GsPluginJobListDistroUpgrades + * Since: 42 + */ +GsPluginJob * +gs_plugin_job_list_distro_upgrades_new (GsPluginListDistroUpgradesFlags flags, + GsPluginRefineFlags refine_flags) +{ + return g_object_new (GS_TYPE_PLUGIN_JOB_LIST_DISTRO_UPGRADES, + "refine-flags", refine_flags, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_list_distro_upgrades_get_result_list: + * @self: a #GsPluginJobListDistroUpgrades + * + * Get the full list of available distro upgrades. + * + * If this is called before the job is complete, %NULL will be returned. + * + * Returns: (transfer none) (nullable): the job results, or %NULL on error + * or if called before the job has completed + * Since: 42 + */ +GsAppList * +gs_plugin_job_list_distro_upgrades_get_result_list (GsPluginJobListDistroUpgrades *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_LIST_DISTRO_UPGRADES (self), NULL); + + return self->result_list; +} diff --git a/lib/gs-plugin-job-list-distro-upgrades.h b/lib/gs-plugin-job-list-distro-upgrades.h new file mode 100644 index 0000000..4bc416d --- /dev/null +++ b/lib/gs-plugin-job-list-distro-upgrades.h @@ -0,0 +1,30 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_LIST_DISTRO_UPGRADES (gs_plugin_job_list_distro_upgrades_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobListDistroUpgrades, gs_plugin_job_list_distro_upgrades, GS, PLUGIN_JOB_LIST_DISTRO_UPGRADES, GsPluginJob) + +GsPluginJob *gs_plugin_job_list_distro_upgrades_new (GsPluginListDistroUpgradesFlags flags, + GsPluginRefineFlags refine_flags); + +GsAppList *gs_plugin_job_list_distro_upgrades_get_result_list (GsPluginJobListDistroUpgrades *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-manage-repository.c b/lib/gs-plugin-job-manage-repository.c new file mode 100644 index 0000000..4a21357 --- /dev/null +++ b/lib/gs-plugin-job-manage-repository.c @@ -0,0 +1,371 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-manage-repository + * @short_description: A plugin job on a repository + * + * #GsPluginJobManageRepository is a #GsPluginJob representing an operation on + * a repository, like install, remove, enable and disable it. + * + * This class is a wrapper around #GsPluginClass.install_repository_async, + * #GsPluginClass.remove_repository_async, #GsPluginClass.enable_repository_async + * and #GsPluginClass.disable_repository_async calling it for all loaded plugins. + * + * Since: 43 + */ + +#include "config.h" + +#include +#include + +#include "gs-app.h" +#include "gs-app-collation.h" +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-manage-repository.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-types.h" + +struct _GsPluginJobManageRepository +{ + GsPluginJob parent; + + /* Input arguments. */ + GsApp *repository; /* (owned) (not nullable) */ + GsPluginManageRepositoryFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; +}; + +G_DEFINE_TYPE (GsPluginJobManageRepository, gs_plugin_job_manage_repository, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_FLAGS = 1, + PROP_REPOSITORY, +} GsPluginJobManageRepositoryProperty; + +static GParamSpec *props[PROP_REPOSITORY + 1] = { NULL, }; + +static void +gs_plugin_job_manage_repository_dispose (GObject *object) +{ + GsPluginJobManageRepository *self = GS_PLUGIN_JOB_MANAGE_REPOSITORY (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_object (&self->repository); + + G_OBJECT_CLASS (gs_plugin_job_manage_repository_parent_class)->dispose (object); +} + +static void +gs_plugin_job_manage_repository_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobManageRepository *self = GS_PLUGIN_JOB_MANAGE_REPOSITORY (object); + + switch ((GsPluginJobManageRepositoryProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + case PROP_REPOSITORY: + g_value_set_object (value, self->repository); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_manage_repository_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobManageRepository *self = GS_PLUGIN_JOB_MANAGE_REPOSITORY (object); + + switch ((GsPluginJobManageRepositoryProperty) prop_id) { + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_REPOSITORY: + /* Construct only. */ + g_assert (self->repository == NULL); + self->repository = g_value_dup_object (value); + g_assert (self->repository != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void plugin_repository_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_manage_repository_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobManageRepository *self = GS_PLUGIN_JOB_MANAGE_REPOSITORY (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_manage_repository_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + void (* repository_func_async) (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) = NULL; + + if (!gs_plugin_get_enabled (plugin)) + continue; + if ((self->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL) != 0) + repository_func_async = plugin_class->install_repository_async; + else if ((self->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE) != 0) + repository_func_async = plugin_class->remove_repository_async; + else if ((self->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE) != 0) + repository_func_async = plugin_class->enable_repository_async; + else if ((self->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE) != 0) + repository_func_async = plugin_class->disable_repository_async; + else + g_assert_not_reached (); + + if (repository_func_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + repository_func_async (plugin, self->repository, self->flags, cancellable, plugin_repository_func_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle repository operation"); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_repository_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobManageRepository *self = g_task_get_source_object (task); + gboolean success; + g_autoptr(GError) local_error = NULL; + gboolean (* repository_func_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error) = NULL; + + if ((self->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL) != 0) + repository_func_finish = plugin_class->install_repository_finish; + else if ((self->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE) != 0) + repository_func_finish = plugin_class->remove_repository_finish; + else if ((self->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE) != 0) + repository_func_finish = plugin_class->enable_repository_finish; + else if ((self->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE) != 0) + repository_func_finish = plugin_class->disable_repository_finish; + else + g_assert_not_reached (); + + success = repository_func_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + g_assert (success || local_error != NULL); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +reset_app_progress (GsApp *app) +{ + g_autoptr(GsAppList) addons = gs_app_dup_addons (app); + GsAppList *related = gs_app_get_related (app); + + gs_app_set_progress (app, GS_APP_PROGRESS_UNKNOWN); + + for (guint i = 0; addons != NULL && i < gs_app_list_length (addons); i++) { + GsApp *app_addons = gs_app_list_index (addons, i); + gs_app_set_progress (app_addons, GS_APP_PROGRESS_UNKNOWN); + } + for (guint i = 0; i < gs_app_list_length (related); i++) { + GsApp *app_related = gs_app_list_index (related, i); + gs_app_set_progress (app_related, GS_APP_PROGRESS_UNKNOWN); + } +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobManageRepository *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while managing repository: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + reset_app_progress (self->repository); + + if (self->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + else + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_manage_repository_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_manage_repository_class_init (GsPluginJobManageRepositoryClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_manage_repository_dispose; + object_class->get_property = gs_plugin_job_manage_repository_get_property; + object_class->set_property = gs_plugin_job_manage_repository_set_property; + + job_class->run_async = gs_plugin_job_manage_repository_run_async; + job_class->run_finish = gs_plugin_job_manage_repository_run_finish; + + /** + * GsPluginJobManageRepository:repository: (not nullable) + * + * A #GsApp describing the repository to run the operation on. + * + * Since: 43 + */ + props[PROP_REPOSITORY] = + g_param_spec_object ("repository", "Repository", + "A #GsApp describing the repository to run the operation on.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobManageRepository:flags: + * + * Flags to specify how and which the operation should run. + * Only one of the %GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL, + * %GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE, %GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE and + * %GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE can be specified. + * + * Since: 43 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to specify how and which the operation should run.", + GS_TYPE_PLUGIN_MANAGE_REPOSITORY_FLAGS, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_manage_repository_init (GsPluginJobManageRepository *self) +{ +} + +/** + * gs_plugin_job_manage_repository_new: + * @repository: (not nullable) (transfer none): a repository to run the operation on + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobManageRepository to manage the given @repository. + * + * Returns: (transfer full): a new #GsPluginJobManageRepository + * Since: 43 + */ +GsPluginJob * +gs_plugin_job_manage_repository_new (GsApp *repository, + GsPluginManageRepositoryFlags flags) +{ + guint nops = 0; + + g_return_val_if_fail (GS_IS_APP (repository), NULL); + + if ((flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL) != 0) + nops++; + if ((flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE) != 0) + nops++; + if ((flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE) != 0) + nops++; + if ((flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE) != 0) + nops++; + + g_return_val_if_fail (nops == 1, NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_MANAGE_REPOSITORY, + "repository", repository, + "flags", flags, + NULL); +} diff --git a/lib/gs-plugin-job-manage-repository.h b/lib/gs-plugin-job-manage-repository.h new file mode 100644 index 0000000..4a68908 --- /dev/null +++ b/lib/gs-plugin-job-manage-repository.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_MANAGE_REPOSITORY (gs_plugin_job_manage_repository_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobManageRepository, gs_plugin_job_manage_repository, GS, PLUGIN_JOB_MANAGE_REPOSITORY, GsPluginJob) + +GsPluginJob *gs_plugin_job_manage_repository_new (GsApp *repository, + GsPluginManageRepositoryFlags flags); + +G_END_DECLS diff --git a/lib/gs-plugin-job-private.h b/lib/gs-plugin-job-private.h new file mode 100644 index 0000000..73ce526 --- /dev/null +++ b/lib/gs-plugin-job-private.h @@ -0,0 +1,41 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +GsPluginAction gs_plugin_job_get_action (GsPluginJob *self); +GsAppListFilterFlags gs_plugin_job_get_dedupe_flags (GsPluginJob *self); +GsPluginRefineFlags gs_plugin_job_get_refine_flags (GsPluginJob *self); +gboolean gs_plugin_job_has_refine_flags (GsPluginJob *self, + GsPluginRefineFlags refine_flags); +void gs_plugin_job_add_refine_flags (GsPluginJob *self, + GsPluginRefineFlags refine_flags); +void gs_plugin_job_remove_refine_flags (GsPluginJob *self, + GsPluginRefineFlags refine_flags); +gboolean gs_plugin_job_get_interactive (GsPluginJob *self); +gboolean gs_plugin_job_get_propagate_error (GsPluginJob *self); +guint gs_plugin_job_get_max_results (GsPluginJob *self); +const gchar *gs_plugin_job_get_search (GsPluginJob *self); +GsApp *gs_plugin_job_get_app (GsPluginJob *self); +GsAppList *gs_plugin_job_get_list (GsPluginJob *self); +GFile *gs_plugin_job_get_file (GsPluginJob *self); +GsPlugin *gs_plugin_job_get_plugin (GsPluginJob *self); +gchar *gs_plugin_job_to_string (GsPluginJob *self); +void gs_plugin_job_set_action (GsPluginJob *self, + GsPluginAction action); +void gs_plugin_job_set_cancellable (GsPluginJob *self, + GCancellable *cancellable); +void gs_plugin_job_cancel (GsPluginJob *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-refine.c b/lib/gs-plugin-job-refine.c new file mode 100644 index 0000000..d0a16e2 --- /dev/null +++ b/lib/gs-plugin-job-refine.c @@ -0,0 +1,959 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-refine + * @short_description: A plugin job to refine #GsApps and add more data + * + * #GsPluginJobRefine is a #GsPluginJob representing a refine operation. + * + * It’s used to query and add more data to a set of #GsApps. The data to be set + * is controlled by the #GsPluginRefineFlags, and is looked up for all the apps + * in a #GsAppList by the loaded plugins. + * + * This class is a wrapper around #GsPluginClass.refine_async, calling it for + * all loaded plugins, with some additional refinements done on the results. + * + * In particular, if an app in the #GsAppList has %GS_APP_QUIRK_IS_WILDCARD, + * refining it will replace it with zero or more non-wildcard #GsApps in the + * #GsAppList, all of which are candidates for what the wildcard represents. + * For example, they may have the same ID as the wildcard, or match its name. + * Refining is the canonical process for resolving wildcards. + * + * This means that the #GsAppList at the end of the refine operation may not + * match the #GsAppList passed in as input. Retrieve the final #GsAppList using + * gs_plugin_job_refine_get_result_list(). The #GsAppList which was passed + * into the job will not be modified. + * + * Internally, the #GsPluginClass.refine_async() functions are called on all + * the plugins in series, and in series with calls to + * gs_odrs_provider_refine_async() and gs_rewrite_resources_async(). + * Once all of those calls are finished, + * zero or more recursive calls to run_refine_internal_async() are made in + * parallel to do a similar refine process on the addons, runtime and related + * components for all the components in the input #GsAppList. The refine job is + * complete once all these recursive calls complete. + * + * The call to gs_rewrite_resources_async() will rewrite the CSS of apps to + * refer to locally cached resources, rather than HTTP/HTTPS URIs for images + * (for example). + * + * FIXME: Ideally, the #GsPluginClass.refine_async() calls would happen in + * parallel, but this cannot be the case until the results of the refine_async() + * call in one plugin don’t depend on the results of refine_async() in another. + * This still happens with several pairs of plugins. + * + * ``` + * run_async() + * | + * v + * /-----------------------+-------------+----------------+------------------------------\ + * | | | | | + * plugin->refine_async() | | | | + * v plugin->refine_async() | | | + * | v … | | + * | | v gs_odrs_provider_refine_async() | + * | | | v gs_rewrite_resources_async() + * | | | | v + * | | | | | + * \-----------------------+-------------+----------------+------------------------------/ + * | + * finish_refine_internal_op() + * | + * v + * /----------------------------+-----------------\ + * | | | + * run_refine_internal_async() run_refine_internal_async() … + * | | | + * v v v + * \----------------------------+-----------------/ + * | + * finish_refine_internal_recursion() + * ``` + * + * See also: #GsPluginClass.refine_async + * Since: 42 + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-app.h" +#include "gs-app-collation.h" +#include "gs-app-private.h" +#include "gs-app-list-private.h" +#include "gs-enums.h" +#include "gs-plugin-private.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-refine.h" +#include "gs-profiler.h" +#include "gs-utils.h" + +struct _GsPluginJobRefine +{ + GsPluginJob parent; + + /* Input data. */ + GsAppList *app_list; /* (owned) */ + GsPluginRefineFlags flags; + + /* Output data. */ + GsAppList *result_list; /* (owned) (nullable) */ + +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec; +#endif +}; + +G_DEFINE_TYPE (GsPluginJobRefine, gs_plugin_job_refine, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_APP_LIST = 1, + PROP_FLAGS, +} GsPluginJobRefineProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +static void +gs_plugin_job_refine_dispose (GObject *object) +{ + GsPluginJobRefine *self = GS_PLUGIN_JOB_REFINE (object); + + g_clear_object (&self->app_list); + g_clear_object (&self->result_list); + + G_OBJECT_CLASS (gs_plugin_job_refine_parent_class)->dispose (object); +} + +static void +gs_plugin_job_refine_constructed (GObject *object) +{ + GsPluginJobRefine *self = GS_PLUGIN_JOB_REFINE (object); + + G_OBJECT_CLASS (gs_plugin_job_refine_parent_class)->constructed (object); + + /* FIXME: the plugins should specify this, rather than hardcoding */ + if (self->flags & (GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME)) + self->flags |= GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN; + if (self->flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) + self->flags |= GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME; +} + +static void +gs_plugin_job_refine_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobRefine *self = GS_PLUGIN_JOB_REFINE (object); + + switch ((GsPluginJobRefineProperty) prop_id) { + case PROP_APP_LIST: + g_value_set_object (value, self->app_list); + break; + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_refine_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobRefine *self = GS_PLUGIN_JOB_REFINE (object); + + switch ((GsPluginJobRefineProperty) prop_id) { + case PROP_APP_LIST: + /* Construct only. */ + g_assert (self->app_list == NULL); + self->app_list = g_value_dup_object (value); + g_object_notify_by_pspec (object, props[PROP_APP_LIST]); + break; + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +app_is_valid_filter (GsApp *app, + gpointer user_data) +{ + GsPluginJobRefine *self = GS_PLUGIN_JOB_REFINE (user_data); + + return gs_plugin_loader_app_is_valid (app, self->flags); +} + +static gint +review_score_sort_cb (gconstpointer a, gconstpointer b) +{ + AsReview *ra = *((AsReview **) a); + AsReview *rb = *((AsReview **) b); + if (as_review_get_priority (ra) < as_review_get_priority (rb)) + return 1; + if (as_review_get_priority (ra) > as_review_get_priority (rb)) + return -1; + return 0; +} + +static gboolean +app_is_non_wildcard (GsApp *app, gpointer user_data) +{ + return !gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD); +} + +static void plugin_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void odrs_provider_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void rewrite_resources_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_refine_internal_op (GTask *task, + GError *error); +static void recursive_internal_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_refine_internal_recursion (GTask *task, + GError *error); +static gboolean run_refine_internal_finish (GsPluginJobRefine *self, + GAsyncResult *result, + GError **error); + +typedef struct { + /* Input data. */ + GsPluginLoader *plugin_loader; /* (not nullable) (owned) */ + GsAppList *list; /* (not nullable) (owned) */ + GsPluginRefineFlags flags; + + /* In-progress data. */ + guint n_pending_ops; + guint n_pending_recursions; + guint next_plugin_index; + guint next_plugin_order; + +#ifdef HAVE_SYSPROF + gint64 plugin_begin_time_nsec; +#endif + + /* Output data. */ + GError *error; /* (nullable) (owned) */ +} RefineInternalData; + +static void +refine_internal_data_free (RefineInternalData *data) +{ + g_clear_object (&data->plugin_loader); + g_clear_object (&data->list); + + g_assert (data->n_pending_ops == 0); + g_assert (data->n_pending_recursions == 0); + + /* If an error occurred, it should have been stolen to pass to + * g_task_return_error() by now. */ + g_assert (data->error == NULL); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (RefineInternalData, refine_internal_data_free) + +static void +run_refine_internal_async (GsPluginJobRefine *self, + GsPluginLoader *plugin_loader, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GPtrArray *plugins; /* (element-type GsPlugin) */ + g_autoptr(GTask) task = NULL; + RefineInternalData *data; + g_autoptr(RefineInternalData) data_owned = NULL; + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, run_refine_internal_async); + + data = data_owned = g_new0 (RefineInternalData, 1); + data->plugin_loader = g_object_ref (plugin_loader); + data->list = g_object_ref (list); + data->flags = flags; +#ifdef HAVE_SYSPROF + data->plugin_begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) refine_internal_data_free); + + /* try to adopt each app with a plugin */ + gs_plugin_loader_run_adopt (plugin_loader, list); + + data->n_pending_ops = 0; + data->next_plugin_order = 0; + + /* run each plugin + * + * FIXME: For now, we have to run these vfuncs sequentially rather than + * all in parallel. This is because there are still dependencies between + * some of the plugins, where the code to refine an app in one plugin + * depends on the results of refining it in another plugin first. + * + * Eventually, the plugins should all be changed/removed so that they + * can operate independently. At that point, this code can be reverted + * so that the refine_async() vfuncs are called in parallel. */ + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (gs_plugin_get_order (plugin) > data->next_plugin_order) { + if (!anything_ran) + data->next_plugin_order = gs_plugin_get_order (plugin); + else + return; + } + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->refine_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* FIXME: The next refine_async() call is made in + * finish_refine_internal_op(). */ + data->next_plugin_index = i + 1; + + /* run the batched plugin symbol */ + data->n_pending_ops++; + plugin_class->refine_async (plugin, list, flags, + cancellable, plugin_refine_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle refining apps"); + + data->n_pending_ops++; + finish_refine_internal_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GError) local_error = NULL; +#ifdef HAVE_SYSPROF + GsPluginJobRefine *self = g_task_get_source_object (task); + RefineInternalData *data = g_task_get_task_data (task); +#endif + + GS_PROFILER_ADD_MARK_TAKE (PluginJobRefine, + data->plugin_begin_time_nsec, + g_strdup_printf ("%s:%s", + G_OBJECT_TYPE_NAME (self), + gs_plugin_get_name (plugin)), + NULL); + + if (!plugin_class->refine_finish (plugin, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("plugin '%s' failed to refine apps: %s", + gs_plugin_get_name (plugin), + local_error->message); + g_clear_error (&local_error); + } + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + finish_refine_internal_op (task, NULL); +} + +static void +odrs_provider_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsOdrsProvider *odrs_provider = GS_ODRS_PROVIDER (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_odrs_provider_refine_finish (odrs_provider, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("ODRS provider failed to refine apps: %s", + local_error->message); + g_clear_error (&local_error); + } + finish_refine_internal_op (task, g_steal_pointer (&local_error)); +} + +static void +rewrite_resources_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_rewrite_resources_finish (result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("Rewriting resources failed when refine apps: %s", + local_error->message); + g_clear_error (&local_error); + } + finish_refine_internal_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-NULL */ +static void +finish_refine_internal_op (GTask *task, + GError *error) +{ + GsPluginJobRefine *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + RefineInternalData *data = g_task_get_task_data (task); + GsPluginLoader *plugin_loader = data->plugin_loader; + GsAppList *list = data->list; + GsPluginRefineFlags flags = data->flags; + GsOdrsProvider *odrs_provider; + GsOdrsProviderRefineFlags odrs_refine_flags = 0; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + + if (data->error == NULL && error_owned != NULL) { + data->error = g_steal_pointer (&error_owned); + } else if (error_owned != NULL) { + g_debug ("Additional error while refining: %s", error_owned->message); + } + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + +#ifdef HAVE_SYSPROF + data->plugin_begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + if (data->n_pending_ops > 0) + return; + + /* We reach this line after all plugins of a certain order ran, and now + * we need to run the next set of plugins. */ + data->next_plugin_order++; + + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = data->next_plugin_index; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (gs_plugin_get_order (plugin) > data->next_plugin_order) { + if (!anything_ran) + data->next_plugin_order = gs_plugin_get_order (plugin); + else + return; + } + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->refine_async == NULL) + continue; + if (gs_plugin_get_order (plugin) < data->next_plugin_order) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* FIXME: The next refine_async() call is made in + * finish_refine_internal_op(). */ + data->next_plugin_index = i + 1; + + /* run the batched plugin symbol */ + data->n_pending_ops++; + plugin_class->refine_async (plugin, list, flags, + cancellable, plugin_refine_cb, g_object_ref (task)); + } + + if (data->next_plugin_index == plugins->len) { + /* Avoid the ODRS and rewrite refines being run multiple times. */ + data->next_plugin_index++; + + /* Add ODRS data if needed */ + odrs_provider = gs_plugin_loader_get_odrs_provider (plugin_loader); + + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS) + odrs_refine_flags |= GS_ODRS_PROVIDER_REFINE_FLAGS_GET_REVIEWS; + if (flags & (GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING)) + odrs_refine_flags |= GS_ODRS_PROVIDER_REFINE_FLAGS_GET_RATINGS; + + if (odrs_provider != NULL && odrs_refine_flags != 0) { + data->n_pending_ops++; + gs_odrs_provider_refine_async (odrs_provider, list, odrs_refine_flags, + cancellable, odrs_provider_refine_cb, g_object_ref (task)); + } + + /* Rewrite app CSS if needed. */ + data->n_pending_ops++; + gs_rewrite_resources_async (list, cancellable, rewrite_resources_cb, g_object_ref (task)); + } + + if (data->n_pending_ops > 0) + return; + + /* At this point, all the plugin->refine() calls are complete and the + * gs_odrs_provider_refine_async() and gs_rewrite_resources_async() + * calls are also complete. If an error + * occurred during those calls, return with it now rather than + * proceeding to the recursive calls below. */ + if (data->error != NULL) { + g_task_return_error (task, g_steal_pointer (&data->error)); + return; + } + + /* filter any wildcard apps left in the list */ + gs_app_list_filter (list, app_is_non_wildcard, NULL); + + /* ensure these are sorted by score */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS) { + GPtrArray *reviews; + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + reviews = gs_app_get_reviews (app); + g_ptr_array_sort (reviews, review_score_sort_cb); + } + } + + /* Now run several recursive calls to run_refine_internal_async() in + * parallel, to refine related components. */ + data->n_pending_recursions = 1; + + /* refine addons one layer deep */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS) { + g_autoptr(GsAppList) addons_list = gs_app_list_new (); + GsPluginRefineFlags addons_flags = flags; + + addons_flags &= ~(GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + g_autoptr(GsAppList) addons = gs_app_dup_addons (app); + + for (guint j = 0; addons != NULL && j < gs_app_list_length (addons); j++) { + GsApp *addon = gs_app_list_index (addons, j); + g_debug ("refining app %s addon %s", + gs_app_get_id (app), + gs_app_get_id (addon)); + gs_app_list_add (addons_list, addon); + } + } + + if (gs_app_list_length (addons_list) > 0 && addons_flags != 0) { + data->n_pending_recursions++; + run_refine_internal_async (self, plugin_loader, + addons_list, addons_flags, + cancellable, recursive_internal_refine_cb, + g_object_ref (task)); + } + } + + /* also do runtime */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME) { + g_autoptr(GsAppList) runtimes_list = gs_app_list_new (); + GsPluginRefineFlags runtimes_flags = flags; + + runtimes_flags &= ~GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME; + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + GsApp *runtime = gs_app_get_runtime (app); + + if (runtime != NULL) + gs_app_list_add (runtimes_list, runtime); + } + + if (gs_app_list_length (runtimes_list) > 0 && runtimes_flags != 0) { + data->n_pending_recursions++; + run_refine_internal_async (self, plugin_loader, + runtimes_list, runtimes_flags, + cancellable, recursive_internal_refine_cb, + g_object_ref (task)); + } + } + + /* also do related packages one layer deep */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED) { + g_autoptr(GsAppList) related_list = gs_app_list_new (); + GsPluginRefineFlags related_flags = flags; + + related_flags &= ~GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED; + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + GsAppList *related = gs_app_get_related (app); + for (guint j = 0; j < gs_app_list_length (related); j++) { + GsApp *app2 = gs_app_list_index (related, j); + g_debug ("refining related: %s[%s]", + gs_app_get_id (app2), + gs_app_get_source_default (app2)); + gs_app_list_add (related_list, app2); + } + } + + if (gs_app_list_length (related_list) > 0 && related_flags != 0) { + data->n_pending_recursions++; + run_refine_internal_async (self, plugin_loader, + related_list, related_flags, + cancellable, recursive_internal_refine_cb, + g_object_ref (task)); + } + } + + finish_refine_internal_recursion (task, NULL); +} + +static void +recursive_internal_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginJobRefine *self = GS_PLUGIN_JOB_REFINE (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!run_refine_internal_finish (self, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("failed to recursive-refine: %s", local_error->message); + g_clear_error (&local_error); + } + + finish_refine_internal_recursion (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-NULL */ +static void +finish_refine_internal_recursion (GTask *task, + GError *error) +{ + g_autoptr(GError) error_owned = g_steal_pointer (&error); + RefineInternalData *data = g_task_get_task_data (task); + + if (data->error == NULL && error_owned != NULL) { + data->error = g_steal_pointer (&error_owned); + } else if (error_owned != NULL) { + g_debug ("Additional error while refining: %s", error_owned->message); + } + + g_assert (data->n_pending_recursions > 0); + data->n_pending_recursions--; + + if (data->n_pending_recursions > 0) + return; + + /* The entire refine operation (and all its sub-operations and + * recursions) is complete. */ + if (data->error != NULL) + g_task_return_error (task, g_steal_pointer (&data->error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +run_refine_internal_finish (GsPluginJobRefine *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void run_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_run (GTask *task, + GsAppList *result_list); + +static void +gs_plugin_job_refine_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobRefine *self = GS_PLUGIN_JOB_REFINE (job); + g_autoptr(GTask) task = NULL; + g_autoptr(GsAppList) result_list = NULL; + + /* check required args */ + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_refine_run_async); + + /* Operate on a copy of the input list so we don’t modify it when + * resolving wildcards. */ + result_list = gs_app_list_copy (self->app_list); + g_task_set_task_data (task, g_object_ref (result_list), (GDestroyNotify) g_object_unref); + + /* nothing to do */ + if (self->flags == 0 || + gs_app_list_length (result_list) == 0) { + g_debug ("no refine flags set for transaction or app list is empty"); + finish_run (task, result_list); + return; + } + +#ifdef HAVE_SYSPROF + self->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + /* Start refining the apps. */ + run_refine_internal_async (self, plugin_loader, result_list, + self->flags, cancellable, + run_cb, g_steal_pointer (&task)); +} + +static void +run_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginJobRefine *self = GS_PLUGIN_JOB_REFINE (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsAppList *result_list = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + if (run_refine_internal_finish (self, result, &local_error)) { + /* remove any addons that have the same source as the parent app */ + for (guint i = 0; i < gs_app_list_length (result_list); i++) { + g_autoptr(GPtrArray) to_remove = g_ptr_array_new (); + GsApp *app = gs_app_list_index (result_list, i); + g_autoptr(GsAppList) addons = gs_app_dup_addons (app); + + /* find any apps with the same source */ + const gchar *pkgname_parent = gs_app_get_source_default (app); + if (pkgname_parent == NULL) + continue; + for (guint j = 0; addons != NULL && j < gs_app_list_length (addons); j++) { + GsApp *addon = gs_app_list_index (addons, j); + if (g_strcmp0 (gs_app_get_source_default (addon), + pkgname_parent) == 0) { + g_debug ("%s has the same pkgname of %s as %s", + gs_app_get_unique_id (app), + pkgname_parent, + gs_app_get_unique_id (addon)); + g_ptr_array_add (to_remove, addon); + } + } + + /* remove any addons with the same source */ + for (guint j = 0; j < to_remove->len; j++) { + GsApp *addon = g_ptr_array_index (to_remove, j); + gs_app_remove_addon (app, addon); + } + } + } + + /* Delayed error handling. */ + if (local_error != NULL) { + gs_utils_error_convert_gio (&local_error); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + finish_run (task, result_list); +} + +static void +finish_run (GTask *task, + GsAppList *result_list) +{ + GsPluginJobRefine *self = g_task_get_source_object (task); + g_autofree gchar *job_debug = NULL; + + /* Internal calls to #GsPluginJobRefine may want to do their own + * filtering, typically if the refine is being done as part of another + * plugin job. If so, only filter to remove wildcards. Wildcards should + * always be removed, as they should have been resolved as part of the + * refine; any remaining wildcards will never be resolved. + * + * If the flag is not specified, filter by a variety of indicators of + * what a ‘valid’ app is. */ + if (self->flags & GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING) + gs_app_list_filter (result_list, app_is_non_wildcard, NULL); + else + gs_app_list_filter (result_list, app_is_valid_filter, self); + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + /* success */ + g_set_object (&self->result_list, result_list); + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_refine_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + GS_PROFILER_ADD_MARK (PluginJobRefine, + GS_PLUGIN_JOB_REFINE (self)->begin_time_nsec, + G_OBJECT_TYPE_NAME (self), + NULL); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_refine_class_init (GsPluginJobRefineClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_refine_dispose; + object_class->constructed = gs_plugin_job_refine_constructed; + object_class->get_property = gs_plugin_job_refine_get_property; + object_class->set_property = gs_plugin_job_refine_set_property; + + job_class->run_async = gs_plugin_job_refine_run_async; + job_class->run_finish = gs_plugin_job_refine_run_finish; + + /** + * GsPluginJobRefine:app-list: + * + * List of #GsApps to refine. + * + * This will not change during the course of the operation. + * + * Since: 42 + */ + props[PROP_APP_LIST] = + g_param_spec_object ("app-list", "App List", + "List of GsApps to refine.", + GS_TYPE_APP_LIST, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobRefine:flags: + * + * Flags to control what to refine. + * + * Since: 42 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to control what to refine.", + GS_TYPE_PLUGIN_REFINE_FLAGS, GS_PLUGIN_REFINE_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_refine_init (GsPluginJobRefine *self) +{ +} + +/** + * gs_plugin_job_refine_new: + * @app_list: the list of #GsApps to refine + * @flags: flags to affect what is refined + * + * Create a new #GsPluginJobRefine for refining the given @app_list. + * + * Returns: (transfer full): a new #GsPluginJobRefine + * Since: 42 + */ +GsPluginJob * +gs_plugin_job_refine_new (GsAppList *app_list, + GsPluginRefineFlags flags) +{ + return g_object_new (GS_TYPE_PLUGIN_JOB_REFINE, + "app-list", app_list, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_refine_new_for_app: + * @app: the #GsApp to refine + * @flags: flags to affect what is refined + * + * Create a new #GsPluginJobRefine for refining the given @app. + * + * Returns: (transfer full): a new #GsPluginJobRefine + * Since: 42 + */ +GsPluginJob * +gs_plugin_job_refine_new_for_app (GsApp *app, + GsPluginRefineFlags flags) +{ + g_autoptr(GsAppList) list = gs_app_list_new (); + gs_app_list_add (list, app); + + return gs_plugin_job_refine_new (list, flags); +} + +/** + * gs_plugin_job_refine_get_result_list: + * @self: a #GsPluginJobRefine + * + * Get the full list of refined #GsApps. This includes apps created in place of + * wildcards, if wildcards were provided in the #GsAppList passed to + * gs_plugin_job_refine_new(). + * + * If this is called before the job is complete, %NULL will be returned. + * + * Returns: (transfer none) (nullable): the job results, or %NULL on error + * or if called before the job has completed + * Since: 42 + */ +GsAppList * +gs_plugin_job_refine_get_result_list (GsPluginJobRefine *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_REFINE (self), NULL); + + return self->result_list; +} diff --git a/lib/gs-plugin-job-refine.h b/lib/gs-plugin-job-refine.h new file mode 100644 index 0000000..85a33e9 --- /dev/null +++ b/lib/gs-plugin-job-refine.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_REFINE (gs_plugin_job_refine_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobRefine, gs_plugin_job_refine, GS, PLUGIN_JOB_REFINE, GsPluginJob) + +GsPluginJob *gs_plugin_job_refine_new_for_app (GsApp *app, + GsPluginRefineFlags flags); +GsPluginJob *gs_plugin_job_refine_new (GsAppList *app_list, + GsPluginRefineFlags flags); + +GsAppList *gs_plugin_job_refine_get_result_list (GsPluginJobRefine *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-refresh-metadata.c b/lib/gs-plugin-job-refresh-metadata.c new file mode 100644 index 0000000..0e52319 --- /dev/null +++ b/lib/gs-plugin-job-refresh-metadata.c @@ -0,0 +1,586 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-refresh-metadata + * @short_description: A plugin job to refresh metadata + * + * #GsPluginJobRefreshMetadata is a #GsPluginJob representing an operation to + * refresh metadata inside plugins and about apps. + * + * For example, the metadata could be the list of apps available, or + * the list of updates, or a new set of popular apps to highlight. + * + * The maximum cache age should be set using + * #GsPluginJobRefreshMetadata:cache-age-secs. If this is not a low value, this + * job is not expected to do much work. Set it to zero to force all caches to be + * refreshed. + * + * This class is a wrapper around #GsPluginClass.refresh_metadata_async(), + * calling it for all loaded plugins. In addition it will refresh ODRS data on + * the #GsOdrsProvider set on the #GsPluginLoader. + * + * Once the refresh is complete, signals may be asynchronously emitted on + * plugins, apps and the #GsPluginLoader to indicate what metadata or sets of + * apps have changed. + * + * See also: #GsPluginClass.refresh_metadata_async + * Since: 42 + */ + +#include "config.h" + +#include +#include +#include + +#ifdef HAVE_SYSPROF +#include +#endif + +#include "gs-enums.h" +#include "gs-external-appstream-utils.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-refresh-metadata.h" +#include "gs-plugin-types.h" +#include "gs-profiler.h" +#include "gs-odrs-provider.h" +#include "gs-utils.h" + +/* A tuple to store the last-received progress data for a single download. + * See progress_cb() for more details. */ +typedef struct { + gsize bytes_downloaded; + gsize total_download_size; +} ProgressTuple; + +struct _GsPluginJobRefreshMetadata +{ + GsPluginJob parent; + + /* Input arguments. */ + guint64 cache_age_secs; + GsPluginRefreshMetadataFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; +#ifdef ENABLE_EXTERNAL_APPSTREAM + ProgressTuple external_appstream_progress; +#endif + ProgressTuple odrs_progress; + struct { + guint n_plugins; + guint n_plugins_complete; + } plugins_progress; + GSource *progress_source; /* (owned) (nullable) */ + guint last_reported_progress; + +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec; +#endif +}; + +G_DEFINE_TYPE (GsPluginJobRefreshMetadata, gs_plugin_job_refresh_metadata, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_CACHE_AGE_SECS = 1, + PROP_FLAGS, +} GsPluginJobRefreshMetadataProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +typedef enum { + SIGNAL_PROGRESS, +} GsPluginJobRefreshMetadataSignal; + +static guint signals[SIGNAL_PROGRESS + 1] = { 0, }; + +static void +gs_plugin_job_refresh_metadata_dispose (GObject *object) +{ + GsPluginJobRefreshMetadata *self = GS_PLUGIN_JOB_REFRESH_METADATA (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* Progress reporting should have been stopped by now. */ + if (self->progress_source != NULL) { + g_assert (g_source_is_destroyed (self->progress_source)); + g_clear_pointer (&self->progress_source, g_source_unref); + } + + G_OBJECT_CLASS (gs_plugin_job_refresh_metadata_parent_class)->dispose (object); +} + +static void +gs_plugin_job_refresh_metadata_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobRefreshMetadata *self = GS_PLUGIN_JOB_REFRESH_METADATA (object); + + switch ((GsPluginJobRefreshMetadataProperty) prop_id) { + case PROP_CACHE_AGE_SECS: + g_value_set_uint64 (value, self->cache_age_secs); + break; + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_refresh_metadata_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobRefreshMetadata *self = GS_PLUGIN_JOB_REFRESH_METADATA (object); + + switch ((GsPluginJobRefreshMetadataProperty) prop_id) { + case PROP_CACHE_AGE_SECS: + /* Construct only. */ + g_assert (self->cache_age_secs == 0); + self->cache_age_secs = g_value_get_uint64 (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void refresh_progress_tuple_cb (gsize bytes_downloaded, + gsize total_download_size, + gpointer user_data); +static gboolean progress_cb (gpointer user_data); +#ifdef ENABLE_EXTERNAL_APPSTREAM +static void external_appstream_refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +#endif +static void odrs_provider_refresh_ratings_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void plugin_refresh_metadata_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_refresh_metadata_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobRefreshMetadata *self = GS_PLUGIN_JOB_REFRESH_METADATA (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean any_plugins_ran = FALSE; + GsOdrsProvider *odrs_provider; + g_autoptr(GError) local_error = NULL; + + /* Chosen to allow a few UI updates per second without updating the + * progress label so often it’s unreadable. */ + const guint progress_update_period_ms = 300; + + /* check required args */ + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_refresh_metadata_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* Set up the progress timeout. This periodically sums up the progress + * tuples in `self->*_progress` and reports them to the calling + * function via the #GsPluginJobRefreshMetadata::progress signal, giving + * an overall progress for all the parallel operations. */ + self->progress_source = g_timeout_source_new (progress_update_period_ms); + self->last_reported_progress = GS_APP_PROGRESS_UNKNOWN; + g_source_set_callback (self->progress_source, progress_cb, self, NULL); + g_source_attach (self->progress_source, g_main_context_get_thread_default ()); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + odrs_provider = gs_plugin_loader_get_odrs_provider (plugin_loader); + + /* Start downloading updated external appstream before anything else */ +#ifdef ENABLE_EXTERNAL_APPSTREAM + if (!g_cancellable_is_cancelled (cancellable)) { + g_autoptr(GSettings) settings = NULL; + g_auto(GStrv) appstream_urls = NULL; + + self->n_pending_ops++; + settings = g_settings_new ("org.gnome.software"); + appstream_urls = g_settings_get_strv (settings, + "external-appstream-urls"); + gs_external_appstream_refresh_async (NULL, + appstream_urls, + self->cache_age_secs, + refresh_progress_tuple_cb, + &self->external_appstream_progress, + cancellable, + external_appstream_refresh_cb, + g_object_ref (task)); + } +#endif + +#ifdef HAVE_SYSPROF + self->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->refresh_metadata_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + any_plugins_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* Set up progress reporting for this plugin. */ + self->plugins_progress.n_plugins++; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->refresh_metadata_async (plugin, + self->cache_age_secs, + self->flags, + cancellable, + plugin_refresh_metadata_cb, + g_object_ref (task)); + } + + if (odrs_provider != NULL && + !g_cancellable_is_cancelled (cancellable)) { + self->n_pending_ops++; + gs_odrs_provider_refresh_ratings_async (odrs_provider, + self->cache_age_secs, + refresh_progress_tuple_cb, + &self->odrs_progress, + cancellable, + odrs_provider_refresh_ratings_cb, + g_object_ref (task)); + } + + /* some functions are really required for proper operation */ + if (!any_plugins_ran) { + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no plugin could handle refreshing"); + } + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +refresh_progress_tuple_cb (gsize bytes_downloaded, + gsize total_download_size, + gpointer user_data) +{ + ProgressTuple *tuple = user_data; + + tuple->bytes_downloaded = bytes_downloaded; + tuple->total_download_size = total_download_size; + + /* The timeout callback in progress_cb() periodically sums these. No + * need to notify of progress from here. */ +} + +static gboolean +progress_cb (gpointer user_data) +{ + GsPluginJobRefreshMetadata *self = GS_PLUGIN_JOB_REFRESH_METADATA (user_data); +#ifdef ENABLE_EXTERNAL_APPSTREAM + gdouble external_appstream_completion = 0.0; +#endif + gdouble odrs_completion = 0.0; + gdouble progress; + guint n_portions; + + /* Sum up the progress for all parallel operations. This is complicated + * by the fact that external-appstream and ODRS operations report their + * progress in terms of bytes downloaded, but the other operations are + * just a counter. + * + * There is further complication from the fact that external-appstream + * support can be compiled out. + * + * Allocate each operation an equal portion of 100 percentage points. In + * this context, an operation is either a call to a plugin’s + * refresh_metadata_async() vfunc, or an external-appstream or ODRS + * refresh. */ + n_portions = self->plugins_progress.n_plugins; + +#ifdef ENABLE_EXTERNAL_APPSTREAM + if (self->external_appstream_progress.total_download_size > 0) + external_appstream_completion = (self->external_appstream_progress.bytes_downloaded / + self->external_appstream_progress.total_download_size); + n_portions++; +#endif + + if (self->odrs_progress.total_download_size > 0) + odrs_completion = (self->odrs_progress.bytes_downloaded / + self->odrs_progress.total_download_size); + n_portions++; + + /* Report progress via signal emission. */ + progress = (100.0 / n_portions) * (self->plugins_progress.n_plugins_complete + odrs_completion); +#ifdef ENABLE_EXTERNAL_APPSTREAM + progress += (100.0 / n_portions) * external_appstream_completion; +#endif + + if ((guint) progress != self->last_reported_progress) { + g_signal_emit (self, signals[SIGNAL_PROGRESS], 0, (guint) progress); + self->last_reported_progress = progress; + } + + return G_SOURCE_CONTINUE; +} + +#ifdef ENABLE_EXTERNAL_APPSTREAM +static void +external_appstream_refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_external_appstream_refresh_finish (result, NULL, &local_error)) + g_debug ("Failed to refresh external appstream: %s", local_error->message); + /* Intentionally ignore errors, to not block other plugins */ + finish_op (task, NULL); +} +#endif /* ENABLE_EXTERNAL_APPSTREAM */ + +static void +odrs_provider_refresh_ratings_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsOdrsProvider *odrs_provider = GS_ODRS_PROVIDER (source_object); + g_autoptr(GTask) task = G_TASK (user_data); + g_autoptr(GError) local_error = NULL; +#ifdef HAVE_SYSPROF + GsPluginJobRefreshMetadata *self = g_task_get_source_object (task); +#endif + + if (!gs_odrs_provider_refresh_ratings_finish (odrs_provider, result, &local_error)) + g_debug ("Failed to refresh ratings: %s", local_error->message); + + GS_PROFILER_ADD_MARK_TAKE (PluginJobRefreshMetadata, + self->begin_time_nsec, + g_strdup_printf ("%s:odrs", G_OBJECT_TYPE_NAME (self)), + NULL); + + /* Intentionally ignore errors, to not block other plugins */ + finish_op (task, NULL); +} + +static void +plugin_refresh_metadata_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobRefreshMetadata *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + if (!plugin_class->refresh_metadata_finish (plugin, result, &local_error)) + g_debug ("Failed to refresh plugin '%s': %s", gs_plugin_get_name (plugin), local_error->message); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + /* Update progress reporting. */ + self->plugins_progress.n_plugins_complete++; + + GS_PROFILER_ADD_MARK_TAKE (PluginJobRefreshMetadata, + self->begin_time_nsec, + g_strdup_printf ("%s:%s", + G_OBJECT_TYPE_NAME (self), + gs_plugin_get_name (plugin)), + NULL); + + /* Intentionally ignore errors, to not block other plugins */ + finish_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobRefreshMetadata *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while refreshing metadata: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* Emit one final progress update, then stop any further ones. + * Ensure the emission is in the right #GMainContext. */ + g_assert (g_main_context_is_owner (g_task_get_context (task))); + progress_cb (self); + g_source_destroy (self->progress_source); + + /* Get the results of the parallel ops. */ + if (self->saved_error != NULL) { + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + /* Check the intermediate working values are all cleared. */ + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* success */ + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + + GS_PROFILER_ADD_MARK (PluginJobRefreshMetadata, + self->begin_time_nsec, + G_OBJECT_TYPE_NAME (self), + NULL); +} + +static gboolean +gs_plugin_job_refresh_metadata_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_refresh_metadata_class_init (GsPluginJobRefreshMetadataClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_refresh_metadata_dispose; + object_class->get_property = gs_plugin_job_refresh_metadata_get_property; + object_class->set_property = gs_plugin_job_refresh_metadata_set_property; + + job_class->run_async = gs_plugin_job_refresh_metadata_run_async; + job_class->run_finish = gs_plugin_job_refresh_metadata_run_finish; + + /** + * GsPluginJobRefreshMetadata:cache-age-secs: + * + * Maximum age of caches before they are refreshed. + * + * Since: 42 + */ + props[PROP_CACHE_AGE_SECS] = + g_param_spec_uint64 ("cache-age-secs", "Cache Age", + "Maximum age of caches before they are refreshed.", + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobRefreshMetadata:flags: + * + * Flags to specify how the refresh job should behave. + * + * Since: 42 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to specify how the refresh job should behave.", + GS_TYPE_PLUGIN_REFRESH_METADATA_FLAGS, GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); + + /** + * GsPluginJobRefreshMetadata::progress: + * @progress_percent: percentage completion of the job, [0, 100], or + * %G_MAXUINT to indicate that progress is unknown + * + * Emitted during #GsPluginJob.run_async() when progress is made. + * + * It’s emitted in the thread which is running the #GMainContext which + * was the thread-default context when #GsPluginJob.run_async() was + * called. + * + * Since: 42 + */ + signals[SIGNAL_PROGRESS] = + g_signal_new ("progress", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); +} + +static void +gs_plugin_job_refresh_metadata_init (GsPluginJobRefreshMetadata *self) +{ +} + +/** + * gs_plugin_job_refresh_metadata_new: + * @cache_age_secs: maximum allowed cache age, in seconds + * @flags: flags to affect the refresh + * + * Create a new #GsPluginJobRefreshMetadata for refreshing metadata about + * available apps. + * + * Caches will be refreshed if they are older than @cache_age_secs. + * + * Returns: (transfer full): a new #GsPluginJobRefreshMetadata + * Since: 42 + */ +GsPluginJob * +gs_plugin_job_refresh_metadata_new (guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags) +{ + return g_object_new (GS_TYPE_PLUGIN_JOB_REFRESH_METADATA, + "cache-age-secs", cache_age_secs, + "flags", flags, + NULL); +} diff --git a/lib/gs-plugin-job-refresh-metadata.h b/lib/gs-plugin-job-refresh-metadata.h new file mode 100644 index 0000000..7ee1c06 --- /dev/null +++ b/lib/gs-plugin-job-refresh-metadata.h @@ -0,0 +1,28 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_REFRESH_METADATA (gs_plugin_job_refresh_metadata_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobRefreshMetadata, gs_plugin_job_refresh_metadata, GS, PLUGIN_JOB_REFRESH_METADATA, GsPluginJob) + +GsPluginJob *gs_plugin_job_refresh_metadata_new (guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags); + +G_END_DECLS diff --git a/lib/gs-plugin-job-trigger-upgrade.c b/lib/gs-plugin-job-trigger-upgrade.c new file mode 100644 index 0000000..734623e --- /dev/null +++ b/lib/gs-plugin-job-trigger-upgrade.c @@ -0,0 +1,302 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-trigger-upgrade + * @short_description: A plugin job on an app + * + * #GsPluginJobTriggerUpgrade is a #GsPluginJob to trigger the distribution + * upgrade to be installed on next boot. + * + * This class is a wrapper around #GsPluginClass.trigger_upgrade_async + * calling it for all loaded plugins. + * + * Since: 47 + */ + +#include "config.h" + +#include +#include + +#include "gs-app.h" +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-trigger-upgrade.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-types.h" + +struct _GsPluginJobTriggerUpgrade +{ + GsPluginJob parent; + + /* Input arguments. */ + GsApp *app; /* (owned) (not nullable) */ + GsPluginTriggerUpgradeFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; +}; + +G_DEFINE_TYPE (GsPluginJobTriggerUpgrade, gs_plugin_job_trigger_upgrade, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_FLAGS = 1, + PROP_APP, +} GsPluginJobTriggerUpgradeProperty; + +static GParamSpec *props[PROP_APP + 1] = { NULL, }; + +static void +gs_plugin_job_trigger_upgrade_dispose (GObject *object) +{ + GsPluginJobTriggerUpgrade *self = GS_PLUGIN_JOB_TRIGGER_UPGRADE (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_object (&self->app); + + G_OBJECT_CLASS (gs_plugin_job_trigger_upgrade_parent_class)->dispose (object); +} + +static void +gs_plugin_job_trigger_upgrade_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobTriggerUpgrade *self = GS_PLUGIN_JOB_TRIGGER_UPGRADE (object); + + switch ((GsPluginJobTriggerUpgradeProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + case PROP_APP: + g_value_set_object (value, self->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_trigger_upgrade_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobTriggerUpgrade *self = GS_PLUGIN_JOB_TRIGGER_UPGRADE (object); + + switch ((GsPluginJobTriggerUpgradeProperty) prop_id) { + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_APP: + /* Construct only. */ + g_assert (self->app == NULL); + self->app = g_value_dup_object (value); + g_assert (self->app != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_trigger_upgrade_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobTriggerUpgrade *self = GS_PLUGIN_JOB_TRIGGER_UPGRADE (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_trigger_upgrade_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->trigger_upgrade_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->trigger_upgrade_async (plugin, self->app, self->flags, cancellable, plugin_app_func_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle app operation"); + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + gboolean success; + g_autoptr(GError) local_error = NULL; + + success = plugin_class->trigger_upgrade_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + g_assert (success || local_error != NULL); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobTriggerUpgrade *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while triggering upgrade: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + if (self->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + else + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_trigger_upgrade_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_trigger_upgrade_class_init (GsPluginJobTriggerUpgradeClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_trigger_upgrade_dispose; + object_class->get_property = gs_plugin_job_trigger_upgrade_get_property; + object_class->set_property = gs_plugin_job_trigger_upgrade_set_property; + + job_class->run_async = gs_plugin_job_trigger_upgrade_run_async; + job_class->run_finish = gs_plugin_job_trigger_upgrade_run_finish; + + /** + * GsPluginJobTriggerUpgrade:app: + * + * A #GsApp describing the app to run the operation on. + * + * Since: 47 + */ + props[PROP_APP] = + g_param_spec_object ("app", "App", + "A #GsApp describing the app to run the operation on.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobTriggerUpgrade:flags: + * + * Flags affecting how the operation runs. + * + * Since: 47 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags affecting how the operation runs.", + GS_TYPE_PLUGIN_TRIGGER_UPGRADE_FLAGS, + GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_trigger_upgrade_init (GsPluginJobTriggerUpgrade *self) +{ +} + +/** + * gs_plugin_job_trigger_upgrade_new: + * @app: (not nullable) (transfer none): an app to run the operation on + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobTriggerUpgrade to trigger an upgrade of the system + * represented by @app. + * + * Returns: (transfer full): a new #GsPluginJobTriggerUpgrade + * Since: 47 + */ +GsPluginJob * +gs_plugin_job_trigger_upgrade_new (GsApp *app, + GsPluginTriggerUpgradeFlags flags) +{ + g_return_val_if_fail (GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_TRIGGER_UPGRADE, + "app", app, + "flags", flags, + NULL); +} diff --git a/lib/gs-plugin-job-trigger-upgrade.h b/lib/gs-plugin-job-trigger-upgrade.h new file mode 100644 index 0000000..89cb3e7 --- /dev/null +++ b/lib/gs-plugin-job-trigger-upgrade.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_TRIGGER_UPGRADE (gs_plugin_job_trigger_upgrade_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobTriggerUpgrade, gs_plugin_job_trigger_upgrade, GS, PLUGIN_JOB_TRIGGER_UPGRADE, GsPluginJob) + +GsPluginJob *gs_plugin_job_trigger_upgrade_new (GsApp *app, + GsPluginTriggerUpgradeFlags flags); + +G_END_DECLS diff --git a/lib/gs-plugin-job-uninstall-apps.c b/lib/gs-plugin-job-uninstall-apps.c new file mode 100644 index 0000000..d44ea04 --- /dev/null +++ b/lib/gs-plugin-job-uninstall-apps.c @@ -0,0 +1,578 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 GNOME Foundation, Inc. + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-uninstall-apps + * @short_description: A plugin job to uninstall apps + * + * #GsPluginJobUninstallApps is a #GsPluginJob representing an operation to + * uninstall apps. + * + * This class is a wrapper around #GsPluginClass.uninstall_apps_async(), + * calling it for all loaded plugins. + * + * Plugins are expected to send progress notifications to the UI by calling the + * provided #GsPluginProgressCallback function. Plugins may also call + * gs_app_set_progress() on apps as they are uninstalled, but this method will + * eventually be removed as it cannot represent progress in multiple ongoing + * operations. + * + * Callbacks from this job will be executed in the #GMainContext which was + * thread-default at the time when #GsPluginJob.run_async() was called on the + * #GsPluginJobUninstallApps. For plugins, this means that callbacks must be + * executed in the same #GMainContext which called + * #GsPluginClass.uninstall_apps_async(). + * + * Once the uninstall is completed, the apps will typically be set to the state + * %GS_APP_STATE_AVAILABLE, or %GS_APP_STATE_UNKNOWN. + * + * On failure the error message returned will usually only be shown on the + * console, but they can also be retrieved using gs_plugin_loader_get_events(). + * + * See also: #GsPluginClass.uninstall_apps_async() + * Since: 47 + */ + +#include "config.h" + +#include +#include +#include + +#ifdef HAVE_SYSPROF +#include +#endif + +#include "gs-enums.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-uninstall-apps.h" +#include "gs-plugin-types.h" +#include "gs-profiler.h" +#include "gs-utils.h" + +struct _GsPluginJobUninstallApps +{ + GsPluginJob parent; + + /* Input arguments. */ + GsAppList *apps; + GsPluginUninstallAppsFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + GHashTable *plugins_progress; /* (element-type GsPlugin guint) (owned) (nullable) */ + GSource *progress_source; /* (owned) (nullable) */ + guint last_reported_progress; + +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec; +#endif +}; + +G_DEFINE_TYPE (GsPluginJobUninstallApps, gs_plugin_job_uninstall_apps, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_APPS = 1, + PROP_FLAGS, +} GsPluginJobUninstallAppsProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +typedef enum { + SIGNAL_APP_NEEDS_USER_ACTION, + SIGNAL_PROGRESS, +} GsPluginJobUninstallAppsSignal; + +static guint signals[SIGNAL_PROGRESS + 1] = { 0, }; + +static void +gs_plugin_job_uninstall_apps_dispose (GObject *object) +{ + GsPluginJobUninstallApps *self = GS_PLUGIN_JOB_UNINSTALL_APPS (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* Progress reporting should have been stopped by now. */ + if (self->progress_source != NULL) { + g_assert (g_source_is_destroyed (self->progress_source)); + g_clear_pointer (&self->progress_source, g_source_unref); + } + + g_clear_pointer (&self->plugins_progress, g_hash_table_unref); + g_clear_object (&self->apps); + + G_OBJECT_CLASS (gs_plugin_job_uninstall_apps_parent_class)->dispose (object); +} + +static void +gs_plugin_job_uninstall_apps_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobUninstallApps *self = GS_PLUGIN_JOB_UNINSTALL_APPS (object); + + switch ((GsPluginJobUninstallAppsProperty) prop_id) { + case PROP_APPS: + g_value_set_object (value, self->apps); + break; + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_uninstall_apps_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobUninstallApps *self = GS_PLUGIN_JOB_UNINSTALL_APPS (object); + + switch ((GsPluginJobUninstallAppsProperty) prop_id) { + case PROP_APPS: + /* Construct only. */ + g_assert (self->apps == NULL); + self->apps = g_value_dup_object (value); + g_assert (self->apps != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +app_needs_user_action_cb (GsPlugin *plugin, + GsApp *app, + AsScreenshot *action_screenshot, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPluginJobUninstallApps *self = g_task_get_source_object (task); + + g_assert (g_main_context_is_owner (g_task_get_context (task))); + g_signal_emit (self, signals[SIGNAL_APP_NEEDS_USER_ACTION], 0, app, action_screenshot); +} + +static void plugin_progress_cb (GsPlugin *plugin, + guint progress, + gpointer user_data); +static gboolean progress_cb (gpointer user_data); +static void plugin_uninstall_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_uninstall_apps_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobUninstallApps *self = GS_PLUGIN_JOB_UNINSTALL_APPS (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean any_plugins_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + /* Chosen to allow a few UI updates per second without updating the + * progress label so often it’s unreadable. */ + const guint progress_update_period_ms = 300; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_uninstall_apps_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* Set up the progress timeout. This periodically sums up the progress + * tuples in `self->plugins_progress` and reports them to the calling + * function via the #GsPluginJobUninstallApps::progress signal, giving + * an overall progress for all the parallel operations. */ + self->plugins_progress = g_hash_table_new (g_direct_hash, g_direct_equal); + self->last_reported_progress = GS_APP_PROGRESS_UNKNOWN; + self->progress_source = g_timeout_source_new (progress_update_period_ms); + g_source_set_callback (self->progress_source, progress_cb, self, NULL); + g_source_attach (self->progress_source, g_main_context_get_thread_default ()); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + +#ifdef HAVE_SYSPROF + self->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->uninstall_apps_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + any_plugins_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* Set up progress reporting for this plugin. */ + g_hash_table_insert (self->plugins_progress, plugin, GUINT_TO_POINTER (0)); + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->uninstall_apps_async (plugin, + self->apps, + self->flags, + plugin_progress_cb, + task, + app_needs_user_action_cb, + task, + cancellable, + plugin_uninstall_apps_cb, + g_object_ref (task)); + } + + /* some functions are really required for proper operation */ + if (!any_plugins_ran) { + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no plugin could handle uninstalling apps"); + } + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* Called in the same thread as gs_plugin_job_uninstall_apps_run_async(), to + * report the progress for the given plugin. */ +static void +plugin_progress_cb (GsPlugin *plugin, + guint progress, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPluginJobUninstallApps *self = g_task_get_source_object (task); + + g_assert (g_main_context_is_owner (g_task_get_context (task))); + g_hash_table_replace (self->plugins_progress, plugin, GUINT_TO_POINTER (progress)); +} + +static gboolean +progress_cb (gpointer user_data) +{ + GsPluginJobUninstallApps *self = GS_PLUGIN_JOB_UNINSTALL_APPS (user_data); + gdouble progress; + guint n_portions; + GHashTableIter iter; + gpointer plugin_progress_ptr; + gboolean all_unknown = TRUE; + + /* Sum up the progress for all parallel operations. + * + * Allocate each operation an equal portion of 100 percentage points. In + * this context, an operation is a call to a plugin’s + * uninstall_apps_async() vfunc. */ + n_portions = g_hash_table_size (self->plugins_progress); + progress = 0.0; + g_hash_table_iter_init (&iter, self->plugins_progress); + + while (g_hash_table_iter_next (&iter, NULL, &plugin_progress_ptr)) { + guint plugin_progress = GPOINTER_TO_UINT (plugin_progress_ptr); + + if (plugin_progress == GS_APP_PROGRESS_UNKNOWN) + continue; + else + all_unknown = FALSE; + + progress += (100.0 / n_portions) * ((gdouble) plugin_progress / 100.0); + } + + if (all_unknown) + progress = GS_APP_PROGRESS_UNKNOWN; + + if ((guint) progress != self->last_reported_progress) { + /* Report progress via signal emission. */ + g_signal_emit (self, signals[SIGNAL_PROGRESS], 0, (guint) progress); + self->last_reported_progress = progress; + } + + return G_SOURCE_CONTINUE; +} + +static void +plugin_uninstall_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobUninstallApps *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + /* Forward cancellation errors, but ignore all other errors so + * that other plugins don’t get blocked. + * + * If plugins produce errors which should be reported to the user, they + * should report them directly by calling gs_plugin_report_event(). + * #GsPluginJobUninstallApps cannot do this as it doesn’t know which errors + * are interesting to the user and which are useless. */ + if (!plugin_class->uninstall_apps_finish (plugin, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("Plugin ‘%s‘ failed to uninstall apps: %s", + gs_plugin_get_name (plugin), local_error->message); + g_clear_error (&local_error); + } + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + GS_PROFILER_ADD_MARK_TAKE (PluginJobUninstallApps, + self->begin_time_nsec, + g_strdup_printf ("%s:%s", + G_OBJECT_TYPE_NAME (self), + gs_plugin_get_name (plugin)), + NULL); + + /* Update progress reporting. */ + g_hash_table_replace (self->plugins_progress, plugin, GUINT_TO_POINTER (100)); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobUninstallApps *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while uninstalling apps: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* Emit one final progress update, then stop any further ones. + * Ensure the emission is in the right #GMainContext. */ + g_assert (g_main_context_is_owner (g_task_get_context (task))); + progress_cb (self); + g_source_destroy (self->progress_source); + g_clear_pointer (&self->plugins_progress, g_hash_table_unref); + + /* Get the results of the parallel ops. */ + if (self->saved_error != NULL) { + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + /* Check the intermediate working values are all cleared. */ + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* success */ + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + + GS_PROFILER_ADD_MARK (PluginJobUninstallApps, + self->begin_time_nsec, + G_OBJECT_TYPE_NAME (self), + NULL); +} + +static gboolean +gs_plugin_job_uninstall_apps_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_uninstall_apps_class_init (GsPluginJobUninstallAppsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_uninstall_apps_dispose; + object_class->get_property = gs_plugin_job_uninstall_apps_get_property; + object_class->set_property = gs_plugin_job_uninstall_apps_set_property; + + job_class->run_async = gs_plugin_job_uninstall_apps_run_async; + job_class->run_finish = gs_plugin_job_uninstall_apps_run_finish; + + /** + * GsPluginJobUninstallApps:apps: + * + * List of apps to uninstall. + * + * Since: 47 + */ + props[PROP_APPS] = + g_param_spec_object ("apps", "Apps", + "List of apps to uninstall.", + GS_TYPE_APP_LIST, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobUninstallApps:flags: + * + * Flags to specify how the uninstall job should behave. + * + * Since: 47 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to specify how the uninstall job should behave.", + GS_TYPE_PLUGIN_UNINSTALL_APPS_FLAGS, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); + + /** + * GsPluginJobUninstallApps::app-needs-user-action: + * @app: (not nullable): the app which needs user action + * @action_screenshot: (not nullable): an image and caption explaining what action is needed + * + * Emitted during #GsPluginJob.run_async() if an app needs user action + * to uninstall. + * + * This is typically used for firmware where a piece of + * hardware needs user interaction to accept a firmware change, such as + * being turned on and off, or having a button pressed. + * + * The image in @action_screenshot should explain to the user what to do + * to the device. + * + * It’s emitted in the thread which is running the #GMainContext which + * was the thread-default context when #GsPluginJob.run_async() was + * called. + * + * Since: 47 + */ + signals[SIGNAL_APP_NEEDS_USER_ACTION] = + g_signal_new ("app-needs-user-action", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 2, GS_TYPE_APP, AS_TYPE_SCREENSHOT); + + /** + * GsPluginJobUninstallApps::progress: + * @progress_percent: percentage completion of the job, [0, 100], or + * %G_MAXUINT to indicate that progress is unknown + * + * Emitted during #GsPluginJob.run_async() when progress is made. + * + * It’s emitted in the thread which is running the #GMainContext which + * was the thread-default context when #GsPluginJob.run_async() was + * called. + * + * Since: 47 + */ + signals[SIGNAL_PROGRESS] = + g_signal_new ("progress", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); +} + +static void +gs_plugin_job_uninstall_apps_init (GsPluginJobUninstallApps *self) +{ +} + +/** + * gs_plugin_job_uninstall_apps_new: + * @apps: (transfer none) (not nullable): list of apps to uninstall + * @flags: flags to affect the uninstall + * + * Create a new #GsPluginJobUninstallApps for uninstalling apps. + * + * Returns: (transfer full): a new #GsPluginJobUninstallApps + * Since: 47 + */ +GsPluginJob * +gs_plugin_job_uninstall_apps_new (GsAppList *apps, + GsPluginUninstallAppsFlags flags) +{ + g_return_val_if_fail (GS_IS_APP_LIST (apps), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_UNINSTALL_APPS, + "apps", apps, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_uninstall_apps_get_apps: + * @self: a #GsPluginJobUninstallApps + * + * Get the set of apps being uninstalled by this #GsPluginJobUninstallApps. + * + * Returns: apps being uninstalled + * Since: 47 + */ +GsAppList * +gs_plugin_job_uninstall_apps_get_apps (GsPluginJobUninstallApps *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_UNINSTALL_APPS (self), NULL); + + return self->apps; +} + +/** + * gs_plugin_job_uninstall_apps_get_flags: + * @self: a #GsPluginJobUninstallApps + * + * Get the flags affecting the behaviour of this #GsPluginJobUninstallApps. + * + * Returns: flags for the job + * Since: 47 + */ +GsPluginUninstallAppsFlags +gs_plugin_job_uninstall_apps_get_flags (GsPluginJobUninstallApps *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_UNINSTALL_APPS (self), GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + + return self->flags; +} diff --git a/lib/gs-plugin-job-uninstall-apps.h b/lib/gs-plugin-job-uninstall-apps.h new file mode 100644 index 0000000..2a82eb5 --- /dev/null +++ b/lib/gs-plugin-job-uninstall-apps.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 GNOME Foundation, Inc. + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_UNINSTALL_APPS (gs_plugin_job_uninstall_apps_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobUninstallApps, gs_plugin_job_uninstall_apps, GS, PLUGIN_JOB_UNINSTALL_APPS, GsPluginJob) + +GsPluginJob *gs_plugin_job_uninstall_apps_new (GsAppList *apps, + GsPluginUninstallAppsFlags flags); + +GsAppList *gs_plugin_job_uninstall_apps_get_apps (GsPluginJobUninstallApps *self); +GsPluginUninstallAppsFlags gs_plugin_job_uninstall_apps_get_flags (GsPluginJobUninstallApps *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-update-apps.c b/lib/gs-plugin-job-update-apps.c new file mode 100644 index 0000000..4dcc16e --- /dev/null +++ b/lib/gs-plugin-job-update-apps.c @@ -0,0 +1,609 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022, 2023 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-update-apps + * @short_description: A plugin job to update apps or the OS + * + * #GsPluginJobUpdateApps is a #GsPluginJob representing an operation to + * download and/or apply updates to apps or the OS. + * + * This class is a wrapper around #GsPluginClass.update_apps_async(), + * calling it for all loaded plugins. + * + * Unless %GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD is specified, the first step + * of this job downloads the app and any dependencies, ready to be installed or + * updated. + * + * Plugins are expected to schedule downloads using the system download + * scheduler if appropriate (if the download is not guaranteed to be under a few + * hundred kilobytes, for example), so that the user’s metered data preferences + * are honoured. + * + * Plugins are expected to send progress notifications to the UI by calling the + * provided #GsPluginProgressCallback function. Plugins may also call + * gs_app_set_progress() on apps as they are updated, but this method will + * eventually be removed as it cannot represent progress in multiple ongoing + * operations. + * + * Callbacks from this job will be executed in the #GMainContext which was + * thread-default at the time when #GsPlugin.run_async() was called on the + * #GsPluginJobUpdateApps. For plugins, this means that callbacks must be + * executed in the same #GMainContext which called + * #GsPlugin.update_apps_async(). + * + * If the app is already downloaded, the first step of this job is a no-op. + * + * Unless %GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY is specified, the second step of + * this job applies the app and any dependencies (updating the app, and updating + * dependencies or installing missing dependencies). + * + * Once that is completed, the apps will typically be set to the state + * %GS_APP_STATE_INSTALLED, or %GS_APP_STATE_UNKNOWN. + * + * On failure the error message returned will usually only be shown on the + * console, but they can also be retrieved using gs_plugin_loader_get_events(). + * + * See also: #GsPluginClass.update_apps_async + * Since: 44 + */ + +#include "config.h" + +#include +#include +#include + +#ifdef HAVE_SYSPROF +#include +#endif + +#include "gs-enums.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-update-apps.h" +#include "gs-plugin-types.h" +#include "gs-profiler.h" +#include "gs-utils.h" + +struct _GsPluginJobUpdateApps +{ + GsPluginJob parent; + + /* Input arguments. */ + GsAppList *apps; + GsPluginUpdateAppsFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + GHashTable *plugins_progress; /* (element-type GsPlugin guint) (owned) (nullable) */ + GSource *progress_source; /* (owned) (nullable) */ + guint last_reported_progress; + +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec; +#endif +}; + +G_DEFINE_TYPE (GsPluginJobUpdateApps, gs_plugin_job_update_apps, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_APPS = 1, + PROP_FLAGS, +} GsPluginJobUpdateAppsProperty; + +static GParamSpec *props[PROP_FLAGS + 1] = { NULL, }; + +typedef enum { + SIGNAL_APP_NEEDS_USER_ACTION, + SIGNAL_PROGRESS, +} GsPluginJobUpdateAppsSignal; + +static guint signals[SIGNAL_PROGRESS + 1] = { 0, }; + +static void +gs_plugin_job_update_apps_dispose (GObject *object) +{ + GsPluginJobUpdateApps *self = GS_PLUGIN_JOB_UPDATE_APPS (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* Progress reporting should have been stopped by now. */ + if (self->progress_source != NULL) { + g_assert (g_source_is_destroyed (self->progress_source)); + g_clear_pointer (&self->progress_source, g_source_unref); + } + + g_clear_pointer (&self->plugins_progress, g_hash_table_unref); + g_clear_object (&self->apps); + + G_OBJECT_CLASS (gs_plugin_job_update_apps_parent_class)->dispose (object); +} + +static void +gs_plugin_job_update_apps_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobUpdateApps *self = GS_PLUGIN_JOB_UPDATE_APPS (object); + + switch ((GsPluginJobUpdateAppsProperty) prop_id) { + case PROP_APPS: + g_value_set_object (value, self->apps); + break; + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_update_apps_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobUpdateApps *self = GS_PLUGIN_JOB_UPDATE_APPS (object); + + switch ((GsPluginJobUpdateAppsProperty) prop_id) { + case PROP_APPS: + /* Construct only. */ + g_assert (self->apps == NULL); + self->apps = g_value_dup_object (value); + g_assert (self->apps != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + + /* Perhaps we could eventually allow both of these to be + * specified at the same time, but for now it would over + * complicate the implementation of plugins, for no benefit. */ + g_assert (!(self->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD) || + !(self->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY)); + + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +app_needs_user_action_cb (GsPlugin *plugin, + GsApp *app, + AsScreenshot *action_screenshot, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPluginJobUpdateApps *self = g_task_get_source_object (task); + + g_assert (g_main_context_is_owner (g_task_get_context (task))); + g_signal_emit (self, signals[SIGNAL_APP_NEEDS_USER_ACTION], 0, app, action_screenshot); +} + +static void plugin_progress_cb (GsPlugin *plugin, + guint progress, + gpointer user_data); +static gboolean progress_cb (gpointer user_data); +static void plugin_update_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +static void +gs_plugin_job_update_apps_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobUpdateApps *self = GS_PLUGIN_JOB_UPDATE_APPS (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean any_plugins_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + /* Chosen to allow a few UI updates per second without updating the + * progress label so often it’s unreadable. */ + const guint progress_update_period_ms = 300; + + /* check required args */ + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_update_apps_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* Set up the progress timeout. This periodically sums up the progress + * tuples in `self->*_progress` and reports them to the calling + * function via the #GsPluginJobUpdateApps::progress signal, giving + * an overall progress for all the parallel operations. */ + self->plugins_progress = g_hash_table_new (g_direct_hash, g_direct_equal); + self->progress_source = g_timeout_source_new (progress_update_period_ms); + self->last_reported_progress = GS_APP_PROGRESS_UNKNOWN; + g_source_set_callback (self->progress_source, progress_cb, self, NULL); + g_source_attach (self->progress_source, g_main_context_get_thread_default ()); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + +#ifdef HAVE_SYSPROF + self->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->update_apps_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + any_plugins_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* Set up progress reporting for this plugin. */ + g_hash_table_insert (self->plugins_progress, plugin, GUINT_TO_POINTER (0)); + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->update_apps_async (plugin, + self->apps, + self->flags, + plugin_progress_cb, + task, + app_needs_user_action_cb, + task, + cancellable, + plugin_update_apps_cb, + g_object_ref (task)); + } + + /* some functions are really required for proper operation */ + if (!any_plugins_ran) { + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no plugin could handle updating apps"); + } + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* Called in the same thread as gs_plugin_job_update_apps_run_async(), to + * report the progress for the given plugin. */ +static void +plugin_progress_cb (GsPlugin *plugin, + guint progress, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPluginJobUpdateApps *self = g_task_get_source_object (task); + + g_assert (g_main_context_is_owner (g_task_get_context (task))); + g_hash_table_replace (self->plugins_progress, plugin, GUINT_TO_POINTER (progress)); +} + +static gboolean +progress_cb (gpointer user_data) +{ + GsPluginJobUpdateApps *self = GS_PLUGIN_JOB_UPDATE_APPS (user_data); + gdouble progress; + guint n_portions; + GHashTableIter iter; + gpointer plugin_progress_ptr; + gboolean all_unknown = TRUE; + + /* Sum up the progress for all parallel operations. + * + * Allocate each operation an equal portion of 100 percentage points. In + * this context, an operation is a call to a plugin’s + * update_apps_async() vfunc. */ + n_portions = g_hash_table_size (self->plugins_progress); + progress = 0.0; + g_hash_table_iter_init (&iter, self->plugins_progress); + + while (g_hash_table_iter_next (&iter, NULL, &plugin_progress_ptr)) { + guint plugin_progress = GPOINTER_TO_UINT (plugin_progress_ptr); + + if (plugin_progress == GS_APP_PROGRESS_UNKNOWN) + continue; + else + all_unknown = FALSE; + + progress += (100.0 / n_portions) * ((gdouble) plugin_progress / 100.0); + } + + if (all_unknown) + progress = GS_APP_PROGRESS_UNKNOWN; + + if ((guint) progress != self->last_reported_progress) { + /* Report progress via signal emission. */ + /* FIXME: In future we could add explicit signals to notify that a + * download operation is blocked on waiting for metered data permission + * to download, so the UI can represent that better. */ + g_signal_emit (self, signals[SIGNAL_PROGRESS], 0, (guint) progress); + self->last_reported_progress = progress; + } + + return G_SOURCE_CONTINUE; +} + +static void +plugin_update_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginJobUpdateApps *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + /* Forward cancellation errors, but ignore all other errors so + * that other plugins don’t get blocked. + * + * If plugins produce errors which should be reported to the user, they + * should report them directly by calling gs_plugin_report_event(). + * #GsPluginJobUpdateApps cannot do this as it doesn’t know which errors + * are interesting to the user and which are useless. */ + if (!plugin_class->update_apps_finish (plugin, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("Plugin ‘%s’ failed to update apps: %s", + gs_plugin_get_name (plugin), local_error->message); + g_clear_error (&local_error); + } + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + GS_PROFILER_ADD_MARK_TAKE (PluginJobUpdateApps, + self->begin_time_nsec, + g_strdup_printf ("%s:%s", + G_OBJECT_TYPE_NAME (self), + gs_plugin_get_name (plugin)), + NULL); + + /* Update progress reporting. */ + g_hash_table_replace (self->plugins_progress, plugin, GUINT_TO_POINTER (100)); + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + GsPluginJobUpdateApps *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while updating apps: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (self->n_pending_ops > 0) + return; + + /* Emit one final progress update, then stop any further ones. + * Ensure the emission is in the right #GMainContext. */ + g_assert (g_main_context_is_owner (g_task_get_context (task))); + progress_cb (self); + g_source_destroy (self->progress_source); + g_clear_pointer (&self->plugins_progress, g_hash_table_unref); + + /* Get the results of the parallel ops. */ + if (self->saved_error != NULL) { + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + return; + } + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + /* Check the intermediate working values are all cleared. */ + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + /* success */ + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); + + GS_PROFILER_ADD_MARK (PluginJobUpdateApps, + self->begin_time_nsec, + G_OBJECT_TYPE_NAME (self), + NULL); +} + +static gboolean +gs_plugin_job_update_apps_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_update_apps_class_init (GsPluginJobUpdateAppsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_update_apps_dispose; + object_class->get_property = gs_plugin_job_update_apps_get_property; + object_class->set_property = gs_plugin_job_update_apps_set_property; + + job_class->run_async = gs_plugin_job_update_apps_run_async; + job_class->run_finish = gs_plugin_job_update_apps_run_finish; + + /** + * GsPluginJobUpdateApps:apps: + * + * List of apps to update. + * + * Since: 44 + */ + props[PROP_APPS] = + g_param_spec_object ("apps", "Apps", + "List of apps to update.", + GS_TYPE_APP_LIST, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobUpdateApps:flags: + * + * Flags to specify how the update job should behave. + * + * Currently, it is forbidden to specify both + * %GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD and + * %GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY at the same time. + * + * Since: 44 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags to specify how the update job should behave.", + GS_TYPE_PLUGIN_UPDATE_APPS_FLAGS, GS_PLUGIN_UPDATE_APPS_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); + + /** + * GsPluginJobUpdateApps::app-needs-user-action: + * @app: (not nullable): the app which needs user action + * @action_screenshot: (not nullable): an image and caption explaining what action is needed + * + * Emitted during #GsPluginJob.run_async() if an app needs user action + * to upgrade. + * + * This is typically used for firmware upgrades where a piece of + * hardware needs user interaction to accept a firmware upgrade, such as + * being turned on and off, or having a button pressed. + * + * The image in @action_screenshot should explain to the user what to do + * to the device. + * + * It’s emitted in the thread which is running the #GMainContext which + * was the thread-default context when #GsPluginJob.run_async() was + * called. + * + * Since: 44 + */ + signals[SIGNAL_APP_NEEDS_USER_ACTION] = + g_signal_new ("app-needs-user-action", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 2, GS_TYPE_APP, AS_TYPE_SCREENSHOT); + + /** + * GsPluginJobUpdateApps::progress: + * @progress_percent: percentage completion of the job, [0, 100], or + * %G_MAXUINT to indicate that progress is unknown + * + * Emitted during #GsPluginJob.run_async() when progress is made. + * + * It’s emitted in the thread which is running the #GMainContext which + * was the thread-default context when #GsPluginJob.run_async() was + * called. + * + * Since: 44 + */ + signals[SIGNAL_PROGRESS] = + g_signal_new ("progress", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); +} + +static void +gs_plugin_job_update_apps_init (GsPluginJobUpdateApps *self) +{ +} + +/** + * gs_plugin_job_update_apps_new: + * @apps: (transfer none) (not nullable): list of apps to update + * @flags: flags to affect the update + * + * Create a new #GsPluginJobUpdateApps for updating apps, or pre-downloading + * updates to apps. + * + * Returns: (transfer full): a new #GsPluginJobUpdateApps + * Since: 44 + */ +GsPluginJob * +gs_plugin_job_update_apps_new (GsAppList *apps, + GsPluginUpdateAppsFlags flags) +{ + g_return_val_if_fail (GS_IS_APP_LIST (apps), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_UPDATE_APPS, + "apps", apps, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_update_apps_get_apps: + * @self: a #GsPluginJobUpdateApps + * + * Get the set of apps being updated by this #GsPluginJobUpdateApps. + * + * Returns: apps being updated + * Since: 44 + */ +GsAppList * +gs_plugin_job_update_apps_get_apps (GsPluginJobUpdateApps *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_UPDATE_APPS (self), NULL); + + return self->apps; +} + +/** + * gs_plugin_job_update_apps_get_flags: + * @self: a #GsPluginJobUpdateApps + * + * Get the flags affecting the behaviour of this #GsPluginJobUpdateApps. + * + * Returns: flags for the job + * Since: 44 + */ +GsPluginUpdateAppsFlags +gs_plugin_job_update_apps_get_flags (GsPluginJobUpdateApps *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_UPDATE_APPS (self), GS_PLUGIN_UPDATE_APPS_FLAGS_NONE); + + return self->flags; +} diff --git a/lib/gs-plugin-job-update-apps.h b/lib/gs-plugin-job-update-apps.h new file mode 100644 index 0000000..d7156e7 --- /dev/null +++ b/lib/gs-plugin-job-update-apps.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022, 2023 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_UPDATE_APPS (gs_plugin_job_update_apps_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobUpdateApps, gs_plugin_job_update_apps, GS, PLUGIN_JOB_UPDATE_APPS, GsPluginJob) + +GsPluginJob *gs_plugin_job_update_apps_new (GsAppList *apps, + GsPluginUpdateAppsFlags flags); + +GsAppList *gs_plugin_job_update_apps_get_apps (GsPluginJobUpdateApps *self); +GsPluginUpdateAppsFlags gs_plugin_job_update_apps_get_flags (GsPluginJobUpdateApps *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job-url-to-app.c b/lib/gs-plugin-job-url-to-app.c new file mode 100644 index 0000000..b9c3fcd --- /dev/null +++ b/lib/gs-plugin-job-url-to-app.c @@ -0,0 +1,512 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin-job-url-to-app + * @short_description: A plugin job on an app + * + * #GsPluginJobUrlToApp is a #GsPluginJob representing an operation to + * convert a URL into a #GsApp. + * + * This class is a wrapper around #GsPluginClass.url_to_app_async + * calling it for all loaded plugins, with #GsPluginJobRefine used to refine the + * results. + * + * Retrieve the resulting #GsAppList using + * gs_plugin_job_url_to_app_get_result_list(). + * + * Since: 47 + */ + +#include "config.h" + +#include +#include + +#include "gs-app.h" +#include "gs-app-list-private.h" +#include "gs-enums.h" +#include "gs-plugin-job.h" +#include "gs-plugin-job-file-to-app.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-job-refine.h" +#include "gs-plugin-job-url-to-app.h" +#include "gs-plugin-types.h" + +struct _GsPluginJobUrlToApp +{ + GsPluginJob parent; + + /* Input arguments. */ + gchar *url; /* (owned) (not nullable) */ + GsPluginUrlToAppFlags flags; + + /* In-progress data. */ + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + gboolean did_refine; + gboolean did_file_to_app; + GsAppList *in_progress_list; /* (owned) (nullable) */ + + /* Results. */ + GsAppList *result_list; /* (owned) (nullable) */ +}; + +G_DEFINE_TYPE (GsPluginJobUrlToApp, gs_plugin_job_url_to_app, GS_TYPE_PLUGIN_JOB) + +typedef enum { + PROP_FLAGS = 1, + PROP_URL, +} GsPluginJobUrlToAppProperty; + +static GParamSpec *props[PROP_URL + 1] = { NULL, }; + +static void +gs_plugin_job_url_to_app_dispose (GObject *object) +{ + GsPluginJobUrlToApp *self = GS_PLUGIN_JOB_URL_TO_APP (object); + + g_assert (self->saved_error == NULL); + g_assert (self->n_pending_ops == 0); + + g_clear_pointer (&self->url, g_free); + g_clear_object (&self->result_list); + g_clear_object (&self->in_progress_list); + + G_OBJECT_CLASS (gs_plugin_job_url_to_app_parent_class)->dispose (object); +} + +static void +gs_plugin_job_url_to_app_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsPluginJobUrlToApp *self = GS_PLUGIN_JOB_URL_TO_APP (object); + + switch ((GsPluginJobUrlToAppProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, self->flags); + break; + case PROP_URL: + g_value_set_string (value, self->url); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_url_to_app_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsPluginJobUrlToApp *self = GS_PLUGIN_JOB_URL_TO_APP (object); + + switch ((GsPluginJobUrlToAppProperty) prop_id) { + case PROP_FLAGS: + /* Construct only. */ + g_assert (self->flags == 0); + self->flags = g_value_get_flags (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + case PROP_URL: + /* Construct only. */ + g_assert (self->url == NULL); + self->url = g_value_dup_string (value); + g_assert (self->url != NULL); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GsAppList *list, + GError *error); +static void file_to_app_job_finished_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_file_to_app_op (GTask *task, + GsAppList *list, + GError *error); +static void refine_job_finished_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_refine_op (GTask *task, + GsAppList *list, + GError *error); +static gboolean gs_plugin_job_url_to_app_is_valid_filter (GsApp *app, + gpointer user_data); + +static void +gs_plugin_job_url_to_app_run_async (GsPluginJob *job, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobUrlToApp *self = GS_PLUGIN_JOB_URL_TO_APP (job); + g_autoptr(GTask) task = NULL; + GPtrArray *plugins; /* (element-type GsPlugin) */ + gboolean anything_ran = FALSE; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (job, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_job_url_to_app_run_async); + g_task_set_task_data (task, g_object_ref (plugin_loader), (GDestroyNotify) g_object_unref); + + /* run each plugin, keeping a counter of pending operations which is + * initialised to 1 until all the operations are started */ + self->n_pending_ops = 1; + plugins = gs_plugin_loader_get_plugins (plugin_loader); + + for (guint i = 0; i < plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + + if (!gs_plugin_get_enabled (plugin)) + continue; + if (plugin_class->url_to_app_async == NULL) + continue; + + /* at least one plugin supports this vfunc */ + anything_ran = TRUE; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* run the plugin */ + self->n_pending_ops++; + plugin_class->url_to_app_async (plugin, self->url, self->flags, cancellable, plugin_app_func_cb, g_object_ref (task)); + } + + if (!anything_ran) + g_debug ("no plugin could handle url-to-app operation"); + + finish_op (task, NULL, g_steal_pointer (&local_error)); +} + +static void +plugin_app_func_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + + list = plugin_class->url_to_app_finish (plugin, result, &local_error); + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + + g_assert (list != NULL || local_error != NULL); + + finish_op (task, list, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GsAppList *list, + GError *error) +{ + GsPluginJobUrlToApp *self = g_task_get_source_object (task); + GsPluginLoader *plugin_loader = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while url-to-app: %s", error_owned->message); + + g_assert (self->n_pending_ops > 0); + self->n_pending_ops--; + + if (list != NULL) { + if (self->in_progress_list == NULL) + self->in_progress_list = gs_app_list_new (); + gs_app_list_add_list (self->in_progress_list, list); + } + + if (self->n_pending_ops > 0) + return; + + /* Once all the url-to-app operations are complete, try file-to-app if + * they produced no results and the URI uses the `file` scheme. */ + if ((self->in_progress_list == NULL || gs_app_list_length (self->in_progress_list) == 0) && + g_ascii_strncasecmp (self->url, "file:", strlen ("file:")) == 0) { + g_autoptr(GFile) file = g_file_new_for_uri (self->url); + g_autoptr(GsPluginJob) file_to_app_job = NULL; + + file_to_app_job = gs_plugin_job_file_to_app_new (file, + (self->flags & GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE) != 0 ? + GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE : + GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + gs_plugin_loader_job_process_async (plugin_loader, file_to_app_job, cancellable, + file_to_app_job_finished_cb, g_object_ref (task)); + return; + } + + /* Fall through without calling file-to-app. */ + finish_file_to_app_op (task, self->in_progress_list, NULL); +} + +static void +file_to_app_job_finished_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + + list = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (source_object), result, &local_error); + g_prefix_error_literal (&local_error, "Failed to file-to-app from file: URL:"); + + finish_file_to_app_op (task, list, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_file_to_app_op (GTask *task, + GsAppList *list, + GError *error) +{ + GsPluginJobUrlToApp *self = g_task_get_source_object (task); + GsPluginLoader *plugin_loader = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while converting URL to app: %s", error_owned->message); + + g_set_object (&self->in_progress_list, list); + + /* Now refine the results. */ + if (self->in_progress_list != NULL) { + GsPluginRefineFlags refine_flags = gs_plugin_job_get_refine_flags (GS_PLUGIN_JOB (self)); + + if (refine_flags != GS_PLUGIN_REFINE_FLAGS_NONE) { + g_autoptr(GsPluginJob) refine_job = NULL; + + /* to not have filtered out repositories */ + refine_flags |= GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING; + + refine_job = gs_plugin_job_refine_new (self->in_progress_list, refine_flags); + gs_plugin_loader_job_process_async (plugin_loader, refine_job, cancellable, + refine_job_finished_cb, g_object_ref (task)); + return; + } + } + + /* Fall through without refining. */ + finish_refine_op (task, self->in_progress_list, NULL); +} + +static void +refine_job_finished_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + + list = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (source_object), result, &local_error); + g_prefix_error_literal (&local_error, "Failed to refine url-to-app apps:"); + + finish_refine_op (task, list, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_refine_op (GTask *task, + GsAppList *list, + GError *error) +{ + GsPluginJobUrlToApp *self = g_task_get_source_object (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autofree gchar *job_debug = NULL; + + if (error_owned != NULL && self->saved_error == NULL) + self->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while converting URL to app: %s", error_owned->message); + + g_clear_object (&self->result_list); + self->result_list = (list != NULL) ? g_object_ref (list) : NULL; + + if (self->result_list != NULL) + gs_app_list_filter (self->result_list, gs_plugin_job_url_to_app_is_valid_filter, self); + + /* only allow one result */ + if (self->saved_error == NULL) { + if (self->result_list == NULL || + gs_app_list_length (self->result_list) == 0) { + g_autofree gchar *str = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_set_error (&self->saved_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no application was created for %s", str); + } else if (gs_app_list_length (self->result_list) > 1) { + g_autofree gchar *str = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("expected one, but received %u apps for %s", gs_app_list_length (self->result_list), str); + } + + /* Ensure the right icon is set on all the apps. */ + if (self->result_list != NULL) { + for (guint i = 0; i < gs_app_list_length (self->result_list); i++) { + GsApp *app = gs_app_list_index (self->result_list, i); + if (!gs_app_has_icons (app)) { + g_autoptr(GIcon) ic = NULL; + const gchar *icon_name; + if (gs_app_has_quirk (app, GS_APP_QUIRK_HAS_SOURCE)) + icon_name = "x-package-repository"; + else + icon_name = "system-component-application"; + ic = g_themed_icon_new (icon_name); + gs_app_add_icon (app, ic); + } + } + } + } + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (GS_PLUGIN_JOB (self)); + g_debug ("%s", job_debug); + + if (self->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&self->saved_error)); + else + g_task_return_boolean (task, TRUE); + g_signal_emit_by_name (G_OBJECT (self), "completed"); +} + +static gboolean +gs_plugin_job_url_to_app_is_valid_filter (GsApp *app, + gpointer user_data) +{ + GsPluginJob *plugin_job = user_data; + + return gs_plugin_loader_app_is_valid (app, gs_plugin_job_get_refine_flags (plugin_job)); +} + +static gboolean +gs_plugin_job_url_to_app_run_finish (GsPluginJob *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_job_url_to_app_class_init (GsPluginJobUrlToAppClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginJobClass *job_class = GS_PLUGIN_JOB_CLASS (klass); + + object_class->dispose = gs_plugin_job_url_to_app_dispose; + object_class->get_property = gs_plugin_job_url_to_app_get_property; + object_class->set_property = gs_plugin_job_url_to_app_set_property; + + job_class->run_async = gs_plugin_job_url_to_app_run_async; + job_class->run_finish = gs_plugin_job_url_to_app_run_finish; + + /** + * GsPluginJobUrlToApp:url: (not nullable) + * + * A URL to convert to a #GsApp. + * + * Since: 47 + */ + props[PROP_URL] = + g_param_spec_string ("url", "URL", + "A URL to convert to a #GsApp.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginJobUrlToApp:flags: + * + * Flags affecting how the operation runs. + * + * Since: 47 + */ + props[PROP_FLAGS] = + g_param_spec_flags ("flags", "Flags", + "Flags affecting how the operation runs.", + GS_TYPE_PLUGIN_URL_TO_APP_FLAGS, + GS_PLUGIN_URL_TO_APP_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_plugin_job_url_to_app_init (GsPluginJobUrlToApp *self) +{ +} + +/** + * gs_plugin_job_url_to_app_new: + * @url: (not nullable): a URL to run the operation on + * @flags: flags affecting how the operation runs + * + * Create a new #GsPluginJobUrlToApp to convert the given @url. + * + * Returns: (transfer full): a new #GsPluginJobUrlToApp + * Since: 47 + */ +GsPluginJob * +gs_plugin_job_url_to_app_new (const gchar *url, + GsPluginUrlToAppFlags flags) +{ + g_return_val_if_fail (url != NULL && g_uri_is_valid (url, G_URI_FLAGS_NONE, NULL), NULL); + + return g_object_new (GS_TYPE_PLUGIN_JOB_URL_TO_APP, + "url", url, + "flags", flags, + NULL); +} + +/** + * gs_plugin_job_url_to_app_get_result_list: + * @self: a #GsPluginJobUrlToApp + * + * Get the list of apps converted from the given URL. + * + * If this is called before the job is complete, %NULL will be returned. + * + * Returns: (transfer none) (nullable): the job results, or %NULL on error + * or if called before the job has completed + * + * Since: 47 + */ +GsAppList * +gs_plugin_job_url_to_app_get_result_list (GsPluginJobUrlToApp *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB_URL_TO_APP (self), NULL); + + return self->result_list; +} diff --git a/lib/gs-plugin-job-url-to-app.h b/lib/gs-plugin-job-url-to-app.h new file mode 100644 index 0000000..2bca7a8 --- /dev/null +++ b/lib/gs-plugin-job-url-to-app.h @@ -0,0 +1,28 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin-job.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB_URL_TO_APP (gs_plugin_job_url_to_app_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginJobUrlToApp, gs_plugin_job_url_to_app, GS, PLUGIN_JOB_URL_TO_APP, GsPluginJob) + +GsPluginJob *gs_plugin_job_url_to_app_new (const gchar *url, + GsPluginUrlToAppFlags flags); +GsAppList *gs_plugin_job_url_to_app_get_result_list + (GsPluginJobUrlToApp *self); + +G_END_DECLS diff --git a/lib/gs-plugin-job.c b/lib/gs-plugin-job.c new file mode 100644 index 0000000..6030c42 --- /dev/null +++ b/lib/gs-plugin-job.c @@ -0,0 +1,567 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017-2018 Richard Hughes + * Copyright (C) 2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-enums.h" +#include "gs-plugin-private.h" +#include "gs-plugin-job-private.h" + +typedef struct +{ + GsPluginRefineFlags refine_flags; + GsAppListFilterFlags dedupe_flags; + gboolean interactive; + gboolean propagate_error; + guint max_results; + GsPlugin *plugin; + GsPluginAction action; + gchar *search; + GsAppList *list; + GFile *file; + gint64 time_created; + GCancellable *cancellable; +} GsPluginJobPrivate; + +enum { + PROP_0, + PROP_ACTION, + PROP_SEARCH, + PROP_REFINE_FLAGS, + PROP_DEDUPE_FLAGS, + PROP_INTERACTIVE, + PROP_LIST, + PROP_FILE, + PROP_MAX_RESULTS, + PROP_PROPAGATE_ERROR, + PROP_LAST +}; + +typedef enum { + SIGNAL_COMPLETED, + SIGNAL_LAST +} GsPluginJobSignal; + +static guint signals[SIGNAL_LAST] = { 0 }; + +G_DEFINE_TYPE_WITH_PRIVATE (GsPluginJob, gs_plugin_job, G_TYPE_OBJECT) + +gchar * +gs_plugin_job_to_string (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + GString *str = g_string_new (NULL); + gint64 time_now = g_get_monotonic_time (); + g_string_append (str, "running "); + if (priv->action != GS_PLUGIN_ACTION_UNKNOWN) { + g_string_append_printf (str, "%s", gs_plugin_action_to_string (priv->action)); + } else { + const gchar *job_type_name = G_OBJECT_TYPE_NAME (self); + if (job_type_name != NULL && g_str_has_prefix (job_type_name, "GsPluginJob")) + g_string_append_printf (str, "%s job", job_type_name + strlen ("GsPluginJob")); + else + g_string_append_printf (str, "%s", job_type_name); + } + if (priv->plugin != NULL) { + g_string_append_printf (str, " on plugin=%s", + gs_plugin_get_name (priv->plugin)); + } + if (priv->dedupe_flags > 0) + g_string_append_printf (str, " with dedupe-flags=%" G_GUINT64_FORMAT, priv->dedupe_flags); + if (priv->refine_flags > 0) { + g_autofree gchar *tmp = gs_plugin_refine_flags_to_string (priv->refine_flags); + g_string_append_printf (str, " with refine-flags=%s", tmp); + } + if (priv->interactive) + g_string_append_printf (str, " with interactive=True"); + if (priv->propagate_error) + g_string_append_printf (str, " with propagate-error=True"); + + if (priv->max_results > 0) + g_string_append_printf (str, " with max-results=%u", priv->max_results); + if (priv->search != NULL) { + g_string_append_printf (str, " with search=%s", + priv->search); + } + if (priv->file != NULL) { + g_autofree gchar *path = g_file_get_path (priv->file); + g_string_append_printf (str, " with file=%s", path); + } + if (priv->list != NULL && gs_app_list_length (priv->list) > 0) { + g_autofree const gchar **unique_ids = NULL; + g_autofree gchar *unique_ids_str = NULL; + unique_ids = g_new0 (const gchar *, gs_app_list_length (priv->list) + 1); + for (guint i = 0; i < gs_app_list_length (priv->list); i++) { + GsApp *app = gs_app_list_index (priv->list, i); + unique_ids[i] = gs_app_get_unique_id (app); + } + unique_ids_str = g_strjoinv (",", (gchar**) unique_ids); + g_string_append_printf (str, " on apps %s", unique_ids_str); + } + if (time_now - priv->time_created > 1000) { + g_string_append_printf (str, ", elapsed time since creation %" G_GINT64_FORMAT "ms", + (time_now - priv->time_created) / 1000); + } + return g_string_free (str, FALSE); +} + +void +gs_plugin_job_set_refine_flags (GsPluginJob *self, GsPluginRefineFlags refine_flags) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + priv->refine_flags = refine_flags; +} + +void +gs_plugin_job_set_dedupe_flags (GsPluginJob *self, GsAppListFilterFlags dedupe_flags) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + priv->dedupe_flags = dedupe_flags; +} + +GsPluginRefineFlags +gs_plugin_job_get_refine_flags (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), GS_PLUGIN_REFINE_FLAGS_NONE); + return priv->refine_flags; +} + +GsAppListFilterFlags +gs_plugin_job_get_dedupe_flags (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), GS_APP_LIST_FILTER_FLAG_NONE); + return priv->dedupe_flags; +} + +gboolean +gs_plugin_job_has_refine_flags (GsPluginJob *self, GsPluginRefineFlags refine_flags) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), FALSE); + return (priv->refine_flags & refine_flags) > 0; +} + +void +gs_plugin_job_add_refine_flags (GsPluginJob *self, GsPluginRefineFlags refine_flags) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + priv->refine_flags |= refine_flags; +} + +void +gs_plugin_job_remove_refine_flags (GsPluginJob *self, GsPluginRefineFlags refine_flags) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + priv->refine_flags &= ~refine_flags; +} + +void +gs_plugin_job_set_interactive (GsPluginJob *self, gboolean interactive) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + priv->interactive = interactive; +} + +gboolean +gs_plugin_job_get_interactive (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), FALSE); + return priv->interactive; +} + +void +gs_plugin_job_set_propagate_error (GsPluginJob *self, gboolean propagate_error) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + priv->propagate_error = propagate_error; +} + +gboolean +gs_plugin_job_get_propagate_error (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), FALSE); + return priv->propagate_error; +} + +void +gs_plugin_job_set_max_results (GsPluginJob *self, guint max_results) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + priv->max_results = max_results; +} + +guint +gs_plugin_job_get_max_results (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), 0); + return priv->max_results; +} + +void +gs_plugin_job_set_action (GsPluginJob *self, GsPluginAction action) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + priv->action = action; +} + +GsPluginAction +gs_plugin_job_get_action (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), GS_PLUGIN_ACTION_UNKNOWN); + return priv->action; +} + +void +gs_plugin_job_set_search (GsPluginJob *self, const gchar *search) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + g_free (priv->search); + priv->search = g_strdup (search); +} + +const gchar * +gs_plugin_job_get_search (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), NULL); + return priv->search; +} + +/* FIXME: Find the :app property of the derived class. This will be removed + * when the remains of the old threading API are removed. */ +static gboolean +gs_plugin_job_subclass_has_app_property (GsPluginJob *self) +{ + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), FALSE); + + return (g_object_class_find_property (G_OBJECT_GET_CLASS (self), "app") != NULL); +} + +void +gs_plugin_job_set_app (GsPluginJob *self, GsApp *app) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + + if (!gs_plugin_job_subclass_has_app_property (self)) + return; + + g_object_set (G_OBJECT (self), "app", app, NULL); + + /* ensure we can always operate on a list object */ + if (priv->list != NULL && app != NULL && gs_app_list_length (priv->list) == 0) + gs_app_list_add (priv->list, app); +} + +GsApp * +gs_plugin_job_get_app (GsPluginJob *self) +{ + g_autoptr(GsApp) app = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), NULL); + + if (!gs_plugin_job_subclass_has_app_property (self)) + return NULL; + + g_object_get (G_OBJECT (self), "app", &app, NULL); + + /* Don’t steal the reference, let the additional reference be dropped + * because gs_plugin_job_get_app() is (transfer none). The GsPluginJob + * still holds one. */ + return app; +} + +void +gs_plugin_job_set_list (GsPluginJob *self, GsAppList *list) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + if (list == NULL) + g_warning ("trying to set list to NULL, not a good idea"); + g_set_object (&priv->list, list); +} + +GsAppList * +gs_plugin_job_get_list (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), NULL); + return priv->list; +} + +void +gs_plugin_job_set_file (GsPluginJob *self, GFile *file) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + g_set_object (&priv->file, file); +} + +GFile * +gs_plugin_job_get_file (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), NULL); + return priv->file; +} + +void +gs_plugin_job_set_plugin (GsPluginJob *self, GsPlugin *plugin) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + g_set_object (&priv->plugin, plugin); +} + +GsPlugin * +gs_plugin_job_get_plugin (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), NULL); + return priv->plugin; +} + +static void +gs_plugin_job_get_property (GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsPluginJob *self = GS_PLUGIN_JOB (obj); + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + + switch (prop_id) { + case PROP_ACTION: + g_value_set_enum (value, priv->action); + break; + case PROP_REFINE_FLAGS: + g_value_set_flags (value, priv->refine_flags); + break; + case PROP_DEDUPE_FLAGS: + g_value_set_flags (value, priv->dedupe_flags); + break; + case PROP_INTERACTIVE: + g_value_set_boolean (value, priv->interactive); + break; + case PROP_SEARCH: + g_value_set_string (value, priv->search); + break; + case PROP_LIST: + g_value_set_object (value, priv->list); + break; + case PROP_FILE: + g_value_set_object (value, priv->file); + break; + case PROP_MAX_RESULTS: + g_value_set_uint (value, priv->max_results); + break; + case PROP_PROPAGATE_ERROR: + g_value_set_boolean (value, priv->propagate_error); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsPluginJob *self = GS_PLUGIN_JOB (obj); + + switch (prop_id) { + case PROP_ACTION: + gs_plugin_job_set_action (self, g_value_get_enum (value)); + break; + case PROP_REFINE_FLAGS: + gs_plugin_job_set_refine_flags (self, g_value_get_flags (value)); + break; + case PROP_DEDUPE_FLAGS: + gs_plugin_job_set_dedupe_flags (self, g_value_get_flags (value)); + break; + case PROP_INTERACTIVE: + gs_plugin_job_set_interactive (self, g_value_get_boolean (value)); + break; + case PROP_SEARCH: + gs_plugin_job_set_search (self, g_value_get_string (value)); + break; + case PROP_LIST: + gs_plugin_job_set_list (self, g_value_get_object (value)); + break; + case PROP_FILE: + gs_plugin_job_set_file (self, g_value_get_object (value)); + break; + case PROP_MAX_RESULTS: + gs_plugin_job_set_max_results (self, g_value_get_uint (value)); + break; + case PROP_PROPAGATE_ERROR: + gs_plugin_job_set_propagate_error (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +gs_plugin_job_finalize (GObject *obj) +{ + GsPluginJob *self = GS_PLUGIN_JOB (obj); + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + + g_free (priv->search); + g_clear_object (&priv->list); + g_clear_object (&priv->file); + g_clear_object (&priv->plugin); + g_clear_object (&priv->cancellable); + + G_OBJECT_CLASS (gs_plugin_job_parent_class)->finalize (obj); +} + +static void +gs_plugin_job_class_init (GsPluginJobClass *klass) +{ + GParamSpec *pspec; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_plugin_job_finalize; + object_class->get_property = gs_plugin_job_get_property; + object_class->set_property = gs_plugin_job_set_property; + + pspec = g_param_spec_enum ("action", NULL, NULL, + GS_TYPE_PLUGIN_ACTION, GS_PLUGIN_ACTION_UNKNOWN, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ACTION, pspec); + + pspec = g_param_spec_flags ("refine-flags", NULL, NULL, + GS_TYPE_PLUGIN_REFINE_FLAGS, GS_PLUGIN_REFINE_FLAGS_NONE, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_REFINE_FLAGS, pspec); + + pspec = g_param_spec_flags ("dedupe-flags", NULL, NULL, + GS_TYPE_APP_LIST_FILTER_FLAGS, GS_APP_LIST_FILTER_FLAG_NONE, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_DEDUPE_FLAGS, pspec); + + pspec = g_param_spec_boolean ("interactive", NULL, NULL, + FALSE, + G_PARAM_READWRITE); + + g_object_class_install_property (object_class, PROP_INTERACTIVE, pspec); + + pspec = g_param_spec_string ("search", NULL, NULL, + NULL, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_SEARCH, pspec); + + pspec = g_param_spec_object ("list", NULL, NULL, + GS_TYPE_APP_LIST, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LIST, pspec); + + pspec = g_param_spec_object ("file", NULL, NULL, + G_TYPE_FILE, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_FILE, pspec); + + pspec = g_param_spec_uint ("max-results", NULL, NULL, + 0, G_MAXUINT, 0, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_MAX_RESULTS, pspec); + + pspec = g_param_spec_boolean ("propagate-error", NULL, NULL, + FALSE, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_PROPAGATE_ERROR, pspec); + + /** + * GsPluginJob::completed: + * + * Emitted when the job is completed, but before it is finalized. + * + * Since: 44 + */ + signals[SIGNAL_COMPLETED] = + g_signal_new ("completed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 0); +} + +static void +gs_plugin_job_init (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + + priv->refine_flags = GS_PLUGIN_REFINE_FLAGS_NONE; + priv->dedupe_flags = GS_APP_LIST_FILTER_FLAG_KEY_ID | + GS_APP_LIST_FILTER_FLAG_KEY_SOURCE | + GS_APP_LIST_FILTER_FLAG_KEY_VERSION; + priv->list = gs_app_list_new (); + priv->time_created = g_get_monotonic_time (); +} + +/** + * gs_plugin_job_set_cancellable: + * @self: a #GsPluginJob + * @cancellable: (nullable) (transfer none): the cancellable to use + * + * Sets the #GCancellable which can be used with gs_plugin_job_cancel() to + * cancel the job. + * + * FIXME: This is only needed because #GsPluginLoader implements cancellation + * outside of the #GsPluginJob for old-style jobs. Once all #GsPluginJob + * subclasses implement `run_async()`, the #GCancellable passed to that can be + * stored internally in #GsPluginJob and cancelled from gs_plugin_job_cancel(). + * Then this method will be removed. + * + * Since: 45 + */ +void +gs_plugin_job_set_cancellable (GsPluginJob *self, + GCancellable *cancellable) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + g_set_object (&priv->cancellable, cancellable); +} + +/** + * gs_plugin_job_cancel: + * @self: a #GsPluginJob + * + * Cancel the plugin job. + * + * Since: 45 + */ +void +gs_plugin_job_cancel (GsPluginJob *self) +{ + GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self); + + g_return_if_fail (GS_IS_PLUGIN_JOB (self)); + + g_cancellable_cancel (priv->cancellable); +} diff --git a/lib/gs-plugin-job.h b/lib/gs-plugin-job.h new file mode 100644 index 0000000..b13ae1e --- /dev/null +++ b/lib/gs-plugin-job.h @@ -0,0 +1,65 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017-2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-app-list.h" +#include "gs-plugin-types.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_JOB (gs_plugin_job_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsPluginJob, gs_plugin_job, GS, PLUGIN_JOB, GObject) + +#include "gs-plugin-loader.h" + +struct _GsPluginJobClass +{ + GObjectClass parent_class; + + void (*run_async) (GsPluginJob *self, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*run_finish) (GsPluginJob *self, + GAsyncResult *result, + GError **error); +}; + +void gs_plugin_job_set_refine_flags (GsPluginJob *self, + GsPluginRefineFlags refine_flags); +void gs_plugin_job_set_dedupe_flags (GsPluginJob *self, + GsAppListFilterFlags dedupe_flags); +void gs_plugin_job_set_interactive (GsPluginJob *self, + gboolean interactive); +void gs_plugin_job_set_propagate_error (GsPluginJob *self, + gboolean propagate_error); +void gs_plugin_job_set_max_results (GsPluginJob *self, + guint max_results); +void gs_plugin_job_set_search (GsPluginJob *self, + const gchar *search); +void gs_plugin_job_set_app (GsPluginJob *self, + GsApp *app); +void gs_plugin_job_set_list (GsPluginJob *self, + GsAppList *list); +void gs_plugin_job_set_file (GsPluginJob *self, + GFile *file); +void gs_plugin_job_set_plugin (GsPluginJob *self, + GsPlugin *plugin); + +#define gs_plugin_job_newv(a,...) GS_PLUGIN_JOB(g_object_new(GS_TYPE_PLUGIN_JOB, "action", a, __VA_ARGS__)) + +#define GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT (GS_APP_LIST_FILTER_FLAG_KEY_ID | \ + GS_APP_LIST_FILTER_FLAG_KEY_SOURCE | \ + GS_APP_LIST_FILTER_FLAG_KEY_VERSION) + +G_END_DECLS diff --git a/lib/gs-plugin-loader-sync.c b/lib/gs-plugin-loader-sync.c new file mode 100644 index 0000000..777f7af --- /dev/null +++ b/lib/gs-plugin-loader-sync.c @@ -0,0 +1,249 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012-2017 Richard Hughes + * Copyright (C) 2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-plugin-loader-sync.h" + +/* tiny helper to help us do the async operation */ +typedef struct { + GAsyncResult *res; + GMainContext *context; + GMainLoop *loop; +} GsPluginLoaderHelper; + +static void +_helper_finish_sync (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoaderHelper *helper = user_data; + helper->res = g_object_ref (res); + g_main_loop_quit (helper->loop); +} + +GsAppList * +gs_plugin_loader_job_process (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job, + GCancellable *cancellable, + GError **error) +{ + GsPluginLoaderHelper helper; + GsAppList *list; + + /* create temp object */ + helper.res = NULL; + helper.context = g_main_context_new (); + helper.loop = g_main_loop_new (helper.context, FALSE); + + g_main_context_push_thread_default (helper.context); + + /* run async method */ + gs_plugin_loader_job_process_async (plugin_loader, + plugin_job, + cancellable, + _helper_finish_sync, + &helper); + g_main_loop_run (helper.loop); + list = gs_plugin_loader_job_process_finish (plugin_loader, + helper.res, + error); + + g_main_context_pop_thread_default (helper.context); + + g_main_loop_unref (helper.loop); + g_main_context_unref (helper.context); + if (helper.res != NULL) + g_object_unref (helper.res); + + return list; +} + +gboolean +gs_plugin_loader_job_action (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job, + GCancellable *cancellable, + GError **error) +{ + GsPluginLoaderHelper helper; + gboolean ret; + + /* create temp object */ + helper.res = NULL; + helper.context = g_main_context_new (); + helper.loop = g_main_loop_new (helper.context, FALSE); + + g_main_context_push_thread_default (helper.context); + + /* run async method */ + gs_plugin_loader_job_process_async (plugin_loader, + plugin_job, + cancellable, + _helper_finish_sync, + &helper); + g_main_loop_run (helper.loop); + ret = gs_plugin_loader_job_action_finish (plugin_loader, + helper.res, + error); + + g_main_context_pop_thread_default (helper.context); + + g_main_loop_unref (helper.loop); + g_main_context_unref (helper.context); + if (helper.res != NULL) + g_object_unref (helper.res); + + return ret; +} + +GsApp * +gs_plugin_loader_job_process_app (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job, + GCancellable *cancellable, + GError **error) +{ + GsPluginLoaderHelper helper; + g_autoptr(GsAppList) list = NULL; + GsApp *app = NULL; + + /* create temp object */ + helper.res = NULL; + helper.context = g_main_context_new (); + helper.loop = g_main_loop_new (helper.context, FALSE); + + g_main_context_push_thread_default (helper.context); + + /* run async method */ + gs_plugin_loader_job_process_async (plugin_loader, + plugin_job, + cancellable, + _helper_finish_sync, + &helper); + g_main_loop_run (helper.loop); + list = gs_plugin_loader_job_process_finish (plugin_loader, + helper.res, + error); + if (list != NULL) + app = g_object_ref (gs_app_list_index (list, 0)); + + g_main_context_pop_thread_default (helper.context); + + g_main_loop_unref (helper.loop); + g_main_context_unref (helper.context); + if (helper.res != NULL) + g_object_unref (helper.res); + + return app; +} + +GsApp * +gs_plugin_loader_app_create (GsPluginLoader *plugin_loader, + const gchar *unique_id, + GCancellable *cancellable, + GError **error) +{ + GsPluginLoaderHelper helper; + GsApp *app; + + /* create temp object */ + helper.res = NULL; + helper.context = g_main_context_new (); + helper.loop = g_main_loop_new (helper.context, FALSE); + + g_main_context_push_thread_default (helper.context); + + /* run async method */ + gs_plugin_loader_app_create_async (plugin_loader, + unique_id, + cancellable, + _helper_finish_sync, + &helper); + g_main_loop_run (helper.loop); + app = gs_plugin_loader_app_create_finish (plugin_loader, + helper.res, + error); + + g_main_context_pop_thread_default (helper.context); + + g_main_loop_unref (helper.loop); + g_main_context_unref (helper.context); + if (helper.res != NULL) + g_object_unref (helper.res); + + return app; +} + +GsApp * +gs_plugin_loader_get_system_app (GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsPluginLoaderHelper helper; + GsApp *app; + + /* create temp object */ + helper.res = NULL; + helper.context = g_main_context_new (); + helper.loop = g_main_loop_new (helper.context, FALSE); + + g_main_context_push_thread_default (helper.context); + + /* run async method */ + gs_plugin_loader_get_system_app_async (plugin_loader, + cancellable, + _helper_finish_sync, + &helper); + g_main_loop_run (helper.loop); + app = gs_plugin_loader_get_system_app_finish (plugin_loader, + helper.res, + error); + + g_main_context_pop_thread_default (helper.context); + + g_main_loop_unref (helper.loop); + g_main_context_unref (helper.context); + if (helper.res != NULL) + g_object_unref (helper.res); + + return app; +} + +gboolean +gs_plugin_loader_setup (GsPluginLoader *plugin_loader, + const gchar * const *allowlist, + const gchar * const *blocklist, + GCancellable *cancellable, + GError **error) +{ + GsPluginLoaderHelper helper; + gboolean retval; + + /* create temp object */ + helper.res = NULL; + helper.context = NULL; + helper.loop = g_main_loop_new (helper.context, FALSE); + + /* run async method */ + gs_plugin_loader_setup_async (plugin_loader, + allowlist, + blocklist, + cancellable, + _helper_finish_sync, + &helper); + g_main_loop_run (helper.loop); + retval = gs_plugin_loader_setup_finish (plugin_loader, + helper.res, + error); + + g_main_loop_unref (helper.loop); + if (helper.res != NULL) + g_object_unref (helper.res); + + return retval; +} diff --git a/lib/gs-plugin-loader-sync.h b/lib/gs-plugin-loader-sync.h new file mode 100644 index 0000000..92320f3 --- /dev/null +++ b/lib/gs-plugin-loader-sync.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2007-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-plugin-loader.h" + +G_BEGIN_DECLS + +GsAppList *gs_plugin_loader_job_process (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job, + GCancellable *cancellable, + GError **error); +GsApp *gs_plugin_loader_job_process_app (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job, + GCancellable *cancellable, + GError **error); +gboolean gs_plugin_loader_job_action (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job, + GCancellable *cancellable, + GError **error); +GsApp *gs_plugin_loader_app_create (GsPluginLoader *plugin_loader, + const gchar *unique_id, + GCancellable *cancellable, + GError **error); +GsApp *gs_plugin_loader_get_system_app (GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error); +gboolean gs_plugin_loader_setup (GsPluginLoader *plugin_loader, + const gchar * const *allowlist, + const gchar * const *blocklist, + GCancellable *cancellable, + GError **error); + +G_END_DECLS diff --git a/lib/gs-plugin-loader.c b/lib/gs-plugin-loader.c new file mode 100644 index 0000000..e2d08ea --- /dev/null +++ b/lib/gs-plugin-loader.c @@ -0,0 +1,3894 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2007-2018 Richard Hughes + * Copyright (C) 2014-2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#ifdef HAVE_SYSPROF +#include +#endif + +#include "gs-app-collation.h" +#include "gs-app-private.h" +#include "gs-app-list-private.h" +#include "gs-category-manager.h" +#include "gs-category-private.h" +#include "gs-external-appstream-utils.h" +#include "gs-ioprio.h" +#include "gs-os-release.h" +#include "gs-plugin-loader.h" +#include "gs-plugin.h" +#include "gs-plugin-event.h" +#include "gs-plugin-job-private.h" +#include "gs-plugin-private.h" +#include "gs-profiler.h" +#include "gs-utils.h" + +#define GS_PLUGIN_LOADER_UPDATES_CHANGED_DELAY 3 /* s */ +#define GS_PLUGIN_LOADER_RELOAD_DELAY 5 /* s */ + +struct _GsPluginLoader +{ + GObject parent; + + gboolean setup_complete; + GCancellable *setup_complete_cancellable; /* (nullable) (owned) */ + + GThreadPool *old_api_thread_pool; /* (owned) */ + + GPtrArray *plugins; + GPtrArray *locations; + gchar *language; + gboolean plugin_dir_dirty; + GPtrArray *file_monitors; + GsPluginStatus global_status_last; + + GMutex pending_apps_mutex; + GsAppList *pending_apps; /* (nullable) (owned) */ + GCancellable *pending_apps_cancellable; /* (nullable) (owned) */ + + GThreadPool *queued_ops_pool; + gint active_jobs; + + GSettings *settings; + + GMutex events_by_id_mutex; + GHashTable *events_by_id; /* unique-id : GsPluginEvent */ + + gchar **compatible_projects; + guint scale; + + guint updates_changed_id; + guint updates_changed_cnt; + guint reload_id; + GHashTable *disallow_updates; /* GsPlugin : const char *name */ + + GNetworkMonitor *network_monitor; + gulong network_changed_handler; + gulong network_available_notify_handler; + gulong network_metered_notify_handler; + + GPowerProfileMonitor *power_profile_monitor; /* (owned) (nullable) */ + + GsJobManager *job_manager; /* (owned) (not nullable) */ + GsCategoryManager *category_manager; + GsOdrsProvider *odrs_provider; /* (owned) (nullable) */ + + GDBusConnection *session_bus_connection; /* (owned); (not nullable) after setup */ + GDBusConnection *system_bus_connection; /* (owned); (not nullable) after setup */ +}; + +static void gs_plugin_loader_monitor_network (GsPluginLoader *plugin_loader); +static void add_app_to_install_queue (GsPluginLoader *plugin_loader, GsApp *app); +static gboolean remove_apps_from_install_queue (GsPluginLoader *plugin_loader, GsAppList *apps); +static void gs_plugin_loader_process_in_thread_pool_cb (gpointer data, gpointer user_data); +static void gs_plugin_loader_status_changed_cb (GsPlugin *plugin, + GsApp *app, + GsPluginStatus status, + GsPluginLoader *plugin_loader); +static void async_result_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void gs_plugin_loader_process_old_api_job_cb (gpointer task_data, + gpointer user_data); + +G_DEFINE_TYPE (GsPluginLoader, gs_plugin_loader, G_TYPE_OBJECT) + +enum { + SIGNAL_STATUS_CHANGED, + SIGNAL_PENDING_APPS_CHANGED, + SIGNAL_UPDATES_CHANGED, + SIGNAL_RELOAD, + SIGNAL_BASIC_AUTH_START, + SIGNAL_ASK_UNTRUSTED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +typedef enum { + PROP_EVENTS = 1, + PROP_ALLOW_UPDATES, + PROP_NETWORK_AVAILABLE, + PROP_NETWORK_METERED, + PROP_SESSION_BUS_CONNECTION, + PROP_SYSTEM_BUS_CONNECTION, +} GsPluginLoaderProperty; + +static GParamSpec *obj_props[PROP_SYSTEM_BUS_CONNECTION + 1] = { NULL, }; + +typedef void (*GsPluginFunc) (GsPlugin *plugin); +typedef gboolean (*GsPluginSetupFunc) (GsPlugin *plugin, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginSearchFunc) (GsPlugin *plugin, + gchar **value, + GsAppList *list, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginAlternatesFunc) (GsPlugin *plugin, + GsApp *app, + GsAppList *list, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginCategoryFunc) (GsPlugin *plugin, + GsCategory *category, + GsAppList *list, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginGetRecentFunc) (GsPlugin *plugin, + GsAppList *list, + guint64 age, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginResultsFunc) (GsPlugin *plugin, + GsAppList *list, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginCategoriesFunc) (GsPlugin *plugin, + GPtrArray *list, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginActionFunc) (GsPlugin *plugin, + GsApp *app, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginRefreshFunc) (GsPlugin *plugin, + guint cache_age, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginFileToAppFunc) (GsPlugin *plugin, + GsAppList *list, + GFile *file, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginUrlToAppFunc) (GsPlugin *plugin, + GsAppList *list, + const gchar *url, + GCancellable *cancellable, + GError **error); +typedef gboolean (*GsPluginUpdateFunc) (GsPlugin *plugin, + GsAppList *apps, + GCancellable *cancellable, + GError **error); +typedef void (*GsPluginAdoptAppFunc) (GsPlugin *plugin, + GsApp *app); +typedef gboolean (*GsPluginGetLangPacksFunc) (GsPlugin *plugin, + GsAppList *list, + const gchar *locale, + GCancellable *cancellable, + GError **error); + + +/* async helper */ +typedef struct { + GsPluginLoader *plugin_loader; + const gchar *function_name; + const gchar *function_name_parent; + GPtrArray *catlist; + GsPluginJob *plugin_job; + gboolean anything_ran; + gchar **tokens; +} GsPluginLoaderHelper; + +static GsPluginLoaderHelper * +gs_plugin_loader_helper_new (GsPluginLoader *plugin_loader, GsPluginJob *plugin_job) +{ + GsPluginLoaderHelper *helper = g_slice_new0 (GsPluginLoaderHelper); + GsPluginAction action = gs_plugin_job_get_action (plugin_job); + helper->plugin_loader = g_object_ref (plugin_loader); + helper->plugin_job = g_object_ref (plugin_job); + helper->function_name = gs_plugin_action_to_function_name (action); + return helper; +} + +static void +gs_plugin_loader_helper_free (GsPluginLoaderHelper *helper) +{ + g_object_unref (helper->plugin_loader); + if (helper->plugin_job != NULL) + g_object_unref (helper->plugin_job); + if (helper->catlist != NULL) + g_ptr_array_unref (helper->catlist); + g_strfreev (helper->tokens); + g_slice_free (GsPluginLoaderHelper, helper); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsPluginLoaderHelper, gs_plugin_loader_helper_free) + +GsPlugin * +gs_plugin_loader_find_plugin (GsPluginLoader *plugin_loader, + const gchar *plugin_name) +{ + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i); + if (g_strcmp0 (gs_plugin_get_name (plugin), plugin_name) == 0) + return plugin; + } + return NULL; +} + +static gboolean +gs_plugin_loader_notify_idle_cb (gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (user_data); + g_object_notify_by_pspec (G_OBJECT (plugin_loader), obj_props[PROP_EVENTS]); + return FALSE; +} + +void +gs_plugin_loader_add_event (GsPluginLoader *plugin_loader, GsPluginEvent *event) +{ + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&plugin_loader->events_by_id_mutex); + + /* events should always have a unique ID, either constructed from the + * app they are processing or preferably from the GError message */ + if (gs_plugin_event_get_unique_id (event) == NULL) { + g_warning ("failed to add event from action %s", + gs_plugin_action_to_string (gs_plugin_event_get_action (event))); + return; + } + + g_debug ("%s: Adding event %s", G_STRFUNC, gs_plugin_event_get_unique_id (event)); + + g_hash_table_insert (plugin_loader->events_by_id, + g_strdup (gs_plugin_event_get_unique_id (event)), + g_object_ref (event)); + g_idle_add (gs_plugin_loader_notify_idle_cb, plugin_loader); +} + +static void +gs_plugin_loader_claim_error_internal (GsPluginLoader *plugin_loader, + GsPlugin *plugin, + GsPluginJob *job, + GsPluginAction action, + GsApp *app, + gboolean interactive, + const GError *error) +{ + g_autoptr(GError) error_copy = NULL; + g_autofree gchar *app_id = NULL; + g_autofree gchar *origin_id = NULL; + g_autoptr(GsPluginEvent) event = NULL; + g_autoptr(GsApp) event_app = NULL; + g_autoptr(GsApp) event_origin = NULL; + + g_return_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader)); + g_return_if_fail (error != NULL); + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + + /* find and strip any unique IDs from the error message */ + error_copy = g_error_copy (error); + + for (guint i = 0; i < 2; i++) { + if (app_id == NULL) + app_id = gs_utils_error_strip_app_id (error_copy); + if (origin_id == NULL) + origin_id = gs_utils_error_strip_origin_id (error_copy); + } + + /* invalid */ + if (error_copy->domain != GS_PLUGIN_ERROR) { + if (g_strcmp0 (BUILD_TYPE, "debug") == 0) { + g_warning ("not GsPlugin error %s:%i: %s", + g_quark_to_string (error_copy->domain), + error_copy->code, + error_copy->message); + } else { + g_debug ("not GsPlugin error %s:%i: %s", + g_quark_to_string (error_copy->domain), + error_copy->code, + error_copy->message); + } + error_copy->domain = GS_PLUGIN_ERROR; + error_copy->code = GS_PLUGIN_ERROR_FAILED; + } + + /* set the app and origin IDs if we managed to scrape them from the error above */ + if (app != NULL) + event_app = g_object_ref (app); + event_origin = NULL; + + if (plugin != NULL && as_utils_data_id_valid (app_id)) { + g_autoptr(GsApp) cached_app = gs_plugin_cache_lookup (plugin, app_id); + if (cached_app != NULL) { + g_debug ("found app %s in error", app_id); + g_set_object (&event_app, cached_app); + } else { + g_debug ("no unique ID found for app %s", app_id); + } + } + if (plugin != NULL && as_utils_data_id_valid (origin_id)) { + g_autoptr(GsApp) origin = gs_plugin_cache_lookup (plugin, origin_id); + if (origin != NULL) { + g_debug ("found origin %s in error", origin_id); + g_set_object (&event_origin, origin); + } else { + g_debug ("no unique ID found for origin %s", origin_id); + } + } + + /* create event which is handled by the GsShell */ + event = gs_plugin_event_new ("error", error_copy, + "action", action, + "app", event_app, + "origin", event_origin, + "job", job, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + + /* add event to the queue */ + gs_plugin_loader_add_event (plugin_loader, event); +} + +/** + * gs_plugin_loader_claim_error: + * @plugin_loader: a #GsPluginLoader + * @plugin: (nullable): a #GsPlugin to get an application from, or %NULL + * @action: a #GsPluginAction associated with the @error + * @app: (nullable): a #GsApp for the event, or %NULL + * @interactive: whether to set interactive flag + * @error: a #GError to claim + * + * Convert the @error into a plugin event and add it to the queue. + * + * The @plugin is used only if the @error contains a reference + * to a concrete application, in which case any cached application + * overrides the passed in @app. + * + * The %GS_PLUGIN_ERROR_CANCELLED and %G_IO_ERROR_CANCELLED errors + * are automatically ignored. + * + * Since: 41 + **/ +void +gs_plugin_loader_claim_error (GsPluginLoader *plugin_loader, + GsPlugin *plugin, + GsPluginAction action, + GsApp *app, + gboolean interactive, + const GError *error) +{ + g_return_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader)); + g_return_if_fail (error != NULL); + + gs_plugin_loader_claim_error_internal (plugin_loader, plugin, NULL, action, app, interactive, error); +} + +/** + * gs_plugin_loader_claim_job_error: + * @plugin_loader: a #GsPluginLoader + * @plugin: (nullable): a #GsPlugin to get an application from, or %NULL + * @job: a #GsPluginJob for the @error + * @error: a #GError to claim + * + * The same as gs_plugin_loader_claim_error(), only reads the information + * from the @job. + * + * Since: 41 + **/ +void +gs_plugin_loader_claim_job_error (GsPluginLoader *plugin_loader, + GsPlugin *plugin, + GsPluginJob *job, + const GError *error) +{ + g_return_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader)); + g_return_if_fail (GS_IS_PLUGIN_JOB (job)); + g_return_if_fail (error != NULL); + + gs_plugin_loader_claim_error_internal (plugin_loader, plugin, + job, + gs_plugin_job_get_action (job), + gs_plugin_job_get_app (job), + gs_plugin_job_get_interactive (job), + error); +} + +static gboolean +gs_plugin_loader_is_error_fatal (const GError *err) +{ + if (g_error_matches (err, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_TIMED_OUT)) + return TRUE; + if (g_error_matches (err, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_REQUIRED)) + return TRUE; + if (g_error_matches (err, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) + return TRUE; + return FALSE; +} + +static gboolean +gs_plugin_error_handle_failure (GsPluginLoaderHelper *helper, + GsPlugin *plugin, + const GError *error_local, + GError **error) +{ + g_autoptr(GError) error_local_copy = NULL; + g_autofree gchar *app_id = NULL; + g_autofree gchar *origin_id = NULL; + + /* badly behaved plugin */ + if (error_local == NULL) { + g_critical ("%s did not set error for %s", + gs_plugin_get_name (plugin), + helper->function_name); + return TRUE; + } + + if (gs_plugin_job_get_propagate_error (helper->plugin_job)) { + g_propagate_error (error, g_error_copy (error_local)); + return FALSE; + } + + /* this is only ever informational */ + if (g_error_matches (error_local, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("ignoring error cancelled: %s", error_local->message); + return TRUE; + } + + /* find and strip any unique IDs from the error message */ + error_local_copy = g_error_copy (error_local); + + for (guint i = 0; i < 2; i++) { + if (app_id == NULL) + app_id = gs_utils_error_strip_app_id (error_local_copy); + if (origin_id == NULL) + origin_id = gs_utils_error_strip_origin_id (error_local_copy); + } + + /* fatal error */ + if (gs_plugin_loader_is_error_fatal (error_local_copy) || + g_getenv ("GS_SELF_TEST_PLUGIN_ERROR_FAIL_HARD") != NULL) { + if (error != NULL) + *error = g_steal_pointer (&error_local_copy); + return FALSE; + } + + gs_plugin_loader_claim_job_error (helper->plugin_loader, plugin, helper->plugin_job, error_local); + + return TRUE; +} + +/** + * gs_plugin_loader_run_adopt: + * @plugin_loader: a #GsPluginLoader + * @list: list of apps to try and adopt + * + * Call the gs_plugin_adopt_app() function on each plugin on each app in @list + * to try and find the plugin which should manage each app. + * + * This function is intended to be used by internal gnome-software code. + * + * Since: 42 + */ +void +gs_plugin_loader_run_adopt (GsPluginLoader *plugin_loader, GsAppList *list) +{ + guint i; + guint j; + + /* go through each plugin in order */ + for (i = 0; i < plugin_loader->plugins->len; i++) { + GsPluginAdoptAppFunc adopt_app_func = NULL; + GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i); + adopt_app_func = gs_plugin_get_symbol (plugin, "gs_plugin_adopt_app"); + if (adopt_app_func == NULL) + continue; + for (j = 0; j < gs_app_list_length (list); j++) { + GsApp *app = gs_app_list_index (list, j); + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + if (!gs_app_has_management_plugin (app, NULL)) + continue; + + adopt_app_func (plugin, app); + + if (!gs_app_has_management_plugin (app, NULL)) { + g_debug ("%s adopted %s", + gs_plugin_get_name (plugin), + gs_app_get_unique_id (app)); + } + } + } + for (j = 0; j < gs_app_list_length (list); j++) { + GsApp *app = gs_app_list_index (list, j); + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + if (!gs_app_has_management_plugin (app, NULL)) + continue; + + g_debug ("nothing adopted %s", gs_app_get_unique_id (app)); + } +} + +static gboolean +gs_plugin_loader_call_vfunc (GsPluginLoaderHelper *helper, + GsPlugin *plugin, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + GsPluginAction action = gs_plugin_job_get_action (helper->plugin_job); + gboolean ret = TRUE; + gpointer func = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GTimer) timer = g_timer_new (); + g_autofree gchar *sysprof_name = NULL; + g_autofree gchar *sysprof_message = NULL; + + sysprof_name = g_strconcat ("vfunc:", gs_plugin_action_to_string (action), NULL); + sysprof_message = gs_plugin_job_to_string (helper->plugin_job); + + GS_PROFILER_BEGIN_SCOPED (PluginLoader, sysprof_name, sysprof_message); + + /* load the possible symbol */ + func = gs_plugin_get_symbol (plugin, helper->function_name); + if (func == NULL) + return TRUE; + + /* at least one plugin supports this vfunc */ + helper->anything_ran = TRUE; + + /* fallback if unset */ + if (list == NULL) + list = gs_plugin_job_get_list (helper->plugin_job); + + /* set what plugin is running on the job */ + gs_plugin_job_set_plugin (helper->plugin_job, plugin); + + /* run the correct vfunc */ + if (gs_plugin_job_get_interactive (helper->plugin_job)) + gs_plugin_interactive_inc (plugin); + switch (action) { + case GS_PLUGIN_ACTION_GET_LANGPACKS: + { + GsPluginGetLangPacksFunc plugin_func = func; + ret = plugin_func (plugin, list, + gs_plugin_job_get_search (helper->plugin_job), + cancellable, &error_local); + } + break; + default: + g_critical ("no handler for %s", helper->function_name); + break; + } + if (gs_plugin_job_get_interactive (helper->plugin_job)) + gs_plugin_interactive_dec (plugin); + + /* plugin did not return error on cancellable abort */ + if (ret && g_cancellable_set_error_if_cancelled (cancellable, &error_local)) { + g_debug ("plugin %s did not return error with cancellable set", + gs_plugin_get_name (plugin)); + gs_utils_error_convert_gio (&error_local); + ret = FALSE; + } + + /* failed */ + if (!ret) { + return gs_plugin_error_handle_failure (helper, + plugin, + error_local, + error); + } + + GS_PROFILER_END_SCOPED (PluginLoader); + + /* check the plugin didn't take too long */ + if (g_timer_elapsed (timer, NULL) > 1.0f) { + g_log_structured_standard (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, + __FILE__, G_STRINGIFY (__LINE__), + G_STRFUNC, + "plugin %s took %.1f seconds to do %s", + gs_plugin_get_name (plugin), + g_timer_elapsed (timer, NULL), + gs_plugin_action_to_string (action)); + } + + return TRUE; +} + +static void +gs_plugin_loader_job_sorted_truncation (GsPluginJob *plugin_job, + GsAppList *list) +{ + GsPluginAction action = gs_plugin_job_get_action (plugin_job); + guint max_results; + + /* not valid */ + if (list == NULL) + return; + + /* unset */ + max_results = gs_plugin_job_get_max_results (plugin_job); + if (max_results == 0) + return; + + /* already small enough */ + if (gs_app_list_length (list) <= max_results) + return; + + /* nothing set */ + g_debug ("truncating results to %u from %u", + max_results, gs_app_list_length (list)); + + g_debug ("randomising %s", gs_plugin_action_to_string (action)); + gs_app_list_randomize (list); + gs_app_list_truncate (list, max_results); +} + +static gboolean +gs_plugin_loader_run_results (GsPluginLoaderHelper *helper, + GCancellable *cancellable, + GError **error) +{ + GsPluginLoader *plugin_loader = helper->plugin_loader; + g_autofree gchar *sysprof_name = NULL; + g_autofree gchar *sysprof_message = NULL; + + sysprof_name = g_strconcat ("run-results:", + gs_plugin_action_to_string (gs_plugin_job_get_action (helper->plugin_job)), + NULL); + sysprof_message = gs_plugin_job_to_string (helper->plugin_job); + + GS_PROFILER_BEGIN_SCOPED (PluginLoader, sysprof_name, sysprof_message); + + /* Refining is done separately as it’s a special action */ + g_assert (!GS_IS_PLUGIN_JOB_REFINE (helper->plugin_job)); + + /* run each plugin */ + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i); + g_autoptr(GError) local_error = NULL; + if (g_cancellable_set_error_if_cancelled (cancellable, error)) { + gs_utils_error_convert_gio (error); + return FALSE; + } + if (!gs_plugin_loader_call_vfunc (helper, plugin, NULL, + cancellable, &local_error)) { + gboolean mask_error; + + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_propagate_error (error, g_steal_pointer (&local_error)); + gs_utils_error_convert_gio (error); + return FALSE; + } else if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED)) { + g_clear_error (&local_error); + continue; + } + + /* Let some actions forgive plugin errors, in case other plugins can handle it, + when one plugin fails. */ + switch (gs_plugin_job_get_action (helper->plugin_job)) { + case GS_PLUGIN_ACTION_GET_LANGPACKS: + mask_error = TRUE; + break; + default: + mask_error = GS_IS_PLUGIN_JOB_UPDATE_APPS (helper->plugin_job); + break; + } + if (mask_error) { + g_debug ("plugin '%s' failed to call '%s': %s", + gs_plugin_get_name (plugin), + helper->function_name, + local_error->message); + } else { + g_propagate_error (error, g_steal_pointer (&local_error)); + return FALSE; + } + } + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED); + } + + GS_PROFILER_END_SCOPED (PluginLoader); + + return TRUE; +} + +static const gchar * +gs_plugin_loader_get_app_str (GsApp *app) +{ + const gchar *id; + + /* first try the actual id */ + id = gs_app_get_unique_id (app); + if (id != NULL) + return id; + + /* then try the source */ + id = gs_app_get_source_default (app); + if (id != NULL) + return id; + + /* lastly try the source id */ + id = gs_app_get_source_id_default (app); + if (id != NULL) + return id; + + /* urmmm */ + return ""; +} + +gboolean +gs_plugin_loader_app_is_valid (GsApp *app, + GsPluginRefineFlags refine_flags) +{ + /* never show addons */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_ADDON) { + g_debug ("app invalid as addon %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* never show CLI apps */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_CONSOLE_APP) { + g_debug ("app invalid as console %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* don't show unknown state */ + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) { + g_debug ("app invalid as state unknown %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* don't show unconverted unavailables */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN && + gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE) { + g_debug ("app invalid as unconverted unavailable %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* don't show blocklisted apps */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_HIDE_EVERYWHERE)) { + g_debug ("app invalid as blocklisted %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* Don’t show parentally filtered apps unless they’re already + * installed. See the comments in gs-details-page.c for details. */ + if (!gs_app_is_installed (app) && + gs_app_has_quirk (app, GS_APP_QUIRK_PARENTAL_FILTER)) { + g_debug ("app invalid as parentally filtered %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* don't show apps with hide-from-search quirk, unless they are already installed */ + if (!gs_app_is_installed (app) && + gs_app_has_quirk (app, GS_APP_QUIRK_HIDE_FROM_SEARCH)) { + g_debug ("app invalid as hide-from-search quirk set %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* don't show sources */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) { + g_debug ("app invalid as source %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* don't show unknown kind */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN) { + g_debug ("app invalid as kind unknown %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* don't show unconverted packages in the application view */ + if (!(refine_flags & GS_PLUGIN_REFINE_FLAGS_ALLOW_PACKAGES) && + gs_app_get_kind (app) == AS_COMPONENT_KIND_GENERIC && + gs_app_get_special_kind (app) == GS_APP_SPECIAL_KIND_NONE) { + g_debug ("app invalid as only a %s: %s", + as_component_kind_to_string (gs_app_get_kind (app)), + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* don't show apps that do not have the required details */ + if (gs_app_get_name (app) == NULL) { + g_debug ("app invalid as no name %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + if (gs_app_get_summary (app) == NULL) { + g_debug ("app invalid as no summary %s", + gs_plugin_loader_get_app_str (app)); + return FALSE; + } + + /* ignore this crazy application */ + if (g_strcmp0 (gs_app_get_id (app), "gnome-system-monitor-kde.desktop") == 0) { + g_debug ("Ignoring KDE version of %s", gs_app_get_id (app)); + return FALSE; + } + return TRUE; +} + +gboolean +gs_plugin_loader_app_is_compatible (GsPluginLoader *plugin_loader, + GsApp *app) +{ + const gchar *tmp; + guint i; + + /* search for any compatible projects */ + tmp = gs_app_get_project_group (app); + if (tmp == NULL) + return TRUE; + for (i = 0; plugin_loader->compatible_projects[i] != NULL; i++) { + if (g_strcmp0 (tmp, plugin_loader->compatible_projects[i]) == 0) + return TRUE; + } + g_debug ("removing incompatible %s from project group %s", + gs_app_get_id (app), gs_app_get_project_group (app)); + return FALSE; +} + +/******************************************************************************/ + +/** + * gs_plugin_loader_job_process_finish: + * @plugin_loader: A #GsPluginLoader + * @res: a #GAsyncResult + * @error: A #GError, or %NULL + * + * Return value: (element-type GsApp) (transfer full): A list of applications + **/ +GsAppList * +gs_plugin_loader_job_process_finish (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GError **error) +{ + GTask *task; + GsAppList *list = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), NULL); + g_return_val_if_fail (G_IS_TASK (res), NULL); + g_return_val_if_fail (g_task_is_valid (res, plugin_loader), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + task = G_TASK (res); + + /* Return cancelled if the task was cancelled and there is no other error set. + * + * This is needed because we set the task `check_cancellable` to FALSE, + * to be able to catch other errors such as timeout, but that means + * g_task_propagate_pointer() will ignore if the task was cancelled and only + * check if there was an error (i.e. g_task_return_*error*). + * + * We only do this if there is no error already set in the task (e.g. + * timeout) because in that case we want to return the existing error. + */ + if (!g_task_had_error (task)) { + GCancellable *cancellable = g_task_get_cancellable (task); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) { + gs_utils_error_convert_gio (error); + return NULL; + } + } + list = g_task_propagate_pointer (task, error); + gs_utils_error_convert_gio (error); + return list; +} + +/** + * gs_plugin_loader_job_action_finish: + * @plugin_loader: A #GsPluginLoader + * @res: a #GAsyncResult + * @error: A #GError, or %NULL + * + * Return value: success + **/ +gboolean +gs_plugin_loader_job_action_finish (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GError **error) +{ + g_autoptr(GsAppList) list = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), FALSE); + g_return_val_if_fail (G_IS_TASK (res), FALSE); + g_return_val_if_fail (g_task_is_valid (res, plugin_loader), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + list = g_task_propagate_pointer (G_TASK (res), error); + return list != NULL; +} + +/******************************************************************************/ + +static gboolean +emit_pending_apps_idle (gpointer loader) +{ + g_signal_emit (loader, signals[SIGNAL_PENDING_APPS_CHANGED], 0); + g_object_unref (loader); + + return G_SOURCE_REMOVE; +} + +/* If the plugin job is an uninstall, returns the return value from + * remove_apps_from_install_queue(). */ +static gboolean +gs_plugin_loader_pending_apps_add (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job) +{ + GsAppList *list; + gboolean retval = TRUE; + + if (GS_IS_PLUGIN_JOB_INSTALL_APPS (plugin_job)) { + list = gs_plugin_job_install_apps_get_apps (GS_PLUGIN_JOB_INSTALL_APPS (plugin_job)); + g_assert (gs_app_list_length (list) > 0); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (gs_app_get_state (app) != GS_APP_STATE_AVAILABLE_LOCAL) + add_app_to_install_queue (plugin_loader, app); + } + } else if (GS_IS_PLUGIN_JOB_UNINSTALL_APPS (plugin_job)) { + list = gs_plugin_job_uninstall_apps_get_apps (GS_PLUGIN_JOB_UNINSTALL_APPS (plugin_job)); + g_assert (gs_app_list_length (list) > 0); + + retval = remove_apps_from_install_queue (plugin_loader, list); + } else { + g_assert_not_reached (); + } + + g_idle_add (emit_pending_apps_idle, g_object_ref (plugin_loader)); + + return retval; +} + +static void +gs_plugin_loader_pending_apps_remove (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job) +{ + GsAppList *list; + + if (GS_IS_PLUGIN_JOB_INSTALL_APPS (plugin_job)) + list = gs_plugin_job_install_apps_get_apps (GS_PLUGIN_JOB_INSTALL_APPS (plugin_job)); + else if (GS_IS_PLUGIN_JOB_UNINSTALL_APPS (plugin_job)) + list = gs_plugin_job_uninstall_apps_get_apps (GS_PLUGIN_JOB_UNINSTALL_APPS (plugin_job)); + else + g_assert_not_reached (); + + g_assert (gs_app_list_length (list) > 0); + + remove_apps_from_install_queue (plugin_loader, list); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + /* check the app is not still in an action helper */ + switch (gs_app_get_state (app)) { + case GS_APP_STATE_DOWNLOADING: + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + g_warning ("application %s left in %s helper", + gs_app_get_unique_id (app), + gs_app_state_to_string (gs_app_get_state (app))); + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + break; + default: + break; + } + + } + g_idle_add (emit_pending_apps_idle, g_object_ref (plugin_loader)); +} + +static void +async_result_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **result_out = user_data; + + *result_out = g_object_ref (result); + g_main_context_wakeup (g_main_context_get_thread_default ()); +} + +/* This will load the install queue and add it to #GsPluginLoader.pending_apps, + * but it won’t refine the loaded apps. */ +static GsAppList * +load_install_queue (GsPluginLoader *plugin_loader, + GError **error) +{ + g_autofree gchar *contents = NULL; + g_autofree gchar *file = NULL; + g_auto(GStrv) names = NULL; + g_autoptr(GsAppList) list = NULL; + + /* load from file */ + file = g_build_filename (g_get_user_data_dir (), + "gnome-software", + "install-queue", + NULL); + if (!g_file_test (file, G_FILE_TEST_EXISTS)) + return gs_app_list_new (); + + g_debug ("loading install queue from %s", file); + if (!g_file_get_contents (file, &contents, NULL, error)) + return NULL; + + /* add to GsAppList, deduplicating if required */ + list = gs_app_list_new (); + names = g_strsplit (contents, "\n", 0); + for (guint i = 0; names[i] != NULL; i++) { + g_autoptr(GsApp) app = NULL; + g_auto(GStrv) split = g_strsplit (names[i], "\t", -1); + if (split[0] == NULL || split[1] == NULL) + continue; + app = gs_app_new (NULL); + gs_app_set_from_unique_id (app, split[0], as_component_kind_from_string (split[1])); + gs_app_set_state (app, GS_APP_STATE_QUEUED_FOR_INSTALL); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app); + } + + /* add to pending list */ + g_mutex_lock (&plugin_loader->pending_apps_mutex); + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + g_debug ("adding pending app %s", gs_app_get_unique_id (app)); + if (plugin_loader->pending_apps == NULL) + plugin_loader->pending_apps = gs_app_list_new (); + gs_app_list_add (plugin_loader->pending_apps, app); + } + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + + return g_steal_pointer (&list); +} + +static void +save_install_queue (GsPluginLoader *plugin_loader) +{ + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GString) s = NULL; + g_autofree gchar *file = NULL; + + s = g_string_new (""); + g_mutex_lock (&plugin_loader->pending_apps_mutex); + for (guint i = 0; plugin_loader->pending_apps != NULL && i < gs_app_list_length (plugin_loader->pending_apps); i++) { + GsApp *app = gs_app_list_index (plugin_loader->pending_apps, i); + if (gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL && + gs_app_get_unique_id (app) != NULL) { + g_string_append (s, gs_app_get_unique_id (app)); + g_string_append_c (s, '\t'); + g_string_append (s, as_component_kind_to_string (gs_app_get_kind (app))); + g_string_append_c (s, '\n'); + } + } + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + + /* save file */ + file = g_build_filename (g_get_user_data_dir (), + "gnome-software", + "install-queue", + NULL); + if (s->len == 0) { + if (g_unlink (file) == -1 && errno != ENOENT) { + gint errn = errno; + g_warning ("Failed to unlink '%s': %s", file, g_strerror (errn)); + } + return; + } + + if (!gs_mkdir_parent (file, &error)) { + g_warning ("failed to create dir for %s: %s", + file, error->message); + return; + } + g_debug ("saving install queue to %s", file); + ret = g_file_set_contents (file, s->str, (gssize) s->len, &error); + if (!ret) + g_warning ("failed to save install queue: %s", error->message); +} + +static void +add_app_to_install_queue (GsPluginLoader *plugin_loader, GsApp *app) +{ + g_autoptr(GsAppList) addons = NULL; + g_autoptr(GSource) source = NULL; + guint i; + + /* queue the app itself */ + g_mutex_lock (&plugin_loader->pending_apps_mutex); + if (plugin_loader->pending_apps == NULL) + plugin_loader->pending_apps = gs_app_list_new (); + gs_app_list_add (plugin_loader->pending_apps, app); + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + + gs_app_set_state (app, GS_APP_STATE_QUEUED_FOR_INSTALL); + + source = g_idle_source_new (); + g_source_set_callback (source, emit_pending_apps_idle, g_object_ref (plugin_loader), NULL); + g_source_set_name (source, "[gnome-software] emit_pending_apps_idle"); + g_source_attach (source, NULL); + + save_install_queue (plugin_loader); + + /* recursively queue any addons */ + addons = gs_app_dup_addons (app); + for (i = 0; addons != NULL && i < gs_app_list_length (addons); i++) { + GsApp *addon = gs_app_list_index (addons, i); + if (gs_app_get_to_be_installed (addon)) + add_app_to_install_queue (plugin_loader, addon); + } +} + +/* Returns %TRUE if *all* the @apps were found and removed from the install queue. */ +static gboolean +remove_apps_from_install_queue (GsPluginLoader *plugin_loader, GsAppList *apps) +{ + g_autoptr(GsAppList) removed_apps = gs_app_list_new (); + gboolean all_removed; + gboolean any_removed; + + g_mutex_lock (&plugin_loader->pending_apps_mutex); + all_removed = plugin_loader->pending_apps != NULL; + any_removed = FALSE; + for (guint i = 0; plugin_loader->pending_apps != NULL && i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + + if (gs_app_list_remove (plugin_loader->pending_apps, app)) { + gs_app_list_add (removed_apps, app); + any_removed = TRUE; + } else { + all_removed = FALSE; + } + } + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + + if (any_removed) { + g_autoptr(GSource) source = NULL; + + for (guint i = 0; i < gs_app_list_length (removed_apps); i++) { + GsApp *app = gs_app_list_index (removed_apps, i); + if (gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL) + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + } + + source = g_idle_source_new (); + g_source_set_callback (source, emit_pending_apps_idle, g_object_ref (plugin_loader), NULL); + g_source_set_name (source, "[gnome-software] emit_pending_apps_idle"); + g_source_attach (source, NULL); + + save_install_queue (plugin_loader); + + /* recursively remove any queued addons */ + for (guint i = 0; i < gs_app_list_length (removed_apps); i++) { + GsApp *app = gs_app_list_index (removed_apps, i); + g_autoptr(GsAppList) addons = gs_app_dup_addons (app); + if (addons != NULL && gs_app_list_length (addons) > 0) + remove_apps_from_install_queue (plugin_loader, addons); + } + } + + return all_removed; +} + +/******************************************************************************/ + +gboolean +gs_plugin_loader_get_allow_updates (GsPluginLoader *plugin_loader) +{ + GHashTableIter iter; + gpointer value; + + /* nothing */ + if (g_hash_table_size (plugin_loader->disallow_updates) == 0) + return TRUE; + + /* list */ + g_hash_table_iter_init (&iter, plugin_loader->disallow_updates); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + const gchar *reason = value; + g_debug ("managed updates inhibited by %s", reason); + } + return FALSE; +} + +GsAppList * +gs_plugin_loader_get_pending (GsPluginLoader *plugin_loader) +{ + GsAppList *array; + + array = gs_app_list_new (); + g_mutex_lock (&plugin_loader->pending_apps_mutex); + if (plugin_loader->pending_apps != NULL) + gs_app_list_add_list (array, plugin_loader->pending_apps); + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + + return array; +} + +gboolean +gs_plugin_loader_get_enabled (GsPluginLoader *plugin_loader, + const gchar *plugin_name) +{ + GsPlugin *plugin; + plugin = gs_plugin_loader_find_plugin (plugin_loader, plugin_name); + if (plugin == NULL) + return FALSE; + return gs_plugin_get_enabled (plugin); +} + +/** + * gs_plugin_loader_get_events: + * @plugin_loader: A #GsPluginLoader + * + * Gets all plugin events, even ones that are not active or visible anymore. + * + * Returns: (transfer container) (element-type GsPluginEvent): events + **/ +GPtrArray * +gs_plugin_loader_get_events (GsPluginLoader *plugin_loader) +{ + GPtrArray *events = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&plugin_loader->events_by_id_mutex); + GHashTableIter iter; + gpointer key, value; + + /* just add everything */ + g_hash_table_iter_init (&iter, plugin_loader->events_by_id); + while (g_hash_table_iter_next (&iter, &key, &value)) { + const gchar *id = key; + GsPluginEvent *event = value; + if (event == NULL) { + g_warning ("failed to get event for '%s'", id); + continue; + } + g_ptr_array_add (events, g_object_ref (event)); + } + return events; +} + +/** + * gs_plugin_loader_get_event_default: + * @plugin_loader: A #GsPluginLoader + * + * Gets an active plugin event where active means that it was not been + * already dismissed by the user. + * + * Returns: (transfer full): a #GsPluginEvent, or %NULL for none + **/ +GsPluginEvent * +gs_plugin_loader_get_event_default (GsPluginLoader *plugin_loader) +{ + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&plugin_loader->events_by_id_mutex); + GHashTableIter iter; + gpointer key, value; + + /* just add everything */ + g_hash_table_iter_init (&iter, plugin_loader->events_by_id); + while (g_hash_table_iter_next (&iter, &key, &value)) { + const gchar *id = key; + GsPluginEvent *event = value; + if (event == NULL) { + g_warning ("failed to get event for '%s'", id); + continue; + } + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INVALID)) + return g_object_ref (event); + } + return NULL; +} + +/** + * gs_plugin_loader_remove_events: + * @plugin_loader: A #GsPluginLoader + * + * Removes all plugin events from the loader. This function should only be + * called from the self tests. + **/ +void +gs_plugin_loader_remove_events (GsPluginLoader *plugin_loader) +{ + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&plugin_loader->events_by_id_mutex); + g_hash_table_remove_all (plugin_loader->events_by_id); +} + +static void +gs_plugin_loader_report_event_cb (GsPlugin *plugin, + GsPluginEvent *event, + GsPluginLoader *plugin_loader) +{ + if (gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_loader_add_event (plugin_loader, event); +} + +static void +gs_plugin_loader_allow_updates_cb (GsPlugin *plugin, + gboolean allow_updates, + GsPluginLoader *plugin_loader) +{ + gboolean changed = FALSE; + + /* plugin now allowing gnome-software to show updates panel */ + if (allow_updates) { + if (g_hash_table_remove (plugin_loader->disallow_updates, plugin)) { + g_debug ("plugin %s no longer inhibited managed updates", + gs_plugin_get_name (plugin)); + changed = TRUE; + } + + /* plugin preventing the updates panel from being shown */ + } else { + if (g_hash_table_replace (plugin_loader->disallow_updates, + (gpointer) plugin, + (gpointer) gs_plugin_get_name (plugin))) { + g_debug ("plugin %s inhibited managed updates", + gs_plugin_get_name (plugin)); + changed = TRUE; + } + } + + /* notify display layer */ + if (changed) + g_object_notify_by_pspec (G_OBJECT (plugin_loader), obj_props[PROP_ALLOW_UPDATES]); +} + +static void +gs_plugin_loader_status_changed_cb (GsPlugin *plugin, + GsApp *app, + GsPluginStatus status, + GsPluginLoader *plugin_loader) +{ + /* nothing specific */ + if (app == NULL || gs_app_get_id (app) == NULL) { + if (plugin_loader->global_status_last != status) { + g_debug ("emitting global %s", + gs_plugin_status_to_string (status)); + g_signal_emit (plugin_loader, + signals[SIGNAL_STATUS_CHANGED], + 0, app, status); + plugin_loader->global_status_last = status; + } + return; + } + + /* a specific app */ + g_debug ("emitting %s(%s)", + gs_plugin_status_to_string (status), + gs_app_get_id (app)); + g_signal_emit (plugin_loader, + signals[SIGNAL_STATUS_CHANGED], + 0, app, status); +} + +static void +gs_plugin_loader_basic_auth_start_cb (GsPlugin *plugin, + const gchar *remote, + const gchar *realm, + GCallback callback, + gpointer user_data, + GsPluginLoader *plugin_loader) +{ + g_debug ("emitting basic-auth-start %s", realm); + g_signal_emit (plugin_loader, + signals[SIGNAL_BASIC_AUTH_START], 0, + remote, + realm, + callback, + user_data); +} + +static gboolean +gs_plugin_loader_ask_untrusted_cb (GsPlugin *plugin, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label, + GsPluginLoader *plugin_loader) +{ + gboolean accepts = FALSE; + g_debug ("emitting ask-untrusted title:'%s', msg:'%s' details:'%s' accept-label:'%s'", title, msg, details, accept_label); + g_signal_emit (plugin_loader, + signals[SIGNAL_ASK_UNTRUSTED], 0, + title, msg, details, accept_label, &accepts); + return accepts; +} + +static gboolean +gs_plugin_loader_job_updates_changed_delay_cb (gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (user_data); + + /* notify shells */ + g_debug ("updates-changed"); + g_signal_emit (plugin_loader, signals[SIGNAL_UPDATES_CHANGED], 0); + plugin_loader->updates_changed_id = 0; + plugin_loader->updates_changed_cnt = 0; + + return FALSE; +} + +static void +gs_plugin_loader_updates_changed (GsPluginLoader *plugin_loader) +{ + if (plugin_loader->updates_changed_id != 0) + return; + plugin_loader->updates_changed_id = + g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, + GS_PLUGIN_LOADER_UPDATES_CHANGED_DELAY, + gs_plugin_loader_job_updates_changed_delay_cb, + g_object_ref (plugin_loader), + g_object_unref); +} + +static void +gs_plugin_loader_job_updates_changed_cb (GsPlugin *plugin, + GsPluginLoader *plugin_loader) +{ + plugin_loader->updates_changed_cnt++; + + /* Schedule emit of updates changed when no job is active. + This helps to avoid a race condition when a plugin calls + updates-changed at the end of the job, but the job is + finished before the callback gets called in the main thread. */ + if (!g_atomic_int_get (&plugin_loader->active_jobs)) + gs_plugin_loader_updates_changed (plugin_loader); +} + +static gboolean +gs_plugin_loader_reload_delay_cb (gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (user_data); + + /* notify shells */ + g_debug ("emitting ::reload"); + g_signal_emit (plugin_loader, signals[SIGNAL_RELOAD], 0); + plugin_loader->reload_id = 0; + + g_object_unref (plugin_loader); + return FALSE; +} + +static void +gs_plugin_loader_reload_cb (GsPlugin *in_plugin, + GsPluginLoader *plugin_loader) +{ + if (plugin_loader->reload_id != 0) + return; + /* Let also the plugins know that the reload had been initiated; + The GsPluginClass::reload is a signal function, but its default + implementation can be used to notify the plugin. */ + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i); + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + if (plugin != in_plugin && plugin_class != NULL && plugin_class->reload != NULL) { + g_signal_handlers_block_by_func (plugin, gs_plugin_loader_reload_cb, plugin_loader); + plugin_class->reload (plugin); + g_signal_handlers_unblock_by_func (plugin, gs_plugin_loader_reload_cb, plugin_loader); + } + } + plugin_loader->reload_id = + g_timeout_add_seconds (GS_PLUGIN_LOADER_RELOAD_DELAY, + gs_plugin_loader_reload_delay_cb, + g_object_ref (plugin_loader)); +} + +static void +gs_plugin_loader_repository_changed_cb (GsPlugin *plugin, + GsApp *repository, + GsPluginLoader *plugin_loader) +{ + GApplication *application = g_application_get_default (); + + /* Can be NULL when running the self tests */ + if (application) { + g_signal_emit_by_name (application, + "repository-changed", + repository); + } +} + +static void +gs_plugin_loader_open_plugin (GsPluginLoader *plugin_loader, + const gchar *filename) +{ + GsPlugin *plugin; + g_autoptr(GError) error = NULL; + + /* create plugin from file */ + plugin = gs_plugin_create (filename, + plugin_loader->session_bus_connection, + plugin_loader->system_bus_connection, + &error); + if (plugin == NULL) { + g_warning ("Failed to load %s: %s", filename, error->message); + return; + } + g_signal_connect (plugin, "updates-changed", + G_CALLBACK (gs_plugin_loader_job_updates_changed_cb), + plugin_loader); + g_signal_connect (plugin, "reload", + G_CALLBACK (gs_plugin_loader_reload_cb), + plugin_loader); + g_signal_connect (plugin, "status-changed", + G_CALLBACK (gs_plugin_loader_status_changed_cb), + plugin_loader); + g_signal_connect (plugin, "basic-auth-start", + G_CALLBACK (gs_plugin_loader_basic_auth_start_cb), + plugin_loader); + g_signal_connect (plugin, "report-event", + G_CALLBACK (gs_plugin_loader_report_event_cb), + plugin_loader); + g_signal_connect (plugin, "allow-updates", + G_CALLBACK (gs_plugin_loader_allow_updates_cb), + plugin_loader); + g_signal_connect (plugin, "repository-changed", + G_CALLBACK (gs_plugin_loader_repository_changed_cb), + plugin_loader); + g_signal_connect (plugin, "ask-untrusted", + G_CALLBACK (gs_plugin_loader_ask_untrusted_cb), + plugin_loader); + gs_plugin_set_language (plugin, plugin_loader->language); + gs_plugin_set_scale (plugin, gs_plugin_loader_get_scale (plugin_loader)); + gs_plugin_set_network_monitor (plugin, plugin_loader->network_monitor); + g_debug ("opened plugin %s: %s", filename, gs_plugin_get_name (plugin)); + + /* add to array */ + g_ptr_array_add (plugin_loader->plugins, plugin); +} + +static void +gs_plugin_loader_remove_all_plugins (GsPluginLoader *plugin_loader) +{ + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = GS_PLUGIN (plugin_loader->plugins->pdata[i]); + g_signal_handlers_disconnect_by_data (plugin, plugin_loader); + } + + g_ptr_array_set_size (plugin_loader->plugins, 0); +} + +void +gs_plugin_loader_set_scale (GsPluginLoader *plugin_loader, guint scale) +{ + /* save globally, and update each plugin */ + plugin_loader->scale = scale; + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i); + gs_plugin_set_scale (plugin, scale); + } +} + +guint +gs_plugin_loader_get_scale (GsPluginLoader *plugin_loader) +{ + return plugin_loader->scale; +} + +void +gs_plugin_loader_add_location (GsPluginLoader *plugin_loader, const gchar *location) +{ + for (guint i = 0; i < plugin_loader->locations->len; i++) { + const gchar *location_tmp = g_ptr_array_index (plugin_loader->locations, i); + if (g_strcmp0 (location_tmp, location) == 0) + return; + } + g_info ("adding plugin location %s", location); + g_ptr_array_add (plugin_loader->locations, g_strdup (location)); +} + +static gint +gs_plugin_loader_plugin_sort_fn (gconstpointer a, gconstpointer b) +{ + GsPlugin *pa = *((GsPlugin **) a); + GsPlugin *pb = *((GsPlugin **) b); + if (gs_plugin_get_order (pa) < gs_plugin_get_order (pb)) + return -1; + if (gs_plugin_get_order (pa) > gs_plugin_get_order (pb)) + return 1; + return g_strcmp0 (gs_plugin_get_name (pa), gs_plugin_get_name (pb)); +} + +static void +gs_plugin_loader_software_app_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GsApp) app = NULL; + g_autoptr(GsPluginEvent) event = NULL; + g_autoptr(GError) error = NULL; + + app = gs_plugin_loader_app_create_finish (plugin_loader, result, NULL); + + g_set_error_literal (&error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_RESTART_REQUIRED, + "A restart is required"); + event = gs_plugin_event_new ("action", GS_PLUGIN_ACTION_UNKNOWN, + "app", app, + "error", error, + NULL); + + gs_plugin_loader_add_event (plugin_loader, event); +} + +static void +gs_plugin_loader_plugin_dir_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + GsPluginLoader *plugin_loader) +{ + /* already triggered */ + if (plugin_loader->plugin_dir_dirty) + return; + + gs_plugin_loader_app_create_async (plugin_loader, "system/*/*/org.gnome.Software.desktop/*", + NULL, gs_plugin_loader_software_app_created_cb, NULL); + + plugin_loader->plugin_dir_dirty = TRUE; +} + +void +gs_plugin_loader_clear_caches (GsPluginLoader *plugin_loader) +{ + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i); + gs_plugin_cache_invalidate (plugin); + } +} + +static void +gs_plugin_loader_remove_all_file_monitors (GsPluginLoader *plugin_loader) +{ + for (guint i = 0; i < plugin_loader->file_monitors->len; i++) { + GFileMonitor *file_monitor = G_FILE_MONITOR (plugin_loader->file_monitors->pdata[i]); + + g_signal_handlers_disconnect_by_data (file_monitor, plugin_loader); + g_file_monitor_cancel (file_monitor); + } + + g_ptr_array_set_size (plugin_loader->file_monitors, 0); +} + +typedef struct { + GsPluginLoader *plugin_loader; /* (unowned) */ + GMainContext *context; /* (owned) */ + guint n_pending; +} ShutdownData; + +static void plugin_shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/** + * gs_plugin_loader_shutdown: + * @plugin_loader: a #GsPluginLoader + * @cancellable: a #GCancellable, or %NULL + * + * Shut down the plugins. + * + * This blocks until the operation is complete. It may be refactored in future + * to be asynchronous. + * + * Since: 42 + */ +void +gs_plugin_loader_shutdown (GsPluginLoader *plugin_loader, + GCancellable *cancellable) +{ + ShutdownData shutdown_data; + + shutdown_data.plugin_loader = plugin_loader; + shutdown_data.n_pending = 1; /* incremented until all operations have been started */ + shutdown_data.context = g_main_context_new (); + + g_main_context_push_thread_default (shutdown_data.context); + + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = GS_PLUGIN (plugin_loader->plugins->pdata[i]); + + if (!gs_plugin_get_enabled (plugin)) + continue; + + if (GS_PLUGIN_GET_CLASS (plugin)->shutdown_async != NULL) { + GS_PLUGIN_GET_CLASS (plugin)->shutdown_async (plugin, cancellable, + plugin_shutdown_cb, &shutdown_data); + shutdown_data.n_pending++; + } + } + + /* Wait for shutdown to complete in all plugins. */ + shutdown_data.n_pending--; + + while (shutdown_data.n_pending > 0) + g_main_context_iteration (shutdown_data.context, TRUE); + + g_main_context_pop_thread_default (shutdown_data.context); + g_clear_pointer (&shutdown_data.context, g_main_context_unref); + + /* Clear some internal data structures. */ + gs_plugin_loader_remove_all_plugins (plugin_loader); + gs_plugin_loader_remove_all_file_monitors (plugin_loader); + plugin_loader->setup_complete = FALSE; + g_clear_object (&plugin_loader->setup_complete_cancellable); + plugin_loader->setup_complete_cancellable = g_cancellable_new (); +} + +static void +plugin_shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + ShutdownData *data = user_data; + g_autoptr(GError) local_error = NULL; + + g_assert (GS_PLUGIN_GET_CLASS (plugin)->shutdown_finish != NULL); + + if (!GS_PLUGIN_GET_CLASS (plugin)->shutdown_finish (plugin, result, &local_error)) { + g_debug ("disabling %s as shutdown failed: %s", + gs_plugin_get_name (plugin), + local_error->message); + gs_plugin_set_enabled (plugin, FALSE); + } + + /* Indicate this plugin has finished shutting down. */ + data->n_pending--; + g_main_context_wakeup (data->context); +} + +static gint +gs_plugin_loader_path_sort_fn (gconstpointer a, gconstpointer b) +{ + const gchar *sa = *((const gchar **) a); + const gchar *sb = *((const gchar **) b); + return g_strcmp0 (sa, sb); +} + +static GPtrArray * +gs_plugin_loader_find_plugins (const gchar *path, GError **error) +{ + const gchar *fn_tmp; + g_autoptr(GPtrArray) fns = g_ptr_array_new_with_free_func (g_free); + g_autoptr(GDir) dir = g_dir_open (path, 0, error); + if (dir == NULL) + return NULL; + while ((fn_tmp = g_dir_read_name (dir)) != NULL) { + if (!g_str_has_suffix (fn_tmp, ".so")) + continue; + g_ptr_array_add (fns, g_build_filename (path, fn_tmp, NULL)); + } + g_ptr_array_sort (fns, gs_plugin_loader_path_sort_fn); + return g_steal_pointer (&fns); +} + +typedef struct { + guint n_pending; + gchar **allowlist; + gchar **blocklist; +#ifdef HAVE_SYSPROF + gint64 setup_begin_time_nsec; + gint64 plugins_begin_time_nsec; +#endif +} SetupData; + +static void +setup_data_free (SetupData *data) +{ + g_clear_pointer (&data->allowlist, g_strfreev); + g_clear_pointer (&data->blocklist, g_strfreev); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (SetupData, setup_data_free) + +static void get_session_bus_cb (GObject *object, + GAsyncResult *result, + gpointer user_data); +static void get_system_bus_cb (GObject *object, + GAsyncResult *result, + gpointer user_data); +static void finish_setup_get_bus (GTask *task); +static void plugin_setup_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_setup_op (GTask *task); +static void finish_setup_install_queue_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/* Mark the asynchronous setup operation as complete. This will notify any + * waiting tasks by cancelling the #GCancellable. It’s safe to clear the + * #GCancellable as each waiting task holds its own reference. */ +static void +notify_setup_complete (GsPluginLoader *plugin_loader) +{ + plugin_loader->setup_complete = TRUE; + g_cancellable_cancel (plugin_loader->setup_complete_cancellable); + g_clear_object (&plugin_loader->setup_complete_cancellable); +} + +/** + * gs_plugin_loader_setup_async: + * @plugin_loader: a #GsPluginLoader + * @allowlist: list of plugin names, or %NULL + * @blocklist: list of plugin names, or %NULL + * @cancellable: A #GCancellable, or %NULL + * @callback: callback to indicate completion of the asynchronous operation + * @user_data: data to pass to @callback + * + * Sets up the plugin loader ready for use. + * + * Since: 42 + */ +void +gs_plugin_loader_setup_async (GsPluginLoader *plugin_loader, + const gchar * const *allowlist, + const gchar * const *blocklist, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + SetupData *setup_data; + g_autoptr(SetupData) setup_data_owned = NULL; + g_autoptr(GTask) task = NULL; +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec G_GNUC_UNUSED = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + task = g_task_new (plugin_loader, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_loader_setup_async); + + /* If setup is already complete, return immediately. */ + if (plugin_loader->setup_complete) { + g_task_return_boolean (task, TRUE); + return; + } + + /* Setup data closure. */ + setup_data = setup_data_owned = g_new0 (SetupData, 1); + setup_data->allowlist = g_strdupv ((gchar **) allowlist); + setup_data->blocklist = g_strdupv ((gchar **) blocklist); +#ifdef HAVE_SYSPROF + setup_data->setup_begin_time_nsec = begin_time_nsec; +#endif + + g_task_set_task_data (task, g_steal_pointer (&setup_data_owned), (GDestroyNotify) setup_data_free); + + /* Connect to D-Bus if connections haven’t been provided at construction + * time. */ + if (plugin_loader->session_bus_connection == NULL) + g_bus_get (G_BUS_TYPE_SESSION, cancellable, get_session_bus_cb, g_object_ref (task)); + if (plugin_loader->system_bus_connection == NULL) + g_bus_get (G_BUS_TYPE_SYSTEM, cancellable, get_system_bus_cb, g_object_ref (task)); + + finish_setup_get_bus (task); +} + +static void +get_session_bus_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginLoader *plugin_loader = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + plugin_loader->session_bus_connection = g_bus_get_finish (result, &local_error); + if (plugin_loader->session_bus_connection == NULL) { + notify_setup_complete (plugin_loader); + g_prefix_error_literal (&local_error, "Error getting session bus: "); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_object_notify_by_pspec (G_OBJECT (plugin_loader), obj_props[PROP_SESSION_BUS_CONNECTION]); + + finish_setup_get_bus (task); +} + +static void +get_system_bus_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginLoader *plugin_loader = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + plugin_loader->system_bus_connection = g_bus_get_finish (result, &local_error); + if (plugin_loader->system_bus_connection == NULL) { + notify_setup_complete (plugin_loader); + g_prefix_error_literal (&local_error, "Error getting system bus: "); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_object_notify_by_pspec (G_OBJECT (plugin_loader), obj_props[PROP_SYSTEM_BUS_CONNECTION]); + + finish_setup_get_bus (task); +} + +static void +finish_setup_get_bus (GTask *task) +{ + SetupData *data = g_task_get_task_data (task); + GsPluginLoader *plugin_loader = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + const gchar *plugin_name; + gboolean changes; + GPtrArray *deps; + GsPlugin *dep; + GsPlugin *plugin; + guint dep_loop_check = 0; + guint i; + guint j; + g_autoptr(GPtrArray) locations = NULL; + g_autoptr(GError) local_error = NULL; + + /* Wait until we’ve got all the buses we need. */ + if (plugin_loader->session_bus_connection == NULL || + plugin_loader->system_bus_connection == NULL) + return; + + /* use the default, but this requires a 'make install' */ + if (plugin_loader->locations->len == 0) { + g_autofree gchar *filename = NULL; + filename = g_strdup_printf ("plugins-%s", GS_PLUGIN_API_VERSION); + locations = g_ptr_array_new_with_free_func (g_free); + g_ptr_array_add (locations, g_build_filename (LIBDIR, "gnome-software", filename, NULL)); + } else { + locations = g_ptr_array_ref (plugin_loader->locations); + } + + for (i = 0; i < locations->len; i++) { + GFileMonitor *monitor; + const gchar *location = g_ptr_array_index (locations, i); + g_autoptr(GFile) plugin_dir = g_file_new_for_path (location); + g_debug ("monitoring plugin location %s", location); + monitor = g_file_monitor_directory (plugin_dir, + G_FILE_MONITOR_NONE, + cancellable, + &local_error); + if (monitor == NULL) { + notify_setup_complete (plugin_loader); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_signal_connect (monitor, "changed", + G_CALLBACK (gs_plugin_loader_plugin_dir_changed_cb), plugin_loader); + g_ptr_array_add (plugin_loader->file_monitors, monitor); + } + + /* search for plugins */ + for (i = 0; i < locations->len; i++) { + const gchar *location = g_ptr_array_index (locations, i); + g_autoptr(GPtrArray) fns = NULL; + + /* search in the plugin directory for plugins */ + g_debug ("searching for plugins in %s", location); + fns = gs_plugin_loader_find_plugins (location, &local_error); + if (fns == NULL) { + notify_setup_complete (plugin_loader); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + for (j = 0; j < fns->len; j++) { + const gchar *fn = g_ptr_array_index (fns, j); + gs_plugin_loader_open_plugin (plugin_loader, fn); + } + } + + /* optional allowlist */ + if (data->allowlist != NULL) { + for (i = 0; i < plugin_loader->plugins->len; i++) { + gboolean ret; + plugin = g_ptr_array_index (plugin_loader->plugins, i); + if (!gs_plugin_get_enabled (plugin)) + continue; + ret = g_strv_contains ((const gchar * const *) data->allowlist, + gs_plugin_get_name (plugin)); + if (!ret) { + g_debug ("%s not in allowlist, disabling", + gs_plugin_get_name (plugin)); + } + gs_plugin_set_enabled (plugin, ret); + } + } + + /* optional blocklist */ + if (data->blocklist != NULL) { + for (i = 0; i < plugin_loader->plugins->len; i++) { + gboolean ret; + plugin = g_ptr_array_index (plugin_loader->plugins, i); + if (!gs_plugin_get_enabled (plugin)) + continue; + ret = g_strv_contains ((const gchar * const *) data->blocklist, + gs_plugin_get_name (plugin)); + if (ret) + gs_plugin_set_enabled (plugin, FALSE); + } + } + + /* order by deps */ + do { + changes = FALSE; + for (i = 0; i < plugin_loader->plugins->len; i++) { + plugin = g_ptr_array_index (plugin_loader->plugins, i); + deps = gs_plugin_get_rules (plugin, GS_PLUGIN_RULE_RUN_AFTER); + for (j = 0; j < deps->len && !changes; j++) { + plugin_name = g_ptr_array_index (deps, j); + dep = gs_plugin_loader_find_plugin (plugin_loader, + plugin_name); + if (dep == NULL) { + g_debug ("cannot find plugin '%s' " + "requested by '%s'", + plugin_name, + gs_plugin_get_name (plugin)); + continue; + } + if (!gs_plugin_get_enabled (dep)) + continue; + if (gs_plugin_get_order (plugin) <= gs_plugin_get_order (dep)) { + gs_plugin_set_order (plugin, gs_plugin_get_order (dep) + 1); + changes = TRUE; + } + } + } + for (i = 0; i < plugin_loader->plugins->len; i++) { + plugin = g_ptr_array_index (plugin_loader->plugins, i); + deps = gs_plugin_get_rules (plugin, GS_PLUGIN_RULE_RUN_BEFORE); + for (j = 0; j < deps->len && !changes; j++) { + plugin_name = g_ptr_array_index (deps, j); + dep = gs_plugin_loader_find_plugin (plugin_loader, + plugin_name); + if (dep == NULL) { + g_debug ("cannot find plugin '%s' " + "requested by '%s'", + plugin_name, + gs_plugin_get_name (plugin)); + continue; + } + if (!gs_plugin_get_enabled (dep)) + continue; + if (gs_plugin_get_order (plugin) >= gs_plugin_get_order (dep)) { + gs_plugin_set_order (dep, gs_plugin_get_order (plugin) + 1); + changes = TRUE; + } + } + } + + /* check we're not stuck */ + if (dep_loop_check++ > 100) { + notify_setup_complete (plugin_loader); + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_PLUGIN_DEPSOLVE_FAILED, + "got stuck in dep loop"); + return; + } + } while (changes); + + /* check for conflicts */ + for (i = 0; i < plugin_loader->plugins->len; i++) { + plugin = g_ptr_array_index (plugin_loader->plugins, i); + if (!gs_plugin_get_enabled (plugin)) + continue; + deps = gs_plugin_get_rules (plugin, GS_PLUGIN_RULE_CONFLICTS); + for (j = 0; j < deps->len && !changes; j++) { + plugin_name = g_ptr_array_index (deps, j); + dep = gs_plugin_loader_find_plugin (plugin_loader, + plugin_name); + if (dep == NULL) + continue; + if (!gs_plugin_get_enabled (dep)) + continue; + g_debug ("disabling %s as conflicts with %s", + gs_plugin_get_name (dep), + gs_plugin_get_name (plugin)); + gs_plugin_set_enabled (dep, FALSE); + } + } + + /* sort by order */ + g_ptr_array_sort (plugin_loader->plugins, + gs_plugin_loader_plugin_sort_fn); + + /* assign priority values */ + do { + changes = FALSE; + for (i = 0; i < plugin_loader->plugins->len; i++) { + plugin = g_ptr_array_index (plugin_loader->plugins, i); + deps = gs_plugin_get_rules (plugin, GS_PLUGIN_RULE_BETTER_THAN); + for (j = 0; j < deps->len && !changes; j++) { + plugin_name = g_ptr_array_index (deps, j); + dep = gs_plugin_loader_find_plugin (plugin_loader, + plugin_name); + if (dep == NULL) { + g_debug ("cannot find plugin '%s' " + "requested by '%s'", + plugin_name, + gs_plugin_get_name (plugin)); + continue; + } + if (!gs_plugin_get_enabled (dep)) + continue; + if (gs_plugin_get_priority (plugin) <= gs_plugin_get_priority (dep)) { + gs_plugin_set_priority (plugin, gs_plugin_get_priority (dep) + 1); + changes = TRUE; + } + } + } + + /* check we're not stuck */ + if (dep_loop_check++ > 100) { + notify_setup_complete (plugin_loader); + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_PLUGIN_DEPSOLVE_FAILED, + "got stuck in priority loop"); + return; + } + } while (changes); + + /* run setup */ + data->n_pending = 1; /* incremented until all operations have been started */ +#ifdef HAVE_SYSPROF + data->plugins_begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + for (i = 0; i < plugin_loader->plugins->len; i++) { + plugin = GS_PLUGIN (plugin_loader->plugins->pdata[i]); + + if (!gs_plugin_get_enabled (plugin)) + continue; + + if (GS_PLUGIN_GET_CLASS (plugin)->setup_async != NULL) { + data->n_pending++; + GS_PLUGIN_GET_CLASS (plugin)->setup_async (plugin, cancellable, + plugin_setup_cb, g_object_ref (task)); + } + } + + finish_setup_op (task); +} + +static void +plugin_setup_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; +#ifdef HAVE_SYSPROF + SetupData *data = g_task_get_task_data (task); +#endif + + g_assert (GS_PLUGIN_GET_CLASS (plugin)->setup_finish != NULL); + + if (!GS_PLUGIN_GET_CLASS (plugin)->setup_finish (plugin, result, &local_error)) { + g_debug ("disabling %s as setup failed: %s", + gs_plugin_get_name (plugin), + local_error->message); + gs_plugin_set_enabled (plugin, FALSE); + } + + GS_PROFILER_ADD_MARK (PluginLoader, + data->plugins_begin_time_nsec, + "setup-plugin", NULL); + + /* Indicate this plugin has finished setting up. */ + finish_setup_op (task); +} + +static void +finish_setup_op (GTask *task) +{ + SetupData *data = g_task_get_task_data (task); + GsPluginLoader *plugin_loader = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GsAppList) install_queue = NULL; + g_autoptr(GError) local_error = NULL; + + g_assert (data->n_pending > 0); + data->n_pending--; + + if (data->n_pending > 0) + return; + + /* now we can load the install-queue */ + install_queue = load_install_queue (plugin_loader, &local_error); + if (install_queue == NULL) { + notify_setup_complete (plugin_loader); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Mark setup as complete as it’s now safe for other jobs to be + * processed. Indeed, the final step in setup is to refine the install + * queue apps, which requires @setup_complete to be %TRUE. */ + notify_setup_complete (plugin_loader); + + GS_PROFILER_ADD_MARK (PluginLoader, data->setup_begin_time_nsec, "setup", NULL); + + /* Refine the install queue. */ + if (gs_app_list_length (install_queue) > 0) { + g_autoptr(GsPluginJob) refine_job = NULL; + + /* Require ID and Origin to get complete unique IDs */ + refine_job = gs_plugin_job_refine_new (install_queue, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN | + GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING); + gs_plugin_loader_job_process_async (plugin_loader, refine_job, + cancellable, + finish_setup_install_queue_cb, + g_object_ref (task)); + } else { + g_task_return_boolean (task, TRUE); + } +} + +static void gs_plugin_loader_maybe_flush_pending_install_queue (GsPluginLoader *plugin_loader); + +static void +finish_setup_install_queue_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GsAppList) new_list = NULL; + g_autoptr(GError) local_error = NULL; + + new_list = gs_plugin_loader_job_process_finish (plugin_loader, result, &local_error); + if (new_list == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + g_autoptr(GsAppList) old_pending_apps = NULL; + gboolean has_pending_apps = FALSE; + gboolean changed; + g_mutex_lock (&plugin_loader->pending_apps_mutex); + changed = plugin_loader->pending_apps != NULL; + /* Merge the existing and newly-loaded lists, in case pending apps were added + while the install-queue file was being loaded */ + old_pending_apps = g_steal_pointer (&plugin_loader->pending_apps); + if (old_pending_apps != NULL && gs_app_list_length (new_list) > 0) { + g_autoptr(GHashTable) expected_unique_ids = g_hash_table_new (g_str_hash, g_str_equal); + for (guint i = 0; i < gs_app_list_length (old_pending_apps); i++) { + GsApp *app = gs_app_list_index (old_pending_apps, i); + if (gs_app_get_unique_id (app) != NULL) + g_hash_table_add (expected_unique_ids, (gpointer) gs_app_get_unique_id (app)); + } + for (guint i = 0; i < gs_app_list_length (new_list); i++) { + GsApp *app = gs_app_list_index (new_list, i); + if (gs_app_get_state (app) == GS_APP_STATE_AVAILABLE && + gs_app_get_unique_id (app) != NULL && + g_hash_table_contains (expected_unique_ids, gs_app_get_unique_id (app))) { + if (plugin_loader->pending_apps == NULL) + plugin_loader->pending_apps = gs_app_list_new (); + gs_app_set_state (app, GS_APP_STATE_QUEUED_FOR_INSTALL); + gs_app_set_pending_action (app, GS_PLUGIN_ACTION_INSTALL); + gs_app_list_add (plugin_loader->pending_apps, app); + } + } + has_pending_apps = plugin_loader->pending_apps != NULL; + changed = TRUE; + } + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + g_task_return_boolean (task, TRUE); + + if (changed) + save_install_queue (plugin_loader); + if (has_pending_apps) + gs_plugin_loader_maybe_flush_pending_install_queue (plugin_loader); + } +} + +/** + * gs_plugin_loader_setup_finish: + * @plugin_loader: a #GsPluginLoader + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous setup operation started with + * gs_plugin_loader_setup_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 42 + */ +gboolean +gs_plugin_loader_setup_finish (GsPluginLoader *plugin_loader, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), FALSE); + g_return_val_if_fail (g_task_is_valid (result, plugin_loader), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_plugin_loader_setup_async), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +void +gs_plugin_loader_dump_state (GsPluginLoader *plugin_loader) +{ + g_autoptr(GString) str_enabled = g_string_new (NULL); + g_autoptr(GString) str_disabled = g_string_new (NULL); + + /* print what the priorities are if verbose */ + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i); + GString *str = gs_plugin_get_enabled (plugin) ? str_enabled : str_disabled; + g_string_append_printf (str, "%s, ", gs_plugin_get_name (plugin)); + g_debug ("[%s]\t%u\t->\t%s", + gs_plugin_get_enabled (plugin) ? "enabled" : "disabld", + gs_plugin_get_order (plugin), + gs_plugin_get_name (plugin)); + } + if (str_enabled->len > 2) + g_string_truncate (str_enabled, str_enabled->len - 2); + if (str_disabled->len > 2) + g_string_truncate (str_disabled, str_disabled->len - 2); + g_info ("enabled plugins: %s", str_enabled->str); + g_info ("disabled plugins: %s", str_disabled->str); +} + +static void +gs_plugin_loader_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object); + + switch ((GsPluginLoaderProperty) prop_id) { + case PROP_EVENTS: + g_value_set_pointer (value, plugin_loader->events_by_id); + break; + case PROP_ALLOW_UPDATES: + g_value_set_boolean (value, gs_plugin_loader_get_allow_updates (plugin_loader)); + break; + case PROP_NETWORK_AVAILABLE: + g_value_set_boolean (value, gs_plugin_loader_get_network_available (plugin_loader)); + break; + case PROP_NETWORK_METERED: + g_value_set_boolean (value, gs_plugin_loader_get_network_metered (plugin_loader)); + break; + case PROP_SESSION_BUS_CONNECTION: + g_value_set_object (value, plugin_loader->session_bus_connection); + break; + case PROP_SYSTEM_BUS_CONNECTION: + g_value_set_object (value, plugin_loader->system_bus_connection); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_loader_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object); + + switch ((GsPluginLoaderProperty) prop_id) { + case PROP_EVENTS: + case PROP_ALLOW_UPDATES: + case PROP_NETWORK_AVAILABLE: + case PROP_NETWORK_METERED: + /* Read only */ + g_assert_not_reached (); + break; + case PROP_SESSION_BUS_CONNECTION: + /* Construct only */ + g_assert (plugin_loader->session_bus_connection == NULL); + plugin_loader->session_bus_connection = g_value_dup_object (value); + break; + case PROP_SYSTEM_BUS_CONNECTION: + /* Construct only */ + g_assert (plugin_loader->system_bus_connection == NULL); + plugin_loader->system_bus_connection = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_loader_dispose (GObject *object) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object); + + g_cancellable_cancel (plugin_loader->pending_apps_cancellable); + + if (plugin_loader->plugins != NULL) { + /* Shut down all the plugins first. */ + gs_plugin_loader_shutdown (plugin_loader, NULL); + + g_clear_pointer (&plugin_loader->plugins, g_ptr_array_unref); + } + if (plugin_loader->updates_changed_id != 0) { + g_source_remove (plugin_loader->updates_changed_id); + plugin_loader->updates_changed_id = 0; + } + if (plugin_loader->network_changed_handler != 0) { + g_signal_handler_disconnect (plugin_loader->network_monitor, + plugin_loader->network_changed_handler); + plugin_loader->network_changed_handler = 0; + } + if (plugin_loader->network_available_notify_handler != 0) { + g_signal_handler_disconnect (plugin_loader->network_monitor, + plugin_loader->network_available_notify_handler); + plugin_loader->network_available_notify_handler = 0; + } + if (plugin_loader->network_metered_notify_handler != 0) { + g_signal_handler_disconnect (plugin_loader->network_monitor, + plugin_loader->network_metered_notify_handler); + plugin_loader->network_metered_notify_handler = 0; + } + if (plugin_loader->queued_ops_pool != NULL) { + /* stop accepting more requests and wait until any currently + * running ones are finished */ + g_thread_pool_free (plugin_loader->queued_ops_pool, TRUE, TRUE); + plugin_loader->queued_ops_pool = NULL; + } + g_clear_object (&plugin_loader->network_monitor); + g_clear_object (&plugin_loader->power_profile_monitor); + g_clear_object (&plugin_loader->settings); + g_clear_object (&plugin_loader->pending_apps); + g_clear_object (&plugin_loader->job_manager); + g_clear_object (&plugin_loader->category_manager); + g_clear_object (&plugin_loader->odrs_provider); + g_clear_object (&plugin_loader->setup_complete_cancellable); + g_clear_object (&plugin_loader->pending_apps_cancellable); + + g_clear_object (&plugin_loader->session_bus_connection); + g_clear_object (&plugin_loader->system_bus_connection); + + G_OBJECT_CLASS (gs_plugin_loader_parent_class)->dispose (object); +} + +static void +gs_plugin_loader_finalize (GObject *object) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object); + + g_thread_pool_free (plugin_loader->old_api_thread_pool, TRUE, FALSE); + plugin_loader->old_api_thread_pool = NULL; + + g_strfreev (plugin_loader->compatible_projects); + g_ptr_array_unref (plugin_loader->locations); + g_free (plugin_loader->language); + g_ptr_array_unref (plugin_loader->file_monitors); + g_hash_table_unref (plugin_loader->events_by_id); + g_hash_table_unref (plugin_loader->disallow_updates); + + g_mutex_clear (&plugin_loader->pending_apps_mutex); + g_mutex_clear (&plugin_loader->events_by_id_mutex); + + G_OBJECT_CLASS (gs_plugin_loader_parent_class)->finalize (object); +} + +static void +gs_plugin_loader_class_init (GsPluginLoaderClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gs_plugin_loader_get_property; + object_class->set_property = gs_plugin_loader_set_property; + object_class->dispose = gs_plugin_loader_dispose; + object_class->finalize = gs_plugin_loader_finalize; + + /** + * GsPluginLoader:events: + * + * Events added on the plugin loader using gs_plugin_loader_add_event(). + */ + obj_props[PROP_EVENTS] = + g_param_spec_string ("events", NULL, NULL, + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginLoader:allow-updates: + * + * Whether updates and upgrades are managed by gnome-software. + * + * If not, the updates UI should be hidden and no automatic updates + * performed. + */ + obj_props[PROP_ALLOW_UPDATES] = + g_param_spec_boolean ("allow-updates", NULL, NULL, + TRUE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginLoader:network-available: + * + * Whether the network is considered available. + * + * This has the same semantics as #GNetworkMonitor:network-available. + */ + obj_props[PROP_NETWORK_AVAILABLE] = + g_param_spec_boolean ("network-available", NULL, NULL, + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginLoader:network-metered: + * + * Whether the network is considered metered. + * + * This has the same semantics as #GNetworkMonitor:network-metered. + */ + obj_props[PROP_NETWORK_METERED] = + g_param_spec_boolean ("network-metered", NULL, NULL, + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginLoader:session-bus-connection: (nullable) + * + * A connection to the D-Bus session bus. + * + * This may be %NULL at construction time. If so, the default session + * bus connection will be used (and returned as the value of this + * property) after gs_plugin_loader_setup_async() is called. + * + * Since: 43 + */ + obj_props[PROP_SESSION_BUS_CONNECTION] = + g_param_spec_object ("session-bus-connection", NULL, NULL, + G_TYPE_DBUS_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPluginLoader:system-bus-connection: (not nullable) + * + * A connection to the D-Bus system bus. + * + * This may be %NULL at construction time. If so, the default system + * bus connection will be used (and returned as the value of this + * property) after gs_plugin_loader_setup_async() is called. + * + * Since: 43 + */ + obj_props[PROP_SYSTEM_BUS_CONNECTION] = + g_param_spec_object ("system-bus-connection", NULL, NULL, + G_TYPE_DBUS_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + signals [SIGNAL_STATUS_CHANGED] = + g_signal_new ("status-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_UINT); + signals [SIGNAL_PENDING_APPS_CHANGED] = + g_signal_new ("pending-apps-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals [SIGNAL_UPDATES_CHANGED] = + g_signal_new ("updates-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals [SIGNAL_RELOAD] = + g_signal_new ("reload", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals [SIGNAL_BASIC_AUTH_START] = + g_signal_new ("basic-auth-start", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER); + signals [SIGNAL_ASK_UNTRUSTED] = + g_signal_new ("ask-untrusted", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); +} + +static void +gs_plugin_loader_allow_updates_recheck (GsPluginLoader *plugin_loader) +{ + gboolean changed; + + if (g_settings_get_boolean (plugin_loader->settings, "allow-updates")) { + changed = g_hash_table_remove (plugin_loader->disallow_updates, plugin_loader); + } else { + changed = g_hash_table_insert (plugin_loader->disallow_updates, + (gpointer) plugin_loader, + (gpointer) "GSettings"); + } + + if (changed) + g_object_notify_by_pspec (G_OBJECT (plugin_loader), obj_props[PROP_ALLOW_UPDATES]); +} + +static void +gs_plugin_loader_settings_changed_cb (GSettings *settings, + const gchar *key, + GsPluginLoader *plugin_loader) +{ + if (g_strcmp0 (key, "allow-updates") == 0) + gs_plugin_loader_allow_updates_recheck (plugin_loader); +} + +static gint +get_max_parallel_ops (void) +{ + guint mem_total = gs_utils_get_memory_total (); + if (mem_total == 0) + return 8; + /* allow 1 op per GB of memory */ + return (gint) MAX (round((gdouble) mem_total / 1024), 1.0); +} + +static void +gs_plugin_loader_init (GsPluginLoader *plugin_loader) +{ + const gchar *tmp; + gchar *match; + gchar **projects; + guint i; + g_autofree gchar *review_server = NULL; + g_autofree gchar *user_hash = NULL; + g_autoptr(GError) local_error = NULL; + const guint64 odrs_review_max_cache_age_secs = 237000; /* 1 week */ + const guint odrs_review_n_results_max = 50; + const gchar *locale; + + plugin_loader->setup_complete_cancellable = g_cancellable_new (); + plugin_loader->scale = 1; + plugin_loader->plugins = g_ptr_array_new_with_free_func (g_object_unref); + plugin_loader->pending_apps = NULL; + plugin_loader->queued_ops_pool = g_thread_pool_new (gs_plugin_loader_process_in_thread_pool_cb, + plugin_loader, + get_max_parallel_ops (), + FALSE, + NULL); + plugin_loader->file_monitors = g_ptr_array_new_with_free_func (g_object_unref); + plugin_loader->locations = g_ptr_array_new_with_free_func (g_free); + plugin_loader->settings = g_settings_new ("org.gnome.software"); + g_signal_connect (plugin_loader->settings, "changed", + G_CALLBACK (gs_plugin_loader_settings_changed_cb), plugin_loader); + plugin_loader->events_by_id = g_hash_table_new_full ((GHashFunc) as_utils_data_id_hash, + (GEqualFunc) as_utils_data_id_equal, + g_free, + (GDestroyNotify) g_object_unref); + + /* Set up a thread pool for running old-style jobs + * FIXME: This will eventually disappear when all jobs are ported to + * be subclasses of #GsPluginJob. */ + plugin_loader->old_api_thread_pool = g_thread_pool_new_full (gs_plugin_loader_process_old_api_job_cb, + plugin_loader, + (GDestroyNotify) g_object_unref, + 20, + FALSE, + NULL); + + /* get the job manager */ + plugin_loader->job_manager = gs_job_manager_new (); + + /* get the category manager */ + plugin_loader->category_manager = gs_category_manager_new (); + + /* set up the ODRS provider */ + + /* get the machine+user ID hash value */ + user_hash = gs_utils_get_user_hash (&local_error); + if (user_hash == NULL) { + g_warning ("Failed to get machine+user hash: %s", local_error->message); + plugin_loader->odrs_provider = NULL; + } else { + review_server = g_settings_get_string (plugin_loader->settings, "review-server"); + + if (review_server != NULL && *review_server != '\0') { + const gchar *distro = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + g_autoptr(SoupSession) odrs_soup_session = NULL; + + /* get the distro name (e.g. 'Fedora') but allow a fallback */ + os_release = gs_os_release_new (&local_error); + if (os_release != NULL) { + distro = gs_os_release_get_name (os_release); + if (distro == NULL) + g_warning ("no distro name specified"); + } else { + g_warning ("failed to get distro name: %s", local_error->message); + } + + /* Fallback */ + if (distro == NULL) + distro = C_("Distribution name", "Unknown"); + + odrs_soup_session = gs_build_soup_session (); + plugin_loader->odrs_provider = gs_odrs_provider_new (review_server, + user_hash, + distro, + odrs_review_max_cache_age_secs, + odrs_review_n_results_max, + odrs_soup_session); + } + } + + /* the settings key sets the initial override */ + plugin_loader->disallow_updates = g_hash_table_new (g_direct_hash, g_direct_equal); + gs_plugin_loader_allow_updates_recheck (plugin_loader); + + /* get the language from the locale (i.e. strip the territory, codeset + * and modifier) */ + locale = setlocale (LC_MESSAGES, NULL); + plugin_loader->language = g_strdup (locale); + match = strpbrk (plugin_loader->language, "._@"); + if (match != NULL) + *match = '\0'; + + g_debug ("Using locale = %s, language = %s", locale, plugin_loader->language); + + g_mutex_init (&plugin_loader->pending_apps_mutex); + g_mutex_init (&plugin_loader->events_by_id_mutex); + + /* monitor the network as the many UI operations need the network */ + gs_plugin_loader_monitor_network (plugin_loader); + + plugin_loader->power_profile_monitor = g_power_profile_monitor_dup_default (); + + /* by default we only show project-less apps or compatible projects */ + tmp = g_getenv ("GNOME_SOFTWARE_COMPATIBLE_PROJECTS"); + if (tmp == NULL) { + projects = g_settings_get_strv (plugin_loader->settings, + "compatible-projects"); + } else { + projects = g_strsplit (tmp, ",", -1); + } + for (i = 0; projects[i] != NULL; i++) + g_debug ("compatible-project: %s", projects[i]); + plugin_loader->compatible_projects = projects; +} + +/** + * gs_plugin_loader_new: + * @session_bus_connection: (nullable) (transfer none): a D-Bus session bus + * connection to use, or %NULL to use the default + * @system_bus_connection: (nullable) (transfer none): a D-Bus system bus + * connection to use, or %NULL to use the default + * + * Create a new #GsPluginLoader. + * + * The D-Bus connection arguments should typically be %NULL, and only be + * non-%NULL when doing unit tests. + * + * Return value: (transfer full) (not nullable): a new #GsPluginLoader + * Since: 43 + **/ +GsPluginLoader * +gs_plugin_loader_new (GDBusConnection *session_bus_connection, + GDBusConnection *system_bus_connection) +{ + g_return_val_if_fail (session_bus_connection == NULL || G_IS_DBUS_CONNECTION (session_bus_connection), NULL); + g_return_val_if_fail (system_bus_connection == NULL || G_IS_DBUS_CONNECTION (system_bus_connection), NULL); + + return g_object_new (GS_TYPE_PLUGIN_LOADER, + "session-bus-connection", session_bus_connection, + "system-bus-connection", system_bus_connection, + NULL); +} + +static void +gs_plugin_loader_apps_installed_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) apps = GS_APP_LIST (user_data); + + ret = gs_plugin_loader_job_action_finish (plugin_loader, + res, + &error); + remove_apps_from_install_queue (plugin_loader, apps); + if (!ret) { + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + gs_app_set_state_recover (app); + g_warning ("failed to install %s: %s", + gs_app_get_unique_id (app), error->message); + } + } +} + +gboolean +gs_plugin_loader_get_network_available (GsPluginLoader *plugin_loader) +{ + if (plugin_loader->network_monitor == NULL) { + g_debug ("no network monitor, so returning network-available=TRUE"); + return TRUE; + } + return g_network_monitor_get_network_available (plugin_loader->network_monitor); +} + +gboolean +gs_plugin_loader_get_network_metered (GsPluginLoader *plugin_loader) +{ + if (plugin_loader->network_monitor == NULL) { + g_debug ("no network monitor, so returning network-metered=FALSE"); + return FALSE; + } + return g_network_monitor_get_network_metered (plugin_loader->network_monitor); +} + +gboolean +gs_plugin_loader_get_power_saver (GsPluginLoader *plugin_loader) +{ + return plugin_loader->power_profile_monitor != NULL && + g_power_profile_monitor_get_power_saver_enabled (plugin_loader->power_profile_monitor); +} + +gboolean +gs_plugin_loader_get_game_mode (GsPluginLoader *plugin_loader) +{ + g_autoptr(GDBusProxy) proxy = NULL; + g_autoptr(GVariant) val = NULL; + + /* This supports https://github.com/FeralInteractive/gamemode ; + it's okay when it's not installed, nor running. */ + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START | +#if GLIB_CHECK_VERSION(2, 72, 0) + G_DBUS_PROXY_FLAGS_NO_MATCH_RULE | +#endif + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "com.feralinteractive.GameMode", + "/com/feralinteractive/GameMode", + "com.feralinteractive.GameMode", + NULL, + NULL); + if (proxy == NULL) + return FALSE; + + val = g_dbus_proxy_get_cached_property (proxy, "ClientCount"); + if (val != NULL) + return g_variant_get_int32 (val) > 0; + + return FALSE; +} + +static void +gs_plugin_loader_pending_apps_refined_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + g_autoptr(GsAppList) old_queue = GS_APP_LIST (user_data); + g_autoptr(GsAppList) refined_queue = NULL; + g_autoptr(GsAppList) to_remove = NULL; + g_autoptr(GsAppList) to_install = NULL; + g_autoptr(GError) error = NULL; + + refined_queue = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + + if (refined_queue == NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_debug ("failed to refine pending apps: %s", error->message); + + g_mutex_lock (&plugin_loader->pending_apps_mutex); + g_clear_object (&plugin_loader->pending_apps); + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + + save_install_queue (plugin_loader); + } + return; + } + + /* Remove no-longer-queued apps */ + to_remove = gs_app_list_new (); + + for (guint i = 0; i < gs_app_list_length (old_queue); i++) { + GsApp *app = gs_app_list_index (old_queue, i); + + if (gs_app_get_unique_id (app) == NULL || + gs_app_list_lookup (refined_queue, gs_app_get_unique_id (app)) == NULL) + gs_app_list_add (to_remove, app); + } + + if (gs_app_list_length (to_remove) > 0) + remove_apps_from_install_queue (plugin_loader, to_remove); + + /* Install apps */ + to_install = gs_app_list_new (); + + for (guint i = 0; i < gs_app_list_length (refined_queue); i++) { + GsApp *app = gs_app_list_index (refined_queue, i); + + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppList) single_element_app_list = gs_app_list_new (); + gs_app_list_add (single_element_app_list, app); + + plugin_job = gs_plugin_job_manage_repository_new (app, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE | + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL); + gs_plugin_loader_job_process_async (plugin_loader, plugin_job, + plugin_loader->pending_apps_cancellable, + gs_plugin_loader_apps_installed_cb, + g_steal_pointer (&single_element_app_list)); + } else { + gs_app_list_add (to_install, app); + } + } + + if (gs_app_list_length (to_install) > 0) { + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* The 'interactive' is needed for credentials prompt, otherwise it just fails */ + plugin_job = gs_plugin_job_install_apps_new (to_install, + GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (plugin_loader, plugin_job, + plugin_loader->pending_apps_cancellable, + gs_plugin_loader_apps_installed_cb, + g_steal_pointer (&to_install)); + } + + g_clear_object (&plugin_loader->pending_apps_cancellable); +} + +static void +gs_plugin_loader_maybe_flush_pending_install_queue (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppList) obsolete = NULL; + g_autoptr(GsAppList) queue = NULL; + + if (!gs_plugin_loader_get_network_available (plugin_loader) || + gs_plugin_loader_get_network_metered (plugin_loader)) { + /* Print the debug message only when had anything to skip */ + g_mutex_lock (&plugin_loader->pending_apps_mutex); + if (plugin_loader->pending_apps != NULL) { + g_debug ("Cannot flush pending install queue, because is %sonline and is %smetered", + !gs_plugin_loader_get_network_available (plugin_loader) ? "not " : "", + gs_plugin_loader_get_network_metered (plugin_loader) ? "" : "not "); + } + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + return; + } + + /* Already flushing pending queue */ + if (plugin_loader->pending_apps_cancellable) + return; + + queue = gs_app_list_new (); + obsolete = gs_app_list_new (); + g_mutex_lock (&plugin_loader->pending_apps_mutex); + for (guint i = 0; plugin_loader->pending_apps != NULL && i < gs_app_list_length (plugin_loader->pending_apps); i++) { + GsApp *app = gs_app_list_index (plugin_loader->pending_apps, i); + if (gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL) { + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_list_add (queue, app); + } else { + gs_app_list_add (obsolete, app); + } + } + g_mutex_unlock (&plugin_loader->pending_apps_mutex); + + if (gs_app_list_length (obsolete) > 0) + remove_apps_from_install_queue (plugin_loader, obsolete); + + plugin_loader->pending_apps_cancellable = g_cancellable_new (); + + plugin_job = gs_plugin_job_refine_new (queue, GS_PLUGIN_REFINE_FLAGS_NONE); + gs_plugin_loader_job_process_async (plugin_loader, plugin_job, + plugin_loader->pending_apps_cancellable, + gs_plugin_loader_pending_apps_refined_cb, + g_steal_pointer (&queue)); +} + +static void +gs_plugin_loader_network_changed_cb (GNetworkMonitor *monitor, + gboolean available, + GsPluginLoader *plugin_loader) +{ + gboolean metered = g_network_monitor_get_network_metered (plugin_loader->network_monitor); + + g_debug ("network status change: %s [%s]", + available ? "online" : "offline", + metered ? "metered" : "unmetered"); + + g_object_notify_by_pspec (G_OBJECT (plugin_loader), obj_props[PROP_NETWORK_AVAILABLE]); + g_object_notify_by_pspec (G_OBJECT (plugin_loader), obj_props[PROP_NETWORK_METERED]); + + gs_plugin_loader_maybe_flush_pending_install_queue (plugin_loader); +} + +static void +gs_plugin_loader_network_available_notify_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GNetworkMonitor *monitor = G_NETWORK_MONITOR (obj); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (user_data); + + gs_plugin_loader_network_changed_cb (monitor, g_network_monitor_get_network_available (monitor), plugin_loader); +} + +static void +gs_plugin_loader_network_metered_notify_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GNetworkMonitor *monitor = G_NETWORK_MONITOR (obj); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (user_data); + + gs_plugin_loader_network_changed_cb (monitor, g_network_monitor_get_network_available (monitor), plugin_loader); +} + +static void +gs_plugin_loader_monitor_network (GsPluginLoader *plugin_loader) +{ + GNetworkMonitor *network_monitor; + + network_monitor = g_network_monitor_get_default (); + if (network_monitor == NULL || plugin_loader->network_changed_handler != 0) + return; + plugin_loader->network_monitor = g_object_ref (network_monitor); + + plugin_loader->network_changed_handler = + g_signal_connect (plugin_loader->network_monitor, "network-changed", + G_CALLBACK (gs_plugin_loader_network_changed_cb), plugin_loader); + plugin_loader->network_available_notify_handler = + g_signal_connect (plugin_loader->network_monitor, "notify::network-available", + G_CALLBACK (gs_plugin_loader_network_available_notify_cb), plugin_loader); + plugin_loader->network_metered_notify_handler = + g_signal_connect (plugin_loader->network_monitor, "notify::network-metered", + G_CALLBACK (gs_plugin_loader_network_metered_notify_cb), plugin_loader); + + gs_plugin_loader_network_changed_cb (plugin_loader->network_monitor, + g_network_monitor_get_network_available (plugin_loader->network_monitor), + plugin_loader); +} + +/******************************************************************************/ + +static void +gs_plugin_loader_inherit_list_props (GsAppList *des_list, + GsAppList *src_list) +{ + if (gs_app_list_has_flag (src_list, GS_APP_LIST_FLAG_IS_TRUNCATED)) + gs_app_list_add_flag (des_list, GS_APP_LIST_FLAG_IS_TRUNCATED); + + gs_app_list_set_size_peak (des_list, gs_app_list_get_size_peak (src_list)); +} + +static void +gs_plugin_loader_process_old_api_job_cb (gpointer task_data, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&task_data); + GError *error = NULL; + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginLoaderHelper *helper = (GsPluginLoaderHelper *) g_task_get_task_data (task); + GsAppListFilterFlags dedupe_flags; + g_autoptr(GsAppList) list = g_object_ref (gs_plugin_job_get_list (helper->plugin_job)); + GsPluginAction action = gs_plugin_job_get_action (helper->plugin_job); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (user_data); + g_autoptr(GMainContext) context = g_main_context_new (); + g_autoptr(GMainContextPusher) pusher = g_main_context_pusher_new (context); + g_autofree gchar *sysprof_name = NULL; + g_autofree gchar *sysprof_message = NULL; + g_autofree gchar *job_debug = NULL; + + sysprof_name = g_strconcat ("process-thread:", gs_plugin_action_to_string (action), NULL); + sysprof_message = gs_plugin_job_to_string (helper->plugin_job); + + GS_PROFILER_BEGIN_SCOPED (PluginLoader, sysprof_name, sysprof_message); + + /* run each plugin */ + if (!GS_IS_PLUGIN_JOB_REFINE (helper->plugin_job)) { + if (!gs_plugin_loader_run_results (helper, cancellable, &error)) { + gs_utils_error_convert_gio (&error); + g_task_return_error (task, error); + gs_job_manager_remove_job (plugin_loader->job_manager, helper->plugin_job); + return; + } + } + + if (!helper->anything_ran && !GS_IS_PLUGIN_JOB_REFINE (helper->plugin_job)) { + g_debug ("no plugin could handle %s", + gs_plugin_action_to_string (action)); + } + + /* filter to reduce to a sane set */ + gs_plugin_loader_job_sorted_truncation (helper->plugin_job, list); + + /* run refine() on each one if required */ + if (gs_plugin_job_get_refine_flags (helper->plugin_job) != 0 && + list != NULL && + gs_app_list_length (list) > 0) { + g_autoptr(GsPluginJob) refine_job = NULL; + g_autoptr(GAsyncResult) refine_result = NULL; + g_autoptr(GsAppList) new_list = NULL; + + refine_job = gs_plugin_job_refine_new (list, gs_plugin_job_get_refine_flags (helper->plugin_job) | GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING); + gs_plugin_loader_job_process_async (plugin_loader, refine_job, + cancellable, + async_result_cb, + &refine_result); + + /* FIXME: Make this sync until the enclosing function is + * refactored to be async. */ + while (refine_result == NULL) + g_main_context_iteration (g_main_context_get_thread_default (), TRUE); + + new_list = gs_plugin_loader_job_process_finish (plugin_loader, refine_result, &error); + if (new_list == NULL) { + gs_utils_error_convert_gio (&error); + g_task_return_error (task, g_steal_pointer (&error)); + gs_job_manager_remove_job (plugin_loader->job_manager, helper->plugin_job); + return; + } + + gs_plugin_loader_inherit_list_props (new_list, list); + + /* Update the app list in case the refine resolved any wildcards. */ + g_set_object (&list, new_list); + } else { + g_debug ("no refine flags set for transaction"); + } + + /* filter duplicates with priority, taking into account the source name + * & version, so we combine available updates with the installed app */ + dedupe_flags = gs_plugin_job_get_dedupe_flags (helper->plugin_job); + if (dedupe_flags != GS_APP_LIST_FILTER_FLAG_NONE) + gs_app_list_filter_duplicates (list, dedupe_flags); + + GS_PROFILER_END_SCOPED (PluginLoader); + + /* show elapsed time */ + job_debug = gs_plugin_job_to_string (helper->plugin_job); + g_debug ("%s", job_debug); + + /* success */ + g_task_return_pointer (task, g_object_ref (list), (GDestroyNotify) g_object_unref); + gs_job_manager_remove_job (plugin_loader->job_manager, helper->plugin_job); +} + +static void +gs_plugin_loader_process_in_thread_pool_cb (gpointer data, + gpointer user_data) +{ + GTask *task = data; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (user_data); + GsPluginLoaderHelper *helper = g_task_get_task_data (task); + GsApp *app = gs_plugin_job_get_app (helper->plugin_job); + GsPluginAction action = gs_plugin_job_get_action (helper->plugin_job); + + gs_ioprio_set (G_PRIORITY_LOW); + + gs_plugin_loader_process_old_api_job_cb (g_object_ref (task), plugin_loader); + + /* Clear any pending action set in gs_plugin_loader_schedule_task() */ + if (app != NULL && gs_app_get_pending_action (app) == action) + gs_app_set_pending_action (app, GS_PLUGIN_ACTION_UNKNOWN); + + g_object_unref (task); +} + +static void +gs_plugin_loader_cancelled_cb (GCancellable *cancellable, + gpointer user_data) +{ + GCancellable *child_cancellable = G_CANCELLABLE (user_data); + + /* just proxy this forward */ + g_debug ("Cancelling job with cancellable %p", child_cancellable); + g_cancellable_cancel (child_cancellable); +} + +static void +gs_plugin_loader_schedule_task (GsPluginLoader *plugin_loader, + GTask *task) +{ + GsPluginLoaderHelper *helper = g_task_get_task_data (task); + GsApp *app = gs_plugin_job_get_app (helper->plugin_job); + + if (app != NULL) { + /* set the pending-action to the app */ + GsPluginAction action = gs_plugin_job_get_action (helper->plugin_job); + gs_app_set_pending_action (app, action); + } + g_thread_pool_push (plugin_loader->queued_ops_pool, g_object_ref (task), NULL); +} + +static void +run_job_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginJob *plugin_job = GS_PLUGIN_JOB (source_object); + GsPluginJobClass *job_class; + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (g_task_get_source_object (task)); + g_autoptr(GError) local_error = NULL; + + GS_PROFILER_ADD_MARK_TAKE (PluginLoader, + GPOINTER_TO_SIZE (g_task_get_task_data (task)), + g_strdup_printf ("process-thread:%s", G_OBJECT_TYPE_NAME (plugin_job)), + gs_plugin_job_to_string (plugin_job)); + + /* FIXME: This will eventually go away when + * gs_plugin_loader_job_process_finish() is removed. */ + job_class = GS_PLUGIN_JOB_GET_CLASS (plugin_job); + + g_assert (job_class->run_finish != NULL); + + if (!job_class->run_finish (plugin_job, result, &local_error)) { + if (GS_IS_PLUGIN_JOB_INSTALL_APPS (plugin_job) || + GS_IS_PLUGIN_JOB_UNINSTALL_APPS (plugin_job)) + gs_plugin_loader_pending_apps_remove (plugin_loader, plugin_job); + + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (GS_IS_PLUGIN_JOB_REFINE (plugin_job)) { + GsAppList *list = gs_plugin_job_refine_get_result_list (GS_PLUGIN_JOB_REFINE (plugin_job)); + g_task_return_pointer (task, g_object_ref (list), (GDestroyNotify) g_object_unref); + return; + } else if (GS_IS_PLUGIN_JOB_LIST_APPS (plugin_job)) { + GsAppList *list = gs_plugin_job_list_apps_get_result_list (GS_PLUGIN_JOB_LIST_APPS (plugin_job)); + g_task_return_pointer (task, g_object_ref (list), (GDestroyNotify) g_object_unref); + return; + } else if (GS_IS_PLUGIN_JOB_LIST_DISTRO_UPGRADES (plugin_job)) { + GsAppList *list = gs_plugin_job_list_distro_upgrades_get_result_list (GS_PLUGIN_JOB_LIST_DISTRO_UPGRADES (plugin_job)); + g_task_return_pointer (task, g_object_ref (list), (GDestroyNotify) g_object_unref); + return; + } else if (GS_IS_PLUGIN_JOB_FILE_TO_APP (plugin_job)) { + GsAppList *list = gs_plugin_job_file_to_app_get_result_list (GS_PLUGIN_JOB_FILE_TO_APP (plugin_job)); + g_task_return_pointer (task, g_object_ref (list), (GDestroyNotify) g_object_unref); + return; + } else if (GS_IS_PLUGIN_JOB_URL_TO_APP (plugin_job)) { + GsAppList *list = gs_plugin_job_url_to_app_get_result_list (GS_PLUGIN_JOB_URL_TO_APP (plugin_job)); + g_task_return_pointer (task, g_object_ref (list), (GDestroyNotify) g_object_unref); + return; + } else if (GS_IS_PLUGIN_JOB_REFRESH_METADATA (plugin_job)) { + /* FIXME: For some reason, existing callers of refresh jobs + * expect a #GsAppList instance back, even though it’s empty and + * they don’t use its contents. It’s just used to distinguish + * against returning an error. This will go away when + * job_process_async() does. */ + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } else if (GS_IS_PLUGIN_JOB_INSTALL_APPS (plugin_job) || + GS_IS_PLUGIN_JOB_UNINSTALL_APPS (plugin_job)) { + /* add apps to the pending installation queue if necessary */ + GsAppList *apps = NULL; + + if (GS_IS_PLUGIN_JOB_INSTALL_APPS (plugin_job)) + apps = gs_plugin_job_install_apps_get_apps (GS_PLUGIN_JOB_INSTALL_APPS (plugin_job)); + else + apps = gs_plugin_job_uninstall_apps_get_apps (GS_PLUGIN_JOB_UNINSTALL_APPS (plugin_job)); + + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + + if (gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL) { + add_app_to_install_queue (plugin_loader, app); + } else { + /* The plugin can left the app queued for install when there is no network available, + in which case the app cannot be removed from the install queue. */ + g_autoptr(GsAppList) addons = NULL; + + gs_plugin_loader_pending_apps_remove (plugin_loader, plugin_job); + + /* unstage addons */ + addons = gs_app_dup_addons (app); + for (guint j = 0; addons != NULL && j < gs_app_list_length (addons); j++) { + GsApp *addon = gs_app_list_index (addons, j); + if (gs_app_get_to_be_installed (addon)) + gs_app_set_to_be_installed (addon, FALSE); + } + } + } + + /* FIXME: The gs_plugin_loader_job_action_finish() expects a #GsAppList + * pointer on success, thus return it. */ + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } else if (GS_IS_PLUGIN_JOB_MANAGE_REPOSITORY (plugin_job) || + GS_IS_PLUGIN_JOB_LIST_CATEGORIES (plugin_job) || + GS_IS_PLUGIN_JOB_UPDATE_APPS (plugin_job) || + GS_IS_PLUGIN_JOB_CANCEL_OFFLINE_UPDATE (plugin_job) || + GS_IS_PLUGIN_JOB_DOWNLOAD_UPGRADE (plugin_job) || + GS_IS_PLUGIN_JOB_TRIGGER_UPGRADE (plugin_job) || + GS_IS_PLUGIN_JOB_LAUNCH (plugin_job)) { + /* FIXME: The gs_plugin_loader_job_action_finish() expects a #GsAppList + * pointer on success, thus return it. */ + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } + + g_assert_not_reached (); +} + +typedef struct { + GWeakRef parent_cancellable_weak; + gulong handler_id; +} CancellableData; + +static void +cancellable_data_free (CancellableData *data) +{ + g_autoptr(GCancellable) parent_cancellable = g_weak_ref_get (&data->parent_cancellable_weak); + + if (parent_cancellable != NULL) + g_cancellable_disconnect (parent_cancellable, data->handler_id); + + g_weak_ref_clear (&data->parent_cancellable_weak); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (CancellableData, cancellable_data_free) + +static void +plugin_loader_task_freed_cb (gpointer user_data, + GObject *freed_object) +{ + g_autoptr(GsPluginLoader) plugin_loader = user_data; + if (g_atomic_int_dec_and_test (&plugin_loader->active_jobs)) { + /* if the plugin used updates-changed during its job, actually schedule + * the signal emission now */ + if (plugin_loader->updates_changed_cnt > 0) + gs_plugin_loader_updates_changed (plugin_loader); + } +} + +static gboolean job_process_setup_complete_cb (GCancellable *cancellable, + gpointer user_data); +static void job_process_cb (GTask *task); + +/** + * gs_plugin_loader_job_process_async: + * @plugin_loader: A #GsPluginLoader + * @plugin_job: job to process + * @cancellable: a #GCancellable, or %NULL + * @callback: function to call when complete + * @user_data: user data to pass to @callback + * + * This method calls all plugins. + * + * If the #GsPluginLoader is still being set up, this function will wait until + * setup is complete before running. + **/ +void +gs_plugin_loader_job_process_async (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginJobClass *job_class; + GsPluginAction action; + g_autoptr(GTask) task = NULL; + g_autoptr(GCancellable) cancellable_job = NULL; + g_autofree gchar *task_name = NULL; + + g_return_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader)); + g_return_if_fail (GS_IS_PLUGIN_JOB (plugin_job)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + job_class = GS_PLUGIN_JOB_GET_CLASS (plugin_job); + action = gs_plugin_job_get_action (plugin_job); + + if (job_class->run_async != NULL) { + task_name = g_strdup_printf ("%s %s", G_STRFUNC, G_OBJECT_TYPE_NAME (plugin_job)); + cancellable_job = (cancellable != NULL) ? g_object_ref (cancellable) : NULL; + } else { + task_name = g_strdup_printf ("%s %s", G_STRFUNC, gs_plugin_action_to_string (action)); + cancellable_job = g_cancellable_new (); + + /* Old-style jobs always have a valid cancellable, so proxy the caller */ + g_debug ("Chaining cancellation from %p to %p", cancellable, cancellable_job); + if (cancellable != NULL) { + g_autoptr(CancellableData) cancellable_data = NULL; + + cancellable_data = g_new0 (CancellableData, 1); + g_weak_ref_init (&cancellable_data->parent_cancellable_weak, cancellable); + cancellable_data->handler_id = g_cancellable_connect (cancellable, + G_CALLBACK (gs_plugin_loader_cancelled_cb), + cancellable_job, NULL); + + g_object_set_data_full (G_OBJECT (cancellable_job), + "gs-cancellable-chain", + g_steal_pointer (&cancellable_data), + (GDestroyNotify) cancellable_data_free); + } + } + + gs_job_manager_add_job (plugin_loader->job_manager, plugin_job); + + task = g_task_new (plugin_loader, cancellable_job, callback, user_data); + g_task_set_name (task, task_name); + g_task_set_task_data (task, g_object_ref (plugin_job), (GDestroyNotify) g_object_unref); + + g_atomic_int_inc (&plugin_loader->active_jobs); + g_object_weak_ref (G_OBJECT (task), + plugin_loader_task_freed_cb, g_object_ref (plugin_loader)); + + /* Wait until the plugin has finished setting up. + * + * Do this using a #GCancellable. While we’re not using the #GCancellable + * to cancel anything, it is a reliable way to signal between threads + * without polling, waking up all waiting #GMainContexts when it’s + * ‘cancelled’. */ + if (plugin_loader->setup_complete) { + job_process_cb (task); + } else { + g_autoptr(GSource) cancellable_source = g_cancellable_source_new (plugin_loader->setup_complete_cancellable); + g_task_attach_source (task, cancellable_source, G_SOURCE_FUNC (job_process_setup_complete_cb)); + } +} + +static gboolean +job_process_setup_complete_cb (GCancellable *cancellable, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + + job_process_cb (task); + + return G_SOURCE_REMOVE; +} + +static void +job_process_cb (GTask *task) +{ + g_autoptr(GsPluginJob) plugin_job = g_object_ref (g_task_get_task_data (task)); + GsPluginLoader *plugin_loader = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginJobClass *job_class; + GsPluginAction action; + GsPluginLoaderHelper *helper; + + job_class = GS_PLUGIN_JOB_GET_CLASS (plugin_job); + action = gs_plugin_job_get_action (plugin_job); + + gs_plugin_job_set_cancellable (plugin_job, cancellable); + + /* If the job provides a more specific async run function, use that. + * + * FIXME: This will eventually go away when + * gs_plugin_loader_job_process_async() is removed. */ + + if (job_class->run_async != NULL) { +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec G_GNUC_UNUSED = SYSPROF_CAPTURE_CURRENT_TIME; + + g_task_set_task_data (task, GSIZE_TO_POINTER (begin_time_nsec), NULL); +#endif + + /* these change the pending count on the installed panel */ + if (GS_IS_PLUGIN_JOB_INSTALL_APPS (plugin_job)) + gs_plugin_loader_pending_apps_add (plugin_loader, plugin_job); + else if (GS_IS_PLUGIN_JOB_UNINSTALL_APPS (plugin_job)) { + if (gs_plugin_loader_pending_apps_add (plugin_loader, plugin_job)) { + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } + } + + job_class->run_async (plugin_job, plugin_loader, cancellable, + run_job_cb, g_object_ref (task)); + return; + } + + /* check job has valid action */ + if (action == GS_PLUGIN_ACTION_UNKNOWN) { + g_autofree gchar *job_str = gs_plugin_job_to_string (plugin_job); + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "job has no valid action: %s", job_str); + return; + } + + /* FIXME: the plugins should specify this, rather than hardcoding */ + if (gs_plugin_job_has_refine_flags (plugin_job, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI)) { + gs_plugin_job_add_refine_flags (plugin_job, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN); + } + if (gs_plugin_job_has_refine_flags (plugin_job, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME)) { + gs_plugin_job_add_refine_flags (plugin_job, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN); + } + if (gs_plugin_job_has_refine_flags (plugin_job, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE)) { + gs_plugin_job_add_refine_flags (plugin_job, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME); + } + + /* save helper */ + helper = gs_plugin_loader_helper_new (plugin_loader, plugin_job); + g_task_set_task_data (task, helper, (GDestroyNotify) gs_plugin_loader_helper_free); + + /* let the task cancel itself */ + g_task_set_check_cancellable (task, FALSE); + g_task_set_return_on_cancel (task, FALSE); + + switch (action) { + case GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD: + /* these actions must be performed by the thread pool because we + * want to limit the number of them running in parallel */ + gs_plugin_loader_schedule_task (plugin_loader, task); + return; + default: + /* run in an unrestricted thread pool thread */ + g_thread_pool_push (plugin_loader->old_api_thread_pool, + g_object_ref (task), NULL); + return; + } +} + +/******************************************************************************/ + +/** + * gs_plugin_loader_get_plugin_supported: + * @plugin_loader: A #GsPluginLoader + * @function_name: a function name + * + * This function returns TRUE if the symbol is found in any enabled plugin. + */ +gboolean +gs_plugin_loader_get_plugin_supported (GsPluginLoader *plugin_loader, + const gchar *function_name) +{ + for (guint i = 0; i < plugin_loader->plugins->len; i++) { + GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i); + if (gs_plugin_get_symbol (plugin, function_name) != NULL) + return TRUE; + } + return FALSE; +} + +/** + * gs_plugin_loader_get_plugins: + * @plugin_loader: a #GsPluginLoader + * + * Get the set of currently loaded plugins. + * + * This includes disabled plugins, which should be checked for using + * gs_plugin_get_enabled(). + * + * This is intended to be used by internal gnome-software code. Plugin and UI + * code should typically use #GsPluginJob to run operations. + * + * Returns: (transfer none) (element-type GsPlugin): list of #GsPlugins + * Since: 42 + */ +GPtrArray * +gs_plugin_loader_get_plugins (GsPluginLoader *plugin_loader) +{ + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), NULL); + + return plugin_loader->plugins; +} + +static void app_create_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/** + * gs_plugin_loader_app_create_async: + * @plugin_loader: a #GsPluginLoader + * @unique_id: a unique_id + * @cancellable: a #GCancellable, or %NULL + * @callback: function to call when complete + * @user_data: user data to pass to @callback + * + * Create a #GsApp identified by @unique_id asynchronously. + * Finish the call with gs_plugin_loader_app_create_finish(). + * + * If the #GsPluginLoader is still being set up, this function will wait until + * setup is complete before running. + * + * Since: 41 + **/ +void +gs_plugin_loader_app_create_async (GsPluginLoader *plugin_loader, + const gchar *unique_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GsPluginJob) refine_job = NULL; + + g_return_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader)); + g_return_if_fail (unique_id != NULL); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (plugin_loader, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_loader_app_create_async); + g_task_set_task_data (task, g_strdup (unique_id), g_free); + + /* use the plugin loader to convert a wildcard app */ + app = gs_app_new (NULL); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_set_from_unique_id (app, unique_id, AS_COMPONENT_KIND_UNKNOWN); + gs_app_list_add (list, app); + + /* Refine the wildcard app. */ + refine_job = gs_plugin_job_refine_new (list, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID | GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING); + gs_plugin_loader_job_process_async (plugin_loader, refine_job, + cancellable, + app_create_cb, + g_steal_pointer (&task)); +} + +static void +app_create_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (g_task_get_source_object (task)); + const gchar *unique_id = g_task_get_task_data (task); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, result, &local_error); + if (list == NULL) { + g_prefix_error (&local_error, "Failed to refine '%s': ", unique_id); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* return the matching GsApp */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app_tmp = gs_app_list_index (list, i); + if (g_strcmp0 (unique_id, gs_app_get_unique_id (app_tmp)) == 0) { + g_task_return_pointer (task, g_object_ref (app_tmp), g_object_unref); + return; + } + } + + /* return the first returned app that's not a wildcard */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app_tmp = gs_app_list_index (list, i); + if (!gs_app_has_quirk (app_tmp, GS_APP_QUIRK_IS_WILDCARD)) { + g_debug ("returning imperfect match: %s != %s", + unique_id, gs_app_get_unique_id (app_tmp)); + g_task_return_pointer (task, g_object_ref (app_tmp), g_object_unref); + return; + } + } + + /* does not exist */ + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "Failed to create an app for '%s'", unique_id); +} + +/** + * gs_plugin_loader_app_create_finish: + * @plugin_loader: a #GsPluginLoader + * @res: a #GAsyncResult + * @error: A #GError, or %NULL + * + * Finishes call to gs_plugin_loader_app_create_async(). + * + * Returns: (transfer full): a #GsApp, or %NULL on error. + * + * Since: 41 + **/ +GsApp * +gs_plugin_loader_app_create_finish (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GError **error) +{ + GsApp *app; + + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), NULL); + g_return_val_if_fail (G_IS_TASK (res), NULL); + g_return_val_if_fail (g_task_is_valid (res, plugin_loader), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + app = g_task_propagate_pointer (G_TASK (res), error); + gs_utils_error_convert_gio (error); + return app; +} + +/** + * gs_plugin_loader_get_system_app_async: + * @plugin_loader: a #GsPluginLoader + * @cancellable: a #GCancellable, or %NULL + * @callback: function to call when complete + * @user_data: user data to pass to @callback + * + * Get the application that represents the currently installed OS + * asynchronously. Finish the call with gs_plugin_loader_get_system_app_finish(). + * + * Since: 41 + **/ +void +gs_plugin_loader_get_system_app_async (GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + gs_plugin_loader_app_create_async (plugin_loader, "*/*/*/system/*", cancellable, callback, user_data); +} + +/** + * gs_plugin_loader_get_system_app_finish: + * @plugin_loader: a #GsPluginLoader + * @res: a #GAsyncResult + * @error: A #GError, or %NULL + * + * Finishes call to gs_plugin_loader_get_system_app_async(). + * + * Returns: (transfer full): a #GsApp, which represents + * the currently installed OS, or %NULL on error. + * + * Since: 41 + **/ +GsApp * +gs_plugin_loader_get_system_app_finish (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GError **error) +{ + return gs_plugin_loader_app_create_finish (plugin_loader, res, error); +} + +/** + * gs_plugin_loader_get_odrs_provider: + * @plugin_loader: a #GsPluginLoader + * + * Get the singleton #GsOdrsProvider which provides access to ratings and + * reviews data from ODRS. + * + * Returns: (transfer none) (nullable): a #GsOdrsProvider, or %NULL if disabled + * Since: 41 + */ +GsOdrsProvider * +gs_plugin_loader_get_odrs_provider (GsPluginLoader *plugin_loader) +{ + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), NULL); + + return plugin_loader->odrs_provider; +} + +/** + * gs_plugin_loader_set_max_parallel_ops: + * @plugin_loader: a #GsPluginLoader + * @max_ops: the maximum number of parallel operations + * + * Sets the number of maximum number of queued operations (install/update/upgrade-download) + * to be processed at a time. If @max_ops is 0, then it will set the default maximum number. + */ +void +gs_plugin_loader_set_max_parallel_ops (GsPluginLoader *plugin_loader, + guint max_ops) +{ + g_autoptr(GError) error = NULL; + if (max_ops == 0) + max_ops = get_max_parallel_ops (); + if (!g_thread_pool_set_max_threads (plugin_loader->queued_ops_pool, max_ops, &error)) + g_warning ("Failed to set the maximum number of ops in parallel: %s", + error->message); +} + +/** + * gs_plugin_loader_get_job_manager: + * @plugin_loader: a #GsPluginLoader + * + * Get the job manager singleton. + * + * Returns: (transfer none): a job manager + * Since: 44 + */ +GsJobManager * +gs_plugin_loader_get_job_manager (GsPluginLoader *plugin_loader) +{ + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), NULL); + + return plugin_loader->job_manager; +} + +/** + * gs_plugin_loader_get_category_manager: + * @plugin_loader: a #GsPluginLoader + * + * Get the category manager singleton. + * + * Returns: (transfer none): a category manager + * Since: 40 + */ +GsCategoryManager * +gs_plugin_loader_get_category_manager (GsPluginLoader *plugin_loader) +{ + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), NULL); + + return plugin_loader->category_manager; +} + +/** + * gs_plugin_loader_emit_updates_changed: + * @self: a #GsPluginLoader + * + * Emits the #GsPluginLoader:updates-changed signal in the nearest + * idle in the main thread. + * + * Since: 43 + **/ +void +gs_plugin_loader_emit_updates_changed (GsPluginLoader *self) +{ + g_return_if_fail (GS_IS_PLUGIN_LOADER (self)); + + if (self->updates_changed_id != 0) + g_source_remove (self->updates_changed_id); + + self->updates_changed_id = + g_idle_add_full (G_PRIORITY_HIGH_IDLE, + gs_plugin_loader_job_updates_changed_delay_cb, + g_object_ref (self), g_object_unref); +} diff --git a/lib/gs-plugin-loader.h b/lib/gs-plugin-loader.h new file mode 100644 index 0000000..4cb6419 --- /dev/null +++ b/lib/gs-plugin-loader.h @@ -0,0 +1,127 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2007-2017 Richard Hughes + * Copyright (C) 2015-2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-app.h" +#include "gs-category.h" +#include "gs-category-manager.h" +#include "gs-odrs-provider.h" +#include "gs-plugin-event.h" +#include "gs-plugin.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_LOADER (gs_plugin_loader_get_type ()) +G_DECLARE_FINAL_TYPE (GsPluginLoader, gs_plugin_loader, GS, PLUGIN_LOADER, GObject) + +#include "gs-job-manager.h" +#include "gs-plugin-job.h" + +GsPluginLoader *gs_plugin_loader_new (GDBusConnection *session_bus_connection, + GDBusConnection *system_bus_connection); +void gs_plugin_loader_job_process_async (GsPluginLoader *plugin_loader, + GsPluginJob *plugin_job, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GsAppList *gs_plugin_loader_job_process_finish (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GError **error); +gboolean gs_plugin_loader_job_action_finish (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GError **error); +void gs_plugin_loader_setup_async (GsPluginLoader *plugin_loader, + const gchar * const *allowlist, + const gchar * const *blocklist, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_plugin_loader_setup_finish (GsPluginLoader *plugin_loader, + GAsyncResult *result, + GError **error); + +void gs_plugin_loader_shutdown (GsPluginLoader *plugin_loader, + GCancellable *cancellable); + +void gs_plugin_loader_dump_state (GsPluginLoader *plugin_loader); +gboolean gs_plugin_loader_get_enabled (GsPluginLoader *plugin_loader, + const gchar *plugin_name); +void gs_plugin_loader_add_location (GsPluginLoader *plugin_loader, + const gchar *location); +guint gs_plugin_loader_get_scale (GsPluginLoader *plugin_loader); +void gs_plugin_loader_set_scale (GsPluginLoader *plugin_loader, + guint scale); +GsAppList *gs_plugin_loader_get_pending (GsPluginLoader *plugin_loader); +gboolean gs_plugin_loader_get_allow_updates (GsPluginLoader *plugin_loader); +gboolean gs_plugin_loader_get_network_available (GsPluginLoader *plugin_loader); +gboolean gs_plugin_loader_get_network_metered (GsPluginLoader *plugin_loader); +gboolean gs_plugin_loader_get_power_saver (GsPluginLoader *plugin_loader); +gboolean gs_plugin_loader_get_game_mode (GsPluginLoader *plugin_loader); +gboolean gs_plugin_loader_get_plugin_supported (GsPluginLoader *plugin_loader, + const gchar *function_name); + +GPtrArray *gs_plugin_loader_get_plugins (GsPluginLoader *plugin_loader); + +void gs_plugin_loader_add_event (GsPluginLoader *plugin_loader, + GsPluginEvent *event); +GPtrArray *gs_plugin_loader_get_events (GsPluginLoader *plugin_loader); +GsPluginEvent *gs_plugin_loader_get_event_default (GsPluginLoader *plugin_loader); +void gs_plugin_loader_remove_events (GsPluginLoader *plugin_loader); + +void gs_plugin_loader_app_create_async (GsPluginLoader *plugin_loader, + const gchar *unique_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GsApp *gs_plugin_loader_app_create_finish (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GError **error); +void gs_plugin_loader_get_system_app_async (GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GsApp *gs_plugin_loader_get_system_app_finish (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GError **error); +GsOdrsProvider *gs_plugin_loader_get_odrs_provider (GsPluginLoader *plugin_loader); + +/* only useful from the self tests */ +void gs_plugin_loader_clear_caches (GsPluginLoader *plugin_loader); +GsPlugin *gs_plugin_loader_find_plugin (GsPluginLoader *plugin_loader, + const gchar *plugin_name); +void gs_plugin_loader_set_max_parallel_ops (GsPluginLoader *plugin_loader, + guint max_ops); + +GsJobManager *gs_plugin_loader_get_job_manager (GsPluginLoader *plugin_loader); + +GsCategoryManager *gs_plugin_loader_get_category_manager (GsPluginLoader *plugin_loader); +void gs_plugin_loader_claim_error (GsPluginLoader *plugin_loader, + GsPlugin *plugin, + GsPluginAction action, + GsApp *app, + gboolean interactive, + const GError *error); +void gs_plugin_loader_claim_job_error (GsPluginLoader *plugin_loader, + GsPlugin *plugin, + GsPluginJob *job, + const GError *error); + +gboolean gs_plugin_loader_app_is_valid (GsApp *app, + GsPluginRefineFlags flags); +gboolean gs_plugin_loader_app_is_compatible (GsPluginLoader *plugin_loader, + GsApp *app); + +void gs_plugin_loader_run_adopt (GsPluginLoader *plugin_loader, + GsAppList *list); +void gs_plugin_loader_emit_updates_changed (GsPluginLoader *self); + +G_END_DECLS diff --git a/lib/gs-plugin-private.h b/lib/gs-plugin-private.h new file mode 100644 index 0000000..9f8bf3c --- /dev/null +++ b/lib/gs-plugin-private.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-plugin.h" + +G_BEGIN_DECLS + +GsPlugin *gs_plugin_new (GDBusConnection *session_bus_connection, + GDBusConnection *system_bus_connection); +GsPlugin *gs_plugin_create (const gchar *filename, + GDBusConnection *session_bus_connection, + GDBusConnection *system_bus_connection, + GError **error); +const gchar *gs_plugin_error_to_string (GsPluginError error); +const gchar *gs_plugin_action_to_string (GsPluginAction action); +GsPluginAction gs_plugin_action_from_string (const gchar *action); +const gchar *gs_plugin_action_to_function_name (GsPluginAction action); + +void gs_plugin_set_scale (GsPlugin *plugin, + guint scale); +guint gs_plugin_get_order (GsPlugin *plugin); +void gs_plugin_set_order (GsPlugin *plugin, + guint order); +guint gs_plugin_get_priority (GsPlugin *plugin); +void gs_plugin_set_priority (GsPlugin *plugin, + guint priority); +void gs_plugin_set_name (GsPlugin *plugin, + const gchar *name); +void gs_plugin_set_language (GsPlugin *plugin, + const gchar *language); +void gs_plugin_set_auth_array (GsPlugin *plugin, + GPtrArray *auth_array); +GPtrArray *gs_plugin_get_rules (GsPlugin *plugin, + GsPluginRule rule); +gpointer gs_plugin_get_symbol (GsPlugin *plugin, + const gchar *function_name); +void gs_plugin_interactive_inc (GsPlugin *plugin); +void gs_plugin_interactive_dec (GsPlugin *plugin); +gchar *gs_plugin_refine_flags_to_string (GsPluginRefineFlags refine_flags); +void gs_plugin_set_network_monitor (GsPlugin *plugin, + GNetworkMonitor *monitor); + +G_END_DECLS diff --git a/lib/gs-plugin-types.h b/lib/gs-plugin-types.h new file mode 100644 index 0000000..a4d98d0 --- /dev/null +++ b/lib/gs-plugin-types.h @@ -0,0 +1,480 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012-2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +/** + * GsPluginStatus: + * @GS_PLUGIN_STATUS_UNKNOWN: Unknown status + * @GS_PLUGIN_STATUS_WAITING: Waiting + * @GS_PLUGIN_STATUS_FINISHED: Finished + * @GS_PLUGIN_STATUS_SETUP: Setup in progress + * @GS_PLUGIN_STATUS_DOWNLOADING: Downloading in progress + * @GS_PLUGIN_STATUS_QUERYING: Querying in progress + * @GS_PLUGIN_STATUS_INSTALLING: Installing in progress + * @GS_PLUGIN_STATUS_REMOVING: Removing in progress + * + * The status of the plugin. + **/ +typedef enum { + GS_PLUGIN_STATUS_UNKNOWN, + GS_PLUGIN_STATUS_WAITING, + GS_PLUGIN_STATUS_FINISHED, + GS_PLUGIN_STATUS_SETUP, + GS_PLUGIN_STATUS_DOWNLOADING, + GS_PLUGIN_STATUS_QUERYING, + GS_PLUGIN_STATUS_INSTALLING, + GS_PLUGIN_STATUS_REMOVING, + GS_PLUGIN_STATUS_LAST /*< skip >*/ +} GsPluginStatus; + +/** + * GsPluginFlags: + * @GS_PLUGIN_FLAGS_NONE: No flags set + * @GS_PLUGIN_FLAGS_INTERACTIVE: User initiated the job + * + * The flags for the plugin at this point in time. + **/ +typedef enum { + GS_PLUGIN_FLAGS_NONE = 0, + GS_PLUGIN_FLAGS_INTERACTIVE = 1 << 4, +} GsPluginFlags; + +/** + * GsPluginError: + * @GS_PLUGIN_ERROR_FAILED: Generic failure + * @GS_PLUGIN_ERROR_NOT_SUPPORTED: Action not supported + * @GS_PLUGIN_ERROR_CANCELLED: Action was cancelled + * @GS_PLUGIN_ERROR_NO_NETWORK: No network connection available + * @GS_PLUGIN_ERROR_NO_SECURITY: Security policy forbid action + * @GS_PLUGIN_ERROR_NO_SPACE: No disk space to allow action + * @GS_PLUGIN_ERROR_AUTH_REQUIRED: Authentication was required + * @GS_PLUGIN_ERROR_AUTH_INVALID: Provided authentication was invalid + * @GS_PLUGIN_ERROR_PLUGIN_DEPSOLVE_FAILED: The plugins installed are incompatible + * @GS_PLUGIN_ERROR_DOWNLOAD_FAILED: The download action failed + * @GS_PLUGIN_ERROR_WRITE_FAILED: The save-to-disk failed + * @GS_PLUGIN_ERROR_INVALID_FORMAT: The data format is invalid + * @GS_PLUGIN_ERROR_DELETE_FAILED: The delete action failed + * @GS_PLUGIN_ERROR_RESTART_REQUIRED: A restart is required + * @GS_PLUGIN_ERROR_AC_POWER_REQUIRED: AC power is required + * @GS_PLUGIN_ERROR_TIMED_OUT: The job timed out + * @GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW: The system battery level is too low + * + * The failure error types. + **/ +typedef enum { + GS_PLUGIN_ERROR_FAILED, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + GS_PLUGIN_ERROR_CANCELLED, + GS_PLUGIN_ERROR_NO_NETWORK, + GS_PLUGIN_ERROR_NO_SECURITY, + GS_PLUGIN_ERROR_NO_SPACE, + GS_PLUGIN_ERROR_AUTH_REQUIRED, + GS_PLUGIN_ERROR_AUTH_INVALID, + GS_PLUGIN_ERROR_PLUGIN_DEPSOLVE_FAILED, + GS_PLUGIN_ERROR_DOWNLOAD_FAILED, + GS_PLUGIN_ERROR_WRITE_FAILED, + GS_PLUGIN_ERROR_INVALID_FORMAT, + GS_PLUGIN_ERROR_DELETE_FAILED, + GS_PLUGIN_ERROR_RESTART_REQUIRED, + GS_PLUGIN_ERROR_AC_POWER_REQUIRED, + GS_PLUGIN_ERROR_TIMED_OUT, + GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW, + GS_PLUGIN_ERROR_LAST /*< skip >*/ +} GsPluginError; + +/** + * GsPluginRefineFlags: + * @GS_PLUGIN_REFINE_FLAGS_NONE: No explicit flags set + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID: Require the app’s ID; this is the minimum possible requirement + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE: Require the license + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL: Require the URL + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION: Require the long description + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE: Require the installed and download sizes + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING: Require the rating + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION: Require the version + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY: Require the history + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION: Require enough to install or remove the package + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS: Require update details + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN: Require the origin + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED: Require related packages + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS: Require available addons + * @GS_PLUGIN_REFINE_FLAGS_ALLOW_PACKAGES: Allow packages to be returned + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY: Require update severity + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPGRADE_REMOVED: Require distro upgrades + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE: Require the provenance + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS: Require user-reviews + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS: Require user-ratings + * @GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING: Normally the results of a refine are + * filtered to remove non-valid apps; if this flag is set, that won’t happen. + * This is intended to be used by internal #GsPluginLoader code. (Since: 42) + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON: Require the icon to be loaded + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS: Require the needed permissions + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME: Require the origin hostname + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI: Require the origin for UI + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME: Require the runtime + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS: Require screenshot information + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES: Require categories + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROJECT_GROUP: Require project group + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME: Require developer name + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS: Require kudos + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_CONTENT_RATING: Require content rating + * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE_DATA: Require user and cache data sizes (Since: 41) + * @GS_PLUGIN_REFINE_FLAGS_MASK: All flags (Since: 40) + * + * The refine flags. + **/ +typedef enum { + GS_PLUGIN_REFINE_FLAGS_NONE = 0, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID = 1 << 0, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE = 1 << 1, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL = 1 << 2, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION = 1 << 3, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE = 1 << 4, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING = 1 << 5, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION = 1 << 6, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY = 1 << 7, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION = 1 << 8, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS = 1 << 9, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN = 1 << 10, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED = 1 << 11, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE_DATA = 1 << 12, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS = 1 << 13, + GS_PLUGIN_REFINE_FLAGS_ALLOW_PACKAGES = 1 << 14, /* TODO: move to request */ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY = 1 << 15, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPGRADE_REMOVED = 1 << 16, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE = 1 << 17, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS = 1 << 18, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS = 1 << 19, + GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING = 1 << 20, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON = 1 << 21, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS = 1 << 22, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME = 1 << 23, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI = 1 << 24, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME = 1 << 25, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS = 1 << 26, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES = 1 << 27, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROJECT_GROUP = 1 << 28, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME = 1 << 29, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS = 1 << 30, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CONTENT_RATING = 1 << 31, + GS_PLUGIN_REFINE_FLAGS_MASK = ~0, +} GsPluginRefineFlags; + +/** + * GsPluginListAppsFlags: + * @GS_PLUGIN_LIST_APPS_FLAGS_NONE: No flags set. + * @GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for an operation to list apps matching a given query. + * + * Since: 43 + */ +typedef enum { + GS_PLUGIN_LIST_APPS_FLAGS_NONE = 0, + GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginListAppsFlags; + +/** + * GsPluginRefineCategoriesFlags: + * @GS_PLUGIN_REFINE_CATEGORIES_FLAGS_NONE: No flags set. + * @GS_PLUGIN_REFINE_CATEGORIES_FLAGS_INTERACTIVE: User initiated the job. + * @GS_PLUGIN_REFINE_CATEGORIES_FLAGS_SIZE: Work out the number of apps in each category. + * + * Flags for an operation to refine categories. + * + * Since: 43 + */ +typedef enum { + GS_PLUGIN_REFINE_CATEGORIES_FLAGS_NONE = 0, + GS_PLUGIN_REFINE_CATEGORIES_FLAGS_INTERACTIVE = 1 << 0, + GS_PLUGIN_REFINE_CATEGORIES_FLAGS_SIZE = 1 << 1, +} GsPluginRefineCategoriesFlags; + +/** + * GsPluginRefreshMetadataFlags: + * @GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE: No flags set. + * @GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for an operation to refresh metadata. + * + * Since: 42 + */ +typedef enum { + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE = 0, + GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginRefreshMetadataFlags; + +/** + * GsPluginListDistroUpgradesFlags: + * @GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE: No flags set. + * @GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for an operation to list available distro upgrades. + * + * Since: 42 + */ +typedef enum { + GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE = 0, + GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginListDistroUpgradesFlags; + +/** + * GsPluginManageRepositoryFlags: + * @GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_NONE: No flags set. + * @GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE: User initiated the job. + * @GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL: Install the repository. + * @GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE: Remove the repository. + * @GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE: Enable the repository. + * @GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE: Disable the repository. + * + * Flags for an operation on a repository. + * + * Since: 42 + */ +typedef enum { + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_NONE = 0, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE = 1 << 0, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL = 1 << 1, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE = 1 << 2, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE = 1 << 3, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE = 1 << 4, +} GsPluginManageRepositoryFlags; + +/** + * GsPluginInstallAppsFlags: + * @GS_PLUGIN_INSTALL_APPS_FLAGS_NONE: No flags set. + * @GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE: User initiated the job. + * @GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD: Only use locally cached resources, + * and error if they don’t exist. + * @GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY: Only download the resources, and don’t + * do the installation. + * + * Flags for an operation to download or install apps. + * + * Since: 47 + */ +typedef enum { + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE = 0, + GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE = 1 << 0, + GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD = 1 << 1, + GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY = 1 << 2, +} GsPluginInstallAppsFlags; + +/** + * GsPluginUninstallAppsFlags: + * @GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE: No flags set. + * @GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for an operation to uninstall apps. + * + * Since: 47 + */ +typedef enum { + GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE = 0, + GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginUninstallAppsFlags; + +/** + * GsPluginUpdateAppsFlags: + * @GS_PLUGIN_UPDATE_APPS_FLAGS_NONE: No flags set. + * @GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE: User initiated the job. + * @GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD: Only use locally cached resources, + * and error if they don’t exist. + * @GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY: Only download the resources, and don’t + * apply the updates. + * + * Flags for an operation to download or update apps. + * + * Since: 44 + */ +typedef enum { + GS_PLUGIN_UPDATE_APPS_FLAGS_NONE = 0, + GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE = 1 << 0, + GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD = 1 << 1, + GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY = 1 << 2, +} GsPluginUpdateAppsFlags; + +/** + * GsPluginCancelOfflineUpdateFlags: + * @GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_NONE: No flags set. + * @GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for an operation to cancel a pending offline update. + * + * Since: 47 + */ +typedef enum { + GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_NONE = 0, + GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginCancelOfflineUpdateFlags; + +/** + * GsPluginDownloadUpgradeFlags: + * @GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_NONE: No flags set. + * @GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for an operation to download an upgrade. + * + * Since: 47 + */ +typedef enum { + GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_NONE = 0, + GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginDownloadUpgradeFlags; + +/** + * GsPluginTriggerUpgradeFlags: + * @GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_NONE: No flags set. + * @GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for an operation to trigger an upgrade. + * + * Since: 47 + */ +typedef enum { + GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_NONE = 0, + GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginTriggerUpgradeFlags; + +/** + * GsPluginLaunchFlags: + * @GS_PLUGIN_LAUNCH_FLAGS_NONE: No flags set. + * @GS_PLUGIN_LAUNCH_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for a launch operation. + * + * Since: 47 + */ +typedef enum { + GS_PLUGIN_LAUNCH_FLAGS_NONE = 0, + GS_PLUGIN_LAUNCH_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginLaunchFlags; + +/** + * GsPluginFileToAppFlags: + * @GS_PLUGIN_FILE_TO_APP_FLAGS_NONE: No flags set. + * @GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for a file-to-app operation. + * + * Since: 47 + */ +typedef enum { + GS_PLUGIN_FILE_TO_APP_FLAGS_NONE = 0, + GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginFileToAppFlags; + +/** + * GsPluginUrlToAppFlags: + * @GS_PLUGIN_URL_TO_APP_FLAGS_NONE: No flags set. + * @GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE: User initiated the job. + * + * Flags for a url-to-app operation. + * + * Since: 47 + */ +typedef enum { + GS_PLUGIN_URL_TO_APP_FLAGS_NONE = 0, + GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE = 1 << 0, +} GsPluginUrlToAppFlags; + +/** + * GsPluginProgressCallback: + * @plugin: the #GsPlugin reporting its progress + * @progress: the percentage completion (0–100 inclusive), or + * %GS_APP_PROGRESS_UNKNOWN for unknown + * @user_data: user data passed to the calling function + * + * Callback to report the progress of a particular @plugin through a particular + * operation. + * + * Since: 44 + */ +typedef void (* GsPluginProgressCallback) (GsPlugin *plugin, + guint progress, + gpointer user_data); + +/** + * GsPluginAppNeedsUserActionCallback: + * @plugin: the #GsPlugin asking for user action + * @app: (nullable) (transfer none): the related #GsApp, or %NULL if no app is + * explicitly related to the necessary user action + * @action_screenshot: (nullable) (transfer none): a screenshot (with caption + * set) which gives the user instructions about what action to take, or %NULL + * if no instructions are available + * @user_data: user data passed to the calling function + * + * Callback to ask the user to perform a physical action during a plugin + * operation. + * + * This will typically be something like unplugging and reconnecting a hardware + * device, and instructions will be given via @action_screenshot. + * + * Since: 44 + */ +typedef void (* GsPluginAppNeedsUserActionCallback) (GsPlugin *plugin, + GsApp *app, + AsScreenshot *action_screenshot, + gpointer user_data); + +/** + * GsPluginRule: + * @GS_PLUGIN_RULE_CONFLICTS: The plugin conflicts with another + * @GS_PLUGIN_RULE_RUN_AFTER: Order the plugin after another + * @GS_PLUGIN_RULE_RUN_BEFORE: Order the plugin before another + * @GS_PLUGIN_RULE_BETTER_THAN: Results are better than another + * + * The rules used for ordering plugins. + * Plugins are expected to add rules in the init function for their #GsPlugin + * subclass. + **/ +typedef enum { + GS_PLUGIN_RULE_CONFLICTS, + GS_PLUGIN_RULE_RUN_AFTER, + GS_PLUGIN_RULE_RUN_BEFORE, + GS_PLUGIN_RULE_BETTER_THAN, + GS_PLUGIN_RULE_LAST /*< skip >*/ +} GsPluginRule; + +/** + * GsPluginAction: + * @GS_PLUGIN_ACTION_UNKNOWN: Action is unknown + * @GS_PLUGIN_ACTION_INSTALL: Install an app + * @GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD: Download a distro upgrade + * @GS_PLUGIN_ACTION_LAUNCH: Launch an app + * @GS_PLUGIN_ACTION_FILE_TO_APP: Convert the file to an app + * @GS_PLUGIN_ACTION_URL_TO_APP: Convert the URI to an app + * @GS_PLUGIN_ACTION_GET_LANGPACKS: Get appropriate language pack + * @GS_PLUGIN_ACTION_INSTALL_REPO: Install a repository (Since: 41) + * @GS_PLUGIN_ACTION_REMOVE_REPO: Remove a repository (Since: 41) + * @GS_PLUGIN_ACTION_ENABLE_REPO: Enable a repository (Since: 41) + * @GS_PLUGIN_ACTION_DISABLE_REPO: Disable a repository (Since: 41) + * + * The plugin action. + **/ +typedef enum { + GS_PLUGIN_ACTION_UNKNOWN, + GS_PLUGIN_ACTION_INSTALL, + GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD, + GS_PLUGIN_ACTION_LAUNCH, + GS_PLUGIN_ACTION_FILE_TO_APP, + GS_PLUGIN_ACTION_URL_TO_APP, + GS_PLUGIN_ACTION_GET_LANGPACKS, + GS_PLUGIN_ACTION_INSTALL_REPO, + GS_PLUGIN_ACTION_REMOVE_REPO, + GS_PLUGIN_ACTION_ENABLE_REPO, + GS_PLUGIN_ACTION_DISABLE_REPO, + GS_PLUGIN_ACTION_LAST /*< skip >*/ +} GsPluginAction; + +G_END_DECLS diff --git a/lib/gs-plugin-vfuncs.h b/lib/gs-plugin-vfuncs.h new file mode 100644 index 0000000..da96b0f --- /dev/null +++ b/lib/gs-plugin-vfuncs.h @@ -0,0 +1,84 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +/** + * SECTION:gs-plugin-vfuncs + * @title: GsPlugin Exports + * @include: gnome-software.h + * @stability: Unstable + * @short_description: Vfuncs that plugins can implement + */ + +#include +#include +#include +#include +#include + +#include "gs-app.h" +#include "gs-app-list.h" +#include "gs-category.h" + +G_BEGIN_DECLS + +/** + * gs_plugin_query_type: + * + * Returns the #GType for a subclass of #GsPlugin provided by this plugin + * module. It should not do any other computation. + * + * The init function for that type should initialize the plugin. If the plugin + * should not be run then gs_plugin_set_enabled() should be called from the + * init function. + * + * NOTE: Do not do any failable actions in the plugin class’ init function; use + * #GsPluginClass.setup_async instead. + * + * Since: 42 + */ +GType gs_plugin_query_type (void); + +/** + * gs_plugin_adopt_app: + * @plugin: a #GsPlugin + * @app: a #GsApp + * + * Called when an #GsApp has not been claimed (i.e. a management plugin has not + * been set). + * + * A claimed app means other plugins will not try to perform actions + * such as install, remove or update. Most apps are claimed when they + * are created. + * + * If a plugin can adopt this app then it should call + * gs_app_set_management_plugin() on @app. + **/ +void gs_plugin_adopt_app (GsPlugin *plugin, + GsApp *app); + +/** + * gs_plugin_add_langpacks: + * @plugin: a #GsPlugin + * @list: a #GsAppList + * @locale: a #LANGUAGE_CODE or #LOCALE, e.g. "ja" or "ja_JP" + * @cancellable: a #GCancellable, or %NULL + * @error: a #GError, or %NULL + * + * Returns a list of language packs, as per input language code or locale. + * + * Returns: %TRUE for success or if not relevant + **/ +gboolean gs_plugin_add_langpacks (GsPlugin *plugin, + GsAppList *list, + const gchar *locale, + GCancellable *cancellable, + GError **error); + +G_END_DECLS diff --git a/lib/gs-plugin.c b/lib/gs-plugin.c new file mode 100644 index 0000000..6d2ea4f --- /dev/null +++ b/lib/gs-plugin.c @@ -0,0 +1,2128 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2014-2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-plugin + * @title: GsPlugin Helpers + * @include: gnome-software.h + * @stability: Unstable + * @short_description: Runtime-loaded modules providing functionality + * + * Plugins are modules that are loaded at runtime to provide information + * about requests and to service user actions like installing, removing + * and updating. + * This allows different distributions to pick and choose how the + * application installer gathers data. + * + * Plugins also have a priority system where the largest number gets + * run first. That means if one plugin requires some property or + * metadata set by another plugin then it **must** depend on the other + * plugin to be run in the correct order. + * + * As a general rule, try to make plugins as small and self-contained + * as possible and remember to cache as much data as possible for speed. + * Memory is cheap, time less so. + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-app-list-private.h" +#include "gs-download-utils.h" +#include "gs-enums.h" +#include "gs-os-release.h" +#include "gs-plugin-private.h" +#include "gs-plugin.h" +#include "gs-utils.h" + +typedef struct +{ + GHashTable *cache; + GMutex cache_mutex; + GModule *module; + GsPluginFlags flags; + GPtrArray *rules[GS_PLUGIN_RULE_LAST]; + GHashTable *vfuncs; /* string:pointer */ + GMutex vfuncs_mutex; + gboolean enabled; + guint interactive_cnt; + GMutex interactive_mutex; + gchar *language; /* allow-none */ + gchar *name; + gchar *appstream_id; + guint scale; + guint order; + guint priority; + guint timer_id; + GMutex timer_mutex; + GNetworkMonitor *network_monitor; + + GDBusConnection *session_bus_connection; /* (owned) (not nullable) */ + GDBusConnection *system_bus_connection; /* (owned) (not nullable) */ +} GsPluginPrivate; + +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GsPlugin, gs_plugin, G_TYPE_OBJECT) + +G_DEFINE_QUARK (gs-plugin-error-quark, gs_plugin_error) + +typedef enum { + PROP_FLAGS = 1, + PROP_SCALE, + PROP_SESSION_BUS_CONNECTION, + PROP_SYSTEM_BUS_CONNECTION, +} GsPluginProperty; + +static GParamSpec *obj_props[PROP_SYSTEM_BUS_CONNECTION + 1] = { NULL, }; + +enum { + SIGNAL_UPDATES_CHANGED, + SIGNAL_STATUS_CHANGED, + SIGNAL_RELOAD, + SIGNAL_REPORT_EVENT, + SIGNAL_ALLOW_UPDATES, + SIGNAL_BASIC_AUTH_START, + SIGNAL_REPOSITORY_CHANGED, + SIGNAL_ASK_UNTRUSTED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +typedef const gchar **(*GsPluginGetDepsFunc) (GsPlugin *plugin); + +/** + * gs_plugin_status_to_string: + * @status: a #GsPluginStatus, e.g. %GS_PLUGIN_STATUS_DOWNLOADING + * + * Converts the #GsPluginStatus enum to a string. + * + * Returns: the string representation, or "unknown" + * + * Since: 3.22 + **/ +const gchar * +gs_plugin_status_to_string (GsPluginStatus status) +{ + if (status == GS_PLUGIN_STATUS_WAITING) + return "waiting"; + if (status == GS_PLUGIN_STATUS_FINISHED) + return "finished"; + if (status == GS_PLUGIN_STATUS_SETUP) + return "setup"; + if (status == GS_PLUGIN_STATUS_DOWNLOADING) + return "downloading"; + if (status == GS_PLUGIN_STATUS_QUERYING) + return "querying"; + if (status == GS_PLUGIN_STATUS_INSTALLING) + return "installing"; + if (status == GS_PLUGIN_STATUS_REMOVING) + return "removing"; + return "unknown"; +} + +/** + * gs_plugin_set_name: + * @plugin: a #GsPlugin + * @name: a plugin name + * + * Sets the name of the plugin. + * + * Plugins are not required to set the plugin name as it is automatically set + * from the `.so` filename. + * + * Since: 3.26 + **/ +void +gs_plugin_set_name (GsPlugin *plugin, const gchar *name) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + if (priv->name != NULL) + g_free (priv->name); + priv->name = g_strdup (name); +} + +/** + * gs_plugin_create: + * @filename: an absolute filename + * @session_bus_connection: (not nullable) (transfer none): a session bus + * connection to use + * @system_bus_connection: (not nullable) (transfer none): a system bus + * connection to use + * @error: a #GError, or %NULL + * + * Creates a new plugin from an external module. + * + * Returns: (transfer full): the #GsPlugin, or %NULL on error + * + * Since: 43 + **/ +GsPlugin * +gs_plugin_create (const gchar *filename, + GDBusConnection *session_bus_connection, + GDBusConnection *system_bus_connection, + GError **error) +{ + GsPlugin *plugin = NULL; + GsPluginPrivate *priv; + g_autofree gchar *basename = NULL; + GModule *module = NULL; + GType (*query_type_function) (void) = NULL; + GType plugin_type; + + /* get the plugin name from the basename */ + basename = g_path_get_basename (filename); + if (!g_str_has_prefix (basename, "libgs_plugin_")) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "plugin filename has wrong prefix: %s", + filename); + return NULL; + } + g_strdelimit (basename, ".", '\0'); + + /* create new plugin */ + module = g_module_open (filename, 0); + if (module == NULL || + !g_module_symbol (module, "gs_plugin_query_type", (gpointer *) &query_type_function)) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "failed to open plugin %s: %s", + filename, g_module_error ()); + if (module != NULL) + g_module_close (module); + return NULL; + } + + /* Make the module resident so it can’t be unloaded: without using a + * full #GTypePlugin implementation for the modules, it’s not safe to + * re-load a module and re-register its types with GObject, as that will + * confuse the GType system. */ + g_module_make_resident (module); + + plugin_type = query_type_function (); + g_assert (g_type_is_a (plugin_type, GS_TYPE_PLUGIN)); + + plugin = g_object_new (plugin_type, + "session-bus-connection", session_bus_connection, + "system-bus-connection", system_bus_connection, + NULL); + priv = gs_plugin_get_instance_private (plugin); + priv->module = g_steal_pointer (&module); + + gs_plugin_set_name (plugin, basename + 13); + return plugin; +} + +static void +gs_plugin_dispose (GObject *object) +{ + GsPlugin *plugin = GS_PLUGIN (object); + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + + g_clear_object (&priv->session_bus_connection); + g_clear_object (&priv->system_bus_connection); + + G_OBJECT_CLASS (gs_plugin_parent_class)->dispose (object); +} + +static void +gs_plugin_finalize (GObject *object) +{ + GsPlugin *plugin = GS_PLUGIN (object); + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + guint i; + + for (i = 0; i < GS_PLUGIN_RULE_LAST; i++) + g_ptr_array_unref (priv->rules[i]); + + if (priv->timer_id > 0) + g_source_remove (priv->timer_id); + g_free (priv->name); + g_free (priv->appstream_id); + g_free (priv->language); + if (priv->network_monitor != NULL) + g_object_unref (priv->network_monitor); + g_hash_table_unref (priv->cache); + g_hash_table_unref (priv->vfuncs); + g_mutex_clear (&priv->cache_mutex); + g_mutex_clear (&priv->interactive_mutex); + g_mutex_clear (&priv->timer_mutex); + g_mutex_clear (&priv->vfuncs_mutex); + if (priv->module != NULL) + g_module_close (priv->module); + + G_OBJECT_CLASS (gs_plugin_parent_class)->finalize (object); +} + +/** + * gs_plugin_get_symbol: (skip) + * @plugin: a #GsPlugin + * @function_name: a symbol name + * + * Gets the symbol from the module that backs the plugin. If the plugin is not + * enabled then no symbol is returned. + * + * Returns: the pointer to the symbol, or %NULL + * + * Since: 3.22 + **/ +gpointer +gs_plugin_get_symbol (GsPlugin *plugin, const gchar *function_name) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + gpointer func = NULL; + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&priv->vfuncs_mutex); + + g_return_val_if_fail (function_name != NULL, NULL); + + /* disabled plugins shouldn't be checked */ + if (!priv->enabled) + return NULL; + + /* look up the symbol from the cache */ + if (g_hash_table_lookup_extended (priv->vfuncs, function_name, NULL, &func)) + return func; + + /* look up the symbol using the elf headers */ + g_module_symbol (priv->module, function_name, &func); + g_hash_table_insert (priv->vfuncs, g_strdup (function_name), func); + + return func; +} + +/** + * gs_plugin_get_enabled: + * @plugin: a #GsPlugin + * + * Gets if the plugin is enabled. + * + * Returns: %TRUE if enabled + * + * Since: 3.22 + **/ +gboolean +gs_plugin_get_enabled (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return priv->enabled; +} + +/** + * gs_plugin_set_enabled: + * @plugin: a #GsPlugin + * @enabled: the enabled state + * + * Enables or disables a plugin. + * This is normally only called from the init function for a #GsPlugin instance. + * + * Since: 3.22 + **/ +void +gs_plugin_set_enabled (GsPlugin *plugin, gboolean enabled) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + priv->enabled = enabled; +} + +void +gs_plugin_interactive_inc (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&priv->interactive_mutex); + priv->interactive_cnt++; + gs_plugin_add_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE); +} + +void +gs_plugin_interactive_dec (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&priv->interactive_mutex); + if (priv->interactive_cnt > 0) + priv->interactive_cnt--; + if (priv->interactive_cnt == 0) + gs_plugin_remove_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE); +} + +/** + * gs_plugin_get_name: + * @plugin: a #GsPlugin + * + * Gets the plugin name. + * + * Returns: a string, e.g. "fwupd" + * + * Since: 3.22 + **/ +const gchar * +gs_plugin_get_name (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return priv->name; +} + +/** + * gs_plugin_get_appstream_id: + * @plugin: a #GsPlugin + * + * Gets the plugin AppStream ID. + * + * Returns: a string, e.g. `org.gnome.Software.Plugin.Epiphany` + * + * Since: 3.24 + **/ +const gchar * +gs_plugin_get_appstream_id (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return priv->appstream_id; +} + +/** + * gs_plugin_set_appstream_id: + * @plugin: a #GsPlugin + * @appstream_id: an appstream ID, e.g. `org.gnome.Software.Plugin.Epiphany` + * + * Sets the plugin AppStream ID. + * + * Since: 3.24 + **/ +void +gs_plugin_set_appstream_id (GsPlugin *plugin, const gchar *appstream_id) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_free (priv->appstream_id); + priv->appstream_id = g_strdup (appstream_id); +} + +/** + * gs_plugin_get_scale: + * @plugin: a #GsPlugin + * + * Gets the window scale factor. + * + * Returns: the factor, usually 1 for standard screens or 2 for HiDPI + * + * Since: 3.22 + **/ +guint +gs_plugin_get_scale (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return priv->scale; +} + +/** + * gs_plugin_set_scale: + * @plugin: a #GsPlugin + * @scale: the window scale factor, usually 1 for standard screens or 2 for HiDPI + * + * Sets the window scale factor. + * + * Since: 3.22 + **/ +void +gs_plugin_set_scale (GsPlugin *plugin, guint scale) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + if (priv->scale != scale) { + priv->scale = scale; + g_object_notify_by_pspec (G_OBJECT (plugin), obj_props[PROP_SCALE]); + } +} + +/** + * gs_plugin_get_order: + * @plugin: a #GsPlugin + * + * Gets the plugin order, where higher numbers are run after lower + * numbers. + * + * Returns: the integer value + * + * Since: 3.22 + **/ +guint +gs_plugin_get_order (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return priv->order; +} + +/** + * gs_plugin_set_order: + * @plugin: a #GsPlugin + * @order: a integer value + * + * Sets the plugin order, where higher numbers are run after lower + * numbers. + * + * Since: 3.22 + **/ +void +gs_plugin_set_order (GsPlugin *plugin, guint order) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + priv->order = order; +} + +/** + * gs_plugin_get_priority: + * @plugin: a #GsPlugin + * + * Gets the plugin priority, where higher values will be chosen where + * multiple #GsApp's match a specific rule. + * + * Returns: the integer value + * + * Since: 3.22 + **/ +guint +gs_plugin_get_priority (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return priv->priority; +} + +/** + * gs_plugin_set_priority: + * @plugin: a #GsPlugin + * @priority: a integer value + * + * Sets the plugin priority, where higher values will be chosen where + * multiple #GsApp's match a specific rule. + * + * Since: 3.22 + **/ +void +gs_plugin_set_priority (GsPlugin *plugin, guint priority) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + priv->priority = priority; +} + +/** + * gs_plugin_get_language: + * @plugin: a #GsPlugin + * + * Gets the user language from the locale. This is the first component of the + * locale. + * + * Typically you should use the full locale rather than the language, as the + * same language can be used quite differently in different territories. + * + * Returns: the language string, e.g. `fr` + * + * Since: 3.22 + **/ +const gchar * +gs_plugin_get_language (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return priv->language; +} + +/** + * gs_plugin_set_language: + * @plugin: a #GsPlugin + * @language: a language string, e.g. "fr" + * + * Sets the plugin language. + * + * Since: 3.22 + **/ +void +gs_plugin_set_language (GsPlugin *plugin, const gchar *language) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_free (priv->language); + priv->language = g_strdup (language); +} + +/** + * gs_plugin_set_network_monitor: + * @plugin: a #GsPlugin + * @monitor: a #GNetworkMonitor + * + * Sets the network monitor so that plugins can check the state of the network. + * + * Since: 3.28 + **/ +void +gs_plugin_set_network_monitor (GsPlugin *plugin, GNetworkMonitor *monitor) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_set_object (&priv->network_monitor, monitor); +} + +/** + * gs_plugin_get_network_available: + * @plugin: a #GsPlugin + * + * Gets whether a network connectivity is available. + * + * Returns: %TRUE if a network is available. + * + * Since: 3.28 + **/ +gboolean +gs_plugin_get_network_available (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + if (priv->network_monitor == NULL) { + g_debug ("no network monitor, so returning network-available=TRUE"); + return TRUE; + } + return g_network_monitor_get_network_available (priv->network_monitor); +} + +/** + * gs_plugin_has_flags: + * @plugin: a #GsPlugin + * @flags: a #GsPluginFlags, e.g. %GS_PLUGIN_FLAGS_INTERACTIVE + * + * Finds out if a plugin has a specific flag set. + * + * Returns: TRUE if the flag is set + * + * Since: 3.22 + **/ +gboolean +gs_plugin_has_flags (GsPlugin *plugin, GsPluginFlags flags) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return (priv->flags & flags) > 0; +} + +/** + * gs_plugin_add_flags: + * @plugin: a #GsPlugin + * @flags: a #GsPluginFlags, e.g. %GS_PLUGIN_FLAGS_INTERACTIVE + * + * Adds specific flags to the plugin. + * + * Since: 3.22 + **/ +void +gs_plugin_add_flags (GsPlugin *plugin, GsPluginFlags flags) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + priv->flags |= flags; + g_object_notify_by_pspec (G_OBJECT (plugin), obj_props[PROP_FLAGS]); +} + +/** + * gs_plugin_remove_flags: + * @plugin: a #GsPlugin + * @flags: a #GsPluginFlags, e.g. %GS_PLUGIN_FLAGS_INTERACTIVE + * + * Removes specific flags from the plugin. + * + * Since: 3.22 + **/ +void +gs_plugin_remove_flags (GsPlugin *plugin, GsPluginFlags flags) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + priv->flags &= ~flags; + g_object_notify_by_pspec (G_OBJECT (plugin), obj_props[PROP_FLAGS]); +} + +/** + * gs_plugin_add_rule: + * @plugin: a #GsPlugin + * @rule: a #GsPluginRule, e.g. %GS_PLUGIN_RULE_CONFLICTS + * @name: a plugin name, e.g. "appstream" + * + * If the plugin name is found, the rule will be used to sort the plugin list, + * for example the plugin specified by @name will be ordered after this plugin + * when %GS_PLUGIN_RULE_RUN_AFTER is used. + * + * NOTE: The depsolver is iterative and may not solve overly-complicated rules; + * If depsolving fails then gnome-software will not start. + * + * Since: 3.22 + **/ +void +gs_plugin_add_rule (GsPlugin *plugin, GsPluginRule rule, const gchar *name) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_ptr_array_add (priv->rules[rule], g_strdup (name)); +} + +/** + * gs_plugin_get_rules: + * @plugin: a #GsPlugin + * @rule: a #GsPluginRule, e.g. %GS_PLUGIN_RULE_CONFLICTS + * + * Gets the plugin IDs that should be run after this plugin. + * + * Returns: (element-type utf8) (transfer none): the list of plugin names, e.g. ['appstream'] + * + * Since: 3.22 + **/ +GPtrArray * +gs_plugin_get_rules (GsPlugin *plugin, GsPluginRule rule) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + return priv->rules[rule]; +} + +/** + * gs_plugin_check_distro_id: + * @plugin: a #GsPlugin + * @distro_id: a distro ID, e.g. "fedora" + * + * Checks if the distro is compatible. + * + * Returns: %TRUE if compatible + * + * Since: 3.22 + **/ +gboolean +gs_plugin_check_distro_id (GsPlugin *plugin, const gchar *distro_id) +{ + g_autoptr(GError) error = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + const gchar *id = NULL; + + /* load /etc/os-release */ + os_release = gs_os_release_new (&error); + if (os_release == NULL) { + g_debug ("could not parse os-release: %s", error->message); + return FALSE; + } + + /* check that we are running on Fedora */ + id = gs_os_release_get_id (os_release); + if (id == NULL) { + g_debug ("could not get distro ID"); + return FALSE; + } + if (g_strcmp0 (id, distro_id) != 0) + return FALSE; + return TRUE; +} + +typedef struct { + GWeakRef plugin_weak; /* (element-type GsPlugin) */ + GsApp *app; /* (owned) */ + GsPluginStatus status; + guint percentage; +} GsPluginStatusHelper; + +static void +gs_plugin_status_helper_free (GsPluginStatusHelper *helper) +{ + g_weak_ref_clear (&helper->plugin_weak); + g_clear_object (&helper->app); + g_slice_free (GsPluginStatusHelper, helper); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginStatusHelper, gs_plugin_status_helper_free) + +static gboolean +gs_plugin_status_update_cb (gpointer user_data) +{ + GsPluginStatusHelper *helper = (GsPluginStatusHelper *) user_data; + g_autoptr(GsPlugin) plugin = NULL; + + /* Does the plugin still exist? */ + plugin = g_weak_ref_get (&helper->plugin_weak); + + if (plugin != NULL) + g_signal_emit (plugin, + signals[SIGNAL_STATUS_CHANGED], 0, + helper->app, + helper->status); + + return G_SOURCE_REMOVE; +} + +/** + * gs_plugin_status_update: + * @plugin: a #GsPlugin + * @app: a #GsApp, or %NULL + * @status: a #GsPluginStatus, e.g. %GS_PLUGIN_STATUS_DOWNLOADING + * + * Update the state of the plugin so any UI can be updated. + * + * Since: 3.22 + **/ +void +gs_plugin_status_update (GsPlugin *plugin, GsApp *app, GsPluginStatus status) +{ + g_autoptr(GsPluginStatusHelper) helper = NULL; + g_autoptr(GSource) idle_source = NULL; + + helper = g_slice_new0 (GsPluginStatusHelper); + g_weak_ref_init (&helper->plugin_weak, plugin); + helper->status = status; + if (app != NULL) + helper->app = g_object_ref (app); + + idle_source = g_idle_source_new (); + g_source_set_callback (idle_source, gs_plugin_status_update_cb, g_steal_pointer (&helper), (GDestroyNotify) gs_plugin_status_helper_free); + g_source_attach (idle_source, NULL); +} + +typedef struct { + GsPlugin *plugin; + gchar *remote; + gchar *realm; + GCallback callback; + gpointer user_data; +} GsPluginBasicAuthHelper; + +static gboolean +gs_plugin_basic_auth_start_cb (gpointer user_data) +{ + GsPluginBasicAuthHelper *helper = user_data; + g_signal_emit (helper->plugin, + signals[SIGNAL_BASIC_AUTH_START], 0, + helper->remote, + helper->realm, + helper->callback, + helper->user_data); + g_free (helper->remote); + g_free (helper->realm); + g_slice_free (GsPluginBasicAuthHelper, helper); + return FALSE; +} + +/** + * gs_plugin_basic_auth_start: + * @plugin: a #GsPlugin + * @remote: a string + * @realm: a string + * @callback: callback to invoke to submit the user/password + * @user_data: callback data to pass to the callback + * + * Emit the basic-auth-start signal in the main thread. + * + * Since: 3.38 + **/ +void +gs_plugin_basic_auth_start (GsPlugin *plugin, + const gchar *remote, + const gchar *realm, + GCallback callback, + gpointer user_data) +{ + GsPluginBasicAuthHelper *helper; + g_autoptr(GSource) idle_source = NULL; + + helper = g_slice_new0 (GsPluginBasicAuthHelper); + helper->plugin = plugin; + helper->remote = g_strdup (remote); + helper->realm = g_strdup (realm); + helper->callback = callback; + helper->user_data = user_data; + + idle_source = g_idle_source_new (); + g_source_set_callback (idle_source, gs_plugin_basic_auth_start_cb, helper, NULL); + g_source_attach (idle_source, NULL); +} + +static const gchar * +get_desktop_id_to_launch (GsApp *app) +{ + const gchar *desktop_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID); + if (desktop_id == NULL) + desktop_id = gs_app_get_id (app); + return desktop_id; +} + +static gboolean +launch_app_info (GAppInfo *appinfo, + GError **error) +{ + GdkDisplay *display; + g_autoptr(GAppLaunchContext) context = NULL; + + g_assert (appinfo != NULL); + + display = gdk_display_get_default (); + context = G_APP_LAUNCH_CONTEXT (gdk_display_get_app_launch_context (display)); + + return g_app_info_launch (appinfo, NULL, context, error); +} + +/** + * gs_plugin_app_launch_async: + * @plugin: a #GsPlugin + * @app: a #GsApp + * @flags: a bit-or of #GsPluginLaunchFlags + * @cancellable: a #GCancellable, or %NULL + * @callback: (not nullable): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure callback) (scope async): data to pass to @callback + * + * Asynchronously launches the application using #GAppInfo. + * Finish the call with gs_plugin_app_launch_finish(). + * + * The function also verifies whether the @plugin can handle the @app, + * in a sense of gs_app_has_management_plugin(), and if not then does + * nothing. + * + * Since: 47 + **/ +void +gs_plugin_app_launch_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + const gchar *desktop_id; + g_autoptr(GTask) task = NULL; + g_autoptr(GAppInfo) appinfo = NULL; + + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (callback != NULL); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_app_launch_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_pointer (task, NULL, NULL); + return; + } + + desktop_id = get_desktop_id_to_launch (app); + if (desktop_id == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no desktop file for app: %s", + gs_app_get_name (app)); + return; + } + appinfo = G_APP_INFO (gs_utils_get_desktop_app_info (desktop_id)); + if (appinfo == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no such desktop file: %s", + desktop_id); + return; + } + + /* the actual launch happens in the _finish() function, + which should be in the main thread */ + g_task_return_pointer (task, g_steal_pointer (&appinfo), g_object_unref); +} + +/** + * gs_plugin_app_launch_finish: + * @plugin: a #GsPlugin + * @result: an async result + * @error: a #GError or %NULL + * + * Finishes operation started by gs_plugin_app_launch_async(). + * This function should be called from the main thread. + * + * Returns: whether succeeded + * + * Since: 47 + **/ +gboolean +gs_plugin_app_launch_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + g_autoptr(GAppInfo) appinfo = NULL; + + g_return_val_if_fail (g_task_is_valid (G_TASK (result), plugin), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_plugin_app_launch_async), FALSE); + + appinfo = g_task_propagate_pointer (G_TASK (result), error); + if (appinfo == NULL) + return TRUE; + + return launch_app_info (appinfo, error); +} + +static GDesktopAppInfo * +check_directory_for_desktop_file (GsPlugin *plugin, + GsApp *app, + GsPluginPickDesktopFileCallback cb, + gpointer user_data, + const gchar *desktop_id, + const gchar *data_dir) +{ + g_autofree gchar *filename = NULL; + g_autoptr(GKeyFile) key_file = NULL; + gboolean found, any_found = FALSE; + + filename = g_build_filename (data_dir, "applications", desktop_id, NULL); + key_file = g_key_file_new (); + + found = g_key_file_load_from_file (key_file, filename, G_KEY_FILE_KEEP_TRANSLATIONS, NULL); + if (found && cb (plugin, app, filename, key_file, user_data)) { + g_autoptr(GDesktopAppInfo) appinfo = NULL; + g_debug ("Found '%s' for app '%s' and picked it", filename, desktop_id); + /* use the filename, not the key_file, to enable bus activation from the .desktop file */ + appinfo = g_desktop_app_info_new_from_filename (filename); + if (appinfo != NULL) + return g_steal_pointer (&appinfo); + g_debug ("Failed to load '%s' as a GDesktopAppInfo", filename); + return NULL; + } else if (found) { + g_debug ("Found '%s' for app '%s', but did not pick it", filename, desktop_id); + any_found = TRUE; + } + + if (!g_str_has_suffix (desktop_id, ".desktop")) { + g_autofree gchar *desktop_filename = g_strconcat (filename, ".desktop", NULL); + found = g_key_file_load_from_file (key_file, desktop_filename, G_KEY_FILE_KEEP_TRANSLATIONS, NULL); + if (found && cb (plugin, app, desktop_filename, key_file, user_data)) { + g_autoptr(GDesktopAppInfo) appinfo = NULL; + g_debug ("Found '%s' for app '%s' and picked it", desktop_filename, desktop_id); + /* use the filename, not the key_file, to enable bus activation from the .desktop file */ + appinfo = g_desktop_app_info_new_from_filename (desktop_filename); + if (appinfo != NULL) + return g_steal_pointer (&appinfo); + g_debug ("Failed to load '%s' as a GDesktopAppInfo", desktop_filename); + return NULL; + } else if (found) { + g_debug ("Found '%s' for app '%s', but did not pick it", desktop_filename, desktop_id); + any_found = TRUE; + } + } + + if (!any_found) + g_debug ("Did not find any appropriate .desktop file for '%s' in '%s/applications/'", desktop_id, data_dir); + return NULL; +} + +typedef struct { + GsApp *app; /* (owned) */ + GsPluginPickDesktopFileCallback cb; + gpointer cb_user_data; + GAppInfo *appinfo; /* (owned) (nullable) (out) */ +} LaunchFilteredData; + +static void +launch_filtered_data_free (LaunchFilteredData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->appinfo); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (LaunchFilteredData, launch_filtered_data_free) + +static void +launch_filtered_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + g_autoptr(GDesktopAppInfo) appinfo = NULL; + GsPlugin *plugin = GS_PLUGIN (source_object); + LaunchFilteredData *data = task_data; + const gchar *desktop_id; + + desktop_id = get_desktop_id_to_launch (data->app); + /* the caller verified it's set */ + g_assert (desktop_id != NULL); + + /* First, the configs. Highest priority: the user's ~/.config */ + appinfo = check_directory_for_desktop_file (plugin, data->app, data->cb, data->cb_user_data, desktop_id, g_get_user_config_dir ()); + + if (appinfo == NULL) { + /* Next, the system configs (/etc/xdg, and so on). */ + const gchar * const *dirs; + dirs = g_get_system_config_dirs (); + for (guint i = 0; dirs[i] && appinfo == NULL; i++) { + appinfo = check_directory_for_desktop_file (plugin, data->app, data->cb, data->cb_user_data, desktop_id, dirs[i]); + } + } + + if (appinfo == NULL) { + /* Now the data. Highest priority: the user's ~/.local/share/applications */ + appinfo = check_directory_for_desktop_file (plugin, data->app, data->cb, data->cb_user_data, desktop_id, g_get_user_data_dir ()); + } + + if (appinfo == NULL) { + /* Following that, XDG_DATA_DIRS/applications, in order */ + const gchar * const *dirs; + dirs = g_get_system_data_dirs (); + for (guint i = 0; dirs[i] && appinfo == NULL; i++) { + appinfo = check_directory_for_desktop_file (plugin, data->app, data->cb, data->cb_user_data, desktop_id, dirs[i]); + } + } + + if (appinfo == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no appropriate desktop file found: %s", + desktop_id); + return; + } + + /* the actual launch happens in the _finish() function, + which should be in the main thread */ + data->appinfo = (GAppInfo *) g_steal_pointer (&appinfo); + g_task_return_boolean (task, TRUE); +} + +/** + * gs_plugin_app_launch_filtered_async: + * @plugin: a #GsPlugin + * @app: a #GsApp to launch + * @flags: a bit-or of #GsPluginLaunchFlags + * @cb: a callback to pick the correct .desktop file + * @cb_user_data: (closure cb) (scope async): user data for the @cb + * @cancellable: a #GCancellable or %NULL + * @async_callback: (not nullable): async call ready callback + * @async_user_data: (closure async_callback) (scope async): user data for the @async_callback + * + * Asynchronosuly launches @app, using the .desktop file picked by the @cb. + * This can help in case multiple versions of the @app are installed + * in the system (like a Flatpak and RPM versions). + * Finish the call with gs_plugin_app_launch_filtered_finish(). + * + * The function also verifies whether the @plugin can handle the @app, + * in a sense of gs_app_has_management_plugin(), and if not then does + * nothing. + * + * Since: 47 + **/ +void +gs_plugin_app_launch_filtered_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GsPluginPickDesktopFileCallback cb, + gpointer cb_user_data, + GCancellable *cancellable, + GAsyncReadyCallback async_callback, + gpointer async_user_data) +{ + const gchar *desktop_id; + g_autoptr(GTask) task = NULL; + g_autoptr(LaunchFilteredData) data = NULL; + + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (cb != NULL); + g_return_if_fail (async_callback != NULL); + + task = g_task_new (plugin, cancellable, async_callback, async_user_data); + g_task_set_source_tag (task, gs_plugin_app_launch_filtered_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + desktop_id = get_desktop_id_to_launch (app); + if (desktop_id == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no desktop file for app: %s", + gs_app_get_name (app)); + return; + } + + data = g_new0 (LaunchFilteredData, 1); + data->app = g_object_ref (app); + data->cb = cb; + data->cb_user_data = cb_user_data; + + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) launch_filtered_data_free); + g_task_run_in_thread (task, launch_filtered_thread); +} + +/** + * gs_plugin_app_launch_filtered_finish: + * @plugin: a #GsPlugin + * @result: an async result + * @error: a #GError or %NULL + * + * Finishes operation started by gs_plugin_app_launch_finltered_async(). + * This function should be called from the main thread. + * + * Returns: whether succeeded + * + * Since: 47 + **/ +gboolean +gs_plugin_app_launch_filtered_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + GTask *task = G_TASK (result); + LaunchFilteredData *data = NULL; + + g_return_val_if_fail (g_task_is_valid (task, plugin), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_plugin_app_launch_filtered_async), FALSE); + + if (!g_task_propagate_boolean (task, error)) + return FALSE; + + data = g_task_get_task_data (task); + /* the plugin does not manage the provided app */ + if (data == NULL) + return TRUE; + + return launch_app_info (data->appinfo, error); +} + +static void +weak_ref_free (GWeakRef *weak) +{ + g_weak_ref_clear (weak); + g_free (weak); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GWeakRef, weak_ref_free) + +/* @obj is a gpointer rather than a GObject* to avoid the need for casts */ +static GWeakRef * +weak_ref_new (gpointer obj) +{ + g_autoptr(GWeakRef) weak = g_new0 (GWeakRef, 1); + g_weak_ref_init (weak, obj); + return g_steal_pointer (&weak); +} + +static gboolean +gs_plugin_updates_changed_cb (gpointer user_data) +{ + GWeakRef *plugin_weak = user_data; + g_autoptr(GsPlugin) plugin = NULL; + + plugin = g_weak_ref_get (plugin_weak); + if (plugin != NULL) + g_signal_emit (plugin, signals[SIGNAL_UPDATES_CHANGED], 0); + + return G_SOURCE_REMOVE; +} + +/** + * gs_plugin_updates_changed: + * @plugin: a #GsPlugin + * + * Emit a signal that tells the plugin loader that the list of updates + * may have changed. + * + * Since: 3.22 + **/ +void +gs_plugin_updates_changed (GsPlugin *plugin) +{ + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, gs_plugin_updates_changed_cb, + weak_ref_new (plugin), (GDestroyNotify) weak_ref_free); +} + +static gboolean +gs_plugin_reload_cb (gpointer user_data) +{ + GWeakRef *plugin_weak = user_data; + g_autoptr(GsPlugin) plugin = NULL; + + plugin = g_weak_ref_get (plugin_weak); + if (plugin != NULL) + g_signal_emit (plugin, signals[SIGNAL_RELOAD], 0); + + return G_SOURCE_REMOVE; +} + +/** + * gs_plugin_reload: + * @plugin: a #GsPlugin + * + * Plugins that call this function should expect that all panels will + * reload after a small delay, causing mush flashing, wailing and + * gnashing of teeth. + * + * Plugins should not call this unless absolutely required. + * + * Since: 3.22 + **/ +void +gs_plugin_reload (GsPlugin *plugin) +{ + g_debug ("emitting %s::reload in idle", gs_plugin_get_name (plugin)); + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, gs_plugin_reload_cb, + weak_ref_new (plugin), (GDestroyNotify) weak_ref_free); +} + +/** + * gs_plugin_cache_lookup: + * @plugin: a #GsPlugin + * @key: a string + * + * Looks up an application object from the per-plugin cache + * + * Returns: (transfer full) (nullable): the #GsApp, or %NULL + * + * Since: 3.22 + **/ +GsApp * +gs_plugin_cache_lookup (GsPlugin *plugin, const gchar *key) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + GsApp *app; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), NULL); + g_return_val_if_fail (key != NULL, NULL); + + locker = g_mutex_locker_new (&priv->cache_mutex); + app = g_hash_table_lookup (priv->cache, key); + if (app == NULL) + return NULL; + return g_object_ref (app); +} + +/** + * gs_plugin_cache_lookup_by_state: + * @plugin: a #GsPlugin + * @list: a #GsAppList to add applications to + * @state: a #GsAppState + * + * Adds each cached #GsApp with state @state into the @list. + * When the state is %GS_APP_STATE_UNKNOWN, then adds all + * cached applications. + * + * Since: 40 + **/ +void +gs_plugin_cache_lookup_by_state (GsPlugin *plugin, + GsAppList *list, + GsAppState state) +{ + GsPluginPrivate *priv; + GHashTableIter iter; + gpointer value; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_return_if_fail (GS_IS_APP_LIST (list)); + + priv = gs_plugin_get_instance_private (plugin); + locker = g_mutex_locker_new (&priv->cache_mutex); + + g_hash_table_iter_init (&iter, priv->cache); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GsApp *app = value; + + if (state == GS_APP_STATE_UNKNOWN || + state == gs_app_get_state (app)) + gs_app_list_add (list, app); + } +} + +/** + * gs_plugin_cache_remove: + * @plugin: a #GsPlugin + * @key: a key which matches + * + * Removes an application from the per-plugin cache. + * + * Since: 3.22 + **/ +void +gs_plugin_cache_remove (GsPlugin *plugin, const gchar *key) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_return_if_fail (key != NULL); + + locker = g_mutex_locker_new (&priv->cache_mutex); + g_hash_table_remove (priv->cache, key); +} + +/** + * gs_plugin_cache_add: + * @plugin: a #GsPlugin + * @key: a string, or %NULL if the unique ID should be used + * @app: a #GsApp + * + * Adds an application to the per-plugin cache. This is optional, + * and the plugin can use the cache however it likes. + * + * Since: 3.22 + **/ +void +gs_plugin_cache_add (GsPlugin *plugin, const gchar *key, GsApp *app) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_return_if_fail (GS_IS_APP (app)); + + locker = g_mutex_locker_new (&priv->cache_mutex); + + /* the user probably doesn't want to do this */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) { + g_warning ("adding wildcard app %s to plugin cache", + gs_app_get_unique_id (app)); + } + + /* default */ + if (key == NULL) + key = gs_app_get_unique_id (app); + + g_return_if_fail (key != NULL); + + if (g_hash_table_lookup (priv->cache, key) == app) + return; + g_hash_table_insert (priv->cache, g_strdup (key), g_object_ref (app)); +} + +/** + * gs_plugin_cache_invalidate: + * @plugin: a #GsPlugin + * + * Invalidate the per-plugin cache by marking all entries as invalid. + * This is optional, and the plugin can evict the cache whenever it + * likes. Using this function may mean the front-end and the plugin + * may be operating on a different GsApp with the same cache ID. + * + * Most plugins do not need to call this function; if a suitable cache + * key is being used the old cache item can remain. + * + * Since: 3.22 + **/ +void +gs_plugin_cache_invalidate (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_PLUGIN (plugin)); + + locker = g_mutex_locker_new (&priv->cache_mutex); + g_hash_table_remove_all (priv->cache); +} + +/** + * gs_plugin_list_cached: + * @plugin: a #GsPlugin + * + * Lists all apps cached by the @plugin. + * + * Returns: (transfer full): a #GsAppList with all currently cached apps + * + * Since: 46 + **/ +GsAppList * +gs_plugin_list_cached (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + GsAppList *list = NULL; + GHashTableIter iter; + gpointer value = NULL; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), NULL); + + locker = g_mutex_locker_new (&priv->cache_mutex); + list = gs_app_list_new (); + + g_hash_table_iter_init (&iter, priv->cache); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GsApp *app = value; + gs_app_list_add (list, app); + } + + return list; +} + +/** + * gs_plugin_report_event: + * @plugin: a #GsPlugin + * @event: a #GsPluginEvent + * + * Report a non-fatal event to the UI. Plugins should not assume that a + * specific event is actually shown to the user as it may be ignored + * automatically. + * + * Since: 3.24 + **/ +void +gs_plugin_report_event (GsPlugin *plugin, GsPluginEvent *event) +{ + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_return_if_fail (GS_IS_PLUGIN_EVENT (event)); + g_signal_emit (plugin, signals[SIGNAL_REPORT_EVENT], 0, event); +} + +/** + * gs_plugin_set_allow_updates: + * @plugin: a #GsPlugin + * @allow_updates: boolean + * + * This allows plugins to inhibit the showing of the updates panel. + * This will typically be used when the required permissions are not possible + * to obtain, or when a LiveUSB image is low on space. + * + * By default, the updates panel is shown so plugins do not need to call this + * function unless they called gs_plugin_set_allow_updates() with %FALSE. + * + * Since: 3.24 + **/ +void +gs_plugin_set_allow_updates (GsPlugin *plugin, gboolean allow_updates) +{ + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_signal_emit (plugin, signals[SIGNAL_ALLOW_UPDATES], 0, allow_updates); +} + +/** + * gs_plugin_error_to_string: + * @error: a #GsPluginError, e.g. %GS_PLUGIN_ERROR_NO_NETWORK + * + * Converts the enumerated error to a string. + * + * Returns: a string, or %NULL for invalid + **/ +const gchar * +gs_plugin_error_to_string (GsPluginError error) +{ + if (error == GS_PLUGIN_ERROR_FAILED) + return "failed"; + if (error == GS_PLUGIN_ERROR_NOT_SUPPORTED) + return "not-supported"; + if (error == GS_PLUGIN_ERROR_CANCELLED) + return "cancelled"; + if (error == GS_PLUGIN_ERROR_NO_NETWORK) + return "no-network"; + if (error == GS_PLUGIN_ERROR_NO_SECURITY) + return "no-security"; + if (error == GS_PLUGIN_ERROR_NO_SPACE) + return "no-space"; + if (error == GS_PLUGIN_ERROR_AUTH_REQUIRED) + return "auth-required"; + if (error == GS_PLUGIN_ERROR_AUTH_INVALID) + return "auth-invalid"; + if (error == GS_PLUGIN_ERROR_PLUGIN_DEPSOLVE_FAILED) + return "plugin-depsolve-failed"; + if (error == GS_PLUGIN_ERROR_DOWNLOAD_FAILED) + return "download-failed"; + if (error == GS_PLUGIN_ERROR_WRITE_FAILED) + return "write-failed"; + if (error == GS_PLUGIN_ERROR_INVALID_FORMAT) + return "invalid-format"; + if (error == GS_PLUGIN_ERROR_DELETE_FAILED) + return "delete-failed"; + if (error == GS_PLUGIN_ERROR_RESTART_REQUIRED) + return "restart-required"; + if (error == GS_PLUGIN_ERROR_AC_POWER_REQUIRED) + return "ac-power-required"; + if (error == GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW) + return "battery-level-too-low"; + if (error == GS_PLUGIN_ERROR_TIMED_OUT) + return "timed-out"; + return NULL; +} + +/** + * gs_plugin_action_to_function_name: (skip) + * @action: a #GsPluginAction + * + * Converts the enumerated action to the vfunc name. + * + * Returns: a string, or %NULL for invalid + **/ +const gchar * +gs_plugin_action_to_function_name (GsPluginAction action) +{ + if (action == GS_PLUGIN_ACTION_GET_LANGPACKS) + return "gs_plugin_add_langpacks"; + return NULL; +} + +/** + * gs_plugin_action_to_string: + * @action: a #GsPluginAction + * + * Converts the enumerated action to a string. + * + * Returns: a string, or %NULL for invalid + **/ +const gchar * +gs_plugin_action_to_string (GsPluginAction action) +{ + if (action == GS_PLUGIN_ACTION_UNKNOWN) + return "unknown"; + if (action == GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD) + return "upgrade-download"; + if (action == GS_PLUGIN_ACTION_LAUNCH) + return "launch"; + if (action == GS_PLUGIN_ACTION_FILE_TO_APP) + return "file-to-app"; + if (action == GS_PLUGIN_ACTION_URL_TO_APP) + return "url-to-app"; + if (action == GS_PLUGIN_ACTION_GET_LANGPACKS) + return "get-langpacks"; + if (action == GS_PLUGIN_ACTION_INSTALL_REPO) + return "repo-install"; + if (action == GS_PLUGIN_ACTION_REMOVE_REPO) + return "repo-remove"; + if (action == GS_PLUGIN_ACTION_ENABLE_REPO) + return "repo-enable"; + if (action == GS_PLUGIN_ACTION_DISABLE_REPO) + return "repo-disable"; + return NULL; +} + +/** + * gs_plugin_action_from_string: + * @action: a #GsPluginAction, e.g. "install" + * + * Converts the string to an enumerated action. + * + * Returns: a #GsPluginAction. + * + * Since: 3.26 + **/ +GsPluginAction +gs_plugin_action_from_string (const gchar *action) +{ + if (g_strcmp0 (action, "upgrade-download") == 0) + return GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD; + if (g_strcmp0 (action, "launch") == 0) + return GS_PLUGIN_ACTION_LAUNCH; + if (g_strcmp0 (action, "file-to-app") == 0) + return GS_PLUGIN_ACTION_FILE_TO_APP; + if (g_strcmp0 (action, "url-to-app") == 0) + return GS_PLUGIN_ACTION_URL_TO_APP; + if (g_strcmp0 (action, "get-langpacks") == 0) + return GS_PLUGIN_ACTION_GET_LANGPACKS; + if (g_strcmp0 (action, "repo-install") == 0) + return GS_PLUGIN_ACTION_INSTALL_REPO; + if (g_strcmp0 (action, "repo-remove") == 0) + return GS_PLUGIN_ACTION_REMOVE_REPO; + if (g_strcmp0 (action, "repo-enable") == 0) + return GS_PLUGIN_ACTION_ENABLE_REPO; + if (g_strcmp0 (action, "repo-disable") == 0) + return GS_PLUGIN_ACTION_DISABLE_REPO; + return GS_PLUGIN_ACTION_UNKNOWN; +} + +/** + * gs_plugin_refine_flags_to_string: + * @refine_flags: some #GsPluginRefineFlags, e.g. %GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE + * + * Converts the flags to a string. + * + * Returns: a string + **/ +gchar * +gs_plugin_refine_flags_to_string (GsPluginRefineFlags refine_flags) +{ + g_autoptr(GPtrArray) cstrs = g_ptr_array_new (); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID) + g_ptr_array_add (cstrs, (gpointer) "require-id"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) + g_ptr_array_add (cstrs, (gpointer) "require-license"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL) + g_ptr_array_add (cstrs, (gpointer) "require-url"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION) + g_ptr_array_add (cstrs, (gpointer) "require-description"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) + g_ptr_array_add (cstrs, (gpointer) "require-size"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING) + g_ptr_array_add (cstrs, (gpointer) "require-rating"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION) + g_ptr_array_add (cstrs, (gpointer) "require-version"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY) + g_ptr_array_add (cstrs, (gpointer) "require-history"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION) + g_ptr_array_add (cstrs, (gpointer) "require-setup-action"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS) + g_ptr_array_add (cstrs, (gpointer) "require-update-details"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN) + g_ptr_array_add (cstrs, (gpointer) "require-origin"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED) + g_ptr_array_add (cstrs, (gpointer) "require-related"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS) + g_ptr_array_add (cstrs, (gpointer) "require-addons"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_ALLOW_PACKAGES) + g_ptr_array_add (cstrs, (gpointer) "require-allow-packages"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY) + g_ptr_array_add (cstrs, (gpointer) "require-update-severity"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPGRADE_REMOVED) + g_ptr_array_add (cstrs, (gpointer) "require-upgrade-removed"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) + g_ptr_array_add (cstrs, (gpointer) "require-provenance"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS) + g_ptr_array_add (cstrs, (gpointer) "require-reviews"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS) + g_ptr_array_add (cstrs, (gpointer) "require-review-ratings"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) + g_ptr_array_add (cstrs, (gpointer) "require-icon"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS) + g_ptr_array_add (cstrs, (gpointer) "require-permissions"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME) + g_ptr_array_add (cstrs, (gpointer) "require-origin-hostname"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI) + g_ptr_array_add (cstrs, (gpointer) "require-origin-ui"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME) + g_ptr_array_add (cstrs, (gpointer) "require-runtime"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS) + g_ptr_array_add (cstrs, (gpointer) "require-screenshots"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES) + g_ptr_array_add (cstrs, (gpointer) "require-categories"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROJECT_GROUP) + g_ptr_array_add (cstrs, (gpointer) "require-project-group"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME) + g_ptr_array_add (cstrs, (gpointer) "require-developer-name"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) + g_ptr_array_add (cstrs, (gpointer) "require-kudos"); + if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_CONTENT_RATING) + g_ptr_array_add (cstrs, (gpointer) "content-rating"); + if (cstrs->len == 0) + return g_strdup ("none"); + g_ptr_array_add (cstrs, NULL); + return g_strjoinv (",", (gchar**) cstrs->pdata); +} + +static void +gs_plugin_constructed (GObject *object) +{ + GsPlugin *plugin = GS_PLUGIN (object); + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + + G_OBJECT_CLASS (gs_plugin_parent_class)->constructed (object); + + /* Check all required properties have been set. */ + g_assert (priv->session_bus_connection != NULL); + g_assert (priv->system_bus_connection != NULL); +} + +static void +gs_plugin_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsPlugin *plugin = GS_PLUGIN (object); + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + + switch ((GsPluginProperty) prop_id) { + case PROP_FLAGS: + priv->flags = g_value_get_flags (value); + g_object_notify_by_pspec (G_OBJECT (plugin), obj_props[PROP_FLAGS]); + break; + case PROP_SCALE: + gs_plugin_set_scale (plugin, g_value_get_uint (value)); + break; + case PROP_SESSION_BUS_CONNECTION: + /* Construct only */ + g_assert (priv->session_bus_connection == NULL); + priv->session_bus_connection = g_value_dup_object (value); + break; + case PROP_SYSTEM_BUS_CONNECTION: + /* Construct only */ + g_assert (priv->system_bus_connection == NULL); + priv->system_bus_connection = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsPlugin *plugin = GS_PLUGIN (object); + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + + switch ((GsPluginProperty) prop_id) { + case PROP_FLAGS: + g_value_set_flags (value, priv->flags); + break; + case PROP_SCALE: + g_value_set_uint (value, gs_plugin_get_scale (plugin)); + break; + case PROP_SESSION_BUS_CONNECTION: + g_value_set_object (value, priv->session_bus_connection); + break; + case PROP_SYSTEM_BUS_CONNECTION: + g_value_set_object (value, priv->system_bus_connection); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_plugin_class_init (GsPluginClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = gs_plugin_constructed; + object_class->set_property = gs_plugin_set_property; + object_class->get_property = gs_plugin_get_property; + object_class->dispose = gs_plugin_dispose; + object_class->finalize = gs_plugin_finalize; + + /** + * GsPlugin:flags: + * + * Flags which indicate various boolean properties of the plugin. + * + * These may change during the plugin’s lifetime. + */ + obj_props[PROP_FLAGS] = + g_param_spec_flags ("flags", NULL, NULL, + GS_TYPE_PLUGIN_FLAGS, GS_PLUGIN_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPlugin:scale: + * + * The window scale factor. + * + * These may change during the plugin’s lifetime. + * + * Since: 48 + */ + obj_props[PROP_SCALE] = + g_param_spec_uint ("scale", NULL, NULL, + 1, G_MAXUINT, 1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPlugin:session-bus-connection: (not nullable) + * + * A connection to the D-Bus session bus. + * + * This must be set at construction time and will not be %NULL + * afterwards. + * + * Since: 43 + */ + obj_props[PROP_SESSION_BUS_CONNECTION] = + g_param_spec_object ("session-bus-connection", NULL, NULL, + G_TYPE_DBUS_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsPlugin:system-bus-connection: (not nullable) + * + * A connection to the D-Bus system bus. + * + * This must be set at construction time and will not be %NULL + * afterwards. + * + * Since: 43 + */ + obj_props[PROP_SYSTEM_BUS_CONNECTION] = + g_param_spec_object ("system-bus-connection", NULL, NULL, + G_TYPE_DBUS_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + signals [SIGNAL_UPDATES_CHANGED] = + g_signal_new ("updates-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsPluginClass, updates_changed), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals [SIGNAL_STATUS_CHANGED] = + g_signal_new ("status-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsPluginClass, status_changed), + NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 2, GS_TYPE_APP, G_TYPE_UINT); + + signals [SIGNAL_RELOAD] = + g_signal_new ("reload", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsPluginClass, reload), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals [SIGNAL_REPORT_EVENT] = + g_signal_new ("report-event", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsPluginClass, report_event), + NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 1, GS_TYPE_PLUGIN_EVENT); + + signals [SIGNAL_ALLOW_UPDATES] = + g_signal_new ("allow-updates", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsPluginClass, allow_updates), + NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + signals [SIGNAL_BASIC_AUTH_START] = + g_signal_new ("basic-auth-start", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsPluginClass, basic_auth_start), + NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER); + + signals [SIGNAL_REPOSITORY_CHANGED] = + g_signal_new ("repository-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsPluginClass, repository_changed), + NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 1, GS_TYPE_APP); + + signals [SIGNAL_ASK_UNTRUSTED] = + g_signal_new ("ask-untrusted", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsPluginClass, ask_untrusted), + NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); +} + +static void +gs_plugin_init (GsPlugin *plugin) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (plugin); + guint i; + + for (i = 0; i < GS_PLUGIN_RULE_LAST; i++) + priv->rules[i] = g_ptr_array_new_with_free_func (g_free); + + priv->enabled = TRUE; + priv->scale = 1; + priv->cache = g_hash_table_new_full ((GHashFunc) as_utils_data_id_hash, + (GEqualFunc) as_utils_data_id_equal, + g_free, + (GDestroyNotify) g_object_unref); + priv->vfuncs = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + g_mutex_init (&priv->cache_mutex); + g_mutex_init (&priv->interactive_mutex); + g_mutex_init (&priv->timer_mutex); + g_mutex_init (&priv->vfuncs_mutex); +} + +/** + * gs_plugin_new: + * @session_bus_connection: (not nullable) (transfer none): a session bus + * connection to use + * @system_bus_connection: (not nullable) (transfer none): a system bus + * connection to use + * + * Creates a new plugin. + * + * Returns: a #GsPlugin + * + * Since: 43 + **/ +GsPlugin * +gs_plugin_new (GDBusConnection *session_bus_connection, + GDBusConnection *system_bus_connection) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (session_bus_connection), NULL); + g_return_val_if_fail (G_IS_DBUS_CONNECTION (system_bus_connection), NULL); + + return g_object_new (GS_TYPE_PLUGIN, + "session-bus-connection", session_bus_connection, + "system-bus-connection", system_bus_connection, + NULL); +} + +typedef struct { + GWeakRef plugin_weak; /* (owned) (element-type GsPlugin) */ + GsApp *repository; /* (owned) */ +} GsPluginRepositoryChangedHelper; + +static void +gs_plugin_repository_changed_helper_free (GsPluginRepositoryChangedHelper *helper) +{ + g_clear_object (&helper->repository); + g_weak_ref_clear (&helper->plugin_weak); + g_slice_free (GsPluginRepositoryChangedHelper, helper); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GsPluginRepositoryChangedHelper, gs_plugin_repository_changed_helper_free) + +static gboolean +gs_plugin_repository_changed_cb (gpointer user_data) +{ + GsPluginRepositoryChangedHelper *helper = user_data; + g_autoptr(GsPlugin) plugin = NULL; + + plugin = g_weak_ref_get (&helper->plugin_weak); + if (plugin != NULL) + g_signal_emit (plugin, + signals[SIGNAL_REPOSITORY_CHANGED], 0, + helper->repository); + + return G_SOURCE_REMOVE; +} + +/** + * gs_plugin_repository_changed: + * @plugin: a #GsPlugin + * @repository: a #GsApp representing the repository + * + * Emit the "repository-changed" signal in the main thread. + * + * Since: 40 + **/ +void +gs_plugin_repository_changed (GsPlugin *plugin, + GsApp *repository) +{ + g_autoptr(GsPluginRepositoryChangedHelper) helper = NULL; + g_autoptr(GSource) idle_source = NULL; + + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_return_if_fail (GS_IS_APP (repository)); + + helper = g_slice_new0 (GsPluginRepositoryChangedHelper); + g_weak_ref_init (&helper->plugin_weak, plugin); + helper->repository = g_object_ref (repository); + + idle_source = g_idle_source_new (); + g_source_set_callback (idle_source, gs_plugin_repository_changed_cb, g_steal_pointer (&helper), (GDestroyNotify) gs_plugin_repository_changed_helper_free); + g_source_attach (idle_source, NULL); +} + +/** + * gs_plugin_update_cache_state_for_repository: + * @plugin: a #GsPlugin + * @repository: a #GsApp representing a repository, which changed + * + * Update state of the all cached #GsApp instances related + * to the @repository. + * + * Since: 40 + **/ +void +gs_plugin_update_cache_state_for_repository (GsPlugin *plugin, + GsApp *repository) +{ + GsPluginPrivate *priv; + GHashTableIter iter; + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GsPlugin) repo_plugin = NULL; + gpointer value; + const gchar *repo_id; + GsAppState repo_state; + + g_return_if_fail (GS_IS_PLUGIN (plugin)); + g_return_if_fail (GS_IS_APP (repository)); + + priv = gs_plugin_get_instance_private (plugin); + repo_id = gs_app_get_id (repository); + repo_state = gs_app_get_state (repository); + repo_plugin = gs_app_dup_management_plugin (repository); + + locker = g_mutex_locker_new (&priv->cache_mutex); + + g_hash_table_iter_init (&iter, priv->cache); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GsApp *app = value; + GsAppState app_state = gs_app_get_state (app); + g_autoptr(GsPlugin) app_plugin = gs_app_dup_management_plugin (app); + + if (app_plugin != repo_plugin || + gs_app_get_scope (app) != gs_app_get_scope (repository) || + gs_app_get_bundle_kind (app) != gs_app_get_bundle_kind (repository)) + continue; + + if (((app_state == GS_APP_STATE_AVAILABLE && + repo_state != GS_APP_STATE_INSTALLED) || + (app_state == GS_APP_STATE_UNAVAILABLE && + repo_state == GS_APP_STATE_INSTALLED)) && + g_strcmp0 (gs_app_get_origin (app), repo_id) == 0) { + /* First reset the state, because move from 'available' to 'unavailable' is not correct */ + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + gs_app_set_state (app, repo_state == GS_APP_STATE_INSTALLED ? GS_APP_STATE_AVAILABLE : GS_APP_STATE_UNAVAILABLE); + } + } +} + +/** + * gs_plugin_ask_untrusted: + * @plugin: a #GsPlugin + * @title: the title for the question + * @msg: the message for the question + * @details: (nullable): the detailed error message, or %NULL for none + * @accept_label: (nullable): a label of the 'accept' button, or %NULL to use 'Accept' + * + * Asks the user whether he/she accepts an untrusted package install/download/update, + * as described by @title and @msg, eventually with the @details. + * + * Note: This is a blocking call and can be called only from the main/GUI thread. + * + * Returns: whether the user accepted the question + * + * Since: 42 + **/ +gboolean +gs_plugin_ask_untrusted (GsPlugin *plugin, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label) +{ + gboolean accepts = FALSE; + g_signal_emit (plugin, + signals[SIGNAL_ASK_UNTRUSTED], 0, + title, + msg, + details, + accept_label, + &accepts); + return accepts; +} + +/** + * gs_plugin_get_session_bus_connection: + * @self: a #GsPlugin + * + * Get the D-Bus session bus connection in use by the plugin. + * + * Returns: (transfer none) (not nullable): a D-Bus connection + * Since: 43 + */ +GDBusConnection * +gs_plugin_get_session_bus_connection (GsPlugin *self) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (self); + + g_return_val_if_fail (GS_IS_PLUGIN (self), NULL); + + return priv->session_bus_connection; +} + +/** + * gs_plugin_get_system_bus_connection: + * @self: a #GsPlugin + * + * Get the D-Bus system bus connection in use by the plugin. + * + * Returns: (transfer none) (not nullable): a D-Bus connection + * Since: 43 + */ +GDBusConnection * +gs_plugin_get_system_bus_connection (GsPlugin *self) +{ + GsPluginPrivate *priv = gs_plugin_get_instance_private (self); + + g_return_val_if_fail (GS_IS_PLUGIN (self), NULL); + + return priv->system_bus_connection; +} diff --git a/lib/gs-plugin.h b/lib/gs-plugin.h new file mode 100644 index 0000000..eeec3a3 --- /dev/null +++ b/lib/gs-plugin.h @@ -0,0 +1,475 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012-2016 Richard Hughes + * Copyright (C) 2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" +#include "gs-app-list.h" +#include "gs-app-query.h" +#include "gs-category.h" +#include "gs-plugin-event.h" +#include "gs-plugin-types.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN (gs_plugin_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsPlugin, gs_plugin, GS, PLUGIN, GObject) + +/** + * GsPluginClass: + * @setup_async: (nullable): Setup method for the plugin. This is called after + * the #GsPlugin object is constructed, before it’s used for anything. It + * should do any long-running setup operations which the plugin needs, such as + * file or network access. It may be %NULL if the plugin doesn’t need to be + * explicitly shut down. It is not called if the plugin is disabled during + * construction. + * @setup_finish: (nullable): Finish method for @setup_async. Must be + * implemented if @setup_async is implemented. If this returns an error, the + * plugin will be disabled. + * @shutdown_async: (nullable): Shutdown method for the plugin. This is called + * by the #GsPluginLoader when the process is terminating or the + * #GsPluginLoader is being destroyed. It should be used to cancel or stop any + * ongoing operations or threads in the plugin. It may be %NULL if the plugin + * doesn’t need to be explicitly shut down. + * @shutdown_finish: (nullable): Finish method for @shutdown_async. Must be + * implemented if @shutdown_async is implemented. + * @refine_async: (nullable): Refining looks up and adds data to #GsApps. The + * apps to refine are provided in a list, and the flags specify what data to + * look up and add. Refining certain kinds of data can be very expensive (for + * example, requiring network requests), which is why it’s not all loaded by + * default. By refining multiple apps at once, data requests can be + * batched by the plugin where possible. (Since: 43) + * @refine_finish: (nullable): Finish method for @refine_async. Must be + * implemented if @refine_async is implemented. (Since: 43) + * @list_apps_async: (nullable): List apps matching a given query. (Since: 43) + * @list_apps_finish: (nullable): Finish method for @list_apps_async. Must be + * implemented if @list_apps_async is implemented. (Since: 43) + * @refresh_metadata_async: (nullable): Refresh plugin metadata. (Since: 43) + * @refresh_metadata_finish: (nullable): Finish method for + * @refresh_metadata_async. Must be implemented if @refresh_metadata_async is + * implemented. (Since: 43) + * @list_distro_upgrades_async: (nullable): List available distro upgrades. (Since: 43) + * @list_distro_upgrades_finish: (nullable): Finish method for + * @list_distro_upgrades_async. Must be implemented if + * @list_distro_upgrades_async is implemented. (Since: 43) + * @install_repository_async: (nullable): Install repository. (Since: 43) + * @install_repository_finish: (nullable): Finish method for + * @install_repository_async. Must be implemented if + * @install_repository_async is implemented. (Since: 43) + * @remove_repository_async: (nullable): Remove repository. (Since: 43) + * @remove_repository_finish: (nullable): Finish method for + * @remove_repository_async. Must be implemented if + * @remove_repository_async is implemented. (Since: 43) + * @enable_repository_async: (nullable): Enable repository. (Since: 43) + * @enable_repository_finish: (nullable): Finish method for + * @enable_repository_async. Must be implemented if + * @enable_repository_async is implemented. (Since: 43) + * @disable_repository_async: (nullable): Disable repository. (Since: 43) + * @disable_repository_finish: (nullable): Finish method for + * @disable_repository_async. Must be implemented if + * @disable_repository_async is implemented. (Since: 43) + * @refine_categories_async: (nullable): Refining looks up and adds data to + * #GsCategorys. The categories to refine are provided in a list, and the + * flags specify what data to look up and add. Refining certain kinds of data + * can be very expensive (for example, requiring network requests), which is + * why it’s not all loaded by default. By refining multiple categories at + * once, data requests can be batched by the plugin where possible. (Since: 43) + * @refine_categories_finish: (nullable): Finish method for + * @refine_categories_async. Must be implemented if @refine_categories_async + * is implemented. (Since: 43) + * @update_apps_async: (nullable): Update apps or the OS, or download updates + * ready for installation. (Since: 44) + * @update_apps_finish: (nullable): Finish method for @update_apps_async. Must + * be implemented if @update_apps_async is implemented. (Since: 44) + * @install_apps_async: (nullable): Install apps, or download them ready for + * installation. (Since: 47) + * @install_apps_finish: (nullable): Finish method for @install_apps_async. Must + * be implemented if @install_apps_async is implemented. (Since: 47) + * @uninstall_apps_async: (nullable): Uninstall apps. (Since: 47) + * @uninstall_apps_finish: (nullable): Finish method for @uninstall_apps_async. + * Must be implemented if @uninstall_apps_async is implemented. (Since: 47) + * @cancel_offline_update_async: (nullable): Cancels the pending offline update. (Since: 47) + * @cancel_offline_update_finish: (nullable): Finish method for + * @cancel_offline_update_async. Must be implemented if + * @cancel_offline_update_async is implemented. (Since: 47) + * @download_upgrade_async: (nullable): Start download of a distribution upgrade + * in the background. (Since: 47) + * @download_upgrade_finish: (nullable): Finish method for + * @download_upgrade_async. Must be implemented if + * @download_upgrade_async is implemented. (Since: 47) + * @trigger_upgrade_async: (nullable): Triggers the distribution upgrade to be + * installed on next boot. (Since: 47) + * @trigger_upgrade_finish: (nullable): Finish method for + * @trigger_upgrade_async. Must be implemented if + * @trigger_upgrade_async is implemented. (Since: 47) + * @launch_async: (nullable): Launch the specified app using a plugin-specific method. (Since: 47) + * @launch_finish: (nullable): Finish method for + * @launch_async. Must be implemented if + * @launch_async is implemented. (Since: 47) + * @file_to_app_async: (nullable): Converts a local file to a #GsApp. (Since: 47) + * @file_to_app_finish: (nullable): Finish method for + * @file_to_app_async. Must be implemented if + * @file_to_app_async is implemented. (Since: 47) + * @url_to_app_async: (nullable): Converts a URL to a #GsApp. (Since: 47) + * @url_to_app_finish: (nullable): Finish method for + * @url_to_app_async. Must be implemented if + * @url_to_app_async is implemented. (Since: 47) + * + * The class structure for a #GsPlugin. Virtual methods here should be + * implemented by plugin implementations derived from #GsPlugin to provide their + * plugin-specific behaviour. + */ +struct _GsPluginClass +{ + GObjectClass parent_class; + void (*updates_changed) (GsPlugin *plugin); + void (*status_changed) (GsPlugin *plugin, + GsApp *app, + guint status); + void (*reload) (GsPlugin *plugin); + void (*report_event) (GsPlugin *plugin, + GsPluginEvent *event); + void (*allow_updates) (GsPlugin *plugin, + gboolean allow_updates); + void (*basic_auth_start) (GsPlugin *plugin, + const gchar *remote, + const gchar *realm, + GCallback callback, + gpointer user_data); + void (*repository_changed) (GsPlugin *plugin, + GsApp *repository); + gboolean (*ask_untrusted) (GsPlugin *plugin, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label); + + void (*setup_async) (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*setup_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*shutdown_async) (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*shutdown_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*refine_async) (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*refine_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*list_apps_async) (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GsAppList * (*list_apps_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*refresh_metadata_async) (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*refresh_metadata_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*list_distro_upgrades_async) (GsPlugin *plugin, + GsPluginListDistroUpgradesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GsAppList * (*list_distro_upgrades_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*install_repository_async) (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*install_repository_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + void (*remove_repository_async) (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*remove_repository_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + void (*enable_repository_async) (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*enable_repository_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + void (*disable_repository_async) (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*disable_repository_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*refine_categories_async) (GsPlugin *plugin, + GPtrArray *list, + GsPluginRefineCategoriesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*refine_categories_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*update_apps_async) (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*update_apps_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*install_apps_async) (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*install_apps_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*uninstall_apps_async) (GsPlugin *plugin, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*uninstall_apps_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*cancel_offline_update_async) (GsPlugin *plugin, + GsPluginCancelOfflineUpdateFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*cancel_offline_update_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*download_upgrade_async) (GsPlugin *plugin, + GsApp *app, + GsPluginDownloadUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*download_upgrade_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*trigger_upgrade_async) (GsPlugin *plugin, + GsApp *app, + GsPluginTriggerUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*trigger_upgrade_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*launch_async) (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*launch_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*file_to_app_async) (GsPlugin *plugin, + GFile *file, + GsPluginFileToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GsAppList * (*file_to_app_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + void (*url_to_app_async) (GsPlugin *plugin, + const gchar *url, + GsPluginUrlToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GsAppList * (*url_to_app_finish) (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + + gpointer padding[23]; +}; + +/* helpers */ +#define GS_PLUGIN_ERROR gs_plugin_error_quark () + +GQuark gs_plugin_error_quark (void); + +/* public getters and setters */ +const gchar *gs_plugin_get_name (GsPlugin *plugin); +const gchar *gs_plugin_get_appstream_id (GsPlugin *plugin); +void gs_plugin_set_appstream_id (GsPlugin *plugin, + const gchar *appstream_id); +gboolean gs_plugin_get_enabled (GsPlugin *plugin); +void gs_plugin_set_enabled (GsPlugin *plugin, + gboolean enabled); +gboolean gs_plugin_has_flags (GsPlugin *plugin, + GsPluginFlags flags); +void gs_plugin_add_flags (GsPlugin *plugin, + GsPluginFlags flags); +void gs_plugin_remove_flags (GsPlugin *plugin, + GsPluginFlags flags); +guint gs_plugin_get_scale (GsPlugin *plugin); +const gchar *gs_plugin_get_language (GsPlugin *plugin); +void gs_plugin_add_rule (GsPlugin *plugin, + GsPluginRule rule, + const gchar *name); + +/* helpers */ +gboolean gs_plugin_check_distro_id (GsPlugin *plugin, + const gchar *distro_id); +GsApp *gs_plugin_cache_lookup (GsPlugin *plugin, + const gchar *key); +void gs_plugin_cache_lookup_by_state (GsPlugin *plugin, + GsAppList *list, + GsAppState state); +void gs_plugin_cache_add (GsPlugin *plugin, + const gchar *key, + GsApp *app); +void gs_plugin_cache_remove (GsPlugin *plugin, + const gchar *key); +void gs_plugin_cache_invalidate (GsPlugin *plugin); +GsAppList *gs_plugin_list_cached (GsPlugin *plugin); +void gs_plugin_status_update (GsPlugin *plugin, + GsApp *app, + GsPluginStatus status); +void gs_plugin_app_launch_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_plugin_app_launch_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error); +typedef gboolean (* GsPluginPickDesktopFileCallback) (GsPlugin *plugin, + GsApp *app, + const gchar *filename, + GKeyFile *key_file, + gpointer user_data); +/** + * GsPluginPickDesktopFileCallback: + * @plugin: a #GsPlugin + * @app: a #GsApp + * @filename: a .desktop file name + * @key_file: a #GKeyFile with @filename loaded + * @user_data: callback user data + * + * A callback used by gs_plugin_app_launch_filtered_async() to filter which + * of the candidate .desktop files should be used to launch the @app. + * + * Returns: %TRUE, when the @key_file should be used, %FALSE to continue + * searching. + * + * Since: 43 + **/ +void gs_plugin_app_launch_filtered_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GsPluginPickDesktopFileCallback cb, + gpointer cb_user_data, + GCancellable *cancellable, + GAsyncReadyCallback async_callback, + gpointer async_user_data); +gboolean gs_plugin_app_launch_filtered_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error); +void gs_plugin_updates_changed (GsPlugin *plugin); +void gs_plugin_reload (GsPlugin *plugin); +const gchar *gs_plugin_status_to_string (GsPluginStatus status); +void gs_plugin_report_event (GsPlugin *plugin, + GsPluginEvent *event); +void gs_plugin_set_allow_updates (GsPlugin *plugin, + gboolean allow_updates); +gboolean gs_plugin_get_network_available (GsPlugin *plugin); +void gs_plugin_basic_auth_start (GsPlugin *plugin, + const gchar *remote, + const gchar *realm, + GCallback callback, + gpointer user_data); +void gs_plugin_repository_changed (GsPlugin *plugin, + GsApp *repository); +void gs_plugin_update_cache_state_for_repository + (GsPlugin *plugin, + GsApp *repository); +gboolean gs_plugin_ask_untrusted (GsPlugin *plugin, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label); + +GDBusConnection *gs_plugin_get_session_bus_connection (GsPlugin *self); +GDBusConnection *gs_plugin_get_system_bus_connection (GsPlugin *self); + +G_END_DECLS diff --git a/lib/gs-profiler.h b/lib/gs-profiler.h new file mode 100644 index 0000000..a5be266 --- /dev/null +++ b/lib/gs-profiler.h @@ -0,0 +1,153 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2023 Endless OS Foundation LLC + * + * Authors: + * - Georges Basile Stavracas Neto + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "config.h" +#include + +/** + * SECTION:gs-profiler + * @short_description: Macros for profiling + * + * GNOME Software provides a simple profiling mechanism that both plugins + * and GNOME Software itself can make use. Use the GS_PROFILER_BEGIN_SCOPED() + * macro to start profiling a specific code section; and pair it with + * GS_PROFILER_END_SCOPED() to finish profiling the section: + * + * ``` + * GS_PROFILER_BEGIN_SCOPED(Flatpak, "list-installed-refs", "Description"); + * ... list all installed refs ... + * GS_PROFILER_END_SCOPED(Flatpak); + * + * + * GS_PROFILER_BEGIN_SCOPED(Foo, "parse-something", "Parse some data"); + * ... parse some data ... + * GS_PROFILER_END_SCOPED(Foo); + * ``` + * + * The macros are scoped, so work correctly with early returns in the middle: + * + * ``` + * GS_PROFILER_BEGIN_SCOPED(Foo, "list-applications", NULL); + * + * if (!foo_is_correct (foo)) + * return FALSE; + * + * if (!long_async_op (foo, &error)) + * return FALSE; + * + * return TRUE; + * + * GS_PROFILER_END_SCOPED(Foo); + * ``` + * + * The description argument is nullable: + * + * ``` + * GS_PROFILER_BEGIN_SCOPED(Flatpak, "list-installed-refs", NULL); + * ... list all installed refs ... + * GS_PROFILER_END_SCOPED(Flatpak); + *``` + * + * A rather common case is to allocate new strings for the Sysprof name + * and description. The convenience macro GS_PROFILER_BEGIN_SCOPED_TAKE() is + * provided for that: + * + * ``` + * GS_PROFILER_BEGIN_SCOPED_TAKE(Foo, g_strdup_printf ("list-installed-refs:%s", name), NULL); + * ... list all installed refs ... + * GS_PROFILER_END_SCOPED(Foo); + *``` + * + * Asynchronous operations might need to track the start and end times in + * separate functions. The convenience macros GS_PROFILER_ADD_MARK() and + * GS_PROFILER_ADD_MARK_TAKE() allow for passing an independent begin time: + * + * ``` + * GS_PROFILER_ADD_MARK(Foo, task->begin_time, "do-something", NULL); + *``` + * + * Since: 44 + */ + +#ifdef HAVE_SYSPROF +#include + +typedef struct +{ + int64_t begin_time; + gchar *name; + gchar *description; +} GsProfilerHead; + +static inline void +gs_profiler_tracing_end (GsProfilerHead *head) +{ + sysprof_collector_mark (head->begin_time, + SYSPROF_CAPTURE_CURRENT_TIME - head->begin_time, + "gnome-software", + head->name, + head->description); + + g_clear_pointer (&head->name, g_free); + g_clear_pointer (&head->description, g_free); +} +static inline void +gs_profiler_auto_trace_end_helper (GsProfilerHead **head) +{ + if (*head) + gs_profiler_tracing_end (*head); +} + +#define GS_PROFILER_BEGIN_SCOPED_TAKE(Name, sysprof_name, sysprof_description) \ + G_STMT_START { \ + GsProfilerHead GsProfiler##Name; \ + __attribute__((cleanup (gs_profiler_auto_trace_end_helper))) \ + GsProfilerHead *ScopedGsProfilerTraceHead##Name = &GsProfiler##Name; \ + GsProfiler##Name = (GsProfilerHead) { \ + .begin_time = SYSPROF_CAPTURE_CURRENT_TIME, \ + .name = sysprof_name, \ + .description = sysprof_description, \ + }; + +#define GS_PROFILER_BEGIN_SCOPED(Name, sysprof_name, sysprof_description) \ + GS_PROFILER_BEGIN_SCOPED_TAKE (Name, g_strdup (sysprof_name), g_strdup (sysprof_description)) + +#define GS_PROFILER_END_SCOPED(Name) \ + } G_STMT_END + +#define GS_PROFILER_ADD_MARK_TAKE(Name, begin_time, sysprof_name, sysprof_description) \ + G_STMT_START { \ + g_autofree char *_owned_sysprof_name_##Name = sysprof_name; \ + g_autofree char *_owned_sysprof_description_##Name = sysprof_description; \ + sysprof_collector_mark (begin_time, \ + SYSPROF_CAPTURE_CURRENT_TIME - begin_time, \ + "gnome-software", \ + _owned_sysprof_name_##Name, \ + _owned_sysprof_description_##Name); \ + } G_STMT_END + +#define GS_PROFILER_ADD_MARK(Name, begin_time, sysprof_name, sysprof_description) \ + GS_PROFILER_ADD_MARK_TAKE (Name, begin_time, g_strdup (sysprof_name), g_strdup (sysprof_description)) + +#else + +#define GS_PROFILER_BEGIN_SCOPED_TAKE(Name, sysprof_name, sysprof_description) \ + G_STMT_START { +#define GS_PROFILER_BEGIN_SCOPED(Name, sysprof_name, sysprof_description) \ + G_STMT_START { +#define GS_PROFILER_END_SCOPED(Name) \ + } G_STMT_END +#define GS_PROFILER_ADD_MARK_TAKE(Name, begin_time, sysprof_name, sysprof_description) +#define GS_PROFILER_ADD_MARK(Name, begin_time, sysprof_name, sysprof_description) + +#endif diff --git a/lib/gs-remote-icon.c b/lib/gs-remote-icon.c new file mode 100644 index 0000000..2ab2742 --- /dev/null +++ b/lib/gs-remote-icon.c @@ -0,0 +1,401 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation, Inc + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-remote-icon + * @short_description: A #GIcon implementation for remote icons + * + * #GsRemoteIcon is a #GIcon implementation which represents remote icons — + * icons which have an HTTP or HTTPS URI. It provides a well-known local filename + * for a cached copy of the icon, accessible as #GFileIcon:file, and a method + * to download the icon to the cache, gs_remote_icon_ensure_cached(). + * + * Constructing a #GsRemoteIcon does not guarantee that the icon is cached. Call + * gs_remote_icon_ensure_cached() for that. + * + * #GsRemoteIcon is immutable after construction and hence is entirely thread + * safe. + * + * FIXME: Currently does no cache invalidation. + * + * Since: 40 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gs-icon.h" +#include "gs-remote-icon.h" +#include "gs-utils.h" + +/* FIXME: Work around the fact that GFileIcon is not derivable, by deriving from + * it anyway by copying its `struct GFileIcon` definition inline here. This will + * work as long as the size of `struct GFileIcon` doesn’t change within GIO. + * There’s no way of knowing if that’s the case. + * + * See https://gitlab.gnome.org/GNOME/glib/-/issues/2345 for why this is + * necessary. */ +struct _GsRemoteIcon +{ + /* struct GFileIcon { */ + GObject grandparent; + GFile *file; + /* } */ + + gchar *uri; /* (owned), immutable after construction */ +}; + +G_DEFINE_TYPE (GsRemoteIcon, gs_remote_icon, G_TYPE_FILE_ICON) + +typedef enum { + PROP_URI = 1, +} GsRemoteIconProperty; + +static GParamSpec *obj_props[PROP_URI + 1] = { NULL, }; + +static void +gs_remote_icon_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsRemoteIcon *self = GS_REMOTE_ICON (object); + + switch ((GsRemoteIconProperty) prop_id) { + case PROP_URI: + g_value_set_string (value, gs_remote_icon_get_uri (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_remote_icon_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsRemoteIcon *self = GS_REMOTE_ICON (object); + + switch ((GsRemoteIconProperty) prop_id) { + case PROP_URI: + /* Construct only */ + g_assert (self->uri == NULL); + self->uri = g_value_dup_string (value); + g_assert (g_str_has_prefix (self->uri, "http:") || + g_str_has_prefix (self->uri, "https:")); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_remote_icon_finalize (GObject *object) +{ + GsRemoteIcon *self = GS_REMOTE_ICON (object); + + g_free (self->uri); + + G_OBJECT_CLASS (gs_remote_icon_parent_class)->finalize (object); +} + +static void +gs_remote_icon_class_init (GsRemoteIconClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gs_remote_icon_get_property; + object_class->set_property = gs_remote_icon_set_property; + object_class->finalize = gs_remote_icon_finalize; + + /** + * GsRemoteIcon:uri: (not nullable) + * + * Remote URI of the icon. This must be an HTTP or HTTPS URI; it is a + * programmer error to provide other URI schemes. + * + * Since: 40 + */ + obj_props[PROP_URI] = + g_param_spec_string ("uri", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +static void +gs_remote_icon_init (GsRemoteIcon *self) +{ +} + +/* Use a hash-prefixed filename to avoid cache clashes. + * This can only fail if @create_directory is %TRUE. */ +static gchar * +gs_remote_icon_get_cache_filename (const gchar *uri, + gboolean create_directory, + GError **error) +{ + g_autofree gchar *uri_checksum = NULL; + g_autofree gchar *uri_basename = NULL; + g_autofree gchar *cache_basename = NULL; + GsUtilsCacheFlags flags; + + uri_checksum = g_compute_checksum_for_string (G_CHECKSUM_SHA1, + uri, + -1); + uri_basename = g_path_get_basename (uri); + + /* convert filename from jpg to png, as we always convert to PNG on + * download */ + if (g_str_has_suffix (uri_basename, ".jpg")) + memcpy (uri_basename + strlen (uri_basename) - 4, ".png", 4); + + cache_basename = g_strdup_printf ("%s-%s", uri_checksum, uri_basename); + + flags = GS_UTILS_CACHE_FLAG_WRITEABLE; + if (create_directory) + flags |= GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY; + + return gs_utils_get_cache_filename ("icons", + cache_basename, + flags, + error); +} + +/** + * gs_remote_icon_new: + * @uri: remote URI of the icon + * + * Create a new #GsRemoteIcon representing @uri. The #GFileIcon:file of the + * resulting icon will represent the local cache location for the icon. + * + * Returns: (transfer full): a new remote icon + * Since: 40 + */ +GIcon * +gs_remote_icon_new (const gchar *uri) +{ + g_autofree gchar *cache_filename = NULL; + g_autoptr(GFile) file = NULL; + + g_return_val_if_fail (uri != NULL, NULL); + + /* The file is the expected cached location of the icon, once it’s + * downloaded. By setting it as the #GFileIcon:file property, existing + * code (particularly in GTK) which operates on #GFileIcons will work + * transparently with this. + * + * Ideally, #GFileIcon would be an interface rather than a class, which + * would make this implementation cleaner, but this is what we’re stuck + * with. + * + * See https://gitlab.gnome.org/GNOME/glib/-/issues/2345 */ + cache_filename = gs_remote_icon_get_cache_filename (uri, FALSE, NULL); + g_assert (cache_filename != NULL); + file = g_file_new_for_path (cache_filename); + + return g_object_new (GS_TYPE_REMOTE_ICON, + "file", file, + "uri", uri, + NULL); +} + +/** + * gs_remote_icon_get_uri: + * @self: a #GsRemoteIcon + * + * Gets the value of #GsRemoteIcon:uri. + * + * Returns: (not nullable): remote URI of the icon + * Since: 40 + */ +const gchar * +gs_remote_icon_get_uri (GsRemoteIcon *self) +{ + g_return_val_if_fail (GS_IS_REMOTE_ICON (self), NULL); + + return self->uri; +} + +static GdkPixbuf * +gs_icon_download (SoupSession *session, + const gchar *uri, + const gchar *destination_path, + guint max_size, + GCancellable *cancellable, + GError **error) +{ + guint status_code; + g_autoptr(SoupMessage) msg = NULL; + g_autoptr(GInputStream) stream = NULL; + g_autoptr(GdkPixbuf) pixbuf = NULL; + g_autoptr(GdkPixbuf) scaled_pixbuf = NULL; + + /* Create the request */ + msg = soup_message_new (SOUP_METHOD_GET, uri); + if (msg == NULL) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Icon has an invalid URL"); + return NULL; + } + + /* Send request synchronously and start reading the response. */ + stream = soup_session_send (session, msg, cancellable, error); + + status_code = soup_message_get_status (msg); + if (stream == NULL) { + return NULL; + } else if (status_code != SOUP_STATUS_OK) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Failed to download icon %s: %s", + uri, soup_status_get_phrase (status_code)); + return NULL; + } + + /* Typically these icons are 64x64px PNG files. If not, resize down + * so it’s at most @max_size square, to minimise the size of the on-disk + * cache.*/ + pixbuf = gdk_pixbuf_new_from_stream (stream, cancellable, error); + if (pixbuf == NULL) + return NULL; + + if ((guint) gdk_pixbuf_get_height (pixbuf) <= max_size && + (guint) gdk_pixbuf_get_width (pixbuf) <= max_size) { + scaled_pixbuf = g_object_ref (pixbuf); + } else { + scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, max_size, max_size, + GDK_INTERP_BILINEAR); + } + + /* write file */ + if (!gdk_pixbuf_save (scaled_pixbuf, destination_path, "png", error, NULL)) + return NULL; + + return g_steal_pointer (&scaled_pixbuf); +} + +/** + * gs_remote_icon_ensure_cached: + * @self: a #GsRemoteIcon + * @soup_session: a #SoupSession to use to download the icon + * @maximum_icon_size: maximum size (in logical pixels) of the icon to save + * @scale: scale the icon will be used at + * @cancellable: (nullable): a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Ensure the given icon is present in the local cache, potentially downloading + * it from its remote server if needed. This will do network and disk I/O. + * + * @maximum_icon_size specifies the maximum size (in logical pixels) of the icon + * which should be saved to the cache. This is the maximum size that the icon + * can ever be used at, as icons can be downscaled but never upscaled. Typically + * this will be 160px. The device scale factor (`gtk_widget_get_scale_factor()`) + * is provided separately as @scale. + * + * This can be called from any thread, as #GsRemoteIcon is immutable and hence + * thread-safe. + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 48 + */ +gboolean +gs_remote_icon_ensure_cached (GsRemoteIcon *self, + SoupSession *soup_session, + guint maximum_icon_size, + guint scale, + GCancellable *cancellable, + GError **error) +{ + const gchar *uri; + g_autofree gchar *cache_filename = NULL; + GIcon *icon = NULL; + GStatBuf stat_buf; + int pixbuf_width = 0, pixbuf_height = 0; + unsigned int icon_device_width, icon_device_height; + + g_return_val_if_fail (GS_IS_REMOTE_ICON (self), FALSE); + g_return_val_if_fail (SOUP_IS_SESSION (soup_session), FALSE); + g_return_val_if_fail (maximum_icon_size > 0, FALSE); + g_return_val_if_fail (scale > 0, FALSE); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + uri = gs_remote_icon_get_uri (self); + + /* Work out cache filename. */ + cache_filename = gs_remote_icon_get_cache_filename (uri, TRUE, error); + if (cache_filename == NULL) + return FALSE; + + icon = G_ICON (self); + + /* Already in cache and not older than 30 days */ + if (g_stat (cache_filename, &stat_buf) != -1 && + S_ISREG (stat_buf.st_mode) && + (g_get_real_time () / G_USEC_PER_SEC) - stat_buf.st_mtim.tv_sec < (60 * 60 * 24 * 30)) { + /* Fallthrough and ensure the downloaded image dimensions are stored on the icon */ + gdk_pixbuf_get_file_info (cache_filename, &pixbuf_width, &pixbuf_height); + } else { + g_autoptr(GdkPixbuf) cached_pixbuf = NULL; + + cached_pixbuf = gs_icon_download (soup_session, uri, cache_filename, maximum_icon_size * gs_icon_get_scale (icon), cancellable, error); + if (cached_pixbuf == NULL) + return FALSE; + + pixbuf_width = gdk_pixbuf_get_width (cached_pixbuf); + pixbuf_height = gdk_pixbuf_get_height (cached_pixbuf); + } + + /* Ensure the dimensions are set correctly on the icon. We know the + * pixbuf’s (device) dimensions, so need to convert those to logical + * dimensions using the icon’s scale. The caller will have set the scale + * on the #GsIcon already, or it will default to 1. */ + scale = gs_icon_get_scale (icon); + g_assert (scale > 0); + + icon_device_width = pixbuf_width / scale; + icon_device_height = pixbuf_height / scale; + + if (gs_icon_get_width (icon) != 0 && gs_icon_get_height (icon) != 0 && + (gs_icon_get_width (icon) != icon_device_width || + gs_icon_get_height (icon) != icon_device_height)) { + g_debug ("Icon downloaded from ‘%s’ has dimensions %ux%u@%u, " + "but was expected to have dimensions %ux%u@%u " + "according to metadata. Overriding with downloaded " + "dimensions.", + uri, icon_device_width, icon_device_height, scale, + gs_icon_get_width (icon), gs_icon_get_height (icon), + gs_icon_get_scale (icon)); + gs_icon_set_width (icon, icon_device_width); + gs_icon_set_height (icon, icon_device_height); + } else if (gs_icon_get_width (icon) == 0 || gs_icon_get_height (icon) == 0) { + gs_icon_set_width (icon, icon_device_width); + gs_icon_set_height (icon, icon_device_height); + } + + return TRUE; +} diff --git a/lib/gs-remote-icon.h b/lib/gs-remote-icon.h new file mode 100644 index 0000000..36fd097 --- /dev/null +++ b/lib/gs-remote-icon.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation, Inc + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_REMOTE_ICON (gs_remote_icon_get_type ()) + +/* FIXME: This is actually derived from GFileIcon, but the GFileIconClass isn’t + * public, so we use GObjectClass instead (which is what GFileIconClass is — it + * doesn’t define any vfuncs). See the note in gs-remote-icon.c. */ +G_DECLARE_FINAL_TYPE (GsRemoteIcon, gs_remote_icon, GS, REMOTE_ICON, GObject) + +GIcon *gs_remote_icon_new (const gchar *uri); + +const gchar *gs_remote_icon_get_uri (GsRemoteIcon *self); + +gboolean gs_remote_icon_ensure_cached (GsRemoteIcon *self, + SoupSession *soup_session, + guint maximum_icon_size, + guint scale, + GCancellable *cancellable, + GError **error); + +G_END_DECLS diff --git a/lib/gs-rewrite-resources.c b/lib/gs-rewrite-resources.c new file mode 100644 index 0000000..1155b86 --- /dev/null +++ b/lib/gs-rewrite-resources.c @@ -0,0 +1,226 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * Copyright (C) 2023 Endless OS Foundation, LLC + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include + +#include "gs-profiler.h" +#include "gs-rewrite-resources.h" + +/* + * SECTION:gs-rewrite-resources + * @short_description: Rewrites CSS metadata for apps to refer to locally downloaded resources. + * + * This set of functions rewrites the CSS of apps to refer to locally cached + * resources, rather than HTTP/HTTPS URIs for images (for example). + * + * Resources are downloaded asynchronously and in parallel, and are cached + * locally automatically. + * + * This code is designed to be used by #GsPluginJobRefine. + * + * Since: 45 + */ + +typedef struct { + GError *saved_error; /* (owned) (nullable) */ + guint n_pending_ops; + +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec; +#endif +} RewriteResourcesData; + +static void +rewrite_resources_data_free (RewriteResourcesData *data) +{ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (RewriteResourcesData, rewrite_resources_data_free) + +typedef struct { + GTask *task; /* (owned) (not nullable) */ + GsApp *app; /* (owned) (not nullable) */ + const gchar *key; /* (not nullable) */ +} OpData; + +static void +op_data_free (OpData *data) +{ + g_clear_object (&data->task); + g_clear_object (&data->app); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (OpData, op_data_free) + +static void rewrite_resource_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_op (GTask *task, + GError *error); + +/** + * gs_rewrite_resources_async: + * @list: a list of apps to download resources for + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: function to call once the operation is complete + * @user_data: data to pass to @callback + * + * Downloads remote resources for the apps in @list, caches those downloads + * locally and rewrites the apps’ metadata to refer to the local copies. + * + * This currently acts on the following app metadata keys: + * - `GnomeSoftware::FeatureTile-css` + * - `GnomeSoftware::UpgradeBanner-css` + * + * Since: 45 + */ +void +gs_rewrite_resources_async (GsAppList *list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + RewriteResourcesData *data; + g_autoptr(RewriteResourcesData) data_owned = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_rewrite_resources_async); + + data = data_owned = g_new0 (RewriteResourcesData, 1); + data->n_pending_ops = 1; /* count setup as an operation */ + + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) rewrite_resources_data_free); + +#ifdef HAVE_SYSPROF + data->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + const gchar *keys[] = { + "GnomeSoftware::FeatureTile-css", + "GnomeSoftware::UpgradeBanner-css", + NULL + }; + + /* Handle cancellation */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) + break; + + /* rewrite URIs */ + for (gsize j = 0; keys[j] != NULL; j++) { + const gchar *css = gs_app_get_metadata_item (app, keys[j]); + g_autoptr(OpData) op_data = NULL; + + if (css == NULL) + continue; + + op_data = g_new0 (OpData, 1); + op_data->task = g_object_ref (task); + op_data->app = g_object_ref (app); + op_data->key = keys[j]; + + data->n_pending_ops++; + gs_download_rewrite_resource_async (css, + cancellable, + rewrite_resource_cb, + g_steal_pointer (&op_data)); + } + } + + finish_op (task, g_steal_pointer (&local_error)); +} + +static void +rewrite_resource_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(OpData) op_data = g_steal_pointer (&user_data); + GTask *task = op_data->task; + g_autoptr(GError) local_error = NULL; + const gchar *css_old; + g_autofree gchar *css_new = NULL; + + css_new = gs_download_rewrite_resource_finish (result, &local_error); + + /* Successfully rewritten? */ + css_old = gs_app_get_metadata_item (op_data->app, op_data->key); + + if (css_new != NULL && g_strcmp0 (css_old, css_new) != 0) { + gs_app_set_metadata (op_data->app, op_data->key, NULL); + gs_app_set_metadata (op_data->app, op_data->key, css_new); + } + + finish_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_op (GTask *task, + GError *error) +{ + g_autoptr(GError) error_owned = g_steal_pointer (&error); + RewriteResourcesData *data = g_task_get_task_data (task); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while rewriting resources: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + if (data->saved_error != NULL) { + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + return; + } + + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + /* success */ + g_task_return_boolean (task, TRUE); + + GS_PROFILER_ADD_MARK (RewriteResources, + data->begin_time_nsec, + "RewriteResources", + NULL); +} + +/** + * gs_rewrite_resources_finish: + * @result: a #GAsyncResult + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous rewrite operation started with + * gs_rewrite_resources_async(). + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 45 + */ +gboolean +gs_rewrite_resources_finish (GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} diff --git a/lib/gs-rewrite-resources.h b/lib/gs-rewrite-resources.h new file mode 100644 index 0000000..46061ab --- /dev/null +++ b/lib/gs-rewrite-resources.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2023 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gs-app-list.h" + +G_BEGIN_DECLS + +void gs_rewrite_resources_async (GsAppList *list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gs_rewrite_resources_finish (GAsyncResult *result, + GError **error); + +G_END_DECLS diff --git a/lib/gs-self-test.c b/lib/gs-self-test.c new file mode 100644 index 0000000..86efd90 --- /dev/null +++ b/lib/gs-self-test.c @@ -0,0 +1,827 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2015-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gnome-software-private.h" + +#include "gs-debug.h" +#include "gs-test.h" + +static gboolean +gs_app_list_filter_cb (GsApp *app, gpointer user_data) +{ + if (g_strcmp0 (gs_app_get_id (app), "a") == 0) + return FALSE; + if (g_strcmp0 (gs_app_get_id (app), "c") == 0) + return FALSE; + return TRUE; +} + +static void +gs_utils_url_func (void) +{ + g_autofree gchar *path1 = NULL; + g_autofree gchar *path2 = NULL; + g_autofree gchar *path3 = NULL; + g_autofree gchar *scheme1 = NULL; + g_autofree gchar *scheme2 = NULL; + + scheme1 = gs_utils_get_url_scheme ("appstream://gimp.desktop"); + g_assert_cmpstr (scheme1, ==, "appstream"); + scheme2 = gs_utils_get_url_scheme ("appstream:gimp.desktop"); + g_assert_cmpstr (scheme2, ==, "appstream"); + + path1 = gs_utils_get_url_path ("appstream://gimp.desktop"); + g_assert_cmpstr (path1, ==, "gimp.desktop"); + path2 = gs_utils_get_url_path ("appstream:gimp.desktop"); + g_assert_cmpstr (path2, ==, "gimp.desktop"); + path3 = gs_utils_get_url_path ("apt:/gimp"); + g_assert_cmpstr (path3, ==, "gimp"); +} + +static void +gs_utils_wilson_func (void) +{ + g_assert_cmpint ((gint64) gs_utils_get_wilson_rating (0, 0, 0, 0, 0), ==, -1); + g_assert_cmpint ((gint64) gs_utils_get_wilson_rating (0, 0, 0, 0, 400), ==, 100); + g_assert_cmpint ((gint64) gs_utils_get_wilson_rating (10, 0, 0, 0, 400), ==, 98); + g_assert_cmpint ((gint64) gs_utils_get_wilson_rating (0, 0, 0, 0, 1), ==, 76); + g_assert_cmpint ((gint64) gs_utils_get_wilson_rating (5, 4, 20, 100, 400), ==, 93); +} + +static void +gs_os_release_func (void) +{ + g_autofree gchar *fn = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + + fn = gs_test_get_filename (TESTDATADIR, "tests/os-release"); + g_assert (fn != NULL); + g_setenv ("GS_SELF_TEST_OS_RELEASE_FILENAME", fn, TRUE); + + os_release = gs_os_release_new (&error); + g_assert_no_error (error); + g_assert (os_release != NULL); + g_assert_cmpstr (gs_os_release_get_id (os_release), ==, "fedora"); + g_assert_cmpstr (gs_os_release_get_name (os_release), ==, "Fedora"); + g_assert_cmpstr (gs_os_release_get_version (os_release), ==, "25 (Workstation Edition)"); + g_assert_cmpstr (gs_os_release_get_version_id (os_release), ==, "25"); + g_assert_cmpstr (gs_os_release_get_pretty_name (os_release), ==, "Fedora 25 (Workstation Edition)"); +} + +static void +gs_utils_append_kv_func (void) +{ + g_autoptr(GString) str = g_string_new (NULL); + + /* normal */ + gs_utils_append_key_value (str, 5, "key", "val"); + g_assert_cmpstr (str->str, ==, "key: val\n"); + + /* oversize */ + g_string_truncate (str, 0); + gs_utils_append_key_value (str, 5, "longkey", "val"); + g_assert_cmpstr (str->str, ==, "longkey: val\n"); + + /* null key */ + g_string_truncate (str, 0); + gs_utils_append_key_value (str, 5, NULL, "val"); + g_assert_cmpstr (str->str, ==, " val\n"); + + /* zero align key */ + g_string_truncate (str, 0); + gs_utils_append_key_value (str, 0, "key", "val"); + g_assert_cmpstr (str->str, ==, "key: val\n"); +} + +static void +gs_utils_cache_func (void) +{ + g_autofree gchar *fn1 = NULL; + g_autofree gchar *fn2 = NULL; + g_autoptr(GError) error = NULL; + + fn1 = gs_utils_get_cache_filename ("test", + "http://www.foo.bar/baz", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &error); + g_assert_no_error (error); + g_assert_cmpstr (fn1, !=, NULL); + g_assert (g_str_has_prefix (fn1, g_get_user_cache_dir ())); + g_assert (g_str_has_suffix (fn1, "test/baz")); + + fn2 = gs_utils_get_cache_filename ("test", + "http://www.foo.bar/baz", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_USE_HASH | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &error); + g_assert_no_error (error); + g_assert_cmpstr (fn2, !=, NULL); + g_assert (g_str_has_prefix (fn2, g_get_user_cache_dir ())); + g_assert (g_str_has_suffix (fn2, "test/295099f59d12b3eb0b955325fcb699cd23792a89-baz")); +} + +static void +gs_utils_error_func (void) +{ + g_autofree gchar *app_id = NULL; + g_autofree gchar *origin_id = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app = gs_app_new ("gimp.desktop"); + g_autoptr(GsApp) origin = gs_app_new ("gimp-repo"); + + for (guint i = 0; i < GS_PLUGIN_ERROR_LAST; i++) + g_assert (gs_plugin_error_to_string (i) != NULL); + + /* noop */ + gs_utils_error_add_app_id (&error, app); + gs_utils_error_add_origin_id (&error, origin); + + g_set_error (&error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_DOWNLOAD_FAILED, + "failed"); + g_assert_cmpstr (error->message, ==, "failed"); + gs_utils_error_add_app_id (&error, app); + gs_utils_error_add_origin_id (&error, origin); + g_assert_cmpstr (error->message, ==, "[*/*/*/gimp-repo/*] {*/*/*/gimp.desktop/*} failed"); + + /* find and strip any unique IDs from the error message */ + for (guint i = 0; i < 2; i++) { + if (app_id == NULL) + app_id = gs_utils_error_strip_app_id (error); + if (origin_id == NULL) + origin_id = gs_utils_error_strip_origin_id (error); + } + + g_assert_cmpstr (app_id, ==, "*/*/*/gimp.desktop/*"); + g_assert_cmpstr (origin_id, ==, "*/*/*/gimp-repo/*"); + g_assert_cmpstr (error->message, ==, "failed"); +} + +static void +async_result_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **result_out = user_data; + + g_assert (*result_out == NULL); + *result_out = g_object_ref (result); + g_main_context_wakeup (g_main_context_get_thread_default ()); +} + +static void +gs_plugin_download_rewrite_func (void) +{ + g_autofree gchar *css = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GAsyncResult) result = NULL; + g_autoptr(GMainContext) context = g_main_context_new (); + g_autoptr(GMainContextPusher) context_pusher = g_main_context_pusher_new (context); + const gchar *resource = "background:\n" + " url('file://" DATADIR "/gnome-software/featured-maps.png')\n" + " url('file://" DATADIR "/gnome-software/featured-maps-bg.png')\n" + " bottom center / contain no-repeat;\n"; + + /* only when installed */ + if (!g_file_test (DATADIR "/gnome-software/featured-maps.png", G_FILE_TEST_EXISTS)) { + g_test_skip ("not installed"); + return; + } + + /* test rewrite */ + gs_download_rewrite_resource_async (resource, NULL, async_result_cb, &result); + + while (result == NULL) + g_main_context_iteration (context, TRUE); + + css = gs_download_rewrite_resource_finish (result, &error); + g_assert_no_error (error); + g_assert (css != NULL); +} + +static void +gs_plugin_func (void) +{ + GsAppList *list; + GsAppList *list_dup; + GsAppList *list_remove; + GsApp *app; + + /* check enums converted */ + for (guint i = 0; i < GS_PLUGIN_ACTION_LAST; i++) { + const gchar *tmp = gs_plugin_action_to_string (i); + if (tmp == NULL) { + /* These do not have function, they exist only for better error messages. */ + if (i == GS_PLUGIN_ACTION_INSTALL) + continue; + g_critical ("failed to convert %u", i); + } + g_assert_cmpint (gs_plugin_action_from_string (tmp), ==, i); + } + for (guint i = 1; i < GS_PLUGIN_ACTION_LAST; i++) { + const gchar *tmp = gs_plugin_action_to_function_name (i); + if (tmp == NULL) { + /* These do not have function, they exist only for better error messages. */ + if (i == GS_PLUGIN_ACTION_INSTALL || + i == GS_PLUGIN_ACTION_LAUNCH || + i == GS_PLUGIN_ACTION_FILE_TO_APP || + i == GS_PLUGIN_ACTION_URL_TO_APP || + i == GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD || + i == GS_PLUGIN_ACTION_INSTALL_REPO || + i == GS_PLUGIN_ACTION_REMOVE_REPO || + i == GS_PLUGIN_ACTION_ENABLE_REPO || + i == GS_PLUGIN_ACTION_DISABLE_REPO) + continue; + g_critical ("failed to convert %u", i); + } + } + + /* add a couple of duplicate IDs */ + app = gs_app_new ("a"); + list = gs_app_list_new (); + gs_app_list_add (list, app); + g_object_unref (app); + + /* test refcounting */ + g_assert_cmpstr (gs_app_get_id (gs_app_list_index (list, 0)), ==, "a"); + list_dup = gs_app_list_copy (list); + g_object_unref (list); + g_assert_cmpint (gs_app_list_length (list_dup), ==, 1); + g_assert_cmpstr (gs_app_get_id (gs_app_list_index (list_dup, 0)), ==, "a"); + g_object_unref (list_dup); + + /* test removing objects */ + app = gs_app_new ("a"); + list_remove = gs_app_list_new (); + gs_app_list_add (list_remove, app); + g_object_unref (app); + app = gs_app_new ("b"); + gs_app_list_add (list_remove, app); + g_object_unref (app); + app = gs_app_new ("c"); + gs_app_list_add (list_remove, app); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list_remove), ==, 3); + gs_app_list_filter (list_remove, gs_app_list_filter_cb, NULL); + g_assert_cmpint (gs_app_list_length (list_remove), ==, 1); + g_assert_cmpstr (gs_app_get_id (gs_app_list_index (list_remove, 0)), ==, "b"); + + /* test removing duplicates at runtime */ + app = gs_app_new ("b"); + gs_app_list_add (list_remove, app); + g_object_unref (app); + app = gs_app_new ("b"); + gs_app_list_add (list_remove, app); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list_remove), ==, 1); + g_assert_cmpstr (gs_app_get_id (gs_app_list_index (list_remove, 0)), ==, "b"); + g_object_unref (list_remove); + + /* test removing duplicates when lazy-loading */ + list_remove = gs_app_list_new (); + app = gs_app_new (NULL); + gs_app_list_add (list_remove, app); + gs_app_set_id (app, "e"); + g_object_unref (app); + app = gs_app_new (NULL); + gs_app_list_add (list_remove, app); + gs_app_set_id (app, "e"); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list_remove), ==, 2); + gs_app_list_filter_duplicates (list_remove, GS_APP_LIST_FILTER_FLAG_NONE); + g_assert_cmpint (gs_app_list_length (list_remove), ==, 1); + g_object_unref (list_remove); + + /* test removing duplicates when some apps have no app ID */ + list_remove = gs_app_list_new (); + app = gs_app_new (NULL); + gs_app_list_add (list_remove, app); + g_object_unref (app); + app = gs_app_new (NULL); + gs_app_list_add (list_remove, app); + g_object_unref (app); + app = gs_app_new (NULL); + gs_app_list_add (list_remove, app); + gs_app_set_id (app, "e"); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list_remove), ==, 3); + gs_app_list_filter_duplicates (list_remove, GS_APP_LIST_FILTER_FLAG_NONE); + g_assert_cmpint (gs_app_list_length (list_remove), ==, 3); + g_object_unref (list_remove); + + /* remove lazy-loaded app */ + list_remove = gs_app_list_new (); + app = gs_app_new (NULL); + gs_app_list_add (list_remove, app); + gs_app_list_remove (list_remove, app); + g_assert_cmpint (gs_app_list_length (list_remove), ==, 0); + g_object_unref (app); + g_object_unref (list_remove); + + /* respect priority when deduplicating */ + list = gs_app_list_new (); + app = gs_app_new ("e"); + gs_app_set_unique_id (app, "user/foo/*/e/*"); + gs_app_list_add (list, app); + gs_app_set_priority (app, 0); + g_object_unref (app); + app = gs_app_new ("e"); + gs_app_set_unique_id (app, "user/bar/*/e/*"); + gs_app_list_add (list, app); + gs_app_set_priority (app, 99); + g_object_unref (app); + app = gs_app_new ("e"); + gs_app_set_unique_id (app, "user/baz/*/e/*"); + gs_app_list_add (list, app); + gs_app_set_priority (app, 50); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list), ==, 3); + gs_app_list_filter_duplicates (list, GS_APP_LIST_FILTER_FLAG_KEY_ID); + g_assert_cmpint (gs_app_list_length (list), ==, 1); + g_assert_cmpstr (gs_app_get_unique_id (gs_app_list_index (list, 0)), ==, "user/bar/*/e/*"); + g_object_unref (list); + + /* respect priority (using name and version) when deduplicating */ + list = gs_app_list_new (); + app = gs_app_new ("e"); + gs_app_add_source (app, "foo"); + gs_app_set_version (app, "1.2.3"); + gs_app_set_unique_id (app, "user/foo/repo/*/*"); + gs_app_list_add (list, app); + gs_app_set_priority (app, 0); + g_object_unref (app); + app = gs_app_new ("e"); + gs_app_add_source (app, "foo"); + gs_app_set_version (app, "1.2.3"); + gs_app_set_unique_id (app, "user/foo/repo-security/*/*"); + gs_app_list_add (list, app); + gs_app_set_priority (app, 99); + g_object_unref (app); + app = gs_app_new ("e"); + gs_app_add_source (app, "foo"); + gs_app_set_version (app, "1.2.3"); + gs_app_set_unique_id (app, "user/foo/repo-universe/*/*"); + gs_app_list_add (list, app); + gs_app_set_priority (app, 50); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list), ==, 3); + gs_app_list_filter_duplicates (list, GS_APP_LIST_FILTER_FLAG_KEY_ID | + GS_APP_LIST_FILTER_FLAG_KEY_SOURCE | + GS_APP_LIST_FILTER_FLAG_KEY_VERSION); + g_assert_cmpint (gs_app_list_length (list), ==, 1); + g_assert_cmpstr (gs_app_get_unique_id (gs_app_list_index (list, 0)), ==, "user/foo/repo-security/*/*"); + g_object_unref (list); + + /* prefer installed apps */ + list = gs_app_list_new (); + app = gs_app_new ("e"); + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + gs_app_set_unique_id (app, "user/foo/*/e/*"); + gs_app_set_priority (app, 0); + gs_app_list_add (list, app); + g_object_unref (app); + app = gs_app_new ("e"); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_set_unique_id (app, "user/bar/*/e/*"); + gs_app_set_priority (app, 100); + gs_app_list_add (list, app); + g_object_unref (app); + gs_app_list_filter_duplicates (list, + GS_APP_LIST_FILTER_FLAG_KEY_ID | + GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED); + g_assert_cmpint (gs_app_list_length (list), ==, 1); + g_assert_cmpstr (gs_app_get_unique_id (gs_app_list_index (list, 0)), ==, "user/foo/*/e/*"); + g_object_unref (list); + + /* use the provides ID to dedupe */ + list = gs_app_list_new (); + app = gs_app_new ("gimp.desktop"); + gs_app_set_unique_id (app, "user/fedora/*/gimp.desktop/*"); + gs_app_set_priority (app, 0); + gs_app_list_add (list, app); + g_object_unref (app); + app = gs_app_new ("org.gimp.GIMP"); + gs_app_add_provided_item (app, + AS_PROVIDED_KIND_ID, + "gimp.desktop"); + gs_app_set_unique_id (app, "user/flathub/*/org.gimp.GIMP/*"); + gs_app_set_priority (app, 100); + gs_app_list_add (list, app); + g_object_unref (app); + gs_app_list_filter_duplicates (list, GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES); + g_assert_cmpint (gs_app_list_length (list), ==, 1); + g_assert_cmpstr (gs_app_get_unique_id (gs_app_list_index (list, 0)), ==, + "user/flathub/*/org.gimp.GIMP/*"); + g_object_unref (list); + + /* use globs when adding */ + list = gs_app_list_new (); + app = gs_app_new ("b"); + gs_app_set_unique_id (app, "a/b/c/d/e"); + gs_app_list_add (list, app); + g_object_unref (app); + app = gs_app_new ("b"); + gs_app_set_unique_id (app, "a/b/c/*/e"); + gs_app_list_add (list, app); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list), ==, 1); + g_assert_cmpstr (gs_app_get_id (gs_app_list_index (list, 0)), ==, "b"); + g_object_unref (list); + + /* lookup with a wildcard */ + list = gs_app_list_new (); + app = gs_app_new ("b"); + gs_app_set_unique_id (app, "a/b/c/d/e"); + gs_app_list_add (list, app); + g_object_unref (app); + g_assert (gs_app_list_lookup (list, "a/b/c/d/e") != NULL); + g_assert (gs_app_list_lookup (list, "a/b/c/d/*") != NULL); + g_assert (gs_app_list_lookup (list, "*/b/c/d/e") != NULL); + g_assert (gs_app_list_lookup (list, "x/x/x/x/x") == NULL); + g_object_unref (list); + + /* allow duplicating a wildcard */ + list = gs_app_list_new (); + app = gs_app_new ("gimp.desktop"); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app); + g_object_unref (app); + app = gs_app_new ("gimp.desktop"); + gs_app_set_unique_id (app, "system/flatpak/*/gimp.desktop/stable"); + gs_app_list_add (list, app); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list), ==, 2); + g_object_unref (list); + + /* allow duplicating a wildcard */ + list = gs_app_list_new (); + app = gs_app_new ("gimp.desktop"); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app); + g_object_unref (app); + app = gs_app_new ("gimp.desktop"); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list), ==, 1); + g_object_unref (list); + + /* add a list to a list */ + list = gs_app_list_new (); + list_dup = gs_app_list_new (); + app = gs_app_new ("a"); + gs_app_list_add (list, app); + g_object_unref (app); + app = gs_app_new ("b"); + gs_app_list_add (list_dup, app); + g_object_unref (app); + gs_app_list_add_list (list, list_dup); + g_assert_cmpint (gs_app_list_length (list), ==, 2); + g_assert_cmpint (gs_app_list_length (list_dup), ==, 1); + g_object_unref (list); + g_object_unref (list_dup); + + /* remove apps from the list */ + list = gs_app_list_new (); + app = gs_app_new ("a"); + gs_app_list_add (list, app); + gs_app_list_remove (list, app); + g_object_unref (app); + g_assert_cmpint (gs_app_list_length (list), ==, 0); + g_object_unref (list); + + /* truncate list */ + list = gs_app_list_new (); + app = gs_app_new ("a"); + gs_app_list_add (list, app); + g_object_unref (app); + app = gs_app_new ("b"); + gs_app_list_add (list, app); + g_object_unref (app); + app = gs_app_new ("c"); + gs_app_list_add (list, app); + g_object_unref (app); + g_assert (!gs_app_list_has_flag (list, GS_APP_LIST_FLAG_IS_TRUNCATED)); + g_assert_cmpint (gs_app_list_get_size_peak (list), ==, 3); + gs_app_list_truncate (list, 3); + g_assert_cmpint (gs_app_list_length (list), ==, 3); + g_assert (gs_app_list_has_flag (list, GS_APP_LIST_FLAG_IS_TRUNCATED)); + g_assert_cmpint (gs_app_list_get_size_peak (list), ==, 3); + gs_app_list_truncate (list, 2); + g_assert_cmpint (gs_app_list_length (list), ==, 2); + gs_app_list_truncate (list, 1); + g_assert_cmpint (gs_app_list_length (list), ==, 1); + gs_app_list_truncate (list, 0); + g_assert_cmpint (gs_app_list_length (list), ==, 0); + g_assert_cmpint (gs_app_list_get_size_peak (list), ==, 3); + g_object_unref (list); +} + +static gpointer +gs_app_thread_cb (gpointer data) +{ + GsApp *app = GS_APP (data); + for (guint i = 0; i < 10000; i++) { + g_assert_cmpstr (gs_app_get_unique_id (app), !=, NULL); + gs_app_set_branch (app, "master"); + g_assert_cmpstr (gs_app_get_unique_id (app), !=, NULL); + gs_app_set_branch (app, "stable"); + } + return NULL; +} + +static void +gs_app_thread_func (gconstpointer user_data) +{ + GsDebug *debug = GS_DEBUG ((void *)user_data); + GThread *thread1; + GThread *thread2; + g_autoptr(GsApp) app = gs_app_new ("gimp.desktop"); + + /* try really hard to cause a threading problem */ + gs_debug_set_verbose (debug, FALSE); + thread1 = g_thread_new ("thread1", gs_app_thread_cb, app); + thread2 = g_thread_new ("thread2", gs_app_thread_cb, app); + g_thread_join (thread1); /* consumes the reference */ + g_thread_join (thread2); + gs_debug_set_verbose (debug, TRUE); +} + +static void +gs_app_unique_id_func (void) +{ + g_autoptr(GsApp) app = gs_app_new (NULL); + g_autofree gchar *data_id = NULL; + const gchar *unique_id; + + unique_id = "system/flatpak/gnome/org.gnome.Software/master"; + gs_app_set_from_unique_id (app, unique_id, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert (GS_IS_APP (app)); + g_assert_cmpint (gs_app_get_scope (app), ==, AS_COMPONENT_SCOPE_SYSTEM); + g_assert_cmpint (gs_app_get_bundle_kind (app), ==, AS_BUNDLE_KIND_FLATPAK); + g_assert_cmpstr (gs_app_get_origin (app), ==, "gnome"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.gnome.Software"); + g_assert_cmpstr (gs_app_get_branch (app), ==, "master"); + + /* test conversions from 6-part IDs */ + data_id = gs_utils_unique_id_compat_convert (unique_id); + g_assert_cmpstr (data_id, ==, unique_id); + g_clear_pointer (&data_id, g_free); + + data_id = gs_utils_unique_id_compat_convert ("not a unique ID"); + g_assert_null (data_id); + + data_id = gs_utils_unique_id_compat_convert ("system/flatpak/gnome/desktop-app/org.gnome.Software/master"); + g_assert_cmpstr (data_id, ==, unique_id); + g_clear_pointer (&data_id, g_free); +} + +static void +gs_app_addons_func (void) +{ + g_autoptr(GsApp) app = gs_app_new ("test.desktop"); + g_autoptr(GsApp) addon = NULL; + g_autoptr(GsAppList) addons_list = NULL; + + /* create, add then drop ref, so @app has the only refcount of addon */ + addon = gs_app_new ("test.desktop"); + addons_list = gs_app_list_new (); + gs_app_list_add (addons_list, addon); + + gs_app_add_addons (app, addons_list); + + gs_app_remove_addon (app, addon); +} + +static void +gs_app_func (void) +{ + g_autoptr(GsApp) app = NULL; + + app = gs_app_new ("gnome-software.desktop"); + g_assert (GS_IS_APP (app)); + g_assert_cmpstr (gs_app_get_id (app), ==, "gnome-software.desktop"); + + /* check we clean up the version, but not at the expense of having + * the same string as the update version */ + gs_app_set_version (app, "2.8.6-3.fc20"); + gs_app_set_update_version (app, "2.8.6-4.fc20"); + g_assert_cmpstr (gs_app_get_version (app), ==, "2.8.6-3.fc20"); + g_assert_cmpstr (gs_app_get_update_version (app), ==, "2.8.6-4.fc20"); + g_assert_cmpstr (gs_app_get_version_ui (app), ==, "2.8.6-3"); + g_assert_cmpstr (gs_app_get_update_version_ui (app), ==, "2.8.6-4"); + + /* check the quality stuff works */ + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "dave"); + g_assert_cmpstr (gs_app_get_name (app), ==, "dave"); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, "brian"); + g_assert_cmpstr (gs_app_get_name (app), ==, "dave"); + gs_app_set_name (app, GS_APP_QUALITY_HIGHEST, "hugh"); + g_assert_cmpstr (gs_app_get_name (app), ==, "hugh"); + + /* check non-transient state saving */ + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + gs_app_set_state (app, GS_APP_STATE_REMOVING); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_REMOVING); + gs_app_set_state_recover (app); // simulate an error + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + + /* try again */ + gs_app_set_state (app, GS_APP_STATE_REMOVING); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_REMOVING); + gs_app_set_state_recover (app); // simulate an error + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + + /* correctly parse URL */ + gs_app_set_origin_hostname (app, "https://mirrors.fedoraproject.org/metalink"); + g_assert_cmpstr (gs_app_get_origin_hostname (app), ==, "fedoraproject.org"); + gs_app_set_origin_hostname (app, "file:///home/hughsie"); + g_assert_cmpstr (gs_app_get_origin_hostname (app), ==, "localhost"); + + /* check setting the progress */ + gs_app_set_progress (app, 42); + g_assert_cmpuint (gs_app_get_progress (app), ==, 42); + gs_app_set_progress (app, 0); + g_assert_cmpuint (gs_app_get_progress (app), ==, 0); + gs_app_set_progress (app, GS_APP_PROGRESS_UNKNOWN); + g_assert_cmpuint (gs_app_get_progress (app), ==, GS_APP_PROGRESS_UNKNOWN); + g_assert_false ((gint) 0 <= (gint) GS_APP_PROGRESS_UNKNOWN && GS_APP_PROGRESS_UNKNOWN <= 100); + + /* check pending action */ + g_assert_cmpuint (gs_app_get_pending_action (app), ==, GS_PLUGIN_ACTION_UNKNOWN); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + g_assert_cmpuint (gs_app_get_pending_action (app), ==, GS_PLUGIN_ACTION_UNKNOWN); + gs_app_set_state_recover (app); + + /* check pending action */ + g_assert_cmpuint (gs_app_get_pending_action (app), ==, GS_PLUGIN_ACTION_UNKNOWN); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_set_state (app, GS_APP_STATE_DOWNLOADING); + g_assert_cmpuint (gs_app_get_pending_action (app), ==, GS_PLUGIN_ACTION_UNKNOWN); + gs_app_set_state_recover (app); +} + +static void +gs_app_progress_clamping_func (void) +{ + g_autoptr(GsApp) app = NULL; + + if (g_test_subprocess ()) { + app = gs_app_new ("gnome-software.desktop"); + gs_app_set_progress (app, 142); + g_assert_cmpuint (gs_app_get_progress (app), ==, 100); + } else { + g_test_trap_subprocess (NULL, 0, 0); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*cannot set 142% for *, setting instead: 100%*"); + } +} + +static void +gs_app_list_wildcard_dedupe_func (void) +{ + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GsApp) app1 = gs_app_new ("app"); + g_autoptr(GsApp) app2 = gs_app_new ("app"); + + gs_app_add_quirk (app1, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app1); + gs_app_add_quirk (app2, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app2); + g_assert_cmpint (gs_app_list_length (list), ==, 1); +} + +static void +gs_app_list_func (void) +{ + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GsApp) app1 = gs_app_new ("app1"); + g_autoptr(GsApp) app2 = gs_app_new ("app2"); + + /* turn on */ + gs_app_list_add_flag (list, GS_APP_LIST_FLAG_WATCH_APPS); + + g_assert_cmpint (gs_app_list_get_progress (list), ==, 0); + g_assert_cmpint (gs_app_list_get_state (list), ==, GS_APP_STATE_UNKNOWN); + gs_app_list_add (list, app1); + gs_app_set_progress (app1, 75); + gs_app_set_state (app1, GS_APP_STATE_AVAILABLE); + gs_app_set_state (app1, GS_APP_STATE_INSTALLING); + gs_test_flush_main_context (); + g_assert_cmpint (gs_app_list_get_progress (list), ==, 75); + g_assert_cmpint (gs_app_list_get_state (list), ==, GS_APP_STATE_INSTALLING); + + gs_app_set_state (app1, GS_APP_STATE_UNKNOWN); + gs_test_flush_main_context (); + g_assert_cmpint (gs_app_list_get_state (list), ==, GS_APP_STATE_UNKNOWN); + gs_app_set_state (app1, GS_APP_STATE_AVAILABLE); + gs_app_set_state (app1, GS_APP_STATE_DOWNLOADING); + gs_app_set_progress (app1, 80); + gs_test_flush_main_context (); + g_assert_cmpint (gs_app_list_get_progress (list), ==, 80); + g_assert_cmpint (gs_app_list_get_state (list), ==, GS_APP_STATE_DOWNLOADING); + gs_app_set_progress (app1, 90); + gs_app_set_state (app1, GS_APP_STATE_INSTALLING); + gs_test_flush_main_context (); + g_assert_cmpint (gs_app_list_get_progress (list), ==, 90); + g_assert_cmpint (gs_app_list_get_state (list), ==, GS_APP_STATE_INSTALLING); + + /* return back the progress expected by the below code */ + gs_app_set_progress (app1, 75); + + gs_app_list_add (list, app2); + gs_app_set_progress (app2, 25); + gs_test_flush_main_context (); + g_assert_cmpint (gs_app_list_get_progress (list), ==, 50); + g_assert_cmpint (gs_app_list_get_state (list), ==, GS_APP_STATE_INSTALLING); + + gs_app_list_remove (list, app1); + g_assert_cmpint (gs_app_list_get_progress (list), ==, 25); + g_assert_cmpint (gs_app_list_get_state (list), ==, GS_APP_STATE_UNKNOWN); +} + +static void +gs_app_list_performance_func (void) +{ + g_autoptr(GPtrArray) apps = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GTimer) timer = NULL; + + /* create a few apps */ + for (guint i = 0; i < 500; i++) { + g_autofree gchar *id = g_strdup_printf ("%03u.desktop", i); + g_ptr_array_add (apps, gs_app_new (id)); + } + + /* add them to the list */ + timer = g_timer_new (); + for (guint i = 0; i < apps->len; i++) { + GsApp *app = g_ptr_array_index (apps, i); + gs_app_list_add (list, app); + } + g_print ("%.2fms ", g_timer_elapsed (timer, NULL) * 1000); +} + +static void +gs_app_list_related_func (void) +{ + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GsApp) app = gs_app_new ("app"); + g_autoptr(GsApp) related = gs_app_new ("related"); + + /* turn on */ + gs_app_list_add_flag (list, + GS_APP_LIST_FLAG_WATCH_APPS | + GS_APP_LIST_FLAG_WATCH_APPS_RELATED); + gs_app_add_related (app, related); + gs_app_list_add (list, app); + + gs_app_set_progress (app, 75); + gs_app_set_progress (related, 25); + gs_test_flush_main_context (); + g_assert_cmpint (gs_app_list_get_progress (list), ==, 50); +} + +int +main (int argc, char **argv) +{ + g_autoptr(GsDebug) debug = gs_debug_new (NULL, TRUE, FALSE); + + gs_test_init (&argc, &argv); + + /* tests go here */ + g_test_add_func ("/gnome-software/lib/utils{url}", gs_utils_url_func); + g_test_add_func ("/gnome-software/lib/utils{wilson}", gs_utils_wilson_func); + g_test_add_func ("/gnome-software/lib/utils{error}", gs_utils_error_func); + g_test_add_func ("/gnome-software/lib/utils{cache}", gs_utils_cache_func); + g_test_add_func ("/gnome-software/lib/utils{append-kv}", gs_utils_append_kv_func); + g_test_add_func ("/gnome-software/lib/os-release", gs_os_release_func); + g_test_add_func ("/gnome-software/lib/app", gs_app_func); + g_test_add_func ("/gnome-software/lib/app/progress-clamping", gs_app_progress_clamping_func); + g_test_add_func ("/gnome-software/lib/app{addons}", gs_app_addons_func); + g_test_add_func ("/gnome-software/lib/app{unique-id}", gs_app_unique_id_func); + g_test_add_data_func ("/gnome-software/lib/app{thread}", debug, gs_app_thread_func); + g_test_add_func ("/gnome-software/lib/app{list}", gs_app_list_func); + g_test_add_func ("/gnome-software/lib/app{list-wildcard-dedupe}", gs_app_list_wildcard_dedupe_func); + g_test_add_func ("/gnome-software/lib/app{list-performance}", gs_app_list_performance_func); + g_test_add_func ("/gnome-software/lib/app{list-related}", gs_app_list_related_func); + g_test_add_func ("/gnome-software/lib/plugin", gs_plugin_func); + g_test_add_func ("/gnome-software/lib/plugin{download-rewrite}", gs_plugin_download_rewrite_func); + + return g_test_run (); +} diff --git a/lib/gs-test.c b/lib/gs-test.c new file mode 100644 index 0000000..455f86b --- /dev/null +++ b/lib/gs-test.c @@ -0,0 +1,155 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include + +#include "gs-plugin-loader-sync.h" +#include "gs-test.h" + +/** + * gs_test_init: + * + * Initializes the environment with the common settings for the test, + * as a replacement for the g_test_init(), which is called as well. + * + * Since: 42 + **/ +void +gs_test_init (gint *pargc, + gchar ***pargv) +{ + g_autoptr(GSettings) settings = NULL; + + g_setenv ("GSETTINGS_BACKEND", "memory", FALSE); + g_setenv ("G_MESSAGES_DEBUG", "all", TRUE); + + /* To not download ODRS data during the test */ + settings = g_settings_new ("org.gnome.software"); + g_settings_set_string (settings, "review-server", ""); + + g_test_init (pargc, pargv, + G_TEST_OPTION_ISOLATE_DIRS, + NULL); + + /* only critical and error are fatal */ + g_log_set_fatal_mask (NULL, G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL); +} + +gchar * +gs_test_get_filename (const gchar *testdatadir, const gchar *filename) +{ + gchar *tmp; + char full_tmp[PATH_MAX]; + g_autofree gchar *path = NULL; + path = g_build_filename (testdatadir, filename, NULL); + g_debug ("looking in %s", path); + tmp = realpath (path, full_tmp); + if (tmp == NULL) + return NULL; + return g_strdup (full_tmp); +} + +void +gs_test_flush_main_context (void) +{ + guint cnt = 0; + while (g_main_context_iteration (NULL, FALSE)) { + if (cnt == 0) + g_debug ("clearing pending events..."); + cnt++; + } + if (cnt > 0) + g_debug ("cleared %u events", cnt); +} + +/** + * gs_test_expose_icon_theme_paths: + * + * Calculate and set the `GS_SELF_TEST_ICON_THEME_PATH` environment variable + * to include the current system icon theme paths. This is designed to be called + * before calling `gs_test_init()`, which will clear the system icon theme paths. + * + * As this function calls `g_setenv()`, it must not be called after threads have + * been spawned. + * + * Calling this function is an explicit acknowledgement that the code under test + * should be accessing the icon theme. + * + * Since: 3.38 + */ +void +gs_test_expose_icon_theme_paths (void) +{ + GdkDisplay *display = gdk_display_get_default (); + const gchar * const *data_dirs; + g_autoptr(GString) data_dirs_str = NULL; + g_autofree gchar *data_dirs_joined = NULL; + + data_dirs = g_get_system_data_dirs (); + data_dirs_str = g_string_new (""); + for (gsize i = 0; data_dirs[i] != NULL; i++) + g_string_append_printf (data_dirs_str, "%s%s/icons", + (data_dirs_str->len > 0) ? ":" : "", + data_dirs[i]); + data_dirs_joined = g_string_free (g_steal_pointer (&data_dirs_str), FALSE); + g_setenv ("GS_SELF_TEST_ICON_THEME_PATH", data_dirs_joined, TRUE); + + if (display) { + GtkIconTheme *default_theme; + default_theme = gtk_icon_theme_get_for_display (display); + gtk_icon_theme_add_resource_path (default_theme, "/org/gnome/Software/icons/"); + } +} + +/** + * gs_test_reinitialise_plugin_loader: + * @plugin_loader: a #GsPluginLoader + * + * Calls setup on each plugin. This should only be used from the self tests + * and in a controlled way. + * + * Since: 42 + */ +void +gs_test_reinitialise_plugin_loader (GsPluginLoader *plugin_loader, + const gchar * const *allowlist, + const gchar * const *blocklist) +{ + g_autoptr(GError) local_error = NULL; +#ifdef HAVE_SYSPROF + gint64 begin_time_nsec G_GNUC_UNUSED = SYSPROF_CAPTURE_CURRENT_TIME; +#endif + + /* Shut down */ + gs_plugin_loader_shutdown (plugin_loader, NULL); + + /* clear global cache */ + gs_plugin_loader_clear_caches (plugin_loader); + + /* remove any events */ + gs_plugin_loader_remove_events (plugin_loader); + + /* Start all the plugins setting up again in parallel. Use the blocking + * sync version of the function, just for the tests. */ + gs_plugin_loader_setup (plugin_loader, allowlist, blocklist, NULL, &local_error); + g_assert_no_error (local_error); + +#ifdef HAVE_SYSPROF + if (plugin_loader->sysprof_writer != NULL) { + sysprof_capture_writer_add_mark (plugin_loader->sysprof_writer, + begin_time_nsec, + sched_getcpu (), + getpid (), + SYSPROF_CAPTURE_CURRENT_TIME - begin_time_nsec, + "gnome-software", + "setup-again", + NULL); + } +#endif /* HAVE_SYSPROF */ +} diff --git a/lib/gs-test.h b/lib/gs-test.h new file mode 100644 index 0000000..3a2a9ae --- /dev/null +++ b/lib/gs-test.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-app.h" +#include "gs-plugin-loader.h" + +G_BEGIN_DECLS + +void gs_test_init (gint *pargc, + gchar ***pargv); +void gs_test_flush_main_context (void); +gchar *gs_test_get_filename (const gchar *testdatadir, + const gchar *filename); +void gs_test_expose_icon_theme_paths (void); + +void gs_test_reinitialise_plugin_loader (GsPluginLoader *plugin_loader, + const gchar * const *allowlist, + const gchar * const *blocklist); + +G_END_DECLS diff --git a/lib/gs-utils.c b/lib/gs-utils.c new file mode 100644 index 0000000..36d18e2 --- /dev/null +++ b/lib/gs-utils.c @@ -0,0 +1,1873 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2015-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-utils + * @title: GsUtils + * @include: gnome-software.h + * @stability: Unstable + * @short_description: Utilities that plugins can use + * + * These functions provide useful functionality that makes it easy to + * add new plugin functions. + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include + +#if defined(__linux__) +#include +#elif defined(__FreeBSD__) +#include +#include +#endif + +#ifdef HAVE_POLKIT +#include +#endif + +#include "gs-app.h" +#include "gs-app-private.h" +#include "gs-utils.h" +#include "gs-plugin.h" + +#define MB_IN_BYTES (1024 * 1024) + +/** + * gs_mkdir_parent: + * @path: A full pathname + * @error: A #GError, or %NULL + * + * Creates any required directories, including any parent directories. + * + * Returns: %TRUE for success + **/ +gboolean +gs_mkdir_parent (const gchar *path, GError **error) +{ + g_autofree gchar *parent = NULL; + + parent = g_path_get_dirname (path); + if (g_mkdir_with_parents (parent, 0755) == -1) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "Failed to create '%s': %s", + parent, g_strerror (errno)); + return FALSE; + } + return TRUE; +} + +/** + * gs_utils_get_file_age: + * @file: A #GFile + * + * Gets a file age. + * + * Returns: The time in seconds since the file was modified, or %G_MAXUINT64 for error + */ +guint64 +gs_utils_get_file_age (GFile *file) +{ + guint64 now; + guint64 mtime; + g_autoptr(GFileInfo) info = NULL; + + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_TIME_MODIFIED, + G_FILE_QUERY_INFO_NONE, + NULL, + NULL); + if (info == NULL) + return G_MAXUINT64; + mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); + now = (guint64) g_get_real_time () / G_USEC_PER_SEC; + if (mtime > now) + return G_MAXUINT64; + if (now - mtime > G_MAXUINT64) + return G_MAXUINT64; + return (guint) (now - mtime); +} + +static gchar * +gs_utils_filename_array_return_newest (GPtrArray *array) +{ + const gchar *filename_best = NULL; + guint age_lowest = G_MAXUINT; + guint i; + for (i = 0; i < array->len; i++) { + const gchar *fn = g_ptr_array_index (array, i); + g_autoptr(GFile) file = g_file_new_for_path (fn); + guint64 age_tmp = gs_utils_get_file_age (file); + if (age_tmp < age_lowest) { + age_lowest = age_tmp; + filename_best = fn; + } + } + return g_strdup (filename_best); +} + +/** + * gs_utils_get_cache_filename: + * @kind: A cache kind, e.g. "fwupd" or "screenshots/123x456" + * @resource: A resource, e.g. "system.bin" or "http://foo.bar/baz.bin" + * @flags: Some #GsUtilsCacheFlags, e.g. %GS_UTILS_CACHE_FLAG_WRITEABLE + * @error: A #GError, or %NULL + * + * Returns a filename that points into the cache. + * This may be per-system or per-user, the latter being more likely + * when %GS_UTILS_CACHE_FLAG_WRITEABLE is specified in @flags. + * + * If %GS_UTILS_CACHE_FLAG_USE_HASH is set in @flags then the returned filename + * will contain the hashed version of @resource. + * + * If there is more than one match, the file that has been modified last is + * returned. + * + * If a plugin requests a file to be saved in the cache it is the plugins + * responsibility to remove the file when it is no longer valid or is too old + * -- gnome-software will not ever clean the cache for the plugin. + * For this reason it is a good idea to use the plugin name as @kind. + * + * This function can only fail if %GS_UTILS_CACHE_FLAG_ENSURE_EMPTY or + * %GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY are passed in @flags. + * + * Returns: The full path and filename, which may or may not exist, or %NULL + **/ +gchar * +gs_utils_get_cache_filename (const gchar *kind, + const gchar *resource, + GsUtilsCacheFlags flags, + GError **error) +{ + const gchar *tmp; + g_autofree gchar *basename = NULL; + g_autofree gchar *cachedir = NULL; + g_autoptr(GFile) cachedir_file = NULL; + g_autoptr(GPtrArray) candidates = g_ptr_array_new_with_free_func (g_free); + g_autoptr(GError) local_error = NULL; + + /* in the self tests */ + tmp = g_getenv ("GS_SELF_TEST_CACHEDIR"); + if (tmp != NULL) { + cachedir = g_build_filename (tmp, kind, NULL); + cachedir_file = g_file_new_for_path (cachedir); + + if ((flags & GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY) && + !g_file_make_directory_with_parents (cachedir_file, NULL, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_EXISTS)) { + g_propagate_error (error, g_steal_pointer (&local_error)); + return NULL; + } + + return g_build_filename (cachedir, resource, NULL);; + } + + /* get basename */ + if (flags & GS_UTILS_CACHE_FLAG_USE_HASH) { + g_autofree gchar *basename_tmp = g_path_get_basename (resource); + g_autofree gchar *hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1, + resource, -1); + basename = g_strdup_printf ("%s-%s", hash, basename_tmp); + } else { + basename = g_path_get_basename (resource); + } + + /* not writable, so try the system cache first */ + if (!(flags & GS_UTILS_CACHE_FLAG_WRITEABLE)) { + g_autofree gchar *cachefn = NULL; + cachefn = g_build_filename (LOCALSTATEDIR, + "cache", + "gnome-software", + kind, + basename, + NULL); + if (g_file_test (cachefn, G_FILE_TEST_EXISTS)) { + g_ptr_array_add (candidates, + g_steal_pointer (&cachefn)); + } + } + + /* create the cachedir in a per-release location, creating + * if it does not already exist */ + cachedir = g_build_filename (g_get_user_cache_dir (), + "gnome-software", + kind, + NULL); + cachedir_file = g_file_new_for_path (cachedir); + if (g_file_query_exists (cachedir_file, NULL) && + flags & GS_UTILS_CACHE_FLAG_ENSURE_EMPTY) { + if (!gs_utils_rmtree (cachedir, error)) + return NULL; + } + if ((flags & GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY) && + !g_file_query_exists (cachedir_file, NULL) && + !g_file_make_directory_with_parents (cachedir_file, NULL, error)) + return NULL; + g_ptr_array_add (candidates, g_build_filename (cachedir, basename, NULL)); + + /* common case: we only have one option */ + if (candidates->len == 1) + return g_strdup (g_ptr_array_index (candidates, 0)); + + /* return the newest (i.e. one with least age) */ + return gs_utils_filename_array_return_newest (candidates); +} + +/** + * gs_utils_get_user_hash: + * @error: A #GError, or %NULL + * + * This SHA1 hash is composed of the contents of machine-id and your + * username and is also salted with a hardcoded value. + * + * This provides an identifier that can be used to identify a specific + * user on a machine, allowing them to cast only one vote or perform + * one review on each app. + * + * There is no known way to calculate the machine ID or username from + * the machine hash and there should be no privacy issue. + * + * Returns: The user hash, or %NULL on error + */ +gchar * +gs_utils_get_user_hash (GError **error) +{ + g_autofree gchar *data = NULL; + g_autofree gchar *salted = NULL; + + if (!g_file_get_contents ("/etc/machine-id", &data, NULL, error)) + return NULL; + + salted = g_strdup_printf ("gnome-software[%s:%s]", + g_get_user_name (), data); + return g_compute_checksum_for_string (G_CHECKSUM_SHA1, salted, -1); +} + +/** + * gs_utils_get_permission: + * @id: A PolicyKit ID, e.g. "org.gnome.Desktop" + * @cancellable: A #GCancellable, or %NULL + * @error: A #GError, or %NULL + * + * Gets a permission object for an ID. + * + * Returns: a #GPermission, or %NULL if this if not possible. + **/ +GPermission * +gs_utils_get_permission (const gchar *id, GCancellable *cancellable, GError **error) +{ +#ifdef HAVE_POLKIT + g_autoptr(GPermission) permission = NULL; + permission = polkit_permission_new_sync (id, NULL, cancellable, error); + if (permission == NULL) { + g_prefix_error (error, "failed to create permission %s: ", id); + gs_utils_error_convert_gio (error); + return NULL; + } + return g_steal_pointer (&permission); +#else + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no PolicyKit, so can't return GPermission for %s", id); + return NULL; +#endif +} + +/** + * gs_utils_get_permission_async: + * @id: a polkit action ID, for example `org.freedesktop.packagekit.trigger-offline-update` + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: callback for when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Asynchronously gets a #GPermission object representing the given polkit + * action @id. + * + * Since: 42 + */ +void +gs_utils_get_permission_async (const gchar *id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (id != NULL); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + +#ifdef HAVE_POLKIT + polkit_permission_new (id, NULL, cancellable, callback, user_data); +#else + g_task_report_new_error (NULL, callback, user_data, gs_utils_get_permission_async, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no PolicyKit, so can't return GPermission for %s", id); +#endif +} + +/** + * gs_utils_get_permission_finish: + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous operation started with gs_utils_get_permission_async(). + * + * Returns: (transfer full): a #GPermission representing the given action ID + * Since: 42 + */ +GPermission * +gs_utils_get_permission_finish (GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + +#ifdef HAVE_POLKIT + return polkit_permission_new_finish (result, error); +#else + return g_task_propagate_pointer (G_TASK (result), error); +#endif +} + +/** + * gs_utils_get_content_type: + * @file: A GFile + * @cancellable: A #GCancellable, or %NULL + * @error: A #GError, or %NULL + * + * Gets the standard content type for a file. + * + * Returns: the content type, or %NULL, e.g. "text/plain" + */ +gchar * +gs_utils_get_content_type (GFile *file, + GCancellable *cancellable, + GError **error) +{ + const gchar *tmp; + g_autoptr(GFileInfo) info = NULL; + + /* get content type */ + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + G_FILE_QUERY_INFO_NONE, + cancellable, + error); + if (info == NULL) + return NULL; + tmp = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE); + if (tmp == NULL) + return NULL; + return g_strdup (tmp); +} + +/** + * gs_utils_get_content_type_async: + * @file: a #GFile + * @cancellable: a #GCancellable, or %NULL + * @callback: callback for when the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Asynchronously get the standard content type for the @file. + * Finish the operation with @gs_utils_get_content_type_finish. + * + * Since: 47 + */ +void +gs_utils_get_content_type_async (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_FILE (file)); + + g_file_query_info_async (file, + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + G_FILE_QUERY_INFO_NONE, + G_PRIORITY_DEFAULT, + cancellable, + callback, + user_data); +} + +/** + * gs_utils_get_content_type_finish: + * @file: a #GFile + * @result: result of the asynchronous operation + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous operation started with gs_utils_get_content_type_async(). + * + * Returns: the content type, or %NULL, e.g. "text/plain" + * + * Since: 47 + **/ +gchar * +gs_utils_get_content_type_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + const gchar *tmp; + g_autoptr(GFileInfo) info = NULL; + + info = g_file_query_info_finish (file, result, error); + if (info == NULL) + return NULL; + tmp = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE); + if (tmp == NULL) + return NULL; + return g_strdup (tmp); +} + +/** + * gs_utils_strv_fnmatch: + * @strv: A NUL-terminated list of strings + * @str: A string + * + * Matches a string against a list of globs. + * + * Returns: %TRUE if the list matches + */ +gboolean +gs_utils_strv_fnmatch (gchar **strv, const gchar *str) +{ + guint i; + + /* empty */ + if (strv == NULL) + return FALSE; + + /* look at each one */ + for (i = 0; strv[i] != NULL; i++) { + if (fnmatch (strv[i], str, 0) == 0) + return TRUE; + } + return FALSE; +} + +/** + * gs_utils_sort_key: + * @str: A string to convert to a sort key + * + * Useful to sort strings in a locale-sensitive, presentational way. + * Case is ignored and utf8 collation is used (e.g. accents are ignored). + * + * Returns: a newly allocated string sort key + */ +gchar * +gs_utils_sort_key (const gchar *str) +{ + g_autofree gchar *casefolded = g_utf8_casefold (str, -1); + return g_utf8_collate_key (casefolded, -1); +} + +/** + * gs_utils_sort_strcmp: + * @str1: (nullable): A string to compare + * @str2: (nullable): A string to compare + * + * Compares two strings in a locale-sensitive, presentational way. + * Case is ignored and utf8 collation is used (e.g. accents are ignored). %NULL + * is sorted before all non-%NULL strings, and %NULLs compare equal. + * + * Returns: < 0 if str1 is before str2, 0 if equal, > 0 if str1 is after str2 + */ +gint +gs_utils_sort_strcmp (const gchar *str1, const gchar *str2) +{ + g_autofree gchar *key1 = (str1 != NULL) ? gs_utils_sort_key (str1) : NULL; + g_autofree gchar *key2 = (str2 != NULL) ? gs_utils_sort_key (str2) : NULL; + return g_strcmp0 (key1, key2); +} + +/** + * gs_utils_get_desktop_app_info: + * @id: A desktop ID, e.g. "gimp.desktop" + * + * Gets a a #GDesktopAppInfo taking into account the kde4- prefix. + * If the given @id doesn not have a ".desktop" suffix, it will add one to it + * for convenience. + * + * Returns: a #GDesktopAppInfo for a specific ID, or %NULL + */ +GDesktopAppInfo * +gs_utils_get_desktop_app_info (const gchar *id) +{ + GDesktopAppInfo *app_info; + g_autofree gchar *desktop_id = NULL; + + /* for convenience, if the given id doesn't have the required .desktop + * suffix, we add it here */ + if (!g_str_has_suffix (id, ".desktop")) { + desktop_id = g_strconcat (id, ".desktop", NULL); + id = desktop_id; + } + + /* try to get the standard app-id */ + app_info = g_desktop_app_info_new (id); + + /* KDE is a special project because it believes /usr/share/applications + * isn't KDE enough. For this reason we support falling back to the + * "kde4-" prefixed ID to avoid educating various self-righteous + * upstreams about the correct ID to use in the AppData file. */ + if (app_info == NULL) { + g_autofree gchar *kde_id = NULL; + kde_id = g_strdup_printf ("%s-%s", "kde4", id); + app_info = g_desktop_app_info_new (kde_id); + } + + return app_info; +} + +/** + * gs_utils_symlink: + * @target: the full path of the symlink to create + * @linkpath: where the symlink should point to + * @error: A #GError, or %NULL + * + * Creates a symlink that can cross filesystem boundaries. + * Any parent directories needed for target to exist are also created. + * + * Returns: %TRUE for success + **/ +gboolean +gs_utils_symlink (const gchar *target, const gchar *linkpath, GError **error) +{ + if (!gs_mkdir_parent (target, error)) + return FALSE; + if (symlink (target, linkpath) != 0) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_WRITE_FAILED, + "failed to create symlink from %s to %s", + linkpath, target); + return FALSE; + } + return TRUE; +} + +/** + * gs_utils_unlink: + * @filename: A full pathname to delete + * @error: A #GError, or %NULL + * + * Deletes a file from disk. + * + * Returns: %TRUE for success + **/ +gboolean +gs_utils_unlink (const gchar *filename, GError **error) +{ + if (g_unlink (filename) != 0) { + gint err = errno; + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_DELETE_FAILED, + _("Failed to delete file “%s”: %s"), filename, g_strerror (err)); + return FALSE; + } + return TRUE; +} + +static gboolean +gs_utils_rmtree_real (const gchar *directory, GError **error) +{ + const gchar *filename; + g_autoptr(GDir) dir = NULL; + + /* try to open */ + dir = g_dir_open (directory, 0, error); + if (dir == NULL) + return FALSE; + + /* find each */ + while ((filename = g_dir_read_name (dir))) { + g_autofree gchar *src = NULL; + src = g_build_filename (directory, filename, NULL); + if (g_file_test (src, G_FILE_TEST_IS_DIR) && + !g_file_test (src, G_FILE_TEST_IS_SYMLINK)) { + if (!gs_utils_rmtree_real (src, error)) + return FALSE; + } else { + if (g_unlink (src) != 0) { + gint err = errno; + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_DELETE_FAILED, + _("Failed to delete file “%s”: %s"), src, g_strerror (err)); + return FALSE; + } + } + } + + if (g_rmdir (directory) != 0) { + gint err = errno; + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_DELETE_FAILED, + _("Failed to delete directory “%s”: %s"), directory, g_strerror (err)); + return FALSE; + } + return TRUE; +} + +/** + * gs_utils_rmtree: + * @directory: A full directory pathname to delete + * @error: A #GError, or %NULL + * + * Deletes a directory from disk and all its contents. + * + * Returns: %TRUE for success + **/ +gboolean +gs_utils_rmtree (const gchar *directory, GError **error) +{ + g_debug ("recursively removing directory '%s'", directory); + return gs_utils_rmtree_real (directory, error); +} + +static gdouble +pnormaldist (gdouble qn) +{ + static gdouble b[11] = { 1.570796288, 0.03706987906, -0.8364353589e-3, + -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5, + -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8, + 0.3657763036e-10, 0.6936233982e-12 }; + gdouble w1, w3; + guint i; + + if (qn < 0 || qn > 1) + return 0; // This is an error case + if (qn == 0.5) + return 0; + + w1 = qn; + if (qn > 0.5) + w1 = 1.0 - w1; + w3 = -log (4.0 * w1 * (1.0 - w1)); + w1 = b[0]; + for (i = 1; i < 11; i++) + w1 = w1 + (b[i] * pow (w3, i)); + + if (qn > 0.5) + return sqrt (w1 * w3); + else + return -sqrt (w1 * w3); +} + +static gdouble +wilson_score (gdouble value, gdouble n, gdouble power) +{ + gdouble z, phat; + if (value == 0) + return 0; + z = pnormaldist (1 - power / 2); + phat = value / n; + return (phat + z * z / (2 * n) - + z * sqrt ((phat * (1 - phat) + z * z / (4 * n)) / n)) / + (1 + z * z / n); +} + +/** + * gs_utils_get_wilson_rating: + * @star1: The number of 1 star reviews + * @star2: The number of 2 star reviews + * @star3: The number of 3 star reviews + * @star4: The number of 4 star reviews + * @star5: The number of 5 star reviews + * + * Returns the lower bound of Wilson score confidence interval for a + * Bernoulli parameter. This ensures small numbers of ratings don't give overly + * high scores. + * See https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval + * for details. + * + * Returns: Wilson rating percentage, or -1 for error + **/ +gint +gs_utils_get_wilson_rating (guint64 star1, + guint64 star2, + guint64 star3, + guint64 star4, + guint64 star5) +{ + gdouble val; + guint64 star_sum = star1 + star2 + star3 + star4 + star5; + if (star_sum == 0) + return -1; + + /* get score */ + val = (wilson_score ((gdouble) star1, (gdouble) star_sum, 0.2) * -2); + val += (wilson_score ((gdouble) star2, (gdouble) star_sum, 0.2) * -1); + val += (wilson_score ((gdouble) star4, (gdouble) star_sum, 0.2) * 1); + val += (wilson_score ((gdouble) star5, (gdouble) star_sum, 0.2) * 2); + + /* normalize from -2..+2 to 0..5 */ + val += 3; + + /* multiply to a percentage */ + val *= 20; + + /* return rounded up integer */ + return (gint) ceil (val); +} + +/** + * gs_utils_error_add_app_id: + * @error: a #GError + * @app: a #GsApp + * + * Adds app unique ID prefix to the error. + * + * Since: 3.30 + **/ +void +gs_utils_error_add_app_id (GError **error, GsApp *app) +{ + g_return_if_fail (GS_APP (app)); + if (error == NULL || *error == NULL) + return; + g_prefix_error (error, "{%s} ", gs_app_get_unique_id (app)); +} + +/** + * gs_utils_error_add_origin_id: + * @error: a #GError + * @origin: a #GsApp + * + * Adds origin unique ID prefix to the error. + * + * Since: 3.30 + **/ +void +gs_utils_error_add_origin_id (GError **error, GsApp *origin) +{ + g_return_if_fail (GS_APP (origin)); + if (error == NULL || *error == NULL) + return; + g_prefix_error (error, "[%s] ", gs_app_get_unique_id (origin)); +} + +/** + * gs_utils_error_strip_app_id: + * @error: a #GError + * + * Removes a possible app ID prefix from the error, and returns the removed + * app ID. + * + * Returns: A newly allocated string with the app ID + * + * Since: 3.30 + **/ +gchar * +gs_utils_error_strip_app_id (GError *error) +{ + g_autofree gchar *app_id = NULL; + g_autofree gchar *msg = NULL; + + if (error == NULL || error->message == NULL) + return FALSE; + + if (g_str_has_prefix (error->message, "{")) { + const gchar *endp = strstr (error->message + 1, "} "); + if (endp != NULL) { + app_id = g_strndup (error->message + 1, + endp - (error->message + 1)); + msg = g_strdup (endp + 2); + } + } + + if (msg != NULL) { + g_free (error->message); + error->message = g_steal_pointer (&msg); + } + + return g_steal_pointer (&app_id); +} + +/** + * gs_utils_error_strip_origin_id: + * @error: a #GError + * + * Removes a possible origin ID prefix from the error, and returns the removed + * origin ID. + * + * Returns: A newly allocated string with the origin ID + * + * Since: 3.30 + **/ +gchar * +gs_utils_error_strip_origin_id (GError *error) +{ + g_autofree gchar *origin_id = NULL; + g_autofree gchar *msg = NULL; + + if (error == NULL || error->message == NULL) + return FALSE; + + if (g_str_has_prefix (error->message, "[")) { + const gchar *endp = strstr (error->message + 1, "] "); + if (endp != NULL) { + origin_id = g_strndup (error->message + 1, + endp - (error->message + 1)); + msg = g_strdup (endp + 2); + } + } + + if (msg != NULL) { + g_free (error->message); + error->message = g_steal_pointer (&msg); + } + + return g_steal_pointer (&origin_id); +} + +/** + * gs_utils_error_convert_gdbus: + * @perror: a pointer to a #GError, or %NULL + * + * Converts the #GDBusError to an error with a GsPluginError domain. + * + * Returns: %TRUE if the error was converted, or already correct + **/ +gboolean +gs_utils_error_convert_gdbus (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return FALSE; + if (error->domain == GS_PLUGIN_ERROR) + return TRUE; + if (error->domain != G_DBUS_ERROR) + return FALSE; + switch (error->code) { + case G_DBUS_ERROR_FAILED: + case G_DBUS_ERROR_NO_REPLY: + case G_DBUS_ERROR_TIMEOUT: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + case G_DBUS_ERROR_IO_ERROR: + case G_DBUS_ERROR_NAME_HAS_NO_OWNER: + case G_DBUS_ERROR_NOT_SUPPORTED: + case G_DBUS_ERROR_SERVICE_UNKNOWN: + case G_DBUS_ERROR_UNKNOWN_INTERFACE: + case G_DBUS_ERROR_UNKNOWN_METHOD: + case G_DBUS_ERROR_UNKNOWN_OBJECT: + case G_DBUS_ERROR_UNKNOWN_PROPERTY: + error->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + break; + case G_DBUS_ERROR_NO_MEMORY: + error->code = GS_PLUGIN_ERROR_NO_SPACE; + break; + case G_DBUS_ERROR_ACCESS_DENIED: + case G_DBUS_ERROR_AUTH_FAILED: + error->code = GS_PLUGIN_ERROR_NO_SECURITY; + break; + case G_DBUS_ERROR_NO_NETWORK: + error->code = GS_PLUGIN_ERROR_NO_NETWORK; + break; + case G_DBUS_ERROR_INVALID_FILE_CONTENT: + error->code = GS_PLUGIN_ERROR_INVALID_FORMAT; + break; + default: + g_warning ("can't reliably fixup error code %i in domain %s: %s", + error->code, g_quark_to_string (error->domain), + error->message); + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + error->domain = GS_PLUGIN_ERROR; + return TRUE; +} + +/** + * gs_utils_error_convert_gio: + * @perror: a pointer to a #GError, or %NULL + * + * Converts the #GIOError to an error with a GsPluginError domain. + * + * Returns: %TRUE if the error was converted, or already correct + **/ +gboolean +gs_utils_error_convert_gio (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return FALSE; + if (error->domain == GS_PLUGIN_ERROR) + return TRUE; + if (error->domain != G_IO_ERROR) + return FALSE; + switch (error->code) { + case G_IO_ERROR_FAILED: + case G_IO_ERROR_NOT_FOUND: + case G_IO_ERROR_EXISTS: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + case G_IO_ERROR_TIMED_OUT: + error->code = GS_PLUGIN_ERROR_TIMED_OUT; + break; + case G_IO_ERROR_NOT_SUPPORTED: + error->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + break; + case G_IO_ERROR_CANCELLED: + error->code = GS_PLUGIN_ERROR_CANCELLED; + break; + case G_IO_ERROR_NO_SPACE: + error->code = GS_PLUGIN_ERROR_NO_SPACE; + break; + case G_IO_ERROR_PERMISSION_DENIED: + error->code = GS_PLUGIN_ERROR_NO_SECURITY; + break; + case G_IO_ERROR_HOST_NOT_FOUND: + case G_IO_ERROR_HOST_UNREACHABLE: + case G_IO_ERROR_CONNECTION_REFUSED: + case G_IO_ERROR_PROXY_FAILED: + case G_IO_ERROR_PROXY_AUTH_FAILED: + case G_IO_ERROR_PROXY_NOT_ALLOWED: + error->code = GS_PLUGIN_ERROR_DOWNLOAD_FAILED; + break; + case G_IO_ERROR_NETWORK_UNREACHABLE: + error->code = GS_PLUGIN_ERROR_NO_NETWORK; + break; + default: + g_warning ("can't reliably fixup error code %i in domain %s: %s", + error->code, g_quark_to_string (error->domain), + error->message); + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + error->domain = GS_PLUGIN_ERROR; + return TRUE; +} + +/** + * gs_utils_error_convert_gresolver: + * @perror: a pointer to a #GError, or %NULL + * + * Converts the #GResolverError to an error with a GsPluginError domain. + * + * Returns: %TRUE if the error was converted, or already correct + **/ +gboolean +gs_utils_error_convert_gresolver (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return FALSE; + if (error->domain == GS_PLUGIN_ERROR) + return TRUE; + if (error->domain != G_RESOLVER_ERROR) + return FALSE; + switch (error->code) { + case G_RESOLVER_ERROR_INTERNAL: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + case G_RESOLVER_ERROR_NOT_FOUND: + case G_RESOLVER_ERROR_TEMPORARY_FAILURE: + error->code = GS_PLUGIN_ERROR_DOWNLOAD_FAILED; + break; + default: + g_warning ("can't reliably fixup error code %i in domain %s: %s", + error->code, g_quark_to_string (error->domain), + error->message); + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + error->domain = GS_PLUGIN_ERROR; + return TRUE; +} + +/** + * gs_utils_error_convert_gdk_pixbuf: + * @perror: a pointer to a #GError, or %NULL + * + * Converts the #GdkPixbufError to an error with a GsPluginError domain. + * + * Returns: %TRUE if the error was converted, or already correct + **/ +gboolean +gs_utils_error_convert_gdk_pixbuf (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return FALSE; + if (error->domain == GS_PLUGIN_ERROR) + return TRUE; + if (error->domain != GDK_PIXBUF_ERROR) + return FALSE; + switch (error->code) { + case GDK_PIXBUF_ERROR_UNSUPPORTED_OPERATION: + case GDK_PIXBUF_ERROR_UNKNOWN_TYPE: + error->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + break; + case GDK_PIXBUF_ERROR_FAILED: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + case GDK_PIXBUF_ERROR_CORRUPT_IMAGE: + error->code = GS_PLUGIN_ERROR_INVALID_FORMAT; + break; + default: + g_warning ("can't reliably fixup error code %i in domain %s: %s", + error->code, g_quark_to_string (error->domain), + error->message); + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + error->domain = GS_PLUGIN_ERROR; + return TRUE; +} + +/** + * gs_utils_error_convert_appstream: + * @perror: a pointer to a #GError, or %NULL + * + * Converts the various AppStream error types to an error with a GsPluginError + * domain. + * + * Returns: %TRUE if the error was converted, or already correct + **/ +gboolean +gs_utils_error_convert_appstream (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return FALSE; + if (error->domain == GS_PLUGIN_ERROR) + return TRUE; + + /* custom to this plugin */ + if (error->domain == AS_METADATA_ERROR) { + switch (error->code) { + case AS_METADATA_ERROR_PARSE: + case AS_METADATA_ERROR_FORMAT_UNEXPECTED: + case AS_METADATA_ERROR_NO_COMPONENT: + error->code = GS_PLUGIN_ERROR_INVALID_FORMAT; + break; + case AS_METADATA_ERROR_FAILED: + default: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + } else if (error->domain == AS_POOL_ERROR) { + switch (error->code) { + case AS_POOL_ERROR_FAILED: + default: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + } else if (error->domain == G_FILE_ERROR) { + switch (error->code) { + case G_FILE_ERROR_EXIST: + case G_FILE_ERROR_ACCES: + case G_FILE_ERROR_PERM: + error->code = GS_PLUGIN_ERROR_NO_SECURITY; + break; + case G_FILE_ERROR_NOSPC: + error->code = GS_PLUGIN_ERROR_NO_SPACE; + break; + default: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + } else { + g_warning ("can't reliably fixup error code %i in domain %s: %s", + error->code, g_quark_to_string (error->domain), + error->message); + error->code = GS_PLUGIN_ERROR_FAILED; + } + error->domain = GS_PLUGIN_ERROR; + return TRUE; +} + +/** + * gs_utils_get_url_scheme: + * @url: A URL, e.g. "appstream://gimp.desktop" + * + * Gets the scheme from the URL string. + * + * Returns: the URL scheme, e.g. "appstream" + */ +gchar * +gs_utils_get_url_scheme (const gchar *url) +{ + g_autoptr(GUri) uri = NULL; + + /* no data */ + if (url == NULL) + return NULL; + + /* create URI from URL */ + uri = g_uri_parse (url, SOUP_HTTP_URI_FLAGS, NULL); + if (!uri) + return NULL; + + /* success */ + return g_strdup (g_uri_get_scheme (uri)); +} + +/** + * gs_utils_get_url_path: + * @url: A URL, e.g. "appstream://gimp.desktop" + * + * Gets the path from the URL string, removing any leading slashes. + * + * Returns: the URL path, e.g. "gimp.desktop" + */ +gchar * +gs_utils_get_url_path (const gchar *url) +{ + g_autoptr(GUri) uri = NULL; + const gchar *host; + const gchar *path; + + uri = g_uri_parse (url, SOUP_HTTP_URI_FLAGS, NULL); + if (!uri) + return NULL; + + /* foo://bar -> scheme: foo, host: bar, path: / */ + /* foo:bar -> scheme: foo, host: (empty string), path: /bar */ + host = g_uri_get_host (uri); + path = g_uri_get_path (uri); + if (host != NULL && *host != '\0') + path = host; + + /* trim any leading slashes */ + while (*path == '/') + path++; + + /* success */ + return g_strdup (path); +} + +/** + * gs_user_agent: + * + * Gets the user agent to use for remote requests. + * + * Returns: the user-agent, e.g. "gnome-software/3.22.1" + */ +const gchar * +gs_user_agent (void) +{ + return PACKAGE_NAME "/" PACKAGE_VERSION; +} + +/** + * gs_utils_append_key_value: + * @str: A #GString + * @align_len: The alignment of the @value compared to the @key + * @key: The text to use as a title + * @value: The text to use as a value + * + * Adds a line to an existing string, padding the key to a set number of spaces. + * + * Since: 3.26 + */ +void +gs_utils_append_key_value (GString *str, gsize align_len, + const gchar *key, const gchar *value) +{ + gsize len = 0; + + g_return_if_fail (str != NULL); + g_return_if_fail (value != NULL); + + if (key != NULL) { + len = strlen (key) + 2; + g_string_append (str, key); + g_string_append (str, ": "); + } + for (gsize i = len; i < align_len + 1; i++) + g_string_append (str, " "); + g_string_append (str, value); + g_string_append (str, "\n"); +} + +guint +gs_utils_get_memory_total (void) +{ +#if defined(__linux__) + struct sysinfo si = { 0 }; + sysinfo (&si); + if (si.mem_unit > 0) + return si.totalram / MB_IN_BYTES / si.mem_unit; + return 0; +#elif defined(__FreeBSD__) + unsigned long physmem; + sysctl ((int[]){ CTL_HW, HW_PHYSMEM }, 2, &physmem, &(size_t){ sizeof (physmem) }, NULL, 0); + return physmem / MB_IN_BYTES; +#else +#error "Please implement gs_utils_get_memory_total for your system." +#endif +} + +/** + * gs_utils_unique_id_compat_convert: + * @data_id: (nullable): A string that may be a unique component ID + * + * Converts the unique ID string from its legacy 6-part form into + * a new-style 5-part AppStream data-id. + * Does nothing if the string is already valid. + * + * See !583 for the history of this conversion. + * + * Returns: (nullable): A newly allocated string with the new-style data-id, or %NULL if input was no valid ID. + * + * Since: 40 + **/ +gchar* +gs_utils_unique_id_compat_convert (const gchar *data_id) +{ + g_auto(GStrv) parts = NULL; + if (data_id == NULL) + return NULL; + + /* check for the most common case first: data-id is already valid */ + if (as_utils_data_id_valid (data_id)) + return g_strdup (data_id); + + parts = g_strsplit (data_id, "/", -1); + if (g_strv_length (parts) != 6) + return NULL; + return g_strdup_printf ("%s/%s/%s/%s/%s", + parts[0], + parts[1], + parts[2], + parts[4], + parts[5]); +} + +static const gchar * +_fix_data_id_part (const gchar *value) +{ + if (!value || !*value) + return "*"; + + return value; +} + +/** + * gs_utils_build_unique_id: + * @scope: Scope of the metadata as #AsComponentScope e.g. %AS_COMPONENT_SCOPE_SYSTEM + * @bundle_kind: Bundling system providing this data, e.g. 'package' or 'flatpak' + * @origin: Origin string, e.g. 'os' or 'gnome-apps-nightly' + * @cid: AppStream component ID, e.g. 'org.freedesktop.appstream.cli' + * @branch: Branch, e.g. '3-20' or 'master' + * + * Builds an identifier string unique to the individual dataset using the supplied information. + * It's similar to as_utils_build_data_id(), except it respects the @origin for the packages. + * + * Returns: (transfer full): a unique ID, free with g_free(), when no longer needed. + * + * Since: 41 + */ +gchar * +gs_utils_build_unique_id (AsComponentScope scope, + AsBundleKind bundle_kind, + const gchar *origin, + const gchar *cid, + const gchar *branch) +{ + const gchar *scope_str = NULL; + const gchar *bundle_str = NULL; + + if (scope != AS_COMPONENT_SCOPE_UNKNOWN) + scope_str = as_component_scope_to_string (scope); + if (bundle_kind != AS_BUNDLE_KIND_UNKNOWN) + bundle_str = as_bundle_kind_to_string (bundle_kind); + + return g_strdup_printf ("%s/%s/%s/%s/%s", + _fix_data_id_part (scope_str), + _fix_data_id_part (bundle_str), + _fix_data_id_part (origin), + _fix_data_id_part (cid), + _fix_data_id_part (branch)); +} + +static void +gs_pixbuf_blur_private (GdkPixbuf *src, GdkPixbuf *dest, guint radius, guint8 *div_kernel_size) +{ + gint width, height, src_rowstride, dest_rowstride, n_channels; + guchar *p_src, *p_dest, *c1, *c2; + gint x, y, i, i1, i2, width_minus_1, height_minus_1, radius_plus_1; + gint r, g, b; + guchar *p_dest_row, *p_dest_col; + + width = gdk_pixbuf_get_width (src); + height = gdk_pixbuf_get_height (src); + n_channels = gdk_pixbuf_get_n_channels (src); + radius_plus_1 = radius + 1; + + /* horizontal blur */ + p_src = gdk_pixbuf_get_pixels (src); + p_dest = gdk_pixbuf_get_pixels (dest); + src_rowstride = gdk_pixbuf_get_rowstride (src); + dest_rowstride = gdk_pixbuf_get_rowstride (dest); + width_minus_1 = width - 1; + for (y = 0; y < height; y++) { + + /* calc the initial sums of the kernel */ + r = g = b = 0; + for (i = -radius; i <= (gint) radius; i++) { + c1 = p_src + (CLAMP (i, 0, width_minus_1) * n_channels); + r += c1[0]; + g += c1[1]; + b += c1[2]; + } + + p_dest_row = p_dest; + for (x = 0; x < width; x++) { + /* set as the mean of the kernel */ + p_dest_row[0] = div_kernel_size[r]; + p_dest_row[1] = div_kernel_size[g]; + p_dest_row[2] = div_kernel_size[b]; + p_dest_row += n_channels; + + /* the pixel to add to the kernel */ + i1 = x + radius_plus_1; + if (i1 > width_minus_1) + i1 = width_minus_1; + c1 = p_src + (i1 * n_channels); + + /* the pixel to remove from the kernel */ + i2 = x - radius; + if (i2 < 0) + i2 = 0; + c2 = p_src + (i2 * n_channels); + + /* calc the new sums of the kernel */ + r += c1[0] - c2[0]; + g += c1[1] - c2[1]; + b += c1[2] - c2[2]; + } + + p_src += src_rowstride; + p_dest += dest_rowstride; + } + + /* vertical blur */ + p_src = gdk_pixbuf_get_pixels (dest); + p_dest = gdk_pixbuf_get_pixels (src); + src_rowstride = gdk_pixbuf_get_rowstride (dest); + dest_rowstride = gdk_pixbuf_get_rowstride (src); + height_minus_1 = height - 1; + for (x = 0; x < width; x++) { + + /* calc the initial sums of the kernel */ + r = g = b = 0; + for (i = -radius; i <= (gint) radius; i++) { + c1 = p_src + (CLAMP (i, 0, height_minus_1) * src_rowstride); + r += c1[0]; + g += c1[1]; + b += c1[2]; + } + + p_dest_col = p_dest; + for (y = 0; y < height; y++) { + /* set as the mean of the kernel */ + + p_dest_col[0] = div_kernel_size[r]; + p_dest_col[1] = div_kernel_size[g]; + p_dest_col[2] = div_kernel_size[b]; + p_dest_col += dest_rowstride; + + /* the pixel to add to the kernel */ + i1 = y + radius_plus_1; + if (i1 > height_minus_1) + i1 = height_minus_1; + c1 = p_src + (i1 * src_rowstride); + + /* the pixel to remove from the kernel */ + i2 = y - radius; + if (i2 < 0) + i2 = 0; + c2 = p_src + (i2 * src_rowstride); + + /* calc the new sums of the kernel */ + r += c1[0] - c2[0]; + g += c1[1] - c2[1]; + b += c1[2] - c2[2]; + } + + p_src += n_channels; + p_dest += n_channels; + } +} + +/** + * gs_utils_pixbuf_blur: + * @src: the GdkPixbuf. + * @radius: the pixel radius for the gaussian blur, typical values are 1..3 + * @iterations: Amount to blur the image, typical values are 1..5 + * + * Blurs an image. Warning, this method is s..l..o..w... for large images. + **/ +void +gs_utils_pixbuf_blur (GdkPixbuf *src, guint radius, guint iterations) +{ + gint kernel_size; + gint i; + g_autofree guchar *div_kernel_size = NULL; + g_autoptr(GdkPixbuf) tmp = NULL; + + tmp = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (src), + gdk_pixbuf_get_has_alpha (src), + gdk_pixbuf_get_bits_per_sample (src), + gdk_pixbuf_get_width (src), + gdk_pixbuf_get_height (src)); + kernel_size = 2 * radius + 1; + div_kernel_size = g_new (guchar, 256 * kernel_size); + for (i = 0; i < 256 * kernel_size; i++) + div_kernel_size[i] = (guchar) (i / kernel_size); + + while (iterations-- > 0) + gs_pixbuf_blur_private (src, tmp, radius, div_kernel_size); +} + +/** + * gs_utils_get_file_size: + * @filename: a file name to get the size of; it can be a file or a directory + * @include_func: (nullable) (scope call): optional callback to limit what files to count + * @user_data: user data passed to the @include_func + * @cancellable: (nullable): an optional #GCancellable or %NULL + * + * Gets the size of the file or a directory identified by @filename. + * + * When the @include_func is not %NULL, it can limit which files are included + * in the resulting size. When it's %NULL, all files and subdirectories are included. + * + * Returns: disk size of the @filename; or 0 when not found + * + * Since: 41 + **/ +guint64 +gs_utils_get_file_size (const gchar *filename, + GsFileSizeIncludeFunc include_func, + gpointer user_data, + GCancellable *cancellable) +{ + guint64 size = 0; + + g_return_val_if_fail (filename != NULL, 0); + + if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { + GSList *dirs_to_do = NULL; + gsize base_len = strlen (filename); + + /* The `include_func()` expects a path relative to the `filename`, without + a leading dir separator. As the `dirs_to_do` contains the full path, + constructed with `g_build_filename()`, the added dir separator needs + to be skipped, when it's not part of the `filename` already. */ + if (!g_str_has_suffix (filename, G_DIR_SEPARATOR_S)) + base_len++; + + dirs_to_do = g_slist_prepend (dirs_to_do, g_strdup (filename)); + while (dirs_to_do != NULL && !g_cancellable_is_cancelled (cancellable)) { + g_autofree gchar *path = NULL; + g_autoptr(GDir) dir = NULL; + + /* Steal the top `path` out of the `dirs_to_do`. */ + path = dirs_to_do->data; + dirs_to_do = g_slist_remove (dirs_to_do, path); + + dir = g_dir_open (path, 0, NULL); + if (dir) { + const gchar *name; + while (name = g_dir_read_name (dir), name != NULL && !g_cancellable_is_cancelled (cancellable)) { + g_autofree gchar *full_path = g_build_filename (path, name, NULL); + GStatBuf st; + + if (g_stat (full_path, &st) == 0 && (include_func == NULL || + include_func (full_path + base_len, + g_file_test (full_path, G_FILE_TEST_IS_SYMLINK) ? G_FILE_TEST_IS_SYMLINK : + S_ISDIR (st.st_mode) ? G_FILE_TEST_IS_DIR : + G_FILE_TEST_IS_REGULAR, + user_data))) { + if (S_ISDIR (st.st_mode)) { + /* Skip symlinks, they can point to a shared storage */ + if (!g_file_test (full_path, G_FILE_TEST_IS_SYMLINK)) + dirs_to_do = g_slist_prepend (dirs_to_do, g_steal_pointer (&full_path)); + } else { + size += st.st_size; + } + } + } + } + } + g_slist_free_full (dirs_to_do, g_free); + } else { + GStatBuf st; + + if (g_stat (filename, &st) == 0) + size = st.st_size; + } + + return size; +} + +#define METADATA_ETAG_ATTRIBUTE "xattr::gnome-software::etag" + +/** + * gs_utils_get_file_etag: + * @file: a file to get the ETag for + * @last_modified_date_out: (out callee-allocates) (transfer full) (optional) (nullable): + * return location for the last modified date of the file (%NULL to ignore), + * or %NULL if unknown + * @cancellable: (nullable): an optional #GCancellable or %NULL + * + * Gets the ETag for the @file, previously stored by + * gs_utils_set_file_etag(). + * + * Returns: (nullable) (transfer full): The ETag stored for the @file, + * or %NULL, when the file does not exist, no ETag is stored for it + * or other error occurs. + * + * Since: 43 + **/ +gchar * +gs_utils_get_file_etag (GFile *file, + GDateTime **last_modified_date_out, + GCancellable *cancellable) +{ + g_autoptr(GFileInfo) info = NULL; + const gchar *attributes; + g_autoptr(GError) local_error = NULL; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + + if (last_modified_date_out == NULL) + attributes = METADATA_ETAG_ATTRIBUTE; + else + attributes = METADATA_ETAG_ATTRIBUTE "," G_FILE_ATTRIBUTE_TIME_MODIFIED; + + info = g_file_query_info (file, attributes, G_FILE_QUERY_INFO_NONE, cancellable, &local_error); + + if (info == NULL) { + g_debug ("Error getting attribute ‘%s’ for file ‘%s’: %s", + METADATA_ETAG_ATTRIBUTE, g_file_peek_path (file), local_error->message); + + if (last_modified_date_out != NULL) + *last_modified_date_out = NULL; + + return NULL; + } + + if (last_modified_date_out != NULL) + *last_modified_date_out = g_file_info_get_modification_date_time (info); + + return g_strdup (g_file_info_get_attribute_string (info, METADATA_ETAG_ATTRIBUTE)); +} + +/** + * gs_utils_set_file_etag: + * @file: a file to get the ETag for + * @etag: (nullable): an ETag to set + * @cancellable: (nullable): an optional #GCancellable or %NULL + * + * Sets the ETag for the @file. When the @etag is %NULL or an empty + * string, then unsets the ETag for the @file. The ETag can be read + * back with gs_utils_get_file_etag(). + * + * The @file should exist, otherwise the function fails. + * + * Returns: whether succeeded. + * + * Since: 42 + **/ +gboolean +gs_utils_set_file_etag (GFile *file, + const gchar *etag, + GCancellable *cancellable) +{ + g_autoptr(GError) local_error = NULL; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + + if (etag == NULL || *etag == '\0') { + if (!g_file_set_attribute (file, METADATA_ETAG_ATTRIBUTE, G_FILE_ATTRIBUTE_TYPE_INVALID, + NULL, G_FILE_QUERY_INFO_NONE, cancellable, &local_error)) { + g_debug ("Error clearing attribute ‘%s’ on file ‘%s’: %s", + METADATA_ETAG_ATTRIBUTE, g_file_peek_path (file), local_error->message); + return FALSE; + } + + return TRUE; + } + + if (!g_file_set_attribute_string (file, METADATA_ETAG_ATTRIBUTE, etag, G_FILE_QUERY_INFO_NONE, cancellable, &local_error)) { + g_debug ("Error setting attribute ‘%s’ to ‘%s’ on file ‘%s’: %s", + METADATA_ETAG_ATTRIBUTE, etag, g_file_peek_path (file), local_error->message); + return FALSE; + } + + return TRUE; +} + +/** + * gs_utils_get_upgrade_background: + * @version: (nullable): version string of the upgrade (which must be non-empty + * if provided), or %NULL if unknown + * + * Get the path to a background image to display as the background for a banner + * advertising an upgrade to the given @version. + * + * If a path is returned, it’s guaranteed to exist on the file system. + * + * Vendors can drop their customised backgrounds in this directory for them to + * be used by gnome-software. See `doc/vendor-customisation.md`. + * + * Returns: (transfer full) (type filename) (nullable): path to an upgrade + * background image to use, or %NULL if a suitable one didn’t exist + * Since: 42 +*/ +gchar * +gs_utils_get_upgrade_background (const gchar *version) +{ + g_autofree gchar *filename = NULL; + g_autofree gchar *os_id = g_get_os_info (G_OS_INFO_KEY_ID); + + g_return_val_if_fail (version == NULL || *version != '\0', NULL); + + if (version != NULL) { + filename = g_strdup_printf (DATADIR "/gnome-software/backgrounds/%s-%s.png", os_id, version); + if (g_file_test (filename, G_FILE_TEST_EXISTS)) + return g_steal_pointer (&filename); + g_clear_pointer (&filename, g_free); + } + + filename = g_strdup_printf (DATADIR "/gnome-software/backgrounds/%s.png", os_id); + if (g_file_test (filename, G_FILE_TEST_EXISTS)) + return g_steal_pointer (&filename); + g_clear_pointer (&filename, g_free); + + return NULL; +} + +/** + * gs_utils_app_sort_name: + * @app1: a #GsApp + * @app2: another #GsApp + * @user_data: data passed to the sort function + * + * Comparison function to sort apps in increasing alphabetical order of name. + * + * This is suitable for passing to gs_app_list_sort(). + * + * Returns: a strcmp()-style sort value comparing @app1 to @app2 + * Since: 43 + */ +gint +gs_utils_app_sort_name (GsApp *app1, + GsApp *app2, + gpointer user_data) +{ + return gs_utils_sort_strcmp (gs_app_get_name (app1), gs_app_get_name (app2)); +} + +/** + * gs_utils_app_sort_match_value: + * @app1: a #GsApp + * @app2: another #GsApp + * @user_data: data passed to the sort function + * + * Comparison function to sort apps in decreasing order of match value + * (#GsApp:match-value). + * + * This is suitable for passing to gs_app_list_sort(). + * + * Returns: a strcmp()-style sort value comparing @app1 to @app2 + * Since: 43 + */ +gint +gs_utils_app_sort_match_value (GsApp *app1, + GsApp *app2, + gpointer user_data) +{ + return gs_app_get_match_value (app2) - gs_app_get_match_value (app1); +} + +/** + * gs_utils_app_sort_priority: + * @app1: a #GsApp + * @app2: another #GsApp + * @user_data: data passed to the sort function + * + * Comparison function to sort apps in increasing order of their priority + * (#GsApp:priority). + * + * This is suitable for passing to gs_app_list_sort(). + * + * Returns: a strcmp()-style sort value comparing @app1 to @app2 + * Since: 43 + */ +gint +gs_utils_app_sort_priority (GsApp *app1, + GsApp *app2, + gpointer user_data) +{ + return gs_app_compare_priority (app1, app2); +} + +/** + * gs_utils_gstring_replace: + * @str: a #GString to replace the text in + * @find: a text to find + * @replace: a text to replace the found text with + * + * Replaces all @find occurrences in @str with @replace. + * + * Since: 45 + **/ +void +gs_utils_gstring_replace (GString *str, + const gchar *find, + const gchar *replace) +{ +#if AS_CHECK_VERSION(1, 0, 0) + as_gstring_replace (str, find, replace, 0); +#else + as_gstring_replace2 (str, find, replace, 0); +#endif +} + +static gint +get_app_kind_rank (GsApp *app) +{ + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + return 2; + case AS_COMPONENT_KIND_WEB_APP: + return 3; + case AS_COMPONENT_KIND_RUNTIME: + return 4; + case AS_COMPONENT_KIND_ADDON: + return 5; + case AS_COMPONENT_KIND_CODEC: + case AS_COMPONENT_KIND_FONT: + return 6; + case AS_COMPONENT_KIND_INPUT_METHOD: + return 7; + default: + if (gs_app_get_special_kind (app) == GS_APP_SPECIAL_KIND_OS_UPDATE) + return 1; + else + return 8; + } +} + +/** + * gs_utils_app_sort_kind: + * @app1: a #GsApp + * @app2: another #GsApp + * + * Comparison function to sort apps by Appstream kind, then by + * increasing alphabetical order of name. + * + * This is useful for sorting apps with multiple kinds (E.g Updates / + * Updated pages), as opposed to category pages where all apps are of + * the same kind. + * + * Returns: < 0 if app1 is before app2, 0 if equal, > 0 if app1 is after app2 + * + * Since: 47 + **/ +gint +gs_utils_app_sort_kind (GsApp *app1, GsApp *app2) +{ + gint rank1, rank2; + + rank1 = get_app_kind_rank (app1); + rank2 = get_app_kind_rank (app2); + + /* sort apps by name if they are of same kind */ + if (rank1 == rank2) + return gs_utils_app_sort_name (app1, app2, NULL); + + return rank1 < rank2 ? -1 : 1; +} + +/** + * gs_utils_compare_versions: + * @ver1: the first version string + * @ver2: the second version string + * + * Compares @ver1 and @ver2, return value as `strcmp()`, that is, a number + * below zero, when the @ver1 is before @ver2 zero, when @ver1 is the same + * as @ver2, and a number above zero, when @ver1 is lower than @ver2. + * + * Returns: a compare result of the two version string comparison + * + * Since: 48 + **/ +gint +gs_utils_compare_versions (const gchar *ver1, + const gchar *ver2) +{ + int rc; + + if (ver1 == NULL || ver2 == NULL) + return ver1 == ver2 ? 0 : ver1 == NULL ? -1 : 1; + + /* compare with epoch */ + rc = as_vercmp (ver1, ver2, AS_VERCMP_FLAG_NONE); + if (rc > 0) { + /* the version can sometimes end with a non-version string, common + in both strings, which can confuse the comparison, thus try without + the suffix, if such exists and is not a number. For example: + "2:2.1-61.fc40" and "2:2.1-61.1.fc40" is reported as a downgrade, + but without the common suffix ".fc40" it's correctly reported + as an update. + + FIXME: Eventually this needs to be factored out into a plugin-specific + implementation so we can use + https://github.com/PackageKit/PackageKit/issues/826. */ + size_t lenv1, lenv2; + + lenv1 = strlen (ver1); + lenv2 = strlen (ver2); + + for (size_t i = 0; i < lenv1 && i < lenv2; i++) { + if (ver1[lenv1 - i - 1] != ver2[lenv2 - i - 1] || + ver1[lenv1 - i - 1] == '.' || + ver1[lenv1 - i - 1] == '-') { + if (i > 0 && !g_ascii_isdigit (ver1[lenv1 - i])) { + g_autofree gchar *cut_v1 = g_strndup (ver1, lenv1 - i - 1); + g_autofree gchar *cut_v2 = g_strndup (ver2, lenv2 - i - 1); + rc = as_vercmp (cut_v1, cut_v2, AS_VERCMP_FLAG_NONE); + } + break; + } + } + } + + return rc; +} diff --git a/lib/gs-utils.h b/lib/gs-utils.h new file mode 100644 index 0000000..260a10e --- /dev/null +++ b/lib/gs-utils.h @@ -0,0 +1,168 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gs-app.h" + +G_BEGIN_DECLS + +/** + * GsUtilsCacheFlags: + * @GS_UTILS_CACHE_FLAG_NONE: No flags set + * @GS_UTILS_CACHE_FLAG_WRITEABLE: A writable directory is required + * @GS_UTILS_CACHE_FLAG_USE_HASH: Prefix a hash to the filename + * @GS_UTILS_CACHE_FLAG_ENSURE_EMPTY: Clear all existing cached items in the cache kind (not just the specified resource) + * @GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY: Create the cache directory (Since: 40) + * + * The cache flags. + **/ +typedef enum { + GS_UTILS_CACHE_FLAG_NONE = 0, + GS_UTILS_CACHE_FLAG_WRITEABLE = 1 << 0, + GS_UTILS_CACHE_FLAG_USE_HASH = 1 << 1, + GS_UTILS_CACHE_FLAG_ENSURE_EMPTY = 1 << 2, + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY = 1 << 3, + GS_UTILS_CACHE_FLAG_LAST /*< skip >*/ +} GsUtilsCacheFlags; + +guint64 gs_utils_get_file_age (GFile *file); +gchar *gs_utils_get_content_type (GFile *file, + GCancellable *cancellable, + GError **error); +void gs_utils_get_content_type_async(GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gchar * gs_utils_get_content_type_finish(GFile *file, + GAsyncResult *result, + GError **error); +gboolean gs_utils_symlink (const gchar *target, + const gchar *linkpath, + GError **error); +gboolean gs_utils_unlink (const gchar *filename, + GError **error); +gboolean gs_mkdir_parent (const gchar *path, + GError **error); +gchar *gs_utils_get_cache_filename (const gchar *kind, + const gchar *resource, + GsUtilsCacheFlags flags, + GError **error); +gchar *gs_utils_get_user_hash (GError **error); +GPermission *gs_utils_get_permission (const gchar *id, + GCancellable *cancellable, + GError **error); +void gs_utils_get_permission_async (const gchar *id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GPermission *gs_utils_get_permission_finish (GAsyncResult *result, + GError **error); +gboolean gs_utils_strv_fnmatch (gchar **strv, + const gchar *str); +gchar *gs_utils_sort_key (const gchar *str); +gint gs_utils_sort_strcmp (const gchar *str1, + const gchar *str2); +GDesktopAppInfo *gs_utils_get_desktop_app_info (const gchar *id); +gboolean gs_utils_rmtree (const gchar *directory, + GError **error); +gint gs_utils_get_wilson_rating (guint64 star1, + guint64 star2, + guint64 star3, + guint64 star4, + guint64 star5); +void gs_utils_error_add_app_id (GError **error, + GsApp *app); +void gs_utils_error_add_origin_id (GError **error, + GsApp *origin); +gchar *gs_utils_error_strip_app_id (GError *error); +gchar *gs_utils_error_strip_origin_id (GError *error); +gboolean gs_utils_error_convert_gio (GError **perror); +gboolean gs_utils_error_convert_gresolver (GError **perror); +gboolean gs_utils_error_convert_gdbus (GError **perror); +gboolean gs_utils_error_convert_gdk_pixbuf(GError **perror); +gboolean gs_utils_error_convert_appstream (GError **perror); + +gchar *gs_utils_get_url_scheme (const gchar *url); +gchar *gs_utils_get_url_path (const gchar *url); +const gchar *gs_user_agent (void); +void gs_utils_append_key_value (GString *str, + gsize align_len, + const gchar *key, + const gchar *value); +guint gs_utils_get_memory_total (void); +gboolean gs_utils_parse_evr (const gchar *evr, + gchar **out_epoch, + gchar **out_version, + gchar **out_release); + +gchar *gs_utils_unique_id_compat_convert (const gchar *data_id); + +gchar *gs_utils_build_unique_id (AsComponentScope scope, + AsBundleKind bundle_kind, + const gchar *origin, + const gchar *cid, + const gchar *branch); + +void gs_utils_pixbuf_blur (GdkPixbuf *src, + guint radius, + guint iterations); + +/** + * GsFileSizeIncludeFunc: + * @filename: file name to check + * @file_kind: the file kind, one of #GFileTest enums + * @user_data: a user data passed to the gs_utils_get_file_size() + * + * Check whether include the @filename in the size calculation. + * The @filename is a relative path to the file name passed to + * the #GsFileSizeIncludeFunc. + * + * Returns: Whether to include the @filename in the size calculation + * + * Since: 41 + **/ +typedef gboolean (*GsFileSizeIncludeFunc) (const gchar *filename, + GFileTest file_kind, + gpointer user_data); + +guint64 gs_utils_get_file_size (const gchar *filename, + GsFileSizeIncludeFunc include_func, + gpointer user_data, + GCancellable *cancellable); +gchar * gs_utils_get_file_etag (GFile *file, + GDateTime **last_modified_date_out, + GCancellable *cancellable); +gboolean gs_utils_set_file_etag (GFile *file, + const gchar *etag, + GCancellable *cancellable); + +gchar *gs_utils_get_upgrade_background (const gchar *version); + +gint gs_utils_app_sort_name (GsApp *app1, + GsApp *app2, + gpointer user_data); +gint gs_utils_app_sort_match_value (GsApp *app1, + GsApp *app2, + gpointer user_data); +gint gs_utils_app_sort_priority (GsApp *app1, + GsApp *app2, + gpointer user_data); +void gs_utils_gstring_replace (GString *str, + const gchar *find, + const gchar *replace); +gint gs_utils_app_sort_kind (GsApp *app1, + GsApp *app2); +gint gs_utils_compare_versions (const gchar *ver1, + const gchar *ver2); + +G_END_DECLS diff --git a/lib/gs-worker-thread.c b/lib/gs-worker-thread.c new file mode 100644 index 0000000..b80f46c --- /dev/null +++ b/lib/gs-worker-thread.c @@ -0,0 +1,468 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-worker-thread + * @short_description: A worker thread which executes queued #GTasks until stopped + * + * #GsWorkerThread is a thread-safe wrapper around a #GTask queue and a single + * worker thread which executes tasks on that queue. + * + * Tasks can be added to the queue using gs_worker_thread_queue(). The worker + * thread (which is created when #GsWorkerThread is constructed) will execute + * them in (priority, queue order) order. Each #GTaskThreadFunc is responsible + * for calling `g_task_return_*()` on its #GTask to complete that task. + * + * The priority passed to gs_worker_thread_queue() will be used to adjust the + * worker thread’s I/O priority (using `ioprio_set()`) when executing that task. + * + * It is intended that gs_worker_thread_queue() is an alternative to using + * g_task_run_in_thread(). g_task_run_in_thread() queues tasks into a single + * process-wide thread pool, so they are mixed in with other tasks, and it can + * become hard to ensure the thread pool isn’t overwhelmed and that tasks are + * executed in the right order. + * + * The worker thread will continue executing tasks until + * gs_worker_thread_shutdown_async() is called. This must be called before the + * final reference to the #GsWorkerThread is dropped. + * + * Since: 42 + */ + +#include "config.h" + +#include +#include + +#include "gs-ioprio.h" +#include "gs-worker-thread.h" + +typedef enum { + GS_WORKER_THREAD_STATE_RUNNING = 0, + GS_WORKER_THREAD_STATE_SHUTTING_DOWN = 1, + GS_WORKER_THREAD_STATE_SHUT_DOWN = 2, +} GsWorkerThreadState; + +struct _GsWorkerThread +{ + GObject parent; + + gchar *name; /* (nullable) (owned) */ + + GsWorkerThreadState worker_state; /* (atomic) */ + GMainContext *worker_context; /* (owned); may be NULL before setup or after shutdown */ + GThread *worker_thread; /* (atomic); may be NULL before setup or after shutdown */ + + GMutex queue_mutex; + GQueue queue; +}; + +typedef enum { + PROP_NAME = 1, +} GsWorkerThreadProperty; + +static GParamSpec *props[PROP_NAME + 1] = { NULL, }; + +G_DEFINE_TYPE (GsWorkerThread, gs_worker_thread, G_TYPE_OBJECT) + +typedef struct { + GTaskThreadFunc work_func; + GTask *task; /* (owned) */ + gint priority; +} WorkData; + +static void +work_data_free (WorkData *data) +{ + g_clear_object (&data->task); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (WorkData, work_data_free) + +static void +gs_worker_thread_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsWorkerThread *self = GS_WORKER_THREAD (object); + + switch ((GsWorkerThreadProperty) prop_id) { + case PROP_NAME: + g_value_set_string (value, self->name); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_worker_thread_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsWorkerThread *self = GS_WORKER_THREAD (object); + + switch ((GsWorkerThreadProperty) prop_id) { + case PROP_NAME: + /* Construct only */ + g_assert (self->name == NULL); + self->name = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_worker_thread_dispose (GObject *object) +{ + GsWorkerThread *self = GS_WORKER_THREAD (object); + + /* Should have stopped by now. */ + g_assert (self->worker_thread == NULL); + + g_clear_pointer (&self->name, g_free); + g_clear_pointer (&self->worker_context, g_main_context_unref); + + g_mutex_lock (&self->queue_mutex); + g_queue_clear_full (&self->queue, (GDestroyNotify) work_data_free); + g_mutex_unlock (&self->queue_mutex); + + G_OBJECT_CLASS (gs_worker_thread_parent_class)->dispose (object); +} + +static void +gs_worker_thread_finalize (GObject *object) +{ + GsWorkerThread *self = GS_WORKER_THREAD (object); + + g_mutex_clear (&self->queue_mutex); + + G_OBJECT_CLASS (gs_worker_thread_parent_class)->finalize (object); +} + +static gpointer thread_cb (gpointer data); + +static void +gs_worker_thread_constructed (GObject *object) +{ + GsWorkerThread *self = GS_WORKER_THREAD (object); + + G_OBJECT_CLASS (gs_worker_thread_parent_class)->constructed (object); + + /* Start up a worker thread and its #GMainContext. The worker will run + * and process events on @worker_context until @worker_state changes + * from %GS_WORKER_THREAD_STATE_RUNNING. */ + self->worker_state = GS_WORKER_THREAD_STATE_RUNNING; + self->worker_context = g_main_context_new (); + self->worker_thread = g_thread_new (self->name, thread_cb, self); +} + +static void +gs_worker_thread_class_init (GsWorkerThreadClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = gs_worker_thread_constructed; + object_class->get_property = gs_worker_thread_get_property; + object_class->set_property = gs_worker_thread_set_property; + object_class->dispose = gs_worker_thread_dispose; + object_class->finalize = gs_worker_thread_finalize; + + /** + * GsWorkerThread:name: (not nullable): + * + * Name for the worker thread to use in debug output. This must be set. + * + * Since: 42 + */ + props[PROP_NAME] = + g_param_spec_string ("name", + "Name", + "Name for the worker thread to use in debug output.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); +} + +static void +gs_worker_thread_run_queue (GsWorkerThread *self) +{ + g_mutex_lock (&self->queue_mutex); + while (!g_queue_is_empty (&self->queue)) { + g_autoptr(WorkData) data = g_queue_pop_head (&self->queue); + GTask *task; + gpointer source_object; + gpointer task_data; + GCancellable *cancellable; + + /* thus the other threads can queue more work */ + g_mutex_unlock (&self->queue_mutex); + + task = data->task; + source_object = g_task_get_source_object (task); + task_data = g_task_get_task_data (task); + cancellable = g_task_get_cancellable (task); + + /* Set the I/O priority of the thread to match the priority of the task. */ + gs_ioprio_set (data->priority); + + data->work_func (task, source_object, task_data, cancellable); + + g_mutex_lock (&self->queue_mutex); + } + g_mutex_unlock (&self->queue_mutex); +} + +static gpointer +thread_cb (gpointer data) +{ + GsWorkerThread *self = GS_WORKER_THREAD (data); + g_autoptr(GMainContextPusher) pusher = g_main_context_pusher_new (self->worker_context); + + while (g_atomic_int_get (&self->worker_state) != GS_WORKER_THREAD_STATE_SHUT_DOWN) { + g_main_context_iteration (self->worker_context, TRUE); + gs_worker_thread_run_queue (self); + } + + return NULL; +} + +static void +gs_worker_thread_init (GsWorkerThread *self) +{ + g_mutex_init (&self->queue_mutex); + g_queue_init (&self->queue); +} + +/** + * gs_worker_thread_new: + * @name: (not nullable): name for the worker thread + * + * Create and start a new #GsWorkerThread. + * + * @name will be used to set the thread name and in debug output. + * + * Returns: (transfer full): a new #GsWorkerThread + * Since: 42 + */ +GsWorkerThread * +gs_worker_thread_new (const gchar *name) +{ + g_return_val_if_fail (name != NULL, NULL); + + return g_object_new (GS_TYPE_WORKER_THREAD, + "name", name, + NULL); +} + +static gint +gs_worker_thread_cmp (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const WorkData *dta = a; + const WorkData *dtb = b; + return dta->priority - dtb->priority; +} + +/** + * gs_worker_thread_queue: + * @self: a #GsWorkerThread + * @priority: (default G_PRIORITY_DEFAULT): priority to queue the task at, + * typically #G_PRIORITY_DEFAULT + * @work_func: (not nullable) (scope async): function to run the task + * @task: (transfer full) (not nullable): the #GTask containing context data to + * pass to @work_func + * + * Queue @task to be run in the worker thread at the given @priority. + * + * This function takes ownership of @task. + * + * @priority sets the order of the task in the queue, and also affects the I/O + * priority of the worker thread when the task is executed — high priorities + * result in a high I/O priority, low priorities result in an idle I/O priority, + * as per `ioprio_set()`. + * + * When the task is run, @work_func will be executed and passed @task and the + * source object, task data and cancellable set on @task. + * + * @work_func is responsible for calling `g_task_return_*()` on @task once the + * task is complete. + * + * If a task is cancelled using its #GCancellable after it’s queued to the + * #GsWorkerThread, @work_func will still be executed. @work_func is responsible + * for checking whether the #GCancellable has been cancelled. + * + * It is an error to call this function after gs_worker_thread_shutdown_async() + * has called. + * + * Since: 42 + */ +void +gs_worker_thread_queue (GsWorkerThread *self, + gint priority, + GTaskThreadFunc work_func, + GTask *task) +{ + g_autoptr(WorkData) data = NULL; + g_autoptr(GMutexLocker) locker = NULL; + + g_return_if_fail (GS_IS_WORKER_THREAD (self)); + g_return_if_fail (work_func != NULL); + g_return_if_fail (G_IS_TASK (task)); + + g_assert (g_atomic_int_get (&self->worker_state) == GS_WORKER_THREAD_STATE_RUNNING || + g_task_get_source_tag (task) == gs_worker_thread_shutdown_async); + + data = g_new0 (WorkData, 1); + data->work_func = work_func; + data->task = g_steal_pointer (&task); + data->priority = priority; + + locker = g_mutex_locker_new (&self->queue_mutex); + g_queue_insert_sorted (&self->queue, g_steal_pointer (&data), gs_worker_thread_cmp, NULL); + g_main_context_wakeup (self->worker_context); +} + +/** + * gs_worker_thread_is_in_worker_context: + * @self: a #GsWorkerThread + * + * Returns whether the calling thread is the worker thread. + * + * This is intended to be used as a precondition check to ensure that worker + * code is not accidentally run from the wrong thread. + * + * |[ + * static void + * do_work (MyPlugin *self) + * { + * g_assert (gs_worker_thread_is_in_worker_context (self->worker_thread)); + * + * // do some work + * } + * ]| + * + * Returns: %TRUE if running in the worker context, %FALSE otherwise + * Since: 42 + */ +gboolean +gs_worker_thread_is_in_worker_context (GsWorkerThread *self) +{ + return g_main_context_is_owner (self->worker_context); +} + +static void shutdown_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +/** + * gs_worker_thread_shutdown_async: + * @self: a #GsWorkerThread + * @cancellable: (nullable): a #GCancellable, or %NULL + * @callback: callback for once the asynchronous operation is complete + * @user_data: data to pass to @callback + * + * Shut down the worker thread. + * + * The thread will finish processing whatever task it’s currently processing + * (if any), will return %G_IO_ERROR_CANCELLED for all remaining queued + * tasks, and will then join the main process. + * + * This is a no-op if called subsequently. + * + * Since: 42 + */ +void +gs_worker_thread_shutdown_async (GsWorkerThread *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + g_return_if_fail (GS_IS_WORKER_THREAD (self)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_worker_thread_shutdown_async); + + /* Already called? */ + if (g_atomic_int_get (&self->worker_state) != GS_WORKER_THREAD_STATE_RUNNING) { + g_task_return_boolean (task, TRUE); + return; + } + + /* Signal the worker thread to stop processing tasks. */ + g_atomic_int_set (&self->worker_state, GS_WORKER_THREAD_STATE_SHUTTING_DOWN); + gs_worker_thread_queue (self, G_MAXINT /* lowest priority */, + shutdown_cb, g_steal_pointer (&task)); +} + +static void +shutdown_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsWorkerThread *self = GS_WORKER_THREAD (source_object); + gboolean updated_state; + + updated_state = g_atomic_int_compare_and_exchange (&self->worker_state, + GS_WORKER_THREAD_STATE_SHUTTING_DOWN, + GS_WORKER_THREAD_STATE_SHUT_DOWN); + g_assert (updated_state); + + /* Tidy up. We can’t join the thread here as this function is executing + * within the thread and that would deadlock. */ + g_clear_pointer (&self->worker_context, g_main_context_unref); + + g_task_return_boolean (task, TRUE); +} + +/** + * gs_worker_thread_shutdown_finish: + * @self: a #GsWorkerThread + * @result: a #GAsyncResult + * @error: return location for a #GError, or %NULL + * + * Finish an asynchronous shutdown operation started with + * gs_worker_thread_shutdown_async(); + * + * Returns: %TRUE on success, %FALSE otherwise + * Since: 42 + */ +gboolean +gs_worker_thread_shutdown_finish (GsWorkerThread *self, + GAsyncResult *result, + GError **error) +{ + gboolean success; + + g_return_val_if_fail (GS_IS_WORKER_THREAD (self), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, gs_worker_thread_shutdown_async), FALSE); + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + success = g_task_propagate_boolean (G_TASK (result), error); + + if (success) + g_thread_join (g_steal_pointer (&self->worker_thread)); + + return success; +} diff --git a/lib/gs-worker-thread.h b/lib/gs-worker-thread.h new file mode 100644 index 0000000..60f293e --- /dev/null +++ b/lib/gs-worker-thread.h @@ -0,0 +1,41 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_WORKER_THREAD (gs_worker_thread_get_type ()) + +G_DECLARE_FINAL_TYPE (GsWorkerThread, gs_worker_thread, GS, WORKER_THREAD, GObject) + +GsWorkerThread *gs_worker_thread_new (const gchar *name); + +void gs_worker_thread_queue (GsWorkerThread *self, + gint priority, + GTaskThreadFunc work_func, + GTask *task); + +gboolean gs_worker_thread_is_in_worker_context (GsWorkerThread *self); + +void gs_worker_thread_shutdown_async (GsWorkerThread *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gs_worker_thread_shutdown_finish (GsWorkerThread *self, + GAsyncResult *result, + GError **error); + +G_END_DECLS diff --git a/lib/meson.build b/lib/meson.build new file mode 100644 index 0000000..42486bd --- /dev/null +++ b/lib/meson.build @@ -0,0 +1,245 @@ +cargs = ['-DG_LOG_DOMAIN="Gs"'] +cargs += ['-DLOCALPLUGINDIR=""'] + +libgnomesoftware_public_headers = [ + 'gnome-software.h', + 'gs-app.h', + 'gs-app-collation.h', + 'gs-app-list.h', + 'gs-app-permissions.h', + 'gs-app-query.h', + 'gs-appstream.h', + 'gs-category.h', + 'gs-category-manager.h', + 'gs-desktop-data.h', + 'gs-download-utils.h', + 'gs-external-appstream-utils.h', + 'gs-icon.h', + 'gs-icon-downloader.h', + 'gs-ioprio.h', + 'gs-job-manager.h', + 'gs-key-colors.h', + 'gs-metered.h', + 'gs-odrs-provider.h', + 'gs-os-release.h', + 'gs-plugin.h', + 'gs-plugin-event.h', + 'gs-plugin-helpers.h', + 'gs-plugin-job.h', + 'gs-plugin-job-cancel-offline-update.h', + 'gs-plugin-job-download-upgrade.h', + 'gs-plugin-job-file-to-app.h', + 'gs-plugin-job-launch.h', + 'gs-plugin-job-list-apps.h', + 'gs-plugin-job-list-categories.h', + 'gs-plugin-job-list-distro-upgrades.h', + 'gs-plugin-job-manage-repository.h', + 'gs-plugin-job-refine.h', + 'gs-plugin-job-refresh-metadata.h', + 'gs-plugin-job-trigger-upgrade.h', + 'gs-plugin-job-install-apps.h', + 'gs-plugin-job-uninstall-apps.h', + 'gs-plugin-job-update-apps.h', + 'gs-plugin-job-url-to-app.h', + 'gs-plugin-loader.h', + 'gs-plugin-loader-sync.h', + 'gs-plugin-types.h', + 'gs-plugin-vfuncs.h', + 'gs-remote-icon.h', + 'gs-rewrite-resources.h', + 'gs-test.h', + 'gs-utils.h', + 'gs-worker-thread.h', +] + +install_headers(libgnomesoftware_public_headers, + subdir : 'gnome-software' +) + +librarydeps = [ + appstream, + gio_unix, + glib, + gmodule, + gtk, + json_glib, + libm, + libsoup, + libsysprof_capture_dep, + libxmlb, +] + +if get_option('mogwai') + librarydeps += mogwai_schedule_client +endif + +if get_option('polkit') + librarydeps += polkit +endif + +dkms_private_files = [] +if get_option('dkms') + dkms_private_files = [ 'gs-dkms-private.h', 'gs-dkms-private.c' ] +endif + +gs_build_ident_h = vcs_tag( + fallback: meson.project_version(), + input: 'gs-build-ident.h.in', + output: 'gs-build-ident.h', +) + +libgnomesoftware_enums = gnome.mkenums_simple('gs-enums', + sources : libgnomesoftware_public_headers, + install_header : true, + install_dir : join_paths(get_option('includedir'), 'gnome-software'), +) + +libgnomesoftware_include_directories = [ + include_directories('..'), + include_directories('.'), +] + +libgnomesoftware_generated_sources = libgnomesoftware_enums + [gs_build_ident_h] + +libgnomesoftware = library( + 'gnomesoftware', + sources : [ + 'gs-app.c', + 'gs-app-list.c', + 'gs-app-permissions.c', + 'gs-app-query.c', + 'gs-appstream.c', + 'gs-category.c', + 'gs-category-manager.c', + 'gs-debug.c', + 'gs-desktop-data.c', + 'gs-download-utils.c', + 'gs-external-appstream-utils.c', + 'gs-fedora-third-party.c', + 'gs-icon.c', + 'gs-icon-downloader.c', + 'gs-ioprio.c', + 'gs-ioprio.h', + 'gs-job-manager.c', + 'gs-key-colors.c', + 'gs-metered.c', + 'gs-odrs-provider.c', + 'gs-os-release.c', + 'gs-plugin.c', + 'gs-plugin-event.c', + 'gs-plugin-helpers.c', + 'gs-plugin-job.c', + 'gs-plugin-job-cancel-offline-update.c', + 'gs-plugin-job-download-upgrade.c', + 'gs-plugin-job-file-to-app.c', + 'gs-plugin-job-launch.c', + 'gs-plugin-job-list-apps.c', + 'gs-plugin-job-list-categories.c', + 'gs-plugin-job-list-distro-upgrades.c', + 'gs-plugin-job-manage-repository.c', + 'gs-plugin-job-refine.c', + 'gs-plugin-job-refresh-metadata.c', + 'gs-plugin-job-trigger-upgrade.c', + 'gs-plugin-job-install-apps.c', + 'gs-plugin-job-uninstall-apps.c', + 'gs-plugin-job-update-apps.c', + 'gs-plugin-job-url-to-app.c', + 'gs-plugin-loader.c', + 'gs-plugin-loader-sync.c', + 'gs-profiler.h', + 'gs-remote-icon.c', + 'gs-rewrite-resources.c', + 'gs-test.c', + 'gs-utils.c', + 'gs-worker-thread.c', + ] + libgnomesoftware_generated_sources + dkms_private_files, + soversion: gs_plugin_api_version, + include_directories : libgnomesoftware_include_directories, + dependencies : librarydeps, + c_args : cargs, + install: true, + install_dir: gs_private_libdir, +) + +libgnomesoftware_dep = declare_dependency(link_with : libgnomesoftware, + sources : libgnomesoftware_generated_sources, + include_directories : libgnomesoftware_include_directories, + dependencies: librarydeps, +) + +pkg = import('pkgconfig') + +pkg.generate( + libgnomesoftware, + description : 'GNOME Software is a software center for GNOME', + filebase : 'gnome-software', + name : 'gnome-software', + subdirs : 'gnome-software', + variables : [ + 'gs_private_libdir=${libdir}/gnome-software', + 'plugindir=${gs_private_libdir}/plugins-' + gs_plugin_api_version, + 'soupapiversion=3.0' # This is here for any out-of-tree plugins + # depending on it, and should be removed in + # future. + ], + install_dir : join_paths(get_option('prefix'), get_option('libdir'), 'pkgconfig'), # or it defaults to gs_private_libdir, which is wrong +) + +executable( + 'gnome-software-cmd', + sources : [ + 'gs-cmd.c', + ], + include_directories : [ + include_directories('..'), + ], + dependencies : [ + appstream, + gio_unix, + glib, + gmodule, + gtk, + json_glib, + libgnomesoftware_dep, + libm, + libsoup, + ], + c_args : cargs, + install : true, + install_dir : get_option('libexecdir'), + install_rpath : gs_private_libdir, +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), '..', 'data') + '"'] + e = executable( + 'gs-self-test', + compiled_schemas, + sources : [ + 'gs-self-test.c' + ], + include_directories : [ + include_directories('..'), + ], + dependencies : [ + appstream, + gio_unix, + glib, + gmodule, + gtk, + json_glib, + libgnomesoftware_dep, + libm, + libsoup + ], + c_args : cargs + ) + test('gs-self-test-lib', e, suite: ['lib'], env: test_env, timeout : 120) +endif + +subdir('tests') +subdir('tools') diff --git a/lib/tests/app-permissions.c b/lib/tests/app-permissions.c new file mode 100644 index 0000000..6131e68 --- /dev/null +++ b/lib/tests/app-permissions.c @@ -0,0 +1,123 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright 2025 GNOME Foundation, Inc. + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include + +static void +test_is_empty (void) +{ + g_autoptr(GsAppPermissions) permissions = NULL; + + g_test_summary ("Test that checking a set of permissions is empty works"); + + permissions = gs_app_permissions_new (); + g_assert_true (gs_app_permissions_is_empty (permissions)); + + gs_app_permissions_add_flag (permissions, GS_APP_PERMISSIONS_FLAGS_X11); + g_assert_false (gs_app_permissions_is_empty (permissions)); + gs_app_permissions_set_flags (permissions, GS_APP_PERMISSIONS_FLAGS_NONE); + g_assert_true (gs_app_permissions_is_empty (permissions)); + + gs_app_permissions_add_filesystem_read (permissions, "/etc"); + g_assert_false (gs_app_permissions_is_empty (permissions)); + + g_clear_object (&permissions); + + permissions = gs_app_permissions_new (); + gs_app_permissions_add_filesystem_full (permissions, "/usr"); + g_assert_false (gs_app_permissions_is_empty (permissions)); + + g_clear_object (&permissions); +} + +static void +test_diff (void) +{ + g_autoptr(GsAppPermissions) old = NULL, new = NULL, diff = NULL; + const GPtrArray *array; + + g_test_summary ("Test that diffing two sets of permissions works"); + + /* Create a couple of apps with some permissions which change a bit from old to new. */ + old = gs_app_permissions_new (); + gs_app_permissions_set_flags (old, + GS_APP_PERMISSIONS_FLAGS_NETWORK | + GS_APP_PERMISSIONS_FLAGS_HOME_FULL | + GS_APP_PERMISSIONS_FLAGS_X11); + gs_app_permissions_add_filesystem_read (old, "/etc/cups.conf"); + gs_app_permissions_add_filesystem_read (old, "/var/spool/cron/"); + gs_app_permissions_add_filesystem_full (old, "/tmp/"); + gs_app_permissions_add_filesystem_full (old, "/home/"); + gs_app_permissions_seal (old); + + new = gs_app_permissions_new (); + gs_app_permissions_set_flags (new, + GS_APP_PERMISSIONS_FLAGS_NETWORK | + GS_APP_PERMISSIONS_FLAGS_X11 | + GS_APP_PERMISSIONS_FLAGS_SCREEN); + gs_app_permissions_add_filesystem_read (new, "/var/log/"); + gs_app_permissions_add_filesystem_read (new, "/etc/cups.conf"); + gs_app_permissions_seal (new); + + /* Try a diff from old to new. */ + diff = gs_app_permissions_diff (old, new); + g_assert_true (gs_app_permissions_is_sealed (diff)); + g_assert_false (gs_app_permissions_is_empty (diff)); + g_assert_cmpint (gs_app_permissions_get_flags (diff), ==, + GS_APP_PERMISSIONS_FLAGS_SCREEN); + + array = gs_app_permissions_get_filesystem_read (diff); + g_assert_nonnull (array); + g_assert_cmpuint (array->len, ==, 1); + g_assert_cmpstr (array->pdata[0], ==, "/var/log/"); + + array = gs_app_permissions_get_filesystem_full (diff); + g_assert_null (array); + + g_clear_object (&diff); + + /* Diffing the other way round should give a different result. */ + diff = gs_app_permissions_diff (new, old); + g_assert_true (gs_app_permissions_is_sealed (diff)); + g_assert_false (gs_app_permissions_is_empty (diff)); + g_assert_cmpint (gs_app_permissions_get_flags (diff), ==, + GS_APP_PERMISSIONS_FLAGS_HOME_FULL); + + array = gs_app_permissions_get_filesystem_read (diff); + g_assert_nonnull (array); + g_assert_cmpuint (array->len, ==, 1); + g_assert_cmpstr (array->pdata[0], ==, "/var/spool/cron/"); + + array = gs_app_permissions_get_filesystem_full (diff); + g_assert_nonnull (array); + g_assert_cmpuint (array->len, ==, 2); + g_assert_cmpstr (array->pdata[0], ==, "/home/"); + g_assert_cmpstr (array->pdata[1], ==, "/tmp/"); + + g_clear_object (&diff); + + /* Diffing against itself should always give an empty result. */ + diff = gs_app_permissions_diff (old, old); + g_assert_true (gs_app_permissions_is_sealed (diff)); + g_assert_true (gs_app_permissions_is_empty (diff)); +} + +int +main (int argc, + char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/app-permissions/is-empty", test_is_empty); + g_test_add_func ("/app-permissions/diff", test_diff); + + return g_test_run (); +} diff --git a/lib/tests/meson.build b/lib/tests/meson.build new file mode 100644 index 0000000..4f42f2c --- /dev/null +++ b/lib/tests/meson.build @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# SPDX-FileCopyrightText: 2025 GNOME Foundation, Inc. +# Authors: Philip Withnall + +libgnomesoftware_tests = { + 'app-permissions': {}, +} + +test_env = environment() +test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) +test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + +test_deps = [libgnomesoftware_dep] +test_cargs = [] +test_cpp_args = ['-DG_LOG_DOMAIN="libgnomesoftware"'] + +foreach test_name, extra_args : libgnomesoftware_tests + source = extra_args.get('source', test_name + '.c') + + if installed_tests_enabled + test_conf = configuration_data() + test_conf.set('installed_tests_dir', installed_tests_execdir) + test_conf.set('program', test_name) + configure_file( + input: installed_tests_template, + output: test_name + '.test', + install_dir: installed_tests_metadir, + install_tag: 'tests', + configuration: test_conf, + ) + endif + + exe = executable(test_name, source, + c_args: test_cargs, + cpp_args: test_cpp_args, + dependencies: test_deps, + install_dir: installed_tests_execdir, + install_tag: 'tests', + install: installed_tests_enabled, + install_rpath: gs_private_libdir, + ) + + test(test_name, exe, + protocol: 'tap', + env: test_env, + timeout: 30, + suite: ['libgnomesoftware'], + ) +endforeach diff --git a/lib/tools/meson.build b/lib/tools/meson.build new file mode 100644 index 0000000..6844775 --- /dev/null +++ b/lib/tools/meson.build @@ -0,0 +1,24 @@ +# Test program to profile performance of the key-colors functions +executable( + 'profile-key-colors', + sources : [ + 'profile-key-colors.c', + '../gs-key-colors.c', + '../gs-key-colors.h', + ], + include_directories : [ + include_directories('..'), + include_directories('../..'), + ], + dependencies : [ + glib, + gtk, + gdk_pixbuf, + libm, + ], + c_args : [ + '-Wall', + '-Wextra', + ], + install: false, +) diff --git a/lib/tools/profile-key-colors.c b/lib/tools/profile-key-colors.c new file mode 100644 index 0000000..9b87f14 --- /dev/null +++ b/lib/tools/profile-key-colors.c @@ -0,0 +1,175 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Authors: + * - Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include +#include +#include + +#include "gs-key-colors.h" + +/* Test program which can be used to check the output and performance of the + * gs_calculate_key_colors() function. It is linked against libgnomesoftware, so + * will use the function implementation from there. It outputs a HTML page which + * lists each icon from the flathub appstream data in your home directory, along + * with its extracted key colors and how long extraction took. */ + +static void +print_colours (GString *html_output, + GArray *colours) +{ + g_string_append_printf (html_output, ""); + for (guint i = 0; i < colours->len; i++) { + GdkRGBA *rgba = &g_array_index (colours, GdkRGBA, i); + + g_string_append_printf (html_output, + "", + (guint) (rgba->red * 255), + (guint) (rgba->green * 255), + (guint) (rgba->blue * 255)); + + if (i % 3 == 2) + g_string_append (html_output, ""); + } + g_string_append_printf (html_output, "
        "); +} + +static void +print_summary_statistics (GString *html_output, + GArray *durations /* (element-type gint64) */) +{ + gint64 sum = 0, min = G_MAXINT64, max = G_MININT64; + guint n_measurements = durations->len; + gint64 mean, stddev; + gint64 sum_of_square_deviations = 0; + + for (guint i = 0; i < durations->len; i++) { + gint64 duration = g_array_index (durations, gint64, i); + sum += duration; + min = MIN (min, duration); + max = MAX (max, duration); + } + + mean = sum / n_measurements; + + for (guint i = 0; i < durations->len; i++) { + gint64 duration = g_array_index (durations, gint64, i); + gint64 diff = duration - mean; + sum_of_square_deviations += diff * diff; + } + + stddev = sqrt (sum_of_square_deviations / n_measurements); + + g_string_append_printf (html_output, + "[%" G_GINT64_FORMAT ", %" G_GINT64_FORMAT "]μs, mean %" G_GINT64_FORMAT "±%" G_GINT64_FORMAT "μs, n = %u", + min, max, mean, stddev, n_measurements); +} + +int +main (void) +{ + const gchar *icons_subdir = ".local/share/flatpak/appstream/flathub/x86_64/active/icons/128x128"; + g_autofree gchar *icons_dir = g_build_filename (g_get_home_dir (), icons_subdir, NULL); + g_autoptr(GDir) dir = NULL; + const gchar *entry; + g_autoptr(GPtrArray) filenames = g_ptr_array_new_with_free_func (g_free); + g_autoptr(GPtrArray) pixbufs = g_ptr_array_new_with_free_func (g_object_unref); + g_autoptr(GString) html_output = g_string_new (""); + g_autoptr(GArray) durations = g_array_new (FALSE, FALSE, sizeof (gint64)); + + setlocale (LC_ALL, ""); + + /* Load pixbufs from the icons directory. */ + dir = g_dir_open (icons_dir, 0, NULL); + if (dir == NULL) + return 1; + + while ((entry = g_dir_read_name (dir)) != NULL) { + g_autofree gchar *filename = g_build_filename (icons_dir, entry, NULL); + g_autoptr(GdkPixbuf) pixbuf = gdk_pixbuf_new_from_file (filename, NULL); + + if (pixbuf == NULL) + continue; + + g_ptr_array_add (filenames, g_steal_pointer (&filename)); + g_ptr_array_add (pixbufs, g_steal_pointer (&pixbuf)); + } + + if (!pixbufs->len) + return 2; + + /* Set up an output page */ + g_string_append (html_output, + "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n"); + + /* For each pixbuf, run both algorithms. */ + for (guint i = 0; i < pixbufs->len; i++) { + GdkPixbuf *pixbuf = pixbufs->pdata[i]; + const gchar *filename = filenames->pdata[i]; + g_autofree gchar *basename = g_path_get_basename (filename); + g_autoptr(GArray) colours = NULL; + gint64 start_time, duration; + + g_message ("Processing %u of %u, %s", i + 1, pixbufs->len, filename); + + start_time = g_get_real_time (); + colours = gs_calculate_key_colors (pixbuf); + duration = g_get_real_time () - start_time; + + g_string_append_printf (html_output, + "\n" + "\n" + "\n" + "\n" + "\n" + "\n"); + + g_array_append_val (durations, duration); + } + + /* Summary statistics for the timings. */ + g_string_append (html_output, ""); + + g_string_append (html_output, "
        FilenameIconCode duration (μs)Code colours
        %s%" G_GINT64_FORMAT "", + basename, filename, duration); + print_colours (html_output, colours); + g_string_append (html_output, + "
        "); + print_summary_statistics (html_output, durations); + g_string_append (html_output, "
        "); + + g_print ("%s\n", html_output->str); + + return 0; +} diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..7ca3377 --- /dev/null +++ b/meson.build @@ -0,0 +1,338 @@ +project('gnome-software', 'c', + version : '48.2', + license : 'GPL-2.0-or-later', + default_options : ['warning_level=2', 'c_std=c11'], + meson_version : '>=1.0.1' +) + +conf = configuration_data() +conf.set_quoted('VERSION', meson.project_version()) +conf.set_quoted('PACKAGE_NAME', meson.project_name()) +conf.set_quoted('PACKAGE_VERSION', meson.project_version()) +conf.set_quoted('BUILD_TYPE', get_option('buildtype')) + +build_profile = get_option('profile') +if get_option('buildtype') == 'release' + build_profile = '' +endif + +conf.set_quoted('BUILD_PROFILE', build_profile) + +application_id = 'org.gnome.Software' + build_profile +conf.set_quoted('APPLICATION_ID', application_id) + +# this refers to the gnome-software plugin API version +# this is not in any way related to a package or soname version +gs_plugin_api_version = '22' +conf.set_quoted('GS_PLUGIN_API_VERSION', gs_plugin_api_version) + +datadir = join_paths(get_option('prefix'), get_option('datadir')) +libexecdir = join_paths(get_option('prefix'), get_option('libexecdir')) + +# private subdirectory of libdir for the private shared libgnomesoftware to live in +gs_private_libdir = join_paths(get_option('prefix'), get_option('libdir'), 'gnome-software') + +# install docs +install_data('README.md', install_dir : 'share/doc/gnome-software') + +# get supported warning flags +test_args = [ + '-fstack-protector-strong', + '-Waggregate-return', + '-Warray-bounds', + '-Wcast-align', + '-Wclobbered', + '-Wdeclaration-after-statement', + '-Wempty-body', + '-Wenum-compare', + '-Wenum-conversion', + '-Wenum-int-mismatch', + '-Wformat=2', + '-Wformat-nonliteral', + '-Wformat-security', + '-Wformat-signedness', + '-Wignored-qualifiers', + '-Wimplicit-function-declaration', + '-Werror=implicit-function-declaration', + '-Winit-self', + '-Wmaybe-uninitialized', + '-Wmissing-declarations', + '-Wmissing-format-attribute', + '-Wmissing-include-dirs', + '-Wmissing-noreturn', + '-Wmissing-parameter-type', + '-Wmissing-prototypes', + '-Wnested-externs', + '-Werror=nested-externs', + '-Wno-missing-field-initializers', + '-Wno-strict-aliasing', + '-Wno-suggest-attribute=format', + '-Wno-unused-parameter', + '-Wnull-dereference', + '-Wold-style-definition', + '-Woverride-init', + '-Wpacked', + '-Wpointer-arith', + '-Wredundant-decls', + '-Wreturn-type', + '-Wshadow', + '-Wsign-compare', + '-Wstrict-aliasing', + '-Wstrict-prototypes', + '-Wswitch-default', + '-Wtype-limits', + '-Wundef', + '-Wuninitialized', + '-Wunused-but-set-variable', + '-Wwrite-strings' +] +cc = meson.get_compiler('c') +foreach arg: test_args + if cc.has_argument(arg) + add_project_arguments(arg, language : 'c') + endif +endforeach + +# enable full RELRO where possible +# FIXME: until https://github.com/mesonbuild/meson/issues/1140 is fixed +global_link_args = [] +test_link_args = [ + '-Wl,-z,relro', + '-Wl,-z,now', +] +foreach arg: test_link_args + if cc.has_link_argument(arg) + global_link_args += arg + endif +endforeach +if not meson.is_subproject() + add_global_link_arguments( + global_link_args, + language: 'c' + ) +endif + +# Needed for PATH_MAX and symlink() +add_project_arguments('-D_XOPEN_SOURCE=700', language : 'c') +# Needed for syscall() +add_project_arguments('-D_GNU_SOURCE', language : 'c') + +conf.set('HAVE_LINUX_UNISTD_H', cc.has_header('linux/unistd.h')) + +appstream = dependency('appstream', + version : '>= 0.16.4', + fallback : ['appstream', 'appstream_dep'], + default_options : [ + 'docs=false', + 'apidocs=false', + 'install-docs=false' + ] +) + +gdk_pixbuf = dependency('gdk-pixbuf-2.0', version : '>= 2.32.0') +libxmlb = dependency('xmlb', version : '>= 0.3.4', fallback : ['libxmlb', 'libxmlb_dep']) +gio_unix = dependency('gio-unix-2.0', version : '>= 2.56.0') +gmodule = dependency('gmodule-2.0') +gtk = dependency('gtk4', + version : '>= 4.16.0', + fallback: ['gtk', 'gtk_dep'], + default_options: [ + 'build-demos=false', + 'build-examples=false', + 'build-tests=false', + 'build-testsuite=false', + 'introspection=disabled', + 'vulkan=disabled', + ] + ) +glib = dependency('glib-2.0', version : '>= 2.76.0') +gsettings_desktop_schemas = dependency('gsettings-desktop-schemas', version : '>= 3.18.0') +json_glib = dependency('json-glib-1.0', version : '>= 1.6.0') +libm = cc.find_library('m', required: false) +libsoup = dependency('libsoup-3.0', version : '>= 3.0') +libadwaita = dependency('libadwaita-1', + version: '>=1.6.0', + fallback: ['libadwaita', 'libadwaita_dep'], + default_options: [ + 'examples=false', + 'introspection=disabled', + 'tests=false', + 'vapi=false', + ] +) + +# This should be available in GLib 2.74 +if meson.get_compiler('c').has_header_symbol('glib.h', 'G_FORMAT_SIZE_ONLY_VALUE', dependencies: glib) + conf.set('HAVE_G_FORMAT_SIZE_ONLY_VALUE', '1') +endif + +libsysprof_capture_dep = dependency('sysprof-capture-4', + required: get_option('sysprof'), + default_options: [ + 'enable_examples=false', + 'enable_gtk=false', + 'enable_tests=false', + 'enable_tools=false', + 'libsysprof=false', + 'with_sysprofd=none', + 'help=false', + ], + fallback: ['sysprof', 'libsysprof_capture_dep'], +) +conf.set('HAVE_SYSPROF', libsysprof_capture_dep.found()) + +if get_option('mogwai') + mogwai_schedule_client = dependency('mogwai-schedule-client-0', version : '>= 0.2.0') + conf.set('HAVE_MOGWAI', 1) +endif + +if get_option('polkit') + polkit = dependency('polkit-gobject-1') + conf.set('HAVE_POLKIT', 1) +endif + +if get_option('packagekit') + packagekit = dependency('packagekit-glib2', version : '>= 1.2.5') + conf.set('HAVE_PACKAGEKIT', '1') + add_project_arguments('-DI_KNOW_THE_PACKAGEKIT_GLIB2_API_IS_SUBJECT_TO_CHANGE', + language : 'c') + if get_option('packagekit_autoremove') + conf.set('GS_PACKAGEKIT_AUTOREMOVE', 'TRUE') + else + conf.set('GS_PACKAGEKIT_AUTOREMOVE', 'FALSE') + endif +endif + +if get_option('eos_updater') + ostree = dependency('ostree-1') +endif + +if get_option('fwupd') + fwupd = dependency('fwupd', version : '>= 1.6.2') +endif + +if get_option('flatpak') + flatpak = dependency('flatpak', version : '>= 1.14.1') + ostree = dependency('ostree-1') + + flatpak_httpbackend = flatpak.get_variable('httpbackend') + if flatpak_httpbackend == 'soup' + flatpak_soupapiversion = flatpak.get_variable('soupapiversion', default_value: '2') + if flatpak_soupapiversion.version_compare('< 3') + error('''Flatpak library has been built with 'libsoup2' http backend, which conflicts with 'libsoup3' used by gnome-software. + +You can either: + +1. Build gnome-software without flatpak support (with -Dflatpak=false) or +2. Rebuild flatpak library with http backend other than 'libsoup2'.''') + else + flatpak_summary = '@0@ (@1@)'.format(flatpak_httpbackend, flatpak_soupapiversion) + endif + else + flatpak_summary = flatpak_httpbackend + endif + summary('Flatpak http backend', '@0@'.format(flatpak_summary), section : 'Misc') +endif + +if get_option('malcontent') + malcontent = dependency('malcontent-0', version: '>= 0.5.0', fallback: ['malcontent', 'libmalcontent_dep'], default_options: ['ui=disabled']) +endif + +if get_option('rpm_ostree') + ostree = dependency('ostree-1') + rpm = dependency('rpm') + rpm_ostree = dependency('rpm-ostree-1', version : '>= 2019.3') +endif + +if get_option('gudev') + gudev = dependency('gudev-1.0') +endif + +if get_option('snap') + snap = dependency('snapd-glib-2', version : '>= 1.64') +endif + +if get_option('hardcoded_foss_webapps') or get_option('hardcoded_proprietary_webapps') + assert(get_option('webapps'), 'webapps option must be true when hardcoded_foss_webapps/hardcoded_proprietary_webapps is') + pwa_list_proj = subproject('gnome-pwa-list') +endif +if get_option('hardcoded_foss_webapps') + pwa_list_foss = pwa_list_proj.get_variable('gnome_pwa_list_foss') + install_data(pwa_list_foss, + install_dir : join_paths(datadir, 'swcatalog', 'xml'), + ) +endif +if get_option('hardcoded_proprietary_webapps') + pwa_list_proprietary = pwa_list_proj.get_variable('gnome_pwa_list_proprietary') + install_data(pwa_list_proprietary, + install_dir : join_paths(datadir, 'swcatalog', 'xml'), + ) +endif + +gnome = import('gnome') +i18n = import('i18n') + +conf.set_quoted('GETTEXT_PACKAGE', meson.project_name()) +conf.set_quoted('LOCALEDIR', + join_paths(get_option('prefix'), + get_option('localedir'))) +conf.set_quoted('DATADIR', datadir) +conf.set_quoted('LIBDIR', + join_paths(get_option('prefix'), + get_option('libdir'))) +conf.set_quoted('BINDIR', + join_paths(get_option('prefix'), + get_option('bindir'))) +conf.set_quoted('SYSCONFDIR', + join_paths(get_option('prefix'), + get_option('sysconfdir'))) +conf.set_quoted('LOCALSTATEDIR', + join_paths(get_option('prefix'), + get_option('localstatedir'))) +conf.set_quoted('LIBEXECDIR', libexecdir) +conf.set('ENABLE_EXTERNAL_APPSTREAM', get_option('external_appstream')) +conf.set('ENABLE_DKMS', get_option('dkms')) +configure_file( + output : 'config.h', + configuration : conf +) + +add_project_arguments('-DI_KNOW_THE_GNOME_SOFTWARE_API_IS_SUBJECT_TO_CHANGE', + language : 'c') + +common_test_env = [ + 'G_DEBUG=gc-friendly', + 'G_ENABLE_DIAGNOSTIC=1', + 'MALLOC_CHECK_=2', + 'GSETTINGS_SCHEMA_DIR=@0@/data/'.format(meson.project_build_root()), + 'GSETTINGS_BACKEND=memory', + + # Make flatpak skip parental controls since it requires the system bus. + # https://github.com/flatpak/flatpak/issues/2993 + 'FLATPAK_SYSTEM_HELPER_ON_SESSION=1', +] + +installed_tests_metadir = join_paths(datadir, 'installed-tests', meson.project_name()) +installed_tests_execdir = join_paths(libexecdir, 'installed-tests', meson.project_name()) +installed_tests_enabled = get_option('installed_tests') +installed_tests_template = files('tests/template.test.in') + +add_test_setup('default', + is_default: not meson.is_subproject(), + env: common_test_env, + timeout_multiplier: 2, +) + +subdir('data') +subdir('lib') +subdir('plugins') +subdir('src') +if get_option('external_appstream') + subdir('gs-install-appstream') +endif +subdir('po') +subdir('doc') +subdir('help') + +# FIXME: remove when https://github.com/mesonbuild/meson/issues/837 fixed +meson.add_install_script('meson_post_install.sh') diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..cd49cf5 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,29 @@ +option('tests', type : 'boolean', value : true, description : 'enable tests') +option('installed_tests', type : 'boolean', value : false, description : 'enable installed tests') +option('man', type : 'boolean', value : true, description : 'enable man pages') +option('packagekit', type : 'boolean', value : true, description : 'enable PackageKit support') +option('packagekit_autoremove', type : 'boolean', value : false, description : 'autoremove packages in PackageKit') +option('polkit', type : 'boolean', value : true, description : 'enable PolKit support') +option('eos_updater', type : 'boolean', value : false, description : 'enable eos-updater support') +option('fwupd', type : 'boolean', value : true, description : 'enable fwupd support') +option('flatpak', type : 'boolean', value : true, description : 'enable Flatpak support') +option('malcontent', type : 'boolean', value : true, description : 'enable parental controls support using libmalcontent') +option('rpm_ostree', type : 'boolean', value : false, description : 'enable rpm-ostree support') +option('webapps', type : 'boolean', value : true, description : 'enable webapps support') +option('hardcoded_foss_webapps', type : 'boolean', value : true, description : 'enable inclusion of a default set of installable FOSS webapps') +option('hardcoded_proprietary_webapps', type : 'boolean', value : true, description : 'enable inclusion of a default set of installable proprietary webapps') +option('gudev', type : 'boolean', value : true, description : 'enable GUdev support') +option('apt', type : 'boolean', value : false, description : 'enable apt: URL handler in the .desktop file') +option('snap', type : 'boolean', value : false, description : 'enable Snap support') +option('external_appstream', type : 'boolean', value : false, description : 'enable external AppStream support') +option('gtk_doc', type : 'boolean', value : true, description : 'enable API reference') +option('hardcoded_curated', type : 'boolean', value : false, description : 'enable installation of default curated apps list (for testing purpose only)') +option('default_featured_apps', type : 'boolean', value : false, description : 'enable installation of default featured apps list (for testing purpose only)') +option('mogwai', type : 'boolean', value : false, description : 'enable metered data support using Mogwai') +option('sysprof', type : 'feature', value : 'auto', description : 'enable sysprof-capture support for profiling') +option('profile', type : 'string', value : '', description : 'Build with specified application ID') +option('opensuse-distro-upgrade', type : 'boolean', value : false, description : 'enable opensuse-distro-upgrade support') +option('dkms', type : 'boolean', value : false, description : 'enable DKMS plugin to help installing DKMS (and akmods) Secure Boot certificates to UEFI MOK') +# FIXME Switch the systemd-sysupdate option to true by default once +# systemd-sysupdate and Software's matching plugin are deemed mature enough. +option('systemd-sysupdate', type : 'boolean', value : false, description : 'enable systemd-sysupdate support') diff --git a/meson_post_install.sh b/meson_post_install.sh new file mode 100755 index 0000000..c523b15 --- /dev/null +++ b/meson_post_install.sh @@ -0,0 +1,14 @@ +#!/bin/sh +if [ -z $MESON_INSTALL_PREFIX ]; then + echo 'This is meant to be ran from Meson only!' + exit 1 +fi + +if [ -z $DESTDIR ]; then + echo 'Compiling GSchema' + glib-compile-schemas "$MESON_INSTALL_PREFIX/share/glib-2.0/schemas" + echo 'Updating icon cache' + gtk-update-icon-cache -qtf "$MESON_INSTALL_PREFIX/share/icons/hicolor" + echo 'Updating desktop database' + update-desktop-database -q "$MESON_INSTALL_PREFIX/share/applications" +fi diff --git a/plugins/core/gs-plugin-appstream.c b/plugins/core/gs-plugin-appstream.c new file mode 100644 index 0000000..e4626ac --- /dev/null +++ b/plugins/core/gs-plugin-appstream.c @@ -0,0 +1,1703 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2014 Richard Hughes + * Copyright (C) 2015-2019 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include +#include +#include +#include + +#include "gs-appstream.h" +#include "gs-external-appstream-utils.h" +#include "gs-plugin-appstream.h" + +/* + * SECTION: + * Uses offline AppStream data to populate and refine package results. + * + * This plugin calls UpdatesChanged() if any of the AppStream stores are + * changed in any way. + * + * Methods: | AddCategory + * Refines: | [source]->[name,summary,pixbuf,id,kind] + */ + +struct _GsPluginAppstream +{ + GsPlugin parent; + + GsWorkerThread *worker; /* (owned) */ + + XbSilo *silo; + GMutex silo_lock; + gchar *silo_filename; + GHashTable *silo_installed_by_desktopid; + GHashTable *silo_installed_by_id; + AsComponentScope default_scope; + GSettings *settings; + + GPtrArray *file_monitors; /* (owned) (element-type GFileMonitor) */ + /* The stamps help to avoid locking the silo lock in the main thread + and also to detect changes while loading other appstream data. */ + gint silo_change_stamp; /* the silo change stamp, increased on every silo change */ + gint silo_change_stamp_current; /* the currently known silo change stamp, checked for changes */ +}; + +G_DEFINE_TYPE (GsPluginAppstream, gs_plugin_appstream, GS_TYPE_PLUGIN) + +#define assert_in_worker(self) \ + g_assert (gs_worker_thread_is_in_worker_context (self->worker)) + +static void +gs_plugin_appstream_dispose (GObject *object) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (object); + + g_clear_object (&self->silo); + g_clear_pointer (&self->silo_filename, g_free); + g_clear_pointer (&self->silo_installed_by_desktopid, g_hash_table_unref); + g_clear_pointer (&self->silo_installed_by_id, g_hash_table_unref); + g_clear_object (&self->settings); + g_mutex_clear (&self->silo_lock); + g_clear_object (&self->worker); + g_clear_pointer (&self->file_monitors, g_ptr_array_unref); + + G_OBJECT_CLASS (gs_plugin_appstream_parent_class)->dispose (object); +} + +static void +gs_plugin_appstream_init (GsPluginAppstream *self) +{ + GApplication *application = g_application_get_default (); + + g_mutex_init (&self->silo_lock); + + /* require settings */ + self->settings = g_settings_new ("org.gnome.software"); + + /* Can be NULL when running the self tests */ + if (application) { + g_signal_connect_object (application, "repository-changed", + G_CALLBACK (gs_plugin_update_cache_state_for_repository), self, G_CONNECT_SWAPPED); + } + + self->file_monitors = g_ptr_array_new_with_free_func (g_object_unref); +} + +static const gchar * +gs_plugin_appstream_convert_component_kind (const gchar *kind) +{ + if (g_strcmp0 (kind, "webapp") == 0) + return "web-application"; + if (g_strcmp0 (kind, "desktop") == 0) + return "desktop-application"; + return kind; +} + +static gboolean +gs_plugin_appstream_upgrade_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + if (g_strcmp0 (xb_builder_node_get_element (bn), "application") == 0) { + g_autoptr(XbBuilderNode) id = xb_builder_node_get_child (bn, "id", NULL); + g_autofree gchar *kind = NULL; + if (id != NULL) { + kind = g_strdup (xb_builder_node_get_attr (id, "type")); + xb_builder_node_remove_attr (id, "type"); + } + if (kind != NULL) + xb_builder_node_set_attr (bn, "type", kind); + xb_builder_node_set_element (bn, "component"); + } else if (g_strcmp0 (xb_builder_node_get_element (bn), "metadata") == 0) { + xb_builder_node_set_element (bn, "custom"); + } else if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0) { + const gchar *type_old = xb_builder_node_get_attr (bn, "type"); + const gchar *type_new = gs_plugin_appstream_convert_component_kind (type_old); + if (type_old != type_new) + xb_builder_node_set_attr (bn, "type", type_new); + } + return TRUE; +} + +static gboolean +gs_plugin_appstream_add_icons_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") != 0) + return TRUE; + gs_appstream_component_add_extra_info (bn); + return TRUE; +} + +static gboolean +gs_plugin_appstream_add_origin_keyword_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + if (g_strcmp0 (xb_builder_node_get_element (bn), "components") == 0) { + const gchar *origin = xb_builder_node_get_attr (bn, "origin"); + GPtrArray *components = xb_builder_node_get_children (bn); + if (origin == NULL || origin[0] == '\0') + return TRUE; + g_debug ("origin %s has %u components", origin, components->len); + if (components->len < 200) { + for (guint i = 0; i < components->len; i++) { + XbBuilderNode *component = g_ptr_array_index (components, i); + gs_appstream_component_add_keyword (component, origin); + } + } + } + return TRUE; +} + +static void +gs_plugin_appstream_media_baseurl_free (gpointer user_data) +{ + g_string_free ((GString *) user_data, TRUE); +} + +static gboolean +gs_plugin_appstream_media_baseurl_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + GString *baseurl = user_data; + if (g_strcmp0 (xb_builder_node_get_element (bn), "components") == 0) { + const gchar *url = xb_builder_node_get_attr (bn, "media_baseurl"); + if (url == NULL) { + g_string_truncate (baseurl, 0); + return TRUE; + } + g_string_assign (baseurl, url); + return TRUE; + } + + if (baseurl->len == 0) + return TRUE; + + if (g_strcmp0 (xb_builder_node_get_element (bn), "icon") == 0) { + const gchar *type = xb_builder_node_get_attr (bn, "type"); + if (g_strcmp0 (type, "remote") != 0) + return TRUE; + gs_appstream_component_fix_url (bn, baseurl->str); + } else if (g_strcmp0 (xb_builder_node_get_element (bn), "screenshots") == 0) { + GPtrArray *screenshots = xb_builder_node_get_children (bn); + for (guint i = 0; i < screenshots->len; i++) { + XbBuilderNode *screenshot = g_ptr_array_index (screenshots, i); + GPtrArray *children = NULL; + /* Type-check for security */ + if (g_strcmp0 (xb_builder_node_get_element (screenshot), "screenshot") != 0) { + continue; + } + children = xb_builder_node_get_children (screenshot); + for (guint j = 0; j < children->len; j++) { + XbBuilderNode *child = g_ptr_array_index (children, j); + const gchar *element = xb_builder_node_get_element (child); + if (g_strcmp0 (element, "image") != 0 && + g_strcmp0 (element, "video") != 0) + continue; + gs_appstream_component_fix_url (child, baseurl->str); + } + } + } + return TRUE; +} + +static void +gs_plugin_appstream_file_monitor_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GsPluginAppstream *self = user_data; + g_atomic_int_inc (&self->silo_change_stamp); +} + +static void +gs_plugin_appstream_maybe_store_file_monitor (GsPluginAppstream *self, + GFileMonitor *file_monitor) /* (nullable) (transfer none) */ +{ + if (!file_monitor) + return; + + g_signal_connect_object (file_monitor, "changed", + G_CALLBACK (gs_plugin_appstream_file_monitor_changed_cb), self, 0); + + g_ptr_array_add (self->file_monitors, g_object_ref (file_monitor)); +} + +static gboolean +gs_plugin_appstream_load_appdata_fn (GsPluginAppstream *self, + XbBuilder *builder, + const gchar *filename, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GFile) file = g_file_new_for_path (filename); + g_autoptr(XbBuilderFixup) fixup = NULL; + g_autoptr(XbBuilderNode) info = NULL; + g_autoptr(XbBuilderSource) source = xb_builder_source_new (); + + /* add source */ + if (!xb_builder_source_load_file (source, file, 0, cancellable, error)) + return FALSE; + + /* fix up any legacy installed files */ + fixup = xb_builder_fixup_new ("AppStreamUpgrade2", + gs_plugin_appstream_upgrade_cb, + self, NULL); + xb_builder_fixup_set_max_depth (fixup, 3); + xb_builder_source_add_fixup (source, fixup); + + /* add metadata */ + info = xb_builder_node_insert (NULL, "info", NULL); + xb_builder_node_insert_text (info, "filename", filename, NULL); + xb_builder_source_set_info (source, info); + + /* success */ + xb_builder_import_source (builder, source); + return TRUE; +} + +static gboolean +gs_plugin_appstream_load_appdata (GsPluginAppstream *self, + XbBuilder *builder, + const gchar *path, + GCancellable *cancellable, + GError **error) +{ + const gchar *fn; + g_autoptr(GDir) dir = NULL; + g_autoptr(GFile) parent = g_file_new_for_path (path); + g_autoptr(GFileMonitor) file_monitor = NULL; + g_autoptr(GError) local_error = NULL; + if (!g_file_query_exists (parent, cancellable)) { + g_debug ("appstream: Skipping appdata path '%s' as %s", path, g_cancellable_is_cancelled (cancellable) ? "cancelled" : "does not exist"); + return TRUE; + } + + g_debug ("appstream: Loading appdata path '%s'", path); + + dir = g_dir_open (path, 0, error); + if (dir == NULL) + return FALSE; + + file_monitor = g_file_monitor (parent, G_FILE_MONITOR_NONE, cancellable, &local_error); + if (local_error) + g_debug ("appstream: Failed to create file monitor for '%s': %s", path, local_error->message); + gs_plugin_appstream_maybe_store_file_monitor (self, file_monitor); + + while ((fn = g_dir_read_name (dir)) != NULL) { + if (g_str_has_suffix (fn, ".appdata.xml") || + g_str_has_suffix (fn, ".metainfo.xml")) { + g_autofree gchar *filename = g_build_filename (path, fn, NULL); + g_autoptr(GError) error_local = NULL; + if (!gs_plugin_appstream_load_appdata_fn (self, + builder, + filename, + cancellable, + &error_local)) { + g_debug ("ignoring %s: %s", filename, error_local->message); + continue; + } + } + } + + /* success */ + return TRUE; +} + +static GInputStream * +gs_plugin_appstream_load_dep11_cb (XbBuilderSource *self, + XbBuilderSourceCtx *ctx, + gpointer user_data, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(AsMetadata) mdata = as_metadata_new (); + g_autoptr(GBytes) bytes = NULL; + g_autoptr(GError) tmp_error = NULL; + g_autofree gchar *xml = NULL; + + bytes = xb_builder_source_ctx_get_bytes (ctx, cancellable, error); + if (bytes == NULL) + return NULL; + + as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_CATALOG); + as_metadata_parse_bytes (mdata, + bytes, + AS_FORMAT_KIND_YAML, + &tmp_error); + if (tmp_error != NULL) { + g_propagate_error (error, g_steal_pointer (&tmp_error)); + return NULL; + } + + xml = as_metadata_components_to_catalog (mdata, AS_FORMAT_KIND_XML, &tmp_error); + if (xml == NULL) { + // This API currently returns NULL if there is nothing to serialize, so we + // have to test if this is an error or not. + // See https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/763 + // for discussion about changing this API. + if (tmp_error != NULL) { + g_propagate_error (error, g_steal_pointer (&tmp_error)); + return NULL; + } + + xml = g_strdup(""); + } + + return g_memory_input_stream_new_from_data (g_steal_pointer (&xml), (gssize) -1, g_free); +} + +static gboolean +gs_plugin_appstream_tokenize_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + const gchar * const elements_to_tokenize[] = { + "id", + "keyword", + "launchable", + "mimetype", + "name", + "pkgname", + "summary", + NULL }; + if (xb_builder_node_get_element (bn) != NULL && + g_strv_contains (elements_to_tokenize, xb_builder_node_get_element (bn))) + xb_builder_node_tokenize_text (bn); + return TRUE; +} + +static gboolean +gs_plugin_appstream_load_appstream_fn (GsPluginAppstream *self, + XbBuilder *builder, + const gchar *filename, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GFile) file = g_file_new_for_path (filename); + g_autoptr(XbBuilderNode) info = NULL; + g_autoptr(XbBuilderFixup) fixup1 = NULL; + g_autoptr(XbBuilderFixup) fixup2 = NULL; + g_autoptr(XbBuilderFixup) fixup3 = NULL; + g_autoptr(XbBuilderFixup) fixup4 = NULL; + g_autoptr(XbBuilderFixup) fixup5 = NULL; + g_autoptr(XbBuilderSource) source = xb_builder_source_new (); + + /* add support for DEP-11 files */ + xb_builder_source_add_adapter (source, + "application/yaml", + gs_plugin_appstream_load_dep11_cb, + NULL, NULL); + xb_builder_source_add_adapter (source, + "application/x-yaml", + gs_plugin_appstream_load_dep11_cb, + NULL, NULL); + + /* add source */ + if (!xb_builder_source_load_file (source, file, 0, cancellable, error)) + return FALSE; + + /* add metadata */ + info = xb_builder_node_insert (NULL, "info", NULL); + xb_builder_node_insert_text (info, "scope", "system", NULL); + xb_builder_node_insert_text (info, "filename", filename, NULL); + xb_builder_source_set_info (source, info); + + /* add missing icons as required */ + fixup1 = xb_builder_fixup_new ("AddIcons", + gs_plugin_appstream_add_icons_cb, + self, NULL); + xb_builder_fixup_set_max_depth (fixup1, 2); + xb_builder_source_add_fixup (source, fixup1); + + /* fix up any legacy installed files */ + fixup2 = xb_builder_fixup_new ("AppStreamUpgrade2", + gs_plugin_appstream_upgrade_cb, + self, NULL); + xb_builder_fixup_set_max_depth (fixup2, 3); + xb_builder_source_add_fixup (source, fixup2); + + /* add the origin as a search keyword for small repos */ + fixup3 = xb_builder_fixup_new ("AddOriginKeyword", + gs_plugin_appstream_add_origin_keyword_cb, + self, NULL); + xb_builder_fixup_set_max_depth (fixup3, 1); + xb_builder_source_add_fixup (source, fixup3); + + fixup4 = xb_builder_fixup_new ("TextTokenize", + gs_plugin_appstream_tokenize_cb, + NULL, NULL); + xb_builder_fixup_set_max_depth (fixup4, 2); + xb_builder_source_add_fixup (source, fixup4); + + /* prepend media_baseurl to remote relative URLs */ + fixup5 = xb_builder_fixup_new ("MediaBaseUrl", + gs_plugin_appstream_media_baseurl_cb, + g_string_new (NULL), + gs_plugin_appstream_media_baseurl_free); + xb_builder_fixup_set_max_depth (fixup5, 3); + xb_builder_source_add_fixup (source, fixup5); + + /* success */ + xb_builder_import_source (builder, source); + return TRUE; +} + +static gboolean +gs_plugin_appstream_load_appstream (GsPluginAppstream *self, + XbBuilder *builder, + const gchar *path, + GCancellable *cancellable, + GError **error) +{ + const gchar *fn; + g_autoptr(GDir) dir = NULL; + g_autoptr(GFile) parent = g_file_new_for_path (path); + g_autoptr(GFileMonitor) file_monitor = NULL; + g_autoptr(GError) local_error = NULL; + + /* in case the path appears later, to refresh the data even when non-existent at the moment */ + file_monitor = g_file_monitor (parent, G_FILE_MONITOR_NONE, cancellable, &local_error); + if (local_error) + g_debug ("appstream: Failed to create file monitor for '%s': %s", path, local_error->message); + gs_plugin_appstream_maybe_store_file_monitor (self, file_monitor); + + /* parent path does not exist */ + if (!g_file_query_exists (parent, cancellable)) { + g_debug ("appstream: Skipping appstream path '%s' as %s", path, g_cancellable_is_cancelled (cancellable) ? "cancelled" : "does not exist"); + return TRUE; + } + g_debug ("appstream: Loading appstream path '%s'", path); + dir = g_dir_open (path, 0, error); + if (dir == NULL) + return FALSE; + + while ((fn = g_dir_read_name (dir)) != NULL) { +#ifdef ENABLE_EXTERNAL_APPSTREAM + /* Ignore our own system-installed files when + external-appstream-system-wide is FALSE */ + if (!g_settings_get_boolean (self->settings, "external-appstream-system-wide") && + g_strcmp0 (path, gs_external_appstream_utils_get_system_dir ()) == 0 && + g_str_has_prefix (fn, EXTERNAL_APPSTREAM_PREFIX)) + continue; +#endif + if (g_str_has_suffix (fn, ".xml") || + g_str_has_suffix (fn, ".yml") || + g_str_has_suffix (fn, ".yml.gz") || + g_str_has_suffix (fn, ".xml.gz")) { + g_autofree gchar *filename = g_build_filename (path, fn, NULL); + g_autoptr(GError) error_local = NULL; + if (!gs_plugin_appstream_load_appstream_fn (self, + builder, + filename, + cancellable, + &error_local)) { + g_debug ("ignoring %s: %s", filename, error_local->message); + continue; + } + } + } + + /* success */ + return TRUE; +} + +static void +gs_add_appstream_metainfo_location (GPtrArray *locations, const gchar *root) +{ + g_ptr_array_add (locations, + g_build_filename (root, "metainfo", NULL)); + g_ptr_array_add (locations, + g_build_filename (root, "appdata", NULL)); +} + +static XbSilo * +gs_plugin_appstream_ref_silo (GsPluginAppstream *self, + gchar **out_silo_filename, + GHashTable **out_silo_installed_by_desktopid, + GHashTable **out_silo_installed_by_id, + GCancellable *cancellable, + GError **error) +{ + const gchar *test_xml; + g_autofree gchar *blobfn = NULL; + g_autoptr(XbBuilder) builder = NULL; + g_autoptr(XbNode) n = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GPtrArray) installed = NULL; + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GPtrArray) parent_appdata = g_ptr_array_new_with_free_func (g_free); + g_autoptr(GPtrArray) parent_appstream = NULL; + g_autoptr(GMainContext) old_thread_default = NULL; + + locker = g_mutex_locker_new (&self->silo_lock); + /* everything is okay */ + if (self->silo != NULL && xb_silo_is_valid (self->silo) && + g_atomic_int_get (&self->silo_change_stamp_current) == g_atomic_int_get (&self->silo_change_stamp)) { + if (out_silo_filename != NULL) + *out_silo_filename = g_strdup (self->silo_filename); + if (out_silo_installed_by_desktopid != NULL) + *out_silo_installed_by_desktopid = self->silo_installed_by_desktopid ? g_hash_table_ref (self->silo_installed_by_desktopid) : NULL; + if (out_silo_installed_by_id != NULL) + *out_silo_installed_by_id = self->silo_installed_by_id ? g_hash_table_ref (self->silo_installed_by_id) : NULL; + return g_object_ref (self->silo); + } + + /* drat! silo needs regenerating */ + reload: + g_clear_object (&self->silo); + g_clear_pointer (&self->silo_filename, g_free); + g_clear_pointer (&self->silo_installed_by_desktopid, g_hash_table_unref); + g_clear_pointer (&self->silo_installed_by_id, g_hash_table_unref); + g_clear_pointer (&blobfn, g_free); + self->default_scope = AS_COMPONENT_SCOPE_UNKNOWN; + g_ptr_array_set_size (self->file_monitors, 0); + g_atomic_int_set (&self->silo_change_stamp_current, g_atomic_int_get (&self->silo_change_stamp)); + + /* FIXME: https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1422 */ + old_thread_default = g_main_context_ref_thread_default (); + if (old_thread_default == g_main_context_default ()) + g_clear_pointer (&old_thread_default, g_main_context_unref); + if (old_thread_default != NULL) + g_main_context_pop_thread_default (old_thread_default); + builder = xb_builder_new (); + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + g_clear_pointer (&old_thread_default, g_main_context_unref); + + /* verbose profiling */ + if (g_getenv ("GS_XMLB_VERBOSE") != NULL) { + xb_builder_set_profile_flags (builder, + XB_SILO_PROFILE_FLAG_XPATH | + XB_SILO_PROFILE_FLAG_DEBUG); + } + + gs_appstream_add_current_locales (builder); + + /* only when in self test */ + test_xml = g_getenv ("GS_SELF_TEST_APPSTREAM_XML"); + if (test_xml != NULL) { + g_autoptr(XbBuilderFixup) fixup1 = NULL; + g_autoptr(XbBuilderFixup) fixup2 = NULL; + g_autoptr(XbBuilderSource) source = xb_builder_source_new (); + if (!xb_builder_source_load_xml (source, test_xml, + XB_BUILDER_SOURCE_FLAG_NONE, + error)) + return NULL; + fixup1 = xb_builder_fixup_new ("AddOriginKeywords", + gs_plugin_appstream_add_origin_keyword_cb, + self, NULL); + xb_builder_fixup_set_max_depth (fixup1, 1); + xb_builder_source_add_fixup (source, fixup1); + fixup2 = xb_builder_fixup_new ("AddIcons", + gs_plugin_appstream_add_icons_cb, + self, NULL); + xb_builder_fixup_set_max_depth (fixup2, 2); + xb_builder_source_add_fixup (source, fixup2); + xb_builder_import_source (builder, source); + + /* Nothing to watch in the tests */ + parent_appstream = g_ptr_array_new_with_free_func (g_free); + } else { + g_autoptr(GPtrArray) parent_desktop = g_ptr_array_new (); + + g_ptr_array_add (parent_desktop, (gpointer) DATADIR "/applications"); + if (g_strcmp0 (DATADIR, "/usr/share") != 0) + g_ptr_array_add (parent_desktop, (gpointer) "/usr/share/applications"); + + /* add search paths */ + parent_appstream = gs_appstream_get_appstream_data_dirs (); + gs_add_appstream_metainfo_location (parent_appdata, DATADIR); + + /* Add the normal system directories if the installation prefix + * is different from normal — typically this happens when doing + * development builds. It’s useful to still list the system apps + * during development. */ + if (g_strcmp0 (DATADIR, "/usr/share") != 0) + gs_add_appstream_metainfo_location (parent_appdata, "/usr/share"); + + /* FIXME: https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1422 */ + old_thread_default = g_main_context_ref_thread_default (); + if (old_thread_default == g_main_context_default ()) + g_clear_pointer (&old_thread_default, g_main_context_unref); + if (old_thread_default != NULL) + g_main_context_pop_thread_default (old_thread_default); + + /* import all files */ + for (guint i = 0; i < parent_appstream->len; i++) { + const gchar *fn = g_ptr_array_index (parent_appstream, i); + if (!gs_plugin_appstream_load_appstream (self, builder, fn, cancellable, error)) { + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + return NULL; + } + } + for (guint i = 0; i < parent_appdata->len; i++) { + const gchar *fn = g_ptr_array_index (parent_appdata, i); + if (!gs_plugin_appstream_load_appdata (self, builder, fn, cancellable, error)) { + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + return NULL; + } + } + for (guint i = 0; i < parent_desktop->len; i++) { + g_autoptr(GFileMonitor) file_monitor = NULL; + const gchar *dir = g_ptr_array_index (parent_desktop, i); + if (!gs_appstream_load_desktop_files (builder, dir, NULL, &file_monitor, cancellable, error)) { + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + return NULL; + } + gs_plugin_appstream_maybe_store_file_monitor (self, file_monitor); + } + + gs_appstream_add_data_merge_fixup (builder, parent_appstream, parent_desktop, cancellable); + + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + g_clear_pointer (&old_thread_default, g_main_context_unref); + } + + /* regenerate with each minor release */ + xb_builder_append_guid (builder, PACKAGE_VERSION); + + /* create per-user cache */ + blobfn = gs_utils_get_cache_filename ("appstream", "components.xmlb", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + error); + if (blobfn == NULL) + return NULL; + file = g_file_new_for_path (blobfn); + g_debug ("ensuring %s", blobfn); + + /* FIXME: https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1422 */ + old_thread_default = g_main_context_ref_thread_default (); + if (old_thread_default == g_main_context_default ()) + g_clear_pointer (&old_thread_default, g_main_context_unref); + if (old_thread_default != NULL) + g_main_context_pop_thread_default (old_thread_default); + + self->silo = xb_builder_ensure (builder, file, + XB_BUILDER_COMPILE_FLAG_IGNORE_INVALID | + XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, + NULL, error); + if (self->silo == NULL) { + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + return NULL; + } +#ifdef __GLIBC__ + /* https://gitlab.gnome.org/GNOME/gnome-software/-/issues/941 + * libxmlb <= 0.3.22 makes lots of temporary heap allocations parsing large XMLs + * trim the heap after parsing to control RSS growth. */ + malloc_trim (0); +#endif + + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + + if (g_atomic_int_get (&self->silo_change_stamp_current) != g_atomic_int_get (&self->silo_change_stamp)) { + g_ptr_array_set_size (parent_appdata, 0); + g_ptr_array_set_size (parent_appstream, 0); + g_debug ("appstream: File monitors reported change while loading appstream data, reloading..."); + goto reload; + } + + /* test we found something */ + n = xb_silo_query_first (self->silo, "components/component", NULL); + if (n == NULL) { + g_warning ("No AppStream data, try 'make install-sample-data' in data/"); + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "No AppStream data found"); + return NULL; + } + + g_clear_object (&n); + + self->silo_installed_by_desktopid = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_ptr_array_unref); + self->silo_installed_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + installed = xb_silo_query (self->silo, "/component[@type='desktop-application']/launchable[@type='desktop-id']", 0, NULL); + for (guint i = 0; installed != NULL && i < installed->len; i++) { + XbNode *launchable = g_ptr_array_index (installed, i); + const gchar *id = xb_node_get_text (launchable); + if (id != NULL && *id != '\0') { + GPtrArray *nodes = g_hash_table_lookup (self->silo_installed_by_desktopid, id); + if (nodes == NULL) { + nodes = g_ptr_array_new_with_free_func (g_object_unref); + g_hash_table_insert (self->silo_installed_by_desktopid, g_strdup (id), nodes); + } + g_ptr_array_add (nodes, xb_node_get_parent (launchable)); + } + } + + g_clear_pointer (&installed, g_ptr_array_unref); + installed = xb_silo_query (self->silo, "/component/id", 0, NULL); + for (guint i = 0; installed != NULL && i < installed->len; i++) { + XbNode *id_node = g_ptr_array_index (installed, i); + const gchar *id = xb_node_get_text (id_node); + if (id != NULL && *id != '\0') + g_hash_table_add (self->silo_installed_by_id, g_strdup (id)); + } + + n = xb_silo_query_first (self->silo, "info", NULL); + if (n != NULL) { + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + for (child = xb_node_get_child (n); + child != NULL && (self->silo_filename == NULL || self->default_scope == AS_COMPONENT_SCOPE_UNKNOWN); + g_object_unref (child), child = g_steal_pointer (&next)) { + const gchar *elem = xb_node_get_element (child); + next = xb_node_get_next (child); + if (self->silo_filename == NULL && g_strcmp0 (elem, "filename") == 0) { + self->silo_filename = g_strdup (xb_node_get_text (child)); + } else if (self->default_scope == AS_COMPONENT_SCOPE_UNKNOWN && g_strcmp0 (elem, "scope") == 0) { + const gchar *tmp = xb_node_get_text (child); + if (tmp != NULL) + self->default_scope = as_component_scope_from_string (tmp); + } + } + } + + /* success */ + if (out_silo_filename != NULL) + *out_silo_filename = g_strdup (self->silo_filename); + if (out_silo_installed_by_desktopid != NULL) + *out_silo_installed_by_desktopid = self->silo_installed_by_desktopid ? g_hash_table_ref (self->silo_installed_by_desktopid) : NULL; + if (out_silo_installed_by_id != NULL) + *out_silo_installed_by_id = self->silo_installed_by_id ? g_hash_table_ref (self->silo_installed_by_id) : NULL; + return g_object_ref (self->silo); +} + +static void +gs_plugin_appstream_reload (GsPlugin *plugin) +{ + GsPluginAppstream *self; + g_autoptr(GsAppList) list = NULL; + guint sz; + + g_return_if_fail (GS_IS_PLUGIN_APPSTREAM (plugin)); + + list = gs_plugin_list_cached (plugin); + sz = gs_app_list_length (list); + for (guint i = 0; i < sz; i++) { + GsApp *app = gs_app_list_index (list, i); + /* to ensure the app states are refined */ + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + } + + self = GS_PLUGIN_APPSTREAM (plugin); + /* Invalidate the reference to the current silo */ + g_atomic_int_inc (&self->silo_change_stamp); +} + +static gint +get_priority_for_interactivity (gboolean interactive) +{ + return interactive ? G_PRIORITY_DEFAULT : G_PRIORITY_LOW; +} + +static void setup_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_appstream_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_appstream_setup_async); + + /* Start up a worker thread to process all the plugin’s function calls. */ + self->worker = gs_worker_thread_new ("gs-plugin-appstream"); + + /* Queue a job to check the silo, which will cause it to be loaded. */ + gs_worker_thread_queue (self->worker, G_PRIORITY_DEFAULT, + setup_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +setup_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (source_object); + g_autoptr(XbSilo) silo = NULL; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + silo = gs_plugin_appstream_ref_silo (self, NULL, NULL, NULL, cancellable, &local_error); + if (silo == NULL) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_appstream_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_appstream_shutdown_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_appstream_shutdown_async); + + /* Stop the worker thread. */ + gs_worker_thread_shutdown_async (self->worker, cancellable, shutdown_cb, g_steal_pointer (&task)); +} + +static void +shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginAppstream *self = g_task_get_source_object (task); + g_autoptr(GsWorkerThread) worker = NULL; + g_autoptr(GError) local_error = NULL; + + worker = g_steal_pointer (&self->worker); + + if (!gs_worker_thread_shutdown_finish (worker, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_appstream_shutdown_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* Run in @worker. */ +static void +url_to_app_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (source_object); + GsPluginUrlToAppData *data = task_data; + g_autoptr(GsAppList) list = NULL; + g_autoptr(XbSilo) silo = NULL; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + /* check silo is valid */ + silo = gs_plugin_appstream_ref_silo (self, NULL, NULL, NULL, cancellable, &local_error); + if (silo == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + list = gs_app_list_new (); + + if (gs_appstream_url_to_app (GS_PLUGIN (self), silo, list, data->url, cancellable, &local_error)) + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static void +gs_plugin_appstream_url_to_app_async (GsPlugin *plugin, + const gchar *url, + GsPluginUrlToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE) != 0; + + task = gs_plugin_url_to_app_data_new_task (plugin, url, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_appstream_url_to_app_async); + + /* Queue a job for the refine. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + url_to_app_thread_cb, g_steal_pointer (&task)); +} + +static GsAppList * +gs_plugin_appstream_url_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_appstream_set_compulsory_quirk (GsApp *app, XbNode *component) +{ + g_autoptr(GPtrArray) array = NULL; + const gchar *current_desktop; + + /* + * Set the core applications for the current desktop that cannot be + * removed. + * + * If XDG_CURRENT_DESKTOP contains ":", indicating that it is made up + * of multiple components per the Desktop Entry Specification, an app + * is compulsory if any of the components in XDG_CURRENT_DESKTOP match + * any value in . In that way, + * "GNOME-Classic:GNOME" shares compulsory apps with GNOME. + * + * As a special case, if the value contains + * a ":", we match the entire XDG_CURRENT_DESKTOP. This lets people set + * compulsory apps for such compound desktops if they want. + * + */ + array = xb_node_query (component, "compulsory_for_desktop", 0, NULL); + if (array == NULL) + return; + current_desktop = g_getenv ("XDG_CURRENT_DESKTOP"); + if (current_desktop != NULL) { + g_auto(GStrv) xdg_current_desktops = g_strsplit (current_desktop, ":", 0); + for (guint i = 0; i < array->len; i++) { + XbNode *n = g_ptr_array_index (array, i); + const gchar *tmp = xb_node_get_text (n); + /* if the value has a :, check the whole string */ + if (g_strstr_len (tmp, -1, ":")) { + if (g_strcmp0 (current_desktop, tmp) == 0) { + gs_app_add_quirk (app, GS_APP_QUIRK_COMPULSORY); + break; + } + /* otherwise check if any element matches this one */ + } else if (g_strv_contains ((const gchar * const *) xdg_current_desktops, tmp)) { + gs_app_add_quirk (app, GS_APP_QUIRK_COMPULSORY); + break; + } + } + } +} + +static gboolean +gs_plugin_appstream_refine_state (GsPluginAppstream *self, + GsApp *app, + GHashTable *silo_installed_by_id, + GError **error) +{ + /* Ignore apps with no ID */ + if (gs_app_get_id (app) == NULL || silo_installed_by_id == NULL) + return TRUE; + + if (g_hash_table_contains (silo_installed_by_id, gs_app_get_id (app))) + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + return TRUE; +} + +static gboolean +gs_plugin_refine_from_id (GsPluginAppstream *self, + GsApp *app, + GsPluginRefineFlags flags, + GHashTable *apps_by_id, + GHashTable *apps_by_origin_and_id, + XbSilo *silo, + const gchar *silo_filename, + GHashTable *silo_installed_by_desktopid, + GHashTable *silo_installed_by_id, + gboolean *found, + GError **error) +{ + const gchar *id, *origin; + GPtrArray *components; + + /* not enough info to find */ + id = gs_app_get_id (app); + if (id == NULL) + return TRUE; + + origin = gs_app_get_origin_appstream (app); + + /* look in AppStream then fall back to AppData */ + if (origin && *origin) { + g_autofree gchar *key = g_strconcat (origin, "\n", id, NULL); + components = g_hash_table_lookup (apps_by_origin_and_id, key); + } else { + components = g_hash_table_lookup (apps_by_id, id); + } + + if (components == NULL) + return TRUE; + + for (guint i = 0; i < components->len; i++) { + XbNode *component = g_ptr_array_index (components, i); + if (!gs_appstream_refine_app (GS_PLUGIN (self), app, silo, component, flags, silo_installed_by_desktopid, + silo_filename ? silo_filename : "", self->default_scope, error)) + return FALSE; + gs_plugin_appstream_set_compulsory_quirk (app, component); + } + + /* if an installed desktop or appdata file exists set to installed */ + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) { + if (!gs_plugin_appstream_refine_state (self, app, silo_installed_by_id, error)) + return FALSE; + } + + /* success */ + *found = TRUE; + return TRUE; +} + +static gboolean +gs_plugin_refine_from_pkgname (GsPluginAppstream *self, + GsApp *app, + GsPluginRefineFlags flags, + XbSilo *silo, + const gchar *silo_filename, + GHashTable *silo_installed_by_desktopid, + GHashTable *silo_installed_by_id, + GError **error) +{ + GPtrArray *sources = gs_app_get_sources (app); + g_autoptr(GError) error_local = NULL; + + /* not enough info to find */ + if (sources->len == 0) + return TRUE; + + /* find all apps when matching any prefixes */ + for (guint j = 0; j < sources->len; j++) { + const gchar *pkgname = g_ptr_array_index (sources, j); + g_autoptr(GString) xpath = g_string_new (NULL); + g_autoptr(XbNode) component = NULL; + + /* prefer actual apps and then fallback to anything else */ + xb_string_append_union (xpath, "components/component[@type='desktop-application']/pkgname[text()='%s']/..", pkgname); + xb_string_append_union (xpath, "components/component[@type='console-application']/pkgname[text()='%s']/..", pkgname); + xb_string_append_union (xpath, "components/component[@type='web-application']/pkgname[text()='%s']/..", pkgname); + xb_string_append_union (xpath, "components/component/pkgname[text()='%s']/..", pkgname); + component = xb_silo_query_first (silo, xpath->str, &error_local); + if (component == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + continue; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + if (!gs_appstream_refine_app (GS_PLUGIN (self), app, silo, component, flags, silo_installed_by_desktopid, + silo_filename ? silo_filename : "", self->default_scope, error)) + return FALSE; + gs_plugin_appstream_set_compulsory_quirk (app, component); + } + + /* if an installed desktop or appdata file exists set to installed */ + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) { + if (!gs_plugin_appstream_refine_state (self, app, silo_installed_by_id, error)) + return FALSE; + } + + /* success */ + return TRUE; +} + +static void refine_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_appstream_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE); + + task = gs_plugin_refine_data_new_task (plugin, list, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_appstream_refine_async); + + /* Queue a job for the refine. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refine_thread_cb, g_steal_pointer (&task)); +} + +static gboolean refine_wildcard (GsPluginAppstream *self, + GsApp *app, + GsAppList *list, + GsPluginRefineFlags refine_flags, + GHashTable *apps_by_id, + XbSilo *silo, + const gchar *silo_filename, + GHashTable *silo_installed_by_desktopid, + GHashTable *silo_installed_by_id, + GCancellable *cancellable, + GError **error); + +/* Run in @worker. */ +static void +refine_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (source_object); + GsPluginRefineData *data = task_data; + GsAppList *list = data->list; + GsPluginRefineFlags flags = data->flags; + g_autoptr(GsAppList) app_list = NULL; + g_autoptr(GHashTable) apps_by_id = NULL; + g_autoptr(GHashTable) apps_by_origin_and_id = NULL; + g_autoptr(GPtrArray) components = NULL; + g_autoptr(XbSilo) silo = NULL; + g_autofree gchar *silo_filename = NULL; + g_autoptr(GHashTable) silo_installed_by_desktopid = NULL; + g_autoptr(GHashTable) silo_installed_by_id = NULL; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + /* check silo is valid */ + silo = gs_plugin_appstream_ref_silo (self, &silo_filename, &silo_installed_by_desktopid, &silo_installed_by_id, cancellable, &local_error); + if (silo == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + apps_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_ptr_array_unref); + apps_by_origin_and_id = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_ptr_array_unref); + + components = xb_silo_query (silo, "components/component/id", 0, NULL); + for (guint i = 0; components != NULL && i < components->len; i++) { + XbNode *node = g_ptr_array_index (components, i); + g_autoptr(XbNode) component_node = xb_node_get_parent (node); + g_autoptr(XbNode) components_node = xb_node_get_parent (component_node); + GPtrArray *comps; + const gchar *comp_id = xb_node_get_text (node); + const gchar *origin; + + /* discard web-apps */ + if (g_strcmp0 (xb_node_get_attr (component_node, "type"), "web-application") != 0) { + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + gboolean found_pkgname = FALSE; + + for (child = xb_node_get_child (component_node); child != NULL; g_object_unref (child), child = g_steal_pointer (&next)) { + next = xb_node_get_next (child); + if (g_strcmp0 (xb_node_get_element (child), "pkgname") == 0) { + found_pkgname = TRUE; + break; + } + } + + if (!found_pkgname) + continue; + } + + comps = g_hash_table_lookup (apps_by_id, comp_id); + if (comps == NULL) { + comps = g_ptr_array_new_with_free_func (g_object_unref); + g_hash_table_insert (apps_by_id, g_strdup (comp_id), comps); + } + g_ptr_array_add (comps, g_object_ref (component_node)); + + origin = xb_node_get_attr (components_node, "origin"); + if (origin != NULL) { + g_autofree gchar *key = g_strconcat (origin, "\n", comp_id, NULL); + comps = g_hash_table_lookup (apps_by_origin_and_id, key); + if (comps == NULL) { + comps = g_ptr_array_new_with_free_func (g_object_unref); + g_hash_table_insert (apps_by_origin_and_id, g_steal_pointer (&key), comps); + } + g_ptr_array_add (comps, g_object_ref (component_node)); + } + } + + g_clear_pointer (&components, g_ptr_array_unref); + components = xb_silo_query (silo, "component/id", 0, NULL); + for (guint i = 0; components != NULL && i < components->len; i++) { + XbNode *node = g_ptr_array_index (components, i); + g_autoptr(XbNode) component_node = xb_node_get_parent (node); + GPtrArray *comps; + const gchar *comp_id = xb_node_get_text (node); + + comps = g_hash_table_lookup (apps_by_id, comp_id); + if (comps == NULL) { + comps = g_ptr_array_new_with_free_func (g_object_unref); + g_hash_table_insert (apps_by_id, g_strdup (comp_id), comps); + } + g_ptr_array_add (comps, g_object_ref (component_node)); + } + + for (guint i = 0; i < gs_app_list_length (list); i++) { + gboolean found = FALSE; + GsApp *app = gs_app_list_index (list, i); + + /* not us */ + if (gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_PACKAGE && + gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_UNKNOWN) + continue; + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + + /* find by ID then fall back to package name */ + if (!gs_plugin_refine_from_id (self, app, flags, apps_by_id, apps_by_origin_and_id, silo, silo_filename, + silo_installed_by_desktopid, silo_installed_by_id, &found, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + if (!found) { + if (!gs_plugin_refine_from_pkgname (self, app, flags, silo, silo_filename, + silo_installed_by_desktopid, silo_installed_by_id, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + } + + /* Refine wildcards. + * + * Use a copy of the list for the loop because a function called + * on the plugin may affect the list which can lead to problems + * (e.g. inserting an app in the list on every call results in + * an infinite loop) */ + app_list = gs_app_list_copy (list); + + for (guint j = 0; j < gs_app_list_length (app_list); j++) { + GsApp *app = gs_app_list_index (app_list, j); + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD) && + !refine_wildcard (self, app, list, flags, apps_by_id, silo, silo_filename, + silo_installed_by_desktopid, silo_installed_by_id,cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_appstream_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* Run in @worker. Silo must be valid */ +static gboolean +refine_wildcard (GsPluginAppstream *self, + GsApp *app, + GsAppList *list, + GsPluginRefineFlags refine_flags, + GHashTable *apps_by_id, + XbSilo *silo, + const gchar *silo_filename, + GHashTable *silo_installed_by_desktopid, + GHashTable *silo_installed_by_id, + GCancellable *cancellable, + GError **error) +{ + const gchar *id; + GPtrArray *components; + + /* not enough info to find */ + id = gs_app_get_id (app); + if (id == NULL) + return TRUE; + + components = g_hash_table_lookup (apps_by_id, id); + if (components == NULL) + return TRUE; + for (guint i = 0; i < components->len; i++) { + XbNode *component = g_ptr_array_index (components, i); + g_autoptr(GsApp) new = NULL; + + /* new app */ + new = gs_appstream_create_app (GS_PLUGIN (self), silo, component, silo_filename ? silo_filename : "", + self->default_scope, error); + if (new == NULL) + return FALSE; + gs_app_set_scope (new, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_subsume_metadata (new, app); + if (!gs_appstream_refine_app (GS_PLUGIN (self), new, silo, component, refine_flags, silo_installed_by_desktopid, + silo_filename ? silo_filename : "", self->default_scope, error)) + return FALSE; + gs_plugin_appstream_set_compulsory_quirk (new, component); + + /* if an installed desktop or appdata file exists set to installed */ + if (gs_app_get_state (new) == GS_APP_STATE_UNKNOWN) { + if (!gs_plugin_appstream_refine_state (self, new, silo_installed_by_id, error)) + return FALSE; + } + + gs_app_list_add (list, new); + } + + /* success */ + return TRUE; +} + +static void refine_categories_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_appstream_refine_categories_async (GsPlugin *plugin, + GPtrArray *list, + GsPluginRefineCategoriesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_REFINE_CATEGORIES_FLAGS_INTERACTIVE); + + task = gs_plugin_refine_categories_data_new_task (plugin, list, flags, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_appstream_refine_categories_async); + + /* All we actually do is add the sizes of each category. If that’s + * not been requested, avoid queueing a worker job. */ + if (!(flags & GS_PLUGIN_REFINE_CATEGORIES_FLAGS_SIZE)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* Queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refine_categories_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +refine_categories_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (source_object); + g_autoptr(XbSilo) silo = NULL; + GsPluginRefineCategoriesData *data = task_data; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + /* check silo is valid */ + silo = gs_plugin_appstream_ref_silo (self, NULL, NULL, NULL, cancellable, &local_error); + if (silo == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (!gs_appstream_refine_category_sizes (silo, data->list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_appstream_refine_categories_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void list_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_appstream_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_list_apps_data_new_task (plugin, query, flags, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_appstream_list_apps_async); + + /* Queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + list_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +list_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (source_object); + g_autoptr(XbSilo) silo = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + GsPluginListAppsData *data = task_data; + GDateTime *released_since = NULL; + GsAppQueryTristate is_curated = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_featured = GS_APP_QUERY_TRISTATE_UNSET; + GsCategory *category = NULL; + GsAppQueryTristate is_installed = GS_APP_QUERY_TRISTATE_UNSET; + guint64 age_secs = 0; + const gchar * const *deployment_featured = NULL; + const gchar * const *developers = NULL; + const gchar * const *keywords = NULL; + GsApp *alternate_of = NULL; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (data->query != NULL) { + released_since = gs_app_query_get_released_since (data->query); + is_curated = gs_app_query_get_is_curated (data->query); + is_featured = gs_app_query_get_is_featured (data->query); + category = gs_app_query_get_category (data->query); + is_installed = gs_app_query_get_is_installed (data->query); + deployment_featured = gs_app_query_get_deployment_featured (data->query); + developers = gs_app_query_get_developers (data->query); + keywords = gs_app_query_get_keywords (data->query); + alternate_of = gs_app_query_get_alternate_of (data->query); + } + if (released_since != NULL) { + g_autoptr(GDateTime) now = g_date_time_new_now_utc (); + age_secs = g_date_time_difference (now, released_since) / G_TIME_SPAN_SECOND; + } + + /* Currently only support a subset of query properties, and only one set at once. + * Also don’t currently support GS_APP_QUERY_TRISTATE_FALSE. */ + if ((released_since == NULL && + is_curated == GS_APP_QUERY_TRISTATE_UNSET && + is_featured == GS_APP_QUERY_TRISTATE_UNSET && + category == NULL && + is_installed == GS_APP_QUERY_TRISTATE_UNSET && + deployment_featured == NULL && + developers == NULL && + keywords == NULL && + alternate_of == NULL) || + is_curated == GS_APP_QUERY_TRISTATE_FALSE || + is_featured == GS_APP_QUERY_TRISTATE_FALSE || + is_installed == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (data->query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + /* check silo is valid */ + silo = gs_plugin_appstream_ref_silo (self, NULL, NULL, NULL, cancellable, &local_error); + if (silo == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (released_since != NULL && + !gs_appstream_add_recent (GS_PLUGIN (self), silo, list, age_secs, + cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (is_curated != GS_APP_QUERY_TRISTATE_UNSET && + !gs_appstream_add_popular (silo, list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (is_featured != GS_APP_QUERY_TRISTATE_UNSET && + !gs_appstream_add_featured (silo, list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (category != NULL && + !gs_appstream_add_category_apps (GS_PLUGIN (self), silo, category, list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (is_installed == GS_APP_QUERY_TRISTATE_TRUE && + !gs_appstream_add_installed (GS_PLUGIN (self), silo, list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (deployment_featured != NULL && + !gs_appstream_add_deployment_featured (silo, deployment_featured, list, + cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (developers != NULL && + !gs_appstream_search_developer_apps (GS_PLUGIN (self), silo, developers, list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (keywords != NULL && + !gs_appstream_search (GS_PLUGIN (self), silo, keywords, list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (alternate_of != NULL && + !gs_appstream_add_alternates (silo, alternate_of, list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_appstream_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void refresh_metadata_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_appstream_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_appstream_refresh_metadata_async); + + /* Queue a job to check the silo, which will cause it to be refreshed if needed. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refresh_metadata_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +refresh_metadata_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (source_object); + g_autoptr(XbSilo) silo = NULL; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + /* Checking the silo will refresh it if needed. */ + silo = gs_plugin_appstream_ref_silo (self, NULL, NULL, NULL, cancellable, &local_error); + if (silo == NULL) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_appstream_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_appstream_class_init (GsPluginAppstreamClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_appstream_dispose; + + plugin_class->reload = gs_plugin_appstream_reload; + plugin_class->setup_async = gs_plugin_appstream_setup_async; + plugin_class->setup_finish = gs_plugin_appstream_setup_finish; + plugin_class->shutdown_async = gs_plugin_appstream_shutdown_async; + plugin_class->shutdown_finish = gs_plugin_appstream_shutdown_finish; + plugin_class->refine_async = gs_plugin_appstream_refine_async; + plugin_class->refine_finish = gs_plugin_appstream_refine_finish; + plugin_class->list_apps_async = gs_plugin_appstream_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_appstream_list_apps_finish; + plugin_class->refresh_metadata_async = gs_plugin_appstream_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_appstream_refresh_metadata_finish; + plugin_class->refine_categories_async = gs_plugin_appstream_refine_categories_async; + plugin_class->refine_categories_finish = gs_plugin_appstream_refine_categories_finish; + plugin_class->url_to_app_async = gs_plugin_appstream_url_to_app_async; + plugin_class->url_to_app_finish = gs_plugin_appstream_url_to_app_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_APPSTREAM; +} diff --git a/plugins/core/gs-plugin-appstream.h b/plugins/core/gs-plugin-appstream.h new file mode 100644 index 0000000..9ffb429 --- /dev/null +++ b/plugins/core/gs-plugin-appstream.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_APPSTREAM (gs_plugin_appstream_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginAppstream, gs_plugin_appstream, GS, PLUGIN_APPSTREAM, GsPlugin) + +G_END_DECLS diff --git a/plugins/core/gs-plugin-generic-updates.c b/plugins/core/gs-plugin-generic-updates.c new file mode 100644 index 0000000..1ef6d7d --- /dev/null +++ b/plugins/core/gs-plugin-generic-updates.c @@ -0,0 +1,157 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include + +#include "gs-plugin-generic-updates.h" + +struct _GsPluginGenericUpdates +{ + GsPlugin parent; +}; + +G_DEFINE_TYPE (GsPluginGenericUpdates, gs_plugin_generic_updates, GS_TYPE_PLUGIN) + +static void +gs_plugin_generic_updates_init (GsPluginGenericUpdates *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "icons"); +} + +static gboolean +gs_plugin_generic_updates_merge_os_update (GsApp *app) +{ + /* this is only for grouping system-installed packages */ + if (gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_PACKAGE || + gs_app_get_scope (app) != AS_COMPONENT_SCOPE_SYSTEM) + return FALSE; + + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_GENERIC: + case AS_COMPONENT_KIND_REPOSITORY: + case AS_COMPONENT_KIND_SERVICE: + return TRUE; + default: + break; + } + + return FALSE; +} + +static GsApp * +gs_plugin_generic_updates_get_os_update (GsPlugin *plugin) +{ + GsApp *app; + const gchar *id = "org.gnome.Software.OsUpdate"; + g_autoptr(GIcon) ic = NULL; + + /* create new */ + app = gs_app_new (id); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_PROXY); + gs_app_set_management_plugin (app, plugin); + gs_app_set_special_kind (app, GS_APP_SPECIAL_KIND_OS_UPDATE); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_set_name (app, + GS_APP_QUALITY_NORMAL, + /* TRANSLATORS: this is a group of updates that are not + * packages and are not shown in the main list */ + _("System Updates")); + gs_app_set_summary (app, + GS_APP_QUALITY_NORMAL, + /* TRANSLATORS: this is a longer description of the + * "System Updates" string */ + _("General system updates, such as security or bug fixes, and performance improvements.")); + gs_app_set_description (app, + GS_APP_QUALITY_NORMAL, + gs_app_get_summary (app)); + ic = g_themed_icon_new ("system-component-os-updates"); + gs_app_add_icon (app, ic); + + return app; +} + +static void +gs_plugin_generic_updates_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) os_updates = gs_app_list_new (); + AsUrgencyKind max_urgency = AS_URGENCY_KIND_UNKNOWN; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_generic_updates_refine_async); + + /* not from get_updates() */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS) == 0 && + (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY) == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + /* do we have any packages left that are not apps? */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app_tmp = gs_app_list_index (list, i); + if (gs_app_has_quirk (app_tmp, GS_APP_QUIRK_IS_WILDCARD)) + continue; + if (gs_plugin_generic_updates_merge_os_update (app_tmp)) { + if (max_urgency < gs_app_get_update_urgency (app_tmp)) + max_urgency = gs_app_get_update_urgency (app_tmp); + gs_app_list_add (os_updates, app_tmp); + } + } + if (gs_app_list_length (os_updates) == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + /* create new meta object */ + app = gs_plugin_generic_updates_get_os_update (plugin); + gs_app_set_update_urgency (app, max_urgency); + for (guint i = 0; i < gs_app_list_length (os_updates); i++) { + GsApp *app_tmp = gs_app_list_index (os_updates, i); + gs_app_add_related (app, app_tmp); + gs_app_list_remove (list, app_tmp); + } + gs_app_list_add (list, app); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_generic_updates_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_generic_updates_class_init (GsPluginGenericUpdatesClass *klass) +{ + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + plugin_class->refine_async = gs_plugin_generic_updates_refine_async; + plugin_class->refine_finish = gs_plugin_generic_updates_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_GENERIC_UPDATES; +} diff --git a/plugins/core/gs-plugin-generic-updates.h b/plugins/core/gs-plugin-generic-updates.h new file mode 100644 index 0000000..2de771e --- /dev/null +++ b/plugins/core/gs-plugin-generic-updates.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_GENERIC_UPDATES (gs_plugin_generic_updates_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginGenericUpdates, gs_plugin_generic_updates, GS, PLUGIN_GENERIC_UPDATES, GsPlugin) + +G_END_DECLS diff --git a/plugins/core/gs-plugin-hardcoded-blocklist.c b/plugins/core/gs-plugin-hardcoded-blocklist.c new file mode 100644 index 0000000..6af38f9 --- /dev/null +++ b/plugins/core/gs-plugin-hardcoded-blocklist.c @@ -0,0 +1,121 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include + +#include "gs-plugin-hardcoded-blocklist.h" + +/* + * SECTION: + * Blocklists some applications based on a hardcoded list. + * + * This plugin executes entirely in the main thread. + */ + +struct _GsPluginHardcodedBlocklist +{ + GsPlugin parent; +}; + +G_DEFINE_TYPE (GsPluginHardcodedBlocklist, gs_plugin_hardcoded_blocklist, GS_TYPE_PLUGIN) + +static void +gs_plugin_hardcoded_blocklist_init (GsPluginHardcodedBlocklist *self) +{ + /* need ID */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "appstream"); +} + +static gboolean +refine_app (GsPlugin *plugin, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error) +{ + guint i; + const gchar *app_globs[] = { + "freeciv-server.desktop", + "links.desktop", + "nm-connection-editor.desktop", + "plank.desktop", + "*release-notes*.desktop", + "*Release_Notes*.desktop", + "Rodent-*.desktop", + "rygel-preferences.desktop", + "system-config-keyboard.desktop", + "tracker-preferences.desktop", + "Uninstall*.desktop", + "wine-*.desktop", + NULL }; + + /* not set yet */ + if (gs_app_get_id (app) == NULL) + return TRUE; + + /* search */ + for (i = 0; app_globs[i] != NULL; i++) { + if (fnmatch (app_globs[i], gs_app_get_id (app), 0) == 0) { + gs_app_add_quirk (app, GS_APP_QUIRK_HIDE_EVERYWHERE); + break; + } + } + + return TRUE; +} + +static void +gs_plugin_hardcoded_blocklist_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_hardcoded_blocklist_refine_async); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (!refine_app (plugin, app, flags, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_hardcoded_blocklist_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_hardcoded_blocklist_class_init (GsPluginHardcodedBlocklistClass *klass) +{ + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + plugin_class->refine_async = gs_plugin_hardcoded_blocklist_refine_async; + plugin_class->refine_finish = gs_plugin_hardcoded_blocklist_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_HARDCODED_BLOCKLIST; +} diff --git a/plugins/core/gs-plugin-hardcoded-blocklist.h b/plugins/core/gs-plugin-hardcoded-blocklist.h new file mode 100644 index 0000000..b6e837e --- /dev/null +++ b/plugins/core/gs-plugin-hardcoded-blocklist.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_HARDCODED_BLOCKLIST (gs_plugin_hardcoded_blocklist_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginHardcodedBlocklist, gs_plugin_hardcoded_blocklist, GS, PLUGIN_HARDCODED_BLOCKLIST, GsPlugin) + +G_END_DECLS diff --git a/plugins/core/gs-plugin-icons.c b/plugins/core/gs-plugin-icons.c new file mode 100644 index 0000000..a2f9579 --- /dev/null +++ b/plugins/core/gs-plugin-icons.c @@ -0,0 +1,227 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2014 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include + +#include + +#include "gs-plugin-icons.h" + +/* + * SECTION: + * Loads remote icons and converts them into local cached ones. + * + * It is provided so that each plugin handling icons does not + * have to handle the download and caching functionality. + * + * FIXME: This plugin will eventually go away. Currently it only exists as the + * plugin threading code is a convenient way of ensuring that loading the remote + * icons happens in a worker thread. + */ + +struct _GsPluginIcons +{ + GsPlugin parent; + + GMutex mutex; /* protects @icon_downloader **/ + GsIconDownloader *icon_downloader; /* (owned) */ + SoupSession *soup_session; /* (owned) */ +}; + +G_DEFINE_TYPE (GsPluginIcons, gs_plugin_icons, GS_TYPE_PLUGIN) + +static void +gs_plugin_icons_init (GsPluginIcons *self) +{ + /* needs remote icons downloaded */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "epiphany"); +} + +static void +gs_plugin_icons_dispose (GObject *object) +{ + GsPluginIcons *self = GS_PLUGIN_ICONS (object); + + g_clear_object (&self->icon_downloader); + g_clear_object (&self->soup_session); + + G_OBJECT_CLASS (gs_plugin_icons_parent_class)->dispose (object); +} + +static void +gs_plugin_icons_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginIcons *self = GS_PLUGIN_ICONS (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_icons_setup_async); + + g_mutex_init (&self->mutex); + self->soup_session = gs_build_soup_session (); + + /* Currently a 160px icon is needed for #GsFeatureTile, at most. + Scaling is applied inside the downloader. */ + self->icon_downloader = gs_icon_downloader_new (self->soup_session, 160); + g_object_bind_property (plugin, "scale", + self->icon_downloader, "scale", + G_BINDING_SYNC_CREATE); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_icons_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_icons_shutdown_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginIcons *self = GS_PLUGIN_ICONS (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_icons_shutdown_async); + + /* Stop the icon downloader. */ + gs_icon_downloader_shutdown_async (self->icon_downloader, cancellable, + shutdown_cb, g_steal_pointer (&task)); +} + +static void +shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsIconDownloader) icon_downloader = NULL; + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginIcons *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + g_clear_object (&self->soup_session); + icon_downloader = g_steal_pointer (&self->icon_downloader); + if (!gs_icon_downloader_shutdown_finish (icon_downloader, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_icons_shutdown_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +refine_app_unlocked (GsPluginIcons *self, + GsApp *app, + GsPluginRefineFlags flags, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + /* not required */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) == 0) + return TRUE; + + gs_icon_downloader_queue_app (self->icon_downloader, app, interactive); + + return TRUE; +} + +static void +gs_plugin_icons_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginIcons *self = GS_PLUGIN_ICONS (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_icons_refine_async); + + /* nothing to do here */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + { + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->mutex); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + g_autoptr(GError) local_error = NULL; + GsApp *app = gs_app_list_index (list, i); + + if (!refine_app_unlocked (self, app, flags, interactive, cancellable, + &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_icons_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_icons_class_init (GsPluginIconsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_icons_dispose; + + plugin_class->setup_async = gs_plugin_icons_setup_async; + plugin_class->setup_finish = gs_plugin_icons_setup_finish; + plugin_class->shutdown_async = gs_plugin_icons_shutdown_async; + plugin_class->shutdown_finish = gs_plugin_icons_shutdown_finish; + plugin_class->refine_async = gs_plugin_icons_refine_async; + plugin_class->refine_finish = gs_plugin_icons_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_ICONS; +} diff --git a/plugins/core/gs-plugin-icons.h b/plugins/core/gs-plugin-icons.h new file mode 100644 index 0000000..641f5c9 --- /dev/null +++ b/plugins/core/gs-plugin-icons.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_ICONS (gs_plugin_icons_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginIcons, gs_plugin_icons, GS, PLUGIN_ICONS, GsPlugin) + +G_END_DECLS diff --git a/plugins/core/gs-plugin-os-release.c b/plugins/core/gs-plugin-os-release.c new file mode 100644 index 0000000..c270528 --- /dev/null +++ b/plugins/core/gs-plugin-os-release.c @@ -0,0 +1,180 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include + +#include "gs-plugin-os-release.h" + +struct _GsPluginOsRelease +{ + GsPlugin parent; + + GsApp *app_system; +}; + +G_DEFINE_TYPE (GsPluginOsRelease, gs_plugin_os_release, GS_TYPE_PLUGIN) + +static void +gs_plugin_os_release_dispose (GObject *object) +{ + GsPluginOsRelease *self = GS_PLUGIN_OS_RELEASE (object); + + g_clear_object (&self->app_system); + + G_OBJECT_CLASS (gs_plugin_os_release_parent_class)->dispose (object); +} + +static void +gs_plugin_os_release_init (GsPluginOsRelease *self) +{ + self->app_system = gs_app_new ("system"); + gs_app_set_kind (self->app_system, AS_COMPONENT_KIND_OPERATING_SYSTEM); + gs_app_set_state (self->app_system, GS_APP_STATE_INSTALLED); +} + +static void +gs_plugin_os_release_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginOsRelease *self = GS_PLUGIN_OS_RELEASE (plugin); + g_autoptr(GTask) task = NULL; + const gchar *cpe_name; + const gchar *home_url; + const gchar *name; + const gchar *version; + const gchar *os_id; + g_autoptr(GsOsRelease) os_release = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_os_release_setup_async); + + /* parse os-release, wherever it may be */ + os_release = gs_os_release_new (&local_error); + if (os_release == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + cpe_name = gs_os_release_get_cpe_name (os_release); + if (cpe_name != NULL) + gs_app_set_metadata (self->app_system, "GnomeSoftware::CpeName", cpe_name); + name = gs_os_release_get_name (os_release); + if (name != NULL) + gs_app_set_name (self->app_system, GS_APP_QUALITY_LOWEST, name); + version = gs_os_release_get_version_id (os_release); + if (version != NULL) + gs_app_set_version (self->app_system, version); + + os_id = gs_os_release_get_id (os_release); + + /* use libsoup to convert a URL */ + home_url = gs_os_release_get_home_url (os_release); + if (home_url != NULL) { + g_autoptr(GUri) uri = NULL; + + /* homepage */ + gs_app_set_url (self->app_system, AS_URL_KIND_HOMEPAGE, home_url); + + /* Build ID from the reverse-DNS URL and the ID and version. */ + uri = g_uri_parse (home_url, SOUP_HTTP_URI_FLAGS, NULL); + if (uri != NULL) { + g_auto(GStrv) split = NULL; + const gchar *home_host = g_uri_get_host (uri); + split = g_strsplit_set (home_host, ".", -1); + if (g_strv_length (split) >= 2) { + g_autofree gchar *id = NULL; + id = g_strdup_printf ("%s.%s.%s-%s", + split[1], + split[0], + (os_id != NULL) ? os_id : "unnamed", + (version != NULL) ? version : "unversioned"); + gs_app_set_id (self->app_system, id); + } + } + } + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_os_release_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_os_release_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginOsRelease *self = GS_PLUGIN_OS_RELEASE (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_os_release_refine_async); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + /* match meta-id */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD) && + g_strcmp0 (gs_app_get_id (app), "system") == 0) { + /* copy over interesting metadata */ + if (gs_app_get_install_date (app) != 0 && + gs_app_get_install_date (self->app_system) == 0) { + gs_app_set_install_date (self->app_system, + gs_app_get_install_date (app)); + } + + gs_app_list_add (list, self->app_system); + break; + } + } + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_os_release_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_os_release_class_init (GsPluginOsReleaseClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_os_release_dispose; + + plugin_class->setup_async = gs_plugin_os_release_setup_async; + plugin_class->setup_finish = gs_plugin_os_release_setup_finish; + plugin_class->refine_async = gs_plugin_os_release_refine_async; + plugin_class->refine_finish = gs_plugin_os_release_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_OS_RELEASE; +} diff --git a/plugins/core/gs-plugin-os-release.h b/plugins/core/gs-plugin-os-release.h new file mode 100644 index 0000000..78b15a3 --- /dev/null +++ b/plugins/core/gs-plugin-os-release.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_OS_RELEASE (gs_plugin_os_release_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginOsRelease, gs_plugin_os_release, GS, PLUGIN_OS_RELEASE, GsPlugin) + +G_END_DECLS diff --git a/plugins/core/gs-plugin-provenance-license.c b/plugins/core/gs-plugin-provenance-license.c new file mode 100644 index 0000000..1ce09e9 --- /dev/null +++ b/plugins/core/gs-plugin-provenance-license.c @@ -0,0 +1,199 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * Copyright (C) 2016 Matthias Klumpp + * Copyright (C) 2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include + +#include "gs-plugin-provenance-license.h" + +/* + * SECTION: + * Marks the application as Free Software if it comes from an origin + * that is recognized as being DFSGish-free. + * + * This plugin executes entirely in the main thread. + */ + +struct _GsPluginProvenanceLicense { + GsPlugin parent; + + GSettings *settings; + gchar **sources; + gchar *license_id; +}; + +G_DEFINE_TYPE (GsPluginProvenanceLicense, gs_plugin_provenance_license, GS_TYPE_PLUGIN) + +static gchar ** +gs_plugin_provenance_license_get_sources (GsPluginProvenanceLicense *self) +{ + const gchar *tmp; + + tmp = g_getenv ("GS_SELF_TEST_PROVENANCE_LICENSE_SOURCES"); + if (tmp != NULL) { + g_debug ("using custom provenance_license sources of %s", tmp); + return g_strsplit (tmp, ",", -1); + } + return g_settings_get_strv (self->settings, "free-repos"); +} + +static gchar * +gs_plugin_provenance_license_get_id (GsPluginProvenanceLicense *self) +{ + const gchar *tmp; + g_autofree gchar *url = NULL; + + tmp = g_getenv ("GS_SELF_TEST_PROVENANCE_LICENSE_URL"); + if (tmp != NULL) { + g_debug ("using custom license generic sources of %s", tmp); + url = g_strdup (tmp); + } else { + url = g_settings_get_string (self->settings, "free-repos-url"); + if (url == NULL) + return g_strdup ("LicenseRef-free"); + } + return g_strdup_printf ("LicenseRef-free=%s", url); +} + +static void +gs_plugin_provenance_license_changed_cb (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + GsPluginProvenanceLicense *self = GS_PLUGIN_PROVENANCE_LICENSE (user_data); + + if (g_strcmp0 (key, "free-repos") == 0) { + g_strfreev (self->sources); + self->sources = gs_plugin_provenance_license_get_sources (self); + } + if (g_strcmp0 (key, "free-repos-url") == 0) { + g_free (self->license_id); + self->license_id = gs_plugin_provenance_license_get_id (self); + } +} + +static void +gs_plugin_provenance_license_init (GsPluginProvenanceLicense *self) +{ + self->settings = g_settings_new ("org.gnome.software"); + g_signal_connect (self->settings, "changed", + G_CALLBACK (gs_plugin_provenance_license_changed_cb), self); + self->sources = gs_plugin_provenance_license_get_sources (self); + self->license_id = gs_plugin_provenance_license_get_id (self); + + /* need this set */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "provenance"); +} + +static void +gs_plugin_provenance_license_dispose (GObject *object) +{ + GsPluginProvenanceLicense *self = GS_PLUGIN_PROVENANCE_LICENSE (object); + + g_clear_pointer (&self->sources, g_strfreev); + g_clear_pointer (&self->license_id, g_free); + g_clear_object (&self->settings); + + G_OBJECT_CLASS (gs_plugin_provenance_license_parent_class)->dispose (object); +} + +static gboolean +refine_app (GsPluginProvenanceLicense *self, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error) +{ + const gchar *origin; + + /* not required */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) == 0) + return TRUE; + + /* no provenance */ + if (!gs_app_has_quirk (app, GS_APP_QUIRK_PROVENANCE)) + return TRUE; + + /* nothing to search */ + if (self->sources == NULL || self->sources[0] == NULL) + return TRUE; + + /* simple case */ + origin = gs_app_get_origin (app); + if (origin != NULL && gs_utils_strv_fnmatch (self->sources, origin)) + gs_app_set_license (app, GS_APP_QUALITY_NORMAL, self->license_id); + + return TRUE; +} + +static void +gs_plugin_provenance_license_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginProvenanceLicense *self = GS_PLUGIN_PROVENANCE_LICENSE (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_provenance_license_refine_async); + + /* nothing to do here */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + /* nothing to search */ + if (self->sources == NULL || self->sources[0] == NULL) { + g_task_return_boolean (task, TRUE); + return; + } + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (!refine_app (self, app, flags, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_provenance_license_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_provenance_license_class_init (GsPluginProvenanceLicenseClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_provenance_license_dispose; + + plugin_class->refine_async = gs_plugin_provenance_license_refine_async; + plugin_class->refine_finish = gs_plugin_provenance_license_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_PROVENANCE_LICENSE; +} diff --git a/plugins/core/gs-plugin-provenance-license.h b/plugins/core/gs-plugin-provenance-license.h new file mode 100644 index 0000000..7a7c53a --- /dev/null +++ b/plugins/core/gs-plugin-provenance-license.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_PROVENANCE_LICENSE (gs_plugin_provenance_license_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginProvenanceLicense, gs_plugin_provenance_license, GS, PLUGIN_PROVENANCE_LICENSE, GsPlugin) + +G_END_DECLS diff --git a/plugins/core/gs-plugin-provenance.c b/plugins/core/gs-plugin-provenance.c new file mode 100644 index 0000000..f4dab57 --- /dev/null +++ b/plugins/core/gs-plugin-provenance.c @@ -0,0 +1,292 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2015-2016 Richard Hughes + * Copyright (C) 2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include + +#include "gs-plugin-provenance.h" + +/* + * SECTION: + * Sets the package provenance to TRUE if installed by an official + * software source. Also sets compulsory quirk when a required repository. + * + * This plugin executes entirely in the main thread. + */ + +struct _GsPluginProvenance { + GsPlugin parent; + + GSettings *settings; + GHashTable *repos; /* gchar *name ~> guint flags */ + GPtrArray *provenance_wildcards; /* non-NULL, when have names with wildcards */ + GPtrArray *compulsory_wildcards; /* non-NULL, when have names with wildcards */ +}; + +G_DEFINE_TYPE (GsPluginProvenance, gs_plugin_provenance, GS_TYPE_PLUGIN) + +static GHashTable * +gs_plugin_provenance_remove_by_flag (GHashTable *old_repos, + GsAppQuirk quirk) +{ + GHashTable *new_repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + GHashTableIter iter; + gpointer key, value; + g_hash_table_iter_init (&iter, old_repos); + while (g_hash_table_iter_next (&iter, &key, &value)) { + guint flags = GPOINTER_TO_UINT (value); + flags = flags & (~quirk); + if (flags != 0) + g_hash_table_insert (new_repos, g_strdup (key), GUINT_TO_POINTER (flags)); + } + return new_repos; +} + +static void +gs_plugin_provenance_add_quirks (GsApp *app, + guint quirks) +{ + if ((quirks & GS_APP_QUIRK_PROVENANCE) != 0) + gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE); + if ((quirks & GS_APP_QUIRK_COMPULSORY) != 0 && + gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) + gs_app_add_quirk (app, GS_APP_QUIRK_COMPULSORY); +} + +static gchar ** +gs_plugin_provenance_get_sources (GsPluginProvenance *self, + const gchar *key) +{ + const gchar *tmp; + tmp = g_getenv ("GS_SELF_TEST_PROVENANCE_SOURCES"); + if (tmp != NULL) { + if (g_strcmp0 (key, "required-repos") == 0) + return NULL; + g_debug ("using custom provenance sources of %s", tmp); + return g_strsplit (tmp, ",", -1); + } + return g_settings_get_strv (self->settings, key); +} + +static void +gs_plugin_provenance_settings_changed_cb (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + GsPluginProvenance *self = GS_PLUGIN_PROVENANCE (user_data); + GsAppQuirk quirk = GS_APP_QUIRK_NONE; + GPtrArray **pwildcards = NULL; + + if (g_strcmp0 (key, "official-repos") == 0) { + quirk = GS_APP_QUIRK_PROVENANCE; + pwildcards = &self->provenance_wildcards; + } else if (g_strcmp0 (key, "required-repos") == 0) { + quirk = GS_APP_QUIRK_COMPULSORY; + pwildcards = &self->compulsory_wildcards; + } + + if (quirk != GS_APP_QUIRK_NONE) { + /* The keys are stolen by the hash table, thus free only the array */ + g_autofree gchar **repos = NULL; + g_autoptr(GHashTable) old_repos = self->repos; + g_autoptr(GPtrArray) old_wildcards = *pwildcards; + GHashTable *new_repos = gs_plugin_provenance_remove_by_flag (old_repos, quirk); + GPtrArray *new_wildcards = NULL; + repos = gs_plugin_provenance_get_sources (self, key); + for (guint ii = 0; repos && repos[ii]; ii++) { + gchar *repo = g_steal_pointer (&(repos[ii])); + if (strchr (repo, '*') || + strchr (repo, '?') || + strchr (repo, '[')) { + if (new_wildcards == NULL) + new_wildcards = g_ptr_array_new_with_free_func (g_free); + g_ptr_array_add (new_wildcards, repo); + } else { + g_hash_table_insert (new_repos, repo, + GUINT_TO_POINTER (quirk | + GPOINTER_TO_UINT (g_hash_table_lookup (new_repos, repo)))); + } + } + if (new_wildcards != NULL) + g_ptr_array_add (new_wildcards, NULL); + self->repos = new_repos; + *pwildcards = new_wildcards; + } +} + +static void +gs_plugin_provenance_init (GsPluginProvenance *self) +{ + self->settings = g_settings_new ("org.gnome.software"); + self->repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + g_signal_connect (self->settings, "changed", + G_CALLBACK (gs_plugin_provenance_settings_changed_cb), self); + gs_plugin_provenance_settings_changed_cb (self->settings, "official-repos", self); + gs_plugin_provenance_settings_changed_cb (self->settings, "required-repos", self); + + /* after the package source is set */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "dummy"); + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "packagekit"); + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "rpm-ostree"); +} + +static void +gs_plugin_provenance_dispose (GObject *object) +{ + GsPluginProvenance *self = GS_PLUGIN_PROVENANCE (object); + + g_clear_pointer (&self->repos, g_hash_table_unref); + g_clear_pointer (&self->provenance_wildcards, g_ptr_array_unref); + g_clear_pointer (&self->compulsory_wildcards, g_ptr_array_unref); + g_clear_object (&self->settings); + + G_OBJECT_CLASS (gs_plugin_provenance_parent_class)->dispose (object); +} + +static gboolean +gs_plugin_provenance_find_repo_flags (GHashTable *repos, + GPtrArray *provenance_wildcards, + GPtrArray *compulsory_wildcards, + const gchar *repo, + guint *out_flags) +{ + if (repo == NULL || *repo == '\0') + return FALSE; + *out_flags = GPOINTER_TO_UINT (g_hash_table_lookup (repos, repo)); + if (provenance_wildcards != NULL && + gs_utils_strv_fnmatch ((gchar **) provenance_wildcards->pdata, repo)) + *out_flags |= GS_APP_QUIRK_PROVENANCE; + if (compulsory_wildcards != NULL && + gs_utils_strv_fnmatch ((gchar **) compulsory_wildcards->pdata, repo)) + *out_flags |= GS_APP_QUIRK_COMPULSORY; + return *out_flags != 0; +} + +static gboolean +refine_app (GsPlugin *plugin, + GsApp *app, + GsPluginRefineFlags flags, + GHashTable *repos, + GPtrArray *provenance_wildcards, + GPtrArray *compulsory_wildcards, + GCancellable *cancellable, + GError **error) +{ + const gchar *origin; + guint quirks; + + /* not required */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0) + return TRUE; + if (gs_app_has_quirk (app, GS_APP_QUIRK_PROVENANCE)) + return TRUE; + + /* Software sources/repositories are represented as #GsApps too. Add the + * provenance quirk to the system-configured repositories (but not + * user-configured ones). */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) { + if (gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, gs_app_get_id (app), &quirks) && + gs_app_get_scope (app) != AS_COMPONENT_SCOPE_USER) + gs_plugin_provenance_add_quirks (app, quirks); + return TRUE; + } + + /* simple case */ + origin = gs_app_get_origin (app); + if (gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, origin, &quirks)) { + gs_plugin_provenance_add_quirks (app, quirks); + return TRUE; + } + + /* this only works for packages */ + origin = gs_app_get_source_id_default (app); + if (origin == NULL) + return TRUE; + origin = g_strrstr (origin, ";"); + if (origin == NULL) + return TRUE; + if (g_str_has_prefix (origin + 1, "installed:")) + origin += 10; + if (gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, origin + 1, &quirks)) + gs_plugin_provenance_add_quirks (app, quirks); + + return TRUE; +} + +static void +gs_plugin_provenance_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginProvenance *self = GS_PLUGIN_PROVENANCE (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(GHashTable) repos = NULL; + g_autoptr(GPtrArray) provenance_wildcards = NULL; + g_autoptr(GPtrArray) compulsory_wildcards = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_provenance_refine_async); + + /* nothing to do here */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + repos = g_hash_table_ref (self->repos); + provenance_wildcards = self->provenance_wildcards != NULL ? g_ptr_array_ref (self->provenance_wildcards) : NULL; + compulsory_wildcards = self->compulsory_wildcards != NULL ? g_ptr_array_ref (self->compulsory_wildcards) : NULL; + + /* nothing to search */ + if (g_hash_table_size (repos) == 0 && provenance_wildcards == NULL && compulsory_wildcards == NULL) { + g_task_return_boolean (task, TRUE); + return; + } + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (!refine_app (plugin, app, flags, repos, provenance_wildcards, compulsory_wildcards, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_provenance_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_provenance_class_init (GsPluginProvenanceClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_provenance_dispose; + + plugin_class->refine_async = gs_plugin_provenance_refine_async; + plugin_class->refine_finish = gs_plugin_provenance_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_PROVENANCE; +} diff --git a/plugins/core/gs-plugin-provenance.h b/plugins/core/gs-plugin-provenance.h new file mode 100644 index 0000000..26392b5 --- /dev/null +++ b/plugins/core/gs-plugin-provenance.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_PROVENANCE (gs_plugin_provenance_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginProvenance, gs_plugin_provenance, GS, PLUGIN_PROVENANCE, GsPlugin) + +G_END_DECLS diff --git a/plugins/core/gs-self-test.c b/plugins/core/gs-self-test.c new file mode 100644 index 0000000..b765ffb --- /dev/null +++ b/plugins/core/gs-self-test.c @@ -0,0 +1,277 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Joaquim Rocha + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gnome-software-private.h" + +#include "gs-appstream.h" +#include "gs-test.h" + +const gchar * const allowlist[] = { + "appstream", + "generic-updates", + "icons", + "os-release", + NULL +}; + +static void +gs_plugins_core_search_repo_name_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app_tmp = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* force this app to be installed */ + app_tmp = gs_plugin_loader_app_create (plugin_loader, "*/*/yellow/arachne.desktop/*", NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (app_tmp); + gs_app_set_state (app_tmp, GS_APP_STATE_INSTALLED); + + /* get search result based on addon keyword */ + keywords[0] = "yellow"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_nonnull (list); + + /* make sure there is at least one entry, the parent app */ + g_assert_cmpint (gs_app_list_length (list), >=, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "arachne.desktop"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); +} + +static void +gs_plugins_core_os_release_func (GsPluginLoader *plugin_loader) +{ + gboolean ret; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsApp) app3 = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GError) error = NULL; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* refine system application */ + app = gs_plugin_loader_get_system_app (plugin_loader, NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (app); + plugin_job = gs_plugin_job_refine_new_for_app (app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + + /* make sure there is valid content */ + g_assert_cmpstr (gs_app_get_id (app), ==, "org.fedoraproject.fedora-25"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_OPERATING_SYSTEM); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_name (app), ==, "Fedora"); + g_assert_cmpstr (gs_app_get_version (app), ==, "25"); + g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, + "https://fedoraproject.org/"); + g_assert_cmpstr (gs_app_get_metadata_item (app, "GnomeSoftware::CpeName"), ==, + "cpe:/o:fedoraproject:fedora:25"); + + /* this comes from appstream */ + g_assert_cmpstr (gs_app_get_summary (app), ==, "Fedora Workstation"); + + /* check we can get this by the old name too */ + app3 = gs_plugin_loader_get_system_app (plugin_loader, NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (app3); + g_assert_true (app3 == app); +} + +static void +gs_plugins_core_generic_updates_func (GsPluginLoader *plugin_loader) +{ + gboolean ret; + GsApp *os_update; + GsAppList *related; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsPluginJob) plugin_job2 = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app1 = NULL; + g_autoptr(GsApp) app2 = NULL; + g_autoptr(GsApp) app_wildcard = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) list_wildcard = NULL; + GsAppList *result_list; + GsAppList *result_list_wildcard; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* create a list with generic apps */ + list = gs_app_list_new (); + app1 = gs_app_new ("package1"); + app2 = gs_app_new ("package2"); + gs_app_set_kind (app1, AS_COMPONENT_KIND_GENERIC); + gs_app_set_kind (app2, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app1, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_bundle_kind (app2, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app1, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_scope (app2, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_state (app1, GS_APP_STATE_UPDATABLE); + gs_app_set_state (app2, GS_APP_STATE_UPDATABLE); + gs_app_add_source (app1, "package1"); + gs_app_add_source (app2, "package2"); + gs_app_list_add (list, app1); + gs_app_list_add (list, app2); + + /* refine to make the generic-updates plugin merge them into a single OsUpdate item */ + plugin_job = gs_plugin_job_refine_new (list, GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + + /* make sure there is one entry, the os update */ + result_list = gs_plugin_job_refine_get_result_list (GS_PLUGIN_JOB_REFINE (plugin_job)); + g_assert_cmpint (gs_app_list_length (result_list), ==, 1); + os_update = gs_app_list_index (result_list, 0); + + /* make sure the os update is valid */ + g_assert_cmpstr (gs_app_get_id (os_update), ==, "org.gnome.Software.OsUpdate"); + g_assert_cmpint (gs_app_get_kind (os_update), ==, AS_COMPONENT_KIND_GENERIC); + g_assert_cmpint (gs_app_get_special_kind (os_update), ==, GS_APP_SPECIAL_KIND_OS_UPDATE); + g_assert_true (gs_app_has_quirk (os_update, GS_APP_QUIRK_IS_PROXY)); + + /* must have two related apps, the ones we added earlier */ + related = gs_app_get_related (os_update); + g_assert_cmpint (gs_app_list_length (related), ==, 2); + + /* another test to make sure that we don't get an OsUpdate item created for wildcard apps */ + list_wildcard = gs_app_list_new (); + app_wildcard = gs_app_new ("nosuchapp.desktop"); + gs_app_add_quirk (app_wildcard, GS_APP_QUIRK_IS_WILDCARD); + gs_app_set_kind (app_wildcard, AS_COMPONENT_KIND_GENERIC); + gs_app_list_add (list_wildcard, app_wildcard); + plugin_job2 = gs_plugin_job_refine_new (list_wildcard, GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job2, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + result_list_wildcard = gs_plugin_job_refine_get_result_list (GS_PLUGIN_JOB_REFINE (plugin_job2)); + + /* no OsUpdate item created */ + for (guint i = 0; i < gs_app_list_length (result_list_wildcard); i++) { + GsApp *app_tmp = gs_app_list_index (result_list_wildcard, i); + g_assert_cmpint (gs_app_get_kind (app_tmp), !=, AS_COMPONENT_KIND_GENERIC); + g_assert_cmpint (gs_app_get_special_kind (app_tmp), !=, GS_APP_SPECIAL_KIND_OS_UPDATE); + g_assert_false (gs_app_has_quirk (app_tmp, GS_APP_QUIRK_IS_PROXY)); + } +} + +int +main (int argc, char **argv) +{ + g_autofree gchar *tmp_root = NULL; + gboolean ret; + int retval; + g_autofree gchar *os_release_filename = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + const gchar *xml; + + /* While we use %G_TEST_OPTION_ISOLATE_DIRS to create temporary directories + * for each of the tests, we want to use the system MIME registry, assuming + * that it exists and correctly has shared-mime-info installed. */ + g_content_type_set_mime_dirs (NULL); + + /* Similarly, add the system-wide icon theme path before it’s + * overwritten by %G_TEST_OPTION_ISOLATE_DIRS. */ + gs_test_expose_icon_theme_paths (); + + gs_test_init (&argc, &argv); + + /* Use a common cache directory for all tests, since the appstream + * plugin uses it and cannot be reinitialised for each test. */ + tmp_root = g_dir_make_tmp ("gnome-software-core-test-XXXXXX", NULL); + g_assert_nonnull (tmp_root); + g_setenv ("GS_SELF_TEST_CACHEDIR", tmp_root, TRUE); + + os_release_filename = gs_test_get_filename (TESTDATADIR, "os-release"); + g_assert_nonnull (os_release_filename); + g_setenv ("GS_SELF_TEST_OS_RELEASE_FILENAME", os_release_filename, TRUE); + + /* fake some data */ + xml = "\n" + "\n" + " \n" + " arachne.desktop\n" + " test\n" + " Test\n" + " system-file-manager\n" + " arachne\n" + " \n" + " \n" + " org.fedoraproject.fedora-25\n" + " Fedora\n" + " Fedora Workstation\n" + " fedora-release\n" + " \n" + " \n" + " user\n" + " \n" + "\n"; + g_setenv ("GS_SELF_TEST_APPSTREAM_XML", xml, TRUE); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/core/search-repo-name", + plugin_loader, + (GTestDataFunc) gs_plugins_core_search_repo_name_func); + g_test_add_data_func ("/gnome-software/plugins/core/os-release", + plugin_loader, + (GTestDataFunc) gs_plugins_core_os_release_func); + g_test_add_data_func ("/gnome-software/plugins/core/generic-updates", + plugin_loader, + (GTestDataFunc) gs_plugins_core_generic_updates_func); + retval = g_test_run (); + + /* Clean up. */ + gs_utils_rmtree (tmp_root, NULL); + + return retval; +} diff --git a/plugins/core/meson.build b/plugins/core/meson.build new file mode 100644 index 0000000..9b9962d --- /dev/null +++ b/plugins/core/meson.build @@ -0,0 +1,92 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginCore"'] + +shared_module( + 'gs_plugin_generic-updates', + sources : 'gs-plugin-generic-updates.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +shared_module( + 'gs_plugin_provenance', + sources : 'gs-plugin-provenance.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +shared_module( + 'gs_plugin_provenance-license', + sources : 'gs-plugin-provenance-license.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + + +shared_module( + 'gs_plugin_icons', + sources : 'gs-plugin-icons.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +shared_module( + 'gs_plugin_appstream', + sources : [ + 'gs-plugin-appstream.c' + ], + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : [ + plugin_libs, + libxmlb, + ], +) + +shared_module( + 'gs_plugin_hardcoded-blocklist', + sources : 'gs-plugin-hardcoded-blocklist.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +shared_module( + 'gs_plugin_os-release', + sources : 'gs-plugin-os-release.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), 'tests') + '"'] + e = executable( + 'gs-self-test-core', + compiled_schemas, + sources : [ + 'gs-self-test.c', + ], + dependencies : [ + plugin_libs, + libxmlb, + ], + c_args : cargs, + ) + test('gs-self-test-core', e, suite: ['plugins', 'core'], env: test_env) +endif diff --git a/plugins/core/tests/os-release b/plugins/core/tests/os-release new file mode 120000 index 0000000..1efe264 --- /dev/null +++ b/plugins/core/tests/os-release @@ -0,0 +1 @@ +../../../data/tests/os-release \ No newline at end of file diff --git a/plugins/dkms/gs-dkms-helper.c b/plugins/dkms/gs-dkms-helper.c new file mode 100644 index 0000000..f84ffaa --- /dev/null +++ b/plugins/dkms/gs-dkms-helper.c @@ -0,0 +1,291 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "gs-dkms-private.h" + +static int +gs_dkms_helper_check_result (const gchar *val_stdout, + GsDkmsKeyKind key_kind, + gboolean with_print) +{ + g_autofree gchar *not_found_output = NULL; + g_autofree gchar *not_enrolled_output = NULL; + g_autofree gchar *pending_output = NULL; + g_autofree gchar *enrolled_output = NULL; + g_autofree gchar *dkms_key_filename = NULL; + const gchar *key_filename; + + g_assert (val_stdout != NULL); + + if (key_kind == GS_DKMS_KEY_KIND_AKMODS) + key_filename = GS_AKMODS_KEY_FILENAME; + else if (key_kind == GS_DKMS_KEY_KIND_DKMS) + key_filename = dkms_key_filename = gs_dkms_get_dkms_key_filename (); + else + g_assert_not_reached (); + + /* FIXME: use the return code instead of text parsing once the https://github.com/lcp/mokutil/issues/88 is addressed */ + not_found_output = g_strconcat (key_filename, " not found\n", NULL); + not_enrolled_output = g_strconcat (key_filename, " is not enrolled\n", NULL); + pending_output = g_strconcat (key_filename, " is already in the enrollment request\n", NULL); + enrolled_output = g_strconcat (key_filename, " is already enrolled\n", NULL); + + if (g_ascii_strncasecmp (val_stdout, not_found_output, strlen (not_found_output)) == 0) { + return GS_DKMS_STATE_NOT_FOUND; + } else if (g_ascii_strncasecmp (val_stdout, not_enrolled_output, strlen (not_enrolled_output)) == 0) { + return GS_DKMS_STATE_NOT_ENROLLED; + } else if (g_ascii_strncasecmp (val_stdout, pending_output, strlen (pending_output)) == 0) { + return GS_DKMS_STATE_PENDING; + } else if (g_ascii_strncasecmp (val_stdout, enrolled_output, strlen (enrolled_output)) == 0) { + return GS_DKMS_STATE_ENROLLED; + } else if (with_print) { + g_printerr ("Unexpected output '%s'\n", val_stdout); + } + + return GS_DKMS_STATE_ERROR; +} + +static int +gs_dkms_helper_test (GsDkmsKeyKind key_kind, + gboolean with_print) +{ + const gchar *args[] = { + "mokutil", + "--test-key", + NULL, /* key filename */ + NULL + }; + g_autofree gchar *val_stdout = NULL; + g_autofree gchar *val_stderr = NULL; + g_autofree gchar *dkms_key_filename = NULL; + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GError) local_error = NULL; + + if (key_kind == GS_DKMS_KEY_KIND_AKMODS) { + if (!g_file_test (GS_AKMODS_KEY_PATH, G_FILE_TEST_IS_DIR)) { + if (with_print) + g_printerr ("Akmods key directory not found.\n"); + return GS_DKMS_STATE_ERROR; + } + args[2] = GS_AKMODS_KEY_FILENAME; + } else if (key_kind == GS_DKMS_KEY_KIND_DKMS) { + g_autofree gchar *dkms_key_path = gs_dkms_get_dkms_key_path (); + if (!g_file_test (dkms_key_path, G_FILE_TEST_IS_DIR)) { + if (with_print) + g_printerr ("DKMS key directory not found.\n"); + return GS_DKMS_STATE_ERROR; + } + dkms_key_filename = gs_dkms_get_dkms_key_filename (); + args[2] = dkms_key_filename; + } else { + g_assert_not_reached (); + } + + subprocess = g_subprocess_newv ((const gchar * const *) args, + G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, + &local_error); + if (subprocess == NULL) { + if (with_print) + g_printerr ("Failed to call 'mokutil --test-key': %s\n", local_error->message); + return GS_DKMS_STATE_ERROR; + } + + if (!g_subprocess_communicate_utf8 (subprocess, NULL, NULL, &val_stdout, &val_stderr, &local_error) || + !g_subprocess_wait_check (subprocess, NULL, &local_error)) { + if ((val_stdout == NULL || *val_stdout == '\0') && val_stderr != NULL && *val_stderr != '\0') { + /* FIXME: use the return code instead of text parsing once the https://github.com/lcp/mokutil/issues/88 is addressed */ + g_autofree gchar *not_found_error = g_strconcat ("Failed to open ", args[2], "\n", NULL); + if (g_ascii_strncasecmp (val_stderr, not_found_error, strlen (not_found_error)) == 0) + return GS_DKMS_STATE_NOT_FOUND; + if (with_print) + g_printerr ("Failed to call 'mokutil --test-key': %s\n", val_stderr); + return GS_DKMS_STATE_ERROR; + } else if (val_stdout != NULL && g_error_matches (local_error, G_SPAWN_EXIT_ERROR, 1)) { + /* it can mean: "pending to be enrolled" or "already enrolled" */ + return gs_dkms_helper_check_result (val_stdout, key_kind, with_print); + } else { + if (with_print) { + g_printerr ("Failed to call 'mokutil --test-key': %s%s%s%s%s\n", local_error->message, + val_stdout != NULL && *val_stdout != '\0' ? "\nstdout: " : "", + val_stdout != NULL && *val_stdout != '\0' ? val_stdout : "", + val_stderr != NULL && *val_stderr != '\0' ? "\nstderr: " : "", + val_stderr != NULL && *val_stderr != '\0' ? val_stderr : ""); + } + return GS_DKMS_STATE_ERROR; + } + } else { + if (val_stderr != NULL && *val_stderr != '\0') { + if (with_print) + g_printerr ("Something failed while calling 'mokutil --test-key': %s\n", val_stderr); + return GS_DKMS_STATE_ERROR; + } + } + + return gs_dkms_helper_check_result (val_stdout, key_kind, with_print); +} + +static int +gs_dkms_helper_generate (GsDkmsKeyKind key_kind) +{ + const gchar *args[] = { + "kmodgenca", + "-a", + NULL + }; + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GError) local_error = NULL; + g_autofree gchar *val_stdout = NULL; + g_autofree gchar *val_stderr = NULL; + + if (key_kind != GS_DKMS_KEY_KIND_AKMODS) + return GS_DKMS_STATE_NOT_FOUND; + + subprocess = g_subprocess_newv ((const gchar * const *) args, + G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, + &local_error); + if (subprocess == NULL) { + g_printerr ("Failed to call 'kmodgenca': %s\n", local_error->message); + return GS_DKMS_STATE_ERROR; + } + + if (!g_subprocess_communicate_utf8 (subprocess, NULL, NULL, &val_stdout, &val_stderr, &local_error) || + !g_subprocess_wait_check (subprocess, NULL, &local_error)) { + if ((val_stdout == NULL || *val_stdout == '\0') && val_stderr != NULL && *val_stderr != '\0') { + g_printerr ("Failed to call 'kmodgenca': %s\n", val_stderr); + } else { + g_printerr ("Failed to call 'kmodgenca': %s%s%s%s%s\n", local_error->message, + val_stdout != NULL && *val_stdout != '\0' ? "\nstdout: " : "", + val_stdout != NULL && *val_stdout != '\0' ? val_stdout : "", + val_stderr != NULL && *val_stderr != '\0' ? "\nstderr: " : "", + val_stderr != NULL && *val_stderr != '\0' ? val_stderr : ""); + } + return GS_DKMS_STATE_ERROR; + } + /* stderr contains keygen random data, thus do not treat it as "something failed" */ + + return GS_DKMS_STATE_NOT_ENROLLED; +} + +static int +gs_dkms_helper_import (GsDkmsKeyKind key_kind) +{ + const gchar *args[] = { + "mokutil", + "--import", + NULL, /* key filename */ + NULL + }; + + g_autofree gchar *val_stdout = NULL; + g_autofree gchar *val_stderr = NULL; + g_autofree gchar *dkms_key_filename = NULL; + g_autoptr(GString) password = g_string_new (NULL); + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GError) local_error = NULL; + int chr; + + if (key_kind == GS_DKMS_KEY_KIND_AKMODS) + args[2] = GS_AKMODS_KEY_FILENAME; + else if (key_kind == GS_DKMS_KEY_KIND_DKMS) + args[2] = dkms_key_filename = gs_dkms_get_dkms_key_filename (); + else + g_assert_not_reached (); + + /* the password comes on stdin */ + while ((chr = getchar ()) != EOF) { + g_string_append_c (password, chr); + } + + if (password->len == 0) { + g_printerr ("Password cannot be empty.\n"); + return GS_DKMS_STATE_ERROR; + } + + subprocess = g_subprocess_newv ((const gchar * const *) args, + G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE, + &local_error); + if (subprocess == NULL) { + g_printerr ("Failed to call 'mokutil --import': %s\n", local_error->message); + return GS_DKMS_STATE_ERROR; + } + + /* password is entered twice, each ended by a new line, thus construct the stdin that way */ + g_string_append_c (password, '\n'); + g_string_append (password, password->str); + + if (!g_subprocess_communicate_utf8 (subprocess, password->str, NULL, &val_stdout, &val_stderr, &local_error) || + !g_subprocess_wait_check (subprocess, NULL, &local_error)) { + if ((val_stdout == NULL || *val_stdout == '\0') && val_stderr != NULL && *val_stderr != '\0') { + g_printerr ("Failed to call 'mokutil --import': %s\n", val_stderr); + } else { + g_printerr ("Failed to call 'mokutil --import': %s%s%s%s%s\n", local_error->message, + val_stdout != NULL && *val_stdout != '\0' ? "\nstdout: " : "", + val_stdout != NULL && *val_stdout != '\0' ? val_stdout : "", + val_stderr != NULL && *val_stderr != '\0' ? "\nstderr: " : "", + val_stderr != NULL && *val_stderr != '\0' ? val_stderr : ""); + } + return GS_DKMS_STATE_ERROR; + } else { + if (val_stderr != NULL && *val_stderr != '\0') { + g_printerr ("Something failed while calling 'mokutil --import': %s\n", val_stderr); + return GS_DKMS_STATE_ERROR; + } + } + + return GS_DKMS_STATE_PENDING; +} + +static int +gs_dkms_helper_enroll (GsDkmsKeyKind key_kind) +{ + GsDkmsState state = gs_dkms_helper_test (key_kind, FALSE); + if (state == GS_DKMS_STATE_ERROR) + return gs_dkms_helper_test (key_kind, TRUE); + if (state == GS_DKMS_STATE_ENROLLED || state == GS_DKMS_STATE_PENDING) + return state; + if (state == GS_DKMS_STATE_NOT_FOUND) + state = gs_dkms_helper_generate (key_kind); + if (state == GS_DKMS_STATE_NOT_ENROLLED) + state = gs_dkms_helper_import (key_kind); + return state; +} + +int +main (int argc, + const char *argv[]) +{ + setlocale (LC_ALL, ""); + + if (argc != 2 || + g_strcmp0 (argv[1], "--help") == 0) { + g_printerr ("Requires one argument, --test-akmods, --test-dkms, --enroll-akmods or --enroll-dkms\n"); + return GS_DKMS_STATE_ERROR; + } + + if (g_strcmp0 (argv[1], "--test-akmods") == 0) + return gs_dkms_helper_test (GS_DKMS_KEY_KIND_AKMODS, TRUE); + + if (g_strcmp0 (argv[1], "--test-dkms") == 0) + return gs_dkms_helper_test (GS_DKMS_KEY_KIND_DKMS, TRUE); + + if (g_strcmp0 (argv[1], "--enroll-akmods") == 0) + return gs_dkms_helper_enroll (GS_DKMS_KEY_KIND_AKMODS); + + if (g_strcmp0 (argv[1], "--enroll-dkms") == 0) + return gs_dkms_helper_enroll (GS_DKMS_KEY_KIND_DKMS); + + g_printerr ("Unknown argument '%s'\n", argv[1]); + return GS_DKMS_STATE_ERROR; +} diff --git a/plugins/dkms/gs-plugin-dkms.c b/plugins/dkms/gs-plugin-dkms.c new file mode 100644 index 0000000..eb423e0 --- /dev/null +++ b/plugins/dkms/gs-plugin-dkms.c @@ -0,0 +1,351 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + * SECTION: + * Helps to manage DKMS and akmods key + * + * The DKMS and akmods key needs to be installed in the MOK, thus any drivers using them + * can be properly signed and used by the kernel when the Secure Boot is enabled. + * + * This plugin code is not enough, there are also some GUI changes needed, which + * cannot be done on the plugin side, thus the overall code is split into the several + * parts. The plugin goes into the action only when needed, which means it does + * nothing when the Secure Boot is not enabled on the machine. Then there's checked + * whether the key is available and whether it's enrolled in the MOK. That's + * done only if there's found an installed application, which requires the key. + * All such apps are marked with a helper flag that they need special attention during + * the refine, which the GUI part recognizes and modifies the GUI accordingly. + * There are two metainfo keys considered, one is "GnomeSoftware:requires-dkms-key", + * to operate with the DKMS key and the other is "GnomeSoftware:requires-akmods-key", + * to operate with the akmods key. One app should not have set both keys. + * + * It follows the procedure of installing the akmods key as described here: + * https://src.fedoraproject.org/rpms/akmods/blob/f40/f/README.secureboot + * only by simulating user input with a GUI front end, not on the command line. + */ +#include "config.h" + +#include +#include + +#include "gs-dkms-private.h" +#include "gs-worker-thread.h" + +#include "gs-plugin-dkms.h" + +struct _GsPluginDkms +{ + GsPlugin parent; + + gboolean did_notify; +}; + +G_DEFINE_TYPE (GsPluginDkms, gs_plugin_dkms, GS_TYPE_PLUGIN) + +static void +gs_dkms_got_secureboot_state_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + GsSecurebootState sb_state; + + sb_state = gs_dkms_get_secureboot_state_finish (result, &local_error); + if (sb_state == GS_SECUREBOOT_STATE_DISABLED || + sb_state == GS_SECUREBOOT_STATE_NOT_SUPPORTED) { + g_debug ("Disabling plugin, because Secure Boot is %s", sb_state == GS_SECUREBOOT_STATE_DISABLED ? "disabled" : "not supported"); + gs_plugin_set_enabled (GS_PLUGIN (g_task_get_source_object (task)), FALSE); + } + + if (local_error != NULL) + g_debug ("%s: %s", G_STRFUNC, local_error->message); + + /* do not pass the error to the caller, it's okay when the mokutil cannot be found */ + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_dkms_reload (GsPlugin *plugin) +{ + if (gs_dkms_get_last_secureboot_state () == GS_SECUREBOOT_STATE_UNKNOWN) { + g_autoptr(GTask) task = NULL; + + /* only need the plugin, to disable it when Secure Boot is disabled or not supported */ + task = g_task_new (plugin, NULL, NULL, NULL); + g_task_set_source_tag (task, gs_plugin_dkms_reload); + + /* mokutil was not installed probably; the reload can be called when some + app/package had been installed, thus re-try to check Secure Boot state */ + gs_dkms_get_secureboot_state_async (NULL, gs_dkms_got_secureboot_state_cb, g_steal_pointer (&task)); + } +} + +static void +gs_plugin_dkms_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dkms_setup_async); + + gs_dkms_get_secureboot_state_async (cancellable, gs_dkms_got_secureboot_state_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_dkms_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + GsAppList *list; /* (owned) */ + gboolean requires_akmods_key; + gboolean requires_dkms_key; + GsDkmsState akmods_key_state; + GsDkmsState dkms_key_state; +} GsPluginDkmsRefineData; + +static void +gs_plugin_dkms_refine_data_free (GsPluginDkmsRefineData *data) +{ + g_clear_object (&data->list); + g_free (data); +} + +static void +gs_dkms_complete_refine_task (GTask *in_task) +{ + g_autoptr(GTask) task = in_task; + g_autoptr(GsApp) notify_for_app = NULL; + GsPluginDkms *self = GS_PLUGIN_DKMS (g_task_get_source_object (task)); + GsPluginDkmsRefineData *data = g_task_get_task_data (task); + GsAppList *list = data->list; + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + gboolean check_akmods_key, check_dkms_key; + check_akmods_key = g_strcmp0 (gs_app_get_metadata_item (app, "GnomeSoftware::requires-akmods-key"), "True") == 0; + check_dkms_key = g_strcmp0 (gs_app_get_metadata_item (app, "GnomeSoftware::requires-dkms-key"), "True") == 0; + if (!check_akmods_key && !check_dkms_key) + continue; + if (!gs_app_is_installed (app) && + gs_app_get_state (app) != GS_APP_STATE_PENDING_INSTALL) + continue; + if ((check_akmods_key && data->akmods_key_state == GS_DKMS_STATE_ENROLLED) || + (check_dkms_key && data->dkms_key_state == GS_DKMS_STATE_ENROLLED)) { + gs_app_remove_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + } else { + /* only restart is missing, thus do not bother the user with the MOK password */ + gs_app_set_mok_key_pending (app, + (check_akmods_key && data->akmods_key_state == GS_DKMS_STATE_PENDING) || + (check_dkms_key && data->dkms_key_state == GS_DKMS_STATE_PENDING)); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + gs_app_set_state (app, GS_APP_STATE_PENDING_INSTALL); + + if (notify_for_app == NULL && !self->did_notify) + notify_for_app = g_object_ref (app); + } + } + + if (notify_for_app != NULL) { + GApplication *application; + + self->did_notify = TRUE; + + application = g_application_get_default (); + + if (G_IS_APPLICATION (application)) { + g_autoptr(GNotification) notif = NULL; + g_autofree gchar *summary = NULL; + g_autofree gchar *body = NULL; + + /* Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". + This is the first part of a system notification. */ + summary = g_strdup_printf (_("%s Ready"), gs_app_get_name (notify_for_app)); + /* Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". + This is the second part of a system notification, which looks like: + + NVIDIA Linux Graphics Driver Ready + + The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. + */ + body = g_strdup_printf (_("The %s is ready to be enabled and staged for the next boot."), gs_app_get_name (notify_for_app)); + notif = g_notification_new (summary); + g_notification_set_body (notif, body); + g_notification_set_default_action_and_target (notif, "app.details", "(ss)", + gs_app_get_unique_id (notify_for_app), ""); + g_notification_add_button_with_target (notif, _("Enable"), "app.details", "(ss)", + gs_app_get_unique_id (notify_for_app), ""); + g_application_send_notification (G_APPLICATION (application), "dkms-key-pending", notif); + } + } + + g_task_return_boolean (task, TRUE); +} + +static void +gs_dkms_got_dkms_key_state_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + GsPluginDkmsRefineData *data = g_task_get_task_data (task); + + data->dkms_key_state = gs_dkms_get_key_state_finish (result, &local_error); + if (local_error != NULL || data->dkms_key_state == GS_DKMS_STATE_ERROR) { + g_debug ("%s: Failed to get DKMS key state: %s", G_STRFUNC, local_error != NULL ? local_error->message : "Unknown error"); + + if (!data->requires_akmods_key) { + /* ignore when the DKMS key state cannot be determined and akmods is not needed */ + g_task_return_boolean (task, TRUE); + return; + } + } + + gs_dkms_complete_refine_task (g_steal_pointer (&task)); +} + +static void +gs_dkms_got_akmods_key_state_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + GsPluginDkmsRefineData *data = g_task_get_task_data (task); + + data->akmods_key_state = gs_dkms_get_key_state_finish (result, &local_error); + if (local_error != NULL || data->akmods_key_state == GS_DKMS_STATE_ERROR) { + g_debug ("%s: Failed to get akmods key state: %s", G_STRFUNC, local_error != NULL ? local_error->message : "Unknown error"); + + if (!data->requires_dkms_key) { + /* ignore when the akmods key state cannot be determined and DKMS is not needed */ + g_task_return_boolean (task, TRUE); + return; + } + } + + if (data->requires_dkms_key) { + GCancellable *cancellable = g_task_get_cancellable (task); + gs_dkms_get_key_state_async (GS_DKMS_KEY_KIND_DKMS, cancellable, gs_dkms_got_dkms_key_state_refine_cb, g_steal_pointer (&task)); + } else { + gs_dkms_complete_refine_task (g_steal_pointer (&task)); + } +} + +static void +gs_dkms_got_secureboot_state_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + GsPluginDkmsRefineData *data = g_task_get_task_data (task); + GsSecurebootState sb_state; + + sb_state = gs_dkms_get_secureboot_state_finish (result, NULL); + if (sb_state == GS_SECUREBOOT_STATE_ENABLED) { + GCancellable *cancellable = g_task_get_cancellable (task); + if (data->requires_akmods_key) { + gs_dkms_get_key_state_async (GS_DKMS_KEY_KIND_AKMODS, cancellable, gs_dkms_got_akmods_key_state_refine_cb, g_steal_pointer (&task)); + } else { + g_assert (data->requires_dkms_key); + gs_dkms_get_key_state_async (GS_DKMS_KEY_KIND_DKMS, cancellable, gs_dkms_got_dkms_key_state_refine_cb, g_steal_pointer (&task)); + } + } else { + g_task_return_boolean (task, TRUE); + } +} + +static void +gs_plugin_dkms_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + gboolean requires_akmods_key = FALSE; + gboolean requires_dkms_key = FALSE; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dkms_refine_async); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + gboolean check_akmods_key, check_dkms_key; + check_akmods_key = !requires_akmods_key && + g_strcmp0 (gs_app_get_metadata_item (app, "GnomeSoftware::requires-akmods-key"), "True") == 0; + check_dkms_key = !requires_dkms_key && + g_strcmp0 (gs_app_get_metadata_item (app, "GnomeSoftware::requires-dkms-key"), "True") == 0; + if (!check_akmods_key && !check_dkms_key) + continue; + if (!gs_app_is_installed (app) && + gs_app_get_state (app) != GS_APP_STATE_PENDING_INSTALL) + continue; + requires_akmods_key = requires_akmods_key || check_akmods_key; + requires_dkms_key = requires_dkms_key || check_dkms_key; + } + + if (requires_akmods_key || requires_dkms_key) { + GsPluginDkmsRefineData *data; + data = g_new0 (GsPluginDkmsRefineData, 1); + data->list = g_object_ref (list); + data->requires_akmods_key = requires_akmods_key; + data->requires_dkms_key = requires_dkms_key; + g_task_set_task_data (task, data, (GDestroyNotify) gs_plugin_dkms_refine_data_free); + gs_dkms_get_secureboot_state_async (cancellable, gs_dkms_got_secureboot_state_refine_cb, g_steal_pointer (&task)); + } else { + g_task_return_boolean (task, TRUE); + } +} + +static gboolean +gs_plugin_dkms_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_dkms_init (GsPluginDkms *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "packagekit"); + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "rpm-ostree"); + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "flatpak"); +} + +static void +gs_plugin_dkms_class_init (GsPluginDkmsClass *klass) +{ + GsPluginClass *plugin_class; + + plugin_class = GS_PLUGIN_CLASS (klass); + plugin_class->reload = gs_plugin_dkms_reload; + plugin_class->setup_async = gs_plugin_dkms_setup_async; + plugin_class->setup_finish = gs_plugin_dkms_setup_finish; + plugin_class->refine_async = gs_plugin_dkms_refine_async; + plugin_class->refine_finish = gs_plugin_dkms_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_DKMS; +} diff --git a/plugins/dkms/gs-plugin-dkms.h b/plugins/dkms/gs-plugin-dkms.h new file mode 100644 index 0000000..49a2b08 --- /dev/null +++ b/plugins/dkms/gs-plugin-dkms.h @@ -0,0 +1,20 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_DKMS (gs_plugin_dkms_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginDkms, gs_plugin_dkms, GS, PLUGIN_DKMS, GsPlugin) + +G_END_DECLS diff --git a/plugins/dkms/meson.build b/plugins/dkms/meson.build new file mode 100644 index 0000000..62c696b --- /dev/null +++ b/plugins/dkms/meson.build @@ -0,0 +1,30 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# SPDX-FileCopyrightText: 2024 Red Hat + +shared_module( + 'gs_plugin_dkms', + sources : 'gs-plugin-dkms.c', + install : true, + install_dir: plugin_dir, + c_args : ['-DG_LOG_DOMAIN="GsPluginDkms"'], + dependencies : plugin_libs, +) + +executable( + 'gnome-software-dkms-helper', + sources : [ + 'gs-dkms-helper.c', + '../../lib/gs-dkms-private.c', + ], + dependencies : [ + glib, + gio_unix, + ], + include_directories : [ + include_directories('../..'), + include_directories('../../lib'), + ], + c_args : ['-DG_LOG_DOMAIN="GsDkmsHelper"'], + install : true, + install_dir : get_option('libexecdir'), +) diff --git a/plugins/dpkg/gs-plugin-dpkg.c b/plugins/dpkg/gs-plugin-dpkg.c new file mode 100644 index 0000000..fbcb1e2 --- /dev/null +++ b/plugins/dpkg/gs-plugin-dpkg.c @@ -0,0 +1,207 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2011-2013 Richard Hughes + * Copyright (C) 2024 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include + +#include "gs-plugin-dpkg.h" + +struct _GsPluginDpkg +{ + GsPlugin parent; +}; + +G_DEFINE_TYPE (GsPluginDpkg, gs_plugin_dpkg, GS_TYPE_PLUGIN) + +#define DPKG_DEB_BINARY "/usr/bin/dpkg-deb" + +static void +gs_plugin_dpkg_init (GsPluginDpkg *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + if (!g_file_test (DPKG_DEB_BINARY, G_FILE_TEST_EXISTS)) { + g_debug ("disabling itself as no %s available", DPKG_DEB_BINARY); + gs_plugin_set_enabled (plugin, FALSE); + return; + } + + /* need package name */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "appstream"); +} + +static void get_content_type_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void subprocess_communicate_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_dpkg_file_to_app_async (GsPlugin *plugin, + GFile *file, + GsPluginFileToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = gs_plugin_file_to_app_data_new_task (plugin, file, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dpkg_file_to_app_async); + + /* does this match any of the mimetypes we support */ + gs_utils_get_content_type_async (file, cancellable, get_content_type_cb, g_steal_pointer (&task)); +} + +static void +get_content_type_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GFile *file = G_FILE (source_object); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + g_autoptr(GSubprocess) subprocess = NULL; + g_autofree gchar *content_type = NULL; + const gchar *mimetypes[] = { + "application/vnd.debian.binary-package", + NULL }; + + content_type = gs_utils_get_content_type_finish (file, result, &local_error); + if (content_type == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } else if (!g_strv_contains (mimetypes, content_type)) { + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } + + /* exec sync */ + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE | + G_SUBPROCESS_FLAGS_STDERR_SILENCE, + &local_error, + DPKG_DEB_BINARY, + "--showformat=${Package}\\n" + "${Version}\\n" + "${License}\\n" + "${Installed-Size}\\n" + "${Homepage}\\n" + "${Description}", + "-W", + g_file_peek_path (file), + NULL); + + if (subprocess == NULL) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_subprocess_communicate_async (subprocess, NULL, cancellable, + subprocess_communicate_cb, g_steal_pointer (&task)); +} + +static void +subprocess_communicate_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GSubprocess *subprocess = G_SUBPROCESS (source_object); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + GsPluginFileToAppData *data = g_task_get_task_data (task); + GsPluginDpkg *self = g_task_get_source_object (task); + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GError) local_error = NULL; + g_autoptr(GBytes) stdout_buf = NULL; + const char *output; + g_auto(GStrv) tokens = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GString) str = NULL; + + if (!g_subprocess_communicate_finish (subprocess, result, &stdout_buf, NULL, &local_error)) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* parse output; assume it doesn’t contain any nul bytes */ + output = g_bytes_get_data (stdout_buf, NULL); + tokens = g_strsplit (output, "\n", 0); + if (g_strv_length (tokens) < 6) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "dpkg-deb output format incorrect:\n“%s”", output); + return; + } + + /* create app */ + app = gs_app_new (NULL); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE_LOCAL); + gs_app_add_source (app, tokens[0]); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, tokens[0]); + gs_app_set_version (app, tokens[1]); + gs_app_set_license (app, GS_APP_QUALITY_LOWEST, tokens[2]); + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, 1024 * g_ascii_strtoull (tokens[3], NULL, 10)); + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, tokens[4]); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, tokens[5]); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_local_file (app, data->file); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (GS_PLUGIN (self))); + + /* multiline text */ + str = g_string_new (""); + for (guint i = 6; tokens[i] != NULL; i++) { + if (g_strcmp0 (tokens[i], " .") == 0) { + if (str->len > 0) + g_string_truncate (str, str->len - 1); + g_string_append (str, "\n"); + continue; + } + g_strstrip (tokens[i]); + g_string_append_printf (str, "%s ", tokens[i]); + } + if (str->len > 0) + g_string_truncate (str, str->len - 1); + gs_app_set_description (app, GS_APP_QUALITY_LOWEST, str->str); + + /* success */ + gs_app_list_add (list, app); + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_dpkg_file_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_dpkg_class_init (GsPluginDpkgClass *klass) +{ + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + plugin_class->file_to_app_async = gs_plugin_dpkg_file_to_app_async; + plugin_class->file_to_app_finish = gs_plugin_dpkg_file_to_app_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_DPKG; +} diff --git a/plugins/dpkg/gs-plugin-dpkg.h b/plugins/dpkg/gs-plugin-dpkg.h new file mode 100644 index 0000000..748a983 --- /dev/null +++ b/plugins/dpkg/gs-plugin-dpkg.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_DPKG (gs_plugin_dpkg_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginDpkg, gs_plugin_dpkg, GS, PLUGIN_DPKG, GsPlugin) + +G_END_DECLS diff --git a/plugins/dpkg/gs-self-test.c b/plugins/dpkg/gs-self-test.c new file mode 100644 index 0000000..390c3a1 --- /dev/null +++ b/plugins/dpkg/gs-self-test.c @@ -0,0 +1,85 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gnome-software-private.h" + +#include "gs-test.h" + +static void +gs_plugins_dpkg_func (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsApp) app = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GError) error = NULL; + g_autofree gchar *fn = NULL; + g_autoptr(GFile) file = NULL; + + /* no dpkg, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "dpkg")) { + g_test_skip ("not enabled"); + return; + } + + /* load local file */ + fn = gs_test_get_filename (TESTDATADIR, "chiron-1.1-1.deb"); + g_assert (fn != NULL); + file = g_file_new_for_path (fn); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (app != NULL); + g_assert_cmpstr (gs_app_get_source_default (app), ==, "chiron"); + g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, "http://127.0.0.1/"); + g_assert_cmpstr (gs_app_get_name (app), ==, "chiron"); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.1-1"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "Single line synopsis"); + g_assert_cmpstr (gs_app_get_description (app), ==, + "This is the first paragraph in the example " + "package control file.\nThis is the second paragraph."); + g_assert (gs_app_get_local_file (app) != NULL); +} + +int +main (int argc, char **argv) +{ + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + const gchar * const allowlist[] = { + "dpkg", + NULL + }; + + /* While we use %G_TEST_OPTION_ISOLATE_DIRS to create temporary directories + * for each of the tests, we want to use the system MIME registry, assuming + * that it exists and correctly has shared-mime-info installed. */ + g_content_type_set_mime_dirs (NULL); + + gs_test_init (&argc, &argv); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/dpkg", + plugin_loader, + (GTestDataFunc) gs_plugins_dpkg_func); + + return g_test_run (); +} diff --git a/plugins/dpkg/meson.build b/plugins/dpkg/meson.build new file mode 100644 index 0000000..cf57956 --- /dev/null +++ b/plugins/dpkg/meson.build @@ -0,0 +1,31 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginDpkg"'] + +shared_module( + 'gs_plugin_dpkg', + sources : 'gs-plugin-dpkg.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), 'tests') + '"'] + e = executable( + 'gs-self-test-dpkg', + compiled_schemas, + sources : [ + 'gs-self-test.c' + ], + dependencies : [ + plugin_libs, + ], + c_args : cargs, + ) + test('gs-self-test-dpkg', e, suite: ['plugins', 'dpkg'], env: test_env) +endif diff --git a/plugins/dpkg/tests/build-deb.sh b/plugins/dpkg/tests/build-deb.sh new file mode 100755 index 0000000..cbf50f6 --- /dev/null +++ b/plugins/dpkg/tests/build-deb.sh @@ -0,0 +1 @@ +dpkg-deb --build debian chiron-1.1-1.deb diff --git a/plugins/dpkg/tests/chiron-1.1-1.deb b/plugins/dpkg/tests/chiron-1.1-1.deb new file mode 100644 index 0000000000000000000000000000000000000000..f4f921abdf5419a860666a4db31dff0ab143ef9e GIT binary patch literal 806 zcmY$iNi0gvu;WTeP0CEn(@o0EODw8XP*5;5F*7tZvM@0+P*4COAb^mD1_ov(CJG8b z1O*9PMtTNZ$@zIDMfo{;C5c6P=~aaF8(YFmNZ^w1=3oE;7Us8??`Aa{h_Dx||19#H zb=k#hTt>&(cE32gU`_J(nP*MTNO=ZD+^=)LU78wDrYiEyU)0|3yyqX)&dC{{)OL!x z%6(MTEvl@Ob#m^$v}S_qw6jH)-6^w9Ik`>ow=;T|@VvRmC2;d<>HIH8_5OFo`|Nq= zFehXi_qlDte8n>!98IdTdw>6R0>{apdw!Vyk38qy^rR)(YU;n|pZ5n{ZC_RD8Jaxj z?UB`G_in6PV&az{wDDS~g#7&}*OQ+1l&Zb)-t_lF)YeA_3zHtyzm*XW%+;P&w)*$R z6k(@$HO~CE5ufyZk4!d-eGt5R(mda*8rv7D=G(k|c};fS`+jNNb#K1;*<{6A8kdD# zx>ZuTdgaraPruK7yI0|;-}~{1dxptg>F3Q0;w(e0ubQXq`ndOB$nAN-zYkyMveK*a z%P7_9=>KdKS6uTsSWRsC(jA1_l-d21dfnn8^pk|9x#g$e_W%kdj!E2#&%E zU=#uYp;TZ5N*-X4!1dR>Dk6%3fiY9*o*5H^BBK~EMoaXcE`Ff?pJ9G1gE;pdnOerF z2Mk?OV&}CVoE`A2IobC*AHzt_wI7SXdUXF0$-}jcnj_r}Yt$i3d)VH(got{;U9-?=PO;?^DY&UTj$; zCivHkz2lt0ye_dLJ8v&ORsOR$%4_kYKb3N|6Q7pva{V}U-)fF{(-NydHh!L`8#cdU l?X}+kbgQd(%XtRI?Tifp3=G +Description: Single line synopsis + This is the first + paragraph in the example package + control file. + . + This is the second paragraph. diff --git a/plugins/dpkg/tests/debian/usr/bin/chiron b/plugins/dpkg/tests/debian/usr/bin/chiron new file mode 100644 index 0000000..e69de29 diff --git a/plugins/dummy/gs-plugin-dummy.c b/plugins/dummy/gs-plugin-dummy.c new file mode 100644 index 0000000..48e0666 --- /dev/null +++ b/plugins/dummy/gs-plugin-dummy.c @@ -0,0 +1,1568 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2011-2017 Richard Hughes + * Copyright (C) 2015-2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include + +#include "gs-plugin-dummy.h" + +/* + * SECTION: + * Provides some dummy data that is useful in self test programs. + */ + +struct _GsPluginDummy { + GsPlugin parent; + + guint quirk_id; + guint allow_updates_id; + gboolean allow_updates_inhibit; + GsApp *cached_origin; + GHashTable *installed_apps; /* id:1 */ + GHashTable *available_apps; /* id:1 */ +}; + +G_DEFINE_TYPE (GsPluginDummy, gs_plugin_dummy, GS_TYPE_PLUGIN) + +static gboolean refine_app (GsPluginDummy *self, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error); + +/* just flip-flop this every few seconds */ +static gboolean +gs_plugin_dummy_allow_updates_cb (gpointer user_data) +{ + GsPluginDummy *self = GS_PLUGIN_DUMMY (user_data); + + gs_plugin_set_allow_updates (GS_PLUGIN (self), self->allow_updates_inhibit); + self->allow_updates_inhibit = !self->allow_updates_inhibit; + return G_SOURCE_CONTINUE; +} + +static void +gs_plugin_dummy_init (GsPluginDummy *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + if (g_getenv ("GS_SELF_TEST_DUMMY_ENABLE") == NULL) { + g_debug ("disabling itself as not in self test"); + gs_plugin_set_enabled (plugin, FALSE); + return; + } + + /* need help from appstream */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "os-release"); +} + +static void +gs_plugin_dummy_dispose (GObject *object) +{ + GsPluginDummy *self = GS_PLUGIN_DUMMY (object); + + g_clear_pointer (&self->installed_apps, g_hash_table_unref); + g_clear_pointer (&self->available_apps, g_hash_table_unref); + g_clear_handle_id (&self->quirk_id, g_source_remove); + g_clear_object (&self->cached_origin); + + G_OBJECT_CLASS (gs_plugin_dummy_parent_class)->dispose (object); +} + +static void +gs_plugin_dummy_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_setup_async); + + /* toggle this */ + if (g_getenv ("GS_SELF_TEST_TOGGLE_ALLOW_UPDATES") != NULL) { + self->allow_updates_id = g_timeout_add_seconds (10, + gs_plugin_dummy_allow_updates_cb, plugin); + } + + /* add source */ + self->cached_origin = gs_app_new (gs_plugin_get_name (plugin)); + gs_app_set_kind (self->cached_origin, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_origin_hostname (self->cached_origin, "http://www.bbc.co.uk/"); + gs_app_set_management_plugin (self->cached_origin, plugin); + + /* add the source to the plugin cache which allows us to match the + * unique ID to a GsApp when creating an event */ + gs_plugin_cache_add (plugin, NULL, self->cached_origin); + + /* keep track of what apps are installed */ + self->installed_apps = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + self->available_apps = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + g_hash_table_insert (self->available_apps, + g_strdup ("chiron.desktop"), + GUINT_TO_POINTER (1)); + g_hash_table_insert (self->available_apps, + g_strdup ("zeus.desktop"), + GUINT_TO_POINTER (1)); + g_hash_table_insert (self->available_apps, + g_strdup ("zeus-spell.addon"), + GUINT_TO_POINTER (1)); + g_hash_table_insert (self->available_apps, + g_strdup ("com.hughski.ColorHug2.driver"), + GUINT_TO_POINTER (1)); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_dummy_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app) +{ + if (gs_app_get_id (app) != NULL && + g_str_has_prefix (gs_app_get_id (app), "dummy:")) { + gs_app_set_management_plugin (app, plugin); + return; + } + if (g_strcmp0 (gs_app_get_id (app), "mate-spell.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "chiron.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "zeus.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "com.hughski.ColorHug2.driver") == 0 || + g_strcmp0 (gs_app_get_id (app), "zeus-spell.addon") == 0 || + g_strcmp0 (gs_app_get_source_default (app), "chiron") == 0) + gs_app_set_management_plugin (app, plugin); +} + +typedef struct { + GsApp *app; /* (owned) (nullable) */ + guint percent_complete; +} DelayData; + +static void +delay_data_free (DelayData *data) +{ + g_clear_object (&data->app); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (DelayData, delay_data_free) + +static gboolean delay_timeout_cb (gpointer user_data); + +/* Simulate a download on app, updating its progress one percentage point at a + * time, with an overall interval of @timeout_ms to go from 0% to 100%. The + * download is cancelled within @timeout_ms / 100 if @cancellable is cancelled. */ +static void +gs_plugin_dummy_delay_async (GsPlugin *plugin, + GsApp *app, + guint timeout_ms, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(DelayData) data = NULL; + g_autoptr(GSource) source = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_delay_async); + + data = g_new0 (DelayData, 1); + data->app = (app != NULL) ? g_object_ref (app) : NULL; + data->percent_complete = 0; + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) delay_data_free); + + source = g_timeout_source_new (timeout_ms / 100); + g_task_attach_source (task, source, delay_timeout_cb); +} + +static gboolean +delay_timeout_cb (gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPlugin *plugin = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + DelayData *data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + /* Iterate until 100%. */ + if (data->percent_complete >= 100) { + g_task_return_boolean (task, TRUE); + return G_SOURCE_REMOVE; + } + + /* Has the task been cancelled? */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return G_SOURCE_REMOVE; + } + + /* Update the app’s progress and continue. */ + if (data->app != NULL) + gs_app_set_progress (data->app, data->percent_complete); + gs_plugin_status_update (plugin, data->app, GS_PLUGIN_STATUS_DOWNLOADING); + + data->percent_complete++; + + return G_SOURCE_CONTINUE; +} + +static gboolean +gs_plugin_dummy_delay_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +gs_plugin_dummy_poll_cb (gpointer user_data) +{ + g_autoptr(GsApp) app = NULL; + GsPlugin *plugin = GS_PLUGIN (user_data); + + /* find the app in the per-plugin cache -- this assumes that we can + * calculate the same key as used when calling gs_plugin_cache_add() */ + app = gs_plugin_cache_lookup (plugin, "chiron"); + if (app == NULL) { + g_warning ("app not found in cache!"); + return FALSE; + } + + /* toggle this to animate the hide/show the 3rd party banner */ + if (!gs_app_has_quirk (app, GS_APP_QUIRK_PROVENANCE)) { + g_debug ("about to make app distro-provided"); + gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE); + } else { + g_debug ("about to make app 3rd party"); + gs_app_remove_quirk (app, GS_APP_QUIRK_PROVENANCE); + } + + /* continue polling */ + return TRUE; +} + + +static void +gs_plugin_dummy_url_to_app_async (GsPlugin *plugin, + const gchar *url, + GsPluginUrlToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GsApp) app = NULL; + g_autofree gchar *scheme = NULL; + + task = gs_plugin_url_to_app_data_new_task (plugin, url, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_url_to_app_async); + + /* it's us */ + scheme = gs_utils_get_url_scheme (url); + if (g_strcmp0 (scheme, "dummy") == 0) { + g_autofree gchar *path = NULL; + /* create app */ + path = gs_utils_get_url_path (url); + app = gs_app_new (path); + gs_app_set_management_plugin (app, plugin); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_list_add (list, app); + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_dummy_url_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static gboolean timeout_cb (gpointer user_data); + +/* Simulate a cancellable delay */ +static void +gs_plugin_dummy_timeout_async (GsPluginDummy *self, + guint timeout_ms, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GSource) source = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_timeout_async); + + source = g_timeout_source_new (timeout_ms); + + if (cancellable != NULL) { + g_autoptr(GSource) cancellable_source = NULL; + + cancellable_source = g_cancellable_source_new (cancellable); + g_source_set_dummy_callback (cancellable_source); + g_source_add_child_source (source, cancellable_source); + } + + g_task_attach_source (task, source, timeout_cb); +} + +static gboolean +timeout_cb (gpointer user_data) +{ + GTask *task = G_TASK (user_data); + + if (!g_task_return_error_if_cancelled (task)) + g_task_return_boolean (task, TRUE); + + return G_SOURCE_REMOVE; +} + +static gboolean +gs_plugin_dummy_timeout_finish (GsPluginDummy *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + /* Input data. */ + guint n_apps; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ + + /* For progress reporting. */ + guint n_uninstalls_started; +} UninstallAppsData; + +static void +uninstall_apps_data_free (UninstallAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UninstallAppsData, uninstall_apps_data_free) + +typedef struct { + GTask *task; /* (owned) */ + GsApp *app; /* (owned) */ +} UninstallSingleAppData; + +static void +uninstall_single_app_data_free (UninstallSingleAppData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->task); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UninstallSingleAppData, uninstall_single_app_data_free) + +static void uninstall_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_uninstall_apps_op (GTask *task, + GError *error); + +static void +gs_plugin_dummy_uninstall_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin); + g_autoptr(GTask) task = NULL; + UninstallAppsData *data; + g_autoptr(UninstallAppsData) data_owned = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_uninstall_apps_async); + + data = data_owned = g_new0 (UninstallAppsData, 1); + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->n_apps = gs_app_list_length (apps); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) uninstall_apps_data_free); + + /* Start a load of operations in parallel to uninstall the apps. + * + * When all uninstalls are finished for all apps, finish_uninstall_apps_op() + * will return success/error for the overall #GTask. */ + data->n_pending_ops = 1; + data->n_uninstalls_started = 0; + + for (guint i = 0; i < data->n_apps; i++) { + GsApp *app = gs_app_list_index (apps, i); + g_autoptr(UninstallSingleAppData) app_data = NULL; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + if (!g_str_equal (gs_app_get_id (app), "chiron.desktop")) + continue; + + app_data = g_new0 (UninstallSingleAppData, 1); + app_data->task = g_object_ref (task); + app_data->app = g_object_ref (app); + + gs_app_set_state (app, GS_APP_STATE_REMOVING); + + data->n_pending_ops++; + data->n_uninstalls_started++; + gs_plugin_dummy_delay_async (GS_PLUGIN (self), + app, + 500 /* ms */, + cancellable, + uninstall_cb, + g_steal_pointer (&app_data)); + } + + finish_uninstall_apps_op (task, NULL); +} + +static void +uninstall_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + g_autoptr(UninstallSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + GsPluginDummy *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + UninstallAppsData * data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + if (data->progress_callback != NULL) { + data->progress_callback (plugin, + (data->n_uninstalls_started - data->n_pending_ops + 1) * 100 / data->n_uninstalls_started, + data->progress_user_data); + } + + if (!gs_plugin_dummy_delay_finish (plugin, result, &local_error)) { + gs_app_set_state_recover (app_data->app); + finish_uninstall_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + /* keep track */ + g_hash_table_remove (self->installed_apps, gs_app_get_id (app_data->app)); + g_hash_table_insert (self->available_apps, + g_strdup (gs_app_get_id (app_data->app)), + GUINT_TO_POINTER (1)); + + /* Refine the app so it has the right post-uninstall state. */ + gs_app_set_state (app_data->app, GS_APP_STATE_UNKNOWN); + + if (!refine_app (self, app_data->app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION, + cancellable, &local_error)) { + g_debug ("Error refining app ‘%s’ after uninstall: %s", + gs_app_get_id (app_data->app), local_error->message); + g_clear_error (&local_error); + } + + finish_uninstall_apps_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_uninstall_apps_op (GTask *task, + GError *error) +{ + UninstallAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while uninstalling apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_dummy_uninstall_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + /* Input data. */ + guint n_apps; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ + + /* For progress reporting. */ + guint n_installs_started; +} InstallAppsData; + +static void +install_apps_data_free (InstallAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallAppsData, install_apps_data_free) + +typedef struct { + GTask *task; /* (owned) */ + GsApp *app; /* (owned) */ +} InstallSingleAppData; + +static void +install_single_app_data_free (InstallSingleAppData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->task); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallSingleAppData, install_single_app_data_free) + +static void install_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_install_apps_op (GTask *task, + GError *error); + +static void +gs_plugin_dummy_install_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin); + g_autoptr(GTask) task = NULL; + InstallAppsData *data; + g_autoptr(InstallAppsData) data_owned = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_install_apps_async); + + data = data_owned = g_new0 (InstallAppsData, 1); + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->n_apps = gs_app_list_length (apps); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) install_apps_data_free); + + /* Start a load of operations in parallel to install the apps. + * + * When all installs are finished for all apps, finish_install_apps_op() + * will return success/error for the overall #GTask. */ + data->n_pending_ops = 1; + data->n_installs_started = 0; + + for (guint i = 0; i < data->n_apps; i++) { + GsApp *app = gs_app_list_index (apps, i); + g_autoptr(InstallSingleAppData) app_data = NULL; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + if (!g_str_equal (gs_app_get_id (app), "chiron.desktop") && + !g_str_equal (gs_app_get_id (app), "zeus.desktop")) + continue; + + app_data = g_new0 (InstallSingleAppData, 1); + app_data->task = g_object_ref (task); + app_data->app = g_object_ref (app); + + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + + data->n_pending_ops++; + data->n_installs_started++; + gs_plugin_dummy_delay_async (GS_PLUGIN (self), + app, + 500 /* ms */, + cancellable, + install_cb, + g_steal_pointer (&app_data)); + } + + finish_install_apps_op (task, NULL); +} + +static void +install_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + g_autoptr(InstallSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + GsPluginDummy *self = g_task_get_source_object (task); + InstallAppsData * data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + if (data->progress_callback != NULL) { + data->progress_callback (plugin, + (data->n_installs_started - data->n_pending_ops + 1) * 100 / data->n_installs_started, + data->progress_user_data); + } + + if (!gs_plugin_dummy_delay_finish (plugin, result, &local_error)) { + gs_app_set_state_recover (app_data->app); + finish_install_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + gs_app_set_state (app_data->app, GS_APP_STATE_INSTALLED); + + /* keep track */ + g_hash_table_insert (self->installed_apps, + g_strdup (gs_app_get_id (app_data->app)), + GUINT_TO_POINTER (1)); + g_hash_table_remove (self->available_apps, gs_app_get_id (app_data->app)); + + finish_install_apps_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_install_apps_op (GTask *task, + GError *error) +{ + InstallAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while installing apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_dummy_install_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +refine_app (GsPluginDummy *self, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error) +{ + /* make the local system EOL */ + if (gs_app_get_metadata_item (app, "GnomeSoftware::CpeName") != NULL) + gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + + /* state */ + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) { + if (g_hash_table_lookup (self->installed_apps, + gs_app_get_id (app)) != NULL) + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + if (g_hash_table_lookup (self->available_apps, + gs_app_get_id (app)) != NULL) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + } + + /* kind */ + if (g_strcmp0 (gs_app_get_id (app), "chiron.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "mate-spell.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "com.hughski.ColorHug2.driver") == 0 || + g_strcmp0 (gs_app_get_id (app), "zeus.desktop") == 0) { + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN) + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + } + + /* license */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) { + if (g_strcmp0 (gs_app_get_id (app), "chiron.desktop") == 0 || + g_strcmp0 (gs_app_get_id (app), "zeus.desktop") == 0) + gs_app_set_license (app, GS_APP_QUALITY_HIGHEST, "GPL-2.0-or-later"); + } + + /* homepage */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL) { + if (g_strcmp0 (gs_app_get_id (app), "chiron.desktop") == 0) { + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, + "http://www.test.org/"); + } + } + + /* origin */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN) { + if (g_strcmp0 (gs_app_get_id (app), "zeus-spell.addon") == 0) + gs_app_set_origin (app, "london-east"); + } + + /* default */ + if (g_strcmp0 (gs_app_get_id (app), "chiron.desktop") == 0) { + if (gs_app_get_name (app) == NULL) + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "tmp"); + if (gs_app_get_summary (app) == NULL) + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "tmp"); + if (!gs_app_has_icons (app)) { + g_autoptr(GIcon) ic = g_themed_icon_new ("org.gnome.Software.Dummy"); + gs_app_add_icon (app, ic); + } + } + + /* description */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION) { + if (g_strcmp0 (gs_app_get_id (app), "chiron.desktop") == 0) { + gs_app_set_description (app, GS_APP_QUALITY_NORMAL, + "long description!"); + } + } + + /* add fake review */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS) { + g_autoptr(AsReview) review1 = NULL; + g_autoptr(AsReview) review2 = NULL; + g_autoptr(GDateTime) dt = NULL; + + dt = g_date_time_new_now_utc (); + + /* set first review */ + review1 = as_review_new (); + as_review_set_rating (review1, 50); + as_review_set_reviewer_name (review1, "Angela Avery"); + as_review_set_summary (review1, "Steep learning curve, but worth it"); + as_review_set_description (review1, "Best overall 3D application I've ever used overall 3D application I've ever used. Best overall 3D application I've ever used overall 3D application I've ever used. Best overall 3D application I've ever used overall 3D application I've ever used. Best overall 3D application I've ever used overall 3D application I've ever used."); + as_review_set_version (review1, "3.16.4"); + as_review_set_date (review1, dt); + gs_app_add_review (app, review1); + + /* set self review */ + review2 = as_review_new (); + as_review_set_rating (review2, 100); + as_review_set_reviewer_name (review2, "Just Myself"); + as_review_set_summary (review2, "I like this application"); + as_review_set_description (review2, "I'm not very wordy myself."); + as_review_set_version (review2, "3.16.3"); + as_review_set_date (review2, dt); + as_review_set_flags (review2, AS_REVIEW_FLAG_SELF); + gs_app_add_review (app, review2); + } + + /* add fake ratings */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS) { + g_autoptr(GArray) ratings = NULL; + const gint data[] = { 0, 10, 20, 30, 15, 2 }; + ratings = g_array_sized_new (FALSE, FALSE, sizeof (gint), 6); + g_array_append_vals (ratings, data, 6); + gs_app_set_review_ratings (app, ratings); + } + + /* add a rating */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING) { + gs_app_set_rating (app, 66); + } + + return TRUE; +} + +static void +gs_plugin_dummy_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_refine_async); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + if (!refine_app (self, app, flags, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_dummy_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void list_apps_timeout_cb (GObject *object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_dummy_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + GDateTime *released_since = NULL; + GsAppQueryTristate is_curated = GS_APP_QUERY_TRISTATE_UNSET; + guint max_results = 0; + GsCategory *category = NULL; + GsAppQueryTristate is_installed = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + const gchar * const *keywords = NULL; + GsApp *alternate_of = NULL; + + task = gs_plugin_list_apps_data_new_task (plugin, query, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_list_apps_async); + + if (query != NULL) { + released_since = gs_app_query_get_released_since (query); + is_curated = gs_app_query_get_is_curated (query); + max_results = gs_app_query_get_max_results (query); + category = gs_app_query_get_category (query); + is_installed = gs_app_query_get_is_installed (query); + keywords = gs_app_query_get_keywords (query); + alternate_of = gs_app_query_get_alternate_of (query); + is_for_update = gs_app_query_get_is_for_update (query); + } + + /* Currently only support a subset of query properties, and only one set at once. + * Also don’t currently support GS_APP_QUERY_TRISTATE_FALSE. */ + if ((released_since == NULL && + is_curated == GS_APP_QUERY_TRISTATE_UNSET && + category == NULL && + is_installed == GS_APP_QUERY_TRISTATE_UNSET && + keywords == NULL && + alternate_of == NULL && + is_for_update == GS_APP_QUERY_TRISTATE_UNSET) || + is_curated == GS_APP_QUERY_TRISTATE_FALSE || + is_installed == GS_APP_QUERY_TRISTATE_FALSE || + is_for_update == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + if (released_since != NULL) { + g_autoptr(GIcon) icon = g_themed_icon_new ("chiron.desktop"); + g_autoptr(GsApp) app = gs_app_new ("chiron.desktop"); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Chiron"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "View and use virtual machines"); + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, "http://www.box.org"); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_add_icon (app, icon); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_management_plugin (app, plugin); + + gs_app_list_add (list, app); + } + + if (is_curated != GS_APP_QUERY_TRISTATE_UNSET) { + /* Hacky way of letting callers indicate which set of results + * they want, for unit testing. */ + if (max_results == 6) { + const gchar *apps[] = { "chiron.desktop", "zeus.desktop" }; + for (gsize i = 0; i < G_N_ELEMENTS (apps); i++) { + g_autoptr(GsApp) app = gs_app_new (apps[i]); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_list_add (list, app); + } + } else { + g_autoptr(GsApp) app = NULL; + /* add wildcard */ + app = gs_app_new ("zeus.desktop"); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_list_add (list, app); + } + } + + if (category != NULL) { + g_autoptr(GIcon) icon = g_themed_icon_new ("chiron.desktop"); + g_autoptr(GsApp) app = gs_app_new ("chiron.desktop"); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Chiron"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "View and use virtual machines"); + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, "http://www.box.org"); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_add_icon (app, icon); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_management_plugin (app, plugin); + gs_app_list_add (list, app); + } + + if (is_installed != GS_APP_QUERY_TRISTATE_UNSET) { + const gchar *packages[] = { "zeus", "zeus-common", NULL }; + const gchar *app_ids[] = { "Uninstall Zeus.desktop", NULL }; + + /* add all packages */ + for (gsize i = 0; packages[i] != NULL; i++) { + g_autoptr(GsApp) app = gs_app_new (NULL); + gs_app_add_source (app, packages[i]); + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_origin (app, "london-west"); + gs_app_set_management_plugin (app, plugin); + gs_app_list_add (list, app); + } + + /* add all app-ids */ + for (gsize i = 0; app_ids[i] != NULL; i++) { + g_autoptr(GsApp) app = gs_app_new (app_ids[i]); + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_management_plugin (app, plugin); + gs_app_list_add (list, app); + } + } + + if (keywords != NULL) { + if (g_strcmp0 (keywords[0], "hang") == 0) { + /* hang the plugin for 5 seconds */ + gs_plugin_dummy_timeout_async (self, 5000, cancellable, + list_apps_timeout_cb, g_steal_pointer (&task)); + return; + } else if (g_strcmp0 (keywords[0], "chiron") == 0) { + g_autoptr(GsApp) app = NULL; + + /* does the app already exist? */ + app = gs_plugin_cache_lookup (plugin, "chiron"); + if (app != NULL) { + g_debug ("using %s fom the cache", gs_app_get_id (app)); + gs_app_list_add (list, app); + } else { + g_autoptr(GIcon) icon = NULL; + + /* set up a timeout to emulate getting a GFileMonitor callback */ + self->quirk_id = + g_timeout_add_seconds (1, gs_plugin_dummy_poll_cb, plugin); + + /* use a generic stock icon */ + icon = g_themed_icon_new ("org.gnome.Software.Dummy"); + + /* add a live updatable normal application */ + app = gs_app_new ("chiron.desktop"); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Chiron"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "A teaching application"); + gs_app_add_icon (app, icon); + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, 42 * 1024 * 1024); + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 50 * 1024 * 1024); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + gs_app_set_management_plugin (app, plugin); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_list_add (list, app); + + /* add to cache so it can be found by the flashing callback */ + gs_plugin_cache_add (plugin, NULL, app); + } + } else { + /* Don’t do anything */ + } + } + + if (alternate_of != NULL) { + if (g_strcmp0 (gs_app_get_id (alternate_of), "zeus.desktop") == 0) { + g_autoptr(GsApp) app = gs_app_new ("chiron.desktop"); + gs_app_list_add (list, app); + } + } + + if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE) { + /* update UI as this might take some time */ + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING); + + /* spin */ + gs_plugin_dummy_timeout_async (self, 2000, cancellable, + list_apps_timeout_cb, g_steal_pointer (&task)); + return; + } + + g_task_return_pointer (task, g_steal_pointer (&list), (GDestroyNotify) g_object_unref); +} + +static GsAppList * +list_apps_finish (GsPluginDummy *self, + GTask *task) +{ + GsPluginListAppsData *data = g_task_get_task_data (task); + g_autoptr(GsAppList) list = gs_app_list_new (); + + if (data->query && gs_app_query_get_is_for_update (data->query) == GS_APP_QUERY_TRISTATE_TRUE) { + GsPlugin *plugin = GS_PLUGIN (self); + GsApp *app; + GsApp *proxy; + g_autoptr(GIcon) ic = NULL; + + /* use a generic stock icon */ + ic = g_themed_icon_new ("org.gnome.Software.Dummy"); + + /* add a live updatable normal application */ + app = gs_app_new ("chiron.desktop"); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Chiron"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "A teaching application"); + gs_app_set_update_details_text (app, "Do not crash when using libvirt."); + gs_app_set_update_urgency (app, AS_URGENCY_KIND_HIGH); + gs_app_add_icon (app, ic); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_set_management_plugin (app, plugin); + gs_app_list_add (list, app); + g_object_unref (app); + + /* add a offline OS update */ + app = gs_app_new (NULL); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "libvirt-glib-devel"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "Development files for libvirt"); + gs_app_set_update_details_text (app, "Fix several memory leaks."); + gs_app_set_update_urgency (app, AS_URGENCY_KIND_LOW); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + gs_app_add_source (app, "libvirt-glib-devel"); + gs_app_add_source_id (app, "libvirt-glib-devel;0.0.1;noarch;fedora"); + gs_app_set_management_plugin (app, plugin); + gs_app_list_add (list, app); + g_object_unref (app); + + /* add a live OS update */ + app = gs_app_new (NULL); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "chiron-libs"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "library for chiron"); + gs_app_set_update_details_text (app, "Do not crash when using libvirt."); + gs_app_set_update_urgency (app, AS_URGENCY_KIND_HIGH); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_add_source (app, "chiron-libs"); + gs_app_add_source_id (app, "chiron-libs;0.0.1;i386;updates-testing"); + gs_app_set_management_plugin (app, plugin); + gs_app_list_add (list, app); + g_object_unref (app); + + /* add a proxy app update */ + proxy = gs_app_new ("proxy.desktop"); + gs_app_set_name (proxy, GS_APP_QUALITY_NORMAL, "Proxy"); + gs_app_set_summary (proxy, GS_APP_QUALITY_NORMAL, "A proxy app"); + gs_app_set_update_details_text (proxy, "Update all related apps."); + gs_app_set_update_urgency (proxy, AS_URGENCY_KIND_HIGH); + gs_app_add_icon (proxy, ic); + gs_app_set_kind (proxy, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_add_quirk (proxy, GS_APP_QUIRK_IS_PROXY); + gs_app_set_state (proxy, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_set_management_plugin (proxy, plugin); + gs_app_list_add (list, proxy); + g_object_unref (proxy); + + /* add a proxy related app */ + app = gs_app_new ("proxy-related-app.desktop"); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Related app"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "A related app"); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_set_management_plugin (app, plugin); + gs_app_add_related (proxy, app); + g_object_unref (app); + + /* add another proxy related app */ + app = gs_app_new ("proxy-another-related-app.desktop"); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Another Related app"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "A related app"); + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_set_management_plugin (app, plugin); + gs_app_add_related (proxy, app); + g_object_unref (app); + } + + return g_steal_pointer (&list); +} + +static void +list_apps_timeout_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginDummy *self = GS_PLUGIN_DUMMY (object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + /* Return a cancelled error, or an empty app list after hanging. */ + if (gs_plugin_dummy_timeout_finish (self, result, &local_error)) + g_task_return_pointer (task, list_apps_finish (self, task), (GDestroyNotify) g_object_unref); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static GsAppList * +gs_plugin_dummy_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_dummy_list_distro_upgrades_async (GsPlugin *plugin, + GsPluginListDistroUpgradesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GsApp) app = NULL; + g_autoptr(GIcon) ic = NULL; + g_autofree gchar *background_filename = NULL; + g_autofree gchar *css = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_list_distro_upgrades_async); + + /* use stock icon */ + ic = g_themed_icon_new ("system-component-addon"); + + /* get existing item from the cache */ + app = gs_plugin_cache_lookup (plugin, "user/*/os-upgrade/org.fedoraproject.release-rawhide.upgrade/*"); + if (app != NULL) { + gs_app_list_add (list, app); + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + return; + } + + app = gs_app_new ("org.fedoraproject.release-rawhide.upgrade"); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_USER); + gs_app_set_kind (app, AS_COMPONENT_KIND_OPERATING_SYSTEM); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, "Fedora"); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, + "A major upgrade, with new features and added polish."); + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, + "https://fedoraproject.org/wiki/Releases/24/Schedule"); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_REVIEWABLE); + gs_app_set_version (app, "34"); + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, 256 * 1024 * 1024); + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 1024 * 1024 * 1024); + gs_app_set_license (app, GS_APP_QUALITY_LOWEST, "LicenseRef-free"); + gs_app_set_management_plugin (app, plugin); + + /* Check for a background image in the standard location. */ + background_filename = gs_utils_get_upgrade_background ("34"); + + if (background_filename != NULL) + css = g_strconcat ("background: url('file://", background_filename, "');" + "background-size: 100% 100%;", NULL); + gs_app_set_metadata (app, "GnomeSoftware::UpgradeBanner-css", css); + + gs_app_add_icon (app, ic); + gs_app_list_add (list, app); + + gs_plugin_cache_add (plugin, NULL, app); + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_dummy_list_distro_upgrades_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void update_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_dummy_update_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = gs_plugin_update_apps_data_new_task (plugin, apps, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_update_apps_async); + + if (!(flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD)) + gs_plugin_dummy_delay_async (plugin, NULL, 5100, cancellable, update_apps_cb, g_steal_pointer (&task)); + else + update_apps_cb (G_OBJECT (plugin), NULL, g_steal_pointer (&task)); +} + +static void +update_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginUpdateAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + if (result != NULL && + !gs_plugin_dummy_delay_finish (plugin, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (!(data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY)) { + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) + continue; + + if (!g_str_has_prefix (gs_app_get_id (app), "proxy")) { + g_autoptr(GsPluginEvent) event = NULL; + + /* always fail */ + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_DOWNLOAD_FAILED, + "no network connection is available"); + gs_utils_error_add_origin_id (&local_error, self->cached_origin); + + event = gs_plugin_event_new ("app", app, + "action", GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD, + "error", local_error, + "origin", self->cached_origin, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + if (data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_report_event (plugin, event); + + g_clear_error (&local_error); + continue; + } + + /* simulate an update for 4 seconds */ + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + + for (guint j = 1; j <= 4; ++j) { + gs_app_set_progress (app, 25 * j); + sleep (1); /* FIXME: make this async */ + } + + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + + /* Simple progress reporting. */ + if (data->progress_callback != NULL) { + data->progress_callback (GS_PLUGIN (self), + 100 * ((gdouble) (i + 1) / gs_app_list_length (data->apps)), + data->progress_user_data); + } + } + + g_task_return_boolean (task, TRUE); + } else { + g_task_return_boolean (task, TRUE); + } +} + +static gboolean +gs_plugin_dummy_update_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void refresh_metadata_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_dummy_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GsApp) app = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_refresh_metadata_async); + + app = gs_app_new (NULL); + gs_plugin_dummy_delay_async (plugin, app, 3100, cancellable, refresh_metadata_cb, g_steal_pointer (&task)); +} + +static void +refresh_metadata_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_dummy_delay_finish (plugin, result, &local_error)) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_dummy_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +download_upgrade_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + GsPluginDownloadUpgradeData *data = g_task_get_task_data (task); + + if (!gs_plugin_dummy_delay_finish (plugin, result, &local_error)) { + gs_app_set_state_recover (data->app); + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + gs_app_set_state (data->app, GS_APP_STATE_UPDATABLE); + g_task_return_boolean (task, TRUE); + } +} + +static void +gs_plugin_dummy_download_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginDownloadUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = gs_plugin_download_upgrade_data_new_task (plugin, app, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_download_upgrade_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + g_debug ("starting download"); + gs_app_set_state (app, GS_APP_STATE_DOWNLOADING); + gs_plugin_dummy_delay_async (plugin, app, 5000, cancellable, download_upgrade_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_dummy_download_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_dummy_trigger_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginTriggerUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = gs_plugin_trigger_upgrade_data_new_task (plugin, app, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_trigger_upgrade_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* NOP */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_dummy_trigger_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_dummy_cancel_offline_update_async (GsPlugin *plugin, + GsPluginCancelOfflineUpdateFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = gs_plugin_cancel_offline_update_data_new_task (plugin, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_dummy_cancel_offline_update_async); + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_dummy_cancel_offline_update_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_dummy_class_init (GsPluginDummyClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_dummy_dispose; + + plugin_class->setup_async = gs_plugin_dummy_setup_async; + plugin_class->setup_finish = gs_plugin_dummy_setup_finish; + plugin_class->refine_async = gs_plugin_dummy_refine_async; + plugin_class->refine_finish = gs_plugin_dummy_refine_finish; + plugin_class->list_apps_async = gs_plugin_dummy_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_dummy_list_apps_finish; + plugin_class->refresh_metadata_async = gs_plugin_dummy_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_dummy_refresh_metadata_finish; + plugin_class->list_distro_upgrades_async = gs_plugin_dummy_list_distro_upgrades_async; + plugin_class->list_distro_upgrades_finish = gs_plugin_dummy_list_distro_upgrades_finish; + plugin_class->install_apps_async = gs_plugin_dummy_install_apps_async; + plugin_class->install_apps_finish = gs_plugin_dummy_install_apps_finish; + plugin_class->uninstall_apps_async = gs_plugin_dummy_uninstall_apps_async; + plugin_class->uninstall_apps_finish = gs_plugin_dummy_uninstall_apps_finish; + plugin_class->update_apps_async = gs_plugin_dummy_update_apps_async; + plugin_class->update_apps_finish = gs_plugin_dummy_update_apps_finish; + plugin_class->cancel_offline_update_async = gs_plugin_dummy_cancel_offline_update_async; + plugin_class->cancel_offline_update_finish = gs_plugin_dummy_cancel_offline_update_finish; + plugin_class->download_upgrade_async = gs_plugin_dummy_download_upgrade_async; + plugin_class->download_upgrade_finish = gs_plugin_dummy_download_upgrade_finish; + plugin_class->trigger_upgrade_async = gs_plugin_dummy_trigger_upgrade_async; + plugin_class->trigger_upgrade_finish = gs_plugin_dummy_trigger_upgrade_finish; + plugin_class->url_to_app_async = gs_plugin_dummy_url_to_app_async; + plugin_class->url_to_app_finish = gs_plugin_dummy_url_to_app_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_DUMMY; +} diff --git a/plugins/dummy/gs-plugin-dummy.h b/plugins/dummy/gs-plugin-dummy.h new file mode 100644 index 0000000..f28d49f --- /dev/null +++ b/plugins/dummy/gs-plugin-dummy.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_DUMMY (gs_plugin_dummy_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginDummy, gs_plugin_dummy, GS, PLUGIN_DUMMY, GsPlugin) + +G_END_DECLS diff --git a/plugins/dummy/gs-self-test.c b/plugins/dummy/gs-self-test.c new file mode 100644 index 0000000..3b881c5 --- /dev/null +++ b/plugins/dummy/gs-self-test.c @@ -0,0 +1,948 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gnome-software-private.h" + +#include "gs-test.h" + +const gchar * const allowlist[] = { + "appstream", + "dummy", + "generic-updates", + "hardcoded-blocklist", + "icons", + "provenance", + "provenance-license", + NULL +}; + +static guint _status_changed_cnt = 0; + +static void +gs_plugin_loader_status_changed_cb (GsPluginLoader *plugin_loader, + GsApp *app, + GsPluginStatus status, + gpointer user_data) +{ + _status_changed_cnt++; +} + +static void +gs_plugins_dummy_install_func (GsPluginLoader *plugin_loader) +{ + gboolean ret; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) app_list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GError) error = NULL; + GsPlugin *plugin; + + /* install */ + app = gs_app_new ("chiron.desktop"); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy"); + gs_app_set_management_plugin (app, plugin); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + app_list = gs_app_list_new (); + gs_app_list_add (app_list, app); + plugin_job = gs_plugin_job_install_apps_new (app_list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + + /* remove */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_uninstall_apps_new (app_list, + GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); +} + +static void +gs_plugins_dummy_error_func (GsPluginLoader *plugin_loader) +{ + const GError *app_error; + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GPtrArray) events = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsPluginEvent) event = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPlugin *plugin; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* update, which should cause an error to be emitted */ + app = gs_app_new ("chiron.desktop"); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy"); + gs_app_set_management_plugin (app, plugin); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + + list = gs_app_list_new (); + gs_app_list_add (list, app); + + plugin_job = gs_plugin_job_update_apps_new (list, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + + /* get last active event */ + event = gs_plugin_loader_get_event_default (plugin_loader); + g_assert (event != NULL); + g_assert (gs_plugin_event_get_app (event) == app); + + /* check all the events */ + events = gs_plugin_loader_get_events (plugin_loader); + g_assert_cmpint (events->len, ==, 1); + event = g_ptr_array_index (events, 0); + g_assert (gs_plugin_event_get_app (event) == app); + app_error = gs_plugin_event_get_error (event); + g_assert (app_error != NULL); + g_assert_error (app_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_DOWNLOAD_FAILED); +} + +static void +gs_plugins_dummy_refine_func (GsPluginLoader *plugin_loader) +{ + gboolean ret; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPlugin *plugin; + + /* get the extra bits */ + app = gs_app_new ("chiron.desktop"); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy"); + gs_app_set_management_plugin (app, plugin); + plugin_job = gs_plugin_job_refine_new_for_app (app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + + g_assert_cmpstr (gs_app_get_license (app), ==, "GPL-2.0-or-later"); + g_assert_cmpstr (gs_app_get_description (app), !=, NULL); + g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, "http://www.test.org/"); +} + +static void +gs_plugins_dummy_metadata_quirks (GsPluginLoader *plugin_loader) +{ + gboolean ret; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPlugin *plugin; + + /* get the extra bits */ + app = gs_app_new ("chiron.desktop"); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy"); + gs_app_set_management_plugin (app, plugin); + plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + + g_assert_cmpstr (gs_app_get_description (app), !=, NULL); + + /* check the not-launchable quirk */ + + g_assert (!gs_app_has_quirk(app, GS_APP_QUIRK_NOT_LAUNCHABLE)); + + gs_app_set_metadata (app, "GnomeSoftware::quirks::not-launchable", "true"); + + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + + g_assert (gs_app_has_quirk(app, GS_APP_QUIRK_NOT_LAUNCHABLE)); + + gs_app_set_metadata (app, "GnomeSoftware::quirks::not-launchable", NULL); + gs_app_set_metadata (app, "GnomeSoftware::quirks::not-launchable", "false"); + + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + + g_assert (!gs_app_has_quirk(app, GS_APP_QUIRK_NOT_LAUNCHABLE)); +} + +static void +gs_plugins_dummy_key_colors_func (GsPluginLoader *plugin_loader) +{ + GArray *array; + gboolean ret; + guint i; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GError) error = NULL; + + /* get the extra bits */ + app = gs_app_new ("chiron.desktop"); + plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + array = gs_app_get_key_colors (app); + g_assert_cmpint (array->len, <=, 3); + g_assert_cmpint (array->len, >, 0); + + /* check values are in range */ + for (i = 0; i < array->len; i++) { + const GdkRGBA *kc = &g_array_index (array, GdkRGBA, i); + g_assert_cmpfloat (kc->red, >=, 0.f); + g_assert_cmpfloat (kc->red, <=, 1.f); + g_assert_cmpfloat (kc->green, >=, 0.f); + g_assert_cmpfloat (kc->green, <=, 1.f); + g_assert_cmpfloat (kc->blue, >=, 0.f); + g_assert_cmpfloat (kc->blue, <=, 1.f); + g_assert_cmpfloat (kc->alpha, >=, 0.f); + g_assert_cmpfloat (kc->alpha, <=, 1.f); + } +} + +static void +gs_plugins_dummy_updates_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get the updates list */ + query = gs_app_query_new ("is-for-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS, + "sort-func", gs_utils_app_sort_name, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list != NULL); + + /* make sure there are three entries */ + g_assert_cmpint (gs_app_list_length (list), ==, 3); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "chiron.desktop"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE_LIVE); + g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, "Do not crash when using libvirt."); + g_assert_cmpint (gs_app_get_update_urgency (app), ==, AS_URGENCY_KIND_HIGH); + + /* get the virtual non-apps OS update */ + app = gs_app_list_index (list, 2); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.gnome.Software.OsUpdate"); + g_assert_cmpstr (gs_app_get_name (app), ==, "System Updates"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "General system updates, such as security or bug fixes, and performance improvements."); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_GENERIC); + g_assert_cmpint (gs_app_get_special_kind (app), ==, GS_APP_SPECIAL_KIND_OS_UPDATE); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE); + g_assert_cmpint (gs_app_list_length (gs_app_get_related (app)), ==, 2); + + /* get the virtual non-apps OS update */ + app = gs_app_list_index (list, 1); + g_assert_cmpstr (gs_app_get_id (app), ==, "proxy.desktop"); + g_assert (gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY)); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE_LIVE); + g_assert_cmpint (gs_app_list_length (gs_app_get_related (app)), ==, 2); +} + +static void +gs_plugins_dummy_distro_upgrades_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get the updates list */ + plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE, + GS_PLUGIN_REFINE_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list != NULL); + + /* make sure there is one entry */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.fedoraproject.release-rawhide.upgrade"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_OPERATING_SYSTEM); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + + /* this should be set with a higher priority by AppStream */ + g_assert_cmpstr (gs_app_get_summary (app), ==, "Release specific tagline"); + + /* download the update */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_download_upgrade_new (app, GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE); + + /* trigger the update */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_trigger_upgrade_new (app, GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE); +} + +static gboolean +filter_valid_cb (GsApp *app, + gpointer user_data) +{ + return gs_plugin_loader_app_is_valid (app, GS_PLUGIN_REFINE_FLAGS_NONE); +} + +static void +gs_plugins_dummy_installed_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + GsApp *addon; + g_autoptr(GsAppList) addons = NULL; + g_autofree gchar *menu_path = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GIcon) icon = NULL; + GsPluginRefineFlags refine_flags; + + /* get installed packages */ + refine_flags = (GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE); + + query = gs_app_query_new ("is-installed", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", refine_flags, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "filter-func", filter_valid_cb, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list != NULL); + + /* make sure there is one entry */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "zeus.desktop"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_name (app), ==, "Zeus"); + g_assert_cmpstr (gs_app_get_source_default (app), ==, "zeus"); + icon = gs_app_get_icon_for_size (app, 48, 1, NULL); + g_assert_nonnull (icon); + g_assert_true (G_IS_THEMED_ICON (icon)); + g_clear_object (&icon); + + /* check various bitfields */ + g_assert (gs_app_has_quirk (app, GS_APP_QUIRK_PROVENANCE)); + g_assert_cmpstr (gs_app_get_license (app), ==, "GPL-2.0-or-later"); + g_assert (gs_app_get_license_is_free (app)); + + /* check kudos */ + g_assert_true (gs_app_has_kudo (app, GS_APP_KUDO_MY_LANGUAGE)); + + /* check categories */ + g_assert (gs_app_has_category (app, "Player")); + g_assert (gs_app_has_category (app, "AudioVideo")); + g_assert (!gs_app_has_category (app, "ImageProcessing")); + g_assert (gs_app_get_menu_path (app) != NULL); + menu_path = g_strjoinv ("->", gs_app_get_menu_path (app)); + g_assert_cmpstr (menu_path, ==, "Create->Music Players"); + + /* check addon */ + addons = gs_app_dup_addons (app); + g_assert_nonnull (addons); + g_assert_cmpint (gs_app_list_length (addons), ==, 1); + addon = gs_app_list_index (addons, 0); + g_assert_cmpstr (gs_app_get_id (addon), ==, "zeus-spell.addon"); + g_assert_cmpint (gs_app_get_kind (addon), ==, AS_COMPONENT_KIND_ADDON); + g_assert_cmpint (gs_app_get_state (addon), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpstr (gs_app_get_name (addon), ==, "Spell Check"); + g_assert_cmpstr (gs_app_get_source_default (addon), ==, "zeus-spell"); + g_assert_cmpstr (gs_app_get_license (addon), ==, + "LicenseRef-free=https://www.debian.org/"); + /* The app has a non-existent icon */ + g_assert_true (gs_app_has_icons (addon)); + icon = gs_app_get_icon_for_size (addon, 48, 1, NULL); + g_assert_null (icon); +} + +static void +gs_plugins_dummy_search_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + + /* get search result based on addon keyword */ + keywords[0] = "zeus"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list != NULL); + + /* make sure there is at least one entry, the parent app, which must be first */ + g_assert_cmpint (gs_app_list_length (list), >=, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "zeus.desktop"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); +} + +static void +gs_plugins_dummy_search_alternate_func (GsPluginLoader *plugin_loader) +{ + GsApp *app_tmp; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get search result based on addon keyword */ + app = gs_app_new ("zeus.desktop"); + query = gs_app_query_new ("alternate-of", app, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_priority, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list != NULL); + + /* make sure there is the original app, and the alternate */ + g_assert_cmpint (gs_app_list_length (list), ==, 2); + app_tmp = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app_tmp), ==, "chiron.desktop"); + g_assert_cmpint (gs_app_get_kind (app_tmp), ==, AS_COMPONENT_KIND_DESKTOP_APP); + app_tmp = gs_app_list_index (list, 1); + g_assert_cmpstr (gs_app_get_id (app_tmp), ==, "zeus.desktop"); + g_assert_cmpint (gs_app_get_kind (app_tmp), ==, AS_COMPONENT_KIND_DESKTOP_APP); +} + +static void +gs_plugins_dummy_url_to_app_func (GsPluginLoader *plugin_loader) +{ + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + plugin_job = gs_plugin_job_url_to_app_new ("dummy://chiron.desktop", GS_PLUGIN_URL_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (app != NULL); + g_assert_cmpstr (gs_app_get_id (app), ==, "chiron.desktop"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); +} + +static void +gs_plugins_dummy_plugin_cache_func (GsPluginLoader *plugin_loader) +{ + GsApp *app1; + GsApp *app2; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list1 = NULL; + g_autoptr(GsAppList) list2 = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* ensure we get the same results back from calling the methods twice */ + plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE, + GS_PLUGIN_REFINE_FLAGS_NONE); + list1 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list1 != NULL); + g_assert_cmpint (gs_app_list_length (list1), ==, 1); + app1 = gs_app_list_index (list1, 0); + + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE, + GS_PLUGIN_REFINE_FLAGS_NONE); + list2 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list2 != NULL); + g_assert_cmpint (gs_app_list_length (list2), ==, 1); + app2 = gs_app_list_index (list2, 0); + + /* make sure there is one GObject */ + g_assert_cmpstr (gs_app_get_id (app1), ==, gs_app_get_id (app2)); + g_assert (app1 == app2); +} + +static void +gs_plugins_dummy_wildcard_func (GsPluginLoader *plugin_loader) +{ + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list1 = NULL; + g_autoptr(GsAppList) list2 = NULL; + const gchar *expected_apps2[] = { "chiron.desktop", "zeus.desktop", NULL }; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + + /* use the plugin's default curated list, indicated by setting max-results=5 */ + query = gs_app_query_new ("is-curated", GS_APP_QUERY_TRISTATE_TRUE, + "max-results", 5, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + + list1 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list1 != NULL); + g_assert_cmpint (gs_app_list_length (list1), ==, 1); + g_object_unref (plugin_job); + g_object_unref (query); + + /* use the plugin’s second list, indicated by setting max-results=6 */ + query = gs_app_query_new ("is-curated", GS_APP_QUERY_TRISTATE_TRUE, + "max-results", 6, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + + list2 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list2 != NULL); + + g_assert_cmpint (gs_app_list_length (list2), ==, g_strv_length ((gchar **) expected_apps2)); + + for (guint i = 0; i < gs_app_list_length (list2); ++i) { + GsApp *app = gs_app_list_index (list2, i); + g_assert (g_strv_contains (expected_apps2, gs_app_get_id (app))); + } +} + +static void +async_result_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **result_out = user_data; + + g_assert (result_out != NULL && *result_out == NULL); + *result_out = g_object_ref (result); + g_main_context_wakeup (g_main_context_get_thread_default ()); +} + +static void +gs_plugins_dummy_limit_parallel_ops_func (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsAppList) list = NULL; + GsApp *app1 = NULL; + g_autoptr(GsApp) app2 = NULL; + g_autoptr(GsAppList) app2_list = NULL; + g_autoptr(GsApp) app3 = NULL; + g_autoptr(GsAppList) app3_list = NULL; + GsPlugin *plugin; + g_autoptr(GsPluginJob) plugin_job1 = NULL; + g_autoptr(GsPluginJob) plugin_job2 = NULL; + g_autoptr(GsPluginJob) plugin_job3 = NULL; + g_autoptr(GMainContext) context = NULL; + g_autoptr(GAsyncResult) result1 = NULL; + g_autoptr(GAsyncResult) result2 = NULL; + g_autoptr(GAsyncResult) result3 = NULL; + g_autoptr(GError) local_error = NULL; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* get the updates list */ + plugin_job1 = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE, + GS_PLUGIN_REFINE_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job1, NULL, &local_error); + gs_test_flush_main_context (); + g_assert_no_error (local_error); + g_assert (list != NULL); + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app1 = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app1), ==, "org.fedoraproject.release-rawhide.upgrade"); + g_assert_cmpint (gs_app_get_kind (app1), ==, AS_COMPONENT_KIND_OPERATING_SYSTEM); + g_assert_cmpint (gs_app_get_state (app1), ==, GS_APP_STATE_AVAILABLE); + + /* allow only one operation at a time */ + gs_plugin_loader_set_max_parallel_ops (plugin_loader, 1); + + app2 = gs_app_new ("chiron.desktop"); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy"); + gs_app_set_management_plugin (app2, plugin); + gs_app_set_state (app2, GS_APP_STATE_AVAILABLE); + + /* use "proxy" prefix so the update function succeeds... */ + app3 = gs_app_new ("proxy-zeus.desktop"); + gs_app_set_management_plugin (app3, plugin); + gs_app_set_state (app3, GS_APP_STATE_UPDATABLE_LIVE); + + context = g_main_context_new (); + g_main_context_push_thread_default (context); + + /* call a few operations at the "same time" */ + + /* download an upgrade */ + g_object_unref (plugin_job1); + plugin_job1 = gs_plugin_job_download_upgrade_new (app1, GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_NONE); + gs_plugin_loader_job_process_async (plugin_loader, + plugin_job1, + NULL, + async_result_cb, + &result1); + + /* install an app */ + app2_list = gs_app_list_new (); + gs_app_list_add (app2_list, app2); + plugin_job2 = gs_plugin_job_install_apps_new (app2_list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + gs_plugin_loader_job_process_async (plugin_loader, + plugin_job2, + NULL, + async_result_cb, + &result2); + + /* update an app */ + app3_list = gs_app_list_new (); + gs_app_list_add (app3_list, app3); + plugin_job3 = gs_plugin_job_update_apps_new (app3_list, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD); + gs_plugin_loader_job_process_async (plugin_loader, + plugin_job3, + NULL, + async_result_cb, + &result3); + + /* wait for all operations to finish */ + while (result1 == NULL || result2 == NULL || result3 == NULL) + g_main_context_iteration (context, TRUE); + + g_main_context_pop_thread_default (context); + + gs_test_flush_main_context (); + + gs_plugin_loader_job_action_finish (plugin_loader, result1, &local_error); + g_assert_no_error (local_error); + + gs_plugin_loader_job_action_finish (plugin_loader, result2, &local_error); + g_assert_no_error (local_error); + + gs_plugin_loader_job_action_finish (plugin_loader, result3, &local_error); + g_assert_no_error (local_error); + + g_assert_cmpint (gs_app_get_state (app1), ==, GS_APP_STATE_UPDATABLE); + g_assert_cmpint (gs_app_get_state (app2), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpint (gs_app_get_state (app3), ==, GS_APP_STATE_INSTALLED); + + /* set the default max parallel ops */ + gs_plugin_loader_set_max_parallel_ops (plugin_loader, 0); +} + +static void +gs_plugins_dummy_app_size_calc_func (GsPluginLoader *loader) +{ + g_autoptr(GsApp) app1 = NULL; + g_autoptr(GsApp) app2 = NULL; + g_autoptr(GsApp) runtime = NULL; + guint64 value = 0; + + app1 = gs_app_new ("app1"); + gs_app_set_state (app1, GS_APP_STATE_AVAILABLE); + gs_app_set_size_download (app1, GS_SIZE_TYPE_VALID, 1); + gs_app_set_size_installed (app1, GS_SIZE_TYPE_VALID, 1000); + g_assert_cmpint (gs_app_get_size_download (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 1); + g_assert_cmpint (gs_app_get_size_download_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); + g_assert_cmpint (gs_app_get_size_installed (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 1000); + g_assert_cmpint (gs_app_get_size_installed_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); + + app2 = gs_app_new ("app2"); + gs_app_set_state (app2, GS_APP_STATE_AVAILABLE); + gs_app_set_size_download (app2, GS_SIZE_TYPE_VALID, 20); + gs_app_set_size_installed (app2, GS_SIZE_TYPE_VALID, 20000); + g_assert_cmpint (gs_app_get_size_download (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 20); + g_assert_cmpint (gs_app_get_size_download_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); + g_assert_cmpint (gs_app_get_size_installed (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 20000); + g_assert_cmpint (gs_app_get_size_installed_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); + + runtime = gs_app_new ("runtime"); + gs_app_set_state (runtime, GS_APP_STATE_AVAILABLE); + gs_app_set_size_download (runtime, GS_SIZE_TYPE_VALID, 300); + gs_app_set_size_installed (runtime, GS_SIZE_TYPE_VALID, 300000); + g_assert_cmpint (gs_app_get_size_download (runtime, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 300); + g_assert_cmpint (gs_app_get_size_download_dependencies (runtime, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); + g_assert_cmpint (gs_app_get_size_installed (runtime, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 300000); + g_assert_cmpint (gs_app_get_size_installed_dependencies (runtime, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); + + gs_app_set_runtime (app1, runtime); + g_assert_cmpint (gs_app_get_size_download (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 1); + g_assert_cmpint (gs_app_get_size_download_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 300); + g_assert_cmpint (gs_app_get_size_installed (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 1000); + g_assert_cmpint (gs_app_get_size_installed_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); + + gs_app_set_runtime (app2, runtime); + g_assert_cmpint (gs_app_get_size_download (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 20); + g_assert_cmpint (gs_app_get_size_download_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 300); + g_assert_cmpint (gs_app_get_size_installed (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 20000); + g_assert_cmpint (gs_app_get_size_installed_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); + + gs_app_add_related (app1, app2); + g_assert_cmpint (gs_app_get_size_download (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 1); + g_assert_cmpint (gs_app_get_size_download_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 320); + g_assert_cmpint (gs_app_get_size_installed (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 1000); + g_assert_cmpint (gs_app_get_size_installed_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 20000); + + g_assert_cmpint (gs_app_get_size_download (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 20); + g_assert_cmpint (gs_app_get_size_download_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 300); + g_assert_cmpint (gs_app_get_size_installed (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 20000); + g_assert_cmpint (gs_app_get_size_installed_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID); + g_assert_cmpint (value, ==, 0); +} + +int +main (int argc, char **argv) +{ + g_autofree gchar *tmp_root = NULL; + gboolean ret; + int retval; + g_autofree gchar *xml = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + + /* While we use %G_TEST_OPTION_ISOLATE_DIRS to create temporary directories + * for each of the tests, we want to use the system MIME registry, assuming + * that it exists and correctly has shared-mime-info installed. */ + g_content_type_set_mime_dirs (NULL); + + /* Force the GTK resources to be registered, needed for fallback icons. */ + gtk_init_check (); + + /* Similarly, add the system-wide icon theme path before it’s + * overwritten by %G_TEST_OPTION_ISOLATE_DIRS. */ + gs_test_expose_icon_theme_paths (); + + gs_test_init (&argc, &argv); + g_setenv ("GS_XMLB_VERBOSE", "1", TRUE); + + /* set all the things required as a dummy test harness */ + setlocale (LC_MESSAGES, "en_GB.UTF-8"); + g_setenv ("GS_SELF_TEST_DUMMY_ENABLE", "1", TRUE); + g_setenv ("GS_SELF_TEST_PROVENANCE_SOURCES", "london*,boston", TRUE); + g_setenv ("GS_SELF_TEST_PROVENANCE_LICENSE_SOURCES", "london*,boston", TRUE); + g_setenv ("GS_SELF_TEST_PROVENANCE_LICENSE_URL", "https://www.debian.org/", TRUE); + + /* Use a common cache directory for all tests, since the appstream + * plugin uses it and cannot be reinitialised for each test. */ + tmp_root = g_dir_make_tmp ("gnome-software-dummy-test-XXXXXX", NULL); + g_assert (tmp_root != NULL); + g_setenv ("GS_SELF_TEST_CACHEDIR", tmp_root, TRUE); + + xml = g_strdup ("\n" + "\n" + " \n" + " chiron.desktop\n" + " Chiron\n" + " chiron\n" + " \n" + " \n" + " zeus.desktop\n" + " Zeus\n" + " A teaching application\n" + " zeus\n" + " org.gnome.Software.Dummy\n" + " \n" + " AudioVideo\n" + " Player\n" + " \n" + " \n" + " en_GB\n" + " \n" + " \n" + " \n" + " mate-spell.desktop\n" + " Spell\n" + " A spelling application for MATE\n" + " mate-spell\n" + " org.gnome.Software.Dummy\n" + " MATE\n" + " \n" + " \n" + " zeus-spell.addon\n" + " zeus.desktop\n" + " Spell Check\n" + " Check the spelling when teaching\n" + " zeus-spell\n" + " non-existent\n" + " \n" + " \n" + " Uninstall Zeus.desktop\n" + " Uninstall Zeus\n" + " Uninstall the teaching application\n" + " org.gnome.Software.Dummy\n" + " \n" + " \n" + " org.fedoraproject.release-rawhide.upgrade\n" + " Fedora Rawhide\n" + " Release specific tagline\n" + " fedora-release\n" + " \n" + " \n" + " user\n" + " \n" + "\n"); + g_setenv ("GS_SELF_TEST_APPSTREAM_XML", xml, TRUE); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + g_signal_connect (plugin_loader, "status-changed", + G_CALLBACK (gs_plugin_loader_status_changed_cb), NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR_CORE); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + g_assert (!gs_plugin_loader_get_enabled (plugin_loader, "notgoingtoexist")); + g_assert (gs_plugin_loader_get_enabled (plugin_loader, "appstream")); + g_assert (gs_plugin_loader_get_enabled (plugin_loader, "dummy")); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/dummy/wildcard", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_wildcard_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/plugin-cache", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_plugin_cache_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/key-colors", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_key_colors_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/search", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_search_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/search-alternate", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_search_alternate_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/url-to-app", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_url_to_app_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/install", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_install_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/error", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_error_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/installed", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_installed_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/refine", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_refine_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/updates", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_updates_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/distro-upgrades", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_distro_upgrades_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/metadata-quirks", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_metadata_quirks); + g_test_add_data_func ("/gnome-software/plugins/dummy/limit-parallel-ops", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_limit_parallel_ops_func); + g_test_add_data_func ("/gnome-software/plugins/dummy/app-size-calc", + plugin_loader, + (GTestDataFunc) gs_plugins_dummy_app_size_calc_func); + retval = g_test_run (); + + /* Clean up. */ + gs_utils_rmtree (tmp_root, NULL); + + return retval; +} diff --git a/plugins/dummy/meson.build b/plugins/dummy/meson.build new file mode 100644 index 0000000..e019940 --- /dev/null +++ b/plugins/dummy/meson.build @@ -0,0 +1,39 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginDummy"'] +cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] +cargs += ['-DLOCALPLUGINDIR_CORE="' + meson.current_build_dir() + '/../core"'] + +shared_module( + 'gs_plugin_dummy', + sources : 'gs-plugin-dummy.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : [plugin_libs], +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + resources_src = gnome.compile_resources( + 'gs-resources', + '../../src/gnome-software.gresource.xml', + source_dir : '../../src', + c_name : 'gs' + ) + + e = executable( + 'gs-self-test-dummy', + compiled_schemas, + resources_src, + sources : [ + 'gs-self-test.c' + ], + dependencies : [ + plugin_libs, + ], + c_args : cargs, + ) + test('gs-self-test-dummy', e, suite: ['plugins', 'dummy'], env: test_env) +endif diff --git a/plugins/eos-updater/com.endlessm.Updater.xml b/plugins/eos-updater/com.endlessm.Updater.xml new file mode 100644 index 0000000..2735865 --- /dev/null +++ b/plugins/eos-updater/com.endlessm.Updater.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/eos-updater/gs-plugin-eos-updater.c b/plugins/eos-updater/gs-plugin-eos-updater.c new file mode 100644 index 0000000..9fb2982 --- /dev/null +++ b/plugins/eos-updater/gs-plugin-eos-updater.c @@ -0,0 +1,1627 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016-2019 Endless Mobile, Inc + * + * Authors: + * Joaquim Rocha + * Philip Withnall + * + * Licensed under the GNU General Public License Version 2 + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gs-eos-updater-generated.h" +#include "gs-plugin-eos-updater.h" +#include "gs-plugin-private.h" + +/* + * SECTION: + * Plugin to poll for, download and apply OS updates using the `eos-updater` + * service when running on Endless OS. + * + * This plugin is only useful on Endless OS. + * + * It creates a proxy for the `eos-updater` D-Bus service, which implements a + * basic state machine which progresses through several states in order to + * download updates: `Ready` (doing nothing) → `Poll` (checking for updates) → + * `Fetch` (downloading an update) → `Apply` (deploying the update’s OSTree, + * before a reboot). Any state may transition to the `Error` state at any time, + * and the daemon may disappear at any time. + * + * This plugin follows the state transitions signalled by the daemon, and + * updates the state of a single #GsApp instance (`os_upgrade`) to reflect the + * OS update or upgrade in the UI. + * + * The #GsApp instance is returned by + * `gs_plugin_eos_updater_list_distro_upgrades_async()` or + * `gs_plugin_eos_updater_list_apps_async()` depending on whether it contains significant + * user visible changes, as determined by the `update-is-user-visible` property + * on the proxy. (This in turn is set from information on the release OSTree + * commit.) The #GsApp will be returned by at most one of these vfuncs. + * + * Calling gs_plugin_eos_updater_refresh_metadata_async() will result in this + * plugin calling the `Poll()` method on the `eos-updater` daemon to check for a + * new update. + * + * Calling GsPluginClass::download_upgrade_async() will result in this plugin calling + * a sequence of methods on the `eos-updater` daemon to check for, download and + * apply an update. Typically, GsPluginClass::download_upgrade_async() should be called + * once `eos-updater` is already in the `UpdateAvailable` state. It will report + * progress information, with the first 75 percentage points of the progress + * reporting the download progress, and the final 25 percentage points reporting + * the OSTree deployment progress. The final 25 percentage points are currently + * faked because we can’t get reasonable progress data out of OSTree. + * + * The proxy object (`updater_proxy`) uses the thread-default main context from + * the gs_plugin_eos_updater_setup() function, which is currently the global default main + * context from gnome-software’s main thread. This means all the signal + * callbacks from the proxy will be executed in the main thread, and *must not + * block*. + * + * Asynchronous plugin vfuncs (such as + * gs_plugin_eos_updater_refresh_metadata_async()) are run in gnome-software’s + * main thread and *must not block*. As they all call D-Bus methods, the work + * they do is minimal and hence is OK to happen in the main thread. + * + * The other functions are called in #GTask worker threads. They are allowed to + * call methods on the proxy; the main thread is only allowed to receive signals + * and check properties on the proxy, to avoid blocking. + * + * `updater_proxy`, `os_upgrade` and `cancellable` are only set in + * gs_plugin_eos_updater_setup(), and are both internally thread-safe — so they can both be + * dereferenced and have their methods called from any thread without any + * locking. + * + * Cancellation of any operations on the `eos-updater` daemon (polling, fetching + * or applying) is implemented by calling the `Cancel()` method on it. This is + * permanently connected to the private `cancellable` #GCancellable instance, + * which persists for the lifetime of the plugin. The #GCancellable instances + * for various operations can be temporarily chained to it for the duration of + * each operation. + */ + +static const guint max_progress_for_update = 75; /* percent */ + +typedef enum { + EOS_UPDATER_STATE_NONE = 0, + EOS_UPDATER_STATE_READY, + EOS_UPDATER_STATE_ERROR, + EOS_UPDATER_STATE_POLLING, + EOS_UPDATER_STATE_UPDATE_AVAILABLE, + EOS_UPDATER_STATE_FETCHING, + EOS_UPDATER_STATE_UPDATE_READY, + EOS_UPDATER_STATE_APPLYING_UPDATE, + EOS_UPDATER_STATE_UPDATE_APPLIED, +} EosUpdaterState; +#define EOS_UPDATER_N_STATES (EOS_UPDATER_STATE_UPDATE_APPLIED + 1) + +static const gchar * +eos_updater_state_to_str (EosUpdaterState state) +{ + const gchar * const eos_updater_state_str[] = { + "None", + "Ready", + "Error", + "Polling", + "UpdateAvailable", + "Fetching", + "UpdateReady", + "ApplyingUpdate", + "UpdateApplied", + }; + + G_STATIC_ASSERT (G_N_ELEMENTS (eos_updater_state_str) == EOS_UPDATER_N_STATES); + + g_return_val_if_fail ((gint) state < EOS_UPDATER_N_STATES, "unknown"); + return eos_updater_state_str[state]; +} + +static void +gs_eos_updater_error_convert (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return; + + /* parse remote eos-updater error */ + if (g_dbus_error_is_remote_error (error)) { + g_autofree gchar *remote_error = g_dbus_error_get_remote_error (error); + + g_dbus_error_strip_remote_error (error); + + if (g_str_equal (remote_error, "com.endlessm.Updater.Error.WrongState")) { + error->code = GS_PLUGIN_ERROR_FAILED; + } else if (g_str_equal (remote_error, "com.endlessm.Updater.Error.LiveBoot") || + g_str_equal (remote_error, "com.endlessm.Updater.Error.NotOstreeSystem") || + g_str_equal (remote_error, "org.freedesktop.DBus.Error.ServiceUnknown")) { + error->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + } else if (g_str_equal (remote_error, "com.endlessm.Updater.Error.WrongConfiguration")) { + error->code = GS_PLUGIN_ERROR_FAILED; + } else if (g_str_equal (remote_error, "com.endlessm.Updater.Error.Fetching")) { + error->code = GS_PLUGIN_ERROR_DOWNLOAD_FAILED; + } else if (g_str_equal (remote_error, "com.endlessm.Updater.Error.MalformedAutoinstallSpec") || + g_str_equal (remote_error, "com.endlessm.Updater.Error.UnknownEntryInAutoinstallSpec") || + g_str_equal (remote_error, "com.endlessm.Updater.Error.FlatpakRemoteConflict")) { + error->code = GS_PLUGIN_ERROR_FAILED; + } else if (g_str_equal (remote_error, "com.endlessm.Updater.Error.MeteredConnection")) { + error->code = GS_PLUGIN_ERROR_NO_NETWORK; + } else if (g_str_equal (remote_error, "com.endlessm.Updater.Error.Cancelled")) { + error->code = GS_PLUGIN_ERROR_CANCELLED; + } else { + g_warning ("Can’t reliably fixup remote error ‘%s’", remote_error); + error->code = GS_PLUGIN_ERROR_FAILED; + } + error->domain = GS_PLUGIN_ERROR; + return; + } + + /* this is allowed for low-level errors */ + if (gs_utils_error_convert_gio (perror)) + return; + + /* this is allowed for low-level errors */ + if (gs_utils_error_convert_gdbus (perror)) + return; +} + +/* the percentage of the progress bar to use for applying the OS upgrade; + * we need to fake the progress in this percentage because applying the OS upgrade + * can take a long time and we don't want the user to think that the upgrade has + * stalled */ +static const guint upgrade_apply_progress_range = 100 - max_progress_for_update; /* percent */ +static const gfloat upgrade_apply_max_time = 600.0; /* sec */ +static const gfloat upgrade_apply_step_time = 0.250; /* sec */ + +static void sync_state_from_updater (GsPluginEosUpdater *self); + +struct _GsPluginEosUpdater +{ + GsPlugin parent; + + /* These members are only set once in gs_plugin_eos_updater_setup(), and are + * internally thread-safe, so can be accessed without any locking. */ + GsEosUpdater *updater_proxy; /* (owned) */ + GsApp *os_upgrade; /* (owned); represents both large upgrades and small updates */ + GCancellable *cancellable; /* (owned) */ + gulong cancelled_id; + + /* These members must only ever be accessed from the main thread, so + * can be accessed without any locking. */ + gfloat upgrade_fake_progress; + guint upgrade_fake_progress_handler; +}; + +G_DEFINE_TYPE (GsPluginEosUpdater, gs_plugin_eos_updater, GS_TYPE_PLUGIN) + +static void +os_upgrade_cancelled_cb (GCancellable *cancellable, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (user_data); + + g_debug ("%s: Cancelling upgrade", G_STRFUNC); + gs_eos_updater_call_cancel (self->updater_proxy, + /* never interactive */ + G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + NULL, NULL, NULL); +} + +static gboolean +should_add_os_update_or_upgrade (GsAppState state) +{ + switch (state) { + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_AVAILABLE_LOCAL: + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_QUEUED_FOR_INSTALL: + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_DOWNLOADING: + case GS_APP_STATE_UPDATABLE_LIVE: + return TRUE; + case GS_APP_STATE_UNKNOWN: + case GS_APP_STATE_INSTALLED: + case GS_APP_STATE_UNAVAILABLE: + case GS_APP_STATE_REMOVING: + default: + return FALSE; + } +} + +static gboolean +should_add_os_upgrade (GsPluginEosUpdater *self) +{ + return (should_add_os_update_or_upgrade (gs_app_get_state (self->os_upgrade)) && + gs_app_has_quirk (self->os_upgrade, GS_APP_QUIRK_IS_PROXY)); +} + +static gboolean +should_add_os_update (GsPluginEosUpdater *self) +{ + return (should_add_os_update_or_upgrade (gs_app_get_state (self->os_upgrade)) && + !gs_app_has_quirk (self->os_upgrade, GS_APP_QUIRK_IS_PROXY)); +} + +/* Wrapper around gs_app_set_state() which ensures we also notify of update + * changes if we change between non-upgradable and upgradable states, so that + * the app is notified to appear in the UI. */ +static void +app_set_state (GsPlugin *plugin, + GsApp *app, + GsAppState new_state) +{ + GsAppState old_state = gs_app_get_state (app); + + if (new_state == old_state) + return; + + gs_app_set_state (app, new_state); + + if (should_add_os_update_or_upgrade (old_state) != + should_add_os_update_or_upgrade (new_state)) { + g_debug ("%s: Calling gs_plugin_updates_changed()", G_STRFUNC); + gs_plugin_updates_changed (plugin); + } +} + +static gboolean +eos_updater_error_is_cancelled (const gchar *error_name) +{ + return (g_strcmp0 (error_name, "com.endlessm.Updater.Error.Cancelled") == 0); +} + +static void +app_set_update_is_user_visible (GsApp *app, + gboolean update_is_user_visible) +{ + g_debug ("%s: Setting OS update as %s", G_STRFUNC, + update_is_user_visible ? "containing significant user visible changes" : "only containing non-user visible changes"); + + /* If the update contains significant user visible changes, we want to + * show it using the OS upgrade banner (#GsUpgradeBanner), which means + * it needs a certain set of metadata set on it. + * + * If it doesn’t contain significant user visible changes, we want to + * show it as a normal update row (a row in a #GsUpdatesSection), which + * means it needs different metadata. + * + * Other parts of the code in this plugin use the presence of + * #GS_APP_QUIRK_IS_PROXY to distinguish these two states. */ + if (update_is_user_visible) { + gs_app_add_quirk (app, GS_APP_QUIRK_IS_PROXY); + gs_app_set_special_kind (app, GS_APP_SPECIAL_KIND_OS_UPDATE); + } else { + gs_app_remove_quirk (app, GS_APP_QUIRK_IS_PROXY); + gs_app_set_special_kind (app, GS_APP_SPECIAL_KIND_NONE); + } +} + +/* This will be invoked in the main thread. */ +static void +updater_state_changed (GsPluginEosUpdater *self) +{ + g_debug ("%s", G_STRFUNC); + + sync_state_from_updater (self); +} + +/* This will be invoked in the main thread. */ +static void +updater_downloaded_bytes_changed (GsPluginEosUpdater *self) +{ + sync_state_from_updater (self); +} + +/* This will be invoked in the main thread. */ +static void +updater_version_changed (GsPluginEosUpdater *self) +{ + const gchar *version = gs_eos_updater_get_version (self->updater_proxy); + + /* If eos-updater goes away, we want to retain the previously set value + * of the version, for use in error messages. */ + if (version != NULL) + gs_app_set_version (self->os_upgrade, version); +} + +/* This will be invoked in the main thread. */ +static void +updater_update_is_user_visible_changed (GsPluginEosUpdater *self) +{ + gboolean update_is_user_visible = gs_eos_updater_get_update_is_user_visible (self->updater_proxy); + + app_set_update_is_user_visible (self->os_upgrade, update_is_user_visible); +} + +/* This will be invoked in the main thread. */ +static void +updater_release_notes_uri_changed (GsPluginEosUpdater *self) +{ + const gchar *release_notes_uri = gs_eos_updater_get_release_notes_uri (self->updater_proxy); + + /* @release_notes_uri may be the empty string, in which case we want to remove the URL */ + if (release_notes_uri != NULL && *release_notes_uri == '\0') + release_notes_uri = NULL; + + gs_app_set_url (self->os_upgrade, AS_URL_KIND_HOMEPAGE, release_notes_uri); +} + +/* This will be invoked in the main thread. */ +static gboolean +fake_os_upgrade_progress_cb (gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (user_data); + gfloat normal_step; + guint new_progress; + const gfloat fake_progress_max = 99.0; + + if (gs_eos_updater_get_state (self->updater_proxy) != EOS_UPDATER_STATE_APPLYING_UPDATE || + self->upgrade_fake_progress > fake_progress_max) { + self->upgrade_fake_progress = 0; + self->upgrade_fake_progress_handler = 0; + return G_SOURCE_REMOVE; + } + + normal_step = (gfloat) upgrade_apply_progress_range / + (upgrade_apply_max_time / upgrade_apply_step_time); + + self->upgrade_fake_progress += normal_step; + + new_progress = max_progress_for_update + + (guint) round (self->upgrade_fake_progress); + gs_app_set_progress (self->os_upgrade, + MIN (new_progress, (guint) fake_progress_max)); + + g_debug ("OS upgrade fake progress: %f", self->upgrade_fake_progress); + + return G_SOURCE_CONTINUE; +} + +/* This method deals with the synchronization between the EOS updater's states + * (D-Bus service) and the OS upgrade's states (GsApp), in order to show the user + * what is happening and what they can do. */ +static void +sync_state_from_updater (GsPluginEosUpdater *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + GsApp *app = self->os_upgrade; + EosUpdaterState state; + GsAppState previous_app_state = gs_app_get_state (app); + GsAppState current_app_state; + + /* in case the OS upgrade has been disabled */ + if (self->updater_proxy == NULL) { + g_debug ("%s: Updater disabled", G_STRFUNC); + return; + } + + state = gs_eos_updater_get_state (self->updater_proxy); + g_debug ("EOS Updater state changed: %s", eos_updater_state_to_str (state)); + + switch (state) { + case EOS_UPDATER_STATE_NONE: + case EOS_UPDATER_STATE_READY: { + app_set_state (plugin, app, GS_APP_STATE_UNKNOWN); + break; + } case EOS_UPDATER_STATE_POLLING: { + /* Nothing to do here. */ + break; + } case EOS_UPDATER_STATE_UPDATE_AVAILABLE: { + gint64 total_size; + + app_set_update_is_user_visible (app, gs_eos_updater_get_update_is_user_visible (self->updater_proxy)); + app_set_state (plugin, app, GS_APP_STATE_AVAILABLE); + + /* The property returns -1 to indicate unknown size */ + total_size = gs_eos_updater_get_download_size (self->updater_proxy); + if (total_size >= 0) + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, total_size); + else + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWN, 0); + + break; + } + case EOS_UPDATER_STATE_FETCHING: { + gint64 total_size = 0; + gint64 downloaded = 0; + guint progress = 0; + + /* FIXME: Set to QUEUED_FOR_INSTALL if we’re waiting for metered + * data permission. */ + app_set_state (plugin, app, GS_APP_STATE_DOWNLOADING); + + downloaded = gs_eos_updater_get_downloaded_bytes (self->updater_proxy); + total_size = gs_eos_updater_get_download_size (self->updater_proxy); + + if (total_size == 0) { + g_debug ("OS upgrade %s total size is 0!", + gs_app_get_unique_id (app)); + progress = GS_APP_PROGRESS_UNKNOWN; + } else if (downloaded < 0 || total_size < 0) { + /* Both properties return -1 to indicate unknown */ + progress = GS_APP_PROGRESS_UNKNOWN; + } else { + /* set progress only up to a max percentage, leaving the + * remaining for applying the update */ + progress = (gfloat) downloaded / (gfloat) total_size * + (gfloat) max_progress_for_update; + } + gs_app_set_progress (app, progress); + + break; + } + case EOS_UPDATER_STATE_UPDATE_READY: { + app_set_state (plugin, app, GS_APP_STATE_UPDATABLE); + + /* Nothing further to download. */ + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + + break; + } + case EOS_UPDATER_STATE_APPLYING_UPDATE: { + /* set as 'installing' because if it is applying the update, we + * want to show the progress bar */ + app_set_state (plugin, app, GS_APP_STATE_INSTALLING); + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + + /* set up the fake progress to inform the user that something + * is still being done (we don't get progress reports from + * deploying updates) */ + if (self->upgrade_fake_progress_handler != 0) + g_source_remove (self->upgrade_fake_progress_handler); + self->upgrade_fake_progress = 0; + self->upgrade_fake_progress_handler = + g_timeout_add ((guint) (1000.0 * upgrade_apply_step_time), + (GSourceFunc) fake_os_upgrade_progress_cb, + self); + + break; + } + case EOS_UPDATER_STATE_UPDATE_APPLIED: { + app_set_state (plugin, app, GS_APP_STATE_UPDATABLE); + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + + break; + } + case EOS_UPDATER_STATE_ERROR: { + const gchar *error_name; + const gchar *error_message; + + error_name = gs_eos_updater_get_error_name (self->updater_proxy); + error_message = gs_eos_updater_get_error_message (self->updater_proxy); + + /* unless the error is because the user cancelled the upgrade, + * we should make sure it gets in the journal */ + if (!eos_updater_error_is_cancelled (error_name)) + g_warning ("Got OS upgrade error state with name '%s': %s", + error_name, error_message); + + /* We can’t recover the app state since eos-updater needs to + * go through the ready → poll → fetch → apply loop again in + * order to recover its state. So go back to ‘unknown’. */ + app_set_state (plugin, app, GS_APP_STATE_UNKNOWN); + + /* Cancelling anything in the updater will result in a + * transition to the Error state. Use that as a cue to reset + * our #GCancellable ready for next time. */ + g_cancellable_reset (self->cancellable); + + break; + } + default: + g_warning ("Encountered unknown eos-updater state: %u", state); + break; + } + + current_app_state = gs_app_get_state (app); + + g_debug ("%s: Old app state: %s; new app state: %s", + G_STRFUNC, gs_app_state_to_string (previous_app_state), + gs_app_state_to_string (current_app_state)); + + /* if the state changed from or to 'unknown', we need to notify that a + * new update should be shown */ + if (should_add_os_update_or_upgrade (previous_app_state) != + should_add_os_update_or_upgrade (current_app_state)) { + g_debug ("%s: Calling gs_plugin_updates_changed()", G_STRFUNC); + gs_plugin_updates_changed (plugin); + } +} + +static void proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/* This is called in the main thread, so will end up creating an @updater_proxy + * which is tied to the main thread’s #GMainContext. */ +static void +gs_plugin_eos_updater_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_eos_updater_setup_async); + + g_debug ("%s", G_STRFUNC); + + self->cancellable = g_cancellable_new (); + self->cancelled_id = + g_cancellable_connect (self->cancellable, + G_CALLBACK (os_upgrade_cancelled_cb), + self, NULL); + + /* Check that the proxy exists (and is owned; it should auto-start) so + * we can disable the plugin for systems which don’t have eos-updater. + * Throughout the rest of the plugin, errors from the daemon + * (particularly where it has disappeared off the bus) are ignored, and + * the poll/fetch/apply sequence is run through again to recover from + * the error. This is the only point in the plugin where we consider an + * error from eos-updater to be fatal to the plugin. */ + gs_eos_updater_proxy_new (gs_plugin_get_system_bus_connection (plugin), + G_DBUS_PROXY_FLAGS_NONE, + "com.endlessm.Updater", + "/com/endlessm/Updater", + cancellable, + proxy_new_cb, + g_steal_pointer (&task)); +} + +static void +proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginEosUpdater *self = g_task_get_source_object (task); + g_autofree gchar *name_owner = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GIcon) ic = NULL; + g_autofree gchar *background_filename = NULL; + g_autofree gchar *css = NULL; + g_autofree gchar *summary = NULL; + g_autofree gchar *version = NULL; + gboolean update_is_user_visible = FALSE; + g_autoptr(GsOsRelease) os_release = NULL; + g_autoptr(GError) local_error = NULL; + const gchar *os_name, *os_logo; + + self->updater_proxy = gs_eos_updater_proxy_new_finish (result, &local_error); + if (self->updater_proxy == NULL) { + gs_eos_updater_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (self->updater_proxy)); + + if (name_owner == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED, + "Couldn’t create EOS Updater proxy: couldn’t get name owner"); + return; + } + + g_signal_connect_object (self->updater_proxy, "notify::state", + G_CALLBACK (updater_state_changed), + self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->updater_proxy, + "notify::downloaded-bytes", + G_CALLBACK (updater_downloaded_bytes_changed), + self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->updater_proxy, "notify::version", + G_CALLBACK (updater_version_changed), + self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->updater_proxy, "notify::update-is-user-visible", + G_CALLBACK (updater_update_is_user_visible_changed), + self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->updater_proxy, "notify::release-notes-uri", + G_CALLBACK (updater_release_notes_uri_changed), + self, G_CONNECT_SWAPPED); + + /* prepare EOS upgrade app + sync initial state */ + + /* Check for a background image in the standard location. */ + background_filename = gs_utils_get_upgrade_background (NULL); + + if (background_filename != NULL) + css = g_strconcat ("background: url('file://", background_filename, "');" + "background-size: 100% 100%;", NULL); + + os_release = gs_os_release_new (&local_error); + if (local_error) { + g_warning ("Failed to get OS release information: %s", local_error->message); + /* Just a fallback, do not localize */ + os_name = "Endless OS"; + os_logo = NULL; + g_clear_error (&local_error); + } else { + os_name = gs_os_release_get_name (os_release); + os_logo = gs_os_release_get_logo (os_release); + } + + g_object_get (G_OBJECT (self->updater_proxy), + "version", &version, + "update-is-user-visible", &update_is_user_visible, + "update-message", &summary, + NULL); + + if (summary == NULL || *summary == '\0') { + g_clear_pointer (&summary, g_free); + g_object_get (G_OBJECT (self->updater_proxy), + "update-label", &summary, + NULL); + } + + if (summary == NULL || *summary == '\0') { + g_clear_pointer (&summary, g_free); + /* Translators: The '%s' is replaced with the OS name, like "Endless OS" */ + summary = g_strdup_printf (_("%s update with new features and fixes."), os_name); + } + + /* use stock icon */ + ic = g_themed_icon_new ((os_logo != NULL) ? os_logo : "system-component-os-updates"); + + /* create the OS upgrade */ + app = gs_app_new ("com.endlessm.EOS.upgrade"); + gs_app_add_icon (app, ic); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_kind (app, AS_COMPONENT_KIND_OPERATING_SYSTEM); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, os_name); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, summary); + gs_app_set_version (app, version == NULL ? "" : version); + app_set_update_is_user_visible (app, update_is_user_visible); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_REVIEWABLE); + gs_app_set_management_plugin (app, GS_PLUGIN (self)); + gs_app_set_metadata (app, "GnomeSoftware::UpgradeBanner-css", css); + + self->os_upgrade = g_steal_pointer (&app); + + /* sync initial state */ + sync_state_from_updater (self); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_eos_updater_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_eos_updater_init (GsPluginEosUpdater *self) +{ +} + +static void +gs_plugin_eos_updater_dispose (GObject *object) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (object); + + if (self->upgrade_fake_progress_handler != 0) { + g_source_remove (self->upgrade_fake_progress_handler); + self->upgrade_fake_progress_handler = 0; + } + + if (self->updater_proxy != NULL) { + g_signal_handlers_disconnect_by_func (self->updater_proxy, + G_CALLBACK (updater_state_changed), + self); + g_signal_handlers_disconnect_by_func (self->updater_proxy, + G_CALLBACK (updater_downloaded_bytes_changed), + self); + g_signal_handlers_disconnect_by_func (self->updater_proxy, + G_CALLBACK (updater_version_changed), + self); + g_signal_handlers_disconnect_by_func (self->updater_proxy, + G_CALLBACK (updater_update_is_user_visible_changed), + self); + g_signal_handlers_disconnect_by_func (self->updater_proxy, + G_CALLBACK (updater_release_notes_uri_changed), + self); + } + + g_cancellable_cancel (self->cancellable); + if (self->cancellable != NULL && self->cancelled_id != 0) + g_cancellable_disconnect (self->cancellable, self->cancelled_id); + g_clear_object (&self->cancellable); + + g_clear_object (&self->updater_proxy); + + g_clear_object (&self->os_upgrade); + + G_OBJECT_CLASS (gs_plugin_eos_updater_parent_class)->dispose (object); +} + +static void poll_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/* Called in the main thread. */ +static void +gs_plugin_eos_updater_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (plugin); + EosUpdaterState updater_state; + g_autoptr(GTask) task = NULL; + gboolean interactive = flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_eos_updater_refresh_metadata_async); + + /* We let the eos-updater daemon do its own caching, so ignore the + * @cache_age_secs, unless it’s %G_MAXUINT64, which signifies startup of g-s. + * In that case, it’s probably just going to load the system too much to + * do an update check now. We can wait. */ + g_debug ("%s: cache_age_secs: %" G_GUINT64_FORMAT, G_STRFUNC, cache_age_secs); + + if (cache_age_secs == G_MAXUINT64) { + g_task_return_boolean (task, TRUE); + return; + } + + /* check if the OS upgrade has been disabled */ + if (self->updater_proxy == NULL) { + g_debug ("%s: Updater disabled", G_STRFUNC); + g_task_return_boolean (task, TRUE); + return; + } + + /* poll in the error/none/ready states to check if there's an + * update available */ + updater_state = gs_eos_updater_get_state (self->updater_proxy); + switch (updater_state) { + case EOS_UPDATER_STATE_ERROR: + case EOS_UPDATER_STATE_NONE: + case EOS_UPDATER_STATE_READY: + gs_eos_updater_call_poll (self->updater_proxy, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + poll_cb, + g_steal_pointer (&task)); + return; + default: + g_debug ("%s: Updater in state %s; not polling", + G_STRFUNC, eos_updater_state_to_str (updater_state)); + g_task_return_boolean (task, TRUE); + return; + } +} + +static void +poll_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsEosUpdater *updater_proxy = GS_EOS_UPDATER (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_eos_updater_call_poll_finish (updater_proxy, result, &local_error)) { + gs_eos_updater_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + g_task_return_boolean (task, TRUE); + } +} + +static gboolean +gs_plugin_eos_updater_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* Called in the main thread. */ +static void +gs_plugin_eos_updater_list_distro_upgrades_async (GsPlugin *plugin, + GsPluginListDistroUpgradesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_eos_updater_list_distro_upgrades_async); + + g_debug ("%s", G_STRFUNC); + + /* if we are testing the plugin, then always add the OS upgrade */ + if (g_getenv ("GS_PLUGIN_EOS_TEST") != NULL) { + gs_app_set_state (self->os_upgrade, GS_APP_STATE_AVAILABLE); + gs_app_list_add (list, self->os_upgrade); + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + return; + } + + /* check if the OS upgrade has been disabled */ + if (self->updater_proxy == NULL) { + g_debug ("%s: Updater disabled", G_STRFUNC); + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + return; + } + + if (should_add_os_upgrade (self)) { + g_debug ("Adding EOS upgrade as user visible OS upgrade: %s", + gs_app_get_unique_id (self->os_upgrade)); + gs_app_list_add (list, self->os_upgrade); + } else { + g_debug ("Not adding EOS upgrade as user visible OS upgrade"); + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_eos_updater_list_distro_upgrades_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_eos_updater_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (plugin); + g_autoptr(GTask) task = NULL; + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_eos_updater_list_apps_async); + + g_debug ("%s", G_STRFUNC); + + /* check if the OS upgrade has been disabled */ + if (self->updater_proxy == NULL) { + g_debug ("%s: Updater disabled", G_STRFUNC); + g_task_return_boolean (task, TRUE); + return; + } + + if (query != NULL) + is_for_update = gs_app_query_get_is_for_update (query); + + /* Currently only support a subset of query properties, and only one set at once. */ + if (is_for_update == GS_APP_QUERY_TRISTATE_UNSET || + is_for_update == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE) { + g_autoptr(GsAppList) list = gs_app_list_new (); + if (should_add_os_update (self)) { + g_debug ("Adding EOS upgrade as non-user visible OS update: %s", + gs_app_get_unique_id (self->os_upgrade)); + gs_app_list_add (list, self->os_upgrade); + } else { + g_debug ("Not adding EOS upgrade as non-user visible OS update"); + } + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + } else { + g_assert_not_reached (); + } +} + +static GsAppList * +gs_plugin_eos_updater_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +typedef struct { + EosUpdaterState old_state; + gulong notify_id; + gulong cancelled_id; + guint idle_id; +} WaitForStateChangeData; + +static void +wait_for_state_change_data_free (WaitForStateChangeData *data) +{ + /* These two should have been cleared already */ + g_assert (data->notify_id == 0); + g_assert (data->cancelled_id == 0); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (WaitForStateChangeData, wait_for_state_change_data_free); + +static void wait_for_state_change_cb (GTask *task); +static void wait_for_state_change_notify_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data); +static void wait_for_state_change_cancelled_cb (GCancellable *cancellable, + gpointer user_data); + +static void +object_unref_closure (gpointer data, + GClosure *closure) +{ + GObject *obj = G_OBJECT (data); + g_object_unref (obj); +} + +static void +wait_for_state_change_async (GsEosUpdater *updater_proxy, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(WaitForStateChangeData) data_owned = NULL; + WaitForStateChangeData *data; + + task = g_task_new (updater_proxy, cancellable, callback, user_data); + g_task_set_source_tag (task, wait_for_state_change_async); + + /* Store the initial state to compare against later. */ + data = data_owned = g_new0 (WaitForStateChangeData, 1); + data->old_state = gs_eos_updater_get_state (updater_proxy); + g_debug ("%s: Old state ‘%s’", G_STRFUNC, eos_updater_state_to_str (data->old_state)); + + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) wait_for_state_change_data_free); + + /* Listen for state changes. Connect late in the emission process so + * that the callback is invoked after the main updater_state_changed(), + * because that updates a load of internal state which the function + * calling this one might need. */ + data->notify_id = g_signal_connect_data (updater_proxy, "notify::state", + G_CALLBACK (wait_for_state_change_notify_cb), + g_object_ref (task), object_unref_closure, + G_CONNECT_AFTER); + data->cancelled_id = g_cancellable_connect (cancellable, + G_CALLBACK (wait_for_state_change_cancelled_cb), + g_object_ref (task), g_object_unref); +} + +static void +wait_for_state_change_cb (GTask *task_unowned) +{ + g_autoptr(GTask) task = g_object_ref (task_unowned); + WaitForStateChangeData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + GsEosUpdater *updater_proxy = g_task_get_source_object (task); + EosUpdaterState old_state, new_state; + + old_state = GPOINTER_TO_INT (g_task_get_task_data (task)); + new_state = gs_eos_updater_get_state (updater_proxy); + + if (new_state == old_state && + !g_cancellable_is_cancelled (cancellable)) + return; + + /* State has changed, or the wait has been cancelled. Disconnect, and + * return. */ + g_clear_signal_handler (&data->notify_id, updater_proxy); + g_cancellable_disconnect (cancellable, data->cancelled_id); + data->cancelled_id = 0; + + if (data->idle_id != 0) { + g_source_remove (data->idle_id); + data->idle_id = 0; + } + + if (g_task_return_error_if_cancelled (task)) { + g_debug ("%s: Cancelled", G_STRFUNC); + } else { + g_debug ("%s: New state ‘%s’", G_STRFUNC, eos_updater_state_to_str (new_state)); + g_task_return_boolean (task, TRUE); + } +} + +static void +wait_for_state_change_notify_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + wait_for_state_change_cb (task); +} + +static gboolean +wait_for_state_change_idle_cb (gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + WaitForStateChangeData *data = g_task_get_task_data (task); + /* it can be zeroed when the "state change" had been called meanwhile; + in that case the task is finished already */ + if (data->idle_id != 0) { + data->idle_id = 0; + wait_for_state_change_cb (task); + } + return G_SOURCE_REMOVE; +} + +static void +wait_for_state_change_cancelled_cb (GCancellable *cancellable, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + WaitForStateChangeData *data = g_task_get_task_data (task); + if (data->idle_id != 0) + return; + /* cannot call wait_for_state_change_cb() from the GCancellable::cancelled signal, + because it calls g_cancellable_disconnect(), which leads to deadlock, thus + postpone this to an idle callback */ + data->idle_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE, + wait_for_state_change_idle_cb, + g_object_ref (task), + g_object_unref); +} + +static gboolean +wait_for_state_change_finish (GsEosUpdater *updater_proxy, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* Could be executed in any thread. No need to hold a lock since we don’t + * access anything which is not thread-safe. */ +static void +cancelled_cb (GCancellable *ui_cancellable, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (user_data); + + /* Chain cancellation. */ + g_debug ("Propagating OS download cancellation from %p to %p", + ui_cancellable, self->cancellable); + g_cancellable_cancel (self->cancellable); +} + +/* State tracking for a single call to a D-Bus method on the updater proxy. + * + * This is designed so that multiple different async calls can all end up back + * in download_iterate_state_machine_cb(), which then advances the updater’s + * state machine. + * + * Given that different async calls have different `*_finish()` functions, a + * pointer to the finish function is needed: `finish_func()`. This is called + * to get the results of each async call. */ +typedef struct { + /* Input arguments. */ + GsApp *app; /* (not nullable) (owned) */ + GCancellable *cancellable; /* (nullable) (not owned) */ + gulong cancelled_id; + gboolean interactive; + + /* State. */ + gboolean done; + gboolean allow_restart; + + /* Completion callback. */ + gboolean (*finish_func) (GsEosUpdater *updater_proxy, + GAsyncResult *result, + GError **error); /* (nullable) */ +} UpgradeDownloadState; + +static void +upgrade_download_state_free (UpgradeDownloadState *data) +{ + g_clear_object (&data->app); + + if (data->cancellable != NULL && data->cancelled_id != 0) { + g_debug ("Disconnecting cancellable %p", data->cancellable); + g_cancellable_disconnect (data->cancellable, data->cancelled_id); + data->cancellable = NULL; + data->cancelled_id = 0; + } + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UpgradeDownloadState, upgrade_download_state_free) + +static void download_iterate_state_machine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/* Called in a #GTask worker thread or in the main thread. */ +static void +gs_plugin_eos_updater_app_upgrade_download_async (GsPluginEosUpdater *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(UpgradeDownloadState) data_owned = NULL; + UpgradeDownloadState *data; + EosUpdaterState state; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_eos_updater_app_upgrade_download_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) { + g_task_return_boolean (task, TRUE); + return; + } + + /* if the OS upgrade has been disabled */ + if (self->updater_proxy == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + "The OS upgrade has been disabled in the EOS plugin"); + return; + } + + g_assert (app == self->os_upgrade); + + /* Set up some state. */ + data = data_owned = g_new0 (UpgradeDownloadState, 1); + data->app = g_object_ref (app); + data->interactive = interactive; + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) upgrade_download_state_free); + + /* Set up cancellation. */ + g_debug ("Chaining cancellation from %p to %p", cancellable, self->cancellable); + if (cancellable != NULL) { + data->cancellable = cancellable; /* ref is held by @task */ + data->cancelled_id = g_cancellable_connect (cancellable, + G_CALLBACK (cancelled_cb), + self, NULL); + } + + /* Step through the state machine until we are finished downloading and + * applying the update, or until an error occurs. + * + * Each step is a call to download_iterate_state_machine_cb(). The first + * call is below, and subsequent calls come from async function + * completions. + * + * `data->done` is %TRUE once we reach the `UPDATE_APPLIED` state. + * + * `data->allow_restart` indicates whether the state machine can be + * restarted to clear an error condition, or whether the error should be + * propagated (because the machine has already been restarted). This + * prevents infinite loops. */ + state = gs_eos_updater_get_state (self->updater_proxy); + + data->done = FALSE; + data->allow_restart = (state == EOS_UPDATER_STATE_NONE || + state == EOS_UPDATER_STATE_READY || + state == EOS_UPDATER_STATE_ERROR); + + download_iterate_state_machine_cb (G_OBJECT (self->updater_proxy), NULL, g_steal_pointer (&task)); +} + +static gboolean +is_wrong_state_error (const GError *error) +{ + g_autofree gchar *remote_error = NULL; + + if (!g_dbus_error_is_remote_error (error)) + return FALSE; + + remote_error = g_dbus_error_get_remote_error (error); + + return g_str_equal (remote_error, "com.endlessm.Updater.Error.WrongState"); +} + +static void +download_iterate_state_machine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginEosUpdater *self = g_task_get_source_object (task); + UpgradeDownloadState *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + EosUpdaterState state; + + /* Call the finish function from the asynchronous method call which has + * just completed and brought us back into + * download_iterate_state_machine_cb(). + * + * This may be %NULL if the state machine is just being started. */ + if (data->finish_func != NULL) { + g_autoptr(GError) local_error = NULL; + + if (!data->finish_func (self->updater_proxy, result, &local_error)) { + /* Ignore WrongState errors, since we explicitly synchronise + * to the daemon’s state again below, so should be able + * to recover from them. The user can’t do anything + * about them anyway. */ + if (is_wrong_state_error (local_error)) { + g_debug ("Got WrongState error from eos-updater daemon; ignoring."); + g_clear_error (&local_error); + } else { + gs_eos_updater_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + data->finish_func = NULL; + } else { + g_assert (result == NULL); + } + + /* Iterate the state machine one step. */ + while (!data->done && !g_cancellable_is_cancelled (cancellable)) { + state = gs_eos_updater_get_state (self->updater_proxy); + g_debug ("%s: State ‘%s’", G_STRFUNC, eos_updater_state_to_str (state)); + + switch (state) { + case EOS_UPDATER_STATE_NONE: + case EOS_UPDATER_STATE_READY: { + /* Poll for an update. This typically only happens if + * we’ve drifted out of sync with the updater process + * due to it dying. In that case, only restart once + * before giving up, so we don’t end up in an endless + * loop (say, if eos-updater always died 50% of the way + * through a download). */ + if (data->allow_restart) { + data->allow_restart = FALSE; + g_debug ("Restarting OS upgrade from none/ready state"); + + data->finish_func = gs_eos_updater_call_poll_finish; + gs_eos_updater_call_poll (self->updater_proxy, + data->interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + download_iterate_state_machine_cb, + g_steal_pointer (&task)); + return; + } else { + /* Display an error to the user. */ + g_autoptr(GError) error_local = NULL; + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error_literal (&error_local, GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + _("EOS update service could not fetch and apply the update.")); + gs_eos_updater_error_convert (&error_local); + + event = gs_plugin_event_new ("app", data->app, + "action", GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD, + "error", error_local, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + if (data->interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_report_event (GS_PLUGIN (self), event); + + /* Error out. */ + data->done = TRUE; + } + + break; + } case EOS_UPDATER_STATE_POLLING: { + /* Nothing to do here. */ + break; + } case EOS_UPDATER_STATE_UPDATE_AVAILABLE: { + g_auto(GVariantDict) options_dict = G_VARIANT_DICT_INIT (NULL); + + /* when the OS upgrade was started by the user and the + * updater reports an available update, (meaning we were + * polling before), we should readily call fetch */ + g_variant_dict_insert (&options_dict, "force", "b", TRUE); + + data->finish_func = gs_eos_updater_call_fetch_full_finish; + gs_eos_updater_call_fetch_full (self->updater_proxy, + g_variant_dict_end (&options_dict), + data->interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + download_iterate_state_machine_cb, + g_steal_pointer (&task)); + return; + } + case EOS_UPDATER_STATE_FETCHING: { + /* Nothing to do here. */ + break; + } + case EOS_UPDATER_STATE_UPDATE_READY: { + /* if there's an update ready to deployed, and it was started by + * the user, we should proceed to applying the upgrade */ + gs_app_set_progress (data->app, max_progress_for_update); + + /* Nothing further to download. */ + gs_app_set_size_download (data->app, GS_SIZE_TYPE_VALID, 0); + + data->finish_func = gs_eos_updater_call_apply_finish; + gs_eos_updater_call_apply (self->updater_proxy, + data->interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + download_iterate_state_machine_cb, + g_steal_pointer (&task)); + return; + } + case EOS_UPDATER_STATE_APPLYING_UPDATE: { + /* Nothing to do here. */ + break; + } + case EOS_UPDATER_STATE_UPDATE_APPLIED: { + /* Done! */ + data->done = TRUE; + break; + } + case EOS_UPDATER_STATE_ERROR: { + const gchar *error_name; + const gchar *error_message; + g_autoptr(GError) error_local = NULL; + + error_name = gs_eos_updater_get_error_name (self->updater_proxy); + error_message = gs_eos_updater_get_error_message (self->updater_proxy); + error_local = g_dbus_error_new_for_dbus_error (error_name, error_message); + + /* Display an error to the user, unless they cancelled + * the download. */ + if (!eos_updater_error_is_cancelled (error_name)) { + g_autoptr(GsPluginEvent) event = NULL; + + gs_eos_updater_error_convert (&error_local); + + event = gs_plugin_event_new ("app", data->app, + "action", GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD, + "error", error_local, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + if (data->interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_report_event (GS_PLUGIN (self), event); + } + + /* Unconditionally call Poll() to get the updater out + * of the error state and to allow the update to be + * displayed in the UI again and retried. Exit the + * state change loop immediately by setting data->done, + * though, to prevent possible endless loops between the + * Poll/Error states. */ + data->allow_restart = FALSE; + data->done = TRUE; + g_debug ("Restarting OS upgrade on error"); + + data->finish_func = gs_eos_updater_call_poll_finish; + gs_eos_updater_call_poll (self->updater_proxy, + data->interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + download_iterate_state_machine_cb, + g_steal_pointer (&task)); + return; + } + default: + g_warning ("Encountered unknown eos-updater state: %u", state); + break; + } + + /* Block on the next state change. */ + if (!data->done) { + data->finish_func = wait_for_state_change_finish; + wait_for_state_change_async (self->updater_proxy, cancellable, download_iterate_state_machine_cb, g_steal_pointer (&task)); + return; + } + } + + /* Process the final state. */ + if (gs_eos_updater_get_state (self->updater_proxy) == EOS_UPDATER_STATE_ERROR) { + const gchar *error_name; + const gchar *error_message; + g_autoptr(GError) error_local = NULL; + + error_name = gs_eos_updater_get_error_name (self->updater_proxy); + error_message = gs_eos_updater_get_error_message (self->updater_proxy); + error_local = g_dbus_error_new_for_dbus_error (error_name, error_message); + gs_eos_updater_error_convert (&error_local); + + g_task_return_error (task, g_steal_pointer (&error_local)); + } else if (!g_task_return_error_if_cancelled (task)) { + g_task_return_boolean (task, TRUE); + } +} + +static gboolean +gs_plugin_eos_updater_app_upgrade_download_finish (GsPluginEosUpdater *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void upgrade_download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/* Called in the main thread. + * + * It’s used to download the update if it’s been listed in the UI as a major + * upgrade. The download process is the same. */ +static void +gs_plugin_eos_updater_download_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginDownloadUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE) != 0; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_eos_updater_download_upgrade_async); + + g_debug ("%s", G_STRFUNC); + + gs_plugin_eos_updater_app_upgrade_download_async (self, app, interactive, cancellable, upgrade_download_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_eos_updater_download_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* Called in the main thread. + * + * It’s used to download the update if it’s been listed in the UI as a minor + * update. The download process is the same. */ +static void +gs_plugin_eos_updater_update_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (plugin); + g_autoptr(GTask) task = NULL; + GsApp *app; + guint n_managed_apps = 0; + gboolean interactive = (flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_eos_updater_update_apps_async); + + g_debug ("%s", G_STRFUNC); + + /* check if the OS upgrade has been disabled */ + if (self->updater_proxy == NULL) { + g_debug ("%s: Updater disabled", G_STRFUNC); + g_task_return_boolean (task, TRUE); + return; + } + + /* Find the app for the OS upgrade in the list of apps. It might not be present. */ + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app_i = gs_app_list_index (apps, i); + + if (gs_app_has_management_plugin (app_i, plugin)) { + app = app_i; + n_managed_apps++; + } + } + + if (n_managed_apps == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + g_assert (n_managed_apps == 1); + + if (!(flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD)) { + /* Download the update. + * FIXME: Progress reporting */ + gs_plugin_eos_updater_app_upgrade_download_async (self, app, interactive, cancellable, upgrade_download_cb, g_steal_pointer (&task)); + } else { + g_task_return_boolean (task, TRUE); + } +} + +static void +upgrade_download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_eos_updater_app_upgrade_download_finish (self, result, &local_error)) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_eos_updater_update_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_eos_updater_class_init (GsPluginEosUpdaterClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_eos_updater_dispose; + + plugin_class->setup_async = gs_plugin_eos_updater_setup_async; + plugin_class->setup_finish = gs_plugin_eos_updater_setup_finish; + plugin_class->refresh_metadata_async = gs_plugin_eos_updater_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_eos_updater_refresh_metadata_finish; + plugin_class->list_distro_upgrades_async = gs_plugin_eos_updater_list_distro_upgrades_async; + plugin_class->list_distro_upgrades_finish = gs_plugin_eos_updater_list_distro_upgrades_finish; + plugin_class->update_apps_async = gs_plugin_eos_updater_update_apps_async; + plugin_class->update_apps_finish = gs_plugin_eos_updater_update_apps_finish; + plugin_class->list_apps_async = gs_plugin_eos_updater_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_eos_updater_list_apps_finish; + plugin_class->download_upgrade_async = gs_plugin_eos_updater_download_upgrade_async; + plugin_class->download_upgrade_finish = gs_plugin_eos_updater_download_upgrade_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_EOS_UPDATER; +} diff --git a/plugins/eos-updater/gs-plugin-eos-updater.h b/plugins/eos-updater/gs-plugin-eos-updater.h new file mode 100644 index 0000000..f4ee6df --- /dev/null +++ b/plugins/eos-updater/gs-plugin-eos-updater.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_EOS_UPDATER (gs_plugin_eos_updater_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginEosUpdater, gs_plugin_eos_updater, GS, PLUGIN_EOS_UPDATER, GsPlugin) + +G_END_DECLS diff --git a/plugins/eos-updater/meson.build b/plugins/eos-updater/meson.build new file mode 100644 index 0000000..e1e2830 --- /dev/null +++ b/plugins/eos-updater/meson.build @@ -0,0 +1,22 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginEosUpdater"'] + +eos_updater_generated = gnome.gdbus_codegen( + 'gs-eos-updater-generated', + sources : ['com.endlessm.Updater.xml'], + interface_prefix : 'com.endlessm.', + namespace : 'GsEos', + extra_args : [ '--glib-min-required=' + glib.version() ], +) + +shared_module( + 'gs_plugin_eos-updater', + eos_updater_generated, + sources : 'gs-plugin-eos-updater.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : [ + plugin_libs, + ostree, + ], +) diff --git a/plugins/eos-updater/tests/eos_updater.py b/plugins/eos-updater/tests/eos_updater.py new file mode 100644 index 0000000..4cc0c6c --- /dev/null +++ b/plugins/eos-updater/tests/eos_updater.py @@ -0,0 +1,445 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# +# Copyright © 2019 Endless Mobile, Inc. +# +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA + +'''eos-updater mock template + +This creates a mock eos-updater interface (com.endlessm.Updater), with several +methods on the Mock sidecar interface which allow its internal state flow to be +controlled. + +A typical call chain for this would be: + - Test harness calls SetPollAction('update', {}, '', '') + - SUT calls Poll() + - Test harness calls FinishPoll() + - SUT calls Fetch() + - Test harness calls FinishFetch() + - SUT calls Apply() + - Test harness calls FinishApply() + +Errors can be simulated by specifying an `early-error` or `late-error` as the +action in a Set*Action() call. `early-error` will result in the associated +Poll() call (for example) transitioning to the error state. `late-error` will +result in a transition to the error state only once (for example) FinishPoll() +is called. + +See the implementation of each Set*Action() method for the set of actions it +supports. + +Usage: + python3 -m dbusmock \ + --template ./eos-updater/tests/eos_updater.py +''' + +from enum import IntEnum +from gi.repository import GLib +import time + +import dbus +import dbus.mainloop.glib +from dbusmock import MOCK_IFACE + + +__author__ = 'Philip Withnall' +__email__ = 'pwithnall@endlessos.org' +__copyright__ = '© 2019 Endless Mobile Inc.' +__license__ = 'LGPL 2.1+' + + +class UpdaterState(IntEnum): + NONE = 0 + READY = 1 + ERROR = 2 + POLLING = 3 + UPDATE_AVAILABLE = 4 + FETCHING = 5 + UPDATE_READY = 6 + APPLYING_UPDATE = 7 + UPDATE_APPLIED = 8 + + +BUS_NAME = 'com.endlessm.Updater' +MAIN_OBJ = '/com/endlessm/Updater' +MAIN_IFACE = 'com.endlessm.Updater' +SYSTEM_BUS = True + + +dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) + + +def load(mock, parameters): + mock.AddProperties( + MAIN_IFACE, + dbus.Dictionary({ + 'State': dbus.UInt32(parameters.get('State', 1)), + 'UpdateID': dbus.String(parameters.get('UpdateID', '')), + 'UpdateRefspec': dbus.String(parameters.get('UpdateRefspec', '')), + 'OriginalRefspec': + dbus.String(parameters.get('OriginalRefspec', '')), + 'CurrentID': dbus.String(parameters.get('CurrentID', '')), + 'UpdateLabel': dbus.String(parameters.get('UpdateLabel', '')), + 'UpdateMessage': dbus.String(parameters.get('UpdateMessage', '')), + 'Version': dbus.String(parameters.get('Version', '')), + 'UpdateIsUserVisible': + dbus.Boolean(parameters.get('UpdateIsUserVisible', False)), + 'ReleaseNotesUri': + dbus.String(parameters.get('ReleaseNotesUri', '')), + 'DownloadSize': dbus.Int64(parameters.get('DownloadSize', 0)), + 'DownloadedBytes': + dbus.Int64(parameters.get('DownloadedBytes', 0)), + 'UnpackedSize': dbus.Int64(parameters.get('UnpackedSize', 0)), + 'FullDownloadSize': + dbus.Int64(parameters.get('FullDownloadSize', 0)), + 'FullUnpackedSize': + dbus.Int64(parameters.get('FullUnpackedSize', 0)), + 'ErrorCode': dbus.UInt32(parameters.get('ErrorCode', 0)), + 'ErrorName': dbus.String(parameters.get('ErrorName', '')), + 'ErrorMessage': dbus.String(parameters.get('ErrorMessage', '')), + }, signature='sv')) + + # Set up initial state + mock.__poll_action = 'no-update' + mock.__fetch_action = 'success' + mock.__apply_action = 'success' + + # Set up private methods + mock.__set_properties = __set_properties + mock.__change_state = __change_state + mock.__set_error = __set_error + mock.__check_state = __check_state + + +# +# Internal utility methods +# + +# Values in @properties must have variant_level≥1 +def __set_properties(self, iface, properties): + for key, value in properties.items(): + self.props[iface][key] = value + self.EmitSignal(dbus.PROPERTIES_IFACE, 'PropertiesChanged', 'sa{sv}as', [ + iface, + properties, + [], + ]) + + +def __change_state(self, new_state): + props = { + 'State': dbus.UInt32(new_state, variant_level=1) + } + + # Reset error state if necessary. + if new_state != UpdaterState.ERROR and \ + self.props[MAIN_IFACE]['ErrorName'] != '': + props['ErrorCode'] = dbus.UInt32(0, variant_level=1) + props['ErrorName'] = dbus.String('', variant_level=1) + props['ErrorMessage'] = dbus.String('', variant_level=1) + + self.__set_properties(self, MAIN_IFACE, props) + self.EmitSignal(MAIN_IFACE, 'StateChanged', 'u', [dbus.UInt32(new_state)]) + + +def __set_error(self, error_name, error_message): + assert(error_name != '') + + self.__set_properties(self, MAIN_IFACE, { + 'ErrorName': dbus.String(error_name, variant_level=1), + 'ErrorMessage': dbus.String(error_message, variant_level=1), + 'ErrorCode': dbus.UInt32(1, variant_level=1), + }) + self.__change_state(self, UpdaterState.ERROR) + + +def __check_state(self, allowed_states): + if self.props[MAIN_IFACE]['State'] not in allowed_states: + raise dbus.exceptions.DBusException( + 'Call not allowed in this state', + name='com.endlessm.Updater.Error.WrongState') + + +# +# Updater methods which are too big for squeezing into AddMethod() +# + +@dbus.service.method(MAIN_IFACE, in_signature='', out_signature='') +def Poll(self): + self.__check_state(self, set([ + UpdaterState.READY, + UpdaterState.UPDATE_AVAILABLE, + UpdaterState.UPDATE_READY, + UpdaterState.ERROR, + ])) + + self.__change_state(self, UpdaterState.POLLING) + + if self.__poll_action == 'early-error': + # Simulate some network polling activity + time.sleep(0.5) + + self.__set_error(self, self.__poll_error_name, + self.__poll_error_message) + else: + # we now expect the test harness to call FinishPoll() on the mock + # interface + pass + + +@dbus.service.method(MAIN_IFACE, in_signature='s', out_signature='') +def PollVolume(self, path): + # FIXME: Currently unsupported + return self.Poll() + + +@dbus.service.method(MAIN_IFACE, in_signature='', out_signature='') +def Fetch(self): + return self.FetchFull() + + +@dbus.service.method(MAIN_IFACE, in_signature='a{sv}', out_signature='') +def FetchFull(self, options=None): + self.__check_state(self, set([UpdaterState.UPDATE_AVAILABLE])) + + self.__change_state(self, UpdaterState.FETCHING) + + if self.__fetch_action == 'early-error': + # Simulate some network fetching activity + time.sleep(0.5) + + self.__set_error(self, self.__fetch_error_name, + self.__fetch_error_message) + else: + # we now expect the test harness to call FinishFetch() on the mock + # interface + pass + + +@dbus.service.method(MAIN_IFACE, in_signature='', out_signature='') +def Apply(self): + self.__check_state(self, set([UpdaterState.UPDATE_READY])) + + self.__change_state(self, UpdaterState.APPLYING_UPDATE) + + if self.__apply_action == 'early-error': + # Simulate some disk applying activity + time.sleep(0.5) + + self.__set_error(self, self.__apply_error_name, + self.__apply_error_message) + else: + # we now expect the test harness to call FinishApply() on the mock + # interface + pass + + +@dbus.service.method(MAIN_IFACE, in_signature='', out_signature='') +def Cancel(self): + self.__check_state(self, set([ + UpdaterState.POLLING, + UpdaterState.FETCHING, + UpdaterState.APPLYING_UPDATE, + ])) + + # Simulate some work to cancel whatever’s happening + time.sleep(1) + + self.__set_error(self, 'com.endlessm.Updater.Error.Cancelled', + 'Update was cancelled') + + +# +# Convenience methods on the mock +# + +@dbus.service.method(MOCK_IFACE, in_signature='sa{sv}ss', out_signature='') +def SetPollAction(self, action, update_properties, error_name, error_message): + '''Set the action to happen when the SUT calls Poll(). + + This sets the action which will happen when Poll() (and subsequently + FinishPoll()) are called, including the details of the error which will be + returned or the new update which will be advertised. + ''' + # Provide a default update. + if not update_properties: + update_properties = { + 'UpdateID': dbus.String('f' * 64, variant_level=1), + 'UpdateRefspec': + dbus.String('remote:new-refspec', variant_level=1), + 'OriginalRefspec': + dbus.String('remote:old-refspec', variant_level=1), + 'CurrentID': dbus.String('1' * 64, variant_level=1), + 'UpdateLabel': dbus.String('New OS Update', variant_level=1), + 'UpdateMessage': + dbus.String('Some release notes.', variant_level=1), + 'Version': dbus.String('3.7.0', variant_level=1), + 'UpdateIsUserVisible': dbus.Boolean(False, variant_level=1), + 'ReleaseNotesUri': + dbus.String('https://example.com/release-notes', variant_level=1), + 'DownloadSize': dbus.Int64(1000000000, variant_level=1), + 'UnpackedSize': dbus.Int64(1500000000, variant_level=1), + 'FullDownloadSize': dbus.Int64(1000000000 * 0.8, variant_level=1), + 'FullUnpackedSize': dbus.Int64(1500000000 * 0.8, variant_level=1), + } + + self.__poll_action = action + self.__poll_update_properties = update_properties + self.__poll_error_name = error_name + self.__poll_error_message = error_message + + +@dbus.service.method(MOCK_IFACE, in_signature='', out_signature='') +def FinishPoll(self): + self.__check_state(self, set([UpdaterState.POLLING])) + + if self.__poll_action == 'no-update': + self.__change_state(self, UpdaterState.READY) + elif self.__poll_action == 'update': + assert(set([ + 'UpdateID', + 'UpdateRefspec', + 'OriginalRefspec', + 'CurrentID', + 'UpdateLabel', + 'UpdateMessage', + 'Version', + 'UpdateIsUserVisible', + 'ReleaseNotesUri', + 'FullDownloadSize', + 'FullUnpackedSize', + 'DownloadSize', + 'UnpackedSize', + ]) <= set(self.__poll_update_properties.keys())) + + # Set the initial DownloadedBytes based on whether we know the full + # download size. + props = self.__poll_update_properties + if props['DownloadSize'] < 0: + props['DownloadedBytes'] = dbus.Int64(-1, variant_level=1) + else: + props['DownloadedBytes'] = dbus.Int64(0, variant_level=1) + + self.__set_properties(self, MAIN_IFACE, props) + self.__change_state(self, UpdaterState.UPDATE_AVAILABLE) + elif self.__poll_action == 'early-error': + # Handled in Poll() itself. + pass + elif self.__poll_action == 'late-error': + self.__set_error(self, self.__poll_error_name, + self.__poll_error_message) + else: + assert(False) + + +@dbus.service.method(MOCK_IFACE, in_signature='sss', out_signature='') +def SetFetchAction(self, action, error_name, error_message): + '''Set the action to happen when the SUT calls Fetch(). + + This sets the action which will happen when Fetch() (and subsequently + FinishFetch()) are called, including the details of the error which will be + returned, if applicable. + ''' + self.__fetch_action = action + self.__fetch_error_name = error_name + self.__fetch_error_message = error_message + + +@dbus.service.method(MOCK_IFACE, in_signature='', out_signature='', + async_callbacks=('success_cb', 'error_cb')) +def FinishFetch(self, success_cb, error_cb): + '''Finish a pending client call to Fetch(). + + This is implemented using async_callbacks since if the fetch action is + ‘success’ it will block until the simulated download is complete, emitting + download progress signals throughout. As it’s implemented asynchronously, + this allows any calls to Cancel() to be handled by the mock service + part-way through the fetch. + ''' + self.__check_state(self, set([UpdaterState.FETCHING])) + + if self.__fetch_action == 'success': + # Simulate the download. + i = 0 + download_size = self.props[MAIN_IFACE]['DownloadSize'] + + def _download_progress_cb(): + nonlocal i + + # Allow cancellation. + if self.props[MAIN_IFACE]['State'] != UpdaterState.FETCHING: + return False + + downloaded_bytes = (i / 100.0) * download_size + self.__set_properties(self, MAIN_IFACE, { + 'DownloadedBytes': + dbus.Int64(downloaded_bytes, variant_level=1), + }) + + i += 1 + + # Keep looping until the download is complete. + if i <= 100: + return True + + # When the download is complete, change the service state and + # finish the asynchronous FinishFetch() call. + self.__change_state(self, UpdaterState.UPDATE_READY) + success_cb() + return False + + GLib.timeout_add(100, _download_progress_cb) + elif self.__fetch_action == 'early-error': + # Handled in Fetch() itself. + success_cb() + elif self.__fetch_action == 'late-error': + self.__set_error(self, self.__fetch_error_name, + self.__fetch_error_message) + success_cb() + else: + assert(False) + + +@dbus.service.method(MOCK_IFACE, in_signature='sss', out_signature='') +def SetApplyAction(self, action, error_name, error_message): + '''Set the action to happen when the SUT calls Apply(). + + This sets the action which will happen when Apply() (and subsequently + FinishApply()) are called, including the details of the error which will be + returned, if applicable. + ''' + self.__apply_action = action + self.__apply_error_name = error_name + self.__apply_error_message = error_message + + +@dbus.service.method(MOCK_IFACE, in_signature='', out_signature='') +def FinishApply(self): + self.__check_state(self, set([UpdaterState.APPLYING_UPDATE])) + + if self.__apply_action == 'success': + self.__change_state(self, UpdaterState.UPDATE_APPLIED) + elif self.__apply_action == 'early-error': + # Handled in Apply() itself. + pass + elif self.__apply_action == 'late-error': + self.__set_error(self, self.__apply_error_name, + self.__apply_error_message) + else: + assert(False) diff --git a/plugins/eos-updater/tests/manual-test.py b/plugins/eos-updater/tests/manual-test.py new file mode 100755 index 0000000..b6413d9 --- /dev/null +++ b/plugins/eos-updater/tests/manual-test.py @@ -0,0 +1,434 @@ +#!/usr/bin/python3 + +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1+ of the License, or (at your option) +# any later version. See http://www.gnu.org/copyleft/lgpl.html for the full +# text of the license. +# +# The LGPL 2.1+ has been chosen as that’s the license eos-updater is under. + + +from enum import IntEnum +import os +import time +import unittest +import dbus +import dbusmock +import ddt + + +__author__ = 'Philip Withnall' +__email__ = 'withnall@endlessm.com' +__copyright__ = '© 2019 Endless Mobile Inc.' +__license__ = 'LGPL 2.1+' + + +class UpdaterState(IntEnum): + '''eos-updater states; see its State property''' + NONE = 0 + READY = 1 + ERROR = 2 + POLLING = 3 + UPDATE_AVAILABLE = 4 + FETCHING = 5 + UPDATE_READY = 6 + APPLYING_UPDATE = 7 + UPDATE_APPLIED = 8 + + +@ddt.ddt +class ManualTest(dbusmock.DBusTestCase): + '''A manual test of the eos-updater plugin in gnome-software. + + It creates a mock eos-updater D-Bus daemon, on the real system bus (because + otherwise gnome-software’s other plugins can’t communicate with their + system daemons; to fix this, we’d need to mock those up too). The test + harness provides the user with instructions about how to run gnome-software + and what to do in it, waiting for them to press enter between steps. + + FIXME: This test could potentially eventually be automated by doing the UI + steps using Dogtail or OpenQA. + + It tests various classes of interaction between the plugin and the daemon: + normal update process (with and without an update available); error returns + from the daemon; cancellation of the daemon by another process; + cancellation of the daemon from gnome-software; and the daemon unexpectedly + going away (i.e. crashing). + ''' + + @classmethod + def setUpClass(cls): + # FIXME: See the comment below about why we currently run on the actual + # system bus. + # cls.start_system_bus() + cls.dbus_con = cls.get_dbus(True) + + def setUp(self): + # Work out the path to the dbusmock template in the same directory as + # this file. + self_path = os.path.dirname(os.path.realpath(__file__)) + template_path = os.path.join(self_path, 'eos_updater.py') + + # Spawn a python-dbusmock server. Use the actual system bus, since + # gnome-software needs to access various other services (such as + # packagekit) which we don’t currently mock (FIXME). + (self.p_mock, self.obj_eos_updater) = self.spawn_server_template( + template_path, {}, stdout=None) + self.dbusmock = dbus.Interface(self.obj_eos_updater, + dbusmock.MOCK_IFACE) + + def tearDown(self): + self.kill_gnome_software() + self.p_mock.terminate() + self.p_mock.wait() + + def launch_gnome_software(self): + '''Instruct the user to launch gnome-software''' + print('Launch gnome-software with:') + print('gnome-software --verbose') + self.manual_check('Press enter to continue') + + def kill_gnome_software(self): + '''Instruct the user to kill gnome-software''' + print('Kill gnome-software with:') + print('pkill gnome-software') + self.manual_check('Press enter to continue') + + def await_state(self, state): + '''Block until eos-updater reaches the given `state`''' + print('Awaiting state %u' % state) + props_iface = dbus.Interface(self.obj_eos_updater, + dbus.PROPERTIES_IFACE) + while props_iface.Get('com.endlessm.Updater', 'State') != state: + time.sleep(0.2) + + def manual_check(self, prompt): + '''Instruct the user to do a manual check and block until done''' + input('\033[92;1m' + prompt + '\033[0m\n') + + def test_poll_no_update(self): + '''Test that no updates are shown if eos-updater successfully says + there are none.''' + self.dbusmock.SetPollAction( + 'no-update', dbus.Dictionary({}, signature='sv'), '', '') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + self.manual_check('Check there are no EOS updates listed') + self.await_state(UpdaterState.READY) + + @ddt.data('com.endlessm.Updater.Error.WrongState', + 'com.endlessm.Updater.Error.LiveBoot', + 'com.endlessm.Updater.Error.WrongConfiguration', + 'com.endlessm.Updater.Error.NotOstreeSystem', + 'com.endlessm.Updater.Error.Cancelled') + def test_poll_early_error(self, error_name): + '''Test that a D-Bus error return from Poll() is handled correctly.''' + self.dbusmock.SetPollAction( + 'early-error', dbus.Dictionary({}, signature='sv'), + error_name, 'Some error message.') + + self.launch_gnome_software() + self.await_state(UpdaterState.ERROR) + + if error_name != 'com.endlessm.Updater.Error.Cancelled': + self.manual_check('Check there are no EOS updates listed, and a ' + 'GsPluginEosUpdater error is printed on the ' + 'terminal') + else: + self.manual_check('Check there are no EOS updates listed, and no ' + 'GsPluginEosUpdater cancellation error is ' + 'printed on the terminal') + + @ddt.data('com.endlessm.Updater.Error.WrongState', + 'com.endlessm.Updater.Error.LiveBoot', + 'com.endlessm.Updater.Error.WrongConfiguration', + 'com.endlessm.Updater.Error.NotOstreeSystem', + 'com.endlessm.Updater.Error.Cancelled') + def test_poll_late_error(self, error_name): + '''Test that a transition to the Error state after successfully calling + Poll() is handled correctly.''' + self.dbusmock.SetPollAction( + 'late-error', dbus.Dictionary({}, signature='sv'), + error_name, 'Some error message.') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + if error_name != 'com.endlessm.Updater.Error.Cancelled': + self.manual_check('Check there are no EOS updates listed, and a ' + 'GsPluginEosUpdater error is printed on the ' + 'terminal') + else: + self.manual_check('Check there are no EOS updates listed, and no ' + 'GsPluginEosUpdater cancellation error is ' + 'printed on the terminal') + self.await_state(UpdaterState.ERROR) + + @ddt.data(True, False) + def test_update_available(self, manually_refresh): + '''Test that the entire update process works if an update is + available.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + self.dbusmock.SetFetchAction('success', '', '') + self.dbusmock.SetApplyAction('success', '', '') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + if manually_refresh: + self.manual_check('Check an EOS update is listed; press the ' + 'Refresh button') + + # TODO: if you proceed through the test slowly, this sometimes doesn’t + # work + self.manual_check('Check an EOS update is listed; press the Download ' + 'button') + self.await_state(UpdaterState.FETCHING) + self.dbusmock.FinishFetch() + + self.manual_check('Check the download has paused at ~75% complete ' + '(waiting to apply)') + self.await_state(UpdaterState.APPLYING_UPDATE) + self.dbusmock.FinishApply() + + self.manual_check('Check the banner says to ‘Restart Now’ (don’t ' + 'click it)') + self.await_state(UpdaterState.UPDATE_APPLIED) + + @ddt.data('com.endlessm.Updater.Error.WrongState', + 'com.endlessm.Updater.Error.WrongConfiguration', + 'com.endlessm.Updater.Error.Fetching', + 'com.endlessm.Updater.Error.MalformedAutoinstallSpec', + 'com.endlessm.Updater.Error.UnknownEntryInAutoinstallSpec', + 'com.endlessm.Updater.Error.FlatpakRemoteConflict', + 'com.endlessm.Updater.Error.MeteredConnection', + 'com.endlessm.Updater.Error.Cancelled') + def test_fetch_early_error(self, error_name): + '''Test that a D-Bus error return from Fetch() is handled correctly.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + self.dbusmock.SetFetchAction('early-error', error_name, + 'Some error or other.') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + self.manual_check('Check an EOS update is listed; press the Download ' + 'button') + + if error_name != 'com.endlessm.Updater.Error.Cancelled': + self.manual_check('Check a fetch error is displayed') + else: + self.manual_check('Check no cancellation error is displayed') + + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + self.manual_check('Check an EOS update is listed again') + + @ddt.data('com.endlessm.Updater.Error.WrongState', + 'com.endlessm.Updater.Error.WrongConfiguration', + 'com.endlessm.Updater.Error.Fetching', + 'com.endlessm.Updater.Error.MalformedAutoinstallSpec', + 'com.endlessm.Updater.Error.UnknownEntryInAutoinstallSpec', + 'com.endlessm.Updater.Error.FlatpakRemoteConflict', + 'com.endlessm.Updater.Error.MeteredConnection', + 'com.endlessm.Updater.Error.Cancelled') + def test_fetch_late_error(self, error_name): + '''Test that a transition to the Error state after successfully calling + Fetch() is handled correctly.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + self.dbusmock.SetFetchAction('late-error', error_name, + 'Some error or other.') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + self.manual_check('Check an EOS update is listed; press the Download ' + 'button') + self.await_state(UpdaterState.FETCHING) + self.dbusmock.FinishFetch() + + self.await_state(UpdaterState.ERROR) + if error_name != 'com.endlessm.Updater.Error.Cancelled': + self.manual_check('Check a fetch error is displayed') + else: + self.manual_check('Check no cancellation error is displayed') + + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + self.manual_check('Check an EOS update is listed again') + + @ddt.data('com.endlessm.Updater.Error.WrongState', + 'com.endlessm.Updater.Error.WrongConfiguration', + 'com.endlessm.Updater.Error.Cancelled') + def test_apply_early_error(self, error_name): + '''Test that a D-Bus error return from Apply() is handled correctly.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + self.dbusmock.SetFetchAction('success', '', '') + self.dbusmock.SetApplyAction('early-error', error_name, + 'Some error or other.') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + self.manual_check('Check an EOS update is listed; press the Download ' + 'button') + self.await_state(UpdaterState.FETCHING) + self.dbusmock.FinishFetch() + + self.await_state(UpdaterState.ERROR) + if error_name != 'com.endlessm.Updater.Error.Cancelled': + self.manual_check('Check an apply error is displayed after the ' + 'update reached ~75% completion') + else: + self.manual_check('Check no cancellation error is displayed after ' + 'the update reached ~75% completion') + + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + self.manual_check('Check an EOS update is listed again') + + @ddt.data('com.endlessm.Updater.Error.WrongState', + 'com.endlessm.Updater.Error.WrongConfiguration', + 'com.endlessm.Updater.Error.Cancelled') + def test_apply_late_error(self, error_name): + '''Test that a transition to the Error state after successfully calling + Apply() is handled correctly.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + self.dbusmock.SetFetchAction('success', '', '') + self.dbusmock.SetApplyAction('late-error', error_name, + 'Some error or other.') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + self.manual_check('Check an EOS update is listed; press the Download ' + 'button') + self.await_state(UpdaterState.FETCHING) + self.dbusmock.FinishFetch() + + self.manual_check('Check the download has paused at ~75% complete ' + '(waiting to apply)') + self.await_state(UpdaterState.APPLYING_UPDATE) + self.dbusmock.FinishApply() + + self.await_state(UpdaterState.ERROR) + if error_name != 'com.endlessm.Updater.Error.Cancelled': + self.manual_check('Check an apply error is displayed') + else: + self.manual_check('Check no cancellation error is displayed') + + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + self.manual_check('Check an EOS update is listed again') + + def test_no_eos_updater_running(self): + '''Test that the plugin doesn’t make a fuss if eos-updater is + unavailable.''' + self.p_mock.kill() + + self.launch_gnome_software() + + self.manual_check('Check there are no EOS updates listed, and no ' + 'errors shown') + + def test_fetch_ui_cancellation(self): + '''Test that cancelling a download from the UI works correctly.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + self.dbusmock.SetFetchAction('success', '', '') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + self.manual_check('Check an EOS update is listed; press the Download ' + 'button, then shortly afterwards press the Cancel ' + 'button') + self.await_state(UpdaterState.FETCHING) + self.dbusmock.FinishFetch() + + self.await_state(UpdaterState.ERROR) + self.manual_check('Check a fetch cancellation error is displayed') + + def test_poll_eos_updater_dies(self): + '''Test that gnome-software recovers if eos-updater dies while + polling for updates.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.p_mock.kill() + + self.manual_check('Check no error is shown for the poll failure') + self.setUp() + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + + self.manual_check('Press the Refresh button and check an update is ' + 'shown') + # TODO: It may take a few minutes for the update to appear on the + # updates page + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + def test_fetch_eos_updater_dies(self): + '''Test that gnome-software recovers if eos-updater dies while + fetching an update.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + self.dbusmock.SetFetchAction('success', '', '') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + self.manual_check('Check an EOS update is listed; press the Download ' + 'button') + self.await_state(UpdaterState.FETCHING) + self.p_mock.kill() + + self.manual_check('Check an error is shown for the fetch failure') + + def test_apply_eos_updater_dies(self): + '''Test that gnome-software recovers if eos-updater dies while + applying an update.''' + self.dbusmock.SetPollAction( + 'update', dbus.Dictionary({}, signature='sv'), '', '') + self.dbusmock.SetFetchAction('success', '', '') + self.dbusmock.SetApplyAction('success', '', '') + + self.launch_gnome_software() + self.await_state(UpdaterState.POLLING) + self.dbusmock.FinishPoll() + + self.manual_check('Check an EOS update is listed; press the Download ' + 'button') + self.await_state(UpdaterState.FETCHING) + self.dbusmock.FinishFetch() + + self.manual_check('Check the download has paused at ~75% complete ' + '(waiting to apply)') + self.await_state(UpdaterState.APPLYING_UPDATE) + self.p_mock.kill() + + self.manual_check('Check an error is shown for the apply failure') + + +if __name__ == '__main__': + unittest.main() diff --git a/plugins/epiphany/gs-plugin-epiphany.c b/plugins/epiphany/gs-plugin-epiphany.c new file mode 100644 index 0000000..11d2858 --- /dev/null +++ b/plugins/epiphany/gs-plugin-epiphany.c @@ -0,0 +1,1639 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021-2022 Matthew Leeds + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include +#include +#include +#include + +#include "gs-epiphany-generated.h" +#include "gs-plugin-epiphany.h" +#include "gs-plugin-private.h" + +/* + * SECTION: + * This plugin uses Epiphany to install, launch, and uninstall web applications. + * + * If the org.gnome.Epiphany.WebAppProvider D-Bus interface is not present or + * the DynamicLauncher portal is not available then it self-disables. This + * should work with both Flatpak'd and traditionally packaged Epiphany, for new + * enough versions of Epiphany. + * + * It's worth noting that this plugin has to deal with two different app IDs + * for installed web apps: + * + * 1. The app ID used in the element in the AppStream metainfo file, which + * looks like "org.gnome.Software.WebApp_527a2dd6729c3574227c145bbc447997f0048537.desktop" + * See https://gitlab.gnome.org/mwleeds/gnome-pwa-list/-/blob/6e8b17b018f99dbf00b1fa956ed75c4a0ccbf389/pwa-metainfo-generator.py#L84-89 + * This app ID is used for gs_app_new() so that the appstream plugin + * refines the apps created here, and used for the plugin cache. + * + * 2. The app ID generated by Epiphany when installing a web app, which looks + * like "org.gnome.Epiphany.WebApp_e9d0e1e4b0a10856aa3b38d9eb4375de4070d043.desktop" + * though it can have a different prefix if Epiphany was built with, for + * example, a development profile. Throughout this plugin this type of app + * ID is handled with a variable called "installed_app_id". This app ID is + * used in method calls to the org.gnome.Epiphany.WebAppProvider interface, + * and used for gs_app_set_launchable() and g_desktop_app_info_new(). + * + * Since: 43 + */ + +struct _GsPluginEpiphany +{ + GsPlugin parent; + + GsWorkerThread *worker; /* (owned) */ + + GsEphyWebAppProvider *epiphany_proxy; /* (owned) */ + GDBusProxy *launcher_portal_proxy; /* (owned) */ + GFileMonitor *monitor; /* (owned) */ + guint changed_id; + /* protects installed_apps_cached, url_id_map, and the plugin cache */ + GMutex installed_apps_mutex; + /* installed_apps_cached: whether the plugin cache has all installed apps */ + gboolean installed_apps_cached; + GHashTable *url_id_map; /* (owned) (not nullable) (element-type utf8 utf8) */ + + /* default permissions, shared between all applications */ + GsAppPermissions *permissions; /* (owned) (not nullable) */ +}; + +G_DEFINE_TYPE (GsPluginEpiphany, gs_plugin_epiphany, GS_TYPE_PLUGIN) + +#define assert_in_worker(self) \ + g_assert (gs_worker_thread_is_in_worker_context (self->worker)) + +static void +gs_epiphany_error_convert (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return; + + /* parse remote epiphany-webapp-provider error */ + if (g_dbus_error_is_remote_error (error)) { + g_autofree gchar *remote_error = g_dbus_error_get_remote_error (error); + + g_dbus_error_strip_remote_error (error); + + if (g_str_equal (remote_error, "org.freedesktop.DBus.Error.ServiceUnknown")) { + error->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + } else if (g_str_has_prefix (remote_error, "org.gnome.Epiphany.WebAppProvider.Error")) { + error->code = GS_PLUGIN_ERROR_FAILED; + } else { + g_warning ("Can’t reliably fixup remote error ‘%s’", remote_error); + error->code = GS_PLUGIN_ERROR_FAILED; + } + error->domain = GS_PLUGIN_ERROR; + return; + } + + /* this is allowed for low-level errors */ + if (gs_utils_error_convert_gio (perror)) + return; + + /* this is allowed for low-level errors */ + if (gs_utils_error_convert_gdbus (perror)) + return; +} + +/* Run in the main thread. */ +static void +gs_plugin_epiphany_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (user_data); + + { + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->installed_apps_mutex); + gs_plugin_cache_invalidate (GS_PLUGIN (self)); + g_hash_table_remove_all (self->url_id_map); + self->installed_apps_cached = FALSE; + } + + /* FIXME: With the current API this is the only way to reload the list + * of installed apps. + */ + gs_plugin_reload (GS_PLUGIN (self)); +} + +static void +epiphany_web_app_provider_proxy_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +dynamic_launcher_portal_proxy_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_epiphany_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + g_autofree char *portal_apps_path = NULL; + g_autoptr(GFile) portal_apps_file = NULL; + GDBusConnection *connection; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_epiphany_setup_async); + + g_debug ("%s", G_STRFUNC); + + self->installed_apps_cached = FALSE; + + /* This is a mapping from URL to app ID, where the app ID comes from + * Epiphany. This allows us to use that app ID rather than the + * AppStream app ID in certain contexts (see the comment at the top of + * this file). + */ + self->url_id_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + /* Watch for changes to the set of installed apps in the main thread. + * This will also trigger when other apps' dynamic launchers are + * installed or removed but that is expected to be infrequent. + */ + portal_apps_path = g_build_filename (g_get_user_data_dir (), "xdg-desktop-portal", "applications", NULL); + portal_apps_file = g_file_new_for_path (portal_apps_path); + /* Monitoring the directory works even if it doesn't exist yet */ + self->monitor = g_file_monitor_directory (portal_apps_file, G_FILE_MONITOR_WATCH_MOVES, + cancellable, &local_error); + if (self->monitor == NULL) { + gs_epiphany_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + self->changed_id = g_signal_connect (self->monitor, "changed", + G_CALLBACK (gs_plugin_epiphany_changed_cb), self); + + connection = gs_plugin_get_session_bus_connection (GS_PLUGIN (self)); + g_assert (connection != NULL); + + gs_ephy_web_app_provider_proxy_new (connection, + G_DBUS_PROXY_FLAGS_NONE, + "org.gnome.Epiphany.WebAppProvider", + "/org/gnome/Epiphany/WebAppProvider", + cancellable, + epiphany_web_app_provider_proxy_created_cb, + g_steal_pointer (&task)); +} + +static void +epiphany_web_app_provider_proxy_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + g_autofree gchar *name_owner = NULL; + g_autoptr(GError) local_error = NULL; + GsPluginEpiphany *self = g_task_get_source_object (task); + GDBusConnection *connection; + GCancellable *cancellable; + + /* Check that the proxy exists (and is owned; it should auto-start) so + * we can disable the plugin for systems which don’t have new enough + * Epiphany. + */ + self->epiphany_proxy = gs_ephy_web_app_provider_proxy_new_finish (result, &local_error); + + if (self->epiphany_proxy == NULL) { + gs_epiphany_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (self->epiphany_proxy)); + if (name_owner == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED, + "Couldn’t create Epiphany WebAppProvider proxy: couldn’t get name owner"); + return; + } + + connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (self->epiphany_proxy)); + cancellable = g_task_get_cancellable (task); + + g_dbus_proxy_new (connection, + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.DynamicLauncher", + cancellable, + dynamic_launcher_portal_proxy_created_cb, + g_steal_pointer (&task)); +} + +static void +dynamic_launcher_portal_proxy_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + g_autoptr(GVariant) version = NULL; + g_autoptr(GError) local_error = NULL; + GsPluginEpiphany *self = g_task_get_source_object (task); + + /* Check that the proxy exists (and is owned; it should auto-start) so + * we can disable the plugin for systems which don’t have new enough + * Epiphany. + */ + self->launcher_portal_proxy = g_dbus_proxy_new_finish (result, &local_error); + + if (self->launcher_portal_proxy == NULL) { + gs_epiphany_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + version = g_dbus_proxy_get_cached_property (self->launcher_portal_proxy, "version"); + if (version == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED, + "Dynamic launcher portal not available"); + return; + } else { + g_debug ("Found version %" G_GUINT32_FORMAT " of the dynamic launcher portal", + g_variant_get_uint32 (version)); + } + + /* Start up a worker thread to process all the plugin’s function calls. */ + self->worker = gs_worker_thread_new ("gs-plugin-epiphany"); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_epiphany_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_epiphany_shutdown_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_epiphany_shutdown_async); + + /* Stop the worker thread. */ + gs_worker_thread_shutdown_async (self->worker, cancellable, shutdown_cb, g_steal_pointer (&task)); +} + +static void +shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginEpiphany *self = g_task_get_source_object (task); + g_autoptr(GsWorkerThread) worker = NULL; + g_autoptr(GError) local_error = NULL; + + worker = g_steal_pointer (&self->worker); + + if (!gs_worker_thread_shutdown_finish (worker, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_epiphany_shutdown_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_epiphany_init (GsPluginEpiphany *self) +{ + /* Re-used permissions by all GsApp instances; do not modify it out + of this place. */ + self->permissions = gs_app_permissions_new (); + gs_app_permissions_set_flags (self->permissions, GS_APP_PERMISSIONS_FLAGS_NETWORK); + gs_app_permissions_seal (self->permissions); + + /* set name of MetaInfo file */ + gs_plugin_set_appstream_id (GS_PLUGIN (self), "org.gnome.Software.Plugin.Epiphany"); + + /* need help from appstream */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + + /* prioritize over packages */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_BETTER_THAN, "packagekit"); +} + +static void +gs_plugin_epiphany_dispose (GObject *object) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (object); + + if (self->changed_id > 0) { + g_signal_handler_disconnect (self->monitor, self->changed_id); + self->changed_id = 0; + } + + g_clear_object (&self->epiphany_proxy); + g_clear_object (&self->launcher_portal_proxy); + g_clear_object (&self->monitor); + g_clear_object (&self->worker); + g_clear_pointer (&self->url_id_map, g_hash_table_unref); + + G_OBJECT_CLASS (gs_plugin_epiphany_parent_class)->dispose (object); +} + +static void +gs_plugin_epiphany_finalize (GObject *object) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (object); + + g_mutex_clear (&self->installed_apps_mutex); + g_clear_object (&self->permissions); + + G_OBJECT_CLASS (gs_plugin_epiphany_parent_class)->finalize (object); +} + +static gboolean ensure_installed_apps_cache (GsPluginEpiphany *self, + gboolean interactive, + GCancellable *cancellable, + GError **error); + +/* May be run in @worker or in main thread. The caller must have already done ensure_installed_apps_cache() */ +static void +gs_epiphany_refine_app_state (GsPlugin *plugin, + GsApp *app) +{ + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) { + g_autoptr(GsApp) cached_app = NULL; + const char *appstream_source; + + /* If we have a cached app, set the state from there. Otherwise + * only set the state to available if the app came from + * appstream data, because there's no way to re-install an app + * in Software that was originally installed from Epiphany, + * unless we have appstream metainfo for it. + */ + cached_app = gs_plugin_cache_lookup (plugin, gs_app_get_id (app)); + appstream_source = gs_app_get_metadata_item (app, "appstream::source-file"); + if (cached_app) + gs_app_set_state (app, gs_app_get_state (cached_app)); + else if (appstream_source) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + else { + gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + gs_app_set_url_missing (app, + "help:gnome-software/how-to-reinstall-a-web-app"); + } + } +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, + GsApp *app) +{ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_WEB_APP && + gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_PACKAGE) { + gs_app_set_management_plugin (app, plugin); + } +} + +static gint +get_priority_for_interactivity (gboolean interactive) +{ + return interactive ? G_PRIORITY_DEFAULT : G_PRIORITY_LOW; +} + +static void list_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_epiphany_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_list_apps_data_new_task (plugin, query, flags, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_epiphany_list_apps_async); + + /* Queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + list_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker */ +static void +refine_app (GsPluginEpiphany *self, + GsApp *app, + GsPluginRefineFlags flags, + GUri *uri, + const char *url) +{ + const char *hostname; + const char *installed_app_id; + const struct { + const gchar *hostname; + const gchar *license_spdx; + } app_licenses[] = { + /* Keep in alphabetical order by hostname */ + { "app.diagrams.net", "Apache-2.0" }, + { "devdocs.io", "MPL-2.0" }, + { "discourse.flathub.org", "GPL-2.0-or-later" }, + { "discourse.gnome.org", "GPL-2.0-or-later" }, + { "excalidraw.com", "MIT" }, + { "pinafore.social", "AGPL-3.0-only" }, + { "snapdrop.net", "GPL-3.0-only" }, + { "stackedit.io", "Apache-2.0" }, + { "squoosh.app", "Apache-2.0" }, + }; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (uri != NULL); + g_return_if_fail (url != NULL); + + gs_app_set_origin (app, "gnome-web"); + if (gs_app_get_name (app) == NULL) + gs_app_set_origin_ui (app, _("Web App")); + else + gs_app_set_origin_ui (app, gs_app_get_name (app)); + gs_app_set_origin_hostname (app, g_uri_get_host (uri)); + gs_app_set_metadata (app, "GnomeSoftware::PackagingFormat", _("Web App")); + gs_app_set_metadata (app, "GnomeSoftware::PackagingIcon", "web-browser-symbolic"); + + gs_app_set_scope (app, AS_COMPONENT_SCOPE_USER); + gs_app_set_launchable (app, AS_LAUNCHABLE_KIND_URL, url); + + installed_app_id = g_hash_table_lookup (self->url_id_map, url); + if (installed_app_id) { + gs_app_set_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID, installed_app_id); + } + + /* Hard-code the licenses as it's hard to get them programmatically. We + * can move them to an AppStream file if needed. + */ + hostname = g_uri_get_host (uri); + if (gs_app_get_license (app) == NULL && hostname != NULL) { + for (gsize i = 0; i < G_N_ELEMENTS (app_licenses); i++) { + if (g_str_equal (hostname, app_licenses[i].hostname)) { + gs_app_set_license (app, GS_APP_QUALITY_NORMAL, + app_licenses[i].license_spdx); + break; + } + } + } + + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + + /* Use the default permissions */ + gs_app_set_permissions (app, self->permissions); + + if (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE) == NULL) + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, url); + + /* Use the domain name (e.g. "discourse.gnome.org") as a fallback summary. + * FIXME: Fetch the summary from the site's webapp manifest. + */ + if (gs_app_get_summary (app) == NULL) { + if (hostname != NULL && *hostname != '\0') + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, hostname); + else + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, url); + } + + if (installed_app_id == NULL) + return; + + { + const gchar *name; + g_autofree char *icon_path = NULL; + goffset desktop_size = 0, icon_size = 0; + g_autoptr(GDesktopAppInfo) desktop_info = NULL; + g_autoptr(GFileInfo) file_info = NULL; + g_autoptr(GFile) icon_file = NULL; + + desktop_info = g_desktop_app_info_new (installed_app_id); + + if (desktop_info == NULL) { + g_warning ("Couldn't get GDesktopAppInfo for app %s", installed_app_id); + return; + } + + name = g_app_info_get_name (G_APP_INFO (desktop_info)); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, name); + + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) { + g_autoptr(GFile) desktop_file = NULL; + const gchar *desktop_path; + guint64 install_date = 0; + + desktop_path = g_desktop_app_info_get_filename (desktop_info); + g_assert (desktop_path); + desktop_file = g_file_new_for_path (desktop_path); + + file_info = g_file_query_info (desktop_file, + G_FILE_ATTRIBUTE_TIME_CREATED "," G_FILE_ATTRIBUTE_STANDARD_SIZE, + 0, NULL, NULL); + if (file_info) { + install_date = g_file_info_get_attribute_uint64 (file_info, G_FILE_ATTRIBUTE_TIME_CREATED); + desktop_size = g_file_info_get_size (file_info); + } + if (install_date) { + gs_app_set_install_date (app, install_date); + } + } + + icon_path = g_desktop_app_info_get_string (desktop_info, "Icon"); + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE && + icon_path) { + icon_file = g_file_new_for_path (icon_path); + + g_clear_object (&file_info); + file_info = g_file_query_info (icon_file, + G_FILE_ATTRIBUTE_STANDARD_SIZE, + 0, NULL, NULL); + if (file_info) + icon_size = g_file_info_get_size (file_info); + } + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON && + !gs_app_has_icons (app) && + icon_path) { + g_autoptr(GIcon) icon = g_file_icon_new (icon_file); + g_autofree char *icon_dir = g_path_get_dirname (icon_path); + g_autofree char *icon_dir_basename = g_path_get_basename (icon_dir); + const char *x; + guint64 width = 0; + + /* dir should be either scalable or e.g. 512x512 */ + if (g_strcmp0 (icon_dir_basename, "scalable") == 0) { + /* Ensure scalable icons are preferred */ + width = 4096; + } else if ((x = strchr (icon_dir_basename, 'x')) != NULL) { + g_ascii_string_to_unsigned (x + 1, 10, 1, G_MAXINT, &width, NULL); + } + if (width > 0 && width <= 4096) { + gs_icon_set_width (icon, width); + gs_icon_set_height (icon, width); + } else { + g_warning ("Unexpectedly unable to determine width of icon %s", icon_path); + } + + gs_app_add_icon (app, icon); + } + if (desktop_size > 0 || icon_size > 0) { + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, desktop_size + icon_size); + } + } +} + +/* Run in @worker */ +static GsApp * +gs_epiphany_create_app (GsPluginEpiphany *self, + const char *id) +{ + g_autoptr(GsApp) app = NULL; + + assert_in_worker (self); + + app = gs_plugin_cache_lookup (GS_PLUGIN (self), id); + if (app != NULL) + return g_steal_pointer (&app); + + app = gs_app_new (id); + gs_app_set_management_plugin (app, GS_PLUGIN (self)); + gs_app_set_kind (app, AS_COMPONENT_KIND_WEB_APP); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (GS_PLUGIN (self))); + + gs_plugin_cache_add (GS_PLUGIN (self), id, app); + return g_steal_pointer (&app); +} + +static gchar * /* (transfer full) */ +generate_app_id_for_url (const gchar *url) +{ + /* Generate the app ID used in the AppStream data using the + * same method as pwa-metainfo-generator.py in + * https://gitlab.gnome.org/mwleeds/gnome-pwa-list + * Using this app ID rather than the one provided by Epiphany + * makes it possible for the appstream plugin to refine the + * GsApp we create (see the comment at the top of this file). + */ + g_autofree gchar *url_hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1, url, -1); + return g_strconcat ("org.gnome.Software.WebApp_", url_hash, ".desktop", NULL); +} + +/* Run in @worker */ +static gboolean +ensure_installed_apps_cache (GsPluginEpiphany *self, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_auto(GStrv) webapps = NULL; + guint n_webapps; + g_autoptr(GsAppList) installed_cache = gs_app_list_new (); + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->installed_apps_mutex); + + assert_in_worker (self); + + if (self->installed_apps_cached) + return TRUE; + + if (!gs_ephy_web_app_provider_call_get_installed_apps_sync (self->epiphany_proxy, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + &webapps, + cancellable, + error)) { + gs_epiphany_error_convert (error); + return FALSE; + } + + n_webapps = g_strv_length (webapps); + g_debug ("%s: epiphany-webapp-provider returned %u installed web apps", G_STRFUNC, n_webapps); + for (guint i = 0; i < n_webapps; i++) { + const gchar *desktop_file_id = webapps[i]; + const gchar *url = NULL; + g_autofree char *metainfo_app_id = NULL; + const gchar *exec; + int argc; + GsPluginRefineFlags refine_flags; + g_auto(GStrv) argv = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GDesktopAppInfo) desktop_info = NULL; + g_autoptr(GUri) uri = NULL; + + g_debug ("%s: Working on installed web app %s", G_STRFUNC, desktop_file_id); + + desktop_info = g_desktop_app_info_new (desktop_file_id); + + if (desktop_info == NULL) { + g_warning ("Epiphany returned a non-existent or invalid desktop ID %s", desktop_file_id); + continue; + } + + /* This way of getting the URL is a bit hacky but it's what + * Epiphany does, specifically in + * ephy_web_application_for_profile_directory() which lives in + * https://gitlab.gnome.org/GNOME/epiphany/-/blob/master/lib/ephy-web-app-utils.c + */ + exec = g_app_info_get_commandline (G_APP_INFO (desktop_info)); + if (g_shell_parse_argv (exec, &argc, &argv, NULL)) { + g_assert (argc > 0); + url = argv[argc - 1]; + } + if (!url || !(uri = g_uri_parse (url, G_URI_FLAGS_NONE, NULL))) { + g_warning ("Failed to parse URL for web app %s: %s", + desktop_file_id, url ? url : "(null)"); + continue; + } + + /* Store the installed app id for use in refine_app() */ + g_hash_table_insert (self->url_id_map, g_strdup (url), + g_strdup (desktop_file_id)); + + metainfo_app_id = generate_app_id_for_url (url); + g_debug ("Creating GsApp for webapp with URL %s using app ID %s (desktop file id: %s)", + url, metainfo_app_id, desktop_file_id); + + /* App gets added to the plugin cache here */ + app = gs_epiphany_create_app (self, metainfo_app_id); + + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + + refine_flags = GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID; + refine_app (self, app, refine_flags, uri, url); + } + + /* Update the state on any apps that were uninstalled outside + * gnome-software + */ + gs_plugin_cache_lookup_by_state (GS_PLUGIN (self), installed_cache, GS_APP_STATE_INSTALLED); + for (guint i = 0; i < gs_app_list_length (installed_cache); i++) { + GsApp *app = gs_app_list_index (installed_cache, i); + const char *installed_app_id; + const char *appstream_source; + + installed_app_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID); + if (installed_app_id == NULL) { + g_warning ("Installed app unexpectedly has no desktop id: %s", gs_app_get_id (app)); + continue; + } + + if (g_strv_contains ((const char * const *)webapps, installed_app_id)) + continue; + + gs_plugin_cache_remove (GS_PLUGIN (self), gs_app_get_id (app)); + + appstream_source = gs_app_get_metadata_item (app, "appstream::source-file"); + if (appstream_source) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + else + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + } + + self->installed_apps_cached = TRUE; + return TRUE; +} + +/* Run in @worker */ +static void +list_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (source_object); + g_autoptr(GsAppList) list = gs_app_list_new (); + GsPluginListAppsData *data = task_data; + GsAppQueryTristate is_installed = GS_APP_QUERY_TRISTATE_UNSET; + const gchar * const *keywords = NULL; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (data->query != NULL) { + is_installed = gs_app_query_get_is_installed (data->query); + keywords = gs_app_query_get_keywords (data->query); + } + + /* Currently only support a subset of query properties, and only one set at once. + * Also don’t currently support GS_APP_QUERY_TRISTATE_FALSE. */ + if ((is_installed == GS_APP_QUERY_TRISTATE_UNSET && + keywords == NULL) || + is_installed == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (data->query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + /* Ensure the cache is up to date. */ + if (!ensure_installed_apps_cache (self, data->flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (is_installed == GS_APP_QUERY_TRISTATE_TRUE) + gs_plugin_cache_lookup_by_state (GS_PLUGIN (self), list, GS_APP_STATE_INSTALLED); + else if (keywords != NULL) { + for (gsize i = 0; keywords[i]; i++) { + GHashTableIter iter; + gpointer key, value; + g_hash_table_iter_init (&iter, self->url_id_map); + while (g_hash_table_iter_next (&iter, &key, &value)) { + const gchar *url = key; + const gchar *app_id = value; + if (g_strcmp0 (app_id, keywords[i]) == 0) { + g_autoptr(GsApp) app = NULL; + g_autofree gchar *metainfo_app_id = NULL; + metainfo_app_id = generate_app_id_for_url (url); + app = gs_plugin_cache_lookup (GS_PLUGIN (self), metainfo_app_id); + if (app != NULL) + gs_app_list_add (list, app); + break; + } + } + } + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_epiphany_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_plugin_epiphany_list_apps_async, FALSE); + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_epiphany_refine_app (GsPluginEpiphany *self, + GsApp *app, + GsPluginRefineFlags refine_flags, + const char *url) +{ + g_autoptr(GUri) uri = NULL; + + g_return_if_fail (url != NULL && *url != '\0'); + + if (!(uri = g_uri_parse (url, G_URI_FLAGS_NONE, NULL))) { + g_warning ("Failed to parse URL for web app %s: %s", gs_app_get_id (app), url); + return; + } + + refine_app (self, app, refine_flags, uri, url); +} + +static void refine_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_epiphany_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE); + + task = gs_plugin_refine_data_new_task (plugin, list, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_epiphany_refine_async); + + /* Queue a job for the refine. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refine_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +refine_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (source_object); + GsPluginRefineData *data = task_data; + GsPluginRefineFlags flags = data->flags; + GsAppList *list = data->list; + gboolean interactive = gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (!ensure_installed_apps_cache (self, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + const char *url; + + /* not us */ + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_WEB_APP || + gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_PACKAGE) + continue; + + url = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_URL); + if (url == NULL || *url == '\0') { + /* A launchable URL is required by the AppStream spec */ + g_warning ("Web app %s missing launchable url", gs_app_get_id (app)); + continue; + } + + g_debug ("epiphany: refining app %s", gs_app_get_id (app)); + gs_epiphany_refine_app (self, app, flags, url); + gs_epiphany_refine_app_state (GS_PLUGIN (self), app); + + /* Usually the way to refine wildcard apps is to create a new + * GsApp and add it to the results list, but in this case we + * need to use the app that was refined by the appstream plugin + * as it has all the metadata set already, and this is the only + * plugin for dealing with web apps, so it should be safe to + * adopt the wildcard app. + */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) { + gs_app_remove_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_set_management_plugin (app, GS_PLUGIN (self)); + gs_plugin_cache_add (GS_PLUGIN (self), gs_app_get_id (app), app); + } + } + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_epiphany_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_plugin_epiphany_refine_async, FALSE); + return g_task_propagate_boolean (G_TASK (result), error); +} + +static GVariant * +get_serialized_icon (GsApp *app, + GIcon *icon) +{ + g_autofree char *icon_path = NULL; + g_autoptr(GInputStream) stream = NULL; + g_autoptr(GBytes) bytes = NULL; + g_autoptr(GIcon) bytes_icon = NULL; + g_autoptr(GVariant) icon_v = NULL; + guint icon_width; + + /* Note: GsRemoteIcon will work on this GFileIcon code path. + * The icons plugin should have called + * gs_app_ensure_icons_downloaded() for us. + */ + if (!G_IS_FILE_ICON (icon)) + return NULL; + + icon_path = g_file_get_path (g_file_icon_get_file (G_FILE_ICON (icon))); + if (!g_str_has_suffix (icon_path, ".png") && + !g_str_has_suffix (icon_path, ".svg") && + !g_str_has_suffix (icon_path, ".jpeg") && + !g_str_has_suffix (icon_path, ".jpg")) { + g_warning ("Icon for app %s has unsupported file extension: %s", + gs_app_get_id (app), icon_path); + return NULL; + } + + /* Scale down to the portal's size limit if needed */ + icon_width = gs_icon_get_width (icon); + if (icon_width > 512) + icon_width = 512; + + /* Serialize the icon as a #GBytesIcon since that's + * what the dynamic launcher portal requires. + */ + stream = g_loadable_icon_load (G_LOADABLE_ICON (icon), icon_width, NULL, NULL, NULL); + + /* Icons are usually smaller than 1 MiB. Set a 10 MiB + * limit so we can't use a huge amount of memory or hit + * the D-Bus message size limit + */ + if (stream) + bytes = g_input_stream_read_bytes (stream, 10485760 /* 10 MiB */, NULL, NULL); + if (bytes) + bytes_icon = g_bytes_icon_new (bytes); + if (bytes_icon) + icon_v = g_icon_serialize (bytes_icon); + + return g_steal_pointer (&icon_v); +} + +typedef struct { + /* Input data. */ + guint n_apps; + GsPluginInstallAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ + + /* For progress reporting */ + guint n_tokens_requested; + guint n_tokens_received; + guint n_apps_installed; +} InstallAppsData; + +static void +install_apps_data_free (InstallAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallAppsData, install_apps_data_free) + +typedef struct { + GTask *task; /* (owned) */ + GsApp *app; /* (owned) */ + gchar *name; /* (owned) (not nullable) */ + gchar *url; /* (owned) (not nullable) */ +} InstallSingleAppData; + +static void +install_single_app_data_free (InstallSingleAppData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->task); + g_free (data->name); + g_free (data->url); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallSingleAppData, install_single_app_data_free) + +static void install_request_token_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_install_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_install_apps_op (GTask *task, + GError *error); + +static void +gs_plugin_epiphany_install_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin); + g_autoptr(GTask) task = NULL; + InstallAppsData *data; + g_autoptr(InstallAppsData) data_owned = NULL; + gboolean interactive = (flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_epiphany_install_apps_async); + + data = data_owned = g_new0 (InstallAppsData, 1); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->n_apps = gs_app_list_length (apps); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) install_apps_data_free); + + /* Start a load of operations in parallel to install the apps. + * + * When all installs are finished for all apps, finish_install_apps_op() + * will return success/error for the overall #GTask. */ + data->n_pending_ops = 1; + data->n_tokens_requested = 0; + data->n_tokens_received = 0; + + for (guint i = 0; i < data->n_apps; i++) { + GsApp *app = gs_app_list_index (apps, i); + g_autoptr(InstallSingleAppData) app_data = NULL; + const char *url; + const char *name; + g_autoptr(GVariant) icon_v = NULL; + GVariantBuilder opt_builder; + const int icon_sizes[] = {512, 192, 128, 1}; + const char *missing_element = NULL; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + /* This is a required flag for Epiphany. */ + if (flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY) + continue; + + url = gs_app_get_url (app, AS_URL_KIND_HOMEPAGE); + if (url == NULL || *url == '\0') + missing_element = "url"; + + name = gs_app_get_name (app); + if (name == NULL || *name == '\0') + missing_element = "name"; + + for (guint j = 0; j < G_N_ELEMENTS (icon_sizes); j++) { + GIcon *icon = gs_app_get_icon_for_size (app, icon_sizes[j], 1, NULL); + if (icon != NULL) + icon_v = get_serialized_icon (app, icon); + if (icon_v != NULL) + break; + } + if (icon_v == NULL) + missing_element = "icon"; + + if (missing_element != NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error (&local_error, + GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + "Can't install web app %s without %s", + gs_app_get_id (app), missing_element); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + + app_data = g_new0 (InstallSingleAppData, 1); + app_data->task = g_object_ref (task); + app_data->app = g_object_ref (app); + app_data->name = g_strdup (name); + app_data->url = g_strdup (url); + + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + gs_app_set_progress (app, 0); + + /* First get a token from xdg-desktop-portal so Epiphany can do the + * installation without user confirmation + */ + data->n_tokens_requested++; + data->n_pending_ops++; + g_variant_builder_init (&opt_builder, G_VARIANT_TYPE_VARDICT); + g_dbus_proxy_call (self->launcher_portal_proxy, + "RequestInstallToken", + g_variant_new ("(sva{sv})", + name, icon_v, &opt_builder), + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + install_request_token_cb, + g_steal_pointer (&app_data)); + } + + finish_install_apps_op (task, NULL); +} + +static void +install_report_progress (GsPluginEpiphany *self, + InstallAppsData *data) +{ + guint max_points, current_points; + + if (data->progress_callback == NULL) + return; + + /* We assign two progress points to each app: one for when its token has + * been received, and one for when it’s been installed. */ + max_points = data->n_tokens_requested * 2; + current_points = data->n_tokens_received + data->n_apps_installed; + g_assert (current_points <= max_points); + g_assert (max_points > 0); + + data->progress_callback (GS_PLUGIN (self), + current_points * 100 / max_points, + data->progress_user_data); +} + +static void +install_request_token_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GDBusProxy *launcher_portal_proxy = G_DBUS_PROXY (source_object); + g_autoptr(InstallSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + GsPluginEpiphany *self = g_task_get_source_object (task); + InstallAppsData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + gboolean interactive = (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + const char *token = NULL; + g_autoptr(GVariant) token_v = NULL; + g_autoptr(GError) local_error = NULL; + + gs_app_set_progress (app_data->app, 50); + data->n_tokens_received++; + install_report_progress (self, data); + + token_v = g_dbus_proxy_call_finish (launcher_portal_proxy, result, &local_error); + if (token_v == NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + gs_app_set_state_recover (app_data->app); + gs_epiphany_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + "app", app_data->app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + finish_install_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + /* Then pass the token to Epiphany which will use xdg-desktop-portal to + * complete the installation + */ + g_variant_get (token_v, "(&s)", &token); + gs_ephy_web_app_provider_call_install (self->epiphany_proxy, + app_data->url, app_data->name, token, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + install_install_cb, + app_data /* steals ownership */); + app_data = NULL; +} + +static void +install_install_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsEphyWebAppProvider *epiphany_proxy = GS_EPHY_WEB_APP_PROVIDER (source_object); + g_autoptr(InstallSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + GsPluginEpiphany *self = g_task_get_source_object (task); + InstallAppsData *data = g_task_get_task_data (task); + gboolean interactive = (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + g_autofree char *installed_app_id = NULL; + g_autoptr(GError) local_error = NULL; + + gs_app_set_progress (app_data->app, 100); + data->n_apps_installed++; + install_report_progress (self, data); + + if (!gs_ephy_web_app_provider_call_install_finish (epiphany_proxy, + &installed_app_id, + result, + &local_error)) { + g_autoptr(GsPluginEvent) event = NULL; + + gs_app_set_state_recover (app_data->app); + gs_epiphany_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + "app", app_data->app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + finish_install_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + /* Install complete! Update internal and app state. */ + { + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->installed_apps_mutex); + g_hash_table_insert (self->url_id_map, g_strdup (app_data->url), + g_strdup (installed_app_id)); + } + + gs_app_set_launchable (app_data->app, AS_LAUNCHABLE_KIND_DESKTOP_ID, installed_app_id); + gs_app_set_state (app_data->app, GS_APP_STATE_INSTALLED); + + finish_install_apps_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_install_apps_op (GTask *task, + GError *error) +{ + InstallAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while installing apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_epiphany_install_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + /* Input data. */ + GsPluginUninstallAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ + + /* For progress reporting */ + guint n_uninstalls_started; + guint n_apps_uninstalled; +} UninstallAppsData; + +static void +uninstall_apps_data_free (UninstallAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UninstallAppsData, uninstall_apps_data_free) + +typedef struct { + GTask *task; /* (owned) */ + GsApp *app; /* (owned) */ +} UninstallSingleAppData; + +static void +uninstall_single_app_data_free (UninstallSingleAppData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->task); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UninstallSingleAppData, uninstall_single_app_data_free) + +static void uninstall_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_uninstall_apps_op (GTask *task, + GError *error); + +static void +gs_plugin_epiphany_uninstall_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin); + g_autoptr(GTask) task = NULL; + UninstallAppsData *data; + g_autoptr(UninstallAppsData) data_owned = NULL; + gboolean interactive = (flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_epiphany_uninstall_apps_async); + + data = data_owned = g_new0 (UninstallAppsData, 1); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) uninstall_apps_data_free); + + /* Start a load of operations in parallel to uninstall the apps. + * + * When all uninstalls are finished for all apps, finish_uninstall_apps_op() + * will return success/error for the overall #GTask. */ + data->n_pending_ops = 1; + data->n_uninstalls_started = 0; + + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + g_autoptr(UninstallSingleAppData) app_data = NULL; + const char *installed_app_id; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + installed_app_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID); + if (installed_app_id == NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error (&local_error, + GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + "Can’t uninstall web app %s without installed app ID", + gs_app_get_id (app)); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + + app_data = g_new0 (UninstallSingleAppData, 1); + app_data->task = g_object_ref (task); + app_data->app = g_object_ref (app); + + gs_app_set_state (app, GS_APP_STATE_REMOVING); + gs_app_set_progress (app, 0); + + data->n_uninstalls_started++; + data->n_pending_ops++; + gs_ephy_web_app_provider_call_uninstall (self->epiphany_proxy, + installed_app_id, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + uninstall_cb, + g_steal_pointer (&app_data)); + } + + finish_uninstall_apps_op (task, NULL); +} + +static void +uninstall_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsEphyWebAppProvider *epiphany_proxy = GS_EPHY_WEB_APP_PROVIDER (source_object); + g_autoptr(UninstallSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + GsPluginEpiphany *self = g_task_get_source_object (task); + UninstallAppsData *data = g_task_get_task_data (task); + gboolean interactive = (data->flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + const char *url; + g_autoptr(GError) local_error = NULL; + + gs_app_set_progress (app_data->app, 100); + data->n_apps_uninstalled++; + + /* Progress report. */ + if (data->progress_callback != NULL) { + g_assert (data->n_uninstalls_started > 0); + data->progress_callback (GS_PLUGIN (self), + data->n_apps_uninstalled * 100 / data->n_uninstalls_started, + data->progress_user_data); + } + + if (!gs_ephy_web_app_provider_call_uninstall_finish (epiphany_proxy, + result, + &local_error)) { + g_autoptr(GsPluginEvent) event = NULL; + + gs_app_set_state_recover (app_data->app); + gs_epiphany_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + "app", app_data->app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + finish_uninstall_apps_op (task, NULL); + return; + } + + url = gs_app_get_launchable (app_data->app, AS_LAUNCHABLE_KIND_URL); + if (url != NULL && *url != '\0') { + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->installed_apps_mutex); + g_hash_table_remove (self->url_id_map, url); + } + + /* The app is not necessarily available; it may have been installed + * directly in Epiphany. So refine it to check. + */ + gs_app_set_state (app_data->app, GS_APP_STATE_UNKNOWN); + gs_epiphany_refine_app (self, app_data->app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION, + url); + gs_epiphany_refine_app_state (GS_PLUGIN (self), app_data->app); + + finish_uninstall_apps_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_uninstall_apps_op (GTask *task, + GError *error) +{ + UninstallAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while uninstalling apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_epiphany_uninstall_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_epiphany_launch_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + gs_plugin_app_launch_async (plugin, app, flags, cancellable, callback, user_data); +} + +static gboolean +gs_plugin_epiphany_launch_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return gs_plugin_app_launch_finish (plugin, result, error); +} + +static void +gs_plugin_epiphany_class_init (GsPluginEpiphanyClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_epiphany_dispose; + object_class->finalize = gs_plugin_epiphany_finalize; + + plugin_class->setup_async = gs_plugin_epiphany_setup_async; + plugin_class->setup_finish = gs_plugin_epiphany_setup_finish; + plugin_class->shutdown_async = gs_plugin_epiphany_shutdown_async; + plugin_class->shutdown_finish = gs_plugin_epiphany_shutdown_finish; + plugin_class->refine_async = gs_plugin_epiphany_refine_async; + plugin_class->refine_finish = gs_plugin_epiphany_refine_finish; + plugin_class->list_apps_async = gs_plugin_epiphany_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_epiphany_list_apps_finish; + plugin_class->install_apps_async = gs_plugin_epiphany_install_apps_async; + plugin_class->install_apps_finish = gs_plugin_epiphany_install_apps_finish; + plugin_class->uninstall_apps_async = gs_plugin_epiphany_uninstall_apps_async; + plugin_class->uninstall_apps_finish = gs_plugin_epiphany_uninstall_apps_finish; + plugin_class->launch_async = gs_plugin_epiphany_launch_async; + plugin_class->launch_finish = gs_plugin_epiphany_launch_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_EPIPHANY; +} diff --git a/plugins/epiphany/gs-plugin-epiphany.h b/plugins/epiphany/gs-plugin-epiphany.h new file mode 100644 index 0000000..38ea5c8 --- /dev/null +++ b/plugins/epiphany/gs-plugin-epiphany.h @@ -0,0 +1,20 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Matthew Leeds + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_EPIPHANY (gs_plugin_epiphany_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginEpiphany, gs_plugin_epiphany, GS, PLUGIN_EPIPHANY, GsPlugin) + +G_END_DECLS diff --git a/plugins/epiphany/gs-self-test.c b/plugins/epiphany/gs-self-test.c new file mode 100644 index 0000000..6c3067c --- /dev/null +++ b/plugins/epiphany/gs-self-test.c @@ -0,0 +1,238 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2021 Matthew Leeds + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gnome-software-private.h" + +#include "gs-test.h" +#include "gs-dynamic-launcher-portal-iface.h" +#include "gs-epiphany-generated.h" + +#include + +/* This is run in a worker thread */ +static void +epiphany_and_portal_mock_server_cb (GtDBusQueue *queue, + gpointer user_data) +{ + { + g_autoptr(GDBusMethodInvocation) invocation = NULL; + g_autoptr(GVariant) properties_variant = NULL; + const char *property_interface; + invocation = gt_dbus_queue_assert_pop_message (queue, + "/org/gnome/Epiphany/WebAppProvider", + "org.freedesktop.DBus.Properties", + "GetAll", "(&s)", + &property_interface); + g_assert_cmpstr (property_interface, ==, "org.gnome.Epiphany.WebAppProvider"); + properties_variant = g_variant_new_parsed ("({'Version': <@u 1>},)"); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&properties_variant)); + } + { + g_autoptr(GDBusMethodInvocation) invocation = NULL; + g_autoptr(GVariant) properties_variant = NULL; + const char *property_interface, *props_dict; + invocation = gt_dbus_queue_assert_pop_message (queue, + "/org/freedesktop/portal/desktop", + "org.freedesktop.DBus.Properties", + "GetAll", "(&s)", + &property_interface); + g_assert_cmpstr (property_interface, ==, "org.freedesktop.portal.DynamicLauncher"); + props_dict = "({'version': <@u 1>,'SupportedLauncherTypes': <@u 3>},)"; + properties_variant = g_variant_new_parsed (props_dict); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&properties_variant)); + } + { + g_autoptr(GDBusMethodInvocation) invocation = NULL; + const char *installed_apps[] = {"org.gnome.Epiphany.WebApp_e9d0e1e4b0a10856aa3b38d9eb4375de4070d043.desktop", NULL}; + invocation = gt_dbus_queue_assert_pop_message (queue, + "/org/gnome/Epiphany/WebAppProvider", + "org.gnome.Epiphany.WebAppProvider", + "GetInstalledApps", "()", NULL); + g_dbus_method_invocation_return_value (invocation, g_variant_new ("(^as)", installed_apps)); + } +} + +static GtDBusQueue * +bus_set_up (void) +{ + g_autoptr(GError) local_error = NULL; + g_autoptr(GtDBusQueue) queue = NULL; + + queue = gt_dbus_queue_new (); + + gt_dbus_queue_connect (queue, &local_error); + g_assert_no_error (local_error); + + gt_dbus_queue_own_name (queue, "org.freedesktop.portal.Desktop"); + + gt_dbus_queue_export_object (queue, + "/org/freedesktop/portal/desktop", + (GDBusInterfaceInfo *) &org_freedesktop_portal_dynamic_launcher_interface, + &local_error); + g_assert_no_error (local_error); + + gt_dbus_queue_own_name (queue, "org.gnome.Epiphany.WebAppProvider"); + + gt_dbus_queue_export_object (queue, + "/org/gnome/Epiphany/WebAppProvider", + gs_ephy_web_app_provider_interface_info (), + &local_error); + g_assert_no_error (local_error); + + gt_dbus_queue_set_server_func (queue, epiphany_and_portal_mock_server_cb, + NULL); + + return g_steal_pointer (&queue); +} + +static void +gs_plugins_epiphany_func (GsPluginLoader *plugin_loader) +{ + g_assert_true (gs_plugin_loader_get_enabled (plugin_loader, "epiphany")); +} + +static char * +create_fake_desktop_file (const char *app_id) +{ + g_autofree char *contents = NULL; + g_autoptr(GError) error = NULL; + g_autofree char *desktop_path = NULL; + g_autofree char *icon_path = NULL; + + /* Use an icon we already have locally */ + icon_path = gs_test_get_filename (TESTDATADIR, "icons/hicolor/scalable/org.gnome.Software.svg"); + g_assert (icon_path != NULL); + + /* Use true instead of epiphany in Exec and TryExec; otherwise + * g_desktop_app_info_new() in the plugin code will look for an + * epiphany binary and fail. + */ + contents = g_strdup_printf ("[Desktop Entry]\n" + "Name=Pinafore\n" + "Exec=true --application-mode \"--profile=/home/nobody/.local/share/%s\" https://pinafore.social/\n" + "StartupNotify=true\n" + "Terminal=false\n" + "Type=Application\n" + "Categories=GNOME;GTK;\n" + "Icon=%s\n" + "StartupWMClass=%s\n" + "X-Purism-FormFactor=Workstation;Mobile;\n" + "TryExec=true\n", + app_id, icon_path, app_id); + + desktop_path = g_strconcat (g_get_user_data_dir (), G_DIR_SEPARATOR_S, + "applications", G_DIR_SEPARATOR_S, + app_id, ".desktop", NULL); + + g_debug ("Creating a fake desktop file at path: %s", desktop_path); + gs_mkdir_parent (desktop_path, &error); + g_assert_no_error (error); + g_file_set_contents (desktop_path, contents, -1, &error); + g_assert_no_error (error); + + return g_steal_pointer (&desktop_path); +} + +static void +gs_plugins_epiphany_installed_func (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GIcon) icon = NULL; + g_autoptr(GsAppList) list = NULL; + GsApp *app; + const char *app_id = "org.gnome.Epiphany.WebApp_e9d0e1e4b0a10856aa3b38d9eb4375de4070d043"; + const char *metainfo_app_id = "org.gnome.Software.WebApp_e636aa5f2069f6e9c02deccc7b65f43da7985e32.desktop"; + const char *launchable_app_id; + g_autofree char *app_id_desktop = NULL; + g_autofree char *desktop_path = NULL; + g_autofree char *origin_ui = NULL; + + app_id_desktop = g_strdup_printf ("%s.desktop", app_id); + desktop_path = create_fake_desktop_file (app_id); + + query = gs_app_query_new ("is-installed", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_nonnull (list); + + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, metainfo_app_id); + launchable_app_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID); + g_assert_cmpstr (launchable_app_id, ==, app_id_desktop); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_WEB_APP); + g_assert_cmpint (gs_app_get_scope (app), ==, AS_COMPONENT_SCOPE_USER); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_name (app), ==, "Pinafore"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "pinafore.social"); + g_assert_cmpstr (gs_app_get_origin (app), ==, "gnome-web"); + origin_ui = gs_app_dup_origin_ui (app, TRUE); + g_assert_cmpstr (origin_ui, ==, "Pinafore (Web App)"); + icon = gs_app_get_icon_for_size (app, 4096, 1, NULL); + g_assert_nonnull (icon); + g_clear_object (&icon); + + gs_utils_unlink (desktop_path, NULL); +} + +int +main (int argc, char **argv) +{ + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + g_autoptr(GtDBusQueue) queue = NULL; + int res; + const gchar *allowlist[] = { + "epiphany", + "icons", + NULL + }; + + gs_test_init (&argc, &argv); + g_setenv ("GS_XMLB_VERBOSE", "1", TRUE); + + /* Set up mock D-Bus services for the Epiphany WebAppProvider and the + * DynamicLauncher portal + */ + queue = bus_set_up (); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (gt_dbus_queue_get_client_connection (queue), NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR_CORE); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/epiphany/enabled", + plugin_loader, + (GTestDataFunc) gs_plugins_epiphany_func); + g_test_add_data_func ("/gnome-software/plugins/epiphany/installed", + plugin_loader, + (GTestDataFunc) gs_plugins_epiphany_installed_func); + + res = g_test_run (); + gt_dbus_queue_disconnect (queue, TRUE); + return res; +} diff --git a/plugins/epiphany/meson.build b/plugins/epiphany/meson.build new file mode 100644 index 0000000..a71bfde --- /dev/null +++ b/plugins/epiphany/meson.build @@ -0,0 +1,84 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginEpiphany"'] + +# The WebAppProvider interface xml comes from: +# https://gitlab.gnome.org/GNOME/epiphany/-/blob/master/src/webapp-provider/org.gnome.Epiphany.WebAppProvider.xml +epiphany_generated = gnome.gdbus_codegen( + 'gs-epiphany-generated', + sources : ['org.gnome.Epiphany.WebAppProvider.xml'], + interface_prefix : 'org.gnome.Epiphany', + namespace : 'GsEphy', + extra_args : [ '--glib-min-required=' + glib.version() ], +) + +shared_module( + 'gs_plugin_epiphany', + epiphany_generated, + sources : 'gs-plugin-epiphany.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, + link_with : [ + libgnomesoftware, + ], +) +metainfo = 'org.gnome.Software.Plugin.Epiphany.metainfo.xml' + +i18n.merge_file( + input: metainfo + '.in', + output: metainfo, + type: 'xml', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'metainfo'), +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + # The DynamicLauncher interface xml comes from: + # https://github.com/flatpak/xdg-desktop-portal/blob/main/data/org.freedesktop.portal.DynamicLauncher.xml + gdbus_codegen = find_program('gdbus-codegen') + dynamic_launcher_portal_iface_h = custom_target( + 'gs-dynamic-launcher-portal-iface.h', + input: ['org.freedesktop.portal.DynamicLauncher.xml'], + output: ['gs-dynamic-launcher-portal-iface.h'], + command: [gdbus_codegen, + '--interface-info-header', + '--output', '@OUTPUT@', + '@INPUT@'], + ) + dynamic_launcher_portal_iface_c = custom_target( + 'gs-dynamic-launcher-portal-iface.c', + input: ['org.freedesktop.portal.DynamicLauncher.xml'], + output: ['gs-dynamic-launcher-portal-iface.c'], + command: [gdbus_codegen, + '--interface-info-body', + '--output', '@OUTPUT@', + '@INPUT@'], + ) + cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] + cargs += ['-DLOCALPLUGINDIR_CORE="' + meson.current_build_dir() + '/../core"'] + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), '..', '..', 'data') + '"'] + e = executable( + 'gs-self-test-epiphany', + compiled_schemas, + sources : [ + 'gs-self-test.c', + dynamic_launcher_portal_iface_c, + dynamic_launcher_portal_iface_h, + epiphany_generated, + ], + dependencies : [ + plugin_libs, + dependency('glib-testing-0', fallback: ['libglib-testing', 'libglib_testing_dep']), + ], + link_with : [ + libgnomesoftware, + ], + c_args : cargs, + ) + test('gs-self-test-epiphany', e, suite: ['plugins', 'epiphany'], env: test_env) +endif diff --git a/plugins/epiphany/org.freedesktop.portal.DynamicLauncher.xml b/plugins/epiphany/org.freedesktop.portal.DynamicLauncher.xml new file mode 100644 index 0000000..65aa90e --- /dev/null +++ b/plugins/epiphany/org.freedesktop.portal.DynamicLauncher.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/epiphany/org.gnome.Epiphany.WebAppProvider.xml b/plugins/epiphany/org.gnome.Epiphany.WebAppProvider.xml new file mode 100644 index 0000000..6c2954d --- /dev/null +++ b/plugins/epiphany/org.gnome.Epiphany.WebAppProvider.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in b/plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in new file mode 100644 index 0000000..05f85b9 --- /dev/null +++ b/plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in @@ -0,0 +1,11 @@ + + + + org.gnome.Software.Plugin.Epiphany + org.gnome.Software.desktop + Web Apps Support + Run popular web applications in a browser + CC0-1.0 + GPL-2.0-or-later + mwleeds_at_protonmail.com + diff --git a/plugins/fedora-langpacks/gs-plugin-fedora-langpacks.c b/plugins/fedora-langpacks/gs-plugin-fedora-langpacks.c new file mode 100644 index 0000000..39780cc --- /dev/null +++ b/plugins/fedora-langpacks/gs-plugin-fedora-langpacks.c @@ -0,0 +1,138 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2019 Sundeep Anand + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * This plugin does following.. + * 1. locates the active locale, say, xx + * 2. identifies related langpacks-xx + * 3. tries to add langpack-xx in app list + * 4. logs install information; not to try again + */ + +#include + +#include "gs-plugin-fedora-langpacks.h" + +struct _GsPluginFedoraLangpacks { + GsPlugin parent; + + GHashTable *locale_langpack_map; +}; + +G_DEFINE_TYPE (GsPluginFedoraLangpacks, gs_plugin_fedora_langpacks, GS_TYPE_PLUGIN) + +static void +gs_plugin_fedora_langpacks_init (GsPluginFedoraLangpacks *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + /* this plugin should be fedora specific */ + if (!gs_plugin_check_distro_id (plugin, "fedora") && + !gs_plugin_check_distro_id (plugin, "rhel")) { + gs_plugin_set_enabled (plugin, FALSE); + return; + } + + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + + /* + * A few language code may have more than one language packs. + * Example: en {en_GB}, pt {pt_BR}, zh {zh_CN, zh_TW, zh_HK} + */ + self->locale_langpack_map = g_hash_table_new (g_str_hash, g_str_equal); + g_hash_table_insert (self->locale_langpack_map, (gpointer) "en_GB", (gpointer) "langpacks-en_GB"); + g_hash_table_insert (self->locale_langpack_map, (gpointer) "pt_BR", (gpointer) "langpacks-pt_BR"); + g_hash_table_insert (self->locale_langpack_map, (gpointer) "zh_CN", (gpointer) "langpacks-zh_CN"); + g_hash_table_insert (self->locale_langpack_map, (gpointer) "zh_TW", (gpointer) "langpacks-zh_TW"); + g_hash_table_insert (self->locale_langpack_map, (gpointer) "zh_HK", (gpointer) "langpacks-zh_HK"); +} + +static void +gs_plugin_fedora_langpacks_dispose (GObject *object) +{ + GsPluginFedoraLangpacks *self = GS_PLUGIN_FEDORA_LANGPACKS (object); + + g_clear_pointer (&self->locale_langpack_map, g_hash_table_unref); + + G_OBJECT_CLASS (gs_plugin_fedora_langpacks_parent_class)->dispose (object); +} + +gboolean +gs_plugin_add_langpacks (GsPlugin *plugin, + GsAppList *list, + const gchar *locale, + GCancellable *cancellable, + GError **error) +{ + GsPluginFedoraLangpacks *self = GS_PLUGIN_FEDORA_LANGPACKS (plugin); + gchar *separator; + const gchar *language_code; + g_autofree gchar *cachefn = NULL; + g_autofree gchar *langpack_pkgname = NULL; + g_auto(GStrv) language_region = NULL; + + /* This plugin may receive user locale in the form as documented in `man 3 setlocale`: + * + * language[_territory][.codeset][@modifier] + * + * e.g. `ja_JP.UTF-8` or `en_GB.iso88591` or `uz_UZ.utf8@cyrillic` or `de_DE@euro` + * Get the locale without codeset and modifier as required for langpacks. + */ + separator = strpbrk (locale, ".@"); + if (separator != NULL) + *separator = '\0'; + + if (g_strrstr (locale, "_") != NULL && + !g_hash_table_lookup (self->locale_langpack_map, locale)) { + /* + * language_code should be the langpack_source_id + * if input language_code is a locale and it doesn't + * not found in locale_langpack_map + */ + language_region = g_strsplit (locale, "_", 2); + language_code = language_region[0]; + } else { + language_code = locale; + } + + /* per-user cache */ + langpack_pkgname = g_strconcat ("langpacks-", language_code, NULL); + cachefn = gs_utils_get_cache_filename ("langpacks", langpack_pkgname, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + error); + if (cachefn == NULL) + return FALSE; + if (!g_file_test (cachefn, G_FILE_TEST_EXISTS)) { + g_autoptr(GsApp) app = gs_app_new (NULL); + gs_app_set_metadata (app, "GnomeSoftware::Creator", gs_plugin_get_name (plugin)); + gs_app_set_kind (app, AS_COMPONENT_KIND_LOCALIZATION); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_add_source (app, langpack_pkgname); + gs_app_list_add (list, app); + + /* ensure we do not keep trying to install the langpack */ + if (!g_file_set_contents (cachefn, language_code, -1, error)) + return FALSE; + } + + return TRUE; +} + +static void +gs_plugin_fedora_langpacks_class_init (GsPluginFedoraLangpacksClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = gs_plugin_fedora_langpacks_dispose; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_FEDORA_LANGPACKS; +} diff --git a/plugins/fedora-langpacks/gs-plugin-fedora-langpacks.h b/plugins/fedora-langpacks/gs-plugin-fedora-langpacks.h new file mode 100644 index 0000000..e50b601 --- /dev/null +++ b/plugins/fedora-langpacks/gs-plugin-fedora-langpacks.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_FEDORA_LANGPACKS (gs_plugin_fedora_langpacks_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginFedoraLangpacks, gs_plugin_fedora_langpacks, GS, PLUGIN_FEDORA_LANGPACKS, GsPlugin) + +G_END_DECLS diff --git a/plugins/fedora-langpacks/gs-self-test.c b/plugins/fedora-langpacks/gs-self-test.c new file mode 100644 index 0000000..76d819a --- /dev/null +++ b/plugins/fedora-langpacks/gs-self-test.c @@ -0,0 +1,88 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2019 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gnome-software-private.h" + +#include "gs-test.h" + +static void +gs_plugins_fedora_langpacks_func (GsPluginLoader *plugin_loader) +{ + g_autofree gchar *cachefn = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + + os_release = gs_os_release_new (NULL); + if (g_strcmp0 (gs_os_release_get_id (os_release), "fedora") != 0) { + g_test_skip ("not on fedora"); + return; + } + + /* start with a clean slate */ + cachefn = gs_utils_get_cache_filename ("langpacks", "langpacks-pt_BR", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &error); + g_assert_no_error (error); + g_unlink (cachefn); + + /* get langpacks result based on locale */ + plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_LANGPACKS, + "search", "pt_BR.UTF-8", + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + NULL); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_nonnull (list); + g_assert_no_error (error); + + /* check if we have just one app in the list */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + + /* check app's source and kind */ + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_source_default (app), ==, "langpacks-pt_BR"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_LOCALIZATION); +} + +int +main (int argc, char **argv) +{ + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + const gchar * const allowlist[] = { + "fedora-langpacks", + NULL + }; + + gs_test_init (&argc, &argv); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/fedora-langpacks", + plugin_loader, + (GTestDataFunc) gs_plugins_fedora_langpacks_func); + return g_test_run (); +} diff --git a/plugins/fedora-langpacks/meson.build b/plugins/fedora-langpacks/meson.build new file mode 100644 index 0000000..4482ea3 --- /dev/null +++ b/plugins/fedora-langpacks/meson.build @@ -0,0 +1,30 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginFedoraLangpacks"'] + +shared_module( + 'gs_plugin_fedora-langpacks', + sources : 'gs-plugin-fedora-langpacks.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] + e = executable( + 'gs-self-test-fedora-langpacks', + compiled_schemas, + sources : [ + 'gs-self-test.c', + ], + dependencies : [ + plugin_libs, + ], + c_args : cargs, + ) + test('gs-self-test-fedora-langpacks', e, suite: ['plugins', 'fedora-langpacks'], env: test_env) +endif diff --git a/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c b/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c new file mode 100644 index 0000000..8f7952b --- /dev/null +++ b/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c @@ -0,0 +1,841 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016-2018 Kalev Lember + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include +#include + +#include "gs-plugin-fedora-pkgdb-collections.h" + +/* + * SECTION: + * Queries the list of Fedora package collections. + * + * This plugin downloads a file and performs some basic parsing on it. It + * executes entirely in the main thread, and therefore does not require any + * locking. + */ + +#define FEDORA_PKGDB_COLLECTIONS_API_URI "https://admin.fedoraproject.org/pkgdb/api/collections/" + +struct _GsPluginFedoraPkgdbCollections { + GsPlugin parent; + + /* Only set at setup time, then read only: */ + gchar *cachefn; /* (owned) (not nullable) */ + GFileMonitor *cachefn_monitor; /* (owned) (not nullable) */ + gchar *os_name; /* (owned) (not nullable) */ + guint64 os_version; + GsApp *cached_origin; /* (owned) (not nullable) */ + GSettings *settings; /* (owned) (not nullable) */ + + /* Contents may vary throughout the plugin’s lifetime: */ + gboolean is_valid; + GPtrArray *distros; /* (owned) (not nullable) (element-type PkgdbItem) */ + + GSList *pending_refresh_tasks; /* (owned) (element-type GTask) */ +}; + +G_DEFINE_TYPE (GsPluginFedoraPkgdbCollections, gs_plugin_fedora_pkgdb_collections, GS_TYPE_PLUGIN) + +typedef enum { + PKGDB_ITEM_STATUS_ACTIVE, + PKGDB_ITEM_STATUS_DEVEL, + PKGDB_ITEM_STATUS_EOL, + PKGDB_ITEM_STATUS_LAST +} PkgdbItemStatus; + +typedef struct { + gchar *name; + PkgdbItemStatus status; + guint version; +} PkgdbItem; + +static void +_pkgdb_item_free (PkgdbItem *item) +{ + g_free (item->name); + g_slice_free (PkgdbItem, item); +} + +static void +gs_plugin_fedora_pkgdb_collections_init (GsPluginFedoraPkgdbCollections *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + /* check that we are running on Fedora */ + if (!gs_plugin_check_distro_id (plugin, "fedora")) { + gs_plugin_set_enabled (plugin, FALSE); + g_debug ("disabling itself as we're not Fedora"); + return; + } + self->distros = g_ptr_array_new_with_free_func ((GDestroyNotify) _pkgdb_item_free); + self->pending_refresh_tasks = NULL; + self->settings = g_settings_new ("org.gnome.software"); + + /* old name */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_CONFLICTS, "fedora-distro-upgrades"); +} + +static void +gs_plugin_fedora_pkgdb_collections_dispose (GObject *object) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (object); + + g_clear_object (&self->cachefn_monitor); + g_clear_object (&self->cached_origin); + g_clear_object (&self->settings); + + G_OBJECT_CLASS (gs_plugin_fedora_pkgdb_collections_parent_class)->dispose (object); +} + +static void +gs_plugin_fedora_pkgdb_collections_finalize (GObject *object) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (object); + + g_clear_pointer (&self->distros, g_ptr_array_unref); + g_clear_pointer (&self->os_name, g_free); + g_clear_pointer (&self->cachefn, g_free); + + g_assert (self->pending_refresh_tasks == NULL); + + G_OBJECT_CLASS (gs_plugin_fedora_pkgdb_collections_parent_class)->finalize (object); +} + +/* Runs in the main thread. */ +static void +_file_changed_cb (GFileMonitor *monitor, + GFile *file, GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (user_data); + + g_debug ("cache file changed, so reloading upgrades list"); + gs_plugin_updates_changed (GS_PLUGIN (self)); + + self->is_valid = FALSE; +} + +static void +gs_plugin_fedora_pkgdb_collections_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (plugin); + const gchar *verstr = NULL; + gchar *endptr = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fedora_pkgdb_collections_setup_async); + + /* get the file to cache */ + self->cachefn = gs_utils_get_cache_filename ("fedora-pkgdb-collections", + "fedora.json", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &local_error); + if (self->cachefn == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* watch this in case it is changed by the user */ + file = g_file_new_for_path (self->cachefn); + self->cachefn_monitor = g_file_monitor (file, + G_FILE_MONITOR_NONE, + cancellable, + &local_error); + if (self->cachefn_monitor == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_signal_connect (self->cachefn_monitor, "changed", + G_CALLBACK (_file_changed_cb), plugin); + + /* read os-release for the current versions */ + os_release = gs_os_release_new (&local_error); + if (os_release == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + self->os_name = g_strdup (gs_os_release_get_name (os_release)); + if (self->os_name == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT, + "OS release had no name"); + return; + } + + verstr = gs_os_release_get_version_id (os_release); + if (verstr == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT, + "OS release had no version ID"); + return; + } + + /* parse the version */ + self->os_version = g_ascii_strtoull (verstr, &endptr, 10); + if (endptr == verstr || self->os_version > G_MAXUINT) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT, + "Failed parse VERSION_ID: %s", verstr); + return; + } + + /* add source */ + self->cached_origin = gs_app_new (gs_plugin_get_name (plugin)); + gs_app_set_kind (self->cached_origin, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_origin_hostname (self->cached_origin, + FEDORA_PKGDB_COLLECTIONS_API_URI); + gs_app_set_management_plugin (self->cached_origin, plugin); + + /* add the source to the plugin cache which allows us to match the + * unique ID to a GsApp when creating an event */ + gs_plugin_cache_add (plugin, + gs_app_get_unique_id (self->cached_origin), + self->cached_origin); + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_fedora_pkgdb_collections_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +_refresh_cache_async (GsPluginFedoraPkgdbCollections *self, + guint64 cache_age_secs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GFile) output_file = g_file_new_for_path (self->cachefn); + g_autoptr(SoupSession) soup_session = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, _refresh_cache_async); + + /* check cache age */ + if (cache_age_secs > 0) { + guint64 tmp = gs_utils_get_file_age (output_file); + if (tmp < cache_age_secs) { + g_debug ("%s is only %" G_GUINT64_FORMAT " seconds old", + self->cachefn, tmp); + if (self->pending_refresh_tasks == NULL) + g_task_return_boolean (task, TRUE); + else + self->pending_refresh_tasks = g_slist_prepend (self->pending_refresh_tasks, g_steal_pointer (&task)); + return; + } + } + + if (self->pending_refresh_tasks == NULL) { + self->pending_refresh_tasks = g_slist_prepend (self->pending_refresh_tasks, g_object_ref (task)); + + soup_session = gs_build_soup_session (); + + gs_download_file_async (soup_session, + FEDORA_PKGDB_COLLECTIONS_API_URI, + output_file, + G_PRIORITY_LOW, + NULL, NULL, /* FIXME: progress reporting */ + cancellable, + download_cb, + g_steal_pointer (&task)); + } else { + self->pending_refresh_tasks = g_slist_prepend (self->pending_refresh_tasks, g_steal_pointer (&task)); + } +} + +static void +download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SoupSession *soup_session = SOUP_SESSION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginFedoraPkgdbCollections *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + g_autoptr(GError) wrapped_error = NULL; + + if (!gs_download_file_finish (soup_session, result, &local_error) && + !g_error_matches (local_error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) { + /* Wrap in a GsPluginError. */ + g_set_error_literal (&wrapped_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_DOWNLOAD_FAILED, + local_error->message); + + gs_utils_error_add_origin_id (&wrapped_error, self->cached_origin); + } else { + /* success */ + self->is_valid = FALSE; + } + + for (GSList *link = self->pending_refresh_tasks; link != NULL; link = g_slist_next (link)) { + g_autoptr(GTask) pending_task = link->data; + if (wrapped_error != NULL) + g_task_return_error (pending_task, g_error_copy (wrapped_error)); + else + g_task_return_boolean (pending_task, TRUE); + } + g_slist_free (self->pending_refresh_tasks); + self->pending_refresh_tasks = NULL; +} + +static gboolean +_refresh_cache_finish (GsPluginFedoraPkgdbCollections *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_fedora_pkgdb_collections_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (plugin); + _refresh_cache_async (self, cache_age_secs, cancellable, callback, user_data); +} + +static gboolean +gs_plugin_fedora_pkgdb_collections_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return _refresh_cache_finish (GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (plugin), + result, + error); +} + +static gchar * +_get_upgrade_css_background (guint version) +{ + g_autofree gchar *version_str = g_strdup_printf ("%u", version); + g_autofree gchar *filename0 = NULL; + g_autofree gchar *filename1 = NULL; + g_autofree gchar *filename2 = NULL; + + /* Check the standard location. */ + filename0 = gs_utils_get_upgrade_background (version_str); + if (filename0 != NULL) + return g_strdup_printf ("url('file://%s')", filename0); + + /* Fedora-specific locations. Deprecated. */ + filename1 = g_strdup_printf ("/usr/share/backgrounds/f%u/default/standard/f%u.png", version, version); + if (g_file_test (filename1, G_FILE_TEST_EXISTS)) + return g_strdup_printf ("url('file://%s')", filename1); + + filename2 = g_strdup_printf ("/usr/share/gnome-software/backgrounds/f%u.png", version); + if (g_file_test (filename2, G_FILE_TEST_EXISTS)) + return g_strdup_printf ("url('file://%s')", filename2); + + return NULL; +} + +static gint +_sort_items_cb (gconstpointer a, gconstpointer b) +{ + PkgdbItem *item_a = *((PkgdbItem **) a); + PkgdbItem *item_b = *((PkgdbItem **) b); + + if (item_a->version > item_b->version) + return 1; + if (item_a->version < item_b->version) + return -1; + return 0; +} + +static GsApp * +_create_upgrade_from_info (GsPluginFedoraPkgdbCollections *self, + PkgdbItem *item) +{ + GsApp *app; + g_autofree gchar *app_id = NULL; + g_autofree gchar *app_version = NULL; + g_autofree gchar *background = NULL; + g_autofree gchar *cache_key = NULL; + g_autofree gchar *css = NULL; + g_autofree gchar *url = NULL; + g_autoptr(GFile) icon_file = NULL; + g_autoptr(GIcon) ic = NULL; + + /* search in the cache */ + cache_key = g_strdup_printf ("release-%u", item->version); + app = gs_plugin_cache_lookup (GS_PLUGIN (self), cache_key); + if (app != NULL) + return app; + + app_id = g_strdup_printf ("org.fedoraproject.fedora-%u", item->version); + app_version = g_strdup_printf ("%u", item->version); + + /* icon from disk */ + icon_file = g_file_new_for_path ("/usr/share/pixmaps/fedora-logo-sprite.png"); + ic = g_file_icon_new (icon_file); + + /* create */ + app = gs_app_new (app_id); + if (item->status == PKGDB_ITEM_STATUS_EOL) + gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + else + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_set_kind (app, AS_COMPONENT_KIND_OPERATING_SYSTEM); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, item->name); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, + /* TRANSLATORS: this is a title for Fedora distro upgrades */ + _("Upgrade for the latest features, performance and stability improvements.")); + gs_app_set_version (app, app_version); + gs_app_set_size_installed (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_license (app, GS_APP_QUALITY_LOWEST, "LicenseRef-free"); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_REVIEWABLE); + gs_app_add_icon (app, ic); + + /* show a Fedora magazine article for the release */ + url = g_strdup_printf ("https://fedoramagazine.org/whats-new-fedora-workstation-%u", + item->version); + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, url); + + /* use a fancy background if possible, and suppress the border which is + * shown by default; the background image is designed to be borderless */ + background = _get_upgrade_css_background (item->version); + if (background != NULL) { + css = g_strdup_printf ("background: %s;" + "background-position: top;" + "background-size: 100%% 100%%;" + "color: white;" + "border-width: 0;", + background); + gs_app_set_metadata (app, "GnomeSoftware::UpgradeBanner-css", css); + } + + /* save in the cache */ + gs_plugin_cache_add (GS_PLUGIN (self), cache_key, app); + + /* success */ + return app; +} + +static gboolean +_is_valid_upgrade (GsPluginFedoraPkgdbCollections *self, + PkgdbItem *item) +{ + /* only interested in upgrades to the same distro */ + if (g_strcmp0 (item->name, self->os_name) != 0) + return FALSE; + + /* only interested in newer versions, but not more than N+2 */ + if (item->version <= self->os_version || + item->version > self->os_version + 2) + return FALSE; + + /* ignore End-Of-Life upgrades */ + if (item->status == PKGDB_ITEM_STATUS_EOL) + return FALSE; + + /* only interested in non-devel distros */ + if (!g_settings_get_boolean (self->settings, "show-upgrade-prerelease")) { + if (item->status == PKGDB_ITEM_STATUS_DEVEL) + return FALSE; + } + + /* success */ + return TRUE; +} + +static GPtrArray * +load_json (GsPluginFedoraPkgdbCollections *self, + GError **error) +{ + JsonArray *collections; + JsonNode *root_node; + JsonObject *root = NULL; + g_autoptr(JsonParser) parser = NULL; + g_autoptr(GPtrArray) new_distros = NULL; + + new_distros = g_ptr_array_new_with_free_func ((GDestroyNotify) _pkgdb_item_free); + parser = json_parser_new_immutable (); + + if (!json_parser_load_from_mapped_file (parser, self->cachefn, error)) + return NULL; + + root_node = json_parser_get_root (parser); + if (root_node != NULL && JSON_NODE_HOLDS_OBJECT (root_node)) + root = json_node_get_object (root_node); + if (root == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no root object"); + return NULL; + } + + collections = json_object_get_array_member (root, "collections"); + if (collections == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no collections object"); + return NULL; + } + + for (guint i = 0; i < json_array_get_length (collections); i++) { + PkgdbItem *item; + JsonObject *collection; + PkgdbItemStatus status; + const gchar *name; + const gchar *status_str; + const gchar *version_str; + gchar *endptr = NULL; + guint64 version; + + collection = json_array_get_object_element (collections, i); + if (collection == NULL) + continue; + + name = json_object_get_string_member (collection, "name"); + if (name == NULL) + continue; + + status_str = json_object_get_string_member (collection, "status"); + if (status_str == NULL) + continue; + + if (g_strcmp0 (status_str, "Active") == 0) + status = PKGDB_ITEM_STATUS_ACTIVE; + else if (g_strcmp0 (status_str, "Under Development") == 0) + status = PKGDB_ITEM_STATUS_DEVEL; + else if (g_strcmp0 (status_str, "EOL") == 0) + status = PKGDB_ITEM_STATUS_EOL; + else + continue; + + version_str = json_object_get_string_member (collection, "version"); + if (version_str == NULL) + continue; + + version = g_ascii_strtoull (version_str, &endptr, 10); + if (endptr == version_str || version > G_MAXUINT) + continue; + + /* add item */ + item = g_slice_new0 (PkgdbItem); + item->name = g_strdup (name); + item->status = status; + item->version = (guint) version; + g_ptr_array_add (new_distros, item); + } + + /* ensure in correct order */ + g_ptr_array_sort (new_distros, _sort_items_cb); + + /* success */ + g_clear_pointer (&self->distros, g_ptr_array_unref); + self->distros = g_ptr_array_ref (new_distros); + self->is_valid = TRUE; + + return g_steal_pointer (&new_distros); +} + +static void ensure_refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +/* This will return a strong reference to the latest distros + * #GPtrArray. The caller should use this in their computation. */ +static void +_ensure_cache_async (GsPluginFedoraPkgdbCollections *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, _ensure_cache_async); + + /* already done */ + if (self->is_valid) { + g_task_return_pointer (task, g_ptr_array_ref (self->distros), (GDestroyNotify) g_ptr_array_unref); + return; + } + + /* Ensure there is any data, no matter how old. This can download from + * the network if needed. */ + _refresh_cache_async (self, G_MAXUINT, cancellable, + ensure_refresh_cb, g_steal_pointer (&task)); +} + +static void +ensure_refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GPtrArray) distros = NULL; + g_autoptr(GError) local_error = NULL; + + if (!_refresh_cache_finish (self, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + distros = load_json (self, &local_error); + if (distros == NULL) { + g_autoptr(GFile) cache_file = g_file_new_for_path (self->cachefn); + + g_debug ("Failed to load cache file ‘%s’, deleting it", self->cachefn); + g_file_delete (cache_file, NULL, NULL); + + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_pointer (task, g_steal_pointer (&distros), (GDestroyNotify) g_ptr_array_unref); +} + +static GPtrArray * +_ensure_cache_finish (GsPluginFedoraPkgdbCollections *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void list_distro_upgrades_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_fedora_pkgdb_collections_list_distro_upgrades_async (GsPlugin *plugin, + GsPluginListDistroUpgradesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fedora_pkgdb_collections_list_distro_upgrades_async); + + /* Ensure valid data is loaded. */ + _ensure_cache_async (self, cancellable, list_distro_upgrades_cb, g_steal_pointer (&task)); +} + +static void +list_distro_upgrades_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GPtrArray) distros = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + + distros = _ensure_cache_finish (self, result, &local_error); + if (distros == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* are any distros upgradable */ + list = gs_app_list_new (); + + for (guint i = 0; i < distros->len; i++) { + PkgdbItem *item = g_ptr_array_index (distros, i); + if (_is_valid_upgrade (self, item)) { + g_autoptr(GsApp) app = NULL; + app = _create_upgrade_from_info (self, item); + gs_app_list_add (list, app); + } + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_fedora_pkgdb_collections_list_distro_upgrades_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static gboolean +refine_app (GsPluginFedoraPkgdbCollections *self, + GPtrArray *distros, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error) +{ + PkgdbItem *item = NULL; + guint64 app_version = 0; + + /* not for us */ + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_OPERATING_SYSTEM) + return TRUE; + + if (gs_app_get_version (app) != NULL) + app_version = g_ascii_strtoull (gs_app_get_version (app), NULL, 10); + + /* system updates and system upgrades are the same kind, only different version */ + if (app_version == 0 || app_version == self->os_version) + return TRUE; + + /* find item */ + for (guint i = 0; i < distros->len; i++) { + item = g_ptr_array_index (distros, i); + if (item->version == self->os_version && + g_ascii_strcasecmp (item->name, self->os_name) == 0) + break; + item = NULL; + } + + /* no information for this release */ + if (item == NULL) + return TRUE; + + /* fix the state */ + if (item->status == PKGDB_ITEM_STATUS_EOL) + gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + + return TRUE; +} + +static void refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_fedora_pkgdb_collections_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (plugin); + g_autoptr(GTask) task = NULL; + gboolean refine_needed = FALSE; + + task = gs_plugin_refine_data_new_task (plugin, list, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fedora_pkgdb_collections_refine_async); + + /* Check if any of the apps actually need to be refined by this plugin, + * before potentially updating the collections file from the internet. */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_OPERATING_SYSTEM) { + refine_needed = TRUE; + break; + } + } + + if (!refine_needed) { + g_task_return_boolean (task, TRUE); + return; + } + + /* ensure valid data is loaded */ + _ensure_cache_async (self, cancellable, refine_cb, g_steal_pointer (&task)); +} + +static void +refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginFedoraPkgdbCollections *self = GS_PLUGIN_FEDORA_PKGDB_COLLECTIONS (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginRefineData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GPtrArray) distros = NULL; + g_autoptr(GError) local_error = NULL; + + distros = _ensure_cache_finish (self, result, &local_error); + if (distros == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (data->list); i++) { + GsApp *app = gs_app_list_index (data->list, i); + if (!refine_app (self, distros, app, data->flags, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_fedora_pkgdb_collections_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_fedora_pkgdb_collections_class_init (GsPluginFedoraPkgdbCollectionsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_fedora_pkgdb_collections_dispose; + object_class->finalize = gs_plugin_fedora_pkgdb_collections_finalize; + + plugin_class->setup_async = gs_plugin_fedora_pkgdb_collections_setup_async; + plugin_class->setup_finish = gs_plugin_fedora_pkgdb_collections_setup_finish; + plugin_class->refine_async = gs_plugin_fedora_pkgdb_collections_refine_async; + plugin_class->refine_finish = gs_plugin_fedora_pkgdb_collections_refine_finish; + plugin_class->refresh_metadata_async = gs_plugin_fedora_pkgdb_collections_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_fedora_pkgdb_collections_refresh_metadata_finish; + plugin_class->list_distro_upgrades_async = gs_plugin_fedora_pkgdb_collections_list_distro_upgrades_async; + plugin_class->list_distro_upgrades_finish = gs_plugin_fedora_pkgdb_collections_list_distro_upgrades_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_FEDORA_PKGDB_COLLECTIONS; +} diff --git a/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.h b/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.h new file mode 100644 index 0000000..86fd7f5 --- /dev/null +++ b/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_FEDORA_PKGDB_COLLECTIONS (gs_plugin_fedora_pkgdb_collections_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginFedoraPkgdbCollections, gs_plugin_fedora_pkgdb_collections, GS, PLUGIN_FEDORA_PKGDB_COLLECTIONS, GsPlugin) + +G_END_DECLS diff --git a/plugins/fedora-pkgdb-collections/meson.build b/plugins/fedora-pkgdb-collections/meson.build new file mode 100644 index 0000000..1290f83 --- /dev/null +++ b/plugins/fedora-pkgdb-collections/meson.build @@ -0,0 +1,10 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginFedoraPkgdbCollections"'] + +shared_module( + 'gs_plugin_fedora-pkgdb-collections', + sources : 'gs-plugin-fedora-pkgdb-collections.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) diff --git a/plugins/flatpak/gs-flatpak-app.c b/plugins/flatpak/gs-flatpak-app.c new file mode 100644 index 0000000..ad174d3 --- /dev/null +++ b/plugins/flatpak/gs-flatpak-app.c @@ -0,0 +1,190 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017-2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-flatpak-app.h" + +const gchar * +gs_flatpak_app_get_ref_name (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::RefName"); +} + +const gchar * +gs_flatpak_app_get_ref_arch (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::RefArch"); +} + +const gchar * +gs_flatpak_app_get_commit (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::Commit"); +} + +GsFlatpakAppFileKind +gs_flatpak_app_get_file_kind (GsApp *app) +{ + GVariant *tmp = gs_app_get_metadata_variant (app, "flatpak::FileKind"); + if (tmp == NULL) + return GS_FLATPAK_APP_FILE_KIND_UNKNOWN; + return g_variant_get_uint32 (tmp); +} + +const gchar * +gs_flatpak_app_get_runtime_url (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::RuntimeUrl"); +} + +FlatpakRefKind +gs_flatpak_app_get_ref_kind (GsApp *app) +{ + GVariant *tmp = gs_app_get_metadata_variant (app, "flatpak::RefKind"); + if (tmp == NULL) + return FLATPAK_REF_KIND_APP; + return g_variant_get_uint32 (tmp); +} + +const gchar * +gs_flatpak_app_get_ref_kind_as_str (GsApp *app) +{ + FlatpakRefKind ref_kind = gs_flatpak_app_get_ref_kind (app); + if (ref_kind == FLATPAK_REF_KIND_APP) + return "app"; + if (ref_kind == FLATPAK_REF_KIND_RUNTIME) + return "runtime"; + return NULL; +} + +const gchar * +gs_flatpak_app_get_object_id (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::ObjectID"); +} + +const gchar * +gs_flatpak_app_get_repo_gpgkey (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::RepoGpgKey"); +} + +const gchar * +gs_flatpak_app_get_repo_url (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::RepoUrl"); +} + +gchar * +gs_flatpak_app_get_ref_display (GsApp *app) +{ + const gchar *ref_kind_as_str = gs_flatpak_app_get_ref_kind_as_str (app); + const gchar *ref_name = gs_flatpak_app_get_ref_name (app); + const gchar *ref_arch = gs_flatpak_app_get_ref_arch (app); + const gchar *ref_branch = gs_app_get_branch (app); + + g_return_val_if_fail (ref_kind_as_str != NULL, NULL); + g_return_val_if_fail (ref_name != NULL, NULL); + g_return_val_if_fail (ref_arch != NULL, NULL); + g_return_val_if_fail (ref_branch != NULL, NULL); + + return g_strdup_printf ("%s/%s/%s/%s", + ref_kind_as_str, + ref_name, + ref_arch, + ref_branch); +} + +void +gs_flatpak_app_set_ref_name (GsApp *app, const gchar *val) +{ + gs_app_set_metadata (app, "flatpak::RefName", val); +} + +void +gs_flatpak_app_set_ref_arch (GsApp *app, const gchar *val) +{ + gs_app_set_metadata (app, "flatpak::RefArch", val); +} + +void +gs_flatpak_app_set_commit (GsApp *app, const gchar *val) +{ + gs_app_set_metadata (app, "flatpak::Commit", val); +} + +void +gs_flatpak_app_set_file_kind (GsApp *app, GsFlatpakAppFileKind file_kind) +{ + g_autoptr(GVariant) tmp = g_variant_new_uint32 (file_kind); + gs_app_set_metadata_variant (app, "flatpak::FileKind", tmp); +} + +void +gs_flatpak_app_set_runtime_url (GsApp *app, const gchar *val) +{ + gs_app_set_metadata (app, "flatpak::RuntimeUrl", val); +} + +void +gs_flatpak_app_set_ref_kind (GsApp *app, FlatpakRefKind ref_kind) +{ + g_autoptr(GVariant) tmp = g_variant_new_uint32 (ref_kind); + gs_app_set_metadata_variant (app, "flatpak::RefKind", tmp); +} + +void +gs_flatpak_app_set_object_id (GsApp *app, const gchar *val) +{ + gs_app_set_metadata (app, "flatpak::ObjectID", val); +} + +void +gs_flatpak_app_set_repo_gpgkey (GsApp *app, const gchar *val) +{ + gs_app_set_metadata (app, "flatpak::RepoGpgKey", val); +} + +void +gs_flatpak_app_set_repo_url (GsApp *app, const gchar *val) +{ + gs_app_set_metadata (app, "flatpak::RepoUrl", val); +} + +GsApp * +gs_flatpak_app_new (const gchar *id) +{ + return GS_APP (g_object_new (GS_TYPE_APP, "id", id, NULL)); +} + +void +gs_flatpak_app_set_main_app_ref_name (GsApp *app, const gchar *main_app_ref) +{ + gs_app_set_metadata (app, "flatpak::mainApp", main_app_ref); +} + +const gchar * +gs_flatpak_app_get_main_app_ref_name (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::mainApp"); +} + +void +gs_flatpak_app_set_repo_filter (GsApp *app, const gchar *filter) +{ + gs_app_set_metadata (app, "flatpak::RepoFilter", filter); +} + +const gchar * +gs_flatpak_app_get_repo_filter (GsApp *app) +{ + return gs_app_get_metadata_item (app, "flatpak::RepoFilter"); +} diff --git a/plugins/flatpak/gs-flatpak-app.h b/plugins/flatpak/gs-flatpak-app.h new file mode 100644 index 0000000..abaa6ac --- /dev/null +++ b/plugins/flatpak/gs-flatpak-app.h @@ -0,0 +1,65 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017-2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +typedef enum { + GS_FLATPAK_APP_FILE_KIND_UNKNOWN, + GS_FLATPAK_APP_FILE_KIND_REPO, + GS_FLATPAK_APP_FILE_KIND_REF, + GS_FLATPAK_APP_FILE_KIND_BUNDLE, + GS_FLATPAK_APP_FILE_KIND_LAST, +} GsFlatpakAppFileKind; + +GsApp *gs_flatpak_app_new (const gchar *id); + +const gchar *gs_flatpak_app_get_ref_name (GsApp *app); +const gchar *gs_flatpak_app_get_ref_arch (GsApp *app); +FlatpakRefKind gs_flatpak_app_get_ref_kind (GsApp *app); +const gchar *gs_flatpak_app_get_ref_kind_as_str (GsApp *app); +gchar *gs_flatpak_app_get_ref_display (GsApp *app); + +const gchar *gs_flatpak_app_get_commit (GsApp *app); +const gchar *gs_flatpak_app_get_object_id (GsApp *app); +const gchar *gs_flatpak_app_get_repo_gpgkey (GsApp *app); +const gchar *gs_flatpak_app_get_repo_url (GsApp *app); +GsFlatpakAppFileKind gs_flatpak_app_get_file_kind (GsApp *app); +const gchar *gs_flatpak_app_get_runtime_url (GsApp *app); + +void gs_flatpak_app_set_ref_name (GsApp *app, + const gchar *val); +void gs_flatpak_app_set_ref_arch (GsApp *app, + const gchar *val); +void gs_flatpak_app_set_ref_kind (GsApp *app, + FlatpakRefKind ref_kind); + +void gs_flatpak_app_set_commit (GsApp *app, + const gchar *val); +void gs_flatpak_app_set_object_id (GsApp *app, + const gchar *val); +void gs_flatpak_app_set_repo_gpgkey (GsApp *app, + const gchar *val); +void gs_flatpak_app_set_repo_url (GsApp *app, + const gchar *val); +void gs_flatpak_app_set_file_kind (GsApp *app, + GsFlatpakAppFileKind file_kind); +void gs_flatpak_app_set_runtime_url (GsApp *app, + const gchar *val); +void gs_flatpak_app_set_main_app_ref_name (GsApp *app, + const gchar *main_app_ref); +const gchar *gs_flatpak_app_get_main_app_ref_name (GsApp *app); +void gs_flatpak_app_set_repo_filter (GsApp *app, + const gchar *filter); +const gchar *gs_flatpak_app_get_repo_filter (GsApp *app); + +G_END_DECLS diff --git a/plugins/flatpak/gs-flatpak-transaction.c b/plugins/flatpak/gs-flatpak-transaction.c new file mode 100644 index 0000000..68a75a0 --- /dev/null +++ b/plugins/flatpak/gs-flatpak-transaction.c @@ -0,0 +1,938 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018 Richard Hughes + * Copyright (C) 2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include "gs-flatpak-app.h" +#include "gs-flatpak-transaction.h" + +struct _GsFlatpakTransaction { + FlatpakTransaction parent_instance; + GHashTable *refhash; /* ref:GsApp */ + GError *first_operation_error; + gboolean stop_on_first_error; + FlatpakTransactionOperation *error_operation; /* (nullable) (owned) */ +}; + +enum { + SIGNAL_REF_TO_APP, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (GsFlatpakTransaction, gs_flatpak_transaction, FLATPAK_TYPE_TRANSACTION) + +typedef enum { + PROP_STOP_ON_FIRST_ERROR = 1, +} GsFlatpakTransactionProperty; + +static GParamSpec *props[PROP_STOP_ON_FIRST_ERROR + 1] = { NULL, }; + +static void +gs_flatpak_transaction_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (object); + + switch ((GsFlatpakTransactionProperty) prop_id) { + case PROP_STOP_ON_FIRST_ERROR: + g_value_set_boolean (value, self->stop_on_first_error); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_flatpak_transaction_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (object); + + switch ((GsFlatpakTransactionProperty) prop_id) { + case PROP_STOP_ON_FIRST_ERROR: + /* Construct only. */ + self->stop_on_first_error = g_value_get_boolean (value); + g_object_notify_by_pspec (object, props[prop_id]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_flatpak_transaction_dispose (GObject *object) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (object); + + g_clear_object (&self->error_operation); + + G_OBJECT_CLASS (gs_flatpak_transaction_parent_class)->dispose (object); +} + +static void +gs_flatpak_transaction_finalize (GObject *object) +{ + GsFlatpakTransaction *self; + g_return_if_fail (GS_IS_FLATPAK_TRANSACTION (object)); + self = GS_FLATPAK_TRANSACTION (object); + + g_assert (self != NULL); + g_hash_table_unref (self->refhash); + if (self->first_operation_error != NULL) + g_error_free (self->first_operation_error); + + G_OBJECT_CLASS (gs_flatpak_transaction_parent_class)->finalize (object); +} + +GsApp * +gs_flatpak_transaction_get_app_by_ref (FlatpakTransaction *transaction, const gchar *ref) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (transaction); + return g_hash_table_lookup (self->refhash, ref); +} + +static void +gs_flatpak_transaction_add_app_internal (GsFlatpakTransaction *self, GsApp *app) +{ + g_autofree gchar *ref = gs_flatpak_app_get_ref_display (app); + g_hash_table_insert (self->refhash, g_steal_pointer (&ref), g_object_ref (app)); +} + +void +gs_flatpak_transaction_add_app (FlatpakTransaction *transaction, GsApp *app) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (transaction); + gs_flatpak_transaction_add_app_internal (self, app); + if (gs_app_get_runtime (app) != NULL) + gs_flatpak_transaction_add_app_internal (self, gs_app_get_runtime (app)); +} + +static GsApp * +_ref_to_app (GsFlatpakTransaction *self, const gchar *ref) +{ + GsApp *app = g_hash_table_lookup (self->refhash, ref); + if (app != NULL) + return g_object_ref (app); + g_signal_emit (self, signals[SIGNAL_REF_TO_APP], 0, ref, &app); + + /* Cache the result */ + if (app != NULL) + g_hash_table_insert (self->refhash, g_strdup (ref), g_object_ref (app)); + + return app; +} + +static void +_transaction_operation_set_app (FlatpakTransactionOperation *op, GsApp *app) +{ + g_object_set_data_full (G_OBJECT (op), "GsApp", + g_object_ref (app), (GDestroyNotify) g_object_unref); +} + +static GsApp * +_transaction_operation_get_app (FlatpakTransactionOperation *op) +{ + return g_object_get_data (G_OBJECT (op), "GsApp"); +} + +gboolean +gs_flatpak_transaction_run (FlatpakTransaction *transaction, + GCancellable *cancellable, + GError **error) + +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (transaction); + g_autoptr(GError) error_local = NULL; + + if (!flatpak_transaction_run (transaction, cancellable, &error_local)) { + /* whole transaction failed; restore the state for all the apps involved */ + g_autolist(GObject) ops = flatpak_transaction_get_operations (transaction); + for (GList *l = ops; l != NULL; l = l->next) { + FlatpakTransactionOperation *op = l->data; + const gchar *ref = flatpak_transaction_operation_get_ref (op); + g_autoptr(GsApp) app = _ref_to_app (self, ref); + if (app == NULL) { + g_warning ("failed to find app for %s", ref); + continue; + } + gs_app_set_state_recover (app); + } + + if (self->first_operation_error != NULL) { + g_propagate_error (error, g_steal_pointer (&self->first_operation_error)); + return FALSE; + } else { + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + } + + return TRUE; +} + +static gboolean +_transaction_ready (FlatpakTransaction *transaction) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (transaction); + g_autolist(GObject) ops = NULL; + + /* nothing to do */ + ops = flatpak_transaction_get_operations (transaction); + if (ops == NULL) + return TRUE; // FIXME: error? + for (GList *l = ops; l != NULL; l = l->next) { + FlatpakTransactionOperation *op = l->data; + const gchar *ref = flatpak_transaction_operation_get_ref (op); + g_autoptr(GsApp) app = _ref_to_app (self, ref); + if (app != NULL) { + _transaction_operation_set_app (op, app); + /* if we're updating a component, then mark all the apps + * involved to ensure updating the button state */ + if (flatpak_transaction_operation_get_operation_type (op) == FLATPAK_TRANSACTION_OPERATION_UPDATE) { + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN || + gs_app_get_state (app) == GS_APP_STATE_INSTALLED) + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + } + } + + /* Debug dump. */ + { + GPtrArray *related_to_ops = flatpak_transaction_operation_get_related_to_ops (op); + g_autoptr(GString) debug_message = g_string_new (""); + + g_string_append_printf (debug_message, + "%s: op %p, app %s (%p), download size %" G_GUINT64_FORMAT ", related-to:", + G_STRFUNC, op, + app ? gs_app_get_unique_id (app) : "?", + app, + flatpak_transaction_operation_get_download_size (op)); + for (gsize i = 0; related_to_ops != NULL && i < related_to_ops->len; i++) { + FlatpakTransactionOperation *related_to_op = g_ptr_array_index (related_to_ops, i); + g_string_append_printf (debug_message, + "\n ├ %s (%p)", flatpak_transaction_operation_get_ref (related_to_op), related_to_op); + } + g_string_append (debug_message, "\n └ (end)"); + g_assert (debug_message != NULL); /* -Wnull-dereference false positive */ + g_debug ("%s", debug_message->str); + } + } + return TRUE; +} + +typedef struct +{ + GsFlatpakTransaction *transaction; /* (owned) */ + FlatpakTransactionOperation *operation; /* (owned) */ + GsApp *app; /* (owned) */ +} ProgressData; + +static void +progress_data_free (ProgressData *data) +{ + g_clear_object (&data->operation); + g_clear_object (&data->app); + g_clear_object (&data->transaction); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ProgressData, progress_data_free) + +static gboolean +op_is_related_to_op (FlatpakTransactionOperation *op, + FlatpakTransactionOperation *root_op, + GHashTable *checked_ops) +{ + GPtrArray *related_to_ops; /* (element-type FlatpakTransactionOperation) */ + gpointer cached_is_related_to = NULL; + + if (op == root_op) + return TRUE; + + /* FIXME: Detect infinite loops. These indicate a bug in libflatpak, + * but have been hard to track down so far. + * See: https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2689 */ + if (g_hash_table_lookup_extended (checked_ops, op, NULL, &cached_is_related_to)) + return GPOINTER_TO_INT (cached_is_related_to); + + g_hash_table_insert (checked_ops, op, GINT_TO_POINTER (TRUE)); + + related_to_ops = flatpak_transaction_operation_get_related_to_ops (op); + for (gsize i = 0; related_to_ops != NULL && i < related_to_ops->len; i++) { + FlatpakTransactionOperation *related_to_op = g_ptr_array_index (related_to_ops, i); + if (related_to_op == root_op || op_is_related_to_op (related_to_op, root_op, checked_ops)) { + g_hash_table_insert (checked_ops, op, GINT_TO_POINTER (TRUE)); + return TRUE; + } + } + + g_hash_table_insert (checked_ops, op, GINT_TO_POINTER (FALSE)); + + return FALSE; +} + +static guint64 +saturated_uint64_add (guint64 a, guint64 b) +{ + return (a <= G_MAXUINT64 - b) ? a + b : G_MAXUINT64; +} + +/* + * update_progress_for_op: + * @self: a #GsFlatpakTransaction + * @current_progress: progress reporting object + * @ops: results of calling flatpak_transaction_get_operations() on @self, for performance + * @current_op: the #FlatpakTransactionOperation which the @current_progress is + * for; this is the operation currently being run by libflatpak + * @root_op: the #FlatpakTransactionOperation at the root of the operation subtree + * to calculate progress for + * @checked_ops: (element-type FlatpakTransactionOperation gboolean): hash table + * of already checked ops, to detect a dependency loop; an op being present in the table + * means it was already checked, and the stored value is the previous return value of + * op_is_related_to_op() for that op + * + * Calculate and update the #GsApp:progress for each app associated with + * @root_op in a flatpak transaction. This will include the #GsApp for the app + * being installed (for example), but also the #GsApps for all of its runtimes + * and locales, and any other dependencies of them. + * + * Each #GsApp:progress is calculated based on the sum of the progress of all + * the apps related to that one — so the progress for an app will factor in the + * progress for all its runtimes. + */ +static void +update_progress_for_op (GsFlatpakTransaction *self, + FlatpakTransactionProgress *current_progress, + GList *ops, + FlatpakTransactionOperation *current_op, + FlatpakTransactionOperation *root_op, + GHashTable *checked_ops) +{ + g_autoptr(GsApp) root_app = NULL; + guint64 related_prior_download_bytes = 0; + guint64 related_download_bytes = 0; + guint64 current_bytes_transferred = flatpak_transaction_progress_get_bytes_transferred (current_progress); + gboolean seen_current_op = FALSE, seen_root_op = FALSE; + gboolean root_op_skipped = flatpak_transaction_operation_get_is_skipped (root_op); + guint percent; + + /* If @root_op is being skipped and its GsApp isn't being + * installed/removed, don't update the progress on it. It may be that + * @root_op is the runtime of an app and the app is the thing the + * transaction was created for. + */ + if (root_op_skipped) { + /* _transaction_operation_set_app() is only called on non-skipped ops */ + const gchar *ref = flatpak_transaction_operation_get_ref (root_op); + root_app = _ref_to_app (self, ref); + if (root_app == NULL) { + g_warning ("Couldn't find GsApp for transaction operation %s", + flatpak_transaction_operation_get_ref (root_op)); + return; + } + if (gs_app_get_state (root_app) != GS_APP_STATE_INSTALLING && + gs_app_get_state (root_app) != GS_APP_STATE_REMOVING && + gs_app_get_state (root_app) != GS_APP_STATE_DOWNLOADING) + return; + } else { + GsApp *unskipped_root_app = _transaction_operation_get_app (root_op); + if (unskipped_root_app == NULL) { + g_warning ("Couldn't find GsApp for transaction operation %s", + flatpak_transaction_operation_get_ref (root_op)); + return; + } + root_app = g_object_ref (unskipped_root_app); + } + + /* This relies on ops in a #FlatpakTransaction being run in the order + * they’re returned by flatpak_transaction_get_operations(), which is true. */ + for (GList *l = ops; l != NULL; l = l->next) { + FlatpakTransactionOperation *op = FLATPAK_TRANSACTION_OPERATION (l->data); + guint64 op_download_size = flatpak_transaction_operation_get_download_size (op); + + if (op == current_op) + seen_current_op = TRUE; + if (op == root_op) + seen_root_op = TRUE; + + /* Currently libflatpak doesn't return skipped ops in + * flatpak_transaction_get_operations(), but check just in case. + */ + if (op == root_op && root_op_skipped) + continue; + + if (op_is_related_to_op (op, root_op, checked_ops)) { + /* Saturate instead of overflowing */ + related_download_bytes = saturated_uint64_add (related_download_bytes, op_download_size); + if (!seen_current_op) + related_prior_download_bytes = saturated_uint64_add (related_prior_download_bytes, op_download_size); + } + } + + g_assert (related_prior_download_bytes <= related_download_bytes); + g_assert (seen_root_op || root_op_skipped); + + /* Avoid overflows when converting to percent, at the cost of losing + * some precision in the least significant digits. */ + if (related_prior_download_bytes > G_MAXUINT64 / 100 || + current_bytes_transferred > G_MAXUINT64 / 100) { + related_prior_download_bytes /= 100; + current_bytes_transferred /= 100; + related_download_bytes /= 100; + } + + /* Update the progress of @root_app. */ + if (related_download_bytes > 0) + percent = ((related_prior_download_bytes * 100 / related_download_bytes) + + (current_bytes_transferred * 100 / related_download_bytes)); + else + percent = 0; + + if (gs_app_get_progress (root_app) == 100 || + gs_app_get_progress (root_app) == GS_APP_PROGRESS_UNKNOWN || + gs_app_get_progress (root_app) <= percent) { + gs_app_set_progress (root_app, percent); + } else { + g_warning ("ignoring percentage %u%% -> %u%% as going down on app %s", + gs_app_get_progress (root_app), percent, + gs_app_get_unique_id (root_app)); + } +} + +static void +update_progress_for_op_recurse_up (GsFlatpakTransaction *self, + FlatpakTransactionProgress *progress, + GList *ops, + FlatpakTransactionOperation *current_op, + FlatpakTransactionOperation *root_op, + GHashTable *checked_ops) +{ + GPtrArray *related_to_ops = flatpak_transaction_operation_get_related_to_ops (root_op); + + if (g_hash_table_contains (checked_ops, root_op)) + return; + + /* Update progress for @root_op */ + update_progress_for_op (self, progress, ops, current_op, root_op, checked_ops); + + /* Update progress for ops related to @root_op, e.g. apps whose runtime is @root_op */ + for (gsize i = 0; related_to_ops != NULL && i < related_to_ops->len; i++) { + FlatpakTransactionOperation *related_to_op = g_ptr_array_index (related_to_ops, i); + update_progress_for_op_recurse_up (self, progress, ops, current_op, related_to_op, checked_ops); + } +} + +static void +_transaction_progress_changed_cb (FlatpakTransactionProgress *progress, + gpointer user_data) +{ + ProgressData *data = user_data; + GsApp *app = data->app; + GsFlatpakTransaction *self = data->transaction; + g_autoptr(GHashTable) checked_ops = NULL; + g_autolist(FlatpakTransactionOperation) ops = NULL; + + if (flatpak_transaction_progress_get_is_estimating (progress)) { + /* "Estimating" happens while fetching the metadata, which + * flatpak arbitrarily decides happens during the first 5% of + * each operation. At this point, no more detailed progress + * information is available. */ + gs_app_set_progress (app, GS_APP_PROGRESS_UNKNOWN); + return; + } + + /* Update the progress on this app, and then do the same for each + * related parent app up the hierarchy. For example, @data->operation + * could be for a runtime which was added to the transaction because of + * an app — so we need to update the progress on the app too. + * + * It’s important to note that a new @data->progress is created by + * libflatpak for each @data->operation, and there are multiple + * operations in a transaction. There is no #FlatpakTransactionProgress + * which represents the progress of the whole transaction. + * + * There may be arbitrary many levels of related-to ops. For example, + * one common situation would be to install an app which needs a new + * runtime, and that runtime needs a locale to be installed, which would + * give three levels of related-to relation: + * locale → runtime → app → (null) + * + * In addition, libflatpak may decide to skip some operations (if they + * turn out to not be necessary). These skipped operations are not + * included in the list returned by flatpak_transaction_get_operations(), + * but they can be accessed via + * flatpak_transaction_operation_get_related_to_ops(), so have to be + * ignored manually. + */ + ops = flatpak_transaction_get_operations (FLATPAK_TRANSACTION (self)); + checked_ops = g_hash_table_new (NULL, NULL); + update_progress_for_op_recurse_up (self, progress, ops, data->operation, data->operation, checked_ops); +} + +static const gchar * +_flatpak_transaction_operation_type_to_string (FlatpakTransactionOperationType ot) +{ + if (ot == FLATPAK_TRANSACTION_OPERATION_INSTALL) + return "install"; + if (ot == FLATPAK_TRANSACTION_OPERATION_UPDATE) + return "update"; + if (ot == FLATPAK_TRANSACTION_OPERATION_INSTALL_BUNDLE) + return "install-bundle"; + if (ot == FLATPAK_TRANSACTION_OPERATION_UNINSTALL) + return "uninstall"; + return NULL; +} + +static void +progress_data_free_closure (gpointer user_data, + GClosure *closure) +{ + progress_data_free (user_data); +} + +static void +_transaction_new_operation (FlatpakTransaction *transaction, + FlatpakTransactionOperation *operation, + FlatpakTransactionProgress *progress) +{ + GsApp *app; + g_autoptr(ProgressData) progress_data = NULL; + + /* find app */ + app = _transaction_operation_get_app (operation); + if (app == NULL) { + FlatpakTransactionOperationType ot; + ot = flatpak_transaction_operation_get_operation_type (operation); + g_warning ("failed to find app for %s during %s", + flatpak_transaction_operation_get_ref (operation), + _flatpak_transaction_operation_type_to_string (ot)); + return; + } + + /* report progress */ + progress_data = g_new0 (ProgressData, 1); + progress_data->transaction = GS_FLATPAK_TRANSACTION (g_object_ref (transaction)); + progress_data->app = g_object_ref (app); + progress_data->operation = g_object_ref (operation); + + g_signal_connect_data (progress, "changed", + G_CALLBACK (_transaction_progress_changed_cb), + g_steal_pointer (&progress_data), + progress_data_free_closure, + 0 /* flags */); + flatpak_transaction_progress_set_update_frequency (progress, 500); /* FIXME? */ + + /* set app status */ + switch (flatpak_transaction_operation_get_operation_type (operation)) { + case FLATPAK_TRANSACTION_OPERATION_INSTALL: + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + break; + case FLATPAK_TRANSACTION_OPERATION_INSTALL_BUNDLE: + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE_LOCAL); + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + break; + case FLATPAK_TRANSACTION_OPERATION_UPDATE: + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN || + gs_app_get_state (app) == GS_APP_STATE_INSTALLED) + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + break; + case FLATPAK_TRANSACTION_OPERATION_UNINSTALL: + gs_app_set_state (app, GS_APP_STATE_REMOVING); + break; + default: + break; + } +} + +static gboolean +later_op_also_related (GList *ops, + FlatpakTransactionOperation *current_op, + FlatpakTransactionOperation *related_to_current_op) +{ + /* Here we're determining if anything in @ops which comes after + * @current_op is related to @related_to_current_op and not skipped + * (but all @ops are not skipped so no need to check explicitly) + */ + gboolean found_later_op = FALSE, seen_current_op = FALSE; + for (GList *l = ops; l != NULL; l = l->next) { + FlatpakTransactionOperation *op = l->data; + GPtrArray *related_to_ops; + if (current_op == op) { + seen_current_op = TRUE; + continue; + } + if (!seen_current_op) + continue; + + related_to_ops = flatpak_transaction_operation_get_related_to_ops (op); + for (gsize i = 0; related_to_ops != NULL && i < related_to_ops->len; i++) { + FlatpakTransactionOperation *related_to_op = g_ptr_array_index (related_to_ops, i); + if (related_to_op == related_to_current_op) { + g_assert (flatpak_transaction_operation_get_is_skipped (related_to_op)); + found_later_op = TRUE; + } + } + } + + return found_later_op; +} + +static void +set_skipped_related_apps_to_installed (GsFlatpakTransaction *self, + FlatpakTransaction *transaction, + FlatpakTransactionOperation *operation) +{ + /* It's possible the thing being updated/installed, @operation, is a + * related ref (e.g. extension or runtime) of an app which itself doesn't + * need an update and therefore won't have _transaction_operation_done() + * called for it directly. So we have to set the main app to installed + * here. + */ + g_autolist(GObject) ops = flatpak_transaction_get_operations (transaction); + GPtrArray *related_to_ops = flatpak_transaction_operation_get_related_to_ops (operation); + + for (gsize i = 0; related_to_ops != NULL && i < related_to_ops->len; i++) { + FlatpakTransactionOperation *related_to_op = g_ptr_array_index (related_to_ops, i); + if (flatpak_transaction_operation_get_is_skipped (related_to_op)) { + const gchar *ref; + g_autoptr(GsApp) related_to_app = NULL; + + /* Check that no later op is also related to related_to_op, in + * which case we want to let that operation finish before setting + * the main app to installed. + */ + if (later_op_also_related (ops, operation, related_to_op)) + continue; + + ref = flatpak_transaction_operation_get_ref (related_to_op); + related_to_app = _ref_to_app (self, ref); + if (related_to_app != NULL) + gs_app_set_state (related_to_app, GS_APP_STATE_INSTALLED); + } + } +} + +static void +_transaction_operation_done (FlatpakTransaction *transaction, + FlatpakTransactionOperation *operation, + const gchar *commit, + FlatpakTransactionResult details) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (transaction); + + /* invalidate */ + GsApp *app = _transaction_operation_get_app (operation); + if (app == NULL) { + g_warning ("failed to find app for %s", + flatpak_transaction_operation_get_ref (operation)); + return; + } + switch (flatpak_transaction_operation_get_operation_type (operation)) { + case FLATPAK_TRANSACTION_OPERATION_INSTALL: + case FLATPAK_TRANSACTION_OPERATION_INSTALL_BUNDLE: + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + + set_skipped_related_apps_to_installed (self, transaction, operation); + break; + case FLATPAK_TRANSACTION_OPERATION_UPDATE: + gs_app_set_version (app, gs_app_get_update_version (app)); + gs_app_set_update_details_markup (app, NULL); + gs_app_set_update_urgency (app, AS_URGENCY_KIND_UNKNOWN); + gs_app_set_update_version (app, NULL); + /* force getting the new runtime */ + gs_app_remove_kudo (app, GS_APP_KUDO_SANDBOXED); + /* downloaded, but not yet installed */ + if (flatpak_transaction_get_no_deploy (transaction)) + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + else + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + + set_skipped_related_apps_to_installed (self, transaction, operation); + break; + case FLATPAK_TRANSACTION_OPERATION_UNINSTALL: + /* we don't actually know if this app is re-installable */ + gs_flatpak_app_set_commit (app, NULL); + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + break; + default: + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + break; + } +} + +static gboolean +_transaction_operation_error (FlatpakTransaction *transaction, + FlatpakTransactionOperation *operation, + const GError *error, + FlatpakTransactionErrorDetails detail) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (transaction); + FlatpakTransactionOperationType operation_type = flatpak_transaction_operation_get_operation_type (operation); + GsApp *app = _transaction_operation_get_app (operation); + const gchar *ref = flatpak_transaction_operation_get_ref (operation); + + gs_app_set_state_recover (app); + g_set_object (&self->error_operation, operation); + + if (g_error_matches (error, FLATPAK_ERROR, FLATPAK_ERROR_SKIPPED)) { + g_debug ("skipped to %s %s: %s", + _flatpak_transaction_operation_type_to_string (operation_type), + ref, + error->message); + return TRUE; /* continue */ + } + + /* If the transaction has been cancelled, bail out early rather + * than continuing to try operations which are all cancelled. */ + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("Transaction cancelled; stopping it"); + + return FALSE; /* stop */ + } + + if (detail & FLATPAK_TRANSACTION_ERROR_DETAILS_NON_FATAL) { + g_warning ("failed to %s %s (non fatal): %s", + _flatpak_transaction_operation_type_to_string (operation_type), + ref, + error->message); + return TRUE; /* continue */ + } + + if (self->first_operation_error == NULL) { + g_propagate_error (&self->first_operation_error, + g_error_copy (error)); + if (app != NULL) + gs_utils_error_add_app_id (&self->first_operation_error, app); + } + + if (!(detail & FLATPAK_TRANSACTION_ERROR_DETAILS_NON_FATAL) && + self->stop_on_first_error) + return FALSE; /* stop */ + + return TRUE; /* continue */ +} + +static int +_transaction_choose_remote_for_ref (FlatpakTransaction *transaction, + const char *for_ref, + const char *runtime_ref, + const char * const *remotes) +{ + //FIXME: do something smarter + return 0; +} + +static void +_transaction_end_of_lifed (FlatpakTransaction *transaction, + const gchar *ref, + const gchar *reason, + const gchar *rebase) +{ + if (rebase) { + g_message ("%s is end-of-life, in favor of %s", ref, rebase); + } else if (reason) { + g_message ("%s is end-of-life, with reason: %s", ref, reason); + } + //FIXME: show something in the UI +} + +static gboolean +_transaction_end_of_lifed_with_rebase (FlatpakTransaction *transaction, + const gchar *remote, + const gchar *ref, + const gchar *reason, + const gchar *rebased_to_ref, + const gchar **previous_ids) +{ + GsFlatpakTransaction *self = GS_FLATPAK_TRANSACTION (transaction); + + if (rebased_to_ref) { + g_message ("%s is end-of-life, in favor of %s", ref, rebased_to_ref); + } else if (reason) { + g_message ("%s is end-of-life, with reason: %s", ref, reason); + } + + if (rebased_to_ref && remote) { + g_autoptr(GError) local_error = NULL; + +#if FLATPAK_CHECK_VERSION(1, 15, 6) + if (!flatpak_transaction_add_rebase_and_uninstall (transaction, remote, rebased_to_ref, ref, + NULL, previous_ids, &local_error)) { +#else + if (!flatpak_transaction_add_rebase (transaction, remote, rebased_to_ref, + NULL, previous_ids, &local_error) || + !flatpak_transaction_add_uninstall (transaction, ref, &local_error)) { + /* NOT_INSTALLED error is expected in case the op that triggered this was install not update */ + if (g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) + g_clear_error (&local_error); + else +#endif + if (self->first_operation_error == NULL) + g_propagate_prefixed_error (&self->first_operation_error, + g_steal_pointer (&local_error), + "Failed to rebase %s to %s: ", + ref, rebased_to_ref); + + return FALSE; + } + + /* Note: A message about the rename will be shown in the UI + * thanks to code in gs_flatpak_refine_appstream() which + * sets gs_app_set_renamed_from(). + */ + return TRUE; + } + + return FALSE; +} + +static gboolean +_transaction_add_new_remote (FlatpakTransaction *transaction, + FlatpakTransactionRemoteReason reason, + const char *from_id, + const char *remote_name, + const char *url) +{ + /* additional apps */ + if (reason == FLATPAK_TRANSACTION_REMOTE_GENERIC_REPO) { + g_debug ("configuring %s as new generic remote", url); + return TRUE; //FIXME? + } + + /* runtime deps always make sense */ + if (reason == FLATPAK_TRANSACTION_REMOTE_RUNTIME_DEPS) { + g_debug ("configuring %s as new remote for deps", url); + return TRUE; + } + + return FALSE; +} + +static void +gs_flatpak_transaction_class_init (GsFlatpakTransactionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + FlatpakTransactionClass *transaction_class = FLATPAK_TRANSACTION_CLASS (klass); + + object_class->get_property = gs_flatpak_transaction_get_property; + object_class->set_property = gs_flatpak_transaction_set_property; + object_class->dispose = gs_flatpak_transaction_dispose; + object_class->finalize = gs_flatpak_transaction_finalize; + + transaction_class->ready = _transaction_ready; + transaction_class->add_new_remote = _transaction_add_new_remote; + transaction_class->new_operation = _transaction_new_operation; + transaction_class->operation_done = _transaction_operation_done; + transaction_class->operation_error = _transaction_operation_error; + transaction_class->choose_remote_for_ref = _transaction_choose_remote_for_ref; + transaction_class->end_of_lifed = _transaction_end_of_lifed; + transaction_class->end_of_lifed_with_rebase = _transaction_end_of_lifed_with_rebase; + + /** + * GsFlatpakTransaction:stop-on-first-error: + * + * Stop the transaction on the first fatal error. If %FALSE, the + * transaction will continue running and ignore subsequent errors. Some + * operations may be automatically skipped if they are related to + * operations which have errored. + * + * Typically this should be %TRUE. It may be %FALSE for transactions + * where lots of apps are being updated, as typically updates should be + * mostly independent of each other, and we want as many of them to + * be attempted as possible. + * + * Since: 44 + */ + props[PROP_STOP_ON_FIRST_ERROR] = + g_param_spec_boolean ("stop-on-first-error", + "Stop on First Error", + "Stop the transaction on the first fatal error.", + TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props); + + signals[SIGNAL_REF_TO_APP] = + g_signal_new ("ref-to-app", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, NULL, G_TYPE_OBJECT, 1, G_TYPE_STRING); +} + +static void +gs_flatpak_transaction_init (GsFlatpakTransaction *self) +{ + self->refhash = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) g_object_unref); + self->stop_on_first_error = TRUE; +} + +FlatpakTransaction * +gs_flatpak_transaction_new (FlatpakInstallation *installation, + gboolean stop_on_first_error, + GCancellable *cancellable, + GError **error) +{ + GsFlatpakTransaction *self; + self = g_initable_new (GS_TYPE_FLATPAK_TRANSACTION, + cancellable, error, + "installation", installation, + "stop-on-first-error", stop_on_first_error, + NULL); + if (self == NULL) + return NULL; + return FLATPAK_TRANSACTION (self); +} + +/** + * gs_flatpak_transaction_get_error_operation: + * @self: a #GsFlatpakTransaction + * @out_app: (out) (transfer none) (optional) (nullable): return location for + * the #GsApp associated with the returned transaction operation, or %NULL + * to ignore; the returned value may be %NULL if no error operation is set, + * or if there’s no app associated with it + * + * Get the #FlatpakTransactionOperation which caused the most recent error in + * the transaction. + * + * For transactions with #GsFlatpakTransaction:stop-on-first-error set, this + * will be the operation that caused the fatal error. + * + * Returns: (nullable) (transfer none): the operation which caused the error, or + * %NULL if none + * Since: 47 + */ +FlatpakTransactionOperation * +gs_flatpak_transaction_get_error_operation (GsFlatpakTransaction *self, + GsApp **out_app) +{ + g_return_val_if_fail (GS_IS_FLATPAK_TRANSACTION (self), NULL); + + if (out_app != NULL) { + if (self->error_operation != NULL) + *out_app = _transaction_operation_get_app (self->error_operation); + else + *out_app = NULL; + } + + return self->error_operation; +} diff --git a/plugins/flatpak/gs-flatpak-transaction.h b/plugins/flatpak/gs-flatpak-transaction.h new file mode 100644 index 0000000..2e22dc4 --- /dev/null +++ b/plugins/flatpak/gs-flatpak-transaction.h @@ -0,0 +1,39 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +typedef enum { + GS_FLATPAK_ERROR_MODE_IGNORE_ERRORS = 0, + GS_FLATPAK_ERROR_MODE_STOP_ON_FIRST_ERROR = 1, +} GsFlatpakErrorMode; + +#define GS_TYPE_FLATPAK_TRANSACTION (gs_flatpak_transaction_get_type ()) + +G_DECLARE_FINAL_TYPE (GsFlatpakTransaction, gs_flatpak_transaction, GS, FLATPAK_TRANSACTION, FlatpakTransaction) + +FlatpakTransaction *gs_flatpak_transaction_new (FlatpakInstallation *installation, + gboolean stop_on_first_error, + GCancellable *cancellable, + GError **error); +GsApp *gs_flatpak_transaction_get_app_by_ref (FlatpakTransaction *transaction, + const gchar *ref); +void gs_flatpak_transaction_add_app (FlatpakTransaction *transaction, + GsApp *app); +gboolean gs_flatpak_transaction_run (FlatpakTransaction *transaction, + GCancellable *cancellable, + GError **error); +FlatpakTransactionOperation *gs_flatpak_transaction_get_error_operation (GsFlatpakTransaction *self, + GsApp **out_app); + +G_END_DECLS diff --git a/plugins/flatpak/gs-flatpak-utils.c b/plugins/flatpak/gs-flatpak-utils.c new file mode 100644 index 0000000..8436391 --- /dev/null +++ b/plugins/flatpak/gs-flatpak-utils.c @@ -0,0 +1,274 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017-2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include + +#include + +#include "gs-flatpak-app.h" +#include "gs-flatpak.h" +#include "gs-flatpak-utils.h" + +void +gs_flatpak_error_convert (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return; + + /* this are allowed for low-level errors */ + if (gs_utils_error_convert_gio (perror)) + return; + + /* this are allowed for low-level errors */ + if (gs_utils_error_convert_gdbus (perror)) + return; + + /* this are allowed for network ops */ + if (gs_utils_error_convert_gresolver (perror)) + return; + + /* custom to this plugin */ + if (error->domain == FLATPAK_ERROR) { + switch (error->code) { + case FLATPAK_ERROR_ALREADY_INSTALLED: + case FLATPAK_ERROR_NOT_INSTALLED: + error->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + break; + case FLATPAK_ERROR_OUT_OF_SPACE: + error->code = GS_PLUGIN_ERROR_NO_SPACE; + break; + case FLATPAK_ERROR_INVALID_REF: + case FLATPAK_ERROR_INVALID_DATA: + error->code = GS_PLUGIN_ERROR_INVALID_FORMAT; + break; + default: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + } else if (error->domain == OSTREE_GPG_ERROR) { + error->code = GS_PLUGIN_ERROR_NO_SECURITY; + } else { + g_warning ("can't reliably fixup error from domain %s: %s", + g_quark_to_string (error->domain), + error->message); + error->code = GS_PLUGIN_ERROR_FAILED; + } + error->domain = GS_PLUGIN_ERROR; +} + +GsApp * +gs_flatpak_app_new_from_remote (GsPlugin *plugin, + FlatpakRemote *xremote, + gboolean is_user) +{ + g_autofree gchar *title = NULL; + g_autofree gchar *url = NULL; + g_autofree gchar *filter = NULL; + g_autofree gchar *description = NULL; + g_autofree gchar *comment = NULL; + g_autoptr(GsApp) app = NULL; + + app = gs_flatpak_app_new (flatpak_remote_get_name (xremote)); + gs_app_set_kind (app, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_state (app, flatpak_remote_get_disabled (xremote) ? + GS_APP_STATE_AVAILABLE : GS_APP_STATE_INSTALLED); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, + flatpak_remote_get_name (xremote)); + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_management_plugin (app, plugin); + gs_flatpak_app_set_packaging_info (app); + gs_app_set_scope (app, is_user ? AS_COMPONENT_SCOPE_USER : AS_COMPONENT_SCOPE_SYSTEM); + + gs_app_set_metadata (app, "GnomeSoftware::SortKey", "100"); + gs_app_set_metadata (app, "GnomeSoftware::InstallationKind", + is_user ? _("User Installation") : _("System Installation")); + if (!is_user) + gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE); + + /* title */ + title = flatpak_remote_get_title (xremote); + if (title != NULL) { + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, title); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, title); + } + + /* origin_ui on a remote is the repo dialogue section name, + * not the remote title */ + gs_app_set_origin_ui (app, _("Apps")); + + description = flatpak_remote_get_description (xremote); + if (description != NULL) + gs_app_set_description (app, GS_APP_QUALITY_NORMAL, description); + + /* url */ + url = flatpak_remote_get_url (xremote); + if (url != NULL) + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, url); + + filter = flatpak_remote_get_filter (xremote); + if (filter != NULL) + gs_flatpak_app_set_repo_filter (app, filter); + + comment = flatpak_remote_get_comment (xremote); + if (comment != NULL) + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, comment); + + /* success */ + return g_steal_pointer (&app); +} + +GsApp * +gs_flatpak_app_new_from_repo_file (GFile *file, + GCancellable *cancellable, + GError **error) +{ + gchar *tmp; + g_autofree gchar *basename = NULL; + g_autofree gchar *filename = NULL; + g_autofree gchar *repo_comment = NULL; + g_autofree gchar *repo_default_branch = NULL; + g_autofree gchar *repo_description = NULL; + g_autofree gchar *repo_gpgkey = NULL; + g_autofree gchar *repo_homepage = NULL; + g_autofree gchar *repo_icon = NULL; + g_autofree gchar *repo_id = NULL; + g_autofree gchar *repo_title = NULL; + g_autofree gchar *repo_url = NULL; + g_autofree gchar *repo_filter = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GKeyFile) kf = NULL; + g_autoptr(GsApp) app = NULL; + + /* read the file */ + kf = g_key_file_new (); + filename = g_file_get_path (file); + if (!g_key_file_load_from_file (kf, filename, + G_KEY_FILE_NONE, + &error_local)) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "failed to load flatpakrepo: %s", + error_local->message); + return NULL; + } + + /* get the ID from the basename */ + basename = g_file_get_basename (file); + tmp = g_strrstr (basename, "."); + if (tmp != NULL) + *tmp = '\0'; + + /* ensure this is valid for flatpak */ + if (ostree_validate_remote_name (basename, NULL)) { + repo_id = g_steal_pointer (&basename); + } else { + repo_id = g_str_to_ascii (basename, NULL); + + for (guint i = 0; repo_id[i] != '\0'; i++) { + if (!g_ascii_isalnum (repo_id[i])) + repo_id[i] = '_'; + } + } + + /* create source */ + repo_title = g_key_file_get_string (kf, "Flatpak Repo", "Title", NULL); + repo_url = g_key_file_get_string (kf, "Flatpak Repo", "Url", NULL); + if (repo_title == NULL || repo_url == NULL || + repo_title[0] == '\0' || repo_url[0] == '\0') { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "not enough data in file, " + "expected at least Title and Url"); + return NULL; + } + + /* check version */ + if (g_key_file_has_key (kf, "Flatpak Repo", "Version", NULL)) { + guint64 ver = g_key_file_get_uint64 (kf, "Flatpak Repo", "Version", NULL); + if (ver != 1) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "unsupported version %" G_GUINT64_FORMAT, ver); + return NULL; + } + } + + /* create source */ + app = gs_flatpak_app_new (repo_id); + gs_flatpak_app_set_file_kind (app, GS_FLATPAK_APP_FILE_KIND_REPO); + gs_app_set_kind (app, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE_LOCAL); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, repo_title); + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_flatpak_app_set_repo_url (app, repo_url); + gs_app_set_origin_ui (app, repo_title); + gs_app_set_origin_hostname (app, repo_url); + + /* user specified a URL */ + repo_gpgkey = g_key_file_get_string (kf, "Flatpak Repo", "GPGKey", NULL); + if (repo_gpgkey != NULL) { + if (g_str_has_prefix (repo_gpgkey, "http://") || + g_str_has_prefix (repo_gpgkey, "https://")) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "Base64 encoded GPGKey required, not URL"); + return NULL; + } + gs_flatpak_app_set_repo_gpgkey (app, repo_gpgkey); + } + + /* optional data */ + repo_homepage = g_key_file_get_string (kf, "Flatpak Repo", "Homepage", NULL); + if (repo_homepage != NULL) + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, repo_homepage); + repo_comment = g_key_file_get_string (kf, "Flatpak Repo", "Comment", NULL); + if (repo_comment != NULL) + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, repo_comment); + repo_description = g_key_file_get_string (kf, "Flatpak Repo", "Description", NULL); + if (repo_description != NULL) + gs_app_set_description (app, GS_APP_QUALITY_NORMAL, repo_description); + repo_default_branch = g_key_file_get_string (kf, "Flatpak Repo", "DefaultBranch", NULL); + if (repo_default_branch != NULL) + gs_app_set_branch (app, repo_default_branch); + repo_icon = g_key_file_get_string (kf, "Flatpak Repo", "Icon", NULL); + if (repo_icon != NULL && + (g_str_has_prefix (repo_icon, "http:") || + g_str_has_prefix (repo_icon, "https:"))) { + /* Unfortunately the .flatpakrepo file doesn’t specify the icon + * size or scale out of band. */ + g_autoptr(GIcon) icon = gs_remote_icon_new (repo_icon); + gs_app_add_icon (app, icon); + } + repo_filter = g_key_file_get_string (kf, "Flatpak Repo", "Filter", NULL); + if (repo_filter != NULL && *repo_filter != '\0') + gs_flatpak_app_set_repo_filter (app, repo_filter); + + /* success */ + return g_steal_pointer (&app); +} + +void +gs_flatpak_app_set_packaging_info (GsApp *app) +{ + g_return_if_fail (GS_IS_APP (app)); + + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_FLATPAK); + gs_app_set_metadata (app, "GnomeSoftware::PackagingBaseCssColor", "flatpak_packaging_color"); + gs_app_set_metadata (app, "GnomeSoftware::PackagingIcon", "package-flatpak-symbolic"); + gs_app_set_metadata (app, "GnomeSoftware::packagename-title", _("App ID")); +} diff --git a/plugins/flatpak/gs-flatpak-utils.h b/plugins/flatpak/gs-flatpak-utils.h new file mode 100644 index 0000000..c9cfb05 --- /dev/null +++ b/plugins/flatpak/gs-flatpak-utils.h @@ -0,0 +1,24 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +G_BEGIN_DECLS + +#include + +void gs_flatpak_error_convert (GError **perror); +GsApp *gs_flatpak_app_new_from_remote (GsPlugin *plugin, + FlatpakRemote *xremote, + gboolean is_user); +GsApp *gs_flatpak_app_new_from_repo_file (GFile *file, + GCancellable *cancellable, + GError **error); +void gs_flatpak_app_set_packaging_info (GsApp *app); + +G_END_DECLS diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c new file mode 100644 index 0000000..8d1581e --- /dev/null +++ b/plugins/flatpak/gs-flatpak.c @@ -0,0 +1,4838 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Joaquim Rocha + * Copyright (C) 2016-2018 Richard Hughes + * Copyright (C) 2016-2019 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* Notes: + * + * All GsApp's created have management-plugin set to flatpak + * The GsApp:origin is the remote name, e.g. test-repo + * + * Two #FlatpakInstallation objects are kept: `installation_noninteractive` and + * `installation_interactive`. One has flatpak_installation_set_no_interaction() + * set to %TRUE, the other to %FALSE. + * + * This is because multiple #GsFlatpak operations can be ongoing with different + * interactive states (for example, a background refresh operation while the + * user is refining an app in the foreground), but the #FlatpakInstallation + * methods don’t support per-operation interactive state. + * + * Internally, each #FlatpakInstallation will use a separate #FlatpakDir + * pointing to the same repository. Those #FlatpakDirs will lock the repository + * when using it, so parallel operations won’t race. + */ + +#include + +#include +#include +#include + +#include "gs-appstream.h" +#include "gs-app-private.h" +#include "gs-flatpak-app.h" +#include "gs-flatpak.h" +#include "gs-flatpak-transaction.h" +#include "gs-flatpak-utils.h" +#include "gs-profiler.h" + +struct _GsFlatpak { + GObject parent_instance; + GsFlatpakFlags flags; + FlatpakInstallation *installation_noninteractive; /* (owned) */ + FlatpakInstallation *installation_interactive; /* (owned) */ + GPtrArray *installed_refs; /* must be entirely replaced rather than updated internally */ + GHashTable *remotes_by_name; + GMutex installed_refs_mutex; + GHashTable *broken_remotes; + GMutex broken_remotes_mutex; + GFileMonitor *monitor; + AsComponentScope scope; + GsPlugin *plugin; + XbSilo *silo; + GMutex silo_lock; + gchar *silo_filename; + GHashTable *silo_installed_by_desktopid; + gint silo_change_stamp; + gint silo_change_stamp_current; + gchar *id; + guint changed_id; + GHashTable *app_silos; + GMutex app_silos_mutex; + GHashTable *remote_title; /* gchar *remote name ~> gchar *remote title */ + GMutex remote_title_mutex; + gboolean requires_full_rescan; + gint busy; /* (atomic) */ + gboolean changed_while_busy; +}; + +G_DEFINE_TYPE (GsFlatpak, gs_flatpak, G_TYPE_OBJECT) + +static void +gs_plugin_refine_item_scope (GsFlatpak *self, GsApp *app) +{ + if (gs_app_get_scope (app) == AS_COMPONENT_SCOPE_UNKNOWN && + (self->flags & GS_FLATPAK_FLAG_IS_TEMPORARY) == 0) { + gboolean is_user = flatpak_installation_get_is_user (self->installation_noninteractive); + gs_app_set_scope (app, is_user ? AS_COMPONENT_SCOPE_USER : AS_COMPONENT_SCOPE_SYSTEM); + } +} + +static void +gs_flatpak_claim_app (GsFlatpak *self, GsApp *app) +{ + if (!gs_app_has_management_plugin (app, NULL)) + return; + + gs_app_set_management_plugin (app, self->plugin); + gs_flatpak_app_set_packaging_info (app); + + /* only when we have a non-temp object */ + if ((self->flags & GS_FLATPAK_FLAG_IS_TEMPORARY) == 0) { + gs_app_set_scope (app, self->scope); + gs_flatpak_app_set_object_id (app, gs_flatpak_get_id (self)); + } +} + +static void +gs_flatpak_ensure_remote_title (GsFlatpak *self, + gboolean interactive, + GCancellable *cancellable) +{ + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->remote_title_mutex); + g_autoptr(GPtrArray) xremotes = NULL; + + if (g_hash_table_size (self->remote_title)) + return; + + xremotes = flatpak_installation_list_remotes (gs_flatpak_get_installation (self, interactive), cancellable, NULL); + if (xremotes) { + guint ii; + + for (ii = 0; ii < xremotes->len; ii++) { + FlatpakRemote *xremote = g_ptr_array_index (xremotes, ii); + + if (flatpak_remote_get_disabled (xremote) || + !flatpak_remote_get_name (xremote)) + continue; + + g_hash_table_insert (self->remote_title, g_strdup (flatpak_remote_get_name (xremote)), flatpak_remote_get_title (xremote)); + } + } +} + +static void +gs_flatpak_set_app_origin (GsFlatpak *self, + GsApp *app, + const gchar *origin, + FlatpakRemote *xremote, + gboolean interactive, + GCancellable *cancellable) +{ + g_autoptr(GMutexLocker) locker = NULL; + g_autofree gchar *tmp = NULL; + const gchar *title = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (origin != NULL); + + if (xremote) { + tmp = flatpak_remote_get_title (xremote); + title = tmp; + } else { + locker = g_mutex_locker_new (&self->remote_title_mutex); + title = g_hash_table_lookup (self->remote_title, origin); + } + + if (!title) { + g_autoptr(GPtrArray) xremotes = NULL; + + xremotes = flatpak_installation_list_remotes (gs_flatpak_get_installation (self, interactive), cancellable, NULL); + + if (xremotes) { + guint ii; + + for (ii = 0; ii < xremotes->len; ii++) { + FlatpakRemote *yremote = g_ptr_array_index (xremotes, ii); + + if (flatpak_remote_get_disabled (yremote)) + continue; + + if (g_strcmp0 (flatpak_remote_get_name (yremote), origin) == 0) { + title = flatpak_remote_get_title (yremote); + + if (!locker) + locker = g_mutex_locker_new (&self->remote_title_mutex); + + /* Takes ownership of the 'title' */ + g_hash_table_insert (self->remote_title, g_strdup (origin), (gpointer) title); + break; + } + } + } + } + + if (g_strcmp0 (origin, "flathub-beta") == 0 || + g_strcmp0 (gs_app_get_branch (app), "devel") == 0 || + g_strcmp0 (gs_app_get_branch (app), "master") == 0 || + (gs_app_get_branch (app) && g_str_has_suffix (gs_app_get_branch (app), "beta"))) + gs_app_add_quirk (app, GS_APP_QUIRK_DEVELOPMENT_SOURCE); + + gs_app_set_origin (app, origin); + gs_app_set_origin_ui (app, title); +} + +static void +gs_flatpak_claim_app_list (GsFlatpak *self, + GsAppList *list, + gboolean interactive) +{ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + /* Do not claim ownership of a wildcard app */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + + if (gs_app_get_origin (app)) + gs_flatpak_set_app_origin (self, app, gs_app_get_origin (app), NULL, interactive, NULL); + + gs_flatpak_claim_app (self, app); + } +} + +static void +gs_flatpak_set_runtime_kind_from_id (GsApp *app) +{ + const gchar *id = gs_app_get_id (app); + /* this is anything that's not an app, including locales + * sources and debuginfo */ + if (g_str_has_suffix (id, ".Locale")) { + gs_app_set_kind (app, AS_COMPONENT_KIND_LOCALIZATION); + } else if (g_str_has_suffix (id, ".Debug") || + g_str_has_suffix (id, ".Sources") || + g_str_has_prefix (id, "org.freedesktop.Platform.Icontheme.") || + g_str_has_prefix (id, "org.gtk.Gtk3theme.")) { + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + } else if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN) { + gs_app_set_kind (app, AS_COMPONENT_KIND_RUNTIME); + } +} + +static void +gs_flatpak_set_kind_from_flatpak (GsApp *app, FlatpakRef *xref) +{ + if (flatpak_ref_get_kind (xref) == FLATPAK_REF_KIND_APP) { + /* the appstream plugin can set proper kind, like console-application, + from the appstream data */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN) + gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP); + } else if (flatpak_ref_get_kind (xref) == FLATPAK_REF_KIND_RUNTIME) { + gs_flatpak_set_runtime_kind_from_id (app); + } +} + +static guint +gs_get_strv_index (const gchar * const *strv, + const gchar *value) +{ + guint ii; + + for (ii = 0; strv[ii]; ii++) { + if (g_str_equal (strv[ii], value)) + break; + } + + return ii; +} + +static GsBusPolicyPermission +bus_policy_permission_from_string (const char *str) +{ + if (str == NULL || g_str_equal (str, "none")) + return GS_BUS_POLICY_PERMISSION_NONE; + else if (g_str_equal (str, "see")) + return GS_BUS_POLICY_PERMISSION_SEE; + else if (g_str_equal (str, "talk")) + return GS_BUS_POLICY_PERMISSION_TALK; + else if (g_str_equal (str, "own")) + return GS_BUS_POLICY_PERMISSION_OWN; + else + return GS_BUS_POLICY_PERMISSION_UNKNOWN; +} + +static GsAppPermissions * +perms_from_metadata (GKeyFile *keyfile) +{ + char **strv; + char *str; + GsAppPermissions *permissions = gs_app_permissions_new (); + GsAppPermissionsFlags flags = GS_APP_PERMISSIONS_FLAGS_NONE; + + strv = g_key_file_get_string_list (keyfile, "Context", "sockets", NULL, NULL); + if (strv != NULL && g_strv_contains ((const gchar * const*)strv, "system-bus")) + flags |= GS_APP_PERMISSIONS_FLAGS_SYSTEM_BUS | GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX; + if (strv != NULL && g_strv_contains ((const gchar * const*)strv, "session-bus")) + flags |= GS_APP_PERMISSIONS_FLAGS_SESSION_BUS | GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX; + if (strv != NULL && + !g_strv_contains ((const gchar * const*)strv, "fallback-x11") && + g_strv_contains ((const gchar * const*)strv, "x11")) + flags |= GS_APP_PERMISSIONS_FLAGS_X11; + /* "fallback-x11" without "wayland" means X11 */ + if (strv != NULL && g_strv_contains ((const gchar * const*)strv, "fallback-x11") && + !g_strv_contains ((const gchar * const*)strv, "wayland")) + flags |= GS_APP_PERMISSIONS_FLAGS_X11; + if (strv != NULL && g_strv_contains ((const gchar * const*)strv, "pulseaudio")) + flags |= GS_APP_PERMISSIONS_FLAGS_AUDIO_DEVICES; + g_strfreev (strv); + + strv = g_key_file_get_string_list (keyfile, "Context", "devices", NULL, NULL); + if (strv != NULL && g_strv_contains ((const gchar * const*)strv, "all")) + flags |= GS_APP_PERMISSIONS_FLAGS_DEVICES; + if (strv != NULL && g_strv_contains ((const gchar * const*)strv, "input")) + flags |= GS_APP_PERMISSIONS_FLAGS_INPUT_DEVICES; + if (strv != NULL && (g_strv_contains ((const gchar * const*)strv, "shm") || + g_strv_contains ((const gchar * const*)strv, "kvm"))) + flags |= GS_APP_PERMISSIONS_FLAGS_SYSTEM_DEVICES; + g_strfreev (strv); + + strv = g_key_file_get_string_list (keyfile, "Context", "shared", NULL, NULL); + if (strv != NULL && g_strv_contains ((const gchar * const*)strv, "network")) + flags |= GS_APP_PERMISSIONS_FLAGS_NETWORK; + g_strfreev (strv); + + strv = g_key_file_get_string_list (keyfile, "Context", "filesystems", NULL, NULL); + if (strv != NULL) { + const struct { + const gchar *key; + GsAppPermissionsFlags perm; + } filesystems_access[] = { + /* Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 */ + { "home", GS_APP_PERMISSIONS_FLAGS_HOME_FULL }, + { "home:rw", GS_APP_PERMISSIONS_FLAGS_HOME_FULL }, + { "home:ro", GS_APP_PERMISSIONS_FLAGS_HOME_READ }, + { "~", GS_APP_PERMISSIONS_FLAGS_HOME_FULL }, + { "~:rw", GS_APP_PERMISSIONS_FLAGS_HOME_FULL }, + { "~:ro", GS_APP_PERMISSIONS_FLAGS_HOME_READ }, + { "host", GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL }, + { "host:rw", GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL }, + { "host:ro", GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ }, + { "xdg-config/kdeglobals:ro", GS_APP_PERMISSIONS_FLAGS_NONE }, /* ignore this; all KDE apps need it */ + { "xdg-download", GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL }, + { "xdg-download:rw", GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL }, + { "xdg-download:ro", GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_READ }, + { "xdg-data/flatpak/overrides:create", GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX }, + { "xdg-run/pipewire-0", GS_APP_PERMISSIONS_FLAGS_SCREEN | GS_APP_PERMISSIONS_FLAGS_AUDIO_DEVICES }, /* see https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2329 */ + { "xdg-run/gvfsd", GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL }, /* see https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2760 */ + }; + guint filesystems_hits = 0; + guint strv_len = g_strv_length (strv); + + for (guint i = 0; i < G_N_ELEMENTS (filesystems_access); i++) { + guint index = gs_get_strv_index ((const gchar * const *) strv, filesystems_access[i].key); + if (index < strv_len) { + flags |= filesystems_access[i].perm; + filesystems_hits++; + /* Mark it as used */ + strv[index][0] = '\0'; + } + } + + if ((flags & GS_APP_PERMISSIONS_FLAGS_HOME_FULL) != 0) + flags = flags & ~GS_APP_PERMISSIONS_FLAGS_HOME_READ; + if ((flags & GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL) != 0) + flags = flags & ~GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ; + if ((flags & GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL) != 0) + flags = flags & ~GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_READ; + + if (strv_len > filesystems_hits) { + /* Cover those not being part of the above filesystem_access array */ + const struct { + const gchar *prefix; + const gchar *title; + const gchar *title_subdir; + } filesystems_other[] = { + /* Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 */ + { "/", NULL, N_("System folder %s") }, + { "home/", NULL, N_("Home subfolder %s") }, + { "~/", NULL, N_("Home subfolder %s") }, + { "host-os", N_("Host system folders"), NULL }, + { "host-etc", N_("Host system configuration from /etc"), NULL }, + { "xdg-desktop", N_("Desktop folder"), N_("Desktop subfolder %s") }, + { "xdg-documents", N_("Documents folder"), N_("Documents subfolder %s") }, + { "xdg-music", N_("Music folder"), N_("Music subfolder %s") }, + { "xdg-pictures", N_("Pictures folder"), N_("Pictures subfolder %s") }, + { "xdg-public-share", N_("Public Share folder"), N_("Public Share subfolder %s") }, + { "xdg-videos", N_("Videos folder"), N_("Videos subfolder %s") }, + { "xdg-templates", N_("Templates folder"), N_("Templates subfolder %s") }, + { "xdg-cache", N_("User cache folder"), N_("User cache subfolder %s") }, + { "xdg-config", N_("User configuration folder"), N_("User configuration subfolder %s") }, + { "xdg-data", N_("User data folder"), N_("User data subfolder %s") }, + { "xdg-run", N_("User runtime folder"), N_("User runtime subfolder %s") } + }; + + flags |= GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER; + + for (guint j = 0; strv[j]; j++) { + gchar *perm = strv[j]; + gboolean is_readonly; + gchar *colon; + guint i; + + /* Already handled by the flags */ + if (!perm[0]) + continue; + + is_readonly = g_str_has_suffix (perm, ":ro"); + colon = strrchr (perm, ':'); + /* modifiers are ":ro", ":rw", ":create", where ":create" is ":rw" + create + and ":rw" is default; treat ":create" as ":rw" */ + if (colon) { + /* Completeness check */ + if (!g_str_equal (colon, ":ro") && + !g_str_equal (colon, ":rw") && + !g_str_equal (colon, ":create")) + g_debug ("Unknown filesystem permission modifier '%s' from '%s'", colon, perm); + /* cut it off */ + *colon = '\0'; + } + + for (i = 0; i < G_N_ELEMENTS (filesystems_other); i++) { + if (g_str_has_prefix (perm, filesystems_other[i].prefix)) { + g_autofree gchar *title_tmp = NULL; + const gchar *slash, *title = NULL; + slash = strchr (perm, '/'); + /* Catch and ignore invalid permission definitions */ + if (slash && filesystems_other[i].title_subdir != NULL) { + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wformat-nonliteral" + title_tmp = g_strdup_printf ( + _(filesystems_other[i].title_subdir), + slash + (slash == perm ? 0 : 1)); + #pragma GCC diagnostic pop + title = title_tmp; + } else if (!slash && filesystems_other[i].title != NULL) { + title = _(filesystems_other[i].title); + } + if (title != NULL) { + if (is_readonly) + gs_app_permissions_add_filesystem_read (permissions, title); + else + gs_app_permissions_add_filesystem_full (permissions, title); + } + break; + } + } + + /* Nothing matched, use a generic entry */ + if (i == G_N_ELEMENTS (filesystems_other)) { + g_autofree gchar *title = g_strdup_printf (_("Filesystem access to %s"), perm); + if (is_readonly) + gs_app_permissions_add_filesystem_read (permissions, title); + else + gs_app_permissions_add_filesystem_full (permissions, title); + } + } + } + } + g_strfreev (strv); + + str = g_key_file_get_string (keyfile, "Session Bus Policy", "ca.desrt.dconf", NULL); + if (bus_policy_permission_from_string (str) >= GS_BUS_POLICY_PERMISSION_TALK) + flags |= GS_APP_PERMISSIONS_FLAGS_SETTINGS; + g_free (str); + + { + /* There are various services on the session bus which are known to give sandbox escapes. */ + const char *known_session_bus_sandbox_escape_names[] = { + "org.freedesktop.Flatpak", + "org.freedesktop.impl.portal.PermissionStore", + }; + + for (size_t i = 0; !(flags & GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX) && i < G_N_ELEMENTS (known_session_bus_sandbox_escape_names); i++) { + g_autofree char *bus_policy = g_key_file_get_string (keyfile, "Session Bus Policy", known_session_bus_sandbox_escape_names[i], NULL); + if (bus_policy_permission_from_string (bus_policy) >= GS_BUS_POLICY_PERMISSION_TALK) + flags |= GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX; + } + + /* org.gtk.vfs.* is known to allow file system access */ + { + g_auto(GStrv) session_bus_policies = NULL; + + session_bus_policies = g_key_file_get_keys (keyfile, "Session Bus Policy", NULL, NULL); + for (size_t i = 0; session_bus_policies != NULL && session_bus_policies[i] != NULL; i++) { + if (g_str_has_prefix (session_bus_policies[i], "org.gtk.vfs.")) { + g_autofree char *bus_policy = g_key_file_get_string (keyfile, "Session Bus Policy", session_bus_policies[i], NULL); + if (bus_policy_permission_from_string (bus_policy) >= GS_BUS_POLICY_PERMISSION_TALK) + flags |= GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL; + } + } + } + } + + gs_app_permissions_set_flags (permissions, flags); + gs_app_permissions_seal (permissions); + + return permissions; +} + +static void +gs_flatpak_set_update_permissions (GsFlatpak *self, + GsApp *app, + FlatpakInstalledRef *xref, + gboolean interactive, + GCancellable *cancellable) +{ + g_autoptr(GBytes) old_bytes = NULL; + g_autoptr(GKeyFile) old_keyfile = NULL; + g_autoptr(GBytes) bytes = NULL; + g_autoptr(GKeyFile) keyfile = NULL; + g_autoptr(GsAppPermissions) additional_permissions = NULL; + g_autoptr(GError) error_local = NULL; + + old_bytes = flatpak_installed_ref_load_metadata (FLATPAK_INSTALLED_REF (xref), NULL, &error_local); + if (old_bytes == NULL) { + g_debug ("Failed to get metadata for app ‘%s’: %s", + gs_app_get_id (app), error_local->message); + g_clear_error (&error_local); + + /* Permissions are unknown, so leave @additional_permissions as NULL */ + g_assert (additional_permissions == NULL); + + goto finish; + } + + old_keyfile = g_key_file_new (); + g_key_file_load_from_data (old_keyfile, + g_bytes_get_data (old_bytes, NULL), + g_bytes_get_size (old_bytes), + 0, NULL); + + bytes = flatpak_installation_fetch_remote_metadata_sync (gs_flatpak_get_installation (self, interactive), + gs_app_get_origin (app), + FLATPAK_REF (xref), + cancellable, + &error_local); + if (bytes == NULL) { + g_debug ("Failed to get metadata for remote ‘%s’: %s", + gs_app_get_origin (app), error_local->message); + g_clear_error (&error_local); + + /* Permissions are unknown, so leave @additional_permissions as NULL */ + g_assert (additional_permissions == NULL); + } else { + g_autoptr(GsAppPermissions) old_permissions = NULL; + g_autoptr(GsAppPermissions) new_permissions = NULL; + + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, + g_bytes_get_data (bytes, NULL), + g_bytes_get_size (bytes), + 0, NULL); + + old_permissions = perms_from_metadata (old_keyfile); + new_permissions = perms_from_metadata (keyfile); + additional_permissions = gs_app_permissions_diff (old_permissions, new_permissions); + } + +finish: + /* Have new permissions been requested by the app? */ + gs_app_set_update_permissions (app, additional_permissions); + + if (additional_permissions != NULL && + !gs_app_permissions_is_empty (additional_permissions)) + gs_app_add_quirk (app, GS_APP_QUIRK_NEW_PERMISSIONS); + else + gs_app_remove_quirk (app, GS_APP_QUIRK_NEW_PERMISSIONS); +} + +static void +gs_flatpak_set_metadata (GsFlatpak *self, GsApp *app, FlatpakRef *xref) +{ + g_autofree gchar *ref_tmp = flatpak_ref_format_ref (FLATPAK_REF (xref)); + guint64 installed_size = 0, download_size = 0; + + /* core */ + gs_flatpak_claim_app (self, app); + gs_app_set_branch (app, flatpak_ref_get_branch (xref)); + gs_app_add_source (app, ref_tmp); + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", ref_tmp); + gs_plugin_refine_item_scope (self, app); + + /* flatpak specific */ + gs_flatpak_app_set_ref_kind (app, flatpak_ref_get_kind (xref)); + gs_flatpak_app_set_ref_name (app, flatpak_ref_get_name (xref)); + gs_flatpak_app_set_ref_arch (app, flatpak_ref_get_arch (xref)); + gs_flatpak_app_set_commit (app, flatpak_ref_get_commit (xref)); + + /* map the flatpak kind to the gnome-software kind */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN || + gs_app_get_kind (app) == AS_COMPONENT_KIND_GENERIC) { + gs_flatpak_set_kind_from_flatpak (app, xref); + } + + if (FLATPAK_IS_REMOTE_REF (xref) && flatpak_remote_ref_get_eol (FLATPAK_REMOTE_REF (xref)) != NULL) + gs_app_set_metadata (app, "GnomeSoftware::EolReason", flatpak_remote_ref_get_eol (FLATPAK_REMOTE_REF (xref))); + else if (FLATPAK_IS_INSTALLED_REF (xref) && flatpak_installed_ref_get_eol (FLATPAK_INSTALLED_REF (xref)) != NULL) + gs_app_set_metadata (app, "GnomeSoftware::EolReason", flatpak_installed_ref_get_eol (FLATPAK_INSTALLED_REF (xref))); + + if (FLATPAK_IS_REMOTE_REF (xref)) { + installed_size = flatpak_remote_ref_get_installed_size (FLATPAK_REMOTE_REF (xref)); + download_size = flatpak_remote_ref_get_download_size (FLATPAK_REMOTE_REF (xref)); + } else if (FLATPAK_IS_INSTALLED_REF (xref)) { + installed_size = flatpak_installed_ref_get_installed_size (FLATPAK_INSTALLED_REF (xref)); + } + + gs_app_set_size_installed (app, (installed_size != 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, installed_size); + gs_app_set_size_download (app, (download_size != 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, download_size); +} + +static GsApp * +gs_flatpak_create_app (GsFlatpak *self, + const gchar *origin, + FlatpakRef *xref, + FlatpakRemote *xremote, + gboolean interactive, + gboolean allow_cached, + GCancellable *cancellable) +{ + GsApp *app_cached; + g_autoptr(GsApp) app = NULL; + + /* create a temp GsApp */ + app = gs_app_new (flatpak_ref_get_name (xref)); + gs_flatpak_set_metadata (self, app, xref); + if (origin != NULL) { + gs_flatpak_set_app_origin (self, app, origin, xremote, interactive, cancellable); + + if (allow_cached && !(self->flags & GS_FLATPAK_FLAG_IS_TEMPORARY)) { + /* return the ref'd cached copy, only if the origin is known */ + app_cached = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app)); + if (app_cached != NULL) + return app_cached; + } + } + + /* fallback values */ + if (gs_flatpak_app_get_ref_kind (app) == FLATPAK_REF_KIND_RUNTIME) { + g_autoptr(GIcon) icon = NULL; + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, + flatpak_ref_get_name (FLATPAK_REF (xref))); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, + "Framework for applications"); + gs_app_set_version (app, flatpak_ref_get_branch (FLATPAK_REF (xref))); + icon = g_themed_icon_new ("system-component-runtime"); + gs_app_add_icon (app, icon); + } + + /* Don't add NULL origin apps to the cache. If the app is later set to + * origin x the cache may return it as a match for origin y since the cache + * hash table uses as_utils_data_id_equal() as the equal func and a NULL + * origin becomes a "*" in gs_utils_build_unique_id(). + */ + if (origin != NULL && allow_cached && !(self->flags & GS_FLATPAK_FLAG_IS_TEMPORARY)) + gs_plugin_cache_add (self->plugin, NULL, app); + + /* no existing match, just steal the temp object */ + return g_steal_pointer (&app); +} + +static GsApp * +gs_flatpak_create_source (GsFlatpak *self, FlatpakRemote *xremote) +{ + GsApp *app_cached; + g_autoptr(GsApp) app = NULL; + + /* create a temp GsApp */ + app = gs_flatpak_app_new_from_remote (self->plugin, xremote, + flatpak_installation_get_is_user (self->installation_noninteractive)); + gs_flatpak_claim_app (self, app); + + /* we already have one, returned the ref'd cached copy */ + app_cached = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app)); + if (app_cached != NULL) + return app_cached; + + /* no existing match, just steal the temp object */ + gs_plugin_cache_add (self->plugin, NULL, app); + return g_steal_pointer (&app); +} + +static void +gs_flatpak_invalidate_silo (GsFlatpak *self) +{ + g_atomic_int_inc (&self->silo_change_stamp); +} + +static void +gs_flatpak_internal_data_changed (GsFlatpak *self) +{ + g_autoptr(GMutexLocker) locker = NULL; + + /* drop the installed refs cache */ + locker = g_mutex_locker_new (&self->installed_refs_mutex); + g_clear_pointer (&self->installed_refs, g_ptr_array_unref); + g_clear_pointer (&self->remotes_by_name, g_hash_table_unref); + g_clear_pointer (&locker, g_mutex_locker_free); + + /* drop the remote title cache */ + locker = g_mutex_locker_new (&self->remote_title_mutex); + g_hash_table_remove_all (self->remote_title); + g_clear_pointer (&locker, g_mutex_locker_free); + + /* give all the repos a second chance */ + locker = g_mutex_locker_new (&self->broken_remotes_mutex); + g_hash_table_remove_all (self->broken_remotes); + g_clear_pointer (&locker, g_mutex_locker_free); + + gs_flatpak_invalidate_silo (self); + + self->requires_full_rescan = TRUE; +} + +static gboolean +gs_flatpak_claim_changed_idle_cb (gpointer user_data) +{ + GsFlatpak *self = user_data; + + gs_flatpak_internal_data_changed (self); + gs_plugin_cache_invalidate (self->plugin); + gs_plugin_reload (self->plugin); + + return G_SOURCE_REMOVE; +} + +static void +gs_plugin_flatpak_changed_cb (GFileMonitor *monitor, + GFile *child, + GFile *other_file, + GFileMonitorEvent event_type, + GsFlatpak *self) +{ + if (gs_flatpak_get_busy (self)) { + self->changed_while_busy = TRUE; + } else { + gs_flatpak_claim_changed_idle_cb (self); + } +} + +static gboolean +gs_flatpak_add_flatpak_keyword_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0) + gs_appstream_component_add_keyword (bn, "flatpak"); + return TRUE; +} + +static gboolean +gs_flatpak_fix_id_desktop_suffix_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0) { + g_auto(GStrv) split = NULL; + g_autoptr(XbBuilderNode) id = xb_builder_node_get_child (bn, "id", NULL); + g_autoptr(XbBuilderNode) bundle = xb_builder_node_get_child (bn, "bundle", NULL); + if (id == NULL || bundle == NULL) + return TRUE; + split = g_strsplit (xb_builder_node_get_text (bundle), "/", -1); + if (g_strv_length (split) != 4) + return TRUE; + if (g_strcmp0 (xb_builder_node_get_text (id), split[1]) != 0) { + g_debug ("fixing up %s to %s", + xb_builder_node_get_text (id), split[1]); + gs_appstream_component_add_provide (bn, xb_builder_node_get_text (id)); + xb_builder_node_set_text (id, split[1], -1); + } + } + return TRUE; +} + +static gboolean +gs_flatpak_add_bundle_tag_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + const char *app_ref = (char *)user_data; + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0) { + g_autoptr(XbBuilderNode) id = xb_builder_node_get_child (bn, "id", NULL); + g_autoptr(XbBuilderNode) bundle = xb_builder_node_get_child (bn, "bundle", NULL); + if (id == NULL || bundle != NULL) + return TRUE; + g_debug ("adding tag for %s", app_ref); + xb_builder_node_insert_text (bn, "bundle", app_ref, "type", "flatpak", NULL); + } + return TRUE; +} + +static gboolean +gs_flatpak_fix_metadata_tag_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0) { + g_autoptr(XbBuilderNode) metadata = xb_builder_node_get_child (bn, "metadata", NULL); + if (metadata != NULL) + xb_builder_node_set_element (metadata, "custom"); + } + return TRUE; +} + +static gboolean +gs_flatpak_set_origin_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + const char *remote_name = (char *)user_data; + if (g_strcmp0 (xb_builder_node_get_element (bn), "components") == 0) { + xb_builder_node_set_attr (bn, "origin", + remote_name); + } + return TRUE; +} + +static gboolean +gs_flatpak_filter_default_branch_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + const gchar *default_branch = (const gchar *) user_data; + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0) { + g_autoptr(XbBuilderNode) bc = xb_builder_node_get_child (bn, "bundle", NULL); + g_auto(GStrv) split = NULL; + if (bc == NULL) { + g_debug ("no bundle for component"); + return TRUE; + } + split = g_strsplit (xb_builder_node_get_text (bc), "/", -1); + if (split == NULL || g_strv_length (split) != 4) + return TRUE; + if (g_strcmp0 (split[3], default_branch) != 0) { + g_debug ("not adding app with branch %s as filtering to %s", + split[3], default_branch); + xb_builder_node_add_flag (bn, XB_BUILDER_NODE_FLAG_IGNORE); + } + } + return TRUE; +} + +static gboolean +gs_flatpak_filter_noenumerate_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + const gchar *main_ref = (const gchar *) user_data; + + if (g_strcmp0 (xb_builder_node_get_element (bn), "component") == 0) { + g_autoptr(XbBuilderNode) bc = xb_builder_node_get_child (bn, "bundle", NULL); + if (bc == NULL) { + g_debug ("no bundle for component"); + return TRUE; + } + if (g_strcmp0 (xb_builder_node_get_text (bc), main_ref) != 0) { + g_debug ("not adding app %s as filtering to %s", + xb_builder_node_get_text (bc), main_ref); + xb_builder_node_add_flag (bn, XB_BUILDER_NODE_FLAG_IGNORE); + } + } + return TRUE; +} + +static gboolean +gs_flatpak_tokenize_cb (XbBuilderFixup *self, + XbBuilderNode *bn, + gpointer user_data, + GError **error) +{ + const gchar * const elements_to_tokenize[] = { + "id", + "keyword", + "launchable", + "mimetype", + "name", + "summary", + NULL }; + if (xb_builder_node_get_element (bn) != NULL && + g_strv_contains (elements_to_tokenize, xb_builder_node_get_element (bn))) + xb_builder_node_tokenize_text (bn); + return TRUE; +} + +static void +fixup_flatpak_appstream_xml (XbBuilderSource *source, + const char *origin) +{ + g_autoptr(XbBuilderFixup) fixup1 = NULL; + g_autoptr(XbBuilderFixup) fixup2 = NULL; + g_autoptr(XbBuilderFixup) fixup3 = NULL; + g_autoptr(XbBuilderFixup) fixup5 = NULL; + + /* add the flatpak search keyword */ + fixup1 = xb_builder_fixup_new ("AddKeywordFlatpak", + gs_flatpak_add_flatpak_keyword_cb, + NULL, NULL); + xb_builder_fixup_set_max_depth (fixup1, 2); + xb_builder_source_add_fixup (source, fixup1); + + /* ensure the matches the flatpak ref ID */ + fixup2 = xb_builder_fixup_new ("FixIdDesktopSuffix", + gs_flatpak_fix_id_desktop_suffix_cb, + NULL, NULL); + xb_builder_fixup_set_max_depth (fixup2, 2); + xb_builder_source_add_fixup (source, fixup2); + + /* Fixup to for appstream versions >= 0.9 */ + fixup3 = xb_builder_fixup_new ("FixMetadataTag", + gs_flatpak_fix_metadata_tag_cb, + NULL, NULL); + xb_builder_fixup_set_max_depth (fixup3, 2); + xb_builder_source_add_fixup (source, fixup3); + + fixup5 = xb_builder_fixup_new ("TextTokenize", + gs_flatpak_tokenize_cb, + NULL, NULL); + xb_builder_fixup_set_max_depth (fixup5, 2); + xb_builder_source_add_fixup (source, fixup5); + + if (origin != NULL) { + g_autoptr(XbBuilderFixup) fixup4 = NULL; + + /* override the *AppStream* origin */ + fixup4 = xb_builder_fixup_new ("SetOrigin", + gs_flatpak_set_origin_cb, + g_strdup (origin), g_free); + xb_builder_fixup_set_max_depth (fixup4, 1); + xb_builder_source_add_fixup (source, fixup4); + } +} + +static gboolean +gs_flatpak_refresh_appstream_remote (GsFlatpak *self, + const gchar *remote_name, + gboolean interactive, + GCancellable *cancellable, + GError **error); + +static gboolean +gs_flatpak_add_apps_from_xremote (GsFlatpak *self, + XbBuilder *builder, + FlatpakRemote *xremote, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *appstream_dir_fn = NULL; + g_autofree gchar *appstream_fn = NULL; + g_autofree gchar *icon_prefix = NULL; + g_autofree gchar *default_branch = NULL; + g_autoptr(GFile) appstream_dir = NULL; + g_autoptr(GFile) file_xml = NULL; + g_autoptr(GSettings) settings = NULL; + g_autoptr(XbBuilderNode) info = NULL; + g_autoptr(XbBuilderSource) source = xb_builder_source_new (); + const gchar *remote_name = flatpak_remote_get_name (xremote); + gboolean did_refresh = FALSE; + + /* get the AppStream data location */ + appstream_dir = flatpak_remote_get_appstream_dir (xremote, NULL); + if (appstream_dir == NULL) { + g_autoptr(GError) error_local = NULL; + g_debug ("no appstream dir for %s, trying refresh...", + remote_name); + + if (!gs_flatpak_refresh_appstream_remote (self, remote_name, interactive, cancellable, &error_local)) { + g_debug ("Failed to refresh appstream data for '%s': %s", remote_name, error_local->message); + if (g_error_matches (error_local, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED)) { + g_autoptr(GMutexLocker) locker = NULL; + + locker = g_mutex_locker_new (&self->broken_remotes_mutex); + + /* don't try to fetch this again until refresh() */ + g_hash_table_insert (self->broken_remotes, + g_strdup (remote_name), + GUINT_TO_POINTER (1)); + } + return TRUE; + } + + appstream_dir = flatpak_remote_get_appstream_dir (xremote, NULL); + if (appstream_dir == NULL) { + g_debug ("no appstream dir for %s even after refresh, skipping", + remote_name); + return TRUE; + } + + did_refresh = TRUE; + } + + /* load the file into a temp silo */ + appstream_dir_fn = g_file_get_path (appstream_dir); + appstream_fn = g_build_filename (appstream_dir_fn, "appstream.xml.gz", NULL); + if (!g_file_test (appstream_fn, G_FILE_TEST_EXISTS)) { + g_autoptr(GError) error_local = NULL; + g_debug ("no appstream metadata found for '%s' (file: %s), %s", + remote_name, + appstream_fn, + did_refresh ? "skipping" : "trying refresh..."); + if (did_refresh) + return TRUE; + + if (!gs_flatpak_refresh_appstream_remote (self, remote_name, interactive, cancellable, &error_local)) { + g_debug ("Failed to refresh appstream data for '%s': %s", remote_name, error_local->message); + if (g_error_matches (error_local, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED)) { + g_autoptr(GMutexLocker) locker = NULL; + + locker = g_mutex_locker_new (&self->broken_remotes_mutex); + + /* don't try to fetch this again until refresh() */ + g_hash_table_insert (self->broken_remotes, + g_strdup (remote_name), + GUINT_TO_POINTER (1)); + } + return TRUE; + } + + if (!g_file_test (appstream_fn, G_FILE_TEST_EXISTS)) { + g_debug ("no appstream metadata found for '%s', even after refresh (file: %s), skipping", + remote_name, + appstream_fn); + return TRUE; + } + } + + /* add source */ + file_xml = g_file_new_for_path (appstream_fn); + if (!xb_builder_source_load_file (source, file_xml, + XB_BUILDER_SOURCE_FLAG_WATCH_FILE | + XB_BUILDER_SOURCE_FLAG_LITERAL_TEXT, + cancellable, + error)) + return FALSE; + + fixup_flatpak_appstream_xml (source, remote_name); + + /* add metadata */ + icon_prefix = g_build_filename (appstream_dir_fn, "icons", NULL); + info = xb_builder_node_insert (NULL, "info", NULL); + xb_builder_node_insert_text (info, "scope", as_component_scope_to_string (self->scope), NULL); + xb_builder_node_insert_text (info, "icon-prefix", icon_prefix, NULL); + xb_builder_source_set_info (source, info); + + /* only add the specific app for noenumerate=true */ + if (flatpak_remote_get_noenumerate (xremote)) { + g_autofree gchar *main_ref = NULL; + + main_ref = flatpak_remote_get_main_ref (xremote); + + if (main_ref != NULL) { + g_autoptr(XbBuilderFixup) fixup = NULL; + fixup = xb_builder_fixup_new ("FilterNoEnumerate", + gs_flatpak_filter_noenumerate_cb, + g_strdup (main_ref), + g_free); + xb_builder_fixup_set_max_depth (fixup, 2); + xb_builder_source_add_fixup (source, fixup); + } + } + + /* do we want to filter to the default branch */ + settings = g_settings_new ("org.gnome.software"); + default_branch = flatpak_remote_get_default_branch (xremote); + if (g_settings_get_boolean (settings, "filter-default-branch") && + default_branch != NULL) { + g_autoptr(XbBuilderFixup) fixup = NULL; + fixup = xb_builder_fixup_new ("FilterDefaultbranch", + gs_flatpak_filter_default_branch_cb, + flatpak_remote_get_default_branch (xremote), + g_free); + xb_builder_fixup_set_max_depth (fixup, 2); + xb_builder_source_add_fixup (source, fixup); + } + + /* success */ + xb_builder_import_source (builder, source); + return TRUE; +} + +static gchar * +gs_flatpak_get_desktop_files_dir (GsFlatpak *self) +{ + g_autoptr(GFile) path = NULL; + g_autofree gchar *path_str = NULL; + + path = flatpak_installation_get_path (self->installation_noninteractive); + path_str = g_file_get_path (path); + return g_build_filename (path_str, "exports", "share", "applications", NULL); +} + +static void +gs_flatpak_rescan_installed (GsFlatpak *self, + XbBuilder *builder, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *path = NULL; + g_autoptr(GError) error_local = NULL; + + /* add all installed desktop files */ + path = gs_flatpak_get_desktop_files_dir (self); + if (!gs_appstream_load_desktop_files (builder, path, NULL, NULL, cancellable, &error_local)) + g_debug ("Failed to read flatpak .desktop files in %s: %s", path, error_local->message); +} + +static XbSilo * +gs_flatpak_ref_silo (GsFlatpak *self, + gboolean interactive, + gchar **out_silo_filename, + GHashTable **out_silo_installed_by_desktopid, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *blobfn = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GPtrArray) xremotes = NULL; + g_autoptr(GPtrArray) desktop_paths = NULL; + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(XbBuilder) builder = NULL; + g_autoptr(GMainContext) old_thread_default = NULL; + + locker = g_mutex_locker_new (&self->silo_lock); + /* everything is okay */ + if (self->silo != NULL && xb_silo_is_valid (self->silo) && + g_atomic_int_get (&self->silo_change_stamp_current) == g_atomic_int_get (&self->silo_change_stamp)) { + if (out_silo_filename != NULL) + *out_silo_filename = g_strdup (self->silo_filename); + if (out_silo_installed_by_desktopid != NULL && self->silo_installed_by_desktopid) + *out_silo_installed_by_desktopid = g_hash_table_ref (self->silo_installed_by_desktopid); + return g_object_ref (self->silo); + } + + /* drat! silo needs regenerating */ + reload: + g_clear_object (&self->silo); + g_clear_pointer (&self->silo_filename, g_free); + g_clear_pointer (&self->silo_installed_by_desktopid, g_hash_table_unref); + g_atomic_int_set (&self->silo_change_stamp_current, g_atomic_int_get (&self->silo_change_stamp)); + + /* FIXME: https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1422 */ + old_thread_default = g_main_context_ref_thread_default (); + if (old_thread_default == g_main_context_default ()) + g_clear_pointer (&old_thread_default, g_main_context_unref); + if (old_thread_default != NULL) + g_main_context_pop_thread_default (old_thread_default); + builder = xb_builder_new (); + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + g_clear_pointer (&old_thread_default, g_main_context_unref); + + /* verbose profiling */ + if (g_getenv ("GS_XMLB_VERBOSE") != NULL) { + xb_builder_set_profile_flags (builder, + XB_SILO_PROFILE_FLAG_XPATH | + XB_SILO_PROFILE_FLAG_DEBUG); + } + + gs_appstream_add_current_locales (builder); + + /* go through each remote adding metadata */ + xremotes = flatpak_installation_list_remotes (gs_flatpak_get_installation (self, interactive), + cancellable, + error); + if (xremotes == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + for (guint i = 0; i < xremotes->len; i++) { + g_autoptr(GError) error_local = NULL; + FlatpakRemote *xremote = g_ptr_array_index (xremotes, i); + if (flatpak_remote_get_disabled (xremote)) + continue; + g_debug ("found remote %s", + flatpak_remote_get_name (xremote)); + if (!gs_flatpak_add_apps_from_xremote (self, builder, xremote, interactive, cancellable, &error_local)) { + g_debug ("Failed to add apps from remote ‘%s’; skipping: %s", + flatpak_remote_get_name (xremote), error_local->message); + if (g_cancellable_set_error_if_cancelled (cancellable, error)) { + gs_flatpak_error_convert (error); + return NULL; + } + } + } + + /* add any installed files without AppStream info */ + gs_flatpak_rescan_installed (self, builder, cancellable, error); + + /* regenerate with each minor release */ + xb_builder_append_guid (builder, PACKAGE_VERSION); + + /* Merge data from the installed files and the system appstream data, + which is always checked, even when the 'appstream_paths' is NULL. */ + desktop_paths = g_ptr_array_new_with_free_func (g_free); + g_ptr_array_add (desktop_paths, gs_flatpak_get_desktop_files_dir (self)); + gs_appstream_add_data_merge_fixup (builder, NULL, desktop_paths, cancellable); + + /* create per-user cache */ + blobfn = gs_utils_get_cache_filename (gs_flatpak_get_id (self), + "components.xmlb", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + error); + if (blobfn == NULL) + return NULL; + file = g_file_new_for_path (blobfn); + g_debug ("ensuring %s", blobfn); + + /* FIXME: https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1422 */ + old_thread_default = g_main_context_ref_thread_default (); + if (old_thread_default == g_main_context_default ()) + g_clear_pointer (&old_thread_default, g_main_context_unref); + if (old_thread_default != NULL) + g_main_context_pop_thread_default (old_thread_default); + + self->silo = xb_builder_ensure (builder, file, + XB_BUILDER_COMPILE_FLAG_IGNORE_INVALID | + XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, + cancellable, error); +#ifdef __GLIBC__ + /* https://gitlab.gnome.org/GNOME/gnome-software/-/issues/941 + * libxmlb <= 0.3.22 makes lots of temporary heap allocations parsing large XMLs + * trim the heap after parsing to control RSS growth. */ + malloc_trim (0); +#endif + + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + + if (g_atomic_int_get (&self->silo_change_stamp_current) != g_atomic_int_get (&self->silo_change_stamp)) { + g_clear_pointer (&blobfn, g_free); + g_clear_pointer (&xremotes, g_ptr_array_unref); + g_clear_pointer (&desktop_paths, g_ptr_array_unref); + g_clear_pointer (&old_thread_default, g_main_context_unref); + g_clear_object (&file); + g_clear_object (&builder); + g_debug ("flatpak: Reported change while loading appstream data, reloading..."); + goto reload; + } + + if (self->silo != NULL) { + g_autoptr(GPtrArray) installed = NULL; + g_autoptr(XbNode) info_filename = NULL; + + self->silo_installed_by_desktopid = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_ptr_array_unref); + + installed = xb_silo_query (self->silo, "/component[@type='desktop-application']/launchable[@type='desktop-id']", 0, NULL); + for (guint i = 0; installed != NULL && i < installed->len; i++) { + XbNode *launchable = g_ptr_array_index (installed, i); + const gchar *id = xb_node_get_text (launchable); + if (id != NULL && *id != '\0') { + GPtrArray *nodes = g_hash_table_lookup (self->silo_installed_by_desktopid, id); + if (nodes == NULL) { + nodes = g_ptr_array_new_with_free_func (g_object_unref); + g_hash_table_insert (self->silo_installed_by_desktopid, g_strdup (id), nodes); + } + g_ptr_array_add (nodes, xb_node_get_parent (launchable)); + } + } + + info_filename = xb_silo_query_first (self->silo, "/info/filename", NULL); + if (info_filename != NULL) + self->silo_filename = g_strdup (xb_node_get_text (info_filename)); + + if (out_silo_filename != NULL) + *out_silo_filename = g_strdup (self->silo_filename); + if (out_silo_installed_by_desktopid != NULL && self->silo_installed_by_desktopid) + *out_silo_installed_by_desktopid = g_hash_table_ref (self->silo_installed_by_desktopid); + return g_object_ref (self->silo); + } + + return NULL; +} + +static gboolean +gs_flatpak_rescan_app_data (GsFlatpak *self, + gboolean interactive, + XbSilo **out_silo, + gchar **out_silo_filename, + GHashTable **out_silo_installed_by_desktopid, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(XbSilo) silo = NULL; + + if (self->requires_full_rescan) { + gboolean res = gs_flatpak_refresh (self, 60, interactive, cancellable, error); + if (res) { + self->requires_full_rescan = FALSE; + } else { + gs_flatpak_internal_data_changed (self); + return res; + } + } + + silo = gs_flatpak_ref_silo (self, interactive, out_silo_filename, out_silo_installed_by_desktopid, cancellable, error); + if (silo == NULL) { + gs_flatpak_internal_data_changed (self); + return FALSE; + } + + if (out_silo != NULL) + *out_silo = g_steal_pointer (&silo); + + return TRUE; +} + +gboolean +gs_flatpak_setup (GsFlatpak *self, GCancellable *cancellable, GError **error) +{ + /* watch for changes */ + self->monitor = flatpak_installation_create_monitor (self->installation_noninteractive, + cancellable, + error); + if (self->monitor == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + self->changed_id = + g_signal_connect (self->monitor, "changed", + G_CALLBACK (gs_plugin_flatpak_changed_cb), self); + + /* success */ + return TRUE; +} + +typedef struct { + GsPlugin *plugin; + GsApp *app; +} GsFlatpakProgressHelper; + +static void +gs_flatpak_progress_helper_free (GsFlatpakProgressHelper *phelper) +{ + g_object_unref (phelper->plugin); + if (phelper->app != NULL) + g_object_unref (phelper->app); + g_slice_free (GsFlatpakProgressHelper, phelper); +} + +static GsFlatpakProgressHelper * +gs_flatpak_progress_helper_new (GsPlugin *plugin, GsApp *app) +{ + GsFlatpakProgressHelper *phelper; + phelper = g_slice_new0 (GsFlatpakProgressHelper); + phelper->plugin = g_object_ref (plugin); + if (app != NULL) + phelper->app = g_object_ref (app); + return phelper; +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsFlatpakProgressHelper, gs_flatpak_progress_helper_free) + +static void +gs_flatpak_progress_cb (const gchar *status, + guint progress, + gboolean estimating, + gpointer user_data) +{ + GsFlatpakProgressHelper *phelper = (GsFlatpakProgressHelper *) user_data; + GsPluginStatus plugin_status = GS_PLUGIN_STATUS_DOWNLOADING; + + if (phelper->app != NULL) { + if (estimating) + gs_app_set_progress (phelper->app, GS_APP_PROGRESS_UNKNOWN); + else + gs_app_set_progress (phelper->app, progress); + + switch (gs_app_get_state (phelper->app)) { + case GS_APP_STATE_INSTALLING: + plugin_status = GS_PLUGIN_STATUS_INSTALLING; + break; + case GS_APP_STATE_REMOVING: + plugin_status = GS_PLUGIN_STATUS_REMOVING; + break; + default: + break; + } + } + gs_plugin_status_update (phelper->plugin, phelper->app, plugin_status); +} + +static gboolean +gs_flatpak_refresh_appstream_remote (GsFlatpak *self, + const gchar *remote_name, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *str = NULL; + g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (self->plugin)); + g_autoptr(GsFlatpakProgressHelper) phelper = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + g_autoptr(GError) error_local = NULL; + + /* TRANSLATORS: status text when downloading new metadata */ + str = g_strdup_printf (_("Getting flatpak metadata for %s…"), remote_name); + gs_app_set_summary_missing (app_dl, str); + gs_plugin_status_update (self->plugin, app_dl, GS_PLUGIN_STATUS_DOWNLOADING); + + if (!flatpak_installation_update_remote_sync (installation, + remote_name, + cancellable, + &error_local)) { + g_debug ("Failed to update metadata for remote %s: %s", + remote_name, error_local->message); + gs_flatpak_error_convert (&error_local); + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + phelper = gs_flatpak_progress_helper_new (self->plugin, app_dl); + if (!flatpak_installation_update_appstream_full_sync (installation, + remote_name, + NULL, /* arch */ + gs_flatpak_progress_cb, + phelper, + NULL, /* out_changed */ + cancellable, + error)) { + gs_flatpak_error_convert (error); + return FALSE; + } + + /* success */ + gs_app_set_progress (app_dl, 100); + return TRUE; +} + +static gboolean +gs_flatpak_refresh_appstream (GsFlatpak *self, + guint64 cache_age_secs, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + gboolean ret; + g_autoptr(GPtrArray) xremotes = NULL; + g_autoptr(XbSilo) silo = NULL; + + /* get remotes */ + xremotes = flatpak_installation_list_remotes (gs_flatpak_get_installation (self, interactive), + cancellable, + error); + if (xremotes == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + for (guint i = 0; i < xremotes->len; i++) { + const gchar *remote_name; + guint64 tmp; + g_autoptr(GError) error_local = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GFile) file_timestamp = NULL; + g_autofree gchar *appstream_fn = NULL; + FlatpakRemote *xremote = g_ptr_array_index (xremotes, i); + g_autoptr(GMutexLocker) locker = NULL; + + /* not enabled */ + if (flatpak_remote_get_disabled (xremote)) + continue; + + remote_name = flatpak_remote_get_name (xremote); + locker = g_mutex_locker_new (&self->broken_remotes_mutex); + + /* skip known-broken repos */ + if (g_hash_table_lookup (self->broken_remotes, remote_name) != NULL) { + g_debug ("skipping known broken remote: %s", remote_name); + continue; + } + + g_clear_pointer (&locker, g_mutex_locker_free); + + /* is the timestamp new enough */ + file_timestamp = flatpak_remote_get_appstream_timestamp (xremote, NULL); + tmp = gs_utils_get_file_age (file_timestamp); + if (tmp < cache_age_secs) { + g_autofree gchar *fn = g_file_get_path (file_timestamp); + g_debug ("%s is only %" G_GUINT64_FORMAT " seconds old, so ignoring refresh", + fn, tmp); + continue; + } + + /* download new data */ + g_debug ("%s is %" G_GUINT64_FORMAT " seconds old, so downloading new data", + remote_name, tmp); + ret = gs_flatpak_refresh_appstream_remote (self, + remote_name, + interactive, + cancellable, + &error_local); + if (!ret) { + g_autoptr(GsPluginEvent) event = NULL; + if (g_error_matches (error_local, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED)) { + g_debug ("Failed to get AppStream metadata: %s", + error_local->message); + + locker = g_mutex_locker_new (&self->broken_remotes_mutex); + + /* don't try to fetch this again until refresh() */ + g_hash_table_insert (self->broken_remotes, + g_strdup (remote_name), + GUINT_TO_POINTER (1)); + continue; + } + + /* allow the plugin loader to decide if this should be + * shown the user, possibly only for interactive jobs */ + gs_flatpak_error_convert (&error_local); + event = gs_plugin_event_new ("error", error_local, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (self->plugin, event); + continue; + } + + /* add the new AppStream repo to the shared silo */ + file = flatpak_remote_get_appstream_dir (xremote, NULL); + appstream_fn = g_file_get_path (file); + g_debug ("using AppStream metadata found at: %s", appstream_fn); + } + + /* ensure the AppStream silo is up to date */ + silo = gs_flatpak_ref_silo (self, interactive, NULL, NULL, cancellable, error); + if (silo == NULL) { + gs_flatpak_internal_data_changed (self); + return FALSE; + } + + return TRUE; +} + +static void +gs_flatpak_set_metadata_installed (GsFlatpak *self, + GsApp *app, + FlatpakInstalledRef *xref, + gboolean interactive, + GCancellable *cancellable) +{ + const gchar *appdata_version; + guint64 mtime; + guint64 size_installed; + g_autofree gchar *metadata_fn = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GFileInfo) info = NULL; + + /* for all types */ + gs_flatpak_set_metadata (self, app, FLATPAK_REF (xref)); + if (gs_app_get_metadata_item (app, "GnomeSoftware::Creator") == NULL) { + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (self->plugin)); + } + + /* get the last time the app was updated */ + metadata_fn = g_build_filename (flatpak_installed_ref_get_deploy_dir (xref), + "..", + "active", + "metadata", + NULL); + file = g_file_new_for_path (metadata_fn); + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_TIME_MODIFIED, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + NULL, NULL); + if (info != NULL) { + mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); + gs_app_set_install_date (app, mtime); + } + + /* If it's a runtime, check if the main-app info should be set. Note that + * checking the app for AS_COMPONENT_KIND_RUNTIME is not good enough because it + * could be e.g. AS_COMPONENT_KIND_LOCALIZATION and still be a runtime from + * Flatpak's perspective. + */ + if (gs_flatpak_app_get_ref_kind (app) == FLATPAK_REF_KIND_RUNTIME && + gs_flatpak_app_get_main_app_ref_name (app) == NULL) { + g_autoptr(GError) error = NULL; + g_autoptr(GKeyFile) metadata_file = NULL; + metadata_file = g_key_file_new (); + if (g_key_file_load_from_file (metadata_file, metadata_fn, + G_KEY_FILE_NONE, &error)) { + g_autofree gchar *main_app = g_key_file_get_string (metadata_file, + "ExtensionOf", + "ref", NULL); + if (main_app != NULL) + gs_flatpak_app_set_main_app_ref_name (app, main_app); + } else { + g_warning ("Error loading the metadata file for '%s': %s", + gs_app_get_unique_id (app), error->message); + } + } + + /* this is faster than resolving */ + if (gs_app_get_origin (app) == NULL) + gs_flatpak_set_app_origin (self, app, flatpak_installed_ref_get_origin (xref), NULL, interactive, cancellable); + + /* this is faster than flatpak_installation_fetch_remote_size_sync() */ + size_installed = flatpak_installed_ref_get_installed_size (xref); + gs_app_set_size_installed (app, (size_installed != 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, size_installed); + + appdata_version = flatpak_installed_ref_get_appdata_version (xref); + if (appdata_version != NULL) + gs_app_set_version (app, appdata_version); +} + +static GsApp * +gs_flatpak_create_installed (GsFlatpak *self, + FlatpakInstalledRef *xref, + FlatpakRemote *xremote, + gboolean interactive, + GCancellable *cancellable) +{ + g_autoptr(GsApp) app = NULL; + const gchar *origin; + + g_return_val_if_fail (xref != NULL, NULL); + + /* create new object */ + origin = flatpak_installed_ref_get_origin (xref); + app = gs_flatpak_create_app (self, origin, FLATPAK_REF (xref), xremote, interactive, TRUE, cancellable); + + /* Set the state to installed only from some states, to not override the updatable-live or other states */ + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN || + gs_app_get_state (app) == GS_APP_STATE_AVAILABLE) { + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + } + + gs_flatpak_set_metadata_installed (self, app, xref, interactive, cancellable); + return g_steal_pointer (&app); +} + +gboolean +gs_flatpak_add_installed (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GPtrArray) xrefs = NULL; + + /* get apps and runtimes */ + xrefs = flatpak_installation_list_installed_refs (gs_flatpak_get_installation (self, interactive), + cancellable, error); + if (xrefs == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + + gs_flatpak_ensure_remote_title (self, interactive, cancellable); + + for (guint i = 0; i < xrefs->len; i++) { + FlatpakInstalledRef *xref = g_ptr_array_index (xrefs, i); + g_autoptr(GsApp) app = gs_flatpak_create_installed (self, xref, NULL, interactive, cancellable); + gs_app_list_add (list, app); + } + + return TRUE; +} + +gboolean +gs_flatpak_add_sources (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GPtrArray) xrefs = NULL; + g_autoptr(GPtrArray) xremotes = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + /* refresh */ + if (!gs_flatpak_rescan_app_data (self, interactive, NULL, NULL, NULL, cancellable, error)) + return FALSE; + + /* get installed apps and runtimes */ + xrefs = flatpak_installation_list_installed_refs (installation, + cancellable, + error); + if (xrefs == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + + /* get available remotes */ + xremotes = flatpak_installation_list_remotes (installation, + cancellable, + error); + if (xremotes == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + for (guint i = 0; i < xremotes->len; i++) { + FlatpakRemote *xremote = g_ptr_array_index (xremotes, i); + g_autoptr(GsApp) app = NULL; + + /* apps installed from bundles add their own remote that only + * can be used for updating that app only -- so hide them */ + if (flatpak_remote_get_noenumerate (xremote)) + continue; + + /* create app */ + app = gs_flatpak_create_source (self, xremote); + gs_app_list_add (list, app); + + /* add related apps, i.e. what was installed from there */ + for (guint j = 0; j < xrefs->len; j++) { + FlatpakInstalledRef *xref = g_ptr_array_index (xrefs, j); + g_autoptr(GsApp) related = NULL; + + /* only apps */ + if (flatpak_ref_get_kind (FLATPAK_REF (xref)) != FLATPAK_REF_KIND_APP) + continue; + if (g_strcmp0 (flatpak_installed_ref_get_origin (xref), + flatpak_remote_get_name (xremote)) != 0) + continue; + related = gs_flatpak_create_installed (self, xref, xremote, interactive, cancellable); + gs_app_add_related (app, related); + } + } + return TRUE; +} + +GsApp * +gs_flatpak_find_source_by_url (GsFlatpak *self, + const gchar *url, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GPtrArray) xremotes = NULL; + + g_return_val_if_fail (url != NULL, NULL); + + xremotes = flatpak_installation_list_remotes (gs_flatpak_get_installation (self, interactive), cancellable, error); + if (xremotes == NULL) + return NULL; + for (guint i = 0; i < xremotes->len; i++) { + FlatpakRemote *xremote = g_ptr_array_index (xremotes, i); + g_autofree gchar *url_tmp = flatpak_remote_get_url (xremote); + if (g_strcmp0 (url, url_tmp) == 0) + return gs_flatpak_create_source (self, xremote); + } + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "cannot find %s", url); + return NULL; +} + +/* transfer full */ +GsApp * +gs_flatpak_ref_to_app (GsFlatpak *self, + const gchar *ref, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GPtrArray) xremotes = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + g_return_val_if_fail (ref != NULL, NULL); + + g_mutex_lock (&self->installed_refs_mutex); + + if (self->installed_refs == NULL) { + self->installed_refs = flatpak_installation_list_installed_refs (installation, + cancellable, error); + + if (self->installed_refs == NULL) { + g_mutex_unlock (&self->installed_refs_mutex); + gs_flatpak_error_convert (error); + return NULL; + } + } + + for (guint i = 0; i < self->installed_refs->len; i++) { + g_autoptr(FlatpakInstalledRef) xref = g_object_ref (g_ptr_array_index (self->installed_refs, i)); + g_autofree gchar *ref_tmp = flatpak_ref_format_ref (FLATPAK_REF (xref)); + if (g_strcmp0 (ref, ref_tmp) == 0) { + g_mutex_unlock (&self->installed_refs_mutex); + return gs_flatpak_create_installed (self, xref, NULL, interactive, cancellable); + } + } + + g_mutex_unlock (&self->installed_refs_mutex); + + /* look at each remote xref */ + xremotes = flatpak_installation_list_remotes (installation, + cancellable, error); + if (xremotes == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + for (guint i = 0; i < xremotes->len; i++) { + FlatpakRemote *xremote = g_ptr_array_index (xremotes, i); + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) refs_remote = NULL; + + /* disabled */ + if (flatpak_remote_get_disabled (xremote)) + continue; + refs_remote = flatpak_installation_list_remote_refs_sync (installation, + flatpak_remote_get_name (xremote), + cancellable, + &error_local); + if (refs_remote == NULL) { + g_debug ("failed to list refs in '%s': %s", + flatpak_remote_get_name (xremote), + error_local->message); + continue; + } + for (guint j = 0; j < refs_remote->len; j++) { + FlatpakRef *xref = g_ptr_array_index (refs_remote, j); + g_autofree gchar *ref_tmp = flatpak_ref_format_ref (xref); + if (g_strcmp0 (ref, ref_tmp) == 0) { + const gchar *origin = flatpak_remote_get_name (xremote); + return gs_flatpak_create_app (self, origin, xref, xremote, interactive, TRUE, cancellable); + } + } + } + + /* nothing found */ + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "cannot find %s", ref); + return NULL; +} + +/* This is essentially the inverse of gs_flatpak_app_new_from_repo_file() */ +static void +gs_flatpak_update_remote_from_app (GsFlatpak *self, + FlatpakRemote *xremote, + GsApp *app) +{ + const gchar *gpg_key; + const gchar *branch; + const gchar *title, *homepage, *comment, *description; + const gchar *filter; + g_autoptr(GPtrArray) icons = NULL; + + flatpak_remote_set_disabled (xremote, FALSE); + + flatpak_remote_set_url (xremote, gs_flatpak_app_get_repo_url (app)); + flatpak_remote_set_noenumerate (xremote, FALSE); + + title = gs_app_get_name (app); + if (title != NULL) + flatpak_remote_set_title (xremote, title); + + /* decode GPG key if set */ + gpg_key = gs_flatpak_app_get_repo_gpgkey (app); + if (gpg_key != NULL) { + gsize data_len = 0; + g_autofree guchar *data = NULL; + g_autoptr(GBytes) bytes = NULL; + data = g_base64_decode (gpg_key, &data_len); + bytes = g_bytes_new (data, data_len); + flatpak_remote_set_gpg_verify (xremote, TRUE); + flatpak_remote_set_gpg_key (xremote, bytes); + } else { + flatpak_remote_set_gpg_verify (xremote, FALSE); + } + + /* default branch */ + branch = gs_app_get_branch (app); + if (branch != NULL) + flatpak_remote_set_default_branch (xremote, branch); + + /* optional data */ + homepage = gs_app_get_url (app, AS_URL_KIND_HOMEPAGE); + if (homepage != NULL) + flatpak_remote_set_homepage (xremote, homepage); + + comment = gs_app_get_summary (app); + if (comment != NULL) + flatpak_remote_set_comment (xremote, comment); + + description = gs_app_get_description (app); + if (description != NULL) + flatpak_remote_set_description (xremote, description); + + icons = gs_app_dup_icons (app); + for (guint i = 0; icons != NULL && i < icons->len; i++) { + GIcon *icon = g_ptr_array_index (icons, i); + + if (GS_IS_REMOTE_ICON (icon)) { + flatpak_remote_set_icon (xremote, + gs_remote_icon_get_uri (GS_REMOTE_ICON (icon))); + break; + } + } + + /* With the other fields, we always want to add as much information as + * we can to the @xremote. With the filter, though, we want to drop it + * if no filter is set on the @app. Importing an updated flatpakrepo + * file is one of the methods for switching from (for example) filtered + * flathub to unfiltered flathub. So if @app doesn’t have a filter set, + * clear it on the @xremote (i.e. don’t check for NULL). */ + filter = gs_flatpak_app_get_repo_filter (app); + flatpak_remote_set_filter (xremote, filter); +} + +static FlatpakRemote * +gs_flatpak_create_new_remote (GsFlatpak *self, + GsApp *app, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(FlatpakRemote) xremote = NULL; + + /* create a new remote */ + xremote = flatpak_remote_new (gs_app_get_id (app)); + gs_flatpak_update_remote_from_app (self, xremote, app); + + return g_steal_pointer (&xremote); +} + +static FlatpakRemote * /* (transfer full) */ +gs_flatpak_remote_by_name (GsFlatpak *self, + const gchar *lookup_name, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->installed_refs_mutex); + FlatpakRemote *res = NULL; + + if (self->remotes_by_name == NULL) { + g_autoptr(GPtrArray) remotes = flatpak_installation_list_remotes (gs_flatpak_get_installation (self, interactive), + cancellable, error); + if (remotes == NULL) + return NULL; + self->remotes_by_name = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + for (guint i = 0; i < remotes->len; i++) { + FlatpakRemote *remote = g_ptr_array_index (remotes, i); + const gchar *name = flatpak_remote_get_name (remote); + if (name != NULL) { + g_hash_table_insert (self->remotes_by_name, g_strdup (name), g_object_ref (remote)); + if (res == NULL && g_strcmp0 (name, lookup_name) == 0) + res = g_object_ref (remote); + } + } + } else { + res = g_hash_table_lookup (self->remotes_by_name, lookup_name); + if (res != NULL) + g_object_ref (res); + } + + if (res == NULL && error != NULL && *error == NULL) + g_set_error (error, FLATPAK_ERROR, FLATPAK_ERROR_REMOTE_NOT_FOUND, "Remote '%s' not found", lookup_name); + + return res; +} + +/* @is_install is %TRUE if the repo is being installed, or %FALSE if it’s being + * enabled. If it’s being enabled, no properties apart from enabled/disabled + * should be modified. */ +gboolean +gs_flatpak_app_install_source (GsFlatpak *self, + GsApp *app, + gboolean is_install, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(FlatpakRemote) xremote = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + xremote = gs_flatpak_remote_by_name (self, gs_app_get_id (app), interactive, cancellable, NULL); + if (xremote != NULL) { + /* if the remote already exists, just enable it and update it */ + g_debug ("modifying existing remote %s", flatpak_remote_get_name (xremote)); + flatpak_remote_set_disabled (xremote, FALSE); + + if (is_install && + gs_flatpak_app_get_file_kind (app) == GS_FLATPAK_APP_FILE_KIND_REPO) { + gs_flatpak_update_remote_from_app (self, xremote, app); + } + } else if (!is_install) { + g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "Cannot enable flatpak remote '%s', remote not found", gs_app_get_id (app)); + } else { + /* create a new remote */ + xremote = gs_flatpak_create_new_remote (self, app, cancellable, error); + } + + /* install it */ + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + if (!flatpak_installation_modify_remote (installation, + xremote, + cancellable, + error)) { + gs_flatpak_error_convert (error); + g_prefix_error (error, "cannot modify remote: "); + gs_app_set_state_recover (app); + gs_flatpak_internal_data_changed (self); + return FALSE; + } + + /* Mark the internal cache as obsolete. */ + gs_flatpak_internal_data_changed (self); + + /* success */ + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + + gs_plugin_repository_changed (self->plugin, app); + + return TRUE; +} + +static GsApp * +get_main_app_of_related (GsFlatpak *self, + GsApp *related_app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(FlatpakInstalledRef) ref = NULL; + const gchar *ref_name; + g_auto(GStrv) app_tokens = NULL; + FlatpakRefKind ref_kind = FLATPAK_REF_KIND_RUNTIME; + + ref_name = gs_flatpak_app_get_main_app_ref_name (related_app); + if (ref_name == NULL) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + "%s doesn't have a main app set to it.", + gs_app_get_unique_id (related_app)); + return NULL; + } + + app_tokens = g_strsplit (ref_name, "/", -1); + if (g_strv_length (app_tokens) != 4) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, + "The main app of %s has an invalid name: %s", + gs_app_get_unique_id (related_app), ref_name); + return NULL; + } + + /* get the right ref kind for the main app */ + if (g_strcmp0 (app_tokens[0], "app") == 0) + ref_kind = FLATPAK_REF_KIND_APP; + + /* this function only returns G_IO_ERROR_NOT_FOUND when the metadata file + * is missing, but if that's the case then things should have broken before + * this point */ + ref = flatpak_installation_get_installed_ref (gs_flatpak_get_installation (self, interactive), + ref_kind, + app_tokens[1], + app_tokens[2], + app_tokens[3], + cancellable, + error); + if (ref == NULL) + return NULL; + + return gs_flatpak_create_installed (self, ref, NULL, interactive, cancellable); +} + +static GsApp * +get_real_app_for_update (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + GsApp *main_app = NULL; + g_autoptr(GError) error_local = NULL; + + if (gs_flatpak_app_get_ref_kind (app) == FLATPAK_REF_KIND_RUNTIME) + main_app = get_main_app_of_related (self, app, interactive, cancellable, &error_local); + + if (main_app == NULL) { + /* not all runtimes are extensions, and in that case we get the + * not-found error, so we only report other types of errors */ + if (error_local != NULL && + !g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { + g_propagate_error (error, g_steal_pointer (&error_local)); + gs_flatpak_error_convert (error); + return NULL; + } + + main_app = g_object_ref (app); + } else { + g_debug ("Related extension app %s of main app %s is updatable, so " + "setting the latter's state instead.", gs_app_get_unique_id (app), + gs_app_get_unique_id (main_app)); + gs_app_set_state (main_app, GS_APP_STATE_UPDATABLE_LIVE); + /* Make sure the 'app' is not forgotten, it'll be added into the transaction later */ + gs_app_add_related (main_app, app); + } + + return main_app; +} + +gboolean +gs_flatpak_add_updates (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GPtrArray) xrefs = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + /* ensure valid */ + if (!gs_flatpak_rescan_app_data (self, interactive, NULL, NULL, NULL, cancellable, error)) + return FALSE; + + /* get all the updatable apps and runtimes */ + xrefs = flatpak_installation_list_installed_refs_for_update (installation, + cancellable, + error); + if (xrefs == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + + gs_flatpak_ensure_remote_title (self, interactive, cancellable); + + /* look at each installed xref */ + for (guint i = 0; i < xrefs->len; i++) { + FlatpakInstalledRef *xref = g_ptr_array_index (xrefs, i); + const gchar *commit; + const gchar *latest_commit; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GsApp) main_app = NULL; + + /* check the application has already been downloaded */ + commit = flatpak_ref_get_commit (FLATPAK_REF (xref)); + latest_commit = flatpak_installed_ref_get_latest_commit (xref); + app = gs_flatpak_create_installed (self, xref, NULL, interactive, cancellable); + main_app = get_real_app_for_update (self, app, interactive, cancellable, &error_local); + if (main_app == NULL) { + g_debug ("Couldn't get the main app for updatable app extension %s: " + "%s; adding the app itself to the updates list...", + gs_app_get_unique_id (app), error_local->message); + g_clear_error (&error_local); + main_app = g_object_ref (app); + } + + /* if for some reason the app is already getting updated, then + * don't change its state */ + if (gs_app_get_state (main_app) != GS_APP_STATE_INSTALLING) + gs_app_set_state (main_app, GS_APP_STATE_UPDATABLE_LIVE); + + /* set updatable state on the extension too, as it will have + * its state updated to installing then installed later on */ + if (gs_app_get_state (app) != GS_APP_STATE_INSTALLING) + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + + /* already downloaded */ + if (latest_commit && g_strcmp0 (commit, latest_commit) != 0) { + g_debug ("%s has a downloaded update %s->%s", + flatpak_ref_get_name (FLATPAK_REF (xref)), + commit, latest_commit); + gs_app_set_update_details_markup (main_app, NULL); + gs_app_set_update_version (main_app, NULL); + gs_app_set_update_urgency (main_app, AS_URGENCY_KIND_UNKNOWN); + gs_app_set_size_download (main_app, GS_SIZE_TYPE_VALID, 0); + + /* needs download */ + } else { + guint64 download_size = 0; + g_debug ("%s needs update", + flatpak_ref_get_name (FLATPAK_REF (xref))); + + /* get the current download size */ + if (gs_app_get_size_download (main_app, NULL) != GS_SIZE_TYPE_VALID) { + if (!flatpak_installation_fetch_remote_size_sync (installation, + gs_app_get_origin (app), + FLATPAK_REF (xref), + &download_size, + NULL, + cancellable, + &error_local)) { + g_warning ("failed to get download size: %s", + error_local->message); + g_clear_error (&error_local); + gs_app_set_size_download (main_app, GS_SIZE_TYPE_UNKNOWABLE, 0); + } else { + gs_app_set_size_download (main_app, GS_SIZE_TYPE_VALID, download_size); + } + } + } + gs_flatpak_set_update_permissions (self, main_app, xref, interactive, cancellable); + gs_app_list_add (list, main_app); + } + + /* success */ + return TRUE; +} + +gboolean +gs_flatpak_refresh (GsFlatpak *self, + guint64 cache_age_secs, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + /* give all the repos a second chance */ + g_mutex_lock (&self->broken_remotes_mutex); + g_hash_table_remove_all (self->broken_remotes); + g_mutex_unlock (&self->broken_remotes_mutex); + + /* manually drop the cache in both installation instances; + * it's needed to have them both agree on the content. */ + if (!flatpak_installation_drop_caches (gs_flatpak_get_installation (self, FALSE), + cancellable, + error)) { + gs_flatpak_error_convert (error); + return FALSE; + } + + if (!flatpak_installation_drop_caches (gs_flatpak_get_installation (self, TRUE), + cancellable, + error)) { + gs_flatpak_error_convert (error); + return FALSE; + } + + /* drop the installed refs cache */ + g_mutex_lock (&self->installed_refs_mutex); + g_clear_pointer (&self->installed_refs, g_ptr_array_unref); + g_clear_pointer (&self->remotes_by_name, g_hash_table_unref); + g_mutex_unlock (&self->installed_refs_mutex); + + /* manually do this in case we created the first appstream file */ + gs_flatpak_invalidate_silo (self); + + /* update AppStream metadata */ + if (!gs_flatpak_refresh_appstream (self, cache_age_secs, interactive, cancellable, error)) + return FALSE; + + /* success */ + return TRUE; +} + +static gboolean +gs_plugin_refine_item_origin_hostname (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(FlatpakRemote) xremote = NULL; + g_autofree gchar *url = NULL; + g_autoptr(GError) error_local = NULL; + + /* already set */ + if (gs_app_get_origin_hostname (app) != NULL) + return TRUE; + + /* no origin */ + if (gs_app_get_origin (app) == NULL) + return TRUE; + + /* get the remote */ + xremote = gs_flatpak_remote_by_name (self, gs_app_get_origin (app), interactive, cancellable, &error_local); + if (xremote == NULL) { + if (g_error_matches (error_local, + FLATPAK_ERROR, + FLATPAK_ERROR_REMOTE_NOT_FOUND)) { + /* if the user deletes the -origin remote for a locally + * installed flatpakref file then we should just show + * 'localhost' and not return an error */ + gs_app_set_origin_hostname (app, ""); + return TRUE; + } + g_propagate_error (error, g_steal_pointer (&error_local)); + gs_flatpak_error_convert (error); + return FALSE; + } + url = flatpak_remote_get_url (xremote); + if (url == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no URL for remote %s", + flatpak_remote_get_name (xremote)); + return FALSE; + } + gs_app_set_origin_hostname (app, url); + return TRUE; +} + +static gboolean +gs_refine_item_metadata (GsFlatpak *self, + GsApp *app, + GError **error) +{ + g_autoptr(FlatpakRef) xref = NULL; + + /* already set */ + if (gs_flatpak_app_get_ref_name (app) != NULL) + return TRUE; + + /* not a valid type */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) + return TRUE; + + /* AppStream sets the source to appname/arch/branch, if this isn't set + * we can't break out the fields */ + if (gs_app_get_source_default (app) == NULL) { + g_autofree gchar *tmp = gs_app_to_string (app); + g_warning ("no source set by appstream for %s: %s", + gs_plugin_get_name (self->plugin), tmp); + return TRUE; + } + + /* parse the ref */ + xref = flatpak_ref_parse (gs_app_get_source_default (app), error); + if (xref == NULL) { + gs_flatpak_error_convert (error); + g_prefix_error (error, "failed to parse '%s': ", + gs_app_get_source_default (app)); + return FALSE; + } + gs_flatpak_set_metadata (self, app, xref); + + /* success */ + return TRUE; +} + +static gboolean +gs_plugin_refine_item_origin (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *ref_display = NULL; + g_autoptr(GPtrArray) xremotes = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + /* already set */ + if (gs_app_get_origin (app) != NULL) + return TRUE; + + /* not applicable */ + if (gs_app_get_state (app) == GS_APP_STATE_AVAILABLE_LOCAL) + return TRUE; + + /* ensure metadata exists */ + if (!gs_refine_item_metadata (self, app, error)) + return FALSE; + + /* find list of remotes */ + ref_display = gs_flatpak_app_get_ref_display (app); + g_debug ("looking for a remote for %s", ref_display); + xremotes = flatpak_installation_list_remotes (installation, + cancellable, error); + if (xremotes == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + for (guint i = 0; i < xremotes->len; i++) { + const gchar *remote_name; + FlatpakRemote *xremote = g_ptr_array_index (xremotes, i); + g_autoptr(FlatpakRemoteRef) xref = NULL; + g_autoptr(GError) error_local = NULL; + + /* not enabled */ + if (flatpak_remote_get_disabled (xremote)) + continue; + + /* sync */ + remote_name = flatpak_remote_get_name (xremote); + g_debug ("looking at remote %s", remote_name); + xref = flatpak_installation_fetch_remote_ref_sync (installation, + remote_name, + gs_flatpak_app_get_ref_kind (app), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app), + cancellable, + &error_local); + if (xref != NULL) { + g_debug ("found remote %s", remote_name); + gs_flatpak_set_app_origin (self, app, remote_name, xremote, interactive, cancellable); + gs_flatpak_app_set_commit (app, flatpak_ref_get_commit (FLATPAK_REF (xref))); + gs_plugin_refine_item_scope (self, app); + return TRUE; + } + g_debug ("%s failed to find remote %s: %s", + ref_display, remote_name, error_local->message); + } + + /* not found */ + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "%s not found in any remote", + ref_display); + return FALSE; +} + +static FlatpakRef * +gs_flatpak_create_fake_ref (GsApp *app, GError **error) +{ + FlatpakRef *xref; + g_autofree gchar *id = NULL; + id = g_strdup_printf ("%s/%s/%s/%s", + gs_flatpak_app_get_ref_kind_as_str (app), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app)); + xref = flatpak_ref_parse (id, error); + if (xref == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + return xref; +} + +static gboolean +gs_flatpak_refine_app_state_internal (GsFlatpak *self, + GsApp *app, + gboolean interactive, + gboolean force_state_update, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(FlatpakInstalledRef) ref = NULL; + g_autoptr(GPtrArray) installed_refs = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + /* already found */ + if (!force_state_update && + gs_app_get_state (app) != GS_APP_STATE_UNKNOWN) + return TRUE; + + /* need broken out metadata */ + if (!gs_refine_item_metadata (self, app, error)) + return FALSE; + + /* ensure origin set */ + if (!gs_plugin_refine_item_origin (self, app, interactive, cancellable, error)) + return FALSE; + + /* find the app using the origin and the ID */ + g_mutex_lock (&self->installed_refs_mutex); + + if (self->installed_refs == NULL) { + self->installed_refs = flatpak_installation_list_installed_refs (installation, + cancellable, error); + + if (self->installed_refs == NULL) { + g_mutex_unlock (&self->installed_refs_mutex); + gs_flatpak_error_convert (error); + return FALSE; + } + } + + installed_refs = g_ptr_array_ref (self->installed_refs); + + for (guint i = 0; i < installed_refs->len; i++) { + FlatpakInstalledRef *ref_tmp = g_ptr_array_index (installed_refs, i); + const gchar *origin = flatpak_installed_ref_get_origin (ref_tmp); + const gchar *name = flatpak_ref_get_name (FLATPAK_REF (ref_tmp)); + const gchar *arch = flatpak_ref_get_arch (FLATPAK_REF (ref_tmp)); + const gchar *branch = flatpak_ref_get_branch (FLATPAK_REF (ref_tmp)); + if (g_strcmp0 (origin, gs_app_get_origin (app)) == 0 && + g_strcmp0 (name, gs_flatpak_app_get_ref_name (app)) == 0 && + g_strcmp0 (arch, gs_flatpak_app_get_ref_arch (app)) == 0 && + g_strcmp0 (branch, gs_app_get_branch (app)) == 0) { + ref = g_object_ref (ref_tmp); + break; + } + } + g_mutex_unlock (&self->installed_refs_mutex); + if (ref != NULL) { + g_debug ("marking %s as installed with flatpak", + gs_app_get_unique_id (app)); + gs_flatpak_set_metadata_installed (self, app, ref, interactive, cancellable); + if (force_state_update || gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + + /* flatpak only allows one installed app to be launchable */ + if (flatpak_installed_ref_get_is_current (ref)) { + gs_app_remove_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + } else { + g_debug ("%s is not current, and therefore not launchable", + gs_app_get_unique_id (app)); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + } + return TRUE; + } + + /* anything not installed just check the remote is still present */ + if ((force_state_update || gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) && + gs_app_get_origin (app) != NULL) { + g_autoptr(FlatpakRemote) xremote = NULL; + xremote = gs_flatpak_remote_by_name (self, gs_app_get_origin (app), interactive, cancellable, NULL); + if (xremote != NULL) { + if (flatpak_remote_get_disabled (xremote)) { + g_debug ("%s is available with flatpak " + "but %s is disabled", + gs_app_get_unique_id (app), + flatpak_remote_get_name (xremote)); + gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + } else { + g_debug ("marking %s as available with flatpak", + gs_app_get_unique_id (app)); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + } + } else { + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + g_debug ("failed to find %s remote %s for %s", + self->id, + gs_app_get_origin (app), + gs_app_get_unique_id (app)); + } + } + + /* success */ + return TRUE; +} + +gboolean +gs_flatpak_refine_app_state (GsFlatpak *self, + GsApp *app, + gboolean interactive, + gboolean force_state_update, + GCancellable *cancellable, + GError **error) +{ + /* ensure valid */ + if (!gs_flatpak_rescan_app_data (self, interactive, NULL, NULL, NULL, cancellable, error)) + return FALSE; + + return gs_flatpak_refine_app_state_internal (self, app, interactive, force_state_update, cancellable, error); +} + +static GsApp * +gs_flatpak_create_runtime (GsFlatpak *self, + GsApp *parent, + const gchar *runtime, + gboolean interactive, + GCancellable *cancellable) +{ + g_autofree gchar *source = NULL; + g_auto(GStrv) split = NULL; + g_autoptr(GsApp) app_cache = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) local_error = NULL; + const gchar *origin; + + /* get the name/arch/branch */ + split = g_strsplit (runtime, "/", -1); + if (g_strv_length (split) != 3) + return NULL; + + /* create the complete GsApp from the single string */ + app = gs_app_new (split[0]); + gs_flatpak_claim_app (self, app); + source = g_strdup_printf ("runtime/%s", runtime); + gs_app_add_source (app, source); + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", source); + gs_app_set_kind (app, AS_COMPONENT_KIND_RUNTIME); + gs_app_set_branch (app, split[2]); + + origin = gs_app_get_origin (parent); + if (origin != NULL) { + g_autoptr(FlatpakRemoteRef) xref = NULL; + + xref = flatpak_installation_fetch_remote_ref_sync (gs_flatpak_get_installation (self, interactive), + origin, + FLATPAK_REF_KIND_RUNTIME, + gs_app_get_id (app), + gs_flatpak_app_get_ref_arch (parent), + gs_app_get_branch (app), + cancellable, + NULL); + + /* Prefer runtime from the same origin as the parent application */ + if (xref) + gs_app_set_origin (app, origin); + } + + /* search in the cache */ + app_cache = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app)); + if (app_cache != NULL && + g_strcmp0 (gs_flatpak_app_get_ref_name (app_cache), split[0]) == 0 && + g_strcmp0 (gs_flatpak_app_get_ref_arch (app_cache), split[1]) == 0 && + g_strcmp0 (gs_app_get_branch (app_cache), split[2]) == 0) { + /* since the cached runtime can have been created somewhere else + * (we're using a global cache), we need to make sure that a + * source is set */ + if (gs_app_get_source_default (app_cache) == NULL) { + gs_app_add_source (app_cache, source); + gs_app_set_metadata (app_cache, "GnomeSoftware::packagename-value", source); + } + return g_steal_pointer (&app_cache); + } else { + g_clear_object (&app_cache); + } + + /* if the app is per-user we can also use the installed system runtime */ + if (gs_app_get_scope (parent) == AS_COMPONENT_SCOPE_USER) { + gs_app_set_scope (app, AS_COMPONENT_SCOPE_UNKNOWN); + app_cache = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app)); + if (app_cache != NULL && + g_strcmp0 (gs_flatpak_app_get_ref_name (app_cache), split[0]) == 0 && + g_strcmp0 (gs_flatpak_app_get_ref_arch (app_cache), split[1]) == 0 && + g_strcmp0 (gs_app_get_branch (app_cache), split[2]) == 0) { + return g_steal_pointer (&app_cache); + } else { + g_clear_object (&app_cache); + } + } + + /* set superclassed app properties */ + gs_flatpak_app_set_ref_kind (app, FLATPAK_REF_KIND_RUNTIME); + gs_flatpak_app_set_ref_name (app, split[0]); + gs_flatpak_app_set_ref_arch (app, split[1]); + + if (!gs_flatpak_refine_app_state_internal (self, app, interactive, FALSE, NULL, &local_error)) + g_debug ("Failed to refine state for runtime '%s': %s", gs_app_get_unique_id (app), local_error->message); + + /* save in the cache */ + gs_plugin_cache_add (self->plugin, NULL, app); + return g_steal_pointer (&app); +} + +static gboolean +gs_flatpak_set_app_metadata (GsFlatpak *self, + GsApp *app, + const gchar *data, + gsize length, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + gboolean secure = TRUE; + g_autofree gchar *name = NULL; + g_autofree gchar *runtime = NULL; + g_autoptr(GKeyFile) kf = NULL; + g_autoptr(GsApp) app_runtime = NULL; + g_autoptr(GsAppPermissions) permissions = NULL; + g_auto(GStrv) shared = NULL; + g_auto(GStrv) sockets = NULL; + g_auto(GStrv) filesystems = NULL; + + kf = g_key_file_new (); + if (!g_key_file_load_from_data (kf, data, length, G_KEY_FILE_NONE, error)) { + gs_flatpak_error_convert (error); + return FALSE; + } + name = g_key_file_get_string (kf, "Application", "name", error); + if (name == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + gs_flatpak_app_set_ref_name (app, name); + runtime = g_key_file_get_string (kf, "Application", "runtime", error); + if (runtime == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + + shared = g_key_file_get_string_list (kf, "Context", "shared", NULL, NULL); + if (shared != NULL) { + /* SHM isn't secure enough */ + if (g_strv_contains ((const gchar * const *) shared, "ipc")) + secure = FALSE; + } + sockets = g_key_file_get_string_list (kf, "Context", "sockets", NULL, NULL); + if (sockets != NULL) { + /* X11 isn't secure enough */ + if (g_strv_contains ((const gchar * const *) sockets, "x11")) + secure = FALSE; + } + filesystems = g_key_file_get_string_list (kf, "Context", "filesystems", NULL, NULL); + if (filesystems != NULL) { + /* secure apps should be using portals */ + if (g_strv_contains ((const gchar * const *) filesystems, "home")) + secure = FALSE; + } + + permissions = perms_from_metadata (kf); + gs_app_set_permissions (app, permissions); + /* this is actually quite hard to achieve */ + if (secure) + gs_app_add_kudo (app, GS_APP_KUDO_SANDBOXED_SECURE); + + /* create runtime */ + app_runtime = gs_flatpak_create_runtime (self, app, runtime, interactive, cancellable); + if (app_runtime != NULL) { + gs_plugin_refine_item_scope (self, app_runtime); + gs_app_set_runtime (app, app_runtime); + } + + /* we always get this, but it's a low bar... */ + gs_app_add_kudo (app, GS_APP_KUDO_SANDBOXED); + + return TRUE; +} + +static GBytes * +gs_flatpak_fetch_remote_metadata (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GBytes) data = NULL; + g_autoptr(FlatpakRef) xref = NULL; + g_autoptr(GError) local_error = NULL; + + /* no origin */ + if (gs_app_get_origin (app) == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no origin set when getting metadata for %s", + gs_app_get_unique_id (app)); + return NULL; + } + + /* fetch from the server */ + xref = gs_flatpak_create_fake_ref (app, error); + if (xref == NULL) + return NULL; + data = flatpak_installation_fetch_remote_metadata_sync (gs_flatpak_get_installation (self, interactive), + gs_app_get_origin (app), + xref, + cancellable, + &local_error); + if (data == NULL) { + if (g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_REF_NOT_FOUND) && + !gs_plugin_get_network_available (self->plugin)) { + local_error->code = GS_PLUGIN_ERROR_NO_NETWORK; + local_error->domain = GS_PLUGIN_ERROR; + } else { + gs_flatpak_error_convert (&local_error); + } + g_propagate_error (error, g_steal_pointer (&local_error)); + return NULL; + } + return g_steal_pointer (&data); +} + +static gboolean +gs_plugin_refine_item_metadata (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + const gchar *str; + gsize len = 0; + g_autofree gchar *contents = NULL; + g_autofree gchar *installation_path_str = NULL; + g_autofree gchar *install_path = NULL; + g_autoptr(GBytes) data = NULL; + g_autoptr(GFile) installation_path = NULL; + + /* not applicable */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) + return TRUE; + if (gs_flatpak_app_get_ref_kind (app) != FLATPAK_REF_KIND_APP) + return TRUE; + + /* already done */ + if (gs_app_has_kudo (app, GS_APP_KUDO_SANDBOXED)) + return TRUE; + + /* this is quicker than doing network IO */ + installation_path = flatpak_installation_get_path (self->installation_noninteractive); + installation_path_str = g_file_get_path (installation_path); + install_path = g_build_filename (installation_path_str, + gs_flatpak_app_get_ref_kind_as_str (app), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app), + "active", + "metadata", + NULL); + if (g_file_test (install_path, G_FILE_TEST_EXISTS)) { + if (!g_file_get_contents (install_path, &contents, &len, error)) + return FALSE; + str = contents; + } else { + data = gs_flatpak_fetch_remote_metadata (self, app, interactive, + cancellable, + error); + if (data == NULL) + return FALSE; + str = g_bytes_get_data (data, &len); + } + + /* parse key file */ + if (!gs_flatpak_set_app_metadata (self, app, str, len, interactive, cancellable, error)) + return FALSE; + return TRUE; +} + +static FlatpakInstalledRef * +gs_flatpak_get_installed_ref (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + FlatpakInstalledRef *ref; + ref = flatpak_installation_get_installed_ref (gs_flatpak_get_installation (self, interactive), + gs_flatpak_app_get_ref_kind (app), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app), + cancellable, + error); + if (ref == NULL) + gs_flatpak_error_convert (error); + return ref; +} + +static gboolean +gs_flatpak_prune_addons_list (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) addons_list = NULL; + g_autoptr(GPtrArray) installed_related_refs = NULL; + g_autoptr(GPtrArray) remote_related_refs = NULL; + g_autoptr(GPtrArray) remove_addons = NULL; + g_autofree gchar *ref = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + g_autoptr(GError) error_local = NULL; + + addons_list = gs_app_dup_addons (app); + if (addons_list == NULL || gs_app_list_length (addons_list) == 0) + return TRUE; + + if (gs_app_get_origin (app) == NULL) + return TRUE; + + /* return early if the addons haven't been refined */ + for (guint i = 0; i < gs_app_list_length (addons_list); i++) { + GsApp *app_addon = gs_app_list_index (addons_list, i); + + if (gs_flatpak_app_get_ref_name (app_addon) == NULL || + gs_flatpak_app_get_ref_arch (app_addon) == NULL || + gs_app_get_branch (app_addon) == NULL) + return TRUE; + } + + /* return early if the API we need isn't available */ +#if !FLATPAK_CHECK_VERSION(1,11,1) + if (gs_app_get_state (app) == GS_APP_STATE_INSTALLED) + return TRUE; +#endif + + ref = g_strdup_printf ("%s/%s/%s/%s", + gs_flatpak_app_get_ref_kind_as_str (app), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app)); + + /* Find installed related refs in case the app is installed */ + installed_related_refs = flatpak_installation_list_installed_related_refs_sync (installation, + gs_app_get_origin (app), + ref, + cancellable, + &error_local); + if (installed_related_refs == NULL && + !g_error_matches (error_local, + FLATPAK_ERROR, + FLATPAK_ERROR_NOT_INSTALLED)) { + gs_flatpak_error_convert (&error_local); + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + + g_clear_error (&error_local); + +#if FLATPAK_CHECK_VERSION(1,11,1) + /* Find remote related refs that match the installed version in case the app is installed */ + remote_related_refs = flatpak_installation_list_remote_related_refs_for_installed_sync (installation, + gs_app_get_origin (app), + ref, + cancellable, + &error_local); + if (remote_related_refs == NULL && + !g_error_matches (error_local, + FLATPAK_ERROR, + FLATPAK_ERROR_NOT_INSTALLED)) { + gs_flatpak_error_convert (&error_local); + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + + g_clear_error (&error_local); +#endif + + /* Find remote related refs in case the app is not installed */ + if (remote_related_refs == NULL) { + remote_related_refs = flatpak_installation_list_remote_related_refs_sync (installation, + gs_app_get_origin (app), + ref, + cancellable, + &error_local); + /* don't make the error fatal in case we're offline */ + if (error_local != NULL) + g_debug ("failed to list remote related refs of %s: %s", + gs_app_get_unique_id (app), error_local->message); + } + + g_clear_error (&error_local); + + remove_addons = g_ptr_array_new_full (gs_app_list_length (addons_list), g_object_unref); + /* For each addon, if it is neither installed nor available, hide it + * since it may be intended for a different version of the app. We + * don't want to show both org.videolan.VLC.Plugin.bdj//3-19.08 and + * org.videolan.VLC.Plugin.bdj//3-20.08 in the UI; only one will work + * for the installed app + */ + for (guint i = 0; i < gs_app_list_length (addons_list); i++) { + GsApp *app_addon = gs_app_list_index (addons_list, i); + gboolean found = FALSE; + g_autofree char *addon_ref = NULL; + + addon_ref = g_strdup_printf ("%s/%s/%s/%s", + gs_flatpak_app_get_ref_kind_as_str (app_addon), + gs_flatpak_app_get_ref_name (app_addon), + gs_flatpak_app_get_ref_arch (app_addon), + gs_app_get_branch (app_addon)); + for (guint j = 0; !found && installed_related_refs && j < installed_related_refs->len; j++) { + FlatpakRelatedRef *rel = g_ptr_array_index (installed_related_refs, j); + g_autofree char *rel_ref = flatpak_ref_format_ref (FLATPAK_REF (rel)); + if (g_strcmp0 (addon_ref, rel_ref) == 0) + found = TRUE; + } + for (guint j = 0; !found && remote_related_refs && j < remote_related_refs->len; j++) { + FlatpakRelatedRef *rel = g_ptr_array_index (remote_related_refs, j); + g_autofree char *rel_ref = flatpak_ref_format_ref (FLATPAK_REF (rel)); + if (g_strcmp0 (addon_ref, rel_ref) == 0) + found = TRUE; + } + + if (!found) + g_ptr_array_add (remove_addons, g_object_ref (app_addon)); + } + + for (guint i = 0; i < remove_addons->len; i++) { + GsApp *addon = g_ptr_array_index (remove_addons, i); + g_debug ("removing addon '%s' from app '%s', because not related to it", + gs_app_get_unique_id (addon), gs_app_get_unique_id (app)); + gs_app_remove_addon (app, addon); + } + + return TRUE; +} + +static guint64 +gs_flatpak_get_app_directory_size (GsApp *app, + const gchar *subdir_name, + GCancellable *cancellable) +{ + g_autofree gchar *filename = NULL; + filename = g_build_filename (g_get_home_dir (), ".var", "app", gs_app_get_id (app), subdir_name, NULL); + return gs_utils_get_file_size (filename, NULL, NULL, cancellable); +} + +static gboolean +gs_plugin_refine_item_size (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + gboolean ret; + guint64 download_size = 0; + guint64 installed_size = 0; + GsSizeType size_type = GS_SIZE_TYPE_UNKNOWABLE; + + /* not applicable */ + if (gs_app_get_state (app) == GS_APP_STATE_AVAILABLE_LOCAL) + return TRUE; + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) + return TRUE; + + /* already set */ + if (gs_app_is_installed (app)) { + /* only care about the installed size if the app is installed */ + if (gs_app_get_size_installed (app, NULL) == GS_SIZE_TYPE_VALID) + return TRUE; + } else { + if (gs_app_get_size_installed (app, NULL) == GS_SIZE_TYPE_VALID && + gs_app_get_size_download (app, NULL) == GS_SIZE_TYPE_VALID) + return TRUE; + } + + /* need runtime */ + if (!gs_plugin_refine_item_metadata (self, app, interactive, cancellable, error)) + return FALSE; + + /* calculate the platform size too if the app is not installed */ + if (gs_app_get_state (app) == GS_APP_STATE_AVAILABLE && + gs_flatpak_app_get_ref_kind (app) == FLATPAK_REF_KIND_APP) { + GsApp *app_runtime; + + /* is the app_runtime already installed? */ + app_runtime = gs_app_get_runtime (app); + if (!gs_flatpak_refine_app_state_internal (self, + app_runtime, + interactive, + FALSE, + cancellable, + error)) + return FALSE; + if (gs_app_get_state (app_runtime) == GS_APP_STATE_INSTALLED) { + g_debug ("runtime %s is already installed, so not adding size", + gs_app_get_unique_id (app_runtime)); + } else { + if (!gs_plugin_refine_item_size (self, + app_runtime, + interactive, + cancellable, + error)) + return FALSE; + } + } + + /* just get the size of the app */ + if (!gs_plugin_refine_item_origin (self, app, interactive, + cancellable, error)) + return FALSE; + + /* if the app is installed we use the ref to fetch the installed size + * and ignore the download size as this is faster */ + if (gs_app_is_installed (app)) { + g_autoptr(FlatpakInstalledRef) xref = NULL; + xref = gs_flatpak_get_installed_ref (self, app, interactive, cancellable, error); + if (xref == NULL) + return FALSE; + installed_size = flatpak_installed_ref_get_installed_size (xref); + size_type = (installed_size > 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWABLE; + } else { + g_autoptr(FlatpakRef) xref = NULL; + g_autoptr(GError) error_local = NULL; + + /* no origin */ + if (gs_app_get_origin (app) == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no origin set for %s", + gs_app_get_unique_id (app)); + return FALSE; + } + xref = gs_flatpak_create_fake_ref (app, error); + if (xref == NULL) + return FALSE; + ret = flatpak_installation_fetch_remote_size_sync (gs_flatpak_get_installation (self, interactive), + gs_app_get_origin (app), + xref, + &download_size, + &installed_size, + cancellable, + &error_local); + + if (!ret) { + /* This can happen when the remote is filtered */ + g_debug ("libflatpak failed to return application size: %s", error_local->message); + g_clear_error (&error_local); + } else { + size_type = GS_SIZE_TYPE_VALID; + } + } + + gs_app_set_size_installed (app, size_type, installed_size); + gs_app_set_size_download (app, size_type, download_size); + + return TRUE; +} + +static void +gs_flatpak_refine_appstream_release (XbNode *component, GsApp *app) +{ + const gchar *version; + + /* get first release */ + version = xb_node_query_attr (component, "releases/release", "version", NULL); + if (version == NULL) + return; + switch (gs_app_get_state (app)) { + case GS_APP_STATE_INSTALLED: + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_AVAILABLE_LOCAL: + gs_app_set_version (app, version); + break; + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_UPDATABLE_LIVE: + gs_app_set_update_version (app, version); + break; + default: + g_debug ("%s is not installed, so ignoring version of %s", + gs_app_get_unique_id (app), version); + break; + } +} + +/* This function is like gs_flatpak_refine_appstream(), but takes gzip + * compressed appstream data as a GBytes and assumes they are already uniquely + * tied to the app (and therefore app ID alone can be used to find the right + * component). + */ +static gboolean +gs_flatpak_refine_appstream_from_bytes (GsFlatpak *self, + GsApp *app, + const char *origin, /* (nullable) */ + FlatpakInstalledRef *installed_ref, /* (nullable) */ + GBytes *appstream_gz, + GsPluginRefineFlags flags, + gboolean interactive, + const gchar *silo_filename, + GHashTable *silo_installed_by_desktopid, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *xpath = NULL; + g_autoptr(XbBuilder) builder = NULL; + g_autoptr(XbBuilderSource) source = xb_builder_source_new (); + g_autoptr(XbNode) component_node = NULL; + g_autoptr(XbNode) n = NULL; + g_autoptr(XbSilo) silo = NULL; + g_autoptr(XbBuilderFixup) bundle_fixup = NULL; + g_autoptr(GBytes) appstream = NULL; + g_autoptr(GInputStream) stream_data = NULL; + g_autoptr(GInputStream) stream_gz = NULL; + g_autoptr(GZlibDecompressor) decompressor = NULL; + g_autoptr(GMainContext) old_thread_default = NULL; + + /* FIXME: https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1422 */ + old_thread_default = g_main_context_ref_thread_default (); + if (old_thread_default == g_main_context_default ()) + g_clear_pointer (&old_thread_default, g_main_context_unref); + if (old_thread_default != NULL) + g_main_context_pop_thread_default (old_thread_default); + builder = xb_builder_new (); + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + g_clear_pointer (&old_thread_default, g_main_context_unref); + + gs_appstream_add_current_locales (builder); + + /* decompress data */ + decompressor = g_zlib_decompressor_new (G_ZLIB_COMPRESSOR_FORMAT_GZIP); + stream_gz = g_memory_input_stream_new_from_bytes (appstream_gz); + if (stream_gz == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "unable to decompress appstream data"); + return FALSE; + } + stream_data = g_converter_input_stream_new (stream_gz, + G_CONVERTER (decompressor)); + + appstream = g_input_stream_read_bytes (stream_data, + 0x100000, /* 1Mb */ + cancellable, + error); + if (appstream == NULL) { + gs_flatpak_error_convert (error); + return FALSE; + } + + /* build silo */ + if (!xb_builder_source_load_bytes (source, appstream, + XB_BUILDER_SOURCE_FLAG_NONE, + error)) + return FALSE; + + /* Appdata from flatpak_installed_ref_load_appdata() may be missing the + * tag but for this function we know it's the right component. + */ + bundle_fixup = xb_builder_fixup_new ("AddBundle", + gs_flatpak_add_bundle_tag_cb, + gs_flatpak_app_get_ref_display (app), g_free); + xb_builder_fixup_set_max_depth (bundle_fixup, 2); + xb_builder_source_add_fixup (source, bundle_fixup); + + fixup_flatpak_appstream_xml (source, origin); + + /* add metadata */ + if (installed_ref != NULL) { + g_autoptr(XbBuilderNode) info = NULL; + g_autofree char *icon_prefix = NULL; + + info = xb_builder_node_insert (NULL, "info", NULL); + xb_builder_node_insert_text (info, "scope", as_component_scope_to_string (self->scope), NULL); + icon_prefix = g_build_filename (flatpak_installed_ref_get_deploy_dir (installed_ref), + "files", "share", "app-info", "icons", "flatpak", NULL); + xb_builder_node_insert_text (info, "icon-prefix", icon_prefix, NULL); + xb_builder_source_set_info (source, info); + } + + xb_builder_import_source (builder, source); + + /* FIXME: https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1422 */ + old_thread_default = g_main_context_ref_thread_default (); + if (old_thread_default == g_main_context_default ()) + g_clear_pointer (&old_thread_default, g_main_context_unref); + if (old_thread_default != NULL) + g_main_context_pop_thread_default (old_thread_default); + + silo = xb_builder_compile (builder, + XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, + cancellable, + error); + + if (old_thread_default != NULL) + g_main_context_push_thread_default (old_thread_default); + + if (silo == NULL) + return FALSE; + if (g_getenv ("GS_XMLB_VERBOSE") != NULL) { + g_autofree gchar *xml = NULL; + xml = xb_silo_export (silo, + XB_NODE_EXPORT_FLAG_FORMAT_INDENT | + XB_NODE_EXPORT_FLAG_FORMAT_MULTILINE, + NULL); + g_debug ("showing AppStream data: %s", xml); + } + + /* check for sanity */ + n = xb_silo_query_first (silo, "components/component", NULL); + if (n == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no apps found in AppStream data"); + return FALSE; + } + + /* find app */ + xpath = g_strdup_printf ("components/component/id[text()='%s']/..", + gs_flatpak_app_get_ref_name (app)); + component_node = xb_silo_query_first (silo, xpath, NULL); + if (component_node == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "application %s not found", + gs_flatpak_app_get_ref_name (app)); + return FALSE; + } + + /* copy details from AppStream to app */ + if (!gs_appstream_refine_app (self->plugin, app, silo, component_node, flags, silo_installed_by_desktopid, + silo_filename ? silo_filename : "", self->scope, error)) + return FALSE; + + if (gs_app_get_origin (app)) + gs_flatpak_set_app_origin (self, app, gs_app_get_origin (app), NULL, interactive, cancellable); + + /* use the default release as the version number */ + gs_flatpak_refine_appstream_release (component_node, app); + + /* save the silo so it can be used for searches */ + { + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->app_silos_mutex); + g_hash_table_replace (self->app_silos, + gs_flatpak_app_get_ref_display (app), + g_steal_pointer (&silo)); + } + + return TRUE; +} + +static XbNode * +get_renamed_component (GsFlatpak *self, + GsApp *app, + XbSilo *silo, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + const gchar *origin = gs_app_get_origin (app); + const gchar *renamed_to; + g_autoptr(XbQuery) query = NULL; + g_auto(XbQueryContext) context = XB_QUERY_CONTEXT_INIT (); + g_autoptr(FlatpakRemoteRef) remote_ref = NULL; + g_autoptr(XbNode) component = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + remote_ref = flatpak_installation_fetch_remote_ref_sync (installation, + origin, + gs_flatpak_app_get_ref_kind (app), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app), + cancellable, error); + if (remote_ref == NULL) + return NULL; + + renamed_to = flatpak_remote_ref_get_eol_rebase (remote_ref); + if (renamed_to == NULL) + return NULL; + + query = xb_silo_lookup_query (silo, "components[@origin=?]/component/bundle[@type='flatpak'][text()=?]/.."); + xb_value_bindings_bind_str (xb_query_context_get_bindings (&context), 0, origin, NULL); + xb_value_bindings_bind_str (xb_query_context_get_bindings (&context), 1, renamed_to, NULL); + component = xb_silo_query_first_with_context (silo, query, &context, NULL); + + /* Get the previous name so it can be displayed in the UI */ + if (component != NULL) { + g_autoptr(FlatpakInstalledRef) installed_ref = NULL; + const gchar *installed_name = NULL; + + installed_ref = flatpak_installation_get_installed_ref (installation, + gs_flatpak_app_get_ref_kind (app), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app), + cancellable, error); + if (installed_ref != NULL) + installed_name = flatpak_installed_ref_get_appdata_name (installed_ref); + if (installed_name != NULL) + gs_app_set_renamed_from (app, installed_name); + } + + return g_steal_pointer (&component); +} + +/* Returns %TRUE if @error exists and is set to G_IO_ERROR_CANCELLED */ +static inline gboolean +propagate_cancelled_error (GError **dest, + GError **error) +{ + g_assert (error != NULL); + + if (*error && g_error_matches (*error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_propagate_error (dest, g_steal_pointer (error)); + return TRUE; + } + + return FALSE; +} + +static gboolean +gs_flatpak_refine_appstream (GsFlatpak *self, + GsApp *app, + XbSilo *silo, + const gchar *silo_filename, + GHashTable *silo_installed_by_desktopid, + GsPluginRefineFlags flags, + GHashTable *components_by_bundle, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + const gchar *origin = gs_app_get_origin (app); + const gchar *source = gs_app_get_source_default (app); + g_autoptr(GError) error_local = NULL; + g_autoptr(XbNode) component = NULL; + + if (origin == NULL || source == NULL) + return TRUE; + + /* find using source and origin */ + if (components_by_bundle != NULL) { + g_autofree gchar *key = g_strconcat (origin, "\n", source, NULL); + component = g_hash_table_lookup (components_by_bundle, key); + if (component != NULL) + g_object_ref (component); + } else { + g_autofree gchar *source_safe = NULL; + g_autofree gchar *xpath = NULL; + + source_safe = xb_string_escape (source); + xpath = g_strdup_printf ("components[@origin='%s']/component/bundle[@type='flatpak'][text()='%s']/..", + origin, source_safe); + component = xb_silo_query_first (silo, xpath, &error_local); + if (propagate_cancelled_error (error, &error_local)) + return FALSE; + + g_clear_error (&error_local); + } + + /* Ensure the gs_flatpak_app_get_ref_*() metadata are set */ + gs_refine_item_metadata (self, app, NULL); + + /* If the app was renamed, use the appstream data from the new name; + * usually it will not exist under the old name */ + if (component == NULL && gs_flatpak_app_get_ref_kind (app) == FLATPAK_REF_KIND_APP) { + g_autoptr(GError) renamed_component_error = NULL; + + component = get_renamed_component (self, app, silo, + interactive, + cancellable, + &renamed_component_error); + + if (propagate_cancelled_error (error, &renamed_component_error)) + return FALSE; + + g_clear_error (&error_local); + } + + if (component == NULL) { + g_autoptr(FlatpakInstalledRef) installed_ref = NULL; + g_autoptr(GBytes) appstream_gz = NULL; + + /* For apps installed from .flatpak bundles there may not be any remote + * appstream data in @silo for it, so use the appstream data from + * within the app. + */ + installed_ref = flatpak_installation_get_installed_ref (gs_flatpak_get_installation (self, interactive), + gs_flatpak_app_get_ref_kind (app), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app), + cancellable, + &error_local); + + if (installed_ref == NULL) + return !propagate_cancelled_error (error, &error_local); /* the app may not be installed */ + + appstream_gz = flatpak_installed_ref_load_appdata (installed_ref, + cancellable, + &error_local); + if (appstream_gz == NULL) + return !propagate_cancelled_error (error, &error_local); + + g_debug ("using installed appdata for %s", gs_flatpak_app_get_ref_name (app)); + return gs_flatpak_refine_appstream_from_bytes (self, + app, + flatpak_installed_ref_get_origin (installed_ref), + installed_ref, + appstream_gz, + flags, + interactive, + silo_filename, silo_installed_by_desktopid, + cancellable, error); + } + + if (!gs_appstream_refine_app (self->plugin, app, silo, component, flags, silo_installed_by_desktopid, + silo_filename ? silo_filename : "", self->scope, error)) + return FALSE; + + /* use the default release as the version number */ + gs_flatpak_refine_appstream_release (component, app); + return TRUE; +} + +static gboolean +gs_flatpak_refine_app_internal (GsFlatpak *self, + GsApp *app, + GsPluginRefineFlags flags, + gboolean interactive, + gboolean force_state_update, + GHashTable *components_by_bundle, + XbSilo *silo, + const gchar *silo_filename, + GHashTable *silo_installed_by_desktopid, + GCancellable *cancellable, + GError **error) +{ + GsAppState old_state = gs_app_get_state (app); + g_autoptr(GError) local_error = NULL; + + /* not us */ + if (gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_FLATPAK) + return TRUE; + + /* always do AppStream properties */ + if (!gs_flatpak_refine_appstream (self, app, silo, silo_filename, silo_installed_by_desktopid, + flags, components_by_bundle, interactive, cancellable, error)) + return FALSE; + + /* AppStream sets the source to appname/arch/branch */ + if (!gs_refine_item_metadata (self, app, error)) { + g_prefix_error (error, "failed to get metadata: "); + return FALSE; + } + + /* check the installed state */ + if (!gs_flatpak_refine_app_state_internal (self, app, interactive, force_state_update, cancellable, error)) { + g_prefix_error (error, "failed to get state: "); + return FALSE; + } + + /* hide any addons that aren't for this app */ + if (!gs_flatpak_prune_addons_list (self, app, interactive, cancellable, &local_error)) { + g_warning ("failed to prune addons: %s", local_error->message); + g_clear_error (&local_error); + } + + /* scope is fast, do unconditionally */ + if (gs_app_get_state (app) != GS_APP_STATE_AVAILABLE_LOCAL) + gs_plugin_refine_item_scope (self, app); + + /* if the state was changed, perhaps set the version from the release */ + if (old_state != gs_app_get_state (app)) { + if (!gs_flatpak_refine_appstream (self, app, silo, silo_filename, silo_installed_by_desktopid, + flags, components_by_bundle, interactive, cancellable, error)) + return FALSE; + } + + /* version fallback */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION) { + if (gs_app_get_version (app) == NULL) { + const gchar *branch; + branch = gs_app_get_branch (app); + gs_app_set_version (app, branch); + } + } + + /* size */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) { + g_autoptr(GError) error_local = NULL; + if (!gs_plugin_refine_item_size (self, app, interactive, + cancellable, &error_local)) { + if (g_error_matches (error_local, GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NO_NETWORK)) { + g_debug ("failed to get size while " + "refining app %s: %s", + gs_app_get_unique_id (app), + error_local->message); + } else { + g_prefix_error (&error_local, "failed to get size: "); + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + } + } + + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE_DATA) != 0 && + gs_app_is_installed (app) && + gs_app_get_kind (app) != AS_COMPONENT_KIND_RUNTIME) { + if (gs_app_get_size_cache_data (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_cache_data (app, GS_SIZE_TYPE_VALID, + gs_flatpak_get_app_directory_size (app, "cache", cancellable)); + if (gs_app_get_size_user_data (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_user_data (app, GS_SIZE_TYPE_VALID, + gs_flatpak_get_app_directory_size (app, "config", cancellable) + + gs_flatpak_get_app_directory_size (app, "data", cancellable)); + + if (g_cancellable_is_cancelled (cancellable)) { + gs_app_set_size_cache_data (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_size_user_data (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + } + } + + /* origin-hostname */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME) { + if (!gs_plugin_refine_item_origin_hostname (self, app, interactive, + cancellable, + error)) { + g_prefix_error (error, "failed to get origin-hostname: "); + return FALSE; + } + } + + /* permissions */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME || + flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS) { + g_autoptr(GError) error_local = NULL; + if (!gs_plugin_refine_item_metadata (self, app, interactive, + cancellable, &error_local)) { + if (!gs_plugin_get_network_available (self->plugin) && + g_error_matches (error_local, GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NO_NETWORK)) { + g_debug ("failed to get permissions while " + "refining app %s: %s", + gs_app_get_unique_id (app), + error_local->message); + } else { + g_prefix_error (&error_local, "failed to read permissions from app '%s' metadata: ", gs_app_get_unique_id (app)); + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + } + } + + if (gs_app_get_origin (app)) + gs_flatpak_set_app_origin (self, app, gs_app_get_origin (app), NULL, interactive, cancellable); + + return TRUE; +} + +void +gs_flatpak_refine_addons (GsFlatpak *self, + GsApp *parent_app, + GsPluginRefineFlags flags, + GsAppState state, + gboolean interactive, + GCancellable *cancellable) +{ + g_autoptr(XbSilo) silo = NULL; + g_autofree gchar *silo_filename = NULL; + g_autoptr(GHashTable) silo_installed_by_desktopid = NULL; + g_autoptr(GsAppList) addons = NULL; + g_autoptr(GString) errors = NULL; + guint ii, sz; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, &silo_filename, &silo_installed_by_desktopid, cancellable, NULL)) + return; + + addons = gs_app_dup_addons (parent_app); + sz = addons ? gs_app_list_length (addons) : 0; + + for (ii = 0; ii < sz; ii++) { + GsApp *addon = gs_app_list_index (addons, ii); + g_autoptr(GError) local_error = NULL; + + if (state != gs_app_get_state (addon)) + continue; + + if (!gs_flatpak_refine_app_internal (self, addon, flags, interactive, TRUE, NULL, silo, silo_filename, + silo_installed_by_desktopid, cancellable, &local_error)) { + if (errors) + g_string_append_c (errors, '\n'); + else + errors = g_string_new (NULL); + g_string_append_printf (errors, _("Failed to refine addon ‘%s’: %s"), + gs_app_get_name (addon), local_error->message); + } + } + + if (errors) { + g_autoptr(GsPluginEvent) event = NULL; + g_autoptr(GError) error_local = g_error_new_literal (GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + errors->str); + + event = gs_plugin_event_new ("error", error_local, + "app", parent_app, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (self->plugin, event); + } +} + +gboolean +gs_flatpak_refine_app (GsFlatpak *self, + GsApp *app, + GsPluginRefineFlags flags, + gboolean interactive, + gboolean force_state_update, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(XbSilo) silo = NULL; + g_autoptr(GHashTable) silo_installed_by_desktopid = NULL; + g_autofree gchar *silo_filename = NULL; + + /* ensure valid */ + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, &silo_filename, &silo_installed_by_desktopid, cancellable, error)) + return FALSE; + + return gs_flatpak_refine_app_internal (self, app, flags, interactive, force_state_update, NULL, + silo, silo_filename, silo_installed_by_desktopid, cancellable, error); +} + +gboolean +gs_flatpak_refine_wildcard (GsFlatpak *self, GsApp *app, + GsAppList *list, GsPluginRefineFlags refine_flags, + gboolean interactive, + GHashTable **inout_components_by_id, + GHashTable **inout_components_by_bundle, + GCancellable *cancellable, GError **error) +{ + const gchar *id; + GPtrArray* components = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(XbSilo) silo = NULL; + g_autoptr(GHashTable) silo_installed_by_desktopid = NULL; + g_autofree gchar *silo_filename = NULL; + + GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcard, "Flatpak (refine wildcard)", NULL); + + /* not enough info to find */ + id = gs_app_get_id (app); + if (id == NULL) + return TRUE; + + silo = gs_flatpak_ref_silo (self, interactive, &silo_filename, &silo_installed_by_desktopid, cancellable, error); + if (silo == NULL) + return FALSE; + + GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardQuerySilo, "Flatpak (query silo)", NULL); + + if (*inout_components_by_id != NULL) { + components = g_hash_table_lookup (*inout_components_by_id, gs_app_get_id (app)); + } else { + g_autoptr(GPtrArray) components_with_id = NULL; + *inout_components_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_ptr_array_unref); + components_with_id = xb_silo_query (silo, "components/component/id", 0, &error_local); + if (components_with_id == NULL) { + if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + return TRUE; + g_propagate_error (error, g_steal_pointer (&error_local)); + return FALSE; + } + for (guint i = 0; i < components_with_id->len; i++) { + XbNode *node = g_ptr_array_index (components_with_id, i); + XbNode *comp_node = xb_node_get_parent (node); + const gchar *comp_id = xb_node_get_text (node); + GPtrArray *comps = g_hash_table_lookup (*inout_components_by_id, comp_id); + if (comps == NULL) { + comps = g_ptr_array_new_with_free_func (g_object_unref); + g_hash_table_insert (*inout_components_by_id, g_strdup (comp_id), comps); + } + g_ptr_array_add (comps, comp_node); + if (components == NULL && g_strcmp0 (id, comp_id) == 0) + components = comps; + } + } + + GS_PROFILER_END_SCOPED (FlatpakRefineWildcardQuerySilo); + + if (components == NULL) + return TRUE; + + gs_flatpak_ensure_remote_title (self, interactive, cancellable); + + if (*inout_components_by_bundle == NULL) { + g_autoptr(GPtrArray) bundles = NULL; + + *inout_components_by_bundle = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + bundles = xb_silo_query (silo, "/components/component/bundle[@type='flatpak']", 0, NULL); + for (guint b = 0; bundles != NULL && b < bundles->len; b++) { + XbNode *bundle_node = g_ptr_array_index (bundles, b); + g_autoptr(XbNode) component_node = xb_node_get_parent (bundle_node); + g_autoptr(XbNode) components_node = xb_node_get_parent (component_node); + const gchar *origin = xb_node_get_attr (components_node, "origin"); + if (origin != NULL) { + const gchar *bundle = xb_node_get_text (bundle_node); + if (bundle != NULL) { + g_autofree gchar *key = g_strconcat (origin, "\n", bundle, NULL); + g_hash_table_insert (*inout_components_by_bundle, g_steal_pointer (&key), g_steal_pointer (&component_node)); + } + } + } + } + + + GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardGenerateApps, "Flatpak (create app)", NULL); + for (guint i = 0; i < components->len; i++) { + XbNode *component = g_ptr_array_index (components, i); + g_autoptr(GsApp) new = NULL; + + GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardCreateAppstreamApp, "Flatpak (create Appstream app)", NULL); + new = gs_appstream_create_app (self->plugin, silo, component, silo_filename ? silo_filename : "", + self->scope, error); + GS_PROFILER_END_SCOPED (FlatpakRefineWildcardCreateAppstreamApp); + + if (new == NULL) + return FALSE; + + gs_flatpak_claim_app (self, new); + + /* The appstream plugin did not find the component in the plugin's cache, + thus read the required info from the 'bundle' element. */ + if (gs_flatpak_app_get_ref_name (new) == NULL || + gs_flatpak_app_get_ref_arch (new) == NULL) { + const gchar *xref_str = NULL; + g_autoptr(XbNode) child = NULL; + g_autoptr(XbNode) next = NULL; + for (child = xb_node_get_child (component); child != NULL && xref_str == NULL; + g_object_unref (child), child = g_steal_pointer (&next)) { + next = xb_node_get_next (child); + if (g_strcmp0 (xb_node_get_element (child), "bundle") == 0 && + g_strcmp0 (xb_node_get_attr (child, "type"), "flatpak") == 0) { + xref_str = xb_node_get_text (child); + break; + } + } + if (xref_str != NULL) { + g_auto(GStrv) split = NULL; + + /* get the kind/name/arch/branch */ + split = g_strsplit (xref_str, "/", -1); + if (g_strv_length (split) == 4) { + const gchar *comp_type = xb_node_get_attr (component, "type"); + AsComponentKind kind = as_component_kind_from_string (comp_type); + if (kind != AS_COMPONENT_KIND_UNKNOWN) + gs_app_set_kind (new, kind); + else if (g_ascii_strcasecmp (split[0], "app") == 0) + gs_app_set_kind (new, AS_COMPONENT_KIND_DESKTOP_APP); + else if (g_ascii_strcasecmp (split[0], "runtime") == 0) + gs_flatpak_set_runtime_kind_from_id (new); + gs_flatpak_app_set_ref_name (new, split[1]); + gs_flatpak_app_set_ref_arch (new, split[2]); + gs_app_set_branch (new, split[3]); + gs_app_set_metadata (new, "GnomeSoftware::packagename-value", xref_str); + } + } + } + + if (gs_flatpak_app_get_ref_name (new) == NULL || + gs_flatpak_app_get_ref_arch (new) == NULL) { + g_debug ("Failed to get ref info for '%s' from wildcard '%s', skipping it...", gs_app_get_id (new), id); + } else { + GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardRefineNewApp, "Flatpak (refine new app)", NULL); + if (!gs_flatpak_refine_app_internal (self, new, refine_flags, interactive, FALSE, *inout_components_by_bundle, + silo, silo_filename, silo_installed_by_desktopid, cancellable, error)) + return FALSE; + GS_PROFILER_END_SCOPED (FlatpakRefineWildcardRefineNewApp); + + GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardSubsumeMetadata, "Flatpak (subsume metadata)", NULL); + gs_app_subsume_metadata (new, app); + GS_PROFILER_END_SCOPED (FlatpakRefineWildcardSubsumeMetadata); + + gs_app_list_add (list, new); + } + } + GS_PROFILER_END_SCOPED (FlatpakRefineWildcardGenerateApps); + + GS_PROFILER_END_SCOPED (FlatpakRefineWildcard); + + /* success */ + return TRUE; +} + +gboolean +gs_flatpak_launch (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + /* launch the app */ + if (!flatpak_installation_launch (gs_flatpak_get_installation (self, interactive), + gs_flatpak_app_get_ref_name (app), + gs_flatpak_app_get_ref_arch (app), + gs_app_get_branch (app), + NULL, + cancellable, + error)) { + gs_flatpak_error_convert (error); + return FALSE; + } + return TRUE; +} + +gboolean +gs_flatpak_app_remove_source (GsFlatpak *self, + GsApp *app, + gboolean is_remove, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(FlatpakRemote) xremote = NULL; + gboolean success; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + /* find the remote */ + xremote = gs_flatpak_remote_by_name (self, gs_app_get_id (app), interactive, cancellable, error); + if (xremote == NULL) { + gs_flatpak_error_convert (error); + g_prefix_error (error, + "flatpak source %s not found: ", + gs_app_get_id (app)); + return FALSE; + } + + /* remove */ + gs_app_set_state (app, GS_APP_STATE_REMOVING); + if (is_remove) { + success = flatpak_installation_remove_remote (installation, gs_app_get_id (app), cancellable, error); + } else { + gboolean was_disabled = flatpak_remote_get_disabled (xremote); + flatpak_remote_set_disabled (xremote, TRUE); + success = flatpak_installation_modify_remote (installation, xremote, cancellable, error); + if (!success) + flatpak_remote_set_disabled (xremote, was_disabled); + } + + if (!success) { + gs_flatpak_error_convert (error); + gs_app_set_state_recover (app); + return FALSE; + } + + /* invalidate cache */ + gs_flatpak_invalidate_silo (self); + + gs_app_set_state (app, is_remove ? GS_APP_STATE_UNAVAILABLE : GS_APP_STATE_AVAILABLE); + + gs_plugin_repository_changed (self->plugin, app); + + return TRUE; +} + +GsApp * +gs_flatpak_file_to_app_bundle (GsFlatpak *self, + GFile *file, + gboolean unrefined, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GBytes) appstream_gz = NULL; + g_autoptr(GBytes) icon_data64 = NULL, icon_data128 = NULL; + g_autoptr(GBytes) metadata = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(FlatpakBundleRef) xref_bundle = NULL; + + /* load bundle */ + xref_bundle = flatpak_bundle_ref_new (file, error); + if (xref_bundle == NULL) { + gs_flatpak_error_convert (error); + g_prefix_error (error, "error loading bundle: "); + return NULL; + } + + /* load metadata */ + app = gs_flatpak_create_app (self, NULL, FLATPAK_REF (xref_bundle), NULL, interactive, FALSE, cancellable); + if (unrefined) + return g_steal_pointer (&app); + + gs_flatpak_app_set_file_kind (app, GS_FLATPAK_APP_FILE_KIND_BUNDLE); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE_LOCAL); + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, flatpak_bundle_ref_get_installed_size (xref_bundle)); + gs_flatpak_set_metadata (self, app, FLATPAK_REF (xref_bundle)); + metadata = flatpak_bundle_ref_get_metadata (xref_bundle); + if (!gs_flatpak_set_app_metadata (self, app, + g_bytes_get_data (metadata, NULL), + g_bytes_get_size (metadata), + interactive, + cancellable, + error)) + return NULL; + + /* load AppStream */ + appstream_gz = flatpak_bundle_ref_get_appstream (xref_bundle); + if (appstream_gz != NULL) { + g_autofree gchar *silo_filename = NULL; + g_autoptr(GHashTable) silo_installed_by_desktopid = NULL; + g_autoptr(XbSilo) tmp_silo = NULL; + + tmp_silo = gs_flatpak_ref_silo (self, interactive, &silo_filename, &silo_installed_by_desktopid, cancellable, error); + if (tmp_silo == NULL) + return NULL; + if (!gs_flatpak_refine_appstream_from_bytes (self, app, NULL, NULL, + appstream_gz, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID, + interactive, + silo_filename, silo_installed_by_desktopid, + cancellable, error)) + return NULL; + } else { + g_warning ("no appstream metadata in file"); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, + gs_flatpak_app_get_ref_name (app)); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, + "A flatpak application"); + gs_app_set_description (app, GS_APP_QUALITY_LOWEST, ""); + } + + /* Load icons. Currently flatpak only supports exactly 64px or 128px + * icons in bundles. */ + icon_data64 = flatpak_bundle_ref_get_icon (xref_bundle, 64); + if (icon_data64 != NULL) { + g_autoptr(GIcon) icon = g_bytes_icon_new (icon_data64); + gs_icon_set_width (icon, 64); + gs_icon_set_height (icon, 64); + gs_app_add_icon (app, icon); + } + + icon_data128 = flatpak_bundle_ref_get_icon (xref_bundle, 128); + if (icon_data128 != NULL) { + g_autoptr(GIcon) icon = g_bytes_icon_new (icon_data128); + gs_icon_set_width (icon, 128); + gs_icon_set_height (icon, 128); + gs_app_add_icon (app, icon); + } + + /* Fallback */ + if (icon_data64 == NULL && icon_data128 == NULL) { + g_autoptr(GIcon) icon = g_themed_icon_new ("system-component-application"); + gs_app_add_icon (app, icon); + } + + /* not quite true: this just means we can update this specific app */ + if (flatpak_bundle_ref_get_origin (xref_bundle)) + gs_app_add_quirk (app, GS_APP_QUIRK_HAS_SOURCE); + + /* success */ + return g_steal_pointer (&app); +} + +static gboolean +_txn_abort_on_ready (FlatpakTransaction *transaction) +{ + return FALSE; +} + +static gboolean +_txn_add_new_remote (FlatpakTransaction *transaction, + FlatpakTransactionRemoteReason reason, + const char *from_id, + const char *remote_name, + const char *url) +{ + return TRUE; +} + +static int +_txn_choose_remote_for_ref (FlatpakTransaction *transaction, + const char *for_ref, + const char *runtime_ref, + const char * const *remotes) +{ + /* This transaction is just for displaying the app not installing it so + * this choice shouldn't matter */ + return 0; +} + +GsApp * +gs_flatpak_file_to_app_ref (GsFlatpak *self, + GFile *file, + gboolean unrefined, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + GsApp *runtime; + const gchar *remote_name = NULL; + gboolean is_runtime, success; + gsize len = 0; + GList *txn_ops; +#if !FLATPAK_CHECK_VERSION(1,13,1) + guint64 app_installed_size = 0, app_download_size = 0; +#endif + g_autofree gchar *contents = NULL; + g_autoptr(FlatpakTransaction) transaction = NULL; + g_autoptr(FlatpakRef) parsed_ref = NULL; + g_autoptr(FlatpakRemoteRef) remote_ref = NULL; + g_autoptr(FlatpakRemote) xremote = NULL; + g_autoptr(GBytes) ref_file_data = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GKeyFile) kf = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(XbBuilder) builder = xb_builder_new (); + g_autoptr(XbSilo) silo = NULL; + g_autoptr(XbSilo) tmp_silo = NULL; + g_autoptr(GHashTable) silo_installed_by_desktopid = NULL; + g_autofree gchar *silo_filename = NULL; + g_autofree gchar *origin_url = NULL; + g_autofree gchar *ref_comment = NULL; + g_autofree gchar *ref_description = NULL; + g_autofree gchar *ref_homepage = NULL; + g_autofree gchar *ref_icon = NULL; + g_autofree gchar *ref_title = NULL; + g_autofree gchar *ref_name = NULL; + g_autofree gchar *ref_branch = NULL; + FlatpakInstallation *installation = gs_flatpak_get_installation (self, interactive); + + gs_appstream_add_current_locales (builder); + + /* get file data */ + if (!g_file_load_contents (file, + cancellable, + &contents, + &len, + NULL, + error)) { + gs_utils_error_convert_gio (error); + return NULL; + } + + /* load the file */ + kf = g_key_file_new (); + if (!g_key_file_load_from_data (kf, contents, len, G_KEY_FILE_NONE, error)) { + gs_utils_error_convert_gio (error); + return NULL; + } + + /* check version */ + if (g_key_file_has_key (kf, "Flatpak Ref", "Version", NULL)) { + guint64 ver = g_key_file_get_uint64 (kf, "Flatpak Ref", "Version", NULL); + if (ver != 1) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "unsupported version %" G_GUINT64_FORMAT, ver); + return NULL; + } + } + + /* get name, branch, kind */ + ref_name = g_key_file_get_string (kf, "Flatpak Ref", "Name", error); + if (ref_name == NULL) { + gs_utils_error_convert_gio (error); + return NULL; + } + if (g_key_file_has_key (kf, "Flatpak Ref", "Branch", NULL)) { + ref_branch = g_key_file_get_string (kf, "Flatpak Ref", "Branch", error); + if (ref_branch == NULL) { + gs_utils_error_convert_gio (error); + return NULL; + } + } else { + ref_branch = g_strdup ("master"); + } + if (g_key_file_has_key (kf, "Flatpak Ref", "IsRuntime", NULL)) { + is_runtime = g_key_file_get_boolean (kf, "Flatpak Ref", "IsRuntime", error); + if (error != NULL && *error != NULL) { + gs_utils_error_convert_gio (error); + return NULL; + } + } else { + is_runtime = FALSE; + } + + if (unrefined) { + /* Note: we don't support non-default arch here but it's not a + * regression since we never have for a flatpakref + */ + g_autofree char *app_ref = g_strdup_printf ("%s/%s/%s/%s", + is_runtime ? "runtime" : "app", + ref_name, + flatpak_get_default_arch (), + ref_branch); + parsed_ref = flatpak_ref_parse (app_ref, error); + if (parsed_ref == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + + /* early return */ + app = gs_flatpak_create_app (self, NULL, parsed_ref, NULL, interactive, FALSE, cancellable); + return g_steal_pointer (&app); + } + + /* Add the remote (to the temporary installation) but abort the + * transaction before it installs the app + */ + transaction = flatpak_transaction_new_for_installation (installation, cancellable, error); + if (transaction == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + flatpak_transaction_set_no_interaction (transaction, TRUE); + g_signal_connect (transaction, "ready-pre-auth", G_CALLBACK (_txn_abort_on_ready), NULL); + g_signal_connect (transaction, "add-new-remote", G_CALLBACK (_txn_add_new_remote), NULL); + g_signal_connect (transaction, "choose-remote-for-ref", G_CALLBACK (_txn_choose_remote_for_ref), NULL); + ref_file_data = g_bytes_new (contents, len); + if (!flatpak_transaction_add_install_flatpakref (transaction, ref_file_data, error)) { + gs_flatpak_error_convert (error); + return NULL; + } + success = flatpak_transaction_run (transaction, cancellable, &error_local); + g_assert (!success); /* aborted in _txn_abort_on_ready */ + + /* We don't check for FLATPAK_ERROR_ALREADY_INSTALLED here because it's + * a temporary installation + */ + if (!g_error_matches (error_local, FLATPAK_ERROR, FLATPAK_ERROR_ABORTED)) { + g_propagate_error (error, g_steal_pointer (&error_local)); + gs_flatpak_error_convert (error); + return NULL; + } + + g_clear_error (&error_local); + + /* find the operation for the flatpakref */ + txn_ops = flatpak_transaction_get_operations (transaction); + for (GList *l = txn_ops; l != NULL; l = l->next) { + FlatpakTransactionOperation *op = l->data; + const char *op_ref = flatpak_transaction_operation_get_ref (op); + parsed_ref = flatpak_ref_parse (op_ref, error); + if (parsed_ref == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + if (g_strcmp0 (flatpak_ref_get_name (parsed_ref), ref_name) != 0) { + g_clear_object (&parsed_ref); + } else { + remote_name = flatpak_transaction_operation_get_remote (op); + g_debug ("auto-created remote name: %s", remote_name); +#if !FLATPAK_CHECK_VERSION(1,13,1) + app_download_size = flatpak_transaction_operation_get_download_size (op); + app_installed_size = flatpak_transaction_operation_get_installed_size (op); +#endif + break; + } + } + g_assert (parsed_ref != NULL); + g_assert (remote_name != NULL); + g_list_free_full (g_steal_pointer (&txn_ops), g_object_unref); + +#if FLATPAK_CHECK_VERSION(1,13,1) + /* fetch remote ref */ + g_assert (remote_name != NULL); + remote_ref = flatpak_installation_fetch_remote_ref_sync (installation, + remote_name, + flatpak_ref_get_kind (parsed_ref), + flatpak_ref_get_name (parsed_ref), + flatpak_ref_get_arch (parsed_ref), + flatpak_ref_get_branch (parsed_ref), + cancellable, + error); + if (remote_ref == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + app = gs_flatpak_create_app (self, remote_name, FLATPAK_REF (remote_ref), NULL, interactive, FALSE, cancellable); +#else + app = gs_flatpak_create_app (self, remote_name, parsed_ref, NULL, interactive, FALSE, cancellable); + gs_app_set_size_download (app, (app_download_size != 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, app_download_size); + gs_app_set_size_installed (app, (app_installed_size != 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, app_installed_size); +#endif + + gs_app_add_quirk (app, GS_APP_QUIRK_HAS_SOURCE); + gs_flatpak_app_set_file_kind (app, GS_FLATPAK_APP_FILE_KIND_REF); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + + runtime = gs_app_get_runtime (app); + if (runtime != NULL) { + g_autofree char *runtime_ref = gs_flatpak_app_get_ref_display (runtime); + if (gs_app_get_state (runtime) == GS_APP_STATE_UNKNOWN) { + g_autofree gchar *uri = NULL; + /* the new runtime is available from the RuntimeRepo */ + uri = g_key_file_get_string (kf, "Flatpak Ref", "RuntimeRepo", NULL); + gs_flatpak_app_set_runtime_url (runtime, uri); + } + + /* find the operation for the runtime to set its size data. Since this + * is all happening on a tmp installation, it won't be available later + * during the refine step + */ + txn_ops = flatpak_transaction_get_operations (transaction); + for (GList *l = txn_ops; l != NULL; l = l->next) { + FlatpakTransactionOperation *op = l->data; + const char *op_ref = flatpak_transaction_operation_get_ref (op); + if (g_strcmp0 (runtime_ref, op_ref) == 0) { + guint64 installed_size = 0, download_size = 0; + download_size = flatpak_transaction_operation_get_download_size (op); + gs_app_set_size_download (runtime, (download_size != 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, download_size); + installed_size = flatpak_transaction_operation_get_installed_size (op); + gs_app_set_size_installed (runtime, (installed_size != 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, installed_size); + break; + } + } + g_list_free_full (g_steal_pointer (&txn_ops), g_object_unref); + } + + /* use the data from the flatpakref file as a fallback */ + ref_title = g_key_file_get_string (kf, "Flatpak Ref", "Title", NULL); + if (ref_title != NULL) + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, ref_title); + ref_comment = g_key_file_get_string (kf, "Flatpak Ref", "Comment", NULL); + if (ref_comment != NULL) + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, ref_comment); + ref_description = g_key_file_get_string (kf, "Flatpak Ref", "Description", NULL); + if (ref_description != NULL) + gs_app_set_description (app, GS_APP_QUALITY_NORMAL, ref_description); + ref_homepage = g_key_file_get_string (kf, "Flatpak Ref", "Homepage", NULL); + if (ref_homepage != NULL) + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, ref_homepage); + ref_icon = g_key_file_get_string (kf, "Flatpak Ref", "Icon", NULL); + if (ref_icon != NULL && + (g_str_has_prefix (ref_icon, "http:") || + g_str_has_prefix (ref_icon, "https:"))) { + /* Unfortunately the .flatpakref file doesn’t specify the icon + * size or scale out of band. */ + g_autoptr(GIcon) icon = gs_remote_icon_new (ref_icon); + gs_app_add_icon (app, icon); + } + + /* set the origin data */ + xremote = gs_flatpak_remote_by_name (self, remote_name, interactive, cancellable, error); + if (xremote == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + origin_url = flatpak_remote_get_url (xremote); + if (origin_url == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no URL for remote %s", + flatpak_remote_get_name (xremote)); + return NULL; + } + gs_app_set_origin_hostname (app, origin_url); + + /* get the new appstream data (nonfatal for failure) */ + if (!gs_flatpak_refresh_appstream_remote (self, remote_name, interactive, + cancellable, &error_local)) { + g_autoptr(GsPluginEvent) event = NULL; + + gs_flatpak_error_convert (&error_local); + + event = gs_plugin_event_new ("app", app, + "error", error_local, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (self->plugin, event); + g_clear_error (&error_local); + } + + /* get this now, as it's not going to be available at install time */ + if (!gs_plugin_refine_item_metadata (self, app, interactive, cancellable, error)) + return NULL; + + /* parse it */ + if (!gs_flatpak_add_apps_from_xremote (self, builder, xremote, interactive, cancellable, error)) + return NULL; + + /* build silo */ + /* No need to change the thread-default main context because the silo + * doesn’t live beyond this function */ + silo = xb_builder_compile (builder, + XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, + cancellable, + error); + if (silo == NULL) + return NULL; + if (g_getenv ("GS_XMLB_VERBOSE") != NULL) { + g_autofree gchar *xml = NULL; + xml = xb_silo_export (silo, + XB_NODE_EXPORT_FLAG_FORMAT_INDENT | + XB_NODE_EXPORT_FLAG_FORMAT_MULTILINE, + NULL); + g_debug ("showing AppStream data: %s", xml); + } + + tmp_silo = gs_flatpak_ref_silo (self, interactive, &silo_filename, &silo_installed_by_desktopid, cancellable, error); + if (tmp_silo == NULL) + return NULL; + + /* get extra AppStream data if available */ + if (!gs_flatpak_refine_appstream (self, app, silo, silo_filename, silo_installed_by_desktopid, + GS_PLUGIN_REFINE_FLAGS_MASK, + NULL, + interactive, + cancellable, + error)) + return NULL; + + /* success */ + return g_steal_pointer (&app); +} + +gboolean +gs_flatpak_search (GsFlatpak *self, + const gchar * const *values, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) list_tmp = gs_app_list_new (); + g_autoptr(GMutexLocker) app_silo_locker = NULL; + g_autoptr(GPtrArray) silos_to_remove = g_ptr_array_new (); + g_autoptr(XbSilo) silo = NULL; + GHashTableIter iter; + gpointer key, value; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + if (!gs_appstream_search (self->plugin, silo, values, list_tmp, cancellable, error)) + return FALSE; + + gs_flatpak_ensure_remote_title (self, interactive, cancellable); + + gs_flatpak_claim_app_list (self, list_tmp, interactive); + gs_app_list_add_list (list, list_tmp); + + /* Also search silos from installed apps which were missing from self->silo */ + app_silo_locker = g_mutex_locker_new (&self->app_silos_mutex); + g_hash_table_iter_init (&iter, self->app_silos); + while (g_hash_table_iter_next (&iter, &key, &value)) { + g_autoptr(XbSilo) app_silo = g_object_ref (value); + g_autoptr(GsAppList) app_list_tmp = gs_app_list_new (); + const char *app_ref = (char *)key; + g_autoptr(FlatpakInstalledRef) installed_ref = NULL; + g_auto(GStrv) split = NULL; + FlatpakRefKind kind; + + /* Ignore any silos of apps that have since been removed. + * FIXME: can we use self->installed_refs here? */ + split = g_strsplit (app_ref, "/", -1); + g_assert (g_strv_length (split) == 4); + if (g_strcmp0 (split[0], "app") == 0) + kind = FLATPAK_REF_KIND_APP; + else + kind = FLATPAK_REF_KIND_RUNTIME; + installed_ref = flatpak_installation_get_installed_ref (gs_flatpak_get_installation (self, interactive), + kind, + split[1], + split[2], + split[3], + NULL, NULL); + if (installed_ref == NULL) { + g_ptr_array_add (silos_to_remove, (gpointer) app_ref); + continue; + } + + if (!gs_appstream_search (self->plugin, app_silo, values, app_list_tmp, + cancellable, error)) + return FALSE; + + gs_flatpak_claim_app_list (self, app_list_tmp, interactive); + gs_app_list_add_list (list, app_list_tmp); + } + + for (guint i = 0; i < silos_to_remove->len; i++) { + const char *app_ref = g_ptr_array_index (silos_to_remove, i); + g_hash_table_remove (self->app_silos, app_ref); + } + + return TRUE; +} + +gboolean +gs_flatpak_search_developer_apps (GsFlatpak *self, + const gchar * const *values, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) list_tmp = gs_app_list_new (); + g_autoptr(GMutexLocker) app_silo_locker = NULL; + g_autoptr(GPtrArray) silos_to_remove = g_ptr_array_new (); + g_autoptr(XbSilo) silo = NULL; + GHashTableIter iter; + gpointer key, value; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + if (!gs_appstream_search_developer_apps (self->plugin, silo, values, list_tmp, cancellable, error)) + return FALSE; + + gs_flatpak_ensure_remote_title (self, interactive, cancellable); + + gs_flatpak_claim_app_list (self, list_tmp, interactive); + gs_app_list_add_list (list, list_tmp); + + /* Also search silos from installed apps which were missing from self->silo */ + app_silo_locker = g_mutex_locker_new (&self->app_silos_mutex); + g_hash_table_iter_init (&iter, self->app_silos); + while (g_hash_table_iter_next (&iter, &key, &value)) { + g_autoptr(XbSilo) app_silo = g_object_ref (value); + g_autoptr(GsAppList) app_list_tmp = gs_app_list_new (); + const char *app_ref = (char *)key; + g_autoptr(FlatpakInstalledRef) installed_ref = NULL; + g_auto(GStrv) split = NULL; + FlatpakRefKind kind; + + /* Ignore any silos of apps that have since been removed. + * FIXME: can we use self->installed_refs here? */ + split = g_strsplit (app_ref, "/", -1); + g_assert (g_strv_length (split) == 4); + if (g_strcmp0 (split[0], "app") == 0) + kind = FLATPAK_REF_KIND_APP; + else + kind = FLATPAK_REF_KIND_RUNTIME; + installed_ref = flatpak_installation_get_installed_ref (gs_flatpak_get_installation (self, interactive), + kind, + split[1], + split[2], + split[3], + NULL, NULL); + if (installed_ref == NULL) { + g_ptr_array_add (silos_to_remove, (gpointer) app_ref); + continue; + } + + if (!gs_appstream_search_developer_apps (self->plugin, app_silo, values, app_list_tmp, + cancellable, error)) + return FALSE; + + gs_flatpak_claim_app_list (self, app_list_tmp, interactive); + gs_app_list_add_list (list, app_list_tmp); + } + + for (guint i = 0; i < silos_to_remove->len; i++) { + const char *app_ref = g_ptr_array_index (silos_to_remove, i); + g_hash_table_remove (self->app_silos, app_ref); + } + + return TRUE; +} + +gboolean +gs_flatpak_add_category_apps (GsFlatpak *self, + GsCategory *category, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(XbSilo) silo = NULL; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + return gs_appstream_add_category_apps (self->plugin, silo, category, list, cancellable, error); +} + +gboolean +gs_flatpak_refine_category_sizes (GsFlatpak *self, + GPtrArray *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(XbSilo) silo = NULL; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + return gs_appstream_refine_category_sizes (silo, list, cancellable, error); +} + +gboolean +gs_flatpak_add_popular (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) list_tmp = gs_app_list_new (); + g_autoptr(XbSilo) silo = NULL; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + if (!gs_appstream_add_popular (silo, list_tmp, cancellable, error)) + return FALSE; + + gs_app_list_add_list (list, list_tmp); + + return TRUE; +} + +gboolean +gs_flatpak_add_featured (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) list_tmp = gs_app_list_new (); + g_autoptr(XbSilo) silo = NULL; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + if (!gs_appstream_add_featured (silo, list_tmp, cancellable, error)) + return FALSE; + + gs_app_list_add_list (list, list_tmp); + + return TRUE; +} + +gboolean +gs_flatpak_add_deployment_featured (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + const gchar *const *deployments, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(XbSilo) silo = NULL; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + return gs_appstream_add_deployment_featured (silo, deployments, list, cancellable, error); +} + +gboolean +gs_flatpak_add_alternates (GsFlatpak *self, + GsApp *app, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) list_tmp = gs_app_list_new (); + g_autoptr(XbSilo) silo = NULL; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + if (!gs_appstream_add_alternates (silo, app, list_tmp, cancellable, error)) + return FALSE; + + gs_app_list_add_list (list, list_tmp); + + return TRUE; +} + +gboolean +gs_flatpak_add_recent (GsFlatpak *self, + GsAppList *list, + guint64 age, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) list_tmp = gs_app_list_new (); + g_autoptr(XbSilo) silo = NULL; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + if (!gs_appstream_add_recent (self->plugin, silo, list_tmp, age, cancellable, error)) + return FALSE; + + gs_flatpak_claim_app_list (self, list_tmp, interactive); + gs_app_list_add_list (list, list_tmp); + + return TRUE; +} + +gboolean +gs_flatpak_url_to_app (GsFlatpak *self, + GsAppList *list, + const gchar *url, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) list_tmp = gs_app_list_new (); + g_autoptr(XbSilo) silo = NULL; + + if (!gs_flatpak_rescan_app_data (self, interactive, &silo, NULL, NULL, cancellable, error)) + return FALSE; + + if (!gs_appstream_url_to_app (self->plugin, silo, list_tmp, url, cancellable, error)) + return FALSE; + + gs_flatpak_claim_app_list (self, list_tmp, interactive); + gs_app_list_add_list (list, list_tmp); + + return TRUE; +} + +const gchar * +gs_flatpak_get_id (GsFlatpak *self) +{ + if (self->id == NULL) { + GString *str = g_string_new ("flatpak"); + g_string_append_printf (str, "-%s", + as_component_scope_to_string (self->scope)); + if (flatpak_installation_get_id (self->installation_noninteractive) != NULL) { + g_string_append_printf (str, "-%s", + flatpak_installation_get_id (self->installation_noninteractive)); + } + if (self->flags & GS_FLATPAK_FLAG_IS_TEMPORARY) + g_string_append (str, "-temp"); + self->id = g_string_free (str, FALSE); + } + return self->id; +} + +AsComponentScope +gs_flatpak_get_scope (GsFlatpak *self) +{ + return self->scope; +} + +FlatpakInstallation * +gs_flatpak_get_installation (GsFlatpak *self, + gboolean interactive) +{ + return interactive ? self->installation_interactive : self->installation_noninteractive; +} + +static void +gs_flatpak_finalize (GObject *object) +{ + GsFlatpak *self; + g_return_if_fail (GS_IS_FLATPAK (object)); + self = GS_FLATPAK (object); + + if (self->changed_id > 0) { + g_signal_handler_disconnect (self->monitor, self->changed_id); + self->changed_id = 0; + } + g_clear_object (&self->silo); + g_clear_object (&self->monitor); + g_clear_pointer (&self->silo_filename, g_free); + g_clear_pointer (&self->silo_installed_by_desktopid, g_hash_table_unref); + + g_free (self->id); + g_object_unref (self->installation_noninteractive); + g_object_unref (self->installation_interactive); + g_clear_pointer (&self->installed_refs, g_ptr_array_unref); + g_clear_pointer (&self->remotes_by_name, g_hash_table_unref); + g_mutex_clear (&self->installed_refs_mutex); + g_object_unref (self->plugin); + g_hash_table_unref (self->broken_remotes); + g_mutex_clear (&self->broken_remotes_mutex); + g_mutex_clear (&self->silo_lock); + g_hash_table_unref (self->app_silos); + g_mutex_clear (&self->app_silos_mutex); + g_clear_pointer (&self->remote_title, g_hash_table_unref); + g_mutex_clear (&self->remote_title_mutex); + + G_OBJECT_CLASS (gs_flatpak_parent_class)->finalize (object); +} + +static void +gs_flatpak_class_init (GsFlatpakClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_flatpak_finalize; +} + +static void +gs_flatpak_init (GsFlatpak *self) +{ + /* XbSilo needs external locking as we destroy the silo and build a new + * one when something changes */ + g_mutex_init (&self->silo_lock); + + g_mutex_init (&self->installed_refs_mutex); + self->installed_refs = NULL; + self->remotes_by_name = NULL; + g_mutex_init (&self->broken_remotes_mutex); + self->broken_remotes = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + self->app_silos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + g_mutex_init (&self->app_silos_mutex); + self->remote_title = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + g_mutex_init (&self->remote_title_mutex); +} + +GsFlatpak * +gs_flatpak_new (GsPlugin *plugin, FlatpakInstallation *installation, GsFlatpakFlags flags) +{ + GsFlatpak *self; + g_autoptr(GFile) path = NULL; + gboolean is_user; + + path = flatpak_installation_get_path (installation); + is_user = flatpak_installation_get_is_user (installation); + + self = g_object_new (GS_TYPE_FLATPAK, NULL); + + self->installation_noninteractive = g_object_ref (installation); + flatpak_installation_set_no_interaction (self->installation_noninteractive, TRUE); + + /* Cloning it should never fail as the repo should already exist on disk. */ + self->installation_interactive = flatpak_installation_new_for_path (path, is_user, NULL, NULL); + g_assert (self->installation_interactive != NULL); + flatpak_installation_set_no_interaction (self->installation_interactive, FALSE); + + self->scope = is_user ? AS_COMPONENT_SCOPE_USER : AS_COMPONENT_SCOPE_SYSTEM; + self->plugin = g_object_ref (plugin); + self->flags = flags; + return GS_FLATPAK (self); +} + +void +gs_flatpak_set_busy (GsFlatpak *self, + gboolean busy) +{ + g_return_if_fail (GS_IS_FLATPAK (self)); + + if (busy) { + g_atomic_int_inc (&self->busy); + } else { + g_return_if_fail (g_atomic_int_get (&self->busy) > 0); + if (g_atomic_int_dec_and_test (&self->busy)) { + if (self->changed_while_busy) { + self->changed_while_busy = FALSE; + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, gs_flatpak_claim_changed_idle_cb, + g_object_ref (self), g_object_unref); + } + } + } +} + +gboolean +gs_flatpak_get_busy (GsFlatpak *self) +{ + g_return_val_if_fail (GS_IS_FLATPAK (self), FALSE); + return g_atomic_int_get (&self->busy) > 0; +} + +gboolean +gs_flatpak_purge_sync (GsFlatpak *self, + GCancellable *cancellable, + GError **error) +{ + FlatpakInstallation *installation; + g_autoptr(GPtrArray) unused_refs = NULL; + + installation = gs_flatpak_get_installation (self, FALSE); + if (installation == NULL) { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + "Non-interactive installation not found"); + return FALSE; + } + + unused_refs = flatpak_installation_list_unused_refs (installation, NULL, cancellable, error); + if (unused_refs == NULL) + return FALSE; + + g_debug ("Installation '%s' has %u unused refs", gs_flatpak_get_id (self), unused_refs->len); + + if (unused_refs->len > 0) { + g_autoptr(FlatpakTransaction) transaction = NULL; + transaction = gs_flatpak_transaction_new (installation, GS_FLATPAK_ERROR_MODE_STOP_ON_FIRST_ERROR, cancellable, error); + if (transaction == NULL) { + g_prefix_error_literal (error, "failed to build transaction: "); + return FALSE; + } + flatpak_transaction_set_no_interaction (transaction, TRUE); + flatpak_transaction_set_no_pull (transaction, TRUE); + + /* use system installations as dependency sources for user installations */ + flatpak_transaction_add_default_dependency_sources (transaction); + + for (guint i = 0; i < unused_refs->len; i++) { + g_autoptr(GsApp) app = NULL; + FlatpakRef *ref = g_ptr_array_index (unused_refs, i); + const gchar *ref_str = flatpak_ref_format_ref_cached (ref); + app = gs_flatpak_ref_to_app (self, ref_str, FALSE, cancellable, error); + if (app == NULL) { + g_prefix_error (error, "failed to create app from ref '%s': ", ref_str); + return FALSE; + } + gs_flatpak_transaction_add_app (transaction, app); + if (!flatpak_transaction_add_uninstall (transaction, ref_str, error)) { + g_prefix_error (error, "failed to add ref to transaction: "); + return FALSE; + } + g_debug ("Going to uninstall '%s'", ref_str); + } + + return gs_flatpak_transaction_run (transaction, cancellable, error); + } else { + /* Nothing to uninstall. */ + return TRUE; + } +} diff --git a/plugins/flatpak/gs-flatpak.h b/plugins/flatpak/gs-flatpak.h new file mode 100644 index 0000000..24d75eb --- /dev/null +++ b/plugins/flatpak/gs-flatpak.h @@ -0,0 +1,191 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Joaquim Rocha + * Copyright (C) 2016-2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_FLATPAK (gs_flatpak_get_type ()) + +G_DECLARE_FINAL_TYPE (GsFlatpak, gs_flatpak, GS, FLATPAK, GObject) + +typedef enum { + GS_FLATPAK_FLAG_NONE = 0, + GS_FLATPAK_FLAG_IS_TEMPORARY = 1 << 0, + GS_FLATPAK_FLAG_LAST /*< skip >*/ +} GsFlatpakFlags; + +GsFlatpak *gs_flatpak_new (GsPlugin *plugin, + FlatpakInstallation *installation, + GsFlatpakFlags flags); +FlatpakInstallation *gs_flatpak_get_installation (GsFlatpak *self, + gboolean interactive); + +GsApp *gs_flatpak_ref_to_app (GsFlatpak *self, + const gchar *ref, + gboolean interactive, + GCancellable *cancellable, + GError **error); + +AsComponentScope gs_flatpak_get_scope (GsFlatpak *self); +const gchar *gs_flatpak_get_id (GsFlatpak *self); +gboolean gs_flatpak_setup (GsFlatpak *self, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_installed (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_sources (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_updates (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_refresh (GsFlatpak *self, + guint64 cache_age_secs, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_refine_app (GsFlatpak *self, + GsApp *app, + GsPluginRefineFlags flags, + gboolean interactive, + gboolean force_state_update, + GCancellable *cancellable, + GError **error); +void gs_flatpak_refine_addons (GsFlatpak *self, + GsApp *parent_app, + GsPluginRefineFlags flags, + GsAppState state, + gboolean interactive, + GCancellable *cancellable); +gboolean gs_flatpak_refine_app_state (GsFlatpak *self, + GsApp *app, + gboolean interactive, + gboolean force_state_update, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_refine_wildcard (GsFlatpak *self, + GsApp *app, + GsAppList *list, + GsPluginRefineFlags flags, + gboolean interactive, + GHashTable **inout_components_by_id, + GHashTable **inout_components_by_bundle, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_launch (GsFlatpak *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_app_remove_source (GsFlatpak *self, + GsApp *app, + gboolean is_remove, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_app_install_source (GsFlatpak *self, + GsApp *app, + gboolean is_install, + gboolean interactive, + GCancellable *cancellable, + GError **error); +GsApp *gs_flatpak_file_to_app_ref (GsFlatpak *self, + GFile *file, + gboolean unrefined, + gboolean interactive, + GCancellable *cancellable, + GError **error); +GsApp *gs_flatpak_file_to_app_bundle (GsFlatpak *self, + GFile *file, + gboolean unrefined, + gboolean interactive, + GCancellable *cancellable, + GError **error); +GsApp *gs_flatpak_find_source_by_url (GsFlatpak *self, + const gchar *name, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_search (GsFlatpak *self, + const gchar * const *values, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_search_developer_apps(GsFlatpak *self, + const gchar * const *values, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_refine_category_sizes(GsFlatpak *self, + GPtrArray *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_category_apps (GsFlatpak *self, + GsCategory *category, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_popular (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_featured (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_deployment_featured + (GsFlatpak *self, + GsAppList *list, + gboolean interactive, + const gchar *const *deployments, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_alternates (GsFlatpak *self, + GsApp *app, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_add_recent (GsFlatpak *self, + GsAppList *list, + guint64 age, + gboolean interactive, + GCancellable *cancellable, + GError **error); +gboolean gs_flatpak_url_to_app (GsFlatpak *self, + GsAppList *list, + const gchar *url, + gboolean interactive, + GCancellable *cancellable, + GError **error); +void gs_flatpak_set_busy (GsFlatpak *self, + gboolean busy); +gboolean gs_flatpak_get_busy (GsFlatpak *self); +gboolean gs_flatpak_purge_sync (GsFlatpak *self, + GCancellable *cancellable, + GError **error); + +G_END_DECLS diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c new file mode 100644 index 0000000..11670d0 --- /dev/null +++ b/plugins/flatpak/gs-plugin-flatpak.c @@ -0,0 +1,3109 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Joaquim Rocha + * Copyright (C) 2016-2018 Richard Hughes + * Copyright (C) 2017-2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + * SECTION: + * Exposes flatpaks from the user and system repositories. + * + * All GsApp's created have management-plugin set to flatpak + * Some GsApp's created have have flatpak::kind of app or runtime + * The GsApp:origin is the remote name, e.g. test-repo + * + * The plugin has a worker thread which all operations are delegated to, as the + * libflatpak API is entirely synchronous (and thread-safe). * Message passing + * to the worker thread is by gs_worker_thread_queue(). + * + * FIXME: It may speed things up in future to have one worker thread *per* + * `FlatpakInstallation`, all operating in parallel. + */ + +#include + +#include +#include +#include + +#include "gs-appstream.h" +#include "gs-flatpak-app.h" +#include "gs-flatpak.h" +#include "gs-flatpak-transaction.h" +#include "gs-flatpak-utils.h" +#include "gs-metered.h" +#include "gs-profiler.h" +#include "gs-worker-thread.h" + +#include "gs-plugin-flatpak.h" + +/* Timeout for pure of unused refs: + * - A timer checks every 2h + * - If the plugin is enabled, and unused refs have not yet been + * removed (successfully or not) in the last 24h, then `flatpak-purge-timestamp` + * is updated and a purge operation is started + * - Timeout callbacks are ignored until another 24h has passed + */ +#define PURGE_TIMEOUT_SECONDS (60 * 60 * 2) + +struct _GsPluginFlatpak +{ + GsPlugin parent; + + GsWorkerThread *worker; /* (owned) */ + + GPtrArray *installations; /* (element-type GsFlatpak) (owned); may be NULL before setup or after shutdown */ + gboolean has_system_helper; + const gchar *destdir_for_tests; + + GCancellable *purge_cancellable; + guint purge_timeout_id; + + GPtrArray *cache_files_to_delete; /* (element-type GFile) (nullable) */ +}; + +G_DEFINE_TYPE (GsPluginFlatpak, gs_plugin_flatpak, GS_TYPE_PLUGIN) + +#define assert_in_worker(self) \ + g_assert (gs_worker_thread_is_in_worker_context (self->worker)) + +/* Work around flatpak_transaction_get_no_interaction() not existing before + * flatpak 1.13.0. */ +#if !FLATPAK_CHECK_VERSION(1,13,0) +#define flatpak_transaction_get_no_interaction(transaction) \ + GPOINTER_TO_INT (g_object_get_data (G_OBJECT (transaction), "flatpak-no-interaction")) +#define flatpak_transaction_set_no_interaction(transaction, no_interaction) \ + G_STMT_START { \ + FlatpakTransaction *ftsni_transaction = (transaction); \ + gboolean ftsni_no_interaction = (no_interaction); \ + (flatpak_transaction_set_no_interaction) (ftsni_transaction, ftsni_no_interaction); \ + g_object_set_data (G_OBJECT (ftsni_transaction), "flatpak-no-interaction", GINT_TO_POINTER (ftsni_no_interaction)); \ + } G_STMT_END +#endif /* flatpak < 1.13.0 */ + +static void +gs_plugin_flatpak_dispose (GObject *object) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (object); + + g_assert (self->cache_files_to_delete == NULL || self->cache_files_to_delete->len == 0); + g_clear_pointer (&self->cache_files_to_delete, g_ptr_array_unref); + + g_cancellable_cancel (self->purge_cancellable); + g_assert (self->purge_timeout_id == 0); + + g_clear_pointer (&self->installations, g_ptr_array_unref); + g_clear_object (&self->purge_cancellable); + g_clear_object (&self->worker); + + G_OBJECT_CLASS (gs_plugin_flatpak_parent_class)->dispose (object); +} + +static void +gs_plugin_flatpak_init (GsPluginFlatpak *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + self->installations = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + + /* getting app properties from appstream is quicker */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + + /* like appstream, we need the icon plugin to load cached icons into pixbufs */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "icons"); + + /* prioritize over packages */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_BETTER_THAN, "packagekit"); + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_BETTER_THAN, "rpm-ostree"); + + /* set name of MetaInfo file */ + gs_plugin_set_appstream_id (plugin, "org.gnome.Software.Plugin.Flatpak"); + + /* used for self tests */ + self->destdir_for_tests = g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR"); +} + +/* Run in @worker. */ +static void +gs_plugin_flatpak_purge_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GPtrArray *flatpaks = task_data; + + assert_in_worker (self); + + for (guint i = 0; i < flatpaks->len; i++) { + g_autoptr(GError) local_error = NULL; + GsFlatpak *flatpak = g_ptr_array_index (flatpaks, i); + + if (!gs_flatpak_purge_sync (flatpak, cancellable, &local_error)) { + gs_flatpak_error_convert (&local_error); + g_debug ("Failed to purge unused refs at '%s': %s", + gs_flatpak_get_id (flatpak), local_error->message); + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_purge_timeout_cb (gpointer user_data) +{ + GsPluginFlatpak *self = user_data; + if (gs_plugin_get_enabled (GS_PLUGIN (self))) { + g_autoptr(GSettings) settings = g_settings_new ("org.gnome.software"); + gint64 current_time = g_get_real_time () / G_USEC_PER_SEC; + if ((current_time / (60 * 60 * 24)) != (g_settings_get_int64 (settings, "flatpak-purge-timestamp") / (60 * 60 * 24))) { + g_autoptr(GPtrArray) flatpaks = g_ptr_array_new_with_free_func (g_object_unref); + g_settings_set_int64 (settings, "flatpak-purge-timestamp", current_time); + g_cancellable_cancel (self->purge_cancellable); + g_clear_object (&self->purge_cancellable); + self->purge_cancellable = g_cancellable_new (); + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + if (gs_flatpak_get_busy (flatpak)) { + g_debug ("Skipping '%s' in this round, it's busy right now", gs_flatpak_get_id (flatpak)); + continue; + } + g_ptr_array_add (flatpaks, g_object_ref (flatpak)); + } + if (flatpaks->len > 0) { + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, self->purge_cancellable, NULL, NULL); + g_task_set_source_tag (task, gs_plugin_flatpak_purge_timeout_cb); + g_task_set_task_data (task, g_steal_pointer (&flatpaks), (GDestroyNotify) g_ptr_array_unref); + + gs_worker_thread_queue (self->worker, G_PRIORITY_LOW, + gs_plugin_flatpak_purge_thread_cb, g_steal_pointer (&task)); + } + } + } else { + self->purge_timeout_id = 0; + return G_SOURCE_REMOVE; + } + return G_SOURCE_CONTINUE; +} + +static gboolean +_as_component_scope_is_compatible (AsComponentScope scope1, AsComponentScope scope2) +{ + if (scope1 == AS_COMPONENT_SCOPE_UNKNOWN) + return TRUE; + if (scope2 == AS_COMPONENT_SCOPE_UNKNOWN) + return TRUE; + return scope1 == scope2; +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app) +{ + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_FLATPAK) + gs_app_set_management_plugin (app, plugin); +} + +static gboolean +gs_plugin_flatpak_add_installation (GsPluginFlatpak *self, + FlatpakInstallation *installation, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsFlatpak) flatpak = NULL; + + /* create and set up */ + flatpak = gs_flatpak_new (GS_PLUGIN (self), installation, GS_FLATPAK_FLAG_NONE); + if (!gs_flatpak_setup (flatpak, cancellable, error)) + return FALSE; + g_debug ("successfully set up %s", gs_flatpak_get_id (flatpak)); + + /* add objects that set up correctly */ + g_ptr_array_add (self->installations, g_steal_pointer (&flatpak)); + return TRUE; +} + +static void +gs_plugin_flatpak_report_warning (GsPlugin *plugin, + GError **error) +{ + g_autoptr(GsPluginEvent) event = NULL; + g_assert (error != NULL); + if (*error != NULL && (*error)->domain != GS_PLUGIN_ERROR) + gs_flatpak_error_convert (error); + + event = gs_plugin_event_new ("error", *error, + NULL); + gs_plugin_event_add_flag (event, + GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (plugin, event); +} + +static gint +get_priority_for_interactivity (gboolean interactive) +{ + return interactive ? G_PRIORITY_DEFAULT : G_PRIORITY_LOW; +} + +static void setup_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + + g_debug ("Flatpak version: %d.%d.%d", + FLATPAK_MAJOR_VERSION, + FLATPAK_MINOR_VERSION, + FLATPAK_MICRO_VERSION); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_setup_async); + + /* Shouldn’t end up setting up twice */ + g_assert (self->installations == NULL || self->installations->len == 0); + + /* Start up a worker thread to process all the plugin’s function calls. */ + self->worker = gs_worker_thread_new ("gs-plugin-flatpak"); + + /* Queue a job to find and set up the installations. */ + gs_worker_thread_queue (self->worker, G_PRIORITY_DEFAULT, + setup_thread_cb, g_steal_pointer (&task)); + + if (!self->purge_timeout_id) + self->purge_timeout_id = g_timeout_add_seconds (PURGE_TIMEOUT_SECONDS, + gs_plugin_flatpak_purge_timeout_cb, + self); +} + +/* Run in @worker. */ +static void +setup_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPlugin *plugin = GS_PLUGIN (self); + g_autoptr(GPtrArray) installations = NULL; + const gchar *action_id = "org.freedesktop.Flatpak.appstream-update"; + g_autoptr(GError) permission_error = NULL; + g_autoptr(GPermission) permission = NULL; + + assert_in_worker (self); + + /* if we can't update the AppStream database system-wide don't even + * pull the data as we can't do anything with it */ + permission = gs_utils_get_permission (action_id, NULL, &permission_error); + if (permission == NULL) { + g_debug ("no permission for %s: %s", action_id, permission_error->message); + g_clear_error (&permission_error); + } else { + self->has_system_helper = g_permission_get_allowed (permission) || + g_permission_get_can_acquire (permission); + } + + /* if we're not just running the tests */ + if (self->destdir_for_tests == NULL) { + g_autoptr(GError) error_local = NULL; + g_autoptr(FlatpakInstallation) installation = NULL; + + /* include the system installations */ + if (self->has_system_helper) { + installations = flatpak_get_system_installations (cancellable, + &error_local); + + if (installations == NULL) { + gs_plugin_flatpak_report_warning (plugin, &error_local); + g_clear_error (&error_local); + } + } + + /* include the user installation */ + installation = flatpak_installation_new_user (cancellable, + &error_local); + if (installation == NULL) { + /* if some error happened, report it as an event, but + * do not return it, otherwise it will disable the whole + * plugin (meaning that support for Flatpak will not be + * possible even if a system installation is working) */ + gs_plugin_flatpak_report_warning (plugin, &error_local); + } else { + if (installations == NULL) + installations = g_ptr_array_new_with_free_func (g_object_unref); + + g_ptr_array_add (installations, g_steal_pointer (&installation)); + } + } else { + g_autoptr(GError) error_local = NULL; + + /* use the test installation */ + g_autofree gchar *full_path = g_build_filename (self->destdir_for_tests, + "flatpak", + NULL); + g_autoptr(GFile) file = g_file_new_for_path (full_path); + g_autoptr(FlatpakInstallation) installation = NULL; + g_debug ("using custom flatpak path %s", full_path); + installation = flatpak_installation_new_for_path (file, TRUE, + cancellable, + &error_local); + if (installation == NULL) { + gs_flatpak_error_convert (&error_local); + g_task_return_error (task, g_steal_pointer (&error_local)); + return; + } + + installations = g_ptr_array_new_with_free_func (g_object_unref); + g_ptr_array_add (installations, g_steal_pointer (&installation)); + } + + /* add the installations */ + for (guint i = 0; installations != NULL && i < installations->len; i++) { + g_autoptr(GError) error_local = NULL; + + FlatpakInstallation *installation = g_ptr_array_index (installations, i); + if (!gs_plugin_flatpak_add_installation (self, + installation, + cancellable, + &error_local)) { + gs_plugin_flatpak_report_warning (plugin, + &error_local); + continue; + } + } + + /* when no installation has been loaded, return the error so the + * plugin gets disabled */ + if (self->installations->len == 0) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + "Failed to load any Flatpak installations"); + return; + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_flatpak_shutdown_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + + g_clear_handle_id (&self->purge_timeout_id, g_source_remove); + g_cancellable_cancel (self->purge_cancellable); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_shutdown_async); + + /* Delete any cache files from this session. This should not really + * block, as they’re all local. */ + for (guint i = 0; self->cache_files_to_delete != NULL && i < self->cache_files_to_delete->len; i++) { + GFile *cache_file = g_ptr_array_index (self->cache_files_to_delete, i); + + g_file_delete (cache_file, NULL, NULL); + } + + g_clear_pointer (&self->cache_files_to_delete, g_ptr_array_unref); + + /* Stop the worker thread. */ + gs_worker_thread_shutdown_async (self->worker, cancellable, shutdown_cb, g_steal_pointer (&task)); +} + +static void +shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginFlatpak *self = g_task_get_source_object (task); + g_autoptr(GsWorkerThread) worker = NULL; + g_autoptr(GError) local_error = NULL; + + worker = g_steal_pointer (&self->worker); + + if (!gs_worker_thread_shutdown_finish (worker, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Clear the flatpak installations */ + g_ptr_array_set_size (self->installations, 0); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_shutdown_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void refresh_metadata_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_refresh_metadata_async); + g_task_set_task_data (task, gs_plugin_refresh_metadata_data_new (cache_age_secs, flags), (GDestroyNotify) gs_plugin_refresh_metadata_data_free); + + /* Queue a job to get the installed apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refresh_metadata_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +refresh_metadata_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPluginRefreshMetadataData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE); + + assert_in_worker (self); + + for (guint i = 0; i < self->installations->len; i++) { + g_autoptr(GError) local_error = NULL; + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + + if (!gs_flatpak_refresh (flatpak, data->cache_age_secs, interactive, cancellable, &local_error)) + g_debug ("Failed to refresh metadata for '%s': %s", gs_flatpak_get_id (flatpak), local_error->message); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static GsFlatpak * +gs_plugin_flatpak_get_handler (GsPluginFlatpak *self, + GsApp *app) +{ + const gchar *object_id; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + return NULL; + + /* specified an explicit name */ + object_id = gs_flatpak_app_get_object_id (app); + if (object_id != NULL) { + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + if (g_strcmp0 (gs_flatpak_get_id (flatpak), object_id) == 0) + return flatpak; + } + } + + /* find a scope that matches */ + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + if (_as_component_scope_is_compatible (gs_flatpak_get_scope (flatpak), + gs_app_get_scope (app))) + return flatpak; + } + return NULL; +} + +static gboolean +gs_plugin_flatpak_refine_app (GsPluginFlatpak *self, + GsApp *app, + GsPluginRefineFlags flags, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + GsFlatpak *flatpak = NULL; + + /* not us */ + if (gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_FLATPAK) { + g_debug ("%s not a package, ignoring", gs_app_get_unique_id (app)); + return TRUE; + } + + /* we have to look for the app in all GsFlatpak stores */ + if (gs_app_get_scope (app) == AS_COMPONENT_SCOPE_UNKNOWN) { + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak_tmp = g_ptr_array_index (self->installations, i); + g_autoptr(GError) error_local = NULL; + if (gs_flatpak_refine_app_state (flatpak_tmp, app, interactive, FALSE, + cancellable, &error_local)) { + flatpak = flatpak_tmp; + break; + } else { + g_debug ("%s", error_local->message); + } + } + } else { + flatpak = gs_plugin_flatpak_get_handler (self, app); + } + if (flatpak == NULL) + return TRUE; + return gs_flatpak_refine_app (flatpak, app, flags, interactive, FALSE, cancellable, error); +} + +static void +unref_nonnull_hash_table (gpointer ptr) +{ + GHashTable *hash_table = ptr; + if (hash_table != NULL) + g_hash_table_unref (hash_table); +} + +static gboolean +refine_app (GsPluginFlatpak *self, + GsApp *app, + GsPluginRefineFlags flags, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + GS_PROFILER_BEGIN_SCOPED (FlatpakRefineApp, "Flatpak (refine app)", NULL); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + return TRUE; + + /* get the runtime first */ + if (!gs_plugin_flatpak_refine_app (self, app, flags, interactive, cancellable, error)) + return FALSE; + + GS_PROFILER_END_SCOPED (FlatpakRefineApp); + + /* the runtime might be installed in a different scope */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME) { + GsApp *runtime = gs_app_get_runtime (app); + if (runtime != NULL) { + GS_PROFILER_BEGIN_SCOPED (FlatpakRefineAppRuntime, "Flatpak (refine runtime)", NULL); + + if (!gs_plugin_flatpak_refine_app (self, runtime, + flags, + interactive, + cancellable, + error)) { + return FALSE; + } + + GS_PROFILER_END_SCOPED (FlatpakRefineAppRuntime); + } + } + return TRUE; +} + +static void refine_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE); + + task = gs_plugin_refine_data_new_task (plugin, list, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_refine_async); + + /* Queue a job to refine the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refine_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +refine_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPluginRefineData *data = task_data; + GsAppList *list = data->list; + GsPluginRefineFlags flags = data->flags; + gboolean interactive = gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE); + g_autoptr(GPtrArray) array_components_by_id = NULL; /* (element-type GHashTable) */ + g_autoptr(GPtrArray) array_components_by_bundle = NULL; /* (element-type GHashTable) */ + g_autoptr(GsAppList) app_list = NULL; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (!refine_app (self, app, flags, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + /* Refine wildcards. + * + * Use a copy of the list for the loop because a function called + * on the plugin may affect the list which can lead to problems + * (e.g. inserting an app in the list on every call results in + * an infinite loop) */ + app_list = gs_app_list_copy (list); + array_components_by_id = g_ptr_array_new_full (self->installations->len, unref_nonnull_hash_table); + g_ptr_array_set_size (array_components_by_id, self->installations->len); + array_components_by_bundle = g_ptr_array_new_full (self->installations->len, unref_nonnull_hash_table); + g_ptr_array_set_size (array_components_by_bundle, self->installations->len); + + for (guint j = 0; j < gs_app_list_length (app_list); j++) { + GsApp *app = gs_app_list_index (app_list, j); + + if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + GHashTable *components_by_id = array_components_by_id->pdata[i]; + GHashTable *components_by_bundle = array_components_by_bundle->pdata[i]; + + if (!gs_flatpak_refine_wildcard (flatpak, app, list, flags, interactive, &components_by_id, &components_by_bundle, + cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + array_components_by_id->pdata[i] = components_by_id; + array_components_by_bundle->pdata[i] = components_by_bundle; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* Run in @worker. */ +static void +launch_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPluginLaunchData *data = task_data; + GsFlatpak *flatpak; + g_autoptr(GError) local_error = NULL; + gboolean interactive = (data->flags & GS_PLUGIN_LAUNCH_FLAGS_INTERACTIVE) != 0; + + assert_in_worker (self); + + flatpak = gs_plugin_flatpak_get_handler (self, data->app); + if (flatpak == NULL) { + g_task_return_boolean (task, TRUE); + return; + } + + if (gs_flatpak_launch (flatpak, data->app, interactive, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static void +gs_plugin_flatpak_launch_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_LAUNCH_FLAGS_INTERACTIVE) != 0; + + task = gs_plugin_launch_data_new_task (plugin, app, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_launch_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* Queue a job to launch the app. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + launch_thread_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_flatpak_launch_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* ref full */ +static GsApp * +gs_plugin_flatpak_find_app_by_ref (GsPluginFlatpak *self, + const gchar *ref, + gboolean interactive, + GsApp *alternate_of, + GCancellable *cancellable, + GError **error) +{ + g_debug ("finding ref %s", ref); + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak_tmp = g_ptr_array_index (self->installations, i); + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error_local = NULL; + + app = gs_flatpak_ref_to_app (flatpak_tmp, ref, interactive, cancellable, &error_local); + if (app == NULL) { + g_debug ("%s", error_local->message); + continue; + } + if (alternate_of != NULL && alternate_of == app) { + g_debug ("skipping ref=%s->%s, due to being alternate_of", ref, gs_app_get_unique_id (app)); + continue; + } + g_debug ("found ref=%s->%s", ref, gs_app_get_unique_id (app)); + return g_steal_pointer (&app); + } + return NULL; +} + +/* ref full */ +static GsApp * +_ref_to_app (FlatpakTransaction *transaction, + const gchar *ref, + GsPluginFlatpak *self) +{ + g_return_val_if_fail (GS_IS_FLATPAK_TRANSACTION (transaction), NULL); + g_return_val_if_fail (ref != NULL, NULL); + g_return_val_if_fail (GS_IS_PLUGIN_FLATPAK (self), NULL); + + /* search through each GsFlatpak */ + return gs_plugin_flatpak_find_app_by_ref (self, ref, + gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE), + NULL, NULL, NULL); +} + +static void +_group_apps_by_installation_recurse (GsPluginFlatpak *self, + GsAppList *list, + GHashTable *applist_by_flatpaks) +{ + if (!list) + return; + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + GsFlatpak *flatpak = gs_plugin_flatpak_get_handler (self, app); + if (flatpak != NULL) { + GsAppList *list_tmp = g_hash_table_lookup (applist_by_flatpaks, flatpak); + GsAppList *related_list; + if (list_tmp == NULL) { + list_tmp = gs_app_list_new (); + g_hash_table_insert (applist_by_flatpaks, + g_object_ref (flatpak), + list_tmp); + } + gs_app_list_add (list_tmp, app); + + /* Add also related apps, which can be those recognized for update, + while the 'app' is already up to date. */ + related_list = gs_app_get_related (app); + _group_apps_by_installation_recurse (self, related_list, applist_by_flatpaks); + } + } +} + +/* + * Returns: (transfer full) (element-type GsFlatpak GsAppList): + * a map from GsFlatpak to non-empty lists of apps from @list associated + * with that installation. + */ +static GHashTable * +_group_apps_by_installation (GsPluginFlatpak *self, + GsAppList *list) +{ + g_autoptr(GHashTable) applist_by_flatpaks = NULL; + + /* list of apps to be handled by each flatpak installation */ + applist_by_flatpaks = g_hash_table_new_full (g_direct_hash, g_direct_equal, + (GDestroyNotify) g_object_unref, + (GDestroyNotify) g_object_unref); + + /* put each app into the correct per-GsFlatpak list */ + _group_apps_by_installation_recurse (self, list, applist_by_flatpaks); + + return g_steal_pointer (&applist_by_flatpaks); +} + +typedef struct { + FlatpakTransaction *transaction; + guint id; +} BasicAuthData; + +static void +basic_auth_data_free (BasicAuthData *data) +{ + g_object_unref (data->transaction); + g_slice_free (BasicAuthData, data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(BasicAuthData, basic_auth_data_free) + +static void +_basic_auth_cb (const gchar *user, const gchar *password, gpointer user_data) +{ + g_autoptr(BasicAuthData) data = user_data; + + g_debug ("Submitting basic auth data"); + + /* NULL user aborts the basic auth request */ + flatpak_transaction_complete_basic_auth (data->transaction, data->id, user, password, NULL /* options */); +} + +static gboolean +_basic_auth_start (FlatpakTransaction *transaction, + const char *remote, + const char *realm, + GVariant *options, + guint id, + GsPlugin *plugin) +{ + BasicAuthData *data; + + if (flatpak_transaction_get_no_interaction (transaction)) + return FALSE; + + data = g_slice_new0 (BasicAuthData); + data->transaction = g_object_ref (transaction); + data->id = id; + + g_debug ("Login required remote %s (realm %s)\n", remote, realm); + gs_plugin_basic_auth_start (plugin, remote, realm, G_CALLBACK (_basic_auth_cb), data); + return TRUE; +} + +static gboolean +_webflow_start (FlatpakTransaction *transaction, + const char *remote, + const char *url, + GVariant *options, + guint id, + GsPlugin *plugin) +{ + const char *browser; + g_autoptr(GError) error_local = NULL; + + if (flatpak_transaction_get_no_interaction (transaction)) + return FALSE; + + g_debug ("Authentication required for remote '%s'", remote); + + /* Allow hard overrides with $BROWSER */ + browser = g_getenv ("BROWSER"); + if (browser != NULL) { + const char *args[3] = { NULL, url, NULL }; + args[0] = browser; + if (!g_spawn_async (NULL, (char **)args, NULL, G_SPAWN_SEARCH_PATH, + NULL, NULL, NULL, &error_local)) { + g_autoptr(GsPluginEvent) event = NULL; + + g_warning ("Failed to start browser %s: %s", browser, error_local->message); + + gs_flatpak_error_convert (&error_local); + + event = gs_plugin_event_new ("error", error_local, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (plugin, event); + + return FALSE; + } + } else { + if (!g_app_info_launch_default_for_uri (url, NULL, &error_local)) { + g_autoptr(GsPluginEvent) event = NULL; + + g_warning ("Failed to show url: %s", error_local->message); + + gs_flatpak_error_convert (&error_local); + + event = gs_plugin_event_new ("error", error_local, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (plugin, event); + + return FALSE; + } + } + + g_debug ("Waiting for browser..."); + + return TRUE; +} + +static void +_webflow_done (FlatpakTransaction *transaction, + GVariant *options, + guint id, + GsPlugin *plugin) +{ + g_debug ("Browser done"); +} + +/* This can only fail if flatpak_dir_ensure_repo() fails, for example if the + * repo is configured but doesn’t exist and can’t be created on disk. */ +static FlatpakTransaction * +_build_transaction (GsPlugin *plugin, + GsFlatpak *flatpak, + gboolean stop_on_first_error, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + FlatpakInstallation *installation; + g_autoptr(FlatpakInstallation) installation_clone = NULL; + g_autoptr(FlatpakTransaction) transaction = NULL; + + installation = gs_flatpak_get_installation (flatpak, interactive); + + installation_clone = g_object_ref (installation); + + /* create transaction */ + transaction = gs_flatpak_transaction_new (installation_clone, stop_on_first_error, cancellable, error); + if (transaction == NULL) { + g_prefix_error (error, "failed to build transaction: "); + gs_flatpak_error_convert (error); + return NULL; + } + + /* Let flatpak know if it is a background operation */ + flatpak_transaction_set_no_interaction (transaction, !interactive); + + /* connect up signals */ + g_signal_connect (transaction, "ref-to-app", + G_CALLBACK (_ref_to_app), plugin); + g_signal_connect (transaction, "basic-auth-start", + G_CALLBACK (_basic_auth_start), plugin); + g_signal_connect (transaction, "webflow-start", + G_CALLBACK (_webflow_start), plugin); + g_signal_connect (transaction, "webflow-done", + G_CALLBACK (_webflow_done), plugin); + + /* use system installations as dependency sources for user installations */ + flatpak_transaction_add_default_dependency_sources (transaction); + + return g_steal_pointer (&transaction); +} + +static void +remove_schedule_entry (gpointer schedule_entry_handle) +{ + g_autoptr(GError) error_local = NULL; + + if (!gs_metered_remove_from_download_scheduler (schedule_entry_handle, NULL, &error_local)) + g_warning ("Failed to remove schedule entry: %s", error_local->message); +} + +static void update_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_update_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_update_apps_data_new_task (plugin, apps, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_update_apps_async); + + /* Queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + update_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +update_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPluginUpdateAppsData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + g_autoptr(GHashTable) applist_by_flatpaks = NULL; + GHashTableIter iter; + gpointer key, value; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + /* Mark all the apps as pending installation. While the op/progress + * handling code in #GsFlatpakTransaction does this more accurately and + * in more detail, we need to pre-emptively do it here, since multiple + * transactions are run sequentially below. That means that all the apps + * from the 2nd, 3rd, etc. transactions will not have their state + * updated until that transaction is prepared. That’s a long time for + * the apps to look like they’ve been left out of the update in the UI. */ + applist_by_flatpaks = _group_apps_by_installation (self, data->apps); + + g_hash_table_iter_init (&iter, applist_by_flatpaks); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GsAppList *apps_for_installation = GS_APP_LIST (value); + + for (guint i = 0; i < gs_app_list_length (apps_for_installation); i++) { + GsApp *app = gs_app_list_index (apps_for_installation, i); + + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + } + } + + /* build and run transaction for each flatpak installation */ + g_hash_table_iter_init (&iter, applist_by_flatpaks); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GsFlatpak *flatpak = GS_FLATPAK (key); + GsAppList *list_tmp = GS_APP_LIST (value); + g_autoptr(FlatpakTransaction) transaction = NULL; + gpointer schedule_entry_handle = NULL; + + g_assert (GS_IS_FLATPAK (flatpak)); + g_assert (list_tmp != NULL); + g_assert (gs_app_list_length (list_tmp) > 0); + + if (!interactive) { + if (!gs_metered_block_app_list_on_download_scheduler (list_tmp, &schedule_entry_handle, cancellable, &local_error)) { + g_warning ("Failed to block on download scheduler: %s", + local_error->message); + g_clear_error (&local_error); + } + } + + /* Now apply the updates. */ + gs_flatpak_set_busy (flatpak, TRUE); + + /* Build and run transaction. Pass %FALSE to stop_on_first_error + * so that the transaction continues past the first fatal error + * in an attempt to try and update as many apps as possible. + * + * Internally, `FlatpakTransaction` uses `op->fail_if_op_fails` + * and `op->non_fatal` to track the relationships between ops + * (such as updating an app and its runtime, or add-ons and + * their app). If, for example, updating a runtime fails, the + * ops to update apps which use that runtime will automatically + * be skipped and will fail with `FLATPAK_ERROR_SKIPPED`. + * + * %GS_FLATPAK_ERROR_MODE_IGNORE_ERRORS does not ignore + * `FLATPAK_ERROR_SKIPPED` errors, so this will not cause + * corruption of the transaction. + * + * This approach is the same as what the `flatpak` CLI uses in + * `flatpak-builtins-update.c` in flatpak. + */ + transaction = _build_transaction (GS_PLUGIN (self), flatpak, GS_FLATPAK_ERROR_MODE_IGNORE_ERRORS, interactive, cancellable, &local_error); + if (transaction == NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + /* Reset the state of all the apps in this transaction. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + gs_app_set_state_recover (app); + } + + /* This can only fail if the repo doesn’t exist and can’t + * be created, which is unlikely. */ + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + remove_schedule_entry (schedule_entry_handle); + gs_flatpak_set_busy (flatpak, FALSE); + + continue; + } + + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + g_autofree gchar *ref = NULL; + + ref = gs_flatpak_app_get_ref_display (app); + if (flatpak_transaction_add_update (transaction, ref, NULL, NULL, &local_error)) { + /* add to the transaction cache for quick look up -- other unrelated + * refs will be matched using gs_plugin_flatpak_find_app_by_ref() */ + gs_flatpak_transaction_add_app (transaction, app); + + continue; + } + + /* Errors are not fatal, as otherwise a single app + * failure will take down the whole update, blocking + * updates for all other apps. + * + * The common two errors to see here are + * - FLATPAK_ERROR_REMOTE_NOT_FOUND + * - FLATPAK_ERROR_NOT_INSTALLED + */ + { + g_autoptr(GsPluginEvent) event = NULL; + + g_warning ("Skipping update for ‘%s’: %s", ref, local_error->message); + + /* Reset the state of the app. */ + gs_app_set_state_recover (app); + + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + continue; + } + } + + /* automatically clean up unused EOL runtimes when updating */ + flatpak_transaction_set_include_unused_uninstall_ops (transaction, TRUE); + + /* FIXME: Link progress reporting from #FlatpakTransaction + * up to `data->progress_callback`. */ + if (!gs_flatpak_transaction_run (transaction, cancellable, &local_error)) { + g_autoptr(GsPluginEvent) event = NULL; + g_autoptr(GError) prune_error = NULL; + + /* Reset the state of all the apps in this transaction. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + gs_app_set_state_recover (app); + } + + /* Try pruning the repo, just in case this is a failure + * caused by running out of disk space. The transaction + * typically won’t try this itself, and will only prune + * on success (if it knows an update has potentially + * left dangling objects). */ + if (!flatpak_installation_prune_local_repo (gs_flatpak_get_installation (flatpak, interactive), + NULL, &prune_error)) { + gs_flatpak_error_convert (&prune_error); + g_warning ("Error pruning flatpak repo for %s after failed update: %s", + gs_flatpak_get_id (flatpak), prune_error->message); + } + + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + remove_schedule_entry (schedule_entry_handle); + gs_flatpak_set_busy (flatpak, FALSE); + + continue; + } + + remove_schedule_entry (schedule_entry_handle); + gs_plugin_updates_changed (GS_PLUGIN (self)); + + /* Get any new state. Ignore failure and fall through to + * refining the apps, since refreshing is not an entirely + * necessary part of the update operation. */ + if (!gs_flatpak_refresh (flatpak, G_MAXUINT, interactive, cancellable, &local_error)) { + gs_flatpak_error_convert (&local_error); + g_warning ("Error refreshing flatpak data for ‘%s’ after update: %s", + gs_flatpak_get_id (flatpak), local_error->message); + g_clear_error (&local_error); + } + + /* Refine all the updated apps to make sure they’re up to date + * in the UI. Ignore failure since it’s not an entirely + * necessary part of the update operation. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + g_autofree gchar *ref = NULL; + + ref = gs_flatpak_app_get_ref_display (app); + if (!gs_flatpak_refine_app (flatpak, app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME, + interactive, TRUE, + cancellable, &local_error)) { + gs_flatpak_error_convert (&local_error); + g_warning ("Error refining app ‘%s’ after update: %s", ref, local_error->message); + g_clear_error (&local_error); + continue; + } + } + + gs_flatpak_set_busy (flatpak, FALSE); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_update_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_flatpak_cover_addons_in_transaction (GsPlugin *plugin, + FlatpakTransaction *transaction, + GsApp *parent_app, + GsAppState state) +{ + g_autoptr(GsAppList) addons = NULL; + g_autoptr(GString) errors = NULL; + guint ii, sz; + + g_return_if_fail (transaction != NULL); + g_return_if_fail (GS_IS_APP (parent_app)); + + addons = gs_app_dup_addons (parent_app); + sz = addons ? gs_app_list_length (addons) : 0; + + for (ii = 0; ii < sz; ii++) { + GsApp *addon = gs_app_list_index (addons, ii); + g_autoptr(GError) local_error = NULL; + + if (state == GS_APP_STATE_INSTALLING && gs_app_get_to_be_installed (addon)) { + g_autofree gchar *ref = NULL; + + ref = gs_flatpak_app_get_ref_display (addon); + if (flatpak_transaction_add_install (transaction, gs_app_get_origin (addon), ref, NULL, &local_error)) { + gs_app_set_state (addon, state); + } else { + if (errors) + g_string_append_c (errors, '\n'); + else + errors = g_string_new (NULL); + g_string_append_printf (errors, _("Failed to add to install for addon ‘%s’: %s"), + gs_app_get_name (addon), local_error->message); + } + } else if (state == GS_APP_STATE_REMOVING && gs_app_get_state (addon) == GS_APP_STATE_INSTALLED) { + g_autofree gchar *ref = NULL; + + ref = gs_flatpak_app_get_ref_display (addon); + if (flatpak_transaction_add_uninstall (transaction, ref, &local_error)) { + gs_app_set_state (addon, state); + } else { + if (errors) + g_string_append_c (errors, '\n'); + else + errors = g_string_new (NULL); + g_string_append_printf (errors, _("Failed to add to uninstall for addon ‘%s’: %s"), + gs_app_get_name (addon), local_error->message); + } + } + } + + if (errors) { + g_autoptr(GsPluginEvent) event = NULL; + g_autoptr(GError) error_local = g_error_new_literal (GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + errors->str); + + event = gs_plugin_event_new ("error", error_local, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (plugin, event); + } +} + +static void uninstall_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_uninstall_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_uninstall_apps_data_new_task (plugin, apps, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_uninstall_apps_async); + + /* Queue a job to uninstall the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + uninstall_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +uninstall_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPlugin *plugin = GS_PLUGIN (self); + GsPluginUninstallAppsData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GHashTable) applist_by_flatpaks = NULL; + GHashTableIter iter; + gpointer key, value; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + /* Mark all the apps as pending uninstallation. While the op/progress + * handling code in #GsFlatpakTransaction does this more accurately and + * in more detail, we need to pre-emptively do it here, since multiple + * transactions are run sequentially below. That means that all the apps + * from the 2nd, 3rd, etc. transactions will not have their state + * updated until that transaction is prepared. That’s a long time for + * the apps to look like they’ve been left out of the uninstall in the UI. */ + applist_by_flatpaks = _group_apps_by_installation (self, data->apps); + + g_hash_table_iter_init (&iter, applist_by_flatpaks); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GsAppList *apps_for_installation = GS_APP_LIST (value); + + for (guint i = 0; i < gs_app_list_length (apps_for_installation); i++) { + GsApp *app = gs_app_list_index (apps_for_installation, i); + + gs_app_set_state (app, GS_APP_STATE_REMOVING); + } + } + + /* build and run transaction for each flatpak installation */ + g_hash_table_iter_init (&iter, applist_by_flatpaks); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GsFlatpak *flatpak = GS_FLATPAK (key); + GsAppList *list_tmp = GS_APP_LIST (value); + g_autoptr(FlatpakTransaction) transaction = NULL; + + g_assert (GS_IS_FLATPAK (flatpak)); + g_assert (list_tmp != NULL); + g_assert (gs_app_list_length (list_tmp) > 0); + + gs_flatpak_set_busy (flatpak, TRUE); + + /* build */ + transaction = _build_transaction (plugin, flatpak, GS_FLATPAK_ERROR_MODE_STOP_ON_FIRST_ERROR, interactive, cancellable, &local_error); + if (transaction == NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + /* Reset the state of all the apps in this transaction. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + gs_app_set_state_recover (app); + } + + /* This can only fail if the repo doesn’t exist and can’t + * be created, which is unlikely. */ + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + gs_flatpak_set_busy (flatpak, FALSE); + + continue; + } + + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + g_autofree char *ref = NULL; + + /* not supported */ + if (gs_plugin_flatpak_get_handler (self, app) == NULL) + continue; + + /* is a source, handled by dedicated function */ + g_assert (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY); + + /* add to the transaction cache for quick look up -- other unrelated + * refs will be matched using gs_plugin_flatpak_find_app_by_ref() */ + gs_flatpak_transaction_add_app (transaction, app); + + /* add to the transaction */ + ref = gs_flatpak_app_get_ref_display (app); + + if (!flatpak_transaction_add_uninstall (transaction, ref, &local_error)) { + /* Somehow, the app might already be uninstalled. */ + if (g_error_matches (local_error, FLATPAK_ERROR, + FLATPAK_ERROR_NOT_INSTALLED)) { + g_clear_error (&local_error); + } + } + + /* Reset state if adding the app to the transaction failed. */ + if (local_error != NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + /* Reset the state of all the apps in this transaction. */ + for (guint j = 0; j < gs_app_list_length (list_tmp); j++) { + GsApp *recover_app = gs_app_list_index (list_tmp, j); + gs_app_set_state_recover (recover_app); + } + + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + gs_flatpak_set_busy (flatpak, FALSE); + + continue; + } + + gs_flatpak_cover_addons_in_transaction (plugin, transaction, app, GS_APP_STATE_REMOVING); + } + + /* run transaction */ + /* FIXME: Link progress reporting from #FlatpakTransaction + * up to `data->progress_callback`. */ + if (!gs_flatpak_transaction_run (transaction, cancellable, &local_error)) { + GsApp *error_app = NULL; + + gs_flatpak_transaction_get_error_operation (GS_FLATPAK_TRANSACTION (transaction), &error_app); + + /* Reset the state of all the apps in this transaction. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + gs_app_set_state_recover (app); + } + + /* Somehow, the app might already be uninstalled. */ + if (g_error_matches (local_error, FLATPAK_ERROR, + FLATPAK_ERROR_NOT_INSTALLED)) { + g_clear_error (&local_error); + + /* Set the app back to UNKNOWN so that refining it gets all the right details. */ + if (error_app != NULL) { + g_debug ("App %s is already uninstalled", gs_app_get_unique_id (error_app)); + gs_app_set_state (error_app, GS_APP_STATE_UNKNOWN); + } + } else { + g_autoptr(GsPluginEvent) event = NULL; + + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + gs_flatpak_set_busy (flatpak, FALSE); + + continue; + } + } + + /* Get any new state. Ignore failure and fall through to + * refining the apps, since refreshing is not an entirely + * necessary part of the uninstall operation. */ + if (!gs_flatpak_refresh (flatpak, G_MAXUINT, interactive, cancellable, &local_error)) { + gs_flatpak_error_convert (&local_error); + g_debug ("Error refreshing flatpak data for ‘%s’ after uninstall: %s", + gs_flatpak_get_id (flatpak), local_error->message); + g_clear_error (&local_error); + } + + /* Refine all the uninstalled apps to make sure they’re up to date + * in the UI. Ignore failure since it’s not an entirely + * necessary part of the uninstall operation. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + g_autofree gchar *ref = NULL; + + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWN, 0); + gs_app_set_size_installed (app, GS_SIZE_TYPE_UNKNOWN, 0); + + ref = gs_flatpak_app_get_ref_display (app); + if (!gs_flatpak_refine_app (flatpak, app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION, + interactive, FALSE, + cancellable, &local_error)) { + gs_flatpak_error_convert (&local_error); + g_debug ("Error refining app ‘%s’ after uninstall: %s", ref, local_error->message); + g_clear_error (&local_error); + continue; + } + + gs_flatpak_refine_addons (flatpak, + app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID, + GS_APP_STATE_REMOVING, + interactive, + cancellable); + } + + gs_flatpak_set_busy (flatpak, FALSE); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_uninstall_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +app_has_local_source (GsApp *app) +{ + const gchar *url = gs_app_get_origin_hostname (app); + + if (gs_flatpak_app_get_file_kind (app) == GS_FLATPAK_APP_FILE_KIND_BUNDLE) + return TRUE; + + if (gs_flatpak_app_get_file_kind (app) == GS_FLATPAK_APP_FILE_KIND_REF && + g_strcmp0 (url, "localhost") == 0) + return TRUE; + + return FALSE; +} + +static void +gs_plugin_flatpak_ensure_scope (GsPlugin *plugin, + GsApp *app) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + + if (gs_app_get_scope (app) == AS_COMPONENT_SCOPE_UNKNOWN) { + g_autoptr(GSettings) settings = g_settings_new ("org.gnome.software"); + + /* get the new GsFlatpak for handling of local files */ + gs_app_set_scope (app, g_settings_get_boolean (settings, "install-bundles-system-wide") ? + AS_COMPONENT_SCOPE_SYSTEM : AS_COMPONENT_SCOPE_USER); + if (!self->has_system_helper) { + g_info ("no flatpak system helper is available, using user"); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_USER); + } + if (self->destdir_for_tests != NULL) { + g_debug ("in self tests, using user"); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_USER); + } + } +} + +static void install_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_install_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_install_apps_data_new_task (plugin, apps, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_install_apps_async); + + /* Queue a job to install the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + install_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +install_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPlugin *plugin = GS_PLUGIN (self); + GsPluginInstallAppsData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GHashTable) applist_by_flatpaks = NULL; + GHashTableIter iter; + gpointer key, value; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + /* Mark all the apps as pending installation. While the op/progress + * handling code in #GsFlatpakTransaction does this more accurately and + * in more detail, we need to pre-emptively do it here, since multiple + * transactions are run sequentially below. That means that all the apps + * from the 2nd, 3rd, etc. transactions will not have their state + * updated until that transaction is prepared. That’s a long time for + * the apps to look like they’ve been left out of the install in the UI. */ + applist_by_flatpaks = _group_apps_by_installation (self, data->apps); + + g_hash_table_iter_init (&iter, applist_by_flatpaks); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GsAppList *apps_for_installation = GS_APP_LIST (value); + + for (guint i = 0; i < gs_app_list_length (apps_for_installation); i++) { + GsApp *app = gs_app_list_index (apps_for_installation, i); + + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + } + } + + /* build and run transaction for each flatpak installation */ + g_hash_table_iter_init (&iter, applist_by_flatpaks); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GsFlatpak *flatpak = GS_FLATPAK (key); + GsAppList *list_tmp = GS_APP_LIST (value); + g_autoptr(FlatpakTransaction) transaction = NULL; + gpointer schedule_entry_handle = NULL; + + g_assert (GS_IS_FLATPAK (flatpak)); + g_assert (list_tmp != NULL); + g_assert (gs_app_list_length (list_tmp) > 0); + + if (!interactive) { + if (!(data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD) && + !gs_metered_block_app_list_on_download_scheduler (list_tmp, &schedule_entry_handle, cancellable, &local_error)) { + g_warning ("Failed to block on download scheduler: %s", + local_error->message); + g_clear_error (&local_error); + } + } + + gs_flatpak_set_busy (flatpak, TRUE); + + /* build */ + transaction = _build_transaction (plugin, flatpak, GS_FLATPAK_ERROR_MODE_STOP_ON_FIRST_ERROR, interactive, cancellable, &local_error); + if (transaction == NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + /* Reset the state of all the apps in this transaction. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + gs_app_set_state_recover (app); + } + + /* This can only fail if the repo doesn’t exist and can’t + * be created, which is unlikely. */ + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + remove_schedule_entry (schedule_entry_handle); + gs_flatpak_set_busy (flatpak, FALSE); + + continue; + } + + /* Apply flags to the transaction. */ + if (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD) + flatpak_transaction_set_no_pull (transaction, TRUE); + if (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY) + flatpak_transaction_set_no_deploy (transaction, TRUE); + + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + + /* queue for install if installation needs the network */ + if (!app_has_local_source (app) && + !gs_plugin_get_network_available (plugin)) { + gs_app_set_state (app, GS_APP_STATE_QUEUED_FOR_INSTALL); + continue; + } + + /* set the app scope */ + gs_plugin_flatpak_ensure_scope (plugin, app); + + /* not supported */ + if (gs_plugin_flatpak_get_handler (self, app) == NULL) + continue; + + /* is a source, handled by dedicated function */ + g_assert (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY); + + /* add to the transaction cache for quick look up -- other unrelated + * refs will be matched using gs_plugin_flatpak_find_app_by_ref() */ + gs_flatpak_transaction_add_app (transaction, app); + + /* add flatpakref */ + if (gs_flatpak_app_get_file_kind (app) == GS_FLATPAK_APP_FILE_KIND_REF) { + GFile *file = gs_app_get_local_file (app); + + if (file == NULL) { + g_set_error (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no local file set for bundle %s", + gs_app_get_unique_id (app)); + } else { + g_autoptr(GBytes) blob = g_file_load_bytes (file, cancellable, NULL, &local_error); + + if (blob != NULL) + flatpak_transaction_add_install_flatpakref (transaction, blob, &local_error); + } + + /* add bundle */ + } else if (gs_flatpak_app_get_file_kind (app) == GS_FLATPAK_APP_FILE_KIND_BUNDLE) { + GFile *file = gs_app_get_local_file (app); + + if (file == NULL) { + g_set_error (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no local file set for bundle %s", + gs_app_get_unique_id (app)); + } else { + flatpak_transaction_add_install_bundle (transaction, file, NULL, &local_error); + } + + /* add normal ref */ + } else { + g_autofree gchar *ref = gs_flatpak_app_get_ref_display (app); + + if (!flatpak_transaction_add_install (transaction, + gs_app_get_origin (app), + ref, NULL, &local_error)) { + /* Somehow, the app might already be installed. */ + if (g_error_matches (local_error, FLATPAK_ERROR, + FLATPAK_ERROR_ALREADY_INSTALLED)) { + g_clear_error (&local_error); + } + } + } + + /* Reset state if adding the app to the transaction failed. */ + if (local_error != NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + /* Reset the state of the failed app */ + gs_app_set_state_recover (app); + + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + + gs_flatpak_cover_addons_in_transaction (plugin, transaction, app, GS_APP_STATE_INSTALLING); + } + + /* run transaction */ + /* FIXME: Link progress reporting from #FlatpakTransaction + * up to `data->progress_callback`. */ + if (!gs_flatpak_transaction_run (transaction, cancellable, &local_error)) { + GsApp *error_app = NULL; + + gs_flatpak_transaction_get_error_operation (GS_FLATPAK_TRANSACTION (transaction), &error_app); + + /* Reset the state of all the apps in this transaction. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + gs_app_set_state_recover (app); + } + + /* Somehow, the app might already be installed. */ + if (g_error_matches (local_error, FLATPAK_ERROR, + FLATPAK_ERROR_ALREADY_INSTALLED)) { + g_clear_error (&local_error); + + /* Set the app back to UNKNOWN so that refining it gets all the right details. */ + if (error_app != NULL) { + g_debug ("App %s is already installed", gs_app_get_unique_id (error_app)); + gs_app_set_state (error_app, GS_APP_STATE_UNKNOWN); + } + } else { + g_autoptr(GsPluginEvent) event = NULL; + + if (error_app != NULL && + g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_REF_NOT_FOUND)) { + const gchar *origin = gs_app_get_origin (error_app); + if (origin != NULL) { + g_autoptr(FlatpakRemote) remote = NULL; + remote = flatpak_installation_get_remote_by_name (gs_flatpak_get_installation (flatpak, interactive), + origin, cancellable, NULL); + if (remote != NULL) { + g_autofree gchar *filter = flatpak_remote_get_filter (remote); + if (filter != NULL && *filter != '\0') { + /* It's a filtered remote, create a user friendly error message for it */ + g_autoptr(GError) error_tmp = NULL; + g_set_error (&error_tmp, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + _("Remote “%s” doesn't allow install of “%s”, possibly due to its filter. Remove the filter and repeat the install. Detailed error: %s"), + flatpak_remote_get_title (remote), + gs_app_get_name (error_app), + local_error->message); + g_clear_error (&local_error); + local_error = g_steal_pointer (&error_tmp); + } + } + } + } + + gs_flatpak_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + "app", error_app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + remove_schedule_entry (schedule_entry_handle); + gs_flatpak_set_busy (flatpak, FALSE); + + continue; + } + } + + remove_schedule_entry (schedule_entry_handle); + + /* Get any new state. Ignore failure and fall through to + * refining the apps, since refreshing is not an entirely + * necessary part of the install operation. */ + if (!(data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD) && + !gs_flatpak_refresh (flatpak, G_MAXUINT, interactive, cancellable, &local_error)) { + gs_flatpak_error_convert (&local_error); + g_warning ("Error refreshing flatpak data for ‘%s’ after install: %s", + gs_flatpak_get_id (flatpak), local_error->message); + g_clear_error (&local_error); + } + + /* Refine all the installed apps to make sure they’re up to date + * in the UI. Ignore failure since it’s not an entirely + * necessary part of the install operation. */ + for (guint i = 0; i < gs_app_list_length (list_tmp); i++) { + GsApp *app = gs_app_list_index (list_tmp, i); + g_autofree gchar *ref = NULL; + + ref = gs_flatpak_app_get_ref_display (app); + if (!gs_flatpak_refine_app (flatpak, app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION, + interactive, FALSE, + cancellable, &local_error)) { + gs_flatpak_error_convert (&local_error); + g_warning ("Error refining app ‘%s’ after install: %s", ref, local_error->message); + g_clear_error (&local_error); + continue; + } + + gs_flatpak_refine_addons (flatpak, + app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID, + GS_APP_STATE_INSTALLING, + interactive, + cancellable); + } + + gs_flatpak_set_busy (flatpak, FALSE); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_install_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static GsApp * +gs_plugin_flatpak_file_to_app_repo (GsPluginFlatpak *self, + GFile *file, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsApp) app = NULL; + + /* parse the repo file */ + app = gs_flatpak_app_new_from_repo_file (file, cancellable, error); + if (app == NULL) + return NULL; + + /* already exists */ + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + g_autoptr(GError) error_local = NULL; + g_autoptr(GsApp) app_tmp = NULL; + app_tmp = gs_flatpak_find_source_by_url (flatpak, + gs_flatpak_app_get_repo_url (app), + interactive, + cancellable, &error_local); + if (app_tmp == NULL) { + g_debug ("%s", error_local->message); + continue; + } + if (g_strcmp0 (gs_flatpak_app_get_repo_filter (app), gs_flatpak_app_get_repo_filter (app_tmp)) != 0) + continue; + return g_steal_pointer (&app_tmp); + } + + /* this is new */ + gs_app_set_management_plugin (app, GS_PLUGIN (self)); + return g_steal_pointer (&app); +} + +static GsFlatpak * +gs_plugin_flatpak_create_temporary (GsPluginFlatpak *self, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *installation_path = NULL; + g_autoptr(FlatpakInstallation) installation = NULL; + g_autoptr(GFile) installation_file = NULL; + + /* create new per-user installation in a cache dir */ + installation_path = gs_utils_get_cache_filename ("flatpak", + "installation-tmp", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_ENSURE_EMPTY | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + error); + if (installation_path == NULL) + return NULL; + installation_file = g_file_new_for_path (installation_path); + installation = flatpak_installation_new_for_path (installation_file, + TRUE, /* user */ + cancellable, + error); + if (installation == NULL) { + gs_flatpak_error_convert (error); + return NULL; + } + return gs_flatpak_new (GS_PLUGIN (self), installation, GS_FLATPAK_FLAG_IS_TEMPORARY); +} + +static GsApp * +gs_plugin_flatpak_file_to_app_bundle (GsPluginFlatpak *self, + GFile *file, + gboolean interactive, + GsApp *alternate_of, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *ref = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsApp) app_tmp = NULL; + g_autoptr(GsFlatpak) flatpak_tmp = NULL; + GsApp *runtime; + + /* only use the temporary GsFlatpak to avoid the auth dialog */ + flatpak_tmp = gs_plugin_flatpak_create_temporary (self, cancellable, error); + if (flatpak_tmp == NULL) + return NULL; + + /* First make a quick GsApp to get the ref */ + app = gs_flatpak_file_to_app_bundle (flatpak_tmp, file, TRUE /* unrefined */, + interactive, cancellable, error); + if (app == NULL) + return NULL; + + /* is this already installed or available in a configured remote */ + ref = gs_flatpak_app_get_ref_display (app); + app_tmp = gs_plugin_flatpak_find_app_by_ref (self, ref, interactive, alternate_of, cancellable, NULL); + if (app_tmp != NULL) + return g_steal_pointer (&app_tmp); + + /* If not installed/available, make a fully refined GsApp */ + g_clear_object (&app); + app = gs_flatpak_file_to_app_bundle (flatpak_tmp, file, FALSE /* unrefined */, + interactive, cancellable, error); + if (app == NULL) + return NULL; + + /* force this to be 'any' scope for installation */ + gs_app_set_scope (app, AS_COMPONENT_SCOPE_UNKNOWN); + + runtime = gs_app_get_runtime (app); + if (runtime != NULL) + gs_app_set_scope (runtime, AS_COMPONENT_SCOPE_UNKNOWN); + + /* this is new */ + return g_steal_pointer (&app); +} + +static GsApp * +gs_plugin_flatpak_file_to_app_ref (GsPluginFlatpak *self, + GFile *file, + gboolean interactive, + GsApp *alternate_of, + GCancellable *cancellable, + GError **error) +{ + GsApp *runtime; + g_autofree gchar *ref = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsApp) app_tmp = NULL; + g_autoptr(GsFlatpak) flatpak_tmp = NULL; + + /* only use the temporary GsFlatpak to avoid the auth dialog */ + flatpak_tmp = gs_plugin_flatpak_create_temporary (self, cancellable, error); + if (flatpak_tmp == NULL) + return NULL; + + /* First make a quick GsApp to get the ref */ + app = gs_flatpak_file_to_app_ref (flatpak_tmp, file, TRUE /* unrefined */, + interactive, cancellable, error); + if (app == NULL) + return NULL; + + /* is this already installed or available in a configured remote */ + ref = gs_flatpak_app_get_ref_display (app); + app_tmp = gs_plugin_flatpak_find_app_by_ref (self, ref, interactive, alternate_of, cancellable, NULL); + if (app_tmp != NULL) + return g_steal_pointer (&app_tmp); + + /* If not installed/available, make a fully refined GsApp */ + g_clear_object (&app); + app = gs_flatpak_file_to_app_ref (flatpak_tmp, file, FALSE /* unrefined */, + interactive, cancellable, error); + if (app == NULL) + return NULL; + + /* force this to be 'any' scope for installation */ + gs_app_set_scope (app, AS_COMPONENT_SCOPE_UNKNOWN); + + /* do we have a system runtime available */ + runtime = gs_app_get_runtime (app); + if (runtime != NULL) { + g_autoptr(GsApp) runtime_tmp = NULL; + g_autofree gchar *runtime_ref = gs_flatpak_app_get_ref_display (runtime); + runtime_tmp = gs_plugin_flatpak_find_app_by_ref (self, + runtime_ref, + interactive, + alternate_of, + cancellable, + NULL); + if (runtime_tmp != NULL) { + gs_app_set_runtime (app, runtime_tmp); + } else { + /* the new runtime is available from the RuntimeRepo */ + if (gs_flatpak_app_get_runtime_url (runtime) != NULL) + gs_app_set_state (runtime, GS_APP_STATE_AVAILABLE); + } + } + + /* this is new */ + return g_steal_pointer (&app); +} + +static GsApp * /* (transfer full) */ +gs_plugin_flatpak_file_to_app (GsPluginFlatpak *self, + GFile *file, + gboolean interactive, + GsApp *alternate_of, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *content_type = NULL; + GsApp *app = NULL; + const gchar *mimetypes_bundle[] = { + "application/vnd.flatpak", + NULL }; + const gchar *mimetypes_repo[] = { + "application/vnd.flatpak.repo", + NULL }; + const gchar *mimetypes_ref[] = { + "application/vnd.flatpak.ref", + NULL }; + + /* does this match any of the mimetypes we support */ + content_type = gs_utils_get_content_type (file, cancellable, error); + if (content_type == NULL) + return NULL; + + if (g_strv_contains (mimetypes_bundle, content_type)) + app = gs_plugin_flatpak_file_to_app_bundle (self, file, interactive, alternate_of, cancellable, error); + else if (g_strv_contains (mimetypes_repo, content_type)) + app = gs_plugin_flatpak_file_to_app_repo (self, file, interactive, cancellable, error); + else if (g_strv_contains (mimetypes_ref, content_type)) + app = gs_plugin_flatpak_file_to_app_ref (self, file, interactive, alternate_of, cancellable, error); + + if (app != NULL) { + GsApp *runtime = gs_app_get_runtime (app); + /* Ensure the origin for the runtime is set */ + if (runtime != NULL && gs_app_get_origin (runtime) == NULL) { + g_autoptr(GError) error_local = NULL; + if (!gs_plugin_flatpak_refine_app (self, runtime, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN, interactive, cancellable, &error_local)) + g_debug ("Failed to refine runtime: %s", error_local->message); + } + gs_plugin_flatpak_ensure_scope (GS_PLUGIN (self), app); + /* It can return a cached app when the app is available in one of the remotes. + Cached apps cannot have set the local file property. */ + if (gs_plugin_cache_lookup (GS_PLUGIN (self), gs_app_get_unique_id (app)) != app) + gs_app_set_local_file (app, file); + } + + return app; +} + +static void +file_to_app_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) local_error = NULL; + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPluginFileToAppData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE) != 0; + + app = gs_plugin_flatpak_file_to_app (self, data->file, interactive, NULL, cancellable, &local_error); + if (app != NULL) { + g_autoptr(GsAppList) list = gs_app_list_new (); + gs_app_list_add (list, app); + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + } else if (local_error != NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + } +} + +static void +gs_plugin_flatpak_file_to_app_async (GsPlugin *plugin, + GFile *file, + GsPluginFileToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + gboolean interactive = (flags & GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE) != 0; + + task = gs_plugin_file_to_app_data_new_task (plugin, file, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_file_to_app_async); + + /* Queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + file_to_app_thread_cb, g_steal_pointer (&task)); +} + +static GsAppList * +gs_plugin_flatpak_file_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void refine_categories_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_refine_categories_async (GsPlugin *plugin, + GPtrArray *list, + GsPluginRefineCategoriesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_REFINE_CATEGORIES_FLAGS_INTERACTIVE); + + task = gs_plugin_refine_categories_data_new_task (plugin, list, flags, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_refine_categories_async); + + /* All we actually do is add the sizes of each category. If that’s + * not been requested, avoid queueing a worker job. */ + if (!(flags & GS_PLUGIN_REFINE_CATEGORIES_FLAGS_SIZE)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* Queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refine_categories_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +refine_categories_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPluginRefineCategoriesData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_REFINE_CATEGORIES_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + + if (!gs_flatpak_refine_category_sizes (flatpak, data->list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_flatpak_refine_categories_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void list_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_list_apps_data_new_task (plugin, query, flags, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_list_apps_async); + + /* Queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + list_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +list_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + g_autoptr(GsAppList) list = gs_app_list_new (); + GsPluginListAppsData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + GDateTime *released_since = NULL; + GsAppQueryTristate is_curated = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_featured = GS_APP_QUERY_TRISTATE_UNSET; + GsCategory *category = NULL; + GsAppQueryTristate is_installed = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_source = GS_APP_QUERY_TRISTATE_UNSET; + guint64 age_secs = 0; + const gchar * const *deployment_featured = NULL; + const gchar *const *developers = NULL; + const gchar * const *keywords = NULL; + GsApp *alternate_of = NULL; + const gchar *provides_tag = NULL; + GsAppQueryProvidesType provides_type = GS_APP_QUERY_PROVIDES_UNKNOWN; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (data->query != NULL) { + released_since = gs_app_query_get_released_since (data->query); + is_curated = gs_app_query_get_is_curated (data->query); + is_featured = gs_app_query_get_is_featured (data->query); + category = gs_app_query_get_category (data->query); + is_installed = gs_app_query_get_is_installed (data->query); + deployment_featured = gs_app_query_get_deployment_featured (data->query); + developers = gs_app_query_get_developers (data->query); + keywords = gs_app_query_get_keywords (data->query); + alternate_of = gs_app_query_get_alternate_of (data->query); + provides_type = gs_app_query_get_provides (data->query, &provides_tag); + is_for_update = gs_app_query_get_is_for_update (data->query); + is_source = gs_app_query_get_is_source (data->query); + } + + if (released_since != NULL) { + g_autoptr(GDateTime) now = g_date_time_new_now_local (); + age_secs = g_date_time_difference (now, released_since) / G_TIME_SPAN_SECOND; + } + + /* Currently only support a subset of query properties, and only one set at once. + * Also don’t currently support GS_APP_QUERY_TRISTATE_FALSE. */ + if ((released_since == NULL && + is_curated == GS_APP_QUERY_TRISTATE_UNSET && + is_featured == GS_APP_QUERY_TRISTATE_UNSET && + category == NULL && + is_installed == GS_APP_QUERY_TRISTATE_UNSET && + deployment_featured == NULL && + developers == NULL && + keywords == NULL && + alternate_of == NULL && + provides_tag == NULL && + is_for_update == GS_APP_QUERY_TRISTATE_UNSET && + is_source == GS_APP_QUERY_TRISTATE_UNSET) || + is_curated == GS_APP_QUERY_TRISTATE_FALSE || + is_featured == GS_APP_QUERY_TRISTATE_FALSE || + is_installed == GS_APP_QUERY_TRISTATE_FALSE || + is_for_update == GS_APP_QUERY_TRISTATE_FALSE || + is_source == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (data->query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + if (alternate_of != NULL && + gs_app_get_bundle_kind (alternate_of) == AS_BUNDLE_KIND_FLATPAK && + gs_app_get_scope (alternate_of) != AS_COMPONENT_SCOPE_UNKNOWN && + gs_app_get_local_file (alternate_of) != NULL) { + g_autoptr(GsApp) app = NULL; + GFile *file = gs_app_get_local_file (alternate_of); + app = gs_plugin_flatpak_file_to_app (self, file, interactive, alternate_of, cancellable, NULL); + if (app != NULL && app != alternate_of) { + gs_app_set_local_file (app, file); + if (gs_app_get_scope (alternate_of) == AS_COMPONENT_SCOPE_SYSTEM) + gs_app_set_scope (app, AS_COMPONENT_SCOPE_USER); + else + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + /* ensure both are considered */ + gs_app_list_add (list, alternate_of); + gs_app_list_add (list, app); + } + } + + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + const gchar * const provides_tag_strv[2] = { provides_tag, NULL }; + + if (released_since != NULL && + !gs_flatpak_add_recent (flatpak, list, age_secs, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (is_curated != GS_APP_QUERY_TRISTATE_UNSET && + !gs_flatpak_add_popular (flatpak, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (is_featured != GS_APP_QUERY_TRISTATE_UNSET && + !gs_flatpak_add_featured (flatpak, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (category != NULL && + !gs_flatpak_add_category_apps (flatpak, category, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (is_installed != GS_APP_QUERY_TRISTATE_UNSET && + !gs_flatpak_add_installed (flatpak, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (deployment_featured != NULL && + !gs_flatpak_add_deployment_featured (flatpak, list, interactive, deployment_featured, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (developers != NULL && + !gs_flatpak_search_developer_apps (flatpak, developers, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (keywords != NULL && + !gs_flatpak_search (flatpak, keywords, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (alternate_of != NULL && + !gs_flatpak_add_alternates (flatpak, alternate_of, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* The @provides_type is deliberately ignored here, as flatpak + * wants to try and match anything. This could be changed in + * future. */ + if (provides_tag != NULL && + provides_type != GS_APP_QUERY_PROVIDES_UNKNOWN && + !gs_flatpak_search (flatpak, provides_tag_strv, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE) { + g_autoptr(GError) local_error2 = NULL; + if (!gs_flatpak_add_updates (flatpak, list, interactive, cancellable, &local_error2)) + g_debug ("Failed to get updates for '%s': %s", gs_flatpak_get_id (flatpak), local_error2->message); + } + + if (is_source == GS_APP_QUERY_TRISTATE_TRUE && + !gs_flatpak_add_sources (flatpak, list, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE) + gs_plugin_cache_lookup_by_state (GS_PLUGIN (self), list, GS_APP_STATE_INSTALLING); + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_flatpak_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +typedef struct { + gboolean interactive; + GFile *cache_file; /* (owned) (not nullable) */ +} UrlToAppDownloadData; + +static void +url_to_app_download_data_free (UrlToAppDownloadData *data) +{ + g_clear_object (&data->cache_file); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UrlToAppDownloadData, url_to_app_download_data_free) + +static void url_to_app_download_cb (GObject *object, + GAsyncResult *result, + gpointer user_data); +static void url_to_app_file_cb (GObject *object, + GAsyncResult *result, + gpointer user_data); + +static void +url_to_app_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GError) local_error = NULL; + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsPluginUrlToAppData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE) != 0; + + for (guint i = 0; i < self->installations->len; i++) { + GsFlatpak *flatpak = g_ptr_array_index (self->installations, i); + if (!gs_flatpak_url_to_app (flatpak, list, data->url, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static void +gs_plugin_flatpak_url_to_app_async (GsPlugin *plugin, + const gchar *url, + GsPluginUrlToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + gboolean interactive = (flags & GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE) != 0; + g_autofree char *scheme = NULL; + + task = gs_plugin_url_to_app_data_new_task (plugin, url, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_url_to_app_async); + + /* Firstly, try and support `flatpak+https` URIs. This needs to be done + * at the #GsPluginFlatpak level rather than the #GsFlatpak level, + * because we need to hand off to the plugin’s file-to-app code. + * + * The flatpak+https URI scheme points towards a .flatpakref file which + * we can download and then treat like a normal local file. This code + * actually also supports the URI pointing at a bundle or a repo file, + * since that also seems sensible to support. + * + * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2240#note_1787991 */ + scheme = gs_utils_get_url_scheme (url); + + if (g_strcmp0 (scheme, "flatpak+https") == 0) { + g_autofree gchar *cache_filename = NULL; + g_autoptr(GFile) cache_file = NULL; + g_autoptr(SoupSession) soup_session = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(UrlToAppDownloadData) data = NULL; + + /* Download and cache the file. */ + cache_filename = gs_utils_get_cache_filename ("flatpak-downloaded-refs", + url, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &local_error); + if (cache_filename == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + cache_file = g_file_new_for_path (cache_filename); + soup_session = gs_build_soup_session (); + if (self->cache_files_to_delete == NULL) + self->cache_files_to_delete = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + g_ptr_array_add (self->cache_files_to_delete, g_object_ref (cache_file)); + + data = g_new0 (UrlToAppDownloadData, 1); + data->interactive = interactive; + data->cache_file = g_object_ref (cache_file); + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) url_to_app_download_data_free); + + gs_download_file_async (soup_session, + url + strlen ("flatpak+"), + cache_file, + G_PRIORITY_DEFAULT, + NULL, NULL, /* progress */ + cancellable, + url_to_app_download_cb, + g_steal_pointer (&task)); + } else { + /* If it’s not a file we need to download, queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + url_to_app_thread_cb, g_steal_pointer (&task)); + } +} + +static void +url_to_app_download_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + SoupSession *soup_session = SOUP_SESSION (object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginFlatpak *self = g_task_get_source_object (task); + UrlToAppDownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + + if (!gs_download_file_finish (soup_session, result, &local_error) && + !g_error_matches (local_error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_clear_error (&local_error); + + /* Now load and display the downloaded flatpakref file. */ + gs_plugin_flatpak_file_to_app_async (GS_PLUGIN (self), + data->cache_file, + data->interactive ? GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE : GS_PLUGIN_FILE_TO_APP_FLAGS_NONE, + cancellable, + url_to_app_file_cb, g_steal_pointer (&task)); +} + +static void +url_to_app_file_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginFlatpak *self = g_task_get_source_object (task); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + + list = gs_plugin_flatpak_file_to_app_finish (GS_PLUGIN (self), result, &local_error); + + if (list != NULL) + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static GsAppList * +gs_plugin_flatpak_url_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void install_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_install_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + + task = gs_plugin_manage_repository_data_new_task (plugin, repository, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_install_repository_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* is a source */ + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + install_repository_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +install_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsFlatpak *flatpak; + GsPluginManageRepositoryData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + /* queue for install if installation needs the network */ + if (!app_has_local_source (data->repository) && + !gs_plugin_get_network_available (GS_PLUGIN (self))) { + gs_app_set_state (data->repository, GS_APP_STATE_QUEUED_FOR_INSTALL); + g_task_return_boolean (task, TRUE); + return; + } + + gs_plugin_flatpak_ensure_scope (GS_PLUGIN (self), data->repository); + + flatpak = gs_plugin_flatpak_get_handler (self, data->repository); + if (flatpak == NULL) { + g_task_return_boolean (task, TRUE); + return; + } + + if (gs_flatpak_app_install_source (flatpak, data->repository, TRUE, interactive, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static gboolean +gs_plugin_flatpak_install_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void remove_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_remove_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + + task = gs_plugin_manage_repository_data_new_task (plugin, repository, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_remove_repository_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* is a source */ + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + remove_repository_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +remove_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsFlatpak *flatpak; + GsPluginManageRepositoryData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + flatpak = gs_plugin_flatpak_get_handler (self, data->repository); + if (flatpak == NULL) { + g_task_return_boolean (task, TRUE); + return; + } + + if (gs_flatpak_app_remove_source (flatpak, data->repository, TRUE, interactive, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static gboolean +gs_plugin_flatpak_remove_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void enable_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_enable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + + task = gs_plugin_manage_repository_data_new_task (plugin, repository, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_enable_repository_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* is a source */ + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + enable_repository_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +enable_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsFlatpak *flatpak; + GsPluginManageRepositoryData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + flatpak = gs_plugin_flatpak_get_handler (self, data->repository); + if (flatpak == NULL) { + g_task_return_boolean (task, TRUE); + return; + } + + if (gs_flatpak_app_install_source (flatpak, data->repository, FALSE, interactive, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static gboolean +gs_plugin_flatpak_enable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void disable_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_flatpak_disable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + + task = gs_plugin_manage_repository_data_new_task (plugin, repository, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_flatpak_disable_repository_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* is a source */ + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + disable_repository_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +disable_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (source_object); + GsFlatpak *flatpak; + GsPluginManageRepositoryData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + flatpak = gs_plugin_flatpak_get_handler (self, data->repository); + if (flatpak == NULL) { + g_task_return_boolean (task, TRUE); + return; + } + + if (gs_flatpak_app_remove_source (flatpak, data->repository, FALSE, interactive, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static gboolean +gs_plugin_flatpak_disable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_flatpak_class_init (GsPluginFlatpakClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_flatpak_dispose; + + plugin_class->setup_async = gs_plugin_flatpak_setup_async; + plugin_class->setup_finish = gs_plugin_flatpak_setup_finish; + plugin_class->shutdown_async = gs_plugin_flatpak_shutdown_async; + plugin_class->shutdown_finish = gs_plugin_flatpak_shutdown_finish; + plugin_class->refine_async = gs_plugin_flatpak_refine_async; + plugin_class->refine_finish = gs_plugin_flatpak_refine_finish; + plugin_class->list_apps_async = gs_plugin_flatpak_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_flatpak_list_apps_finish; + plugin_class->refresh_metadata_async = gs_plugin_flatpak_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_flatpak_refresh_metadata_finish; + plugin_class->install_repository_async = gs_plugin_flatpak_install_repository_async; + plugin_class->install_repository_finish = gs_plugin_flatpak_install_repository_finish; + plugin_class->remove_repository_async = gs_plugin_flatpak_remove_repository_async; + plugin_class->remove_repository_finish = gs_plugin_flatpak_remove_repository_finish; + plugin_class->enable_repository_async = gs_plugin_flatpak_enable_repository_async; + plugin_class->enable_repository_finish = gs_plugin_flatpak_enable_repository_finish; + plugin_class->disable_repository_async = gs_plugin_flatpak_disable_repository_async; + plugin_class->disable_repository_finish = gs_plugin_flatpak_disable_repository_finish; + plugin_class->refine_categories_async = gs_plugin_flatpak_refine_categories_async; + plugin_class->refine_categories_finish = gs_plugin_flatpak_refine_categories_finish; + plugin_class->install_apps_async = gs_plugin_flatpak_install_apps_async; + plugin_class->install_apps_finish = gs_plugin_flatpak_install_apps_finish; + plugin_class->uninstall_apps_async = gs_plugin_flatpak_uninstall_apps_async; + plugin_class->uninstall_apps_finish = gs_plugin_flatpak_uninstall_apps_finish; + plugin_class->update_apps_async = gs_plugin_flatpak_update_apps_async; + plugin_class->update_apps_finish = gs_plugin_flatpak_update_apps_finish; + plugin_class->launch_async = gs_plugin_flatpak_launch_async; + plugin_class->launch_finish = gs_plugin_flatpak_launch_finish; + plugin_class->file_to_app_async = gs_plugin_flatpak_file_to_app_async; + plugin_class->file_to_app_finish = gs_plugin_flatpak_file_to_app_finish; + plugin_class->url_to_app_async = gs_plugin_flatpak_url_to_app_async; + plugin_class->url_to_app_finish = gs_plugin_flatpak_url_to_app_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_FLATPAK; +} diff --git a/plugins/flatpak/gs-plugin-flatpak.h b/plugins/flatpak/gs-plugin-flatpak.h new file mode 100644 index 0000000..fb8ab9a --- /dev/null +++ b/plugins/flatpak/gs-plugin-flatpak.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_FLATPAK (gs_plugin_flatpak_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginFlatpak, gs_plugin_flatpak, GS, PLUGIN_FLATPAK, GsPlugin) + +G_END_DECLS diff --git a/plugins/flatpak/gs-self-test.c b/plugins/flatpak/gs-self-test.c new file mode 100644 index 0000000..fa107eb --- /dev/null +++ b/plugins/flatpak/gs-self-test.c @@ -0,0 +1,2011 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2018 Richard Hughes + * Copyright (C) 2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gnome-software-private.h" + +#include "gs-flatpak-app.h" + +#include "gs-test.h" + +const gchar * const allowlist[] = { + "appstream", + "flatpak", + "icons", + NULL +}; + +static gboolean +gs_flatpak_test_write_repo_file (const gchar *fn, const gchar *testdir, GFile **file_out, GError **error) +{ + g_autofree gchar *testdir_repourl = NULL; + g_autoptr(GString) str = g_string_new (NULL); + g_autofree gchar *path = NULL; + + /* create file */ + testdir_repourl = g_strdup_printf ("file://%s/repo", testdir); + g_string_append (str, "[Flatpak Repo]\n"); + g_string_append (str, "Title=foo-bar\n"); + g_string_append (str, "Comment=Longer one line comment\n"); + g_string_append (str, "Description=Longer multiline comment that " + "does into detail.\n"); + g_string_append (str, "DefaultBranch=master\n"); + g_string_append_printf (str, "Url=%s\n", testdir_repourl); + g_string_append (str, "Homepage=http://foo.bar\n"); + + path = g_build_filename (g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR"), fn, NULL); + *file_out = g_file_new_for_path (path); + + return g_file_set_contents (path, str->str, -1, error); +} + +static gboolean +gs_flatpak_test_write_ref_file (const gchar *filename, const gchar *url, const gchar *runtimerepo, GFile **file_out, GError **error) +{ + g_autoptr(GString) str = g_string_new (NULL); + g_autofree gchar *path = NULL; + + g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (url != NULL, FALSE); + g_return_val_if_fail (runtimerepo != NULL, FALSE); + + g_string_append (str, "[Flatpak Ref]\n"); + g_string_append (str, "Title=Chiron\n"); + g_string_append (str, "Name=org.test.Chiron\n"); + g_string_append (str, "Branch=master\n"); + g_string_append_printf (str, "Url=%s\n", url); + g_string_append (str, "IsRuntime=false\n"); + g_string_append (str, "Comment=Single line synopsis\n"); + g_string_append (str, "Description=A Testing Application\n"); + g_string_append (str, "Icon=https://getfedora.org/static/images/fedora-logotext.png\n"); + g_string_append_printf (str, "RuntimeRepo=%s\n", runtimerepo); + + path = g_build_filename (g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR"), filename, NULL); + *file_out = g_file_new_for_path (path); + + return g_file_set_contents (path, str->str, -1, error); +} + +/* create duplicate file as if downloaded in firefox */ +static void +gs_plugins_flatpak_repo_non_ascii_func (GsPluginLoader *plugin_loader) +{ + const gchar *fn = "example (1)….flatpakrepo"; + gboolean ret; + g_autofree gchar *testdir = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get a resolvable */ + testdir = gs_test_get_filename (TESTDATADIR, "app-with-runtime"); + if (testdir == NULL) + return; + + ret = gs_flatpak_test_write_repo_file (fn, testdir, &file, &error); + g_assert_no_error (error); + g_assert_true (ret); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (app != NULL); + g_assert_cmpstr (gs_app_get_unique_id (app), ==, "user/*/*/example__1____/master"); +} + +static void +gs_plugins_flatpak_repo_func (GsPluginLoader *plugin_loader) +{ + const gchar *group_name = "remote \"example\""; + const gchar *root = NULL; + const gchar *fn = "example.flatpakrepo"; + gboolean ret; + g_autofree gchar *config_fn = NULL; + g_autofree gchar *remote_url = NULL; + g_autofree gchar *testdir = NULL; + g_autofree gchar *testdir_repourl = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GKeyFile) kf = NULL; + g_autoptr(GsApp) app2 = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GIcon) icon = NULL; + g_autoptr(GsPlugin) management_plugin = NULL; + + /* no flatpak, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "flatpak")) + return; + + /* get a resolvable */ + testdir = gs_test_get_filename (TESTDATADIR, "app-with-runtime"); + if (testdir == NULL) + return; + testdir_repourl = g_strdup_printf ("file://%s/repo", testdir); + + /* create file */ + ret = gs_flatpak_test_write_repo_file (fn, testdir, &file, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* load local file */ + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (app != NULL); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_REPOSITORY); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE_LOCAL); + g_assert_cmpstr (gs_app_get_id (app), ==, "example"); + management_plugin = gs_app_dup_management_plugin (app); + g_assert_nonnull (management_plugin); + g_assert_cmpstr (gs_plugin_get_name (management_plugin), ==, "flatpak"); + g_assert_cmpstr (gs_app_get_origin_hostname (app), ==, "localhost"); + g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, "http://foo.bar"); + g_assert_cmpstr (gs_app_get_name (app), ==, "foo-bar"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "Longer one line comment"); + g_assert_cmpstr (gs_app_get_description (app), ==, + "Longer multiline comment that does into detail."); + g_assert_true (gs_app_get_local_file (app) != NULL); + /* The app has an icon, but cannot be found since it is not installed */ + g_assert_true (gs_app_has_icons (app)); + icon = gs_app_get_icon_for_size (app, 64, 1, NULL); + g_assert_null (icon); + + /* now install the remote */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + + /* check config file was updated */ + root = g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR"); + config_fn = g_build_filename (root, "flatpak", "repo", "config", NULL); + kf = g_key_file_new (); + ret = g_key_file_load_from_file (kf, config_fn, 0, &error); + g_assert_no_error (error); + g_assert_true (ret); + + g_assert_true (g_key_file_has_group (kf, "core")); + g_assert_true (g_key_file_has_group (kf, group_name)); + g_assert_true (!g_key_file_get_boolean (kf, group_name, "gpg-verify", NULL)); + + /* check the URL was unmangled */ + remote_url = g_key_file_get_string (kf, group_name, "url", &error); + g_assert_no_error (error); + g_assert_cmpstr (remote_url, ==, testdir_repourl); + + /* try again, check state is correct */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + app2 = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (app2 != NULL); + g_assert_cmpint (gs_app_get_state (app2), ==, GS_APP_STATE_INSTALLED); + + /* disable repo */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpint (gs_app_get_progress (app), ==, GS_APP_PROGRESS_UNKNOWN); + + /* enable repo */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpint (gs_app_get_progress (app), ==, GS_APP_PROGRESS_UNKNOWN); + + /* remove it */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UNAVAILABLE); + g_assert_cmpint (gs_app_get_progress (app), ==, GS_APP_PROGRESS_UNKNOWN); +} + +static void +progress_notify_cb (GObject *obj, GParamSpec *pspec, gpointer user_data) +{ + gboolean *seen_unknown = user_data; + GsApp *app = GS_APP (obj); + + if (gs_app_get_progress (app) == GS_APP_PROGRESS_UNKNOWN) + *seen_unknown = TRUE; +} + +static void +gs_plugins_flatpak_app_with_runtime_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + GsApp *runtime; + const gchar *root; + gboolean ret; + gint kf_remote_repo_version; + g_autofree gchar *changed_fn = NULL; + g_autofree gchar *config_fn = NULL; + g_autofree gchar *desktop_fn = NULL; + g_autofree gchar *kf_remote_url = NULL; + g_autofree gchar *metadata_fn = NULL; + g_autofree gchar *repodir_fn = NULL; + g_autofree gchar *runtime_fn = NULL; + g_autofree gchar *testdir = NULL; + g_autofree gchar *testdir_repourl = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GKeyFile) kf1 = g_key_file_new (); + g_autoptr(GKeyFile) kf2 = g_key_file_new (); + g_autoptr(GsApp) app_source = NULL; + g_autoptr(GsAppList) list_all = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) sources = NULL; + g_autoptr(GsAppList) runtime_list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + gulong signal_id; + gboolean seen_unknown; + GsPlugin *plugin; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* no flatpak, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "flatpak")) + return; + + /* no files to use */ + repodir_fn = gs_test_get_filename (TESTDATADIR, "app-with-runtime/repo"); + if (repodir_fn == NULL || + !g_file_test (repodir_fn, G_FILE_TEST_EXISTS)) { + g_test_skip ("no flatpak test repo"); + return; + } + + /* check changed file exists */ + root = g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR"); + changed_fn = g_build_filename (root, "flatpak", ".changed", NULL); + g_assert_true (g_file_test (changed_fn, G_FILE_TEST_IS_REGULAR)); + + /* check repo is set up */ + config_fn = g_build_filename (root, "flatpak", "repo", "config", NULL); + ret = g_key_file_load_from_file (kf1, config_fn, G_KEY_FILE_NONE, &error); + g_assert_no_error (error); + g_assert_true (ret); + kf_remote_repo_version = g_key_file_get_integer (kf1, "core", "repo_version", &error); + g_assert_no_error (error); + g_assert_cmpint (kf_remote_repo_version, ==, 1); + + /* add a remote */ + app_source = gs_flatpak_app_new ("test"); + testdir = gs_test_get_filename (TESTDATADIR, "app-with-runtime"); + if (testdir == NULL) + return; + testdir_repourl = g_strdup_printf ("file://%s/repo", testdir); + gs_app_set_kind (app_source, AS_COMPONENT_KIND_REPOSITORY); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "flatpak"); + gs_app_set_management_plugin (app_source, plugin); + gs_app_set_state (app_source, GS_APP_STATE_AVAILABLE); + gs_flatpak_app_set_repo_url (app_source, testdir_repourl); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_INSTALLED); + + /* check remote was set up */ + ret = g_key_file_load_from_file (kf2, config_fn, G_KEY_FILE_NONE, &error); + g_assert_no_error (error); + g_assert_true (ret); + kf_remote_url = g_key_file_get_string (kf2, "remote \"test\"", "url", &error); + g_assert_no_error (error); + g_assert_cmpstr (kf_remote_url, !=, NULL); + + /* check the source now exists */ + g_object_unref (plugin_job); + query = gs_app_query_new ("is-source", GS_APP_QUERY_TRISTATE_TRUE, NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + sources = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (sources != NULL); + g_assert_cmpint (gs_app_list_length (sources), ==, 1); + app = gs_app_list_index (sources, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "test"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_REPOSITORY); + + /* refresh the appstream metadata */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refresh_metadata_new (G_MAXUINT64, + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* all the apps should have the flatpak keyword */ + g_object_unref (plugin_job); + + keywords[0] = "flatpak"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + list_all = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (list_all != NULL); + g_assert_cmpint (gs_app_list_length (list_all), ==, 2); + + /* find available application */ + g_object_unref (plugin_job); + + keywords[0] = "Bingo"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (list != NULL); + + /* make sure there is one entry, the flatpak app */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpint ((gint64) gs_app_get_kudos (app), ==, + GS_APP_KUDO_MY_LANGUAGE | + GS_APP_KUDO_HAS_KEYWORDS | + GS_APP_KUDO_HI_DPI_ICON | + GS_APP_KUDO_SANDBOXED_SECURE | + GS_APP_KUDO_SANDBOXED); + g_assert_cmpstr (gs_app_get_origin_hostname (app), ==, "localhost"); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + g_assert_cmpstr (gs_app_get_update_version (app), ==, NULL); + g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, NULL); + g_assert_cmpint (gs_app_get_update_urgency (app), ==, AS_URGENCY_KIND_UNKNOWN); + + /* check runtime */ + runtime = gs_app_get_runtime (app); + g_assert_true (runtime != NULL); + g_assert_cmpstr (gs_app_get_unique_id (runtime), ==, "user/flatpak/test/org.test.Runtime/master"); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_AVAILABLE); + + /* install, also installing runtime */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_install_apps_new (list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + g_assert_true (gs_app_get_progress (app) == GS_APP_PROGRESS_UNKNOWN || + gs_app_get_progress (app) == 100); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_INSTALLED); + + /* check the application exists in the right places */ + metadata_fn = g_build_filename (root, + "flatpak", + "app", + "org.test.Chiron", + "current", + "active", + "metadata", + NULL); + g_assert_true (g_file_test (metadata_fn, G_FILE_TEST_IS_REGULAR)); + desktop_fn = g_build_filename (root, + "flatpak", + "app", + "org.test.Chiron", + "current", + "active", + "export", + "share", + "applications", + "org.test.Chiron.desktop", + NULL); + g_assert_true (g_file_test (desktop_fn, G_FILE_TEST_IS_REGULAR)); + + /* check the runtime was installed as well */ + runtime_fn = g_build_filename (root, + "flatpak", + "runtime", + "org.test.Runtime", + "x86_64", + "master", + "active", + "files", + "share", + "libtest", + "README", + NULL); + g_assert_true (g_file_test (runtime_fn, G_FILE_TEST_IS_REGULAR)); + + /* remove the application */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_uninstall_apps_new (list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_INSTALLED); + g_assert_true (!g_file_test (metadata_fn, G_FILE_TEST_IS_REGULAR)); + g_assert_true (!g_file_test (desktop_fn, G_FILE_TEST_IS_REGULAR)); + + /* install again, to check whether the progress gets initialized; + * since installation happens in another thread, we have to monitor all + * changes to the progress and see if we see the one we want */ + seen_unknown = (gs_app_get_progress (app) == GS_APP_PROGRESS_UNKNOWN); + signal_id = g_signal_connect (app, "notify::progress", + G_CALLBACK (progress_notify_cb), &seen_unknown); + + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_install_apps_new (list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + + /* progress should be set to unknown right before installing */ + while (!seen_unknown) + g_main_context_iteration (NULL, TRUE); + g_assert_true (seen_unknown); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + g_assert_true (gs_app_get_progress (app) == GS_APP_PROGRESS_UNKNOWN || + gs_app_get_progress (app) == 100); + g_signal_handler_disconnect (app, signal_id); + + /* remove the application */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_uninstall_apps_new (list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_INSTALLED); + g_assert_true (!g_file_test (metadata_fn, G_FILE_TEST_IS_REGULAR)); + g_assert_true (!g_file_test (desktop_fn, G_FILE_TEST_IS_REGULAR)); + + /* remove the remote (fail, as the runtime is still installed) */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED); + g_assert_true (!ret); + g_clear_error (&error); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_INSTALLED); + + /* remove the runtime */ + g_object_unref (plugin_job); + runtime_list = gs_app_list_new (); + gs_app_list_add (runtime_list, runtime); + plugin_job = gs_plugin_job_uninstall_apps_new (runtime_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_AVAILABLE); + + /* remove the remote */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_UNAVAILABLE); +} + +static void +gs_plugins_flatpak_app_missing_runtime_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + gboolean ret; + g_autofree gchar *repodir_fn = NULL; + g_autofree gchar *testdir = NULL; + g_autofree gchar *testdir_repourl = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app_source = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPlugin *plugin; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + g_autoptr(GPtrArray) events_before = NULL; + g_autoptr(GPtrArray) events_after = NULL; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* no flatpak, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "flatpak")) + return; + + /* no files to use */ + repodir_fn = gs_test_get_filename (TESTDATADIR, "app-missing-runtime/repo"); + if (repodir_fn == NULL || + !g_file_test (repodir_fn, G_FILE_TEST_EXISTS)) { + g_test_skip ("no flatpak test repo"); + return; + } + + /* add a remote */ + app_source = gs_flatpak_app_new ("test"); + testdir = gs_test_get_filename (TESTDATADIR, "app-missing-runtime"); + if (testdir == NULL) + return; + testdir_repourl = g_strdup_printf ("file://%s/repo", testdir); + gs_app_set_kind (app_source, AS_COMPONENT_KIND_REPOSITORY); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "flatpak"); + gs_app_set_management_plugin (app_source, plugin); + gs_app_set_state (app_source, GS_APP_STATE_AVAILABLE); + gs_flatpak_app_set_repo_url (app_source, testdir_repourl); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_INSTALLED); + + /* refresh the appstream metadata */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refresh_metadata_new (G_MAXUINT64, + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* find available application */ + g_object_unref (plugin_job); + + keywords[0] = "Bingo"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (list != NULL); + + /* make sure there is one entry, the flatpak app */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + + /* Install, also installing runtime. This should fail because the + * runtime doesn’t exist. Job failure should be reported as an event. */ + g_object_unref (plugin_job); + events_before = gs_plugin_loader_get_events (plugin_loader); + plugin_job = gs_plugin_job_install_apps_new (list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + events_after = gs_plugin_loader_get_events (plugin_loader); + g_assert_cmpuint (events_after->len, >, events_before->len); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpint (gs_app_get_progress (app), ==, GS_APP_PROGRESS_UNKNOWN); + + /* remove the remote */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_UNAVAILABLE); +} + +static void +update_app_progress_notify_cb (GsApp *app, GParamSpec *pspec, gpointer user_data) +{ + g_debug ("progress now %u%%", gs_app_get_progress (app)); + if (user_data != NULL) { + guint *tmp = (guint *) user_data; + (*tmp)++; + } +} + +static void +update_app_state_notify_cb (GsApp *app, GParamSpec *pspec, gpointer user_data) +{ + GsAppState state = gs_app_get_state (app); + g_debug ("state now %s", gs_app_state_to_string (state)); + if (state == GS_APP_STATE_INSTALLING) { + gboolean *tmp = (gboolean *) user_data; + *tmp = TRUE; + } +} + +static gboolean +update_app_action_delay_cb (gpointer user_data) +{ + GMainLoop *loop = (GMainLoop *) user_data; + g_main_loop_quit (loop); + return FALSE; +} + +static void +update_app_action_finish_sync (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + gboolean ret; + g_autoptr(GError) error = NULL; + ret = gs_plugin_loader_job_action_finish (plugin_loader, res, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_timeout_add_seconds (5, update_app_action_delay_cb, user_data); +} + +static void +gs_plugins_flatpak_runtime_repo_func (GsPluginLoader *plugin_loader) +{ + GsApp *app_source; + GsApp *runtime; + const gchar *fn_ref = "test.flatpakref"; + const gchar *fn_repo = "test.flatpakrepo"; + gboolean ret; + g_autoptr(GFile) fn_repo_file = NULL; + g_autofree gchar *fn_repourl = NULL; + g_autofree gchar *testdir2 = NULL; + g_autofree gchar *testdir2_repourl = NULL; + g_autofree gchar *testdir = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GMainLoop) loop = g_main_loop_new (NULL, FALSE); + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) sources2 = NULL; + g_autoptr(GsAppList) sources = NULL; + g_autoptr(GsAppList) runtime_list = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* write a flatpakrepo file */ + testdir = gs_test_get_filename (TESTDATADIR, "only-runtime"); + if (testdir == NULL) + return; + ret = gs_flatpak_test_write_repo_file (fn_repo, testdir, &fn_repo_file, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* write a flatpakref file */ + fn_repourl = g_file_get_uri (fn_repo_file); + testdir2 = gs_test_get_filename (TESTDATADIR, "app-missing-runtime"); + if (testdir2 == NULL) + return; + testdir2_repourl = g_strdup_printf ("file://%s/repo", testdir2); + ret = gs_flatpak_test_write_ref_file (fn_ref, testdir2_repourl, fn_repourl, &file, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* convert it to a GsApp */ + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (app != NULL); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_true (as_utils_data_id_equal (gs_app_get_unique_id (app), + "user/flatpak/*/org.test.Chiron/master")); + g_assert_true (gs_app_get_local_file (app) != NULL); + + /* get runtime */ + runtime = gs_app_get_runtime (app); + g_assert_cmpstr (gs_app_get_unique_id (runtime), ==, "user/flatpak/test/org.test.Runtime/master"); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_AVAILABLE); + + /* check the number of sources */ + g_object_unref (plugin_job); + query = gs_app_query_new ("is-source", GS_APP_QUERY_TRISTATE_TRUE, NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + sources = gs_plugin_loader_job_process (plugin_loader, plugin_job, + NULL, &error); + g_assert_no_error (error); + g_assert_true (sources != NULL); + g_assert_cmpint (gs_app_list_length (sources), ==, 0); + + /* install, which will install the runtime from the new remote */ + g_object_unref (plugin_job); + list = gs_app_list_new (); + gs_app_list_add (list, app); + plugin_job = gs_plugin_job_install_apps_new (list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + gs_plugin_loader_job_process_async (plugin_loader, plugin_job, + NULL, + update_app_action_finish_sync, + loop); + g_main_loop_run (loop); + gs_test_flush_main_context (); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_INSTALLED); + + /* check the number of sources */ + g_object_unref (plugin_job); + query = gs_app_query_new ("is-source", GS_APP_QUERY_TRISTATE_TRUE, NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + sources2 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (sources2 != NULL); + g_assert_cmpint (gs_app_list_length (sources2), ==, 1); + + /* remove the app */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_uninstall_apps_new (list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UNKNOWN); + + /* remove the runtime */ + g_object_unref (plugin_job); + runtime_list = gs_app_list_new (); + gs_app_list_add (runtime_list, runtime); + plugin_job = gs_plugin_job_uninstall_apps_new (runtime_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_AVAILABLE); + + /* remove the remote */ + app_source = gs_app_list_index (sources2, 0); + g_assert_true (app_source != NULL); + g_assert_cmpstr (gs_app_get_unique_id (app_source), ==, "user/flatpak/*/test/*"); + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_UNAVAILABLE); +} + +/* same as gs_plugins_flatpak_runtime_repo_func, but this time manually + * installing the flatpakrepo BEFORE the flatpakref is installed */ +static void +gs_plugins_flatpak_runtime_repo_redundant_func (GsPluginLoader *plugin_loader) +{ + GsApp *app_source; + GsApp *runtime; + const gchar *fn_ref = "test.flatpakref"; + const gchar *fn_repo = "test.flatpakrepo"; + gboolean ret; + g_autofree gchar *fn_repourl = NULL; + g_autofree gchar *testdir2 = NULL; + g_autofree gchar *testdir2_repourl = NULL; + g_autofree gchar *testdir = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GFile) file_repo = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsApp) app_src = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) sources2 = NULL; + g_autoptr(GsAppList) sources = NULL; + g_autoptr(GsAppList) runtime_list = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* write a flatpakrepo file */ + testdir = gs_test_get_filename (TESTDATADIR, "only-runtime"); + if (testdir == NULL) + return; + ret = gs_flatpak_test_write_repo_file (fn_repo, testdir, &file_repo, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* convert it to a GsApp */ + plugin_job = gs_plugin_job_file_to_app_new (file_repo, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME); + app_src = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (app_src != NULL); + g_assert_cmpint (gs_app_get_kind (app_src), ==, AS_COMPONENT_KIND_REPOSITORY); + g_assert_cmpint (gs_app_get_state (app_src), ==, GS_APP_STATE_AVAILABLE_LOCAL); + g_assert_cmpstr (gs_app_get_id (app_src), ==, "test"); + g_assert_cmpstr (gs_app_get_unique_id (app_src), ==, "user/*/*/test/master"); + g_assert_true (gs_app_get_local_file (app_src) != NULL); + + /* install the source manually */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_src, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL);; + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_src), ==, GS_APP_STATE_INSTALLED); + + /* write a flatpakref file */ + fn_repourl = g_file_get_uri (file_repo); + testdir2 = gs_test_get_filename (TESTDATADIR, "app-missing-runtime"); + if (testdir2 == NULL) + return; + testdir2_repourl = g_strdup_printf ("file://%s/repo", testdir2); + ret = gs_flatpak_test_write_ref_file (fn_ref, testdir2_repourl, fn_repourl, &file, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* convert it to a GsApp */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (app != NULL); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_true (as_utils_data_id_equal (gs_app_get_unique_id (app), + "user/flatpak/*/org.test.Chiron/master")); + g_assert_true (gs_app_get_local_file (app) != NULL); + + /* get runtime */ + runtime = gs_app_get_runtime (app); + g_assert_cmpstr (gs_app_get_unique_id (runtime), ==, "user/flatpak/test/org.test.Runtime/master"); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_AVAILABLE); + + /* check the number of sources */ + g_object_unref (plugin_job); + query = gs_app_query_new ("is-source", GS_APP_QUERY_TRISTATE_TRUE, NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + sources = gs_plugin_loader_job_process (plugin_loader, plugin_job, + NULL, &error); + g_assert_no_error (error); + g_assert_true (sources != NULL); + g_assert_cmpint (gs_app_list_length (sources), ==, 1); /* repo */ + + /* install, which will NOT install the runtime from the RuntimeRemote, + * but from the existing test repo */ + g_object_unref (plugin_job); + list = gs_app_list_new (); + gs_app_list_add (list, app); + plugin_job = gs_plugin_job_install_apps_new (list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_INSTALLED); + + /* check the number of sources */ + g_object_unref (plugin_job); + query = gs_app_query_new ("is-source", GS_APP_QUERY_TRISTATE_TRUE, NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + sources2 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (sources2 != NULL); + + /* remove the app */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_uninstall_apps_new (list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UNKNOWN); + + /* remove the runtime */ + g_object_unref (plugin_job); + runtime_list = gs_app_list_new (); + gs_app_list_add (runtime_list, runtime); + plugin_job = gs_plugin_job_uninstall_apps_new (runtime_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_AVAILABLE); + + /* remove the remote */ + app_source = gs_app_list_index (sources2, 0); + g_assert_true (app_source != NULL); + g_assert_cmpstr (gs_app_get_unique_id (app_source), ==, "user/flatpak/*/test/*"); + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_UNAVAILABLE); +} + +static void +gs_plugins_flatpak_broken_remote_func (GsPluginLoader *plugin_loader) +{ + gboolean ret; + const gchar *fn = "test.flatpakref"; + const gchar *fn_repo = "test.flatpakrepo"; + g_autoptr(GFile) fn_repo_file = NULL; + g_autofree gchar *fn_repourl = NULL; + g_autofree gchar *testdir2 = NULL; + g_autofree gchar *testdir2_repourl = NULL; + g_autofree gchar *testdir = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsApp) app_source = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPlugin *plugin; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* no flatpak, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "flatpak")) + return; + + /* add a remote with only the runtime in */ + app_source = gs_flatpak_app_new ("test"); + testdir = gs_test_get_filename (TESTDATADIR, "only-runtime"); + if (testdir == NULL) + return; + gs_app_set_kind (app_source, AS_COMPONENT_KIND_REPOSITORY); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "flatpak"); + gs_app_set_management_plugin (app_source, plugin); + gs_app_set_state (app_source, GS_APP_STATE_AVAILABLE); + gs_flatpak_app_set_repo_url (app_source, "file:///wont/work"); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_INSTALLED); + + /* write a flatpakrepo file (the flatpakref below must have a RuntimeRepo= + * to avoid a warning) */ + testdir2 = gs_test_get_filename (TESTDATADIR, "app-with-runtime"); + if (testdir2 == NULL) + return; + ret = gs_flatpak_test_write_repo_file (fn_repo, testdir2, &fn_repo_file, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* write a flatpakref file */ + fn_repourl = g_file_get_uri (fn_repo_file); + testdir2_repourl = g_strdup_printf ("file://%s/repo", testdir2); + ret = gs_flatpak_test_write_ref_file (fn, testdir2_repourl, fn_repourl, &file, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* convert it to a GsApp */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (app != NULL); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_true (as_utils_data_id_equal (gs_app_get_unique_id (app), + "user/flatpak/test/org.test.Chiron/master")); + g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, "http://127.0.0.1/"); + g_assert_cmpstr (gs_app_get_name (app), ==, "Chiron"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "Single line synopsis"); + g_assert_cmpstr (gs_app_get_description (app), ==, "Long description."); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + g_assert_true (gs_app_get_local_file (app) != NULL); + + /* remove source */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); +} + +static void +flatpak_bundle_or_ref_helper (GsPluginLoader *plugin_loader, + gboolean is_bundle) +{ + GsApp *app_tmp; + GsApp *runtime; + gboolean ret; + GsPluginRefineFlags refine_flags; + g_autofree gchar *fn = NULL; + g_autofree gchar *testdir = NULL; + g_autofree gchar *testdir_repourl = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsApp) app2 = NULL; + g_autoptr(GsApp) app_source = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) search1 = NULL; + g_autoptr(GsAppList) search2 = NULL; + g_autoptr(GsAppList) sources = NULL; + g_autoptr(GsAppList) app_list = NULL; + g_autoptr(GsAppList) app2_list = NULL; + g_autoptr(GsAppList) runtime_list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPlugin *plugin; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* no flatpak, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "flatpak")) + return; + + /* add a remote with only the runtime in */ + app_source = gs_flatpak_app_new ("test"); + testdir = gs_test_get_filename (TESTDATADIR, "only-runtime"); + if (testdir == NULL) + return; + testdir_repourl = g_strdup_printf ("file://%s/repo", testdir); + gs_app_set_kind (app_source, AS_COMPONENT_KIND_REPOSITORY); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "flatpak"); + gs_app_set_management_plugin (app_source, plugin); + gs_app_set_state (app_source, GS_APP_STATE_AVAILABLE); + gs_flatpak_app_set_repo_url (app_source, testdir_repourl); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_INSTALLED); + + /* refresh the appstream metadata */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refresh_metadata_new (0, + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* find available application */ + g_object_unref (plugin_job); + + keywords[0] = "runtime"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (list != NULL); + + /* make sure there is one entry, the flatpak runtime */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + runtime = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (runtime), ==, "org.test.Runtime"); + g_assert_cmpstr (gs_app_get_unique_id (runtime), ==, "user/flatpak/test/org.test.Runtime/master"); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_AVAILABLE); + + /* install the runtime ahead of time */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_install_apps_new (list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_INSTALLED); + + if (is_bundle) { + /* find the flatpak bundle file */ + fn = gs_test_get_filename (TESTDATADIR, "chiron.flatpak"); + g_assert_true (fn != NULL); + file = g_file_new_for_path (fn); + refine_flags = GS_PLUGIN_REFINE_FLAGS_NONE; + } else { + const gchar *fn_repo = "test.flatpakrepo"; + g_autoptr(GFile) fn_repo_file = NULL; + g_autofree gchar *fn_repourl = NULL; + g_autofree gchar *testdir2 = NULL; + g_autofree gchar *testdir2_repourl = NULL; + + /* write a flatpakrepo file (the flatpakref below must have a RuntimeRepo= + * to avoid a warning) */ + testdir2 = gs_test_get_filename (TESTDATADIR, "app-with-runtime"); + if (testdir2 == NULL) + return; + ret = gs_flatpak_test_write_repo_file (fn_repo, testdir2, &fn_repo_file, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* write a flatpakref file */ + fn_repourl = g_file_get_uri (fn_repo_file); + testdir2_repourl = g_strdup_printf ("file://%s/repo", testdir2); + fn = g_strdup ("test.flatpakref"); + ret = gs_flatpak_test_write_ref_file (fn, testdir2_repourl, fn_repourl, &file, &error); + g_assert_no_error (error); + g_assert_true (ret); + + refine_flags = GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME; + } + + /* Wait for the flatpak changes to be delivered through the file + monitor notifications, which will cleanup plugin cache. */ + g_usleep (G_USEC_PER_SEC); + + /* convert it to a GsApp */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, refine_flags); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (app != NULL); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_cmpstr (gs_app_get_name (app), ==, "Chiron"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "Single line synopsis"); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + g_assert_true (gs_app_get_local_file (app) != NULL); + if (is_bundle) { + /* Note: The origin is set to "flatpak" here because an origin remote + * won't be created until the app is installed. + */ + g_assert_true (as_utils_data_id_equal (gs_app_get_unique_id (app), + "user/flatpak/flatpak/org.test.Chiron/master")); + g_assert_true (gs_flatpak_app_get_file_kind (app) == GS_FLATPAK_APP_FILE_KIND_BUNDLE); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE_LOCAL); + } else { + g_assert_true (as_utils_data_id_equal (gs_app_get_unique_id (app), + "user/flatpak/test/org.test.Chiron/master")); + g_assert_true (gs_flatpak_app_get_file_kind (app) == GS_FLATPAK_APP_FILE_KIND_REF); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, "http://127.0.0.1/"); + g_assert_cmpstr (gs_app_get_description (app), ==, "Long description."); + } + + /* get runtime */ + runtime = gs_app_get_runtime (app); + g_assert_cmpstr (gs_app_get_unique_id (runtime), ==, "user/flatpak/test/org.test.Runtime/master"); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_INSTALLED); + + /* install */ + g_object_unref (plugin_job); + app_list = gs_app_list_new (); + gs_app_list_add (app_list, app); + plugin_job = gs_plugin_job_install_apps_new (app_list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + g_assert_cmpstr (gs_app_get_update_version (app), ==, NULL); + g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, NULL); + + /* search for the application */ + g_object_unref (plugin_job); + + keywords[0] = "chiron"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + search1 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (search1 != NULL); + g_assert_cmpint (gs_app_list_length (search1), ==, 1); + app_tmp = gs_app_list_index (search1, 0); + g_assert_cmpstr (gs_app_get_id (app_tmp), ==, "org.test.Chiron"); + + /* convert it to a GsApp again, and get the installed thing */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + gs_plugin_job_set_refine_flags (plugin_job, GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME); + app2 = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (app2 != NULL); + g_assert_cmpint (gs_app_get_state (app2), ==, GS_APP_STATE_INSTALLED); + if (is_bundle) { + g_assert_true (as_utils_data_id_equal (gs_app_get_unique_id (app2), + "user/flatpak/chiron-origin/org.test.Chiron/master")); + } else { + /* Note: the origin is now test-1 because that remote was created from the + * RuntimeRepo= setting + */ + g_assert_true (as_utils_data_id_equal (gs_app_get_unique_id (app2), + "user/flatpak/test-1/org.test.Chiron/master")); + } + + /* remove app */ + g_object_unref (plugin_job); + app2_list = gs_app_list_new (); + gs_app_list_add (app2_list, app2); + plugin_job = gs_plugin_job_uninstall_apps_new (app2_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* remove runtime */ + g_object_unref (plugin_job); + runtime_list = gs_app_list_new (); + gs_app_list_add (runtime_list, runtime); + plugin_job = gs_plugin_job_uninstall_apps_new (runtime_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* remove source */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + if (!is_bundle) { + /* remove remote added by RuntimeRepo= in flatpakref */ + g_autoptr(GsApp) runtime_source = gs_flatpak_app_new ("test-1"); + gs_app_set_kind (runtime_source, AS_COMPONENT_KIND_REPOSITORY); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "flatpak"); + gs_app_set_management_plugin (runtime_source, plugin); + gs_app_set_state (runtime_source, GS_APP_STATE_INSTALLED); + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (runtime_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + } + + /* there should be no sources now */ + g_object_unref (plugin_job); + query = gs_app_query_new ("is-source", GS_APP_QUERY_TRISTATE_TRUE, NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + sources = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (sources != NULL); + g_assert_cmpint (gs_app_list_length (sources), ==, 0); + + /* there should be no matches now */ + g_object_unref (plugin_job); + + keywords[0] = "chiron"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + search2 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (search2 != NULL); + g_assert_cmpint (gs_app_list_length (search2), ==, 0); +} + +static void +gs_plugins_flatpak_ref_func (GsPluginLoader *plugin_loader) +{ + flatpak_bundle_or_ref_helper (plugin_loader, FALSE); +} + +static void +gs_plugins_flatpak_bundle_func (GsPluginLoader *plugin_loader) +{ + flatpak_bundle_or_ref_helper (plugin_loader, TRUE); +} + +static void +gs_plugins_flatpak_count_signal_cb (GsPluginLoader *plugin_loader, guint *cnt) +{ + if (cnt != NULL) + (*cnt)++; +} + +static void +gs_plugins_flatpak_app_update_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + GsApp *app_tmp; + GsApp *runtime; + gboolean got_progress_installing = FALSE; + gboolean ret; + guint notify_progress_id; + guint notify_state_id; + guint pending_app_changed_cnt = 0; + guint pending_apps_changed_id; + guint progress_cnt = 0; + guint updates_changed_cnt = 0; + guint updates_changed_id; + g_autofree gchar *repodir1_fn = NULL; + g_autofree gchar *repodir2_fn = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app_source = NULL; + g_autoptr(GsApp) old_runtime = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) list_updates = NULL; + g_autoptr(GsAppList) old_runtime_list = NULL; + g_autoptr(GsAppList) runtime_list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GMainLoop) loop = g_main_loop_new (NULL, FALSE); + g_autofree gchar *repo_path = NULL; + g_autofree gchar *repo_url = NULL; + GsPlugin *plugin; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + g_autoptr(GsAppList) update_apps_list = NULL; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* no flatpak, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "flatpak")) + return; + + /* no files to use */ + repodir1_fn = gs_test_get_filename (TESTDATADIR, "app-with-runtime/repo"); + if (repodir1_fn == NULL || + !g_file_test (repodir1_fn, G_FILE_TEST_EXISTS)) { + g_test_skip ("no flatpak test repo"); + return; + } + repodir2_fn = gs_test_get_filename (TESTDATADIR, "app-update/repo"); + if (repodir2_fn == NULL || + !g_file_test (repodir2_fn, G_FILE_TEST_EXISTS)) { + g_test_skip ("no flatpak test repo"); + return; + } + + /* add indirection so we can switch this after install */ + repo_path = g_build_filename (g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR"), "repo", NULL); + unlink (repo_path); + g_assert_true (symlink (repodir1_fn, repo_path) == 0); + + /* add a remote */ + app_source = gs_flatpak_app_new ("test"); + gs_app_set_kind (app_source, AS_COMPONENT_KIND_REPOSITORY); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "flatpak"); + gs_app_set_management_plugin (app_source, plugin); + gs_app_set_state (app_source, GS_APP_STATE_AVAILABLE); + repo_url = g_strdup_printf ("file://%s", repo_path); + gs_flatpak_app_set_repo_url (app_source, repo_url); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_INSTALLED); + + /* refresh the appstream metadata */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refresh_metadata_new (G_MAXUINT64, + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + + /* find available application */ + g_object_unref (plugin_job); + + keywords[0] = "Bingo"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (list != NULL); + + /* make sure there is one entry, the flatpak app */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + + /* install, also installing runtime */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_install_apps_new (list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + g_assert_cmpstr (gs_app_get_update_version (app), ==, NULL); + g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, NULL); + + /* switch to the new repo */ + g_assert_true (unlink (repo_path) == 0); + g_assert_true (symlink (repodir2_fn, repo_path) == 0); + + /* refresh the appstream metadata */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refresh_metadata_new (0, /* force now */ + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* get the updates list */ + g_object_unref (plugin_job); + query = gs_app_query_new ("is-for-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + list_updates = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (list_updates != NULL); + + /* make sure there is one entry */ + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + for (guint i = 0; i < gs_app_list_length (list_updates); i++) { + app_tmp = gs_app_list_index (list_updates, i); + g_debug ("got update %s", gs_app_get_unique_id (app_tmp)); + } + + /* check that the runtime is not the update's one */ + old_runtime = gs_app_get_runtime (app); + g_assert_true (old_runtime != NULL); + g_object_ref (old_runtime); + g_assert_cmpstr (gs_app_get_branch (old_runtime), !=, "new_master"); + + /* use the returned app, which can be a different object instance from previously */ + app = gs_app_list_lookup (list_updates, "*/flatpak/test/org.test.Chiron/*"); + g_assert_nonnull (app); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE_LIVE); + g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, "Version 1.2.4:\nThis is best."); + g_assert_cmpstr (gs_app_get_update_version (app), ==, "1.2.4"); + + /* care about signals */ + pending_apps_changed_id = + g_signal_connect (plugin_loader, "pending-apps-changed", + G_CALLBACK (gs_plugins_flatpak_count_signal_cb), + &pending_app_changed_cnt); + updates_changed_id = + g_signal_connect (plugin_loader, "updates-changed", + G_CALLBACK (gs_plugins_flatpak_count_signal_cb), + &updates_changed_cnt); + notify_state_id = + g_signal_connect (app, "notify::state", + G_CALLBACK (update_app_state_notify_cb), + &got_progress_installing); + notify_progress_id = + g_signal_connect (app, "notify::progress", + G_CALLBACK (update_app_progress_notify_cb), + &progress_cnt); + + /* use a mainloop so we get the events in the default context */ + g_object_unref (plugin_job); + update_apps_list = gs_app_list_new (); + gs_app_list_add (update_apps_list, app); + plugin_job = gs_plugin_job_update_apps_new (update_apps_list, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD); + gs_plugin_loader_job_process_async (plugin_loader, plugin_job, + NULL, + update_app_action_finish_sync, + loop); + g_main_loop_run (loop); + gs_test_flush_main_context (); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.4"); + g_assert_cmpstr (gs_app_get_update_version (app), ==, NULL); + g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, NULL); + g_assert_true (gs_app_get_progress (app) == GS_APP_PROGRESS_UNKNOWN || + gs_app_get_progress (app) == 100); + g_assert_true (got_progress_installing); + //g_assert_cmpint (progress_cnt, >, 20); //FIXME: bug in OSTree + g_assert_cmpint (pending_app_changed_cnt, ==, 0); + g_assert_cmpint (updates_changed_cnt, ==, 1); + + /* check that the app's runtime has changed */ + runtime = gs_app_get_runtime (app); + g_assert_true (runtime != NULL); + g_assert_cmpstr (gs_app_get_unique_id (runtime), ==, "user/flatpak/test/org.test.Runtime/new_master"); + g_assert_true (old_runtime != runtime); + g_assert_cmpstr (gs_app_get_branch (runtime), ==, "new_master"); + g_assert_true (gs_app_get_state (runtime) == GS_APP_STATE_INSTALLED); + + /* no longer care */ + g_signal_handler_disconnect (plugin_loader, pending_apps_changed_id); + g_signal_handler_disconnect (plugin_loader, updates_changed_id); + g_signal_handler_disconnect (app, notify_state_id); + g_signal_handler_disconnect (app, notify_progress_id); + + /* remove the app */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_uninstall_apps_new (update_apps_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* remove the old_runtime */ + g_assert_cmpstr (gs_app_get_unique_id (old_runtime), ==, "user/flatpak/test/org.test.Runtime/master"); + g_object_unref (plugin_job); + old_runtime_list = gs_app_list_new (); + gs_app_list_add (old_runtime_list, old_runtime); + plugin_job = gs_plugin_job_uninstall_apps_new (old_runtime_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + + /* remove the runtime */ + g_assert_cmpstr (gs_app_get_unique_id (runtime), ==, "user/flatpak/test/org.test.Runtime/new_master"); + g_object_unref (plugin_job); + runtime_list = gs_app_list_new (); + gs_app_list_add (runtime_list, runtime); + plugin_job = gs_plugin_job_uninstall_apps_new (runtime_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + + /* remove the remote */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_UNAVAILABLE); + + /* to not have deleted the "flatpak/tests/app-update/repo" content */ + unlink (repo_path); +} + +static void +gs_plugins_flatpak_runtime_extension_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + GsApp *runtime; + GsApp *app_tmp; + gboolean got_progress_installing = FALSE; + gboolean ret; + guint notify_progress_id; + guint notify_state_id; + guint pending_app_changed_cnt = 0; + guint pending_apps_changed_id; + guint progress_cnt = 0; + guint updates_changed_cnt = 0; + guint updates_changed_id; + g_autofree gchar *repodir1_fn = NULL; + g_autofree gchar *repodir2_fn = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app_source = NULL; + g_autoptr(GsApp) extension = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) list_updates = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GMainLoop) loop = g_main_loop_new (NULL, FALSE); + g_autofree gchar *repo_path = NULL; + g_autofree gchar *repo_url = NULL; + GsPlugin *plugin; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + g_autoptr(GsAppList) update_apps_list = NULL; + g_autoptr(GsAppList) runtime_list = NULL; + + /* drop all caches */ + gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL); + gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL); + + /* no flatpak, abort */ + g_assert_true (gs_plugin_loader_get_enabled (plugin_loader, "flatpak")); + + /* no files to use */ + repodir1_fn = gs_test_get_filename (TESTDATADIR, "app-extension/repo"); + if (repodir1_fn == NULL || + !g_file_test (repodir1_fn, G_FILE_TEST_EXISTS)) { + g_test_skip ("no flatpak test repo"); + return; + } + repodir2_fn = gs_test_get_filename (TESTDATADIR, "app-extension-update/repo"); + if (repodir2_fn == NULL || + !g_file_test (repodir2_fn, G_FILE_TEST_EXISTS)) { + g_test_skip ("no flatpak test repo"); + return; + } + + /* add indirection so we can switch this after install */ + repo_path = g_build_filename (g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR"), "repo", NULL); + g_assert_cmpint (symlink (repodir1_fn, repo_path), ==, 0); + + /* add a remote */ + app_source = gs_flatpak_app_new ("test"); + gs_app_set_kind (app_source, AS_COMPONENT_KIND_REPOSITORY); + plugin = gs_plugin_loader_find_plugin (plugin_loader, "flatpak"); + gs_app_set_management_plugin (app_source, plugin); + gs_app_set_state (app_source, GS_APP_STATE_AVAILABLE); + repo_url = g_strdup_printf ("file://%s", repo_path); + gs_flatpak_app_set_repo_url (app_source, repo_url); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_INSTALLED); + + /* refresh the appstream metadata */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refresh_metadata_new (G_MAXUINT64, + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + + /* find available application */ + g_object_unref (plugin_job); + + keywords[0] = "Bingo"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_nonnull (list); + + /* make sure there is one entry, the flatpak app */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + + /* install, also installing runtime and suggested extensions */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_install_apps_new (list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + + /* check if the extension was installed */ + extension = gs_plugin_loader_app_create (plugin_loader, + "user/flatpak/*/org.test.Chiron.Extension/master", + NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_nonnull (extension); + + g_assert_cmpint (gs_app_get_state (extension), ==, GS_APP_STATE_INSTALLED); + + /* switch to the new repo (to get the update) */ + g_assert_cmpint (unlink (repo_path), ==, 0); + g_assert_cmpint (symlink (repodir2_fn, repo_path), ==, 0); + + /* refresh the appstream metadata */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_refresh_metadata_new (0, /* force now */ + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* get the updates list */ + g_object_unref (plugin_job); + query = gs_app_query_new ("is-for-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + list_updates = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_nonnull (list_updates); + + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + for (guint i = 0; i < gs_app_list_length (list_updates); i++) { + app_tmp = gs_app_list_index (list_updates, i); + g_debug ("got update %s", gs_app_get_unique_id (app_tmp)); + } + + /* check that the extension has no update */ + app_tmp = gs_app_list_lookup (list_updates, "*/flatpak/test/org.test.Chiron.Extension/*"); + g_assert_null (app_tmp); + + /* check that the app has an update (it's affected by the extension's update) */ + app = gs_app_list_lookup (list_updates, "*/flatpak/test/org.test.Chiron/*"); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE_LIVE); + + /* care about signals */ + pending_apps_changed_id = + g_signal_connect (plugin_loader, "pending-apps-changed", + G_CALLBACK (gs_plugins_flatpak_count_signal_cb), + &pending_app_changed_cnt); + updates_changed_id = + g_signal_connect (plugin_loader, "updates-changed", + G_CALLBACK (gs_plugins_flatpak_count_signal_cb), + &updates_changed_cnt); + notify_state_id = + g_signal_connect (app, "notify::state", + G_CALLBACK (update_app_state_notify_cb), + &got_progress_installing); + notify_progress_id = + g_signal_connect (app, "notify::progress", + G_CALLBACK (update_app_progress_notify_cb), + &progress_cnt); + + /* use a mainloop so we get the events in the default context */ + g_object_unref (plugin_job); + update_apps_list = gs_app_list_new (); + gs_app_list_add (update_apps_list, app); + plugin_job = gs_plugin_job_update_apps_new (update_apps_list, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD); + gs_plugin_loader_job_process_async (plugin_loader, plugin_job, + NULL, + update_app_action_finish_sync, + loop); + g_main_loop_run (loop); + gs_test_flush_main_context (); + + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.2.3"); + g_assert_true (got_progress_installing); + g_assert_cmpint (pending_app_changed_cnt, ==, 0); + + /* The install refreshes GsApp-s cache, thus re-get the extension */ + g_clear_object (&extension); + extension = gs_plugin_loader_app_create (plugin_loader, + "user/flatpak/*/org.test.Chiron.Extension/master", + NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_nonnull (extension); + + /* check the extension's state after the update */ + g_assert_cmpint (gs_app_get_state (extension), ==, GS_APP_STATE_INSTALLED); + + /* no longer care */ + g_signal_handler_disconnect (plugin_loader, pending_apps_changed_id); + g_signal_handler_disconnect (plugin_loader, updates_changed_id); + g_signal_handler_disconnect (app, notify_state_id); + g_signal_handler_disconnect (app, notify_progress_id); + + g_clear_object (&list); + /* Reload the 'app', as it could change due to repo change */ + g_object_unref (plugin_job); + + keywords[0] = "Bingo"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + g_clear_object (&query); + + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_nonnull (list); + + /* make sure there is one entry, the flatpak app */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "org.test.Chiron"); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + + /* getting the runtime for later removal */ + runtime = gs_app_get_runtime (app); + g_assert_nonnull (runtime); + + /* remove the app */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_uninstall_apps_new (list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* remove the runtime */ + g_object_unref (plugin_job); + runtime_list = gs_app_list_new (); + gs_app_list_add (runtime_list, runtime); + plugin_job = gs_plugin_job_uninstall_apps_new (runtime_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (runtime), ==, GS_APP_STATE_AVAILABLE); + + /* remove the remote */ + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_manage_repository_new (app_source, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpint (gs_app_get_state (app_source), ==, GS_APP_STATE_UNAVAILABLE); + + /* verify that the extension has been removed by the app's removal */ + g_assert_false (gs_app_is_installed (extension)); +} + +int +main (int argc, char **argv) +{ + g_autofree gchar *tmp_root = NULL; + gboolean ret; + int retval; + g_autofree gchar *xml = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + + /* While we use %G_TEST_OPTION_ISOLATE_DIRS to create temporary directories + * for each of the tests, we want to use the system MIME registry, assuming + * that it exists and correctly has shared-mime-info installed. */ + g_content_type_set_mime_dirs (NULL); + + /* Similarly, add the system-wide icon theme path before it’s + * overwritten by %G_TEST_OPTION_ISOLATE_DIRS. */ + gs_test_expose_icon_theme_paths (); + + gs_test_init (&argc, &argv); + g_setenv ("GS_XMLB_VERBOSE", "1", TRUE); + g_setenv ("GS_SELF_TEST_PLUGIN_ERROR_FAIL_HARD", "1", TRUE); + + /* Use a common cache directory for all tests, since the appstream + * plugin uses it and cannot be reinitialised for each test. */ + tmp_root = g_dir_make_tmp ("gnome-software-flatpak-test-XXXXXX", NULL); + g_assert_true (tmp_root != NULL); + g_setenv ("GS_SELF_TEST_CACHEDIR", tmp_root, TRUE); + g_setenv ("GS_SELF_TEST_FLATPAK_DATADIR", tmp_root, TRUE); + + /* allow dist'ing with no gnome-software installed */ + if (g_getenv ("GS_SELF_TEST_SKIP_ALL") != NULL) + return 0; + + xml = g_strdup ("\n" + "\n" + " \n" + " zeus.desktop\n" + " Zeus\n" + " A teaching application\n" + " \n" + "\n"); + g_setenv ("GS_SELF_TEST_APPSTREAM_XML", xml, TRUE); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR_CORE); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/flatpak/app-with-runtime", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_app_with_runtime_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/app-missing-runtime", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_app_missing_runtime_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/ref", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_ref_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/bundle", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_bundle_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/broken-remote", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_broken_remote_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/runtime-repo", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_runtime_repo_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/runtime-repo-redundant", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_runtime_repo_redundant_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/app-runtime-extension", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_runtime_extension_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/app-update-runtime", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_app_update_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/repo", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_repo_func); + g_test_add_data_func ("/gnome-software/plugins/flatpak/repo{non-ascii}", + plugin_loader, + (GTestDataFunc) gs_plugins_flatpak_repo_non_ascii_func); + retval = g_test_run (); + + /* Clean up. */ + gs_utils_rmtree (tmp_root, NULL); + + return retval; +} diff --git a/plugins/flatpak/meson.build b/plugins/flatpak/meson.build new file mode 100644 index 0000000..d0b71f7 --- /dev/null +++ b/plugins/flatpak/meson.build @@ -0,0 +1,59 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginFlatpak"'] +deps = [ + plugin_libs, + flatpak, + libxmlb, + ostree, +] + +if get_option('mogwai') + deps += mogwai_schedule_client +endif + +shared_module( + 'gs_plugin_flatpak', + sources : [ + 'gs-flatpak-app.c', + 'gs-flatpak.c', + 'gs-flatpak-transaction.c', + 'gs-flatpak-utils.c', + 'gs-plugin-flatpak.c' + ], + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : deps, +) +metainfo = 'org.gnome.Software.Plugin.Flatpak.metainfo.xml' + +i18n.merge_file( + input: metainfo + '.in', + output: metainfo, + type: 'xml', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'metainfo') +) + +if get_option('tests') + subdir('tests') + + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] + cargs += ['-DLOCALPLUGINDIR_CORE="' + meson.current_build_dir() + '/../core"'] + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_build_dir(), 'tests') + '"'] + e = executable( + 'gs-self-test-flatpak', + compiled_schemas, + sources : [ + 'gs-flatpak-app.c', + 'gs-self-test.c' + ], + dependencies : deps, + c_args : cargs, + ) + test('gs-self-test-flatpak', e, suite: ['plugins', 'flatpak'], env: test_env, timeout : 120) +endif diff --git a/plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in b/plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in new file mode 100644 index 0000000..7c635d9 --- /dev/null +++ b/plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in @@ -0,0 +1,12 @@ + + + + org.gnome.Software.Plugin.Flatpak + org.gnome.Software.desktop + Flatpak Support + Flatpak is a framework for desktop apps on Linux + http://flatpak.org/ + CC0-1.0 + GPL-2.0-or-later + richard_at_hughsie.com + diff --git a/plugins/flatpak/tests/app-extension-update/.gitignore b/plugins/flatpak/tests/app-extension-update/.gitignore new file mode 100644 index 0000000..f606d5e --- /dev/null +++ b/plugins/flatpak/tests/app-extension-update/.gitignore @@ -0,0 +1 @@ +repo diff --git a/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/.gitignore b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/.gitignore new file mode 100644 index 0000000..db00ec8 --- /dev/null +++ b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/.gitignore @@ -0,0 +1 @@ +files/share/app-info diff --git a/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/.empty b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/.empty new file mode 100644 index 0000000..e69de29 diff --git a/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/libtest/README b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/libtest/README new file mode 100644 index 0000000..a0b9703 --- /dev/null +++ b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/libtest/README @@ -0,0 +1 @@ +UPDATED! \ No newline at end of file diff --git a/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml new file mode 100644 index 0000000..9d55228 --- /dev/null +++ b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml @@ -0,0 +1,12 @@ + + + + org.test.Chiron.Extension + CC0 + GPL-2.0-or-later + Chiron App Extension + Test extension for flatpak self tests + + diff --git a/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/metadata b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/metadata new file mode 100644 index 0000000..d81f8f9 --- /dev/null +++ b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/metadata @@ -0,0 +1,6 @@ +[Runtime] +name=org.test.Chiron.Extension +sdk=org.test.Runtime/x86_64/master + +[ExtensionOf] +ref=app/org.test.Chiron/x86_64/master diff --git a/plugins/flatpak/tests/app-extension/.gitignore b/plugins/flatpak/tests/app-extension/.gitignore new file mode 100644 index 0000000..f606d5e --- /dev/null +++ b/plugins/flatpak/tests/app-extension/.gitignore @@ -0,0 +1 @@ +repo diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/.gitignore b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/.gitignore new file mode 100644 index 0000000..db00ec8 --- /dev/null +++ b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/.gitignore @@ -0,0 +1 @@ +files/share/app-info diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/.empty b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/.empty new file mode 100644 index 0000000..e69de29 diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/libtest/README b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/libtest/README new file mode 100644 index 0000000..e69de29 diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml new file mode 100644 index 0000000..9d55228 --- /dev/null +++ b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml @@ -0,0 +1,12 @@ + + + + org.test.Chiron.Extension + CC0 + GPL-2.0-or-later + Chiron App Extension + Test extension for flatpak self tests + + diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/metadata b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/metadata new file mode 100644 index 0000000..d81f8f9 --- /dev/null +++ b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/metadata @@ -0,0 +1,6 @@ +[Runtime] +name=org.test.Chiron.Extension +sdk=org.test.Runtime/x86_64/master + +[ExtensionOf] +ref=app/org.test.Chiron/x86_64/master diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron/.gitignore b/plugins/flatpak/tests/app-extension/org.test.Chiron/.gitignore new file mode 100644 index 0000000..fea15c0 --- /dev/null +++ b/plugins/flatpak/tests/app-extension/org.test.Chiron/.gitignore @@ -0,0 +1,2 @@ +export +files/share/app-info diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron/files/bin/chiron.sh b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/bin/chiron.sh new file mode 100755 index 0000000..e61d501 --- /dev/null +++ b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/bin/chiron.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo "Hello world" diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml new file mode 100644 index 0000000..0b0e88a --- /dev/null +++ b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml @@ -0,0 +1,16 @@ + + + + org.test.Chiron.desktop + CC0-1.0 + GPL-2.0-or-later + Chiron + Single line synopsis +

        Long description.

        + http://127.0.0.1/ + + +

        This is better.

        +
        +
        +
        diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/applications/org.test.Chiron.desktop b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/applications/org.test.Chiron.desktop new file mode 100644 index 0000000..2fbdf95 --- /dev/null +++ b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/applications/org.test.Chiron.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=Chiron +Exec=chiron.sh +Icon=org.test.Chiron +Keywords=Bingo; diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png new file mode 100644 index 0000000000000000000000000000000000000000..0c38f2f6f9ca4ac9aa99df4e4832b7e0d1741a78 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRdwroCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#0V}tF8Ph)3S5-hE+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9VmXp)5S5Q;?~=XhKvjh9ES}K?0>Gv+!x|>+0(1MmlY_)z`)3$z`(!)a*F^10~3P- gWrEZ)2jL9)sDw1;zZt@BS1|yAr>mdKI;Vst03LHR#Q*>R literal 0 HcmV?d00001 diff --git a/plugins/flatpak/tests/app-extension/org.test.Chiron/metadata b/plugins/flatpak/tests/app-extension/org.test.Chiron/metadata new file mode 100644 index 0000000..45b76d6 --- /dev/null +++ b/plugins/flatpak/tests/app-extension/org.test.Chiron/metadata @@ -0,0 +1,10 @@ +[Application] +name=org.test.Chiron +runtime=org.test.Runtime/x86_64/master +command=chiron.sh + +[Extension org.test.Chiron.Extension] +directory=share/extension +subdirectories=true +version=master +autodelete=true diff --git a/plugins/flatpak/tests/app-missing-runtime/.gitignore b/plugins/flatpak/tests/app-missing-runtime/.gitignore new file mode 100644 index 0000000..f606d5e --- /dev/null +++ b/plugins/flatpak/tests/app-missing-runtime/.gitignore @@ -0,0 +1 @@ +repo diff --git a/plugins/flatpak/tests/app-missing-runtime/org.test.Chiron b/plugins/flatpak/tests/app-missing-runtime/org.test.Chiron new file mode 120000 index 0000000..d9384e4 --- /dev/null +++ b/plugins/flatpak/tests/app-missing-runtime/org.test.Chiron @@ -0,0 +1 @@ +../app-with-runtime/org.test.Chiron/ \ No newline at end of file diff --git a/plugins/flatpak/tests/app-update/.gitignore b/plugins/flatpak/tests/app-update/.gitignore new file mode 100644 index 0000000..f606d5e --- /dev/null +++ b/plugins/flatpak/tests/app-update/.gitignore @@ -0,0 +1 @@ +repo diff --git a/plugins/flatpak/tests/app-update/org.test.Chiron/.gitignore b/plugins/flatpak/tests/app-update/org.test.Chiron/.gitignore new file mode 100644 index 0000000..fea15c0 --- /dev/null +++ b/plugins/flatpak/tests/app-update/org.test.Chiron/.gitignore @@ -0,0 +1,2 @@ +export +files/share/app-info diff --git a/plugins/flatpak/tests/app-update/org.test.Chiron/files/bin/chiron.sh b/plugins/flatpak/tests/app-update/org.test.Chiron/files/bin/chiron.sh new file mode 100644 index 0000000..dfed21c --- /dev/null +++ b/plugins/flatpak/tests/app-update/org.test.Chiron/files/bin/chiron.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo "Hello world, with upgrades" diff --git a/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml b/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml new file mode 100644 index 0000000..af2c31c --- /dev/null +++ b/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml @@ -0,0 +1,19 @@ + + + + org.test.Chiron + CC0-1.0 + GPL-2.0-or-later + Chiron + Single line synopsis +

        Long description.

        + http://127.0.0.1/ + + +

        This is best.

        +
        + +

        This is better.

        +
        +
        +
        diff --git a/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/applications/org.test.Chiron.desktop b/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/applications/org.test.Chiron.desktop new file mode 120000 index 0000000..2b06818 --- /dev/null +++ b/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/applications/org.test.Chiron.desktop @@ -0,0 +1 @@ +../../../../../app-missing-runtime/org.test.Chiron/files/share/applications/org.test.Chiron.desktop \ No newline at end of file diff --git a/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png b/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png new file mode 120000 index 0000000..9c37986 --- /dev/null +++ b/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png @@ -0,0 +1 @@ +../../../../../../../../app-missing-runtime/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png \ No newline at end of file diff --git a/plugins/flatpak/tests/app-update/org.test.Chiron/metadata b/plugins/flatpak/tests/app-update/org.test.Chiron/metadata new file mode 100644 index 0000000..1de0ab8 --- /dev/null +++ b/plugins/flatpak/tests/app-update/org.test.Chiron/metadata @@ -0,0 +1,4 @@ +[Application] +name=org.test.Chiron +runtime=org.test.Runtime/x86_64/new_master +command=chiron.sh diff --git a/plugins/flatpak/tests/app-with-runtime/.gitignore b/plugins/flatpak/tests/app-with-runtime/.gitignore new file mode 100644 index 0000000..f606d5e --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/.gitignore @@ -0,0 +1 @@ +repo diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/.gitignore b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/.gitignore new file mode 100644 index 0000000..fea15c0 --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/.gitignore @@ -0,0 +1,2 @@ +export +files/share/app-info diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/bin/chiron.sh b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/bin/chiron.sh new file mode 100755 index 0000000..e61d501 --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/bin/chiron.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo "Hello world" diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml new file mode 100644 index 0000000..2a1f49d --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml @@ -0,0 +1,16 @@ + + + + org.test.Chiron + CC0-1.0 + GPL-2.0-or-later + Chiron + Single line synopsis +

        Long description.

        + http://127.0.0.1/ + + +

        This is better.

        +
        +
        +
        diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/applications/org.test.Chiron.desktop b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/applications/org.test.Chiron.desktop new file mode 100644 index 0000000..b744766 --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/applications/org.test.Chiron.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Application +Name=Chiron +Exec=chiron.sh +Icon=org.test.Chiron +Keywords=Bingo; +X-Flatpak=org.test.Chiron diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png new file mode 100644 index 0000000000000000000000000000000000000000..0c38f2f6f9ca4ac9aa99df4e4832b7e0d1741a78 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRdwroCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#0V}tF8Ph)3S5-hE+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9VmXp)5S5Q;?~=XhKvjh9ES}K?0>Gv+!x|>+0(1MmlY_)z`)3$z`(!)a*F^10~3P- gWrEZ)2jL9)sDw1;zZt@BS1|yAr>mdKI;Vst03LHR#Q*>R literal 0 HcmV?d00001 diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/metadata b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/metadata new file mode 100644 index 0000000..ce57357 --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/metadata @@ -0,0 +1,4 @@ +[Application] +name=org.test.Chiron +runtime=org.test.Runtime/x86_64/master +command=chiron.sh diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/files/.empty b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/files/.empty new file mode 100644 index 0000000..e69de29 diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/metadata b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/metadata new file mode 100644 index 0000000..16f0fa1 --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/metadata @@ -0,0 +1,3 @@ +[Runtime] +name=org.test.Runtime +sdk=org.test.Runtime/x86_64/master diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/.gitignore b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/.gitignore new file mode 100644 index 0000000..3600b9c --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/.gitignore @@ -0,0 +1 @@ +app-info diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/libtest/README b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/libtest/README new file mode 100644 index 0000000..e69de29 diff --git a/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/metainfo/org.test.Runtime.metainfo.xml b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/metainfo/org.test.Runtime.metainfo.xml new file mode 100644 index 0000000..36e0658 --- /dev/null +++ b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/metainfo/org.test.Runtime.metainfo.xml @@ -0,0 +1,10 @@ + + + + org.test.Runtime + CC0 + GPL-2.0-or-later + Test runtime + Test runtime for flatpak self tests + + diff --git a/plugins/flatpak/tests/build.py b/plugins/flatpak/tests/build.py new file mode 100755 index 0000000..6c6a8dd --- /dev/null +++ b/plugins/flatpak/tests/build.py @@ -0,0 +1,125 @@ +#!/usr/bin/python3 + +import subprocess +import os +import shutil +import configparser + +def build_flatpak(appid, srcdir, repodir, branch='master', cleanrepodir=True): + print('Building %s from %s into %s' % (appid, srcdir, repodir)) + + # delete repodir + if cleanrepodir and os.path.exists(repodir): + print("Deleting %s" % repodir) + shutil.rmtree(repodir) + + # delete exportdir + exportdir = os.path.join(srcdir, appid, 'export') + if os.path.exists(exportdir): + print("Deleting %s" % exportdir) + shutil.rmtree(exportdir) + + metadata_path = os.path.join(srcdir, appid, 'metadata') + metadata = configparser.ConfigParser() + metadata.read(metadata_path) + is_runtime = True if 'Runtime' in metadata.sections() else False + is_extension = True if 'ExtensionOf' in metadata.sections() else False + + # runtimes have different defaults + if is_runtime and not is_extension: + prefix = 'usr' + else: + prefix = 'files' + + # finish the build + argv = ['flatpak', 'build-finish'] + argv.append(os.path.join(srcdir, appid)) + subprocess.call(argv) + + # compose AppStream data + argv = ['appstream-compose'] + argv.append('--origin=flatpak') + argv.append('--basename=%s' % appid) + argv.append('--prefix=%s' % os.path.join(srcdir, appid, prefix)) + argv.append('--output-dir=%s' % os.path.join(srcdir, appid, prefix, 'share/app-info/xmls')) + argv.append(appid) + subprocess.call(argv) + + # export into repo + argv = ['flatpak', 'build-export'] + argv.append(repodir) + argv.append(os.path.join(srcdir, appid)) + argv.append(branch) + argv.append('--update-appstream') + argv.append('--timestamp=2016-09-15T01:02:03') + if is_runtime: + argv.append('--runtime') + subprocess.call(argv) + +def build_flatpak_bundle(appid, srcdir, repodir, filename, branch='master'): + argv = ['flatpak', 'build-bundle'] + argv.append(repodir) + argv.append(filename) + argv.append(appid) + argv.append(branch) + subprocess.call(argv) + +def copy_repo(srcdir, destdir): + srcdir_repo = os.path.join(srcdir, 'repo') + destdir_repo = os.path.join(destdir, 'repo') + print("Copying %s to %s" % (srcdir_repo, destdir_repo)) + if os.path.exists(destdir_repo): + shutil.rmtree(destdir_repo) + shutil.copytree(srcdir_repo, destdir_repo) + +# normal app with runtime in same remote +build_flatpak('org.test.Chiron', + 'app-with-runtime', + 'app-with-runtime/repo') +build_flatpak('org.test.Runtime', + 'app-with-runtime', + 'app-with-runtime/repo', + cleanrepodir=False) + +# build a flatpak bundle for the app +build_flatpak_bundle('org.test.Chiron', + 'app-with-runtime', + 'app-with-runtime/repo', + 'chiron.flatpak') + +# app referencing runtime that cannot be found +build_flatpak('org.test.Chiron', + 'app-with-runtime', + 'app-missing-runtime/repo') + +# app with an update +build_flatpak('org.test.Runtime', + 'app-with-runtime', + 'app-update/repo', + branch='new_master', + cleanrepodir=True) +build_flatpak('org.test.Chiron', + 'app-update', + 'app-update/repo', + cleanrepodir=False) + +# just a runtime present +build_flatpak('org.test.Runtime', + 'only-runtime', + 'only-runtime/repo') + +# app with an extension +copy_repo('only-runtime', 'app-extension') +build_flatpak('org.test.Chiron', + 'app-extension', + 'app-extension/repo', + cleanrepodir=False) +build_flatpak('org.test.Chiron.Extension', + 'app-extension', + 'app-extension/repo', + cleanrepodir=False) +copy_repo('app-extension', 'app-extension-update') +build_flatpak('org.test.Chiron.Extension', + 'app-extension-update', + 'app-extension-update/repo', + cleanrepodir=False) diff --git a/plugins/flatpak/tests/chiron.flatpak b/plugins/flatpak/tests/chiron.flatpak new file mode 100644 index 0000000000000000000000000000000000000000..ce038e9c1c8f1bba1a78acbd77e574a01d888290 GIT binary patch literal 5452 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 literal 0 HcmV?d00001 diff --git a/plugins/flatpak/tests/flatpakrepos.tar.gz b/plugins/flatpak/tests/flatpakrepos.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f8bcfde6c17c99af9d15025a7537e9a5c59c8a0d GIT binary patch literal 72252 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�Fii?Z=wO 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 literal 0 HcmV?d00001 diff --git a/plugins/flatpak/tests/meson.build b/plugins/flatpak/tests/meson.build new file mode 100644 index 0000000..9e48b00 --- /dev/null +++ b/plugins/flatpak/tests/meson.build @@ -0,0 +1,34 @@ +tar = find_program('tar') +custom_target( + 'flatpak-self-test-data', + input : 'flatpakrepos.tar.gz', + output : 'done', + command : [ + tar, + '--no-same-owner', + '--directory=' + meson.current_build_dir(), + '-xf', '@INPUT@', + ], + build_by_default : true, +) + +custom_target( + 'flatpak-self-test-bundle', + output : 'flatpakrepos.tar.gz', + command : [ + tar, + '-czf', '@OUTPUT@', + 'app-missing-runtime/repo/', + 'app-update/repo/', + 'app-with-runtime/repo/', + 'only-runtime/repo/', + 'app-extension/repo', + 'app-extension-update/repo', + ], +) + +configure_file( + input : 'chiron.flatpak', + output : 'chiron.flatpak', + copy : true, +) diff --git a/plugins/flatpak/tests/only-runtime/.gitignore b/plugins/flatpak/tests/only-runtime/.gitignore new file mode 100644 index 0000000..f606d5e --- /dev/null +++ b/plugins/flatpak/tests/only-runtime/.gitignore @@ -0,0 +1 @@ +repo diff --git a/plugins/flatpak/tests/only-runtime/org.test.Runtime b/plugins/flatpak/tests/only-runtime/org.test.Runtime new file mode 120000 index 0000000..eb7054c --- /dev/null +++ b/plugins/flatpak/tests/only-runtime/org.test.Runtime @@ -0,0 +1 @@ +../app-with-runtime/org.test.Runtime/ \ No newline at end of file diff --git a/plugins/fwupd/gs-fwupd-app.c b/plugins/fwupd/gs-fwupd-app.c new file mode 100644 index 0000000..23d0a1d --- /dev/null +++ b/plugins/fwupd/gs-fwupd-app.c @@ -0,0 +1,419 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-fwupd-app.h" + +const gchar * +gs_fwupd_app_get_device_id (GsApp *app) +{ + return gs_app_get_metadata_item (app, "fwupd::DeviceID"); +} + +const gchar * +gs_fwupd_app_get_update_uri (GsApp *app) +{ + return gs_app_get_metadata_item (app, "fwupd::UpdateID"); +} + +gboolean +gs_fwupd_app_get_is_locked (GsApp *app) +{ + GVariant *tmp = gs_app_get_metadata_variant (app, "fwupd::IsLocked"); + if (tmp == NULL) + return FALSE; + return g_variant_get_boolean (tmp); +} + +void +gs_fwupd_app_set_device_id (GsApp *app, const gchar *device_id) +{ + gs_app_set_metadata (app, "fwupd::DeviceID", device_id); +} + +void +gs_fwupd_app_set_update_uri (GsApp *app, const gchar *update_uri) +{ + /* cannot overwrite the value, thus remove it first; an overwrite + can happen for example when a historical update was found and + there is also a new update for the same device */ + gs_app_set_metadata (app, "fwupd::UpdateID", NULL); + gs_app_set_metadata (app, "fwupd::UpdateID", update_uri); +} + +void +gs_fwupd_app_set_is_locked (GsApp *app, gboolean is_locked) +{ + g_autoptr(GVariant) tmp = g_variant_new_boolean (is_locked); + gs_app_set_metadata_variant (app, "fwupd::IsLocked", tmp); +} + +#if FWUPD_CHECK_VERSION(1, 8, 1) +static gchar * /* (transfer full) */ +gs_fwupd_problem_to_string (FwupdClient *client, + FwupdDevice *dev, + FwupdDeviceProblem problem) +{ + if (problem == FWUPD_DEVICE_PROBLEM_SYSTEM_POWER_TOO_LOW) { + if (fwupd_client_get_battery_level (client) == FWUPD_BATTERY_LEVEL_INVALID || + fwupd_client_get_battery_threshold (client) == FWUPD_BATTERY_LEVEL_INVALID) { + /* TRANSLATORS: as in laptop battery power */ + return g_strdup (_("System power is too low to perform the update")); + } + return g_strdup_printf ( + /* TRANSLATORS: as in laptop battery power */ + _("System power is too low to perform the update (%u%%, requires %u%%)"), + fwupd_client_get_battery_level (client), + fwupd_client_get_battery_threshold (client)); + } + if (problem == FWUPD_DEVICE_PROBLEM_UNREACHABLE) { + /* TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode */ + return g_strdup (_("Device is unreachable, or out of wireless range")); + } + if (problem == FWUPD_DEVICE_PROBLEM_POWER_TOO_LOW) { + if (fwupd_device_get_battery_level (dev) == FWUPD_BATTERY_LEVEL_INVALID || + fwupd_device_get_battery_threshold (dev) == FWUPD_BATTERY_LEVEL_INVALID) { + /* TRANSLATORS: for example the batteries *inside* the Bluetooth mouse */ + return g_strdup_printf (_("Device battery power is too low")); + } + /* TRANSLATORS: for example the batteries *inside* the Bluetooth mouse */ + return g_strdup_printf (_("Device battery power is too low (%u%%, requires %u%%)"), + fwupd_device_get_battery_level (dev), + fwupd_device_get_battery_threshold (dev)); + } + if (problem == FWUPD_DEVICE_PROBLEM_UPDATE_PENDING) { + /* TRANSLATORS: usually this is when we're waiting for a reboot */ + return g_strdup (_("Device is waiting for the update to be applied")); + } + if (problem == FWUPD_DEVICE_PROBLEM_REQUIRE_AC_POWER) { + /* TRANSLATORS: as in, wired mains power for a laptop */ + return g_strdup (_("Device requires AC power to be connected")); + } + if (problem == FWUPD_DEVICE_PROBLEM_LID_IS_CLOSED) { + /* TRANSLATORS: lid means "laptop top cover" */ + return g_strdup (_("Device cannot be used while the lid is closed")); + } + return NULL; +} +#endif + +void +gs_fwupd_app_set_from_device (GsApp *app, + FwupdClient *client, + FwupdDevice *dev) +{ + GPtrArray *guids; + + /* something can be done */ + if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_UPDATABLE) +#if FWUPD_CHECK_VERSION(1, 8, 1) + || fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_UPDATABLE_HIDDEN) +#endif + ) + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + + /* reboot required to apply update */ + if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_NEEDS_REBOOT)) + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + + /* is removable or cannot be used during update */ + if (!fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_INTERNAL) || + !fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_USABLE_DURING_UPDATE)) + gs_app_add_quirk (app, GS_APP_QUIRK_UNUSABLE_DURING_UPDATE); + + guids = fwupd_device_get_guids (dev); + if (guids->len > 0) { + g_autofree gchar *guid_str = NULL; + g_auto(GStrv) tmp = g_new0 (gchar *, guids->len + 1); + for (guint i = 0; i < guids->len; i++) + tmp[i] = g_strdup (g_ptr_array_index (guids, i)); + guid_str = g_strjoinv (",", tmp); + gs_app_set_metadata (app, "fwupd::Guid", guid_str); + } + if (fwupd_device_get_name (dev) != NULL) { + g_autofree gchar *vendor_name = NULL; + if (fwupd_device_get_vendor (dev) == NULL || + g_str_has_prefix (fwupd_device_get_name (dev), + fwupd_device_get_vendor (dev))) { + vendor_name = g_strdup (fwupd_device_get_name (dev)); + } else { + vendor_name = g_strdup_printf ("%s %s", + fwupd_device_get_vendor (dev), + fwupd_device_get_name (dev)); + } + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, vendor_name); + } + if (fwupd_device_get_summary (dev) != NULL) { + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, + fwupd_device_get_summary (dev)); + } + if (fwupd_device_get_version (dev) != NULL) { + gs_app_set_version (app, fwupd_device_get_version (dev)); + } + if (fwupd_device_get_created (dev) != 0) + gs_app_set_install_date (app, fwupd_device_get_created (dev)); + +#if FWUPD_CHECK_VERSION(1, 8, 1) + if (fwupd_device_get_problems (dev) != FWUPD_DEVICE_PROBLEM_NONE) { + g_autoptr(GString) problems = g_string_new (NULL); + for (guint i = 0; i < sizeof (FwupdDeviceProblem) * 8; i++) { + FwupdDeviceProblem problem = 1ull << i; + g_autofree gchar *tmp = NULL; + if (!fwupd_device_has_problem (dev, problem)) + continue; + tmp = gs_fwupd_problem_to_string (client, dev, problem); + if (tmp == NULL) + continue; + if (problems->len) + g_string_append_c (problems, '\n'); + g_string_append (problems, tmp); + } + if (problems->len) + gs_app_set_metadata (app, "GnomeSoftware::problems", problems->str); + else + gs_app_set_metadata (app, "GnomeSoftware::problems", NULL); + } else { + gs_app_set_metadata (app, "GnomeSoftware::problems", NULL); + } +#endif + + /* needs action */ + if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_NEEDS_BOOTLOADER) +#if FWUPD_CHECK_VERSION(1, 8, 1) + || fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_UPDATABLE_HIDDEN) + || fwupd_device_get_problems (dev) != FWUPD_DEVICE_PROBLEM_NONE +#endif + ) + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_USER_ACTION); + else + gs_app_remove_quirk (app, GS_APP_QUIRK_NEEDS_USER_ACTION); +} + +static gchar * +gs_fwupd_release_get_name (FwupdRelease *release) +{ + const gchar *name = fwupd_release_get_name (release); + GPtrArray *cats = fwupd_release_get_categories (release); + + for (guint i = 0; i < cats->len; i++) { + const gchar *cat = g_ptr_array_index (cats, i); + if (g_strcmp0 (cat, "X-Device") == 0) { + /* TRANSLATORS: a specific part of hardware, + * the first %s is the device name, e.g. 'Unifying Receiver` */ + return g_strdup_printf (_("%s Device Update"), name); + } + if (g_strcmp0 (cat, "X-System") == 0) { + /* TRANSLATORS: the entire system, e.g. all internal devices, + * the first %s is the device name, e.g. 'ThinkPad P50` */ + return g_strdup_printf (_("%s System Update"), name); + } + if (g_strcmp0 (cat, "X-EmbeddedController") == 0) { + /* TRANSLATORS: the EC is typically the keyboard controller chip, + * the first %s is the device name, e.g. 'ThinkPad P50` */ + return g_strdup_printf (_("%s Embedded Controller Update"), name); + } + if (g_strcmp0 (cat, "X-ManagementEngine") == 0) { + /* TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, + * the first %s is the device name, e.g. 'ThinkPad P50` */ + return g_strdup_printf (_("%s ME Update"), name); + } + if (g_strcmp0 (cat, "X-CorporateManagementEngine") == 0) { + /* TRANSLATORS: ME stands for Management Engine (with Intel AMT), + * where the first %s is the device name, e.g. 'ThinkPad P50` */ + return g_strdup_printf (_("%s Corporate ME Update"), name); + } + if (g_strcmp0 (cat, "X-ConsumerManagementEngine") == 0) { + /* TRANSLATORS: ME stands for Management Engine, where + * the first %s is the device name, e.g. 'ThinkPad P50` */ + return g_strdup_printf (_("%s Consumer ME Update"), name); + } + if (g_strcmp0 (cat, "X-Controller") == 0) { + /* TRANSLATORS: the controller is a device that has other devices + * plugged into it, for example ThunderBolt, FireWire or USB, + * the first %s is the device name, e.g. 'Intel ThunderBolt` */ + return g_strdup_printf (_("%s Controller Update"), name); + } + if (g_strcmp0 (cat, "X-ThunderboltController") == 0) { + /* TRANSLATORS: the Thunderbolt controller is a device that + * has other high speed Thunderbolt devices plugged into it; + * the first %s is the system name, e.g. 'ThinkPad P50` */ + return g_strdup_printf (_("%s Thunderbolt Controller Update"), name); + } + if (g_strcmp0 (cat, "X-CpuMicrocode") == 0) { + /* TRANSLATORS: the CPU microcode is firmware loaded onto the CPU + * at system bootup */ + return g_strdup_printf (_("%s CPU Microcode Update"), name); + } + if (g_strcmp0 (cat, "X-Configuration") == 0) { + /* TRANSLATORS: configuration refers to hardware state, + * e.g. a security database or a default power value */ + return g_strdup_printf (_("%s Configuration Update"), name); + } + if (g_strcmp0 (cat, "X-Battery") == 0) { + /* TRANSLATORS: battery refers to the system power source */ + return g_strdup_printf (_("%s Battery Update"), name); + } + if (g_strcmp0 (cat, "X-Camera") == 0) { + /* TRANSLATORS: camera can refer to the laptop internal + * camera in the bezel or external USB webcam */ + return g_strdup_printf (_("%s Camera Update"), name); + } + if (g_strcmp0 (cat, "X-TPM") == 0) { + /* TRANSLATORS: TPM refers to a Trusted Platform Module */ + return g_strdup_printf (_("%s TPM Update"), name); + } + if (g_strcmp0 (cat, "X-Touchpad") == 0) { + /* TRANSLATORS: TouchPad refers to a flat input device */ + return g_strdup_printf (_("%s Touchpad Update"), name); + } + if (g_strcmp0 (cat, "X-Mouse") == 0) { + /* TRANSLATORS: Mouse refers to a handheld input device */ + return g_strdup_printf (_("%s Mouse Update"), name); + } + if (g_strcmp0 (cat, "X-Keyboard") == 0) { + /* TRANSLATORS: Keyboard refers to an input device for typing */ + return g_strdup_printf (_("%s Keyboard Update"), name); + } + if (g_strcmp0 (cat, "X-StorageController") == 0) { + /* TRANSLATORS: Storage Controller is typically a RAID or SAS adapter */ + return g_strdup_printf (_("%s Storage Controller Update"), name); + } + if (g_strcmp0 (cat, "X-NetworkInterface") == 0) { + /* TRANSLATORS: Network Interface refers to the physical + * PCI card, not the logical wired connection */ + return g_strdup_printf (_("%s Network Interface Update"), name); + } + if (g_strcmp0 (cat, "X-VideoDisplay") == 0) { + /* TRANSLATORS: Video Display refers to the laptop internal display or + * external monitor */ + return g_strdup_printf (_("%s Display Update"), name); + } + if (g_strcmp0 (cat, "X-BaseboardManagementController") == 0) { + /* TRANSLATORS: BMC refers to baseboard management controller which + * is the device that updates all the other firmware on the system */ + return g_strdup_printf (_("%s BMC Update"), name); + } + if (g_strcmp0 (cat, "X-UsbReceiver") == 0) { + /* TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth + * device that stays in the USB port so the wireless peripheral works */ + return g_strdup_printf (_("%s USB Receiver Update"), name); + } + if (g_strcmp0 (cat, "X-Drive") == 0) { + /* TRANSLATORS: drive refers to a storage device, e.g. SATA disk */ + return g_strdup_printf (_("%s Drive Update"), name); + } + if (g_strcmp0 (cat, "X-FlashDrive") == 0) { + /* TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC */ + return g_strdup_printf (_("%s Flash Drive Update"), name); + } + if (g_strcmp0 (cat, "X-SolidStateDrive") == 0) { + /* TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating + * SATA or NVMe disk */ + return g_strdup_printf (_("%s SSD Update"), name); + } + if (g_strcmp0 (cat, "X-Gpu") == 0) { + /* TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. + * the "video card" */ + return g_strdup_printf (_("%s GPU Update"), name); + } + if (g_strcmp0 (cat, "X-Dock") == 0) { + /* TRANSLATORS: Dock refers to the port replicator hardware laptops are + * cradled in, or lowered onto */ + return g_strdup_printf (_("%s Dock Update"), name); + } + if (g_strcmp0 (cat, "X-UsbDock") == 0) { + /* TRANSLATORS: Dock refers to the port replicator device connected + * by plugging in a USB cable -- which may or may not also provide power */ + return g_strdup_printf (_("%s USB Dock Update"), name); + } + } + + /* default fallback */ + return g_strdup (name); +} + +static AsUrgencyKind +gs_fwupd_release_urgency_to_as_urgency_kind (FwupdReleaseUrgency urgency) +{ + switch (urgency) { + case FWUPD_RELEASE_URGENCY_LOW: + return AS_URGENCY_KIND_LOW; + case FWUPD_RELEASE_URGENCY_MEDIUM: + return AS_URGENCY_KIND_MEDIUM; + case FWUPD_RELEASE_URGENCY_HIGH: + return AS_URGENCY_KIND_HIGH; + case FWUPD_RELEASE_URGENCY_CRITICAL: + return AS_URGENCY_KIND_CRITICAL; + case FWUPD_RELEASE_URGENCY_UNKNOWN: + default: + return AS_URGENCY_KIND_UNKNOWN; + } +} + +void +gs_fwupd_app_set_from_release (GsApp *app, FwupdRelease *rel) +{ + GPtrArray *locations = fwupd_release_get_locations (rel); + + if (fwupd_release_get_name (rel) != NULL) { + g_autofree gchar *tmp = gs_fwupd_release_get_name (rel); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, tmp); + } + if (fwupd_release_get_summary (rel) != NULL) { + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, + fwupd_release_get_summary (rel)); + } + if (fwupd_release_get_homepage (rel) != NULL) { + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, + fwupd_release_get_homepage (rel)); + } + if (fwupd_release_get_size (rel) != 0) { + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, 0); + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, fwupd_release_get_size (rel)); + } + if (fwupd_release_get_version (rel) != NULL) + gs_app_set_update_version (app, fwupd_release_get_version (rel)); + if (fwupd_release_get_license (rel) != NULL) { + gs_app_set_license (app, GS_APP_QUALITY_NORMAL, + fwupd_release_get_license (rel)); + } + if (locations->len > 0) { + const gchar *uri = g_ptr_array_index (locations, 0); + /* typically the first URI will be the main HTTP mirror, and we + * don't have the capability to use an IPFS/IPNS URL anyway */ + gs_app_set_origin_hostname (app, uri); + gs_fwupd_app_set_update_uri (app, uri); + } + if (fwupd_release_get_description (rel) != NULL) { + g_autofree gchar *tmp = NULL; +#if AS_CHECK_VERSION(1, 0, 0) + tmp = as_markup_convert (fwupd_release_get_description (rel), AS_MARKUP_KIND_TEXT, NULL); +#else + tmp = as_markup_convert_simple (fwupd_release_get_description (rel), NULL); +#endif + if (tmp != NULL) + gs_app_set_update_details_text (app, tmp); + } + if (fwupd_release_get_detach_image (rel) != NULL) { + g_autoptr(AsScreenshot) ss = as_screenshot_new (); + g_autoptr(AsImage) im = as_image_new (); + as_image_set_kind (im, AS_IMAGE_KIND_SOURCE); + as_image_set_url (im, fwupd_release_get_detach_image (rel)); + as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_DEFAULT); + as_screenshot_add_image (ss, im); + if (fwupd_release_get_detach_caption (rel) != NULL) + as_screenshot_set_caption (ss, fwupd_release_get_detach_caption (rel), NULL); + gs_app_set_action_screenshot (app, ss); + } + + gs_app_set_update_urgency (app, gs_fwupd_release_urgency_to_as_urgency_kind (fwupd_release_get_urgency (rel))); +} diff --git a/plugins/fwupd/gs-fwupd-app.h b/plugins/fwupd/gs-fwupd-app.h new file mode 100644 index 0000000..1558abf --- /dev/null +++ b/plugins/fwupd/gs-fwupd-app.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +const gchar *gs_fwupd_app_get_device_id (GsApp *app); +const gchar *gs_fwupd_app_get_update_uri (GsApp *app); +gboolean gs_fwupd_app_get_is_locked (GsApp *app); + +void gs_fwupd_app_set_device_id (GsApp *app, + const gchar *device_id); +void gs_fwupd_app_set_update_uri (GsApp *app, + const gchar *update_uri); +void gs_fwupd_app_set_is_locked (GsApp *app, + gboolean is_locked); +void gs_fwupd_app_set_from_device (GsApp *app, + FwupdClient *client, + FwupdDevice *dev); +void gs_fwupd_app_set_from_release (GsApp *app, + FwupdRelease *rel); + +G_END_DECLS diff --git a/plugins/fwupd/gs-plugin-fwupd.c b/plugins/fwupd/gs-plugin-fwupd.c new file mode 100644 index 0000000..dd085ab --- /dev/null +++ b/plugins/fwupd/gs-plugin-fwupd.c @@ -0,0 +1,2310 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2018 Richard Hughes + * Copyright (C) 2015-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "gs-fwupd-app.h" +#include "gs-metered.h" + +#include "gs-plugin-fwupd.h" + +/* + * SECTION: + * Queries for new firmware and schedules it to be installed as required. + * + * This plugin calls UpdatesChanged() if any updatable devices are + * added or removed or if a device has been updated live. + * + * Since fwupd is a daemon accessible over D-Bus, this plugin basically + * translates every job into one or more D-Bus calls, and all the real work is + * done in the fwupd daemon. FIXME: This means the plugin can therefore execute + * entirely in the main thread, making asynchronous D-Bus calls, once all the + * vfuncs have been ported. + */ + +struct _GsPluginFwupd { + GsPlugin parent; + + FwupdClient *client; + GsApp *app_current; + GsApp *cached_origin; + GHashTable *cached_sources; /* (nullable) (owned) (element-type utf8 GsApp); sources by id, each value is weak reffed */ + GMutex cached_sources_mutex; +}; + +G_DEFINE_TYPE (GsPluginFwupd, gs_plugin_fwupd, GS_TYPE_PLUGIN) + +static void +cached_sources_weak_ref_cb (gpointer user_data, + GObject *object) +{ + GsPluginFwupd *self = user_data; + GHashTableIter iter; + gpointer key, value; + g_autoptr(GMutexLocker) locker = NULL; + + locker = g_mutex_locker_new (&self->cached_sources_mutex); + + g_assert (self->cached_sources != NULL); + + g_hash_table_iter_init (&iter, self->cached_sources); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GObject *repo_object = value; + if (repo_object == object) { + g_hash_table_iter_remove (&iter); + if (!g_hash_table_size (self->cached_sources)) + g_clear_pointer (&self->cached_sources, g_hash_table_unref); + break; + } + } +} + +static void +gs_plugin_fwupd_error_convert (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return; + + /* already correct */ + if (error->domain == GS_PLUGIN_ERROR) + return; + + /* this are allowed for low-level errors */ + if (gs_utils_error_convert_gio (perror)) + return; + + /* this are allowed for low-level errors */ + if (gs_utils_error_convert_gdbus (perror)) + return; + + /* custom to this plugin */ + if (error->domain == FWUPD_ERROR) { + switch (error->code) { + case FWUPD_ERROR_ALREADY_PENDING: + case FWUPD_ERROR_INVALID_FILE: + case FWUPD_ERROR_NOT_SUPPORTED: + error->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + break; + case FWUPD_ERROR_AUTH_FAILED: + error->code = GS_PLUGIN_ERROR_AUTH_INVALID; + break; + case FWUPD_ERROR_SIGNATURE_INVALID: + error->code = GS_PLUGIN_ERROR_NO_SECURITY; + break; + case FWUPD_ERROR_AC_POWER_REQUIRED: + error->code = GS_PLUGIN_ERROR_AC_POWER_REQUIRED; + break; + case FWUPD_ERROR_BATTERY_LEVEL_TOO_LOW: + error->code = GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW; + break; + default: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + } else { + g_warning ("can't reliably fixup error from domain %s", + g_quark_to_string (error->domain)); + error->code = GS_PLUGIN_ERROR_FAILED; + } + error->domain = GS_PLUGIN_ERROR; +} + +static void +gs_plugin_fwupd_init (GsPluginFwupd *self) +{ + self->client = fwupd_client_new (); + g_mutex_init (&self->cached_sources_mutex); + + /* set name of MetaInfo file */ + gs_plugin_set_appstream_id (GS_PLUGIN (self), "org.gnome.Software.Plugin.Fwupd"); +} + +static void +gs_plugin_fwupd_dispose (GObject *object) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (object); + + g_clear_object (&self->cached_origin); + g_clear_object (&self->client); + + if (self->cached_sources != NULL) { + GHashTableIter iter; + gpointer value; + + g_hash_table_iter_init (&iter, self->cached_sources); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GObject *app_repo = value; + g_object_weak_unref (app_repo, cached_sources_weak_ref_cb, self); + } + + g_clear_pointer (&self->cached_sources, g_hash_table_unref); + } + + G_OBJECT_CLASS (gs_plugin_fwupd_parent_class)->dispose (object); +} + +static void +gs_plugin_fwupd_finalize (GObject *object) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (object); + + g_mutex_clear (&self->cached_sources_mutex); + + G_OBJECT_CLASS (gs_plugin_fwupd_parent_class)->finalize (object); +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app) +{ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_FIRMWARE) + gs_app_set_management_plugin (app, plugin); +} + +static void +gs_plugin_fwupd_changed_cb (FwupdClient *client, GsPlugin *plugin) +{ +} + +static void +gs_plugin_fwupd_device_changed_cb (FwupdClient *client, + FwupdDevice *dev, + GsPlugin *plugin) +{ + /* limit number of UI refreshes */ + if (!fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_SUPPORTED)) { + g_debug ("%s changed (not supported) so ignoring", + fwupd_device_get_id (dev)); + return; + } + + /* If the flag is set the device matches something in the + * metadata as therefor is worth refreshing the update list */ + g_debug ("%s changed (supported) so reloading", + fwupd_device_get_id (dev)); + gs_plugin_updates_changed (plugin); +} + +static void +gs_plugin_fwupd_notify_percentage_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (user_data); + + /* nothing in progress */ + if (self->app_current == NULL) { + g_debug ("fwupd percentage: %u%%", + fwupd_client_get_percentage (self->client)); + return; + } + g_debug ("fwupd percentage for %s: %u%%", + gs_app_get_unique_id (self->app_current), + fwupd_client_get_percentage (self->client)); + gs_app_set_progress (self->app_current, + fwupd_client_get_percentage (self->client)); +} + +static void +gs_plugin_fwupd_notify_status_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (user_data); + + /* nothing in progress */ + if (self->app_current == NULL) { + g_debug ("fwupd status: %s", + fwupd_status_to_string (fwupd_client_get_status (self->client))); + return; + } + + g_debug ("fwupd status for %s: %s", + gs_app_get_unique_id (self->app_current), + fwupd_status_to_string (fwupd_client_get_status (self->client))); + switch (fwupd_client_get_status (self->client)) { + case FWUPD_STATUS_DECOMPRESSING: + case FWUPD_STATUS_DEVICE_RESTART: + case FWUPD_STATUS_DEVICE_WRITE: + case FWUPD_STATUS_DEVICE_VERIFY: + gs_app_set_state (self->app_current, GS_APP_STATE_INSTALLING); + break; + case FWUPD_STATUS_IDLE: + g_clear_object (&self->app_current); + break; + default: + break; + } +} + +static gchar * +gs_plugin_fwupd_get_file_checksum (const gchar *filename, + GChecksumType checksum_type, + GError **error) +{ + gsize len; + g_autofree gchar *data = NULL; + + if (!g_file_get_contents (filename, &data, &len, error)) { + gs_utils_error_convert_gio (error); + return NULL; + } + return g_compute_checksum_for_data (checksum_type, (const guchar *)data, len); +} + +static void setup_connect_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void setup_features_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_fwupd_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fwupd_setup_async); + + /* connect a proxy */ + fwupd_client_connect_async (self->client, cancellable, setup_connect_cb, + g_steal_pointer (&task)); +} + +static void +setup_connect_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginFwupd *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + + if (!fwupd_client_connect_finish (self->client, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* send our implemented feature set */ + fwupd_client_set_feature_flags_async (self->client, +#if FWUPD_CHECK_VERSION(1, 8, 1) + FWUPD_FEATURE_FLAG_SHOW_PROBLEMS | +#endif + FWUPD_FEATURE_FLAG_REQUESTS | + FWUPD_FEATURE_FLAG_UPDATE_ACTION | + FWUPD_FEATURE_FLAG_DETACH_ACTION, + cancellable, setup_features_cb, + g_steal_pointer (&task)); +} + +static void +setup_features_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginFwupd *self = g_task_get_source_object (task); + GsPlugin *plugin = GS_PLUGIN (self); + g_autoptr(GError) local_error = NULL; + + if (!fwupd_client_set_feature_flags_finish (self->client, result, &local_error)) + g_debug ("Failed to set front-end features: %s", local_error->message); + g_clear_error (&local_error); + + /* we know the runtime daemon version now */ + fwupd_client_set_user_agent_for_package (self->client, PACKAGE_NAME, PACKAGE_VERSION); + if (!fwupd_client_ensure_networking (self->client, &local_error)) { + gs_plugin_fwupd_error_convert (&local_error); + g_prefix_error (&local_error, "Failed to setup networking: "); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* add source */ + self->cached_origin = gs_app_new (gs_plugin_get_name (plugin)); + gs_app_set_kind (self->cached_origin, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_bundle_kind (self->cached_origin, AS_BUNDLE_KIND_CABINET); + gs_app_set_management_plugin (self->cached_origin, plugin); + + /* add the source to the plugin cache which allows us to match the + * unique ID to a GsApp when creating an event */ + gs_plugin_cache_add (plugin, + gs_app_get_unique_id (self->cached_origin), + self->cached_origin); + + /* register D-Bus errors */ + fwupd_error_quark (); + g_signal_connect (self->client, "changed", + G_CALLBACK (gs_plugin_fwupd_changed_cb), plugin); + g_signal_connect (self->client, "device-added", + G_CALLBACK (gs_plugin_fwupd_device_changed_cb), plugin); + g_signal_connect (self->client, "device-removed", + G_CALLBACK (gs_plugin_fwupd_device_changed_cb), plugin); + g_signal_connect (self->client, "device-changed", + G_CALLBACK (gs_plugin_fwupd_device_changed_cb), plugin); + g_signal_connect (self->client, "notify::percentage", + G_CALLBACK (gs_plugin_fwupd_notify_percentage_cb), self); + g_signal_connect (self->client, "notify::status", + G_CALLBACK (gs_plugin_fwupd_notify_status_cb), self); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_fwupd_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static GsApp * +gs_plugin_fwupd_new_app_from_device (GsPlugin *plugin, + FwupdDevice *dev, + gboolean can_cached) +{ + FwupdRelease *rel = fwupd_device_get_release_default (dev); + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + GsApp *app; + g_autofree gchar *id = NULL; + g_autoptr(GIcon) icon = NULL; + + /* older versions of fwups didn't record this for historical devices */ + if (fwupd_release_get_appstream_id (rel) == NULL) + return NULL; + + /* get from cache */ + id = gs_utils_build_unique_id (AS_COMPONENT_SCOPE_SYSTEM, + AS_BUNDLE_KIND_UNKNOWN, + NULL, /* origin */ + fwupd_release_get_appstream_id (rel), + NULL); + if (can_cached) { + app = gs_plugin_cache_lookup (plugin, id); + if (app == NULL) { + app = gs_app_new (id); + gs_plugin_cache_add (plugin, id, app); + } + } else { + app = gs_app_new (id); + } + + /* default stuff */ + gs_app_set_kind (app, AS_COMPONENT_KIND_FIRMWARE); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_CABINET); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + gs_app_add_quirk (app, GS_APP_QUIRK_DO_NOT_AUTO_UPDATE); + gs_app_set_management_plugin (app, plugin); + gs_app_add_category (app, "System"); + gs_fwupd_app_set_device_id (app, fwupd_device_get_id (dev)); + + /* create icon */ + icon = g_themed_icon_new ("system-component-firmware"); + gs_app_add_icon (app, icon); + gs_fwupd_app_set_from_device (app, self->client, dev); + gs_fwupd_app_set_from_release (app, rel); + + if (fwupd_release_get_appstream_id (rel) != NULL) + gs_app_set_id (app, fwupd_release_get_appstream_id (rel)); + + /* the same as we have already */ + if (g_strcmp0 (fwupd_device_get_version (dev), + fwupd_release_get_version (rel)) == 0) { + g_warning ("same firmware version as installed"); + } + + return app; +} + +static gchar * +gs_plugin_fwupd_build_device_id (FwupdDevice *dev) +{ + g_autofree gchar *tmp = g_strdup (fwupd_device_get_id (dev)); + g_strdelimit (tmp, "/", '_'); + return g_strdup_printf ("org.fwupd.%s.device", tmp); +} + +static GsApp * +gs_plugin_fwupd_new_app_from_device_raw (GsPlugin *plugin, FwupdDevice *device) +{ + GPtrArray *icons; + g_autofree gchar *id = NULL; + g_autoptr(GsApp) app = NULL; + + /* create a GsApp based on the device, not the release */ + id = gs_plugin_fwupd_build_device_id (device); + app = gs_app_new (id); + gs_app_set_kind (app, AS_COMPONENT_KIND_FIRMWARE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + gs_app_add_quirk (app, GS_APP_QUIRK_DO_NOT_AUTO_UPDATE); + gs_app_set_version (app, fwupd_device_get_version (device)); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, fwupd_device_get_name (device)); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, fwupd_device_get_summary (device)); + gs_app_set_origin (app, fwupd_device_get_vendor (device)); + gs_fwupd_app_set_device_id (app, fwupd_device_get_id (device)); + gs_app_set_management_plugin (app, plugin); + + /* create icon */ + icons = fwupd_device_get_icons (device); + for (guint j = 0; j < icons->len; j++) { + const gchar *icon_str = g_ptr_array_index (icons, j); + g_autoptr(GIcon) icon = NULL; + if (g_str_has_prefix (icon_str, "/")) { + g_autoptr(GFile) icon_file = g_file_new_for_path (icon_str); + icon = g_file_icon_new (icon_file); + } else { + icon = g_themed_icon_new (icon_str); + } + gs_app_add_icon (app, icon); + } + return g_steal_pointer (&app); +} + +static GsApp * +gs_plugin_fwupd_new_app (GsPlugin *plugin, FwupdDevice *dev, GError **error) +{ + FwupdRelease *rel = fwupd_device_get_release_default (dev); + GPtrArray *checksums; + GPtrArray *locations = fwupd_release_get_locations (rel); + const gchar *update_uri = NULL; + g_autofree gchar *basename = NULL; + g_autofree gchar *filename_cache = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GsApp) app = NULL; + + /* update unsupported */ + app = gs_plugin_fwupd_new_app_from_device (plugin, dev, TRUE); + if (gs_app_get_state (app) != GS_APP_STATE_UPDATABLE_LIVE) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "%s [%s] cannot be updated", + gs_app_get_name (app), gs_app_get_id (app)); + return NULL; + } + + /* some missing */ + if (gs_app_get_id (app) == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "fwupd: No id for firmware"); + return NULL; + } + if (gs_app_get_version (app) == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "fwupd: No version! for %s!", gs_app_get_id (app)); + return NULL; + } + if (gs_app_get_update_version (app) == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "fwupd: No update-version! for %s!", gs_app_get_id (app)); + return NULL; + } + checksums = fwupd_release_get_checksums (rel); + if (checksums->len == 0) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NO_SECURITY, + "%s [%s] (%s) has no checksums, ignoring as unsafe", + gs_app_get_name (app), + gs_app_get_id (app), + gs_app_get_update_version (app)); + return NULL; + } + + /* typically the first URI will be the main HTTP mirror, and we + * don't have the capability to use an IPFS/IPNS URL anyway */ + if (locations->len > 0) + update_uri = g_ptr_array_index (locations, 0); + + if (update_uri == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no location available for %s [%s]", + gs_app_get_name (app), gs_app_get_id (app)); + return NULL; + } + + /* does the firmware already exist in the cache? */ + basename = g_path_get_basename (update_uri); + filename_cache = gs_utils_get_cache_filename ("fwupd", + basename, + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + error); + if (filename_cache == NULL) + return NULL; + + /* delete the file if the checksum does not match */ + if (g_file_test (filename_cache, G_FILE_TEST_EXISTS)) { + const gchar *checksum_tmp = NULL; + g_autofree gchar *checksum = NULL; + + /* we can migrate to something better than SHA1 when the LVFS + * starts producing metadata with multiple hash types */ + checksum_tmp = fwupd_checksum_get_by_kind (checksums, + G_CHECKSUM_SHA1); + if (checksum_tmp == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "No valid checksum for %s", + filename_cache); + } + checksum = gs_plugin_fwupd_get_file_checksum (filename_cache, + G_CHECKSUM_SHA1, + error); + if (checksum == NULL) + return NULL; + if (g_strcmp0 (checksum_tmp, checksum) != 0) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "%s does not match checksum, expected %s got %s", + filename_cache, checksum_tmp, checksum); + g_unlink (filename_cache); + return NULL; + } + } + + /* already downloaded, so overwrite */ + if (g_file_test (filename_cache, G_FILE_TEST_EXISTS)) + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + + /* actually add the application */ + file = g_file_new_for_path (filename_cache); + gs_app_set_local_file (app, file); + return g_steal_pointer (&app); +} + +typedef struct { + guint n_pending_ops; + gboolean get_historical_updates; + GsAppList *list; /* (owned) */ + GError *saved_error; /* (nullable) (owned) */ +} ListUpdatesData; + +static void +list_updates_data_free (ListUpdatesData *data) +{ + g_assert (data->n_pending_ops == 0); + g_clear_object (&data->list); + g_clear_error (&data->saved_error); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ListUpdatesData, list_updates_data_free) + +typedef struct { + GTask *task; /* (owned) */ + FwupdDevice *device; /* (not nullable) (owned) */ +} ListUpdatesDevData; + +static void +list_updates_dev_data_free (ListUpdatesDevData *data) +{ + g_clear_object (&data->task); + g_clear_object (&data->device); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ListUpdatesDevData, list_updates_dev_data_free) + +/* @error is (nullable) (transfer full) */ +static void +gs_plugin_fwupd_list_updates_finish_op (GTask *task, + GsApp *app, + GError *error) +{ + g_autoptr(GError) error_owned = g_steal_pointer (&error); + ListUpdatesData *data = g_task_get_task_data (task); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while listing apps for update: %s", error_owned->message); + else if (app != NULL) + gs_app_list_add (data->list, app); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else if (data->list == NULL) + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + else + g_task_return_pointer (task, g_steal_pointer (&data->list), g_object_unref); +} + +static void +gs_plugin_fwupd_list_historical_updates_got_dev_results_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(ListUpdatesDevData) dev_data = g_steal_pointer (&user_data); + GsPlugin *plugin = GS_PLUGIN (g_task_get_source_object (dev_data->task)); + g_autoptr(FwupdDevice) dev = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) local_error = NULL; + gboolean success = TRUE; + + dev = fwupd_client_get_results_finish (FWUPD_CLIENT (source_object), result, &local_error); + if (dev == NULL) { + if (g_error_matches (local_error, FWUPD_ERROR, FWUPD_ERROR_NOTHING_TO_DO) || + g_error_matches (local_error, FWUPD_ERROR, FWUPD_ERROR_NOT_FOUND)) { + g_clear_error (&local_error); + } else { + gs_plugin_fwupd_error_convert (&local_error); + } + success = FALSE; + } else { + /* do not reuse cached GsApp for historical updates, + to not overwrite updateID of a newer version */ + app = gs_plugin_fwupd_new_app_from_device (plugin, dev, FALSE); + if (app == NULL) { + g_debug ("updates historical: failed to build result for '%s' (%s)", + fwupd_device_get_name (dev), + fwupd_device_get_id (dev)); + } + } + + gs_plugin_fwupd_list_updates_finish_op (dev_data->task, app, success ? NULL : g_steal_pointer (&local_error)); +} + +static void +gs_plugin_fwupd_list_updates_got_dev_upgrades_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(ListUpdatesDevData) dev_data = g_steal_pointer (&user_data); + g_autoptr(GPtrArray) rels = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) local_error = NULL; + FwupdRelease *rel_newest; + gboolean success = TRUE; + + rels = fwupd_client_get_upgrades_finish (FWUPD_CLIENT (source_object), result, &local_error); + if (rels == NULL) { + if (g_error_matches (local_error, FWUPD_ERROR, FWUPD_ERROR_NOTHING_TO_DO)) { + g_debug ("no updates for %s", fwupd_device_get_id (dev_data->device)); + } else if (g_error_matches (local_error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED)) { + g_debug ("not supported for %s", fwupd_device_get_id (dev_data->device)); + } else { + g_warning ("failed to get upgrades for %s: %s]", + fwupd_device_get_id (dev_data->device), + local_error->message); + } + success = FALSE; + /* ignore error for this device */ + g_clear_error (&local_error); + } + + if (success) { + GsPlugin *plugin = GS_PLUGIN (g_task_get_source_object (dev_data->task)); + /* normal device update */ + rel_newest = g_ptr_array_index (rels, 0); + fwupd_device_add_release (dev_data->device, rel_newest); + app = gs_plugin_fwupd_new_app (plugin, dev_data->device, &local_error); + if (app == NULL) { + g_debug ("Failed to create app for list for-update: %s", local_error->message); + success = FALSE; + /* ignore error for this device */ + g_clear_error (&local_error); + } + } + + /* add update descriptions for all releases inbetween */ + if (success && rels->len > 1) { + g_autoptr(GString) update_desc = g_string_new (NULL); + for (guint j = 0; j < rels->len; j++) { + FwupdRelease *rel = g_ptr_array_index (rels, j); + g_autofree gchar *desc = NULL; + if (fwupd_release_get_description (rel) == NULL) + continue; +#if AS_CHECK_VERSION(1, 0, 0) + desc = as_markup_convert (fwupd_release_get_description (rel), AS_MARKUP_KIND_TEXT, NULL); +#else + desc = as_markup_convert_simple (fwupd_release_get_description (rel), NULL); +#endif + if (desc == NULL) + continue; + g_string_append_printf (update_desc, + "Version %s:\n%s\n\n", + fwupd_release_get_version (rel), + desc); + } + if (update_desc->len > 2) { + g_string_truncate (update_desc, update_desc->len - 2); + gs_app_set_update_details_text (app, update_desc->str); + } + } + + gs_plugin_fwupd_list_updates_finish_op (dev_data->task, app, success ? NULL : g_steal_pointer (&local_error)); +} + +static void +gs_plugin_fwupd_list_updates_got_devices_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GPtrArray) devices = NULL; + g_autoptr(GError) local_error = NULL; + FwupdClient *client = FWUPD_CLIENT (source_object); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPlugin *plugin = GS_PLUGIN (g_task_get_source_object (task)); + ListUpdatesData *list_updates_data = g_task_get_task_data (task); + + /* this operation is decremented at the end of the function */ + g_assert (list_updates_data->n_pending_ops == 1); + + /* get current list of updates */ + devices = fwupd_client_get_devices_finish (client, result, &local_error); + if (devices == NULL) { + if (g_error_matches (local_error, FWUPD_ERROR, FWUPD_ERROR_NOTHING_TO_DO) || + g_error_matches (local_error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED) || + g_error_matches (local_error, FWUPD_ERROR, FWUPD_ERROR_NOT_FOUND)) { + g_debug ("no devices (%s)", local_error->message); + } else { + g_debug ("Failed to get devices: %s", local_error->message); + } + + /* ignore error */ + gs_plugin_fwupd_list_updates_finish_op (task, NULL, NULL); + return; + } + for (guint i = 0; i < devices->len; i++) { + FwupdDevice *dev = g_ptr_array_index (devices, i); + g_autoptr(ListUpdatesDevData) dev_data = NULL; + g_autoptr(GsApp) app = NULL; + + /* not going to have results, so save a D-Bus round-trip */ + if (!fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_SUPPORTED)) + continue; + + /* We’re interested in historical updates rather than pending updates */ + if (list_updates_data->get_historical_updates) { + list_updates_data->n_pending_ops++; + + dev_data = g_new0 (ListUpdatesDevData, 1); + dev_data->task = g_object_ref (task); + dev_data->device = g_object_ref (dev); + + fwupd_client_get_results_async (client, + fwupd_device_get_id (dev), + cancellable, + gs_plugin_fwupd_list_historical_updates_got_dev_results_cb, + g_steal_pointer (&dev_data)); + continue; + } + + /* locked device that needs unlocking */ + if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_LOCKED)) { + app = gs_plugin_fwupd_new_app_from_device_raw (plugin, dev); + gs_fwupd_app_set_is_locked (app, TRUE); + gs_app_list_add (list_updates_data->list, app); + continue; + } + + list_updates_data->n_pending_ops++; + + dev_data = g_new0 (ListUpdatesDevData, 1); + dev_data->task = g_object_ref (task); + dev_data->device = g_object_ref (dev); + + /* get the releases for this device and filter for validity */ + fwupd_client_get_upgrades_async (client, + fwupd_device_get_id (dev), + cancellable, + gs_plugin_fwupd_list_updates_got_dev_upgrades_cb, + g_steal_pointer (&dev_data)); + } + + gs_plugin_fwupd_list_updates_finish_op (task, NULL, NULL); +} + +static void +gs_plugin_fwupd_list_sources_got_remotes_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GPtrArray) remotes = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GError) local_error = NULL; + GsPluginFwupd *self = GS_PLUGIN_FWUPD (g_task_get_source_object (task)); + GsPlugin *plugin = GS_PLUGIN (self); + + /* find all remotes */ + remotes = fwupd_client_get_remotes_finish (FWUPD_CLIENT (source_object), result, &local_error); + if (remotes == NULL) { + gs_plugin_fwupd_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + locker = g_mutex_locker_new (&self->cached_sources_mutex); + list = gs_app_list_new (); + if (self->cached_sources == NULL) + self->cached_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + for (guint i = 0; i < remotes->len; i++) { + FwupdRemote *remote = g_ptr_array_index (remotes, i); + g_autofree gchar *id = NULL; + g_autoptr(GsApp) app = NULL; + + /* ignore these, they're built in */ + if (fwupd_remote_get_kind (remote) != FWUPD_REMOTE_KIND_DOWNLOAD) + continue; + + /* create something that we can use to enable/disable */ + id = g_strdup_printf ("org.fwupd.%s.remote", fwupd_remote_get_id (remote)); + app = g_hash_table_lookup (self->cached_sources, id); + if (app == NULL) { + gboolean is_enabled; + + #if FWUPD_CHECK_VERSION(1, 9, 4) + is_enabled = fwupd_remote_has_flag (remote, FWUPD_REMOTE_FLAG_ENABLED); + #else + is_enabled = fwupd_remote_get_enabled (remote); + #endif + + app = gs_app_new (id); + gs_app_set_kind (app, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_state (app, is_enabled ? + GS_APP_STATE_INSTALLED : GS_APP_STATE_AVAILABLE); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, + fwupd_remote_get_title (remote)); + gs_app_set_agreement (app, fwupd_remote_get_agreement (remote)); + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, + fwupd_remote_get_metadata_uri (remote)); + gs_app_set_metadata (app, "fwupd::remote-id", + fwupd_remote_get_id (remote)); + gs_app_set_management_plugin (app, plugin); + gs_app_set_metadata (app, "GnomeSoftware::PackagingFormat", "fwupd"); + gs_app_set_metadata (app, "GnomeSoftware::SortKey", "800"); + gs_app_set_origin_ui (app, _("Firmware")); + g_hash_table_insert (self->cached_sources, g_strdup (id), app); + g_object_weak_ref (G_OBJECT (app), cached_sources_weak_ref_cb, self); + } else { + g_object_ref (app); + /* The repo-related apps are those installed; due to re-using + cached app, make sure the list is populated from fresh data. */ + gs_app_list_remove_all (gs_app_get_related (app)); + } + gs_app_list_add (list, app); + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static void +gs_plugin_fwupd_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_historical_update = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_source = GS_APP_QUERY_TRISTATE_UNSET; + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fwupd_list_apps_async); + + if (query != NULL) { + is_for_update = gs_app_query_get_is_for_update (query); + is_historical_update = gs_app_query_get_is_historical_update (query); + is_source = gs_app_query_get_is_source (query); + } + + /* Currently only support a subset of query properties, and only one set at once. */ + if ((is_for_update == GS_APP_QUERY_TRISTATE_UNSET && + is_historical_update == GS_APP_QUERY_TRISTATE_UNSET && + is_source == GS_APP_QUERY_TRISTATE_UNSET) || + is_for_update == GS_APP_QUERY_TRISTATE_FALSE || + is_historical_update == GS_APP_QUERY_TRISTATE_FALSE || + is_source == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE || + is_historical_update == GS_APP_QUERY_TRISTATE_TRUE) { + g_autoptr(ListUpdatesData) data = g_new0 (ListUpdatesData, 1); + data->n_pending_ops = 1; + data->get_historical_updates = (is_historical_update == GS_APP_QUERY_TRISTATE_TRUE); + data->list = gs_app_list_new (); + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) list_updates_data_free); + fwupd_client_get_devices_async (self->client, cancellable, + gs_plugin_fwupd_list_updates_got_devices_cb, g_steal_pointer (&task)); + } else if (is_source == GS_APP_QUERY_TRISTATE_TRUE) { + fwupd_client_get_remotes_async (self->client, cancellable, + gs_plugin_fwupd_list_sources_got_remotes_cb, g_steal_pointer (&task)); + } else { + g_assert_not_reached (); + } +} + +static GsAppList * +gs_plugin_fwupd_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static gboolean +remote_cache_is_expired (FwupdRemote *remote, + guint64 cache_age_secs) +{ + /* check cache age */ + if (cache_age_secs > 0) { + guint64 age = fwupd_remote_get_age (remote); + if (age < cache_age_secs) { + g_debug ("fwupd remote is only %" G_GUINT64_FORMAT " seconds old, so ignoring refresh", age); + return FALSE; + } + } + + return TRUE; +} + +typedef struct { + /* Input data. */ + guint64 cache_age_secs; + + /* In-progress state. */ + guint n_operations_pending; + GError *error; /* (owned) (nullable) */ +} RefreshMetadataData; + +static void +refresh_metadata_data_free (RefreshMetadataData *data) +{ + g_clear_error (&data->error); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (RefreshMetadataData, refresh_metadata_data_free) + +static void get_remotes_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void refresh_remote_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_refresh_metadata_op (GTask *task); + +static void +gs_plugin_fwupd_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(RefreshMetadataData) data = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fwupd_refresh_metadata_async); + + data = g_new0 (RefreshMetadataData, 1); + data->cache_age_secs = cache_age_secs; + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) refresh_metadata_data_free); + + /* get the list of enabled remotes */ + fwupd_client_get_remotes_async (self->client, cancellable, get_remotes_cb, g_steal_pointer (&task)); +} + +static void +get_remotes_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + FwupdClient *client = FWUPD_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + RefreshMetadataData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) remotes = NULL; + + remotes = fwupd_client_get_remotes_finish (client, result, &error_local); + + if (remotes == NULL) { + g_debug ("No remotes found: %s", error_local ? error_local->message : "Unknown error"); + if (g_error_matches (error_local, FWUPD_ERROR, FWUPD_ERROR_NOTHING_TO_DO) || + g_error_matches (error_local, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED) || + g_error_matches (error_local, FWUPD_ERROR, FWUPD_ERROR_NOT_FOUND)) { + g_task_return_boolean (task, TRUE); + return; + } + + gs_plugin_fwupd_error_convert (&error_local); + g_task_return_error (task, g_steal_pointer (&error_local)); + return; + } + + /* Refresh each of the remotes in parallel. Keep the pending operation + * count incremented until all operations have been started, so that + * the overall operation doesn’t complete too early. */ + data->n_operations_pending = 1; + + for (guint i = 0; i < remotes->len; i++) { + FwupdRemote *remote = g_ptr_array_index (remotes, i); + gboolean is_enabled; + + #if FWUPD_CHECK_VERSION(1, 9, 4) + is_enabled = fwupd_remote_has_flag (remote, FWUPD_REMOTE_FLAG_ENABLED); + #else + is_enabled = fwupd_remote_get_enabled (remote); + #endif + + if (!is_enabled) + continue; + if (fwupd_remote_get_kind (remote) != FWUPD_REMOTE_KIND_DOWNLOAD) + continue; + if (!remote_cache_is_expired (remote, data->cache_age_secs)) + continue; + + data->n_operations_pending++; + #if FWUPD_CHECK_VERSION(2, 0, 0) + fwupd_client_refresh_remote_async (client, remote, FWUPD_CLIENT_DOWNLOAD_FLAG_NONE, cancellable, + refresh_remote_cb, g_object_ref (task)); + #elif FWUPD_CHECK_VERSION(1, 9, 4) + fwupd_client_refresh_remote2_async (client, remote, FWUPD_CLIENT_DOWNLOAD_FLAG_NONE, cancellable, + refresh_remote_cb, g_object_ref (task)); + #else + fwupd_client_refresh_remote_async (client, remote, cancellable, + refresh_remote_cb, g_object_ref (task)); + #endif + } + + finish_refresh_metadata_op (task); +} + +static void +refresh_remote_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + FwupdClient *client = FWUPD_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + RefreshMetadataData *data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + if (!fwupd_client_refresh_remote_finish (client, result, &local_error)) { + gs_plugin_fwupd_error_convert (&local_error); + if (data->error == NULL) + data->error = g_steal_pointer (&local_error); + else + g_debug ("Another remote refresh error: %s", local_error->message); + } + + finish_refresh_metadata_op (task); +} + +static void +finish_refresh_metadata_op (GTask *task) +{ + RefreshMetadataData *data = g_task_get_task_data (task); + + g_assert (data->n_operations_pending > 0); + data->n_operations_pending--; + + if (data->n_operations_pending == 0) { + if (data->error != NULL) + g_task_return_error (task, g_steal_pointer (&data->error)); + else + g_task_return_boolean (task, TRUE); + } +} + +static gboolean +gs_plugin_fwupd_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + GsApp *app; /* (owned) (not nullable) */ + GFile *local_file; /* (owned) (not nullable) */ + gpointer schedule_entry_handle; /* (nullable) (owned) */ +} DownloadData; + +static void +download_data_free (DownloadData *data) +{ + /* Should have been explicitly removed from the scheduler by now. */ + g_assert (data->schedule_entry_handle == NULL); + + g_clear_object (&data->app); + g_clear_object (&data->local_file); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (DownloadData, download_data_free) + +static void download_schedule_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void download_download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void download_replace_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_fwupd_download_async (GsPluginFwupd *self, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFile *local_file; + g_autoptr(GTask) task = NULL; + DownloadData *data; + g_autoptr(DownloadData) data_owned = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fwupd_download_async); + + /* not set */ + local_file = gs_app_get_local_file (app); + if (local_file == NULL) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "not enough data for fwupd"); + return; + } + + data = data_owned = g_new0 (DownloadData, 1); + data->app = g_object_ref (app); + data->local_file = g_object_ref (local_file); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) download_data_free); + + /* Check the cancellable, since the error return for + * g_file_query_exists() is the same as file-not-exists. */ + if (g_task_return_error_if_cancelled (task)) + return; + + /* If the file exists already, return early */ + if (g_file_query_exists (local_file, cancellable)) { + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + g_task_return_boolean (task, TRUE); + return; + } + + gs_app_set_state (app, GS_APP_STATE_DOWNLOADING); + + if (!interactive) { + gs_metered_block_on_download_scheduler_async (gs_metered_build_scheduler_parameters_for_app (app), + cancellable, download_schedule_cb, g_steal_pointer (&task)); + } else { + download_schedule_cb (NULL, NULL, g_steal_pointer (&task)); + } +} + +static void +download_schedule_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginFwupd *self = g_task_get_source_object (task); + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + const gchar *uri = gs_fwupd_app_get_update_uri (data->app); + g_autoptr(GError) local_error = NULL; + + if (result != NULL && + !gs_metered_block_on_download_scheduler_finish (result, &data->schedule_entry_handle, &local_error)) { + g_warning ("Failed to block on download scheduler: %s", + local_error->message); + g_clear_error (&local_error); + } + + /* Download the firmware contents. */ + fwupd_client_download_bytes_async (self->client, + uri, + FWUPD_CLIENT_DOWNLOAD_FLAG_NONE, + cancellable, + download_download_cb, + g_steal_pointer (&task)); +} + +static void +download_download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + FwupdClient *client = FWUPD_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GBytes) bytes = NULL; + g_autoptr(GError) local_error = NULL; + + bytes = fwupd_client_download_bytes_finish (client, result, &local_error); + if (bytes == NULL) { + gs_app_set_state_recover (data->app); + gs_plugin_fwupd_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Now write to the file. */ + g_file_replace_contents_bytes_async (data->local_file, bytes, NULL, FALSE, + G_FILE_CREATE_NONE, + cancellable, + download_replace_cb, + g_steal_pointer (&task)); +} + +static void +download_replace_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GFile *local_file = G_FILE (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + DownloadData *data = g_task_get_task_data (task); + gboolean download_success; + g_autoptr(GError) local_error = NULL; + + download_success = g_file_replace_contents_finish (local_file, result, NULL, &local_error); + + /* Fire this call off into the void, it’s not worth tracking it. + * Don’t pass a cancellable in, as the download may have been cancelled. */ + if (data->schedule_entry_handle != NULL) + gs_metered_remove_from_download_scheduler_async (data->schedule_entry_handle, NULL, NULL, NULL); + + gs_app_set_state_recover (data->app); + + if (!download_success) { + gs_plugin_fwupd_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + gs_app_set_size_download (data->app, GS_SIZE_TYPE_VALID, 0); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_fwupd_download_finish (GsPluginFwupd *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback; + gpointer app_needs_user_action_data; + GsApp *app; /* (owned) (not nullable) */ + gboolean interactive; + GFile *local_file; /* (owned) (not nullable) */ + const gchar *device_id; /* (not nullable) */ +} InstallData; + +static void +install_data_free (InstallData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->local_file); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallData, install_data_free) + +static void install_install_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_delete_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_get_device_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_device_request_cb (FwupdClient *client, + FwupdRequest *request, + GTask *task); + +static void +gs_plugin_fwupd_install_async (GsPluginFwupd *self, + GsApp *app, + gboolean interactive, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + FwupdInstallFlags install_flags = 0; + GFile *local_file; + g_autoptr(GTask) task = NULL; + InstallData *data; + g_autoptr(InstallData) data_owned = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fwupd_install_async); + + /* This function assumes that the file has already been downloaded and + * cached at @local_file. */ + local_file = gs_app_get_local_file (app); + if (local_file == NULL) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "not enough data for fwupd"); + return; + } + + data = data_owned = g_new0 (InstallData, 1); + data->app_needs_user_action_callback = app_needs_user_action_callback; + data->app_needs_user_action_data = app_needs_user_action_data; + data->app = g_object_ref (app); + data->interactive = interactive; + data->local_file = g_object_ref (local_file); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) install_data_free); + + /* limit to single device? */ + data->device_id = gs_fwupd_app_get_device_id (app); + if (data->device_id == NULL) + data->device_id = FWUPD_DEVICE_ID_ANY; + + /* watch for FwupdRequest */ + g_signal_connect (self->client, "device-request", G_CALLBACK (install_device_request_cb), task); + + /* Store the app pointer for getting status and progress updates from + * the daemon. + * + * FIXME: This only supports one operation in parallel, so progress + * reporting with gs_app_set_progress() will get a little confused if + * there are multiple firmware updates being applied. We need more API + * from libfwupd to improve on this; see + * https://github.com/fwupd/fwupd/issues/5522. */ + g_set_object (&self->app_current, app); + + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + + fwupd_client_install_async (self->client, data->device_id, + g_file_peek_path (local_file), install_flags, + cancellable, + install_install_cb, g_steal_pointer (&task)); +} + +static void +install_device_request_cb (FwupdClient *client, FwupdRequest *request, GTask *task) +{ + GsPluginFwupd *self = g_task_get_source_object (task); + InstallData *data = g_task_get_task_data (task); + g_autoptr(AsScreenshot) ss = as_screenshot_new (); + + /* check the device ID is correct */ + g_debug ("got FwupdRequest: %s for %s", + fwupd_request_get_id (request), + fwupd_request_get_device_id (request)); + if (g_strcmp0 (data->device_id, FWUPD_DEVICE_ID_ANY) != 0 && + g_strcmp0 (data->device_id, fwupd_request_get_device_id (request)) != 0) { + g_warning ("received request for %s, but updating %s", + fwupd_request_get_device_id (request), + data->device_id); + return; + } + + /* image is optional, caption is required */ + if (fwupd_request_get_image (request) != NULL) { + g_autoptr(AsImage) im = as_image_new (); + as_image_set_kind (im, AS_IMAGE_KIND_SOURCE); + as_image_set_url (im, fwupd_request_get_image (request)); + as_screenshot_add_image (ss, im); + } + as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_DEFAULT); + as_screenshot_set_caption (ss, fwupd_request_get_message (request), NULL); + + /* require the dialog */ + if (fwupd_request_get_kind (request) == FWUPD_REQUEST_KIND_POST) { + gs_app_add_quirk (data->app, GS_APP_QUIRK_NEEDS_USER_ACTION); + gs_app_set_action_screenshot (data->app, ss); + } else if (data->app_needs_user_action_callback != NULL) { + data->app_needs_user_action_callback (GS_PLUGIN (self), + data->app, + ss, + data->app_needs_user_action_data); + } +} + +static void +install_install_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + FwupdClient *client = FWUPD_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginFwupd *self = g_task_get_source_object (task); + InstallData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + + /* no longer handling requests */ + g_signal_handlers_disconnect_by_func (client, G_CALLBACK (install_device_request_cb), task); + + if (!fwupd_client_install_finish (client, result, &local_error)) { + g_autoptr(GsPluginEvent) event = NULL; + + /* show the user this failed */ + gs_plugin_fwupd_error_convert (&local_error); + event = gs_plugin_event_new ("app", self->app_current, + "error", local_error, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + if (data->interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_report_event (GS_PLUGIN (self), event); + + gs_app_set_state_recover (data->app); + + /* this error code *has* to be cancelled to *not* show the reboot dialog */ + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_CANCELLED, + "%s", local_error->message); + return; + } + + gs_app_set_state (data->app, GS_APP_STATE_INSTALLED); + + /* delete the file from the cache */ + g_file_delete_async (data->local_file, G_PRIORITY_DEFAULT, cancellable, + install_delete_cb, g_steal_pointer (&task)); +} + +static void +install_delete_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GFile *local_file = G_FILE (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginFwupd *self = g_task_get_source_object (task); + InstallData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + + if (!g_file_delete_finish (local_file, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_clear_error (&local_error); + + /* does the device have an update message? */ + fwupd_client_get_device_by_id_async (self->client, + data->device_id, + cancellable, + install_get_device_cb, + g_steal_pointer (&task)); +} + +static void +install_get_device_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + FwupdClient *client = FWUPD_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(FwupdDevice) dev = NULL; + g_autoptr(GError) local_error = NULL; + + dev = fwupd_client_get_device_by_id_finish (client, result, &local_error); + if (dev == NULL) { + /* NOTE: this is probably entirely fine; some devices do not + * re-enumerate until replugged manually or the machine is + * rebooted -- and the metadata to know that is only available + * in a too-new-to-depend-on fwupd version */ + g_debug ("failed to find device after install: %s", local_error->message); + } + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_fwupd_install_finish (GsPluginFwupd *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_fwupd_modify_source_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GError) local_error = NULL; + g_autoptr(GTask) task = user_data; + GsPluginFwupd *self = g_task_get_source_object (task); + GsApp *repository = g_task_get_task_data (task); + + if (!fwupd_client_modify_remote_finish (FWUPD_CLIENT (source_object), result, &local_error)) { + gs_app_set_state_recover (repository); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (gs_app_get_state (repository) == GS_APP_STATE_INSTALLING) + gs_app_set_state (repository, GS_APP_STATE_INSTALLED); + else if (gs_app_get_state (repository) == GS_APP_STATE_REMOVING) + gs_app_set_state (repository, GS_APP_STATE_AVAILABLE); + + gs_plugin_repository_changed (GS_PLUGIN (self), repository); + + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_fwupd_modify_source_async (GsPluginFwupd *self, + GsApp *repository, + gboolean enabled, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + const gchar *remote_id; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_task_data (task, g_object_ref (repository), g_object_unref); + g_task_set_source_tag (task, gs_plugin_fwupd_modify_source_async); + + if (!gs_app_has_management_plugin (repository, GS_PLUGIN (self))) { + g_task_return_boolean (task, TRUE); + return; + } + + /* source -> remote */ + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + remote_id = gs_app_get_metadata_item (repository, "fwupd::remote-id"); + if (remote_id == NULL) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "not enough data for fwupd %s", + gs_app_get_unique_id (repository)); + return; + } + gs_app_set_state (repository, enabled ? + GS_APP_STATE_INSTALLING : GS_APP_STATE_REMOVING); + fwupd_client_modify_remote_async (self->client, + remote_id, + "Enabled", + enabled ? "true" : "false", + cancellable, + gs_plugin_fwupd_modify_source_ready_cb, + g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_fwupd_modify_source_finish (GsPluginFwupd *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + /* Input data. */ + guint n_apps; + GsPluginInstallAppsFlags install_flags; /* mutually exclusive with @update_flags */ + GsPluginUpdateAppsFlags update_flags; /* mutually exclusive with @install_flags */ + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback; + gpointer app_needs_user_action_data; + + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ +} InstallOrUpdateAppsData; + +static void +install_or_update_apps_data_free (InstallOrUpdateAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallOrUpdateAppsData, install_or_update_apps_data_free) + +typedef struct { + GTask *task; /* (owned) */ + GsApp *app; /* (owned) */ + guint index; /* zero-based */ +} InstallOrUpdateSingleAppData; + +static void +install_or_update_single_app_data_free (InstallOrUpdateSingleAppData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->task); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallOrUpdateSingleAppData, install_or_update_single_app_data_free) + +static gboolean +is_install_or_update_install_flag_set (GsPluginInstallAppsFlags install_flags, + GsPluginInstallAppsFlags check_flag) +{ + if (((int) install_flags) == -1) + return FALSE; + + return (install_flags & check_flag) != 0; +} + +static gboolean +is_install_or_update_update_flag_set (GsPluginUpdateAppsFlags update_flags, + GsPluginUpdateAppsFlags check_flag) +{ + if (((int) update_flags) == -1) + return FALSE; + + return (update_flags & check_flag) != 0; +} + +static void install_or_update_app_download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_or_update_app_unlock_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_or_update_app_install_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_install_or_update_apps_op (GTask *task, + GError *error); + +static void +install_or_update_apps_impl (GsPluginFwupd *self, + GsAppList *apps, + GsPluginInstallAppsFlags install_flags, + GsPluginUpdateAppsFlags update_flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + gboolean interactive = is_install_or_update_install_flag_set (install_flags, GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE) || + is_install_or_update_update_flag_set (update_flags, GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + InstallOrUpdateAppsData *data; + g_autoptr(InstallOrUpdateAppsData) data_owned = NULL; + g_autoptr(GError) local_error = NULL; + + /* Exactly one must be set */ + g_assert ((int) install_flags == -1 || (int) update_flags == -1); + g_assert (!((int) install_flags == -1 && (int) update_flags == -1)); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, install_or_update_apps_impl); + + data = data_owned = g_new0 (InstallOrUpdateAppsData, 1); + data->install_flags = install_flags; + data->update_flags = update_flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->app_needs_user_action_callback = app_needs_user_action_callback; + data->app_needs_user_action_data = app_needs_user_action_data; + data->n_apps = gs_app_list_length (apps); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) install_or_update_apps_data_free); + + /* Start a load of operations in parallel to download the firmware + * files for all the apps. When each download is complete, start the + * install process for it in parallel with whatever downloads and + * installs are going on for the other apps. + * + * When all installs are finished for all apps, finish_install_or_update_apps_op() + * will return success/error for the overall #GTask. */ + data->n_pending_ops = 1; + + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + g_autoptr(InstallOrUpdateSingleAppData) app_data = NULL; + + /* source -> remote, handled by dedicated function */ + g_assert (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + app_data = g_new0 (InstallOrUpdateSingleAppData, 1); + app_data->index = i; + app_data->task = g_object_ref (task); + app_data->app = g_object_ref (app); + + data->n_pending_ops++; + if (!is_install_or_update_install_flag_set (install_flags, GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD) && + !is_install_or_update_update_flag_set (update_flags, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD)) { + gs_plugin_fwupd_download_async (self, app, interactive, cancellable, install_or_update_app_download_cb, g_steal_pointer (&app_data)); + } else { + install_or_update_app_download_cb (G_OBJECT (self), NULL, g_steal_pointer (&app_data)); + } + } + + finish_install_or_update_apps_op (task, NULL); +} + +static void +install_or_update_app_download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (source_object); + g_autoptr(InstallOrUpdateSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + InstallOrUpdateAppsData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + + if (result != NULL && + !gs_plugin_fwupd_download_finish (self, result, &local_error)) { + finish_install_or_update_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + if (!is_install_or_update_install_flag_set (data->install_flags, GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY) && + !is_install_or_update_update_flag_set (data->update_flags, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY)) { + /* locked devices need unlocking, rather than installing */ + if (gs_fwupd_app_get_is_locked (app_data->app)) { + const gchar *device_id = gs_fwupd_app_get_device_id (app_data->app); + + if (device_id == NULL) { + finish_install_or_update_apps_op (task, g_error_new (GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "not enough data for fwupd unlock")); + return; + } + + fwupd_client_unlock_async (self->client, device_id, + cancellable, + install_or_update_app_unlock_cb, + g_steal_pointer (&app_data)); + } else { + install_or_update_app_unlock_cb (G_OBJECT (self->client), NULL, g_steal_pointer (&app_data)); + } + } else { + /* Not installing the firmware or applying the update, so finish the operation now. */ + finish_install_or_update_apps_op (task, NULL); + } +} + +static void +install_or_update_app_unlock_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + FwupdClient *client = FWUPD_CLIENT (source_object); + g_autoptr(InstallOrUpdateSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + InstallOrUpdateAppsData *data = g_task_get_task_data (task); + gboolean interactive = is_install_or_update_install_flag_set (data->install_flags, GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE) || + is_install_or_update_update_flag_set (data->update_flags, GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginFwupd *self = g_task_get_source_object (task); + GsApp *app = app_data->app; + g_autoptr(GError) local_error = NULL; + + if (result != NULL && + !fwupd_client_unlock_finish (client, result, &local_error)) { + gs_plugin_fwupd_error_convert (&local_error); + finish_install_or_update_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + /* gs_plugin_fwupd_install_async() will install new firmware from + * scratch, or apply an update to existing firmware. */ + gs_plugin_fwupd_install_async (self, app, + interactive, + data->app_needs_user_action_callback, + data->app_needs_user_action_data, + cancellable, + install_or_update_app_install_cb, + g_steal_pointer (&app_data)); +} + +static void +install_or_update_app_install_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (source_object); + g_autoptr(InstallOrUpdateSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + InstallOrUpdateAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_fwupd_install_finish (self, result, &local_error)) { + gs_plugin_fwupd_error_convert (&local_error); + finish_install_or_update_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + /* Simple progress reporting. */ + if (data->progress_callback != NULL) { + data->progress_callback (GS_PLUGIN (self), + 100 * ((gdouble) (app_data->index + 1) / data->n_apps), + data->progress_user_data); + } + + /* App successfully installed/updated. */ + finish_install_or_update_apps_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_install_or_update_apps_op (GTask *task, + GError *error) +{ + GsPluginFwupd *self = g_task_get_source_object (task); + InstallOrUpdateAppsData *data = g_task_get_task_data (task); + gboolean interactive = is_install_or_update_install_flag_set (data->install_flags, GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE) || + is_install_or_update_update_flag_set (data->update_flags, GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + /* Report certain errors to the user directly. Any errors which we + * return from the `update_apps_async()` vfunc are logged but not + * displayed in the UI as the #GsPluginJobUpdateApps code can’t know + * which errors are understandable by users and which aren’t. */ + if (g_error_matches (error_owned, FWUPD_ERROR, FWUPD_ERROR_NEEDS_USER_ACTION)) { + g_autoptr(GError) event_error = NULL; + g_autoptr(GsPluginEvent) event = NULL; + + event_error = g_error_copy (error_owned); + g_prefix_error_literal (&event_error, _("Firmware update could not be applied: ")); + gs_plugin_fwupd_error_convert (&event_error); + + event = gs_plugin_event_new ("app", self->app_current, + "error", event_error, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_report_event (GS_PLUGIN (self), event); + } + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while installing/updating apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_fwupd_update_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + + install_or_update_apps_impl (self, apps, -1, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); +} + +static gboolean +gs_plugin_fwupd_update_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_fwupd_install_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + + install_or_update_apps_impl (self, apps, flags, -1, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); +} + +static gboolean +gs_plugin_fwupd_install_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void gs_plugin_fwupd_file_to_app_got_content_type_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_fwupd_file_to_app_async (GsPlugin *plugin, + GFile *file, + GsPluginFileToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = gs_plugin_file_to_app_data_new_task (plugin, file, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fwupd_file_to_app_async); + + gs_utils_get_content_type_async (file, cancellable, + gs_plugin_fwupd_file_to_app_got_content_type_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_fwupd_file_to_app_got_content_type_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GPtrArray) devices = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + g_autofree gchar *content_type = NULL; + g_autofree gchar *filename = NULL; + GsPluginFileToAppData *data = g_task_get_task_data (task); + GsPluginFwupd *self = GS_PLUGIN_FWUPD (g_task_get_source_object (task)); + GsPlugin *plugin = GS_PLUGIN (self); + const gchar *mimetypes[] = { + "application/vnd.ms-cab-compressed", + NULL }; + + content_type = gs_utils_get_content_type_finish (G_FILE (source_object), result, &local_error); + if (content_type == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + if (!g_strv_contains (mimetypes, content_type)) { + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } + + filename = g_file_get_path (data->file); + devices = fwupd_client_get_details (self->client, filename, g_task_get_cancellable (task), &local_error); + if (devices == NULL) { + gs_plugin_fwupd_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + list = gs_app_list_new (); + + for (guint i = 0; i < devices->len; i++) { + FwupdDevice *dev = g_ptr_array_index (devices, i); + g_autoptr(GsApp) app = NULL; + + /* create each app */ + app = gs_plugin_fwupd_new_app_from_device (plugin, dev, TRUE); + + /* we *might* have no update view for local files */ + gs_app_set_version (app, gs_app_get_update_version (app)); + gs_app_set_description (app, GS_APP_QUALITY_LOWEST, + gs_app_get_update_details_markup (app)); + gs_app_set_local_file (app, data->file); + gs_app_list_add (list, app); + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_fwupd_file_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_fwupd_enable_repository_remote_refresh_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + + if (!fwupd_client_refresh_remote_finish (FWUPD_CLIENT (source_object), result, &local_error)) + g_debug ("Failed to refresh remote after enable: %s", local_error ? local_error->message : "Unknown error"); + + /* Silently ignore refresh errors */ + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_fwupd_enable_repository_get_remotes_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + g_autoptr(GPtrArray) remotes = NULL; + GsPluginFwupd *self = GS_PLUGIN_FWUPD (g_task_get_source_object (task)); + GsApp *repository = g_task_get_task_data (task); + const gchar *remote_id; + guint cache_age = 1; + + remotes = fwupd_client_get_remotes_finish (FWUPD_CLIENT (source_object), result, &local_error); + if (remotes == NULL) { + g_debug ("No remotes found after remote enable: %s", local_error ? local_error->message : "Unknown error"); + /* Silently ignore refresh errors */ + g_task_return_boolean (task, TRUE); + return; + } + + remote_id = gs_app_get_metadata_item (repository, "fwupd::remote-id"); + g_assert (remote_id != NULL); + + for (guint i = 0; i < remotes->len; i++) { + FwupdRemote *remote = g_ptr_array_index (remotes, i); + if (g_strcmp0 (remote_id, fwupd_remote_get_id (remote)) == 0) { + gboolean is_enabled; + #if FWUPD_CHECK_VERSION(1, 9, 4) + is_enabled = fwupd_remote_has_flag (remote, FWUPD_REMOTE_FLAG_ENABLED); + #else + is_enabled = fwupd_remote_get_enabled (remote); + #endif + if (is_enabled && + fwupd_remote_get_kind (remote) != FWUPD_REMOTE_KIND_LOCAL && + !remote_cache_is_expired (remote, cache_age)) { + GCancellable *cancellable = g_task_get_cancellable (task); + #if FWUPD_CHECK_VERSION(2, 0, 0) + fwupd_client_refresh_remote_async (self->client, remote, FWUPD_CLIENT_DOWNLOAD_FLAG_NONE, cancellable, + gs_plugin_fwupd_enable_repository_remote_refresh_ready_cb, + g_steal_pointer (&task)); + #elif FWUPD_CHECK_VERSION(1, 9, 4) + fwupd_client_refresh_remote2_async (self->client, remote, FWUPD_CLIENT_DOWNLOAD_FLAG_NONE, cancellable, + gs_plugin_fwupd_enable_repository_remote_refresh_ready_cb, + g_steal_pointer (&task)); + #else + fwupd_client_refresh_remote_async (self->client, remote, cancellable, + gs_plugin_fwupd_enable_repository_remote_refresh_ready_cb, + g_steal_pointer (&task)); + #endif + return; + } + break; + } + } + + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_fwupd_enable_repository_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + GsPluginFwupd *self = GS_PLUGIN_FWUPD (g_task_get_source_object (task)); + GCancellable *cancellable = g_task_get_cancellable (task); + + if (!gs_plugin_fwupd_modify_source_finish (self, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* This can fail silently, it's only to update necessary caches, to provide + * up-to-date information after the successful repository enable/install. */ + fwupd_client_get_remotes_async (self->client, + cancellable, + gs_plugin_fwupd_enable_repository_get_remotes_ready_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_fwupd_enable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_task_data (task, g_object_ref (repository), g_object_unref); + g_task_set_source_tag (task, gs_plugin_fwupd_enable_repository_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + gs_plugin_fwupd_modify_source_async (self, repository, TRUE, cancellable, + gs_plugin_fwupd_enable_repository_ready_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_fwupd_enable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_fwupd_disable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_fwupd_disable_repository_async); + g_task_return_boolean (task, TRUE); + return; + } + + gs_plugin_fwupd_modify_source_async (self, repository, FALSE, cancellable, callback, user_data); +} + +static gboolean +gs_plugin_fwupd_disable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin); + return gs_plugin_fwupd_modify_source_finish (self, result, error); +} + +static void +gs_plugin_fwupd_class_init (GsPluginFwupdClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_fwupd_dispose; + object_class->finalize = gs_plugin_fwupd_finalize; + + plugin_class->setup_async = gs_plugin_fwupd_setup_async; + plugin_class->setup_finish = gs_plugin_fwupd_setup_finish; + plugin_class->refresh_metadata_async = gs_plugin_fwupd_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_fwupd_refresh_metadata_finish; + plugin_class->enable_repository_async = gs_plugin_fwupd_enable_repository_async; + plugin_class->enable_repository_finish = gs_plugin_fwupd_enable_repository_finish; + plugin_class->disable_repository_async = gs_plugin_fwupd_disable_repository_async; + plugin_class->disable_repository_finish = gs_plugin_fwupd_disable_repository_finish; + plugin_class->install_apps_async = gs_plugin_fwupd_install_apps_async; + plugin_class->install_apps_finish = gs_plugin_fwupd_install_apps_finish; + plugin_class->update_apps_async = gs_plugin_fwupd_update_apps_async; + plugin_class->update_apps_finish = gs_plugin_fwupd_update_apps_finish; + plugin_class->list_apps_async = gs_plugin_fwupd_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_fwupd_list_apps_finish; + plugin_class->file_to_app_async = gs_plugin_fwupd_file_to_app_async; + plugin_class->file_to_app_finish = gs_plugin_fwupd_file_to_app_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_FWUPD; +} diff --git a/plugins/fwupd/gs-plugin-fwupd.h b/plugins/fwupd/gs-plugin-fwupd.h new file mode 100644 index 0000000..2ee5a04 --- /dev/null +++ b/plugins/fwupd/gs-plugin-fwupd.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_FWUPD (gs_plugin_fwupd_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginFwupd, gs_plugin_fwupd, GS, PLUGIN_FWUPD, GsPlugin) + +G_END_DECLS diff --git a/plugins/fwupd/gs-self-test.c b/plugins/fwupd/gs-self-test.c new file mode 100644 index 0000000..82504f1 --- /dev/null +++ b/plugins/fwupd/gs-self-test.c @@ -0,0 +1,106 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gnome-software-private.h" + +#include "gs-test.h" + +static void +gs_plugins_fwupd_func (GsPluginLoader *plugin_loader) +{ + g_autofree gchar *fn = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + GsSizeType size_download_type; + guint64 size_download_bytes; + + /* no fwupd, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "fwupd")) { + g_test_skip ("not enabled"); + return; + } + + /* load local file */ + fn = gs_test_get_filename (TESTDATADIR, "chiron-0.2.cab"); + g_assert_nonnull (fn); + file = g_file_new_for_path (fn); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert_nonnull (app); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_FIRMWARE); + g_assert_nonnull (gs_app_get_license (app)); + g_assert_true (gs_app_has_category (app, "System")); + g_assert_cmpstr (gs_app_get_id (app), ==, "com.test.chiron.firmware"); + g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, "http://127.0.0.1/"); + g_assert_cmpstr (gs_app_get_name (app), ==, "Chiron"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "Single line synopsis"); + g_assert_cmpstr (gs_app_get_version (app), ==, "0.2"); + size_download_type = gs_app_get_size_download (app, &size_download_bytes); + g_assert_cmpint (size_download_type, ==, GS_SIZE_TYPE_VALID); + g_assert_cmpuint (size_download_bytes, ==, 32784); +#if FWUPD_CHECK_VERSION(1, 7, 1) && !FWUPD_CHECK_VERSION(1, 8, 0) + /* Changes introduced in fwupd commit d3706e0e0b0fc210796da839b84ac391f7a251f8 and + removed for 1.8.0 with https://github.com/fwupd/fwupd/commit/0eeaad76ec79562ea3790bb377d847d5be02182f */ + g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, + "Some of the platform secrets may be invalidated when " + "updating this firmware. Please ensure you have the " + "volume recovery key before continuing.\n\nLatest " + "firmware release."); +#else + g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, + "Latest firmware release."); +#endif + + /* seems wrong, but this is only set if the update is available */ + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UNKNOWN); +} + +int +main (int argc, char **argv) +{ + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + const gchar * const allowlist[] = { + "fwupd", + NULL + }; + + /* While we use %G_TEST_OPTION_ISOLATE_DIRS to create temporary directories + * for each of the tests, we want to use the system MIME registry, assuming + * that it exists and correctly has shared-mime-info installed. */ + g_content_type_set_mime_dirs (NULL); + + gs_test_init (&argc, &argv); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_true (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/fwupd", + plugin_loader, + (GTestDataFunc) gs_plugins_fwupd_func); + + return g_test_run (); +} diff --git a/plugins/fwupd/meson.build b/plugins/fwupd/meson.build new file mode 100644 index 0000000..4725482 --- /dev/null +++ b/plugins/fwupd/meson.build @@ -0,0 +1,50 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginFwupd"'] +cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] +deps = [ + plugin_libs, + fwupd, +] + +if get_option('mogwai') + deps += [mogwai_schedule_client] +endif + +shared_module( + 'gs_plugin_fwupd', + sources : [ + 'gs-fwupd-app.c', + 'gs-plugin-fwupd.c', + ], + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : deps, +) +metainfo = 'org.gnome.Software.Plugin.Fwupd.metainfo.xml' + +i18n.merge_file( + input: metainfo + '.in', + output: metainfo, + type: 'xml', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'metainfo') +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), 'tests') + '"'] + e = executable( + 'gs-self-test-fwupd', + compiled_schemas, + sources : [ + 'gs-self-test.c' + ], + dependencies : deps, + c_args : cargs, + ) + test('gs-self-test-fwupd', e, suite: ['plugins', 'fwupd'], env: test_env) +endif diff --git a/plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in b/plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in new file mode 100644 index 0000000..e6c4218 --- /dev/null +++ b/plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in @@ -0,0 +1,12 @@ + + + + org.gnome.Software.Plugin.Fwupd + org.gnome.Software.desktop + Firmware Upgrade Support + Provides support for firmware upgrades + https://fwupd.org/ + CC0-1.0 + GPL-2.0-or-later + richard_at_hughsie.com + diff --git a/plugins/fwupd/tests/build-cab.sh b/plugins/fwupd/tests/build-cab.sh new file mode 100755 index 0000000..ea7bed6 --- /dev/null +++ b/plugins/fwupd/tests/build-cab.sh @@ -0,0 +1,4 @@ +gcab --create chiron-0.2.cab \ + firmware.dfu \ + firmware.dfu.asc \ + firmware.metainfo.xml diff --git a/plugins/fwupd/tests/chiron-0.2.cab b/plugins/fwupd/tests/chiron-0.2.cab new file mode 100644 index 0000000000000000000000000000000000000000..6618361285eda4e15f747a19eca4965fb1d4cad8 GIT binary patch literal 34376 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 Ynmd#G*q$pmPG?zYvsJDs?OA30e^_c_Bme*a literal 0 HcmV?d00001 diff --git a/plugins/fwupd/tests/firmware.dfu b/plugins/fwupd/tests/firmware.dfu new file mode 100644 index 0000000000000000000000000000000000000000..50f00c0d313854b3ede3d60e49c7eef6c71a65d1 GIT binary patch literal 32784 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 literal 0 HcmV?d00001 diff --git a/plugins/fwupd/tests/firmware.dfu.asc b/plugins/fwupd/tests/firmware.dfu.asc new file mode 100644 index 0000000..0ea79a7 --- /dev/null +++ b/plugins/fwupd/tests/firmware.dfu.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.14 (GNU/Linux) + +iQEcBAABAgAGBQJWUy6EAAoJEEim2A5FOLrCxokIAJJtLVkuXZHgEu2C2Eq9jGrR +FZ9/z9XtsMgs33teLdmYUAQwvnNIbtIb6z7JViP8llCREP8y2fH+1OjrOOdtuS/A +bIJ0r40c9wYeH97ZcXBdHZiYVEFO+etbMBUg5ifuRO5VPjD9H1NqL05Wx9kUg/1T +a1fwgHopXR0T4jYcg5aijp3mdgfmg4boIklDaRV/g2c93W+0VhDZ2h5sKwBxxlFS +TrptclTMCvRYmVvL1CDOsBtgzu3jGo03wV9rcnSKzeBWvINcvlRLdS0ejlPaRYDK +MUY4MBVz3fDW1vFsqLpU80XMOYk0bxtQqQ2MsrlXWp9qazB+A6mC7kOnJQfx0yI= +=A3W8 +-----END PGP SIGNATURE----- diff --git a/plugins/fwupd/tests/firmware.metainfo.xml b/plugins/fwupd/tests/firmware.metainfo.xml new file mode 100644 index 0000000..41ebece --- /dev/null +++ b/plugins/fwupd/tests/firmware.metainfo.xml @@ -0,0 +1,30 @@ + + + + com.test.chiron.firmware + Chiron +

          Single line synopsis + +

          + This is the first paragraph in the example cab file. +

          +

          + This is the second paragraph. +

          +
          + + fd9f37b4-36fb-5245-86a8-4d5993bb153b + + http://127.0.0.1/ + CC0-1.0 + GPL-2.0-or-later + ACME Corp + + + + +

          Latest firmware release.

          +
          +
          +
          + diff --git a/plugins/malcontent/gs-plugin-malcontent.c b/plugins/malcontent/gs-plugin-malcontent.c new file mode 100644 index 0000000..62b4ef8 --- /dev/null +++ b/plugins/malcontent/gs-plugin-malcontent.c @@ -0,0 +1,480 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018-2019 Endless Mobile + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include +#include +#include +#include + +#include "gs-plugin-malcontent.h" +#include "gs-plugin-private.h" + +/* + * SECTION: + * Adds the %GS_APP_QUIRK_PARENTAL_FILTER and + * %GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE quirks to applications if they + * contravene the effective user’s current parental controls policy. + * + * Specifically, %GS_APP_QUIRK_PARENTAL_FILTER will be added if an app’s OARS + * rating is too extreme for the current parental controls OARS policy. + * %GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE will be added if the app is listed on + * the current parental controls blocklist. + * + * Parental controls policy is loaded using libmalcontent. + * + * This plugin is ordered after flatpak and appstream as it uses OARS data from + * them. + * + * Limiting access to applications by not allowing them to be launched by + * gnome-software is only one part of a wider approach to parental controls. + * In order to guarantee users do not have access to applications they shouldn’t + * have access to, an LSM (such as AppArmor) needs to be used. That complements, + * rather than substitutes for, filtering in user visible UIs. + */ + +struct _GsPluginMalcontent { + GsPlugin parent; + + GMutex mutex; /* protects @app_filter **/ + MctManager *manager; /* (owned) */ + gulong manager_app_filter_changed_id; + MctAppFilter *app_filter; /* (mutex) (owned) (nullable) */ +}; + +G_DEFINE_TYPE (GsPluginMalcontent, gs_plugin_malcontent, GS_TYPE_PLUGIN) + +/* Convert an #MctAppFilterOarsValue to an #AsContentRatingValue. This is + * actually a trivial cast, since the types are defined the same; but throw in + * a static assertion to be sure. */ +static AsContentRatingValue +convert_app_filter_oars_value (MctAppFilterOarsValue filter_value) +{ + G_STATIC_ASSERT (AS_CONTENT_RATING_VALUE_LAST == MCT_APP_FILTER_OARS_VALUE_INTENSE + 1); + + return (AsContentRatingValue) filter_value; +} + +static gboolean +app_is_expected_to_have_content_rating (GsApp *app) +{ + if (gs_app_has_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE)) + return FALSE; + + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_ADDON: + case AS_COMPONENT_KIND_CODEC: + case AS_COMPONENT_KIND_DRIVER: + case AS_COMPONENT_KIND_FIRMWARE: + case AS_COMPONENT_KIND_FONT: + case AS_COMPONENT_KIND_GENERIC: + case AS_COMPONENT_KIND_INPUT_METHOD: + case AS_COMPONENT_KIND_LOCALIZATION: + case AS_COMPONENT_KIND_OPERATING_SYSTEM: + case AS_COMPONENT_KIND_RUNTIME: + case AS_COMPONENT_KIND_REPOSITORY: + return FALSE; + case AS_COMPONENT_KIND_UNKNOWN: + case AS_COMPONENT_KIND_DESKTOP_APP: + case AS_COMPONENT_KIND_WEB_APP: + case AS_COMPONENT_KIND_CONSOLE_APP: + default: + break; + } + + return TRUE; +} + +/* Check whether the OARS rating for @app is as, or less, extreme than the + * user’s preferences in @app_filter. If so (i.e. if the app is suitable for + * this user to use), return %TRUE; otherwise return %FALSE. + * + * The #AsContentRating in @app may be %NULL if no OARS ratings are provided for + * the app. If so, we have to assume the most restrictive ratings. However, if + * @rating is provided but is empty, we assume that every section in it has + * value %AS_CONTENT_RATING_VALUE_NONE. See + * https://github.com/hughsie/oars/blob/HEAD/specification/oars-1.1.md */ +static gboolean +app_is_content_rating_appropriate (GsApp *app, MctAppFilter *app_filter) +{ + g_autoptr(AsContentRating) rating = gs_app_dup_content_rating (app); /* (nullable) */ + g_autofree const gchar **oars_sections = mct_app_filter_get_oars_sections (app_filter); + AsContentRatingValue default_rating_value; + + if (rating == NULL && !app_is_expected_to_have_content_rating (app)) { + /* Some apps, such as flatpak runtimes, are not expected to have + * content ratings. */ + return TRUE; + } else if (rating == NULL) { + g_debug ("No OARS ratings provided for ‘%s’: assuming most extreme", + gs_app_get_unique_id (app)); + default_rating_value = AS_CONTENT_RATING_VALUE_INTENSE; + } else { + default_rating_value = AS_CONTENT_RATING_VALUE_NONE; + } + + for (gsize i = 0; oars_sections[i] != NULL; i++) { + AsContentRatingValue rating_value; + MctAppFilterOarsValue filter_value; + + filter_value = mct_app_filter_get_oars_value (app_filter, oars_sections[i]); + + if (rating != NULL) + rating_value = as_content_rating_get_value (rating, oars_sections[i]); + else + rating_value = AS_CONTENT_RATING_VALUE_UNKNOWN; + + if (rating_value == AS_CONTENT_RATING_VALUE_UNKNOWN) + rating_value = default_rating_value; + + if (filter_value == MCT_APP_FILTER_OARS_VALUE_UNKNOWN) + continue; + else if (convert_app_filter_oars_value (filter_value) < rating_value) + return FALSE; + } + + return TRUE; +} + +static gboolean +app_is_parentally_blocklisted (GsApp *app, MctAppFilter *app_filter) +{ + const gchar *desktop_id; + g_autoptr(GAppInfo) appinfo = NULL; + + desktop_id = gs_app_get_id (app); + if (desktop_id == NULL) + return FALSE; + appinfo = G_APP_INFO (gs_utils_get_desktop_app_info (desktop_id)); + if (appinfo == NULL) + return FALSE; + + return !mct_app_filter_is_appinfo_allowed (app_filter, appinfo); +} + +static gboolean +app_set_parental_quirks (GsPluginMalcontent *self, + GsApp *app, + MctAppFilter *app_filter) +{ + /* note that both quirks can be set on an app at the same time, and they + * have slightly different meanings */ + gboolean filtered = FALSE; + + /* check the OARS ratings to see if this app should be installable */ + if (!app_is_content_rating_appropriate (app, app_filter)) { + g_debug ("Filtering ‘%s’: app OARS rating is too extreme for this user", + gs_app_get_unique_id (app)); + gs_app_add_quirk (app, GS_APP_QUIRK_PARENTAL_FILTER); + filtered = TRUE; + } else { + gs_app_remove_quirk (app, GS_APP_QUIRK_PARENTAL_FILTER); + } + + /* check the app blocklist to see if this app should be launchable */ + if (app_is_parentally_blocklisted (app, app_filter)) { + g_debug ("Filtering ‘%s’: app is blocklisted for this user", + gs_app_get_unique_id (app)); + gs_app_add_quirk (app, GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE); + filtered = TRUE; + } else { + gs_app_remove_quirk (app, GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE); + } + + return filtered; +} + +static void +reload_app_filter_async (GsPluginMalcontent *self, + gboolean interactive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Refresh the app filter. This causes a D-Bus request. */ + mct_manager_get_app_filter_async (self->manager, + getuid (), + interactive ? MCT_MANAGER_GET_VALUE_FLAGS_INTERACTIVE : MCT_MANAGER_GET_VALUE_FLAGS_NONE, + cancellable, + callback, + user_data); +} + +static gboolean +reload_app_filter_finish (GsPluginMalcontent *self, + GAsyncResult *result, + GError **error) +{ + g_autoptr(MctAppFilter) new_app_filter = NULL; + g_autoptr(MctAppFilter) old_app_filter = NULL; + + new_app_filter = mct_manager_get_app_filter_finish (self->manager, + result, + error); + + /* on failure, keep the old app filter around since it might be more + * useful than nothing */ + if (new_app_filter == NULL) + return FALSE; + + { + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->mutex); + old_app_filter = g_steal_pointer (&self->app_filter); + self->app_filter = g_steal_pointer (&new_app_filter); + } + + return TRUE; +} + +static void reload_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +app_filter_changed_cb (MctManager *manager, + guint64 user_id, + gpointer user_data) +{ + GsPluginMalcontent *self = GS_PLUGIN_MALCONTENT (user_data); + + if (user_id != getuid ()) + return; + + /* The user’s app filter has changed, which means that different + * apps could be filtered from before. Reload everything to be + * sure of re-filtering correctly. */ + g_debug ("Reloading due to app filter changing for user %" G_GUINT64_FORMAT, user_id); + reload_app_filter_async (self, FALSE, NULL, reload_cb, g_object_ref (self)); +} + +static void +reload_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsPluginMalcontent) self = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (reload_app_filter_finish (self, result, &local_error)) + gs_plugin_reload (GS_PLUGIN (self)); + else + g_warning ("Failed to reload changed app filter: %s", local_error->message); +} + +static void +gs_plugin_malcontent_init (GsPluginMalcontent *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + /* need application IDs and content ratings */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "flatpak"); + + /* set plugin name; it’s not a loadable plugin, but this is descriptive and harmless */ + gs_plugin_set_appstream_id (plugin, "org.gnome.Software.Plugin.Malcontent"); +} + +static void get_app_filter_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_malcontent_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginMalcontent *self = GS_PLUGIN_MALCONTENT (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_malcontent_setup_async); + + self->manager = mct_manager_new (gs_plugin_get_system_bus_connection (plugin)); + self->manager_app_filter_changed_id = g_signal_connect (self->manager, + "app-filter-changed", + (GCallback) app_filter_changed_cb, + self); + + mct_manager_get_app_filter_async (self->manager, getuid (), + /* FIXME: Should this be unconditionally interactive? */ + MCT_MANAGER_GET_VALUE_FLAGS_INTERACTIVE, cancellable, + get_app_filter_cb, + g_steal_pointer (&task)); +} + +static void +get_app_filter_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginMalcontent *self = g_task_get_source_object (task); + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->mutex); + g_autoptr(GError) local_error = NULL; + + self->app_filter = mct_manager_get_app_filter_finish (self->manager, result, &local_error); + if (self->app_filter == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_malcontent_setup_finish (GsPlugin *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +refine_app_locked (GsPluginMalcontent *self, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error) +{ + /* not valid */ + if (gs_app_get_id (app) == NULL) + return TRUE; + + /* Filter by various parental filters. The filter can’t be %NULL, + * otherwise setup() would have failed and the plugin would have been + * disabled. */ + g_assert (self->app_filter != NULL); + + app_set_parental_quirks (self, app, self->app_filter); + + return TRUE; +} + +static void +gs_plugin_malcontent_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginMalcontent *self = GS_PLUGIN_MALCONTENT (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->mutex); + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_malcontent_refine_async); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (!refine_app_locked (self, app, flags, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_malcontent_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void refresh_metadata_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_malcontent_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginMalcontent *self = GS_PLUGIN_MALCONTENT (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_malcontent_refresh_metadata_async); + + reload_app_filter_async (self, + (flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE), + cancellable, + refresh_metadata_cb, + g_steal_pointer (&task)); +} + +static void +refresh_metadata_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginMalcontent *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + if (reload_app_filter_finish (self, result, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static gboolean +gs_plugin_malcontent_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_malcontent_dispose (GObject *object) +{ + GsPluginMalcontent *self = GS_PLUGIN_MALCONTENT (object); + + g_clear_pointer (&self->app_filter, mct_app_filter_unref); + if (self->manager != NULL && self->manager_app_filter_changed_id != 0) { + g_signal_handler_disconnect (self->manager, + self->manager_app_filter_changed_id); + self->manager_app_filter_changed_id = 0; + } + g_clear_object (&self->manager); + + G_OBJECT_CLASS (gs_plugin_malcontent_parent_class)->dispose (object); +} + +static void +gs_plugin_malcontent_class_init (GsPluginMalcontentClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_malcontent_dispose; + + plugin_class->setup_async = gs_plugin_malcontent_setup_async; + plugin_class->setup_finish = gs_plugin_malcontent_setup_finish; + plugin_class->refine_async = gs_plugin_malcontent_refine_async; + plugin_class->refine_finish = gs_plugin_malcontent_refine_finish; + plugin_class->refresh_metadata_async = gs_plugin_malcontent_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_malcontent_refresh_metadata_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_MALCONTENT; +} diff --git a/plugins/malcontent/gs-plugin-malcontent.h b/plugins/malcontent/gs-plugin-malcontent.h new file mode 100644 index 0000000..15fb70f --- /dev/null +++ b/plugins/malcontent/gs-plugin-malcontent.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_MALCONTENT (gs_plugin_malcontent_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginMalcontent, gs_plugin_malcontent, GS, PLUGIN_MALCONTENT, GsPlugin) + +G_END_DECLS diff --git a/plugins/malcontent/meson.build b/plugins/malcontent/meson.build new file mode 100644 index 0000000..f7f7520 --- /dev/null +++ b/plugins/malcontent/meson.build @@ -0,0 +1,10 @@ +c_args = ['-DG_LOG_DOMAIN="GsPluginMalcontent"'] + +shared_module( + 'gs_plugin_malcontent', + sources : 'gs-plugin-malcontent.c', + install : true, + install_dir: plugin_dir, + c_args : c_args, + dependencies : [ plugin_libs, malcontent ], +) diff --git a/plugins/meson.build b/plugins/meson.build new file mode 100644 index 0000000..a108e47 --- /dev/null +++ b/plugins/meson.build @@ -0,0 +1,52 @@ +plugin_dir = join_paths(gs_private_libdir, 'plugins-' + gs_plugin_api_version) +plugin_libs = [ + appstream, + gio_unix, + json_glib, + libsoup, + libgnomesoftware_dep, +] + +subdir('core') +subdir('dpkg') +subdir('dummy') +subdir('fedora-langpacks') +subdir('fedora-pkgdb-collections') + +if get_option('dkms') + subdir('dkms') +endif +if get_option('eos_updater') + subdir('eos-updater') +endif +if get_option('flatpak') + subdir('flatpak') +endif +if get_option('fwupd') + subdir('fwupd') +endif +if get_option('gudev') + subdir('modalias') +endif +if get_option('malcontent') + subdir('malcontent') +endif +if get_option('opensuse-distro-upgrade') + subdir('opensuse-distro-upgrade') +endif +if get_option('packagekit') + subdir('packagekit') +endif +subdir('repos') +if get_option('rpm_ostree') + subdir('rpm-ostree') +endif +if get_option('snap') + subdir('snap') +endif +if get_option('webapps') + subdir('epiphany') +endif +if get_option('systemd-sysupdate') + subdir('systemd-sysupdate') +endif diff --git a/plugins/modalias/gs-plugin-modalias.c b/plugins/modalias/gs-plugin-modalias.c new file mode 100644 index 0000000..e46a64f --- /dev/null +++ b/plugins/modalias/gs-plugin-modalias.c @@ -0,0 +1,199 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include + +#include + +#include "gs-plugin-modalias.h" + +struct _GsPluginModalias { + GsPlugin parent; + + GUdevClient *client; + GPtrArray *devices; +}; + +G_DEFINE_TYPE (GsPluginModalias, gs_plugin_modalias, GS_TYPE_PLUGIN) + +static void +gs_plugin_modalias_uevent_cb (GUdevClient *client, + const gchar *action, + GUdevDevice *device, + gpointer user_data) +{ + GsPluginModalias *self = GS_PLUGIN_MODALIAS (user_data); + + if (g_strcmp0 (action, "add") == 0 || + g_strcmp0 (action, "remove") == 0) { + g_debug ("invalidating devices as '%s' sent action '%s'", + g_udev_device_get_sysfs_path (device), + action); + g_ptr_array_set_size (self->devices, 0); + } +} + +static void +gs_plugin_modalias_init (GsPluginModalias *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "icons"); + + self->devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + self->client = g_udev_client_new (NULL); + g_signal_connect (self->client, "uevent", + G_CALLBACK (gs_plugin_modalias_uevent_cb), self); +} + +static void +gs_plugin_modalias_dispose (GObject *object) +{ + GsPluginModalias *self = GS_PLUGIN_MODALIAS (object); + + g_clear_object (&self->client); + g_clear_pointer (&self->devices, g_ptr_array_unref); + + G_OBJECT_CLASS (gs_plugin_modalias_parent_class)->dispose (object); +} + +static void +gs_plugin_modalias_ensure_devices (GsPluginModalias *self) +{ + g_autoptr(GList) list = NULL; + + /* already set */ + if (self->devices->len > 0) + return; + + /* get the devices, and assume ownership of each */ + list = g_udev_client_query_by_subsystem (self->client, NULL); + for (GList *l = list; l != NULL; l = l->next) { + GUdevDevice *device = G_UDEV_DEVICE (l->data); + if (g_udev_device_get_sysfs_attr (device, "modalias") == NULL) { + g_object_unref (device); + continue; + } + g_ptr_array_add (self->devices, device); + } + g_debug ("%u devices with modalias", self->devices->len); +} + +static gboolean +gs_plugin_modalias_matches (GsPluginModalias *self, + const gchar *modalias) +{ + gs_plugin_modalias_ensure_devices (self); + for (guint i = 0; i < self->devices->len; i++) { + GUdevDevice *device = g_ptr_array_index (self->devices, i); + const gchar *modalias_tmp; + + /* get the (optional) device modalias */ + modalias_tmp = g_udev_device_get_sysfs_attr (device, "modalias"); + if (modalias_tmp == NULL) + continue; + if (fnmatch (modalias, modalias_tmp, 0) == 0) { + g_debug ("matched %s against %s", modalias_tmp, modalias); + return TRUE; + } + } + return FALSE; +} + +static gboolean +refine_app (GsPluginModalias *self, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error) +{ + GPtrArray *provided; + guint i; + + /* not required */ + if (gs_app_has_icons (app)) + return TRUE; + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_DRIVER) + return TRUE; + + /* do any of the modaliases match any installed hardware */ + provided = gs_app_get_provided (app); + for (i = 0 ; i < provided->len; i++) { + GPtrArray *items; + AsProvided *prov = g_ptr_array_index (provided, i); + if (as_provided_get_kind (prov) != AS_PROVIDED_KIND_MODALIAS) + continue; + items = as_provided_get_items (prov); + for (guint j = 0; j < items->len; j++) { + if (gs_plugin_modalias_matches (self, (const gchar*) g_ptr_array_index (items, j))) { + g_autoptr(GIcon) ic = NULL; + ic = g_themed_icon_new ("emblem-system-symbolic"); + gs_app_add_icon (app, ic); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + break; + } + } + } + return TRUE; +} + +static void +gs_plugin_modalias_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginModalias *self = GS_PLUGIN_MODALIAS (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_modalias_refine_async); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (!refine_app (self, app, flags, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_modalias_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_modalias_class_init (GsPluginModaliasClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_modalias_dispose; + + plugin_class->refine_async = gs_plugin_modalias_refine_async; + plugin_class->refine_finish = gs_plugin_modalias_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_MODALIAS; +} diff --git a/plugins/modalias/gs-plugin-modalias.h b/plugins/modalias/gs-plugin-modalias.h new file mode 100644 index 0000000..7846bbf --- /dev/null +++ b/plugins/modalias/gs-plugin-modalias.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_MODALIAS (gs_plugin_modalias_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginModalias, gs_plugin_modalias, GS, PLUGIN_MODALIAS, GsPlugin) + +G_END_DECLS diff --git a/plugins/modalias/gs-self-test.c b/plugins/modalias/gs-self-test.c new file mode 100644 index 0000000..054a346 --- /dev/null +++ b/plugins/modalias/gs-self-test.c @@ -0,0 +1,113 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gnome-software-private.h" + +#include "gs-test.h" + +static void +gs_plugins_modalias_func (GsPluginLoader *plugin_loader) +{ + GsApp *app; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get search result based on addon keyword */ + keywords[0] = "colorhug2"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (list != NULL); + + /* make sure there is one entry, the parent app */ + g_assert_cmpint (gs_app_list_length (list), ==, 1); + app = gs_app_list_index (list, 0); + g_assert_cmpstr (gs_app_get_id (app), ==, "com.hughski.ColorHug2.driver"); + g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DRIVER); + g_assert (gs_app_has_category (app, "Addon")); + g_assert (gs_app_has_category (app, "Driver")); +} + +int +main (int argc, char **argv) +{ + g_autofree gchar *tmp_root = NULL; + gboolean ret; + int retval; + g_autofree gchar *xml = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + const gchar * const allowlist[] = { + "appstream", + "dummy", + "modalias", + NULL + }; + + gs_test_init (&argc, &argv); + g_setenv ("GS_SELF_TEST_DUMMY_ENABLE", "1", TRUE); + + xml = g_strdup_printf ("\n" + "\n" + " \n" + " com.hughski.ColorHug2.driver\n" + " ColorHug2\n" + " ColorHug2 Colorimeter Driver\n" + " colorhug-client\n" + " \n" + " pci:*\n" + " \n" + " \n" + " \n" + " system\n" + " \n" + "\n"); + g_setenv ("GS_SELF_TEST_APPSTREAM_XML", xml, TRUE); + + /* Use a common cache directory for all tests, since the appstream + * plugin uses it and cannot be reinitialised for each test. */ + tmp_root = g_dir_make_tmp ("gnome-software-modalias-test-XXXXXX", NULL); + g_assert (tmp_root != NULL); + g_setenv ("GS_SELF_TEST_CACHEDIR", tmp_root, TRUE); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR_CORE); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR_DUMMY); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/modalias", + plugin_loader, + (GTestDataFunc) gs_plugins_modalias_func); + + retval = g_test_run (); + + /* Clean up. */ + gs_utils_rmtree (tmp_root, NULL); + + return retval; +} diff --git a/plugins/modalias/meson.build b/plugins/modalias/meson.build new file mode 100644 index 0000000..8fdcbe4 --- /dev/null +++ b/plugins/modalias/meson.build @@ -0,0 +1,32 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginModalias"'] +cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] +cargs += ['-DLOCALPLUGINDIR_CORE="' + meson.current_build_dir() + '/../core"'] +cargs += ['-DLOCALPLUGINDIR_DUMMY="' + meson.current_build_dir() + '/../dummy"'] + +shared_module( + 'gs_plugin_modalias', + sources : 'gs-plugin-modalias.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : [ plugin_libs, gudev ], +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + e = executable( + 'gs-self-test-modalias', + compiled_schemas, + sources : [ + 'gs-self-test.c' + ], + dependencies : [ + plugin_libs, + ], + c_args : cargs, + ) + test('gs-self-test-modalias', e, suite: ['plugins', 'modalias'], env: test_env) +endif diff --git a/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c b/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c new file mode 100644 index 0000000..71719f8 --- /dev/null +++ b/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c @@ -0,0 +1,610 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2024 Jonathan Kang + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include + +#include +#include +#include +#include + +#include "gs-plugin-opensuse-distro-upgrade.h" + +#define OPENSUSE_DISTRO_UPGRADE_API_URI "https://get.opensuse.org/api/v0/distributions.json" + +struct _GsPluginOpensuseDistroUpgrade { + GsPlugin Parent; + + gchar *os_name; + gchar *os_version; + guint64 upgrade_weight; + + gchar *cachefn; + GFileMonitor *cachefn_monitor; + GsApp *cached_origin; + gboolean is_valid; + GPtrArray *distros; +}; + +typedef enum { + DISTRO_UPGRADE_ITEM_STATE_ALPHA, + DISTRO_UPGRADE_ITEM_STATE_BETA, + DISTRO_UPGRADE_ITEM_STATE_STABLE, + DISTRO_UPGRADE_ITEM_STATE_EOL, + DISTRO_UPGRADE_ITEM_STATE_LAST, +} DistroUpgradeItemState; + +typedef struct { + gchar *name; + gchar *version; + DistroUpgradeItemState state; + guint upgrade_weight; +} DistroUpgradeItem; + +G_DEFINE_TYPE (GsPluginOpensuseDistroUpgrade, gs_plugin_opensuse_distro_upgrade, GS_TYPE_PLUGIN) + +static gboolean +is_valid_upgrade (GsPluginOpensuseDistroUpgrade *self, + DistroUpgradeItem *item) +{ + guint diff; + + diff = item->upgrade_weight - self->upgrade_weight; + if (diff == 1) + return TRUE; + else + return FALSE; +} + +static GsApp * +create_upgrade_app (GsPluginOpensuseDistroUpgrade *self, + DistroUpgradeItem *item) +{ + GsApp *app; + g_autofree gchar *app_id = NULL; + g_autofree gchar *app_version = NULL; + g_autofree gchar *background = NULL; + g_autofree gchar *cache_key = NULL; + g_autofree gchar *css = NULL; + g_autofree gchar *url = NULL; + g_autoptr(GFile) icon_file = NULL; + g_autoptr(GIcon) ic = NULL; + + cache_key = g_strdup_printf ("leap-%s", item->version); + app = gs_plugin_cache_lookup (GS_PLUGIN (self), cache_key); + if (app != NULL) + return app; + + app_id = g_strdup_printf ("org.openSUSE.Leap-%s", item->version); + app_version = g_strdup (item->version); + + /* icon from disk */ + icon_file = g_file_new_for_path ("/usr/share/pixmaps/distribution-logos/square-symbolic.svg"); + ic = g_file_icon_new (icon_file); + + app = gs_app_new (app_id); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_set_kind (app, AS_COMPONENT_KIND_OPERATING_SYSTEM); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, item->name); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, + _("Upgrade for the latest features, performance and stability improvements.")); + gs_app_set_version (app, app_version); + gs_app_set_size_installed (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_license (app, GS_APP_QUALITY_LOWEST, "LicenseRef-free"); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_REVIEWABLE); + gs_app_add_icon (app, ic); + + /* Save it in the cache. */ + gs_plugin_cache_add (GS_PLUGIN (self), cache_key, app); + + return app; +} + +static void +distro_upgrade_item_destroy (DistroUpgradeItem *item) +{ + g_free (item->name); + g_free (item->version); + g_free (item); +} + +static GPtrArray * +load_json (GsPluginOpensuseDistroUpgrade *self, + GError **error) +{ + JsonArray *distros; + JsonNode *root_node; + JsonObject *root = NULL; + g_autoptr(JsonParser) parser = NULL; + g_autoptr(GPtrArray) new_distros = NULL; + + parser = json_parser_new_immutable (); + + if (!json_parser_load_from_mapped_file (parser, self->cachefn, error)) + return NULL; + + root_node = json_parser_get_root (parser); + if (root_node != NULL && JSON_NODE_HOLDS_OBJECT (root_node)) + root = json_node_get_object (root_node); + if (root == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no root object"); + return NULL; + } + + distros = json_object_get_array_member (root, "Leap"); + if (distros == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "No array member named \"Leap\"."); + return NULL; + } + + new_distros = g_ptr_array_new_with_free_func ((GDestroyNotify) distro_upgrade_item_destroy); + for (guint i = 0; i < json_array_get_length (distros); i++) { + DistroUpgradeItem *item; + DistroUpgradeItemState state; + JsonObject *distro; + const gchar *name; + const gchar *version; + const gchar *state_str; + guint upgrade_weight; + + distro = json_array_get_object_element (distros, i); + if (distro == NULL) + continue; + + name = json_object_get_string_member (distro, "name"); + if (name == NULL) + continue; + + version = json_object_get_string_member (distro, "version"); + if (version == NULL) + continue; + + state_str = json_object_get_string_member (distro, "state"); + + if (state_str == NULL) + continue; + if (g_strcmp0 (state_str, "Alpha") == 0) + state = DISTRO_UPGRADE_ITEM_STATE_ALPHA; + else if (g_strcmp0 (state_str, "Beta") == 0) + state = DISTRO_UPGRADE_ITEM_STATE_BETA; + else if (g_strcmp0 (state_str, "Stable") == 0) + state = DISTRO_UPGRADE_ITEM_STATE_STABLE; + else if (g_strcmp0 (state_str, "EOL") == 0) + state = DISTRO_UPGRADE_ITEM_STATE_EOL; + else + continue; + + /* Do not care about versions that are end-of-life. */ + if (state == DISTRO_UPGRADE_ITEM_STATE_EOL) + continue; + + upgrade_weight = json_object_get_int_member (distro, "upgrade-weight"); + + /* Set upgrade weight for current OS. */ + if (g_strcmp0 (self->os_version, version) == 0) + self->upgrade_weight = upgrade_weight; + + /* add item */ + item = g_new0 (DistroUpgradeItem, 1); + item->name = g_strdup (name); + item->version = g_strdup (version); + item->state = state; + item->upgrade_weight = upgrade_weight; + g_ptr_array_add (new_distros, item); + } + + /* success */ + self->is_valid = TRUE; + + return g_steal_pointer (&new_distros); +} + +static void +download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SoupSession *soup_session = SOUP_SESSION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginOpensuseDistroUpgrade *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + if (!gs_download_file_finish (soup_session, result, &local_error) && + !g_error_matches (local_error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) { + g_autoptr(GError) wrapped_error = NULL; + + /* Wrap in a GsPluginError. */ + g_set_error_literal (&wrapped_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_DOWNLOAD_FAILED, + local_error->message); + + gs_utils_error_add_origin_id (&wrapped_error, self->cached_origin); + g_task_return_error (task, g_steal_pointer (&wrapped_error)); + return; + } + + /* Distro upgrade list is not yet prepared. */ + self->is_valid = FALSE; + + g_task_return_boolean (task, TRUE); +} + +static void +refresh_cache_async (GsPluginOpensuseDistroUpgrade *self, + guint64 cache_age_secs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(GFile) output_file = g_file_new_for_path (self->cachefn); + g_autoptr(SoupSession) soup_session = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, refresh_cache_async); + + /* check cache age */ + if (cache_age_secs > 0) { + guint64 tmp = gs_utils_get_file_age (output_file); + if (tmp < cache_age_secs) { + g_debug ("%s is only %" G_GUINT64_FORMAT " seconds old", + self->cachefn, tmp); + g_task_return_boolean (task, TRUE); + return; + } + } + + /* download new file */ + soup_session = gs_build_soup_session (); + + gs_download_file_async (soup_session, + OPENSUSE_DISTRO_UPGRADE_API_URI, + output_file, + G_PRIORITY_LOW, + NULL, NULL, /* FIXME: progress reporting */ + cancellable, + download_cb, + g_steal_pointer (&task)); +} + +static gboolean +refresh_cache_finish (GsPluginOpensuseDistroUpgrade *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +ensure_refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GPtrArray) distros = NULL; + g_autoptr(GError) local_error = NULL; + + if (!refresh_cache_finish (self, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + distros = load_json (self, &local_error); + if (distros == NULL) { + g_autoptr(GFile) cache_file = g_file_new_for_path (self->cachefn); + + g_debug ("Failed to load cache file ‘%s’, deleting it", self->cachefn); + g_file_delete (cache_file, NULL, NULL); + + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_pointer (task, g_steal_pointer (&distros), (GDestroyNotify) g_ptr_array_unref); +} + +/* This will return a strong reference to the latest distros + * #GPtrArray. The caller should use this in their computation. */ +static void +ensure_cache_async (GsPluginOpensuseDistroUpgrade *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, ensure_cache_async); + + /* already done */ + if (self->is_valid) { + g_task_return_pointer (task, g_ptr_array_ref (self->distros), (GDestroyNotify) g_ptr_array_unref); + return; + } + + /* Ensure there is any data, no matter how old. This can download from + * the network if needed. */ + refresh_cache_async (self, G_MAXUINT, cancellable, + ensure_refresh_cb, g_steal_pointer (&task)); +} + +static GPtrArray * +ensure_cache_finish (GsPluginOpensuseDistroUpgrade *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +list_distro_upgrades_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + gboolean show_prerelease; + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GPtrArray) distros = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(GSettings) settings = NULL; + GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (source_object); + + /* Only interested in stable versions. */ + settings = g_settings_new ("org.gnome.software"); + show_prerelease = g_settings_get_boolean (settings, "show-upgrade-prerelease"); + + distros = ensure_cache_finish (self, result, &local_error); + if (distros == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_clear_pointer (&self->distros, g_ptr_array_unref); + self->distros = g_ptr_array_ref (distros); + + /* are any distros upgradable */ + list = gs_app_list_new (); + + for (guint i = 0; i < distros->len; i++) { + DistroUpgradeItem *item; + + item = g_ptr_array_index (distros, i); + if (show_prerelease || + (!show_prerelease && item->state == DISTRO_UPGRADE_ITEM_STATE_STABLE)) + if (is_valid_upgrade (self, item)) { + g_autoptr(GsApp) app = NULL; + + app = create_upgrade_app (self, item); + gs_app_list_add (list, app); + + break; + } + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static void +gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_async (GsPlugin *plugin, + GsPluginListDistroUpgradesFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (plugin); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_async); + + /* Ensure valid data is loaded. */ + ensure_cache_async (self, cancellable, list_distro_upgrades_cb, g_steal_pointer (&task)); +} + +static GsAppList * +gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_opensuse_distro_upgrade_dispose (GObject *object) +{ + GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (object); + + g_clear_object (&self->cachefn_monitor); + g_clear_object (&self->cached_origin); + + G_OBJECT_CLASS (gs_plugin_opensuse_distro_upgrade_parent_class)->dispose (object); +} + +static void +gs_plugin_opensuse_distro_upgrade_finalize (GObject *object) +{ + GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (object); + + g_clear_pointer (&self->distros, g_ptr_array_unref); + g_clear_pointer (&self->os_name, g_free); + g_clear_pointer (&self->os_version, g_free); + g_clear_pointer (&self->cachefn, g_free); + + G_OBJECT_CLASS (gs_plugin_opensuse_distro_upgrade_parent_class)->finalize (object); +} + +static void +file_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (user_data); + + self->is_valid = FALSE; + + g_debug ("cache file changed, so reloading upgrades list"); + gs_plugin_updates_changed (GS_PLUGIN (self)); +} + +static void +gs_plugin_opensuse_distro_upgrade_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (plugin); + g_autoptr(GFile) file = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_opensuse_distro_upgrade_setup_async); + + /* get the file to cache */ + self->cachefn = gs_utils_get_cache_filename ("opensuse-distro-upgrade", + "distributions.json", + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &local_error); + if (self->cachefn == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* watch this in case it is changed by the user */ + file = g_file_new_for_path (self->cachefn); + self->cachefn_monitor = g_file_monitor (file, + G_FILE_MONITOR_NONE, + cancellable, + &local_error); + if (self->cachefn_monitor == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_signal_connect (self->cachefn_monitor, "changed", + G_CALLBACK (file_changed_cb), plugin); + + /* read os-release for the current versions */ + os_release = gs_os_release_new (&local_error); + if (os_release == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + self->os_name = g_strdup (gs_os_release_get_name (os_release)); + if (self->os_name == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT, + "OS release had no name"); + return; + } + self->os_version = g_strdup (gs_os_release_get_version_id (os_release)); + if (self->os_version == NULL) { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT, + "OS release had no version ID"); + return; + } + + /* add source */ + self->cached_origin = gs_app_new (gs_plugin_get_name (plugin)); + gs_app_set_kind (self->cached_origin, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_origin_hostname (self->cached_origin, + OPENSUSE_DISTRO_UPGRADE_API_URI); + gs_app_set_management_plugin (self->cached_origin, plugin); + + /* add the source to the plugin cache which allows us to match the + * unique ID to a GsApp when creating an event */ + gs_plugin_cache_add (plugin, + gs_app_get_unique_id (self->cached_origin), + self->cached_origin); + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_opensuse_distro_upgrade_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_opensuse_distro_upgrade_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (plugin); + refresh_cache_async (self, cache_age_secs, cancellable, callback, user_data); +} + +static gboolean +gs_plugin_opensuse_distro_upgrade_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return refresh_cache_finish (GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (plugin), + result, + error); +} + +static void +gs_plugin_opensuse_distro_upgrade_init (GsPluginOpensuseDistroUpgrade *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + /* Check if we are running openSUSE Leap. */ + if (!gs_plugin_check_distro_id (plugin, "opensuse-leap")) { + gs_plugin_set_enabled (plugin, FALSE); + g_debug ("Disabling itself as it's only supported in openSUSE Leap", gs_plugin_get_name (plugin)); + return; + } + + self->distros = g_ptr_array_new_with_free_func ((GDestroyNotify) distro_upgrade_item_destroy); +} + +static void +gs_plugin_opensuse_distro_upgrade_class_init (GsPluginOpensuseDistroUpgradeClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_opensuse_distro_upgrade_dispose; + object_class->finalize = gs_plugin_opensuse_distro_upgrade_finalize; + + plugin_class->setup_async = gs_plugin_opensuse_distro_upgrade_setup_async; + plugin_class->setup_finish = gs_plugin_opensuse_distro_upgrade_setup_finish; + plugin_class->refresh_metadata_async = gs_plugin_opensuse_distro_upgrade_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_opensuse_distro_upgrade_refresh_metadata_finish; + plugin_class->list_distro_upgrades_async = gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_async; + plugin_class->list_distro_upgrades_finish = gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_OPENSUSE_DISTRO_UPGRADE; +} diff --git a/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.h b/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.h new file mode 100644 index 0000000..6e1b7b3 --- /dev/null +++ b/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.h @@ -0,0 +1,19 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2024 Jonathan Kang + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_OPENSUSE_DISTRO_UPGRADE (gs_plugin_opensuse_distro_upgrade_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginOpensuseDistroUpgrade, gs_plugin_opensuse_distro_upgrade, GS, PLUGIN_OPENSUSE_DISTRO_UPGRADE, GsPlugin) + +G_END_DECLS diff --git a/plugins/opensuse-distro-upgrade/meson.build b/plugins/opensuse-distro-upgrade/meson.build new file mode 100644 index 0000000..a4bf73d --- /dev/null +++ b/plugins/opensuse-distro-upgrade/meson.build @@ -0,0 +1,10 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginOpensuseDistroUpgrade"'] + +shared_module( + 'gs_plugin_opensuse-distro-upgrade', + sources : 'gs-plugin-opensuse-distro-upgrade.c', + install : true, + install_dir : plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) diff --git a/plugins/packagekit/gs-markdown.c b/plugins/packagekit/gs-markdown.c new file mode 100644 index 0000000..f76124c --- /dev/null +++ b/plugins/packagekit/gs-markdown.c @@ -0,0 +1,1067 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2008 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-markdown.h" + +/******************************************************************************* + * + * This is a simple Markdown parser. + * It can output to Pango, HTML or plain text. The following limitations are + * already known, and properly deliberate: + * + * - No code section support + * - No ordered list support + * - No blockquote section support + * - No image support + * - No email support + * - No backslash escapes support + * - No HTML escaping support + * - Auto-escapes certain word patterns, like http:// + * + * It does support the rest of the standard pretty well, although it's not + * been run against any conformance tests. The parsing is single pass, with + * a simple enumerated interpretor mode and a single line back-memory. + * + ******************************************************************************/ + +typedef enum { + GS_MARKDOWN_MODE_BLANK, + GS_MARKDOWN_MODE_RULE, + GS_MARKDOWN_MODE_BULLETT, + GS_MARKDOWN_MODE_PARA, + GS_MARKDOWN_MODE_H1, + GS_MARKDOWN_MODE_H2, + GS_MARKDOWN_MODE_H3, + GS_MARKDOWN_MODE_H4, + GS_MARKDOWN_MODE_H5, + GS_MARKDOWN_MODE_H6, + GS_MARKDOWN_MODE_UNKNOWN +} GsMarkdownMode; + +typedef struct { + const gchar *em_start; + const gchar *em_end; + const gchar *strong_start; + const gchar *strong_end; + const gchar *code_start; + const gchar *code_end; + const gchar *h1_start; + const gchar *h1_end; + const gchar *h2_start; + const gchar *h2_end; + const gchar *h3_start; + const gchar *h3_end; + const gchar *h4_start; + const gchar *h4_end; + const gchar *h5_start; + const gchar *h5_end; + const gchar *h6_start; + const gchar *h6_end; + const gchar *bullet_start; + const gchar *bullet_end; + const gchar *rule; + const gchar *link_prefix; + const gchar *link_mid; + const gchar *link_suffix; +} GsMarkdownTags; + +struct _GsMarkdown { + GObject parent_instance; + + GsMarkdownMode mode; + GsMarkdownTags tags; + GsMarkdownOutputKind output; + gint max_lines; + gint line_count; + gboolean smart_quoting; + gboolean escape; + gboolean autocode; + gboolean autolinkify; + GString *pending; + GString *processed; +}; + +G_DEFINE_TYPE (GsMarkdown, gs_markdown, G_TYPE_OBJECT) + +/* + * gs_markdown_to_text_line_is_rule: + * + * Horizontal rules are created by placing three or more hyphens, asterisks, + * or underscores on a line by themselves. + * You may use spaces between the hyphens or asterisks. + **/ +static gboolean +gs_markdown_to_text_line_is_rule (const gchar *line) +{ + guint i; + guint len; + guint count = 0; + g_autofree gchar *copy = NULL; + + len = (guint) strlen (line); + if (len == 0) + return FALSE; + + /* replace non-rule chars with ~ */ + copy = g_strdup (line); + g_strcanon (copy, "-*_ ", '~'); + for (i = 0; i < len; i++) { + if (copy[i] == '~') + return FALSE; + if (copy[i] != ' ') + count++; + } + + /* if we matched, return true */ + if (count >= 3) + return TRUE; + return FALSE; +} + +static gboolean +gs_markdown_to_text_line_is_bullet (const gchar **pline) +{ + const gchar *line = *pline; + + /* skip leading spaces */ + while (g_ascii_isspace (*line)) + line++; + + if (g_str_has_prefix (line, "- ") || + g_str_has_prefix (line, "* ") || + g_str_has_prefix (line, "+ ")) { + *pline = line + 2; + return TRUE; + } + + return FALSE; +} + +static gboolean +gs_markdown_to_text_line_is_header_x (const gchar **pline, + guint xx) +{ + const gchar *line = *pline; + + while (*line == '#' && xx > 0) { + line++; + xx--; + } + + if (xx == 0 && *line != '\0' && *line != '#') { + if (g_ascii_isspace (*line)) + line++; + *pline = line; + return TRUE; + } + + return FALSE; +} + +static gboolean +gs_markdown_to_text_line_is_header1 (const gchar **pline) +{ + return gs_markdown_to_text_line_is_header_x (pline, 1); +} + +static gboolean +gs_markdown_to_text_line_is_header2 (const gchar **pline) +{ + return gs_markdown_to_text_line_is_header_x (pline, 2); +} + +static gboolean +gs_markdown_to_text_line_is_header3 (const gchar **pline) +{ + return gs_markdown_to_text_line_is_header_x (pline, 3); +} + +static gboolean +gs_markdown_to_text_line_is_header4 (const gchar **pline) +{ + return gs_markdown_to_text_line_is_header_x (pline, 4); +} + +static gboolean +gs_markdown_to_text_line_is_header5 (const gchar **pline) +{ + return gs_markdown_to_text_line_is_header_x (pline, 5); +} + +static gboolean +gs_markdown_to_text_line_is_header6 (const gchar **pline) +{ + return gs_markdown_to_text_line_is_header_x (pline, 6); +} + +static gboolean +gs_markdown_to_text_line_is_header1_type2 (const gchar *line) +{ + return g_str_has_prefix (line, "==="); +} + +static gboolean +gs_markdown_to_text_line_is_header2_type2 (const gchar *line) +{ + return g_str_has_prefix (line, "---"); +} + +#if 0 +static gboolean +gs_markdown_to_text_line_is_code (const gchar *line) +{ + return (g_str_has_prefix (line, " ") || + g_str_has_prefix (line, "\t")); +} + +static gboolean +gs_markdown_to_text_line_is_blockquote (const gchar *line) +{ + return (g_str_has_prefix (line, "> ")); +} +#endif + +static gboolean +gs_markdown_to_text_line_is_blank (const gchar *line) +{ + guint i; + guint len; + + /* a line with no characters is blank by definition */ + len = (guint) strlen (line); + if (len == 0) + return TRUE; + + /* find if there are only space chars */ + for (i = 0; i < len; i++) { + if (line[i] != ' ' && line[i] != '\t') + return FALSE; + } + + /* if we matched, return true */ + return TRUE; +} + +static gchar * +gs_markdown_replace (const gchar *haystack, + const gchar *needle, + const gchar *replace) +{ + g_auto(GStrv) split = NULL; + split = g_strsplit (haystack, needle, -1); + return g_strjoinv (replace, split); +} + +static gchar * +gs_markdown_strstr_spaces (const gchar *haystack, const gchar *needle) +{ + gchar *found; + const gchar *haystack_new = haystack; + +retry: + /* don't find if surrounded by spaces */ + found = strstr (haystack_new, needle); + if (found == NULL) + return NULL; + + /* start of the string, always valid */ + if (found == haystack) + return found; + + /* end of the string, always valid */ + if (*(found-1) == ' ' && *(found+1) == ' ') { + haystack_new = found+1; + goto retry; + } + return found; +} + +static gchar * +gs_markdown_to_text_line_formatter (const gchar *line, + const gchar *formatter, + const gchar *left, + const gchar *right) +{ + guint len; + gchar *str1; + gchar *str2; + gchar *start = NULL; + gchar *middle = NULL; + gchar *end = NULL; + g_autofree gchar *copy = NULL; + + /* needed to know for shifts */ + len = (guint) strlen (formatter); + if (len == 0) + return NULL; + + /* find sections */ + copy = g_strdup (line); + str1 = gs_markdown_strstr_spaces (copy, formatter); + if (str1 != NULL) { + *str1 = '\0'; + str2 = gs_markdown_strstr_spaces (str1+len, formatter); + if (str2 != NULL) { + *str2 = '\0'; + middle = str1 + len; + start = copy; + end = str2 + len; + } + } + + /* if we found, replace and keep looking for the same string */ + if (start != NULL && middle != NULL && end != NULL) { + g_autofree gchar *temp = NULL; + temp = g_strdup_printf ("%s%s%s%s%s", start, left, middle, right, end); + /* recursive */ + return gs_markdown_to_text_line_formatter (temp, formatter, left, right); + } + + /* not found, keep return as-is */ + return g_strdup (line); +} + +static gchar * +gs_markdown_to_text_line_format_sections (GsMarkdown *self, const gchar *line) +{ + gchar *data = g_strdup (line); + gchar *temp; + + /* bold1 */ + temp = data; + data = gs_markdown_to_text_line_formatter (temp, "**", + self->tags.strong_start, + self->tags.strong_end); + g_free (temp); + + /* bold2 */ + temp = data; + data = gs_markdown_to_text_line_formatter (temp, "__", + self->tags.strong_start, + self->tags.strong_end); + g_free (temp); + + /* italic1 */ + temp = data; + data = gs_markdown_to_text_line_formatter (temp, "*", + self->tags.em_start, + self->tags.em_end); + g_free (temp); + + /* italic2 */ + temp = data; + data = gs_markdown_to_text_line_formatter (temp, "_", + self->tags.em_start, + self->tags.em_end); + g_free (temp); + + /* em-dash */ + temp = data; + data = gs_markdown_replace (temp, " -- ", " — "); + g_free (temp); + + /* smart quoting */ + if (self->smart_quoting) { + temp = data; + data = gs_markdown_to_text_line_formatter (temp, "\"", "“", "”"); + g_free (temp); + + temp = data; + data = gs_markdown_to_text_line_formatter (temp, "'", "‘", "’"); + g_free (temp); + } + + return data; +} + +static gchar * +gs_markdown_to_text_line_format (GsMarkdown *self, const gchar *line) +{ + GString *string; + gboolean mode = FALSE; + gchar *text; + guint i; + g_auto(GStrv) codes = NULL; + + /* optimise the trivial case where we don't have any code tags */ + text = strstr (line, "`"); + if (text == NULL) + return gs_markdown_to_text_line_format_sections (self, line); + + /* we want to parse the code sections without formatting */ + codes = g_strsplit (line, "`", -1); + string = g_string_new (""); + for (i = 0; codes[i] != NULL; i++) { + if (!mode) { + text = gs_markdown_to_text_line_format_sections (self, codes[i]); + g_string_append (string, text); + g_free (text); + mode = TRUE; + } else { + /* just append without formatting */ + g_string_append (string, self->tags.code_start); + g_string_append (string, codes[i]); + g_string_append (string, self->tags.code_end); + mode = FALSE; + } + } + return g_string_free (string, FALSE); +} + +static gboolean +gs_markdown_add_pending (GsMarkdown *self, const gchar *line) +{ + g_autofree gchar *copy = NULL; + + /* would put us over the limit */ + if (self->max_lines > 0 && self->line_count >= self->max_lines) + return FALSE; + + copy = g_strdup (line); + + /* strip leading and trailing spaces */ + g_strstrip (copy); + + /* append */ + g_string_append_printf (self->pending, "%s ", copy); + return TRUE; +} + +static gboolean +gs_markdown_add_pending_header (GsMarkdown *self, const gchar *line) +{ + g_autofree gchar *copy = NULL; + + /* strip trailing # */ + copy = g_strdup (line); + g_strdelimit (copy, "#", ' '); + return gs_markdown_add_pending (self, copy); +} + +static guint +gs_markdown_count_chars_in_word (const gchar *text, gchar find) +{ + guint i; + guint len; + guint count = 0; + + /* get length */ + len = (guint) strlen (text); + if (len == 0) + return 0; + + /* find matching chars */ + for (i = 0; i < len; i++) { + if (text[i] == find) + count++; + } + return count; +} + +static gboolean +gs_markdown_word_is_code (const gchar *text) +{ + /* already code */ + if (g_str_has_prefix (text, "`")) + return FALSE; + if (g_str_has_suffix (text, "`")) + return FALSE; + + /* paths */ + if (g_str_has_prefix (text, "/")) + return TRUE; + + /* bugzillas */ + if (g_str_has_prefix (text, "#")) + return TRUE; + + /* patch files */ + if (g_strrstr (text, ".patch") != NULL) + return TRUE; + if (g_strrstr (text, ".diff") != NULL) + return TRUE; + + /* function names */ + if (g_strrstr (text, "()") != NULL) + return TRUE; + + /* email addresses */ + if (g_strrstr (text, "@") != NULL) + return TRUE; + + /* compiler defines */ + if (text[0] != '_' && + gs_markdown_count_chars_in_word (text, '_') > 1) + return TRUE; + + /* nothing special */ + return FALSE; +} + +static gchar * +gs_markdown_word_auto_format_code (const gchar *text) +{ + guint i; + gchar *temp; + gboolean ret = FALSE; + g_auto(GStrv) words = NULL; + + /* split sentence up with space */ + words = g_strsplit (text, " ", -1); + + /* search each word */ + for (i = 0; words[i] != NULL; i++) { + if (gs_markdown_word_is_code (words[i])) { + temp = g_strdup_printf ("`%s`", words[i]); + g_free (words[i]); + words[i] = temp; + ret = TRUE; + } + } + + /* no replacements, so just return a copy */ + if (!ret) + return g_strdup (text); + + /* join the array back into a string */ + return g_strjoinv (" ", words); +} + +static gboolean +gs_markdown_word_is_url (const gchar *text) +{ + if (g_str_has_prefix (text, "http://")) + return TRUE; + if (g_str_has_prefix (text, "https://")) + return TRUE; + if (g_str_has_prefix (text, "ftp://")) + return TRUE; + return FALSE; +} + +static gchar * +gs_markdown_word_auto_format_urls (const gchar *text) +{ + guint i; + gchar *temp; + gboolean ret = FALSE; + g_auto(GStrv) words = NULL; + + /* split sentence up with space */ + words = g_strsplit (text, " ", -1); + + /* search each word */ + for (i = 0; words[i] != NULL; i++) { + if (gs_markdown_word_is_url (words[i])) { + temp = g_strdup_printf ("
          %s", + words[i], words[i]); + g_free (words[i]); + words[i] = temp; + ret = TRUE; + } + } + + /* no replacements, so just return a copy */ + if (!ret) + return g_strdup (text); + + /* join the array back into a string */ + return g_strjoinv (" ", words); +} + +static gchar * +gs_markdown_replace_links (GsMarkdown *self, + const gchar *text) +{ + GString *str = g_string_new (""); + const gchar *start, *mid, *end, *from; + + /* it's: [title](https://....) */ + from = text; + start = strchr (from, '['); + while (start != NULL) { + start += 1; + mid = strstr (start, "]("); + if (mid != NULL) { + mid += 2; + end = strchr (mid, ')'); + if (end != NULL) { + if (start > from) + g_string_append_len (str, from, start - from - 1); + g_string_append (str, self->tags.link_prefix); + g_string_append_len (str, mid, end - mid); + g_string_append (str, self->tags.link_mid); + g_string_append_len (str, start, mid - start - 2); + g_string_append (str, self->tags.link_suffix); + from = end + 1; + start = strchr (from, '['); + } else { + break; + } + } else { + break; + } + } + + if (*from) + g_string_append (str, from); + + return g_string_free (str, FALSE); +} + +static void +gs_markdown_flush_pending (GsMarkdown *self) +{ + g_autofree gchar *copy = NULL; + g_autofree gchar *temp = NULL; + + /* no data yet */ + if (self->mode == GS_MARKDOWN_MODE_UNKNOWN) + return; + + /* remove trailing spaces */ + while (g_str_has_suffix (self->pending->str, " ")) + g_string_set_size (self->pending, self->pending->len - 1); + + /* pango requires escaping */ + copy = g_strdup (self->pending->str); + if (!self->escape && self->output == GS_MARKDOWN_OUTPUT_PANGO) { + g_strdelimit (copy, "<", '('); + g_strdelimit (copy, ">", ')'); + g_strdelimit (copy, "&", '+'); + } + + /* check words for code */ + if (self->autocode && + (self->mode == GS_MARKDOWN_MODE_PARA || + self->mode == GS_MARKDOWN_MODE_BULLETT)) { + temp = gs_markdown_word_auto_format_code (copy); + g_free (copy); + copy = temp; + } + + /* escape */ + if (self->escape) { + temp = g_markup_escape_text (copy, -1); + g_free (copy); + copy = temp; + } + + /* check words for URLS */ + if (self->autolinkify && + self->output == GS_MARKDOWN_OUTPUT_PANGO && + (self->mode == GS_MARKDOWN_MODE_PARA || + self->mode == GS_MARKDOWN_MODE_BULLETT)) { + temp = gs_markdown_word_auto_format_urls (copy); + g_free (copy); + copy = temp; + } + + if (self->tags.link_prefix != NULL && + self->tags.link_mid != NULL && + self->tags.link_suffix != NULL) { + temp = gs_markdown_replace_links (self, copy); + g_free (copy); + copy = temp; + } + + /* do formatting */ + temp = gs_markdown_to_text_line_format (self, copy); + if (self->mode == GS_MARKDOWN_MODE_BULLETT) { + g_string_append_printf (self->processed, "%s%s%s\n", + self->tags.bullet_start, + temp, + self->tags.bullet_end); + self->line_count++; + } else if (self->mode == GS_MARKDOWN_MODE_H1) { + g_string_append_printf (self->processed, "%s%s%s\n", + self->tags.h1_start, + temp, + self->tags.h1_end); + } else if (self->mode == GS_MARKDOWN_MODE_H2) { + g_string_append_printf (self->processed, "%s%s%s\n", + self->tags.h2_start, + temp, + self->tags.h2_end); + } else if (self->mode == GS_MARKDOWN_MODE_H3) { + g_string_append_printf (self->processed, "%s%s%s\n", + self->tags.h3_start, + temp, + self->tags.h3_end); + } else if (self->mode == GS_MARKDOWN_MODE_H4) { + g_string_append_printf (self->processed, "%s%s%s\n", + self->tags.h4_start, + temp, + self->tags.h4_end); + } else if (self->mode == GS_MARKDOWN_MODE_H5) { + g_string_append_printf (self->processed, "%s%s%s\n", + self->tags.h5_start, + temp, + self->tags.h5_end); + } else if (self->mode == GS_MARKDOWN_MODE_H6) { + g_string_append_printf (self->processed, "%s%s%s\n", + self->tags.h6_start, + temp, + self->tags.h6_end); + } else if (self->mode == GS_MARKDOWN_MODE_PARA || + self->mode == GS_MARKDOWN_MODE_RULE) { + g_string_append_printf (self->processed, "%s\n", temp); + self->line_count++; + } + + /* clear */ + g_string_truncate (self->pending, 0); +} + +static gboolean +gs_markdown_to_text_line_process (GsMarkdown *self, const gchar *line) +{ + gboolean ret; + + /* blank */ + ret = gs_markdown_to_text_line_is_blank (line); + if (ret) { + gs_markdown_flush_pending (self); + /* a new line after a list is the end of list, not a gap */ + if (self->mode != GS_MARKDOWN_MODE_BULLETT) + ret = gs_markdown_add_pending (self, "\n"); + self->mode = GS_MARKDOWN_MODE_BLANK; + goto out; + } + + /* header1_type2 */ + ret = gs_markdown_to_text_line_is_header1_type2 (line); + if (ret) { + if (self->mode == GS_MARKDOWN_MODE_PARA) + self->mode = GS_MARKDOWN_MODE_H1; + goto out; + } + + /* header2_type2 */ + ret = gs_markdown_to_text_line_is_header2_type2 (line); + if (ret) { + if (self->mode == GS_MARKDOWN_MODE_PARA) + self->mode = GS_MARKDOWN_MODE_H2; + goto out; + } + + /* rule */ + ret = gs_markdown_to_text_line_is_rule (line); + if (ret) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_RULE; + ret = gs_markdown_add_pending (self, self->tags.rule); + goto out; + } + + /* bullet */ + ret = gs_markdown_to_text_line_is_bullet (&line); + if (ret) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_BULLETT; + ret = gs_markdown_add_pending (self, line); + goto out; + } + + /* header1 */ + ret = gs_markdown_to_text_line_is_header1 (&line); + if (ret) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_H1; + ret = gs_markdown_add_pending_header (self, line); + goto out; + } + + /* header2 */ + ret = gs_markdown_to_text_line_is_header2 (&line); + if (ret) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_H2; + ret = gs_markdown_add_pending_header (self, line); + goto out; + } + + /* header3 */ + ret = gs_markdown_to_text_line_is_header3 (&line); + if (ret) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_H3; + ret = gs_markdown_add_pending_header (self, line); + goto out; + } + + /* header4 */ + ret = gs_markdown_to_text_line_is_header4 (&line); + if (ret) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_H4; + ret = gs_markdown_add_pending_header (self, line); + goto out; + } + + /* header5 */ + ret = gs_markdown_to_text_line_is_header5 (&line); + if (ret) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_H5; + ret = gs_markdown_add_pending_header (self, line); + goto out; + } + + /* header6 */ + ret = gs_markdown_to_text_line_is_header6 (&line); + if (ret) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_H6; + ret = gs_markdown_add_pending_header (self, line); + goto out; + } + + /* paragraph */ + if (self->mode == GS_MARKDOWN_MODE_BLANK || + self->mode == GS_MARKDOWN_MODE_UNKNOWN) { + gs_markdown_flush_pending (self); + self->mode = GS_MARKDOWN_MODE_PARA; + } + + /* add to pending */ + ret = gs_markdown_add_pending (self, line); +out: + /* if we failed to add, we don't know the mode */ + if (!ret) + self->mode = GS_MARKDOWN_MODE_UNKNOWN; + return ret; +} + +static void +gs_markdown_set_output_kind (GsMarkdown *self, GsMarkdownOutputKind output) +{ + g_return_if_fail (GS_IS_MARKDOWN (self)); + + self->output = output; + switch (output) { + case GS_MARKDOWN_OUTPUT_PANGO: + /* PangoMarkup */ + self->tags.em_start = ""; + self->tags.em_end = ""; + self->tags.strong_start = ""; + self->tags.strong_end = ""; + self->tags.code_start = ""; + self->tags.code_end = ""; + self->tags.h1_start = "\n"; + self->tags.h1_end = "\n"; + self->tags.h2_start = "\n"; + self->tags.h2_end = "\n"; + self->tags.h3_start = "\n"; + self->tags.h3_end = "\n"; + self->tags.h4_start = "\n"; + self->tags.h4_end = "\n"; + self->tags.h5_start = "\n"; + self->tags.h5_end = "\n"; + self->tags.h6_start = "\n"; + self->tags.h6_end = "\n"; + self->tags.bullet_start = "• "; + self->tags.bullet_end = ""; + self->tags.rule = "⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n"; + self->tags.link_prefix = "tags.link_mid = "\">"; + self->tags.link_suffix = ""; + self->escape = TRUE; + self->autolinkify = TRUE; + break; + case GS_MARKDOWN_OUTPUT_HTML: + /* XHTML */ + self->tags.em_start = ""; + self->tags.em_end = ""; + self->tags.strong_start = ""; + self->tags.strong_end = ""; + self->tags.code_start = ""; + self->tags.code_end = ""; + self->tags.h1_start = "

          "; + self->tags.h1_end = "

          "; + self->tags.h2_start = "

          "; + self->tags.h2_end = "

          "; + self->tags.h3_start = "

          "; + self->tags.h3_end = "

          "; + self->tags.h4_start = "

          "; + self->tags.h4_end = "

          "; + self->tags.h5_start = "
          "; + self->tags.h5_end = "
          "; + self->tags.h6_start = "
          "; + self->tags.h6_end = "
          "; + self->tags.bullet_start = "
        • "; + self->tags.bullet_end = "
        • "; + self->tags.rule = "
          "; + self->tags.link_prefix = "tags.link_mid = "\">"; + self->tags.link_suffix = ""; + self->escape = TRUE; + self->autolinkify = TRUE; + break; + case GS_MARKDOWN_OUTPUT_TEXT: + /* plain text */ + self->tags.em_start = ""; + self->tags.em_end = ""; + self->tags.strong_start = ""; + self->tags.strong_end = ""; + self->tags.code_start = ""; + self->tags.code_end = ""; + self->tags.h1_start = "["; + self->tags.h1_end = "]"; + self->tags.h2_start = "-"; + self->tags.h2_end = "-"; + self->tags.h3_start = " "; + self->tags.h3_end = " "; + self->tags.h4_start = " "; + self->tags.h4_end = " "; + self->tags.h5_start = " "; + self->tags.h5_end = " "; + self->tags.h6_start = " "; + self->tags.h6_end = " "; + self->tags.bullet_start = "* "; + self->tags.bullet_end = ""; + self->tags.rule = " ----- \n"; + self->tags.link_prefix = NULL; + self->tags.link_mid = NULL; + self->tags.link_suffix = NULL; + self->escape = FALSE; + self->autolinkify = FALSE; + break; + default: + g_warning ("unknown output enum"); + break; + } +} + +void +gs_markdown_set_max_lines (GsMarkdown *self, gint max_lines) +{ + g_return_if_fail (GS_IS_MARKDOWN (self)); + self->max_lines = max_lines; +} + +void +gs_markdown_set_smart_quoting (GsMarkdown *self, gboolean smart_quoting) +{ + g_return_if_fail (GS_IS_MARKDOWN (self)); + self->smart_quoting = smart_quoting; +} + +void +gs_markdown_set_escape (GsMarkdown *self, gboolean escape) +{ + g_return_if_fail (GS_IS_MARKDOWN (self)); + self->escape = escape; +} + +void +gs_markdown_set_autocode (GsMarkdown *self, gboolean autocode) +{ + g_return_if_fail (GS_IS_MARKDOWN (self)); + self->autocode = autocode; +} + +void +gs_markdown_set_autolinkify (GsMarkdown *self, gboolean autolinkify) +{ + g_return_if_fail (GS_IS_MARKDOWN (self)); + self->autolinkify = autolinkify; +} + +gchar * +gs_markdown_parse (GsMarkdown *self, const gchar *markdown) +{ + gboolean ret; + gchar *temp; + guint i; + guint len; + g_auto(GStrv) lines = NULL; + const gchar *output; + + g_return_val_if_fail (GS_IS_MARKDOWN (self), NULL); + + /* process */ + self->mode = GS_MARKDOWN_MODE_UNKNOWN; + self->line_count = 0; + g_string_truncate (self->pending, 0); + g_string_truncate (self->processed, 0); + lines = g_strsplit (markdown, "\n", -1); + len = g_strv_length (lines); + + /* process each line */ + for (i = 0; i < len; i++) { + ret = gs_markdown_to_text_line_process (self, lines[i]); + if (!ret) + break; + } + gs_markdown_flush_pending (self); + + /* remove trailing \n */ + while (self->processed->len > 0 && self->processed->str[self->processed->len - 1] == '\n') + g_string_set_size (self->processed, self->processed->len - 1); + + /* skip leading \n, which can happen with headers in the Pango mode */ + output = self->processed->str; + while (*output == '\n') + output++; + + /* get a copy */ + temp = g_strdup (output); + g_string_truncate (self->pending, 0); + g_string_truncate (self->processed, 0); + return temp; +} + +static void +gs_markdown_finalize (GObject *object) +{ + GsMarkdown *self; + + g_return_if_fail (GS_IS_MARKDOWN (object)); + + self = GS_MARKDOWN (object); + + g_string_free (self->pending, TRUE); + g_string_free (self->processed, TRUE); + + G_OBJECT_CLASS (gs_markdown_parent_class)->finalize (object); +} + +static void +gs_markdown_class_init (GsMarkdownClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_markdown_finalize; +} + +static void +gs_markdown_init (GsMarkdown *self) +{ + self->mode = GS_MARKDOWN_MODE_UNKNOWN; + self->pending = g_string_new (""); + self->processed = g_string_new (""); + self->max_lines = -1; + self->smart_quoting = FALSE; + self->escape = FALSE; + self->autocode = FALSE; +} + +GsMarkdown * +gs_markdown_new (GsMarkdownOutputKind output) +{ + GsMarkdown *self; + self = g_object_new (GS_TYPE_MARKDOWN, NULL); + gs_markdown_set_output_kind (self, output); + return GS_MARKDOWN (self); +} diff --git a/plugins/packagekit/gs-markdown.h b/plugins/packagekit/gs-markdown.h new file mode 100644 index 0000000..6532ed8 --- /dev/null +++ b/plugins/packagekit/gs-markdown.h @@ -0,0 +1,41 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2008-2013 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define GS_TYPE_MARKDOWN (gs_markdown_get_type ()) + +G_DECLARE_FINAL_TYPE (GsMarkdown, gs_markdown, GS, MARKDOWN, GObject) + +typedef enum { + GS_MARKDOWN_OUTPUT_TEXT, + GS_MARKDOWN_OUTPUT_PANGO, + GS_MARKDOWN_OUTPUT_HTML, + GS_MARKDOWN_OUTPUT_LAST +} GsMarkdownOutputKind; + +GsMarkdown *gs_markdown_new (GsMarkdownOutputKind output); +void gs_markdown_set_max_lines (GsMarkdown *self, + gint max_lines); +void gs_markdown_set_smart_quoting (GsMarkdown *self, + gboolean smart_quoting); +void gs_markdown_set_escape (GsMarkdown *self, + gboolean escape); +void gs_markdown_set_autocode (GsMarkdown *self, + gboolean autocode); +void gs_markdown_set_autolinkify (GsMarkdown *self, + gboolean autolinkify); +gchar *gs_markdown_parse (GsMarkdown *self, + const gchar *text); + +G_END_DECLS diff --git a/plugins/packagekit/gs-packagekit-helper.c b/plugins/packagekit/gs-packagekit-helper.c new file mode 100644 index 0000000..b123be1 --- /dev/null +++ b/plugins/packagekit/gs-packagekit-helper.c @@ -0,0 +1,193 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016-2018 Richard Hughes + * Copyright (C) 2019 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-packagekit-helper.h" +#include "packagekit-common.h" + +struct _GsPackagekitHelper { + GObject parent_instance; + GHashTable *apps; + GsApp *progress_app; + GsAppList *progress_list; + GsPlugin *plugin; + gboolean allow_emit_updates_changed; +}; + +G_DEFINE_TYPE (GsPackagekitHelper, gs_packagekit_helper, G_TYPE_OBJECT) + +void +gs_packagekit_helper_cb (PkProgress *progress, PkProgressType type, gpointer user_data) +{ + GsPackagekitHelper *self = (GsPackagekitHelper *) user_data; + GsPlugin *plugin = gs_packagekit_helper_get_plugin (self); + const gchar *package_id = pk_progress_get_package_id (progress); + GsApp *app = NULL; + + /* optional */ + if (self->progress_app != NULL) + app = self->progress_app; + else if (package_id != NULL) + app = gs_packagekit_helper_get_app_by_id (self, package_id); + + if (type == PK_PROGRESS_TYPE_STATUS) { + PkStatusEnum status = pk_progress_get_status (progress); + GsPluginStatus plugin_status = packagekit_status_enum_to_plugin_status (status); + if (plugin_status != GS_PLUGIN_STATUS_UNKNOWN) + gs_plugin_status_update (plugin, app, plugin_status); + + /* If we’re installing or removing a package, this may + * invalidate a previously-returned pending OS upgrade’s list of + * packages. + * + * FIXME: We can’t currently emit a more specific signal on the + * OS upgrade’s #GsApp, because it’s built by the + * fedora-pkgdb-collections plugin rather than the PackageKit + * plugin. The functionality from fedora-pkgdb-collections would + * have to be merged into PackageKit so the right #GsApp is + * accessible to modify its download state. + * */ + if ((self->allow_emit_updates_changed) && + (plugin_status == GS_PLUGIN_STATUS_INSTALLING || + plugin_status == GS_PLUGIN_STATUS_REMOVING) && + (app == NULL || + (gs_app_get_kind (app) != AS_COMPONENT_KIND_OPERATING_SYSTEM && + gs_app_get_id (app) != NULL))) { + /* this callback can be called many times in a row; limit how often + the GUI part is notified, to not refresh the Updates page too often */ + static gint64 last_notify = 0; + gint64 current_time = g_get_real_time (); + + /* Just out-of-blue chosen 3 minutes interval between notifications */ + if (current_time - last_notify >= G_USEC_PER_SEC * 60 * 3) { + g_debug ("notify about updates-changed from %s", G_STRFUNC); + last_notify = current_time; + gs_plugin_updates_changed (plugin); + } + } + } else if (type == PK_PROGRESS_TYPE_PERCENTAGE) { + gint percentage = pk_progress_get_percentage (progress); + if (app != NULL && percentage >= 0 && percentage <= 100) + gs_app_set_progress (app, (guint) percentage); + if (self->progress_list != NULL && percentage >= 0 && percentage <= 100) + gs_app_list_override_progress (self->progress_list, (guint) percentage); + } + + /* Only go from TRUE to FALSE - it doesn't make sense for a package + * install to become uncancellable later on */ + if (app != NULL && gs_app_get_allow_cancel (app)) + gs_app_set_allow_cancel (app, pk_progress_get_allow_cancel (progress)); +} + +void +gs_packagekit_helper_add_app (GsPackagekitHelper *self, GsApp *app) +{ + GPtrArray *source_ids = gs_app_get_source_ids (app); + + g_return_if_fail (GS_IS_PACKAGEKIT_HELPER (self)); + g_return_if_fail (GS_IS_APP (app)); + + for (guint i = 0; i < source_ids->len; i++) { + const gchar *source_id = g_ptr_array_index (source_ids, i); + g_hash_table_insert (self->apps, + g_strdup (source_id), + g_object_ref (app)); + } +} + +void +gs_packagekit_helper_set_progress_app (GsPackagekitHelper *self, GsApp *progress_app) +{ + g_set_object (&self->progress_app, progress_app); +} + +void +gs_packagekit_helper_set_progress_list (GsPackagekitHelper *self, GsAppList *progress_list) +{ + g_set_object (&self->progress_list, progress_list); +} + +/* + * gs_packagekit_helper_set_allow_emit_updates_changed: + * @self: a #GsPackagekitHelper + * @allow_emit_updates_changed: whether to allow emission of the updates-changed signal + * + * Set whether to allow emitting the #GsPlugin:updates-changed signal at any time through the task, + * or whether to block it. + * + * FIXME: This is only needed to work around a signal emission loop caused by interaction + * between the fedora-pkgdb-collections and PackageKit plugins. When the fedora-pkgdb-collections + * plugin is removed, this API should be removed. + * See !1817 and #2462. + */ +void +gs_packagekit_helper_set_allow_emit_updates_changed (GsPackagekitHelper *self, + gboolean allow_emit_updates_changed) +{ + self->allow_emit_updates_changed = allow_emit_updates_changed; +} + +GsPlugin * +gs_packagekit_helper_get_plugin (GsPackagekitHelper *self) +{ + g_return_val_if_fail (GS_IS_PACKAGEKIT_HELPER (self), NULL); + return self->plugin; +} + +GsApp * +gs_packagekit_helper_get_app_by_id (GsPackagekitHelper *self, const gchar *package_id) +{ + g_return_val_if_fail (GS_IS_PACKAGEKIT_HELPER (self), NULL); + g_return_val_if_fail (package_id != NULL, NULL); + return g_hash_table_lookup (self->apps, package_id); +} + +static void +gs_packagekit_helper_finalize (GObject *object) +{ + GsPackagekitHelper *self; + + g_return_if_fail (GS_IS_PACKAGEKIT_HELPER (object)); + + self = GS_PACKAGEKIT_HELPER (object); + + g_object_unref (self->plugin); + g_clear_object (&self->progress_app); + g_clear_object (&self->progress_list); + g_hash_table_unref (self->apps); + + G_OBJECT_CLASS (gs_packagekit_helper_parent_class)->finalize (object); +} + +static void +gs_packagekit_helper_class_init (GsPackagekitHelperClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_packagekit_helper_finalize; +} + +static void +gs_packagekit_helper_init (GsPackagekitHelper *self) +{ + self->apps = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) g_object_unref); + self->allow_emit_updates_changed = TRUE; +} + +GsPackagekitHelper * +gs_packagekit_helper_new (GsPlugin *plugin) +{ + GsPackagekitHelper *self; + self = g_object_new (GS_TYPE_PACKAGEKIT_HELPER, NULL); + self->plugin = g_object_ref (plugin); + return GS_PACKAGEKIT_HELPER (self); +} diff --git a/plugins/packagekit/gs-packagekit-helper.h b/plugins/packagekit/gs-packagekit-helper.h new file mode 100644 index 0000000..1620a0b --- /dev/null +++ b/plugins/packagekit/gs-packagekit-helper.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016-2018 Richard Hughes + * Copyright (C) 2019 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PACKAGEKIT_HELPER (gs_packagekit_helper_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPackagekitHelper, gs_packagekit_helper, GS, PACKAGEKIT_HELPER, GObject) + +GsPackagekitHelper *gs_packagekit_helper_new (GsPlugin *plugin); +GsPlugin *gs_packagekit_helper_get_plugin (GsPackagekitHelper *self); +void gs_packagekit_helper_add_app (GsPackagekitHelper *self, + GsApp *app); +void gs_packagekit_helper_set_progress_app (GsPackagekitHelper *self, + GsApp *progress_app); +void gs_packagekit_helper_set_progress_list (GsPackagekitHelper *self, + GsAppList *progress_list); +void gs_packagekit_helper_set_allow_emit_updates_changed + (GsPackagekitHelper *self, + gboolean allow_emit_updates_changed); +GsApp *gs_packagekit_helper_get_app_by_id (GsPackagekitHelper *self, + const gchar *package_id); +void gs_packagekit_helper_cb (PkProgress *progress, + PkProgressType type, + gpointer user_data); + + +G_END_DECLS diff --git a/plugins/packagekit/gs-packagekit-task.c b/plugins/packagekit/gs-packagekit-task.c new file mode 100644 index 0000000..50a16ec --- /dev/null +++ b/plugins/packagekit/gs-packagekit-task.c @@ -0,0 +1,279 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-packagekit-task.h" + +/** + * SECTION:gs-packagekit-task + * @short_description: PkTask subclass which implements vfuncs for user interaction during a task + * + * #GsPackagekitTask is a subclass of #PkTask which represents a single + * operation on PackageKit. + * + * By subclassing #PkTask, it can implement vfuncs which allow decisions + * to be made about the task while it’s running. For example, to decide + * what to do if an untrusted package needs to be installed. + * + * Since: 42 + */ + +typedef struct { + GWeakRef plugin_weakref; /* GsPlugin * */ + GsPackagekitTaskQuestionType question_type; + GsPackagekitHelper *helper; +} GsPackagekitTaskPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsPackagekitTask, gs_packagekit_task, PK_TYPE_TASK) + +static gboolean +gs_packagekit_task_user_accepted (PkTask *task, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label) +{ + GsPackagekitTask *gs_task = GS_PACKAGEKIT_TASK (task); + GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (gs_task); + g_autoptr(GsPlugin) plugin = NULL; + gboolean accepts = FALSE; + + plugin = g_weak_ref_get (&priv->plugin_weakref); + if (plugin) + accepts = gs_plugin_ask_untrusted (plugin, title, msg, details, accept_label); + + return accepts; +} + +typedef struct { + GWeakRef task_weakref; + guint request; + gchar *title; + gchar *msg; + gchar *details; + gchar *accept_label; +} QuestionData; + +static QuestionData * +question_data_new (GsPackagekitTask *task, + guint request, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label) +{ + QuestionData *qd; + + qd = g_slice_new0 (QuestionData); + g_weak_ref_init (&qd->task_weakref, task); + qd->request = request; + qd->title = g_strdup (title); + qd->msg = g_strdup (msg); + qd->details = g_strdup (details); + qd->accept_label = g_strdup (accept_label); + + return qd; +} + +static void +question_data_free (gpointer ptr) +{ + QuestionData *qd = ptr; + g_weak_ref_clear (&qd->task_weakref); + g_free (qd->title); + g_free (qd->msg); + g_free (qd->details); + g_free (qd->accept_label); + g_slice_free (QuestionData, qd); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (QuestionData, question_data_free) + +static gboolean +gs_packagekit_task_question_idle_cb (gpointer user_data) +{ + QuestionData *qd = user_data; + g_autoptr(PkTask) task = NULL; + + task = g_weak_ref_get (&qd->task_weakref); + if (task) { + if (gs_packagekit_task_user_accepted (task, qd->title, qd->msg, qd->details, qd->accept_label)) + pk_task_user_accepted (task, qd->request); + else + pk_task_user_declined (task, qd->request); + } + + return G_SOURCE_REMOVE; +} + +static void +gs_packagekit_task_schedule_question (GsPackagekitTask *task, + guint request, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label) +{ + g_autoptr(QuestionData) qd = NULL; + + qd = question_data_new (task, request, title, msg, details, accept_label); + g_idle_add_full (G_PRIORITY_HIGH_IDLE, gs_packagekit_task_question_idle_cb, g_steal_pointer (&qd), question_data_free); +} + +/* This may be called in a PackageKit worker thread. */ +static void +gs_packagekit_task_untrusted_question (PkTask *task, + guint request, + PkResults *results) +{ + GsPackagekitTask *gs_task = GS_PACKAGEKIT_TASK (task); + GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (gs_task); + g_autoptr(PkError) error = NULL; + const gchar *title; + const gchar *msg; + const gchar *details; + const gchar *accept_label; + + switch (priv->question_type) { + case GS_PACKAGEKIT_TASK_QUESTION_TYPE_INSTALL: + title = _("Install Unsigned Software?"); + msg = _("Software that is to be installed is not signed. It will not be possible to verify the origin of updates to this software, or whether updates have been tampered with."); + accept_label = _("_Install"); + break; + case GS_PACKAGEKIT_TASK_QUESTION_TYPE_DOWNLOAD: + title = _("Download Unsigned Software?"); + msg = _("Unsigned updates are available. Without a signature, it is not possible to verify the origin of the update, or whether it has been tampered with."); + accept_label = _("_Download"); + break; + case GS_PACKAGEKIT_TASK_QUESTION_TYPE_UPDATE: + title = _("Update Unsigned Software?"); + msg = _("Unsigned updates are available. Without a signature, it is not possible to verify the origin of the update, or whether it has been tampered with. Software updates will be disabled until unsigned updates are either removed or updated."); + accept_label = _("_Update"); + break; + default: + pk_task_user_declined (task, request); + return; + } + + error = pk_results_get_error_code (results); + if (error) + details = pk_error_get_details (error); + else + details = NULL; + + gs_packagekit_task_schedule_question (gs_task, request, title, msg, details, accept_label); +} + +static void +gs_packagekit_task_finalize (GObject *object) +{ + GsPackagekitTask *task = GS_PACKAGEKIT_TASK (object); + GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (task); + + g_weak_ref_clear (&priv->plugin_weakref); + g_clear_object (&priv->helper); + + G_OBJECT_CLASS (gs_packagekit_task_parent_class)->finalize (object); +} + +static void +gs_packagekit_task_class_init (GsPackagekitTaskClass *klass) +{ + GObjectClass *object_class; + PkTaskClass *task_class; + + task_class = PK_TASK_CLASS (klass); + task_class->untrusted_question = gs_packagekit_task_untrusted_question; + + object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_packagekit_task_finalize; +} + +static void +gs_packagekit_task_init (GsPackagekitTask *task) +{ + GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (task); + + g_weak_ref_init (&priv->plugin_weakref, NULL); +} + +PkTask * +gs_packagekit_task_new (GsPlugin *plugin) +{ + GsPackagekitTask *task; + GsPackagekitTaskPrivate *priv; + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), NULL); + + task = g_object_new (GS_TYPE_PACKAGEKIT_TASK, NULL); + priv = gs_packagekit_task_get_instance_private (task); + + g_weak_ref_set (&priv->plugin_weakref, plugin); + + return PK_TASK (task); +} + +void +gs_packagekit_task_setup (GsPackagekitTask *task, + GsPackagekitTaskQuestionType question_type, + gboolean interactive) +{ + GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (task); + + g_return_if_fail (GS_IS_PACKAGEKIT_TASK (task)); + + priv->question_type = question_type; + + /* The :interactive and :background properties have slightly different + * purposes: + * - :interactive controls whether the task can create interactive + * authentication (polkit) prompts + * - :background controls the scheduling of the task relative to other + * PackageKit tasks from this client and other clients + * However, we always want to set them both based on the same + * conditions. */ + pk_client_set_interactive (PK_CLIENT (task), interactive); + pk_client_set_background (PK_CLIENT (task), !interactive); +} + +GsPackagekitTaskQuestionType +gs_packagekit_task_get_question_type (GsPackagekitTask *task) +{ + GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (task); + + g_return_val_if_fail (GS_IS_PACKAGEKIT_TASK (task), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE); + + return priv->question_type; +} + +void +gs_packagekit_task_take_helper (GsPackagekitTask *task, + GsPackagekitHelper *helper) +{ + GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (task); + + g_return_if_fail (GS_IS_PACKAGEKIT_TASK (task)); + + if (priv->helper != helper) { + g_clear_object (&priv->helper); + priv->helper = helper; + } +} + +GsPackagekitHelper * +gs_packagekit_task_get_helper (GsPackagekitTask *task) +{ + GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (task); + + g_return_val_if_fail (GS_IS_PACKAGEKIT_TASK (task), NULL); + + return priv->helper; +} diff --git a/plugins/packagekit/gs-packagekit-task.h b/plugins/packagekit/gs-packagekit-task.h new file mode 100644 index 0000000..79cd916 --- /dev/null +++ b/plugins/packagekit/gs-packagekit-task.h @@ -0,0 +1,58 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-packagekit-helper.h" + +G_BEGIN_DECLS + +/** + * GsPackagekitTaskQuestionType: + * @GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE: No question should be asked. + * @GS_PACKAGEKIT_TASK_QUESTION_TYPE_INSTALL: Question is about installing an app. + * @GS_PACKAGEKIT_TASK_QUESTION_TYPE_DOWNLOAD: Question is about downloading an app. + * @GS_PACKAGEKIT_TASK_QUESTION_TYPE_UPDATE: Question is about updating an app. + * + * The type of question the task should ask the user if there’s an untrusted + * repo prompt from PackageKit. Most callers of #GsPackagekitTask should use + * %GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE. + * + * Since: 44 + */ +typedef enum { + GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, + GS_PACKAGEKIT_TASK_QUESTION_TYPE_INSTALL, + GS_PACKAGEKIT_TASK_QUESTION_TYPE_DOWNLOAD, + GS_PACKAGEKIT_TASK_QUESTION_TYPE_UPDATE, +} GsPackagekitTaskQuestionType; + +#define GS_TYPE_PACKAGEKIT_TASK (gs_packagekit_task_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsPackagekitTask, gs_packagekit_task, GS, PACKAGEKIT_TASK, PkTask) + +struct _GsPackagekitTaskClass +{ + PkTaskClass parent_class; +}; + +PkTask *gs_packagekit_task_new (GsPlugin *plugin); +void gs_packagekit_task_setup (GsPackagekitTask *task, + GsPackagekitTaskQuestionType question_type, + gboolean interactive); +GsPackagekitTaskQuestionType gs_packagekit_task_get_question_type (GsPackagekitTask *task); +void gs_packagekit_task_take_helper (GsPackagekitTask *task, + GsPackagekitHelper *helper); +GsPackagekitHelper * + gs_packagekit_task_get_helper (GsPackagekitTask *task); + +G_END_DECLS diff --git a/plugins/packagekit/gs-plugin-packagekit.c b/plugins/packagekit/gs-plugin-packagekit.c new file mode 100644 index 0000000..df22213 --- /dev/null +++ b/plugins/packagekit/gs-plugin-packagekit.c @@ -0,0 +1,5463 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * Copyright (C) 2017 Canonical Ltd + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2024 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include +#include +#include +#include + +#include "packagekit-common.h" +#include "gs-markdown.h" +#include "gs-packagekit-helper.h" +#include "gs-packagekit-task.h" +#include "gs-plugin-private.h" + +#include "gs-plugin-packagekit.h" + +/* + * SECTION: + * Uses the system PackageKit instance to return installed packages, + * sources and the ability to add and remove packages. Supports package history + * and converting URIs to apps. + * + * Supports setting the session proxy on the system PackageKit instance. + * + * Also supports doing a PackageKit UpdatePackages(ONLY_DOWNLOAD) method on + * refresh and also converts any package files to applications the best we can. + * + * Also supports converting repo filenames to package-ids. + * + * Also supports marking previously downloaded packages as zero size, and allows + * scheduling an offline update. An offline update is when packages are + * downloaded in advance, but are then deployed on reboot, when the system is in + * a minimally started-up state. This reduces the risk of things crashing as + * files are updated. + * + * See https://github.com/PackageKit/PackageKit/blob/main/docs/offline-updates.txt + * and https://www.freedesktop.org/software/systemd/man/latest/systemd.offline-updates.html + * for details of how offline updates work. + * + * Requires: | [source-id], [repos::repo-filename] + * Refines: | [source-id], [source], [update-details], [management-plugin] + */ + +#define GS_PLUGIN_PACKAGEKIT_HISTORY_TIMEOUT 5000 /* ms */ + +/* Timeout to trigger auto-prepare update after the prepared update had been invalidated */ +#define PREPARE_UPDATE_TIMEOUT_SECS 30 + +struct _GsPluginPackagekit { + GsPlugin parent; + + PkControl *control_refine; + + PkControl *control_proxy; + GSettings *settings_proxy; + GSettings *settings_http; + GSettings *settings_https; + GSettings *settings_ftp; + GSettings *settings_socks; + + GFileMonitor *monitor; + GFileMonitor *monitor_trigger; + GPermission *permission; + gboolean is_triggered; + GHashTable *prepared_updates; /* (element-type utf8); set of package IDs for updates which are already prepared */ + GMutex prepared_updates_mutex; + guint prepare_update_timeout_id; + + GCancellable *proxy_settings_cancellable; /* (nullable) (owned) */ + + GHashTable *cached_sources; /* (nullable) (owned) (element-type utf8 GsApp); sources by id, each value is weak reffed */ + GMutex cached_sources_mutex; +}; + +G_DEFINE_TYPE (GsPluginPackagekit, gs_plugin_packagekit, GS_TYPE_PLUGIN) + +static void gs_plugin_packagekit_installed_changed_cb (PkControl *control, GsPlugin *plugin); +static void gs_plugin_packagekit_updates_changed_cb (PkControl *control, GsPlugin *plugin); +static void gs_plugin_packagekit_repo_list_changed_cb (PkControl *control, GsPlugin *plugin); +static void gs_plugin_packagekit_refine_history_async (GsPluginPackagekit *self, + GsAppList *list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean gs_plugin_packagekit_refine_history_finish (GsPluginPackagekit *self, + GAsyncResult *result, + GError **error); +static void gs_plugin_packagekit_enable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean gs_plugin_packagekit_enable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error); +static void gs_plugin_packagekit_proxy_changed_cb (GSettings *settings, + const gchar *key, + gpointer user_data); +static void reload_proxy_settings_async (GsPluginPackagekit *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean reload_proxy_settings_finish (GsPluginPackagekit *self, + GAsyncResult *result, + GError **error); +static void gs_plugin_packagekit_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean gs_plugin_packagekit_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + +static void +cached_sources_weak_ref_cb (gpointer user_data, + GObject *object) +{ + GsPluginPackagekit *self = user_data; + GHashTableIter iter; + gpointer key, value; + g_autoptr(GMutexLocker) locker = NULL; + + locker = g_mutex_locker_new (&self->cached_sources_mutex); + + g_assert (self->cached_sources != NULL); + + g_hash_table_iter_init (&iter, self->cached_sources); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GObject *repo_object = value; + if (repo_object == object) { + g_hash_table_iter_remove (&iter); + if (!g_hash_table_size (self->cached_sources)) + g_clear_pointer (&self->cached_sources, g_hash_table_unref); + break; + } + } +} + +static void +gs_plugin_packagekit_init (GsPluginPackagekit *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + /* refine */ + self->control_refine = pk_control_new (); + g_signal_connect (self->control_refine, "updates-changed", + G_CALLBACK (gs_plugin_packagekit_updates_changed_cb), plugin); + g_signal_connect (self->control_refine, "repo-list-changed", + G_CALLBACK (gs_plugin_packagekit_repo_list_changed_cb), plugin); + if (g_signal_lookup ("installed-changed", PK_TYPE_CONTROL) != 0) { + g_debug ("Connecting to PkControl::installed-changed signal"); + g_signal_connect_object (self->control_refine, "installed-changed", + G_CALLBACK (gs_plugin_packagekit_installed_changed_cb), plugin, 0); + } + + /* proxy */ + self->control_proxy = pk_control_new (); + self->settings_proxy = g_settings_new ("org.gnome.system.proxy"); + g_signal_connect (self->settings_proxy, "changed", + G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), self); + + self->settings_http = g_settings_new ("org.gnome.system.proxy.http"); + self->settings_https = g_settings_new ("org.gnome.system.proxy.https"); + self->settings_ftp = g_settings_new ("org.gnome.system.proxy.ftp"); + self->settings_socks = g_settings_new ("org.gnome.system.proxy.socks"); + g_signal_connect (self->settings_http, "changed", + G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), self); + g_signal_connect (self->settings_https, "changed", + G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), self); + g_signal_connect (self->settings_ftp, "changed", + G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), self); + g_signal_connect (self->settings_socks, "changed", + G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), self); + + /* offline updates */ + g_mutex_init (&self->prepared_updates_mutex); + self->prepared_updates = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + + g_mutex_init (&self->cached_sources_mutex); + + /* need pkgname and ID */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + + /* we can return better results than dpkg directly */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_CONFLICTS, "dpkg"); + + /* need repos::repo-filename */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "repos"); + + /* generic updates happen after PackageKit offline updates */ + gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_BEFORE, "generic-updates"); +} + +static void +gs_plugin_packagekit_dispose (GObject *object) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (object); + + if (self->prepare_update_timeout_id) { + g_source_remove (self->prepare_update_timeout_id); + self->prepare_update_timeout_id = 0; + } + + g_cancellable_cancel (self->proxy_settings_cancellable); + g_clear_object (&self->proxy_settings_cancellable); + + /* refine */ + g_clear_object (&self->control_refine); + + /* proxy */ + g_clear_object (&self->control_proxy); + g_clear_object (&self->settings_proxy); + g_clear_object (&self->settings_http); + g_clear_object (&self->settings_https); + g_clear_object (&self->settings_ftp); + g_clear_object (&self->settings_socks); + + /* offline updates */ + g_clear_pointer (&self->prepared_updates, g_hash_table_unref); + g_clear_object (&self->monitor); + g_clear_object (&self->monitor_trigger); + + if (self->cached_sources != NULL) { + GHashTableIter iter; + gpointer value; + + g_hash_table_iter_init (&iter, self->cached_sources); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GObject *app_repo = value; + g_object_weak_unref (app_repo, cached_sources_weak_ref_cb, self); + } + + g_clear_pointer (&self->cached_sources, g_hash_table_unref); + } + + G_OBJECT_CLASS (gs_plugin_packagekit_parent_class)->dispose (object); +} + +static void +gs_plugin_packagekit_finalize (GObject *object) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (object); + + g_mutex_clear (&self->prepared_updates_mutex); + g_mutex_clear (&self->cached_sources_mutex); + + G_OBJECT_CLASS (gs_plugin_packagekit_parent_class)->finalize (object); +} + +static gboolean +gs_plugin_packagekit_convert_error (GError **error, + PkErrorEnum error_enum, + const gchar *details, + const gchar *prefix) +{ + switch (error_enum) { + case PK_ERROR_ENUM_PACKAGE_DOWNLOAD_FAILED: + case PK_ERROR_ENUM_NO_CACHE: + case PK_ERROR_ENUM_NO_NETWORK: + case PK_ERROR_ENUM_NO_MORE_MIRRORS_TO_TRY: + case PK_ERROR_ENUM_CANNOT_FETCH_SOURCES: + case PK_ERROR_ENUM_UNFINISHED_TRANSACTION: + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NO_NETWORK, + details); + break; + case PK_ERROR_ENUM_BAD_GPG_SIGNATURE: + case PK_ERROR_ENUM_CANNOT_UPDATE_REPO_UNSIGNED: + case PK_ERROR_ENUM_GPG_FAILURE: + case PK_ERROR_ENUM_MISSING_GPG_SIGNATURE: + case PK_ERROR_ENUM_PACKAGE_CORRUPT: + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NO_SECURITY, + details); + break; + case PK_ERROR_ENUM_TRANSACTION_CANCELLED: + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_CANCELLED, + details); + break; + case PK_ERROR_ENUM_NO_PACKAGES_TO_UPDATE: + case PK_ERROR_ENUM_UPDATE_NOT_FOUND: + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + details); + break; + case PK_ERROR_ENUM_NO_SPACE_ON_DEVICE: + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NO_SPACE, + details); + break; + default: + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + details); + break; + } + if (prefix != NULL) + g_prefix_error_literal (error, prefix); + return FALSE; +} + +typedef gboolean (*GsAppFilterFunc) (GsApp *app); + +static gboolean +package_is_installed (const gchar *package_id) +{ + g_auto(GStrv) split = NULL; + const gchar *data; + + split = pk_package_id_split (package_id); + if (split == NULL) { + return FALSE; + } + + data = split[PK_PACKAGE_ID_DATA]; + if (g_str_has_prefix (data, "installed") || + g_str_has_prefix (data, "manual:") || + g_str_has_prefix (data, "auto:")) { + return TRUE; + } + + return FALSE; +} + +/* The elements in the returned #GPtrArray reference memory from within the + * @apps list, so the array is only valid as long as @apps is not modified or + * freed. The array is not NULL-terminated. + * + * If @apps is %NULL, that’s considered equivalent to an empty list. */ +static GPtrArray * +app_list_get_package_ids (GsAppList *apps, + GsAppFilterFunc app_filter, + gboolean ignore_installed) +{ + g_autoptr(GPtrArray) list_package_ids = g_ptr_array_new_with_free_func (NULL); + + for (guint i = 0; apps != NULL && i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + GPtrArray *app_source_ids; + + if (app_filter != NULL && !app_filter (app)) + continue; + + app_source_ids = gs_app_get_source_ids (app); + for (guint j = 0; j < app_source_ids->len; j++) { + const gchar *package_id = g_ptr_array_index (app_source_ids, j); + + if (ignore_installed && package_is_installed (package_id)) + continue; + + g_ptr_array_add (list_package_ids, (gchar *) package_id); + } + } + + return g_steal_pointer (&list_package_ids); +} + +static GsApp * +gs_plugin_packagekit_dup_app_origin_repo (GsPluginPackagekit *self, + GsApp *app, + GError **error) +{ + GsPlugin *plugin = GS_PLUGIN (self); + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GsApp) repo_app = NULL; + const gchar *repo_id; + + repo_id = gs_app_get_origin (app); + if (repo_id == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "origin not set"); + return NULL; + } + + locker = g_mutex_locker_new (&self->cached_sources_mutex); + repo_app = g_hash_table_lookup (self->cached_sources, repo_id); + if (repo_app != NULL) { + g_object_ref (repo_app); + } else { + repo_app = gs_app_new (repo_id); + gs_app_set_management_plugin (repo_app, plugin); + gs_app_set_kind (repo_app, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_bundle_kind (repo_app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (repo_app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_add_quirk (repo_app, GS_APP_QUIRK_NOT_LAUNCHABLE); + gs_plugin_packagekit_set_packaging_format (plugin, repo_app); + } + + g_clear_pointer (&locker, g_mutex_locker_free); + + return g_steal_pointer (&repo_app); +} + +typedef struct { + /* Input data. */ + GsAppList *apps; /* (owned) (not nullable) */ + GsPluginInstallAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + guint n_pending_enable_repo_ops; + guint n_pending_install_ops; + GError *saved_enable_repo_error; /* (owned) (nullable) */ + GError *saved_install_error; /* (owned) (nullable) */ + GsAppList *remote_apps_to_install; /* (owned) (nullable) */ + GsAppList *local_apps_to_install; /* (owned) (nullable) */ + GsPackagekitHelper *progress_data; /* (owned) (nullable) */ +} InstallAppsData; + +static void +install_apps_data_free (InstallAppsData *data) +{ + g_clear_object (&data->apps); + g_clear_object (&data->remote_apps_to_install); + g_clear_object (&data->local_apps_to_install); + g_clear_object (&data->progress_data); + + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_enable_repo_error == NULL); + g_assert (data->saved_install_error == NULL); + g_assert (data->n_pending_enable_repo_ops == 0); + g_assert (data->n_pending_install_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallAppsData, install_apps_data_free) + +static void finish_install_apps_enable_repo_op (GTask *task, + GError *error); +static void install_apps_enable_repo_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_apps_remote_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_apps_local_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_install_apps_install_op (GTask *task, + GError *error); + +static void +gs_plugin_packagekit_install_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin); + g_autoptr(GTask) task = NULL; + InstallAppsData *data; + g_autoptr(InstallAppsData) data_owned = NULL; + gboolean interactive = (flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GHashTable) repos = NULL; + GHashTableIter iter; + gpointer value; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_install_apps_async); + + data = data_owned = g_new0 (InstallAppsData, 1); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->apps = g_object_ref (apps); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) install_apps_data_free); + + /* Start a load of operations in parallel to install the apps, in the + * following structure: + * + * gs_plugin_packagekit_install_apps_async + * | + * /--------+------------------------------------+--------------------------\ + * v v v + * gs_plugin_packagekit_enable_repository_async gs_plugin_packagekit_enable_repository_async … + * | | | + * \--------+------------------------------------+--------------------------/ + * | + * /--------------+----------------\ + * | | + * v v + * pk_task_install_packages_async pk_task_install_files_async + * | | + * \--------------+----------------/ + * | + * v + * finish_install_apps_install_op + * + * When all installs are finished for all apps, + * finish_install_apps_install_op() will return success/error for the + * overall #GTask. + * + * FIXME: Tie @progress_callback to number of completed operations. */ + data->n_pending_enable_repo_ops = 1; + + /* Firstly, find all the apps which need their origin repo to be enabled + * first, deduplicate the repos and enable them. */ + repos = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); + + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + /* enable repo, handled by dedicated function */ + g_assert (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY); + + if (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE) { + g_autoptr(GsApp) repo_app = NULL; + const gchar *repo_app_id; + + repo_app = gs_plugin_packagekit_dup_app_origin_repo (self, app, &local_error); + if (repo_app == NULL) { + finish_install_apps_enable_repo_op (task, g_steal_pointer (&local_error)); + return; + } + + gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING); + repo_app_id = gs_app_get_id (repo_app); + g_hash_table_replace (repos, (gpointer) repo_app_id, g_steal_pointer (&repo_app)); + } + } + + /* Enable the repos. */ + g_hash_table_iter_init (&iter, repos); + + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GsApp *repo_app = value; + + data->n_pending_enable_repo_ops++; + gs_plugin_packagekit_enable_repository_async (plugin, repo_app, + interactive ? GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE : GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_NONE, + cancellable, install_apps_enable_repo_cb, g_object_ref (task)); + } + + finish_install_apps_enable_repo_op (task, NULL); +} + +static void +install_apps_enable_repo_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + gs_plugin_packagekit_enable_repository_finish (GS_PLUGIN (self), result, &local_error); + finish_install_apps_enable_repo_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_install_apps_enable_repo_op (GTask *task, + GError *error) +{ + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + InstallAppsData *data = g_task_get_task_data (task); + gboolean interactive = (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + g_autoptr(GPtrArray) overall_remote_package_ids = NULL; + g_autoptr(GPtrArray) overall_local_package_ids = NULL; + g_autoptr(PkTask) task_install = NULL; + g_autoptr(GError) local_error = NULL; + + if (error_owned != NULL && data->saved_enable_repo_error == NULL) + data->saved_enable_repo_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while enabling repos to install apps: %s", error_owned->message); + + g_assert (data->n_pending_enable_repo_ops > 0); + data->n_pending_enable_repo_ops--; + + if (data->n_pending_enable_repo_ops > 0) + return; + + /* If enabling any repos failed, abandon the entire operation. + * Otherwise, carry on to installing apps. */ + if (data->saved_enable_repo_error != NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + event = gs_plugin_event_new ("error", data->saved_enable_repo_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + + g_task_return_boolean (task, TRUE); + return; + } + + overall_remote_package_ids = g_ptr_array_new_with_free_func (NULL); + overall_local_package_ids = g_ptr_array_new_with_free_func (g_free); + data->remote_apps_to_install = gs_app_list_new (); + data->local_apps_to_install = gs_app_list_new (); + + /* Mark all the unavailable apps as available, now that their repos + * are enabled. */ + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + if (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + } + + /* Next, group the apps into those which need internet to install, + * and those which can be installed locally, and grab their package + * IDs ready to pass to PackageKit. */ + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + /* queue for install if installation needs the network */ + if (!gs_plugin_get_network_available (GS_PLUGIN (self)) && + gs_app_get_state (app) != GS_APP_STATE_AVAILABLE_LOCAL) { + gs_app_set_state (app, GS_APP_STATE_QUEUED_FOR_INSTALL); + continue; + } + + switch (gs_app_get_state (app)) { + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_QUEUED_FOR_INSTALL: { + GPtrArray *source_ids; + g_autoptr(GsAppList) addons = NULL; + g_autoptr(GPtrArray) array_package_ids = NULL; + + source_ids = gs_app_get_source_ids (app); + if (source_ids->len == 0) { + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "installing not available"); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + + addons = gs_app_dup_addons (app); + array_package_ids = app_list_get_package_ids (addons, + gs_app_get_to_be_installed, + TRUE); + + for (guint j = 0; j < source_ids->len; j++) { + const gchar *package_id = g_ptr_array_index (source_ids, j); + if (package_is_installed (package_id)) + continue; + g_ptr_array_add (array_package_ids, (gpointer) package_id); + } + + if (array_package_ids->len == 0) { + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no packages to install"); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + + /* Add to the big array. */ + g_ptr_array_extend_and_steal (overall_remote_package_ids, + g_steal_pointer (&array_package_ids)); + + for (guint j = 0; addons != NULL && j < gs_app_list_length (addons); j++) { + GsApp *addon = gs_app_list_index (addons, j); + if (gs_app_get_to_be_installed (addon)) + gs_app_list_add (data->remote_apps_to_install, addon); + } + gs_app_list_add (data->remote_apps_to_install, app); + + break; + } + case GS_APP_STATE_AVAILABLE_LOCAL: { + g_autofree gchar *local_filename = NULL; + g_auto(GStrv) package_ids = NULL; + + if (gs_app_get_local_file (app) == NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "local package, but no filename"); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + local_filename = g_file_get_path (gs_app_get_local_file (app)); + package_ids = g_strsplit (local_filename, "\t", -1); + + /* Add to the big array. */ + for (gsize j = 0; package_ids[j] != NULL; j++) + g_ptr_array_add (overall_local_package_ids, g_steal_pointer (&package_ids[j])); + gs_app_list_add (data->local_apps_to_install, app); + + break; + } + default: { + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "do not know how to install app in state %s", + gs_app_state_to_string (gs_app_get_state (app))); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + } + } + + /* Set up a #PkTask to handle the D-Bus calls to packagekitd. */ + data->progress_data = gs_packagekit_helper_new (GS_PLUGIN (self)); + task_install = gs_packagekit_task_new (GS_PLUGIN (self)); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_install), GS_PACKAGEKIT_TASK_QUESTION_TYPE_INSTALL, interactive); + + data->n_pending_install_ops = 1; /* to track setup */ + + /* Install the remote packages. */ + if (overall_remote_package_ids->len > 0 && + !(data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD) && + !(data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY)) { + /* NULL-terminate the array. */ + g_ptr_array_add (overall_remote_package_ids, NULL); + + /* Update the app’s and its addons‘ states. */ + for (guint i = 0; i < gs_app_list_length (data->remote_apps_to_install); i++) { + GsApp *app = gs_app_list_index (data->remote_apps_to_install, i); + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + gs_packagekit_helper_add_app (data->progress_data, app); + } + + data->n_pending_install_ops++; + pk_task_install_packages_async (task_install, + (gchar **) overall_remote_package_ids->pdata, + cancellable, + gs_packagekit_helper_cb, data->progress_data, + install_apps_remote_cb, + g_object_ref (task)); + } + + /* And, in parallel, install the local packages. */ + if (overall_local_package_ids->len > 0 && + !(data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY)) { + /* NULL-terminate the array. */ + g_ptr_array_add (overall_local_package_ids, NULL); + + /* Update the apps’ states. */ + for (guint i = 0; i < gs_app_list_length (data->local_apps_to_install); i++) { + GsApp *app = gs_app_list_index (data->local_apps_to_install, i); + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + gs_packagekit_helper_add_app (data->progress_data, app); + } + + data->n_pending_install_ops++; + pk_task_install_files_async (task_install, + (gchar **) overall_local_package_ids->pdata, + cancellable, + gs_packagekit_helper_cb, data->progress_data, + install_apps_local_cb, + g_object_ref (task)); + } + + finish_install_apps_install_op (task, NULL); +} + +static void +install_apps_remote_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkTask *task_install = PK_TASK (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + InstallAppsData *data = g_task_get_task_data (task); + gboolean interactive = (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(PkResults) results = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_task_generic_finish (task_install, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + g_autoptr(GsPluginEvent) event = NULL; + + for (guint i = 0; i < gs_app_list_length (data->remote_apps_to_install); i++) { + GsApp *app = gs_app_list_index (data->remote_apps_to_install, i); + gs_app_set_state_recover (app); + } + + gs_plugin_packagekit_error_convert (&local_error, cancellable); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + finish_install_apps_install_op (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (data->remote_apps_to_install); i++) { + GsApp *app = gs_app_list_index (data->remote_apps_to_install, i); + + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + + /* no longer valid */ + gs_app_clear_source_ids (app); + } + + finish_install_apps_install_op (task, NULL); +} + +static void +install_apps_local_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkTask *task_install = PK_TASK (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + InstallAppsData *data = g_task_get_task_data (task); + gboolean interactive = (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(PkResults) results = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_task_generic_finish (task_install, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + g_autoptr(GsPluginEvent) event = NULL; + + for (guint i = 0; i < gs_app_list_length (data->local_apps_to_install); i++) { + GsApp *app = gs_app_list_index (data->local_apps_to_install, i); + gs_app_set_state_recover (app); + } + + gs_plugin_packagekit_error_convert (&local_error, cancellable); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + finish_install_apps_install_op (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (data->local_apps_to_install); i++) { + GsApp *app = gs_app_list_index (data->local_apps_to_install, i); + + /* state is known */ + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + + /* get the new icon from the package */ + gs_app_set_local_file (app, NULL); + gs_app_remove_all_icons (app); + + /* no longer valid */ + gs_app_clear_source_ids (app); + } + + finish_install_apps_install_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_install_apps_install_op (GTask *task, + GError *error) +{ + InstallAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_install_error == NULL) + data->saved_install_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while installing apps: %s", error_owned->message); + + g_assert (data->n_pending_install_ops > 0); + data->n_pending_install_ops--; + + if (data->n_pending_install_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_install_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_install_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_install_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + /* Input data. */ + GsAppList *apps; /* (owned) (not nullable) */ + GsPluginUninstallAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + GsAppList *apps_to_uninstall; /* (owned) (nullable) */ + GsPackagekitHelper *progress_data; /* (owned) (nullable) */ +} UninstallAppsData; + +static void +uninstall_apps_data_free (UninstallAppsData *data) +{ + g_clear_object (&data->apps); + g_clear_object (&data->apps_to_uninstall); + g_clear_object (&data->progress_data); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UninstallAppsData, uninstall_apps_data_free) + +static void uninstall_apps_remove_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void uninstall_apps_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_uninstall_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin); + g_autoptr(GTask) task = NULL; + UninstallAppsData *data; + g_autoptr(UninstallAppsData) data_owned = NULL; + gboolean interactive = (flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GPtrArray) overall_package_ids = NULL; + g_autoptr(PkTask) task_uninstall = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_uninstall_apps_async); + + data = data_owned = g_new0 (UninstallAppsData, 1); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->apps = g_object_ref (apps); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) uninstall_apps_data_free); + + overall_package_ids = g_ptr_array_new_with_free_func (NULL); + data->apps_to_uninstall = gs_app_list_new (); + + /* Grab the package IDs from the apps ready to pass to PackageKit. */ + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + GPtrArray *source_ids; + g_autoptr(GPtrArray) array_package_ids = NULL; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + /* disable repo, handled by dedicated function */ + g_assert (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY); + + source_ids = gs_app_get_source_ids (app); + if (source_ids->len == 0) { + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "uninstalling not available"); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + + array_package_ids = g_ptr_array_new_with_free_func (NULL); + + for (guint j = 0; j < source_ids->len; j++) { + const gchar *package_id = g_ptr_array_index (source_ids, j); + if (!package_is_installed (package_id)) + continue; + g_ptr_array_add (array_package_ids, (gpointer) package_id); + } + + if (array_package_ids->len == 0) { + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error_literal (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no packages to uninstall"); + + event = gs_plugin_event_new ("error", local_error, + "app", app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + continue; + } + + /* Add to the big array. */ + g_ptr_array_extend_and_steal (overall_package_ids, + g_steal_pointer (&array_package_ids)); + gs_app_list_add (data->apps_to_uninstall, app); + } + + if (overall_package_ids->len == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + /* NULL-terminate the array. */ + g_ptr_array_add (overall_package_ids, NULL); + + /* Set up a #PkTask to handle the D-Bus calls to packagekitd. + * FIXME: Tie @progress_callback to number of completed operations. */ + data->progress_data = gs_packagekit_helper_new (GS_PLUGIN (self)); + task_uninstall = gs_packagekit_task_new (GS_PLUGIN (self)); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_uninstall), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, interactive); + + /* Update the app’s and its addons‘ states. */ + for (guint i = 0; i < gs_app_list_length (data->apps_to_uninstall); i++) { + GsApp *app = gs_app_list_index (data->apps_to_uninstall, i); + gs_app_set_state (app, GS_APP_STATE_REMOVING); + gs_packagekit_helper_add_app (data->progress_data, app); + } + + /* Uninstall the packages. */ + pk_task_remove_packages_async (task_uninstall, + (gchar **) overall_package_ids->pdata, + TRUE /* allow_deps */, + GS_PACKAGEKIT_AUTOREMOVE, + cancellable, + gs_packagekit_helper_cb, data->progress_data, + uninstall_apps_remove_cb, + g_steal_pointer (&task)); +} + +static void +uninstall_apps_remove_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkTask *task_uninstall = PK_TASK (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + UninstallAppsData *data = g_task_get_task_data (task); + gboolean interactive = (data->flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(PkResults) results = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_task_generic_finish (task_uninstall, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + g_autoptr(GsPluginEvent) event = NULL; + + for (guint i = 0; i < gs_app_list_length (data->apps_to_uninstall); i++) { + GsApp *app = gs_app_list_index (data->apps_to_uninstall, i); + gs_app_set_state_recover (app); + } + + gs_plugin_packagekit_error_convert (&local_error, cancellable); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + g_task_return_boolean (task, TRUE); + return; + } + + for (guint i = 0; i < gs_app_list_length (data->apps_to_uninstall); i++) { + GsApp *app = gs_app_list_index (data->apps_to_uninstall, i); + g_autoptr(GsAppList) addons = NULL; + + /* Make sure addons' state is updated as well */ + addons = gs_app_dup_addons (app); + for (guint j = 0; addons != NULL && j < gs_app_list_length (addons); j++) { + GsApp *addon = gs_app_list_index (addons, j); + if (gs_app_get_state (addon) == GS_APP_STATE_INSTALLED) { + gs_app_set_state (addon, GS_APP_STATE_UNKNOWN); + gs_app_clear_source_ids (addon); + } + } + + /* state is not known: we don't know if we can re-install this app */ + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + + /* no longer valid */ + gs_app_clear_source_ids (app); + } + + /* Refine the apps so their state is up to date again. */ + gs_plugin_packagekit_refine_async (GS_PLUGIN (self), + data->apps_to_uninstall, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION, + cancellable, + uninstall_apps_refine_cb, + g_steal_pointer (&task)); +} + +static void +uninstall_apps_refine_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_packagekit_refine_finish (GS_PLUGIN (self), result, &local_error)) { + gs_plugin_packagekit_error_convert (&local_error, cancellable); + g_debug ("Error refining apps after uninstall: %s", local_error->message); + g_clear_error (&local_error); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_uninstall_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_packagekit_set_update_app_state (GsApp *app, + PkPackage *package) +{ +#if PK_CHECK_VERSION(1, 3, 0) + if (pk_package_get_info (package) == PK_INFO_ENUM_REMOVE || + pk_package_get_info (package) == PK_INFO_ENUM_REMOVING || + pk_package_get_info (package) == PK_INFO_ENUM_OBSOLETE || + pk_package_get_info (package) == PK_INFO_ENUM_OBSOLETING) { + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + } else if (pk_package_get_info (package) == PK_INFO_ENUM_INSTALL || + pk_package_get_info (package) == PK_INFO_ENUM_INSTALLING) { + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + } else { + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + } +#else + if (pk_package_get_info (package) == PK_INFO_ENUM_REMOVING || + pk_package_get_info (package) == PK_INFO_ENUM_OBSOLETING) { + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + } else if (pk_package_get_info (package) == PK_INFO_ENUM_INSTALLING) { + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + } else { + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + } +#endif +} + +static GsApp * +gs_plugin_packagekit_build_update_app (GsPlugin *plugin, PkPackage *package) +{ + GsApp *app = gs_plugin_cache_lookup (plugin, pk_package_get_id (package)); + if (app != NULL) { + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_plugin_packagekit_set_update_app_state (app, package); + return app; + } + app = gs_app_new (NULL); + gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_app_add_source (app, pk_package_get_name (package)); + gs_app_add_source_id (app, pk_package_get_id (package)); + gs_plugin_packagekit_set_package_name (app, package); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, + pk_package_get_name (package)); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, + pk_package_get_summary (package)); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_set_management_plugin (app, plugin); + gs_app_set_update_version (app, pk_package_get_version (package)); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_plugin_packagekit_set_update_app_state (app, package); + gs_plugin_cache_add (plugin, pk_package_get_id (package), app); + return app; +} + +static gboolean +gs_plugin_package_list_updates_process_results (GsPlugin *plugin, + PkResults *results, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GPtrArray) array = NULL; + g_autoptr(GsApp) first_app = NULL; + gboolean all_downloaded = TRUE; + + if (!gs_plugin_packagekit_results_valid (results, cancellable, error)) + return FALSE; + + /* add results */ + array = pk_results_get_package_array (results); + for (guint i = 0; i < array->len; i++) { + PkPackage *package = g_ptr_array_index (array, i); + g_autoptr(GsApp) app = NULL; + guint64 size_download_bytes; + + if (pk_package_get_info (package) == PK_INFO_ENUM_BLOCKED) { + g_debug ("Skipping blocked '%s' in list of packages to update", pk_package_get_id (package)); + continue; + } + + app = gs_plugin_packagekit_build_update_app (plugin, package); + all_downloaded = (all_downloaded && + gs_app_get_size_download (app, &size_download_bytes) == GS_SIZE_TYPE_VALID && + size_download_bytes == 0); + if (all_downloaded && first_app == NULL) + first_app = g_object_ref (app); + gs_app_list_add (list, app); + } + /* Having all packages downloaded doesn't mean the update is also prepared, + because the 'prepared-update' file can be missing, thus verify it and + if not found, then set one application as needed download, to have + the update properly prepared. */ + if (all_downloaded && first_app != NULL) { + g_auto(GStrv) prepared_ids = NULL; + /* It's an overhead to get all the package IDs, but there's no easier + way to verify the prepared-update file exists. */ + prepared_ids = pk_offline_get_prepared_ids (NULL); + if (prepared_ids == NULL || prepared_ids[0] == NULL) + gs_app_set_size_download (first_app, GS_SIZE_TYPE_VALID, 1); + } + + return TRUE; +} + +static gboolean +gs_plugin_packagekit_add_updates (GsPlugin *plugin, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + g_autoptr(PkTask) task_updates = NULL; + g_autoptr(PkResults) results = NULL; + + /* do sync call */ + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING); + + task_updates = gs_packagekit_task_new (plugin); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_updates), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)); + gs_packagekit_helper_set_allow_emit_updates_changed (helper, FALSE); + + results = pk_client_get_updates (PK_CLIENT (task_updates), + pk_bitfield_value (PK_FILTER_ENUM_NONE), + cancellable, + gs_packagekit_helper_cb, helper, + error); + + return gs_plugin_package_list_updates_process_results (plugin, results, list, cancellable, error); +} + +static void +gs_packagekit_list_updates_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(PkResults) results = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (PK_CLIENT (source_object), result, &local_error); + if (!gs_plugin_package_list_updates_process_results (GS_PLUGIN (g_task_get_source_object (task)), results, list, + g_task_get_cancellable (task), &local_error)) { + g_debug ("Failed to get updates: %s", local_error->message); + } + + /* only log about the errors, do not propagate them to the caller */ + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static gboolean +gs_packagekit_add_historical_updates_sync (GsPlugin *plugin, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + guint64 mtime; + guint i; + g_autoptr(GPtrArray) package_array = NULL; + g_autoptr(GError) error_local = NULL; + g_autoptr(GSettings) settings = NULL; + g_autoptr(PkResults) results = NULL; + gboolean is_new_result; + PkExitEnum exit_code; + + /* get the results */ + results = pk_offline_get_results (&error_local); + if (results == NULL) { + /* was any offline update attempted */ + if (g_error_matches (error_local, + PK_OFFLINE_ERROR, + PK_OFFLINE_ERROR_NO_DATA)) { + return TRUE; + } + + gs_plugin_packagekit_error_convert (&error_local, cancellable); + + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "Failed to get offline update results: %s", + error_local->message); + return FALSE; + } + + /* get the mtime of the results */ + mtime = pk_offline_get_results_mtime (error); + if (mtime == 0) { + gs_plugin_packagekit_error_convert (error, cancellable); + return FALSE; + } + + settings = g_settings_new ("org.gnome.software"); + /* Two seconds precision */ + is_new_result = mtime > g_settings_get_uint64 (settings, "packagekit-historical-updates-timestamp") + 2; + if (is_new_result) + g_settings_set_uint64 (settings, "packagekit-historical-updates-timestamp", mtime); + + /* only return results if successful */ + exit_code = pk_results_get_exit_code (results); + if (exit_code != PK_EXIT_ENUM_SUCCESS) { + g_autoptr(PkError) error_code = NULL; + + error_code = pk_results_get_error_code (results); + if (error_code == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "Offline update failed without error_code set"); + return FALSE; + } + + /* Ignore previously shown errors */ + if (!is_new_result) + return TRUE; + + return gs_plugin_packagekit_convert_error (error, + pk_error_get_code (error_code), + pk_error_get_details (error_code), + _("Failed to install updates: ")); + } + + /* distro upgrade? */ + if (pk_results_get_role (results) == PK_ROLE_ENUM_UPGRADE_SYSTEM) { + g_autoptr(GsApp) app = NULL; + + app = gs_app_new (NULL); + gs_app_set_from_unique_id (app, "*/*/*/system/*", AS_COMPONENT_KIND_GENERIC); + gs_app_set_management_plugin (app, plugin); + gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD); + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + gs_app_set_kind (app, AS_COMPONENT_KIND_OPERATING_SYSTEM); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_install_date (app, mtime); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_list_add (list, app); + + return TRUE; + } + + /* get list of package-ids */ + package_array = pk_results_get_package_array (results); + for (i = 0; i < package_array->len; i++) { + PkPackage *pkg = g_ptr_array_index (package_array, i); + const gchar *package_id; + g_autoptr(GsApp) app = NULL; + g_auto(GStrv) split = NULL; + + app = gs_app_new (NULL); + package_id = pk_package_get_id (pkg); + split = g_strsplit (package_id, ";", 4); + gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_plugin_packagekit_set_package_name (app, pkg); + gs_app_add_source (app, split[0]); + gs_app_set_update_version (app, split[1]); + gs_app_set_management_plugin (app, plugin); + gs_app_add_source_id (app, package_id); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_install_date (app, mtime); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_list_add (list, app); + } + return TRUE; +} + +static void +gs_packagekit_list_sources_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(PkResults) results = NULL; + g_autoptr(GPtrArray) array = NULL; + g_autoptr(GError) local_error = NULL; + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (task)); + GsPlugin *plugin = GS_PLUGIN (self); + + results = pk_client_generic_finish (PK_CLIENT (source_object), result, &local_error); + if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (task), &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + locker = g_mutex_locker_new (&self->cached_sources_mutex); + if (self->cached_sources == NULL) + self->cached_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + array = pk_results_get_repo_detail_array (results); + for (guint i = 0; i < array->len; i++) { + g_autoptr(GsApp) app = NULL; + PkRepoDetail *rd = g_ptr_array_index (array, i); + const gchar *id = pk_repo_detail_get_id (rd); + app = g_hash_table_lookup (self->cached_sources, id); + if (app == NULL) { + app = gs_app_new (id); + gs_app_set_management_plugin (app, plugin); + gs_app_set_kind (app, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + gs_app_set_state (app, pk_repo_detail_get_enabled (rd) ? + GS_APP_STATE_INSTALLED : GS_APP_STATE_AVAILABLE); + gs_app_set_name (app, + GS_APP_QUALITY_HIGHEST, + pk_repo_detail_get_description (rd)); + gs_app_set_summary (app, + GS_APP_QUALITY_HIGHEST, + pk_repo_detail_get_description (rd)); + gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_app_set_metadata (app, "GnomeSoftware::SortKey", "300"); + gs_app_set_origin_ui (app, _("Packages")); + g_hash_table_insert (self->cached_sources, g_strdup (id), app); + g_object_weak_ref (G_OBJECT (app), cached_sources_weak_ref_cb, self); + } else { + g_object_ref (app); + /* The repo-related apps are those installed; due to re-using + cached app, make sure the list is populated from fresh data. */ + gs_app_list_remove_all (gs_app_get_related (app)); + } + gs_app_list_add (list, app); + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static void list_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + PkBitfield filter; + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + g_autoptr(PkTask) task_list_apps = NULL; + g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin)); + const gchar *const *provides_files = NULL; + const gchar *provides_tag = NULL; + GsAppQueryProvidesType provides_type = GS_APP_QUERY_PROVIDES_UNKNOWN; + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_historical_update = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_source = GS_APP_QUERY_TRISTATE_UNSET; + gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_list_apps_async); + g_task_set_task_data (task, g_object_ref (helper), g_object_unref); + + if (query != NULL) { + provides_files = gs_app_query_get_provides_files (query); + provides_type = gs_app_query_get_provides (query, &provides_tag); + is_for_update = gs_app_query_get_is_for_update (query); + is_historical_update = gs_app_query_get_is_historical_update (query); + is_source = gs_app_query_get_is_source (query); + } + + /* Currently only support a subset of query properties, and only one set at once. */ + if ((provides_files == NULL && + provides_tag == NULL && + is_for_update == GS_APP_QUERY_TRISTATE_UNSET && + is_historical_update == GS_APP_QUERY_TRISTATE_UNSET && + is_source == GS_APP_QUERY_TRISTATE_UNSET) || + is_for_update == GS_APP_QUERY_TRISTATE_FALSE || + is_historical_update == GS_APP_QUERY_TRISTATE_FALSE || + is_source == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING); + gs_packagekit_helper_set_progress_app (helper, app_dl); + + task_list_apps = gs_packagekit_task_new (plugin); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_list_apps), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, interactive); + + if (provides_files != NULL) { + filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, + PK_FILTER_ENUM_ARCH, + -1); + pk_client_search_files_async (PK_CLIENT (task_list_apps), + filter, + (gchar **) provides_files, + cancellable, + gs_packagekit_helper_cb, helper, + list_apps_cb, g_steal_pointer (&task)); + } else if (provides_type != GS_APP_QUERY_PROVIDES_UNKNOWN) { + const gchar * const provides_tag_strv[2] = { provides_tag, NULL }; + + filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, + PK_FILTER_ENUM_ARCH, + -1); + + pk_client_what_provides_async (PK_CLIENT (task_list_apps), + filter, + (gchar **) provides_tag_strv, + cancellable, + gs_packagekit_helper_cb, helper, + list_apps_cb, g_steal_pointer (&task)); + } else if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE) { + gs_packagekit_helper_set_allow_emit_updates_changed (helper, FALSE); + pk_client_get_updates_async (PK_CLIENT (task_list_apps), + pk_bitfield_value (PK_FILTER_ENUM_NONE), + cancellable, + gs_packagekit_helper_cb, helper, + gs_packagekit_list_updates_cb, g_steal_pointer (&task)); + } else if (is_historical_update == GS_APP_QUERY_TRISTATE_TRUE) { + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GError) local_error = NULL; + if (gs_packagekit_add_historical_updates_sync (plugin, list, cancellable, &local_error)) + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + else + g_task_return_error (task, g_steal_pointer (&local_error)); + } else if (is_source == GS_APP_QUERY_TRISTATE_TRUE) { + /* ask PK for the repo details */ + filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NOT_SOURCE, + PK_FILTER_ENUM_NOT_DEVELOPMENT, + -1); + pk_client_get_repo_list_async (PK_CLIENT (task_list_apps), + filter, + cancellable, + gs_packagekit_helper_cb, helper, + gs_packagekit_list_sources_cb, g_steal_pointer (&task)); + } else { + g_assert_not_reached (); + } +} + +static void +list_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPlugin *plugin = g_task_get_source_object (task); + g_autoptr(PkResults) results = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (client, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (task), &local_error) || + !gs_plugin_packagekit_add_results (plugin, list, results, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + } +} + +static GsAppList * +gs_plugin_packagekit_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static gboolean +plugin_packagekit_pick_rpm_desktop_file_cb (GsPlugin *plugin, + GsApp *app, + const gchar *filename, + GKeyFile *key_file, + gpointer user_data) +{ + return strstr (filename, "/snapd/") == NULL && + strstr (filename, "/snap/") == NULL && + strstr (filename, "/flatpak/") == NULL && + g_key_file_has_group (key_file, "Desktop Entry") && + !g_key_file_has_key (key_file, "Desktop Entry", "X-Flatpak", NULL) && + !g_key_file_has_key (key_file, "Desktop Entry", "X-SnapInstanceName", NULL); +} + +static void +gs_plugin_packagekit_launch_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + gs_plugin_app_launch_filtered_async (plugin, app, flags, + plugin_packagekit_pick_rpm_desktop_file_cb, NULL, + cancellable, + callback, user_data); +} + +static gboolean +gs_plugin_packagekit_launch_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return gs_plugin_app_launch_filtered_finish (plugin, result, error); +} + +static void +gs_plugin_packagekit_invoke_reload (GsPlugin *plugin) +{ + g_autoptr(GsAppList) list = gs_plugin_list_cached (plugin); + guint sz = gs_app_list_length (list); + for (guint i = 0; i < sz; i++) { + GsApp *app = gs_app_list_index (list, i); + /* to ensure the app states are refined */ + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + } + gs_plugin_reload (plugin); +} + +static void +gs_plugin_packagekit_installed_changed_cb (PkControl *control, GsPlugin *plugin) +{ + gs_plugin_packagekit_invoke_reload (plugin); +} + +static void +gs_plugin_packagekit_updates_changed_cb (PkControl *control, GsPlugin *plugin) +{ + gs_plugin_updates_changed (plugin); +} + +static void +gs_plugin_packagekit_repo_list_changed_cb (PkControl *control, GsPlugin *plugin) +{ + gs_plugin_packagekit_invoke_reload (plugin); +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app) +{ + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_PACKAGE && + gs_app_get_scope (app) == AS_COMPONENT_SCOPE_SYSTEM) { + gs_app_set_management_plugin (app, plugin); + gs_plugin_packagekit_set_packaging_format (plugin, app); + return; + } else if (gs_app_get_kind (app) == AS_COMPONENT_KIND_OPERATING_SYSTEM) { + gs_app_set_management_plugin (app, plugin); + } +} + +typedef struct +{ + GsAppList *list; /* (owned) (not nullable) */ + GsPackagekitHelper *progress_data; /* (owned) (not nullable) */ +} ResolvePackagesWithFilterData; + +static void +resolve_packages_with_filter_data_free (ResolvePackagesWithFilterData *data) +{ + g_clear_object (&data->list); + g_clear_object (&data->progress_data); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ResolvePackagesWithFilterData, resolve_packages_with_filter_data_free) + +static void resolve_packages_with_filter_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_resolve_packages_with_filter_async (GsPluginPackagekit *self, + PkClient *client_refine, + GsAppList *list, + PkBitfield filter, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (self); + GPtrArray *sources; + GsApp *app; + const gchar *pkgname; + guint i; + guint j; + g_autoptr(GPtrArray) package_ids = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(ResolvePackagesWithFilterData) data = NULL; + ResolvePackagesWithFilterData *data_unowned; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_resolve_packages_with_filter_async); + data_unowned = data = g_new0 (ResolvePackagesWithFilterData, 1); + data->list = g_object_ref (list); + data->progress_data = gs_packagekit_helper_new (plugin); + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) resolve_packages_with_filter_data_free); + + package_ids = g_ptr_array_new_with_free_func (g_free); + for (i = 0; i < gs_app_list_length (list); i++) { + app = gs_app_list_index (list, i); + sources = gs_app_get_sources (app); + for (j = 0; j < sources->len; j++) { + pkgname = g_ptr_array_index (sources, j); + if (pkgname == NULL || pkgname[0] == '\0') { + g_warning ("invalid pkgname '%s' for %s", + pkgname, + gs_app_get_unique_id (app)); + continue; + } + g_ptr_array_add (package_ids, g_strdup (pkgname)); + } + } + + if (package_ids->len == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + g_ptr_array_add (package_ids, NULL); + + /* resolve them all at once */ + pk_client_resolve_async (client_refine, + filter, + (gchar **) package_ids->pdata, + cancellable, + gs_packagekit_helper_cb, data_unowned->progress_data, + resolve_packages_with_filter_cb, + g_steal_pointer (&task)); +} + +static void +resolve_packages_with_filter_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + ResolvePackagesWithFilterData *data = g_task_get_task_data (task); + GsAppList *list = data->list; + g_autoptr(PkResults) results = NULL; + g_autoptr(GPtrArray) packages = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (client, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + g_prefix_error (&local_error, "failed to resolve package_ids: "); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* get results */ + packages = pk_results_get_package_array (results); + + /* if the user types more characters we'll get cancelled - don't go on + * to mark apps as unavailable because packages->len = 0 */ + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (gs_app_get_local_file (app) != NULL) + continue; + gs_plugin_packagekit_resolve_packages_app (GS_PLUGIN (self), packages, app); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_resolve_packages_with_filter_finish (GsPluginPackagekit *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* + * markdown_to_pango: + * + * Converts markdown text to pango markup which can be used in a + * GtkLabel etc. This function assumes @text is valid markdown. + * + * Returns: pango markup, or %NULL on failure + * + */ +static gchar * +markdown_to_pango (const gchar *text) +{ + g_autoptr(GsMarkdown) markdown = NULL; + + g_return_val_if_fail (text != NULL, NULL); + + /* try to parse */ + markdown = gs_markdown_new (GS_MARKDOWN_OUTPUT_PANGO); + gs_markdown_set_smart_quoting (markdown, FALSE); + gs_markdown_set_autocode (markdown, FALSE); + gs_markdown_set_autolinkify (markdown, FALSE); + + return gs_markdown_parse (markdown, text); +} + +static gboolean +gs_plugin_refine_app_needs_details (GsPluginRefineFlags flags, + GsApp *app) +{ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) > 0 && + gs_app_get_license (app) == NULL) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL) > 0 && + gs_app_get_url (app, AS_URL_KIND_HOMEPAGE) == NULL) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) > 0 && + gs_app_get_size_installed (app, NULL) != GS_SIZE_TYPE_VALID) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) > 0 && + gs_app_get_size_download (app, NULL) != GS_SIZE_TYPE_VALID) + return TRUE; + return FALSE; +} + +static gboolean +gs_plugin_refine_requires_version (GsApp *app, GsPluginRefineFlags flags) +{ + const gchar *tmp; + tmp = gs_app_get_version (app); + if (tmp != NULL) + return FALSE; + return (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION) > 0; +} + +static gboolean +gs_plugin_refine_requires_update_details (GsApp *app, GsPluginRefineFlags flags) +{ + const gchar *tmp; + tmp = gs_app_get_update_details_markup (app); + if (tmp != NULL) + return FALSE; + return (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS) > 0; +} + +static gboolean +gs_plugin_refine_requires_origin (GsApp *app, GsPluginRefineFlags flags) +{ + const gchar *tmp; + tmp = gs_app_get_origin (app); + if (tmp != NULL) + return FALSE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN) > 0) + return TRUE; + return FALSE; +} + +static gboolean +gs_plugin_refine_requires_package_id (GsApp *app, GsPluginRefineFlags flags) +{ + const gchar *tmp; + tmp = gs_app_get_source_id_default (app); + if (tmp != NULL) + return FALSE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) > 0) + return TRUE; + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION) > 0) + return TRUE; + return FALSE; +} + +static gboolean +gs_plugin_packagekit_refine_valid_package_name (const gchar *source) +{ + if (g_strstr_len (source, -1, "/") != NULL) + return FALSE; + return TRUE; +} + +static gboolean +gs_plugin_systemd_update_cache (GsPluginPackagekit *self, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GError) error_local = NULL; + g_auto(GStrv) package_ids = NULL; + g_autoptr(GHashTable) new_prepared_updates = NULL; + g_autoptr(GMutexLocker) locker = NULL; + + /* get new list of package-ids. This loads a local file, so should be + * just about fast enough to be sync. */ + new_prepared_updates = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + package_ids = pk_offline_get_prepared_ids (&error_local); + if (package_ids == NULL) { + if (g_error_matches (error_local, + PK_OFFLINE_ERROR, + PK_OFFLINE_ERROR_NO_DATA)) { + return TRUE; + } + g_debug ("Failed to get prepared IDs: %s", error_local->message); + /* Ignore errors returned here, they are not crucial, the plugin can work without it too */ + return TRUE; + } + + /* Build the new table, stealing all the elements from @package_ids. */ + for (guint i = 0; package_ids[i] != NULL; i++) { + g_hash_table_add (new_prepared_updates, g_steal_pointer (&package_ids[i])); + } + + g_clear_pointer (&package_ids, g_free); + + /* Update the shared state. */ + locker = g_mutex_locker_new (&self->prepared_updates_mutex); + g_clear_pointer (&self->prepared_updates, g_hash_table_unref); + self->prepared_updates = g_steal_pointer (&new_prepared_updates); + + return TRUE; +} + +typedef struct { + /* Track pending operations. */ + guint n_pending_operations; + gboolean completed; + GError *error; /* (nullable) (owned) */ + GPtrArray *progress_datas; /* (element-type GsPackagekitHelper) (owned) (not nullable) */ + PkClient *client_refine; /* (owned) */ + + /* Input data for operations. */ + GsAppList *full_list; /* (nullable) (owned) */ + GsAppList *resolve_list; /* (nullable) (owned) */ + GsApp *app_operating_system; /* (nullable) (owned) */ + GsAppList *update_details_list; /* (nullable) (owned) */ + GsAppList *details_list; /* (nullable) (owned) */ +} RefineData; + +static void +refine_data_free (RefineData *data) +{ + g_assert (data->n_pending_operations == 0); + g_assert (data->completed); + + g_clear_error (&data->error); + g_clear_pointer (&data->progress_datas, g_ptr_array_unref); + g_clear_object (&data->client_refine); + g_clear_object (&data->full_list); + g_clear_object (&data->resolve_list); + g_clear_object (&data->app_operating_system); + g_clear_object (&data->update_details_list); + g_clear_object (&data->details_list); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (RefineData, refine_data_free) + +/* Add @helper to the list of progress data closures to free when the + * #RefineData is freed. This means it can be reliably used, 0 or more times, + * by the async operation up until the operation is finished. */ +static GsPackagekitHelper * +refine_task_add_progress_data (GTask *refine_task, + GsPackagekitHelper *helper) +{ + RefineData *data = g_task_get_task_data (refine_task); + + g_ptr_array_add (data->progress_datas, g_object_ref (helper)); + + return helper; +} + +static GTask * +refine_task_add_operation (GTask *refine_task) +{ + RefineData *data = g_task_get_task_data (refine_task); + + g_assert (!data->completed); + data->n_pending_operations++; + + return g_object_ref (refine_task); +} + +static void +refine_task_complete_operation (GTask *refine_task) +{ + RefineData *data = g_task_get_task_data (refine_task); + + g_assert (data->n_pending_operations > 0); + data->n_pending_operations--; + + /* Have all operations completed? */ + if (data->n_pending_operations == 0) { + g_assert (!data->completed); + data->completed = TRUE; + + if (data->error != NULL) + g_task_return_error (refine_task, g_steal_pointer (&data->error)); + else + g_task_return_boolean (refine_task, TRUE); + } +} + +static void +refine_task_complete_operation_with_error (GTask *refine_task, + GError *error /* (transfer full) */) +{ + RefineData *data = g_task_get_task_data (refine_task); + g_autoptr(GError) owned_error = g_steal_pointer (&error); + + /* Multiple operations might fail. Just take the first error. */ + if (data->error == NULL) + data->error = g_steal_pointer (&owned_error); + + refine_task_complete_operation (refine_task); +} + +typedef struct { + GTask *refine_task; /* (owned) (not nullable) */ + GsApp *app; /* (owned) (nullable) for single file query */ + GHashTable *source_to_app; /* (owned) (nullable) for multifile query */ + guint n_expected_results; +} SearchFilesData; + +static void +search_files_data_free (SearchFilesData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->refine_task); + g_clear_pointer (&data->source_to_app, g_hash_table_unref); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (SearchFilesData, search_files_data_free) + +static SearchFilesData * +search_files_data_new_operation (GTask *refine_task, + GsApp *app, + GHashTable *source_to_app, + guint n_expected_results) +{ + g_autoptr(SearchFilesData) data = g_new0 (SearchFilesData, 1); + g_assert ((app != NULL && source_to_app == NULL) || + (app == NULL && source_to_app != NULL)); + data->refine_task = refine_task_add_operation (refine_task); + if (app) { + data->app = g_object_ref (app); + } else { + data->source_to_app = g_hash_table_ref (source_to_app); + data->n_expected_results = n_expected_results; + } + + return g_steal_pointer (&data); +} + +typedef struct { + GTask *refine_task; /* (owned) (not nullable) */ + GsAppList *sources; /* (owned) (not nullable) */ +} SourcesRelatedData; + +static void +sources_related_data_free (SourcesRelatedData *data) +{ + g_clear_object (&data->sources); + g_clear_object (&data->refine_task); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (SourcesRelatedData, sources_related_data_free) + +static SourcesRelatedData * +sources_related_data_new_operation (GTask *refine_task, + GsAppList *sources) +{ + g_autoptr(SourcesRelatedData) data = g_new0 (SourcesRelatedData, 1); + data->refine_task = refine_task_add_operation (refine_task); + data->sources = g_object_ref (sources); + + return g_steal_pointer (&data); +} + +static void upgrade_system_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void resolve_all_packages_with_filter_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void search_files_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void get_update_detail_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void get_details_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void get_updates_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void refine_all_history_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void sources_related_got_installed_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void +gs_plugin_packagekit_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin); + g_autoptr(GHashTable) resolve_list_apps = g_hash_table_new (NULL, NULL); + g_autoptr(GsAppList) resolve_list = gs_app_list_new (); + g_autoptr(GsAppList) update_details_list = gs_app_list_new (); + g_autoptr(GsAppList) details_list = gs_app_list_new (); + g_autoptr(GsAppList) history_list = gs_app_list_new (); + g_autoptr(GsAppList) repos_list = gs_app_list_new (); + g_autoptr(GTask) task = NULL; + g_autoptr(RefineData) data = NULL; + RefineData *data_unowned = NULL; + g_autoptr(GError) local_error = NULL; + guint n_considered = 0; + + /* Searches for multiple files are broken for PackageKit’s apt backend + * in 1.2.6 and earlier. + * See https://github.com/PackageKit/PackageKit/pull/649 */ +#if PK_CHECK_VERSION(1, 2, 7) + gboolean is_pk_apt_backend_broken = FALSE; +#else + gboolean is_pk_apt_backend_broken = TRUE; +#endif + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_refine_async); + data_unowned = data = g_new0 (RefineData, 1); + data->full_list = g_object_ref (list); + data->n_pending_operations = 1; /* to prevent the task being completed before all operations have been started */ + data->progress_datas = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + data->client_refine = pk_client_new (); + pk_client_set_interactive (data->client_refine, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)); + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) refine_data_free); + + /* Process the @list and work out what information is needed for each + * app. */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + GPtrArray *sources; + const gchar *filename; + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + + if (!gs_app_has_management_plugin (app, NULL) && + !gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + n_considered++; + + /* Repositories */ + filename = gs_app_get_metadata_item (app, "repos::repo-filename"); + + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY && + filename != NULL) { + gs_app_list_add (repos_list, app); + } + + /* Apps */ + sources = gs_app_get_sources (app); + + if (sources->len > 0 && + gs_plugin_packagekit_refine_valid_package_name (g_ptr_array_index (sources, 0)) && + (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN || + gs_plugin_refine_requires_package_id (app, flags) || + gs_plugin_refine_requires_origin (app, flags) || + gs_plugin_refine_requires_version (app, flags))) { + g_hash_table_add (resolve_list_apps, app); + gs_app_list_add (resolve_list, app); + } + + if ((gs_app_get_state (app) == GS_APP_STATE_UPDATABLE || + gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) && + gs_app_get_source_id_default (app) != NULL && + gs_plugin_refine_requires_update_details (app, flags)) { + gs_app_list_add (update_details_list, app); + } + + if (gs_app_get_source_id_default (app) != NULL && + gs_plugin_refine_app_needs_details (flags, app)) { + gs_app_list_add (details_list, app); + } + + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY) != 0 && + sources->len > 0 && + gs_app_get_install_date (app) == 0) { + gs_app_list_add (history_list, app); + } + } + + /* Add sources' related apps only when refining sources and nothing else */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED) != 0 && + n_considered > 0 && gs_app_list_length (repos_list) == n_considered) { + PkBitfield filter; + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + + filter = pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, + PK_FILTER_ENUM_NEWEST, + PK_FILTER_ENUM_ARCH, + PK_FILTER_ENUM_NOT_COLLECTIONS, + -1); + + pk_client_get_packages_async (data_unowned->client_refine, + filter, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper), + sources_related_got_installed_cb, + sources_related_data_new_operation (task, repos_list)); + + } + + /* re-read /var/lib/PackageKit/prepared-update so we know what packages + * to mark as already downloaded and prepared for offline updates */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) && + !gs_plugin_systemd_update_cache (self, cancellable, &local_error)) { + refine_task_complete_operation_with_error (task, g_steal_pointer (&local_error)); + return; + } + + /* when we need the cannot-be-upgraded applications, we implement this + * by doing a UpgradeSystem(SIMULATE) which adds the removed packages + * to the related-apps list with a state of %GS_APP_STATE_UNAVAILABLE */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPGRADE_REMOVED) { + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + guint cache_age_save; + + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_OPERATING_SYSTEM) + continue; + + gs_packagekit_helper_add_app (helper, app); + + /* Expose the @app to the callback functions so that + * upgrade packages can be added as related. This only + * supports one OS. */ + g_assert (data_unowned->app_operating_system == NULL); + data_unowned->app_operating_system = g_object_ref (app); + + /* ask PK to simulate upgrading the system */ + cache_age_save = pk_client_get_cache_age (data_unowned->client_refine); + pk_client_set_cache_age (data_unowned->client_refine, 60 * 60 * 24 * 7); /* once per week */ + pk_client_set_interactive (data_unowned->client_refine, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)); + pk_client_upgrade_system_async (data_unowned->client_refine, + pk_bitfield_from_enums (PK_TRANSACTION_FLAG_ENUM_SIMULATE, -1), + gs_app_get_version (app), + PK_UPGRADE_KIND_ENUM_COMPLETE, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper), + upgrade_system_cb, + refine_task_add_operation (task)); + pk_client_set_cache_age (data_unowned->client_refine, cache_age_save); + + /* Only support one operating system. */ + break; + } + } + + /* can we resolve in one go? */ + if (gs_app_list_length (resolve_list) > 0) { + PkBitfield filter; + + /* Expose the @resolve_list to the callback functions in case a + * second attempt is needed. */ + g_assert (data_unowned->resolve_list == NULL); + data_unowned->resolve_list = g_object_ref (resolve_list); + + /* first, try to resolve packages with ARCH filter */ + filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, + PK_FILTER_ENUM_ARCH, + -1); + + gs_plugin_packagekit_resolve_packages_with_filter_async (self, + data_unowned->client_refine, + resolve_list, + filter, + cancellable, + resolve_all_packages_with_filter_cb, + refine_task_add_operation (task)); + } + + /* set the package-id for an installed desktop file */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION) != 0) { + g_autoptr(GPtrArray) to_array = g_ptr_array_new_with_free_func (g_free); + g_autoptr(GHashTable) source_to_app = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + g_autoptr(GsPackagekitHelper) helper = NULL; + for (guint i = 0; i < gs_app_list_length (list); i++) { + g_autofree gchar *fn = NULL; + GsApp *app = gs_app_list_index (list, i); + GPtrArray *sources; + const gchar *tmp; + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + if (gs_app_get_source_id_default (app) != NULL) + continue; + if (!gs_app_has_management_plugin (app, NULL) && + !gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + tmp = gs_app_get_id (app); + if (tmp == NULL) + continue; + /* The information will be added within the resolve_list operation */ + if (g_hash_table_contains (resolve_list_apps, app)) + continue; + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + fn = g_strdup_printf ("/usr/share/applications/%s", tmp); + break; + case AS_COMPONENT_KIND_ADDON: + fn = g_strdup_printf ("/usr/share/metainfo/%s.metainfo.xml", tmp); + if (!g_file_test (fn, G_FILE_TEST_EXISTS)) { + g_free (fn); + fn = g_strdup_printf ("/usr/share/appdata/%s.metainfo.xml", tmp); + } + break; + default: + break; + } + if (fn == NULL) + continue; + if (!g_file_test (fn, G_FILE_TEST_EXISTS)) { + g_debug ("ignoring %s as does not exist", fn); + continue; + } + + sources = gs_app_get_sources (app); + if (!is_pk_apt_backend_broken && sources->len > 0) { + /* do a batch query and match by the source (aka package name), if available */ + g_ptr_array_add (to_array, g_strdup (fn)); + if (helper == NULL) + helper = gs_packagekit_helper_new (plugin); + gs_packagekit_helper_add_app (helper, app); + + for (guint jj = 0; jj < sources->len; jj++) { + const gchar *source = g_ptr_array_index (sources, jj); + g_hash_table_insert (source_to_app, g_strdup (source), g_object_ref (app)); + } + } else { + /* otherwise do a query with a single file only */ + const gchar *single_array[] = { NULL, NULL }; + g_autoptr(GsPackagekitHelper) single_helper = NULL; + single_array[0] = fn; + single_helper = gs_packagekit_helper_new (plugin); + gs_packagekit_helper_add_app (single_helper, app); + pk_client_search_files_async (data_unowned->client_refine, + pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, -1), + (gchar **) single_array, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, single_helper), + search_files_cb, + search_files_data_new_operation (task, app, NULL, 0)); + } + } + if (to_array->len > 0) { + g_ptr_array_add (to_array, NULL); + pk_client_search_files_async (data_unowned->client_refine, + pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, -1), + (gchar **) to_array->pdata, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper), + search_files_cb, + search_files_data_new_operation (task, NULL, source_to_app, to_array->len - 1)); + } + } + + /* Refine repo package names */ + if (gs_app_list_length (repos_list) > 0) { + g_autoptr(GPtrArray) to_array = g_ptr_array_new_full (gs_app_list_length (repos_list) + 1, g_free); + g_autoptr(GHashTable) source_to_app = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + for (guint i = 0; i < gs_app_list_length (repos_list); i++) { + GsApp *app = gs_app_list_index (repos_list, i); + GPtrArray *sources; + const gchar *filename; + + /* The information will be added within the resolve_list operation */ + if (g_hash_table_contains (resolve_list_apps, app)) + continue; + + filename = gs_app_get_metadata_item (app, "repos::repo-filename"); + + sources = gs_app_get_sources (app); + if (!is_pk_apt_backend_broken && sources->len > 0) { + /* do a batch query and match by the source (aka package name), if available */ + g_ptr_array_add (to_array, g_strdup (filename)); + gs_packagekit_helper_add_app (helper, app); + + for (guint jj = 0; jj < sources->len; jj++) { + const gchar *source = g_ptr_array_index (sources, jj); + g_hash_table_insert (source_to_app, g_strdup (source), g_object_ref (app)); + } + } else { + /* otherwise do a query with a single file only */ + const gchar *single_array[] = { NULL, NULL }; + g_autoptr(GsPackagekitHelper) single_helper = NULL; + single_array[0] = filename; + single_helper = gs_packagekit_helper_new (plugin); + gs_packagekit_helper_add_app (single_helper, app); + pk_client_search_files_async (data_unowned->client_refine, + pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, -1), + (gchar **) single_array, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, single_helper), + search_files_cb, + search_files_data_new_operation (task, app, NULL, 0)); + } + } + + if (to_array->len > 0) { + g_ptr_array_add (to_array, NULL); + + pk_client_search_files_async (data_unowned->client_refine, + pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, -1), + (gchar **) to_array->pdata, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper), + search_files_cb, + search_files_data_new_operation (task, NULL, source_to_app, to_array->len - 1)); + } + } + + /* any update details missing? */ + if (gs_app_list_length (update_details_list) > 0) { + GsApp *app; + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + g_autofree const gchar **package_ids = NULL; + + /* Expose the @update_details_list to the callback functions so + * its apps can be updated. */ + g_assert (data_unowned->update_details_list == NULL); + data_unowned->update_details_list = g_object_ref (update_details_list); + + package_ids = g_new0 (const gchar *, gs_app_list_length (update_details_list) + 1); + for (guint i = 0; i < gs_app_list_length (update_details_list); i++) { + app = gs_app_list_index (update_details_list, i); + package_ids[i] = gs_app_get_source_id_default (app); + g_assert (package_ids[i] != NULL); /* checked when update_details_list is built */ + } + + /* get any update details */ + pk_client_get_update_detail_async (data_unowned->client_refine, + (gchar **) package_ids, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper), + get_update_detail_cb, + refine_task_add_operation (task)); + } + + /* any package details missing? */ + if (gs_app_list_length (details_list) > 0) { + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + g_autoptr(GPtrArray) package_ids = NULL; + + /* Expose the @details_list to the callback functions so + * its apps can be updated. */ + g_assert (data_unowned->details_list == NULL); + data_unowned->details_list = g_object_ref (details_list); + + package_ids = app_list_get_package_ids (details_list, NULL, FALSE); + + if (package_ids->len > 0) { + /* NULL-terminate the array */ + g_ptr_array_add (package_ids, NULL); + + #if PK_CHECK_VERSION (1, 2, 7) + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) != 0) + pk_client_set_details_with_deps_size (data_unowned->client_refine, TRUE); + #endif + + /* get any details */ + pk_client_get_details_async (data_unowned->client_refine, + (gchar **) package_ids->pdata, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper), + get_details_cb, + refine_task_add_operation (task)); + } + } + + /* get the update severity */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY) != 0) { + PkBitfield filter; + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + + gs_packagekit_helper_set_allow_emit_updates_changed (helper, FALSE); + + /* get the list of updates */ + filter = pk_bitfield_value (PK_FILTER_ENUM_NONE); + pk_client_get_updates_async (data_unowned->client_refine, + filter, + cancellable, + gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper), + get_updates_cb, + refine_task_add_operation (task)); + } + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) + continue; + + /* the scope is always system-wide */ + if (gs_app_get_scope (app) == AS_COMPONENT_SCOPE_UNKNOWN) + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_UNKNOWN) + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + } + + /* add any missing history data */ + if (gs_app_list_length (history_list) > 0) { + gs_plugin_packagekit_refine_history_async (self, + history_list, + cancellable, + refine_all_history_cb, + refine_task_add_operation (task)); + } + + /* Mark the operation to set up all the other operations as completed. + * The @refine_task will now be completed once all the async operations + * have completed, and the task callback invoked. */ + refine_task_complete_operation (task); +} + +static void +upgrade_system_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(GTask) refine_task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (refine_task)); + RefineData *data = g_task_get_task_data (refine_task); + g_autoptr(PkResults) results = NULL; + g_autoptr(GsAppList) results_list = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (client, result, &local_error); + if (!gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (refine_task), &local_error)) { + g_prefix_error (&local_error, "failed to refine distro upgrade: "); + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + results_list = gs_app_list_new (); + if (!gs_plugin_packagekit_add_results (GS_PLUGIN (self), results_list, results, &local_error)) { + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + /* add each of these as related applications */ + for (guint j = 0; j < gs_app_list_length (results_list); j++) { + GsApp *app2 = gs_app_list_index (results_list, j); + if (gs_app_get_state (app2) != GS_APP_STATE_UNAVAILABLE) + continue; + gs_app_add_related (data->app_operating_system, app2); + } + + refine_task_complete_operation (refine_task); +} + +static void +sources_related_got_installed_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(SourcesRelatedData) sources_related_data = g_steal_pointer (&user_data); + GTask *refine_task = sources_related_data->refine_task; + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (refine_task)); + g_autoptr(GHashTable) sources_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + g_autoptr(PkResults) results = NULL; + g_autoptr(GsAppList) installed = gs_app_list_new (); + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (client, result, &local_error); + if (!gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (refine_task), &local_error)) { + g_prefix_error (&local_error, "failed to get sources related: "); + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + if (!gs_plugin_packagekit_add_results (GS_PLUGIN (self), installed, results, &local_error)) { + g_prefix_error (&local_error, "failed to read results for sources related: "); + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (sources_related_data->sources); i++) { + GsApp *app = gs_app_list_index (sources_related_data->sources, i); + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD) || + gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY || + gs_app_get_id (app) == NULL) + continue; + + if (!gs_app_has_management_plugin (app, NULL) && + !gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + g_hash_table_insert (sources_hash, g_strdup (gs_app_get_id (app)), app); + } + + for (guint i = 0; i < gs_app_list_length (installed); i++) { + g_auto(GStrv) split = NULL; + GsApp *app = gs_app_list_index (installed, i); + split = pk_package_id_split (gs_app_get_source_id_default (app)); + if (split == NULL) { + g_set_error (&local_error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "invalid package-id: %s", + gs_app_get_source_id_default (app)); + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + if (g_str_has_prefix (split[PK_PACKAGE_ID_DATA], "installed:")) { + const gchar *id = split[PK_PACKAGE_ID_DATA] + 10; + GsApp *app_tmp = g_hash_table_lookup (sources_hash, id); + if (app_tmp != NULL) { + g_debug ("found package %s from %s", + gs_app_get_source_default (app), id); + gs_app_add_related (app_tmp, app); + } + } + } + + refine_task_complete_operation (refine_task); +} + +static gboolean +gs_plugin_packagekit_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void resolve_all_packages_with_filter_cb2 (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +resolve_all_packages_with_filter_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (source_object); + g_autoptr(GTask) refine_task = g_steal_pointer (&user_data); + RefineData *data = g_task_get_task_data (refine_task); + GCancellable *cancellable = g_task_get_cancellable (refine_task); + GsAppList *resolve_list = data->resolve_list; + g_autoptr(GsAppList) resolve2_list = NULL; + PkBitfield filter; + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_packagekit_resolve_packages_with_filter_finish (self, + result, + &local_error)) { + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + /* if any packages remaining in UNKNOWN state, try to resolve them again, + * but this time without ARCH filter */ + resolve2_list = gs_app_list_new (); + for (guint i = 0; i < gs_app_list_length (resolve_list); i++) { + GsApp *app = gs_app_list_index (resolve_list, i); + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_list_add (resolve2_list, app); + } + filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, + PK_FILTER_ENUM_NOT_ARCH, + PK_FILTER_ENUM_NOT_SOURCE, + -1); + + gs_plugin_packagekit_resolve_packages_with_filter_async (self, + data->client_refine, + resolve2_list, + filter, + cancellable, + resolve_all_packages_with_filter_cb2, + g_steal_pointer (&refine_task)); +} + +static void +resolve_all_packages_with_filter_cb2 (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (source_object); + g_autoptr(GTask) refine_task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_packagekit_resolve_packages_with_filter_finish (self, + result, + &local_error)) { + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + refine_task_complete_operation (refine_task); +} + +static void +search_files_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(SearchFilesData) search_files_data = g_steal_pointer (&user_data); + GTask *refine_task = search_files_data->refine_task; + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (refine_task)); + g_autoptr(PkResults) results = NULL; + g_autoptr(GPtrArray) packages = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (client, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (refine_task), &local_error)) { + g_prefix_error_literal (&local_error, "failed to search files: "); + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + /* get results */ + packages = pk_results_get_package_array (results); + if (search_files_data->app != NULL) { + if (packages->len == 1) { + PkPackage *package; + package = g_ptr_array_index (packages, 0); + gs_plugin_packagekit_set_metadata_from_package (GS_PLUGIN (self), search_files_data->app, package); + } else { + g_debug ("%s: Failed to find one package for %s, [%u]", G_STRFUNC, + gs_app_get_id (search_files_data->app), packages->len); + + } + } else { + for (guint ii = 0; ii < packages->len; ii++) { + PkPackage *package = g_ptr_array_index (packages, ii); + GsApp *app; + if (pk_package_get_name (package) == NULL) + continue; + app = g_hash_table_lookup (search_files_data->source_to_app, pk_package_get_name (package)); + if (app != NULL) + gs_plugin_packagekit_set_metadata_from_package (GS_PLUGIN (self), app, package); + else + g_debug ("%s: Failed to find app for package id '%s'", G_STRFUNC, pk_package_get_id (package)); + } + + if (packages->len != search_files_data->n_expected_results) { + g_debug ("%s: Failed to find package data for each of %u apps, received %u packages instead", + G_STRFUNC, search_files_data->n_expected_results, packages->len); + } else { + g_debug ("%s: Received package data for all %u apps", G_STRFUNC, packages->len); + } + } + + refine_task_complete_operation (refine_task); +} + +static void +get_update_detail_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(GTask) refine_task = g_steal_pointer (&user_data); + GsPlugin *plugin = GS_PLUGIN (g_task_get_source_object (refine_task)); + RefineData *data = g_task_get_task_data (refine_task); + g_autoptr(PkResults) results = NULL; + g_autoptr(GPtrArray) array = NULL; + g_autoptr(GError) local_error = NULL; + gboolean is_markdown_desc; + + results = pk_client_generic_finish (client, result, &local_error); + if (!gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (refine_task), &local_error)) { + g_prefix_error (&local_error, "failed to get update details: "); + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + /* + * Only Fedora and RHEL (PackageKit DNF backend) are known to + * provide update descriptions in markdown format. Other + * distros if any should be added below in future. For more + * details, refer: + * + * - https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2621 + * - https://github.com/PackageKit/PackageKit/issues/828 + * + */ + is_markdown_desc = (gs_plugin_check_distro_id (plugin, "fedora") || + gs_plugin_check_distro_id (plugin, "rhel")); + + /* set the update details for the update */ + array = pk_results_get_update_detail_array (results); + for (guint j = 0; j < gs_app_list_length (data->update_details_list); j++) { + GsApp *app = gs_app_list_index (data->update_details_list, j); + const gchar *package_id = gs_app_get_source_id_default (app); + + for (guint i = 0; i < array->len; i++) { + const gchar *tmp; + PkUpdateDetail *update_detail; + g_autofree gchar *pango_desc = NULL; + + /* right package? */ + update_detail = g_ptr_array_index (array, i); + if (g_strcmp0 (package_id, pk_update_detail_get_package_id (update_detail)) != 0) + continue; + tmp = pk_update_detail_get_update_text (update_detail); + if (tmp == NULL || *tmp == '\0') + break; + + if (is_markdown_desc) + pango_desc = markdown_to_pango (tmp); + + if (pango_desc != NULL && *pango_desc != '\0') + gs_app_set_update_details_markup (app, pango_desc); + else + gs_app_set_update_details_text (app, tmp); + } + } + + refine_task_complete_operation (refine_task); +} + +static void +get_details_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(GTask) refine_task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (refine_task)); + RefineData *data = g_task_get_task_data (refine_task); + g_autoptr(GPtrArray) array = NULL; + g_autoptr(PkResults) results = NULL; + g_autoptr(GHashTable) details_collection = NULL; + g_autoptr(GHashTable) prepared_updates = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (client, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (refine_task), &local_error)) { + g_autoptr(GPtrArray) package_ids = app_list_get_package_ids (data->details_list, NULL, FALSE); + g_autofree gchar *package_ids_str = NULL; + /* NULL-terminate the array */ + g_ptr_array_add (package_ids, NULL); + package_ids_str = g_strjoinv (",", (gchar **) package_ids->pdata); + g_prefix_error (&local_error, "failed to get details for %s: ", + package_ids_str); + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + /* get the results and copy them into a hash table for fast lookups: + * there are typically 400 to 700 elements in @array, and 100 to 200 + * elements in @list, each with 1 or 2 source IDs to look up (but + * sometimes 200) */ + array = pk_results_get_details_array (results); + details_collection = gs_plugin_packagekit_details_array_to_hash (array); + + /* set the update details for the update */ + g_mutex_lock (&self->prepared_updates_mutex); + prepared_updates = g_hash_table_ref (self->prepared_updates); + g_mutex_unlock (&self->prepared_updates_mutex); + + for (guint i = 0; i < gs_app_list_length (data->details_list); i++) { + GsApp *app = gs_app_list_index (data->details_list, i); + gs_plugin_packagekit_refine_details_app (GS_PLUGIN (self), details_collection, prepared_updates, app); + } + + refine_task_complete_operation (refine_task); +} + +static void +get_updates_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(GTask) refine_task = g_steal_pointer (&user_data); + RefineData *data = g_task_get_task_data (refine_task); + g_autoptr(PkPackageSack) sack = NULL; + g_autoptr(PkResults) results = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (client, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (refine_task), &local_error)) { + g_prefix_error (&local_error, "failed to get updates for urgency: "); + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + /* set the update severity for the app */ + sack = pk_results_get_package_sack (results); + for (guint i = 0; i < gs_app_list_length (data->full_list); i++) { + g_autoptr(PkPackage) pkg = NULL; + const gchar *package_id; + GsApp *app = gs_app_list_index (data->full_list, i); + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + package_id = gs_app_get_source_id_default (app); + if (package_id == NULL) + continue; + pkg = pk_package_sack_find_by_id (sack, package_id); + if (pkg == NULL) + continue; + switch (pk_package_get_update_severity (pkg)) { + case PK_INFO_ENUM_LOW: + gs_app_set_update_urgency (app, AS_URGENCY_KIND_LOW); + break; + case PK_INFO_ENUM_NORMAL: + gs_app_set_update_urgency (app, AS_URGENCY_KIND_MEDIUM); + break; + case PK_INFO_ENUM_IMPORTANT: + gs_app_set_update_urgency (app, AS_URGENCY_KIND_HIGH); + break; + case PK_INFO_ENUM_CRITICAL: + gs_app_set_update_urgency (app, AS_URGENCY_KIND_CRITICAL); + break; + default: + gs_app_set_update_urgency (app, AS_URGENCY_KIND_UNKNOWN); + break; + } + } + + refine_task_complete_operation (refine_task); +} + +static void +refine_all_history_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (source_object); + g_autoptr(GTask) refine_task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_packagekit_refine_history_finish (self, result, &local_error)) { + refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error)); + return; + } + + refine_task_complete_operation (refine_task); +} + +static void +gs_plugin_packagekit_refine_add_history (GsApp *app, GVariant *dict) +{ + const gchar *version; + gboolean ret; + guint64 timestamp; + PkInfoEnum info_enum; + g_autoptr(GsApp) history = NULL; + + /* create new history item with same ID as parent */ + history = gs_app_new (gs_app_get_id (app)); + gs_app_set_kind (history, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_name (history, GS_APP_QUALITY_NORMAL, gs_app_get_name (app)); + + /* get the installed state */ + ret = g_variant_lookup (dict, "info", "u", &info_enum); + g_assert (ret); + switch (info_enum) { + case PK_INFO_ENUM_INSTALLING: + gs_app_set_state (history, GS_APP_STATE_INSTALLED); + break; + case PK_INFO_ENUM_REMOVING: + gs_app_set_state (history, GS_APP_STATE_AVAILABLE); + break; + case PK_INFO_ENUM_UPDATING: + gs_app_set_state (history, GS_APP_STATE_UPDATABLE); + break; + default: + g_debug ("ignoring history kind: %s", + pk_info_enum_to_string (info_enum)); + return; + } + + /* set the history time and date */ + ret = g_variant_lookup (dict, "timestamp", "t", ×tamp); + g_assert (ret); + gs_app_set_install_date (history, timestamp); + + /* set the history version number */ + ret = g_variant_lookup (dict, "version", "&s", &version); + g_assert (ret); + gs_app_set_version (history, version); + + /* add the package to the main application */ + gs_app_add_history (app, history); + + /* use the last event as approximation of the package timestamp */ + gs_app_set_install_date (app, timestamp); +} + +/* Run in the main thread. */ +static void +gs_plugin_packagekit_permission_cb (GPermission *permission, + GParamSpec *pspec, + gpointer data) +{ + GsPlugin *plugin = GS_PLUGIN (data); + gboolean ret = g_permission_get_allowed (permission) || + g_permission_get_can_acquire (permission); + gs_plugin_set_allow_updates (plugin, ret); +} + +static void gs_plugin_packagekit_download_async (GsPluginPackagekit *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean gs_plugin_packagekit_download_finish (GsPluginPackagekit *self, + GAsyncResult *result, + GError **error); + +static void +async_result_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **result_out = user_data; + + g_assert (result_out != NULL && *result_out == NULL); + *result_out = g_object_ref (result); + g_main_context_wakeup (g_main_context_get_thread_default ()); +} + +static void +gs_plugin_packagekit_auto_prepare_update_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (source_object); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + gboolean interactive = gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE); + + list = gs_app_list_new (); + if (!gs_plugin_packagekit_add_updates (GS_PLUGIN (self), list, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (gs_app_list_length (list) > 0) { + g_autoptr(GMainContext) context = g_main_context_new (); + g_autoptr(GMainContextPusher) pusher = g_main_context_pusher_new (context); + g_autoptr(GAsyncResult) result = NULL; + + gs_plugin_packagekit_download_async (self, list, interactive, cancellable, async_result_cb, &result); + while (result == NULL) + g_main_context_iteration (context, TRUE); + + if (!gs_plugin_packagekit_download_finish (self, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + /* Ignore errors here */ + gs_plugin_systemd_update_cache (self, cancellable, NULL); + + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_packagekit_auto_prepare_update_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GError) local_error = NULL; + + if (g_task_propagate_boolean (G_TASK (result), &local_error)) { + g_debug ("Successfully auto-prepared update"); + gs_plugin_updates_changed (GS_PLUGIN (source_object)); + } else { + g_debug ("Failed to auto-prepare update: %s", local_error->message); + } +} + +static gboolean +gs_plugin_packagekit_run_prepare_update_cb (gpointer user_data) +{ + GsPluginPackagekit *self = user_data; + g_autoptr(GTask) task = NULL; + + self->prepare_update_timeout_id = 0; + + g_debug ("Going to auto-prepare update"); + task = g_task_new (self, self->proxy_settings_cancellable, gs_plugin_packagekit_auto_prepare_update_cb, NULL); + g_task_set_source_tag (task, gs_plugin_packagekit_run_prepare_update_cb); + g_task_run_in_thread (task, gs_plugin_packagekit_auto_prepare_update_thread); + return G_SOURCE_REMOVE; +} + +/* Run in the main thread. */ +static void +gs_plugin_packagekit_prepared_update_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (user_data); + + /* Interested only in these events. */ + if (event_type != G_FILE_MONITOR_EVENT_CHANGED && + event_type != G_FILE_MONITOR_EVENT_DELETED && + event_type != G_FILE_MONITOR_EVENT_CREATED) + return; + + /* This is going to break, if PackageKit renames the file, but it's unlikely to happen; + there is no API to get the file name from, sadly. */ + if (g_file_peek_path (file) == NULL || + !g_str_has_suffix (g_file_peek_path (file), "prepared-update")) + return; + + if (event_type == G_FILE_MONITOR_EVENT_DELETED) { + g_autoptr(GSettings) settings = g_settings_new ("org.gnome.software"); + if (g_settings_get_boolean (settings, "download-updates")) { + /* The prepared-update file had been removed, but the user has set + to have the updates downloaded, thus prepared, thus prepare + the update again. */ + if (self->prepare_update_timeout_id) + g_source_remove (self->prepare_update_timeout_id); + g_debug ("Scheduled to auto-prepare update in %d s", PREPARE_UPDATE_TIMEOUT_SECS); + self->prepare_update_timeout_id = g_timeout_add_seconds (PREPARE_UPDATE_TIMEOUT_SECS, + gs_plugin_packagekit_run_prepare_update_cb, self); + } else { + if (self->prepare_update_timeout_id) { + g_source_remove (self->prepare_update_timeout_id); + self->prepare_update_timeout_id = 0; + g_debug ("Cancelled auto-prepare update"); + } + } + } else if (self->prepare_update_timeout_id) { + g_source_remove (self->prepare_update_timeout_id); + self->prepare_update_timeout_id = 0; + g_debug ("Cancelled auto-prepare update"); + } + + /* update UI */ + gs_plugin_systemd_update_cache (self, NULL, NULL); + gs_plugin_updates_changed (GS_PLUGIN (self)); +} + +static void +gs_plugin_packagekit_refresh_is_triggered (GsPluginPackagekit *self, + GCancellable *cancellable) +{ + g_autoptr(GFile) file_trigger = NULL; + file_trigger = g_file_new_for_path ("/system-update"); + self->is_triggered = g_file_query_exists (file_trigger, NULL); + g_debug ("offline trigger is now %s", + self->is_triggered ? "enabled" : "disabled"); +} + +/* Run in the main thread. */ +static void +gs_plugin_systemd_trigger_changed_cb (GFileMonitor *monitor, + GFile *file, GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (user_data); + + gs_plugin_packagekit_refresh_is_triggered (self, NULL); +} + +static void setup_proxy_settings_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void get_offline_update_permission_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_get_properties_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkControl *control = PK_CONTROL (source_object); + g_autoptr(GError) error = NULL; + + if (pk_control_get_properties_finish (control, result, &error)) { + guint32 major, minor, micro; + g_autoptr(GString) string = g_string_new (NULL); + + g_object_get (control, + "version_major", &major, + "version_minor", &minor, + "version_micro", µ, + NULL); + + g_string_append_printf (string, "PackageKit version: %u.%u.%u", major, minor, micro); + + if (major != PK_MAJOR_VERSION || minor != PK_MINOR_VERSION || micro != PK_MICRO_VERSION) { + g_string_append_printf (string, + " (build version: %d.%d.%d)", + PK_MAJOR_VERSION, + PK_MINOR_VERSION, + PK_MICRO_VERSION); + } + + g_debug ("%s", string->str); + } else { + g_debug ("Failed to get PackageKit properties: %s (build version: %d.%d.%d)", + (error ? error->message : "Unknown error"), + PK_MAJOR_VERSION, + PK_MINOR_VERSION, + PK_MICRO_VERSION); + } +} + +static void +gs_plugin_packagekit_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin); + g_autoptr(GTask) task = NULL; + + /* print real packagekit version, no need to wait for it */ + pk_control_get_properties_async (self->control_proxy, cancellable, gs_plugin_packagekit_get_properties_cb, NULL); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_setup_async); + + reload_proxy_settings_async (self, cancellable, setup_proxy_settings_cb, g_steal_pointer (&task)); +} + +static void +setup_proxy_settings_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GFile) file_trigger = NULL; + g_autoptr(GError) local_error = NULL; + + if (!reload_proxy_settings_finish (self, result, &local_error)) + g_warning ("Failed to load proxy settings: %s", local_error->message); + g_clear_error (&local_error); + + /* watch the prepared file */ + self->monitor = pk_offline_get_prepared_monitor (cancellable, &local_error); + if (self->monitor == NULL) { + g_debug ("Failed to get prepared update file monitor: %s", local_error->message); + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_signal_connect (self->monitor, "changed", + G_CALLBACK (gs_plugin_packagekit_prepared_update_changed_cb), + self); + + /* watch the trigger file */ + file_trigger = g_file_new_for_path ("/system-update"); + self->monitor_trigger = g_file_monitor_file (file_trigger, + G_FILE_MONITOR_NONE, + NULL, + &local_error); + if (self->monitor_trigger == NULL) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_signal_connect (self->monitor_trigger, "changed", + G_CALLBACK (gs_plugin_systemd_trigger_changed_cb), + self); + + /* check if we have permission to trigger offline updates */ + gs_utils_get_permission_async ("org.freedesktop.packagekit.trigger-offline-update", + cancellable, get_offline_update_permission_cb, g_steal_pointer (&task)); +} + +static void +get_offline_update_permission_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + self->permission = gs_utils_get_permission_finish (result, &local_error); + if (self->permission != NULL) { + g_signal_connect (self->permission, "notify", + G_CALLBACK (gs_plugin_packagekit_permission_cb), + self); + } + + /* get the list of currently downloaded packages */ + if (!gs_plugin_systemd_update_cache (self, g_task_get_cancellable (task), &local_error)) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_packagekit_shutdown_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_shutdown_async); + + /* Cancel any ongoing proxy settings loading operation. */ + g_cancellable_cancel (self->proxy_settings_cancellable); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_shutdown_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void refine_history_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_refine_history_async (GsPluginPackagekit *self, + GsAppList *list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsApp *app; + g_autofree const gchar **package_names = NULL; + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_refine_history_async); + g_task_set_task_data (task, g_object_ref (list), (GDestroyNotify) g_object_unref); + + /* get an array of package names */ + package_names = g_new0 (const gchar *, gs_app_list_length (list) + 1); + for (guint i = 0; i < gs_app_list_length (list); i++) { + app = gs_app_list_index (list, i); + package_names[i] = gs_app_get_source_default (app); + } + + g_debug ("getting history for %u packages", gs_app_list_length (list)); + g_dbus_connection_call (gs_plugin_get_system_bus_connection (GS_PLUGIN (self)), + "org.freedesktop.PackageKit", + "/org/freedesktop/PackageKit", + "org.freedesktop.PackageKit", + "GetPackageHistory", + g_variant_new ("(^asu)", package_names, 0), + NULL, + G_DBUS_CALL_FLAGS_NONE, + GS_PLUGIN_PACKAGEKIT_HISTORY_TIMEOUT, + cancellable, + refine_history_cb, + g_steal_pointer (&task)); +} + +static void +refine_history_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GsPlugin *plugin = GS_PLUGIN (self); + GsAppList *list = g_task_get_task_data (task); + gboolean ret; + guint i = 0; + GVariantIter iter; + GVariant *value; + g_autoptr(GVariant) result_variant = NULL; + g_autoptr(GVariant) tuple = NULL; + g_autoptr(GError) error_local = NULL; + + result_variant = g_dbus_connection_call_finish (connection, result, &error_local); + + if (result_variant == NULL) { + g_dbus_error_strip_remote_error (error_local); + if (g_error_matches (error_local, + G_DBUS_ERROR, + G_DBUS_ERROR_UNKNOWN_METHOD)) { + g_debug ("No history available as PackageKit is too old: %s", + error_local->message); + + /* just set this to something non-zero so we don't keep + * trying to call GetPackageHistory */ + for (i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + gs_app_set_install_date (app, GS_APP_INSTALL_DATE_UNKNOWN); + } + } else if (g_error_matches (error_local, + G_IO_ERROR, + G_IO_ERROR_CANCELLED)) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_CANCELLED, + "Failed to get history: %s", + error_local->message); + return; + } else if (g_error_matches (error_local, + G_IO_ERROR, + G_IO_ERROR_TIMED_OUT)) { + g_debug ("No history as PackageKit took too long: %s", + error_local->message); + for (i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + gs_app_set_install_date (app, GS_APP_INSTALL_DATE_UNKNOWN); + } + } + + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "Failed to get history: %s", + error_local->message); + return; + } + + /* get any results */ + tuple = g_variant_get_child_value (result_variant, 0); + for (i = 0; i < gs_app_list_length (list); i++) { + g_autoptr(GVariant) entries = NULL; + GsApp *app = gs_app_list_index (list, i); + ret = g_variant_lookup (tuple, + gs_app_get_source_default (app), + "@aa{sv}", + &entries); + if (!ret) { + /* make up a fake entry as we know this package was at + * least installed at some point in time */ + if (gs_app_get_state (app) == GS_APP_STATE_INSTALLED) { + g_autoptr(GsApp) app_dummy = NULL; + app_dummy = gs_app_new (gs_app_get_id (app)); + gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_app_set_metadata (app_dummy, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_set_install_date (app_dummy, GS_APP_INSTALL_DATE_UNKNOWN); + gs_app_set_kind (app_dummy, AS_COMPONENT_KIND_GENERIC); + gs_app_set_state (app_dummy, GS_APP_STATE_INSTALLED); + gs_app_set_version (app_dummy, gs_app_get_version (app)); + gs_app_add_history (app, app_dummy); + } + gs_app_set_install_date (app, GS_APP_INSTALL_DATE_UNKNOWN); + continue; + } + + /* add history for application */ + g_variant_iter_init (&iter, entries); + while ((value = g_variant_iter_next_value (&iter))) { + gs_plugin_packagekit_refine_add_history (app, value); + g_variant_unref (value); + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_refine_history_finish (GsPluginPackagekit *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +add_quirks_from_package_name (GsApp *app, const gchar *package_name) +{ + /* these packages don't have a .repo file in their file lists, but + * instead install one through rpm scripts / cron job */ + const gchar *packages_with_repos[] = { + "google-chrome-stable", + "google-earth-pro-stable", + "google-talkplugin", + NULL }; + + if (g_strv_contains (packages_with_repos, package_name)) + gs_app_add_quirk (app, GS_APP_QUIRK_HAS_SOURCE); +} + +typedef struct { + GFile *file; /* (not nullable) (owned) */ + GsPluginFileToAppFlags flags; + + GsApp *app; /* (nullable) (owned) */ +} FileToAppData; + +static void +file_to_app_data_free (FileToAppData *data) +{ + g_clear_object (&data->file); + g_clear_object (&data->app); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (FileToAppData, file_to_app_data_free) + +static void file_to_app_get_content_type_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void file_to_app_get_details_local_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void file_to_app_resolve_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void file_to_app_get_files_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_file_to_app_async (GsPlugin *plugin, + GFile *file, + GsPluginFileToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + g_autoptr(FileToAppData) data = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_file_to_app_async); + + data = g_new0 (FileToAppData, 1); + data->file = g_object_ref (file); + data->flags = flags; + + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) file_to_app_data_free); + + /* does this match any of the mimetypes we support */ + gs_utils_get_content_type_async (file, cancellable, + file_to_app_get_content_type_cb, + g_steal_pointer (&task)); +} + +static void +file_to_app_get_content_type_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GFile *file = G_FILE (source_object); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GError) local_error = NULL; + GsPlugin *plugin = g_task_get_source_object (task); + FileToAppData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + gboolean interactive = (data->flags & GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE); + g_autoptr(GsPackagekitHelper) helper = NULL; + g_autoptr(PkTask) task_local = NULL; + g_autofree char *content_type = NULL; + g_autofree char *filename = NULL; + g_auto(GStrv) files = NULL; + const gchar *mimetypes[] = { + "application/x-app-package", + "application/x-deb", + "application/vnd.debian.binary-package", + "application/x-redhat-package-manager", + "application/x-rpm", + NULL }; + + /* does this match any of the mimetypes we support */ + content_type = gs_utils_get_content_type_finish (file, result, &local_error); + if (content_type == NULL) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } else if (!g_strv_contains (mimetypes, content_type)) { + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } + + /* get details */ + filename = g_file_get_path (file); + files = g_strsplit (filename, "\t", -1); + + task_local = gs_packagekit_task_new (plugin); + helper = gs_packagekit_helper_new (plugin); + pk_client_set_cache_age (PK_CLIENT (task_local), G_MAXUINT); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_local), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, interactive); + gs_packagekit_task_take_helper (GS_PACKAGEKIT_TASK (task_local), helper); + + pk_client_get_details_local_async (PK_CLIENT (task_local), + files, + cancellable, + gs_packagekit_helper_cb, g_steal_pointer (&helper), + file_to_app_get_details_local_cb, + g_steal_pointer (&task)); +} + +static void +file_to_app_get_details_local_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkTask *task_local = PK_TASK (source_object); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GError) local_error = NULL; + GsPlugin *plugin = g_task_get_source_object (task); + FileToAppData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + const gchar *package_id; + PkDetails *item; + g_autoptr(PkResults) results = NULL; + g_autofree gchar *filename = NULL; + g_autofree gchar *packagename = NULL; + g_auto(GStrv) split = NULL; + g_autoptr(GPtrArray) array = NULL; + g_autoptr(GsApp) app = NULL; + PkBitfield filter; + const gchar *names[2] = { NULL, }; + + results = pk_client_generic_finish (PK_CLIENT (source_object), result, &local_error); + if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + g_prefix_error (&local_error, "Failed to resolve package_ids: "); + gs_plugin_packagekit_error_convert (&local_error, cancellable); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* get results */ + filename = g_file_get_path (data->file); + array = pk_results_get_details_array (results); + if (array->len == 0) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "No details for %s", filename); + return; + } else if (array->len > 1) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "Too many details [%u] for %s", + array->len, filename); + return; + } + + /* create application */ + item = g_ptr_array_index (array, 0); + app = gs_app_new (NULL); + gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + + package_id = pk_details_get_package_id (item); + split = pk_package_id_split (package_id); + if (split == NULL) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "Invalid package-id: %s", package_id); + return; + } + + gs_app_set_management_plugin (app, plugin); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE_LOCAL); + gs_app_set_local_file (app, data->file); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, split[PK_PACKAGE_ID_NAME]); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, + pk_details_get_summary (item)); + gs_app_set_version (app, split[PK_PACKAGE_ID_VERSION]); + gs_app_add_source (app, split[PK_PACKAGE_ID_NAME]); + gs_app_add_source_id (app, package_id); + gs_app_set_description (app, GS_APP_QUALITY_LOWEST, + pk_details_get_description (item)); + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, pk_details_get_url (item)); + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, pk_details_get_size (item)); + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + if (pk_details_get_license (item) != NULL && + g_ascii_strcasecmp (pk_details_get_license (item), "unknown") != 0) { + g_autofree gchar *license_spdx = NULL; + license_spdx = as_license_to_spdx_id (pk_details_get_license (item)); + if (license_spdx != NULL && g_ascii_strcasecmp (license_spdx, "unknown") == 0) { + g_clear_pointer (&license_spdx, g_free); + license_spdx = g_strdup (pk_details_get_license (item)); + if (license_spdx != NULL) + g_strstrip (license_spdx); + } + gs_app_set_license (app, GS_APP_QUALITY_LOWEST, license_spdx); + } + add_quirks_from_package_name (app, split[PK_PACKAGE_ID_NAME]); + packagename = g_strdup_printf ("%s-%s.%s", + split[PK_PACKAGE_ID_NAME], + split[PK_PACKAGE_ID_VERSION], + split[PK_PACKAGE_ID_ARCH]); + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", packagename); + + data->app = g_steal_pointer (&app); + + /* is already installed? */ + names[0] = gs_app_get_source_default (data->app); + filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, + PK_FILTER_ENUM_ARCH, + PK_FILTER_ENUM_INSTALLED, + -1); + pk_client_resolve_async (PK_CLIENT (task_local), + filter, (gchar **) names, + cancellable, NULL, NULL, + file_to_app_resolve_cb, + g_steal_pointer (&task)); +} + +static void +file_to_app_resolve_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkTask *task_local = PK_TASK (source_object); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GError) local_error = NULL; + FileToAppData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPackagekitHelper *helper; + g_autoptr(PkResults) results = NULL; + g_autofree gchar *filename = NULL; + g_auto(GStrv) files = NULL; + g_autoptr(GPtrArray) packages = NULL; + + results = pk_client_generic_finish (PK_CLIENT (source_object), result, &local_error); + if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + g_prefix_error (&local_error, "Failed to resolve whether package is installed: "); + gs_plugin_packagekit_error_convert (&local_error, cancellable); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + packages = pk_results_get_package_array (results); + if (packages->len > 0) { + gboolean is_higher_version = FALSE; + const gchar *app_version = gs_app_get_version (data->app); + + for (guint i = 0; i < packages->len; i++){ + PkPackage *pkg = g_ptr_array_index (packages, i); + gs_app_add_source_id (data->app, pk_package_get_id (pkg)); + gs_plugin_packagekit_set_package_name (data->app, pkg); + if (!is_higher_version && + gs_utils_compare_versions (pk_package_get_version (pkg), app_version) < 0) + is_higher_version = TRUE; + } + + if (!is_higher_version) { + gs_app_set_state (data->app, GS_APP_STATE_UNKNOWN); + gs_app_set_state (data->app, GS_APP_STATE_INSTALLED); + } + } + + /* look for a desktop file so we can use a valid application id */ + filename = g_file_get_path (data->file); + + /* get file list so we can work out ID */ + files = g_strsplit (filename, "\t", -1); + helper = gs_packagekit_task_get_helper (GS_PACKAGEKIT_TASK (task_local)); + gs_packagekit_helper_add_app (helper, data->app); + + pk_client_get_files_local_async (PK_CLIENT (task_local), + files, + cancellable, + gs_packagekit_helper_cb, helper, + file_to_app_get_files_cb, + g_steal_pointer (&task)); +} + +static void +file_to_app_get_files_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GError) local_error = NULL; + FileToAppData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(PkResults) results = NULL; + g_autofree char *filename = NULL; + g_autoptr(GPtrArray) array = NULL; + g_autoptr(GString) basename_best = g_string_new (NULL); + + results = pk_client_generic_finish (PK_CLIENT (source_object), result, &local_error); + if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + gs_utils_error_add_origin_id (&local_error, data->app); + g_prefix_error (&local_error, "Failed to resolve files in local package: "); + gs_plugin_packagekit_error_convert (&local_error, cancellable); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + filename = g_file_get_path (data->file); + array = pk_results_get_files_array (results); + if (array->len == 0) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "No files for %s", filename); + return; + } + + /* find the smallest length desktop file, on the logic that + * ${app}.desktop is going to be better than ${app}-${action}.desktop */ + for (guint i = 0; i < array->len; i++) { + PkFiles *item = g_ptr_array_index (array, i); + const char * const *fns = (const char * const *) pk_files_get_files (item); + + for (guint j = 0; fns[j] != NULL; j++) { + if (g_str_has_prefix (fns[j], "/etc/yum.repos.d/") && + g_str_has_suffix (fns[j], ".repo")) { + gs_app_add_quirk (data->app, GS_APP_QUIRK_HAS_SOURCE); + } + if (g_str_has_prefix (fns[j], "/usr/share/applications/") && + g_str_has_suffix (fns[j], ".desktop")) { + g_autofree gchar *basename = g_path_get_basename (fns[j]); + if (basename_best->len == 0 || + strlen (basename) < basename_best->len) + g_string_assign (basename_best, basename); + } + } + } + + if (basename_best->len > 0) { + gs_app_set_kind (data->app, AS_COMPONENT_KIND_DESKTOP_APP); + gs_app_set_id (data->app, basename_best->str); + } + + /* Success */ + gs_app_list_add (list, data->app); + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_packagekit_file_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void gs_plugin_packagekit_url_to_app_resolved_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_url_to_app_async (GsPlugin *plugin, + const gchar *url, + GsPluginUrlToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_auto(GStrv) package_ids = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + g_autoptr(GsPackagekitHelper) helper = NULL; + g_autoptr(PkTask) task_resolve = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = gs_plugin_url_to_app_data_new_task (plugin, url, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_url_to_app_async); + + /* only do this for apt:// on debian or debian-like distros */ + os_release = gs_os_release_new (&local_error); + if (os_release == NULL) { + g_prefix_error_literal (&local_error, "Failed to determine OS information: "); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } else { + const gchar *id = NULL; + const gchar * const *id_like = NULL; + g_autofree gchar *scheme = NULL; + id = gs_os_release_get_id (os_release); + id_like = gs_os_release_get_id_like (os_release); + scheme = gs_utils_get_url_scheme (url); + if (!(g_strcmp0 (scheme, "apt") == 0 && + (g_strcmp0 (id, "debian") == 0 || + (id_like != NULL && g_strv_contains (id_like, "debian"))))) { + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } + } + + package_ids = g_new0 (gchar *, 2); + package_ids[0] = gs_utils_get_url_path (url); + + task_resolve = gs_packagekit_task_new (plugin); + helper = gs_packagekit_helper_new (plugin); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_resolve), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, + flags & GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE); + gs_packagekit_task_take_helper (GS_PACKAGEKIT_TASK (task_resolve), helper); + + pk_client_resolve_async (PK_CLIENT (task_resolve), + pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, PK_FILTER_ENUM_ARCH, -1), + package_ids, + cancellable, + gs_packagekit_helper_cb, g_steal_pointer (&helper), + gs_plugin_packagekit_url_to_app_resolved_cb, g_steal_pointer (&task)); +} + +static void +gs_plugin_packagekit_url_to_app_resolved_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (task)); + GsPluginUrlToAppData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPlugin *plugin = GS_PLUGIN (self); + g_autofree gchar *path = NULL; + g_autoptr(PkResults) results = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GPtrArray) packages = NULL; + g_autoptr(GPtrArray) details = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (PK_CLIENT (source_object), result, &local_error); + if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + g_prefix_error (&local_error, "Failed to resolve package_ids: "); + gs_plugin_packagekit_error_convert (&local_error, cancellable); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + path = gs_utils_get_url_path (data->url); + list = gs_app_list_new (); + app = gs_app_new (NULL); + gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_app_add_source (app, path); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + + /* get results */ + packages = pk_results_get_package_array (results); + details = pk_results_get_details_array (results); + + if (packages->len >= 1) { + g_autoptr(GHashTable) details_collection = NULL; + g_autoptr(GHashTable) prepared_updates = NULL; + + if (gs_app_get_local_file (app) == NULL) { + details_collection = gs_plugin_packagekit_details_array_to_hash (details); + + g_mutex_lock (&self->prepared_updates_mutex); + prepared_updates = g_hash_table_ref (self->prepared_updates); + g_mutex_unlock (&self->prepared_updates_mutex); + + gs_plugin_packagekit_resolve_packages_app (plugin, packages, app); + gs_plugin_packagekit_refine_details_app (plugin, details_collection, prepared_updates, app); + } + + gs_app_list_add (list, app); + } else { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "No files for %s", data->url); + return; + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_packagekit_url_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static gchar * +get_proxy_http (GsPluginPackagekit *self) +{ + gboolean ret; + GString *string = NULL; + gint port; + GDesktopProxyMode proxy_mode; + g_autofree gchar *host = NULL; + g_autofree gchar *password = NULL; + g_autofree gchar *username = NULL; + + proxy_mode = g_settings_get_enum (self->settings_proxy, "mode"); + if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL) + return NULL; + + host = g_settings_get_string (self->settings_http, "host"); + if (host == NULL || host[0] == '\0') + return NULL; + + port = g_settings_get_int (self->settings_http, "port"); + + ret = g_settings_get_boolean (self->settings_http, + "use-authentication"); + if (ret) { + username = g_settings_get_string (self->settings_http, + "authentication-user"); + password = g_settings_get_string (self->settings_http, + "authentication-password"); + } + + /* make PackageKit proxy string */ + string = g_string_new (""); + if (username != NULL || password != NULL) { + if (username != NULL) + g_string_append_printf (string, "%s", username); + if (password != NULL) + g_string_append_printf (string, ":%s", password); + g_string_append (string, "@"); + } + g_string_append (string, host); + if (port > 0) + g_string_append_printf (string, ":%i", port); + return g_string_free (string, FALSE); +} + +static gchar * +get_proxy_https (GsPluginPackagekit *self) +{ + GString *string = NULL; + gint port; + GDesktopProxyMode proxy_mode; + g_autofree gchar *host = NULL; + + proxy_mode = g_settings_get_enum (self->settings_proxy, "mode"); + if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL) + return NULL; + + host = g_settings_get_string (self->settings_https, "host"); + if (host == NULL || host[0] == '\0') + return NULL; + port = g_settings_get_int (self->settings_https, "port"); + if (port == 0) + return NULL; + + /* make PackageKit proxy string */ + string = g_string_new (host); + if (port > 0) + g_string_append_printf (string, ":%i", port); + return g_string_free (string, FALSE); +} + +static gchar * +get_proxy_ftp (GsPluginPackagekit *self) +{ + GString *string = NULL; + gint port; + GDesktopProxyMode proxy_mode; + g_autofree gchar *host = NULL; + + proxy_mode = g_settings_get_enum (self->settings_proxy, "mode"); + if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL) + return NULL; + + host = g_settings_get_string (self->settings_ftp, "host"); + if (host == NULL || host[0] == '\0') + return NULL; + port = g_settings_get_int (self->settings_ftp, "port"); + if (port == 0) + return NULL; + + /* make PackageKit proxy string */ + string = g_string_new (host); + if (port > 0) + g_string_append_printf (string, ":%i", port); + return g_string_free (string, FALSE); +} + +static gchar * +get_proxy_socks (GsPluginPackagekit *self) +{ + GString *string = NULL; + gint port; + GDesktopProxyMode proxy_mode; + g_autofree gchar *host = NULL; + + proxy_mode = g_settings_get_enum (self->settings_proxy, "mode"); + if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL) + return NULL; + + host = g_settings_get_string (self->settings_socks, "host"); + if (host == NULL || host[0] == '\0') + return NULL; + port = g_settings_get_int (self->settings_socks, "port"); + if (port == 0) + return NULL; + + /* make PackageKit proxy string */ + string = g_string_new (host); + if (port > 0) + g_string_append_printf (string, ":%i", port); + return g_string_free (string, FALSE); +} + +static gchar * +get_no_proxy (GsPluginPackagekit *self) +{ + GString *string = NULL; + GDesktopProxyMode proxy_mode; + g_autofree gchar **hosts = NULL; + guint i; + + proxy_mode = g_settings_get_enum (self->settings_proxy, "mode"); + if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL) + return NULL; + + hosts = g_settings_get_strv (self->settings_proxy, "ignore-hosts"); + if (hosts == NULL) + return NULL; + + /* make PackageKit proxy string */ + string = g_string_new (""); + for (i = 0; hosts[i] != NULL; i++) { + if (i == 0) + g_string_assign (string, hosts[i]); + else + g_string_append_printf (string, ",%s", hosts[i]); + g_free (hosts[i]); + } + + return g_string_free (string, FALSE); +} + +static gchar * +get_pac (GsPluginPackagekit *self) +{ + GDesktopProxyMode proxy_mode; + gchar *url = NULL; + + proxy_mode = g_settings_get_enum (self->settings_proxy, "mode"); + if (proxy_mode != G_DESKTOP_PROXY_MODE_AUTO) + return NULL; + + url = g_settings_get_string (self->settings_proxy, "autoconfig-url"); + if (url == NULL) + return NULL; + + return url; +} + +static void get_permission_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void set_proxy_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +reload_proxy_settings_async (GsPluginPackagekit *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, reload_proxy_settings_async); + + /* only if we can achieve the action *without* an auth dialog */ + gs_utils_get_permission_async ("org.freedesktop.packagekit." + "system-network-proxy-configure", + cancellable, get_permission_cb, + g_steal_pointer (&task)); +} + +static void +get_permission_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autofree gchar *proxy_http = NULL; + g_autofree gchar *proxy_https = NULL; + g_autofree gchar *proxy_ftp = NULL; + g_autofree gchar *proxy_socks = NULL; + g_autofree gchar *no_proxy = NULL; + g_autofree gchar *pac = NULL; + g_autoptr(GPermission) permission = NULL; + g_autoptr(GError) local_error = NULL; + + permission = gs_utils_get_permission_finish (result, &local_error); + if (permission == NULL) { + g_debug ("not setting proxy as no permission: %s", local_error->message); + g_task_return_boolean (task, TRUE); + return; + } + if (!g_permission_get_allowed (permission)) { + g_debug ("not setting proxy as no auth requested"); + g_task_return_boolean (task, TRUE); + return; + } + + proxy_http = get_proxy_http (self); + proxy_https = get_proxy_https (self); + proxy_ftp = get_proxy_ftp (self); + proxy_socks = get_proxy_socks (self); + no_proxy = get_no_proxy (self); + pac = get_pac (self); + + g_debug ("Setting proxies (http: %s, https: %s, ftp: %s, socks: %s, " + "no_proxy: %s, pac: %s)", + proxy_http, proxy_https, proxy_ftp, proxy_socks, + no_proxy, pac); + + pk_control_set_proxy2_async (self->control_proxy, + proxy_http, + proxy_https, + proxy_ftp, + proxy_socks, + no_proxy, + pac, + cancellable, + set_proxy_cb, + g_steal_pointer (&task)); +} + +static void +set_proxy_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkControl *control = PK_CONTROL (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!pk_control_set_proxy_finish (control, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +reload_proxy_settings_finish (GsPluginPackagekit *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void proxy_changed_reload_proxy_settings_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_proxy_changed_cb (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (user_data); + + if (!gs_plugin_get_enabled (GS_PLUGIN (self))) + return; + + g_cancellable_cancel (self->proxy_settings_cancellable); + g_clear_object (&self->proxy_settings_cancellable); + self->proxy_settings_cancellable = g_cancellable_new (); + + reload_proxy_settings_async (self, self->proxy_settings_cancellable, + proxy_changed_reload_proxy_settings_cb, self); +} + +static void +proxy_changed_reload_proxy_settings_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (user_data); + g_autoptr(GError) local_error = NULL; + + if (!reload_proxy_settings_finish (self, result, &local_error) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Failed to set proxies: %s", local_error->message); +} + +static void +gs_packagekit_upgrade_system_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(PkResults) results = NULL; + g_autoptr(GError) local_error = NULL; + GsPluginDownloadUpgradeData *data = g_task_get_task_data (task); + + results = pk_task_generic_finish (PK_TASK (source_object), result, &local_error); + + if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (task), &local_error)) { + gs_app_set_state_recover (data->app); + gs_plugin_packagekit_error_convert (&local_error, g_task_get_cancellable (task)); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* state is known */ + gs_app_set_state (data->app, GS_APP_STATE_UPDATABLE); + + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_packagekit_download_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginDownloadUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GsPackagekitHelper) helper = NULL; + g_autoptr(PkTask) task_upgrade = NULL; + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE) != 0; + + task = gs_plugin_download_upgrade_data_new_task (plugin, app, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_download_upgrade_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* check is distro-upgrade */ + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_OPERATING_SYSTEM) { + g_task_return_boolean (task, TRUE); + return; + } + + helper = gs_packagekit_helper_new (plugin); + + /* ask PK to download enough packages to upgrade the system */ + gs_app_set_state (app, GS_APP_STATE_DOWNLOADING); + gs_packagekit_helper_set_progress_app (helper, app); + + task_upgrade = gs_packagekit_task_new (plugin); + pk_task_set_only_download (task_upgrade, TRUE); + pk_client_set_cache_age (PK_CLIENT (task_upgrade), 60 * 60 * 24); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_upgrade), GS_PACKAGEKIT_TASK_QUESTION_TYPE_DOWNLOAD, interactive); + gs_packagekit_task_take_helper (GS_PACKAGEKIT_TASK (task_upgrade), helper); + + pk_task_upgrade_system_async (task_upgrade, + gs_app_get_version (app), + PK_UPGRADE_KIND_ENUM_COMPLETE, + cancellable, + gs_packagekit_helper_cb, g_steal_pointer (&helper), + gs_packagekit_upgrade_system_cb, + g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_packagekit_download_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void gs_plugin_packagekit_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +static void +gs_plugin_packagekit_enable_repository_refresh_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (task)); + GsPluginManageRepositoryData *data = g_task_get_task_data (task); + + gs_plugin_repository_changed (GS_PLUGIN (self), data->repository); + + /* Ignore refresh errors */ + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_packagekit_enable_repository_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(PkResults) results = NULL; + g_autoptr(PkError) error_code = NULL; + g_autoptr(GError) local_error = NULL; + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (task)); + GsPluginManageRepositoryData *data = g_task_get_task_data (task); + GsPluginRefreshMetadataFlags metadata_flags; + GCancellable *cancellable = g_task_get_cancellable (task); + + results = pk_client_generic_finish (PK_CLIENT (source_object), result, &local_error); + + /* pk_client_repo_enable() returns an error if the repo is already enabled. */ + if (results != NULL && + (error_code = pk_results_get_error_code (results)) != NULL && + pk_error_get_code (error_code) == PK_ERROR_ENUM_REPO_ALREADY_SET) { + g_clear_error (&local_error); + } else if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + gs_app_set_state_recover (data->repository); + gs_utils_error_add_origin_id (&local_error, data->repository); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* state is known */ + gs_app_set_state (data->repository, GS_APP_STATE_INSTALLED); + + metadata_flags = (data->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE) != 0 ? + GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE : + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE; + + gs_plugin_packagekit_refresh_metadata_async (GS_PLUGIN (self), + 1, /* cache age */ + metadata_flags, + cancellable, + gs_plugin_packagekit_enable_repository_refresh_ready_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_packagekit_enable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GsPackagekitHelper) helper = NULL; + g_autoptr(PkTask) task_enable_repo = NULL; + g_autoptr(GTask) task = NULL; + + task = gs_plugin_manage_repository_data_new_task (plugin, repository, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_enable_repository_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* is repo */ + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + /* do the call */ + gs_plugin_status_update (plugin, repository, GS_PLUGIN_STATUS_WAITING); + gs_app_set_state (repository, GS_APP_STATE_INSTALLING); + + helper = gs_packagekit_helper_new (plugin); + gs_packagekit_helper_add_app (helper, repository); + + task_enable_repo = gs_packagekit_task_new (plugin); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_enable_repo), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, + (flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE) != 0); + gs_packagekit_task_take_helper (GS_PACKAGEKIT_TASK (task_enable_repo), helper); + + pk_client_repo_enable_async (PK_CLIENT (task_enable_repo), + gs_app_get_id (repository), + TRUE, + cancellable, + gs_packagekit_helper_cb, g_steal_pointer (&helper), + gs_plugin_packagekit_enable_repository_ready_cb, + g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_packagekit_enable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_packagekit_disable_repository_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(PkResults) results = NULL; + g_autoptr(PkError) error_code = NULL; + g_autoptr(GError) local_error = NULL; + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (g_task_get_source_object (task)); + GsPluginManageRepositoryData *data = g_task_get_task_data (task); + + results = pk_client_generic_finish (PK_CLIENT (source_object), result, &local_error); + + /* pk_client_repo_enable() returns an error if the repo is already disabled. */ + if (results != NULL && + (error_code = pk_results_get_error_code (results)) != NULL && + pk_error_get_code (error_code) == PK_ERROR_ENUM_REPO_ALREADY_SET) { + g_clear_error (&local_error); + } else if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (task), &local_error)) { + gs_app_set_state_recover (data->repository); + gs_utils_error_add_origin_id (&local_error, data->repository); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* state is known */ + gs_app_set_state (data->repository, GS_APP_STATE_AVAILABLE); + + gs_plugin_repository_changed (GS_PLUGIN (self), data->repository); + + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_packagekit_disable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GsPackagekitHelper) helper = NULL; + g_autoptr(PkTask) task_disable_repo = NULL; + g_autoptr(GTask) task = NULL; + + task = gs_plugin_manage_repository_data_new_task (plugin, repository, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_disable_repository_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* is repo */ + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + /* do the call */ + gs_plugin_status_update (plugin, repository, GS_PLUGIN_STATUS_WAITING); + gs_app_set_state (repository, GS_APP_STATE_REMOVING); + + helper = gs_packagekit_helper_new (plugin); + gs_packagekit_helper_add_app (helper, repository); + + task_disable_repo = gs_packagekit_task_new (plugin); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_disable_repo), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, + (flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE) != 0); + gs_packagekit_task_take_helper (GS_PACKAGEKIT_TASK (task_disable_repo), helper); + + pk_client_repo_enable_async (PK_CLIENT (task_disable_repo), + gs_app_get_id (repository), + FALSE, + cancellable, + gs_packagekit_helper_cb, g_steal_pointer (&helper), + gs_plugin_packagekit_disable_repository_ready_cb, + g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_packagekit_disable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + gpointer schedule_entry_handle; /* (nullable) (owned) */ + + /* List of apps to download, and list of apps to notify of download + * progress on. @download_list is a superset of @progress_list, and + * may include extra dependencies. */ + GsAppList *download_list; /* (owned) */ + GsAppList *progress_list; /* (owned) */ + + gboolean interactive; + + GsPackagekitHelper *helper; /* (owned) */ +} DownloadData; + +static void +download_data_free (DownloadData *data) +{ + /* Should have been explicitly removed from the scheduler by now. */ + g_assert (data->schedule_entry_handle == NULL); + + g_clear_object (&data->download_list); + g_clear_object (&data->progress_list); + g_clear_object (&data->helper); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (DownloadData, download_data_free) + +static void download_schedule_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void download_get_updates_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void download_update_packages_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_download (GTask *task, + GError *error); + +static void +gs_plugin_packagekit_download_async (GsPluginPackagekit *self, + GsAppList *list, + gboolean interactive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPlugin *plugin = GS_PLUGIN (self); + g_autoptr(GTask) task = NULL; + g_autoptr(DownloadData) data_owned = NULL; + DownloadData *data; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_download_async); + + data = data_owned = g_new0 (DownloadData, 1); + data->download_list = gs_app_list_new (); + data->progress_list = g_object_ref (list); + data->interactive = interactive; + data->helper = gs_packagekit_helper_new (plugin); + gs_packagekit_helper_set_allow_emit_updates_changed (data->helper, FALSE); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) download_data_free); + + /* add any packages */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + GsAppList *related = gs_app_get_related (app); + + /* add this app */ + if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY)) { + if (gs_app_has_management_plugin (app, plugin)) + gs_app_list_add (data->download_list, app); + continue; + } + + /* add each related app */ + for (guint j = 0; j < gs_app_list_length (related); j++) { + GsApp *app_tmp = gs_app_list_index (related, j); + if (gs_app_has_management_plugin (app_tmp, plugin)) + gs_app_list_add (data->download_list, app_tmp); + } + } + + if (gs_app_list_length (data->download_list) == 0) { + finish_download (task, NULL); + return; + } + + /* Wait for permission to download, if needed. */ + if (!data->interactive) { + g_auto(GVariantDict) parameters_dict = G_VARIANT_DICT_INIT (NULL); + + g_variant_dict_insert (¶meters_dict, "resumable", "b", FALSE); + + gs_metered_block_on_download_scheduler_async (g_variant_dict_end (¶meters_dict), + cancellable, + download_schedule_cb, + g_steal_pointer (&task)); + } else { + download_schedule_cb (NULL, NULL, g_steal_pointer (&task)); + } +} + +static void +download_schedule_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(PkTask) task_update = NULL; + g_autoptr(GError) local_error = NULL; + + if (result != NULL && + !gs_metered_block_on_download_scheduler_finish (result, &data->schedule_entry_handle, &local_error)) { + g_warning ("Failed to block on download scheduler: %s", + local_error->message); + g_clear_error (&local_error); + } + + /* get the list of packages to update */ + gs_plugin_status_update (GS_PLUGIN (self), NULL, GS_PLUGIN_STATUS_WAITING); + + /* never refresh the metadata here as this can surprise the frontend if + * we end up downloading a different set of packages than what was + * shown to the user */ + task_update = gs_packagekit_task_new (GS_PLUGIN (self)); + pk_task_set_only_download (task_update, TRUE); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_update), + GS_PACKAGEKIT_TASK_QUESTION_TYPE_DOWNLOAD, + data->interactive); + + pk_client_get_updates_async (PK_CLIENT (task_update), + pk_bitfield_value (PK_FILTER_ENUM_NONE), + cancellable, + gs_packagekit_helper_cb, data->helper, + download_get_updates_cb, + g_steal_pointer (&task)); +} + +static gboolean +update_system_filter_cb (PkPackage *package, + gpointer user_data) +{ + PkInfoEnum info = pk_package_get_info (package); +#if PK_CHECK_VERSION(1, 3, 0) + return info != PK_INFO_ENUM_OBSOLETE && + info != PK_INFO_ENUM_OBSOLETING && + info != PK_INFO_ENUM_REMOVE && + info != PK_INFO_ENUM_REMOVING && + info != PK_INFO_ENUM_BLOCKED; +#else + return info != PK_INFO_ENUM_OBSOLETING && info != PK_INFO_ENUM_REMOVING && info != PK_INFO_ENUM_BLOCKED; +#endif +} + +static void +download_get_updates_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkTask *task_update = PK_TASK (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(PkResults) results = NULL; + g_autoptr(PkPackageSack) sack = NULL; + g_auto(GStrv) package_ids = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (PK_CLIENT (task_update), result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, cancellable, &local_error)) { + if (local_error->domain == PK_CLIENT_ERROR) { + g_autoptr(GsPluginEvent) event = NULL; + + event = gs_plugin_event_new ("error", local_error, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + if (data->interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_report_event (g_task_get_source_object (task), event); + } + finish_download (task, g_steal_pointer (&local_error)); + return; + } + + /* download all the packages */ + sack = pk_results_get_package_sack (results); + if (pk_package_sack_get_size (sack) == 0) { + finish_download (task, NULL); + return; + } + + /* Include only packages which are not to be obsoleted nor removed, + because these can cause failure due to unmet dependencies. */ + pk_package_sack_remove_by_filter (sack, update_system_filter_cb, NULL); + + package_ids = pk_package_sack_get_ids (sack); + for (guint i = 0; i < gs_app_list_length (data->download_list); i++) { + GsApp *app = gs_app_list_index (data->download_list, i); + gs_packagekit_helper_add_app (data->helper, app); + } + gs_packagekit_helper_set_progress_list (data->helper, data->progress_list); + + /* never refresh the metadata here as this can surprise the frontend if + * we end up downloading a different set of packages than what was + * shown to the user */ + pk_task_update_packages_async (task_update, + package_ids, + cancellable, + gs_packagekit_helper_cb, data->helper, + download_update_packages_cb, + g_steal_pointer (&task)); +} + +static void +download_update_packages_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkTask *task_update = PK_TASK (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + DownloadData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(PkResults) results = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_task_generic_finish (task_update, result, &local_error); + + gs_app_list_override_progress (data->progress_list, GS_APP_PROGRESS_UNKNOWN); + if (results == NULL) { + if (local_error->domain == PK_CLIENT_ERROR) { + g_autoptr(GsPluginEvent) event = NULL; + + event = gs_plugin_event_new ("error", local_error, + NULL); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + if (data->interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_report_event (g_task_get_source_object (task), event); + } + gs_plugin_packagekit_error_convert (&local_error, cancellable); + finish_download (task, g_steal_pointer (&local_error)); + return; + } + + if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { + finish_download (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (data->download_list); i++) { + GsApp *app = gs_app_list_index (data->download_list, i); + /* To indicate the app is already downloaded */ + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + } + + /* Success! */ + finish_download (task, NULL); +} + +/* If non-%NULL, @error is (transfer full). */ +static void +finish_download (GTask *task, + GError *error) +{ + GsPluginPackagekit *self = g_task_get_source_object (task); + DownloadData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + /* Fire this call off into the void, it’s not worth tracking it. + * Don’t pass a cancellable in, as the download may have been cancelled. */ + if (data->schedule_entry_handle != NULL) + gs_metered_remove_from_download_scheduler_async (data->schedule_entry_handle, NULL, NULL, NULL); + + if (error_owned == NULL) + gs_plugin_updates_changed (GS_PLUGIN (self)); + + if (error_owned != NULL) + g_task_return_error (task, g_steal_pointer (&error_owned)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_download_finish (GsPluginPackagekit *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void update_apps_download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void update_apps_trigger_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_update_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_update_apps_data_new_task (plugin, apps, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_update_apps_async); + + if (!(flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD)) { + /* FIXME: Add progress reporting */ + gs_plugin_packagekit_download_async (self, apps, interactive, cancellable, update_apps_download_cb, g_steal_pointer (&task)); + } else { + update_apps_download_cb (G_OBJECT (self), NULL, g_steal_pointer (&task)); + } +} + +static void +update_apps_download_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginUpdateAppsData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); + gboolean interactive = (data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + if (result != NULL && + !gs_plugin_packagekit_download_finish (self, result, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (!(data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY)) { + gboolean trigger_update = FALSE; + + /* Are any of these apps from PackageKit, and suitable for offline + * updates? If any of them can be processed offline, trigger an offline + * update. If all of them are updatable online, don’t. */ + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + GsAppList *related = gs_app_get_related (app); + + /* try to trigger this app */ + if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY) && + gs_app_get_state (app) == GS_APP_STATE_UPDATABLE && + gs_app_has_management_plugin (app, GS_PLUGIN (self))) { + trigger_update = TRUE; + break; + } + + /* try to trigger each related app */ + for (guint j = 0; j < gs_app_list_length (related); j++) { + GsApp *app_tmp = gs_app_list_index (related, j); + + if (gs_app_get_state (app_tmp) == GS_APP_STATE_UPDATABLE && + gs_app_has_management_plugin (app_tmp, GS_PLUGIN (self))) { + trigger_update = TRUE; + break; + } + } + } + + if (trigger_update && !self->is_triggered) { + GDBusConnection *connection; + + /* trigger offline update if it’s not already been triggered */ + + /* Assume we can use the singleton system bus connection + * due to prior PackageKit calls having created it. This + * avoids an async callback. */ + connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, + cancellable, + &local_error); + if (connection == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* FIXME: This can be simplified down to a call to + * pk_offline_trigger_with_flags_async() when it exists. + * See https://github.com/PackageKit/PackageKit/issues/605 */ + g_dbus_connection_call (connection, + "org.freedesktop.PackageKit", + "/org/freedesktop/PackageKit", + "org.freedesktop.PackageKit.Offline", + "Trigger", + g_variant_new ("(s)", pk_offline_action_to_string (PK_OFFLINE_ACTION_REBOOT)), + NULL, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + update_apps_trigger_cb, + g_steal_pointer (&task)); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static void +update_apps_trigger_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginPackagekit *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + + if (!g_dbus_connection_call_finish (connection, result, &local_error)) { + gs_plugin_packagekit_error_convert (&local_error, cancellable); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* don't rely on the file monitor */ + gs_plugin_packagekit_refresh_is_triggered (self, cancellable); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_update_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void refresh_metadata_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_packagekit_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin)); + gboolean interactive = (flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE); + g_autoptr(GTask) task = NULL; + g_autoptr(PkTask) task_refresh = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_refresh_metadata_async); + g_task_set_task_data (task, g_object_ref (helper), g_object_unref); + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING); + gs_packagekit_helper_set_progress_app (helper, app_dl); + + task_refresh = gs_packagekit_task_new (plugin); + pk_task_set_only_download (task_refresh, TRUE); + gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_refresh), GS_PACKAGEKIT_TASK_QUESTION_TYPE_NONE, interactive); + pk_client_set_cache_age (PK_CLIENT (task_refresh), cache_age_secs); + + /* refresh the metadata */ + pk_client_refresh_cache_async (PK_CLIENT (task_refresh), + FALSE /* force */, + cancellable, + gs_packagekit_helper_cb, helper, + refresh_metadata_cb, g_steal_pointer (&task)); +} + +static void +refresh_metadata_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + PkClient *client = PK_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPlugin *plugin = g_task_get_source_object (task); + g_autoptr(PkResults) results = NULL; + g_autoptr(GError) local_error = NULL; + + results = pk_client_generic_finish (client, result, &local_error); + + if (!gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (task), &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + gs_plugin_updates_changed (plugin); + g_task_return_boolean (task, TRUE); + } +} + +static gboolean +gs_plugin_packagekit_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void gs_packagekit_cancel_offline_update_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_packagekit_cancel_offline_update_async (GsPlugin *plugin, + GsPluginCancelOfflineUpdateFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin); + g_autoptr(GTask) task = NULL; + + task = gs_plugin_cancel_offline_update_data_new_task (plugin, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_cancel_offline_update_async); + + /* already in correct state */ + if (!self->is_triggered) { + g_task_return_boolean (task, TRUE); + return; + } + + /* There is no async API in the pk-offline, thus run in a thread */ + g_task_run_in_thread (task, gs_packagekit_cancel_offline_update_thread); +} + +static void +gs_packagekit_cancel_offline_update_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (source_object); + GsPluginCancelOfflineUpdateData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_INTERACTIVE) != 0; + g_autoptr(GError) local_error = NULL; + + /* cancel offline update */ + if (!pk_offline_cancel_with_flags (interactive ? PK_OFFLINE_FLAGS_INTERACTIVE : PK_OFFLINE_FLAGS_NONE, + cancellable, &local_error)) { + gs_plugin_packagekit_error_convert (&local_error, cancellable); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* don't rely on the file monitor */ + gs_plugin_packagekit_refresh_is_triggered (self, cancellable); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_packagekit_cancel_offline_update_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_packagekit_trigger_upgrade_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginTriggerUpgradeData *data = task_data; + gboolean interactive = (data->flags & GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_INTERACTIVE) != 0; + g_autoptr(GError) local_error = NULL; + + if (!pk_offline_trigger_upgrade_with_flags (PK_OFFLINE_ACTION_REBOOT, + interactive ? PK_OFFLINE_FLAGS_INTERACTIVE : PK_OFFLINE_FLAGS_NONE, + cancellable, &local_error)) { + gs_app_set_state (data->app, GS_APP_STATE_UPDATABLE); + gs_plugin_packagekit_error_convert (&local_error, cancellable); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + gs_app_set_state (data->app, GS_APP_STATE_UPDATABLE); + + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_packagekit_trigger_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginTriggerUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = gs_plugin_trigger_upgrade_data_new_task (plugin, app, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_packagekit_trigger_upgrade_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + gs_app_set_state (app, GS_APP_STATE_PENDING_INSTALL); + + /* There is no async API in the pk-offline, thus run in a thread */ + g_task_run_in_thread (task, gs_packagekit_trigger_upgrade_thread); +} + +static gboolean +gs_plugin_packagekit_trigger_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_packagekit_class_init (GsPluginPackagekitClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_packagekit_dispose; + object_class->finalize = gs_plugin_packagekit_finalize; + + plugin_class->setup_async = gs_plugin_packagekit_setup_async; + plugin_class->setup_finish = gs_plugin_packagekit_setup_finish; + plugin_class->shutdown_async = gs_plugin_packagekit_shutdown_async; + plugin_class->shutdown_finish = gs_plugin_packagekit_shutdown_finish; + plugin_class->refine_async = gs_plugin_packagekit_refine_async; + plugin_class->refine_finish = gs_plugin_packagekit_refine_finish; + plugin_class->refresh_metadata_async = gs_plugin_packagekit_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_packagekit_refresh_metadata_finish; + plugin_class->list_apps_async = gs_plugin_packagekit_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_packagekit_list_apps_finish; + plugin_class->enable_repository_async = gs_plugin_packagekit_enable_repository_async; + plugin_class->enable_repository_finish = gs_plugin_packagekit_enable_repository_finish; + plugin_class->disable_repository_async = gs_plugin_packagekit_disable_repository_async; + plugin_class->disable_repository_finish = gs_plugin_packagekit_disable_repository_finish; + plugin_class->install_apps_async = gs_plugin_packagekit_install_apps_async; + plugin_class->install_apps_finish = gs_plugin_packagekit_install_apps_finish; + plugin_class->uninstall_apps_async = gs_plugin_packagekit_uninstall_apps_async; + plugin_class->uninstall_apps_finish = gs_plugin_packagekit_uninstall_apps_finish; + plugin_class->update_apps_async = gs_plugin_packagekit_update_apps_async; + plugin_class->update_apps_finish = gs_plugin_packagekit_update_apps_finish; + plugin_class->cancel_offline_update_async = gs_plugin_packagekit_cancel_offline_update_async; + plugin_class->cancel_offline_update_finish = gs_plugin_packagekit_cancel_offline_update_finish; + plugin_class->download_upgrade_async = gs_plugin_packagekit_download_upgrade_async; + plugin_class->download_upgrade_finish = gs_plugin_packagekit_download_upgrade_finish; + plugin_class->trigger_upgrade_async = gs_plugin_packagekit_trigger_upgrade_async; + plugin_class->trigger_upgrade_finish = gs_plugin_packagekit_trigger_upgrade_finish; + plugin_class->launch_async = gs_plugin_packagekit_launch_async; + plugin_class->launch_finish = gs_plugin_packagekit_launch_finish; + plugin_class->file_to_app_async = gs_plugin_packagekit_file_to_app_async; + plugin_class->file_to_app_finish = gs_plugin_packagekit_file_to_app_finish; + plugin_class->url_to_app_async = gs_plugin_packagekit_url_to_app_async; + plugin_class->url_to_app_finish = gs_plugin_packagekit_url_to_app_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_PACKAGEKIT; +} diff --git a/plugins/packagekit/gs-plugin-packagekit.h b/plugins/packagekit/gs-plugin-packagekit.h new file mode 100644 index 0000000..ffccdfa --- /dev/null +++ b/plugins/packagekit/gs-plugin-packagekit.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_PACKAGEKIT (gs_plugin_packagekit_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginPackagekit, gs_plugin_packagekit, GS, PLUGIN_PACKAGEKIT, GsPlugin) + +G_END_DECLS diff --git a/plugins/packagekit/gs-self-test.c b/plugins/packagekit/gs-self-test.c new file mode 100644 index 0000000..a2ffef5 --- /dev/null +++ b/plugins/packagekit/gs-self-test.c @@ -0,0 +1,291 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gnome-software-private.h" + +#include "gs-markdown.h" +#include "gs-test.h" + +static void +gs_markdown_func (void) +{ + gchar *text; + const gchar *markdown; + const gchar *markdown_expected; + g_autoptr(GsMarkdown) md = NULL; + + /* get GsMarkdown object */ + md = gs_markdown_new (GS_MARKDOWN_OUTPUT_PANGO); + g_assert (md); + + markdown = "OEMs\n" + "====\n" + " - Bullett\n"; + markdown_expected = + "OEMs\n\n" + "• Bullett"; + /* markdown (type2 header) */ + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + /* markdown (autocode) */ + markdown = "this is http://www.hughsie.com/with_spaces_in_url inline link\n"; + markdown_expected = "this is http://www.hughsie.com/with_spaces_in_url inline link"; + gs_markdown_set_autocode (md, TRUE); + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + /* markdown some invalid header */ + markdown = "*** This software is currently in alpha state ***\n"; + markdown_expected = " This software is currently in alpha state "; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + /* markdown (complex1) */ + markdown = " - This is a *very*\n" + " short paragraph\n" + " that is not usual.\n" + " - Another"; + markdown_expected = + "• This is a very short paragraph that is not usual.\n" + "• Another"; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + /* markdown (complex1) */ + markdown = "* This is a *very*\n" + " short paragraph\n" + " that is not usual.\n" + "* This is the second\n" + " bullett point.\n" + "* And the third.\n" + " \n" + "* * *\n" + " \n" + "Paragraph one\n" + "isn't __very__ long at all.\n" + "\n" + "Paragraph two\n" + "isn't much better."; + markdown_expected = + "• This is a very short paragraph that is not usual.\n" + "• This is the second bullett point.\n" + "• And the third.\n" + "⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n" + "Paragraph one isn't very long at all.\n" + "Paragraph two isn't much better."; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + markdown = "This is a spec file description or\n" + "an **update** description in bohdi.\n" + "\n" + "* * *\n" + "# Big title #\n" + "\n" + "The *following* things 'were' fixed:\n" + "- Fix `dave`\n" + "* Fubar update because of \"security\"\n"; + markdown_expected = + "This is a spec file description or an update description in bohdi.\n" + "⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n" + "\nBig title\n\n" + "The following things 'were' fixed:\n" + "• Fix dave\n" + "• Fubar update because of \"security\""; + /* markdown (complex2) */ + text = gs_markdown_parse (md, markdown); + if (g_strcmp0 (text, markdown_expected) == 0) + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + /* markdown (list with spaces) */ + markdown = "* list seporated with spaces -\n" + " first item\n" + "\n" + "* second item\n" + "\n" + "* third item\n"; + markdown_expected = + "• list seporated with spaces - first item\n" + "• second item\n" + "• third item"; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + gs_markdown_set_max_lines (md, 1); + + /* markdown (one line limit) */ + markdown = "* list seporated with spaces -\n" + " first item\n" + "* second item\n"; + markdown_expected = + "• list seporated with spaces - first item"; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + gs_markdown_set_max_lines (md, 1); + + /* markdown (escaping) */ + markdown = "* list & "; + markdown_expected = + "• list & <spaces>"; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + /* markdown (URLs) */ + markdown = "* Upstream [release notes](https://www.gnome.org/release-notes.html) there"; + markdown_expected = + "• Upstream " + "release notes" + " there"; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + markdown = "Links: [link1](https://www.gnome.org/1); [Link 2](https://www.gnome.org/2)"; + markdown_expected = + "Links: " + "link1; " + "Link 2"; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + markdown = "this is the http://www.hughsie.com/ coolest site"; + markdown_expected = + "this is the " + "http://www.hughsie.com/" + " coolest site"; + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); + + /* markdown (free text) */ + gs_markdown_set_escape (md, FALSE); + text = gs_markdown_parse (md, "This isn't a present"); + g_assert_cmpstr (text, ==, "This isn't a present"); + g_free (text); + + /* markdown (autotext underscore) */ + text = gs_markdown_parse (md, "This isn't CONFIG_UEVENT_HELPER_PATH present"); + g_assert_cmpstr (text, ==, "This isn't CONFIG_UEVENT_HELPER_PATH present"); + g_free (text); + + /* markdown (end of bullett) */ + markdown = "*Thu Mar 12 12:00:00 2009* Dan Walsh - 2.0.79-1\n" + "- Update to upstream \n" + " * Netlink socket handoff patch from Adam Jackson.\n" + " * AVC caching of compute_create results by Eric Paris.\n" + "\n" + "*Tue Mar 10 12:00:00 2009* Dan Walsh - 2.0.78-5\n" + "- Add patch from ajax to accellerate X SELinux \n" + "- Update eparis patch\n"; + markdown_expected = + "Thu Mar 12 12:00:00 2009 Dan Walsh <dwalsh@redhat.com> - 2.0.79-1\n" + "• Update to upstream\n" + "• Netlink socket handoff patch from Adam Jackson.\n" + "• AVC caching of compute_create results by Eric Paris.\n" + "Tue Mar 10 12:00:00 2009 Dan Walsh <dwalsh@redhat.com> - 2.0.78-5\n" + "• Add patch from ajax to accellerate X SELinux\n" + "• Update eparis patch"; + gs_markdown_set_escape (md, TRUE); + gs_markdown_set_max_lines (md, 1024); + text = gs_markdown_parse (md, markdown); + g_assert_cmpstr (text, ==, markdown_expected); + g_free (text); +} + +static void +gs_plugins_packagekit_local_func (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + g_autofree gchar *fn = NULL; + g_autoptr(GFile) file = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* no packagekit, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "packagekit")) { + g_test_skip ("not enabled"); + return; + } + + /* load local file */ + fn = gs_test_get_filename (TESTDATADIR, "chiron-1.1-1.fc24.x86_64.rpm"); + g_assert (fn != NULL); + file = g_file_new_for_path (fn); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_NONE); + app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) { + g_test_skip ("rpm files not supported"); + return; + } + g_assert_no_error (error); + g_assert (app != NULL); + g_assert_cmpstr (gs_app_get_source_default (app), ==, "chiron"); + g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, "http://127.0.0.1/"); + g_assert_cmpstr (gs_app_get_name (app), ==, "chiron"); + g_assert_cmpstr (gs_app_get_version (app), ==, "1.1-1.fc24"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "Single line synopsis"); + g_assert_cmpstr (gs_app_get_description (app), ==, + "This is the first paragraph in the example " + "package spec file.\n\nThis is the second paragraph."); +} + +int +main (int argc, char **argv) +{ + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + const gchar * const allowlist[] = { + "packagekit", + NULL + }; + + /* The tests access the system proxy schemas, so pre-load those before + * %G_TEST_OPTION_ISOLATE_DIRS resets the XDG system dirs. */ + g_settings_schema_source_get_default (); + + gs_test_init (&argc, &argv); + + /* generic tests go here */ + g_test_add_func ("/gnome-software/markdown", gs_markdown_func); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + + /* plugin tests go here */ + if (!g_file_test ("/run/ostree-booted", G_FILE_TEST_EXISTS)) { + g_test_add_data_func ("/gnome-software/plugins/packagekit/local", + plugin_loader, + (GTestDataFunc) gs_plugins_packagekit_local_func); + } + + return g_test_run (); +} diff --git a/plugins/packagekit/meson.build b/plugins/packagekit/meson.build new file mode 100644 index 0000000..94a7af9 --- /dev/null +++ b/plugins/packagekit/meson.build @@ -0,0 +1,47 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginPackageKit"'] +cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] +deps = [ + plugin_libs, + packagekit, + gsettings_desktop_schemas, +] + +if get_option('mogwai') + deps += [mogwai_schedule_client] +endif + +shared_module( + 'gs_plugin_packagekit', + sources : [ + 'gs-plugin-packagekit.c', + 'gs-packagekit-helper.c', + 'gs-packagekit-task.c', + 'packagekit-common.c', + 'gs-markdown.c', + ], + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : deps, +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), 'tests') + '"'] + e = executable( + 'gs-self-test-packagekit', + compiled_schemas, + sources : [ + 'gs-markdown.c', + 'gs-self-test.c' + ], + dependencies : [ + plugin_libs, + ], + c_args : cargs, + ) + test('gs-self-test-packagekit', e, suite: ['plugins', 'packagekit'], env: test_env) +endif diff --git a/plugins/packagekit/packagekit-common.c b/plugins/packagekit/packagekit-common.c new file mode 100644 index 0000000..443023a --- /dev/null +++ b/plugins/packagekit/packagekit-common.c @@ -0,0 +1,635 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include + +#include "packagekit-common.h" + +GsPluginStatus +packagekit_status_enum_to_plugin_status (PkStatusEnum status) +{ + GsPluginStatus plugin_status = GS_PLUGIN_STATUS_UNKNOWN; + + switch (status) { + case PK_STATUS_ENUM_SETUP: + case PK_STATUS_ENUM_CANCEL: + case PK_STATUS_ENUM_FINISHED: + case PK_STATUS_ENUM_UNKNOWN: + break; + case PK_STATUS_ENUM_WAIT: + case PK_STATUS_ENUM_WAITING_FOR_LOCK: + case PK_STATUS_ENUM_WAITING_FOR_AUTH: + plugin_status = GS_PLUGIN_STATUS_WAITING; + break; + case PK_STATUS_ENUM_LOADING_CACHE: + case PK_STATUS_ENUM_TEST_COMMIT: + case PK_STATUS_ENUM_RUNNING: + case PK_STATUS_ENUM_SIG_CHECK: + case PK_STATUS_ENUM_REFRESH_CACHE: + plugin_status = GS_PLUGIN_STATUS_SETUP; + break; + case PK_STATUS_ENUM_DOWNLOAD: + case PK_STATUS_ENUM_DOWNLOAD_REPOSITORY: + case PK_STATUS_ENUM_DOWNLOAD_PACKAGELIST: + case PK_STATUS_ENUM_DOWNLOAD_FILELIST: + case PK_STATUS_ENUM_DOWNLOAD_CHANGELOG: + case PK_STATUS_ENUM_DOWNLOAD_GROUP: + case PK_STATUS_ENUM_DOWNLOAD_UPDATEINFO: + plugin_status = GS_PLUGIN_STATUS_DOWNLOADING; + break; + case PK_STATUS_ENUM_INSTALL: + case PK_STATUS_ENUM_UPDATE: + plugin_status = GS_PLUGIN_STATUS_INSTALLING; + break; + case PK_STATUS_ENUM_CLEANUP: + case PK_STATUS_ENUM_REMOVE: + plugin_status = GS_PLUGIN_STATUS_REMOVING; + break; + case PK_STATUS_ENUM_REQUEST: + case PK_STATUS_ENUM_QUERY: + case PK_STATUS_ENUM_INFO: + case PK_STATUS_ENUM_DEP_RESOLVE: + plugin_status = GS_PLUGIN_STATUS_QUERYING; + break; + default: + g_warning ("no mapping for %s", + pk_status_enum_to_string (status)); + break; + } + return plugin_status; +} + +gboolean +gs_plugin_packagekit_error_convert (GError **error, + GCancellable *check_cancellable) +{ + GError *error_tmp; + + if (error == NULL) + return FALSE; + + if (*error != NULL) + g_dbus_error_strip_remote_error (*error); + + /* these are allowed for low-level errors */ + if (gs_utils_error_convert_gio (error)) + return TRUE; + + /* not set */ + error_tmp = *error; + if (error_tmp == NULL) + return FALSE; + + /* already correct */ + if (error_tmp->domain == GS_PLUGIN_ERROR) + return TRUE; + + /* get a local version */ + if (error_tmp->domain != PK_CLIENT_ERROR) + return FALSE; + + if (g_cancellable_is_cancelled (check_cancellable)) { + error_tmp->domain = GS_PLUGIN_ERROR; + error_tmp->code = GS_PLUGIN_ERROR_CANCELLED; + return TRUE; + } + + /* daemon errors */ + if (error_tmp->code <= 0xff) { + switch (error_tmp->code) { + case PK_CLIENT_ERROR_NOT_SUPPORTED: + error_tmp->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + break; + #if PK_CHECK_VERSION(1, 2, 4) + case PK_CLIENT_ERROR_DECLINED_INTERACTION: + error_tmp->code = GS_PLUGIN_ERROR_CANCELLED; + break; + #else + case PK_CLIENT_ERROR_FAILED: + /* The text is not localized on the PackageKit side and it uses a generic error code + * FIXME: This can be dropped when we depend on a + * PackageKit version which includes https://github.com/PackageKit/PackageKit/pull/497 */ + if (g_strcmp0 (error_tmp->message, "user declined interaction") == 0) + error_tmp->code = GS_PLUGIN_ERROR_CANCELLED; + else + error_tmp->code = GS_PLUGIN_ERROR_FAILED; + break; + #endif + /* this is working around a bug in libpackagekit-glib */ + case PK_ERROR_ENUM_TRANSACTION_CANCELLED: + error_tmp->code = GS_PLUGIN_ERROR_CANCELLED; + break; + case PK_CLIENT_ERROR_CANNOT_START_DAEMON: + case PK_CLIENT_ERROR_INVALID_FILE: + default: + error_tmp->code = GS_PLUGIN_ERROR_FAILED; + break; + } + + /* backend errors */ + } else { + switch (error_tmp->code - 0xff) { + case PK_ERROR_ENUM_NOT_SUPPORTED: + error_tmp->code = GS_PLUGIN_ERROR_NOT_SUPPORTED; + break; + case PK_ERROR_ENUM_NO_CACHE: + case PK_ERROR_ENUM_NO_NETWORK: + error_tmp->code = GS_PLUGIN_ERROR_NO_NETWORK; + break; + case PK_ERROR_ENUM_PACKAGE_DOWNLOAD_FAILED: + case PK_ERROR_ENUM_NO_MORE_MIRRORS_TO_TRY: + case PK_ERROR_ENUM_CANNOT_FETCH_SOURCES: + error_tmp->code = GS_PLUGIN_ERROR_DOWNLOAD_FAILED; + break; + case PK_ERROR_ENUM_BAD_GPG_SIGNATURE: + case PK_ERROR_ENUM_CANNOT_INSTALL_REPO_UNSIGNED: + case PK_ERROR_ENUM_CANNOT_UPDATE_REPO_UNSIGNED: + case PK_ERROR_ENUM_GPG_FAILURE: + case PK_ERROR_ENUM_MISSING_GPG_SIGNATURE: + case PK_ERROR_ENUM_NO_LICENSE_AGREEMENT: + case PK_ERROR_ENUM_NOT_AUTHORIZED: + case PK_ERROR_ENUM_RESTRICTED_DOWNLOAD: + error_tmp->code = GS_PLUGIN_ERROR_NO_SECURITY; + break; + case PK_ERROR_ENUM_NO_SPACE_ON_DEVICE: + error_tmp->code = GS_PLUGIN_ERROR_NO_SPACE; + break; + case PK_ERROR_ENUM_CANCELLED_PRIORITY: + case PK_ERROR_ENUM_TRANSACTION_CANCELLED: + error_tmp->code = GS_PLUGIN_ERROR_CANCELLED; + break; + case PK_ERROR_ENUM_INVALID_PACKAGE_FILE: + case PK_ERROR_ENUM_PACKAGE_INSTALL_BLOCKED: + default: + error_tmp->code = GS_PLUGIN_ERROR_FAILED; + break; + } + } + error_tmp->domain = GS_PLUGIN_ERROR; + return TRUE; +} + +gboolean +gs_plugin_packagekit_results_valid (PkResults *results, + GCancellable *check_cancellable, + GError **error) +{ + g_autoptr(PkError) error_code = NULL; + + /* method failed? */ + if (results == NULL) { + gs_plugin_packagekit_error_convert (error, check_cancellable); + return FALSE; + } + + /* check error code */ + error_code = pk_results_get_error_code (results); + if (error_code != NULL) { + g_set_error_literal (error, + PK_CLIENT_ERROR, + pk_error_get_code (error_code), + pk_error_get_details (error_code)); + gs_plugin_packagekit_error_convert (error, check_cancellable); + return FALSE; + } + + /* all good */ + return TRUE; +} + +gboolean +gs_plugin_packagekit_add_results (GsPlugin *plugin, + GsAppList *list, + PkResults *results, + GError **error) +{ + const gchar *package_id; + guint i; + PkPackage *package; + g_autoptr(GHashTable) installed = NULL; + g_autoptr(PkError) error_code = NULL; + g_autoptr(GPtrArray) array_filtered = NULL; + g_autoptr(GPtrArray) array = NULL; + + g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); + + /* check error code */ + error_code = pk_results_get_error_code (results); + if (error_code != NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "failed to get-packages: %s, %s", + pk_error_enum_to_string (pk_error_get_code (error_code)), + pk_error_get_details (error_code)); + return FALSE; + } + + /* add all installed packages to a hash */ + installed = g_hash_table_new (g_str_hash, g_str_equal); + array = pk_results_get_package_array (results); + for (i = 0; i < array->len; i++) { + package = g_ptr_array_index (array, i); + if (pk_package_get_info (package) != PK_INFO_ENUM_INSTALLED) + continue; + g_hash_table_insert (installed, + (const gpointer) pk_package_get_name (package), + (const gpointer) pk_package_get_id (package)); + } + + /* if the search returns more than one package with the same name, + * ignore everything with that name except the installed package */ + array_filtered = g_ptr_array_new (); + for (i = 0; i < array->len; i++) { + package = g_ptr_array_index (array, i); + package_id = g_hash_table_lookup (installed, pk_package_get_name (package)); + if (pk_package_get_info (package) == PK_INFO_ENUM_INSTALLED || package_id == NULL) { + g_ptr_array_add (array_filtered, package); + } else { + g_debug ("ignoring available %s as installed %s also reported", + pk_package_get_id (package), package_id); + } + } + + /* process packages */ + for (i = 0; i < array_filtered->len; i++) { + g_autoptr(GsApp) app = NULL; + GsAppState state = GS_APP_STATE_UNKNOWN; + package = g_ptr_array_index (array_filtered, i); + + app = gs_plugin_cache_lookup (plugin, pk_package_get_id (package)); + if (app == NULL) { + app = gs_app_new (NULL); + gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_app_set_management_plugin (app, plugin); + gs_app_add_source (app, pk_package_get_name (package)); + gs_app_add_source_id (app, pk_package_get_id (package)); + gs_plugin_packagekit_set_package_name (app, package); + gs_plugin_cache_add (plugin, pk_package_get_id (package), app); + } + gs_app_set_name (app, + GS_APP_QUALITY_LOWEST, + pk_package_get_name (package)); + gs_app_set_summary (app, + GS_APP_QUALITY_LOWEST, + pk_package_get_summary (package)); + gs_app_set_metadata (app, "GnomeSoftware::Creator", + gs_plugin_get_name (plugin)); + gs_app_set_version (app, pk_package_get_version (package)); + switch (pk_package_get_info (package)) { + case PK_INFO_ENUM_INSTALLED: + state = GS_APP_STATE_INSTALLED; + break; + case PK_INFO_ENUM_AVAILABLE: + state = GS_APP_STATE_AVAILABLE; + break; +#if PK_CHECK_VERSION(1, 3, 0) + case PK_INFO_ENUM_INSTALL: +#endif + case PK_INFO_ENUM_INSTALLING: + case PK_INFO_ENUM_UPDATING: +#if PK_CHECK_VERSION(1, 3, 0) + case PK_INFO_ENUM_OBSOLETE: + case PK_INFO_ENUM_DOWNGRADE: +#endif + case PK_INFO_ENUM_DOWNGRADING: + case PK_INFO_ENUM_OBSOLETING: + case PK_INFO_ENUM_UNTRUSTED: + break; + case PK_INFO_ENUM_UNAVAILABLE: +#if PK_CHECK_VERSION(1, 3, 0) + case PK_INFO_ENUM_REMOVE: +#endif + case PK_INFO_ENUM_REMOVING: + state = GS_APP_STATE_UNAVAILABLE; + break; + default: + g_warning ("unknown info state of %s", + pk_info_enum_to_string (pk_package_get_info (package))); + } + if (state != GS_APP_STATE_UNKNOWN && gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, state); + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN) + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_list_add (list, app); + } + return TRUE; +} + +void +gs_plugin_packagekit_resolve_packages_app (GsPlugin *plugin, + GPtrArray *packages, + GsApp *app) +{ + GPtrArray *sources; + PkPackage *package; + const gchar *pkgname; + guint i, j; + guint number_available = 0; + guint number_installed = 0; + + /* find any packages that match the package name */ + number_installed = 0; + number_available = 0; + sources = gs_app_get_sources (app); + for (j = 0; j < sources->len; j++) { + pkgname = g_ptr_array_index (sources, j); + for (i = 0; i < packages->len; i++) { + package = g_ptr_array_index (packages, i); + if (g_strcmp0 (pk_package_get_name (package), pkgname) == 0) { + gs_plugin_packagekit_set_metadata_from_package (plugin, app, package); + switch (pk_package_get_info (package)) { + case PK_INFO_ENUM_INSTALLED: + number_installed++; + break; + case PK_INFO_ENUM_AVAILABLE: + number_available++; + break; + case PK_INFO_ENUM_UNAVAILABLE: + number_available++; + break; + default: + /* should we expect anything else? */ + break; + } + } + } + } + + /* if *all* the source packages for the app are installed then the + * application is considered completely installed */ + if (number_installed == sources->len && number_available == 0) { + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + } else if (number_installed + number_available == sources->len) { + /* the appstream plugin can mark the app as installed, even if it is not installed, + when it only has the same app ID with another package (like differently built + drivers for the distribution, where each build has enabled different features) */ + if (gs_app_get_state (app) == GS_APP_STATE_INSTALLED) + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + /* if all the source packages are installed and all the rest + * of the packages are available then the app is available */ + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + } else if (number_installed + number_available > sources->len) { + /* we have more packages returned than source packages */ + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + } else if (number_installed + number_available < sources->len) { + g_autofree gchar *tmp = NULL; + /* we have less packages returned than source packages */ + tmp = gs_app_to_string (app); + g_debug ("Failed to find all packages for:\n%s", tmp); + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + } +} + +void +gs_plugin_packagekit_set_metadata_from_package (GsPlugin *plugin, + GsApp *app, + PkPackage *package) +{ + const gchar *data; + + gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_app_set_management_plugin (app, plugin); + gs_app_add_source (app, pk_package_get_name (package)); + gs_app_add_source_id (app, pk_package_get_id (package)); + gs_plugin_packagekit_set_package_name (app, package); + + /* set origin */ + if (gs_app_get_origin (app) == NULL) { + data = pk_package_get_data (package); + if (g_str_has_prefix (data, "installed:")) + data += 10; + gs_app_set_origin (app, data); + } + + /* set unavailable state */ + if (pk_package_get_info (package) == PK_INFO_ENUM_UNAVAILABLE) { + gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + if (gs_app_get_size_installed (app, NULL) == GS_SIZE_TYPE_UNKNOWN) + gs_app_set_size_installed (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + if (gs_app_get_size_download (app, NULL) == GS_SIZE_TYPE_UNKNOWN) + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + } else if (pk_package_get_info (package) == PK_INFO_ENUM_AVAILABLE && + gs_app_get_state (app) == GS_APP_STATE_UPDATABLE) { + if (gs_app_get_update_version (app) == NULL) + gs_app_set_update_version (app, pk_package_get_version (package)); + } else if (gs_app_get_version (app) == NULL) { + gs_app_set_version (app, pk_package_get_version (package)); + } + gs_app_set_name (app, + GS_APP_QUALITY_LOWEST, + pk_package_get_name (package)); + gs_app_set_summary (app, + GS_APP_QUALITY_LOWEST, + pk_package_get_summary (package)); +} + +/* Hash functions which compare PkPackageIds on NAME, VERSION and ARCH, but not DATA. + * This is because some backends do not append the origin. + * + * Borrowing some implementation details from pk-package-id.c, a package + * ID is a semicolon-separated list of NAME;[VERSION];[ARCH];[DATA], + * so a comparison which ignores DATA is just a strncmp() up to and + * including the final semicolon. + * + * Doing it this way means zero allocations, which allows the hash and + * equality functions to be fast. This is important when dealing with + * large refine() package lists. + * + * The hash and equality functions assume that the IDs they are passed are + * valid. */ +static guint +package_id_hash (gconstpointer key) +{ + const gchar *package_id = key; + gchar *no_data; + gsize i, last_semicolon = 0; + + /* find the last semicolon, which starts the DATA section */ + for (i = 0; package_id[i] != '\0'; i++) { + if (package_id[i] == ';') + last_semicolon = i; + } + + /* exit early if the DATA section was empty */ + if (last_semicolon + 1 == i) + return g_str_hash (package_id); + + /* extract up to (and including) the last semicolon into a local string */ + no_data = g_alloca (last_semicolon + 2); + memcpy (no_data, package_id, last_semicolon + 1); + no_data[last_semicolon + 1] = '\0'; + + return g_str_hash (no_data); +} + +static gboolean +package_id_equal (gconstpointer a, + gconstpointer b) +{ + const gchar *package_id_a = a; + const gchar *package_id_b = b; + gsize i, n_semicolons = 0; + + /* compare up to and including the last semicolon */ + for (i = 0; package_id_a[i] != '\0' && package_id_b[i] != '\0'; i++) { + if (package_id_a[i] != package_id_b[i]) + return FALSE; + if (package_id_a[i] == ';') + n_semicolons++; + if (n_semicolons == 4) + return TRUE; + } + + return package_id_a[i] == package_id_b[i]; +} + +GHashTable * +gs_plugin_packagekit_details_array_to_hash (GPtrArray *array) +{ + g_autoptr(GHashTable) details_collection = NULL; + + details_collection = g_hash_table_new_full (package_id_hash, package_id_equal, + NULL, NULL); + + for (gsize i = 0; i < array->len; i++) { + PkDetails *details = g_ptr_array_index (array, i); + g_hash_table_insert (details_collection, + (void *) pk_details_get_package_id (details), + details); + } + + return g_steal_pointer (&details_collection); +} + +void +gs_plugin_packagekit_refine_details_app (GsPlugin *plugin, + GHashTable *details_collection, + GHashTable *prepared_updates, + GsApp *app) +{ + GPtrArray *source_ids; + PkDetails *details; + const gchar *package_id; + guint j; + guint64 download_size = 0, install_size = 0; + + /* @source_ids can have as many as 200 elements (google-noto); typically + * it has 1 or 2 + * + * @details_collection is typically a large list of apps in the + * repository, on the order of 400 or 700 apps */ + source_ids = gs_app_get_source_ids (app); + for (j = 0; j < source_ids->len; j++) { + guint64 download_sz; + + package_id = g_ptr_array_index (source_ids, j); + details = g_hash_table_lookup (details_collection, package_id); + if (details == NULL) + continue; + + if (gs_app_get_license (app) == NULL && + pk_details_get_license (details) != NULL && + g_ascii_strcasecmp (pk_details_get_license (details), "unknown") != 0) { + g_autofree gchar *license_spdx = NULL; + license_spdx = as_license_to_spdx_id (pk_details_get_license (details)); + if (license_spdx != NULL && g_ascii_strcasecmp (license_spdx, "unknown") == 0) { + g_clear_pointer (&license_spdx, g_free); + license_spdx = g_strdup (pk_details_get_license (details)); + if (license_spdx != NULL) + g_strstrip (license_spdx); + } + if (license_spdx != NULL) { + gs_app_set_license (app, + GS_APP_QUALITY_LOWEST, + license_spdx); + } + } + if (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE) == NULL) { + gs_app_set_url (app, + AS_URL_KIND_HOMEPAGE, + pk_details_get_url (details)); + } + if (gs_app_get_description (app) == NULL) { + gs_app_set_description (app, + GS_APP_QUALITY_LOWEST, + pk_details_get_description (details)); + } + install_size += pk_details_get_size (details); + download_sz = pk_details_get_download_size (details); + + /* If the package is already prepared as part of an offline + * update, no additional downloads need to be done. */ + if (download_sz != G_MAXUINT64 && + !g_hash_table_contains (prepared_updates, package_id)) + download_size += download_sz; + } + + /* the size is the size of all sources */ + if (gs_app_get_state (app) == GS_APP_STATE_UPDATABLE) { + if (install_size > 0 && gs_app_get_size_installed (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, install_size); + if (download_size > 0 && gs_app_get_size_download (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, download_size); + } else if (gs_app_is_installed (app)) { + if (gs_app_get_size_download (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + if (install_size > 0 && gs_app_get_size_installed (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, install_size); + } else { + if (install_size > 0 && gs_app_get_size_installed (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, install_size); + if (download_size > 0 && gs_app_get_size_download (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, download_size); + } +} + +void +gs_plugin_packagekit_set_packaging_format (GsPlugin *plugin, GsApp *app) +{ + if (gs_plugin_check_distro_id (plugin, "fedora") || + gs_plugin_check_distro_id (plugin, "rhel")) { + gs_app_set_metadata (app, "GnomeSoftware::PackagingFormat", "RPM"); + } else if (gs_plugin_check_distro_id (plugin, "debian") || + gs_plugin_check_distro_id (plugin, "ubuntu")) { + gs_app_set_metadata (app, "GnomeSoftware::PackagingFormat", "deb"); + } else { + return; + } + + gs_app_set_metadata (app, "GnomeSoftware::PackagingBaseCssColor", "error_color"); +} + +void +gs_plugin_packagekit_set_package_name (GsApp *app, + PkPackage *package) +{ + g_autofree gchar *tmp = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (PK_IS_PACKAGE (package)); + + if (gs_app_get_metadata_item (app, "GnomeSoftware::packagename-value") != NULL) + return; + + tmp = g_strdup_printf ("%s-%s.%s", + pk_package_get_name (package), + pk_package_get_version (package), + pk_package_get_arch (package)); + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", tmp); +} diff --git a/plugins/packagekit/packagekit-common.h b/plugins/packagekit/packagekit-common.h new file mode 100644 index 0000000..94dc62a --- /dev/null +++ b/plugins/packagekit/packagekit-common.h @@ -0,0 +1,44 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include + +G_BEGIN_DECLS + +GsPluginStatus packagekit_status_enum_to_plugin_status (PkStatusEnum status); + +gboolean gs_plugin_packagekit_add_results (GsPlugin *plugin, + GsAppList *list, + PkResults *results, + GError **error); +gboolean gs_plugin_packagekit_error_convert (GError **error, + GCancellable *check_cancellable); +gboolean gs_plugin_packagekit_results_valid (PkResults *results, + GCancellable *check_cancellable, + GError **error); +void gs_plugin_packagekit_resolve_packages_app (GsPlugin *plugin, + GPtrArray *packages, + GsApp *app); +void gs_plugin_packagekit_set_metadata_from_package (GsPlugin *plugin, + GsApp *app, + PkPackage *package); +GHashTable * gs_plugin_packagekit_details_array_to_hash (GPtrArray *array); +void gs_plugin_packagekit_refine_details_app (GsPlugin *plugin, + GHashTable *details_collection, + GHashTable *prepared_updates, + GsApp *app); +void gs_plugin_packagekit_set_packaging_format (GsPlugin *plugin, + GsApp *app); +void gs_plugin_packagekit_set_package_name (GsApp *app, + PkPackage *package); +G_END_DECLS diff --git a/plugins/packagekit/tests/build-rpm.sh b/plugins/packagekit/tests/build-rpm.sh new file mode 100755 index 0000000..90a4163 --- /dev/null +++ b/plugins/packagekit/tests/build-rpm.sh @@ -0,0 +1,2 @@ +rpmbuild -ba chiron.spec +cp ~/rpmbuild/RPMS/*/chiron*.rpm . diff --git a/plugins/packagekit/tests/chiron-1.1-1.fc24.x86_64.rpm b/plugins/packagekit/tests/chiron-1.1-1.fc24.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..1453f485c353db00c2d8cb1d5ab27b1e7a520664 GIT binary patch literal 6414 zcmeI0Yitx%6vyv&mxl$Uhy*lhhv0`6JG(oxvoBz=N$Wzj3X~#+2skr)XLsW6&SYk` zwlxM!OyGkNABlkk35d@aB@#nOcvy^&@JS^EjA&3v2q2(_h#HFZoY@03`pK_m2JZgv z@1A?l-1*PlZE`NYd+B7D!4=X=rejq_DJnrTbXmdC|8|AgxPLBq{=Ksy8XM18Q!n%v zLYn~nPS7T}@f1*q`4`L$pM_ooS{pRv3!pHc#i7Cc@Xw$aZ-<8QUqCSq`I?xjXu6!x zvasQYcvp_14X`t_&hPzKd#p~Fm^lfMNs5c;!B`d_t->? zbr8(=9PzK97~evC1r+1ki2ne^e7lIT&VljW#Mg)q6aPj0d7UGe8{3z}xE4!C$A~dE z@^RuuP@MlY@gz|6=Ud{*bq?K4j6T5pkN^sPM5cnm{LsC`=rJ<+5ka3|51}Z!@twpch+9B0|7B3zPo_SOuhZu&DCBQ|d-^<&SR&4Y z!uo~|;zgh^x1o<1_lf)%aTh4&dz={OVY~o}`(Fi$@iH;4!}znHxW6?N-$cBYcr&pE ziu>70jCp~>HDXRYL~Ia0O^o-&`Rj?vx9}EX%me!gZzJvph5d$i5My5azPt$v?{fOf zpg4bDJwE+2P|SY-xr5c~kqqjQ(ENJja|@N0sea>E*Pfc zdV;MwYSB^cl3-T-VLqT%Y*=Wk`V(pq*4kW$xn&-0Y#h7X<+@cZ++2?bYi0AaSIU;I zmP?k44~*BMrQQAVeQZS)6Pbp|3#{aM_Pkh3lGD*R{F7n~c3B%>1DVvilu}>Do_W2V zk0-Rat|)RgW9X7DDOuIf3`NgmvnfN%%8Hy;xgv2TrDU~iLeW(vo6KeR{PY{mJfPwVy9_xM2?5SVG}0w{NJGCBPg-l$a7tMdQBW zXEG}LeF?&%qvIE7WpiJ9kExebrywk@6-(R|7C3coF9EwIkLp%sp&$x=#hQsiSJm`P zwJh{=$2F}gyYbotNl8hmWFjlY(K>i!zhNKFC!08?ucpoMAZ?)f3?u)g03sgmJq~>|B>$($m|OU$t)ek`+B259DCE z!3T71d$36t!1dr<*hGF+TU|(?>9dkdo*+OOzgvH+jqTxpw^ks9NBnq?gz7`4!&(3 z%D2y%-Ftdj;>TgeihGK~hd0af=l}L;^A|6DrOmi}`MC V=it@3zl(d%ox02aO>bPa`fv2!#$^Bi literal 0 HcmV?d00001 diff --git a/plugins/packagekit/tests/chiron.spec b/plugins/packagekit/tests/chiron.spec new file mode 100644 index 0000000..6cbba7e --- /dev/null +++ b/plugins/packagekit/tests/chiron.spec @@ -0,0 +1,22 @@ +Summary: Single line synopsis +Name: chiron +Version: 1.1 +Release: 1%{?dist} +URL: http://127.0.0.1/ +License: GPLv2+ + +%description +This is the first paragraph in the example package spec file. + +This is the second paragraph. + +%install +mkdir -p $RPM_BUILD_ROOT/%{_bindir} +touch $RPM_BUILD_ROOT/%{_bindir}/chiron + +%files +%{_bindir}/chiron + +%changelog +* Tue Apr 26 2016 Richard Hughes - 1.1-1 +- Initial version diff --git a/plugins/repos/gs-plugin-repos.c b/plugins/repos/gs-plugin-repos.c new file mode 100644 index 0000000..a1f60d9 --- /dev/null +++ b/plugins/repos/gs-plugin-repos.c @@ -0,0 +1,425 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * Copyright (C) 2017-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include + +#include "gs-plugin-repos.h" + +/* + * SECTION: + * Plugin to set URLs and origin hostnames on repos and apps using data from + * `/etc/yum.repos.d` + * + * This plugin is only useful on distributions which use `/etc/yum.repos.d`. + * + * It enumerates `/etc/yum.repos.d` in a worker thread and updates its internal + * hash tables and state from that worker thread (while holding a lock). + * + * Other tasks on the plugin access the data synchronously, not using a worker + * thread. Data accesses should be fast. + */ + +struct _GsPluginRepos { + GsPlugin parent; + + /* These hash tables are replaced by a worker thread. They are immutable + * once set, and will only be replaced with a new hash table instance. + * This means they are safe to access from the refine function in the + * main thread with a strong reference and no lock. + * + * @mutex must be held when getting a strong reference to them, or + * replacing them. */ + GHashTable *fns; /* origin : filename */ + GHashTable *urls; /* origin : url */ + + GFileMonitor *monitor; + gchar *reposdir; + + GMutex mutex; + + /* Used to cancel a pending update operation which is loading the repos + * data in a worker thread. */ + GCancellable *update_cancellable; /* (nullable) (owned) */ +}; + +G_DEFINE_TYPE (GsPluginRepos, gs_plugin_repos, GS_TYPE_PLUGIN) + +static void +gs_plugin_repos_init (GsPluginRepos *self) +{ + GsPlugin *plugin = GS_PLUGIN (self); + + g_mutex_init (&self->mutex); + + /* for debugging and the self tests */ + self->reposdir = g_strdup (g_getenv ("GS_SELF_TEST_REPOS_DIR")); + if (self->reposdir == NULL) + self->reposdir = g_strdup ("/etc/yum.repos.d"); + + /* plugin only makes sense if this exists at startup */ + if (!g_file_test (self->reposdir, G_FILE_TEST_EXISTS)) { + gs_plugin_set_enabled (plugin, FALSE); + return; + } + + /* need pkgname */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "appstream"); +} + +static void +gs_plugin_repos_dispose (GObject *object) +{ + GsPluginRepos *self = GS_PLUGIN_REPOS (object); + + g_cancellable_cancel (self->update_cancellable); + g_clear_object (&self->update_cancellable); + g_clear_pointer (&self->reposdir, g_free); + g_clear_pointer (&self->fns, g_hash_table_unref); + g_clear_pointer (&self->urls, g_hash_table_unref); + g_clear_object (&self->monitor); + + G_OBJECT_CLASS (gs_plugin_repos_parent_class)->dispose (object); +} + +static void +gs_plugin_repos_finalize (GObject *object) +{ + GsPluginRepos *self = GS_PLUGIN_REPOS (object); + + g_mutex_clear (&self->mutex); + + G_OBJECT_CLASS (gs_plugin_repos_parent_class)->finalize (object); +} + +/* Run in a worker thread; will take the mutex */ +static gboolean +gs_plugin_repos_load (GsPluginRepos *self, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GDir) dir = NULL; + const gchar *fn; + g_autoptr(GHashTable) new_filenames = NULL; + g_autoptr(GHashTable) new_urls = NULL; + g_autoptr(GMutexLocker) locker = NULL; + + new_filenames = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + new_urls = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + /* search all files */ + dir = g_dir_open (self->reposdir, 0, error); + if (dir == NULL) { + gs_utils_error_convert_gio (error); + return FALSE; + } + while ((fn = g_dir_read_name (dir)) != NULL) { + g_autofree gchar *filename = NULL; + g_auto(GStrv) groups = NULL; + g_autoptr(GKeyFile) kf = g_key_file_new (); + guint i; + + /* not a repo */ + if (!g_str_has_suffix (fn, ".repo")) + continue; + + /* load file */ + filename = g_build_filename (self->reposdir, fn, NULL); + if (!g_key_file_load_from_file (kf, filename, + G_KEY_FILE_NONE, + error)) { + gs_utils_error_convert_gio (error); + return FALSE; + } + + /* we can have multiple repos in one file */ + groups = g_key_file_get_groups (kf, NULL); + for (i = 0; groups[i] != NULL; i++) { + g_autofree gchar *baseurl = NULL, *metalink = NULL; + + g_hash_table_insert (new_filenames, + g_strdup (groups[i]), + g_strdup (filename)); + + baseurl = g_key_file_get_string (kf, groups[i], "baseurl", NULL); + if (baseurl != NULL) { + g_hash_table_insert (new_urls, + g_strdup (groups[i]), + g_steal_pointer (&baseurl)); + continue; + } + + metalink = g_key_file_get_string (kf, groups[i], "metalink", NULL); + if (metalink != NULL) { + g_hash_table_insert (new_urls, + g_strdup (groups[i]), + g_steal_pointer (&metalink)); + continue; + } + } + } + + /* success; replace the hash table pointers in the object while the lock + * is held */ + locker = g_mutex_locker_new (&self->mutex); + + g_clear_pointer (&self->fns, g_hash_table_unref); + self->fns = g_steal_pointer (&new_filenames); + g_clear_pointer (&self->urls, g_hash_table_unref); + self->urls = g_steal_pointer (&new_urls); + + g_assert (self->fns != NULL && self->urls != NULL); + + return TRUE; +} + +/* Run in a worker thread. */ +static void +update_repos_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginRepos *self = GS_PLUGIN_REPOS (source_object); + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_repos_load (self, cancellable, &local_error)) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +/* Run in the main thread. */ +static void +gs_plugin_repos_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GsPluginRepos *self = GS_PLUGIN_REPOS (user_data); + g_autoptr(GTask) task = NULL; + + /* Cancel any pending updates and schedule a new update of the repo data + * in a worker thread. */ + g_cancellable_cancel (self->update_cancellable); + g_clear_object (&self->update_cancellable); + self->update_cancellable = g_cancellable_new (); + + task = g_task_new (self, self->update_cancellable, NULL, NULL); + g_task_set_source_tag (task, gs_plugin_repos_changed_cb); + g_task_run_in_thread (task, update_repos_thread_cb); +} + +static void +gs_plugin_repos_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRepos *self = GS_PLUGIN_REPOS (plugin); + g_autoptr(GFile) file = g_file_new_for_path (self->reposdir); + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_repos_setup_async); + + /* watch for changes in the main thread */ + self->monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, cancellable, &local_error); + if (self->monitor == NULL) { + gs_utils_error_convert_gio (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_signal_connect (self->monitor, "changed", + G_CALLBACK (gs_plugin_repos_changed_cb), self); + + /* Set up the repos at startup. */ + g_task_run_in_thread (task, update_repos_thread_cb); +} + +static gboolean +gs_plugin_repos_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_repos_shutdown_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRepos *self = GS_PLUGIN_REPOS (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_repos_shutdown_async); + + /* Cancel any ongoing update operations. */ + g_cancellable_cancel (self->update_cancellable); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_repos_shutdown_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +refine_app (GsApp *app, + GsPluginRefineFlags flags, + GHashTable *filenames, + GHashTable *urls) +{ + const gchar *tmp; + + /* not required */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME) == 0) + return; + if (gs_app_get_origin_hostname (app) != NULL) + return; + + /* make sure we don't end up refining flatpak repos */ + if (gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_PACKAGE) + return; + + /* find hostname */ + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_REPOSITORY: + if (gs_app_get_id (app) == NULL) + return; + tmp = g_hash_table_lookup (urls, gs_app_get_id (app)); + if (tmp != NULL) + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, tmp); + break; + default: + if (gs_app_get_origin (app) == NULL) + return; + tmp = g_hash_table_lookup (urls, gs_app_get_origin (app)); + if (tmp != NULL) + gs_app_set_origin_hostname (app, tmp); + else { + GHashTableIter iter; + gpointer key, value; + const gchar *origin; + + origin = gs_app_get_origin (app); + + /* Some repos, such as rpmfusion, can have set the name with a distribution + number in the appstream file, thus check those specifically */ + g_hash_table_iter_init (&iter, urls); + while (g_hash_table_iter_next (&iter, &key, &value)) { + if (g_str_has_prefix (origin, key)) { + const gchar *rest = origin + strlen (key); + while (*rest == '-' || (*rest >= '0' && *rest <= '9')) + rest++; + if (!*rest) { + gs_app_set_origin_hostname (app, value); + break; + } + } + } + } + break; + } + + /* find filename */ + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_REPOSITORY: + if (gs_app_get_id (app) == NULL) + return; + tmp = g_hash_table_lookup (filenames, gs_app_get_id (app)); + if (tmp != NULL) + gs_app_set_metadata (app, "repos::repo-filename", tmp); + break; + default: + break; + } +} + +static void +gs_plugin_repos_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRepos *self = GS_PLUGIN_REPOS (plugin); + g_autoptr(GHashTable) filenames = NULL; /* (element-type utf8 filename) mapping origin to filename */ + g_autoptr(GHashTable) urls = NULL; /* (element-type utf8 utf8) mapping origin to URL */ + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_repos_refine_async); + + /* nothing to do here */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME) == 0) { + g_task_return_boolean (task, TRUE); + return; + } + + /* Grab a reference to the object’s state so it can be accessed without + * holding the lock throughout, to keep the critical section small. */ + locker = g_mutex_locker_new (&self->mutex); + filenames = g_hash_table_ref (self->fns); + urls = g_hash_table_ref (self->urls); + g_clear_pointer (&locker, g_mutex_locker_free); + + /* Update each of the apps */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + refine_app (app, flags, filenames, urls); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_repos_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_repos_class_init (GsPluginReposClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_repos_dispose; + object_class->finalize = gs_plugin_repos_finalize; + + plugin_class->setup_async = gs_plugin_repos_setup_async; + plugin_class->setup_finish = gs_plugin_repos_setup_finish; + plugin_class->shutdown_async = gs_plugin_repos_shutdown_async; + plugin_class->shutdown_finish = gs_plugin_repos_shutdown_finish; + plugin_class->refine_async = gs_plugin_repos_refine_async; + plugin_class->refine_finish = gs_plugin_repos_refine_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_REPOS; +} diff --git a/plugins/repos/gs-plugin-repos.h b/plugins/repos/gs-plugin-repos.h new file mode 100644 index 0000000..503def5 --- /dev/null +++ b/plugins/repos/gs-plugin-repos.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_REPOS (gs_plugin_repos_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginRepos, gs_plugin_repos, GS, PLUGIN_REPOS, GsPlugin) + +G_END_DECLS diff --git a/plugins/repos/gs-self-test.c b/plugins/repos/gs-self-test.c new file mode 100644 index 0000000..b4b2f14 --- /dev/null +++ b/plugins/repos/gs-self-test.c @@ -0,0 +1,71 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gnome-software-private.h" + +#include "gs-test.h" + +static void +gs_plugins_repos_func (GsPluginLoader *plugin_loader) +{ + gboolean ret; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get the extra bits */ + app = gs_app_new ("testrepos.desktop"); + gs_app_set_origin (app, "utopia"); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpstr (gs_app_get_origin_hostname (app), ==, "people.freedesktop.org"); +} + +int +main (int argc, char **argv) +{ + gboolean ret; + g_autofree gchar *reposdir = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + const gchar * const allowlist[] = { + "repos", + NULL + }; + + gs_test_init (&argc, &argv); + + /* dummy data */ + reposdir = gs_test_get_filename (TESTDATADIR, "yum.repos.d"); + g_assert (reposdir != NULL); + g_setenv ("GS_SELF_TEST_REPOS_DIR", reposdir, TRUE); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/repos", + plugin_loader, + (GTestDataFunc) gs_plugins_repos_func); + + return g_test_run (); +} diff --git a/plugins/repos/meson.build b/plugins/repos/meson.build new file mode 100644 index 0000000..236e2a2 --- /dev/null +++ b/plugins/repos/meson.build @@ -0,0 +1,31 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginRepos"'] +cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] + +shared_module( + 'gs_plugin_repos', + sources : 'gs-plugin-repos.c', + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), 'tests') + '"'] + e = executable( + 'gs-self-test-repos', + compiled_schemas, + sources : [ + 'gs-self-test.c' + ], + dependencies : [ + plugin_libs, + ], + c_args : cargs, + ) + test('gs-self-test-repos', e, suite: ['plugins', 'repos'], env: test_env) +endif diff --git a/plugins/repos/tests/yum.repos.d/utopia.repo b/plugins/repos/tests/yum.repos.d/utopia.repo new file mode 100644 index 0000000..e912ec4 --- /dev/null +++ b/plugins/repos/tests/yum.repos.d/utopia.repo @@ -0,0 +1,5 @@ +[utopia] +name=utopia for Fedora $releasever +baseurl=http://people.freedesktop.org/~hughsient/fedora/$releasever/x86_64/ +enabled=1 +gpgcheck=0 diff --git a/plugins/rpm-ostree/gs-plugin-rpm-ostree.c b/plugins/rpm-ostree/gs-plugin-rpm-ostree.c new file mode 100644 index 0000000..74ac632 --- /dev/null +++ b/plugins/rpm-ostree/gs-plugin-rpm-ostree.c @@ -0,0 +1,3667 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017-2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gs-plugin-private.h" +#include "gs-plugin-rpm-ostree.h" +#include "gs-rpmostree-generated.h" + +/* + * SECTION: + * Exposes rpm-ostree system updates and overlays. + * + * The plugin has a worker thread which all operations are delegated to, as + * while the rpm-ostreed API is asynchronous over D-Bus, the plugin also needs + * to use lower level libostree APIs which are entirely synchronous. + * Message passing to the worker thread is by gs_worker_thread_queue(). + */ + +/* This shows up in the `rpm-ostree status` as the software that + * initiated the update. + */ +#define GS_RPMOSTREE_CLIENT_ID PACKAGE_NAME + +/* How long to wait between two consecutive requests, before considering + * the connection to the rpm-ostree daemon inactive and disconnect from it. + */ +#define INACTIVE_TIMEOUT_SECONDS 60 + +G_DEFINE_AUTO_CLEANUP_FREE_FUNC(Header, headerFree, NULL) +G_DEFINE_AUTO_CLEANUP_FREE_FUNC(rpmts, rpmtsFree, NULL); +G_DEFINE_AUTO_CLEANUP_FREE_FUNC(rpmdbMatchIterator, rpmdbFreeIterator, NULL); + +struct _GsPluginRpmOstree { + GsPlugin parent; + + GsWorkerThread *worker; /* (owned) */ + + GMutex mutex; + GsRPMOSTreeOS *os_proxy; + GsRPMOSTreeSysroot *sysroot_proxy; + OstreeRepo *ot_repo; + OstreeSysroot *ot_sysroot; + gboolean update_triggered; + guint inactive_timeout_id; + + GHashTable *cached_sources; /* (nullable) (owned) (element-type utf8 GsApp); sources by id, each value is weak reffed */ + GMutex cached_sources_mutex; +}; + +G_DEFINE_TYPE (GsPluginRpmOstree, gs_plugin_rpm_ostree, GS_TYPE_PLUGIN) + +static gboolean gs_rpm_ostree_refine_apps (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error); + +#define assert_in_worker(self) \ + g_assert (gs_worker_thread_is_in_worker_context (self->worker)) + +static void +cached_sources_weak_ref_cb (gpointer user_data, + GObject *object) +{ + GsPluginRpmOstree *self = user_data; + GHashTableIter iter; + gpointer key, value; + g_autoptr(GMutexLocker) locker = NULL; + + locker = g_mutex_locker_new (&self->cached_sources_mutex); + + g_assert (self->cached_sources != NULL); + + g_hash_table_iter_init (&iter, self->cached_sources); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GObject *repo_object = value; + if (repo_object == object) { + g_hash_table_iter_remove (&iter); + if (!g_hash_table_size (self->cached_sources)) + g_clear_pointer (&self->cached_sources, g_hash_table_unref); + break; + } + } +} + +static void +gs_plugin_rpm_ostree_dispose (GObject *object) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (object); + + g_clear_handle_id (&self->inactive_timeout_id, g_source_remove); + g_clear_object (&self->os_proxy); + g_clear_object (&self->sysroot_proxy); + g_clear_object (&self->ot_sysroot); + g_clear_object (&self->ot_repo); + g_clear_object (&self->worker); + + if (self->cached_sources != NULL) { + GHashTableIter iter; + gpointer value; + + g_hash_table_iter_init (&iter, self->cached_sources); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + GObject *app_repo = value; + g_object_weak_unref (app_repo, cached_sources_weak_ref_cb, self); + } + + g_clear_pointer (&self->cached_sources, g_hash_table_unref); + } + + G_OBJECT_CLASS (gs_plugin_rpm_ostree_parent_class)->dispose (object); +} + +static void +gs_plugin_rpm_ostree_finalize (GObject *object) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (object); + + g_mutex_clear (&self->mutex); + g_mutex_clear (&self->cached_sources_mutex); + + G_OBJECT_CLASS (gs_plugin_rpm_ostree_parent_class)->finalize (object); +} + +static void +gs_plugin_rpm_ostree_init (GsPluginRpmOstree *self) +{ + g_mutex_init (&self->mutex); + g_mutex_init (&self->cached_sources_mutex); + + /* only works on OSTree */ + if (!g_file_test ("/run/ostree-booted", G_FILE_TEST_EXISTS)) { + gs_plugin_set_enabled (GS_PLUGIN (self), FALSE); + return; + } + + /* open transaction */ + rpmReadConfigFiles (NULL, NULL); + + /* rpm-ostree is already a daemon with a DBus API; hence it makes + * more sense to use a custom plugin instead of using PackageKit. + */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_CONFLICTS, "packagekit"); + + /* need pkgname */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "appstream"); + + /* generic updates happen after rpm-ostree updates */ + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_BEFORE, "generic-updates"); +} + +static void +gs_rpmostree_error_convert (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return; + + /* parse remote RPM_OSTREED_ERROR */ + if (g_dbus_error_is_remote_error (error)) { + g_autofree gchar *remote_error = g_dbus_error_get_remote_error (error); + + g_dbus_error_strip_remote_error (error); + + if (g_strcmp0 (remote_error, "org.projectatomic.rpmostreed.Error.NotAuthorized") == 0) { + error->code = GS_PLUGIN_ERROR_NO_SECURITY; + } else if (g_str_has_prefix (remote_error, "org.projectatomic.rpmostreed.Error")) { + error->code = GS_PLUGIN_ERROR_FAILED; + } else if (gs_utils_error_convert_gdbus (perror)) { + return; + } else { + g_warning ("can't reliably fixup remote error %s", remote_error); + error->code = GS_PLUGIN_ERROR_FAILED; + } + error->domain = GS_PLUGIN_ERROR; + return; + } + + /* this are allowed for low-level errors */ + if (gs_utils_error_convert_gio (perror)) + return; + + /* this are allowed for low-level errors */ + if (gs_utils_error_convert_gdbus (perror)) + return; +} + +static void +gs_rpm_ostree_task_return_error_with_gui (GsPluginRpmOstree *self, + GTask *task, + GError *in_error, + const gchar *error_prefix, + gboolean interactive) +{ + g_autoptr(GError) local_error = in_error; + + g_prefix_error (&local_error, "%s", error_prefix); + + if (local_error != NULL && local_error->domain != G_DBUS_ERROR && + !g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_autoptr(GsPluginEvent) event = NULL; + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + } + + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static void +gs_rpmostree_unregister_client_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GError) error = NULL; + + if (!gs_rpmostree_sysroot_call_unregister_client_finish (GS_RPMOSTREE_SYSROOT (source_object), result, &error)) + g_debug ("Failed to unregister client: %s", error->message); + else + g_debug ("Unregistered client from the rpm-ostreed"); +} + +static gboolean +gs_rpmostree_inactive_timeout_cb (gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (user_data); + g_autoptr(GMutexLocker) locker = NULL; + + if (g_source_is_destroyed (g_main_current_source ())) + return G_SOURCE_REMOVE; + + locker = g_mutex_locker_new (&self->mutex); + + /* In case it gets destroyed before the lock is acquired */ + if (!g_source_is_destroyed (g_main_current_source ()) && + self->inactive_timeout_id == g_source_get_id (g_main_current_source ())) { + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + + if (self->sysroot_proxy) { + g_autofree gchar *current_path = gs_rpmostree_sysroot_dup_active_transaction_path (self->sysroot_proxy); + /* Do not unregister the client when there's an ongoing transaction */ + if (current_path != NULL && *current_path != '\0') + return G_SOURCE_CONTINUE; + sysroot_proxy = g_steal_pointer (&self->sysroot_proxy); + } + + g_clear_object (&self->os_proxy); + g_clear_object (&self->sysroot_proxy); + g_clear_object (&self->ot_sysroot); + g_clear_object (&self->ot_repo); + self->inactive_timeout_id = 0; + + g_clear_pointer (&locker, g_mutex_locker_free); + + if (sysroot_proxy) { + g_autoptr(GVariantBuilder) options_builder = NULL; + options_builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_add (options_builder, "{sv}", "id", + g_variant_new_string (GS_RPMOSTREE_CLIENT_ID)); + gs_rpmostree_sysroot_call_unregister_client (sysroot_proxy, + g_variant_builder_end (options_builder), + /* never interactive */ + G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + NULL, + gs_rpmostree_unregister_client_done_cb, + NULL); + } + } + + return G_SOURCE_REMOVE; +} + +/* Hold the plugin mutex when called */ +static gboolean +gs_rpmostree_ref_proxies_locked (GsPluginRpmOstree *self, + gboolean interactive, + GsRPMOSTreeOS **out_os_proxy, + GsRPMOSTreeSysroot **out_sysroot_proxy, + GCancellable *cancellable, + GError **error) +{ + if (self->inactive_timeout_id) { + g_source_remove (self->inactive_timeout_id); + self->inactive_timeout_id = 0; + } + + /* Create a proxy for sysroot */ + if (self->sysroot_proxy == NULL) { + g_autoptr(GVariantBuilder) options_builder = NULL; + + self->sysroot_proxy = gs_rpmostree_sysroot_proxy_new_sync (gs_plugin_get_system_bus_connection (GS_PLUGIN (self)), + G_DBUS_PROXY_FLAGS_NONE, + "org.projectatomic.rpmostree1", + "/org/projectatomic/rpmostree1/Sysroot", + cancellable, + error); + if (self->sysroot_proxy == NULL) { + gs_rpmostree_error_convert (error); + return FALSE; + } + + options_builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_add (options_builder, "{sv}", "id", + g_variant_new_string (GS_RPMOSTREE_CLIENT_ID)); + /* Register as a client so that the rpm-ostree daemon doesn't exit */ + if (!gs_rpmostree_sysroot_call_register_client_sync (self->sysroot_proxy, + g_variant_builder_end (options_builder), + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + error)) { + g_clear_object (&self->sysroot_proxy); + gs_rpmostree_error_convert (error); + return FALSE; + } + + g_debug ("Registered client on the rpm-ostreed"); + } + + /* Create a proxy for currently booted OS */ + if (self->os_proxy == NULL) { + g_autofree gchar *os_object_path = NULL; + + os_object_path = gs_rpmostree_sysroot_dup_booted (self->sysroot_proxy); + if (os_object_path == NULL && + !gs_rpmostree_sysroot_call_get_os_sync (self->sysroot_proxy, + "", + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + &os_object_path, + cancellable, + error)) { + gs_rpmostree_error_convert (error); + g_clear_object (&self->sysroot_proxy); + return FALSE; + } + + self->os_proxy = gs_rpmostree_os_proxy_new_sync (gs_plugin_get_system_bus_connection (GS_PLUGIN (self)), + G_DBUS_PROXY_FLAGS_NONE, + "org.projectatomic.rpmostree1", + os_object_path, + cancellable, + error); + if (self->os_proxy == NULL) { + gs_rpmostree_error_convert (error); + g_clear_object (&self->sysroot_proxy); + return FALSE; + } + } + + /* Load ostree sysroot and repo */ + if (self->ot_sysroot == NULL) { + g_autofree gchar *sysroot_path = NULL; + g_autoptr(GFile) sysroot_file = NULL; + + sysroot_path = gs_rpmostree_sysroot_dup_path (self->sysroot_proxy); + sysroot_file = g_file_new_for_path (sysroot_path); + + self->ot_sysroot = ostree_sysroot_new (sysroot_file); + if (!ostree_sysroot_load (self->ot_sysroot, cancellable, error)) { + gs_rpmostree_error_convert (error); + g_clear_object (&self->sysroot_proxy); + g_clear_object (&self->os_proxy); + g_clear_object (&self->ot_sysroot); + return FALSE; + } + + if (!ostree_sysroot_get_repo (self->ot_sysroot, &self->ot_repo, cancellable, error)) { + gs_rpmostree_error_convert (error); + g_clear_object (&self->sysroot_proxy); + g_clear_object (&self->os_proxy); + g_clear_object (&self->ot_sysroot); + return FALSE; + } + } + + self->inactive_timeout_id = g_timeout_add_seconds (INACTIVE_TIMEOUT_SECONDS, + gs_rpmostree_inactive_timeout_cb, self); + + if (out_os_proxy) + *out_os_proxy = g_object_ref (self->os_proxy); + + if (out_sysroot_proxy) + *out_sysroot_proxy = g_object_ref (self->sysroot_proxy); + + return TRUE; +} + +static gboolean +gs_rpmostree_ref_proxies (GsPluginRpmOstree *self, + gboolean interactive, + GsRPMOSTreeOS **out_os_proxy, + GsRPMOSTreeSysroot **out_sysroot_proxy, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GMutexLocker) locker = NULL; + + locker = g_mutex_locker_new (&self->mutex); + + return gs_rpmostree_ref_proxies_locked (self, interactive, out_os_proxy, out_sysroot_proxy, cancellable, error); +} + +static gint +get_priority_for_interactivity (gboolean interactive) +{ + return interactive ? G_PRIORITY_DEFAULT : G_PRIORITY_LOW; +} + +static void setup_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + + g_debug ("rpm-ostree version: %s", RPM_OSTREE_VERSION_S); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_setup_async); + + /* Start up a worker thread to process all the plugin’s function calls. */ + self->worker = gs_worker_thread_new ("gs-plugin-rpm-ostree"); + + /* Queue a job to set up the D-Bus proxies. While these could be set + * up from the main thread asynchronously, setting them up in the worker + * thread means their signal emissions will correctly be in the worker + * thread, and locking is simpler. */ + gs_worker_thread_queue (self->worker, G_PRIORITY_DEFAULT, + setup_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +setup_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (source_object); + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (!gs_rpmostree_ref_proxies (self, FALSE /* not interactive */, NULL, NULL, cancellable, &local_error)) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_rpm_ostree_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_rpm_ostree_shutdown_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_shutdown_async); + + /* Stop checking for inactivity. */ + g_clear_handle_id (&self->inactive_timeout_id, g_source_remove); + + /* Stop the worker thread. */ + gs_worker_thread_shutdown_async (self->worker, cancellable, shutdown_cb, g_steal_pointer (&task)); +} + +static void +shutdown_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginRpmOstree *self = g_task_get_source_object (task); + g_autoptr(GsWorkerThread) worker = NULL; + g_autoptr(GError) local_error = NULL; + + worker = g_steal_pointer (&self->worker); + + if (!gs_worker_thread_shutdown_finish (worker, result, &local_error)) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_rpm_ostree_shutdown_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +app_set_rpm_ostree_packaging_format (GsApp *app) +{ + gs_app_set_metadata (app, "GnomeSoftware::PackagingFormat", "RPM"); + gs_app_set_metadata (app, "GnomeSoftware::PackagingBaseCssColor", "error_color"); +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app) +{ + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_PACKAGE && + gs_app_get_scope (app) == AS_COMPONENT_SCOPE_SYSTEM) { + gs_app_set_management_plugin (app, plugin); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + app_set_rpm_ostree_packaging_format (app); + } + + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_OPERATING_SYSTEM) { + gs_app_set_management_plugin (app, plugin); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + } +} + +typedef struct { + GsPlugin *plugin; + GError *error; + GMainContext *context; + GsApp *app; + GsAppList *download_progress_list; + gboolean complete; + gboolean owner_changed; +} TransactionProgress; + +static TransactionProgress * +transaction_progress_new (void) +{ + TransactionProgress *self; + + self = g_slice_new0 (TransactionProgress); + self->context = g_main_context_ref_thread_default (); + + return self; +} + +static void +transaction_progress_free (TransactionProgress *self) +{ + g_clear_object (&self->plugin); + g_clear_error (&self->error); + g_main_context_unref (self->context); + g_clear_object (&self->app); + g_clear_object (&self->download_progress_list); + g_slice_free (TransactionProgress, self); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(TransactionProgress, transaction_progress_free); + +static void +transaction_progress_end (TransactionProgress *self) +{ + self->complete = TRUE; + if (self->download_progress_list) + gs_app_list_override_progress (self->download_progress_list, GS_APP_PROGRESS_UNKNOWN); + g_main_context_wakeup (self->context); +} + +static void +on_transaction_progress (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + TransactionProgress *tp = user_data; + + if (g_strcmp0 (signal_name, "PercentProgress") == 0) { + const gchar *message = NULL; + guint32 percentage; + + g_variant_get_child (parameters, 0, "&s", &message); + g_variant_get_child (parameters, 1, "u", &percentage); + g_debug ("PercentProgress: %u, %s\n", percentage, message); + + if (tp->app != NULL) + gs_app_set_progress (tp->app, (guint) percentage); + + if (tp->app != NULL && tp->plugin != NULL) { + GsPluginStatus plugin_status; + + switch (gs_app_get_state (tp->app)) { + case GS_APP_STATE_INSTALLING: + plugin_status = GS_PLUGIN_STATUS_INSTALLING; + break; + case GS_APP_STATE_REMOVING: + plugin_status = GS_PLUGIN_STATUS_REMOVING; + break; + default: + plugin_status = GS_PLUGIN_STATUS_DOWNLOADING; + break; + } + gs_plugin_status_update (tp->plugin, tp->app, plugin_status); + } + } else if (g_strcmp0 (signal_name, "DownloadProgress") == 0) { + guint32 percentage = 0; + guint32 fetched, requested; + g_autofree gchar *params = g_variant_print (parameters, TRUE); + + /* "content" arg */ + g_variant_get_child (parameters, 4, "(uu)", &fetched, &requested); + if (requested > 0) { + gdouble percentage_dbl = ((gdouble) fetched) * 100.0 / requested; + percentage = (guint32) percentage_dbl; + } + g_debug ("%s: %s", signal_name, params); + + if (tp->app != NULL) + gs_app_set_progress (tp->app, (guint) percentage); + if (tp->download_progress_list) + gs_app_list_override_progress (tp->download_progress_list, (guint) percentage); + if (tp->app != NULL && tp->plugin != NULL) + gs_plugin_status_update (tp->plugin, tp->app, GS_PLUGIN_STATUS_DOWNLOADING); + } else if (g_strcmp0 (signal_name, "Finished") == 0) { + if (tp->error == NULL) { + g_autofree gchar *error_message = NULL; + gboolean success = FALSE; + + g_variant_get (parameters, "(bs)", &success, &error_message); + + if (!success) { + tp->error = g_dbus_error_new_for_dbus_error ("org.projectatomic.rpmostreed.Error.Failed", + error_message); + } + } + + transaction_progress_end (tp); + } else { + g_autofree gchar *params = g_variant_print (parameters, TRUE); + g_debug ("Ignoring '%s' signal with params: %s", signal_name, params); + } +} + +static void +on_owner_notify (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + TransactionProgress *tp = user_data; + + tp->owner_changed = TRUE; + + /* Wake up the context so it can notice the server has disappeared. */ + g_main_context_wakeup (tp->context); +} + +static void +cancelled_handler (GCancellable *cancellable, + gpointer user_data) +{ + GsRPMOSTreeTransaction *transaction = user_data; + gs_rpmostree_transaction_call_cancel_sync (transaction, + /* never interactive */ + G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + NULL, NULL); +} + +static gboolean +gs_rpmostree_transaction_get_response_sync (GsRPMOSTreeSysroot *sysroot_proxy, + const gchar *transaction_address, + TransactionProgress *tp, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + GsRPMOSTreeTransaction *transaction = NULL; + g_autoptr(GDBusConnection) peer_connection = NULL; + gint cancel_handler = 0; + gulong signal_handler = 0; + gulong notify_handler = 0; + gboolean success = FALSE; + gboolean just_started = FALSE; + gboolean saw_name_owner = FALSE; + g_autofree gchar *name_owner = NULL; + + peer_connection = g_dbus_connection_new_for_address_sync (transaction_address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, + cancellable, + error); + + if (peer_connection == NULL) + goto out; + + transaction = gs_rpmostree_transaction_proxy_new_sync (peer_connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "/", + cancellable, + error); + if (transaction == NULL) + goto out; + + if (cancellable) { + /* setup cancel handler */ + cancel_handler = g_cancellable_connect (cancellable, + G_CALLBACK (cancelled_handler), + transaction, NULL); + } + + signal_handler = g_signal_connect (transaction, "g-signal", + G_CALLBACK (on_transaction_progress), + tp); + + notify_handler = g_signal_connect (transaction, "notify::g-name-owner", + G_CALLBACK (on_owner_notify), + tp); + + /* Tell the server we're ready to receive signals. */ + if (!gs_rpmostree_transaction_call_start_sync (transaction, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + &just_started, + cancellable, + error)) + goto out; + + /* Process all the signals until we receive the Finished signal or the + * daemon disappears (which can happen if it crashes). + * + * The property can be NULL right after connecting to it, before the D-Bus + * transfers the property value to the client. */ + while (!tp->complete && + !g_cancellable_is_cancelled (cancellable) && + ((name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (transaction))) != NULL || + (!saw_name_owner && !tp->owner_changed))) { + saw_name_owner = saw_name_owner || name_owner != NULL; + g_clear_pointer (&name_owner, g_free); + g_main_context_iteration (tp->context, TRUE); + } + + if (!g_cancellable_set_error_if_cancelled (cancellable, error)) { + if (tp->error) { + g_propagate_error (error, g_steal_pointer (&tp->error)); + } else if (!tp->complete && name_owner == NULL) { + g_set_error_literal (error, G_DBUS_ERROR, G_DBUS_ERROR_NO_REPLY, + "Daemon disappeared"); + } else { + success = TRUE; + } + } + +out: + if (cancel_handler) + g_cancellable_disconnect (cancellable, cancel_handler); + if (notify_handler != 0) + g_signal_handler_disconnect (transaction, notify_handler); + if (signal_handler) + g_signal_handler_disconnect (transaction, signal_handler); + if (transaction != NULL) + g_object_unref (transaction); + + return success; +} + +/* FIXME: Refactor this once rpmostree returns a specific error code + * for ‘transaction in progress’, to avoid the slight race here where + * gnome-software could return from this function just as another client + * starts a new transaction. + * https://github.com/coreos/rpm-ostree/issues/3070 */ +static gboolean +gs_rpmostree_wait_for_ongoing_transaction_end (GsRPMOSTreeSysroot *sysroot_proxy, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *current_path = NULL; + g_autoptr(GMainContext) main_context = NULL; + gulong notify_handler, cancelled_handler = 0; + + current_path = gs_rpmostree_sysroot_dup_active_transaction_path (sysroot_proxy); + if (current_path == NULL || *current_path == '\0') + return TRUE; + + main_context = g_main_context_ref_thread_default (); + + notify_handler = g_signal_connect_swapped (sysroot_proxy, "notify::active-transaction-path", + G_CALLBACK (g_main_context_wakeup), main_context); + if (cancellable) { + /* Not using g_cancellable_connect() here for simplicity and because checking the state below anyway. */ + cancelled_handler = g_signal_connect_swapped (cancellable, "cancelled", + G_CALLBACK (g_main_context_wakeup), main_context); + } + + while (!g_cancellable_set_error_if_cancelled (cancellable, error)) { + g_clear_pointer (¤t_path, g_free); + current_path = gs_rpmostree_sysroot_dup_active_transaction_path (sysroot_proxy); + if (current_path == NULL || *current_path == '\0') { + g_clear_signal_handler (¬ify_handler, sysroot_proxy); + g_clear_signal_handler (&cancelled_handler, cancellable); + return TRUE; + } + g_main_context_iteration (main_context, TRUE); + } + + g_clear_signal_handler (¬ify_handler, sysroot_proxy); + g_clear_signal_handler (&cancelled_handler, cancellable); + + gs_rpmostree_error_convert (error); + + return FALSE; +} + +static GsApp * +app_from_modified_pkg_variant (GsPlugin *plugin, + GVariant *variant, + GHashTable *packages_with_urgency) +{ + g_autoptr(GsApp) app = NULL; + const char *name; + const char *old_evr, *old_arch; + const char *new_evr, *new_arch; + g_autofree char *old_nevra = NULL; + g_autofree char *new_nevra = NULL; + + g_variant_get (variant, "(us(ss)(ss))", NULL /* type*/, &name, &old_evr, &old_arch, &new_evr, &new_arch); + old_nevra = g_strdup_printf ("%s-%s.%s", name, old_evr, old_arch); + new_nevra = g_strdup_printf ("%s-%s.%s", name, new_evr, new_arch); + + app = gs_plugin_cache_lookup (plugin, old_nevra); + if (app == NULL) { + /* create new app */ + app = gs_app_new (NULL); + gs_app_set_management_plugin (app, plugin); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + app_set_rpm_ostree_packaging_format (app); + /* will be downloaded, but the size is unknown */ + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWN, 0); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + + /* update or downgrade */ + gs_app_add_source (app, name); + gs_app_set_version (app, old_evr); + gs_app_set_update_version (app, new_evr); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + + g_debug ("!%s\n", old_nevra); + g_debug ("=%s\n", new_nevra); + + gs_plugin_cache_add (plugin, old_nevra, app); + } + if (packages_with_urgency != NULL) { + guint urgency = GPOINTER_TO_UINT (g_hash_table_lookup (packages_with_urgency, new_nevra)); + if (urgency > 0) + gs_app_set_update_urgency (app, urgency); + } + return g_steal_pointer (&app); +} + +static GsApp * +app_from_single_pkg_variant (GsPlugin *plugin, + GVariant *variant, + gboolean addition, + GHashTable *packages_with_urgency) +{ + g_autoptr(GsApp) app = NULL; + const char *name; + const char *evr; + const char *arch; + g_autofree char *nevra = NULL; + + g_variant_get (variant, "(usss)", NULL /* type*/, &name, &evr, &arch); + nevra = g_strdup_printf ("%s-%s.%s", name, evr, arch); + + app = gs_plugin_cache_lookup (plugin, nevra); + if (app == NULL) { + /* create new app */ + app = gs_app_new (NULL); + gs_app_set_management_plugin (app, plugin); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + app_set_rpm_ostree_packaging_format (app); + /* will be downloaded, but the size is unknown */ + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWN, 0); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + + if (addition) { + /* addition */ + gs_app_add_source (app, name); + gs_app_set_version (app, evr); + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + + g_debug ("+%s\n", nevra); + } else { + /* removal */ + gs_app_add_source (app, name); + gs_app_set_version (app, evr); + gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + + g_debug ("-%s\n", nevra); + } + + gs_plugin_cache_add (plugin, nevra, app); + } + if (packages_with_urgency != NULL) { + guint urgency = GPOINTER_TO_UINT (g_hash_table_lookup (packages_with_urgency, nevra)); + if (urgency > 0) + gs_app_set_update_urgency (app, urgency); + } + return g_steal_pointer (&app); +} + +typedef enum { + RPMOSTREE_OPTION_NONE = 0, + RPMOSTREE_OPTION_REBOOT = (1 << 0), + RPMOSTREE_OPTION_ALLOW_DOWNGRADE = (1 << 1), + RPMOSTREE_OPTION_CACHE_ONLY = (1 << 2), + RPMOSTREE_OPTION_DOWNLOAD_ONLY = (1 << 3), + RPMOSTREE_OPTION_SKIP_PURGE = (1 << 4), + RPMOSTREE_OPTION_NO_PULL_BASE = (1 << 5), + RPMOSTREE_OPTION_DRY_RUN = (1 << 6), + RPMOSTREE_OPTION_NO_OVERRIDES = (1 << 7) +} RpmOstreeOptions; + +static GVariant * +make_rpmostree_options_variant (RpmOstreeOptions options) +{ + GVariantDict dict; + g_variant_dict_init (&dict, NULL); + g_variant_dict_insert (&dict, "reboot", "b", (options & RPMOSTREE_OPTION_REBOOT) != 0); + g_variant_dict_insert (&dict, "allow-downgrade", "b", (options & RPMOSTREE_OPTION_ALLOW_DOWNGRADE) != 0); + g_variant_dict_insert (&dict, "cache-only", "b", (options & RPMOSTREE_OPTION_CACHE_ONLY) != 0); + g_variant_dict_insert (&dict, "download-only", "b", (options & RPMOSTREE_OPTION_DOWNLOAD_ONLY) != 0); + g_variant_dict_insert (&dict, "skip-purge", "b", (options & RPMOSTREE_OPTION_SKIP_PURGE) != 0); + g_variant_dict_insert (&dict, "no-pull-base", "b", (options & RPMOSTREE_OPTION_NO_PULL_BASE) != 0); + g_variant_dict_insert (&dict, "dry-run", "b", (options & RPMOSTREE_OPTION_DRY_RUN) != 0); + g_variant_dict_insert (&dict, "no-overrides", "b", (options & RPMOSTREE_OPTION_NO_OVERRIDES) != 0); + return g_variant_ref_sink (g_variant_dict_end (&dict)); +} + +static GVariant * +make_refresh_md_options_variant (gboolean force) +{ + GVariantDict dict; + g_variant_dict_init (&dict, NULL); + g_variant_dict_insert (&dict, "force", "b", force); + return g_variant_ref_sink (g_variant_dict_end (&dict)); +} + +static gboolean +make_rpmostree_modifiers_variant (const char *install_package, + const char *uninstall_package, + const char *install_local_package, + GVariant **out_modifiers, + GUnixFDList **out_fd_list, + GError **error) +{ + GVariantDict dict; + g_autoptr(GUnixFDList) fd_list = g_unix_fd_list_new (); + + g_variant_dict_init (&dict, NULL); + + if (install_package != NULL) { + g_autoptr(GPtrArray) repo_pkgs = g_ptr_array_new (); + + g_ptr_array_add (repo_pkgs, (gpointer) install_package); + + g_variant_dict_insert_value (&dict, "install-packages", + g_variant_new_strv ((const char *const*)repo_pkgs->pdata, + repo_pkgs->len)); + + } + + if (uninstall_package != NULL) { + g_autoptr(GPtrArray) repo_pkgs = g_ptr_array_new (); + + g_ptr_array_add (repo_pkgs, (gpointer) uninstall_package); + + g_variant_dict_insert_value (&dict, "uninstall-packages", + g_variant_new_strv ((const char *const*)repo_pkgs->pdata, + repo_pkgs->len)); + + } + + if (install_local_package != NULL) { + g_auto(GVariantBuilder) builder; + int fd; + int idx; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("ah")); + + fd = openat (AT_FDCWD, install_local_package, O_RDONLY | O_CLOEXEC | O_NOCTTY); + if (fd == -1) { + g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + "Failed to open %s", install_local_package); + return FALSE; + } + + idx = g_unix_fd_list_append (fd_list, fd, error); + if (idx < 0) { + close (fd); + return FALSE; + } + + g_variant_builder_add (&builder, "h", idx); + g_variant_dict_insert_value (&dict, "install-local-packages", + g_variant_new ("ah", &builder)); + close (fd); + } + + *out_fd_list = g_steal_pointer (&fd_list); + *out_modifiers = g_variant_ref_sink (g_variant_dict_end (&dict)); + return TRUE; +} + +static gboolean +rpmostree_update_deployment (GsRPMOSTreeOS *os_proxy, + const char *install_package, + const char *uninstall_package, + const char *install_local_package, + GVariant *options, + gboolean interactive, + char **out_transaction_address, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GUnixFDList) fd_list = NULL; + g_autoptr(GVariant) modifiers = NULL; + + if (!make_rpmostree_modifiers_variant (install_package, + uninstall_package, + install_local_package, + &modifiers, &fd_list, error)) + return FALSE; + + return gs_rpmostree_os_call_update_deployment_sync (os_proxy, + modifiers, + options, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + fd_list, + out_transaction_address, + NULL, + cancellable, + error); +} + +static void refresh_metadata_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE); + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_refresh_metadata_async); + g_task_set_task_data (task, gs_plugin_refresh_metadata_data_new (cache_age_secs, flags), (GDestroyNotify) gs_plugin_refresh_metadata_data_free); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refresh_metadata_thread_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_rpm_ostree_refresh_metadata_in_worker (GsPluginRpmOstree *self, + GsPluginRefreshMetadataData *data, + GsRPMOSTreeOS *os_proxy, + GsRPMOSTreeSysroot *sysroot_proxy, + GCancellable *cancellable, + GError **error) +{ + GsPlugin *plugin = GS_PLUGIN (self); + g_autoptr(GError) local_error = NULL; + gboolean done; + gboolean interactive = data->flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE; + + assert_in_worker (self); + + /* refresh metadata */ + { + g_autofree gchar *transaction_address = NULL; + g_autoptr(GsApp) progress_app = NULL; + g_autoptr(GVariant) options = NULL; + g_autoptr(TransactionProgress) tp = NULL; + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) + return FALSE; + + progress_app = gs_app_new (gs_plugin_get_name (plugin)); + tp = transaction_progress_new (); + tp->app = g_object_ref (progress_app); + tp->plugin = g_object_ref (plugin); + + options = make_refresh_md_options_variant (FALSE /* force */); + done = FALSE; + while (!done) { + done = TRUE; + if (!gs_rpmostree_os_call_refresh_md_sync (os_proxy, + options, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + &transaction_address, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) + return FALSE; + done = FALSE; + continue; + } + + g_propagate_error (error, g_steal_pointer (&local_error)); + gs_rpmostree_error_convert (error); + return FALSE; + } + } + + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + error)) { + gs_rpmostree_error_convert (error); + return FALSE; + } + } + + if (data->cache_age_secs == G_MAXUINT64) + return TRUE; + + /* check what can be updated */ + { + g_autofree gchar *transaction_address = NULL; + g_autoptr(GsApp) progress_app = gs_app_new (gs_plugin_get_name (plugin)); + g_autoptr(GVariant) options = NULL; + GVariantDict dict; + g_autoptr(TransactionProgress) tp = transaction_progress_new (); + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) + return FALSE; + + tp->app = g_object_ref (progress_app); + tp->plugin = g_object_ref (plugin); + + g_variant_dict_init (&dict, NULL); + g_variant_dict_insert (&dict, "mode", "s", "check"); + options = g_variant_ref_sink (g_variant_dict_end (&dict)); + + done = FALSE; + while (!done) { + done = TRUE; + if (!gs_rpmostree_os_call_automatic_update_trigger_sync (os_proxy, + options, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + NULL, + &transaction_address, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) + return FALSE; + done = FALSE; + continue; + } + g_propagate_error (error, g_steal_pointer (&local_error)); + gs_rpmostree_error_convert (error); + return FALSE; + } + } + + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + error)) { + gs_rpmostree_error_convert (error); + return FALSE; + } + } + + /* update UI */ + gs_plugin_updates_changed (plugin); + + return TRUE; +} + +static void +refresh_metadata_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + GsPluginRefreshMetadataData *data = task_data; + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + gboolean interactive = data->flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (gs_plugin_rpm_ostree_refresh_metadata_in_worker (self, data, os_proxy, sysroot_proxy, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static gboolean +gs_plugin_rpm_ostree_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +trigger_rpmostree_update (GsPluginRpmOstree *self, + GsApp *app, + GsRPMOSTreeOS *os_proxy, + GsRPMOSTreeSysroot *sysroot_proxy, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *transaction_address = NULL; + g_autoptr(GVariant) options = NULL; + g_autoptr(TransactionProgress) tp = transaction_progress_new (); + g_autoptr(GError) local_error = NULL; + gboolean done; + + /* if we can process this online do not require a trigger */ + if (gs_app_get_state (app) != GS_APP_STATE_UPDATABLE) + return TRUE; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + return TRUE; + + /* already in correct state */ + if (self->update_triggered) + return TRUE; + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) + return FALSE; + + /* trigger the update */ + options = make_rpmostree_options_variant (RPMOSTREE_OPTION_CACHE_ONLY); + done = FALSE; + while (!done) { + done = TRUE; + if (!gs_rpmostree_os_call_upgrade_sync (os_proxy, + options, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + NULL /* fd list */, + &transaction_address, + NULL /* fd list out */, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) + return FALSE; + done = FALSE; + continue; + } + if (local_error) + g_propagate_error (error, g_steal_pointer (&local_error)); + gs_rpmostree_error_convert (error); + return FALSE; + } + } + + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + error)) { + gs_rpmostree_error_convert (error); + return FALSE; + } + + self->update_triggered = TRUE; + + /* success */ + return TRUE; +} + +static void update_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_update_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_update_apps_data_new_task (plugin, apps, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_update_apps_async); + + /* Queue a job to update the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + update_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +update_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (source_object); + GsPluginUpdateAppsData *data = task_data; + g_autoptr(GError) local_error = NULL; + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + gboolean interactive = (data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE) != 0; + + assert_in_worker (self); + + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (!(data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD)) { + GsPlugin *plugin = GS_PLUGIN (self); + g_autofree gchar *transaction_address = NULL; + g_autoptr(GVariant) options = NULL; + g_autoptr(TransactionProgress) tp = transaction_progress_new (); + gboolean done; + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, &local_error)) { + gs_rpm_ostree_task_return_error_with_gui (self, task, g_steal_pointer (&local_error), _("Failed to wait on transaction end before download: "), interactive); + return; + } + + tp->download_progress_list = g_object_ref (data->apps); + tp->plugin = g_object_ref (plugin); + + /* respect the NO_APPLY flag for user-initiated updates, and prepare the update + for the background updates, thus they are ready to be used on reboot; + PackageKit plugin does it similarly */ + options = make_rpmostree_options_variant (interactive ? RPMOSTREE_OPTION_DOWNLOAD_ONLY : RPMOSTREE_OPTION_NONE); + done = FALSE; + while (!done) { + done = TRUE; + if (!gs_rpmostree_os_call_upgrade_sync (os_proxy, + options, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + NULL /* fd list */, + &transaction_address, + NULL /* fd list out */, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, &local_error)) { + gs_rpm_ostree_task_return_error_with_gui (self, task, g_steal_pointer (&local_error), _("Failed to wait on transaction end before download: "), interactive); + return; + } + done = FALSE; + continue; + } + gs_rpmostree_error_convert (&local_error); + gs_rpm_ostree_task_return_error_with_gui (self, task, g_steal_pointer (&local_error), _("Failed to download updates: "), interactive); + return; + } + } + + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + &local_error)) { + gs_app_list_override_progress (data->apps, GS_APP_PROGRESS_UNKNOWN); + gs_rpmostree_error_convert (&local_error); + gs_rpm_ostree_task_return_error_with_gui (self, task, g_steal_pointer (&local_error), _("Failed to download updates: "), interactive); + return; + } + + gs_app_list_override_progress (data->apps, GS_APP_PROGRESS_UNKNOWN); + + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + GsAppList *related = gs_app_get_related (app); + + if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY) && + gs_app_has_management_plugin (app, plugin)) + gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0); + + for (guint j = 0; j < gs_app_list_length (related); j++) { + GsApp *app_tmp = gs_app_list_index (related, j); + + if (gs_app_has_management_plugin (app_tmp, plugin)) + gs_app_set_size_download (app_tmp, GS_SIZE_TYPE_VALID, 0); + } + } + } + + /* Doing updates is only a case of triggering the deploy of a + * pre-downloaded update, so there’s no need to bother with progress updates. */ + if (data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY) { + g_task_return_boolean (task, TRUE); + return; + } + + self->update_triggered = FALSE; + + for (guint i = 0; !self->update_triggered && i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + GsAppList *related = gs_app_get_related (app); + + /* we don't currently put all updates in the OsUpdate proxy app */ + if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY)) { + if (!trigger_rpmostree_update (self, app, os_proxy, sysroot_proxy, interactive, cancellable, &local_error)) { + gs_rpm_ostree_task_return_error_with_gui (self, task, g_steal_pointer (&local_error), _("Failed to trigger update: "), interactive); + return; + } + } + + /* try to trigger each related app */ + for (guint j = 0; !self->update_triggered && j < gs_app_list_length (related); j++) { + GsApp *app_tmp = gs_app_list_index (related, j); + + if (!trigger_rpmostree_update (self, app_tmp, os_proxy, sysroot_proxy, interactive, cancellable, &local_error)) { + gs_rpm_ostree_task_return_error_with_gui (self, task, g_steal_pointer (&local_error), _("Failed to trigger update: "), interactive); + return; + } + } + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_rpm_ostree_update_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +gs_plugin_rpm_ostree_trigger_upgrade_sync (GsPlugin *plugin, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + const char *packages[] = { NULL }; + g_autofree gchar *new_refspec = NULL; + g_autofree gchar *transaction_address = NULL; + g_autoptr(GVariant) options = NULL; + g_autoptr(TransactionProgress) tp = transaction_progress_new (); + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + g_autoptr(GError) local_error = NULL; + gboolean done; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) + return TRUE; + + /* check is distro-upgrade */ + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_OPERATING_SYSTEM) + return TRUE; + + gs_app_set_state (app, GS_APP_STATE_PENDING_INSTALL); + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, error)) { + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + return FALSE; + } + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) { + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + return FALSE; + } + + /* construct new refspec based on the distro version we're upgrading to */ + new_refspec = g_strdup_printf ("ostree://fedora/%s/x86_64/silverblue", + gs_app_get_version (app)); + + /* trigger the upgrade */ + options = make_rpmostree_options_variant (RPMOSTREE_OPTION_ALLOW_DOWNGRADE | + RPMOSTREE_OPTION_CACHE_ONLY); + done = FALSE; + while (!done) { + done = TRUE; + if (!gs_rpmostree_os_call_rebase_sync (os_proxy, + options, + new_refspec, + packages, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + NULL /* fd list */, + &transaction_address, + NULL /* fd list out */, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) { + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + return FALSE; + } + done = FALSE; + continue; + } + if (local_error) + g_propagate_error (error, g_steal_pointer (&local_error)); + gs_rpmostree_error_convert (error); + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + return FALSE; + } + } + + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + error)) { + gs_rpmostree_error_convert (error); + + if (g_strrstr ((*error)->message, "Old and new refs are equal")) { + /* don't error out if the correct tree is already deployed */ + g_debug ("ignoring rpm-ostree error: %s", (*error)->message); + g_clear_error (error); + } else { + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + return FALSE; + } + } + + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + + /* success */ + return TRUE; +} + +static void +trigger_upgrade_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginTriggerUpgradeData *data = task_data; + g_autoptr(GError) local_error = NULL; + gboolean interactive = (data->flags & GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_INTERACTIVE) != 0; + + if (gs_plugin_rpm_ostree_trigger_upgrade_sync (plugin, data->app, interactive, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static void +gs_plugin_rpm_ostree_trigger_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginTriggerUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_INTERACTIVE) != 0; + + task = gs_plugin_trigger_upgrade_data_new_task (plugin, app, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_trigger_upgrade_async); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + trigger_upgrade_thread_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_rpm_ostree_trigger_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +gs_rpmostree_repo_enable (GsPlugin *plugin, + GsApp *app, + gboolean enable, + GsRPMOSTreeOS *os_proxy, + GsRPMOSTreeSysroot *sysroot_proxy, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *transaction_address = NULL; + g_autoptr(GVariantBuilder) options_builder = NULL; + g_autoptr(TransactionProgress) tp = NULL; + g_autoptr(GError) local_error = NULL; + gboolean done; + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) + return FALSE; + + if (enable) + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + else + gs_app_set_state (app, GS_APP_STATE_REMOVING); + + done = FALSE; + while (!done) { + done = TRUE; + g_clear_pointer (&options_builder, g_variant_builder_unref); + options_builder = g_variant_builder_new (G_VARIANT_TYPE ("a{ss}")); + g_variant_builder_add (options_builder, "{ss}", "enabled", enable ? "1" : "0"); + if (!gs_rpmostree_os_call_modify_yum_repo_sync (os_proxy, + gs_app_get_id (app), + g_variant_builder_end (options_builder), + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + &transaction_address, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) { + gs_app_set_state_recover (app); + gs_utils_error_add_origin_id (error, app); + return FALSE; + } + done = FALSE; + continue; + } + if (local_error) + g_propagate_error (error, g_steal_pointer (&local_error)); + gs_rpmostree_error_convert (error); + gs_app_set_state_recover (app); + gs_utils_error_add_origin_id (error, app); + return FALSE; + } + } + + tp = transaction_progress_new (); + tp->app = g_object_ref (app); + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + error)) { + gs_rpmostree_error_convert (error); + gs_app_set_state_recover (app); + gs_utils_error_add_origin_id (error, app); + return FALSE; + } + + + /* state is known */ + if (enable) + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + else + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + + gs_plugin_repository_changed (plugin, app); + + return TRUE; +} + +static void install_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_install_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_install_apps_data_new_task (plugin, apps, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_install_apps_async); + + /* Queue a job to install the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + install_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +install_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (source_object); + GsPluginInstallAppsData *data = task_data; + const gchar *install_package = NULL; + g_autofree gchar *local_filename = NULL; + g_autofree gchar *transaction_address = NULL; + g_autoptr(GVariant) options = NULL; + g_autoptr(TransactionProgress) tp = transaction_progress_new (); + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + g_autoptr(GError) local_error = NULL; + gboolean done; + gboolean interactive = data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE; + + assert_in_worker (self); + + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + /* enable repo, handled by dedicated function */ + g_assert (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY); + + switch (gs_app_get_state (app)) { + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_QUEUED_FOR_INSTALL: + if (gs_app_get_source_default (app) == NULL) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "no source set"); + return; + } + + install_package = gs_app_get_source_default (app); + break; + case GS_APP_STATE_AVAILABLE_LOCAL: + if (gs_app_get_local_file (app) == NULL) { + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "local package, but no filename"); + return; + } + + local_filename = g_file_get_path (gs_app_get_local_file (app)); + break; + default: + g_task_return_new_error (task, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "do not know how to install app in state %s", + gs_app_state_to_string (gs_app_get_state (app))); + return; + } + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + tp->app = g_object_ref (app); + + options = make_rpmostree_options_variant (RPMOSTREE_OPTION_NO_PULL_BASE | + ((data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD) ? RPMOSTREE_OPTION_CACHE_ONLY : 0) | + ((data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY) ? RPMOSTREE_OPTION_DOWNLOAD_ONLY : 0)); + done = FALSE; + while (!done) { + done = TRUE; + if (!rpmostree_update_deployment (os_proxy, + install_package, + NULL /* remove package */, + local_filename, + options, + interactive, + &transaction_address, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, &local_error)) { + gs_app_set_state_recover (app); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + done = FALSE; + continue; + } + + gs_app_set_state_recover (app); + gs_rpmostree_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + /* FIXME: Tie @tp to data->progress_callback. */ + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + &local_error)) { + gs_app_set_state_recover (app); + gs_rpmostree_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* state is known */ + gs_app_set_state (app, GS_APP_STATE_PENDING_INSTALL); + + /* get the new icon from the package */ + gs_app_set_local_file (app, NULL); + gs_app_remove_all_icons (app); + + /* no longer valid */ + gs_app_clear_source_ids (app); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_rpm_ostree_install_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void uninstall_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_uninstall_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_uninstall_apps_data_new_task (plugin, apps, flags, + progress_callback, progress_user_data, + app_needs_user_action_callback, app_needs_user_action_data, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_uninstall_apps_async); + + /* Queue a job to uninstall the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + uninstall_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +uninstall_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (source_object); + GsPluginUninstallAppsData *data = task_data; + g_autofree gchar *local_filename = NULL; + g_autofree gchar *transaction_address = NULL; + g_autoptr(GVariant) options = NULL; + g_autoptr(TransactionProgress) tp = transaction_progress_new (); + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + g_autoptr(GError) local_error = NULL; + gboolean done; + gboolean interactive = data->flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE; + + assert_in_worker (self); + + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + /* disable repo, handled by dedicated function */ + g_assert (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY); + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + gs_app_set_state (app, GS_APP_STATE_REMOVING); + tp->app = g_object_ref (app); + + options = make_rpmostree_options_variant (RPMOSTREE_OPTION_CACHE_ONLY | + RPMOSTREE_OPTION_NO_PULL_BASE); + done = FALSE; + while (!done) { + done = TRUE; + if (!rpmostree_update_deployment (os_proxy, + NULL /* install package */, + gs_app_get_source_default (app), + NULL /* install local package */, + options, + interactive, + &transaction_address, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, &local_error)) { + gs_app_set_state_recover (app); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + done = FALSE; + continue; + } + + gs_app_set_state_recover (app); + gs_rpmostree_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + /* FIXME: Tie @tp to data->progress_callback. */ + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + &local_error)) { + gs_app_set_state_recover (app); + gs_rpmostree_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* state is known */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) { + gs_app_set_state (app, GS_APP_STATE_PENDING_REMOVE); + } else { + /* state is not known: we don't know if we can re-install this app */ + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + } + } + + /* Refine the apps to ensure their new states are up to date. */ + if (!gs_rpm_ostree_refine_apps (GS_PLUGIN (self), data->apps, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION, + cancellable, &local_error)) { + gs_rpmostree_error_convert (&local_error); + g_debug ("Error refining apps after uninstall: %s", local_error->message); + g_clear_error (&local_error); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_rpm_ostree_uninstall_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +gs_rpm_ostree_has_launchable (GsApp *app) +{ + const gchar *desktop_id; + GDesktopAppInfo *desktop_appinfo; + + if (gs_app_has_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE) || + gs_app_has_quirk (app, GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE)) + return FALSE; + + desktop_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID); + if (!desktop_id) + desktop_id = gs_app_get_id (app); + if (!desktop_id) + return FALSE; + + desktop_appinfo = gs_utils_get_desktop_app_info (desktop_id); + if (!desktop_appinfo) + return FALSE; + + return TRUE; +} + +static gboolean +resolve_installed_packages_app (GsPlugin *plugin, + GHashTable *packages, + GHashTable *layered_packages, + GHashTable *layered_local_packages, + GsApp *app) +{ + RpmOstreePackage *pkg; + + if (!gs_app_get_source_default (app)) + return FALSE; + + pkg = g_hash_table_lookup (packages, gs_app_get_source_default (app)); + + if (pkg) { + gs_app_set_version (app, rpm_ostree_package_get_evr (pkg)); + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", rpm_ostree_package_get_nevra (pkg)); + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) { + /* Kind of hack, pending installs do not have available the desktop file */ + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_DESKTOP_APP || gs_rpm_ostree_has_launchable (app)) + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + else + gs_app_set_state (app, GS_APP_STATE_PENDING_INSTALL); + } + if ((rpm_ostree_package_get_name (pkg) && + g_hash_table_contains (layered_packages, rpm_ostree_package_get_name (pkg))) || + (rpm_ostree_package_get_nevra (pkg) && + g_hash_table_contains (layered_local_packages, rpm_ostree_package_get_nevra (pkg)))) { + /* layered packages can always be removed */ + gs_app_remove_quirk (app, GS_APP_QUIRK_COMPULSORY); + } else { + /* can't remove packages that are part of the base system */ + gs_app_add_quirk (app, GS_APP_QUIRK_COMPULSORY); + } + if (gs_app_get_origin (app) == NULL) + gs_app_set_origin (app, "rpm-ostree"); + if (gs_app_get_name (app) == NULL) + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, rpm_ostree_package_get_name (pkg)); + return TRUE /* found */; + } + + return FALSE /* not found */; +} + +static gboolean +resolve_appstream_source_file_to_package_name (GsPlugin *plugin, + GsApp *app, + GsPluginRefineFlags flags, + rpmts *inout_rpmts, + GCancellable *cancellable, + GError **error) +{ + Header h; + const gchar *fn; + gint rc; + g_auto(rpmdbMatchIterator) mi = NULL; + + /* look for a specific file */ + fn = gs_app_get_metadata_item (app, "appstream::source-file"); + if (fn == NULL) + return TRUE; + + if (!*inout_rpmts) { + /* open db readonly */ + *inout_rpmts = rpmtsCreate (); + rpmtsSetRootDir (*inout_rpmts, NULL); + rc = rpmtsOpenDB (*inout_rpmts, O_RDONLY); + if (rc != 0) { + g_clear_pointer (inout_rpmts, rpmtsFree); + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "Failed to open rpmdb: %i", rc); + return FALSE; + } + } + + mi = rpmtsInitIterator (*inout_rpmts, RPMDBI_INSTFILENAMES, fn, 0); + if (mi == NULL) { + g_debug ("rpm: no search results for %s", fn); + return TRUE; + } + + /* process any results */ + g_debug ("rpm: querying for %s with %s", gs_app_get_id (app), fn); + while ((h = rpmdbNextIterator (mi)) != NULL) { + const gchar *name; + + /* add default source */ + name = headerGetString (h, RPMTAG_NAME); + if (gs_app_get_source_default (app) == NULL) { + const gchar *nevra = headerGetString (h, RPMTAG_NEVRA); + g_debug ("rpm: setting source to '%s' with nevra '%s'", name, nevra); + gs_app_add_source (app, name); + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", nevra); + gs_app_set_management_plugin (app, plugin); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + app_set_rpm_ostree_packaging_format (app); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + } + } + + return TRUE; +} + +static gboolean +gs_rpm_ostree_refine_apps (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GError **error) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GHashTable) packages = NULL; + g_autoptr(GHashTable) layered_packages = NULL; + g_autoptr(GHashTable) layered_local_packages = NULL; + g_autoptr(GHashTable) lookup_apps = NULL; /* name ~> GsApp */ + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GPtrArray) pkglist = NULL; + g_autoptr(GVariant) default_deployment = NULL; + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + g_autoptr(OstreeRepo) ot_repo = NULL; + g_autoptr(GsAppList) todo_apps = gs_app_list_new (); + g_auto(GStrv) layered_packages_strv = NULL; + g_auto(GStrv) layered_local_packages_strv = NULL; + g_auto(rpmts) ts = NULL; + g_autofree gchar *checksum = NULL; + gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE); + + /* first check whether there's any rpm-ostree-related app, to not run the proxy for nothing */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD)) + continue; + /* set management plugin for apps where appstream just added the source package name in refine() */ + if (gs_app_has_management_plugin (app, NULL) && + gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_PACKAGE && + gs_app_get_scope (app) == AS_COMPONENT_SCOPE_SYSTEM && + gs_app_get_source_default (app) != NULL) { + gs_app_set_management_plugin (app, plugin); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + app_set_rpm_ostree_packaging_format (app); + } + /* resolve the source package name based on installed appdata/desktop file name */ + if (gs_app_has_management_plugin (app, NULL) && + gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_UNKNOWN && + gs_app_get_scope (app) == AS_COMPONENT_SCOPE_SYSTEM && + gs_app_get_source_default (app) == NULL) { + if (!resolve_appstream_source_file_to_package_name (plugin, app, flags, &ts, cancellable, error)) + return FALSE; + } + if (!gs_app_has_management_plugin (app, plugin)) + continue; + if (gs_app_get_source_default (app) == NULL) + continue; + + gs_app_list_add (todo_apps, app); + } + + /* nothign to do */ + if (gs_app_list_length (todo_apps) == 0) + return TRUE; + + locker = g_mutex_locker_new (&self->mutex); + + if (!gs_rpmostree_ref_proxies_locked (self, interactive, &os_proxy, &sysroot_proxy, cancellable, error)) + return FALSE; + + ot_repo = g_object_ref (self->ot_repo); + + g_clear_pointer (&locker, g_mutex_locker_free); + + /* ensure D-Bus properties are updated before reading them */ + if (!gs_rpmostree_sysroot_call_reload_sync (sysroot_proxy, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + error)) { + gs_rpmostree_error_convert (error); + return FALSE; + } + + default_deployment = gs_rpmostree_os_dup_default_deployment (os_proxy); + g_assert (g_variant_lookup (default_deployment, + "packages", "^as", + &layered_packages_strv)); + g_assert (g_variant_lookup (default_deployment, + "requested-local-packages", "^as", + &layered_local_packages_strv)); + g_assert (g_variant_lookup (default_deployment, + "checksum", "s", + &checksum)); + + pkglist = rpm_ostree_db_query_all (ot_repo, checksum, cancellable, error); + if (pkglist == NULL) { + gs_rpmostree_error_convert (error); + return FALSE; + } + + packages = g_hash_table_new (g_str_hash, g_str_equal); + layered_packages = g_hash_table_new (g_str_hash, g_str_equal); + layered_local_packages = g_hash_table_new (g_str_hash, g_str_equal); + + for (guint ii = 0; ii < pkglist->len; ii++) { + RpmOstreePackage *pkg = g_ptr_array_index (pkglist, ii); + if (rpm_ostree_package_get_name (pkg)) + g_hash_table_insert (packages, (gpointer) rpm_ostree_package_get_name (pkg), pkg); + } + + for (guint ii = 0; layered_packages_strv && layered_packages_strv[ii]; ii++) { + g_hash_table_add (layered_packages, layered_packages_strv[ii]); + } + + for (guint ii = 0; layered_local_packages_strv && layered_local_packages_strv[ii]; ii++) { + g_hash_table_add (layered_local_packages, layered_local_packages_strv[ii]); + } + + lookup_apps = g_hash_table_new (g_str_hash, g_str_equal); + + for (guint i = 0; i < gs_app_list_length (todo_apps); i++) { + GsApp *app = gs_app_list_index (todo_apps, i); + + /* first try to resolve from installed packages and + if we didn't find anything, try resolving from available packages */ + if (!resolve_installed_packages_app (plugin, packages, layered_packages, layered_local_packages, app)) + g_hash_table_insert (lookup_apps, (gpointer) gs_app_get_source_default (app), app); + } + + if (g_hash_table_size (lookup_apps) > 0) { + g_autofree gpointer *names = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(GVariant) var_packages = NULL; + + names = g_hash_table_get_keys_as_array (lookup_apps, NULL); + if (gs_rpmostree_os_call_get_packages_sync (os_proxy, + (const gchar * const *) names, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + &var_packages, + cancellable, + &local_error)) { + gsize n_children = g_variant_n_children (var_packages); + for (gsize i = 0; i < n_children; i++) { + g_autoptr(GVariant) value = g_variant_get_child_value (var_packages, i); + g_autoptr(GVariantDict) dict = g_variant_dict_new (value); + GsApp *app; + const gchar *key = NULL; + const gchar *evr = NULL; + const gchar *nevra = NULL; + const gchar *reponame = NULL; + const gchar *name = NULL; + const gchar *summary = NULL; + + if (!g_variant_dict_lookup (dict, "key", "&s", &key) || + !g_variant_dict_lookup (dict, "evr", "&s", &evr) || + !g_variant_dict_lookup (dict, "nevra", "&s", &nevra) || + !g_variant_dict_lookup (dict, "reponame", "&s", &reponame) || + !g_variant_dict_lookup (dict, "name", "&s", &name) || + !g_variant_dict_lookup (dict, "summary", "&s", &summary)) { + continue; + } + + app = g_hash_table_lookup (lookup_apps, key); + if (app == NULL) + continue; + + gs_app_set_version (app, evr); + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", nevra); + + /* anything not part of the base system can be removed */ + gs_app_remove_quirk (app, GS_APP_QUIRK_COMPULSORY); + + /* set origin */ + if (gs_app_get_origin (app) == NULL) + gs_app_set_origin (app, reponame); + + /* set more metadata for packages that don't have appstream data */ + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, name); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, summary); + + /* set hide-from-search quirk for available apps we don't want to show; results for non-installed desktop apps + * are intentionally hidden (as recommended by Matthias Clasen) by a special quirk because app layering + * should be intended for power users and not a common practice on Fedora Silverblue */ + if (!gs_app_is_installed (app)) { + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + case AS_COMPONENT_KIND_WEB_APP: + case AS_COMPONENT_KIND_CONSOLE_APP: + gs_app_add_quirk (app, GS_APP_QUIRK_HIDE_FROM_SEARCH); + break; + default: + break; + } + } + } + } else { + g_debug ("Failed to get packages: %s", local_error->message); + } + } + + return TRUE; +} + +static void refine_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = gs_plugin_has_flags (GS_PLUGIN (self), GS_PLUGIN_FLAGS_INTERACTIVE); + + task = gs_plugin_refine_data_new_task (plugin, list, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_refine_async); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + refine_thread_cb, g_steal_pointer (&task)); +} + +static void +refine_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + GsPluginRefineData *data = task_data; + GsAppList *list = data->list; + GsPluginRefineFlags flags = data->flags; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (!gs_rpm_ostree_refine_apps (plugin, list, flags, cancellable, &local_error)) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_rpm_ostree_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +gs_plugin_rpm_ostree_download_upgrade_sync (GsPlugin *plugin, + GsApp *app, + gboolean interactive, + GCancellable *cancellable, + GError **error) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + const char *packages[] = { NULL }; + g_autofree gchar *new_refspec = NULL; + g_autofree gchar *transaction_address = NULL; + g_autoptr(GVariant) options = NULL; + g_autoptr(TransactionProgress) tp = transaction_progress_new (); + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + g_autoptr(GError) local_error = NULL; + gboolean done; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) + return TRUE; + + /* check is distro-upgrade */ + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_OPERATING_SYSTEM) + return TRUE; + + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, error)) + return FALSE; + + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) + return FALSE; + + /* construct new refspec based on the distro version we're upgrading to */ + new_refspec = g_strdup_printf ("ostree://fedora/%s/x86_64/silverblue", + gs_app_get_version (app)); + + options = make_rpmostree_options_variant (RPMOSTREE_OPTION_ALLOW_DOWNGRADE | + RPMOSTREE_OPTION_DOWNLOAD_ONLY); + gs_app_set_state (app, GS_APP_STATE_DOWNLOADING); + tp->app = g_object_ref (app); + + done = FALSE; + while (!done) { + done = TRUE; + if (!gs_rpmostree_os_call_rebase_sync (os_proxy, + options, + new_refspec, + packages, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + NULL /* fd list */, + &transaction_address, + NULL /* fd list out */, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) { + gs_app_set_state_recover (app); + return FALSE; + } + done = FALSE; + continue; + } + if (local_error) + g_propagate_error (error, g_steal_pointer (&local_error)); + gs_rpmostree_error_convert (error); + gs_app_set_state_recover (app); + return FALSE; + } + } + + if (!gs_rpmostree_transaction_get_response_sync (sysroot_proxy, + transaction_address, + tp, + interactive, + cancellable, + error)) { + gs_rpmostree_error_convert (error); + + if (g_strrstr ((*error)->message, "Old and new refs are equal")) { + /* don't error out if the correct tree is already deployed */ + g_debug ("ignoring rpm-ostree error: %s", (*error)->message); + g_clear_error (error); + } else { + gs_app_set_state_recover (app); + return FALSE; + } + } + + /* state is known */ + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + return TRUE; +} + +static void +download_upgrade_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginDownloadUpgradeData *data = task_data; + g_autoptr(GError) local_error = NULL; + gboolean interactive = (data->flags & GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE) != 0; + + if (gs_plugin_rpm_ostree_download_upgrade_sync (plugin, data->app, interactive, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static void +gs_plugin_rpm_ostree_download_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginDownloadUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE) != 0; + + task = gs_plugin_download_upgrade_data_new_task (plugin, app, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_download_upgrade_async); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + download_upgrade_thread_cb, g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_rpm_ostree_download_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +plugin_rpmostree_pick_rpm_desktop_file_cb (GsPlugin *plugin, + GsApp *app, + const gchar *filename, + GKeyFile *key_file, + gpointer user_data) +{ + return strstr (filename, "/snapd/") == NULL && + strstr (filename, "/snap/") == NULL && + strstr (filename, "/flatpak/") == NULL && + g_key_file_has_group (key_file, "Desktop Entry") && + !g_key_file_has_key (key_file, "Desktop Entry", "X-Flatpak", NULL) && + !g_key_file_has_key (key_file, "Desktop Entry", "X-SnapInstanceName", NULL); +} + +static void +gs_plugin_rpm_ostree_launch_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + gs_plugin_app_launch_filtered_async (plugin, app, flags, + plugin_rpmostree_pick_rpm_desktop_file_cb, NULL, + cancellable, + callback, user_data); +} + +static gboolean +gs_plugin_rpm_ostree_launch_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return gs_plugin_app_launch_filtered_finish (plugin, result, error); +} + +static void +add_quirks_from_package_name (GsApp *app, const gchar *package_name) +{ + /* these packages don't have a .repo file in their file lists, but + * instead install one through rpm scripts / cron job */ + const gchar *packages_with_repos[] = { + "google-chrome-stable", + "google-earth-pro-stable", + "google-talkplugin", + NULL }; + + if (g_strv_contains (packages_with_repos, package_name)) + gs_app_add_quirk (app, GS_APP_QUIRK_HAS_SOURCE); +} + +static gboolean +gs_plugin_rpm_ostree_file_to_app_sync (GsPlugin *plugin, + GFile *file, + GsAppList *list, + GCancellable *cancellable, + GError **error) +{ + gboolean ret = FALSE; + FD_t rpmfd = NULL; + guint64 epoch; + guint64 size; + const gchar *name; + const gchar *version; + const gchar *release; + const gchar *license; + g_auto(Header) h = NULL; + g_auto(rpmts) ts = NULL; + g_autofree gchar *evr = NULL; + g_autofree gchar *filename = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) tmp_list = NULL; + + filename = g_file_get_path (file); + if (!g_str_has_suffix (filename, ".rpm")) { + ret = TRUE; + goto out; + } + + ts = rpmtsCreate (); + rpmtsSetVSFlags (ts, _RPMVSF_NOSIGNATURES); + + /* librpm needs Fopenfd */ + rpmfd = Fopen (filename, "r.fdio"); + if (rpmfd == NULL) { + g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + "Opening %s failed", filename); + goto out; + } + if (Ferror (rpmfd)) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "Opening %s failed: %s", + filename, + Fstrerror (rpmfd)); + goto out; + } + + if (rpmReadPackageFile (ts, rpmfd, filename, &h) != RPMRC_OK) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "Verification of %s failed", + filename); + goto out; + } + + app = gs_app_new (NULL); + gs_app_set_metadata (app, "GnomeSoftware::Creator", gs_plugin_get_name (plugin)); + gs_app_set_management_plugin (app, plugin); + gs_app_set_local_file (app, file); + if (h) { + const gchar *str; + + str = headerGetString (h, RPMTAG_NAME); + if (str && *str) + gs_app_set_name (app, GS_APP_QUALITY_HIGHEST, str); + + str = headerGetString (h, RPMTAG_SUMMARY); + if (str && *str) + gs_app_set_summary (app, GS_APP_QUALITY_HIGHEST, str); + + str = headerGetString (h, RPMTAG_DESCRIPTION); + if (str && *str) + gs_app_set_description (app, GS_APP_QUALITY_HIGHEST, str); + + str = headerGetString (h, RPMTAG_NEVRA); + if (str && *str) + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", str); + } + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + app_set_rpm_ostree_packaging_format (app); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + + /* add default source */ + name = headerGetString (h, RPMTAG_NAME); + g_debug ("rpm: setting source to %s", name); + gs_app_add_source (app, name); + + /* add version */ + epoch = headerGetNumber (h, RPMTAG_EPOCH); + version = headerGetString (h, RPMTAG_VERSION); + release = headerGetString (h, RPMTAG_RELEASE); + if (epoch > 0) { + evr = g_strdup_printf ("%" G_GUINT64_FORMAT ":%s-%s", + epoch, version, release); + } else { + evr = g_strdup_printf ("%s-%s", + version, release); + } + g_debug ("rpm: setting version to %s", evr); + gs_app_set_version (app, evr); + + /* set size */ + size = headerGetNumber (h, RPMTAG_SIZE); + gs_app_set_size_installed (app, GS_SIZE_TYPE_VALID, size); + + /* set license */ + license = headerGetString (h, RPMTAG_LICENSE); + if (license != NULL) { + g_autofree gchar *license_spdx = NULL; + license_spdx = as_license_to_spdx_id (license); + gs_app_set_license (app, GS_APP_QUALITY_NORMAL, license_spdx); + g_debug ("rpm: setting license to %s", license_spdx); + } + + add_quirks_from_package_name (app, name); + + tmp_list = gs_app_list_new (); + gs_app_list_add (tmp_list, app); + + if (gs_rpm_ostree_refine_apps (plugin, tmp_list, 0, cancellable, error)) { + if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, GS_APP_STATE_AVAILABLE_LOCAL); + + gs_app_list_add (list, app); + ret = TRUE; + } + +out: + if (rpmfd != NULL) + (void) Fclose (rpmfd); + return ret; +} + +static void +gs_plugin_rpm_ostree_file_to_app_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GError) local_error = NULL; + GsPlugin *plugin = GS_PLUGIN (source_object); + GsPluginFileToAppData *data = task_data; + + if (gs_plugin_rpm_ostree_file_to_app_sync (plugin, data->file, list, cancellable, &local_error)) + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + else if (local_error != NULL) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); +} + +static void +gs_plugin_rpm_ostree_file_to_app_async (GsPlugin *plugin, + GFile *file, + GsPluginFileToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + task = gs_plugin_file_to_app_data_new_task (plugin, file, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_file_to_app_async); + g_task_run_in_thread (task, gs_plugin_rpm_ostree_file_to_app_thread); +} + +static GsAppList * +gs_plugin_rpm_ostree_file_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static gchar ** +what_provides_decompose (GsAppQueryProvidesType provides_type, + const gchar *provides_tag) +{ + g_autoptr(GPtrArray) array = g_ptr_array_new (); + + /* The provides_tag possibly already contains the prefix, thus use it as is */ + if (provides_type != GS_APP_QUERY_PROVIDES_UNKNOWN && + g_str_has_suffix (provides_tag, ")") && + strchr (provides_tag, '(') != NULL) + provides_type = GS_APP_QUERY_PROVIDES_PACKAGE_NAME; + + /* Wrap the @provides_tag with the appropriate Fedora prefix */ + switch (provides_type) { + case GS_APP_QUERY_PROVIDES_PACKAGE_NAME: + g_ptr_array_add (array, g_strdup (provides_tag)); + break; + case GS_APP_QUERY_PROVIDES_GSTREAMER: + g_ptr_array_add (array, g_strdup_printf ("gstreamer0.10(%s)", provides_tag)); + g_ptr_array_add (array, g_strdup_printf ("gstreamer1(%s)", provides_tag)); + break; + case GS_APP_QUERY_PROVIDES_FONT: + g_ptr_array_add (array, g_strdup_printf ("font(%s)", provides_tag)); + break; + case GS_APP_QUERY_PROVIDES_MIME_HANDLER: + g_ptr_array_add (array, g_strdup_printf ("mimehandler(%s)", provides_tag)); + break; + case GS_APP_QUERY_PROVIDES_PS_DRIVER: + g_ptr_array_add (array, g_strdup_printf ("postscriptdriver(%s)", provides_tag)); + break; + case GS_APP_QUERY_PROVIDES_PLASMA: + g_ptr_array_add (array, g_strdup_printf ("plasma4(%s)", provides_tag)); + g_ptr_array_add (array, g_strdup_printf ("plasma5(%s)", provides_tag)); + break; + case GS_APP_QUERY_PROVIDES_UNKNOWN: + default: + g_assert_not_reached (); + } + + g_ptr_array_add (array, NULL); + + return (gchar **) g_ptr_array_free (g_steal_pointer (&array), FALSE); +} + +static GsAppList * /* (transfer full) */ +list_apps_provides_sync (GsPluginRpmOstree *self, + gboolean interactive, + GsRPMOSTreeOS *os_proxy, + GsRPMOSTreeSysroot *sysroot_proxy, + GsAppQueryProvidesType provides_type, + const gchar *provides_tag, + GCancellable *cancellable, + GError **error) +{ + g_auto(GStrv) provides = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GVariant) packages = NULL; + gsize n_children; + gboolean done; + + provides = what_provides_decompose (provides_type, provides_tag); + done = FALSE; + while (!done) { + g_autoptr(GError) local_error = NULL; + done = TRUE; + if (!gs_rpmostree_os_call_what_provides_sync (os_proxy, + (const gchar * const *) provides, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + &packages, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, &local_error)) { + gs_rpmostree_error_convert (&local_error); + g_propagate_error (error, g_steal_pointer (&local_error)); + return NULL; + } + done = FALSE; + continue; + } + gs_rpmostree_error_convert (&local_error); + /* Ignore error when the corresponding D-Bus method does not exist */ + if (g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) { + return g_steal_pointer (&list); + } + g_propagate_error (error, g_steal_pointer (&local_error)); + return NULL; + } + } + n_children = g_variant_n_children (packages); + for (gsize i = 0; i < n_children; i++) { + g_autoptr(GVariant) value = g_variant_get_child_value (packages, i); + g_autoptr(GVariantDict) dict = g_variant_dict_new (value); + g_autoptr(GsApp) app = NULL; + const gchar *name = NULL; + const gchar *nevra = NULL; + + if (!g_variant_dict_lookup (dict, "nevra", "&s", &nevra) || + !g_variant_dict_lookup (dict, "name", "&s", &name)) + continue; + + app = gs_plugin_cache_lookup (GS_PLUGIN (self), nevra); + if (app != NULL) { + gs_app_list_add (list, app); + continue; + } + + /* create new app */ + app = gs_app_new (NULL); + gs_app_set_metadata (app, "GnomeSoftware::Creator", gs_plugin_get_name (GS_PLUGIN (self))); + gs_app_set_management_plugin (app, GS_PLUGIN (self)); + gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT); + app_set_rpm_ostree_packaging_format (app); + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_add_source (app, name); + gs_app_set_metadata (app, "GnomeSoftware::packagename-value", nevra); + + gs_plugin_cache_add (GS_PLUGIN (self), nevra, app); + gs_app_list_add (list, app); + } + + return g_steal_pointer (&list); +} + +static GsAppList * /* (transfer full) */ +list_apps_for_update_sync (GsPluginRpmOstree *self, + gboolean interactive, + GsRPMOSTreeOS *os_proxy, + GsRPMOSTreeSysroot *sysroot_proxy, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GVariant) cached_update = NULL; + g_autoptr(GVariant) rpm_diff = NULL; + g_autoptr(GVariant) advisories = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GHashTable) packages_with_urgency = NULL; + g_autoptr(GError) local_error = NULL; + const gchar *checksum = NULL; + const gchar *version = NULL; + g_auto(GVariantDict) cached_update_dict; + + /* ensure D-Bus properties are updated before reading them */ + if (!gs_rpmostree_sysroot_call_reload_sync (sysroot_proxy, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + cancellable, + &local_error)) { + g_debug ("Failed to call reload to get updates: %s", local_error->message); + return g_steal_pointer (&list); + } + + cached_update = gs_rpmostree_os_dup_cached_update (os_proxy); + g_variant_dict_init (&cached_update_dict, cached_update); + + if (!g_variant_dict_lookup (&cached_update_dict, "checksum", "&s", &checksum)) + return g_steal_pointer (&list); + if (!g_variant_dict_lookup (&cached_update_dict, "version", "&s", &version)) + return g_steal_pointer (&list); + + g_debug ("got CachedUpdate version '%s', checksum '%s'", version, checksum); + + advisories = g_variant_dict_lookup_value (&cached_update_dict, "advisories", G_VARIANT_TYPE ("a(suuasa{sv})")); + if (advisories != NULL) { + GVariantIter iter; + GVariant *child; + + packages_with_urgency = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + g_variant_iter_init (&iter, advisories); + while ((child = g_variant_iter_next_value (&iter)) != NULL) { + GVariantIter *packages_iter = NULL; + guint severity = 0; + g_variant_get (child, "(suuasa{sv})", NULL /* id */, NULL /* kind */, &severity, &packages_iter, NULL /* metadata */); + if (packages_iter) { + guint urgency = AS_URGENCY_KIND_UNKNOWN; /* RPM_OSTREE_ADVISORY_SEVERITY_NONE */ + switch (severity) { + case 1: /* RPM_OSTREE_ADVISORY_SEVERITY_LOW */ + urgency = AS_URGENCY_KIND_LOW; + break; + case 2: /* RPM_OSTREE_ADVISORY_SEVERITY_MODERATE */ + urgency = AS_URGENCY_KIND_MEDIUM; + break; + case 3: /* RPM_OSTREE_ADVISORY_SEVERITY_IMPORTANT */ + urgency = AS_URGENCY_KIND_HIGH; + break; + case 4: /* RPM_OSTREE_ADVISORY_SEVERITY_CRITICAL */ + urgency = AS_URGENCY_KIND_CRITICAL; + break; + default: + break; + } + if (urgency != AS_URGENCY_KIND_UNKNOWN) { + const gchar *pkgname = NULL; + while (g_variant_iter_loop (packages_iter, "s", &pkgname)) { + if (pkgname != NULL && *pkgname != '\0') { + if (GPOINTER_TO_UINT (g_hash_table_lookup (packages_with_urgency, pkgname)) < urgency) + g_hash_table_insert (packages_with_urgency, g_strdup (pkgname), GUINT_TO_POINTER (urgency)); + } + pkgname = NULL; + } + } + } + g_variant_unref (child); + } + } + + rpm_diff = g_variant_dict_lookup_value (&cached_update_dict, "rpm-diff", G_VARIANT_TYPE ("a{sv}")); + if (rpm_diff != NULL) { + GsPlugin *plugin = GS_PLUGIN (self); + GVariantIter iter; + GVariant *child; + g_autoptr(GVariant) upgraded = NULL; + g_autoptr(GVariant) downgraded = NULL; + g_autoptr(GVariant) removed = NULL; + g_autoptr(GVariant) added = NULL; + g_auto(GVariantDict) rpm_diff_dict; + g_variant_dict_init (&rpm_diff_dict, rpm_diff); + + upgraded = g_variant_dict_lookup_value (&rpm_diff_dict, "upgraded", G_VARIANT_TYPE ("a(us(ss)(ss))")); + if (upgraded == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no 'upgraded' in rpm-diff dict"); + return NULL; + } + downgraded = g_variant_dict_lookup_value (&rpm_diff_dict, "downgraded", G_VARIANT_TYPE ("a(us(ss)(ss))")); + if (downgraded == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no 'downgraded' in rpm-diff dict"); + return NULL; + } + removed = g_variant_dict_lookup_value (&rpm_diff_dict, "removed", G_VARIANT_TYPE ("a(usss)")); + if (removed == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no 'removed' in rpm-diff dict"); + return NULL; + } + added = g_variant_dict_lookup_value (&rpm_diff_dict, "added", G_VARIANT_TYPE ("a(usss)")); + if (added == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "no 'added' in rpm-diff dict"); + return NULL; + } + + /* iterate over all upgraded packages and add them */ + g_variant_iter_init (&iter, upgraded); + while ((child = g_variant_iter_next_value (&iter)) != NULL) { + g_autoptr(GsApp) app = app_from_modified_pkg_variant (plugin, child, packages_with_urgency); + if (app != NULL) + gs_app_list_add (list, app); + g_variant_unref (child); + } + + /* iterate over all downgraded packages and add them */ + g_variant_iter_init (&iter, downgraded); + while ((child = g_variant_iter_next_value (&iter)) != NULL) { + g_autoptr(GsApp) app = app_from_modified_pkg_variant (plugin, child, packages_with_urgency); + if (app != NULL) + gs_app_list_add (list, app); + g_variant_unref (child); + } + + /* iterate over all removed packages and add them */ + g_variant_iter_init (&iter, removed); + while ((child = g_variant_iter_next_value (&iter)) != NULL) { + g_autoptr(GsApp) app = app_from_single_pkg_variant (plugin, child, FALSE, packages_with_urgency); + if (app != NULL) + gs_app_list_add (list, app); + g_variant_unref (child); + } + + /* iterate over all added packages and add them */ + g_variant_iter_init (&iter, added); + while ((child = g_variant_iter_next_value (&iter)) != NULL) { + g_autoptr(GsApp) app = app_from_single_pkg_variant (plugin, child, TRUE, packages_with_urgency); + if (app != NULL) + gs_app_list_add (list, app); + g_variant_unref (child); + } + } + + return g_steal_pointer (&list); +} + +static void sanitize_update_history_text (gchar *text); + +static GsAppList * /* (transfer full) */ +list_apps_historical_updates_sync (GsPluginRpmOstree *self, + gboolean interactive, + GsRPMOSTreeOS *os_proxy, + GsRPMOSTreeSysroot *sysroot_proxy, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GSubprocess) subprocess = NULL; + g_autoptr(GsAppList) list = NULL; + g_autofree gchar *stdout_data = NULL; + + subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE, error, + "rpm-ostree", + "db", + "diff", + "--changelogs", + "--format=block", + NULL); + if (subprocess == NULL) + return NULL; + if (!g_subprocess_communicate_utf8 (subprocess, NULL, cancellable, &stdout_data, NULL, error)) + return NULL; + + if (stdout_data != NULL && *stdout_data != '\0') { + GsPlugin *plugin = GS_PLUGIN (self); + g_autoptr(GsApp) app = NULL; + g_autoptr(GIcon) ic = NULL; + + list = gs_app_list_new (); + + sanitize_update_history_text (stdout_data); + + /* create new */ + app = gs_app_new ("org.gnome.Software.RpmostreeUpdate"); + gs_app_set_management_plugin (app, plugin); + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + gs_app_set_name (app, + GS_APP_QUALITY_NORMAL, + /* TRANSLATORS: this is a group of updates that are not + * packages and are not shown in the main list */ + _("System Updates")); + gs_app_set_summary (app, + GS_APP_QUALITY_NORMAL, + /* TRANSLATORS: this is a longer description of the + * "System Updates" string */ + _("General system updates, such as security or bug fixes, and performance improvements.")); + gs_app_set_description (app, + GS_APP_QUALITY_NORMAL, + gs_app_get_summary (app)); + gs_app_set_update_details_text (app, stdout_data); + ic = g_themed_icon_new ("system-component-os-updates"); + gs_app_add_icon (app, ic); + + gs_app_list_add (list, app); + } + + return g_steal_pointer (&list); +} + +static GsAppList * /* (transfer full) */ +list_apps_sources_sync (GsPluginRpmOstree *self, + gboolean interactive, + GsRPMOSTreeOS *os_proxy, + GsRPMOSTreeSysroot *sysroot_proxy, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GVariant) repos = NULL; + g_autoptr(GMutexLocker) locker = NULL; + g_autoptr(GError) local_error = NULL; + GsPlugin *plugin = GS_PLUGIN (self); + gsize n_children; + gboolean done; + + done = FALSE; + while (!done) { + done = TRUE; + if (!gs_rpmostree_os_call_list_repos_sync (os_proxy, + interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE, + -1 /* timeout */, + &repos, + cancellable, + &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BUSY)) { + g_clear_error (&local_error); + if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error)) { + return FALSE; + } + done = FALSE; + continue; + } + gs_rpmostree_error_convert (&local_error); + /* Ignore error when the corresponding D-Bus method does not exist */ + if (g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) + return g_steal_pointer (&list); + g_propagate_error (error, g_steal_pointer (&local_error)); + return NULL; + } + } + + locker = g_mutex_locker_new (&self->cached_sources_mutex); + if (self->cached_sources == NULL) + self->cached_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + n_children = g_variant_n_children (repos); + for (gsize i = 0; i < n_children; i++) { + g_autoptr(GVariant) value = g_variant_get_child_value (repos, i); + g_autoptr(GVariantDict) dict = g_variant_dict_new (value); + g_autoptr(GsApp) app = NULL; + const gchar *id = NULL; + const gchar *description = NULL; + gboolean is_enabled = FALSE; + gboolean is_devel = FALSE; + gboolean is_source = FALSE; + + if (!g_variant_dict_lookup (dict, "id", "&s", &id)) + continue; + if (g_variant_dict_lookup (dict, "is-devel", "b", &is_devel) && is_devel) + continue; + /* hide these from the user */ + if (g_variant_dict_lookup (dict, "is-source", "b", &is_source) && is_source) + continue; + if (!g_variant_dict_lookup (dict, "description", "&s", &description)) + continue; + if (!g_variant_dict_lookup (dict, "is-enabled", "b", &is_enabled)) + is_enabled = FALSE; + + app = g_hash_table_lookup (self->cached_sources, id); + if (app == NULL) { + app = gs_app_new (id); + gs_app_set_management_plugin (app, plugin); + gs_app_set_kind (app, AS_COMPONENT_KIND_REPOSITORY); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + gs_app_set_state (app, is_enabled ? GS_APP_STATE_INSTALLED : GS_APP_STATE_AVAILABLE); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, description); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, description); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_metadata (app, "GnomeSoftware::SortKey", "200"); + gs_app_set_origin_ui (app, _("Operating System (OSTree)")); + } else { + g_object_ref (app); + /* The repo-related apps are those installed; due to re-using + cached app, make sure the list is populated from fresh data. */ + gs_app_list_remove_all (gs_app_get_related (app)); + } + + gs_app_list_add (list, app); + } + + return g_steal_pointer (&list); +} + +static void list_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + + task = gs_plugin_list_apps_data_new_task (plugin, query, flags, + cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_list_apps_async); + + /* Queue a job to get the apps. */ + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + list_apps_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +list_apps_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (source_object); + g_autoptr(GsAppList) list = NULL; + GsPluginListAppsData *data = task_data; + const gchar *provides_tag = NULL; + GsAppQueryProvidesType provides_type = GS_APP_QUERY_PROVIDES_UNKNOWN; + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_historical_update = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_source = GS_APP_QUERY_TRISTATE_UNSET; + g_autoptr(GError) local_error = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + gboolean interactive = (data->flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE) != 0; + + assert_in_worker (self); + + if (data->query != NULL) { + provides_type = gs_app_query_get_provides (data->query, &provides_tag); + is_for_update = gs_app_query_get_is_for_update (data->query); + is_historical_update = gs_app_query_get_is_historical_update (data->query); + is_source = gs_app_query_get_is_source (data->query); + } + + /* Currently only support a subset of query properties, and only one set at once. */ + if ((provides_tag == NULL && + is_for_update == GS_APP_QUERY_TRISTATE_UNSET && + is_historical_update == GS_APP_QUERY_TRISTATE_UNSET && + is_source == GS_APP_QUERY_TRISTATE_UNSET) || + is_for_update == GS_APP_QUERY_TRISTATE_FALSE || + is_historical_update == GS_APP_QUERY_TRISTATE_FALSE || + is_source == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (data->query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, &local_error) || + !gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (provides_tag != NULL) { + list = list_apps_provides_sync (self, interactive, os_proxy, sysroot_proxy, provides_type, provides_tag, cancellable, &local_error); + } else if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE) { + list = list_apps_for_update_sync (self, interactive, os_proxy, sysroot_proxy, cancellable, &local_error); + } else if (is_historical_update == GS_APP_QUERY_TRISTATE_TRUE) { + list = list_apps_historical_updates_sync (self, interactive, os_proxy, sysroot_proxy, cancellable, &local_error); + } else if (is_source == GS_APP_QUERY_TRISTATE_TRUE) { + list = list_apps_sources_sync (self, interactive, os_proxy, sysroot_proxy, cancellable, &local_error); + } + + if (list != NULL) + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static GsAppList * +gs_plugin_rpm_ostree_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void enable_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_enable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + + task = gs_plugin_manage_repository_data_new_task (plugin, repository, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_enable_repository_async); + + /* only process this app if it was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + enable_repository_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +enable_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (source_object); + GsPluginManageRepositoryData *data = task_data; + GsPluginRefreshMetadataData refresh_data = { 0 }; + gboolean interactive = (data->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (!gs_rpmostree_repo_enable (GS_PLUGIN (self), data->repository, TRUE, os_proxy, sysroot_proxy, interactive, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + refresh_data.flags = interactive ? GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE : GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE; + refresh_data.cache_age_secs = 1; + + if (!gs_plugin_rpm_ostree_refresh_metadata_in_worker (self, &refresh_data, os_proxy, sysroot_proxy, cancellable, &local_error)) + g_debug ("Failed to refresh after repository enable: %s", local_error->message); + + /* This can fail silently, it's only to update necessary caches, to provide + * up-to-date information after the successful repository enable/install. + */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_rpm_ostree_enable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void disable_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); + +static void +gs_plugin_rpm_ostree_disable_repository_async (GsPlugin *plugin, + GsApp *repository, + GsPluginManageRepositoryFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin); + g_autoptr(GTask) task = NULL; + gboolean interactive = (flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + + task = gs_plugin_manage_repository_data_new_task (plugin, repository, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_rpm_ostree_disable_repository_async); + + /* only process this app if it was created by this plugin */ + if (!gs_app_has_management_plugin (repository, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + g_assert (gs_app_get_kind (repository) == AS_COMPONENT_KIND_REPOSITORY); + + gs_worker_thread_queue (self->worker, get_priority_for_interactivity (interactive), + disable_repository_thread_cb, g_steal_pointer (&task)); +} + +/* Run in @worker. */ +static void +disable_repository_thread_cb (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (source_object); + GsPluginManageRepositoryData *data = task_data; + g_autoptr(GsRPMOSTreeOS) os_proxy = NULL; + g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL; + gboolean interactive = data->flags & GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE; + g_autoptr(GError) local_error = NULL; + + assert_in_worker (self); + + if (!gs_rpmostree_ref_proxies (self, interactive, &os_proxy, &sysroot_proxy, cancellable, &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (gs_rpmostree_repo_enable (GS_PLUGIN (self), data->repository, FALSE, os_proxy, sysroot_proxy, interactive, cancellable, &local_error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static gboolean +gs_plugin_rpm_ostree_disable_repository_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static const gchar * +find_char_on_line (const gchar *txt, + gchar chr) +{ + while (*txt != '\n' && *txt != '\0' && *txt != chr) + txt++; + return *txt == chr ? txt : NULL; +} + +static void +sanitize_update_history_text (gchar *text) +{ + gchar *read_pos = text, *write_pos = text; + gsize text_len = strlen (text); + + #define skip_after(_chr) G_STMT_START { \ + while (*read_pos != '\0' && *read_pos != '\n' && *read_pos != (_chr)) { \ + if (read_pos != write_pos) \ + *write_pos = *read_pos; \ + read_pos++; \ + write_pos++; \ + } \ + if (*read_pos == (_chr)) { \ + if (read_pos != write_pos) \ + *write_pos = *read_pos; \ + read_pos++; \ + write_pos++; \ + } \ + } G_STMT_END + #define skip_whitespace() G_STMT_START { \ + while (*read_pos != '\0' && *read_pos != '\n' && g_ascii_isspace (*read_pos)) { \ + if (read_pos != write_pos) \ + *write_pos = *read_pos; \ + read_pos++; \ + write_pos++; \ + } \ + } G_STMT_END + + /* The first two lines begin with "ostree diff commit from/to:" - skip them. */ + if (g_ascii_strncasecmp (read_pos, "ostree diff", strlen ("ostree diff")) == 0) + skip_after ('\n'); + if (g_ascii_strncasecmp (read_pos, "ostree diff", strlen ("ostree diff")) == 0) + skip_after ('\n'); + write_pos = text; + + while (*read_pos != '\0') { + skip_whitespace (); + + /* Hide email addresses */ + if (*read_pos == '*') { + const gchar *start, *end; + + start = find_char_on_line (read_pos, '<'); + if (start != NULL) { + end = find_char_on_line (start, '>'); + if (end != NULL) { + while (read_pos < start) { + if (read_pos != write_pos) + *write_pos = *read_pos; + read_pos++; + write_pos++; + } + read_pos += end - read_pos; + if (*read_pos == '>' && g_ascii_isspace (read_pos[1])) + read_pos += 2; + } + } + } + + skip_after ('\n'); + } + + #undef skip_until + #undef skip_whitespace + + if (read_pos != write_pos) + *write_pos = '\0'; + + /* The logs can have thousands kilobytes of data, which is not good for GtkLabel, + which has (together with Pango) a hard time to process it and show it (high CPU + use for seconds or even minutes). + + Cut the log in 4KB, which is not so big and not so small part of the log. + This will be extended to parse the output and split the texts by package in the future. */ + if (write_pos - text + strlen ("…") > 4096) { + write_pos = g_utf8_offset_to_pointer (text, g_utf8_strlen (text, 4096)); + *write_pos = '\0'; + if (write_pos - text + strlen ("…") < text_len - 1) + strcat (write_pos, "…"); + } +} + +static void +gs_plugin_rpm_ostree_class_init (GsPluginRpmOstreeClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_rpm_ostree_dispose; + object_class->finalize = gs_plugin_rpm_ostree_finalize; + + plugin_class->setup_async = gs_plugin_rpm_ostree_setup_async; + plugin_class->setup_finish = gs_plugin_rpm_ostree_setup_finish; + plugin_class->shutdown_async = gs_plugin_rpm_ostree_shutdown_async; + plugin_class->shutdown_finish = gs_plugin_rpm_ostree_shutdown_finish; + plugin_class->refine_async = gs_plugin_rpm_ostree_refine_async; + plugin_class->refine_finish = gs_plugin_rpm_ostree_refine_finish; + plugin_class->refresh_metadata_async = gs_plugin_rpm_ostree_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_rpm_ostree_refresh_metadata_finish; + plugin_class->enable_repository_async = gs_plugin_rpm_ostree_enable_repository_async; + plugin_class->enable_repository_finish = gs_plugin_rpm_ostree_enable_repository_finish; + plugin_class->disable_repository_async = gs_plugin_rpm_ostree_disable_repository_async; + plugin_class->disable_repository_finish = gs_plugin_rpm_ostree_disable_repository_finish; + plugin_class->list_apps_async = gs_plugin_rpm_ostree_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_rpm_ostree_list_apps_finish; + plugin_class->install_apps_async = gs_plugin_rpm_ostree_install_apps_async; + plugin_class->install_apps_finish = gs_plugin_rpm_ostree_install_apps_finish; + plugin_class->uninstall_apps_async = gs_plugin_rpm_ostree_uninstall_apps_async; + plugin_class->uninstall_apps_finish = gs_plugin_rpm_ostree_uninstall_apps_finish; + plugin_class->update_apps_async = gs_plugin_rpm_ostree_update_apps_async; + plugin_class->update_apps_finish = gs_plugin_rpm_ostree_update_apps_finish; + plugin_class->download_upgrade_async = gs_plugin_rpm_ostree_download_upgrade_async; + plugin_class->download_upgrade_finish = gs_plugin_rpm_ostree_download_upgrade_finish; + plugin_class->trigger_upgrade_async = gs_plugin_rpm_ostree_trigger_upgrade_async; + plugin_class->trigger_upgrade_finish = gs_plugin_rpm_ostree_trigger_upgrade_finish; + plugin_class->launch_async = gs_plugin_rpm_ostree_launch_async; + plugin_class->launch_finish = gs_plugin_rpm_ostree_launch_finish; + plugin_class->file_to_app_async = gs_plugin_rpm_ostree_file_to_app_async; + plugin_class->file_to_app_finish = gs_plugin_rpm_ostree_file_to_app_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_RPM_OSTREE; +} diff --git a/plugins/rpm-ostree/gs-plugin-rpm-ostree.h b/plugins/rpm-ostree/gs-plugin-rpm-ostree.h new file mode 100644 index 0000000..e85d34e --- /dev/null +++ b/plugins/rpm-ostree/gs-plugin-rpm-ostree.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_RPM_OSTREE (gs_plugin_rpm_ostree_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginRpmOstree, gs_plugin_rpm_ostree, GS, PLUGIN_RPM_OSTREE, GsPlugin) + +G_END_DECLS diff --git a/plugins/rpm-ostree/meson.build b/plugins/rpm-ostree/meson.build new file mode 100644 index 0000000..42c837c --- /dev/null +++ b/plugins/rpm-ostree/meson.build @@ -0,0 +1,20 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginRpmOstree"'] + +rpmostree_generated = gnome.gdbus_codegen( + 'gs-rpmostree-generated', + 'org.projectatomic.rpmostree1.xml', + interface_prefix : 'org.projectatomic.rpmostree1', + namespace : 'GsRPMOSTree', + extra_args : [ '--glib-min-required=' + glib.version() ], +) + +shared_module( + 'gs_plugin_rpm-ostree', + rpmostree_generated, + sources : 'gs-plugin-rpm-ostree.c', + install : true, + install_dir: plugin_dir, + install_rpath: join_paths(rpm_ostree.get_variable('libdir'), 'rpm-ostree'), + c_args : cargs, + dependencies : [ plugin_libs, ostree, rpm, rpm_ostree ], +) diff --git a/plugins/rpm-ostree/org.projectatomic.rpmostree1.xml b/plugins/rpm-ostree/org.projectatomic.rpmostree1.xml new file mode 100644 index 0000000..b11ff5d --- /dev/null +++ b/plugins/rpm-ostree/org.projectatomic.rpmostree1.xml @@ -0,0 +1,605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/snap/gs-plugin-snap.c b/plugins/snap/gs-plugin-snap.c new file mode 100644 index 0000000..b9add36 --- /dev/null +++ b/plugins/snap/gs-plugin-snap.c @@ -0,0 +1,2724 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2015-2018 Canonical Ltd + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include +#include +#include +#include + +#include "gs-plugin-snap.h" + +/* + * SECTION: + * Lists and allows installation/uninstallation of snaps from the snap store. + * + * Since snapd is a daemon accessible via HTTP calls on a Unix socket, this + * plugin basically translates every job into one or more HTTP request, and all + * the real work is done in the snapd daemon. FIXME: This means the plugin can + * therefore execute entirely in the main thread, making asynchronous calls, + * once all the vfuncs have been ported. + */ + +struct _GsPluginSnap { + GsPlugin parent; + + gchar *store_name; + gchar *store_hostname; + SnapdSystemConfinement system_confinement; + + GMutex store_snaps_lock; + GHashTable *store_snaps; +}; + +G_DEFINE_TYPE (GsPluginSnap, gs_plugin_snap, GS_TYPE_PLUGIN) + +typedef struct { + SnapdSnap *snap; + gboolean full_details; +} CacheEntry; + +static CacheEntry * +cache_entry_new (SnapdSnap *snap, gboolean full_details) +{ + CacheEntry *entry = g_slice_new (CacheEntry); + entry->snap = g_object_ref (snap); + entry->full_details = full_details; + return entry; +} + +static void +cache_entry_free (CacheEntry *entry) +{ + g_object_unref (entry->snap); + g_slice_free (CacheEntry, entry); +} + +static SnapdAuthData * +get_auth_data (GsPluginSnap *self) +{ + g_autofree gchar *path = NULL; + g_autoptr(JsonParser) parser = NULL; + JsonNode *root; + JsonObject *object; + const gchar *macaroon; + g_autoptr(GPtrArray) discharges = NULL; + g_autoptr(GError) error = NULL; + + path = g_build_filename (g_get_home_dir (), ".snap", "auth.json", NULL); + parser = json_parser_new (); + if (!json_parser_load_from_file (parser, path, &error)) { + if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) + g_warning ("Failed to load snap auth data: %s", error->message); + return NULL; + } + + root = json_parser_get_root (parser); + if (root == NULL) + return NULL; + + if (json_node_get_node_type (root) != JSON_NODE_OBJECT) { + g_warning ("Ignoring invalid snap auth data in %s", path); + return NULL; + } + object = json_node_get_object (root); + if (!json_object_has_member (object, "macaroon")) { + g_warning ("Ignoring invalid snap auth data in %s", path); + return NULL; + } + macaroon = json_object_get_string_member (object, "macaroon"); + discharges = g_ptr_array_new (); + if (json_object_has_member (object, "discharges")) { + JsonArray *discharge_array; + + discharge_array = json_object_get_array_member (object, "discharges"); + for (guint i = 0; i < json_array_get_length (discharge_array); i++) + g_ptr_array_add (discharges, (gpointer) json_array_get_string_element (discharge_array, i)); + } + g_ptr_array_add (discharges, NULL); + + return snapd_auth_data_new (macaroon, (GStrv) discharges->pdata); +} + +static SnapdClient * +get_client (GsPluginSnap *self, + gboolean interactive, + GError **error) +{ + g_autoptr(SnapdClient) client = NULL; + const gchar *old_user_agent; + g_autofree gchar *user_agent = NULL; + g_autoptr(SnapdAuthData) auth_data = NULL; + + client = snapd_client_new (); + snapd_client_set_allow_interaction (client, interactive); + old_user_agent = snapd_client_get_user_agent (client); + user_agent = g_strdup_printf ("%s %s", gs_user_agent (), old_user_agent); + snapd_client_set_user_agent (client, user_agent); + + auth_data = get_auth_data (self); + snapd_client_set_auth_data (client, auth_data); + + return g_steal_pointer (&client); +} + +static void +gs_plugin_snap_init (GsPluginSnap *self) +{ + g_autoptr(SnapdClient) client = NULL; + g_autoptr (GError) error = NULL; + + g_mutex_init (&self->store_snaps_lock); + + client = get_client (self, FALSE, &error); + if (client == NULL) { + gs_plugin_set_enabled (GS_PLUGIN (self), FALSE); + return; + } + + self->store_snaps = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) cache_entry_free); + + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_BETTER_THAN, "packagekit"); + gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_BEFORE, "icons"); + + /* set name of MetaInfo file */ + gs_plugin_set_appstream_id (GS_PLUGIN (self), "org.gnome.Software.Plugin.Snap"); +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app) +{ + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_SNAP) + gs_app_set_management_plugin (app, plugin); + + if (gs_app_get_id (app) != NULL && g_str_has_prefix (gs_app_get_id (app), "io.snapcraft.")) { + g_autofree gchar *name_and_id = NULL; + gchar *divider, *snap_name;/*, *id;*/ + + name_and_id = g_strdup (gs_app_get_id (app) + strlen ("io.snapcraft.")); + divider = strrchr (name_and_id, '-'); + if (divider != NULL) { + *divider = '\0'; + snap_name = name_and_id; + /*id = divider + 1;*/ /* NOTE: Should probably validate ID */ + + gs_app_set_management_plugin (app, plugin); + gs_app_set_metadata (app, "snap::name", snap_name); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_SNAP); + } + } +} + +static void +snapd_error_convert (GError **perror) +{ + GError *error = perror != NULL ? *perror : NULL; + + /* not set */ + if (error == NULL) + return; + + /* this are allowed for low-level errors */ + if (gs_utils_error_convert_gio (perror)) + return; + + /* custom to this plugin */ + if (error->domain == SNAPD_ERROR) { + switch (error->code) { + case SNAPD_ERROR_AUTH_DATA_REQUIRED: + error->code = GS_PLUGIN_ERROR_AUTH_REQUIRED; + g_free (error->message); + error->message = g_strdup ("Requires authentication with @snapd"); + break; + case SNAPD_ERROR_AUTH_DATA_INVALID: + case SNAPD_ERROR_TWO_FACTOR_INVALID: + error->code = GS_PLUGIN_ERROR_AUTH_INVALID; + break; + case SNAPD_ERROR_AUTH_CANCELLED: + error->code = GS_PLUGIN_ERROR_CANCELLED; + break; + case SNAPD_ERROR_CONNECTION_FAILED: + case SNAPD_ERROR_WRITE_FAILED: + case SNAPD_ERROR_READ_FAILED: + case SNAPD_ERROR_BAD_REQUEST: + case SNAPD_ERROR_BAD_RESPONSE: + case SNAPD_ERROR_PERMISSION_DENIED: + case SNAPD_ERROR_FAILED: + case SNAPD_ERROR_TERMS_NOT_ACCEPTED: + case SNAPD_ERROR_PAYMENT_NOT_SETUP: + case SNAPD_ERROR_PAYMENT_DECLINED: + case SNAPD_ERROR_ALREADY_INSTALLED: + case SNAPD_ERROR_NOT_INSTALLED: + case SNAPD_ERROR_NO_UPDATE_AVAILABLE: + case SNAPD_ERROR_PASSWORD_POLICY_ERROR: + case SNAPD_ERROR_NEEDS_DEVMODE: + case SNAPD_ERROR_NEEDS_CLASSIC: + case SNAPD_ERROR_NEEDS_CLASSIC_SYSTEM: + default: + error->code = GS_PLUGIN_ERROR_FAILED; + break; + } + } else { + g_warning ("can't reliably fixup error from domain %s", + g_quark_to_string (error->domain)); + error->code = GS_PLUGIN_ERROR_FAILED; + } + error->domain = GS_PLUGIN_ERROR; +} + +static void get_system_information_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void get_store_snap_async (GsPluginSnap *self, + SnapdClient *client, + const gchar *name, + gboolean need_details, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static SnapdSnap *get_store_snap_finish (GsPluginSnap *self, + GAsyncResult *result, + GError **error); +static void add_channels (GsPluginSnap *self, + SnapdSnap *snap, + GsAppList *list); + +static void +gs_plugin_snap_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (plugin); + g_autoptr(SnapdClient) client = NULL; + g_autoptr(GTask) task = NULL; + gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_snap_setup_async); + + client = get_client (self, interactive, &local_error); + if (client == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + snapd_client_get_system_information_async (client, cancellable, + get_system_information_cb, g_steal_pointer (&task)); +} + +static void +get_system_information_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginSnap *self = g_task_get_source_object (task); + g_autoptr(SnapdSystemInformation) system_information = NULL; + g_autoptr(GError) local_error = NULL; + + system_information = snapd_client_get_system_information_finish (client, result, &local_error); + if (system_information == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + self->store_name = g_strdup (snapd_system_information_get_store (system_information)); + if (self->store_name == NULL) { + self->store_name = g_strdup (/* TRANSLATORS: default snap store name */ + _("Snap Store")); + self->store_hostname = g_strdup ("snapcraft.io"); + } + self->system_confinement = snapd_system_information_get_confinement (system_information); + + g_debug ("Version '%s' on OS %s %s", + snapd_system_information_get_version (system_information), + snapd_system_information_get_os_id (system_information), + snapd_system_information_get_os_version (system_information)); + + /* success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_snap_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static SnapdSnap * +store_snap_cache_lookup (GsPluginSnap *self, + const gchar *name, + gboolean need_details) +{ + CacheEntry *entry; + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->store_snaps_lock); + + entry = g_hash_table_lookup (self->store_snaps, name); + if (entry == NULL) + return NULL; + + if (need_details && !entry->full_details) + return NULL; + + return g_object_ref (entry->snap); +} + +static void +store_snap_cache_update (GsPluginSnap *self, + GPtrArray *snaps, + gboolean full_details) +{ + g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->store_snaps_lock); + guint i; + + for (i = 0; i < snaps->len; i++) { + SnapdSnap *snap = snaps->pdata[i]; + g_debug ("Caching '%s' by '%s' version %s revision %s", + snapd_snap_get_title (snap), + snapd_snap_get_publisher_display_name (snap), + snapd_snap_get_version (snap), + snapd_snap_get_revision (snap)); + g_hash_table_insert (self->store_snaps, g_strdup (snapd_snap_get_name (snap)), cache_entry_new (snap, full_details)); + } +} + +static GPtrArray * +find_snaps (GsPluginSnap *self, + SnapdClient *client, + SnapdFindFlags flags, + const gchar *category, + const gchar *query, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GPtrArray) snaps = NULL; + + snaps = snapd_client_find_category_sync (client, flags, category, query, NULL, cancellable, error); + if (snaps == NULL) { + snapd_error_convert (error); + return NULL; + } + + store_snap_cache_update (self, snaps, flags & SNAPD_FIND_FLAGS_MATCH_NAME); + + return g_steal_pointer (&snaps); +} + +static gchar * +get_appstream_id (SnapdSnap *snap) +{ + GStrv common_ids; + + /* Get the AppStream ID from the snap, or generate a fallback one */ + common_ids = snapd_snap_get_common_ids (snap); + if (g_strv_length (common_ids) == 1) + return g_strdup (common_ids[0]); + else + return g_strdup_printf ("io.snapcraft.%s-%s", snapd_snap_get_name (snap), snapd_snap_get_id (snap)); +} + +static AsComponentKind +snap_guess_component_kind (SnapdSnap *snap) +{ + switch (snapd_snap_get_snap_type (snap)) { + case SNAPD_SNAP_TYPE_APP: + return AS_COMPONENT_KIND_DESKTOP_APP; + case SNAPD_SNAP_TYPE_KERNEL: + case SNAPD_SNAP_TYPE_GADGET: + case SNAPD_SNAP_TYPE_OS: + return AS_COMPONENT_KIND_RUNTIME; + default: + case SNAPD_SNAP_TYPE_UNKNOWN: + return AS_COMPONENT_KIND_UNKNOWN; + } +} + +static GsApp * +snap_to_app (GsPluginSnap *self, SnapdSnap *snap, const gchar *branch) +{ + g_autofree gchar *cache_id = NULL; + g_autoptr(GsApp) app = NULL; + + cache_id = g_strdup_printf ("%s:%s", snapd_snap_get_name (snap), branch != NULL ? branch : ""); + + app = gs_plugin_cache_lookup (GS_PLUGIN (self), cache_id); + if (app == NULL) { + g_autofree gchar *appstream_id = NULL; + + appstream_id = get_appstream_id (snap); + app = gs_app_new (appstream_id); + gs_app_set_kind (app, snap_guess_component_kind (snap)); + gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_SNAP); + gs_app_set_branch (app, branch); + gs_app_set_metadata (app, "snap::name", snapd_snap_get_name (snap)); + gs_app_set_metadata (app, "GnomeSoftware::PackagingIcon", "package-snap-symbolic"); + gs_plugin_cache_add (GS_PLUGIN (self), cache_id, app); + } + + gs_app_set_management_plugin (app, GS_PLUGIN (self)); + gs_app_add_quirk (app, GS_APP_QUIRK_DO_NOT_AUTO_UPDATE); + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_DESKTOP_APP) + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + if (gs_plugin_check_distro_id (GS_PLUGIN (self), "ubuntu")) + gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE); + if (branch != NULL && (g_str_has_suffix (branch, "/beta") || g_str_has_suffix (branch, "/edge"))) + gs_app_add_quirk (app, GS_APP_QUIRK_DEVELOPMENT_SOURCE); + + return g_steal_pointer (&app); +} + +typedef struct { + char *url; /* (owned) (not nullable) */ + GsPluginUrlToAppFlags flags; + + gboolean tried_match_common_id; +} UrlToAppData; + +static void +url_to_app_data_free (UrlToAppData *data) +{ + g_free (data->url); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UrlToAppData, url_to_app_data_free) + +static void url_to_app_find_category_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_snap_url_to_app_async (GsPlugin *plugin, + const gchar *url, + GsPluginUrlToAppFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(UrlToAppData) data = NULL; + gboolean interactive = (flags & GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE) != 0; + g_autoptr(SnapdClient) client = NULL; + g_autofree gchar *scheme = NULL; + g_autofree gchar *path = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_snap_url_to_app_async); + + data = g_new0 (UrlToAppData, 1); + data->url = g_strdup (url); + data->flags = flags; + + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) url_to_app_data_free); + + /* not us */ + scheme = gs_utils_get_url_scheme (url); + if (g_strcmp0 (scheme, "snap") != 0 && + g_strcmp0 (scheme, "appstream") != 0) { + g_task_return_pointer (task, gs_app_list_new (), g_object_unref); + return; + } + + /* Create client. */ + client = get_client (self, interactive, &local_error); + if (client == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* create app */ + path = gs_utils_get_url_path (url); + snapd_client_find_category_async (client, + SNAPD_FIND_FLAGS_SCOPE_WIDE | SNAPD_FIND_FLAGS_MATCH_NAME, + NULL, path, cancellable, + url_to_app_find_category_cb, g_steal_pointer (&task)); +} + +static void +url_to_app_find_category_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + GsPluginSnap *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + UrlToAppData *data = g_task_get_task_data (task); + g_autoptr(GPtrArray) snaps = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) local_error = NULL; + + snaps = snapd_client_find_category_finish (client, result, NULL, &local_error); + + if ((snaps == NULL || snaps->len < 1) && + !data->tried_match_common_id) { + g_autofree char *path = NULL; + + /* This works for the appstream:// URL-s */ + data->tried_match_common_id = TRUE; + + path = gs_utils_get_url_path (data->url); + snapd_client_find_category_async (client, + SNAPD_FIND_FLAGS_SCOPE_WIDE | SNAPD_FIND_FLAGS_MATCH_COMMON_ID, + NULL, path, cancellable, + url_to_app_find_category_cb, g_steal_pointer (&task)); + return; + } + + if (snaps != NULL) + store_snap_cache_update (self, snaps, FALSE); + + if (snaps == NULL || snaps->len < 1) { + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); + return; + } + + app = snap_to_app (self, g_ptr_array_index (snaps, 0), NULL); + gs_app_list_add (list, app); + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_snap_url_to_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_snap_dispose (GObject *object) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (object); + + g_clear_pointer (&self->store_name, g_free); + g_clear_pointer (&self->store_hostname, g_free); + g_clear_pointer (&self->store_snaps, g_hash_table_unref); + + G_OBJECT_CLASS (gs_plugin_snap_parent_class)->dispose (object); +} + +static void +gs_plugin_snap_finalize (GObject *object) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (object); + + g_mutex_clear (&self->store_snaps_lock); + + G_OBJECT_CLASS (gs_plugin_snap_parent_class)->finalize (object); +} + +static gboolean +is_banner_image (const gchar *filename) +{ + /* Check if this screenshot was uploaded as "banner.png" or "banner.jpg". + * The server optionally adds a 7 character suffix onto it if it would collide with + * an existing name, e.g. "banner_MgEy4MI.png" + * See https://forum.snapcraft.io/t/improve-method-for-setting-featured-snap-banner-image-in-store/ + */ + return g_regex_match_simple ("^banner(?:_[a-zA-Z0-9]{7})?\\.(?:png|jpg)$", filename, 0, 0); +} + +static gboolean +is_banner_icon_image (const gchar *filename) +{ + /* Check if this screenshot was uploaded as "banner-icon.png" or "banner-icon.jpg". + * The server optionally adds a 7 character suffix onto it if it would collide with + * an existing name, e.g. "banner-icon_Ugn6pmj.png" + * See https://forum.snapcraft.io/t/improve-method-for-setting-featured-snap-banner-image-in-store/ + */ + return g_regex_match_simple ("^banner-icon(?:_[a-zA-Z0-9]{7})?\\.(?:png|jpg)$", filename, 0, 0); +} + +/* Build a string representation of the IDs of a category and its parents. + * For example, `develop/featured`. */ +static gchar * +category_build_full_path (GsCategory *category) +{ + g_autoptr(GString) id = g_string_new (""); + GsCategory *c; + + for (c = category; c != NULL; c = gs_category_get_parent (c)) { + if (c != category) + g_string_prepend (id, "/"); + g_string_prepend (id, gs_category_get_id (c)); + } + + return g_string_free (g_steal_pointer (&id), FALSE); +} + +typedef struct { + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ + GsAppList *results_list; /* (owned) (nullable) */ +} ListAppsData; + +static void +list_apps_data_free (ListAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + g_assert (data->results_list == NULL); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ListAppsData, list_apps_data_free) + +static void list_installed_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void list_alternate_apps_snap_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void list_alternate_apps_nonsnap_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void list_alternative_apps_nonsnap_get_store_snap_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void list_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void list_apps_for_update_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_list_apps_op (GTask *task, + GError *error); + +static void +gs_plugin_snap_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(ListAppsData) owned_data = NULL; + ListAppsData *data; + g_autoptr(SnapdClient) client = NULL; + gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + GsAppQueryTristate is_curated = GS_APP_QUERY_TRISTATE_UNSET; + GsCategory *category = NULL; + GsAppQueryTristate is_installed = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + const gchar * const *keywords = NULL; + GsApp *alternate_of = NULL; + const gchar * const *sections = NULL; + const gchar * const curated_sections[] = { "featured", NULL }; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + data = owned_data = g_new0 (ListAppsData, 1); + g_task_set_task_data (task, g_steal_pointer (&owned_data), (GDestroyNotify) list_apps_data_free); + g_task_set_source_tag (task, gs_plugin_snap_list_apps_async); + + client = get_client (self, interactive, &local_error); + if (client == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (query != NULL) { + is_curated = gs_app_query_get_is_curated (query); + category = gs_app_query_get_category (query); + is_installed = gs_app_query_get_is_installed (query); + keywords = gs_app_query_get_keywords (query); + alternate_of = gs_app_query_get_alternate_of (query); + is_for_update = gs_app_query_get_is_for_update (query); + } + + /* Currently only support a subset of query properties, and only one set at once. + * Also don’t currently support GS_APP_QUERY_TRISTATE_FALSE. */ + if ((is_curated == GS_APP_QUERY_TRISTATE_UNSET && + category == NULL && + is_installed == GS_APP_QUERY_TRISTATE_UNSET && + keywords == NULL && + alternate_of == NULL && + is_for_update == GS_APP_QUERY_TRISTATE_UNSET) || + is_curated == GS_APP_QUERY_TRISTATE_FALSE || + is_installed == GS_APP_QUERY_TRISTATE_FALSE || + is_for_update == GS_APP_QUERY_TRISTATE_FALSE || + gs_app_query_get_n_properties_set (query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + data->results_list = gs_app_list_new (); + + /* Listing installed apps requires calling a different libsnapd method, + * so check that first. */ + if (is_installed != GS_APP_QUERY_TRISTATE_UNSET) { + data->n_pending_ops++; + snapd_client_get_snaps_async (client, SNAPD_GET_SNAPS_FLAGS_NONE, NULL, + cancellable, list_installed_apps_cb, g_steal_pointer (&task)); + return; + } + + /* Get the list of refreshable snaps */ + if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE) { + data->n_pending_ops++; + snapd_client_find_refreshable_async (client, cancellable, list_apps_for_update_cb, g_steal_pointer (&task)); + return; + } + + /* Listing alternates also requires special handling. */ + if (alternate_of != NULL) { + /* If it is a snap, find the channels that snap provides, otherwise find snaps that match on common id */ + if (gs_app_has_management_plugin (alternate_of, plugin)) { + const gchar *snap_name; + + snap_name = gs_app_get_metadata_item (alternate_of, "snap::name"); + + data->n_pending_ops++; + get_store_snap_async (self, client, snap_name, TRUE, cancellable, list_alternate_apps_snap_cb, g_steal_pointer (&task)); + /* The id can be NULL for example for local package files */ + } else if (gs_app_get_id (alternate_of) != NULL) { + data->n_pending_ops++; + snapd_client_find_category_async (client, + SNAPD_FIND_FLAGS_SCOPE_WIDE | SNAPD_FIND_FLAGS_MATCH_COMMON_ID, + NULL, gs_app_get_id (alternate_of), + cancellable, + list_alternate_apps_nonsnap_cb, g_steal_pointer (&task)); + } else { + g_clear_object (&data->results_list); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported app without id"); + } + + return; + } + + /* Querying with keywords also requires calling the method differently. + * snapd will tokenise and stem @query internally. */ + if (keywords != NULL) { + g_autofree gchar *query_str = NULL; + + query_str = g_strjoinv (" ", (gchar **) keywords); + data->n_pending_ops++; + snapd_client_find_category_async (client, SNAPD_FIND_FLAGS_SCOPE_WIDE, NULL, query_str, + cancellable, list_apps_cb, g_steal_pointer (&task)); + return; + } + + /* Work out which sections we’re querying for. */ + if (is_curated != GS_APP_QUERY_TRISTATE_UNSET) { + sections = curated_sections; + } else if (category != NULL) { + g_autofree gchar *category_path = NULL; + + /* + * Unused categories: + * + * health-and-fitness + * personalisation + * devices-and-iot + * security + * server-and-cloud + * entertainment + */ + const struct { + const gchar *category_path; + const gchar *sections[4]; + } category_to_sections_map[] = { + { "play/featured", { "games", NULL, }}, + { "create/featured", { "photo-and-video", "art-and-design", "music-and-video", NULL, }}, + { "socialize/featured", { "social", "news-and-weather", NULL, }}, + { "work/featured", { "productivity", "finance", "utilities", NULL, }}, + { "develop/featured", { "development", NULL, }}, + { "learn/featured", { "education", "science", "books-and-reference", NULL, }}, + }; + + category_path = category_build_full_path (category); + + for (gsize i = 0; i < G_N_ELEMENTS (category_to_sections_map); i++) { + if (g_str_equal (category_to_sections_map[i].category_path, category_path)) { + sections = category_to_sections_map[i].sections; + break; + } + } + } + + /* Start a query for each of the sections we’re interested in, keeping a + * counter of pending operations which is initialised to 1 until all + * the operations are started. */ + data->n_pending_ops = 1; + + for (gsize i = 0; sections != NULL && sections[i] != NULL; i++) { + data->n_pending_ops++; + snapd_client_find_category_async (client, SNAPD_FIND_FLAGS_SCOPE_WIDE, sections[i], NULL, + cancellable, list_apps_cb, g_object_ref (task)); + } + + finish_list_apps_op (task, NULL); +} + +static void +list_installed_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginSnap *self = g_task_get_source_object (task); + ListAppsData *data = g_task_get_task_data (task); + g_autoptr(GPtrArray) snaps = NULL; + g_autoptr(GError) local_error = NULL; + + snaps = snapd_client_get_snaps_finish (client, result, &local_error); + + if (snaps == NULL) { + snapd_error_convert (&local_error); + } + + for (guint i = 0; snaps != NULL && i < snaps->len; i++) { + SnapdSnap *snap = g_ptr_array_index (snaps, i); + g_autoptr(GsApp) app = NULL; + + app = snap_to_app (self, snap, NULL); + gs_app_list_add (data->results_list, app); + } + + finish_list_apps_op (task, g_steal_pointer (&local_error)); +} + +static void +list_alternate_apps_snap_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (source_object); + g_autoptr(GTask) task = G_TASK (user_data); + ListAppsData *data = g_task_get_task_data (task); + g_autoptr(SnapdSnap) snap = NULL; + g_autoptr(GError) local_error = NULL; + + snap = get_store_snap_finish (self, result, &local_error); + + if (snap != NULL) + add_channels (self, snap, data->results_list); + + finish_list_apps_op (task, g_steal_pointer (&local_error)); +} + +static void +list_alternate_apps_nonsnap_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginSnap *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + ListAppsData *data = g_task_get_task_data (task); + g_autoptr(GPtrArray) snaps = NULL; + g_autoptr(GError) local_error = NULL; + + snaps = snapd_client_find_category_finish (client, result, NULL, &local_error); + + if (snaps == NULL) { + snapd_error_convert (&local_error); + finish_list_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + store_snap_cache_update (self, snaps, FALSE); + + for (guint i = 0; snaps != NULL && i < snaps->len; i++) { + SnapdSnap *snap = g_ptr_array_index (snaps, i); + + data->n_pending_ops++; + get_store_snap_async (self, client, snapd_snap_get_name (snap), + TRUE, cancellable, list_alternative_apps_nonsnap_get_store_snap_cb, g_object_ref (task)); + } + + finish_list_apps_op (task, NULL); +} + +static void +list_alternative_apps_nonsnap_get_store_snap_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (source_object); + g_autoptr(GTask) task = G_TASK (user_data); + ListAppsData *data = g_task_get_task_data (task); + g_autoptr(SnapdSnap) store_snap = NULL; + g_autoptr(GError) local_error = NULL; + + store_snap = get_store_snap_finish (self, result, &local_error); + + if (store_snap != NULL) + add_channels (self, store_snap, data->results_list); + + finish_list_apps_op (task, g_steal_pointer (&local_error)); +} + +static void +list_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(GTask) task = G_TASK (user_data); + GsPluginSnap *self = g_task_get_source_object (task); + ListAppsData *data = g_task_get_task_data (task); + g_autoptr(GPtrArray) snaps = NULL; + g_autoptr(GError) local_error = NULL; + + snaps = snapd_client_find_category_finish (client, result, NULL, &local_error); + + if (snaps != NULL) { + store_snap_cache_update (self, snaps, FALSE); + + for (guint i = 0; i < snaps->len; i++) { + SnapdSnap *snap = g_ptr_array_index (snaps, i); + g_autoptr(GsApp) app = NULL; + + app = snap_to_app (self, snap, NULL); + gs_app_list_add (data->results_list, app); + } + } else { + snapd_error_convert (&local_error); + } + + finish_list_apps_op (task, g_steal_pointer (&local_error)); +} + +static void +list_apps_for_update_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data)); + GsPluginSnap *self = g_task_get_source_object (task); + ListAppsData *data = g_task_get_task_data (task); + g_autoptr(GPtrArray) snaps = NULL; + g_autoptr(GError) local_error = NULL; + + snaps = snapd_client_find_refreshable_finish (client, result, &local_error); + if (snaps != NULL) { + store_snap_cache_update (self, snaps, FALSE); + + for (guint i = 0; i < snaps->len; i++) { + SnapdSnap *snap = g_ptr_array_index (snaps, i); + g_autoptr(GsApp) app = NULL; + + app = snap_to_app (self, snap, NULL); + + /* If for some reason the app is already getting updated, then + * don't change its state */ + if (gs_app_get_state (app) != GS_APP_STATE_INSTALLING) + gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE); + + gs_app_list_add (data->results_list, app); + } + } else { + snapd_error_convert (&local_error); + } + + finish_list_apps_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_list_apps_op (GTask *task, + GError *error) +{ + ListAppsData *data = g_task_get_task_data (task); + g_autoptr(GsAppList) results_list = NULL; + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while listing apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + results_list = g_steal_pointer (&data->results_list); + + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_pointer (task, g_steal_pointer (&results_list), g_object_unref); +} + +static GsAppList * +gs_plugin_snap_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static SnapdSnap * +get_store_snap (GsPluginSnap *self, + SnapdClient *client, + const gchar *name, + gboolean need_details, + GCancellable *cancellable, + GError **error) +{ + SnapdSnap *snap = NULL; + g_autoptr(GPtrArray) snaps = NULL; + + /* use cached version if available */ + snap = store_snap_cache_lookup (self, name, need_details); + if (snap != NULL) + return g_object_ref (snap); + + snaps = find_snaps (self, client, + SNAPD_FIND_FLAGS_SCOPE_WIDE | SNAPD_FIND_FLAGS_MATCH_NAME, + NULL, name, cancellable, error); + if (snaps == NULL || snaps->len < 1) + return NULL; + + return g_object_ref (g_ptr_array_index (snaps, 0)); +} + +static void get_store_snap_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +get_store_snap_async (GsPluginSnap *self, + SnapdClient *client, + const gchar *name, + gboolean need_details, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + SnapdSnap *snap = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, get_store_snap_async); + + /* use cached version if available */ + snap = store_snap_cache_lookup (self, name, need_details); + if (snap != NULL) { + g_task_return_pointer (task, g_object_ref (snap), (GDestroyNotify) g_object_unref); + return; + } + + snapd_client_find_category_async (client, + SNAPD_FIND_FLAGS_SCOPE_WIDE | SNAPD_FIND_FLAGS_MATCH_NAME, + NULL, name, + cancellable, + get_store_snap_cb, g_steal_pointer (&task)); +} + +static void +get_store_snap_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginSnap *self = g_task_get_source_object (task); + g_autoptr(GPtrArray) snaps = NULL; + g_autoptr(GError) local_error = NULL; + + snaps = snapd_client_find_category_finish (client, result, NULL, &local_error); + + if (snaps == NULL || snaps->len < 1) { + snapd_error_convert (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + } else { + store_snap_cache_update (self, snaps, TRUE); + g_task_return_pointer (task, g_object_ref (g_ptr_array_index (snaps, 0)), (GDestroyNotify) g_object_unref); + } +} + +static SnapdSnap * +get_store_snap_finish (GsPluginSnap *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static int +track_value (const gchar *track, GStrv tracks) +{ + int r = 0; + while (tracks[r] != NULL && strcmp (track, tracks[r]) != 0) + r++; + return r; +} + +static int +risk_value (const gchar *risk) +{ + if (strcmp (risk, "stable") == 0) + return 0; + else if (strcmp (risk, "candidate") == 0) + return 1; + else if (strcmp (risk, "beta") == 0) + return 2; + else if (strcmp (risk, "edge") == 0) + return 3; + else + return 4; +} + +static int +compare_channel (gconstpointer a, gconstpointer b, gpointer user_data) +{ + SnapdChannel *channel_a = *(SnapdChannel **)a, *channel_b = *(SnapdChannel **)b; + GStrv tracks = user_data; + int r; + + r = track_value (snapd_channel_get_track (channel_a), tracks) - track_value (snapd_channel_get_track (channel_b), tracks); + if (r != 0) + return r; + + r = g_strcmp0 (snapd_channel_get_risk (channel_a), snapd_channel_get_risk (channel_b)); + if (r != 0) { + int r2; + + r2 = risk_value (snapd_channel_get_risk (channel_a)) - risk_value (snapd_channel_get_risk (channel_b)); + if (r2 != 0) + return r2; + else + return r; + } + + return g_strcmp0 (snapd_channel_get_branch (channel_a), snapd_channel_get_branch (channel_b)); +} + +static gchar * +expand_channel_name (const gchar *name) +{ + g_auto(GStrv) tokens = NULL; + const gchar *risks[] = { "stable", "candidate", "beta", "edge", NULL }; + + if (name == NULL) + return NULL; + + tokens = g_strsplit (name, "/", -1); + for (int i = 0; risks[i] != NULL; i++) { + if (strcmp (tokens[0], risks[i]) == 0) + return g_strconcat ("latest/", name, NULL); + } + + return g_strdup (name); +} + +static void +add_channels (GsPluginSnap *self, SnapdSnap *snap, GsAppList *list) +{ + GStrv tracks; + GPtrArray *channels; + g_autoptr(GPtrArray) sorted_channels = NULL; + + tracks = snapd_snap_get_tracks (snap); + channels = snapd_snap_get_channels (snap); + sorted_channels = g_ptr_array_new (); + for (guint i = 0; i < channels->len; i++) { + SnapdChannel *channel = g_ptr_array_index (channels, i); + g_ptr_array_add (sorted_channels, channel); + } + g_ptr_array_sort_with_data (sorted_channels, compare_channel, tracks); + + for (guint i = 0; i < sorted_channels->len; i++) { + SnapdChannel *channel = g_ptr_array_index (sorted_channels, i); + g_autoptr(GsApp) app = NULL; + g_autofree gchar *expanded_name = NULL; + + expanded_name = expand_channel_name (snapd_channel_get_name (channel)); + app = snap_to_app (self, snap, expanded_name); + + gs_app_list_add (list, app); + } +} + +static gboolean +app_name_matches_snap_name (SnapdSnap *snap, SnapdApp *app) +{ + return g_strcmp0 (snapd_snap_get_name (snap), snapd_app_get_name (app)) == 0; +} + +static SnapdApp * +get_primary_app (SnapdSnap *snap) +{ + GPtrArray *apps; + guint i; + SnapdApp *primary_app = NULL; + + /* Pick the "main" app from the snap. In order of + * preference, we want to pick: + * + * 1. the main app, provided it has a desktop file + * 2. the first app with a desktop file + * 3. the main app + * 4. the first app + * + * The "main app" is one whose name matches the snap name. + */ + apps = snapd_snap_get_apps (snap); + for (i = 0; i < apps->len; i++) { + SnapdApp *app = apps->pdata[i]; + + if (primary_app == NULL || + (snapd_app_get_desktop_file (primary_app) == NULL && snapd_app_get_desktop_file (app) != NULL) || + (!app_name_matches_snap_name (snap, primary_app) && app_name_matches_snap_name (snap, app))) + primary_app = app; + } + + return primary_app; +} + +static void +refine_icons (GsApp *app, + SnapdSnap *snap) +{ + GPtrArray *media; + guint i; + + media = snapd_snap_get_media (snap); + for (i = 0; i < media->len; i++) { + SnapdMedia *m = media->pdata[i]; + g_autoptr(GIcon) icon = NULL; + + if (g_strcmp0 (snapd_media_get_media_type (m), "icon") != 0) + continue; + + /* Unfortunately the snapd client API doesn’t expose information + * about icon scales, so leave that unset for now. */ + icon = gs_remote_icon_new (snapd_media_get_url (m)); + gs_icon_set_width (icon, snapd_media_get_width (m)); + gs_icon_set_height (icon, snapd_media_get_height (m)); + gs_app_add_icon (app, icon); + } +} + +static void serialize_node (SnapdMarkdownNode *node, GString *text, guint indentation); + +static gboolean +is_block_node (SnapdMarkdownNode *node) +{ + switch (snapd_markdown_node_get_node_type (node)) { + case SNAPD_MARKDOWN_NODE_TYPE_PARAGRAPH: + case SNAPD_MARKDOWN_NODE_TYPE_UNORDERED_LIST: + case SNAPD_MARKDOWN_NODE_TYPE_CODE_BLOCK: + return TRUE; + default: + return FALSE; + } +} + +static void +serialize_nodes (GPtrArray *nodes, GString *text, guint indentation) +{ + for (guint i = 0; i < nodes->len; i++) { + SnapdMarkdownNode *node = g_ptr_array_index (nodes, i); + + if (i != 0) { + SnapdMarkdownNode *last_node = g_ptr_array_index (nodes, i - 1); + if (is_block_node (node) && is_block_node (last_node)) + g_string_append (text, "\n"); + } + + serialize_node (node, text, indentation); + } +} + +static void +serialize_node (SnapdMarkdownNode *node, GString *text, guint indentation) +{ + GPtrArray *children = snapd_markdown_node_get_children (node); + g_autofree gchar *escaped_text = NULL; + g_autoptr(GString) url = NULL; + + switch (snapd_markdown_node_get_node_type (node)) { + case SNAPD_MARKDOWN_NODE_TYPE_TEXT: + escaped_text = g_markup_escape_text (snapd_markdown_node_get_text (node), -1); + g_string_append (text, escaped_text); + return; + + case SNAPD_MARKDOWN_NODE_TYPE_PARAGRAPH: + serialize_nodes (children, text, indentation); + g_string_append (text, "\n"); + return; + + case SNAPD_MARKDOWN_NODE_TYPE_UNORDERED_LIST: + serialize_nodes (children, text, indentation); + return; + + case SNAPD_MARKDOWN_NODE_TYPE_LIST_ITEM: + for (guint i = 0; i < indentation; i++) { + g_string_append (text, " "); + } + g_string_append_printf (text, " • "); + serialize_nodes (children, text, indentation + 1); + return; + + case SNAPD_MARKDOWN_NODE_TYPE_CODE_BLOCK: + case SNAPD_MARKDOWN_NODE_TYPE_CODE_SPAN: + g_string_append (text, ""); + serialize_nodes (children, text, indentation); + g_string_append (text, ""); + return; + + case SNAPD_MARKDOWN_NODE_TYPE_EMPHASIS: + g_string_append (text, ""); + serialize_nodes (children, text, indentation); + g_string_append (text, ""); + return; + + case SNAPD_MARKDOWN_NODE_TYPE_STRONG_EMPHASIS: + g_string_append (text, ""); + serialize_nodes (children, text, indentation); + g_string_append (text, ""); + return; + + case SNAPD_MARKDOWN_NODE_TYPE_URL: + url = g_string_new (""); + serialize_nodes (children, url, indentation); + g_string_append_printf (text, "%s", url->str, url->str); + return; + + default: + g_assert_not_reached(); + } +} + +static gchar * +gs_plugin_snap_get_markup_description (SnapdSnap *snap) +{ + g_autoptr(SnapdMarkdownParser) parser = snapd_markdown_parser_new (SNAPD_MARKDOWN_VERSION_0); + g_autoptr(GPtrArray) nodes = NULL; + g_autoptr(GString) text = g_string_new (""); + + nodes = snapd_markdown_parser_parse (parser, snapd_snap_get_description (snap)); + serialize_nodes (nodes, text, 0); + return g_string_free (g_steal_pointer (&text), FALSE); +} + +static void +refine_screenshots (GsApp *app, SnapdSnap *snap) +{ + GPtrArray *media; + guint i; + + media = snapd_snap_get_media (snap); + for (i = 0; i < media->len; i++) { + SnapdMedia *m = media->pdata[i]; + const gchar *url; + g_autofree gchar *filename = NULL; + g_autoptr(AsScreenshot) ss = NULL; + g_autoptr(AsImage) image = NULL; + + if (g_strcmp0 (snapd_media_get_media_type (m), "screenshot") != 0) + continue; + + /* skip screenshots used for banner when app is featured */ + url = snapd_media_get_url (m); + filename = g_path_get_basename (url); + if (is_banner_image (filename) || is_banner_icon_image (filename)) + continue; + + ss = as_screenshot_new (); + as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_EXTRA); + image = as_image_new (); + as_image_set_url (image, snapd_media_get_url (m)); + as_image_set_kind (image, AS_IMAGE_KIND_SOURCE); + as_image_set_width (image, snapd_media_get_width (m)); + as_image_set_height (image, snapd_media_get_height (m)); + as_screenshot_add_image (ss, image); + gs_app_add_screenshot (app, ss); + } +} + +static gboolean +gs_snap_file_size_include_cb (const gchar *filename, + GFileTest file_kind, + gpointer user_data) +{ + return file_kind != G_FILE_TEST_IS_SYMLINK && + g_strcmp0 (filename, "common") != 0 && + g_strcmp0 (filename, "current") != 0; +} + +static guint64 +gs_snap_get_app_directory_size (const gchar *snap_name, + gboolean is_cache_size, + GCancellable *cancellable) +{ + g_autofree gchar *filename = NULL; + + if (is_cache_size) + filename = g_build_filename (g_get_home_dir (), "snap", snap_name, "common", NULL); + else + filename = g_build_filename (g_get_home_dir (), "snap", snap_name, NULL); + + return gs_utils_get_file_size (filename, is_cache_size ? NULL : gs_snap_file_size_include_cb, NULL, cancellable); +} + +static SnapdSnap * +find_snap_in_array (GPtrArray *snaps, + const gchar *snap_name) +{ + for (guint i = 0; i < snaps->len; i++) { + SnapdSnap *snap = SNAPD_SNAP (snaps->pdata[i]); + if (g_strcmp0 (snapd_snap_get_name (snap), snap_name) == 0) + return snap; + } + + return NULL; +} + +static void get_snaps_cb (GObject *object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_snap_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (plugin); + g_autoptr(SnapdClient) client = NULL; + g_autoptr(GPtrArray) snap_names = g_ptr_array_new_with_free_func (NULL); + g_autoptr(GTask) task = NULL; + g_autoptr(GsAppList) snap_apps = NULL; + g_autoptr(GsPluginRefineData) data = NULL; + gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_snap_refine_async); + + /* Filter out apps that aren't managed by us */ + snap_apps = gs_app_list_new (); + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + if (!gs_app_has_management_plugin (app, plugin)) + continue; + + gs_app_list_add (snap_apps, app); + } + + data = gs_plugin_refine_data_new (snap_apps, flags); + g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) gs_plugin_refine_data_free); + + client = get_client (self, interactive, &local_error); + if (client == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Get information from locally installed snaps */ + for (guint i = 0; i < gs_app_list_length (snap_apps); i++) { + GsApp *app = gs_app_list_index (snap_apps, i); + g_ptr_array_add (snap_names, (gpointer) gs_app_get_metadata_item (app, "snap::name")); + } + + g_ptr_array_add (snap_names, NULL); /* NULL terminator */ + + snapd_client_get_snaps_async (client, SNAPD_GET_SNAPS_FLAGS_NONE, (gchar **) snap_names->pdata, cancellable, get_snaps_cb, g_steal_pointer (&task)); +} + +static void get_icon_cb (GObject *object, + GAsyncResult *result, + gpointer user_data); + +static void +get_snaps_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginSnap *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginRefineData *data = g_task_get_task_data (task); + GsAppList *list = data->list; + GsPluginRefineFlags flags = data->flags; + g_autoptr(GsAppList) get_icons_list = NULL; + g_autoptr(GPtrArray) local_snaps = NULL; + g_autoptr(GError) local_error = NULL; + + local_snaps = snapd_client_get_snaps_finish (client, result, &local_error); + if (local_snaps == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + const gchar *snap_name, *name, *website, *contact, *version; + g_autofree gchar *channel = NULL; + g_autofree gchar *store_channel = NULL; + g_autofree gchar *tracking_channel = NULL; + gboolean need_details = FALSE; + SnapdConfinement confinement = SNAPD_CONFINEMENT_UNKNOWN; + SnapdSnap *local_snap, *snap; + g_autoptr(SnapdSnap) store_snap = NULL; + const gchar *developer_name; + g_autofree gchar *description = NULL; + guint64 release_date = 0; + + snap_name = gs_app_get_metadata_item (app, "snap::name"); + channel = g_strdup (gs_app_get_branch (app)); + + /* get information from locally installed snaps and information we already have */ + local_snap = find_snap_in_array (local_snaps, snap_name); + store_snap = store_snap_cache_lookup (self, snap_name, FALSE); + if (store_snap != NULL) + store_channel = expand_channel_name (snapd_snap_get_channel (store_snap)); + + /* check if requested information requires us to go to the Snap Store */ + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS) + need_details = TRUE; + if (channel != NULL && g_strcmp0 (store_channel, channel) != 0) + need_details = TRUE; + if (need_details) { + g_clear_object (&store_snap); + store_snap = get_store_snap (self, client, snap_name, need_details, + cancellable, NULL); + } + + /* we don't know anything about this snap */ + if (local_snap == NULL && store_snap == NULL) + continue; + + if (local_snap != NULL) + tracking_channel = expand_channel_name (snapd_snap_get_tracking_channel (local_snap)); + + /* Get default channel to install */ + if (channel == NULL) { + if (local_snap != NULL) + channel = g_strdup (tracking_channel); + else + channel = expand_channel_name (snapd_snap_get_channel (store_snap)); + + gs_app_set_branch (app, channel); + } + + if (local_snap != NULL && g_strcmp0 (tracking_channel, channel) == 0) { + /* Do not set to installed state if app is updatable */ + if (gs_app_get_state (app) != GS_APP_STATE_UPDATABLE_LIVE) { + gs_app_set_state (app, GS_APP_STATE_INSTALLED); + } + } else + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + gs_app_add_quirk (app, GS_APP_QUIRK_DO_NOT_AUTO_UPDATE); + + /* use store information for basic metadata over local information */ + snap = store_snap != NULL ? store_snap : local_snap; + name = snapd_snap_get_title (snap); + if (name == NULL || g_strcmp0 (name, "") == 0) + name = snapd_snap_get_name (snap); + gs_app_set_name (app, GS_APP_QUALITY_NORMAL, name); + website = snapd_snap_get_website (snap); + if (g_strcmp0 (website, "") == 0) + website = NULL; + gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, website); + contact = snapd_snap_get_contact (snap); + if (g_strcmp0 (contact, "") == 0) + contact = NULL; + gs_app_set_url (app, AS_URL_KIND_CONTACT, contact); + gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, snapd_snap_get_summary (snap)); + description = gs_plugin_snap_get_markup_description (snap); + gs_app_set_description (app, GS_APP_QUALITY_NORMAL, description); + gs_app_set_license (app, GS_APP_QUALITY_NORMAL, snapd_snap_get_license (snap)); + developer_name = snapd_snap_get_publisher_display_name (snap); + if (developer_name == NULL) + developer_name = snapd_snap_get_publisher_username (snap); + gs_app_set_developer_name (app, developer_name); + if (snapd_snap_get_publisher_validation (snap) == SNAPD_PUBLISHER_VALIDATION_VERIFIED) + gs_app_add_quirk (app, GS_APP_QUIRK_DEVELOPER_VERIFIED); + + snap = local_snap != NULL ? local_snap : store_snap; + version = snapd_snap_get_version (snap); + confinement = snapd_snap_get_confinement (snap); + + if (channel != NULL && store_snap != NULL) { + GPtrArray *channels = snapd_snap_get_channels (store_snap); + + for (guint j = 0; j < channels->len; j++) { + SnapdChannel *c = channels->pdata[j]; + g_autofree gchar *expanded_name = NULL; + GDateTime *dt; + + expanded_name = expand_channel_name (snapd_channel_get_name (c)); + if (g_strcmp0 (expanded_name, channel) != 0) + continue; + + version = snapd_channel_get_version (c); + confinement = snapd_channel_get_confinement (c); + + dt = snapd_channel_get_released_at (c); + if (dt) + release_date = (guint64) g_date_time_to_unix (dt); + } + } + + gs_app_set_version (app, version); + gs_app_set_release_date (app, release_date); + + if (confinement != SNAPD_CONFINEMENT_UNKNOWN) { + GEnumClass *enum_class = g_type_class_ref (SNAPD_TYPE_CONFINEMENT); + gs_app_set_metadata (app, "snap::confinement", g_enum_get_value (enum_class, confinement)->value_nick); + g_type_class_unref (enum_class); + } + + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS && + self->system_confinement == SNAPD_SYSTEM_CONFINEMENT_STRICT && + confinement == SNAPD_CONFINEMENT_STRICT) + gs_app_add_kudo (app, GS_APP_KUDO_SANDBOXED); + + gs_app_set_kind (app, snap_guess_component_kind (snap)); + + /* add information specific to installed snaps */ + if (local_snap != NULL) { + SnapdApp *snap_app; + GDateTime *install_date; + gint64 installed_size_bytes; + + install_date = snapd_snap_get_install_date (local_snap); + installed_size_bytes = snapd_snap_get_installed_size (local_snap); + + gs_app_set_size_installed (app, (installed_size_bytes > 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, (guint64) installed_size_bytes); + gs_app_set_install_date (app, install_date != NULL ? g_date_time_to_unix (install_date) : GS_APP_INSTALL_DATE_UNKNOWN); + + snap_app = get_primary_app (local_snap); + if (snap_app != NULL) { + gs_app_set_metadata (app, "snap::launch-name", snapd_app_get_name (snap_app)); + gs_app_set_metadata (app, "snap::launch-desktop", snapd_app_get_desktop_file (snap_app)); + } else { + gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); + } + } + + /* add information specific to store snaps */ + if (store_snap != NULL) { + gint64 download_size_bytes; + + gs_app_set_origin (app, self->store_name); + gs_app_set_origin_hostname (app, self->store_hostname); + + download_size_bytes = snapd_snap_get_download_size (store_snap); + gs_app_set_size_download (app, (download_size_bytes > 0) ? GS_SIZE_TYPE_VALID : GS_SIZE_TYPE_UNKNOWN, (guint64) download_size_bytes); + + if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS && gs_app_get_screenshots (app)->len == 0) + refine_screenshots (app, store_snap); + } + + /* load icon if requested */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) != 0 && + !gs_app_has_icons (app)) { + if (get_icons_list == NULL) + get_icons_list = gs_app_list_new (); + gs_app_list_add (get_icons_list, app); + + refine_icons (app, snap); + } + + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE_DATA) != 0 && + gs_app_is_installed (app) && + gs_app_get_kind (app) != AS_COMPONENT_KIND_RUNTIME) { + if (gs_app_get_size_cache_data (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_cache_data (app, GS_SIZE_TYPE_VALID, gs_snap_get_app_directory_size (snap_name, TRUE, cancellable)); + if (gs_app_get_size_user_data (app, NULL) != GS_SIZE_TYPE_VALID) + gs_app_set_size_user_data (app, GS_SIZE_TYPE_VALID, gs_snap_get_app_directory_size (snap_name, FALSE, cancellable)); + + if (g_cancellable_is_cancelled (cancellable)) { + gs_app_set_size_cache_data (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_size_user_data (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + } + } + } + + /* Icons require async calls to get */ + if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) != 0 && get_icons_list != NULL) { + GsApp *app; + + g_clear_object (&data->list); + data->list = g_steal_pointer (&get_icons_list); + + app = gs_app_list_index (data->list, 0); + snapd_client_get_icon_async (client, gs_app_get_metadata_item (app, "snap::name"), cancellable, get_icon_cb, g_steal_pointer (&task)); + } else { + g_task_return_boolean (task, TRUE); + } +} + +static void +get_icon_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (object); + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginRefineData *data = g_task_get_task_data (task); + GsApp *app; + g_autoptr(SnapdIcon) snap_icon = NULL; + g_autoptr(GError) local_error = NULL; + + app = gs_app_list_index (data->list, 0); + snap_icon = snapd_client_get_icon_finish (client, result, &local_error); + if (snap_icon != NULL) { + g_autoptr(GIcon) icon = g_bytes_icon_new (snapd_icon_get_data (snap_icon)); + gs_app_add_icon (app, icon); + } + + /* Get next icon in the list or done */ + gs_app_list_remove (data->list, app); + if (gs_app_list_length (data->list) > 0) { + app = gs_app_list_index (data->list, 0); + snapd_client_get_icon_async (client, gs_app_get_metadata_item (app, "snap::name"), cancellable, get_icon_cb, g_steal_pointer (&task)); + } else { + g_task_return_boolean (task, TRUE); + } +} + +static gboolean +gs_plugin_snap_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +progress_cb (SnapdClient *client, SnapdChange *change, gpointer deprecated, gpointer user_data) +{ + GsApp *app = user_data; + GPtrArray *tasks; + guint i; + gint64 done = 0, total = 0; + + tasks = snapd_change_get_tasks (change); + for (i = 0; i < tasks->len; i++) { + SnapdTask *task = tasks->pdata[i]; + done += snapd_task_get_progress_done (task); + total += snapd_task_get_progress_total (task); + } + + gs_app_set_progress (app, (guint) (100 * done / total)); +} + +typedef struct { + /* Input data. */ + GsPluginInstallAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ + + /* For progress reporting. */ + guint n_installs_started; +} InstallAppsData; + +static void +install_apps_data_free (InstallAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallAppsData, install_apps_data_free) + +typedef struct { + GTask *task; /* (owned) */ + GsApp *app; /* (owned) */ + gchar *name; /* (owned) (not nullable) */ + gchar *channel; /* (owned) (not nullable) */ +} InstallSingleAppData; + +static void +install_single_app_data_free (InstallSingleAppData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->task); + g_free (data->name); + g_free (data->channel); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (InstallSingleAppData, install_single_app_data_free) + +static void install_progress_cb (SnapdClient *client, + SnapdChange *change, + gpointer deprecated, + gpointer user_data); +static void install_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void install_refresh_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_install_apps_op (GTask *task, + GError *error); + +static void +gs_plugin_snap_install_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (plugin); + g_autoptr(GTask) task = NULL; + InstallAppsData *data; + g_autoptr(InstallAppsData) data_owned = NULL; + gboolean interactive = flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE; + g_autoptr(SnapdClient) client = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_snap_install_apps_async); + + data = data_owned = g_new0 (InstallAppsData, 1); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) install_apps_data_free); + + if (flags & (GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD | GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY)) { + /* snap only seems to support downloading and applying installs + * at the same time, rather than pre-downloading them and + * applying them separately. */ + g_autoptr(GsPluginEvent) event = NULL; + + g_set_error_literal (&local_error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + "snap doesn’t support split download/apply"); + + event = gs_plugin_event_new ("error", local_error, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + g_task_return_boolean (task, TRUE); + return; + } + + client = get_client (self, interactive, &local_error); + if (client == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Start a load of operations in parallel to install the apps. + * + * When all installs are finished for all apps, finish_install_apps_op() + * will return success/error for the overall #GTask. */ + data->n_pending_ops = 1; + data->n_installs_started = 0; + + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + g_autoptr(InstallSingleAppData) app_data = NULL; + const gchar *name, *channel; + SnapdInstallFlags install_flags = SNAPD_INSTALL_FLAGS_NONE; + + /* We can only install apps we know of */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + name = gs_app_get_metadata_item (app, "snap::name"); + channel = gs_app_get_branch (app); + + app_data = g_new0 (InstallSingleAppData, 1); + app_data->task = g_object_ref (task); + app_data->app = g_object_ref (app); + app_data->name = g_strdup (name); + app_data->channel = g_strdup (channel); + + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + + if (g_strcmp0 (gs_app_get_metadata_item (app, "snap::confinement"), "classic") == 0) + install_flags |= SNAPD_INSTALL_FLAGS_CLASSIC; + + data->n_pending_ops++; + data->n_installs_started++; + snapd_client_install2_async (client, + install_flags, + name, + channel, + NULL /* revision */, + install_progress_cb, + app_data, + cancellable, + install_app_cb, + app_data /* steal ownership */); + app_data = NULL; + } + + finish_install_apps_op (task, NULL); +} + +static void +install_progress_cb (SnapdClient *client, + SnapdChange *change, + gpointer deprecated, + gpointer user_data) +{ + InstallSingleAppData *app_data = user_data; + GTask *task = app_data->task; + GsPluginSnap *self = g_task_get_source_object (task); + InstallAppsData *data = g_task_get_task_data (task); + GPtrArray *tasks; + gint64 done = 0, total = 0; + guint percentage; + + tasks = snapd_change_get_tasks (change); + for (guint i = 0; i < tasks->len; i++) { + SnapdTask *snap_task = tasks->pdata[i]; + + done += snapd_task_get_progress_done (snap_task); + total += snapd_task_get_progress_total (snap_task); + } + + if (total > 0) + percentage = (guint) (100 * done / total); + else + percentage = GS_APP_PROGRESS_UNKNOWN; + gs_app_set_progress (app_data->app, percentage); + + /* Basic progress reporting for the whole operation. If there’s more + * than one app being installed, it reports the number of completed + * installs. If there’s only one, it reports the same percentage as + * above. */ + if (data->progress_callback != NULL) { + guint overall_percentage; + + if (data->n_installs_started <= 1) + overall_percentage = percentage; + else + overall_percentage = (100 * (data->n_installs_started - data->n_pending_ops)) / data->n_installs_started; + + data->progress_callback (GS_PLUGIN (self), overall_percentage, data->progress_user_data); + } +} + +static void +install_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(InstallSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + GsPluginSnap *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + InstallAppsData *data = g_task_get_task_data (task); + gboolean interactive = (data->flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + snapd_client_install2_finish (client, result, &local_error); + + /* if already installed then just try to switch channel */ + if (g_error_matches (local_error, SNAPD_ERROR, SNAPD_ERROR_ALREADY_INSTALLED)) { + g_clear_error (&local_error); + snapd_client_refresh_async (client, + app_data->name, + app_data->channel, + install_progress_cb, + app_data, + cancellable, + install_refresh_app_cb, + app_data /* steals ownership */); + app_data = NULL; + return; + } else if (local_error != NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + gs_app_set_state_recover (app_data->app); + snapd_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + "app", app_data->app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + finish_install_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + /* Installed! */ + gs_app_set_state (app_data->app, GS_APP_STATE_INSTALLED); + + finish_install_apps_op (task, NULL); +} + +static void +install_refresh_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(InstallSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + g_autoptr(GError) local_error = NULL; + + if (!snapd_client_refresh_finish (client, result, &local_error)) { + gs_app_set_state_recover (app_data->app); + snapd_error_convert (&local_error); + finish_install_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + /* Installed! */ + gs_app_set_state (app_data->app, GS_APP_STATE_INSTALLED); + + finish_install_apps_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_install_apps_op (GTask *task, + GError *error) +{ + InstallAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while installing apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_snap_install_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* Check if an app is graphical by checking if it uses a known GUI interface. + This doesn't necessarily mean that every binary uses this interfaces, but is probably true. + https://bugs.launchpad.net/bugs/1595023 */ +static void +gs_plugin_snap_launch_got_connections_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GPtrArray) plugs = NULL; + g_autoptr(GAppInfo) appinfo = NULL; + g_autoptr(GError) local_error = NULL; + g_autofree gchar *commandline = NULL; + const gchar *app_snap_name; + const gchar *launch_name; + GsPluginLaunchData *data = g_task_get_task_data (task); + GAppInfoCreateFlags flags = G_APP_INFO_CREATE_NONE; + gboolean is_graphical = FALSE; + + app_snap_name = gs_app_get_metadata_item (data->app, "snap::name"); + launch_name = gs_app_get_metadata_item (data->app, "snap::launch-name"); + + if (!snapd_client_get_connections2_finish (SNAPD_CLIENT (source_object), result, NULL, NULL, &plugs, NULL, &local_error)) { + g_debug ("%s: Failed to get connections: %s", G_STRFUNC, local_error->message); + g_clear_error (&local_error); + } else { + for (guint i = 0; i < plugs->len && !is_graphical; i++) { + SnapdPlug *plug = plugs->pdata[i]; + const gchar *interface; + + /* Only looks at the plugs for this snap */ + if (g_strcmp0 (snapd_plug_get_snap (plug), app_snap_name) != 0) + continue; + + interface = snapd_plug_get_interface (plug); + if (interface == NULL) + continue; + + if (g_strcmp0 (interface, "unity7") == 0 || + g_strcmp0 (interface, "x11") == 0 || + g_strcmp0 (interface, "mir") == 0) + is_graphical = TRUE; + } + } + + if (g_strcmp0 (launch_name, app_snap_name) == 0) + commandline = g_strdup_printf ("snap run %s", launch_name); + else + commandline = g_strdup_printf ("snap run %s.%s", app_snap_name, launch_name); + + if (!is_graphical) + flags |= G_APP_INFO_CREATE_NEEDS_TERMINAL; + + appinfo = g_app_info_create_from_commandline (commandline, NULL, flags, &local_error); + if (appinfo != NULL) + g_task_return_pointer (task, appinfo, g_object_unref); + else + g_task_return_error (task, g_steal_pointer (&local_error)); +} + +static void +gs_plugin_snap_launch_async (GsPlugin *plugin, + GsApp *app, + GsPluginLaunchFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (plugin); + const gchar *launch_name; + const gchar *launch_desktop; + g_autoptr(GAppInfo) info = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + gboolean interactive = (flags & GS_PLUGIN_LAUNCH_FLAGS_INTERACTIVE) != 0; + + task = gs_plugin_launch_data_new_task (plugin, app, flags, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_snap_launch_async); + + /* We can only launch apps we know of */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_pointer (task, NULL, NULL); + return; + } + + launch_name = gs_app_get_metadata_item (app, "snap::launch-name"); + launch_desktop = gs_app_get_metadata_item (app, "snap::launch-desktop"); + if (!launch_name) { + g_task_return_pointer (task, NULL, NULL); + return; + } + + if (launch_desktop) { + info = (GAppInfo *)g_desktop_app_info_new_from_filename (launch_desktop); + } else { + g_autoptr(SnapdClient) client = NULL; + + client = get_client (self, interactive, &local_error); + if (client == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + snapd_client_get_connections2_async (client, SNAPD_GET_CONNECTIONS_FLAGS_SELECT_ALL, NULL, NULL, + cancellable, gs_plugin_snap_launch_got_connections_cb, + g_steal_pointer (&task)); + return; + } + + g_task_return_pointer (task, g_steal_pointer (&info), g_object_unref); +} + +static gboolean +gs_plugin_snap_launch_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + GdkDisplay *display; + g_autoptr(GAppLaunchContext) context = NULL; + g_autoptr(GAppInfo) appinfo = NULL; + GError *local_error = NULL; + + appinfo = g_task_propagate_pointer (G_TASK (result), &local_error); + + if (local_error != NULL) { + g_propagate_error (error, g_steal_pointer (&local_error)); + return FALSE; + } else if (appinfo == NULL) { + /* app is not supported by this plugin */ + return TRUE; + } + + display = gdk_display_get_default (); + context = G_APP_LAUNCH_CONTEXT (gdk_display_get_app_launch_context (display)); + + return g_app_info_launch (appinfo, NULL, context, error); +} + +typedef struct { + /* Input data. */ + guint n_apps; + GsPluginUninstallAppsFlags flags; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ + + /* For progress reporting. */ + guint n_uninstalls_started; +} UninstallAppsData; + +static void +uninstall_apps_data_free (UninstallAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UninstallAppsData, uninstall_apps_data_free) + +typedef struct { + GTask *task; /* (owned) */ + GsApp *app; /* (owned) */ + gchar *name; /* (owned) (not nullable) */ + gchar *channel; /* (owned) (not nullable) */ +} UninstallSingleAppData; + +static void +uninstall_single_app_data_free (UninstallSingleAppData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->task); + g_free (data->name); + g_free (data->channel); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UninstallSingleAppData, uninstall_single_app_data_free) + +static void uninstall_progress_cb (SnapdClient *client, + SnapdChange *change, + gpointer deprecated, + gpointer user_data); +static void uninstall_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_uninstall_apps_op (GTask *task, + GError *error); + +static void +gs_plugin_snap_uninstall_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUninstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (plugin); + g_autoptr(GTask) task = NULL; + UninstallAppsData *data; + g_autoptr(UninstallAppsData) data_owned = NULL; + gboolean interactive = flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE; + g_autoptr(SnapdClient) client = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_snap_uninstall_apps_async); + + data = data_owned = g_new0 (UninstallAppsData, 1); + data->flags = flags; + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->n_apps = gs_app_list_length (apps); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) uninstall_apps_data_free); + + client = get_client (self, interactive, &local_error); + if (client == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Start a load of operations in parallel to uninstall the apps. + * + * When all uninstalls are finished for all apps, finish_uninstall_apps_op() + * will return success/error for the overall #GTask. */ + data->n_pending_ops = 1; + data->n_uninstalls_started = 0; + + for (guint i = 0; i < data->n_apps; i++) { + GsApp *app = gs_app_list_index (apps, i); + g_autoptr(UninstallSingleAppData) app_data = NULL; + const gchar *name; + + /* We can only install apps we know of */ + if (!gs_app_has_management_plugin (app, GS_PLUGIN (self))) + continue; + + name = gs_app_get_metadata_item (app, "snap::name"); + + app_data = g_new0 (UninstallSingleAppData, 1); + app_data->task = g_object_ref (task); + app_data->app = g_object_ref (app); + app_data->name = g_strdup (name); + + gs_app_set_state (app, GS_APP_STATE_REMOVING); + + data->n_pending_ops++; + data->n_uninstalls_started++; + snapd_client_remove2_async (client, + SNAPD_REMOVE_FLAGS_NONE, + name, + uninstall_progress_cb, + app_data, + cancellable, + uninstall_app_cb, + app_data /* steal ownership */); + app_data = NULL; + } + + finish_uninstall_apps_op (task, NULL); +} + +static void +uninstall_progress_cb (SnapdClient *client, + SnapdChange *change, + gpointer deprecated, + gpointer user_data) +{ + UninstallSingleAppData *app_data = user_data; + GTask *task = app_data->task; + GsPluginSnap *self = g_task_get_source_object (task); + UninstallAppsData *data = g_task_get_task_data (task); + GPtrArray *tasks; + gint64 done = 0, total = 0; + guint percentage; + + tasks = snapd_change_get_tasks (change); + for (guint i = 0; i < tasks->len; i++) { + SnapdTask *snap_task = tasks->pdata[i]; + + done += snapd_task_get_progress_done (snap_task); + total += snapd_task_get_progress_total (snap_task); + } + + if (total > 0) + percentage = (guint) (100 * done / total); + else + percentage = GS_APP_PROGRESS_UNKNOWN; + gs_app_set_progress (app_data->app, percentage); + + /* Basic progress reporting for the whole operation. If there’s more + * than one app being uninstalled, it reports the number of completed + * uninstalls. If there’s only one, it reports the same percentage as + * above. */ + if (data->progress_callback != NULL) { + guint overall_percentage; + + if (data->n_uninstalls_started <= 1) + overall_percentage = percentage; + else + overall_percentage = (100 * (data->n_uninstalls_started - data->n_pending_ops)) / data->n_uninstalls_started; + + data->progress_callback (GS_PLUGIN (self), overall_percentage, data->progress_user_data); + } +} + +static void +uninstall_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(UninstallSingleAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + GsPluginSnap *self = g_task_get_source_object (task); + UninstallAppsData *data = g_task_get_task_data (task); + gboolean interactive = (data->flags & GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + g_autoptr(GError) local_error = NULL; + + snapd_client_remove2_finish (client, result, &local_error); + + if (local_error != NULL) { + g_autoptr(GsPluginEvent) event = NULL; + + gs_app_set_state_recover (app_data->app); + snapd_error_convert (&local_error); + + event = gs_plugin_event_new ("error", local_error, + "app", app_data->app, + NULL); + if (interactive) + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE); + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING); + gs_plugin_report_event (GS_PLUGIN (self), event); + g_clear_error (&local_error); + + finish_uninstall_apps_op (task, g_steal_pointer (&local_error)); + return; + } + + /* Uninstalled! */ + gs_app_set_state (app_data->app, GS_APP_STATE_AVAILABLE); + + finish_uninstall_apps_op (task, NULL); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_uninstall_apps_op (GTask *task, + GError *error) +{ + UninstallAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while uninstalling apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_snap_uninstall_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct { + /* Input data. */ + guint n_apps; + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + + /* In-progress data. */ + guint n_pending_ops; + GError *saved_error; /* (owned) (nullable) */ +} UpdateAppsData; + +static void +update_apps_data_free (UpdateAppsData *data) +{ + /* Error should have been propagated by now, and all pending ops completed. */ + g_assert (data->saved_error == NULL); + g_assert (data->n_pending_ops == 0); + + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UpdateAppsData, update_apps_data_free) + +typedef struct { + GTask *task; /* (owned) */ + GsApp *app; /* (owned) */ + guint index; /* zero-based */ +} RefreshAppData; + +static void +refresh_app_data_free (RefreshAppData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->task); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (RefreshAppData, refresh_app_data_free) + +static void update_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void finish_update_apps_op (GTask *task, + GError *error); + +static void +gs_plugin_snap_update_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSnap *self = GS_PLUGIN_SNAP (plugin); + g_autoptr(GTask) task = NULL; + UpdateAppsData *data; + g_autoptr(UpdateAppsData) data_owned = NULL; + gboolean interactive = (flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + g_autoptr(SnapdClient) client = NULL; + g_autoptr(GError) local_error = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_snap_update_apps_async); + data = data_owned = g_new0 (UpdateAppsData, 1); + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->n_apps = gs_app_list_length (apps); + g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) update_apps_data_free); + + if (flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY) { + /* snap only seems to support downloading and applying updates + * at the same time, rather than pre-downloading them and + * applying them separately. */ + g_task_return_boolean (task, TRUE); + return; + } + + client = get_client (self, interactive, &local_error); + if (client == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Start an update operation for each of the sections we’re interested + * in, keeping a counter of pending operations which is initialised to 1 + * until all the operations are started. + * + * For some reason, updating an app is called ‘refreshing’ it in snap + * land. */ + data->n_pending_ops = 1; + + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + const gchar *name; + g_autoptr(RefreshAppData) app_data = NULL; + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) + continue; + + /* Get the name of the snap to refresh */ + name = gs_app_get_metadata_item (app, "snap::name"); + + /* Refresh the snap */ + gs_app_set_state (app, GS_APP_STATE_INSTALLING); + + app_data = g_new0 (RefreshAppData, 1); + app_data->index = i; + app_data->task = g_object_ref (task); + app_data->app = g_object_ref (app); + + data->n_pending_ops++; + snapd_client_refresh_async (client, name, NULL, progress_cb, app, cancellable, update_app_cb, g_steal_pointer (&app_data)); + } + + finish_update_apps_op (task, NULL); +} + +static void +update_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + SnapdClient *client = SNAPD_CLIENT (source_object); + g_autoptr(RefreshAppData) app_data = g_steal_pointer (&user_data); + GTask *task = app_data->task; + GsPluginSnap *self = g_task_get_source_object (task); + UpdateAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + + if (!snapd_client_refresh_finish (client, result, &local_error)) { + gs_app_set_state_recover (app_data->app); + snapd_error_convert (&local_error); + } else { + gs_app_set_state (app_data->app, GS_APP_STATE_INSTALLED); + } + + /* Simple progress reporting. */ + if (data->progress_callback != NULL) { + data->progress_callback (GS_PLUGIN (self), + 100 * ((gdouble) (app_data->index + 1) / data->n_apps), + data->progress_user_data); + } + + finish_update_apps_op (task, g_steal_pointer (&local_error)); +} + +/* @error is (transfer full) if non-%NULL */ +static void +finish_update_apps_op (GTask *task, + GError *error) +{ + UpdateAppsData *data = g_task_get_task_data (task); + g_autoptr(GError) error_owned = g_steal_pointer (&error); + + if (error_owned != NULL && data->saved_error == NULL) + data->saved_error = g_steal_pointer (&error_owned); + else if (error_owned != NULL) + g_debug ("Additional error while updating apps: %s", error_owned->message); + + g_assert (data->n_pending_ops > 0); + data->n_pending_ops--; + + if (data->n_pending_ops > 0) + return; + + /* Get the results of the parallel ops. */ + if (data->saved_error != NULL) + g_task_return_error (task, g_steal_pointer (&data->saved_error)); + else + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_snap_update_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_snap_class_init (GsPluginSnapClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_snap_dispose; + object_class->finalize = gs_plugin_snap_finalize; + + plugin_class->setup_async = gs_plugin_snap_setup_async; + plugin_class->setup_finish = gs_plugin_snap_setup_finish; + plugin_class->refine_async = gs_plugin_snap_refine_async; + plugin_class->refine_finish = gs_plugin_snap_refine_finish; + plugin_class->list_apps_async = gs_plugin_snap_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_snap_list_apps_finish; + plugin_class->install_apps_async = gs_plugin_snap_install_apps_async; + plugin_class->install_apps_finish = gs_plugin_snap_install_apps_finish; + plugin_class->uninstall_apps_async = gs_plugin_snap_uninstall_apps_async; + plugin_class->uninstall_apps_finish = gs_plugin_snap_uninstall_apps_finish; + plugin_class->update_apps_async = gs_plugin_snap_update_apps_async; + plugin_class->update_apps_finish = gs_plugin_snap_update_apps_finish; + plugin_class->launch_async = gs_plugin_snap_launch_async; + plugin_class->launch_finish = gs_plugin_snap_launch_finish; + plugin_class->url_to_app_async = gs_plugin_snap_url_to_app_async; + plugin_class->url_to_app_finish = gs_plugin_snap_url_to_app_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_SNAP; +} diff --git a/plugins/snap/gs-plugin-snap.h b/plugins/snap/gs-plugin-snap.h new file mode 100644 index 0000000..e66bce6 --- /dev/null +++ b/plugins/snap/gs-plugin-snap.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_SNAP (gs_plugin_snap_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPluginSnap, gs_plugin_snap, GS, PLUGIN_SNAP, GsPlugin) + +G_END_DECLS diff --git a/plugins/snap/gs-self-test.c b/plugins/snap/gs-self-test.c new file mode 100644 index 0000000..e4d24df --- /dev/null +++ b/plugins/snap/gs-self-test.c @@ -0,0 +1,391 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Canonical Ltd + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include "config.h" + +#include "gnome-software-private.h" + +#include "gs-test.h" + +static gboolean snap_installed = FALSE; + +SnapdAuthData * +snapd_login_sync (const gchar *username, const gchar *password, const gchar *otp, + GCancellable *cancellable, GError **error) +{ + return snapd_auth_data_new ("macaroon", NULL); +} + +SnapdClient * +snapd_client_new (void) +{ + /* use a dummy object - we intercept all snapd-glib calls */ + return g_object_new (G_TYPE_OBJECT, NULL); +} + +void +snapd_client_set_allow_interaction (SnapdClient *client, gboolean allow_interaction) +{ +} + +void +snapd_client_set_auth_data (SnapdClient *client, SnapdAuthData *auth_data) +{ +} + +gboolean +snapd_client_connect_sync (SnapdClient *client, GCancellable *cancellable, GError **error) +{ + /* skip connection */ + return TRUE; +} + +const gchar * +snapd_client_get_user_agent (SnapdClient *client) +{ + return "snapd-glib/0.0.1"; +} + +void +snapd_client_set_user_agent (SnapdClient *client, const gchar *user_agent) +{ +} + +SnapdSystemInformation * +snapd_client_get_system_information_sync (SnapdClient *client, GCancellable *cancellable, GError **error) +{ + g_autoptr(GHashTable) sandbox_features = g_hash_table_new (g_str_hash, g_str_equal); + return g_object_new (SNAPD_TYPE_SYSTEM_INFORMATION, + "version", "2.31", + "confinement", SNAPD_SYSTEM_CONFINEMENT_STRICT, + "sandbox-features", sandbox_features, + NULL); +} + +static SnapdSnap * +make_snap (const gchar *name, SnapdSnapStatus status) +{ + gchar *common_ids[] = { NULL }; + g_autoptr(GDateTime) install_date = NULL; + g_autoptr(GPtrArray) apps = NULL; + g_autoptr(GPtrArray) media = NULL; + SnapdMedia *m; + + install_date = g_date_time_new_utc (2017, 1, 2, 11, 23, 58); + + apps = g_ptr_array_new_with_free_func (g_object_unref); + + media = g_ptr_array_new_with_free_func (g_object_unref); + m = g_object_new (SNAPD_TYPE_MEDIA, + "type", "screenshot", + "url", "http://example.com/screenshot1.jpg", + "width", 640, + "height", 480, + NULL); + g_ptr_array_add (media, m); + m = g_object_new (SNAPD_TYPE_MEDIA, + "type", "screenshot", + "url", "http://example.com/screenshot2.jpg", + "width", 1024, + "height", 768, + NULL); + g_ptr_array_add (media, m); + + return g_object_new (SNAPD_TYPE_SNAP, + "apps", status == SNAPD_SNAP_STATUS_INSTALLED ? apps : NULL, + "common-ids", common_ids, + "description", "DESCRIPTION", + "download-size", status == SNAPD_SNAP_STATUS_AVAILABLE ? 500 : 0, + "icon", status == SNAPD_SNAP_STATUS_AVAILABLE ? NULL : "/icon", + "id", name, + "install-date", status == SNAPD_SNAP_STATUS_INSTALLED ? install_date : NULL, + "installed-size", status == SNAPD_SNAP_STATUS_INSTALLED ? 1000 : 0, + "media", status == SNAPD_SNAP_STATUS_AVAILABLE ? media : NULL, + "name", name, + "status", status, + "snap-type", SNAPD_SNAP_TYPE_APP, + "summary", "SUMMARY", + "version", "VERSION", + NULL); +} + +GPtrArray * +snapd_client_get_snaps_sync (SnapdClient *client, + SnapdGetSnapsFlags flags, gchar **names, + GCancellable *cancellable, GError **error) +{ + GPtrArray *snaps; + + snaps = g_ptr_array_new_with_free_func (g_object_unref); + if (snap_installed) + g_ptr_array_add (snaps, make_snap ("snap", SNAPD_SNAP_STATUS_INSTALLED)); + + return snaps; +} + +SnapdSnap * +snapd_client_get_snap_sync (SnapdClient *client, + const gchar *name, + GCancellable *cancellable, GError **error) +{ + if (snap_installed) { + return make_snap ("snap", SNAPD_SNAP_STATUS_INSTALLED); + } else { + g_set_error_literal (error, SNAPD_ERROR, SNAPD_ERROR_NOT_INSTALLED, "not installed"); + return NULL; + } +} + +SnapdIcon * +snapd_client_get_icon_sync (SnapdClient *client, + const gchar *name, + GCancellable *cancellable, GError **error) +{ + g_autoptr(GBytes) data = NULL; + /* apparently this is the smallest valid PNG file (1x1) */ + const gchar png_data[67] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, + 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4, + 0x89, 0x00, 0x00, 0x00, 0x0A, 0x49, 0x44, 0x41, + 0x54, 0x78, 0x9C, 0x63, 0x00, 0x01, 0x00, 0x00, + 0x05, 0x00, 0x01, 0x0D, 0x0A, 0x2D, 0xB4, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, + 0x42, 0x60, 0x82 }; + + data = g_bytes_new (png_data, 67); + return g_object_new (SNAPD_TYPE_ICON, + "mime-type", "image/png", + "data", data, + NULL); +} + +gboolean +snapd_client_get_connections_sync (SnapdClient *client, + GPtrArray **established, GPtrArray **undesired, + GPtrArray **plugs, GPtrArray **slots, + GCancellable *cancellable, GError **error) +{ + if (plugs) + *plugs = g_ptr_array_new_with_free_func (g_object_unref); + if (slots) + *slots = g_ptr_array_new_with_free_func (g_object_unref); + return TRUE; +} + +GPtrArray * +snapd_client_find_section_sync (SnapdClient *client, + SnapdFindFlags flags, + const gchar *section, const gchar *query, + gchar **suggested_currency, + GCancellable *cancellable, GError **error) +{ + GPtrArray *snaps; + + snaps = g_ptr_array_new_with_free_func (g_object_unref); + g_ptr_array_add (snaps, make_snap ("snap", SNAPD_SNAP_STATUS_AVAILABLE)); + + return snaps; +} + +gboolean +snapd_client_install2_sync (SnapdClient *client, + SnapdInstallFlags flags, + const gchar *name, const gchar *channel, const gchar *revision, + SnapdProgressCallback progress_callback, gpointer progress_callback_data, + GCancellable *cancellable, GError **error) +{ + g_autoptr(SnapdChange) change = NULL; + g_autoptr(GPtrArray) tasks = NULL; + SnapdTask *task; + + g_assert_cmpstr (name, ==, "snap"); + g_assert (channel == NULL); + + tasks = g_ptr_array_new_with_free_func (g_object_unref); + task = g_object_new (SNAPD_TYPE_TASK, + "progress-done", 0, + "progress-total", 1, + NULL); + g_ptr_array_add (tasks, task); + change = g_object_new (SNAPD_TYPE_CHANGE, + "tasks", tasks, + NULL); + progress_callback (client, change, NULL, progress_callback_data); + + snap_installed = TRUE; + return TRUE; +} + +gboolean +snapd_client_remove_sync (SnapdClient *client, + const gchar *name, + SnapdProgressCallback progress_callback, gpointer progress_callback_data, + GCancellable *cancellable, GError **error) +{ + g_autoptr(SnapdChange) change = NULL; + g_autoptr(GPtrArray) tasks = NULL; + SnapdTask *task; + + g_assert_cmpstr (name, ==, "snap"); + + tasks = g_ptr_array_new_with_free_func (g_object_unref); + task = g_object_new (SNAPD_TYPE_TASK, + "progress-done", 0, + "progress-total", 1, + NULL); + g_ptr_array_add (tasks, task); + change = g_object_new (SNAPD_TYPE_CHANGE, + "tasks", tasks, + NULL); + progress_callback (client, change, NULL, progress_callback_data); + + snap_installed = FALSE; + return TRUE; +} + +static void +gs_plugins_snap_test_func (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppList) apps = NULL; + gboolean ret; + GsApp *app; + GPtrArray *screenshots, *images; + AsScreenshot *screenshot; + AsImage *image; + g_autoptr(GIcon) icon = NULL; + g_autoptr(GInputStream) icon_stream = NULL; + g_autoptr(GdkPixbuf) pixbuf = NULL; + g_autoptr(GError) error = NULL; + GsSizeType size_installed_type, size_download_type; + guint64 size_installed_bytes, size_download_bytes; + const gchar *keywords[] = { NULL, }; + g_autoptr(GsAppQuery) query = NULL; + + /* no snap, abort */ + if (!gs_plugin_loader_get_enabled (plugin_loader, "snap")) { + g_test_skip ("not enabled"); + return; + } + + keywords[0] = "snap"; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + apps = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert (apps != NULL); + g_assert_cmpint (gs_app_list_length (apps), ==, 1); + app = gs_app_list_index (apps, 0); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE); + g_assert_cmpstr (gs_app_get_name (app), ==, "snap"); + g_assert_cmpstr (gs_app_get_version (app), ==, "VERSION"); + g_assert_cmpstr (gs_app_get_summary (app), ==, "SUMMARY"); + g_assert_cmpstr (gs_app_get_description (app), ==, "DESCRIPTION"); + screenshots = gs_app_get_screenshots (app); + g_assert_cmpint (screenshots->len, ==, 2); + screenshot = g_ptr_array_index (screenshots, 0); + images = as_screenshot_get_images (screenshot); + g_assert_cmpint (images->len, ==, 1); + image = g_ptr_array_index (images, 0); + g_assert_cmpstr (as_image_get_url (image), ==, "http://example.com/screenshot1.jpg"); + g_assert_cmpint (as_image_get_width (image), ==, 640); + g_assert_cmpint (as_image_get_height (image), ==, 480); + screenshot = g_ptr_array_index (screenshots, 1); + images = as_screenshot_get_images (screenshot); + g_assert_cmpint (images->len, ==, 1); + image = g_ptr_array_index (images, 0); + g_assert_cmpstr (as_image_get_url (image), ==, "http://example.com/screenshot2.jpg"); + g_assert_cmpint (as_image_get_width (image), ==, 1024); + g_assert_cmpint (as_image_get_height (image), ==, 768); + icon = gs_app_get_icon_for_size (app, 64, 1, NULL); + g_assert_null (icon); + + size_installed_type = gs_app_get_size_installed (app, &size_installed_bytes); + g_assert_cmpint (size_installed_type, ==, GS_SIZE_TYPE_VALID); + g_assert_cmpuint (size_installed_bytes, ==, 0); + + size_download_type = gs_app_get_size_download (app, &size_download_bytes); + g_assert_cmpint (size_download_type, ==, GS_SIZE_TYPE_VALID); + g_assert_cmpuint (size_download_bytes, ==, 500); + + g_assert_cmpint (gs_app_get_install_date (app), ==, 0); + + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_install_apps_new (apps, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + + size_installed_type = gs_app_get_size_installed (app, &size_installed_bytes); + g_assert_cmpint (size_installed_type, ==, GS_SIZE_TYPE_VALID); + g_assert_cmpuint (size_installed_bytes, ==, 1000); + + g_assert_cmpint (gs_app_get_install_date (app), ==, g_date_time_to_unix (g_date_time_new_utc (2017, 1, 2, 11, 23, 58))); + + icon = gs_app_get_icon_for_size (app, 128, 1, NULL); + g_assert_nonnull (icon); + g_assert_true (G_IS_LOADABLE_ICON (icon)); + icon_stream = g_loadable_icon_load (G_LOADABLE_ICON (icon), 128, NULL, NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (icon_stream); + pixbuf = gdk_pixbuf_new_from_stream (icon_stream, NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (pixbuf); + g_assert_cmpint (gdk_pixbuf_get_width (pixbuf), ==, 128); + g_assert_cmpint (gdk_pixbuf_get_height (pixbuf), ==, 128); + + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_uninstall_apps_new (apps, GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE); + gs_test_flush_main_context (); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + g_assert_no_error (error); + g_assert (ret); +} + +int +main (int argc, char **argv) +{ + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + const gchar * const allowlist[] = { + "snap", + NULL + }; + + gs_test_init (&argc, &argv); + + /* we can only load this once per process */ + plugin_loader = gs_plugin_loader_new (NULL, NULL); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR_CORE); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + + /* plugin tests go here */ + g_test_add_data_func ("/gnome-software/plugins/snap/test", + plugin_loader, + (GTestDataFunc) gs_plugins_snap_test_func); + return g_test_run (); +} diff --git a/plugins/snap/meson.build b/plugins/snap/meson.build new file mode 100644 index 0000000..190d397 --- /dev/null +++ b/plugins/snap/meson.build @@ -0,0 +1,44 @@ +cargs = ['-DG_LOG_DOMAIN="GsPluginSnap"'] + +shared_module( + 'gs_plugin_snap', + sources : [ + 'gs-plugin-snap.c' + ], + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : [ plugin_libs, snap ], +) +metainfo = 'org.gnome.Software.Plugin.Snap.metainfo.xml' + +i18n.merge_file( + input: metainfo + '.in', + output: metainfo, + type: 'xml', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'metainfo') +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] + cargs += ['-DLOCALPLUGINDIR_CORE="' + meson.current_build_dir() + '/../core"'] + e = executable( + 'gs-self-test-snap', + compiled_schemas, + sources : [ + 'gs-self-test.c' + ], + dependencies : [ + plugin_libs, + snap + ], + c_args : cargs, + ) + test('gs-self-test-snap', e, suite: ['plugins', 'snap'], env: test_env) +endif diff --git a/plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in b/plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in new file mode 100644 index 0000000..25678c7 --- /dev/null +++ b/plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in @@ -0,0 +1,12 @@ + + + + org.gnome.Software.Plugin.Snap + org.gnome.Software.desktop + Snap Support + A snap is a universal Linux package + https://snapcraft.io/ + CC0-1.0 + GPL-2.0-or-later + richard_at_hughsie.com + diff --git a/plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c b/plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c new file mode 100644 index 0000000..9e55e5a --- /dev/null +++ b/plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c @@ -0,0 +1,2757 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (c) 2024 Codethink Limited + * Copyright (c) 2024 GNOME Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include "gs-appstream.h" +#include "gs-external-appstream-utils.h" +#include "gs-metered.h" +#include "gs-plugin-systemd-sysupdate.h" +#include "gs-systemd-sysupdated-generated.h" + +/* + * This plugin only works when systemd-sysupdated's org.freedesktop.sysupdate1 + * D-Bus service is available on the system. For more information see the + * following links: + * - https://github.com/systemd/systemd/blob/main/docs/APPSTREAM_BUNDLE.md + * - https://github.com/systemd/systemd/blob/main/man/org.freedesktop.sysupdate1.xml + * - https://github.com/systemd/systemd/blob/main/man/systemd-sysupdated.service.xml + * - https://github.com/systemd/systemd/blob/main/man/systemd-sysupdate.xml + * - https://github.com/systemd/systemd/blob/main/man/sysupdate.d.xml + * - https://github.com/systemd/systemd/blob/main/man/sysupdate.features.xml + * - https://github.com/systemd/systemd/blob/main/man/updatectl.xml + */ + +#define FREEDESKTOP_DBUS_LIST_ACTIVATABLE_NAMES_TIMEOUT_MS (200) +#define SYSUPDATED_JOB_CANCEL_TIMEOUT_MS (1000) +#define SYSUPDATED_MANAGER_LIST_TARGET_TIMEOUT_MS (1000) +#define SYSUPDATED_TARGET_CHECK_NEW_TIMEOUT_MS (10000) +#define SYSUPDATED_TARGET_DESCRIBE_TIMEOUT_MS (1000) +#define SYSUPDATED_TARGET_GET_APP_STREAM_TIMEOUT_MS (1000) +#define SYSUPDATED_TARGET_GET_VERSION_TIMEOUT_MS (1000) +#define SYSUPDATED_TARGET_UPDATE_TIMEOUT_MS (-1) + +/* See the org.freedesktop.sysupdate1 manual for a list of flags. */ +#define SYSUPDATED_TARGET_DESCRIBE_FLAGS_NONE ((guint64) 0) +#define SYSUPDATED_TARGET_DESCRIBE_FLAGS_OFFLINE ((guint64) (1 << 0)) +#define SYSUPDATED_TARGET_UPDATE_FLAGS_NONE ((guint64) 0) + +/* Structure stores the `target` information reported by + * `systemd-sysupdated` */ +typedef struct { + GsSystemdSysupdateTarget *proxy; + gboolean is_valid; + gchar *id; /* (owned) (not nullable) */ + gchar *class; /* (owned) (not nullable) */ + gchar *name; /* (owned) (not nullable) */ + gchar *object_path; /* (owned) (not nullable) */ + gchar *current_version; /* (owned) (nullable) */ + gchar *latest_version; /* (owned) (nullable) */ + gchar *cache_hash; /* (owned) (nullable) */ + gchar *xml_cache_kind; /* (owned) (nullable) */ + GFile *xml_blob; /* (owned) (nullable) */ + XbSilo *silo; /* (owned) (nullable) */ +} TargetItem; + +static TargetItem * +target_item_new (const gchar *class, const gchar *name, const gchar *object_path) +{ + TargetItem *target = g_new0 (TargetItem, 1); + target->is_valid = TRUE; /* default to true on creation */ + if (g_strcmp0 (class, "host") == 0) { + target->id = g_strdup ("host"); + } else { + target->id = g_strdup_printf ("%s-%s", class, name); + } + target->class = g_strdup (class); + target->name = g_strdup (name); + target->object_path = g_strdup (object_path); + return target; +} + +static void +target_item_free (TargetItem *target) +{ + target->is_valid = FALSE; + g_clear_object (&target->proxy); + g_clear_pointer (&target->id, g_free); + g_clear_pointer (&target->class, g_free); + g_clear_pointer (&target->name, g_free); + g_clear_pointer (&target->object_path, g_free); + g_clear_pointer (&target->current_version, g_free); + g_clear_pointer (&target->latest_version, g_free); + g_clear_pointer (&target->cache_hash, g_free); + g_clear_pointer (&target->xml_cache_kind, g_free); + g_clear_object (&target->xml_blob); + g_clear_object (&target->silo); + g_free (target); +} + +static const gchar * +target_item_get_id (TargetItem *target) +{ + return target->id; +} + +static gboolean +target_item_is_available (TargetItem *target) +{ + return target->latest_version != NULL; +} + +static gboolean +target_item_is_installed (TargetItem *target) +{ + return target->current_version != NULL; +} + +static gboolean +target_item_is_updatable (TargetItem *target) +{ + return target_item_is_available (target) && target_item_is_installed (target); +} + +static gboolean +target_item_matches_keywords (TargetItem *target, + const gchar *const *keywords) +{ + return g_strv_contains (keywords, "sysupdate") || + g_strv_contains (keywords, target->class) || + g_strv_contains (keywords, target->name); +} + +static const gchar * +target_item_get_cache_hash (TargetItem *target, + GError **error) +{ + if (target->cache_hash != NULL) { + return target->cache_hash; + } + + target->cache_hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1, target->object_path, -1); + if (target->cache_hash == NULL) { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "Failed to hash object path ‘%s’", + target->object_path); + return NULL; + } + + return target->cache_hash; +} + +static const gchar * +target_item_get_xml_cache_kind (TargetItem *target, + GsPlugin *plugin, + GError **error) +{ + const gchar *cache_hash; + + if (target->xml_cache_kind != NULL) { + return target->xml_cache_kind; + } + + cache_hash = target_item_get_cache_hash (target, error); + if (cache_hash == NULL) { + return NULL; + } + + target->xml_cache_kind = g_build_filename (gs_plugin_get_name (plugin), cache_hash, "xml", NULL); + + return target->xml_cache_kind; +} + +static GFile * +target_item_get_xml_blob (TargetItem *target, + GsPlugin *plugin, + GError **error) +{ + const gchar *cache_hash; + g_autofree gchar *cache_kind = NULL; + g_autofree gchar *xml_blob_path = NULL; + + if (target->xml_blob != NULL) { + return target->xml_blob; + } + + cache_hash = target_item_get_cache_hash (target, error); + if (cache_hash == NULL) { + return NULL; + } + + cache_kind = g_build_filename (gs_plugin_get_name (plugin), cache_hash, NULL); + xml_blob_path = gs_utils_get_cache_filename (cache_kind, + "components.xmlb", + GS_UTILS_CACHE_FLAG_WRITEABLE | GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + error); + if (xml_blob_path == NULL) { + return NULL; + } + + target->xml_blob = g_file_new_for_path (xml_blob_path); + + return target->xml_blob; +} + +static XbSilo * +target_item_ensure_silo_for_appstream_paths (TargetItem *target, + GsPlugin *plugin, + GStrv appstream_paths, + GCancellable *cancellable, + GError **error) +{ + GFile* xml_blob = NULL; + g_autoptr(XbBuilder) builder = NULL; + g_autoptr(XbSilo) silo = NULL; + + builder = xb_builder_new (); + + /* Verbose profiling. */ + if (g_getenv ("GS_XMLB_VERBOSE") != NULL) { + xb_builder_set_profile_flags (builder, + XB_SILO_PROFILE_FLAG_XPATH | + XB_SILO_PROFILE_FLAG_DEBUG); + } + + gs_appstream_add_current_locales (builder); + + for (GStrv appstream_paths_l = appstream_paths; appstream_paths_l != NULL && *appstream_paths_l != NULL; appstream_paths_l++) { + g_autoptr(XbBuilderSource) source = NULL; + g_autoptr(GFile) appstream_file = NULL; + g_autoptr(XbBuilderNode) info = NULL; + + source = xb_builder_source_new (); + appstream_file = g_file_new_for_path (*appstream_paths_l); + if (!xb_builder_source_load_file (source, + appstream_file, + XB_BUILDER_SOURCE_FLAG_WATCH_FILE | XB_BUILDER_SOURCE_FLAG_LITERAL_TEXT, + cancellable, + error)) { + return NULL; + } + + /* Add metadata. */ + info = xb_builder_node_insert (NULL, "info", NULL); + xb_builder_node_insert_text (info, "scope", as_component_scope_to_string (AS_COMPONENT_SCOPE_SYSTEM), NULL); + xb_builder_source_set_info (source, info); + + xb_builder_import_source (builder, source); + } + + /* Regenerate with each minor release. */ + xb_builder_append_guid (builder, PACKAGE_VERSION); + + xml_blob = target_item_get_xml_blob (target, plugin, error); + if (xml_blob == NULL) { + return NULL; + } + + silo = xb_builder_ensure (builder, xml_blob, + XB_BUILDER_COMPILE_FLAG_IGNORE_INVALID | XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, + cancellable, + error); +#ifdef __GLIBC__ + /* https://gitlab.gnome.org/GNOME/gnome-software/-/issues/941 + * libxmlb <= 0.3.22 makes lots of temporary heap allocations parsing large XMLs + * trim the heap after parsing to control RSS growth. */ + malloc_trim (0); +#endif + + if (silo == NULL) { + return NULL; + } + + g_clear_object (&target->silo); + target->silo = g_steal_pointer (&silo); + + return target->silo; +} + +/* Structure stores the `targets` whose information to be updated in + * queue and the current working `target` */ +typedef struct { + GQueue *queue; /* (owned) (not nullable) (element-type TargetItem) */ + GsPluginRefreshMetadataFlags flags; +} GsPluginSystemdSysupdateRefreshMetadataData; + +/* Takes ownership of @queue */ +static GsPluginSystemdSysupdateRefreshMetadataData * +gs_plugin_systemd_sysupdate_refresh_metadata_data_new (GQueue *queue, + GsPluginRefreshMetadataFlags flags) +{ + GsPluginSystemdSysupdateRefreshMetadataData *data = g_new0 (GsPluginSystemdSysupdateRefreshMetadataData, 1); + data->queue = g_steal_pointer (&queue); + data->flags = flags; + return data; +} + +static void +gs_plugin_systemd_sysupdate_refresh_metadata_data_free (GsPluginSystemdSysupdateRefreshMetadataData *data) +{ + g_clear_pointer (&data->queue, g_queue_free); + data->flags = 0; + g_free (data); +} + +/* Structure stores the `targets` whose information to be updated in + * queue and the current working `target` */ +typedef struct { + TargetItem *target; /* (not owned) (nullable) */ + GsPluginRefreshMetadataFlags flags; +} GsPluginSystemdSysupdateTargetRefreshMetadataData; + +static GsPluginSystemdSysupdateTargetRefreshMetadataData * +gs_plugin_systemd_sysupdate_target_refresh_metadata_data_new (TargetItem *target, + GsPluginRefreshMetadataFlags flags) +{ + GsPluginSystemdSysupdateTargetRefreshMetadataData *data = g_new0 (GsPluginSystemdSysupdateTargetRefreshMetadataData, 1); + data->target = target; + data->flags = flags; + return data; +} + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_data_free (GsPluginSystemdSysupdateTargetRefreshMetadataData *data) +{ + data->target = NULL; + data->flags = 0; + g_free (data); +} + +/* Structure stores the `targets` whose information to be refined in + * queue and the current working `target` */ +typedef struct { + GQueue *queue; /* (owned) (not nullable) (element-type TargetItem) */ + GsPluginRefineFlags flags; +} GsPluginSystemdSysupdateRefineData; + +static GsPluginSystemdSysupdateRefineData * +gs_plugin_systemd_sysupdate_refine_data_new (GQueue *queue, + GsPluginRefineFlags flags) +{ + GsPluginSystemdSysupdateRefineData *data = g_new0 (GsPluginSystemdSysupdateRefineData, 1); + data->queue = g_steal_pointer (&queue); + data->flags = flags; + return data; +} + +static void +gs_plugin_systemd_sysupdate_refine_data_free (GsPluginSystemdSysupdateRefineData *data) +{ + if (data->queue != NULL) { + g_queue_free_full (data->queue, g_object_unref); + data->queue = NULL; + } + data->flags = 0; + g_free (data); +} + +typedef struct { + GsApp *app; /* (owned) (not nullable) */ +} GsPluginSystemdSysupdateRefineAppData; + +static GsPluginSystemdSysupdateRefineAppData * +gs_plugin_systemd_sysupdate_refine_app_data_new (GsApp *app) +{ + GsPluginSystemdSysupdateRefineAppData *data = g_new0 (GsPluginSystemdSysupdateRefineAppData, 1); + data->app = g_object_ref (app); + return data; +} + +static void +gs_plugin_systemd_sysupdate_refine_app_data_free (GsPluginSystemdSysupdateRefineAppData *data) +{ + g_clear_object (&data->app); + g_free (data); +} + +typedef struct { + GQueue *queue; /* (owned) (not nullable) (element-type GsApp) */ + GsPluginProgressCallback progress_callback; + gpointer progress_user_data; + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback; + gpointer app_needs_user_action_data; + GCancellable *cancellable; /* (owned) (nullable) */ + GsPluginUpdateAppsFlags flags; +} GsPluginSystemdSysupdateUpdateAppsData; + +static GsPluginSystemdSysupdateUpdateAppsData * +gs_plugin_systemd_sysupdate_update_apps_data_new (GQueue *queue, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GsPluginUpdateAppsFlags flags) +{ + GsPluginSystemdSysupdateUpdateAppsData *data = g_new0 (GsPluginSystemdSysupdateUpdateAppsData, 1); + data->queue = g_steal_pointer (&queue); + data->progress_callback = progress_callback; + data->progress_user_data = progress_user_data; + data->app_needs_user_action_callback = app_needs_user_action_callback; + data->app_needs_user_action_data = app_needs_user_action_data; + g_set_object (&data->cancellable, cancellable); + data->flags = flags; + return data; +} + +static void +gs_plugin_systemd_sysupdate_update_apps_data_free (GsPluginSystemdSysupdateUpdateAppsData *data) +{ + if (data->queue != NULL) { + g_queue_free_full (data->queue, g_object_unref); + data->queue = NULL; + } + data->progress_callback = NULL; + data->progress_user_data = NULL; + data->app_needs_user_action_callback = NULL; + data->app_needs_user_action_data = NULL; + g_clear_object (&data->cancellable); + data->flags = 0; + g_free (data); +} + +typedef struct { + GsApp *app; /* (owned) (not nullable) */ + GCancellable *cancellable; /* (owned) (nullable) */ + gulong cancelled_id; + gboolean interactive; + gpointer schedule_entry_handle; +} GsPluginSystemdSysupdateUpdateAppData; + +static void +gs_plugin_systemd_sysupdate_update_app_data_remove_from_download_scheduler_cb (GObject *source_object, + GAsyncResult *result, + gpointer schedule_entry_handle); + +static GsPluginSystemdSysupdateUpdateAppData * +gs_plugin_systemd_sysupdate_update_app_data_new (GsApp *app, + GCancellable *cancellable, + gulong cancelled_id, + gboolean interactive) +{ + GsPluginSystemdSysupdateUpdateAppData *data = g_new0 (GsPluginSystemdSysupdateUpdateAppData, 1); + data->app = g_object_ref (app); + g_set_object (&data->cancellable, cancellable); + data->cancelled_id = cancelled_id; + data->interactive = interactive; + return data; +} + +static void +gs_plugin_systemd_sysupdate_update_app_data_free (GsPluginSystemdSysupdateUpdateAppData *data) +{ + g_cancellable_disconnect (data->cancellable, data->cancelled_id); + + g_clear_object (&data->app); + g_clear_object (&data->cancellable); + data->cancelled_id = 0; + data->interactive = FALSE; + g_assert (data->schedule_entry_handle == NULL); + g_free (data); +} + +static void +gs_plugin_systemd_sysupdate_update_app_data_remove_from_download_scheduler (GsPluginSystemdSysupdateUpdateAppData *data) +{ + if (data->schedule_entry_handle == NULL) { + return; + } + + gs_metered_remove_from_download_scheduler_async (data->schedule_entry_handle, + NULL, + gs_plugin_systemd_sysupdate_update_app_data_remove_from_download_scheduler_cb, + data->schedule_entry_handle); + data->schedule_entry_handle = NULL; +} + +static void +gs_plugin_systemd_sysupdate_update_app_data_remove_from_download_scheduler_cb (GObject *source_object, + GAsyncResult *result, + gpointer schedule_entry_handle) +{ + g_autoptr(GError) local_error = NULL; + + if (!gs_metered_remove_from_download_scheduler_finish (schedule_entry_handle, result, &local_error)) { + g_warning ("Failed to remove from download scheduler: %s", + local_error->message); + g_clear_error (&local_error); + } +} + +/* Plugin object */ +struct _GsPluginSystemdSysupdate { + GsPlugin parent; + + gchar *os_pretty_name; /* (owned) (not nullable) */ + gchar *os_version; /* (owned) (not nullable) */ + + GsSystemdSysupdateManager *manager_proxy; /* (owned) (nullable) */ + GHashTable *target_item_map; /* (owned) (not nullable) (element-type utf8 TargetItem) */ + GHashTable *job_task_map; /* (owned) (not nullable) (element-type utf8 GTask) */ + GHashTable *job_to_remove_status_map; /* (owned) (not nullable) (element-type utf8 int32) */ + GHashTable *job_to_cancel_task_map; /* (owned) (not nullable) (element-type utf8 GTask) */ + gboolean is_metadata_refresh_ongoing; + guint64 cache_age_secs; +}; + +/* Plugin private methods, and their callbacks. */ + +static void +gs_plugin_systemd_sysupdate_remove_job_apply (GsPluginSystemdSysupdate *self, + GTask *task, + const gchar *job_path, + gint32 job_status); + +static void +gs_plugin_systemd_sysupdate_cancel_job_cancel_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_cancel_job_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_cancel_job_revoke (GsPluginSystemdSysupdate *self, + const gchar *job_path); + +static void +gs_plugin_systemd_sysupdate_update_target_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_update_target_update_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_update_target_job_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_update_target_notify_progress_cb (gpointer user_data); + +/* Plugin overridden virtual methods, and their callbacks. */ + +static void +gs_plugin_systemd_sysupdate_setup_list_activatable_names_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_setup_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_refine_iter (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_refine_app_async (GsPlugin *plugin, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_refine_app_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_refine_app_describe_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static gboolean +gs_plugin_systemd_sysupdate_refine_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + +static void +gs_plugin_systemd_sysupdate_refresh_metadata_list_targets_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_refresh_metadata_iter (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_async (GsPlugin *plugin, + TargetItem *target, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_get_app_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_external_appstream_refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_get_version_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_check_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static gboolean +gs_plugin_systemd_sysupdate_target_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + +static void +gs_plugin_systemd_sysupdate_update_apps_iter (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_update_app_async (GsPlugin *plugin, + GsApp *app, + gboolean interactive, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static void +gs_plugin_systemd_sysupdate_update_app_download_scheduler_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_update_app_update_target_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_plugin_systemd_sysupdate_update_app_remove_from_download_scheduler_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static gboolean +gs_plugin_systemd_sysupdate_update_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error); + +G_DEFINE_TYPE (GsPluginSystemdSysupdate, gs_plugin_systemd_sysupdate, GS_TYPE_PLUGIN) + +static TargetItem * +lookup_target_by_app (GsPluginSystemdSysupdate *self, + GsApp *app) +{ + /* Helper to get the associated `target` of the given `app` + */ + return g_hash_table_lookup (self->target_item_map, gs_app_get_metadata_item (app, "SystemdSysupdated::Target")); +} + +static GsApp * +create_app_for_target_appstream (GsPluginSystemdSysupdate *self, + TargetItem *target, + GError **error) +{ + GsPlugin *plugin = GS_PLUGIN (self); + g_autoptr(XbNode) component = NULL; + g_autoptr(XbNode) info_filename = NULL; + const gchar *silo_filename = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) local_error = NULL; + + if (target->silo == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "No metadata available"); + return NULL; + } + + component = xb_silo_query_first (target->silo, "/component", NULL); + if (component == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_INVALID_FORMAT, + "No component available in metadata"); + return NULL; + } + + info_filename = xb_silo_query_first (target->silo, "/info/filename", NULL); + if (info_filename != NULL) { + silo_filename = xb_node_get_text (info_filename); + } + + if (silo_filename == NULL) { + silo_filename = ""; + } + + app = gs_appstream_create_app (plugin, target->silo, component, silo_filename, AS_COMPONENT_SCOPE_SYSTEM, &local_error); + if (local_error != NULL) { + g_propagate_error (error, g_steal_pointer (&local_error)); + return NULL; + } else if (app == NULL) { + g_set_error_literal (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED, + "Couldn't create an application via appstream"); + return NULL; + } + + /* store target name to look up target info. */ + gs_app_set_metadata (app, "SystemdSysupdated::Target", target->name); + gs_app_set_metadata (app, "SystemdSysupdated::Class", target->class); + + /* own the app we created */ + gs_app_set_management_plugin (app, plugin); + + return g_steal_pointer (&app); +} + +static GsApp * +create_app_for_target_fallback (GsPluginSystemdSysupdate *self, + TargetItem *target, + GError **error) +{ + /* Create an app upgrade (os-upgrade) for the target `host` or an app + * update for the target `component` + */ + g_autoptr(GsApp) app = NULL; + g_autofree gchar *app_id = NULL; + const gchar *app_name = NULL; +#if AS_CHECK_VERSION(1, 0, 4) + AsBundleKind bundle_kind = AS_BUNDLE_KIND_SYSUPDATE; +#else + AsBundleKind bundle_kind = AS_BUNDLE_KIND_UNKNOWN; +#endif + const gchar *app_summary = NULL; + GsAppQuirk app_quirk = GS_APP_QUIRK_NEEDS_REBOOT + | GS_APP_QUIRK_PROVENANCE + | GS_APP_QUIRK_NOT_REVIEWABLE; + + if (g_strcmp0 (target->class, "host") == 0) { + app_name = self->os_pretty_name; +#if !AS_CHECK_VERSION(1, 0, 4) + bundle_kind = AS_BUNDLE_KIND_PACKAGE; +#endif + /* TRANSLATORS: this is the system OS upgrade */ + app_summary = _("System"); + } else if (g_strcmp0 (target->class, "component") == 0) { + app_name = target_item_get_id (target); + /* TRANSLATORS: this is the system component update */ + app_summary = _("System component"); + app_quirk |= GS_APP_QUIRK_COMPULSORY; + } else { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "Unsupported target class `%s`", + target->class); + return NULL; + } + + app_id = g_strdup_printf ("%s.%s", + gs_plugin_get_name (GS_PLUGIN (self)), + target_item_get_id (target)); + + /* We explicitly don't set the license as we don't have it with the + * current version of the sysupdate D-Bus API. + */ + app = gs_app_new (app_id); + gs_app_set_name (app, GS_APP_QUALITY_LOWEST, app_name); + gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM); + gs_app_set_kind (app, AS_COMPONENT_KIND_OPERATING_SYSTEM); + gs_app_set_bundle_kind (app, bundle_kind); + gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, app_summary); + gs_app_set_size_installed (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWABLE, 0); + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + gs_app_set_progress (app, GS_APP_PROGRESS_UNKNOWN); + gs_app_set_allow_cancel (app, TRUE); + + /* store target name to look up target info. */ + gs_app_set_metadata (app, "SystemdSysupdated::Target", target->name); + gs_app_set_metadata (app, "SystemdSysupdated::Class", target->class); + + gs_app_add_quirk (app, app_quirk); + + /* own the app we created */ + gs_app_set_management_plugin (app, GS_PLUGIN (self)); + + /* store app to the per-plugin cache */ + gs_plugin_cache_add (GS_PLUGIN (self), target_item_get_id (target), app); + + return g_steal_pointer (&app); +} + +static GsApp * +create_app_for_target (GsPluginSystemdSysupdate *self, + TargetItem *target, + GError **error) +{ + /* Valid metadata are required for all but the host target. If we can't + * create an application from the appstream metainfo, we create a + * fallback application to avoid blocking host updates. */ + if (g_strcmp0 (target->class, "host") == 0) { + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) local_error = NULL; + + app = create_app_for_target_appstream (self, target, &local_error); + if (app != NULL) { + return g_steal_pointer (&app); + } + + g_debug ("Couldn't create app for host target, creating fallback: %s", local_error->message); + + return create_app_for_target_fallback (self, target, error); + } else if (g_strcmp0 (target->class, "component") == 0) { + return create_app_for_target_appstream (self, target, error); + } else { + g_set_error (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_NOT_SUPPORTED, + "Unsupported target class `%s`", + target->class); + return NULL; + } +} + +static GsApp * +get_or_create_app_for_target (GsPluginSystemdSysupdate *self, + TargetItem *target, + GError **error) +{ + /* Get or create an app when there is no existing one in cache + * for the given target */ + + g_autoptr(GsApp) app = NULL; + + /* find in the per-plugin cache */ + app = gs_plugin_cache_lookup (GS_PLUGIN (self), target_item_get_id (target)); + if (app != NULL) { + return g_steal_pointer (&app); + } + + return create_app_for_target (self, target, error); +} + +/* This plugin explicitly only allows updating already installed targets. It is + * expected for targets to be installed through other means. */ +static void +update_app_for_target (GsPluginSystemdSysupdate *self, + GsApp *app, + TargetItem *target) +{ + const gchar *app_version = NULL; + GsAppState app_state = GS_APP_STATE_UNKNOWN; + + if (target_item_is_updatable (target)) { + app_version = target->latest_version; + app_state = GS_APP_STATE_UPDATABLE; + } else if (target_item_is_installed (target)) { + if (g_strcmp0 (target->class, "host") == 0) { + app_version = self->os_version; + } else { + app_version = target->current_version; + } + app_state = GS_APP_STATE_INSTALLED; + } + + gs_app_set_version (app, app_version); + gs_app_set_state (app, app_state); +} + +/* Wrapper methods for async. target update + * + * The goal of the method `gs_plugin_systemd_sysupdate_update_target_async()` + * is to wrap the specific target update as a single async. call. + * By design, there are two D-Bus method calls and two D-Bus signals + * involved in one 'target update' progress: + * 1) D-Bus method `Target.Update()` + * 2) D-Bus method `Job.Cancel()` + * 3) D-Bus signal `Job.PropertiesChanged()` + * 4) D-Bus signal `Manager.JobRemoved()` + * + * Assumes there is only one job created dynamically in the runtime + * by `systemd-sysupdated` is associated to the `Target.Update()`. + * Here we create a subtask for each individual target update, and + * hide the 'target to job' mapping from the caller by maintaining + * the relationships internally within a look-up table. */ +typedef struct { + GsApp *app; /* (owned) (not nullable) */ + GsSystemdSysupdateJob *job_proxy; /* (owned) (nullable) */ + gchar *target_path; /* (owned) (not nullable) */ + gchar *job_path; /* (owned) (nullable) */ + gboolean interactive; +} GsPluginSystemdSysupdateUpdateTargetData; + +static GsPluginSystemdSysupdateUpdateTargetData * +gs_plugin_systemd_sysupdate_update_target_data_new (GsApp *app, + const gchar *target_path, + gboolean interactive) +{ + GsPluginSystemdSysupdateUpdateTargetData *data = g_new0 (GsPluginSystemdSysupdateUpdateTargetData, 1); + data->app = g_object_ref (app); + data->target_path = g_strdup (target_path); + data->interactive = interactive; + return data; +} + +static void +gs_plugin_systemd_sysupdate_update_target_data_free (GsPluginSystemdSysupdateUpdateTargetData *data) +{ + g_clear_object (&data->app); + g_clear_object (&data->job_proxy); + g_clear_pointer (&data->target_path, g_free); + g_clear_pointer (&data->job_path, g_free); + data->interactive = FALSE; + g_free (data); +} + +/* Remove the given job. It is called when the server notified us a job + * terminated. + * + * Because of the async nature of of the application, we can receive job removal + * notifications from the server after we requested the update jobs but before + * we finished preparing them. To handle job removal notifications correctly, we + * may need to store them until we are ready. */ +static void +gs_plugin_systemd_sysupdate_remove_job (GsPluginSystemdSysupdate *self, + const gchar *job_path, + gint32 job_status) +{ + GTask *task = NULL; + + if (g_hash_table_contains (self->job_to_remove_status_map, job_path)) { + g_debug ("Job already filed for removal: %s", job_path); + return; + } + + task = g_hash_table_lookup (self->job_task_map, job_path); + if (task == NULL) { + g_debug ("Couldn´t remove task for job `%s`, no task found, storing for later removal", job_path); + g_hash_table_insert (self->job_to_remove_status_map, g_strdup (job_path), GINT_TO_POINTER (job_status)); + /* The job terminated, there is nothing to cancel anymore. */ + gs_plugin_systemd_sysupdate_cancel_job_revoke (self, job_path); + return; + } + + gs_plugin_systemd_sysupdate_remove_job_apply (self, task, job_path, job_status); +} + +static void +gs_plugin_systemd_sysupdate_remove_job_apply (GsPluginSystemdSysupdate *self, + GTask *task, + const gchar *job_path, + gint32 job_status) +{ + GsPluginSystemdSysupdateUpdateTargetData *data = NULL; + const gchar *target_class = NULL; + gboolean target_is_host = FALSE; + + g_debug ("Removing task found for job `%s`", job_path); + /* pass the parameters to the callback */ + data = g_task_get_task_data (task); + target_class = gs_app_get_metadata_item (data->app, "SystemdSysupdated::Class"); + target_is_host = g_strcmp0 (target_class, "host") == 0; + + /* The `systemd-sysupdate` job returns zero on success, any other number + * represents a failure. A positive number is an exit code, and a + * negative number is an errno code that gives us more information about + * the failure. */ + if (job_status == 0) { + gs_app_set_progress (data->app, GS_APP_PROGRESS_UNKNOWN); + /* The `host` target should have its state left as `updatable`. */ + if (target_is_host) { + gs_app_set_state (data->app, GS_APP_STATE_UPDATABLE); + gs_app_set_size_download (data->app, GS_SIZE_TYPE_VALID, 0); + } else { + gs_app_set_state (data->app, GS_APP_STATE_INSTALLED); + } + } else { + gs_app_set_progress (data->app, GS_APP_PROGRESS_UNKNOWN); + /* The `host` target has the non-transient `updatable` state, so + * to recover back to the `available` state, we have to set it + * explicitly. */ + if (target_is_host) { + gs_app_set_state (data->app, GS_APP_STATE_AVAILABLE); + } else { + gs_app_set_state_recover (data->app); + } + } + + /* remove task from the hashmap and return the job status */ + g_hash_table_remove (self->job_task_map, job_path); + g_hash_table_remove (self->job_to_remove_status_map, job_path); + /* The job terminated, there is nothing to cancel anymore. */ + gs_plugin_systemd_sysupdate_cancel_job_revoke (self, job_path); + + if (job_status == 0) { + g_task_return_boolean (task, TRUE); + } else { + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + _("Removing sysupdate job '%s' failed with status %i"), + job_path, job_status); + } +} + +static void +gs_plugin_systemd_sysupdate_remove_job_revoke (GsPluginSystemdSysupdate *self, + const gchar *job_path) +{ + g_hash_table_remove (self->job_to_remove_status_map, job_path); +} + +/* Request systemd-sysupdate to cancel the given job. It is called when the + * plugin's update job has been cancelled. + * + * Because of the async nature of the application, we can receive job + * cancellation requests from the application after we requested the update jobs + * but before we finished preparing them. To handle job cancellation requests + * correctly, we may need to store them until we are ready. */ +static void +gs_plugin_systemd_sysupdate_cancel_job (GsPluginSystemdSysupdate *self, + GsApp *app, + gboolean interactive) +{ + TargetItem *target = NULL; + const gchar *job_path = NULL; + GHashTableIter iter; + gpointer key; + gpointer value; + g_autoptr(GCancellable) cancellable = NULL; + g_autoptr(GTask) task = NULL; + GTask *update_task = NULL; + GsPluginSystemdSysupdateUpdateTargetData *update_data = NULL; + GDBusCallFlags call_flags = G_DBUS_CALL_FLAGS_NONE; + + target = lookup_target_by_app (self, app); + if (target == NULL) { + g_debug ("Couldn´t cancel the update: no target found"); + return; + } + + /* iterate over the on-going tasks to find the job */ + g_hash_table_iter_init (&iter, self->job_task_map); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GsPluginSystemdSysupdateUpdateTargetData *job_data = g_task_get_task_data (value); + if (job_data != NULL && + g_strcmp0 (job_data->target_path, target->object_path) == 0) { + job_path = key; + update_task = G_TASK (value); + break; + } + } + if (job_path == NULL) { + g_debug ("Couldn´t cancel the update: no job found for target `%s`", target->object_path); + return; + } + + if (g_hash_table_contains (self->job_to_cancel_task_map, job_path)) { + g_debug ("Job already filed for cancellation: %s", job_path); + return; + } + + if (g_hash_table_contains (self->job_to_remove_status_map, job_path)) { + g_debug ("Job already filed for removal: %s", job_path); + return; + } + + cancellable = g_cancellable_new (); + task = g_task_new (self, cancellable, gs_plugin_systemd_sysupdate_cancel_job_cb, NULL); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_cancel_job); + g_task_set_task_data (task, g_strdup (job_path), (GDestroyNotify)g_free); + + if (update_task == NULL) { + g_debug ("Couldn´t cancel task for job `%s`, no task found, storing for later cancellation", job_path); + g_hash_table_insert (self->job_to_cancel_task_map, g_strdup (job_path), g_steal_pointer (&task)); + return; + } + + update_data = g_task_get_task_data (update_task); + + if (update_data->interactive) { + call_flags |= G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION; + } + + gs_systemd_sysupdate_job_call_cancel (update_data->job_proxy, + call_flags, + SYSUPDATED_JOB_CANCEL_TIMEOUT_MS, + cancellable, + gs_plugin_systemd_sysupdate_cancel_job_cancel_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_cancel_job_cancel_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + + if (!gs_systemd_sysupdate_job_call_cancel_finish (GS_SYSTEMD_SYSUPDATE_JOB (source_object), + result, + &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (g_task_return_error_if_cancelled (task)) { + return; + } + + g_task_return_boolean (task, TRUE); +} + +static void +gs_plugin_systemd_sysupdate_cancel_job_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = G_TASK (result); + const gchar *job_path = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + job_path = g_task_get_task_data (task); + g_hash_table_remove (self->job_to_cancel_task_map, job_path); + + if (!g_task_propagate_boolean (task, &local_error)) { + g_debug ("Couldn´t cancel the update: %s", local_error->message); + return; + } + + g_debug ("Cancelled update job `%s` successfully", job_path); +} + +static void +gs_plugin_systemd_sysupdate_cancel_job_revoke (GsPluginSystemdSysupdate *self, + const gchar *job_path) +{ + GTask *task = NULL; + GCancellable *cancellable = NULL; + + task = G_TASK (g_hash_table_lookup (self->job_to_cancel_task_map, job_path)); + if (!task) { + return; + } + + cancellable = g_task_get_cancellable (task); + if (!cancellable) { + return; + } + + g_cancellable_cancel (cancellable); +} + +static void +gs_plugin_systemd_sysupdate_update_target_async (GsPluginSystemdSysupdate *self, + GsApp *app, + const gchar *target_path, + const gchar *target_version, + gboolean interactive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSystemdSysupdateUpdateTargetData *data = NULL; + g_autoptr(GTask) task = NULL; + TargetItem *target = NULL; + GsPlugin *plugin = GS_PLUGIN (self); + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_update_target_async); + + data = gs_plugin_systemd_sysupdate_update_target_data_new (app, + target_path, + interactive); + g_task_set_task_data (task, data, (GDestroyNotify)gs_plugin_systemd_sysupdate_update_target_data_free); + + target = lookup_target_by_app (self, data->app); + if (target == NULL) { + g_task_return_new_error (task, G_IO_ERROR, GS_PLUGIN_ERROR_FAILED, + "cannot find target for app: %s", gs_app_get_name (data->app)); + return; + } + + /* currently two actions `download file` and `deploy changes` + * are bound together as one method in `Target.Update()`. + * This method will trigger the update to start and return + * immediately. Results should be waited and handled within the + * signal `Manager.JobRemoved()` */ + gs_systemd_sysupdate_target_proxy_new (gs_plugin_get_system_bus_connection (plugin), + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.sysupdate1", + target_path, + cancellable, + gs_plugin_systemd_sysupdate_update_target_proxy_new_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_update_target_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + g_autoptr(GsSystemdSysupdateTarget) proxy = NULL; + g_autofree gchar *job_path = NULL; + GsPluginSystemdSysupdateUpdateTargetData *data = NULL; + GDBusCallFlags call_flags = G_DBUS_CALL_FLAGS_NONE; + + proxy = gs_systemd_sysupdate_target_proxy_new_finish (result, &local_error); + if (proxy == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + data = g_task_get_task_data (task); + + if (data->interactive) { + call_flags |= G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION; + } + + gs_systemd_sysupdate_target_call_update (proxy, + "", /* left empty as the latest version */ + SYSUPDATED_TARGET_UPDATE_FLAGS_NONE, + call_flags, + SYSUPDATED_TARGET_UPDATE_TIMEOUT_MS, + NULL, /* Makes the call explicitly non-cancellable so we can get the job path and cancel it correctly. */ + gs_plugin_systemd_sysupdate_update_target_update_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_update_target_update_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + g_autofree gchar *job_path = NULL; + GsPlugin *plugin = GS_PLUGIN (self); + GsPluginSystemdSysupdateUpdateTargetData *data = NULL; + + if (!gs_systemd_sysupdate_target_call_update_finish (GS_SYSTEMD_SYSUPDATE_TARGET (source_object), + NULL, + NULL, + &job_path, + result, + &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + data = g_task_get_task_data (task); + g_set_str (&data->job_path, job_path); + + gs_systemd_sysupdate_job_proxy_new (gs_plugin_get_system_bus_connection (plugin), + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.sysupdate1", + job_path, + NULL, /* Makes the call explicitly non-cancellable so we can get the job path and cancel it correctly. */ + gs_plugin_systemd_sysupdate_update_target_job_proxy_new_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_update_target_job_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + g_autoptr(GsSystemdSysupdateJob) proxy = NULL; + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginSystemdSysupdateUpdateTargetData *data = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + GDBusCallFlags call_flags = G_DBUS_CALL_FLAGS_NONE; + + data = g_task_get_task_data (task); + + proxy = gs_systemd_sysupdate_job_proxy_new_finish (result, &local_error); + if (proxy == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + /* The job's preparation failed, we can't act on it, revoke any + * removal or cancellation request that we filed during its + * preparation. */ + gs_plugin_systemd_sysupdate_remove_job_revoke (self, data->job_path); + gs_plugin_systemd_sysupdate_cancel_job_revoke (self, data->job_path); + return; + } + + g_set_object (&data->job_proxy, proxy); + + g_signal_connect_object (proxy, "notify::progress", + G_CALLBACK (gs_plugin_systemd_sysupdate_update_target_notify_progress_cb), + g_object_ref (task), G_CONNECT_SWAPPED); + + gs_plugin_systemd_sysupdate_update_target_notify_progress_cb (task); + + /* job path to task mapping, easier for the callbacks to use the + * object path to find it's related task */ + g_hash_table_insert (self->job_task_map, + g_strdup (data->job_path), + g_object_ref (task)); + + /* We don't chain up or return here, the task will be terminated when + * systemd-sysupdate notifies us that the job is removed, or by + * cancelling the task. */ + + /* If the update job has been filed for removal during its preparation, + * we need to resume the removal request. This will also revoke any + * cancellation request. */ + if (g_hash_table_contains (self->job_to_remove_status_map, data->job_path)) { + gint32 job_status = GPOINTER_TO_INT (g_hash_table_lookup (self->job_to_remove_status_map, data->job_path)); + gs_plugin_systemd_sysupdate_remove_job_apply (self, task, data->job_path, job_status); + return; + } + + /* If the update job has been filed for cancellation during its + * preparation, we need to resume the cancellation request. */ + if (g_hash_table_contains (self->job_to_cancel_task_map, data->job_path)) { + GTask *cancel_task = g_hash_table_lookup (self->job_to_cancel_task_map, data->job_path); + + if (data->interactive) { + call_flags |= G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION; + } + + gs_systemd_sysupdate_job_call_cancel (data->job_proxy, + call_flags, + SYSUPDATED_JOB_CANCEL_TIMEOUT_MS, + g_task_get_cancellable (cancel_task), + gs_plugin_systemd_sysupdate_cancel_job_cancel_cb, + g_steal_pointer (&cancel_task)); + return; + } + + /* If the task has been cancelled during its preparation, we need to ask + * systemd-sysdupdate to cancel it. */ + if (g_cancellable_is_cancelled (cancellable)) { + gs_plugin_systemd_sysupdate_cancel_job (self, data->app, data->interactive); + } +} + +static void +gs_plugin_systemd_sysupdate_update_target_notify_progress_cb (gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPluginSystemdSysupdateUpdateTargetData *data = g_task_get_task_data (task); + guint progress = gs_systemd_sysupdate_job_get_progress (data->job_proxy); + + gs_app_set_state (data->app, GS_APP_STATE_DOWNLOADING); + gs_app_set_progress (data->app, progress); +} + +static gboolean +gs_plugin_systemd_sysupdate_update_target_finish (GsPluginSystemdSysupdate *self, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +/* Plugin methods */ +static void +gs_plugin_systemd_sysupdate_init (GsPluginSystemdSysupdate *self) +{ + /* Plugin constructor + */ +} + +static void +gs_plugin_systemd_sysupdate_dispose (GObject *object) +{ + GsPluginSystemdSysupdate *self = GS_PLUGIN_SYSTEMD_SYSUPDATE (object); + + g_clear_object (&self->manager_proxy); + + G_OBJECT_CLASS (gs_plugin_systemd_sysupdate_parent_class)->dispose (object); +} + +static void +gs_plugin_systemd_sysupdate_finalize (GObject *object) +{ + GsPluginSystemdSysupdate *self = GS_PLUGIN_SYSTEMD_SYSUPDATE (object); + + g_clear_pointer (&self->os_pretty_name, g_free); + g_clear_pointer (&self->os_version, g_free); + g_clear_pointer (&self->target_item_map, g_hash_table_destroy); + g_clear_pointer (&self->job_task_map, g_hash_table_destroy); + g_clear_pointer (&self->job_to_remove_status_map, g_hash_table_destroy); + g_clear_pointer (&self->job_to_cancel_task_map, g_hash_table_destroy); + self->is_metadata_refresh_ongoing = FALSE; + self->cache_age_secs = 0; + + G_OBJECT_CLASS (gs_plugin_systemd_sysupdate_parent_class)->finalize (object); +} + +static void +gs_plugin_systemd_sysupdate_setup_async (GsPlugin *plugin, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Plugin object init. before runtime operations + */ + g_autoptr(GTask) task = NULL; + g_autoptr(GError) local_error = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_setup_async); + + /* Check that the proxies exist (and are owned; they should auto-start) + * so we can disable the plugin for systems which don’t have + * systemd-sysupdate. */ + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_SETUP); + + g_dbus_connection_call (gs_plugin_get_system_bus_connection (plugin), + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "ListActivatableNames", + NULL, + (const GVariantType *) "(as)", + G_DBUS_CALL_FLAGS_NONE, + FREEDESKTOP_DBUS_LIST_ACTIVATABLE_NAMES_TIMEOUT_MS, + cancellable, + gs_plugin_systemd_sysupdate_setup_list_activatable_names_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_setup_list_activatable_names_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + GsPlugin *plugin = GS_PLUGIN (self); + g_autoptr(GVariant) ret_val = NULL; + g_autofree gchar **activatable_names = NULL; + g_autoptr(GError) local_error = NULL; + + ret_val = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), result, &local_error); + if (ret_val == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_variant_get (ret_val, "(^a&s)", &activatable_names); + if (!g_strv_contains ((const gchar *const *) activatable_names, "org.freedesktop.sysupdate1")) { + g_task_return_new_error_literal (task, GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_PLUGIN_DEPSOLVE_FAILED, + "D-Bus service org.freedesktop.sysupdate1 unavailable"); + return; + } + + gs_systemd_sysupdate_manager_proxy_new (gs_plugin_get_system_bus_connection (plugin), + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION, + "org.freedesktop.sysupdate1", + "/org/freedesktop/sysupdate1", + cancellable, + gs_plugin_systemd_sysupdate_setup_proxy_new_cb, + g_steal_pointer (&task)); +} + +static void +manager_proxy_job_removed_cb (GsPluginSystemdSysupdate *self, + guint64 job_id, + const gchar *job_path, + gint32 job_status, + GsSystemdSysupdateManagerProxy proxy) +{ + gs_plugin_systemd_sysupdate_remove_job (self, job_path, job_status); +} + +static void +gs_plugin_systemd_sysupdate_setup_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + g_autoptr(GsOsRelease) os_release = NULL; + const gchar *os_pretty_name = NULL; + const gchar *os_version = NULL; + + self->manager_proxy = gs_systemd_sysupdate_manager_proxy_new_finish (result, &local_error); + if (self->manager_proxy == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* read os-release */ + os_release = gs_os_release_new (&local_error); + if (local_error) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + os_pretty_name = gs_os_release_get_pretty_name (os_release); + if (os_pretty_name == NULL) { + os_pretty_name = "unknown"; + } + + os_version = gs_os_release_get_version (os_release); + if (os_version == NULL) { + os_version = "unknown"; + } + + /* `systemd-sysupdated` signal subscription */ + g_signal_connect_object (self->manager_proxy, + "job-removed", + G_CALLBACK (manager_proxy_job_removed_cb), + self, + G_CONNECT_SWAPPED); + + /* plugin object attributes init. */ + self->os_pretty_name = g_strdup (os_pretty_name); + self->os_version = g_strdup (os_version); + self->target_item_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)target_item_free); + self->job_task_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)NULL); + self->job_to_remove_status_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)NULL); + self->job_to_cancel_task_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)NULL); + self->cache_age_secs = 0; + + /* on success */ + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_systemd_sysupdate_setup_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_systemd_sysupdate_refine_async (GsPlugin *plugin, + GsAppList *list, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSystemdSysupdateRefineData *data = NULL; + g_autoptr(GTask) task = NULL; + g_autoptr(GQueue) queue = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_refine_async); + + /* put apps to be refined in queue */ + queue = g_queue_new (); + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) + continue; + + gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING); + + g_queue_push_tail (queue, g_object_ref (app)); + } + + /* put apps in queue to task data */ + data = gs_plugin_systemd_sysupdate_refine_data_new (g_steal_pointer (&queue), flags); + g_task_set_task_data (task, data, (GDestroyNotify)gs_plugin_systemd_sysupdate_refine_data_free); + + /* invoke the first target */ + gs_plugin_systemd_sysupdate_refine_iter (NULL, NULL, g_steal_pointer (&task)); +} + +/* Iterate over the elements of the queue one-by-one. + */ +static void +gs_plugin_systemd_sysupdate_refine_iter (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginSystemdSysupdateRefineData *data = g_task_get_task_data (task); + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + g_autoptr (GsApp) app = NULL; + + if (result != NULL && + !gs_plugin_systemd_sysupdate_refine_app_finish (GS_PLUGIN (self), result, &local_error)) { + g_debug ("Failed to refine app: %s", local_error->message); + g_clear_error (&local_error); + } + + app = g_queue_pop_head (data->queue); + if (app == NULL) { + /* We reached the end of the queue. */ + g_task_return_boolean (task, TRUE); + return; + } + + if (g_task_return_error_if_cancelled (task)) { + g_debug ("%s: Cancelled", G_STRFUNC); + return; + } + + gs_plugin_systemd_sysupdate_refine_app_async (GS_PLUGIN (self), + app, + data->flags, + cancellable, + gs_plugin_systemd_sysupdate_refine_iter, + g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_systemd_sysupdate_refine_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_systemd_sysupdate_refine_app_async (GsPlugin *plugin, + GsApp *app, + GsPluginRefineFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginSystemdSysupdateRefineAppData *data = NULL; + GsPluginSystemdSysupdate *self = GS_PLUGIN_SYSTEMD_SYSUPDATE (plugin); + g_autoptr(GTask) task = NULL; + TargetItem *target = NULL; + const gchar *target_path = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_refine_app_async); + + data = gs_plugin_systemd_sysupdate_refine_app_data_new (app); + g_task_set_task_data (task, data, (GDestroyNotify) gs_plugin_systemd_sysupdate_refine_app_data_free); + + target = lookup_target_by_app (self, data->app); + if (target == NULL) { + g_task_return_new_error (task, G_IO_ERROR, GS_PLUGIN_ERROR_FAILED, + "cannot find target for app: %s", gs_app_get_name (data->app)); + return; + } + + target_path = target->object_path; + + gs_systemd_sysupdate_target_proxy_new (gs_plugin_get_system_bus_connection (plugin), + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.sysupdate1", + target_path, + cancellable, + gs_plugin_systemd_sysupdate_refine_app_proxy_new_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_refine_app_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + g_autofree gchar *job_path = NULL; + g_autoptr(GsSystemdSysupdateTarget) proxy = NULL; + GsPluginSystemdSysupdateRefineAppData *data = g_task_get_task_data (task); + TargetItem *target = NULL; + const gchar *version = NULL; + + proxy = gs_systemd_sysupdate_target_proxy_new_finish (result, &local_error); + if (proxy == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + target = lookup_target_by_app (self, data->app); + if (target == NULL) { + g_task_return_new_error (task, G_IO_ERROR, GS_PLUGIN_ERROR_FAILED, + "cannot find target for app: %s", gs_app_get_name (data->app)); + return; + } + + version = target->latest_version != NULL ? target->latest_version + : target->current_version; + + gs_plugin_status_update (GS_PLUGIN (self), data->app, GS_PLUGIN_STATUS_QUERYING); + + /* if the version is not available, it will result an error + * later in the callback */ + gs_systemd_sysupdate_target_call_describe (proxy, + version, + SYSUPDATED_TARGET_DESCRIBE_FLAGS_NONE, + G_DBUS_CALL_FLAGS_NONE, + SYSUPDATED_TARGET_DESCRIBE_TIMEOUT_MS, + cancellable, + gs_plugin_systemd_sysupdate_refine_app_describe_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_refine_app_describe_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + g_autofree gchar *json = NULL; + GsPluginSystemdSysupdateRefineAppData *data = g_task_get_task_data (task); + + /* `systemd-sysupdated` also returns error when the given + * version is not available (case both no version installed and + * no available version in the server). we ignore the error here + * and always move on to the next target */ + if (!gs_systemd_sysupdate_target_call_describe_finish (GS_SYSTEMD_SYSUPDATE_TARGET (source_object), + &json, + result, + &local_error)) { + g_debug ("Describe target error ignored, error = `%s`", local_error->message); + } + + gs_plugin_status_update (GS_PLUGIN (self), data->app, GS_PLUGIN_STATUS_FINISHED); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_systemd_sysupdate_refine_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_systemd_sysupdate_list_apps_async (GsPlugin *plugin, + GsAppQuery *query, + GsPluginListAppsFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Return managed apps filtered by the given query + */ + GsPluginSystemdSysupdate *self = GS_PLUGIN_SYSTEMD_SYSUPDATE (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GsAppList) list = gs_app_list_new (); + GsAppQueryTristate is_installed = GS_APP_QUERY_TRISTATE_UNSET; + GsAppQueryTristate is_for_update = GS_APP_QUERY_TRISTATE_UNSET; + const gchar * const *keywords = NULL; + GHashTableIter iter; + gpointer key; + gpointer value; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_list_apps_async); + + /* here we report the system updates as individual apps, so user + * can easily search and update a specific target */ + + if (query != NULL) { + is_installed = gs_app_query_get_is_installed (query); + is_for_update = gs_app_query_get_is_for_update (query); + keywords = gs_app_query_get_keywords (query); + } + + /* currently only support a subset of query properties, and only + * one set at once */ + if ((is_installed == GS_APP_QUERY_TRISTATE_UNSET && + is_for_update == GS_APP_QUERY_TRISTATE_UNSET && + keywords == NULL) || + gs_app_query_get_n_properties_set (query) != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported query"); + return; + } + + /* iterate over our targets, after `refresh_metadata()` we + * should have target and its corresponding app created and + * stored in the per-plugin cache */ + g_hash_table_iter_init (&iter, self->target_item_map); + while (g_hash_table_iter_next (&iter, &key, &value)) { + TargetItem *target = (TargetItem *)value; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) local_error = NULL; + + /* get or create app for the target */ + app = get_or_create_app_for_target (self, target, &local_error); + if (app == NULL) { + g_debug ("Couldn't list app for target %s: %s", target_item_get_id (target), local_error->message); + continue; + } + + if (keywords != NULL && !target_item_matches_keywords (target, keywords)) { + continue; + } + + /* We support updating installed targets only. */ + if (is_for_update == GS_APP_QUERY_TRISTATE_TRUE && !target_item_is_updatable (target)) { + continue; + } + + + if ((is_installed == GS_APP_QUERY_TRISTATE_TRUE && !target_item_is_installed (target)) || + (is_installed == GS_APP_QUERY_TRISTATE_FALSE && target_item_is_installed (target))) { + continue; + } + + gs_app_list_add (list, app); + } + + g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref); +} + +static GsAppList * +gs_plugin_systemd_sysupdate_list_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +gs_plugin_systemd_sysupdate_refresh_metadata_async (GsPlugin *plugin, + guint64 cache_age_secs, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Periodically update the targets saved + */ + GsPluginSystemdSysupdate *self = GS_PLUGIN_SYSTEMD_SYSUPDATE (plugin); + g_autoptr(GTask) task = NULL; + GsPluginSystemdSysupdateRefreshMetadataData *data = NULL; + g_autoptr(GQueue) queue = NULL; + GDBusCallFlags call_flags = G_DBUS_CALL_FLAGS_NONE; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_refresh_metadata_async); + + queue = g_queue_new (); + + /* put apps in queue to task data */ + data = gs_plugin_systemd_sysupdate_refresh_metadata_data_new (g_steal_pointer (&queue), + flags); + g_task_set_task_data (task, data, (GDestroyNotify)gs_plugin_systemd_sysupdate_refresh_metadata_data_free); + + if (self->is_metadata_refresh_ongoing) { + g_task_return_boolean (task, TRUE); + return; + } + + self->is_metadata_refresh_ongoing = TRUE; /* update immediately to block continuous refreshes */ + self->cache_age_secs = cache_age_secs; + + if (data->flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE) { + call_flags |= G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION; + } + + gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_QUERYING); + + /* here we ask `systemd-sysupdated` to list all available + * targets and enumerate the targets reported in the callback. */ + gs_systemd_sysupdate_manager_call_list_targets (self->manager_proxy, + call_flags, + SYSUPDATED_MANAGER_LIST_TARGET_TIMEOUT_MS, + cancellable, + gs_plugin_systemd_sysupdate_refresh_metadata_list_targets_cb, + g_steal_pointer (&task)); +} + +static gboolean +check_to_be_removed (gpointer key, gpointer value, gpointer user_data) +{ + TargetItem *target = (TargetItem *) value; + return !target->is_valid; +} + +static void +gs_plugin_systemd_sysupdate_refresh_metadata_list_targets_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginSystemdSysupdateRefreshMetadataData *data = NULL; + TargetItem *target = NULL; + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + g_autoptr(GVariant) ret_targets = NULL; + g_autoptr(GVariantIter) variant_iter = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + const gchar *class = NULL; + const gchar *name = NULL; + const gchar *object_path = NULL; + GHashTableIter iter; + gpointer key; + gpointer value; + + if (!gs_systemd_sysupdate_manager_call_list_targets_finish (GS_SYSTEMD_SYSUPDATE_MANAGER (source_object), + &ret_targets, + result, + &local_error)) { + self->is_metadata_refresh_ongoing = FALSE; + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + data = g_task_get_task_data (task); + + /* mark all targets saved as invalid to detect removals */ + g_hash_table_iter_init (&iter, self->target_item_map); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + target = (TargetItem *)value; + target->is_valid = FALSE; + } + + /* iterate over targets and save to the target hashmap */ + g_variant_get (ret_targets, "a(sso)", &variant_iter); + while (g_variant_iter_loop (variant_iter, "(&s&s&o)", &class, &name, &object_path)) { + g_hash_table_insert (self->target_item_map, + (gpointer) g_strdup (name), + (gpointer) target_item_new (class, name, object_path)); /* overwrite value */ + } + + /* remove targets no-longer exist and their apps */ + g_hash_table_iter_init (&iter, self->target_item_map); + while (g_hash_table_iter_next (&iter, &key, &value)) { + if (check_to_be_removed (key, value, NULL)) { + gs_plugin_cache_remove (GS_PLUGIN (self), key); + } + } + g_hash_table_foreach_remove (self->target_item_map, (GHRFunc) check_to_be_removed, NULL); + + /* push all targets to queue. Make 'host' the first target if it + * exists, so other targets can point to it if it needs to */ + g_hash_table_iter_init (&iter, self->target_item_map); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + target = (TargetItem *)value; + if (g_strcmp0 (target->class, "host") == 0) { + g_queue_push_head (data->queue, value); + } else { + g_queue_push_tail (data->queue, value); + } + } + + /* invoke the first target */ + gs_plugin_systemd_sysupdate_refresh_metadata_iter (NULL, NULL, g_steal_pointer (&task)); +} + +/* Iterate over the elements of the queue one-by-one. + */ +static void +gs_plugin_systemd_sysupdate_refresh_metadata_iter (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginSystemdSysupdateRefreshMetadataData *data = g_task_get_task_data (task); + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + g_autoptr(GError) local_error = NULL; + TargetItem *target; + + if (result != NULL && + !gs_plugin_systemd_sysupdate_target_refresh_metadata_finish (GS_PLUGIN (self), result, &local_error)) { + g_debug ("Failed to refresh metadata: %s", local_error->message); + g_clear_error (&local_error); + } + + target = g_queue_pop_head (data->queue); + if (target == NULL) { + self->is_metadata_refresh_ongoing = FALSE; + /* We reached the end of the queue. */ + g_task_return_boolean (task, TRUE); + return; + } + + if (g_task_return_error_if_cancelled (task)) { + self->is_metadata_refresh_ongoing = FALSE; + g_debug ("%s: Cancelled", G_STRFUNC); + return; + } + + gs_plugin_systemd_sysupdate_target_refresh_metadata_async (GS_PLUGIN (self), + target, + data->flags, + cancellable, + gs_plugin_systemd_sysupdate_refresh_metadata_iter, + g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_systemd_sysupdate_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_async (GsPlugin *plugin, + TargetItem *target, + GsPluginRefreshMetadataFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Periodically update the targets saved + */ + g_autoptr(GTask) task = NULL; + GsPluginSystemdSysupdateTargetRefreshMetadataData *data = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_target_refresh_metadata_async); + + /* put apps in queue to task data */ + data = gs_plugin_systemd_sysupdate_target_refresh_metadata_data_new (target, flags); + g_task_set_task_data (task, data, (GDestroyNotify)gs_plugin_systemd_sysupdate_target_refresh_metadata_data_free); + + gs_systemd_sysupdate_target_proxy_new (gs_plugin_get_system_bus_connection (plugin), + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.sysupdate1", + data->target->object_path, + cancellable, + gs_plugin_systemd_sysupdate_target_refresh_metadata_proxy_new_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_proxy_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginSystemdSysupdateTargetRefreshMetadataData *data = NULL; + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + g_autoptr(GsSystemdSysupdateTarget) proxy = NULL; + GCancellable *cancellable = g_task_get_cancellable (task); + GDBusCallFlags call_flags = G_DBUS_CALL_FLAGS_NONE; + + proxy = gs_systemd_sysupdate_target_proxy_new_finish (result, &local_error); + if (proxy == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + data = g_task_get_task_data (task); + g_set_object (&data->target->proxy, proxy); + + if (data->flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE) { + call_flags |= G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION; + } + + gs_systemd_sysupdate_target_call_get_app_stream (data->target->proxy, + call_flags, + SYSUPDATED_TARGET_GET_APP_STREAM_TIMEOUT_MS, + cancellable, + gs_plugin_systemd_sysupdate_target_refresh_metadata_get_app_stream_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_get_app_stream_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + g_auto(GStrv) appstream_urls = NULL; + GsPluginSystemdSysupdateTargetRefreshMetadataData *data = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + GsPlugin *plugin = GS_PLUGIN (self); + GCancellable *cancellable = g_task_get_cancellable (task); + const gchar *cache_kind = NULL; + + if (!gs_systemd_sysupdate_target_call_get_app_stream_finish (GS_SYSTEMD_SYSUPDATE_TARGET (source_object), + &appstream_urls, + result, + &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + data = g_task_get_task_data (task); + + cache_kind = target_item_get_xml_cache_kind (data->target, plugin, &local_error); + if (cache_kind == NULL) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + gs_external_appstream_refresh_async (cache_kind, + appstream_urls, + self->cache_age_secs, + NULL, + NULL, + cancellable, + gs_plugin_systemd_sysupdate_target_refresh_metadata_external_appstream_refresh_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_external_appstream_refresh_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + GCancellable *cancellable = g_task_get_cancellable (task); + GsPluginSystemdSysupdateTargetRefreshMetadataData *data = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + GsPlugin *plugin = GS_PLUGIN (self); + g_auto(GStrv) appstream_paths = NULL; + XbSilo *silo; + GDBusCallFlags call_flags = G_DBUS_CALL_FLAGS_NONE; + + /* FIXME Should return which files were updated and which weren't so we can know which ones to reload. */ + if (!gs_external_appstream_refresh_finish (result, &appstream_paths, &local_error)) { + /* Intentionally ignore errors to avoid blocking host updates + * just because metadata failed to be updated. */ + g_debug ("Failed to refresh appstream: %s", local_error->message); + g_clear_error (&local_error); + } + + /* TODO Clear unused cached XML files for this target. */ + + data = g_task_get_task_data (task); + + silo = target_item_ensure_silo_for_appstream_paths (data->target, plugin, appstream_paths, cancellable, &local_error); + if (silo == NULL) { + /* We don't want to block updates for the host target because we + * couldn't get appstream metadata as this is how fixes to the + * update process are delivered. */ + if (g_strcmp0 (data->target->class, "host") == 0) { + g_debug ("Failed to get the XML blob for host target: %s", local_error->message); + g_clear_error (&local_error); + } else { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + } + + if (data->flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE) { + call_flags |= G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION; + } + + gs_systemd_sysupdate_target_call_get_version (data->target->proxy, + call_flags, + SYSUPDATED_TARGET_GET_VERSION_TIMEOUT_MS, + cancellable, + gs_plugin_systemd_sysupdate_target_refresh_metadata_get_version_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_get_version_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginSystemdSysupdateTargetRefreshMetadataData *data = NULL; + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + g_autofree gchar *current_version = NULL; + GCancellable *cancellable = g_task_get_cancellable (task); + GDBusCallFlags call_flags = G_DBUS_CALL_FLAGS_NONE; + + if (!gs_systemd_sysupdate_target_call_get_version_finish (GS_SYSTEMD_SYSUPDATE_TARGET (source_object), + ¤t_version, + result, + &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + data = g_task_get_task_data (task); + + /* Ensure version strings are NULL rather than empty. */ + g_clear_pointer (&data->target->current_version, g_free); + if (current_version != NULL && *current_version != '\0') { + data->target->current_version = g_steal_pointer (¤t_version); + } + + if (data->flags & GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE) { + call_flags |= G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION; + } + + /* move on to check new version */ + gs_systemd_sysupdate_target_call_check_new (data->target->proxy, + call_flags, + SYSUPDATED_TARGET_CHECK_NEW_TIMEOUT_MS, + cancellable, + gs_plugin_systemd_sysupdate_target_refresh_metadata_check_new_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_target_refresh_metadata_check_new_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsPluginSystemdSysupdateTargetRefreshMetadataData *data = NULL; + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + g_autoptr(GsApp) app = NULL; + g_autofree gchar *latest_version = NULL; + + /* currently, the returned result contains only one string + * representing the latest version found in the server. However, + * it can possibly be an empty string representing no newer + * version available */ + if (!gs_systemd_sysupdate_target_call_check_new_finish (GS_SYSTEMD_SYSUPDATE_TARGET (source_object), + &latest_version, + result, + &local_error)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + data = g_task_get_task_data (task); + + /* Ensure version strings are NULL rather than empty. */ + g_clear_pointer (&data->target->latest_version, g_free); + if (latest_version != NULL && *latest_version != '\0') { + data->target->latest_version = g_steal_pointer (&latest_version); + } + + /* update app state base on the target's new version */ + app = get_or_create_app_for_target (self, data->target, &local_error); + if (app == NULL) { + g_debug ("Couldn't refresh app for target %s: %s", target_item_get_id (data->target), local_error->message); + g_clear_error (&local_error); + } else { + update_app_for_target (self, app, data->target); + } + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_systemd_sysupdate_target_refresh_metadata_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_systemd_sysupdate_update_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginUpdateAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Install the given system updates + */ + GsPluginSystemdSysupdateUpdateAppsData *data = NULL; + GsPluginSystemdSysupdate *self = GS_PLUGIN_SYSTEMD_SYSUPDATE (plugin); + g_autoptr(GTask) task = NULL; + g_autoptr(GQueue) queue = NULL; + + /* TODO Report progress */ + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_update_apps_async); + + /* It's forbidden to mix these flags, but let's check just in case. */ + if (flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD && + flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY) { + g_task_return_boolean (task, TRUE); + return; + } + + /* The download and apply steps are merged into a single operation in + * systemd-sysupdate, meaning we can't download the update without + * downloading and vice versa. In the meantime, let's do as the + * eos-updater plugin by completing the task successfully on + * NO_DOWNLOAD and by ignoring NO_APPLY. */ + /* TODO Split the download and apply steps once systemd-sysupdate allows + * it: https://github.com/systemd/systemd/issues/34814 */ + if (flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD) { + g_task_return_boolean (task, TRUE); + return; + } + + queue = g_queue_new (); + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + continue; + } + + /* only update the app if it is source available */ + if (gs_app_get_state (app) != GS_APP_STATE_AVAILABLE && + gs_app_get_state (app) != GS_APP_STATE_AVAILABLE_LOCAL && + gs_app_get_state (app) != GS_APP_STATE_UPDATABLE && + gs_app_get_state (app) != GS_APP_STATE_UPDATABLE_LIVE && + gs_app_get_state (app) != GS_APP_STATE_QUEUED_FOR_INSTALL) { + continue; + } + + gs_plugin_status_update (GS_PLUGIN (self), app, GS_PLUGIN_STATUS_WAITING); + + g_queue_push_head (queue, g_object_ref (app)); + } + + /* put apps in queue to task data */ + data = gs_plugin_systemd_sysupdate_update_apps_data_new (g_steal_pointer (&queue), + progress_callback, + progress_user_data, + app_needs_user_action_callback, + app_needs_user_action_data, + cancellable, + flags); + g_task_set_task_data (task, data, (GDestroyNotify)gs_plugin_systemd_sysupdate_update_apps_data_free); + + gs_plugin_systemd_sysupdate_update_apps_iter (NULL, NULL, g_steal_pointer (&task)); +} + +/* Iterate over the elements of the queue one-by-one. + * + * While the typical use case is to have only a single update target, there + * could be multiple ones, so this could be improved in the future by applying + * the updates in parallel. + */ +static void +gs_plugin_systemd_sysupdate_update_apps_iter (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginSystemdSysupdateUpdateAppsData *data = g_task_get_task_data (task); + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + g_autoptr (GsApp) app = NULL; + + if (result != NULL && + !gs_plugin_systemd_sysupdate_update_app_finish (GS_PLUGIN (self), result, &local_error)) { + g_debug ("Failed to update app: %s", local_error->message); + g_clear_error (&local_error); + } + + app = g_queue_pop_head (data->queue); + if (app == NULL) { + /* We reached the end of the queue. */ + g_task_return_boolean (task, TRUE); + return; + } + + if (g_task_return_error_if_cancelled (task)) { + g_debug ("%s: Cancelled", G_STRFUNC); + return; + } + + gs_plugin_systemd_sysupdate_update_app_async (GS_PLUGIN (self), + app, + data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE, + data->progress_callback, + data->progress_user_data, + data->app_needs_user_action_callback, + data->app_needs_user_action_data, + data->cancellable, + gs_plugin_systemd_sysupdate_update_apps_iter, + g_steal_pointer (&task)); +} + +static gboolean +gs_plugin_systemd_sysupdate_update_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +update_app_cancelled_cb (GCancellable *cancellable, + gpointer user_data) +{ + GTask *task = G_TASK (user_data); + GsPluginSystemdSysupdate *self = NULL; + GsPluginSystemdSysupdateUpdateAppData *data = NULL; + + if (!g_cancellable_is_cancelled (cancellable)) { + return; + } + + self = g_task_get_source_object (task); + data = g_task_get_task_data (task); + gs_plugin_systemd_sysupdate_cancel_job (self, data->app, data->interactive); +} + +static void +gs_plugin_systemd_sysupdate_update_app_async (GsPlugin *plugin, + GsApp *app, + gboolean interactive, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Install the given system updates + */ + GsPluginSystemdSysupdateUpdateAppData *data = NULL; + GsPluginSystemdSysupdate *self = GS_PLUGIN_SYSTEMD_SYSUPDATE (plugin); + g_autoptr(GTask) task = NULL; + gulong cancelled_id = 0; + + /* TODO Report progress */ + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_update_apps_async); + + gs_plugin_status_update (GS_PLUGIN (self), app, GS_PLUGIN_STATUS_WAITING); + + /* connect to cancellation signal */ + if (cancellable != NULL) { + cancelled_id = g_cancellable_connect (cancellable, + G_CALLBACK (update_app_cancelled_cb), + (gpointer)task, + (GDestroyNotify)NULL); + } + + data = gs_plugin_systemd_sysupdate_update_app_data_new (app, + cancellable, + cancelled_id, + interactive); + g_task_set_task_data (task, data, (GDestroyNotify) gs_plugin_systemd_sysupdate_update_app_data_free); + + if (!interactive) { + gs_metered_block_on_download_scheduler_async (gs_metered_build_scheduler_parameters_for_app (data->app), + cancellable, + gs_plugin_systemd_sysupdate_update_app_download_scheduler_cb, + g_steal_pointer (&task)); + } else { + gs_plugin_systemd_sysupdate_update_app_download_scheduler_cb (NULL, NULL, g_steal_pointer (&task)); + } +} + +static void +gs_plugin_systemd_sysupdate_update_app_download_scheduler_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginSystemdSysupdateUpdateAppData *data = g_task_get_task_data (task); + g_autoptr(GError) local_error = NULL; + TargetItem *target = NULL; + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + + if (result != NULL && + !gs_metered_block_on_download_scheduler_finish (result, &data->schedule_entry_handle, &local_error)) { + g_warning ("Failed to block on download scheduler: %s", + local_error->message); + g_clear_error (&local_error); + } + + /* find the target associated to the app */ + target = lookup_target_by_app (self, data->app); + if (target == NULL) { + gs_plugin_systemd_sysupdate_update_app_data_remove_from_download_scheduler (data); + g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, + "Can´t find target for app: %s", gs_app_get_name (data->app)); + return; + } + + gs_plugin_status_update (GS_PLUGIN (self), data->app, GS_PLUGIN_STATUS_DOWNLOADING); + + /* update the 'target' to specific version */ + gs_plugin_systemd_sysupdate_update_target_async (self, + data->app, + target->object_path, + gs_app_get_version (data->app), + data->interactive, + cancellable, + gs_plugin_systemd_sysupdate_update_app_update_target_cb, + g_steal_pointer (&task)); +} + +static void +gs_plugin_systemd_sysupdate_update_app_update_target_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + g_autoptr(GError) local_error = NULL; + GsPluginSystemdSysupdateUpdateAppData *data = g_task_get_task_data (task); + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + + if (!gs_plugin_systemd_sysupdate_update_target_finish (self, result, &local_error)) { + gs_plugin_systemd_sysupdate_update_app_data_remove_from_download_scheduler (data); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + if (data->schedule_entry_handle != NULL) { + gs_metered_remove_from_download_scheduler_async (data->schedule_entry_handle, + cancellable, + gs_plugin_systemd_sysupdate_update_app_remove_from_download_scheduler_cb, + g_steal_pointer (&task)); + } else { + gs_plugin_systemd_sysupdate_update_app_remove_from_download_scheduler_cb (NULL, NULL, g_steal_pointer (&task)); + } +} + +static void +gs_plugin_systemd_sysupdate_update_app_remove_from_download_scheduler_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = g_steal_pointer (&user_data); + GsPluginSystemdSysupdateUpdateAppData *data = g_task_get_task_data (task); + GsPluginSystemdSysupdate *self = g_task_get_source_object (task); + g_autoptr(GError) local_error = NULL; + + if (result != NULL && + !gs_metered_remove_from_download_scheduler_finish (g_steal_pointer (&data->schedule_entry_handle), result, &local_error)) { + g_warning ("Failed to remove from download scheduler: %s", + local_error->message); + g_clear_error (&local_error); + } + + gs_plugin_status_update (GS_PLUGIN (self), data->app, GS_PLUGIN_STATUS_FINISHED); + + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_systemd_sysupdate_update_app_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + GsPluginSystemdSysupdateUpdateAppData *data = NULL; + GTask *task = G_TASK (result); + GCancellable *cancellable = g_task_get_cancellable (task); + + data = g_task_get_task_data (task); + + /* disconnect cancellation signal */ + if (data != NULL) { + g_cancellable_disconnect (cancellable, data->cancelled_id); + data->cancelled_id = 0; + } + + return g_task_propagate_boolean (g_steal_pointer (&task), error); +} + +static void +gs_plugin_systemd_sysupdate_install_apps_async (GsPlugin *plugin, + GsAppList *apps, + GsPluginInstallAppsFlags flags, + GsPluginProgressCallback progress_callback, + gpointer progress_user_data, + GsPluginAppNeedsUserActionCallback app_needs_user_action_callback, + gpointer app_needs_user_action_data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GsPluginUpdateAppsFlags update_flags = GS_PLUGIN_UPDATE_APPS_FLAGS_NONE; + + if (flags & GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE) + update_flags |= GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE; + if (flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_DOWNLOAD) + update_flags |= GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD; + if (flags & GS_PLUGIN_INSTALL_APPS_FLAGS_NO_APPLY) + update_flags |= GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY; + + gs_plugin_systemd_sysupdate_update_apps_async (plugin, + apps, + update_flags, + progress_callback, + progress_user_data, + app_needs_user_action_callback, + app_needs_user_action_data, + cancellable, + callback, + user_data); +} + +static gboolean +gs_plugin_systemd_sysupdate_install_apps_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_systemd_sysupdate_download_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginDownloadUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Flag specific distro upgrade as downloadable and installable + */ + g_autoptr(GTask) task = NULL; + + task = g_task_new (plugin, cancellable, callback, user_data); + g_task_set_source_tag (task, gs_plugin_systemd_sysupdate_download_upgrade_async); + + /* only process this app if was created by this plugin */ + if (!gs_app_has_management_plugin (app, plugin)) { + g_task_return_boolean (task, TRUE); + return; + } + + /* only update the app if it is source available */ + if (gs_app_get_state (app) != GS_APP_STATE_AVAILABLE && + gs_app_get_state (app) != GS_APP_STATE_AVAILABLE_LOCAL) { + g_task_return_boolean (task, TRUE); + return; + } + + gs_app_set_state (app, GS_APP_STATE_UPDATABLE); + g_task_return_boolean (task, TRUE); +} + +static gboolean +gs_plugin_systemd_sysupdate_download_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +gs_plugin_systemd_sysupdate_trigger_upgrade_async (GsPlugin *plugin, + GsApp *app, + GsPluginTriggerUpgradeFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Download and install specific distro upgrade + */ + g_autoptr(GsAppList) apps = NULL; + + apps = gs_app_list_new (); + gs_app_list_add (apps, app); + + gs_plugin_systemd_sysupdate_update_apps_async (plugin, apps, + GS_PLUGIN_UPDATE_APPS_FLAGS_NONE, + NULL, NULL, + NULL, NULL, + cancellable, + callback, user_data); +} + +static gboolean +gs_plugin_systemd_sysupdate_trigger_upgrade_finish (GsPlugin *plugin, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, + GsApp *app) +{ + /* Adopt app originally discovered by other plugins + */ + +#if AS_CHECK_VERSION(1, 0, 4) + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_SYSUPDATE) { + gs_app_set_management_plugin (app, plugin); + } +#endif +} + +static void +gs_plugin_systemd_sysupdate_class_init (GsPluginSystemdSysupdateClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass); + + object_class->dispose = gs_plugin_systemd_sysupdate_dispose; + object_class->finalize = gs_plugin_systemd_sysupdate_finalize; + + plugin_class->setup_async = gs_plugin_systemd_sysupdate_setup_async; + plugin_class->setup_finish = gs_plugin_systemd_sysupdate_setup_finish; + plugin_class->refine_async = gs_plugin_systemd_sysupdate_refine_async; + plugin_class->refine_finish = gs_plugin_systemd_sysupdate_refine_finish; + plugin_class->list_apps_async = gs_plugin_systemd_sysupdate_list_apps_async; + plugin_class->list_apps_finish = gs_plugin_systemd_sysupdate_list_apps_finish; + plugin_class->refresh_metadata_async = gs_plugin_systemd_sysupdate_refresh_metadata_async; + plugin_class->refresh_metadata_finish = gs_plugin_systemd_sysupdate_refresh_metadata_finish; + plugin_class->update_apps_async = gs_plugin_systemd_sysupdate_update_apps_async; + plugin_class->update_apps_finish = gs_plugin_systemd_sysupdate_update_apps_finish; + plugin_class->install_apps_async = gs_plugin_systemd_sysupdate_install_apps_async; + plugin_class->install_apps_finish = gs_plugin_systemd_sysupdate_install_apps_finish; + plugin_class->download_upgrade_async = gs_plugin_systemd_sysupdate_download_upgrade_async; + plugin_class->download_upgrade_finish = gs_plugin_systemd_sysupdate_download_upgrade_finish; + plugin_class->trigger_upgrade_async = gs_plugin_systemd_sysupdate_trigger_upgrade_async; + plugin_class->trigger_upgrade_finish = gs_plugin_systemd_sysupdate_trigger_upgrade_finish; +} + +GType +gs_plugin_query_type (void) +{ + return GS_TYPE_PLUGIN_SYSTEMD_SYSUPDATE; +} + diff --git a/plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.h b/plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.h new file mode 100644 index 0000000..fe61bac --- /dev/null +++ b/plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.h @@ -0,0 +1,21 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (c) 2024 Codethink Limited + * Copyright (c) 2024 GNOME Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PLUGIN_SYSTEMD_SYSUPDATE (gs_plugin_systemd_sysupdate_get_type()) + +G_DECLARE_FINAL_TYPE (GsPluginSystemdSysupdate, gs_plugin_systemd_sysupdate, GS, PLUGIN_SYSTEMD_SYSUPDATE, GsPlugin) + +G_END_DECLS diff --git a/plugins/systemd-sysupdate/gs-self-test.c b/plugins/systemd-sysupdate/gs-self-test.c new file mode 100644 index 0000000..334664b --- /dev/null +++ b/plugins/systemd-sysupdate/gs-self-test.c @@ -0,0 +1,1763 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (c) 2024 Codethink Limited + * Copyright (c) 2024 GNOME Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include +#include + +#include "gnome-software-private.h" +#include "gs-test.h" + +#include "config.h" +#include "gs-systemd-sysupdated-generated.h" + +/* + * Here we do the integration test, which means we validate the + * results indirectly from plugin-loader's point of view without + * touching the plugin (code under test). + */ + +/* While g_auto(GMutex) and g_auto(GCond) are available, we can't use them as + * our mutexes and conds are in variables. This works around that limitation by + * allowing us to automate initializing and clearing any GMutex and GCond. */ + +/** + * GsMutexGuard: + * + * Helps ensuring a #GMutex is usable during a given scope thanks to autocleanup + * functions. + */ +typedef void GsMutexGuard; + +static inline GsMutexGuard * +gs_mutex_guard_new (GMutex *mutex) +{ + g_mutex_init (mutex); + return (GsMutexGuard *) mutex; +} + +static inline void +gs_mutex_guard_free (GsMutexGuard *guard) +{ + g_mutex_clear ((GMutex *) guard); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsMutexGuard, gs_mutex_guard_free) + +#define GS_MUTEX_AUTO_GUARD(mutex, var) \ + g_autoptr (GsMutexGuard) G_GNUC_UNUSED var = gs_mutex_guard_new (mutex) + +/** + * GsCondGuard: + * + * Helps ensuring a #GCond is usable during a given scope thanks to autocleanup + * functions. + */ +typedef void GsCondGuard; + +static inline GsCondGuard * +gs_cond_guard_new (GCond *cond) +{ + g_cond_init (cond); + return (GsCondGuard *) cond; +} + +static inline void +gs_cond_guard_free (GsCondGuard *guard) +{ + g_cond_clear ((GCond *) guard); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsCondGuard, gs_cond_guard_free) + +#define GS_COND_AUTO_GUARD(cond, var) \ + g_autoptr (GsCondGuard) G_GNUC_UNUSED var = gs_cond_guard_new (cond) + +/** + * GsMonitor: + * + * A mutex and a cond paired together as the monitor synchronization pattern. + */ +typedef struct { + GMutex lock; + GCond cond; +} GsMonitor; + +/** + * GsThreadedRunner: + * + * Runs a #GMainContext in a dedicated thread with its own main loop. + */ +typedef struct { + GMainContext *context; + GMainLoop *loop; + GThread *thread; +} GsThreadedRunner; + +static gpointer +gs_threaded_runner_thread_cb (GsThreadedRunner *threaded_runner) +{ + g_main_context_push_thread_default (threaded_runner->context); + { + g_main_loop_run (threaded_runner->loop); + } + g_main_context_pop_thread_default (threaded_runner->context); + return NULL; +} + +static void +gs_threaded_runner_init (GsThreadedRunner *threaded_runner, + const gchar *name, + GMainContext *context) +{ + /* push mock systemd-sysupdated service to server thread */ + threaded_runner->context = g_main_context_ref (context); + threaded_runner->loop = g_main_loop_new (context, FALSE); + threaded_runner->thread = g_thread_new (name, + (GThreadFunc) gs_threaded_runner_thread_cb, + threaded_runner); +} + +static gboolean +gs_threaded_runner_is_running_cb (gpointer user_data) +{ + GsMonitor *monitor = user_data; + G_MUTEX_AUTO_LOCK (&monitor->lock, locker); + g_cond_signal (&monitor->cond); + return G_SOURCE_REMOVE; +} + +static void +gs_threaded_runner_clear (GsThreadedRunner *threaded_runner) +{ + /* Ensure the thread's main loop is running before trying to + * quit it, otherwise we would deadlock trying to join a + * never-ending thread. */ + { + GsMonitor monitor; + g_autoptr(GSource) source = g_idle_source_new (); + GS_MUTEX_AUTO_GUARD (&monitor.lock, lock); + GS_COND_AUTO_GUARD (&monitor.cond, cond); + G_MUTEX_AUTO_LOCK (&monitor.lock, locker); + + g_source_set_callback (source, gs_threaded_runner_is_running_cb, &monitor, NULL); + g_source_attach (source, threaded_runner->context); + g_cond_wait (&monitor.cond, &monitor.lock); + g_main_loop_quit (threaded_runner->loop); + } + + g_clear_pointer (&threaded_runner->thread, g_thread_join); + g_clear_pointer (&threaded_runner->loop, g_main_loop_unref); + g_clear_pointer (&threaded_runner->context, g_main_context_unref); +} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GsThreadedRunner, gs_threaded_runner_clear) + +/* this function will get called everytime a client attempts to connect */ +static void +mock_web_handler_cb (SoupServer *server, + SoupServerMessage *msg, + const char *path, + GHashTable *query, + gpointer user_data) +{ + const gchar *mimetype = "application/xml"; +#if AS_CHECK_VERSION(1, 0, 4) + const gchar *bundle = "sysupdate"; +#else + const gchar *bundle = "package"; +#endif + const gchar *start = NULL; + g_autofree gchar *id = NULL; + g_autofree gchar *reply = NULL; + size_t reply_size; + + if (soup_server_message_get_method (msg) != SOUP_METHOD_GET) { + soup_server_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED, NULL); + g_debug ("unexpected method"); + return; + } + + if (!g_str_has_prefix (path, "/") && g_str_has_suffix (path, ".metainfo.xml")) { + soup_server_message_set_status (msg, SOUP_STATUS_NOT_FOUND, NULL); + g_debug ("unexpected appstream path = `%s`", path); + return; + } + + start = path + strlen ("/"); + id = g_strndup (start, strlen (start) - strlen (".metainfo.xml")); + reply = g_strdup_printf ("\n" + "\n" + " %s\n" + " CC0-1.0\n" + " %s\n" + " A target\n" + " systemd-sysupdate\n" + "\n", + id, id, bundle); + reply_size = strlen (reply); + + soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); + soup_server_message_set_response (msg, mimetype, SOUP_MEMORY_TAKE, g_steal_pointer (&reply), reply_size); +} + +/** + * UpdateTargetInfo: + * + * Fake update target info reported by the mocked service. + */ +typedef struct { + const gchar *class; + const gchar *name; + const gchar *object_path; + const gchar *current_version; + const gchar *latest_version; +} UpdateTargetInfo; + +/** + * UpdateAppInfo: + * + * Expected app info to be created by the plugin. + */ +typedef struct { + const gchar *id; + const gchar *version; + const GsAppState state; + const AsComponentKind kind; + /* metadata `SystemdSysupdated::Target`, this value must be the + * same as the name of the associated update target (assume app + * to target is one-to-one mapping) */ + const gchar *metadata_target; +} UpdateAppInfo; + +/** + * UpdateTarget: + * + * Wrapper of the target info and expected app. + */ +typedef struct { + const UpdateTargetInfo target_info; + const UpdateAppInfo app_info; +} UpdateTarget; + +static const UpdateTarget target_host = { + .target_info = { + .class = "host", + .name = "host", + .object_path = "/org/freedesktop/sysupdate1/target/host", + .current_version = "t.0", + .latest_version = "t.1", + }, + .app_info = { + .id = "systemd-sysupdate.host", + .version = "t.1", + .state = GS_APP_STATE_AVAILABLE, + .kind = AS_COMPONENT_KIND_OPERATING_SYSTEM, + .metadata_target = "host", + }, +}; + +static const UpdateTarget target_component_available = { + .target_info = { + .class = "component", + .name = "available", + .object_path = "/org/freedesktop/sysupdate1/target/component_available", + .current_version = "", + .latest_version = "t.1", + }, + .app_info = { + .id = "systemd-sysupdate.component-available", + .version = "t.1", + .state = GS_APP_STATE_AVAILABLE, + .kind = AS_COMPONENT_KIND_OPERATING_SYSTEM, + .metadata_target = "available", + }, +}; + +static const UpdateTarget target_component_installed = { + .target_info = { + .class = "component", + .name = "installed", + .object_path = "/org/freedesktop/sysupdate1/target/component_installed", + .current_version = "t.1", + .latest_version = "", + }, + .app_info = { + .id = "systemd-sysupdate.component-installed", + .version = "t.1", + .state = GS_APP_STATE_AVAILABLE, + .kind = AS_COMPONENT_KIND_OPERATING_SYSTEM, + .metadata_target = "installed", + }, +}; + +static const UpdateTarget target_component_updatable = { + .target_info = { + .class = "component", + .name = "updatable", + .object_path = "/org/freedesktop/sysupdate1/target/component_updatable", + .current_version = "t.0", + .latest_version = "t.1", + }, + .app_info = { + .id = "systemd-sysupdate.component-updatable", + .version = "t.1", + .state = GS_APP_STATE_UPDATABLE, + .kind = AS_COMPONENT_KIND_OPERATING_SYSTEM, + .metadata_target = "updatable", + }, +}; + +static const UpdateTarget target_component_updatable_v2 = { + .target_info = { + .class = "component", + .name = "updatable", + .object_path = "/org/freedesktop/sysupdate1/target/component_updatable", + .current_version = "t.0", + .latest_version = "t.2", + }, + .app_info = { + .id = "systemd-sysupdate.component-updatable", + .version = "t.2", + .state = GS_APP_STATE_UPDATABLE, + .kind = AS_COMPONENT_KIND_OPERATING_SYSTEM, + .metadata_target = "updatable", + }, +}; + +/** + * MockSysupdatedCallData: + * + * Holds data to be used by the interface method call function implementations. + */ +typedef struct { + gint web_port; + const UpdateTarget **targets; + GMutex lock; /* used in `Target.Update()` to check if code-under-test starts to wait for signal JobRemoved() */ + GCond cond; +} MockSysupdatedCallData; + +static void +mock_sysupdated_reply_method_call_manager_introspect (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + g_autoptr(GVariant) reply = NULL; + + reply = g_variant_new ("(s)", ""); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); +} + +static void +mock_sysupdated_reply_method_call_manager_list_targets (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MockSysupdatedCallData *call_data = (MockSysupdatedCallData *) user_data; + const UpdateTarget **targets = (const UpdateTarget **) call_data->targets; + g_autoptr(GVariant) reply = NULL; + GVariantBuilder builder; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sso)")); + for (guint i = 0; targets[i] != NULL; i++) { + g_variant_builder_add (&builder, + "(sso)", + targets[i]->target_info.class, + targets[i]->target_info.name, + targets[i]->target_info.object_path); + } + reply = g_variant_new ("(@a(sso))", + g_variant_builder_end (&builder)); /* Also clears the builder up. */ + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); +} + +static void +mock_sysupdated_reply_method_call_target_properties_get_all (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MockSysupdatedCallData *call_data = (MockSysupdatedCallData *) user_data; + const UpdateTarget **targets = (const UpdateTarget **) call_data->targets; + + for (guint i = 0; targets[i] != NULL; i++) { + if (g_strcmp0 (targets[i]->target_info.object_path, object_path) == 0) { + g_autoptr(GVariant) reply = NULL; + const gchar *interface = NULL; + + g_assert_true (g_str_has_prefix (object_path, "/org/freedesktop/sysupdate1/target/")); + + g_variant_get (parameters, "(&s)", &interface); + g_assert_true (g_str_equal (interface, "org.freedesktop.sysupdate1.Target") || + g_str_equal (interface, "org.freedesktop.DBus.Properties")); + + reply = g_variant_new_parsed ("({'Version': <%s>},)", + targets[i]->target_info.current_version); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); + return; + } + } + + if (g_strcmp0 ("/org/freedesktop/sysupdate1/job/_2", object_path) == 0) { + g_autoptr(GVariant) reply = NULL; + const gchar *interface = NULL; + + g_variant_get (parameters, "(&s)", &interface); + g_assert_cmpstr (interface, ==, "org.freedesktop.sysupdate1.Job"); + + reply = g_variant_new_parsed ("({'': <%s>},)", ""); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); + return; + } + + g_debug ("unexpected object_path = `%s`", object_path); + g_assert_not_reached (); +}; + +static void +mock_sysupdated_reply_method_call_target_check_new (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MockSysupdatedCallData *call_data = (MockSysupdatedCallData *) user_data; + const UpdateTarget **targets = (const UpdateTarget **) call_data->targets; + + for (guint i = 0; targets[i] != NULL; i++) { + if (g_strcmp0 (targets[i]->target_info.object_path, object_path) == 0) { + g_autoptr(GVariant) reply = NULL; + + reply = g_variant_new ("(s)", + targets[i]->target_info.latest_version); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); + return; + } + } + + g_debug ("unexpected object_path = `%s`", object_path); + g_assert_not_reached (); +} + +static void +mock_sysupdated_reply_method_call_target_describe (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MockSysupdatedCallData *call_data = (MockSysupdatedCallData *) user_data; + const UpdateTarget **targets = (const UpdateTarget **) call_data->targets; + + for (guint i = 0; targets[i] != NULL; i++) { + if (g_strcmp0 (targets[i]->target_info.object_path, object_path) == 0) { + g_autoptr(GVariant) reply = NULL; + const gchar *version = NULL; + gboolean offline = FALSE; + gboolean is_latest = FALSE; + g_autofree gchar *json = NULL; + + g_variant_get (parameters, "(&sb)", &version, &offline); + g_assert_cmpstr (version, ==, targets[i]->app_info.version); + g_assert_false (offline); + + is_latest = g_strcmp0 (version, targets[i]->target_info.latest_version) == 0; + json = g_strdup_printf ("{\"version\":\"%s\",\"newest\":%s,\"available\":%s,\"installed\":%s,\"obsolete\":%s,\"protected\":false,\"changelog_urls\":[],\"contents\":[]}", + version, + is_latest ? "true" : "false", + targets[i]->app_info.state == GS_APP_STATE_AVAILABLE ? "true" : "false", + targets[i]->app_info.state == GS_APP_STATE_INSTALLED ? "true" : "false", + !is_latest ? "true" : "false"); + + reply = g_variant_new ("(s)", json); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); + return; + } + } + + g_debug ("unexpected object_path = `%s`", object_path); + g_assert_not_reached (); +} + +static void +mock_sysupdated_reply_method_call_target_get_app_stream (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MockSysupdatedCallData *call_data = (MockSysupdatedCallData *) user_data; + const UpdateTarget **targets = (const UpdateTarget **) call_data->targets; + + for (guint i = 0; targets[i] != NULL; i++) { + if (g_strcmp0 (targets[i]->target_info.object_path, object_path) == 0) { + GVariantBuilder builder; + g_autoptr(GVariant) reply = NULL; + g_autofree gchar *appstream_url = NULL; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); + appstream_url = g_strdup_printf ("http://localhost:%d/%s.metainfo.xml", call_data->web_port, targets[i]->app_info.id); + g_variant_builder_add (&builder, "s", appstream_url); + reply = g_variant_new ("(as)", &builder); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); + return; + } + } + + g_debug ("unexpected object_path = `%s`", object_path); + g_assert_not_reached (); +} + +static void +mock_sysupdated_reply_method_call_target_get_version (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MockSysupdatedCallData *call_data = (MockSysupdatedCallData *) user_data; + const UpdateTarget **targets = (const UpdateTarget **) call_data->targets; + + for (guint i = 0; targets[i] != NULL; i++) { + if (g_strcmp0 (targets[i]->target_info.object_path, object_path) == 0) { + g_autoptr(GVariant) reply = NULL; + + reply = g_variant_new ("(s)", + targets[i]->target_info.current_version); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); + return; + } + } + + g_debug ("unexpected object_path = `%s`", object_path); + g_assert_not_reached (); +} + +static void +mock_sysupdated_reply_method_call_target_update (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MockSysupdatedCallData *call_data = (MockSysupdatedCallData *) user_data; + const UpdateTarget **targets = (const UpdateTarget **) call_data->targets; + + for (guint i = 0; targets[i] != NULL; i++) { + if (g_strcmp0 (targets[i]->target_info.object_path, object_path) == 0) { + g_autoptr(GVariant) reply = NULL; + const gchar *version = NULL; + guint64 flags = 0; + G_MUTEX_AUTO_LOCK (&call_data->lock, locker); + + g_variant_get (parameters, "(&st)", &version, &flags); + g_assert_cmpstr (version, ==, ""); /* always update to the latest version for now */ + g_assert_cmpuint (flags, ==, 0); /* no flags are defined yet */ + + reply = g_variant_new ("(sto)", + targets[i]->target_info.latest_version, + 2, + "/org/freedesktop/sysupdate1/job/_2"); + g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&reply)); + + /* signal the test code that it has already replyed to + * the method_call `Target.Update()`, which means plugin + * should now start to wait for the signal + * `JobRemoved()` */ + g_cond_signal (&call_data->cond); + return; + } + } + + g_debug ("unexpected object_path = `%s`", object_path); + g_assert_not_reached (); +} + +static void +mock_sysupdated_reply_method_call_job_cancel (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MockSysupdatedCallData *call_data = (MockSysupdatedCallData *) user_data; + G_MUTEX_AUTO_LOCK (&call_data->lock, locker); + + /* no parameters */ + g_dbus_method_invocation_return_value (invocation, NULL); + + /* signal test code that cancel has been replied and it can move + * on to emit signal JobRemoved() */ + g_cond_signal (&call_data->cond); +} + +static void +mock_sysupdated_server_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GDBusInterfaceMethodCallFunc handle_method_call_reply = NULL; + + if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Introspectable") == 0) { + if (g_strcmp0 (method_name, "Introspect") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_manager_introspect; + } + } else if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Properties") == 0) { + if (g_strcmp0 (method_name, "GetAll") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_target_properties_get_all; + } + } else if (g_strcmp0 (interface_name, "org.freedesktop.sysupdate1.Manager") == 0) { + if (g_strcmp0 (method_name, "ListTargets") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_manager_list_targets; + } + } else if (g_strcmp0 (interface_name, "org.freedesktop.sysupdate1.Target") == 0) { + if (g_strcmp0 (method_name, "CheckNew") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_target_check_new; + } + else if (g_strcmp0 (method_name, "Describe") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_target_describe; + } + else if (g_strcmp0 (method_name, "GetAppStream") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_target_get_app_stream; + } + else if (g_strcmp0 (method_name, "GetVersion") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_target_get_version; + } + else if (g_strcmp0 (method_name, "Update") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_target_update; + } + } else if (g_strcmp0 (interface_name, "org.freedesktop.sysupdate1.Job") == 0) { + if (g_strcmp0 (method_name, "Cancel") == 0) { + handle_method_call_reply = mock_sysupdated_reply_method_call_job_cancel; + } + } + + if (handle_method_call_reply == NULL) { + g_debug ("mock systemd-sysupdated service does not implement reply to `%s.%s()`", + interface_name, + method_name); + g_assert_not_reached (); + } + + handle_method_call_reply (connection, + sender, + object_path, + interface_name, + method_name, + parameters, + invocation, + user_data); +} + +static GVariant * +mock_sysupdated_server_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + if (g_strcmp0 (interface_name, "org.freedesktop.sysupdate1.Job") == 0) { + if (g_strcmp0 (property_name, "Id") == 0) { + return g_variant_new ("t", 0); + } else if (g_strcmp0 (property_name, "Type") == 0) { + return g_variant_new ("s", ""); + } else if (g_strcmp0 (property_name, "Offline") == 0) { + return g_variant_new ("b", FALSE); + } else if (g_strcmp0 (property_name, "Progress") == 0) { + return g_variant_new ("u", 0); + } + } + + g_debug ("mock systemd-sysupdated service does not implement getting property `%s.%s()`", + interface_name, + property_name); + g_assert_not_reached (); +} + +static gboolean +mock_sysupdated_server_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + g_debug ("mock systemd-sysupdated service does not implement setting property `%s.%s()`", + interface_name, + property_name); + g_assert_not_reached (); +} + +static const GDBusInterfaceVTable mock_sysupdated_server_vtable = +{ + .method_call = mock_sysupdated_server_method_call, + .get_property = mock_sysupdated_server_get_property, + .set_property = mock_sysupdated_server_set_property, +}; + +/** + * MockSysupdatedHandle: + * + * A handle to manipulate the mockup-up systemd sysupdate service. + */ +typedef struct { + GDBusConnection *connection; + GMainContext *context; +} MockSysupdatedHandle; + +/** + * MockSysupdatedService: + * + * The mocked-up systemd-sysupdate D-Bus service. + */ +typedef struct { + SoupServer *web; + gint web_port; + MockSysupdatedHandle handle; + GTestDBus *bus; + guint owner_id; + guint registration_id; + GsThreadedRunner runner; +} MockSysupdatedService; + +/** + * TestData: + * + * Data passed to the tests. + */ +typedef struct { + MockSysupdatedHandle handle; + gint web_port; + /* can only load once per process */ + GsPluginLoader *plugin_loader; +} TestData; + +/** + * EmitSignalData: + * + * Holds data to pass to a g_dbus_connection_emit_signal() call. + */ +typedef struct { + GDBusConnection *connection; + const gchar *sender; + const gchar *object_path; + const gchar *interface_name; + const gchar *signal_name; + GVariant *parameters; + + GMutex lock; + GCond cond; +} EmitSignalData; + +static gboolean +emit_signal_cb (gpointer user_data) +{ + EmitSignalData *data = (EmitSignalData *) user_data; + g_autoptr(GError) error = NULL; + G_MUTEX_AUTO_LOCK (&data->lock, locker); + + g_dbus_connection_emit_signal (data->connection, + data->sender, + data->object_path, + data->interface_name, + data->signal_name, + g_steal_pointer (&data->parameters), + &error); + g_assert_no_error (error); + + g_dbus_connection_flush_sync (data->connection, NULL, &error); + g_assert_no_error (error); + + g_cond_signal (&data->cond); + + return G_SOURCE_REMOVE; +} + +/* Append an event to the server's context to emit the signal, and wait for the + * server's thread to emit it. */ +static void +mock_sysupdated_emit_signal_job_removed (MockSysupdatedHandle *handle, + gint job_status) +{ + EmitSignalData data = { + .connection = handle->connection, + .sender = "org.freedesktop.sysupdate1", + .object_path = "/org/freedesktop/sysupdate1", + .interface_name = "org.freedesktop.sysupdate1.Manager", + .signal_name = "JobRemoved", + /* The D-Bus message will take ownership of the floating reference. */ + .parameters = g_variant_new ("(toi)", 2, "/org/freedesktop/sysupdate1/job/_2", job_status), + }; + GS_MUTEX_AUTO_GUARD (&data.lock, lock); + GS_COND_AUTO_GUARD (&data.cond, cond); + G_MUTEX_AUTO_LOCK (&data.lock, locker); + + gs_test_flush_main_context (); + + g_main_context_invoke (handle->context, emit_signal_cb, &data); + g_cond_wait (&data.cond, &data.lock); + + /* this is a workaround for we want to wait until the signal + * emitted has been dispatched and is received by the plugin. + * we are using the main context here due to currently the + * signal subscriptions are done in the `setup()` and was run on + * the main context in the test `main()`. */ + g_main_context_iteration (NULL, TRUE); +} + +/* Append an event to the server's context to emit the signal, and wait for the + * server's thread to emit it. */ +static void +mock_sysupdated_emit_signal_properties_changed (MockSysupdatedHandle *handle, + guint progress_percentage) +{ + EmitSignalData data = { + .connection = handle->connection, + .sender = "org.freedesktop.sysupdate1", + .object_path = "/org/freedesktop/sysupdate1/job/_2", + .interface_name = "org.freedesktop.DBus.Properties", + .signal_name = "PropertiesChanged", + .parameters = NULL, + }; + const gchar *invalidated_properties[] = {NULL}; + GVariantBuilder builder; + GS_MUTEX_AUTO_GUARD (&data.lock, lock); + GS_COND_AUTO_GUARD (&data.cond, cond); + G_MUTEX_AUTO_LOCK (&data.lock, locker); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_add (&builder, + "{sv}", + "Progress", + g_variant_new_uint32 (progress_percentage)); + /* The D-Bus message will take ownership of the floating reference. */ + data.parameters = g_variant_new ("(s@a{sv}@as)", + "org.freedesktop.sysupdate1.Job", + g_variant_builder_end (&builder), /* Also clears the builder up. */ + g_variant_new_strv (invalidated_properties, -1)), + + gs_test_flush_main_context (); + + g_main_context_invoke (handle->context, emit_signal_cb, &data); + g_cond_wait (&data.cond, &data.lock); + + /* the same as the `mock_sysupdated_emit_signal_job_removed()` */ + g_main_context_iteration (NULL, TRUE); +} + +/** + * MockSysupdatedRegistrar: + * + * Holds a register of D-Bus objects. + */ +typedef struct { + MockSysupdatedHandle handle; + GSList *ids; + MockSysupdatedCallData call_data; +} MockSysupdatedRegistrar; + +/** + * RegisterObjectData: + * + * Holds data to pass to a g_dbus_connection_register_object() call. + */ +typedef struct { + GDBusConnection *connection; + const gchar *object_path; + GDBusInterfaceInfo *interface_info; + gpointer user_data; + guint registration_id; + + GMutex lock; + GCond cond; +} RegisterObjectData; + +static gboolean +mock_sysupdated_registrar_register_object_cb (gpointer user_data) +{ + RegisterObjectData *data = (RegisterObjectData *) user_data; + g_autoptr(GError) error = NULL; + G_MUTEX_AUTO_LOCK (&data->lock, locker); + + data->registration_id = g_dbus_connection_register_object (data->connection, + data->object_path, + data->interface_info, + &mock_sysupdated_server_vtable, + data->user_data, + NULL, + &error); + g_assert_no_error (error); + g_assert (data->registration_id > 0); + g_cond_signal (&data->cond); + + return G_SOURCE_REMOVE; +} + +static void +mock_sysupdated_registrar_register_object (MockSysupdatedRegistrar *registrar, + const gchar *object_path, + GDBusInterfaceInfo *interface_info, + gpointer user_data) +{ + RegisterObjectData data = { + .connection = registrar->handle.connection, + .object_path = object_path, + .interface_info = interface_info, + .user_data = user_data, + .registration_id = 0, + }; + GS_MUTEX_AUTO_GUARD (&data.lock, lock); + GS_COND_AUTO_GUARD (&data.cond, cond); + G_MUTEX_AUTO_LOCK (&data.lock, locker); + + g_main_context_invoke (registrar->handle.context, + mock_sysupdated_registrar_register_object_cb, + &data); + g_cond_wait (&data.cond, &data.lock); + + registrar->ids = g_slist_append (registrar->ids, + GUINT_TO_POINTER (data.registration_id)); +} + +/** + * UnregisterObjectData: + * + * Holds data to pass to a g_dbus_connection_unregister_object() call. + */ +typedef struct { + GDBusConnection *connection; + guint registration_id; + + GMutex lock; + GCond cond; +} UnregisterObjectData; + +static gboolean +mock_sysupdated_registrar_unregister_object_cb (gpointer user_data) +{ + UnregisterObjectData *data = (UnregisterObjectData *) user_data; + G_MUTEX_AUTO_LOCK (&data->lock, locker); + + g_dbus_connection_unregister_object (data->connection, + data->registration_id); + g_cond_signal (&data->cond); + + return G_SOURCE_REMOVE; +} + +static void +mock_sysupdated_registrar_unregister_object (MockSysupdatedRegistrar *registrar, + guint registration_id) +{ + UnregisterObjectData data = { + .connection = registrar->handle.connection, + .registration_id = registration_id, + }; + GS_MUTEX_AUTO_GUARD (&data.lock, lock); + GS_COND_AUTO_GUARD (&data.cond, cond); + G_MUTEX_AUTO_LOCK (&data.lock, locker); + + g_main_context_invoke (registrar->handle.context, + mock_sysupdated_registrar_unregister_object_cb, + &data); + g_cond_wait (&data.cond, &data.lock); + + registrar->ids = g_slist_remove (registrar->ids, + GUINT_TO_POINTER (registration_id)); +} + +static void +mock_sysupdated_registrar_init (MockSysupdatedRegistrar *registrar, + gint web_port, + MockSysupdatedHandle *handle, + const UpdateTarget **targets) +{ + /* Configure mock `systemd-sysupdated` server's reply based on + * the given `user_data` */ + + registrar->call_data.web_port = web_port; + registrar->call_data.targets = targets; + + g_mutex_init (®istrar->call_data.lock); + g_cond_init (®istrar->call_data.cond); + + g_set_object (®istrar->handle.connection, handle->connection); + registrar->handle.context = g_main_context_ref (handle->context); + + /* since the server thread already started running on a + * different context, we now need to invoke the object + * registration on the thread context */ + + /* register manager object */ + { + /* org.freedesktop.sysupdate1.Manager */ + mock_sysupdated_registrar_register_object (registrar, + "/org/freedesktop/sysupdate1", + gs_systemd_sysupdate_manager_interface_info (), + ®istrar->call_data); + } + + /* register target objects */ + for (guint i = 0; targets[i] != NULL; i++) { + /* org.freedesktop.DBus.Properties */ + mock_sysupdated_registrar_register_object (registrar, + targets[i]->target_info.object_path, + gs_systemd_sysupdate_org_freedesktop_dbus_properties_interface_info (), + ®istrar->call_data); + + /* org.freedesktop.sysupdate1.Target */ + mock_sysupdated_registrar_register_object (registrar, + targets[i]->target_info.object_path, + gs_systemd_sysupdate_target_interface_info (), + ®istrar->call_data); + } + + /* register job objects. here we use the same job ID hard-coded + * everywhere in this file */ + { + /* org.freedesktop.sysupdate1.Job */ + mock_sysupdated_registrar_register_object (registrar, + "/org/freedesktop/sysupdate1/job/_2", + gs_systemd_sysupdate_job_interface_info (), + ®istrar->call_data); + } +} + +static void +mock_sysupdated_registrar_clear (MockSysupdatedRegistrar *registrar) +{ + /* clean-up all objects registered to the test bus */ + while (registrar->ids != NULL) { + mock_sysupdated_registrar_unregister_object (registrar, + GPOINTER_TO_UINT (registrar->ids->data)); + } + g_clear_pointer (®istrar->ids, g_slist_free); + g_clear_object (®istrar->handle.connection); + g_clear_pointer (®istrar->handle.context, g_main_context_unref); + + g_cond_clear (®istrar->call_data.cond); + g_mutex_clear (®istrar->call_data.lock); +} + +#define MOCK_SYSUPDATED_REGISTRAR_INIT {0} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(MockSysupdatedRegistrar, mock_sysupdated_registrar_clear) + +static void +mock_sysupdated_service_init (MockSysupdatedService *service) +{ + service->handle.context = g_main_context_new (); + + g_main_context_push_thread_default (service->handle.context); + { + g_autofree gchar *relative = NULL; + g_autofree gchar *servicesdir = NULL; + g_autoptr(GError) error = NULL; + GSList *uris; + + /* Create the test web service. */ + service->web = soup_server_new (NULL, NULL); + g_assert_nonnull (service->web); + + /* Connect on HTTP. */ + soup_server_listen_local (service->web, 0, 0, &error); + g_assert_no_error (error); + + /* Get the allocated port. */ + uris = soup_server_get_uris (service->web); + g_assert_nonnull (uris); + g_assert_nonnull (uris->data); + + service->web_port = g_uri_get_port (uris->data); + g_assert_cmpint (service->web_port, !=, -1); + + g_slist_free_full (uris, (GDestroyNotify) g_uri_unref); + + soup_server_add_handler (service->web, NULL, mock_web_handler_cb, NULL, NULL); + + /* Create the global dbus-daemon for this test suite. */ + service->bus = g_test_dbus_new (G_TEST_DBUS_NONE); + + /* Add the private directory with our in-tree service files. */ + relative = g_test_build_filename (G_TEST_BUILT, "services", NULL); + servicesdir = g_canonicalize_filename (relative, NULL); + g_test_dbus_add_service_dir (service->bus, servicesdir); + + /* Start the private D-Bus daemon. */ + g_test_dbus_up (service->bus); + + /* create bus connection */ + service->handle.connection = g_dbus_connection_new_for_address_sync (g_test_dbus_get_bus_address (service->bus), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + NULL, NULL, &error); + g_assert_no_error (error); + + /* we need at least the manager to reply to the plugin's + * self-disable query in the constructor */ + service->owner_id = g_bus_own_name_on_connection (service->handle.connection, + "org.freedesktop.sysupdate1", + G_BUS_NAME_OWNER_FLAGS_NONE, + NULL, NULL, NULL, NULL); + service->registration_id = g_dbus_connection_register_object (service->handle.connection, + "/org/freedesktop/sysupdate1", + gs_systemd_sysupdate_org_freedesktop_dbus_introspectable_interface_info (), + &mock_sysupdated_server_vtable, + NULL, NULL, &error); + g_assert_no_error (error); + } + g_main_context_pop_thread_default (service->handle.context); + + gs_threaded_runner_init (&service->runner, + "mock systemd-sysupdated service", + service->handle.context); +} + +static void +mock_sysupdated_service_clear (MockSysupdatedService *service) +{ + gs_threaded_runner_clear (&service->runner); + + g_main_context_push_thread_default (service->handle.context); + { + /* clean-up bus connection */ + g_dbus_connection_unregister_object (service->handle.connection, + service->registration_id); + g_bus_unown_name (service->owner_id); + if (service->handle.connection != NULL) { + g_dbus_connection_close_sync (service->handle.connection, NULL, NULL); + } + + /* stop test D-Bus daemon */ + g_test_dbus_down (service->bus); + g_clear_pointer (&service->bus, g_object_unref); + + /* stop test web server */ + g_clear_pointer (&service->web, g_object_unref); + } + g_main_context_pop_thread_default (service->handle.context); + g_clear_pointer (&service->handle.context, g_main_context_unref); +} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(MockSysupdatedService, mock_sysupdated_service_clear) + +static gint +compare_apps_by_name (GsApp *app1, GsApp *app2, gpointer user_data) +{ + /* Negative value if a < b; zero if a = b; positive value if a > b. */ + return g_ascii_strcasecmp (gs_app_get_name (app1), + gs_app_get_name (app2)); +} + +static void +invoke_plugin_loader_refresh_metadata_assert_no_error (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GError) error = NULL; + gboolean ret; + + plugin_job = gs_plugin_job_refresh_metadata_new (0, /* always refresh */ + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + + g_assert_no_error (error); + g_assert_true (ret); +} + +static GsAppList * +invoke_plugin_loader_list_upgrades_assert_no_error (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) error = NULL; + + plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE, + GS_PLUGIN_REFINE_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + + g_assert_no_error (error); + g_assert_nonnull (list); + + gs_app_list_sort (list, (GsAppListSortFunc) compare_apps_by_name, NULL); + return g_steal_pointer (&list); +} + +static GsAppList * +invoke_plugin_loader_list_apps_for_update_assert_no_error (GsPluginLoader *plugin_loader) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) error = NULL; + + query = gs_app_query_new ("is-for-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_NONE, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error); + gs_test_flush_main_context (); + + g_assert_no_error (error); + g_assert_nonnull (list); + + gs_app_list_sort (list, (GsAppListSortFunc) compare_apps_by_name, NULL); + return g_steal_pointer (&list); +} + +/** + * RunPluginJobActionData: + * + * Holds data to pass to a gs_plugin_loader_job_action() call. + */ +typedef struct { + GsPluginLoader *plugin_loader; + GsPluginJob *plugin_job; + GCancellable *cancellable; + GError *error; + gboolean ret; + + GThread *plugin_thread; +} RunPluginJobActionData; + +static gpointer +run_plugin_job_action_thread_cb (gpointer user_data) +{ + RunPluginJobActionData *data = (RunPluginJobActionData *) user_data; + + data->ret = gs_plugin_loader_job_action (data->plugin_loader, + data->plugin_job, + data->cancellable, + &data->error); + + return NULL; +} + +static void +invoke_plugin_loader_upgrade_trigger_end_assert_no_error (RunPluginJobActionData *data) +{ + g_clear_pointer (&data->plugin_thread, g_thread_join); + + g_assert_no_error (data->error); + g_assert_true (data->ret); + + g_clear_pointer (&data->plugin_job, g_object_unref); + g_slice_free (RunPluginJobActionData, data); +} + +static void +invoke_plugin_loader_upgrade_trigger_end_assert_error (RunPluginJobActionData *data, + GQuark domain, + gint code) +{ + g_clear_pointer (&data->plugin_thread, g_thread_join); + + g_assert_error (data->error, domain, code); + g_assert_false (data->ret); + + g_clear_error (&data->error); + g_clear_pointer (&data->plugin_job, g_object_unref); + g_slice_free (RunPluginJobActionData, data); +} + +static RunPluginJobActionData * +invoke_plugin_loader_update_apps_begin (GsPluginLoader *plugin_loader, + GsAppList *list_updates) +{ + RunPluginJobActionData *data = g_slice_new (RunPluginJobActionData); + + data->plugin_loader = plugin_loader; + data->plugin_job = gs_plugin_job_update_apps_new (list_updates, + GS_PLUGIN_UPDATE_APPS_FLAGS_NONE); + data->cancellable = g_cancellable_new (); + data->error = NULL; + data->ret = FALSE; + + data->plugin_thread = g_thread_new ("invoke-plugin-loader-update-apps-background", + (GThreadFunc) run_plugin_job_action_thread_cb, + data); + return g_steal_pointer (&data); +} + +static void +invoke_plugin_loader_update_apps_end_assert_no_error (RunPluginJobActionData *data) +{ + invoke_plugin_loader_upgrade_trigger_end_assert_no_error (data); +} + +static void +invoke_plugin_loader_update_apps_end_assert_error (RunPluginJobActionData *data, + GQuark domain, + gint code) +{ + invoke_plugin_loader_upgrade_trigger_end_assert_error (data, domain, code); +} + +/* Checks that the plugin is enabled. If it isn't, it could be because the + * org.freedesktop.sysupdate1 D-Bus service isn't found. Given we mock it up for + * these tests, not finding it is a bug. */ +static void +gs_plugin_systemd_sysupdate_plugin_enabled_func (TestData *test_data) +{ + GsPluginLoader *plugin_loader = test_data->plugin_loader; + + g_assert_true (gs_plugin_loader_get_enabled (plugin_loader, "systemd-sysupdate")); +} + +/* Checks that the plugin doesn't do distro upgrades, as for the moment it only + * handles updates, including for the host target. */ +static void +gs_plugin_systemd_sysupdate_distro_upgrade_func (TestData *test_data) +{ + GsPluginLoader *plugin_loader = test_data->plugin_loader; + const UpdateTarget *targets[] = { + &target_host, + NULL + }; + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + + if (!gs_plugin_loader_get_enabled (plugin_loader, "systemd-sysupdate")) { + g_test_skip ("not enabled"); + return; + } + + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + { + g_autoptr(GsAppList) list_upgrades = NULL; + + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_upgrades = invoke_plugin_loader_list_upgrades_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_upgrades), ==, 0); + } +} + +/* Checks that the plugin can handle app updates. */ +static void +gs_plugin_systemd_sysupdate_app_update_updatable_func (TestData *test_data) +{ + GsPluginLoader *plugin_loader = test_data->plugin_loader; + const UpdateTarget *targets[] = { + &target_component_available, + &target_component_installed, + &target_component_updatable, + NULL + }; + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + + if (!gs_plugin_loader_get_enabled (plugin_loader, "systemd-sysupdate")) { + g_test_skip ("not enabled"); + return; + } + + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + { + g_autoptr(GsAppList) list_updates = NULL; + + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_updates = invoke_plugin_loader_list_apps_for_update_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + + { + RunPluginJobActionData *data = NULL; + G_MUTEX_AUTO_LOCK (®istrar.call_data.lock, locker); + + data = invoke_plugin_loader_update_apps_begin (plugin_loader, list_updates); + for (guint i = 0; i < gs_app_list_length (list_updates); i++) { + /* Wait for the plugin thread to handle `Target.Update()`. */ + g_cond_wait (®istrar.call_data.cond, ®istrar.call_data.lock); + + /* emit `job_status` = `0` as update success */ + mock_sysupdated_emit_signal_job_removed (&test_data->handle, 0); + } + invoke_plugin_loader_update_apps_end_assert_no_error (g_steal_pointer (&data)); + } + + /* app state changes on update succeed */ + for (guint i = 0; i < gs_app_list_length (list_updates); i++) { + GsApp *app = gs_app_list_index (list_updates, i); + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + } + } +} + +/* Checks that the plugin reports the progress of app updates. */ +static void +gs_plugin_systemd_sysupdate_app_update_trackable_func (TestData *test_data) +{ + GsPluginLoader *plugin_loader = test_data->plugin_loader; + const UpdateTarget *targets[] = { + &target_component_available, + &target_component_installed, + &target_component_updatable, + NULL + }; + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + + if (!gs_plugin_loader_get_enabled (plugin_loader, "systemd-sysupdate")) { + g_test_skip ("not enabled"); + return; + } + + /* use only one app update (component) here since the plugin + * does not control the app update order in the app list */ + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + { + g_autoptr(GsAppList) list_updates = NULL; + GsApp *app = NULL; + + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_updates = invoke_plugin_loader_list_apps_for_update_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + + app = gs_app_list_index (list_updates, 0); + { + RunPluginJobActionData *data = NULL; + G_MUTEX_AUTO_LOCK (®istrar.call_data.lock, locker); + + data = invoke_plugin_loader_update_apps_begin (plugin_loader, list_updates); + /* Wait for the plugin thread to handle `Target.Update()`. */ + g_cond_wait (®istrar.call_data.cond, ®istrar.call_data.lock); + + /* The mock server can only return the default value for + * properties, so we need to wait for the plugin to + * retrieve the default progress value before emitting + * its updated value. */ + while (gs_app_get_progress (app) == GS_APP_PROGRESS_UNKNOWN) { + g_usleep (100); + } + + /* Signal the update has progressed. */ + mock_sysupdated_emit_signal_properties_changed (&test_data->handle, 50); + /* Wait for the plugin thread to handle the update. */ + while (gs_app_get_progress (app) != 50) { + g_usleep (100); + } + g_assert_cmpint (gs_app_get_progress (app), ==, 50); + + /* emit job-removed to end the job */ + mock_sysupdated_emit_signal_job_removed (&test_data->handle, 0); + + invoke_plugin_loader_update_apps_end_assert_no_error (g_steal_pointer (&data)); + } + + /* app state changes on update succeed */ + g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED); + } +} + +/* Checks that the plugin can recover an app's state when its update failed. */ +static void +gs_plugin_systemd_sysupdate_app_update_recoverable_func (TestData *test_data) +{ + GsPluginLoader *plugin_loader = test_data->plugin_loader; + const UpdateTarget *targets[] = { + &target_component_available, + &target_component_installed, + &target_component_updatable, + NULL + }; + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + + if (!gs_plugin_loader_get_enabled (plugin_loader, "systemd-sysupdate")) { + g_test_skip ("not enabled"); + return; + } + + /* it might be just a choice, currently in the plugin, the + * update chain stops on any of the update failure happenes */ + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + { + g_autoptr(GsAppList) list_updates = NULL; + + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_updates = invoke_plugin_loader_list_apps_for_update_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + + { + RunPluginJobActionData *data = NULL; + G_MUTEX_AUTO_LOCK (®istrar.call_data.lock, locker); + + data = invoke_plugin_loader_update_apps_begin (plugin_loader, list_updates); + /* Wait for the plugin thread to handle `Target.Update()`. */ + g_cond_wait (®istrar.call_data.cond, ®istrar.call_data.lock); + + /* emit `job_status` = non-zero as update failure */ + mock_sysupdated_emit_signal_job_removed (&test_data->handle, -2); + + /* as the 1st job failed, the 2nd job will not run + * based on the plugin's current implementation */ + invoke_plugin_loader_update_apps_end_assert_no_error (g_steal_pointer (&data)); + } + + /* if the 2nd job is somehow triggered, this test case will + * fail because of the timeout. as a result, we only need to + * check both apps are not installed here */ + for (guint i = 0; i < gs_app_list_length (list_updates); i++) { + GsApp *app = gs_app_list_index (list_updates, i); + g_assert_cmpint (gs_app_get_state (app), !=, GS_APP_STATE_INSTALLED); + } + } +} + +/* Checks that the plugin can cancel app updates. */ +static void +gs_plugin_systemd_sysupdate_app_update_cancellable_func (TestData *test_data) +{ + GsPluginLoader *plugin_loader = test_data->plugin_loader; + const UpdateTarget *targets[] = { + &target_component_available, + &target_component_installed, + &target_component_updatable, + NULL + }; + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + + if (!gs_plugin_loader_get_enabled (plugin_loader, "systemd-sysupdate")) { + g_test_skip ("not enabled"); + return; + } + + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + { + g_autoptr(GsAppList) list_updates = NULL; + + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_updates = invoke_plugin_loader_list_apps_for_update_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + + { + RunPluginJobActionData *data = NULL; + G_MUTEX_AUTO_LOCK (®istrar.call_data.lock, locker); + + data = invoke_plugin_loader_update_apps_begin (plugin_loader, list_updates); + /* Wait for the plugin thread to handle `Target.Update()`. */ + g_cond_wait (®istrar.call_data.cond, ®istrar.call_data.lock); + + /* cancel the job, error should be set automatically */ + g_cancellable_cancel (data->cancellable); + /* Wait for the plugin thread to handle `Job.Cancel()`. */ + g_cond_wait (®istrar.call_data.cond, ®istrar.call_data.lock); + + /* emit `job_status` = -1 as what real service returns */ + mock_sysupdated_emit_signal_job_removed (&test_data->handle, -1); + + invoke_plugin_loader_update_apps_end_assert_error (g_steal_pointer (&data), + G_IO_ERROR, + G_IO_ERROR_CANCELLED); + } + + for (guint i = 0; i < gs_app_list_length (list_updates); i++) { + GsApp *app = gs_app_list_index (list_updates, i); + g_assert_cmpint (gs_app_get_state (app), !=, GS_APP_STATE_INSTALLED); + } + } +} + +/* Checks that the plugin can track a target's latest version by updating the + * currently stored target and app. */ +static void +gs_plugin_systemd_sysupdate_metadata_target_updatable_func (TestData *test_data) +{ + GsPluginLoader *plugin_loader = test_data->plugin_loader; + const UpdateTarget *targets[] = { + &target_component_updatable, + NULL + }; + + if (!gs_plugin_loader_get_enabled (plugin_loader, "systemd-sysupdate")) { + g_test_skip ("not enabled"); + return; + } + + /* latest version = v1 */ + { + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + g_autoptr(GsAppList) list_updates = NULL; + + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_updates = invoke_plugin_loader_list_apps_for_update_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + + g_assert_cmpstr (gs_app_get_version (gs_app_list_index (list_updates, 0)), + ==, "t.1"); + } + + /* latest version = v2 */ + targets[0] = &target_component_updatable_v2; + targets[1] = NULL; + { + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + g_autoptr(GsAppList) list_updates = NULL; + + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_updates = invoke_plugin_loader_list_apps_for_update_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + + g_assert_cmpstr (gs_app_get_version (gs_app_list_index (list_updates, 0)), + ==, "t.2"); + } +} + +/* Checks that the plugin can remove a stored target if it has been removed from + * the configuration. */ +static void +gs_plugin_systemd_sysupdate_metadata_target_removable_func (TestData *test_data) +{ + GsPluginLoader *plugin_loader = test_data->plugin_loader; + const UpdateTarget *targets[] = { + &target_component_available, + &target_component_installed, + &target_component_updatable, + NULL + }; + + if (!gs_plugin_loader_get_enabled (plugin_loader, "systemd-sysupdate")) { + g_test_skip ("not enabled"); + return; + } + + /* 1st setup, after refresh metadata there should have one app + * in the list */ + { + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + g_autoptr(GsAppList) list_updates = NULL; + + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_updates = invoke_plugin_loader_list_apps_for_update_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_updates), ==, 1); + } + + /* 2nd setup, after refresh metadata the list should become + * empty now */ + targets[0] = NULL; + { + g_auto(MockSysupdatedRegistrar) registrar = MOCK_SYSUPDATED_REGISTRAR_INIT; + g_autoptr(GsAppList) list_updates = NULL; + + mock_sysupdated_registrar_init (®istrar, test_data->web_port, &test_data->handle, targets); + invoke_plugin_loader_refresh_metadata_assert_no_error (plugin_loader); + list_updates = invoke_plugin_loader_list_apps_for_update_assert_no_error (plugin_loader); + g_assert_cmpint (gs_app_list_length (list_updates), ==, 0); + } +} + +int +main (int argc, char **argv) +{ + g_auto(MockSysupdatedService) service; + g_autoptr(GsPluginLoader) plugin_loader = NULL; + TestData test_data; + g_autoptr(GError) error = NULL; + gboolean ret; + const gchar * const allowlist[] = { + "systemd-sysupdate", + NULL, + }; + + gs_test_init (&argc, &argv); + g_setenv ("GS_XMLB_VERBOSE", "1", TRUE); + + /* setup test D-Bus, mock systemd-sysupdate service */ + mock_sysupdated_service_init (&service); + + /* We can only load this once per process. + * + * Although we only need to use the system bus in our test, the + * underlying `g_test_dbus_up()` will always override the environment + * variable `DBUS_SESSION_BUS_ADDRESS`. As a workaround, we also pass + * the connection created as the session bus to the `plugin-loader` to + * prevent it from setting up another session bus connection. */ + plugin_loader = gs_plugin_loader_new (service.handle.connection, + service.handle.connection); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR); + gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR_CORE); + ret = gs_plugin_loader_setup (plugin_loader, + allowlist, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_true (ret); + + test_data.handle = service.handle; + test_data.web_port = service.web_port; + test_data.plugin_loader = plugin_loader; + + /* plugin tests go here */ + + g_test_add_data_func ("/gnome-software/plugins/systemd-sysupdate/plugin-enabled", + &test_data, + (GTestDataFunc) gs_plugin_systemd_sysupdate_plugin_enabled_func); + g_test_add_data_func ("/gnome-software/plugins/systemd-sysupdate/distro-upgrade", + &test_data, + (GTestDataFunc) gs_plugin_systemd_sysupdate_distro_upgrade_func); + g_test_add_data_func ("/gnome-software/plugins/systemd-sysupdate/app-update-updatable", + &test_data, + (GTestDataFunc) gs_plugin_systemd_sysupdate_app_update_updatable_func); + g_test_add_data_func ("/gnome-software/plugins/systemd-sysupdate/app-update-trackable", + &test_data, + (GTestDataFunc) gs_plugin_systemd_sysupdate_app_update_trackable_func); + g_test_add_data_func ("/gnome-software/plugins/systemd-sysupdate/app-update-recoverable", + &test_data, + (GTestDataFunc) gs_plugin_systemd_sysupdate_app_update_recoverable_func); + g_test_add_data_func ("/gnome-software/plugins/systemd-sysupdate/app-update-cancellable", + &test_data, + (GTestDataFunc) gs_plugin_systemd_sysupdate_app_update_cancellable_func); + g_test_add_data_func ("/gnome-software/plugins/systemd-sysupdate/metadata-target-updatable", + &test_data, + (GTestDataFunc) gs_plugin_systemd_sysupdate_metadata_target_updatable_func); + g_test_add_data_func ("/gnome-software/plugins/systemd-sysupdate/metadata-target-removable", + &test_data, + (GTestDataFunc) gs_plugin_systemd_sysupdate_metadata_target_removable_func); + + return g_test_run (); +} diff --git a/plugins/systemd-sysupdate/meson.build b/plugins/systemd-sysupdate/meson.build new file mode 100644 index 0000000..3b7ad04 --- /dev/null +++ b/plugins/systemd-sysupdate/meson.build @@ -0,0 +1,61 @@ +# +# Copyright (c) 2024 Codethink Limited +# Copyright (c) 2024 GNOME Foundation +# +# SPDX-License-Identifier: GPL-2.0-or-later +# + +cargs = ['-DG_LOG_DOMAIN="GsPluginSystemdSysupdate"'] + +systemd_sysupdated_generated = gnome.gdbus_codegen( + 'gs-systemd-sysupdated-generated', + sources : ['org.freedesktop.sysupdate1.xml'], + interface_prefix : 'org.freedesktop.sysupdate1', + namespace : 'GsSystemdSysupdate', + extra_args : [ '--glib-min-required=' + glib.version() ], +) + +shared_module( + 'gs_plugin_systemd-sysupdate', + systemd_sysupdated_generated, + sources : [ + 'gs-plugin-systemd-sysupdate.c', + ], + include_directories : [ + include_directories('../..'), + include_directories('../../lib'), + ], + install : true, + install_dir: plugin_dir, + c_args : cargs, + dependencies : plugin_libs, +) + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"'] + cargs += ['-DLOCALPLUGINDIR_CORE="' + meson.current_build_dir() + '/../core"'] + + e = executable( + 'gs-self-test-systemd-sysupdate', + systemd_sysupdated_generated, + compiled_schemas, + sources : [ + 'gs-self-test.c' + ], + include_directories : [ + include_directories('../..'), + include_directories('../../lib'), + ], + dependencies : [ + plugin_libs, + ], + c_args : cargs, + ) + test('gs-self-test-systemd-sysupdate', e, suite: ['plugins', 'systemd-sysupdate'], env: test_env) + + subdir('services') +endif diff --git a/plugins/systemd-sysupdate/org.freedesktop.sysupdate1.xml b/plugins/systemd-sysupdate/org.freedesktop.sysupdate1.xml new file mode 100644 index 0000000..032b459 --- /dev/null +++ b/plugins/systemd-sysupdate/org.freedesktop.sysupdate1.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + diff --git a/plugins/systemd-sysupdate/services/meson.build b/plugins/systemd-sysupdate/services/meson.build new file mode 100644 index 0000000..ea01b62 --- /dev/null +++ b/plugins/systemd-sysupdate/services/meson.build @@ -0,0 +1,17 @@ +# +# Copyright (c) 2024 Codethink Limited +# Copyright (c) 2024 GNOME Foundation +# +# SPDX-License-Identifier: GPL-2.0-or-later +# + +service_file = 'org.freedesktop.sysupdate1.service' + +cdata = configuration_data() +cdata.set('abs_top_builddir', meson.project_build_root()) + +configure_file( + input: service_file + '.in', + output: service_file, + configuration: cdata, +) diff --git a/plugins/systemd-sysupdate/services/org.freedesktop.sysupdate1.service.in b/plugins/systemd-sysupdate/services/org.freedesktop.sysupdate1.service.in new file mode 100644 index 0000000..5d17bdc --- /dev/null +++ b/plugins/systemd-sysupdate/services/org.freedesktop.sysupdate1.service.in @@ -0,0 +1,10 @@ +# +# Copyright (c) 2024 Codethink Limited +# Copyright (c) 2024 GNOME Foundation +# +# SPDX-License-Identifier: GPL-2.0-or-later +# + +[D-BUS Service] +Name=org.freedesktop.sysupdate1 +Exec=/bin/true diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..4536d96 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,71 @@ +ab +af +ar +as +be +bg +bn +bs +ca +ca@valencia +ckb +cs +da +de +el +en_GB +eo +es +eu +fa +fi +fil +fr +fur +ga +gd +gl +he +hi +hr +hu +id +ie +is +it +ja +ka +kab +kk +km +ko +lt +lv +mjw +ml +mr +ms +nb +ne +nl +oc +pa +pl +pt +pt_BR +ro +ru +sk +sl +sr +sr@latin +sv +te +th +tr +uk +uz +vi +zh_CN +zh_HK +zh_TW diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..71aa486 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,132 @@ +data/metainfo/org.gnome.Software.metainfo.xml.in +data/org.gnome.software.dkms-helper.policy.in.in +data/org.gnome.software.external-appstream.policy.in.in +data/org.gnome.software.gschema.xml +gs-install-appstream/gs-install-appstream.c +src/gnome-software-local-file-flatpak.desktop.in +src/gnome-software-local-file-fwupd.desktop.in +src/gnome-software-local-file-packagekit.desktop.in +src/gnome-software-local-file-snap.desktop.in +src/gs-age-rating-context-dialog.c +src/gs-age-rating-context-dialog.ui +lib/gs-app.c +src/gs-app-addon-row.c +src/gs-app-addon-row.ui +src/gs-app-details-page.c +src/gs-app-details-page.ui +src/gs-app-reviews-dialog.c +src/gs-app-reviews-dialog.ui +src/gs-app-version-history-dialog.ui +src/gs-app-version-history-row.c +src/gs-app-version-history-row.ui +src/gs-application.c +src/gs-app-context-bar.c +src/gs-app-context-bar.ui +src/gs-app-row.c +src/gs-app-row.ui +src/gs-app-tile.c +src/gs-app-translation-dialog.c +src/gs-app-translation-dialog.ui +src/gs-basic-auth-dialog.c +src/gs-basic-auth-dialog.ui +lib/gs-category.c +src/gs-category-page.c +src/gs-category-page.ui +lib/gs-cmd.c +src/gs-common.c +lib/gs-desktop-data.c +src/gs-dbus-helper.c +src/gs-description-box.c +src/gs-details-page.c +src/gs-details-page.ui +src/gs-dkms-dialog.c +src/gs-dkms-dialog.ui +lib/gs-external-appstream-utils.c +src/gs-extras-page.c +src/gs-extras-page.ui +src/gs-feature-tile.c +src/gs-featured-carousel.c +src/gs-featured-carousel.ui +src/gs-hardware-support-context-dialog.c +src/gs-hardware-support-context-dialog.ui +src/gs-help-overlay.ui +src/gs-installed-page.c +src/gs-installed-page.ui +src/gs-license-tile.c +src/gs-license-tile.ui +src/gs-loading-page.c +src/gs-loading-page.ui +src/gs-main.c +lib/gs-odrs-provider.c +src/gs-origin-popover-row.c +src/gs-origin-popover-row.ui +src/gs-os-update-page.c +src/gs-os-update-page.ui +src/gs-overview-page.c +src/gs-overview-page.ui +lib/gs-plugin-loader.c +src/gs-page.c +src/gs-prefs-dialog.ui +src/gs-removal-dialog.c +src/gs-removal-dialog.ui +src/gs-remove-app-dialog.ui +src/gs-repos-dialog.c +src/gs-repos-dialog.ui +src/gs-repo-row.c +src/gs-repo-row.ui +src/gs-review-dialog.c +src/gs-review-dialog.ui +src/gs-review-histogram.c +src/gs-review-histogram.ui +src/gs-review-row.c +src/gs-review-row.ui +src/gs-safety-context-dialog.c +src/gs-safety-context-dialog.ui +src/gs-screenshot-carousel.ui +src/gs-screenshot-image.c +src/gs-screenshot-image.ui +src/gs-search-page.c +src/gs-search-page.ui +src/gs-shell.c +src/gs-shell.ui +src/gs-shell-search-provider.c +src/gs-star-widget.ui +src/gs-storage-context-dialog.c +src/gs-storage-context-dialog.ui +src/gs-summary-tile.c +src/gs-summary-tile.ui +src/gs-toast.c +src/gs-update-dialog.c +src/gs-update-dialog.ui +src/gs-update-list.c +src/gs-update-monitor.c +src/gs-updates-page.c +src/gs-updates-page.ui +src/gs-updates-paused-banner.c +src/gs-updates-section.c +src/gs-updates-section.ui +src/gs-upgrade-banner.c +src/gs-upgrade-banner.ui +src/gs-utils-error-dialog-simple.ui +lib/gs-utils.c +src/org.gnome.Software.desktop.in +plugins/dkms/gs-plugin-dkms.c +plugins/core/gs-plugin-generic-updates.c +plugins/eos-updater/gs-plugin-eos-updater.c +plugins/epiphany/gs-plugin-epiphany.c +plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in +plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c +plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in +plugins/flatpak/gs-flatpak.c +plugins/flatpak/gs-flatpak-utils.c +plugins/flatpak/gs-plugin-flatpak.c +plugins/fwupd/gs-fwupd-app.c +plugins/fwupd/gs-plugin-fwupd.c +plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in +plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c +plugins/packagekit/gs-packagekit-task.c +plugins/packagekit/gs-plugin-packagekit.c +plugins/rpm-ostree/gs-plugin-rpm-ostree.c +plugins/snap/gs-plugin-snap.c +plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in +plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c diff --git a/po/POTFILES.skip b/po/POTFILES.skip new file mode 100644 index 0000000..541b073 --- /dev/null +++ b/po/POTFILES.skip @@ -0,0 +1 @@ +subprojects diff --git a/po/ab.po b/po/ab.po new file mode 100644 index 0000000..d6774a6 --- /dev/null +++ b/po/ab.po @@ -0,0 +1,8938 @@ +msgid "" +msgstr "" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2022-09-22 16:06+0000\n" +"Last-Translator: Нанба Наала \n" +"Language-Team: Abkhazian \n" +"Language: ab\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/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:21 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2043 +#: src/gs-application.c:256 +msgid "The GNOME Project" +msgstr "The GNOME Project" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Арҿыцрақәа автоматикла рҭагалареи рықәыргылареи" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Автоматикла аҿыцрақәа рҭагалара алимиттә еимадараан" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Ацыхәтәантәи арҿыцра иазку адырраҭара аамҭалатәи адырга" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The last timestamp when the system was online and got any updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:71 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Иҭыҵуа аскриншот аиашашьа агәаҭаразы аамҭа аҭагылазаашьа секундала" + +#: data/org.gnome.software.gschema.xml:72 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The server to use for application reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:85 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:86 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" + +#: data/org.gnome.software.gschema.xml:98 +msgid "A list of official repositories that should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:102 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Allow access to the Software Repositories dialog" +msgstr "" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:122 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:126 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" + +#: data/org.gnome.software.gschema.xml:127 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap." +msgstr "" + +#: data/org.gnome.software.gschema.xml:146 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:143 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: gs-install-appstream/gs-install-appstream.c:145 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:152 +msgid "You need to specify exactly one filename" +msgstr "" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:159 +msgid "This program can only be used by the root user" +msgstr "" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:167 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:178 +#, c-format +msgid "Failed to move: %s" +msgstr "" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Арыжәтә" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Алахаларатә хәмаррақәа" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:658 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an application is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1023 +#, c-format +msgid "%s is suitable for everyone" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1027 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1031 +#, c-format +msgid "%s is suitable for young children" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1039 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1043 +#, c-format +msgid "%s is suitable for adults" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1048 +#, c-format +msgid "%s is suitable for %s" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:5 src/gs-app-context-bar.ui:211 +msgid "Age Rating" +msgstr "" + +#: src/gs-age-rating-context-dialog.ui:68 +#: src/gs-hardware-support-context-dialog.ui:71 +#: src/gs-safety-context-dialog.ui:221 +msgid "How to contribute missing information" +msgstr "" + +#: lib/gs-app.c:6175 +msgid "Local file" +msgstr "" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6194 src/gs-safety-context-dialog.c:439 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#: lib/gs-app.c:6271 +msgid "Package" +msgstr "Арзақә" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457 +msgid "Pending" +msgstr "" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369 +msgid "Pending install" +msgstr "" + +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376 +msgid "Pending remove" +msgstr "" + +#: src/gs-app-addon-row.c:111 src/gs-app-row.ui:197 src/gs-app-tile.ui:50 +#: src/gs-feature-tile.c:535 +msgctxt "Single app" +msgid "Installed" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:205 src/gs-details-page.c:362 +msgid "Installing" +msgstr "" + +#: src/gs-app-addon-row.c:119 +msgid "Removing" +msgstr "" + +#: src/gs-app-addon-row.ui:64 +msgid "_Uninstall" +msgstr "_Аныхра" + +#: src/gs-app-details-page.c:68 +msgid "Network" +msgstr "" + +#: src/gs-app-details-page.c:68 +msgid "Can communicate over the network" +msgstr "" + +#: src/gs-app-details-page.c:69 +msgid "System Services" +msgstr "" + +#: src/gs-app-details-page.c:69 +msgid "Can access D-Bus services on the system bus" +msgstr "" + +#: src/gs-app-details-page.c:70 +msgid "Session Services" +msgstr "" + +#: src/gs-app-details-page.c:70 +msgid "Can access D-Bus services on the session bus" +msgstr "" + +#: src/gs-app-details-page.c:71 +msgid "Devices" +msgstr "" + +#: src/gs-app-details-page.c:71 +msgid "Can access system device files" +msgstr "" + +#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73 +msgid "Home folder" +msgstr "" + +#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:74 +#: src/gs-app-details-page.c:77 src/gs-app-details-page.c:150 +msgid "Can view, edit and create files" +msgstr "" + +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:75 +#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:145 +msgid "Can view files" +msgstr "" + +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75 +msgid "File system" +msgstr "" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:77 src/gs-app-details-page.c:78 +msgid "Downloads folder" +msgstr "" + +#: src/gs-app-details-page.c:79 +msgid "Settings" +msgstr "" + +#: src/gs-app-details-page.c:79 +msgid "Can view and change any settings" +msgstr "" + +#: src/gs-app-details-page.c:80 +msgid "Legacy display system" +msgstr "" + +#: src/gs-app-details-page.c:80 +msgid "Uses an old, insecure display system" +msgstr "" + +#: src/gs-app-details-page.c:81 +msgid "Sandbox escape" +msgstr "аԥслымӡҭра" + +#: src/gs-app-details-page.c:81 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" + +#. FIXME support app == NULL +#. set window title +#: src/gs-app-details-page.c:166 +msgid "Update Details" +msgstr "" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:174 +msgid "No update description available." +msgstr "" + +#: src/gs-app-details-page.ui:25 src/gs-os-update-page.ui:25 +#: src/gs-shell.ui:367 src/gs-shell.ui:458 +msgid "Go back" +msgstr "Ахынҳәра" + +#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516 +msgid "Requires additional permissions" +msgstr "" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:855 +msgid "Reviews" +msgstr "" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No reviews were found for this application." +msgstr "" + +#: src/gs-app-reviews-dialog.ui:27 +msgid "No Reviews" +msgstr "" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533 +msgid "Version History" +msgstr "" + +#: src/gs-app-version-history-row.c:71 +#, c-format +msgid "New in Version %s" +msgstr "" + +#: src/gs-app-version-history-row.c:78 +#, c-format +msgid "Version %s" +msgstr "Аверсиа %s" + +#: src/gs-app-version-history-row.c:80 +msgid "No details for this release" +msgstr "" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:94 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %b. %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Арзақә алокалтә фаил аартра" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "" + +#: src/gs-application.c:143 +msgid "Show verbose debugging information" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "" + +#: src/gs-application.c:147 +msgid "Show update preferences" +msgstr "" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "" + +#: src/gs-application.c:261 src/gs-application.c:269 +msgid "Copyright © 2016–2022 GNOME Software contributors" +msgstr "Аԥҵаҩы изин © 2016-2022 Апрограмматә еиқәыршәара GNOME аҟаҵаҩцәа" + +#: src/gs-application.c:263 src/gs-application.c:272 +msgid "translator-credits" +msgstr "Нанба Наала , 2022" + +#. TRANSLATORS: this is the title of the about window +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-application.c:277 src/gs-shell.c:2149 +msgid "About Software" +msgstr "" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:280 +msgid "A nice way to manage the software on your system." +msgstr "" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:468 +msgid "Sorry! There are no details for that application." +msgstr "" + +#. Translators: The disk usage of an application when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Иаҿанакуеит %s адыррақәа насгьы %s кэш атәы" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Иаҿанакуеит %s адыррақәа" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Иаҿанакуеит %s кеш атәы" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "" + +#. Translators: The download size of an application. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:282 +msgid "No permissions" +msgstr "" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "Has network access" +msgstr "" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:300 +msgid "Uses system services" +msgstr "" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:307 +msgid "Uses session services" +msgstr "" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:314 +msgid "Can access hardware devices" +msgstr "" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:326 +msgid "Can read/write all your data" +msgstr "" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:338 +msgid "Can read all your data" +msgstr "" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:345 +msgid "Can read/write your downloads" +msgstr "" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can read your downloads" +msgstr "" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:359 +msgid "Can access arbitrary files" +msgstr "" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:366 src/gs-safety-context-dialog.c:227 +msgid "Can access and change user settings" +msgstr "" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:373 src/gs-safety-context-dialog.c:211 +msgid "Uses a legacy windowing system" +msgstr "" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:380 src/gs-safety-context-dialog.c:219 +msgid "Can acquire arbitrary permissions" +msgstr "" + +#. Translators: This indicates that an application has been packaged +#. * by the user’s distribution and is safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:406 src/gs-safety-context-dialog.c:146 +msgid "Reviewed by your distribution" +msgstr "" + +#. Translators: This indicates that an application has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:413 src/gs-safety-context-dialog.c:143 +msgid "Provided by a third party" +msgstr "" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 +msgid "Proprietary code" +msgstr "" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:431 +msgid "Auditable code" +msgstr "Аудио ззыруа акод" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:447 +msgid "Software no longer supported" +msgstr "" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#: src/gs-app-context-bar.c:459 src/gs-app-context-bar.c:730 +msgid "; " +msgstr "; " + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:467 +msgid "Safe" +msgstr "Ишәарҭам" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:474 +msgid "Potentially Unsafe" +msgstr "" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:481 +msgid "Unsafe" +msgstr "" + +#: src/gs-app-context-bar.c:560 src/gs-app-context-bar.c:592 +#: src/gs-hardware-support-context-dialog.c:603 +msgid "Mobile Only" +msgstr "" + +#: src/gs-app-context-bar.c:561 +msgid "Only works on a small screen" +msgstr "" + +#: src/gs-app-context-bar.c:566 src/gs-app-context-bar.c:599 +#: src/gs-app-context-bar.c:606 src/gs-app-context-bar.c:656 +#: src/gs-app-context-bar.c:661 src/gs-hardware-support-context-dialog.c:583 +msgid "Desktop Only" +msgstr "" + +#: src/gs-app-context-bar.c:567 +msgid "Only works on a large screen" +msgstr "" + +#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621 +msgid "Screen Size Mismatch" +msgstr "" + +#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622 +msgid "Doesn’t support your current screen size" +msgstr "" + +#: src/gs-app-context-bar.c:593 src/gs-hardware-support-context-dialog.c:674 +#: src/gs-hardware-support-context-dialog.c:680 +msgid "Requires a touchscreen" +msgstr "" + +#: src/gs-app-context-bar.c:600 src/gs-hardware-support-context-dialog.c:634 +#: src/gs-hardware-support-context-dialog.c:640 +msgid "Requires a keyboard" +msgstr "" + +#: src/gs-app-context-bar.c:607 +msgid "Requires a mouse" +msgstr "" + +#: src/gs-app-context-bar.c:618 +msgid "Gamepad Needed" +msgstr "" + +#: src/gs-app-context-bar.c:619 +msgid "Requires a gamepad to play" +msgstr "" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:643 +msgid "Adaptive" +msgstr "" + +#: src/gs-app-context-bar.c:644 +msgid "Works on phones, tablets and desktops" +msgstr "" + +#: src/gs-app-context-bar.c:657 +msgid "Probably requires a keyboard or mouse" +msgstr "" + +#: src/gs-app-context-bar.c:662 +msgid "Works on desktops and laptops" +msgstr "" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:705 +msgid "Contains no age-inappropriate content" +msgstr "" + +#: src/gs-app-context-bar.c:753 +msgid "No age rating information available" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:153 +msgid "Visit Website" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:159 +msgid "Install…" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:167 src/gs-updates-section.ui:62 +msgid "Cancel" +msgstr "Аԥыхры" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:175 src/gs-common.c:286 src/gs-page.c:374 +msgid "Install" +msgstr "" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:183 +msgid "Update" +msgstr "_Арҿыцра" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: button text in the header when an application can be erased +#. TRANSLATORS: this is button text to remove the application +#: src/gs-app-row.c:188 src/gs-app-row.c:198 src/gs-details-page.ui:281 +#: src/gs-page.c:549 +msgid "Uninstall" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#: src/gs-app-row.c:212 +msgid "Uninstalling" +msgstr "" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:327 +msgid "Device cannot be used during update." +msgstr "" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:337 src/gs-shell-search-provider.c:264 +#, c-format +msgid "Source: %s" +msgstr "" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:523 +#, c-format +msgid "Renamed from %s" +msgstr "" + +#. Translators: The placeholder is an application name +#: src/gs-app-translation-dialog.c:67 +#, c-format +msgid "Help Translate %s" +msgstr "" + +#. Translators: The placeholder is an application name +#: src/gs-app-translation-dialog.c:70 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"volunteers.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" + +#: src/gs-app-translation-dialog.ui:5 +msgid "Translations" +msgstr "" + +#: src/gs-app-translation-dialog.ui:92 +msgid "_Translation Website" +msgstr "" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:13 +msgid "Login Required" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:21 src/gs-common.c:612 +#: src/gs-details-page.ui:294 src/gs-removal-dialog.ui:17 +#: src/gs-review-dialog.ui:18 +msgid "_Cancel" +msgstr "_Аԥыхра" + +#: src/gs-basic-auth-dialog.ui:35 +msgid "_Login" +msgstr "_Аҭалара" + +#: src/gs-basic-auth-dialog.ui:88 +msgid "_User" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:107 +msgid "_Password" +msgstr "_Ажәамаӡа" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Егьырҭ" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:41 src/gs-overview-page.ui:106 +msgid "Editor’s Choice" +msgstr "" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:129 +msgid "New & Updated" +msgstr "" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:97 +msgid "Picks from the Web" +msgstr "" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:125 +msgid "Other Software" +msgstr "" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:194 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "" + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:266 +msgid "Choose an application:" +msgstr "" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Аҿакра" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:68 src/gs-common.c:91 +#, c-format +msgid "%s is now installed" +msgstr "" + +#. TRANSLATORS: an application has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:72 src/gs-common.c:95 +msgid "A restart is required for the changes to take effect." +msgstr "" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:76 +msgid "Application is ready to be used." +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "System updates are now installed" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:87 +msgid "Recently installed updates are available to review" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:106 src/gs-common.c:775 +msgid "Restart" +msgstr "Ханатә алагара" + +#: src/gs-common.c:112 +msgid "Launch" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:218 +msgid "Install Third-Party Software?" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:222 src/gs-repos-dialog.c:168 +msgid "Enable Third-Party Software Repository?" +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:240 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:250 +#, c-format +msgid "%s is provided by “%s”." +msgstr "" + +#: src/gs-common.c:259 +msgid "This software repository must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:269 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:275 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:282 +msgid "Don’t Warn Again" +msgstr "Уаҳа агәҽанымҵара" + +#. TRANSLATORS: button text +#: src/gs-common.c:291 +msgid "Enable and Install" +msgstr "Аҿакреи ашьақәыргылареи" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:493 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72 +msgid "Details" +msgstr "" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:600 +msgid "_Accept" +msgstr "" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:750 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: we've just removed some apps +#: src/gs-common.c:760 +msgid "An application has been removed" +msgid_plural "Applications have been removed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:766 +msgid "A restart is required for it to take effect." +msgid_plural "A restart is required for them to take effect." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: button text +#: src/gs-common.c:773 +msgid "Not Now" +msgstr "" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:869 +msgid "Just now" +msgstr "" + +#: src/gs-common.c:871 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:875 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:879 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:883 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:887 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:891 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1255 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An application" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "" + +#: src/gs-description-box.c:67 src/gs-description-box.c:269 +msgid "_Show More" +msgstr "" + +#: src/gs-description-box.c:67 +msgid "_Show Less" +msgstr "" + +#: src/gs-details-page.c:357 +msgid "Removing…" +msgstr "" + +#: src/gs-details-page.c:367 +msgid "Requires restart to finish install" +msgstr "" + +#: src/gs-details-page.c:374 +msgid "Requires restart to finish remove" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:391 +msgid "Pending installation…" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:398 +msgid "Pending update…" +msgstr "" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:414 +msgid "Preparing…" +msgstr "Аҽазыҟаҵара..." + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:417 +msgid "Uninstalling…" +msgstr "" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#: src/gs-details-page.c:870 src/gs-details-page.c:896 +#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150 +msgid "_Install" +msgstr "_Ашьақәыргылара" + +#: src/gs-details-page.c:886 +msgid "_Restart" +msgstr "_Ханатә алагара" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:910 +msgid "_Install…" +msgstr "_Ашьақәыргылара" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1187 +#, c-format +msgid "Other Apps by %s" +msgstr "" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1570 +msgid "You need internet access to write a review" +msgstr "" + +#: src/gs-details-page.c:1732 src/gs-details-page.c:1748 +#, c-format +msgid "Unable to find “%s”" +msgstr "" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "" + +#: src/gs-details-page.ui:39 +msgid "Loading application details…" +msgstr "" + +#: src/gs-details-page.ui:77 +msgid "" +"This software is not available in your language and will appear in US " +"English." +msgstr "" + +#: src/gs-details-page.ui:83 +msgid "Help _Translate" +msgstr "" + +#. TRANSLATORS: A label for a button to execute the selected application. +#: src/gs-details-page.ui:244 +msgid "_Open" +msgstr "_Аартра" + +#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160 +msgid "_Update" +msgstr "_Арҿыцра" + +#: src/gs-details-page.ui:319 +msgid "Downloading" +msgstr "" + +#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135 +msgid "Add-ons" +msgstr "" + +#: src/gs-details-page.ui:467 +msgid "Selected add-ons will be installed with the application." +msgstr "" + +#: src/gs-details-page.ui:567 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" + +#: src/gs-details-page.ui:587 +msgid "Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:588 +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "" + +#: src/gs-details-page.ui:605 +msgid "No Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:606 +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "" + +#: src/gs-details-page.ui:624 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:641 +msgid "Software Repository Identified" +msgstr "" + +#: src/gs-details-page.ui:642 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" + +#: src/gs-details-page.ui:643 +msgid "Only use software repositories that you trust." +msgstr "" + +#: src/gs-details-page.ui:708 +msgid "No Metadata" +msgstr "" + +#: src/gs-details-page.ui:717 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" + +#: src/gs-details-page.ui:745 +msgid "Project _Website" +msgstr "Веб-асаит _апроекта" + +#: src/gs-details-page.ui:762 +msgid "_Donate" +msgstr "" + +#: src/gs-details-page.ui:779 +msgid "Contribute _Translations" +msgstr "" + +#: src/gs-details-page.ui:796 +msgid "_Report an Issue" +msgstr "" + +#: src/gs-details-page.ui:813 +msgid "_Help" +msgstr "_Аилыркаа" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:908 +msgid "_Write Review" +msgstr "_Ахцәажәара аҩра" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:945 +msgid "All Reviews" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:244 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:242 +msgid "Requested software not found" +msgstr "" + +#: src/gs-extras-page.c:244 +msgid "Failed to find requested software" +msgstr "" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:343 +#, c-format +msgid "%s not found" +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:347 +msgid "on the website" +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:354 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:358 src/gs-extras-page.c:369 src/gs-extras-page.c:380 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:365 src/gs-extras-page.c:387 +#, c-format +msgid "No applications are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:376 +#, c-format +msgid "%s is not available." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:391 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:398 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:402 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:409 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:413 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:435 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:481 +msgid "the documentation" +msgstr "" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the application name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:487 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:496 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "" + +#: src/gs-extras-page.c:874 +#, c-format +msgid "%s file format" +msgstr "" + +#: src/gs-extras-page.c:1254 +msgid "Unable to Find Requested Software" +msgstr "" + +#: src/gs-extras-page.ui:6 +msgid "Codecs page" +msgstr "" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Аԥхьатәи" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Ԥхьаҟа" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:577 +#: src/gs-hardware-support-context-dialog.c:586 +msgid "Desktop Support" +msgstr "ХК адкылара" + +#: src/gs-hardware-support-context-dialog.c:578 +#: src/gs-hardware-support-context-dialog.c:587 +msgid "Supports being used on a large screen" +msgstr "Идуу аекран аҟны ахархәара аднакылоит" + +#: src/gs-hardware-support-context-dialog.c:580 +msgid "Desktop Support Unknown" +msgstr "ХК адкылара еилкааӡам" + +#: src/gs-hardware-support-context-dialog.c:581 +msgid "Not enough information to know if large screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:584 +msgid "Requires a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:589 +msgid "Desktop Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:590 +msgid "Cannot be used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:597 +#: src/gs-hardware-support-context-dialog.c:606 +msgid "Mobile Support" +msgstr "Амобилтә еиҿартәырақәа рыдкылара" + +#: src/gs-hardware-support-context-dialog.c:598 +#: src/gs-hardware-support-context-dialog.c:607 +msgid "Supports being used on a small screen" +msgstr "Ихәыҷу аекран аҟны ахархәара аднакылоит" + +#: src/gs-hardware-support-context-dialog.c:600 +msgid "Mobile Support Unknown" +msgstr "Амобилтә еиҿартәырақәа рыдкылара еилкааӡам" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Not enough information to know if small screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:604 +msgid "Requires a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:609 +msgid "Mobile Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:610 +msgid "Cannot be used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:633 +#: src/gs-hardware-support-context-dialog.c:642 +msgid "Keyboard Support" +msgstr "Арыдыркыра адкылара" + +#: src/gs-hardware-support-context-dialog.c:636 +msgid "Keyboard Support Unknown" +msgstr "Арыдыркыра адкылара еилкааӡам" + +#: src/gs-hardware-support-context-dialog.c:637 +msgid "Not enough information to know if keyboards are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:639 +msgid "Keyboard Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:643 +msgid "Supports keyboards" +msgstr "Арыдыркырақәа аднакылоит" + +#: src/gs-hardware-support-context-dialog.c:645 +msgid "Keyboard Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:646 +msgid "Cannot be used with a keyboard" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:653 +#: src/gs-hardware-support-context-dialog.c:662 +msgid "Mouse Support" +msgstr "Аҳәынаԥ адкылара" + +#: src/gs-hardware-support-context-dialog.c:654 +#: src/gs-hardware-support-context-dialog.c:660 +msgid "Requires a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:656 +msgid "Mouse Support Unknown" +msgstr "Аҳәынаԥ адкылара еилкааӡам" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:659 +msgid "Mouse Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:663 +msgid "Supports mice and pointing devices" +msgstr "Аҳәынаԥқәеи арбагақәеи рыдкылара" + +#: src/gs-hardware-support-context-dialog.c:665 +msgid "Mouse Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:666 +msgid "Cannot be used with a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:673 +#: src/gs-hardware-support-context-dialog.c:682 +msgid "Touchscreen Support" +msgstr "Аҟьыснырратә екран адкылара" + +#: src/gs-hardware-support-context-dialog.c:676 +msgid "Touchscreen Support Unknown" +msgstr "Аҟьыснырратә екран адкылара" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:679 +msgid "Touchscreen Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:683 +msgid "Supports touchscreens" +msgstr "Акьыснырратә екранқәа аднакылоит" + +#: src/gs-hardware-support-context-dialog.c:685 +msgid "Touchscreen Not Supported" +msgstr " Акьыснырратә екран иаднакылаӡом" + +#: src/gs-hardware-support-context-dialog.c:686 +msgid "Cannot be used with a touchscreen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:699 +msgid "Gamepad Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:700 +msgid "Requires a gamepad" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:702 +msgid "Gamepad Support" +msgstr "Геимпад адкылара" + +#: src/gs-hardware-support-context-dialog.c:703 +msgid "Supports gamepads" +msgstr "Агеимпадқәа аднакылоит" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:712 +#, c-format +msgid "%s probably works on this device" +msgstr "" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:719 +#, c-format +msgid "%s works on this device" +msgstr "" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:726 +#, c-format +msgid "%s will not work properly on this device" +msgstr "" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:733 +#, c-format +msgid "%s will not work on this device" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:5 +msgid "Hardware Support" +msgstr "Амаҭәахә адкылара" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-installed-page.c:812 src/gs-shell.ui:307 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "" + +#: src/gs-installed-page.ui:6 +msgid "Installed page" +msgstr "" + +#: src/gs-installed-page.ui:55 +msgid "In Progress" +msgstr "Апроцесс аҟны" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:75 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Applications" +msgstr "Аԥшькәа" + +#: src/gs-installed-page.ui:95 +msgid "Web Applications" +msgstr "Веб-аԥшьқәа" + +#: src/gs-installed-page.ui:115 +msgid "System Applications" +msgstr "" + +#: src/gs-license-tile.c:96 +msgid "Community Built" +msgstr "" + +#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98 +msgid "_Get Involved" +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:114 +#, c-format +msgid "" +"This software is developed in the open by a community of volunteers, and " +"released under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This software is developed in the open by a community of volunteers, and " +"released under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" + +#: src/gs-license-tile.c:127 +msgid "Proprietary" +msgstr "" + +#: src/gs-license-tile.c:133 +msgid "_Learn More" +msgstr "_Еиҳаны адырра" + +#: src/gs-license-tile.c:135 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:56 +msgid "Downloading software catalog" +msgstr "" + +#: src/gs-loading-page.ui:6 +msgid "Loading page" +msgstr "" + +#: src/gs-loading-page.ui:11 +msgid "Starting up…" +msgstr "" + +#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256 +msgid "Automatic Updates Paused" +msgstr "Автоматикатә рҿыцрақәа аамҭала иаанкылоуп" + +#: src/gs-metered-data-dialog.ui:9 +msgid "" +"The current network is metered. Metered connections have data limits or " +"charges associated with them. To save data, automatic updates have therefore " +"been paused.\n" +"\n" +"Automatic updates will be resumed when an un­metered network becomes " +"available. Until then, it is still possible to manually install updates.\n" +"\n" +"Alternatively, if the current network has been in­correctly identified as " +"being metered, this setting can be changed." +msgstr "" + +#: src/gs-metered-data-dialog.ui:17 +msgid "Open Network _Settings" +msgstr "Аҳа_ахышәарақәа" + +#: src/gs-moderate-page.ui:6 +msgid "Moderate page" +msgstr "" + +#: src/gs-moderate-page.ui:71 +msgid "There are no reviews to moderate" +msgstr "" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:108 +msgid "Beta" +msgstr "" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:138 +msgid "User" +msgstr "" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:250 +msgid "Additions" +msgstr "" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:254 +msgid "Removals" +msgstr "" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:258 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:262 +msgid "Downgrades" +msgstr "" + +#. Translators: This is a clickable link on the third party repositories info bar. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:876 +msgid "selected external sources" +msgstr "" + +#. Translators: This is the third party repositories info bar. The %s is replaced with "selected external sources" link. +#: src/gs-overview-page.c:878 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included." +msgstr "" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:887 src/gs-repos-dialog.c:173 +msgid "Enable" +msgstr "Иаҿакуп" + +#. Translators: This is the title of the main page of the UI. +#. Translators: A label for a button to show all available software. +#: src/gs-overview-page.c:946 src/gs-shell.ui:294 +msgid "Explore" +msgstr "" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "" + +#: src/gs-overview-page.ui:35 +msgid "Enable Third Party Software Repositories?" +msgstr "" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:180 +msgid "Other Categories" +msgstr "" + +#: src/gs-overview-page.ui:221 +msgid "No Application Data Found" +msgstr "" + +#: lib/gs-plugin-loader.c:2825 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "" + +#: src/gs-page.c:274 +msgid "User declined installation" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:365 +#, c-format +msgid "Prepare %s" +msgstr "Аҽазыҟаҵара %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:518 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:522 +#, c-format +msgid "" +"All applications from %s will be uninstalled, and you will have to re-" +"install the repository to use them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:530 +#, c-format +msgid "Are you sure you want to uninstall %s?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:533 +#, c-format +msgid "" +"%s will be uninstalled, and you will have to install it to use it again." +msgstr "" + +#: src/gs-prefs-dialog.ui:5 +msgid "Update Preferences" +msgstr "Арҿыцрақәа рхышәарақәа " + +#: src/gs-prefs-dialog.ui:16 +msgid "" +"To avoid charges and network caps, software updates are not automatically " +"downloaded on mobile or metered connections." +msgstr "" + +#: src/gs-prefs-dialog.ui:19 +msgid "Automatic Updates" +msgstr "Автоматикатә рҿыцрақәа" + +#: src/gs-prefs-dialog.ui:20 +msgid "" +"Downloads and installs software updates in the background, when possible." +msgstr "" + +#: src/gs-prefs-dialog.ui:32 +msgid "Automatic Update Notifications" +msgstr "Автоматикала арҿыцрақәа рырдырра" + +#: src/gs-prefs-dialog.ui:33 +msgid "Show notifications when updates have been automatically installed." +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:89 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" + +#: src/gs-removal-dialog.ui:4 +msgid "Incompatible Software" +msgstr "" + +#: src/gs-removal-dialog.ui:23 +msgid "_Continue" +msgstr "_Ацҵара" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:239 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" + +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Аҿыхра" + +#. TRANSLATORS: this is button text to remove a repo +#: src/gs-repos-dialog.c:257 +msgid "_Remove" +msgstr "_Аныхра" + +#: src/gs-repos-dialog.c:508 +msgid "Enable New Repositories" +msgstr "" + +#: src/gs-repos-dialog.c:509 +msgid "Turn on new repositories when they are added." +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:518 +msgid "more information" +msgstr "Еиҳаны аинформациа" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:523 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "" + +#: src/gs-repos-dialog.c:528 +msgid "Fedora Third Party Repositories" +msgstr "" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:670 +msgid "the operating system" +msgstr "" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:728 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#. button in the info bar +#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88 +msgid "Software Repositories" +msgstr "" + +#: src/gs-repos-dialog.ui:53 +msgid "No Repositories" +msgstr "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repo-row.c:160 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repo-row.c:167 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repo-row.c:175 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repo-row.c:181 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repo-row.c:188 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "" +msgstr[1] "" + +#. Translators: The first '%s' is replaced with a text like '10 applications installed', +#. the second '%s' is replaced with installation kind, like in case of Flatpak 'User Installation'. +#: src/gs-repo-row.c:243 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:78 +msgid "Hate it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:82 +msgid "Don’t like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:86 +msgid "It’s OK" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:90 +msgid "Like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:94 +msgid "Love it" +msgstr "" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:118 +msgid "Please take more time writing the review" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:122 +msgid "Please choose a star rating" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:126 +msgid "The summary is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:130 +msgid "The summary is too long" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:134 +msgid "The description is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too long" +msgstr "" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:10 +msgid "Post Review" +msgstr "" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:26 +msgid "_Post" +msgstr "" + +#: src/gs-review-dialog.ui:56 +msgid "Rating" +msgstr "" + +#: src/gs-review-dialog.ui:88 +msgid "Summary" +msgstr "" + +#: src/gs-review-dialog.ui:97 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:119 +msgctxt "app review" +msgid "Review" +msgstr "" + +#: src/gs-review-dialog.ui:128 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "" + +#: src/gs-review-dialog.ui:156 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-review-histogram.ui:93 +msgid "out of 5 stars" +msgstr "" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:220 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:225 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:239 +msgid "Report Review?" +msgstr "" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:243 +msgid "Report" +msgstr "" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:84 +msgid "Was this review useful to you?" +msgstr "Ари ахцәажәара ахәарҭара амазма шәара шәзы?" + +#: src/gs-review-row.ui:100 +msgid "Yes" +msgstr "Ааи" + +#: src/gs-review-row.ui:108 +msgid "No" +msgstr "" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:116 +msgid "Meh" +msgstr "" + +#: src/gs-review-row.ui:128 +msgid "Report…" +msgstr "" + +#: src/gs-review-row.ui:137 +msgid "Remove…" +msgstr "" + +#: src/gs-safety-context-dialog.c:144 +msgid "Check that you trust the vendor, as the application isn’t sandboxed" +msgstr "" + +#: src/gs-safety-context-dialog.c:147 +msgid "" +"Application isn’t sandboxed but the distribution has checked that it is not " +"malicious" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:160 +msgid "No Permissions" +msgstr "" + +#: src/gs-safety-context-dialog.c:161 +msgid "App is fully sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:172 +msgid "Network Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:173 +msgid "Can access the internet" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Network Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:177 +msgid "Cannot access the internet" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:183 +msgid "Uses System Services" +msgstr "" + +#: src/gs-safety-context-dialog.c:184 +msgid "Can request data from system services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:191 +msgid "Uses Session Services" +msgstr "" + +#: src/gs-safety-context-dialog.c:192 +msgid "Can request data from session services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:203 +msgid "No Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:204 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:210 +msgid "Legacy Windowing System" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:218 +msgid "Arbitrary Permissions" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "User Settings" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:238 +msgid "Full File System Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:239 +msgid "Can read and write all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:247 +msgid "Home Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:248 +msgid "Can read and write all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:256 +msgid "Full File System Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:257 +msgid "Can read all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Home Folder Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:267 +msgid "Can read all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:276 +msgid "Download Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:277 +msgid "Can read and write all data in your downloads directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:288 +msgid "Download Folder Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:289 +msgid "Can read all data in your downloads directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:299 +msgid "Can read and write all data in the directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:310 +msgid "Can read all data in the directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:326 +msgid "No File System Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:327 +msgid "Cannot access the file system at all" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:341 +msgid "Proprietary Code" +msgstr "" + +#: src/gs-safety-context-dialog.c:342 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:345 +msgid "Auditable Code" +msgstr "" + +#: src/gs-safety-context-dialog.c:346 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:354 +msgid "App developer is verified" +msgstr "" + +#: src/gs-safety-context-dialog.c:355 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:366 +msgid "Insecure Dependencies" +msgstr "" + +#: src/gs-safety-context-dialog.c:367 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:376 +#, c-format +msgid "%s is safe" +msgstr "«%s» ишәарҭам" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:383 +#, c-format +msgid "%s is potentially unsafe" +msgstr "" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:390 +#, c-format +msgid "%s is unsafe" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:5 +msgid "Safety" +msgstr "Ашәарҭадара" + +#: src/gs-safety-context-dialog.ui:101 +msgid "License" +msgstr "Алицензия" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:141 +msgid "Source" +msgstr "Алагамҭатә текст" + +#: src/gs-safety-context-dialog.ui:181 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:205 +msgid "Outdated SDK version" +msgstr "" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "" + +#: src/gs-screenshot-carousel.ui:127 +msgid "No screenshot provided" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:362 src/gs-screenshot-image.c:419 +#: src/gs-screenshot-image.c:623 +msgid "Screenshot not found" +msgstr "" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:438 +msgid "Failed to load image" +msgstr "" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:651 +msgid "Screenshot size not found" +msgstr "" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:733 +msgid "Could not create cache" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:747 +msgid "Screenshot not valid" +msgstr "" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:797 +msgid "Screenshot not available" +msgstr "" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Аскриншот" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:180 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-search-page.ui:6 +msgid "Search page" +msgstr "" + +#: src/gs-search-page.ui:17 +msgid "Search for Apps" +msgstr "" + +#: src/gs-search-page.ui:46 +msgid "No Application Found" +msgstr "" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1199 src/gs-shell.c:1204 src/gs-shell.c:1219 +#: src/gs-shell.c:1223 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. Translators: The '%s' is replaced with an error message, which had been shortened. +#. The dots at the end are there to highlight that to the user. +#: src/gs-shell.c:1240 +#, c-format +msgid "%s…" +msgstr "%s…" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1275 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1281 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1288 src/gs-shell.c:1328 +msgid "Unable to download updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1293 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1301 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1306 +msgid "Unable to download updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1312 +msgid "Unable to download updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to download updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1320 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to get list of updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1379 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1391 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1397 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1403 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1408 +msgid "Unable to install: the application has an invalid format" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1418 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1424 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1437 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1452 +#, c-format +msgid "Unable to install %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1497 +#, c-format +msgid "Unable to update %s from %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1504 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1511 +#, c-format +msgid "Unable to install updates from %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1515 +#, c-format +msgid "Unable to install updates as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1520 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1534 +#, c-format +msgid "Unable to install updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1543 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1548 +#, c-format +msgid "Unable to install updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1556 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to install updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1575 +#, c-format +msgid "" +"Unable to install updates: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1584 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1590 +#, c-format +msgid "Unable to install updates: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1598 +#, c-format +msgid "Unable to update %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to install updates: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1615 +#, c-format +msgid "Unable to update %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1618 +#, c-format +msgid "Unable to install updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1660 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1665 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1673 +#, c-format +msgid "" +"Unable to upgrade to %s: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1681 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1688 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1700 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1706 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1712 +#, c-format +msgid "Unable to upgrade to %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1721 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1758 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1763 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1774 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1780 +#, c-format +msgid "Unable to remove %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1792 +#, c-format +msgid "Unable to remove %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1833 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1839 src/gs-shell.c:1887 src/gs-shell.c:1925 +#: src/gs-shell.c:1968 +msgid "Not enough disk space — free up some space and try again" +msgstr "" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1850 src/gs-shell.c:1898 src/gs-shell.c:1936 +#: src/gs-shell.c:1989 +msgid "Sorry, something went wrong" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1881 +msgid "Failed to install file: not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1884 +msgid "Failed to install file: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1919 +msgid "Failed to install: not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1922 +msgid "Failed to install: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1963 +#, c-format +msgid "Unable to contact %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'. +#: src/gs-shell.c:1973 +msgid "Software needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1977 +msgid "AC power is required" +msgstr "" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1980 +msgid "The battery level is too low" +msgstr "" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "" + +#: src/gs-shell.ui:12 +msgid "_Update Preferences" +msgstr "" + +#. button in the info bar +#: src/gs-shell.ui:98 +msgid "Examine Disk" +msgstr "" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-shell.ui:108 src/gs-updates-page.c:881 +msgid "Network Settings" +msgstr "Аҳа ахышәарақәа" + +#. button in the info bar +#: src/gs-shell.ui:118 +msgid "Restart Now" +msgstr "" + +#. button in the info bar +#: src/gs-shell.ui:128 +msgid "More Information" +msgstr "Инарҭбаау аинформациа" + +#: src/gs-shell.ui:189 +msgid "Search" +msgstr "Аҧшаара" + +#: src/gs-shell.ui:204 +msgid "Primary Menu" +msgstr "" + +#: src/gs-shell.ui:274 +msgid "Find Out _More" +msgstr "" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:328 +msgctxt "Header bar button for list of apps to be updated" +msgid "Updates" +msgstr "" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "" + +#: src/gs-storage-context-dialog.c:139 +msgid "Application Data" +msgstr "" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the application to run" +msgstr "" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the application" +msgstr "" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Аамҭала икешрку адыррақәа" + +#: src/gs-storage-context-dialog.c:172 +msgid "The application itself" +msgstr "" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this application" +msgstr "" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:5 +msgid "Storage" +msgstr "" + +#. Translators: Please do not translate the markup or link href +#: src/gs-storage-context-dialog.ui:69 +msgid "" +"Cached data can be cleared from the _application settings." +msgstr "" + +#: src/gs-summary-tile.c:118 +#, c-format +msgid "%s (Installed)" +msgstr "" + +#: src/gs-summary-tile.c:123 +#, c-format +msgid "%s (Installing)" +msgstr "" + +#: src/gs-summary-tile.c:128 +#, c-format +msgid "%s (Removing)" +msgstr "" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:65 src/gs-update-dialog.c:152 +msgid "Installed Updates" +msgstr "" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:131 +#, c-format +msgid "Installed on %s" +msgstr "" + +#: src/gs-update-dialog.ui:77 +msgid "No Updates Installed" +msgstr "" + +#: src/gs-update-monitor.c:213 +msgid "Software Updates Are Out of Date" +msgstr "" + +#: src/gs-update-monitor.c:214 +msgid "Please check for software updates." +msgstr "" + +#: src/gs-update-monitor.c:220 +msgid "Critical Software Update Ready to Install" +msgstr "" + +#: src/gs-update-monitor.c:221 +msgid "An important software update is ready to be installed." +msgstr "" + +#: src/gs-update-monitor.c:224 +msgid "Critical Software Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:225 +msgid "Important: critical software updates are waiting." +msgstr "" + +#: src/gs-update-monitor.c:231 +msgid "Software Updates Ready to Install" +msgstr "" + +#: src/gs-update-monitor.c:232 +msgid "Software updates are waiting and ready to be installed." +msgstr "" + +#: src/gs-update-monitor.c:238 +msgid "Software Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:239 +msgid "Please download waiting software updates." +msgstr "" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:355 +#, c-format +msgid "%u Application Updated — Restart Required" +msgid_plural "%u Applications Updated — Restart Required" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:361 +#, c-format +msgid "%u Application Updated" +msgid_plural "%u Applications Updated" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1 is an application name, e.g. Firefox +#: src/gs-update-monitor.c:372 +#, c-format +msgid "%s has been updated." +msgstr "%s рҿыцын." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:375 +msgid "Please restart the application." +msgstr "" + +#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox +#: src/gs-update-monitor.c:383 +#, c-format +msgid "%s and %s have been updated." +msgstr "" + +#. TRANSLATORS: at least one application needs restarting +#: src/gs-update-monitor.c:389 src/gs-update-monitor.c:408 +#, c-format +msgid "%u application requires a restart." +msgid_plural "%u applications require a restart." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox +#: src/gs-update-monitor.c:401 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s, %s насгьы %s алаҵаны" + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:671 src/gs-updates-page.ui:20 +msgid "Operating System Updates Unavailable" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:673 +msgid "Upgrade to continue receiving security updates." +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:728 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:732 +msgid "Software Upgrade Available" +msgstr "" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1137 +msgid "Software Updates Failed" +msgstr "" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1139 +msgid "An important operating system update failed to be installed." +msgstr "" + +#: src/gs-update-monitor.c:1140 +msgid "Show Details" +msgstr "" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1162 +msgid "System Upgrade Complete" +msgstr "" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1167 +#, c-format +msgid "Welcome to %s %s!" +msgstr "" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1173 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1177 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1188 +msgctxt "updates" +msgid "Review" +msgstr "" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1237 +msgid "Failed To Update" +msgstr "" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1242 +msgid "The system was already up to date." +msgstr "" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1247 +msgid "The update was cancelled." +msgstr "" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1252 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1257 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1262 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1266 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:247 +#, c-format +msgid "Last checked: %s" +msgstr "" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:559 +#, c-format +msgid "%s %s is no longer supported." +msgstr "%s %s уаҳа иаднакылом" + +#: src/gs-updates-page.c:563 +msgid "Your operating system is no longer supported." +msgstr "" + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:568 +msgid "This means that it does not receive security updates." +msgstr "" + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:572 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:849 +msgid "Charges May Apply" +msgstr "" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:853 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:857 +msgid "Check _Anyway" +msgstr "" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:873 +msgid "No Network" +msgstr "" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:877 +msgid "Internet access is required to check for updates." +msgstr "" + +#: src/gs-updates-page.c:1250 +msgid "Check for updates" +msgstr "" + +#: src/gs-updates-page.c:1286 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "" + +#: src/gs-updates-page.ui:6 +msgid "Updates page" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:82 +msgid "Loading Updates…" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:95 +msgid "This could take a while." +msgstr "" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:203 +msgid "Up to Date" +msgstr "Иактуалу" + +#: src/gs-updates-page.ui:242 +msgid "Use Mobile Data?" +msgstr "" + +#: src/gs-updates-page.ui:243 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#: src/gs-updates-page.ui:246 +msgid "_Check Anyway" +msgstr "_Уеизгьы агәаҭара" + +#: src/gs-updates-page.ui:262 +msgid "No Connection" +msgstr "" + +#: src/gs-updates-page.ui:263 +msgid "Go online to check for updates." +msgstr "" + +#: src/gs-updates-page.ui:266 +msgid "_Network Settings" +msgstr "" + +#: src/gs-updates-page.ui:295 +msgid "Error" +msgstr "" + +#: src/gs-updates-page.ui:296 +msgid "Updates are automatically managed." +msgstr "" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:312 +msgid "Restart & Update" +msgstr "" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-section.c:318 +msgid "Update All" +msgstr "" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:450 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:455 +msgid "Requires Restart" +msgstr "" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:460 +msgid "Application Updates" +msgstr "" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:465 +msgid "Device Firmware" +msgstr "" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72 +#: plugins/packagekit/gs-packagekit-task.c:155 +msgid "_Download" +msgstr "_Аҭагалара" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:90 +#, c-format +msgid "%s %s Available" +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "%s Available" +msgstr "" + +#: src/gs-upgrade-banner.c:143 +msgid "Learn about the new version" +msgstr "" + +#: src/gs-upgrade-banner.c:167 +msgid "Downloading…" +msgstr "" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:185 +#, c-format +msgid "%s of %s downloaded" +msgstr "" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:189 +#, c-format +msgid "%u%% downloaded" +msgstr "" + +#: src/gs-upgrade-banner.ui:42 +msgid "A major upgrade, with new features and added polish." +msgstr "" + +#: src/gs-upgrade-banner.ui:187 +msgid "_Restart & Upgrade" +msgstr "" + +#: src/gs-upgrade-banner.ui:201 +msgid "Remember to back up data and files before upgrading." +msgstr "" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:67 +msgid "System Updates" +msgstr "" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:72 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:155 +msgid "Downloading featured images…" +msgstr "" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:637 +#, c-format +msgid "%s update with new features and fixes." +msgstr "" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:970 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#: plugins/epiphany/gs-plugin-epiphany.c:498 +msgid "GNOME Web" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Веб-апшьқәа рыдкылара " + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257 +msgid "Downloading upgrade information…" +msgstr "" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:405 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Адкылара Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:313 +#, c-format +msgid "System folder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315 +#, c-format +msgid "Home subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:316 +msgid "Host system folders" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:317 +msgid "Host system configuration from /etc" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:318 +msgid "Desktop folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:318 +#, c-format +msgid "Desktop subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:319 +msgid "Documents folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:319 +#, c-format +msgid "Documents subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:320 +msgid "Music folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:320 +#, c-format +msgid "Music subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:321 +msgid "Pictures folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:321 +#, c-format +msgid "Pictures subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:322 +msgid "Public Share folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:322 +#, c-format +msgid "Public Share subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:323 +msgid "Videos folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:323 +#, c-format +msgid "Videos subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:324 +msgid "Templates folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:324 +#, c-format +msgid "Templates subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:325 +msgid "User cache folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:325 +#, c-format +msgid "User cache subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:326 +msgid "User configuration folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:326 +#, c-format +msgid "User configuration subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:327 +msgid "User data folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:327 +#, c-format +msgid "User data subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:328 +msgid "User runtime folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:328 +#, c-format +msgid "User runtime subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:386 +#, c-format +msgid "Filesystem access to %s" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1403 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:3580 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1037 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1051 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1317 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:134 +#, c-format +msgid "%s Device Update" +msgstr "" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:139 +#, c-format +msgid "%s System Update" +msgstr "" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:144 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:149 +#, c-format +msgid "%s ME Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:154 +#, c-format +msgid "%s Corporate ME Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:159 +#, c-format +msgid "%s Consumer ME Update" +msgstr "" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:165 +#, c-format +msgid "%s Controller Update" +msgstr "" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:171 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:176 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:181 +#, c-format +msgid "%s Configuration Update" +msgstr "" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:185 +#, c-format +msgid "%s Battery Update" +msgstr "" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:190 +#, c-format +msgid "%s Camera Update" +msgstr "" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:194 +#, c-format +msgid "%s TPM Update" +msgstr "" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:198 +#, c-format +msgid "%s Touchpad Update" +msgstr "" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:202 +#, c-format +msgid "%s Mouse Update" +msgstr "" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:206 +#, c-format +msgid "%s Keyboard Update" +msgstr "" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:210 +#, c-format +msgid "%s Storage Controller Update" +msgstr "" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:215 +#, c-format +msgid "%s Network Interface Update" +msgstr "" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:220 +#, c-format +msgid "%s Display Update" +msgstr "" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:225 +#, c-format +msgid "%s BMC Update" +msgstr "" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:230 +#, c-format +msgid "%s USB Receiver Update" +msgstr "" + +#: plugins/fwupd/gs-plugin-fwupd.c:1240 +msgid "Firmware" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "Install Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "Download Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "Update Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:159 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" + +#: plugins/packagekit/gs-plugin-packagekit.c:367 +msgid "Packages" +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690 +msgid "Operating System (OSTree)" +msgstr "" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Адкылара Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" + +#, fuzzy, c-format + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + +#, fuzzy + +#, fuzzy + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#, fuzzy diff --git a/po/af.po b/po/af.po new file mode 100644 index 0000000..df12719 --- /dev/null +++ b/po/af.po @@ -0,0 +1,5120 @@ +# Afrikaans translation for gnome-software. +# This file is distributed under the same license as the gnome-software package. +# Copyright (C) +# F Wolff , 2014. +# Pieter Schoeman , 2017, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2019-01-20 19:44+0000\n" +"PO-Revision-Date: 2019-01-21 12:35+0200\n" +"Last-Translator: Pieter Schalk Schoeman \n" +"Language-Team: Afrikaans \n" +"Language: af\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 2.2\n" +"X-Project-Style: gnome\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "GNOME Sagteware" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "Programbestuurder vir GNOME" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" +"Sagteware laat mens nuwe programme en uitbreidings vind en installeer en kan " +"ook reeds geïnstalleerde programme verwyder." + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" +"GNOME-sagteware stal uitgesoekte en populêre toepassings uit met nuttige " +"beskrywings en heelwat skermskote per toepassing. Toepassings kan ontdek " +"word deur deur die kategorielys te blaai of deur te soek. Mens kan ook die " +"stelsel bywerk met 'n vanlynbywerking." + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "Oorsigpaneel" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "Besonderhedepaneel" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "Geïnstalleerpaneel" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "Bywerkingspaneel" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "Die bywerkingsbesonderhede" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1241 +msgid "The GNOME Project" +msgstr "Die GNOME Projek" + +#: data/org.gnome.software.external-appstream.policy.in:11 +msgid "Install an appstream file into a system location" +msgstr "Installeer 'n appstream lêer na 'n stelselligging" + +#: data/org.gnome.software.external-appstream.policy.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Installeer tans 'n appstream lêer na 'n stelsel ligging" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "'n Lys versoenbare projekte" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Dit is 'n lys versoenbare projekte wat ons moet vertoon soos GNOME, KDE en " +"XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Of GNOME Sagteware bywerkings en opgraderings moet bestuur" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Indien gedeaktiveer sal GNOME Sagteware die bywerkingspaneel wegsteek, geen " +"outomatiese bywerkings doen nie en nooit oor opgraderings vra nie." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Laai bywerkings af en installeer hulle outomaties" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Of daar oor 'n mobiele netwerk outomaties verfris moet word" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Of dit die eerste keer is wat GNOME Sagteware gebruik word" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Vertoon ster graderings langs toepassings" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" + +#: data/org.gnome.software.gschema.xml:47 +msgid "A list of popular applications" +msgstr "'n lys populêre toepassings" + +#: data/org.gnome.software.gschema.xml:48 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "" + +#: data/org.gnome.software.gschema.xml:52 +msgid "The last update check timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:56 +msgid "The last upgrade notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:60 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: data/org.gnome.software.gschema.xml:64 +msgid "The last update timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:68 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:69 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:78 +msgid "The server to use for application reviews" +msgstr "Die bediener om te gebruik vir sagteware resensies" + +#: data/org.gnome.software.gschema.xml:82 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:83 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:87 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" + +#: data/org.gnome.software.gschema.xml:91 +msgid "A list of official repositories that should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:95 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:99 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:103 +msgid "Show the folder management UI" +msgstr "" + +#: data/org.gnome.software.gschema.xml:107 +msgid "Allow access to the Software Repositories dialog" +msgstr "" + +#: data/org.gnome.software.gschema.xml:111 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: data/org.gnome.software.gschema.xml:115 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:119 +msgid "Show the prompt to install nonfree software repositories" +msgstr "" + +#: data/org.gnome.software.gschema.xml:123 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:127 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" + +#: data/org.gnome.software.gschema.xml:128 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:132 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:136 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "" + +#: data/org.gnome.software.gschema.xml:140 +msgid "Enable GNOME Shell extensions repository" +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "Installeer sagteware" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Installeer gekose sagteware op die stelsel" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/gnome-software-local-file.desktop.in:10 +msgid "system-software-install" +msgstr "system-software-install" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "Kies almal" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "Kies geen" + +#: src/gnome-software.ui:38 +msgid "_Software Repositories" +msgstr "_Sagtewarebronnne" + +#: src/gnome-software.ui:43 +msgid "_Update Preferences" +msgstr "_Bywerk voorkeure" + +#: src/gnome-software.ui:52 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Sagteware" + +#: src/gnome-software.ui:68 src/gs-update-dialog.ui:20 +msgid "Go back" +msgstr "Gaan terug" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:100 +msgid "_All" +msgstr "_Alles" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gnome-software.ui:123 +msgid "_Installed" +msgstr "_Geïnstalleer" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gnome-software.ui:163 +msgid "_Updates" +msgstr "_Bywerkings" + +#: src/gnome-software.ui:232 +msgid "Search" +msgstr "Soek" + +#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos +#. TRANSLATORS: this refers to where the app came from +#: src/gnome-software.ui:276 src/gs-app-row.c:306 src/gs-details-page.ui:819 +msgid "Source" +msgstr "Bron" + +#. button in the info bar +#: src/gnome-software.ui:383 src/gs-repos-dialog.ui:5 src/gs-repos-dialog.ui:18 +msgid "Software Repositories" +msgstr "Sagtewarebronnne" + +#. button in the info bar +#: src/gnome-software.ui:391 +msgid "Examine Disk" +msgstr "Ondersoek skyf" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:399 src/gs-updates-page.c:935 +msgid "Network Settings" +msgstr "Netwerkinstellings" + +#. button in the info bar +#: src/gnome-software.ui:407 +msgid "Restart Now" +msgstr "Herbegin nou" + +#. button in the info bar +#: src/gnome-software.ui:415 +msgid "More Information" +msgstr "Meer inligting" + +#. TRANSLATORS: this is a locally downloaded package +#: lib/gs-app.c:4475 +msgid "Local file" +msgstr "Plaaslike lêer" + +#: lib/gs-app.c:4522 +msgid "Package" +msgstr "Pakket" + +#: src/gs-app-addon-row.c:96 src/gs-app-row.c:428 +msgid "Pending" +msgstr "Hangend" + +#: src/gs-app-addon-row.c:102 src/gs-app-row.ui:182 src/gs-app-tile.ui:51 +#: src/gs-feature-tile.c:86 +msgid "Installed" +msgstr "Geïnstalleer" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being installed +#: src/gs-app-addon-row.c:106 src/gs-app-row.c:185 src/gs-details-page.c:329 +#: src/gs-third-party-repo-row.c:113 +msgid "Installing" +msgstr "Installeer tans" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being removed +#: src/gs-app-addon-row.c:110 src/gs-app-row.c:191 src/gs-repo-row.c:140 +#: src/gs-third-party-repo-row.c:120 +msgid "Removing" +msgstr "Verwyder tans" + +#: src/gs-app-folder-dialog.c:310 +msgid "Folder Name" +msgstr "Gidsnaam" + +#: src/gs-app-folder-dialog.c:321 src/gs-app-folder-dialog.ui:16 +#: src/gs-details-page.ui:240 src/gs-editor.c:623 src/gs-editor.c:655 +#: src/gs-installed-page.c:612 src/gs-removal-dialog.ui:32 +#: src/gs-review-dialog.ui:22 src/gs-upgrade-banner.ui:112 +msgid "_Cancel" +msgstr "_Kanselleer" + +#: src/gs-app-folder-dialog.c:326 src/gs-app-folder-dialog.ui:24 +msgid "_Add" +msgstr "_Voeg by" + +#: src/gs-app-folder-dialog.ui:5 +msgid "Add to Application Folder" +msgstr "Voeg by toepassinggids" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:123 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Beginmodus: of ‘updates’, ‘updated’, ‘installed’ of ‘overview’" + +#: src/gs-application.c:123 +msgid "MODE" +msgstr "MODUS" + +#: src/gs-application.c:125 +msgid "Search for applications" +msgstr "Soek vir toepassings" + +#: src/gs-application.c:125 +msgid "SEARCH" +msgstr "SOEK" + +#: src/gs-application.c:127 +msgid "Show application details (using application ID)" +msgstr "Wys toepassingsbesonderhede (gebruik toepassing ID)" + +#: src/gs-application.c:127 src/gs-application.c:131 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:129 +msgid "Show application details (using package name)" +msgstr "Wys toepassingsbesonderhede (gebruik tepassingsnaam)" + +#: src/gs-application.c:129 +msgid "PKGNAME" +msgstr "PAKKETNAAM" + +#: src/gs-application.c:131 +msgid "Install the application (using application ID)" +msgstr "Installeer die toepassing (gebruik toepassing id)" + +#: src/gs-application.c:133 +msgid "Open a local package file" +msgstr "Open 'n plaaslike pakketlêer" + +#: src/gs-application.c:133 +msgid "FILENAME" +msgstr "LÊERNAAM" + +#: src/gs-application.c:135 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Die tipe interaksie verwag vir die aksie: of ‘geen’, ‘stel in kennis’, of " +"‘vol’" + +#: src/gs-application.c:138 +msgid "Show verbose debugging information" +msgstr "Wys breedvoerige ontfoutingsinligting" + +#: src/gs-application.c:140 +msgid "Installs any pending updates in the background" +msgstr "" + +#: src/gs-application.c:142 +msgid "Show update preferences" +msgstr "" + +#: src/gs-application.c:144 +msgid "Quit the running instance" +msgstr "Sluit die lopende instansie af" + +#: src/gs-application.c:146 +msgid "Prefer local file sources to AppStream" +msgstr "Verkies plaaslike lêerbronne bo AppStream" + +#: src/gs-application.c:148 +msgid "Show version number" +msgstr "Wys weergawenommer" + +#: src/gs-application.c:342 +msgid "translator-credits" +msgstr "" +"Friedel Wolff\n" +"Pieter Schoeman" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#. TRANSLATORS: this is the menu item that opens the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:349 src/gs-shell.c:1958 +#, c-format +msgid "About %s" +msgstr "Aangaande %s" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:353 +msgid "A nice way to manage the software on your system." +msgstr "'n Maklike manier om sagteware op die stelsel te bestuur." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:140 +msgid "Visit website" +msgstr "Besoek webwerf" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:145 +msgid "Install…" +msgstr "Installeer…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:152 src/gs-auth-dialog.ui:44 src/gs-updates-section.c:501 +msgid "Cancel" +msgstr "Kanselleer" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:159 src/gs-common.c:285 src/gs-page.c:596 +msgid "Install" +msgstr "Installeer" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:166 +msgid "Update" +msgstr "Dateer op" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-app-row.c:170 src/gs-app-row.c:179 src/gs-page.c:755 +#: src/gs-repos-dialog.c:336 +msgid "Remove" +msgstr "Verwyder" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:296 +msgid "Device cannot be used during update." +msgstr "Toestel kan nie tydens die opdatering gebruik word nie." + +#: src/gs-app-row.c:496 src/gs-update-dialog.ui:182 +msgid "Requires additional permissions" +msgstr "Benodig addisionele toestemming" + +#: src/gs-auth-dialog.c:141 +msgid "Sign In / Register…" +msgstr "Teken in / Registreer…" + +#: src/gs-auth-dialog.c:148 +msgid "Continue" +msgstr "Gaan voort" + +#: src/gs-auth-dialog.c:155 +msgid "Use" +msgstr "Gebruik" + +#: src/gs-auth-dialog.ui:30 +msgid "Add another…" +msgstr "Voeg nog by…" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:194 +msgid "Other" +msgstr "Ander" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:199 +msgid "All" +msgstr "Alles" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:203 +msgid "Featured" +msgstr "Uitgesoek" + +#. TRANSLATORS: This is a heading on the categories page. %s gets +#. replaced by the category name, e.g. 'Graphics & Photography' +#: src/gs-category-page.c:494 +#, c-format +msgid "Featured %s" +msgstr "%s uitgesoek" + +#. Translators: A label for a button to sort apps by their rating. +#: src/gs-category-page.ui:26 +msgid "Top Rated" +msgstr "Top gegradeerde" + +#. Translators: A label for a button to sort apps alphabetically. +#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm" +#: src/gs-category-page.ui:32 src/gs-editor.ui:225 +#: src/gs-origin-popover-row.c:63 +msgid "Name" +msgstr "Naam" + +#. TRANSLATORS: A label for a button to show the settings for +#. the selected shell extension. +#: src/gs-category-page.ui:118 src/gs-details-page.c:894 +msgid "Extension Settings" +msgstr "Uitbreiding instellings" + +#: src/gs-category-page.ui:136 +msgid "" +"Extensions are used at your own risk. If you have any system problems, it is " +"recommended to disable them." +msgstr "" +"Uitbreidings word op u eie risiko gebruik. Indien u enige probleme ervaar " +"word dit aangeraai om hulle te deaktiveer." + +#. TRANSLATORS: This is a label for the category filter drop down, which all together can read e.g. 'Show Vector Graphics'. +#: src/gs-category-page.ui:156 +msgid "Show" +msgstr "Vertoon" + +#: src/gs-category-page.ui:173 +msgid "Subcategories filter menu" +msgstr "Subkategoriëe filter kieslys" + +#. TRANSLATORS: This is a label for the category sort drop down, which all together can read e.g. 'Sort Top Rated'. +#: src/gs-category-page.ui:204 +msgid "Sort" +msgstr "Sorteer" + +#: src/gs-category-page.ui:220 +msgid "Subcategories sorting menu" +msgstr "Subkategoriëe sorteer kieslys" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:204 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "Sleutel asseblief 'n nommer van 1 tot %u in: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:267 +msgid "Choose an application:" +msgstr "Kies 'n toepassing:" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:137 +msgid "OS updates are now installed" +msgstr "Bedryfstelselbywerkings is nou geïnstalleer" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:140 +msgid "Recently installed updates are available to review" +msgstr "Onlangs geïnstalleerde bywerkings is nou beskikbaar om na te gaan" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:145 src/gs-common.c:153 +#, c-format +msgid "%s is now installed" +msgstr "%s is nou geïnstalleer" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:148 +msgid "Application is ready to be used." +msgstr "Toepassing is reg om gebruik te word." + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:161 +msgid "Launch" +msgstr "Laat loop" + +#. TRANSLATORS: window title +#: src/gs-common.c:219 +msgid "Install Third-Party Software?" +msgstr "Installeer derdeparty-sagteware?" + +#. TRANSLATORS: window title +#: src/gs-common.c:223 src/gs-repos-dialog.c:247 +msgid "Enable Third-Party Software Repository?" +msgstr "Aktiveer derdeparty-sagtewarebronne?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:239 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s is nie vry en " +"oopbronsagteware nie, en word verskaf deur \"%s\"." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:249 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s word verskaf deur \"%s\"." + +#: src/gs-common.c:258 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Die sagtewarebron moet eers geaktiveer word voor die installasie kan " +"voortgaan." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:268 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Dit kan moontlik onwettig wees om %s te installeer en gebruik in sommige " +"lande." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:274 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Dit kan moontlik onwettig wees om die kodek te installeer en gebruik in " +"sommige lande." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:281 +msgid "Don’t Warn Again" +msgstr "Moet my nie weer waarsku nie" + +#. TRANSLATORS: button text +#: src/gs-common.c:290 +msgid "Enable and Install" +msgstr "Aktiveer en installeer" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:433 +msgid "Detailed errors from the package manager follow:" +msgstr "Gedetailleerde foute van die pakketbestuurder volg:" + +#: src/gs-common.c:452 src/gs-details-page.ui:417 +msgid "Details" +msgstr "Besonderhede" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:75 +msgid "No cartoon violence" +msgstr "Geen animasie geweld nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:78 +msgid "Cartoon characters in unsafe situations" +msgstr "Animasiekarakters in onveilige situasies" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "Cartoon characters in aggressive conflict" +msgstr "Animasiekarakters in aggressiewe konflik" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:84 +msgid "Graphic violence involving cartoon characters" +msgstr "Grafiese geweld met animasiekarakters" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "No fantasy violence" +msgstr "Geen fantasie geweld nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:90 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "" +"Karakters in onveilige situasies wat maklik onderskei kan word van die " +"werklikheid" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:93 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "" +"Karakters in aggressiewe konflik wat maklik onderskei kan word van die " +"werklikheid" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Graphic violence easily distinguishable from reality" +msgstr "Grafiese geweld wat maklik onderskei kan word van die werklikheid" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:99 +msgid "No realistic violence" +msgstr "Geen realistiese geweld nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:102 +msgid "Mildly realistic characters in unsafe situations" +msgstr "Effens realistiese karakters in onveilige situasies" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "Uitbeeldings van realistiese karakters in aggressiewe konflik" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:108 +msgid "Graphic violence involving realistic characters" +msgstr "Grafiese geweld met realistiese karakters" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:111 +msgid "No bloodshed" +msgstr "Geen bloedvergieting nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "Unrealistic bloodshed" +msgstr "Onrealistiese bloedvergieting" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:117 +msgid "Realistic bloodshed" +msgstr "Realistiese bloedvergieting" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:120 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "Uitbeeldings van bloedvergieting en die verminking van liggaamsdele" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:123 +msgid "No sexual violence" +msgstr "Geen seksuele geweld nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Rape or other violent sexual behavior" +msgstr "Verkragting of ander gewelddadige seksuele gedrag" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:129 +msgid "No references to alcohol" +msgstr "Geen verwysings na alkohol nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "References to alcoholic beverages" +msgstr "Verwysings na alkoholiese drankies" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:135 +msgid "Use of alcoholic beverages" +msgstr "Gebruik van alkoholiese drank" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:138 +msgid "No references to illicit drugs" +msgstr "Geen verwysings na onwettige dwelms" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:141 +msgid "References to illicit drugs" +msgstr "Verwysings na onwettige dwelms" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Use of illicit drugs" +msgstr "Gebruik van onwettige dwelms" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:147 +msgid "References to tobacco products" +msgstr "Verwysings na tabakprodukte" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:150 +msgid "Use of tobacco products" +msgstr "Gebruik van tabaksprodukte" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:153 +msgid "No nudity of any sort" +msgstr "Geen naaktheid van enige aard nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Brief artistic nudity" +msgstr "Kort kuns naaktheid" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:159 +msgid "Prolonged nudity" +msgstr "Langdurige naaktheid" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:162 +msgid "No references or depictions of sexual nature" +msgstr "Geen verwysings of uitbeeldings van 'n seksuele aard nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Provocative references or depictions" +msgstr "Aanloklike verwysings of afbeeldings" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:168 +msgid "Sexual references or depictions" +msgstr "Seksuele verwysings of afbeeldings" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:171 +msgid "Graphic sexual behavior" +msgstr "Grafiese seksuele gedrag" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No profanity of any kind" +msgstr "Geen vloek van enige aard nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:177 +msgid "Mild or infrequent use of profanity" +msgstr "Sagte of ongereelde gebruik van vloek" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Moderate use of profanity" +msgstr "Matige gebruik van vloek" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:183 +msgid "Strong or frequent use of profanity" +msgstr "Sterk of gereelde gebruik van vloek" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:186 +msgid "No inappropriate humor" +msgstr "Geen onvanpaste humor nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Slapstick humor" +msgstr "Slapstick humor" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:192 +msgid "Vulgar or bathroom humor" +msgstr "Onvanpaste of badkamer humor" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:195 +msgid "Mature or sexual humor" +msgstr "Volwasse of seksuele humor" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "No discriminatory language of any kind" +msgstr "Geen diskriminerende taal van enige aard nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:201 +msgid "Negativity towards a specific group of people" +msgstr "Negatiwiteit teenoor 'n spesifieke groep mense" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:204 +msgid "Discrimination designed to cause emotional harm" +msgstr "Diskriminasie bedoel om emosionele skade te veroorsaak" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "" +"Eksplisiete diskriminasie gebaseer op geslag, seksualiteit, ras of godsdiens" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:210 +msgid "No advertising of any kind" +msgstr "Geen advertensies van enige aard nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Product placement" +msgstr "Produk plasing" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:216 +msgid "Explicit references to specific brands or trademarked products" +msgstr "Verwysings na spesifieke handelsmerke" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:219 +msgid "Users are encouraged to purchase specific real-world items" +msgstr "Gebruikers word aangemoedig om spesifieke werklike items te koop" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:222 +msgid "No gambling of any kind" +msgstr "Geen dobbel van enige aard nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:225 +msgid "Gambling on random events using tokens or credits" +msgstr "Dobbel op sommige geleenthede deur gebruik te maak van krediete" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "Gambling using “play” money" +msgstr "Dobbel met \"speel\" geld" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:231 +msgid "Gambling using real money" +msgstr "Dobbel met regte geld" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "No ability to spend money" +msgstr "Geen vermoë om geld te spandeer nie" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:237 +msgid "Users are encouraged to donate real money" +msgstr "Spelers word aangemoedig om werklike geld te skenk" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:240 +msgid "Ability to spend real money in-game" +msgstr "Vermoë om geld te spandeer in die spel" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:243 +msgid "No way to chat with other users" +msgstr "Geen manier om met ander gebruikers te klets nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:246 +msgid "User-to-user game interactions without chat functionality" +msgstr "Gebruiker-na-gebruiker spelinteraksies sonder kletsfunksionaliteit" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:249 +msgid "Moderated chat functionality between users" +msgstr "Gemodereerde kletsfunksie tussen gebruikers" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:252 +msgid "Uncontrolled chat functionality between users" +msgstr "Onbeheerde kletsfunksie tussen gebruikers" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:255 +msgid "No way to talk with other users" +msgstr "Geen manier om met ander gebruikers te praat nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:258 +msgid "Uncontrolled audio or video chat functionality between users" +msgstr "Onbeheerde klank- of videokletsfunksies tussen gebruikers" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "No sharing of social network usernames or email addresses" +msgstr "Geen deel van sosiale netwerk gebruikersname of e-pos adresse nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:264 +msgid "Sharing social network usernames or email addresses" +msgstr "Deel van sosiale netwerk gebruikers name of e-pos adresse" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:267 +msgid "No sharing of user information with 3rd parties" +msgstr "Geen deel van gebruikersinligting met 3de partye nie" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "Checking for the latest application version" +msgstr "Kyk tans vir die nuutste weergawe van die toepassing" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:273 +msgid "Sharing diagnostic data that does not let others identify the user" +msgstr "Deel anonieme diagnostiese data" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:276 +msgid "Sharing information that lets others identify the user" +msgstr "" +"Deel inligting wat ander in staat sal kan stel om die gebruiker te " +"identifiseer" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:279 +msgid "No sharing of physical location to other users" +msgstr "Geen deel van fisiese ligging aan ander gebruikers nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:282 +msgid "Sharing physical location to other users" +msgstr "Deel fisiese ligging aan ander gebruikers" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:287 +msgid "No references to homosexuality" +msgstr "Geen verwysings na homoseksualiteit" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:290 +msgid "Indirect references to homosexuality" +msgstr "Indirekte verwysings na homoseksualiteit" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:293 +msgid "Kissing between people of the same gender" +msgstr "Soen tussen mense van dieselfde geslag" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:296 +msgid "Graphic sexual behavior between people of the same gender" +msgstr "Grafiese seksuele gedrag tussen mense van dieselfde geslag" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:299 +msgid "No references to prostitution" +msgstr "Geen verwysings na prostitusie nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:302 +msgid "Indirect references to prostitution" +msgstr "Indirekte verwysings na prostitusie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:305 +msgid "Direct references of prostitution" +msgstr "Direkte verwysings na prostitusie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:308 +msgid "Graphic depictions of the act of prostitution" +msgstr "Grafiese uitbeeldings van die daad van prostitusie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:311 +msgid "No references to adultery" +msgstr "Geen verwysings na owerspel nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:314 +msgid "Indirect references to adultery" +msgstr "Indirekte verwysings na owerspel" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:317 +msgid "Direct references of adultery" +msgstr "Direkte verwysings na owerspel" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:320 +msgid "Graphic depictions of the act of adultery" +msgstr "Grafiese uitbeeldings van die daad van owerspel" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:323 +msgid "No sexualized characters" +msgstr "Geen seksuele karakters nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:326 +msgid "Scantily clad human characters" +msgstr "Skraps geklede menslike karakters" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:329 +msgid "Overtly sexualized human characters" +msgstr "Uitermatige seksuele menslike karakters" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:332 +msgid "No references to desecration" +msgstr "Geen verwysings na ontheiliging nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:335 +msgid "Depictions or references to historical desecration" +msgstr "Uitbeeldings of verwysings na historiese ontheiliging" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:338 +msgid "Depictions of modern-day human desecration" +msgstr "Uitbeeldings van moderne menslike ontheiliging" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:341 +msgid "Graphic depictions of modern-day desecration" +msgstr "Grafiese uitbeeldings van moderne ontheiliging" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:344 +msgid "No visible dead human remains" +msgstr "Geen sigbare dooie menslike oorskot" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:347 +msgid "Visible dead human remains" +msgstr "Sigbare dooie menslike oorskot" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:350 +msgid "Dead human remains that are exposed to the elements" +msgstr "Dooie menslike oorskot wat aan die elemente blootgestel is" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:353 +msgid "Graphic depictions of desecration of human bodies" +msgstr "Grafiese uitbeeldings van die ontheiliging van menslike liggame" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:356 +msgid "No references to slavery" +msgstr "Geen verwysings na slawerny nie" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:359 +msgid "Depictions or references to historical slavery" +msgstr "Uitbeeldings of verwysings na historiese slawerny" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:362 +msgid "Depictions of modern-day slavery" +msgstr "Uitbeeldings van modererende slawerny" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:365 +msgid "Graphic depictions of modern-day slavery" +msgstr "Grafiese uitbeeldings van modererende slawerny" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:295 +msgid "An application" +msgstr "'n Toepassing" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:301 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s vra addisionele lêerformaat ondersteuning aan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:303 +msgid "Additional MIME Types Required" +msgstr "Addisionele MIME-tipes benodig" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:307 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s vra addisionele lettertipes aan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:309 +msgid "Additional Fonts Required" +msgstr "Addisionele lettertipes benodig" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:313 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s vra addisionele multimediakodeks aan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:315 +msgid "Additional Multimedia Codecs Required" +msgstr "Addisionele multimediakodeks benodig" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:319 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s vra addisionele drukkeraandrywers aan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:321 +msgid "Additional Printer Drivers Required" +msgstr "Addisionele drukkeraandrywers benodig" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:325 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s vra addisionele pakkette aan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:327 +msgid "Additional Packages Required" +msgstr "Addisionele pakkette benodig" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:336 +msgid "Find in Software" +msgstr "Vind in Sagteware" + +#: src/gs-details-page.c:324 +msgid "Removing…" +msgstr "Verwyder tans…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:343 +msgid "Pending installation…" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:350 +msgid "Pending update…" +msgstr "Hangende bywerkings…" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:671 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" +"Dié toepassing kan slegs gebruik word wanneer daar 'n werkende " +"internetverbinding is." + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo +#: src/gs-details-page.c:819 src/gs-details-page.c:847 +#: src/gs-details-page.ui:159 src/gs-third-party-repo-row.c:97 +#: src/gs-upgrade-banner.ui:122 +msgid "_Install" +msgstr "_Installeer" + +#. TRANSLATORS: button text in the header when an application +#. * can be live-updated +#: src/gs-details-page.c:852 +msgid "_Update" +msgstr "_Opdateer" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo. +#. The ellipsis indicates that further steps are required +#: src/gs-details-page.c:865 src/gs-third-party-repo-row.c:89 +msgid "_Install…" +msgstr "_Installeer…" + +#. TRANSLATORS: A label for a button to execute the selected +#. application. +#: src/gs-details-page.c:899 +msgid "_Launch" +msgstr "_Laat loop" + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:924 src/gs-details-page.ui:184 +msgid "_Remove" +msgstr "Ve_rwyder" + +#: src/gs-details-page.c:956 src/gs-update-dialog.c:106 +msgid "Network" +msgstr "Netwerk" + +#: src/gs-details-page.c:956 src/gs-update-dialog.c:106 +msgid "Can communicate over the network" +msgstr "" + +#: src/gs-details-page.c:957 src/gs-update-dialog.c:107 +msgid "System Services" +msgstr "Stelseldienste" + +#: src/gs-details-page.c:957 src/gs-details-page.c:958 +#: src/gs-update-dialog.c:107 src/gs-update-dialog.c:108 +msgid "..." +msgstr "..." + +#: src/gs-details-page.c:958 src/gs-update-dialog.c:108 +msgid "Session Services" +msgstr "" + +#: src/gs-details-page.c:959 src/gs-update-dialog.c:109 +msgid "Devices" +msgstr "Toestelle" + +#: src/gs-details-page.c:959 src/gs-update-dialog.c:109 +msgid "Can access system device files" +msgstr "" + +#: src/gs-details-page.c:960 src/gs-details-page.c:961 +#: src/gs-update-dialog.c:110 src/gs-update-dialog.c:111 +msgid "Home folder" +msgstr "Tuisgids" + +#: src/gs-details-page.c:960 src/gs-details-page.c:962 +#: src/gs-details-page.c:964 src/gs-update-dialog.c:110 +#: src/gs-update-dialog.c:112 src/gs-update-dialog.c:114 +msgid "Can view, edit and create files" +msgstr "" + +#: src/gs-details-page.c:961 src/gs-details-page.c:963 +#: src/gs-details-page.c:965 src/gs-update-dialog.c:111 +#: src/gs-update-dialog.c:113 src/gs-update-dialog.c:115 +msgid "Can view files" +msgstr "" + +#: src/gs-details-page.c:962 src/gs-details-page.c:963 +#: src/gs-update-dialog.c:112 src/gs-update-dialog.c:113 +msgid "File system" +msgstr "Lêerstelsel" + +#: src/gs-details-page.c:964 src/gs-details-page.c:965 +#: src/gs-update-dialog.c:114 src/gs-update-dialog.c:115 +msgid "Downloads folder" +msgstr "Aflaaigids" + +#: src/gs-details-page.c:966 src/gs-update-dialog.c:116 +msgid "Settings" +msgstr "Instellings" + +#: src/gs-details-page.c:966 src/gs-update-dialog.c:116 +msgid "Can view and change any settings" +msgstr "" + +#: src/gs-details-page.c:967 src/gs-update-dialog.c:117 +msgid "Legacy display system" +msgstr "" + +#: src/gs-details-page.c:967 src/gs-update-dialog.c:117 +msgid "Uses an old, insecure display system" +msgstr "" + +#: src/gs-details-page.c:982 +msgid "This application is fully sandboxed." +msgstr "" + +#: src/gs-details-page.c:990 +msgid "" +"Unable to determine which parts of the system this application accesses. " +"This is typical for older applications." +msgstr "" + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:1139 +msgctxt "version" +msgid "Unknown" +msgstr "Onbekend" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:1152 +msgctxt "updated" +msgid "Never" +msgstr "Nooit" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1205 +msgctxt "origin" +msgid "Unknown" +msgstr "Onbekend" + +#: src/gs-details-page.c:1255 +msgid "Low" +msgstr "Laag" + +#: src/gs-details-page.c:1257 +msgid "Medium" +msgstr "Medium" + +#: src/gs-details-page.c:1259 +msgid "High" +msgstr "Hoog" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.c:1263 src/gs-details-page.ui:938 src/gs-review-row.c:71 +msgid "Unknown" +msgstr "Onbekend" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1615 +msgid "You need internet access to write a review" +msgstr "U het internettoegang nodig om 'n resensie te skryf" + +#: src/gs-details-page.c:1804 src/gs-details-page.c:1820 +#, c-format +msgid "Unable to find “%s”" +msgstr "Kan nie \"%s\" vind nie" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2363 +msgid "Public domain" +msgstr "Publieke domein" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://de.wikipedia.org/wiki/Gemeinfreiheit +#: src/gs-details-page.c:2366 +msgid "https://en.wikipedia.org/wiki/Public_domain" +msgstr "https://af.wikipedia.org/wiki/Publieke_domein" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://www.gnu.org/philosophy/free-sw.de +#: src/gs-details-page.c:2373 +msgid "https://www.gnu.org/philosophy/free-sw" +msgstr "https://www.gnu.org/philosophy/free-sw.af.html" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2383 src/gs-details-page.ui:1181 +msgid "Free Software" +msgstr "Vrye sagteware" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2440 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "Gebruikers word aan die volgende lisensie gebind:" +msgstr[1] "Gebruikers word aan die volgende lisensies gebind:" + +#: src/gs-details-page.c:2467 src/gs-details-page.ui:1253 +msgid "More information" +msgstr "Meer inligting" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Besonderhede bladsy" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: src/gs-details-page.ui:251 +msgid "_Add shortcut" +msgstr "_Voeg kortpad by" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: src/gs-details-page.ui:262 +msgid "Re_move shortcut" +msgstr "Ve_rwyder kortpad" + +#: src/gs-details-page.ui:336 +msgid "No screenshot provided" +msgstr "Geen skermskoot verskaf nie" + +#: src/gs-details-page.ui:356 +msgid "Software Repository Included" +msgstr "Sagtewarebron ingesluit" + +#: src/gs-details-page.ui:357 +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "" +"Dié toepassing bevat 'n sagtewarebron wat bywerkings verskaf, asook toegang " +"tot ander sagteware." + +#: src/gs-details-page.ui:364 +msgid "No Software Repository Included" +msgstr "Geen sagtewarebron ingesluit nie" + +#: src/gs-details-page.ui:365 +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "" +"Dié toepassing bevat nie 'n sagtewarebron nie. Dit gaan nie bygewerk word " +"met nuwe weergawes nie." + +#: src/gs-details-page.ui:373 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Dié sagteware word reeds verskaf deur u verspreiding en moet nie vervang " +"word nie." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:380 +msgid "Software Repository Identified" +msgstr "Sagtewarebron geïdentifiseer" + +#: src/gs-details-page.ui:381 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Deur dié sagtewarebron by te voeg kry u toegang tot addisionele sagteware en " +"bywerkings." + +#: src/gs-details-page.ui:382 +msgid "Only use software repositories that you trust." +msgstr "Gebruik slegs sagtewarebronne wat u vertrou." + +#: src/gs-details-page.ui:392 +msgid "_Website" +msgstr "_Webwerf" + +#: src/gs-details-page.ui:401 +msgid "_Donate" +msgstr "_Skenk" + +#: src/gs-details-page.ui:511 +msgid "Localized in your Language" +msgstr "Beskikbaar in Afrikaans" + +#: src/gs-details-page.ui:522 +msgid "Documentation" +msgstr "Dokumentasie" + +#: src/gs-details-page.ui:533 +msgid "Release Activity" +msgstr "Vrystellingsaktiwiteit" + +#: src/gs-details-page.ui:544 +msgid "System Integration" +msgstr "Stelselintegrasie" + +#: src/gs-details-page.ui:555 +msgid "Sandboxed" +msgstr "Sandput" + +#: src/gs-details-page.ui:574 +msgid "Version" +msgstr "Weergawe" + +#: src/gs-details-page.ui:610 +msgid "Age Rating" +msgstr "Ouderdomsgradering" + +#: src/gs-details-page.ui:648 src/gs-details-page.ui:1339 +msgid "Permissions" +msgstr "Regte" + +#: src/gs-details-page.ui:686 +msgid "Updated" +msgstr "Bygewerk" + +#: src/gs-details-page.ui:720 +msgid "Category" +msgstr "Kategorie" + +#: src/gs-details-page.ui:757 +msgid "Installed Size" +msgstr "Installasie grootte" + +#: src/gs-details-page.ui:788 +msgid "Download Size" +msgstr "Aflaai grootte" + +#: src/gs-details-page.ui:850 +msgid "Developer" +msgstr "Ontwikkelaar" + +#: src/gs-details-page.ui:895 +msgid "License" +msgstr "Lisensie" + +#. This refers to the license of the application +#: src/gs-details-page.ui:914 +msgid "Free" +msgstr "Vry" + +#. This refers to the license of the application +#: src/gs-details-page.ui:926 +msgid "Proprietary" +msgstr "Alleenreg" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: src/gs-details-page.ui:976 src/gs-installed-page.c:492 +#: plugins/core/gs-desktop-common.c:331 +msgid "Add-ons" +msgstr "Byvoegings" + +#: src/gs-details-page.ui:988 +msgid "Selected add-ons will be installed with the application." +msgstr "Gekose byvoegings sal saam met die toepassing geïnstalleer word." + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-details-page.ui:1026 +msgid "Reviews" +msgstr "Resensies" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1044 +msgid "_Write a Review" +msgstr "_Skryf 'n resensie" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1065 +msgid "_Show More" +msgstr "_Wys meer" + +#: src/gs-details-page.ui:1192 +msgid "" +"This means that the software can be freely run, copied, distributed, studied " +"and modified." +msgstr "" +"Dit beteken dat die sagteware vry gebruik, gekopieer, gedeel, bestudeer en " +"verander mag word." + +#: src/gs-details-page.ui:1232 +msgid "Proprietary Software" +msgstr "Alleenregsagteware" + +#: src/gs-details-page.ui:1243 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "" +"Dit beteken dat die sagteware deur 'n individu of maatskappy besit word. " +"Daar is gewoonlik beperkings op die gebruik van die sagteware en toegang tot " +"die bronkode word verbied." + +#: src/gs-details-page.ui:1275 +msgid "Unknown Software License" +msgstr "Onbekende sagteware lisensie" + +#: src/gs-details-page.ui:1286 +msgid "The license terms of this software are unknown." +msgstr "Die lisensie terme van die sagteware is onbekend." + +#: src/gs-details-page.ui:1306 +msgid "The application was rated this way because it features:" +msgstr "Dit toepassing was so gegradeer aangesien dit die volgende bevat:" + +#: src/gs-details-page.ui:1320 +msgid "No details were available for this rating." +msgstr "Geen besonderhede was beskikbaar vir die gradering nie." + +#: src/gs-editor.c:361 +msgid "CSS validated OK!" +msgstr "CSS gevalideer OK!" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:564 +msgid "Failed to load file" +msgstr "Kon nie lêer laai nie" + +#. TRANSLATORS: window title +#: src/gs-editor.c:598 src/gs-editor.c:874 +msgid "Unsaved changes" +msgstr "Ongestoorde veranderinge" + +#: src/gs-editor.c:600 +msgid "The application list is already loaded." +msgstr "Die toepassinglys is reeds gelaai." + +#. TRANSLATORS: button text +#: src/gs-editor.c:604 +msgid "Merge documents" +msgstr "Smelt dokumente saam" + +#. TRANSLATORS: button text +#: src/gs-editor.c:608 src/gs-editor.c:879 +msgid "Throw away changes" +msgstr "Gooi veranderinge weg" + +#. import the new file +#: src/gs-editor.c:620 src/gs-editor.c:652 +msgid "Open AppStream File" +msgstr "Maak AppSream lêer oop" + +#: src/gs-editor.c:624 +msgid "_Open" +msgstr "_Open" + +#: src/gs-editor.c:656 +msgid "_Save" +msgstr "_Stoor" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:676 +msgid "Failed to save file" +msgstr "Kom nie lêer stoor nie" + +#. TRANSLATORS, the %s is the app name, e.g. 'Inkscape' +#: src/gs-editor.c:751 +#, c-format +msgid "%s banner design deleted." +msgstr "%s banier ontwerp geskrap." + +#. TRANSLATORS, this is a notification +#: src/gs-editor.c:754 +msgid "Banner design deleted." +msgstr "Banier ontwerp geskrap." + +#: src/gs-editor.c:876 +msgid "The application list has unsaved changes." +msgstr "Die toepassinglys het ongestoorde veranderinge." + +#. TRANSLATORS: show the program version +#: src/gs-editor.c:1111 +msgid "Use verbose logging" +msgstr "" + +#. TRANSLATORS: program name, an application to add and remove software repositories +#: src/gs-editor.c:1119 +msgid "GNOME Software Banner Designer" +msgstr "GNOME Sagteware banierontwerper" + +#: src/gs-editor.ui:53 src/gs-editor.ui:62 +msgid "No Designs" +msgstr "Geen ontwerpe" + +#: src/gs-editor.ui:137 +msgid "Error message here" +msgstr "Foutboodskap hier" + +#: src/gs-editor.ui:196 +msgid "App ID" +msgstr "Toep ID" + +#: src/gs-editor.ui:253 src/gs-review-dialog.ui:109 +msgid "Summary" +msgstr "Opsomming" + +#: src/gs-editor.ui:278 +msgid "Editor’s Pick" +msgstr "Glansitems" + +#. This check button controls whether the application’s banner appears in the “Featured” category +#: src/gs-editor.ui:287 +msgid "Category Featured" +msgstr "Uitgesoekte kategorie" + +#. button in the info bar +#: src/gs-editor.ui:336 +msgid "Undo" +msgstr "Ontdoen" + +#: src/gs-editor.ui:371 src/org.gnome.Software.Editor.desktop.in:3 +msgid "Banner Designer" +msgstr "Banierontwerper" + +#: src/gs-editor.ui:392 +msgid "New Banner" +msgstr "Nuwe banier" + +#: src/gs-editor.ui:452 +msgid "Import from file" +msgstr "Voer vanaf lêer in" + +#: src/gs-editor.ui:461 +msgid "Export to file" +msgstr "Voer as lêer uit" + +#: src/gs-editor.ui:470 +msgid "Delete Design" +msgstr "Skrap ontwerp" + +#: src/gs-editor.ui:491 +msgid "Featured App" +msgstr "Uitgesoek toepassing" + +#: src/gs-editor.ui:500 +msgid "OS Upgrade" +msgstr "BS Opgradering" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:147 +msgid " and " +msgstr " en " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:150 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:176 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Beskikbare lettertipes vir %s skript" +msgstr[1] "Beskikbare lettertipes vir %s skripte" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:184 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Beskikbare sagteware vir %s" +msgstr[1] "Beskikbare sagteware vir %s" + +#: src/gs-extras-page.c:226 +msgid "Unable to Find Requested Software" +msgstr "Kan nie aangevraagde sagteware vind nie" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:325 +#, c-format +msgid "%s not found" +msgstr "%s nie gevind nie" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:329 +msgid "on the website" +msgstr "op die webwerf" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:336 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "Geen toepassings is beskikbaar wat die lêer %s verskaf nie." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:340 src/gs-extras-page.c:351 src/gs-extras-page.c:362 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" +"Inligting oor %s, asook moontlikhede vir hoe om ontbrekende toepassings te " +"kry kan op %s gevind word." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:347 src/gs-extras-page.c:369 +#, c-format +msgid "No applications are available for %s support." +msgstr "Geen toepassings is vir %s ondersteuning beskikbaar nie." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:358 +#, c-format +msgid "%s is not available." +msgstr "%s is nie beskikbaar nie." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:373 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" +"Inligting oor %s, asook opsies vir hoe om 'n toepassing wat die formaat " +"ondersteun te kry, kan hier gevind word %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:380 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Geen lettertipes is beskikbaar vir %s skript ondersteuning nie." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:384 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Inligting oor %s, asook moontlikhede vir hoe om addisionele lettertipes te " +"kry kan op %s gevind word." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:391 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Geen byvoeging-kodekke is beskikbaar vir die %s-formaat nie." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:395 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Inligting oor %s, asook moontlikhede vir hoe om 'n kodek wat die formaat kan " +"speel kan op %s gevind word." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:402 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Geen Plasma hulpbronne is vir %s ondersteuning beskikbaar nie." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:406 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Inligting oor %s, asook moontlikhede vir hoe om addisionele Plasma " +"hulpbronne te kry kan op %s gevind word." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:413 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Geen drukkeraandrywers is vir %s beskikbaar nie." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:417 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Inligting oor %s, asook moontlikhede vir hoe om 'n aandrywer wat die drukker " +"ondersteun te kry kan op %s gevind word." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:461 +msgid "this website" +msgstr "hierdie webtuiste" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:465 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +"Ongelukkig kan die %s waarvoor jy gesoek nie gevind word nie. Sien %s vir " +"meer inligting." +msgstr[1] "" +"Ongelukkig kan die %s waarvoor jy gesoek nie gevind word nie. Sien %s vir " +"meer inligting." + +#: src/gs-extras-page.c:533 src/gs-extras-page.c:589 src/gs-extras-page.c:628 +msgid "Failed to find any search results" +msgstr "Kon nie enige soek resultate vind nie" + +#: src/gs-extras-page.c:816 +#, c-format +msgid "%s file format" +msgstr "%s lêer formaat" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kodeksbladsy" + +#: src/gs-first-run-dialog.ui:6 src/gs-first-run-dialog.ui:15 +msgid "Welcome" +msgstr "Welkom" + +#: src/gs-first-run-dialog.ui:40 +msgid "Welcome to Software" +msgstr "Welkom by Sagteware" + +#: src/gs-first-run-dialog.ui:50 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" +"Sagteware laat mens alle nodige sagteware installeer, als op een plek. Sien " +"gerus ons aanbevelings, blaai deur die kategorieë, of soek vir 'n program." + +#: src/gs-first-run-dialog.ui:59 +msgid "_Let’s Go Shopping" +msgstr "_Laat ons kyk" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: src/gs-hiding-box.c:381 +msgid "Spacing" +msgstr "Spasies" + +#: src/gs-hiding-box.c:382 +msgid "The amount of space between children" +msgstr "Die aantal spasie tussen kinders" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:83 +msgctxt "app status" +msgid "Removed" +msgstr "Verwyder" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:89 +msgctxt "app status" +msgid "Installed" +msgstr "Geïnstalleer" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:95 +msgctxt "app status" +msgid "Updated" +msgstr "Bygewerk" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:101 +msgctxt "app status" +msgid "Unknown" +msgstr "Onbekend" + +#: src/gs-history-dialog.ui:5 +msgid "History" +msgstr "Geskiedenis" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:488 +msgid "System Applications" +msgstr "Stelseltoepassings" + +#: src/gs-installed-page.c:622 +msgid "Click on items to select them" +msgstr "Klik op items om hulle te kies" + +#: src/gs-installed-page.c:826 +msgid "Select" +msgstr "Kies" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Geïnstalleerbladsy" + +#: src/gs-installed-page.ui:65 +msgid "_Add to Folder…" +msgstr "_Voeg by gids…" + +#: src/gs-installed-page.ui:73 +msgid "_Move to Folder…" +msgstr "S_kuif na gids…" + +#: src/gs-installed-page.ui:81 +msgid "_Remove from Folder" +msgstr "Ve_rwyder uit gids" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:75 +msgid "Software catalog is being downloaded" +msgstr "Sagteware katalogus word tans afgelaai" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:79 +msgid "Software catalog is being loaded" +msgstr "Sagteware katalogus word tans gelaai" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Laaiskerm" + +#: src/gs-loading-page.ui:47 +msgid "Starting up…" +msgstr "Skakel aan…" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "Moderasiebladsy" + +#: src/gs-moderate-page.ui:85 +msgid "There are no reviews to moderate" +msgstr "Daar is geen bywerkings om te modereer nie" + +#: src/gs-origin-popover-row.ui:35 src/gs-repo-row.ui:75 +msgid "URL" +msgstr "URL" + +#. Translators: The packaging format of the app being installed, e.g. 'RPM' or 'Flatpak' +#: src/gs-origin-popover-row.ui:64 +msgid "Format" +msgstr "Formaat" + +#. add button +#: src/gs-overview-page.c:332 +msgid "More…" +msgstr "Meer…" + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:610 +msgid "Recommended Audio & Video Applications" +msgstr "Aanbevole klank- en videotoepassings" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:615 +msgid "Recommended Games" +msgstr "Aanbevole speletjies" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:620 +msgid "Recommended Graphics Applications" +msgstr "Aanbevole grafikatoepassings" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:625 +msgid "Recommended Productivity Applications" +msgstr "Aanbevole produktiwiteitstoepassings" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:1007 src/gs-repos-dialog.c:835 +msgid "Access additional software from selected third party sources." +msgstr "" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:1011 src/gs-repos-dialog.c:839 +msgid "" +"Some of this software is proprietary and therefore has restrictions on use, " +"sharing, and access to source code." +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-overview-page.c:1016 src/gs-repos-dialog.c:844 +msgid "Find out more…" +msgstr "Vind meer uit…" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:1024 src/gs-repos-dialog.c:252 +msgid "Enable" +msgstr "Aktiveer" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Oorsigbladsy" + +#: src/gs-overview-page.ui:39 +msgid "Enable Third Party Software Repositories?" +msgstr "Aktiveer derdeparty-sagtewarebronne?" + +#: src/gs-overview-page.ui:83 +msgid "Featured Applications" +msgstr "Uitgesoekte toepassings" + +#: src/gs-overview-page.ui:116 +msgid "Categories" +msgstr "Kategorieë" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-overview-page.ui:232 +msgid "Editor’s Picks" +msgstr "Glansitems" + +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-overview-page.ui:258 +msgid "Recent Releases" +msgstr "Onlangse vrystellings" + +#: src/gs-overview-page.ui:328 +msgid "No Application Data Found" +msgstr "Geen toepassingdata gevind nie" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:496 +#, c-format +msgid "Are you sure you want to purchase %s?" +msgstr "Is u seker u wil %s koop?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:500 +#, c-format +msgid "%s will be installed, and you will be charged %s." +msgstr "%s sal geïnstalleer word en u sal met %s gedebiteer word." + +#. TRANSLATORS: this is button text to purchase the application +#: src/gs-page.c:513 +msgid "Purchase" +msgstr "Koop" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:587 +#, c-format +msgid "Prepare %s" +msgstr "Berei voor %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:724 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Is u seker u wil die sagtewarebron: %s verwyder?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:728 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the repository to use them again." +msgstr "" +"Alle toepassings van %s sal verwyder word, om hulle weer te gebruik sal die " +"sagtewarebron weer geïnstalleer moet word." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:736 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "Is u seker u wil %s verwyder?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:739 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" +"%s gaan verwyder word en sal weer geïnstalleer moet word om gebruik te kan " +"word." + +#. TRANSLATORS: this refers to an app (by name) that is installed +#: src/gs-popular-tile.c:71 src/gs-summary-tile.c:73 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Geïnstalleer)" + +#: src/gs-prefs-dialog.ui:5 src/gs-prefs-dialog.ui:17 +msgid "Update Preferences" +msgstr "Bywerk voorkeure" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatic Updates" +msgstr "Outomatiese bywerkings" + +#: src/gs-prefs-dialog.ui:70 +msgid "Automatic updates are disabled when on mobile or metered connections." +msgstr "" + +#: src/gs-prefs-dialog.ui:88 +msgid "Automatic Update Notifications" +msgstr "Kennisgewings vir outomatiese bywerkings" + +#: src/gs-prefs-dialog.ui:102 +msgid "Show notifications when updates have been automatically installed." +msgstr "Vertoon kennisgewings na bywerkings outomaties geïnstalleer is." + +#: lib/gs-price.c:111 +#, c-format +msgid "A$%.2f" +msgstr "A$%.2f" + +#: lib/gs-price.c:113 +#, c-format +msgid "C$%.2f" +msgstr "C$%.2f" + +#: lib/gs-price.c:115 +#, c-format +msgid "CN¥%.2f" +msgstr "CN¥%.2f" + +#: lib/gs-price.c:117 +#, c-format +msgid "€%.2f" +msgstr "€%.2f" + +#: lib/gs-price.c:119 +#, c-format +msgid "£%.2f" +msgstr "£%.2f" + +#: lib/gs-price.c:121 +#, c-format +msgid "¥%.2f" +msgstr "¥%.2f" + +#: lib/gs-price.c:123 +#, c-format +msgid "NZ$%.2f" +msgstr "NZ$%.2f" + +#: lib/gs-price.c:125 +#, c-format +msgid "₽%.2f" +msgstr "₽%.2f" + +#: lib/gs-price.c:127 +#, c-format +msgid "US$%.2f" +msgstr "US$%.2f" + +#. Translators: %s is the currency, and %f is the amount. +#. * You can switch the order by using “%2$f %1$s” instead. +#: lib/gs-price.c:131 +#, c-format +msgid "%s %f" +msgstr "%s %f" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:127 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" + +#: src/gs-removal-dialog.ui:26 +msgid "Incompatible Software" +msgstr "Onversoenbare sagteware" + +#: src/gs-removal-dialog.ui:39 +msgid "_Continue" +msgstr "_Gaan voort" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:110 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "%u toepassing geïnstalleer" +msgstr[1] "%u toepassings geïnstalleer" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:117 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u byvoeging geïnstalleer" +msgstr[1] "%u byvoegings geïnstalleer" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repos-dialog.c:125 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u toepassing" +msgstr[1] "%u toepassings" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repos-dialog.c:131 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u byvoeging" +msgstr[1] "%u byvoegings" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repos-dialog.c:138 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s en %s geïnstalleer" +msgstr[1] "%s en %s geïnstalleer" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:312 +#, c-format +msgid "Remove “%s”?" +msgstr "Verwyder \"%s\"?" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:317 +#, c-format +msgid "Disable “%s”?" +msgstr "Deaktiveer \"%s\"?" + +#. TRANSLATORS: longer dialog text +#: src/gs-repos-dialog.c:321 +msgid "" +"Software that has been installed from this repository will no longer receive " +"updates, including security fixes." +msgstr "" + +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-repos-dialog.c:339 +msgid "Disable" +msgstr "Deaktiveer" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:748 +msgid "the operating system" +msgstr "die bedryfstelsel" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:814 src/gs-repos-dialog.c:850 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#. TRANSLATORS: info bar title in the software repositories dialog +#: src/gs-repos-dialog.c:832 +msgid "Third Party Repositories" +msgstr "Derdeparty-sagtewarebronne" + +#: src/gs-repos-dialog.ui:73 +msgid "No Additional Repositories" +msgstr "Geen addisionele bronne nie" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for enabling a repo +#: src/gs-repo-row.c:110 +msgid "_Enable" +msgstr "_Aktiveer" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for removing a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:119 +msgid "_Remove…" +msgstr "_Verwyder…" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for disabling a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:124 +msgid "_Disable…" +msgstr "_Deaktiveer…" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being enabled +#: src/gs-repo-row.c:132 +msgid "Enabling" +msgstr "Aktiveer tans" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being disabled +#: src/gs-repo-row.c:144 +msgid "Disabling" +msgstr "Deaktiveer tans" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is enabled. +#: src/gs-repo-row.c:158 +msgid "Enabled" +msgstr "Geaktiveer" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is disabled. +#: src/gs-repo-row.c:164 +msgid "Disabled" +msgstr "Gedeaktiveer" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:95 +msgid "Hate it" +msgstr "Hou niks daarvan" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:99 +msgid "Don’t like it" +msgstr "Hou nie daarvan nie" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:103 +msgid "It’s OK" +msgstr "Dit is ok" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:107 +msgid "Like it" +msgstr "Hou daarvan" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:111 +msgid "Love it" +msgstr "Hou baie daarvan" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:133 +msgid "Please take more time writing the review" +msgstr "Neem asseblief meer tyd om die resensie te skryf" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:137 +msgid "Please choose a star rating" +msgstr "Kies asseblief 'n ster gradering" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The summary is too short" +msgstr "Die opsomming is te kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The summary is too long" +msgstr "Die opsomming is te lank" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:149 +msgid "The description is too short" +msgstr "Die beskrywing is te kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:153 +msgid "The description is too long" +msgstr "Die beskrywing is te lank" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:10 +msgid "Post Review" +msgstr "Plaas resensie" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:34 +msgid "_Post" +msgstr "_Plaas" + +#: src/gs-review-dialog.ui:75 +msgid "Rating" +msgstr "Gradering" + +#: src/gs-review-dialog.ui:119 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" +"Gee 'n kort opsomming van jou resensie, byvoorbeeld: \"Goeie toepassing\"." + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:144 +msgctxt "app review" +msgid "Review" +msgstr "Resensie" + +#: src/gs-review-dialog.ui:154 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "Wat dink jy van die toep? Probeer redes vir jou stellings verskaf." + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:412 +msgid "ratings in total" +msgstr "graderings in totaal" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:234 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Jy kan beledigende, onbeskofte of diskriminerende resensies rapporteer." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:239 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Sodra 'n resensie gerapporteer is, sal dit weggesteek word tot dit deur 'n " +"administrateur nagegaan kan word." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:253 +msgid "Report Review?" +msgstr "Rapporteer resensie?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:257 +msgid "Report" +msgstr "Rapporteer" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:105 +msgid "Was this review useful to you?" +msgstr "Was die resensie hulpvaardig?" + +#: src/gs-review-row.ui:121 +msgid "Yes" +msgstr "Ja" + +#: src/gs-review-row.ui:130 +msgid "No" +msgstr "Nee" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:139 +msgid "Meh" +msgstr "Ag" + +#: src/gs-review-row.ui:162 +msgid "Report…" +msgstr "Rapporteer…" + +#: src/gs-review-row.ui:172 +msgid "Remove…" +msgstr "Verwyder…" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:313 +msgid "Screenshot not found" +msgstr "Skermskoot nie gevind nie" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:328 +msgid "Failed to load image" +msgstr "Laai van prent het misluk" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:461 +msgid "Screenshot size not found" +msgstr "Skermskootgrootte nie gevind nie" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:491 +msgid "Could not create cache" +msgstr "Kon nie kas skep nie" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:551 +msgid "Screenshot not valid" +msgstr "Skermskoot nie geldig nie" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:566 +msgid "Screenshot not available" +msgstr "Skermskoot nie beskikbaar nie" + +#: src/gs-screenshot-image.c:619 +msgid "Screenshot" +msgstr "Skermskoot" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:155 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u meer passende" +msgstr[1] "%u meer passende" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Soekblad" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "Geen toepassings gevind nie" + +#. TRANSLATORS: menu item that signs into the named account with a particular username +#: src/gs-shell.c:741 +#, c-format +msgid "Signed in as %s" +msgstr "Ingeteken as %s" + +#. TRANSLATORS: menu item that signs into the named account +#: src/gs-shell.c:745 +#, c-format +msgid "Sign in…" +msgstr "Teken in…" + +#. TRANSLATORS: menu item for signing out from the named account +#: src/gs-shell.c:753 +#, c-format +msgid "Sign out" +msgstr "Teken uit" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:936 src/gs-shell.c:941 src/gs-shell.c:956 src/gs-shell.c:960 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1003 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Kan nie fermware bywerkings van %s aflaai nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1009 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Kan nie bywerkings van %s aflaai nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1016 src/gs-shell.c:1064 +msgid "Unable to download updates" +msgstr "Kan nie bywerkings aflaai nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1022 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" +"Kan nie bywerkings aflaai nie: internettoegang was benodig maar nie " +"beskikbaar nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1031 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Kan nie bywerkings van %s aflaai nie: nie genoeg skyfspasie nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1036 +msgid "Unable to download updates: not enough disk space" +msgstr "Kan nie bywerkings aflaai nie: nie genoeg skyfspasie nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1043 +msgid "Unable to download updates: authentication was required" +msgstr "Kan nie bywerkings aflaai nie: verifikasie was benodig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1048 +msgid "Unable to download updates: authentication was invalid" +msgstr "Kan nie bywerkings aflaai nie: verifikasie was ongeldig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1053 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Kan nie bywerkings aflaai nie: jy het nie die regte om sagteware te " +"installeer nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1067 +msgid "Unable to get list of updates" +msgstr "Kan nie 'n lys bywerkings kry nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1103 +#, c-format +msgid "Unable to purchase %s: authentication was required" +msgstr "Kan nie %s koop nie: verifikasie was benodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1110 +#, c-format +msgid "Unable to purchase %s: authentication was invalid" +msgstr "Kan nie %s koop nie: verifikasie was ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1117 +#, c-format +msgid "Unable to purchase %s: no payment method setup" +msgstr "Kan nie %s koop nie: geen betaalmetode is tans opgestel nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1124 +#, c-format +msgid "Unable to purchase %s: payment was declined" +msgstr "Kan nie %s koop nie: die betaling is afgekeur" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1131 +#, c-format +msgid "Unable to purchase %s" +msgstr "Kan nie %s koop nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1164 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "Kan nie %s installeer nie aangesien die aflaai van %s misluk het" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1170 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "Kan nie %s installeer nie aangesien die aflaai misluk het" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1183 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "Kan nie %s installeer nie aangesien runtime %s nie beskikbaar is nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1189 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "Kan nie %s installeer nie aangesien dit nie ondersteun word nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1196 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" +"Kan nie installeer nie: internettoegang was benodig maar nie beskikbaar nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1202 +msgid "Unable to install: the application has an invalid format" +msgstr "Kan nie installeer nie: die toepassing het 'n ongeldige formaat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1207 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Kan nie %s installeer nie: nie genoeg skyfspasie nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "Kan nie %s installeer nie: verifikasie was benodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "Kan nie %s installeer nie: verifikasie was ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1228 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" +"Kan nie %s installeer nie: jy het nie die regte om sagteware te installeer " +"nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1236 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "Kan nie %s installeer nie: WS krag word nodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1245 +#, c-format +msgid "Unable to install %s" +msgstr "Kan nie %s installeer nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1288 +#, c-format +msgid "Unable to update %s from %s as download failed" +msgstr "Kan nie %s opdateer van %s nie, aangesien die aflaai misluk het" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1295 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "Kan nie %s opdateer nie aangesien die aflaai misluk het" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1302 +#, c-format +msgid "Unable to install updates from %s as download failed" +msgstr "" +"Kan nie bywerkings van %s installeer nie aangesien die aflaai misluk het" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1306 +#, c-format +msgid "Unable to install updates as download failed" +msgstr "Kan nie bywerkings installeer nie aangesien die aflaai misluk het" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1312 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" +"Kan nie opdateer nie: internettoegang was benodig maar nie beskikbaar nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Kan nie %s opdateer nie: nie genoeg skyfspasie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1327 +#, c-format +msgid "Unable to install updates: not enough disk space" +msgstr "Kan nie bywerkings installeer nie: nie genoeg skyfspasie nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1337 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "Kan nie %s opdateer nie: verifikasie was benodig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1342 +#, c-format +msgid "Unable to install updates: authentication was required" +msgstr "Kan nie bywerkings installeer nie: verifikasie was benodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1351 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "Kan nie %s opdateer nie: verifikasie was benodig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1356 +#, c-format +msgid "Unable to install updates: authentication was invalid" +msgstr "Kan nie bywerkings installeer nie: verifikasie was ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1365 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" +"Kan nie %s opdateer nie: jy het nie die regte om sagteware op te dateer nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1371 +#, c-format +msgid "" +"Unable to install updates: you do not have permission to update software" +msgstr "" +"Kan nie bywerkings installeer nie: jy het nie die regte om sagteware op te " +"dateer nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1381 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "Kan nie %s opdateer nie: WS krag word nodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1387 +#, c-format +msgid "Unable to install updates: AC power is required" +msgstr "Kan nie bywerkings installeer nie: WS krag word nodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to update %s" +msgstr "Kon nie bywerking %s installeer nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1401 +#, c-format +msgid "Unable to install updates" +msgstr "Kan nie bywerkings installeer nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1444 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Kan nie na %s vanaf %s opgradeer nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1449 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "Kan nie na %s opgradeer nie aangesien die aflaai misluk het" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1458 +#, c-format +msgid "" +"Unable to upgrade to %s: internet access was required but wasn’t available" +msgstr "" +"Kan nie na %s opgradeer nie: toegang tot die internet word benodig maar is " +"nie beskikbaar nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1467 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Kan nie na %s opgradeer nie: nie genoeg skyfspasie nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1475 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "Kan nie na %s opgradeer nie: verifikasie was benodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1482 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "Kan nie na %s opgradeer nie: verifikasie was ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1489 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "" +"Kan nie na %s opgradeer nie: jy het nie die regte om sagteware op te gradeer " +"nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1496 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "Kan nie na %s opgradeer nie: WS krag word benodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1505 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Kan nie na %s opgradeer nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1543 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "Kan nie %s verwyder nie: verifikasie was benodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1549 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "Kan nie %s verwyder nie: verifikasie was ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1555 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" +"Kan nie %s verwyder nie: jy het nie die regte om sagteware te verwyder nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1562 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "Kan nie %s verwyder nie: WS krag word benodig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1574 +#, c-format +msgid "Unable to remove %s" +msgstr "Kan nie %s verwyder nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Kan nie %s uitvoer nie: %s is nie geïnstalleer nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 src/gs-shell.c:1675 src/gs-shell.c:1716 +#: src/gs-shell.c:1764 +msgid "Not enough disk space — free up some space and try again" +msgstr "Nie genoeg skyfspasie nie — maak asseblief ruimte en probeer weer" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1635 src/gs-shell.c:1686 src/gs-shell.c:1727 +#: src/gs-shell.c:1794 +msgid "Sorry, something went wrong" +msgstr "Jammer! Iets het skeef geloop" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1667 +msgid "Failed to install file: not supported" +msgstr "Kan nie lêer installeer nie: word nie ondersteun nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Failed to install file: authentication failed" +msgstr "Kan nie lêer installeer nie: verifikasie het misluk" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1708 +msgid "Failed to install: not supported" +msgstr "Kan nie installeer nie: word nie ondersteun nie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1712 +msgid "Failed to install: authentication failed" +msgstr "Kan nie installeer nie: verifikasie het misluk" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1758 +#, c-format +msgid "Unable to contact %s" +msgstr "Kan nie %s kontak nie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1773 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "%s moet herlaai word om nuwe inproppe te gebruik." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 +msgid "This application needs to be restarted to use new plugins." +msgstr "Die toepassing moet herlaai word om nuwe inproppe te gebruik." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1785 +msgid "AC power is required" +msgstr "WS krag word benodig" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Bron: %s" + +#: src/gs-summary-tile.c:78 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Installeer tans)" + +#: src/gs-summary-tile.c:83 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Verwyder tans)" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for removing multiple repos +#: src/gs-third-party-repo-row.c:106 +msgid "_Remove All" +msgstr "_Verwyder alles" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:200 +msgid "No update description available." +msgstr "Geen beskrywing vir die bywerking is beskikbaar nie." + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:302 +#, c-format +msgid "Installed on %s" +msgstr "Geïnstalleer op %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:322 +msgid "Installed Updates" +msgstr "Geïnstalleerde bywerkings" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:538 +msgid "Additions" +msgstr "Byvoegings" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:542 +msgid "Removals" +msgstr "Verwyderings" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:546 +msgid "Updates" +msgstr "Bywerkings" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:550 +msgid "Downgrades" +msgstr "Afgraderings" + +#: src/gs-update-dialog.ui:100 +msgid "No updates have been installed on this system." +msgstr "Geen bywerkings is al op die stelsel geïnstalleer nie." + +#: src/gs-update-monitor.c:106 +msgid "Security Updates Pending" +msgstr "" + +#: src/gs-update-monitor.c:107 +msgid "It is recommended that you install important updates now" +msgstr "Dit word aangeraai om belangrike bywerkings nou te installeer" + +#: src/gs-update-monitor.c:110 +msgid "Restart & Install" +msgstr "Herbegin en installeer" + +#: src/gs-update-monitor.c:114 +msgid "Software Updates Available" +msgstr "Sagtewarebywerkings beskikbaar" + +#: src/gs-update-monitor.c:115 +msgid "Important OS and application updates are ready to be installed" +msgstr "" +"Belangrike bywerkings vir die bedryfstelsel en toepassings is gereed om " +"geïnstalleer te word" + +#. TRANSLATORS: button text +#: src/gs-update-monitor.c:118 src/gs-updates-section.c:338 +msgid "Not Now" +msgstr "Nie nou nie" + +#: src/gs-update-monitor.c:119 +msgid "View" +msgstr "Vertoon" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:217 +#, c-format +msgid "%u Application Updated — Restart Required" +msgid_plural "%u Applications Updated — Restart Required" +msgstr[0] "%u Toepassing bygewerk — Herlaai die bedryfstelsel" +msgstr[1] "%u Toepassings bygewerk — Herlaai die bedryfstelsel" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:223 +#, c-format +msgid "%u Application Updated" +msgid_plural "%u Applications Updated" +msgstr[0] "%u Toepassing bygewerk" +msgstr[1] "%u Toepassings bygewerk" + +#. TRANSLATORS: %1 is an application name, e.g. Firefox +#: src/gs-update-monitor.c:234 +#, c-format +msgid "%s has been updated." +msgstr "%s is bygewerk." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:237 +msgid "Please restart the application." +msgstr "Herlaai die toepassing asseblief." + +#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox +#: src/gs-update-monitor.c:245 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s en %s is suksesvol bygewerk." + +#. TRANSLATORS: at least one application needs restarting +#: src/gs-update-monitor.c:251 src/gs-update-monitor.c:270 +#, c-format +msgid "%u application requires a restart." +msgid_plural "%u applications require a restart." +msgstr[0] "%u toepassing moet herlaai word." +msgstr[1] "%u toepassings moet herlaai word." + +#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox +#: src/gs-update-monitor.c:263 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Sluit %s, %s en %s in." + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:493 src/gs-updates-page.ui:43 +msgid "Operating System Updates Unavailable" +msgstr "Bedryfstelselbywerkings beskikbaar" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:495 +msgid "Upgrade to continue receiving security updates." +msgstr "Gradeer op om aan te hou om sekuriteitbywerkings te ontvang." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:550 +#, c-format +msgid "A new version of %s is available to install" +msgstr "'n Nuwe weergawe van %s is beskikbaar om geïnstalleer te word" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:554 +msgid "Software Upgrade Available" +msgstr "Sagtewarebywerkings beskikbaar" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:856 +msgid "Software Updates Failed" +msgstr "Sagtewarebywerkings het misluk" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:858 +msgid "An important OS update failed to be installed." +msgstr "'n Belangrike bedryfstelsel-bywerking kon nie geïnstalleer word nie." + +#: src/gs-update-monitor.c:859 +msgid "Show Details" +msgstr "Vertoon besonderhede" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:882 +msgid "System Upgrade Complete" +msgstr "Stelsel opgradering voltooid" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:887 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Welkom by %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:893 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Sagtewarebywerking geïnstalleer" +msgstr[1] "Sagtewarebywerkings geïnstalleer" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:897 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "'n Belangrike bedryfstelsel-bywerking is geïnstalleer." +msgstr[1] "Belangrike bedryfstelsel-bywerkings is geïnstalleer." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:908 +msgctxt "updates" +msgid "Review" +msgstr "Hersien" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:956 +msgid "Failed To Update" +msgstr "Kon nie opdateer nie" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:962 +msgid "The system was already up to date." +msgstr "Die stelsel was klaar op datum." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:967 +msgid "The update was cancelled." +msgstr "Die bywerking is gekanselleer." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:973 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Toegang tot die internet word benodig maar was nie beskikbaar nie. Maak " +"asseblief seker dat jy toegang tot die internet het, en probeer weer." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:979 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Daar was sekuriteitsprobleme met die bywerking. Konsulteer jou sagteware " +"verskaffer vir meer besonderhede." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:985 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Daar was nie genoeg oop spasie op die skyf nie. Maak asseblief ruimte en " +"probeer weer." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:990 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Ons is jammer, maar die opgradering kon nie installeer nie. Wag asseblief " +"vir 'n nuwe opgradering en probeer weer. Indien die probleem aanhou, " +"konsulteer jou sagteware verskaffer." + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:239 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:242 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:248 +msgid "Yesterday, %R" +msgstr "Gister, %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:252 +msgid "Yesterday, %l:%M %p" +msgstr "Gister, %l:%M %p" + +#: src/gs-updates-page.c:255 +msgid "Two days ago" +msgstr "Twee dae gelede" + +#: src/gs-updates-page.c:257 +msgid "Three days ago" +msgstr "Drie dae gelede" + +#: src/gs-updates-page.c:259 +msgid "Four days ago" +msgstr "Vier dae gelede" + +#: src/gs-updates-page.c:261 +msgid "Five days ago" +msgstr "Vyf dae gelede" + +#: src/gs-updates-page.c:263 +msgid "Six days ago" +msgstr "Ses dae gelede" + +#: src/gs-updates-page.c:265 +msgid "One week ago" +msgstr "'n Week gelede" + +#: src/gs-updates-page.c:267 +msgid "Two weeks ago" +msgstr "Twee weke gelede" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-updates-page.c:271 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:283 +msgid "Looking for new updates…" +msgstr "Kontroleer tans vir nuwe bywerkings…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:352 +msgid "Setting up updates…" +msgstr "Stel bywerkings op…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:353 src/gs-updates-page.c:360 +msgid "(This could take a while)" +msgstr "(Dit kan 'n oomblik duur)" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:467 +#, c-format +msgid "Last checked: %s" +msgstr "Laas gekontroleer: %s" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:631 +#, c-format +msgid "%s %s is no longer supported." +msgstr "%s %s word nie meer ondersteun nie." + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:636 +msgid "Your OS is no longer supported." +msgstr "Jou bedryfstelsel word nie meer ondersteun nie." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:641 +msgid "This means that it does not receive security updates." +msgstr "Dit beteken dat dit nie sekuriteitsbywerkings sal ontvang nie." + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:645 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "Dit word aanbeveel dat jy na 'n meer onlangse weergawe opgradeer." + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:903 +msgid "Charges may apply" +msgstr "Kostes mag van toepassing wees" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:907 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Bywerkingkontrole terwyl mens draagbare breëband data gebruik kan dalk geld " +"kos." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:911 +msgid "Check Anyway" +msgstr "Kontroleer in elk geval" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:927 +msgid "No Network" +msgstr "Geen netwerk nie" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:931 +msgid "Internet access is required to check for updates." +msgstr "Internettoegang word benodig om vir bywerkings te kontroleer." + +#. This label indicates that the update check is in progress +#: src/gs-updates-page.c:1355 +msgid "Checking…" +msgstr "Kyk tans…" + +#: src/gs-updates-page.c:1368 +msgid "Check for updates" +msgstr "Kontroleer vir bywerkings" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Bywerkingsbladsy" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:177 +msgid "Software is up to date" +msgstr "Sagteware is op datum" + +#: src/gs-updates-page.ui:225 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Bywerkingkontrole terwyl mens draagbare breëband data gebruik kan dalk geld " +"kos" + +#: src/gs-updates-page.ui:237 +msgid "_Check Anyway" +msgstr "_Kontroleer in elk geval" + +#: src/gs-updates-page.ui:273 +msgid "Go online to check for updates" +msgstr "Gaan aanlyn om te kontroleer vir bywerkings" + +#: src/gs-updates-page.ui:284 +msgid "_Network Settings" +msgstr "_Netwerkinstellings" + +#: src/gs-updates-page.ui:357 +msgid "Updates are automatically managed" +msgstr "Bywerkings sal outomaties bestuur word" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:288 +msgid "Restart & Update" +msgstr "Herbegin en dateer op" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-section.c:294 +msgid "Update All" +msgstr "Dateer almal op" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-updates-section.c:334 +msgid "Updates have been installed" +msgstr "Bywerking is geïnstalleer" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-updates-section.c:336 +msgid "A restart is required for them to take effect." +msgstr "Die rekenaar moet herbegin word vir hulle om effek te neem." + +#. TRANSLATORS: button text +#: src/gs-updates-section.c:340 +msgid "Restart" +msgstr "Herbegin" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:438 +msgid "Integrated Firmware" +msgstr "Geïntegreerde fermware" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:442 +msgid "Requires Restart" +msgstr "Moet herbegin word" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:446 +msgid "Application Updates" +msgstr "Toepassingbywerkings" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:450 +msgid "Device Firmware" +msgstr "Toestelfermware" + +#: src/gs-updates-section.c:478 src/gs-upgrade-banner.ui:102 +msgid "_Download" +msgstr "_Laai af" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:85 +#, c-format +msgid "%s %s Now Available" +msgstr "%s %s Nou beskikbaar" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "Downloading %s %s" +msgstr "Laai tans %s %s af" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:106 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "%s %s Reg om te installeer" + +#: src/gs-upgrade-banner.ui:30 +msgid "A major upgrade, with new features and added polish." +msgstr "" +"'n Belangrike bywerking, met nuwe funksies en beter vertalings (as alles " +"goed gaan)." + +#: src/gs-upgrade-banner.ui:50 +msgid "_Learn More" +msgstr "_Meer inligting" + +#: src/gs-upgrade-banner.ui:85 +msgid "" +"It is recommended that you back up your data and files before upgrading." +msgstr "" +"Voor daar met die opgradering begin word, sal dit aanbeveel word om 'n " +"rugsteun van al jou data te maak." + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Installeer, verwyder of gradeer sagteware vir die rekenaar op" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/org.gnome.Software.desktop.in:6 +#: src/org.gnome.Software.Editor.desktop.in:6 +msgid "org.gnome.Software" +msgstr "org.gnome.Software" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"bywerkings;opgradeer;bronne;lêerstoor;voorkeure;installeer;verwyder;program;" +"sagteware;toep;winkel;" + +#: src/org.gnome.Software.Editor.desktop.in:4 +msgid "Design the featured banners for GNOME Software" +msgstr "Ontwerp die uitgesoekte baniere vir GNOME-sagteware" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.Editor.desktop.in:13 +msgid "AppStream;Software;App;" +msgstr "appstream;sagteware;toep;" + +#: plugins/core/gs-desktop-common.c:30 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:33 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:36 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Klank vervaardiging en redigering" + +#: plugins/core/gs-desktop-common.c:42 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Musiekspelers" + +#: plugins/core/gs-desktop-common.c:51 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:54 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:57 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Ontfouting" + +#: plugins/core/gs-desktop-common.c:60 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDEs" + +#: plugins/core/gs-desktop-common.c:69 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:73 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:77 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Kunsmatige intelligensie" + +#: plugins/core/gs-desktop-common.c:80 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Sterrekunde" + +#: plugins/core/gs-desktop-common.c:84 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chemie" + +#: plugins/core/gs-desktop-common.c:88 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Tale" + +#: plugins/core/gs-desktop-common.c:92 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Wiskunde" + +#: plugins/core/gs-desktop-common.c:99 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: plugins/core/gs-desktop-common.c:108 +msgctxt "Menu of Games" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:111 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:114 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Aksie" + +#: plugins/core/gs-desktop-common.c:117 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Avontuur" + +#: plugins/core/gs-desktop-common.c:120 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkade" + +#: plugins/core/gs-desktop-common.c:123 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokke" + +#: plugins/core/gs-desktop-common.c:126 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Bord" + +#: plugins/core/gs-desktop-common.c:129 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kaart" + +#: plugins/core/gs-desktop-common.c:132 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulators" + +#: plugins/core/gs-desktop-common.c:135 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Kinders" + +#: plugins/core/gs-desktop-common.c:138 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logika" + +#: plugins/core/gs-desktop-common.c:141 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rolspel" + +#: plugins/core/gs-desktop-common.c:144 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: plugins/core/gs-desktop-common.c:148 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategie" + +#: plugins/core/gs-desktop-common.c:156 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:159 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:162 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D-grafika" + +#: plugins/core/gs-desktop-common.c:165 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografie" + +#: plugins/core/gs-desktop-common.c:168 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skandering" + +#: plugins/core/gs-desktop-common.c:171 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorgrafika" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Vertoners" + +#: plugins/core/gs-desktop-common.c:182 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:185 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:188 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalender" + +#: plugins/core/gs-desktop-common.c:192 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Databasis" + +#: plugins/core/gs-desktop-common.c:195 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finansies" + +#: plugins/core/gs-desktop-common.c:199 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Woordverwerker" + +#: plugins/core/gs-desktop-common.c:208 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Skriftipes" + +#: plugins/core/gs-desktop-common.c:211 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeks" + +#: plugins/core/gs-desktop-common.c:214 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Toevoerbronne" + +#: plugins/core/gs-desktop-common.c:217 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Taalpakke" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Add-ons" +msgid "Shell Extensions" +msgstr "Shell-uitbreidings" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalisering" + +#: plugins/core/gs-desktop-common.c:226 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hardeware-aandrywers" + +#: plugins/core/gs-desktop-common.c:234 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:237 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:240 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Gesels" + +#: plugins/core/gs-desktop-common.c:247 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Nuus" + +#: plugins/core/gs-desktop-common.c:251 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Webblaaiers" + +#: plugins/core/gs-desktop-common.c:259 +msgctxt "Menu of Utilities" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:262 +msgctxt "Menu of Utilities" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:265 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Teksredigeerders" + +#: plugins/core/gs-desktop-common.c:273 +msgctxt "Menu of Reference" +msgid "All" +msgstr "Alles" + +#: plugins/core/gs-desktop-common.c:276 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "Uitgesoek" + +#: plugins/core/gs-desktop-common.c:279 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Kuns" + +#: plugins/core/gs-desktop-common.c:282 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografie" + +#: plugins/core/gs-desktop-common.c:285 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Strokiesprente" + +#: plugins/core/gs-desktop-common.c:288 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fiksie" + +#: plugins/core/gs-desktop-common.c:291 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Gesondheid" + +#: plugins/core/gs-desktop-common.c:294 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Geskiedenis" + +#: plugins/core/gs-desktop-common.c:297 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Leefstyl" + +#: plugins/core/gs-desktop-common.c:300 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politiek" + +#: plugins/core/gs-desktop-common.c:303 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: plugins/core/gs-desktop-common.c:313 +msgid "Audio & Video" +msgstr "Klank en video" + +#. TRANSLATORS: this is the menu spec main category for Development +#: plugins/core/gs-desktop-common.c:316 +msgid "Developer Tools" +msgstr "Ontwikkelingsgereedskap" + +#. TRANSLATORS: this is the menu spec main category for Education & Science +#: plugins/core/gs-desktop-common.c:319 +msgid "Education & Science" +msgstr "Onderwys en wetenskap" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:322 +msgid "Games" +msgstr "Speletjies" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: plugins/core/gs-desktop-common.c:325 +msgid "Graphics & Photography" +msgstr "Grafika en fotografie" + +#. TRANSLATORS: this is the menu spec main category for Office +#: plugins/core/gs-desktop-common.c:328 +msgid "Productivity" +msgstr "Produktiwiteit" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: plugins/core/gs-desktop-common.c:334 +msgid "Communication & News" +msgstr "Kommunikasie en nuus" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:337 +msgid "Reference" +msgstr "Verwysing" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:340 +msgid "Utilities" +msgstr "Nutsgoed" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:68 +msgid "OS Updates" +msgstr "Bedryfstelselbywerkings" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:73 +msgid "Includes performance, stability and security improvements." +msgstr "Sluit verbeterde werkverrigting, stabiliteit en sekuriteit in." + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:55 +msgid "Downloading featured images…" +msgstr "Laai tans uitgesoekte beelde af…" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Webtoepassing ondersteuning" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Gebruik populêre webtoepassings in 'n webblaaier" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:138 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: plugins/external-appstream/gs-install-appstream.c:140 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:147 +msgid "You need to specify exactly one filename" +msgstr "Jy moet presies een lêernaam spesifiseer" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:154 +msgid "This program can only be used by the root user" +msgstr "Die program kan slegs deur die wortel gebruiker uitgevoer word" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:162 +msgid "Failed to validate content type" +msgstr "Kon nie inhoud tipe valideer nie" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:169 +msgid "Failed to copy" +msgstr "Kon nie kopieer nie" + +#. TRANSLATORS: status text when downloading +#: plugins/external-appstream/gs-plugin-external-appstream.c:243 +msgid "Downloading extra metadata files…" +msgstr "Laai tans ekstra metadata lêers af…" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:206 +msgid "Downloading upgrade information…" +msgstr "Laai tans opgradering inligting af…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:297 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "Gradeer jou stelsel op vir die nuutste funksies en verbeteringe." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak ondersteuning" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "Flatpak is 'n raamwerk vir Linux toepassings" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:834 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Kry tans flatpak metadata vir %s…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:673 +msgid "Downloading firmware update signature…" +msgstr "Laai tans handtekening vir fermware opgradering af…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:714 +msgid "Downloading firmware update metadata…" +msgstr "Laai tans metadata vir fermware opgradering af…" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Ondersteuning vir die opgradering van fermware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Verskaf ondersteuning vir die opgradering van fermware" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:209 +msgid "Downloading application ratings…" +msgstr "Laai tans toepassing-graderings af…" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "\"Open Desktop Ratings\" Ondersteuning" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "ODRS is 'n diens wat gebruiker resensies van toepassings bied" + +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:405 +msgid "GNOME Shell Extensions Repository" +msgstr "GNOME-koppelvlak uitbreidingsbron" + +#. TRANSLATORS: status text when downloading +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:793 +msgid "Downloading shell extension metadata…" +msgstr "Laai tans GNOME-koppelvlak uitbreiding metadata af…" + +#. TRANSLATORS: the one-line summary +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:887 +msgid "GNOME Shell Extension" +msgstr "GNOME-koppelvlak uitbreidings" + +#: plugins/snap/gs-plugin-snap.c:81 plugins/snap/gs-plugin-snap.c:83 +msgid "To continue, you need to use an Ubuntu One account." +msgstr "Om voort te gaan sal jy 'n \"Ubuntu One\" rekening moet gebruik." + +#: plugins/snap/gs-plugin-snap.c:82 +msgid "To continue, you need to use your Ubuntu One account." +msgstr "Om voort te gaan sal jy jou \"Ubuntu One\" rekening moet gebruik." + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:238 +msgid "Snap Store" +msgstr "Snap-winkel" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap-ondersteuning" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "'n Snap is 'n universele Linux pakket" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Wys profielinligting vir die diens" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Om voort te gaan moet jy by %s inteken." + +#~ msgid "Email address" +#~ msgstr "E-pos adres" + +#~ msgid "I have an account already" +#~ msgstr "Ek het klaar 'n rekening" + +#~ msgid "Password" +#~ msgstr "Wagwoord" + +#~ msgid "I want to register for an account now" +#~ msgstr "Ek wil nou vir 'n rekeneing registreer" + +#~ msgid "I have forgotten my password" +#~ msgstr "Ek het my wagwoord vergeet" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Teken my volgende keer outomaties in" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Voer jou eenmalige pin vir twee-faktor-verifikasie in." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Verifieer" + +#~ msgid "_About" +#~ msgstr "_Aangaande" + +#~ msgid "_Quit" +#~ msgstr "_Sluit af" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Inligting oor %s, asook moontlikhede om die kodek te kry wat dié formaat " +#~ "kan speel, kan op die webwerf gevind word." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "" +#~ "Dit is nie moontlik om sagteware te installeer voor die nie opgelos is " +#~ "nie." + +#~ msgid "For more information, visit %s." +#~ msgstr "Vir meer inligting, besoek %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Kan nie %s vanaf %s opdateer nie" + +#~ msgid "Downloading new updates…" +#~ msgstr "Laai tans nuwe bywerkings af…" + +#~ msgid "_Restart & Update" +#~ msgstr "_Herbegin en dateer op" + +#~ msgid "U_pdate All" +#~ msgstr "Dateer almal _op" + +#~ msgid "Restart & _Install" +#~ msgstr "Herbegin en _installeer" + +#~ msgid "Downloading firmware update…" +#~ msgstr "Laai tans fermware bywerking af…" + +#~ msgid "Limba Support" +#~ msgstr "Limba ondersteuning" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba verskaf ontwikkelaars met 'n maklike manier om sagtewarebondels te " +#~ "maak" + +#~ msgid "Downloading application page…" +#~ msgstr "Laai tans die toestelbladsy af…" + +#~ msgid "Steam Support" +#~ msgstr "Steam ondersteuning" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Die baanbreker vermaaklikheidsplatform van Valve" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Speler-tot-speler vooraf ingestelde interaksies sonder kletsfunksies" + +#~ msgid "" +#~ "Provides access to additional software, including web browsers and games." +#~ msgstr "" +#~ "Verskaf toegang tot addisionele sagteware, insluitend webblaaiers en " +#~ "speletjies." + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Aktiveer alleenregsagteware bronne?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Geen toepassings of byvoegings geïnstalleer nie; ander sagteware mag nog " +#~ "steeds wees" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Het tipies beperkings op gebruik en toegang tot die bronkode." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Alleenregsagteware bronne" + +#~ msgid "Remove Source" +#~ msgstr "Verwyder bron" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Sagteware bronne kan deur die internet afgelaai word. Dit verleen toegang " +#~ "tot addisionele sagteware wat nie deur %s verskaf word nie." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Deur 'n bron te verwyder, word enige sagteware wat daaruit geïnstalleer " +#~ "is ook verwyder." + +#~ msgid "No software installed from this source" +#~ msgstr "Geen sagteware vanuit dié bron geïnstalleer nie" + +#~ msgid "Installed from this Source" +#~ msgstr "Geïnstalleer vanuit dié bron" + +#~ msgid "Source Details" +#~ msgstr "Bron se besonderhede" + +#~ msgid "Last Checked" +#~ msgstr "Laas gekontroleer" + +#~ msgid "Added" +#~ msgstr "Bygevoeg" + +#~ msgid "Website" +#~ msgstr "Webwerf" + +#~ msgid "About Software" +#~ msgstr "Aangaande Sagteware" + +#~ msgid "A previous update was unfinished." +#~ msgstr "'n Vorige bywerking is nie voltooi nie." + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "'n Bywerking is nie korrek digitaal geteken nie." + +#~ msgid "The update could not be completed." +#~ msgstr "Die bywerking kon nie voltooi word nie." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "'n Bywerking vanlyn is aangevra, maar geen pakkette het bywerking benodig " +#~ "nie." + +#~ msgid "No space was left on the drive." +#~ msgstr "Geen plek beskikbaar op skyf nie." + +#~ msgid "An update failed to install correctly." +#~ msgstr "'n Bywerking kon nie korrek installeer nie." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Die bywerking vanlyn het op onverwagse manier gefaal." + +#~ msgid "_Installing" +#~ msgstr "_Installeer tans" + +#~ msgid "_Removing" +#~ msgstr "Ve_rwyder tans" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Bereken tans…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgid "Internet Only Application" +#~ msgstr "Internetafhanklike toepassing" + +#~ msgid "_History" +#~ msgstr "_Geskiedenis" + +#~ msgid "Size" +#~ msgstr "Grootte" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Aanbevole kantoortoepassings" + +#~ msgid "No sources found." +#~ msgstr "Geen bronne gevind nie." + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Sagtewarebronne gee mens toegang tot addisionele sagteware." + +#~ msgid "OK" +#~ msgstr "Goed" + +#~ msgid "One Star" +#~ msgstr "Een ster" + +#~ msgid "Two Stars" +#~ msgstr "Twee sterre" + +#~ msgid "Three Stars" +#~ msgstr "Drie sterre" + +#~ msgid "Four Stars" +#~ msgstr "Vier sterre" + +#~ msgid "Five Stars" +#~ msgstr "Vyf sterre" + +#~ msgid "Installation of %s failed." +#~ msgstr "Installasie van %s het misluk." + +#~ msgid "Removal of %s failed." +#~ msgstr "Kon nie %s verwyder nie." + +#~ msgid "No AppStream data found" +#~ msgstr "Geen AppStream-data gevind nie" + +#~ msgid " or " +#~ msgstr " of " + +#~ msgid "Web app" +#~ msgstr "Webtoepassing" + +#~ msgid "Audio" +#~ msgstr "Oudio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Databasisse" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Skryf van skywe" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Amateurradio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mengbank" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Musiek" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Opnemers" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Bou" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Databasisse" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "Ontwikkelingsomgewings (IDE)" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Profiele" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Revision Control" +#~ msgstr "Weergawebeheer" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Webontwikkeling" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Rekenaarwetenskap" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Construction" +#~ msgstr "Konstruksie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Datavisualisering" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Ekonomie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Elektrisiteit" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Ingenieurswese" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geowetenskap" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Geskiedenis" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Humanities" +#~ msgstr "Geesteswetenskappe" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Beeldverwerking" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Letterkunde" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Kaarte" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Musiek" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Numeriese analise" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Parallelle verwerking" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fisika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Geestelik" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Skiet" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulasie" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgid "Graphics" +#~ msgstr "Grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D-grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "Karakterherkenning (OCR)" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Roostergrafika" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Inbel" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "E-pos" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Nuusvoer" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Lêeroordrag" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Amateurradio" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Kitsboodskappe" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC-kliënte" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "Eweknienetwerke (P2P)" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Remote Access" +#~ msgstr "Eksterne toegang" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonie" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Webontwikkeling" + +#~ msgid "Office" +#~ msgstr "Kantoor" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Grafiek" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Kontakbestuur" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Woordeboek" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "E-pos" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Vloeidiagram" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografie" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Projekbestuur" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Publisering" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Sigblad" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Bekyker" + +#~ msgid "Science" +#~ msgstr "Wetenskap" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Kuns" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Kunsmatige intelligensie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Sterrekunde" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Chemie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Rekenaarwetenskap" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Konstruksie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Datavisualisering" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Ekonomie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Elektrisiteit" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Ingenieurswese" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Aardrykskunde" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geowetenskap" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Geskiedenis" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Geesteswetenskappe" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Beeldverwerking" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Tale" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Letterkunde" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Kaarte" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Wiskunde" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Medies" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Numeriese analise" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Parallelle verwerking" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fisika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Geestelik" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgid "System" +#~ msgstr "Stelsel" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulator" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Lêerbestuur" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Lêergereedskap" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Sekuriteit" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Terminaalemulator" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Toeganklikheid" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Argivering" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Sakrekenaar" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Horlosie" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Kompressie" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Lêergereedskap" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Kaarte" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Geestelik" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Telefoniegereedskap" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Redigering" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Databasis" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Skryf van skywe" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Players" +#~ msgstr "Spelers" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Opnemers" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 0000000..15470f7 --- /dev/null +++ b/po/ar.po @@ -0,0 +1,5166 @@ +# Copyright (C) 2014 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Shuaib Zahda , 2014. +# Safa Alfulaij , 2014, 2016, ٢٠١٦. +# Muhannad Alrusayni , 2016. +# Khaled Hosny , 2016, 2018. +msgid "" +msgstr "" +"Project-Id-Version: Gnome 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-30 11:26+0200\n" +"PO-Revision-Date: 2018-05-30 12:36+0200\n" +"Last-Translator: Khaled Hosny \n" +"Language-Team: Arabic \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 ? 4 : 5;\n" +"X-Generator: Virtaal 1.0.0-beta1\n" +"X-Project-Style: gnome\n" + +# الجمع أفضل لعنوان البرمجيّة +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "برمجيّات جنوم" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "مدير تطبيقات لجنوم" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" +"يسمح لك «برمجيّات» بالبحث عن تطبيقات جديدة وامتدادات للنّظام وإزالة التّ" +"طبيقات المنصّبة." + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" +"يعرض «برمجيّات جنوم» التّطبيقات المُختارة والشّعبيّة بأوصاف مفيدة وعدّة لقطات شاشة " +"لكلّ تطبيق. يمكن العثور على التّطبيقات من تصفّح قائمة الفئات أو بالبحث. يسمح لك " +"«برمجيّات جنوم» أيضًا بتحديث النّظام باستخدام تحديث دون اتّصال." + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "لوحة النّظرة العامّة" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "لوحة التّفاصيل" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "لوحة المنصّبة" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "لوحة التّحديثات" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "تفاصيل التحديث" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1103 +msgid "The GNOME Project" +msgstr "مشروع جنوم" + +#: data/org.gnome.software.external-appstream.policy.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "قائمة من المشاريع المتوافقة" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "هذه قائمة المشاريع المتوافقة التي ستُعرض مثل جنوم، وكدي وXFCE." + +#: data/org.gnome.software.gschema.xml:10 +#, fuzzy +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "فيما إذا كان هذا أول بدء ل‍«برمجيّات جنوم»" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Whether to automatically download updates" +msgstr "فيما إذا كان يجب تنزيل تحديثات تلقائيا أم لا" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads updates in the background " +"and prompts the user to install them when ready." +msgstr "" +"إن فُعّل، سينزل «برمجيّات جنوم» التحديثات تلقائيا في الخلفية ويطلب من " +"المستخدم تنصيبها عند جهوزها." + +#: data/org.gnome.software.gschema.xml:20 +#, fuzzy +msgid "Whether to automatically refresh when on a metered connection" +msgstr "فيما إذا كان يجب تنزيل تحديثات تلقائيا أم لا" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +#, fuzzy +msgid "Whether it’s the very first run of GNOME Software" +msgstr "فيما إذا كان هذا أول بدء ل‍«برمجيّات جنوم»" + +#: data/org.gnome.software.gschema.xml:29 +msgid "Show star ratings next to applications" +msgstr "اعرض النجوم التقيمية بجانب التطبيقات" + +#: data/org.gnome.software.gschema.xml:33 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:37 +msgid "Non-free applications show a warning dialog before install" +msgstr "تعرض التطبيقات غير الحرة تحذيرا قبل تنصيبها" + +#: data/org.gnome.software.gschema.xml:38 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "يمكن عرض تحذير عند تنصيب تطبيقات غير حرة. يتحكم هذا في عرضه من عدمه." + +#: data/org.gnome.software.gschema.xml:42 +msgid "A list of popular applications" +msgstr "قائمة للتطبيقات الشائعة" + +#: data/org.gnome.software.gschema.xml:43 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "قائمة التطبيقات لكي تُستخدم، متجاوزة تلك المعرّفة في النظام." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "الختم الزمني لآخر التماس للتحديثات" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "الختم الزمني لآخر ترقية" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The timestamp of the first security update, cleared after update" +msgstr "الختم الزمني لأول تحديث أمني، يُمحى بعد التحديث" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The last update timestamp" +msgstr "الختم الزمني لآخر تحديث" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:64 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:73 +msgid "The server to use for application reviews" +msgstr "الخادوم لأخذ تقييمات التطبيقات منه" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The minimum karma score for reviews" +msgstr "أدنى عدد لنقاط السلوك للتقييمات" + +#: data/org.gnome.software.gschema.xml:78 +msgid "Reviews with karma less than this number will not be shown." +msgstr "التقييمات ذات نقاط السلوك الأقل من هذا العدد لن تظهر." + +#: data/org.gnome.software.gschema.xml:82 +#, fuzzy +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "قائمة المصادر الرسمية لكي لا تُعتبر طرفا ثالثا" + +#: data/org.gnome.software.gschema.xml:86 +#, fuzzy +msgid "A list of official repositories that should be considered free software" +msgstr "قائمة المصادر الرسمية كي تُعتبر برمجيات حرة" + +#: data/org.gnome.software.gschema.xml:90 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "عنوان الرخصة لكي يُستخدم لاعتبار تطبيق ما برمجيةً حرة" + +#: data/org.gnome.software.gschema.xml:94 +msgid "Install bundled applications for all users on the system where possible" +msgstr "نصّب تطبيقات لكل مستخدم النظام متى ما امكن" + +#: data/org.gnome.software.gschema.xml:98 +msgid "Show the folder management UI" +msgstr "اعرض واجهة إدارة المجلدات" + +#: data/org.gnome.software.gschema.xml:102 +#, fuzzy +msgid "Allow access to the Software Repositories dialog" +msgstr "اسمح بالوصول إلى حوار مصادر البرمجيات" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Offer upgrades for pre-releases" +msgstr "يوفّر ترقيات لنسخ ما قبل الإصدار" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "اعرض عناصر في الواجهة الرسومية تُخبر المستخدم بأن التطبيق غير حر" + +#: data/org.gnome.software.gschema.xml:114 +#, fuzzy +msgid "Show the prompt to install nonfree software repositories" +msgstr "اعرض محثًا لتنصيب مصادر البرمجيات غير الحرة" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" +"'https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA_%D8" +"%A7%D8%AD%D8%AA%D9%83%D8%A7%D8%B1%D9%8A%D8%A9'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "المسار الذي يشرح البرمجيات غير الحرة و المحتكرة" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:131 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "" + +#: data/org.gnome.software.gschema.xml:135 +msgid "Enable GNOME Shell extensions repository" +msgstr "" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "تنصيب البرمجيّات" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "نصّب البرمجيّات المحدّدة على النّظام" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/gnome-software-local-file.desktop.in:10 +msgid "system-software-install" +msgstr "system-software-install" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "حدّد الكلّ" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "ألغِ التّحديد" + +# الجمع أفضل لعنوان البرمجيّة +#: src/gnome-software.ui:24 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "برمجيّات" + +#: src/gnome-software.ui:43 src/gs-update-dialog.ui:21 +msgid "Go back" +msgstr "ارجع" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:77 +msgid "_All" +msgstr "ال_كلّ" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gnome-software.ui:104 +msgid "_Installed" +msgstr "ال_منصّبة" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gnome-software.ui:155 +msgid "_Updates" +msgstr "ال_تّحديثات" + +#: src/gnome-software.ui:251 +msgid "Search" +msgstr "ابحث" + +#. button in the info bar +#: src/gnome-software.ui:350 src/gs-repos-dialog.ui:6 src/gs-repos-dialog.ui:20 +msgid "Software Repositories" +msgstr "مستودعات البرمجيات" + +#. button in the info bar +#: src/gnome-software.ui:361 +msgid "Examine Disk" +msgstr "افحص القرص" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:372 src/gs-updates-page.c:1435 +msgid "Network Settings" +msgstr "إعدادات الشّبكة" + +#. button in the info bar +#: src/gnome-software.ui:383 +msgid "Restart Now" +msgstr "أعِد التشغيل الآن" + +#. button in the info bar +#: src/gnome-software.ui:394 +msgid "More Information" +msgstr "مزيد من المعلومات" + +#: src/gs-app-addon-row.c:96 src/gs-app-row.c:424 +msgid "Pending" +msgstr "ينتظر" + +#: src/gs-app-addon-row.c:102 src/gs-app-row.ui:209 src/gs-app-tile.ui:51 +#: src/gs-feature-tile.c:87 +msgid "Installed" +msgstr "مُنصّب" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being installed +#: src/gs-app-addon-row.c:106 src/gs-app-row.c:215 src/gs-details-page.c:464 +#: src/gs-third-party-repo-row.c:113 +msgid "Installing" +msgstr "ينصّب" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being removed +#: src/gs-app-addon-row.c:110 src/gs-app-row.c:221 src/gs-repo-row.c:140 +#: src/gs-third-party-repo-row.c:120 +msgid "Removing" +msgstr "يزيل" + +#: src/gs-app-folder-dialog.c:309 +msgid "Folder Name" +msgstr "اسم المجلّد" + +#: src/gs-app-folder-dialog.c:320 src/gs-app-folder-dialog.ui:16 +#: src/gs-details-page.ui:329 src/gs-editor.c:623 src/gs-editor.c:655 +#: src/gs-installed-page.c:610 src/gs-removal-dialog.ui:33 +#: src/gs-review-dialog.ui:23 src/gs-upgrade-banner.ui:131 +msgid "_Cancel" +msgstr "أل_غِ" + +#: src/gs-app-folder-dialog.c:325 src/gs-app-folder-dialog.ui:24 +msgid "_Add" +msgstr "أ_ضف" + +#: src/gs-app-folder-dialog.ui:5 +msgid "Add to Application Folder" +msgstr "أضف إلى مجلّد التّطبيقات" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"وضع البدء: واحدٌ من 'updates'، أو 'updated'، أو 'installed' أو 'overview'" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "الوضع" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "ابحث عن تطبيقات" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "البحث" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "اعرض تفاصيل التّطبيق (باستخدام معرّفه)" + +#: src/gs-application.c:128 src/gs-application.c:132 +msgid "ID" +msgstr "المعرّف" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "اعرض تفاصيل التّطبيق (باستخدام اسم الحزمة)" + +# هذا يظهر في سطر الأوامر غالبًا +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "اسم_الحزمة" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "نصّب التّطبيق (باستخدام معرّفه)" + +#: src/gs-application.c:134 +msgid "Open a local package file" +msgstr "افتح ملفّ حزمة محليّة" + +# هذا يظهر في سطر الأوامر غالبًا +#: src/gs-application.c:134 +msgid "FILENAME" +msgstr "اسم_الملفّ" + +#: src/gs-application.c:136 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:139 +msgid "Show verbose debugging information" +msgstr "اعرض معلومات تنقيح مطنبة" + +#: src/gs-application.c:141 +msgid "Show profiling information for the service" +msgstr "اعرض معلومات التّعرفة للخدمة" + +#: src/gs-application.c:143 +msgid "Quit the running instance" +msgstr "أنهِ السيرورة الجارية" + +#: src/gs-application.c:145 +msgid "Prefer local file sources to AppStream" +msgstr "فضّل مصادر الملفّات المحليّة على AppStream" + +#: src/gs-application.c:147 +msgid "Show version number" +msgstr "اعرض رقم الإصدارة" + +#: src/gs-application.c:344 +msgid "translator-credits" +msgstr "" +"فريق عربآيز للترجمة http://www.arabeyes.org :\n" +"خالد حسني\t\n" +"شعيب زاهدة\t\n" +"صفا الفليج\t" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:351 +#, c-format +msgid "About %s" +msgstr "_عن %s" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:355 +msgid "A nice way to manage the software on your system." +msgstr "طريقة لطيفة لإدارة البرمجيّات في النّظام." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:170 +msgid "Visit website" +msgstr "زُر موقع الوِبّ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:175 +msgid "Install…" +msgstr "نصّب…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:182 +msgid "Cancel" +msgstr "ألغِ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:189 src/gs-common.c:276 src/gs-page.c:589 +msgid "Install" +msgstr "نصّب" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:196 +msgid "Update" +msgstr "حدّث" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-app-row.c:200 src/gs-app-row.c:209 src/gs-page.c:746 +#: src/gs-repos-dialog.c:336 +msgid "Remove" +msgstr "أزل" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:326 +msgid "Device cannot be used during update." +msgstr "لا يمكن استخدام الجهاز أثناء التحديث." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:336 src/gs-details-page.ui:988 +msgid "Source" +msgstr "المصدر" + +#. TRANSLATORS: this is when the service name is not known +#: src/gs-auth-dialog.c:69 +msgid "To continue you need to sign in." +msgstr "عليك الولوج للمتابعة." + +#. TRANSLATORS: the %s is a service name, e.g. "Ubuntu One" +#: src/gs-auth-dialog.c:73 +#, c-format +msgid "To continue you need to sign in to %s." +msgstr "عليك الولوج إلى %s للمتابعة." + +#: src/gs-auth-dialog.ui:70 +msgid "Email address" +msgstr "البريد الإلكتروني" + +#: src/gs-auth-dialog.ui:94 +msgid "I have an account already" +msgstr "لدي حساب بالفعل" + +#: src/gs-auth-dialog.ui:113 +msgid "Password" +msgstr "كلمة السر" + +#: src/gs-auth-dialog.ui:137 +msgid "I want to register for an account now" +msgstr "أريد تسجيل حساب الآن" + +#: src/gs-auth-dialog.ui:154 +msgid "I have forgotten my password" +msgstr "نسيتُ كلمة السر" + +#: src/gs-auth-dialog.ui:181 +msgid "Sign in automatically next time" +msgstr "لِجني تلقائيا المرة القادمة" + +#: src/gs-auth-dialog.ui:210 +msgid "Enter your one-time pin for two-factor authentication." +msgstr "أدخل رمز الاستيثاق بمعاملين" + +#: src/gs-auth-dialog.ui:223 +msgid "PIN" +msgstr "الرمز" + +#: src/gs-auth-dialog.ui:325 +msgid "Authenticate" +msgstr "استوثق" + +#: src/gs-auth-dialog.ui:337 +msgid "Continue" +msgstr "تابع" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:194 +msgid "Other" +msgstr "أخرى" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:199 +msgid "All" +msgstr "الكلّ" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:203 +msgid "Featured" +msgstr "مُختارة" + +#. TRANSLATORS: This is a heading on the categories page. %s gets +#. replaced by the category name, e.g. 'Graphics & Photography' +#: src/gs-category-page.c:501 +#, c-format +msgid "Featured %s" +msgstr "مُختارات %s" + +#. Translators: A label for a button to sort apps by their rating. +#: src/gs-category-page.ui:24 +msgid "Top Rated" +msgstr "الأعلى تقييمًا" + +#. Translators: A label for a button to sort apps alphabetically. +#: src/gs-category-page.ui:30 src/gs-editor.ui:296 +msgid "Name" +msgstr "الاسم" + +#. TRANSLATORS: A label for a button to show the settings for +#. the selected shell extension. +#: src/gs-category-page.ui:137 src/gs-details-page.c:361 +msgid "Extension Settings" +msgstr "إعدادات الامتدادات" + +#: src/gs-category-page.ui:166 +msgid "" +"Extensions are used at your own risk. If you have any system problems, it is " +"recommended to disable them." +msgstr "" +"استعمل الامتدادات على مسؤوليتك الخاصة. إن واجهت أية مشاكل في النظام، فمن " +"المستحسن أن تعطلها." + +#. TRANSLATORS: This is a label for the category filter drop down, which all together can read e.g. 'Show Vector Graphics'. +#: src/gs-category-page.ui:197 +msgid "Show" +msgstr "اعرض" + +#: src/gs-category-page.ui:219 +msgid "Subcategories filter menu" +msgstr "قائمة مرشح التصنيفات الفرعية" + +#. TRANSLATORS: This is a label for the category sort drop down, which all together can read e.g. 'Sort Top Rated'. +#: src/gs-category-page.ui:267 +msgid "Sort" +msgstr "رتّب" + +#: src/gs-category-page.ui:288 +msgid "Subcategories sorting menu" +msgstr "قائمة ترتيب التصنيفات الفرعية" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:206 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "رجاء أدخل رقما من ١ إلى %u:" + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:269 +msgid "Choose an application:" +msgstr "اختر تطبيقًا:" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:136 +msgid "OS updates are now installed" +msgstr "نصّبت تحديثات نظام التشغيل" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:139 +msgid "Recently installed updates are available to review" +msgstr "التطبيقات المنصبة حديثًا متاحة للمراجعة" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:143 +#, c-format +msgid "%s is now installed" +msgstr "نُصّب %s" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:146 +msgid "Application is ready to be used." +msgstr "التطبيق جاهز للاستخدام." + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:152 +msgid "Launch" +msgstr "أطلِق" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "أأنصّب برمجيات من طرف ثالث؟" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 src/gs-repos-dialog.c:247 +msgid "Enable Third-Party Software Repository?" +msgstr "أأفعّل مستودعات برمجيات من طرف ثالث؟" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:230 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s ليست برمجية حرّة و مفتوحة المصدر، و موفّرها هو \"%s\"." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:240 +#, c-format +msgid "%s is provided by “%s”." +msgstr "يأتي %s من ”%s“." + +#: src/gs-common.c:249 +msgid "This software repository must be enabled to continue installation." +msgstr "يجب تفعيل مستودع البرمجيات هذا لمتابعة التنصيب." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:259 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "قد يكون ممنوعا تنصيب %s أو استخدامها في بعض الدول." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:265 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "قد يكون ممنوعا تنصيب هذا المرماز أو استخدامه في بعض الدول." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:272 +msgid "Don’t Warn Again" +msgstr "لا تحذّرني ثانيةً" + +#. TRANSLATORS: button text +#: src/gs-common.c:281 +msgid "Enable and Install" +msgstr "فعّل و نصّب" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:426 +msgid "Detailed errors from the package manager follow:" +msgstr "فيما يلي الأعطال التّفصيليّة من مدير الحزم:" + +#: src/gs-common.c:445 src/gs-details-page.ui:595 +msgid "Details" +msgstr "التّفاصيل" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:75 +msgid "No cartoon violence" +msgstr "لا عنف كرتوني" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:78 +msgid "Cartoon characters in unsafe situations" +msgstr "شخصيات كرتونية في مواقف خطرة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "Cartoon characters in aggressive conflict" +msgstr "شخصيات كرتونية تتصراع بعدوانية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:84 +msgid "Graphic violence involving cartoon characters" +msgstr "عنف رسومي لشخصيات كرتونية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "No fantasy violence" +msgstr "لا عنف خيالي" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:90 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "الشخصيات الكرتونية في مواقف خطرة يمكن تمييزها عن الواقع بسهولة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:93 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "الشخصيات الكرتونية وهي تتصارع بعدوانية يمكن تمييزها عن الواقع بسهولة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Graphic violence easily distinguishable from reality" +msgstr "العنف الرسومي سهل تفرقته عن الواقع" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:99 +msgid "No realistic violence" +msgstr "لا عنف واقعي" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:102 +msgid "Mildly realistic characters in unsafe situations" +msgstr "شخصيات واقعية معتدلة في حالات غير آمنة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "تصوير شخصيات واقعية تتصراع بعدوانية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:108 +msgid "Graphic violence involving realistic characters" +msgstr "عنف رسومي لشخصيات واقعية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:111 +msgid "No bloodshed" +msgstr "لا إراقة دماء" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "Unrealistic bloodshed" +msgstr "إراقة الدماء غير حقيقة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:117 +msgid "Realistic bloodshed" +msgstr "إراقة الدماء حقيقة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:120 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "تصوير لسفك الدماء والتمثيل بأجزاء الجسد" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:123 +msgid "No sexual violence" +msgstr "لا عنف جنسي" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Rape or other violent sexual behavior" +msgstr "اغتصاب أو سلوك جنسي عنيف" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:129 +msgid "No references to alcohol" +msgstr "لا إشارات لمشروبات كحولية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "References to alcoholic beverages" +msgstr "إشارات لمشروبات كحولية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:135 +msgid "Use of alcoholic beverages" +msgstr "استخدام مشروبات كحولية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:138 +msgid "No references to illicit drugs" +msgstr "لا إشارات لمخدرات غير مشروعة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:141 +msgid "References to illicit drugs" +msgstr "إشارات لمخدرات غير مشروعة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Use of illicit drugs" +msgstr "استخدام مخدرات غير مشروعة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:147 +msgid "References to tobacco products" +msgstr "إشارات منتجات التبغ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:150 +msgid "Use of tobacco products" +msgstr "استخدام منتجات التبغ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:153 +msgid "No nudity of any sort" +msgstr "لا عري من أي نوع" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Brief artistic nudity" +msgstr "عري فني بسيط" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:159 +msgid "Prolonged nudity" +msgstr "العري لفترة طويلة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:162 +msgid "No references or depictions of sexual nature" +msgstr "لا إشارات أو تصوير للجنس" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Provocative references or depictions" +msgstr "تلميحات استفزازية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:168 +msgid "Sexual references or depictions" +msgstr "إشارات أو تصوير للجنس" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:171 +msgid "Graphic sexual behavior" +msgstr "سلوك جنسي رسومي" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No profanity of any kind" +msgstr "لا ألفاظ نابية من أي نوع" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:177 +msgid "Mild or infrequent use of profanity" +msgstr "استخدام معتدل أو نادر للألفاظ النابية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Moderate use of profanity" +msgstr "استعمال معتدل للألفاظ النابية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:183 +msgid "Strong or frequent use of profanity" +msgstr "استعمال قوي أو متكرر للألفاظ النابية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:186 +msgid "No inappropriate humor" +msgstr "لا فكاهة مبتذلة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Slapstick humor" +msgstr "فكاهة تهريجية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:192 +msgid "Vulgar or bathroom humor" +msgstr "فكاهة مبتذلة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:195 +msgid "Mature or sexual humor" +msgstr "نكت جنسية/للكبار" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "No discriminatory language of any kind" +msgstr "لا لغة متحيزة من أي نوع" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:201 +msgid "Negativity towards a specific group of people" +msgstr "السلبية تجاه مجموعة من الأشخاص" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:204 +msgid "Discrimination designed to cause emotional harm" +msgstr "تمييز مفتعل للتسبب بضرر عاطفي" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "تمييز صريح بناء على الجنس، أو السلاسة البشرية أو العقيدة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:210 +msgid "No advertising of any kind" +msgstr "لا إعلانات من أي نوع" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Product placement" +msgstr "إشهار منتجات" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:216 +msgid "Explicit references to specific brands or trademarked products" +msgstr "إشارات صريحة لعلامات تجارية ومنتجات معينة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:219 +msgid "Users are encouraged to purchase specific real-world items" +msgstr "يُشجّع المستخدمين على شراء عناصر معينة في العالم الحقيقي" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:222 +msgid "No gambling of any kind" +msgstr "لا مقامرة من أي نوع" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:225 +msgid "Gambling on random events using tokens or credits" +msgstr "مقامرة على أحداث عشوائية باستخدام عمل رمزية أو ائتمانات" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "Gambling using “play” money" +msgstr "مقامرة باستخدام مال ”ألعاب“" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:231 +msgid "Gambling using real money" +msgstr "مقامرة باستخدام مال حقيقي" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "No ability to spend money" +msgstr "لا إمكانية إنفاق أموال" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:237 +msgid "Users are encouraged to donate real money" +msgstr "يُشجّع المستخدمين على التبرع بنقود حقيقية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:240 +msgid "Ability to spend real money in-game" +msgstr "إمكانية إنفاق أموال حقيقية داخل اللعبة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:243 +msgid "No way to chat with other users" +msgstr "لا إمكانية للدردشة مع مستخدمين آخرين" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:246 +msgid "User-to-user game interactions without chat functionality" +msgstr "تفاعل المستخدمين مع بعض في اللعبة بدون ميزة دردشة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:249 +msgid "Moderated chat functionality between users" +msgstr "ميزة مدارة دردشة بين المستخدمين" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:252 +msgid "Uncontrolled chat functionality between users" +msgstr "ميزة دردشة بين المستخدمين بلا إدارة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:255 +msgid "No way to talk with other users" +msgstr "لا إمكانية للحديث مع مستخدمين آخرين" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:258 +msgid "Uncontrolled audio or video chat functionality between users" +msgstr "ميزة دردشة مرئية أو صوتية بين المستخدمين بلا إدارة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "No sharing of social network usernames or email addresses" +msgstr "لا مشاركة لأسماء حسابات شبكات التواصل أو عناوين البريد" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:264 +msgid "Sharing social network usernames or email addresses" +msgstr "مشاركة أسماء حسابات شبكات التواصل أو عناوين البريد" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:267 +msgid "No sharing of user information with 3rd parties" +msgstr "لا مشاركة لمعلومات المستخدم مع أطراف ثالثة" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "Checking for the latest application version" +msgstr "يتم التحقق من أحدث إصدار للتطبيق" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:273 +msgid "Sharing diagnostic data that does not let others identify the user" +msgstr "مشاركة بيانات التشخيص التي لا تسمح للآخرين بتحديد المستخدم" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:276 +#, fuzzy +msgid "Sharing information that lets others identify the user" +msgstr "معلومات المستخدم تُشارك مع أطراف ثالثة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:279 +#, fuzzy +msgid "No sharing of physical location to other users" +msgstr "مشاركة الموقع الفيزيائي مع بقية المستخدمين" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:282 +msgid "Sharing physical location to other users" +msgstr "مشاركة الموقع الفيزيائي مع بقية المستخدمين" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:287 +msgid "No references to homosexuality" +msgstr "لا توجد إشارات إلى المثلية الجنسية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:290 +msgid "Indirect references to homosexuality" +msgstr "إشارات غير مباشرة إلى المثلية الجنسية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:293 +msgid "Kissing between people of the same gender" +msgstr "تقبيل بين الناس من نفس الجنس" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:296 +msgid "Graphic sexual behavior between people of the same gender" +msgstr "السلوك الجنسي الجرافيكي بين الناس من نفس الجنس" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:299 +#, fuzzy +msgid "No references to prostitution" +msgstr "إشارات أو تصوير للجنس" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:302 +#, fuzzy +msgid "Indirect references to prostitution" +msgstr "تلميحات استفزازية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:305 +#, fuzzy +msgid "Direct references of prostitution" +msgstr "تلميحات استفزازية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:308 +msgid "Graphic depictions of the act of prostitution" +msgstr "تصوير جرافيك لممارسة البغاء" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:311 +#, fuzzy +msgid "No references to adultery" +msgstr "إشارات منتجات التبغ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:314 +msgid "Indirect references to adultery" +msgstr "إشارات غير مباشرة إلى الزنا" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:317 +msgid "Direct references of adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:320 +msgid "Graphic depictions of the act of adultery" +msgstr "تصوير جرافيك لفعل الزنا" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:323 +msgid "No sexualized characters" +msgstr "بدون شخصيات جنسية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:326 +msgid "Scantily clad human characters" +msgstr "يكتنفه الشخصيات البشرية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:329 +msgid "Overtly sexualized human characters" +msgstr "شخصيات بشرية جنسية بشكل علني" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:332 +#, fuzzy +msgid "No references to desecration" +msgstr "إشارات أو تصوير للجنس" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:335 +msgid "Depictions or references to historical desecration" +msgstr "تصوير أو إشارات تدنيس تاريخية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:338 +msgid "Depictions of modern-day human desecration" +msgstr "تصوير تدنيس الإنسان الحديث" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:341 +msgid "Graphic depictions of modern-day desecration" +msgstr "صور جرافيك لتدنيس العصر الحديث" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:344 +msgid "No visible dead human remains" +msgstr "لا توجد رفات بشرية ميتة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:347 +msgid "Visible dead human remains" +msgstr "بقايا بشرية ميتة ظاهرة" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:350 +msgid "Dead human remains that are exposed to the elements" +msgstr "بقايا بشرية ميتة تتعرض للعناصر" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:353 +msgid "Graphic depictions of desecration of human bodies" +msgstr "الرسوم البيانية لتدنيس الأجسام البشرية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:356 +msgid "No references to slavery" +msgstr "لا إشارات إلى العبودية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:359 +msgid "Depictions or references to historical slavery" +msgstr "تصوير أو إشارات إلى العبودية التاريخية" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:362 +msgid "Depictions of modern-day slavery" +msgstr "تصوير الرق المعاصر" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:365 +msgid "Graphic depictions of modern-day slavery" +msgstr "تصوير جرافيكي للعبودية الحديثة" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:295 +msgid "An application" +msgstr "تطبيق ما" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:301 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "يطلب %s دعما لصيغة ملفات إضافية." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:303 +msgid "Additional MIME Types Required" +msgstr "أنواع MIME أخرى مطلوبة" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:307 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "يطلب %s خطوطا إضافية." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:309 +msgid "Additional Fonts Required" +msgstr "خطوط إضافية مطلوبة" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:313 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "يطلب %s مرمازات وسائط إضافية." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:315 +msgid "Additional Multimedia Codecs Required" +msgstr "مرمازات وسائط إضافية مطلوبة" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:319 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "يطلب %s مشغلات طابعات إضافية." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:321 +msgid "Additional Printer Drivers Required" +msgstr "مشغلات طابعات إضافية مطلوبة" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:325 +#, c-format +msgid "%s is requesting additional packages." +msgstr "يطلب %s حزما إضافية." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:327 +msgid "Additional Packages Required" +msgstr "حزم إضافية مطلوبة" + +# الجمع أفضل لعنوان البرمجيّة +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:336 +msgid "Find in Software" +msgstr "ابحث في «برمجيّات»" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo +#: src/gs-details-page.c:286 src/gs-details-page.c:314 +#: src/gs-details-page.ui:206 src/gs-third-party-repo-row.c:97 +#: src/gs-upgrade-banner.ui:146 +msgid "_Install" +msgstr "_نصّب" + +#. TRANSLATORS: button text in the header when an application +#. * can be live-updated +#: src/gs-details-page.c:319 +msgid "_Update" +msgstr "ح_دث" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo. +#. The ellipsis indicates that further steps are required +#: src/gs-details-page.c:332 src/gs-third-party-repo-row.c:89 +msgid "_Install…" +msgstr "_نصّب…" + +#. TRANSLATORS: A label for a button to execute the selected +#. application. +#: src/gs-details-page.c:366 +msgid "_Launch" +msgstr "أ_طلِق" + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:391 src/gs-details-page.ui:241 +msgid "_Remove" +msgstr "أ_زل" + +#: src/gs-details-page.c:459 +msgid "Removing…" +msgstr "يزيل…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:478 +msgid "Pending installation…" +msgstr "على وشك التنصيب…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:485 +msgid "Pending update…" +msgstr "على وشك التّحديث…" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:802 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "يمكن استخدام هذا التّطبيق فقط إن كان هناك اتّصال نشط بالإنترنت." + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:967 +msgctxt "version" +msgid "Unknown" +msgstr "مجهول" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:980 +msgctxt "updated" +msgid "Never" +msgstr "أبدًا" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1028 +msgctxt "origin" +msgid "Unknown" +msgstr "مجهول" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1425 +msgid "You need internet access to write a review" +msgstr "تحتاج اتصالا بالإنترنت لكتابة تعليق" + +#: src/gs-details-page.c:1559 +#, c-format +msgid "Unable to find “%s”" +msgstr "تعذر العثور على ”%s“" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2162 +msgid "Public domain" +msgstr "ملكية عامة" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://de.wikipedia.org/wiki/Gemeinfreiheit +#: src/gs-details-page.c:2165 +msgid "https://en.wikipedia.org/wiki/Public_domain" +msgstr "" +"https://ar.wikipedia.org/wiki/%D9%85%D9%84%D9%83%D9%8A%D8%A9_%D8%B9%D8%A7%D9%" +"85%D8%A9" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://www.gnu.org/philosophy/free-sw.de +#: src/gs-details-page.c:2172 +msgid "https://www.gnu.org/philosophy/free-sw" +msgstr "https://www.gnu.org/philosophy/free-sw.ar.html" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2182 src/gs-details-page.ui:1383 +msgid "Free Software" +msgstr "برمجيات حرة" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2239 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "المستخدمون مقيدون بالرخصة الآتية:" +msgstr[1] "المستخدمون مقيدون بالرخصة الآتية:" +msgstr[2] "المستخدمون مقيدون بالرخصتين الآتيتين:" +msgstr[3] "المستخدمون مقيدون بالرخص الآتية:" +msgstr[4] "المستخدمون مقيدون بالرخص الآتية:" +msgstr[5] "المستخدمون مقيدون بالرخص الآتية:" + +#: src/gs-details-page.c:2266 src/gs-details-page.ui:1492 +msgid "More information" +msgstr "مزيد من المعلومات" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "صفحة التّفاصيل" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: src/gs-details-page.ui:346 +msgid "_Add shortcut" +msgstr "أ_ضف اختصارا" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: src/gs-details-page.ui:361 +msgid "Re_move shortcut" +msgstr "أ_زل الاختصار" + +#: src/gs-details-page.ui:456 +msgid "No screenshot provided" +msgstr "لا لقطة شاشة" + +#: src/gs-details-page.ui:492 +msgid "Software Repository Included" +msgstr "مستودعات البرمجيات مُضمَّنة" + +#: src/gs-details-page.ui:493 +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "" +"يتضمّن هذا التّطبيق مستودع برمجيّات يوفّر التّحديثات إلى جانب الوصول إلى " +"برمجيّات أخرى." + +#: src/gs-details-page.ui:506 +msgid "No Software Repository Included" +msgstr "لا مستودعات برمجيات مُضمَّنة" + +#: src/gs-details-page.ui:507 +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "لا يتضمّن هذا التّطبيق مستودع برمجيّات. لن يُحدَّث بالإصدارات الجديدة." + +#: src/gs-details-page.ui:521 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "تُوفِّر توزيعتك هذه البرمجيّة بالفعل و يستحسن عدم استبدالها." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:534 +msgid "Software Repository Identified" +msgstr "تعرّفتُ على مستودع برمجيّات" + +#: src/gs-details-page.ui:535 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"إضافة مستودع البرمجيّات هذا سيُعطيك وصولًا إلى برمجيّات و ترقيات إضافيّة." + +#: src/gs-details-page.ui:536 +msgid "Only use software repositories that you trust." +msgstr "استخدم مستودعات البرمجيّات التي تثق بها فقط." + +#: src/gs-details-page.ui:552 +msgid "_Website" +msgstr "م_وقع الوِب" + +#: src/gs-details-page.ui:567 +msgid "_Donate" +msgstr "_تبرّع" + +#: src/gs-details-page.ui:701 +msgid "Localized in your Language" +msgstr "مُترجم إلى العربية" + +#: src/gs-details-page.ui:713 +msgid "Documentation" +msgstr "التوثيق" + +#: src/gs-details-page.ui:725 +msgid "Release Activity" +msgstr "نشاط الإصدارات" + +#: src/gs-details-page.ui:737 +msgid "System Integration" +msgstr "التكامل مع النظام" + +# هذه البرمجية معزولة +#: src/gs-details-page.ui:749 +msgid "Sandboxed" +msgstr "معزولة" + +#: src/gs-details-page.ui:774 +msgid "Version" +msgstr "الإصدار" + +#: src/gs-details-page.ui:811 +msgid "Age Rating" +msgstr "تصنيف العمر" + +#: src/gs-details-page.ui:849 +msgid "Updated" +msgstr "حُدِّث في" + +#: src/gs-details-page.ui:884 +msgid "Category" +msgstr "الفئة" + +#: src/gs-details-page.ui:922 +msgid "Installed Size" +msgstr "حجم التنصيب" + +#: src/gs-details-page.ui:955 +msgid "Download Size" +msgstr "حجم التنزيل" + +#: src/gs-details-page.ui:1021 +msgid "Developer" +msgstr "المُطوِّر" + +#: src/gs-details-page.ui:1055 +msgid "License" +msgstr "الرّخصة" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1075 +msgid "Free" +msgstr "حرة" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1092 +msgid "Proprietary" +msgstr "محتكرة" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.ui:1109 src/gs-review-row.c:71 +msgid "Unknown" +msgstr "مجهولة" + +# يفترض فصل المفردتين في البرمجيّة، واحدة للصنف وواحدة لترويسة الجدول! +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: src/gs-details-page.ui:1163 src/gs-installed-page.c:490 +#: plugins/core/gs-desktop-common.c:331 +msgid "Add-ons" +msgstr "الإضافات" + +#: src/gs-details-page.ui:1176 +msgid "Selected add-ons will be installed with the application." +msgstr "الإضافات المحدّدة ستُثبَّت مع البرمجيّة." + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-details-page.ui:1219 +msgid "Reviews" +msgstr "المراجعات" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1235 +msgid "_Write a Review" +msgstr "ا_كتب مراجعة" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1257 +msgid "_Show More" +msgstr "ا_عرض المزيد" + +#: src/gs-details-page.ui:1400 +msgid "" +"This means that the software can be freely run, copied, distributed, studied " +"and modified." +msgstr "" +"يعني هذا أنه يمكن تشغيل البرمجية، ونسخها، وتوزيعها، ودراستها وتعديلها بحرية " +"تامة." + +#: src/gs-details-page.ui:1459 +msgid "Proprietary Software" +msgstr "برمجية محتكرة" + +#: src/gs-details-page.ui:1476 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "" +"يعني هذا أن البرمجية مملوكة لشخص أو شركة. غالبا ما توجد تقييدات على " +"استخدامها ولا يمكن الوصول إلى النص البرمجي لها." + +#: src/gs-details-page.ui:1521 +msgid "Unknown Software License" +msgstr "رخصة البرمجية مجهولة" + +#: src/gs-details-page.ui:1538 +msgid "The license terms of this software are unknown." +msgstr "شروط الترخيص لهذه البرمجية مجهولة." + +#: src/gs-details-page.ui:1565 +msgid "The application was rated this way because it features:" +msgstr "صنف التطبيق على هذا النحو لاحتوائه على:" + +#: src/gs-details-page.ui:1591 +msgid "No details were available for this rating." +msgstr "لا ااوفر أي تفاصيل لهذا التصنيف." + +#: src/gs-editor.c:361 +msgid "CSS validated OK!" +msgstr "" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:564 +msgid "Failed to load file" +msgstr "فشل تحميل الملف" + +#. TRANSLATORS: window title +#: src/gs-editor.c:598 src/gs-editor.c:874 +msgid "Unsaved changes" +msgstr "تغييرات غير محفوظة" + +#: src/gs-editor.c:600 +msgid "The application list is already loaded." +msgstr "سبق تحميل قائمة التطبيقات" + +#. TRANSLATORS: button text +#: src/gs-editor.c:604 +msgid "Merge documents" +msgstr "ادمج المستندات" + +#. TRANSLATORS: button text +#: src/gs-editor.c:608 src/gs-editor.c:879 +msgid "Throw away changes" +msgstr "تجاهل التغييرات" + +#. import the new file +#: src/gs-editor.c:620 src/gs-editor.c:652 +msgid "Open AppStream File" +msgstr "افتح ملف AppStream" + +#: src/gs-editor.c:624 +msgid "_Open" +msgstr "ا_فتح" + +#: src/gs-editor.c:656 +msgid "_Save" +msgstr "ا_حفظ" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:676 +msgid "Failed to save file" +msgstr "فشل حفظ الملف" + +#. TRANSLATORS, the %s is the app name, e.g. 'Inkscape' +#: src/gs-editor.c:751 +#, c-format +msgid "%s banner design deleted." +msgstr "" + +#. TRANSLATORS, this is a notification +#: src/gs-editor.c:754 +msgid "Banner design deleted." +msgstr "" + +#: src/gs-editor.c:876 +msgid "The application list has unsaved changes." +msgstr "" + +#. TRANSLATORS: show the program version +#: src/gs-editor.c:1111 +msgid "Use verbose logging" +msgstr "" + +# الجمع أفضل لعنوان البرمجيّة +#. TRANSLATORS: program name, an application to add and remove software repositories +#: src/gs-editor.c:1119 +#, fuzzy +msgid "GNOME Software Banner Designer" +msgstr "برمجيّات جنوم" + +#: src/gs-editor.ui:63 src/gs-editor.ui:77 +#, fuzzy +msgid "No Designs" +msgstr "مصمّمات الواجهات" + +#: src/gs-editor.ui:163 +msgid "Error message here" +msgstr "" + +#: src/gs-editor.ui:250 +msgid "App ID" +msgstr "" + +#: src/gs-editor.ui:341 src/gs-review-dialog.ui:142 +msgid "Summary" +msgstr "الملخص" + +#: src/gs-editor.ui:382 +#, fuzzy +msgid "Editor’s Pick" +msgstr "انتقاءات المحرّرين" + +#. This check button controls whether the application’s banner appears in the “Featured” category +#: src/gs-editor.ui:397 +#, fuzzy +msgid "Category Featured" +msgstr "مُختارة" + +#. button in the info bar +#: src/gs-editor.ui:471 +msgid "Undo" +msgstr "تراجع" + +#: src/gs-editor.ui:524 src/org.gnome.Software.Editor.desktop.in:3 +#, fuzzy +msgid "Banner Designer" +msgstr "مصمّمات الواجهات" + +#: src/gs-editor.ui:547 +msgid "New Banner" +msgstr "" + +#: src/gs-editor.ui:615 +msgid "Import from file" +msgstr "" + +#: src/gs-editor.ui:629 +msgid "Export to file" +msgstr "" + +#: src/gs-editor.ui:643 +msgid "Delete Design" +msgstr "" + +#: src/gs-editor.ui:670 +#, fuzzy +msgid "Featured App" +msgstr "مُختارة" + +#: src/gs-editor.ui:684 +#, fuzzy +msgid "OS Upgrade" +msgstr "تحديثات لنظام التّشغيل" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:147 +msgid " and " +msgstr " و " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:150 +msgid ", " +msgstr "، " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:176 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "الخطوط المتوفرة لنظام الكتابة %s" +msgstr[1] "الخطوط المتوفرة لنظامي الكتابة %s" +msgstr[2] "الخطوط المتوفرة لأنظمة الكتابة %s" +msgstr[3] "الخطوط المتوفرة لأنظمة الكتابة %s" +msgstr[4] "الخطوط المتوفرة لأنظمة الكتابة %s" +msgstr[5] "الخطوط المتوفرة لأنظمة الكتابة %s" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:184 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "البرمجيات المتوفرة لدعم %s" +msgstr[1] "البرمجيات المتوفرة لدعم %s" +msgstr[2] "البرمجيات المتوفرة لدعم %s" +msgstr[3] "البرمجيات المتوفرة لدعم %s" +msgstr[4] "البرمجيات المتوفرة لدعم %s" +msgstr[5] "البرمجيات المتوفرة لدعم %s" + +#: src/gs-extras-page.c:226 +msgid "Unable to Find Requested Software" +msgstr "تعذّر إيجاد البرمجية المطلوبة" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:328 +#, c-format +msgid "%s not found" +msgstr "تعذّر إيجاد %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:332 +msgid "on the website" +msgstr "في موقع الوِب" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:339 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "لا تطبيقات متوفرة توفّر الملف %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:343 src/gs-extras-page.c:354 src/gs-extras-page.c:365 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" +"المعلومات عنْ %s وخيارات طريقة الحصول على التطبيقات الناقصة قد تجدها %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:350 src/gs-extras-page.c:372 +#, c-format +msgid "No applications are available for %s support." +msgstr "لا تطبيقات متوفرة لدعم %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:361 +#, c-format +msgid "%s is not available." +msgstr "%s غير متوفّر." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:376 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" +"المعلومات عنْ %s وخيارات طريقة الحصول على التطبيقات التي توفّر هذه الصيغة قد " +"تجدها %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:383 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "لا خطوط متوفّرة لدعم نظام الكتابة %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:387 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "المعلومات عنْ %s وخيارات طريقة الحصول على الخطوط الإضافية قد تجدها %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:394 lib/gs-plugin-loader.c:1510 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "لا إضافات مِرمازات متوفّرة للنُسق %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:398 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"المعلومات عنْ %s وخيارات طريقة الحصول على المرماز الذي يمكنه تشغيل هذه الصيغة " +"قد تجدها %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:405 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "لا موارد بلازما متوفرة لدعم %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:409 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"المعلومات عنْ %s وخيارات طريقة الحصول على موارد بلازما الإضافية قد تجدها %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:416 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "لا مشغلات طابعات متوفرة ل‍%s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:420 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"المعلومات عنْ %s وخيارات طريقة الحصول على المشغلات الذي يمكنه تشغيل هذه " +"الطابعة قد تجدها %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:464 +msgid "this website" +msgstr "موقع الوِب" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +"للأسف، تعذّر إيجاد %s الذي كنت تبحث عنه. من فضلك طالع %s لمعلومات أخرى." +msgstr[1] "" +"للأسف، تعذّر إيجاد %s الذي كنت تبحث عنه. من فضلك طالع %s لمعلومات أخرى." +msgstr[2] "" +"للأسف، تعذّر إيجاد %s التين كنت تبحث عنهما. من فضلك طالع %s لمعلومات أخرى." +msgstr[3] "" +"للأسف، تعذّر إيجاد %s التي كنت تبحث عنها. من فضلك طالع %s لمعلومات أخرى." +msgstr[4] "" +"للأسف، تعذّر إيجاد %s التي كنت تبحث عنها. من فضلك طالع %s لمعلومات أخرى." +msgstr[5] "" +"للأسف، تعذّر إيجاد %s التي كنت تبحث عنها. من فضلك طالع %s لمعلومات أخرى." + +#: src/gs-extras-page.c:539 src/gs-extras-page.c:595 src/gs-extras-page.c:634 +msgid "Failed to find any search results" +msgstr "فشل إيجاد أي نتيجة بحث" + +#: src/gs-extras-page.c:828 +#, c-format +msgid "%s file format" +msgstr "صيغة الملفات %s" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "صفحة المِرمازات" + +#: src/gs-first-run-dialog.ui:7 src/gs-first-run-dialog.ui:16 +msgid "Welcome" +msgstr "مرحبًا" + +#: src/gs-first-run-dialog.ui:50 +msgid "Welcome to Software" +msgstr "مرحبًا في «برمجيّات»" + +#: src/gs-first-run-dialog.ui:66 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" +"يتيح لك «برمجيّات» تنصيب كلّ البرمجيّات التي تحتاج، ومِن مكان واحد. طالع " +"تزكياتنا، تصفّح الفئات أو ابحث عن التّطبيقات التي تريد." + +#: src/gs-first-run-dialog.ui:85 +msgid "_Let’s Go Shopping" +msgstr "_فلنتسوّق" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: src/gs-hiding-box.c:381 +msgid "Spacing" +msgstr "فراغات" + +#: src/gs-hiding-box.c:382 +msgid "The amount of space between children" +msgstr "المسافة بين الأولاد" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:83 +msgctxt "app status" +msgid "Removed" +msgstr "مُزال" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:89 +msgctxt "app status" +msgid "Installed" +msgstr "مُنصّب" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:95 +msgctxt "app status" +msgid "Updated" +msgstr "مُحدّث" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:101 +msgctxt "app status" +msgid "Unknown" +msgstr "مجهول" + +#: src/gs-history-dialog.ui:6 +msgid "History" +msgstr "التأريخ" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:486 +msgid "System Applications" +msgstr "تطبيقات النّظام" + +#: src/gs-installed-page.c:618 +msgid "Click on items to select them" +msgstr "انقر عناصر لتحديدها" + +#: src/gs-installed-page.c:820 +msgid "Select" +msgstr "حدّد" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "صفحة المنصّبة" + +#: src/gs-installed-page.ui:65 +msgid "_Add to Folder…" +msgstr "أ_ضف إلى مجلّد…" + +#: src/gs-installed-page.ui:73 +msgid "_Move to Folder…" +msgstr "ا_نقل إلى مجلّد…" + +#: src/gs-installed-page.ui:81 +msgid "_Remove from Folder" +msgstr "أ_زل من المجلّد" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:75 +msgid "Software catalog is being downloaded" +msgstr "ينزّل كتالوج البرمجيات" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:79 +msgid "Software catalog is being loaded" +msgstr "يحمّل كتالوج البرمجيات" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "يحمّل الصفحة" + +#: src/gs-loading-page.ui:53 +msgid "Starting up…" +msgstr "يبدأ…" + +#: src/gs-menus.ui:7 +msgid "_Software Repositories" +msgstr "مستودعات البر_مجيات" + +#: src/gs-menus.ui:14 +msgid "_About" +msgstr "_عنْ" + +#: src/gs-menus.ui:18 +msgid "_Quit" +msgstr "أ_نهِ" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "صفحة الرقابة" + +#: src/gs-moderate-page.ui:87 +msgid "There are no reviews to moderate" +msgstr "لا تقييمات لمراقبتها" + +#. add button +#: src/gs-overview-page.c:330 +msgid "More…" +msgstr "أخرى…" + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:496 +msgid "Recommended Audio & Video Applications" +msgstr "التّطبيقات الصّوتيّة والمرئية المُزكّاة" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:501 +msgid "Recommended Games" +msgstr "الألعاب المُزكّاة" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:506 +msgid "Recommended Graphics Applications" +msgstr "التّطبيقات الرّسوميّة المُزكّاة" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:511 +msgid "Recommended Productivity Applications" +msgstr "التّطبيقات الإنتاجيّة المُزكّاة" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:889 src/gs-repos-dialog.c:840 +msgid "Access additional software from selected third party sources." +msgstr "" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:893 src/gs-repos-dialog.c:844 +msgid "" +"Some of this software is proprietary and therefore has restrictions on use, " +"sharing, and access to source code." +msgstr "" +"بعض البرمجيات محتكرة تضع قيودًا على استخدام الكود المصدري و الوصول إليه." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-overview-page.c:898 src/gs-repos-dialog.c:849 +msgid "Find out more…" +msgstr "اطّلع على المزيد…" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:906 src/gs-repos-dialog.c:252 +msgid "Enable" +msgstr "فعّل" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "صفحة النّظرة العامّة" + +#: src/gs-overview-page.ui:49 +msgid "Enable Third Party Software Repositories?" +msgstr "أأفعّل مستودعات برمجيات من طرف ثالث؟" + +#: src/gs-overview-page.ui:117 +msgid "Featured Application" +msgstr "تطبيق مُختار" + +#: src/gs-overview-page.ui:150 +msgid "Categories" +msgstr "الفئات" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-overview-page.ui:310 +msgid "Editor’s Picks" +msgstr "اختيارات المحرّرين" + +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-overview-page.ui:348 +msgid "Recent Releases" +msgstr "الإصدارات الحديثة" + +#: src/gs-overview-page.ui:435 +msgid "No Application Data Found" +msgstr "لم يُعثر على بيانات التّطبيقات" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:489 +#, c-format +msgid "Are you sure you want to purchase %s?" +msgstr "أتريد حقًّا شراء %s؟" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:493 +#, c-format +msgid "%s will be installed, and you will be charged %s." +msgstr "سينصب %s، وسيكلفك %s." + +#. TRANSLATORS: this is button text to purchase the application +#: src/gs-page.c:506 +msgid "Purchase" +msgstr "اشترِ" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:580 +#, c-format +msgid "Prepare %s" +msgstr "حضّر %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * source name, e.g. 'GNOME Nightly' +#: src/gs-page.c:715 +#, c-format +msgid "Are you sure you want to remove the %s source?" +msgstr "أتريد حقا إزالة المصدر %s؟" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:719 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the source to use them again." +msgstr "" +"ستُزال كل التطبيقات من %s، وسيكون عليك إعادة تنصيب المصدر لاستعمالها ثانية." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:727 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "أتريد حقًّا إزالة %s؟" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:730 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "%s سيُزال، وعليك تنصيبه مرّة أخرى إن أردت استخدامه لاحقًا." + +#: lib/gs-plugin-loader.c:1513 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "" +"المعلومات عنْ %s وخيارات طريقة الحصول على المِرماز الذي يمكنه تشغيل هذا النُسق " +"موجودة في موقع الوِب." + +#. TRANSLATORS: this refers to an app (by name) that is installed +#: src/gs-popular-tile.c:69 src/gs-summary-tile.c:75 +#, c-format +msgid "%s (Installed)" +msgstr "%s (منصّبة)" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-popular-tile.c:205 src/gs-shell-search-provider.c:271 +#, c-format +msgid "Source: %s" +msgstr "المصدر: %s" + +#: lib/gs-price.c:111 +#, c-format +msgid "A$%.2f" +msgstr "A$%.2f" + +#: lib/gs-price.c:113 +#, c-format +msgid "C$%.2f" +msgstr "C$%.2f" + +#: lib/gs-price.c:115 +#, c-format +msgid "CN¥%.2f" +msgstr "CN¥%.2f" + +#: lib/gs-price.c:117 +#, c-format +msgid "€%.2f" +msgstr "€%.2f" + +#: lib/gs-price.c:119 +#, c-format +msgid "£%.2f" +msgstr "£%.2f" + +#: lib/gs-price.c:121 +#, c-format +msgid "¥%.2f" +msgstr "¥%.2f" + +#: lib/gs-price.c:123 +#, c-format +msgid "NZ$%.2f" +msgstr "NZ$%.2f" + +#: lib/gs-price.c:125 +#, c-format +msgid "₽%.2f" +msgstr "₽%.2f" + +#: lib/gs-price.c:127 +#, c-format +msgid "US$%.2f" +msgstr "US$%.2f" + +#. Translators: %s is the currency, and %f is the amount. +#. * You can switch the order by using “%2$f %1$s” instead. +#: lib/gs-price.c:131 +#, c-format +msgid "%s %f" +msgstr "%2$f %1$s" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:128 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" +"بعض البرمجيات المنصّبة حاليا غير متوافقة مع %s. إن تابعت فسيُزال الآتي " +"تلقائيا أثناء الترقية:" + +#: src/gs-removal-dialog.ui:27 +msgid "Incompatible Software" +msgstr "برمجية غير متوافقة" + +#: src/gs-removal-dialog.ui:40 +msgid "_Continue" +msgstr "_تابع" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:110 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "لا برمجيّات منصّبة" +msgstr[1] "برمجيّة واحدة منصّبة" +msgstr[2] "برمجيّتان منصّبتان" +msgstr[3] "%u برمجيّات منصّبة" +msgstr[4] "%u برمجيّة منصّبة" +msgstr[5] "%u برمجيّة منصّبة" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:117 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "لا إضافات منصّبة" +msgstr[1] "إضافة واحدة منصّبة" +msgstr[2] "إضافتان منصّبتان" +msgstr[3] "%u إضافات منصّبة" +msgstr[4] "%u إضافة منصّبة" +msgstr[5] "%u إضافة منصّبة" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repos-dialog.c:125 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "لا برمجيّة" +msgstr[1] "برمجيّة واحدة" +msgstr[2] "برمجيّتان" +msgstr[3] "%u برمجيّات" +msgstr[4] "%u برمجيّة" +msgstr[5] "%u برمجيّة" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repos-dialog.c:131 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "لا إضافات" +msgstr[1] "إضافة واحدة" +msgstr[2] "إضافتان" +msgstr[3] "%u إضافات" +msgstr[4] "%u إضافة" +msgstr[5] "%u إضافة" + +# الصيغة الأولى والثانية لن تظهرا أبدا. باقي الصيغ تعتمد على تمييز معدود "%i add-on". +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repos-dialog.c:138 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "لا شيء منصّب" +msgstr[1] "%s و%s منصّبة" +msgstr[2] "%s و%s منصّبتان" +msgstr[3] "%s و%s منصّبة" +msgstr[4] "%s و%s منصّبة" +msgstr[5] "%s و%s منصّبة" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:312 +#, c-format +msgid "Remove “%s”?" +msgstr "أتريد إزالة ”%s“؟" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:317 +#, c-format +msgid "Disable “%s”?" +msgstr "أتريد تعطيل ”%s“؟" + +#. TRANSLATORS: longer dialog text +#: src/gs-repos-dialog.c:321 +msgid "" +"Software that has been installed from this repository will no longer receive " +"updates, including security fixes." +msgstr "" + +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-repos-dialog.c:339 +msgid "Disable" +msgstr "عطّل" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:750 +msgid "the operating system" +msgstr "نظام التشغيل" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:819 src/gs-repos-dialog.c:855 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#. TRANSLATORS: info bar title in the software repositories dialog +#: src/gs-repos-dialog.c:837 +msgid "Third Party Repositories" +msgstr "" + +#: src/gs-repos-dialog.ui:82 +msgid "No Additional Repositories" +msgstr "لا مستودعات إضافية" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for enabling a repo +#: src/gs-repo-row.c:110 +msgid "_Enable" +msgstr "_فعّل" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for removing a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:119 +msgid "_Remove…" +msgstr "أ_زل…" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for disabling a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:124 +msgid "_Disable…" +msgstr "ع_طّل…" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being enabled +#: src/gs-repo-row.c:132 +msgid "Enabling" +msgstr "يفعّل" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being disabled +#: src/gs-repo-row.c:144 +msgid "Disabling" +msgstr "يعطيل" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is enabled. +#: src/gs-repo-row.c:158 +msgid "Enabled" +msgstr "مفعّل" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is disabled. +#: src/gs-repo-row.c:164 +msgid "Disabled" +msgstr "معطّل" + +#: src/gs-repo-row.ui:89 +msgid "URL" +msgstr "المسار" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:95 +msgid "Hate it" +msgstr "أكرهه" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:99 +msgid "Don’t like it" +msgstr "لم يعجبني" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:103 +msgid "It’s OK" +msgstr "لا بأس به" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:107 +msgid "Like it" +msgstr "أعجبني" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:111 +msgid "Love it" +msgstr "أحببته" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:133 +msgid "Please take more time writing the review" +msgstr "من فضلك خُذ وقتك في كتابة المراجعة" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:137 +msgid "Please choose a star rating" +msgstr "من فضلك اختر نجمة تقييمية" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The summary is too short" +msgstr "الملخص قصير جدا" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The summary is too long" +msgstr "الملخص طويل جدا" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:149 +msgid "The description is too short" +msgstr "الوصف قصير جدا" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:153 +msgid "The description is too long" +msgstr "الوصف طويل جدا" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:11 +msgid "Post Review" +msgstr "نشر مراجعة" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:35 +msgid "_Post" +msgstr "ان_شر" + +#: src/gs-review-dialog.ui:85 +msgid "Rating" +msgstr "التقييم" + +#: src/gs-review-dialog.ui:158 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "أعط للمراجعة ملخصا قصيرا، مثل: \"تطبيق رائع، سأنصح به الجميع\"." + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:199 +msgctxt "app review" +msgid "Review" +msgstr "المراجعة" + +#: src/gs-review-dialog.ui:215 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "كيف ترى التطبيق؟ حاول إعطاء أسباب لرأيك." + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:413 +msgid "ratings in total" +msgstr "" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:234 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "يمكنك الإبلاغ عن المراجعات المسيئة أو الوقحة." + +# الجملتان هذه والتي فوقها واحدة أساسا +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:239 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "ما إن تفعل ذلك، سيُخفى التقييم حتى يتحقق منه مدير." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:253 +msgid "Report Review?" +msgstr "أأبلغ عن المراجعة؟" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:257 +msgid "Report" +msgstr "أبلغ" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:112 +msgid "Was this review useful to you?" +msgstr "أكانت هذه المراجعة مفيدة؟" + +#: src/gs-review-row.ui:134 +msgid "Yes" +msgstr "نعم" + +#: src/gs-review-row.ui:148 +msgid "No" +msgstr "لا" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:162 +msgid "Meh" +msgstr "لا أهتم" + +#: src/gs-review-row.ui:196 +msgid "Report…" +msgstr "أبلغ..." + +#: src/gs-review-row.ui:211 +msgid "Remove…" +msgstr "أزل..." + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:314 +msgid "Screenshot not found" +msgstr "لم يُعثر على لقطة شاشة" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:329 +msgid "Failed to load image" +msgstr "فشل في تحميل الصّورة" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:462 +msgid "Screenshot size not found" +msgstr "لم يُعثر على حجم لقطة شاشة" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:492 +msgid "Could not create cache" +msgstr "تعذّر إنشاء الخبيئة" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:553 +msgid "Screenshot not valid" +msgstr "لقطة الشّاشة غير صالحة" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:568 +msgid "Screenshot not available" +msgstr "لقطة الشّاشة غير متوفّرة" + +#: src/gs-screenshot-image.c:621 +msgid "Screenshot" +msgstr "لقطة شاشة" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:158 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "صفحة البحث" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "لم يُعثر على التّطبيق" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:834 src/gs-shell.c:839 src/gs-shell.c:854 src/gs-shell.c:858 +#, c-format +msgid "“%s”" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:910 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:916 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:923 +#, fuzzy +msgid "Unable to download updates" +msgstr "فيما إذا كان يجب تنزيل تحديثات تلقائيا أم لا" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:928 +#, fuzzy +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "الوصول إلى الإنترنت كان مطلوبا ولكنه لم يكن متاحا." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:937 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:942 +#, fuzzy +msgid "Unable to download updates: not enough disk space" +msgstr "لم تكن هناك مساحة حرة في القرص." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:950 +msgid "Unable to download updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:955 +msgid "Unable to download updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:960 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:967 +#, fuzzy +msgid "Unable to get list of updates" +msgstr "اتّصل بالإنترنت لالتماس التّحديثات" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1006 +#, c-format +msgid "Unable to purchase %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1013 +#, c-format +msgid "Unable to purchase %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1020 +#, c-format +msgid "Unable to purchase %s: no payment method setup" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1027 +#, c-format +msgid "Unable to purchase %s: payment was declined" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1034 +#, c-format +msgid "Unable to purchase %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1070 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1076 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1088 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1094 +#, fuzzy, c-format +msgid "Unable to install %s as not supported" +msgstr "الملف ليس مدعوما." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1101 +#, fuzzy +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "الوصول إلى الإنترنت كان مطلوبا ولكنه لم يكن متاحا." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1107 +msgid "Unable to install: the application has an invalid format" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1112 +#, fuzzy, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "لم تكن هناك مساحة حرة في القرص." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1120 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1127 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1134 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the name of the authentication service, +#. * e.g. "Ubuntu One" +#: src/gs-shell.c:1147 +#, c-format +msgid "Your %s account has been suspended." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1151 +msgid "It is not possible to install software until this has been resolved." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the clickable link (e.g. +#. * "http://example.com/what-did-i-do-wrong/") +#: src/gs-shell.c:1162 +#, fuzzy, c-format +msgid "For more information, visit %s." +msgstr "معلومات أخرى" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1171 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1180 +#, fuzzy, c-format +msgid "Unable to install %s" +msgstr "فعّل ونصّب" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to update %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1232 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1238 +#, fuzzy +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "الوصول إلى الإنترنت كان مطلوبا ولكنه لم يكن متاحا." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1246 +#, fuzzy, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "لم تكن هناك مساحة حرة في القرص." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1255 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1262 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1277 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1286 +#, fuzzy, c-format +msgid "Unable to update %s" +msgstr "فشل في التّحديث" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1331 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1336 +#, fuzzy, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "فشلت ترقية %s." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1343 +#, fuzzy +msgid "Unable to upgrade: internet access was required but wasn’t available" +msgstr "الوصول إلى الإنترنت كان مطلوبا ولكنه لم يكن متاحا." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1351 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "لم تكن هناك مساحة حرة في القرص." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1381 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1390 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1438 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1444 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1451 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1460 +#, c-format +msgid "Unable to remove %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1506 +#, fuzzy, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s منصّب الآن" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1513 src/gs-shell.c:1564 src/gs-shell.c:1605 +#: src/gs-shell.c:1653 +#, fuzzy +msgid "Not enough disk space — free up some space and try again" +msgstr "لم تبق مساحة حرة في القرص. من فضلك أفرغ بعض المساحة وحاول مجددا." + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1521 src/gs-shell.c:1572 src/gs-shell.c:1613 +#: src/gs-shell.c:1680 +#, fuzzy +msgid "Sorry, something went wrong" +msgstr "آسفون، هذا لم يعمل" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +#, fuzzy +msgid "Failed to install file: not supported" +msgstr "الملف ليس مدعوما." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1560 +msgid "Failed to install file: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +#, fuzzy +msgid "Failed to install: not supported" +msgstr "الملف ليس مدعوما." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Failed to install: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1647 +#, c-format +msgid "Unable to contact %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1662 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1667 +msgid "This application needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1674 +msgid "AC power is required" +msgstr "" + +#: src/gs-summary-tile.c:80 +#, c-format +msgid "%s (Installing)" +msgstr "%s (يجري تنصيبها)" + +#: src/gs-summary-tile.c:85 +#, c-format +msgid "%s (Removing)" +msgstr "%s (تجري إزالتها)" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for removing multiple repos +#: src/gs-third-party-repo-row.c:106 +msgid "_Remove All" +msgstr "أ_زل الكل" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:131 +msgid "No update description available." +msgstr "لا وصف متوفّر للتّحديث." + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:226 +#, c-format +msgid "Installed on %s" +msgstr "ثُبِّت في %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:246 +msgid "Installed Updates" +msgstr "التّحديثات المنصّبة" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:452 +msgid "Additions" +msgstr "المضاف" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:456 +msgid "Removals" +msgstr "المزال" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:460 +msgid "Updates" +msgstr "المحدّث" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:464 +msgid "Downgrades" +msgstr "المخفّض" + +#: src/gs-update-dialog.ui:111 +msgid "No updates have been installed on this system." +msgstr "لا تحديثات منصّبة في النظام" + +#: src/gs-update-monitor.c:93 +msgid "Security Updates Pending" +msgstr "هناك تحديثات أمنية منتظرة" + +#: src/gs-update-monitor.c:94 +msgid "It is recommended that you install important updates now" +msgstr "من المستحسن تنصيب التحديثات المهمة الآن" + +#: src/gs-update-monitor.c:97 +msgid "Restart & Install" +msgstr "أعد التشغيل ونصّب" + +#: src/gs-update-monitor.c:101 +msgid "Software Updates Available" +msgstr "توجد تحديثات للبرمجيّات" + +#: src/gs-update-monitor.c:102 +msgid "Important OS and application updates are ready to be installed" +msgstr "تحديثات التّطبيقات ونظام التّشغيل المهمّة جاهزة لتُثبَّت" + +#. TRANSLATORS: button text +#: src/gs-update-monitor.c:105 src/gs-updates-page.c:750 +msgid "Not Now" +msgstr "ليس الآن" + +#: src/gs-update-monitor.c:106 +msgid "View" +msgstr "اعرض" + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:260 src/gs-updates-page.ui:46 +msgid "Operating System Updates Unavailable" +msgstr "تحديثات نظام التشغيل غير متاحة" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:262 +msgid "Upgrade to continue receiving security updates." +msgstr "رقِّ لتستمر في الحصول على التحديثات الأمنية." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:316 +#, c-format +msgid "A new version of %s is available to install" +msgstr "توجد إصدارة جديدة من %s متوفرة للتنصيب" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:320 +msgid "Software Upgrade Available" +msgstr "ترقية البرمجيات متوفرة" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:633 +msgid "Software Updates Failed" +msgstr "فشلت تحديثات البرمجيّات" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:635 +msgid "An important OS update failed to be installed." +msgstr "فشل تنصيب تحديث مهمّ لنظام التّشغيل." + +#: src/gs-update-monitor.c:636 +msgid "Show Details" +msgstr "اعرض التّفاصيل" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:659 +msgid "System Upgrade Complete" +msgstr "اكتملت ترقية النظان" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:664 +#, c-format +msgid "Welcome to %s %s!" +msgstr "أهلا في %s %s" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:670 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "لم تُنصّب أيّة تحديات للبرمجيّات" +msgstr[1] "ثُبِّت تحديث واحد للبرمجيّات" +msgstr[2] "ثُبِّت تحديثان للبرمجيّات" +msgstr[3] "ثُبِّتت تحديثات للبرمجيّات" +msgstr[4] "ثُبِّتت تحديثات للبرمجيّات" +msgstr[5] "ثُبِّتت تحديثات للبرمجيّات" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:674 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "لم تنصّب أيّة تحديثات مهمّة لنظام التّشغيل." +msgstr[1] "ثُبِّت تحديث واحد مهمّ لنظام التّشغيل." +msgstr[2] "ثُبِّت تحديثان مهمّان لنظام التّشغيل." +msgstr[3] "ثُبِّتت تحديثات مهمّة لنظام التّشغيل." +msgstr[4] "ثُبِّتت تحديثات مهمّة لنظام التّشغيل." +msgstr[5] "ثُبِّتت تحديثات مهمّة لنظام التّشغيل." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:685 +msgctxt "updates" +msgid "Review" +msgstr "راجع" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:734 +msgid "Failed To Update" +msgstr "فشل في التّحديث" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:740 +msgid "The system was already up to date." +msgstr "النظام محدث بالفعل." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:745 +msgid "The update was cancelled." +msgstr "أُلغِيَ التّحديث." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:751 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"الوصول إلى الإنترنت كان مطلوبا ولكنه لم يكن متاحا. من فضلك تأكد من اتصال " +"الحاسوب بالإنترنت وحاول مجددا." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:757 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"هناك مشاكل أمنية في هذا التحديث. من فضلك راجع موفّر البرمجية للمزيد من " +"التفاصيل." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:763 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "لم تبق مساحة حرة في القرص. من فضلك أفرغ بعض المساحة وحاول مجددا." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:768 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"آسفون، تعذّر تنصيب التحديث. من فضلك انتظر تحديثا آخر وحاول مجددا. إن استمرت " +"المشكلة راسل موفّر البرمجية." + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:298 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:301 +msgid "%l:%M %p" +msgstr "%Ol:%OM %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:307 +msgid "Yesterday, %R" +msgstr "الأمس، %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:311 +msgid "Yesterday, %l:%M %p" +msgstr "الأمس، %Ol:%OM %p" + +#: src/gs-updates-page.c:314 +msgid "Two days ago" +msgstr "منذ يومين" + +#: src/gs-updates-page.c:316 +msgid "Three days ago" +msgstr "منذ ثلاثة أيّام" + +#: src/gs-updates-page.c:318 +msgid "Four days ago" +msgstr "منذ أربعة أيّام" + +#: src/gs-updates-page.c:320 +msgid "Five days ago" +msgstr "منذ خمسة أيّام" + +#: src/gs-updates-page.c:322 +msgid "Six days ago" +msgstr "منذ ستة أيّام" + +#: src/gs-updates-page.c:324 +msgid "One week ago" +msgstr "منذ أسبوع" + +#: src/gs-updates-page.c:326 +msgid "Two weeks ago" +msgstr "منذ أسبوعان" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-updates-page.c:330 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the updates are being downloaded +#: src/gs-updates-page.c:343 +msgid "Downloading new updates…" +msgstr "ينزّل تحديثات جديدة..." + +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:347 +msgid "Looking for new updates…" +msgstr "يلتمس التّحديثات..." + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:414 +msgid "Setting up updates…" +msgstr "يُعدّ التّحديثات..." + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:415 src/gs-updates-page.c:422 +msgid "(This could take a while)" +msgstr "(قد يستغرق هذا بعض الوقت)" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:527 +#, c-format +msgid "Last checked: %s" +msgstr "آخر التماس: %s" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-updates-page.c:746 +msgid "Updates have been installed" +msgstr "ثُبّتت التحديثات" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-updates-page.c:748 +msgid "A restart is required for them to take effect." +msgstr "إعادة التشغيل مطلوبة ليأخذ التحديث مفعوله." + +#. TRANSLATORS: button text +#: src/gs-updates-page.c:752 +msgid "Restart" +msgstr "أعد التشغيل" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-page.c:822 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the button for upgrading all +#. * system firmware +#. TRANSLATORS: This is the button for upgrading all +#. * offline updates +#: src/gs-updates-page.c:825 src/gs-updates-page.c:835 +msgid "Restart & Update" +msgstr "أعد التشغيل و حدّث" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-page.c:832 +msgid "Requires Restart" +msgstr "يتطلب إعادة التشغيل" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-page.c:842 +msgid "Application Updates" +msgstr "تحديثات التطبيقات" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-page.c:845 +msgid "Update All" +msgstr "حدّث الكل" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-page.c:852 +msgid "Device Firmware" +msgstr "" + +#. TRANSLATORS: this is an offline update +#: src/gs-updates-page.c:1041 +msgid "_Restart & Update" +msgstr "أعد التشغيل و _حدّث" + +#. TRANSLATORS: all updates will be installed +#: src/gs-updates-page.c:1045 +msgid "U_pdate All" +msgstr "ح_دّث الكل" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:1132 +#, c-format +msgid "%s %s is no longer supported." +msgstr "لم تعد %s %s مدعومة." + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:1137 +msgid "Your OS is no longer supported." +msgstr "لم يعد نظام تشغيلك مدعوما." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:1142 +msgid "This means that it does not receive security updates." +msgstr "هذا يعمي أنه لا يحصل على تحديثات أمنية." + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:1146 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "من المستحسن الترقية إلى إصدارة أحدث." + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:1403 +msgid "Charges may apply" +msgstr "قد تُطبَّق الرّسوم" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1407 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "التماس التّحديثات أثناء الاتّصال بشبكة الجوّال قد يسبّب لك تحمّلًا للرّسوم." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:1411 +msgid "Check Anyway" +msgstr "التمس بأيّ حال" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:1427 +msgid "No Network" +msgstr "لا شبكة" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1431 +msgid "Internet access is required to check for updates." +msgstr "الوصول بالإنترنت مطلوب لالتماس التّحديثات." + +#: src/gs-updates-page.c:1836 +msgid "Restart & _Install" +msgstr "أعد التشغيل و_نصّب" + +#: src/gs-updates-page.c:1854 +msgid "Check for updates" +msgstr "التمس التّحديثات" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "صفحة التّحديثات" + +#: src/gs-updates-page.ui:194 +msgid "Software is up to date" +msgstr "البرمجيّات مُحدَّثة" + +#: src/gs-updates-page.ui:245 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "التماس التّحديثات عند الاتّصال بشبكة الجوّال قد يسبّب لك تحمّلًا للرّسوم" + +#: src/gs-updates-page.ui:257 +msgid "_Check Anyway" +msgstr "ال_تمس بأيّ حال" + +#: src/gs-updates-page.ui:300 +msgid "Go online to check for updates" +msgstr "اتّصل بالإنترنت لالتماس التّحديثات" + +#: src/gs-updates-page.ui:311 +msgid "_Network Settings" +msgstr "إعدادات ال_شّبكة" + +#: src/gs-updates-page.ui:393 +msgid "Updates are automatically managed" +msgstr "التحديثات مُدارة تلقائية" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:85 +#, c-format +msgid "%s %s Now Available" +msgstr "باتت %s %s متوفرة" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "Downloading %s %s" +msgstr "ينزل %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:106 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "باتت %s %s جاهزة للتنصيب" + +#: src/gs-upgrade-banner.ui:32 +msgid "A major upgrade, with new features and added polish." +msgstr "ترقية رئيسية فيها مزايا جديدة وتحسينات." + +#: src/gs-upgrade-banner.ui:52 +msgid "_Learn More" +msgstr "ا_طلع على المزيد" + +#: src/gs-upgrade-banner.ui:98 +msgid "" +"It is recommended that you back up your data and files before upgrading." +msgstr "من المستحسن أخذ نسخة احتياطية عن البيانات والملفات قبل الترقية." + +#: src/gs-upgrade-banner.ui:116 +msgid "_Download" +msgstr "ن_زّل" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "أضف، أزل أو حدّث البرمجيّات على هذا الحاسوب" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/org.gnome.Software.desktop.in:6 +#: src/org.gnome.Software.Editor.desktop.in:6 +msgid "org.gnome.Software" +msgstr "org.gnome.Software" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"تحديثات;ترقيات;مصادر;مستودعات;تفضيلات;تنصيب;إزالة;برنامج;برمجية;تطبيق;سوق;تحد" +"يث;ترقية;مصدر;مستودع;" + +#: src/org.gnome.Software.Editor.desktop.in:4 +msgid "Design the featured banners for GNOME Software" +msgstr "صمم صورة البرمجيات المختارة لتطبيق برمجيات جنوم" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.Editor.desktop.in:13 +msgid "AppStream;Software;App;" +msgstr "" + +#: plugins/core/gs-desktop-common.c:30 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "الكلّ" + +#: plugins/core/gs-desktop-common.c:33 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "مُختارة" + +#: plugins/core/gs-desktop-common.c:36 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "إنشاء الصوتيات وتحريرها" + +#: plugins/core/gs-desktop-common.c:42 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "مشغلات الموسيقى" + +#: plugins/core/gs-desktop-common.c:51 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "الكلّ" + +#: plugins/core/gs-desktop-common.c:54 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "مُختارة" + +#: plugins/core/gs-desktop-common.c:57 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "المنقّحات" + +#: plugins/core/gs-desktop-common.c:60 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "بيئات التطوير المتكاملة" + +#: plugins/core/gs-desktop-common.c:69 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "الكلّ" + +#: plugins/core/gs-desktop-common.c:73 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "مُختارة" + +#: plugins/core/gs-desktop-common.c:77 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "الذّكاء الاصطناعيّ" + +#: plugins/core/gs-desktop-common.c:80 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "الفلك" + +#: plugins/core/gs-desktop-common.c:84 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "الكيمياء" + +#: plugins/core/gs-desktop-common.c:88 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "اللّغات" + +#: plugins/core/gs-desktop-common.c:92 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "الرّياضيّات" + +#: plugins/core/gs-desktop-common.c:99 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "الروبوتات" + +#: plugins/core/gs-desktop-common.c:108 +msgctxt "Menu of Games" +msgid "All" +msgstr "الكل" + +#: plugins/core/gs-desktop-common.c:111 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "مختارة" + +#: plugins/core/gs-desktop-common.c:114 +msgctxt "Menu of Games" +msgid "Action" +msgstr "الإثارة" + +#: plugins/core/gs-desktop-common.c:117 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "المغامرة" + +#: plugins/core/gs-desktop-common.c:120 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "الممرّات" + +#: plugins/core/gs-desktop-common.c:123 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "الكُتل" + +#: plugins/core/gs-desktop-common.c:126 +msgctxt "Menu of Games" +msgid "Board" +msgstr "الألواح" + +#: plugins/core/gs-desktop-common.c:129 +msgctxt "Menu of Games" +msgid "Card" +msgstr "الورق" + +#: plugins/core/gs-desktop-common.c:132 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "المحاكيات" + +#: plugins/core/gs-desktop-common.c:135 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "الأطفال" + +#: plugins/core/gs-desktop-common.c:138 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "المنطق" + +#: plugins/core/gs-desktop-common.c:141 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "لعب الأدوار" + +#: plugins/core/gs-desktop-common.c:144 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "الرّياضة" + +#: plugins/core/gs-desktop-common.c:148 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "الاستراتيجيّة" + +#: plugins/core/gs-desktop-common.c:156 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "الكلّ" + +#: plugins/core/gs-desktop-common.c:159 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "مُختارة" + +#: plugins/core/gs-desktop-common.c:162 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "الرّسوميّات ثلاثيّة الأبعاد" + +#: plugins/core/gs-desktop-common.c:165 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "التّصوير" + +#: plugins/core/gs-desktop-common.c:168 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "المسح الضوئي" + +#: plugins/core/gs-desktop-common.c:171 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "الرّسوميّات المتّجهيّة" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "العارضات" + +#: plugins/core/gs-desktop-common.c:182 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "الكلّ" + +#: plugins/core/gs-desktop-common.c:185 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "مُختارة" + +#: plugins/core/gs-desktop-common.c:188 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "التّقويم" + +#: plugins/core/gs-desktop-common.c:192 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "قواعد البيانات" + +#: plugins/core/gs-desktop-common.c:195 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "الماليّة" + +#: plugins/core/gs-desktop-common.c:199 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "معالِجات الكلمات" + +#: plugins/core/gs-desktop-common.c:208 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "الخطوط" + +#: plugins/core/gs-desktop-common.c:211 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "المِرمازات" + +#: plugins/core/gs-desktop-common.c:214 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "مصادر الدخل" + +#: plugins/core/gs-desktop-common.c:217 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "حزم اللغات" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Add-ons" +msgid "Shell Extensions" +msgstr "امتدادات الصدفة" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "التوطين" + +#: plugins/core/gs-desktop-common.c:226 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "مشغلات العتاد" + +#: plugins/core/gs-desktop-common.c:234 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "الكلّ" + +#: plugins/core/gs-desktop-common.c:237 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "مُختارة" + +#: plugins/core/gs-desktop-common.c:240 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "الدردشة" + +#: plugins/core/gs-desktop-common.c:247 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "الأخبار" + +#: plugins/core/gs-desktop-common.c:251 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "متصفّحات الوِب" + +#: plugins/core/gs-desktop-common.c:259 +msgctxt "Menu of Utilities" +msgid "All" +msgstr "الكلّ" + +#: plugins/core/gs-desktop-common.c:262 +msgctxt "Menu of Utilities" +msgid "Featured" +msgstr "مُختارة" + +#: plugins/core/gs-desktop-common.c:265 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "محرّرات النّصوص" + +#: plugins/core/gs-desktop-common.c:273 +msgctxt "Menu of Reference" +msgid "All" +msgstr "الكلّ" + +#: plugins/core/gs-desktop-common.c:276 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "مُختارة" + +#: plugins/core/gs-desktop-common.c:279 +msgctxt "Menu of Art" +msgid "Art" +msgstr "الفنّ" + +#: plugins/core/gs-desktop-common.c:282 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "السير الذاتية" + +#: plugins/core/gs-desktop-common.c:285 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "القصص المصوّرة" + +#: plugins/core/gs-desktop-common.c:288 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "الخيال" + +#: plugins/core/gs-desktop-common.c:291 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "الصحة" + +#: plugins/core/gs-desktop-common.c:294 +msgctxt "Menu of Reference" +msgid "History" +msgstr "التاريخ" + +#: plugins/core/gs-desktop-common.c:297 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "نمط الحياة" + +#: plugins/core/gs-desktop-common.c:300 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "السياسة" + +#: plugins/core/gs-desktop-common.c:303 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "الرّياضة" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: plugins/core/gs-desktop-common.c:313 +msgid "Audio & Video" +msgstr "الصوتيات والمرئيات" + +#. TRANSLATORS: this is the menu spec main category for Development +#: plugins/core/gs-desktop-common.c:316 +msgid "Developer Tools" +msgstr "أدوات التّطوير" + +#. TRANSLATORS: this is the menu spec main category for Education & Science +#: plugins/core/gs-desktop-common.c:319 +msgid "Education & Science" +msgstr "التّعليم و العلوم" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:322 +msgid "Games" +msgstr "الألعاب" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: plugins/core/gs-desktop-common.c:325 +msgid "Graphics & Photography" +msgstr "الرسومات والتّصوير" + +#. TRANSLATORS: this is the menu spec main category for Office +#: plugins/core/gs-desktop-common.c:328 +msgid "Productivity" +msgstr "الإنتاجية" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: plugins/core/gs-desktop-common.c:334 +msgid "Communication & News" +msgstr "التواصل والأخبار" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:337 +msgid "Reference" +msgstr "المراجع" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:340 +msgid "Utilities" +msgstr "الأدوات" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:71 +msgid "OS Updates" +msgstr "تحديثات لنظام التّشغيل" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:76 +msgid "Includes performance, stability and security improvements." +msgstr "يتضمّن تحسينات الأداء، والثّبات والأمن." + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:55 +#, fuzzy +msgid "Downloading featured images…" +msgstr "ينزّل تحديثات جديدة..." + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:112 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: plugins/external-appstream/gs-install-appstream.c:114 +#, fuzzy +msgid "Failed to parse command line arguments" +msgstr "فشل في تحميل الصّورة" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:121 +msgid "You need to specify exactly one filename" +msgstr "" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:128 +msgid "This program can only be used by the root user" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:136 +msgid "Failed to validate content type" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:143 +#, fuzzy +msgid "Failed to copy" +msgstr "فشل في التّحديث" + +#. TRANSLATORS: status text when downloading +#: plugins/external-appstream/gs-plugin-external-appstream.c:243 +#, fuzzy +msgid "Downloading extra metadata files…" +msgstr "ينزّل تحديثات جديدة..." + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:217 +#, fuzzy +msgid "Downloading upgrade information…" +msgstr "ينزّل تحديثات جديدة..." + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:311 +msgid "Upgrade your Fedora system to the latest features and improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:607 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#. TRANSLATORS: status text when downloading the RuntimeRepo +#: plugins/flatpak/gs-flatpak.c:2781 +#, fuzzy +msgid "Getting runtime source…" +msgstr "يُعدّ التّحديثات..." + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:695 +#, fuzzy +msgid "Downloading firmware update signature…" +msgstr "ينزّل تحديثات جديدة..." + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:736 +#, fuzzy +msgid "Downloading firmware update metadata…" +msgstr "ينزّل تحديثات جديدة..." + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:826 +#, fuzzy +msgid "Downloading firmware update…" +msgstr "ينزّل تحديثات جديدة..." + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:6 +msgid "Limba Support" +msgstr "" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:7 +msgid "Limba provides developers a way to easily create software bundles" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:205 +#, fuzzy +msgid "Downloading application ratings…" +msgstr "ينزّل تحديثات جديدة..." + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "" + +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:392 +#, fuzzy +msgid "GNOME Shell Extensions Repository" +msgstr "امتدادات الصدفة" + +#. TRANSLATORS: status text when downloading +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:704 +#, fuzzy +msgid "Downloading shell extension metadata…" +msgstr "ينزّل تحديثات جديدة..." + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:205 +msgid "Snap Store" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snappy Support" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/steam/gs-plugin-steam.c:600 +#, fuzzy +msgid "Downloading application page…" +msgstr "ينزّل تحديثات جديدة..." + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:6 +msgid "Steam Support" +msgstr "" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:7 +msgid "The ultimate entertainment platform from Valve" +msgstr "" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "قائمة المصادر الإضافية التي فُعّلت سابقا" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "قائمة المصادر التي فُعّلت سابقا عند تثبيت تطبيقات طرف ثالث." + +#~ msgid "Show non-free software in search results" +#~ msgstr "اعرض البرمجيات غير الحرة في نتائج البحث" + +#~| msgid "The list of extra sources that have been previously enabled" +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "قائمة المصادر غير الحرة التي يمكن تفعيلها اختياريًا" + +#~ msgid "About Software" +#~ msgstr "عنْ «برمجيّات»" + +#~ msgid "Total" +#~ msgstr "المجموع" + +#~ msgid "Could not find '%s'" +#~ msgstr "تعذّر إيجاد '%s'" + +#~ msgid "" +#~ "Provides access to additional software, including web browsers and games." +#~ msgstr "يتيح الوصول لبرمجياتت إضافية، بما فيها متصفحات الوب و الألعاب." + +#~| msgid "Enable Third-Party Software Source?" +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "أأفعّل مصادر البرمجيات المحتكرة؟" + +#~ msgid "_Install All" +#~ msgstr "_ثبّتها كلها" + +#~ msgid "Other Updates" +#~ msgstr "تحديثات أخرى" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "لا تطبيقات أو إضافات مثبّتة، ولكن قد تكون هناك برمجيات أخرى كذلك" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "تضع عادة قيودًا على استخدام الكود المصدري و الوصول إليه." + +#~| msgid "Proprietary Software" +#~ msgid "Proprietary Software Sources" +#~ msgstr "مصادر البرمجيات المحتكرة" + +#~ msgid "Remove Source" +#~ msgstr "أزل المصدر" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "يمكن تنزيل مصادر البرمجيات من الإنترنت، فتُعطيك وصولًا إلى برمجيّات أخرى لا " +#~ "توفّرها %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "إزالة مصدر يزيل أيضًا أيّة برمجيّة ثبّتّها منه." + +#~ msgid "No software installed from this source" +#~ msgstr "لا برمجيّات مثبّتة من هذا المصدر" + +#~ msgid "Installed from this Source" +#~ msgstr "مُثبّت من هذا المصدر" + +#~ msgid "Source Details" +#~ msgstr "تفاصيل المصدر" + +#~ msgid "Last Checked" +#~ msgstr "آخر التماس" + +#~ msgid "Added" +#~ msgstr "أُضيف في" + +#~ msgid "Website" +#~ msgstr "موقع الوِب" + +#~ msgid "Installation of %s failed." +#~ msgstr "فشل تثبيت %s." + +#~ msgid "Removal of %s failed." +#~ msgstr "فشلت إزالة %s." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "من فضلك تأكد من اتصال الحاسوب بالإنترنت وحاول مجددا." + +#~ msgid "Please free up some space and try again." +#~ msgstr "من فضلك أفرغ بعض المساحة وحاول مجددا." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "إن استمرت المشكلة راسل موفّر البرمجية." + +#~ msgctxt "content rating violence-cartoon" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "تفاعل اللاعبين مع بعض في إعداد بدون ميزة دردشة" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "بلا" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "الكل" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "مختارة" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "الكل" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "مختارة" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "الكل" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "مختارة" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "الكل" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "مختارة" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "الكلّ" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "مختارة" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "الكل" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "مختارة" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "الفلك" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "الكيمياء" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "الرّياضيّات" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "الكل" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "مختارة" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "الكل" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "مختارة" + +#~ msgid "Science" +#~ msgstr "العلوم" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "مصادر البرمجيّات تُعطيك وصولًا إلى برمجيّات إضافيّة." + +#~ msgid "3rd party" +#~ msgstr "من طرف ثالث" + +#~ msgid "web app" +#~ msgstr "تطبيق وِب" + +#~ msgid "nonfree" +#~ msgstr "ليس حرّا" + +#~ msgid "shell extension" +#~ msgstr "امتداد صدفة" + +# no need be translatable +#~ msgid "page0" +#~ msgstr "الصفحة0" + +# no need be translatable +#~ msgid "page1" +#~ msgstr "الصفحة1" + +#~ msgid "_Installing" +#~ msgstr "ي_ثبّت" + +#~ msgid "_Removing" +#~ msgstr "يُ_زال" + +#~ msgid " or " +#~ msgstr " أو " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "مجهولة" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "هذه البرمجية من طرف ثالث." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "هذه البرمجية من طرف ثالث ولربما يكون فيها ما هو غير حر." + +#~ msgid "This software may contain non-free components." +#~ msgstr "قد يكون في هذه البرمجية ما هو غير حر." + +# هذا وسم في صفحة التطبيق +#~| msgid "nonfree" +#~ msgid "non-free" +#~ msgstr "غير حر" + +#~ msgid "One Star" +#~ msgstr "نجمة واحدة" + +#~ msgid "Two Stars" +#~ msgstr "نجمتان" + +#~ msgid "Three Stars" +#~ msgstr "ثلاث نجوم" + +#~ msgid "Four Stars" +#~ msgstr "أربع نجوم" + +#~ msgid "Five Stars" +#~ msgstr "خمس نجوم" + +#~ msgid "A previous update was unfinished." +#~ msgstr "لم يكتمل التّحديث السّابق." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "تعذّر تثبيت التحديث، أغلب الظن أنها مشكلة مع التحديث نفسه. من فضلك انتظر " +#~ "تحديثا آخر وحاول مجددا." + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "يحسب…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "مجهول" + +#~ msgid "Internet Only Application" +#~ msgstr "تطبيق إنترنت فقط" + +#~ msgid "_History" +#~ msgstr "ال_تّأريخ" + +#~ msgid "Size" +#~ msgstr "الحجم" + +#~ msgid "Recommended Office Applications" +#~ msgstr "التّطبيقات المكتبيّة المُزكّاة" + +#~ msgid "No AppStream data found" +#~ msgstr "لم يُعثر على بيانات AppStream" + +#~ msgid "Audio" +#~ msgstr "الصّوت" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "قواعد البيانات" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "حرق الأقراص" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "هواة المذياع" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "المازجات" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "الموسيقى" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "المسجّلات" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "المتسلسلات" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "الموالفات" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "البناء" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "قواعد البيانات" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "بيئات التّطوير المتكاملة" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "التّعرفة" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Revision Control" +#~ msgstr "التحكّم بالمراجعات" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Translation" +#~ msgstr "التّرجمة" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "تطوير الوِب" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "الأحياء" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "علوم الحاسوب" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Construction" +#~ msgstr "التشييد" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "التّصوير البيانيّ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "الاقتصاد" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "الكهرباء" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "الإلكترونيّات" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "الهندسة" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "الجيولوجيا" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "علوم الأرض" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "التّاريخ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Humanities" +#~ msgstr "الإنسانيّات" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "معالجة الصور" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "الأدب" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "الخرائط" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Medical" +#~ msgstr "الدواء" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "الموسيقى" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "المحلّلات الرّقميّة" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "الحوسبة المتوازية" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "الفيزياء" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "الروحانيّات" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "إطلاق النّار" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "المحاكاة" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "الرّياضة" + +#~ msgid "Graphics" +#~ msgstr "الرّسوميّات" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "الرّسوميّات ثنائيّة الأبعاد" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "التّعرّف الضّوئيّ على المحارف" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "النّشر" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "الرّسوميّات التّسامتيّة" + +#~ msgid "Internet" +#~ msgstr "الإنترنت" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "الطلب الهاتفيّ" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "البريد الإلكترونيّ" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "التّغذيات" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "نقل الملفّات" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "هواة المذياع" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "التّراسل الفوريّ" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "عملاء IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "المِرقابات" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "ندّ إلى ندّ (P2P)" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Remote Access" +#~ msgstr "الوصول البعيد" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "الهاتف" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "تطوير الوِب" + +#~ msgid "Office" +#~ msgstr "المكتب" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "الرّسم البيانيّ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "إدارة المتراسلين" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "القواميس" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "البريد الإلكترونيّ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "الرّسوم البيانيّة الانسيابيّة" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "المساعدات الرّقميّة الشّخصيّة" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "التّصوير" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Presentation" +#~ msgstr "العروض التقديميّة" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "إدارة المشاريع" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "النّشر" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "الجداول الممتدّة" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "العارضات" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "الفنّ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "الذّكاء الاصطناعيّ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "الفلك" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "الأحياء" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "الكيمياء" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "علوم الحاسوب" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "التشييد" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "التّصوير البيانيّ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "الاقتصاد" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "الكهرباء" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "الإلكترونيّات" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "الهندسة" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "الجغرافيا" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "الجيولوجيا" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "علوم الأرض" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "التّاريخ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "الإنسانيّات" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "معالجة الصّور" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "اللّغات" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "الأدب" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "الخرائط" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "الرّياضيّات" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "الدّواء" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "المحلّلات الرّقميّة" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "الحوسبة المتوازية" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "الفيزياء" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "الرّوبوتات" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "الرّوحانيّات" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "الرّياضة" + +#~ msgid "System" +#~ msgstr "النّظام" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "المحاكيات" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "مدراء ملفّات" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File System" +#~ msgstr "نظام الملفّات" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "أدوات الملفّات" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "المِرقابات" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "الأمن" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "محاكيات الطّرفيّة" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "الإتاحة" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "الأرشفة" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "الآلات الحاسبة" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "السّاعات" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "الضغط" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "أدوات الملفّات" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "الخرائط" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "الرّوحانيّات" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "أدوات الهاتف" + +#~ msgid "Video" +#~ msgstr "الفيديو" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "التّحرير" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "قواعد البيانات" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "حرق الأقراص" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Players" +#~ msgstr "المشغّلات" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "المسجّلات" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "التلفزة" + +#~ msgid "Enter GApplication service mode" +#~ msgstr "ادخُل وضع خدمة GApplication" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "أحد التّحديثات لم يكن مُوقّعًا كما ينبغي." + +#~ msgid "The update could not be completed." +#~ msgstr "تعذّر إكمال التّحديث." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "طُلب تحديث دون اتّصال لكن لم تحتج أيّ حزم تحديثًا." + +#~ msgid "No space was left on the drive." +#~ msgstr "لم تبق أيّ مساحة على القرص." + +#~ msgid "An update failed to install correctly." +#~ msgstr "فشل تثبيت تحديث كما ينبغي." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "فشل التّحديث دون اتّصال بصورة غير مُتوقّعة." + +#~ msgid "Checking for updates…" +#~ msgstr "يلتمس التّحديثات..." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "لا تطبيق و %i من الملحقات مثبتة" +#~ msgstr[1] "تطبيق واحد (%i) و %i من الملحقات مثبتة" +#~ msgstr[2] "تطبيقان (%i) و %i من الملحقات مثبتة" +#~ msgstr[3] "%i تطبيقات و %i من الملحقات مثبتة" +#~ msgstr[4] "%i تطبيقًا و %i من الملحقات مثبتة" +#~ msgstr[5] "%i تطبيق و %i من الملحقات مثبتة" + +#~ msgid "No sources found." +#~ msgstr "لم يُعثر على مصادر." + +#~ msgid "OK" +#~ msgstr "حسنًا" diff --git a/po/as.po b/po/as.po new file mode 100644 index 0000000..8f0dee0 --- /dev/null +++ b/po/as.po @@ -0,0 +1,2007 @@ +# Assamese translation for gnome-software. +# Copyright (C) 2014 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Nilamdyuti Goswami , 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"software&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-06 07:37+0000\n" +"PO-Revision-Date: 2014-09-06 18:06+0530\n" +"Last-Translator: Nilamdyuti Goswami \n" +"Language-Team: Assamese \n" +"Language: as\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 1.5\n" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:1 +msgid "Application manager for GNOME" +msgstr "GNOME ৰ বাবে এপ্লিকেচন ব্যৱস্থাপক" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:2 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" +"চফ্টৱেৰে আপোনাক নতুন এপ্লিকেচনসমূহ আৰু চিস্টেম স্প্ৰসাৰনসমূহ সন্ধান কৰি " +"ইনস্টল কৰাৰ আৰু " +"স্থায়ী ইনস্টল্ড এপ্লিকেচনসমূহ আতৰোৱাৰ সুবিধা দিয়ে।" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:3 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" +"GNOME চফ্টৱেৰে উপযোগী বিৱৰণসমূহ আৰু প্ৰতি এপ্লিকেচন একাধিক স্ক্ৰিনশ্বটৰ সৈতে " +"জনপ্ৰিয় " +"এপ্লিকেচনসমূহ দেখুৱায়। এপ্লিকেচনসমূহক বিভাগসমূহৰ তালিকা ব্ৰাউছ কৰি অথবা " +"সন্ধান কৰি " +"বিচাৰি পোৱা যাব। ই লগতে এটা অফলাইন আপডেইট ব্যৱহাৰ কৰি আপোনাক চিস্টেম আপডেইট " +"কৰাৰ সুবিধা দিয়ে।" + +#: ../src/app-folder-dialog.ui.h:1 +msgid "Add to Application Folder" +msgstr "এপ্লিকেচন ফোল্ডাৰলৈ যোগ কৰক" + +#: ../src/app-folder-dialog.ui.h:2 ../src/gs-app-folder-dialog.c:337 +#: ../src/gs-shell-details.c:225 ../src/gs-shell-installed.c:603 +msgid "_Cancel" +msgstr "বাতিল কৰক (_C)" + +#: ../src/app-folder-dialog.ui.h:3 ../src/gs-app-folder-dialog.c:342 +msgid "_Add" +msgstr "যোগ কৰক (_A)" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is installed +#: ../src/app-tile.ui.h:1 ../src/gs-app-addon-row.c:103 +#: ../src/gs-app-tile.c:72 ../src/gs-app-tile.c:75 ../src/gs-feature-tile.c:66 +#: ../src/gs-popular-tile.c:73 ../src/gs-popular-tile.c:76 +#: ../src/popular-tile.ui.h:1 +msgid "Installed" +msgstr "ইনস্টল্ড" + +#. TRANSLATORS: this is the application name +#. set the window title back to default +#. TRANSLATORS: this is the main window title +#: ../src/org.gnome.Software.desktop.in.h:1 ../src/gnome-software.ui.h:3 +#: ../src/gs-application.c:265 ../src/gs-shell.c:156 +msgid "Software" +msgstr "চফ্টৱেৰ" + +#: ../src/org.gnome.Software.desktop.in.h:2 +msgid "Add, remove or update software on this computer" +msgstr "এই কমপিউটাৰৰ চফ্টৱেৰ যোগ কৰক, আতৰাওক অথবা আপডেইট কৰক" + +#: ../src/org.gnome.Software.desktop.in.h:3 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"আপডেইটসমূহ;উন্নয়ন;উৎসসমূহ;ভঁৰালসমূহ;পছন্দসমূহ;ইনস্টল;আনইনস্টল;প্ৰগ্ৰাম;চফ্টৱেৰ" +";এপ;সংৰক্ষণ;" + +#: ../src/gnome-software-local-file.desktop.in.h:1 +msgid "Software Install" +msgstr "চফ্টৱেৰ ইনস্টল" + +#: ../src/gnome-software-local-file.desktop.in.h:2 +msgid "Install selected software on the system" +msgstr "চিস্টেমত নিৰ্বাচিত চফ্টৱেৰ ইনস্টল কৰক" + +#: ../src/gnome-software.ui.h:1 +msgid "Select All" +msgstr "সকলো বাছক" + +#: ../src/gnome-software.ui.h:2 +msgid "Select None" +msgstr "একো নাবাছিব" + +#. vim: set noexpandtab: +#: ../src/gnome-software.ui.h:4 ../src/gs-sources-dialog.ui.h:2 +#: ../src/gs-update-dialog.ui.h:1 +msgid "Go back" +msgstr "উভতি যাওক" + +#. Translators: A label for a button to show all available software. +#: ../src/gnome-software.ui.h:6 +msgid "_All" +msgstr "সকলো (_A)" + +#. Translators: A label for a button to show only software which is already installed. +#: ../src/gnome-software.ui.h:8 +msgid "_Installed" +msgstr "ইনস্টল্ড (_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: ../src/gnome-software.ui.h:10 +msgid "_Updates" +msgstr "আপডেইটসমূহ (_U)" + +#: ../src/gnome-software.ui.h:11 +msgid "Restart & _Install" +msgstr "পুনাৰম্ভ কৰক আৰু ইনস্টল কৰক (_I)" + +#: ../src/gnome-software.ui.h:12 +msgid "Select" +msgstr "বাছক" + +#: ../src/gnome-software.ui.h:13 +msgid "Check for updates" +msgstr "আপডেইসমূহৰ বাবে নিৰীক্ষণ কৰক" + +#: ../src/gs-app-folder-dialog.c:325 +msgid "Folder Name" +msgstr "ফোল্ডাৰৰ নাম" + +#. TRANSLATORS: this is the title of the about window +#: ../src/gs-application.c:263 +msgid "About Software" +msgstr "চফ্টৱেৰৰ বিষয়ে" + +#. TRANSLATORS: well, we seem to think so, anyway +#: ../src/gs-application.c:268 +msgid "A nice way to manage the software on your system." +msgstr "আপোনাৰ চিস্টেমৰ চফ্টৱেৰ ব্যৱস্থাপনা কৰাৰ এটা ধূনীয়া পদ্ধতি।" + +#: ../src/gs-application.c:272 +msgid "translator-credits" +msgstr "নীলমদ্যুতি গোস্বামী (ngoswami@redhat.com)" + +#: ../src/gs-application.c:531 +msgid "Enter GApplication service mode" +msgstr "GApplication সেৱা অৱস্থাত যাওক" + +#. TRANSLATORS: this is a command line option +#: ../src/gs-application.c:534 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "আৰম্ভণি অৱস্থা: ‘আপডেইটসমূহ’, ‘আপডেইটেড’, ‘ইনস্টল্ড’ অথবা ‘অভাৰভিউ’" + +#: ../src/gs-application.c:534 +msgid "MODE" +msgstr "অৱস্থা" + +#: ../src/gs-application.c:536 +msgid "Search for applications" +msgstr "এপ্লিকেচনসমূহ সন্ধান কৰক" + +#: ../src/gs-application.c:536 +msgid "SEARCH" +msgstr "সন্ধান কৰক" + +#: ../src/gs-application.c:538 +msgid "Show application details" +msgstr "এপ্লিকেচনৰ বিৱৰণসমূহ দেখুৱাওক" + +#: ../src/gs-application.c:538 +msgid "ID" +msgstr "ID" + +#: ../src/gs-application.c:540 +msgid "Open a local package file" +msgstr "এটা স্থানীয় পেকেইজ ফাইল খোলক" + +#: ../src/gs-application.c:540 +msgid "FILENAME" +msgstr "ফাইলনাম" + +#: ../src/gs-application.c:542 +msgid "Show verbose debugging information" +msgstr "ভাৰবৌছ ডিবাগিং তথ্য দেখুৱাওক" + +#: ../src/gs-application.c:544 +msgid "Show profiling information for the service" +msgstr "সেৱাৰ বাবে আলেখ্য তথ্য দেখুৱাওক" + +#: ../src/gs-application.c:546 +msgid "Prefer local file sources to AppStream" +msgstr "AppStream ৰ পৰিৱৰ্তে স্থানীয় ফাইল উৎসসমূহ পছন্দ" + +#. TRANSLATORS: this is a label that describes an application +#. * that has been queued for installation +#: ../src/gs-app-addon-row.c:98 ../src/gs-app-row.c:201 +#: ../src/gs-shell-details.ui.h:4 +msgid "Pending" +msgstr "বাকি আছে" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being installing +#: ../src/gs-app-addon-row.c:107 ../src/gs-app-row.c:228 +#: ../src/gs-app-tile.c:81 ../src/gs-app-tile.c:84 +msgid "Installing" +msgstr "ইনস্টল কৰা হৈছে" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being removed +#: ../src/gs-app-addon-row.c:111 ../src/gs-app-row.c:237 +#: ../src/gs-app-tile.c:90 ../src/gs-app-tile.c:93 +msgid "Removing" +msgstr "আতৰোৱা হৈছে" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-row.c:191 +msgid "Visit website" +msgstr "ৱেবছাইট চাওক" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: ../src/gs-app-row.c:198 +msgid "Cancel" +msgstr "বাতিল কৰক" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-row.c:208 +msgid "Install" +msgstr "ইনস্টল কৰক" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: ../src/gs-app-row.c:217 ../src/gs-shell-details.c:1128 +#: ../src/gs-shell-installed.c:182 ../src/gs-shell-search.c:164 +msgid "Remove" +msgstr "আতৰাওক" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user there is an update for the installed +#. * application available +#: ../src/gs-app-tile.c:99 ../src/gs-app-tile.c:103 +#: ../src/gs-feature-tile.c:71 ../src/gs-popular-tile.c:82 +#: ../src/gs-popular-tile.c:86 +msgid "Updates" +msgstr "আপডেইটসমূহ" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: ../src/gs-category.c:207 +msgid "Other" +msgstr "অন্য" + +#. vim: set noexpandtab: +#: ../src/gs-first-run-dialog.ui.h:1 +msgid "Welcome" +msgstr "স্বাগতম" + +#: ../src/gs-first-run-dialog.ui.h:2 +msgid "Welcome to Software" +msgstr "চফ্টৱেৰলৈ স্বাগতম" + +#: ../src/gs-first-run-dialog.ui.h:3 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" +"চফ্টৱেৰে আপোনাক আপোনাৰ প্ৰয়োজনৰ সকলো চফ্টৱেৰ, এটা স্থানৰ পৰা ইনস্টল কৰাৰ " +"সুবিধা " +"দিয়ে। আমাৰ পৰামৰ্শ চাওক, বিভাগসমূহ ব্ৰাউছ কৰক, অথবা আপুনি বিচৰা " +"এপ্লিকেচনসমূহৰ " +"বাবে সন্ধান কৰক।" + +#: ../src/gs-first-run-dialog.ui.h:4 +msgid "_Let’s Go Shopping" +msgstr "বোলক কিনিব যাও (_L)" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: ../src/gs-history-dialog.c:82 +msgctxt "app status" +msgid "Removed" +msgstr "আতৰোৱা হৈছে" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: ../src/gs-history-dialog.c:88 +msgctxt "app status" +msgid "Installed" +msgstr "ইনস্টল্ড" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: ../src/gs-history-dialog.c:93 +msgctxt "app status" +msgid "Updated" +msgstr "আপডেইটেড" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: ../src/gs-history-dialog.c:99 +msgctxt "app status" +msgid "Unknown" +msgstr "অজ্ঞাত" + +#. vim: set noexpandtab: +#: ../src/gs-history-dialog.ui.h:1 +msgid "History" +msgstr "ইতিহাস" + +#. TRANSLATORS: this is when the offline update failed +#: ../src/gs-offline-updates.c:254 +msgid "Failed To Update" +msgstr "আপডেইট কৰিবলে ব্যৰ্থ" + +#. TRANSLATORS: the transaction could not be completed +#. * as a previous transaction was unfinished +#: ../src/gs-offline-updates.c:260 +msgid "A previous update was unfinished." +msgstr "এটা পূৰ্বৱৰ্তী আপডেইট অসম্পূৰ্ণ আছিল।" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: ../src/gs-offline-updates.c:270 +msgid "Network access was required but not available." +msgstr "নেটৱৰ্ক অভিগমৰ প্ৰয়োজন আছিল কিন্তু উপলব্ধ নাছিল।" + +#. TRANSLATORS: if the package is not signed correctly +#. * +#: ../src/gs-offline-updates.c:279 +msgid "An update was not signed in the correct way." +msgstr "এটা আপডেইট সঠিকভাৱে স্বাক্ষৰ কৰা হোৱা নাছিল।" + +#. TRANSLATORS: the transaction failed in a way the user +#. * probably cannot comprehend. Package management systems +#. * really are teh suck. +#: ../src/gs-offline-updates.c:289 +msgid "The update could not be completed." +msgstr "আপডেইট সম্পূৰ্ণ কৰিব পৰা নগল।" + +#. TRANSLATORS: the user aborted the update manually +#: ../src/gs-offline-updates.c:294 +msgid "The update was cancelled." +msgstr "আপডেইট বাতিল কৰা হৈছিল।" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: ../src/gs-offline-updates.c:300 +msgid "An offline update was requested but no packages required updating." +msgstr "" +"এটা অফলাইন আপডেইটৰ অনুৰোধ কৰা হৈছিল কিন্তু পেকেইজৰ আপডেইটৰ প্ৰয়োজন নাছিল।" + +#. TRANSLATORS: we ran out of disk space +#: ../src/gs-offline-updates.c:304 +msgid "No space was left on the drive." +msgstr "ডিভাইচত কোনো স্থান অৱশিষ্ট নাছিল।" + +#. TRANSLATORS: the update process failed in a general +#. * way, usually this message will come from source distros +#. * like gentoo +#: ../src/gs-offline-updates.c:312 +msgid "An update failed to install correctly." +msgstr "এটা আপডেইট সঠিকভাৱে ইনস্টল হবলে ব্যৰ্থ হল।" + +#. TRANSLATORS: We didn't handle the error type +#: ../src/gs-offline-updates.c:317 +msgid "The offline update failed in an unexpected way." +msgstr "অফলাইন আপডেইট এটা অপ্ৰত্যাশিত পদ্ধতিত ব্যৰ্থ হল।" + +#. TRANSLATORS: these are geeky messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: ../src/gs-offline-updates.c:326 +msgid "Detailed errors from the package manager follow:" +msgstr "পেকেইজ ব্যৱস্থাপকৰ পৰা বিৱৰিত ত্ৰুটি অনুকৰণ কৰে:" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: ../src/gs-plugin-loader.c:900 +msgid "OS Updates" +msgstr "OS আপডেইটসমূহ" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: ../src/gs-plugin-loader.c:905 +msgid "Includes performance, stability and security improvements." +msgstr "পৰিৱেশন, স্থিৰতা আৰু সুৰক্ষা উন্নয়নসমূহ অন্তৰ্ভুক্ত কৰে।" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-plugin-loader.c:1503 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s বিন্যাসৰ বাবে কোনো এডঅন কডেক উপলব্ধ নাই।" + +#: ../src/gs-plugin-loader.c:1506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "" +"%s ৰ বিষয়ে তথ্য, লগতে এই বিন্যাস চলাব পৰা এটা কডেক কেনেকৈ প্ৰাপ্ত কৰিব তাৰ " +"বিষয়ে " +"বিকল্পসমূহ ৱেবছাইটত পাব।" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: ../src/gs-screenshot-image.c:208 +msgid "Screenshot not found" +msgstr "স্ক্ৰিনশ্বট পোৱা নগল" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: ../src/gs-screenshot-image.c:226 +msgid "Failed to load image" +msgstr "ছবি ল'ড কৰিবলে ব্যৰ্থ" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: ../src/gs-screenshot-image.c:354 +msgid "Screenshot size not found" +msgstr "স্ক্ৰিনশ্বট আকাৰ পোৱা নগল" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: ../src/gs-screenshot-image.c:373 +msgid "Could not create cache" +msgstr "ক্যাশ সৃষ্টি কৰিব পৰা নগল" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: ../src/gs-screenshot-image.c:390 +msgid "Screenshot not valid" +msgstr "স্ক্ৰিনশ্বট বৈধ নহয়" + +#. TRANSLATORS: this is when networking is not available +#: ../src/gs-screenshot-image.c:396 +msgid "Screenshot not available" +msgstr "স্ক্ৰিনশ্বট উপলব্ধ নহয়" + +#: ../src/gs-screenshot-image.c:454 +msgid "Screenshot" +msgstr "স্ক্ৰিনশ্বট" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#: ../src/gs-shell-details.c:175 ../src/gs-shell-details.ui.h:2 +msgid "_Install" +msgstr "ইনস্টল কৰক (_I)" + +#. TRANSLATORS: button text in the header when an application +#. * is in the process of being installed +#: ../src/gs-shell-details.c:186 +msgid "_Installing" +msgstr "ইনস্টল কৰা হৈছে (_I)" + +#. TRANSLATORS: button text in the header when an application can be erased +#: ../src/gs-shell-details.c:212 ../src/gs-shell-details.ui.h:3 +msgid "_Remove" +msgstr "আতৰাওক (_R)" + +#. TRANSLATORS: button text in the header when an application can be installed +#: ../src/gs-shell-details.c:219 +msgid "_Removing" +msgstr "আতৰোৱা হৈছে (_R)" + +#. TRANSLATORS: this is where the licence is not known +#: ../src/gs-shell-details.c:584 +msgctxt "license" +msgid "Unknown" +msgstr "অজ্ঞাত" + +#. TRANSLATORS: this is where the version is not known +#: ../src/gs-shell-details.c:597 +msgctxt "version" +msgid "Unknown" +msgstr "অজ্ঞাত" + +#. TRANSLATORS: this is where the size is being worked out +#: ../src/gs-shell-details.c:603 +msgctxt "size" +msgid "Calculating…" +msgstr "গণনা কৰা হৈছে…" + +#. TRANSLATORS: this is where the size is not known +#: ../src/gs-shell-details.c:606 +msgctxt "size" +msgid "Unknown" +msgstr "অজ্ঞাত" + +#. TRANSLATORS: this is where the updated date is not known +#: ../src/gs-shell-details.c:618 +msgctxt "updated" +msgid "Never" +msgstr "কেতিয়াও নহয়" + +#. TRANSLATORS: this is the application isn't in any +#. * defined menu category +#: ../src/gs-shell-details.c:633 +msgctxt "menu category" +msgid "None" +msgstr "কোনো নহয়" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: ../src/gs-shell-details.c:643 +msgctxt "origin" +msgid "Unknown" +msgstr "অজ্ঞাত" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: ../src/gs-shell-details.c:1113 ../src/gs-shell-installed.c:167 +#: ../src/gs-shell-search.c:149 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "আপুনি %s ক আতৰাবলৈ নিশ্চিত নে?" + +#. TRANSLATORS: longer dialog text +#: ../src/gs-shell-details.c:1125 ../src/gs-shell-installed.c:179 +#: ../src/gs-shell-search.c:161 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" +"%s ক আতৰোৱা হব, আৰু আপুনি ইয়াক পুনৰ ব্যৱহাৰ কৰিবলে ইয়াক ইনস্টল কৰিব লাগিব।" + +#. vim: set noexpandtab: +#: ../src/gs-shell-details.ui.h:1 +msgid "Details page" +msgstr "বিৱৰণসমূহ পৃষ্ঠা" + +#: ../src/gs-shell-details.ui.h:5 +msgid "Software Source Included" +msgstr "চফ্টৱেৰ উৎস অন্তৰ্ভুক্ত" + +#: ../src/gs-shell-details.ui.h:6 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "" +"এই এপ্লিকেচনে এটা চফ্টৱেৰ উৎস অন্তৰ্ভুক্ত কৰে যি আপডেইটসমূহ, লগতে অন্য " +"চফ্টৱেৰলৈ " +"অভিগম প্ৰদান কৰে।" + +#: ../src/gs-shell-details.ui.h:7 +msgid "No Software Source Included" +msgstr "কোনো চফ্টৱেৰ উৎস অন্তৰ্ভুক্ত নহয়" + +#: ../src/gs-shell-details.ui.h:8 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "" +"এই এপ্লিকেচনে এটা চফ্টৱেৰ উৎস অন্তৰ্ভুক্ত নকৰে। ইয়াক নতুন সংস্কৰণসমূহৰ সৈতে " +"আপডেইট " +"কৰা নহব।" + +#: ../src/gs-shell-details.ui.h:9 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"এই চফ্টৱেৰক আপোনাৰ বিতৰন দ্বাৰা ইতিমধ্যে প্ৰদান কৰা হৈছে আৰু প্ৰতিস্থাপন কৰা " +"হব " +"নালাগে।" + +#. Translators: a repository file used for installing software has been discovered. +#: ../src/gs-shell-details.ui.h:11 +msgid "Software Source Identified" +msgstr "চফ্টৱেৰ উৎস চিনাক্ত কৰা হৈছে" + +#: ../src/gs-shell-details.ui.h:12 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "এই চফ্টৱেৰ যোগ কৰিলে আপুনি অতিৰিক্ত চফ্টৱেৰ আৰু উন্নয়নসমূহ পাব।" + +#: ../src/gs-shell-details.ui.h:13 +msgid "Only use software sources that you trust." +msgstr "কেৱলক আপুনি ভৰষা কৰা চফ্টৱেৰ উৎসসমূহ ব্যৱহাৰ কৰক।" + +#: ../src/gs-shell-details.ui.h:14 +msgid "Internet Only Application" +msgstr "কেৱল ইন্টাৰনেট এপ্লিকেচন" + +#: ../src/gs-shell-details.ui.h:15 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" +"এই এপ্লিকেচনক কেৱল এটা সক্ৰিয় ইন্টাৰনেট সংযোগ থাকোতে ব্যৱহাৰ কৰিব পাৰি।" + +#: ../src/gs-shell-details.ui.h:16 +msgid "_Website" +msgstr "ৱেবছাইট (_W)" + +#: ../src/gs-shell-details.ui.h:17 +msgid "_History" +msgstr "ইতিহাস (_H)" + +#. Translators: A label for a button to execute the selected application. +#: ../src/gs-shell-details.ui.h:19 +msgid "_Launch" +msgstr "আৰম্ভ কৰক (_L)" + +#: ../src/gs-shell-details.ui.h:20 +msgid "Details" +msgstr "বিৱৰণসমূহ" + +#: ../src/gs-shell-details.ui.h:21 ../src/gs-sources-dialog.ui.h:9 +msgid "Version" +msgstr "সংস্কৰণ" + +#: ../src/gs-shell-details.ui.h:22 +msgid "Updated" +msgstr "আপডেইটেড" + +#: ../src/gs-shell-details.ui.h:23 +msgid "Category" +msgstr "বিভাগ" + +#: ../src/gs-shell-details.ui.h:24 +msgid "Source" +msgstr "উৎস" + +#: ../src/gs-shell-details.ui.h:25 +msgid "License" +msgstr "অনুজ্ঞা" + +#: ../src/gs-shell-details.ui.h:26 +msgid "Size" +msgstr "আকাৰ" + +#: ../src/gs-shell-details.ui.h:27 +msgid "Developer" +msgstr "উন্নয়নকাৰী" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the main category for Add-ons +#: ../src/gs-shell-details.ui.h:28 ../src/gs-shell-installed.c:515 +#: ../src/gs-update-list.c:88 ../src/plugins/menu-spec-common.c:210 +msgid "Add-ons" +msgstr "এড-অনসমূহ" + +#: ../src/gs-shell-details.ui.h:29 +msgid "Selected add-ons will be installed with the application." +msgstr "নিৰ্বাচিত এড-অনসমূহক এপ্লিকেচনৰ সৈতে ইনস্টল কৰা হব।" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: ../src/gs-shell-installed.c:505 +msgid "System Applications" +msgstr "চিস্টেম এপ্লিকেচনসমূহ" + +#: ../src/gs-shell-installed.c:611 +msgid "Click on items to select them" +msgstr "বস্তুবোৰ নিৰ্বাচন কৰিবলে সিহতত ক্লিক কৰক" + +#. vim: set noexpandtab: +#: ../src/gs-shell-installed.ui.h:1 +msgid "Installed page" +msgstr "ইনস্টল্ড পৃষ্ঠা" + +#: ../src/gs-shell-installed.ui.h:2 +msgid "_Add to Folder…" +msgstr "ফোল্ডাৰত যোগ কৰক…" + +#: ../src/gs-shell-installed.ui.h:3 +msgid "_Move to Folder…" +msgstr "ফোল্ডাৰত স্থানান্তৰ কৰক…" + +#: ../src/gs-shell-installed.ui.h:4 +msgid "_Remove from Folder" +msgstr "ফোল্ডাৰৰ পৰা আতৰাওক (_R)" + +#. TRANSLATORS: this is a heading for audio applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:315 +msgid "Recommended Audio Applications" +msgstr "উপদেশিত অডিঅ' এপ্লিকেচনসমূহ" + +#. TRANSLATORS: this is a heading for games which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:320 +msgid "Recommended Games" +msgstr "উপদেশিত খেলসমূহ" + +#. TRANSLATORS: this is a heading for graphics applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:325 +msgid "Recommended Graphics Applications" +msgstr "উপদেশিত গ্ৰাফিক্স এপ্লিকেচনসমূহ" + +#. TRANSLATORS: this is a heading for office applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:330 +msgid "Recommended Office Applications" +msgstr "উপদেশিত অফিচ এপ্লিকেচনসমূহ" + +#. vim: set noexpandtab: +#: ../src/gs-shell-overview.ui.h:1 +msgid "Overview page" +msgstr "অভাৰভিউ পৃষ্ঠা" + +#: ../src/gs-shell-overview.ui.h:2 +msgid "Featured Application" +msgstr "বৈশিষ্ট্যপূৰ্ণ এপ্লিকেচন" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: ../src/gs-shell-overview.ui.h:4 +msgid "Editor's Picks" +msgstr "সম্পাদকৰ পছন্দ" + +#: ../src/gs-shell-overview.ui.h:5 +msgid "Categories" +msgstr "বিভাগসমূহ" + +#: ../src/gs-shell-overview.ui.h:6 +msgid "No Application Data Found" +msgstr "কোনো এপ্লিকেচন তথ্য পোৱা নগল" + +#. vim: set noexpandtab: +#: ../src/gs-shell-search.ui.h:1 +msgid "Search page" +msgstr "সন্ধান পৃষ্ঠা" + +#: ../src/gs-shell-search.ui.h:2 +msgid "No Application Found" +msgstr "কোনো এপ্লিকেচন পোৱা নগল" + +#. TRANSLATORS: Time in 24h format +#: ../src/gs-shell-updates.c:146 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: ../src/gs-shell-updates.c:149 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../src/gs-shell-updates.c:155 +msgid "Yesterday, %R" +msgstr "যোৱাকালি, %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: ../src/gs-shell-updates.c:159 +msgid "Yesterday, %l:%M %p" +msgstr "যোৱাকালী, %l:%M %p" + +#: ../src/gs-shell-updates.c:162 +msgid "Two days ago" +msgstr "দুই দিন আগত" + +#: ../src/gs-shell-updates.c:164 +msgid "Three days ago" +msgstr "তিনি দিন আগত" + +#: ../src/gs-shell-updates.c:166 +msgid "Four days ago" +msgstr "চাৰি দিন আগত" + +#: ../src/gs-shell-updates.c:168 +msgid "Five days ago" +msgstr "পাঁচ দিন আগত" + +#: ../src/gs-shell-updates.c:170 +msgid "Six days ago" +msgstr "ছয় দিন আগত" + +#: ../src/gs-shell-updates.c:172 +msgid "One week ago" +msgstr "এক সপ্তাহ আগত" + +#: ../src/gs-shell-updates.c:174 +msgid "Two weeks ago" +msgstr "দুই সপ্তাহ আগত" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: ../src/gs-shell-updates.c:178 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the updates are being downloaded +#: ../src/gs-shell-updates.c:197 +msgid "Downloading new updates…" +msgstr "নতুন আপডেইটসমূহ ডাউনল'ড কৰা…" + +#. TRANSLATORS: the update panel is doing *something* vague +#: ../src/gs-shell-updates.c:201 +msgid "Looking for new updates…" +msgstr "নতুন আপডেইটসমূহৰ বাবে সন্ধান কৰা হৈছে…" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:255 +msgid "Setting up updates…" +msgstr "আপডেইটসমূহ সংস্থাপন কৰা হৈছে…" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:256 ../src/gs-shell-updates.c:263 +msgid "(This could take a while)" +msgstr "(ই অলপ সময় লব পাৰে)" + +#. TRANSLATORS: this is when the updates panel is starting up +#: ../src/gs-shell-updates.c:269 +msgid "Checking for updates…" +msgstr "আপডেইটসমূহৰ বাবে নিৰীক্ষণ কৰা হৈছে…" + +#. TRANSLATORS: This is the time when we last checked for updates +#: ../src/gs-shell-updates.c:403 +#, c-format +msgid "Last checked: %s" +msgstr "সৰ্বশেষ নিৰীক্ষিত: %s" + +#. TRANSLATORS: can't do updates check +#: ../src/gs-shell-updates.c:781 +msgid "No Network" +msgstr "কোনো নেটৱৰ্ক নাই" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:785 +msgid "Internet access is required to check for updates." +msgstr "আপডেইটসমূহৰ বাবে নিৰীক্ষণ কৰিবলে ইন্টাৰনেট অভিগমৰ প্ৰয়োজন।" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:789 +msgid "Network Settings" +msgstr "নেটৱৰ্ক সংহতিসমূহ" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: ../src/gs-shell-updates.c:808 +msgid "Charges may apply" +msgstr "চাৰ্জ প্ৰযোজ্য হব পাৰে" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:812 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"মবাইল ব্ৰডবেণ্ড ব্যৱহাৰ কৰি আপডেইটসমূহ নিৰীক্ষণ কৰিলে আপোনাক চাৰ্জ লাগিব পাৰে।" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:816 +msgid "Check Anyway" +msgstr "তথাপিও নিৰীক্ষণ কৰক" + +#. vim: set noexpandtab: +#: ../src/gs-shell-updates.ui.h:1 +msgid "Updates page" +msgstr "আপডেইটসমূহ পৃষ্ঠা" + +#: ../src/gs-shell-updates.ui.h:2 +msgid "Software is up to date" +msgstr "চফ্টৱেৰ বৰ্তমান তাৰিখলৈ উন্নত" + +#: ../src/gs-shell-updates.ui.h:3 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"মবাইল ব্ৰডবেণ্ড ব্যৱহাৰ কৰি আপডেইটসমূহ নিৰীক্ষণ কৰিলে আপোনাক চাৰ্জ লাগিব পাৰে" + +#: ../src/gs-shell-updates.ui.h:4 +msgid "_Check Anyway" +msgstr "তথাপিও নিৰীক্ষণ কৰক (_C)" + +#: ../src/gs-shell-updates.ui.h:5 +msgid "Go online to check for updates" +msgstr "আপডেইসমূহৰ বাবে নিৰীক্ষণ কৰিবলে অনলাইন হওক" + +#: ../src/gs-shell-updates.ui.h:6 +msgid "_Network Settings" +msgstr "নেটৱৰ্ক সংহতিসমূহ (_N)" + +#. TRANSLATORS: this source has no apps installed from it +#: ../src/gs-sources-dialog.c:91 +msgid "No software installed" +msgstr "কোনো চফ্টৱেৰ ইনস্টল নাই" + +#. TRANSLATORS: this source has some apps installed from it +#: ../src/gs-sources-dialog.c:94 +#, c-format +msgid "%i application installed" +msgid_plural "%i applications installed" +msgstr[0] "%i এপ্লিকেচন ইনস্টল কৰা হল" +msgstr[1] "%i এপ্লিকেচনসমূহ ইনস্টল কৰা হল" + +#. TRANSLATORS: this source has some apps installed from it +#: ../src/gs-sources-dialog.c:99 +#, c-format +msgid "%i add-on installed" +msgid_plural "%i add-ons installed" +msgstr[0] "%i এড-অন ইনস্টল কৰা হল" +msgstr[1] "%i এড-অনসমূহ ইনস্টল কৰা হল" + +#. TRANSLATORS: this source has some apps and addons installed from it +#: ../src/gs-sources-dialog.c:104 +#, c-format +msgid "%i application and %i add-ons installed" +msgid_plural "%i applications and %i add-ons installed" +msgstr[0] "%i এপ্লিকেচন আৰু %i এড-অন ইনস্টল কৰা হল" +msgstr[1] "%i এপ্লিকেচনসমূহ আৰু %i এড-অনসমূহ ইনস্টল কৰা হল" + +#: ../src/gs-sources-dialog.c:296 ../src/gs-sources-dialog.ui.h:13 +msgid "Remove Source" +msgstr "উৎস আতৰাওক" + +#: ../src/gs-sources-dialog.c:311 +msgid "Removing…" +msgstr "আতৰোৱা হৈছে…" + +#. vim: set noexpandtab: +#: ../src/gs-sources-dialog.ui.h:1 +msgid "Software Sources" +msgstr "চফ্টৱেৰ উৎসসমূহ" + +#: ../src/gs-sources-dialog.ui.h:3 +msgid "No sources found." +msgstr "কোনো উৎস পোৱা নগল।" + +#: ../src/gs-sources-dialog.ui.h:4 +msgid "Software sources give you access to additional software." +msgstr "চফ্টৱেৰ উৎসসমূহে আপোনাক অতিৰিক্ত চফ্টৱেৰলৈ অভিগম প্ৰদান কৰে।" + +#: ../src/gs-sources-dialog.ui.h:5 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "এটা উৎস আতৰালে আপুনি ইয়াৰ পৰা ইনস্টল কৰা যিকোনো চফ্টৱেৰ আতৰি যাব।" + +#: ../src/gs-sources-dialog.ui.h:6 +msgid "No software installed from this source" +msgstr "এই উৎসৰ পৰা কোনো চফ্টৱেৰ ইনস্টল কৰা হোৱা নাই" + +#: ../src/gs-sources-dialog.ui.h:7 +msgid "Installed from this Source" +msgstr "এই উৎসৰ পৰা ইনস্টল কৰা" + +#: ../src/gs-sources-dialog.ui.h:8 +msgid "Source Details" +msgstr "উৎসৰ বিৱৰণসমূহ" + +#: ../src/gs-sources-dialog.ui.h:10 +msgid "Last Checked" +msgstr "সৰ্বশেষ নিৰীক্ষিত" + +#: ../src/gs-sources-dialog.ui.h:11 +msgid "Added" +msgstr "যোগ কৰা হৈছে" + +#: ../src/gs-sources-dialog.ui.h:12 +msgid "Website" +msgstr "ৱেবছাইট" + +#. TRANSLATORS: this is where the packager did not write a +#. * description for the update +#: ../src/gs-update-dialog.c:107 +msgid "No update description available." +msgstr "কোনো আপডেইটৰ বিৱৰণ উপলব্ধ নাই।" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: ../src/gs-update-dialog.c:167 +msgid "Installed Updates" +msgstr "ইনস্টল্ড আপডেইটসমূহ" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window +#: ../src/gs-update-dialog.c:180 +#, c-format +msgid "Installed on %s" +msgstr "%s ত ইনস্টল্ড" + +#: ../src/gs-update-monitor.c:99 +msgid "Software Updates Available" +msgstr "চফ্টৱেৰ আপডেইটসমূহ উপলব্ধ" + +#: ../src/gs-update-monitor.c:100 +msgid "Important OS and application updates are ready to be installed" +msgstr "গুৰুত্বপূৰ্ণ OS আৰু এপ্লিকেচন আপডেইট ইনস্টল হবলৈ প্ৰস্তুত" + +#: ../src/gs-update-monitor.c:103 +msgid "View" +msgstr "দৰ্শন" + +#: ../src/gs-update-monitor.c:104 +msgid "Not Now" +msgstr "এতিয়া নহয়" + +#: ../src/gs-update-monitor.c:144 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "চফ্টৱেৰ আপডেইট ইনস্টল কৰা হল" +msgstr[1] "চফ্টৱেৰ আপডেইটসমূহ ইনস্টল কৰা হল" + +#. TRANSLATORS: message when we've done offline updates +#: ../src/gs-update-monitor.c:148 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "এটা গুৰুত্বপূৰ্ণ OS আপডেইট ইনস্টল কৰা হৈছে।" +msgstr[1] "গুৰুত্বপূৰ্ণ OS আপডেইটসমূহ ইনস্টল কৰা হৈছে।" + +#: ../src/gs-update-monitor.c:153 +msgid "Software Updates Failed" +msgstr "চফ্টৱেৰ আপডেইটসমূহ ব্যৰ্থ হল" + +#. TRANSLATORS: message when we offline updates have failed +#: ../src/gs-update-monitor.c:155 +msgid "An important OS update failed to be installed." +msgstr "এটা গুৰুত্বপূৰ্ণ OS আপডেইট ইনস্টল হবলে ব্যৰ্থ হল।" + +#: ../src/gs-update-monitor.c:164 +msgid "Review" +msgstr "পুনৰদৰ্শন" + +#: ../src/gs-update-monitor.c:166 +msgid "Show Details" +msgstr "বিৱৰণসমূহ দেখুৱাওক" + +#: ../src/gs-update-monitor.c:167 +msgid "OK" +msgstr "ঠিক আছে" + +#. vim: set noexpandtab: +#: ../src/gs-star-widget.ui.h:1 +msgid "One Star" +msgstr "এটা তঁৰা" + +#: ../src/gs-star-widget.ui.h:2 +msgid "Two Stars" +msgstr "দুটা তঁৰা" + +#: ../src/gs-star-widget.ui.h:3 +msgid "Three Stars" +msgstr "তিনিটা তঁৰা" + +#: ../src/gs-star-widget.ui.h:4 +msgid "Four Stars" +msgstr "চাৰিটা তঁৰা" + +#: ../src/gs-star-widget.ui.h:5 +msgid "Five Stars" +msgstr "পাঁচটা তঁৰা" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: ../src/gs-utils.c:131 +#, c-format +msgid "%s is now installed" +msgstr "%s এতিয়া ইনস্টল্ড" + +#. TRANSLATORS: this is button that opens the newly installed application +#: ../src/gs-utils.c:135 +msgid "Launch" +msgstr "লঞ্চ" + +#: ../src/gs-utils.c:159 +msgid "Sorry, this did not work" +msgstr "ক্ষমা কৰিব, ই কাম নকৰিলে" + +#. TRANSLATORS: this is when the install fails +#: ../src/gs-utils.c:163 +#, c-format +msgid "Installation of %s failed." +msgstr "%s ৰ ইনস্টলেষণ ব্যৰ্থ হল।" + +#. TRANSLATORS: this is when the remove fails +#: ../src/gs-utils.c:168 +#, c-format +msgid "Removal of %s failed." +msgstr "%s আতৰাব পৰা নগল।" + +#: ../src/plugins/gs-plugin-appstream.c:162 +#, c-format +msgid "No AppStream data found" +msgstr "কোনো AppStream তথ্য পোৱা নগল" + +#. TRANSLATORS: This is how we join the licences and can +#. * be considered a "Conjunctive AND Operator" according +#. * to the SPDX specification. For example: +#. * "LGPL-2.1 and MIT and BSD-2-Clause" +#: ../src/plugins/gs-plugin-appstream.c:305 +msgid " and " +msgstr " আৰু " + +#. TRANSLATORS: This is how we join the licences and can +#. * be considered a "Disjunctive OR Operator" according +#. * to the SPDX specification. For example: +#. * "LGPL-2.1 or MIT" +#: ../src/plugins/gs-plugin-appstream.c:313 +msgid " or " +msgstr " অথবা " + +#. TRANSLATORS: this is when a webapp has no comment +#: ../src/plugins/gs-plugin-epiphany.c:143 +#, c-format +msgid "Web app" +msgstr "ৱেব এপ" + +#. TRANSLATORS: this is the licence of the web-app +#: ../src/plugins/gs-plugin-epiphany.c:151 +msgid "Proprietary" +msgstr "মালিকবৰ্গ" + +#: ../src/plugins/gs-plugin-hardcoded-categories.c:160 +msgid "Featured" +msgstr "বৈশিষ্ট্যপূৰ্ণ" + +#. TRANSLATORS: this is the menu spec main category for Audio +#: ../src/plugins/menu-spec-common.c:30 +msgid "Audio" +msgstr "অডিঅ'" + +#: ../src/plugins/menu-spec-common.c:31 +msgctxt "Menu subcategory of Audio" +msgid "Editing" +msgstr "সম্পাদন" + +#: ../src/plugins/menu-spec-common.c:32 +msgctxt "Menu subcategory of Audio" +msgid "Databases" +msgstr "ডাটাবেইচসমূহ" + +#: ../src/plugins/menu-spec-common.c:33 +msgctxt "Menu subcategory of Audio" +msgid "Disc Burning" +msgstr "ডিস্ক বাৰ্ণিং" + +#: ../src/plugins/menu-spec-common.c:34 +msgctxt "Menu subcategory of Audio" +msgid "Ham Radio" +msgstr "হেম ৰেডিঅ'" + +#: ../src/plugins/menu-spec-common.c:35 +msgctxt "Menu subcategory of Audio" +msgid "MIDI" +msgstr "MIDI" + +#: ../src/plugins/menu-spec-common.c:36 +msgctxt "Menu subcategory of Audio" +msgid "Mixer" +msgstr "মিক্সাৰ" + +#: ../src/plugins/menu-spec-common.c:37 +msgctxt "Menu subcategory of Audio" +msgid "Music" +msgstr "সংগীত" + +#: ../src/plugins/menu-spec-common.c:38 +msgctxt "Menu subcategory of Audio" +msgid "Players" +msgstr "প্লেয়াৰসমূহ" + +#: ../src/plugins/menu-spec-common.c:39 +msgctxt "Menu subcategory of Audio" +msgid "Recorders" +msgstr "ৰেকৰ্ডাৰসমূহ" + +#: ../src/plugins/menu-spec-common.c:40 +msgctxt "Menu subcategory of Audio" +msgid "Sequencers" +msgstr "চিকুৱেন্সাৰসমূহ" + +#: ../src/plugins/menu-spec-common.c:41 +msgctxt "Menu subcategory of Audio" +msgid "Tuners" +msgstr "টিউনাৰসমূহ" + +#. TRANSLATORS: this is the menu spec main category for Development +#: ../src/plugins/menu-spec-common.c:43 +msgid "Development Tools" +msgstr "উন্নয়নকাৰী সঁজুলিসমূহ" + +#: ../src/plugins/menu-spec-common.c:44 +msgctxt "Menu subcategory of Development Tools" +msgid "Building" +msgstr "নিৰ্মাণ" + +#: ../src/plugins/menu-spec-common.c:45 +msgctxt "Menu subcategory of Development Tools" +msgid "Databases" +msgstr "ডাটাবেইচসমূহ" + +#: ../src/plugins/menu-spec-common.c:46 +msgctxt "Menu subcategory of Development Tools" +msgid "Debuggers" +msgstr "ডিবাগাৰসমূহ" + +#: ../src/plugins/menu-spec-common.c:47 +msgctxt "Menu subcategory of Development Tools" +msgid "GUI Designers" +msgstr "GUI ৰূপাঙ্ককসকল" + +#: ../src/plugins/menu-spec-common.c:48 +msgctxt "Menu subcategory of Development Tools" +msgid "IDE" +msgstr "IDE" + +#: ../src/plugins/menu-spec-common.c:49 +msgctxt "Menu subcategory of Development Tools" +msgid "Profiling" +msgstr "আলেখ্যন" + +#: ../src/plugins/menu-spec-common.c:50 +msgctxt "Menu subcategory of Development Tools" +msgid "Project Management" +msgstr "প্ৰকল্প ব্যৱস্থাপনা" + +#: ../src/plugins/menu-spec-common.c:51 +msgctxt "Menu subcategory of Development Tools" +msgid "Revision Control" +msgstr "ৰিভিষণ কনট্ৰল" + +#: ../src/plugins/menu-spec-common.c:52 +msgctxt "Menu subcategory of Development Tools" +msgid "Translation" +msgstr "অনুবাদ" + +#: ../src/plugins/menu-spec-common.c:53 +msgctxt "Menu subcategory of Development Tools" +msgid "Web Development" +msgstr "ৱেব উন্নয়ন" + +#. TRANSLATORS: this is the menu spec main category for Education +#: ../src/plugins/menu-spec-common.c:55 +msgid "Education" +msgstr "শিক্ষা" + +#: ../src/plugins/menu-spec-common.c:56 +msgctxt "Menu subcategory of Education" +msgid "Art" +msgstr "শিল্প" + +#: ../src/plugins/menu-spec-common.c:57 +msgctxt "Menu subcategory of Education" +msgid "Artificial Intelligence" +msgstr "কৃত্ৰিম বুদ্ধি" + +#: ../src/plugins/menu-spec-common.c:58 +msgctxt "Menu subcategory of Education" +msgid "Astronomy" +msgstr "জ্যোতিৰ্বিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:59 +msgctxt "Menu subcategory of Education" +msgid "Biology" +msgstr "জীৱবিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:60 +msgctxt "Menu subcategory of Education" +msgid "Chemistry" +msgstr "ৰসায়ন" + +#: ../src/plugins/menu-spec-common.c:61 +msgctxt "Menu subcategory of Education" +msgid "Computer Science" +msgstr "কমপিউটাৰ বিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:62 +msgctxt "Menu subcategory of Education" +msgid "Construction" +msgstr "নিৰ্মাণ" + +#: ../src/plugins/menu-spec-common.c:63 +msgctxt "Menu subcategory of Education" +msgid "Data Visualization" +msgstr "তথ্য দৃশ্যমানতা" + +#: ../src/plugins/menu-spec-common.c:64 +msgctxt "Menu subcategory of Education" +msgid "Economy" +msgstr "অৰ্থনীতি" + +#: ../src/plugins/menu-spec-common.c:65 +msgctxt "Menu subcategory of Education" +msgid "Electricity" +msgstr "বিদ্যুত" + +#: ../src/plugins/menu-spec-common.c:66 +msgctxt "Menu subcategory of Education" +msgid "Electronics" +msgstr "ইলেকট্ৰনিক্স" + +#: ../src/plugins/menu-spec-common.c:67 +msgctxt "Menu subcategory of Education" +msgid "Engineering" +msgstr "অভিযান্ত্ৰিকী" + +#: ../src/plugins/menu-spec-common.c:68 +msgctxt "Menu subcategory of Education" +msgid "Geography" +msgstr "ভূগল" + +#: ../src/plugins/menu-spec-common.c:69 +msgctxt "Menu subcategory of Education" +msgid "Geology" +msgstr "ভূতত্ত্ব" + +#: ../src/plugins/menu-spec-common.c:70 +msgctxt "Menu subcategory of Education" +msgid "Geoscience" +msgstr "ভূ-বিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:71 +msgctxt "Menu subcategory of Education" +msgid "History" +msgstr "ইতিহাস" + +#: ../src/plugins/menu-spec-common.c:72 +msgctxt "Menu subcategory of Education" +msgid "Humanities" +msgstr "মনুষ্যত্ব" + +#: ../src/plugins/menu-spec-common.c:73 +msgctxt "Menu subcategory of Education" +msgid "Image Processing" +msgstr "ছবি প্ৰক্ৰিয়াকৰণ" + +#: ../src/plugins/menu-spec-common.c:74 +msgctxt "Menu subcategory of Education" +msgid "Languages" +msgstr "ভাষাসমূহ" + +#: ../src/plugins/menu-spec-common.c:75 +msgctxt "Menu subcategory of Education" +msgid "Literature" +msgstr "সাহিত্য" + +#: ../src/plugins/menu-spec-common.c:76 +msgctxt "Menu subcategory of Education" +msgid "Maps" +msgstr "মানচিত্ৰ" + +#: ../src/plugins/menu-spec-common.c:77 +msgctxt "Menu subcategory of Education" +msgid "Math" +msgstr "মেথ" + +#: ../src/plugins/menu-spec-common.c:78 +msgctxt "Menu subcategory of Education" +msgid "Medical" +msgstr "মেডিকেল" + +#: ../src/plugins/menu-spec-common.c:79 +msgctxt "Menu subcategory of Education" +msgid "Music" +msgstr "সংগীত" + +#: ../src/plugins/menu-spec-common.c:80 +msgctxt "Menu subcategory of Education" +msgid "Numerical Analysis" +msgstr "সাংখ্যিক বিশ্লেষণ" + +#: ../src/plugins/menu-spec-common.c:81 +msgctxt "Menu subcategory of Education" +msgid "Parallel Computing" +msgstr "সমান্তৰাল কমপিউটিং" + +#: ../src/plugins/menu-spec-common.c:82 +msgctxt "Menu subcategory of Education" +msgid "Physics" +msgstr "পদাৰ্থবিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:83 +msgctxt "Menu subcategory of Education" +msgid "Robotics" +msgstr "ৰব'টিক্স" + +#: ../src/plugins/menu-spec-common.c:84 +msgctxt "Menu subcategory of Education" +msgid "Spirituality" +msgstr "আধ্যাত্মিক" + +#: ../src/plugins/menu-spec-common.c:85 +msgctxt "Menu subcategory of Education" +msgid "Sports" +msgstr "খেলসমূহ" + +#. TRANSLATORS: this is the menu spec main category for Games +#: ../src/plugins/menu-spec-common.c:87 +msgid "Games" +msgstr "খেলসমূহ" + +#: ../src/plugins/menu-spec-common.c:88 +msgctxt "Menu subcategory of Games" +msgid "Action" +msgstr "কাৰ্য্য" + +#: ../src/plugins/menu-spec-common.c:89 +msgctxt "Menu subcategory of Games" +msgid "Adventure" +msgstr "অভিযান" + +#: ../src/plugins/menu-spec-common.c:90 +msgctxt "Menu subcategory of Games" +msgid "Arcade" +msgstr "আৰ্কেইড" + +#: ../src/plugins/menu-spec-common.c:91 +msgctxt "Menu subcategory of Games" +msgid "Blocks" +msgstr "খণ্ডসমূহ" + +#: ../src/plugins/menu-spec-common.c:92 +msgctxt "Menu subcategory of Games" +msgid "Board" +msgstr "বৰ্ড" + +#: ../src/plugins/menu-spec-common.c:93 +msgctxt "Menu subcategory of Games" +msgid "Card" +msgstr "কাৰ্ড" + +#: ../src/plugins/menu-spec-common.c:94 +msgctxt "Menu subcategory of Games" +msgid "Emulators" +msgstr "ইমুলেটৰ" + +#: ../src/plugins/menu-spec-common.c:95 +msgctxt "Menu subcategory of Games" +msgid "Kids" +msgstr "শিশু" + +#: ../src/plugins/menu-spec-common.c:96 +msgctxt "Menu subcategory of Games" +msgid "Logic" +msgstr "যুক্তি" + +#: ../src/plugins/menu-spec-common.c:97 +msgctxt "Menu subcategory of Games" +msgid "Role Playing" +msgstr "ভূমিকা পালন" + +#: ../src/plugins/menu-spec-common.c:98 +msgctxt "Menu subcategory of Games" +msgid "Shooter" +msgstr "চুটাৰ" + +#: ../src/plugins/menu-spec-common.c:99 +msgctxt "Menu subcategory of Games" +msgid "Simulation" +msgstr "চিমুলেষণ" + +#: ../src/plugins/menu-spec-common.c:100 +msgctxt "Menu subcategory of Games" +msgid "Sports" +msgstr "খেলসমূহ" + +#: ../src/plugins/menu-spec-common.c:101 +msgctxt "Menu subcategory of Games" +msgid "Strategy" +msgstr "কৌশল" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: ../src/plugins/menu-spec-common.c:103 +msgid "Graphics" +msgstr "গ্ৰাফিক্স" + +#: ../src/plugins/menu-spec-common.c:104 +msgctxt "Menu subcategory of Graphics" +msgid "2D Graphics" +msgstr "2D গ্ৰাফিক্স" + +#: ../src/plugins/menu-spec-common.c:105 +msgctxt "Menu subcategory of Graphics" +msgid "3D Graphics" +msgstr "3D গ্ৰাফিক্স" + +#: ../src/plugins/menu-spec-common.c:106 +msgctxt "Menu subcategory of Graphics" +msgid "OCR" +msgstr "OCR" + +#: ../src/plugins/menu-spec-common.c:107 +msgctxt "Menu subcategory of Graphics" +msgid "Photography" +msgstr "ফ'টোগ্ৰাফি" + +#: ../src/plugins/menu-spec-common.c:108 +msgctxt "Menu subcategory of Graphics" +msgid "Publishing" +msgstr "প্ৰকাশন" + +#: ../src/plugins/menu-spec-common.c:109 +msgctxt "Menu subcategory of Graphics" +msgid "Raster Graphics" +msgstr "ৰেস্টাৰ গ্ৰাফিক্স" + +#: ../src/plugins/menu-spec-common.c:110 +msgctxt "Menu subcategory of Graphics" +msgid "Scanning" +msgstr "স্কেনিং" + +#: ../src/plugins/menu-spec-common.c:111 +msgctxt "Menu subcategory of Graphics" +msgid "Vector Graphics" +msgstr "ভেক্টৰ গ্ৰাফিক্স" + +#: ../src/plugins/menu-spec-common.c:112 +msgctxt "Menu subcategory of Graphics" +msgid "Viewer" +msgstr "দৰ্শক" + +#. TRANSLATORS: this is the menu spec main category for Network +#: ../src/plugins/menu-spec-common.c:114 +msgid "Internet" +msgstr "ইন্টাৰনেট" + +#: ../src/plugins/menu-spec-common.c:115 +msgctxt "Menu subcategory of Internet" +msgid "Chat" +msgstr "চেট" + +#: ../src/plugins/menu-spec-common.c:116 +msgctxt "Menu subcategory of Internet" +msgid "Dialup" +msgstr "ডায়েলআপ" + +#: ../src/plugins/menu-spec-common.c:117 +msgctxt "Menu subcategory of Internet" +msgid "Email" +msgstr "ইমেইল" + +#: ../src/plugins/menu-spec-common.c:118 +msgctxt "Menu subcategory of Internet" +msgid "Feed" +msgstr "ফীড" + +#: ../src/plugins/menu-spec-common.c:119 +msgctxt "Menu subcategory of Internet" +msgid "File Transfer" +msgstr "ফাইল স্থানান্তৰ" + +#: ../src/plugins/menu-spec-common.c:120 +msgctxt "Menu subcategory of Internet" +msgid "Ham Radio" +msgstr "হেম ৰেডিঅ'" + +#: ../src/plugins/menu-spec-common.c:121 +msgctxt "Menu subcategory of Internet" +msgid "Instant Messaging" +msgstr "তৎক্ষনাত বাৰ্তা" + +#: ../src/plugins/menu-spec-common.c:122 +msgctxt "Menu subcategory of Internet" +msgid "IRC Clients" +msgstr "IRC ক্লাএণ্টসমূহ" + +#: ../src/plugins/menu-spec-common.c:123 +msgctxt "Menu subcategory of Internet" +msgid "Monitor" +msgstr "মনিটৰ" + +#: ../src/plugins/menu-spec-common.c:124 +msgctxt "Menu subcategory of Internet" +msgid "News" +msgstr "বাতৰি" + +#: ../src/plugins/menu-spec-common.c:125 +msgctxt "Menu subcategory of Internet" +msgid "P2P" +msgstr "P2P" + +#: ../src/plugins/menu-spec-common.c:126 +msgctxt "Menu subcategory of Internet" +msgid "Remote Access" +msgstr "দূৰৱৰ্তী অভিগম" + +#: ../src/plugins/menu-spec-common.c:127 +msgctxt "Menu subcategory of Internet" +msgid "Telephony" +msgstr "টেলিফোনী" + +#: ../src/plugins/menu-spec-common.c:128 +msgctxt "Menu subcategory of Internet" +msgid "Video Conference" +msgstr "ভিডিঅ' কনফাৰেঞ্চ" + +#: ../src/plugins/menu-spec-common.c:129 +msgctxt "Menu subcategory of Internet" +msgid "Web Browser" +msgstr "ৱেব ব্ৰাউছাৰ" + +#: ../src/plugins/menu-spec-common.c:130 +msgctxt "Menu subcategory of Internet" +msgid "Web Development" +msgstr "ৱেব উন্নয়ন" + +#. TRANSLATORS: this is the menu spec main category for Office +#: ../src/plugins/menu-spec-common.c:132 +msgid "Office" +msgstr "অফিচ" + +#: ../src/plugins/menu-spec-common.c:133 +msgctxt "Menu subcategory of Office" +msgid "Calendar" +msgstr "কেলেন্ডাৰ" + +#: ../src/plugins/menu-spec-common.c:134 +msgctxt "Menu subcategory of Office" +msgid "Chart" +msgstr "চাৰ্ট" + +#: ../src/plugins/menu-spec-common.c:135 +msgctxt "Menu subcategory of Office" +msgid "Contact Management" +msgstr "পৰিচয় ব্যৱস্থাপনা" + +#: ../src/plugins/menu-spec-common.c:136 +msgctxt "Menu subcategory of Office" +msgid "Database" +msgstr "ডাটাবেইচ" + +#: ../src/plugins/menu-spec-common.c:137 +msgctxt "Menu subcategory of Office" +msgid "Dictionary" +msgstr "অভিধান" + +#: ../src/plugins/menu-spec-common.c:138 +msgctxt "Menu subcategory of Office" +msgid "Email" +msgstr "ইমেইল" + +#: ../src/plugins/menu-spec-common.c:139 +msgctxt "Menu subcategory of Office" +msgid "Finance" +msgstr "বিত্ত" + +#: ../src/plugins/menu-spec-common.c:140 +msgctxt "Menu subcategory of Office" +msgid "Flow Chart" +msgstr "ফ্ল' চাৰ্ট" + +#: ../src/plugins/menu-spec-common.c:141 +msgctxt "Menu subcategory of Office" +msgid "PDA" +msgstr "PDA" + +#: ../src/plugins/menu-spec-common.c:142 +msgctxt "Menu subcategory of Office" +msgid "Photography" +msgstr "ফ'টোগ্ৰাফি" + +#: ../src/plugins/menu-spec-common.c:143 +msgctxt "Menu subcategory of Office" +msgid "Presentation" +msgstr "পৰিৱেশন" + +#: ../src/plugins/menu-spec-common.c:144 +msgctxt "Menu subcategory of Office" +msgid "Project Management" +msgstr "প্ৰকল্প ব্যৱস্থাপনা" + +#: ../src/plugins/menu-spec-common.c:145 +msgctxt "Menu subcategory of Office" +msgid "Publishing" +msgstr "প্ৰকাশন" + +#: ../src/plugins/menu-spec-common.c:146 +msgctxt "Menu subcategory of Office" +msgid "Spreadsheet" +msgstr "স্প্ৰেডশ্বিট" + +#: ../src/plugins/menu-spec-common.c:147 +msgctxt "Menu subcategory of Office" +msgid "Viewer" +msgstr "দৰ্শক" + +#: ../src/plugins/menu-spec-common.c:148 +msgctxt "Menu subcategory of Office" +msgid "Word Processor" +msgstr "ৱাৰ্ড প্ৰচেছৰ" + +#. TRANSLATORS: this is the menu spec main category for Science +#: ../src/plugins/menu-spec-common.c:150 +msgid "Science" +msgstr "বিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:151 +msgctxt "Menu subcategory of Science" +msgid "Art" +msgstr "শিল্প" + +#: ../src/plugins/menu-spec-common.c:152 +msgctxt "Menu subcategory of Science" +msgid "Artificial Intelligence" +msgstr "কৃত্ৰিম বুদ্ধি" + +#: ../src/plugins/menu-spec-common.c:153 +msgctxt "Menu subcategory of Science" +msgid "Astronomy" +msgstr "জ্যোতিৰ্বিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:154 +msgctxt "Menu subcategory of Science" +msgid "Biology" +msgstr "জীৱবিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:155 +msgctxt "Menu subcategory of Science" +msgid "Chemistry" +msgstr "ৰসায়ন" + +#: ../src/plugins/menu-spec-common.c:156 +msgctxt "Menu subcategory of Science" +msgid "Computer Science" +msgstr "কমপিউটাৰ বিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:157 +msgctxt "Menu subcategory of Science" +msgid "Construction" +msgstr "নিৰ্মাণ" + +#: ../src/plugins/menu-spec-common.c:158 +msgctxt "Menu subcategory of Science" +msgid "Data Visualization" +msgstr "তথ্য দৃশ্যমানতা" + +#: ../src/plugins/menu-spec-common.c:159 +msgctxt "Menu subcategory of Science" +msgid "Economy" +msgstr "অৰ্থনীতি" + +#: ../src/plugins/menu-spec-common.c:160 +msgctxt "Menu subcategory of Science" +msgid "Electricity" +msgstr "বিদ্যুত" + +#: ../src/plugins/menu-spec-common.c:161 +msgctxt "Menu subcategory of Science" +msgid "Electronics" +msgstr "ইলেকট্ৰনিক্স" + +#: ../src/plugins/menu-spec-common.c:162 +msgctxt "Menu subcategory of Science" +msgid "Engineering" +msgstr "অভিযান্ত্ৰিকী" + +#: ../src/plugins/menu-spec-common.c:163 +msgctxt "Menu subcategory of Science" +msgid "Geography" +msgstr "ভূগল" + +#: ../src/plugins/menu-spec-common.c:164 +msgctxt "Menu subcategory of Science" +msgid "Geology" +msgstr "ভূতত্ত্ব" + +#: ../src/plugins/menu-spec-common.c:165 +msgctxt "Menu subcategory of Science" +msgid "Geoscience" +msgstr "ভূ-বিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:166 +msgctxt "Menu subcategory of Science" +msgid "History" +msgstr "ইতিহাস" + +#: ../src/plugins/menu-spec-common.c:167 +msgctxt "Menu subcategory of Science" +msgid "Humanities" +msgstr "মনুষ্যত্ব" + +#: ../src/plugins/menu-spec-common.c:168 +msgctxt "Menu subcategory of Science" +msgid "Image Processing" +msgstr "ছবি প্ৰক্ৰিয়াকৰণ" + +#: ../src/plugins/menu-spec-common.c:169 +msgctxt "Menu subcategory of Science" +msgid "Languages" +msgstr "ভাষাসমূহ" + +#: ../src/plugins/menu-spec-common.c:170 +msgctxt "Menu subcategory of Science" +msgid "Literature" +msgstr "সাহিত্য" + +#: ../src/plugins/menu-spec-common.c:171 +msgctxt "Menu subcategory of Science" +msgid "Maps" +msgstr "মানচিত্ৰ" + +#: ../src/plugins/menu-spec-common.c:172 +msgctxt "Menu subcategory of Science" +msgid "Math" +msgstr "মেথ" + +#: ../src/plugins/menu-spec-common.c:173 +msgctxt "Menu subcategory of Science" +msgid "Medical" +msgstr "মেডিকেল" + +#: ../src/plugins/menu-spec-common.c:174 +msgctxt "Menu subcategory of Science" +msgid "Numerical Analysis" +msgstr "সাংখ্যিক বিশ্লেষণ" + +#: ../src/plugins/menu-spec-common.c:175 +msgctxt "Menu subcategory of Science" +msgid "Parallel Computing" +msgstr "সমান্তৰাল কমপিউটিং" + +#: ../src/plugins/menu-spec-common.c:176 +msgctxt "Menu subcategory of Science" +msgid "Physics" +msgstr "পদাৰ্থবিজ্ঞান" + +#: ../src/plugins/menu-spec-common.c:177 +msgctxt "Menu subcategory of Science" +msgid "Robotics" +msgstr "ৰব'টিক্স" + +#: ../src/plugins/menu-spec-common.c:178 +msgctxt "Menu subcategory of Science" +msgid "Spirituality" +msgstr "আধ্যাত্মিক" + +#: ../src/plugins/menu-spec-common.c:179 +msgctxt "Menu subcategory of Science" +msgid "Sports" +msgstr "খেলসমূহ" + +#. TRANSLATORS: this is the menu spec main category for System +#: ../src/plugins/menu-spec-common.c:181 +msgid "System" +msgstr "চিস্টেম" + +#: ../src/plugins/menu-spec-common.c:182 +msgctxt "Menu subcategory of System" +msgid "Emulator" +msgstr "ইমুলেটৰ" + +#: ../src/plugins/menu-spec-common.c:183 +msgctxt "Menu subcategory of System" +msgid "File Manager" +msgstr "ফাইল ব্যৱস্থাপক" + +#: ../src/plugins/menu-spec-common.c:184 +msgctxt "Menu subcategory of System" +msgid "File System" +msgstr "ফাইল চিস্টেম" + +#: ../src/plugins/menu-spec-common.c:185 +msgctxt "Menu subcategory of System" +msgid "File Tools" +msgstr "ফাইল সঁজুলিসমূহ" + +#: ../src/plugins/menu-spec-common.c:186 +msgctxt "Menu subcategory of System" +msgid "Monitor" +msgstr "মনিটৰ" + +#: ../src/plugins/menu-spec-common.c:187 +msgctxt "Menu subcategory of System" +msgid "Security" +msgstr "সুৰক্ষা" + +#: ../src/plugins/menu-spec-common.c:188 +msgctxt "Menu subcategory of System" +msgid "Terminal Emulator" +msgstr "টাৰ্মিনেল ইমুলেটৰ" + +#. TRANSLATORS: this is the menu spec main category for Utility +#: ../src/plugins/menu-spec-common.c:190 +msgid "Utilities" +msgstr "সঁজুলিসমূহ" + +#: ../src/plugins/menu-spec-common.c:191 +msgctxt "Menu subcategory of Utilities" +msgid "Accessibility" +msgstr "অভিগম্যতা" + +#: ../src/plugins/menu-spec-common.c:192 +msgctxt "Menu subcategory of Utilities" +msgid "Archiving" +msgstr "আৰ্কাইভিং" + +#: ../src/plugins/menu-spec-common.c:193 +msgctxt "Menu subcategory of Utilities" +msgid "Calculator" +msgstr "গণক" + +#: ../src/plugins/menu-spec-common.c:194 +msgctxt "Menu subcategory of Utilities" +msgid "Clock" +msgstr "ঘড়ী" + +#: ../src/plugins/menu-spec-common.c:195 +msgctxt "Menu subcategory of Utilities" +msgid "Compression" +msgstr "সংকোচন" + +#: ../src/plugins/menu-spec-common.c:196 +msgctxt "Menu subcategory of Utilities" +msgid "File Tools" +msgstr "ফাইল সঁজুলিসমূহ" + +#: ../src/plugins/menu-spec-common.c:197 +msgctxt "Menu subcategory of Utilities" +msgid "Maps" +msgstr "মানচিত্ৰ" + +#: ../src/plugins/menu-spec-common.c:198 +msgctxt "Menu subcategory of Utilities" +msgid "Spirituality" +msgstr "আধ্যাত্মিক" + +#: ../src/plugins/menu-spec-common.c:199 +msgctxt "Menu subcategory of Utilities" +msgid "Telephony Tools" +msgstr "টেলিফোনী সঁজুলিসমূহ" + +#: ../src/plugins/menu-spec-common.c:200 +msgctxt "Menu subcategory of Utilities" +msgid "Text Editor" +msgstr "লিখনি সম্পাদক" + +#. TRANSLATORS: this is the menu spec main category for Video +#: ../src/plugins/menu-spec-common.c:202 +msgid "Video" +msgstr "ভিডিঅ'" + +#: ../src/plugins/menu-spec-common.c:203 +msgctxt "Menu subcategory of Video" +msgid "Editing" +msgstr "সম্পাদন" + +#: ../src/plugins/menu-spec-common.c:204 +msgctxt "Menu subcategory of Video" +msgid "Database" +msgstr "ডাটাবেইচ" + +#: ../src/plugins/menu-spec-common.c:205 +msgctxt "Menu subcategory of Video" +msgid "Disc Burning" +msgstr "ডিস্ক বাৰ্ণিং" + +#: ../src/plugins/menu-spec-common.c:206 +msgctxt "Menu subcategory of Video" +msgid "Players" +msgstr "প্লেয়াৰসমূহ" + +#: ../src/plugins/menu-spec-common.c:207 +msgctxt "Menu subcategory of Video" +msgid "Recorders" +msgstr "ৰেকৰ্ডাৰসমূহ" + +#: ../src/plugins/menu-spec-common.c:208 +msgctxt "Menu subcategory of Video" +msgid "TV" +msgstr "TV" + +#: ../src/plugins/menu-spec-common.c:211 +msgctxt "Menu subcategory of Add-ons" +msgid "Fonts" +msgstr "ফণ্টসমূহ" + +#: ../src/plugins/menu-spec-common.c:212 +msgctxt "Menu subcategory of Add-ons" +msgid "Codecs" +msgstr "কডেকসমূহ" + +#: ../src/plugins/menu-spec-common.c:213 +msgctxt "Menu subcategory of Add-ons" +msgid "Input Sources" +msgstr "ইনপুট উৎসসমূহ" + +#: ../src/plugins/menu-spec-common.c:214 +msgctxt "Menu subcategory of Add-ons" +msgid "Language Packs" +msgstr "ভাষা পেকসমূহ" + +#: ../src/menus.ui.h:1 +msgid "_Software Sources" +msgstr "চফ্টৱেৰ উৎসসমূহ (_S)" + +#: ../src/menus.ui.h:2 +msgid "_About" +msgstr "বিষয়ে (_A)" + +#: ../src/menus.ui.h:3 +msgid "_Quit" +msgstr "প্ৰস্থান কৰক (_Q)" + diff --git a/po/be.po b/po/be.po new file mode 100644 index 0000000..924a98b --- /dev/null +++ b/po/be.po @@ -0,0 +1,6941 @@ +# Belarusian translation for gnome-software. +# Copyright (C) 2021 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Yuras Shumovich , 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-03 19:04+0000\n" +"PO-Revision-Date: 2025-03-07 20:41+0300\n" +"Last-Translator: Yuras Shumovich \n" +"Language-Team: Belarusian \n" +"Language: be\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 3.5\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Усталяваць і абнавіць праграмы" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Праз Software можна знайсці і ўсталяваць новыя праграмы і пашырэнні сістэмы, " +"а таксама выдаліць ужо ўсталяваныя праграмы." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Software паказвае вартыя ўвагі і папулярныя праграмы, для кожнай з іх маюцца " +"карысныя апісанні і некалькі здымкаў. Праграмы можна шукаць па катэгорыях у " +"спісе або праз поле пошуку. Таксама Software дазваляе абнаўляць сістэму праз " +"пазасеткавае абнаўленне." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Панэль агляду" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Панэль падрабязнасцей" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Панэль усталяванага" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Панэль абнаўленняў" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Падрабязнасці абнаўлення" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Праект GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Праверыць ключ akmods у Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Каб праверыць ключ akmods у Shim UEFI, патрабуецца праверка сапраўднасці" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Зарэгістраваць ключ akmods у Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Каб зарэгістраваць ключ akmods у Shim UEFI, патрабуецца праверка сапраўднасці" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Праверыць ключ DKMS у Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Каб праверыць ключ DKMS у Shim UEFI, патрабуецца праверка сапраўднасці" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Зарэгістраваць ключ DKMS у Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" +"Каб зарэгістраваць ключ DKMS у Shim UEFI, патрабуецца праверка сапраўднасці" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Усталяваць файл з appstream у сістэмную папку" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Усталяванне файла з appstream у сістэмную папку" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Спіс сумяшчальных праектаў" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Праграмы будуць паказвацца для сумяшчальных праектаў са спіса. Напрыклад " +"GNOME, KDE і XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Магчымасць кіравання абнаўленнямі ў GNOME Software" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Калі адключана, GNOME Software будзе хаваць панэль абнаўленняў і не будзе " +"выконваць аўтаматычнае абнаўленне або запыты на абнаўленне." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Аўтаматычна спампоўваць і ўсталёўваць абнаўленні" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Калі ўключана, GNOME Software будзе аўтаматычна спампоўваць абнаўленні ПЗ у " +"фонавым рэжыме, а таксама ўсталёўваць тыя з іх, якія не патрабуюць " +"перазагрузкі." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Апавяшчаць карыстальніка пра абнаўленне ПЗ у фонавым рэжыме" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Калі ўключана, GNOME Software апавяшчае карыстальніка пра абнаўленні, " +"усталяваныя падчас яго бяздзеяння." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Магчымасць аўтаматычнага абнаўлення, калі задзейнічана злучэнне з " +"тарыфікацыяй" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Калі ўключана, GNOME Software аўтаматычна абнаўляецца ў фонавым рэжыме нават " +"пры выкарыстанні злучэння з тарыфікацыяй (у выніку спампоўвання метаданых, " +"праверкі абнаўленняў і г.д., карыстальнік можа панесці страты)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Першы запуск GNOME Software" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Паказваць ацэнку праграмы" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Фільтраваць праграмы паводле прадвызначанай галіны для аддаленых крыніц" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Паказваць папярэджанне перад усталяваннем несвабоднай праграмы" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Калі ўсталявана несвабодная праграма, можа паказвацца акно з папярэджаннем. " +"Вызначае, ці блакіраваць гэтае акно." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Часавы адбітак апошняй праверкі абнаўленняў" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Часавы адбітак апошняга апавяшчэння пра абнаўленне АС" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Часавы адбітак апошняга апавяшчэння пра абнаўленне" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Часавы адбітак першага абнаўлення для сістэмы бяспекі, які ачышчаецца пасля " +"абнаўлення" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Часавы адбітак апошняга абнаўлення" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Час (секунд) для праверкі актуальнасці здымка" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Выбар большага значэння паменшыць колькасць запытаў да аддаленага сервера, " +"але абнаўленне здымкаў можа займаць больш часу. Пры значэнні 0, праверка " +"ніколі не выконваецца, калі здымак ужо ёсць у кэшы." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Сервер, які выкарыстоўваецца для водгукаў аб праграмах" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Мінімальнае значэнне кармы для водгукаў" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Водгукі з кармай, меншай за гэты лік, не будуць паказвацца." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Спіс афіцыйных сховішчаў, якія не павінны лічыцца староннімі" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Спіс абавязковых сховішчаў, якія немагчыма адключыць або выдаліць" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Спіс афіцыйных сховішчаў, праграмнае забеспячэнне ў якіх лічыцца свабодным" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"URL-адрас ліцэнзіі, які выкарыстоўваецца для праграм, што лічацца свабодным " +"праграмным забеспячэннем" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Усталяваць пакет праграм для ўсіх карыстальнікаў у сістэме, калі гэта магчыма" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "" +"Дазволіць доступ да дыялогавага акна «Сховішчы праграмнага забеспячэння»" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Прапаноўваць абнаўленні да перадфінальных выданняў" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Паказваць элементы інтэрфейсу, якія паведамляюць карыстальніку, што праграма " +"несвабодная" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Паказваць у спісе ўсталяваных праграм памер праграмы" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"URI, які тлумачыць сутнасць несвабоднага і прапрыетарнага праграмнага " +"забеспячэння" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Спіс URL-адрасоў, якія ўказваюць на файлы, што будуць спампаваны ў папку " +"swcatalog з appstream" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Усталяваць файлы з AppStream у сістэмную папку для ўсіх карыстальнікаў. Калі " +"false, файлы ўсталяваны ў нестандарты каталог XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Парадак прыярытэту для фарматаў упакоўкі, , фарматы пералічаныя ўпачатку " +"маюць большы прыярытэт і перавага аддаецца ім. Пусты масіў азначае " +"прадвызначаны парадак. Не пералічаныя фарматы, разглядаюцца як самыя апошнія " +"ў спісе. Прыклады фарматаў упакоўкі: deb, flatpak, rpm, snap. Пры жаданні " +"можна ўказаць фармат з назвай крыніцы праз двукроп'е, напрыклад, 'flatpak:" +"flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Часавы адбітак апошняй спробы выдалення нядзейных асяроддзяў выканання " +"Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Задайце значэнне «true», каб паказваліся толькі праграмы са свабоднымі " +"ліцэнзіямі, а прапрыетарныя хаваліся." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Задайце значэнне «true», каб паказваліся толькі праграмы ад распрацоўшчыкаў, " +"якія пазначаны як правераныя." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Часавы адбітак апошняга атрыманага гістарычнага абнаўлення." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"У радку захоўваецца ідэнтыфікатар уліковага запісу ў сетцы, які " +"выкарыстоўвацца для ўваходу" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Агульнасістэмны ўсталёўшчык AppStream у GNOME Software" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Не ўдалося прааналізаваць аргументы каманднага радка" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Трэба ўказаць адно імя файла" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Праграму можа выкарыстоўваць толькі карыстальнік root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Не ўдалося праверыць тып змесціва: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Не ўдалося перамясціць: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Усталяванне праграмнага забеспячэння" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Усталяваць у сістэму выбраныя праграмы" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Мультыплікацыйны гвалт" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Няма звестак наконт сцэн гвалту з удзелам мультыплікацыйных персанажаў" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Фантазійны гвалт" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Няма звестак наконт сцэн гвалту з удзелам фантазійных персанажаў" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Рэалістычны гвалт" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Няма звестак наконт сцэн гвалту з удзелам рэалістычных персанажаў" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Гвалт з кровапраліццем" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Няма звестак наконт сцэн гвалту з кровапраліццем" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Сексуальны гвалт" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Няма звестак наконт сцэн сексуальнага гвалту" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Алкаголь" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Няма звестак наконт згадвання алкагольных напояў" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Наркотыкі" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Няма звестак наконт згадвання пра забароненыя наркотыкі" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Тытунь" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Няма звестак наконт згадвання пра тытунёвыя вырабы" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Аголенасць" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Няма звестак наконт сцэн агалення" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Сексуальныя сцэны" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Няма звестак наконт згадванняў або выяў сексуальнага характару" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Нецэнзурная лексіка" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Няма звестак наконт нецэнзурнай лексікі любога кшталту" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Недарэчны гумар" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Няма звестак наконт недарэчнага гумару" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Дыскрымінацыя" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Няма звестак наконт моўнай дыскрымінацыі любога кшталту" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Рэклама" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Няма звестак наконт рэкламы любога кшталту" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Азартныя гульні" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Няма звестак наконт азартных гульняў любога кшталту" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Купля за рэальныя грошы" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Няма звестак наконт магчымасці траціць грошы" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Чат паміж карыстальнікамі" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Няма звестак наконт магчымасці чата з іншымі карыстальнікамі" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Аўдыячат паміж карыстальнікамі" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Няма звестак наконт магчымасці размаўляць з іншымі карыстальнікамі" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Кантактныя звесткі" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Няма звестак наконт абагулення імёнаў карыстальнікаў сацыяльнай сеткі або " +"адрасоў электроннай пошты" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Ідэнтыфікацыйныя звесткі" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Няма звестак наконт перадачы даных карыстальніка староннім асобам" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Абагульненне месцазнаходжання" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Няма звестак наконт перадачы фізічнага месцазнаходжання іншым карыстальнікам" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Гомасексуальнасць" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Няма звестак наконт згадвання гомасексуальнасці" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Прастытуцыя" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Няма звестак наконт згадвання прастытуцыі" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Сямейная нявернасць" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Няма звестак наконт згадвання сямейнай нявернасці" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Сексуалізаваныя персанажы" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Няма звестак наконт сексуалізаваных персанажаў" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Апаганьванне" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Няма звестак наконт згадванняў пра апаганьванне" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Парэшткі памерлых людзей" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Няма звестак наконт бачных парэшткаў памерлых людзей" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Рабства" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Няма звестак наконт згадвання пра рабства" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Не ўтрымлівае згадванняў пра наркотыкі" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Не ўтрымлівае лаянкі, нецэнзурнай і непрыстойнай лексікі" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Не ўтрымлівае рэкламы або грашовых аперацый" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Не ўтрымлівае сцэн сексу або агалення" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Не ўтрымлівае бескантрольных функцый чата" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Не ўтрымлівае гвалту" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Наркотыкі" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Лаянка" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Грошы" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Сувязь" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Гвалт" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Усе" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "Узроставы рэйтынг «%s» невядомы" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s прыдатна для ўсіх" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s прыдатна для маленькіх дзяцей (3+)" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s прыдатна для дзяцей дашкольнага ўзросту (5+)" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s прыдатна для дзяцей школьнага ўзросту (12+)" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s прыдатна для дзяцей старшага ўзросту (16+)" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s прыдатна для дарослых (18+)" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s прыдатна для %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Узроставы рэйтынг" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Як дадаць адсутныя звесткі" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Лакальны файл" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Пакет" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "У чаканні" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Чакае ўсталявання" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Чакае выдалення" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Усталяванне" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Выдаленне" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Спампоўванне" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Усталяваць" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Выдаліць…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Сетка" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Можа абменьвацца данымі па сетцы" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Сістэмныя сервісы" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Мае доступ да сэрвісаў D-Bus (сістэмная шына)" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Сервісы сеанса" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Мае доступ да сэрвісаў D-Bus (шына сеанса)" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Прылады" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Мае доступ да адвольна выбраных прылад накшталт вэб-камер" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Мае доступ да прылад уводу" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Мае доступ да мікрафона і прайгравання гуку" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Мае доступ да файлаў сістэмнай прылады" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Змесціва экрана" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Мае доступ да змесціва экрана" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Хатняя папка" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Можа праглядаць, змяняць і ствараць файлы" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Можа праглядаць файлы" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Файлавая сістэма" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Папка спамповак" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Налады" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Можа праглядаць і змяняць налады" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Састарэлая сістэма адлюстравання" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Выкарыстоўвае старую небяспечную сістэму адлюстравання" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Пакіданне «пясочніцы»" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Можа пакінуць пясочніцу і абысці іншыя абмежаванні" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Апісанне абнаўлення адсутнічае." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Падрабязнасці абнаўлення" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Патрабуюцца дадатковыя дазволы" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Ад сервера атрыманы няправільныя даныя пра рэйтынг" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Не ўдалося звязацца з серверам рэйтынгу" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Водгукі" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Не знойдзена водгукаў для гэтай праграмы." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Няма водгукаў" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Гісторыя версій" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Новае ў версіі %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Версія %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Пра гэта выданне няма звестак" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Рэжым пры запуску: «updates» (абнаўленні), «updated» (абноўленыя), " +"«installed» (усталяваныя) або «overview» (агляд)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "РЭЖЫМ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Пошук праграм" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ПОШУК" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Паказаць падрабязнасці праграмы (праз ID праграмы)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Паказаць падрабязнасці праграмы (праз назву пакета)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "НАЗВА ПАКЕТА" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Усталяваць праграму (праз ID праграмы)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Выдаліць праграму (праз ID праграмы)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Адкрыць лакальны файл пакета" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "НАЗВА ФАЙЛА" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Узаемадзеянне, якое чакаецца ад гэтага дзеяння: «none» (ніякага), «notify» " +"(апавяшчэнне) або «full» (поўнае)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "УЗАЕМАДЗЕЯННЕ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Паказаць лакальны файл metainfo або appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Уключыць вывад падрабязных адладачных звестак (з запушчанага экзэмпляра, " +"калі ўжо выконваецца)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Усталёўвае ў фонавым рэжыме абнаўленні, якія ў стане чакання" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Паказаць налады" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Завяршыць запушчаную копію праграмы" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Аддаваць перавагу лакальным файлавым крыніцам, а не AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Паказаць нумар версіі" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Аўтарскае права © 2016–2023 удзельнікі праекта GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Юрась Шумовіч " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Для гэтай праграмы няма падрабязнасцей." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Памер на дыску" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Уключае %s даных і %s кэшу" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Уключае %s даных" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Уключае %s кэшу" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Выкарыстанне памяці для кэшу і даных невядома" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Памер спампоўвання" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Дадатковых спампоўванняў не патрабуецца" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Памер дадатковых спампоўванняў невядомы" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Патрабуецца дадаткова спампаваць %s" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Памер невядомы" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Не патрабуе дазволаў" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Мае доступ да сеткі" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Выкарыстоўвае сістэмныя сервісы" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Выкарыстоўвае сервісы сеанса" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Мае доступ да апаратных прылад" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Мае доступ да сістэмных прылад" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Мае доступ на чытанне і запіс вашых даных" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Мае доступ на чытанне вашых даных" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Мае доступ на чытанне і запіс у папцы спамповак" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Мае доступ на чытанне ў папцы спамповак" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Мае доступ да азначаных файлаў" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Можа праглядаць і змяняць налады карыстальніка" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Выкарыстоўвае састарэлы аконны інтэрфейс" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Можа атрымліваць адвольныя дазволы" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Распрацоўшчык праграмнага забеспячэння правераны" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Праверана стваральнікамі дыстрыбутыву" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Праверана стваральнікамі %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Старонні пастаўшчык" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "ПЗ больш не падтрымліваецца" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Правяральны код" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Невядомая ліцэнзія" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Прапрыетарны код" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Спецыяльная ліцэнзія" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Прывілеяваная" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Бяспечная" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Верагодна бяспечная" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Патэнцыяльна небяспечная" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Небяспечная" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Толькі для мабільных прылад" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Працуе толькі на малых экранах" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Толькі для настольных камп’ютараў" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Працуе толькі на вялікіх экранах" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Памер экрана не пасуе" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Ваш цяперашні памер экрана не падтрымліваецца" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Патрабуецца сэнсарны экран" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Патрабуецца клавіятура" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Патрабуецца мыш" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Патрабуецца геймпад" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Каб гуляць, патрабуецца геймпад" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Адаптыўная" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Працуе на тэлефона, планшэтах і настольных камп'ютарах" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Магчыма патрабуецца клавіятура або мыш" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Працуе на настольных камп'ютарах і ноўтбуках" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Без змесціва з узроставым абмежаваннем" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Інфармацыя пра ўзроставы рэйтынг недаступна" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Наведаць вэб-сайт" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Усталяваць…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Скасаваць" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Усталяваць" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Спампаваць" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Абнавіць" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Выдаліць…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Выдаленне" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Крытычнае абнаўленне" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Прылада не можа выкарыстоўвацца падчас абнаўлення." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Крыніца: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Перайменавана з %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Спынена атрыманне абнаўленняў" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Крытычнае абнаўленне" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Усталявана" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Дапамагчы з перакладам %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s спраектавана, распрацавана і перакладзена інтэрнацыянальнай супольнасцю " +"добраахвотнікаў.\n" +"\n" +"Гэта азначае, што калі нешта недаступна на вашай мове, вы можаце самі " +"прыняць удзел у перакладзе." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Пераклады" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Сайт _перакладу" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Патрабуецца аддалены ўваход у %s (дамен %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Патрабуецца ўваход" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Скасаваць" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Уваход" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Карыстальнік" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Пароль" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Іншыя" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Усе" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Вартае ўвагі" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Выбар рэдакцыі" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Новыя і абноўленыя" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Выбранае з вэб-праграм" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Іншае праграмнае забеспячэнне" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "«%s» усталявана" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Каб змены ўступілі ў сілу, перазапусціце сістэму" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Праграма гатова да выкарыстання" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Абнаўленні сістэмны ўсталяваны" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Нядаўна ўсталяваныя абнаўленні даступны для прагляду" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Перазапусціць" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Запусціць" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Усталяваць праграмнае забеспячэнне?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Усталяваць старонняе праграмнае забеспячэнне?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Уключыць сховішча праграмнага забеспячэння?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Уключыць сховішча старонняга праграмнага забеспячэння?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s – не з'яўляецца свабодным праграмным забеспячэннем з адкрытым зыходным " +"кодам і пастаўляецца «%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s пастаўляецца «%s»." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Каб працягнуць усталяванне, неабходна ўключыць гэтае сховішча праграмнага " +"забеспячэння." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Усталяванне або выкарыстанне %s можа быць незаконным у некаторых краінах." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Усталяванне або выкарыстанне гэтага кодэка можа быць незаконным у некаторых " +"краінах." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Больш не _папярэджваць" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "_Уключыць і ўсталяваць" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Дэталізацыя памылак ад менеджара пакетаў:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Падрабязнасці" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Закрыць" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Падрабязнасці скапіяваны ў буфер абмену" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Прыняць" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Абнаўленне ўсталявана" +msgstr[1] "Абнаўленні ўсталяваны" +msgstr[2] "Абнаўленні ўсталяваны" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Праграма ўсталявана" +msgstr[1] "Праграмы ўсталяваны" +msgstr[2] "Праграмы ўсталяваны" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Каб змены ўступілі ў сілу, перазапусціце сістэму" +msgstr[1] "Каб змены ўступілі ў сілу, перазапусціце сістэму" +msgstr[2] "Каб змены ўступілі ў сілу, перазапусціце сістэму" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Не зараз" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "сёння" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "учора" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d дзень таму" +msgstr[1] "%d дні таму" +msgstr[2] "%d дзён таму" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d тыдзень таму" +msgstr[1] "%d тыдні таму" +msgstr[2] "%d тыдняў таму" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d месяц таму" +msgstr[1] "%d месяцы таму" +msgstr[2] "%d месяцаў таму" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d год таму" +msgstr[1] "%d гады таму" +msgstr[2] "%d гадоў таму" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "толькі што" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d хвіліну таму" +msgstr[1] "%d хвіліны таму" +msgstr[2] "%d хвілін таму" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d гадзіну таму" +msgstr[1] "%d гадзіны таму" +msgstr[2] "%d гадзін таму" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Усе" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Вартае ўвагі" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Трохвымерная графіка" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Фатаграфія" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Сканаванне" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Вектарная графіка" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Праглядальнікі" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Праца з аўдыя" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Музычныя прайгравальнікі" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Усе" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Вартае ўвагі" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Каляндар" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Базы даных" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Фінансы" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Тэкставыя працэсары" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Тэкставыя рэдактары" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Вэб-браўзеры" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Усе" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Вартае ўвагі" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Баявыя" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Прыгоды" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Аркады" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Блокі" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Настольныя" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Картачныя" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Эмулятары" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Для дзяцей" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Лагічныя" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Ролевыя" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Спорт" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Стратэгіі" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Усе" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Вартае ўвагі" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Чат" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Усе" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Вартае ўвагі" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Штучны інтэлект" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Астраномія" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Хімія" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Мовы" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Матэматыка" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Навіны" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Робататэхніка" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Мастацтва" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Біяграфія" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Коміксы" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Літаратура" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Здароўе" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Гісторыя" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Лад жыцця" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Палітыка" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Спорт" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Усе" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Вартае ўвагі" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Адладчыкі" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Кодэкі" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Драйверы прылад" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Шрыфты" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Крыніцы ўводу" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Моўныя пакеты" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Лакалізацыя" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Творчасць" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Праца" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Гульні" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Сацыяльныя" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Навучанне" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Распрацоўка" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Кодэкі" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Драйверы прылад" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Шрыфты" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Крыніцы ўводу" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Моўныя пакеты" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Лакалізацыя" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Праграма" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s запытвае падтрымку дадатковага фармату файла." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Патрабуюцца дадатковыя тыпы MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s запытвае дадатковыя шрыфты." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Патрабуюцца дадатковыя шрыфты" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s запытвае дадатковыя кодэкі." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Патрабуюцца дадатковыя кодэкі" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s запытвае дадатковыя драйверы для прынтара." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Патрабуюцца дадатковыя драйверы для прынтара" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s запытвае дадатковыя пакеты." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Патрабуюцца дадатковыя пакеты" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Пошук у Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "Паказаць _больш" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Паказаць _менш" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Выдаленне…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Каб завяршыць усталяванне, патрабуецца перазапуск" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Каб завяршыць выдаленне, патрабуецца перазапуск" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Чакаецца ўсталяванне…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Чакаецца абнаўленне…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Спампоўванне…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Падрыхтоўка…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Выдаленне…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "Праграма «%s» не ўсталявана, але яе даныя працягваюць захоўвацца." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Перазапусціць" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Уключыць…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Усталяваць…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s будзе паказвацца на англійскай мове" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Гэтая праграма будзе паказвацца на англійскай мове" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Гэта праграмнае забеспячэнне будзе паказвацца на англійскай мове" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Дапамагчы з _перакладам" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Іншыя праграмы ад %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Распрацоўшчык %s пацвердзіў, што з'яўляецца ўладальнікам %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Распрацоўшчык пацвердзіў, што з'яўляецца ўладальнікам %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Каб напісаць водгук, патрабуецца доступ да інтэрнэту" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Гэта праграма больш не атрымлівае абнаўленні, у тым ліку і абнаўленні бяспекі" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Гэтае праграма ўжо пастаўляецца з дыстрыбутывам, яе непатрэбна замяняць." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Гэта праграма пастаўляецца без спасылак на яе сайт, рэпазіторый або трэкер " +"памылак." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Гэта праграмнае забеспячэнне больш не атрымлівае абнаўленні, у тым ліку і " +"абнаўленні бяспекі" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Гэтае праграмнае забеспячэнне ўжо пастаўляецца з дыстрыбутывам, яго " +"непатрэбна замяняць." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Гэта праграмнае забеспячэнне пастаўляецца без спасылак на яго сайт, " +"рэпазіторый або трэкер памылак." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Software не ўдалося атрымаць інфармацыю для «%s», немагчыма паказаць " +"падрабязнасці для гэтай праграмы." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Ад сервера атрыманы няправільны адказ на водгук" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Не ўдалося пакінуць водгук да «%s»: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Старонка падрабязнасцей" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Загрузка звестак праграмы" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Праверана" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Адкрыць" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "А_бнавіць" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Выдаліць" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Дадатковыя кампаненты" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Гэту праграму можна выкарыстоўваць толькі пры наяўнасці злучэння з " +"інтэрнэтам." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Сховішча праграмнага забеспячэння падключана" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Гэтая праграма змяшчае сховішча праграмнага забеспячэння, праз якое " +"адбываецца абнаўленне, а таксама доступ да іншага праграмнага забеспячэння." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Сховішча праграмнага забеспячэння не падключана" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Гэтая праграма не змяшчае сховішча праграмнага забеспячэння. Яна не будзе " +"абнаўляцца са з'яўленнем новых версій." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Выяўлена сховішча праграмнага забеспячэння" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Дадаванне гэтага сховішча праграмнага забеспячэння, дасць доступ да " +"дадатковага праграмнага забеспячэння і абнаўленняў." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "" +"Выкарыстоўвайце толькі тыя сховішчы праграмнага забеспячэння, якім вы " +"давяраеце." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Ачысціць даныя праграмы" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Выдаліць даныя" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Няма метаданых" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Вэб-сайт праекта" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Ахвяраваць" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Зрабіць унёсак у пераклад" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "Паведаміць пра _памылку" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Даведка" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Звязацца" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Напісаць водгук" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Усе водгукі" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Немагчыма паказаць падрабязнасці праграмы" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Не ўдалося падрыхтаваць перазапуск" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Невядомая памылка" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Ключ не знойдзены" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Ключ не зарэгістраваны" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Патрабуецца рэгістрацыя MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Далей" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"На гэтай прыладзе ўключана функцыя Secure Boot. Трэба зарэгістраваць новы " +"ключ уладальніка прылады (MOK), каб дазволіць уключэнне новых драйвераў. На " +"адным з этапаў працэсу, спатрэбіцца ўвесці пароль. Запішыце куды-небудзь " +"наступны пароль, які звязаны з ключом:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Я запісаў _пароль для ключа MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Перазапусціць і зарэгістраваць…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Уважліва прачытайце інструкцыю па наладцы" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Пасля перазапуску, з'явіцца экран наладкі прылады. Каб уключыць новыя " +"драйверы, выканайце наступныя крокі:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Выберыце «Зарэгістраваць MOK» (Enroll MOK)\n" +"• Выберыце «Так» (Yes), каб зарэгістраваць ключы\n" +"• Калі з'явіцца запыт, увядзіце пароль для ключа MOK\n" +"• Затым выберыце «Перазапусціць» (Reboot)" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Наступствы для бяспекі" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Вазьміце пад увагу, што з моманту паспяховай рэгістрацыі ключа, любыя " +"абнаўленні модуляў або любы іншы модуль будуць лічыцца безумоўна даверанымі. " +"Надалей усе абнаўленні будуць адбывацца напрамую, без увядзення кода і " +"праверкі сапраўднасці." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Падрабязнае кіраўніцтва можна знайсці на старонцы дакументацыі." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Спампоўванне дадатковых файлаў з метаданымі…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " і " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Даступны шрыфты для сістэмы пісьма %s" +msgstr[1] "Даступны шрыфты для сістэм пісьма %s" +msgstr[2] "Даступны шрыфты для сістэм пісьма %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Даступнае праграмнае забеспячэнне для %s" +msgstr[1] "Даступнае праграмнае забеспячэнне для %s" +msgstr[2] "Даступнае праграмнае забеспячэнне для %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Запатрабаванае праграмнае забеспячэнне не знойдзена" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Не ўдалося знайсці запатрабаванае праграмнае забеспячэнне" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s не знойдзена" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "на вэб-сайце" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Няма даступных праграм, якія б пастаўлялі файл %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Звесткі пра %s, а таксама варыянты атрымання адсутных праграм можна знайсці " +"%s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Няма праграм, якія падтрымліваюць %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s — недаступна." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Звесткі пра %s, а таксама варыянты атрымання праграмы, якая падтрымлівае " +"гэты фармат, можна знайсці %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Няма даступных шрыфтоў з падтрымкай сістэмы пісьма %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Звесткі пра %s, а таксама варыянты атрымання дадатковых шрыфтоў можна " +"знайсці %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Няма даступных кодэкаў для фармату %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Звесткі пра %s, а таксама варыянты атрымання кодэка, які можа прайграваць " +"гэты фармат, можна знайсці %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Няма даступных рэсурсаў Plasma, якія падтрымліваюць %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Звесткі пра %s, а таксама варыянты атрымання дадатковых рэсурсаў Plasma, " +"можна знайсці %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Няма даступных драйвераў прынтара для %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Звесткі пра %s, а таксама варыянты атрымання драйвера, які падтрымлівае гэты " +"прынтар, можна знайсці %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "дакументацыяй" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Не ўдалося знайсці %s, запытаны праграмай %s. Каб атрымаць дадатковы " +"звесткі, азнаёмцеся з %s." +msgstr[1] "" +"Не ўдалося знайсці %s, запытаны праграмай %s. Каб атрымаць дадатковы " +"звесткі, азнаёмцеся з %s." +msgstr[2] "" +"Не ўдалося знайсці %s, запытаны праграмай %s. Каб атрымаць дадатковы " +"звесткі, азнаёмцеся з %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Не ўдалося знайсці %s. Каб атрымаць дадатковы звесткі, азнаёмцеся з %s." +msgstr[1] "" +"Не ўдалося знайсці %s. Каб атрымаць дадатковы звесткі, азнаёмцеся з %s." +msgstr[2] "" +"Не ўдалося знайсці %s. Каб атрымаць дадатковы звесткі, азнаёмцеся з %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Не ўдалося знайсці: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Фармат файла %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Усталяваць _усе" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Немагчыма знайсці запатрабаванае праграмнае забеспячэнне" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Старонка з кодэкамі" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Нічога не знойдзена" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Немагчыма выканаць пошук" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Назад" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Далей" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Спіс вартых увагі праграм" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Падтрымка стацыянарных прылад" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Падтрымліваецца выкарыстанне на вялікіх экранах" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Падтрымка стацыянарных прылад невядома" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Няма звестак ці падтрымліваюцца вялікія экраны" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Патрабуецца вялікі экран" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Стацыянарныя прылады не падтрымліваюцца" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Не можа выкарыстоўвацца на вялікіх экранах" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Падтрымка мабільных прылад" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Падтрымліваецца выкарыстанне на малых экранах" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Падтрымка мабільных прылад невядома" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Няма звестак ці падтрымліваюцца малыя экраны" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Патрабуецца малы экран" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Мабільныя прылады не падтрымліваюцца" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Не можа выкарыстоўвацца на малых экранах" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Падтрымка клавіятуры" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Падтрымка клавіятуры невядомая" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Няма звестак ці падтрымліваюцца клавіятуры" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Патрабуецца клавіятура" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Клавіятура падтрымліваецца" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Клавіятура не падтрымліваецца" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Не можа выкарыстоўвацца з клавіятурай" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Падтрымка мышы" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Патрабуецца мыш або ўказальная прылада" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Падтрымка мышы невядомая" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "Няма звестак ці падтрымліваюцца мышы і ўказальныя прылады" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Патрабуецца мыш" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Мыш і ўказальныя прылады падтрымліваюцца" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Мыш не падтрымліваецца" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Не можа выкарыстоўвацца з мышшу або ўказальнай прыладай" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Падтрымка сэнсарнага экрана" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Падтрымка сэнсарнага экрана невядома" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Няма звестак ці падтрымліваюцца сэнсарныя экраны" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Патрабуецца сэнсарны экран" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Сэнсарны экран падтрымліваецца" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Сэнсарны экран не падтрымліваецца" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Не можа выкарыстоўвацца з сэнсарным экранам" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Патрабуецца геймпад" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Патрабуецца геймпад" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Падтрымка геймпада" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Геймпады падтрымліваюцца" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s павінна працаваць на гэтай прыладзе" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s працуе на гэтай прыладзе" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s, магчыма, працуе на гэтай прыладзе" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s можа працаваць на гэтай прыладзе неналежным чынам" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s можа не працаваць на гэтай прыладзе" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Падтрымка абсталявання" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Навігацыя" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Перайсці на старонку «Агляд»" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Перайсці на старонку «Усталяваныя»" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Перайсці на старонку «Абнаўленні»" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Адкрыць панэль пошуку" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Вокны" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Налады" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Сховішчы праграмнага забеспячэння" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Даведка" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Спалучэнні клавіш" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Усталяваныя" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Старонка ўсталяванага" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Выконваецца" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Праграмы" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Вэб-праграмы" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Сістэмныя праграмы" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Зборка ад супольнасці" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Прыняць удзел" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Гэта праграма адкрыта распрацоўваецца інтэрнацыянальнай супольнасцю " +"добраахвотнікаў і распаўсюджваецца на ўмовах ліцэнзіі %s.\n" +"\n" +"Вы маеце магчымасць зрабіць свой унёсак, каб палепшыць ПЗ." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Гэта праграма адкрыта распрацоўваецца інтэрнацыянальнай супольнасцю " +"добраахвотнікаў і распаўсюджваецца на ўмовах ліцэнзіі %s.\n" +"\n" +"Вы маеце магчымасць зрабіць свой унёсак, каб палепшыць ПЗ." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Гэта праграмнае забеспячэнне адкрыта распрацоўваецца інтэрнацыянальнай " +"супольнасцю добраахвотнікаў і распаўсюджваецца на ўмовах ліцэнзіі %s.\n" +"\n" +"Вы маеце магчымасць зрабіць свой унёсак, каб палепшыць ПЗ." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Гэта праграмнае забеспячэнне адкрыта распрацоўваецца інтэрнацыянальнай " +"супольнасцю добраахвотнікаў і распаўсюджваецца на ўмовах ліцэнзіі %s.\n" +"\n" +"Вы маеце магчымасць зрабіць свой унёсак, каб палепшыць ПЗ." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Невядомая ліцэнзія" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Даведацца больш" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Гэта праграма распрацоўваецца адпаведна з умовамі нявызначанай ліцэнзіі, " +"магчыма прапрыетарнай. Часам гэта можа быць небяспечна, бо памылкі складана " +"выявіць, а змены ўносяцца без нагляду.\n" +"\n" +"Вы можаце як мець, так і не мець магчымасці зрабіць свой унёсак, каб " +"палепшыць ПЗ." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Гэта праграмнае забеспячэнне распрацоўваецца адпаведна з умовамі " +"нявызначанай ліцэнзіі, магчыма прапрыетарнай. Часам гэта можа быць " +"небяспечна, бо памылкі складана выявіць, а змены ўносяцца без нагляду.\n" +"\n" +"Вы можаце як мець, так і не мець магчымасці зрабіць свой унёсак, каб " +"палепшыць ПЗ." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Прапрыетарная" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Гэта праграма распрацоўваецца не адкрыта і толькі распрацоўшчыкі ведаюць як " +"яно працуе. Часам гэта можа быць небяспечна, бо памылкі складана выявіць, а " +"змены ўносяцца без нагляду.\n" +"\n" +"Вы не маеце магчымасці ўдзельнічаць у яго распрацоўцы." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Гэта праграмнае забеспячэнне не адкрытае і толькі распрацоўшчыкі ведаюць як " +"яно працуе. Часам гэта можа быць небяспечна, бо памылкі складана выявіць, а " +"змены ўносяцца без нагляду.\n" +"\n" +"Вы не маеце магчымасці ўдзельнічаць у яго распрацоўцы." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Спецыяльная ліцэнзія" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Гэта праграма распрацоўваецца адпаведна з умовамі спецыяльнай ліцэнзіі %s.\n" +"\n" +"Вы можаце як мець, так і не мець магчымасці зрабіць свой унёсак, каб " +"палепшыць ПЗ." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Гэта праграма распрацоўваецца адпаведна з умовамі спецыяльнай ліцэнзіі " +"«%s».\n" +"\n" +"Вы можаце як мець, так і не мець магчымасці зрабіць свой унёсак, каб " +"палепшыць ПЗ." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Гэта праграмнае забеспячэнне распрацоўваецца адпаведна з умовамі спецыяльнай " +"ліцэнзіі %s.\n" +"\n" +"Вы можаце як мець, так і не мець магчымасці зрабіць свой унёсак, каб " +"палепшыць ПЗ." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Гэта праграмнае забеспячэнне распрацоўваецца адпаведна з умовамі спецыяльнай " +"ліцэнзіі «%s».\n" +"\n" +"Вы можаце як мець, так і не мець магчымасці зрабіць свой унёсак, каб " +"палепшыць ПЗ." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Абнаўленне даных" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Загрузка старонкі" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Запуск" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Невядомая крыніца" + +# Нібы крыніца, трэба кантэкст +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Бэта-версія" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Карыстальнік" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Дадаванні" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Выдаленні" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Абнаўленні" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Паніжэнні версіі" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "выбраных знешніх крыніц" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Забяспечвае доступ да дадатковага праграмнага забеспячэння з %s. У тым ліку " +"да некаторага прапрыетарнага ПЗ.\n" +"\n" +"Вы можаце ўключыць гэтыя сховішчы пазней у наладах." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Уключыць староннія сховішчы праграмнага забеспячэння?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "І_гнараваць" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Уключыць" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Даступна для вашай аперацыйнай сістэмы" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Даступна для %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Агляд" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Старонка агляду" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Даступныя праграмы" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Іншыя катэгорыі" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Даныя праграмы не знойдзены" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Невядома" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_ОК" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Усталяванне адхілена карыстальнікам" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Падрыхтоўка %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Сапраўды выдаліць сховішча %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Усе праграмы з %s будуць выдалены. Каб карыстацца імі зноў, вам прыйдзецца " +"пераўсталяваць сховішча." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Выдаліць %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Пасля выдалення праграмы %s, карыстацца ёй будзе немагчыма." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Пасля выдалення %s, будзе немагчыма карыстацца некаторымі праграмамі, якія " +"ад яго залежаць." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Пасля выдалення шрыфту %s, карыстацца ім будзе немагчыма і некаторыя " +"дакументы, будуць паказвацца з іншым шрыфтам." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Пасля выдалення кодэка %s, карыстацца ім будзе немагчыма. Гэта азначае, што " +"некаторыя мультымедыйныя файлы больш не будуць прайгравацца." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Абсталяванне, праца якога залежыць ад %s, пасля яго выдалення можа працаваць " +"няправільна." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Пасля выдалення праграмы %s, карыстацца ёй будзе немагчыма. Даныя і налады " +"захоўваюцца на дыску, каб мець магчымасць аднавіць праграму ў будучыні." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Налады" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Абнаўленні праграмнага забеспячэння" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Дадатковыя звесткі" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Падчас праверкі наяўнасці абнаўленняў і іх спампоўвання расходуецца " +"электраэнергія і трафік. Таму аўтаматычнае абнаўленне прыпыняецца, калі " +"выкарыстоўваецца злучэнне з тарыфікацыяй і калі ўключаны рэжым " +"энергазберажэння." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Аўтаматычна" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Аўтаматычна правяраць наяўнасць абнаўленняў і спампоўваць іх" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Уручную" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Праверка наяўнасці абнаўленняў і спампоўванне выконваецца ўручную" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Апа_вяшчэнні для аўтаматычнага абнаўлення" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Апавяшчаць, калі выканана аўтаматычнае ўсталяванне абнаўленняў" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Фільтры змесціва" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Паказваць толькі _свабоднае ПЗ" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Падчас агляду і пошуку хаваць прапрыетарнае праграмнае забеспячэнне" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Паказваць толькі _правераных распрацоўшчыкаў" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Паказваць толькі праграмы ад распрацоўшчыкаў, якія пазначаны як правераныя" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Усталяванае праграмнае забеспячэнне несумяшчальна з %s, падчас абнаўлення " +"яно будзе аўтаматычна выдалена." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Несумяшчальныя праграмы" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Абнавіць" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Выдаліць" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Налады і даныя праграмы" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "За_хаваць" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Дазваляе аднавіць налады і змесціва праграмы" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Выдаліць" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Незваротна выдаляе даныя, каб зберагчы месца на дыску" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Праграмнае забеспячэнне, усталяванае з «%s», больш не будзе атрымліваць " +"абнаўленні." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Адключыць сховішча?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Выдаліць сховішча?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Адключыць" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Выдаліць" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Уключаць новыя сховішчы" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Уключыць новыя сховішчы пасля дадавання" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "дадатковыя звесткі" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Сховішчы з выбраных старонніх крыніц — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Староннія сховішчы Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "аперацыйнай сістэмай" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Гэтыя сховішчы дапаўняюць прадвызначанае праграмнае забеспячэнне, якое " +"пастаўляецца з %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Сховішчы праграмнага забеспячэння" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Няма сховішчаў" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "Усталявана %u праграма" +msgstr[1] "Усталявана %u праграмы" +msgstr[2] "Усталявана %u праграм" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "Усталяваны %u дадатковы кампанент" +msgstr[1] "Усталявана %u дадатковыя кампаненты" +msgstr[2] "Усталявана %u дадатковых кампанентаў" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u праграма" +msgstr[1] "%u праграмы" +msgstr[2] "%u праграм" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u дадатковы кампанент" +msgstr[1] "%u дадатковыя кампаненты" +msgstr[2] "%u дадатковых кампанентаў" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s і %s усталяваны" +msgstr[1] "%s і %s усталяваны" +msgstr[2] "%s і %s усталяваны" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Праверка ўсталяванага ПЗ…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Выдаліць" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Дрэнна" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Не падабаецца" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Няблага" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Добра" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Выдатна" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Ацаніце, колькі зорак заслугоўвае праграма" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Калі ласка, пастаўцеся сур'ёзна да напісання водгуку" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Ацаніце, колькі зорак заслугоўвае праграма" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Падагульненне занадта кароткае" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Падагульненне занадта доўгае" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Апісанне занадта кароткае" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Апісанне занадта доўгае" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Напісаць водгук" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Адправіць" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Пастаўце ацэнку, напішыце падагульненне (загаловак) і водгук. Не трэба " +"выкарыстоўваць водгукі для паведамлення аб праблемах, замест гэтага " +"звяжыцеся з распрацоўшчыкам або са сваёй службай падтрымкі." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Падагульненне (загаловак)" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Напісаць кароткі водгук" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Якія даныя адпраўляюцца, вы можаце знайсці ў палітыцы прыватнасці. Будзе апублікавана пад вашым поўным " +"імем, указаным ва ўліковым запісе." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "Агулам %u ацэнка" +msgstr[1] "Агулам %u ацэнкі" +msgstr[2] "Агулам %u ацэнак" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "з 5 зорак" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Невядома" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Вы можаце паскардзіцца на абразлівыя, грубыя або дыскрымінацыйныя водгукі." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Пасля адпраўкі скаргі, водгук будзе схаваны, пакуль яго не праверыць " +"адміністратар." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Паскардзіцца на водгук?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Паскардзіцца" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Выдаліць водгук?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Выдаленне водгуку немагчыма скасаваць." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Упадабаць водгук" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Неўпадабаць водгук" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Паскардзіцца…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Выдаліць…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Праграма выконваецца не ў «пясочніцы», але стваральнікі дыстрыбутыву " +"праверылі, што гэта не шкоднае ПЗ" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Праверце, ці давярайце вы пастаўшчыку, таму што праграма выконваецца не ў " +"«пясочніцы»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Не патрабуе дазволаў" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Праграма цалкам выконваецца ў «пясочніцы»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Доступ да сеткі" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Мае доступ да інтэрнэту" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Без доступу да сеткі" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Не мае доступу да інтэрнэту" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Выкарыстоўвае сістэмныя сэрвісы" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Можа запытваць даныя з сістэмных сэрвісаў" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Выкарыстоўвае сэрвісы сеанса" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Можа запытваць даныя з сэрвісаў сеанса" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Доступ да прылад карыстальніка" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Мае доступ да прылад накшталт вэб-камер або гульнявых кантролераў" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Без доступу да прылад карыстальніка" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Не мае доступу да прылад накшталт вэб-камер або гульнявых кантролераў" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Доступ да прылад уводу" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Доступ да мікрафона і прайгравання гуку" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Можа весці праслухоўванне праз мікрафон і прайграваць гук не пытаючы дазволу" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Доступ да сістэмных прылад" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Мае доступ да сістэмных прылад, якія патрабуюць павышанага ўзроўню дазволаў" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Доступ да змесціва экрана" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Мае доступ да змесціва экрана або іншых акон" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Састарэлы аконны інтэрфейс" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Адвольныя дазволы" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Налады карыстальніка" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Доступ на чытанне і запіс усёй файлавай сістэмы" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Мае доступ на чытанне і запіс даных усёй файлавай сістэмы" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Доступ на чытанне і запіс у хатняй папцы" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Мае доступ на чытанне і запіс у вашай хатняй папцы" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Доступ на чытанне ўсёй файлавай сістэмы" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Мае доступ на чытанне даных усёй файлавай сістэмы" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Доступ на чытанне ў хатняй папцы" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Мае доступ на чытанне ў вашай хатняй папцы" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Доступ на чытанне і запіс у папцы спамповак" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Мае доступ на чытанне і запіс у папцы спамповак" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Доступ на чытанне ў папцы спамповак" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Мае доступ на чытанне ў папцы спамповак" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Мае доступ на чытанне і запіс у каталогу" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Мае доступ на чытанне ў каталогу" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Без доступу да файлавай сістэмы" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Не мае доступу да ўсёй файлавай сістэмы" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Распрацоўшчык праграмы правераны" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Распрацоўшчык гэтай праграмы прайшоў праверку сапраўднасці" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Небяспечныя залежнасці" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Праграмнае забеспячэнне або яго залежнасці больш не падтрымліваюцца могуць " +"быць небяспечнымі" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Гэта праграма распрацоўваецца адпаведна з умовамі нявызначанай ліцэнзіі, " +"магчыма прапрыетарнай" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Гэта праграмнае забеспячэнне распрацоўваецца адпаведна з умовамі " +"нявызначанай ліцэнзіі, магчыма прапрыетарнай" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Прапрыетарны код" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Зыходны код не агульнадаступны, яго нельга праверыць незалежна, таму можа " +"быць небяспечным" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "" +"Гэта праграма распрацоўваецца адпаведна з умовамі спецыяльнай ліцэнзіі «%s»" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "" +"Гэта праграмнае забеспячэнне распрацоўваецца адпаведна з умовамі спецыяльнай " +"ліцэнзіі «%s»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Правяральны код" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Зыходны код агульнадаступны, яго можна праверыць незалежна, таму з большай " +"верагоднасцю праграма бяспечная" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s прывілеяваная" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s бяспечная" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s верагодна бяспечная" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s патэнцыяльна небяспечная" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s небяспечная" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Невядома" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Бяспечная" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Ліцэнзія" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Крыніца" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Гэта праграма выкарыстоўвае састарэлую версію платформы для распрацоўкі " +"(SDK), таму можа змяшчаць памылкі і мець праблемы з бяспекай, якія немагчыма " +"выправіць." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Папярэдні здымак" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Наступны здымак" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Няма здымкаў" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Здымак не знойдзены" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Не ўдалося загрузіць відарыс" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Памер здымка не вызначаны" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Не ўдалося стварыць кэш" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Здымак несапраўдны" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Здымак недаступны" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Здымак" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "Яшчэ %u супадзенне" +msgstr[1] "Яшчэ %u супадзенні" +msgstr[2] "Яшчэ %u супадзенняў" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Старонка пошуку" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Пошук праграм" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Праграма не знойдзена" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Немагчыма спампаваць абнаўленні" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Немагчыма спампаваць абнаўленні ўбудаванай праграмы" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Немагчыма спампаваць абнаўленні ўбудаванай праграмы з %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Немагчыма спампаваць абнаўленні з %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Немагчыма абнавіць: патрабуецца доступ да інтэрнэту" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Немагчыма абнавіць: недастаткова месца на дыску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Немагчыма спампаваць абнаўленні з %s: недастаткова месца на дыску" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Немагчыма абнавіць: патрабуецца праверка сапраўднасці" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Немагчыма абнавіць: сапраўднасць не пацверджана" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Немагчыма абнавіць: патрабуецца дазвол" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Немагчыма спампаваць абнаўленні: вы не маеце дазволу на ўсталяванне " +"праграмнага забеспячэння" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Немагчыма атрымаць спіс абнаўленняў" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Немагчыма ўсталяваць: не ўдалося спампаваць" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Немагчыма ўсталяваць %s: не ўдалося спампаваць з %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Немагчыма ўсталяваць %s: не ўдалося спампаваць" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Немагчыма ўсталяваць: адсутнічае асяроддзе выканання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Немагчыма ўсталяваць %s: недаступна асяроддзе %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Немагчыма ўсталяваць %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Немагчыма ўсталяваць: патрабуецца доступ да інтэрнэту" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Немагчыма ўсталяваць: няправільны фармат праграмы" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Немагчыма ўсталяваць: недастаткова месца на дыску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Немагчыма ўсталяваць %s: недастаткова месца на дыску" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Немагчыма ўсталяваць: патрабуецца праверка сапраўднасці" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Немагчыма ўсталяваць %s: патрабуецца праверка сапраўднасці" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Не ўдалося ўсталяваць: сапраўднасць не пацверджана" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Не ўдалося ўсталяваць %s: сапраўднасць не пацверджана" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Немагчыма ўсталяваць: патрабуецца дазвол" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Немагчыма ўсталяваць %s: патрабуецца дазвол" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Немагчыма ўсталяваць: прылада павінна быць падключана да электрасеткі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "" +"Немагчыма ўсталяваць %s: прылада павінна быць падключана да электрасеткі" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Немагчыма ўсталяваць: нізкі зарад батарэі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Немагчыма ўсталяваць %s: нізкі зарад батарэі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Немагчыма абнавіць %s з %s: не ўдалося спампаваць" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Немагчыма абнавіць %s: не ўдалося спампаваць" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Немагчыма ўсталяваць абнаўленні з %s: не ўдалося спампаваць" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Немагчыма абнавіць: не ўдалося спампаваць" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Немагчыма абнавіць %s: недастаткова месца на дыску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Немагчыма абнавіць %s: патрабуецца праверка сапраўднасці" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Немагчыма абнавіць %s: сапраўднасць не пацверджана" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Немагчыма абнавіць %s: патрабуецца дазвол" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Немагчыма абнавіць: прылада павінна быць падключана да электрасеткі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Немагчыма абнавіць %s: прылада павінна быць падключана да электрасеткі" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Немагчыма абнавіць: нізкі зарад батарэі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Немагчыма абнавіць %s: нізкі зарад батарэі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Немагчыма абнавіць %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Немагчыма абнавіць" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Немагчыма абнавіць" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Немагчыма абнавіць да %s з %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Немагчыма абнавіць: не ўдалося спампаваць" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Немагчыма абнавіць %s: не ўдалося спампаваць" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Немагчыма абнавіць: патрабуецца доступ да інтэрнэту" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Немагчыма абнавіць %s: патрабуецца доступ да інтэрнэту" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Немагчыма абнавіць: недастаткова месца на дыску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Немагчыма абнавіць да %s: недастаткова месца на дыску" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Немагчыма абнавіць: патрабуецца праверка сапраўднасці" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Немагчыма абнавіць да %s: патрабуецца праверка сапраўднасці" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Немагчыма абнавіць: сапраўднасць не пацверджана" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Немагчыма абнавіць да %s: сапраўднасць не пацверджана" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Немагчыма абнавіць: патрабуецца дазвол" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Немагчыма абнавіць да %s: патрабуецца дазвол" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Немагчыма абнавіць: прылада павінна быць падключана да электрасеткі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Немагчыма абнавіць да %s: прылада павінна быць падключана да электрасеткі" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Немагчыма абнавіць: нізкі зарад батарэі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Немагчыма абнавіць да %s: нізкі зарад батарэі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Немагчыма абнавіць да %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Немагчыма выдаліць: патрабуецца праверка сапраўднасці" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Немагчыма выдаліць %s: патрабуецца праверка сапраўднасці" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Не ўдалося выдаліць: сапраўднасць не пацверджана" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Не ўдалося выдаліць %s: сапраўднасць не пацверджана" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Немагчыма выдаліць: патрабуецца дазвол" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Немагчыма выдаліць %s: патрабуецца дазвол" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Немагчыма выдаліць: прылада павінна быць падключана да электрасеткі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Немагчыма выдаліць %s: прылада павінна быць падключана да электрасеткі" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Немагчыма выдаліць: нізкі зарад батарэі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Немагчыма выдаліць %s: нізкі зарад батарэі" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Немагчыма выдаліць %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Немагчыма запусціць %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Нешта пайшло не так" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Немагчыма запусціць %s: не ўсталявана асяроддзе %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Для выканання аперацыі недастаткова месца на дыску" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Немагчыма ўсталяваць: тып файла не падтрымліваецца" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Не ўдалося ўсталяваць: сапраўднасць не пацверджана" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Немагчыма ўсталяваць" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Немагчыма звязацца з %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Перазапусціце Software, каб выкарыстоўваць новыя ўбудовы" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Прылада павінна быць падключана да электрасеткі" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Нізкі ўзровень зараду батарэі" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Сховішчы праграмнага забеспячэння" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Налады" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Спалучэнні клавіш" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "Пр_а Software" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Пошук" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Галоўнае меню" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Пошук праграм" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Агляд" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Усталяваныя" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "А_бнаўленні" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Вярнуцца" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Няма" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Даныя праграмы" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Даныя неабходныя праграме для запуску" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Даныя карыстальніка" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Даныя праграмы створаныя вамі" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Кэшаваныя даныя" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Часова кэшаваныя даныя" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Сама праграма" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Запатрабаваныя залежнасці" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Агульныя сістэмныя кампаненты, якія патрабуюцца гэтай праграме" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Невядома" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Кэшаваныя даныя можна ачысціць праз _налады праграмы" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Сховішча" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (усталявана)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (усталяванне)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (спампоўванне)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (выдаленне)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Падрабязнасці" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Даследаваць" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Усталявана %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Усталяваныя абнаўленні" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Абнаўленні не ўсталяваны" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Абнаўленні састарэлі" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Праверце даступныя абнаўленні" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Крытычнае абнаўленні гатовы да ўсталявання" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Усталёўвайце крытычныя абнаўленні як мага хутчэй" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Крытычныя абнаўленні даступны для спампоўвання" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Спампоўвайце крытычныя абнаўленні як мага хутчэй" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Абнаўленні гатовы да ўсталявання" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Абнаўленні ПЗ гатовы да ўсталявання і чакаюць" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Абнаўленні даступны для спампоўвання" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Абнаўленні ПЗ даступны для спампоўвання" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "Абноўлена %u праграма — патрабуецца перазапуск" +msgstr[1] "Абноўлена %u праграмы — патрабуецца перазапуск" +msgstr[2] "Абноўлена %u праграм — патрабуецца перазапуск" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "Абноўлена %u праграма" +msgstr[1] "Абноўлена %u праграмы" +msgstr[2] "Абноўлена %u праграм" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s — абнаўленне выканана." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Перазапусціце праграму." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s і %s — абнаўленне выканана." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u праграме патрабуецца перазапуск." +msgstr[1] "%u праграмам патрабуецца перазапуск." +msgstr[2] "%u праграмам патрабуецца перазапуск." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "У тым ліку %s, %s і %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Тэрмін падтрымкі сістэмы скончыўся" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Абнавіце сістэму, каб надалей атрымліваць абнаўленні" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Новая версія %s даступна для ўсталявання" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Даступна абнаўленне праграмнага забеспячэння" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Не ўдалося абнавіць праграмнае забеспячэнне" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Падрыхтаваныя абнаўленні не ўсталяваны" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Паказаць падрабязнасці" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Абнаўленне сістэмы завершана" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Вітаем у %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Абнаўленне праграмнага забеспячэння ўсталявана" +msgstr[1] "Абнаўленні праграмнага забеспячэння ўсталяваны" +msgstr[2] "Абнаўленні праграмнага забеспячэння ўсталяваны" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Усталявана важнае абнаўленне аперацыйнай сістэмы." +msgstr[1] "Усталяваны важныя абнаўленні аперацыйнай сістэмы." +msgstr[2] "Усталяваны важныя абнаўленні аперацыйнай сістэмы." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Праглядзець" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Не ўдалося абнавіць" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Сістэма ўжо абноўлена." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Абнаўленне скасавана." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Патрабуецца доступ у інтэрнэт. Пераканайцеся, што ў вас ёсць доступ да " +"інтэрнэту і паўтарыце спробу." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Пры абнаўленні ўзнікла праблема бяспекі. Каб атрымаць больш інфармацыі, " +"звярніцеся да пастаўшчыка праграмнага забеспячэння." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Недастаткова месца на дыску, вызваліце месца і паўтарыце спробу." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Не ўдалося ўсталяваць абнаўленне. Пачакайце наступнага абнаўлення і " +"паспрабуйце зноў. Калі праблема не знікае, звяжыцеся з пастаўшчыком " +"праграмнага забеспячэння." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Апошняя праверка адбывалася %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Спыніць" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Праверыць абнаўленні" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s больш не будзе атрымліваць крытычныя абнаўленні ПЗ" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Ваша аперацыйная сістэма больш не будзе атрымліваць крытычныя абнаўленні ПЗ" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Можа спаганяцца плата" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Выкарыстанне мабільнай сеткі для праверкі абнаўленняў можа прывесці да " +"непрадбачаных выдаткаў." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Усё адно _праверыць" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Абнаўленні ПЗ спампаваныя" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Абнаўленні гатовы да ўсталявання" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Праверыць абнаўленні" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Абнаўленні" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Старонка абнаўленняў" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Загрузка абнаўленняў" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Гэта можа заняць некаторы час" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Абнаўленне не патрабуецца" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Выкарыстоўваць мабільную сетку?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Выкарыстанне мабільнай сеткі для праверкі абнаўленняў можа прывесці да " +"непрадбачаных выдаткаў" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Усё адно праверыць" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Няма злучэння" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Злучыцеся з сеткай, каб праверыць абнаўленні" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Сеткавыя налады" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Памылка" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Абнаўленне выконваецца аўтаматычна" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Абнаўленне ПЗ прыпынена" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Аўтаматычнае абнаўленне ПЗ прыпынена па адной з наступных прычын:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Выкарыстоўваецца злучэнне з тарыфікацыяй" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Выкарыстоўваецца злучэнне, якое не дазваляе спампоўваць вялікія файлы" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Задзейнічаны рэжым энергазберажэння" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Задзейнічаны рэжым гульні" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Абнаўленне праграмнага забеспячэння прыпынена" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Выкарыстоўваецца злучэнне з тарыфікацыяй — абнаўленне ПЗ прыпынена" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Выкарыстоўваецца злучэнне, якое не дазваляе спампоўваць вялікія файлы — " +"абнаўленне ПЗ прыпынена" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Задзейнічаны рэжым энергазберажэння — абнаўленне ПЗ прыпынена" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Задзейнічаны рэжым гульні — абнаўленне ПЗ прыпынена" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Перазапусціць і абнавіць…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Абнавіць _усё" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Абнаўленні ПЗ спампаваныя" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Абнаўленні гатовы да ўсталявання" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Убудаванае ПЗ" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Патрабуе перазапуску" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Абнаўленні праграм" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Убудаванае ПЗ прылады" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Спампаваць" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Даступна %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Даступна %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Інфармацыя пра новую версію" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Спампавана %s з %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Спампавана %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Вялікае абнаўленне з новымі магчымасцямі і ўдасканаленнямі." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Скасаваць абнаўленне" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Перазапусціць і абнавіць…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Не забудзьцеся стварыць рэзервовую копію даных і файлаў перад абнаўленнем." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Падрабязнасці памылкі" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Скапіяваць падрабязнасці" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Не ўдалося выдаліць файл «%s»: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Не ўдалося выдаліць папку «%s»: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "" +"Дадае, выдаляе або абнаўляе праграмнае забеспячэнне на вашым камп'ютары" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;Абнаўленні;Абнавіць;Крыніцы;Сховішчы;Рэпазіторыі;" +"Параметры;Усталяваць;Высталяваць;Выдаліць;Праграма;Праграмнае;забеспячэнне;" +"Крама;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s гатова" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s гатова да ўключэння падчас наступнай загрузкі сістэмы.." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Уключыць" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Абнаўленні сістэмы" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Агульныя абнаўленні сістэмы, напрыклад абнаўленні бяспекі і выпраўленні " +"памылак, а таксама паляпшэнне прадукцыйнасці." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Абнаўленне %s з новымі магчымасцямі і выпраўленнямі." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Сэрвісу абнаўлення EOS не ўдалося атрымаць і ўжыць абнаўленне." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Вэб-праграма" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Падтрымка вэб-праграм" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Запуск папулярных вэб-праграм праз браўзер" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Абнаўленні змяшчаюць новыя магчымасці, паляпшаюць прадукцыйнасць і " +"стабільнасць." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Падтрымка Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak – гэта фрэймворк для праграм пад Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Сістэмная папка %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Падпапка ў Хатняй папцы %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Папкі галоўнай сістэмы" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Канфігурацыя галоўнай сістэмы з /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Папка Стол" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Падпапка ў папцы Стол %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Папка Дакументы" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Падпапка ў папцы Дакументы %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Папка Музыка" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Падпапка ў папцы Музыка %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Папка Малюнкі" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Падпапка ў папцы Малюнкі %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Папка Публічныя файлы" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Падпапка ў папцы Публічныя файлы %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Папка Відэа" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Падпапка ў папцы Відэа %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Папка Шаблоны" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Падпапка ў папцы Шаблоны %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Папка кэшу карыстальніка" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Падпапка ў папцы кэшу карыстальніка %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Папка канфігурацыі карыстальніка" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Падпапка ў папцы канфігурацыі карыстальніка %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Папка даных карыстальніка" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Падпапка ў папцы даных карыстальніка %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Папка карыстальніцкага асяроддзя выканання" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Падпапка ў папцы карыстальніцкага асяроддзя выканання %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Доступ файлавай сістэмы да %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Атрыманне метаданых flatpak для %s…" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Не ўдалося ўдакладніць дадатак «%s»: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Усталявана карыстальнікам" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Усталявана сістэмай" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID праграмы" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Не ўдалося ўсталяваць дадатак «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Не ўдалося выдаліць дадатак «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Аддалены «%s» не дазваляе ўсталяваць «%s», магчыма, з-за яго фільтра. " +"Выдаліце фільтр і паўтарыце ўсталяванне. Падрабязныя звесткі пра памылку: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Узровень зараду занадта нізкі, каб выканаць абнаўленне" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Узровень зараду занадта нізкі, каб выканаць абнаўленне (%u%%, патрабуецца " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Прылада недаступна або па-за зонай дзеяння бесправаднога злучэння" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "У прылады нізкі ўзровень зараду батарэі" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "У прылады нізкі ўзровень зараду батарэі (%u%%, патрабуецца %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Прылада чакае ўжывання абнаўлення" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Неабходна падлучыць прыладу да сілкавання ад электрасеткі" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Прылада не можа выкарыстоўвацца калі вечка закрыта" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Абнаўленне для прылады %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Абнаўленне для сістэмы %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Абнаўленне для ўбудаванага кантролера %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Абнаўленне ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Абнаўленне для карпаратыўнага ME %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Абнаўленне для спажывецкага ME %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Абнаўленне для кантролера %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Абнаўленне для кантролера Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Абнаўленне мікракода працэсара %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Абнаўленне канфігурацыі %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Абнаўленне для батарэі %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Абнаўленне для камеры %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Абнаўленне для TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Абнаўленне для сэнсарнай панэлі %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Абнаўленне для мышы %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Абнаўленне для клавіятуры %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Абнаўленне для кантролера сховішча%s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Абнаўленне сеткавага інтэрфейсу %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Абнаўленне для дысплея %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Абнаўленне для BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Абнаўленне для USB-прыёмніка %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Абнаўленне для дыскавай прылады %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Абнаўленне для дыска флэш-памяці %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Абнаўленне для SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Абнаўленне для графічнага працэсара %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Абнаўленне для док-станцыі %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Абнаўленне для док-станцыі USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Убудаванае ПЗ" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Немагчыма ўжыць абнаўленне ўбудаванага ПЗ: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Падтрымка абнаўлення ўбудаванага ПЗ" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Забяспечвае падтрымку абнаўлення для ўбудаванага ПЗ" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Усталяваць непадпісанае праграмнае забеспячэнне?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Праграмнае забеспячэнне, якое трэба ўсталяваць непадпісана. Будзе немагчыма " +"праверыць паходжанне яго абнаўленняў, а таксама ці не ўнеслі ў абнаўленні " +"шкодныя змены." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Спампаваць непадпісанае праграмнае забеспячэнне?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Даступны непадпісаныя абнаўленні. Без подпісу немагчыма праверыць паходжанне " +"абнаўлення, а таксама ці не ўнеслі ў яго шкодныя змены." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Абнавіць непадпісанае праграмнае забеспячэнне?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Даступны непадпісаныя абнаўленні. Без подпісу немагчыма праверыць паходжанне " +"абнаўлення, а таксама ці не ўнеслі ў яго шкодныя змены. Абнаўленне " +"праграмнага забеспячэння будзе адключана, пакуль не выдалены або не " +"абноўлены непадпісаныя абнаўленні." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Не ўдалося ўсталяваць абнаўленні: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Пакеты" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Не ўдалося дачакацца заканчэння трансакцыі перад спампоўваннем: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Не ўдалося спампаваць абнаўленні: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Не ўдалося запусціць абнаўленне: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Аперацыйная сістэма (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Крама Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Падтрымка Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap – гэта ўніверсальны фармат пакетаў для Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Сістэма" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Сістэмны кампанент" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Збой выдалення задачы sysupdate '%s' са станам %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Зручны спосаб кіравання праграмным забеспячэннем вашай сістэмы." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Увядзіце лік ад 1 да %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Выберыце праграму:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "Праграма %s усталявана" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Праграма выдалена" +#~ msgstr[1] "Праграмы выдалены" +#~ msgstr[2] "Праграмы выдалены" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Немагчыма знайсці «%s»" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Спампоўваецца каталог праграмнага забеспячэння" + +#~ msgid "Moderate page" +#~ msgstr "Старонка мадэрацыі" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Няма водгукаў на мадэрацыі" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Гэты водгук быў для вас карысным?" + +#~ msgid "Yes" +#~ msgstr "Так" + +#~ msgid "No" +#~ msgstr "Не" + +#~ msgid "Meh" +#~ msgstr "Так сабе" + +#~ msgid "Outdated SDK version" +#~ msgstr "Састарэлая версія SDK" + +#~ msgid "Unable to install updates" +#~ msgstr "Немагчыма ўсталяваць абнаўленні" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Немагчыма выдаліць: сапраўднасць не пацверджана" + +#~ msgid "Network Settings" +#~ msgstr "Сеткавыя налады" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Абнаўленні аперацыйнай сістэмы недаступны" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Не ўдалося ўсталяваць важнае абнаўленне аперацыйнай сістэмы." + +#~ msgid "No Network" +#~ msgstr "Няма сеткі" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "" +#~ "Каб праверыць наяўнасць абнаўленняў, патрабуецца доступ да інтэрнэту." + +#~ msgid "Network _Settings" +#~ msgstr "_Налады сеткі" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Абнаўленні праграмнага забеспячэння спампаваны і гатовы да ўсталявання." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Абнаўленні праграмнага забеспячэння спампаваны і гатовы да ўсталявання." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Спампоўванне звестак пра абнаўленне…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Аўтаматычнае абнаўленне прыпынена" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Задзейнічана злучэнне з тарыфікацыяй. Злучэнні з тарыфікацыяй маюць ліміт " +#~ "перадачы даных або звязаную з лімітам плату. Каб зэканоміць трафік, " +#~ "аўтаматычнае абнаўленне прыпынена.\n" +#~ "\n" +#~ "Калі злучэнне было няправільна распазнана як лімітаванае, гэта можна " +#~ "змяніць праз «Налады»." + +#~ msgid "Open Network _Settings" +#~ msgstr "Адкрыць _сеткавыя налады" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Што вам спадабалася ў гэтай праграме? Пакіньце абгрунтаваны водгук, які " +#~ "будзе карысным для іншых." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "Немагчыма спампаваць абнаўленні: патрабуецца доступ да інтэрнэту" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Немагчыма спампаваць абнаўленні: недастаткова месца на дыску" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Немагчыма спампаваць абнаўленні: патрабуецца праверка сапраўднасці" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Немагчыма спампаваць абнаўленні: сапраўднасць не пацверджана" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Немагчыма ўсталяваць %s: вы не маеце дазволу на ўсталяванне праграмнага " +#~ "забеспячэння" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Немагчыма ўсталяваць %s. Нізкі ўзровень зараду батарэі" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Немагчыма ўсталяваць абнаўленні: недастаткова месца на дыску" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Немагчыма ўсталяваць абнаўленні: патрабуецца праверка сапраўднасці" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Немагчыма ўсталяваць абнаўленні: сапраўднасць не пацверджана" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Немагчыма абнавіць %s: вы не маеце дазволу на абнаўленне праграмнага " +#~ "забеспячэння" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Немагчыма абнавіць: вы не маеце дазволу на абнаўленне праграмнага " +#~ "забеспячэння" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Немагчыма ўсталяваць абнаўленні: патрабуецца сілкаванне ад электрасеткі" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Немагчыма абнавіць %s: нізкі ўзровень зараду батарэі" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Немагчыма ўсталяваць абнаўленні: нізкі ўзровень зараду батарэі" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "Немагчыма абнавіць да %s: патрабуецца доступ да інтэрнэту" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Немагчыма абнавіць да %s: вы не маеце дазволу на абнаўленне" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Немагчыма абнавіць да %s: нізкі ўзровень зараду батарэі" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Немагчыма выдаліць %s: патрабуецца праверка сапраўднасці" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Немагчыма выдаліць %s: сапраўднасць не пацверджана" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Немагчыма выдаліць %s: вы не маеце дазволу на выдаленне праграмнага " +#~ "забеспячэння" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Немагчыма выдаліць %s: патрабуецца сілкаванне ад электрасеткі" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Немагчыма выдаліць %s: нізкі ўзровень зараду батарэі" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Немагчыма выдаліць %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Не ўдалося ўсталяваць файл: фармат не падтрымліваецца" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Не ўдалося ўсталяваць: фармат не падтрымліваецца" + +#~ msgid "AC power is required" +#~ msgstr "Патрабуецца сілкаванне ад электрасеткі" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Сетка з тарыфікацыяй – аўтаматычнае абнаўленне прыпынена" + +#~ msgid "Find Out _More" +#~ msgstr "Даведацца _больш" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Важнае абнаўленне ПЗ гатова да ўсталявання." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Увага! Крытычныя абнаўленні ПЗ чакаюць усталявання." + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Каб пазбегнуць непрадбачаных выдаткаў і расходу трафіка, абнаўленні не " +#~ "спампоўваюцца аўтаматычна, калі задзейнічана мабільнае злучэнне або " +#~ "злучэнне з тарыфікацыяй." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Калі гэта магчыма, спампоўваць і ўсталёўваць абнаўленні ПЗ у фонавым " +#~ "рэжыме" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Паказваць толькі _свабодныя праграмы" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Паказваць толькі праграмы са свабоднымі ліцэнзіямі і хаваць прапрыетарныя" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Атрымліваецца апісанне абнаўлення, пачакайце…" + +#~ msgid "Downloading featured images…" +#~ msgstr "Спампоўванне відарысаў для вартых увагі праграм…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Паказаць падрабязную адладачную інфармацыю" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Мае доступ да адвольна выбраных файлаў" + +#~ msgid "Reviewed by your distribution" +#~ msgstr "Праверана стваральнікамі дыстрыбутыву" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an un­metered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been in­correctly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "Задзейнічана злучэнне з тарыфікацыяй. Злучэнні з тарыфікацыяй маюць ліміт " +#~ "перадачы даных або звязаную з лімітам плату. Каб зэканоміць трафік, " +#~ "аўтаматычнае абнаўленне прыпынена.\n" +#~ "\n" +#~ "Аўтаматычнае абнаўленне ўзновіцца, калі будзе даступна безлімітнае " +#~ "злучэнне. Да гэтага часу, можна ўсталёўваць абнаўленні ўручную.\n" +#~ "\n" +#~ "Калі бягучае злучэнне было няправільна распазнана як лімітаванае, гэты " +#~ "параметр можна змяніць." + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Сапраўды выдаліць %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s будзе выдалена. Каб карыстацца праграмай зноў, вам прыйдзецца " +#~ "пераўсталяваць яе." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "Часавы адбітак апошняга выхаду ў сетку з атрыманнем абнаўленняў" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Выбраныя дадатковыя кампаненты будуць усталяваны разам з праграмай." + +#~ msgid "Post Review" +#~ msgstr "Публікацыя водгуку" + +#~ msgid "_Post" +#~ msgstr "_Апублікаваць" + +#~ msgid "No screenshot provided" +#~ msgstr "Здымак адсутнічае" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Гэта праграмнае забеспячэнне недаступна на вашай мове, будзе паказвацца " +#~ "англійская." + +#~ msgid "Applications" +#~ msgstr "Праграмы" + +#~ msgid "Web Applications" +#~ msgstr "Вэб-праграмы" + +#~ msgid "Rating" +#~ msgstr "Ацэнка" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Каротка падагульце напісанае ў водгуку, напрыклад: «выдатная праграма, " +#~ "рэкамендую»." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Водгук" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Што вы думаеце аб праграме? Пастарайцеся абгрунтаваць сваё меркаванне." + +#~ msgid "Primary Menu" +#~ msgstr "Асноўнае меню" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Абнаўленні" + +#~ msgid "Refresh" +#~ msgstr "Абнавіць" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s больш не падтрымліваецца." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "" +#~ "Гэта азначае, што сістэма не атрымлівае абнаўленні для сістэмы бяспекі." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Рэкамендуецца абнавіцца да больш новай версіі." + +#~ msgid "Application Updates" +#~ msgstr "Абнаўленні праграм" + +#~ msgid "_Continue" +#~ msgstr "_Працягнуць" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Менеджар праграм для GNOME" + +#~ msgid "A list of popular applications" +#~ msgstr "Спіс папулярных праграм" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Спіс праграм, якія выкарыстоўваюцца замест прадвызначаных сістэмных." + +#, fuzzy +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "URI, які адсылае на звесткі ў паведамленні пра абнаўленне АС." + +#, fuzzy +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URI можа змяшчаць да трох '%u', якія будуць заменены абноўленай версіяй." + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Loading…" +#~ msgstr "Загрузка…" + +#~ msgid "_Add shortcut" +#~ msgstr "_Дадаць ярлык" + +#~ msgid "Re_move shortcut" +#~ msgstr "_Выдаліць ярлык" + +#~ msgid "Welcome" +#~ msgstr "Вітаем" + +#~ msgid "Welcome to Software" +#~ msgstr "Вітаем у Software" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Праз Software можна ўсталяваць усё патрэбнае праграмнае забеспячэнне. Усё " +#~ "ў адным месцы. Вы можаце знайсці праграмы сярод нашых рэкамендацый, праз " +#~ "агляд па катэгорыях або ў полі пошуку." + +#~ msgid "_Browse Software" +#~ msgstr "_Агляд праграм" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Спампоўваецца каталог праграмнага забеспячэння" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Спампоўванне ацэнак праграм…" + +#~ msgid "Name" +#~ msgstr "Назва" + +#~ msgid "user" +#~ msgstr "карыстальнік" + +#~ msgid "Channel" +#~ msgstr "Канал" + +#~ msgid "Branch" +#~ msgstr "Галіна" + +#~ msgid "URL" +#~ msgstr "URL-адрас" + +#~ msgid "Installation" +#~ msgstr "Усталяванне" + +#~ msgid "Version" +#~ msgstr "Версія" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "У сістэме няма ўсталяваных абнаўленняў." + +#~ msgid "Checking…" +#~ msgstr "Праверка…" + +#~ msgid "OS Updates" +#~ msgstr "Абнаўленні АС" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Змяшчае паляпшэнні прадукцыйнасці, стабільнасці і бяспекі." + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Спампоўванне подпісу ўбудаванага ПЗ…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Спампоўванне метаданых убудаванага ПЗ…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Дазволы праграмы невядомыя" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Праграмнае забеспячэнне атрымана з надзейнай крыніцы" + +#, c-format +#~ msgid "%u reviews total" +#~ msgid_plural "%u reviews total" +#~ msgstr[0] "Агулам %u ацэнка" +#~ msgstr[1] "Агулам %u ацэнкі" +#~ msgstr[2] "Агулам %u ацэнак" + +#~ msgid "Unknown Permissions" +#~ msgstr "Дазволы невядомыя" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Дазволы, якія неабходны праграме, невядомыя" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Праграма атрымана з надзейнай крыніцы" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "" +#~ "Распрацоўшчыкі вашага дыстрыбутыву спраўдзілі надзейнасць гэтай праграмы" diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..f34ebcc --- /dev/null +++ b/po/bg.po @@ -0,0 +1,6424 @@ +# Bulgarian translation of gnome-software po-file. +# Copyright (C) 2017 gnome-software's COPYRIGHT HOLDER +# Copyright (C) 2021, 2022, 2023 Alexander Shopov . +# Copyright (C) 2024 twlvnn kraftwerk. +# This file is distributed under the same license as the gnome-software package. +# Lyubomir Vasilev , 2017. +# Alexander Shopov , 2021, 2022, 2023. +# twlvnn kraftwerk , 2024, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-23 05:25+0000\n" +"PO-Revision-Date: 2025-02-23 18:14+0100\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.5\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Програми" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Инсталиране и обновяване на програми" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"С тази програма може да търсите и инсталирате нови приложения и системни " +"разширения, както и да премахвате вече инсталираните приложения." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Програмата показва на преден план избрани и популярни приложения, като за " +"всяко може да се види описание и няколко снимки. Приложенията може да бъдат " +"намерени чрез преглеждане на категоризирания списък или чрез търсене. Освен " +"това, програмата може да обновява системата без връзка с мрежата." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Преглед" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Подробности" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Инсталирани" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Обновления" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Подробности за обновлението" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Проектът GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Тестване на ключа за akmods в Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"За тестването на ключа за akmods в Shim UEFI е необходима идентификация" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Вписване на ключа за akmods в Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"За вписването на ключа за akmods в Shim UEFI е необходима идентификация" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Тестване на ключа за dkms в Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "За тестването на ключа за dkms в Shim UEFI е необходима идентификация" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Вписване на ключа за dkms в Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "За вписването на ключа за dkms в Shim UEFI е необходима идентификация" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Инсталиране на файл на „AppStream“ в системата" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Инсталиране на файл на „AppStream“ в системата" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Списък със съвместими проекти" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Това е списък със съвместими проекти, които да се показват, като GNOME, KDE " +"и XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Дали обновленията и надгражданията да се извършват от „Управление на " +"програмите“ в GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Ако е изключено, разделът с обновленията ще бъде скрит и „Управление на " +"програмите“ няма да извършва никакви автоматични действия спрямо " +"обновленията и надгражданията." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Автоматично изтегляне и инсталиране на обновления" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Когато е включено, „Управление на програмите“ автоматично ще изтегля " +"обновленията на заден фон и ще инсталира тези, които не се нуждаят от " +"рестартиране." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Известяване на потребителя, че софтуерът се обновява на заден фон" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Когато е включено, „Управление на програмите“ ще известява потребителя за " +"извършените обновления на заден фон." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Дали да се извършва автоматично опресняване при таксувана връзка" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Когато е включено, ще се извършва автоматично опресняване на заден фон, дори " +"когато връзката се таксува според количеството данни (ще се извършва " +"изтегляне на метаданни, проверка за обновления и т.н., което може да струва " +"пари на потребителя)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Дали това е първото пускане на „Управление на програмите“" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Показване на оценка в звезди до програмите" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Филтриране на програмите според клона по подразбиране на отдалеченото " +"хранилище" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Предупреждение преди инсталиране на програми, които не са свободни" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"При инсталиране на програми, които не са свободни, може да се покаже " +"предупреждение. Тази настройка определя дали това предупреждение да не се " +"показва." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Време на последната проверка за обновления" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Време на последното известие за надграждане" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Време на последното известие за обновяване" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Време на първото обновление по сигурността. Изчиства се след обновяване" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Време на последното обновление" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Възрастта в секунди, която се ползва за проверка дали снимката на сървъра " +"все още е правилна" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Задаването на по-голяма стойност ще означава по-малко изтегляне на данни от " +"сървъра, но ако снимките бъдат обновени, потребителят може да не ги види " +"веднага. Стойност 0 означава никога да не се прави проверка за снимката на " +"сървъра, ако тя вече е в кеша." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Сървърът, който да се ползва за оценки на програмите" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Минимална оценка за рецензиите" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Рецензиите с по-ниска оценка няма да бъдат показани." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Списък от официални източници, които не трябва да се смятат за такива от " +"трети страни" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Списък от задължителни източници, които не може да се изключват или изтриват" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Списък от официални източници, които трябва да се смятат за свободни програми" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Адресът на лиценза, който да се ползва, когато програмата трябва да се смята " +"за свободна" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Инсталиране на комплектованите програми за всички потребители на системата, " +"когато е възможно" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Достъп до прозореца за източниците на софтуер" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Предлагане на надграждане до предварителни издания" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Показване на елементи в интерфейса, които да подскажат на потребителя, че " +"дадена програма не е свободна" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Показване на размера на програмите в списъка с инсталирани програми" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"Адресът, където може да бъде намерена информация относно собственическия " +"софтуер и програми, които не са свободни" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Списък от адреси, водещи към файлове на „AppStream“, които ще бъдат " +"изтеглени в папка с информация за програмата" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Инсталиране на файловете на „AppStream“ в системна папка за всички " +"потребители. Ако е лъжа, файловете се инсталират в папката „$XDG_DATA_HOME/" +"swcatalog/xmls“, което не е по стандарт" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Списък на форматите на пакетите по приоритет, по-важните са отпред. Празен " +"масив означава стандартен списък. Пропуснатите формати са все едно най-" +"последни. Примерни формати: „deb“, „flatpak“, „rpm“, „snap“. Форматите може " +"да имат и указател откъде са с разделител „:“, напр. „flatpak:flathub“." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Времевото клеймо на последния опит за изтриване на неползваните пакети на " +"Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Когато включите настройката, се показват само програмите със свободен " +"лиценз, а тези със собственически се крият." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Когато включите настройката, се показват само програмите от разработчици, " +"чиято самоличност е потвърдена." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Време на последно получените исторически обновления." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Низ-идентификатор на регистрацията в „gnome-online-account“, с която се влиза" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Системен инсталатор за „AppStream“ на „Управление на програмите“" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Аргументите подадени на програмата не може да бъдат анализирани" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Трябва да посочите само едно име на файл" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Тази програма може да се използва само от системния администратор" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Видът на съдържанието не може да бъде проверен: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Неуспешно преместване: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Инсталиране на програми" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Инсталиране на избраните програми на системата" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Анимационно насилие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Липсва информация за анимационно насилие" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Въображаемо насилие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Липсва информация за въображаемо насилие" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Реалистично насилие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Липсва информация за реалистично насилие" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Насилие с кръвопролитие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Липсва информация за насилие с кръвопролитие" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Сексуално насилие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Липсва информация за сексуално насилие" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Алкохол" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Липсва информация за наличие на алкохол" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Наркотици" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Липсва информация за наличие на наркотици" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Тютюн" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Липсва информация за наличие на тютюн и продукти от него" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Голота" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Липсва информация за каквато и да е голота" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Сексуална тематика" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Липсва информация за наличие на сексуална тематика" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Ненормативна лексика" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Липсва информация за употреба на каквато и да е ненормативна лексика" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Неуместен хумор" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Липсва информация за наличие на неуместен хумор" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Дискриминация" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Липсва информация за наличие на дискриминационна лексика" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Реклами" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Липсва информация за наличие на реклами" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Хазарт" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Липсва информация за какъвто и да е хазарт" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Пазаруване" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Липсва информация за пазаруване или харчене на пари" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Текстова връзка между потребители" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Липсва информация за наличието на текстова връзка между потребители" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Аудио връзка между потребители" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Липсва информация за наличието на аудио връзка между потребители" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "За контакти" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Липсва информация за споделяне на имената или адресите на е-поща за " +"регистрациите в социалните мрежи" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Идентифицираща информация" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Липсва информация за споделяне на идентифицираща ви информация с трети страни" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Споделяне на местоположение" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Липсва информация за споделяне на местоположението ви с други потребители" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Хомосексуалност" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Липсва информация за наличие на хомосексуалност" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Проституция" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Липсва информация за наличие на проституция" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Изневяра" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Липсва информация за наличие на изневери" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Сексуализирани герои" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Липсва информация за наличие на сексуализирани герои" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Оскверняване" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Липсва информация за наличие на оскверняване" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Човешки останки" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Липсва информация за наличие на видими останки от мъртви хора" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Робство" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Липсва информация за наличие на робство" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Без наличие на наркотици" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Без ругатни, псувни или друг вид ненормативна лексика" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Без реклами или парични транзакции" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Без секс или голота" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Без неограничено общуване със съобщения" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Без насилие" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Наркотици" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Ненормативна лексика" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Пари" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Социални с общуване" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Насилие" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Всички" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s няма информация за възрастово ограничение" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s е подходяща за всички" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s е подходяща за малки деца" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s е подходяща за деца" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s е подходяща за деца" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s е подходяща за тинейджъри" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s е подходяща за възрастни" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "„%s“ е подходяща за %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Възрастово ограничение" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Как да помогнете като добавите липсваща информация" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Локален файл" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Пакет" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Чакащи" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Предстоящо инсталиране" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Предстоящо деинсталиране" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Инсталира се" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Деинсталира се" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Изтегляне" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Инсталиране" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Деинсталиране…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Мрежа" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Може да комуникира по мрежата" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Системни услуги" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Достъпва услугите на D-Bus по системната шина" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Сесийни услуги" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Достъпва услугите на D-Bus по сесийната шина" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Устройства" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Достъпва всякакви устройства, напр. камери" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Достъпва входните устройства" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Достъпва микрофони и възпроизвеждане на звук" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Достъпва файловете на системните устройства" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Съдържанието на екрана" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Достъпва съдържанието на екрана" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Домашна папка" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Преглед, редакция и създаване на файлове" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Преглед на файлове" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Файлова система" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Папка за изтегляния" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Настройки" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Преглед и промяна на всякакви настройки" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Остаряла графична система" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Ползва стара и несигурна графична система" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Изход от ограничената среда" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" +"Може да излезе от ограничената среда и заобиколи всякакви други ограничения" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Няма информация за обновлението." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Подробности за обновлението" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Изисква допълнителни права" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Неправилни данни за оценките, получени от сървъра" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Неуспешно свързване със сървъра за оценките" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Рецензии" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Няма рецензии за тази програма." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Няма рецензии" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "История на версията" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Ново във версия %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Версия %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Няма данни за тази версия" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Режим на стартиране. Един от следните: „updates“ (обновления), „updated“ " +"(обновени), „installed“ (инсталирани) или „overview“ (преглед)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "РЕЖИМ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Търсене на програми" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ТЪРСЕНЕ" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "" +"Показване на подробностите за програма (по идентификатор на приложение)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ИД" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Показване на подробностите за програма (по име на пакета)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "ИМЕ_НА_ПАКЕТ" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Инсталиране на програма (по идентификатор на програмата)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Деинсталиране на програма (по идентификатор на програмата)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Отваряне на локален пакетен файл" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "ИМЕ_НА_ФАЙЛ" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Видът взаимодействие очаквано за това действие. Едно от следните: „none“ " +"(никакво), „notify“ (известяване) или „full“ (пълно)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ВЗАИМОДЕЙСТВИЕ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Показване на локалния файл във формат „metainfo“ или „appdata“" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Включване на допълнителна информация за изхода за отстраняване на грешки (от " +"работещия прозорец на програмата, ако вече работи)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Инсталиране на чакащите на заден фон" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Показване на настройките" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Затваряне на работещата програма" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Предпочитане на локални файлове като източници пред „AppStream“" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Показване на номера на версията" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "" +"Авторски права © 2016–2023 Сътрудниците на „Управление на програмите“ в GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Любомир Василев <lyubomirv@abv.bg>\n" +"Александър Шопов <ash@kambanaria.org>\n" +"\n" +"Проектът за превод на GNOME има нужда от подкрепа.\n" +"Научете повече за нас на уеб сайта ни.\n" +"Докладвайте за грешки в превода в съответния раздел." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "За съжаление няма повече данни за тази програма." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Размер след инсталация" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Включва %s данни и %s кеш" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Включва %s данни" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Включва %s кеш" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Не е известно колко кеш и данни се ползват" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Размер за изтегляне" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Няма нужда от допълнителни системни изтегляния" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Има нужда от неизвестно количество допълнителни системни изтегляния" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Има нужда от %s допълнителни системни изтегляния" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Неизвестен размер" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Без повече права" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Ползва мрежа" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Ползва системни услуги" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Ползва сесийни услуги" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Достъпва хардуерни устройства" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Достъпва системните устройства" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Чете/пише всичките ви данни" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Чете всичките ви данни" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Чете/пише в изтеглените" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Чете изтеглените" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Достъпва някои специфични файлове" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Достъп до настройките на потребител" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Остаряла графична система" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Може да придобива всякакви права" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Потвърден софтуерен разработчик" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Прегледана от дистрибуцията ви" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Прегледана от %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Предоставена от трети лица" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Този софтуер вече не се поддържа" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Проверим код" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Неизвестен лиценз" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Собственически код" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Специален лиценз" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Привилегирован" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Сигурен" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Вероятно безопасен" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Възможно несигурен" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Несигурен" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Само мобилен" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Само за малък екран" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Само настолен" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Само за голям екран" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Неподдържан екран" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Не поддържа текущия размер на екрана" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Изисква сензорен екран" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Изисква клавиатура" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Изисква мишка" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Изисква контролер за игри" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Изисква контролер за игри" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Адаптивна" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Работи на телефони, таблети и настолни компютри" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Вероятно изисква клавиатура или мишка" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Работи на таблети и настолни компютри" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Подходяща за всякакви възрасти" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Няма информация за възрастово ограничение" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Посещаване на уеб сайта" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Инсталиране…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Отказ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Инсталиране" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Изтегляне" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Обновяване" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Деинсталиране…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Деинсталира се" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Критично важно обновление" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Устройството не може да се използва по време на обновяване." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Източник: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Преименувано от „%s“" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Престана да получава обновления" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Критично важно обновление" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Инсталирана" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Помогнете с превода на „%s“" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s се проектира, разработва и превежда от международен екип от доброволци.\n" +"\n" +"Макар да не е достъпна на езика ви, вие може да помогнете за превода на " +"програмата." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Преводи" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Уеб сайт за _преводи" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Изисква се вписване към %s (област %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Изисква се вписване" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Отказ" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Вписване" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Потребител" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "П_арола" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Други" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Всички" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Избрани" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Избрани от дистрибуцията" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Нови и обновени" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Избрано от уеб" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Други програми" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s инсталирано" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "За да влязат в сила промените, е нужно рестартиране на системата" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Програмата е готова за ползване" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Системните обновления са инсталирани" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Последно инсталираните обновления може да бъдат прегледани" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Рестартиране" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Пускане" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Инсталиране на програми?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Инсталиране на програми от трети страни?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Включване на източника на софтуер?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Включване на източниците на софтуер от трети страни?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"„%s“ не е свободен " +"софтуер с отворен код и се осигурява от „%s“." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "„%s“ се осигурява от „%s“." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Този източник на софтуер трябва да бъде включен, за да продължи " +"инсталирането." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"В някои държави инсталирането и използването на „%s“ може да е незаконно." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"В някои държави инсталирането и използването на този кодек може да е " +"незаконно." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_Без това предупреждение" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Включване и _инсталиране" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Следват подробните съобщения от пакетната система:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Подробности" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Затваряне" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Подробностите бяха копирани в буфера за обмен" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Приемане" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Обновлението бе инсталирано" +msgstr[1] "Обновленията бяха инсталирани" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Програмата бе инсталирана" +msgstr[1] "Програмите бяха инсталирани" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Нужно е рестартиране на системата, за да влезе в сила промяната" +msgstr[1] "Нужно е рестартиране на системата, за да влязат в сила промените" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Не сега" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Днес" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Вчера" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Преди %d ден" +msgstr[1] "Преди %d дни" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Преди %d седмица" +msgstr[1] "Преди %d седмици" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Преди %d месец" +msgstr[1] "Преди %d месеца" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Преди %d година" +msgstr[1] "Преди %d години" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Сега" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Преди %d минута" +msgstr[1] "Преди %d минути" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Преди %d час" +msgstr[1] "Преди %d часа" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Всички" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Избрани" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Тримерна графика" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Фотография" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Сканиране" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Векторна графика" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Преглед" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Създаване и обработка на звуци" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Изпълнение на музика" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Всички" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Избрани" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Календар" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Бази от данни" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Финанси" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Текстообработващи програми" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Текстови редактори" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Браузъри" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Всички" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Избрани" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Екшън" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Приключенски" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Аркадни" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Блокчета" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Настолни" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Карти" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Емулатори" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "За деца" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Логически" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Ролеви" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Спортни" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Стратегически" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Всички" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Избрани" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Разговори" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Всички" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Избрани" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Изкуствен интелект" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Астрономия" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Химия" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Езици" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Математика" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Новини" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Роботика" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Изкуство" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Биография" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Комикси" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Белетристика" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Здраве" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "История" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Начин на живот" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Политика" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Спорт" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Всички" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Избрани" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Отстраняване на грешки" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Среди за разработка" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Кодеци" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Драйвери" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Шрифтове" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Входни устройства" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Езикови пакети" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Преводи" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Творчески" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Работа" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Игра" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Общуване" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Обучение" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Разработка" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Кодеци" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Драйвери за хардуер" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Шрифтове" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Методи за вход" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Езикови пакети" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Локализация" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Програма" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "„%s“ изисква поддръжка на допълнителен файлов формат." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Изискват се допълнителни видове MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "„%s“ изисква допълнителни шрифтове." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Изискват се допълнителни шрифтове" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "„%s“ изисква допълнителни мултимедийни кодеци." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Изискват се допълнителни мултимедийни кодеци" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "„%s“ изисква допълнителни драйвери за принтер." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Изискват се допълнителни драйвери за принтер" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "„%s“ изисква допълнителни пакети." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Изискват се допълнителни пакети" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Търсене в „Управление на програмите“" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Повече информация" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "По-_малко информация" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Премахване…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Изисква рестартиране за завършване на инсталирането" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Изисква рестартиране за завършване на деинсталирането" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Предстои инсталиране…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Предстои обновление…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Изтегляне…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Подготовка…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Деинсталира се…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s не е инсталирано, но все още има данни." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Рестартиране" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Включване…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Инсталиране…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "„%s“ ще работи на американски английски" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Програмата ще работи на американски английски" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Програмата ще работи на американски английски" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Помогнете с _превода" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Други програми от %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Разработчикът %s е доказал собствеността на „%s“" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Разработчикът е доказал собствеността на „%s“" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "За да публикувате рецензия, се нуждаете от връзка с Интернет" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Тази програма престана да получава обновления, включително и обновления по " +"сигурността" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Тази програма вече се предоставя от дистрибуцията ви и не трябва да бъде " +"заменяна." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Липсва каквато и да е връзка към уеб сайт, хранилище за софтуер или сайт за " +"докладване на грешки за тази програма." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Този софтуер престана да получава обновления, включително и обновления по " +"сигурността" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Тази програма вече се предоставя от дистрибуцията ви и не трябва да бъде " +"заменяна." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Липсва каквато и да е връзка към уеб сайт, хранилище за софтуер или сайт за " +"докладване на грешки за тази програма." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Информацията за „%s“ не бе изтеглена и не може да се покажат повече данни за " +"програмата." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Получен е неправилен отговор за рецензия от сървъра" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Рецензията за „%s“: %s не може да бъде изпратена" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Подробности" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Зареждане на подробната информация за програмата" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Потвърдено" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Отваряне" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Обновяване" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Деинсталиране" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Добавки" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Тази програма може да бъде използвана само при наличие на връзка с Интернет." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Включва източник на софтуер" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Това приложение включва източник на софтуер, който предоставя обновления, " +"както и достъп до още програми." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Не включва източник на софтуер" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "Тази програма не включва източник на софтуер. Тя няма да се обновява." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Открит е източник на софтуер" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Добавянето на този източник на софтуер ще ви даде достъп до допълнителни " +"програми, обновления и надграждания." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Използвайте само доверени източници на софтуер." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Изчистване на данните на програмата" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Изтриване на данните" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Няма метаданни" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Уеб сайт на проекта" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Дарение" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Помагане с _превода" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Докладване на грешка" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Помо_щ" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Свържете се" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Писане на рецензия" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Всички рецензии" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Подробностите за програмата не може да се изведат" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Рестартирането не може да се подготви" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Неизвестна грешка" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Ключът не е намерен" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Ключът не е вписан" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Изисква се вписване на ключ на собственика на машината" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Напред" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Това устройство е с включено доверено стартиране (Secure Boot). За да " +"позволите инсталирането на нови устройства, трябва да впишете нов ключ на " +"собственик на машината (MOK). Процесът изисква да въведете парола по-късно. " +"Запишете си следната парола за ключа:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Записал съм си _паролата на собственика на машината, заклевам се!" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Рестартиране и вписване…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Инструкции за настройка: прочетете много внимателно" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"След рестартиране ще се покаже екран за настройка на устройство. За да " +"включите новите драйвери, следвайте следните стъпки:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Изберете „Enroll MOK“ (вписване на ключ на собственика на машината);\n" +"• Изберете „Yes“, за да потвърдите вписването на ключ;\n" +"• Въведете паролата на собственика на машината, когато тя бива поискана;\n" +"• Изберете „Reboot“ за рестартиране." + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Как това се отразява на сигурността" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"След успешно вписване на ключ, обновяването на този или друг модул се считат " +"за доверени. Всички бъдещи обновявания ще стават без да има нужда от подобна " +"процедура както сегашната." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Повече информация има в страниците с документация." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Изтегляне на допълнителни файлове с метаданни…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " и " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Налични шрифтове за писмеността: %s" +msgstr[1] "Налични шрифтове за писменостите: %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Налични програми за: %s" +msgstr[1] "Налични програми за: %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Търсената програма не е открита" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Търсената програма не може да бъде открита" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "„%s“ не е намерена" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "в уеб сайта" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Няма програми, които предоставят файла „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Може да откриете информация за „%s“, както и за възможните начини да се " +"сдобиете с липсващите програми, %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Няма програми, които поддържат „%s“." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "„%s“ не е налично." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Може да откриете информация за „%s“, както и за възможните начини да се " +"сдобиете с програма, която поддържа този формат, %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Няма шрифтове, които поддържат писмеността %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Може да откриете информация за %s, както и за възможните начини да се " +"сдобиете с допълнителни шрифтове, %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Няма кодеци-добавки за форма̀та „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Може да откриете информация за „%s“, както и за възможните начини да се " +"сдобиете с кодек, който може да възпроизведе този формат, %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Няма ресурси на „Plasma“ налични за поддръжката на „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Може да откриете информация за „%s“, както и за възможните начини да се " +"сдобиете с допълнителни ресурси на „Plasma“, %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Няма драйвери за принтер за „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Може да откриете информация за „%s“, както и за възможните начини да се " +"сдобиете с драйвер за този принтер, %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "документацията" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Кодекът „%s“, изискан от „%s“, не може да бъде открит. Прегледайте %s за " +"повече информация." +msgstr[1] "" +"Кодеците „%s“, изискани от „%s“, не може да бъдат открити. Прегледайте %s за " +"повече информация." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Кодекът „%s“, който търсехте, не може да бъде открит. Прегледайте %s за " +"повече информация." +msgstr[1] "" +"Кодеците „%s“, които търсехте, не може да бъдат открити. Прегледайте %s за " +"повече информация." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Няма резултати от търсенето: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Файлов формат %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Инсталиране на _всички" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Търсената програма не може да бъде открита" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Страница с кодеци" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Няма резултати" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Търсенето не може да се извърши" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Назад" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Напред" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Списък с представени програми" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Поддръжка на настолни компютри" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Поддържа ползване на голям екран" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Неизвестно дали може да се ползва на настолен компютър" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Няма достатъчно информация дали се поддържат големи екрани" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Изисква голям екран" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Настолни компютри не се поддържат" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Не може да се ползва на голям екран" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Поддръжка на мобилни устройства" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Поддържа ползване на малък екран" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Неизвестно дали може да се ползва на мобилно устройство" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Няма достатъчно информация дали се поддържат мобилни устройства" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Изисква малък екран" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Мобилни устройства се не поддържат" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Не може да се ползва на малък екран" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Поддръжка на клавиатура" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Поддръжката на клавиатура е неизвестна" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Няма достатъчно информация дали се поддържат клавиатури" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Изисква клавиатура" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Поддържа клавиатура" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Не се поддържа клавиатура" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Не може да се ползва с клавиатура" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Поддръжка на мишка" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Изисква мишка или подобно устройство" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Неизвестна поддръжка на мишка" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "Няма достатъчно информация дали поддържа мишка или подобно устройство" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Изисква мишка" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Поддържа мишки и подобни устройства" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Мишки не се поддържат" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Не може са се ползва с мишка или подобно устройство" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Поддръжка на сензорни екрани" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Неизвестно дали се поддържат сензорни екрани" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Няма достатъчно информация дали се поддържат сензорни екрани" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Изисква сензорен екран" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Поддържа сензорен екран" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Сензорен екран не се поддържа" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Не може да се ползва със сензорен екран" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Изисква контролер за игри" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Изисква контролер за игри" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Поддръжка на контролер за игри" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Поддържа контролери за игри" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s вероятно работи на това устройство" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s работи на това устройство" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s вероятно работи на това устройство" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s не работи правилно на това устройство" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s не работи на това устройство" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Поддръжка на хардуер" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Навигация" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Към Разглеждане" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Към инсталираните" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Към обновленията" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Отваряне на лентата за търсене" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Прозорци" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Отваряне на настройките" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Отваряне на източниците на софтуер" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Помощ" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Отваряне на клавишните комбинации" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Инсталирани" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Страница с инсталираните" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Извършва се" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Програми" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Поддръжка на уеб програми" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Системни програми" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Изградено от общността" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Включете се и вие" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Този софтуер се разработва публично от международен екип и се лицензира по " +"условията на лиценза %s.\n" +"\n" +"И вие може да допринесете и да го направите още по-добър." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Този софтуер се разработва публично от международен екип и се лицензира по " +"условията на %s.\n" +"\n" +"И вие може да допринесете и да го направите още по-добър." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Този софтуер се разработва публично от международен екип и се лицензира по " +"условията на лиценза %s.\n" +"\n" +"И вие може да допринесете и да го направите още по-добър." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Този софтуер се разработва публично от международен екип и се лицензира по " +"условията на %s.\n" +"\n" +"И вие може да допринесете и да го направите още по-добър." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Неизвестен лиценз" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Още информация" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Тази програма не посочва под какъв лиценз се разработва и само " +"разработчиците му знаят как работи. Той може да не е сигурен или надежден по " +"труден за установяване начин. Той може да се промени без всякакво " +"предупреждение.\n" +"\n" +"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на " +"разработката му." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Този софтуер не посочва под какъв лиценз се разработва и само разработчиците " +"му знаят как работи. Той може да не е сигурен или надежден по труден за " +"установяване начин. Той може да се промени без всякакво предупреждение.\n" +"\n" +"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на " +"разработката му." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Собственически" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Този софтуер не се разработва публично и само разработчиците му знаят как " +"работи. Той може да не е сигурен или надежден по труден за установяване " +"начин. Той може да се промени без всякакво предупреждение.\n" +"\n" +"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на " +"разработката му." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Този софтуер не се разработва публично и само разработчиците му знаят как " +"работи. Той може да не е сигурен или надежден по труден за установяване " +"начин. Той може да се промени без всякакво предупреждение.\n" +"\n" +"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на " +"разработката му." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Специален лиценз" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Тази програма се разработва по условията на специалния лиценз %s.\n" +"\n" +"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на " +"разработката му." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Тази програма се разработва по условията на специалния лиценз „%s“\n" +"\n" +"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на " +"разработката му." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Този софтуер се разработва по условията на специалния лиценз %s.\n" +"\n" +"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на " +"разработката му." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Този софтуер се разработва по условията на специалния лиценз „%s“\n" +"\n" +"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на " +"разработката му." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Обновяване на данните" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Страница за зареждане" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Стартиране" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Неизвестен източник" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Бета" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Потребител" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Добавяне" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Премахване" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Обновления" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Понижаване" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "избрани външни източници" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Достъп до допълнителни програми от %s. Има и собственически софтуер.\n" +"\n" +"Може по-късно да включите тези източници на софтуер от настройките за това." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Включване на източниците на софтуер от трети страни?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Прескачане" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Включване" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Налично за вашата операционна система" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Налично за „%s“" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Разглеждане" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Страница за общ преглед" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Налични програми" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Други категории" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Не са открити програмни данни" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Неизвестно" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Добре" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Потребителят отказа инсталирането" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Подготовка на „%s“" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Наистина ли искате да премахнете източника „%s“?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Всички програми от „%s“ ще бъдат премахнати, и ако искате да ги ползвате " +"отново, ще трябва пак да инсталирате източника." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Деинсталиране на „%s“?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "След премахването няма да може да ползвате „%s“." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"След премахването няма да може да ползвате никоя програма, която зависи от " +"„%s“." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"След премахването няма да е възможно да използвате „%s“. Документите, които " +"ползват тази програма, ще се визуализират с различен шрифт." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"След премахването няма да е възможно да използвате „%s“. Някои медийни " +"файлове няма да може да се изпълняват." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "Хардуерът, който зависи от „%s“ може да не работи след премахването." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"След премахването няма да е възможно да използвате „%s“. Данните и " +"настройките на програмата ще се пазят на диска, за да може да се възстанови " +"приложението в бъдеще." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Настройки" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Обновления" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Допълнителна информация" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Проверяването и изтеглянето на обновления използва данни и енергия. Затова " +"функциите за автоматично обновяване се спират на пауза, когато използвате " +"мрежови връзки, които се таксуват и когато е включен режимът за " +"енергоспестяване." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Автоматично" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Автоматично проверяване и изтегляне на обновления" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Ръчно" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Проверяването и изтеглянето на обновления трябва да се прави ръчно" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Известия при автоматично обновяване" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Известяване при автоматичното прилагане на обновления" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Филтри на съдържание" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Показване само на _свободен софтуер" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Скриване на собственически софтуер при разглеждане и търсене" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Показване само на _потвърдени разработчици" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Показване само на програми от разработчици, чиято самоличност е потвърдена" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Част от инсталирания софтуер е несъвместим с „%s“ и ще бъде автоматично " +"премахнат по време на надграждането." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Несъвместим софтуер" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Рестартиране и надграждане" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Деинсталиране" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Настройки и данни на програмата" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Запазване" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Позволява възстановяването на настройките и съдържанието на програмата" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Изтриване" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Окончателно изтриване на данните за освобождаване на място на диска" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "Програмите, инсталирани от „%s“, повече няма да бъдат обновявани." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Да се изключи ли този източник?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Де се изтрие ли този източник?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "Из_ключване" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "Из_триване" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Включване на новите източници" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Включване на новите източници при добавянето им" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "допълнителна информация" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Допълнителни източници от избрани трети страни — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Източници от трети страни за Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "операционната система" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Тези източници допълват програмите от „%s“." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Източници на софтуер" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Няма източници" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u инсталирана програма" +msgstr[1] "%u инсталирани програми" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u инсталирана добавка" +msgstr[1] "%u инсталирани добавки" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u програма" +msgstr[1] "%u програми" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u добавка" +msgstr[1] "%u добавки" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "Инсталирани: %s и %s" +msgstr[1] "Инсталирани: %s и %s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Проверяване на инсталиран софтуер…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Изтриване" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Ужасна" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Не ми харесва" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Става" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Харесва ми" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Страхотна" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Изберете звезда за оценка" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Отделете малко повече време за рецензията" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Изберете оценка в брой звезди" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Обобщението е твърде кратко" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Обобщението е твърде дълго" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Описанието е твърде кратко" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Описанието е твърде дълго" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Писане на рецензия" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Изпращане" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Моля, посочете оценка, обобщение и текст на рецензията. Рецензиите не трябва " +"да се използват за съобщаване на проблеми: вместо това се свържете с " +"разработчика или с вашия доставчик на поддръжка." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Обобщение на рецензията" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Писане на кратка рецензия" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Вижте изпращаните данни в политиката ни за поверителност. Цялото име, което е свързано с " +"регистрацията ви, е видимо публично." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "общо %u ревю" +msgstr[1] "общо %u ревюта" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "от 5 звезди" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Неизвестен" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Може да докладвате рецензия, ако смятате, че тя е неуместна, груба или " +"дискриминираща." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"След като рецензията бъде докладвана, тя ще бъде скрита, докато не бъде " +"проверена от администратор." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Докладване на рецензията?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Докладване" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Да се изтрие ли на рецензията?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Изтриването на рецензия е необратимо." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Положителна рецензия" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Отрицателна рецензия" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Докладване…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Премахване…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Програмата не е в ограничена среда, но дистрибуцията е проверила, че " +"програмата не е злонамерена" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Имате ли доверие на доставчика на софтуера, защото програмата не е в " +"ограничена среда" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Няма права" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Програмата е в ограничена среда" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Достъп до мрежата" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Може да достъпва мрежата" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Без достъп до мрежата" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Не може да достъпва мрежата" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Ползва системни услуги" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Може да заяви данни от системни услуги" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Ползва сесийни услуги" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Може да заяви данни от сесийни услуги" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Потребителски достъп до устройства" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Има достъп до устройства като уеб камера или контролер за игри" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Без потребителски достъп до устройства" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Няма достъп до устройства като уеб камера или контролер за игри" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Достъп до входни устройства" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Достъп до микрофона и възпроизвеждане на звук" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Може да слуша с микрофони и да възпроизвежда звук, без да иска разрешение" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Системен достъп до устройства" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Достъпва системните устройства, които искат права на администратор" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Достъп до съдържанието на екрана" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Може да достъпи съдържанието на екрана или други прозорци" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Остаряла графична система" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Произволни права" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Потребителски настройки" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Пълен достъп за четене и писане по файловата система" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Може да чете и пише всички данни на файловата система" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Достъп за четене и писане в домашната папка" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Може да чете и пише всякакви данни в домашната ви папка" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Пълен достъп за четене на цялата файлова система" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Може да чете всички данни от файловата система" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Достъп за четене на файловете в домашната папка" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Може да чете всякакви данни в домашната ви папка" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Четене и писане в папката за изтеглените" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Може да чете всякакви данни в папката за изтеглените" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Достъп за четене до папката за изтеглените" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Достъп за четене до изтеглените файлове" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Може да чете и пише всякакви данни в папката" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Може да чете всякакви данни в папката" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Без достъп до файловата система" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Без никакъв достъп до файловите системи" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Познат разработчик" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Потвърдено е кой e разработчикът на програмата" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Несигурни зависимости" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Програмата или зависимостите ѝ вече не се поддържат и може да са несигурни" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Тази програма не посочва под какъв лиценз се разработва и само " +"разработчиците ѝ знаят как работи" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Този софтуер не посочва под какъв лиценз се разработва и само разработчиците " +"му знаят как работи" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Собственически код" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Изходният код не е публичен — не може да бъде прегледан и може да се окаже " +"несигурен" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Тази програма се разработва по условията на специалния лиценз „%s“" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Този софтуер се разработва по условията на специалния лиценз „%s“" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Проверим код" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Изходният код е публичен — може да бъде прегледан независимо, което " +"увеличава вероятността да е надежден" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s е с привилегии" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "„%s“ е безопасна" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s вероятно е безопасна" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "„%s“ потенциално не е безопасна" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "„%s“ не е безопасна" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Неизвестно" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Сигурност" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Лиценз" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Източник" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "За разработчици" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Тази програма ползва остаряла софтуерна платформа за разработка (SDK) и може " +"да съдържа грешки и проблеми със сигурността, които никога няма да бъдат " +"коригирани." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Предишна снимка на екрана" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Следваща снимка на екрана" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Без снимки на екрана" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Снимката не може да бъде открита" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Изображението не може да бъде заредено" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Търсеният размер на снимката не може да бъде открит" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Кешът не може да бъде създаден" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Снимката е неправилна" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Снимката не е налична" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Снимка на екрана" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "Още %u съвпадение" +msgstr[1] "Още %u съвпадения" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Страница за търсене" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Търсене на програми" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Няма намерени програми" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "„%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "Обновленията не може да бъдат изтеглени" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "Обновленията на фърмуера не може да се изтеглят" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Обновленията на фърмуера не може да се изтеглят от %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Обновленията не може да бъдат изтеглени от %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "Обновяването е невъзможно: няма връзка с мрежата" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "Обновяването е невъзможно: няма достатъчно свободно място на диска" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Обновленията не може да бъдат изтеглени от %s: няма достатъчно свободно " +"място на диска" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "Обновяването е невъзможно: изисква се удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "Обновяването е невъзможно: неправилно удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "Обновяването е невъзможно: изисква се разрешение" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Обновленията не може да бъдат изтеглени: нямате правомощия за инсталиране на " +"софтуер" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "Списъкът с обновления не може да бъде получен" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "Инсталирането е невъзможно: неуспешно изтегляне" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "„%s“ не може да се инсталира: изтеглянето от „%s“ беше неуспешно" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "„%s“ не може да се инсталира: неуспешно изтегляне" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "Инсталирането е невъзможно: липсва среда за изпълнение" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "„%s“ не може да се инсталира: средата за изпълнение „%s“ липсва" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "„%s“ не може да се инсталира" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "Инсталирането е невъзможно: няма връзка с мрежата" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "Инсталирането е невъзможно: програмата е в неправилен формат" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "Инсталирането е невъзможно: няма достатъчно свободно място на диска" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "„%s“ не може да се инсталира: няма достатъчно свободно място на диска" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "Инсталирането е невъзможно: изисква се удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "„%s“ не може да се инсталира: изисква се удостоверяване" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "Инсталирането е невъзможно: неуспешно удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "„%s“ не може да се инсталира: неуспешно удостоверяване" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "Инсталирането е невъзможно: изисква се разрешение" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "„%s“ не може да се инсталира: изисква се разрешение" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "" +"Инсталирането е невъзможно: изисква се захранване от електрическата мрежа" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "" +"„%s“ не може да се инсталира: изисква се захранване от електрическата мрежа" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "Обновленията не може да се инсталират: твърде нисък заряд на батерията" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "„%s“ не може да се инсталира: твърде нисък заряд на батерията" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "„%s“ не може да се обнови от „%s“: неуспешно изтегляне" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Обновяването на „%s“ е невъзможно: неуспешно изтегляне" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Обновленията не може да се инсталират от „%s“: неуспешно изтегляне" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "Обновяването е невъзможно: неуспешно изтегляне" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" +"Обновяването на „%s“ е невъзможно: няма достатъчно свободно място на диска" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Обновяването на „%s“ е невъзможно: изисква се удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Обновяването на „%s“ е невъзможно: неправилно удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Обновяването на „%s“ е невъзможно: изисква се разрешение" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "" +"Обновяването е невъзможно: изисква се захранване от електрическата мрежа" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "" +"Обновяването на „%s“ е невъзможно: изисква се захранване от електрическата " +"мрежа" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "Обновяването е невъзможно: твърде нисък заряд на батерията" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Обновяването на „%s“ е невъзможно: твърде нисък заряд на батерията" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "„%s“ не може да се обнови" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "Невъзможно обновяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "Надграждането е невъзможно" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Надграждането до „%s“ от „%s“ е невъзможно" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "Надграждането е невъзможно: неуспешно изтегляне" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Надграждането до „%s“ е невъзможно: неуспешно изтегляне" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "Надграждането е невъзможно: няма връзка с мрежата" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Надграждането до „%s“ е невъзможно: няма връзка с мрежата" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "Надграждането е невъзможно: няма достатъчно свободно място на диска" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" +"Надграждането до „%s“ е невъзможно: няма достатъчно свободно място на диска" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "Надграждането е невъзможно: изисква се удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Надграждането до „%s“ е невъзможно: изисква се удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "Надграждането е невъзможно: неправилно удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Надграждането до „%s“ е невъзможно: неправилно удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "Надграждането е невъзможно: изисква се разрешение" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Надграждането до „%s“ е невъзможно: изисква се разрешение" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "" +"Надграждането е невъзможно: изисква се захранване от електрическата мрежа" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Надграждането до „%s“ е невъзможно: изисква се захранване от електрическата " +"мрежа" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "Надграждането е невъзможно: твърде нисък заряд на батерията" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Надграждането до „%s“ е невъзможно: твърде нисък заряд на батерията" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Надграждането до „%s“ е невъзможно" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "Деинсталирането е невъзможно: изисква се удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Деинсталирането на „%s“ е невъзможно: изисква се удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "Деинсталирането е невъзможно: неуспешно удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Деинсталирането на „%s“ е невъзможно: неуспешно удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "Деинсталирането е невъзможно: изисква се разрешение" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Деинсталирането на „%s“ е невъзможно: изисква се разрешение" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "" +"Деинсталирането е невъзможно: изисква се захранване от електрическата мрежа" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "" +"Деинсталирането на „%s“ е невъзможно: изисква се захранване от " +"електрическата мрежа" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "Деинсталирането е невъзможно: твърде нисък заряд на батерията" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Деинсталирането на „%s“ е невъзможно: твърде нисък заряд на батерията" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "„%s“ не може да се деинсталира" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "Стартирането на „%s“ е неуспешно" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "Съжаляваме, нещо се обърка" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Стартирането на „%s“ е невъзможно: липсва „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "Няма достатъчно свободно място на диска за действието" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "Инсталирането е невъзможно: типа на файла не се поддържа" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "Инсталирането е невъзможно: неуспешно удостоверяване" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "Инсталирането е невъзможно" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "Свързването с „%s“ е невъзможно" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "Рестартирайте програмата, за да може да използвате новите приставки" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "Изисква се захранване от електрическата мрежа" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "Твърде нисък заряд на батерия" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Източници на софтуер" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Настройки" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Клавишни комбинации" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "Относно „Програми“" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Търсене" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Основно меню" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Търсене на програми" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Разглеждане" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Инсталирани" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Обновления" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Назад" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Нула" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Данни от програмата" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Данни, от които програмата се нуждае, за да работи" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Потребителски данни" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Данните, които сте създали с програмата" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Кеширани данни" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Временно кеширани данни" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Самата програма" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Зависимости" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Споделени компоненти, необходими на програмата" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Неизвестно" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Кешираните данни може да се изчистят от _настройките на " +"програмата" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Необходимо пространство" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Инсталирано)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Инсталира се)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (изтегляне)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Премахва се)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Подробности" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Преглед" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Инсталирани на %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Обновленията са инсталирани" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Не са инсталирани обновления" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Остарели обновления" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Отново проверете за обновления на програмите" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Критично важните обновления са готови за инсталация" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Инсталиране на критично важни обновления възможно най-скоро" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Има критично важни обновления, налични за изтегляне" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Изтегляне на критично важни обновления възможно най-скоро" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Обновленията са готови за инсталиране" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Обновленията са готови и чакат одобрение" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Има налични за изтегляне обновления" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Обновленията може да се изтеглят" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u програма е обновена, необходимо е рестартиране" +msgstr[1] "%u програми са обновени, необходимо е рестартиране" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u програма е обновена" +msgstr[1] "%u програми са обновени" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "„%s“ е обновена." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Рестартирайте програмата." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "„%s“ и „%s“ са обновени." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "Трябва да рестартирате %u програма." +msgstr[1] "Трябва да рестартирате %u програми." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Включва „%s“, „%s“ и „%s“." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Системата стигна края на своя живот" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Надградете, за да продължите да получавате обновления" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Има нова версия на „%s“, която е налична за инсталиране" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Има налично надграждане" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Неуспешно обновяване" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Подготвените обновления не са инсталирани" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Показване на подробностите" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Надграждането на системата завърши" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Добре дошли в „%s %s“!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Обновлението е инсталирано" +msgstr[1] "Обновленията са инсталирани" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Важно обновление за операционната система беше инсталирано." +msgstr[1] "Важни обновления за операционната система бяха инсталирани." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Преглед" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Неуспешно обновяване" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Системата вече е напълно актуална." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Отменено обновяване." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Няма връзка с Интернет. Уверете се, че имате връзка с Интернет и опитайте " +"отново." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Имаше проблеми по сигурността при обновяването. Обърнете се към доставчика " +"си на софтуер за повече информация." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Няма достатъчно свободно място на диска. Освободете малко място и опитайте " +"отново." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Съжаляваме, но обновяването беше неуспешно. Почакайте да се появи друго " +"обновление и опитайте отново. Ако този проблем се повтори, свържете се с " +"доставчика си на софтуер." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Последна проверка: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Спиране" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Проверка за обновления" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s спря да получава критично важни обновявания" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Операционната ви система вече не получава критично важни обновления" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Може да има та̀кси" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Проверяването за обновления при използване на мобилна връзка може да " +"натовари сметката ви." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Проверяване _въпреки всичко" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Обновленията за надграждане са изтеглени" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Обновленията са готови за инсталиране" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Проверка за обновления" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Обновления" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Страница с обновленията" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Зареждане на обновленията" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Това може да отнеме известно време" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Всичко е обновено" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Да се ползват ли мобилни данни?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Проверяването за обновления при използване на мобилна връзка може да завиши " +"сметката ви" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Проверяване въпреки всичко" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Няма връзка" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Свържете се с Интернет, за да се провери за обновления" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Мрежови настройки" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Грешка" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Обновленията се управляват автоматично" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Обновленията са на пауза" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Автоматичните обновления са на пауза по следните причини:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Текущата мрежова връзка се таксува" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Текущата мрежова връзка забранява големи изтегляния" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Режимът за енергоспестяване е включен" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Режимът за игри е включен" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Обновленията са на пауза" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Мрежовата връзка се таксува - обновленията са на пауза" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Мрежовата връзка забранява големи изтегляния — обновленията са на пауза" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Режимът за енергоспестяване е включен — обновленията са на пауза" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Режимът за игри е включен — обновленията са на пауза" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Рестартиране и обновяване…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_Обновяване на всички" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Обновленията са изтеглени" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Обновленията са готови за инсталиране" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Интегриран фърмуер" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Изисква рестартиране" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Обновления на програми" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Фърмуер за устройство" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Изтегляне" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s е налична" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s е налична" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Информация за новата версия" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "изтеглени %s от общо %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "изтеглени %u %%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Голямо обновление с нови функционалности и по-завършен вид." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Отказване на надграждане" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Рестартиране и надграждане…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Направете резервни копия на данните и файловете си преди надграждането." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Подробности за грешката" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Копиране на подробностите" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Файлът „%s“ не може да бъде изтрит: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Папката „%s“ не може да бъде изтрита: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Добавяне, премахване или обновяване на софтуер на този компютър" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "обновления;обновяване;актуализация;надграждане;източници;хранилища;предпочитания;настройки;инсталиране;деинсталиране;програма;софтуер;приложение;магазин;updates;upgrade;sources;repositories;preferences;install;uninstall;program;software;app;store;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "„%s“ — готово" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "„%s“ може да се включи. Ще се задейства при следващото рестартиране." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Включване" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Обновления на системата" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Стандартни обновления на операционната система като поправки на грешки, " +"проблеми със сигурността или по-добра производителност." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Обновление на „%s“ с нови функционалности и корекции." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Услугата за обновяване на Endless OS не може да изтегли и приложи " +"обновлението." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Уеб програма" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Поддръжка на уеб приложения" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Изпълнение на популярни уеб приложения в браузър" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Надградете, за да получите най-новите функционалности и по-големи " +"производителност и стабилност." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Поддръжка на „Flatpak“" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "„Flatpak“ е система за пакетиране на програми за Линукс" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Системна папка: „%s“" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Подпапка в домашната: „%s“" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Системни папки с настройки" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Настройки на системата от „/etc“" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Папка за работен плот" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Подпапка в работния плот: „%s“" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Папка с документи" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Подпапка с документи: „%s“" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Папка с музика" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Подпапка с музика: „%s“" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Папка с изображения" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Подпапка с изображения: „%s“" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Папка за публично споделяне" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Подпапка за публично споделяне: „%s“" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Папка за видео" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Подпапка за видео: „%s“" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Папка с шаблони" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Подпапка с шаблони: „%s“" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Папка с временно складирани данни на потребителя" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Подпапка с временно складирани данни на потребителя: „%s“" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Папка за настройки на потребителя" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Подпапка за настройки на потребителя:„%s“" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Папка за данни на потребителя" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Подпапка за данни на потребителя: „%s“" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Папка за изпълнение на потребителя" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Подпапка за изпълнение на потребителя: „%s“" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Достъп до файловата система: %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Получаване на метаданни на „flatpak“ за „%s“…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Неуспешно уточняване на добавката „%s“: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Инсталиране само за потребител" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Инсталиране за цялата система" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Идентификатор на програмата" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Неуспешно добавяне на инсталирането на добавката „%s“: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Неуспешно добавяне на деинсталирането на добавката „%s“: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Отдалеченото хранилище „%s“ не позволява инсталирането на „%s“, най-вероятно " +"заради приложен филтър. Изчистете филтъра и пробвайте отново. Подробна " +"информация за грешката: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Зарядът на системата е прекалено нисък за извършване на обновяването" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Зарядът на системата е прекалено нисък за извършване на обновяването (%u %%, " +"а са необходими %u %%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Устройството е недостъпно или е извън обхват на безжичната мрежа" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Твърде нисък заряд на батерия на устройство" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"Зарядът на устройството е прекалено нисък (%u %%, а са необходими %u %%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Устройството изчаква за прилагането на обновлението" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Устройството изисква захранване от мрежата" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Устройството не може да се използва, когато капакът е затворен" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Обновление на устройство за %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Обновления на системата за %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Обновление на вграден контролер за %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Обновление на модул за управление (ME) за %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Обновление на модул за управление (ME) за корпорации за %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Обновление на модул за управление (ME) за потребители за %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Обновление на контролер за %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Обновление на контролер на Thunderbolt за %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Обновление на микрокод на ЦПУ за %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Обновление на настройки за %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Обновление на батерия за %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Обновление на камера за %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Обновление на доверен модул (TPM) за %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Обновление на сензорен панел за %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Обновление на мишка за %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Обновление на клавиатура за %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Обновление на контролер за съхранение на %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Обновление на мрежова карта на %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Обновление на видео драйверите за %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Обновление на контролера за управление (BMC) за %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Обновление на приемник по USB „%s“" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Обновление на устройство %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Обновление на устройство за флаш %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Обновление на SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Обновление на GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Обновление на докинг станция %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Обновление на докинг станция по USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Фърмуер" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Обновленията на фърмуера не може да се приложат: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Поддръжка за надграждането на фърмуера" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Осигурява поддръжка за надгражданията на фърмуера" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Инсталиране на неподписани програми?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Предстои да инсталирате програми, които не са подписани. Източникът им не " +"може да се провери, както и дали обновленията не са променени, преди да " +"стигнат до вас." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Изтегляне на неподписани програми?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Налични са неподписани обновления. Източникът им не може да се провери, " +"както и дали обновленията не са променени, преди да стигнат до вас." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Обновяване на неподписаните програми?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Налични са неподписани обновления. Източникът им не може да се провери, " +"както и дали обновленията не са променени, преди да стигнат до вас. " +"Обновяванията ще бъдат изключени, докато неподписаните не бъдат премахнати " +"или заменени с подписани." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Обновленията не може да се инсталират: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Пакети" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Неуспешно изчакване на край на транзакция преди изтегляне: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Обновленията не може да бъдат изтеглени: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Обновлението не може да започне: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Операционна система (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Поддръжка на „Snappy“" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Поддръжка на „Snap“" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "„Snap“ е универсален пакет за Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Системни" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Системен компонент" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "" +"Премахване на задачата за системното обновление „%s“, завърши неуспешно в " +"състояние %i" diff --git a/po/bn.po b/po/bn.po new file mode 100644 index 0000000..37a5b0e --- /dev/null +++ b/po/bn.po @@ -0,0 +1,3883 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Translators: +# Aditi Kabir , 2016 +# Roddy Shuler , 2016-2017 +# Shimon Sharmin , 2016 +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-06-12 13:14-0700\n" +"PO-Revision-Date: 2018-06-12 20:17+0000\n" +"Last-Translator: Roddy Shuler \n" +"Language-Team: Bengali (http://www.transifex.com/endless-os/gnome-software/language/bn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "GNOME সফটওয়্যার" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "GNOME এর জন্য এ্যাপ্লিকেশন ম্যানেজার" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "সফটওয়্যারের মাধ্যমে আপনি নতুন এ্যাপ্লিকেশন ও সিস্টেম সংযোজন খোঁজ ও সংস্থাপন করতে পারেন এবং বিদ্যমান সংস্থাপিত এ্যাপ্লিকেশন মুছে ফেলতে পারবেন।" + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "GNOME সফটওয়্যারে দরকারী বর্ণনাসহ এবং প্রতি এ্যাপ্লিকেশন অনুসারে একের অধিক স্ক্রিনশটসহ বৈশিষ্ট্যসম্পন্ন ও জনপ্রিয় এ্যাপ্লিকেশন প্রদর্শিত হয়। বিভাগের তালিকা অনুসারে অথবা অনুসন্ধান করে এ্যাপ্লিকেশন খুঁজে বের করা যাবে। একটি অফলাইন আপডেট ব্যবহার করে আপনার সিস্টেম আপডেট অনুমোদিত করা হয়।" + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "পরিচিতি প্যানেল" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "বিস্তারিত প্যানেল" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "সংস্থাপিত প্যানেল" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "হালনাগাদ প্যানেল" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "হালনাগাদের বিস্তারিত" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1007 +msgid "The GNOME Project" +msgstr "GNOME প্রজেক্ট" + +#: data/org.gnome.software.external-appstream.policy.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "উপযুক্ত প্রজেক্টসমূহের একটি তালিকা" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "এটি উপযুক্ত প্রজেক্টসমূহের একটি তালিকা যা আমাদের প্রদর্শন করতে হবে যেমন GNOME, KDE এবং XFCE ।" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates in GNOME Software" +msgstr "GNOME সফটওয়্যারের হালনাগাদগুলো নিয়ন্ত্রণ করা হবে কিনা" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel and not perform any " +"automatic updates actions." +msgstr "নিষ্ক্রিয় করা হলে, GNOME সফটওয়্যার এর হালনাগাদ সূচী লুকিয়ে রাখবে এবং স্বয়ংক্রিয়ভাবে হালনাগাদ করার কোন পদক্ষেপ নেবে না।" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Whether to automatically perform updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads and installs updates in " +"the background (except for some app types like packages, where it prompts " +"the user to install them when ready)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "মিটার সংযোগকালে স্বংক্রিয়ভাবে রিফ্রেশ হবে কিনা " + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "যদি সক্রিয় করা থাকে, নোম সফটওয়্যার পেছনে স্বয়ংক্রিয়ভাবে রিফ্রেশ হবে এমনকি মিটারকৃত সংযোগ ব্যবহারকালেও (অবশেষে কিছু মেটাডাটা ডাউনলোড করে, হালনাগাদ করণ দেখে ইত্যাদি, যা ব্যবহারকারীকেই খরচ বহন করতে হবে)। " + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:29 +msgid "Show star ratings next to applications" +msgstr "এ্যাপ্লিকেশনের পাশে নক্ষত্র দিয়ে রেটিং প্রদর্শন করুন" + +#: data/org.gnome.software.gschema.xml:33 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:37 +msgid "Non-free applications show a warning dialog before install" +msgstr "সংস্থাপনের আগে নন-ফ্রি এ্যাপ্লিকেশনসমূহে একটি সতর্কতামূলক বাণী দেখানো হয়" + +#: data/org.gnome.software.gschema.xml:38 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This" +" controls if that dialog is suppressed." +msgstr "যখন নন-ফ্রি এ্যাপ্লিকেশনসমূহ সংস্থাপন করা হয় তখন একটি সতর্কতামূলক বাণী দেখানো যায়। সেই বাণীটি দেখানো হবে কি হবে না এটি তা নিয়ন্ত্রণ করে।" + +#: data/org.gnome.software.gschema.xml:42 +msgid "A list of popular applications" +msgstr "জনপ্রিয় এ্যাপ্লিকেশনসমূহের একটি তালিকা" + +#: data/org.gnome.software.gschema.xml:43 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "সিস্টেম কর্তৃক নির্ধারিতগুলো বাতিল করে ব্যবহারযোগ্য এ্যাপ্লিকেশনসমূহের একটি তালিকা।" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The list of extra sources that have been previously enabled" +msgstr "অতিরিক্ত উৎসসমূহের একটি তালিকা যা আগে সক্রিয় করা হয়েছিল।" + +#: data/org.gnome.software.gschema.xml:48 +msgid "" +"The list of sources that have been previously enabled when installing third-" +"party applications." +msgstr "তৃতীয় পক্ষ এ্যাপ্লিকেশন সংস্থাপনের সময় আগে থেকে সক্রিয় করা উৎসের একটি তালিকা।" + +#: data/org.gnome.software.gschema.xml:52 +msgid "The last update check timestamp" +msgstr "শেষবার আপডেট পরীক্ষা করার সময়" + +#: data/org.gnome.software.gschema.xml:56 +msgid "The last upgrade notification timestamp" +msgstr "সর্বশেষ হালনাগাদ বিজ্ঞপ্তির সময়" + +#: data/org.gnome.software.gschema.xml:60 +msgid "The timestamp of the first security update, cleared after update" +msgstr "আপডেট হবার পর হওয়া প্রথম নিরাপত্তা আপডেটের সময়" + +#: data/org.gnome.software.gschema.xml:64 +msgid "The last update timestamp" +msgstr "শেষবার আপডেট হবার সময়" + +#: data/org.gnome.software.gschema.xml:68 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:69 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0" +" means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:78 +msgid "The server to use for application reviews" +msgstr "এ্যাপ্লিকেশন রিভিউ করার জন্য সার্ভারের ব্যবহার" + +#: data/org.gnome.software.gschema.xml:82 +msgid "The minimum karma score for reviews" +msgstr "রিভিউয়ের জন্য সর্বনিম্ন কার্মা স্কোর" + +#: data/org.gnome.software.gschema.xml:83 +msgid "Reviews with karma less than this number will not be shown." +msgstr "এই সংখ্যার চেয়ে কম কার্মাসহ রিভিউ প্রদর্শিত হবে না" + +#: data/org.gnome.software.gschema.xml:87 +msgid "A list of official sources that should not be considered 3rd party" +msgstr "আনুষ্ঠানিক উৎসের একটি তালিকা যাদের তৃতীয় পক্ষ বিবেচনা করা হবে না" + +#: data/org.gnome.software.gschema.xml:91 +msgid "A list of official sources that should be considered free software" +msgstr "আনুষ্ঠানিক উৎসের একটি তালিকা যাদের মুক্ত সফটওয়্যার বিবেচনা করা হবে" + +#: data/org.gnome.software.gschema.xml:95 +msgid "" +"The licence URL to use when an application should be considered free " +"software" +msgstr "যখন একটি এ্যাপ্লিকেশনকে মুক্ত সফটওয়্যার বিবেচনা করা হবে তখন যে লাইসেন্স URL ব্যবহার করা হবে" + +#: data/org.gnome.software.gschema.xml:99 +msgid "" +"Install bundled applications for all users on the system where possible" +msgstr "সিস্টেমে যেখানে সম্ভব সেখানে সকল ব্যবহারকারীর জন্য বান্ডিল এ্যাপ্লিকেশন সংস্থাপন করুন" + +#: data/org.gnome.software.gschema.xml:103 +msgid "Show the folder management UI" +msgstr "ম্যানেজমেন্ট UI ফোল্ডার প্রদর্শন করুন" + +#: data/org.gnome.software.gschema.xml:107 +msgid "Allow access to the Software Sources dialog" +msgstr "সফটওয়্যার উৎস বাণীতে প্রবেশাধিকার দিন" + +#: data/org.gnome.software.gschema.xml:111 +msgid "Offer upgrades for pre-releases" +msgstr "প্রাক-মুক্তির জন্য আপগ্রেড প্রস্তাব করুন" + +#: data/org.gnome.software.gschema.xml:115 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "একটি এ্যাপ অ-বিনামূল্য সেটা ব্যবহারকারীকে বুঝাতে কিছু UI উপাদান প্রদর্শন করুন" + +#: data/org.gnome.software.gschema.xml:119 +msgid "Show the prompt to install nonfree software sources" +msgstr "অ-বিনামূল্যের সফটওয়্যার উৎসগুলো সংস্থাপন করার বিজ্ঞপ্তি প্রদর্শন" + +#: data/org.gnome.software.gschema.xml:123 +msgid "Show non-free software in search results" +msgstr "অনুসন্ধান ফলাফলে অ-বিনামূল্যের সফটওয়্যার প্রদর্শন" + +#: data/org.gnome.software.gschema.xml:127 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:131 +msgid "The URI that explains nonfree and proprietary software" +msgstr "যে URI অ-বিনামূল্য ও স্বত্বসহ সফটওয়্যার ব্যাখ্যা করে" + +#: data/org.gnome.software.gschema.xml:135 +msgid "A list of non-free sources that can be optionally enabled" +msgstr "অ-বিনামূল্য উৎসগুলোর একটি তালিকা যা ঐচ্ছিকভাবে সক্রিয় করা যায়" + +#: data/org.gnome.software.gschema.xml:139 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "অ্যাপসস্ট্রিম ফাইলে দেয়া ইউআরএল তালিকা অ্যাপস-ইনফো ফোল্ডারে ডাউনলোড হবে " + +#: data/org.gnome.software.gschema.xml:143 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "Sorts the apps shown in the overview in alphabetical order" +msgstr "" + +#: data/org.gnome.software.gschema.xml:151 +msgid "" +"Overrides the name of the \"Featured\" entry in the side-filter (category " +"list)" +msgstr "" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "সফটওয়্যার সংস্থাপন" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "সিস্টেমে নির্বাচিত সফটওয়্যার সংস্থাপন করুন" + +#. Translators: Do NOT translate or transliterate this text (this is an icon +#. file name)! +#: src/gnome-software-local-file.desktop.in:10 +msgid "system-software-install" +msgstr "" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "সব নির্বাচিত করুন" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "কোনোটাই নির্বাচিত করবেন না" + +#: src/gnome-software.ui:24 +msgid "Software" +msgstr "" + +#: src/gnome-software.ui:43 src/gs-sources-dialog.ui:23 +#: src/gs-update-dialog.ui:21 +msgid "Go back" +msgstr "পেছনে যান" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:77 +msgid "_All" +msgstr "_সকল" + +#. Translators: A label for a button to show only software which is already +#. installed. +#: src/gnome-software.ui:104 +msgid "_Installed" +msgstr "_সংস্থাপিত" + +#. Translators: A label for a button to show only updates which are available +#. to install. +#: src/gnome-software.ui:155 +msgid "_Updates" +msgstr "_আপডেটসমূহ" + +#: src/gnome-software.ui:251 +msgid "Search" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:350 src/gs-sources-dialog.ui:6 +#: src/gs-sources-dialog.ui:46 +msgid "Software Sources" +msgstr "সফটওয়্যার উৎস" + +#. button in the info bar +#: src/gnome-software.ui:361 +msgid "Examine Disk" +msgstr "" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:372 src/gs-updates-page.c:1478 +msgid "Network Settings" +msgstr "নেটওয়ার্ক সেটিংস" + +#. button in the info bar +#: src/gnome-software.ui:383 +msgid "Restart Now" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:394 +msgid "More Information" +msgstr "" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:430 +msgid "Pending" +msgstr "অমীমাংসিত" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.ui:210 src/gs-app-tile.ui:51 +#: src/gs-background-tile.ui:67 src/gs-feature-tile.c:88 +#: src/gs-popular-tile.c:70 +msgid "Installed" +msgstr "সংস্থাপিত" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:218 src/gs-details-page.c:466 +msgid "Installing" +msgstr "সংস্থাপন হচ্ছে" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#: src/gs-app-addon-row.c:109 src/gs-app-row.c:224 +msgid "Removing" +msgstr "মুছে ফেলা হচ্ছে" + +#: src/gs-app-folder-dialog.c:310 +msgid "Folder Name" +msgstr "ফোল্ডারের নাম" + +#: src/gs-app-folder-dialog.c:321 src/gs-app-folder-dialog.ui:16 +#: src/gs-details-page.ui:342 src/gs-editor.c:623 src/gs-editor.c:655 +#: src/gs-installed-page.c:612 src/gs-removal-dialog.ui:33 +#: src/gs-review-dialog.ui:23 src/gs-upgrade-banner.ui:131 +msgid "_Cancel" +msgstr "_বাতিল" + +#: src/gs-app-folder-dialog.c:326 src/gs-app-folder-dialog.ui:24 +msgid "_Add" +msgstr "_সংযুক্তি" + +#: src/gs-app-folder-dialog.ui:5 +msgid "Add to Application Folder" +msgstr "এ্যাপ্লিকেশন ফোল্ডারে সংযুক্ত করুন" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:128 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "শুরুর রূপ: হয় 'আপডেট', 'আপডেট হয়েছে', 'সংস্থাপিত' অথবা 'পরিচিতি'" + +#: src/gs-application.c:128 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:130 +msgid "Search for applications" +msgstr "এ্যাপ্লিকেশন অনুসন্ধান" + +#: src/gs-application.c:130 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:132 +msgid "Show application details (using application ID)" +msgstr "এ্যাপ্লিকেশনের বিশদ প্রদর্শন করুন (এ্যাপ্লিকেশন ID ব্যবহার করে)" + +#: src/gs-application.c:132 src/gs-application.c:136 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:134 +msgid "Show application details (using package name)" +msgstr "এ্যাপ্লিকেশনের বিশদ প্রদর্শন করুন (প্যাকেজের নাম ব্যবহার করে)" + +#: src/gs-application.c:134 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:136 +msgid "Install the application (using application ID)" +msgstr "" + +#: src/gs-application.c:138 +msgid "Open a local package file" +msgstr "একটি স্থানীয় প্যাকেজ ফাইল খুলুন" + +#: src/gs-application.c:138 +msgid "FILENAME" +msgstr "FILENAME" + +#: src/gs-application.c:140 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:143 +msgid "Show verbose debugging information" +msgstr "শব্দবহুল ডিবাগ তথ্য প্রদর্শন করুন" + +#: src/gs-application.c:145 +msgid "Show profiling information for the service" +msgstr "এই পরিসেবার জন্য প্রোফাইলিং তথ্য প্রদর্শন করুন" + +#: src/gs-application.c:147 +msgid "Quit the running instance" +msgstr "চলমান কাজটি বন্ধ করুন" + +#: src/gs-application.c:149 +msgid "Prefer local file sources to AppStream" +msgstr "AppStream থেকে স্থানীয় ফাইলের উৎস পছন্দ করবেন" + +#: src/gs-application.c:151 +msgid "Show version number" +msgstr "ভার্সন সংখ্যা প্রদর্শন" + +#: src/gs-application.c:353 +msgid "translator-credits" +msgstr "অনুবাদক-কৃতিত্ব" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:360 +#, c-format +msgid "About %s" +msgstr "" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:364 +msgid "A nice way to manage the software on your system." +msgstr "আপনার সিস্টেমে সফটওয়্যারটি পরিচালনা করার একটি ভাল উপায়।" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:171 +msgid "Visit website" +msgstr "ওয়েবসাইটে ঘুরে আসুন" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:176 +msgid "Install…" +msgstr "সংস্থাপন..." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:183 +msgid "Cancel" +msgstr "বাতিল" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:192 src/gs-common.c:279 src/gs-page.c:544 +msgid "Install" +msgstr "সংস্থাপন" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:199 +msgid "Update" +msgstr "হালনাগাদ " + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: src/gs-app-row.c:203 src/gs-app-row.c:212 src/gs-page.c:700 +msgid "Uninstall" +msgstr "আনইনস্টল " + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:330 +msgid "Device cannot be used during update." +msgstr "আপডেটের সময় ডিভাইস ব্যবহার করা যাবে না।" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:340 src/gs-details-page.ui:991 +msgid "Source" +msgstr "উৎস" + +#. TRANSLATORS: this is when the service name is not known +#: src/gs-auth-dialog.c:68 +msgid "To continue you need to sign in." +msgstr "চালিয়ে যেতে হলে আপনাকে প্রবেশ করতে হবে।" + +#. TRANSLATORS: the %s is a service name, e.g. "Ubuntu One" +#: src/gs-auth-dialog.c:72 +#, c-format +msgid "To continue you need to sign in to %s." +msgstr "চালিয়ে যেতে হলে আপনাকে প্রবেশ %s করতে হবে।" + +#: src/gs-auth-dialog.ui:70 +msgid "Email address" +msgstr "ইমেইল ঠিকানা" + +#: src/gs-auth-dialog.ui:94 +msgid "I have an account already" +msgstr "আমার ইতিমধ্যেই একটি একাউন্ট আছে" + +#: src/gs-auth-dialog.ui:113 +msgid "Password" +msgstr "পাসওয়ার্ড" + +#: src/gs-auth-dialog.ui:137 +msgid "I want to register for an account now" +msgstr "আমি এখন একটি একাউন্ট নিবন্ধিত করতে আগ্রহী" + +#: src/gs-auth-dialog.ui:154 +msgid "I have forgotten my password" +msgstr "আমি আমার পাসওয়ার্ড ভুলে গেছি" + +#: src/gs-auth-dialog.ui:181 +msgid "Sign in automatically next time" +msgstr "পরবর্তীবার স্বয়ংক্রিয়ভাবে প্রবেশ করুন" + +#: src/gs-auth-dialog.ui:210 +msgid "Enter your one-time pin for two-factor authentication." +msgstr "দুই-ধাপ বিশিষ্ট যাচাইকরণের জন্য আপনার একবার-ব্যবহারযোগ্য পিন নাম্বার প্রবেশ করান" + +#: src/gs-auth-dialog.ui:223 +msgid "PIN" +msgstr "PIN" + +#: src/gs-auth-dialog.ui:325 +msgid "Authenticate" +msgstr "" + +#: src/gs-auth-dialog.ui:337 +msgid "Continue" +msgstr "চালিয়ে যান" + +#. TRANSLATORS: This is the name and state of an app for the ATK object +#: src/gs-background-tile.c:159 src/gs-summary-tile.c:75 +#, c-format +msgid "%s (Installed)" +msgstr "%s (সংস্থাপিত)" + +#: src/gs-background-tile.ui:81 +msgid "Scheduled update" +msgstr "" + +#: src/gs-background-tile.ui:95 +msgid "Available in a USB drive" +msgstr "" + +#: src/gs-background-tile.ui:109 +msgid "Requires download" +msgstr "" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:193 +msgid "Other" +msgstr "অন্যকিছু" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:198 +msgid "All" +msgstr "সকল" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:202 src/gs-shell.c:2325 +msgid "Featured" +msgstr "বৈশিষ্ট্যসম্পন্ন" + +#: src/gs-category-page.ui:81 +msgid "Extension Settings" +msgstr "সংযোজন সেটিংস" + +#: src/gs-category-page.ui:110 +msgid "" +"Extensions are used at your own risk. If you have any system problems, it is" +" recommended to disable them." +msgstr "আপনার নিজ দায়িত্বে সংযোজনসমূহ ব্যবহার করবেন। এদের দ্বারা আপনার যদি কোন সিস্টেমজনিত সমস্যা হয়, তাহলে তাদের অকার্যকরী করে ফেলাকেই আমরা সুপারিশ করি।" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:205 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "" + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:268 +msgid "Choose an application:" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:135 +msgid "OS updates are now installed" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:138 +msgid "Recently installed updates are available to review" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:142 +#, c-format +msgid "%s is now installed" +msgstr "%s এখন সংস্থাপিত হয়েছে" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:145 +msgid "Application is ready to be used." +msgstr "" + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:151 +msgid "Launch" +msgstr "আরম্ভ" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "তৃতীয়-পক্ষ সফটওয়্যার সংস্থাপন করুন?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Third-Party Software Source?" +msgstr "তৃতীয়-পক্ষ সফটওয়্যার উৎস সচল করুন?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#: src/gs-common.c:232 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by " +"“%s”." +msgstr "%s মুক্ত ও উন্মুক্ত উৎস সফটওয়্যার নয়, এবং “%s” কর্তৃক সরবরাহকৃত।" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#: src/gs-common.c:242 +#, c-format +msgid "%s is provided by “%s”." +msgstr "“%s” দ্বারা সরবরাহকৃত %s " + +#. TRANSLATORS: a software source is a repo +#: src/gs-common.c:252 +msgid "This software source must be enabled to continue installation." +msgstr "সংস্থাপন চালিয়ে যেতে সফটওয়্যার উৎস সচল করতে হবে।" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:262 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "%s সংস্থাপন অথবা ব্যবহার কিছু দেশে বেআইনী হতে পারে।" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:268 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "এই কোডেক সংস্থাপন অথবা ব্যবহার কিছু দেশে বেআইনী হতে পারে।" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t Warn Again" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and Install" +msgstr "সচল করুন এবং সংস্থাপন করুন" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:429 +msgid "Detailed errors from the package manager follow:" +msgstr "প্যাকেজ পরিচালনায় নিম্নো্ক্ত বিশদ ভুলসমূহ:" + +#: src/gs-common.c:448 src/gs-details-page.ui:579 +msgid "Details" +msgstr "বিশদ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:75 +msgid "No cartoon violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:78 +msgid "Cartoon characters in unsafe situations" +msgstr "অনিরাপদ অবস্থায় কার্টুন চরিত্র" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "Cartoon characters in aggressive conflict" +msgstr "আক্রমণাত্মক মতবিরোধে কার্টুন চরিত্র" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:84 +msgid "Graphic violence involving cartoon characters" +msgstr "কার্টুন চরিত্র নিয়ে স্পষ্ট দ্বন্দ্ব" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "No fantasy violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:90 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "অনিরাপদ অবস্থানে থাকা চরিত্রগুলোকে সহজেই বাস্তব থেকে আলাদা করা যায়" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:93 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "আক্রমণাত্মক মতবিরোধে থাকা চরিত্রগুলোকে সহজেই বাস্তব থেকে আলাদা করা যায়" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Graphic violence easily distinguishable from reality" +msgstr "স্পষ্ট দ্বন্দ্বকে সহজেই বাস্তব থেকে আলাদা করা যায়" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:99 +msgid "No realistic violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:102 +msgid "Mildly realistic characters in unsafe situations" +msgstr "অনিরাপদ পরিস্থিতিতে কিছুটা বাস্তব চরিত্রসমূহ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "আক্রমণাত্মক দ্বন্দ্বে বাস্তব চরিত্রসমূহের রূপায়ণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:108 +msgid "Graphic violence involving realistic characters" +msgstr "বাস্তব চরিত্র নিয়ে স্পষ্ট দ্বন্দ্ব" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:111 +msgid "No bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "Unrealistic bloodshed" +msgstr "অবাস্তবিক রক্তপাত" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:117 +msgid "Realistic bloodshed" +msgstr "বাস্তবিক রক্তপাত" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:120 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "রক্তপাতের চিত্রায়ণ এবং শারিরীক অঙ্গপ্রত্যঙ্গের বিকৃতি" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:123 +msgid "No sexual violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Rape or other violent sexual behavior" +msgstr "ধর্ষণ অথবা অন্য যৌন আচরণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:129 +msgid "No references to alcohol" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "References to alcoholic beverages" +msgstr "মদ্যপ পানীয়ের প্রসঙ্গ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:135 +msgid "Use of alcoholic beverages" +msgstr "মদ্যপ পানীয়ের ব্যবহার" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:138 +msgid "No references to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:141 +msgid "References to illicit drugs" +msgstr "অবৈধ মাদকের প্রসঙ্গ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Use of illicit drugs" +msgstr "অবৈধ মাদকের ব্যবহার" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:147 +msgid "References to tobacco products" +msgstr "তামাকজাতীয় দ্রব্যের প্রসঙ্গ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:150 +msgid "Use of tobacco products" +msgstr "তামাকজাতীয় দ্রব্যের ব্যবহার" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:153 +msgid "No nudity of any sort" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Brief artistic nudity" +msgstr "সংক্ষিপ্ত শৈল্পিক নগ্নতা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:159 +msgid "Prolonged nudity" +msgstr "সম্প্রসারিত নগ্নতা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:162 +msgid "No references or depictions of sexual nature" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Provocative references or depictions" +msgstr "উত্তেজক প্রসঙ্গ অথবা চিত্রায়ণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:168 +msgid "Sexual references or depictions" +msgstr "যৌন প্রসঙ্গ অথবা চিত্রায়ণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:171 +msgid "Graphic sexual behavior" +msgstr "স্পষ্ট যৌন আচরণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No profanity of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:177 +msgid "Mild or infrequent use of profanity" +msgstr "ধর্মদ্রোহিতার হালকা অথবা অনিয়মিত ব্যবহার" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Moderate use of profanity" +msgstr "ধর্মদ্রোহিতার মাঝারি ব্যবহার" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:183 +msgid "Strong or frequent use of profanity" +msgstr "ধর্মদ্রোহিতার শক্তিশালী অথবা নিয়মিত ব্যবহার" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:186 +msgid "No inappropriate humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Slapstick humor" +msgstr "অস্বস্তিকর রসিকতা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:192 +msgid "Vulgar or bathroom humor" +msgstr "অমার্জিত অথবা বাথরুম রসিকতা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:195 +msgid "Mature or sexual humor" +msgstr "বয়স্ক বা যৌন রসিকতা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "No discriminatory language of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:201 +msgid "Negativity towards a specific group of people" +msgstr "কোন নির্দিষ্ট দলের মানুষদের প্রতি নেতিবাচক আচরণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:204 +msgid "Discrimination designed to cause emotional harm" +msgstr "মানসিক ক্ষতিসাধন করার জন্য সাজানো বৈষম্যমূলক আচরণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "লিঙ্গ, যৌনতা, বর্ণ অথবা ধর্ম নিয়ে সুস্পষ্ট বৈষম্যমূলক আচরণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:210 +msgid "No advertising of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Product placement" +msgstr "দ্রব্যের স্থান নির্ধারণ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:216 +msgid "Explicit references to specific brands or trademarked products" +msgstr "নির্দিষ্ট ব্র্যান্ড বা ট্রেডমার্কের কোন পণ্যের সুস্পষ্ট প্রসঙ্গ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:219 +msgid "Players are encouraged to purchase specific real-world items" +msgstr "খেলোয়াড়দেরকে নির্দিষ্ট বাস্তব-দুনিয়ার পণ্য কিনতে উৎসাহিত করা হয়" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:222 +msgid "No gambling of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:225 +msgid "Gambling on random events using tokens or credits" +msgstr "সাধারণ কোন স্থানে টোকেন বা ধারের মাধ্যমে জুয়া" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "Gambling using “play” money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:231 +msgid "Gambling using real money" +msgstr "আসল টাকা ব্যবহারের মাধ্যমে জুয়া" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "No ability to spend money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:237 +msgid "Ability to spend real money in-game" +msgstr "খেলায় আসল টাকা ব্যবহারের ক্ষমতা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:240 +msgid "No way to chat with other players" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:243 +msgid "Player-to-player game interactions without chat functionality" +msgstr "খেলার মধ্যে আড্ডার কার্যকারিতাসহ খেলোয়াড়ের সাথে খেলোয়াড়ের মিথষ্ক্রিয়া" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:246 +msgid "Player-to-player preset interactions without chat functionality" +msgstr "খেলার মধ্যে আড্ডার কার্যকারিতা ছাড়া খেলোয়াড়ের সাথে খেলোয়াড়ের পূর্ব নির্ধারিত মিথষ্ক্রিয়া" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:249 +msgid "Uncontrolled chat functionality between players" +msgstr "খেলোয়াড়দের মধ্যে অনিয়ন্ত্রিত আড্ডার কার্যকারিতা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:252 +msgid "No way to talk with other players" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:255 +msgid "Uncontrolled audio or video chat functionality between players" +msgstr "খেলোয়াড়দের মধ্যে অনিয়ন্ত্রিত অডিও অথবা ভিডিও আড্ডার কার্যকারিতা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:258 +msgid "No sharing of social network usernames or email addresses" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "Sharing social network usernames or email addresses" +msgstr "সামাজিক নেটওয়ার্কের ব্যবহারকারী নাম অথবা ইমেইল ঠিকানা ভাগাভাগি করা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:264 +msgid "No sharing of user information with 3rd parties" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:267 +msgid "Sharing user information with 3rd parties" +msgstr "3rd পক্ষের সাথে ব্যবহারকারীর তথ্য ভাগাভাগি করা" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "No sharing of physical location to other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:273 +msgid "Sharing physical location to other users" +msgstr "অন্য খেলোয়াড়দের সাথে শারিরীক অবস্থান ভাগাভাগি করা" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is +#. unknown +#: src/gs-dbus-helper.c:294 +msgid "An application" +msgstr "একটি এ্যাপ্লিকেশন" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. MIME types. +#: src/gs-dbus-helper.c:300 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s অতিরিক্ত ফাইল ফরম্যাটে সমর্থনের জন্য অনুরোধ করছে।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:302 +msgid "Additional MIME Types Required" +msgstr "অতিরিক্ত MIME ধরণ প্রয়োজন" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. fonts. +#: src/gs-dbus-helper.c:306 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s অতিরিক্ত ফন্টের জন্য অনুরোধ করছে।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:308 +msgid "Additional Fonts Required" +msgstr "অতিরিক্ত ফন্ট প্রয়োজন" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. codecs. +#: src/gs-dbus-helper.c:312 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s অতিরিক্ত মাল্টিমিডিয়া কোডেকের জন্য অনুরোধ করছে।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:314 +msgid "Additional Multimedia Codecs Required" +msgstr "অতিরিক্ত মাল্টিমিডিয়া কোডেক প্রয়োজন" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. printer drivers. +#: src/gs-dbus-helper.c:318 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s অতিরিক্ত প্রিন্টার ড্রাইভার অনুরোধ করছে।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:320 +msgid "Additional Printer Drivers Required" +msgstr "অতিরিক্ত প্রিন্টার ড্রাইভার প্রয়োজন" + +#. TRANSLATORS: this is a notification displayed when an app wants to install +#. additional packages. +#: src/gs-dbus-helper.c:324 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s অতিরিক্ত প্যাকেজ অনুরোধ করছে।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:326 +msgid "Additional Packages Required" +msgstr "অতিরিক্ত প্যাকেজ প্রয়োজন" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:335 +msgid "Find in Software" +msgstr "সফটওয়্যারে অনুসন্ধান করুন" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#: src/gs-details-page.c:296 src/gs-details-page.c:330 +#: src/gs-details-page.ui:237 +msgid "_Install" +msgstr "_সংস্থাপন" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed but needs to be downloaded first +#: src/gs-details-page.c:300 src/gs-upgrade-banner.ui:116 +msgid "_Download" +msgstr "_ডাউনলোড" + +#. TRANSLATORS: button text in the header when an application +#. * can be live-updated +#: src/gs-details-page.c:334 +msgid "_Update" +msgstr "_আপডেট" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software sources or the like +#: src/gs-details-page.c:346 +msgid "_Install…" +msgstr "_সংস্থাপন..." + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:393 src/gs-details-page.ui:536 +msgid "_Uninstall" +msgstr "_আনইনস্টল " + +#: src/gs-details-page.c:461 +msgid "Removing…" +msgstr "সরানো হচ্ছে..." + +#: src/gs-details-page.c:480 +msgid "Pending installation…" +msgstr "" + +#: src/gs-details-page.c:487 +msgid "Pending update…" +msgstr "" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:844 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "সক্রিয় ইন্টারনেট সংযোগ থাকলেই শুধুমাত্র এই এ্যাপ্লিকেশনটি ব্যবহার করা যাবে।" + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:988 +msgctxt "version" +msgid "Unknown" +msgstr "অপরিচিত" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:1024 +msgctxt "updated" +msgid "Never" +msgstr "" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1072 +msgctxt "origin" +msgid "Unknown" +msgstr "অপরিচিত" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1481 +msgid "You need internet access to write a review" +msgstr "" + +#: src/gs-details-page.c:1610 +#, c-format +msgid "Unable to find “%s”" +msgstr "" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2217 +msgid "Public domain" +msgstr "সর্বজনীন ডোমেইন" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2233 src/gs-details-page.ui:1386 +msgid "Free Software" +msgstr "উন্মুক্ত সফটওয়্যার" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2290 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "ব্যবহারকারীরা নিম্নোক্ত লাইসেন্সসমূহ দ্বারা আবদ্ধ:" +msgstr[1] "ব্যবহারকারীরা নিম্নোক্ত লাইসেন্সসমূহ দ্বারা আবদ্ধ:" + +#: src/gs-details-page.c:2306 src/gs-details-page.ui:1495 +msgid "More information" +msgstr "আরো তথ্য" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "বিশদ পাতা" + +#. Translators: A label for a button to add a shortcut to the selected +#. application. +#: src/gs-details-page.ui:209 +msgid "_Add to Desktop" +msgstr "_ডেস্কটপে যোগ করুন " + +#. Translators: A label for a button to remove a shortcut to the selected +#. application. +#: src/gs-details-page.ui:226 +msgid "_Remove from Desktop" +msgstr "_ডেস্কটপ থেকে সরান " + +#. Translators: A label for a button to execute the selected application. +#: src/gs-details-page.ui:259 +msgid "_Launch" +msgstr "_আরম্ভ" + +#: src/gs-details-page.ui:439 +msgid "No screenshot provided" +msgstr "কোন স্ক্রিনশট দেয়া হয়নি" + +#: src/gs-details-page.ui:475 +msgid "Software Source Included" +msgstr "সফটওয়্যার উৎস সংযোজিত" + +#: src/gs-details-page.ui:476 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "এই এ্যাপ্লিকেশনে একটি সফটওয়্যার উৎস সংযোজিত আছে যাতে আপডেট, ও সেইসাথে অন্যান্য সফটওয়্যারে প্রবেশাধিকার সরবরাহ করা হয়েছে।" + +#: src/gs-details-page.ui:489 +msgid "No Software Source Included" +msgstr "কোন সফটওয়্যার উৎস সংযোজিত হয়নি" + +#: src/gs-details-page.ui:490 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "এই এ্যাপ্লিকেশনে কোন সফটওয়্যার উৎস উল্লেখ করা হয়নি। কোন নতুন ভার্সন দ্বারা এটি আপডেট হবে না।" + +#: src/gs-details-page.ui:504 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "আপনার বিতরণকারী দ্বারা এই সফটওয়্যারটি ইতিমধ্যেই সরবরাহ করা হয়েছে এবং পরিবর্তন করা ঠিক হবে না।" + +#. Translators: a repository file used for installing software has been +#. discovered. +#: src/gs-details-page.ui:517 +msgid "Software Source Identified" +msgstr "সফটওয়্যার উৎস চিহ্নিত" + +#: src/gs-details-page.ui:518 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "এই সফটওয়্যার উৎস সংযুক্ত করলে এটি আপনাকে অন্যান্য সফটওয়্যার ও আপগ্রেডে প্রবেশাধিকার দেবে।" + +#: src/gs-details-page.ui:519 +msgid "Only use software sources that you trust." +msgstr "শুধুমাত্র যে সকল সফটওয়্যার উৎসে আস্থা আছে তাদের ব্যবহার করুন।" + +#: src/gs-details-page.ui:551 +msgid "_Donate" +msgstr "" + +#: src/gs-details-page.ui:592 +msgid "Developer _Website" +msgstr "ওয়েবসাইট_উন্নয়নকারী " + +#: src/gs-details-page.ui:704 +msgid "Localized in your Language" +msgstr "আপনার স্থানীয় ভাষায় পরিবর্তন করুন" + +#: src/gs-details-page.ui:716 +msgid "Documentation" +msgstr "নথিপত্র" + +#: src/gs-details-page.ui:728 +msgid "Release Activity" +msgstr "কর্মকান্ড খালাস" + +#: src/gs-details-page.ui:740 +msgid "System Integration" +msgstr "সিস্টেম ইন্টেগ্রেশন" + +#: src/gs-details-page.ui:752 +msgid "Sandboxed" +msgstr "স্যান্ডবক্স" + +#: src/gs-details-page.ui:777 src/gs-sources-dialog.ui:365 +msgid "Version" +msgstr "ভার্সন" + +#: src/gs-details-page.ui:814 +msgid "Age Rating" +msgstr "" + +#: src/gs-details-page.ui:852 +msgid "Updated" +msgstr "আপডেট হয়েছে" + +#: src/gs-details-page.ui:887 +msgid "Category" +msgstr "বিভাগ" + +#: src/gs-details-page.ui:925 +msgid "Installed Size" +msgstr "সংস্থাপিত আকৃতি" + +#: src/gs-details-page.ui:958 +msgid "Download Size" +msgstr "ডাউনলোড আকৃতি" + +#: src/gs-details-page.ui:1024 +msgid "Developer" +msgstr "ডেভেলপার" + +#: src/gs-details-page.ui:1058 +msgid "License" +msgstr "লাইসেন্স" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1078 +msgid "Free" +msgstr "বিনামূল্য" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1095 +msgid "Proprietary" +msgstr "মালিকানা" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.ui:1112 src/gs-review-row.c:71 +msgid "Unknown" +msgstr "অপরিচিত" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#: src/gs-details-page.ui:1166 src/gs-installed-page.c:490 +msgid "Add-ons" +msgstr "এ্যাড-অন" + +#: src/gs-details-page.ui:1179 +msgid "Selected add-ons will be installed with the application." +msgstr "নির্বাচিত এ্যাড-অনসমূহ এ্যাপ্লিকেশনের সাথে সংস্থাপিত হবে।" + +#. Translators: Header of the section with other users' opinions about the +#. app. +#: src/gs-details-page.ui:1222 +msgid "Reviews" +msgstr "রিভিউ" + +#. Translators: Button opening a dialog where the users can write and publish +#. their opinions about the apps. +#: src/gs-details-page.ui:1238 +msgid "_Write a Review" +msgstr "_একটি রিভিউ লিখুন" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1260 +msgid "_Show More" +msgstr "_আরো প্রদর্শন করুন" + +#: src/gs-details-page.ui:1403 +msgid "" +"This means that the software can be freely run, copied, distributed, studied" +" and modified." +msgstr "এর অর্থ হচ্ছে এই সফটওয়্যারটি অবাধে চালানো, কপি করা, বিতরণ করা, গবেষণা করা এবং পরিবর্তন করা যাবে।" + +#: src/gs-details-page.ui:1462 +msgid "Proprietary Software" +msgstr "স্বত্বাধিকৃত সফটওয়্যার" + +#: src/gs-details-page.ui:1479 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "এর অর্থ হচ্ছে এই সফটওয়্যারটি একজন ব্যক্তি বা একটি সংস্থা দ্বারা স্বত্বাধিকৃত। এর ব্যবহারের উপর প্রায়ই সীমাবদ্ধতা থাকবে এবং এর সোর্স কোডসমূহে সাধারণত প্রবেশাধিকার থাকবে না।" + +#: src/gs-details-page.ui:1524 +msgid "Unknown Software License" +msgstr "অপরিচিত সফটওয়্যার লাইসেন্স" + +#: src/gs-details-page.ui:1541 +msgid "The license terms of this software are unknown." +msgstr "এই সফটওয়্যারের লাইসেন্সের শর্তসমূহ অপরিচিত।" + +#: src/gs-details-page.ui:1568 +msgid "The application was rated this way because it features:" +msgstr "" + +#: src/gs-details-page.ui:1594 +msgid "No details were available for this rating." +msgstr "" + +#: src/gs-editor.c:361 +msgid "CSS validated OK!" +msgstr "" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:564 +msgid "Failed to load file" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-editor.c:598 src/gs-editor.c:874 +msgid "Unsaved changes" +msgstr "" + +#: src/gs-editor.c:600 +msgid "The application list is already loaded." +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-editor.c:604 +msgid "Merge documents" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-editor.c:608 src/gs-editor.c:879 +msgid "Throw away changes" +msgstr "" + +#. import the new file +#: src/gs-editor.c:620 src/gs-editor.c:652 +msgid "Open AppStream File" +msgstr "" + +#: src/gs-editor.c:624 +msgid "_Open" +msgstr "" + +#: src/gs-editor.c:656 +msgid "_Save" +msgstr "" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:676 +msgid "Failed to save file" +msgstr "" + +#. TRANSLATORS, the %s is the app name, e.g. 'Inkscape' +#: src/gs-editor.c:751 +#, c-format +msgid "%s banner design deleted." +msgstr "" + +#. TRANSLATORS, this is a notification +#: src/gs-editor.c:754 +msgid "Banner design deleted." +msgstr "" + +#: src/gs-editor.c:876 +msgid "The application list has unsaved changes." +msgstr "" + +#. TRANSLATORS: show the program version +#: src/gs-editor.c:1111 +msgid "Use verbose logging" +msgstr "" + +#. TRANSLATORS: program name, an application to add and remove software +#. repositories +#: src/gs-editor.c:1119 +msgid "GNOME Software Banner Designer" +msgstr "" + +#: src/gs-editor.ui:63 src/gs-editor.ui:77 +msgid "No Designs" +msgstr "" + +#: src/gs-editor.ui:163 +msgid "Error message here" +msgstr "" + +#: src/gs-editor.ui:250 +msgid "App ID" +msgstr "" + +#: src/gs-editor.ui:296 +msgid "Name" +msgstr "" + +#: src/gs-editor.ui:341 src/gs-review-dialog.ui:142 +msgid "Summary" +msgstr "সারাংশ" + +#: src/gs-editor.ui:382 +msgid "Editor’s Pick" +msgstr "" + +#. This check button controls whether the application’s banner appears in the +#. “Featured” category +#: src/gs-editor.ui:397 +msgid "Category Featured" +msgstr "" + +#. button in the info bar +#: src/gs-editor.ui:471 +msgid "Undo" +msgstr "" + +#: src/gs-editor.ui:524 src/org.gnome.Software.Editor.desktop.in:3 +msgid "Banner Designer" +msgstr "" + +#: src/gs-editor.ui:547 +msgid "New Banner" +msgstr "" + +#: src/gs-editor.ui:615 +msgid "Import from file" +msgstr "" + +#: src/gs-editor.ui:629 +msgid "Export to file" +msgstr "" + +#: src/gs-editor.ui:643 +msgid "Delete Design" +msgstr "" + +#: src/gs-editor.ui:670 +msgid "Featured App" +msgstr "" + +#: src/gs-editor.ui:684 +msgid "OS Upgrade" +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid " and " +msgstr "এবং" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:149 +msgid ", " +msgstr "," + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:175 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s স্ক্রিপ্টের জন্য সহজলভ্য ফন্টসমূহ" +msgstr[1] "%s স্ক্রিপ্টের জন্য সহজলভ্য ফন্টসমূহ" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:183 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s জন্য সহজলভ্য সফটওয়্যার" +msgstr[1] "%s জন্য সহজলভ্য সফটওয়্যার" + +#: src/gs-extras-page.c:225 +msgid "Unable to Find Requested Software" +msgstr "অনুরোধকৃত সফটওয়্যার পাওয়া যায়নি" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:325 +#, c-format +msgid "%s not found" +msgstr "%s পাওয়া যায়নি" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:329 +msgid "on the website" +msgstr "ওয়েবসাইটে" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:336 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "%s ফাইলটি সরবরাহ করার মতো কোন এ্যাপ্লিকেশন পাওয়া যায়নি।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:340 src/gs-extras-page.c:351 src/gs-extras-page.c:362 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications" +" might be found %s." +msgstr "%s সম্পর্কে তথ্য, সেইসাথে হারিয়ে যাওয়া এ্যাপ্লিকেশন পাবার উপায়সমূহ হয়তো %s পাওয়া যাবে।" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:347 src/gs-extras-page.c:369 +#, c-format +msgid "No applications are available for %s support." +msgstr "%s সমর্থনের জন্য কোন এ্যাপ্লিকেশন পাওয়া যায়নি।" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:358 +#, c-format +msgid "%s is not available." +msgstr "%s পাওয়া যায়নি।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:373 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "%s সম্পর্কে তথ্য, সেইসাথে এই ফরম্যাট চালানোর জন্য এ্যাপ্লিকেশন পাবার উপায়সমূহ %s পাওয়া যাবে।" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:380 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s স্ক্রিপ্ট সমর্থনের জন্য কোন ফন্ট পাওয়া যায়নি।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:384 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "%s সম্পর্কে তথ্য, সেইসাথে অতিরিক্ত ফন্ট পাবার উপায়সমূহ হয়তো %s পাওয়া যাবে।" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:391 lib/gs-plugin-loader.c:1458 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s ফরম্যাটে কোন এ্যাডঅন কোডেক পাওয়া যায়নি।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:395 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "%s সম্পর্কে তথ্য, সেইসাথে এই ফরম্যাট চালানোর জন্য কোডেক পাবার উপায়সমূহ %s পাওয়া যাবে।" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:402 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s সমর্থনের জন্য কোন প্লাজমা সংস্থান পাওয়া যায়নি।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:406 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "%s সম্পর্কে তথ্য, সেইসাথে অতিরিক্ত প্লাজমা সংস্থান পাবার উপায়সমূহ হয়তো %s পাওয়া যাবে।" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:413 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s জন্য কোন প্রিন্টার ড্রাইভার পাওয়া যায়নি।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:417 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "%s সম্পর্কে তথ্য, সেইসাথে এই প্রিন্টার সমর্থন দেবার মতো ড্রাইভার পাবার উপায়সমূহ হয়তো %s পাওয়া যাবে।" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:462 +msgid "this website" +msgstr "এই ওয়েবসাইট" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual +#. codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:466 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "দুর্ভাগ্যক্রমে, আপনি যে %s অনুসন্ধান করছে তা পাওয়া যায়নি। আরো তথ্যের জন্য অনুগ্রহ করে %s দেখুন।" +msgstr[1] "দুর্ভাগ্যক্রমে, আপনি যে %s অনুসন্ধান করছে তা পাওয়া যায়নি। আরো তথ্যের জন্য অনুগ্রহ করে %s দেখুন।" + +#: src/gs-extras-page.c:538 src/gs-extras-page.c:594 src/gs-extras-page.c:633 +msgid "Failed to find any search results" +msgstr "অনুসন্ধান করে ফললাভ করতে ব্যর্থ" + +#: src/gs-extras-page.c:827 +#, c-format +msgid "%s file format" +msgstr "%s ফাইল ফরম্যাট" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "কোডেকস পাতা" + +#: src/gs-first-run-dialog.ui:7 src/gs-first-run-dialog.ui:16 +msgid "Welcome" +msgstr "স্বাগতম" + +#: src/gs-first-run-dialog.ui:50 +msgid "Welcome to Software" +msgstr "সফটওয়্যারে স্বাগতম" + +#: src/gs-first-run-dialog.ui:66 +msgid "" +"Software lets you install all the software you need, all from one place. See" +" our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "এই সফটওয়্যারের সাহায্যে আপনার প্রয়োজনীয় সকল সফটওয়্যার সংস্থাপন করে নিন একটিমাত্র জায়গা থেকে। আমাদের সুপারিশসমূহ দেখুন, বিভাগগুলো ঘুরে দেখুন অথবা আপনি যে এ্যাপ্লিকেশনটি চান তা অনুসন্ধান করুন।" + +#: src/gs-first-run-dialog.ui:85 +msgid "_Let’s Go Shopping" +msgstr "_চলুন কেনাকাটা করি" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: src/gs-hiding-box.c:381 +msgid "Spacing" +msgstr "স্পেসিং" + +#: src/gs-hiding-box.c:382 +msgid "The amount of space between children" +msgstr "বাচ্চাদের মাঝে জায়গার পরিমাণ" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:82 +msgctxt "app status" +msgid "Removed" +msgstr "মুছে ফেলা হয়েছে" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:88 +msgctxt "app status" +msgid "Installed" +msgstr "সংস্থাপিত হয়েছে" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:94 +msgctxt "app status" +msgid "Updated" +msgstr "আপডেট করা হয়েছে" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:100 +msgctxt "app status" +msgid "Unknown" +msgstr "অপরিচিত" + +#: src/gs-history-dialog.ui:6 +msgid "History" +msgstr "ইতিহাস" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:486 +msgid "System Applications" +msgstr "সিস্টেম এ্যাপ্লিকেশন" + +#: src/gs-installed-page.c:620 +msgid "Click on items to select them" +msgstr "নির্বাচিত করতে উক্ত বস্তুতে চাপ দিন" + +#: src/gs-installed-page.c:826 +msgid "Select" +msgstr "নির্বাচিত করুন" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "সংস্থাপিত পাতা" + +#: src/gs-installed-page.ui:65 +msgid "_Add to Folder…" +msgstr "_ফোল্ডারে সংযুক্তি..." + +#: src/gs-installed-page.ui:73 +msgid "_Move to Folder…" +msgstr "_ফোল্ডারে সরান..." + +#: src/gs-installed-page.ui:81 +msgid "_Remove from Folder" +msgstr "_ফোল্ডার থেকে সরান" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:76 +msgid "Software catalog is being downloaded" +msgstr "সফটওয়্যার ক্যাটালগ ডাউনলোড হচ্ছে" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Software catalog is being loaded" +msgstr "সফটওয়্যার ক্যাটালগ জমা হচ্ছে" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "পাতা জমা হচ্ছে" + +#: src/gs-loading-page.ui:37 +msgid "Starting up…" +msgstr "শুরু হচ্ছে..." + +#: src/gs-menus.ui:7 +msgid "_Software Sources" +msgstr "_সফটওয়্যার উৎস" + +#: src/gs-menus.ui:14 +msgid "_About" +msgstr "_সম্পর্কে" + +#: src/gs-menus.ui:18 +msgid "_Quit" +msgstr "_বেরিয়ে যান" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "পরীক্ষক পাতা" + +#: src/gs-moderate-page.ui:87 +msgid "There are no reviews to moderate" +msgstr "পরীক্ষা করার জন্য কোন রিভিউ নেই" + +#. add button +#: src/gs-overview-page.c:372 +msgid "More…" +msgstr "আরো..." + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:588 +msgid "Recommended Audio & Video Applications" +msgstr "সুপারিশকৃত অডিও ও ভিডিও এ্যাপ্লিকেশনসমূহ" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:593 +msgid "Recommended Games" +msgstr "সুপারিশকৃত খেলাসমূহ" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:598 +msgid "Recommended Graphics Applications" +msgstr "সুপারিশকৃত গ্রাফিক্স এ্যাপ্লিকেশনসমূহ" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:603 +msgid "Recommended Productivity Applications" +msgstr "সুপারিশকৃত প্রমোদ এ্যাপ্লিকেশনসমূহ" + +#. TRANSLATORS: this is the proprietary info bar +#: src/gs-overview-page.c:992 +msgid "" +"Provides access to additional software, including web browsers and games." +msgstr "ওয়েব ব্রাউজার ও খেলাসহ, অতিরিক্ত সফটওয়্যারে প্রবেশাধিকার দেয়।" + +#. TRANSLATORS: this is the proprietary info bar +#: src/gs-overview-page.c:996 +msgid "" +"Proprietary software has restrictions on use and access to source code." +msgstr "স্বত্বসহ সফটওয়্যারের ব্যবহার ও এর উৎস কোডে প্রবেশাধিকারে বিধিনিষেধ রয়েছে।" + +#. TRANSLATORS: this is the clickable +#. * link on the proprietary info bar +#: src/gs-overview-page.c:1003 src/gs-sources-dialog.c:290 +msgid "Find out more…" +msgstr "আরো জানুন..." + +#. TRANSLATORS: button to turn on proprietary software sources +#: src/gs-overview-page.c:1054 +msgid "Enable" +msgstr "সক্রিয় করুন" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "পরিচিতি পাতা" + +#: src/gs-overview-page.ui:54 +msgid "Enable Proprietary Software Sources?" +msgstr "স্বত্বসহ সফটওয়্যারের উৎসগুলো সক্রিয় করবেন?" + +#: src/gs-overview-page.ui:122 +msgid "Featured Application" +msgstr "" + +#: src/gs-overview-page.ui:155 +msgid "Categories" +msgstr "বিভাগ" + +#. Translators: This is a heading for software which has been featured +#. ('picked') by the distribution. +#: src/gs-overview-page.ui:315 +msgid "Editor’s Picks" +msgstr "" + +#. Translators: This is a heading for software which has been recently +#. released upstream. +#: src/gs-overview-page.ui:359 +msgid "Recent Releases" +msgstr "" + +#: src/gs-overview-page.ui:446 +msgid "No Application Data Found" +msgstr "কোন এ্যাপ্লিকেশন তথ্য পাওয়া যায়নি" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:445 +#, c-format +msgid "Are you sure you want to purchase %s?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:449 +#, c-format +msgid "%s will be installed, and you will be charged %s." +msgstr "" + +#. TRANSLATORS: this is button text to purchase the application +#: src/gs-page.c:462 +msgid "Purchase" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:535 +#, c-format +msgid "Prepare %s" +msgstr "%s তৈরি করুন" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * source name, e.g. 'GNOME Nightly' +#: src/gs-page.c:669 +#, c-format +msgid "Are you sure you want to remove the %s source?" +msgstr "আপনি কি নিশ্চিত আপনি %s উ্ৎসটি মুছতে চান?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:673 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the source to use them again." +msgstr "%s থেকে সকল এ্যাপ্লিকেশন মুছে ফেলা হবে, এবং এদের ব্যবহার করতে হলে আপনাকে আবার উৎসটি পুনঃসংস্থাপন করতে হবে।" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:681 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "আপনি কি নিশ্চিত আপনি %s মুছতে চান?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:684 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "%s মুছে ফেলা হবে, এবং এটা ব্যবহার করতে হলে আপনাকে আবার সংস্থাপিত করতে হবে।" + +#: lib/gs-plugin-loader.c:1461 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "%s সম্পর্কে তথ্য, সেইসাথে এই ফরম্যাট চালানোর জন্য কোডেক পাবার উপায়সমূহ এই ওয়েবসাইটে পাওয়া যাবে।" + +#: lib/gs-price.c:111 +#, c-format +msgid "A$%.2f" +msgstr "" + +#: lib/gs-price.c:113 +#, c-format +msgid "C$%.2f" +msgstr "" + +#: lib/gs-price.c:115 +#, c-format +msgid "CN¥%.2f" +msgstr "" + +#: lib/gs-price.c:117 +#, c-format +msgid "€%.2f" +msgstr "" + +#: lib/gs-price.c:119 +#, c-format +msgid "£%.2f" +msgstr "" + +#: lib/gs-price.c:121 +#, c-format +msgid "¥%.2f" +msgstr "" + +#: lib/gs-price.c:123 +#, c-format +msgid "NZ$%.2f" +msgstr "" + +#: lib/gs-price.c:125 +#, c-format +msgid "₽%.2f" +msgstr "" + +#: lib/gs-price.c:127 +#, c-format +msgid "US$%.2f" +msgstr "" + +#. Translators: %s is the currency, and %f is the amount. +#. * You can switch the order by using “%2$f %1$s” instead. +#: lib/gs-price.c:131 +#, c-format +msgid "%s %f" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:128 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "বর্তমানে সংস্থাপিত সফটওয়্যারসমূহের মধ্যে কিছু সংখ্যক %s সাথে সামঞ্জস্যপূর্ণ নয়। আপনি যদি চালাতে থাকেন, তবে আপগ্রেডের সময় নিম্নোক্তগুলো স্বয়ংক্রিয়ভাবে সরিয়ে ফেলা হবে:" + +#: src/gs-removal-dialog.ui:27 +msgid "Incompatible Software" +msgstr "অসঙ্গতিপূর্ণ সফটওয়্যার" + +#: src/gs-removal-dialog.ui:40 +msgid "_Continue" +msgstr "_চলবে" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:98 +msgid "Hate it" +msgstr "ঘৃণা করছি" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:102 +msgid "Don’t like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:106 +msgid "It’s OK" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:110 +msgid "Like it" +msgstr "পছন্দ হয়েছে" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:114 +msgid "Love it" +msgstr "খুব ভাল লেগেছে" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:136 +msgid "Please take more time writing the review" +msgstr "অনুগ্রহ করে রিভিউ লিখতে আরো সময় নিন" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:140 +msgid "Please choose a star rating" +msgstr "অনুগ্রহ করে একটি নক্ষত্র রেটিং বেছে নিন" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:144 +msgid "The summary is too short" +msgstr "এই সারাংশটি বেশি ছোট" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:148 +msgid "The summary is too long" +msgstr "এই সারাংশটি বেশি লম্বা" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:152 +msgid "The description is too short" +msgstr "এই বর্ণনাটি বেশি ছোট" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:156 +msgid "The description is too long" +msgstr "এই বর্ণনাটি বেশি লম্বা" + +#. Translators: Title of the dialog box where the users can write and publish +#. their opinions about the apps. +#: src/gs-review-dialog.ui:11 +msgid "Post Review" +msgstr "রিভিউ পোস্ট করুন" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:35 +msgid "_Post" +msgstr "_পোস্ট" + +#: src/gs-review-dialog.ui:85 +msgid "Rating" +msgstr "রেটিং" + +#: src/gs-review-dialog.ui:158 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "আপনার রিভিউয়ের জন্য একটি ছোট সারাংশ লিখুন, উদাহরণস্বরূপ: \"দারুণ এ্যাপ, আমি সুপারিশ করছি।\"" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:199 +msgctxt "app review" +msgid "Review" +msgstr "রিভিউ" + +#: src/gs-review-dialog.ui:215 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "এ্যাপটি সম্পর্কে আপনার মতামত কী? আপনার মতামতের পেছনে কারণ দেখানোর চেষ্টা করুন।" + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:413 +msgid "ratings in total" +msgstr "" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:234 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "অবমাননাকর, অভদ্র বা বৈষম্যমূলক আচরণের জন্য আপনি কোন রিভিউ সম্পর্কে অভিযোগ জানাতে পারেন।" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:239 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "একবার অভিযোগ জানালে, উক্ত রিভিউটি একজন প্রশাসক দ্বারা পরীক্ষা না করা পর্যন্ত লুকানো থাকবে।" + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:253 +msgid "Report Review?" +msgstr "রিভিউ সম্পর্কে অভিযোগ করবেন?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:257 +msgid "Report" +msgstr "অভিযোগ" + +#. Translators: Users can express their opinions about other users' opinions +#. about the apps. +#: src/gs-review-row.ui:112 +msgid "Was this review useful to you?" +msgstr "এই রিভিউ পড়ে কি আপনার কোন সাহায্য হয়েছে?" + +#: src/gs-review-row.ui:134 +msgid "Yes" +msgstr "হ্যাঁ" + +#: src/gs-review-row.ui:148 +msgid "No" +msgstr "না" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:162 +msgid "Meh" +msgstr "এহ" + +#: src/gs-review-row.ui:196 +msgid "Report…" +msgstr "অভিযোগ..." + +#: src/gs-review-row.ui:211 +msgid "Remove…" +msgstr "মুছে ফেলুন..." + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:313 +msgid "Screenshot not found" +msgstr "স্ক্রিনশট পাওয়া যায়নি" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:328 +msgid "Failed to load image" +msgstr "ছবি আনতে ব্যর্থ" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:461 +msgid "Screenshot size not found" +msgstr "স্ক্রিনশটের আকৃতি পাওয়া যায়নি" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:491 +msgid "Could not create cache" +msgstr "ক্যাশ তৈরি করা যায়নি" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:552 +msgid "Screenshot not valid" +msgstr "স্ক্রিনশট কার্যকরী নয়" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:567 +msgid "Screenshot not available" +msgstr "স্ক্রিনশট পাওয়া যায়নি" + +#: src/gs-screenshot-image.c:626 +msgid "Screenshot" +msgstr "স্ক্রিনশট" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:157 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "অনুসন্ধান পাতা" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "কোন এ্যাপ্লিকেশন পাওয়া যায়নি" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:890 src/gs-shell.c:895 src/gs-shell.c:910 src/gs-shell.c:914 +#, c-format +msgid "“%s”" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:942 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:948 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:955 +msgid "Unable to download updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:960 +msgid "" +"Unable to download updates: internet access was required but wasn’t " +"available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:969 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:974 +msgid "Unable to download updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:982 +msgid "Unable to download updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:987 +msgid "Unable to download updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:992 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:999 +msgid "Unable to get list of updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1045 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1051 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1063 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1069 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1076 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1082 +msgid "Unable to install: the application has an invalid format" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1087 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1095 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1102 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1109 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the name of the authentication service, +#. * e.g. "Ubuntu One" +#: src/gs-shell.c:1122 +#, c-format +msgid "Your %s account has been suspended." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1126 +msgid "It is not possible to install software until this has been resolved." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the clickable link (e.g. +#. * "http://example.com/what-did-i-do-wrong/") +#: src/gs-shell.c:1137 +#, c-format +msgid "For more information, visit %s." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1146 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1155 +#, c-format +msgid "Unable to install %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1201 +#, c-format +msgid "Unable to update %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1207 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1230 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1244 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1252 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1261 +#, c-format +msgid "Unable to update %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1306 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1311 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1318 +msgid "Unable to upgrade: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1335 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1342 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1349 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1356 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1365 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1407 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1413 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1435 +#, c-format +msgid "Unable to remove %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1488 src/gs-shell.c:1536 src/gs-shell.c:1584 +msgid "Not enough disk space — free up some space and try again" +msgstr "" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1496 src/gs-shell.c:1544 src/gs-shell.c:1611 +msgid "Sorry, something went wrong" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1531 +msgid "Failed to install file: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1578 +#, c-format +msgid "Unable to contact %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1593 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1598 +msgid "This application needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1605 +msgid "AC power is required" +msgstr "" + +#. TRANSLATORS: This string describes a software source that +#. has no software installed from it. +#: src/gs-sources-dialog.c:109 +msgid "No applications or addons installed; other software might still be" +msgstr "কোনো এ্যাপ্লিকেশন অথবা এ্যাডঅন সংস্থাপন করা নেই; অন্য সফটওয়্যার থাকতে পারে" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software source. +#: src/gs-sources-dialog.c:114 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "%u এ্যাপ্লিকেশনসমূহ সংস্থাপিত" +msgstr[1] "%u এ্যাপ্লিকেশনসমূহ সংস্থাপিত" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software source. +#: src/gs-sources-dialog.c:121 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u এ্যাড-অন সংস্থাপিত" +msgstr[1] "%u এ্যাড-অনসমূহ সংস্থাপিত" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of applications. +#: src/gs-sources-dialog.c:129 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u এ্যাপ্লিকেশন" +msgstr[1] "%u এ্যাপ্লিকেশনসমূহ" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of add-ons. +#: src/gs-sources-dialog.c:135 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u এ্যাড-অন" +msgstr[1] "%u এ্যাড-অনসমূহ" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-sources-dialog.c:142 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s এবং %s সংস্থাপিত" +msgstr[1] "%s এবং %s সংস্থাপিত" + +#. TRANSLATORS: nonfree software +#: src/gs-sources-dialog.c:280 +msgid "Typically has restrictions on use and access to source code." +msgstr "সাধারণত ব্যবহার ও উৎস কোডে প্রবেশাধিকারে বিধিনিষেধ রয়েছে।" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-sources-dialog.c:587 +msgid "the operating system" +msgstr "অপারেটিং সিস্টেম" + +#. TRANSLATORS: list header +#: src/gs-sources-dialog.c:679 +msgid "Proprietary Software Sources" +msgstr "স্বত্বসহ সফটওয়্যারের উৎসগুলো" + +#. TRANSLATORS: This is the text displayed in the Software Sources +#. dialog when no OS-provided software sources are enabled. %s gets +#. replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-sources-dialog.c:687 +#, c-format +msgid "" +"Software sources can be downloaded from the internet. They give you access " +"to additional software that is not provided by %s." +msgstr "সফটওয়্যার উৎসসমূহ ইন্টারনেট থেকে ডাউনলোড করা যাবে। সেসব অতিরিক্ত সফটওয়্যারে প্রবেশাধিকার দেয় যা %s কর্তৃক সরবরাহকৃত নয়।" + +#: src/gs-sources-dialog.ui:161 +msgid "Additional Sources" +msgstr "অতিরিক্ত উৎসগুলো" + +#: src/gs-sources-dialog.ui:181 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "একটি উৎস মুছে ফেলার মানে সেই উৎস থেকে যে সফটওয়্যার সংস্থাপন করা হয়েছে তাও মুছে ফেলা।" + +#: src/gs-sources-dialog.ui:266 +msgid "No software installed from this source" +msgstr "এই উৎস থেকে কোন সফটওয়্যার সংস্থাপন করা হয়নি" + +#: src/gs-sources-dialog.ui:293 +msgid "Installed from this Source" +msgstr "এই উৎস থেকে সংস্থাপন করা হয়েছে" + +#: src/gs-sources-dialog.ui:339 +msgid "Source Details" +msgstr "উৎসের বিশদ" + +#: src/gs-sources-dialog.ui:396 +msgid "Last Checked" +msgstr "শেষবার পরীক্ষা করা হয়েছে" + +#: src/gs-sources-dialog.ui:413 +msgid "Added" +msgstr "সংযুক্ত" + +#: src/gs-sources-dialog.ui:430 +msgid "Website" +msgstr "ওয়েবসাইট" + +#: src/gs-summary-tile.c:80 +#, c-format +msgid "%s (Installing)" +msgstr "%s (সংস্থাপিত হচ্ছে)" + +#: src/gs-summary-tile.c:85 +#, c-format +msgid "%s (Removing)" +msgstr "%s (সরানো হচ্ছে)" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:129 +msgid "No update description available." +msgstr "কোন আপডেটের বর্ণনা পাওয়া যায়নি" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:224 +#, c-format +msgid "Installed on %s" +msgstr "%s সংস্থাপিত" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:244 +msgid "Installed Updates" +msgstr "আপডেট সংস্থাপিত করা হয়েছে" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:420 +msgid "Additions" +msgstr "" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:424 +msgid "Removals" +msgstr "" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:428 +msgid "Updates" +msgstr "" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:432 +msgid "Downgrades" +msgstr "" + +#: src/gs-update-dialog.ui:111 +msgid "No updates have been installed on this system." +msgstr "এই সিস্টেমে কোন আপডেট সংস্থাপিত হয়নি।" + +#: src/gs-update-monitor.c:169 +msgid "Security Updates Pending" +msgstr "নিরাপত্তা আপডেট বাকি আছে" + +#: src/gs-update-monitor.c:170 +msgid "It is recommended that you install important updates now" +msgstr "গুরুত্বপূর্ণ আপডেট এখন সংস্থাপিত করতে সুপারিশ করা হচ্ছে।" + +#: src/gs-update-monitor.c:173 +msgid "Restart & Install" +msgstr "পুনরায় চালু করুন এবং সংস্থাপন করুন" + +#: src/gs-update-monitor.c:177 +msgid "Software Updates Available" +msgstr "সফটওয়্যার আপডেট পাওয়া যাবে" + +#: src/gs-update-monitor.c:178 +msgid "Important OS and application updates are ready to be installed" +msgstr "গুরুত্বপূর্ণ OS এবং এ্যাপ্লিকেশন আপডেট সংস্থাপনের জন্য তৈরি" + +#. TRANSLATORS: button text +#: src/gs-update-monitor.c:181 src/gs-updates-page.c:800 +msgid "Not Now" +msgstr "এখন নয়" + +#: src/gs-update-monitor.c:182 +msgid "View" +msgstr "মতামত" + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:696 src/gs-updates-page.ui:79 +msgid "Operating System Updates Unavailable" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:698 +msgid "Upgrade to continue receiving security updates." +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:752 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s একটি নতুন ভার্সন সংস্থাপনের জন্য পাওয়া যাবে" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:756 +msgid "Software Upgrade Available" +msgstr "সফটওয়্যার আপগ্রেড পাওয়া যাবে" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1040 +msgid "Software Updates Failed" +msgstr "সফটওয়্যার আপডেট করা ব্যর্থ" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1042 +msgid "An important OS update failed to be installed." +msgstr "একটি গুরুত্বপূর্ণ OS আপডেট সংস্থাপনে ব্যর্থ হয়েছে।" + +#: src/gs-update-monitor.c:1043 +msgid "Show Details" +msgstr "বিশদ প্রদর্শন করুন" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1065 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "সফটওয়্যার আপডেট সংস্থাপন করা হয়েছে" +msgstr[1] "সফটওয়্যার আপডেট সংস্থাপন করা হয়েছে" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1069 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "একটি গুরুত্বপূর্ণ OS আপডেট সংস্থাপন করা হয়েছে।" +msgstr[1] "গুরুত্বপূর্ণ OS আপডেট সংস্থাপন করা হয়েছে।" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1080 +msgctxt "updates" +msgid "Review" +msgstr "রিভিউ" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1127 +msgid "Failed To Update" +msgstr "আপডেট করতে ব্যর্থ" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1133 +msgid "The system was already up to date." +msgstr "সিস্টেম ইতিমধ্যেই হালনাগাদকৃত।" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1138 +msgid "The update was cancelled." +msgstr "আপডেট বাতিল করা হয়েছে।" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1144 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you" +" have internet access and try again." +msgstr "ইন্টারনেট সংযোগ প্রয়োজন হলেও ইন্টারনেট সংযোগ পাওয়া যায়নি। অনুগ্রহ করে নিশ্চিত করুন আপনার ইন্টারনেট সংযোগ রয়েছে এবং আবার চেষ্টা করুন।" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1150 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "আপডেট সম্পর্কিত নিরাপত্তা ইস্যু দেখা দিয়েছে। আরো তথ্যের জন্য অনুগ্রহ করে আপনার সফটওয়্যার সরবরাহকারীর সাথে যোগাযোগ করুন।" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1156 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "ডিস্কে পর্যাপ্ত জায়গা ছিল না। অনুগ্রহ করে কিছু জায়গা খালি করুন এবং আবার চেষ্টা করুন।" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1161 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "আমরা দুঃখিত: আপডেট সংস্থাপিত হতে ব্যর্থ হয়েছে। আরেকটি আপডেটের জন্য অপেক্ষা করুন এবং আবার চেষ্টা করুন। যদি সমস্যা হতে থাকে, তাহলে আপনার সফটওয়্যার সরবরাহকারীর সাথে যোগাযোগ করুন।" + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:306 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:309 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:315 +msgid "Yesterday, %R" +msgstr "গতকাল, %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:319 +msgid "Yesterday, %l:%M %p" +msgstr "গতকাল, %l:%M %p" + +#: src/gs-updates-page.c:322 +msgid "Two days ago" +msgstr "দুই দিন আগে" + +#: src/gs-updates-page.c:324 +msgid "Three days ago" +msgstr "তিন দিন আগে" + +#: src/gs-updates-page.c:326 +msgid "Four days ago" +msgstr "চার দিন আগে" + +#: src/gs-updates-page.c:328 +msgid "Five days ago" +msgstr "পাঁচ দিন আগে" + +#: src/gs-updates-page.c:330 +msgid "Six days ago" +msgstr "ছয় দিন আগে" + +#: src/gs-updates-page.c:332 +msgid "One week ago" +msgstr "এক সপ্তাহ আগে" + +#: src/gs-updates-page.c:334 +msgid "Two weeks ago" +msgstr "দুই সপ্তাহ আগে" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-updates-page.c:338 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. FIXME: We are commenting out the code that checked the status because +#. * the message it returned is not what a plugin may be doing (it can be +#. * simply refreshing the metadata), so we need to fix this (maybe adding +#. * different types of 'downloading' status) in the future. +#. if (status == GS_PLUGIN_STATUS_DOWNLOADING) { +#. /\* TRANSLATORS: the updates are being downloaded *\/ +#. return _("Downloading new updates…"); +#. } +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:359 +msgid "Looking for new updates…" +msgstr "নতুন আপডেট খোঁজ করা হচ্ছে..." + +#: src/gs-updates-page.c:389 +msgid "automatic updates on" +msgstr "" + +#: src/gs-updates-page.c:392 +msgid "automatic updates off" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:440 +msgid "Setting up updates…" +msgstr "আপডেট সেটআপ করা হচ্ছে..." + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:441 src/gs-updates-page.c:448 +msgid "(This could take a while)" +msgstr "(একটু সময় লাগতে পারে)" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:554 +#, c-format +msgid "Last checked: %s" +msgstr "শেষবার দেখা হয়েছে: %s" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-updates-page.c:796 +msgid "Updates have been installed" +msgstr "আপডেটসমূহ সংস্থাপন করা হয়েছে" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-updates-page.c:798 +msgid "A restart is required for them to take effect." +msgstr "এগুলো কার্যকরী হতে পুনরায় চালু করা দরকার।" + +#. TRANSLATORS: button text +#: src/gs-updates-page.c:802 +msgid "Restart" +msgstr "পুনরায় চালু করুন" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-page.c:872 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the button for upgrading all +#. * system firmware +#. TRANSLATORS: This is the button for upgrading all +#. * offline updates +#: src/gs-updates-page.c:875 src/gs-updates-page.c:885 +msgid "Restart & Update" +msgstr "" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-page.c:882 +msgid "Requires Restart" +msgstr "" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-page.c:892 +msgid "Application Updates" +msgstr "" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-page.c:895 +msgid "Update All" +msgstr "" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-page.c:902 +msgid "Device Firmware" +msgstr "" + +#. TRANSLATORS: this is an offline update +#: src/gs-updates-page.c:1087 +msgid "_Restart & Update" +msgstr "_পুনঃ চালু ও হালনাগাদ " + +#. TRANSLATORS: all updates will be installed +#: src/gs-updates-page.c:1091 +msgid "U_pdate All" +msgstr "সব হা_লানাগাদ " + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:1175 +#, c-format +msgid "%s %s is no longer supported." +msgstr "" + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:1180 +msgid "Your OS is no longer supported." +msgstr "" + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:1185 +msgid "This means that it does not receive security updates." +msgstr "" + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:1189 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:1446 +msgid "Charges may apply" +msgstr "মূল্য পরিশোধ করতে হতে পারে" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1450 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "মোবাইলে ব্রডব্যান্ড ব্যবহার করার সময় আপডেট খোঁজ করতে গেলে আপনাকে মূল্য পরিশোধ করতে হতে পারে।" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:1454 +msgid "Check Anyway" +msgstr "তবুও খোঁজ করুন" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:1470 +msgid "No Network" +msgstr "নেটওয়ার্ক নেই" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1474 +msgid "Internet access is required to check for updates." +msgstr "আপডেট খোঁজ করতে ইন্টারনেট সংযোগ প্রয়োজন।" + +#: src/gs-updates-page.c:1907 +msgid "Restart & _Install" +msgstr "পুনরায় চালু করুন এবং _সংস্থাপন করুন" + +#: src/gs-updates-page.c:1925 +msgid "Check for updates" +msgstr "আপডেট খোঁজ করেন" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "আপডেট পাতা" + +#: src/gs-updates-page.ui:227 +msgid "Software is up to date" +msgstr "সফটওয়্যার হালনাগাদকৃত আছে" + +#: src/gs-updates-page.ui:278 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "মোবাইলে ব্রডব্যান্ড ব্যবহার করার সময় আপডেট খোঁজ করতে গেলে আপনাকে মূল্য পরিশোধ করতে হতে পারে" + +#: src/gs-updates-page.ui:290 +msgid "_Check Anyway" +msgstr "_তবুও খোঁজ করুন" + +#: src/gs-updates-page.ui:333 +msgid "Go online to check for updates" +msgstr "আপডেট খোঁজ করতে অনলাইনে যান" + +#: src/gs-updates-page.ui:344 +msgid "_Network Settings" +msgstr "_নেটওয়ার্ক সেটিংস" + +#: src/gs-updates-page.ui:426 +msgid "Updates are automatically managed" +msgstr "আপডেটসমূহ স্বয়ংক্রিয়ভাবে পরিচালিত হয়" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:85 +#, c-format +msgid "%s %s Now Available" +msgstr "%s %s এখন পাওয়া যাবে" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "Downloading %s %s" +msgstr "%s %s ডাউনলোড করা হচ্ছে" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:106 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "%s %s সংস্থাপিত হতে তৈরি" + +#: src/gs-upgrade-banner.ui:32 +msgid "A major upgrade, with new features and added polish." +msgstr "নতুন বৈশিষ্ট্য সম্পন্ন একটি গুরুত্বপূর্ণ আপগ্রেড" + +#: src/gs-upgrade-banner.ui:52 +msgid "_Learn More" +msgstr "_আরো জানুন" + +#: src/gs-upgrade-banner.ui:98 +msgid "Updates will be applied when the computer is restarted." +msgstr "" + +#: src/gs-upgrade-banner.ui:146 +msgid "_Restart Now" +msgstr "" + +#: src/org.gnome.Software.desktop.in:3 +msgid "App Center" +msgstr "এ্যাপ সেন্টার" + +#: src/org.gnome.Software.desktop.in:4 +msgid "More Apps" +msgstr "আরও অ্যাপস" + +#: src/org.gnome.Software.desktop.in:5 +msgid "Add, remove or update software on this computer" +msgstr "এই কম্পিউটারে সফটওয়্যার সংযুক্তি, মুছে ফেলা অথবা আপডেট" + +#. Translators: Do NOT translate or transliterate this text (this is an icon +#. file name)! +#: src/org.gnome.Software.desktop.in:7 +#: src/org.gnome.Software.Editor.desktop.in:6 +msgid "org.gnome.Software" +msgstr "" + +#. Translators: Search terms to find this application. Do NOT translate or +#. localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:13 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "আপডেট;আপগ্রেড;উৎস;ভান্ডার;পছন্দ;সংস্থাপন;অসংস্থাপন;প্রোগ্রাম;সফটওয়্যার;এ্যাপ;দোকান;" + +#: src/org.gnome.Software.Editor.desktop.in:4 +msgid "Design the featured banners for GNOME Software" +msgstr "" + +#. Translators: Search terms to find this application. Do NOT translate or +#. localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.Editor.desktop.in:13 +msgid "AppStream;Software;App;" +msgstr "" + +#: plugins/core/gs-desktop-common.c:31 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:35 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "" + +#: plugins/core/gs-desktop-common.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "" + +#: plugins/core/gs-desktop-common.c:49 +msgctxt "Menu of Graphics" +msgid "3D Graphics" +msgstr "3D গ্রাফিক্স" + +#: plugins/core/gs-desktop-common.c:52 +msgctxt "Menu of Graphics" +msgid "Photography" +msgstr "ফটোগ্রাফি" + +#: plugins/core/gs-desktop-common.c:55 +msgctxt "Menu of Graphics" +msgid "Scanning" +msgstr "বিশ্লেষণ" + +#: plugins/core/gs-desktop-common.c:58 +msgctxt "Menu of Graphics" +msgid "Vector Graphics" +msgstr "ভেক্টর গ্রাফিক্স" + +#: plugins/core/gs-desktop-common.c:61 +msgctxt "Menu of Graphics" +msgid "Viewers" +msgstr "দর্শক" + +#: plugins/core/gs-desktop-common.c:69 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:72 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:75 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:78 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:87 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:91 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:95 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "" + +#: plugins/core/gs-desktop-common.c:98 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "" + +#: plugins/core/gs-desktop-common.c:102 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "" + +#: plugins/core/gs-desktop-common.c:106 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "" + +#: plugins/core/gs-desktop-common.c:110 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "" + +#: plugins/core/gs-desktop-common.c:117 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:126 +msgctxt "Menu of Games" +msgid "All" +msgstr "সকল" + +#: plugins/core/gs-desktop-common.c:129 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "বৈশিষ্ট্যসম্পন্ন" + +#: plugins/core/gs-desktop-common.c:132 +msgctxt "Menu of Games" +msgid "Action" +msgstr "লড়াই" + +#: plugins/core/gs-desktop-common.c:135 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "অভিযান" + +#: plugins/core/gs-desktop-common.c:138 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "আর্কেড" + +#: plugins/core/gs-desktop-common.c:141 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "ব্লক" + +#: plugins/core/gs-desktop-common.c:144 +msgctxt "Menu of Games" +msgid "Board" +msgstr "বোর্ড" + +#: plugins/core/gs-desktop-common.c:147 +msgctxt "Menu of Games" +msgid "Card" +msgstr "কার্ড" + +#: plugins/core/gs-desktop-common.c:150 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "প্রতিদ্বন্দ্বিতাপূর্ণ" + +#: plugins/core/gs-desktop-common.c:153 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "বাচ্চা" + +#: plugins/core/gs-desktop-common.c:156 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "যুক্তি" + +#: plugins/core/gs-desktop-common.c:159 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "ভূমিকায় অভিনয়" + +#: plugins/core/gs-desktop-common.c:162 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "খেলা" + +#: plugins/core/gs-desktop-common.c:166 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "কৌশল" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:177 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:180 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "" + +#: plugins/core/gs-desktop-common.c:184 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "" + +#: plugins/core/gs-desktop-common.c:187 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "" + +#: plugins/core/gs-desktop-common.c:191 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "" + +#: plugins/core/gs-desktop-common.c:200 +msgctxt "Menu of Utility" +msgid "All" +msgstr "সকল" + +#: plugins/core/gs-desktop-common.c:206 +msgctxt "Menu of Utility" +msgid "Featured" +msgstr "বৈশিষ্ট্যসম্পন্ন" + +#: plugins/core/gs-desktop-common.c:210 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "" + +#: plugins/core/gs-desktop-common.c:213 +msgctxt "Menu of Communication" +msgid "Chat" +msgstr "আড্ডা" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "" + +#: plugins/core/gs-desktop-common.c:226 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:229 +msgctxt "Menu of Add-ons" +msgid "Shell Extensions" +msgstr "" + +#: plugins/core/gs-desktop-common.c:232 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "" + +#: plugins/core/gs-desktop-common.c:235 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:238 +msgctxt "Menu of Utility" +msgid "Text Editors" +msgstr "শব্দ সম্পাদনা" + +#: plugins/core/gs-desktop-common.c:241 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:244 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "" + +#: plugins/core/gs-desktop-common.c:248 +msgctxt "Menu of Settings" +msgid "Settings" +msgstr "" + +#: plugins/core/gs-desktop-common.c:257 +msgctxt "Menu of System" +msgid "System" +msgstr "" + +#: plugins/core/gs-desktop-common.c:270 plugins/core/gs-desktop-common.c:314 +msgctxt "Menu of Reference" +msgid "All" +msgstr "সকল" + +#: plugins/core/gs-desktop-common.c:273 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "বৈশিষ্ট্যসম্পন্ন" + +#: plugins/core/gs-desktop-common.c:276 +msgctxt "Menu of Reference" +msgid "Art" +msgstr "" + +#: plugins/core/gs-desktop-common.c:279 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "আত্মজীবনী" + +#: plugins/core/gs-desktop-common.c:282 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "প্রহসন" + +#: plugins/core/gs-desktop-common.c:285 +msgctxt "Menu of Reference" +msgid "Feed" +msgstr "" + +#: plugins/core/gs-desktop-common.c:288 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "গল্প" + +#: plugins/core/gs-desktop-common.c:291 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "স্বাস্থ্য" + +#: plugins/core/gs-desktop-common.c:294 +msgctxt "Menu of Reference" +msgid "History" +msgstr "ইতিহাস" + +#: plugins/core/gs-desktop-common.c:297 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "জীবনচর্যা" + +#: plugins/core/gs-desktop-common.c:300 +msgctxt "Menu of Reference" +msgid "News" +msgstr "" + +#: plugins/core/gs-desktop-common.c:303 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "রাজনীতি" + +#: plugins/core/gs-desktop-common.c:306 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "খেলাধুলা" + +#. TRANSLATORS: this is the menu spec main category for Learning +#: plugins/core/gs-desktop-common.c:324 +msgid "Learning" +msgstr "শিক্ষা" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:327 +msgid "Games" +msgstr "খেলা" + +#. TRANSLATORS: this is the menu spec main category for Multimedia +#: plugins/core/gs-desktop-common.c:330 +msgid "Multimedia" +msgstr "মাল্টিমিডিয়া" + +#. TRANSLATORS: this is the menu spec main category for Work +#: plugins/core/gs-desktop-common.c:333 +msgid "Work" +msgstr "কাজ" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:336 +msgid "Reference & News" +msgstr "প্রসঙ্গক্রম এবং খবর" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:339 +msgid "Utilities" +msgstr "উপযোগিতা" + +#. TRANSLATORS: this is the menu spec main category for Dev Tools; it +#. * should be a relatively short label; as an example, in Portuguese and +#. * Spanish the direct translation of "Programming" (noun) is used +#: plugins/core/gs-desktop-common.c:344 +msgid "Dev Tools" +msgstr "" + +#: plugins/core/gs-desktop-common.c:346 +msgid "USB" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-appstream.c:693 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:65 +msgid "OS Updates" +msgstr "OS আপডেট" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:70 +msgid "Includes performance, stability and security improvements." +msgstr "কর্মক্ষমতা, স্থিতিশীলতা ও নিরাপত্তার অগ্রগতি সংযোজিত।" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:55 +msgid "Downloading featured images…" +msgstr "" + +#: plugins/eos/gs-plugin-eos.c:1917 +#, c-format +msgid "Could not launch this application." +msgstr "" + +#: plugins/eos/gs-plugin-eos.c:1974 +msgid "Endless Platform" +msgstr "এন্ডলেস প্রাঙ্গণ" + +#: plugins/eos/gs-plugin-eos.c:1977 +msgid "Framework for applications" +msgstr "এ্যাপ্লিকেশনসমূহের জন্য ফ্রেমওয়ার্ক" + +#: plugins/eos/gs-plugin-eos.c:2126 +msgid "An Endless update with new features and fixes." +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:102 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: plugins/external-appstream/gs-install-appstream.c:104 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:111 +msgid "You need to specify exactly one filename" +msgstr "" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:118 +msgid "This program can only be used by the root user" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:126 +msgid "Failed to validate content type" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:133 +msgid "Failed to copy" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:217 +msgid "Downloading upgrade information…" +msgstr "" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:311 +msgid "Upgrade your Fedora system to the latest features and improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:871 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:2114 +#, c-format +msgid "" +"The app %s is missing its runtime. Update the app to repair this problem." +msgstr "" + +#. TRANSLATORS: status text when downloading the RuntimeRepo +#: plugins/flatpak/gs-flatpak.c:3274 +msgid "Getting runtime source…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:864 plugins/fwupd/gs-plugin-fwupd.c:963 +msgid "Downloading firmware update signature…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:905 plugins/fwupd/gs-plugin-fwupd.c:1009 +msgid "Downloading firmware update metadata…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:1100 +msgid "Downloading firmware update…" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:6 +msgid "Limba Support" +msgstr "" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:7 +msgid "Limba provides developers a way to easily create software bundles" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:205 +msgid "Downloading application ratings…" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:674 +msgid "Downloading shell extension metadata…" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snappy Support" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/steam/gs-plugin-steam.c:600 +msgid "Downloading application page…" +msgstr "" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:6 +msgid "Steam Support" +msgstr "" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:7 +msgid "The ultimate entertainment platform from Valve" +msgstr "" diff --git a/po/bs.po b/po/bs.po new file mode 100644 index 0000000..26d3429 --- /dev/null +++ b/po/bs.po @@ -0,0 +1,2321 @@ +# Bosnian translation for bosnianuniversetranslation +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the bosnianuniversetranslation package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: bosnianuniversetranslation\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"software&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2015-02-26 20:45+0000\n" +"PO-Revision-Date: 2015-03-09 23:40+0100\n" +"Last-Translator: Selma Glavić \n" +"Language-Team: Bosnian \n" +"Language: bs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n" +"%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Poedit 1.7.4\n" +"X-Launchpad-Export-Date: 2015-02-15 06:20+0000\n" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:1 +msgid "GNOME Software" +msgstr "Gnomovi programi" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:2 +msgid "Application manager for GNOME" +msgstr "GNOME aplikacijski menadžer" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:3 +msgid "" +"Software allows you to find and install new applications and system extensions and remove " +"existing installed applications." +msgstr "" +"Programi vam omogućavaju da nađete i instalirate nove aplikacije i sistemska proširenja i " +"uklanjanje postojećih instaliranih aplikacija." + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:4 +msgid "" +"GNOME Software showcases featured and popular applications with useful descriptions and " +"multiple screenshots per application. Applications can be found either through browsing " +"the list of categories or by searching. It also allows you to update your system using an " +"offline update." +msgstr "" +"GNOME Softver prikazuje istaknute i popularne aplikacije s korisnim opisima i više snimki " +"ekrana po aplikaciji. Aplikacije se mogu naći bilo kroz pregledavanje listi ili " +"pretraživanjem. Također omogućava da izvršite ažuriranje sistema koristeći ažuriranje bez " +"pristupa internet mreži." + +#: ../src/app-folder-dialog.ui.h:1 +msgid "Add to Application Folder" +msgstr "Dodaj u Aplikacijski direktorij" + +#: ../src/app-folder-dialog.ui.h:2 ../src/gs-app-folder-dialog.c:336 +#: ../src/gs-shell-details.c:237 ../src/gs-shell-installed.c:536 +msgid "_Cancel" +msgstr "_Odustani" + +#: ../src/app-folder-dialog.ui.h:3 ../src/gs-app-folder-dialog.c:341 +msgid "_Add" +msgstr "_Dodaj" + +#. TRANSLATORS: this is the small blue label on the tili +#. * that tells the user the application is installed +#: ../src/app-tile.ui.h:1 ../src/gs-app-addon-row.c:98 ../src/gs-app-tile.c:75 +#: ../src/gs-app-tile.c:78 ../src/gs-feature-tile.c:70 ../src/gs-popular-tile.c:76 +#: ../src/gs-popular-tile.c:79 ../src/popular-tile.ui.h:1 +msgid "Installed" +msgstr "Instalirano" + +#. TRANSLATORS: this is the application nami +#. set the window title back to default +#. TRANSLATORS: this is the main window title +#: ../src/org.gnome.Software.desktop.in.h:1 ../src/gnome-software.ui.h:3 +#: ../src/gs-application.c:267 ../src/gs-shell.c:161 +msgid "Software" +msgstr "Program" + +#: ../src/org.gnome.Software.desktop.in.h:2 +msgid "Add, remove or update software on this computer" +msgstr "Dodaj, ukloni ili ažuriraj prorame na ovom račuanru" + +#: ../src/org.gnome.Software.desktop.in.h:3 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;" +"Store;" +msgstr "" +"Ažuriranje;Nadogradnja;Izvor;Repozicija;Postavke;Instalacija;Deinstalacija;Program;Sofver;" +"App;Radnja;" + +#: ../src/gnome-software-local-file.desktop.in.h:1 +msgid "Software Install" +msgstr "Instalacija Softvera" + +#: ../src/gnome-software-local-file.desktop.in.h:2 +msgid "Install selected software on the system" +msgstr "Instaliraj selektovani softver na sistem" + +#: ../src/gnome-software.ui.h:1 +msgid "Select All" +msgstr "Označi sve" + +#: ../src/gnome-software.ui.h:2 +msgid "Select None" +msgstr "Ne izabiraj ništa" + +#. vim: set noexpandtab: +#: ../src/gnome-software.ui.h:4 ../src/gs-sources-dialog.ui.h:2 +#: ../src/gs-update-dialog.ui.h:1 +msgid "Go back" +msgstr "Idi nazad" + +#. Translators: A label for a button to show all available software. +#: ../src/gnome-software.ui.h:6 +msgid "_All" +msgstr "_Sve" + +#. Translators: A label for a button to show only software which is already installed. +#: ../src/gnome-software.ui.h:8 +msgid "_Installed" +msgstr "_Instalirano" + +#. Translators: A label for a button to show only updates which are available to install. +#: ../src/gnome-software.ui.h:10 +msgid "_Updates" +msgstr "_Ažuriranja" + +#: ../src/gnome-software.ui.h:11 +msgid "Restart & _Install" +msgstr "Pokrenuti &_Instalirati" + +#: ../src/gnome-software.ui.h:12 +msgid "Select" +msgstr "Izaberi" + +#: ../src/gnome-software.ui.h:13 +msgid "Check for updates" +msgstr "Provjeri ažuriranja" + +#: ../src/gs-app-folder-dialog.c:325 +msgid "Folder Name" +msgstr "Ime direktorija" + +#. TRANSLATORS: this is the title of the about window +#: ../src/gs-application.c:265 +msgid "About Software" +msgstr "O programu" + +#. TRANSLATORS: well, we seem to think so, anyway +#: ../src/gs-application.c:270 +msgid "A nice way to manage the software on your system." +msgstr "Dobar put za upravljanje programima na vašem sistemu." + +#: ../src/gs-application.c:274 +msgid "translator-credits" +msgstr "" +" Haris Helac https://launchpad.net/~hhelac1\n" +" Samir Ribić https://launchpad.net/~megaribi\n" +" Selma Glavić https://launchpad.net/~sglavic1" + +#: ../src/gs-application.c:565 +msgid "Enter GApplication service mode" +msgstr "Ući u GAaplikacijski servisni mod" + +#. TRANSLATORS: this is a command linije option +#: ../src/gs-application.c:568 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Pokreni mod: ili 'ažuriranja','ažurirano','instalirano' ili 'pregled'" + +#: ../src/gs-application.c:568 +msgid "MODE" +msgstr "MODE" + +#: ../src/gs-application.c:570 +msgid "Search for applications" +msgstr "Potraga za aplikacijom" + +#: ../src/gs-application.c:570 +msgid "SEARCH" +msgstr "SEARCH" + +#: ../src/gs-application.c:572 +msgid "Show application details" +msgstr "Prikaži aplikacijske detalje" + +#: ../src/gs-application.c:572 +msgid "ID" +msgstr "ID" + +#: ../src/gs-application.c:574 +msgid "Open a local package file" +msgstr "Otvori lokalnu paketnu datoteku" + +#: ../src/gs-application.c:574 +msgid "FILENAME" +msgstr "IME FAJLA" + +#: ../src/gs-application.c:576 +msgid "Show verbose debugging information" +msgstr "Prikaži verbalne otklonjene greške informacija" + +#: ../src/gs-application.c:578 +msgid "Show profiling information for the service" +msgstr "Prikaži profilirane informacije za servise" + +#: ../src/gs-application.c:580 +msgid "Prefer local file sources to AppStream" +msgstr "Preferiraj lokanu izvornu datoteku prema AppStream-u" + +#. TRANSLATORS: this is a label that describes an application +#. * that has been queued for installation +#: ../src/gs-app-addon-row.c:93 ../src/gs-app-row.c:214 ../src/gs-shell-details.ui.h:4 +msgid "Pending" +msgstr "U čekanju" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is the small blue label on the tili +#. * that tells the user the application is being installing +#: ../src/gs-app-addon-row.c:102 ../src/gs-app-row.c:240 ../src/gs-app-tile.c:84 +#: ../src/gs-app-tile.c:87 +msgid "Installing" +msgstr "Instaliranje" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is the small blue label on the tili +#. * that tells the user the application is being removed +#: ../src/gs-app-addon-row.c:106 ../src/gs-app-row.c:249 ../src/gs-app-tile.c:93 +#: ../src/gs-app-tile.c:96 +msgid "Removing" +msgstr "Uklanjanje" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to bje easily installed +#: ../src/gs-app-row.c:198 +msgid "Visit website" +msgstr "Posjetite internet stranicu" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to bje easily installed. +#. * The ellipsis indicates that further steps are required +#: ../src/gs-app-row.c:203 +msgid "Install…" +msgstr "Instaliraj..." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: ../src/gs-app-row.c:211 +msgid "Cancel" +msgstr "Odustanite" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to bje easily installed +#. TRANSLATORS: button text +#: ../src/gs-app-row.c:221 ../src/gs-utils.c:313 +msgid "Install" +msgstr "Instalirajte" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to bje easily removed +#. TRANSLATORS: this is button text to remove the application +#: ../src/gs-app-row.c:229 ../src/gs-page.c:176 +msgid "Remove" +msgstr "Uklonite" + +#. TRANSLATORS: this is the small blue label on the tili +#. * that tells the user there is an update for the installed +#. * application available +#: ../src/gs-app-tile.c:102 ../src/gs-app-tile.c:106 ../src/gs-feature-tile.c:75 +#: ../src/gs-popular-tile.c:85 ../src/gs-popular-tile.c:89 +msgid "Updates" +msgstr "Ažuriranja" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: ../src/gs-category.c:207 +msgid "Other" +msgstr "Ostali" + +#. TRANSLATORS: this is a what we usi in notifications if the app's nami is unknown +#: ../src/gs-dbus-helper.c:312 +msgid "An application" +msgstr "Aplikacija" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: ../src/gs-dbus-helper.c:318 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s zahtijeva podršku za dodatni format datoteke." + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:320 +msgid "Additional MIME Types Required" +msgstr "Potrebni dodatni MIME tipovi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: ../src/gs-dbus-helper.c:324 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s zahtijeva dodatne fontove" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:326 +msgid "Additional Fonts Required" +msgstr "Potrebni dodatni fontovi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: ../src/gs-dbus-helper.c:330 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s zahtijeva dodatne multimedijalne kodeke" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:332 +msgid "Additional Multimedia Codecs Required" +msgstr "Potrebni dodatni multimedijalni kodeci" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: ../src/gs-dbus-helper.c:336 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s zahtijeva dodatne drajvere za štampač" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:338 +msgid "Additional Printer Drivers Required" +msgstr "Potrebni dodatni drajveri za printer" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: ../src/gs-dbus-helper.c:342 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s zahtijeva dodatne pakete." + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:344 +msgid "Additional Packages Required" +msgstr "Potrebni dodatni paketi" + +#. TRANSLATORS: this is a button that launches gnome-software +#: ../src/gs-dbus-helper.c:353 +msgid "Find in Software" +msgstr "Nađi u softveru" + +#. vim: set noexpandtab: +#: ../src/gs-first-run-dialog.ui.h:1 +msgid "Welcome" +msgstr "Dobrodošli" + +#: ../src/gs-first-run-dialog.ui.h:2 +msgid "Welcome to Software" +msgstr "Dobrodošli u softver" + +#: ../src/gs-first-run-dialog.ui.h:3 +msgid "" +"Software lets you install all the software you need, all from one place. See our " +"recommendations, browse the categories, or search for the applications you want." +msgstr "" +"Softver dopušta instalaciju svih softvera koji su potrebni, svih sa jednog mjesta. " +"Pogledaj naše preporuke, pretraži kategorije, ili traži aplikacije koje želiš." + +#: ../src/gs-first-run-dialog.ui.h:4 +msgid "_Let’s Go Shopping" +msgstr "_Idemo u šoping" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: ../src/gs-history-dialog.c:83 +msgctxt "app status" +msgid "Removed" +msgstr "Uklonjeno" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: ../src/gs-history-dialog.c:89 +msgctxt "app status" +msgid "Installed" +msgstr "Instalirano" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: ../src/gs-history-dialog.c:94 +msgctxt "app status" +msgid "Updated" +msgstr "Ažurirano" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: ../src/gs-history-dialog.c:100 +msgctxt "app status" +msgid "Unknown" +msgstr "Nepoznat" + +#. vim: set noexpandtab: +#: ../src/gs-history-dialog.ui.h:1 +msgid "History" +msgstr "Povjest" + +#. TRANSLATORS: this is when the offline update failed +#: ../src/gs-offline-updates.c:54 +msgid "Failed To Update" +msgstr "Nije uspjelo ažuriranje" + +#. TRANSLATORS: the transaction could not bje completed +#. * as a previous transaction was unfinished +#: ../src/gs-offline-updates.c:60 +msgid "A previous update was unfinished." +msgstr "Prethodno ažuriranje je nedovršeno." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: ../src/gs-offline-updates.c:70 +msgid "Network access was required but not available." +msgstr "Pristup mreži je bio potreban ali ne i dostupan." + +#. TRANSLATORS: if the package is not signed correctly +#. * +#: ../src/gs-offline-updates.c:79 +msgid "An update was not signed in the correct way." +msgstr "Ažuriranje nije pravilno označeno." + +#. TRANSLATORS: the transaction failed in a way the user +#. * probably cannot comprehend. Package management systems +#. * really are tih suck. +#: ../src/gs-offline-updates.c:89 +msgid "The update could not be completed." +msgstr "Ažuriranje se ne može dovršiti." + +#. TRANSLATORS: the user aborted the update manually +#: ../src/gs-offline-updates.c:94 +msgid "The update was cancelled." +msgstr "Ožuriranje je prekinuto." + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: ../src/gs-offline-updates.c:100 +msgid "An offline update was requested but no packages required updating." +msgstr "Zahtjevano je izvan mrežno ažuriranje ali paketi nisu zatražili ažuriranje." + +#. TRANSLATORS: we ran out of disk space +#: ../src/gs-offline-updates.c:104 +msgid "No space was left on the drive." +msgstr "Nema prostora na disku." + +#. TRANSLATORS: the update process failed in a general +#. * way, usually this message will come from source distros +#. * liki gentoo +#: ../src/gs-offline-updates.c:112 +msgid "An update failed to install correctly." +msgstr "Ažuriranje nije ispravno instalirano." + +#. TRANSLATORS: We didn't handle the error type +#: ../src/gs-offline-updates.c:117 +msgid "The offline update failed in an unexpected way." +msgstr "Izvan mrežno ažuriranje neočekivanim putem nije uspjelo." + +#. TRANSLATORS: these are geeky messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: ../src/gs-offline-updates.c:126 +msgid "Detailed errors from the package manager follow:" +msgstr "Detaljnije greške upravnika paketa u nastavku:" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: ../src/gs-page.c:161 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "Jeste li sigurni da želite ukloniti %s?" + +#. TRANSLATORS: longer dialog text +#: ../src/gs-page.c:173 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "%s će biti obrisan, i morat ćete ga instalirati za ponovo korišzenje." + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: ../src/gs-plugin-loader.c:932 +msgid "OS Updates" +msgstr "Auriranje OS" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: ../src/gs-plugin-loader.c:937 +msgid "Includes performance, stability and security improvements." +msgstr "Uključuje performanse, stabilnost i sigurnosna poboljšanja." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't bje listed for some reason +#: ../src/gs-plugin-loader.c:1521 ../src/gs-shell-extras.c:376 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Proširenja koda nisu dostupna za %s format." + +#: ../src/gs-plugin-loader.c:1524 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can play this format " +"can be found on the website." +msgstr "" +"Informacije o %s, kao i mogućnost za dobijanje kodeka koji može pustiti ovaj format mogu " +"biti nađeni na internet stranici." + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: ../src/gs-screenshot-image.c:242 +msgid "Screenshot not found" +msgstr "Snimak ekrana nije nađen" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: ../src/gs-screenshot-image.c:260 +msgid "Failed to load image" +msgstr "Nije uspjelo učitavanje slike" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: ../src/gs-screenshot-image.c:390 +msgid "Screenshot size not found" +msgstr "Veličina snimke ekrana nije nađena." + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: ../src/gs-screenshot-image.c:409 +msgid "Could not create cache" +msgstr "Nije moguće kreirati predmemoriju" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: ../src/gs-screenshot-image.c:439 +msgid "Screenshot not valid" +msgstr "Snimak ekrana nije tačan" + +#. TRANSLATORS: this is when networking is not available +#: ../src/gs-screenshot-image.c:455 +msgid "Screenshot not available" +msgstr "Snimak ekrana nije dostupan" + +#: ../src/gs-screenshot-image.c:511 +msgid "Screenshot" +msgstr "Slika zaslona" + +#. TRANSLATORS: separator for a list of items +#. TRANSLATORS: This is how we join the licences and can +#. * bje considered a "Conjunctive AND Operator" according +#. * to the SPDX specification. For example: +#. * "LGPL-2.1 and MIT and BSD-2-Clause" +#: ../src/gs-shell-extras.c:144 ../src/plugins/gs-plugin-appstream.c:410 +msgid " and " +msgstr " and " + +#. TRANSLATORS: separator for a list of items +#: ../src/gs-shell-extras.c:147 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for codec installation. %s will bje replaced by actual codec nami(s) +#: ../src/gs-shell-extras.c:170 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Dostupan softver za %s" +msgstr[1] "Dostupan softver za %s" +msgstr[2] "Dostupan softver za %s" + +#: ../src/gs-shell-extras.c:211 +msgid "Unable to Find Requested Software" +msgstr "Ne mogu da nađem zahtijevani softver" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: ../src/gs-shell-extras.c:310 +#, c-format +msgid "%s not found" +msgstr "%s nije nađen" + +#. TRANSLATORS: hyperlink title +#: ../src/gs-shell-extras.c:314 +msgid "on the website" +msgstr "na web stranici" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't bje listed for some reason +#: ../src/gs-shell-extras.c:321 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "Nema dostupnih aplikacija koje pružaju datoteku %s" + +#. TRANSLATORS: first %s is the codec nami, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:325 ../src/gs-shell-extras.c:336 ../src/gs-shell-extras.c:347 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications might be " +"found %s." +msgstr "" +"Informacije o %s, kao i opcije za dobijanje nedostajućih aplikacija mogu biti nađeni na " +"%s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't bje listed for some reason +#: ../src/gs-shell-extras.c:332 ../src/gs-shell-extras.c:354 +#, c-format +msgid "No applications are available for %s support." +msgstr "Nema dostupnih aplikacija koje pružaju podršku za %s" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't bje listed for some reason +#: ../src/gs-shell-extras.c:343 +#, c-format +msgid "%s is not available." +msgstr "%s nije dostupan" + +#. TRANSLATORS: first %s is the codec nami, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:358 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that can support " +"this format might be found %s." +msgstr "" +"Informacije o %s, kao i opcije za dobijanje aplikacije koja podržava ovaj format mogu " +"biti nađeni na %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't bje listed for some reason +#: ../src/gs-shell-extras.c:365 +#, c-format +msgid "No addon fonts are available for %s support." +msgstr "Nema dodatnih fontova koji pružaju podršku za %s" + +#. TRANSLATORS: first %s is the codec nami, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:369 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts might be found " +"%s." +msgstr "" +"Informacije o %s, kao i opcije za dobijanje dodatnih fontova mogu biti nađeni na %s." + +#. TRANSLATORS: first %s is the codec nami, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:380 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can play this format " +"might be found %s." +msgstr "" +"Informacije o %s, kao i opcije za dobijanje kodeka koji mogu izvoditi ovaj format mogu " +"biti nađeni na %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't bje listed for some reason +#: ../src/gs-shell-extras.c:387 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Nema Plazma resursa koji pružaju podršku za %s" + +#. TRANSLATORS: first %s is the codec nami, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:391 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma resources might " +"be found %s." +msgstr "" +"Informacije o %s, kao i opcije za dobijanje dodatnih Plasma resursa mogu biti nađeni na " +"%s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't bje listed for some reason +#: ../src/gs-shell-extras.c:398 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Nijedan drajver printera nije dostupan za %s." + +#. TRANSLATORS: first %s is the codec nami, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:402 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that supports this " +"printer might be found %s." +msgstr "" +"Informacije o %s, kao i opcije za dobijanje drajvera koji podržava ovaj printer mogu biti " +"nađeni na %s." + +#: ../src/gs-shell-extras.c:448 +msgid "this website" +msgstr "ova web stranica" + +#. TRANSLATORS: no codecs were found. First %s will bje replaced by actual codec nami(s), second %s is a link titled "this website" +#: ../src/gs-shell-extras.c:452 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see %s for more " +"information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see %s for more " +"information." +msgstr[0] "" +"Nažalost, %s koga tražite ne može se naći. Molim pogledajte %s za više informacija." +msgstr[1] "" +"Nažalost, %s koga tražite ne može se naći. Molim pogledajte %s za više informacija." +msgstr[2] "" +"Nažalost, %s koga tražite ne može se naći. Molim pogledajte %s za više informacija." + +#: ../src/gs-shell-extras.c:534 ../src/gs-shell-extras.c:583 ../src/gs-shell-extras.c:634 +msgid "Failed to find any search results" +msgstr "Neuspjelo nalaženje rezultata pretrage" + +#: ../src/gs-shell-extras.c:804 +#, c-format +msgid "%s file format" +msgstr "%s datotečni format" + +#. vim: set noexpandtab: +#: ../src/gs-shell-extras.ui.h:1 +msgid "Codecs page" +msgstr "Stranica kodeka" + +#. TRANSLATORS: button text in the header when an application +#. * can bje installed +#: ../src/gs-shell-details.c:176 ../src/gs-shell-details.ui.h:2 +msgid "_Install" +msgstr "_Instaliraj" + +#. TRANSLATORS: button text in the header when an application +#. * is in the process of being installed +#: ../src/gs-shell-details.c:187 +msgid "_Installing" +msgstr "_Instaliranje" + +#. TRANSLATORS: this is a button that allows the apps to +#. * bje installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software sources or the liki +#: ../src/gs-shell-details.c:204 +msgid "_Install…" +msgstr "_Instaliraj" + +#. TRANSLATORS: button text in the header when an application can bje erased +#: ../src/gs-shell-details.c:224 ../src/gs-shell-details.ui.h:3 +msgid "_Remove" +msgstr "_Obriši" + +#. TRANSLATORS: button text in the header when an application can bje installed +#: ../src/gs-shell-details.c:231 +msgid "_Removing" +msgstr "_Uklanjanje" + +#. TRANSLATORS: this is where the licence is not known +#: ../src/gs-shell-details.c:578 +msgctxt "license" +msgid "Unknown" +msgstr "Nepoznata" + +#. TRANSLATORS: this is where the version is not known +#: ../src/gs-shell-details.c:591 +msgctxt "version" +msgid "Unknown" +msgstr "Nepoznata" + +#. TRANSLATORS: this is where the size is being worked out +#: ../src/gs-shell-details.c:597 +msgctxt "size" +msgid "Calculating…" +msgstr "Izračunavam…" + +#. TRANSLATORS: this is where the size is not known +#: ../src/gs-shell-details.c:600 +msgctxt "size" +msgid "Unknown" +msgstr "Nepoznat" + +#. TRANSLATORS: this is where the updated date is not known +#: ../src/gs-shell-details.c:612 +msgctxt "updated" +msgid "Never" +msgstr "Nikad" + +#. TRANSLATORS: this is the application isn't in any +#. * defined mijenu category +#: ../src/gs-shell-details.c:627 +msgctxt "mijenu category" +msgid "None" +msgstr "Ništa" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: ../src/gs-shell-details.c:637 +msgctxt "origin" +msgid "Unknown" +msgstr "Nepoznat" + +#: ../src/gs-shell-details.c:895 ../src/gs-utils.c:162 +msgid "Sorry, this did not work" +msgstr "Žao nam je, to ne radi" + +#. vim: set noexpandtab: +#: ../src/gs-shell-details.ui.h:1 +msgid "Details page" +msgstr "Stranica s detaljima" + +#: ../src/gs-shell-details.ui.h:5 +msgid "Software Source Included" +msgstr "Softverski izvor uključen" + +#: ../src/gs-shell-details.ui.h:6 +msgid "" +"This application includes a software source which provides updates, as well as access to " +"other software." +msgstr "" +"Ova aplikacije uključuje izvor softvera koji omogućava ažuriranje, kao i pristup ostalom " +"softveru." + +#: ../src/gs-shell-details.ui.h:7 +msgid "No Software Source Included" +msgstr "Izvor softvera nije uključen" + +#: ../src/gs-shell-details.ui.h:8 +msgid "" +"This application does not include a software source. It will not be updated with new " +"versions." +msgstr "Ova aplikacija ne uključuje izvor softvera. I neće biti ažuriran sa novom verzijom." + +#: ../src/gs-shell-details.ui.h:9 +msgid "This software is already provided by your distribution and should not be replaced." +msgstr "Ovaj softver je već dobijate sa svojom distribucijom i ne treba ga zamijeniti." + +#. Translators: a repository file used for installing software has been discovered. +#: ../src/gs-shell-details.ui.h:11 +msgid "Software Source Identified" +msgstr "Izvor softvera identifikovan" + +#: ../src/gs-shell-details.ui.h:12 +msgid "" +"Adding this software source will give you access to additional software and upgrades." +msgstr "" +"Dodavanjem ovog izvornog softvera daće ti pristup dodatnim softverima i nadogradnjama." + +#: ../src/gs-shell-details.ui.h:13 +msgid "Only use software sources that you trust." +msgstr "Koristiti samo izvorni softver kojem vjerujete." + +#: ../src/gs-shell-details.ui.h:14 +msgid "Internet Only Application" +msgstr "Samo internet aplikacija" + +#: ../src/gs-shell-details.ui.h:15 +msgid "This application can only be used when there is an active internet connection." +msgstr "Ova aplikacija može biti korištena samo kada postoji aktivna internet konekcija." + +#: ../src/gs-shell-details.ui.h:16 +msgid "_Website" +msgstr "_Web stranica" + +#: ../src/gs-shell-details.ui.h:17 +msgid "_History" +msgstr "_Historijat" + +#. Translators: A label for a button to execute the selected application. +#: ../src/gs-shell-details.ui.h:19 +msgid "_Launch" +msgstr "_Pokreni" + +#: ../src/gs-shell-details.ui.h:20 +msgid "Details" +msgstr "Detalji" + +#: ../src/gs-shell-details.ui.h:21 ../src/gs-sources-dialog.ui.h:9 +msgid "Version" +msgstr "Verzija" + +#: ../src/gs-shell-details.ui.h:22 +msgid "Updated" +msgstr "Ažurirano" + +#: ../src/gs-shell-details.ui.h:23 +msgid "Category" +msgstr "Kategorija" + +#: ../src/gs-shell-details.ui.h:24 +msgid "Source" +msgstr "Izvor" + +#: ../src/gs-shell-details.ui.h:25 +msgid "License" +msgstr "Licenca" + +#: ../src/gs-shell-details.ui.h:26 +msgid "Size" +msgstr "Veličina" + +#: ../src/gs-shell-details.ui.h:27 +msgid "Developer" +msgstr "Razvojni programer" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the main category for Add-ons +#: ../src/gs-shell-details.ui.h:28 ../src/gs-shell-installed.c:451 +#: ../src/gs-update-list.c:89 ../src/plugins/menu-spec-common.c:210 +msgid "Add-ons" +msgstr "Dodaci" + +#: ../src/gs-shell-details.ui.h:29 +msgid "Selected add-ons will be installed with the application." +msgstr "Izabrana proširenja će biti instalirana uz aplikaciju." + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: ../src/gs-shell-installed.c:441 +msgid "System Applications" +msgstr "Sistemske aplikacije" + +#: ../src/gs-shell-installed.c:544 +msgid "Click on items to select them" +msgstr "Kliknite na stavke da bi ih označili" + +#. vim: set noexpandtab: +#: ../src/gs-shell-installed.ui.h:1 +msgid "Installed page" +msgstr "Instalirana stranica" + +#: ../src/gs-shell-installed.ui.h:2 +msgid "_Add to Folder…" +msgstr "_Dodaj u mapu" + +#: ../src/gs-shell-installed.ui.h:3 +msgid "_Move to Folder…" +msgstr "_Pomakni u mapu" + +#: ../src/gs-shell-installed.ui.h:4 +msgid "_Remove from Folder" +msgstr "_Ukloni iz mape" + +#. TRANSLATORS: this is a heading for audio applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:331 +msgid "Recommended Audio Applications" +msgstr "Preporučena zvučna aplikacija" + +#. TRANSLATORS: this is a heading for games which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:336 +msgid "Recommended Games" +msgstr "Preporučene igre" + +#. TRANSLATORS: this is a heading for graphics applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:341 +msgid "Recommended Graphics Applications" +msgstr "Preporučene grafičke aplikacije" + +#. TRANSLATORS: this is a heading for office applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:346 +msgid "Recommended Office Applications" +msgstr "Preporučene uredske aplikacije" + +#. vim: set noexpandtab: +#: ../src/gs-shell-overview.ui.h:1 +msgid "Overview page" +msgstr "Pregled stranice" + +#: ../src/gs-shell-overview.ui.h:2 +msgid "Featured Application" +msgstr "Istaknute aplikacije" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: ../src/gs-shell-overview.ui.h:4 +msgid "Editor's Picks" +msgstr "Odabir urednika" + +#: ../src/gs-shell-overview.ui.h:5 +msgid "Categories" +msgstr "Kategorije" + +#: ../src/gs-shell-overview.ui.h:6 +msgid "No Application Data Found" +msgstr "Podatak o aplikaciji nije pronađen" + +#. vim: set noexpandtab: +#: ../src/gs-shell-search.ui.h:1 +msgid "Search page" +msgstr "Pretraži stranicu" + +#: ../src/gs-shell-search.ui.h:2 +msgid "No Application Found" +msgstr "Aplikacija nije pronađena" + +#. TRANSLATORS: Time in 24h format +#: ../src/gs-shell-updates.c:145 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: ../src/gs-shell-updates.c:148 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../src/gs-shell-updates.c:154 +msgid "Yesterday, %R" +msgstr "Jučer. %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: ../src/gs-shell-updates.c:158 +msgid "Yesterday, %l:%M %p" +msgstr "Jučer, %l:%M %p" + +#: ../src/gs-shell-updates.c:161 +msgid "Two days ago" +msgstr "Prije dva dana" + +#: ../src/gs-shell-updates.c:163 +msgid "Three days ago" +msgstr "Prije tri dana" + +#: ../src/gs-shell-updates.c:165 +msgid "Four days ago" +msgstr "Prije četiri dana" + +#: ../src/gs-shell-updates.c:167 +msgid "Five days ago" +msgstr "Prije pet dana" + +#: ../src/gs-shell-updates.c:169 +msgid "Six days ago" +msgstr "Prije šest dana" + +#: ../src/gs-shell-updates.c:171 +msgid "One week ago" +msgstr "Prošle sedmice" + +#: ../src/gs-shell-updates.c:173 +msgid "Two weeks ago" +msgstr "Prije dvije sedmice" + +#. TRANSLATORS: This is the date string with: day number, month nami, year. +#. i.e. "25 May 2012" +#: ../src/gs-shell-updates.c:177 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the updates are being downloaded +#: ../src/gs-shell-updates.c:196 +msgid "Downloading new updates…" +msgstr "Preuzimanje novih ažuriranja…" + +#. TRANSLATORS: the update panel is doing *something* vague +#: ../src/gs-shell-updates.c:200 +msgid "Looking for new updates…" +msgstr "U potrazi za novim ažuriranjima…" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:255 +msgid "Setting up updates…" +msgstr "Podešavanje ažiriranja…" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:256 ../src/gs-shell-updates.c:262 +msgid "(This could take a while)" +msgstr "( Ovo može potrajati )" + +#. TRANSLATORS: this is when the updates panel is starting up +#: ../src/gs-shell-updates.c:267 +msgid "Checking for updates…" +msgstr "Provjera ažuriranja…" + +#. TRANSLATORS: This is the time when we last checked for updates +#: ../src/gs-shell-updates.c:401 +#, c-format +msgid "Last checked: %s" +msgstr "Provjerimo: %s" + +#. TRANSLATORS: can't do updates check +#: ../src/gs-shell-updates.c:777 +msgid "No Network" +msgstr "Nema mreže" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:781 +msgid "Internet access is required to check for updates." +msgstr "Potreban je pristup internetu za provjere ažuriranja." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:785 +msgid "Network Settings" +msgstr "Mrežne postavke" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: ../src/gs-shell-updates.c:804 +msgid "Charges may apply" +msgstr "Moguća je novčana naknada" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:808 +msgid "Checking for updates while using mobile broadband could cause you to incur charges." +msgstr "" +"Provjera ažuriranja tijekom korištenja mobilnog interneta može uzrokovati dodatnu novčanu " +"naknadu." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:812 +msgid "Check Anyway" +msgstr "Provjerite svakom slučaju" + +#. vim: set noexpandtab: +#: ../src/gs-shell-updates.ui.h:1 +msgid "Updates page" +msgstr "Stranica ažuriranja" + +#: ../src/gs-shell-updates.ui.h:2 +msgid "Software is up to date" +msgstr "Softver je do datuma" + +#: ../src/gs-shell-updates.ui.h:3 +msgid "Checking for updates when using mobile broadband could cause you to incur charges" +msgstr "" +"Provjera ažuriranja prilikom korištenja mobilnog interneta može uzrokovati dodatnu " +"novčanu naknadu." + +#: ../src/gs-shell-updates.ui.h:4 +msgid "_Check Anyway" +msgstr "_Provjerite svakom slučaju" + +#: ../src/gs-shell-updates.ui.h:5 +msgid "Go online to check for updates" +msgstr "Provjeri ažuriranja na internetu" + +#: ../src/gs-shell-updates.ui.h:6 +msgid "_Network Settings" +msgstr "_Mrežne postavke" + +#. TRANSLATORS: This string describes a software source that +#. has no software installed from it. +#: ../src/gs-sources-dialog.c:96 +msgid "No software installed" +msgstr "Nema instaliranog softvera" + +# translations. +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software source. +#: ../src/gs-sources-dialog.c:100 +#, c-format +msgid "%i application installed" +msgid_plural "%i applications installed" +msgstr[0] "%i aplikacija instalirana" +msgstr[1] "%i aplikacije instalirane" +msgstr[2] "%i aplikacija instalirano" + +# translations. +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software source. +#: ../src/gs-sources-dialog.c:106 +#, c-format +msgid "%i add-on installed" +msgid_plural "%i add-ons installed" +msgstr[0] "%i proširenje instalirano" +msgstr[1] "%i proširenja instalirana" +msgstr[2] "%i proširenja instalirano" + +# translations. +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of applications. +#: ../src/gs-sources-dialog.c:113 +#, c-format +msgid "%i application" +msgid_plural "%i applications" +msgstr[0] "%i aplikacija" +msgstr[1] "%i aplikacije" +msgstr[2] "%i aplikacija" + +# translations. +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of add-ons. +#: ../src/gs-sources-dialog.c:119 +#, c-format +msgid "%i add-on" +msgid_plural "%i add-ons" +msgstr[0] "%i proširenje" +msgstr[1] "%i proširenja" +msgstr[2] "%i proširenja" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: ../src/gs-sources-dialog.c:126 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s i %s instaliran" +msgstr[1] "%s i %s instalirani" +msgstr[2] "%s i %s instalirani" + +#: ../src/gs-sources-dialog.c:315 ../src/gs-sources-dialog.ui.h:13 +msgid "Remove Source" +msgstr "Ukloni izvor" + +#: ../src/gs-sources-dialog.c:330 +msgid "Removing…" +msgstr "Uklanjanje…" + +#. vim: set noexpandtab: +#: ../src/gs-sources-dialog.ui.h:1 +msgid "Software Sources" +msgstr "Izvoi softvera" + +#: ../src/gs-sources-dialog.ui.h:3 +msgid "No sources found." +msgstr "Izvor nije pronađen." + +#: ../src/gs-sources-dialog.ui.h:4 +msgid "Software sources give you access to additional software." +msgstr "Izvor softvera daje pristup dodatnom softveru." + +#: ../src/gs-sources-dialog.ui.h:5 +msgid "Removing a source will also remove any software you have installed from it." +msgstr "Uklanjanje izvora također će ukloniti svaki softver koji je instaliran putem njega." + +#: ../src/gs-sources-dialog.ui.h:6 +msgid "No software installed from this source" +msgstr "Sofver nije instaliran putem ovog izvora." + +#: ../src/gs-sources-dialog.ui.h:7 +msgid "Installed from this Source" +msgstr "Instalirano iz ovog Izvorom." + +#: ../src/gs-sources-dialog.ui.h:8 +msgid "Source Details" +msgstr "Detalji izvora" + +#: ../src/gs-sources-dialog.ui.h:10 +msgid "Last Checked" +msgstr "Posljednja provjera" + +#: ../src/gs-sources-dialog.ui.h:11 +msgid "Added" +msgstr "Dodano" + +#: ../src/gs-sources-dialog.ui.h:12 +msgid "Website" +msgstr "Veb stranica" + +#. TRANSLATORS: this is where the packager did not write a +#. * description for the update +#: ../src/gs-update-dialog.c:114 +msgid "No update description available." +msgstr "Opis ažuriramka moke dostupan." + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: ../src/gs-update-dialog.c:173 +msgid "Installed Updates" +msgstr "Instalirana ažuriranja" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window +#: ../src/gs-update-dialog.c:187 +#, c-format +msgid "Installed on %s" +msgstr "Instalirano na %s" + +#: ../src/gs-update-monitor.c:99 +msgid "Software Updates Available" +msgstr "Dostupna softverska ažuriranja" + +#: ../src/gs-update-monitor.c:100 +msgid "Important OS and application updates are ready to be installed" +msgstr "Važna OS i aplikacijska ažuriranja su spremna za instalaciju" + +#: ../src/gs-update-monitor.c:103 +msgid "View" +msgstr "Prikaz" + +#: ../src/gs-update-monitor.c:104 +msgid "Not Now" +msgstr "Ne sada" + +# translations. +#: ../src/gs-update-monitor.c:144 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Softversko ažuriranje je instalirano" +msgstr[1] "Softverska ažuriranja su instalirana" +msgstr[2] "Softverska ažuriranja su instalirana" + +# translations. +#. TRANSLATORS: message when we've donje offline updates +#: ../src/gs-update-monitor.c:148 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "Važno OS ažuriranje je instalirano." +msgstr[1] "Važna OS ažuriranja su instalirana." +msgstr[2] "Važna OS ažuriranja su instalirana." + +#: ../src/gs-update-monitor.c:154 +msgid "Software Updates Failed" +msgstr "Softversko ažuriranje nije uspjelo" + +#. TRANSLATORS: message when we offline updates have failed +#: ../src/gs-update-monitor.c:156 +msgid "An important OS update failed to be installed." +msgstr "Instalacija važnog OS ažuriranja nije uspjela." + +#: ../src/gs-update-monitor.c:164 +msgid "Review" +msgstr "Recenzija" + +#: ../src/gs-update-monitor.c:166 +msgid "Show Details" +msgstr "Prikaži detalje" + +#: ../src/gs-update-monitor.c:167 +msgid "OK" +msgstr "U redu" + +#. vim: set noexpandtab: +#: ../src/gs-star-widget.ui.h:1 +msgid "One Star" +msgstr "Jedna zvijezda" + +#: ../src/gs-star-widget.ui.h:2 +msgid "Two Stars" +msgstr "Dvije zvijezde" + +#: ../src/gs-star-widget.ui.h:3 +msgid "Three Stars" +msgstr "Tri zvijezde" + +#: ../src/gs-star-widget.ui.h:4 +msgid "Four Stars" +msgstr "Četiri zvijezde" + +#: ../src/gs-star-widget.ui.h:5 +msgid "Five Stars" +msgstr "Pet zvijezda" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: ../src/gs-utils.c:136 +#, c-format +msgid "%s is now installed" +msgstr "%s je sad instaliran" + +#. TRANSLATORS: this is button that opens the newly installed application +#: ../src/gs-utils.c:140 +msgid "Launch" +msgstr "Pokreni" + +#. TRANSLATORS: this is when the install fails +#: ../src/gs-utils.c:166 +#, c-format +msgid "Installation of %s failed." +msgstr "Instalacija %s nije uspjela." + +#. TRANSLATORS: this is when the remove fails +#: ../src/gs-utils.c:171 +#, c-format +msgid "Removal of %s failed." +msgstr "Uklanjanje %s nije uspjelo." + +#. TRANSLATORS: window title +#: ../src/gs-utils.c:244 +msgid "Install Third-Party Software?" +msgstr "Instaliraj softver treće strane?" + +#. TRANSLATORS: window title +#: ../src/gs-utils.c:248 +msgid "Enable Third-Party Software Source?" +msgstr "Uključi izvore softvera treće strane?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application nami, e.g. "Firefox" +#. * 2. Software source nami, e.g. fedora-optional +#. +#: ../src/gs-utils.c:266 +#, c-format +msgid "" +"%s is not free " +"and open source software, and is provided by “%s”." +msgstr "" +"%s nijeslobodan " +"softver otvorenog koda, i pruža ga “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application nami, e.g. "Firefox" +#. * 2. Software source nami, e.g. fedora-optional +#: ../src/gs-utils.c:276 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s je pružen od “%s”." + +#. TRANSLATORS: a software source is a repo +#: ../src/gs-utils.c:286 +msgid "This software source must be enabled to continue installation." +msgstr "Izvor softvera mora biti omogućen za nastavak instalacije-" + +#. TRANSLATORS: Laws are geographical, urgh... +#: ../src/gs-utils.c:296 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Možda je nelegalno instalirati ili koristiti %s u nekim zemljama." + +#. TRANSLATORS: Laws are geographical, urgh... +#: ../src/gs-utils.c:302 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Možda je nelegalno instalirati ili koristiti ovaj kodek u nekim zemljama." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: ../src/gs-utils.c:309 +msgid "Don't Warn Again" +msgstr "Ne upozoravaj ponovo" + +#. TRANSLATORS: button text +#: ../src/gs-utils.c:318 +msgid "Enable and Install" +msgstr "Omogući i instaliraj" + +#: ../src/plugins/gs-plugin-appstream.c:219 +#, c-format +msgid "No AppStream data found" +msgstr "Podatak AppStream nije pronađen" + +#. TRANSLATORS: This is how we join the licences and can +#. * bje considered a "Disjunctive OR Operator" according +#. * to the SPDX specification. For example: +#. * "LGPL-2.1 or MIT" +#: ../src/plugins/gs-plugin-appstream.c:418 +msgid " or " +msgstr " or " + +#: ../src/plugins/gs-plugin-hardcoded-categories.c:161 +msgid "Featured" +msgstr "Istaknuto" + +#. TRANSLATORS: this is the mijenu spec main category for Audio +#: ../src/plugins/menu-spec-common.c:30 +msgid "Audio" +msgstr "Zvučni" + +#: ../src/plugins/menu-spec-common.c:31 +msgctxt "Mijenu subcategory of Audio" +msgid "Editing" +msgstr "Uređivanje" + +#: ../src/plugins/menu-spec-common.c:32 +msgctxt "Mijenu subcategory of Audio" +msgid "Databases" +msgstr "Baze podataka" + +#: ../src/plugins/menu-spec-common.c:33 +msgctxt "Mijenu subcategory of Audio" +msgid "Disc Burning" +msgstr "Rezanje diskova" + +#: ../src/plugins/menu-spec-common.c:34 +msgctxt "Mijenu subcategory of Audio" +msgid "Ham Radio" +msgstr "Radio amater" + +#: ../src/plugins/menu-spec-common.c:35 +msgctxt "Mijenu subcategory of Audio" +msgid "MIDI" +msgstr "MIDI" + +#: ../src/plugins/menu-spec-common.c:36 +msgctxt "Mijenu subcategory of Audio" +msgid "Mixer" +msgstr "Mikser" + +#: ../src/plugins/menu-spec-common.c:37 +msgctxt "Mijenu subcategory of Audio" +msgid "Music" +msgstr "Muzika" + +#: ../src/plugins/menu-spec-common.c:38 +msgctxt "Mijenu subcategory of Audio" +msgid "Players" +msgstr "Igrači" + +#: ../src/plugins/menu-spec-common.c:39 +msgctxt "Mijenu subcategory of Audio" +msgid "Recorders" +msgstr "Snimači" + +#: ../src/plugins/menu-spec-common.c:40 +msgctxt "Mijenu subcategory of Audio" +msgid "Sequencers" +msgstr "Sekvenceri" + +#: ../src/plugins/menu-spec-common.c:41 +msgctxt "Mijenu subcategory of Audio" +msgid "Tuners" +msgstr "Prijemnici" + +#. TRANSLATORS: this is the mijenu spec main category for Development +#: ../src/plugins/menu-spec-common.c:43 +msgid "Development Tools" +msgstr "Alati za razvoj" + +#: ../src/plugins/menu-spec-common.c:44 +msgctxt "Mijenu subcategory of Development Tools" +msgid "Building" +msgstr "Izgradnja" + +#: ../src/plugins/menu-spec-common.c:45 +msgctxt "Mijenu subcategory of Development Tools" +msgid "Databases" +msgstr "Baze podataka" + +#: ../src/plugins/menu-spec-common.c:46 +msgctxt "Mijenu subcategory of Development Tools" +msgid "Debuggers" +msgstr "Debageri" + +#: ../src/plugins/menu-spec-common.c:47 +msgctxt "Mijenu subcategory of Development Tools" +msgid "GUI Designers" +msgstr "Projektovanje korisničkog sučelja" + +#: ../src/plugins/menu-spec-common.c:48 +msgctxt "Mijenu subcategory of Development Tools" +msgid "IDE" +msgstr "IDE" + +#: ../src/plugins/menu-spec-common.c:49 +msgctxt "Mijenu subcategory of Development Tools" +msgid "Profiling" +msgstr "Profiliranje" + +#: ../src/plugins/menu-spec-common.c:50 +msgctxt "Mijenu subcategory of Development Tools" +msgid "Project Management" +msgstr "Upravljanje projektom" + +#: ../src/plugins/menu-spec-common.c:51 +msgctxt "Mijenu subcategory of Development Tools" +msgid "Revision Control" +msgstr "Kontrola verzijama" + +#: ../src/plugins/menu-spec-common.c:52 +msgctxt "Mijenu subcategory of Development Tools" +msgid "Translation" +msgstr "Pijevod" + +#: ../src/plugins/menu-spec-common.c:53 +msgctxt "Mijenu subcategory of Development Tools" +msgid "Web Development" +msgstr "Veb razvoj" + +#. TRANSLATORS: this is the mijenu spec main category for Education +#: ../src/plugins/menu-spec-common.c:55 +msgid "Education" +msgstr "Obrazovanje" + +#: ../src/plugins/menu-spec-common.c:56 +msgctxt "Mijenu subcategory of Education" +msgid "Art" +msgstr "Umjetnost" + +#: ../src/plugins/menu-spec-common.c:57 +msgctxt "Mijenu subcategory of Education" +msgid "Artificial Intelligence" +msgstr "Vještačka inteligencija" + +#: ../src/plugins/menu-spec-common.c:58 +msgctxt "Mijenu subcategory of Education" +msgid "Astronomy" +msgstr "Astronomija" + +#: ../src/plugins/menu-spec-common.c:59 +msgctxt "Mijenu subcategory of Education" +msgid "Biology" +msgstr "Biologija" + +#: ../src/plugins/menu-spec-common.c:60 +msgctxt "Mijenu subcategory of Education" +msgid "Chemistry" +msgstr "Hemija" + +#: ../src/plugins/menu-spec-common.c:61 +msgctxt "Mijenu subcategory of Education" +msgid "Computer Science" +msgstr "Računarstvo" + +#: ../src/plugins/menu-spec-common.c:62 +msgctxt "Mijenu subcategory of Education" +msgid "Construction" +msgstr "Izgradnja" + +#: ../src/plugins/menu-spec-common.c:63 +msgctxt "Mijenu subcategory of Education" +msgid "Data Visualization" +msgstr "Vizualizacija podataka" + +#: ../src/plugins/menu-spec-common.c:64 +msgctxt "Mijenu subcategory of Education" +msgid "Economy" +msgstr "Ekonomija" + +#: ../src/plugins/menu-spec-common.c:65 +msgctxt "Mijenu subcategory of Education" +msgid "Electricity" +msgstr "Elektrotehnika" + +#: ../src/plugins/menu-spec-common.c:66 +msgctxt "Mijenu subcategory of Education" +msgid "Electronics" +msgstr "Elektronika" + +#: ../src/plugins/menu-spec-common.c:67 +msgctxt "Mijenu subcategory of Education" +msgid "Engineering" +msgstr "Inženjering" + +#: ../src/plugins/menu-spec-common.c:68 +msgctxt "Mijenu subcategory of Education" +msgid "Geography" +msgstr "Geografija" + +#: ../src/plugins/menu-spec-common.c:69 +msgctxt "Mijenu subcategory of Education" +msgid "Geology" +msgstr "Geologija" + +#: ../src/plugins/menu-spec-common.c:70 +msgctxt "Mijenu subcategory of Education" +msgid "Geoscience" +msgstr "Geološke nauke" + +#: ../src/plugins/menu-spec-common.c:71 +msgctxt "Mijenu subcategory of Education" +msgid "History" +msgstr "Historija" + +#: ../src/plugins/menu-spec-common.c:72 +msgctxt "Mijenu subcategory of Education" +msgid "Humanities" +msgstr "Humanističke znanosti" + +#: ../src/plugins/menu-spec-common.c:73 +msgctxt "Mijenu subcategory of Education" +msgid "Image Processing" +msgstr "Obrada slika" + +#: ../src/plugins/menu-spec-common.c:74 +msgctxt "Mijenu subcategory of Education" +msgid "Languages" +msgstr "Jezici" + +#: ../src/plugins/menu-spec-common.c:75 +msgctxt "Mijenu subcategory of Education" +msgid "Literature" +msgstr "Književnost" + +#: ../src/plugins/menu-spec-common.c:76 +msgctxt "Mijenu subcategory of Education" +msgid "Maps" +msgstr "Mape" + +#: ../src/plugins/menu-spec-common.c:77 +msgctxt "Mijenu subcategory of Education" +msgid "Math" +msgstr "Matematika" + +#: ../src/plugins/menu-spec-common.c:78 +msgctxt "Mijenu subcategory of Education" +msgid "Medical" +msgstr "Medicina" + +#: ../src/plugins/menu-spec-common.c:79 +msgctxt "Mijenu subcategory of Education" +msgid "Music" +msgstr "Muzika" + +#: ../src/plugins/menu-spec-common.c:80 +msgctxt "Mijenu subcategory of Education" +msgid "Numerical Analysis" +msgstr "Numerička analiza" + +#: ../src/plugins/menu-spec-common.c:81 +msgctxt "Mijenu subcategory of Education" +msgid "Parallel Computing" +msgstr "Paralelno računastvo" + +#: ../src/plugins/menu-spec-common.c:82 +msgctxt "Mijenu subcategory of Education" +msgid "Physics" +msgstr "Fizika" + +#: ../src/plugins/menu-spec-common.c:83 +msgctxt "Mijenu subcategory of Education" +msgid "Robotics" +msgstr "Robotika" + +#: ../src/plugins/menu-spec-common.c:84 +msgctxt "Mijenu subcategory of Education" +msgid "Spirituality" +msgstr "Duhovnost" + +#: ../src/plugins/menu-spec-common.c:85 +msgctxt "Mijenu subcategory of Education" +msgid "Sports" +msgstr "Sportovi" + +#. TRANSLATORS: this is the mijenu spec main category for Games +#: ../src/plugins/menu-spec-common.c:87 +msgid "Games" +msgstr "Igre" + +#: ../src/plugins/menu-spec-common.c:88 +msgctxt "Mijenu subcategory of Games" +msgid "Action" +msgstr "Radnja" + +#: ../src/plugins/menu-spec-common.c:89 +msgctxt "Mijenu subcategory of Games" +msgid "Adventure" +msgstr "Avantura" + +#: ../src/plugins/menu-spec-common.c:90 +msgctxt "Mijenu subcategory of Games" +msgid "Arcade" +msgstr "Arkada" + +#: ../src/plugins/menu-spec-common.c:91 +msgctxt "Mijenu subcategory of Games" +msgid "Blocks" +msgstr "Blokovi" + +#: ../src/plugins/menu-spec-common.c:92 +msgctxt "Mijenu subcategory of Games" +msgid "Board" +msgstr "Tabla" + +#: ../src/plugins/menu-spec-common.c:93 +msgctxt "Mijenu subcategory of Games" +msgid "Card" +msgstr "Karta" + +#: ../src/plugins/menu-spec-common.c:94 +msgctxt "Mijenu subcategory of Games" +msgid "Emulators" +msgstr "Emulatori" + +#: ../src/plugins/menu-spec-common.c:95 +msgctxt "Mijenu subcategory of Games" +msgid "Kids" +msgstr "Djeca" + +#: ../src/plugins/menu-spec-common.c:96 +msgctxt "Mijenu subcategory of Games" +msgid "Logic" +msgstr "Logika" + +#: ../src/plugins/menu-spec-common.c:97 +msgctxt "Mijenu subcategory of Games" +msgid "Role Playing" +msgstr "Igranje uloga" + +#: ../src/plugins/menu-spec-common.c:98 +msgctxt "Mijenu subcategory of Games" +msgid "Shooter" +msgstr "Pucač" + +#: ../src/plugins/menu-spec-common.c:99 +msgctxt "Mijenu subcategory of Games" +msgid "Simulation" +msgstr "Simulacija" + +#: ../src/plugins/menu-spec-common.c:100 +msgctxt "Mijenu subcategory of Games" +msgid "Sports" +msgstr "Sportovi" + +#: ../src/plugins/menu-spec-common.c:101 +msgctxt "Mijenu subcategory of Games" +msgid "Strategy" +msgstr "Strategija" + +#. TRANSLATORS: this is the mijenu spec main category for Graphics +#: ../src/plugins/menu-spec-common.c:103 +msgid "Graphics" +msgstr "Grafika" + +#: ../src/plugins/menu-spec-common.c:104 +msgctxt "Mijenu subcategory of Graphics" +msgid "2D Graphics" +msgstr "2D grafika" + +#: ../src/plugins/menu-spec-common.c:105 +msgctxt "Mijenu subcategory of Graphics" +msgid "3D Graphics" +msgstr "3D grafika" + +#: ../src/plugins/menu-spec-common.c:106 +msgctxt "Mijenu subcategory of Graphics" +msgid "OCR" +msgstr "OCR" + +#: ../src/plugins/menu-spec-common.c:107 +msgctxt "Mijenu subcategory of Graphics" +msgid "Photography" +msgstr "Fotografija" + +#: ../src/plugins/menu-spec-common.c:108 +msgctxt "Mijenu subcategory of Graphics" +msgid "Publishing" +msgstr "Objavljivanje" + +#: ../src/plugins/menu-spec-common.c:109 +msgctxt "Mijenu subcategory of Graphics" +msgid "Raster Graphics" +msgstr "Bitmap grafika" + +#: ../src/plugins/menu-spec-common.c:110 +msgctxt "Mijenu subcategory of Graphics" +msgid "Scanning" +msgstr "Skeniranje" + +#: ../src/plugins/menu-spec-common.c:111 +msgctxt "Mijenu subcategory of Graphics" +msgid "Vector Graphics" +msgstr "Vektorska grafika" + +#: ../src/plugins/menu-spec-common.c:112 +msgctxt "Mijenu subcategory of Graphics" +msgid "Viewer" +msgstr "Preglednik" + +#. TRANSLATORS: this is the mijenu spec main category for Network +#: ../src/plugins/menu-spec-common.c:114 +msgid "Internet" +msgstr "Internet" + +#: ../src/plugins/menu-spec-common.c:115 +msgctxt "Mijenu subcategory of Internet" +msgid "Chat" +msgstr "Ćaskanje" + +#: ../src/plugins/menu-spec-common.c:116 +msgctxt "Mijenu subcategory of Internet" +msgid "Dialup" +msgstr "Dialup" + +#: ../src/plugins/menu-spec-common.c:117 +msgctxt "Mijenu subcategory of Internet" +msgid "Email" +msgstr "Elektronska pošta" + +#: ../src/plugins/menu-spec-common.c:118 +msgctxt "Mijenu subcategory of Internet" +msgid "Feed" +msgstr "Dovod" + +#: ../src/plugins/menu-spec-common.c:119 +msgctxt "Mijenu subcategory of Internet" +msgid "File Transfer" +msgstr "Podatkovni prijenos" + +#: ../src/plugins/menu-spec-common.c:120 +msgctxt "Mijenu subcategory of Internet" +msgid "Ham Radio" +msgstr "Radio amater" + +#: ../src/plugins/menu-spec-common.c:121 +msgctxt "Mijenu subcategory of Internet" +msgid "Instant Messaging" +msgstr "Brze poruke" + +#: ../src/plugins/menu-spec-common.c:122 +msgctxt "Mijenu subcategory of Internet" +msgid "IRC Clients" +msgstr "IRC korisnici" + +#: ../src/plugins/menu-spec-common.c:123 +msgctxt "Mijenu subcategory of Internet" +msgid "Monitor" +msgstr "Ekran" + +#: ../src/plugins/menu-spec-common.c:124 +msgctxt "Mijenu subcategory of Internet" +msgid "News" +msgstr "Vijesti" + +#: ../src/plugins/menu-spec-common.c:125 +msgctxt "Mijenu subcategory of Internet" +msgid "P2P" +msgstr "P2P" + +#: ../src/plugins/menu-spec-common.c:126 +msgctxt "Mijenu subcategory of Internet" +msgid "Remote Access" +msgstr "Udaljeni pristup" + +#: ../src/plugins/menu-spec-common.c:127 +msgctxt "Mijenu subcategory of Internet" +msgid "Telephony" +msgstr "Telefonija" + +#: ../src/plugins/menu-spec-common.c:128 +msgctxt "Mijenu subcategory of Internet" +msgid "Video Conference" +msgstr "Video konferencija" + +#: ../src/plugins/menu-spec-common.c:129 +msgctxt "Mijenu subcategory of Internet" +msgid "Web Browser" +msgstr "Veb preglednik" + +#: ../src/plugins/menu-spec-common.c:130 +msgctxt "Mijenu subcategory of Internet" +msgid "Web Development" +msgstr "Veb razvoj" + +#. TRANSLATORS: this is the mijenu spec main category for Office +#: ../src/plugins/menu-spec-common.c:132 +msgid "Office" +msgstr "Ured" + +#: ../src/plugins/menu-spec-common.c:133 +msgctxt "Mijenu subcategory of Office" +msgid "Calendar" +msgstr "Kalendar" + +#: ../src/plugins/menu-spec-common.c:134 +msgctxt "Mijenu subcategory of Office" +msgid "Chart" +msgstr "Dijagram" + +#: ../src/plugins/menu-spec-common.c:135 +msgctxt "Mijenu subcategory of Office" +msgid "Contact Management" +msgstr "Upravljanje kontaktima" + +#: ../src/plugins/menu-spec-common.c:136 +msgctxt "Mijenu subcategory of Office" +msgid "Database" +msgstr "Baza podataka" + +#: ../src/plugins/menu-spec-common.c:137 +msgctxt "Mijenu subcategory of Office" +msgid "Dictionary" +msgstr "Riječnik" + +#: ../src/plugins/menu-spec-common.c:138 +msgctxt "Mijenu subcategory of Office" +msgid "Email" +msgstr "E-pošta" + +#: ../src/plugins/menu-spec-common.c:139 +msgctxt "Mijenu subcategory of Office" +msgid "Finance" +msgstr "Finansije" + +#: ../src/plugins/menu-spec-common.c:140 +msgctxt "Mijenu subcategory of Office" +msgid "Flow Chart" +msgstr "Dijagram" + +#: ../src/plugins/menu-spec-common.c:141 +msgctxt "Mijenu subcategory of Office" +msgid "PDA" +msgstr "PDA" + +#: ../src/plugins/menu-spec-common.c:142 +msgctxt "Mijenu subcategory of Office" +msgid "Photography" +msgstr "Fotografija" + +#: ../src/plugins/menu-spec-common.c:143 +msgctxt "Mijenu subcategory of Office" +msgid "Presentation" +msgstr "Prezentacija" + +#: ../src/plugins/menu-spec-common.c:144 +msgctxt "Mijenu subcategory of Office" +msgid "Project Management" +msgstr "Upravljanje projektom" + +#: ../src/plugins/menu-spec-common.c:145 +msgctxt "Mijenu subcategory of Office" +msgid "Publishing" +msgstr "Objavljivanje" + +#: ../src/plugins/menu-spec-common.c:146 +msgctxt "Mijenu subcategory of Office" +msgid "Spreadsheet" +msgstr "Tabelarni prikaz" + +#: ../src/plugins/menu-spec-common.c:147 +msgctxt "Mijenu subcategory of Office" +msgid "Viewer" +msgstr "Preglednik" + +#: ../src/plugins/menu-spec-common.c:148 +msgctxt "Mijenu subcategory of Office" +msgid "Word Processor" +msgstr "Program za obradu teksta" + +#. TRANSLATORS: this is the mijenu spec main category for Science +#: ../src/plugins/menu-spec-common.c:150 +msgid "Science" +msgstr "Nauka" + +#: ../src/plugins/menu-spec-common.c:151 +msgctxt "Mijenu subcategory of Science" +msgid "Art" +msgstr "Umjetnost" + +#: ../src/plugins/menu-spec-common.c:152 +msgctxt "Mijenu subcategory of Science" +msgid "Artificial Intelligence" +msgstr "Vještačka inteligencija" + +#: ../src/plugins/menu-spec-common.c:153 +msgctxt "Mijenu subcategory of Science" +msgid "Astronomy" +msgstr "Astronomija" + +#: ../src/plugins/menu-spec-common.c:154 +msgctxt "Mijenu subcategory of Science" +msgid "Biology" +msgstr "Biologija" + +#: ../src/plugins/menu-spec-common.c:155 +msgctxt "Mijenu subcategory of Science" +msgid "Chemistry" +msgstr "Hemija" + +#: ../src/plugins/menu-spec-common.c:156 +msgctxt "Mijenu subcategory of Science" +msgid "Computer Science" +msgstr "Računarstvo" + +#: ../src/plugins/menu-spec-common.c:157 +msgctxt "Mijenu subcategory of Science" +msgid "Construction" +msgstr "Izgradnja" + +#: ../src/plugins/menu-spec-common.c:158 +msgctxt "Mijenu subcategory of Science" +msgid "Data Visualization" +msgstr "Vizualizacija podataka" + +#: ../src/plugins/menu-spec-common.c:159 +msgctxt "Mijenu subcategory of Science" +msgid "Economy" +msgstr "Ekonomija" + +#: ../src/plugins/menu-spec-common.c:160 +msgctxt "Mijenu subcategory of Science" +msgid "Electricity" +msgstr "Elektrotehnika" + +#: ../src/plugins/menu-spec-common.c:161 +msgctxt "Mijenu subcategory of Science" +msgid "Electronics" +msgstr "Elektronika" + +#: ../src/plugins/menu-spec-common.c:162 +msgctxt "Mijenu subcategory of Science" +msgid "Engineering" +msgstr "Inženjering" + +#: ../src/plugins/menu-spec-common.c:163 +msgctxt "Mijenu subcategory of Science" +msgid "Geography" +msgstr "Geografija" + +#: ../src/plugins/menu-spec-common.c:164 +msgctxt "Mijenu subcategory of Science" +msgid "Geology" +msgstr "Geologija" + +#: ../src/plugins/menu-spec-common.c:165 +msgctxt "Mijenu subcategory of Science" +msgid "Geoscience" +msgstr "Geološke nauke" + +#: ../src/plugins/menu-spec-common.c:166 +msgctxt "Mijenu subcategory of Science" +msgid "History" +msgstr "Historija" + +#: ../src/plugins/menu-spec-common.c:167 +msgctxt "Mijenu subcategory of Science" +msgid "Humanities" +msgstr "Humanističke znanosti" + +#: ../src/plugins/menu-spec-common.c:168 +msgctxt "Mijenu subcategory of Science" +msgid "Image Processing" +msgstr "Obrada slika" + +#: ../src/plugins/menu-spec-common.c:169 +msgctxt "Mijenu subcategory of Science" +msgid "Languages" +msgstr "Jezici" + +#: ../src/plugins/menu-spec-common.c:170 +msgctxt "Mijenu subcategory of Science" +msgid "Literature" +msgstr "Književnost" + +#: ../src/plugins/menu-spec-common.c:171 +msgctxt "Mijenu subcategory of Science" +msgid "Maps" +msgstr "Mape" + +#: ../src/plugins/menu-spec-common.c:172 +msgctxt "Mijenu subcategory of Science" +msgid "Math" +msgstr "Matematika" + +#: ../src/plugins/menu-spec-common.c:173 +msgctxt "Mijenu subcategory of Science" +msgid "Medical" +msgstr "Medicina" + +#: ../src/plugins/menu-spec-common.c:174 +msgctxt "Mijenu subcategory of Science" +msgid "Numerical Analysis" +msgstr "Numerička analiza" + +#: ../src/plugins/menu-spec-common.c:175 +msgctxt "Mijenu subcategory of Science" +msgid "Parallel Computing" +msgstr "Paralelno računastvo" + +#: ../src/plugins/menu-spec-common.c:176 +msgctxt "Mijenu subcategory of Science" +msgid "Physics" +msgstr "Fizika" + +#: ../src/plugins/menu-spec-common.c:177 +msgctxt "Mijenu subcategory of Science" +msgid "Robotics" +msgstr "Robotika" + +#: ../src/plugins/menu-spec-common.c:178 +msgctxt "Mijenu subcategory of Science" +msgid "Spirituality" +msgstr "Duhovnost" + +#: ../src/plugins/menu-spec-common.c:179 +msgctxt "Mijenu subcategory of Science" +msgid "Sports" +msgstr "Sportovi" + +#. TRANSLATORS: this is the mijenu spec main category for System +#: ../src/plugins/menu-spec-common.c:181 +msgid "System" +msgstr "Sistem" + +#: ../src/plugins/menu-spec-common.c:182 +msgctxt "Mijenu subcategory of System" +msgid "Emulator" +msgstr "Emulator" + +#: ../src/plugins/menu-spec-common.c:183 +msgctxt "Mijenu subcategory of System" +msgid "File Manager" +msgstr "Upravnik datoteka" + +#: ../src/plugins/menu-spec-common.c:184 +msgctxt "Mijenu subcategory of System" +msgid "File System" +msgstr "Sistem datoteka" + +#: ../src/plugins/menu-spec-common.c:185 +msgctxt "Mijenu subcategory of System" +msgid "File Tools" +msgstr "Alat za rad sa datotekama" + +#: ../src/plugins/menu-spec-common.c:186 +msgctxt "Mijenu subcategory of System" +msgid "Monitor" +msgstr "Monitor" + +#: ../src/plugins/menu-spec-common.c:187 +msgctxt "Mijenu subcategory of System" +msgid "Security" +msgstr "Sigurnost" + +#: ../src/plugins/menu-spec-common.c:188 +msgctxt "Mijenu subcategory of System" +msgid "Terminal Emulator" +msgstr "Emulator terminala" + +#. TRANSLATORS: this is the mijenu spec main category for Utility +#: ../src/plugins/menu-spec-common.c:190 +msgid "Utilities" +msgstr "Uslužni programi" + +#: ../src/plugins/menu-spec-common.c:191 +msgctxt "Mijenu subcategory of Utilities" +msgid "Accessibility" +msgstr "Pristup" + +#: ../src/plugins/menu-spec-common.c:192 +msgctxt "Mijenu subcategory of Utilities" +msgid "Archiving" +msgstr "Arhiviranje" + +#: ../src/plugins/menu-spec-common.c:193 +msgctxt "Mijenu subcategory of Utilities" +msgid "Calculator" +msgstr "Kalkulator" + +#: ../src/plugins/menu-spec-common.c:194 +msgctxt "Mijenu subcategory of Utilities" +msgid "Clock" +msgstr "Sat" + +#: ../src/plugins/menu-spec-common.c:195 +msgctxt "Mijenu subcategory of Utilities" +msgid "Compression" +msgstr "Sažimanje" + +#: ../src/plugins/menu-spec-common.c:196 +msgctxt "Mijenu subcategory of Utilities" +msgid "File Tools" +msgstr "Alati za datoteke" + +#: ../src/plugins/menu-spec-common.c:197 +msgctxt "Mijenu subcategory of Utilities" +msgid "Maps" +msgstr "Karte" + +#: ../src/plugins/menu-spec-common.c:198 +msgctxt "Mijenu subcategory of Utilities" +msgid "Spirituality" +msgstr "Duhovnost" + +#: ../src/plugins/menu-spec-common.c:199 +msgctxt "Mijenu subcategory of Utilities" +msgid "Telephony Tools" +msgstr "Telefonski alati" + +#: ../src/plugins/menu-spec-common.c:200 +msgctxt "Mijenu subcategory of Utilities" +msgid "Text Editor" +msgstr "Uređivaš teksta" + +#. TRANSLATORS: this is the mijenu spec main category for Video +#: ../src/plugins/menu-spec-common.c:202 +msgid "Video" +msgstr "Video" + +#: ../src/plugins/menu-spec-common.c:203 +msgctxt "Mijenu subcategory of Video" +msgid "Editing" +msgstr "Uređivanje" + +#: ../src/plugins/menu-spec-common.c:204 +msgctxt "Mijenu subcategory of Video" +msgid "Database" +msgstr "Baza podataka" + +#: ../src/plugins/menu-spec-common.c:205 +msgctxt "Mijenu subcategory of Video" +msgid "Disc Burning" +msgstr "Rezanje diskova" + +#: ../src/plugins/menu-spec-common.c:206 +msgctxt "Mijenu subcategory of Video" +msgid "Players" +msgstr "Igrači" + +#: ../src/plugins/menu-spec-common.c:207 +msgctxt "Mijenu subcategory of Video" +msgid "Recorders" +msgstr "Snimači" + +#: ../src/plugins/menu-spec-common.c:208 +msgctxt "Mijenu subcategory of Video" +msgid "TV" +msgstr "TV" + +#: ../src/plugins/menu-spec-common.c:211 +msgctxt "Mijenu subcategory of Add-ons" +msgid "Fonts" +msgstr "Fontovi" + +#: ../src/plugins/menu-spec-common.c:212 +msgctxt "Mijenu subcategory of Add-ons" +msgid "Codecs" +msgstr "Kedci" + +#: ../src/plugins/menu-spec-common.c:213 +msgctxt "Mijenu subcategory of Add-ons" +msgid "Input Sources" +msgstr "Izvori ulaza" + +#: ../src/plugins/menu-spec-common.c:214 +msgctxt "Mijenu subcategory of Add-ons" +msgid "Language Packs" +msgstr "Jezički paketi" + +#: ../src/menus.ui.h:1 +msgid "_Software Sources" +msgstr "_Izvor softvera" + +#: ../src/menus.ui.h:2 +msgid "_About" +msgstr "_O programu" + +#: ../src/menus.ui.h:3 +msgid "_Quit" +msgstr "_Izlaz" diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..70f671a --- /dev/null +++ b/po/ca.po @@ -0,0 +1,6433 @@ +# Catalan translation for gnome-software. +# Copyright (C) 2012 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-calendar package. +# +# Jordi Mas i Hernandez , 2013-2025 +# Gil Forcada , 2014-2020. +# Francesc Busquets , 2025 +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-05 04:48+0000\n" +"PO-Revision-Date: 2025-03-08 14:47+0100\n" +"Last-Translator: Francesc Busquets \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Id-Version: gnome-software master\n" +"X-DamnedLies-Scope: partial\n" +"X-Generator: Poedit 3.2.2\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programari" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instal·la i actualitza aplicacions" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"El Programari us permet cercar i instal·lar aplicacions noves i extensions " +"del sistema així com eliminar aplicacions ja instal·lades." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"El Programari mostra aplicacions destacades i populars amb descripcions " +"útils i diverses captures de pantalla per aplicació. Les aplicacions es " +"poden trobar navegant per la llista de categories o fent una cerca. També us " +"permet actualitzar el vostre sistema mitjançant una actualització fora de " +"línia." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Quadre de resum" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Quadre de detalls" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "S'ha instal·lat el quadre" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Quadre d'actualitzacions" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Detalls de l'actualització" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "El projecte GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Prova la clau akmods a Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Es requereix autenticació per a provar la clau akmods a Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Inscriu la clau akmods a Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Es requereix autenticació per a inscriure la clau akmods a Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Prova la clau DKMS a Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Es requereix autenticació per a provar la clau DKMS a Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Inscriu la clau DKMS a Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Es requereix autenticació per a inscriure la clau DKMS a Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instal·la un fitxer Appstream en una ubicació de sistema" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "S'està instal·lant un fitxer Appstream en una ubicació de sistema" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Una llista de projectes compatibles" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Aquesta és una llista de projectes compatibles que hem de mostrar com ara el " +"GNOME, el KDE i l'XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Si es gestionen les actualitzacions amb el Programari del GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Si s'inhabilita, el Programari del GNOME ocultarà el quadre " +"d'actualitzacions i no realitzarà cap acció automàtica d'actualització o " +"notificarà quan hi hagi actualitzacions." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Baixa i instal·la les actualitzacions automàticament" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Si s'habilita, el Programari del GNOME baixa actualitzacions automàticament " +"en segon pla, i també instal·la les que no requereixen un reinici." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"Notifica a l'usuari que hi ha una actualització de programari en segon pla" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Si s'habilita, el Programari del GNOME notifica a l'usuari de les " +"actualitzacions que s'han produït mentre l'usuari no era present." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Si s'ha de refrescar automàticament en una connexió limitada" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Si s'habilita, el Programari del GNOME refresca automàticament en rerefons " +"inclús quan s'utilitza una connexió limitada (finalment baixant metadades, " +"comprovant actualitzacions, etc., el que pot representar una despesa per " +"l'usuari)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Si és la primera execució del Programari del GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Mostra les valoracions en estrelles al costat de les aplicacions" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtra les aplicacions basant-se en la branca per defecte configurada pel " +"remot" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Les aplicacions no lliures mostren un diàleg d'avís abans d'instal·lar-se" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Quan s'instal·lin aplicacions no lliures es pot mostrar un diàleg d'avís. " +"Això controla si el diàleg se suprimeix." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "La marca horària de l'última comprovació d'actualització" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "La marca horària de l'última comprovació d'actualització" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "La marca horària de l'última notificació d'actualització" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"La marca horària de la primera actualització de seguretat, netejada després " +"de l'actualització" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "La marca horària de l'última actualització" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"El temps en segons per a verificar si la captura de pantalla font és encara " +"vàlida" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Si escolliu un valor gran hi hauran menys connexions al servidor remot però " +"les captures de pantalla poden trigar més temps a mostrar-se actualitzades a " +"l'usuari. Un valor de 0 significa que no es comprovi mai el servidor si " +"existeix una imatge en la memòria cau." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "El servidor a utilitzar per a les ressenyes d'aplicacions" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "La puntuació de karma mínima per a les ressenyes" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Ressenyes amb karma inferior a aquest nombre no es mostraran." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Una llista de repositoris oficials que no han de ser considerats de terceres " +"parts" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Una llista de repositoris obligatoris que no es poden deshabilitar ni " +"eliminar" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Una llista de repositoris oficials que han de ser considerats de programari " +"lliure" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"L'URL de la llicència a usar quan l'aplicació ha de ser considerada " +"programari lliure" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Instal·la paquets d'aplicacions per a tots els usuaris del sistema quan " +"sigui possible" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Permet l'accés al diàleg repositoris de programari" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Ofereix actualitzacions per a versions preliminars" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Mostra alguns elements d'interfície d'usuari indicant que l'aplicació no és " +"lliure" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Mostra la mida de les aplicacions instal·lades a la llista d'aplicacions " +"instal·lades" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "«https://ca.wikipedia.org/wiki/Programari_de_propietat»" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "L'URI que explica programari no lliure i de propietat" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Una llista dels URL que apunten als fitxers Appstream que es baixaran a la " +"carpeta swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instal·la els fitxers AppStream en una ubicació de tot el sistema per a tots " +"els usuaris. Si no, els fitxers s'instal·len al directori no estàndard " +"$XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Ordre de prioritat dels formats d'empaquetat a preferir, amb els formats més " +"importants llistats primer. Una matriu buida significa l'ordre " +"predeterminat. S'assumeix que els formats omesos són els últims. Exemples de " +"formats d'empaquetat són: deb, flatpak, rpm, snap." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"La marca horària de l'últim intent d'eliminar els entorns d'execució de " +"Flatpak no utilitzats" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Establiu-ho a «true» per a mostrar només les aplicacions amb llicència " +"lliure i ocultar qualsevol aplicació propietària." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Establiu-ho a «true» per a mostrar només les aplicacions dels " +"desenvolupadors la identitat dels quals s'ha verificat." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "La marca horària de l'última actualització històrica rebuda." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Una cadena utilitzada per a emmagatzemar l'identificador de gnome-online-" +"account usat per a iniciar la sessió" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "L'instal·lador d'AppStream del Programari del GNOME" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Ha fallat l'anàlisi dels arguments de la línia d'ordres" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Heu d'especificar un nom de fitxer exactament" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Aquest programa només pot ser utilitzat per l'usuari root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "No s'ha pogut validar el tipus de contingut: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "S'ha produït un error en moure: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instal·lació de programari" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instal·la el programari seleccionat al sistema" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violència en còmics" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "No hi ha informació sobre violència de dibuixos animats" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violència de fantasia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "No hi ha informació sobre violència de fantasia" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violència realista" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "No hi ha informació sobre violència realista" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violència que descriu matances" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "No hi ha informació sobre vessament de sang" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violència sexual" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "No hi ha informació sobre violència sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "No hi ha informació sobre referències a l'alcohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Drogues" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "No hi ha informació sobre referències a drogues il·legals" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabac" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "No hi ha informació sobre referències a productes del tabac" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nuesa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "No hi ha informació sobre nuesa de cap tipus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Temes sexuals" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"No hi ha informació sobre referències o representacions de caràcter sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Blasfèmia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "No hi ha informació sobre llenguatge obscè de cap tipus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Humor inapropiat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "No hi ha informació sobre humor inadequat" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminació" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "No hi ha informació sobre llenguatge discriminatori de cap tipus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Publicitat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "No hi ha informació relativa a publicitat de cap tipus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Apostes" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "No hi ha informació sobre joc de cap tipus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Compres" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "No hi ha informació sobre capacitat de gastar diners" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Xat entre usuaris" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "No hi ha informació sobre com xatejar amb altres usuaris" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Xat d'àudio entre usuaris" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "No hi ha informació sobre com parlar amb altres usuaris" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detalls de contacte" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"No hi ha informació sobre intercanvi de noms d'usuari de xarxes socials o " +"adreces de correu electrònic" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informació d'identificació" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"No hi ha informació sobre intercanvi d'informació de l'usuari amb tercers" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Compartició de la ubicació" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"No hi ha informació sobre ús compartit d'ubicació física amb altres usuaris" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualitat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "No hi ha informació sobre referències a l'homosexualitat" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitució" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "No hi ha informació sobre referències a la prostitució" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adulteri" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "No hi ha informació sobre referències a l'adulteri" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Personatges sexualitzats" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "No hi ha informació sobre personatges sexualitzats" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanació" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "No hi ha informació sobre referències a la profanació" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Restes humanes" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "No hi ha informació sobre les restes humanes mortes visibles" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Esclavitud" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "No hi ha informació sobre referències a l'esclavitud" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "No inclou referències a drogues" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "No inclou paraulotes, blasfèmies i altres tipus de llenguatge fort" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "No inclou anuncis ni transaccions monetàries" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "No inclou sexe ni nuesa" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "No inclou funcionalitat de xat no controlada" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "No inclou violència" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogues" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Llenguatge groller" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Diners" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violència" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Tothom" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s té una qualificació d'edat desconeguda" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s és adequat per a tothom" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s és adequat per als infants fins als 3 anys" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s és adequat per a infants fins als 5 anys" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s és adequat per a infants" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s és adequat per a adolescents" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s és adequat per a adults" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s és adequat per a %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Valoració per edat" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Com afegir-hi la informació que falta" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Fitxer local" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paquet" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Pendent" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Instal·lació pendent" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Eliminació pendent" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "S'està instal·lant" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "S'està suprimint" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "S'està baixant" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instal·la" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Desinstal·la…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Xarxa" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Es pot comunicar per la xarxa" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Serveis del sistema" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Pot accedir als serveis D-Bus al bus del sistema" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Serveis de sessió" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Pot accedir als serveis D-Bus al bus de la sessió" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Dispositius" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Pot accedir a dispositius arbitraris com ara càmeres web" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Pot accedir als dispositius d'entrada" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Pot accedir als micròfons i reproduir sons" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Pot accedir a fitxers de dispositiu del sistema" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Continguts de la pantalla" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Pot accedir als continguts de la pantalla" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Carpeta d'usuari" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Pot veure, editar i crear fitxers" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Pot veure fitxers" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistema de fitxers" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Carpeta de baixada" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Paràmetres" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Pot veure i canviar qualsevol paràmetre" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistema de visualització antic" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Usa un sistema antic i insegur de visualització" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Escapa de l'espai aïllat" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Pot escapar-se de l'espai aïllat i eludir qualsevol altra restricció" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "No hi ha cap descripció sobre l'actualització disponible." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Detalls de l'actualització" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Requereix permisos addicionals" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "S'ha rebut una resposta incorrecta del servidor de puntuacions" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "No s'ha pogut connectar amb el servidor de puntuacions" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Ressenyes" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "No s'han trobat ressenyes per a aquesta aplicació." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Cap ressenya" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Historial de versions" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novetats de la versió %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versió %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "No hi ha detalls per a aquesta versió" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B de %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Mode d'inici: sigui «updates» (actualitzacions), «updated» (actualitzat), " +"«installed» (instal·lat) o «overview» (resum)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Cerca aplicacions" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "CERCA" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Mostra els detalls de l'aplicació (utilitzant l'ID d'aplicació)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Mostra els detalls de l'aplicació (utilitzant el nom de paquet)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instal·la l'aplicació (utilitzant l'ID d'aplicació)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Desinstal·la l'aplicació (utilitzant l'ID d'aplicació)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Obre un fitxer de paquet local" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NOM DE FITXER" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"El tipus d'interacció que s'espera per a aquesta acció: ‘none’, ‘notify’, o " +"‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACCIÓ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Mostra un fitxer local de metainfo o appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Activa la sortida de depuració detallada (des de la instància en execució, " +"si ja s'està executant)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instal·la les actualitzacions pendents en segon pla" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Mostra les preferències" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Surt de la instància en execució" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Prefereix fonts de fitxer locals abans que de l'AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Mostra el número de versió" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016-2023 Contribuïdors de Programari del GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Jordi Mas i Hernàndez , 2013-2024\n" +"Miquel-Àngel Burgos i Fradeja , 2020\n" +"Francesc Busquets , 2025\n" +"Victor Dargallo " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "No hi ha detalls per a aquesta aplicació." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Mida un cop instal·lada" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inclou %s de dades i %s de memòria cau" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inclou %s de dades" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inclou %s de memòria cau" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Es desconeix l'ús de la memòria cau i de les dades" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Mida de la baixada" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "No cal cap baixada addicional del sistema" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Necessita baixades del sistema addicionals de mida desconeguda" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Necessita %s de baixades addicionals del sistema" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "La mida és desconeguda" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Sense permisos" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Té accés a xarxa" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Usa serveis del sistema" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Usa serveis de sessió" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Pot accedir a dispositius de maquinari" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Pot accedir a dispositius del sistema" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Pot llegir/escriure totes les vostres dades" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Pot llegir totes les vostres dades" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Podeu llegir/escriure les vostres baixades" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Podeu llegir les vostres baixades" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Pot accedir a alguns fitxers específics" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Pot accedir i canviar la configuració de l'usuari" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Usa un sistema antic de finestres" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Pot adquirir permisos de forma arbitrària" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "El desenvolupador de l'aplicació està verificat" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Revisat per un distribuïdor de SO" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Revisat per %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Proporcionada per un tercer" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "El vostre sistema operatiu no és compatible" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Codi auditable" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Llicència desconeguda" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Codi propietari" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Llicència especial" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Privilegiat" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Segur" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Probablement segur" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potencialment insegur" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Insegur" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Només mòbil" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Només funciona en una pantalla petita" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Només en escriptori" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Només funciona en una pantalla gran" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "La mida de la pantalla no coincideix" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "No és compatible amb la mida de la pantalla actual" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Requereix una pantalla tàctil" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Requereix un teclat" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Requereix un ratolí" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Cal un comandament de joc" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Requereix un comandament de joc per a jugar" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptativa" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Funciona en telèfons, tauletes i escriptoris" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Probablement requereix un teclat o un ratolí" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Funciona en escriptoris i portàtils" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "No conté cap contingut inapropiat per a menors" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "No hi ha informació de puntuació d'edat disponible" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visiteu el lloc web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instal·la…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Cancel·la" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instal·la" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Baixa" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Actualitza" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Desinstal·la…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Desinstal·lació" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Actualització crítica" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "El dispositiu no pot utilitzar-se durant l'actualització." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Font: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "S'ha canviat el nom de %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "S'ha parat de rebre actualitzacions" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Actualització crítica" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instal·lat" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Ajudeu a traduir %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s està dissenyat, desenvolupat i traduït per una comunitat internacional de " +"col·laboradors.\n" +"\n" +"Això vol dir que encara que no estigui disponible en la vostra llengua, " +"podeu implicar-vos i ajudar a traduir-lo vosaltres mateixos." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traduccions" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Lloc web de la traducció" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Cal autenticació pel remot %s (regne %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Cal autenticació" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Cancel·la" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Entra" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Usuari" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Contrasenya" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Altres" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Tot" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Destacat" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Selecció de l'editor" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nou i actualitzat" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Selecció d'aplicacions web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Altre programari" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s instal·lat" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "És necessari reiniciar per a què els canvis tinguin efecte" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "L'aplicació ja està a punt per a fer-se servir" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "S'han instal·lat les actualitzacions del sistema" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "" +"Les actualitzacions instal·lades recentment estan disponibles per a ser " +"revisades" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Reinicia" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Executa" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Voleu instal·lar programari de tercers?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Voleu instal·lar programari de tercers?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Voleu habilitar els repositoris de programari de tercers?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Voleu habilitar els repositoris de programari de tercers?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s no és programari lliure o de codi obert, i es proporciona " +"amb «%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s es proporciona amb «%s»." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Cal habilitar aquest repositori de programari per a poder continuar amb la " +"instal·lació." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Pot ser il·legal instal·lar o utilitzar %s en alguns països." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Pot ser il·legal instal·lar o utilitzar aquest còdec en alguns països." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_No tornis a avisar-me" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "H_abilita i instal·la" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Els errors detallats del gestor de paquets es mostren a continuació:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detalls" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Tanca" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "S'han copiat els detalls al porta-retalls" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "Acce_pta" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "S'ha instal·lat una actualització" +msgstr[1] "S'han instal·lat actualitzacions" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "S'ha desinstal·lat una aplicació" +msgstr[1] "S'han desinstal·lat algunes aplicacions" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "És necessari reiniciar per a què el canvi tingui efecte" +msgstr[1] "És necessari reiniciar per a què els canvis tinguin efecte" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Ara no" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Avui" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Ahir" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Fa %d dia" +msgstr[1] "Fa %d dies" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Fa %d setmana" +msgstr[1] "Fa %d setmanes" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Fa %d mes" +msgstr[1] "Fa %d mesos" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Fa %d any" +msgstr[1] "Fa %d anys" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Ara mateix" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Fa %d minut" +msgstr[1] "Fa %d minuts" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Fa %d hora" +msgstr[1] "Fa %d hores" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Tots" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Destacat" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Gràfics 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografia" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Escaneig" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Gràfics vectorials" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visualitzador" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Edició i creació d'àudio" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Reproductors de música" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Tots" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Destacat" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendari" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Base de dades" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finances" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Processador de textos" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editors de text" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navegador web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Tots" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Destacat" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Acció" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventura" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocs" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Taula" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartes" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emuladors" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Mainada" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Lògica" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Jocs de rol" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Esports" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estratègia" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Tots" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Destacat" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Xat" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Tots" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Destacat" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Intel·ligència artificial" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomia" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Química" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Llengües" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matemàtiques" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Notícies" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robòtica" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Art" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografia" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Còmics" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Ficció" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Salut" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Història" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Estil de vida" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Política" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Esports" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Tots" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Destacat" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Depuradors" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Entorns integrats de desenvolupament" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Còdecs" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Controladors de maquinari" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Tipus de lletra" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Fonts d'entrada" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Paquets d'idioma" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localització" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Creació" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Treball" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Jocs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socialització" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Aprendre" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Desenvolupament" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Còdecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Controladors de maquinari" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Tipus de lletra" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Fonts d'entrada" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Paquets d'idioma" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Localització" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Una aplicació" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s està demanant compatibilitat addicional de formats de fitxers." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Calen tipus MIME addicionals" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s està demanant tipus de lletra addicionals." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Calen tipus de lletra addicionals" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s està demanant còdecs multimèdia addicionals." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Calen còdecs multimèdia addicionals" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s està demanant controladors d'impressora addicionals." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Calen controladors d'impressora addicionals" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s està demanant paquets addicionals." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Calen paquets addicionals" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Cerca al programari" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Mostra'n més" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Mostra'n més" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "S'està suprimint…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Requereix reiniciar per a acabar la instal·lació" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Requereix reiniciar per a finalitzar la supressió" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Pendent d'instal·lació…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Pendent de les actualitzacions…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "S'està baixant…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "S'està preparant…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "S'està desinstal·lant…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s no està instal·lat, però encara en queden dades." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Reinicia" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Habilita…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instal·la…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s apareixerà en anglès americà" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Aquesta aplicació apareixerà en anglès americà" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Aquesta aplicació apareixerà en anglès americà" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "_Ajudeu a traduir-la" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Altres aplicacions de %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "El desenvolupador %s ha demostrat la propietat de %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "El desenvolupador ha demostrat la propietat de %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Cal accés a Internet perquè pugueu escriure una ressenya" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Aquesta aplicació ja no rep actualitzacions, ni tampoc correccions de " +"seguretat" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Aquesta aplicació ja es proporciona amb la vostra distribució i no heu de " +"substituir-la." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Aquesta aplicació no proporciona cap enllaç a un lloc web, repositori de " +"codi o sistema de gestió d'incidents." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Aquest programari ja no rep actualitzacions, ni tampoc correccions de " +"seguretat" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Aquest programari ja es proporciona amb la vostra distribució i no heu de " +"substituir-ho." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Aquest programari no proporciona cap enllaç a un lloc web, repositori de " +"codi o sistema de gestió d'incidents." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"El programari ha fallat en recuperar la informació de «%s» i no pot mostrar " +"els detalls d'aquesta aplicació." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "S'ha rebut una resposta incorrecta del servidor de ressenyes" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "No s'ha pogut enviar la ressenya de «%s»: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Pàgina de detalls" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "S'estan carregant els detalls de l'aplicació" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verificat" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Obre" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Actualitza" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Desinstal·la" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Complements" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Aquesta aplicació només es pot fer servir si hi ha una connexió activa a " +"Internet." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "S'inclou repositori de programari" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"L'aplicació inclou un repositori de programari que proporciona " +"actualitzacions així com accés a altre programari." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "No s'inclouen repositoris de programari" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"L'aplicació no inclou cap repositori de programari. No s'actualitzarà a " +"versions més noves." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "S'ha identificat un repositori de programari" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"En afegir aquest repositori de programari tindreu accés a programari i " +"actualitzacions addicionals." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Utilitzeu només fonts de programari de confiança." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Elimina les dades de l'aplicació" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Esborra les dades" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Sense metadades" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Lloc _web del projecte" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Feu un donatiu" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Col·laboreu a la traducció" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Informeu d'un problema" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Ajuda" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contacteu" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Escriviu una ressenya" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Totes les ressenyes" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "No es poden mostrar els detalls de l'aplicació" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Ha fallat la preparació per a reiniciar" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Error desconegut" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "No s'ha trobat la clau" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "La clau no està inscrita" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Cal inscripció MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "Següe_nt" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Aquest dispositiu té activat l'arrencada segura. Per a permetre que " +"s'habilitin els controladors nous, s'ha d'inscriure una clau nova del " +"propietari de la màquina (MOK). El procés requereix que s'introdueixi una " +"contrasenya més endavant en el procés. Tingueu en compte la següent " +"contrasenya associada a la clau:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "_He fet una nota de la contrasenya MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Reinicia i inscriu…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instruccions de configuració: Llegiu amb cura" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Després de reiniciar, es mostrarà una pantalla de configuració del " +"dispositiu. Per a habilitar els controladors nous, procediu a través dels " +"passos de configuració:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Seleccioneu «Inscriure MOK»\n" +"• Seleccioneu «Sí» per a inscriure claus\n" +"• Introduïu la contrasenya MOK quan se us demani\n" +"• Després seleccioneu «Reinicia»" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Implicacions de seguretat" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Després d'una correcta inscripció de la clau, tingueu en compte que " +"qualsevol actualització futura del mòdul o qualsevol altre mòdul serà de " +"confiança implícita. Totes les actualitzacions futures es produiran de " +"manera transparent sense cap interacció ni autorització." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Podeu trobar més orientació a la pàgina de documentació." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "S'estan baixant fitxers de metadades extres…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " i " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tipus de lletres disponibles per a l'script %s" +msgstr[1] "Tipus de lletres disponibles per als scripts %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Programari disponible per %s" +msgstr[1] "Programari disponible per %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "No s'ha trobat el programari sol·licitat" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "No s'ha pogut trobar el programari demanat" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "No s'ha trobat %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "al lloc web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "No s'ha trobat cap aplicació disponible que proporcioni el fitxer %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informació sobre %s, així com opcions per a saber com obtenir aplicacions " +"que falten poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "" +"No s'ha trobat cap aplicació disponible per a la compatibilitat amb %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s no està disponible." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per a saber com obtenir una aplicació " +"que pugui reproduir aquest format poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" +"No s'ha trobat cap tipus de lletra disponible per a la compatibilitat amb " +"l'script %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per a saber com obtenir tipus de " +"lletra addicionals poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "No s'ha trobat cap còdec disponible per al format %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per a saber com obtenir un còdec que " +"pugui reproduir aquest format poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "No s'ha trobat cap recurs Plasma per a la compatibilitat amb %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per a saber com obtenir recursos " +"Plasma addicionals poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "No s'ha trobat cap controlador d'impressora per a %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per a saber com obtenir un controlador " +"per a aquesta impressora poden trobar-se %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "la documentació" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"No s'ha pogut trobar %s sol·licitat per %s. Per a més informació consulteu " +"%s." +msgstr[1] "" +"No s'han pogut trobar %s sol·licitades per %s. Per a més informació " +"consulteu %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"No s'han pogut trobar %s que cercàveu. Per a més informació consulteu %s." +msgstr[1] "" +"No s'han pogut trobar %s que cercàveu. Per a més informació consulteu %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "No s'ha pogut trobar cap resultat de cerca: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Format de fitxer %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Instal·la-ho _Tot" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "No s'ha pogut trobar el programari demanat" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Pàgina de còdecs" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "No s'ha trobat cap resultat" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "No s'ha pogut realitzar la cerca" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Previ" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Següent" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Llista d'aplicacions destacades" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Compatibilitat amb escriptori" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Es pot utilitzar en una pantalla gran" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Compatibilitat amb escriptori desconeguda" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"No hi ha prou informació per a saber si és compatible amb pantalles grans" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Requereix una pantalla gran" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "No és compatible amb escriptori" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "No pot ser usat en una pantalla gran" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Compatibilitat amb mòbil" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Es pot utilitzar en una pantalla petita" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Compatibilitat amb mòbil desconeguda" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"No hi ha prou informació per a saber si és compatible amb pantalles petites" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Requereix una pantalla petita" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "No és compatible amb mòbil" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "No es pot utilitzar amb una pantalla petita" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Compatibilitat de teclat" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Compatibilitat de teclat desconeguda" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "No hi ha prou informació per a saber si és compatible amb teclats" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Requereix teclat" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Compatible amb teclats" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "No és compatible amb teclat" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "No es pot usar amb un teclat" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Compatibilitat amb ratolí" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Requereix un ratolí o un dispositiu assenyalador" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Compatibilitat amb ratolí desconeguda" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"No hi ha prou informació per a saber si és compatible amb ratolins o " +"dispositius assenyaladors" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Requereix un ratolí" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "És compatible amb ratolins i dispositius assenyaladors" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "No és compatible amb ratolí" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "No es pot usar amb un ratolí o un dispositiu assenyalador" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Compatibilitat amb pantalla tàctil" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Compatibilitat amb pantalla tàctil desconeguda" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"No hi ha prou informació per a saber si és compatible amb pantalles tàctils" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Requereix pantalla tàctil" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Compatible amb pantalla tàctil" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "No és compatible amb pantalla tàctil" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "No pot ser usat en una pantalla tàctil" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Requereix un comandament de joc" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Requereix un comandament de joc" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Compatibilitat amb comandament de joc" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Compatible amb comandaments de joc" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s probablement funciona en aquest dispositiu" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s funciona en aquest dispositiu" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s probablement funciona en aquest dispositiu" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s no funcionarà correctament en aquest dispositiu" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s no funcionarà en aquest dispositiu" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Compatibilitat amb maquinari" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navegació" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navega a la pàgina explora" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navega a la pàgina instal·lat" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navega a la pàgina actualitza" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Obre la barra de cerca" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Windows" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Obre les preferències" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Obre els repositoris de programari" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Ajuda" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Obre les dreceres de teclat" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instal·lat" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Pàgina d'instal·lació" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "En curs" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplicacions" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Aplicacions web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Aplicacions del sistema" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Creat per la comunitat" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Involucreu-vos-hi" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aquesta aplicació es desenvolupa en obert per una comunitat internacional, i " +"es publica sota la llicència %s.\n" +"\n" +"Podeu participar i ajudar a millorar-la encara més." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aquesta aplicació es desenvolupa en obert per una comunitat internacional, i " +"es publica sota la llicència %s.\n" +"\n" +"Podeu participar i ajudar a millorar-la encara més." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aquest programari es desenvolupa en obert per una comunitat internacional, i " +"es publica sota la llicència %s.\n" +"\n" +"Podeu participar i ajudar a millorar-lo encara més." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aquest programari es desenvolupa en obert per una comunitat internacional, i " +"es publica sota la llicència %s.\n" +"\n" +"Podeu participar i ajudar a millorar-lo encara més." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Llicència desconeguda" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Més informació" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Aquesta aplicació no especifica amb quina llicència es desenvolupa i podria " +"ser propietària. Pot ser insegura en formes difícils de detectar, i pot " +"canviar sense supervisió.\n" +"\n" +"És possible que no pugueu contribuir a aquesta aplicació." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Aquest programari no especifica amb quina llicència es desenvolupa i podria " +"ser propietària. Pot ser insegur en formes difícils de detectar, i pot " +"canviar sense supervisió.\n" +"\n" +"És possible que no pugueu a aquest programari." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Propietària" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Aquesta aplicació no està desenvolupada en oberta, de manera que només els " +"seus desenvolupadors saben com funciona. Pot ser insegura en formes difícils " +"de detectar, i pot canviar sense supervisió.\n" +"\n" +"És possible que no pugueu contribuir a aquesta aplicació." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Aquest programari no es desenvolupa en obert, de manera que només els seus " +"desenvolupadors saben com funciona. Podria ser insegur, o fer activament " +"coses inadequades que són difícils de detectar o prevenir.\n" +"\n" +"Potser no podeu contribuir a aquest programari." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Llicència especial" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Aquesta aplicació es desenvolupa sota la llicència especial %s.\n" +"\n" +"És possible que no pugueu contribuir a aquesta aplicació." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Aquesta aplicació es desenvolupa sota la llicència especial «%s».\n" +"\n" +"És possible que no pugueu contribuir a aquesta aplicació." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Aquest programari es desenvolupa sota la llicència especial %s.\n" +"\n" +"És possible que no pugueu contribuir a aquest programari." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Aquest programari es desenvolupa sota la llicència especial «%s».\n" +"\n" +"És possible que no pugueu contribuir a aquest programari." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "S'estan actualitzant les dades" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "S'està carregant la pàgina" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "S'està iniciant" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Font desconeguda" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Usuari" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Afegits" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Suprimits" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Actualitzacions" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Desactualitzacions" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "fonts externes seleccionades" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Proporciona accés a programari addicional de %s. S'inclou algun programari " +"propietari." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Voleu habilitar la font de programari de tercers?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignora" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Habilita" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Disponible per al vostre sistema operatiu" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Disponible a %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Explora" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Pàgina de resum" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Aplicacions disponibles" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Altres categories" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "No s'ha trobat cap descripció detallada de l'aplicació" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Desconeguda" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_D'acord" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "L'usuari ha refusat la instal·lació" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Prepara %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Esteu segur de voler suprimir el repositori %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Es desinstal·laran totes les aplicacions de %s, i haureu de tornar a " +"instal·lar el repositori per a tornar-les a utilitzar." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Desinstal·la %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "No es podrà usar %s després d'eliminar-lo." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"No es podrà usar cap aplicació que depengui de %s després d'eliminar-lo." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"No es podrà usar %s després d'eliminar-lo, i els documents que l'usin es " +"mostraran amb un tipus de lletra diferent." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"No es podrà usar %s després d'eliminar-lo. Això pot implicar que alguns " +"fitxers multimèdia no es puguin reproduir." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"El maquinari que depèn de %s pot deixar de funcionar correctament després de " +"l'eliminació." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"No es podrà usar %s després d'eliminar-lo. Les dades i configuració de " +"l'aplicació romandran al disc per tal de permetre restaurar l'aplicació en " +"el futur." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferències" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Actualitzacions de programari" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Més informació" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"La comprovació i descàrrega d'actualitzacions utilitza dades i energia. Per " +"tant, les funcions d'actualització automàtica es posen en pausa quan es " +"troba a les connexions de xarxa limitades i quan l'estalvi d'energia està " +"activat." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automàtic" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Comprova i baixa automàticament les actualitzacions" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "La comprovació i baixada d'actualitzacions s'ha de fer manualment" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Notificacions de les actualitzacions automàtiques" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Notifica quan les actualitzacions s'hagin instal·lat automàticament" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtres de contingut" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Mostra només el programari _lliure" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Oculta el programari propietari en navegar i cercar" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Mostra només els desenvolupadors _verificats" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Mostra només les aplicacions dels desenvolupadors la identitat dels quals " +"s'ha verificat" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"El programari instal·lat no és compatible amb %s, i s'eliminarà " +"automàticament durant l'actualització." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Programari incompatible" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Actualitza" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Desinstal·la" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Configuració i dades de l'aplicació" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Mantingues" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Permet restaurar la configuració i el contingut de l'aplicació" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Esborra" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Esborra permanentment les dades per a guanyar espai de disc" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"El programari que s'ha instal·lat des de «%s» deixarà de rebre " +"actualitzacions." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Voleu inhabilitar el repositori?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Voleu suprimir el repositori?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Inhabilita" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Suprimeix" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Habilita els repositoris nous" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Activa els repositoris nous quan s'afegeixin" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "més informació" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "" +"Accediu a programari addicional des de fonts de programari de tercers " +"seleccionades — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Repositoris de tercers parts de Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "el sistema operatiu" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Aquests repositoris complementen el programari per defecte proveït per %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Repositoris de programari" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Cap repositori" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "S'ha instal·lat %u aplicació" +msgstr[1] "S'han instal·lat %u aplicacions" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "S'ha instal·lat %u connector" +msgstr[1] "S'han instal·lat %u connectors" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplicació" +msgstr[1] "%u aplicacions" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u connector" +msgstr[1] "%u connectors" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "S'ha instal·lat %s i %s" +msgstr[1] "S'han instal·lat %s i %s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Comprovant el programari instal·lat…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "_Suprimeix" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "L'odio" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "No m'agrada" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Està bé" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "M'agrada" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "N'estic enamorat" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Seleccioneu una estrella per a deixar una valoració" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Preneu-vos més temps per a escriure la ressenya" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Seleccioneu la valoració en estrelles" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "El resum és massa curt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "El resum és massa llarg" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "La descripció és massa curta" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "La descripció és massa llarga" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Escriviu una ressenya" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Envia" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Proporcioneu una valoració, un resum i una ressenya. Les ressenyes no s'han " +"d'utilitzar per a informar de problemes: en lloc d'això, poseu-vos en " +"contacte amb el desenvolupador o el vostre proveïdor de suport." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Resum de la ressenya" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Escriviu una ressenya curta" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Conegueu quines dades s'envien en la nostra política de privadesa. El vostre nom complet relacionat amb el " +"vostre compte es mostrarà públicament." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u ressenya en total" +msgstr[1] "%u ressenyes en total" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "de 5 estrelles" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Desconegut" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "Podeu informar de contingut abusiu, groller o discriminatori." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Un cop heu informat, la ressenya s'ocultarà fins que un administrador la " +"revisi." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Voleu informar d'una ressenya?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Informe" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Voleu esborrar una ressenya?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "No es pot desfer l'eliminació d'una revisió." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "M'agrada la ressenya" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Em desagrada la ressenya" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Informeu…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Suprimeix…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"L'aplicació no està en un espai aïllat, però la distribució ha comprovat que " +"no és maliciosa" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Comproveu que confieu en el proveïdor, ja que l'aplicació no està en un " +"espai aïllat" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Cap permís" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Aquesta aplicació està completament en un espai aïllat" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Accés a xarxa" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Pot accedir a Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Sense accés a xarxa" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "No pot accedir a Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Usa serveis del sistema" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Pot demanar dades als serveis del sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Usa serveis de sessió" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Pot demanar dades dels serveis de sessió" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Accés al dispositiu d'usuari" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Pot accedir a dispositius com ara càmeres web o controladors de joc" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Sense accés a dispositius de l'usuari" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"No pot accedir als dispositius com ara càmeres web o controladors de jocs" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Accés al dispositiu d'entrada" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Accés al micròfon i reproducció de sons" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Pot escoltar utilitzant micròfons i reproduir sons sense demanar permís" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Accés a dispositius del sistema" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "Pot accedir a dispositius del sistema que requereixen permisos elevats" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Accés al contingut de la pantalla" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Pot accedir als continguts de la pantalla o d'altres finestres" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Sistema antic de finestres" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Permisos arbitraris" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Paràmetres de l'usuari" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Accés complet de lectura/escriptura al sistema de fitxers" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Pot llegir i escriure totes les dades al sistema de fitxers" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Accés de lectura/escriptura a la carpeta de l'usuari" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Pot llegir/escriure totes les dades de la carpeta de l'usuari" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Accés complet de lectura del sistema de fitxers" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Pot llegir totes les dades del sistema de fitxers" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Pot llegir la carpeta de l'usuari" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Pot llegir totes les dades del directori de l'usuari" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Accés de lectura/escriptura al directori de baixades" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Pot llegir i escriure totes les dades del directori de baixades" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Accés de lectura al directori de baixades" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Pot llegir totes les dades del directori de baixades" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Pot llegir/escriure totes les dades del directori" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Pot llegir totes les dades del directori" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Sense accés al sistema de fitxers" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "No pot accedir de cap manera al sistema de fitxers" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "El desenvolupador de l'aplicació està verificat" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"S'ha verificat que el desenvolupador d'aquesta aplicació és qui diu que és" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Dependències insegures" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"El programari o les seves dependències ja no són compatibles i poden ser " +"insegurs" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Aquesta aplicació no especifica amb quina llicència es desenvolupa i podria " +"ser propietària" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Aquest programari no especifica amb quina llicència es desenvolupa i podria " +"ser propietari" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Codi propietari" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"El codi font no és públic, per això no es pot auditar de manera independent " +"i podria ser insegur" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Aquesta aplicació es desenvolupa sota la llicència especial «%s»" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Aquest programari es desenvolupa sota la llicència especial «%s»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Codi auditable" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"El codi font és públic i es pot auditar de forma independent, cosa que fa " +"que l'aplicació sigui més segura" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s és privilegiat" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s és segur" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s és probablement segur" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s és potencialment insegur" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s és insegur" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Desconeguda" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Seguretat" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Llicència" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Font" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Aquesta aplicació utilitza una versió obsoleta de la plataforma de " +"programari (SDK) i pot contenir errors o vulnerabilitats de seguretat que no " +"es corregiran." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Captura de pantalla anterior" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Captura de pantalla següent" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Sense captures de pantalla" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "No s'ha trobat la captura de pantalla" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "No s'ha pogut carregar la imatge" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "No s'ha trobat la mida de la captura de pantalla" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "No s'ha pogut crear la memòria cau" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "La captura de pantalla no és vàlida" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "La captura de pantalla no està disponible" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u coincidència més" +msgstr[1] "%u coincidències més" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Pàgina de cerca" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Cerca aplicacions" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "No s'ha trobat cap aplicació" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "No s'han pogut baixar les actualitzacions" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "No s'han pogut baixar les actualitzacions del microprogramari" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "No s'han pogut baixar actualitzacions de microprogramari des de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "No s'han pogut baixar les actualitzacions des de %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "No s'ha pogut actualitzar: cal accés a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "No s'ha pogut actualitzar: no hi ha prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"No s'han pogut baixar les actualitzacions des de %s: no hi havia prou espai " +"al disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "No s'ha pogut actualitzar: es requereix autenticació" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "No s'ha pogut actualitzar: l'autenticació no és vàlida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "No s'ha pogut actualitzar: es requereix permís" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"No s'han pogut baixar les actualitzacions: no teniu permís per a instal·lar " +"programari" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "No s'ha pogut obtenir una llista d'actualitzacions" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "No s'ha pogut instal·lar: ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "No s'ha pogut instal·lar %s: ha fallat la baixada des de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "No s'ha pogut instal·lar %s: ha fallat la baixada" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "No s'ha pogut instal·lar: falta temps d'execució" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "No s'ha pogut instal·lar %s: l'entorn d'execució %s no està disponible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "No s'ha pogut instal·lar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "No s'ha pogut instal·lar: cal accés a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "No s'ha pogut instal·lar: el format de l'aplicació no és vàlid" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "No s'ha pogut instal·lar: no hi ha prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "No s'ha pogut instal·lar %s: no hi ha prou espai al disc" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "No s'ha pogut instal·lar: es requereix autenticació" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "No s'ha pogut instal·lar %s: es requereix autenticació" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "No s'ha pogut instal·lar: l'autenticació no és vàlida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "No s'ha pogut instal·lar %s: l'autenticació no és vàlida" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "No s'ha pogut instal·lar: es requereix permís" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "No s'ha pogut instal·lar %s: es requereix permís" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "No s'ha pogut actualitzar: cal estar connectat al corrent" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "No s'ha pogut actualitzar %s: cal estar connectat al corrent" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "No s'ha pogut instal·lar: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "No s'ha pogut instal·lar %s: la bateria està baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "No s'ha pogut actualitzar %s des de %s: ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "No s'ha pogut actualitzar %s: ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"No s'ha pogut instal·lar actualitzacions des de %s: ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "No s'ha pogut actualitzar: ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "No s'ha pogut actualitzar %s: no hi ha prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "No s'ha pogut actualitzar %s: es requereix autenticació" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "No s'ha pogut actualitzar %s: l'autenticació no és vàlida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "No s'ha pogut actualitzar %s: es requereix permís" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "No s'ha pogut actualitzar: cal estar connectat al corrent" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "No s'ha pogut actualitzar %s: cal estar connectat al corrent" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "No es pot actualitzar: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "No es pot actualitzar %s: la bateria està baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "No es pot actualitzar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "No es pot actualitzar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "No s'ha pogut actualitzar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "No es pot actualitzar a %s des de %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "No s'ha pogut actualitzar: ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "No s'ha pogut actualitzar %s: ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "No s'ha pogut actualitzar: cal accés a Internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "No s'ha pogut actualitzar a %s: cal accés a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "No s'ha pogut actualitzar: no hi ha prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "No s'ha pogut actualitzar a %s: no hi ha prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "No s'ha pogut actualitzar: es requereix autenticació" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "No s'ha pogut actualitzar a %s: es requereix autenticació" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "No s'ha pogut actualitzar: l'autenticació no és vàlida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "No s'ha pogut actualitzar %s: l'autenticació no és vàlida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "No s'ha pogut actualitzar: es requereix permís" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "No s'ha pogut actualitzar a %s: es requereix permís" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "No s'ha pogut actualitzar: el dispositiu s'ha de connectar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "No s'ha pogut actualitzar a %s: el dispositiu s'ha de connectar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "No s'ha pogut actualitzar: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "No s'ha pogut actualitzar a %s: la bateria està baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "No es pot actualitzar a %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "No s'ha pogut desinstal·lar: es requereix autenticació" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "No s'ha pogut desinstal·lar %s: es requereix autenticació" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "No s'ha pogut desinstal·lar: l'autenticació no és vàlida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "No s'ha pogut desinstal·lar %s: l'autenticació no és vàlida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "No s'ha pogut desinstal·lar: cal permís" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "No s'ha pogut desinstal·lar %s: cal permís" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "No s'ha pogut desinstal·lar: s'ha de connectar el dispositiu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "No s'ha pogut desinstal·lar %s: el dispositiu s'ha de connectar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "No s'ha pogut desinstal·lar: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "No s'ha pogut desinstal·lar %s: la bateria està baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "No s'ha pogut desinstal·lar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "No s'ha pogut llançar %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "S'ha produït un error" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "No s'ha pogut executar %s: %s no està instal·lat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "No hi ha prou espai al disc per a l'operació" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "No s'ha pogut instal·lar: el tipus de fitxer no és compatible" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "No s'ha pogut instal·lar: ha fallat l'autenticació" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "No s'ha pogut instal·lar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "No s'ha pogut contactar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Reinicia el programari per a utilitzar connectors nous" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "El dispositiu s'ha de connectar" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "El nivell de la bateria és massa baix" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Repositoris de programari" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferències" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Dreceres del teclat" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Quant al Programari" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Cerca" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menú principal" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Cerca aplicacions" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Explora" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instal·lat" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Actualitza" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Ves enrere" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Res" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Dades de l'aplicació" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Dades necessàries perquè l'aplicació s'executi" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Dades de l'usuari" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Dades creades per vosaltres en l'aplicació" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Dades de la memòria cau" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dades temporals a la memòria cau" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "L'aplicació" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dependències necessàries" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Components de sistema compartits necessaris per a aquesta aplicació" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Desconeguda" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Les dades emmagatzemades en memòria cau es poden netejar des dels _paràmetres de l'aplicació" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Emmagatzematge" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (instal·lat)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (s'està instal·lant)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (S'està baixant)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (s'està suprimint)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detalls" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examina" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Instal·lat al %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Actualitzacions instal·lades" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "No s'han instal·lat actualitzacions" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Les actualitzacions estan obsoletes" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Comprova si hi ha actualitzacions" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Les actualitzacions crítiques estan a punt per a instal·lar" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Instal·leu les actualitzacions al més aviat possible" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Les actualitzacions crítiques estan disponibles per a descarregar" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Descarregueu les actualitzacions crítiques al més aviat possible" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Les actualitzacions estan a punt per a instal·lar" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Les actualitzacions de programari estan a punt i esperant" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Les actualitzacions estan disponibles per a descarregar" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Les actualitzacions de programari es poden descarregar" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplicació actualitzada. Cal reiniciar" +msgstr[1] "%u aplicacions actualitzades. Cal reiniciar" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplicació actualitzada" +msgstr[1] "%u aplicacions actualitzades" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s s'ha actualitzat." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Reinicieu l'aplicació." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s i %s s'han actualitzat." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplicació requereix un reinici." +msgstr[1] "%u aplicacions requereixen un reinici." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inclou %s, %s i %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "El sistema ha arribat al final de la vida útil" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Actualitzeu-vos per a continuar rebent actualitzacions" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Una nova versió de %s està disponible per a instal·lar" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Hi ha actualitzacions disponibles" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "No s'ha pogut realitzar l'actualització de programari" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Les actualitzacions preparades no s'han instal·lat" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Mostra els detalls" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "S'ha completat l'actualització del sistema" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Us donem la benvinguda a %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "S'ha instal·lat l'actualització de programari" +msgstr[1] "S'han instal·lat les actualitzacions de programari" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "S'ha instal·lat una actualització important del sistema operatiu." +msgstr[1] "S'han instal·lat actualitzacions importants del sistema operatiu." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Revisa" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "No s'ha pogut actualitzar" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "El sistema ja estava actualitzat." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Es va cancel·lar l'actualització." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Calia accés a Internet però no estava disponible. Assegureu-vos que teniu " +"accés a Internet i torneu-ho a provar." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Hi ha hagut problemes de seguretat amb l'actualització. Consulteu el " +"proveïdor per a més detalls." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"No hi havia prou espai a disc. Allibereu espai a disc i torneu-ho a provar." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"S'ha produït un error en instal·lar l'actualització. Espereu a una " +"actualització nova i torneu a provar-ho. Si el problema persisteix, " +"contacteu amb el vostre proveïdor de programari." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Darrera comprovació: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Atura" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Comprova si hi ha actualitzacions" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ha deixat de rebre actualitzacions crítiques de programari" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"El vostre sistema operatiu ha deixat de rebre actualitzacions crítiques de " +"programari" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Es poden aplicar càrrecs" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"La comprovació d'actualitzacions mentre s'utilitza la xarxa mòbil pot " +"incórrer en càrrecs." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Comprova-ho de totes maneres" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Actualitzacions de programari descarregades" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Les actualitzacions estan a punt per a instal·lar" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Comprova si hi ha actualitzacions" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Actualitzacions" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Pàgina d'actualitzacions" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "S'estan carregant les actualitzacions" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Això pot trigar una estona" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Està al dia" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Utilitza dades mòbils?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"La comprovació d'actualitzacions quan utilitzeu la xarxa mòbil pot incórrer " +"en l'aplicació de càrrecs" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Comprova de totes formes" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Sense connexió" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Connecteu-vos per a comprovar si hi ha actualitzacions" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Paràmetres de la _xarxa" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Error" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Les actualitzacions es gestionen automàticament" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Actualitzacions de programari en pausa" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Les actualitzacions automàtiques de programari s'han aturat per les raons " +"següents:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• La connexió de xarxa actual està mesurada" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• La connexió de xarxa actual prohibeix baixades grans" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• El mode d'estalvi d'energia està actiu" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• El mode de joc està actiu" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Actualitzacions de programari en pausa" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"La connexió de xarxa està mesurada — s'han posat en pausa les " +"actualitzacions de programari" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"La connexió de xarxa prohibeix les baixades grans — s'han posat en pausa les " +"actualitzacions de programari" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"El mode d'estalvi d'energia està actiu — s'han posat en pausa les " +"actualitzacions de programari" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "" +"El mode de joc està actiu — s'han posat en pausa les actualitzacions de " +"programari" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "R_einicia i actualitza…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "A_ctualitza-ho tot" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Actualitzacions de programari descarregades" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Les actualitzacions estan a punt per a instal·lar" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Microprogramari integrat" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Cal reiniciar" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Actualitzacions" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Microprogramari del dispositiu" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Baixa" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s disponible" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s disponible" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Apreneu sobre la versió nova" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s de %s baixats" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% baixat" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Una actualització major, amb noves funcionalitat i més polida." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Cancel·la l'actualització" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Reinicia i actualitza…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Recordeu fer una còpia de seguretat de les dades abans d'actualitzar." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Detalls de l'error" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Copia els detalls" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "No s'ha pogut esborrar el fitxer «%s»: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "No s'ha pogut esborrar el directori «%s»: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Afegeix, suprimeix o actualitza programari en aquest ordinador" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Actualitzacions;Actualització;Fonts;Repositoris;Preferències;Instal·lació;" +"Desinstal·lació;Aplicació;Programa;Apli;Botiga;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s Llest" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"El %s està a punt per a activar-se i posar-se en fase per a la següent " +"arrencada." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Habilita" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Actualitzacions del sistema" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Actualitzacions del sistema generals, com ara correccions de seguretat o " +"errors, i millores de rendiment." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Actualització %s amb noves característiques i correccions." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"El servei d'actualitzacions EOS no ha pogut obtenir i aplicar " +"l'actualització." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Aplicacions Web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Compatibilitat amb aplicacions Web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Executa aplicacions web populars en un navegador" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Actualitzeu per a obtenir les últimes funcions, millores rendiment i " +"estabilitat." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Compatibilitat amb Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak és un espai de treball per a aplicacions d'escriptori a Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Carpeta del sistema %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Subcarpeta d'usuari %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Carpetes del sistema d'amfitrió" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Configuració del sistema d'amfitrió des de /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Carpeta d'escriptori" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Subcarpeta d'escriptori %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Carpeta de documents" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Subcarpeta de documents %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Carpeta de música" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Subcarpeta de música %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Carpeta d'imatges" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Subcarpeta d'imatges %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Carpeta de compartició pública" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Subcarpeta de compartició pública %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Carpeta de vídeos" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Subcarpeta de vídeo %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Carpeta de plantilles" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Subcarpeta de plantilles %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Carpeta de la memòria cau de l'usuari" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Subcarpeta de memòria cau d'usuari %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Carpeta de configuració de l'usuari" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Subcarpeta de configuració de l'usuari %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Carpeta de dades d'usuari" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Subcarpeta de dades d'usuari %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Carpeta d'execució de l'usuari" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Subcarpeta d'execució d'usuari %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Accés al sistema de fitxers a %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "S'estan obtenint les metadades del flatpak per a %s…" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "No s'ha pogut refinar el complement «%s»: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instal·lació d'usuari" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instal·lació de sistema" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Identificador de l'aplicació" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "No s'ha pogut afegir al complement «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "No s'ha pogut afegir al complement «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"El remot «%s» no permet la instal·lació de «%s», possiblement a causa del " +"seu filtre. Suprimeix el filtre i repeteix la instal·lació. Error detallat: " +"%s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "La bateria és massa baixa per a realitzar l'actualització" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"La bateria és massa baixa per a realitzar l'actualització (%u%%, requereix " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "" +"El dispositiu no és accessible, o està fora del rang de la xarxa sense fil" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "El nivell de la bateria és massa baix" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "La bateria del dispositiu és massa baixa (%u%%, requereix %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "El dispositiu està esperant que s'apliqui l'actualització" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "El dispositiu requereix que es connecti a la xarxa elèctrica" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "El dispositiu no es pot utilitzar si la tapa està tancada" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Actualització del dispositiu %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Actualització del sistema %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Actualització del controlador encastat %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Actualització ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Actualització ME corporatiu %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Actualització ME del consumidor %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Actualització del controlador %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Actualització del controlador Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Actualització del microcodi CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Actualització de la configuració %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Actualització de la bateria %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Actualització de la càmera %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Actualització del TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Actualització del ratolí tàctil %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Actualització del ratolí %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Actualització del teclat %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Actualització del controlador d'emmagatzematge %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Actualització de la interfície de xarxa %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Actualització de la pantalla %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Actualització BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Actualització del receptor USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Actualització de la unitat %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Actualització de la unitat flaix %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Actualització de la SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Actualització de la GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Actualització de l'acoblador %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Actualització de l'acoblador USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Microprogramari" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "No s'ha pogut aplicar l'actualització del microprogramari: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Compatibilitat amb actualitzacions de microprogramari" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Proveeix compatibilitat amb actualitzacions de microprogramari" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Voleu instal·lar programari sense signar?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"El programari que s'ha d'instal·lar no està signat. No serà possible " +"verificar l'origen de les actualitzacions d'aquest programari, o si les " +"actualitzacions han estat manipulades." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Voleu baixar el programari sense signar?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Les actualitzacions no signades estan disponibles. Sense signatura, no és " +"possible verificar l'origen de l'actualització, o si ha estat manipulada." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Voleu actualitzar el programari no signat?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Les actualitzacions no signades estan disponibles. Sense signatura, no és " +"possible verificar l'origen de l'actualització, o si ha estat manipulada. " +"Les actualitzacions de programari es desactivaran fins que les " +"actualitzacions no signades se suprimeixin o s'actualitzin." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "No s'han pogut instal·lar les actualitzacions: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paquets" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "No s'ha pogut esperar al final de l'operació abans de baixar: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "No s'han pogut baixar les actualitzacions: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "No s'ha pogut activar l'actualització: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Sistema operatiu (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Botiga de Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Compatibilitat amb Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Un «snap» és un paquet Linux universal" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistema" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Component del sistema" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "" +"S'està eliminant la tasca d'actualització del sistema '%s', que havia fallat " +"amb codi d'estat %i" diff --git a/po/ca@valencia.po b/po/ca@valencia.po new file mode 100644 index 0000000..1b64272 --- /dev/null +++ b/po/ca@valencia.po @@ -0,0 +1,4789 @@ +# Catalan translation for gnome-software. +# Copyright (C) 2012 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-calendar package. +# +# Jordi Mas i Hernandez , 2013, 2015, 2016, 2017 +# Gil Forcada , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"software&keywords=I18N+L10N&component=General\n" +"POT-Creation-Date: 2017-09-30 08:23+0000\n" +"PO-Revision-Date: 2017-08-21 09:10+0200\n" +"Last-Translator: Xavi Ivars \n" +"Language-Team: Catalan \n" +"Language: ca-valencia\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Id-Version: gnome-software master\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.0.1\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "Programari del GNOME" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "Gestor d'aplicacions per al GNOME" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" +"El Programari vos permet buscar i instal·lar aplicacions noves i extensions " +"del sistema així com eliminar aplicacions ja instal·lades." + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" +"El Programari del GNOME mostra aplicacions populars i destacades amb " +"descripcions útils i amb múltiples captures de pantalla per aplicació. Les " +"aplicacions es poden trobar tan navegant per la llista de categories com " +"cercant. També vos permet actualitzar el sistema utilitzant l'actualització " +"fora de línia." + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "Quadre de resum" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "Quadre de detalls" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "S'ha instal·lat el quadre" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "Quadre d'actualitzacions" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "Detalls de l'actualització" + +#: data/appdata/org.gnome.Software.appdata.xml.in:884 +msgid "The GNOME Project" +msgstr "El projecte GNOME" + +#: data/org.gnome.software.external-appstream.policy.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instal·la un fitxer Appstream en una ubicació de sistema" + +#: data/org.gnome.software.external-appstream.policy.in:12 +msgid "Installing an appstream file into a system location" +msgstr "S'està instal·lant un fitxer Appstream en una ubicació de sistema" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Una llista de projectes compatibles" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Esta és una llista de projectes compatibles que hem de mostrar com ara el " +"GNOME, el KDE i l'XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates in GNOME Software" +msgstr "Si es gestionen les actualitzacions amb el Programari del GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel and not perform any " +"automatic updates actions." +msgstr "" +" Si s'inhabilita, el Programari del GNOME ocultarà el quadre " +"d'actualitzacions i no realitzarà cap acció automàtica d'actualització." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Whether to automatically download updates" +msgstr "Si s'han de baixar les actualitzacions automàticament" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads updates in the background " +"and prompts the user to install them when ready." +msgstr "" +"Si s'habilita, el Programari del GNOME baixa actualitzacions automàticament " +"en segon pla i demana a l'usuari instal·lar-les quan estan llestes." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Si s'ha de refrescar automàticament en una connexió limitada" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Si s'habilita, el Programari del GNOME refresca automàticament en rerefons " +"inclús quan s'utilitza una connexió limitada (finalment baixant metadades, " +"comprovant actualitzacions, etc el que podria representar despesa per " +"l'usuari)." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Si és la primera execució del Programari del GNOME" + +#: data/org.gnome.software.gschema.xml:29 +msgid "Show star ratings next to applications" +msgstr "Mostra les valoracions en estrelles al costat de les aplicacions" + +#: data/org.gnome.software.gschema.xml:33 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtra les aplicacions basant-se en la branca per defecte configurada pel " +"remot" + +#: data/org.gnome.software.gschema.xml:37 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Les aplicacions no lliures mostren un diàleg d'avís abans d'instal·lar-se" + +#: data/org.gnome.software.gschema.xml:38 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Quan s'instal·len aplicacions no lliures es pot mostrar un diàleg d'avís. " +"Això controla si el diàleg se suprimeix." + +#: data/org.gnome.software.gschema.xml:42 +msgid "A list of popular applications" +msgstr "Una llista d'aplicacions populars" + +#: data/org.gnome.software.gschema.xml:43 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "" +"Una llista d'aplicacions a usar, substituint les definides pel sistema." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The list of extra sources that have been previously enabled" +msgstr "La llista de fonts extra que han sigut prèviament habilitades" + +#: data/org.gnome.software.gschema.xml:48 +msgid "" +"The list of sources that have been previously enabled when installing third-" +"party applications." +msgstr "" +"La llista de fonts que han estat prèviament habilitades quan s'han " +"instal·lat aplicacions de tercers." + +#: data/org.gnome.software.gschema.xml:52 +msgid "The last update check timestamp" +msgstr "La marca horària de l'última comprovació d'actualització" + +#: data/org.gnome.software.gschema.xml:56 +msgid "The last upgrade notification timestamp" +msgstr "La marca horària de l'última comprovació d'actualització" + +#: data/org.gnome.software.gschema.xml:60 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"La marca horària de la primera actualització de seguretat, netejada després " +"de l'actualització" + +#: data/org.gnome.software.gschema.xml:64 +msgid "The last update timestamp" +msgstr "La marca horària de l'última actualització" + +#: data/org.gnome.software.gschema.xml:68 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"El temps en segons per verificar si la captura de pantalla font és encara " +"vàlida" + +#: data/org.gnome.software.gschema.xml:69 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Si escolliu un valor gran hi haurà menys connexions al servidor remot però " +"les captures de pantalla poden trigar més temps a mostrar-se actualitzades a " +"l'usuari. Un valor de 0 significa que no es comprovi mai el servidor si " +"existeix una imatge en la memòria cau." + +#: data/org.gnome.software.gschema.xml:78 +msgid "The server to use for application reviews" +msgstr "El servidor a utilitzar per les ressenyes d'aplicacions" + +#: data/org.gnome.software.gschema.xml:82 +msgid "The minimum karma score for reviews" +msgstr "La puntuació de karma mínima per les ressenyes" + +#: data/org.gnome.software.gschema.xml:83 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Ressenyes amb karma inferior a este nombre no es mostraran." + +#: data/org.gnome.software.gschema.xml:87 +msgid "A list of official sources that should not be considered 3rd party" +msgstr "" +"Una llista de fonts oficials que no han de ser considerades de terceres parts" + +#: data/org.gnome.software.gschema.xml:91 +msgid "A list of official sources that should be considered free software" +msgstr "" +"Una llista de fonts oficials que han de ser considerades de programari lliure" + +#: data/org.gnome.software.gschema.xml:95 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"L'URL de la llicència a usar quan l'aplicació ha de ser considerada " +"programari lliure" + +#: data/org.gnome.software.gschema.xml:99 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Instal·la paquets d'aplicacions per a tots els usuaris del sistema quan " +"siga possible " + +#: data/org.gnome.software.gschema.xml:103 +msgid "Show the folder management UI" +msgstr "Mostra la interfície de gestió de carpetes" + +#: data/org.gnome.software.gschema.xml:107 +msgid "Allow access to the Software Sources dialog" +msgstr "Permet l'accés al diàleg fonts de programari" + +#: data/org.gnome.software.gschema.xml:111 +msgid "Offer upgrades for pre-releases" +msgstr "Ofereix actualitzacions per versions preliminars" + +#: data/org.gnome.software.gschema.xml:115 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Mostra alguns elements d'interfície d'usuari indicant que l'aplicació no és " +"lliure" + +#: data/org.gnome.software.gschema.xml:119 +msgid "Show the prompt to install nonfree software sources" +msgstr "" +"Mostra la pregunta abans d'instal·lar de fonts de programari no lliures" + +#: data/org.gnome.software.gschema.xml:123 +msgid "Show non-free software in search results" +msgstr "Mostra programari no lliure als resultats de la busca" + +#: data/org.gnome.software.gschema.xml:127 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Mostra la mida de les aplicacions instal·lades a la llista d'aplicacions " +"instal·lades" + +#: data/org.gnome.software.gschema.xml:131 +msgid "The URI that explains nonfree and proprietary software" +msgstr "L'URI que explica programari no lliure i de propietat" + +#: data/org.gnome.software.gschema.xml:135 +msgid "A list of non-free sources that can be optionally enabled" +msgstr "La llista de fonts no lliures que poden habilitar-se opcionalment" + +#: data/org.gnome.software.gschema.xml:139 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "" +"Una llista dels URL que apunten als fitxers Appstream que es baixaran a la " +"carpeta app-info" + +#: data/org.gnome.software.gschema.xml:143 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "" +"Instal·la un fitxer Appstream en una ubicació de sistema per a tots els " +"usuaris" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "Instal·lació de programari" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instal·la el programari seleccionat al sistema" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/gnome-software-local-file.desktop.in:10 +msgid "system-software-install" +msgstr "system-software-install" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "Selecciona-ho tot" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "No seleccionis res" + +#: src/gnome-software.ui:24 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programari" + +#: src/gnome-software.ui:43 src/gs-sources-dialog.ui:23 +#: src/gs-update-dialog.ui:21 +msgid "Go back" +msgstr "Vés arrere" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:77 +msgid "_All" +msgstr "_Tot" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gnome-software.ui:104 +msgid "_Installed" +msgstr "Instal·lat" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gnome-software.ui:155 +msgid "_Updates" +msgstr "Act_ualitzacions" + +#: src/gnome-software.ui:251 +msgid "Search" +msgstr "Busca" + +#. button in the info bar +#: src/gnome-software.ui:350 src/gs-sources-dialog.ui:6 +#: src/gs-sources-dialog.ui:46 +msgid "Software Sources" +msgstr "Fonts de programari" + +#. button in the info bar +#: src/gnome-software.ui:361 +msgid "Examine Disk" +msgstr "Examina el disc" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:372 src/gs-updates-page.c:1391 +msgid "Network Settings" +msgstr "Paràmetres de xarxa" + +#. button in the info bar +#: src/gnome-software.ui:383 +msgid "Restart Now" +msgstr "Reinicia ara" + +#. button in the info bar +#: src/gnome-software.ui:394 +msgid "More Information" +msgstr "Més informació" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:430 src/gs-details-page.ui:344 +msgid "Pending" +msgstr "Pendent" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.ui:209 src/gs-app-tile.ui:51 +#: src/gs-feature-tile.c:88 src/gs-popular-tile.c:70 +msgid "Installed" +msgstr "Instal·lat" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:218 src/gs-details-page.c:439 +msgid "Installing" +msgstr "S'està instal·lant" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#: src/gs-app-addon-row.c:109 src/gs-app-row.c:224 +msgid "Removing" +msgstr "S'està suprimint" + +#: src/gs-app-folder-dialog.c:310 +msgid "Folder Name" +msgstr "Nom de la carpeta" + +#: src/gs-app-folder-dialog.c:321 src/gs-app-folder-dialog.ui:16 +#: src/gs-details-page.c:379 src/gs-details-page.ui:330 src/gs-editor.c:623 +#: src/gs-editor.c:655 src/gs-installed-page.c:609 src/gs-removal-dialog.ui:33 +#: src/gs-review-dialog.ui:23 src/gs-upgrade-banner.ui:131 +msgid "_Cancel" +msgstr "_Cancel·la" + +#: src/gs-app-folder-dialog.c:326 src/gs-app-folder-dialog.ui:24 +msgid "_Add" +msgstr "_Afig" + +#: src/gs-app-folder-dialog.ui:5 +msgid "Add to Application Folder" +msgstr "Afig a la carpeta d'aplicacions" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:99 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Mode d'inici: siga «updates» (actualitzacions), «updated» (actualitzat), " +"«installed» (instal·lat) o «overview» (resum)" + +#: src/gs-application.c:99 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:101 +msgid "Search for applications" +msgstr "Busca aplicacions" + +#: src/gs-application.c:101 +msgid "SEARCH" +msgstr "CERCA" + +#: src/gs-application.c:103 +msgid "Show application details (using application ID)" +msgstr "Mostra els detalls de l'aplicació (utilitzant l'ID d'aplicació)" + +#: src/gs-application.c:103 src/gs-application.c:107 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:105 +msgid "Show application details (using package name)" +msgstr "Mostra els detalls de l'aplicació (utilitzant el nom de paquet)" + +#: src/gs-application.c:105 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:107 +msgid "Install the application (using application ID)" +msgstr "Instal·la l'aplicació (utilitzant l'ID d'aplicació)" + +#: src/gs-application.c:109 +msgid "Open a local package file" +msgstr "Obri un fitxer de paquet local" + +#: src/gs-application.c:109 +msgid "FILENAME" +msgstr "NOM DE FITXER" + +#: src/gs-application.c:111 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"El tipus d'interacció que s'espera per esta acció: ‘none’, ‘notify’, o " +"‘full’" + +#: src/gs-application.c:114 +msgid "Show verbose debugging information" +msgstr "Mostra informació de depuració detallada" + +#: src/gs-application.c:116 +msgid "Show profiling information for the service" +msgstr "Mostra informació de depuració per al servei" + +#: src/gs-application.c:118 +msgid "Quit the running instance" +msgstr "Ix de la instància en execució" + +#: src/gs-application.c:120 +msgid "Prefer local file sources to AppStream" +msgstr "Prefereix fonts de fitxer locals abans que de l'AppStream" + +#: src/gs-application.c:122 +msgid "Show version number" +msgstr "Mostra el número de versió" + +#: src/gs-application.c:306 +msgid "translator-credits" +msgstr "Jordi Mas i Hernàndez , 2013-2017" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:313 +#, c-format +msgid "About %s" +msgstr "Quant a %s" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:317 +msgid "A nice way to manage the software on your system." +msgstr "Una forma atractiva de gestionar el programari del sistema." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:171 +msgid "Visit website" +msgstr "Visiteu el lloc web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:176 +msgid "Install…" +msgstr "Instal·la..." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:183 +msgid "Cancel" +msgstr "Cancel·la" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:192 src/gs-common.c:279 src/gs-page.c:544 +msgid "Install" +msgstr "Instal·la" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:199 +msgid "Update" +msgstr "Actualitza" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: src/gs-app-row.c:203 src/gs-app-row.c:212 src/gs-page.c:700 +msgid "Remove" +msgstr "Suprimeix" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:330 +msgid "Device cannot be used during update." +msgstr "El dispositiu no pot utilitzar-se durant l'actualització." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:340 src/gs-details-page.ui:1000 +msgid "Source" +msgstr "Font" + +#. TRANSLATORS: this is when the service name is not known +#: src/gs-auth-dialog.c:68 +msgid "To continue you need to sign in." +msgstr "Per a continuar heu d'iniciar la sessió." + +#. TRANSLATORS: the %s is a service name, e.g. "Ubuntu One" +#: src/gs-auth-dialog.c:72 +#, c-format +msgid "To continue you need to sign in to %s." +msgstr "Per a continuar heu d'iniciar la sessió a %s." + +#: src/gs-auth-dialog.ui:70 +msgid "Email address" +msgstr "Adreça electrònica" + +#: src/gs-auth-dialog.ui:94 +msgid "I have an account already" +msgstr "Ja tinc un compte" + +#: src/gs-auth-dialog.ui:113 +msgid "Password" +msgstr "Contrasenya" + +#: src/gs-auth-dialog.ui:137 +msgid "I want to register for an account now" +msgstr "Vull registrar un compte ara" + +#: src/gs-auth-dialog.ui:154 +msgid "I have forgotten my password" +msgstr "He oblidat la contrasenya" + +#: src/gs-auth-dialog.ui:181 +msgid "Sign in automatically next time" +msgstr "Inicieu la sessió automàticament la propera vegada" + +#: src/gs-auth-dialog.ui:210 +msgid "Enter your one-time pin for two-factor authentication." +msgstr "Introduïu el PIN d'un ús per l'autenticació amb dos components." + +#: src/gs-auth-dialog.ui:223 +msgid "PIN" +msgstr "PIN" + +#: src/gs-auth-dialog.ui:325 +msgid "Authenticate" +msgstr "" + +#: src/gs-auth-dialog.ui:337 +msgid "Continue" +msgstr "Continua" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:193 +msgid "Other" +msgstr "Altres" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:198 +msgid "All" +msgstr "Tots" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:202 +msgid "Featured" +msgstr "Destacat" + +#: src/gs-category-page.ui:81 +msgid "Extension Settings" +msgstr "Paràmetres de l'extensió" + +#: src/gs-category-page.ui:110 +msgid "" +"Extensions are used at your own risk. If you have any system problems, it is " +"recommended to disable them." +msgstr "" +"Les extensions les useu sota la vostra responsabilitat. Si teniu cap " +"problema de sistema, vos recomanem inhabilitar-les." + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:205 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "Introduïu un nombre de l'1 al %u: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:268 +msgid "Choose an application:" +msgstr "Escolliu una aplicació:" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:135 +msgid "OS updates are now installed" +msgstr "S'han instal·lat les actualitzacions del SO" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:138 +msgid "Recently installed updates are available to review" +msgstr "" +"Les actualitzacions instal·lades recentment estan disponibles per ser " +"revisades" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:142 +#, c-format +msgid "%s is now installed" +msgstr "S'ha instal·lat %s" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:145 +msgid "Application is ready to be used." +msgstr "L'aplicació ja està a punt per fer-se servir." + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:151 +msgid "Launch" +msgstr "Executa" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Voleu instal·lar programari de tercers?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Third-Party Software Source?" +msgstr "Voleu habilitar la font de programari de tercers?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#. +#: src/gs-common.c:232 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s no és programari lliure o de codi obert, i es proporciona " +"amb «%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#: src/gs-common.c:242 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s es proporciona amb «%s»." + +#. TRANSLATORS: a software source is a repo +#: src/gs-common.c:252 +msgid "This software source must be enabled to continue installation." +msgstr "" +"Cal habilitar esta font de programari per poder continuar amb la " +"instal·lació." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:262 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Pot ser il·legal instal·lar o utilitzar %s en alguns països." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:268 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Pot ser il·legal instal·lar o utilitzar este còdec en alguns països." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t Warn Again" +msgstr "No tornes a avisar-me" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and Install" +msgstr "Habilita i instal·la" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:429 +msgid "Detailed errors from the package manager follow:" +msgstr "Els errors detallats del gestor de paquets es mostren a continuació:" + +#: src/gs-common.c:448 src/gs-details-page.ui:607 +msgid "Details" +msgstr "Detalls" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:75 +msgid "No cartoon violence" +msgstr "Sense violència en personatges animats" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:78 +msgid "Cartoon characters in unsafe situations" +msgstr "Personatges animats en situacions insegures" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "Cartoon characters in aggressive conflict" +msgstr "Personatges animats en conflictes agressius" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:84 +msgid "Graphic violence involving cartoon characters" +msgstr "Violència gràfica amb personatges animats" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "No fantasy violence" +msgstr "Sense violència fantàstica" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:90 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "" +"Personatges en situacions insegures fàcilment distingibles de la realitat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:93 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "" +"Personatges en conflictes agressius fàcilment distingibles de la realitat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Graphic violence easily distinguishable from reality" +msgstr "Violència gràfica fàcilment distingible de la realitat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:99 +msgid "No realistic violence" +msgstr "Sense violència realista" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:102 +msgid "Mildly realistic characters in unsafe situations" +msgstr "Personatges mig reals en situacions insegures" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "Representacions de personatges realistes en conflictes agressius" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:108 +msgid "Graphic violence involving realistic characters" +msgstr "Violència gràfica amb personatges realistes" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:111 +msgid "No bloodshed" +msgstr "Sense matances" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "Unrealistic bloodshed" +msgstr "Matances no realistes" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:117 +msgid "Realistic bloodshed" +msgstr "Matances realistes" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:120 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "Representacions de matances i mutilacions de parts del cos" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:123 +msgid "No sexual violence" +msgstr "Sense violència sexual" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Rape or other violent sexual behavior" +msgstr "Violació o altres comportaments sexuals violents" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:129 +msgid "No references to alcohol" +msgstr "Sense referències a l'alcohol" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "References to alcoholic beverages" +msgstr "Referències a begudes alcohòliques" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:135 +msgid "Use of alcoholic beverages" +msgstr "Ús de begudes alcohòliques" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:138 +msgid "No references to illicit drugs" +msgstr "Sense referències a drogues il·legals" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:141 +msgid "References to illicit drugs" +msgstr "Referències a drogues il·legals" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Use of illicit drugs" +msgstr "Ús de drogues il·legals" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:147 +msgid "References to tobacco products" +msgstr "Referències als productes del tàbac" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:150 +msgid "Use of tobacco products" +msgstr "Ús de productes del tàbac" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:153 +msgid "No nudity of any sort" +msgstr "Sense nuesa de cap tipus" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Brief artistic nudity" +msgstr "Nuesa artística breu" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:159 +msgid "Prolonged nudity" +msgstr "Nuesa prolongada" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:162 +msgid "No references or depictions of sexual nature" +msgstr "Sense referències o representacions sexuals" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Provocative references or depictions" +msgstr "Referències o representacions provocatives" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:168 +msgid "Sexual references or depictions" +msgstr "Referències o representacions sexuals" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:171 +msgid "Graphic sexual behavior" +msgstr "Comportament sexual gràfic" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No profanity of any kind" +msgstr "Sense blasfèmia de cap tipus" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:177 +msgid "Mild or infrequent use of profanity" +msgstr "Ús lleu o poc freqüent de la blasfèmia" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Moderate use of profanity" +msgstr "Ús moderat de la blasfèmia" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:183 +msgid "Strong or frequent use of profanity" +msgstr "Ús extensiu o freqüent de la blasfèmia" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:186 +msgid "No inappropriate humor" +msgstr "Sense humor inapropiat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Slapstick humor" +msgstr "Humor vulgar" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:192 +msgid "Vulgar or bathroom humor" +msgstr "Humor groller" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:195 +msgid "Mature or sexual humor" +msgstr "Humor adult o sexual" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "No discriminatory language of any kind" +msgstr "Sense llenguatge discriminatori de cap tipus" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:201 +msgid "Negativity towards a specific group of people" +msgstr "Negatiu respecte a un grup específic de gent" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:204 +msgid "Discrimination designed to cause emotional harm" +msgstr "Discriminació pensada per causar dany emocional" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "Discriminació explicita basada en gènere, sexualitat, raça o religió" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:210 +msgid "No advertising of any kind" +msgstr "Sense publicitat de cap tipus" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Product placement" +msgstr "Emplaçament de producte" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:216 +msgid "Explicit references to specific brands or trademarked products" +msgstr "" +"Referències explícites a marques específiques o productes de marques " +"registrades" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:219 +msgid "Players are encouraged to purchase specific real-world items" +msgstr "S'anima als jugadors a comprar coses específiques del món real" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:222 +msgid "No gambling of any kind" +msgstr "Sense apostes de cap tipus" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:225 +msgid "Gambling on random events using tokens or credits" +msgstr "Apostes en esdeveniments aleatoris utilitzant testimonis o crèdits" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "Gambling using “play” money" +msgstr "Apostes usant moneda virtual al joc" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:231 +msgid "Gambling using real money" +msgstr "Apostes usant diners reals" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "No ability to spend money" +msgstr "Sense possibilitat de gastar diners" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:237 +msgid "Ability to spend real money in-game" +msgstr "Possibilitat de gastar diners de veritat al joc" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:240 +msgid "No way to chat with other players" +msgstr "Sense possibilitat de fer xat amb els altres jugadors" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:243 +msgid "Player-to-player game interactions without chat functionality" +msgstr "Interaccions jugador a jugador del joc sense funcionalitat xat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:246 +msgid "Player-to-player preset interactions without chat functionality" +msgstr "" +"Interaccions jugador a jugador predefinides del joc sense funcionalitat xat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:249 +msgid "Uncontrolled chat functionality between players" +msgstr "Funcionalitat de xat no supervisada entre jugadors" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:252 +msgid "No way to talk with other players" +msgstr "Sense possibilitat de parlar amb els altres jugadors" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:255 +msgid "Uncontrolled audio or video chat functionality between players" +msgstr "Funcionalitat de xat d'àudio o vídeo no supervisada entre jugadors" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:258 +msgid "No sharing of social network usernames or email addresses" +msgstr "" +"Sense compartició en les xarxes socials de noms d'usuari ni adreces de " +"correu electrònic" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "Sharing social network usernames or email addresses" +msgstr "" +"Compartició en les xarxes socials de noms d'usuari o adreces de correu " +"electrònic" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:264 +msgid "No sharing of user information with 3rd parties" +msgstr "No es comparteix informació de l'usuari amb terceres parts" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:267 +msgid "Sharing user information with 3rd parties" +msgstr "Compartició d'informació de l'usuari amb terceres parts" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "No sharing of physical location to other users" +msgstr "No es comparteix la ubicació física amb altres usuaris" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:273 +msgid "Sharing physical location to other users" +msgstr "Compartició la ubicació física amb altres usuaris" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:294 +msgid "An application" +msgstr "Una aplicació" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:300 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s està demanant compatibilitat addicional de formats de fitxers." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:302 +msgid "Additional MIME Types Required" +msgstr "Calen tipus MIME addicionals" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:306 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s està demanant tipus de lletra addicionals." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:308 +msgid "Additional Fonts Required" +msgstr "Calen tipus de lletra addicionals" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:312 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s està demanant còdecs multimèdia addicionals." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:314 +msgid "Additional Multimedia Codecs Required" +msgstr "Calen còdecs multimèdia addicionals" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:318 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s està demanant controladors d'impressora addicionals." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:320 +msgid "Additional Printer Drivers Required" +msgstr "Calen controladors d'impressora addicionals" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:324 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s està demanant paquets addicionals." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:326 +msgid "Additional Packages Required" +msgstr "Calen paquets addicionals" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:335 +msgid "Find in Software" +msgstr "Busca al programari" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#: src/gs-details-page.c:278 src/gs-details-page.c:308 +#: src/gs-details-page.ui:206 src/gs-upgrade-banner.ui:146 +msgid "_Install" +msgstr "_Instal·la" + +#. TRANSLATORS: button text in the header when an application +#. * can be live-updated +#: src/gs-details-page.c:313 +msgid "_Update" +msgstr "_Actualitza" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software sources or the like +#: src/gs-details-page.c:326 +msgid "_Install…" +msgstr "_Instal·la..." + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:373 src/gs-details-page.ui:242 +msgid "_Remove" +msgstr "_Suprimeix" + +#: src/gs-details-page.c:434 src/gs-sources-dialog.c:513 +msgid "Removing…" +msgstr "S'està suprimint…" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:744 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" +"Esta aplicació només es pot fer servir si hi ha una connexió activa a " +"Internet." + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:879 +msgctxt "version" +msgid "Unknown" +msgstr "Desconeguda" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:913 +msgctxt "updated" +msgid "Never" +msgstr "Mai" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:957 +msgctxt "origin" +msgid "Unknown" +msgstr "Desconegut" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1361 +msgid "You need internet access to write a review" +msgstr "Cal accés a Internet perquè pugueu escriure una ressenya" + +#: src/gs-details-page.c:1490 +#, c-format +msgid "Unable to find “%s”" +msgstr "No s'ha trobat «%s»" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2065 +msgid "Public domain" +msgstr "Domini públic" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2081 src/gs-details-page.ui:1395 +msgid "Free Software" +msgstr "Programari lliure" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2138 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "Els usuaris estan lligats a la següent llicència:" +msgstr[1] "Els usuaris estan lligats a les següents llicències:" + +#: src/gs-details-page.c:2154 src/gs-details-page.ui:1504 +msgid "More information" +msgstr "Més informació" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Pàgina de detalls" + +#. Translators: A label for a button to execute the selected application. +#: src/gs-details-page.ui:228 +msgid "_Launch" +msgstr "_Executa" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: src/gs-details-page.ui:358 +msgid "_Add shortcut" +msgstr "_Afig una drecera" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: src/gs-details-page.ui:373 +msgid "Re_move shortcut" +msgstr "S_uprimeix la drecera" + +#: src/gs-details-page.ui:468 +msgid "No screenshot provided" +msgstr "No s'ha proporcionat cap captura de pantalla" + +#: src/gs-details-page.ui:504 +msgid "Software Source Included" +msgstr "S'inclouen fonts de programari" + +#: src/gs-details-page.ui:505 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "" +"L'aplicació inclou una font de programari que proporciona actualitzacions " +"així com accés a altre programari." + +#: src/gs-details-page.ui:518 +msgid "No Software Source Included" +msgstr "No s'inclouen fonts de programari" + +#: src/gs-details-page.ui:519 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "" +"L'aplicació no inclou cap font de programari. No s'actualitzarà a versions " +"més noves." + +#: src/gs-details-page.ui:533 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Este programari ja es proporciona amb la vostra distribució i no heu de " +"substituir-ho." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:546 +msgid "Software Source Identified" +msgstr "S'ha identificat una font de programari" + +#: src/gs-details-page.ui:547 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "" +"En afegir esta font de programari tindreu accés a programari i " +"actualitzacions addicionals." + +#: src/gs-details-page.ui:548 +msgid "Only use software sources that you trust." +msgstr "Utilitzeu només fonts de programari de confiança." + +#: src/gs-details-page.ui:564 +msgid "_Website" +msgstr "Lloc _web" + +#: src/gs-details-page.ui:579 +msgid "_Donate" +msgstr "_Fes un donatiu" + +#: src/gs-details-page.ui:713 +msgid "Localized in your Language" +msgstr "Traduït a la vostra llengua" + +#: src/gs-details-page.ui:725 +msgid "Documentation" +msgstr "Documentació" + +#: src/gs-details-page.ui:737 +msgid "Release Activity" +msgstr "Activitat de publicacions" + +#: src/gs-details-page.ui:749 +msgid "System Integration" +msgstr "Integració amb el sistema" + +#: src/gs-details-page.ui:761 +msgid "Sandboxed" +msgstr "Entorn de proves" + +#: src/gs-details-page.ui:786 src/gs-sources-dialog.ui:359 +msgid "Version" +msgstr "Versió" + +#: src/gs-details-page.ui:823 +msgid "Age Rating" +msgstr "Valoració per edat" + +#: src/gs-details-page.ui:861 +msgid "Updated" +msgstr "Actualitzat" + +#: src/gs-details-page.ui:896 +msgid "Category" +msgstr "Categoria" + +#: src/gs-details-page.ui:934 +msgid "Installed Size" +msgstr "Mida instal·lat" + +#: src/gs-details-page.ui:967 +msgid "Download Size" +msgstr "Mida de la baixada" + +#: src/gs-details-page.ui:1033 +msgid "Developer" +msgstr "Desenvolupador" + +#: src/gs-details-page.ui:1067 +msgid "License" +msgstr "Llicència" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1087 +msgid "Free" +msgstr "Lliure" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1104 +msgid "Proprietary" +msgstr "Propietària" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.ui:1121 src/gs-review-row.c:71 +msgid "Unknown" +msgstr "Desconegut" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: src/gs-details-page.ui:1175 src/gs-installed-page.c:487 +#: plugins/core/gs-desktop-common.c:331 +msgid "Add-ons" +msgstr "Complements" + +#: src/gs-details-page.ui:1188 +msgid "Selected add-ons will be installed with the application." +msgstr "S'instal·laran els complements seleccionats juntament amb l'aplicació." + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-details-page.ui:1231 +msgid "Reviews" +msgstr "Ressenyes" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1247 +msgid "_Write a Review" +msgstr "_Escriviu una ressenya" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1269 +msgid "_Show More" +msgstr "_Mostra'n més" + +#: src/gs-details-page.ui:1412 +msgid "" +"This means that the software can be freely run, copied, distributed, studied " +"and modified." +msgstr "" +"Això vol dir que el programari pot ser lliurement usat, copiat, distribuït, " +"estudiat i modificat." + +#: src/gs-details-page.ui:1471 +msgid "Proprietary Software" +msgstr "Programari de propietat" + +#: src/gs-details-page.ui:1488 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "" +"Això vol dir que el programari és propietat d'una persona o empresa. Hi ha " +"habitualment restriccions en el seu ús i normalment no es pot accedir al seu " +"codi font." + +#: src/gs-details-page.ui:1533 +msgid "Unknown Software License" +msgstr "Llicència del programari desconeguda" + +#: src/gs-details-page.ui:1550 +msgid "The license terms of this software are unknown." +msgstr "Els termes de llicència d'este programa són desconeguts." + +#: src/gs-details-page.ui:1577 +msgid "The application was rated this way because it features:" +msgstr "" +"L'aplicació va ser valorada d'esta manera per les seues característiques:" + +#: src/gs-details-page.ui:1603 +msgid "No details were available for this rating." +msgstr "No hi ha detalls disponibles per esta valoració." + +#: src/gs-editor.c:361 +msgid "CSS validated OK!" +msgstr "CSS validat correctament" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:564 +msgid "Failed to load file" +msgstr "No s'ha pogut carregar la imatge" + +#. TRANSLATORS: window title +#: src/gs-editor.c:598 src/gs-editor.c:874 +msgid "Unsaved changes" +msgstr "Canvis sense guardar" + +#: src/gs-editor.c:600 +msgid "The application list is already loaded." +msgstr "L'aplicació ja està a punt per fer-se servir." + +#. TRANSLATORS: button text +#: src/gs-editor.c:604 +msgid "Merge documents" +msgstr "Fusiona documents" + +#. TRANSLATORS: button text +#: src/gs-editor.c:608 src/gs-editor.c:879 +msgid "Throw away changes" +msgstr "Descarta els canvis" + +#. import the new file +#: src/gs-editor.c:620 src/gs-editor.c:652 +msgid "Open AppStream File" +msgstr "Obri un fitxer Appstream" + +#: src/gs-editor.c:624 +msgid "_Open" +msgstr "_Obri" + +#: src/gs-editor.c:656 +msgid "_Save" +msgstr "Al_ça" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:676 +msgid "Failed to save file" +msgstr "No s'ha pogut guardar la imatge" + +#. TRANSLATORS, the %s is the app name, e.g. 'Inkscape' +#: src/gs-editor.c:751 +#, c-format +msgid "%s banner design deleted." +msgstr "El disseny del bàner %s s'ha suprimit." + +#. TRANSLATORS, this is a notification +#: src/gs-editor.c:754 +msgid "Banner design deleted." +msgstr "El disseny del bàner s'ha suprimit." + +#: src/gs-editor.c:876 +msgid "The application list has unsaved changes." +msgstr "La llista d'aplicacions té canvis no guardats." + +#. TRANSLATORS: show the program version +#: src/gs-editor.c:1111 +msgid "Use verbose logging" +msgstr "Mostra el registre detallat" + +#. TRANSLATORS: program name, an application to add and remove software repositories +#: src/gs-editor.c:1119 +msgid "GNOME Software Banner Designer" +msgstr "Dissenyador de bàners del Programari del GNOME" + +#: src/gs-editor.ui:63 src/gs-editor.ui:77 +msgid "No Designs" +msgstr "Cap disseny" + +#: src/gs-editor.ui:163 +msgid "Error message here" +msgstr "El missatge d'error va ací" + +#: src/gs-editor.ui:250 +msgid "App ID" +msgstr "Identificador de l'aplicació" + +#: src/gs-editor.ui:296 +msgid "Name" +msgstr "Nom" + +#: src/gs-editor.ui:341 src/gs-review-dialog.ui:142 +msgid "Summary" +msgstr "Resum" + +#: src/gs-editor.ui:382 +msgid "Editor’s Pick" +msgstr "Selecció de l'editor" + +#. This check button controls whether the application’s banner appears in the “Featured” category +#: src/gs-editor.ui:397 +msgid "Category Featured" +msgstr "Categoria destacada" + +#. button in the info bar +#: src/gs-editor.ui:471 +msgid "Undo" +msgstr "Desfés" + +#: src/gs-editor.ui:524 src/org.gnome.Software.Editor.desktop.in:3 +msgid "Banner Designer" +msgstr "Dissenyador de bàners" + +#: src/gs-editor.ui:547 +msgid "New Banner" +msgstr "Bàner nou" + +#: src/gs-editor.ui:615 +msgid "Import from file" +msgstr "Importa des del fitxer" + +#: src/gs-editor.ui:629 +msgid "Export to file" +msgstr "Exporta a un fitxer" + +#: src/gs-editor.ui:643 +msgid "Delete Design" +msgstr "Suprimeix el disseny" + +#: src/gs-editor.ui:670 +msgid "Featured App" +msgstr "Aplicació destacada" + +#: src/gs-editor.ui:684 +msgid "OS Upgrade" +msgstr "Actualització del SO" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid " and " +msgstr " i " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:148 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:174 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tipus de lletres disponibles per a l'script %s" +msgstr[1] "Tipus de lletres disponibles per als scripts %s" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:182 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Programari disponible per %s" +msgstr[1] "Programari disponible per %s" + +#: src/gs-extras-page.c:224 +msgid "Unable to Find Requested Software" +msgstr "No s'ha pogut trobar el programari demanat" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:322 +#, c-format +msgid "%s not found" +msgstr "No s'ha trobat %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:326 +msgid "on the website" +msgstr "al lloc web" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:333 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "No s'ha trobat cap aplicació disponible que proporcioni el fitxer %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:337 src/gs-extras-page.c:348 src/gs-extras-page.c:359 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per saber com obtindre aplicacions que " +"falten poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:344 src/gs-extras-page.c:366 +#, c-format +msgid "No applications are available for %s support." +msgstr "" +"No s'ha trobat cap aplicació disponible per a la compatibilitat amb %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:355 +#, c-format +msgid "%s is not available." +msgstr "%s no està disponible." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:370 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per saber com obtindre una aplicació " +"que puga reproduir este format poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:377 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" +"No s'ha trobat cap tipus de lletra disponible per a la compatibilitat amb " +"l'script %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:381 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per saber com obtindre tipus de lletra " +"addicionals poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:388 lib/gs-plugin-loader.c:1417 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "No s'ha trobat cap còdec disponible per al format %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:392 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per saber com obtindre un còdec que " +"puga reproduir este format poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:399 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "No s'ha trobat cap recurs Plasma per a la compatibilitat amb %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:403 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per saber com obtindre recursos Plasma " +"addicionals poden trobar-se %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:410 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "No s'ha trobat cap controlador d'impressora per %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:414 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informació sobre %s, així com opcions per saber com obtindre un controlador " +"per esta impressora poden trobar-se %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:459 +msgid "this website" +msgstr "este lloc web" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:463 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +"Desafortunadament, %s que cercàveu no s'ha pogut trobar. Vegeu %s per a més " +"informació." +msgstr[1] "" +"Desafortunadament, %s que cercàveu no s'han pogut trobar. Vegeu %s per a més " +"informació." + +#: src/gs-extras-page.c:535 src/gs-extras-page.c:591 src/gs-extras-page.c:630 +msgid "Failed to find any search results" +msgstr "No s'ha pogut trobar cap resultat de busca" + +#: src/gs-extras-page.c:824 +#, c-format +msgid "%s file format" +msgstr "Format de fitxer %s" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Pàgina de còdecs" + +#: src/gs-first-run-dialog.ui:7 src/gs-first-run-dialog.ui:16 +msgid "Welcome" +msgstr "Vos donem la benvinguda" + +#: src/gs-first-run-dialog.ui:50 +msgid "Welcome to Software" +msgstr "Vos donem la benvinguda al Programari" + +#: src/gs-first-run-dialog.ui:66 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" +"El Programari vos permet instal·lar tot el programari que necessiteu des d'un " +"sol lloc. Vegeu les recomanacions, navegueu per les categories o cerqueu les " +"aplicacions que voleu." + +#: src/gs-first-run-dialog.ui:85 +msgid "_Let’s Go Shopping" +msgstr "_Anem de compres" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: src/gs-hiding-box.c:381 +msgid "Spacing" +msgstr "Espaiat" + +#: src/gs-hiding-box.c:382 +msgid "The amount of space between children" +msgstr "La quantitat d'espai entre fills" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:82 +msgctxt "app status" +msgid "Removed" +msgstr "Suprimida" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:88 +msgctxt "app status" +msgid "Installed" +msgstr "Instal·lada" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:94 +msgctxt "app status" +msgid "Updated" +msgstr "Actualitzada" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:100 +msgctxt "app status" +msgid "Unknown" +msgstr "Desconegut" + +#: src/gs-history-dialog.ui:6 +msgid "History" +msgstr "Historial" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:483 +msgid "System Applications" +msgstr "Aplicacions del sistema" + +#: src/gs-installed-page.c:617 +msgid "Click on items to select them" +msgstr "Feu clic als elements per seleccionar-los" + +#: src/gs-installed-page.c:823 +msgid "Select" +msgstr "Selecciona" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Pàgina d'instal·lació" + +#: src/gs-installed-page.ui:65 +msgid "_Add to Folder…" +msgstr "_Afig a la carpeta…" + +#: src/gs-installed-page.ui:73 +msgid "_Move to Folder…" +msgstr "_Mou a la carpeta…" + +#: src/gs-installed-page.ui:81 +msgid "_Remove from Folder" +msgstr "_Suprimeix de la carpeta" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:74 +msgid "Software catalog is being downloaded" +msgstr "S'està baixant el catàleg de programari" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:78 +msgid "Software catalog is being loaded" +msgstr "S'està carregant el catàleg de programari" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "S'està carregant la pàgina" + +#: src/gs-loading-page.ui:53 +msgid "Starting up…" +msgstr "S'està iniciant…" + +#: src/gs-menus.ui:7 +msgid "_Software Sources" +msgstr "_Fonts de programari" + +#: src/gs-menus.ui:14 +msgid "_About" +msgstr "_Quant" + +#: src/gs-menus.ui:18 +msgid "_Quit" +msgstr "I_x" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "Pàgina de moderació" + +#: src/gs-moderate-page.ui:87 +msgid "There are no reviews to moderate" +msgstr "No hi ha ressenyes per moderar" + +#. add button +#: src/gs-overview-page.c:317 +msgid "More…" +msgstr "Més…" + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:483 +msgid "Recommended Audio & Video Applications" +msgstr "Aplicacions d'àudio i vídeo recomanades" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:488 +msgid "Recommended Games" +msgstr "Jocs recomanats" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:493 +msgid "Recommended Graphics Applications" +msgstr "Aplicacions gràfiques recomanades" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:498 +msgid "Recommended Productivity Applications" +msgstr "Aplicacions de productivitat recomanades" + +#. TRANSLATORS: this is the proprietary info bar +#: src/gs-overview-page.c:841 +msgid "" +"Provides access to additional software, including web browsers and games." +msgstr "" +"Proveeix accés a programari addicional, incloent-hi navegadors web i jocs." + +#. TRANSLATORS: this is the proprietary info bar +#: src/gs-overview-page.c:845 +msgid "Proprietary software has restrictions on use and access to source code." +msgstr "" +"El programari de propietat té restriccions en l'ús i accés al seu codi font." + +#. TRANSLATORS: this is the clickable +#. * link on the proprietary info bar +#: src/gs-overview-page.c:852 src/gs-sources-dialog.c:267 +msgid "Find out more…" +msgstr "Descobriu-ne més..." + +#. TRANSLATORS: button to turn on proprietary software sources +#: src/gs-overview-page.c:887 +msgid "Enable" +msgstr "Habilita" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Pàgina de resum" + +#: src/gs-overview-page.ui:49 +msgid "Enable Proprietary Software Sources?" +msgstr "Voleu habilitar les fonts de programari de propietat?" + +#: src/gs-overview-page.ui:117 +msgid "Featured Application" +msgstr "Aplicacions destacades" + +#: src/gs-overview-page.ui:150 +msgid "Categories" +msgstr "Categories" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-overview-page.ui:310 +msgid "Editor’s Picks" +msgstr "Selecció de l'editor" + +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-overview-page.ui:348 +msgid "Recent Releases" +msgstr "Publicacions recents" + +#: src/gs-overview-page.ui:421 +msgid "No Application Data Found" +msgstr "No s'ha trobat cap descripció detallada de l'aplicació" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:445 +#, c-format +msgid "Are you sure you want to purchase %s?" +msgstr "Esteu segur de voler comprar %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:449 +#, c-format +msgid "%s will be installed, and you will be charged %s." +msgstr "%s s'instal·larà, i se vos cobrarà %s." + +#. TRANSLATORS: this is button text to purchase the application +#: src/gs-page.c:462 +msgid "Purchase" +msgstr "Compra" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:535 +#, c-format +msgid "Prepare %s" +msgstr "Prepara %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * source name, e.g. 'GNOME Nightly' +#: src/gs-page.c:669 +#, c-format +msgid "Are you sure you want to remove the %s source?" +msgstr "Esteu segur de voler suprimir la font %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:673 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the source to use them again." +msgstr "" +"Se suprimiran totes les aplicacions de %s. Haureu d'instal·lar-les per " +"utilitzar-les de nou." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:681 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "Esteu segur de voler suprimir %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:684 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "Se suprimirà %s i haureu d'instal·lar-la per utilitzar-la de nou." + +#: lib/gs-plugin-loader.c:1420 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "" +"Al lloc web es pot trobar informació sobre %s, així com diferents opcions de " +"com obtindre un còdec que puga reproduir este format." + +#: lib/gs-price.c:111 +#, c-format +msgid "A$%.2f" +msgstr "%.2f A$" + +#: lib/gs-price.c:113 +#, c-format +msgid "C$%.2f" +msgstr "%.2f C$" + +#: lib/gs-price.c:115 +#, c-format +msgid "CN¥%.2f" +msgstr "%.2f CN¥" + +#: lib/gs-price.c:117 +#, c-format +msgid "€%.2f" +msgstr "%.2f €" + +#: lib/gs-price.c:119 +#, c-format +msgid "£%.2f" +msgstr "%.2f £" + +#: lib/gs-price.c:121 +#, c-format +msgid "¥%.2f" +msgstr "%.2f ¥" + +#: lib/gs-price.c:123 +#, c-format +msgid "NZ$%.2f" +msgstr "%.2f NZ$" + +#: lib/gs-price.c:125 +#, c-format +msgid "₽%.2f" +msgstr "%.2f ₽" + +#: lib/gs-price.c:127 +#, c-format +msgid "US$%.2f" +msgstr "%.2f US$" + +#: lib/gs-price.c:129 +#, c-format +msgid "%s %f" +msgstr "%s %f" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:128 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" +"Alguns dels programes actualment instal·lats no són compatibles amb %s. Si " +"continueu, els programes següents seran suprimits automàticament durant " +"l'actualització:" + +#: src/gs-removal-dialog.ui:27 +msgid "Incompatible Software" +msgstr "Programari incompatible" + +#: src/gs-removal-dialog.ui:40 +msgid "_Continue" +msgstr "_Continua" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:98 +msgid "Hate it" +msgstr "L'odio" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:102 +msgid "Don’t like it" +msgstr "No m'agrada" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:106 +msgid "It’s OK" +msgstr "Està bé" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:110 +msgid "Like it" +msgstr "M'agrada" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:114 +msgid "Love it" +msgstr "N'estic enamorat" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:136 +msgid "Please take more time writing the review" +msgstr "Preneu-vos més temps per escriure la ressenya" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:140 +msgid "Please choose a star rating" +msgstr "Seleccioneu la valoració en estrelles" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:144 +msgid "The summary is too short" +msgstr "El resum és massa curt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:148 +msgid "The summary is too long" +msgstr "El resum és massa llarg" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:152 +msgid "The description is too short" +msgstr "La descripció és massa curta" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:156 +msgid "The description is too long" +msgstr "La descripció és massa llarga" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:11 +msgid "Post Review" +msgstr "Publica una ressenya" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:35 +msgid "_Post" +msgstr "_Publica" + +#: src/gs-review-dialog.ui:85 +msgid "Rating" +msgstr "Valoració" + +#: src/gs-review-dialog.ui:158 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" +"Doneu un resum curt de la ressenya. Per exemple, «una aplicació molt bona " +"que recomano»." + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:199 +msgctxt "app review" +msgid "Review" +msgstr "Ressenya" + +#: src/gs-review-dialog.ui:215 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "" +"Què penseu de l'aplicació? Intenteu donar les raons de la vostra opinió." + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:413 +msgid "ratings in total" +msgstr "valoracions en total" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:234 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "Podeu informar de contingut abusiu, groller o discriminatori." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:239 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Un cop heu informat, la ressenya s'ocultarà fins que un administrador la " +"revisi." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:253 +msgid "Report Review?" +msgstr "Voleu informar d'una ressenya?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:257 +msgid "Report" +msgstr "Informeu" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:112 +msgid "Was this review useful to you?" +msgstr "Li ha estat útil esta ressenya?" + +#: src/gs-review-row.ui:134 +msgid "Yes" +msgstr "Sí" + +#: src/gs-review-row.ui:148 +msgid "No" +msgstr "No" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:162 +msgid "Meh" +msgstr "Pse" + +#: src/gs-review-row.ui:196 +msgid "Report…" +msgstr "Informeu..." + +#: src/gs-review-row.ui:211 +msgid "Remove…" +msgstr "Suprimeix..." + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:313 +msgid "Screenshot not found" +msgstr "No s'ha trobat la captura de pantalla" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:328 +msgid "Failed to load image" +msgstr "No s'ha pogut carregar la imatge" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:461 +msgid "Screenshot size not found" +msgstr "No s'ha trobat la mida de la captura de pantalla" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:489 +msgid "Could not create cache" +msgstr "No s'ha pogut crear la memòria cau" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:550 +msgid "Screenshot not valid" +msgstr "La captura de pantalla no és vàlida" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:565 +msgid "Screenshot not available" +msgstr "La captura de pantalla no està disponible" + +#: src/gs-screenshot-image.c:618 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:155 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u coincidència més" +msgstr[1] "%u coincidències més" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Pàgina de busca" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "No s'ha trobat cap aplicació" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:806 src/gs-shell.c:811 src/gs-shell.c:826 src/gs-shell.c:830 +#, c-format +msgid "“%s”" +msgstr "{%s}" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:858 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" +"No s'han pogut baixar les actualitzacions del microprogramari des de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:864 +#, c-format +msgid "Unable to download updates from %s" +msgstr "No s'han pogut baixar les actualitzacions des de %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:871 +msgid "Unable to download updates" +msgstr "No s'han pogut baixar les actualitzacions" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:876 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" +"No s'han pogut baixar les actualitzacions: calia accés a Internet però no " +"estava disponible." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:885 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"No s'han pogut baixar les actualitzacions des de %s: no hi havia prou espai " +"al disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:890 +msgid "Unable to download updates: not enough disk space" +msgstr "" +"No s'han pogut baixar les actualitzacions: no hi havia prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:898 +msgid "Unable to download updates: authentication was required" +msgstr "No s'han pogut baixar les actualitzacions: calia una autenticació" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:903 +msgid "Unable to download updates: authentication was invalid" +msgstr "" +"No s'han pogut baixar les actualitzacions: l'autenticació no era vàlida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:908 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"No s'han pogut baixar les actualitzacions: no teniu permís per a instal·lar " +"programari" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:915 +msgid "Unable to get list of updates" +msgstr "No s'ha pogut obtindre una llista d'actualitzacions" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:961 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "No s'ha pogut instal·lar %s ja que ha fallat la baixada des de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:967 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "No s'ha pogut instal·lar %s ja que ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:979 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "" +"No s'ha pogut instal·lar %s ja que l'entorn d'execució %s no està disponible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:985 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "No s'ha pogut instal·lar %s ja que no és compatible" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:992 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" +"No s'ha pogut instal·lar: calia accés a Internet però no estava disponible" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:998 +msgid "Unable to install: the application has an invalid format" +msgstr "No s'ha pogut instal·lar: l'aplicació tenia un format invàlid" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1003 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "No s'ha pogut instal·lar %s: no hi ha prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1011 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "No s'ha pogut instal·lar %s: calia una autenticació" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1018 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "No s'ha pogut instal·lar %s: l'autenticació era invàlida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1025 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" +"No s'ha pogut instal·lar %s: no teniu permisos per a instal·lar el programari" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the name of the authentication service, +#. * e.g. "Ubuntu One" +#: src/gs-shell.c:1038 +#, c-format +msgid "Your %s account has been suspended." +msgstr "El vostre compte a «%s» ha estat suspès." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1042 +msgid "It is not possible to install software until this has been resolved." +msgstr "No és possible instal·lar programari fins que això s'haja resolt." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the clickable link (e.g. +#. * "http://example.com/what-did-i-do-wrong/") +#: src/gs-shell.c:1053 +#, c-format +msgid "For more information, visit %s." +msgstr "Per a més informació, visiteu %s." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1062 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "No s'ha pogut instal·lar %s: cal estar connectat al corrent" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1071 +#, c-format +msgid "Unable to install %s" +msgstr "No s'ha pogut instal·lar %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1117 +#, c-format +msgid "Unable to update %s from %s" +msgstr "No s'ha pogut actualitzar %s des de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1123 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "No s'ha pogut actualitzar %s ja que ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1129 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" +"No s'ha pogut actualitzar: calia accés a Internet però no estava disponible." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1137 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "No s'ha pogut actualitzar %s: no hi havia prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1146 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "No s'ha pogut actualitzar %s: calia una autenticació" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1153 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "No s'ha pogut actualitzar %s: l'autenticació no era vàlida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1160 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" +"No s'ha pogut actualitzar %s: no teniu permís per a actualitzar programari" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1168 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "No s'ha pogut actualitzar %s: cal estar connectat al corrent" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1177 +#, c-format +msgid "Unable to update %s" +msgstr "No es pot actualitzar %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "No es pot actualitzar a %s des de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1227 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "No s'ha pogut actualitzar a %s ja que ha fallat la baixada" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1234 +msgid "Unable to upgrade: internet access was required but wasn’t available" +msgstr "" +"No s'ha pogut actualitzar: calia accés a Internet però no estava disponible." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1242 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "No s'ha pogut actualitzar %s: no hi havia prou espai al disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1251 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "No s'ha pogut actualitzar %s: calia una autenticació" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1258 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "No s'ha pogut actualitzar %s: l'autenticació no era vàlida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1265 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "No s'ha pogut actualitzar %s: o teniu permís per a actualitzar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1272 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "No s'ha pogut actualitzar %s: cal estar connectat al corrent" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1281 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "No s'ha pogut actualitzar a %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1323 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "No s'ha pogut suprimir %s: calia una autenticació" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1329 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "No s'ha pogut suprimir %s: l'autenticació era invàlida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1335 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "No s'ha pogut suprimir %s: no teniu permís per a suprimir programari" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1342 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "No s'ha pogut suprimir %s: cal estar connectat al corrent" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1351 +#, c-format +msgid "Unable to remove %s" +msgstr "No s'ha pogut suprimir %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1397 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "No s'ha pogut executar %s: %s no està instal·lat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1404 src/gs-shell.c:1452 src/gs-shell.c:1500 +msgid "Not enough disk space — free up some space and try again" +msgstr "" +"No hi havia prou espai al disc. Allibereu espai a disc i torneu-ho a provar" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1412 src/gs-shell.c:1460 src/gs-shell.c:1527 +msgid "Sorry, something went wrong" +msgstr "No ha funcionat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Failed to install file: authentication failed" +msgstr "" +"S'ha produït un error en instal·lar el fitxer: ha fallat l'autenticació" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1494 +#, c-format +msgid "Unable to contact %s" +msgstr "No s'ha pogut contactar %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1509 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "Cal reiniciar %s per a utilitzar els nous connectors." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1514 +msgid "This application needs to be restarted to use new plugins." +msgstr "Cal reiniciar esta aplicació per a utilitzar els nous connectors." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1521 +msgid "AC power is required" +msgstr "Cal estar connectat al corrent" + +#. TRANSLATORS: This string describes a software source that +#. has no software installed from it. +#: src/gs-sources-dialog.c:98 +msgid "No applications or addons installed; other software might still be" +msgstr "" +"No s'han instal·lat aplicacions o connectors. És possible que encara hi haja " +"altres programes" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software source. +#: src/gs-sources-dialog.c:103 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "S'ha instal·lat %u aplicació" +msgstr[1] "S'han instal·lat %u aplicacions" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software source. +#: src/gs-sources-dialog.c:110 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "S'ha instal·lat %u connector" +msgstr[1] "S'han instal·lat %u connectors" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of applications. +#: src/gs-sources-dialog.c:118 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u aplicació" +msgstr[1] "%u aplicacions" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of add-ons. +#: src/gs-sources-dialog.c:124 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u connector" +msgstr[1] "%u connectors" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-sources-dialog.c:131 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "S'ha instal·lat %s i %s" +msgstr[1] "S'han instal·lat %s i %s" + +#. TRANSLATORS: nonfree software +#: src/gs-sources-dialog.c:257 +msgid "Typically has restrictions on use and access to source code." +msgstr "Normalment té restriccions en l'ús i accés al seu codi font." + +#. TRANSLATORS: list header +#: src/gs-sources-dialog.c:278 +msgid "Proprietary Software Sources" +msgstr "Fonts de programari de propietat" + +#: src/gs-sources-dialog.c:498 src/gs-sources-dialog.ui:487 +msgid "Remove Source" +msgstr "Suprimeix la font" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-sources-dialog.c:584 +msgid "the operating system" +msgstr "el sistema operatiu" + +#. TRANSLATORS: This is the text displayed in the Software Sources +#. dialog when no OS-provided software sources are enabled. %s gets +#. replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-sources-dialog.c:677 +#, c-format +msgid "" +"Software sources can be downloaded from the internet. They give you access " +"to additional software that is not provided by %s." +msgstr "" +"Les fonts de programari poden baixar-se des d'Internet. Vos proporcionen " +"accés a programari addicional que no es proporciona amb %s." + +#: src/gs-sources-dialog.ui:155 +msgid "Additional Sources" +msgstr "Fonts addicionals" + +#: src/gs-sources-dialog.ui:175 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "" +"En eliminar una font també eliminareu qualsevol programa que hàgeu " +"instal·lat des de la mateixa." + +#: src/gs-sources-dialog.ui:260 +msgid "No software installed from this source" +msgstr "No hi ha cap programari instal·lat des d'esta font." + +#: src/gs-sources-dialog.ui:287 +msgid "Installed from this Source" +msgstr "Instal·lat des d'esta font" + +#: src/gs-sources-dialog.ui:333 +msgid "Source Details" +msgstr "Detalls de la font" + +#: src/gs-sources-dialog.ui:390 +msgid "Last Checked" +msgstr "Darrera comprovació" + +#: src/gs-sources-dialog.ui:407 +msgid "Added" +msgstr "Afegit" + +#: src/gs-sources-dialog.ui:424 +msgid "Website" +msgstr "Lloc web" + +#: src/gs-summary-tile.c:75 +#, c-format +msgid "%s (Installed)" +msgstr "%s (instal·lat)" + +#: src/gs-summary-tile.c:80 +#, c-format +msgid "%s (Installing)" +msgstr "%s (s'està instal·lant)" + +#: src/gs-summary-tile.c:85 +#, c-format +msgid "%s (Removing)" +msgstr "%s (s'està suprimint)" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:129 +msgid "No update description available." +msgstr "No hi ha cap descripció sobre l'actualització disponible." + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:224 +#, c-format +msgid "Installed on %s" +msgstr "Instal·lat al %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:244 +msgid "Installed Updates" +msgstr "Actualitzacions instal·lades" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:419 +msgid "Additions" +msgstr "Afegits" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:423 +msgid "Removals" +msgstr "Suprimits" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:427 +msgid "Updates" +msgstr "Actualitzacions" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:431 +msgid "Downgrades" +msgstr "Desactualitzacions" + +#: src/gs-update-dialog.ui:111 +msgid "No updates have been installed on this system." +msgstr "No s'ha instal·lat cap actualització en este sistema." + +#: src/gs-update-monitor.c:88 +msgid "Security Updates Pending" +msgstr "Actualitzacions de seguretat pendents" + +#: src/gs-update-monitor.c:89 +msgid "It is recommended that you install important updates now" +msgstr "Vos recomanem que instal·leu les actualitzacions importants ara" + +#: src/gs-update-monitor.c:92 +msgid "Restart & Install" +msgstr "Reinicia i instal·la" + +#: src/gs-update-monitor.c:96 +msgid "Software Updates Available" +msgstr "Hi ha actualitzacions disponibles" + +#: src/gs-update-monitor.c:97 +msgid "Important OS and application updates are ready to be installed" +msgstr "" +"Hi ha actualitzacions importants del sistema operatiu i d'aplicacions " +"preparades per instal·lar-se" + +#. TRANSLATORS: button text +#: src/gs-update-monitor.c:100 src/gs-updates-page.c:703 +msgid "Not Now" +msgstr "Ara no" + +#: src/gs-update-monitor.c:101 +msgid "View" +msgstr "Mostra" + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:255 src/gs-updates-page.ui:46 +msgid "Operating System Updates Unavailable" +msgstr "Hi ha actualitzacions del sistema operatiu disponibles" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:257 +msgid "Upgrade to continue receiving security updates." +msgstr "Actualitzeu-vos per continuar rebent actualitzacions de seguretat." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:305 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Una nova versió de %s està disponible per instal·lar" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:309 +msgid "Software Upgrade Available" +msgstr "Hi ha actualitzacions disponibles" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:610 +msgid "Software Updates Failed" +msgstr "No s'ha pogut realitzar l'actualització de programari" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:612 +msgid "An important OS update failed to be installed." +msgstr "" +"No s'ha pogut realitzar una actualització important del sistema operatiu." + +#: src/gs-update-monitor.c:613 +msgid "Show Details" +msgstr "Mostra els detalls" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:635 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "S'ha instal·lat l'actualització de programari" +msgstr[1] "S'han instal·lat les actualitzacions de programari" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:639 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "S'ha instal·lat una actualització important del sistema operatiu." +msgstr[1] "S'han instal·lat actualitzacions importants del sistema operatiu." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:650 +msgctxt "updates" +msgid "Review" +msgstr "Revisa" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:697 +msgid "Failed To Update" +msgstr "No s'ha pogut actualitzar" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:703 +msgid "The system was already up to date." +msgstr "El sistema ja estava actualitzat." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:708 +msgid "The update was cancelled." +msgstr "Es va cancel·lar l'actualització." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:714 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Calia accés a Internet però no estava disponible. Assegureu-vos que teniu " +"accés a Internet i torneu-ho a provar." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:720 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Hi ha hagut problemes de seguretat amb l'actualització. Consulteu el " +"proveïdor per a més detalls." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:726 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"No hi havia prou espai a disc. Allibereu espai a disc i torneu-ho a provar." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:731 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"S'ha produït un error en instal·lar l'actualització. Espereu a una " +"actualització nova i torneu a provar-ho. Si el problema persisteix, " +"contacteu amb el vostre proveïdor de programari." + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:273 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:276 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:282 +msgid "Yesterday, %R" +msgstr "Ahir, %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:286 +msgid "Yesterday, %l:%M %p" +msgstr "Ahir, %l:%M %p" + +#: src/gs-updates-page.c:289 +msgid "Two days ago" +msgstr "Fa dos dies" + +#: src/gs-updates-page.c:291 +msgid "Three days ago" +msgstr "Fa tres dies" + +#: src/gs-updates-page.c:293 +msgid "Four days ago" +msgstr "Fa quatre dies" + +#: src/gs-updates-page.c:295 +msgid "Five days ago" +msgstr "Fa cinc dies" + +#: src/gs-updates-page.c:297 +msgid "Six days ago" +msgstr "Fa sis dies" + +#: src/gs-updates-page.c:299 +msgid "One week ago" +msgstr "Fa una setmana" + +#: src/gs-updates-page.c:301 +msgid "Two weeks ago" +msgstr "Fa dues setmanes" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-updates-page.c:305 +msgid "%e %B %Y" +msgstr "%e de %B de %Y" + +#. TRANSLATORS: the updates are being downloaded +#: src/gs-updates-page.c:318 +msgid "Downloading new updates…" +msgstr "S'estan baixant actualitzacions noves…" + +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:322 +msgid "Looking for new updates…" +msgstr "S'estan cercant actualitzacions…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:361 +msgid "Setting up updates…" +msgstr "S'estan preparant les actualitzacions…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:362 src/gs-updates-page.c:369 +msgid "(This could take a while)" +msgstr "(Això pot trigar una estona)" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:474 +#, c-format +msgid "Last checked: %s" +msgstr "Darrera comprovació: %s" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-updates-page.c:699 +msgid "Updates have been installed" +msgstr "S'han instal·lat les actualitzacions." + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-updates-page.c:701 +msgid "A restart is required for them to take effect." +msgstr "És necessari un reinici perquè els canvis tinguen efecte." + +#. TRANSLATORS: button text +#: src/gs-updates-page.c:705 +msgid "Restart" +msgstr "Reinicia" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-page.c:766 +msgid "Integrated Firmware" +msgstr "Microprogramari integrat" + +#. TRANSLATORS: This is the button for upgrading all +#. * system firmware +#. TRANSLATORS: This is the button for upgrading all +#. * offline updates +#: src/gs-updates-page.c:769 src/gs-updates-page.c:779 +msgid "Restart & Update" +msgstr "Reinicia i actualitza" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-page.c:776 +msgid "Requires Restart" +msgstr "Cal reiniciar" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-page.c:786 +msgid "Application Updates" +msgstr "Actualitzacions d'aplicacions" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-page.c:789 +msgid "Update All" +msgstr "Actualitza-ho tot" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-page.c:796 +msgid "Device Firmware" +msgstr "Microprogramari del dispositiu" + +#. TRANSLATORS: this is an offline update +#: src/gs-updates-page.c:986 +msgid "_Restart & Update" +msgstr "_Reinicia i actualitza" + +#. TRANSLATORS: all updates will be installed +#: src/gs-updates-page.c:990 +msgid "U_pdate All" +msgstr "_Actualitza-ho tot" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:1088 +#, c-format +msgid "%s %s is no longer supported." +msgstr "%s %s no és compatible." + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:1093 +msgid "Your OS is no longer supported." +msgstr "El vostre sistema operatiu no és compatible." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:1098 +msgid "This means that it does not receive security updates." +msgstr "Això vol dir que no rebreu actualitzacions de seguretat." + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:1102 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "Vos recomanem que actualitzeu a una versió més nova." + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:1359 +msgid "Charges may apply" +msgstr "Es poden aplicar càrrecs" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1363 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"La comprovació d'actualitzacions mentre s'utilitza la xarxa mòbil pot " +"incórrer en càrrecs." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:1367 +msgid "Check Anyway" +msgstr "Comprova-ho de totes maneres" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:1383 +msgid "No Network" +msgstr "Sense xarxa" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1387 +msgid "Internet access is required to check for updates." +msgstr "Es requereix accés a Internet per comprovar si hi ha actualitzacions." + +#: src/gs-updates-page.c:1792 +msgid "Restart & _Install" +msgstr "Reinicia i _instal·la" + +#: src/gs-updates-page.c:1810 +msgid "Check for updates" +msgstr "Comprova si hi ha actualitzacions" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Pàgina d'actualitzacions" + +#: src/gs-updates-page.ui:194 +msgid "Software is up to date" +msgstr "Tot el programari està actualitzat" + +#: src/gs-updates-page.ui:245 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"La comprovació d'actualitzacions quan utilitzeu la xarxa mòbil pot incórrer " +"en l'aplicació de càrrecs" + +#: src/gs-updates-page.ui:257 +msgid "_Check Anyway" +msgstr "_Comprova de totes formes" + +#: src/gs-updates-page.ui:300 +msgid "Go online to check for updates" +msgstr "Connecta't per comprovar si hi ha actualitzacions" + +#: src/gs-updates-page.ui:311 +msgid "_Network Settings" +msgstr "Paràmetres de la _xarxa" + +#: src/gs-updates-page.ui:393 +msgid "Updates are automatically managed" +msgstr "Les actualitzacions es gestionen automàticament" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:85 +#, c-format +msgid "%s %s Now Available" +msgstr "%s %s ara disponible" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "Downloading %s %s" +msgstr "S'estan baixant %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:106 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "%s %s preparat per instal·lar-se" + +#: src/gs-upgrade-banner.ui:32 +msgid "A major upgrade, with new features and added polish." +msgstr "Una actualització major, amb noves funcionalitat i més polida." + +#: src/gs-upgrade-banner.ui:52 +msgid "_Learn More" +msgstr "_Més informació" + +#: src/gs-upgrade-banner.ui:98 +msgid "" +"It is recommended that you back up your data and files before upgrading." +msgstr "" +"Vos recomanem que feu una còpia de seguretat de les vostres dades abans " +"d'actualitzar." + +#: src/gs-upgrade-banner.ui:116 +msgid "_Download" +msgstr "_Baixa" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Afig, suprimeix o actualitza programari en este ordinador" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/org.gnome.Software.desktop.in:6 +#: src/org.gnome.Software.Editor.desktop.in:6 +msgid "org.gnome.Software" +msgstr "org.gnome.Software" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Actualitzacions;Actualització;Fonts;Dipòsits;Preferències;Instal·lació;" +"Desinstal·lació;Aplicació;Programa;Apli;Botiga;" + +#: src/org.gnome.Software.Editor.desktop.in:4 +msgid "Design the featured banners for GNOME Software" +msgstr "Dissenyeu bàners destacats pel Programari del GNOME" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.Editor.desktop.in:13 +msgid "AppStream;Software;App;" +msgstr "AppStream;Programari;Aplicació;" + +#: plugins/core/gs-desktop-common.c:30 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:33 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:36 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Edició i creació d'àudio" + +#: plugins/core/gs-desktop-common.c:42 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Reproductors de música" + +#: plugins/core/gs-desktop-common.c:51 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:54 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:57 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Depuradors" + +#: plugins/core/gs-desktop-common.c:60 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Entorns integrats de desenvolupament" + +#: plugins/core/gs-desktop-common.c:69 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:73 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:77 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Intel·ligència artificial" + +#: plugins/core/gs-desktop-common.c:80 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomia" + +#: plugins/core/gs-desktop-common.c:84 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Química" + +#: plugins/core/gs-desktop-common.c:88 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Llengües" + +#: plugins/core/gs-desktop-common.c:92 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matemàtiques" + +#: plugins/core/gs-desktop-common.c:99 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robòtica" + +#: plugins/core/gs-desktop-common.c:108 +msgctxt "Menu of Games" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:111 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:114 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Acció" + +#: plugins/core/gs-desktop-common.c:117 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventura" + +#: plugins/core/gs-desktop-common.c:120 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: plugins/core/gs-desktop-common.c:123 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocs" + +#: plugins/core/gs-desktop-common.c:126 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Taula" + +#: plugins/core/gs-desktop-common.c:129 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartes" + +#: plugins/core/gs-desktop-common.c:132 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emuladors" + +#: plugins/core/gs-desktop-common.c:135 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Mainada" + +#: plugins/core/gs-desktop-common.c:138 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Lògica" + +#: plugins/core/gs-desktop-common.c:141 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Jocs de rol" + +#: plugins/core/gs-desktop-common.c:144 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Esports" + +#: plugins/core/gs-desktop-common.c:148 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estratègia" + +#: plugins/core/gs-desktop-common.c:156 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:159 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:162 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Gràfics 3D" + +#: plugins/core/gs-desktop-common.c:165 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografia" + +#: plugins/core/gs-desktop-common.c:168 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Escaneig" + +#: plugins/core/gs-desktop-common.c:171 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Gràfics vectorials" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visualitzador" + +#: plugins/core/gs-desktop-common.c:182 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:185 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:188 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendari" + +#: plugins/core/gs-desktop-common.c:192 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Base de dades" + +#: plugins/core/gs-desktop-common.c:195 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finances" + +#: plugins/core/gs-desktop-common.c:199 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Processador de textos" + +#: plugins/core/gs-desktop-common.c:208 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Tipus de lletra" + +#: plugins/core/gs-desktop-common.c:211 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Còdecs" + +#: plugins/core/gs-desktop-common.c:214 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Fonts d'entrada" + +#: plugins/core/gs-desktop-common.c:217 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Paquets d'idioma" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Add-ons" +msgid "Shell Extensions" +msgstr "Extensions del Shell" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localització" + +#: plugins/core/gs-desktop-common.c:226 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Controladors de maquinari" + +#: plugins/core/gs-desktop-common.c:234 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:237 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:240 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Xat" + +#: plugins/core/gs-desktop-common.c:247 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Notícies" + +#: plugins/core/gs-desktop-common.c:251 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navegador web" + +#: plugins/core/gs-desktop-common.c:259 +msgctxt "Menu of Utilities" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:262 +msgctxt "Menu of Utilities" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:265 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editors de text" + +#: plugins/core/gs-desktop-common.c:273 +msgctxt "Menu of Reference" +msgid "All" +msgstr "Tots" + +#: plugins/core/gs-desktop-common.c:276 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "Destacat" + +#: plugins/core/gs-desktop-common.c:279 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Art" + +#: plugins/core/gs-desktop-common.c:282 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografia" + +#: plugins/core/gs-desktop-common.c:285 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Còmics" + +#: plugins/core/gs-desktop-common.c:288 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Ficció" + +#: plugins/core/gs-desktop-common.c:291 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Salut" + +#: plugins/core/gs-desktop-common.c:294 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Història" + +#: plugins/core/gs-desktop-common.c:297 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Estil de vida" + +#: plugins/core/gs-desktop-common.c:300 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Política" + +#: plugins/core/gs-desktop-common.c:303 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Esports" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: plugins/core/gs-desktop-common.c:313 +msgid "Audio & Video" +msgstr "Àudio i vídeo" + +#. TRANSLATORS: this is the menu spec main category for Development +#: plugins/core/gs-desktop-common.c:316 +msgid "Developer Tools" +msgstr "Eines de desenvolupament" + +#. TRANSLATORS: this is the menu spec main category for Education & Science +#: plugins/core/gs-desktop-common.c:319 +msgid "Education & Science" +msgstr "Educació i ciència" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:322 +msgid "Games" +msgstr "Jocs" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: plugins/core/gs-desktop-common.c:325 +msgid "Graphics & Photography" +msgstr "Gràfics i fotografia" + +#. TRANSLATORS: this is the menu spec main category for Office +#: plugins/core/gs-desktop-common.c:328 +msgid "Productivity" +msgstr "Productivitat" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: plugins/core/gs-desktop-common.c:334 +msgid "Communication & News" +msgstr "Notícies i comunicació" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:337 +msgid "Reference" +msgstr "Referència" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:340 +msgid "Utilities" +msgstr "Utilitats" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-appstream.c:693 +msgid "Downloading extra metadata files…" +msgstr "S'estan baixant fitxers de metadades extres…" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:65 +msgid "OS Updates" +msgstr "Actualitzacions del SO" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:70 +msgid "Includes performance, stability and security improvements." +msgstr "Inclou millores de rendiment, d'estabilitat i de seguretat." + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:55 +msgid "Downloading featured images…" +msgstr "S'estan baixant les imatges destacades…" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Compatibilitat amb Web Apps" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Executeu aplicacions populars al navegador" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:118 +msgid "GNOME Software AppStream system-wide installer" +msgstr "L'instal·lador d'AppStream del Programari del GNOME" + +#: plugins/external-appstream/gs-install-appstream.c:120 +msgid "Failed to parse command line arguments" +msgstr "Ha fallat l'anàlisi dels arguments de la línia d'ordes" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:127 +msgid "You need to specify exactly one filename" +msgstr "Heu d'especificar un nom de fitxer exactament" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:134 +msgid "This program can only be used by the root user" +msgstr "Este programa només pot ser utilitzat per l'usuari root" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:142 +msgid "Failed to validate content type" +msgstr "No s'ha pogut validar el tipus de contingut" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:149 +msgid "Failed to copy" +msgstr "S'ha produït un error en copiar" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:212 +msgid "Downloading upgrade information…" +msgstr "S'està baixant la informació de l'actualització…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:303 +msgid "Upgrade your Fedora system to the latest features and improvements." +msgstr "" +"Actualitzeu el vostre sistema Fedora per obtindre les últimes funcions i " +"millores." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Compatibilitat amb Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "Flatpak és un espai de treball per aplicacions d'escriptori a Linux" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:563 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "S'estan obtenint les metadades del flatpak per %s…" + +#. TRANSLATORS: status text when downloading the RuntimeRepo +#: plugins/flatpak/gs-flatpak.c:2617 +msgid "Getting runtime source…" +msgstr "S'estan preparant les actualitzacions…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:801 +msgid "Downloading firmware update signature…" +msgstr "S'està baixant la signatura de l'actualització del microprogramari…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:847 +msgid "Downloading firmware update metadata…" +msgstr "S'estan baixant les metadades de l'actualització del microprogramari…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:941 +msgid "Downloading firmware update…" +msgstr "S'està baixant l'actualització del microprogramari…" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Compatibilitat amb actualitzacions de microprogramari" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Proveeix compatibilitat amb actualitzacions de microprogramari" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:6 +msgid "Limba Support" +msgstr "Compatibilitat amb Limba" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:7 +msgid "Limba provides developers a way to easily create software bundles" +msgstr "" +"Limba proveeix als desenvolupadors una manera senzilla de fer paquets de " +"programari" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:205 +msgid "Downloading application ratings…" +msgstr "S'estan baixant les valoracions de l'aplicació…" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "Compatibilitat amb Open Desktop Ratings" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "ODRS que proporciona ressenyes d'usuaris d'aplicacions" + +#. TRANSLATORS: status text when downloading +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:669 +msgid "Downloading shell extension metadata…" +msgstr "S'estan baixant les metadades de l'extensió del shell…" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snappy Support" +msgstr "Compatibilitat amb Snappy" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Un «snap» és un paquet Linux universal" + +#. TRANSLATORS: status text when downloading +#: plugins/steam/gs-plugin-steam.c:600 +msgid "Downloading application page…" +msgstr "S'està baixant la pàgina de l'aplicació…" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:6 +msgid "Steam Support" +msgstr "Compatibilitat amb Steam" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:7 +msgid "The ultimate entertainment platform from Valve" +msgstr "La plataforma d'entreteniment de Valve" + +#~ msgid "page1" +#~ msgstr "pàgina 1" + +#~ msgid "page2" +#~ msgstr "pàgina 2" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Tots" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Tots" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Totes" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Tots" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Tots" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Tots" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Tots" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgid "“%s” [%s]" +#~ msgstr "«{%s}» [%s]" + +#~ msgid "About Software" +#~ msgstr "Quant al programari" + +#~ msgid "Other Updates" +#~ msgstr "Altres actualitzacions" + +#~ msgid "Total" +#~ msgstr "Total" + +#~ msgid "_Install All" +#~ msgstr "_Instal·la-ho tot" + +#~ msgid "Installation of %s failed." +#~ msgstr "Ha fallat la instal·lació de %s." + +#~ msgid "Removal of %s failed." +#~ msgstr "Ha fallat la supressió de %s." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Assegureu-vos que teniu accés a Internet i torneu-ho a provar." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Allibereu espai a disc i torneu-ho a provar." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Si el problema continua, contacteu el proveïdor del programari." + +#~ msgctxt "content rating violence-cartoon" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Cap" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Tots" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Tots" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Destacat" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomia" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Química" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matemàtiques" + +#~ msgid "Science" +#~ msgstr "Ciència" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Les fonts de programari us donen accés a programari addicional." + +#~ msgid "3rd party" +#~ msgstr "De terceres parts" + +#~ msgid "web app" +#~ msgstr "aplicació web" + +#~ msgid "nonfree" +#~ msgstr "no lliure" + +#~ msgid "shell extension" +#~ msgstr "Extensió del Shell" + +#~ msgid "_Installing" +#~ msgstr "S'està _instal·lant" + +#~ msgid "_Removing" +#~ msgstr "S'està _suprimint" + +#~ msgid " or " +#~ msgstr " o " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Desconeguda" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Aquest programa ve d'una tercera part." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Aquest programa ve d'una tercera part i pot contenir components no " +#~ "lliures." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Aquest programa pot contenir components no lliures." + +#~ msgid "non-free" +#~ msgstr "no lliure" + +#~ msgid "One Star" +#~ msgstr "Una estrella" + +#~ msgid "Two Stars" +#~ msgstr "Dues estrelles" + +#~ msgid "Three Stars" +#~ msgstr "Tres estrelles" + +#~ msgid "Four Stars" +#~ msgstr "Quatre estrelles" + +#~ msgid "Five Stars" +#~ msgstr "Cinc estrelles" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Aplicacions d'ofimàtica recomanades" + +#~ msgid "Audio" +#~ msgstr "Àudio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Edició" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Bases de dades" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Enregistrament de disc" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Radioaficionat" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mesclador" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Música" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Enregistradores" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Seqüenciadors" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Sintonitzadors" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Construcció" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Bases de dades" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "Entorn de desenvolupament integrat" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Depuració" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "Gestió de projectes" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Revision Control" +#~ msgstr "Control de versions" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Translation" +#~ msgstr "Traducció" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Desenvolupament web" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Informàtica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Construction" +#~ msgstr "Construcció" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Visualització de dades" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Economia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Electricitat" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Electrònica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Enginyeria" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Ciències de la terra" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Història" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Humanities" +#~ msgstr "Humanitats" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Processament d'imatge" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Mapes" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Medical" +#~ msgstr "Medicina" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Música" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Anàlisi numèrica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Computació paral·lela" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Física" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Espiritualitat" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Trets" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulació" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Esports" + +#~ msgid "Graphics" +#~ msgstr "Gràfics" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "Gràfics 2D" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Edició" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Gràfics matricials" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Marcatge" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Correu electrònic" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Canals de difusió" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Transferència de fitxers" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Radioafició" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Missatgeria instantània" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "Clients IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Monitorització" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Remote Access" +#~ msgstr "Accés remot" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonia" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Desenvolupament web" + +#~ msgid "Office" +#~ msgstr "Oficina" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Diagrames" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Gestió de contactes" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Diccionaris" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Correu electrònic" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Diagrames de flux" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografia" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Presentation" +#~ msgstr "Presentacions" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Gestió de projectes" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Edició" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Fulls de càlcul" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Visualitzadors" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Art" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Intel·ligència artificial" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Química" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Informàtica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Construcció" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Visualització de dades" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Economia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Electricitat" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Electrònica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Enginyeria" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Ciències de la terra" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Història" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humanitats" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Processament d'imatges" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Llengües" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Mapes" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matemàtiques" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Medicina" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Anàlisi numèrica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Computació paral·lela" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Física" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robòtica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Espiritualitat" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Esports" + +#~ msgid "System" +#~ msgstr "Sistema" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emuladors" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Gestors de fitxers" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File System" +#~ msgstr "Sistema de fitxers" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Eines de fitxers" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Monitorització" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Seguretat" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Emuladors de terminal" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Accessibilitat" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Arxivament" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Calculadores" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Rellotges" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Compressió" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Eines de fitxers" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Mapes" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Espiritualitat" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Eines de telefonia" + +#~ msgid "Video" +#~ msgstr "Vídeo" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Edició" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Base de dades" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Enregistrament de discos" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Players" +#~ msgstr "Reproductors" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Enregistradores" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "S'està calculant…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Desconeguda" + +#~ msgid "_History" +#~ msgstr "_Historial" + +#~ msgid "Size" +#~ msgstr "Mida" + +#~ msgid "No AppStream data found" +#~ msgstr "No s'ha trobat les dades d'AppStream" + +#~ msgid "A previous update was unfinished." +#~ msgstr "No s'havia finalitzat una actualització anterior." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "No s'ha pogut instal·lar l'actualització. Això és degut habitualment a un " +#~ "problema amb l'actualització. Espereu a una actualització nova i torneu-" +#~ "ho a provar." + +#~ msgid "Internet Only Application" +#~ msgstr "Aplicació d'Internet" + +#~ msgid "Enter GApplication service mode" +#~ msgstr "Entra al mode de servei GApplication" + +#~ msgid "Checking for updates…" +#~ msgstr "S'està comprovant si hi ha actualitzacions…" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Una actualització no s'ha signat de la forma correcta." + +#~ msgid "The update could not be completed." +#~ msgstr "No es va poder completar l'actualització." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Es va sol·licitar una actualització fora de línia però no hi havia cap " +#~ "paquet per actualitzar. " + +#~ msgid "No space was left on the drive." +#~ msgstr "No quedava espai lliure al disc." + +#~ msgid "An update failed to install correctly." +#~ msgstr "No es va poder instal·lar una actualització." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "" +#~ "L'actualització fora de línia va fallar d'una manera no determinada." + +#~ msgid "No sources found." +#~ msgstr "No s'ha trobat cap font." + +#~ msgid "OK" +#~ msgstr "D'acord" + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "S'ha instal·lat %i aplicació i %i connector" +#~ msgstr[1] "S'ha instal·lat %i aplicacions i %i connectors" diff --git a/po/ckb.po b/po/ckb.po new file mode 100644 index 0000000..7427a4f --- /dev/null +++ b/po/ckb.po @@ -0,0 +1,4174 @@ +# Central Kurdish translation for gnome-software. +# Copyright (C) 2020 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Jwtiyar Nariman , 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software gnome-3-36\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2020-07-18 13:48+0000\n" +"PO-Revision-Date: 2020-08-04 23:53+0300\n" +"Language-Team: Central Kurdish \n" +"Language: ckb\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" +"Last-Translator: Jwtiyar Nariman \n" +"X-Generator: Poedit 2.4\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "نەرمەکاڵای گنۆم" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "بەڕێوەبەری داوانامە بۆ گنۆم" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "بەشی پوختە" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "بەشی زانیاری" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "بەشی دامەزراوەکان" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "بەشی نوێکاری" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "زانیاری نوێکردنەوە" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1515 +msgid "The GNOME Project" +msgstr "پرۆژەی گنۆم" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" + +#: data/org.gnome.software.gschema.xml:47 +msgid "A list of popular applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:48 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "" + +#: data/org.gnome.software.gschema.xml:52 +msgid "The last update check timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:56 +msgid "The last upgrade notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:60 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: data/org.gnome.software.gschema.xml:64 +msgid "The last update timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:68 +msgid "The last timestamp when the system was online and got any updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:72 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:73 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:82 +msgid "The server to use for application reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:86 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:87 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:91 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" + +#: data/org.gnome.software.gschema.xml:95 +msgid "A list of official repositories that should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:99 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:103 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:107 +msgid "Allow access to the Software Repositories dialog" +msgstr "" + +#: data/org.gnome.software.gschema.xml:111 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: data/org.gnome.software.gschema.xml:115 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:119 +msgid "Show the prompt to install nonfree software repositories" +msgstr "" + +#: data/org.gnome.software.gschema.xml:123 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:127 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" + +#: data/org.gnome.software.gschema.xml:128 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:132 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:136 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "" + +#: data/org.gnome.software.gschema.xml:140 +msgid "Enable GNOME Shell extensions repository" +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "دامەزراندنی نەرمەکاڵا" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "نەرمەکاڵای دیاریکراو دابمەزرێنە" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "هەمووی دیاریبکە" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "هیچ دیاری مەکە" + +#: src/gnome-software.ui:35 +msgid "_Software Repositories" +msgstr "" + +#: src/gnome-software.ui:40 +msgid "_Update Preferences" +msgstr "_نوێکردنەوە هەڵبژاردنەکان" + +#: src/gnome-software.ui:48 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "نەرمەکاڵا" + +#: src/gnome-software.ui:64 src/gs-update-dialog.ui:20 +msgid "Go back" +msgstr "بڕۆدواوە" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:96 +msgid "_Explore" +msgstr "_گەڕان" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gnome-software.ui:119 +msgid "_Installed" +msgstr "_دامەزراوە" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gnome-software.ui:159 +msgid "_Updates" +msgstr "_نوێکاری" + +#: src/gnome-software.ui:228 +msgid "Search" +msgstr "گەڕان" + +#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos +#. TRANSLATORS: this refers to where the app came from +#: src/gnome-software.ui:272 src/gs-app-row.c:285 src/gs-details-page.ui:886 +msgid "Source" +msgstr "سەرچاوە" + +#. button in the info bar +#: src/gnome-software.ui:377 src/gs-repos-dialog.ui:5 src/gs-repos-dialog.ui:18 +msgid "Software Repositories" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:385 +msgid "Examine Disk" +msgstr "" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:393 src/gs-updates-page.c:921 +msgid "Network Settings" +msgstr "ڕێکخستنی ڕایەڵە" + +#. button in the info bar +#: src/gnome-software.ui:401 +msgid "Restart Now" +msgstr "دەسپێکردنەوە ئەنجام بدە" + +#. button in the info bar +#: src/gnome-software.ui:409 +msgid "More Information" +msgstr "زانیاریی زیاتر" + +#: src/gnome-software.ui:461 src/gs-metered-data-dialog.ui:5 +#: src/gs-metered-data-dialog.ui:17 +msgid "Automatic Updates Paused" +msgstr "" + +#: src/gnome-software.ui:480 +msgid "Find Out _More" +msgstr "" + +#. TRANSLATORS: this is a locally downloaded package +#: lib/gs-app.c:4506 +msgid "Local file" +msgstr "" + +#: lib/gs-app.c:4558 +msgid "Package" +msgstr "گورزە" + +#: src/gs-app-addon-row.c:82 src/gs-app-row.c:392 +msgid "Pending" +msgstr "لە چاوەڕوانیدایە" + +#: src/gs-app-addon-row.c:88 src/gs-app-row.ui:162 src/gs-app-tile.ui:51 +#: src/gs-feature-tile.c:68 +msgid "Installed" +msgstr "دامەزرا" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being installed +#: src/gs-app-addon-row.c:92 src/gs-app-row.c:163 src/gs-details-page.c:329 +#: src/gs-third-party-repo-row.c:99 +msgid "Installing" +msgstr "دادەمەزرێت" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being removed +#: src/gs-app-addon-row.c:96 src/gs-app-row.c:169 src/gs-repo-row.c:125 +#: src/gs-third-party-repo-row.c:106 +msgid "Removing" +msgstr "سڕینەوە" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:109 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: src/gs-application.c:109 +msgid "MODE" +msgstr "" + +#: src/gs-application.c:111 +msgid "Search for applications" +msgstr "" + +#: src/gs-application.c:111 +msgid "SEARCH" +msgstr "" + +#: src/gs-application.c:113 +msgid "Show application details (using application ID)" +msgstr "" + +#: src/gs-application.c:113 src/gs-application.c:117 +msgid "ID" +msgstr "ناسنامە" + +#: src/gs-application.c:115 +msgid "Show application details (using package name)" +msgstr "" + +#: src/gs-application.c:115 +msgid "PKGNAME" +msgstr "" + +#: src/gs-application.c:117 +msgid "Install the application (using application ID)" +msgstr "" + +#: src/gs-application.c:119 +msgid "Open a local package file" +msgstr "" + +#: src/gs-application.c:119 +msgid "FILENAME" +msgstr "" + +#: src/gs-application.c:121 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:124 +msgid "Show verbose debugging information" +msgstr "" + +#: src/gs-application.c:126 +msgid "Installs any pending updates in the background" +msgstr "" + +#: src/gs-application.c:128 +msgid "Show update preferences" +msgstr "" + +#: src/gs-application.c:130 +msgid "Quit the running instance" +msgstr "" + +#: src/gs-application.c:132 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:134 +msgid "Show version number" +msgstr "" + +#: src/gs-application.c:328 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Jwtiyar Nariman https://launchpad.net/~jwtiyar" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#. TRANSLATORS: this is the menu item that opens the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:335 src/gs-shell.c:2104 +#, c-format +msgid "About %s" +msgstr "" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:339 +msgid "A nice way to manage the software on your system." +msgstr "" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:567 +msgid "Sorry! There are no details for that application." +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:118 +msgid "Visit website" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:123 +msgid "Install…" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:130 src/gs-updates-section.c:478 +msgid "Cancel" +msgstr "لابردن" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:137 src/gs-common.c:287 src/gs-page.c:273 +msgid "Install" +msgstr "دامەزراندن" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:144 +msgid "Update" +msgstr "نوێكردنه‌وه‌" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-app-row.c:148 src/gs-app-row.c:157 src/gs-page.c:434 +#: src/gs-repos-dialog.c:325 +msgid "Remove" +msgstr "سڕینەوە" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:275 +msgid "Device cannot be used during update." +msgstr "" + +#: src/gs-app-row.c:450 src/gs-update-dialog.ui:182 +msgid "Requires additional permissions" +msgstr "" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:177 +msgid "Other" +msgstr "هیتر" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:182 +msgid "All" +msgstr "هەمووی" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:186 +msgid "Featured" +msgstr "هەڵبژێردراو" + +#. TRANSLATORS: This is a heading on the categories page. %s gets +#. replaced by the category name, e.g. 'Graphics & Photography' +#: src/gs-category-page.c:467 +#, c-format +msgid "Featured %s" +msgstr "هەڵبژێردراو %s" + +#. Translators: A label for a button to sort apps by their rating. +#: src/gs-category-page.ui:26 src/gs-review-dialog.ui:74 +msgid "Rating" +msgstr "نرخاندن" + +#. Translators: A label for a button to sort apps alphabetically. +#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm" +#: src/gs-category-page.ui:32 src/gs-origin-popover-row.c:58 +msgid "Name" +msgstr "ناو" + +#. TRANSLATORS: This is a label for the category filter drop down, which all together can read e.g. 'Show Vector Graphics'. +#: src/gs-category-page.ui:111 +msgid "Show" +msgstr "پیشاندان" + +#: src/gs-category-page.ui:128 +msgid "Subcategories filter menu" +msgstr "" + +#. TRANSLATORS: This is a label for the category sort drop down, which all together can read e.g. 'Sort Top Rated'. +#: src/gs-category-page.ui:159 +msgid "Sort" +msgstr "ڕیزکردن" + +#: src/gs-category-page.ui:175 +msgid "Subcategories sorting menu" +msgstr "" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:190 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "" + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:253 +msgid "Choose an application:" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:123 +msgid "OS updates are now installed" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:126 +msgid "Recently installed updates are available to review" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:131 src/gs-common.c:145 +#, c-format +msgid "%s is now installed" +msgstr "" + +#. TRANSLATORS: an application has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:135 src/gs-common.c:149 +msgid "A restart is required for the changes to take effect." +msgstr "" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:139 +msgid "Application is ready to be used." +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:159 src/gs-common.c:638 +msgid "Restart" +msgstr "دووبارە پێکردنەوە" + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:163 +msgid "Launch" +msgstr "پێکردن" + +#. TRANSLATORS: window title +#: src/gs-common.c:221 +msgid "Install Third-Party Software?" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:225 src/gs-repos-dialog.c:234 +msgid "Enable Third-Party Software Repository?" +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:241 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:251 +#, c-format +msgid "%s is provided by “%s”." +msgstr "" + +#: src/gs-common.c:260 +msgid "This software repository must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:270 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:276 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:283 +msgid "Don’t Warn Again" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:292 +msgid "Enable and Install" +msgstr "" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:440 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#: src/gs-common.c:459 src/gs-details-page.ui:447 +msgid "Details" +msgstr "وردەکارییەکان" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:624 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:629 +msgid "A restart is required for it to take effect." +msgid_plural "A restart is required for them to take effect." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: button text +#: src/gs-common.c:636 src/gs-update-monitor.c:122 +msgid "Not Now" +msgstr "ئێستا نا" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:59 +msgid "No cartoon violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:61 +msgid "Cartoon characters in unsafe situations" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:63 +msgid "Cartoon characters in aggressive conflict" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:65 +msgid "Graphic violence involving cartoon characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:70 +msgid "No fantasy violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:72 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:74 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:76 +msgid "Graphic violence easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "No realistic violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:83 +msgid "Mildly realistic characters in unsafe situations" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:85 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "Graphic violence involving realistic characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:92 +msgid "No bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:94 +msgid "Unrealistic bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Realistic bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:98 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:103 +msgid "No sexual violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Rape or other violent sexual behavior" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:112 +msgid "No references to alcohol" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "References to alcoholic beverages" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:116 +msgid "Use of alcoholic beverages" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:122 +msgid "No references to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:124 +msgid "References to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Use of illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "No references to tobacco products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:134 +msgid "References to tobacco products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:136 +msgid "Use of tobacco products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:142 +msgid "No nudity of any sort" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Brief artistic nudity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:146 +msgid "Prolonged nudity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:152 +msgid "No references to or depictions of sexual nature" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:154 +msgid "Provocative references or depictions" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Sexual references or depictions" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:158 +msgid "Graphic sexual behavior" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:163 +msgid "No profanity of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Mild or infrequent use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:167 +msgid "Moderate use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:169 +msgid "Strong or frequent use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No inappropriate humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:176 +msgid "Slapstick humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:178 +msgid "Vulgar or bathroom humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Mature or sexual humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:185 +msgid "No discriminatory language of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:187 +msgid "Negativity towards a specific group of people" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Discrimination designed to cause emotional harm" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:191 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:196 +msgid "No advertising of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "Product placement" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:200 +msgid "Explicit references to specific brands or trademarked products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:202 +msgid "Users are encouraged to purchase specific real-world items" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "No gambling of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:209 +msgid "Gambling on random events using tokens or credits" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:211 +msgid "Gambling using “play” money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Gambling using real money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:218 +msgid "No ability to spend money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:220 +msgid "Users are encouraged to donate real money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:223 +msgid "Ability to spend real money in-app" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "No way to chat with other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:230 +msgid "User-to-user interactions without chat functionality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:232 +msgid "Moderated chat functionality between users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "Uncontrolled chat functionality between users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:239 +msgid "No way to talk with other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:241 +msgid "Uncontrolled audio or video chat functionality between users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:248 +msgid "No sharing of social network usernames or email addresses" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:250 +msgid "Sharing social network usernames or email addresses" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:257 +msgid "No sharing of user information with third parties" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:259 +msgid "Checking for the latest application version" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "Sharing diagnostic data that does not let others identify the user" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:263 +msgid "Sharing information that lets others identify the user" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:268 +msgid "No sharing of physical location with other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "Sharing physical location with other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:279 +msgid "No references to homosexuality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:281 +msgid "Indirect references to homosexuality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:283 +msgid "Kissing between people of the same gender" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:285 +msgid "Graphic sexual behavior between people of the same gender" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:290 +msgid "No references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:292 +msgid "Indirect references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:294 +msgid "Direct references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:296 +msgid "Graphic depictions of the act of prostitution" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:301 +msgid "No references to adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:303 +msgid "Indirect references to adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:305 +msgid "Direct references to adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:307 +msgid "Graphic depictions of the act of adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:312 +msgid "No sexualized characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:315 +msgid "Scantily clad human characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:317 +msgid "Overtly sexualized human characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:322 +msgid "No references to desecration" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:324 +msgid "Depictions of or references to historical desecration" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:326 +msgid "Depictions of modern-day human desecration" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:328 +msgid "Graphic depictions of modern-day desecration" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:333 +msgid "No visible dead human remains" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:335 +msgid "Visible dead human remains" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:337 +msgid "Dead human remains that are exposed to the elements" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:339 +msgid "Graphic depictions of desecration of human bodies" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:344 +msgid "No references to slavery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:346 +msgid "Depictions of or references to historical slavery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:348 +msgid "Depictions of modern-day slavery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:350 +msgid "Graphic depictions of modern-day slavery" +msgstr "" + +#. TRANSLATORS: This is the formatting of English and localized name +#. of the rating e.g. "Adults Only (solo adultos)" +#: src/gs-content-rating.c:406 +#, c-format +msgid "%s (%s)" +msgstr "" + +#: src/gs-content-rating.c:540 +msgid "General" +msgstr "گشتی" + +#: src/gs-content-rating.c:549 +msgid "ALL" +msgstr "" + +#: src/gs-content-rating.c:553 +msgid "Adults Only" +msgstr "" + +#: src/gs-content-rating.c:555 +msgid "Mature" +msgstr "" + +#: src/gs-content-rating.c:557 +msgid "Teen" +msgstr "" + +#: src/gs-content-rating.c:559 +msgid "Everyone 10+" +msgstr "" + +#: src/gs-content-rating.c:561 +msgid "Everyone" +msgstr "" + +#: src/gs-content-rating.c:563 +msgid "Early Childhood" +msgstr "" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:281 +msgid "An application" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:287 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:289 +msgid "Additional MIME Types Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:293 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:295 +msgid "Additional Fonts Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:299 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:301 +msgid "Additional Multimedia Codecs Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:305 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:307 +msgid "Additional Printer Drivers Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:311 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:313 +msgid "Additional Packages Required" +msgstr "" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:322 +msgid "Find in Software" +msgstr "" + +#: src/gs-details-page.c:324 +msgid "Removing…" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:343 +msgid "Pending installation…" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:350 +msgid "Pending update…" +msgstr "" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:710 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo +#: src/gs-details-page.c:855 src/gs-details-page.c:872 +#: src/gs-details-page.ui:167 src/gs-third-party-repo-row.c:83 +#: src/gs-upgrade-banner.c:63 +msgid "_Install" +msgstr "_دامەزراندن" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo. +#. The ellipsis indicates that further steps are required +#: src/gs-details-page.c:886 src/gs-third-party-repo-row.c:75 +msgid "_Install…" +msgstr "" + +#. TRANSLATORS: A label for a button to execute the selected application. +#: src/gs-details-page.c:928 +msgid "_Launch" +msgstr "" + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:952 src/gs-details-page.ui:192 +msgid "_Remove" +msgstr "ـسڕینەوە" + +#: src/gs-details-page.c:983 src/gs-update-dialog.c:92 +msgid "Network" +msgstr "ڕایەڵە" + +#: src/gs-details-page.c:983 src/gs-update-dialog.c:92 +msgid "Can communicate over the network" +msgstr "" + +#: src/gs-details-page.c:984 src/gs-update-dialog.c:93 +msgid "System Services" +msgstr "" + +#: src/gs-details-page.c:984 src/gs-update-dialog.c:93 +msgid "Can access D-Bus services on the system bus" +msgstr "" + +#: src/gs-details-page.c:985 src/gs-update-dialog.c:94 +msgid "Session Services" +msgstr "" + +#: src/gs-details-page.c:985 src/gs-update-dialog.c:94 +msgid "Can access D-Bus services on the session bus" +msgstr "" + +#: src/gs-details-page.c:986 src/gs-update-dialog.c:95 +msgid "Devices" +msgstr "ئامێرەکان" + +#: src/gs-details-page.c:986 src/gs-update-dialog.c:95 +msgid "Can access system device files" +msgstr "" + +#: src/gs-details-page.c:987 src/gs-details-page.c:988 +#: src/gs-update-dialog.c:96 src/gs-update-dialog.c:97 +msgid "Home folder" +msgstr "بوخچەی سەرەکی" + +#: src/gs-details-page.c:987 src/gs-details-page.c:989 +#: src/gs-details-page.c:991 src/gs-update-dialog.c:96 +#: src/gs-update-dialog.c:98 src/gs-update-dialog.c:100 +msgid "Can view, edit and create files" +msgstr "" + +#: src/gs-details-page.c:988 src/gs-details-page.c:990 +#: src/gs-details-page.c:992 src/gs-update-dialog.c:97 +#: src/gs-update-dialog.c:99 src/gs-update-dialog.c:101 +msgid "Can view files" +msgstr "" + +#: src/gs-details-page.c:989 src/gs-details-page.c:990 +#: src/gs-update-dialog.c:98 src/gs-update-dialog.c:99 +msgid "File system" +msgstr "" + +#: src/gs-details-page.c:991 src/gs-details-page.c:992 +#: src/gs-update-dialog.c:100 src/gs-update-dialog.c:101 +msgid "Downloads folder" +msgstr "" + +#: src/gs-details-page.c:993 src/gs-update-dialog.c:102 +msgid "Settings" +msgstr "ڕێکخستنەکان" + +#: src/gs-details-page.c:993 src/gs-update-dialog.c:102 +msgid "Can view and change any settings" +msgstr "" + +#: src/gs-details-page.c:994 src/gs-update-dialog.c:103 +msgid "Legacy display system" +msgstr "" + +#: src/gs-details-page.c:994 src/gs-update-dialog.c:103 +msgid "Uses an old, insecure display system" +msgstr "" + +#: src/gs-details-page.c:995 src/gs-update-dialog.c:104 +msgid "Sandbox escape" +msgstr "" + +#: src/gs-details-page.c:995 src/gs-update-dialog.c:104 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" + +#: src/gs-details-page.c:1010 +msgid "This application is fully sandboxed." +msgstr "" + +#: src/gs-details-page.c:1018 +msgid "" +"Unable to determine which parts of the system this application accesses. " +"This is typical for older applications." +msgstr "" + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:1177 +msgctxt "version" +msgid "Unknown" +msgstr "نەناسراو" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:1190 +msgctxt "updated" +msgid "Never" +msgstr "هه‌رگیز" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1243 +msgctxt "origin" +msgid "Unknown" +msgstr "نەناسراو" + +#: src/gs-details-page.c:1296 +msgid "Low" +msgstr "نزم" + +#: src/gs-details-page.c:1298 +msgid "Medium" +msgstr "ناوەند" + +#: src/gs-details-page.c:1300 +msgid "High" +msgstr "بەرز" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.c:1302 src/gs-details-page.ui:1006 +#: src/gs-review-row.c:57 +msgid "Unknown" +msgstr "نەناسراو" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1640 +msgid "You need internet access to write a review" +msgstr "" + +#: src/gs-details-page.c:1826 src/gs-details-page.c:1842 +#, c-format +msgid "Unable to find “%s”" +msgstr "" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2420 +msgid "Public domain" +msgstr "" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://de.wikipedia.org/wiki/Gemeinfreiheit +#: src/gs-details-page.c:2423 +msgid "https://en.wikipedia.org/wiki/Public_domain" +msgstr "" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://www.gnu.org/philosophy/free-sw.de +#: src/gs-details-page.c:2430 +msgid "https://www.gnu.org/philosophy/free-sw" +msgstr "" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2440 src/gs-details-page.ui:1250 +msgid "Free Software" +msgstr "" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2497 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-details-page.c:2524 src/gs-details-page.ui:1322 +msgid "More information" +msgstr "" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "" + +#: src/gs-details-page.ui:222 +msgid "Downloading" +msgstr "" + +#: src/gs-details-page.ui:252 src/gs-removal-dialog.ui:32 +#: src/gs-review-dialog.ui:22 src/gs-upgrade-banner.ui:112 +msgid "_Cancel" +msgstr "_پاشگەزبوونەوە" + +#: src/gs-details-page.ui:262 +msgid "_Update" +msgstr "_نوێکردنەوە" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: src/gs-details-page.ui:278 +msgid "_Add shortcut" +msgstr "" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: src/gs-details-page.ui:292 +msgid "Re_move shortcut" +msgstr "" + +#: src/gs-details-page.ui:366 +msgid "No screenshot provided" +msgstr "" + +#: src/gs-details-page.ui:386 +msgid "Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:387 +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "" + +#: src/gs-details-page.ui:394 +msgid "No Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:395 +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "" + +#: src/gs-details-page.ui:403 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:410 +msgid "Software Repository Identified" +msgstr "" + +#: src/gs-details-page.ui:411 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" + +#: src/gs-details-page.ui:412 +msgid "Only use software repositories that you trust." +msgstr "" + +#: src/gs-details-page.ui:422 +msgid "_Website" +msgstr "" + +#: src/gs-details-page.ui:431 +msgid "_Donate" +msgstr "" + +#: src/gs-details-page.ui:541 +msgid "Localized in your Language" +msgstr "" + +#: src/gs-details-page.ui:552 +msgid "Documentation" +msgstr "به‌ڵگه‌سازی" + +#: src/gs-details-page.ui:563 +msgid "Release Activity" +msgstr "" + +#: src/gs-details-page.ui:574 +msgid "System Integration" +msgstr "" + +#: src/gs-details-page.ui:585 +msgid "Sandboxed" +msgstr "" + +#. TRANSLATORS: the title for Snap channels +#: src/gs-details-page.ui:605 src/gs-origin-popover-row.c:102 +msgid "Channel" +msgstr "کەناڵ" + +#. Translators: The available version of an app +#: src/gs-details-page.ui:641 src/gs-origin-popover-row.ui:151 +msgid "Version" +msgstr "وەشان" + +#: src/gs-details-page.ui:677 +msgid "Age Rating" +msgstr "" + +#: src/gs-details-page.ui:715 src/gs-details-page.ui:1408 +msgid "Permissions" +msgstr "دەسەڵاتەکان" + +#: src/gs-details-page.ui:753 +msgid "Updated" +msgstr "بارکراوە" + +#: src/gs-details-page.ui:787 +msgid "Category" +msgstr "هاوپۆل" + +#: src/gs-details-page.ui:824 +msgid "Installed Size" +msgstr "" + +#: src/gs-details-page.ui:855 +msgid "Download Size" +msgstr "" + +#: src/gs-details-page.ui:917 +msgid "Developer" +msgstr "" + +#: src/gs-details-page.ui:963 +msgid "License" +msgstr "مۆڵەت" + +#. This refers to the license of the application +#: src/gs-details-page.ui:982 +msgid "Free" +msgstr "" + +#. This refers to the license of the application +#: src/gs-details-page.ui:994 +msgid "Proprietary" +msgstr "" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: src/gs-details-page.ui:1044 src/gs-installed-page.c:442 +#: plugins/core/gs-desktop-common.c:314 +msgid "Add-ons" +msgstr "" + +#: src/gs-details-page.ui:1056 +msgid "Selected add-ons will be installed with the application." +msgstr "" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-details-page.ui:1094 +msgid "Reviews" +msgstr "" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1112 +msgid "_Write a Review" +msgstr "" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1133 +msgid "_Show More" +msgstr "" + +#: src/gs-details-page.ui:1261 +msgid "" +"This means that the software can be freely run, copied, distributed, studied " +"and modified." +msgstr "" + +#: src/gs-details-page.ui:1301 +msgid "Proprietary Software" +msgstr "" + +#: src/gs-details-page.ui:1312 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "" + +#: src/gs-details-page.ui:1344 +msgid "Unknown Software License" +msgstr "" + +#: src/gs-details-page.ui:1355 +msgid "The license terms of this software are unknown." +msgstr "" + +#: src/gs-details-page.ui:1375 +msgid "The application was rated this way because it features:" +msgstr "" + +#: src/gs-details-page.ui:1389 +msgid "No details were available for this rating." +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:134 +msgid " and " +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:137 +msgid ", " +msgstr "" + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:163 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:213 +msgid "Unable to Find Requested Software" +msgstr "" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:318 +#, c-format +msgid "%s not found" +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:322 +msgid "on the website" +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:329 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:333 src/gs-extras-page.c:344 src/gs-extras-page.c:355 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:340 src/gs-extras-page.c:362 +#, c-format +msgid "No applications are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:351 +#, c-format +msgid "%s is not available." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:366 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:373 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:377 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:384 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:388 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:395 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:399 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:406 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:410 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:454 +msgid "this website" +msgstr "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:458 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:526 src/gs-extras-page.c:582 src/gs-extras-page.c:621 +msgid "Failed to find any search results" +msgstr "" + +#: src/gs-extras-page.c:809 +#, c-format +msgid "%s file format" +msgstr "" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "" + +#: src/gs-first-run-dialog.ui:6 src/gs-first-run-dialog.ui:15 +msgid "Welcome" +msgstr "بەخێرهاتی" + +#: src/gs-first-run-dialog.ui:43 +msgid "Welcome to Software" +msgstr "" + +#: src/gs-first-run-dialog.ui:53 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" + +#: src/gs-first-run-dialog.ui:62 +msgid "_Let’s Go Shopping" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:69 +msgctxt "app status" +msgid "Removed" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:75 +msgctxt "app status" +msgid "Installed" +msgstr "دامەزرا" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:81 +msgctxt "app status" +msgid "Updated" +msgstr "بارکراوە" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:87 +msgctxt "app status" +msgid "Unknown" +msgstr "نەناسراو" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-history-dialog.c:110 src/gs-review-row.c:64 src/gs-updates-page.c:257 +msgid "%e %B %Y" +msgstr "" + +#: src/gs-history-dialog.ui:5 +msgid "History" +msgstr "مێژوو" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:438 +msgid "System Applications" +msgstr "" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:61 src/gs-loading-page.c:65 +msgid "Software catalog is being downloaded" +msgstr "" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "" + +#: src/gs-loading-page.ui:47 +msgid "Starting up…" +msgstr "" + +#: src/gs-metered-data-dialog.ui:38 +msgid "" +"The current network is metered. Metered connections have data limits or " +"charges associated with them. To save data, automatic updates have therefore " +"been paused.\n" +"\n" +"Automatic updates will be resumed when an un­metered network becomes " +"available. Until then, it is still possible to manually install updates.\n" +"\n" +"Alternatively, if the current network has been in­correctly identified as " +"being metered, this setting can be changed." +msgstr "" + +#: src/gs-metered-data-dialog.ui:53 +msgid "Open Network _Settings" +msgstr "" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "" + +#: src/gs-moderate-page.ui:85 +msgid "There are no reviews to moderate" +msgstr "" + +#. TRANSLATORS: the installation location for flatpaks +#: src/gs-origin-popover-row.c:83 +msgid "system" +msgstr "" + +#. TRANSLATORS: the installation location for flatpaks +#: src/gs-origin-popover-row.c:86 +msgid "user" +msgstr "" + +#. TRANSLATORS: the title for Flatpak branches +#. Translators: The branch, e.g. 'stable' or '3.32' +#: src/gs-origin-popover-row.c:107 src/gs-origin-popover-row.ui:122 +msgid "Branch" +msgstr "" + +#: src/gs-origin-popover-row.ui:35 src/gs-repo-row.ui:75 +msgid "URL" +msgstr "بەستەر" + +#. Translators: The packaging format of the app being installed, e.g. 'RPM' or 'Flatpak' +#: src/gs-origin-popover-row.ui:64 +msgid "Format" +msgstr "فۆرمات" + +#. Translators: The installation location for flatpaks, e.g. 'user' or 'system' +#: src/gs-origin-popover-row.ui:93 +msgid "Installation" +msgstr "" + +#. add button +#: src/gs-overview-page.c:312 +msgid "More…" +msgstr "زیاتر..." + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:562 +msgid "Recommended Audio & Video Applications" +msgstr "" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:567 +msgid "Recommended Games" +msgstr "" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:572 +msgid "Recommended Graphics Applications" +msgstr "" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:577 +msgid "Recommended Productivity Applications" +msgstr "" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:925 src/gs-repos-dialog.c:831 +msgid "Access additional software from selected third party sources." +msgstr "" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:929 src/gs-repos-dialog.c:835 +msgid "" +"Some of this software is proprietary and therefore has restrictions on use, " +"sharing, and access to source code." +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-overview-page.c:934 src/gs-repos-dialog.c:840 +msgid "Find out more…" +msgstr "" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:942 src/gs-repos-dialog.c:239 +msgid "Enable" +msgstr "چالاککردن %s" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "" + +#: src/gs-overview-page.ui:39 +msgid "Enable Third Party Software Repositories?" +msgstr "" + +#: src/gs-overview-page.ui:101 +msgid "Previous" +msgstr "پێشتر" + +#: src/gs-overview-page.ui:126 +msgid "Next" +msgstr "دواتر" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-overview-page.ui:149 +msgid "Editor’s Picks" +msgstr "" + +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-overview-page.ui:175 +msgid "Recent Releases" +msgstr "" + +#: src/gs-overview-page.ui:209 +msgid "Categories" +msgstr "هاوپۆلەکان" + +#: src/gs-overview-page.ui:274 +msgid "No Application Data Found" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:264 +#, c-format +msgid "Prepare %s" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:403 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:407 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the repository to use them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:415 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:418 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" + +#. TRANSLATORS: this refers to an app (by name) that is installed +#: src/gs-popular-tile.c:52 src/gs-summary-tile.c:85 +#, c-format +msgid "%s (Installed)" +msgstr "" + +#: src/gs-prefs-dialog.ui:5 src/gs-prefs-dialog.ui:17 +msgid "Update Preferences" +msgstr "" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatic Updates" +msgstr "" + +#: src/gs-prefs-dialog.ui:70 +msgid "Automatic updates are disabled when on mobile or metered connections." +msgstr "" + +#: src/gs-prefs-dialog.ui:88 +msgid "Automatic Update Notifications" +msgstr "" + +#: src/gs-prefs-dialog.ui:102 +msgid "Show notifications when updates have been automatically installed." +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:119 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" + +#: src/gs-removal-dialog.ui:26 +msgid "Incompatible Software" +msgstr "" + +#: src/gs-removal-dialog.ui:39 +msgid "_Continue" +msgstr "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:97 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:104 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repos-dialog.c:112 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repos-dialog.c:118 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repos-dialog.c:125 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:301 +#, c-format +msgid "Remove “%s”?" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:306 +#, c-format +msgid "Disable “%s”?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-repos-dialog.c:310 +msgid "" +"Software that has been installed from this repository will no longer receive " +"updates, including security fixes." +msgstr "" + +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-repos-dialog.c:328 +msgid "Disable" +msgstr "ناچالاککردن %s" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:744 +msgid "the operating system" +msgstr "" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:810 src/gs-repos-dialog.c:846 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#. TRANSLATORS: info bar title in the software repositories dialog +#: src/gs-repos-dialog.c:828 +msgid "Third Party Repositories" +msgstr "" + +#: src/gs-repos-dialog.ui:73 +msgid "No Additional Repositories" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for enabling a repo +#: src/gs-repo-row.c:95 +msgid "_Enable" +msgstr "_چالاککردن" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for removing a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:104 +msgid "_Remove…" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for disabling a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:109 +msgid "_Disable…" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being enabled +#: src/gs-repo-row.c:117 +msgid "Enabling" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being disabled +#: src/gs-repo-row.c:129 +msgid "Disabling" +msgstr "" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is enabled. +#: src/gs-repo-row.c:143 +msgid "Enabled" +msgstr "چالاككراو" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is disabled. +#: src/gs-repo-row.c:149 +msgid "Disabled" +msgstr "ناچالاککراوە" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:81 +msgid "Hate it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:85 +msgid "Don’t like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:89 +msgid "It’s OK" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:93 +msgid "Like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:97 +msgid "Love it" +msgstr "" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:119 +msgid "Please take more time writing the review" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:123 +msgid "Please choose a star rating" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:127 +msgid "The summary is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:131 +msgid "The summary is too long" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The description is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The description is too long" +msgstr "" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:10 +msgid "Post Review" +msgstr "" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:34 +msgid "_Post" +msgstr "" + +#: src/gs-review-dialog.ui:108 +msgid "Summary" +msgstr "پوختە" + +#: src/gs-review-dialog.ui:118 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:143 +msgctxt "app review" +msgid "Review" +msgstr "" + +#: src/gs-review-dialog.ui:153 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "" + +#: src/gs-review-dialog.ui:185 +msgid "" +"Find what data is sent in our privacy policy." +msgstr "" + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:412 +msgid "ratings in total" +msgstr "" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:222 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:227 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:241 +msgid "Report Review?" +msgstr "" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:245 +msgid "Report" +msgstr "هێنان" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:105 +msgid "Was this review useful to you?" +msgstr "" + +#: src/gs-review-row.ui:121 +msgid "Yes" +msgstr "بەڵێ" + +#: src/gs-review-row.ui:130 +msgid "No" +msgstr "" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:139 +msgid "Meh" +msgstr "" + +#: src/gs-review-row.ui:162 +msgid "Report…" +msgstr "" + +#: src/gs-review-row.ui:172 +msgid "Remove…" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:235 +msgid "Screenshot not found" +msgstr "" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:250 +msgid "Failed to load image" +msgstr "" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:381 +msgid "Screenshot size not found" +msgstr "" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:411 +msgid "Could not create cache" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:471 +msgid "Screenshot not valid" +msgstr "" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:486 +msgid "Screenshot not available" +msgstr "" + +#: src/gs-screenshot-image.c:544 +msgid "Screenshot" +msgstr "ڕووپەڕ" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:142 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1090 src/gs-shell.c:1095 src/gs-shell.c:1110 +#: src/gs-shell.c:1114 +#, c-format +msgid "“%s”" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1161 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1167 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1174 src/gs-shell.c:1219 +msgid "Unable to download updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1180 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1189 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1194 +msgid "Unable to download updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1201 +msgid "Unable to download updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1206 +msgid "Unable to download updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1211 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1222 +msgid "Unable to get list of updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1265 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1271 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1284 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1290 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1297 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 +msgid "Unable to install: the application has an invalid format" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1308 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1315 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1329 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1337 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1400 +#, c-format +msgid "Unable to update %s from %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1407 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1414 +#, c-format +msgid "Unable to install updates from %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1418 +#, c-format +msgid "Unable to install updates as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1424 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1434 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1449 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1454 +#, c-format +msgid "Unable to install updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1463 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1468 +#, c-format +msgid "Unable to install updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1483 +#, c-format +msgid "" +"Unable to install updates: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1493 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to install updates: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1508 +#, c-format +msgid "Unable to update %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1514 +#, c-format +msgid "Unable to install updates: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1525 +#, c-format +msgid "Unable to update %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +#, c-format +msgid "Unable to install updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1571 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "" +"Unable to upgrade to %s: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1594 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1602 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1609 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1623 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1630 +#, c-format +msgid "Unable to upgrade to %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1639 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1677 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1683 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1696 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1703 +#, c-format +msgid "Unable to remove %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1715 +#, c-format +msgid "Unable to remove %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1758 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1765 src/gs-shell.c:1816 src/gs-shell.c:1857 +#: src/gs-shell.c:1905 +msgid "Not enough disk space — free up some space and try again" +msgstr "" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1776 src/gs-shell.c:1827 src/gs-shell.c:1868 +#: src/gs-shell.c:1939 +msgid "Sorry, something went wrong" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1808 +msgid "Failed to install file: not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1812 +msgid "Failed to install file: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1849 +msgid "Failed to install: not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1853 +msgid "Failed to install: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1899 +#, c-format +msgid "Unable to contact %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1914 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1919 +msgid "This application needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1926 +msgid "AC power is required" +msgstr "" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1930 +msgid "The battery level is too low" +msgstr "" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-shell-search-provider.c:256 +#, c-format +msgid "Source: %s" +msgstr "" + +#: src/gs-summary-tile.c:90 +#, c-format +msgid "%s (Installing)" +msgstr "" + +#: src/gs-summary-tile.c:95 +#, c-format +msgid "%s (Removing)" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for removing multiple repos +#: src/gs-third-party-repo-row.c:92 +msgid "_Remove All" +msgstr "" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:187 +msgid "No update description available." +msgstr "" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:291 +#, c-format +msgid "Installed on %s" +msgstr "" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:311 +msgid "Installed Updates" +msgstr "" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:527 +msgid "Additions" +msgstr "" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:531 +msgid "Removals" +msgstr "" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:535 +msgid "Updates" +msgstr "نوێکارییەکان" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:539 +msgid "Downgrades" +msgstr "" + +#: src/gs-update-dialog.ui:100 +msgid "No updates have been installed on this system." +msgstr "" + +#: src/gs-update-monitor.c:110 +msgid "Security Updates Pending" +msgstr "" + +#: src/gs-update-monitor.c:111 +msgid "It is recommended that you install important updates now" +msgstr "" + +#: src/gs-update-monitor.c:114 +msgid "Restart & Install" +msgstr "" + +#: src/gs-update-monitor.c:118 +msgid "Software Updates Available" +msgstr "" + +#: src/gs-update-monitor.c:119 +msgid "Important OS and application updates are ready to be installed" +msgstr "" + +#: src/gs-update-monitor.c:123 +msgid "View" +msgstr "نیشاندان" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:231 +#, c-format +msgid "%u Application Updated — Restart Required" +msgid_plural "%u Applications Updated — Restart Required" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:237 +#, c-format +msgid "%u Application Updated" +msgid_plural "%u Applications Updated" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1 is an application name, e.g. Firefox +#: src/gs-update-monitor.c:248 +#, c-format +msgid "%s has been updated." +msgstr "" + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:251 +msgid "Please restart the application." +msgstr "" + +#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox +#: src/gs-update-monitor.c:259 +#, c-format +msgid "%s and %s have been updated." +msgstr "" + +#. TRANSLATORS: at least one application needs restarting +#: src/gs-update-monitor.c:265 src/gs-update-monitor.c:284 +#, c-format +msgid "%u application requires a restart." +msgid_plural "%u applications require a restart." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox +#: src/gs-update-monitor.c:277 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "" + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:518 src/gs-updates-page.ui:43 +msgid "Operating System Updates Unavailable" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:520 +msgid "Upgrade to continue receiving security updates." +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:575 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:579 +msgid "Software Upgrade Available" +msgstr "" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:968 +msgid "Software Updates Failed" +msgstr "" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:970 +msgid "An important OS update failed to be installed." +msgstr "" + +#: src/gs-update-monitor.c:971 +msgid "Show Details" +msgstr "زانیاری پیشان بدە" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:994 +msgid "System Upgrade Complete" +msgstr "" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:999 +#, c-format +msgid "Welcome to %s %s!" +msgstr "" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1005 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1009 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1020 +msgctxt "updates" +msgid "Review" +msgstr "" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1068 +msgid "Failed To Update" +msgstr "" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1074 +msgid "The system was already up to date." +msgstr "" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1079 +msgid "The update was cancelled." +msgstr "" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1085 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1091 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1097 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1102 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:225 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:228 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:234 +msgid "Yesterday, %R" +msgstr "" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:238 +msgid "Yesterday, %l:%M %p" +msgstr "" + +#: src/gs-updates-page.c:241 +msgid "Two days ago" +msgstr "" + +#: src/gs-updates-page.c:243 +msgid "Three days ago" +msgstr "" + +#: src/gs-updates-page.c:245 +msgid "Four days ago" +msgstr "" + +#: src/gs-updates-page.c:247 +msgid "Five days ago" +msgstr "" + +#: src/gs-updates-page.c:249 +msgid "Six days ago" +msgstr "" + +#: src/gs-updates-page.c:251 +msgid "One week ago" +msgstr "" + +#: src/gs-updates-page.c:253 +msgid "Two weeks ago" +msgstr "" + +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:269 +msgid "Looking for new updates…" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:338 +msgid "Setting up updates…" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:339 src/gs-updates-page.c:346 +msgid "(This could take a while)" +msgstr "" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:453 +#, c-format +msgid "Last checked: %s" +msgstr "" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:617 +#, c-format +msgid "%s %s is no longer supported." +msgstr "" + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:622 +msgid "Your OS is no longer supported." +msgstr "" + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:627 +msgid "This means that it does not receive security updates." +msgstr "" + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:631 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:889 +msgid "Charges May Apply" +msgstr "" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:893 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:897 +msgid "Check _Anyway" +msgstr "" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:913 +msgid "No Network" +msgstr "" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:917 +msgid "Internet access is required to check for updates." +msgstr "" + +#. This label indicates that the update check is in progress +#: src/gs-updates-page.c:1340 +msgid "Checking…" +msgstr "" + +#: src/gs-updates-page.c:1353 +msgid "Check for updates" +msgstr "" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:177 +msgid "Software is up to date" +msgstr "" + +#: src/gs-updates-page.ui:225 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" + +#: src/gs-updates-page.ui:237 +msgid "_Check Anyway" +msgstr "" + +#: src/gs-updates-page.ui:273 +msgid "Go online to check for updates" +msgstr "" + +#: src/gs-updates-page.ui:284 +msgid "_Network Settings" +msgstr "" + +#: src/gs-updates-page.ui:357 +msgid "Updates are automatically managed" +msgstr "" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:280 +msgid "Restart & Update" +msgstr "" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-section.c:286 +msgid "Update All" +msgstr "هەمووی نوێبکەرەوە" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:417 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:421 +msgid "Requires Restart" +msgstr "" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:425 +msgid "Application Updates" +msgstr "" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:429 +msgid "Device Firmware" +msgstr "" + +#: src/gs-updates-section.c:457 src/gs-upgrade-banner.ui:102 +msgid "_Download" +msgstr "" + +#: src/gs-upgrade-banner.c:65 +msgid "" +"It is recommended that you back up your data and files before upgrading." +msgstr "" + +#: src/gs-upgrade-banner.c:69 +msgid "_Restart Now" +msgstr "" + +#: src/gs-upgrade-banner.c:71 +msgid "Updates will be applied when the computer is restarted." +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:86 +#, c-format +msgid "%s %s Now Available" +msgstr "" + +#. TRANSLATORS: This is the text displayed while waiting to +#. * download a distro upgrade. First %s is the distro name and +#. * the 2nd %s is the version, e.g. "Waiting to Download Fedora 23" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "Waiting to Download %s %s" +msgstr "" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:106 +#, c-format +msgid "Downloading %s %s" +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:117 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "" + +#: src/gs-upgrade-banner.ui:30 +msgid "A major upgrade, with new features and added polish." +msgstr "" + +#: src/gs-upgrade-banner.ui:50 +msgid "_Learn More" +msgstr "" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" + +#: plugins/core/gs-desktop-common.c:16 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:19 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:22 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "" + +#: plugins/core/gs-desktop-common.c:28 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "" + +#: plugins/core/gs-desktop-common.c:37 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:40 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:43 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:46 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:55 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:59 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:63 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "" + +#: plugins/core/gs-desktop-common.c:66 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "" + +#: plugins/core/gs-desktop-common.c:70 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "" + +#: plugins/core/gs-desktop-common.c:74 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "زمانەکان" + +#: plugins/core/gs-desktop-common.c:78 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "بیرکاری" + +#: plugins/core/gs-desktop-common.c:85 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:94 +msgctxt "Menu of Games" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:97 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:100 +msgctxt "Menu of Games" +msgid "Action" +msgstr "کردار" + +#: plugins/core/gs-desktop-common.c:103 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "" + +#: plugins/core/gs-desktop-common.c:106 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "" + +#: plugins/core/gs-desktop-common.c:109 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "" + +#: plugins/core/gs-desktop-common.c:112 +msgctxt "Menu of Games" +msgid "Board" +msgstr "" + +#: plugins/core/gs-desktop-common.c:115 +msgctxt "Menu of Games" +msgid "Card" +msgstr "" + +#: plugins/core/gs-desktop-common.c:118 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "" + +#: plugins/core/gs-desktop-common.c:121 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "" + +#: plugins/core/gs-desktop-common.c:124 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "" + +#: plugins/core/gs-desktop-common.c:127 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "" + +#: plugins/core/gs-desktop-common.c:130 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "" + +#: plugins/core/gs-desktop-common.c:134 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "" + +#: plugins/core/gs-desktop-common.c:142 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:145 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:148 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:151 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "" + +#: plugins/core/gs-desktop-common.c:154 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "پشکینینی دەکات" + +#: plugins/core/gs-desktop-common.c:157 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:160 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:168 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:171 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "ڕۆژژمێر" + +#: plugins/core/gs-desktop-common.c:178 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "بنکەی دراو" + +#: plugins/core/gs-desktop-common.c:181 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "" + +#: plugins/core/gs-desktop-common.c:185 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "چارەسەرکەری وۆرد" + +#: plugins/core/gs-desktop-common.c:194 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "جۆرەپیت" + +#: plugins/core/gs-desktop-common.c:197 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:200 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "سەرچاوەی تێخستن" + +#: plugins/core/gs-desktop-common.c:203 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:206 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "" + +#: plugins/core/gs-desktop-common.c:209 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:217 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "" + +#: plugins/core/gs-desktop-common.c:230 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "هەواڵەکان" + +#: plugins/core/gs-desktop-common.c:234 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:242 +msgctxt "Menu of Utilities" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:245 +msgctxt "Menu of Utilities" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:248 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "" + +#: plugins/core/gs-desktop-common.c:256 +msgctxt "Menu of Reference" +msgid "All" +msgstr "هەمووی" + +#: plugins/core/gs-desktop-common.c:259 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "هەڵبژێردراو" + +#: plugins/core/gs-desktop-common.c:262 +msgctxt "Menu of Art" +msgid "Art" +msgstr "" + +#: plugins/core/gs-desktop-common.c:265 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "" + +#: plugins/core/gs-desktop-common.c:268 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:271 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "" + +#: plugins/core/gs-desktop-common.c:274 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "" + +#: plugins/core/gs-desktop-common.c:277 +msgctxt "Menu of Reference" +msgid "History" +msgstr "مێژوو" + +#: plugins/core/gs-desktop-common.c:280 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "" + +#: plugins/core/gs-desktop-common.c:283 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:286 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: plugins/core/gs-desktop-common.c:296 +msgid "Audio & Video" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Development +#: plugins/core/gs-desktop-common.c:299 +msgid "Developer Tools" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Education & Science +#: plugins/core/gs-desktop-common.c:302 +msgid "Education & Science" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:305 +msgid "Games" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: plugins/core/gs-desktop-common.c:308 +msgid "Graphics & Photography" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Office +#: plugins/core/gs-desktop-common.c:311 +msgid "Productivity" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: plugins/core/gs-desktop-common.c:317 +msgid "Communication & News" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:320 +msgid "Reference" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:323 +msgid "Utilities" +msgstr "" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:55 +msgid "OS Updates" +msgstr "" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:60 +msgid "Includes performance, stability and security improvements." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:41 +msgid "Downloading featured images…" +msgstr "" + +#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/ +#: plugins/eos-updater/gs-plugin-eos-updater.c:561 +msgid "Endless OS" +msgstr "" + +#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/ +#: plugins/eos-updater/gs-plugin-eos-updater.c:564 +msgid "An Endless OS update with new features and fixes." +msgstr "" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:825 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:139 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: plugins/external-appstream/gs-install-appstream.c:141 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:148 +msgid "You need to specify exactly one filename" +msgstr "" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:155 +msgid "This program can only be used by the root user" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:163 +msgid "Failed to validate content type" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:173 +msgid "Failed to copy" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/external-appstream/gs-plugin-external-appstream.c:235 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:192 +msgid "Downloading upgrade information…" +msgstr "" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:282 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:863 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:135 +#, c-format +msgid "%s Device" +msgstr "" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:140 +#, c-format +msgid "%s System" +msgstr "" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:145 +#, c-format +msgid "%s Embedded Controller" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:150 +#, c-format +msgid "%s ME" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:155 +#, c-format +msgid "%s Corporate ME" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:160 +#, c-format +msgid "%s Consumer ME" +msgstr "" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:166 +#, c-format +msgid "%s Controller" +msgstr "" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:172 +#, c-format +msgid "%s Thunderbolt Controller" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:671 +msgid "Downloading firmware update signature…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:712 +msgid "Downloading firmware update metadata…" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:196 +msgid "Downloading application ratings…" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:239 +msgid "Snap Store" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..ddef671 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,6761 @@ +# Czech translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Petr Kovar , 2015. +# Marek Černocký , 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022. +# Vojtěch Perník , 2021-2023. +# Daniel Rusek , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-05-10 17:57+0000\n" +"PO-Revision-Date: 2025-05-19 21:26+0200\n" +"Last-Translator: Daniel Rusek \n" +"Language-Team: Czech \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.6\n" +"X-Project-Style: gnome\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instalujte a aktualizujte aplikace" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Aplikace Software umožňuje vyhledávat a instalovat aplikace a systémová " +"rozšíření a odebírat stávající nainstalované aplikace." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Aplikace Software vám představí významné a oblíbené aplikace pomocí " +"srozumitelného popisu a několika snímků obrazovky. Aplikace můžete najít buď " +"ručním procházením podle kategorií nebo pomocí textového vyhledávání. Rovněž " +"můžete aktualizovat svůj systém a to i bez aktuálního připojení k Internetu." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panel s přehledem" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panel s podrobnostmi o softwaru" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panel s nainstalovaným softwarem" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel s aktualizacemi" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Podrobnosti o aktualizaci" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2789 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Projekt GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Otestovat klíč akmods v Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Pro otestování klíče akmods v Shim UEFI je vyžadováno ověření" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Zaregistrovat klíč akmods do Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Pro registraci klíče akmods do Shim UEFI je vyžadováno ověření" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Otestovat klíč DKMS v Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Pro otestování klíče DKMS v Shim UEFI je vyžadováno ověření" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Zaregistrovat klíč DKMS do Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Pro registraci klíče DKMS do Shim UEFI je vyžadováno ověření" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalovat soubor appstream do systémového umístění" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instalování souboru appstream do systémového umístění" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Seznam kompatibilních projektů" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Seznam kompatibilních projektů, jako je GNOME, KDE a XFCE, které by se měly " +"zobrazovat." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Zda se o aktualizace a povýšení starat v Softwaru GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Když je vypnuto, Software GNOME skryje panel s aktualizacemi a nebude " +"provádět automatické činnosti ohledně aktualizací, nebo se ptát na povýšení." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automaticky stahovat a instalovat aktualizace" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Když je zapnuto, bude Software GNOME na pozadí automaticky stahovat " +"softwarové aktualizace a ty, které nevyžadují restart, také nainstaluje." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Oznamovat uživateli softwarové aktualizace na pozadí" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Když je zapnuto, oznamuje Software GNOME uživateli, když během jeho " +"nečinnosti proběhnou na pozadí aktualizace." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Zda se má automaticky aktualizovat informace na měřeném připojení" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Když je zapnuto, bude Software GNOME na pozadí automaticky aktualizovat " +"informace, i v případě, že připojení není účtované paušální částkou " +"(případně stahovat některá metadata, kontrolovat aktualizace atd., což se " +"může projevit v ceně za připojení)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Zda se jedná o úplně první spuštění Softwaru GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Zobrazovat vedle aplikace hodnocení hvězdičkami" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtrovat aplikace podle výchozí větve nastavené pro vzdálený protějšek" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Před instalací nesvobodných aplikací zobrazit varovné dialogové okno" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Když se instaluje nesvobodná aplikace, může být zobrazeno varovné dialogové " +"okno. Tímto se řídí potlačení tohoto dialogového okna." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Datum a čas poslední kontroly aktualizací" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Datum a čas posledního upozornění na povýšení" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Datum a čas posledního upozornění na aktualizace" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Datum a čas první bezpečnostní aktualizace, smaže se po aktualizaci" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Datum a čas poslední aktualizace" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Doba v sekundách, po které se má ověřit, jestli je snímek obrazovky z " +"hlavního zdroje stále platný" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Čím větší hodnotu zvolíte, tím méně návštěv vzdáleného serveru se provede, " +"ale může trvat déle, než se uživateli zobrazí aktuálnější snímek. Hodnota 0 " +"znamená, že se kontroly na serveru nemají provádět vůbec, pokud je již " +"snímek v mezipaměti." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Server, který se má používat pro recenze aplikací" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Minimální karma pro recenze" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Recenze s karmou nižší než toto číslo nebudou zobrazovány." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Seznam oficiálních repozitářů, které by neměly být považovány za třetí stranu" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Seznam vyžadovaných repozitářů, které nemohou být zakázány nebo odebrány" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Seznam oficiálních repozitářů, které by měly být považovány za svobodný " +"software" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Adresa URL licence, která se má použít, když má aplikace považována za " +"svobodný software" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Kde je to možné, instalovat všem uživatelům v systému přibalené aplikace" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Umožnit přístup k dialogovému oknu s repozitáři softwaru" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Nabízet povýšení na předběžná vydání" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Zobrazovat v rozhraní prvky, které informují uživatele, že aplikace není " +"svobodná" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Zobrazovat velikost instalace pro aplikace v seznamu nainstalovaných aplikací" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://cs.wikipedia.org/wiki/Propriet%C3%A1rn%C3%AD_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Adresa URI, která vysvětluje nesvobodný a komerční software" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Seznam adres URL ukazujících na soubory appstream, které byly stažené do " +"složky swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instalovat soubory AppStream do celosystémového umístění pro všechny " +"uživatele. Pokud je vypnuto, budou soubory instalovány do nestandardní " +"složky $XDG_DATA_HOME/swcatalog/xmls" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Prioritní pořadí formátů balíčků, kterým dáváte přednost, přičemž " +"důležitější formáty jsou uvedeny na prvním místě. Prázdné pole znamená " +"výchozí pořadí. Předpokládá se, že vynechané formáty budou uvedeny jako " +"poslední. Příklady balíčkovacích formátů: deb, flatpak, rpm, snap. Formáty " +"mohou být nepovinně specifikovány s názvem původu odděleného dvojtečkou, " +"například „flatpak:flathub“." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Datum a čas posledního pokusu odebrat nepoužívaná běhová prostředí Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Nastavte na „true“, chcete-li zobrazit pouze aplikace s otevřenou licencí a " +"skrýt všechny nesvobodné aplikace." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Nastavte na „true“, chcete-li zobrazit pouze aplikace od vývojářů, jejichž " +"identita byla ověřena." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Datum a čas posledních přijatých historických aktualizací." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Řetězec uchovávající ID gnome-online-account pro přihlášení" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Software GNOME – instalátor AppStream do celého systému" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Selhalo zpracování argumentů příkazové řádky" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Musíte zadat právě jeden název souboru" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Tento program může používat jen superuživatel" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Selhalo ověření typu obsahu: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Selhal přesun: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalace softwaru" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Nainstalujte si vybraný software do systému" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Kreslené násilí" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Bez informací o kresleném násilí" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Násilí ve fantasy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Bez informací o násilí ve fantasy" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistické násilí" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Bez informací o realistickém násilí" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Násilí zobrazující krvácení" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Bez informací o krvácení" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Sexuální násilí" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Bez informací o sexuálním násilí" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Bez informací o odkazech na alkohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Bez informací o odkazech na nezákonné drogy" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabák" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Bez informací o odkazech na tabákové produkty" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nahota" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Bez informací o nahotě jakéhokoliv typu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Sexuální tématika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Bez informací o odkazech na nebo vyobrazení sexuální tématiky" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Vulgarismy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Bez informací o vulgaritách jakéhokoliv typu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Nepřiměřený humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Bez informací o nepřiměřeném humoru" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminace" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Bez informací o diskriminačních projevech jakéhokoliv typu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklamy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Bez informací o reklamách jakéhokoliv typu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Hazard" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Bez informací o hazardu jakéhokoliv typu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Nakupování" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Bez informací o možnosti utrácet peníze" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Konverzace mezi uživateli" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Bez informací o způsobech konverzace mezi uživateli" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Hlasová konverzace mezi uživateli" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Bez informací o způsobech hlasové komunikace mezi uživateli" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontaktní údaje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Bez informací o sdílení uživatelských jmen ze sociálních sítí nebo e-" +"mailových adres" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identifikační údaje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Bez informací o sdílení údajů o uživatelích se třetími stranami" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Sdílení polohy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Bez informací o sdílení fyzické polohy s ostatními uživateli" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualita" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Bez informací o odkazech na homosexualitu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostituce" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Bez informací o odkazech na prostituci" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Cizoložství" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Bez informací o odkazech na cizoložství" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Sexualizované postavy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Bez informací o sexualizovaných postavách" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Znesvěcení" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Bez informací o odkazech na znesvěcení" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Lidské ostatky" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Bez informací o viditelných ostatcích mrtvých lidí" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Otroctví" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Bez informací o odkazech na otroctví" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Neobsahuje odkazy na drogy" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Neobsahuje nadávky, vulgarity ani jiné hrubé výrazy" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Neobsahuje reklamy ani peněžní operace" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Neobsahuje sex a nahotu" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Neobsahuje funkci neusměrňované konverzace" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Neobsahuje násilí" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogy" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Hrubé výrazy" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Peníze" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sociální sítě" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Násilí" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Vše" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "Aplikace %s má neznámé věkové hodnocení" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "Aplikace %s je vhodná pro každého" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "Aplikace %s je vhodná pro batolata" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "Aplikace %s je vhodná pro malé děti" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "Aplikace %s je vhodná pro děti" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "Aplikace %s je vhodná pro dospívající mládež" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "Aplikace %s je vhodná pro dospělé" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "Aplikace %s je vhodná pro %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Vhodné od věku" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Jak přidat chybějící informace" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Místní soubor" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Balíček" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Čeká na zpracování" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Čeká na instalaci" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Čeká na odebrání" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Instaluje se" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Odebírá se" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Stahuje se" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instalovat" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Odinstalovat…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Síť" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Může komunikovat přes síť" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Služby systému" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Může přistupovat k službám D-Bus na systémové sběrnici" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Služby sezení" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Může přistupovat k službám D-Bus na sběrnici sezení" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Zařízení" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Může přistupovat k libovolným zařízením, například webovým kamerám" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Může přistupovat ke vstupním zařízením" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Může přistupovat k mikrofonům a přehrávat zvuk" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Může přistupovat k souborům na systémovém zařízení" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Obsah obrazovky" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Může přistupovat k obsahu obrazovky" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Domovská složka" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Může zobrazovat, upravovat a vytvářet soubory" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Může zobrazovat soubory" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Souborový systém" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Složka se staženými soubory" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Nastavení" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Může zobrazovat a měnit libovolná nastavení" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Zastaralý zobrazovací systém" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Používá starý, ne zcela bezpečný, zobrazovací systém" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Opuštění izolovaného prostředí" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Může opustit izolované prostředí a obejít další omezení" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Není k dispozici žádný popis aktualizace." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Podrobnosti o aktualizaci" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Vyžaduje dodatečná oprávnění" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Přijata neplatná data hodnocení ze serveru" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Nelze komunikovat se serverem hodnocení" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Recenze" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Pro tuto aplikaci nebyly nalezeny žádné recenze." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Bez recenzí" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Historie verzí" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novinky ve verzi %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Verze %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "K tomuto vydání nejsou k dispozici žádné podrobnosti." + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e. %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Režim spuštění: buď „updates“ (aktualizace), „updated“ (aktualizované), " +"„installed“ (nainstalované) nebo „overview“ (přehled)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "REŽIM" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Hledat aplikaci" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "HLEDAT" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Zobrazit informace o aplikaci (pomocí ID aplikace)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Zobrazit informace o aplikaci (pomocí názvu balíčku)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NÁZEV_BALÍČKU" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Nainstalovat aplikaci (pomocí ID aplikace)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Odinstalovat aplikaci (pomocí ID aplikace)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Otevřít místní soubor s balíčkem" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NÁZEV_SOUBORU" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Pro tuto činnost je očekáván druh interakce: buď „none“ (nic), „notify“ " +"(upozornit) nebo „full“ (úplná)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKCE" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Zobrazit místní soubor metainfo nebo appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Povolit podrobný ladicí výstup (z běžící instance, pokud je již spuštěna)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Nainstalovat na pozadí případné čekající aktualizace" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Zobrazit předvolby" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Ukončit běžící instanci" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Upřednostnit zdroje v místních souborech před zdroji on-line" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Zobrazit číslo verze" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016 – 2023 přispěvatelé Softwaru GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Marek Černocký \n" +"Vojtěch Perník \n" +"Daniel Rusek " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Omlouváme se, ale pro tuto aplikaci nejsou k dispozici detaily." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Instalace na disku" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Obsahuje %s dat a %s mezipaměti" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Obsahuje %s dat" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Obsahuje %s mezipaměti" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Využití mezipaměti a dat není známo" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Stahovaná velikost" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Nepotřebuje žádné další systémové soubory ke stažení" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Potřebuje neznámou velikost dalších systémových souborů ke stažení" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Potřebuje %s dalších systémových souborů ke stažení" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Velikost je neznámá" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Žádná oprávnění" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Má přístup k síti" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Využívá služby systému" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Využívá služby sezení" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Může přistupovat k hardwarovým zařízením" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Může přistupovat k systémovým zařízením" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Může číst/zapisovat všechna vaše data" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Může číst všechna vaše data" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Může zapisovat do všech vašich dat" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Může číst vaše stažené soubory" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Může přistupovat k některým konkrétním souborům" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Může zobrazovat a měnit uživatelská nastavení" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Používá starý zobrazovací systém" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Může získat libovolná oprávnění" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Vývojář softwaru je ověřený" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Zkontrolováno distributorem OS" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Zkontrolováno %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Poskytováno třetí stranou" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Software není nadále podporován" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Otevřený kód" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Neznámá licence" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Uzavřený kód" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Zvláštní licence" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Zvýhodněné" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Bezpečné" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Pravděpodobně bezpečné" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potenciálně nebezpečné" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Nebezpečné" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Jen pro mobilní zařízení" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Funguje pouze na malé obrazovce" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Pouze pro PC" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Funguje pouze na velké obrazovce" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Nesoulad velikosti obrazovky" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Nepodporuje vaši současnou velikost obrazovky" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Vyžaduje dotykovou obrazovku" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Vyžaduje klávesnici" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Vyžaduje myš" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Vyžaduje herní ovladač" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Ke hraní vyžaduje herní ovladač" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptivní" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Funguje na telefonech, tabletech a PC" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Pravděpodobně vyžaduje klávesnici nebo myš" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Funguje na PC a laptopech" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Neobsahuje žádný věkově nevhodný obsah" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Informace o věkové kategorii nejsou k dispozici" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Navštívit webové stránky" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instalovat…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Zrušit" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instalovat" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Stáhnout" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Aktualizovat" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Odinstalovat…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Odinstalovává se" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritická aktualizace" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Zařízení nelze během aktualizace používat." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Zdroj: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Přejmenováno z %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Příjem aktualizací zastaven" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritická aktualizace" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Nainstalováno" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Pomozte přeložit %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"Aplikace %s je navržena, vyvinuta a přeložena mezinárodní komunitou " +"přispěvatelů.\n" +"\n" +"To znamená, že i když ještě není k dispozici ve vašem jazyce, můžete se " +"zapojit a pomoci s jejím překladem." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Překlady" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Stránka překladu" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Vyžadováno přihlášení vzdáleným %s (sféra %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Vyžadováno přihlášení" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Zrušit" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "Přih_lásit" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Uživatel" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Heslo" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Ostatní" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Vše" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Významné" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Výběr od distribuce" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nové a aktualizované" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Výběr z webových" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Ostatní" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s nainstalováno" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Aby se změny projevily, je zapotřebí provést restart" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Aplikace je připravená k použití" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Aktualizace systému byly nainstalovány" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Nedávno nainstalované aktualizace jsou k dispozici pro recenze" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Restartovat" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Spustit" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Nainstalovat software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Instalovat software třetí strany?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Povolit repozitář softwaru?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Povolit repozitář softwaru třetí strany?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s není svobodný a otevřený software a poskytuje jej „%s“." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s poskytuje „%s“." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Aby bylo možné pokračovat v instalaci, je nutné povolit tento repozitář " +"softwaru." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"V některých zemích nemusí být instalace a používání softwaru %s legální." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"V některých zemích nemusí být instalace a používání tohoto kodeku legální." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Příště _nevarovat" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Povolit a na_instalovat" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Dále jsou uvedeny podrobnosti o chybě získané od správy balíčků:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Podrobnosti" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Zavřít" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Podrobnosti zkopírovány do schránky" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Přijmout" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Aktualizace byla nainstalována" +msgstr[1] "Aktualizace byly nainstalovány" +msgstr[2] "Aktualizací bylo nainstalováno" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Aplikace byla odinstalována" +msgstr[1] "Aplikace byly odinstalovány" +msgstr[2] "Aplikací bylo odinstalováno" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Aby se projevila, je zapotřebí provést restart" +msgstr[1] "Aby se projevily, je zapotřebí provést restart" +msgstr[2] "Aby se projevily, je zapotřebí provést restart" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Nyní ne" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "dnes" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "včera" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "před %d dnem" +msgstr[1] "před %d dny" +msgstr[2] "před %d dny" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "před %d týdnem" +msgstr[1] "před %d týdny" +msgstr[2] "před %d týdny" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "před %d měsícem" +msgstr[1] "před %d měsíci" +msgstr[2] "před %d měsíci" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "před %d rokem" +msgstr[1] "před %d roky" +msgstr[2] "před %d lety" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "právě teď" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "před %d minutou" +msgstr[1] "před %d minutami" +msgstr[2] "před %d minutami" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "před %d hodinou" +msgstr[1] "před %d hodinami" +msgstr[2] "před %d hodinami" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Vše" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Významné" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Grafika 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografie" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skenování" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorová grafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Prohlížeče" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Vytváření a úprava zvuku" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Hudební přehrávače" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Vše" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Významné" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendáře" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Databáze" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finance" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Textové procesory" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Textové editory" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Webové prohlížeče" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Vše" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Významné" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Akční" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Adventury" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkádové" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokové" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Deskové" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Karetní" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulátory" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Dětské" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logické" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Na hrdiny" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sporty" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategické" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Vše" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Významné" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Pokec" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Vše" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Významné" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Umělá inteligence" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomie" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chemie" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Jazyky" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Diskuzní skupiny" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Umění" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Životopisy" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komiksy" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Beletrie" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Zdraví" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historie" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Životní styl" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sporty" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Vše" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Významné" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Ladicí programy" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Integrovaná vývojová prostředí" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeky" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Ovladače hardwaru" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Fonty" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Vstupní zdroje" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Jazykové balíčky" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalizace" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Vytváření" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Práce" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Hraní" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializace" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Učení" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Vývoj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodeky" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Ovladače hardwaru" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Fonty" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Vstupní zdroje" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Jazykové balíčky" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalizace" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Nějaká aplikace" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s požaduje dodatečnou podporu formátů souborů." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Požadavek na dodatečné typy MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s požaduje dodatečná písma." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Požadavek na dodatečná písma" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s požaduje dodatečné multimediální kodeky." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Požadavek na dodatečné multimediální kodeky" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s požaduje dodatečné tiskové ovladače." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Požadavek na dodatečné tiskové ovladače" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s požaduje dodatečné balíčky." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Požadavek na dodatečné balíčky" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Najít v aplikaci Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "Zobrazit _více" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Zobrazit _méně" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Odebírá se…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Vyžaduje restart k dokončení instalace" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Vyžaduje restart k dokončení odebírání" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Probíhá instalace…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Probíhá aktualizace…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Stahuje se…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Připravuje se…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Odinstalovává se…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "Aplikace %s není nainstalována, ale má stále k dispozici data." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Restartovat" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Povolit…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instalovat…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "Aplikace %s se zobrazí v americké angličtině" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Tato aplikace se zobrazí v americké angličtině" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Tento software se zobrazí v americké angličtině" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "_Pomoci přeložit" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Co dalšího nabízí %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Vývojář %s prokázal vlastnictví %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Vývojář prokázal vlastnictví %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Abyste mohli napsat recenzi, musíte být připojeni k Internetu" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Tato aplikace již nedostává aktualizace, včetně bezpečnostních oprav" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Tuto aplikaci již poskytuje vaše distribuce a neměli byste ji nahrazovat." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Tato aplikace neposkytuje žádné odkazy na webové stránky, repozitáře kódu " +"ani nástroj pro sledování problémů." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Tento software již nedostává aktualizace, včetně bezpečnostních oprav" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Tento software již poskytuje vaše distribuce a neměli byste jej nahrazovat." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Tento software neposkytuje žádné odkazy na webové stránky, repozitáře kódu " +"ani nástroj pro sledování problémů." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Aplikaci Software se nepodařilo načíst informace pro „%s“ a nedokáže " +"zobrazit podrobnosti o této aplikaci." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Přijata neplatná odpověď na recenzi ze serveru" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Selhalo odeslání recenze pro „%s“: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Stránka s podrobnostmi" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Načítají se podrobnosti o aplikaci" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Ověřeno" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Otevřít" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Aktualizovat" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Odinstalovat" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Doplňky" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Tuto aplikaci je možné používat, jen když je funkční připojení k Internetu." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Součástí je repozitář softwaru" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Součástí této aplikace je repozitář softwaru, který poskytuje aktualizace a " +"přístup k dalšímu softwaru." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Součástí není žádný repozitář softwaru" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Součástí této aplikace není žádný repozitář softwaru. Nebude tak průběžně " +"aktualizována na novější verze." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Rozpoznán repozitář softwaru" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Přidáním tohoto repozitáře softwaru získáte přístup k dalšímu softwaru a " +"aktualizacím." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Používejte pouze repozitáře softwaru, kterým věříte." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Vymazat data aplikace" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "S_mazat data" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Žádná metadata" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Webové stránky projektu" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "Věnovat _dar" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Přispět k překladu" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Nahlásit chybu" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Nápověda" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontaktovat" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Nap_sat recenzi" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Všechny recenze" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Nelze zobrazit podrobnosti o aplikaci" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Selhala příprava restartu" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Neznámá chyba" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Klíč nebyl nalezen" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Klíč není zaregistrován" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Vyžadována registrace MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Další" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Toto zařízení má povolen Secure Boot. Aby bylo možné povolit nové ovladače, " +"musí být zaregistrován nový klíč vlastníka stroje (MOK). Tento proces " +"vyžaduje zadání hesla později v procesu. Poznamenejte si prosím následující " +"heslo spojené s klíčem:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Mám _poznamenáno heslo MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Restartovat a zaregistrovat…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Pokyny k nastavení: Přečtěte si prosím pozorně" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Po restartu se zobrazí obrazovka nastavení zařízení. Pro povolení nových " +"ovladačů postupujte podle kroků nastavení:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Vyberte „Zaregistrovat MOK“\n" +"• Vyberte „Ano“ pro registraci klíčů\n" +"• Po zobrazení výzvy zadejte heslo MOK\n" +"• Poté vyberte „Restartovat“" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Vliv na bezpečnost" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Po úspěšné registraci klíče si uvědomte, že jakékoli budoucí aktualizace " +"tohoto nebo jakéhokoli jiného modulu budou implicitně důvěryhodné. Všechny " +"budoucí aktualizace budou probíhat transparentně bez jakékoli interakce a " +"nebo autorizace." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Další pokyny naleznete na stránce dokumentů." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Stahují se dodatečné soubory s metadaty…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " a " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Dostupné fonty pro písmo %s" +msgstr[1] "Dostupné fonty pro písma %s" +msgstr[2] "Dostupné fonty pro písma %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Dostupný software pro kodek %s" +msgstr[1] "Dostupný software pro kodeky %s" +msgstr[2] "Dostupný software pro kodeky %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Požadovaný software nebyl nalezen" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Selhalo vyhledání požadovaného softwaru" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s nebyl nalezen" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "na webových stránkách" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Nejsou k dispozici žádné aplikace, které by poskytovaly soubor %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informace o formátu %s, včetně toho, jak získat chybějící aplikace, najdete " +"%s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Pro podporu %s nejsou k dispozici žádné aplikace." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s není k dispozici." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informace o formátu %s, včetně toho, jak získat aplikaci, který tento tento " +"formát podporuje, najdete %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Pro podporu písma %s nejsou k dispozici žádné fonty." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informace o písmu %s, včetně toho, jak získat dodatečná písma, najdete %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Pro formát %s nejsou k dispozici žádné dodatečné kodeky." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informace o kodeku %s, včetně toho, jak získat kodek, který umí tento formát " +"přehrát, najdete %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Pro podporu %s nejsou k dispozici žádné prostředky Plasma." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informace o kodeku %s, včetně toho, jak získat dodatečné prostředky Plasma, " +"najdete %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Pro %s nejsou k dispozici žádné tiskové ovladače." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informace o tiskárně %s, včetně toho, jak získat ovladač, který podporuje " +"tuto tiskárnu, najdete %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentace" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Nelze najít kodek %s požadovaný aplikací %s. Na další informace se prosím " +"podívejte do %s." +msgstr[1] "" +"Nelze najít kodeky %s požadované aplikací %s. Na další informace se prosím " +"podívejte do %s." +msgstr[2] "" +"Nelze najít kodeky %s požadované aplikací %s. Na další informace se prosím " +"podívejte do %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Nelze najít kodek %s, který hledáte. Na další informace se prosím podívejte " +"do %s." +msgstr[1] "" +"Nelze najít kodeky %s, které hledáte. Na další informace se prosím podívejte " +"do %s." +msgstr[2] "" +"Nelze najít kodeky %s, které hledáte. Na další informace se prosím podívejte " +"do %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Selhalo získání jakýchkoliv výsledků hledání: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "formát souboru %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Inst_alovat vše" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Nelze najít požadovaný software" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Stránka kodeků" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Nenalezeny žádné výsledky" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Nelze provést hledání" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Předchozí" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Další" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Seznam významných aplikací" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Podpora pro PC" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Podporuje použití na velké obrazovce" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Neznámá podpora pro PC" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Není dostatek informací, abychom věděli, zda jsou podporovány velké obrazovky" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Vyžaduje velkou obrazovku" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Nepodporuje stolní počítače" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Nelze použít na velké obrazovce" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Podpora pro mobilní zařízení" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Podporuje použití na malé obrazovce" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Neznámá podpora pro mobilní zařízení" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Není dostatek informací, abychom věděli, zda jsou podporovány malé obrazovky" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Vyžaduje malou obrazovku" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Nepodporuje mobily" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Nelze použít na malé obrazovce" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Podpora klávesnice" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Neznámá podpora klávesnice" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" +"Není dostatek informací, abychom věděli, zda jsou podporovány klávesnice" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Vyžaduje klávesnici" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Podporuje klávesnice" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Nepodporuje klávesnici" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Nelze použít s klávesnicí" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Podpora myši" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Vyžaduje myš nebo ukazovátko" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Neznámá podpora myši" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Není dostatek informací, abychom věděli, zda jsou podporovány myši nebo " +"ukazovátka" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Vyžaduje myš" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Podporuje myši a ukazovátka" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Nepodporuje myš" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Nelze použít s myší nebo ukazovátkem" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Podpora dotykové obrazovky" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Neznámá podpora dotykové obrazovky" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Není dostatek informací, abychom věděli, zda jsou podporovány dotykové " +"obrazovky" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Vyžaduje dotykovou obrazovku" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Podporuje dotykové obrazovky" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Nepodporuje dotykovou obrazovku" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Nelze použít s dotykovou obrazovkou" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Vyžadován herní ovladač" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Vyžaduje herní ovladač" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Podpora herního ovladače" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Podporuje herní ovladače" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "Aplikace %s na tomto zařízení pravděpodobně funguje" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "Aplikace %s na tomto zařízení funguje" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "Aplikace %s na tomto zařízení možná funguje" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "Aplikace %s na tomto zařízení nebude fungovat správně" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "Aplikace %s na tomto zařízení nebude fungovat" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Podpora hardwaru" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigace" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Přejít na stránku procházení" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Přejít na stránku s nainstalovanými" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Přejít na stránku s aktualizacemi" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Otevřít panel vyhledávání" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Okna" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Otevřít předvolby" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Otevřít softwarové repozitáře" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Nápověda" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Otevřít klávesové zkratky" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Nainstalováno" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Stránka s nainstalovanými" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "S probíhající změnou" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplikace" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Webové aplikace" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Systémové aplikace" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Vybudováno komunitou" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Zapojit se" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tato aplikace je vyvíjena otevřeně mezinárodní komunitou a je uvolněna pod " +"licencí %s.\n" +"\n" +"Můžete se zúčastnit a pomoci ji ještě vylepšit." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tato aplikace je vyvíjena otevřeně mezinárodní komunitou a je uvolněna pod " +"licencí %s.\n" +"\n" +"Můžete se zúčastnit a pomoci ji ještě vylepšit." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tento software je vyvíjen otevřeně mezinárodní komunitou a je uvolněn pod licencí %s.\n" +"\n" +"Můžete se zúčastnit a pomoci jej ještě vylepšit." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tento software je vyvíjen otevřeně mezinárodní komunitou a je uvolněn pod " +"licencí %s.\n" +"\n" +"Můžete se zúčastnit a pomoci jej ještě vylepšit." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Neznámá licence" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "Zjistit _více" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Tato aplikace nespecifikuje, pod jakou licencí je vyvíjena a může být " +"nesvobodná. Může být nezabezpečená způsobem, který je těžké odhalit, a může " +"se měnit, aniž byste o tom věděli.\n" +"\n" +"Nejspíše nebudete moci do této aplikace přispívat." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tento software nespecifikuje, pod jakou licencí je vyvíjen a může být " +"nesvobodný. Může být nezabezpečený způsobem, který je těžké odhalit, a může " +"se měnit, aniž byste o tom věděli.\n" +"\n" +"Nejspíše nebudete moci do tohoto softwaru přispívat." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Uzavřený software" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Tato aplikace není vyvíjena otevřeně, takže o jejím fungování vědí pouze " +"její vývojáři. Může být nezabezpečená způsobem, který je těžké odhalit, a " +"může se měnit, aniž byste o tom věděli.\n" +"\n" +"Nejspíše nebudete moci do této aplikace přispívat." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Tento software není vyvíjen otevřeně, takže o jeho fungování vědí pouze jeho " +"vývojáři. Může být nezabezpečený způsobem, který je těžké odhalit, a může se " +"měnit, aniž byste o tom věděli.\n" +"\n" +"Nejspíše nebudete moci do tohoto softwaru přispívat." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Zvláštní licence" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Tato aplikace je vyvíjena pod zvláštní licencí %s.\n" +"\n" +"Můžete nebo nemusíte být schopni do této aplikace přispívat." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Tato aplikace je vyvíjena pod zvláštní licencí „%s“.\n" +"\n" +"Můžete nebo nemusíte být schopni do této aplikace přispívat." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tento software je vyvíjen pod zvláštní licencí %s.\n" +"\n" +"Můžete nebo nemusíte být schopni do tohoto softwaru přispívat." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tento software je vyvíjen pod zvláštní licencí „%s“.\n" +"\n" +"Můžete nebo nemusíte být schopni do tohoto softwaru přispívat." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Aktualizují se data" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Načítá se stránka" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Spouští se" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Neznámý zdroj" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Uživatel" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Přidávání" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Odstraňování" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Aktualizace" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Ponižování" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "vybraných externích zdrojů" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Poskytuje přístup k dalšímu softwaru z %s. Součástí je i některý uzavřený " +"software.\n" +"\n" +"Tyto repozitáře můžete později povolit v předvolbách Softwarových repozitářů." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Povolit repozitáře softwaru třetích stran?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorovat" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Povolit" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Dostupné pro váš operační systém" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Dostupné pro %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Procházet" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Stránka s přehledem" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Dostupné aplikace" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Ostatní kategorie" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "O aplikaci nebyly nalezeny žádné informace" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "neznámá" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Budiž" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Uživatel odmítl instalaci" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Příprava aplikace %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Opravdu chcete odebrat repozitář %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Všechny aplikace pocházející z repozitáře %s budou odinstalovány. Abyste je " +"mohli znovu použít, budete muset repozitář znovu nainstalovat." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Odinstalovat %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Po odebrání nebude možné aplikaci %s používat." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "Po odebrání nebude možné používat žádné aplikace, které závisí na %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Po odebrání nebude možné font %s používat a všechny dokumenty, které jej " +"používají, se zobrazí v jiném písmu." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Po odebrání nebude možné kodek %s používat. To může znamenat, že některé " +"soubory médií již nebude možné přehrát." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "Hardware, který závisí na %s, již nemusí po odebrání správně fungovat." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Po odebrání nebude možné aplikaci %s používat. Data a nastavení aplikace " +"budou uložena na disku, aby bylo možné aplikaci v budoucnu obnovit." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Předvolby" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Aktualizace softwaru" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Další informace" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Kontrola a stahování aktualizací využívá data a energii. Funkce " +"automatických aktualizací jsou proto pozastaveny při připojení k měřené síti " +"a při zapnutém úsporném režimu." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatické" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Automaticky kontrolovat a stahovat aktualizace" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Ruční" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Kontrola a stahování aktualizací musí být provedeno ručně" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Oznamovat automatické aktualizace" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Upozornit, když jsou automaticky nainstalovány aktualizace" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtry obsahu" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Zobrazit pouze svobodný so_ftware" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Skrýt nesvobodný software při procházení a vyhledávání" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Zobrazit pouze o_věřené vývojáře" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Zobrazit pouze aplikace od vývojářů, jejichž identita byla ověřena" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Některý z právě instalovaného softwaru není kompatibilní s distribucí %s. " +"Pokud budete pokračovat, během povýšení se odstraní." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Nekompatibilní software" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Povýšit" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Odinstalovat" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Nastavení aplikace a data" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Zachovat" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Umožňuje obnovení nastavení a obsahu aplikace" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "S_mazat" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Trvale odstraní data, aby se ušetřilo místo na disku" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Software, který byl nainstalován z „%s“, přestane dostávat aktualizace." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Zakázat repozitář?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Odebrat repozitář?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Zakázat" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Odebrat" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Povolit nové repozitáře" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Zapnout nové repozitáře při jejich přidání" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "více informací" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Další repozitáře od vybraných třetích stran – %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Repozitáře třetích stran Fedory" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "operačního systému" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Tyto repozitáře doplňují výchozí nabídku softwaru poskytovaného distribucí " +"%s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Softwarové repozitáře" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Žádné repozitáře" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "Nainstalována %u aplikace" +msgstr[1] "Nainstalovány %u aplikace" +msgstr[2] "Nainstalováno %u aplikací" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "Nainstalován %u doplněk" +msgstr[1] "Nainstalovány %u doplňky" +msgstr[2] "Nainstalováno %u doplňků" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplikace" +msgstr[1] "%u aplikace" +msgstr[2] "%u aplikací" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u doplněk" +msgstr[1] "%u doplňky" +msgstr[2] "%u doplňků" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s a %s" +msgstr[1] "%s a %s" +msgstr[2] "%s a %s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Kontrola nainstalovaného softwaru…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Odebrat" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Nenávidím ji" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Nemám ji rád" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Běžná aplikace" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Mám ji rád" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Zbožňuji ji" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Chcete-li zanechat hodnocení, vyberte hvězdičku" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Věnujte prosím trochu času napsaní recenze" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Ohodnoťte prosím hvězdičkami" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Celkové hodnocení je příliš krátké" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Celkové hodnocení je příliš dlouhé" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Recenze je příliš krátká" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Recenze je příliš dlouhá" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Napsat recenzi" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Odeslat" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Uveďte prosím hodnocení, shrnutí a text recenze. Recenze by se neměly " +"používat k nahlašování problémů: místo toho se obraťte na vývojáře nebo " +"svého poskytovatele podpory." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Celkový dojem" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Napište krátkou recenzi" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Najděte si v našich zásadách " +"soukromí, jaká data jsou odesílána. Celé jméno přiřazené k vašemu účtu " +"bude veřejně zobrazené." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "celkem %u recenze" +msgstr[1] "celkem %u recenze" +msgstr[2] "celkem %u recenzí" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "z 5 hvězdiček" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "anonym" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Můžete nahlásit recenze, které jsou urážlivé, sprosté nebo diskriminační." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "Po nahlášení bude recenze skryta, dokud ji nezkontroluje správce." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Nahlásit recenzi?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Nahlásit" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Odebrat recenzi?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Odebrání recenze nelze vrátit zpět." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Recenze se mi líbí" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Recenze se mi nelíbí" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Nahlásit…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Odebrat…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Aplikace není v izolovaném prostředí, ale je prověřená v distribuci, že " +"neobsahuje škodlivý kód" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Zkontrolujte si, že důvěřujete dodavateli, protože aplikace není v " +"izolovaném prostředí" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Žádná oprávnění" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Aplikace je v plně izolovaném prostředí" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Přístup k síti" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Může přistupovat k internetu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Žádný přístup k síti" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Nemůže přistupovat k internetu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Využívá služby systému" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Může si vyžádat data ze služeb systému" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Využívá služby sezení" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Může si vyžádat data ze služeb sezení" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Přístup k uživatelským zařízením" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Může přistupovat k zařízením jako jsou webkamery nebo herní ovladače" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Žádný přístup k uživatelským zařízením" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Nemůže přistupovat k zařízením jako jsou webkamery nebo herní ovladače" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Přístup ke vstupním zařízením" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Přístup k mikrofonu a přehrávání zvuku" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Může poslouchat pomocí mikrofonů a přehrávat zvuk bez žádosti o povolení" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Přístup k systémovým zařízením" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Může přistupovat k systémovým zařízením, která vyžadují zvýšená oprávnění" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Přístup k obsahu obrazovky" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Může přistupovat k obsahu obrazovky nebo jiných oken" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Zastaralý zobrazovací systém" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Libovolná oprávnění" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Uživatelská nastavení" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Plný přístup k souborovému systému pro čtení/zápis" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Může číst a zapisovat všechna data v souborovém systému" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Přístup k domovské složce pro čtení/zápis" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Může číst a zapisovat všechna data ve vaší domovské složce" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Plný přístup k souborovému systému pro čtení" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Může číst všechna data v souborovém systému" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Přístup k domovské složce pro čtení" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Může číst všechna data ve vaší domovské složce" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Přístup ke složce se staženými soubory pro čtení/zápis" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Může číst a zapisovat všechna data ve vaší složce se staženými soubory" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Přístup ke složce se staženými soubory pro čtení" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Může číst všechna data ve vaší složce se staženými soubory" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Může číst a zapisovat všechna data ve složce" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Může číst všechna data ve složce" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Žádný přístup k souborovému systému" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Vůbec nemůže přistupovat k souborovému systému" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Vývojář aplikace je ověřený" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Bylo ověřeno, že vývojář této aplikace je tím, za koho se vydává" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Bezpečnostní rizika v závislostech" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Software nebo jeho závislosti nejsou nadále podporovány a mohou obsahovat " +"bezpečnostní rizika" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Tato aplikace nespecifikuje, pod jakou licencí je vyvíjena a může být " +"nesvobodná" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Tento software nespecifikuje, pod jakou licencí je vyvíjen a může být " +"nesvobodný" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Uzavřený kód" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Zdrojový kód není veřejný, takže jej nelze nezávisle zkontrolovat a může být " +"nebezpečný" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Tato aplikace je vyvíjena pod zvláštní licencí „%s“" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Tento software je vyvíjen pod zvláštní licencí „%s“" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Otevřený kód" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Zdrojový kód je veřejný a může být nezávisle kontrolován, což zvyšuje " +"pravděpodobnost, že je aplikace bezpečná" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "Aplikace %s je zvýhodněná" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "Aplikace %s je bezpečná" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "Aplikace %s je pravděpodobně bezpečná" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "Aplikace %s je potenciálně nebezpečná" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "Aplikace %s je nebezpečná" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "neznámá" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Bezpečnost" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licence" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Zdroj" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Tato aplikace používá zastaralou verzi softwarové platformy (SDK) a může " +"obsahovat chyby nebo slabá místa zabezpečení, která nebudou opravena." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Předchozí snímek obrazovky" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Následující snímek obrazovky" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Žádné snímky obrazovky" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Snímek nebyl nalezen" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Selhalo načtení obrázku" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Velikost snímku nebyla nalezena" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Nelze vytvoři mezipaměť" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Snímek není platný" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Snímek není k dispozici" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Snímek" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u další výsledek hledání" +msgstr[1] "%u další výsledky hledání" +msgstr[2] "%u dalších výsledků hledání" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Stránka hledání" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Hledat aplikace" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Žádná aplikace nebyla nalezena" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "„%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Nelze stáhnout aktualizace" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Nelze stáhnout aktualizace firmwaru" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nelze stáhnout aktualizace firmwaru z %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nelze stáhnout aktualizace z %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Nelze aktualizovat: je vyžadován přístup k internetu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Nelze aktualizovat: nedostatek místa na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Nelze stáhnout aktualizace z %s: není dostatek místa na disku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Nelze aktualizovat: je vyžadováno ověření" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Nelze aktualizovat: neplatné ověření" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Nelze aktualizovat: je vyžadováno oprávnění" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Nelze stáhnout aktualizace: nemáte oprávnění instalovat software" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Nelze získat seznam aktualizací" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Nelze nainstalovat: stažení selhalo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Nelze nainstalovat %s: selhalo stažení z %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Nelze nainstalovat %s: stažení selhalo" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Nelze nainstalovat: chybí běhové prostředí" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Nelze nainstalovat %s: není k dispozici běhové prostředí %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Nelze nainstalovat %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Nelze nainstalovat: je vyžadován přístup k internetu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Nelze nainstalovat: neplatný formát aplikace" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Nelze nainstalovat: není dostatek místa na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Nelze nainstalovat %s: není dostatek místa na disku" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Nelze nainstalovat: je vyžadováno ověření" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Nelze nainstalovat %s: je vyžadováno ověření" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Nelze nainstalovat: neplatné ověření" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Nelze nainstalovat %s: neplatné ověření" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Nelze nainstalovat: je vyžadováno oprávnění" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Nelze nainstalovat %s: je vyžadováno oprávnění" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Nelze nainstalovat: zařízení musí být napájeno ze sítě" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Nelze nainstalovat %s: zařízení musí být napájeno ze sítě" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Nelze nainstalovat: vybitá baterie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Nelze nainstalovat %s: vybitá baterie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Nelze aktualizovat %s z %s: selhalo stažení" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Nelze aktualizovat %s: selhalo stažení" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Nelze nainstalovat aktualizace z %s: selhalo stažení" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Nelze aktualizovat: selhalo stažení" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Nelze aktualizovat %s: není dostatek místa na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Nelze aktualizovat %s: je vyžadováno ověření" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Nelze aktualizovat %s: neplatné ověření" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Nelze aktualizovat %s: je vyžadováno oprávnění" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Nelze aktualizovat: zařízení musí být napájeno ze sítě" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Nelze aktualizovat %s: zařízení musí být napájeno ze sítě" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Nelze aktualizovat: vybitá baterie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Nelze aktualizovat %s: vybitá baterie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Nelze aktualizovat %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Nelze aktualizovat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Nelze povýšit" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Nelze povýšit na %s z %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Nelze povýšit: stažení selhalo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Nelze povýšit na %s: stažení selhalo" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Nelze povýšit: je vyžadován přístup k internetu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Nelze povýšit na %s: je vyžadován přístup k internetu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Nelze povýšit: není dostatek místa na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Nelze povýšit na %s: není dostatek místa na disku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Nelze povýšit: je vyžadováno ověření" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Nelze povýšit na %s: je vyžadováno ověření" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Nelze povýšit: neplatné ověření" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Nelze povýšit na %s: neplatné ověření" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Nelze povýšit: je vyžadováno oprávnění" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Nelze povýšit na %s: je vyžadováno oprávnění" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Nelze povýšit: zařízení musí být napájeno ze sítě" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Nelze povýšit na %s: zařízení musí být napájeno ze sítě" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Nelze povýšit: vybitá baterie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Nelze povýšit na %s: vybitá baterie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nelze povýšit na %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Nelze odinstalovat: je vyžadováno ověření" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Nelze odinstalovat %s: je vyžadováno ověření" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Nelze odinstalovat: neplatné ověření" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Nelze odinstalovat %s: neplatné ověření" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Nelze odinstalovat: je vyžadováno oprávnění" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Nelze odinstalovat %s: je vyžadováno oprávnění" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Nelze odinstalovat: zařízení musí být napájeno ze sítě" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Nelze odinstalovat %s: zařízení musí být napájeno ze sítě" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Nelze odinstalovat: vybitá baterie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Nelze odinstalovat %s: vybitá baterie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Nelze odinstalovat %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Nelze spustit %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Litujeme, ale něco se stalo špatně" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Nelze spustit %s: %s není nainstalováno" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Nedostatek místa na disku pro operaci" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Nelze nainstalovat: typ souboru není podporován" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Nelze nainstalovat: selhalo ověření" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Nelze nainstalovat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Nelze kontaktovat %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "" +"Restartujte aplikaci Software, abyste mohli používat nové zásuvné moduly" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Zařízení musí být napájeno ze sítě" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Úroveň nabití baterie je příliš nízká" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Softwarové repozitáře" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Předvolby" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Klávesové zkratky" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "O _aplikaci Software" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Hledat" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Hlavní nabídka" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "hledat aplikace" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Procházet" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "Na_instalováno" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Aktualizace" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Přejít zpět" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "nic" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Data aplikace" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Data potřebná ke spuštění aplikace" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Uživatelská data" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Vámi vytvořená data v aplikaci" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Data mezipaměti" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dočasná data v mezipaměti" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Aplikace samotná" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Vyžadované závislosti" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Sdílené systémové komponenty vyžadované touto aplikací" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "neznámá" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Data uložená v mezipaměti lze vymazat v nastavení _aplikace" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Úložiště" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (nainstalováno)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (instaluje se)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (stahuje se)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (odebírá se)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "Po_drobnosti" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Prozkoumat" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Nainstalováno %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Instalované aktualizace" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Nejsou nainstalovány žádné aktualizace" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Údaje o aktualizacích jsou zastaralé" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Zkontrolujte prosím dostupné aktualizace" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Kritické aktualizace jsou připravené k instalaci" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Nainstalujte kritické aktualizace co nejdříve" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Ke stažení jsou k dispozici kritické aktualizace" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Stáhněte kritické aktualizace co nejdříve" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Aktualizace jsou připravené k instalaci" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Aktualizace softwaru jsou připravené a čekají" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Ke stažení jsou k dispozici aktualizace" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Aktualizace softwaru lze stáhnout" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "Byla aktualizována %u aplikace – vyžaduje restart" +msgstr[1] "Byly aktualizovány %u aplikace – vyžaduje restart" +msgstr[2] "Bylo aktualizováno %u aplikací – vyžaduje restart" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "Byla aktualizována %u aplikace" +msgstr[1] "Byly aktualizovány %u aplikace" +msgstr[2] "Bylo aktualizováno %u aplikací" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "Aplikace %s byla aktualizována." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Restartujte ji prosím." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "Aplikace %s a %s byly aktualizovány." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplikace vyžaduje restart." +msgstr[1] "%u aplikace vyžadují restart." +msgstr[2] "%u aplikací vyžaduje restart." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Včetně %s, %s a %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Systém dosáhl konce své životnosti" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Povýšit, aby byly nadále přijímány aktualizace" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "K instalaci je dostupná nová verze distribuce %s" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Dostupné povýšení softwaru" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Aktualizace softwaru selhaly" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Připravené aktualizace nebyly nainstalovány" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Zobrazit podrobnosti" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Bylo dokončeno povýšení systému" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Vítejte ve vydání %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Aktualizace softwaru nainstalována" +msgstr[1] "Aktualizace softwaru nainstalovány" +msgstr[2] "Aktualizace softwaru nainstalovány" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Byla nainstalována důležitá aktualizace operačního systému." +msgstr[1] "Byly nainstalovány důležité aktualizace operačního systému." +msgstr[2] "Byly nainstalovány důležité aktualizace operačního systému." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Přehled" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Aktualizace selhala" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Systém již byl aktuální." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Aktualizace byla zrušena." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Je vyžadován přístup k Internetu, ale není dostupný. Zkontrolujte své " +"připojení k Internetu a zkuste to znovu." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"S aktualizací nastal bezpečnostní problém. Podrobnosti prosím proberte se " +"svým poskytovatelem softwaru." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Nebyl dostatek místa na disku. Uvolněte prosím nějaké místo a pak to zkuste " +"znovu." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Bohužel, instalace aktualizace selhala. Vyčkejte prosím na další aktualizaci " +"a pak to zkuste znovu. Pokud problém přetrvá, kontaktujte svého " +"poskytovatele softwaru." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Poslední kontrola: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Zastavit" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Zkontrolovat aktualizace" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "Distribuce %s %s přestala dostávat kritické aktualizace softwaru" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Váš operační systém přestal dostávat kritické aktualizace softwaru" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Možné zpoplatnění" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Kontrola aktualizací přes mobilní připojení může být zpoplatněna vaším " +"operátorem." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Přesto zkontrolovat" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Staženy povýšení softwaru" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Aktualizace jsou připravené k instalaci" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Zkontrolovat aktualizace" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Aktualizace" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Stránka s aktualizacemi" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Načítají se aktualizace" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Může to chvilku trvat" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Aktuální" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Použít mobilní data?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Kontrola aktualizací při používání mobilního širokopásmového připojení vám " +"může způsobit poplatky" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Přesto zkontrolovat" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Žádné připojení" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Kvůli kontrole aktualizací se musíte připojit k síti" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Nastavení sítě" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Chyba" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Aktualizace jsou spravovány automaticky" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Aktualizace softwaru pozastaveny" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automatické aktualizace softwaru byly pozastaveny z následujících důvodů:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Aktuální síťové připojení je měřené" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Aktuální síťové připojení zakazuje stahování velkých objemů" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Režim úspory energie je aktivní" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Herní režim je aktivní" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Aktualizace softwaru pozastaveny" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Síťové připojení je měřené – aktualizace softwaru pozastaveny" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Síťové připojení zakazuje stahování velkých objemů – aktualizace softwaru " +"pozastaveny" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Režim úspory energie je aktivní – aktualizace softwaru pozastaveny" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Herní režim je aktivní – aktualizace softwaru pozastaveny" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Restartovat a aktualizovat…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_Aktualizovat vše" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Staženy aktualizace softwaru" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Aktualizace jsou připravené k instalaci" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integrovaný firmware" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Vyžaduje restart" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Aktualizace aplikací" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Firmware zařízení" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "S_táhnout" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Je k dispozici %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Je k dispozici %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Přečíst si o nové verzi" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Staženo %s z %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Staženo %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Povýšení na novou verzi s novými funkcemi a vylepšeními." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Zrušit povýšení" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Restartovat a povýšit…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Nezapomeňte zazálohovat si před povýšením svá data a soubory." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Podrobnosti o chybě" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Zkopírovat podrobnosti" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Selhalo smazání souboru „%s“: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Selhalo smazání adresáře „%s“: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Přidat, odebrat nebo aktualizovat software v tomto počítači" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "aktualizace;povýšení;zdroje;repozitáře;předvolby;nastavení;instalace;odinstalace;odebrání;program;software;aplikace;obchod;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s připraveno" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s je připraveno k povolení během dalšího spuštění systému." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Povolit" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Aktualizace systému" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Obecné aktualizace systému, jako jsou bezpečnostní opravy, opravy chyb a " +"vylepšení výkonu." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Aktualizace %s s novými funkcemi a opravami." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Aktualizační služba EOS nemohla stáhnout a nasadit aktualizaci." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Webová aplikace" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Podpora pro webové aplikace" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Spouštějte populární webové aplikace v prohlížeči" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Proveďte povýšení, abyste získali nejnovější funkce a zlepšení výkonu a " +"stability." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Podpora pro Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak je systém pro provozování aplikací na Linuxu" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:361 +#, c-format +msgid "System folder %s" +msgstr "Systémová složka %s" + +#: plugins/flatpak/gs-flatpak.c:362 plugins/flatpak/gs-flatpak.c:363 +#, c-format +msgid "Home subfolder %s" +msgstr "Podsložka %s v domovské složce" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system folders" +msgstr "Složky hostitelského systému" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Host system configuration from /etc" +msgstr "Konfigurace hostitelského systému z /etc" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Desktop folder" +msgstr "Složka plochy" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Podsložka %s ve složce plochy" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Documents folder" +msgstr "Složka dokumentů" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Documents subfolder %s" +msgstr "Podsložka %s ve složce dokumentů" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Music folder" +msgstr "Složka hudby" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Music subfolder %s" +msgstr "Podsložka %s ve složce hudby" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Pictures folder" +msgstr "Složka obrázků" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Podsložka %s ve složce obrázků" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Public Share folder" +msgstr "Složka veřejně sdílených" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Podsložka %s ve složce veřejně sdílených" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Videos folder" +msgstr "Složka videí" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Videos subfolder %s" +msgstr "Podsložka %s ve složce videí" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "Templates folder" +msgstr "Složka šablon" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "Templates subfolder %s" +msgstr "Podsložka %s ve složce šablon" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User cache folder" +msgstr "Složka uživatelské mezipaměti" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User cache subfolder %s" +msgstr "Podsložka %s ve složce uživatelské mezipaměti" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User configuration folder" +msgstr "Složka uživatelské konfigurace" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Podsložka %s ve složce uživatelské konfigurace" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User data folder" +msgstr "Složka uživatelských dat" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User data subfolder %s" +msgstr "Podsložka %s ve složce uživatelských dat" + +#: plugins/flatpak/gs-flatpak.c:376 +msgid "User runtime folder" +msgstr "Uživatelská složka pro běh aplikací" + +#: plugins/flatpak/gs-flatpak.c:376 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Podsložka %s v uživatelské složce pro běh aplikací" + +#: plugins/flatpak/gs-flatpak.c:434 +#, c-format +msgid "Filesystem access to %s" +msgstr "Přístup k souborovému systému v %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1387 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Získávají se metadata Flatpak pro %s…" + +#: plugins/flatpak/gs-flatpak.c:3613 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Selhalo vylepšení doplňku „%s“: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Uživatelská instalace" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Systémová instalace" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID aplikace" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Selhalo přidání doplňku „%s“ k nainstalování: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Selhalo přidání doplňku „%s“ k odinstalování: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Vzdálený server „%s“ nedovoluje instalaci „%s“, pravděpodobně kvůli svému " +"filtru. Odstraňte filtr a instalaci zopakujte. Podrobnosti chyby: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Systém nemá dostatek energie, aby provedl aktualizaci" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Systém nemá dostatek energie, aby provedl aktualizaci (%u%%, vyžaduje %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Zařízení je nedostupné nebo mimo dosah bezdrátové sítě" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Úroveň nabití baterie zařízení je příliš nízká" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Úroveň nabití baterie zařízení je příliš nízká (%u%%, vyžaduje %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Zařízení čeká na aplikování aktualizace" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Zařízení vyžaduje připojené napájení ze sítě" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Zařízení nelze používat, pokud je víko notebooku zavřené" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Aktualizace zařízení %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Aktualizace systému pro %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Aktualizace vestavěného řadiče pro %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Aktualizace ME pro %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Aktualizace ME pro firmy pro %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Aktualizace ME pro běžné spotřebitele pro %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Aktualizace řadiče pro %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Aktualizace řadiče Thunderbolt pro %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Aktualizace mikrokódu CPU pro %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Aktualizace nastavení pro %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Aktualizace baterie pro %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Aktualizace kamery pro %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Aktualizace TPM pro %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Aktualizace touchpadu pro %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Aktualizace myši pro %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Aktualizace klávesnice pro %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Aktualizace řadiče disků pro %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Aktualizace síťové karty pro %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Aktualizace displeje pro %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Aktualizace BMC pro %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Aktualizace přijímače USB pro %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Aktualizace disku pro %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Aktualizace flash disku pro %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Aktualizace SSD pro %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Aktualizace grafické karty pro %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Aktualizace dokovacího zařízení pro %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Aktualizace USB dokovacího zařízení pro %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Aktualizaci firmwaru nelze provést: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Podpora aktualizací firmwaru" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Poskytuje podporu pro povyšování verzí firmwaru" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Nainstalovat nepodepsaný software?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Software, který se chystáte nainstalovat, není podepsaný. Nebude tak možné " +"ověřit původ jeho aktualizací, nebo zda aktualizace nebyly zmanipulovány." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Stáhnout nepodepsaný software?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Jsou k dispozici nepodepsané aktualizace. Bez podpisu není možné ověřit " +"původ aktualizace, nebo zda nebyla zmanipulována." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Aktualizovat nepodepsaný software?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Jsou k dispozici nepodepsané aktualizace. Bez podpisu není možné ověřit " +"původ aktualizace, nebo zda nebyla zmanipulována. Aktualizace softwaru budou " +"zakázány, dokud nebudou nepodepsané aktualizace buďto odstraněny nebo " +"nahrazeny jinými." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Selhala instalace aktualizací: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Balíčky" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Selhalo čekání na konec transakce před stažením: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Selhalo stažení aktualizací: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Selhalo spuštění aktualizace: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Operační systém (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Podpora pro Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap je univerzální linuxový balíček" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:774 +msgid "System" +msgstr "Systém" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:778 +msgid "System component" +msgstr "Součást systému" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1029 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Odebrání úlohy sysupdate „%s“ se nezdařilo se stavem %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Elegantní způsob správy softwaru ve vašem počítači." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Zadejte prosím číslo od 1 do %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Vyberte aplikaci:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "Aplikace %s je nyní nainstalována" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Aplikace byla odebrána" +#~ msgstr[1] "Aplikace byly odebrány" +#~ msgstr[2] "Aplikace byly odebrány" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Nelze najít „%s“" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Stahuje se katalog softwaru" + +#~ msgid "Moderate page" +#~ msgstr "Stránka pro moderování" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Nejsou k dispozici žádné recenze k moderování" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Byla pro vás tato recenze přínosná?" + +#~ msgid "Yes" +#~ msgstr "Ano" + +#~ msgid "No" +#~ msgstr "Ne" + +#~ msgid "Meh" +#~ msgstr "Nezájem" + +#~ msgid "Outdated SDK version" +#~ msgstr "Zastaralá verze SDK" + +#~ msgid "Unable to install updates" +#~ msgstr "Nelze nainstalovat aktualizace" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Nelze odinstalovat balíček: neplatné ověření" + +#~ msgid "Network Settings" +#~ msgstr "Nastavení sítě" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Aktualizace operačního systému nejsou dostupné" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Selhala instalace důležité aktualizace operačního systému." + +#~ msgid "No Network" +#~ msgstr "Žádné připojení k síti" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Přístup k internetu je nezbytný pro kontrolu aktualizací." + +#~ msgid "Network _Settings" +#~ msgstr "Nastavení _sítě" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Povýšení softwaru byly staženy a jsou připraveny k instalaci." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Aktualizace softwaru byly staženy a jsou připraveny k instalaci." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Stahují se informace o povýšení…" + +#, c-format +#~ msgid "%s %s %s" +#~ msgstr "%s %s %s" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "K instalaci je připravena důležitá aktualizace softwaru." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Důležité: čekají kritické aktualizace softwaru." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Stáhněte prosím čekající aktualizace softwaru." + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Co se vám na této aplikaci líbilo? Zanechání zpětné vazby společně s " +#~ "důvody pro zanechání recenze je pro ostatní užitečné." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automatické aktualizace jsou pozastaveny" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Současná síť používá měřené připojení, takže může mít omezené množství " +#~ "přenesených dat nebo účtované poplatky za přenesená data. Aby se ušetřil " +#~ "přenos dat, byly pozastaveny automatické aktualizace.\n" +#~ "\n" +#~ "Pokud bylo současné připojení určeno nesprávně jako měřené, lze to změnit " +#~ "v Nastavení." + +#~ msgid "Open Network _Settings" +#~ msgstr "Otevřít nastavení _sítě" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Měřená síť – automatické aktualizace jsou pozastaveny" + +#~ msgid "Find Out _More" +#~ msgstr "Dozvědět se _více…" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Nelze stáhout aktualizace: přístup k internetu je nezbytný, ale není k " +#~ "dispozici" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Nelze stáhnout aktualizace: není dostatek místa na disku" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Nelze stáhnout aktualizace: je vyžadováno ověření" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Nelze stáhnout aktualizace: ověření nebylo platné" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Nelze nainstalovat balíček %s: nemáte oprávnění k instalaci softwaru" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "" +#~ "Nelze nainstalovat balíček %s: úroveň nabití baterie je příliš nízká" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Nelze nainstalovat aktualizace: nedostatek místa na disku" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Nelze nainstalovat aktualizace: je vyžadováno ověření" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Nelze nainstalovat aktualizace: ověření bylo neplatné" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Nelze aktualizovat balíček %s: nemáte oprávnění k aktualizaci softwaru" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Nelze nainstalovat aktualizace: nemáte oprávnění k aktualizaci softwaru" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Nelze nainstalovat aktualizace: je vyžadováno napájení z elektrické sítě" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "" +#~ "Nelze aktualizovat balíček %s: úroveň nabití baterie je příliš nízká" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "Nelze nainstalovat aktualizace: úroveň nabití baterie je příliš nízká" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Nelze povýšit na %s: přístup k Internetu je nezbytný a přitom není k " +#~ "dispozici" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Nelze povýšit na %s: nemáte oprávnění k povyšování" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Nelze povýšit na %s: úroveň nabití baterie je příliš nízká" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Nelze odstranit balíček %s: je vyžadováno ověření" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Nelze odstranit balíček %s: ověření nebylo platné" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Nelze odstranit balíček %s: nemáte oprávnění k odstranění softwaru" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Nelze odstranit balíček %s: je vyžadováno připojené napájení" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Nelze odstranit balíček %s: úroveň nabití baterie je příliš nízká" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Nelze odstranit balíček %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Selhala instalace souboru: není podporován" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Selhala instalace: není podporováno" + +#~ msgid "AC power is required" +#~ msgstr "Je vyžadováno připojené napájení" + +#, fuzzy +#~| msgid "Explore" +#~ msgid "Explore Pages" +#~ msgstr "Procházet" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Aby se předešlo poplatkům a omezením sítě, nejsou aktualizace softwaru " +#~ "automaticky stahovány na mobilních nebo měřených připojeních." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Stahuje a instaluje aktualizace softwaru na pozadí, pokud je to možné." + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Zobrazit _pouze svobodné aplikace" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Zobrazit pouze aplikace se svobodnou licencí a skrýt všechny nesvobodné " +#~ "aplikace." + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Načítání popisu aktualizace, čekejte prosím…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Zobrazovat podrobné ladicí informace" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Může přistupovat k libovolným souborům" + +#~ msgid "Downloading featured images…" +#~ msgstr "Stahují se obrázky k významným aplikacím…" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Opravdu chcete odinstalovat %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "Odinstaluje se %s a když jej budete chtít v budoucnu znovu použít, budete " +#~ "muset provést novou instalaci." + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Vybrané doplňky budou nainstalovány spolu s aplikací." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Datum a čas, kdy byl systém naposledy on-line a dostal nějaké aktualizace" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Tento software není dostupný ve vašem jazyce a zobrazí se v americké " +#~ "angličtině." + +#~ msgid "Applications" +#~ msgstr "Aplikace" + +#~ msgid "Web Applications" +#~ msgstr "Webové aplikace" + +#~ msgid "Post Review" +#~ msgstr "Příspěvek do recenzí" + +#~ msgid "_Post" +#~ msgstr "_Odeslat" + +#~ msgid "Rating" +#~ msgstr "Hodnocení" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Uveďte krátké shrnutí své recenze, například: „Skvělá aplikace, " +#~ "doporučuji“." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Recenze" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Co si o aplikaci myslíte? Snažte se uvést důvody svého hodnocení." + +#~ msgid "No screenshot provided" +#~ msgstr "Nemá snímek obrazovky" + +#~ msgid "Primary Menu" +#~ msgstr "Hlavní nabídky" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Aktualizace" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "Systém %s %s již není podporován." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "" +#~ "Znamená to, že pro něj již nadále nejsou poskytovány bezpečnostní opravy." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Doporučuje se povýšit na nejnovější verzi." + +#~ msgid "Application Updates" +#~ msgstr "Aktualizace aplikací" + +#~ msgid "_Continue" +#~ msgstr "_Pokračovat" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "GNOME Web" +#~ msgstr "Web GNOME" diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..49aee6a --- /dev/null +++ b/po/da.po @@ -0,0 +1,7364 @@ +# Danish translation for gnome-software. +# Copyright (C) 2013-2018 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Joe Hansen , 2013. +# Kris Thomsen , 2013-2017. +# Ask Hjorth Larsen , 2014. +# Alan Mortensen , 2018-25. +# scootergrisen, 2019-2021. +# app = program +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-25 17:19+0000\n" +"PO-Revision-Date: 2025-02-25 19:11+0100\n" +"Last-Translator: Alan Mortensen \n" +"Language-Team: Danish \n" +"Language: da\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/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Installér og opdatér programmer" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Software lader dig finde og installere nye programmer og systemudvidelser, " +"samt fjerne allerede installerede programmer." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Software fremviser udvalgte og populære programmer med nyttige beskrivelser " +"og adskillige skærmbilleder per program. Programmer kan findes enten ved " +"gennemsyn af oversigten over kategorier eller gennem søgning. Dette program " +"giver dig også mulighed for at opdatere dit system ved brug af " +"offlineopdatering." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Oversigtspanel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Detaljepanel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Installerede-panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Opdateringspanel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Opdateringsdetaljerne" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME-projektet" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Test akmods-nøgle i Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Godkendelse er krævet for at teste akmods-nøgle i Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Tilknyt akmods-nøgle til Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Godkendelse er krævet for at tilknytte akmods-nøgle til Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Test DKMS-nøgle i Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Godkendelse er krævet for at teste DKMS-nøgle i Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Tilknyt DKMS-nøgle til Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Godkendelse er krævet for at tilknytte DKMS-nøgle til Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Installér en appstream-fil på en systemplacering" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Installerer en appstream-fil på en systemplacering" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "En liste over kompatible projekter" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Dette er en liste over kompatible projekter, som vi skal vise, som f.eks. " +"GNOME, KDE og XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Om opdateringer og opgraderinger skal håndteres i GNOME Software" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Hvis deaktiveret vil GNOME Software skjule opdateringspanelet og ikke udføre " +"nogen automatiske opdateringshandlinger eller anmode om opgraderinger." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Hent og installér automatisk opdateringer" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Hvis aktiveret, vil GNOME Software automatisk hente opdateringer i " +"baggrunden og installere dem, der ikke kræver en genstart." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Gør brugeren opmærksom på software, som blev opdateret i baggrunden" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Hvis aktiveret, vil GNOME Software gøre brugeren opmærksom på opdateringer, " +"der skete, mens brugeren var inaktiv." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Om der automatisk skal genopfriskes på en forbrugsafregnet forbindelse" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Hvis aktiveret, vil GNOME Software automatisk genopfriske i baggrunden, også " +"når en forbrugsafregnet forbindelse er i brug (til tider hente metadata, " +"kontrollere efter opdateringer osv. som kan betyde udgifter for brugeren)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Om det er første gang, GNOME Software køres" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Vis stjernevurderinger ved siden af programmerne" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtrér programmer baseret på standardgrenen angivet for fjernenheden" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Ikke-frie programmer viser en advarselsdialog før installation" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Når ikke-frie programmer installeres, vil en advarselsdialog blive vist. " +"Dette kontrollerer om den dialog undertrykkes." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Tidsstemplet for seneste søgning efter opdatering" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Tidsstemplet for seneste påmindelse om opgradering" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Tidsstemplet for seneste påmindelse om opdatering" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Tidsstemplet for den første sikkerhedsopdatering; ryddes efter opdatering" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Tidsstemplet for seneste opdatering" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Alderen i sekunder til at verificere at upstream-screenshot'et stadig er " +"gyldigt" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"At vælge en større værdi vil betyde færre kald til fjernserveren, men " +"screenshot-opdateringer kan tage længere tid, før brugeren ser dem. Værdien " +"0 betyder at serveren aldrig skal kontrolleres, hvis billedet allerede " +"findes i cachen." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Serveren, som bruges til programanmeldelser" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Mindste karmascore for anmeldelser" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Anmeldelser med mindre karma end dette nummer vil ikke blive vist." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "En liste over officielle arkiver, som ikke skal anses som tredjepart" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"En liste over nødvendige arkiver som ikke kan deaktiveres eller fjernes" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "En liste over officielle arkiver, der skal anses som fri software" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Licens-URL'en, som skal bruges, når et program skal betragtes som fri " +"software" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Installér bundtede programmer for alle brugere på systemet, hvor det er " +"muligt" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Tillad adgang til dialogen Softwarearkiver" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Tilbyd opgraderinger ved før-udgivelser" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Vis brugerfladeelementer, som informerer brugeren om at programmet ikke er " +"frit" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Vis installationsstørrelsen for programmer i listen over installerede " +"programmer" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://da.wikipedia.org/wiki/Propriet%C3%A6r_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI'en som forklarer, hvad ikke-fri og proprietær software er" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"En liste over URL'er som peger på appstream-filer, som vil blive hentet ned " +"i en swcatalog-mappe" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Installér AppStream-filerne på en systemplacering for alle brugere. Hvis " +"“false” (falsk) installeres filerne i mappen $XDG_DATA_HOME/swcatalog/xml, " +"som ikke er standardstien" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Prioriteringsrækkefølge for foretrukne pakkeformater med vigtigere formater " +"vist først. Er oversigten tom, bruges standardrækkefølgen. Udeladte formater " +"antages at blive vist sidst. Eksempler på pakkeformater: deb, flatpak, rpm, " +"snap. Formaterne kan desuden angives med et oprindelsesnavn adskilt med et " +"kolon (f.eks. “flatpak:flathub”)." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Tidsstemplet for det seneste forsøg på at fjerne ubrugte Flatpak-" +"kørselsmiljøer" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Sæt til “true” (sand) for kun at vise frie programmer og skjule proprietære " +"programmer." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Sæt til “true” (sand) for kun at vise programmer fra udviklere, hvis " +"identitet er bekræftet." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Tidsstemplet for de sidst modtagne historiske opdateringer." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"En streng indeholdende id til gnome-online-account, som anvendes til login" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Software AppStream-installeringsprogram på systemniveau" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Kunne ikke tolke kommandolinje-argumenter" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Du skal angive præcis ét filnavn" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Dette program kan kun bruges af root-brugeren" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Kunne ikke validere indholdstypen: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Kunne ikke flytte: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Softwareinstallation" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Installér valgte programmer på systemet" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Tegneserievold" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Ingen information om tegneserievold" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantasyvold" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Ingen information om fantasyvold" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistisk vold" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Ingen information om realistisk vold" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Vold med blodsudgydelse" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Ingen information om blodsudgydelser" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Seksuel vold" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Ingen information om seksuel vold" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Ingen information om referencer til alkohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Ingen information om referencer til ulovlige stoffer" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tobak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Ingen information om referencer til tobaksvarer" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nøgenhed" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Ingen information om nøgenhed af nogen art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Seksuelle temaer" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Ingen information om referencer til eller skildringer af seksuel art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Bandeord" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Ingen information om bandeord af nogen art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Upassende humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Ingen information om upassende humor" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskrimination" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Ingen information om diskriminerende sprog af nogen art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklamer" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Ingen information om reklamer af nogen art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Hasardspil" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Ingen information om hasardspil af nogen art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Køb" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Ingen information om mulighed for at bruge penge" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Chat mellem brugere" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Ingen information om måder at chatte med andre brugere på" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Snak mellem brugere" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Ingen information om måder at tale med andre brugere på" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontaktdetaljer" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Ingen information om deling af brugernavne eller e-mailadresser fra sociale " +"netværk" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identificerende information" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Ingen information om deling af brugerinformation med tredjeparter" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Deling af placering" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Ingen information om deling af fysisk placering med andre brugere" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksualitet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Ingen information om referencer til homoseksualitet" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitution" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Ingen information om referencer til prostitution" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Utroskab" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Ingen information om referencer til utroskab" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Seksualiserede personer" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Ingen information om seksualiserede personer" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Vanhelligelse" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Ingen information om referencer til vanhelligelse" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Ligdele" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Ingen information om synlige ligdele" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Slaveri" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Ingen information om referencer til slaveri" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Indeholder ikke referencer til stoffer" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Indeholder ikke bandeord eller anden stærk sprogbrug" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Indeholder ikke reklamer eller pengeoverførsler" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Indeholder ikke sex eller nøgenhed" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Indeholder ikke ukontrolleret chatfunktionalitet" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Indeholder ikke vold" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Stoffer" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Stærkt sprog" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Penge" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Vold" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Alle" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s har en ukendt aldersvurdering" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s er egnet for alle" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s er egnet for vuggestuebørn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s er egnet for mindre børn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s er egnet for børn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s er egnet for teenagere" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s er egnet for voksne" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s er egnet for %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Aldersvurdering" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Bidrag med manglende information" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Lokal fil" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Pakke" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Venter" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Afventer installering" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Afventer fjernelse" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Installerer" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Fjerner" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Henter" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Installér" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "A_finstallér …" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Netværk" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Kan kommunikere over netværket" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Systemtjenester" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Kan tilgå D-Bustjenester på systembussen" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Sessionstjenester" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Kan tilgå D-Bustjenester på sessionsbussen" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Enheder" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Kan tilgå vilkårlige enheder såsom webkameraer" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Kan tilgå inputenheder" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Kan tilgå mikrofoner og afspille lyd" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Kan tilgå filer på systemenheden" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Skærmindhold" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Kan tilgå skærmindhold" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Hjemmemappe" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Kan se, redigere og oprette filer" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Kan se filer" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Filsystem" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Mappe til hentede filer" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Indstillinger" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Kan se og ændre alle indstillinger" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Forældet system til visning" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Bruger et gammelt, usikkert system til visning" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Sandkasse-undvige" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Kan undvige sandkassen og omgå andre begrænsninger" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Ingen opdateringsbeskrivelse tilgængelig." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Opdateringsdetaljer" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Kræver flere rettigheder" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Ugyldige vurderingsdata modtaget fra serveren" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Kunne ikke kommunikere med vurderingsserveren" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Anmeldelser" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Der er ingen anmeldelser af dette program." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Ingen anmeldelser" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Versionshistorik" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Nyt i version %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Version %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Ingen detaljer for denne udgave" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e. %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Opstartstilstand: enten “updates”, “updated”, “installed” eller “overview”" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "TILSTAND" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Søg efter programmer" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SØG" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Vis programdetaljer (ud fra program-id)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "Id" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Vis programdetaljer (ud fra pakkenavn)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PAKKENAVN" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Installér programmet (ud fra program-id)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Afinstallér programmet (ud fra program-id)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Åbn en lokal pakkefil" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILNAVN" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Handlingens forventet interaktionstype: enten “none”, “notify” eller “full”" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Vis en lokal metainfo- eller appdata-fil" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Aktivér uddybende fejlsøgningsoutput (fra den kørende instans, hvis den " +"allerede kører)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installerer afventende opdateringer i baggrunden" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Vis indstillinger" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Afslut den kørende instans" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Foretræk lokale filkilder fremfor AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Vis versionsnummer" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Ophavsret © 2016–2023 bidragyderne til GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Kris Thomsen\n" +"Joe Hansen\n" +"Ask Hjorth Larsen\n" +"Alan Mortensen\n" +"\n" +"Dansk-gruppen\n" +"Websted http://dansk-gruppen.dk\n" +"E-mail " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Beklager! Der er ingen detaljer om programmet." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Størrelse på installation" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inkluderer %s data og %s cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inkluderer %s data" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inkluderer %s cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Forbrug af cache og data ukendt" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Størrelse på download" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Har ikke brug for yderligere systemdownloads" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Har brug for systemdownload af ukendt størrelse" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Har brug for %s yderligere systemdownload" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Størrelsen er ikke kendt" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Ingen rettigheder" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Har netværksadgang" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Bruger systemtjenester" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Bruger sessionstjenester" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Kan tilgå hardwareenheder" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Kan tilgå systemenheder" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Kan læse/skrive alle dine data" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Kan læse alle dine data" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Kan læse/skrive dine downloads" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Kan læse alle dine downloads" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Kan tilgå nogle specifikke filer" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Kan tilgå og ændre brugerindstillinger" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Bruger et forældet vinduessystem" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Kan opnå vilkårlige rettigheder" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Programudvikler er bekræftet" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Gennemset af OS-distributøren" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Gennemset af %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Leveret af tredjepart" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Programmet understøttes ikke længere" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Kode kan auditeres" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Ukendt licens" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Proprietær kode" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Speciel licens" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privilegeret" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Sikker" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Sandsynligvis sikker" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potentielt usikker" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Usikker" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Kun mobil" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Virker kun på en lille skærm" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Kun stationær" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Virker kun på en stor skærm" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Skærmstørrelse passer ikke" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Understøtter ikke den aktuelle skærmstørrelse" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Kræver en berøringsfølsom skærm" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Kræver et tastatur" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Kræver en mus" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Gamepad nødvendig" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Kræver gamepad for at spille" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Tilpassende" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Virker på mobiler, tablets og stationære" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Kræver sandsynligvis tastatur eller mus" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Virker på stationær og bærbar" + +# scootergrisen: fra gennemlæsning: Måske bedre at omskrive det: +# scootergrisen: fra gennemlæsning: Programmet er egnet for alle aldersgrupper +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Indeholder ikke noget aldersupassende indhold" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Ingen information om aldersvurdering tilgængelig" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Besøg websted" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Installér …" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Annullér" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Installér" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Hent" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Opdatér" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Afinstallér …" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Afinstallerer" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritisk opdatering" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Enhed kan ikke bruges under opdatering." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Kilde: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Omdøbt fra %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Stoppet med at modtage opdateringer" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritisk opdatering" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Installeret" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Hjælp med at oversætte %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s er designet, udviklet og oversat af en international gruppe bidragydere.\n" +"\n" +"Selvom det endnu ikke er tilgængeligt på dit sprog, kan du deltage og hjælpe " +"med at oversætte." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Oversættelser" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Websted til oversættelser" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Login krævet til fjern %s (domæne %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Login kræves" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Annullér" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Login" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Bruger" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Adgangskode" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Andet" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Alle" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Udvalgte" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Redaktørens valg" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nye og opdaterede" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Udvalgte fra nettet" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Andre programmer" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s installeret" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Der kræves en genstart, før ændringerne træder i kraft" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Programmet er klar til at blive taget i brug" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Systemopdateringer installeret" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Nyligt installerede opdateringer er tilgængelige for gennemsyn" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Genstart" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Kør" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Installér software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Installér tredjeparts-software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Aktivér softwarearkiv?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Aktivér softwarearkiver fra tredjepart?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s er ikke fri og åben kildekode-software, og er " +"leveret af “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s er leveret af “%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Dette softwarearkiv skal aktiveres for at fortsætte installationen." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Det er muligvis ulovligt at installere eller bruge %s i visse lande." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Det er muligvis ulovligt at installere og bruge dette codec i visse lande." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Advar _mig ikke igen" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Aktivér og _installér" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Detaljerede fejlbeskeder fra pakkehåndteringen følger:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detaljer" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Luk" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Detaljer kopieret til udklipsholderen" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "Acce_ptér" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "En opdatering er blevet installeret" +msgstr[1] "Opdateringer er blevet installeret" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Et program er blevet afinstalleret" +msgstr[1] "Programmer er blevet afinstalleret" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Der kræves en genstart, før den træder i kraft" +msgstr[1] "Der kræves en genstart, før de træder i kraft" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Ikke nu" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "I dag" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "I går" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag siden" +msgstr[1] "%d dage siden" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d uge siden" +msgstr[1] "%d uger siden" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d måned siden" +msgstr[1] "%d måneder siden" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d år siden" +msgstr[1] "%d år siden" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Lige nu" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minut siden" +msgstr[1] "%d minutter siden" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d time siden" +msgstr[1] "%d timer siden" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Udvalgte" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D-grafik" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografi" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skanning" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorgrafik" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Fremvisere" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Oprettelse og redigering af lyd" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Musikafspillere" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Udvalgte" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalender" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Database" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finans" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Tekstbehandling" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Tekstredigering" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Webbrowsere" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Udvalgte" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Action" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Eventyr" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokke" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Brætspil" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kortspil" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatorer" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Børn" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logik" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rollespil" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategi" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Udvalgte" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chat" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Udvalgte" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Kunstig intelligens" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomi" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kemi" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Sprog" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematik" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Nyheder" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotteknologi" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Kunst" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografi" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Tegneserier" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fiktion" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Sundhed" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historie" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Livsstil" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politik" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Udvalgte" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Fejlsøgere" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Udviklingsmiljøer" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codec" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hardwaredrivere" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Skrifttyper" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Indtastningskilder" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Sprogpakker" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalisering" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Kreativitet" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Arbejde" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Leg" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socialisér" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Læring" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Udvikling" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Hardwaredrivere" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Skrifttyper" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Indtastningskilder" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Sprogpakker" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalisering" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Et program" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s efterspørger yderligere filformat-understøttelse." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Flere MIME-typer påkrævet" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s efterspørger flere skrifttyper." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Flere skrifttyper påkrævet" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s efterspørger flere multimedie-codecs." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Flere multimedie-codecs påkrævet" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s efterspørger flere printerdrivere." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Flere printerdrivere påkrævet" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s efterspørger flere pakker." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Flere pakker påkrævet" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Find i Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Vis mere" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Vis mindre" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Fjerner …" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Genstart krævet for at færdiggøre installering" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Genstart krævet for at færdiggøre fjernelse" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Afventer installering …" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Afventer opdatering …" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Henter …" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Klargør …" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Afinstallerer …" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "" +"%s er ikke installeret, men programmet har stadig tilstedeværende data." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Genstart" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "A_ktivér …" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Installér …" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s vil optræde på amerikansk engelsk" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Programmet vil optræde på amerikansk engelsk" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Programmet vil optræde på amerikansk engelsk" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "H_jælp med at oversætte" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Andre programmer af %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Udvikleren %s har bevist sit ejerskab af %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Udvikleren har bevist sit ejerskab af %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Du skal have internetadgang for at skrive en anmeldelse" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Dette program modtager ikke længere opdateringer (heller ikke " +"sikkerhedsrettelser)" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Dette program udbydes allerede af din distribution og bør ikke erstattes." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Dette program har ingen links til et websted, kodearkiv eller issue tracker." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Denne software modtager ikke længere opdateringer (heller ikke " +"sikkerhedsrettelser)" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Denne software udbydes allerede af din distribution og bør ikke erstattes." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Dette program har ingen links til et websted, kodearkiv eller issue tracker." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Software kunne ikke hente oplysninger om “%s” og kan ikke vise detaljerne " +"for programmet." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Ugyldigt anmeldelsessvar modtaget fra serveren" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Kunne ikke indsende anmeldelsen for “%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Detaljeside" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Indlæser programdetaljer" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Bekræftet" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Åbn" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Opdatér" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Afinstallér" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Udvidelser" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Dette program kan kun bruges, når der er en aktiv internet-forbindelse." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Softwarearkiv inkluderet" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Dette program inkluderer et softwarearkiv, som tilbyder opdateringer så vel " +"som adgang til anden software." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Intet softwarearkiv inkluderet" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Dette program inkluderer ikke et softwarearkiv. Det vil ikke blive opdateret " +"med nye versioner." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Softwarearkiv fundet" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Tilføjelse af dette softwarearkiv vil give dig adgang til mere software samt " +"opdateringer." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Brug kun softwarearkiver, du stoler på." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Ryd programdata" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Sl_et data" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Ingen metadata" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Projektets _websted" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Donér" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Bidrag med oversættelse" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Rapportér et problem" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Hjælp" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontakt" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Skriv anmeldelse" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Alle anmeldelser" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Kan ikke vise programdetaljer" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Kunne ikke forberede genstart" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Ukendt fejl" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Nøglen blev ikke fundet" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Nøglen er ikke tilknyttet" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK-tilknytning krævet" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Næste" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Denne enhed har Secure Boot aktiveret. For at nye drivere kan aktiveres, " +"skal der tilknyttes en ny maskinejernøgle (MOK). Processen kræver en " +"adgangskode, der skal indtastes senere i processen. Notér venligst følgende " +"adgangskode, der er knyttet til nøglen:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "_Jeg har noteret MOK-adgangskoden" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Genstart og tilknyt …" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Opsætningsvejledning: Læs nøje" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Efter genstart vises et skærmbillede til opsætning af enheden. Fortsæt " +"gennem opsætningstrinnene for at aktivere nye drivere:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Vælg “Enroll MOK”\n" +"• Vælg “Yes” for at tilknytte nøgler\n" +"• Indtast MOK-adgangskoden, når du bliver bedt om den\n" +"• Vælg så “Reboot”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Konsekvenser for sikkerheden" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Efter en vellykket tilknytning af nøglen skal du være opmærksom på, at alle " +"fremtidige opdateringer af modulet eller andre moduler vil være implicit " +"betroede. Alle fremtidige opdateringer vil ske transparent uden interaktion " +"eller godkendelse." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Yderligere vejledning kan findes på vejledningssiden." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Henter ekstra metadatafiler …" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " og " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tilgængelige skrifttyper til %s-skriptet" +msgstr[1] "Tilgængelige skrifttyper til %s-skripterne" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Tilgængelig software til %s" +msgstr[1] "Tilgængelig software til %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Ønskede software blev ikke fundet" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Kunne ikke finde den ønskede software" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s blev ikke fundet" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "på webstedet" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Ingen programmer er tilgængelige til at udbyde filen %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Information om %s, såvel som muligheder for at hente manglende programmer, " +"kan muligvis findes %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Ingen programmer er tilgængelige for understøttelse af %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s ikke tilgængelig." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Information om %s, såvel som muligheder for at hente et program, der kan " +"understøtte dette format, kan findes %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Ingen tilgængelige skrifttyper, som understøtter %s-skriptet." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Information om %s, såvel som muligheder for at hente flere skrifttyper kan " +"findes %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Ingen tilføjelses-codec tilgængelig for formatet %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Information om %s, såvel som muligheder for hvordan man henter et codec, der " +"kan afspille dette format, kan findes %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Ingen Plasma-ressourcer tilgængelige for %s-understøttelse." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Information om %s, såvel som muligheder for at hente flere Plasma-ressourcer " +"kan findes %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Ingen printerdrivere tilgængelige for %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Information om %s, såvel som muligheder for at hente en driver, der " +"understøtter denne printer, kan findes %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentationen" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Kan ikke finde %s, som blev anmodet af %s. Se venligst %s for mere " +"information." +msgstr[1] "" +"Kan ikke finde %s, som blev anmodet af %s. Se venligst %s for mere " +"information." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Kan ikke finde %s, som du søgte efter. Se venligst %s for mere information." +msgstr[1] "" +"Kan ikke finde %s, som du søgte efter. Se venligst %s for mere information." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Kunne ikke finde nogen søgeresultater: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s-filformatet" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Installér _alle" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Kunne ikke finde den ønskede software" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Codecsside" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Ingen resultater fundet" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Kan ikke udføre søgning" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Forrige" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Næste" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Liste over udvalgte programmer" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Understøttelse af stationær" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Understøtter brug med stor skærm" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Ukendt understøttelse af stationær" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Ikke nok information til at afgøre om store skærme understøttes" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Kræver en stor skærm" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Stationær understøttes ikke" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Kan ikke bruges på en stor skærm" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Understøttelse af mobil" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Understøttelse brugt på en lille skærm" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Ukendt understøttelse af mobil" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Ikke nok information til at afgøre om små skærme understøttes" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Kræver en lille skærm" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobil understøttes ikke" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Kan ikke bruges på en lille skærm" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Understøttelse af tastatur" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Ukendt understøttelse af tastatur" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Ikke nok information til at afgøre om tastatur understøttes" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Kræver tastatur" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Understøtter tastaturer" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tastatur understøttes ikke" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Kan ikke bruges med et tastatur" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Understøttelse af mus" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Kræver mus eller pegeenhed" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Ukendt understøttelse af mus" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Ikke nok information til at afgøre om mus eller pegeenheder understøttes" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Kræver mus" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Understøtter mus og pegeenheder" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Mus understøttes ikke" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Kan ikke bruges med mus eller pegeenhed" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Understøttelse af berøringsfølsom skærm" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Ukendt understøttelse af berøringsfølsom skærm" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Ikke nok information til at afgøre om berøringsfølsomme skærme understøttes" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Kræver berøringsfølsom skærm" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Understøtter berøringsfølsomme skærme" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Berøringsfølsom skærm understøttes ikke" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Kan ikke bruges med berøringsfølsom skærm" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Kræver gamepad" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Kræver en gamepad" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Understøttelse af gamepad" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Understøtter gamepad" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s virker sandsynligvis på denne enhed" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s virker på denne enhed" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s virker muligvis på denne enhed" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s vil ikke virke ordentligt på denne enhed" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s vil ikke virke på denne enhed" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Understøttelse af hardware" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigation" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navigér til siden Udforsk" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navigér til siden Installerede" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navigér til siden Opdateringer" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Åbn søgebjælke" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Vinduer" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Åbn indstillinger" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Åbn softwarearkiver" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Hjælp" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Åbn tastaturgenveje" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Installeret" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Installerede-side" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "I gang" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Programmer" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Webprogrammer" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Systemprogrammer" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Lavet af fællesskabet" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Bidrag" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Dette program er udviklet i åbenhed af et internationalt fællesskab og " +"frigivet under %s-licensen.\n" +"\n" +"Du kan bidrage og være med til at gøre programmet endnu bedre." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Dette program er udviklet i åbenhed af et internationalt fællesskab og " +"frigivet under %s-licensen.\n" +"\n" +"Du kan bidrage og være med til at gøre det endnu bedre." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Denne software er udviklet i åbenhed af et internationalt fællesskab og " +"frigivet under %s-licensen.\n" +"\n" +"Du kan bidrage og være med til at gøre programmet endnu bedre." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Denne software er udviklet i åbenhed af et internationalt fællesskab og " +"frigivet under %s-licensen.\n" +"\n" +"Du kan bidrage og være med til at gøre det endnu bedre." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Ukendt licens" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Få mere at vide" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Dette program angiver ikke, hvilken licens det er udviklet under og kan være " +"proprietært. Det kan være usikkert på måder, der er svære at opdage, og det " +"kan ændres uden tilsyn.\n" +"\n" +"Du kan måske/måske ikke bidrage til programmet." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Denne software angiver ikke, hvilken licens det er udviklet under og kan " +"være proprietært. Det kan være usikkert på måder, der er svære at opdage, og " +"det kan ændres uden tilsyn.\n" +"\n" +"Du kan måske/måske ikke bidrage til programmet." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Proprietær" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Dette program er ikke udviklet i åbenhed, så kun udviklerne ved, hvordan det " +"fungerer. Det kan være usikkert på måder, der er svære at opdage, og det kan " +"ændres uden tilsyn.\n" +"\n" +"Du kan måske ikke bidrage til programmet." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Dette program er ikke udviklet i åbenhed, så kun udviklerne ved, hvordan det " +"fungerer. Det kan være usikkert på måder, der er svære at opdage, og det kan " +"ændres uden tilsyn.\n" +"\n" +"Du kan måske ikke bidrage til programmet." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Speciel licens" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Dette program er udviklet under den specielle licens %s.\n" +"\n" +"Du kan måske/måske ikke bidrage til programmet." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Dette program er udviklet under den specielle licens “%s”.\n" +"\n" +"Du kan måske/måske ikke bidrage til programmet." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Denne software er udviklet under den specielle licens %s.\n" +"\n" +"Du kan måske/måske ikke bidrage til programmet." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Denne software er udviklet under den specielle licens “%s”.\n" +"\n" +"Du kan måske/måske ikke bidrage til programmet." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Genindlæser data" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Indlæser side" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Starter" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Ukendt kilde" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Bruger" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Tilføjelser" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Fjernelser" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Opdateringer" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Nedgraderinger" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "udvalgte eksterne kilder" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Giver adgang til flere programmer fra %s. Indeholder også proprietære " +"programmer.\n" +"\n" +"Du kan aktivere disse arkiver senere i indstillinger for softwarearkiver." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Aktivér softwarearkiver fra tredjepart?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "I_gnorér" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "A_ktivér" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Tilgængelig til dit styresystem" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Tilgængelig til %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Udforsk" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Oversigtsside" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Tilgængelige programmer" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Andre kategorier" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Ingen programdata fundet" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Ukendt" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Brugeren afslog installering" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Forbered %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Er du sikker på, du vil fjerne arkivet %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Alle programmer fra %s vil blive afinstalleret, og du skal geninstallere " +"arkivet for at bruge dem igen." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Afinstallér %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "%s kan ikke bruges, når det er blevet fjernet." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Det vil ikke være muligt at bruge nogen programmer, der er afhængige af %s, " +"efter fjernelse." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"%s kan ikke bruges, når den er blevet fjernet, og alle dokumenter, der " +"bruger den, vil blive vist med en anden skrifttype." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"%s kan ikke bruges, når det er blevet fjernet. Det kan betyde, at nogle " +"mediefiler ikke længere kan afspilles." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Hardware, der er afhængig af %s, fungerer muligvis ikke længere korrekt " +"efter fjernelse." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"%s kan ikke bruges, når det er blevet fjernet. Programdata og -indstillinger " +"vil blive gemt på disken, så programmet kan gendannes på et senere tidspunkt." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Indstillinger" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Softwareopdateringer" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Mere information" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Søgning efter og hentning af opdateringer bruger data og strøm. Automatiske " +"opdateringsfunktioner er derfor sat på pause, når der anvendes " +"forbrugsafregnede netværksforbindelser, og når strømsparetilstand er slået " +"til." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "A_utomatisk" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Søg efter og hent automatisk opdateringer" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manuelt" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Søgning efter og hentning af opdateringer skal ske manuelt" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "P_åmindelser om automatiske opdateringer" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Giv besked, når opdateringer er installeret automatisk" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Indholdsfiltre" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Vis kun _frie programmer" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Skjul proprietær software under gennemsyn og søgning" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Vis kun _bekræftede udviklere" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Vis kun programmer fra udviklere, hvis identitet er bekræftet" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Installeret software er ikke kompatibelt med %s og vil automatisk blive " +"fjernet under opgraderingen." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Inkompatibelt software" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "O_pgradér" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "A_finstallér" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Programindstillinger & -data" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Behold" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Tillader gendannelse af programindstillinger og -indhold" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Slet" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Sletter data permanent for at spare diskplads" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Programmer, som er blevet installeret fra “%s”, vil ikke længere modtage " +"opdateringer." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Deaktivér arkiv?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Fjern arkiv?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Deaktivér" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Fjern" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Aktivér nye arkiver" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Aktivér nye arkiver, når de tilføjes" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "mere information" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Flere arkiver fra udvalgte tredjeparter — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora-tredjepartsarkiver" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "styresystemet" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Disse arkiver supplerer standardsoftwaren leveret af %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Softwarearkiver" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Ingen arkiver" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u program installeret" +msgstr[1] "%u programmer installeret" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u tilføjelse installeret" +msgstr[1] "%u tilføjelser installeret" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u program" +msgstr[1] "%u programmer" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u tilføjelse" +msgstr[1] "%u tilføjelser" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s og %s er nu installeret" +msgstr[1] "%s og %s er nu installeret" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Undersøger installeret software …" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Fjern" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Hader det" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Kan ikke lide det" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Det er OK" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Kan lide det" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Elsker det" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Vælg en stjerne for at lave en bedømmelse" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Tag venligst tiden til at skrive anmeldelsen" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Vælg venligst en stjernevurdering" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Opsummeringen er for kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Opsummeringen er for lang" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Beskrivelsen er for kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Beskrivelsen er for lang" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Skriv en anmeldelse" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Send" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Giv venligst en bedømmelse, et resumé og en anmeldelsestekst. Anmeldelser " +"bør ikke bruges til at rapportere problemer: Kontakt i stedet udvikleren " +"eller din supportudbyder." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Opsummering af anmeldelse" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Skriv en kort anmeldelse" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Se i vores privatlivspolitik, " +"hvilke data der sendes. Det fulde navn tilknyttet din konto vil blive vist " +"offentligt." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u anmeldelse i alt" +msgstr[1] "%u anmeldelser i alt" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "ud af fem stjerner" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Ukendt" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Du kan rapportere anmeldelser for aggressivt, uforskammet eller " +"diskriminerende indhold." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Når en anmeldelse er rapporteret, vil den være skjult, indtil den er " +"kontrolleret af en administrator." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Rapportér anmeldelse?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Rapportér" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Fjern anmeldelse?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Fjernes en anmeldelse, kan det ikke fortrydes." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Synes godt om anmeldelse" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Synes ikke godt om anmeldelse" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Rapportér …" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Fjern …" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Programmet kører ikke i sandkassetilstand, men distributionen har tjekket, " +"at det ikke er ondsindet" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Undersøg, om du har tillid til leverandøren, da programmet ikke kører i " +"sandkassetilstand" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Ingen rettigheder" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Programmet køres i sandkassetilstand" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Netværksadgang" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Kan tilgå internettet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Ingen netværksadgang" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Kan ikke tilgå internettet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Bruger systemtjenester" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Kan anmode systemtjenester om data" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Bruger sessionstjenester" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Kan anmode sessionstjenester om data" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Adgang til brugerenheder" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Kan tilgå enheder såsom webkameraer eller spilenheder" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Ingen adgang til brugerenheder" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Kan ikke tilgå enheder såsom webkameraer eller spilenheder" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Adgang til inputenheder" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Adgang til mikrofon og lydafspilning" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Kan lytte med mikrofoner og afspille lyd uden at spørge om lov" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Adgang til systemenheder" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Kan tilgå systemenheder, som kræver rettigheder på et højere niveau" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Adgang til skærmindhold" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Kan tilgå indholdet på skærmen eller i andre vinduer" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Forældet vinduessystem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Vilkårlige rettigheder" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Brugerindstillinger" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Fuld læse-/skriveadgang til filsystemet" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Kan læse og skrive alle data i filsystemet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Læse-/skriveadgang til mappen Hjem" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Kan læse og skrive alle data i din hjemmemappe" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Fuld læseadgang til filsystemet" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Kan læse alle data i filsystemet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Læseadgang til mappen Hjem" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Kan læse alle data i din hjemmemappe" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Læse-/skriveadgang til mappen Hentet" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Kan læse og skrive alle data i din mappe til hentede filer" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Læseadgang til mappen Hentet" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Kan læse alle data i din mappe til hentede filer" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Kan læse og skrive alle data i mappen" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Kan læse alle data i mappen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Ingen adgang til filsystemet" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Kan ikke tilgå nogen filer i filsystemet" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Programudvikler er bekræftet" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Det er blevet bekræftet, at udvikleren af programmet er, hvem de siger, de er" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Usikre afhængigheder" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Programmet eller dets afhængigheder understøttes ikke længere og kan være " +"usikre" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Dette program angiver ikke, hvilken licens det er udviklet under og kan være " +"proprietært" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Denne software angiver ikke, hvilken licens den er udviklet under og kan " +"være proprietært" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Proprietær kode" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Koden er ikke offentlig tilgængelig, så den kan ikke auditeres af uafhængige " +"personer og kan være usikker" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Dette program er udviklet under den specielle licens “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Denne software er udviklet under den specielle licens “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Kode kan auditeres" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Koden er offentligt tilgængelig og kan auditeres af uafhængige personer, " +"hvilket gør det mere sandsynligt, at programmet er sikkert" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s leveres af distributionen" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s er sikker" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s er sandsynligvis sikker" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s er muligvis usikker" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s er usikker" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Ukendt" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Sikkerhed" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licens" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Kilde" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "Udviklingsværktøj (SDK)" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Dette program bruger en forældet version af softwareplatformen (SDK) og kan " +"indeholde fejl eller sikkerhedshuller, som ikke vil blive rettet." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Forrige skærmbillede" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Næste skærmbillede" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Ingen skærmbilleder" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Skærmbilledet blev ikke fundet" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Kunne ikke indlæse billede" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Skærmbilledstørrelsen blev ikke fundet" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Kunne ikke oprette mellemlager" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Skærmbillede ugyldigt" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Skærmbillede ikke tilgængeligt" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Skærmbillede" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u match mere" +msgstr[1] "%u matches mere" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Søgeside" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Søg efter programmer" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Intet program fundet" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Kan ikke hente opdateringer" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Kan ikke hente firmwareopdateringer" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Kan ikke hente firmwareopdateringer fra %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Kunne ikke hente opdateringer fra %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Kan ikke opdatere: kræver internetadgang" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Kan ikke opdatere: ikke nok diskplads" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Kunne ikke hente opdateringer fra %s: ikke nok diskplads" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Kan ikke opdatere: kræver godkendelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Kan ikke opdatere: godkendelse var ugyldig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Kan ikke opdatere: kræver tilladelse" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Kunne ikke hente opdateringer: du har ikke rettigheder til at installere " +"software" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Kan ikke hente liste over opdateringer" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Kan ikke installere: download mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Kunne ikke installere %s: download fra %s mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Kan ikke installere %s: download mislykkedes" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Kan ikke installere: manglende runtime" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Kan ikke installere %s: kørselsmiljøet %s er ikke tilgængeligt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Kan ikke installere %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Kan ikke installere: kræver internetadgang" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Kan ikke installere: ugyldigt programformat" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Kan ikke installere: ikke nok diskplads" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Kan ikke installere %s: ikke nok diskplads" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Kan ikke installere: kræver godkendelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Kan ikke installere %s: kræver godkendelse" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Kan ikke installere: ugyldig godkendelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Kan ikke installere %s: ugyldig godkendelse" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Kan ikke installere: kræver tilladelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Kan ikke installere %s: kræver tilladelse" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Kan ikke installere: enhed skal være tilsluttet elnettet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Kan ikke installere %s: enhed skal være tilsluttet elnettet" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Kan ikke installere: lavt batteriniveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Kan ikke installere %s: lavt batteriniveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Kan ikke opdatere %s fra %s: download mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Kan ikke opdatere %s: download mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Kan ikke installere opdateringer fra %s: download mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Kan ikke opdatere: hentning mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Kan ikke opdatere %s: ikke nok diskplads" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Kan ikke opdatere %s: kræver godkendelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Kan ikke opdatere %s: ugyldig godkendelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Kan ikke opdatere %s: kræver tilladelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Kan ikke opdatere: enhed skal være tilsluttet elnettet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Kan ikke opdatere %s: enhed skal være tilsluttet elnettet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Kan ikke opdatere: lavt batteriniveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Kan ikke opdatere %s: lavt batteriniveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Kan ikke opdatere %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Kan ikke opdatere" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Kan ikke opgradere" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Kunne ikke opgradere fra %s til %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Kan ikke opgradere: hentning mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Kan ikke opgradere til %s: download mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Kan ikke opgradere: kræver internetadgang" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Kan ikke opgradere til %s: kræver internetadgang" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Kan ikke opgradere: ikke nok diskplads" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Kan ikke opgradere til %s: ikke nok diskplads" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Kan ikke opgradere: kræver godkendelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Kan ikke opgradere til %s: kræver godkendelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Kan ikke opgradere: ugyldig godkendelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Kan ikke opgradere til %s: ugyldig godkendelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Kan ikke opgradere: kræver tilladelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Kan ikke opgradere til %s: kræver tilladelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Kan ikke opgradere: enhed skal være tilsluttet elnettet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Kan ikke opgradere til %s: enhed skal være tilsluttet elnettet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Kan ikke opgradere: lavt batteriniveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Kan ikke opgradere til %s: lavt batteriniveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Kan ikke opgradere til %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Kan ikke afinstallere: kræver godkendelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Kan ikke afinstallere %s: kræver godkendelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Kan ikke afinstallere: ugyldig godkendelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Kan ikke afinstallere %s: ugyldig godkendelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Kan ikke afinstallere: kræver tilladelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Kan ikke afinstallere %s: kræver tilladelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Kan ikke afinstallere: enhed skal være tilsluttet elnettet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Kan ikke afinstallere %s: enhed skal være tilsluttet elnettet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Kan ikke afinstallere: lavt batteriniveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Kan ikke afinstallere %s: lavt batteriniveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Kan ikke afinstallere %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Kan ikke starte %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1940 +msgid "Sorry, something went wrong" +msgstr "Beklager, noget gik galt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Kunne ikke starte %s: %s er ikke installeret" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1920 +msgid "Not enough disk space for operation" +msgstr "Ikke nok diskplads til handlingen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Kan ikke installere: filtype understøttes ikke" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Kan ikke installere: godkendelse mislykkedes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Kan ikke installere" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Kan ikke kontakte %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1924 +msgid "Restart Software to use new plugins" +msgstr "Genstart Software for at bruge nye udvidelsesmoduler" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1928 +msgid "Device needs to be plugged in" +msgstr "Enhed skal være tilsluttet elnettet" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1931 +msgid "Battery level is too low" +msgstr "Batteriniveau er for lavt" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Softwarearkiver" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Indstillinger" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Tastaturgenveje" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Om Software" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Søg" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Hovedmenu" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Find programmer" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Udforsk" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Installerede" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Opdateringer" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Gå tilbage" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ingen" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Programdata" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Data programmet behøver for at køre" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Brugerdata" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Data genereret af dig i programmet" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Cachedata" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Midlertige cachedata" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Programmet selv" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Nødvendige afhængigheder" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Delte systemkomponenter dette program kræver" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Ukendt" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Cachedata kan ryddes i _programmets indstillinger" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Lager" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Installeret)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Installerer)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Henter)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Fjerner)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detaljer" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Undersøg" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Installeret på %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Installerede opdateringer" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Ingen opdateringer installeret" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Opdateringer er forældet" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Søg venligst efter tilgængelige opdateringer" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Kritiske opdateringer klar til at blive installeret" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Installér kritiske opdateringer så snart som muligt" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Kritiske opdateringer klar til at blive hentet" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Hent kritiske opdateringer så snart som muligt" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Opdateringer klar til at blive installeret" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Softwareopdateringer er klar og venter" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Opdateringer klar til at blive hentet" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Softwareopdateringer kan hentes" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u program opdateret — genstart nødvendig" +msgstr[1] "%u programmer opdateret — genstart nødvendig" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u program opdateret" +msgstr[1] "%u programmer opdateret" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s er blevet opdateret." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Genstart venligst programmet." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s og %s er blevet opdateret." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u program kræver en genstart." +msgstr[1] "%u programmer kræver en genstart." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inkluderer %s, %s og %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Systemet har nået slutningen af sin levetid" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Opgradér for fortsat at modtage opdateringer" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "En ny version af %s er klar til at blive installeret" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Softwareopgradering er tilgængelig" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Softwareopdateringer mislykkedes" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Forberedte opdateringer blev ikke installeret" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Vis detaljer" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Opgradering af systemet er fuldført" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Velkommen til %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Softwareopdatering installeret" +msgstr[1] "Softwareopdateringer installeret" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Der er blevet installeret en vigtig opdatering til styresystemet." +msgstr[1] "Der er blevet installeret vigtige opdateringer til styresystemet." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Gennemse" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Kunne ikke opdatere" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Systemet var allerede opdateret." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Opdateringen blev annulleret." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Internetadgang var påkrævet, men var ikke tilgængelig. Kontrollér venligst " +"om du har internetadgang og forsøg igen." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Der var sikkerhedsmæssige problemer med opdateringen. Konsultér venligst din " +"softwareudbyder for flere detaljer." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Der var ikke nok diskplads. Frigør venligst noget plads og forsøg igen." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Vi beklager: opdateringen kunne ikke installeres. Vent på en anden " +"opdatering og forsøg igen. Hvis problemet fortsætter kan du kontakte din " +"softwareudbyder." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Seneste søgning: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Stop" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Søg efter opdateringer" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s modtager ikke længere kritiske softwareopdateringer" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Dit styresystem modtager ikke længere kritiske softwareopdateringer" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Dette kan koste penge" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Det kan koste penge at søge efter opdateringer, når der bruges mobilbredbånd." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Søg _alligevel" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Softwareopgraderinger hentet" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Opgraderinger er klar til at blive installeret" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Søg efter opdateringer" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Opdateringer" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Opdateringsside" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Indlæser opdateringer" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Dette kan tage et stykke tid" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Opdateret" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Brug mobildata?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Det kan koste penge at søge efter opdateringer, når der bruges mobilbredbånd" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Søg alligevel" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Ingen forbindelse" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Gå online for at søge efter opdateringer" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Netværksindstillinger" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Fejl" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Opdateringer håndteres automatisk" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Softwareopdateringer sat på pause" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Automatiske softwareopdateringer er sat på pause af følgende grunde:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Den aktuelle netværksforbindelse er forbrugsafregnet" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Den aktuelle netværksforbindelse forhindrer hentning af store filer" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Strømsparetilstand er aktiv" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Spiltilstand er aktiv" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Softwareopdateringer sat på pause" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Forbrugsafregnet forbindelse — softwareopdateringer sat på pause" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Netværksforbindelse forhindrer hentning af store filer — " +"softwareopdateringer sat på pause" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Strømsparetilstand er aktiv — softwareopdateringer sat på pause" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Spiltilstand er aktiv — softwareopdateringer sat på pause" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Genstart og opdatér …" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "O_pdatér alle" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Softwareopdateringer hentet" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Opdateringer er klar til at blive installeret" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integreret firmware" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Kræver genstart" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Programopdateringer" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Enhedsfirmware" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Hent" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s er tilgængelig" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s er tilgængelig" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Lær om den nye version" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s af %s hentet" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u %% hentet" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "En stor opgradering med nye funktioner og mere finpudsning." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Annullér opgradering" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Genstart og opgradér …" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Husk at tage en sikkerhedskopi af dine data inden opgraderingen." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Fejldetaljer" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Kopiér detaljer" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Kunne ikke slette filen “%s”: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Kunne ikke slette mappen “%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Tilføj, fjern eller opdatér software på denne computer" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Opdateringer;Opgrader;Kilder;Pakkearkiver;Indstillinger;Installer;" +"Afinstaller;Program;Software;App;Butik;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s klar" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s er klar til at blive aktiveret og sat op til næste opstart." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Aktivér" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Systemopdateringer" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Generelle systemopdateringer, som f.eks. sikkerheds- eller fejlrettelser, " +"samt ydelsesforbedringer." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Opdatering af %s med nye funktioner og rettelser." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS-opdateringstjenesten kunne ikke hente og anvende opdateringen." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Webprogram" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Understøttelse af webprogrammer" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Kør populære webprogrammer i en browser" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Opgradér for at få de seneste funktioner samt forbedringer af ydelse og " +"stabilitet." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Understøttelse af Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak er et framework til skrivebordsprogrammer på Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Systemmappe %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Hjemmeundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Værtssystemmapper" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Værtssystemkonfiguration fra /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Skrivebordsmappe" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Skrivebordsundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Dokumentmappe" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Dokumentundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Musikmappe" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Musikundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Billedmappe" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Billedundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Delingsmappe" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Delingsundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Videomappe" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videoundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Skabelonmappe" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Skabelonundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Brugercachemappe" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Brugercacheundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Brugerkonfigurationsmappe" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Brugerkonfigurationsundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Brugerdatamappe" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Brugerdataundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Brugerkørselsmappe" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Brugerkørselsundermappe %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Filsystemadgang til %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Henter flatpak-metadata til %s …" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Kunne ikke tilpasse tilføjelsen “%s”: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Brugerinstallation" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Systeminstallation" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Program-id" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Kunne ikke tilføje udvidelsesmodulet “%s” til installationslisten: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" +"Kunne ikke tilføje udvidelsesmodulet “%s” til afinstallationslisten: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Fjernenheden “%s” tillader ikke installering af “%s” sandsynligvis på grund " +"af dens filter. Fjern filteret og gentag installeringen. Detaljeret fejl: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Systemets batteriniveau er for lavt til at gennemføre opdateringen" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Systemets batteriniveau er for lavt til at gennemføre opdateringen (%u %%, " +"%u %% er nødvendig)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Enheden kan ikke nås eller er uden for den trådløse rækkevidde" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Enhedens batteriniveau er for lavt" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Enhedens batteriniveau er for lavt (%u %%, %u %% er nødvendig)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Enheden venter på, at opdateringen udføres" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Enheden kræver, at strømforsyningen er tilsluttet" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Enhed kan ikke bruges, mens låget er lukket" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Enhedsopdatering til %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Systemopdatering til %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Indlejret styringsenhedsopdatering til %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "ME-opdatering til %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Virksomheds-ME-opdatering til %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Forbruger-ME-opdatering til %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Styringsenhedsopdatering til %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Thunderbolt-styringsenhedsopdatering til %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "CPU Microcode-opdatering til %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Konfigurationsopdatering til %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Batteriopdatering til %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Kameraopdatering til %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "TPM-opdatering til %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Pegepladeopdatering til %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Museopdatering til %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Tastaturopdatering til %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Opdatering til agerstyringsenheden %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Netværkskortopdatering til %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Skærmopdatering til %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "BMC-opdatering til %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "USB-modtageropdatering til %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Drevopdatering til %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Flashdrevopdatering til %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "SSD-opdatering til %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "GPU-opdatering til %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Dockopdatering til %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "USB-dockopdatering til %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Firmwareopdatering kunne ikke udføres: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Understøttelse af firmwareopgradering" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Giver understøttelse for firmwareopgraderinger" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Installér usigneret software?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Den software, der skal installeres, er ikke signeret. Det vil ikke være " +"muligt at kontrollere oprindelsen af opdateringer til denne software, eller " +"om der er blevet manipuleret med opdateringer." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Hent usigneret software?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Usignerede opdateringer er tilgængelige. Uden en signatur er det ikke muligt " +"at kontrollere opdateringens oprindelse, eller om der er blevet manipuleret " +"med den." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Opdatér usigneret software?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Usignerede opdateringer er tilgængelige. Uden en signatur er det ikke muligt " +"at kontrollere opdateringens oprindelse, eller om der er blevet manipuleret " +"med den. Softwareopdateringer er deaktiverede indtil usignerede opdateringer " +"enten fjernes eller opdateres." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Kunne ikke installere opdateringer: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pakker" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Kunne ikke vente på transaktionens afslutning før download: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Kunne ikke hente opdateringer: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Kunne ikke udløse opdatering: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Styresystem (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snapbutik" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Understøttelse af Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "En snap er en universel Linux-pakke" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +#| msgid "system" +msgid "System" +msgstr "System" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Systemkomponent" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Fjernelse af sysupdate-jobbet “%s” mislykkedes med status %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "En god måde at håndtere softwaren på dit system." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Vælg venligst et tal mellem 1 og %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Vælg et program:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s er nu installeret" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Et program er blevet fjernet" +#~ msgstr[1] "Programmer er blevet fjernet" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Kunne ikke finde “%s”" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Henter programkatalog" + +#~ msgid "Moderate page" +#~ msgstr "Administrer side" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Der er ingen anmeldelser at administrere" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Kunne du bruge anmeldelsen?" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgid "No" +#~ msgstr "Nej" + +#~ msgid "Meh" +#~ msgstr "Hmm" + +#~ msgid "Outdated SDK version" +#~ msgstr "Forældet SDK-version" + +#~ msgid "Unable to install updates" +#~ msgstr "Kan ikke installere opdateringer" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Kan ikke afinstallere: ugyldig godkendelse" + +#~ msgid "Network Settings" +#~ msgstr "Netværksindstillinger" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Systemopdateringer er ikke tilgængelige" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "En vigtig opdatering til styresystemet kunne ikke installeres." + +#~ msgid "No Network" +#~ msgstr "Intet netværk" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Der kræves internetadgang for at søge efter opdateringer." + +#~ msgid "Network _Settings" +#~ msgstr "_Netværksindstillinger" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Softwareopgraderinger er blevet hentet og er klar til at blive " +#~ "installeret." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Softwareopdateringer er blevet hentet og er klar til at blive installeret." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Henter opgraderingsinformation …" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automatiske opdateringer sat på pause" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Det nuværende netværk er forbrugsafregnet, så der kan være en begrænset " +#~ "mængde data til rådighed, eller det kan koste penge. For at spare på " +#~ "dataforbruget er automatiske opdateringer sat på pause.\n" +#~ "\n" +#~ "Er det nuværende netværk forkert blevet klassificeret som " +#~ "forbrugsafregnet, kan indstillingen ændres." + +#~ msgid "Open Network _Settings" +#~ msgstr "_Åbn netværksindstillinger" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "For at undgå udgifter og netværksbegrænsninger hentes programopdateringer " +#~ "ikke automatisk på en mobil eller forbrugsafregnet forbindelse." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "Om muligt hentes og installeres programopdateringer i baggrunden" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Vis kun _frie programmer" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "Vis kun frie programmer og skjul proprietære programmer" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Hvad kunne du godt lide ved programmet? Giver du feedback sammen med " +#~ "begrundelsen for din anmeldelse, kan det hjælpe andre." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Kunne ikke hente opdateringer: netværksadgang var påkrævet, men var ikke " +#~ "tilgængelig" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Kunne ikke hente opdateringer: ikke nok diskplads" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Kunne ikke hente opdateringer: godkendelse var påkrævet" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Kunne ikke hente opdateringer: godkendelse var ugyldig" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Kunne ikke installere %s: du har ikke rettigheder til at installere " +#~ "software" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Kunne ikke installere %s: batteriniveauet er for lavt" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Kunne ikke installere opdateringer: ikke nok diskplads" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Kunne ikke installere opdateringer: godkendelse var påkrævet" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Kunne ikke installere opdateringer: godkendelse var ugyldig" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Kunne ikke opdatere %s: du har ikke rettigheder til at opdatere software" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Kunne ikke installere opdateringer: du har ikke rettigheder til at " +#~ "opdatere software" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Kunne ikke installere opdateringer: strømforsyning er påkrævet" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Kunne ikke opdatere %s: batteriniveauet er for lavt" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Kunne ikke installere opdateringer: batteriniveauet er for lavt" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Kunne ikke opgradere til %s: netværksadgang var påkrævet, men var ikke " +#~ "tilgængelig" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Kunne ikke opgradere til %s: du har ikke rettigheder til at opgradere" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Kunne ikke opgradere til %s: batteriniveauet er for lavt" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Kunne ikke fjerne %s: godkendelse var påkrævet" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Kunne ikke fjerne %s: godkendelse var ugyldig" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Kunne ikke fjerne %s: du har ikke rettigheder til at fjerne software" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Kunne ikke fjerne %s: strømforsyning er påkrævet" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Kunne ikke fjerne %s: batteriniveauet er for lavt" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Kunne ikke fjerne %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Kunne ikke installere fil: understøttes ikke" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Kunne ikke installere: understøttes ikke" + +#~ msgid "AC power is required" +#~ msgstr "Strømforsyning er påkrævet" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "" +#~ "Forbrugsafregnet forbindelse ‒ automatiske opdateringer sat på pause" + +#~ msgid "Find Out _More" +#~ msgstr "Få _mere at vide" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "En vigtig systemopdatering er klar til at blive installeret." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Vigtigt: kritiske softwareopdateringer venter." + +#~ msgid "Show verbose debugging information" +#~ msgstr "Vis udvidet fejlsøgningsinformation" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Kan tilgå vilkårlige filer" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Er du sikker på, at du vil afinstallere %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s vil blive afinstalleret, og du skal installere det for at bruge det " +#~ "igen." + +#~ msgid "Downloading featured images…" +#~ msgstr "Henter udvalgte billeder …" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Valgte udvidelser vil blive installeret sammen med programmet." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "Tidsstemplet da systemet senest var online og modtog opdateringer" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Programmet er ikke tilgængeligt på dit sprog og vil derfor være på " +#~ "amerikansk engelsk." + +#~ msgid "Applications" +#~ msgstr "Programmer" + +#~ msgid "_Continue" +#~ msgstr "_Fortsæt" + +#~ msgid "Post Review" +#~ msgstr "Send anmeldelse" + +#~ msgid "_Post" +#~ msgstr "_Send" + +#~ msgid "Rating" +#~ msgstr "Vurdering" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Giv en kort opsummering af din anmeldelse, for eksempel: “Godt program, " +#~ "kan anbefales”." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Anmeldelse" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Hvad synes du om programmet? Prøv at give begrundelser for dine " +#~ "synspunkter." + +#~ msgid "No screenshot provided" +#~ msgstr "Intet skærmbillede angivet" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s …" + +#~ msgid "Restart Now" +#~ msgstr "Genstart nu" + +#~ msgid "Primary Menu" +#~ msgstr "Hovedmenu" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Opdateringer" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s understøttes ikke længere." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Dette betyder at det ikke modtager sikkerhedsopdateringer." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Det anbefales at du opgraderer til en nyere version." + +#~ msgid "Application Updates" +#~ msgstr "Programopdateringer" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Programhåndtering til GNOME" + +#~ msgid "A list of popular applications" +#~ msgstr "En liste over populære programmer" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "En liste over programmer som skal bruges frem for de systemdefinerede." + +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Softwarekataloget er ved at blive hentet" + +#~ msgid "Name" +#~ msgstr "Navn" + +#~ msgid "user" +#~ msgstr "bruger" + +#~ msgid "Channel" +#~ msgstr "Kanal" + +#~ msgid "Branch" +#~ msgstr "Gren" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Installation" + +#~ msgid "Version" +#~ msgstr "Version" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Ingen opdateringer er blevet installeret på dette system." + +#~ msgid "Checking…" +#~ msgstr "Søger …" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Indlæser …" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Henter programvurderinger …" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "URI'en som henviser til et opgraderingsbanners baggrund." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URI'en kan indeholde op til tre “%u”, som vil blive erstattet med " +#~ "opgraderingsversionen." + +#~ msgid "_Add shortcut" +#~ msgstr "_Tilføj genvej" + +#~ msgid "Re_move shortcut" +#~ msgstr "F_jern kilde" + +#~ msgid "Welcome" +#~ msgstr "Velkommen" + +#~ msgid "Welcome to Software" +#~ msgstr "Velkommen til Software" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Software giver dig mulighed for at installere al den software du har brug " +#~ "for fra ét samlet sted. Se vores anbefalinger, gennemse kategorierne " +#~ "eller søg efter de programmer du ønsker." + +#~ msgid "_Browse Software" +#~ msgstr "_Gennemse software" + +#~ msgid "OS Updates" +#~ msgstr "Systemopdateringer" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Inkluderer forbedringer af ydelse, stabilitet og sikkerhed." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Henter signatur til firmwareopdatering …" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Henter metadata til firmwareopdatering …" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Program har ukendte rettigheder" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Program kommer fra en kilde, der er tillid til" + +#~ msgid "Unknown Permissions" +#~ msgstr "Ukendte rettigheder" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Det vides ikke, hvilke rettigheder dette program behøver" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Program kommer fra en kilde, der er tillid til" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Din distribution har bekræftet, at der er tillid til programmet" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Vis dialogen for at installere fra ikke-frie softwarearkiver" + +#~ msgid "Select All" +#~ msgstr "Vælg alle" + +#~ msgid "Select None" +#~ msgstr "Vælg ingen" + +#~ msgid "Show" +#~ msgstr "Vis" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Filtermenu for underkategorier" + +#~ msgid "Sort" +#~ msgstr "Sortering" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Sorteringsmenu for underkategorier" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Tegneseriefigurer i farlige situationer" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Tegneseriefigurer i aggressiv konflikt" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Visuel fremstilling af vold som involverer tegneseriefigurer" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Karakterer, som er nemme at skelne fra virkeligheden, i farlige " +#~ "situationer" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Karakterer, som er nemme at skelne fra virkeligheden, i aggressiv konflikt" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Visuel fremstilling af vold som er nemt at skelne fra virkeligheden" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Lettere realistiske karakterer i farlige situationer" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Skildringer af realistiske karakterer i aggressiv konflikt" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Visuel fremstilling af vold som involverer realistiske karakterer" + +#~ msgid "No bloodshed" +#~ msgstr "Ingen blodsudgydelser" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Urealistiske blodsudgydelser" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Realistiske blodsudgydelser" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Skildringer af blodsudgydelser og lemlæstelse af kropsdele" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Voldtægt eller anden voldelig seksuel opførsel" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Referencer til alkoholiske drikke" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Brug af alkoholiske drikke" + +#~ msgid "References to illicit drugs" +#~ msgstr "Referencer til ulovlige stoffer" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Brug af ulovlige stoffer" + +#~ msgid "References to tobacco products" +#~ msgstr "Referencer til tobaksvarer" + +#~ msgid "Use of tobacco products" +#~ msgstr "Brug af tobaksvarer" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Kortvarig kunstnerisk nøgenhed" + +#~ msgid "Prolonged nudity" +#~ msgstr "Længerevarende nøgenhed" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provokerende referencer eller skildringer" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Seksuelle referencer eller skildringer" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Visuel fremstilling af seksuel opførsel" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Lettere eller sjælden brug af bandeord" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Moderat brug af bandeord" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Stærk eller udbredt brug af bandeord" + +#~ msgid "Slapstick humor" +#~ msgstr "Slapstick-humor" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Toilet- eller vulgær humor" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Voksen- eller seksuel humor" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativitet mod en specifik gruppe af mennesker" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Diskriminering med følelsesmæssig skade som formål" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Eksplicit diskriminering baseret på køn, seksualitet, race eller religion" + +#~ msgid "Product placement" +#~ msgstr "Product placement" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Eksplicitte referencer til specifikke brands eller varemærkede produkter" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Brugere opfordres til at købe specifikke ting fra den virkelige verden" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "" +#~ "Hasardspil om tilfældige lejligheder, med brug af spilletokens eller " +#~ "kredit" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Hasardspil med “legetøjs”-penge" + +#~ msgid "Gambling using real money" +#~ msgstr "Hasardspil med rigtige penge" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Brugere opfordres til at donere virkelige penge" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Mulighed for at bruge rigtige penge i programmet" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Bruger til bruger-interaktioner uden chatfunktionalitet" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Modereret chat-funktionalitet mellem brugere" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Ubegrænset lyd- eller video-chat-funktionalitet mellem brugere" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Deling af brugernavne eller e-mailadresser fra sociale netværk" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Søger efter den seneste version af programmet" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Deling af diagnostiske data som ikke lader andre identificere brugeren" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Deling af information som lader andre identificere brugeren" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Deler fysisk placering med andre brugere" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Indirekte referencer til homoseksualitet" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Personer af samme køn som kysser" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "" +#~ "Visuel fremstilling af seksuel opførsel mellem mennesker af samme køn" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Indirekte referencer til prostitution" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Direkte referencer til prostitution" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Visuel fremstilling af prostitution" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Indirekte referencer til utroskab" + +#~ msgid "Direct references to adultery" +#~ msgstr "Direkte referencer til utroskab" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Visuel fremstilling af utroskab" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Sparsomt påklædte personer" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Åbenlyst seksualiserede personer" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Fremstilling af eller referencer til historisk vanhelligelse" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Fremstilling af nutidig vanhelligelse" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Visuel fremstilling af nutidig vanhelligelse" + +#~ msgid "Visible dead human remains" +#~ msgstr "Synlige ligdele" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Ligdele i forfald" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Visuel fremstilling af ligskænding" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Fremstilling af eller referencer til historisk slaveri" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Fremstilling af nutidigt slaveri" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Visuel fremstilling af nutidigt slaveri" + +#~ msgid "General" +#~ msgstr "Generelt" + +#~ msgid "ALL" +#~ msgstr "ALLE" + +#~ msgid "Teen" +#~ msgstr "Teen" + +#~ msgid "Everyone 10+" +#~ msgstr "10+" + +#~ msgid "Everyone" +#~ msgstr "Alle" + +#~ msgid "Early Childhood" +#~ msgstr "Småbørn" + +#~ msgid "_Launch" +#~ msgstr "_Kør" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Kan ikke fastslå hvilke dele af systemet, dette program tilgår. Dette er " +#~ "typisk for ældre programmer." + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Ukendt" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Aldrig" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "Ukendt" + +#~ msgid "Low" +#~ msgstr "Lav" + +#~ msgid "Medium" +#~ msgstr "Middel" + +#~ msgid "High" +#~ msgstr "Høj" + +#~ msgid "Public domain" +#~ msgstr "Public domain" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://da.wikipedia.org/wiki/Offentligt_dom%C3%A6ne" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw.da.html" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Brugere er bundet af følgende licens:" +#~ msgstr[1] "Brugere er bundet af følgende licenser:" + +#~ msgid "Localized in your Language" +#~ msgstr "Oversat til dit sprog" + +#~ msgid "Release Activity" +#~ msgstr "Udgivelsesaktivitet" + +#~ msgid "Sandboxed" +#~ msgstr "Sandkassetilstand" + +#~ msgid "Released" +#~ msgstr "Udgivet" + +#~ msgid "Category" +#~ msgstr "Kategori" + +#~ msgid "Free" +#~ msgstr "Fri" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Dette betyder, at softwaren frit kan køres, kopieres, distribueres, " +#~ "undersøges og ændres." + +#~ msgid "Proprietary Software" +#~ msgstr "Proprietær software" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Dette betyder, at softwaren er ejet af en privat person eller et firma. " +#~ "Der er ofte begrænsninger for dets brug, og dets kildekode kan normalvis " +#~ "ikke tilgås." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Licens-betingelserne for dette software er ukendte." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Dette program er vurderet på denne måde, fordi det indeholder:" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Fjernet" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Installeret" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Opdateret" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Ukendt" + +#~ msgid "History" +#~ msgstr "Historik" + +#~ msgid "Format" +#~ msgstr "Format" + +#~ msgid "More…" +#~ msgstr "Flere …" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Anbefalede lyd- og videoprogrammer" + +#~ msgid "Recommended Games" +#~ msgstr "Anbefalede spil" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Anbefalede grafikprogrammer" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Anbefalede produktivitetsprogrammer" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Noget af dette software er proprietært, og der er derfor begrænsninger på " +#~ "dets brug og adgang til kildekoden." + +#~ msgid "Find out more…" +#~ msgstr "Få mere at vide …" + +#~ msgid "Recent Releases" +#~ msgstr "Seneste udgivelser" + +#~ msgid "Remove “%s”?" +#~ msgstr "Fjern “%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Deaktivér “%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Ingen yderligere arkiver" + +#~ msgid "_Remove…" +#~ msgstr "_Fjern …" + +#~ msgid "_Disable…" +#~ msgstr "_Deaktivér …" + +#~ msgid "Disabling" +#~ msgstr "Deaktiverer" + +#~ msgid "Enabled" +#~ msgstr "Aktiveret" + +#~ msgid "Disabled" +#~ msgstr "Deaktiveret" + +#~ msgid "ratings in total" +#~ msgstr "vurderinger i alt" + +#~ msgid "_Remove All" +#~ msgstr "_Fjern alle" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "I går, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Tre dage siden" + +#~ msgid "Four days ago" +#~ msgstr "Fire dage siden" + +#~ msgid "Five days ago" +#~ msgstr "Fem dage siden" + +#~ msgid "Six days ago" +#~ msgstr "Seks dage siden" + +#~ msgid "Two weeks ago" +#~ msgstr "To uger siden" + +#~ msgid "Looking for new updates…" +#~ msgstr "Søger efter nye opdateringer …" + +#~ msgid "Setting up updates…" +#~ msgstr "Sætter opdateringer op …" + +#~ msgid "Software is up to date" +#~ msgstr "Software er opdateret" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Opdateringerne anvendes, når computeren er blevet genstartet." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Venter på at hente %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Henter %s %s" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Alle" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Udvalgte" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Alle" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Udvalgte" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Alle" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Udvalgte" + +#~ msgid "Audio & Video" +#~ msgstr "Lyd og video" + +#~ msgid "Developer Tools" +#~ msgstr "Udviklerværktøjer" + +#~ msgid "Education & Science" +#~ msgstr "Uddannelse og videnskab" + +#~ msgid "Games" +#~ msgstr "Spil" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafik og fotografi" + +#~ msgid "Productivity" +#~ msgstr "Produktivitet" + +#~ msgid "Communication & News" +#~ msgstr "Kommunikation og nyheder" + +#~ msgid "Utilities" +#~ msgstr "Værktøjer" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS er en tjeneste, der giver brugeranmeldelser af programmer" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..ad20138 --- /dev/null +++ b/po/de.po @@ -0,0 +1,7901 @@ +# German translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Alexander Wilms , 2013. +# Bernd Homuth , 2015. +# Paul Seyfert , 2015, 2017. +# Wolfgang Stöggl , 2016-2017, 2020. +# Tim Sabsch , 2017-2024. +# Mario Blättermann , 2013, 2016-2018, 2020-2021. +# Philipp Kiemle , 2020-2025. +# Jürgen Benvenuti , 2022-2024. +# Christian Kirbach , 2015-2022. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-22 17:12+0000\n" +"PO-Revision-Date: 2025-03-27 11:47+0100\n" +"Last-Translator: Tim Sabsch \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.4.4\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Anwendungen installieren und aktualisieren" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Software ermöglicht es Ihnen, neue Anwendungen und Systemerweiterungen zu " +"finden und zu installieren sowie bereits installierte Anwendungen zu " +"entfernen." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Software präsentiert vorgestellte und beliebte Anwendungen mit nützlichen " +"Beschreibungen und mehreren Bildschirmfotos je Anwendung. Anwendungen können " +"entweder durch Stöbern in den verschiedenen Kategorien oder mithilfe der " +"Suchfunktion gefunden werden. Zudem ermöglicht es Ihnen, Ihr System mittels " +"einer Offline-Aktualisierung auf den neuesten Stand zu bringen." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Übersichtsseite" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Seite mit Details" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Seite der Installationen" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Seite mit Aktualisierungen" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Details zur Aktualisierung" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2768 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Das GNOME-Projekt" + +# https://rpmfusion.org/Howto/NVIDIA#Akmods +# https://github.com/rhboot/shim +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "akmods-Schlüssel in Shim-UEFI testen" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Zum Testen eines akmods-Schlüssels in Shim-UEFI ist eine Authentifizierung " +"erforderlich" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "akmods-Schlüssel für Shim-UEFI einrichten" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Zur Einrichtung eines akmods-Schlüssels in Shim-UEFI ist eine " +"Authentifizierung erforderlich" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "DKMS-Schlüssel in Shim-UEFI testen" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" +"Zum Testen eines DKMS-Schlüssels in Shim-UEFI ist eine Authentifizierung " +"erforderlich" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "DKMS-Schlüssel für Shim-UEFI einrichten" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" +"Zur Einrichtung eines DKMS-Schlüssels in Shim-UEFI ist eine " +"Authentifizierung erforderlich" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Eine Appstream-Datei im System installieren" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Eine Appstream-Datei wird im System installiert" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Eine Liste kompatibler Projekte" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Hier ist eine Liste kompatibler Projekte, die wir anzeigen sollten, z. B. " +"GNOME, KDE und XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Legt fest, ob Aktualisierungen und Systemaktualisierungen von GNOME-Software " +"verwaltet werden sollen" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Wenn deaktiviert, wird GNOME Software das Aktualisierungsfeld nicht " +"anzeigen, keine automatischen Aktualisierungen durchführen und keine " +"Systemaktualisierungen vorschlagen." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Aktualisierungen automatisch herunterladen und installieren" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Wenn aktiviert, wird GNOME Software Aktualisierungen automatisch und im " +"Hintergrund herunterladen und diejenigen installieren, die keinen Neustart " +"erfordern." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"Den Benutzer über Software benachrichtigen, die im Hintergrund aktualisiert " +"wird" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Wenn aktiviert, wird GNOME Software den Benutzer über Aktualisierungen " +"benachrichtigen, die durchgeführt wurden, während er inaktiv war." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Legt fest, ob automatisch aktualisiert werden soll, wenn die " +"Internetverbindung des Rechners volumenbasiert abgerechnet wird" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Wenn aktiviert, wird GNOME Software automatisch im Hintergrund aktualisiert, " +"auch wenn die Internetverbindung des Rechners volumenbasiert abgerechnet " +"wird. Dabei können Metadaten, Aktualisierungsinformationen, usw. " +"heruntergeladen werden, was Kosten für den Nutzer verursachen kann." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Legt fest, ob es die erste Ausführung von GNOME-Software ist" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Sternchenbewertungen neben den Anwendungen anzeigen" + +# Remote entspricht hier der Flatpak-Terminologie +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtern der Anwendungen in Abhängigkeit vom festgelegten Standard-Branch der " +"Gegenstelle" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Unfreie Anwendungen zeigen einen Warnhinweis, bevor sie installiert werden " +"können" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Wenn unfreie Anwendungen installiert werden, kann dieser Dialog angezeigt " +"werden. Diese Einstellung legt fest, ob die Meldung unterdrückt werden soll." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Zeitstempel der letzten Aktualisierungsanfrage" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Zeitstempel der Benachrichtigung zur letzten Systemaktualisierung" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Zeitstempel der Benachrichtigung zur letzten Systemaktualisierung" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Der Zeitstempel der ersten Sicherheitsaktualisierung, wird entfernt nach " +"einer Aktualisierung" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Zeitstempel der letzten Aktualisierung" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Das Alter in Sekunden, bis zu dem ein Bildschirmfoto des Upstream-Projekts " +"noch als aktuell angesehen wird" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Die Wahl eines größeren Werts verursacht weniger Datenaustausch mit dem " +"entfernten Server, aber Aktualisierungen der Bildschirmfotos benötigen mehr " +"Zeit, bis sie angezeigt werden. Ein Wert von 0 bedeutet, dass der Server " +"niemals abgefragt wird, wenn das Bild bereits im Zwischenspeicher vorhanden " +"ist." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Server zur Verwendung von Anwendungsrezensionen" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Mindest-Karma-Punktestand für Rezensionen" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" +"Rezensionen mit einem Karma unterhalb der angegebenen Punktezahl werden " +"nicht angezeigt." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Eine Liste von offiziellen Softwarequellen, die nicht als Drittanbieter " +"angesehen werden sollten" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Eine Liste von erforderlichen Softwarequellen, die nicht deaktiviert oder " +"entfernt werden können" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Eine Liste von offiziellen Softwarequellen, die als freie Software gelten " +"sollen" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Die Adresse der genutzten Lizenz für den Fall, dass die Software als frei " +"angesehen werden kann" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Mitgelieferte Anwendungen für alle Benutzer auf dem System installieren, " +"sofern möglich" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Zugriff auf den Softwarequellen-Dialog erlauben" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Systemaktualisierungen für Vorab-Veröffentlichungen anbieten" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Elemente der grafischen Oberfläche anzeigen, die den Benutzer auf den " +"unfreien Status einer Anwendung hinweisen" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Zeigen der installierten Größe in der Liste installierter Anwendungen" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://de.wikipedia.org/wiki/Proprietäre_Software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Adresse, die unfreie und proprietäre Software erklärt" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Eine Liste von Adressen von Appstream-Dateien, die in einen swcatalog-Ordner " +"heruntergeladen werden" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Die Appstream-Dateien systemweit für alle Benutzer installieren. Wenn " +"falsch, werden die Dateien in den Nicht-Standardordner $XDG_DATA_HOME/" +"swcatalog/xml gespeichert" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Prioritätsliste der Paketformate, bevorzugte Formate zuerst. Eine leere " +"Auflistung resultiert in der vorgegebenen Reihenfolge. Ausgelassene " +"Paketformate werden zuletzt gelistet. Paketformate können beispielsweise " +"sein: deb, flatpak, rpm, snap. Optional können die Formate mit einem " +"Ursprungssnamen angegeben werden, getrennt durch einen Doppelpunkt, zum " +"Beispiel »flatpak:flathub«." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Der Zeitstempel des letzten Versuchs, nicht verwendete Flatpak-Laufzeiten zu " +"entfernen" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Auf »wahr« setzen, um ausschließlich unter einer freien Lizenz verfügbare " +"Anwendungen anzuzeigen und alle proprietären Anwendungen zu verbergen." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Auf »wahr« setzen, um ausschließlich Anwendungen von Entwicklern anzuzeigen, " +"deren Identität verifiziert wurde." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Der Zeitstempel der zuletzt erhaltenen historischen Aktualisierungen." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Eine Zeichenkette, die die Kennung gnome-online-account zur Anmeldung " +"speichert" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME-Software systemweiter AppStream-Installer" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Befehlszeilenargumente konnten nicht gelesen werden" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Sie müssen genau einen Dateinamen angeben" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Dieses Programm kann nur durch den root-Benutzer ausgeführt werden" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Inhaltstyp konnte nicht bestätigt werden: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Konnte nicht verschoben werden: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Software-Installation" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Gewählte Software auf dem System installieren" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Gewalt in Cartoons" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Keine Informationen zu Gewalt in Cartoons" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantasie-Gewalt" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Keine Informationen zu Fantasie-Gewalt" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistische Gewalt" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Keine Informationen zu realistischer Gewalt" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Gewalt mit Blutvergießen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Keine Informationen zu Blutvergießen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Sexuelle Gewalt" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Keine Informationen zu sexueller Gewalt" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Keine Informationen zur Erwähnung von alkoholischen Getränken" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Betäubungsmittel" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Keine Informationen zur Erwähnung von unerlaubten Drogen/Medikamenten" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Keine Informationen zur Erwähnung von Tabakprodukten" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nacktheit" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Keine Informationen zu Nacktszenen irgendeiner Form" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Sexuelle Themen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Keine Informationen zu Anspielungen oder Darstellungen sexueller Natur" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Obszönität" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Keine Informationen zu Obszönität irgendeiner Art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Unangemessener Humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Keine Informationen zu unangemessenem Humor" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminierung" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Keine Informationen zu diskriminierender Sprache irgendeiner Art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Werbung" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Keine Informationen zu Werbung irgendeiner Art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Glücksspiel" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Keine Informationen zu Glücksspiel irgendeiner Art" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Käufe" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Keine Informationen zur Möglichkeit, reales Geld auszugeben" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Chat-Funktion zwischen Benutzern" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Keine Informationen zur Möglichkeit zum Chat mit anderen Benutzern" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Audio-Chat-Funktion zwischen Benutzern" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Keine Informationen zur Möglichkeit zum Gespräch mit anderen Benutzern" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontakt-Details" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Keine Informationen zum Teilen von Benutzernamen in sozialen Netzwerken oder " +"E-Mail-Adressen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identifizierende Informationen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Keine Informationen zum Teilen von Benutzerinformationen mit Dritten" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Teilen des Standorts" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Keine Informationen zum Teilen des physischen Aufenthaltsortes mit anderen " +"Benutzern" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualität" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Keine Informationen zur Erwähnung von Homosexualität" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitution" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Keine Informationen zur Erwähnung von Prostitution" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Ehebruch" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Keine Informationen zur Erwähnung von Ehebruch" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Sexualisierte Charaktere" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Keine Informationen zu sexualisierten Charakteren" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Schändung" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Keine Informationen zur Erwähnung von Schändung" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Menschliche Überreste" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Keine Informationen zu sichtbaren menschlichen Überresten" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Sklaverei" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Keine Informationen zur Erwähnung von Sklaverei" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Enthält keine Erwähnung von Drogen/Medikamenten" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" +"Enthält keine Schimpfwörter, Obszönität oder andere Arten an Kraftausdrücken" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Enthält keine Werbung oder finanzielle Transaktionen" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Enthält keinen Sexualakt oder Nacktszenen" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Enthält keine unkontrollierte Chat-Funktion" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Enthält keine Gewalt" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogen/Medikamente" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Kraftausdrücke" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Geld" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sozial" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Gewalt" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Alle" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s hat eine unbekannte Altersfreigabe" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s ist für alle Altersstufen geeignet" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s ist für Kleinkinder geeignet" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s ist für Kinder geeignet" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s ist für Kinder geeignet" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s ist für Teenager geeignet" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s ist für Erwachsene geeignet" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s ist für %s geeignet" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Altersfreigabe" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_So fügen Sie fehlende Informationen hinzu" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Lokale Datei" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paket" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Ausstehend" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Ausstehende Installation" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Ausstehendes Entfernen" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Installieren" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Entfernen" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Wird heruntergeladen" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Installieren" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Deinstallieren …" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Netzwerk" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Darf über das Netzwerk kommunizieren" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Systemdienste" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Über den System-Bus kann auf D-Bus-Dienste zugegriffen werden" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Sitzungsdienste" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Über den Sitzungs-Bus kann auf D-Bus-Dienste zugegriffen werden" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Geräte" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Darf auf beliebige Geräte zugreifen, z. B. Webcams" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Darf auf Eingabegeräte zugreifen" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Darf auf Mikrofone zugreifen und Audio wiedergeben" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Darf auf Systemdateien zugreifen" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Bildschirminhalte" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Darf auf Bildschirminhalte zugreifen" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Persönlicher Ordner" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Darf Dateien lesen, bearbeiten und erstellen" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Darf Dateien lesen" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Dateisystem" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Download-Ordner" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Einstellungen" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Darf alle Einstellungen sehen und verändern" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Veraltetes Anzeigesystem" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Verwendet ein veraltetes, unsicheres Anzeigesystem" + +# https://encyclopedia.kaspersky.com/glossary/sandbox-escape/ +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Sandbox-Ausbruch" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Kann aus der Sandbox ausbrechen und andere Beschränkungen umgehen" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Es stehen keine Details zur Aktualisierung bereit." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Aktualisierungsdetails" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Benötigt zusätzliche Berechtigungen" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Ungültige Bewertungsdaten vom Server erhalten" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Kommunikation mit dem Bewertungsserver fehlgeschlagen" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Rezensionen" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Für diese Anwendung gibt es keine Rezensionen." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Keine Rezensionen" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Versionshistorie" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Neu in Version %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Version %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Für diese Freigabe sind keine Details verfügbar" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%d. %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Startmodus: entweder »updates« (Aktualisierungen), »updated« (aktualisiert), " +"»installed« (installiert) oder »overview« (Übersicht)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODUS" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Nach Anwendungen suchen" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SUCHE" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Details zur Anwendung zeigen (mit der Kennung der Anwendung)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "Kennung" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Details zur Anwendung zeigen (mit Hilfe des Paketnamens)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PAKETNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Anwendung installieren (mit der Kennung der Anwendung)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Anwendung deinstallieren (mit der Kennung der Anwendung)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Ein lokales Paket öffnen" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "DATEINAME" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Die erwartete Interaktion für diese Aktion. Entweder »none« (keine), " +"»notify« (benachrichtigen) oder »full« (vollständig)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Eine lokale metainfo- oder appdata-Datei anzeigen" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Ausführliche Fehlerbehebungsausgabe aktivieren (von der laufenden Instanz, " +"falls diese bereits läuft)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installiert ausstehende Aktualisierungen im Hintergrund" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Einstellungen anzeigen" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Die laufende Instanz beenden" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Lokale Quelldateien dem AppStream vorziehen" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Versionsnummer anzeigen" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 GNOME Software-Mitwirkende" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Eduard Gotwig \n" +"Christian Kirbach \n" +"Benjamin Steinwender \n" +"Paul Seyfert \n" +"Bernd Homuth \n" +"Christian Kirbach \n" +"J.M. Ruetter \n" +"Mario Blättermann \n" +"Tim Sabsch \n" +"Philipp Kiemle \n" +"Jürgen Benvenuti " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Tut uns leid! Für diese Anwendung gibt es keine Details." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Installierte Größe" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Beinhaltet %s Daten und %s Zwischenspeicher" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Beinhaltet %s Daten" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Beinhaltet %s Zwischenspeicher" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Zwischenspeicher- und Datennutzung unbekannt" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Heruntergeladene Größe" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Keine zusätzlichen Systemdownloads erforderlich" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Unbekannte Größe an zusätzlichen Systemdownloads erforderlich" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "%s an zusätzlichen Systemdownloads erforderlich" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Größe ist unbekannt" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Keine Berechtigungen" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Hat Netwerkzugriff" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Verwendet Systemdienste" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Verwendet Sitzungsdienste" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Darf auf Hardware-Geräte zugreifen" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Darf auf Systemgeräte zugreifen" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Darf all Ihre Daten lesen/schreiben" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Darf all Ihre Daten lesen" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Darf Ihre Downloads lesen/schreiben" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Darf Ihre Downloads lesen" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Darf auf einige bestimmte Dateien zugreifen" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Darf Benutzereinstellungen lesen und ändern" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Verwendet ein veraltetes Anzeigesystem" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Darf beliebige Berechtigungen erhalten" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Der Software-Entwickler ist verifiziert" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Von Ihrer Betriebssystem-Distribution überprüft" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Überprüft durch %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Durch Dritte bereitgestellt" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Diese Software wird nicht mehr unterstützt" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Überprüfbarer Quellcode" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Unbekannte Lizenz" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Proprietärer Quellcode" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Besondere Lizenz" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Privilegiert" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Sicher" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Vermutlich sicher" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potenziell unsicher" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Unsicher" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Nur Mobilgeräte" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Funktioniert nur mit einem kleinen Bildschirm" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Nur Desktop" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Funktioniert nur auf einem großen Bildschirm" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Die Bildschirmgrößen stimmen nicht überein" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Ihre aktuelle Bildschirmgröße wird nicht unterstützt" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Erfordert einen Touchscreen" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Erfordert eine Tastatur" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Erfordert eine Maus" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Gamepad erforderlich" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Erfordert ein Gamepad zum Spielen" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptiv" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Funktioniert auf Mobiltelefonen, Tablets und Desktop-PCs" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Erfordert vermutlich eine Tastatur oder Maus" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Funktioniert auf Desktop-PCs und Laptops" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Enthält keine altersbeschränkten Inhalte" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Keine Informationen zur Altersfreigabe verfügbar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Internetseite besuchen" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Installieren …" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Abbrechen" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Installieren" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Herunterladen" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Aktualisieren" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Deinstallieren …" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Deinstallieren" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritische Aktualisierung" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Gerät kann während der Aktualisierung nicht verwendet werden." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Quelle: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Umbenannt von %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Empfangen von Aktualisierungen gestoppt" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritische Aktualisierung" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Installiert" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Helfen Sie, %s zu übersetzen" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s wurde von einer internationalen Gemeinschaft an Freiwilligen entworfen, " +"entwickelt und übersetzt.\n" +"\n" +"Während es noch nicht in Ihrer Sprache verfügbar ist, können Sie mithelfen " +"und es selbst übersetzen." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Übersetzungen" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Übersetzungs-Webseite" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Anmeldung auf %s erforderlich (Realm %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Anmeldung erforderlich" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Abbrechen" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "Anmel_den" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "Ben_utzer" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Passwort" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Andere" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Alle" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Vorgestellt" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Unsere Empfehlungen" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Neu & Aktualisiert" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Empfehlungen aus dem Internet" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Andere Software" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s installiert" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Ein Neustart ist erforderlich, damit die Änderungen wirksam werden" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Die Anwendung steht zur Nutzung bereit" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Systemaktualisierungen installiert" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "" +"Kürzlich installierte Aktualisierungen stehen für Bewertungen zur Verfügung" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Neustart" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Starten" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Software installieren?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Soll die Software von Drittanbietern installiert werden?" + +# Das klingt mehr nach einem Fenstertitel, ist kürzer - pk +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Softwarequelle aktivieren?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Soll die Softwarequelle von Drittanbietern aktiviert werden?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s ist nicht freie und quelloffene Software und wird durch »%s« " +"bereitgestellt." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s wird durch »%s« zur Verfügung gestellt." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Diese Softwarequelle muss aktiviert werden, um mit der Installation " +"fortzufahren." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"In manchen Ländern ist es möglicherweise illegal, %s zu installieren oder zu " +"benutzen." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"In manchen Ländern ist es möglicherweise illegal, diesen Codec zu " +"installieren oder zu benutzen." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Nicht erneut _warnen" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Aktivieren und _installieren" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "" +"Siehe nachfolgend die detaillierten Fehlermeldungen von der Paketverwaltung:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Details" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "S_chließen" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Details wurden in die Zwischenablage kopiert" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Akzeptieren" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Eine Aktualisierung wurde installiert" +msgstr[1] "Aktualisierungen wurden installiert" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Eine Anwendung wurde deinstalliert" +msgstr[1] "Anwendungen wurden deinstalliert" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Ein Neustart ist erforderlich, damit die Änderung wirksam wird" +msgstr[1] "Ein Neustart ist erforderlich, damit die Änderungen wirksam werden" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Jetzt nicht" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Heute" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Gestern" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Vor %d Tag" +msgstr[1] "Vor %d Tagen" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Vor %d Woche" +msgstr[1] "Vor %d Wochen" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Vor %d Monat" +msgstr[1] "Vor %d Monaten" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Vor %d Jahr" +msgstr[1] "Vor %d Jahren" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Gerade eben" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Vor %d Minute" +msgstr[1] "Vor %d Minuten" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Vor %d Stunde" +msgstr[1] "Vor %d Stunden" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Vorgestellt" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D-Grafik" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografie" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Scannen" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorgrafiken" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Betrachter" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Tonerzeugung und Tonbearbeitung" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Musikwiedergabe" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Vorgestellt" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalender" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Datenbank" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finanzwesen" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Textverarbeitung" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Texteditoren" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Internet-Browser" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Vorgestellt" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Action" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Abenteuer" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blockspiele" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Brettspiele" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kartenspiele" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatoren" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Kinderspiele" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logik" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rollenspiele" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategie" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Vorgestellt" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Unterhaltung" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Vorgestellt" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Künstliche Intelligenz" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomie" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chemie" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Sprachen" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Mathematik" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Nachrichten" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotik" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Kunst" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografie" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Comics" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fiktion" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Gesundheit" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Geschichte" + +# »Lifestyle« ist durchaus auch im Deutschen schon ein geflügeltes Wort, +# mit »Lebensgewohnheit« kann ich dagegen in diesem Zusammenhang gar nichts +# anfangen. +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Lifestyle" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politik" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Alle" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Vorgestellt" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Fehlerdiagnose" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Entwicklungsumgebungen" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecs" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Gerätetreiber" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Schriftarten" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Eingabequellen" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Sprachpakete" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalisierung" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Erstellen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Arbeit" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Spiele" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Sozial" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Lernen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Programmieren" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Gerätetreiber" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Schriftarten" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Eingabequellen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Sprachpakete" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalisierung" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Eine Anwendung" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s verlangt Unterstützung für zusätzliche Dateiformate." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Es werden zusätzliche MIME-Typen benötigt" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s benötigt zusätzliche Schriftarten." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Zusätzliche Schriftarten werden benötigt" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s benötigt zusätzliche Multimedia-Codecs." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Zusätzliche Multimedia-Codecs werden benötigt" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s benötigt zusätzliche Druckertreiber." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Zusätzliche Druckertreiber werden benötigt" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s benötigt zusätzliche Pakete." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Zusätzliche Pakete werden benötigt" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Software suchen" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Mehr anzeigen" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Weniger anzeigen" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Wird entfernt …" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Neustart erforderlich, um die Installation fertigzustellen" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Neustart erforderlich, um das Entfernen fertigzustellen" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Ausstehende Installation …" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Ausstehende Aktualisierung …" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Herunterladen …" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Wird vorbereitet …" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Deinstallieren …" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s ist nicht installiert, aber es sind noch Daten vorhanden." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Neu starten" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Aktivieren …" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Installieren …" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s wird in US-Englisch angezeigt" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Diese Anwendung wird in US-Englisch angezeigt" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Diese Anwendung wird in amerikanischem Englisch angezeigt" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Bei der Ü_bersetzung helfen" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Andere Anwendungen von %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Entwickler %s hat den Besitz von %s bewiesen" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Entwickler hat den Besitz von %s bewiesen" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "" +"Sie brauchen eine Verbindung mit dem Internet, um eine Bewertung abgeben zu " +"können" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Diese Anwendung erhält keine Aktualisierungen mehr, einschließlich " +"Sicherheitskorrekturen" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Diese Anwendung wird bereits von Ihrer Distribution angeboten und sollte " +"nicht ersetzt werden." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Diese Anwendung stellt keine Verweise zu einer Webseite, Quellcodeverwaltung " +"oder einem Fehlererfassungssystem bereit." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Diese Software erhält keine Aktualisierungen mehr, einschließlich " +"Sicherheitskorrekturen" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Diese Software wird bereits von Ihrer Distribution angeboten und sollte " +"nicht ersetzt werden." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Diese Software stellt keine Verweise zu einer Webseite, Quellcodeverwaltung " +"oder einem Fehlererfassungssystem bereit." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Software konnte keine Informationen für »%s« abrufen und kann keine Details " +"für diese Anwendung anzeigen." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Ungültige Bewertungsantwort vom Server erhalten" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Rezension für »%s« konnte nicht übermittelt werden: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Seite mit Details" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Anwendungsdetails werden geladen" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verifiziert" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "Ö_ffnen" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Akt_ualisieren" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Deinstallieren" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Erweiterungen" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Diese Anwendung kann nur bei bestehender Internetverbindung verwendet werden." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Softwarequelle eingeschlossen" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Diese Anwendung enthält eine Softwarequelle, die sowohl Aktualisierungen als " +"auch Zugriff auf weitere Software anbietet." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Keine Softwarequelle eingeschlossen" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Diese Anwendung enthält keine Softwarequelle. Sie wird nicht mit neuen " +"Versionen aktualisiert." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Softwarequelle identifiziert" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Hinzufügen dieser Softwarequelle gewährt Ihnen Zugriff auf zusätzliche " +"Software und Systemaktualisierungen." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Verwenden Sie nur Softwarequellen, denen Sie vertrauen." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Anwendungsdaten löschen" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Daten _löschen" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Keine Metadaten" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Projekt-_Webseite" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "Spen_den" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Ü_bersetzungen beitragen" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "Ein _Problem melden" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Hilfe" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontaktieren" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Rezension schreiben" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Alle Rezensionen" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Anwendungsdetails können nicht angezeigt werden" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Neustart konnte nicht vorbereitet werden" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Unbekannter Fehler" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Der Schlüssel wurde nicht gefunden" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Der Schlüssel ist nicht eingerichtet" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK-Einrichtung erforderlich" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Weiter" + +# Secure Boot übersetzen? - ts +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Bei diesem Gerät ist Secure Boot aktiviert. Damit neue Treiber aktiviert " +"werden können, muss ein neuer Maschinenbesitzerschlüssel (»Machine Owner " +"Key«, MOK) registriert werden. Für diesen Vorgang ist ein Passwort " +"erforderlich, das später eingegeben werden muss. Bitte notieren Sie sich das " +"folgende Passwort, das mit dem Schlüssel verbunden ist:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Ich habe mir mein MOK-_Passwort notiert" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Neu starten und einrichten …" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Anweisungen zur Einrichtung: Bitte sorgfältig lesen" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Nach dem Neustart wird ein Bildschirm zur Geräteeinrichtung angezeigt. Um " +"neue Treiber zu aktivieren, führen Sie die Einrichtungsschritte durch:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Wählen Sie »MOK einrichten«.\n" +"• Wählen Sie »Ja«, um Schlüssel einzurichten\n" +"• Geben Sie das MOK-Passwort ein, wenn Sie dazu aufgefordert werden\n" +"• Wählen Sie dann »Neustart«" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Sicherheitsimplikationen" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Bedenken Sie, dass nach erfolgreicher Schlüsseleinrichtung allen zukünftigen " +"Aktualisierungen des Moduls oder eines anderen Moduls automatisch vertraut " +"wird. Alle künftigen Aktualisierungen erfolgen transparent und ohne " +"Interaktion oder Legitimierung." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Weitere Informationen finden Sie in der Dokumentation." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Zusätzliche Metadaten-Dateien werden heruntergeladen …" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " und " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Verfügbare Schriften für das %s-Schriftsystem" +msgstr[1] "Verfügbare Schriften für die %s-Schriftsysteme" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Verfügbare Software für %s" +msgstr[1] "Verfügbare Software für %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Angeforderte Software nicht gefunden" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Die angeforderte Software kann nicht gefunden werden" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s wurde nicht gefunden" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "auf der Internetseite" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "" +"Es sind keine Anwendungen verfügbar, welche die Datei %s bereitstellen." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informationen über %s sowie Möglichkeiten, fehlende Anwendungen zu erhalten, " +"finden Sie %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Es sind keine Anwendungen für %s-Unterstützung verfügbar." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s ist nicht verfügbar." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informationen über %s sowie Möglichkeiten, eine Anwendung zu finden, die " +"dieses Format wiedergeben kann, finden Sie %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" +"Es sind keine Schriftarten für die Unterstützung des %s-Schriftsystems " +"verfügbar." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informationen über %s sowie Möglichkeiten, zusätzliche Schriften zu " +"erhalten, finden Sie %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Es sind keine zusätzlichen Codecs für das Format %s verfügbar." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informationen über %s sowie Möglichkeiten, einen Codec zu erhalten, der " +"dieses Format wiedergeben kann, finden Sie %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" +"Es sind keine Plasma-Ressourcen für die Unterstützung von %s verfügbar." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informationen über %s sowie Möglichkeiten, zusätzliche Plasma-Ressourcen zu " +"erhalten, finden Sie %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Es sind keine Druckertreiber für %s verfügbar." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informationen über %s sowie Möglichkeiten, einen Treiber zu erhalten, der " +"diesen Drucker unterstützt, finden Sie %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "Dokumentation" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"%s wurde nicht gefunden (angefordert von %s). Besuchen Sie %s für weitere " +"Informationen." +msgstr[1] "" +"%s wurden nicht gefunden (angefordert von %s). Besuchen Sie %s für weitere " +"Informationen." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "%s wurde nicht gefunden. Besuchen Sie %s für weitere Informationen." +msgstr[1] "" +"%s wurden nicht gefunden. Besuchen Sie %s für weitere Informationen." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Keine Suchergebnisse: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s-Dateiformat" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "_Alle installieren" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Die angeforderte Software kann nicht gefunden werden" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Seite mit Codecs" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Keine Ergebnisse gefunden" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Suche konnte nicht durchgeführt werden" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Vorherige" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Nächste" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Liste vorgestellter Anwendungen" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Desktop-Unterstützung" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Kann auf einem großen Bildschirm verwendet werden" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Desktop-Unterstützung unbekannt" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Nicht genügend Informationen über die Unterstützung großer Bildschirme " +"vorhanden" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Erfordert einen großen Bildschirm" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Desktop nicht unterstützt" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Kann auf einem großen Bildschirm nicht verwendet werden" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobilgeräte-Unterstützung" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Kann auf einem kleinen Bildschirm verwendet werden" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobilgeräte-Unterstützung unbekannt" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Nicht genügend Informationen über die Unterstützung kleiner Bildschirme " +"vorhanden" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Erfordert einen kleinen Bildschirm" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobilgeräte nicht unterstützt" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Kann auf einem kleinen Bildschirm nicht verwendet werden" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Tastatur-Unterstützung" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Tastatur-Unterstützung unbekannt" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" +"Nicht genügend Informationen über die Unterstützung von Tastaturen vorhanden" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Tastatur erforderlich" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Unterstützt Tastaturen" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tastatur nicht unterstützt" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Kann nicht mit Tastatur verwendet werden" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Maus-Unterstützung" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Erfordert eine Maus oder ein Zeigegerät" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Maus-Unterstützung unbekannt" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Nicht genügend Informationen über die Unterstützung von Mäusen oder " +"Zeigegeräten vorhanden" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Maus erforderlich" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Unterstützt Mäuse und Zeigegeräte" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Maus nicht unterstützt" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Kann nicht mit einer Maus oder einem Zeigegerät verwendet werden" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Touchscreen-Unterstützung" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Touchscreen-Unterstützung unbekannt" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Nicht genügend Informationen über die Unterstützung von Touchscreens " +"vorhanden" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Touchscreen erforderlich" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Unterstützt Touchscreens" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Touchscreen nicht unterstützt" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Kann auf einem Touchscreen nicht verwendet werden" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Gamepad erforderlich" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Erfordert ein Gamepad" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Gamepad-Unterstützung" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Unterstützt Gamepads" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s funktioniert vermutlich auf diesem Gerät" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s funktioniert auf diesem Gerät" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s funktioniert möglicherweise auf diesem Gerät" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s wird auf diesem Gerät nicht richtig funktionieren" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s wird auf diesem Gerät nicht funktionieren" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Hardware-Unterstützung" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigation" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Zur »Erkunden«-Seite gehen" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Zur »Installiert«-Seite gehen" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Zur »Aktualisierungen«-Seite gehen" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Suchleiste öffnen" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Fenster" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Einstellungen öffnen" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Softwarequellen öffnen" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Hilfe" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Tastenkürzel öffnen" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Installiert" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Installierte Seite" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "In Bearbeitung" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Anwendungen" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Web-Anwendungen" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Systemanwendungen" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Von der Gemeinschaft entwickelt" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "M_ithelfen" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Diese Anwendung wurde offen von einer internationalen Gemeinschaft " +"entwickelt und unter der »%s«-Lizenz veröffentlicht.\n" +"\n" +"Sie können daran mitwirken und die Software noch weiter verbessern." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Diese Anwendung wurde offen von einer internationalen Gemeinschaft " +"entwickelt und unter der »%s«-Lizenz veröffentlicht.\n" +"\n" +"Sie können daran mitwirken und die Software noch weiter verbessern." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Diese Software wurde offen von einer internationalen Gemeinschaft entwickelt " +"und unter der »%s«-Lizenz veröffentlicht.\n" +"\n" +"Sie können daran mitwirken und die Software noch weiter verbessern." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Diese Software wurde offen von einer internationalen Gemeinschaft entwickelt " +"und unter der »%s«-Lizenz veröffentlicht.\n" +"\n" +"Sie können daran mitwirken und die Software noch weiter verbessern." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Unbekannte Lizenz" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "Mehr er_fahren" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Diese Anwendung gibt nicht an, unter welcher Lizenz sie entwickelt wird, und " +"könnte proprietär sein. Es könnten schwer überprüfbare Sicherheitslücken " +"vorhanden sein, und es könnten Änderungen ohne Überprüfung auftreten.\n" +"\n" +"Sie können möglicherweise nicht zu dieser Anwendung beitragen." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Diese Software gibt nicht an, unter welcher Lizenz sie entwickelt wird, und " +"könnte proprietär sein. Es könnten schwer überprüfbare Sicherheitslücken " +"vorhanden sein, und es könnten Änderungen ohne Überprüfung auftreten.\n" +"\n" +"Sie können möglicherweise nicht zu dieser Anwendung beitragen." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Proprietär" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Diese Anwendung wird nicht öffentlich entwickelt, also wissen nur deren " +"Entwickler, wie sie funktioniert. Es könnten schwer erkennbare " +"Sicherheitslücken vorhanden sein, und es könnten Änderungen ohne Überprüfung " +"auftreten.\n" +"\n" +"Sie können wahrscheinlich nicht zu dieser Anwendung beitragen." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Diese Software wird nicht öffentlich entwickelt, also wissen nur deren " +"Entwickler, wie die Anwendung funktioniert. Es könnten schwer überprüfbare " +"Sicherheitslücken vorhanden sein, und es könnten Änderungen ohne Überprüfung " +"auftreten.\n" +"\n" +"Sie können wahrscheinlich nicht zu dieser Anwendung beitragen." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Besondere Lizenz" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Diese Anwendung wurde unter der besonderen Lizenz %s " +"entwickelt.\n" +"\n" +"Es ist unklar, ob Sie an der Anwendung mitwirken können." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Diese Anwendung wird unter der besonderen Lizenz »%s« entwickelt.\n" +"\n" +"Es ist unklar, ob Sie an der Anwendung mitwirken können." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Diese Software wurde unter der besonderen Lizenz %s " +"entwickelt.\n" +"\n" +"Es ist unklar, ob Sie an der Software mitwirken können." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Diese Software wird unter der besonderen Lizenz »%s« entwickelt.\n" +"\n" +"Es ist unklar, ob Sie an der Software mitwirken können." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Daten aktualisieren" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Seite wird geladen" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Starten" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Unbekannte Quelle" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Benutzer" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Hinzufügungen" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Entfernungen" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Aktualisierungen" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Herunterstufungen" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "ausgewählten externen Softwarequellen" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Bietet Zugriff auf zusätzliche Software von %s. Beinhaltet einige " +"proprietäre Anwendungen.\n" +"\n" +"Sie können diese Quellen später in den Einstellungen der Softwarequellen " +"aktivieren." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Sollen Softwarequellen von Drittanbietern aktiviert werden?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorieren" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Aktivieren" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Verfügbar für Ihr Betriebssystem" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Verfügbar für %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Erkunden" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Übersichtsseite" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Verfügbare Anwendungen" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Andere Kategorien" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Keine Anwendungsdaten gefunden" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Unbekannt" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Benutzer hat die Installation abgelehnt" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s vorbereiten" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Soll die Quelle %s wirklich entfernt werden?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Alle Anwendungen von %s werden deinstalliert. Sie müssen die Quelle erneut " +"installieren, um diese wieder nutzen zu können." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Soll %s deinstalliert werden?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Es wird nach dem Entfernen nicht möglich sein, %s zu verwenden." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Es wird nach dem Entfernen nicht möglich sein, irgendwelche Anwendungen zu " +"verwenden, die von %s abhängig sind." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Es wird nach dem Entfernen nicht möglich sein, %s zu verwenden. Dokumente, " +"die es verwenden, werden in einer anderen Schriftart erscheinen." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Es wird nach dem Entfernen nicht möglich sein, %s zu verwenden. Dadurch " +"können einige Mediendateien möglicherweise nicht mehr abgespielt werden." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Hardware, die von %s abhängt, funktioniert nach der Entfernung " +"möglicherweise nicht mehr richtig." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Es wird nach dem Entfernen nicht möglich sein, %s zu verwenden. " +"Anwendungsdaten und -einstellungen verbleiben auf dem Datenträger, um eine " +"zukünftige Wiederherstellung der Anwendung zu ermöglichen." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Einstellungen" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Software-Aktualisierungen" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Weitere Informationen" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Prüfen auf und Herunterladen von Aktualisierungen verbraucht Daten und " +"Strom. Automatische Aktualisierungsfunktionen werden daher in einem " +"getakteten Netzwerk und im Stromsparmodus pausiert." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatisch" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Automatisch auf Aktualisierungen prüfen und herunterladen" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manuell" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" +"Prüfen auf und Herunterladen von Aktualisierungen muss manuell erledigt " +"werden" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Benachrichtigungen bei automatischen Aktualisierungen" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Benachrichtigen, wenn Aktualisierungen automatisch installiert wurden" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Inhaltsfilter" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Ausschließlich _freie Software anzeigen" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Proprietäre Software beim Durchstöbern und Suchen verbergen" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Ausschließlich _verifizierte Entwickler anzeigen" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Nur Anwendungen von Entwicklern anzeigen, deren Identität verifiziert wurde" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Installierte Software ist nicht mit %s kompatibel und wird automatisch " +"während der Systemaktualisierung entfernt." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Nicht kompatible Software" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Aktualisierung" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Deinstallieren" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Anwendungseinstellungen und -daten" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Behalten" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "" +"Erlaubt die Wiederherstellung von Anwendungseinstellungen und -inhalten" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Löschen" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Löscht unwiderruflich Daten, um Laufwerksspeicher zu sparen" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Software, die aus »%s« installiert wurde, wird nicht länger Aktualisierungen " +"erhalten." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Softwarequelle deaktivieren?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Softwarequelle entfernen?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Deaktivieren" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Entfernen" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Neue Softwarequellen aktivieren" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Neue Softwarequellen werden aktiviert, sobald sie hinzugefügt werden" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "weitere Informationen" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Zusätzliche Softwarequellen von ausgewählten Drittanbietern — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Drittanbieter-Softwarequellen für Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "das Betriebssystem" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Diese Softwarequelle ergänzt die von %s gelieferte, voreingestellte Software." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Softwarequellen" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Keine Softwarequellen" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u Anwendung installiert" +msgstr[1] "%u Anwendungen installiert" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u Erweiterung installiert" +msgstr[1] "%u Erweiterungen installiert" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u Anwendung" +msgstr[1] "%u Anwendungen" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u Erweiterung" +msgstr[1] "%u Erweiterungen" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s und %s wurde installiert" +msgstr[1] "%s und %s wurden installiert" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Installierte Software wird überprüft …" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Entfernen" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Finde ich furchtbar" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Mag ich nicht" + +# Sagt in den Kommentaren "fairly good". Das bedeutet sowas wie "ziemlich gut". Ja, das ist anders als "it's OK", aber ich gehe nach dem Kommentar +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Ziemlich gut" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Mag ich" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Finde ich perfekt" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Einen Stern auswählen, um eine Bewertung zu hinterlassen" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Nehmen Sie sich bitte etwas mehr Zeit zum Schreiben der Rezension" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Bitte wählen Sie eine Sternchenbewertung" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Die Zusammenfassung ist zu kurz" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Die Zusammenfassung ist zu lang" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Die Beschreibung ist zu kurz" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Die Beschreibung ist zu lang" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Eine Rezension schreiben" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "Ab_senden" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Bitte geben Sie eine Bewertung, Zusammenfassung und Rezension an. " +"Rezensionen sollten nicht dazu verwendet werden, Fehler zu melden: " +"Kontaktieren Sie stattdessen den Entwickler oder Ihren Support." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Zusammenfassung der Rezension" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Eine kurze Rezension schreiben" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Informationen zum Umgang mit Ihren Daten finden Sie in unseren Datenschutzbestimmungen. Der " +"volle Name in Ihrem Benutzerkonto wird öffentlich dargestellt." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "Insgesamt %u Rezension" +msgstr[1] "Insgesamt %u Rezensionen" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "von 5 Sternen" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Unbekannt" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Sie können Rezensionen wegen abfälligem Verhalten, Diskriminierung oder " +"Missbrauch melden." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Sobald eine Rezension gemeldet wurde, wird sie solange verdeckt bleiben, bis " +"sie von einem Administrator geprüft worden ist." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Rezension melden?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Melden" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Rezension entfernen?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Das Entfernen einer Rezension kann nicht rückgängig gemacht werden." + +# Ganz glücklich bin ich damit nicht, aber »liken« und »disliken« als deutsche Verben möchte ich auch nicht verwenden. Wenn ihr bessere Ideen habt, gern her damit. - jb +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Rezension positiv bewerten" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Rezension negativ bewerten" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Melden …" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Entfernen …" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Anwendung läuft nicht in einer Sandbox, aber die Distribution hat sie auf " +"Bösartigkeit überprüft" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Überprüfen Sie, ob Sie dem Anbieter vertrauen – die Anwendung läuft nicht in " +"einer isolierten Sandbox" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Keine Berechtigungen" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Diese Anwendung läuft vollständig in einer isolierten Umgebung" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Netwerkzugriff" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Darf auf das Internet zugreifen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Kein Netwerkzugriff" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Darf nicht auf das Internet zugreifen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Verwendet Systemdienste" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Darf Daten von Systemdiensten verlangen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Verwendet Sitzungsdienste" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Darf Daten von Sitzungsdiensten verlangen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Benutzergerätezugriff" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Darf auf Geräte wie Webcams oder Gaming-Controller zugreifen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Kein Benutzergerätezugriff" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Darf nicht auf Geräte wie Webcams oder Gaming-Controller zugreifen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Eingabegerätezugriff" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Mikrofonzugriff und Audiowiedergabe" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Darf Mikrofone verwenden und Audio wiedergeben, ohne um Erlaubnis zu fragen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Systemgerätezugriff" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "Darf auf Systemgeräte zugreifen, die erweiterte Rechte benötigen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Zugriff auf Bildschirminhalte" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Darf auf die Inhalte des Bildschirms oder anderer Fenster zugreifen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Veraltetes Anzeigesystem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Beliebige Berechtigungen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Benutzereinstellungen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Lese-/Schreibzugriff auf das gesamte Dateisystem" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Darf alle Daten im Dateisystem lesen und schreiben" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Lese-/Schreibzugriff auf den persönlichen Ordner" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Darf alle Daten im persönlichen Ordner lesen und schreiben" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Lesezugriff auf das gesamte Dateisystem" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Darf alle Daten im Dateisystem lesen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Lesezugriff auf den persönlichen Ordner" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Darf alle Daten im persönlichen Ordner lesen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Lese-/Schreibzugriff auf den Download-Ordner" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Darf alle Daten im Download-Ordner lesen und schreiben" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Lesezugriff auf den Download-Ordner" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Darf alle Daten im Download-Ordner lesen" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Darf alle Daten im Ordner lesen und schreiben" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Darf alle Daten im Ordner lesen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Kein Dateisystemzugriff" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Darf überhaupt nicht auf das Dateisystem zugreifen" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Entwickler ist verifiziert" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Der Anwendungsentwickler hat seine Identität verifizieren lassen" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Unsichere Abhängigkeiten" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Die Software oder ihre Abhängigkeiten werden nicht mehr unterstützt und " +"könnten unsicher sein" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Die Anwendung gibt nicht an, unter welcher Lizenz sie entwickelt wird, und " +"könnte proprietär sein" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Die Software gibt nicht an, unter welcher Lizenz sie entwickelt wird, und " +"könnte proprietär sein" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Proprietärer Quellcode" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Der Quellcode ist nicht öffentlich und kann deshalb nicht von unabhängigen " +"Stellen überprüft werden. Er ist potentiell unsicher" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Diese Anwendung wird unter der besonderen Lizenz »%s« entwickelt" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Diese Software wird unter der besonderen Lizenz »%s« entwickelt" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Überprüfbarer Quellcode" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Der Quellcode ist öffentlich und kann deshalb von unabhängigen Stellen " +"überprüft werden. Dadurch ist die Anwendung mit höherer Wahrscheinlichkeit " +"sicher" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s ist privilegiert" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s ist sicher" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s ist wahrscheinlich sicher" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s ist potenziell unsicher" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s ist unsicher" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Unbekannt" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Sicherheit" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Lizenz" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Quelle" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Diese Anwendung verwendet eine veraltete Version der Softwareplattform (SDK) " +"und kann Fehler oder Sicherheitslücken enthalten, die nicht behoben werden." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Vorheriges Bildschirmfoto" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Nächstes Bildschirmfoto" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Keine Bildschirmfotos" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Bildschirmfoto nicht gefunden" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Bild konnte nicht geladen werden" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Bildschirmfotogröße nicht gefunden" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Zwischenspeicher konnte nicht erstellt werden" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Bildschirmfoto nicht gültig" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Bildschirmfoto nicht verfügbar" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Bildschirmfoto" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u weiterer Treffer" +msgstr[1] "%u weitere Treffer" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Suchseite" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Nach Anwendungen suchen" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Keine Anwendung gefunden" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "»%s«" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Herunterladen von Aktualisierungen nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Herunterladen von Firmware-Aktualisierungen nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Herunterladen von Firmware-Aktualisierungen von %s nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Herunterladen von Aktualisierungen von %s nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Aktualisierung nicht möglich: Internetverbindung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Aktualisierung nicht möglich: Zu wenig freier Speicherplatz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Herunterladen von Aktualisierungen von %s nicht möglich: Nicht genug freier " +"Speicherplatz verfügbar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Aktualisierung nicht möglich: Legitimierung notwendig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Aktualisierung nicht möglich: Legitimierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Aktualisierung nicht möglich: Berechtigung erforderlich" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Herunterladen von Aktualisierungen nicht möglich: Keine ausreichenden " +"Benutzerrechte, um Anwendungen zu installieren" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Aktualisierungsliste konnte nicht aktualisiert werden" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Installation nicht möglich: Herunterladen fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Installation von %s nicht möglich: Herunterladen von %s fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Installation von %s nicht möglich: Herunterladen fehlgeschlagen" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Installation nicht möglich: Fehlende Laufzeitumgebung" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Installation von %s nicht möglich: Laufzeit %s nicht verfügbar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Installation von %s nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Installation nicht möglich: Internetverbindung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Installation nicht möglich: Ungültiges Anwendungsformat" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Installation nicht möglich: Zu wenig freier Speicherplatz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Installation von %s nicht möglich: Zu wenig freier Speicherplatz" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Installation nicht möglich: Legitimierung notwendig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Installation von %s nicht möglich: Legitimierung notwendig" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Installation nicht möglich: Legitimierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Installation von %s nicht möglich: Legitimierung fehlgeschlagen" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Installation nicht möglich: Berechtigung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Installation von %s nicht möglich: Berechtigung erforderlich" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Installation nicht möglich: Stromanschluss notwendig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Installation von %s nicht möglich: Stromanschluss notwendig" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Installation nicht möglich: Niedriger Akkustand" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Installation von %s nicht möglich: Niedriger Akkustand" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "" +"Aktualisierung von %s aus %s nicht möglich: Herunterladen fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Aktualisierung von %s nicht möglich: Herunterladen fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Installation der Aktualisierungen von %s nicht möglich: Herunterladen " +"fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Aktualisierung nicht möglich: Herunterladen fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Aktualisierung von %s nicht möglich: Zu wenig freier Speicherplatz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Aktualisierung von %s nicht möglich: Legitimierung notwendig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Aktualisierung von %s nicht möglich: Legitimierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Aktualisierung von %s nicht möglich: Berechtigung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Aktualisierung nicht möglich: Stromanschluss notwendig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Aktualisierung von %s nicht möglich: Stromanschluss notwendig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Aktualisierung nicht möglich: Niedriger Akkustand" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Aktualisierung von %s nicht möglich: Niedriger Akkustand" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Aktualisierung von %s fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Aktualisierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Aktualisierung nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Systemaktualisierung von %s auf %s nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Aktualisierung nicht möglich: Herunterladen fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Aktualisierung von %s nicht möglich: Herunterladen fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Aktualisierung nicht möglich: Internetverbindung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Aktualisierung von %s nicht möglich: Internetverbindung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Aktualisierung nicht möglich: Zu wenig freier Speicherplatz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Aktualisierung von %s nicht möglich: Zu wenig freier Speicherplatz" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Aktualisierung nicht möglich: Legitimierung notwendig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Aktualisierung von %s nicht möglich: Legitimierung notwendig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Aktualisierung nicht möglich: Legitimierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Aktualisierung von %s nicht möglich: Legitimierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Aktualisierung nicht möglich: Berechtigung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Aktualisierung von %s nicht möglich: Berechtigung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Aktualisierung nicht möglich: Stromanschluss notwendig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Aktualisierung von %s nicht möglich: Stromanschluss notwendig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Aktualisierung nicht möglich: Niedriger Akkustand" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Aktualisierung von %s nicht möglich: Niedriger Akkustand" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Aktualisierung auf %s nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Deinstallation nicht möglich: Legitimierung notwendig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Deinstallation von %s nicht möglich: Legitimierung notwendig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Deinstallation nicht möglich: Legitimierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Deinstallation von %s nicht möglich: Legitimierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Deinstallation nicht möglich: Berechtigung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Deinstallation von %s nicht möglich: Berechtigung erforderlich" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Deinstallation nicht möglich: Stromanschluss notwendig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Deinstallation von %s nicht möglich: Stromanschluss notwendig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Deinstallation nicht möglich: Niedriger Akkustand" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Deinstallation von %s nicht möglich: Niedriger Akkustand" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Deinstallation von %s nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Starten von %s fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Hoppla! Etwas ist schief gegangen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Starten von %s fehlgeschlagen: %s ist nicht installiert" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Für den Vorgang ist nicht genug freier Speicherplatz vorhanden" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Installation nicht möglich: Dateityp wird nicht unterstützt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Installation nicht möglich: Legitimierung fehlgeschlagen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Installation nicht möglich" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "%s kann nicht kontaktiert werden" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "" +"Starten Sie GNOME Software neu, um die neuen Erweiterungen zu verwenden" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Gerät muss eingesteckt sein" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Akkustand ist zu niedrig" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Softwarequellen" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Einstellungen" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "Tasten_kürzel" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Info zu Software" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Suchen" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Hauptmenü" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Anwendungen suchen" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Erkunden" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Installiert" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "A_ktualisierungen" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Zurück gehen" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nichts" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Anwendungsdaten" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Zur Ausführung der Anwendung benötigte Daten" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Benutzerdaten" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Von Ihnen in der Anwendung generierte Daten" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Zwischenspeicher-Daten" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Temporär zwischengespeicherte Daten" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Die Anwendung selbst" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Erforderliche Abhängigkeiten" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Von dieser Anwendung benötigte gemeinsame Systemkomponenten" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Unbekannt" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Zwischengespeicherte Daten können über die _Anwendungseinstellungen gelöscht werden" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Speicher" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (installiert)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (wird installiert)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (wird heruntergeladen)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (wird entfernt)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Details" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Untersuchen" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Installiert am %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Installierte Aktualisierungen" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Keine Aktualisierungen installiert" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Aktualisierungen sind veraltet" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Bitte suchen Sie nach verfügbaren Aktualisierungen" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Sicherheitsrelevante Aktualisierungen bereit zur Installation" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "" +"Sicherheitsrelevante Aktualisierungen so schnell wie möglich installieren" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Sicherheitsrelevante Aktualisierungen zum Herunterladen verfügbar" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "" +"Sicherheitsrelevante Aktualisierungen so schnell wie möglich herunterladen" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Aktualisierungen bereit zur Installation" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Aktualisierungen bereit und ausstehend" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Aktualisierungen zum Herunterladen verfügbar" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Software-Aktualisierungen können heruntergeladen weden" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u Anwendung aktualisiert – Neustart erforderlich" +msgstr[1] "%u Anwendungen aktualisiert – Neustart erforderlich" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u Anwendung aktualisiert" +msgstr[1] "%u Anwendungen aktualisiert" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s wurde aktualisiert." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Bitte starten Sie die Anwendung neu." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s und %s wurden aktualisiert." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u Anwendung erfordert einen Neustart." +msgstr[1] "%u Anwendungen erfordern einen Neustart." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Beinhaltet %s, %s und %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Das System wird nicht länger unterstützt (»End of Life«, EOL)" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "" +"Aktualisieren Sie Ihr System, um weiterhin Aktualisierungen zu erhalten" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Eine neue Version von %s steht zur Installation bereit" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Software-Systemaktualisierung verfügbar" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Software-Aktualisierungen fehlgeschlagen" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Vorbereitete Aktualisierungen wurden nicht installiert" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Details anzeigen" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Betriebssystemaktualisierung ist abgeschlossen" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Willkommen zu %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Software-Aktualisierung installiert" +msgstr[1] "Software-Aktualisierungen installiert" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Eine wichtige Betriebssystemaktualisierung wurde installiert." +msgstr[1] "Wichtige Betriebssystemaktualisierungen wurden installiert." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Ansehen" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Aktualisierung fehlgeschlagen" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Das System ist bereits auf dem neusten Stand." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Die Aktualisierung wurde abgebrochen." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Internetzugang war erforderlich, aber nicht verfügbar. Bitte stellen Sie " +"sicher, dass ein Internetzugang vorhanden ist und versuchen Sie es erneut." + +# Sollte dann nicht auch gleich auf eine fehlerhafte Signatur hingewiesen werden? +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Es gab ein Sicherheitsproblem mit der Aktualisierung. Bitte wenden Sie sich " +"an den Autor bzw. Hersteller des Programms für weitere Einzelheiten." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Es ist nicht genug freier Speicher vorhanden. Bitte schaffen Sie ein " +"bisschen Platz und versuchen Sie es anschließend erneut." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Leider konnte die Aktualisierung nicht installiert werden. Bitte warten Sie " +"auf eine neue Aktualisierung und versuchen Sie es erneut. Sollte das Problem " +"bestehen bleiben, treten Sie bitte mit dem Autor/Hersteller in Kontakt." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Zuletzt überprüft: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Stopp" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Nach Aktualisierungen suchen" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "" +"%s %s wird nicht mehr mit sicherheitsrelevanten Software-Aktualisierungen " +"versorgt" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Ihr Betriebssystem wird nicht mehr mit sicherheitsrelevanten Software-" +"Aktualisierungen versorgt" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Kosten könnten anfallen" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Ein Suchen nach Aktualisierungen über mobiles Breitband kann Ihnen Kosten " +"verursachen." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Trotzdem prüfen" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Software-Aktualisierungen wurden heruntergeladen" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Aktualisierungen sind bereit zur Installation" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Nach Aktualisierungen suchen" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Aktualisierungen" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Seite mit Aktualisierungen" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Aktualisierungen werden geladen" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Das kann einen Moment dauern" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Auf dem neuesten Stand" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Mobiles Breitband nutzen?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Die Suche nach Aktualisierungen über mobiles Breitband kann Ihnen Kosten " +"verursachen" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "Trotzdem _prüfen" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Keine Verbindung" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Gehen Sie online, um nach Aktualisierungen zu suchen" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Netzwerkeinstellungen" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Fehler" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Aktualisierungen werden automatisch verwaltet" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Software-Aktualisierungen pausiert" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automatische Software-Aktualisierungen wurden aus den folgenden Gründen " +"pausiert:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Die aktuelle Netzwerkverbindung ist getaktet" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Die aktuelle Netzwerkverbindung verhindert große Downloads" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Energiesparmodus ist aktiviert" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Spielmodus ist aktiv" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Software-Aktualisierungen pausiert" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Netzwerkverbindung ist getaktet — Software-Aktualisierungen pausiert" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Netzwerkverbindung verhindert große Downloads — Software-Aktualisierungen " +"pausiert" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Energiesparmodus aktiviert – Software-Aktualisierungen pausiert" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Spielmodus ist aktiv – Software-Aktualisierungen pausiert" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Neu starten und aktualisieren …" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Alle _aktualisieren" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Software-Aktualisierungen wurden heruntergeladen" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Aktualisierungen sind bereit zur Installation" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integrierte Firmware" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Neustart erforderlich" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Anwendungsaktualisierungen" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Geräte-Firmware" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "Herunterla_den" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s verfügbar" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s verfügbar" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Mehr über die neue Version erfahren" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s von %s heruntergeladen" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% heruntergeladen" + +# CHECK +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "" +"Eine größere Aktualisierung mit neuen Funktionen und überarbeiteter " +"Oberfläche." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Aktualisierung abbrechen" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Neu starten und aktualisieren …" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Denken Sie daran, Dateien zu sichern, bevor Sie aktualisieren." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Fehlerdetails" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Details kopieren" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Löschen der Datei »%s« ist fehlgeschlagen: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Löschen des Ordners »%s« ist fehlgeschlagen: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Software auf diesem Rechner hinzufügen, entfernen oder aktualisieren" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Aktualisierungen;Systemaktualisierung;Quellen;Einstellungen;Installieren;" +"Entfernen;Programm;Software;App;Store;Anwendung;Update;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s bereit" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s ist bereit und wird beim nächsten Neustart aktiviert." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Aktivieren" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Systemaktualisierungen" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Allgemeine Systemaktualisierungen wie die Behebung von Sicherheitslücken " +"oder Fehlern, und Leistungsverbesserungen." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Eine Aktualisierung von %s mit neuen Funktionen und Fehlerbehebungen." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Der EOS-Aktualisierungsdienst konnte die Aktualisierung nicht empfangen und " +"anwenden." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Web-App" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Unterstützung für Web-Anwendungen" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Beliebte Web-Anwendungen in einem Browser ausführen" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Aktualisieren Sie Ihr System, um die neuesten Funktionen und Verbesserungen " +"zu erhalten." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak-Unterstützung" + +# Ich gebe zu, das ist frei uebersetzt - was besseres fiel mir nicht ein. FH. +# -- +# Ich habe das mal ein bisschen gekürzt. Der Duden und auch Wikipedia definieren »Framework« als »Programmiergerüst«, wobei der Duden auch das unübersetzte, großgeschriebene Original kennt . Bessere Vorschläge sind wie immer gerne erwünscht. - jb +# -- +# MMn müssen wir nicht zwanghaft für jedes Wort eine deutsche Übersetzung finden - unter "Framework" kann man sich auch als Laie etwas vorstellen. Wenn man das englische Wort nicht versteht, versteht man heutzutage vermutlich sowieso wenig von Computern und kann mit dem Konzept nichts anfangen - pk +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak ist ein Framework für Linux-Desktop-Anwendungen" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Systemordner %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Persönlicher Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Wirtssystem-Ordner" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Wirtssystem-Konfiguration aus /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Schreibtisch-Ordner" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Schreibtisch-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Dokumente-Ordner" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Dokumente-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Musik-Ordner" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Musik-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Bilder-Ordner" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Bilder-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Öffentlich-Ordner" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Öffentlich-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Videos-Ordner" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videos-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Vorlagen-Ordner" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Vorlagen-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Benutzer-Zwischenspeicher-Ordner" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Benutzer-Zwischenspeicher-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Benutzerkonfiguration-Ordner" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Benutzerkonfiguration-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Benutzerdaten-Ordner" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Benutzerdaten-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Benutzer-Laufzeit-Ordner" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Benutzer-Laufzeit-Unterordner %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Dateisystemzugriff auf %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Flatpak-Metadaten für %s werden geholt …" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Erweiterung »%s« konnte nicht präzisiert werden: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Benutzerinstallation" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Systeminstallation" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Anwendungskennung" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Erweiterung »%s« konnte nicht zur Installation hinzugefügt werden: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" +"Erweiterung »%s« konnte nicht zur Deinstallation hinzugefügt werden: %s" + +# Remote entspricht hier der Flatpak-Terminologie +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Die Gegenstelle »%s« erlaubt die Installation von »%s« nicht, möglicherweise " +"aufgrund eines Filters. Entfernen Sie den Filter und wiederholen Sie die " +"Installation. Fehlerdetails: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "System-Energie ist zu niedrig, um die Aktualisierung durchzuführen" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"System-Energie ist zu niedrig, um die Aktualisierung durchzuführen (%u%%, " +"erfordert %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "" +"Gerät ist nicht erreichbar, oder es befindet sich außerhalb des drahtlosen " +"Bereichs" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Der Akkustand des Gerätes ist zu niedrig" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Akkustand des Gerätes ist zu niedrig (%u%%, erfordert %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Gerät wartet darauf, dass die Aktualisierungen angewendet werden" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Gerät benötigt Netzanschluss, um verbunden zu sein" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Gerät kann nicht verwendet werden, während der Deckel geschlossen ist" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Geräteaktualisierung für %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Systemaktualisierung für %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Aktualisierung des eingebetteten Geräts %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "ME-Aktualisierung für %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Kommerzielle ME-Aktualisierung für %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Anwender-ME-Aktualisierung für %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Steuergerät-Aktualisierung für %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Thunderbolt-Steuergerät-Aktualisierung für %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "CPU-Microcode-Aktualisierung für %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Konfigurationsaktualisierung für %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Akku-Aktualisierung für %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Kamera-Aktualisierung für %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "TPM-Aktualisierung für %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Tastfeld-Aktualisierung für %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Maus-Aktualisierung für %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Tastatur-Aktualisierung für %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Speicher-Steuergerät-Aktualisierung für %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Netzwerkschnittstellen-Aktualisierung für %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Bildschirmaktualisierung für %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "BMC-Aktualisierung für %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Aktualisierung %s für USB-Empfänger" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Laufwerk-Aktualisierung für %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Flash-Laufwerk-Aktualisierung für %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "SSD-Aktualisierung für %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "GPU-Aktualisierung für %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Dock-Aktualisierung für %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "USB-Dock-Aktualisierung für %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Die Firmware-Aktualisierung konnte nicht angewendet werden: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Unterstützung für Firmware-Aktualisierungen" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Stellt Unterstützung für Firmware-Aktualisierungen bereit" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Unsignierte Software installieren?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Es soll unsignierte Software installiert werden. Ohne Signatur wird es nicht " +"möglich sein, den Ursprung von Aktualisierungen für diese Software zu " +"überprüfen oder ob Aktualisierungen manipuliert wurden." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Unsignierte Software herunterladen?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Es sind unsignierte Aktualisierungen verfügbar. Ohne Signatur ist es nicht " +"möglich, den Ursprung einer Aktualisierung zu überprüfen oder ob sie " +"manipuliert wurde." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Unsignierte Software aktualisieren?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Es sind unsignierte Aktualisierungen verfügbar. Ohne Signatur ist es nicht " +"möglich, den Ursprung einer Aktualisierung zu überprüfen oder ob sie " +"manipuliert wurde. Softwareaktualisierungen werden deaktiviert, bis " +"unsignierte Aktualisierungen entweder entfernt oder aktualisiert wurden." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Installation der Aktualisierungen ist fehlgeschlagen: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pakete" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "" +"Es konnte vor dem Herunterladen nicht auf das Transaktionsende gewartet " +"werden: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Herunterladen von Aktualisierungen fehlgeschlagen: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Auslösen der Aktualisierung fehlgeschlagen: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Betriebssystem (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Unterstützung von Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Ein Snap ist ein universelles Linux-Paket" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "System" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Systemkomponente" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Sysupdate-Job »%s« mit dem Status »%i« fehlgeschlagen" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Ein einfacher Weg, um Software auf Ihrem System zu verwalten." + +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Bitte geben Sie eine Zahl von 1 bis %u ein: " + +#~ msgid "Choose an app:" +#~ msgstr "Wählen Sie eine Anwendung:" + +#~ msgid "%s is now installed" +#~ msgstr "%s ist jetzt installiert" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Eine Anwendung wurde entfernt" +#~ msgstr[1] "Anwendungen wurden entfernt" + +#~ msgid "Unable to find “%s”" +#~ msgstr "»%s« konnte nicht gefunden werden" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Software-Katalog wird heruntergeladen" + +#~ msgid "Moderate page" +#~ msgstr "Moderationsseite" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Es stehen keine Rezensionen zur Moderation zur Verfügung" + +#~ msgid "Was this review useful to you?" +#~ msgstr "War diese Rezension hilfreich für Sie?" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgid "No" +#~ msgstr "Nein" + +#~ msgid "Meh" +#~ msgstr "Hm" + +#~ msgid "Outdated SDK version" +#~ msgstr "Veraltete SDK-Version" + +#~ msgid "Unable to install updates" +#~ msgstr "Installation von Aktualisierungen nicht möglich" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Deinstallation nicht möglich: Legitimierung fehlgeschlagen" + +#~ msgid "Network Settings" +#~ msgstr "Netzwerkeinstellungen" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Betriebssystemaktualisierungen sind nicht verfügbar" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "" +#~ "Eine wichtige Betriebssystemaktualisierung konnte nicht installiert " +#~ "werden." + +#~ msgid "No Network" +#~ msgstr "Kein Netzwerk" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "" +#~ "Für die Suche nach Aktualisierungen ist Zugriff auf das Internet " +#~ "notwendig." + +#~ msgid "Network _Settings" +#~ msgstr "_Netzwerkeinstellungen" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Software-Aktualisierungen wurden heruntergeladen und stehen zur " +#~ "Installation bereit." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Software-Aktualisierungen wurden heruntergeladen und stehen zur " +#~ "Installation bereit." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Systemaktualisierungsinformationen werden heruntergeladen …" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Eine wichtige Software-Aktualisierung ist bereit zur Installation." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Wichtig: Sicherheitsrelevante Software-Aktualisierungen warten." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Bitte laden Sie ausstehende Software-Aktualisierungen herunter." + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Was hat Ihnen an dieser Anwendung gefallen? Wenn Sie Ihre Rückmeldung " +#~ "zusammen mit Ihren Gründen für eine Bewertung hinterlassen, ist das " +#~ "hilfreich für andere." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automatische Aktualisierungen pausiert" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Die aktuelle Netzwerkverbindung ist getaktet. Getaktete Verbindungen " +#~ "besitzen ein beschränktes Datenvolumen oder damit verbundene Kosten. Um " +#~ "das Datenvolumen zu reduzieren, wurden automatische Aktualisierungen " +#~ "pausiert.\n" +#~ "\n" +#~ "Sollte die aktuelle Netzwerkverbindung fälschlicherweise als getaktet " +#~ "identifiziert worden sein, können Sie dies in den Einstellung ändern." + +#~ msgid "Open Network _Settings" +#~ msgstr "_Netzwerkeinstellungen öffnen" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Herunterladen von Aktualisierungen nicht möglich: Internet-Zugriff war " +#~ "erforderlich, jedoch nicht verfügbar" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "" +#~ "Herunterladen von Aktualisierungen nicht möglich: Es war nicht genug " +#~ "freier Speicherplatz vorhanden" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "" +#~ "Herunterladen von Aktualisierungen nicht möglich: Anmeldedaten werden zur " +#~ "Legitimierung benötigt" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "" +#~ "Herunterladen von Aktualisierungen nicht möglich: Legitimierung war nicht " +#~ "erfolgreich" + +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Installation von %s nicht möglich: Keine ausreichenden Benutzerrechte, um " +#~ "Anwendungen zu installieren" + +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Installation von %s nicht möglich: Akkustand zu niedrig" + +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "" +#~ "Installation von Aktualisierungen fehlgeschlagen: Es ist nicht genug " +#~ "freier Speicherplatz vorhanden" + +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "" +#~ "Installation von Aktualisierungen nicht möglich: Legitimierung notwendig" + +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "" +#~ "Installation von Aktualisierungen nicht möglich: Legitimierung " +#~ "fehlgeschlagen" + +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Aktualisierung von %s nicht möglich: Keine ausreichenden Benutzerrechte, " +#~ "um Aktualisierungen zu installieren" + +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Installation von Aktualisierungen nicht möglich: Keine ausreichenden " +#~ "Benutzerrechte, um Aktualisierungen zu installieren" + +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Installation von Aktualisierungen nicht möglich: Netzanschluss notwendig" + +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Aktualisierung von %s nicht möglich: Akkustand zu niedrig" + +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "Installation von Aktualisierungen nicht möglich: Akkustand zu niedrig" + +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Systemaktualisierung auf %s fehlgeschlagen: Internet-Zugriff war " +#~ "erforderlich, jedoch nicht verfügbar" + +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Systemaktualisierung auf %s nicht möglich: Keine ausreichenden " +#~ "Benutzerrechte zur Systemaktualisierung" + +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Systemaktualisierung auf %s nicht möglich: Akkustand zu niedrig" + +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Entfernen von %s nicht möglich: Legitimierung notwendig" + +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Entfernen von %s nicht möglich: Legitimierung fehlgeschlagen" + +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Entfernen von %s nicht möglich: Keine ausreichenden Benutzerrechte, um " +#~ "Anwendungen zu entfernen" + +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Entfernen von %s nicht möglich: Netzanschluss notwendig" + +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Entfernen von %s nicht möglich: Akkustand zu niedrig" + +#~ msgid "Unable to remove %s" +#~ msgstr "Entfernen von %s nicht möglich" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Installation der Datei schlug fehl: nicht unterstützt" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Installation schlug fehl: nicht unterstützt" + +#~ msgid "AC power is required" +#~ msgstr "Netzanschluss benötigt" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Getaktetes Netzwerk – automatische Aktualisierungen pausiert" + +#~ msgid "Find Out _More" +#~ msgstr "Mehr _herausfinden" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Um Kosten und Drosselungen zu vermeiden, werden Softwareaktualisierungen " +#~ "bei mobilen oder getakteten Verbindungen nicht automatisch " +#~ "heruntergeladen." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Wenn möglich, werden ausstehende Aktualisierungen im Hintergrund " +#~ "heruntergeladen und installiert" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Ausschließlich _freie Anwendungen anzeigen" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Ausschließlich unter einer freien Lizenz verfügbare Anwendungen anzeigen " +#~ "und alle proprietären Anwendungen verbergen" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Ausführliche Informationen zur Fehlerdiagnose anzeigen" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Darf auf beliebige Dateien zugreifen" + +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Sind Sie sicher, dass Sie %s deinstallieren möchten?" + +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s wird deinstalliert und muss erneut installiert werden, um genutzt " +#~ "werden zu können." + +#~ msgid "Downloading featured images…" +#~ msgstr "Vorgestellte Bilder werden heruntergeladen …" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "" +#~ "Die ausgewählten Erweiterungen werden mit der Anwendung installiert." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Der letzte Zeitstempel, an dem das System online war und Aktualisierungen " +#~ "erhalten hat" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Diese Software ist nicht in Ihrer Sprache verfügbar und wird in US-" +#~ "Englisch ausgeführt." + +#~ msgid "Applications" +#~ msgstr "Anwendungen" + +#~ msgid "Web Applications" +#~ msgstr "Web-Anwendungen" + +#~ msgid "Post Review" +#~ msgstr "Rezension abschicken" + +#~ msgid "_Post" +#~ msgstr "_Veröffentlichen" + +#~ msgid "Rating" +#~ msgstr "Bewertung" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Geben Sie eine kurze Zusammenfassung für Ihre Rezension, z.B. " +#~ "»Großartiges Programm, klare Empfehlung«." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Rezension" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Was halten Sie von dieser Anwendung? Versuchen Sie, Ihre Meinung zu " +#~ "begründen." + +#~ msgid "No screenshot provided" +#~ msgstr "Kein Bildschirmfoto verfügbar" + +#~ msgid "%s…" +#~ msgstr "%s …" + +#~ msgid "Restart Now" +#~ msgstr "Jetzt neustarten" + +#~ msgid "Primary Menu" +#~ msgstr "Primäres Menü" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Aktualisierungen" + +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s wird nicht mehr unterstützt." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "" +#~ "Das bedeutet, dass es keine Sicherheitsaktualisierungen mehr erhält." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Es wird empfohlen, dass Sie auf eine neuere Version aktualisieren." + +#~ msgid "Application Updates" +#~ msgstr "Aktualisierungen" + +#~ msgid "_Continue" +#~ msgstr "_Fortfahren" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgctxt "format-size" +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Anwendungsverwaltung für GNOME" + +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Software-Katalog wird heruntergeladen" + +#~ msgid "Name" +#~ msgstr "Name" + +#~ msgid "user" +#~ msgstr "Benutzer" + +#~ msgid "Channel" +#~ msgstr "Kanal" + +#~ msgid "Branch" +#~ msgstr "Zweig" + +#~ msgid "URL" +#~ msgstr "Adresse" + +#~ msgid "Installation" +#~ msgstr "Installation" + +#~ msgid "Version" +#~ msgstr "Version" + +#~ msgid "Access arbitrary files" +#~ msgstr "Auf beliebige Dateien zugreifen" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Darf auf beliebige Dateien im Dateisystem zugreifen" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Auf diesem System wurden keine Aktualisierungen installiert." + +#~ msgid "A list of popular applications" +#~ msgstr "Eine Liste beliebter Anwendungen" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Eine Liste von Anwendungen, die verwendet werden sollen; überschreibt die " +#~ "Systemeinstellungen." + +#~ msgid "Checking…" +#~ msgstr "Wird überprüft …" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Wird geladen …" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Anwendungsbewertungen werden heruntergeladen …" + +#~ msgid "GNOME Software" +#~ msgstr "GNOME Software" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "" +#~ "Die Adresse, welche den Hintergrund für ein Aktualisierungs-Banner " +#~ "festlegt" + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "Die Adresse darf bis zu dreimal »%u« enthalten. Dies wird durch die neue " +#~ "Version ersetzt." + +#~ msgid "_Add shortcut" +#~ msgstr "Tastenkombination _hinzufügen" + +#~ msgid "Re_move shortcut" +#~ msgstr "Tastenkombination _entfernen" + +#~ msgid "Welcome" +#~ msgstr "Willkommen" + +#~ msgid "Welcome to Software" +#~ msgstr "Willkommen zu GNOME-Software" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Software ermöglicht es Ihnen, gewünschte Software zu installieren. " +#~ "Schauen Sie sich unsere Empfehlungen an, durchsuchen Sie Kategorien und " +#~ "suchen Sie nach gewünschten Anwendungen." + +#~ msgid "_Browse Software" +#~ msgstr "Software _durchsuchen" + +#~ msgid "OS Updates" +#~ msgstr "Betriebssystemaktualisierungen" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Beinhaltet Leistungs-, Stabilitäts- und Sicherheitsverbesserungen." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Signatur für Firmware-Aktualisierung wird heruntergeladen …" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Metadaten für Firmware-Aktualisierung werden heruntergeladen …" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Berechtigungen dieser Anwendung sind unbekannt" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Software stammt aus einer vertrauenswürdigen Quelle" + +#~ msgid "Unknown Permissions" +#~ msgstr "Unbekannte Berechtigungen" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Die für diese Anwendung benötigten Berechtigungen sind unbekannt" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Anwendung stammt aus einer vertrauenswürdigen Quelle" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "" +#~ "Ihre Distribution hat diese Anwendung als vertrauenswürdig eingestuft" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "Nicht für Touch-Geräte oder Smartphones optimiert" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "" +#~ "Abfrage anzeigen, ob unfreie Softwarequellen eingerichtet werden sollen" + +#~ msgid "Requires a specific screen size" +#~ msgstr "Erfordert eine bestimmte Bildschirmgröße" + +#~ msgid "Editor’s Picks" +#~ msgstr "Unsere Empfehlungen" + +#~ msgid "Recently Updated" +#~ msgstr "Kürzlich aktualisiert" + +#~ msgid "_Read More" +#~ msgstr "_Mehr anzeigen" + +#~ msgid "_Read Less" +#~ msgstr "_Weniger anzeigen" + +#~ msgid "_Launch" +#~ msgstr "_Starten" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Nie" + +#~ msgid "Localized in your Language" +#~ msgstr "In Ihre Sprache übersetzt" + +#~ msgid "Release Activity" +#~ msgstr "Veröffentlichungsaktivität" + +#~ msgid "Developer" +#~ msgstr "Entwickler" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Nicht Installiert" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Installiert" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Aktualisiert" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Unbekannt" + +#~ msgid "History" +#~ msgstr "Verlauf" + +#~ msgid "More…" +#~ msgstr "Weitere …" + +#~ msgid "Recommended Games" +#~ msgstr "Empfohlene Spiele" + +#, fuzzy +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Creation Applications" +#~ msgstr "Empfohlene Grafik-Anwendungen" + +#~ msgid "Recommended Work Applications" +#~ msgstr "Empfohlene Arbeits-Anwendungen" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Ein Teil dieser Software ist proprietär und unterliegt deshalb " +#~ "Einschränkungen bezüglich Verwendung, Weitergabe und Zugriff auf den " +#~ "Quellcode." + +#~ msgid "Find out more…" +#~ msgstr "Mehr herausfinden …" + +#~ msgid "Recent Releases" +#~ msgstr "Letzte Veröffentlichungen" + +#~ msgid "Remove “%s”?" +#~ msgstr "»%s« entfernen?" + +#~ msgid "Disable “%s”?" +#~ msgstr "»%s« deaktivieren?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Keine zusätzlichen Softwarequellen" + +#~ msgid "_Remove…" +#~ msgstr "_Entfernen …" + +#~ msgid "_Disable…" +#~ msgstr "_Deaktivieren …" + +#~ msgid "Disabling" +#~ msgstr "Wird deaktiviert" + +#~ msgid "Enabled" +#~ msgstr "Aktiviert" + +#~ msgid "Disabled" +#~ msgstr "Deaktiviert" + +#~ msgid "_Remove All" +#~ msgstr "Alle entfe_rnen" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "" +#~ "Die Aktualisierungen werden bei einem Neustart des Rechners übernommen." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Es wird auf das Herunterladen von %s %s gewartet" + +#~ msgid "Downloading %s %s" +#~ msgstr "%s %s wird heruntergeladen" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Alle" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Vorgestellt" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "All" +#~ msgstr "Alle" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Alle" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Vorgestellt" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Alle" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Vorgestellt" + +#~ msgid "Audio & Video" +#~ msgstr "Audio und Video" + +#~ msgid "Developer Tools" +#~ msgstr "Entwicklungswerkzeuge" + +#~ msgid "Education & Science" +#~ msgstr "Bildung und Wissenschaft" + +#~ msgid "Games" +#~ msgstr "Spiele" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafik und Fotografie" + +#~ msgid "Productivity" +#~ msgstr "Produktivität" + +#~ msgid "Communication & News" +#~ msgstr "Kommunikation und Nachrichten" + +#~ msgid "Utilities" +#~ msgstr "Zubehör" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Es ist nicht möglich festzustellen, auf welche Teile des Systems diese " +#~ "Anwendung zugreift. Das ist typisch für ältere Anwendungen." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Niedrig" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Mittel" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Hoch" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Unbekannt" + +# Gemeinfrei versteht kein Mensch +# Schon möglich, aber es wird im nächsten String per Wikipedia-Link erklärt -mb +#~ msgid "Public domain" +#~ msgstr "Gemeinfrei" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://de.wikipedia.org/wiki/Gemeinfreiheit" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw.de" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Benutzer sind an die folgende Lizenz gebunden:" +#~ msgstr[1] "Benutzer sind an die folgenden Lizenzen gebunden:" + +#~ msgid "Sandboxed" +#~ msgstr "Isoliert (Sandbox)" + +#~ msgid "Category" +#~ msgstr "Kategorie" + +#~ msgid "Free" +#~ msgstr "Frei" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Unbekannt" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Dies bedeutet, dass die Software frei eingesetzt, kopiert, weitergegeben, " +#~ "inspiziert und verändert werden darf." + +#~ msgid "Proprietary Software" +#~ msgstr "Proprietäre Software" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Dies bedeutet, dass die Softwarerechte in den Händen einer Person oder " +#~ "eines Unternehmens liegen. Die Nutzung ist oftmals beschränkt und der " +#~ "Quellcode ist normalerweise nicht zugänglich." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Die Lizenzbestimmungen dieser Software sind unbekannt." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Die Anwendung wurde so eingestuft, weil sie folgendes enthält:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Für diese Freigabe sind keine Details verfügbar." + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Empfohlene Audio- und Video-Anwendungen" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Empfohlene Anwendungen zur Produktivität" + +#~ msgid "ratings in total" +#~ msgstr "Gesamtzahl der Rezensionen" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (benötigt Aufmerksamkeit)" + +#~ msgid "Looking for new updates…" +#~ msgstr "Es wird nach neuen Aktualisierungen gesucht …" + +#~ msgid "Setting up updates…" +#~ msgstr "Aktualisierungen werden eingerichtet …" + +#~ msgid "Software is up to date" +#~ msgstr "Die Software ist aktuell" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "OpenDesktop-Bewertungen (ODRS) ist ein Dienst, der Benutzerbewertungen " +#~ "von Programmen bereitstellt" + +#~ msgid "Select All" +#~ msgstr "Alle auswählen" + +#~ msgid "Select None" +#~ msgstr "Nichts auswählen" + +#~ msgid "Featured %s" +#~ msgstr "Vorstellung von %s" + +#~ msgid "Show" +#~ msgstr "Anzeige von" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Filtermenü für Unterkategorien" + +#~ msgid "Sort" +#~ msgstr "Sortierung nach" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Sortiermenü für Unterkategorien" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Animationsfiguren in unsicheren Situationen" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Animationsfiguren in aggressivem Konflikt" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Grafische Gewaltdarstellung durch Animationsfiguren" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Figuren in unsicheren Situationen, die einfach von der Realität zu " +#~ "unterscheiden sind" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Figuren in aggressiven Konflikten, die einfach von der Realität zu " +#~ "unterscheiden sind" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Graphische Gewalt, die realitätsfremd ist" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Harmlose realistische Figuren in unsicheren Situationen" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "" +#~ "Darstellung von realistischen Charakteren, die im aggressiven Konflikt " +#~ "zueinander stehen" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Graphische Gewalt von realistischen Charakteren" + +#~ msgid "No bloodshed" +#~ msgstr "Kein Blutvergießen" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Unrealistisches Blutvergießen" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Realistisches Blutvergießen" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Darstellung von Blutvergießen und Verstümmeln von Körperteilen" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Vergewaltigung oder andere gewaltsame Sexualhandlungen" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Bezug auf alkoholische Getränke" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Genuss von alkoholischen Getränken" + +#~ msgid "References to illicit drugs" +#~ msgstr "Erwähnung unerlaubter Drogen/Medikamente" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Konsum von unerlaubten Drogen/Medikamenten" + +#~ msgid "References to tobacco products" +#~ msgstr "Bezug auf Tabakprodukte" + +#~ msgid "Use of tobacco products" +#~ msgstr "Genuss von Tabakprodukten" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Kurzzeitige, künstlerische Darbietung von Nacktszenen" + +#~ msgid "Prolonged nudity" +#~ msgstr "Ausgiebige Nacktszenen" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provokative Anspielungen oder Darstellungen" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Sexuelle Anspielungen oder Darstellungen" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Graphische Sexualhandlungen" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Geringe oder seltene Obszönität" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Gemäßigte Obszönität" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Starke oder häufige Obszönität" + +#~ msgid "Slapstick humor" +#~ msgstr "Slapstick-Humor" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgärer oder Kneipenstammtischhumor" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Nicht jugendfreier oder sexueller Humor" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Abwertende Äußerungen gegenüber spezifischen Gruppierungen" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Diskriminierung mit dem Ziel der emotionellen Kränkung" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Explizite Diskriminierung von Geschlecht, Sexualität, Rasse oder Religion" + +#~ msgid "Product placement" +#~ msgstr "Produktplatzierung" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Explizite Anspielungen auf bestimmte Marken oder Handelsprodukte" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Benutzer werden ermuntert, bestimmte reale Objekte zu erwerben" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Glücksspiele mit Jetons oder Guthaben" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Glücksspiel mit Spielgeld" + +#~ msgid "Gambling using real money" +#~ msgstr "Glücksspiel mit echtem Geld" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Benutzer werden ermuntert, echtes Geld zu spenden" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Möglichkeit, reales Geld in Anwendungen auszugeben" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Zwei-Teilnehmer-Interaktionen ohne Chat-Funktion" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Moderierte Chat-Funktion zwischen Benutzern" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "" +#~ "Nicht kontrollierte Audio- oder Video-Chat-Funktion zwischen Benutzern" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Teilen von Benutzernamen in sozialen Netzwerken oder E-Mail-Adressen" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Suchen nach der neuesten Anwendungsversion" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Teilen von Diagnosedaten, die eine Identifizierung des Benutzers durch " +#~ "andere nicht ermöglichen" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Teilen von Informationen, die eine Identifizierung des Benutzers durch " +#~ "andere ermöglichen" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Teilen des physischen Aufenthaltsortes mit anderen Benutzern" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Indirekte Erwähnung von Homosexualität" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Küssen von Personen desselben Geschlechts" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Grafisches Sexualverhalten von Personen desselben Geschlechts" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Indirekte Erwähnung von Prostitution" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Direkte Erwähnung von Prostitution" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Grafische Darstellungen des Akts der Prostitution" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Indirekte Erwähnung von Ehebruch" + +#~ msgid "Direct references to adultery" +#~ msgstr "Direkte Erwähnung von Ehebruch" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Grafische Darstellungen des Akts des Ehebruchs" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Leicht bekleidete menschliche Charaktere" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Offen sexualisierte menschliche Charaktere" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Darstellungen oder Erwähnungen von historischer Schändung" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Darstellungen von moderner menschlicher Schändung" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Grafische Darstellungen von moderner Schändung" + +#~ msgid "Visible dead human remains" +#~ msgstr "Sichtbare menschliche Überreste" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Menschliche Überreste, die der Natur ausgesetzt sind" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Grafische Darstellungen von Schändung menschlicher Körper" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Darstellungen oder Erwähnungen von historischer Sklaverei" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Darstellungen oder Erwähnungen von moderner Sklaverei" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Grafische Darstellungen von moderner Sklaverei" + +#~ msgid "General" +#~ msgstr "Allgemein" + +#~ msgid "ALL" +#~ msgstr "ALLE" + +#~ msgid "Teen" +#~ msgstr "Jugendliche" + +#~ msgid "Everyone 10+" +#~ msgstr "Alle ab 10 Jahren" + +#~ msgid "Everyone" +#~ msgstr "Alle" + +#~ msgid "Early Childhood" +#~ msgstr "Frühe Kindheit" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Unbekannt" + +#~ msgid "Released" +#~ msgstr "Veröffentlicht" + +#~ msgid "Format" +#~ msgstr "Format" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Gestern %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Vor drei Tagen" + +#~ msgid "Four days ago" +#~ msgstr "Vor vier Tagen" + +#~ msgid "Five days ago" +#~ msgstr "Vor fünf Tagen" + +#~ msgid "Six days ago" +#~ msgstr "Vor sechs Tagen" + +#~ msgid "Two weeks ago" +#~ msgstr "Vor zwei Wochen" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Gehen wir einkaufen" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Entfernt" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Soll %s wirklich entfernt werden?" + +#~ msgid "Security Updates Pending" +#~ msgstr "Sicherheitsaktualisierungen stehen aus" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "" +#~ "Es wird empfohlen, dass Sie wichtige Aktualisierungen sofort installieren" + +#~ msgid "Restart & Install" +#~ msgstr "Neu starten und installieren" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Wichtige Betriebssystemaktualisierungen und Anwendungsaktualisierungen " +#~ "stehen zur Installation bereit" + +#~ msgid "View" +#~ msgstr "Ansehen" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Softwarequelle für GNOME Shell-Erweiterungen aktivieren" + +#~ msgid "this website" +#~ msgstr "diese Internetseite" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Diese Anwendung muss neu gestartet werden, damit die neuen Erweiterungen " +#~ "benutzt werden können." + +#~ msgid "About %s" +#~ msgstr "Info zu %s" + +#~ msgid "%s ME" +#~ msgstr "ME %s" + +#~ msgid "Show the folder management UI" +#~ msgstr "Grafische Oberfläche der Ordnerverwaltung anzeigen" + +#~ msgid "Folder Name" +#~ msgstr "Ordnername" + +#~ msgid "_Add" +#~ msgstr "_Hinzufügen" + +#~ msgid "Add to Application Folder" +#~ msgstr "Zu Anwendungsordner hinzufügen" + +#~ msgid "Top Rated" +#~ msgstr "Beste Bewertung" + +#~ msgid "Extension Settings" +#~ msgstr "Erweiterungseinstellungen" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Erweiterungen werden auf eigene Gefahr verwendet. Bei Systemproblemen " +#~ "wird empfohlen, sie wieder abzuschalten." + +#~ msgid "Failed to load components" +#~ msgstr "Komponenten konnten nicht geladen werden" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS-Validierung OK!" + +#~ msgid "Failed to load file" +#~ msgstr "Datei konnte nicht geladen werden" + +#~ msgid "Unsaved changes" +#~ msgstr "Ungespeicherte Änderungen" + +#~ msgid "The application list is already loaded." +#~ msgstr "Die Anwendungsliste ist bereits geladen." + +#~ msgid "Merge documents" +#~ msgstr "Dokumente zusammenführen" + +#~ msgid "Throw away changes" +#~ msgstr "Änderungen verwerfen" + +#~ msgid "Open AppStream File" +#~ msgstr "AppStream-Datei öffnen" + +#~ msgid "Save AppStream File" +#~ msgstr "AppStream-Datei speichern" + +#~ msgid "_Save" +#~ msgstr "_Speichern" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s Banner-Design wurde gelöscht." + +#~ msgid "Banner design deleted." +#~ msgstr "Banner-Design wurde gelöscht." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "In der Anwendungsliste gibt es ungespeicherte Änderungen." + +#~ msgid "Use verbose logging" +#~ msgstr "Ausführliche Protokollierung aktivieren" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME Software Banner-Designer" + +#~ msgid "No Designs" +#~ msgstr "Keine Designs" + +#~ msgid "Error message here" +#~ msgstr "Fehlermeldung hier" + +#~ msgid "Category Featured" +#~ msgstr "Vorstellungskategorie" + +#~ msgid "Undo" +#~ msgstr "Rückgängig" + +#~ msgid "Banner Designer" +#~ msgstr "Banner-Designer" + +#~ msgid "New Banner" +#~ msgstr "Neues Banner" + +#~ msgid "Import from file" +#~ msgstr "Aus Datei importieren" + +#~ msgid "Export to file" +#~ msgstr "In Datei exportieren" + +#~ msgid "Spacing" +#~ msgstr "Abstand" + +#~ msgid "The amount of space between children" +#~ msgstr "Der Abstand zwischen Kindelementen" + +#~ msgid "Click on items to select them" +#~ msgstr "Klicken Sie auf Objekte, um diese auszuwählen" + +#~ msgid "Select" +#~ msgstr "Auswählen" + +#~ msgid "_Add to Folder…" +#~ msgstr "Zu _Ordner hinzufügen …" + +#~ msgid "_Move to Folder…" +#~ msgstr "In Ordner _verschieben …" + +#~ msgid "_Remove from Folder" +#~ msgstr "Von Ordner _entfernen" + +#~ msgid "Featured Applications" +#~ msgstr "Vorgestellte Anwendungen" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Vorgestellte Banner für GNOME Software entwerfen" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell-Erweiterungen" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Softwarequelle für GNOME Shell-Erweiterungen" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Metadaten für Shell-Erweiterung werden heruntergeladen …" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell-Erweiterungen" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_Alle" + +#~ msgid "Sign In / Register…" +#~ msgstr "Anmelden / Registrieren …" + +#~ msgid "Continue" +#~ msgstr "Fortfahren" + +#~ msgid "Use" +#~ msgstr "Verwendung" + +#~ msgid "Add another…" +#~ msgstr "Weiteren hinzufügen …" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Software-Katalog wird geladen" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s wird installiert, wofür Ihnen %s berechnet wird." + +#~ msgid "A$%.2f" +#~ msgstr "%.2f A$" + +#~ msgid "C$%.2f" +#~ msgstr "%.2f C$" + +#~ msgid "CN¥%.2f" +#~ msgstr "%.2f CN¥" + +#~ msgid "€%.2f" +#~ msgstr "%.2f €" + +#~ msgid "£%.2f" +#~ msgstr "%.2f £" + +#~ msgid "¥%.2f" +#~ msgstr "%.2f ¥" + +#~ msgid "NZ$%.2f" +#~ msgstr "%.2f NZ$" + +#~ msgid "₽%.2f" +#~ msgstr "%.2f ₽" + +#~ msgid "US$%.2f" +#~ msgstr "%.2f US$" + +#~ msgid "Signed in as %s" +#~ msgstr "Angemeldet als %s" + +#~ msgid "Sign in…" +#~ msgstr "Anmelden …" + +#~ msgid "Sign out" +#~ msgstr "Abmelden" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Kaufen von %s nicht möglich: Legitimierung notwendig" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Kaufen von %s nicht möglich: Legitimierung fehlgeschlagen" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "" +#~ "Kaufen von %s fehlgeschlagen: Bezahlmethode wurde nicht eingerichtet" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Kaufen von %s nicht möglich: Bezahlung wurde abgewiesen" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Sie benötigen im weiteren Verlauf ein Ubuntu-One-Konto." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Sie müssen sich bei Ubuntu-One anmelden, um fortsetzen zu können." + +#~ msgid "..." +#~ msgstr "…" + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Aktualisierung von %s auf %s nicht möglich" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Profiling-Informationen für den Dienst anzeigen" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Sie müssen sich bei %s anmelden, um fortsetzen zu können." + +#~ msgid "Email address" +#~ msgstr "E-Mail-Adresse" + +#~ msgid "I have an account already" +#~ msgstr "Ich habe bereits ein Benutzerkonto" + +#~ msgid "I want to register for an account now" +#~ msgstr "Ich möchte mich für ein neues Benutzerkonto registrieren" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Das nächste Mal automatisch anmelden" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Geben Sie Ihre einmalige PIN für die Zwei-Stufen-Legitimierung ein." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Legitimieren" + +#~ msgid "_About" +#~ msgstr "_Info" + +#~ msgid "_Quit" +#~ msgstr "_Beenden" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Informationen über %s sowie Möglichkeiten, einen Codec zu erhalten, der " +#~ "dieses Format wiedergeben kann, finden Sie auf der Internet-Seite." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Das Konto %s wurde deaktiviert." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "" +#~ "Installation von Software nicht möglich, bis das Problem gelöst ist." + +#~ msgid "For more information, visit %s." +#~ msgstr "Besuchen Sie %s für weitere Informationen." + +#~ msgid "Downloading new updates…" +#~ msgstr "Neue Aktualisierungen werden heruntergeladen …" + +#~ msgid "Downloading application page…" +#~ msgstr "Anwendungsseite wird heruntergeladen …" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Die ultimative Unterhaltungsplattform von Valve" diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..d1bb1f0 --- /dev/null +++ b/po/el.po @@ -0,0 +1,8406 @@ +# Greek translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Dimitris Spingos , 2013. +# Dimitris Spingos (Δημήτρης Σπίγγος) , 2013, 2014, 2015. +# Efstathios Iosifidis , 2015-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-08-04 10:49+0000\n" +"PO-Revision-Date: 2024-08-19 01:35+0300\n" +"Last-Translator: Efstathios Iosifidis \n" +"Language-Team: Greek, Modern (1453-) \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" +"X-Generator: Poedit 3.4.4\n" +"X-Project-Style: gnome\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Λογισμικό" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Εγκαταστήστε και αναβαθμίστε εφαρμογές" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Η εφαρμογή Λογισμικό σας επιτρέπει να βρείτε και να εγκαταστήσετε νέες " +"εφαρμογές και επεκτάσεις συστήματος και να αφαιρέσετε υπάρχουσες " +"εγκατεστημένες εφαρμογές." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Η εφαρμογή Λογισμικό προβάλλει επιλεγμένες και δημοφιλείς εφαρμογές με " +"χρήσιμες περιγραφές και πολλαπλά στιγμιότυπα οθόνης ανά εφαρμογή. Οι " +"εφαρμογές μπορούν να βρεθούν είτε μέσα από περιήγηση της λίστας των " +"κατηγοριών ή με αναζήτηση. Σας επιτρέπει επίσης να ενημερώνετε το σύστημά " +"σας χρησιμοποιώντας μια ενημέρωση χωρίς σύνδεση." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Πίνακας επισκόπησης" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Πίνακας λεπτομερειών" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Πίνακας εγκατεστημένων" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Πίνακας ενημερώσεων" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Λεπτομέρειες ενημέρωσης" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2573 +#: src/gs-application.c:264 +msgid "The GNOME Project" +msgstr "Το έργο GNOME" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Εγκατάσταση αρχείου appstream σε τοποθεσία συστήματος" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Γίνεται εγκατάσταση αρχείου appstream σε τοποθεσία συστήματος" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Λίστα με συμβατά έργα" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Είναι μια λίστα με συμβατά έργα που πρέπει να εμφανιστούν όπως GNOME, KDE " +"και XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Εάν θα διαχειρίζονται οι ενημερώσεις και οι αναβαθμίσεις στο Λογισμικό GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Εάν είναι απενεργοποιημένο, το Λογισμικό GNOME θα αποκρύψει τον πίνακα " +"ενημερώσεων και δεν θα εκτελέσει καμία ενέργεια αυτόματων ενημερώσεων ή " +"προτροπή αναβαθμίσεων." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Αυτόματη λήψη και εγκατάσταση των ενημερώσεων" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Αν είναι ενεργό, το Λογισμικό GNOME κάνει αυτόματη λήψη των ενημερώσεων στο " +"παρασκήνιο, επίσης εγκαθιστά τις ενημερώσεις που δεν απαιτούν επανεκκίνηση." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"Ειδοποίηση του χρήστη σχετικά με το λογισμικό που ενημερώθηκε στο παρασκήνιο" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Εάν είναι ενεργοποιημένο, το Λογισμικό GNOME ειδοποιεί τον χρήστη για " +"ενημερώσεις που συνέβησαν ενώ ο χρήστης ήταν αδρανής." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Εάν πρόκειται να ανανεωθεί αυτόματα όταν βρίσκεστε σε μια μετρημένη σύνδεση" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Εάν είναι ενεργοποιημένο, το Λογισμικό GNOME ανανεώνεται αυτόματα στο " +"παρασκήνιο, ακόμη και όταν χρησιμοποιεί μια μετρημένη σύνδεση (τελικά " +"λαμβάνει μερικά μεταδεδομένα, ελέγχει για ενημερώσεις κλπ., μπορεί να " +"προκύψει κόστος για τον χρήστη)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Αν είναι η πρώτη εκτέλεση του Λογισμικό GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Εμφάνιση βαθμολογιών δίπλα από τις εφαρμογές" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Φιλτράρισμα εφαρμογών με βάση τον προεπιλεγμένο κλάδο που ορίστηκε για το " +"απομακρυσμένο" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Οι μη ελεύθερες εφαρμογές εμφανίζουν μια προειδοποίηση πριν την εγκατάσταση " +"τους" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Όταν εγκαθίστανται μη ελεύθερες εφαρμογές, ένας διάλογος προειδοποίησης θα " +"εμφανιστεί. Αυτό ελέγχει εάν ο διάλογος καταστέλλεται." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Η χρονική σήμανση του τελευταίου ελέγχου ενημέρωσης" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Η χρονική σήμανση του τελευταίου ελέγχου αναβάθμισης" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Η χρονική σήμανση της τελευταίας ειδοποίησης ενημέρωσης" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Η χρονική σήμανση της πρώτης ενημέρωσης ασφαλείας, εκκαθαρίζεται μετά την " +"ενημέρωση" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Η τελευταία ενημερωμένη χρονική σήμανση" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Η ηλικία σε δευτερόλεπτα για την επαλήθευση του upstream στιγμιοτύπου " +"εξακολουθεί να είναι έγκυρη" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Η επιλογή μεγαλύτερης τιμής θα σημαίνει λιγότερη επικοινωνία με τον " +"απομακρυσμένο διακομιστή, αλλά οι ενημερώσεις των στιγμιότυπων ενδέχεται να " +"χρειαστούν περισσότερο χρόνο για να εμφανιστούν στο χρήστη. Μια τιμή 0 " +"σημαίνει να μην ελέγχεται ποτέ ο διακομιστής εαν η εικόνα υπάρχει ήδη στην " +"λανθάνουσα μνήμη." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Ο διακομιστής που θα χρησιμοποιηθεί για τις κριτικές των εφαρμογών" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Η ελάχιστη βαθμολογία-κάρμα για τις κριτικές" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Κριτικές με κάρμα μικρότερο από αυτόν τον αριθμό δεν θα εμφανίζονται." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Μια λίστα με επίσημα αποθετήρια που δεν θα πρέπει να θεωρούνται πηγές τρίτων" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Μια λίστα με επίσημα αποθετήρια που δε μπορούν να απενεργοποιηθούν ή να " +"αφαιρεθούν" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Μια λίστα με επίσημα αποθετήρια που θα πρέπει να θεωρούνται ελεύθερο " +"λογισμικό" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Η διεύθυνση άδειας που θα χρησιμοποιηθεί όταν μια εφαρμογή θεωρείται " +"ελεύθερο λογισμικό" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Εγκατάσταση εφαρμογών για όλους τους χρήστες στο σύστημα, όπου είναι δυνατόν" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Επιτρέπεται η πρόσβαση στον διάλογο Αποθετήρια Λογισμικού" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Προσφέρει αναβαθμίσεις για προ-εκδόσεις" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Εμφάνιση ορισμένων στοιχείων περιβάλλοντος χρήστη που ενημερώνουν τον χρήστη " +"ότι μια εφαρμογή δεν είναι δωρεάν" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Εμφάνιση μεγέθους εγκατάστασης για τις εφαρμογές στην λίστα των " +"εγκατεστημένων εφαρμογών" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Το URI που επεξηγεί μη ελεύθερο και ιδιοταγές λογισμικό" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Μια λίστα με URL που καταδεικνύουν σε αρχεία appstream τα οποία θα ληφθούν " +"σε ένα φάκελο swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Εγκατάσταση αρχείων AppStream σε τοποθεσία για όλο το σύστημα και για όλους " +"τους χρήστες. Αν είναι λάθος, τα αρχεία εγκαθιστώνται στο μη τυποποιημένο " +"φάκελο $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Σειρά προτεραιότητας προτιμότερων μορφών πακεταρίσματος, με τις πιο " +"σημαντικές μορφές να αναφέρονται πρώτες. Ένας κενός πίνακας υποδηλώνει την " +"προεπιλεγμένη σειρά. Οι μορφές που παραλείπονται θεωρούνται ότι αναφέρονται " +"τελευταίες. Παραδείγματα μορφών πακεταρίσματος είναι: deb, flatpak, rpm, " +"snap. Οι μορφές μπορούν προαιρετικά να καθοριστούν με ένα όνομα προέλευσης, " +"χωρισμένο με άνω και κάτω τελεία, για παράδειγμα 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Η χρονική σήμανση της τελευταίας προσπάθειας αφαίρεσης αχρησιμοποίητων " +"Flatpak runtimes" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Ορίστε σε 'true' για να εμφανίζονται μόνο εφαρμογές με ελεύθερη άδεια και να " +"αποκρύπτονται τυχόν ιδιοταγείς εφαρμογές." + +#: data/org.gnome.software.gschema.xml:147 +#, fuzzy +#| msgid "" +#| "Set to 'true' to show only freely licensed apps and hide any proprietary " +#| "apps." +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Ορίστε σε 'true' για να εμφανίζονται μόνο εφαρμογές με ελεύθερη άδεια και να " +"αποκρύπτονται τυχόν ιδιοταγείς εφαρμογές." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Η χρονική σήμανση των τελευταίων λαμβανόμενων ιστορικών ενημερώσεων." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Μια συμβολοσειρά που αποθηκεύει το αναγνωριστικό των δικτυακών λογαριασμών " +"gnome που χρησιμοποιείται για σύνδεση" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Εγκαταστάτης Λογισμικού GNOME AppStream σε όλο το σύστημα" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Αποτυχία ανάλυσης των ορισμάτων της γραμμής εντολής" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Πρέπει να ορίσετε ακριβώς ένα όνομα αρχείου" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Το πρόγραμμα μπορεί να χρησιμοποιηθεί μόνο από τον χρήστη root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Αποτυχία επικύρωσης τύπου περιεχομένου: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Αποτυχία αντιγραφής: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Εγκατάσταση λογισμικού" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Εγκατάσταση του επιλεγμένου λογισμικού στο σύστημα" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Βία κινουμένων σχεδίων" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Χωρίς πληροφορίες σχετικά με βία κινουμένων σχεδίων" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Φανταστική βία" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Χωρίς πληροφορίες σχετικά με φανταστική βία" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Ρεαλιστική βία" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Χωρίς πληροφορίες σχετικά με ρεαλιστική βία" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Βία που απεικονίζει αιματοχυσία" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Χωρίς πληροφορίες σχετικά με αιματοχυσία" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Σεξουαλική βία" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Χωρίς πληροφορίες σχετικά με σεξουαλική βία" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Αλκοόλ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Χωρίς πληροφορίες σχετικά με αναφορές σε αλκοόλ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Ναρκωτικά" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Χωρίς πληροφορίες σχετικά με αναφορές σε παράνομα ναρκωτικά" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Καπνός" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Χωρίς πληροφορίες σχετικά με αναφορές σε προϊόντα καπνού" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Γυμνό" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Χωρίς πληροφορίες σχετικά με γυμνό κάθε είδους" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Σεξουαλικά Θέματα" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Χωρίς πληροφορίες σχετικά με αναφορές ή απεικονίσεις σεξουαλικού χαρακτήρα" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Βωμολοχίες" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Χωρίς πληροφορίες σχετικά με βωμολοχίες κάθε είδους" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Ακατάλληλο χιούμορ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Χωρίς πληροφορίες σχετικά με ακατάλληλο χιούμορ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Διακρίσεις" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Χωρίς πληροφορίες σχετικά με γλώσσα που εισάγει διακρίσεις κάθε είδους" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Διαφήμιση" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Χωρίς πληροφορίες σχετικά με διαφήμιση κάθε είδους" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Τζόγος" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Χωρίς πληροφορίες σχετικά με τζόγο κάθε είδους" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Αγορές" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Χωρίς πληροφορίες σχετικά με τη δυνατότητα χρήσης χρημάτων" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Συνομιλία μεταξύ χρηστών" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Χωρίς πληροφορίες σχετικά με τρόπους συνομιλίας με άλλους χρήστες" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Ηχητική συνομιλία μεταξύ χρηστών" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Χωρίς πληροφορίες σχετικά με τρόπους επικοινωνίας με άλλους χρήστες" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Λεπτομέρειες επαφής" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Χωρίς πληροφορίες σχετικά με κοινή χρήση των ονομάτων χρηστών κοινωνικής " +"δικτύωσης ή των διευθύνσεων ηλεκτρονικού ταχυδρομείου" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Πληροφορίες ταυτοποίησης" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Χωρίς πληροφορίες σχετικά με διαμοιρασμό πληροφοριών χρήστη με τρίτους" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Διαμοιρασμός τοποθεσίας" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Χωρίς πληροφορίες σχετικά με διαμοιρασμό φυσικής τοποθεσίας με άλλους χρήστες" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Ομοφυλοφιλία" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Χωρίς πληροφορίες σχετικά με αναφορές σε ομοφυλοφιλία" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Πορνεία" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Χωρίς πληροφορίες σχετικά με αναφορές σε πορνεία" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Μοιχεία" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Χωρίς πληροφορίες σχετικά με αναφορές σε μοιχεία" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Σεξουαλικοποιημένοι χαρακτήρες" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Χωρίς πληροφορίες σχετικά με σεξουαλικοποιημένους χαρακτήρες" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Βεβήλωση" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Χωρίς πληροφορίες σχετικά με αναφορές σε βεβήλωση" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Ανθρώπινα λείψανα" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Χωρίς πληροφορίες σχετικά με ορατά λείψανα νεκρών ανθρώπων" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Σκλαβιά" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Χωρίς πληροφορίες σχετικά με αναφορές σε σκλαβιά" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Δεν περιλαμβάνει αναφορές σε ναρκωτικά" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" +"Δεν περιλαμβάνει βωμολοχίες, βλασφημίες και άλλα είδη έντονων χαρακτηρισμών" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Δεν περιλαμβάνει διαφημίσεις ή χρηματικές συναλλαγές" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Δεν περιλαμβάνει σεξ ή γυμνό" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Δεν περιλαμβάνει λειτουργικότητα ανεξέλεγκτης συνομιλίας" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Δεν περιλαμβάνει βία" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Ναρκωτικά" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Έντονοι χαρακτηρισμοί" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Χρήματα" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Κοινωνικά" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Βία" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Όλες" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "Το %s έχει άγνωστη αξιολόγηση ηλικίας" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "Το %s είναι κατάλληλο για όλους" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "Το %s είναι κατάλληλο για νήπια" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "Το %s είναι κατάλληλο για μικρά παιδιά" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "Το %s είναι κατάλληλο για παιδιά" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "Το %s είναι κατάλληλο για εφήβους" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "Το %s είναι κατάλληλο για ενηλίκους" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "Το %s είναι κατάλληλο για %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:5 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Βαθμολόγηση ηλικίας" + +#: src/gs-age-rating-context-dialog.ui:67 +#: src/gs-hardware-support-context-dialog.ui:70 +#: src/gs-safety-context-dialog.ui:260 +msgid "How to contribute missing information" +msgstr "Συνεισφορά ελλιπών πληροφοριών" + +#: lib/gs-app.c:6339 +msgid "Local file" +msgstr "Τοπικό αρχείο" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6358 src/gs-safety-context-dialog.c:539 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6435 src/gs-safety-context-dialog.c:776 +#: src/gs-safety-context-dialog.ui:180 +msgid "Package" +msgstr "Πακέτο" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Εκκρεμεί" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:402 +msgid "Pending install" +msgstr "Εκκρεμεί εγκατάσταση" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:409 +msgid "Pending remove" +msgstr "Εκκρεμεί αφαίρεση" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:390 +msgid "Installing" +msgstr "Εγκαθίσταται" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Αφαίρεση" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:395 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Γίνεται λήψη" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:303 src/gs-details-page.c:1055 +#: src/gs-details-page.c:1082 src/gs-details-page.ui:243 src/gs-page.c:437 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "Ε_γκατάσταση" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1164 +msgid "_Uninstall…" +msgstr "_Απεγκατάσταση…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Δίκτυο" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Δυνατότητα επικοινωνίας μέσω δικτύου" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Υπηρεσίες συστήματος" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Δυνατότητα πρόσβασης στις υπηρεσίες D-Bus στο δίαυλο συστήματος" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Υπηρεσίες συνεδρίας" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Δυνατότητα πρόσβασης στις υπηρεσίες D-Bus στο δίαυλο συνεδρίας" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Συσκευές" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Δυνατότητα πρόσβασης σε αυθαίρετες συσκευές, όπως κάμερες" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:231 +msgid "Can access input devices" +msgstr "Δυνατότητα πρόσβασης στις συσκευές εισόδου" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Δυνατότητα πρόσβασης σε μικρόφωνα" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Δυνατότητα πρόσβασης αρχείων συσκευών συστήματος" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Περιεχόμενα οθόνης" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Δυνατότητα πρόσβασης στα περιεχόμενα οθόνης" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Προσωπικός φάκελος" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Δυνατότητα προβολής, επεξεργασίας και δημιουργίας αρχείων" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Δυνατότητα προβολής αρχείων" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Σύστημα αρχείων" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Φάκελος λήψεων" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Ρυθμίσεις" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Δυνατότητα προβολής και αλλαγής οποιονδήποτε ρυθμίσεων" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Σύστημα προβολής παλαιού τύπου" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Χρησιμοποιεί ένα παλιό, ανασφαλές σύστημα προβολής" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Αποφυγή φιλτραρισματος" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" +"Μπορεί να ξεφύγει από το φιλτράρισμα και να παρακάμψει άλλους περιορισμούς" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Μη διαθέσιμη περιγραφή της ενημέρωσης." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Λεπτομέρειες ενημέρωσης" + +#: src/gs-app-details-page.ui:26 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Απαιτεί πρόσθετα δικαιώματα" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1111 +msgid "Reviews" +msgstr "Κριτικές" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Δεν βρέθηκαν κριτικές για αυτή την εφαρμογή." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Χωρίς κριτικές" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:563 +msgid "Version History" +msgstr "Ιστορικό εκδόσεων" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Νέο στην έκδοση %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Έκδοση %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Δεν υπάρχουν διαθέσιμες λεπτομέρειες γι' αυτήν την έκδοση" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:67 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Λειτουργία εκκίνησης : είτε ‘updates’, ‘updated’, ‘installed’ ή ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "ΛΕΙΤΟΥΡΓΙΑ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Αναζήτηση για εφαρμογές" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ΑΝΑΖΗΤΗΣΗ" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "" +"Εμφάνιση λεπτομερειών εφαρμογής (χρησιμοποιώντας το αναγνωριστικό της " +"εφαρμογής)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ΑΝΑΓΝΩΡΙΣΤΙΚΟ" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Εμφάνιση λεπτομερειών εφαρμογής (χρησιμοποιώντας το όνομα πακέτου)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Εγκατάσταση εφαρμογής (χρησιμοποιώντας το αναγνωριστικό της)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Απεγκατάσταση εφαρμογής (χρησιμοποιώντας το αναγνωριστικό της)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Άνοιγμα τοπικού πακέτου" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "ΟΝΟΜΑ ΑΡΧΕΙΟΥ" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Το είδος της αλληλεπίδρασης που αναμένεται για αυτήν τη ενέργεια: είτε " +"«none», «notify», ή «full»" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ΑΛΛΗΛΕΠΙΔΡΑΣΗ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Εμφάνιση τοπικού αρχείου μεταπληροφοριών ή δεδομένων εφαρμογής" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Ενεργοποίηση εξόδου λεπτομερούς εντοπισμού σφαλμάτων (από την παρούσα " +"εγκατάσταση, εάν εκτελείται ήδη)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Εγκαθιστά τυχόν εκκρεμείς ενημερώσεις στο παρασκήνιο" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Εμφάνιση προτιμήσεων" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Έξοδος από την εφαρμογή" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Προτιμήστε τοπικές πηγές αρχείων σε AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Προβολή του αριθμού έκδοσης" + +#: src/gs-application.c:271 src/gs-application.c:279 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Πνευματικά δικαιώματα © 2016–2023 Συνεισφέροντες Λογισμικού GNOME" + +#: src/gs-application.c:273 src/gs-application.c:282 +msgid "translator-credits" +msgstr "" +"Ελληνική μεταφραστική ομάδα GNOME\n" +" Δημήτρης Σπίγγος \n" +" Μαρία Θουκυδίδου \n" +" Μαρία Μαυρίδου \n" +" Ευστάθιος Ιωσηφίδης \n" +" Θάνος Τρυφωνίδης \n" +" Κοσμάς Μαρτακίδης \n" +"\n" +"Για περισσότερες πληροφορίες, επισκεφθείτε τη σελίδα\n" +"http://gnome.gr/" + +#. TRANSLATORS: this is the title of the about window +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-application.c:287 src/gs-shell.c:1977 +msgid "About Software" +msgstr "Περί του Λογισμικού" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:290 +msgid "A nice way to manage the software on your system." +msgstr "Ένας ωραίος τρόπος για τη διαχείριση του λογισμικού στο σύστημά σας." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:531 +msgid "Sorry! There are no details for that application." +msgstr "Συγγνώμη! Δεν υπάρχουν λεπτομέρειες γι' αυτή την εφαρμογή." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Μέγεθος εγκατάστασης" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Περιλαμβάνει %s δεδομένων και %s λανθάνουσας μνήμης" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Περιλαμβάνει %s δεδομένων" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Περιλαμβάνει %s λανθάνουσας μνήμης" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Άγνωστη χρήση λανθάνουσας μνήμης και δεδομένων" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Μέγεθος λήψης" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Δε χρειάζεται επιπλέον λήψεις συστήματος" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Χρειάζεται επιπλέον λήψεις συστήματος αγνώστου μεγέθους" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Χρειάζεται επιπλέον λήψεις συστήματος μεγέθους %s" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Άγνωστο μέγεθος" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Χωρίς δικαιώματα" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Έχει πρόσβαση δικτύου" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Χρησιμοποιεί υπηρεσίες συστήματος" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Χρησιμοποιεί υπηρεσίες συστήματος" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Δυνατότητα πρόσβασης συσκευών υλικού" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Δυνατότητα πρόσβασης στις συσκευές του συστήματος" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Δυνατότητα ανάγνωσης/εγγραφής όλων των δεδομένων" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Δυνατότητα ανάγνωσης όλων των δεδομένων" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Δυνατότητα ανάγνωσης/εγγραφής των αρχείων λήψης" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Δυνατότητα ανάγνωσης των αρχείων λήψης" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Δυνατότητα πρόσβασης ορισμένων συγκεκριμένων αρχείων" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:279 +msgid "Can access and change user settings" +msgstr "Δυνατότητα πρόσβασης και αλλαγής ρυθμίσεων χρήστη" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:263 +msgid "Uses a legacy windowing system" +msgstr "Χρησιμοποιεί ένα σύστημα παραθύρων παλαιού τύπου" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:271 +msgid "Can acquire arbitrary permissions" +msgstr "Δυνατότητα απόκτησης αυθαίρετων δικαιωμάτων" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Ο προγραμματιστής έχει επαληθευτεί" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:147 +msgid "Reviewed by OS distributor" +msgstr "Αξιολογήθηκε από τον διανομέα του λειτουργικού" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:150 +#, c-format +msgid "Reviewed by %s" +msgstr "Αξιολογήθηκε από %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:164 +msgid "Provided by a third party" +msgstr "Παρέχεται από τρίτο μέρος" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Το λογισμικό δεν υποστηρίζεται πλέον" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Ελεγχόμενος κώδικας" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Άγνωστη άδεια" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Ιδιοταγής κώδικας" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Ειδική άδεια" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Προνομιούχο" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Ασφαλές" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Μάλλον ασφαλές" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Πιθανώς επισφαλές" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Επισφαλές" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Μόνο για κινητό" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Λειτουργία μόνο σε μικρή οθόνη" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Μόνο για επιτραπέζιους υπολογιστές" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Λειτουργία μόνο σε μεγάλη οθόνη" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Αναντιστοιχία μεγέθους οθόνης" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Η τρέχουσα διάσταση οθόνης δεν υποστηρίζεται" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Απαιτείται οθόνη αφής" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Απαιτείται πληκτρολόγιο" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Απαιτείται ποντίκι" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Απαιτείται χειριστήριο" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Απαιτείται χειριστήριο παιχνιδιών" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Προσαρμόσιμο" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Λειτουργία σε κινητά, ταμπλέτες και επιτραπέζιους υπολογιστές" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Πιθανώς απαιτείται πληκτρολόγιο ή ποντίκι" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Λειτουργία σε επιτραπέζιους και φορητούς υπολογιστές" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Δεν περιέχει ακατάλληλο για ηλικία περιεχόμενο" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Μη διαθέσιμες πληροφορίες βαθμολόγησης ηλικίας" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Επισκεφθείτε τον ιστότοπο" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Εγκατάσταση…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Ακύρωση" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Εγκατάσταση" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Λήψη" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Ενημέρωση" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Απεγκατάσταση…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Γίνεται απεγκατάσταση" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:154 +#: src/gs-os-update-page.c:157 src/gs-os-update-page.c:184 +msgid "Critical update" +msgstr "Κρίσιμη ενημέρωση" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "" +"Η συσκευή δεν μπορεί να χρησιμοποιηθεί κατά τη διάρκεια της ενημέρωσης." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Πηγή: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "Μετονομάστηκε από %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:595 +msgid "Stopped Receiving Updates" +msgstr "Σταμάτησε να λαμβάνει ενημερώσεις" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Κρίσιμη ενημέρωση" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:574 +msgctxt "Single app" +msgid "Installed" +msgstr "Εγκατεστημένο" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Βοήθεια στη μετάφραση του %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, fuzzy, c-format +#| msgid "" +#| "%s is designed, developed, and translated by an international community " +#| "of volunteers.\n" +#| "\n" +#| "This means that while it’s not yet available in your language, you can " +#| "get involved and help translate it yourself." +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"Το %s σχεδιάστηκε, αναπτύχθηκε και μεταφράστηκε από μια διεθνή κοινότητα " +"εθελοντών.\n" +"\n" +"Αυτό σημαίνει ότι παρότι δεν είναι ακόμα διαθέσιμη στη γλώσσα σας, μπορείτε " +"να συμμετέχετε και να βοηθήσετε στη μετάφρασή της." + +#: src/gs-app-translation-dialog.ui:5 +msgid "Translations" +msgstr "Μεταφράσεις" + +#: src/gs-app-translation-dialog.ui:92 +msgid "_Translation Website" +msgstr "Ιστοσελίδα _μετάφρασης" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Απαιτείται σύνδεση απομακρυσμένου %s (τομέας %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Απαιτείται σύνδεση" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:14 src/gs-common.c:296 src/gs-common.c:748 +#: src/gs-details-page.ui:331 src/gs-page.c:435 src/gs-page.c:658 +#: src/gs-removal-dialog.ui:26 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:253 src/gs-review-dialog.ui:38 src/gs-review-row.c:243 +#: src/gs-updates-page.c:854 src/gs-updates-page.c:871 +#: src/gs-upgrade-banner.ui:201 +msgid "_Cancel" +msgstr "_Ακύρωση" + +#: src/gs-basic-auth-dialog.ui:26 +msgid "_Login" +msgstr "_Σύνδεση" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:62 src/gs-origin-popover-row.ui:130 +msgid "User" +msgstr "Χρήστης" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:75 +msgid "Password" +msgstr "Συνθηματικό" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Άλλο" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Όλες" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Δημοφιλέστερο" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Επιλογές συντακτών" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Νέες & ενημερωμένες" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Επιλογές από το διαδίκτυο" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Άλλο λογισμικό" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:195 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "Παρακαλούμε εισάγετε έναν αριθμό από το 1 έως το %u: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:283 +msgid "Choose an app:" +msgstr "Επιλογή εφαρμογής:" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Όλες" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Δημοφιλέστερες" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Γραφικά 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Φωτογραφία" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Σάρωση" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Διανυσματικά γραφικά" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Εφαρμογές προβολής" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Δημιουργία και επεξεργασία ήχου" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Αναπαραγωγείς μουσικής" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Όλες" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Δημοφιλέστερες" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Ημερολόγιο" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Βάση δεδομένων" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Οικονομικά" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Επεξεργαστής κειμένου" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Επεξεργαστές κειμένου" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Περιηγητές Ιστού" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Όλες" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Δημοφιλέστερες" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Δράση" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Περιπέτεια" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Κύβοι" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Επιτραπέζια" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Κάρτες" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Προσομοιωτές" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Παιδικά" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Λογική" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Παιχνίδια ρόλων" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Αθλητικά" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Στρατηγική" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Όλες" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Δημοφιλέστερες" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Συνομιλία" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Όλες" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Δημοφιλέστερες" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Τεχνητή νοημοσύνη" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Αστρονομία" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Χημεία" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Γλώσσες" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Μαθηματικά" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Ειδήσεις" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Ρομποτική" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Τέχνη" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Βιογραφία" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Κόμικ" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Φαντασία" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Υγεία" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Ιστορία" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Lifestyle" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Πολιτική" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Αθλητικά" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Όλες" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Δημοφιλέστερες" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Αποσφαλματωτές" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Ολοκληρωμένα περιβάλλοντα ανάπτυξης (IDE)" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Κωδικοποιητές" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Οδηγοί υλικού" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Γραμματοσειρές" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Πηγές εισόδου" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Πακέτα γλωσσών" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Τοπικοποίηση" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Δημιουργικότητα" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Εργασία" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Παιχνίδια" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Κοινωνικοποίηση" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Εκμάθηση" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Ανάπτυξη" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Κωδικοποιητές" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Οδηγοί υλικού" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Γραμματοσειρές" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Πηγές εισόδου" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Πακέτα γλωσσών" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Τοπικοποίηση" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:69 src/gs-common.c:92 +#, c-format +msgid "%s is now installed" +msgstr "Το %s είναι τώρα εγκατεστημένο" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:73 src/gs-common.c:96 +msgid "A restart is required for the changes to take effect." +msgstr "Απαιτείται επανεκκίνηση για να εφαρμοστούν αυτές οι αλλαγές." + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:77 +msgid "App is ready to be used." +msgstr "Η εφαρμογή είναι έτοιμη να χρησιμοποιηθεί." + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:85 +msgid "System updates are now installed" +msgstr "Έχουν εγκατασταθεί οι ενημερώσεις συστήματος" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:88 +msgid "Recently installed updates are available to review" +msgstr "Πρόσφατες εγκατεστημένες ενημερώσεις είναι διαθέσιμες για κριτική" + +#. TRANSLATORS: button text +#: src/gs-common.c:107 src/gs-common.c:911 +msgid "Restart" +msgstr "Επανεκκίνηση" + +#: src/gs-common.c:113 +msgid "Launch" +msgstr "Εκκίνηση" + +#. TRANSLATORS: window title +#: src/gs-common.c:230 +msgid "Install Software?" +msgstr "Εγκατάσταση λογισμικού;" + +#. TRANSLATORS: window title +#: src/gs-common.c:232 +msgid "Install Third-Party Software?" +msgstr "Να εγκατασταθεί λογισμικό από τρίτον;" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Enable Software Repository?" +msgstr "Ενεργοποίηση αποθετηρίου λογισμικού;" + +#. TRANSLATORS: window title +#: src/gs-common.c:238 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Να ενεργοποιηθεί αποθετήριο λογισμικού τρίτου;" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:250 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"Το %s δεν είναι ελεύθερου και ανοικτού κώδικα λογισμικό, και παρέχεται " +"από το «%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:260 +#, c-format +msgid "%s is provided by “%s”." +msgstr "Το %s παρέχεται από το «%s»." + +#: src/gs-common.c:269 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Αυτό το αποθετήριο λογισμικού πρέπει να ενεργοποιηθεί για να συνεχιστεί η " +"εγκατάσταση." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:279 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Μπορεί να είναι παράνομη η εγκατάσταση ή χρήση του %s σε κάποιες χώρες." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:285 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Μπορεί να είναι παράνομη η εγκατάσταση ή χρήση αυτού του κωδικοποιητή σε " +"κάποιες χώρες." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:299 +msgid "Don’t _Warn Again" +msgstr "Μην _προειδοποιείτε ξανά" + +#. TRANSLATORS: button text +#: src/gs-common.c:308 +msgid "Enable and _Install" +msgstr "Ενεργοποίηση και _εγκατάσταση" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:515 +msgid "Detailed errors from the package manager follow:" +msgstr "Ακολουθούν λεπτομερή σφάλματα από τον διαχειριστή πακέτων:" + +#: src/gs-common.c:522 src/gs-common.c:659 src/gs-safety-context-dialog.ui:71 +#: src/gs-toast.c:74 src/gs-updates-paused-banner.c:78 +msgid "Details" +msgstr "Λεπτομέρειες" + +#. TRANSLATORS: button text +#: src/gs-common.c:571 src/gs-updates-paused-banner.c:65 +msgid "_Close" +msgstr "_Κλείσιμο" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:740 +msgid "_Accept" +msgstr "_Αποδοχή" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:886 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Μια ενημέρωση έχει εγκατασταθεί" +msgstr[1] "Οι ενημερώσεις έχουν εγκατασταθεί" + +#. TRANSLATORS: we've just removed some apps +#: src/gs-common.c:896 +msgid "An app has been removed" +msgid_plural "Apps have been removed" +msgstr[0] "Αφαιρέθηκε μια εφαρμογή" +msgstr[1] "Αφαιρέθηκαν εφαρμογές" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:902 +msgid "A restart is required for it to take effect." +msgid_plural "A restart is required for them to take effect." +msgstr[0] "Απαιτείται επανεκκίνηση για να εφαρμοστεί η αλλαγή." +msgstr[1] "Απαιτείται επανεκκίνηση για να εφαρμοστούν αυτές οι αλλαγές." + +#. TRANSLATORS: button text +#: src/gs-common.c:909 +msgid "Not Now" +msgstr "Όχι τώρα" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1005 +msgid "Just now" +msgstr "Μόλις τώρα" + +#: src/gs-common.c:1007 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d λεπτό πριν" +msgstr[1] "%d λεπτά πριν" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ώρα πριν" +msgstr[1] "%d ώρες πριν" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d ημέρα πριν" +msgstr[1] "%d ημέρες πριν" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d εβδομάδα πριν" +msgstr[1] "%d εβδομάδες πριν" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d μήνα πριν" +msgstr[1] "%d μήνες πριν" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d χρόνος πριν" +msgstr[1] "%d χρόνια πριν" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1390 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Εφαρμογή" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "Το %s ζητά πρόσθετη υποστήριξη μορφής αρχείου." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Απαιτούνται πρόσθετοι τύποι MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "Το %s ζητά πρόσθετες γραμματοσειρές." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Απαιτούνται πρόσθετες γραμματοσειρές" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "Το %s ζητά πρόσθετους κωδικοποιητές πολυμέσων." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Απαιτούνται πρόσθετοι κωδικοποιητές πολυμέσων" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "Το %s ζητά πρόσθετους οδηγούς εκτυπωτή." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Απαιτούνται πρόσθετοι οδηγοί εκτυπωτή" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "Το %s ζητά πρόσθετα πακέτα." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Απαιτούνται πρόσθετα πακέτα" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Εύρεση στο λογισμικό" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "Εμ_φάνιση περισσότερων" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Εμ_φάνιση λιγότερων" + +#: src/gs-details-page.c:385 +msgid "Removing…" +msgstr "Αφαιρείται…" + +#: src/gs-details-page.c:400 +msgid "Requires restart to finish install" +msgstr "Απαιτεί επανεκκίνηση για ολοκλήρωση της εγκατάστασης" + +#: src/gs-details-page.c:407 +msgid "Requires restart to finish remove" +msgstr "Απαιτεί επανεκκίνηση για ολοκλήρωση της αφαίρεσης" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:424 +msgid "Pending installation…" +msgstr "Εκκρεμεί εγκατάσταση…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:430 +msgid "Pending update…" +msgstr "Εκκρεμής ενημέρωση…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:445 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Γίνεται λήψη…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:448 +msgid "Preparing…" +msgstr "Προετοιμάζεται…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:451 +msgid "Uninstalling…" +msgstr "Γίνεται απεγκατάσταση…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:578 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "Το %s δεν είναι εγκατεστημένο, αλλά εξακολουθεί να έχει δεδομένα." + +#: src/gs-details-page.c:1072 +msgid "_Restart" +msgstr "_Επανεκκίνηση" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1096 +msgid "_Install…" +msgstr "Ε_γκατάσταση…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1309 +#, c-format +msgid "%s will appear in US English" +msgstr "Το %s θα εμφανιστεί στα Αγγλικά των ΗΠΑ" + +#: src/gs-details-page.c:1317 +msgid "This app will appear in US English" +msgstr "Αυτή η εφαρμογή θα εμφανίζεται στα Αγγλικά των ΗΠΑ" + +#: src/gs-details-page.c:1319 +msgid "This software will appear in US English" +msgstr "Αυτό το λογισμικό θα εμφανιστεί στα Αγγλικά των ΗΠΑ" + +#: src/gs-details-page.c:1354 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "Βοήθεια στη _μετάφραση" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1419 +#, c-format +msgid "Other Apps by %s" +msgstr "Άλλες εφαρμογές από %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1455 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Ο προγραμματιστής %s έχει αποδείξει την ιδιοκτησία του %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1458 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Ο προγραμματιστής έχει αποδείξει την ιδιοκτησία του %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1826 +msgid "You need internet access to write a review" +msgstr "Απαιτείται σύνδεση στο διαδίκτυο για να γράψετε μια κριτική" + +#: src/gs-details-page.c:1927 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Αυτή η εφαρμογή δεν λαμβάνει πλέον ενημερώσεις, συμπεριλαμβανομένων των " +"επιδιορθώσεων ασφαλείας" + +#: src/gs-details-page.c:1928 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Αυτή η εφαρμογή παρέχεται ήδη από τη διανομή σας και δεν πρέπει να " +"αντικατασταθεί." + +#: src/gs-details-page.c:1929 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Αυτή η εφαρμογή δεν παρέχει συνδέσμους προς ιστότοπο, αποθετήριο κώδικα ή " +"ιχνηλάτη προβλημάτων." + +#: src/gs-details-page.c:1931 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Αυτό το λογισμικό δεν λαμβάνει πλέον ενημερώσεις, συμπεριλαμβανομένων των " +"επιδιορθώσεων ασφαλείας" + +#: src/gs-details-page.c:1932 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Αυτό το λογισμικό παρέχεται ήδη από τη διανομή σας και δεν πρέπει να " +"αντικατασταθεί." + +#: src/gs-details-page.c:1933 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Η εφαρμογή αυτή δεν παρέχει συνδέσμους σε ιστότοπο, αποθετήριο κώδικα ή " +"ιχνηλάτη σφαλμάτων." + +#: src/gs-details-page.c:2023 src/gs-details-page.c:2039 +#, c-format +msgid "Unable to find “%s”" +msgstr "Αδύνατη η εύρεση του «%s»" + +#: src/gs-details-page.c:2387 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Αποτυχία υποβολής κριτικής για το «%s»: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Σελίδα λεπτομερειών" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Γίνεται φόρτωση λεπτομερειών εφαρμογής" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Επαληθεύτηκε" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "Ά_νοιγμα" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Ε_νημέρωση" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Απεγκατάσταση" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:135 +msgid "Add-ons" +msgstr "Πρόσθετα" + +#: src/gs-details-page.ui:666 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Η εφαρμογή αυτή μπορεί να χρησιμοποιηθεί μόνο όταν υπάρχει ενεργή σύνδεση " +"διαδικτύου." + +#: src/gs-details-page.ui:689 +msgid "Software Repository Included" +msgstr "Συμπεριελήφθη αποθετήριο λογισμικού" + +#: src/gs-details-page.ui:699 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Αυτή η εφαρμογή περιλαμβάνει ένα αποθετήριο λογισμικού που παρέχει " +"ενημερώσεις, καθώς και πρόσβαση σε άλλο λογισμικό." + +#: src/gs-details-page.ui:727 +msgid "No Software Repository Included" +msgstr "Δεν συμπεριελήφθη αποθετήριο λογισμικού" + +#: src/gs-details-page.ui:737 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Αυτή η εφαρμογή δεν περιλαμβάνει αποθετήριο λογισμικού. Δεν θα ενημερωθεί με " +"νέες εκδόσεις." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:796 +msgid "Software Repository Identified" +msgstr "Αναγνωρίστηκε αποθετήριο λογισμικού" + +#: src/gs-details-page.ui:806 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Η προσθήκη αυτού του αποθετηρίου λογισμικού θα σας δώσει πρόσβαση σε " +"πρόσθετο λογισμικό και αναβαθμίσεις." + +#: src/gs-details-page.ui:813 +msgid "Only use software repositories that you trust." +msgstr "Χρησιμοποιήστε μόνο τα αποθετήρια λογισμικού που εμπιστεύεστε." + +#: src/gs-details-page.ui:854 +msgid "Clear app data" +msgstr "Εκκαθάριση δεδομένων εφαρμογή" + +#: src/gs-details-page.ui:871 +msgid "D_elete Data" +msgstr "_Διαγραφή δεδομένων" + +#: src/gs-details-page.ui:947 +msgid "No Metadata" +msgstr "Δεν υπάρχουν μεταδεδομένα" + +#: src/gs-details-page.ui:984 +msgid "Project _Website" +msgstr "_Ιστότοπος έργου" + +#: src/gs-details-page.ui:1001 +msgid "_Donate" +msgstr "_Δωρεά" + +#: src/gs-details-page.ui:1018 +msgid "Contribute _Translations" +msgstr "Συνεισφορά _μετάφρασης" + +#: src/gs-details-page.ui:1035 +msgid "_Report an Issue" +msgstr "_Αναφορά σφάλματος" + +#: src/gs-details-page.ui:1052 +msgid "_Help" +msgstr "_Βοήθεια" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1069 +msgctxt "verb" +msgid "_Contact" +msgstr "_Επαφή" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1163 +msgid "Write R_eview" +msgstr "Γράψτε _κριτική" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1200 +msgid "All Reviews" +msgstr "Όλες οι κριτικές" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Λήψη επιπλέον μεταδεδομένων αρχείων…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " και " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Διαθέσιμες γραμματοσειρές για το σενάριο %s" +msgstr[1] "Διαθέσιμες γραμματοσειρές για τα σενάρια %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Διαθέσιμο λογισμικό για το %s" +msgstr[1] "Διαθέσιμο λογισμικό για το %s" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Δεν βρέθηκε το λογισμικό που ζητήσατε" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Αδύνατη η εύρεση του λογισμικού που ζητήσατε" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "Δεν βρέθηκε το %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "στον ιστότοπο" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Δεν υπάρχουν διαθέσιμες εφαρμογές που παρέχουν το αρχείο %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Πληροφορίες για το %s, καθώς και επιλογές για το πώς θα πάρετε τις εφαρμογές " +"που λείπουν μπορούν να βρεθούν στο %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "Δεν υπάρχουν διαθέσιμες εφαρμογές για υποστήριξη του %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "Το %s δεν είναι διαθέσιμο." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Πληροφορίες για το %s, καθώς και επιλογές για το πώς θα πάρετε μια εφαρμογή " +"που μπορεί να υποστηρίξει αυτή τη μορφή μπορούν να βρεθούν στο %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Δεν υπάρχουν διαθέσιμες γραμματοσειρές για υποστήριξη του σεναρίου %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Πληροφορίες για το %s, καθώς και επιλογές για το πώς θα πάρετε πρόσθετες " +"γραμματοσειρές μπορούν να βρεθούν στο %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Δεν υπάρχουν διαθέσιμα πρόσθετα κωδικοποιητών για τη μορφή %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Πληροφορίες για το %s, καθώς και επιλογές για το πώς θα πάρετε έναν " +"κωδικοποιητή που μπορεί να αναπαράγει αυτήν τη μορφή μπορούν να βρεθούν στο " +"%s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Δεν υπάρχουν διαθέσιμοι πόροι πλάσματος για υποστήριξη του %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Πληροφορίες για το %s, καθώς και επιλογές για το πώς θα πάρετε πρόσθετους " +"πόρους πλάσματος μπορούν να βρεθούν στο %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Δεν υπάρχουν διαθέσιμοι οδηγοί εκτυπωτή για το %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Πληροφορίες για το %s, καθώς και επιλογές για το πώς θα πάρετε έναν οδηγό " +"που υποστηρίζει αυτόν τον εκτυπωτή μπορούν να βρεθούν στο %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "η τεκμηρίωση" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Αδυναμία εύρεσης του %s που αναζήτησε ο %s. Παρακαλούμε δείτε το %s για " +"περισσότερες πληροφορίες." +msgstr[1] "" +"Αδυναμία εύρεσης των %s που αναζήτησε ο %s. Παρακαλούμε δείτε το %s για " +"περισσότερες πληροφορίες." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Αδυναμία εύρεσης του %s που αναζητούσατε. Παρακαλούμε δείτε το %s για " +"περισσότερες πληροφορίες." +msgstr[1] "" +"Αδυναμία εύρεσης των %s που αναζητούσατε. Παρακαλούμε δείτε το %s για " +"περισσότερες πληροφορίες." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Αποτυχία εύρεσης αποτελεσμάτων αναζήτησης: %s" + +#: src/gs-extras-page.c:972 +#, c-format +msgid "%s file format" +msgstr "Μορφή αρχείου %s" + +#: src/gs-extras-page.c:1333 +msgid "Install _All" +msgstr "Εγ_κατάσταση όλων" + +#: src/gs-extras-page.c:1363 +msgid "Unable to Find Requested Software" +msgstr "Αδύνατη η εύρεση του ζητούμενου λογισμικού" + +#: src/gs-extras-page.ui:6 +msgid "Codecs page" +msgstr "Σελίδα κωδικοποιητών" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Προηγούμενο" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Επόμενο" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Προτεινόμενη λίστα εφαρμογών" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Υποστήριξη επιτραπέζιας συσκευής" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Υποστηρίζει χρήση σε μεγάλη οθόνη" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Άγνωστη υποστήριξη επιτραπέζιας συσκευής" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Δεν υπάρχουν αρκετές πληροφορίες για υποστήριξη μεγάλων οθονών" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Απαιτείται μεγάλη οθόνη" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Δεν υποστηρίζεται επιτραπέζια συσκευή" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Δε μπορεί να χρησιμοποιηθεί σε μεγάλη οθόνη" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Υποστήριξη φορητής συσκευής" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Υποστηρίζει χρήση σε μικρή οθόνη" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Άγνωστη υποστήριξη φορητής συσκευής" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Δεν υπάρχουν αρκετές πληροφορίες για υποστήριξη μικρών οθονών" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Απαιτείται μικρή οθόνη" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Δεν υποστηρίζεται φορητή συσκευή" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Δε μπορεί να χρησιμοποιηθεί σε μικρή οθόνη" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Υποστήριξη πληκτρολογίου" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Άγνωστη υποστήριξη πληκτρολογίου" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Δεν υπάρχουν αρκετές πληροφορίες για υποστήριξη πληκτρολογίων" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Απαιτείται πληκτρολόγιο" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Υποστηρίζονται πληκτρολόγια" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Δεν υποστηρίζεται πληκτρολόγιο" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Δε μπορεί να χρησιμοποιηθεί με πληκτρολόγιο" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Υποστήριξη ποντικιού" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Απαιτείται ποντίκι ή συσκευή κατάδειξης" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Άγνωστη υποστήριξη ποντικιού" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Δεν υπάρχουν αρκετές πληροφορίες για υποστήριξη ποντικιών ή συσκευών " +"κατάδειξης" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Απαιτείται ποντίκι" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Υποστηρίζονται ποντίκια και συσκευές κατάδειξης" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Δεν υποστηρίζεται ποντίκι" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Δε μπορεί να χρησιμοποιηθεί με ποντίκι ή συσκευή κατάδειξης" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Υποστήριξη οθόνης αφής" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Άγνωστη υποστήριξη οθόνης αφής" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Δεν υπάρχουν αρκετές πληροφορίες για υποστήριξη οθονών αφής" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Απαιτείται οθόνη αφής" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Υποστηρίζονται οθόνες αφής" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Δεν υποστηρίζεται οθόνη αφής" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Δε μπορεί να χρησιμοποιηθεί με οθόνη αφής" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Απαιτείται χειριστήριο παιχνιδιών" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Απαιτείται ένα χειριστήριο παιχνιδιών" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Υποστήριξη χειριστηρίου παιχνιδιών" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Υποστηρίζονται χειριστήρια παιχνιδιών" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "Το %s πιθανώς λειτουργεί σε αυτή τη συσκευή" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "Το %s λειτουργεί σε αυτή τη συσκευή" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "Το %s πιθανώς να λειτουργεί σε αυτήν τη συσκευή" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "Το %s υπολειτουργεί σε αυτή τη συσκευή" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "Το %s δε λειτουργεί σε αυτή τη συσκευή" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:5 +msgid "Hardware Support" +msgstr "Υποστήριξη υλικού" + +#: src/gs-help-overlay.ui:12 +msgid "Navigation" +msgstr "Περιήγηση" + +#: src/gs-help-overlay.ui:17 +msgid "Navigate to Explore Page" +msgstr "Μετάβαση στη σελίδα εξερεύνησης" + +#: src/gs-help-overlay.ui:23 +msgid "Navigate to Installed Page" +msgstr "Πλοήγηση στη σελίδα εγκατεστημένων" + +#: src/gs-help-overlay.ui:29 +msgid "Navigate to Updates Page" +msgstr "Πλοήγηση στη σελίδα ενημερώσεων" + +#: src/gs-help-overlay.ui:35 +msgid "Open Search Bar" +msgstr "Άνοιγμα γραμμής αναζήτησης" + +#: src/gs-help-overlay.ui:43 +msgid "Windows" +msgstr "Παράθυρα" + +#: src/gs-help-overlay.ui:48 +msgid "Open Preferences" +msgstr "Άνοιγμα προτιμήσεων" + +#: src/gs-help-overlay.ui:54 +msgid "Open Software Repositories" +msgstr "Άνοιγμα αποθετηρίων λογισμικού" + +#: src/gs-help-overlay.ui:62 +msgid "Help" +msgstr "Βοήθεια" + +#: src/gs-help-overlay.ui:67 +msgid "Open Keyboard Shortcuts" +msgstr "Άνοιγμα συντομεύσεων πληκτρολογίου" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:818 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Εγκατεστημένα" + +#: src/gs-installed-page.ui:6 +msgid "Installed page" +msgstr "Εγκατεστημένη σελίδα" + +#: src/gs-installed-page.ui:55 +msgid "In Progress" +msgstr "Σε Εξέλιξη" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:75 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Εφαρμογές" + +#: src/gs-installed-page.ui:95 +msgid "Web Apps" +msgstr "Εφαρμογές Ιστού" + +#: src/gs-installed-page.ui:115 +msgid "System Apps" +msgstr "Εφαρμογές συστήματος" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Χτισμένα από την Κοινότητα" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:98 +msgid "_Get Involved" +msgstr "_Συνείσφερε" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, fuzzy, c-format +#| msgid "" +#| "This app is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Αυτή η εφαρμογή αναπτύσσεται ανοιχτά από μια κοινότητα εθελοντών και " +"κυκλοφορεί με την άδεια %s.\n" +"\n" +"Μπορείτε να συνεισφέρετε και να βοηθήσετε να γίνει ακόμα καλύτερο." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, fuzzy, c-format +#| msgid "" +#| "This app is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Αυτή η εφαρμογή αναπτύσσεται ανοιχτά από μια κοινότητα εθελοντών και " +"κυκλοφορεί με την άδεια %s.\n" +"\n" +"Μπορείτε να συνεισφέρετε και να βοηθήσετε να γίνει ακόμα καλύτερο." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, fuzzy, c-format +#| msgid "" +#| "This software is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Το λογισμικό αυτό αναπτύσσεται ανοικτά από μια κοινότητα εθελοντών, και " +"κυκλοφορεί με την άδεια %s.\n" +"\n" +"Μπορείτε να συνεισφέρετε και να βοηθήσετε για να γίνει ακόμα καλύτερο." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, fuzzy, c-format +#| msgid "" +#| "This software is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Το λογισμικό αυτό αναπτύσσεται ανοικτά από μια κοινότητα εθελοντών, και " +"κυκλοφορεί με την άδεια %s.\n" +"\n" +"Μπορείτε να συνεισφέρετε και να βοηθήσετε για να γίνει ακόμα καλύτερο." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:413 +msgid "Unknown License" +msgstr "Άγνωστη άδεια" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Μάθετε περισσότερα" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Αυτή η εφαρμογή δεν προσδιορίζει με ποια άδεια έχει αναπτυχθεί και μπορεί να " +"είναι ιδιόκτητο. Μπορεί να είναι ανασφαλές με τρόπους που είναι δύσκολο να " +"εντοπιστούν και μπορεί να αλλάξει χωρίς επίβλεψη.\n" +"\n" +"Μπορεί να μπορείτε ή να μην μπορείτε να συνεισφέρετε σε αυτήν την εφαρμογή." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Αυτό το λογισμικό δεν προσδιορίζει με ποια άδεια έχει αναπτυχθεί και μπορεί " +"να είναι ιδιόκτητο. Μπορεί να είναι ανασφαλές με τρόπους που είναι δύσκολο " +"να εντοπιστούν και μπορεί να αλλάξει χωρίς επίβλεψη.\n" +"\n" +"Μπορεί να μπορείτε ή να μην μπορείτε να συνεισφέρετε σε αυτό το λογισμικό." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:586 +msgid "Proprietary" +msgstr "Ιδιοταγές" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Αυτή η εφαρμογή δεν έχει αναπτυχθεί ανοιχτά, επομένως μόνο οι " +"προγραμματιστές της γνωρίζουν πώς λειτουργεί. Μπορεί να είναι ανασφαλές με " +"τρόπους που είναι δύσκολο να εντοπιστούν και μπορεί να αλλάξει χωρίς " +"επίβλεψη.\n" +"\n" +"Ενδέχεται να μην μπορείτε να συνεισφέρετε σε αυτήν την εφαρμογή." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Το λογισμικό αυτό δεν αναπτύσσεται ανοικτά, συνεπώς μόνο οι προγραμματιστές " +"του γνωρίζουν πώς λειτουργεί. Μπορεί να είναι ανασφαλές με τρόπο που είναι " +"δύσκολο να ανιχνευτεί, ενώ μπορεί να αλλάξει χωρίς επίβλεψη.\n" +"\n" +"Μπορεί να μην είναι εφικτό να συνεισφέρετε στο λογισμικό αυτό." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:450 +msgid "Special License" +msgstr "Ειδική άδεια" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Αυτή η εφαρμογή έχει αναπτυχθεί με την ειδική άδεια %s.\n" +"\n" +"Μπορεί να μπορείτε ή να μην μπορείτε να συνεισφέρετε σε αυτήν την εφαρμογή." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Αυτή η εφαρμογή έχει αναπτυχθεί με την ειδική άδεια \"%s\".\n" +"\n" +"Μπορεί να μπορείτε ή να μην μπορείτε να συνεισφέρετε σε αυτήν την εφαρμογή." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Αυτό το λογισμικό έχει αναπτυχθεί με την ειδική άδεια %s.\n" +"\n" +"Μπορεί να μπορείτε ή να μην μπορείτε να συνεισφέρετε σε αυτό το λογισμικό." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Αυτό το λογισμικό έχει αναπτυχθεί με την ειδική άδεια «%s».\n" +"\n" +"Μπορεί να μπορείτε ή να μην μπορείτε να συνεισφέρετε σε αυτό το λογισμικό." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:56 +#, fuzzy +#| msgid "Downloading software catalog" +msgid "Downloading Software Catalog" +msgstr "Λήψη καταλόγου λογισμικού" + +#: src/gs-loading-page.ui:6 +msgid "Loading page" +msgstr "Φόρτωση σελίδας" + +#: src/gs-loading-page.ui:11 +msgid "Starting Up" +msgstr "Γίνεται εκκίνηση" + +#: src/gs-moderate-page.ui:6 +msgid "Moderate page" +msgstr "Σελίδα διαχείρισης" + +#: src/gs-moderate-page.ui:71 +msgid "There are no reviews to moderate" +msgstr "Δεν υπάρχουν κριτικές προς διαχείριση" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Άγνωστη πηγή" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:104 +msgid "Beta" +msgstr "Beta" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:285 +msgid "Additions" +msgstr "Προσθήκες" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:289 +msgid "Removals" +msgstr "Αφαιρέσεις" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:293 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Ενημερώσεις" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:297 +msgid "Downgrades" +msgstr "Υποβαθμίσεις" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:734 +msgid "selected external sources" +msgstr "επιλεγμένες εξωτερικές πηγές" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:738 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Παρέχει πρόσβαση σε επιπρόσθετο λογισμικό από %s. Περιλαμβάνεται ιδιοταγές " +"λογισμικό.\n" +"\n" +"Μπορείτε να ενεργοποιήσετε αυτά τα αποθετήρια αργότερα στις Προτιμήσεις " +"Αποθετηρίων Λογισμικού." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:744 +msgid "Enable Third Party Software Repositories?" +msgstr "Να ενεργοποιηθούν τα αποθετήρια λογισμικού τρίτων;" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:749 +msgid "_Ignore" +msgstr "Α_γνόηση" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:751 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Ενεργοποίηση" + +#: src/gs-overview-page.c:954 +msgid "Available for your operating system" +msgstr "Διαθέσιμο για το λειτουργικό σας σύστημα" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:958 +#, c-format +msgid "Available for %s" +msgstr "Διαθέσιμο για %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1255 +msgid "Explore" +msgstr "Εξερεύνηση" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Σελίδα επισκόπησης" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Διαθέσιμες εφαρμογές" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Άλλες κατηγορίες" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Δε βρέθηκαν δεδομένα εφαρμογής" + +#: lib/gs-plugin-loader.c:2814 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Άγνωστη" + +#. TRANSLATORS: button text +#: src/gs-page.c:93 +msgid "_OK" +msgstr "Ε_ντάξει" + +#: src/gs-page.c:290 +msgid "User declined installation" +msgstr "Ο χρήστης απέρριψε την εγκατάσταση" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:429 +#, c-format +msgid "Prepare %s" +msgstr "Προετοιμασία του %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:568 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Είστε σίγουροι ότι θέλετε να αφαιρέσετε το αποθετήριο %s;" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:572 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Όλες οι εφαρμογές από το %s θα απεγκατασταθούν, και θα χρειαστεί να " +"επανεγκαταστήσετε το αποθετήριο για να τις χρησιμοποιήσετε ξανά." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:582 +#, c-format +msgid "Uninstall %s?" +msgstr "Απεγκατάσταση του %s;" + +#: src/gs-page.c:591 +msgid "App Settings & Data" +msgstr "Ρυθμίσεις & Δεδομένα εφαρμογής" + +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:594 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Δεν θα είναι δυνατή η χρήση του %s μετά την αφαίρεση." + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:617 +msgid "_Keep" +msgstr "_Διατήρηση" + +#: src/gs-page.c:623 +msgid "Allows restoring app settings and content" +msgstr "" +"Επιτρέπει την επαναφορά των ρυθμίσεων και του περιεχομένου της εφαρμογής" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:632 +msgid "_Delete" +msgstr "_Διαγραφή" + +#: src/gs-page.c:638 +msgid "Permanently deletes data to save disk space" +msgstr "Διαγράφει μόνιμα δεδομένα για εξοικονόμηση χώρου στο δίσκο" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:645 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Δεν θα είναι δυνατή η χρήση του %s μετά την αφαίρεση. Τα δεδομένα και οι " +"ρυθμίσεις της εφαρμογής θα διατηρηθούν στο δίσκο, για να επιτραπεί η " +"επαναφορά της εφαρμογής στο μέλλον." + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:660 +msgid "_Uninstall" +msgstr "_Απεγκατάσταση" + +#: src/gs-prefs-dialog.ui:5 +msgid "Preferences" +msgstr "Προτιμήσεις" + +#: src/gs-prefs-dialog.ui:14 +msgid "Software Updates" +msgstr "Ενημερώσεις λογισμικού" + +#: src/gs-prefs-dialog.ui:26 +msgid "_Automatic" +msgstr "_Αυτόματα" + +#: src/gs-prefs-dialog.ui:27 +#, fuzzy +#| msgid "Automatically download and install updates" +msgid "Automatically check for and download updates" +msgstr "Αυτόματη λήψη και εγκατάσταση των ενημερώσεων" + +#: src/gs-prefs-dialog.ui:41 +msgid "_Manual" +msgstr "_Χειροκίνητο" + +#: src/gs-prefs-dialog.ui:42 +msgid "Checking for and downloading updates must be done manually" +msgstr "Ο έλεγχος και η λήψη των ενημερώσεων πρέπει να γίνει χειροκίνητα" + +#: src/gs-prefs-dialog.ui:60 +msgid "Automatic Update _Notifications" +msgstr "_Ειδοποιήσεις αυτόματης ενημέρωσης" + +#: src/gs-prefs-dialog.ui:61 +#, fuzzy +#| msgid "Show notifications when updates have been automatically installed" +msgid "Notify when updates have been automatically installed" +msgstr "Εμφάνιση ειδοποιήσεων όταν οι ενημερώσεις έχουν εγκατασταθεί αυτόματα" + +#: src/gs-prefs-dialog.ui:76 +#, fuzzy +#| msgid "Contact Details" +msgid "Content Filters" +msgstr "Λεπτομέρειες επαφής" + +#: src/gs-prefs-dialog.ui:79 +#, fuzzy +#| msgid "Other Software" +msgid "Only Show _Free Software" +msgstr "Άλλο λογισμικό" + +#: src/gs-prefs-dialog.ui:80 +msgid "Hide proprietary software when browsing and searching" +msgstr "Απόκρυψη ιδιοταγούς λογισμικού κατά την περιήγηση και αναζήτηση" + +#: src/gs-prefs-dialog.ui:93 +msgid "Only Show _Verified Developers" +msgstr "Εμφάνιση μόνο _Επαληθευμένων Προγραμματιστών" + +#: src/gs-prefs-dialog.ui:94 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Εμφάνιση μόνο εφαρμογών από προγραμματιστές των οποίων η ταυτότητα έχει " +"επαληθευτεί" + +#: src/gs-prefs-dialog.ui:120 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Ο έλεγχος και η λήψη ενημερώσεων χρησιμοποιεί δεδομένα και ενέργεια. Ως εκ " +"τούτου, οι λειτουργίες αυτόματης ενημέρωσης τίθενται σε παύση όταν υπάρχουν " +"μετρημένες συνδέσεις δικτύου και όταν είναι ενεργοποιημένη η εξοικονόμηση " +"ενέργειας." + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Μερικές από τις εγκατεστημένες εφαρμογές δεν είναι συμβατές με το %s, και θα " +"αφαιρεθούν αυτόματα κατά την αναβάθμιση." + +#: src/gs-removal-dialog.ui:7 +msgid "Incompatible Software" +msgstr "Ασύμβατο λογισμικό" + +#: src/gs-removal-dialog.ui:35 +msgid "_Upgrade" +msgstr "_Αναβάθμιση" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:245 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Το λογισμικό που έχει εγκατασταθεί από το αποθετήριο \"%s\" θα σταματήσει να " +"λαμβάνει ενημερώσεις." + +#: src/gs-repos-dialog.c:250 +msgid "Disable Repository?" +msgstr "Απενεργοποίηση αποθετηρίου;" + +#: src/gs-repos-dialog.c:250 +msgid "Remove Repository?" +msgstr "Αφαίρεση αποθετηρίου;" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:257 +msgid "_Disable" +msgstr "_Απενεργοποίηση" + +#. TRANSLATORS: this is button text to remove a repo +#: src/gs-repos-dialog.c:261 +msgid "_Remove" +msgstr "Α_φαίρεση" + +#: src/gs-repos-dialog.c:618 +msgid "Enable New Repositories" +msgstr "Ενεργοποίηση νέων αποθετηρίων" + +#: src/gs-repos-dialog.c:619 +msgid "Turn on new repositories when they are added." +msgstr "Ενεργοποίησε τα νέα αποθετήρια όταν προστίθενται." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:628 +msgid "more information" +msgstr "περισσότερες πληροφορίες" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:633 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Πρόσθετα αποθετήρια από επιλεγμένους τρίτους — %s." + +#: src/gs-repos-dialog.c:638 +msgid "Fedora Third Party Repositories" +msgstr "Αποθετήρια τρίτων Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:790 +msgid "the operating system" +msgstr "το λειτουργικό σύστημα" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:846 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Αυτά τα αποθετήρια συμπληρώνουν το προεπιλεγμένο λογισμικό που παρέχεται από " +"το %s." + +#: src/gs-repos-dialog.ui:8 src/gs-toast.c:62 +msgid "Software Repositories" +msgstr "Αποθετήρια λογισμικού" + +#: src/gs-repos-dialog.ui:52 +msgid "No Repositories" +msgstr "Κανένα αποθετήριο" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u εφαρμογή εγκαταστάθηκε" +msgstr[1] "%u εφαρμογές εγκαταστάθηκαν" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u πρόσθετο εγκαταστάθηκε" +msgstr[1] "%u πρόσθετα εγκαταστάθηκαν" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u εφαρμογή" +msgstr[1] "%u εφαρμογές" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u πρόσθετο" +msgstr[1] "%u πρόσθετα" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "Τα %s και %s εγκαταστάθηκαν" +msgstr[1] "Τα %s και %s εγκαταστάθηκαν" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Γίνεται έλεγχος εγκατεστημένου λογισμικού…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Αφαίρεση" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Το μισώ" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Δεν μου αρέσει" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "Είναι εντάξει" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Μου αρέσει" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Το αγαπώ" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Επιλέξτε ένα αστέρι για να αφήσετε μια αξιολόγηση" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Παρακαλούμε, αφιερώστε περισσότερο χρόνο για τη κριτική σας" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Παρακαλούμε επιλέξτε μια βαθμολογία" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Η σύνοψη είναι πολύ μιρκή" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Η σύνοψη είναι πολύ μεγάλη" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "Η περιγραφή είναι πολύ μικρή" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "Η περιγραφή είναι πολύ μεγάλη" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Γράψτε μια κριτική" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:46 +msgid "_Send" +msgstr "_Αποστολή" + +#: src/gs-review-dialog.ui:65 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Παρακαλούμε δώστε μια αξιολόγηση, μια περίληψη και ένα κείμενο κριτικής. Οι " +"κριτικές δε θα έπρεπε να χρησιμοποιούνται για αναφορά προβλημάτων: αντί " +"αυτού, επικοινωνήστε με τον προγραμματιστή ή τον πάροχο της υποστήριξής σας." + +#: src/gs-review-dialog.ui:111 +msgid "Review Summary" +msgstr "Περίληψη κριτικής" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:143 +msgctxt "app review" +msgid "Write a short review" +msgstr "Γράψτε μια σύντομη κριτική" + +#: src/gs-review-dialog.ui:187 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Βρείτε τα δεδομένα που αποστέλλονται στην πολιτική απορρήτου. Το πλήρες όνομα που αντιστοιχεί στο " +"λογαριασμό σας θα προβάλλεται δημοσίως." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "Συνολικά %u κριτική" +msgstr[1] "Συνολικά %u κριτικές" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "από 5 αστέρια" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:60 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Άγνωστος" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:228 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Μπορείτε να αναφέρετε τις κριτικές για καταχρηστική, αγενής, ή μεροληπτική " +"συμπεριφορά." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:233 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Αφού αναφερθεί, μια κριτική παραμένει κρυφή μέχρι να ελεγχθεί από τον " +"διαχειριστή." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:241 +msgid "Report Review?" +msgstr "Αναφορά κριτικής;" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:246 +msgid "_Report" +msgstr "_Αναφορά" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:84 +msgid "Was this review useful to you?" +msgstr "Ήταν η κριτική χρήσιμη σε εσάς;" + +#: src/gs-review-row.ui:100 +msgid "Yes" +msgstr "Ναι" + +#: src/gs-review-row.ui:108 +msgid "No" +msgstr "Όχι" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:116 +msgid "Meh" +msgstr "Έτσι και έτσι" + +#: src/gs-review-row.ui:128 +msgid "Report…" +msgstr "Αναφορά…" + +#: src/gs-review-row.ui:137 +msgid "Remove…" +msgstr "Αφαίρεση…" + +#: src/gs-safety-context-dialog.c:157 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Η εφαρμογή δεν είναι φιλτραρισμένη αλλά η διανομή έλεγξε ότι δεν είναι " +"κακόβουλη" + +#: src/gs-safety-context-dialog.c:165 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Ελέγξτε ότι εμπιστεύεστε τον προμηθευτή, καθώς η εφαρμογή δεν είναι " +"φιλτραρισμένη" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:180 +msgid "No Permissions" +msgstr "Χωρίς δικαιώματα" + +#: src/gs-safety-context-dialog.c:181 +msgid "App is fully sandboxed" +msgstr "Η εφαρμογή είναι πλήρως φιλτραρισμένη" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "Network Access" +msgstr "Πρόσβαση δικτύου" + +#: src/gs-safety-context-dialog.c:193 +msgid "Can access the internet" +msgstr "Υπάρχει πρόσβαση στο διαδίκτυο" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:196 +msgid "No Network Access" +msgstr "Χωρίς πρόσβαση στο δίκτυο" + +#: src/gs-safety-context-dialog.c:197 +msgid "Cannot access the internet" +msgstr "Αδυναμία πρόσβασης στο διαδίκτυο" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:203 +msgid "Uses System Services" +msgstr "Χρησιμοποιεί υπηρεσίες συστήματος" + +#: src/gs-safety-context-dialog.c:204 +msgid "Can request data from system services" +msgstr "Μπορεί να ζητήσει δεδομένα από υπηρεσίες συστήματος" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:211 +msgid "Uses Session Services" +msgstr "Χρησιμοποιεί υπηρεσίες συνεδρίας" + +#: src/gs-safety-context-dialog.c:212 +msgid "Can request data from session services" +msgstr "Μπορεί να ζητήσει δεδομένα από υπηρεσίες συνεδρίας" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "User Device Access" +msgstr "Πρόσβαση συσκευής χρήστη" + +#: src/gs-safety-context-dialog.c:220 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Μπορεί να έχει πρόσβαση σε συσκευές όπως σε δικτυακές κάμερες ή χειριστήρια " +"παιχνιδιών" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:223 +msgid "No User Device Access" +msgstr "Χωρίς πρόσβαση στη συσκευή χρήστη" + +#: src/gs-safety-context-dialog.c:224 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Δε μπορεί να έχει πρόσβαση σε συσκευές όπως σε δικτυακές κάμερες ή " +"χειριστήρια παιχνιδιών" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:230 +#, fuzzy +#| msgid "System Device Access" +msgid "Input Device Access" +msgstr "Πρόσβαση συσκευής συστήματος" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:238 +msgid "Microphone Access" +msgstr "Πρόσβαση στο Μικρόφωνο" + +#: src/gs-safety-context-dialog.c:239 +msgid "Can listen using microphones without asking permission" +msgstr "Μπορεί να ακούσει χρησιμοποιώντας μικρόφωνα χωρίς να ζητήσει άδεια" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:246 +msgid "System Device Access" +msgstr "Πρόσβαση συσκευής συστήματος" + +#: src/gs-safety-context-dialog.c:247 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Δυνατότητα πρόσβασης σε συσκευές του συστήματος που απαιτούν αυξημένα " +"δικαιώματα" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:254 +msgid "Screen Contents Access" +msgstr "Πρόσβαση στα Περιεχόμενα Οθόνης" + +#: src/gs-safety-context-dialog.c:255 +msgid "Can access the contents of the screen or other windows" +msgstr "Μπορεί να έχει πρόσβαση στα περιεχόμενα της οθόνης ή άλλων παραθύρων" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:262 +msgid "Legacy Windowing System" +msgstr "Σύστημα παραθύρων παλαιού τύπου" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:270 +msgid "Arbitrary Permissions" +msgstr "Αυθαίρετα δικαιώματα" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:278 +msgid "User Settings" +msgstr "Ρυθμίσεις χρήστη" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:290 +msgid "Full File System Read/Write Access" +msgstr "Πλήρης πρόσβαση ανάγνωσης/εγγραφής συστήματος αρχείων" + +#: src/gs-safety-context-dialog.c:291 +msgid "Can read and write all data on the file system" +msgstr "" +"Δυνατότητα ανάγνωσης και εγγραφής όλων των δεδομένων στο σύστημα αρχείων" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:299 +msgid "Home Folder Read/Write Access" +msgstr "Πρόσβαση ανάγνωσης/εγγραφής προσωπικού φακέλου" + +#: src/gs-safety-context-dialog.c:300 +msgid "Can read and write all data in your home directory" +msgstr "" +"Δυνατότητα ανάγνωσης και εγγραφής όλων των δεδομένων στον προσωπικό σας " +"φάκελο" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:308 +msgid "Full File System Read Access" +msgstr "Πλήρης πρόσβαση ανάγνωσης συστήματος αρχείων" + +#: src/gs-safety-context-dialog.c:309 +msgid "Can read all data on the file system" +msgstr "Δυνατότητα ανάγνωσης όλων των δεδομένων στο σύστημα αρχείων" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:318 +msgid "Home Folder Read Access" +msgstr "Πρόσβαση ανάγνωσης προσωπικού φακέλου" + +#: src/gs-safety-context-dialog.c:319 +msgid "Can read all data in your home directory" +msgstr "Δυνατότητα ανάγνωσης όλων των δεδομένων στον προσωπικό σας φάκελο" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:328 +msgid "Download Folder Read/Write Access" +msgstr "Πρόσβαση ανάγνωσης/εγγραφής φακέλου λήψεων" + +#: src/gs-safety-context-dialog.c:329 +msgid "Can read and write all data in your downloads directory" +msgstr "Δυνατότητα ανάγνωσης και εγγραφής όλων των δεδομένων στο φάκελο λήψεων" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:340 +msgid "Download Folder Read Access" +msgstr "Πρόσβαση ανάγνωσης φακέλου λήψεων" + +#: src/gs-safety-context-dialog.c:341 +msgid "Can read all data in your downloads directory" +msgstr "Δυνατότητα ανάγνωσης όλων των δεδομένων στο φάκελο λήψεων" + +#: src/gs-safety-context-dialog.c:351 +msgid "Can read and write all data in the directory" +msgstr "Πρόσβαση ανάγνωσης/εγγραφής φακέλου" + +#: src/gs-safety-context-dialog.c:362 +msgid "Can read all data in the directory" +msgstr "Δυνατότητα ανάγνωσης και εγγραφής όλων των δεδομένων στο φάκελο" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:378 +msgid "No File System Access" +msgstr "Χωρίς πρόσβαση στο σύστημα αρχείων" + +#: src/gs-safety-context-dialog.c:379 +msgid "Cannot access the file system at all" +msgstr "Χωρίς καμία δυνατότητα πρόσβασης στο σύστημα αρχείων" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:389 +msgid "App developer is verified" +msgstr "Επιβεβαιωμένος προγραμματιστής" + +#: src/gs-safety-context-dialog.c:390 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Ο προγραμματιστής αυτής της εφαρμογής έχει επιβεβαιωθεί ότι είναι αυτός που " +"ισχυρίζεται ότι είναι" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:401 +msgid "Insecure Dependencies" +msgstr "Επισφαλείς εξαρτήσεις" + +#: src/gs-safety-context-dialog.c:402 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Το λογισμικό ή οι εξαρτήσεις του δεν υποστηρίζονται πλέον και ίσως είναι " +"επισφαλείς" + +#: src/gs-safety-context-dialog.c:415 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Αυτή η εφαρμογή δεν προσδιορίζει με ποια άδεια έχει αναπτυχθεί και μπορεί να " +"είναι ιδιόκτητο" + +#: src/gs-safety-context-dialog.c:416 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Αυτό το λογισμικό δεν προσδιορίζει με ποια άδεια έχει αναπτυχθεί και μπορεί " +"να είναι ιδιόκτητο" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:429 +msgid "Proprietary Code" +msgstr "Ιδιοταγής κώδικας" + +#: src/gs-safety-context-dialog.c:430 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Ο πηγαίος κώδικας δεν είναι δημόσιος, οπότε δε μπορεί να ελεγχθεί ανεξάρτητα " +"και πιθανώς να είναι επισφαλής" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, fuzzy, c-format +#| msgid "" +#| "This app is developed under the special license “%s”.\n" +#| "\n" +#| "You may or may not be able to contribute to this app." +msgid "This app is developed under the special license “%s”" +msgstr "" +"Αυτή η εφαρμογή έχει αναπτυχθεί με την ειδική άδεια \"%s\".\n" +"\n" +"Μπορεί να μπορείτε ή να μην μπορείτε να συνεισφέρετε σε αυτήν την εφαρμογή." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:441 +#, fuzzy, c-format +#| msgid "" +#| "This software is developed under the special license “%s”.\n" +#| "\n" +#| "You may or may not be able to contribute to this software." +msgid "This software is developed under the special license “%s”" +msgstr "" +"Αυτό το λογισμικό έχει αναπτυχθεί με την ειδική άδεια «%s».\n" +"\n" +"Μπορεί να μπορείτε ή να μην μπορείτε να συνεισφέρετε σε αυτό το λογισμικό." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:454 +msgid "Auditable Code" +msgstr "Ελεγχόμενος κώδικας" + +#: src/gs-safety-context-dialog.c:455 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Ο πηγαίος κώδικας είναι δημόσιος και μπορεί να ελεγχθεί ανεξάρτητα, κάτι που " +"καθιστά την εφαρμογή πιο πιθανό να είναι ασφαλής" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:464 +#, c-format +msgid "%s is privileged" +msgstr "Το %s είναι προνομιούχο" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:471 +#, c-format +msgid "%s is safe" +msgstr "Το %s είναι ασφαλές" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:478 +#, c-format +msgid "%s is probably safe" +msgstr "Το %s είναι πιθανώς επισφαλές" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:485 +#, c-format +msgid "%s is potentially unsafe" +msgstr "Το %s είναι πιθανώς επισφαλές" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:492 +#, c-format +msgid "%s is unsafe" +msgstr "Το %s είναι επισφαλές" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:583 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "'Αγνωστο" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:5 +msgid "Safety" +msgstr "Ασφάλεια" + +#: src/gs-safety-context-dialog.ui:100 +msgid "License" +msgstr "Άδεια" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:140 +msgid "Source" +msgstr "Πηγή" + +#: src/gs-safety-context-dialog.ui:220 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:244 +msgid "Outdated SDK version" +msgstr "Παρωχημένη έκδοση SDK" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Προηγούμενο στιγμιότυπο οθόνης" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Επόμενο στιγμιότυπο οθόνης" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Χωρίς στιγμιότυπα οθόνης" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Δεν βρέθηκε στιγμιότυπο" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Αποτυχία φόρτωσης εικόνας" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Δεν βρέθηκε μέγεθος στιγμιοτύπου" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Αδυναμία δημιουργίας λανθάνουσας μνήμης" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Άκυρο στιγμιότυπο οθόνης" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Μη διαθέσιμο στιγμιότυπο οθόνης" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Στιγμιότυπο οθόνης" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u περισσότερη αντιστοιχία" +msgstr[1] "%u περισσότερες αντιστοιχίες" + +#: src/gs-search-page.ui:6 +msgid "Search page" +msgstr "Σελίδα αναζήτησης" + +#: src/gs-search-page.ui:17 +msgid "Search for Apps" +msgstr "Αναζήτηση για εφαρμογές" + +#: src/gs-search-page.ui:46 +msgid "No App Found" +msgstr "Δε βρέθηκε εφαρμογές" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1205 src/gs-shell.c:1210 src/gs-shell.c:1225 +#: src/gs-shell.c:1229 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1282 src/gs-shell.c:1321 +msgid "Unable to download updates" +msgstr "Αδύνατη η λήψη ενημερώσεων" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1287 +#, fuzzy +#| msgid "Unable to download firmware updates from %s" +msgid "Unable to download firmware updates" +msgstr "Αδύνατη η λήψη ενημερώσεων υλικολογισμικού από το %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1296 src/gs-shell.c:1437 +#, fuzzy +#| msgid "Unable to update: internet access was required but wasn’t available" +msgid "Unable to update: internet access required" +msgstr "" +"Αδύνατη η ενημέρωση: ήταν απαραίτητη η πρόσβαση στο διαδίκτυο αλλά δεν ήταν " +"διαθέσιμη" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1300 src/gs-shell.c:1441 +#, fuzzy +#| msgid "Unable to update %s: not enough disk space" +msgid "Unable to update: not enough disk space" +msgstr "Αδύνατη η ενημέρωση του %s: δεν υπάρχει επαρκής χώρος στον δίσκο" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1304 src/gs-shell.c:1445 +#, fuzzy +#| msgid "Unable to update %s: authentication was required" +msgid "Unable to update: authentication required" +msgstr "Αδύνατη η ενημέρωση του %s: απαιτείται πιστοποίηση" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1308 src/gs-shell.c:1449 +#, fuzzy +#| msgid "Unable to update %s: authentication was invalid" +msgid "Unable to update: invalid authentication" +msgstr "Αδύνατη η ενημέρωση του %s: ήταν άκυρη η πιστοποίηση" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1312 src/gs-shell.c:1453 +#, fuzzy +#| msgid "Unable to update %s: AC power is required" +msgid "Unable to update: permission required" +msgstr "Αδύνατη η ενημέρωση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1324 +msgid "Unable to get list of updates" +msgstr "Αδύνατη η λήψη της λίστας ενημερώσεων" + +#: src/gs-shell.c:1357 +#, fuzzy +#| msgid "Unable to install %s as download failed" +msgid "Unable to install: download failed" +msgstr "Αδύνατη η εγκατάσταση του %s καθώς απέτυχε η λήψη" + +#: src/gs-shell.c:1361 +#, fuzzy +#| msgid "Unable to install updates" +msgid "Unable to install: missing runtime" +msgstr "Αδυναμία εγκατάστασης ενημερώσεων" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1363 src/gs-shell.c:1397 +#, c-format +msgid "Unable to install %s" +msgstr "Αδύνατη η εγκατάσταση του %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1369 +#, fuzzy +#| msgid "Unable to install: internet access was required but wasn’t available" +msgid "Unable to install: internet access required" +msgstr "" +"Αδύνατη η εγκατάσταση: ήταν απαραίτητη η πρόσβαση στο διαδίκτυο αλλά δεν " +"ήταν διαθέσιμη" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1373 +#, fuzzy +#| msgid "Unable to install: the app has an invalid format" +msgid "Unable to install: invalid app format" +msgstr "Αδύνατη η εγκατάσταση: η εφαρμογή έχει μη έγκυρη μορφή" + +#: src/gs-shell.c:1376 +#, fuzzy +#| msgid "Unable to install %s: not enough disk space" +msgid "Unable to install: not enough disk space" +msgstr "Αδύνατη η εγκατάσταση του %s: δεν υπάρχει επαρκής χώρος στον δίσκο" + +#: src/gs-shell.c:1379 +#, fuzzy +#| msgid "Unable to install %s: authentication was required" +msgid "Unable to install: authentication required" +msgstr "Αδύνατη η εγκατάσταση του %s: απαιτείται πιστοποίηση" + +#: src/gs-shell.c:1382 +#, fuzzy +#| msgid "Failed to install file: authentication failed" +msgid "Unable to install: invalid authentication" +msgstr "Απέτυχε η εγκατάσταση του αρχείου: αποτυχία πιστοποίησης" + +#: src/gs-shell.c:1385 +#, fuzzy +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to install: permission required" +msgstr "Αδύνατη η εγκατάσταση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#: src/gs-shell.c:1388 +#, fuzzy +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to install: device must be plugged in" +msgstr "Αδύνατη η εγκατάσταση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#: src/gs-shell.c:1390 +#, fuzzy +#| msgid "Unable to install updates" +msgid "Unable to install: low battery" +msgstr "Αδυναμία εγκατάστασης ενημερώσεων" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1433 +#, fuzzy +#| msgid "Unable to update %s as download failed" +msgid "Unable to update: download failed" +msgstr "Αδύνατη η ενημέρωση του %s καθώς απέτυχε η λήψη" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1457 +#, fuzzy +#| msgid "Unable to update %s: AC power is required" +msgid "Unable to update: device must be plugged in" +msgstr "Αδύνατη η ενημέρωση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1460 +#, fuzzy +#| msgid "Unable to update %s" +msgid "Unable to update: low battery" +msgstr "Αδύνατη η ενημέρωση του %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1469 +#, c-format +msgid "Unable to update %s" +msgstr "Αδύνατη η ενημέρωση του %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1473 +msgid "Unable to install updates" +msgstr "Αδυναμία εγκατάστασης ενημερώσεων" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1509 src/gs-shell.c:1546 +msgid "Unable to upgrade" +msgstr "Αδυναμία αναβάθμισης" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1512 +#, fuzzy +#| msgid "Unable to upgrade to %s as download failed" +msgid "Unable to upgrade: download failed" +msgstr "Αδύνατη η αναβάθμιση του %s καθώς απέτυχε η λήψη" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1517 +#, fuzzy +#| msgid "Unable to upgrade to %s: authentication was required" +msgid "Unable to upgrade: internet access required" +msgstr "Αδύνατη η αναβάμιση του %s: απαιτείται πιστοποίηση" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1521 +#, fuzzy +#| msgid "Unable to upgrade to %s: not enough disk space" +msgid "Unable to upgrade: not enough disk space" +msgstr "Αδύνατη η αναβάθμιση του %s: δεν υπάρχει επαρκής χώρος στον δίσκο" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1525 +#, fuzzy +#| msgid "Unable to upgrade to %s: authentication was required" +msgid "Unable to upgrade: authentication required" +msgstr "Αδύνατη η αναβάμιση του %s: απαιτείται πιστοποίηση" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1529 +#, fuzzy +#| msgid "Unable to upgrade to %s: authentication was invalid" +msgid "Unable to upgrade: invalid authentication" +msgstr "Αδύνατη η αναβάθμιση του %s: ήταν άκυρη η πιστοποίηση" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1533 +#, fuzzy +#| msgid "Unable to upgrade to %s: AC power is required" +msgid "Unable to upgrade: permission required" +msgstr "Αδύνατη η αναβάμιση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1537 +#, fuzzy +#| msgid "Unable to upgrade to %s: AC power is required" +msgid "Unable to upgrade: device must be plugged in" +msgstr "Αδύνατη η αναβάμιση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1540 +#, fuzzy +#| msgid "Unable to upgrade to %s" +msgid "Unable to upgrade: low battery" +msgstr "Αδύνατη η αναβάθμιση του %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1579 +#, fuzzy +#| msgid "Unable to install %s: authentication was required" +msgid "Unable to uninstall: authentication required" +msgstr "Αδύνατη η εγκατάσταση του %s: απαιτείται πιστοποίηση" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1583 +#, fuzzy +#| msgid "Unable to install %s: authentication was invalid" +msgid "Unable to uninstall: authentication invalid" +msgstr "Αδύνατη η εγκατάσταση του %s: ήταν άκυρη η πιστοποίηση" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1587 +#, fuzzy +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to uninstall: permission required" +msgstr "Αδύνατη η εγκατάσταση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1591 +#, fuzzy +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to uninstall: device must be plugged in" +msgstr "Αδύνατη η εγκατάσταση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1594 +#, fuzzy +#| msgid "Unable to install updates" +msgid "Unable to uninstall: low battery" +msgstr "Αδυναμία εγκατάστασης ενημερώσεων" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1604 +#, fuzzy, c-format +#| msgid "Unable to install %s" +msgid "Unable to uninstall %s" +msgstr "Αδύνατη η εγκατάσταση του %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1640 +#, fuzzy, c-format +#| msgid "Unable to purchase %s" +msgid "Unable to launch %s" +msgstr "Αδύνατη η αγορά του %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1645 src/gs-shell.c:1665 src/gs-shell.c:1709 +#: src/gs-shell.c:1753 src/gs-shell.c:1813 +msgid "Sorry, something went wrong" +msgstr "Συγνώμη, κάτι πήγε λάθος" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1655 src/gs-shell.c:1699 src/gs-shell.c:1743 +#: src/gs-shell.c:1793 +#, fuzzy +#| msgid "Not enough disk space — free up some space and try again" +msgid "Not enough disk space for operation" +msgstr "" +"Δεν υπάρχει αρκετός χώρος στον δίσκο — ελευθερώστε κάποιο χώρο και " +"προσπαθήστε ξανά" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +#, fuzzy +#| msgid "Unable to install %s as not supported" +msgid "Unable to install: file type not supported" +msgstr "Αδύνατη η εγκατάσταση του %s καθώς δεν υποστηρίζεται" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 src/gs-shell.c:1739 +#, fuzzy +#| msgid "Failed to install: authentication failed" +msgid "Unable to install: authentication failed" +msgstr "Απέτυχε η εγκατάσταση: αποτυχία πιστοποίησης" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1735 +msgid "Unable to install" +msgstr "Αδύνατη η εγκατάσταση" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1786 +#, c-format +msgid "Unable to contact %s" +msgstr "Αδύνατη η επικοινωνία με το %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1797 +#, fuzzy +#| msgid "Software needs to be restarted to use new plugins." +msgid "Restart Software to use new plugins" +msgstr "" +"Απαιτείται επανεκκίνηση του λογισμικού για να χρησιμοποιηθούν τα νέα " +"πρόσθετα." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1801 +msgid "Device needs to be plugged in" +msgstr "Η συσκευή χρειάζεται να είναι συνδεδεμένη" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1804 +#, fuzzy +#| msgid "The battery level is too low" +msgid "Battery level is too low" +msgstr "Το επίπεδο της μπαταρίας είναι πολύ χαμηλό" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "Αποθετήρια _λογισμικού" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "Συντομεύσεις _πληκτρολογίου" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_Προτιμήσεις" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Αναζήτηση" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Κυρίως μενού" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Αναζήτηση εφαρμογών" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:202 +msgid "_Explore" +msgstr "_Εξερεύνηση" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:216 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "Ε_γκατεστημένο" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:238 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Ε_νημερώσεις" + +#: src/gs-shell.ui:274 src/gs-shell.ui:354 +msgid "Go back" +msgstr "Επιστροφή" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ουδέν" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Δεδομένα εφαρμογής" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Δεδομένα που απαιτούνται για την εκτέλεση της εφαρμογής" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Δεδομένα χρήστη" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Δεδομένα που δημιουργήθηκαν από εσάς στην εφαρμογή" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Δεδομένα λανθάνουσας μνήμης" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Προσωρινά αποθηκευμένα δεδομένα" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Η ίδια η εφαρμογή" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Απαιτούμενες εξαρτήσεις" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Κοινόχρηστα στοιχεία συστήματος που απαιτούνται από αυτή την εφαρμογή" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Άγνωστο" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:5 +msgid "Storage" +msgstr "Αποθηκευτικό μέσο" + +#. Translators: Please do not translate the markup or link href +#: src/gs-storage-context-dialog.ui:68 +msgid "" +"Cached data can be cleared from the _app settings." +msgstr "" +"Τα αποθηκευμένα δεδομένα μπορούν να εκκαθαριστούν από τις ρυθμίσεις _εφαρμογής." + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (εγκαταστάθηκε)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (εγκαθίσταται)" + +#: src/gs-summary-tile.c:149 +#, c-format +#| msgid "Downloading" +msgid "%s (Downloading)" +msgstr "%s (Γίνεται λήψη)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (αφαιρείται)" + +#: src/gs-toast.c:58 +msgid "_Details" +msgstr "_Λεπτομέρειες" + +#: src/gs-toast.c:65 +msgid "Examine Disk" +msgstr "Εξέταση δίσκου" + +#: src/gs-toast.c:68 +msgid "Network Settings" +msgstr "Ρυθμίσεις δικτύου" + +#: src/gs-toast.c:71 +msgid "_Restart Now…" +msgstr "_Επανεκκίνηση τώρα…" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Εγκατεστημένο στο %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:130 +msgid "Installed Updates" +msgstr "Εγκατεστημένες ενημερώσεις" + +#: src/gs-update-dialog.ui:71 +msgid "No Updates Installed" +msgstr "Δεν εγκαταστάθηκαν ενημερώσεις" + +#: src/gs-update-monitor.c:216 +msgid "Updates Are Out of Date" +msgstr "Οι ενημερώσεις λογισμικού είναι παλιές" + +#: src/gs-update-monitor.c:217 +msgid "Please check for available updates" +msgstr "Παρακαλούμε ελέγξτε για διαθέσιμες ενημερώσεις" + +#: src/gs-update-monitor.c:223 +msgid "Critical Updates Ready to Install" +msgstr "Κρίσιμες ενημερώσεις έτοιμες για εγκατάσταση" + +#: src/gs-update-monitor.c:224 +msgid "Install critical updates as soon as possible" +msgstr "Εγκαταστήστε κρίσιμες ενημερώσεις το συντομότερο δυνατό" + +#: src/gs-update-monitor.c:227 +msgid "Critical Updates Available to Download" +msgstr "Διαθέσιμες κρίσιμες ενημερώσεις για λήψη" + +#: src/gs-update-monitor.c:228 +#, fuzzy +#| msgid "Unable to install updates as download failed" +msgid "Download critical updates as soon as possible" +msgstr "Αδύνατη η εγκατάσταση ενημερώσεων καθώς απέτυχε η λήψη" + +#: src/gs-update-monitor.c:234 +#, fuzzy +#| msgid "Software Updates Ready to Install" +msgid "Updates Ready to Install" +msgstr "Οι ενημερώσεις λογισμικού είναι έτοιμες προς εγκατάσταση" + +#: src/gs-update-monitor.c:235 +#, fuzzy +#| msgid "Software updates are waiting and ready to be installed." +msgid "Software updates are ready and waiting" +msgstr "" +"Οι ενημερώσεις λογισμικού είναι σε αναμονή και είναι έτοιμες προς " +"εγκατάσταση." + +#: src/gs-update-monitor.c:241 +#, fuzzy +#| msgid "Software Updates Available to Download" +msgid "Updates Available to Download" +msgstr "Υπάρχουν διαθέσιμες ενημερώσεις λογισμικού προς λήψη" + +#: src/gs-update-monitor.c:242 +#, fuzzy +#| msgid "Software Updates Downloaded" +msgid "Software updates can be downloaded" +msgstr "Λήφθηκαν ενημερώσεις λογισμικού" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:358 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u Εφαρμογή ενημερώθηκε — Απαιτείται επανεκκίνηση" +msgstr[1] "%u Εφαρμογές ενημερώθηκαν — Απαιτείται επανεκκίνηση" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:364 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u Εφαρμογή ενημερώθηκε" +msgstr[1] "%u Εφαρμογές ενημερώθηκαν" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:375 +#, c-format +msgid "%s has been updated." +msgstr "η εφαρμογή %s έχουν ενημερωθεί." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:378 +msgid "Please restart the app." +msgstr "Παρακαλούμε επανεκκινήστε την εφαρμογή." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:386 +#, c-format +msgid "%s and %s have been updated." +msgstr "οι εφαρμογές %s και %s έχουν ενημερωθεί." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:392 src/gs-update-monitor.c:411 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u εφαρμογή απαιτεί επανεκκίνηση." +msgstr[1] "%u εφαρμογές απαιτούν επανεκκίνηση." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:404 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Περιλαμβάνει %s, %s και %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:704 +msgid "Operating System Updates Unavailable" +msgstr "Υπάρχουν διαθέσιμες ενημερώσεις του λειτουργικού συστήματος" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:706 +msgid "Upgrade to continue receiving security updates." +msgstr "Αναβαθμίστε για να συνεχίσετε να λαμβάνετε ενημερώσεις ασφαλείας." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:761 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Η νέα έκδοση του %s είναι διαθέσιμη προς εγκατάσταση" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:765 +msgid "Software Upgrade Available" +msgstr "Υπάρχουν διαθέσιμες ενημερώσεις λογισμικού" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "Αποτυχία ενημερώσεων λογισμικού" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "An important operating system update failed to be installed." +msgstr "" +"Αποτυχία εγκατάστασης μιας σημαντικής ενημέρωσης του λειτουργικού συστήματος." + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Εμφάνιση λεπτομερειών" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Η αναβάθμιση του συστήματος ολοκληρώθηκε" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Καλώς ήλθατε στο %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Εγκαταστάθηκε μια ενημέρωση λογισμικού" +msgstr[1] "Εγκαταστάθηκαν ενημερώσεις λογισμικού" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Εγκαταστάθηκε μια σημαντική ενημέρωση του λειτουργικού συστήματος." +msgstr[1] "Εγκαταστάθηκαν σημαντικές ενημερώσεις του λειτουργικού συστήματος." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Επισκόπηση" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1338 +msgid "Failed To Update" +msgstr "Αποτυχία ενημέρωσης" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1343 +msgid "The system was already up to date." +msgstr "Το σύστημα ήταν ήδη ενημερωμένο." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1348 +msgid "The update was cancelled." +msgstr "Η ενημέρωση ακυρώθηκε." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1353 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Ζητήθηκε πρόσβαση διαδικτύου, αλλά δεν ήταν διαθέσιμη. Παρακαλούμε, " +"βεβαιωθείτε ότι έχετε πρόσβαση διαδικτύου και ξαναδοκιμάστε." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1358 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Υπήρξαν θέματα ασφάλειας με την ενημέρωση. Παρακαλούμε, συμβουλευτείτε τον " +"πάροχο του λογισμικού σας για περισσότερες λεπτομέρειες." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1363 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Δεν υπήρξε αρκετός χώρος στον δίσκο. Παρακαλούμε, ελευθερώστε κάποιο χώρο " +"και ξαναπροσπαθήστε." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1367 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Συγνώμη: αποτυχία εγκατάστασης της ενημέρωσης. Παρακαλούμε, περιμένετε μια " +"άλλη ενημέρωση και ξαναπροσπαθήστε. Αν το πρόβλημα επιμένει, επικοινωνήστε " +"με τον πάροχο λογισμικού σας." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:255 +#, c-format +msgid "Last checked: %s" +msgstr "Ελέγχθηκε τελευταία φορά: %s" + +#: src/gs-updates-page.c:304 +msgid "Stop" +msgstr "Διακοπή" + +#: src/gs-updates-page.c:313 src/gs-updates-page.c:325 +msgid "Check for Updates" +msgstr "Έλεγχος για ενημερώσεις" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:575 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "Το %s %s έχει σταματήσει να λαμβάνει κρίσιμες ενημερώσεις λογισμικού" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:581 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Το λειτουργικό σας σύστημα έχει σταματήσει να λαμβάνει κρίσιμες ενημερώσεις " +"λογισμικού" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:850 +msgid "Charges May Apply" +msgstr "Μπορεί υπάρξουν χρεώσεις" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:852 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Ο έλεγχος για ενημερώσεις κατά τη χρήση ευρυζωνικής σύνδεσης δεδομένων, " +"μπορεί να επιφέρει σημαντικές επιπλέον χρεώσεις." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:856 +msgid "Check _Anyway" +msgstr "_Να ελεγχθεί οπωσδήποτε" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:867 +msgid "No Network" +msgstr "Χωρίς δίκτυο" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:869 +msgid "Internet access is required to check for updates." +msgstr "Απαιτείται πρόσβαση διαδικτύου για τον έλεγχο ενημερώσεων." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:873 +msgid "Network _Settings" +msgstr "_Ρυθμίσεις δικτύου" + +#: src/gs-updates-page.c:911 +msgid "Software Upgrades Downloaded" +msgstr "Λήφθηκαν αναβαθμίσεις λογισμικού" + +#: src/gs-updates-page.c:912 +msgid "Software upgrades have been downloaded and are ready to be installed." +msgstr "" +"Οι αναβαθμίσεις λογισμικού έχουν ληφθεί και είναι έτοιμες για εγκατάσταση." + +#: src/gs-updates-page.c:1247 +msgid "Check for updates" +msgstr "Έλεγχος για ενημερώσεις" + +#: src/gs-updates-page.c:1283 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Ενημερώσεις" + +#: src/gs-updates-page.ui:6 +msgid "Updates page" +msgstr "Σελίδα ενημερώσεων" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:58 +msgid "Loading Updates" +msgstr "Φόρτωση ενημερώσεων" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:71 +msgid "This could take a while" +msgstr "Αυτό μπορεί να πάρει λίγο χρόνο" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:179 +msgid "Up to Date" +msgstr "Ενημερωμένο" + +#: src/gs-updates-page.ui:218 +msgid "Use Mobile Data?" +msgstr "Χρήση ευρυζωνικής σύνδεσης;" + +#: src/gs-updates-page.ui:219 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Ο έλεγχος για ενημερώσεις κατά τη χρήση κινητής ευρυζωνικότητας μπορεί να " +"σας προκαλέσει χρεώσεις" + +#: src/gs-updates-page.ui:222 +msgid "_Check Anyway" +msgstr "_Να ελεγχθεί οπωσδήποτε" + +#: src/gs-updates-page.ui:238 +msgid "No Connection" +msgstr "Χωρίς σύνδεση" + +#: src/gs-updates-page.ui:239 +#, fuzzy +#| msgid "Go online to check for updates." +msgid "Go online to check for updates" +msgstr "Συνδεθείτε στο δίκτυο για να γίνει έλεγχος ενημερώσεων." + +#: src/gs-updates-page.ui:242 +msgid "_Network Settings" +msgstr "Ρυθμίσεις _δικτύου" + +#: src/gs-updates-page.ui:262 src/gs-updates-page.ui:276 +msgid "Error" +msgstr "Σφάλμα" + +#: src/gs-updates-page.ui:277 +msgid "Updates are automatically managed" +msgstr "Οι ενημερώσεις διαχειρίζονται αυτόματα" + +#: src/gs-updates-paused-banner.c:45 +#, fuzzy +#| msgid "Software Updates Failed" +msgid "Software Updates Paused" +msgstr "Αποτυχία ενημερώσεων λογισμικού" + +#: src/gs-updates-paused-banner.c:48 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Οι αυτόματες ενημερώσεις λογισμικού είναι σε παύση για τους παρακάτω " +"λόγους:\n" + +#: src/gs-updates-paused-banner.c:50 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Η τρέχουσα σύνδεση δικτύου είναι μετρημένη" + +#: src/gs-updates-paused-banner.c:52 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Η τρέχουσα σύνδεση δικτύου απαγορεύει μεγάλες λήψεις" + +#: src/gs-updates-paused-banner.c:54 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Η λειτουργία εξοικονόμησης ενέργειας είναι ενεργή" + +#: src/gs-updates-paused-banner.c:56 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Η λειτουργία Παιχνιδιού είναι ενεργή" + +#: src/gs-updates-paused-banner.c:80 +#, fuzzy +#| msgid "Software Updates Failed" +msgid "Software updates paused" +msgstr "Αποτυχία ενημερώσεων λογισμικού" + +#: src/gs-updates-paused-banner.c:85 +msgid "Network connection is metered - software updates paused" +msgstr "" +"Η σύνδεση δικτύου είναι μετρημένη - οι ενημερώσεις λογισμικού τέθηκαν σε " +"παύση" + +#: src/gs-updates-paused-banner.c:87 +msgid "Network connection prohibits large downloads - software updates paused" +msgstr "" +"Η σύνδεση δικτύου απαγορεύει μεγάλες λήψεις - οι ενημερώσεις λογισμικού " +"τέθηκαν σε παύση" + +#: src/gs-updates-paused-banner.c:89 +#, fuzzy +#| msgid "Please download waiting software updates." +msgid "Power saver mode is active - software updates paused" +msgstr "" +"Παρακαλούμε κάντε λήψη τις ενημερώσεις λογισμικού που είναι σε αναμονή." + +#: src/gs-updates-paused-banner.c:91 +#, fuzzy +#| msgid "Please download waiting software updates." +msgid "Game mode is active - software updates paused" +msgstr "" +"Παρακαλούμε κάντε λήψη τις ενημερώσεις λογισμικού που είναι σε αναμονή." + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:375 +msgid "_Restart & Update…" +msgstr "_Επανεκκίνηση & ενημέρωση…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:381 +msgid "U_pdate All" +msgstr "Ε_νημέρωση όλων" + +#: src/gs-updates-section.c:458 +msgid "Software Updates Downloaded" +msgstr "Λήφθηκαν ενημερώσεις λογισμικού" + +#: src/gs-updates-section.c:459 +msgid "Software updates have been downloaded and are ready to be installed." +msgstr "" +"Οι ενημερώσεις λογισμικού έχουν ληφθεί και είναι έτοιμες για εγκατάσταση." + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:550 +msgid "Integrated Firmware" +msgstr "Ενσωματωμένο υλικολογισμικό" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:555 +msgid "Requires Restart" +msgstr "Απαιτεί επανεκκίνηση" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:560 +msgid "App Updates" +msgstr "Ενημερώσεις εφαρμογής" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:565 +msgid "Device Firmware" +msgstr "Υλικολογισμικό συσκευής" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "Λή_ψη" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Το %s %s είναι διαθέσιμο" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Το %s είναι διαθέσιμο" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Μάθετε σχετικά με τη νέα έκδοση" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Λήφθηκαν %s από %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Λήφθηκε %u%%" + +#: src/gs-upgrade-banner.ui:42 +msgid "A major upgrade, with new features and added polish." +msgstr "Μια σημαντική ενημέρωση, με νέα χαρακτηριστικά και διορθώσεις." + +#: src/gs-upgrade-banner.ui:187 +msgid "_Restart & Upgrade…" +msgstr "_Επανεκκίνηση & αναβάθμιση…" + +#: src/gs-upgrade-banner.ui:215 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Θυμηθείτε να κρατήσετε αντίγραφα ασφαλείας των αρχείων σας πριν την " +"αναβάθμιση." + +#: lib/gs-utils.c:523 lib/gs-utils.c:554 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Αποτυχία διαγραφής του αρχείου «%s»: %s" + +#: lib/gs-utils.c:565 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Αποτυχία διαγραφής του καταλόγου «%s»: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Προσθέστε, αφαιρέστε ή ενημερώστε το λογισμικό αυτού του υπολογιστή" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Ενημερώσεις;Αναβαθμίσεις;Πηγές;Αποθετήρια;Προτιμήσεις;Εγκατάσταση;" +"Απεγκατάσταση;Πρόγραμμα;Λογισμικό;Εφαρμογή;Αποθήκευση;Updates;Upgrade;" +"Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;" +"Store;" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:71 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3247 +msgid "System Updates" +msgstr "Ενημερώσεις συστήματος" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:76 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3252 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Γενικές ενημερώσεις συστήματος, όπως επιδιορθώσεις ασφαλείας ή σφαλμάτων, " +"καθώς και βελτιώσεις απόδοσης." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:689 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Μια ενημέρωση του %s με νέες δυνατότητες και επιδιορθώσεις." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1306 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Η υπηρεσία ενημέρωσης του EOS δεν μπορεί να κάνει λήψη και εφαρμογή της " +"ενημέρωσης." + +#: plugins/epiphany/gs-plugin-epiphany.c:500 +#: plugins/epiphany/gs-plugin-epiphany.c:504 +msgid "Web App" +msgstr "Εφαρμογές ιστού" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Υποστήριξη εφαρμογών Ιστού" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Εκτέλεση δημοφιλών εφαρμογών Ιστού στον περιηγητή" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:254 +msgid "Downloading upgrade information…" +msgstr "Λήψη πληροφοριών αναβάθμισης…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:405 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Αναβαθμίστε για τις τελευταίες λειτουργίες, βελτιώσεις απόδοσης και " +"σταθερότητας." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Υποστήριξη Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Το Flatpak είναι ένα framework για εφαρμογές στο Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Φάκελος συστήματος %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Προσωπικός υποφάκελος %s" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Φάκελοι κεντρικού συστήματος" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "Παραμετροποίηση κεντρικού συστήματος από τον /etc" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Φάκελος επιφάνειας εργασίας" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Υποφάκελος επιφάνειας εργασίας %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Φάκελος εγγράφων" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Υποφάκελος εγγράφων %s" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Φάκελος μουσικής" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Υποφάκελος μουσικής %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Φάκελος εικόνων" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Υποφάκελος εικόνων %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Φάκελος δημόσιας κοινής χρήσης" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Υποφάκελος δημόσιας κοινής χρήσης %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Φάκελος βίντεο" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Υποφάκελος βίντεο %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Φάκελος προτύπων" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Υποφάκελος προτύπων %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Φάκελος cache χρήστη" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Υποφάκελος cache χρήστη %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Φάκελος παραμετροποίησης χρήστη" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Υποφάκελος παραμετροποίησης χρήστη %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Φάκελος δεδομένων χρήστη" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Υποφάκελος δεδομένων χρήστη %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Φάκελος εκτέλεσης χρήστη" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Υποφάκελος εκτέλεσης χρήστη %s" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Πρόσβαση συστήματος αρχείων σε %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1379 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Λήψη μεταδεδομένων flatpak για %s…" + +#: plugins/flatpak/gs-flatpak.c:3607 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Αποτυχία βελτίωσης του προσθέτου «%s»: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Εγκατάσταση χρήστη" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Εγκατάσταση συστήματος" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "ID εφαρμογής" + +#: plugins/flatpak/gs-plugin-flatpak.c:1343 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Αποτυχία προσθήκης για εγκατάσταση του προσθέτου «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1357 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Αποτυχία προσθήκης για απεγκατάσταση του προσθέτου «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1624 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Το απομακρυσμένο \"%s\" δεν επιτρέπει την εγκατάσταση του \"%s\", πιθανώς " +"λόγω του φίλτρου του. Αφαιρέστε το φίλτρο και επαναλάβετε την εγκατάσταση. " +"Αναλυτικό σφάλμα: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "" +"Η ισχύς του συστήματος είναι πολύ χαμηλή για την εκτέλεση της ενημέρωσης" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Η ισχύς του συστήματος είναι πολύ χαμηλή για την εκτέλεση της ενημέρωσης " +"(%u%%, απαιτεί %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Η συσκευή δεν είναι προσβάσιμη ή βρίσκεται εκτός ασύρματης εμβέλειας" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Το επίπεδο της μπαταρίας είναι πολύ χαμηλό" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"Η ισχύς της μπαταρίας της συσκευής είναι πολύ χαμηλή (%u%%, απαιτεί %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Η συσκευή περιμένει να εφαρμοστεί η ενημέρωση" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Η συσκευή απαιτεί εναλλασσόμενο ρεύμα για να συνδεθεί" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Η συσκευή δεν μπορεί να χρησιμοποιηθεί όταν το καπάκι είναι κλειστό" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s Device Update" +msgstr "%s Ενημέρωση συσκευής" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s System Update" +msgstr "%s Ενημέρωση συστήματος" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s Ενημέρωση ελεγκτή Embedded" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s ME Update" +msgstr "%s Ενημέρωση ME" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s Εταιρική ενημέρωση ME" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:238 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s Καταναλωτική ενημέρωση ME" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:244 +#, c-format +msgid "%s Controller Update" +msgstr "%s Ενημέρωση ελεγκτή" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Ενημέρωση ελεγκτή Thunderbolt" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s Ενημέρωση μικροκώδικα CPU" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:260 +#, c-format +msgid "%s Configuration Update" +msgstr "%s Ενημέρωση ρύθμισης" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Battery Update" +msgstr "%s Ενημέρωση μπαταρίας" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:269 +#, c-format +msgid "%s Camera Update" +msgstr "%s Ενημέρωση κάμερας" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:273 +#, c-format +msgid "%s TPM Update" +msgstr "%s Ενημέρωση TPM" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:277 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s Ενημέρωση επιφάνειας αφής" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:281 +#, c-format +msgid "%s Mouse Update" +msgstr "%s Ενημέρωση ποντικιού" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:285 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s Ενημέρωση πληκτρολογίου" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s Ενημέρωση ελεγκτή αποθηκευτικού χώρου" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s Ενημέρωση διεπαφής δικτύου" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s Display Update" +msgstr "%s Ενημέρωση οθόνης" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s BMC Update" +msgstr "%s Ενημέρωση BMC" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:309 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s Ενημέρωση δέκτη USB" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:313 +#, c-format +msgid "%s Drive Update" +msgstr "%s Ενημέρωση συσκευής" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s Ενημέρωση μονάδας Flash" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s SSD Update" +msgstr "%s Ενημέρωση SSD" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s GPU Update" +msgstr "%s Ενημέρωση GPU" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s Dock Update" +msgstr "%s Ενημέρωση βάσης" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:337 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s Ενημέρωση δέκτη USB" + +#: plugins/fwupd/gs-plugin-fwupd.c:1737 +msgid "Firmware update could not be applied: " +msgstr "Δεν ήταν δυνατή η εφαρμογή της ενημέρωσης υλικολογισμικού: " + +#: plugins/fwupd/gs-plugin-fwupd.c:1877 +msgid "Firmware" +msgstr "Υλικολογισμικό" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Υποστήριξη αναβάθμισης υλικολογισμικού" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Παρέχει υποστήριξη για αναβαθμίσεις υλικολογισμικού" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Να εγκατασταθεί ανυπόγραφο λογισμικό;" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Το λογισμικό προς εγκατάσταση είναι ανυπόγραφο. Δεν είναι δυνατό να " +"επιβεβαιωθεί η προέλευση των ενημερώσεων του λογισμικού, ή αν έχουν " +"παραβιαστεί." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Να γίνει λήψη ανυπόγραφου λογισμικού;" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Είναι διαθέσιμες ανυπόγραφες ενημερώσεις. Χωρίς υπογραφή, δεν είναι δυνατό " +"να επιβεβαιωθεί η προέλευσή τους, ή αν έχουν παραβιαστεί." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Αναβάθμιση ανυπόγραφου λογισμικού;" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Είναι διαθέσιμες ανυπόγραφες ενημερώσεις. Χωρίς υπογραφή, δεν είναι δυνατό " +"να επιβεβαιωθεί η προέλευσή τους, ή αν έχουν παραβιαστεί. Οι ενημερώσεις " +"λογισμικού θα απενεργοποιηθούν μέχρι οι ανυπόγραφες ενημερώσεις να " +"αφαιρεθούν ή να ενημερωθούν." + +#: plugins/packagekit/gs-plugin-packagekit.c:355 +msgid "Packages" +msgstr "Πακέτα" + +#: plugins/packagekit/gs-plugin-packagekit.c:3252 +msgid "Failed to install updates: " +msgstr "Αποτυχία εγκατάστασης ενημερώσεων: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2961 +msgid "Operating System (OSTree)" +msgstr "Λειτουργικό σύστημα (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Κατάστημα Snappy" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Υποστήριξη Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Το snap είναι ένα καθολικό πακέτο του Linux" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Αυτόματες ενημερώσεις σε παύση" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Το τρέχον δίκτυο μετράται, επομένως μπορεί να έχει όρια δεδομένων ή " +#~ "χρεώσεις που σχετίζονται με αυτό. Για να γλιτώσετε δεδομένα, οι αυτόματες " +#~ "ενημερώσεις έχουν διακοπεί.\n" +#~ "\n" +#~ "Εάν το δίκτυο έχει αναγνωριστεί εσφαλμένα ως μετρημένο, αυτό μπορεί να " +#~ "αλλάξει στις Ρυθμίσεις." + +#~ msgid "Open Network _Settings" +#~ msgstr "Άνοιγμα _ρυθμίσεων δικτύου" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Για την αποφυγή χρεώσεων και ορίων χρήσης δικτύου, οι αυτόματες " +#~ "ενημερώσεις λογισμικού είναι απενεργοποιημένες σε δίκτυο κινητής ή σε " +#~ "σύνδεση με ογκοχρέωση." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Γίνεται λήψη και εγκατάσταση ενημερώσεων λογισμικού στο παρασκήνιο, όποτε " +#~ "είναι εφικτό" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Εμφάνιση μόνο _Δωρεάν εφαρμογών" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Εμφάνιση μόνο εφαρμογών με ελεύθερη άδεια χρήσης και απόκρυψη τυχόν " +#~ "ιδιοταγών εφαρμογών" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Τι σας άρεσε σε αυτή την εφαρμογή; Το να αφήνετε τα σχόλιά σας μαζί με " +#~ "τους λόγους για τους οποίους αφήνετε μια κριτική είναι χρήσιμο για τους " +#~ "άλλους." + +#, c-format +#~ msgid "Unable to download updates from %s" +#~ msgstr "Αδύνατη η λήψη ενημερώσεων από το %s" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Αδύνατη η λήψη ενημερώσεων: ήταν απαραίτητη η πρόσβαση στο διαδίκτυο αλλά " +#~ "δεν ήταν διαθέσιμη" + +#, c-format +#~ msgid "Unable to download updates from %s: not enough disk space" +#~ msgstr "" +#~ "Αδύνατη η λήψη ενημερώσεων από %s: δεν υπάρχει επαρκής χώρος στον δίσκο" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Αδύνατη η λήψη ενημερώσεων: δεν υπάρχει επαρκής χώρος στον δίσκο" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Αδύνατη η λήψη ενημερώσεων: απαιτείται πιστοποίηση" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Αδύνατη η λήψη ενημερώσεων: ήταν άκυρη η πιστοποίηση" + +#~ msgid "" +#~ "Unable to download updates: you do not have permission to install software" +#~ msgstr "" +#~ "Αδύνατη η λήψη των ενημερώσεων: δεν έχετε άδεια για να εγκαταστήσετε " +#~ "λογισμικό" + +#, c-format +#~ msgid "Unable to install %s as download failed from %s" +#~ msgstr "Αδύνατη η εγκατάσταση του %s καθώς απέτυχε η λήψη από το %s" + +#, c-format +#~ msgid "Unable to install %s as runtime %s not available" +#~ msgstr "" +#~ "Αδύνατη η εγκατάσταση του %s καθώς δεν είναι διαθέσιμο το περιβάλλον " +#~ "εκτέλεσης %s" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Αδύνατη η εγκατάσταση του %s: δεν έχετε άδεια για να εγκαταστήσετε " +#~ "λογισμικό" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "" +#~ "Αδύνατη η εγκατάσταση του %s: Το επίπεδο της μπαταρίας είναι πολύ χαμηλό" + +#, c-format +#~ msgid "Unable to update %s from %s as download failed" +#~ msgstr "Αδύνατη η ενημέρωση του %s από %s καθώς απέτυχε η λήψη" + +#, c-format +#~ msgid "Unable to install updates from %s as download failed" +#~ msgstr "Αδύνατη η εγκατάσταση ενημερώσεων από %s καθώς απέτυχε η λήψη" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "" +#~ "Αδύνατη η εγκατάσταση ενημερώσεων: δεν υπάρχει επαρκής χώρος στον δίσκο" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Αδύνατη η εγκατάσταση ενημερώσεων: απαιτείται πιστοποίηση" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Αδύνατη η εγκατάσταση ενημερώσεων: μη έγκυρη πιστοποίηση" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Αδύνατη η ενημέρωση του %s: δεν έχετε άδεια για να ενημερώσετε λογισμικό" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Αδύνατη η εγκατάσταση ενημερώσεων: δεν έχετε δικαιώματα για να " +#~ "ενημερώσετε λογισμικό" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Αδύνατη η εγκατάσταση ενημερώσεων: απαιτείται συνεχόμενη παροχή ρεύματος" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "" +#~ "Αδύνατη η ενημέρωση του %s: Το επίπεδο της μπαταρίας είναι πολύ χαμηλό" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "Αδύνατη η εγκατάσταση ενημερώσεων: Το επίπεδο της μπαταρίας είναι πολύ " +#~ "χαμηλό" + +#, c-format +#~ msgid "Unable to upgrade to %s from %s" +#~ msgstr "Αδύνατη η αναβάθμιση του %s από το %s" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Αδύνατη η αναβάθμιση σε %s: ήταν απαραίτητη η πρόσβαση στο διαδίκτυο αλλά " +#~ "δεν ήταν διαθέσιμη" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Αδύνατη η αναβάθμιση του %s: δεν έχετε άδεια για να αναβαθμίσετε" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "" +#~ "Αδύνατη η αναβάθμιση του %s: Το επίπεδο της μπαταρίας είναι πολύ χαμηλό" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Αδύνατη η αφαίρεση του %s: απαιτείται πιστοποίηση" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Αδύνατη η αφαίρεση του %s: ήταν άκυρη η πιστοποίηση" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Αδύνατη η αφαίρεση του %s: δεν έχετε άδεια για να αφαιρέσετε λογισμικό" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Αδύνατη η αφαίρεση του %s: απαιτείται συνεχόμενη παροχή ρεύματος" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "" +#~ "Αδύνατη η αφαίρεση του %s: Το επίπεδο της μπαταρίας είναι πολύ χαμηλό" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Αδύνατη η αφαίρεση του %s" + +#, c-format +#~ msgid "Unable to launch %s: %s is not installed" +#~ msgstr "Αδύνατη η εκκίνηση του %s: δεν είναι εγκατεστημένο το %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Αδύνατη η εγκατάσταση του αρχείου: δεν υποστηρίζεται" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Αδύνατη η εγκατάσταση: δεν υποστηρίζεται" + +#~ msgid "AC power is required" +#~ msgstr "Απαιτείται συνεχόμενη παροχή ρεύματος" + +#~ msgid "More Information" +#~ msgstr "Περισσότερες πληροφορίες" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Μετρημένο δίκτυο - διακοπή αυτόματων ενημερώσεων" + +#~ msgid "Find Out _More" +#~ msgstr "Μάθετε _περισσότερα" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Μία σημαντική ενημέρωση λογισμικού είναι έτοιμη προς εγκατάσταση." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Σημαντικό: υπάρχουν κρίσιμες ενημερώσεις λογισμικού." + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Γίνεται φόρτωση περιγραφής ενημέρωσης, παρακαλώ περιμένετε…" + +#~ msgid "Downloading featured images…" +#~ msgstr "Λήψη δημοφιλέστερων εικόνων…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Εμφάνιση πληροφοριών αποσφαλμάτωσης" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Δυνατότητα αυθαίρετης πρόσβασης σε αρχεία" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Είστε σίγουροι ότι θέλετε να απεγκαταστήσετε το %s;" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "Το %s θα απεγκατασταθεί και θα πρέπει να το εγκαταστήσετε ξανά για να το " +#~ "χρησιμοποιήσετε." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Η τελευταία χρονική σήμανση όταν το σύστημα ήταν σε σύνδεση και πήρε " +#~ "τυχόν ενημερώσεις" + +#~ msgid "_User" +#~ msgstr "_Χρήστης" + +#~ msgid "An application" +#~ msgstr "Μια εφαρμογή" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Η εφαρμογή αυτή δεν είναι διαθέσιμη στη γλώσσα σας και θα εμφανιστεί σε " +#~ "Αγγλικά ΗΠΑ." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Τα επιλεγμένα πρόσθετα θα εγκατασταθούν με την εφαρμογή." + +#~ msgid "Applications" +#~ msgstr "Εφαρμογές" + +#~ msgid "Enable" +#~ msgstr "Ενεργοποίηση" + +#~ msgid "_Continue" +#~ msgstr "_Συνέχεια" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u εφαρμογή" +#~ msgstr[1] "%u εφαρμογές" + +#~ msgid "Post Review" +#~ msgstr "Δημοσίευση κριτικής" + +#~ msgid "_Post" +#~ msgstr "_Δημοσίευση" + +#~ msgid "Rating" +#~ msgstr "Βαθμολόγηση" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Δώστε μια σύντομη σύνοψη της κριτικής σας, για παράδειγμα: «Υπέροχη " +#~ "εφαρμογή, τη συνιστώ»." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Κριτική" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Ποια είναι η γνώμη σας για την εφαρμογή; Προσπαθήστε να αιτιολογήσετε " +#~ "στις κριτικές σας." + +#~ msgid "No screenshot provided" +#~ msgstr "Δεν δόθηκε στιγμιότυπο" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Επανεκκίνηση τώρα" + +#~ msgid "Primary Menu" +#~ msgstr "Κυρίως μενού" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Ενημερώσεις" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "Το %s %s δεν υποστηρίζεται πλέον." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Αυτό σημαίνει ότι δεν λαμβάνει ενημερώσεις ασφαλείας." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Συνιστάται να κάνετε αναβάθμιση σε μια πιο πρόσφατη έκδοση." + +#~ msgid "Update All" +#~ msgstr "Ενημέρωση όλων" + +#~ msgid "Application Updates" +#~ msgstr "Ενημερώσεις εφαρμογών" + +#~ msgid "GNOME Web" +#~ msgstr "Ιστός GNOME" + +#~ msgid "GNOME Software" +#~ msgstr "Λογισμικό GNOME" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Διαχειριστής εφαρμογών για το GNOME" + +#~ msgid "A list of popular applications" +#~ msgstr "Λίστα με δημοφιλείς εφαρμογές" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Μια λίστα με εφαρμογές που θα χρησιμοποιηθούν, αντικαθιστώντας τις " +#~ "καθορισμένες του συστήματος." + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "" +#~ "Εμφάνιση του διαλόγου για εγκατάσταση μη ελεύθερων αποθετηρίων λογισμικού" + +#, c-format +#~| msgid "%s %f" +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "_Read Less" +#~ msgstr "_Διαβάστε λιγότερα" + +#~ msgid "_Launch" +#~ msgstr "Ε_κκίνηση" + +#~ msgid "Loading…" +#~ msgstr "Γίνεται φόρτωση…" + +#~ msgid "_Add shortcut" +#~ msgstr "Π_ροσθήκη συντόμευσης" + +#~ msgid "Re_move shortcut" +#~ msgstr "_Αφαίρεση συντόμευσης" + +#~ msgid "Welcome" +#~ msgstr "Καλώς ήλθατε" + +#~ msgid "Welcome to Software" +#~ msgstr "Καλώς ήλθατε στο Λογισμικό" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Η εφαρμογή Λογισμικό σας επιτρέπει να εγκαταστήσετε λογισμικό που " +#~ "χρειάζεστε, όλα από ένα μέρος. Δείτε τις προτάσεις μας, περιηγηθείτε στις " +#~ "κατηγορίες ή αναζητήστε μια εφαρμογή που επιθυμείτε." + +#~ msgid "_Browse Software" +#~ msgstr "_Περιήγηση λογισμικού" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Γίνεται λήψη του καταλόγου λογισμικού" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Λήψη αξιολογήσεων εφαρμογών…" + +#~ msgid "Name" +#~ msgstr "Όνομα" + +#~ msgid "system" +#~ msgstr "σύστημα" + +#~ msgid "user" +#~ msgstr "χρήστης" + +#~ msgid "Channel" +#~ msgstr "Κανάλι" + +#~ msgid "Branch" +#~ msgstr "Κλάδος" + +#~ msgid "URL" +#~ msgstr "Διεύθυνση" + +#~ msgid "Installation" +#~ msgstr "Εγκατάσταση" + +#~ msgid "Version" +#~ msgstr "Έκδοση" + +#~ msgid "Access additional software from selected third party sources." +#~ msgstr "Πρόσβαση σε πρόσθετο λογισμικό από επιλεγμένες πηγές τρίτων." + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Ορισμένα από αυτά τα λογισμικά είναι ιδιόκτητα και επομένως έχουν " +#~ "περιορισμούς στη χρήση, τον διαμοιρασμό και την πρόσβαση στον πηγαίο " +#~ "κώδικα." + +#~ msgid "Find out more…" +#~ msgstr "Μάθετε περισσότερα…" + +#~ msgid "Unknown Permissions" +#~ msgstr "Άγνωστα δικαιώματα" + +#~ msgid "_Remove All" +#~ msgstr "Α_φαίρεση όλων" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Δεν έχουν εγκατασταθεί ενημερώσεις σε αυτό το σύστημα." + +#~ msgid "Checking…" +#~ msgstr "Γίνεται έλεγχος…" + +#~ msgid "OS Updates" +#~ msgstr "Ενημερώσεις λειτουργικού" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "" +#~ "Περιλαμβάνει βελτιώσεις απόδοσης, σταθερότητας και ασφάλειας για όλους " +#~ "τους χρήστες." + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Λήψη υπογραφής ενημέρωσης firmware…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Λήψη μεταδεδομένων ενημέρωσης firmware…" + +#~ msgid "Select All" +#~ msgstr "Επιλογή όλων" + +#~ msgid "Select None" +#~ msgstr "Χωρίς επιλογή" + +#~ msgid "Featured %s" +#~ msgstr "Προτεινόμενο %s" + +#~ msgid "Show" +#~ msgstr "Εμφάνιση" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Υποκατηγορίες μενού φιλτραρίσματος" + +#~ msgid "Sort" +#~ msgstr "Ταξινόμηση" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Υποκατηγορίες μενού ταξινόμησης" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Όλες" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερες" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgid "Audio & Video" +#~ msgstr "Ήχος & βίντεο" + +#~ msgid "Developer Tools" +#~ msgstr "Εργαλεία προγραμματιστή" + +#~ msgid "Education & Science" +#~ msgstr "Εκπαίδευση & επιστήμη" + +#~ msgid "Games" +#~ msgstr "Παιχνίδια" + +#~ msgid "Graphics & Photography" +#~ msgstr "Γραφικά & φωτογραφία" + +#~ msgid "Productivity" +#~ msgstr "Παραγωγικότητα" + +#~ msgid "Communication & News" +#~ msgstr "Επικοινωνία & ειδήσεις" + +#~ msgid "Utilities" +#~ msgstr "Βοηθήματα" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Δεν είναι δυνατό να προσδιοριστεί ποια μέρη του συστήματος έχει πρόσβαση " +#~ "αυτή η εφαρμογή. Αυτό είναι χαρακτηριστικό για παλαιότερες εφαρμογές." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Ποτέ" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Χαμηλό" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Μέσο" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Υψηλό" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "'Αγνωστα" + +#~ msgid "Public domain" +#~ msgstr "Δημόσιος τομέας" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Οι χρήστες δεσμεύονται από την εξής άδεια χρήσης:" +#~ msgstr[1] "Οι χρήστες δεσμεύονται από τις εξής άδειες χρήσης:" + +#~ msgid "Localized in your Language" +#~ msgstr "Μεταφρασμένο στη γλώσσα σας" + +#~ msgid "Release Activity" +#~ msgstr "Δραστηριότητα έκδοσης" + +#~ msgid "Sandboxed" +#~ msgstr "Φιλτραρισμένη" + +#~ msgid "Category" +#~ msgstr "Κατηγορία" + +#~ msgid "Free" +#~ msgstr "Ελεύθερο" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "'Αγνωστη" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Αυτό σημαίνει ότι το λογισμικό μπορεί ελεύθερα να εκτελεστεί, " +#~ "αντιγραφτεί, διανεμηθεί, μελετηθεί και τροποποιηθεί." + +#~ msgid "Proprietary Software" +#~ msgstr "Ιδιοταγές λογισμικό" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Αυτό σημαίνει ότι το λογισμικό ανήκει σε ένα άτομο ή σε μια εταιρεία. " +#~ "Υπάρχουν συχνά περιορισμοί στη χρήση του και συνήθως πηγαίος του κώδικας " +#~ "είναι κλειστός." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Οι όροι άδειας αυτού του λογισμικού είναι άγνωστοι." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Η εφαρμογή αξιολογήθηκε με αυτόν τον τρόπο επειδή διαθέτει:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Δεν υπήρχαν διαθέσιμες λεπτομέρειες γι' αυτήν την κριτική." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Απεγκαταστάθηκε" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Εγκατεστημένο" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Ενημερωμένο" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Άγνωστο" + +#~ msgid "History" +#~ msgstr "Ιστορικό" + +#~ msgid "More…" +#~ msgstr "Περισσότερα…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Προτεινόμενες εφαρμογές ήχου & βίντεο" + +#~ msgid "Recommended Games" +#~ msgstr "Προτεινόμενα παιχνίδια" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Προτεινόμενες εφαρμογές γραφικών" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Συνιστώμενες εφαρμογές παραγωγικότητας" + +#~ msgid "Editor’s Picks" +#~ msgstr "Επιλογές συντακτών" + +#~ msgid "Recent Releases" +#~ msgstr "Πρόσφατες εκδόσεις" + +#~ msgid "Remove “%s”?" +#~ msgstr "Αφαίρεση του «%s»;" + +#~ msgid "Disable “%s”?" +#~ msgstr "Απενεργοποίηση του «%s»;" + +#~ msgid "No Additional Repositories" +#~ msgstr "Κανένα επιπρόσθετο αποθετήριο" + +#~ msgid "_Remove…" +#~ msgstr "_Απομάκρυνση…" + +#~ msgid "_Disable…" +#~ msgstr "_Απενεργοποίηση…" + +#~ msgid "Disabling" +#~ msgstr "Απενεργοποίηση" + +#~ msgid "Enabled" +#~ msgstr "Ενεργοποιημένο" + +#~ msgid "Disabled" +#~ msgstr "Απενεργοποιημένο" + +#~ msgid "ratings in total" +#~ msgstr "συνολικές αξιολογήσεις" + +#~ msgid "Looking for new updates…" +#~ msgstr "Αναζήτηση νέων ενημερώσεων…" + +#~ msgid "Setting up updates…" +#~ msgstr "Ρύθμιση ενημερώσεων…" + +#~ msgid "Software is up to date" +#~ msgstr "Το λογισμικό σας είναι ενημερωμένο" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "" +#~ "Οι ενημερώσεις θα εφαρμοστούν όταν θα γίνει επανεκκίνηση του υπολογιστή." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Αναμονή για λήψη του %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Λήψη του %s %s" + +#~ msgid "%s %s Ready to be Installed" +#~ msgstr "Το %s %s είναι έτοιμο προς εγκατάσταση" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "Το ODRS είναι μια υπηρεσία όπου παρέχει κριτικές χρηστών στις εφαρμογές" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Χαρακτήρες κινουμένων σχεδίων σε επικίνδυνες καταστάσεις" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Χαρακτήρες κινουμένων σχεδίων σε επιθετική σύγκρουση" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Γραφική βία μεταξύ χαρακτήρων κινουμένων σχεδίων" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Χαρακτήρες σε επικίνδυνες καταστάσεις όπου διακρίνονται εύκολα από την " +#~ "πραγματικότητα" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Χαρακτήρες σε επιθετικές συγκρούσεις όπου διακρίνονται εύκολα από την " +#~ "πραγματικότητα" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Γραφική βία όπου διακρίνεται εύκολα από την πραγματικότητα" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Ήπιοι ρεαλιστικοί χαρακτήρες σε επικίνδυνες καταστάσεις" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Απεικονίσεις ρεαλιστικών χαρακτήρων σε επιθετική σύγκρουση" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Γραφική βία μεταξύ πραγματικών χαρακτήρων" + +#~ msgid "No bloodshed" +#~ msgstr "Χωρίς αιματοχυσία" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Μη ρεαλιστική αιματοχυσία" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Ρεαλιστική αιματοχυσία" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Απεικονίσεις αιματοχυσίας και ακρωτηριασμού μερών του σώματος" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Βιασμός ή άλλη βίαιη σεξουαλική συμπεριφορά" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Αναφορές σε αλκοολούχα ποτά" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Χρήση αλκοολούχων ποτών" + +#~ msgid "References to illicit drugs" +#~ msgstr "Αναφορές σε παράνομα ναρκωτικά" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Χρήση παράνομων ναρκωτικών" + +#~ msgid "References to tobacco products" +#~ msgstr "Αναφορές σε προϊόντα καπνού" + +#~ msgid "Use of tobacco products" +#~ msgstr "Χρήση προϊόντων καπνού" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Σύντομο καλλιτεχνικό γυμνό" + +#~ msgid "Prolonged nudity" +#~ msgstr "Παρατεταμένο γυμνό" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Προκλητικές αναφορές ή απεικονίσεις" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Σεξουαλικές αναφορές ή απεικονίσεις" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Γραφική σεξουαλική συμπεριφορά" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Ήπια ή σπάνια χρήση βωμολοχιών" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Μέτρια χρήση βωμολοχιών" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Συχνή χρήση βωμολοχιών" + +#~ msgid "Slapstick humor" +#~ msgstr "Χονδροειδές χιούμορ" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Χυδαίο ή βρώμικο χιόυμορ" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Σεξουαλικό χιόυμορ" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Αρνητικότητα προς μια συγκεκριμένη ομάδα ανθρώπων" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Διακρίσεις με σκοπό συναισθηματική βλάβη" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Σαφής διάκριση με βάση το φύλο, τη σεξουαλικότητα, το γένος ή τη θρησκεία" + +#~ msgid "Product placement" +#~ msgstr "Τοποθέτηση προϊόντος" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Ρητές αναφορές σε συγκεκριμένες μάρκες ή εμπορικά σήματα προϊόντων" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Οι χρήστες ενθαρρύνονται να αγοράζουν συγκεκριμένα πραγματικά αντικείμενα" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Τζόγος σε τυχαία γεγονότα χρησιμοποιώντας μάρκες" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Τζόγος χρησιμοποιώντας «εικονικά» χρήματα" + +#~ msgid "Gambling using real money" +#~ msgstr "Τζόγος με πραγματικά χρήματα" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Οι παίκτες ενθαρρύνονται να αγοράζουν πραγματικά χρήματα" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Δυνατότητα χρήσης πραγματικών χρημάτων στην εφαρμογή" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Οι αλληλεπιδράσεις μεταξύ χρηστών χωρίς λειτουργία συνομιλίας" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Ελεγχόμενη λειτουργία συνομιλίας μεταξύ των χρηστών" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "" +#~ "Ανεξέλεγκτη λειτουργία συνομιλίας με ήχο ή βίντεο μεταξύ των χρηστών" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Γίνεται κοινή χρήση των ονομάτων χρηστών κοινωνικής δικτύωσης ή των " +#~ "διευθύνσεων ηλεκτρονικού ταχυδρομείου" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Γίνεται έλεγχος για την πιο πρόσφατη έκδοση της εφαρμογής" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Διαμοιρασμός διαγνωστικών δεδομένων που δεν επιτρέπουν σε άλλους να " +#~ "αναγνωρίσουν τον χρήστη" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Διαμοιρασμός πληροφοριών που επιτρέπει σε άλλους να αναγνωρίσουν τον " +#~ "χρήστη" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Διαμοιρασμός φυσικής τοποθεσίας σε άλλους χρήστες" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Έμμεσες αναφορές στην ομοφυλοφιλία" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Φιλί μεταξύ ανθρώπων του ίδιου φύλου" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Γραφική σεξουαλική συμπεριφορά μεταξύ ατόμων του ίδιου φύλου" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Έμμεσες αναφορές στην πορνεία" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Άμεσες αναφορές σε πορνεία" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Γραφικές απεικονίσεις της πράξης πορνείας" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Έμμεσες αναφορές σε μοιχεία" + +#~ msgid "Direct references to adultery" +#~ msgstr "Άμεσες αναφορές σε μοιχεία" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Γραφικές απεικονίσεις της μοιχείας" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Ελαφρά ντυμένοι ανθρώπινοι χαρακτήρες" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Εξαιρετικά σεξουαλικοποιημένοι ανθρώπινοι χαρακτήρες" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Απεικονίσεις ή αναφορές στην ιστορική βεβήλωση" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Απεικονίσεις της σύγχρονης ανθρώπινης βεβήλωσης" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Γραφικές απεικονίσεις της σύγχρονης βεβήλωσης" + +#~ msgid "Visible dead human remains" +#~ msgstr "Ορατά νεκρά ανθρώπινα κατάλοιπα" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Νεκρά ανθρώπινα λείψανα που εκτίθενται στα στοιχεία" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Γραφικές απεικονίσεις της βεβήλωσης των ανθρώπινων σωμάτων" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Απεικονίσεις ή αναφορές στην ιστορική δουλεία" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Απεικονίσεις της σύγχρονης δουλείας" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Γραφικές απεικονίσεις της σύγχρονης δουλείας" + +#~ msgid "General" +#~ msgstr "Γενικά" + +#~ msgid "ALL" +#~ msgstr "ΟΛΟΙ" + +#~ msgid "Teen" +#~ msgstr "Έφηβοι" + +#~ msgid "Everyone 10+" +#~ msgstr "Όλοι 10+" + +#~ msgid "Everyone" +#~ msgstr "Όλοι" + +#~ msgid "Early Childhood" +#~ msgstr "Παιδική ηλικία" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Άγνωστη" + +#~ msgid "Released" +#~ msgstr "Κυκλοφόρησε" + +#~ msgid "Format" +#~ msgstr "Μορφή" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Χθες, %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Χθες, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Τρεις ημέρες πριν" + +#~ msgid "Four days ago" +#~ msgstr "Τέσσερις ημέρες πριν" + +#~ msgid "Five days ago" +#~ msgstr "Πέντε ημέρες πριν" + +#~ msgid "Six days ago" +#~ msgstr "Έξι ημέρες πριν" + +#~ msgid "Two weeks ago" +#~ msgstr "Πριν από δύο εβδομάδες" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Πάμε για ψώνια" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Αφαιρέθηκε" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Είστε σίγουροι ότι θέλετε να αφαιρέσετε το %s;" + +#~ msgid "Security Updates Pending" +#~ msgstr "Εκκρεμούν ενημερώσεις ασφάλειας" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Συνιστάται να εγκαταστήσετε τώρα τις σημαντικές ενημερώσεις" + +#~ msgid "Restart & Install" +#~ msgstr "Επανεκκίνηση & εγκατάσταση" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Σημαντικές ενημερώσεις λειτουργικού συστήματος και εφαρμογών είναι " +#~ "έτοιμες να εγκατασταθούν" + +#~ msgid "View" +#~ msgstr "Προβολή" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Ενεργοποίηση αποθετηρίου προσθέτων του κελύφους GNOME" + +#~ msgid "this website" +#~ msgstr "αυτός ο ιστότοπος" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Απαιτείται επανεκκίνηση της εφαρμογής για να χρησιμοποιηθούν τα νέα " +#~ "πρόσθετα." + +#~ msgid "About %s" +#~ msgstr "Περί %s" + +#~ msgid "%s ME" +#~ msgstr "%s ME" + +#~ msgid "Extension Settings" +#~ msgstr "Ρυθμίσεις επέκτασης" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Οι επεκτάσεις χρησιμοποιούνται με δικό σας ρίσκο. Αν έχετε κάποιο " +#~ "πρόβλημα με το σύστημα μας, τότε είναι συνετό να τις απενεργοποιήσετε." + +#~ msgid "Spacing" +#~ msgstr "Διάστημα" + +#~ msgid "The amount of space between children" +#~ msgstr "Το μέγεθος του διαστήματος μεταξύ θυγατρικών" + +#~ msgid "Featured Applications" +#~ msgstr "Δημοφιλέστερες εφαρμογές" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Επεκτάσεις κελύφους" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Αποθετήριο επεκτάσεις κελύφους GNOME" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Λήψη μεταδεδομένων επέκτασης κελύφους…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Επεκτάσεις κελύφους GNOME" + +#~ msgid "Show the folder management UI" +#~ msgstr "Εμφάνιση διαχείσισης φακέλου του περιβάλλοντος χρήστη" + +#~ msgid "Folder Name" +#~ msgstr "Όνομα φακέλου" + +#~ msgid "_Add" +#~ msgstr "_Προσθήκη" + +#~ msgid "Add to Application Folder" +#~ msgstr "Προσθήκη στον φάκελο εφαρμογών" + +#~ msgid "Top Rated" +#~ msgstr "Υψηλή βαθμολογία" + +#~| msgid "Failed to load image" +#~ msgid "Failed to load components" +#~ msgstr "Αποτυχία φόρτωσης στοιχείων" + +#~ msgid "CSS validated OK!" +#~ msgstr "Το CSS επικυρώθηκε!" + +#~ msgid "Failed to load file" +#~ msgstr "Αποτυχία φόρτωσης αρχείου" + +#~ msgid "Unsaved changes" +#~ msgstr "Μη αποθηκευμένες αλλαγές" + +#~ msgid "The application list is already loaded." +#~ msgstr "Η λίστα εφαρμογών έχει ήδη φορτωθεί." + +#~ msgid "Merge documents" +#~ msgstr "Συγχώνευση εγγράφων" + +#~ msgid "Throw away changes" +#~ msgstr "Δεν θα αποθηκευτούν οι αλλαγές" + +#~ msgid "Open AppStream File" +#~ msgstr "Άνοιγμα αρχείου AppStream" + +#~| msgid "Open AppStream File" +#~ msgid "Save AppStream File" +#~ msgstr "Αποθήκευση αρχείου AppStream" + +#~ msgid "_Save" +#~ msgstr "_Αποθήκευση" + +#~ msgid "Failed to save file" +#~ msgstr "Αποτυχία αποθήκευσης αρχείου" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s διαγράφηκε το σχέδιο μπάνερ." + +#~ msgid "Banner design deleted." +#~ msgstr "Διαγράφηκε το σχέδιο μπάνερ." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Η λίστα εφαρμογών έχει μη αποθηκευμένες αλλαγές." + +#~ msgid "Use verbose logging" +#~ msgstr "Χρησιμοποίηση λεπτομερούς καταγραφής" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Εφαρμογή σχεδιασμού μπάνερ Λογισμικού GNOME" + +#~ msgid "No Designs" +#~ msgstr "Κανένα σχέδιο" + +#~ msgid "Error message here" +#~ msgstr "Μήνυμα σφάλματος" + +#~ msgid "Category Featured" +#~ msgstr "Κατηγορία Δημοφιλέστερων" + +#~ msgid "Undo" +#~ msgstr "Αναίρεση" + +#~ msgid "Banner Designer" +#~ msgstr "Εφαρμογή σχεδίασης μπάνερ" + +#~ msgid "New Banner" +#~ msgstr "Νέο μπάνερ" + +#~ msgid "Import from file" +#~ msgstr "Εισαγωγή από αρχείο" + +#~ msgid "Export to file" +#~ msgstr "Εξαγωγή σε αρχείο" + +#~ msgid "Click on items to select them" +#~ msgstr "Πατήστε στα αντικείμενα για να τα επιλέξετε" + +#~ msgid "Select" +#~ msgstr "Επιλογή" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Προσθήκη σε φάκελο…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Μετακίνηση σε φάκελο…" + +#~ msgid "_Remove from Folder" +#~ msgstr "Α_φαίρεση από τον κατάλογο" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Σχεδιασμός μπάνερ δημοφιλέστερων στο Λογισμικό GNOME" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Λογισμικό;Εφαρμογή;AppStream;Software;App;" + +#~ msgid "_All" +#~ msgstr "Ό_λα" + +#~ msgid "Sign In / Register…" +#~ msgstr "Σύνδεση / Εγγραφή…" + +#~ msgid "Continue" +#~ msgstr "Συνέχεια" + +#~ msgid "Use" +#~ msgstr "Χρήση" + +#~ msgid "Add another…" +#~ msgstr "Προσθήκη άλλου…" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s θα εγκατασταθούν, και θα χρεωθείτε %s." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "Συνδεθήκατε ως %s" + +#~ msgid "Sign in…" +#~ msgstr "Σύνδεση…" + +#~ msgid "Sign out" +#~ msgstr "Αποσύνδεση" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Αδύνατη η αγορά του %s: απαιτείται πιστοποίηση" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Αδύνατη η αγορά του %s: μη έγκυρη πιστοποίηση" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Αδύνατη η αγορά του %s: δεν έχει οριστεί μέθοδος πληρωμής" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Αδύνατη η αγορά του %s: η πληρωμή απορρίφθηκε" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "" +#~ "Για να συνεχίσετε πρέπει να χρησιμοποιήσετε έναν λογαριασμό Ubuntu One." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "" +#~ "Για να συνεχίσετε πρέπει να χρησιμοποιήσετε τον λογαριασμό σας στο Ubuntu " +#~ "One." + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "..." +#~ msgstr "..." + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Φορτώνεται ο κατάλογος λογισμικού" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Αδύνατη η ενημέρωση του %s από το %s" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Εμφάνιση πληροφοριών προφίλ για την υπηρεσία" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Για να συνεχίσετε πρέπει να συνδεθείτε στο %s." + +#~ msgid "Email address" +#~ msgstr "Διεύθυνση ηλ. αλληλογραφίας" + +#~ msgid "I have an account already" +#~ msgstr "Έχω ήδη λογαριασμό" + +#~ msgid "I want to register for an account now" +#~ msgstr "Θέλω να εγγραφώ για ένα λογαριασμό τώρα" + +#~ msgid "I have forgotten my password" +#~ msgstr "Ξεχάσα τον κωδικό πρόσβασης μου" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Αυτόματη είσοδος την επόμενη φορά" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "" +#~ "Πληκτρολογήστε τον μοναδικό κωδικό pin για την πιστοποίηση δύο παραγόντων." + +#~ msgid "PIN" +#~ msgstr "Κωδικός PIN" + +#~ msgid "Authenticate" +#~ msgstr "Πιστοποίηση" + +#~ msgid "_About" +#~ msgstr "_Περί" + +#~ msgid "_Quit" +#~ msgstr "Έ_ξοδος" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Πληροφορίες για το %s, καθώς και επιλογές για το πώς θα πάρετε έναν " +#~ "κωδικοποιητή που μπορεί να αναπαράγει αυτήν τη μορφή μπορούν να βρεθούν " +#~ "στον ιστότοπο." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Ο λογαριασμός σας %s έχει ανασταλεί." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Δεν είναι δυνατόν να εγκαταστήσετε λογισμικό έως ότου επιλυθεί." + +#~ msgid "For more information, visit %s." +#~ msgstr "Για περισσότερες πληροφορίες, επισκεφθείτε %s." + +#~ msgid "Applications Updated" +#~ msgstr "Ενημερωμένες εφαρμογές" + +#~ msgid "Includes: ." +#~ msgstr "Περιλαμβάνει: ." + +#~ msgid "Downloading new updates…" +#~ msgstr "Λήψη νέων ενημερώσεων…" + +#~ msgid "Downloading application page…" +#~ msgstr "Λήψη σελίδας εφαρμογής…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Η υπέρτατη πλατφόρμα διασκέδασης από την Valve" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Λίστα με επιπλέον πηγές που έχουν προηγουμένως ενεργοποιηθεί" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Μια λίστα με πηγές που έχουν προηγουμένως ενεργοποιηθεί κατά την " +#~ "εγκατάσταση εφαρμογών τρίτων." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Εμφάνιση μη ελεύθερου λογισμικού στα αποτελέσματα αναζήτησης" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "Λίστα μη ελεύθερων πηγών που μπορούν προαιρετικά να ενεργοποιηθούν" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Προεπιλεγμένες αλληλεπιδράσεις παικτών χωρίς λειτουργία συνομιλίας" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Ενεργοποίηση πηγών κλειστού λογισμικού;" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Δεν έχουν εγκατασταθεί εφαρμογές ή πρόσθετα, ή κάποιο άλλο λογισμικό" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "" +#~ "Συνήθως έχει περιορισμούς ως προς τη χρήση του και την πρόσβαση στον " +#~ "πηγαίο κώδικα." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Ιδιοταγείς πηγές λογισμικού" + +#~ msgid "Remove Source" +#~ msgstr "Αφαίρεση πηγής" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Οι πηγές λογισμικού μπορούν να μεταφορτωθούν από το διαδίκτυο. Σας δίνουν " +#~ "πρόσβαση σε πρόσθετο λογισμικό που δεν παρέχεται από το %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Η αφαίρεση μιας πηγής θα απομακρύνει επίσης και οποιοδήποτε λογισμικό που " +#~ "εγκαταστήσατε από αυτήν." + +#~ msgid "No software installed from this source" +#~ msgstr "Δεν υπάρχει λογισμικό που να εγκαταστάθηκε από αυτή την πηγή" + +#~ msgid "Installed from this Source" +#~ msgstr "Εγκαταστάθηκε από αυτή την πηγή" + +#~ msgid "Last Checked" +#~ msgstr "Ελέγχθηκε τελευταία φορά" + +#~ msgid "Added" +#~ msgstr "Προστέθηκε" + +#~ msgid "Website" +#~ msgstr "Ιστότοπος" + +#~ msgid "Restart & _Install" +#~ msgstr "Επανεκκίνηση & ε_γκατάσταση" + +#~ msgid "Getting runtime source…" +#~ msgstr "Λήψη εκτελέσιμου πηγαίου αρχείου..." + +#~ msgid "Limba Support" +#~ msgstr "Υποστήριξη Limba" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Το Limba παρέχει στους προγραμματιστές έναν εύκολο τρόπο να δημιουργήσουν " +#~ "πακέτα λογισμικού" + +#~ msgid "“%s” [%s]" +#~ msgstr "«%s» [%s]" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgid "Total" +#~ msgstr "Σύνολο" + +#~ msgid "Could not find '%s'" +#~ msgstr "Αδυναμία εύρεσης του '%s'" + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Κανένα" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Όλα" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Δημοφιλέστερο" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Αστρονομία" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Χημεία" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Μαθηματικά" + +#~ msgid "Science" +#~ msgstr "Επιστήμες" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Οι πηγές λογισμικού σας δίνουν πρόσβαση σε πρόσθετο λογισμικό." + +#~ msgid "Installation of %s failed." +#~ msgstr "Απέτυχε η εγκατάσταση του %s." + +#~ msgid "Removal of %s failed." +#~ msgstr "Απέτυχε η αφαίρεση του %s." + +#, fuzzy +#~| msgid "Removal of %s failed." +#~ msgid "Upgrade to %s failed." +#~ msgstr "Απέτυχε η αφαίρεση του %s." + +#, fuzzy +#~| msgid "Network access was required but not available." +#~ msgid "Internet access was required but wasn’t available." +#~ msgstr "Απαιτείται πρόσβαση στο δίκτυο αλλά δεν είναι διαθέσιμη." + +#, fuzzy +#~| msgid "" +#~| "Internet access was required but wasn’t available. Please make sure that " +#~| "you have internet access and try again." +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "" +#~ "Ζητήθηκε πρόσβαση διαδικτύου, αλλά δεν ήταν διαθέσιμη. Παρακαλούμε, " +#~ "βεβαιωθείτε ότι έχετε πρόσβαση διαδικτύου και ξαναδοκιμάστε." + +#, fuzzy +#~| msgid "" +#~| "There wasn’t enough disk space. Please free up some space and try again." +#~ msgid "There wasn’t enough disk space." +#~ msgstr "" +#~ "Δεν υπήρξε αρκετός χώρος στον δίσκο. Παρακαλούμε, ελευθερώστε κάποιο χώρο " +#~ "και ξαναπροσπαθήστε." + +#, fuzzy +#~| msgid "" +#~| "There wasn’t enough disk space. Please free up some space and try again." +#~ msgid "Please free up some space and try again." +#~ msgstr "" +#~ "Δεν υπήρξε αρκετός χώρος στον δίσκο. Παρακαλούμε, ελευθερώστε κάποιο χώρο " +#~ "και ξαναπροσπαθήστε." + +#~ msgid " or " +#~ msgstr " ή " + +#~ msgid "3rd party" +#~ msgstr "εφαρμογή τρίτου" + +#~ msgid "nonfree" +#~ msgstr "μη ελεύθερο" + +#~ msgid "_Installing" +#~ msgstr "Ε_γκαθίσταται" + +#~ msgid "_Removing" +#~ msgstr "Α_φαιρείται" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Άγνωστη" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Υπολογισμός…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Άγνωστο" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Αυτό είναι λογισμικού από τρίτο." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Αυτό το λογισμικό έχει αναπτυχθεί από κάποιον τρίτο και μπορεί να " +#~ "περιέχει μη ελεύθερα στοχεία." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Αυτό το λογισμικό μπορεί να περιέχει μη ελεύθερα στοιχεία." + +#~ msgid "_History" +#~ msgstr "Ι_στορικό" + +#~ msgid "Size" +#~ msgstr "Μέγεθος" + +#~ msgid "non-free" +#~ msgstr "μη ελεύθερο" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Προτεινόμενες εφαρμογές γραφείου" + +#~ msgid "One Star" +#~ msgstr "Ένα αστέρι" + +#~ msgid "Two Stars" +#~ msgstr "Δύο αστέρια" + +#~ msgid "Three Stars" +#~ msgstr "Τρία αστέρια" + +#~ msgid "Four Stars" +#~ msgstr "Τέσσερα αστέρια" + +#~ msgid "Five Stars" +#~ msgstr "Πέντε αστέρια" + +#~ msgid "No AppStream data found" +#~ msgstr "Δεν βρέθηκαν δεδομένα AppStream" + +#~ msgid "Audio" +#~ msgstr "Ήχος" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Επεξεργασία" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Βάσεις δεδομένων" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Εγγραφή δίσκων" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Ραδιοερασιτέχνες" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Μείκτης" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Μουσική" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Συσκευές εγγραφής" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Συσκευές εγγραφής μουσικής" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Δέκτες" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Δόμηση" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Βάσεις δεδομένων" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Προφίλ" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Ανάπτυξη εφαρμογών διαδικτύου" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Βιολογία" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Επιστήμη υπολογιστών" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Οπτικοποίηση δεδομένων" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Οικονομία" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Ηλεκτρισμός" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Ηλεκτρονικά" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Μηχανική" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Γεωλογία" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Γεωλογικές επιστήμες" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Ιστορία" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Επεξεργασία εικόνας" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Λογοτεχνία" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Χάρτες" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Μουσική" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Αριθμητική ανάλυση" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Παράλληλος υπολογισμός" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Φυσική" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Πνευματικότητα" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Σκοπευτές" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Προσομοίωση" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Αθλητισμός" + +#~ msgid "Graphics" +#~ msgstr "Γραφικά" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "Γραφικά 2Δ" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Δημοσίευση" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Γραφικά εικονογραφιών" + +#~ msgid "Internet" +#~ msgstr "Διαδίκτυο" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Τηλεφωνική σύνδεση" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Αλληλογραφία" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Ροή" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Μεταφορά αρχείων" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Ραδιοερασιτέχνες" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Άμεσα μηνύματα" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "Πελάτες IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Οθόνες" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Τηλεφωνία" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Ανάπτυξη εφαρμογών διαδικτύου" + +#~ msgid "Office" +#~ msgstr "Γραφείο" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Διάγραμμα" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Διαχείριση επαφών" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Λεξικό" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Αλληλογραφία" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Διάγραμμα ροής" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "Υπολογιστής χειρός" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Φωτογραφία" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Διαχείριση έργου" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Δημοσιεύσεις" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Υπολογιστικά φύλλα" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Προβολείς" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Τέχνη" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Τεχνητή νοημοσύνη" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Αστρονομία" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Βιολογία" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Χημεία" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Επιστήμη υπολογιστών" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Κατασκευές" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Οπτικοποίηση δεδομένων" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Οικονομία" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Ηλεκτρισμός" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Ηλεκτρονικά" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Μηχανική" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Γεωγραφία" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Γεωλογία" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Γεωλογικές επιστήμες" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Ιστορία" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Ανθρωπιστικές επιστήμες" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Επεξεργασία εικόνας" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Γλώσσες" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Λογοτεχνία" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Χάρτες" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Μαθηματικά" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Ιατρικά" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Αριθμητική ανάλυση" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Παράλληλος υπολογισμός" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Φυσική" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Ρομποτική" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Πνευματικότητα" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Αθλητισμός" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Προσομοιωτές" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Διαχειριστής αρχείου" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Εργαλεία αρχείων" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Οθόνες" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Ασφάλεια" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Προσομοιωτής τερματικού" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Προσιτότητα" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Αρχειοθέτηση" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Αριθμομηχανή" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Χρονιστές" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Συμπίεση" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Εργαλεία αρχείων" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Χάρτες" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Πνευματικότητα" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Εργαλεία τηλεφωνίας" + +#~ msgid "Video" +#~ msgstr "Βίντεο" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Επεξεργασία" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Βάση δεδομένων" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Εγγραφή δίσκων" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Συσκευές εγγραφής" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "Τηλεόραση" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Fonts" +#~ msgstr "Γραμματοσειρές" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Input Sources" +#~ msgstr "Πηγές εισόδου" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Language Packs" +#~ msgstr "Γλωσσικά πακέτα" + +#~ msgid "A previous update was unfinished." +#~ msgstr "Δεν ολοκληρώθηκε μια προηγούμενη ενημέρωση." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "Η ενημέρωση δεν μπόρεσε να εγκατασταθεί· αυτό συχνά είναι ένα πρόβλημα με " +#~ "την ίδια την ενημέρωση. Παρακαλούμε, περιμένετε μια άλλη ενημέρωση και " +#~ "ξαναδοκιμάστε." + +#~ msgid "Internet Only Application" +#~ msgstr "Μόνο διαδικτυακή εφαρμογή" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Μια ενημέρωση δεν υπεγράφη με τον σωστό τρόπο." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Ζητήθηκε μια ενημέρωση εκτός σύνδεσης, αλλά κανένα πακέτο δεν χρειάζεται " +#~ "ενημέρωση." + +#~ msgid "No space was left on the drive." +#~ msgstr "Δεν έχει απομείνει χώρος στον δίσκο." + +#~ msgid "An update failed to install correctly." +#~ msgstr "Απέτυχε να εγκατασταθεί σωστά μια ενημέρωση." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Απέτυχε η ενημέρωση εκτός σύνδεσης με απροσδόκητο τρόπο." + +#~ msgid "No sources found." +#~ msgstr "Δεν βρέθηκαν πηγές." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i εφαρμογή και %i πρόσθετα εγκαταστάθηκαν" +#~ msgstr[1] "%i εφαρμογές και %i πρόσθετα εγκαταστάθηκαν" + +#~ msgid "You're About to Install Non-Free Software" +#~ msgstr "Πρόκειται να εγκαταστήσετε μη ελεύθερο λογισμικό" + +#~ msgid "" +#~ "Depending on your country of residence, installing it could make you " +#~ "liable to prosecution." +#~ msgstr "" +#~ "Ανάλογα με την χώρα διαμονής σας, εγκαθιστώντας το λογισμικό μπορεί να " +#~ "διωχθείτε ποινικά." + +#~ msgid "If you are uncertain about this, you should obtain legal advice." +#~ msgstr "Αν δεν είσαστε σίγουρος για αυτό συμβουλευτείτε έναν νομικό." + +#~ msgid "Do you want to enable it?" +#~ msgstr "Είστε σίγουροι ότι θέλετε να το ενεργοποιήσετε;" + +#~ msgid "Set the specified debugging level" +#~ msgstr "Ορισμός του συγκεκριμένου επιπέδου αποσφαλμάτωσης" + +#~ msgid "Picks" +#~ msgstr "Επιλεγμένα" + +#~ msgid "January 30, 2014" +#~ msgstr "30 Ιανουαρίου 2014" + +#~ msgid "Complicated!" +#~ msgstr "Περίπλοκο!" + +#~ msgid "_Pending" +#~ msgstr "Ε_κκρεμεί" + +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "Βάσεις δεδομένων" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "Ραδιοερασιτέχνες" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "Ανάπτυξη εφαρμογών διαδικτύου" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "Εργαλεία αρχείων" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "Χάρτες" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "Πνευματικότητα" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "Γραμματοσειρές" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "Κωδικοποιητές-αποκωδικοποιητές" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "Πηγές εισόδου" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "Γλωσσικά πακέτα" + +#~ msgid "Done" +#~ msgstr "Έτοιμο" + +#~ msgid "Goals:" +#~ msgstr "Σκοποί:" + +#~ msgid "" +#~ "
        • View installed applications
        • Remove installed applications
        • View available application updates
        • Install available " +#~ "updates
        • Find new applications
        • Install new applications
        • Find an application to handle a specific type of file
        • " +#~ "
        • Installed apps and updates should be available when offline
        • " +#~ msgstr "" +#~ "
        • Προβολή εγκατεστημένων εφαρμογών
        • Αφαίρεση εγκατεστημένων " +#~ "εφαρμογών
        • Προβολή διαθέσιμων ενημερώσεων εφαρμογών
        • " +#~ "
        • Εγκατάσταση διαθέσιμων ενημερώσεων
        • Εύρεση νέων εφαρμογών
        • Εγκατάσταση νέων εφαρμογών
        • Εύρεση μιας εφαρμογής για να " +#~ "χειριστεί έναν ειδικό τύπο αρχείου
        • Οι εγκατεστημένες εφαρμογές " +#~ "και ενημερώσεις πρέπει να είναι διαθέσιμες χωρίς σύνδεση
        • " diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..a90bbc2 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,8137 @@ +# English (British) translation. +# Copyright (C) 2016 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Translators: +# Richard Hughes , 2012. +# Philip Withnall , 2013. +# Zander Brown , 2019-2021. +# Bruce Cowan , 2017-2024. +# Andi Chandler , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-21 13:46+0000\n" +"PO-Revision-Date: 2025-02-09 18:09+0000\n" +"Last-Translator: Andi Chandler \n" +"Language-Team: English - United Kingdom \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: Poedit 3.5\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Install and update apps" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Overview panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Details panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Installed panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Updates panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "The update details" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "The GNOME Project" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Test akmods key in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Authentication is required to test akmods key in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Enrol akmods key to Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Authentication is required to enrol akmods key to Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Test DKMS key in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Authentication is required to test DKMS key in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Enrol DKMS key to Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Authentication is required to enrol DKMS key to Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Install an appstream file into a system location" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Installing an appstream file into a system location" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "A list of compatible projects" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Whether to manage updates and upgrades in GNOME Software" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automatically download and install updates" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notify the user about software updated in the background" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Whether to automatically refresh when on a metered connection" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Whether it’s the very first run of GNOME Software" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Show star ratings next to applications" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filter applications based on the default branch set for the remote" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Non-free applications show a warning dialogue before install" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"When non-free applications are installed a warning dialogue can be shown. " +"This controls if that dialogue is suppressed." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "The last update check timestamp" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "The last upgrade notification timestamp" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "The last update notification timestamp" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "The timestamp of the first security update, cleared after update" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "The last update timestamp" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "The age in seconds to verify the upstream screenshot is still valid" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "The server to use for application reviews" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "The minimum karma score for reviews" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Reviews with karma less than this number will not be shown." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"A list of official repositories that should not be considered 3rd party" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "A list of required repositories that cannot be disabled or removed" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"A list of official repositories that should be considered free software" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"The licence URL to use when an application should be considered free software" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Install bundled applications for all users on the system where possible" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Allow access to the Software Repositories dialogue" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Offer upgrades for pre-releases" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Show some UI elements informing the user that an app is non-free" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Show the installed size for apps in the list of installed applications" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "The URI that explains nonfree and proprietary software" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "The timestamp of the last attempt to remove unused Flatpak runtimes" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "The timestamp of the last received historical updates." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "A string storing the gnome-online-account id used to login" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Software AppStream system-wide installer" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Failed to parse command line arguments" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "You need to specify exactly one filename" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "This program can only be used by the root user" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Failed to validate content type: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Failed to move: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Software Install" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Install selected software on the system" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Cartoon Violence" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "No information regarding cartoon violence" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantasy Violence" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "No information regarding fantasy violence" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistic Violence" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "No information regarding realistic violence" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violence Depicting Bloodshed" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "No information regarding bloodshed" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Sexual Violence" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "No information regarding sexual violence" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "No information regarding references to alcohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narcotics" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "No information regarding references to illicit drugs" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tobacco" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "No information regarding references to tobacco products" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nudity" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "No information regarding nudity of any sort" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Sexual Themes" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "No information regarding references to or depictions of sexual nature" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Profanity" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "No information regarding profanity of any kind" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Inappropriate Humour" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "No information regarding inappropriate humour" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discrimination" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "No information regarding discriminatory language of any kind" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Advertising" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "No information regarding advertising of any kind" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Gambling" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "No information regarding gambling of any kind" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Purchasing" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "No information regarding the ability to spend money" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Chat Between Users" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "No information regarding ways to chat with other users" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Audio Chat Between Users" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "No information regarding ways to talk with other users" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Contact Details" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"No information regarding sharing of social network usernames or email " +"addresses" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identifying Information" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"No information regarding sharing of user information with third parties" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Location Sharing" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "No information regarding sharing of physical location with other users" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexuality" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "No information regarding references to homosexuality" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitution" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "No information regarding references to prostitution" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adultery" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "No information regarding references to adultery" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Sexualised Characters" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "No information regarding sexualised characters" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Desecration" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "No information regarding references to desecration" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Human Remains" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "No information regarding visible dead human remains" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Slavery" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "No information regarding references to slavery" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Does not include references to drugs" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" +"Does not include swearing, profanity, and other kinds of strong language" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Does not include ads or monetary transactions" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Does not include sex or nudity" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Does not include uncontrolled chat functionality" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Does not include violence" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drugs" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Strong Language" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Money" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violence" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "All" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s has an unknown age rating" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s is suitable for everyone" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s is suitable for toddlers" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s is suitable for young children" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s is suitable for children" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s is suitable for teenagers" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s is suitable for adults" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s is suitable for %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Age Rating" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_How to contribute missing information" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Local file" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Package" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Pending" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Pending install" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Pending remove" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Installing" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Removing" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Downloading" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Install" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Uninstall…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Network" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Can communicate over the network" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "System Services" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Can access D-Bus services on the system bus" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Session Services" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Can access D-Bus services on the session bus" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Devices" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Can access arbitrary devices such as webcams" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Can access input devices" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Can access microphones and play audio" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Can access system device files" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Screen contents" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Can access screen contents" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Home folder" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Can view, edit and create files" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Can view files" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "File system" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Downloads folder" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Settings" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Can view and change any settings" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Legacy display system" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Uses an old, insecure display system" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Sandbox escape" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Can escape the sandbox and circumvent any other restrictions" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "No update description available." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Update Details" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Requires additional permissions" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Invalid ratings data received from server" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Could not communicate with ratings server" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Reviews" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "No reviews were found for this app." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "No Reviews" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Version History" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "New in Version %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Version %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "No details for this release" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Search for applications" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Show application details (using application ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Show application details (using package name)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Install the application (using application ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Uninstall the application (using application ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Open a local package file" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILENAME" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Show a local metainfo or appdata file" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Enable verbose debugging output (from the running instance, if already " +"running)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installs any pending updates in the background" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Show preferences" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Quit the running instance" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Prefer local file sources to AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Show version number" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 GNOME Software contributors" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Philip Withnall \n" +"David King \n" +"Bruce Cowan \n" +"Waldo Luís Ribeiro \n" +"Zander Brown \n" +"Andi Chandler " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Sorry! There are no details for that application." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Installed Size" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Includes %s of data and %s of cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Includes %s of data" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Includes %s of cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Cache and data usage unknown" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Download Size" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Needs no additional system downloads" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Needs an unknown size of additional system downloads" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Needs %s of additional system downloads" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Size is unknown" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "No permissions" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Has network access" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Uses system services" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Uses session services" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Can access hardware devices" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Can access system devices" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Can read/write all your data" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Can read all your data" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Can read/write your downloads" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Can read your downloads" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Can access some specific files" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Can access and change user settings" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Uses a legacy windowing system" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Can acquire arbitrary permissions" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Software developer is verified" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Reviewed by OS distributor" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Reviewed by %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Provided by a third party" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Software no longer supported" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Auditable code" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Unknown licence" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Proprietary code" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Special licence" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privileged" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Safe" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Probably Safe" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potentially Unsafe" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Unsafe" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Mobile Only" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Only works on a small screen" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Desktop Only" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Only works on a large screen" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Screen Size Mismatch" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Doesn’t support your current screen size" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Requires a touchscreen" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Requires a keyboard" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Requires a mouse" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Gamepad Needed" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Requires a gamepad to play" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptive" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Works on phones, tablets and desktops" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Probably requires a keyboard or mouse" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Works on desktops and laptops" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Contains no age-inappropriate content" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "No age rating information available" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visit Website" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Install…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Cancel" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Install" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Download" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Update" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Uninstall…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Uninstalling" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Critical update" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Device cannot be used during update." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Source: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Renamed from %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Stopped Receiving Updates" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Critical Update" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Installed" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Help Translate %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Translations" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Translation Website" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Login required remote %s (realm %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Login Required" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Cancel" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Login" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_User" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Password" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Other" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "All" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Featured" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Editor’s Choice" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "New & Updated" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Picks from the Web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Other Software" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s Installed" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "A restart is required for the changes to take effect" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "The app is ready to be used" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "System Updates Installed" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Recently installed updates are available to review" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Restart" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Launch" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Install Software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Install Third-Party Software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Enable Software Repository?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Enable Third-Party Software Repository?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s is not free and open source software, and is provided by “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s is provided by “%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "This software repository must be enabled to continue installation." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "It may be illegal to install or use %s in some countries." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "It may be illegal to install or use this codec in some countries." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Don’t _Warn Again" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Enable and _Install" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Detailed errors from the package manager follow:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Details" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Close" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Details copied to clipboard" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Accept" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "An update has been installed" +msgstr[1] "Updates have been installed" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "An app has been uninstalled" +msgstr[1] "Apps have been uninstalled" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "A restart is required for it to take effect" +msgstr[1] "A restart is required for them to take effect" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Not Now" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Today" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Yesterday" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d day ago" +msgstr[1] "%d days ago" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d week ago" +msgstr[1] "%d weeks ago" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d month ago" +msgstr[1] "%d months ago" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d year ago" +msgstr[1] "%d years ago" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Just now" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minute ago" +msgstr[1] "%d minutes ago" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d hour ago" +msgstr[1] "%d hours ago" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "All" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Featured" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D Graphics" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Photography" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Scanning" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vector Graphics" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Viewers" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Audio Creation & Editing" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Music Players" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "All" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Featured" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendar" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Database" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finance" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Word Processor" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Text Editors" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Web Browsers" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "All" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Featured" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Action" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Adventure" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocks" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Board" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Card" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulators" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Kids" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logic" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Role Playing" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sports" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategy" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "All" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Featured" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chat" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "All" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Featured" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Artificial Intelligence" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomy" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chemistry" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Languages" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Math" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "News" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotics" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Art" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biography" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Comics" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fiction" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Health" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "History" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Lifestyle" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politics" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sports" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "All" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Featured" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Debuggers" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDEs" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecs" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hardware Drivers" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Fonts" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Input Sources" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Language Packs" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localisation" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Create" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Work" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Play" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socialise" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Learn" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Develop" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Hardware Drivers" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Fonts" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Input Sources" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Language Packs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Localisation" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "An app" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s is requesting additional file format support." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Additional MIME Types Required" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s is requesting additional fonts." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Additional Fonts Required" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s is requesting additional multimedia codecs." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Additional Multimedia Codecs Required" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s is requesting additional printer drivers." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Additional Printer Drivers Required" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s is requesting additional packages." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Additional Packages Required" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Find in Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Show More" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Show Less" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Removing…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Requires restart to finish install" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Requires restart to finish removing" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Pending installation…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Pending update…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Downloading…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Preparing…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Uninstalling…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s is not installed, but it still has data present." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Restart" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Enable…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Install…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s will appear in US English" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "This app will appear in US English" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "This software will appear in US English" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Help _Translate" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Other Apps by %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Developer %s has proven the ownership of %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Developer has proven the ownership of %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "You need internet access to write a review" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "This app is no longer receiving updates, including security fixes" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"This app is already provided by your distribution and should not be replaced." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "This software is no longer receiving updates, including security fixes" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"This software is already provided by your distribution and should not be " +"replaced." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Invalid review response received from server" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Failed to submit review for “%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Details page" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Loading App Details" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verified" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Open" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Update" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Uninstall" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Add-ons" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "This app can only be used when there is an active internet connection." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Software Repository Included" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"This app includes a software repository which provides updates, as well as " +"access to other software." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "No Software Repository Included" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"This app does not include a software repository. It will not be updated with " +"new versions." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Software Repository Identified" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Adding this software repository will give you access to additional software " +"and upgrades." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Only use software repositories that you trust." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Clear app data" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "D_elete Data" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "No Metadata" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Project _Website" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Donate" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Contribute _Translations" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Report an Issue" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Help" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contact" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Write R_eview" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "All Reviews" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Unable to Show App Details" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Failed to prepare reboot" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Unknown error" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "The key was not found" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "The key is not enrolled" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK Enrolment Required" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Next" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "I have made a note of the MOK _password" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Restart & Enrol…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Setup Instructions: Please Read Carefully" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enrol keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Security Implications" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"After successful key enrolment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorisation." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Further guidance can be found on the docs page." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Downloading extra metadata files…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " and " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Available fonts for the %s script" +msgstr[1] "Available fonts for the %s scripts" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Available software for %s" +msgstr[1] "Available software for %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Requested software not found" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Failed to find requested software" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s not found" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "on the website" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "No apps are available that provide the file %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "No apps are available for %s support." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s is not available." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "No fonts are available for the %s script support." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "No addon codecs are available for the %s format." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "No Plasma resources are available for %s support." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "No printer drivers are available for %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "the documentation" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[1] "" +"Unable to find the %s requested by %s. Please see %s for more information." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[1] "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Failed to find any search results: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s file format" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Install _All" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Unable to Find Requested Software" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Codecs page" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "No Results Found" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Unable To Perform Search" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Previous" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Next" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Featured Apps List" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Desktop Support" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Supports being used on a large screen" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Desktop Support Unknown" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Not enough information to know if large screens are supported" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Requires a large screen" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Desktop Not Supported" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Cannot be used on a large screen" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobile Support" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Supports being used on a small screen" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobile Support Unknown" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Not enough information to know if small screens are supported" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Requires a small screen" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobile Not Supported" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Cannot be used on a small screen" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Keyboard Support" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Keyboard Support Unknown" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Not enough information to know if keyboards are supported" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Keyboard Required" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Supports keyboards" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Keyboard Not Supported" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Cannot be used with a keyboard" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Mouse Support" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Requires a mouse or pointing device" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Mouse Support Unknown" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Not enough information to know if mice or pointing devices are supported" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Mouse Required" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Supports mice and pointing devices" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Mouse Not Supported" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Cannot be used with a mouse or pointing device" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Touchscreen Support" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Touchscreen Support Unknown" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Not enough information to know if touchscreens are supported" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Touchscreen Required" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Supports touchscreens" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Touchscreen Not Supported" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Cannot be used with a touchscreen" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Gamepad Required" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Requires a gamepad" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Gamepad Support" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Supports gamepads" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s probably works on this device" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s works on this device" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s possibly works on this device" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s will not work properly on this device" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s will not work on this device" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Hardware Support" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigation" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navigate to Explore Page" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navigate to Installed Page" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navigate to Updates Page" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Open Search Bar" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Windows" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Open Preferences" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Open Software Repositories" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Help" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Open Keyboard Shortcuts" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Installed" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Installed page" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "In Progress" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Apps" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Web Apps" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "System Apps" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Community Built" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Get Involved" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"This app is developed in the open by an international community, and " +"released under the %s licence.\n" +"\n" +"You can participate and help make it even better." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"This app is developed in the open by an international community, and " +"released under the %s licence.\n" +"\n" +"You can participate and help make it even better." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"This software is developed in the open by an international community, and " +"released under the %s licence.\n" +"\n" +"You can participate and help make it even better." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"This software is developed in the open by an international community, and " +"released under the %s licence.\n" +"\n" +"You can participate and help make it even better." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Unknown Licence" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Learn More" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"This app does not specify what licence it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"This software does not specify what licence it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Proprietary" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Special Licence" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"This app is developed under the special licence %s.\n" +"\n" +"You may or may not be able to contribute to this app." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"This app is developed under the special licence “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"This software is developed under the special licence %s.\n" +"\n" +"You may or may not be able to contribute to this software." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"This software is developed under the special licence “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Refreshing Data" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Loading page" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Starting Up" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Unknown source" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "User" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Additions" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Removals" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Updates" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Downgrades" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "selected external sources" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Enable Third Party Software Repositories?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignore" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Enable" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Available for your operating system" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Available for %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Explore" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Overview page" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Available Apps" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Other Categories" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "No App Data Found" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Unknown" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "User declined installation" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Prepare %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Are you sure you want to remove the %s repository?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Uninstall %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "It will not be possible to use %s after removal." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"It will not be possible to use any apps which depend on %s after removal." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Hardware which depends on %s may no longer function correctly after removal." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferences" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Software Updates" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "More Information" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatic" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Automatically check for and download updates" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Checking for and downloading updates must be done manually" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Automatic Update _Notifications" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Notify when updates have been automatically installed" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Content Filters" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Only Show _Free Software" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Hide proprietary software when browsing and searching" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Only Show _Verified Developers" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Show only apps from developers whose identity has been verified" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Incompatible Software" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Upgrade" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Uninstall" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "App Settings & Data" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Keep" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Allows restoring app settings and content" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Delete" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Permanently deletes data to save disk space" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Software that has been installed from “%s” will cease to receive updates." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Disable Repository?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Remove Repository?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Disable" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Remove" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Enable New Repositories" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Turn on new repositories when they are added" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "more information" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Additional repositories from selected third parties — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora Third Party Repositories" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "the operating system" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "These repositories supplement the default software provided by %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Software Repositories" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "No Repositories" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u app installed" +msgstr[1] "%u apps installed" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u add-on installed" +msgstr[1] "%u add-ons installed" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u app" +msgstr[1] "%u apps" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u add-on" +msgstr[1] "%u add-ons" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s and %s installed" +msgstr[1] "%s and %s installed" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Checking installed software…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Remove" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Hate it" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Don’t like it" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "It’s OK" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Like it" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Love it" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Select a Star to Leave a Rating" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Please take more time writing the review" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Please choose a star rating" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "The summary is too short" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "The summary is too long" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "The description is too short" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "The description is too long" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Write a Review" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Send" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Review Summary" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Write a short review" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u review total" +msgstr[1] "%u reviews total" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "out of 5 stars" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Unknown" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "You can report reviews for abusive, rude, or discriminatory behaviour." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Report Review?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Report" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Remove Review?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Removing a review cannot be undone." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Like Review" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Dislike Review" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Report…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Remove…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Check that you trust the vendor, as the app isn’t sandboxed" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "No Permissions" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "App is fully sandboxed" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Network Access" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Can access the internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "No Network Access" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Cannot access the internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Uses System Services" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Can request data from system services" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Uses Session Services" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Can request data from session services" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "User Device Access" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Can access devices such as webcams or gaming controllers" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "No User Device Access" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Cannot access devices such as webcams or gaming controllers" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Input Device Access" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Microphone Access and Audio Playback" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Can listen using microphones and play audio without asking permission" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "System Device Access" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Can access system devices which require elevated permissions" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Screen Contents Access" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Can access the contents of the screen or other windows" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Legacy Windowing System" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Arbitrary Permissions" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "User Settings" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Full File System Read/Write Access" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Can read and write all data on the file system" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Home Folder Read/Write Access" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Can read and write all data in your home directory" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Full File System Read Access" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Can read all data on the file system" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Home Folder Read Access" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Can read all data in your home directory" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Download Folder Read/Write Access" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Can read and write all data in your downloads directory" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Download Folder Read Access" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Can read all data in your downloads directory" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Can read and write all data in the directory" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Can read all data in the directory" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "No File System Access" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Cannot access the file system at all" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "App developer is verified" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"The developer of this app has been verified to be who they say they are" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Insecure Dependencies" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Software or its dependencies are no longer supported and may be insecure" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"This app does not specify what licence it is developed under, and may be " +"proprietary" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"This software does not specify what licence it is developed under, and may " +"be proprietary" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Proprietary Code" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "This app is developed under the special licence “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "This software is developed under the special licence “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Auditable Code" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s is privileged" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s is safe" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s is probably safe" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s is potentially unsafe" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s is unsafe" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Unknown" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Safety" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licence" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Source" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Previous Screenshot" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Next Screenshot" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "No Screenshots" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Screenshot not found" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Failed to load image" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Screenshot size not found" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Could not create cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Screenshot not valid" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Screenshot not available" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Screenshot" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u more match" +msgstr[1] "%u more matches" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Search page" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Search for Apps" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "No App Found" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "Unable to download updates" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "Unable to download firmware updates" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Unable to download firmware updates from %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Unable to download updates from %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "Unable to update: Internet access required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "Unable to update: not enough disk space" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Unable to download updates from %s: not enough disk space" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "Unable to update: authentication required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "Unable to update: invalid authentication" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "Unable to update: permission required" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Unable to download updates: you do not have permission to install software" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "Unable to get list of updates" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "Unable to install: download failed" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Unable to install %s: failed download from %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Unable to install %s: download failed" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "Unable to install: missing runtime" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Unable to install %s: runtime %s unavailable" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "Unable to install %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "Unable to install: Internet access required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "Unable to install: invalid app format" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "Unable to install: not enough disk space" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Unable to install %s: not enough disk space" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "Unable to install: authentication required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Unable to install %s: authentication required" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "Unable to install: invalid authentication" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Unable to install %s: invalid authentication" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "Unable to install: permission required" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Unable to install %s: permission required" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "Unable to install: device must be plugged in" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Unable to install %s: device must be plugged in" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "Unable to install: low battery" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Unable to install %s: low battery" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Unable to update %s from %s: download failed" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Unable to update %s: download failed" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Unable to install updates from %s: download failed" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "Unable to update: download failed" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Unable to update %s: not enough disk space" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Unable to update %s: authentication required" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Unable to update %s: invalid authentication" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Unable to update %s: permission required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "Unable to update: device must be plugged in" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Unable to update %s: device must be plugged in" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "Unable to update: low battery" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Unable to update %s: low battery" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "Unable to update %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "Unable to update" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "Unable to upgrade" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Unable to upgrade to %s from %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "Unable to upgrade: download failed" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Unable to upgrade to %s: download failed" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "Unable to upgrade: Internet access required" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Unable to upgrade to %s: Internet access required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "Unable to upgrade: not enough disk space" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Unable to upgrade to %s: not enough disk space" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "Unable to upgrade: authentication required" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Unable to upgrade to %s: authentication required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "Unable to upgrade: invalid authentication" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Unable to upgrade to %s: invalid authentication" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "Unable to upgrade: permission required" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Unable to upgrade to %s: permission required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Unable to upgrade: device must be plugged in" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Unable to upgrade to %s: device must be plugged in" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "Unable to upgrade: low battery" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Unable to upgrade to %s: low battery" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Unable to upgrade to %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "Unable to uninstall: authentication required" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Unable to uninstall %s: authentication required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "Unable to uninstall: invalid authentication" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Unable to uninstall %s: invalid authentication" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "Unable to uninstall: permission required" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Unable to uninstall %s: permission required" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Unable to uninstall: device must be plugged in" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Unable to uninstall %s: device must be plugged in" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "Unable to uninstall: low battery" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Unable to uninstall %s: low battery" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Unable to uninstall %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "Unable to launch %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "Sorry, something went wrong" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Unable to launch %s: %s is not installed" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "Not enough disk space for operation" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "Unable to install: file type not supported" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "Unable to install: authentication failed" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "Unable to install" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "Unable to contact %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "Restart Software to use new plugins" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "Device needs to be plugged in" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "Battery level is too low" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Software Repositories" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferences" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Keyboard Shortcuts" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_About Software" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Search" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Main Menu" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Search apps" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Explore" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Installed" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Updates" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Go back" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "None" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "App Data" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Data needed for the app to run" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "User Data" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Data created by you in the app" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Cache Data" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Temporary cached data" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "The app itself" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Required Dependencies" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Shared system components required by this app" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Unknown" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Cached data can be cleared from the _app settings" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Storage" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Installed)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Installing)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Downloading)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Removing)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Details" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examine" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Installed on %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Installed Updates" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "No Updates Installed" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Updates Are Out of Date" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Please check for available updates" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Critical Updates Ready to Install" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Install critical updates as soon as possible" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Critical Updates Available to Download" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Download critical updates as soon as possible" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Updates Ready to Install" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Software updates are ready and waiting" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Updates Available to Download" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Software updates can be downloaded" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u App Updated — Restart Required" +msgstr[1] "%u Apps Updated — Restart Required" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u App Updated" +msgstr[1] "%u Apps Updated" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s has been updated." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Please restart the app." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s and %s have been updated." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u app requires a restart." +msgstr[1] "%u apps require a restart." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Includes %s, %s and %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "System Has Reached End of Life" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Upgrade to continue receiving updates" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "A new version of %s is available to install" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Software Upgrade Available" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Software Updates Failed" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Prepared updates were not installed" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Show Details" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "System Upgrade Complete" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Welcome to %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Software Update Installed" +msgstr[1] "Software Updates Installed" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "An important operating system update has been installed." +msgstr[1] "Important operating system updates have been installed." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Review" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Failed To Update" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "The system was already up to date." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "The update was cancelled." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"There were security issues with the update. Please consult your software " +"provider for more details." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"There wasn’t enough disk space. Please free up some space and try again." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Last checked: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Stop" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Check for Updates" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s has stopped receiving critical software updates" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Your operating system has stopped receiving critical software updates" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Charges May Apply" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Check _Anyway" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Software Upgrades Downloaded" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Upgrades are ready to be installed" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Check for updates" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Updates" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Updates page" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Loading Updates" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "This could take a while" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Up to Date" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Use Mobile Data?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Check Anyway" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "No Connection" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Go online to check for updates" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Network Settings" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Error" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Updates are automatically managed" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Software Updates Paused" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automatic software updates have been paused for the following reasons:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• The current network connection is metered" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• The current network connection prohibits large downloads" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Power saver mode is active" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Game mode is active" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Software updates paused" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Network connection is metered — software updates paused" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "Network connection prohibits large downloads — software updates paused" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Power saver mode is active — software updates paused" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Game mode is active — software updates paused" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Restart & Update…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "U_pdate All" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Software Updates Downloaded" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Updates are ready to be installed" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integrated Firmware" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Requires Restart" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "App Updates" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Device Firmware" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Download" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s Available" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s Available" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Learn about the new version" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s of %s downloaded" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% downloaded" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "A major upgrade, with new features and added polish." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Cancel Upgrade" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Restart & Upgrade…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Remember to back up data and files before upgrading." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Error Details" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Copy Details" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Failed to delete file “%s”: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Failed to delete directory “%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Add, remove or update software on this computer" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s Ready" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "The %s is ready to be enabled and staged for the next boot." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Enable" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "System Updates" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"General system updates, such as security or bug fixes, and performance " +"improvements." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s update with new features and fixes." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS update service could not fetch and apply the update." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Web App" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Web Apps Support" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Run popular web applications in a browser" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Upgrade for the latest features, performance and stability improvements." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak Support" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak is a framework for desktop apps on Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "System folder %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Home subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Host system folders" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Host system configuration from /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Desktop folder" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Desktop subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Documents folder" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Documents subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Music folder" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Music subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Pictures folder" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Pictures subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Public Share folder" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Public Share subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Videos folder" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videos subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Templates folder" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Templates subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "User cache folder" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "User cache subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "User configuration folder" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "User configuration subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "User data folder" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "User data subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "User runtime folder" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "User runtime subfolder %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Filesystem access to %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Getting flatpak metadata for %s…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Failed to refine add-on ‘%s’: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "User Installation" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "System Installation" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "App ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Failed to add to install for add-on ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Failed to add to uninstall for add-on ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "System power is too low to perform the update" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "System power is too low to perform the update (%u%%, requires %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Device is unreachable, or out of wireless range" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Device battery power is too low" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Device battery power is too low (%u%%, requires %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Device is waiting for the update to be applied" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Device requires AC power to be connected" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Device cannot be used while the lid is closed" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s Device Update" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s System Update" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s Embedded Controller Update" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME Update" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s Corporate ME Update" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s Consumer ME Update" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s Controller Update" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt Controller Update" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU Microcode Update" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s Configuration Update" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s Battery Update" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s Camera Update" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM Update" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s Touchpad Update" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s Mouse Update" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s Keyboard Update" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s Storage Controller Update" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s Network Interface Update" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s Display Update" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC Update" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB Receiver Update" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s Drive Update" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s Flash Drive Update" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD Update" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU Update" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s Dock Update" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB Dock Update" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Firmware update could not be applied: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Firmware Upgrade Support" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Provides support for firmware upgrades" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Install Unsigned Software?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Download Unsigned Software?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Update Unsigned Software?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Failed to install updates: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Packages" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Failed to wait on transaction end before download: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Failed to download updates: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Failed to trigger update: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Operating System (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap Support" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "A snap is a universal Linux package" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "System" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "System component" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Removing sysupdate job '%s' failed with status %i" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Was this review useful to you?" + +#~ msgid "Yes" +#~ msgstr "Yes" + +#~ msgid "No" +#~ msgstr "No" + +#~| msgid "Settings" +#~ msgid "_app settings" +#~ msgstr "_app settings" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "A nice way to manage the software on your system." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Please enter a number from 1 to %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Choose an app:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s is now installed" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "An app has been removed" +#~ msgstr[1] "Apps have been removed" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Unable to find “%s”" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Downloading Software Catalogue" + +#~ msgid "Moderate page" +#~ msgstr "Moderate page" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "There are no reviews to moderate" + +#~ msgid "Meh" +#~ msgstr "Meh" + +#~ msgid "Outdated SDK version" +#~ msgstr "Outdated SDK version" + +#~ msgid "Unable to install updates" +#~ msgstr "Unable to install updates" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Unable to uninstall: authentication invalid" + +#~ msgid "Network Settings" +#~ msgstr "Network Settings" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Operating System Updates Unavailable" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "An important operating system update failed to be installed." + +#~ msgid "No Network" +#~ msgstr "No Network" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Internet access is required to check for updates." + +#~ msgid "Network _Settings" +#~ msgstr "Network _Settings" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Software upgrades have been downloaded and are ready to be installed." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Software updates have been downloaded and are ready to be installed." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Downloading upgrade information…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automatic Updates Paused" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." + +#~ msgid "Open Network _Settings" +#~ msgstr "Open Network _Settings" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Downloads and installs software updates in the background, when possible" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Show Only _Free Apps" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "Show only freely licensed apps and hide any proprietary apps" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Unable to download updates: not enough disk space" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Unable to download updates: authentication was required" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Unable to download updates: authentication was invalid" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Unable to install %s: you do not have permission to install software" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Unable to install %s: The battery level is too low" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Unable to install updates: not enough disk space" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Unable to install updates: authentication was required" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Unable to install updates: authentication was invalid" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "Unable to update %s: you do not have permission to update software" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Unable to install updates: you do not have permission to update software" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Unable to install updates: AC power is required" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Unable to update %s: The battery level is too low" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Unable to install updates: The battery level is too low" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Unable to upgrade to %s: you do not have permission to upgrade" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Unable to upgrade to %s: The battery level is too low" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Unable to remove %s: authentication was required" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Unable to remove %s: authentication was invalid" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Unable to remove %s: you do not have permission to remove software" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Unable to remove %s: AC power is required" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Unable to remove %s: The battery level is too low" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Unable to remove %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Failed to install file: not supported" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Failed to install: not supported" + +#~ msgid "AC power is required" +#~ msgstr "AC power is required" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Metered network ‒ automatic updates paused" + +#~ msgid "Find Out _More" +#~ msgstr "Find Out _More" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "An important software update is ready to be installed." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Important: Critical software updates are waiting." + +#~ msgid "Show verbose debugging information" +#~ msgstr "Show verbose debugging information" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Can access arbitrary files" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Are you sure you want to uninstall %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s will be uninstalled, and you will have to install it to use it again." + +#~ msgid "Downloading featured images…" +#~ msgstr "Downloading featured images…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "The last timestamp when the system was online and got any updates" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "This software is not available in your language and will appear in US " +#~ "English." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Selected add-ons will be installed with the application." + +#~ msgid "Applications" +#~ msgstr "Applications" + +#~ msgid "_Continue" +#~ msgstr "_Continue" + +#~ msgid "Post Review" +#~ msgstr "Post Review" + +#~ msgid "_Post" +#~ msgstr "_Post" + +#~ msgid "Rating" +#~ msgstr "Rating" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Review" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "What do you think of the app? Try to give reasons for your views." + +#~ msgid "No screenshot provided" +#~ msgstr "No screenshot provided" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Restart Now" + +#~ msgid "Primary Menu" +#~ msgstr "Primary Menu" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Updates" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s is no longer supported." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "This means that it does not receive security updates." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "It is recommended that you upgrade to a more recent version." + +#~ msgid "Update All" +#~ msgstr "Update All" + +#~ msgid "Application Updates" +#~ msgstr "Application Updates" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Application manager for GNOME" + +#~ msgid "A list of popular applications" +#~ msgstr "A list of popular applications" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "A list of applications to use, overriding the system defined ones." + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Software catalogue is being downloaded" + +#~ msgid "Name" +#~ msgstr "Name" + +#~ msgid "user" +#~ msgstr "user" + +#~ msgid "Channel" +#~ msgstr "Channel" + +#~ msgid "Branch" +#~ msgstr "Branch" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Installation" + +#~ msgid "Version" +#~ msgstr "Version" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "No updates have been installed on this system." + +#~ msgid "Checking…" +#~ msgstr "Checking…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "The URI that references the background for an upgrade banner." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." + +#~ msgid "Software has unknown permissions" +#~ msgstr "Software has unknown permissions" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Software comes from a trusted source" + +#~ msgid "Loading…" +#~ msgstr "Loading…" + +#~ msgid "_Add shortcut" +#~ msgstr "_Add shortcut" + +#~ msgid "Re_move shortcut" +#~ msgstr "Re_move shortcut" + +#~ msgid "Welcome" +#~ msgstr "Welcome" + +#~ msgid "Welcome to Software" +#~ msgstr "Welcome to Software" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." + +#~ msgid "_Browse Software" +#~ msgstr "_Browse Software" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Downloading application ratings…" + +#~ msgid "Unknown Permissions" +#~ msgstr "Unknown Permissions" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "The permissions needed by this app aren’t known" + +#~ msgid "App comes from a trusted source" +#~ msgstr "App comes from a trusted source" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Your distribution has verified that this app can be trusted" + +#~ msgid "OS Updates" +#~ msgstr "OS Updates" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Includes performance, stability and security improvements." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Downloading firmware update signature…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Downloading firmware update metadata…" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Show the prompt to install nonfree software repositories" + +#~ msgid "Requires a specific screen size" +#~ msgstr "Requires a specific screen size" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "Not optimised for touch devices or phones" + +#~ msgid "Editor’s Picks" +#~ msgstr "Editor’s Picks" + +#~ msgid "Recently Updated" +#~ msgstr "Recently Updated" + +#~ msgid "_Read More" +#~ msgstr "_Read More" + +#~ msgid "_Read Less" +#~ msgstr "_Read Less" + +#~ msgid "_Launch" +#~ msgstr "_Launch" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Never" + +#~ msgid "Localized in your Language" +#~ msgstr "Localised in your Language" + +#~ msgid "Release Activity" +#~ msgstr "Release Activity" + +#~ msgid "Developer" +#~ msgstr "Developer" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Uninstalled" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Installed" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Updated" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Unknown" + +#~ msgid "History" +#~ msgstr "History" + +#~ msgid "More…" +#~ msgstr "More…" + +#~ msgid "Recommended Games" +#~ msgstr "Recommended Games" + +#~ msgid "Recommended Creation Applications" +#~ msgstr "Recommended Creative Applications" + +#~ msgid "Recommended Work Applications" +#~ msgstr "Recommended Work Applications" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." + +#~ msgid "Find out more…" +#~ msgstr "Find out more…" + +#~ msgid "Recent Releases" +#~ msgstr "Recent Releases" + +#~ msgid "Remove “%s”?" +#~ msgstr "Remove “%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Disable “%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "No Additional Repositories" + +#~ msgid "_Remove…" +#~ msgstr "_Remove…" + +#~ msgid "_Disable…" +#~ msgstr "_Disable…" + +#~ msgid "Disabling" +#~ msgstr "Disabling" + +#~ msgid "Enabled" +#~ msgstr "Enabled" + +#~ msgid "Disabled" +#~ msgstr "Disabled" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (needs attention)" + +#~ msgid "_Remove All" +#~ msgstr "_Remove All" + +#~ msgid "Setting Up Updates…" +#~ msgstr "Setting Up Updates…" + +#~ msgid "Looking for New Updates…" +#~ msgstr "Looking for New Updates…" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Updates will be applied when the computer is restarted." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Waiting to Download %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Downloading %s %s" + +#~ msgid "Select All" +#~ msgstr "Select All" + +#~ msgid "Select None" +#~ msgstr "Select None" + +#~ msgid "Featured %s" +#~ msgstr "Featured %s" + +#~ msgid "Show" +#~ msgstr "Show" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Subcategories filter menu" + +#~ msgid "Sort" +#~ msgstr "Sort" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Subcategories sorting menu" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgid "Audio & Video" +#~ msgstr "Audio & Video" + +#~ msgid "Developer Tools" +#~ msgstr "Developer Tools" + +#~ msgid "Education & Science" +#~ msgstr "Education & Science" + +#~ msgid "Games" +#~ msgstr "Games" + +#~ msgid "Graphics & Photography" +#~ msgstr "Graphics & Photography" + +#~ msgid "Productivity" +#~ msgstr "Productivity" + +#~ msgid "Communication & News" +#~ msgstr "Communication & News" + +#~ msgid "Utilities" +#~ msgstr "Utilities" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Low" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Medium" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "High" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Unknown" + +#~ msgid "Public domain" +#~ msgstr "Public domain" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Users are bound by the following licence:" +#~ msgstr[1] "Users are bound by the following licences:" + +#~ msgid "Sandboxed" +#~ msgstr "Sandboxed" + +#~ msgid "Category" +#~ msgstr "Category" + +#~ msgid "Free" +#~ msgstr "Free" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Unknown" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." + +#~ msgid "Proprietary Software" +#~ msgstr "Proprietary Software" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "The licence terms of this software are unknown." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "The application was rated this way because it features:" + +#~ msgid "No details were available for this rating." +#~ msgstr "No details were available for this rating." + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Recommended Audio & Video Applications" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Recommended Productivity Applications" + +#~ msgid "ratings in total" +#~ msgstr "ratings in total" + +#~ msgid "Software is up to date" +#~ msgstr "Software is up to date" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS is a service providing user reviews of applications" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Enable GNOME Shell extensions repository" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Cartoon characters in unsafe situations" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Cartoon characters in aggressive conflict" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Graphic violence involving cartoon characters" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Characters in unsafe situations easily distinguishable from reality" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Characters in aggressive conflict easily distinguishable from reality" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Graphic violence easily distinguishable from reality" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Mildly realistic characters in unsafe situations" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Depictions of realistic characters in aggressive conflict" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Graphic violence involving realistic characters" + +#~ msgid "No bloodshed" +#~ msgstr "No bloodshed" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Unrealistic bloodshed" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Realistic bloodshed" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Depictions of bloodshed and the mutilation of body parts" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Rape or other violent sexual behaviour" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "References to alcoholic beverages" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Use of alcoholic beverages" + +#~ msgid "References to illicit drugs" +#~ msgstr "References to illicit drugs" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Use of illicit drugs" + +#~ msgid "References to tobacco products" +#~ msgstr "References to tobacco products" + +#~ msgid "Use of tobacco products" +#~ msgstr "Use of tobacco products" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Brief artistic nudity" + +#~ msgid "Prolonged nudity" +#~ msgstr "Prolonged nudity" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provocative references or depictions" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Sexual references or depictions" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Graphic sexual behaviour" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Mild or infrequent use of profanity" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Moderate use of profanity" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Strong or frequent use of profanity" + +#~ msgid "Slapstick humor" +#~ msgstr "Slapstick humour" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgar or bathroom humour" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Mature or sexual humour" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativity towards a specific group of people" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Discrimination designed to cause emotional harm" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Explicit discrimination based on gender, sexuality, race or religion" + +#~ msgid "Product placement" +#~ msgstr "Product placement" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Explicit references to specific brands or trademarked products" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Users are encouraged to purchase specific real-world items" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Gambling on random events using tokens or credits" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Gambling using “play” money" + +#~ msgid "Gambling using real money" +#~ msgstr "Gambling using real money" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Users are encouraged to donate real money" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Ability to spend real money in-app" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "User-to-user interactions without chat functionality" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Moderated chat functionality between users" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Uncontrolled audio or video chat functionality between users" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Sharing social network usernames or e-mail addresses" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Checking for the latest application version" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "Sharing diagnostic data that does not let others identify the user" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Sharing information that lets others identify the user" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Sharing physical location with other users" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Indirect references to homosexuality" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Kissing between people of the same gender" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Graphic sexual behavior between people of the same gender" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Indirect references to prostitution" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Direct references to prostitution" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Graphic depictions of the act of prostitution" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Indirect references to adultery" + +#~ msgid "Direct references to adultery" +#~ msgstr "Direct references to adultery" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Graphic depictions of the act of adultery" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Scantily clad human characters" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Overtly sexualised human characters" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Depictions of or references to historical desecration" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Depictions of modern-day human desecration" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Graphic depictions of modern-day desecration" + +#~ msgid "Visible dead human remains" +#~ msgstr "Visible dead human remains" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Dead human remains that are exposed to the elements" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Graphic depictions of desecration of human bodies" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Depictions of or references to historical slavery" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Depictions of modern-day slavery" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Graphic depictions of modern-day slavery" + +#~ msgid "General" +#~ msgstr "General" + +#~ msgid "ALL" +#~ msgstr "ALL" + +#~ msgid "Teen" +#~ msgstr "Teen" + +#~ msgid "Everyone 10+" +#~ msgstr "Everyone 10+" + +#~ msgid "Everyone" +#~ msgstr "Everyone" + +#~ msgid "Early Childhood" +#~ msgstr "Early Childhood" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Unknown" + +#~ msgid "this website" +#~ msgstr "this website" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Let’s Go Shopping" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Removed" + +#~ msgid "Format" +#~ msgstr "Format" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Are you sure you want to remove %s?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "This application needs to be restarted to use new plug-ins." + +#~ msgid "Security Updates Pending" +#~ msgstr "Security Updates Pending" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "It is recommended that you install important updates now" + +#~ msgid "Restart & Install" +#~ msgstr "Restart & Install" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "Important OS and application updates are ready to be installed" + +#~ msgid "View" +#~ msgstr "View" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Yesterday, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Three days ago" + +#~ msgid "Four days ago" +#~ msgstr "Four days ago" + +#~ msgid "Five days ago" +#~ msgstr "Five days ago" + +#~ msgid "Six days ago" +#~ msgstr "Six days ago" + +#~ msgid "Two weeks ago" +#~ msgstr "Two weeks ago" + +#~ msgid "About %s" +#~ msgstr "About %s" + +#~ msgid "%s ME" +#~ msgstr "%s ME" + +#~ msgid "Show the folder management UI" +#~ msgstr "Show the folder management UI" + +#~ msgid "Folder Name" +#~ msgstr "Folder Name" + +#~ msgid "_Add" +#~ msgstr "_Add" + +#~ msgid "Add to Application Folder" +#~ msgstr "Add to Application Folder" + +#~ msgid "Top Rated" +#~ msgstr "Top Rated" + +#~ msgid "Extension Settings" +#~ msgstr "Extension Settings" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." + +#~| msgid "Failed to load image" +#~ msgid "Failed to load components" +#~ msgstr "Failed to load components" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS validated OK!" + +#~ msgid "Failed to load file" +#~ msgstr "Failed to load file" + +#~ msgid "Unsaved changes" +#~ msgstr "Unsaved changes" + +#~ msgid "The application list is already loaded." +#~ msgstr "The application list is already loaded." + +#~ msgid "Merge documents" +#~ msgstr "Merge documents" + +#~ msgid "Throw away changes" +#~ msgstr "Throw away changes" + +#~ msgid "Open AppStream File" +#~ msgstr "Open AppStream File" + +#~| msgid "Open AppStream File" +#~ msgid "Save AppStream File" +#~ msgstr "Save AppStream Files" + +#~ msgid "_Save" +#~ msgstr "_Save" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s banner design deleted." + +#~ msgid "Banner design deleted." +#~ msgstr "Banner design deleted." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "The application list has unsaved changes." + +#~ msgid "Use verbose logging" +#~ msgstr "Use verbose logging" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME Software Banner Designer" + +#~ msgid "No Designs" +#~ msgstr "No Designs" + +#~ msgid "Error message here" +#~ msgstr "Error message here" + +#~ msgid "Category Featured" +#~ msgstr "Category Featured" + +#~ msgid "Undo" +#~ msgstr "Undo" + +#~ msgid "Banner Designer" +#~ msgstr "Banner Designer" + +#~ msgid "New Banner" +#~ msgstr "New Banner" + +#~ msgid "Import from file" +#~ msgstr "Import from file" + +#~ msgid "Export to file" +#~ msgstr "Export to file" + +#~ msgid "Spacing" +#~ msgstr "Spacing" + +#~ msgid "The amount of space between children" +#~ msgstr "The amount of space between children" + +#~ msgid "Click on items to select them" +#~ msgstr "Click on items to select them" + +#~ msgid "Select" +#~ msgstr "Select" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Add to Folder…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Move to Folder…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Remove from Folder" + +#~ msgid "Featured Applications" +#~ msgstr "Featured Applications" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Design the featured banners for GNOME Software" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell Extensions" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "GNOME Shell Extensions Repository" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Downloading shell extension metadata…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell Extension" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_All" + +#~| msgid "Sign in to %s…" +#~ msgid "Sign In / Register…" +#~ msgstr "Sign In / Register…" + +#~ msgid "Continue" +#~ msgstr "Continue" + +#~ msgid "Use" +#~ msgstr "Use" + +#~| msgid "_Add to Folder…" +#~ msgid "Add another…" +#~ msgstr "_Add another…" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s will be installed, and you will be charged %s." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~| msgid "Signed in into %s as %s" +#~ msgid "Signed in as %s" +#~ msgstr "Signed in as %s" + +#~| msgid "Sign in to %s…" +#~ msgid "Sign in…" +#~ msgstr "Sign in…" + +#~| msgid "Sign out from %s" +#~ msgid "Sign out" +#~ msgstr "Sign out" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Unable to purchase %s: authentication was required" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Unable to purchase %s: authentication was invalid" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Unable to purchase %s: no payment method setup" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Unable to purchase %s: payment was declined" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~| msgid "To continue you need to sign in." +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "To continue, you need to use an Ubuntu One account." + +#~| msgid "To continue you need to sign in." +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "To continue, you need to use your Ubuntu One account." + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "To continue you need to sign in to %s." + +#~ msgid "Email address" +#~ msgstr "E-mail address" + +#~ msgid "I have an account already" +#~ msgstr "I have an account already" + +#~ msgid "I want to register for an account now" +#~ msgstr "I want to register for an account now" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Sign in automatically next time" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Enter your one-time pin for two-factor authentication." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Authenticate" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Software catalogue is being loaded" + +#~ msgid "_About" +#~ msgstr "_About" + +#~ msgid "_Quit" +#~ msgstr "_Quit" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Your %s account has been suspended." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "" +#~ "It is not possible to install software until this has been resolved." + +#~ msgid "For more information, visit %s." +#~ msgstr "For more information, visit %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Unable to update %s from %s" + +#~ msgid "Downloading application page…" +#~ msgstr "Downloading application page…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "The ultimate entertainment platform from Valve" + +#~ msgid "Downloading new updates…" +#~ msgstr "Downloading new updates…" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Show profiling information for the service" + +#~ msgid "Restart & _Install" +#~ msgstr "Restart & _Install" + +#~ msgid "Getting runtime source…" +#~ msgstr "Getting runtime source…" + +#~ msgid "Limba Support" +#~ msgstr "Limba Support" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "Limba provides developers a way to easily create software bundles" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "The list of extra sources that have been previously enabled" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Show non-free software in search results" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "A list of non-free sources that can be optionally enabled" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Player-to-player preset interactions without chat functionality" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Enable Proprietary Software Source?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "No applications or addons installed; other software might still be" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Typically has restrictions on use and access to source code." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Proprietary Software Sources" + +#~ msgid "Remove Source" +#~ msgstr "Remove Source" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." + +#~ msgid "No software installed from this source" +#~ msgstr "No software installed from this source" + +#~ msgid "Installed from this Source" +#~ msgstr "Installed from this Source" + +#~ msgid "Last Checked" +#~ msgstr "Last Checked" + +#~ msgid "Added" +#~ msgstr "Added" + +#~ msgid "Website" +#~ msgstr "website" + +#~ msgid "Total" +#~ msgstr "Total" + +#~ msgid "Could not find '%s'" +#~ msgstr "Could not find '%s'" + +#~ msgid "Installation of %s failed." +#~ msgstr "Installation of %s failed." + +#~ msgid "Removal of %s failed." +#~ msgstr "Removal of %s failed." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Please make sure that you have internet access and try again." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Please free up some space and try again." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "If the problem persists, contact your software provider." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomy" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Chemistry" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Mathematics" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Featured" + +#~ msgid "Science" +#~ msgstr "Science" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Software sources give you access to additional software." + +#~ msgid "Picks" +#~ msgstr "Picks" + +#~ msgid "_History" +#~ msgstr "_History" + +#~ msgid "Done" +#~ msgstr "Done" + +#~ msgid "Audio" +#~ msgstr "Audio" + +#~ msgid "Databases" +#~ msgstr "Databases" + +#~ msgid "Disc Burning" +#~ msgstr "Disc Burning" + +#~ msgid "Ham Radio" +#~ msgstr "Ham Radio" + +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgid "Mixer" +#~ msgstr "Mixer" + +#~ msgid "Music" +#~ msgstr "Music" + +#~ msgid "Recorders" +#~ msgstr "Recorders" + +#~ msgid "Sequencers" +#~ msgstr "Sequencers" + +#~ msgid "Tuners" +#~ msgstr "Tuners" + +#~ msgid "Building" +#~ msgstr "Building" + +#~ msgid "Profiling" +#~ msgstr "Profiling" + +#~ msgid "Biology" +#~ msgstr "Biology" + +#~ msgid "Computer Science" +#~ msgstr "Computer Science" + +#~ msgid "Data Visualization" +#~ msgstr "Data Visualisation" + +#~ msgid "Economy" +#~ msgstr "Economy" + +#~ msgid "Electricity" +#~ msgstr "Electricity" + +#~ msgid "Electronics" +#~ msgstr "Electronics" + +#~ msgid "Engineering" +#~ msgstr "Engineering" + +#~ msgid "Geology" +#~ msgstr "Geology" + +#~ msgid "Geoscience" +#~ msgstr "Geoscience" + +#~ msgid "Image Processing" +#~ msgstr "Image Processing" + +#~ msgid "Literature" +#~ msgstr "Literature" + +#~ msgid "Maps" +#~ msgstr "Maps" + +#~ msgid "Numerical Analysis" +#~ msgstr "Numerical Analysis" + +#~ msgid "Parallel Computing" +#~ msgstr "Parallel Computing" + +#~ msgid "Physics" +#~ msgstr "Physics" + +#~ msgid "Spirituality" +#~ msgstr "Spirituality" + +#~ msgid "Shooter" +#~ msgstr "Shooter" + +#~ msgid "Simulation" +#~ msgstr "Simulation" + +#~ msgid "Graphics" +#~ msgstr "Graphics" + +#~ msgid "2D Graphics" +#~ msgstr "2D Graphics" + +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgid "Raster Graphics" +#~ msgstr "Raster Graphics" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgid "Dialup" +#~ msgstr "Dialup" + +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgid "Feed" +#~ msgstr "Feed" + +#~ msgid "File Transfer" +#~ msgstr "File Transfer" + +#~ msgid "Instant Messaging" +#~ msgstr "Instant Messaging" + +#~ msgid "IRC Clients" +#~ msgstr "IRC Clients" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgid "Telephony" +#~ msgstr "Telephony" + +#~ msgid "Office" +#~ msgstr "Office" + +#~ msgid "Chart" +#~ msgstr "Chart" + +#~ msgid "Contact Management" +#~ msgstr "Contact Management" + +#~ msgid "Dictionary" +#~ msgstr "Dictionary" + +#~ msgid "Flow Chart" +#~ msgstr "Flow Chart" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Spreadsheet" +#~ msgstr "Spreadsheet" + +#~ msgid "Accessibility" +#~ msgstr "Accessibility" + +#~ msgid "Printing" +#~ msgstr "Printing" + +#~ msgid "Security" +#~ msgstr "Security" + +#~ msgid "Emulator" +#~ msgstr "Emulator" + +#~ msgid "File Manager" +#~ msgstr "File Manager" + +#~ msgid "File Tools" +#~ msgstr "File Tools" + +#~ msgid "Terminal Emulator" +#~ msgstr "Terminal Emulator" + +#~ msgid "Archiving" +#~ msgstr "Archiving" + +#~ msgid "Calculator" +#~ msgstr "Calculator" + +#~ msgid "Clock" +#~ msgstr "Clock" + +#~ msgid "Compression" +#~ msgstr "Compression" + +#~ msgid "Telephony Tools" +#~ msgstr "Telephony Tools" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgid "TV" +#~ msgstr "TV" diff --git a/po/eo.po b/po/eo.po new file mode 100644 index 0000000..24a95f4 --- /dev/null +++ b/po/eo.po @@ -0,0 +1,6152 @@ +# Esperanto translation for gnome-software. +# Copyright (C) 2014 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-software package. +# Daniel PUENTES , 2015. +# Axel ROUSSEAU , 2016. +# Carmen Bianca BAKKER , 2018. +# Tirifto , 2019. +# Kristjan SCHMIDT , 2014-2023. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2023-09-18 15:37+0000\n" +"PO-Revision-Date: 2023-09-19 21:17+0200\n" +"Last-Translator: Kristjan SCHMIDT \n" +"Language-Team: Esperanto \n" +"Language: eo\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.2.2\n" +"X-DamnedLies-Scope: partial\n" +"X-Project-Style: gnome\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:21 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programaro" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instali kaj ĝisdatigi aplikaĵojn" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +#, fuzzy +#| msgid "" +#| "Software allows you to find and install new applications and system " +#| "extensions and remove existing installed applications." +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Programaro permesas trovi kaj instali novajn aplikaĵojn kaj sistemajn " +"etendaĵojn, kaj forigi ekzistantajn instalitajn aplikaĵojn." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Programaro montras elstarajn kaj popularajn programojn kun utilaj priskriboj " +"kaj pluraj ekrankopioj per aplikaĵo. Aplikaĵoj troveblas aŭ per foliumado de " +"la listo de kategorioj aŭ serĉante. Ĝi ankaŭ permesas al vi ĝisdatigi vian " +"sistemon per eksterreta ĝisdatigo." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Superrigarda panelo" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panelo de detaloj" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panelo de instalitaj aplikaĵoj" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panelo de ĝisdatigoj" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "La detaloj de la ĝisdatigo" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2378 +#: src/gs-application.c:264 +msgid "The GNOME Project" +msgstr "La GNOME-projekto" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instali appstream-dosieron en sisteman lokon" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instalante appstream-dosieron en sisteman lokon" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Listo de kongruaj projektoj" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Ĉi tio estas listo de kongruaj projektoj, kiujn ni devus montri kiel GNOME, " +"KDE kaj XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Ĉu administri ĝisdatigojn kaj altgradigojn en GNOME-Programaro" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Se malŝaltita, GNOME-Programaro kaŝos la ĝisdatigojn, ne faros ajnajn " +"aŭtomatajn ĝisdatigojn aŭ petos por ĝisdatigoj." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Aŭtomate elŝuti kaj instali ĝisdatigojn" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Kiam ŝaltita, GNOME-Programaro aŭtomate elŝutas ĝisdatigojn fone, kaj " +"instalas tiujn, kiuj ne postulas restartigon." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Averti la uzanton kiam programaro ĝisdatiĝas fone" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Kiam ŝaltita, GNOME-Programaro sciigas la uzanton pri ĝisdatigoj, kiujn ĝi " +"faris dum ĝia foresto." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Ĉu aŭtomate aktualigi kiam uzante limigan konekton" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Kiam ŝaltita, GNOME-Programaro aŭtomate fone retumas eĉ kun pagenda konekto " +"(kaj eventuale povas elŝuti metadatumojn, kontroli ĝisdatikojn, ktp., kio " +"povas venigi ekstrajn kostojn al la uzanto)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Ĉu okazas la tute unua rulado de GNOME-Programaro" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Montri steltaksojn apud aplikaĵoj" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Malliberaj aplikaĵoj montras averton antaŭ instalo" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Kiam malliberaj aplikaĵoj estas instalotaj, averto povas aperi. Ĉi tio " +"decidas, ĉu la averto estu fortenata." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "La lasta ĝisdatig-kontrola tempindiko" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "La lasta ĝisdatiga sciiga tempindiko" + +#: data/org.gnome.software.gschema.xml:55 +#, fuzzy +#| msgid "The last upgrade notification timestamp" +msgid "The last update notification timestamp" +msgstr "La lasta ĝisdatiga sciiga tempindiko" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "La tempindiko de la unua sekureca ĝisdatigo, forigita post ĝisdatigo" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "La lasta ĝisdatiga tempindiko" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"La aĝo, sekunde, por kontroli, ke la deveneja ekrankopio ankoraŭ validas" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Servilo uzota por recenzoj de aplikaĵoj" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Listo de oficialaj deponejoj, ne rigardotaj kiel eksteraj liverantoj" + +#: data/org.gnome.software.gschema.xml:90 +#, fuzzy +#| msgid "" +#| "A list of official repositories that should not be considered 3rd party" +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Listo de oficialaj deponejoj, ne rigardotaj kiel eksteraj liverantoj" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Listo de oficialaj deponejoj, rigardotaj kiel programare liberaj" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "La URL de permesilo, uzota kiam aplikaĵo estos rigardata kiel libera" + +#: data/org.gnome.software.gschema.xml:102 +#, fuzzy +#| msgid "A list of applications to use, overriding the system defined ones." +msgid "Install bundled applications for all users on the system where possible" +msgstr "Listo de uzotaj aplikaĵoj, transpasantaj tiujn difinitajn sisteme." + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Permesi aliron al la programaraj deponejoj dialogo" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Prezenti altgradigojn al antaŭeldonoj" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Montri iujn fasadajn elementojn, informantajn la uzanton, ke aplikaĵo estas " +"mallibera" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://eo.wikipedia.org/wiki/Mallibera_programaro'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "La URI, kiu komprenigas malliberan programaron" + +#: data/org.gnome.software.gschema.xml:127 +#, fuzzy +#| msgid "" +#| "A list of URLs pointing to appstream files that will be downloaded into " +#| "an app-info folder" +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Listo de URL-oj, montrantaj al appstream-dosieroj, kiuj elŝutiĝos al " +"dosierujo de app-info" + +#: data/org.gnome.software.gschema.xml:131 +#, fuzzy +#| msgid "Install the AppStream files to a system-wide location for all users" +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "Install appstream-dosieron en sisteman lokon por ĉiuj uzantoj" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +#, fuzzy +#| msgid "This means that it does not receive security updates." +msgid "The timestamp of the last received historical updates." +msgstr "Ĉi tiu signifas, ke vi ni ricevos sekurecajn ĝisdatigojn." + +#: data/org.gnome.software.gschema.xml:154 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Ĉeno konservanta la identigilon de gnome-online-account, uzatan por saluto" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Programara AppStream sistema instalilo" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Malsukcesis interpreti komandliniajn argumentojn" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Vi devas specifi precize unu dosiernomon" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Nur la uzanto \"root\" rajtas uzi ĉi tiun programon" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, fuzzy, c-format +#| msgid "Failed to validate content type" +msgid "Failed to validate content type: %s" +msgstr "Malsukcesis validigi enhavespecon" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, fuzzy, c-format +#| msgid "Unable to remove %s" +msgid "Failed to move: %s" +msgstr "Ne eblas forigi %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalado de programaro" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instali elektitan programaron en la sistemon" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +#, fuzzy +#| msgid "No cartoon violence" +msgid "Cartoon Violence" +msgstr "Neniu kartuna perforto" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +#, fuzzy +#| msgid "No cartoon violence" +msgid "No information regarding cartoon violence" +msgstr "Neniu kartuna perforto" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantazia perforto" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +#, fuzzy +#| msgid "No fantasy violence" +msgid "No information regarding fantasy violence" +msgstr "Neniu fantazia perforto" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Vivovera perforto" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +#, fuzzy +#| msgid "No realistic violence" +msgid "No information regarding realistic violence" +msgstr "Neniu vivovera perforto" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Seksperforto" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +#, fuzzy +#| msgid "No sexual violence" +msgid "No information regarding sexual violence" +msgstr "Neniu seksperforto" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkoholo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +#, fuzzy +#| msgid "No references to alcohol" +msgid "No information regarding references to alcohol" +msgstr "Neniu priparolado de alkoholo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +#, fuzzy +#| msgid "No references to illicit drugs" +msgid "No information regarding references to illicit drugs" +msgstr "Neniu priparolado de malpermesitaj drogoj" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabako" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +#, fuzzy +#| msgid "No references to tobacco products" +msgid "No information regarding references to tobacco products" +msgstr "Neniu priparolado de tabakaĵoj" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nudeco" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +#, fuzzy +#| msgid "No nudity of any sort" +msgid "No information regarding nudity of any sort" +msgstr "Neniu nudeco" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +#, fuzzy +#| msgid "No references to or depictions of sexual nature" +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Neniu priparolado aŭ figurado seksa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +#, fuzzy +#| msgid "No profanity of any kind" +msgid "No information regarding profanity of any kind" +msgstr "Neniu sakro" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +#, fuzzy +#| msgid "No inappropriate humor" +msgid "Inappropriate Humor" +msgstr "Neniu nedeca humuro" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +#, fuzzy +#| msgid "No inappropriate humor" +msgid "No information regarding inappropriate humor" +msgstr "Neniu nedeca humuro" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminacio" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +#, fuzzy +#| msgid "No discriminatory language of any kind" +msgid "No information regarding discriminatory language of any kind" +msgstr "Neniu diskriminacia lingvo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +#, fuzzy +#| msgid "No advertising of any kind" +msgid "No information regarding advertising of any kind" +msgstr "Neniu reklamo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +#, fuzzy +#| msgid "Enabling" +msgid "Gambling" +msgstr "Ŝaltante" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +#, fuzzy +#| msgid "No gambling of any kind" +msgid "No information regarding gambling of any kind" +msgstr "Neniu vetludado" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +#, fuzzy +#| msgid "Purchase" +msgid "Purchasing" +msgstr "Aĉeti" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +#, fuzzy +#| msgid "No ability to spend money" +msgid "No information regarding the ability to spend money" +msgstr "Neniu ebleco elspezi monon" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +#, fuzzy +#| msgid "No way to chat with other users" +msgid "No information regarding ways to chat with other users" +msgstr "Neniu maniero por babili kun aliaj uzantoj" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +#, fuzzy +#| msgid "No way to talk with other users" +msgid "No information regarding ways to talk with other users" +msgstr "Neniu maniero paroli kun aliaj uzantoj" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +#, fuzzy +#| msgid "Source Details" +msgid "Contact Details" +msgstr "Detaloj de fonto" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +#, fuzzy +#| msgid "No sharing of social network usernames or email addresses" +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "Neniu kunhavigado de sociaj retejaj uzantonomoj aŭ retpoŝtadresoj" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +#, fuzzy +#| msgid "More Information" +msgid "Identifying Information" +msgstr "Pli da informoj" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +#, fuzzy +#| msgid "No sharing of user information with third parties" +msgid "No information regarding sharing of user information with third parties" +msgstr "Neniu kunhavigado de uzanto-informoj kun eksteraj liverantoj" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +#, fuzzy +#| msgid "No sharing of physical location with other users" +msgid "No information regarding sharing of physical location with other users" +msgstr "Neniu kunhavigado de fizika loko kun aliaj uzantoj" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Samseksemo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +#, fuzzy +#| msgid "No references to homosexuality" +msgid "No information regarding references to homosexuality" +msgstr "Neniu priparolado de samseksemeco" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +#, fuzzy +#| msgctxt "Menu subcategory of Education" +#| msgid "Construction" +msgid "Prostitution" +msgstr "Konstruado" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +#, fuzzy +#| msgid "No references to prostitution" +msgid "No information regarding references to prostitution" +msgstr "Neniu priparolado de prostituo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +#, fuzzy +#| msgid "Adults Only" +msgid "Adultery" +msgstr "Nur plenkreskuloj" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +#, fuzzy +#| msgid "No references to adultery" +msgid "No information regarding references to adultery" +msgstr "Neniu priparolado de adulto" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +#, fuzzy +#| msgid "No sexualized characters" +msgid "Sexualized Characters" +msgstr "Neniu seksigita rolulo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +#, fuzzy +#| msgid "No sexualized characters" +msgid "No information regarding sexualized characters" +msgstr "Neniu seksigita rolulo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +#, fuzzy +#| msgid "No references to desecration" +msgid "No information regarding references to desecration" +msgstr "Neniu priparolado de malsanktigo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +#, fuzzy +#| msgctxt "Menu subcategory of Education" +#| msgid "Humanities" +msgid "Human Remains" +msgstr "Homsciencoj" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +#, fuzzy +#| msgid "No visible dead human remains" +msgid "No information regarding visible dead human remains" +msgstr "Neniu videbla homa kadavro" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +#, fuzzy +#| msgid "No references to slavery" +msgid "No information regarding references to slavery" +msgstr "Neniu priparolado de sklaveco" + +#: src/gs-age-rating-context-dialog.c:494 +#, fuzzy +#| msgid "No references to illicit drugs" +msgid "Does not include references to drugs" +msgstr "Neniu priparolado de malpermesitaj drogoj" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:502 +#, fuzzy +#| msgid "Uncontrolled chat functionality between users" +msgid "Does not include uncontrolled chat functionality" +msgstr "Nekontrolata babilfunkcio inter uzantoj" + +#: src/gs-age-rating-context-dialog.c:504 +#, fuzzy +#| msgid "No realistic violence" +msgid "Does not include violence" +msgstr "Neniu vivovera perforto" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:539 +#, fuzzy +#| msgctxt "Menu of Education & Science" +#| msgid "Languages" +msgid "Strong Language" +msgstr "Lingvoj" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Mono" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Perforto" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Ĉiuj" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, fuzzy, c-format +#| msgid "%s file format" +msgid "%s is suitable for adults" +msgstr "%s dosierformo" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:5 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Aĝa takso" + +#: src/gs-age-rating-context-dialog.ui:68 +#: src/gs-hardware-support-context-dialog.ui:71 +#: src/gs-safety-context-dialog.ui:221 +#, fuzzy +#| msgid "Show verbose debugging information" +msgid "How to contribute missing information" +msgstr "Montri babilemajn sencimigajn informojn" + +#: lib/gs-app.c:6331 +msgid "Local file" +msgstr "Loka dosiero" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6350 src/gs-safety-context-dialog.c:500 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#: lib/gs-app.c:6427 +msgid "Package" +msgstr "Pako" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:455 +msgid "Pending" +msgstr "Atendante" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:459 src/gs-details-page.c:390 +#, fuzzy +#| msgid "Pending installation…" +msgid "Pending install" +msgstr "Atendante instaladon…" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:463 src/gs-details-page.c:397 +#, fuzzy +#| msgid "Pending" +msgid "Pending remove" +msgstr "Atendante" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:208 src/gs-details-page.c:383 +msgid "Installing" +msgstr "Instalante" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Forigante" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:303 src/gs-details-page.c:1028 +#: src/gs-details-page.c:1054 src/gs-details-page.ui:210 src/gs-page.c:437 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instali" + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-app-addon-row.ui:73 src/gs-page.c:660 +msgid "_Uninstall" +msgstr "_Malinstali" + +#: src/gs-app-details-page.c:73 +msgid "Network" +msgstr "Reto" + +#: src/gs-app-details-page.c:73 +msgid "Can communicate over the network" +msgstr "Povas komuniki perrete" + +#: src/gs-app-details-page.c:74 +msgid "System Services" +msgstr "Sistemaj servoj" + +#: src/gs-app-details-page.c:74 +msgid "Can access D-Bus services on the system bus" +msgstr "Povas atingi D-Bus-ajn servojn en la sistema buso" + +#: src/gs-app-details-page.c:75 +msgid "Session Services" +msgstr "Seancaj servoj" + +#: src/gs-app-details-page.c:75 +msgid "Can access D-Bus services on the session bus" +msgstr "Povas atingi D-Bus-ajn servojn en la seanca buso" + +#: src/gs-app-details-page.c:76 src/gs-app-details-page.c:77 +msgid "Devices" +msgstr "Aparatoj" + +#: src/gs-app-details-page.c:76 +msgid "Can access arbitrary devices such as webcams" +msgstr "" + +#: src/gs-app-details-page.c:77 +msgid "Can access system device files" +msgstr "Povas atingi sistemajn aparatajn dosierojn" + +#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:79 +msgid "Home folder" +msgstr "Hejmdosierujo" + +#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:80 +#: src/gs-app-details-page.c:83 src/gs-app-details-page.c:156 +msgid "Can view, edit and create files" +msgstr "Povas vidi, redakti kaj krei dosierojn" + +#: src/gs-app-details-page.c:79 src/gs-app-details-page.c:81 +#: src/gs-app-details-page.c:84 src/gs-app-details-page.c:151 +msgid "Can view files" +msgstr "Povas vidi dosierojn" + +#: src/gs-app-details-page.c:80 src/gs-app-details-page.c:81 +msgid "File system" +msgstr "Dosiersistemo" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:83 src/gs-app-details-page.c:84 +msgid "Downloads folder" +msgstr "Elŝut-dosierujo" + +#: src/gs-app-details-page.c:85 +msgid "Settings" +msgstr "Agordoj" + +#: src/gs-app-details-page.c:85 +msgid "Can view and change any settings" +msgstr "Povas vidi kaj ŝanĝi iun ajn agordon" + +#: src/gs-app-details-page.c:86 +msgid "Legacy display system" +msgstr "Malnova vidiga sistemo" + +#: src/gs-app-details-page.c:86 +msgid "Uses an old, insecure display system" +msgstr "Uzas malnovan, nesekuran vidigan sistemon" + +#: src/gs-app-details-page.c:87 +#, fuzzy +#| msgid "Sandboxed" +msgid "Sandbox escape" +msgstr "Sablujigita" + +#: src/gs-app-details-page.c:87 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:226 +msgid "No update description available." +msgstr "Neniu ĝisdatiga priskribo disponeblas." + +#. FIXME support app == NULL +#. set window title +#: src/gs-app-details-page.c:249 +#, fuzzy +#| msgid "The update details" +msgid "Update Details" +msgstr "La detaloj de la ĝisdatigo" + +#: src/gs-app-details-page.ui:25 src/gs-os-update-page.ui:25 +#: src/gs-shell.ui:349 src/gs-shell.ui:440 +msgid "Go back" +msgstr "Reen" + +#: src/gs-app-details-page.ui:47 src/gs-app-row.c:518 +msgid "Requires additional permissions" +msgstr "Necesas ekstraj permesoj" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1078 +msgid "Reviews" +msgstr "Recenzoj" + +#: src/gs-app-reviews-dialog.ui:25 +#, fuzzy +#| msgid "No details were available for this rating." +msgid "No reviews were found for this app." +msgstr "Neniuj detaloj disponeblis por ĉi tiu takso." + +#: src/gs-app-reviews-dialog.ui:27 +msgid "No Reviews" +msgstr "Neniuj recenzoj" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:530 +#, fuzzy +#| msgid "Version" +msgid "Version History" +msgstr "Versio" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versio %s" + +#: src/gs-app-version-history-row.c:144 +#, fuzzy +#| msgid "No details were available for this rating." +msgid "No details for this release" +msgstr "Neniuj detaloj disponeblis por ĉi tiu takso." + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:67 +msgid "%e %B %Y" +msgstr "%-e-a de %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Startiga reĝimo: ‘updates’ (ĝisdatigoj), ‘updated’ (ĝisdatigita), " +"‘installed’ (instalita) aŭ ‘overview’ (superrigardo)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "REĜIMO" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Serĉi aplikaĵojn" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SERĈI" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Montri detalojn de aplikaĵo (uzante aplikaĵan ID-on)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Montri detalojn de aplikaĵo (uzante paknomon)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PAKNOMO" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instali la aplikaĵon (uzante aplikaĵan ID-on)" + +#: src/gs-application.c:134 +#, fuzzy +#| msgid "Install the application (using application ID)" +msgid "Uninstall the application (using application ID)" +msgstr "Instali la aplikaĵon (uzante aplikaĵan ID-on)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Malfermi lokan pakodosieron" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "DOSIERNOMO" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"La speco de interago, kiun oni anticipas por ĉi tiu ago: ‘none’ (neniu), " +"‘notify’ (sciigi), aŭ ‘full’ (plena)" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instalas iun ajn okazontan ĝisdatigon fone" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Montri agordojn" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Ĉesigi la rulantan ekzemplon" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferi lokajn dosierajn fontojn ol AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Montri versionumeron" + +#: src/gs-application.c:271 src/gs-application.c:279 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Kopirajto © 2016–2023 GNOME-programar-kontribuantoj" + +#: src/gs-application.c:273 src/gs-application.c:282 +msgid "translator-credits" +msgstr "" +"Kristjan SCHMIDT\n" +"Daniel PUENTES\n" +"Axel ROUSSEAU\n" +"Carmen Bianca BAKKER \n" +"Tirifto " + +#. TRANSLATORS: this is the title of the about window +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-application.c:287 src/gs-shell.c:2155 +msgid "About Software" +msgstr "Pri Programaro" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:290 +msgid "A nice way to manage the software on your system." +msgstr "Bona maniero por administri la programaron sur via sistemo." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:531 +msgid "Sorry! There are no details for that application." +msgstr "Pardonon! Estas neniuj detaloj por ĉi tiu aplikaĵo." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Instala grando" + +#: src/gs-app-context-bar.c:165 +#, fuzzy, c-format +#| msgid "Includes %s, %s and %s." +msgid "Includes %s of data and %s of cache" +msgstr "Inkluzivante %s, %s kaj %s." + +#: src/gs-app-context-bar.c:168 +#, fuzzy, c-format +#| msgid "Includes %s, %s and %s." +msgid "Includes %s of data" +msgstr "Inkluzivante %s, %s kaj %s." + +#: src/gs-app-context-bar.c:171 +#, fuzzy, c-format +#| msgid "Includes %s, %s and %s." +msgid "Includes %s of cache" +msgstr "Inkluzivante %s, %s kaj %s." + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Elŝuta grando" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Grando ne estas konata" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:292 +msgid "No permissions" +msgstr "Neniuj permesoj" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:309 +msgid "Has network access" +msgstr "Havas retaliron" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:316 +#, fuzzy +#| msgid "System Services" +msgid "Uses system services" +msgstr "Sistemaj servoj" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:323 +#, fuzzy +#| msgid "Session Services" +msgid "Uses session services" +msgstr "Seancaj servoj" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:330 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access hardware devices" +msgstr "Povas atingi sistemajn aparatajn dosierojn" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:337 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access system devices" +msgstr "Povas atingi sistemajn aparatajn dosierojn" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:349 +msgid "Can read/write all your data" +msgstr "" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:361 +msgid "Can read all your data" +msgstr "" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:368 +msgid "Can read/write your downloads" +msgstr "" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:375 +msgid "Can read your downloads" +msgstr "" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:382 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access some specific files" +msgstr "Povas atingi sistemajn aparatajn dosierojn" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:389 src/gs-safety-context-dialog.c:254 +#, fuzzy +#| msgid "Can view and change any settings" +msgid "Can access and change user settings" +msgstr "Povas vidi kaj ŝanĝi iun ajn agordon" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:396 src/gs-safety-context-dialog.c:238 +#, fuzzy +#| msgid "Uses an old, insecure display system" +msgid "Uses a legacy windowing system" +msgstr "Uzas malnovan, nesekuran vidigan sistemon" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:403 src/gs-safety-context-dialog.c:246 +#, fuzzy +#| msgid "Requires additional permissions" +msgid "Can acquire arbitrary permissions" +msgstr "Necesas ekstraj permesoj" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:415 +#, fuzzy +#| msgid "Software Repository Identified" +msgid "Software developer is verified" +msgstr "Programara deponejo identigita" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:434 src/gs-safety-context-dialog.c:146 +msgid "Reviewed by OS distributor" +msgstr "" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:440 src/gs-safety-context-dialog.c:149 +#, fuzzy, c-format +#| msgid "Reviews" +msgid "Reviewed by %s" +msgstr "Recenzoj" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:163 +msgid "Provided by a third party" +msgstr "" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:466 +#, fuzzy +#| msgid "Your OS is no longer supported." +msgid "Software no longer supported" +msgstr "Via operaciumo ne plu estas subtenita." + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 +msgid "Auditable code" +msgstr "" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Unknown license" +msgstr "Nekonata permesilo" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Proprietary code" +msgstr "Mallibera kodo" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#: src/gs-app-context-bar.c:514 src/gs-app-context-bar.c:797 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:522 +msgid "Privileged" +msgstr "" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:529 +msgid "Safe" +msgstr "" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:536 +msgid "Probably Safe" +msgstr "" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:543 +msgid "Potentially Unsafe" +msgstr "" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:550 +msgid "Unsafe" +msgstr "" + +#: src/gs-app-context-bar.c:628 src/gs-app-context-bar.c:660 +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Mobile Only" +msgstr "" + +#: src/gs-app-context-bar.c:629 +msgid "Only works on a small screen" +msgstr "" + +#: src/gs-app-context-bar.c:634 src/gs-app-context-bar.c:667 +#: src/gs-app-context-bar.c:674 src/gs-app-context-bar.c:724 +#: src/gs-app-context-bar.c:729 src/gs-hardware-support-context-dialog.c:582 +msgid "Desktop Only" +msgstr "" + +#: src/gs-app-context-bar.c:635 +msgid "Only works on a large screen" +msgstr "" + +#: src/gs-app-context-bar.c:639 src/gs-hardware-support-context-dialog.c:620 +msgid "Screen Size Mismatch" +msgstr "" + +#: src/gs-app-context-bar.c:640 src/gs-hardware-support-context-dialog.c:621 +msgid "Doesn’t support your current screen size" +msgstr "" + +#: src/gs-app-context-bar.c:661 src/gs-hardware-support-context-dialog.c:673 +#: src/gs-hardware-support-context-dialog.c:679 +msgid "Requires a touchscreen" +msgstr "" + +#: src/gs-app-context-bar.c:668 src/gs-hardware-support-context-dialog.c:633 +#: src/gs-hardware-support-context-dialog.c:639 +#, fuzzy +#| msgid "Requires Restart" +msgid "Requires a keyboard" +msgstr "Bezonas restartigon" + +#: src/gs-app-context-bar.c:675 +#, fuzzy +#| msgid "Requires Restart" +msgid "Requires a mouse" +msgstr "Bezonas restartigon" + +#: src/gs-app-context-bar.c:686 +msgid "Gamepad Needed" +msgstr "" + +#: src/gs-app-context-bar.c:687 +msgid "Requires a gamepad to play" +msgstr "" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:711 +msgid "Adaptive" +msgstr "" + +#: src/gs-app-context-bar.c:712 +msgid "Works on phones, tablets and desktops" +msgstr "" + +#: src/gs-app-context-bar.c:725 +msgid "Probably requires a keyboard or mouse" +msgstr "" + +#: src/gs-app-context-bar.c:730 +msgid "Works on desktops and laptops" +msgstr "" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:772 +msgid "Contains no age-inappropriate content" +msgstr "" + +#: src/gs-app-context-bar.c:820 +#, fuzzy +#| msgid "No update description available." +msgid "No age rating information available" +msgstr "Neniu ĝisdatiga priskribo disponeblas." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:155 +msgid "Visit Website" +msgstr "Viziti la retpaĝaron" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:161 +msgid "Install…" +msgstr "Instali…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:169 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Nuligi" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:177 +msgid "Install" +msgstr "Instali" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:185 +msgid "Update" +msgstr "Ĝisdatigi" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:191 src/gs-app-row.c:201 +msgid "Uninstall…" +msgstr "Malinstali…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:215 +msgid "Uninstalling" +msgstr "Malinstalante" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:328 +msgid "Device cannot be used during update." +msgstr "Ne eblas uzi la aparaton dum ĝisdatigo." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:338 src/gs-shell-search-provider.c:268 +#, c-format +msgid "Source: %s" +msgstr "Fonto: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:525 +#, c-format +msgid "Renamed from %s" +msgstr "" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:562 src/gs-details-page.ui:562 +msgid "Stopped Receiving Updates" +msgstr "" + +#: src/gs-app-row.ui:58 src/gs-app-row.ui:60 src/gs-os-update-page.c:157 +#: src/gs-os-update-page.c:160 +msgid "Critical update" +msgstr "" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:574 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalita" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"volunteers.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" + +#: src/gs-app-translation-dialog.ui:5 +msgid "Translations" +msgstr "Tradukoj" + +#: src/gs-app-translation-dialog.ui:92 +#, fuzzy +#| msgctxt "Menu subcategory of Development Tools" +#| msgid "Translation" +msgid "_Translation Website" +msgstr "Traduko" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:12 src/gs-common.c:296 src/gs-common.c:697 +#: src/gs-details-page.ui:298 src/gs-page.c:435 src/gs-page.c:658 +#: src/gs-removal-dialog.ui:28 src/gs-repos-dialog.c:171 +#: src/gs-repos-dialog.c:249 src/gs-review-dialog.ui:26 src/gs-review-row.c:241 +#: src/gs-updates-page.c:853 src/gs-updates-page.c:870 +#: src/gs-upgrade-banner.ui:201 +msgid "_Cancel" +msgstr "_Nuligi" + +#: src/gs-basic-auth-dialog.ui:24 +msgid "_Login" +msgstr "Sa_luti" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:60 src/gs-origin-popover-row.ui:138 +msgid "User" +msgstr "Uzanto" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:73 +msgid "Password" +msgstr "Pasvorto" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Alia" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Ĉiuj" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Rekomenditaj" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +#, fuzzy +#| msgid "Editor’s Pick" +msgid "Editor’s Choice" +msgstr "Elekto de redaktisto" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +#, fuzzy +#| msgid "Updated" +msgid "New & Updated" +msgstr "Ĝisdatigita" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +#, fuzzy +#| msgid "Free Software" +msgid "Other Software" +msgstr "Libera programaro" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:195 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "Bonvolu enigi nombron de 1 ĝis %u: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:283 +#, fuzzy +#| msgid "Choose an application:" +msgid "Choose an app:" +msgstr "Elektu aplikaĵon:" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Ĉiuj" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Rekomenditaj" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D-grafiko" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografio" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skanado" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektora grafiko" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Vidigilo" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Kreado kaj redaktado de aŭdaĵo" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Muzikludiloj" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Ĉiuj" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Rekomenditaj" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendaro" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Datumbazo" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Financo" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Dokumentoredaktilo" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Tekstredaktiloj" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Retaj foliumiloj" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Ĉiuj" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Rekomenditaj" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Batalo" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventuro" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkado" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokoj" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Tabulo" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Karto" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Imitiloj" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Infanoj" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logiko" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rolludo" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sportoj" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategio" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Ĉiuj" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Rekomenditaj" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Babilo" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Ĉiuj" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Rekomenditaj" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Artefarita intelekto" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomio" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Ĥemio" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Lingvoj" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematiko" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Novaĵoj" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotteĥniko" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Arto" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografio" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Bildrakontoj" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fikcio" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Sano" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historio" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Vivostilo" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politiko" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sportoj" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Ĉiuj" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Rekomenditaj" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Sencimigiloj" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Programadaj medioj" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodekoj" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Aparataraj peliloj" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Tiparoj" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Enigaj fontoj" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Lingvo-pakaĵoj" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Asimilado" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Krei" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Laborejo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Ludi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Lerni" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Programi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodekoj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Aparataraj peliloj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Tiparoj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Enigaj fontoj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Lingvo-pakaĵoj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Asimilado" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:69 src/gs-common.c:92 +#, c-format +msgid "%s is now installed" +msgstr "%s nun estas instalita" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:73 src/gs-common.c:96 +msgid "A restart is required for the changes to take effect." +msgstr "Restartigo necesas por ke la ŝanĝoj efektiviĝu." + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:77 +#, fuzzy +#| msgid "Application is ready to be used." +msgid "App is ready to be used." +msgstr "Aplikaĵo nun estas preta por uzo." + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:85 +#, fuzzy +#| msgid "OS updates are now installed" +msgid "System updates are now installed" +msgstr "Operaciumaj ĝisdatigoj nun estas instalitaj" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:88 +msgid "Recently installed updates are available to review" +msgstr "Freŝdate instalitaj ĝisdatigojn nun ekzameneblas" + +#. TRANSLATORS: button text +#: src/gs-common.c:107 src/gs-common.c:860 +msgid "Restart" +msgstr "Restartigi" + +#: src/gs-common.c:113 +msgid "Launch" +msgstr "Lanĉi" + +#. TRANSLATORS: window title +#: src/gs-common.c:230 +#, fuzzy +#| msgid "Install Third-Party Software?" +msgid "Install Software?" +msgstr "Ĉu instali programaron de ekstera liveranto?" + +#. TRANSLATORS: window title +#: src/gs-common.c:232 +msgid "Install Third-Party Software?" +msgstr "Ĉu instali programaron de ekstera liveranto?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +#, fuzzy +#| msgid "Enable Third-Party Software Repository?" +msgid "Enable Software Repository?" +msgstr "Ĉu ŝalti deponejon de ekstera liveranto?" + +#. TRANSLATORS: window title +#: src/gs-common.c:238 src/gs-repos-dialog.c:168 +msgid "Enable Third-Party Software Repository?" +msgstr "Ĉu ŝalti deponejon de ekstera liveranto?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:250 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s ne estas libera programaro, kaj “%s” ĝin provizas." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:260 +#, c-format +msgid "%s is provided by “%s”." +msgstr "“%2$s” provizas %1$s." + +#: src/gs-common.c:269 +msgid "This software repository must be enabled to continue installation." +msgstr "Necesas ŝalti ĉi tiun programaran deponejon por daŭrigi la instaladon." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:279 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Povus esti kontraŭleĝe instali aŭ uzi %s en kelkaj landoj." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:285 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Povus esti kontraŭleĝe instali aŭ uzi ĉi tiun kodekon en kelkaj landoj." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:299 +#, fuzzy +#| msgid "Don’t Warn Again" +msgid "Don’t _Warn Again" +msgstr "Ne _averti denove" + +#. TRANSLATORS: button text +#: src/gs-common.c:308 +#, fuzzy +#| msgid "Enable and Install" +msgid "Enable and _Install" +msgstr "Ŝalti kaj _instali" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:511 +msgid "Detailed errors from the package manager follow:" +msgstr "Detalaj eraroj de la pakaĵ-administrilo sekvas:" + +#: src/gs-common.c:518 src/gs-safety-context-dialog.ui:72 +msgid "Details" +msgstr "Detaloj" + +#. TRANSLATORS: button text +#: src/gs-common.c:567 +msgid "_Close" +msgstr "_Fermi" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:689 +msgid "_Accept" +msgstr "_Akcepti" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:835 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Instalis ĝisdatigon" +msgstr[1] "Instalis ĝisdatigojn" + +#. TRANSLATORS: we've just removed some apps +#: src/gs-common.c:845 +#, fuzzy +#| msgid "An update has been installed" +#| msgid_plural "Updates have been installed" +msgid "An app has been removed" +msgid_plural "Apps have been removed" +msgstr[0] "Instalis ĝisdatigon" +msgstr[1] "Instalis ĝisdatigojn" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:851 +msgid "A restart is required for it to take effect." +msgid_plural "A restart is required for them to take effect." +msgstr[0] "Restartigo necesas por ke ĝi efektiviĝas." +msgstr[1] "Restartigo necesas por ke ili efektiviĝas." + +#. TRANSLATORS: button text +#: src/gs-common.c:858 +msgid "Not Now" +msgstr "Ne nun" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:954 +msgid "Just now" +msgstr "Ĵus" + +#: src/gs-common.c:956 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "antaŭ %d minuto" +msgstr[1] "antaŭ %d minutoj" + +#: src/gs-common.c:960 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "antaŭ %d horo" +msgstr[1] "antaŭ %d horoj" + +#: src/gs-common.c:964 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "antaŭ %d tago" +msgstr[1] "antaŭ %d tagoj" + +#: src/gs-common.c:968 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Antau %d semajno" +msgstr[1] "Antau %d semajnoj" + +#: src/gs-common.c:972 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Antaŭ %d monato" +msgstr[1] "Antaŭ %d monatoj" + +#: src/gs-common.c:976 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Antaŭ %d jaro" +msgstr[1] "antaŭ %d jaroj" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1340 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +#, fuzzy +#| msgid "An application" +msgid "An app" +msgstr "Aplikaĵo" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s petas plian subtenon de dosierformato." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Pliaj MIME-tipoj bezonataj" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s petas pliajn tiparojn." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Pliaj tiparoj bezonataj" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s petas pliajn plurmediajn kodekojn." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Necesas aldonaj plurmediaj kodekoj" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s petas pliajn presilajn pelilojn." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Necesas aldonaj presilaj peliloj" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s petas pliajn pakaĵojn." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Necesas aldonaj pakaĵoj" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Serĉi en Programaro" + +#: src/gs-description-box.c:92 src/gs-description-box.c:341 +msgid "_Show More" +msgstr "_Montri pli" + +#: src/gs-description-box.c:92 +msgid "_Show Less" +msgstr "_Montri malpli" + +#: src/gs-details-page.c:378 +msgid "Removing…" +msgstr "Forigante…" + +#: src/gs-details-page.c:388 +msgid "Requires restart to finish install" +msgstr "Necesas restartigo por fini instalon" + +#: src/gs-details-page.c:395 +msgid "Requires restart to finish remove" +msgstr "Necesas restartigo por fini forigon" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:412 +msgid "Pending installation…" +msgstr "Atendante instaladon…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:418 +msgid "Pending update…" +msgstr "Atendante ĝisdatigon…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:432 +msgid "Preparing…" +msgstr "Preparante…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:435 +msgid "Uninstalling…" +msgstr "Malinstalante…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:562 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s ne estas instalita, sed ĝi ankoraŭ havas datumojn." + +#: src/gs-details-page.c:1044 +msgid "_Restart" +msgstr "_Restartigi" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1068 +msgid "_Install…" +msgstr "_Instali…" + +#: src/gs-details-page.c:1135 +msgid "_Uninstall…" +msgstr "_Malinstali…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1281 +#, c-format +msgid "%s will appear in US English" +msgstr "%s aperos en la usona angla" + +#: src/gs-details-page.c:1289 +msgid "This app will appear in US English" +msgstr "Ĉi tiu aplikaĵo aperos en la usona angla" + +#: src/gs-details-page.c:1291 +msgid "This software will appear in US English" +msgstr "Ĉi tiu programaro aperos en la usona angla" + +#: src/gs-details-page.c:1326 src/gs-details-page.ui:60 +msgid "Help _Translate" +msgstr "Helpi _traduki" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1391 +#, c-format +msgid "Other Apps by %s" +msgstr "Aliaj aplikaĵoj de %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1784 +msgid "You need internet access to write a review" +msgstr "Vi bezonas interretan aliron por skribi recenzon" + +#: src/gs-details-page.c:1885 +#, fuzzy +#| msgid "" +#| "Software that has been installed from this repository will no longer " +#| "receive updates, including security fixes." +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Programaroj, kiuj instaliĝis el ĉi tiu deponejo, ne plu ricevos ĝisdatigojn, " +"inkluzive sekureco-flikaĵojn." + +#: src/gs-details-page.c:1886 +#, fuzzy +#| msgid "" +#| "This software is already provided by your distribution and should not be " +#| "replaced." +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Ĉi tiun programaron jam via distribuo provizas kaj oni devus ne anstataŭigi " +"ĝin." + +#: src/gs-details-page.c:1887 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Ĉi tiu aplikaĵo ne provizas iujn ajn ligilojn al retejo, koda deponejo aŭ " +"temo-spurilo." + +#: src/gs-details-page.c:1889 +#, fuzzy +#| msgid "" +#| "Software that has been installed from this repository will no longer " +#| "receive updates, including security fixes." +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Programaroj, kiuj instaliĝis el ĉi tiu deponejo, ne plu ricevos ĝisdatigojn, " +"inkluzive sekureco-flikaĵojn." + +#: src/gs-details-page.c:1890 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Ĉi tiun programaron jam via distribuo provizas kaj oni devus ne anstataŭigi " +"ĝin." + +#: src/gs-details-page.c:1891 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Ĉi tiu programaro ne provizas ajnajn ligilojn al retejo, koda deponejo aŭ " +"temo-spurilo." + +#: src/gs-details-page.c:1980 src/gs-details-page.c:1996 +#, c-format +msgid "Unable to find “%s”" +msgstr "Ne eblas trovi “%s”" + +#: src/gs-details-page.c:2343 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Malsukcesis sendi recenzon pri “%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Paĝo de detaloj" + +#: src/gs-details-page.ui:40 +msgid "Loading app details…" +msgstr "Ŝarĝante aplikaĵajn detalojn…" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:227 +msgid "_Open" +msgstr "_Malfermi" + +#: src/gs-details-page.ui:243 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Ĝ_isdatigi" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:261 src/gs-details-page.ui:271 +msgid "Uninstall" +msgstr "Malinstali" + +#: src/gs-details-page.ui:323 +msgid "Downloading" +msgstr "Elŝutante" + +#: src/gs-details-page.ui:460 src/gs-installed-page.ui:135 +msgid "Add-ons" +msgstr "Aldonaĵoj" + +#: src/gs-details-page.ui:633 +#, fuzzy +#| msgid "" +#| "This application can only be used when there is an active internet " +#| "connection." +msgid "This app can only be used when there is an active internet connection." +msgstr "Ĉi tiu aplikaĵo nur uzeblas kiam ekzistas aktiva interreta konekto." + +#: src/gs-details-page.ui:656 +msgid "Software Repository Included" +msgstr "Programara deponejo inkluzivita" + +#: src/gs-details-page.ui:666 +#, fuzzy +#| msgid "" +#| "This application includes a software repository which provides updates, " +#| "as well as access to other software." +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Ĉi tiu aplikaĵo inkluzivas programaran deponejon, kiu provizas ĝisdatigojn, " +"kaj ankaŭ aliron al aliaj programaroj." + +#: src/gs-details-page.ui:694 +msgid "No Software Repository Included" +msgstr "Neniu programara deponejo inkluzivita" + +#: src/gs-details-page.ui:704 +#, fuzzy +#| msgid "" +#| "This application does not include a software repository. It will not be " +#| "updated with new versions." +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Ĉi tiu aplikaĵo ne inkluzivas programaran deponejon. Ĝi ne ĝisdatiĝos al " +"novaj versioj." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:763 +msgid "Software Repository Identified" +msgstr "Programara deponejo identigita" + +#: src/gs-details-page.ui:773 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Aldonado de tiu programara deponejo donos al vi aliron al kromaj programaroj " +"kaj ĝisdatigoj." + +#: src/gs-details-page.ui:780 +msgid "Only use software repositories that you trust." +msgstr "Nur uzi programarajn deponejojn, kiujn vi fidas." + +#: src/gs-details-page.ui:821 +msgid "Clear app data" +msgstr "" + +#: src/gs-details-page.ui:838 +msgid "D_elete Data" +msgstr "_Forigi datumojn" + +#: src/gs-details-page.ui:914 +msgid "No Metadata" +msgstr "Neniuj metadatenoj" + +#: src/gs-details-page.ui:951 +msgid "Project _Website" +msgstr "Projekta _retejo" + +#: src/gs-details-page.ui:968 +msgid "_Donate" +msgstr "_Donaci" + +#: src/gs-details-page.ui:985 +msgid "Contribute _Translations" +msgstr "Kontribui _tradukojn" + +#: src/gs-details-page.ui:1002 +msgid "_Report an Issue" +msgstr "_Raporti problemon" + +#: src/gs-details-page.ui:1019 +msgid "_Help" +msgstr "_Helpo" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1036 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontakto" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1130 +msgid "Write R_eview" +msgstr "Skribi r_ecenzon" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1167 +msgid "All Reviews" +msgstr "Ĉiuj recenzoj" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Elŝutante kromajn metadatumajn dosierojn…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " kaj " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Disponeblaj tiparoj por la %s skribsistemo" +msgstr[1] "Disponeblaj tiparoj por la %s skribsistemoj" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Disponeblaj programaroj por %s" +msgstr[1] "Disponeblaj programaroj por %s" + +#: src/gs-extras-page.c:243 +msgid "Requested software not found" +msgstr "Petita programaro ne trovita" + +#: src/gs-extras-page.c:245 +msgid "Failed to find requested software" +msgstr "Ne eblas trovi la petitan programaron" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:419 +#, c-format +msgid "%s not found" +msgstr "%s ne trovita" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:423 +msgid "on the website" +msgstr "en la retejo" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:430 +#, fuzzy, c-format +#| msgid "No applications are available that provide the file %s." +msgid "No apps are available that provide the file %s." +msgstr "Neniu aplikaĵo disponeblas, kiu provizas la dosieron %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:434 src/gs-extras-page.c:445 src/gs-extras-page.c:456 +#, fuzzy, c-format +#| msgid "" +#| "Information about %s, as well as options for how to get missing " +#| "applications might be found %s." +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informon pri %s, kaj ankaŭ elektojn por akiri mankantajn aplikaĵojn, oni " +"povus trovi %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:441 src/gs-extras-page.c:463 +#, c-format +msgid "No apps are available for %s support." +msgstr "Neniu aplikaĵo disponeblas por %s-subteno." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:452 +#, c-format +msgid "%s is not available." +msgstr "%s ne disponeblas." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:467 +#, fuzzy, c-format +#| msgid "" +#| "Information about %s, as well as options for how to get an application " +#| "that can support this format might be found %s." +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informon pri %s, kaj ankaŭ elektojn por akiri ĝustan aplikaĵon por tiu ĉi " +"formo, oni povus trovi %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:474 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Neniu tiparo disponeblas por la %s skribsistema subteno." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:478 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informon pri %s, kaj ankaŭ elektojn por akiri kromajn tiparojn, oni povas " +"trovi %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:485 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Neniu aldonaĵa kodeko disponeblas por la formo %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:489 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informon pri %s, kaj ankaŭ elektojn por akiri ĝustan kodekon por tiu ĉi " +"formo, oni povus trovi %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:496 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Neniu Plasma-rimedoj disponeblas por subteno de %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:500 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informon pri %s, kaj ankaŭ elektojn por akiri kromajn Plasma-rimedojn, oni " +"povus trovi %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:507 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Neniu presila pelilo disponeblas por %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:511 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informon pri %s, kaj ankaŭ elektojn por akiri ĝustan pelilon por tiu ĉi " +"presilo, oni povus trovi %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:557 +#, fuzzy +#| msgid "Documentation" +msgid "the documentation" +msgstr "Dokumentado" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:563 +#, fuzzy, c-format +#| msgid "" +#| "Unfortunately, the %s you were searching for could not be found. Please " +#| "see %s for more information." +#| msgid_plural "" +#| "Unfortunately, the %s you were searching for could not be found. Please " +#| "see %s for more information." +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Bedaŭrinde, la %s kiun vi serĉis ne troveblis. Bonvolu vidi %s por pli da " +"informoj." +msgstr[1] "" +"Bedaŭrinde, la %s kiujn vi serĉis ne troveblis. Bonvolu vidi %s por pli da " +"informoj." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:572 +#, fuzzy, c-format +#| msgid "" +#| "Unfortunately, the %s you were searching for could not be found. Please " +#| "see %s for more information." +#| msgid_plural "" +#| "Unfortunately, the %s you were searching for could not be found. Please " +#| "see %s for more information." +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Bedaŭrinde, la %s kiun vi serĉis ne troveblis. Bonvolu vidi %s por pli da " +"informoj." +msgstr[1] "" +"Bedaŭrinde, la %s kiujn vi serĉis ne troveblis. Bonvolu vidi %s por pli da " +"informoj." + +#: src/gs-extras-page.c:650 src/gs-extras-page.c:707 src/gs-extras-page.c:747 +#, fuzzy, c-format +#| msgid "Failed to find any search results" +msgid "Failed to find any search results: %s" +msgstr "Malsukcesis trovi serĉrezultojn" + +#: src/gs-extras-page.c:964 +#, c-format +msgid "%s file format" +msgstr "%s dosierformato" + +#: src/gs-extras-page.c:1325 +#, fuzzy +#| msgid "_Install" +msgid "Install _All" +msgstr "Instali ĉ_iujn" + +#: src/gs-extras-page.c:1355 +msgid "Unable to Find Requested Software" +msgstr "Ne eblas trovi la petitan programaron" + +#: src/gs-extras-page.ui:6 +msgid "Codecs page" +msgstr "Paĝo de kodekoj" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Antaŭa" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Sekva" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Listo de elstaraj aplikaĵoj" + +#: src/gs-hardware-support-context-dialog.c:576 +#: src/gs-hardware-support-context-dialog.c:585 +msgid "Desktop Support" +msgstr "Labortabla subteno" + +#: src/gs-hardware-support-context-dialog.c:577 +#: src/gs-hardware-support-context-dialog.c:586 +msgid "Supports being used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:579 +msgid "Desktop Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:580 +msgid "Not enough information to know if large screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:583 +#, fuzzy +#| msgid "Requires Restart" +msgid "Requires a large screen" +msgstr "Bezonas restartigon" + +#: src/gs-hardware-support-context-dialog.c:588 +#, fuzzy +#| msgid "Open Desktop Ratings Support" +msgid "Desktop Not Supported" +msgstr "Open Desktop Ratings Support" + +#: src/gs-hardware-support-context-dialog.c:589 +msgid "Cannot be used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:596 +#: src/gs-hardware-support-context-dialog.c:605 +#, fuzzy +#| msgid "Steam Support" +msgid "Mobile Support" +msgstr "Steam-subteno" + +#: src/gs-hardware-support-context-dialog.c:597 +#: src/gs-hardware-support-context-dialog.c:606 +msgid "Supports being used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Mobile Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:600 +msgid "Not enough information to know if small screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:603 +#, fuzzy +#| msgid "Requires Restart" +msgid "Requires a small screen" +msgstr "Bezonas restartigon" + +#: src/gs-hardware-support-context-dialog.c:608 +msgid "Mobile Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:609 +msgid "Cannot be used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:632 +#: src/gs-hardware-support-context-dialog.c:641 +msgid "Keyboard Support" +msgstr "Klavaro-subteno" + +#: src/gs-hardware-support-context-dialog.c:635 +msgid "Keyboard Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:636 +msgid "Not enough information to know if keyboards are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:638 +msgid "Keyboard Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:642 +msgid "Supports keyboards" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:644 +msgid "Keyboard Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:645 +msgid "Cannot be used with a keyboard" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:652 +#: src/gs-hardware-support-context-dialog.c:661 +#, fuzzy +#| msgid "Steam Support" +msgid "Mouse Support" +msgstr "Steam-subteno" + +#: src/gs-hardware-support-context-dialog.c:653 +#: src/gs-hardware-support-context-dialog.c:659 +msgid "Requires a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Mouse Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:656 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Mouse Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:662 +msgid "Supports mice and pointing devices" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:664 +msgid "Mouse Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:665 +msgid "Cannot be used with a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:672 +#: src/gs-hardware-support-context-dialog.c:681 +msgid "Touchscreen Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Touchscreen Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:676 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Touchscreen Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:682 +msgid "Supports touchscreens" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:684 +msgid "Touchscreen Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:685 +msgid "Cannot be used with a touchscreen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Gamepad Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:699 +#, fuzzy +#| msgid "Requires Restart" +msgid "Requires a gamepad" +msgstr "Bezonas restartigon" + +#: src/gs-hardware-support-context-dialog.c:701 +#, fuzzy +#| msgid "Snap Support" +msgid "Gamepad Support" +msgstr "Snap-subteno" + +#: src/gs-hardware-support-context-dialog.c:702 +msgid "Supports gamepads" +msgstr "" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:711 +#, c-format +msgid "%s probably works on this device" +msgstr "" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:718 +#, c-format +msgid "%s works on this device" +msgstr "" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:725 +#, c-format +msgid "%s possibly works on this device" +msgstr "" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:732 +#, c-format +msgid "%s will not work properly on this device" +msgstr "" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:739 +#, c-format +msgid "%s will not work on this device" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:5 +#, fuzzy +#| msgid "Firmware Upgrade Support" +msgid "Hardware Support" +msgstr "Subteno por mikroprograma ĝisdatigo" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:813 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalita" + +#: src/gs-installed-page.ui:6 +msgid "Installed page" +msgstr "Paĝo de instalitaj programoj" + +#: src/gs-installed-page.ui:55 +msgid "In Progress" +msgstr "Progresante" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:75 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplikaĵoj" + +#: src/gs-installed-page.ui:95 +msgid "Web Apps" +msgstr "Retaj aplikaĵoj" + +#: src/gs-installed-page.ui:115 +msgid "System Apps" +msgstr "Sistemaj aplikaĵoj" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Komunume konstruita" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:98 +msgid "_Get Involved" +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by a community of volunteers, and released " +"under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by a community of volunteers, and released " +"under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by a community of volunteers, and " +"released under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by a community of volunteers, and " +"released under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:388 +msgid "Unknown License" +msgstr "Nekonata permesilo" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Lernu pli" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:547 +msgid "Proprietary" +msgstr "Mallibera" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" + +#: src/gs-license-tile.c:190 +msgid "Special License" +msgstr "Speciala permesilo" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:56 +#, fuzzy +#| msgid "Downloading featured images…" +msgid "Downloading software catalog" +msgstr "Elŝutante rekomenditajn bildojn…" + +#: src/gs-loading-page.ui:6 +msgid "Loading page" +msgstr "Paĝo de ŝargado" + +#: src/gs-loading-page.ui:11 +msgid "Starting up…" +msgstr "Startante…" + +#: src/gs-metered-data-dialog.ui:5 +#, fuzzy +#| msgid "Automatic Updates" +msgid "Automatic Updates Paused" +msgstr "Aŭtomataj ĝisdatigoj" + +#: src/gs-metered-data-dialog.ui:9 +msgid "" +"The current network is metered, so it may have data limits or charges " +"associated with it. To save data, automatic updates have been paused.\n" +"\n" +"If the network has been incorrectly identified as metered, this can be " +"changed in Settings." +msgstr "" + +#: src/gs-metered-data-dialog.ui:15 +msgid "Open Network _Settings" +msgstr "Malfermi _retagordojn" + +#: src/gs-moderate-page.ui:6 +msgid "Moderate page" +msgstr "Paĝo de kontrolado" + +#: src/gs-moderate-page.ui:71 +msgid "There are no reviews to moderate" +msgstr "Neniu kontrolenda recenzo" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Nekonata fonto" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:108 +msgid "Beta" +msgstr "Betao" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:264 +msgid "Additions" +msgstr "Aldonoj" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:268 +msgid "Removals" +msgstr "Forigoj" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:272 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Ĝisdatigoj" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:276 +msgid "Downgrades" +msgstr "Malpromocioj" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:592 +msgid "selected external sources" +msgstr "elektitaj eksteraj fontoj" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:596 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:602 +msgid "Enable Third Party Software Repositories?" +msgstr "Ĉu ebligi deponejon de ekstera liveranto?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:607 +msgid "_Ignore" +msgstr "_Ignori" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:609 src/gs-repos-dialog.c:173 +msgid "_Enable" +msgstr "_Ebligi" + +#: src/gs-overview-page.c:812 +#, fuzzy +#| msgid "the operating system" +msgid "Available for your operating system" +msgstr "Disponebla por via operaciumo" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:816 +#, fuzzy, c-format +#| msgid "Available software for %s" +#| msgid_plural "Available software for %s" +msgid "Available for %s" +msgstr "Disponebla por %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1109 +msgid "Explore" +msgstr "Esplori" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Superrigarda paĝo" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Disponeblaj aplikaĵoj" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:172 +msgid "Other Categories" +msgstr "Aliaj kategorioj" + +#: src/gs-overview-page.ui:214 +msgid "No App Data Found" +msgstr "Neniuj aplikaj datenoj trovitaj" + +#: lib/gs-plugin-loader.c:2795 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Nekonate" + +#. TRANSLATORS: button text +#: src/gs-page.c:93 +msgid "_OK" +msgstr "B_one" + +#: src/gs-page.c:290 +msgid "User declined installation" +msgstr "Uzanto malakceptis instaladon" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:429 +#, c-format +msgid "Prepare %s" +msgstr "Prepari %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:568 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Ĉu vi certe volas forigi la deponejon de %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:572 +#, fuzzy, c-format +#| msgid "" +#| "All applications from %s will be removed, and you will have to re-install " +#| "the repository to use them again." +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Ĉiuj aplikaĵoj de %s estos forigitaj, kaj vi devos reinstali la deponejon " +"por uzi ilin denove." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:582 +#, c-format +msgid "Uninstall %s?" +msgstr "Ne eblas instali %s" + +#: src/gs-page.c:591 +msgid "App Settings & Data" +msgstr "" + +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:594 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:617 +msgid "_Keep" +msgstr "_Teni" + +#: src/gs-page.c:623 +msgid "Allows restoring app settings and content" +msgstr "" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:632 +msgid "_Delete" +msgstr "_Forigi" + +#: src/gs-page.c:638 +msgid "Permanently deletes data to save disk space" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:645 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" + +#: src/gs-prefs-dialog.ui:5 +msgid "Preferences" +msgstr "Agordoj" + +#: src/gs-prefs-dialog.ui:16 +#, fuzzy +#| msgid "" +#| "Automatic updates are disabled when on mobile or metered connections." +msgid "" +"To avoid charges and network caps, software updates are not automatically " +"downloaded on mobile or metered connections." +msgstr "" +"Aŭtomataj ĝisdatigoj malŝaltiĝas se uzante porteblan aŭ limigan konekton." + +#: src/gs-prefs-dialog.ui:19 +#, fuzzy +#| msgid "Automatic Updates" +msgid "Automatic _Updates" +msgstr "Aŭtomataj ĝisdatigoj" + +#: src/gs-prefs-dialog.ui:20 +#, fuzzy +#| msgid "Installs any pending updates in the background" +msgid "" +"Downloads and installs software updates in the background, when possible" +msgstr "Instalas iun ajn okazontan ĝisdatigon fone" + +#: src/gs-prefs-dialog.ui:33 +#, fuzzy +#| msgid "Automatic Update Notifications" +msgid "Automatic Update _Notifications" +msgstr "Aŭtomataj ĝisdatigaj sciigoj" + +#: src/gs-prefs-dialog.ui:34 +#, fuzzy +#| msgid "Show notifications when updates have been automatically installed." +msgid "Show notifications when updates have been automatically installed" +msgstr "Montri sciigojn kiam ĝisdatigoj aŭtomate instaliĝis." + +#: src/gs-prefs-dialog.ui:47 +msgid "Show Only _Free Apps" +msgstr "" + +#: src/gs-prefs-dialog.ui:48 +msgid "Show only freely licensed apps and hide any proprietary apps" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, fuzzy, c-format +#| msgid "" +#| "Some of the currently installed software is not compatible with %s. If " +#| "you continue, the following will be automatically removed during the " +#| "upgrade:" +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Kelkaj aktuale instalitaj programaroj ne kongruas kun %s. Se vi daŭrigas, la " +"sekvaj aŭtomate foriĝos dum altgradigado:" + +#: src/gs-removal-dialog.ui:7 +msgid "Incompatible Software" +msgstr "Nekongrua programaro" + +#: src/gs-removal-dialog.ui:37 +msgid "_Upgrade" +msgstr "_Altgradigo" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:241 +#, fuzzy, c-format +#| msgid "" +#| "Software that has been installed from this repository will no longer " +#| "receive updates, including security fixes." +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Programaroj, kiuj instaliĝis el ĉi tiu deponejo, ne plu ricevos ĝisdatigojn, " +"inkluzive sekureco-flikaĵojn." + +#: src/gs-repos-dialog.c:246 +msgid "Disable Repository?" +msgstr "Ĉu malŝalti deponejon?" + +#: src/gs-repos-dialog.c:246 +msgid "Remove Repository?" +msgstr "Ĉu forigi deponejon?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:253 +msgid "_Disable" +msgstr "_Malŝalti" + +#. TRANSLATORS: this is button text to remove a repo +#: src/gs-repos-dialog.c:257 +msgid "_Remove" +msgstr "Fo_rigi" + +#: src/gs-repos-dialog.c:613 +#, fuzzy +#| msgid "Software Repositories" +msgid "Enable New Repositories" +msgstr "Programaraj depenejoj" + +#: src/gs-repos-dialog.c:614 +msgid "Turn on new repositories when they are added." +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:623 +msgid "more information" +msgstr "pli da informoj" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:628 +#, fuzzy, c-format +#| msgid "Access additional software from selected third party sources." +msgid "Additional repositories from selected third parties — %s." +msgstr "Atingi ceteran programaron de elektitaj eksteraj liverantaj fontoj." + +#: src/gs-repos-dialog.c:633 +#, fuzzy +#| msgid "Third Party Repositories" +msgid "Fedora Third Party Repositories" +msgstr "Deponejoj de eksteraj liverantoj" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:785 +msgid "the operating system" +msgstr "la operaciumo" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:842 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Ĉi tiuj deponejoj kompletigas la normajn programarojn provizataj de %s." + +#. button in the info bar +#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:99 +msgid "Software Repositories" +msgstr "Programaraj deponejoj" + +#: src/gs-repos-dialog.ui:53 +msgid "No Repositories" +msgstr "Neniuj deponejoj" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:181 +#, fuzzy, c-format +#| msgid "%u application installed" +#| msgid_plural "%u applications installed" +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplikaĵo instalita" +msgstr[1] "%u aplikaĵoj instalitaj" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:189 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u aldonaĵo instalita" +msgstr[1] "%u aldonaĵoj instalitaj" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:200 +#, fuzzy, c-format +#| msgid "%u application" +#| msgid_plural "%u applications" +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplikaĵo" +msgstr[1] "%u aplikaĵoj" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:209 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u aldonaĵo" +msgstr[1] "%u aldonaĵoj" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:225 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s kaj %s estas instalitaj" +msgstr[1] "%s kaj %s estas instalitaj" + +#: src/gs-repo-row.c:241 +msgid "Checking installed software…" +msgstr "Kontrolante instalitan programaron…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:249 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:399 +msgid "Remove" +msgstr "Forigi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:89 +msgid "Hate it" +msgstr "Malŝatas ĝin" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:93 +msgid "Don’t like it" +msgstr "Ne ŝatas ĝin" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:97 +msgid "It’s OK" +msgstr "Estas en ordo" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:101 +msgid "Like it" +msgstr "Ŝatas ĝin" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:105 +msgid "Love it" +msgstr "Amas ĝin" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:109 +msgid "Select a Star to Leave a Rating" +msgstr "Elektu stelon por lasi takson" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:127 +msgid "Please take more time writing the review" +msgstr "Bonvolu preni pli da tempo skribi la recenzon" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:130 +msgid "Please choose a star rating" +msgstr "Bonvolu elekti steltakson" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "The summary is too short" +msgstr "La resumo estas tro mallonga" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too long" +msgstr "La resumo estas tro longa" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The description is too short" +msgstr "La priskribo estas tro mallonga" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too long" +msgstr "La priskribo estas tro longa" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Skribi recenzon" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:34 +msgid "_Send" +msgstr "_Sendi" + +#: src/gs-review-dialog.ui:120 +msgid "" +"What did you like about this app? Leaving your feedback along with your " +"reasons for leaving a review is helpful for others." +msgstr "" + +#: src/gs-review-dialog.ui:133 +#, fuzzy +#| msgid "Summary" +msgid "Review Summary" +msgstr "Resumo" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:165 +#, fuzzy +#| msgid "_Write a Review" +msgctxt "app review" +msgid "Write a short review" +msgstr "_Skribi recenzon" + +#: src/gs-review-dialog.ui:209 +#, fuzzy +#| msgid "" +#| "Find what data is sent in our privacy policy." +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Eltrovu, kiuj datumoj sendiĝas en nia privateco politiki." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "el 5 steloj" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:60 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Nekonate" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:226 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Vi povas raporti recenzojn por ofenda, malafabla, aŭ diskriminacia konduto." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:231 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "Kiam raportita, recenzo estos kaŝita ĝis administranto kontrolis ĝin." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:239 +msgid "Report Review?" +msgstr "Ĉu raporti recenzon?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:244 +msgid "_Report" +msgstr "_Raporto" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:84 +msgid "Was this review useful to you?" +msgstr "Ĉu ĉi tiu recenzo estis utila al vi?" + +#: src/gs-review-row.ui:100 +msgid "Yes" +msgstr "Jes" + +#: src/gs-review-row.ui:108 +msgid "No" +msgstr "Ne" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:116 +msgid "Meh" +msgstr "Pli-malpli" + +#: src/gs-review-row.ui:128 +msgid "Report…" +msgstr "Raporti…" + +#: src/gs-review-row.ui:137 +msgid "Remove…" +msgstr "Forigi…" + +#: src/gs-safety-context-dialog.c:156 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" + +#: src/gs-safety-context-dialog.c:164 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:179 +msgid "No Permissions" +msgstr "Neniuj permesoj" + +#: src/gs-safety-context-dialog.c:180 +#, fuzzy +#| msgid "This application is fully sandboxed." +msgid "App is fully sandboxed" +msgstr "Ĉi tiu aplikaĵo estas entute sablujigita." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:191 +#, fuzzy +#| msgid "Network Settings" +msgid "Network Access" +msgstr "Retagordoj" + +#: src/gs-safety-context-dialog.c:192 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access the internet" +msgstr "Povas atingi sistemajn aparatajn dosierojn" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:195 +#, fuzzy +#| msgid "No Network" +msgid "No Network Access" +msgstr "Neniu reto" + +#: src/gs-safety-context-dialog.c:196 +#, fuzzy +#| msgid "Can access system device files" +msgid "Cannot access the internet" +msgstr "Povas atingi sistemajn aparatajn dosierojn" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:202 +#, fuzzy +#| msgid "System Services" +msgid "Uses System Services" +msgstr "Sistemaj servoj" + +#: src/gs-safety-context-dialog.c:203 +msgid "Can request data from system services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:210 +#, fuzzy +#| msgid "Session Services" +msgid "Uses Session Services" +msgstr "Seancaj servoj" + +#: src/gs-safety-context-dialog.c:211 +msgid "Can request data from session services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:218 +msgid "User Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:219 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:222 +msgid "No User Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:223 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:229 +#, fuzzy +#| msgid "System Services" +msgid "System Device Access" +msgstr "Sistemaj servoj" + +#: src/gs-safety-context-dialog.c:230 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access system devices which require elevated permissions" +msgstr "Povas atingi sistemajn aparatajn dosierojn" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:237 +#, fuzzy +#| msgid "Legacy display system" +msgid "Legacy Windowing System" +msgstr "Malnova vidiga sistemo" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:245 +#, fuzzy +#| msgid "Permissions" +msgid "Arbitrary Permissions" +msgstr "Permesoj" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:253 +msgid "User Settings" +msgstr "Uzanto-agordoj" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:265 +msgid "Full File System Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:266 +msgid "Can read and write all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "Home Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:275 +msgid "Can read and write all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:283 +msgid "Full File System Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:284 +msgid "Can read all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:293 +msgid "Home Folder Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:294 +msgid "Can read all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:303 +msgid "Download Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:304 +msgid "Can read and write all data in your downloads directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +#, fuzzy +#| msgid "Downloads folder" +msgid "Download Folder Read Access" +msgstr "Elŝut-dosierujo" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your downloads directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in the directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in the directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:353 +#, fuzzy +#| msgid "File system" +msgid "No File System Access" +msgstr "Dosiersistemo" + +#: src/gs-safety-context-dialog.c:354 +#, fuzzy +#| msgid "Can access system device files" +msgid "Cannot access the file system at all" +msgstr "Povas atingi sistemajn aparatajn dosierojn" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:364 +msgid "App developer is verified" +msgstr "" + +#: src/gs-safety-context-dialog.c:365 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:376 +msgid "Insecure Dependencies" +msgstr "Nesekuraj dependecoj" + +#: src/gs-safety-context-dialog.c:377 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" + +#: src/gs-safety-context-dialog.c:390 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" + +#: src/gs-safety-context-dialog.c:391 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:411 +msgid "Proprietary Code" +msgstr "Mallibera kodo" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:415 +msgid "Auditable Code" +msgstr "Kontrolebla kodo" + +#: src/gs-safety-context-dialog.c:416 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"La fontkodo estas publika kaj povas esti sendepende kontrolita, kio faras la " +"aplikaĵon pli verŝajne esti sekura" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:425 +#, c-format +msgid "%s is privileged" +msgstr "%s estas privilegiita" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:432 +#, c-format +msgid "%s is safe" +msgstr "%s estas sekura" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:439 +#, c-format +msgid "%s is probably safe" +msgstr "%s verŝajne estas sekura" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:446 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s estas eble nesekura" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:453 +#, c-format +msgid "%s is unsafe" +msgstr "%s estas nesekura" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:544 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Nekonate" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:5 +msgid "Safety" +msgstr "Sekureco" + +#: src/gs-safety-context-dialog.ui:101 +msgid "License" +msgstr "Permesilo" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:141 +msgid "Source" +msgstr "Fonto" + +#: src/gs-safety-context-dialog.ui:181 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:205 +msgid "Outdated SDK version" +msgstr "Malaktuala SDK-versio" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Antaŭa ekrankopio" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Sekva ekrankopio" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Neniuj ekrankopioj" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:360 src/gs-screenshot-image.c:417 +#: src/gs-screenshot-image.c:623 +msgid "Screenshot not found" +msgstr "Ne trovis ekrankopion" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:438 +msgid "Failed to load image" +msgstr "Malsukcesis ŝargi bildon" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:651 +msgid "Screenshot size not found" +msgstr "Grando de ekrankopio ne trovita" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:733 +msgid "Could not create cache" +msgstr "Ne eblis krei kaŝmemoron" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:747 +msgid "Screenshot not valid" +msgstr "Nevalida ekrankopio" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:797 +msgid "Screenshot not available" +msgstr "Ekrankopio ne haveblas" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Ekrankopio" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u kongruo pli" +msgstr[1] "%u pli da kongruoj" + +#: src/gs-search-page.ui:6 +msgid "Search page" +msgstr "Serĉpaĝo" + +#: src/gs-search-page.ui:17 +#, fuzzy +#| msgid "Search for applications" +msgid "Search for Apps" +msgstr "Serĉi aplikaĵojn" + +#: src/gs-search-page.ui:46 +#, fuzzy +#| msgid "No Application Found" +msgid "No App Found" +msgstr "Neniu aplikaĵo trovita" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1198 src/gs-shell.c:1203 src/gs-shell.c:1218 +#: src/gs-shell.c:1222 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Ne eblas elŝuti mikroprogramarajn ĝisdatigojn de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1280 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Ne eblas elŝuti ĝisdatigojn de %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1287 src/gs-shell.c:1328 +msgid "Unable to download updates" +msgstr "Ne eblas elŝuti ĝisdatigojn" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1292 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" +"Ne eblas elŝuti ĝisdatigojn: interreta aliro necesis sed ne disponeblis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1300 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Ne eblas elŝuti ĝisdatigojn de %s: nesufiĉa diskospaco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1305 +msgid "Unable to download updates: not enough disk space" +msgstr "Ne eblas elŝuti ĝisdatigojn: nesufiĉa diskospaco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1311 +msgid "Unable to download updates: authentication was required" +msgstr "Ne eblas elŝuti ĝisdatigojn: aŭtentigo necesis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1315 +msgid "Unable to download updates: authentication was invalid" +msgstr "Ne eblas elŝuti ĝisdatigojn: aŭtentigo estis nevalida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1319 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Ne eblas elŝuti ĝisdatigojn: vi ne havas permeson instali programaron" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to get list of updates" +msgstr "Ne eblas ricevi liston de ĝisdatigoj" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "Ne eblas instali %s ĉar elŝuto de %s malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "Ne eblas instali %s ĉar elŝuto malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1385 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "Ne eblas instali %s ĉar rultempa medio %s ne disponeblas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1391 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "Ne eblas instali %s ĉar ĝi ne estas subtenita" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1397 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "Ne eblas instali: interreta aliro necesis sed ne disponeblis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1402 +#, fuzzy +#| msgid "Unable to install: the application has an invalid format" +msgid "Unable to install: the app has an invalid format" +msgstr "Ne eblas instali: la aplikaĵo havas nevalidan formon" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1406 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Ne eblas instali %s: nesufiĉa diskospaco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "Ne eblas instali %s: aŭtentigo necesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1418 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "Ne eblas instali %s: aŭtentigo nevalidis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1424 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "Ne eblas instali %s: vi ne havas permeson instali programaron" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1431 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "Ne eblas instali %s: doma elektro necesas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1437 +#, c-format +msgid "Unable to install %s: The battery level is too low" +msgstr "Ne eblas instali %s: bateria nivelo tro malalta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1446 +#, c-format +msgid "Unable to install %s" +msgstr "Ne eblas instali %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1485 +#, c-format +msgid "Unable to update %s from %s as download failed" +msgstr "Ne eblas ĝisdatigi %s el %s ĉar elŝuto malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "Ne eblas ĝisdatigi %s ĉar elŝuto malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to install updates from %s as download failed" +msgstr "Ne eblas instali ĝisdatigojn el %s ĉar elŝuto malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to install updates as download failed" +msgstr "Ne eblas instali ĝisdatigojn ĉar elŝuto malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "Ne eblas ĝisdatigi: interreta aliro necesis sed ne disponeblis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1517 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Ne eblas ĝisdatigi %s: nesufiĉa diskospaco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1522 +#, c-format +msgid "Unable to install updates: not enough disk space" +msgstr "Ne eblas instali ĝisdatigojn: nesufiĉa diskospaco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1531 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "Ne eblas ĝisdatigi %s: aŭtentigo necesis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1536 +#, c-format +msgid "Unable to install updates: authentication was required" +msgstr "Ne eblas instali ĝisdatigojn: aŭtentigo necesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1544 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "Ne eblas ĝisdatigi %s: aŭtentigo estis nevalida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1549 +#, c-format +msgid "Unable to install updates: authentication was invalid" +msgstr "Ne eblas instali ĝisdatigojn: aŭtentigo estis nevalida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1557 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "Ne eblas ĝisdatigi %s: vi ne havas permeson ĝisdatigi programaron" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1563 +#, c-format +msgid "" +"Unable to install updates: you do not have permission to update software" +msgstr "" +"Ne eblas instali ĝisdatigojn: vi ne havas permeson ĝisdatigi programaron" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "Ne eblas ĝisdatigi %s: doma elektro necesas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1578 +#, c-format +msgid "Unable to install updates: AC power is required" +msgstr "Ne eblas instali ĝisdatigojn: doma elektro necesas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1586 +#, c-format +msgid "Unable to update %s: The battery level is too low" +msgstr "Ne eblas ĝisdatigi %s: bateria nivelo tro malalta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to install updates: The battery level is too low" +msgstr "Ne eblas instali ĝisdatigojn: bateria nivelo tro malalta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1603 +#, c-format +msgid "Unable to update %s" +msgstr "Ne eblas ĝisdatigi %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1606 +#, c-format +msgid "Unable to install updates" +msgstr "Ne eblas instali ĝisdatigojn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1642 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Ne eblas altgradigi al %s de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1647 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "Ne eblas altgradigi al %s ĉar elŝuto malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1655 +#, c-format +msgid "" +"Unable to upgrade to %s: internet access was required but wasn’t available" +msgstr "Ne eblas altgradigi al %s: interreta aliro necesis sed ne disponeblis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1663 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Ne eblas altgradigi al %s: nesufiĉa diskospaco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1670 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "Ne eblas altgradigi al %s: aŭtentigo necesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1676 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "Ne eblas altgradigi al %s: aŭtentigo nevalidis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "Ne eblas algradigi al %s: vi ne havas permeson ĝisdatigi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1688 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "Ne eblas altgradigi al %s: doma elektro necesas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to upgrade to %s: The battery level is too low" +msgstr "Ne eblas altgradigi al %s: bateria nivelo tro malalta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1703 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Ne eblas algradigi al %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "Ne eblas forigi %s: aŭtentigo necesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1739 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "Ne eblas forigi %s: aŭtentigo nevalidis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1744 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "Ne eblas forigi %s: vi ne havas permeson forigi programaron" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "Ne eblas forigi %s: doma elektro necesas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1756 +#, c-format +msgid "Unable to remove %s: The battery level is too low" +msgstr "Ne eblas forigi %s: bateria nivelo tro malalta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to remove %s" +msgstr "Ne eblas forigi %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1803 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Ne eblas lanĉi %s: %s ne estas instalita" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1811 src/gs-shell.c:1827 src/gs-shell.c:1869 +#: src/gs-shell.c:1911 src/gs-shell.c:1968 +msgid "Sorry, something went wrong" +msgstr "Pardonu, io misfunkciis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1816 src/gs-shell.c:1858 src/gs-shell.c:1900 +#: src/gs-shell.c:1947 +msgid "Not enough disk space — free up some space and try again" +msgstr "Ne sufiĉas diskspaco — liberigu iom da spaco kaj provu denove" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1852 +msgid "Failed to install file: not supported" +msgstr "Malsukcesis instali dosieron: ne subtenata" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1855 +msgid "Failed to install file: authentication failed" +msgstr "Malsukcesis instali dosieron: aŭtentigo malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1894 +msgid "Failed to install: not supported" +msgstr "Malsukcesis instali: ne subtenata" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1897 +msgid "Failed to install: authentication failed" +msgstr "Malsukcesis instali: aŭtentigo malsukcesis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1942 +#, c-format +msgid "Unable to contact %s" +msgstr "Ne eblas kontakti %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1952 +msgid "Software needs to be restarted to use new plugins." +msgstr "Programaro devas esti restartigita por uzi novajn kromaĵojn." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1956 +msgid "AC power is required" +msgstr "Doma elektro necesas" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1959 +msgid "The battery level is too low" +msgstr "La bateria nivelo estas tro malalta" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "_Programaraj deponejoj" + +#: src/gs-shell.ui:12 +msgid "_Preferences" +msgstr "_Agordoj" + +#. button in the info bar +#: src/gs-shell.ui:109 +msgid "Examine Disk" +msgstr "Ekzameni diskon" + +#. button in the info bar +#: src/gs-shell.ui:119 +msgid "Network Settings" +msgstr "Retagordoj" + +#. button in the info bar +#: src/gs-shell.ui:129 +msgid "_Restart Now…" +msgstr "_Restartigi nun…" + +#. button in the info bar +#: src/gs-shell.ui:140 +msgid "More Information" +msgstr "Pli da informoj" + +#: src/gs-shell.ui:200 src/gs-shell.ui:202 +msgid "Search" +msgstr "Serĉi" + +#: src/gs-shell.ui:216 src/gs-shell.ui:218 +msgid "Main Menu" +msgstr "Ĉefa menuo" + +#: src/gs-shell.ui:245 +msgid "Search apps" +msgstr "Serĉi aplikaĵojn" + +#: src/gs-shell.ui:257 +msgid "Metered network ‒ automatic updates paused" +msgstr "Mezurita reto ‒ aŭtomataj ĝisdatigoj paŭzite" + +#: src/gs-shell.ui:258 +msgid "Find Out _More" +msgstr "Lerni _pli" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:272 +msgid "_Explore" +msgstr "_Esplori" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:286 +#, fuzzy +#| msgid "_Installed" +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalitaj" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:308 +#, fuzzy +#| msgid "_Updates" +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Ĝ_isdatigoj" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Neniu" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Aplikaĵaj datumoj" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Datumoj bezonataj por ke la aplikaĵo rulu" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Uzanto-datumoj" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Datumoj kreitaj de vi en la aplikaĵo" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Kaŝmemoro-datumoj" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Provizoraj kaŝmemoraj datumoj" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "La aplikaĵo mem" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Bezonataj dependecoj" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Komunaj sistemaj komponantoj postulataj de ĉi tiu aplikaĵo" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Nekonata" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:5 +msgid "Storage" +msgstr "Konservejo" + +#. Translators: Please do not translate the markup or link href +#: src/gs-storage-context-dialog.ui:69 +msgid "" +"Cached data can be cleared from the _app settings." +msgstr "" +"Kaŝmemoritaj datumoj povas esti forigitaj de la _app-" +"agordoj." + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instalita)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Instalante)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Forigante)" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:65 src/gs-update-dialog.c:152 +msgid "Installed Updates" +msgstr "Instalitaj ĝisdatigoj" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:131 +#, c-format +msgid "Installed on %s" +msgstr "Instalita sur %s" + +#: src/gs-update-dialog.ui:77 +#, fuzzy +msgid "No Updates Installed" +msgstr "Neniuj ĝisdatigoj instalitaj" + +#: src/gs-update-monitor.c:215 +#, fuzzy +#| msgid "Software Updates Failed" +msgid "Software Updates Are Out of Date" +msgstr "Programaraj ĝisdatigoj malsukcesis" + +#: src/gs-update-monitor.c:216 +#, fuzzy +#| msgid "Check for updates" +msgid "Please check for software updates." +msgstr "Kontroli pri ĝisdatigoj" + +#: src/gs-update-monitor.c:222 +#, fuzzy +#| msgid "Software Update Installed" +#| msgid_plural "Software Updates Installed" +msgid "Critical Software Update Ready to Install" +msgstr "Programara ĝisdatigo instalita" + +#: src/gs-update-monitor.c:223 +#, fuzzy +#| msgid "An important OS update failed to be installed." +msgid "An important software update is ready to be installed." +msgstr "Instalado de grava ĝisdatigo por la operaciumo malsukcesis." + +#: src/gs-update-monitor.c:226 +#, fuzzy +#| msgid "Software Updates Available" +msgid "Critical Software Updates Available to Download" +msgstr "Programaraj ĝisdatigoj disponeblas" + +#: src/gs-update-monitor.c:227 +msgid "Important: critical software updates are waiting." +msgstr "" + +#: src/gs-update-monitor.c:233 +#, fuzzy +#| msgid "Software Update Installed" +#| msgid_plural "Software Updates Installed" +msgid "Software Updates Ready to Install" +msgstr "Programara ĝisdatigo instalita" + +#: src/gs-update-monitor.c:234 +#, fuzzy +#| msgid "An important OS update failed to be installed." +msgid "Software updates are waiting and ready to be installed." +msgstr "Instalado de grava ĝisdatigo por la operaciumo malsukcesis." + +#: src/gs-update-monitor.c:240 +#, fuzzy +#| msgid "Software Updates Available" +msgid "Software Updates Available to Download" +msgstr "Programaraj ĝisdatigoj disponeblas" + +#: src/gs-update-monitor.c:241 +#, fuzzy +#| msgid "Automatically download and install updates" +msgid "Please download waiting software updates." +msgstr "Aŭtomate elŝuti kaj instali ĝisdatigojn" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, fuzzy, c-format +#| msgid "%u Application Updated — Restart Required" +#| msgid_plural "%u Applications Updated — Restart Required" +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplikaĵo ĝisdatigita — restartigo necesas" +msgstr[1] "%u aplikaĵoj ĝisdatigitaj — restartigo necesas" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, fuzzy, c-format +#| msgid "%u Application Updated" +#| msgid_plural "%u Applications Updated" +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplikaĵo ĝisdatigita" +msgstr[1] "%u aplikaĵoj ĝisdatigitaj" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "%s ĝisdatiĝis." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +#, fuzzy +#| msgid "Please restart the application." +msgid "Please restart the app." +msgstr "Bonvolu restartigi la aplikaĵon." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s kaj %s ĝisdatiĝis." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, fuzzy, c-format +#| msgid "%u application requires a restart." +#| msgid_plural "%u applications require a restart." +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplikaĵo bezonas restartigo." +msgstr[1] "%u aplikaĵoj bezonas restartigo." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inkluzivante %s, %s kaj %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:702 +msgid "Operating System Updates Unavailable" +msgstr "Operaciumaj ĝisdatigoj ne plu disponeblas" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:704 +msgid "Upgrade to continue receiving security updates." +msgstr "Altgradigu por ricevi sekurecajn ĝisdatigojn." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:759 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Nova versio de %s disponeblas por instali" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:763 +msgid "Software Upgrade Available" +msgstr "Programara altgradigo disponeblas" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1208 +msgid "Software Updates Failed" +msgstr "Programaraj ĝisdatigoj malsukcesis" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1210 +#, fuzzy +#| msgid "An important OS update failed to be installed." +msgid "An important operating system update failed to be installed." +msgstr "Instalado de grava ĝisdatigo por la operaciumo malsukcesis." + +#: src/gs-update-monitor.c:1211 +msgid "Show Details" +msgstr "Montri detalojn" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1235 +msgid "System Upgrade Complete" +msgstr "Sistema altgradigo plenumita" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1240 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Bonvenon al %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1249 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Programara ĝisdatigo instalita" +msgstr[1] "Programaraj ĝisdatigoj instalitaj" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1253 +#, fuzzy +#| msgid "An important OS update has been installed." +#| msgid_plural "Important OS updates have been installed." +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Instalis gravan operaciuman ĝisdatigon." +msgstr[1] "Instalis gravajn operaciumajn ĝisdatigojn." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1264 +msgctxt "updates" +msgid "Review" +msgstr "Ekzameni" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1314 +msgid "Failed To Update" +msgstr "Malsukcesis ĝisdatigi" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1319 +msgid "The system was already up to date." +msgstr "La sistemo jam estis ĝisdatigita." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1324 +msgid "The update was cancelled." +msgstr "La ĝisdatigo estis nuligita." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1329 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Interreta aliro necesis sed ne disponeblis. Bonvolu certigi ke vi havas " +"interretan aliron kaj provu denove." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1334 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Estis sekurecaj problemoj koncerne al la ĝisdatigo. Bonvolu konsulti vian " +"programaran provizanton por pli da detaloj." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1339 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Ne estis sufiĉa diskospaco. Bonvolu liberu iom da spaco kaj provu denove." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1343 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Ni pardonpetas: la ĝisdatigo malsukcesis instali. Bonvolu atendi por alia " +"ĝisdatigo kaj provu denove. Se la problemo restas, kontaktu vian programaran " +"provizanton." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:253 +#, c-format +msgid "Last checked: %s" +msgstr "Laste kontrolita: %s" + +#: src/gs-updates-page.c:302 +msgid "Stop" +msgstr "Haltigi" + +#: src/gs-updates-page.c:311 src/gs-updates-page.c:323 +msgid "Check for Updates" +msgstr "Kontroli pri ĝisdatigoj" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:573 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:579 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:849 +msgid "Charges May Apply" +msgstr "Povas kosti ion" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:851 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Kontrolado pri ĝisdatigoj uzante porteblan larĝkapacitan konekton povus " +"kosti ion." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:855 +msgid "Check _Anyway" +msgstr "Kontroli ĉ_iuokaze" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:866 +msgid "No Network" +msgstr "Neniu reto" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:868 +msgid "Internet access is required to check for updates." +msgstr "Interreta aliro necesas por kontroli pri ĝisdatigoj." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:872 +msgid "Network _Settings" +msgstr "Ret_agordoj" + +#: src/gs-updates-page.c:910 +#, fuzzy +#| msgid "Software Upgrade Available" +msgid "Software Upgrades Downloaded" +msgstr "Programara altgradigoj disponeblas" + +#: src/gs-updates-page.c:911 +msgid "Software upgrades have been downloaded and are ready to be installed." +msgstr "" + +#: src/gs-updates-page.c:1260 +msgid "Check for updates" +msgstr "Kontroli pri ĝisdatigoj" + +#: src/gs-updates-page.c:1296 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Ĝisdatigoj" + +#: src/gs-updates-page.ui:6 +msgid "Updates page" +msgstr "Paĝo de ĝisdatigoj" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:58 +#, fuzzy +#| msgid "Pending update…" +msgid "Loading Updates…" +msgstr "Atendante ĝisdatigon…" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:71 +#, fuzzy +#| msgid "(This could take a while)" +msgid "This could take a while." +msgstr "(Ĉi tio povas esti longdaŭra)" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:179 +msgid "Up to Date" +msgstr "Ĝisdata" + +#: src/gs-updates-page.ui:218 +msgid "Use Mobile Data?" +msgstr "Ĉu uzi poŝtelefonajn datumojn?" + +#: src/gs-updates-page.ui:219 +#, fuzzy +#| msgid "" +#| "Checking for updates when using mobile broadband could cause you to incur " +#| "charges" +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Kontrolado pri ĝisdatigoj uzante porteblan larĝkapacitan konekton povus " +"kosti ion" + +#: src/gs-updates-page.ui:222 +msgid "_Check Anyway" +msgstr "_Kontroli tamen" + +#: src/gs-updates-page.ui:238 +msgid "No Connection" +msgstr "Neniu konekto" + +#: src/gs-updates-page.ui:239 +#, fuzzy +#| msgid "Go online to check for updates" +msgid "Go online to check for updates." +msgstr "Enretigu por kontroli pri ĝisdatigoj" + +#: src/gs-updates-page.ui:242 +msgid "_Network Settings" +msgstr "_Retagordoj" + +#: src/gs-updates-page.ui:275 +msgid "Error" +msgstr "Eraro" + +#: src/gs-updates-page.ui:276 +#, fuzzy +#| msgid "Updates are automatically managed" +msgid "Updates are automatically managed." +msgstr "Ĝisdatigoj aŭtomate mastrumiĝas" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:365 +msgid "_Restart & Update…" +msgstr "_Restartigi & ĝisdatigi…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:371 +msgid "U_pdate All" +msgstr "Ĝisdatigi ĉi_ujn" + +#: src/gs-updates-section.c:448 +#, fuzzy +#| msgid "Software Updates Failed" +msgid "Software Updates Downloaded" +msgstr "Programaraj ĝisdatigoj elŝutitaj" + +#: src/gs-updates-section.c:449 +msgid "Software updates have been downloaded and are ready to be installed." +msgstr "" +"Programaj ĝisdatigoj estis elŝutitaj kaj estas pretaj por esti instalitaj." + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:525 +msgid "Integrated Firmware" +msgstr "Integrita mikroprogramo" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:530 +msgid "Requires Restart" +msgstr "Bezonas restartigon" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:535 +msgid "App Updates" +msgstr "Ĝisdatigoj de aplikaĵo" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:540 +msgid "Device Firmware" +msgstr "Aparata mikroprogramo" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Elŝuti" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s disponebla" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s disponebla" + +#: src/gs-upgrade-banner.c:154 +msgid "Learn about the new version" +msgstr "Lerni pri la nova versio" + +#: src/gs-upgrade-banner.c:178 +msgid "Downloading…" +msgstr "Elŝutante…" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:196 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s el %s elŝutita" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:200 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% ​​elŝutita" + +#: src/gs-upgrade-banner.ui:42 +msgid "A major upgrade, with new features and added polish." +msgstr "Granda altgradigo, kun novaj funkcioj kaj aldonita polurado." + +#: src/gs-upgrade-banner.ui:187 +#, fuzzy +#| msgid "Restart & Update" +msgid "_Restart & Upgrade…" +msgstr "_Restartigi kaj ĝisdatigi…" + +#: src/gs-upgrade-banner.ui:215 +msgid "Remember to back up data and files before upgrading." +msgstr "Memoru konservi datumojn kaj dosierojn antaŭ ĝisdatigi." + +#: lib/gs-utils.c:523 lib/gs-utils.c:554 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Malsukcesis forigi dosieron “%s”: %s" + +#: lib/gs-utils.c:565 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Malsukcesis forigi dosierujon “%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Aldoni, forigi aŭ ĝisdatigi programaron en ĉi tiu komputilo" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Ĝisdatigoj;Altgradigo;Fontoj;Deponejoj;Agordoj;Instali;Malinstali;Programo;" +"Programaro;Aplikaĵo;Butiko;" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:67 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3227 +msgid "System Updates" +msgstr "Sistemaj ĝisdatigoj" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:72 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3232 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Ĝeneralaj sistemaj ĝisdatigoj, kiel sekureco aŭ korektoj de cimoj, kaj agado-" +"plibonigoj." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s ĝisdatigo kun novaj funkcioj kaj korektoj." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1276 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS-ĝisdatigoservo ne povis akiri kaj apliki la ĝisdatigon." + +#: plugins/epiphany/gs-plugin-epiphany.c:500 +#: plugins/epiphany/gs-plugin-epiphany.c:504 +msgid "Web App" +msgstr "Reteja aplikaĵo" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Retaplikaĵa subteno" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Ruli popularajn retaplikaĵojn en foliumilo" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:254 +msgid "Downloading upgrade information…" +msgstr "Elŝutante informojn pli altgradigo…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:402 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Altgradigi por la plej freŝdataj funkcioj, kaj rendimentaj kaj stabilecaj " +"plibonigoj." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak-subteno" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +#, fuzzy +#| msgid "Flatpak is a framework for desktop applications on Linux" +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak estas framo por labortablaj aplikaĵoj sur Linukso" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:326 +#, fuzzy, c-format +#| msgid "System Services" +msgid "System folder %s" +msgstr "Sistemaj servoj" + +#: plugins/flatpak/gs-flatpak.c:327 plugins/flatpak/gs-flatpak.c:328 +#, fuzzy, c-format +#| msgid "Home folder" +msgid "Home subfolder %s" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:329 +#, fuzzy +#| msgid "Home folder" +msgid "Host system folders" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:330 +msgid "Host system configuration from /etc" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:331 +#, fuzzy +#| msgid "Home folder" +msgid "Desktop folder" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:331 +#, c-format +msgid "Desktop subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:332 +#, fuzzy +#| msgid "Home folder" +msgid "Documents folder" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:332 +#, fuzzy, c-format +#| msgid "Home folder" +msgid "Documents subfolder %s" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:333 +#, fuzzy +#| msgctxt "Menu of Audio & Video" +#| msgid "Music Players" +msgid "Music folder" +msgstr "Muzikludiloj" + +#: plugins/flatpak/gs-flatpak.c:333 +#, fuzzy, c-format +#| msgctxt "Menu of Audio & Video" +#| msgid "Music Players" +msgid "Music subfolder %s" +msgstr "Muzikludiloj" + +#: plugins/flatpak/gs-flatpak.c:334 +#, fuzzy +#| msgid "Home folder" +msgid "Pictures folder" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:334 +#, c-format +msgid "Pictures subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:335 +msgid "Public Share folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:335 +#, c-format +msgid "Public Share subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:336 +#, fuzzy +#| msgid "Home folder" +msgid "Videos folder" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:336 +#, c-format +msgid "Videos subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:337 +#, fuzzy +#| msgid "Home folder" +msgid "Templates folder" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:337 +#, c-format +msgid "Templates subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:338 +msgid "User cache folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:338 +#, c-format +msgid "User cache subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:339 +msgid "User configuration folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:339 +#, c-format +msgid "User configuration subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:340 +msgid "User data folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:340 +#, c-format +msgid "User data subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:341 +#, fuzzy +#| msgid "Home folder" +msgid "User runtime folder" +msgstr "Hejmdosierujo" + +#: plugins/flatpak/gs-flatpak.c:341 +#, c-format +msgid "User runtime subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:399 +#, c-format +msgid "Filesystem access to %s" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1426 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Prenante Flatpak-metadatumojn por %s…" + +#: plugins/flatpak/gs-flatpak.c:3612 +#, fuzzy, c-format +#| msgid "Unable to find “%s”" +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Ne eblas trovi “%s”" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +#, fuzzy +#| msgid "Installation" +msgid "User Installation" +msgstr "Instalcelo" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +#, fuzzy +#| msgid "System Integration" +msgid "System Installation" +msgstr "Sistema integrigo" + +#: plugins/flatpak/gs-plugin-flatpak.c:1320 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1334 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1601 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, fuzzy, c-format +#| msgid "The battery level is too low" +msgid "Device battery power is too low" +msgstr "Bateria nivelo tro malalta" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +#, fuzzy +#| msgid "Device cannot be used during update." +msgid "Device cannot be used while the lid is closed" +msgstr "Ne eblas uzi la aparaton dum ĝisdatigo." + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:219 +#, c-format +msgid "%s Device Update" +msgstr "%s Ĝisdatigo de aparato" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:224 +#, fuzzy, c-format +#| msgid "%s System" +msgid "%s System Update" +msgstr "%s sistemo" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:229 +#, fuzzy, c-format +#| msgid "%s Embedded Controller" +msgid "%s Embedded Controller Update" +msgstr "%s integrita kontrolilo" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:234 +#, fuzzy, c-format +#| msgid "Update" +msgid "%s ME Update" +msgstr "Ĝisdatigi" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:239 +#, fuzzy, c-format +#| msgid "%s Corporate ME" +msgid "%s Corporate ME Update" +msgstr "%s korporacia ME" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:244 +#, fuzzy, c-format +#| msgid "%s Consumer ME" +msgid "%s Consumer ME Update" +msgstr "%s konsumanta ME" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:250 +#, fuzzy, c-format +#| msgid "%s Controller" +msgid "%s Controller Update" +msgstr "%s kontrolilo" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:256 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Ĝisdatigo de Thunderbolt-kontrolilo" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:261 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s Ĝisdatigo de CPU-mikrokodo" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:266 +#, fuzzy, c-format +#| msgid "%u Application Updated" +#| msgid_plural "%u Applications Updated" +msgid "%s Configuration Update" +msgstr "%s Ĝisdatigo de agordo" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:270 +#, fuzzy, c-format +#| msgid "Restart & Update" +msgid "%s Battery Update" +msgstr "%s Ĝisdatigo de baterio" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:275 +#, fuzzy, c-format +#| msgid "Restart & Update" +msgid "%s Camera Update" +msgstr "%s Ĝisdatigo de kamerao" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:279 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM-ĝisdatigo" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:283 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s Ĝisdatigo de tuŝplato" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:287 +#, c-format +msgid "%s Mouse Update" +msgstr "%s Ĝisdatigo de muso" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:291 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s Ĝisdatigo de klavaro" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:295 +#, fuzzy, c-format +#| msgid "%s Controller" +msgid "%s Storage Controller Update" +msgstr "%s Ĝisdatigo de Stoka regilo" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:300 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s Ĝisdatigo de reta interfaco" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:305 +#, c-format +msgid "%s Display Update" +msgstr "%s Ekrana ĝisdatigo" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:310 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC-ĝisdatigo" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:315 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s Ĝisdatigo de USBa ricevilo" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:319 +#, c-format +msgid "%s Drive Update" +msgstr "%s Drive ĝisdatigo" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:323 +#, fuzzy, c-format +#| msgid "%s has been updated." +msgid "%s Flash Drive Update" +msgstr "%s Ĝisdatigo de Flash Drive" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:328 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD-ĝisdatigo" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:333 +msgid "%s GPU Update" +msgstr "%s Ĝisdatigo de GPU" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:338 +#, fuzzy, c-format +#| msgid "Failed To Update" +msgid "%s Dock Update" +msgstr "%s Doka ĝisdatigo" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:343 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s Ĝisdatigo por USB-doko" + +#: plugins/fwupd/gs-plugin-fwupd.c:1656 +#, fuzzy +#| msgid "The update could not be completed." +msgid "Firmware update could not be applied: " +msgstr "Mikroprogramo-ĝisdatigo ne povis esti aplikata:" + +#: plugins/fwupd/gs-plugin-fwupd.c:1788 +msgid "Firmware" +msgstr "Mikroprogramo" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Subteno por mikroprograma ĝisdatigo" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Provizas subtenon por mikroprogramaj ĝisdatigoj" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Ĉu instali nesubskribitan programaron?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Programaro instalota ne estas subskribita. Ne eblos kontroli la originon de " +"ĝisdatigoj de ĉi tiu programaro, aŭ ĉu ĝisdatigoj estis mistraktitaj." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Ĉu elŝuti nesubskribitan programaron?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Nesubskribitaj ĝisdatigoj haveblas. Sen subskribo, ne eblas kontroli la " +"originon de la ĝisdatigo, aŭ ĉu ĝi estis mistraktita." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Ĉu ĝisdatigi nesubskribitan programaron?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Nesubskribitaj ĝisdatigoj haveblas. Sen subskribo, ne eblas kontroli la " +"originon de la ĝisdatigo, aŭ ĉu ĝi estis mistraktita. Programaj ĝisdatigoj " +"estos malŝaltitaj ĝis nesubskribitaj ĝisdatigoj estas aŭ forigitaj aŭ " +"ĝisdatigitaj." + +#: plugins/packagekit/gs-plugin-packagekit.c:349 +msgid "Packages" +msgstr "Pakaĵoj" + +#: plugins/packagekit/gs-plugin-packagekit.c:3147 +msgid "Failed to install updates: " +msgstr "Malsukcesis instali ĝisdatigojn:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2941 +msgid "Operating System (OSTree)" +msgstr "Operaciumo (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap-butiko" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap-subteno" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snapo estas universala Linuksa pakaĵo" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..d198e80 --- /dev/null +++ b/po/es.po @@ -0,0 +1,8922 @@ +# Spanish translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Rodrigo , 2018. +# germe , 2021. +# Daniel Mustieles , 2021-2024. +# Daniel Mustieles García , 2024-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-28 13:49+0000\n" +"PO-Revision-Date: 2025-03-03 14:15+0100\n" +"Last-Translator: Daniel Mustieles García \n" +"Language-Team: Spanish - Spain \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 47.1\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instalar y actualizar aplicaciones" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Software le permite buscar e instalar aplicaciones nuevas y extensiones del " +"sistema y quitar aplicaciones instaladas." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Software muestra aplicaciones destacadas y populares con descripciones " +"útiles y múltiples capturas de pantalla por aplicación. Las aplicaciones se " +"pueden encontrar navegando por la lista de categorías o buscando. También le " +"permite actualizar su sistema mediante una actualización fuera de línea." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Página de vista general" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panel de detalles" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panel de instalados" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel de actualizaciones" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Los detalles de la actualización" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "El proyecto GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Probar clave akmods en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Se necesita autenticación para probar la clave akmods en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Incluir clave akmods en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Se necesita autenticación para incluir la clave akmods en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Probar clave DKMS en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Se necesita autenticación para probar la clave DKMS en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Incluir clave DKMS en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Se necesita autenticación para incluir la clave DKMS en Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalar un archivo «appstream» en una ubicación del sistema" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instalando un archivo «appstream» en una ubicación del sistema" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Una lista de proyectos compatibles" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Esta es una lista completa de proyectos compatibles que se deben mostrar, " +"tales como GNOME, KDE y XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Indica si se deben gestionar las actualizaciones y cambios de versión en " +"GNOME Software" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Si está desactivada, GNOME Software ocultará el panel de actualizaciones y " +"no realizará ninguna actualización automática ni notificará sobre versiones " +"nuevas." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Descargar e instalar las actualizaciones automáticamente" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Si está activada, Gnome Software descarga actualizaciones automáticamente en " +"segundo plano e instala sólo las que no requieren reiniciar." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notificar al usuario sobre el software actualizado en segundo plano" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Si está activada, GNOME Software notifica al usuario sobre las " +"actualizaciones realizadas cuando el usuario estaba inactivo." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Indica si se debe actualizar automáticamente en una conexión medida" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Si está activada, GNOME Software actualiza automáticamente en segundo plano " +"incluso al usar una conexión medida (descargando eventualmente algunos " +"metadatos, comprobando si hay actualizaciones, etc., lo que puede acarrear " +"costes al usuario)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Indica si es la primera ejecución de GNOME Software" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Mostrar puntuación de estrellas junto a las aplicaciones" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtrar aplicaciones basándose en el conjunto de ramas predeterminadas de la " +"ubicación remota" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Las aplicaciones no libres muestran un diálogo de advertencia antes de " +"instalarse" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Cuando se instalan aplicaciones no libres, se puede mostrar un diálogo de " +"advertencia. Esto controla si se suprime este diálogo." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "La marca de tiempo de la última comprobación de actualizaciones" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "La marca de tiempo de la última notificación de actualización" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "La marca de tiempo de la última notificación de actualización" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"La marca de tiempo de la primera actualización de seguridad, eliminada " +"después de actualizar" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "La marca de tiempo de la última actualización" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"La edad en segundos para verificar si la captura de pantalla oficial sigue " +"siendo válida" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Elegir un valor más grande implica menos consultas al servidor remoto, pero " +"las actualizaciones de las capturas de pantalla pueden tardar más en " +"mostrarse al usuario. El valor 0 implica no comprobar nunca el servidor " +"remoto si la imagen ya existe en la caché." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "El servidor que usar para las opiniones sobre las aplicaciones" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "La puntuación mínima de karma para las opiniones" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Las opiniones con menos karma que este número no se mostrarán." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Una lista de repositorios oficiales que no se deben considerar terceras " +"partes" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Una lista de repositorios necesarios que no se pueden desactivar ni eliminar" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Una lista de repositorios oficiales que se deben considerar software libre" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"El URL de la licencia que usar cuando se deba considerar que una aplicación " +"es software libre" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Instalar paquetes de aplicaciones para todos los usuarios del sistema cuando " +"sea posible" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Permitir acceso al diálogo de repositorios de software" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Ofrece actualizaciones para publicaciones preliminares" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Mostrar algunos elementos de la IU que informen al usuario que la aplicación " +"no es libre" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Mostrar el tamaño correspondiente en la lista de aplicaciones instaladas" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://es.wikipedia.org/wiki/Software_propietario'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "El URI que explica el software propietario y el no libre" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Una lista de URL que apuntan a archivos «appstream» que se descargarán en " +"una carpeta catálogo de software" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instalar los archivos «AppStream» en una ubicación del sistema para todos " +"los usuarios. Si es falso, los archivos se instalan en la carpeta " +"$XDG_DATA_HOME/swcatalog/xml no estándar" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Se prefiere el orden de prioridad de los formatos de empaquetador, con los " +"formatos más importantes enumerados primero. Un vector vacío significa el " +"orden predeterminado. Se supone que los formatos omitidos se enumeran en " +"último lugar. Ejemplos de formatos de paquetes osn: deb, flatpak, rpm, snap. " +"Los formatos pueden especificarse opcionalmente con un nombre de origen, " +"divido por dos puntos, por ejemplo «flatpak:flathub»." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"La marca de tiempo del último intento de quitar rutinas de Flatpak no usadas" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Establecer a 'true' para mostrar sólo las aplicaciones con licencias libres " +"y ocultar las propietarias." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Establecer a 'true' para mostrar sólo las aplicaciones cuyos desarrolladores " +"se han verificado." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "" +"La marca de tiempo de la primera actualización recibida históricamente." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Una cadena que guarda el ID de la cuenta en línea de GNOME usada para " +"iniciar sesión" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Instalador de Appstream en todo el sistema de GNOME Software" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Falló al analizar opciones de la línea de comandos" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Debe especificar exactamente un nombre de archivo" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Este programa sólo lo puede usar el usuario «root»" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Falló al validar el tipo de contenido: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Falló al mover: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalar software" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instalar el software seleccionado en el sistema" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violencia con personajes animados" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "No hay información sobre violencia con personajes animados" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violencia fantástica" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "No hay información sobre violencia fantástica" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violencia realista" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "No hay información sobre violencia realista" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violencia con derramamiento de sangre" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "No hay información sobre derramamiento de sangre" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violencia sexual" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "No hay información sobre violencia sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "No hay información sobre referencias a bebidas alcohólicas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Drogas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "No hay información sobre drogas ilegales" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabaco" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "No hay información sobre productos de tabaco" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Desnudos" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "No hay información sobre desnudos de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Temas sexuales" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "No hay información sobre representaciones o referencias sexuales" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Blasfemia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "No hay información sobre blasfemia de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Humor inapropiado" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "No hay información sobre humor inapropiado" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminación" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "No hay información sobre lenguaje discriminatorio de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Publicidad" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "No hay información sobre publicidad de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Juego" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "No hay información sobre apuestas de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Compras" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "No hay información sobre la posibilidad de gastar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Chat entre usuarios" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "No hay información sobre la posibilidad de chatear con otros jugadores" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Chat con sonido entre usuarios" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "No hay información sobre la posibilidad de hablar con otros jugadores" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detalles del contacto" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"No hay información sobre compartición en redes sociales de nombres de " +"usuario o direcciones de correo-e" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Información de identificación" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"No hay información sobre compartición la información del usuario con terceros" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Compartición de la ubicación" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"No hay información sobre compartición la ubicación física con otros usuarios" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualidad" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "No hay información sobre referencias a la homosexualidad" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitución" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "No hay información sobre referencias a la prostitución" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adulterio" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "No hay información sobre referencias al adulterio" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Caracteres sexualizados" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "No hay información sobre personajes sexualizados" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanación" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "No hay información sobre referencias a la profanación" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Restos humanos" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "No hay información sobre restos mortales humanos visibles" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Esclavitud" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "No hay información sobre referencias a la esclavitud" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "No hay información sobre referencias a drogas ilegales" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "No incluye palabrotas, blasfemias y otros tipos de lenguaje fuerte." + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "No incluye anuncios o transacciones monetarias" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "No incluye sexo o desnudos" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "No incluye ninguna funcionalidad de chat sin controlar entre jugadores" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "No incluye violencia" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogas" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Lenguaje fuerte" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Dinero" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violencia" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Todo" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s tiene una calificación por edad desconocida" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s es adecuado para todo el mundo" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s es adecuado para niños pequeños (hasta 3 años)" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s es adecuado para niños pequeños (hasta 5 años)" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s es adecuado para niños" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s es adecuado para adolescentes" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s es adecuado para adultos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s es adecuado para %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Calificación por edad" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Cómo añadir la información que falta" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Archivo local" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paquete" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Pendiente" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Instalación pendiente" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Eliminación pendiente" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Instalando" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Quitando" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Descargando" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instalar" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Desinstalar…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Red" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Se puede comunicar a través de la red" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Servicios del sistema" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "No se puede acceder a los servicios de D-Bus en el bus del sistema" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Servicios de la sesión" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "No se puede acceder a los servicios de D-Bus en el bus de sesión" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Dispositivos" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Puede acceder a dispositivos arbitrarios tales como cámaras web" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Puede acceder a los dispositivos de entrada" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Puede acceder a los micrófonos y reproducir sonido" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Puede acceder a los archivos de dispositivos del sistema" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Contenido de la pantalla" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Puede acceder al contenido de la pantalla" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Carpeta personal" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Puede ver, editar y crear archivos" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Puede ver archivos" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistema de archivos" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Carpeta de descargas" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Configuración" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Puede ver y modificar cualquier configuración" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistema de visualización heredado" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Usa un sistema de visualización antiguo e inseguro" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Salir del aislamiento" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Puede salir del aislamiento y evitar otras restricciones" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "No hay ninguna descripción disponible sobre la actualización." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Detalles de la actualización" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Necesita permisos adicionales" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Puntuaciones recibidas del servidor no válidas" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "No se pudo comunicar con el servidor de puntuaciones" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Opiniones" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "No se han encontrado opiniones para esa aplicación." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "No hay opiniones" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Histórico de versiones" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Nuevo en la versión %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versión %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "No hay detalles disponibles para esta publicación" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e de %B de %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Modo de inicio, puede ser «actualizaciones», «actualizados», «instalados» o " +"«vista general»" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODO" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Buscar aplicaciones" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "BUSCAR" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Mostrar los detalles de la aplicación (usando el ID de la aplicación)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Mostrar los detalles de la aplicación (usando el nombre del paquete)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PAQUETE" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instalar la aplicación (usando el ID de la aplicación)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Desinstalar la aplicación (usando el ID de la aplicación)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Abrir un archivo de paquete local" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "ARCHIVO" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"El tipo de interacción esperada para esta acción: puede ser «none», «notify» " +"o «full»" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACCIÓN" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Mostrar un archivo de appdata o metainformación local" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Activa la salida de depuración detallada (desde la instancia en ejecución, " +"si ya lo está)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instala cualquier actualización pendiente en segundo plano" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Mostrar las preferencias" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Salir de la instancia en ejecución" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferir las fuentes de archivos locales a las de AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Mostrar el número de versión" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 colaboradores de GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Daniel Mustieles , 2013-2021" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "No hay detalles para esa aplicación." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Tamaño instalado" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Incluye %s de datos y %s de caché." + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Incluye %s de datos" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Incluye %s de caché" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Uso de datos y de caché desconocido" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Tamaño de la descarga" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "No hacen falta descargas del sistema adicionales" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Necesita un tamaño desconocido de descargas del sistema adicionales" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Necesita %s de descargas del sistema adicionales" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Tamaño desconocido" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Sin permisos" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Tiene acceso a la red" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Usa servicios del sistema" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Usa servicios de la sesión" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Puede acceder a los dispositivos del sistema" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Puede acceder a los dispositivos del sistema" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Puede leer y escribir todos sus datos" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Puede leer todos sus datos" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Puede leer/escribir sus descargas" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Puede leer sus descargas" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Puede acceder a ciertos archivos específicos" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Puede acceder y modificar la configuración del usuario" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Usa un sistema de ventanas heredado" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Puede obtener permisos arbitrarios" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "El desarrollador del software está verificado" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Revisada por el distribuidor del SO" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Revisada por %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Proporcionada por un tercero" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Software no soportado" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Código auditable" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Licencia desconocida" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Código propietario" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Licencia especial" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Privilegiada" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Segura" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Probablemente segura" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potencialmente insegura" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "No seguro" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Sólo para móvil" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Sólo funciona en pantallas pequeñas" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Sólo para escritorio" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Sólo funciona en pantallas grandes" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "El tamaño de la pantalla no coincide" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "No soporta su tamaño de pantalla actual" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Requiere una pantalla táctil" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Requiere un teclado" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Requiere un ratón" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Se necesita un mando de juego" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Requiere un mando para jugar" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptativo" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Funciona en móviles, tabletas y escritorios" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Probablemente requiera un teclado o un ratón" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Funciona en escritorios y portátiles" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "No contiene contenido inapropiado por edad" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "No hay información disponible sobre el rango de edad" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visitar la página web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instalar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Cancelar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instalar" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Descargar" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Actualizar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Desinstalar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Desinstalando" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Actualización crítica" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "No se puede usar el dispositivo durante la actualización." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Fuente: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Renombrado desde %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Se ha dejado de recibir actualizaciones" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Actualización crítica" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalado" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Ayudar a traducir %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s está diseñado, desarrollado y traducido por una comunidad internacional " +"de voluntarios.\n" +"\n" +"Esto significa que si todavía no está disponible en su idioma puede " +"involucrarse y ayudar a traducirlo." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traducciones" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Página web de la traducción" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Inicio de sesión remoto para %s requerido (reino %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Se necesita iniciar sesión" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Cancelar" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "Iniciar _sesión" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Usuario" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Contraseña" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Otros" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Todas" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Destacado" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Selección de los editores" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nuevo y actualizado" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Imágenes de la web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Otro software" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s (Instalada)" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Se debe reiniciar para aplicar los cambios" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "La aplicación está lista para usarse" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Actualizaciones del sistema instaladas" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "" +"Las actualizaciones instaladas recientemente están disponibles para su " +"revisión" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Reiniciar" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Lanzar" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "¿Instalar software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "¿Instalar software de terceros?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "¿Activar el repositorio de software?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "¿Activar el repositorio de software de terceros?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s no es software libre, lo proporciona «%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s lo proporciona «%s»." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Este repositorio de software debe estar activado para continuar la " +"instalación." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Puede ser ilegal instalar o usar %s en algunos países." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Puede ser ilegal instalar o usar este codificador en algunos países." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "No _advertir otra vez" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Activar e _instalar" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Los errores detallados del gestor de paquetes son:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detalles" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Cerrar" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Detalles copiados al portapapeles" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Aceptar" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Se ha instalado una actualización" +msgstr[1] "Se han instalado las actualizaciones" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Se ha desinstalado una aplicación" +msgstr[1] "Se han desinstalado las aplicaciones" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Se debe reiniciar para aplicar el cambio" +msgstr[1] "Se debe reiniciar para aplicar los cambios" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Ahora no" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Hoy" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Ayer" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "hace %d día" +msgstr[1] "hace %d días" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "hace %d semana" +msgstr[1] "hace %d semanas" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "hace %d mes" +msgstr[1] "hace %d meses" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "hace %d año" +msgstr[1] "hace %d años" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Ahora mismo" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "hace %d minuto" +msgstr[1] "hace %d minutos" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "hace %d hora" +msgstr[1] "hace %d horas" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Todo" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Gráficos 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografía" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Escaneado" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Gráficos vectoriales" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visores" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Creación y edición de sonido" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Reproductores de música" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Todo" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendario" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Base de datos" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finanzas" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Procesador de textos" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editores de texto" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navegadores web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Todo" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Acción" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventuras" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Bloques" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Tablero" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartas" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emuladores" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Infantiles" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Lógica" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Juegos de rol" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Deportes" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estrategia" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Todo" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chat" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Todo" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Inteligencia artificial" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomía" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Química" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Idiomas" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matemáticas" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Noticias" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robótica" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Arte" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografía" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Cómics" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Ficción" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Salud" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historia" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Estilo de vida" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Política" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Deportes" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Todo" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Depuradores" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "EID" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codificadores" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Controladores hardware" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Tipografías" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Fuentes de entrada" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Paquetes de idiomas" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localización" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Crear" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Trabajo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Juegos" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Aprendizaje" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Desarrollo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codificadores" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Controladores hardware" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Tipografías" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Fuentes de entrada" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Paquetes de idiomas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Localización" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Una aplicación" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s necesita soporte para formatos de archivos adicionales." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Se necesitan tipos MIME adicionales" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s necesita tipografías adicionales." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Se necesitan tipografías adicionales" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s necesita codificadores multimedia adicionales." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Se necesitan codificadores multimedia adicionales" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s necesita controladores de impresora adicionales." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Se necesita controladores de impresora adicionales" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s necesita paquetes adicionales." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Se necesitan paquetes adicionales" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Buscar en Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Mostrar más" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Mostrar menos" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Quitando…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Requiere reiniciar para terminar la instalación" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Requiere reiniciar para terminar la eliminación" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Instalación pendiente…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Actualización pendiente…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Descargando…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Preparando…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Desinstalando…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s no está instalada pero todavía tiene datos." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Reiniciar" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "Ac_tivar…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instalar…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s se mostrará en inglés de EE.UU." + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Esta aplicación se mostrará en inglés de EE.UU." + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Este software se mostrará en inglés de EE.UU." + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Ayudar a _traducir" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Otras aplicaciones por %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "El desarrollador %s ha probado la propiedad de %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "El desarrollador la probado la propiedad de %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Necesita acceso a Internet para escribir una opinión" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Esta aplicación ya no recibirá actualizaciones, incluyendo parches de " +"seguridad." + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Esta aplicación ya lo proporciona su distribución y no se debe reemplazar." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Esta aplicación no proporciona enlaces a un sitio web, repositorio de código " +"o gestor de incidencias." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Este software ya no recibirá actualizaciones, incluyendo parches de " +"seguridad." + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Este software ya lo proporciona su distribución y no se debe reemplazar." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Este software no proporciona enlaces a un sitio web, repositorio de código o " +"gestor de incidencias." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Software falló al obtener información para «%s» y no puede mostrar los " +"detalles para esta aplicación." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Respuesta recibida del servidor no válida" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Falló al enviar la revisión para «%s»: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Página de detalles" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Cargando detalles de la aplicación" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verificados" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Abrir" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Actualizar" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Desinstalar" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Complementos" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Esta aplicación sólo se puede usar cuando hay una conexión activa a Internet." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Repositorio de software incluido" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Esta aplicación incluye un repositorio de software que proporciona " +"actualizaciones, así como acceso a otro software." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Ningún repositorio de software incluido" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Esta aplicación no incluye un repositorio de software. No se actualizará con " +"versiones nuevas." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Repositorio de software identificado" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Añadir este repositorio de software le dará acceso a software y " +"actualizaciones adicionales." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Use sólo repositorios de software en las que confíe." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Limpiar datos de la aplicación" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Eliminar datos" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "No hay metadatos" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Página _web del proyecto" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Donar" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Colaborar con las traducciones" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "Infor_mar de un problema" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Ay_uda" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contacto" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Escribir una opinión" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Todas las opiniones" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "No se pueden mostrar los detalles de la aplicación" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Falló al preparar el reinicio" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Error desconocido" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "No se encontró la clave" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "La clave no está incluida" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Se necesita registrar MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Siguiente" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Este dispositivo tiene Secure Boot activado. Para poder activar " +"controladores nuevos se debe añadir una nueva clave de propietario de " +"máquina (MOK). El proceso requiere que se introduzca una contraseña. Anote " +"la siguiente contraseña asociada a la clave:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "He hecho una anotación de la _contraseña MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Reiniciar y registrar…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instrucciones de instalación: leer con atención" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Después de reiniciar se mostrará una pantalla de configuración del " +"dispositivo. Para activar controladores nuevos, siga estos pasos:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Seleccione «Enroll MOK»”\n" +"• Seleccione «Yes» para añadir las claves\n" +"• Introduzca la contraseña de la MOK cuando se le pida\n" +"• Seleccione «Reboot»" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Implicaciones de seguridad" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Después de añadir la clave correctamente, tenga en cuenta que se confiará " +"directamente en las futuras actualizaciones de este módulo o de cualquier " +"otro. Todas las actualizaciones futuras se harán de manera transparente sin " +"interacción ni autorización." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Puede encontrar más ayuda en las páginas de la documentación." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Descargando metadatos adicionales de archivos…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " y " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tipografías disponibles para el script %s" +msgstr[1] "Tipografías disponibles para los scripts %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Software disponible para %s" +msgstr[1] "Software disponible para %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Software solicitado no encontrado" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "No se pudo encontrar el software solicitado" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s no encontrada" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "en la página web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "No hay aplicaciones disponibles que proporcionen el archivo %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"La información sobre %s, así como opciones sobre cómo obtener las " +"aplicaciones que faltan, se puede encontrar en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "No hay aplicaciones disponibles para soportar %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s no está disponible." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"La información sobre %s, así como opciones sobre cómo obtener una aplicación " +"que pueda soportar este formato, se puede encontrar en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "No hay tipografías disponibles para el soporte del script %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"La información sobre %s, así como opciones sobre cómo obtener tipografías " +"adicionales se puede encontrar en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "No hay códecs disponibles para el formato %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"La información sobre %s, así como opciones sobre cómo obtener un códec que " +"pueda reproducir este formato se puede encontrar en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "No hay recursos de Plasma disponibles para soportar %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"La información sobre %s, así como opciones sobre cómo obtener recursos de " +"Plasma adicionales se puede encontrar en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "No hay controladores de impresora disponibles para %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"La información sobre %s, así como opciones sobre cómo obtener un controlador " +"que soporte esta impresora se puede encontrar en %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "la documentación" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"No se pudo encontrar el %s solicitado por %s. Consulte %s para obtener más " +"información." +msgstr[1] "" +"No se pudieron encontrar los %s solicitados por %s. Consulte %s para obtener " +"más información." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"No se pudo encontrar el %s que estaba buscando. Consulte %s para obtener más " +"información." +msgstr[1] "" +"No se pudieron encontrar los %s que estaba buscando. Consulte %s para " +"obtener más información." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Falló al buscar cualquier resultado: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "formato de archivo %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "_Instalar todas" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "No se pudo encontrar el software solicitado" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Página de codificadores" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "No se encontraron resultados" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "No se pudo hacer la búsqueda" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Anterior" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Siguiente" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Lista de aplicaciones destacadas" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Soporte de escritorio" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Soporta el uso en pantallas grandes" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Soporte de escritorio desconocido" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"No hay información suficiente para saber si las pantallas grandes están " +"soportadas" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Requiere una pantalla grande" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Escritorio no soportado" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "No se puede usar en una pantalla grande" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Soporte de móvil" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Soporta el uso en pantallas pequeñas" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Soporte de móvil desconocido" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"No hay información suficiente para saber si las pantallas pequeñas están " +"soportadas" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Requiere una pantalla pequeña" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Móvil no soportado" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "No se puede usar en pantallas pequeñas" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Soporte de teclado" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Soporte de teclado desconocido" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "No hay información suficiente para saber si el teclado está soportado" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Se requiere un teclado" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Soporta un teclado" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Teclado no soportado" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "No se puede usar con un teclado" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Soporte de ratón" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Requiere un ratón o un dispositivo apuntador" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Soporte de ratón desconocido" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"No hay información suficiente para saber si los ratones o los dispositivos " +"apuntadores están soportados" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Se necesita un ratón" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Soporta ratón y dispositivos apuntadores" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Ratón no soportado" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "No se puede usar con un ratón o un dispositivo apuntador" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Soporte de pantalla táctil" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Soporte de pantalla táctil desconocido" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"No hay información suficiente para saber si las pantallas táctiles están " +"soportadas" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Se necesita una pantalla táctil" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Soporta pantallas táctiles" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Pantalla táctil no soportada" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "No se puede usar con una pantalla táctil" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Se necesita un mando de juego" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Necesita un mando para jugar" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Soporte de mandos de juego" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Mandos de juego soportados" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s posiblemente funcione en este dispositivo" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s funciona en este dispositivo" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s posiblemente funcione en este dispositivo" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s no funciona adecuadamente en este dispositivo" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s no funciona en este dispositivo" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Soporte de hardware" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navegación" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navegar para explorar la página" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navegar a la página de instalados" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navegar a la página de actualizaciones" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Abrir la barra de búsqueda" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Ventanas" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Abrir Preferencias" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Abrir repositorios de software" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Ayuda" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Abrir Atajos del teclado" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalado" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Página de instalados" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "En proceso" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplicaciones" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Aplicaciones web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Aplicaciones del sistema" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Construido por la comunidad" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Involucrarse" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Esta aplicación la desarrolla abiertamente una comunidad internacional de " +"voluntarios y se publica bajo la licencia %s.\n" +"\n" +"Puede colaborar y ayudar a hacerla aún mejor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Esta aplicación la desarrolla abiertamente una comunidad internacional de " +"voluntarios y se publica bajo la licencia %s.\n" +"\n" +"Puede colaborar y ayudar a hacerla aún mejor." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este software lo desarrolla abiertamente una comunidad internacional de " +"voluntarios y se publica bajo la licencia %s.\n" +"\n" +"Puede colaborar y ayudar a hacerlo aún mejor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este software lo desarrolla abiertamente una comunidad internacional de " +"voluntarios y se publica bajo la licencia %s.\n" +"\n" +"Puede colaborar y ayudar a hacerlo aún mejor." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Licencia desconocida" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Aprender más" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Esta aplicación no se desarrolla en abierto por lo que sólo los " +"desarrolladores saben cómo funciona. Puede ser difícil decir si el software " +"es seguro o no y puede cambiar sin control.\n" +"\n" +"Es posible que no pueda colaborar con esta aplicación." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software no se desarrolla en abierto por lo que sólo los " +"desarrolladores saben cómo funciona. Puede ser difícil decir si el software " +"es seguro o no y puede cambiar sin control.\n" +"\n" +"Es posible que no pueda colaborar con este software." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Propietario" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Esta aplicación no se desarrolla en abierto por lo que sólo los " +"desarrolladores saben cómo funciona. Puede ser difícil decir si el software " +"es seguro o no y puede cambiar sin control.\n" +"\n" +"Es posible que no pueda colaborar con esta aplicación." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Este software no se desarrolla en abierto por lo que sólo los " +"desarrolladores saben cómo funciona. Puede ser difícil decir si el software " +"es seguro o no.\n" +"\n" +"Es posible que no pueda colaborar con este software." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Licencia especial" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Esta aplicación esta desarrollada bajo la licencia especial %s.\n" +"\n" +"Tal vez pueda o no colaborar con esta aplicación." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Esta aplicación esta desarrollada bajo la licencia especial «%s».\n" +"\n" +"Tal vez pueda o no colaborar con esta aplicación." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software esta desarrollada bajo la licencia especial %s.\n" +"\n" +"Tal vez pueda o no colaborar con esta aplicación." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software esta desarrollada bajo la licencia especial «%s».\n" +"\n" +"Tal vez pueda o no colaborar con esta aplicación." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Actualizando los datos" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Cargando página" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Iniciando" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "fuente desconocida" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Usuario" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Añadidos" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Eliminados" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Actualizaciones" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Bajadas de versión" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "fuentes externas seleccionadas" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Proporciona acceso a software adicional desde %s. Se incluye algún software " +"propietario.\n" +"\n" +"Puede activar posteriormente esos repositorios en las preferencias de " +"repositorios de software." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "¿Activar el repositorio de software de terceros?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorar" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "Ac_tivar" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Dispnible para su sistema operativo" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Disponible para %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Explorar" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Página de vista general" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Aplicaciones disponible" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Otras categorías" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "No se han encontrado datos sobre la aplicación" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Desconocido" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Aceptar" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "El usuario ha rechazado la instalación" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Preparar %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "¿Está seguro de querer quitar el repositorio %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Se desinstalarán todas las aplicaciones de %s y deberá volver a instalar el " +"repositorio para poder usarlas de nuevo." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "¿Quiere desinstalar %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "No será posible usar %s después de eliminarla." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"No será posible usar ninguna aplicación que dependa de %s después de " +"eliminarla." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"No será posible usar %s después de eliminarla y cualquier documento que la " +"use aparecerá con una tipografía diferente." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"No será posible usar %s después de eliminarla. Esto significa que algunos " +"archivos de medios no se podrán reproducir." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"El hardware que dependa de %s puede no funcionar correctamente después de la " +"eliminación." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"No será posible usar %s después de eliminarla. Los datos de la aplicación y " +"su configuración se conservarán en el disco, para permitir restaurar la " +"aplicación en el futuro." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferencias" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Actualizaciones de software" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Más información" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Comprobar y descargar actualizaciones usa datos y energía. La funcionalidad " +"de actualización automática está por lo tanto pausada en conexiones a redes " +"medidas y cuando el modo de ahorro de energía está activado." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automáticas" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Comprobar y descargar las actualizaciones automáticamente" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Comprobar y descargar las actualizaciones se debe hacer manualmente" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Notificaciones de actualizaciones automáticas" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Notificar cuando las actualizaciones se instalen automáticamente" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtros de contenido" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Mostrar sólo software _libre" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Ocultar el software propietario al explorar y buscar" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Mostrar sólo los desarrolladores _verificados" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Mostrar sólo las aplicaciones de desarrolladores cuya identidad se ha " +"verificado" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"El software instalado no es compatible con %s y se eliminará automáticamente " +"durante la actualización." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Software incompatible" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Actualizar" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Desinstalar" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Configuración y datos de la aplicación" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Conservar" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Permite restaurar la configuración de la aplicación y su contenido" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Eliminar" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Elimina permanentemente los datos para ahorrar espacio" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "El software instalado desde «%s» ya no recibirá actualizaciones." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "¿Quiere desactivar el repositorio?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "¿Quiere quitar el repositorio?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Desactivar" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Quitar" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Activar repositorios nuevos" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Activar los repositorios nuevos al añadirlos" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "más información" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Repositorios adicionales de terceras partes. — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Repositorios de terceras partes de Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "el sistema operativo" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Estos repositorios complementan el software predeterminado proporcionado por " +"%s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Repositorios de software" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "No hay repositorios" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplicación instalada" +msgstr[1] "%u aplicaciones instaladas" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u complemento instalado" +msgstr[1] "%u complementos instalados" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u app" +msgstr[1] "%u apps" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u complemento" +msgstr[1] "%u complementos" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s y %s instalado" +msgstr[1] "%s y %s instalados" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Comprobando el software instalado…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Eliminar" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "La odio" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "No me gusta" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Está bien" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Me gusta" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Me encanta" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Seleccione una estrella para dejar una puntuación" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Dedique un poco más de tiempo a escribir la opinión" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Elija una puntuación" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "El resumen es demasiado corto" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "El resumen es demasiado largo" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "La descripción es demasiado corta" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "La descripción es demasiado larga" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Escribir una opinión" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Enviar" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Proporcione una calificación, un resumen y un texto de revisión. Las reseñas " +"no deben usarse para informar problemas: en su lugar, comuníquese con el " +"desarrollador o con su proveedor de soporte." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Resumen de la opinión" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Escribir una opinión breve" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Conozca qué datos se envían en nuestra política de privacidad. El nombre completo de su cuenta se " +"mostrará públicamente." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u revisión total" +msgstr[1] "%u revisiones totales" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "de 5 estrellas" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Desconocido" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Puede informar sobre opiniones con comportamientos abusivos, groseros o " +"discriminatorios." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Una vez enviada, la opinión se ocultará hasta que un administrador la haya " +"revisado." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "¿Informar sobre esta opinión?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Informar" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "¿Eliminar opinión?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Eliminar una revisión no se puede deshacer." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Opinión favorable" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Opinión desfavorable" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Informar…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Quitar…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"La aplicación no está aislada pero la distribución ha verificado que no es " +"maliciosa" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Compruebe que confía en el vendedor ya que la aplicación no está aislada" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Sin permisos" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "La aplicación está completamente aislada" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Acceso a la red" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Puede acceder a Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Sin acceso a la red" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "No se puede acceder a Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Usa servicios del sistema" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "No se pueden solicitar datos de los servicios del sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Usa servicios de la sesión" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Puede solicitar datos de los servicios de la sesión" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Acceso de usuario al dispositivo" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Puede acceder a dispositivos como cámaras web o controladores de juegos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Ningún usuario tiene acceso al dispositivo" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"No puede acceder a dispositivos como cámaras web o controladores de juegos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Acceso a dispositivos de entrada" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Acceso al micrófono y reproducción de sonido" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Puede escuchar usando micrófonos y reproducir sonido sin solicitar permiso" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Acceso a dispositivos del sistema" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Puede acceder a los dispositivos del sistema que requieren elevación de " +"privilegios" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Acceso al contenido de la pantalla" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Puede acceder al contenido de la pantalla y de otras ventanas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Sistema de ventanas heredado" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Permisos arbitrarios" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Configuración del usuario" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Acceso completo de lectura/escritura al sistema de archivos" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Puede leer y escribir todos los datos del sistema de archivos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Acceso de lectura/escritura a la carpeta de inicio" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Puede leer y escribir todos los datos de su carpeta de inicio" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Acceso de lectura a todo el sistema de archivos" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Puede leer datos de todo el sistema de archivos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Acceso de lectura a la carpeta de inicio del usuario" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Puede leer datos de su carpeta de inicio" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Acceso de lectura/escritura a la carpeta de descargas" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Puede leer y escribir todos los datos de su carpeta de descargas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Acceso de lectura a la carpeta de descargas" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Puede leer todos los datos de su carpeta de descargas" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Puede leer y escribir todos los datos de la carpeta" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Puede leer todos los datos de la carpeta" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Sin acceso al sistema de archivos del sistema" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "No puede acceder al sistema de archivos" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "El desarrollador de la aplicación está verificado" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Se ha verificado que el desarrollador de esta aplicación es quien dice ser" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Dependencias no seguras" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"El software o sus dependencias ya no están soportados y pueden no ser seguros" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Esta aplicación no especifica bajo qué licencia se ha desarrollado y puede " +"ser propietaria." + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Esta aplicación no especifica bajo qué licencia se ha desarrollado y debe " +"ser propietaria." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Código propietario" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"El código fuente no es público por lo que no se puede auditar de manera " +"independiente y puede que no sea seguro" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Esta aplicación esta desarrollada bajo la licencia especial «%s»" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Este software esta desarrollado bajo la licencia especial «%s»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Código auditable" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"El código fuente es público y se auditar de manera independiente lo que hace " +"que esta aplicación probablemente sea más segura" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s es privilegiada" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s es segura" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s es probablemente segura" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s es potencialmente insegura" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s no es segura" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Desconocida" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Seguridad" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licencia" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Fuente" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Esta aplicación usa una versión obsoleta de la plataforma de software (SDK) " +"y puede tener errores o vulnerabilidades de seguridad que no se corregirán." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Captura de pantalla anterior" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Siguiente captura de pantalla" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "No hay capturas de pantalla" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Captura de pantalla no encontrada" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Falló al cargar la imagen" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Tamaño de la captura de pantalla no encontrado" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "No se pudo crear la caché" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Captura de pantalla no válida" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Captura de pantalla no disponible" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u coincidencia más" +msgstr[1] "%u coincidencias más" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Página de búsqueda" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Buscar aplicaciones" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "No se han encontrado aplicaciones" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "No se pueden descargar las actualizaciones" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "No se pueden descargar las actualizaciones de «firmware»" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "No se pueden descargar las actualizaciones de «firmware» de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "No se pueden descargar actualizaciones desde %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "No se puede actualizar: se necesita acceso a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "No se puede actualizar: no hay suficiente espacio en disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"No se pueden descargar actualizaciones de %s: no hay espacio suficiente en " +"disco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "No se puede actualizar: autenticación requerida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "No se puede actualizar: la autenticación no es válida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "No se puede actualizar: se necesita conexión a la alimentación" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"No se pueden descargar actualizaciones: no tiene permisos para instalar " +"software" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "No se puede obtener la lista de actualizaciones" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "No se puede instalar: ha fallado la descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "No se puede instalar %s: falló la descarga de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "No se puede instalar %s: falló la descarga" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "No se puede instalar: falta la rutina de ejecución" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "" +"No se puede instalar %s: rutina de tiempo de ejecución %s no disponible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "No se puede instalar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "No se puede instalar: se necesita acceso a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "No se puede instalar: formato de aplicación no válido" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "No se puede instalar: no hay suficiente espacio en disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "No se puede instalar %s: no hay suficiente espacio en disco" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "No se puede instalar: autenticación requerida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "No se puede instalar %s: autenticación requerida" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "No se puede instalar: autenticación no válida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "No se puede instalar %s: autenticación no válida" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "No se puede instalar: permiso requerido" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "No se puede instalar %s: permiso requerido" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "No se puede instalar: el dispositivo debe estar enchufado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "No se puede instalar %s: el dispositivo debe estar enchufado" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "No se puede instalar: batería baja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "No se puede instalar %s: batería baja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "No se puede actualizar %s desde %s: falló la descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "No se puede actualizar %s: falló la descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "No se pueden instalar las actualizaciones desde %s: falló la descarga" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "No se puede actualizar: falló la descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "No se puede actualizar %s: no hay suficiente espacio en disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "No se puede actualizar %s: autenticación requerida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "No se puede actualizar %s: la autenticación no es válida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "No se puede actualizar %s: se necesita conexión a la alimentación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "No se puede actualizar: el dispositivo debe estar enchufado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "No se puede actualizar %s: el dispositivo debe estar enchufado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "No se puede actualizar: batería baja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "No se puede actualizar %s: batería baja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "No se puede actualizar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "No se puede actualizar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "No se puede actualizar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "No se puede actualizar a %s desde %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "No se puede actualizar: falló la descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "No se puede actualizar a %s: falló la descarga" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "No se puede actualizar a: se necesita acceso a Internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "No se puede actualizar a %s: se necesita acceso a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "No se puede actualizar: no hay suficiente espacio en disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "No se puede actualizar a %s: no hay suficiente espacio en disco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "No se puede actualizar: autenticación requerida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "No se puede actualizar a %s: autenticación requerida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "No se puede actualizar: autenticación no válida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "No se puede actualizar a %s: autenticación no válida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "No se puede actualizar: permiso requerido" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "No se puede actualizar a %s: permiso requerido" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "No se puede actualizar: el dispositivo debe estar enchufado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "No se puede actualizar a %s: el dispositivo debe estar enchufado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "No se puede actualizar: batería baja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "No se puede actualizar a %s: batería baja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "No se puede actualizar a %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "No se puede desinstalar: autenticación requerida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "No se puede desinstalar %s: autenticación requerida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "No se puede desinstalar: autenticación no válida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "No se puede desinstalar %s: autenticación no válida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "No se puede desinstalar: permiso requerido" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "No se puede desinstalar %s: permiso requerido" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "No se puede desinstalar: el dispositivo debe estar enchufado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "No se puede desinstalar %s: el dispositivo debe estar enchufado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "No se pueden desinstalar: bateía baja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "No se pueden desinstalar %s: bateía baja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "No se puede desinstalar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "No se puede lanzar %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Algo salió mal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "No se puede lanzar %s: %s no está instalado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "No hay suficiente espacio en disco para la operación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "No se puede instalar: tipo de archivo no soportado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Falló al instalar: falló la autenticación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "No se puede instalar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "No se puede contactar con %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Reinicie Software para usar los complementos nuevos" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Debe enchufar el dispositivo" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "El nivel de la batería es muy bajo" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Repositorios de _software" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferencias" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "Atajos del _teclado" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Acerca de Software" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Buscar" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menú principal" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Buscar aplicaciones" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Explorar" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalado" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Actualizaciones" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Retroceder" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ninguno" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Datos de la aplicación" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Datos necesarios para ejecutar la aplicación" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Datos del usuario" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Datos creados por el usuario en la aplicación" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Datós de la caché" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Datos temporales en la caché" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "La propia aplicación" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dependencias requerias" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Componentes compartidos del sistema requeridos por esta aplicación" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Desconocido" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Los datos de la caché se pueden limpiar desde la configuración " +"de la _aplicación" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Almacenamiento" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instalada)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Instalando)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Descargando)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Quitando)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detalles" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examinar" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Instaladas en %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Actualizaciones instaladas" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "No se han instalado actualizaciones" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Las actualizaciones están caducadas" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Compruebe las actualizaciones de software disponibles" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Actualizaciones críticas listas para instalar" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Instale las actualizaciones críticas lo antes posible" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Actualizaciones críticas disponibles para descargar" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Descargue las actualizaciones críticas lo antes posible" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Actualizaciones listas para instalar" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "" +"Las actualizaciones de software están esperando, listas para instalarlas" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Actualizaciones disponibles para descargar" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Las actualizaciones de software se pueden descargar" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplicación actualizada — se necesita reiniciar" +msgstr[1] "%u aplicaciones actualizadas — se necesita reiniciar" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplicación actualizada" +msgstr[1] "%u aplicaciones actualizadas" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s se ha actualizado." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Reinicie la aplicación." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s y %s se han actualizado." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplicación necesita reiniciar." +msgstr[1] "%u aplicaciones necesitan reiniciar." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Incluye %s, %s y %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "El sistema ha llegado al fin del ciclo de vida" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Suba de versión para seguir recibiendo actualizaciones" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Hay una versión nueva de %s disponible para instalar" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Actualización de software disponible" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Falló la actualización de software" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Las actualizaciones preparadas no se han instalado" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Mostrar detalles" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Actualización del sistema completa" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Bienvenido/a %s %s" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Actualización de software instalada" +msgstr[1] "Actualizaciones de software instaladas" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Se ha instalado una actualización del sistema operativo importante." +msgstr[1] "Se han instalado actualizaciones del sistema operativo importantes." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Revisar" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Falló al actualizar" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "El sistema ya estaba actualizado." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Se canceló la actualización." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"La conexión a Internet no está disponible. Asegúrese de que tiene acceso a " +"Internet e inténtelo de nuevo." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Ha ocurrido un problema de seguridad con la actualización. Consulte a su " +"proveedor de software para obtener más detalles." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"No hay suficiente espacio en disco. Libere algo de espacio e inténtelo de " +"nuevo." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"La actualización no pudo instalarse. Espere a otra actualización e inténtelo " +"de nuevo. Si el problema persiste, contacte a su proveedor de software." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Comprobada por última vez: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Parar" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Comprobar si hay actualizaciones" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ha dejado de recibir actualizaciones críticas de software" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Su sistema operativo ya no recibe actualizaciones de software críticas" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Puede conllevar gastos adicionales" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Comprobar si hay actualizaciones usando banda ancha móvil puede conllevar " +"gastos adicionales." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Comprob_ar de todas formas" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Actualizaciones de software descargadas" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Las actualizaciones están listas para instalarse" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Comprobar si hay actualizaciones" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Actualizaciones" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Página de actualizaciones" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Cargando actualizaciones" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Esto puede llevar cierto tiempo" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Actualizados" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "¿Usar datos móviles?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Comprobar si hay actualizaciones usando banda ancha móvil puede conllevar " +"gastos adicionales" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Comprobar de todas formas" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "No hay conexión" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Conectarse para comprobar si hay actualizaciones" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Configuración de la _red" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Error" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Las actualizaciones se gestionan automáticamente" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Actualización de software pausada" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Las actualizaciones del software se han pausado por los siguientes motivos:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• La conexión de red actual es medida" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• La conexión de red actual prohíbe descargas grandes" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• El modo de ahorro de energía está activado" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• El modo juego está activado" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Actualización de software pausada" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "La conexión de red está medida - actualizaciones de software pausadas" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"La conexión de red prohíbe descargas grandes- actualizaciones de software " +"pausadas" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"El modo de ahorro de energía está activado- actualizaciones de software " +"pausadas" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "El modo juego está activado- actualizaciones de software pausadas" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Reiniciar y actualizar…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Act_ualizar todo" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Actualizaciones de software descargadas" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Actualizaciones listas para instalar" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Firmware integrado" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Requiere reiniciar" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Actualizaciones de aplicaciones" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Firmware del dispositivo" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Descargar…" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s disponible" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s disponible" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Aprender sobre la nueva versión" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s de %s descargado" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% descargado" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Una actualización mayor, con características nuevas y optimizaciones." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Cancelar actualización" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Reiniciar y actualizar…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Recuerde hacer un respaldo de sus datos y archivos antes de actualizar." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Detalles del error" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Copiar detalles" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Falló al eliminar el archivo «%s»: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Falló al eliminar la carpeta «%s»: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Añadir, quitar o actualizar software en este equipo" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Actualizaciones;Actualizar;Fuentes;Repositorios:Preferencias;Instalar;" +"Desinstalar;Programa;Software;App;Almacén;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s preparada" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s está lista para activarse y funcionar en el siguiente reinicio." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Activar" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Actualizaciones del sistema" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Actualizaciones generales del sistema, tales como correcciones de seguridad " +"o de errores y mejoras del rendimiento." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Una actualización de %s, con características nuevas y correcciones." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"El servicio de actualización de EOS no ha podido descargar y aplicar la " +"actualización." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Aplicación web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Soporte de aplicaciones web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Ejecutar aplicaciones web populares en un navegador" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Actualización de las las últimas características y mejoras de rendimiento y " +"estabilidad." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Soporte de Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "" +"Flatpak es un entorno de trabajo para aplicaciones de escritorio en Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Carpeta %s del sistema" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Subcarpeta %s de la carpeta personal" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Carpetas personal del sistema del equipo" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Configuración del sistema del equipo de /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Carpeta Escritorio" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Subcarpeta %s de Escritorio" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Carpeta Documentos" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Subcarpeta %s de Documentos" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Carpeta Música" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Subcarpeta %s de Música" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Carpeta Imágenes" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Subcarpeta %s de Imágenes" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Carpeta Público" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Subcarpeta %s de Público" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Carpeta Vídeos" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Subcarpeta %s de Vídeos" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Carpeta Plantillas" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Subcarpeta %s de Plantillas" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Carpeta de caché del usuario" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Subcarpeta %s de caché de usuario" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Carpeta de configuración del usuario" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Subcarpeta %s de configuración del usuario" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Carpeta de datos de usuario" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Subcarpeta %s de datos de usuario" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Carpeta de tiempo de ejecución del usuario" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Subcarpeta %s de tiempo de ejecución del usuario" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Acceso al sistema de archivos %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1382 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Obteniendo metadatos flatpak para %s…" + +#: plugins/flatpak/gs-flatpak.c:3608 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Falló al depurar el complemento «%s»: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instalación de usuario" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instalacion del sistema" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID de la aplicación" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Falló al añadir para instalar el complemento «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Falló al añadir para desinstalar el complemento «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"El remoto «%s» no permite la instalación de «%s», probablemente debido a " +"este filtro. Elimínelo y repite la instalación. Error detallado: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Batería demasiado baja para realizar la actualización" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Batería demasiado baja para realizar la actualización (%u%%, se necesita " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "El dispositivo no esta accesible, o esta fuera de rango" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "La batería del dispositivo es demasiado baja" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "La batería del dispositivo es demasiado baja (%u%%, se necesita %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Dispositivo a la espera de que se apliquen las actualizaciones" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "El dispositivo requiere la conexión de una fuente de alimentación" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "No se puede usar el dispositivo si la tapa esta cerrada" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Actualizar dispositivo %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Actualizar sistema %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Actualizar controlador empotrado %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Actualizar ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Actualizar ME corporativo %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Actualizar ME consumidor %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Actualizar controlador %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Actualizar controlador Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Actualizar microcódigo de la CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Actualización de configuración %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Actualizar batería %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Actualizar cámara %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Actualizar TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Actualizar panel táctil %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Actualizar ratón %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Actualizar teclado %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Actualizar controlador de almacenamiento %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Actualizar interfaz de red %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Actualizar pantalla %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Actualizar BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Actualizar receptor USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Actualizar unidad %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Actualizar unidad flash %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Actualizar SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Actualizar GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Actualizar dispositivo %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Actualizar dispositivo USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "No se pudo aplicar la actualización de firmware: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Soporte de actualización de firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Proporciona soporte para actualizaciones de firmware" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "¿Instalar software sin firmar?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"El software que se va a instalar no está firmado. No es posible verificar el " +"origen de las actualizaciones para este software o si las actualizaciones se " +"han manipulado." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "¿Descargar software sin firmar?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Hay actualizaciones sin firmar disponibles. Sin una firma no es posible " +"verifica el origen de la actualización o si se ha manipulado." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "¿Actualizar software sin firmar?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Hay actualizaciones sin firmar disponibles. Sin una firma no es posible " +"verifica el origen de la actualización o si se ha manipulado. Las " +"actualizaciones de software se desactivarán hasta que las actualizaciones " +"sin formar se eliminen o actualicen." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Fallo al instalar las actualizaciones: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paquetes" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Falló al esperar el fin de la transacción antes de descargar:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Falló al descargar las actualizaciones: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Fallo al lanzar la actualización: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Sistema operativo (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Tienda de Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Soporte de Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Un snap es un paquete universal de Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistema" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Componente del sistema" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Falló al quitar el trabajo «%s» de sysupdate con el estado %i" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "No se pudo encontrar «%s»" + +#~ msgid "Moderate page" +#~ msgstr "Moderar página" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "No hay opiniones que moderar" + +#~ msgid "Was this review useful to you?" +#~ msgstr "¿Le ha resultado útil esta opinión?" + +#~ msgid "Yes" +#~ msgstr "Sí" + +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "Meh" +#~ msgstr "Bah" + +#~ msgid "Outdated SDK version" +#~ msgstr "Versión de SDK obsoleta" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Actualizaciones del sistema operativo no disponibles" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "" +#~ "Falló al instalar una actualización importante del sistema operativo." + +#~ msgid "No Network" +#~ msgstr "Sin red" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "" +#~ "Se necesita acceso a Internet para comprobar si hay actualizaciones." + +#~ msgid "Network _Settings" +#~ msgstr "Configuración de la _red" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Las actualizaciones de software se han descargado y están listas para " +#~ "instalarlas." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Las actualizaciones de software se han descargado y están listas para " +#~ "instalarlas." + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Una buena manera de gestionar el software en su sistema." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Introduzca un número entre 1 y %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Elija una aplicación:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s se ha instalado correctamente" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Se ha eliminado una aplicación" +#~ msgstr[1] "Se han eliminado aplicaciones" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Descargando catálogo de software" + +#~ msgid "Unable to install updates" +#~ msgstr "No se pueden instalar las actualizaciones" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "No se puede desinstalar: autenticación no válida" + +#~ msgid "Network Settings" +#~ msgstr "Configuración de la red" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Descargando información de actualizaciones…" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Hay una actualización de software importante lista para instalar." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Importante: hay actualizaciones de software críticas esperando." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Descargue las actualizaciones de software pendientes." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Actualizaciones automáticas pausadas" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "La red actual está medida. Este tipo de conexiones tienen limitaciones de " +#~ "datos o cargos asociados. Para ahorrar datos se han pausado las " +#~ "actualizaciones automáticas.\n" +#~ "\n" +#~ "Si la red se ha identificado incorrectamente como red medida, esta opción " +#~ "se puede cambiar." + +#~ msgid "Open Network _Settings" +#~ msgstr "Abrir la _configuración de la red" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Para evitar cargos y limitaciones de la red, las actualizaciones de " +#~ "software automáticas están desactivadas en conexiones móviles o medidas." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Descarga e instala las actualizaciones de software en segundo plano, " +#~ "cuando sea posible" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Mostrar sólo aplicaciones _libres" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Mostrar sólo las aplicaciones con licencias libres y ocultar las " +#~ "propietarias" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "¿Que le ha gustado de esta aplicación? Dejar sus comentarios junto con " +#~ "las razones de la opinión sirve de ayuda para otros usuarios." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "No se pueden descargar las actualizaciones: se necesita acceso a " +#~ "Internet, pero no está disponible" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "" +#~ "No se pueden descargar las actualizaciones: no hay suficiente espacio en " +#~ "disco" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "No se pueden descargar actualizaciones: se necesita autenticación" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "" +#~ "No se pueden descargar actualizaciones: la autenticación no es válida" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "No se puede instalar %s: no tiene permisos para instalar software" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "No se puede instalar %s: el nivel de la batería es muy bajo" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "" +#~ "No se pueden instalar las actualizaciones ya que no hay suficiente " +#~ "espacio en disco." + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "No se pueden instalar las actualizaciones: se necesita autorización" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "" +#~ "No se pueden instalar las actualizaciones: la autenticación no es válida" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "No se puede actualizar %s: no tiene permisos para actualizar software" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "No se pueden instalar las actualizaciones: no tiene permisos para " +#~ "actualizar software" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "No se pueden instalar las actualizaciones: se necesita conexión a la " +#~ "alimentación" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "No se puede actualizar %s: el nivel de la batería es muy bajo" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "No se pueden instalar las actualizaciones: el nivel de la batería es muy " +#~ "bajo" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "No se puede actualizar a %s: se necesita acceso a Internet, pero no está " +#~ "disponible" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "No se puede actualizar a %s: no tiene permiso para actualizar" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "No se puede actualizar a %s: el nivel de la batería es muy bajo" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "No se puede quitar %s: se necesita autenticación" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "No se puede quitar %s: la autenticación no es válida" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "No se puede quitar %s: no tiene permisos para quitar software" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "No se puede quitar %s: se necesita conexión a la alimentación" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "No se puede quitar %s: el nivel de la batería es muy bajo" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "No se puede quitar «%s»" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Falló al instalar el archivo: no está soportado" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Falló al instalar: no está soportado" + +#~ msgid "AC power is required" +#~ msgstr "Se necesita conexión a la alimentación" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Red medida - actualizaciones automáticas pausadas" + +#~ msgid "Find Out _More" +#~ msgstr "Saber _más" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Cargando descripción, espere…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Mostrar información de depuración detallada" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Puede acceder a archivos arbitrarios" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "¿Seguro que quiere desinstalar %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "Se desinstalará %s y deberá volver a instalarlo para poder usarlo de " +#~ "nuevo." + +#~ msgid "Downloading featured images…" +#~ msgstr "Descargando imágenes destacadas…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "La última vez que el sistema ha estado conectado y ha recibido " +#~ "actualizaciones" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Los complementos seleccionados se instalarán con la aplicación." + +#~ msgid "Post Review" +#~ msgstr "Publicar opinión" + +#~ msgid "_Post" +#~ msgstr "_Publicar" + +#~ msgid "No screenshot provided" +#~ msgstr "No se ha proporcionado una captura de pantalla" + +#~ msgid "An application" +#~ msgstr "Una aplicación" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Este software no está disponible en su idioma y se mostrará en inglés de " +#~ "EE.UU." + +#~ msgid "Applications" +#~ msgstr "Aplicaciones" + +#~ msgid "_Continue" +#~ msgstr "_Continuar" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u aplicación" +#~ msgstr[1] "%u aplicaciones" + +#~ msgid "Rating" +#~ msgstr "Puntuación" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Haga un pequeño resumen de su opinión, por ejemplo: «Una aplicación muy " +#~ "buena, recomendada»." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Opinión" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "¿Qué piensa sobre la aplicación? Intente dar una explicación a sus " +#~ "opiniones." + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Reiniciar ahora" + +#~ msgid "Primary Menu" +#~ msgstr "Menú primario" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Actualizaciones" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s ya no está soportado." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Esto significa que no recibe actualizaciones de seguridad." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Se recomienda que actualice a una versión más reciente." + +#~ msgid "Update All" +#~ msgstr "Actualizar todo" + +#~ msgid "Application Updates" +#~ msgstr "Actualizaciones de aplicaciones" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "No se han instalado actualizaciones en este sistema." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Gestor de aplicaciones para GNOME" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Name" +#~ msgstr "Nombre" + +#~ msgid "user" +#~ msgstr "usuario" + +#~ msgid "Channel" +#~ msgstr "Canal" + +#~ msgid "Branch" +#~ msgstr "Rama" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Instalación" + +#~ msgid "Version" +#~ msgstr "Versión" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Se está descargando el catálogo de software" + +#~ msgid "Access arbitrary files" +#~ msgstr "Acceso a archivos arbitrarios" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Puede acceder a archivos arbitrarios del sistema" + +#~ msgid "A list of popular applications" +#~ msgstr "Una lista de aplicaciones populares" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Una lista de aplicaciones que usar, omitiendo las definidas por el " +#~ "sistema." + +#~ msgid "Checking…" +#~ msgstr "Comprobando…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Cargando…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Descargando puntuaciones de aplicaciones…" + +#~ msgid "GNOME Software" +#~ msgstr "Software de GNOMEs" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "El URI que referencia el fondo de un banner de actualización." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "El URI puede contener tres «%u» que se reemplazarán con la versión de la " +#~ "actualización." + +#~ msgid "Welcome" +#~ msgstr "Bienvenido/a" + +#~ msgid "Welcome to Software" +#~ msgstr "Bienvenido/a a Software" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Software le permite instalar todo el software que necesite desde un único " +#~ "lugar. Vea las recomendaciones, explore las categorías o busque las " +#~ "aplicaciones que quiere." + +#~ msgid "_Browse Software" +#~ msgstr "_Explorar software" + +#~ msgid "_Add shortcut" +#~ msgstr "_Añadir atajo" + +#~ msgid "Re_move shortcut" +#~ msgstr "Qu_itar atajo" + +#~ msgid "OS Updates" +#~ msgstr "Actualizaciones del SO" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Incluye mejoras en el rendimiento, la estabilidad y la seguridad." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Descargando firmas de actualizaciones de «firmware»…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Descargando metadatos de actualizaciones de «firmware»…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "El software tiene permisos desconocidos" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "El software proviene de una fuente de confianza" + +#~ msgid "Unknown Permissions" +#~ msgstr "Permisos desconocidos" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "No se conocen los permisos que necesita esta aplicación" + +#~ msgid "App comes from a trusted source" +#~ msgstr "La aplicación proviene de una fuente de confianza" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "" +#~ "Su distribución ha verificado que se puede confiar en esta aplicación" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "No optimizada para dispositivos táctiles o móviles" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "" +#~ "Mostrar la solicitud para instalar repositorios de software no libre" + +#~ msgid "Requires a specific screen size" +#~ msgstr "Requiere un tamaño de pantalla concreto" + +#~ msgid "Editor’s Picks" +#~ msgstr "Selecciones de los editores" + +#~ msgid "Recently Updated" +#~ msgstr "Actualizadas recientemente" + +#~ msgid "_Read More" +#~ msgstr "Leer _más" + +#~ msgid "_Read Less" +#~ msgstr "Leer me_nos" + +#~ msgid "_Launch" +#~ msgstr "_Lanzar" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Nunca" + +#~ msgid "Localized in your Language" +#~ msgstr "Traducido a su idioma" + +#~ msgid "Documentation" +#~ msgstr "Documentación" + +#~ msgid "Release Activity" +#~ msgstr "Actividad de publicación" + +#~ msgid "Developer" +#~ msgstr "Desarrollador" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Desinstalado" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Instalado" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Actualizado" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Desconocido" + +#~ msgid "History" +#~ msgstr "Histórico" + +#~ msgid "More…" +#~ msgstr "Más…" + +#~ msgid "Recommended Games" +#~ msgstr "Juegos recomendados" + +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Creation Applications" +#~ msgstr "Aplicaciones de creación recomendadas" + +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Work Applications" +#~ msgstr "Aplicaciones de trabajo recomendadas" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Parte de este software es propietario y tiene restricciones de uso, " +#~ "compartición y acceso al código fuente." + +#~ msgid "Find out more…" +#~ msgstr "Saber más…" + +#~ msgid "Recent Releases" +#~ msgstr "Publicaciones recientes" + +#~ msgid "Remove “%s”?" +#~ msgstr "¿Quiere quitar «%s»?" + +#~ msgid "Disable “%s”?" +#~ msgstr "¿Desactivar «%s»?" + +#~ msgid "No Additional Repositories" +#~ msgstr "No hay repositorios adicionales" + +#~ msgid "_Remove…" +#~ msgstr "_Quitar…" + +#~ msgid "_Disable…" +#~ msgstr "_Desactivar…" + +#~ msgid "Disabling" +#~ msgstr "Desactivar" + +#~ msgid "Enabled" +#~ msgstr "Activado" + +#~ msgid "Disabled" +#~ msgstr "Desactivado" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (requiere atención)" + +#~ msgid "_Remove All" +#~ msgstr "_Quitar todos" + +#~| msgid "Setting up updates…" +#~ msgid "Setting Up Updates…" +#~ msgstr "Configurando actualizaciones…" + +#~| msgid "Looking for new updates…" +#~ msgid "Looking for New Updates…" +#~ msgstr "Buscando actualizaciones nuevas…" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Las actualizaciones se aplicarán cuando se reinicie el equipo." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Esperando para descargar %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Descargando %s %s" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "All" +#~ msgstr "Todos" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgid "Audio & Video" +#~ msgstr "Sonido y vídeo" + +#~ msgid "Developer Tools" +#~ msgstr "Herramientas de desarrollo" + +#~ msgid "Education & Science" +#~ msgstr "Educación y ciencia" + +#~ msgid "Games" +#~ msgstr "Juegos" + +#~ msgid "Graphics & Photography" +#~ msgstr "Gráficos y fotografía" + +#~ msgid "Productivity" +#~ msgstr "Productividad" + +#~ msgid "Communication & News" +#~ msgstr "Comunicación y noticias" + +#~ msgid "Utilities" +#~ msgstr "Utilidades" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "No se puede determinar a qué partes del sistema accede esta aplicación. " +#~ "Esto es habitual en aplicaciones antiguas." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Baja" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Media" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Alta" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Desconocida" + +#~ msgid "Public domain" +#~ msgstr "Dominio público" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Los usuarios están limitados por la siguiente licencia:" +#~ msgstr[1] "Los usuarios están limitados por las siguientes licencias:" + +#~ msgid "Sandboxed" +#~ msgstr "Aislado" + +#~ msgid "Category" +#~ msgstr "Categoría" + +#~ msgid "Free" +#~ msgstr "Libre" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Desconocida" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Esto significa que el software se puede ejecutar, copiar, distribuir, " +#~ "estudiar y modificar libremente." + +#~ msgid "Proprietary Software" +#~ msgstr "Software propietario" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Esto significa que el software es propiedad de una persona individual o " +#~ "una empresa. A menudo hay restricciones en su uso y normalmente no se " +#~ "puede acceder a su código fuente." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Se desconocen los términos de la licencia de este software." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "La aplicación se ha calificado así por los siguientes motivos:" + +#~ msgid "No details were available for this rating." +#~ msgstr "No hay detalles disponibles para esta puntuación." + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Aplicaciones de vídeo y sonido recomendadas" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Aplicaciones de productividad recomendadas" + +#~ msgid "ratings in total" +#~ msgstr "puntuación total" + +#~ msgid "Software is up to date" +#~ msgstr "El software está actualizado" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "ODRS es un servicio que proporciona opiniones de usuarios sobre " +#~ "apicaciones" + +#~ msgid "Select All" +#~ msgstr "Seleccionar todo" + +#~ msgid "Select None" +#~ msgstr "Seleccionar ninguno" + +#~ msgid "Featured %s" +#~ msgstr "%s destacada" + +#~ msgid "Show" +#~ msgstr "Mostrar" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Menú de filtrado por subcategorías" + +#~ msgid "Sort" +#~ msgstr "Ordenar" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Menú de ordenación por subcategorías" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Personajes animados en situaciones no seguras" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Personajes animados en conflictos agresivos" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Violencia gráfica con personajes animados" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Personajes en situaciones no seguras distinguibles fácilmente de la " +#~ "realidad" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Personajes en conflictos agresivos distinguibles fácilmente de la realidad" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Violencia gráfica distinguible fácilmente de la realidad" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Personajes semi-realistas en situaciones no seguras" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Representaciones de personajes realistas en conflictos agresivos" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Violencia gráfica con personajes realistas" + +#~ msgid "No bloodshed" +#~ msgstr "Sin masacres" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Masacre no realista" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Masacre realista" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Representaciones de masacres y mutilación de partes del cuerpo" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Violación u otro comportamiento sexual violento" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Referencias a bebidas alcohólicas" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Uso de bebidas alcohólicas" + +#~ msgid "References to illicit drugs" +#~ msgstr "Referencias a drogas ilegales" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Uso de drogas ilegales" + +#~ msgid "References to tobacco products" +#~ msgstr "Referencias al tabaco" + +#~ msgid "Use of tobacco products" +#~ msgstr "Uso de tabaco" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Desnudez artística breve" + +#~ msgid "Prolonged nudity" +#~ msgstr "Desnudez prolongada" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Representaciones o referencias provocativas" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Representaciones o referencias sexuales" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Comportamiento sexual gráfico" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Uso moderado o poco frecuente de la blasfemia" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Uso moderado de la blasfemia" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Uso amplio o frecuente de la blasfemia" + +#~ msgid "Slapstick humor" +#~ msgstr "Humor absurdo" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Humor vulgar o escatológico" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Humor adulto o sexual" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negatividad hacia un determinado grupo de personas" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Discriminación para causar daño emocional" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Discriminación explícita basada en género, sexualidad, raza o religión" + +#~ msgid "Product placement" +#~ msgstr "Venta de productos" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Referencias explícitas a marcas concretas o productos de marcas " +#~ "registradas" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Se incita a los jugadores a comprar determinados elementos del mundo real" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Juego en eventos aleatorios usando créditos o vidas" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Juego usando dinero virtual" + +#~ msgid "Gambling using real money" +#~ msgstr "Juego usando dinero real" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Se incita a los jugadores a donar dinero real" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Posibilidad de gastar dinero real en el juego" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Interacciones de jugador a jugador sin funcionalidad de chat" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Funcionalidad de chat moderada entre jugadores" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Funcionalidad de sonido o vídeo sin controlar entre jugadores" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Compartición en redes sociales de nombres de usuario o direcciones de " +#~ "correo-e" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Comprobando la última versión de la aplicación" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Compartición de datos diagnósticos que no permiten a otros identificar al " +#~ "usuario" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Compartición de información que permite a otros identificar al usuario" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Compartición de la ubicación física con otros usuarios" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Referencias indirectas a la homosexualidad" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Besos entre personas del mismo sexo" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Comportamiento sexual gráfico entre personas del mismo sexo" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Referencias indirectas a la prostitución" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Referencias directas a la prostitución" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Representación gráfica del acto de prostitución" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Referencias indirectas al adulterio" + +#~ msgid "Direct references to adultery" +#~ msgstr "Referencias directas al adulterio" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Representación gráfica del acto de adulterio" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Caracteres humanos apenas vestidos" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Caracteres humanos abiertamente sexualizados" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Representación gráfica o referencias a la profanación histórica" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Representación gráfica de profanación humana actual" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Representación gráfica de profanación actual" + +#~ msgid "Visible dead human remains" +#~ msgstr "Restos mortales humanos visibles" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Restos mortales humanos expuestos a los elementos" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Representación gráfica de profanación de cuerpos humanos" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Representaciones o referencias a la esclavitud histórica" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Representaciones o referencias a la esclavitud actual" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Representación gráfica de esclavitud actual" + +#~ msgid "General" +#~ msgstr "General" + +#~ msgid "ALL" +#~ msgstr "TODO" + +#~ msgid "Teen" +#~ msgstr "Adolescentes" + +#~ msgid "Everyone 10+" +#~ msgstr "Todos los de 10+" + +#~ msgid "Everyone" +#~ msgstr "Todos" + +#~ msgid "Early Childhood" +#~ msgstr "Infantil" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Desconocida" + +#~ msgid "Released" +#~ msgstr "Publicado" + +#~ msgid "Format" +#~ msgstr "Formato" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Ayer, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Hace tres días" + +#~ msgid "Four days ago" +#~ msgstr "Hace cuatro días" + +#~ msgid "Five days ago" +#~ msgstr "Hace cinco días" + +#~ msgid "Six days ago" +#~ msgstr "Hace seis días" + +#~ msgid "Two weeks ago" +#~ msgstr "Hace dos semanas" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Eliminado" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "¿Está seguro de querer quitar %s?" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Ir de compras" + +#~ msgid "Security Updates Pending" +#~ msgstr "Actualizaciones de seguridad pendientes" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Se recomienda que instale las actualizaciones importantes ahora" + +#~ msgid "Restart & Install" +#~ msgstr "Reiniciar e instalar" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Las actualizaciones importantes del sistema y de aplicaciones están " +#~ "listas para instalarse" + +#~ msgid "View" +#~ msgstr "Ver" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Activar el repositorio de extensiones de GNOME Shell" + +#~ msgid "this website" +#~ msgstr "esta página web" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Se debe reiniciar esta aplicación para usar los nuevos complementos." + +#~ msgid "About %s" +#~ msgstr "Acerca de %s" + +#~ msgid "%s ME" +#~ msgstr "ME %s" + +#~ msgid "Extension Settings" +#~ msgstr "Configuración de la extensión" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Las extensiones se usan bajo su responsabilidad. Si tiene problemas en el " +#~ "sistema, es recomendable desactivarlas." + +#~ msgid "Spacing" +#~ msgstr "Espaciado" + +#~ msgid "The amount of space between children" +#~ msgstr "La cantidad de espacio entre hijos" + +#~ msgid "Featured Applications" +#~ msgstr "Aplicaciones destacadas" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Extensiones de la Shell" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Repositorio de extensiones de GNOME Shell" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Descargando metadatos de extensión de la Shell…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Extensiones de la Shell de GNOME" + +#~ msgid "Show the folder management UI" +#~ msgstr "Mostrar la IU de gestión de carpetas" + +#~ msgid "Folder Name" +#~ msgstr "Nombre de la carpeta" + +#~ msgid "_Add" +#~ msgstr "_Añadir" + +#~ msgid "Add to Application Folder" +#~ msgstr "Añadir a la carpeta de aplicaciones" + +#~ msgid "Failed to load components" +#~ msgstr "Falló al cargar los componentes" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS validado correctamente." + +#~ msgid "Failed to load file" +#~ msgstr "Falló al cargar el archivo" + +#~ msgid "Unsaved changes" +#~ msgstr "Cambios sin guardar" + +#~ msgid "The application list is already loaded." +#~ msgstr "La lista de aplicaciones ya está cargada." + +#~ msgid "Merge documents" +#~ msgstr "Mezclar documentos" + +#~ msgid "Throw away changes" +#~ msgstr "Descartar los cambios" + +#~ msgid "Open AppStream File" +#~ msgstr "Abrir archivo AppStream" + +#~ msgid "Save AppStream File" +#~ msgstr "Guardar archivo AppStream" + +#~ msgid "_Save" +#~ msgstr "_Guardar" + +#~ msgid "%s banner design deleted." +#~ msgstr "Eliminado el diseño del banner %s." + +#~ msgid "Banner design deleted." +#~ msgstr "Diseño de banner eliminado." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "La lista de aplicaciones tiene cambios sin guardar." + +#~ msgid "Use verbose logging" +#~ msgstr "Usar registro detallado" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Diseñador de banners de software de GNOME" + +#~ msgid "No Designs" +#~ msgstr "No hay diseños" + +#~ msgid "Error message here" +#~ msgstr "Mensaje de error aquí" + +#~ msgid "Category Featured" +#~ msgstr "Categoría destacada" + +#~ msgid "Undo" +#~ msgstr "Deshacer" + +#~ msgid "Banner Designer" +#~ msgstr "Diseñador de banner" + +#~ msgid "New Banner" +#~ msgstr "Banner nuevo" + +#~ msgid "Import from file" +#~ msgstr "Importar desde un archivo" + +#~ msgid "Export to file" +#~ msgstr "Exportar a un archivo" + +#~ msgid "Click on items to select them" +#~ msgstr "Pulse sobre los elementos para seleccionarlos" + +#~ msgid "Select" +#~ msgstr "Seleccionar" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Añadir a la carpeta…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Mover a la carpeta…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Quitar de la carpeta" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Diseñar los banners destacados para GNOME Software" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;aplicación;aplicaciones;" + +#~ msgid "Top Rated" +#~ msgstr "Los más valorados" + +#~ msgid "_All" +#~ msgstr "_Todo" + +#~ msgid "Sign In / Register…" +#~ msgstr "Iniciar sesión / Registrarse…" + +#~ msgid "Continue" +#~ msgstr "Continuar" + +#~ msgid "Use" +#~ msgstr "Usar" + +#~ msgid "Add another…" +#~ msgstr "Añadir otra…" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s se instalará, y se le cobrará %s." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "%.2f€" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "Sesión iniciada como %s" + +#~ msgid "Sign in…" +#~ msgstr "Iniciar sesión…" + +#~ msgid "Sign out" +#~ msgstr "Cerrar sesión" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "No se puede obtener %s: se necesita autenticación" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "No se puede obtener %s: la autenticación no es válida" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "No se puede obtener %s: no hay configurado un método de pago" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "No se puede obtener %s: se ha rechazado el pago" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Para continuar debe usar una cuenta de Ubuntu One." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Para continuar necesita usar su cuenta de Ubuntu One." + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Se está cargando el catálogo de software" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "..." +#~ msgstr "…" + +#~ msgid "Unable to update %s from %s" +#~ msgstr "No se puede actualizar %s desde %s" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Debe iniciar sesión en %s para continuar." + +#~ msgid "Email address" +#~ msgstr "Dirección de correo-e" + +#~ msgid "I have an account already" +#~ msgstr "Ya tengo una cuenta" + +#~ msgid "I want to register for an account now" +#~ msgstr "Quiero crear una cuenta ahora" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Iniciar sesión automáticamente la próxima vez" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "" +#~ "Introduzca su pin de un solo uso para la autenticación de dos factores." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Autenticar" + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Su cuenta %s se ha suspendido." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "No es posible instalar software hasta que esto se haya resuelto." + +#~ msgid "For more information, visit %s." +#~ msgstr "Para obtener más información, visite %s." + +#~ msgid "_About" +#~ msgstr "_Acerca de" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Mostrar información del perfil para el servicio" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "En la página web se puede encontrar información sobre %s, así como " +#~ "opciones sobre cómo obtener un códec que pueda reproducir este formato." + +#~ msgid "Downloading new updates…" +#~ msgstr "Descargando actualizaciones nuevas…" + +#~ msgid "Downloading application page…" +#~ msgstr "Descargando página de la aplicación…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "La última plataforma de entretenimiento de Valve" + +#~| msgid "Application Updates" +#~ msgid "Applications Updated" +#~ msgstr "Aplicaciones actualizadas" + +#~ msgid "Includes: ." +#~ msgstr "Incluye: ." + +#~ msgid "_Quit" +#~ msgstr "_Salir" + +#~ msgid "Restart & _Install" +#~ msgstr "Reiniciar e _instalar" + +#~ msgid "Getting runtime source…" +#~ msgstr "Obteniendo fuente en tiempo de ejecución…" + +#~ msgid "Limba Support" +#~ msgstr "Soporte de Limbba" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba proporciona a desarrolladores una manera sencilla de crear paquetes " +#~ "de software" + +#~ msgid "Sorted by Name" +#~ msgstr "Ordenadas por nombre" + +#~ msgid "Sorted by Rating" +#~ msgstr "Ordenadas por valoración" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "La lista de fuentes adicionales que se han activado previamente" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "La lista de fuentes que se han activado previamente al instalar " +#~ "aplicaciones de terceras partes." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Mostrar software no libre en los resultados de búsqueda" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "" +#~ "Una lista de fuentes no libres que se pueden activar de manera opcional" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "¿Activar fuentes de software propietario?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "No hay aplicaciones ni complementos instalados. Es posible que todavía " +#~ "haya otro software" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Normalmente tiene restricciones de uso y acceso al código fuente." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Fuentes de software propietario" + +#~ msgid "Remove Source" +#~ msgstr "Quitar fuente" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Las fuentes de software se pueden descargar de Internet. Esto le da " +#~ "acceso a software adicional no proporcionado por %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Quitar una fuente también quitará cualquier software que haya instalado " +#~ "desde ella." + +#~ msgid "No software installed from this source" +#~ msgstr "No hay software instalado desde esta fuente." + +#~ msgid "Installed from this Source" +#~ msgstr "Instalado desde esta fuente" + +#~ msgid "Last Checked" +#~ msgstr "Comprobada por última vez" + +#~ msgid "Added" +#~ msgstr "Añadida" + +#~ msgid "Website" +#~ msgstr "Página web" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Interacciones de jugador a jugador preestablecidas sin funcionalidad de " +#~ "chat" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Compartición de información del usuario con terceros" + +#~ msgid "page1" +#~ msgstr "página1" + +#~ msgid "page2" +#~ msgstr "página2" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgid "“%s” [%s]" +#~ msgstr "«%s» [%s]" + +#~ msgid "Total" +#~ msgstr "Total" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Todo" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Destacado" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomía" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Química" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matemáticas" + +#~ msgid "Science" +#~ msgstr "Ciencias" + +#~ msgid "Installation of %s failed." +#~ msgstr "Falló la instalación de %s." + +#~ msgid "Removal of %s failed." +#~ msgstr "Falló al eliminar %s." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Asegúrese de que tiene acceso a Internet e inténtelo de nuevo." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Libere algo de espacio e inténtelo de nuevo." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Si el problema persiste, contacte con su proveedor de software." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Las fuentes de software le dan acceso a software adicional." + +#~ msgid "3rd party" +#~ msgstr "terceras partes" + +#~ msgid "nonfree" +#~ msgstr "no libre" + +#~ msgid "shell extension" +#~ msgstr "Extensiones de la Shell" + +#~ msgid "_Installing" +#~ msgstr "_Instalando" + +#~ msgid "_Removing" +#~ msgstr "_Quitando" + +#~ msgid " or " +#~ msgstr " o " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Desconocida" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Este software proviene de terceras partes" + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Este software proviene de terceras partes y puede contener componentes no " +#~ "libres." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Este software puede contener componentes no libres." + +#~ msgid "non-free" +#~ msgstr "no libre" + +#~ msgid "One Star" +#~ msgstr "Una estrella" + +#~ msgid "Two Stars" +#~ msgstr "Dos estrellas" + +#~ msgid "Three Stars" +#~ msgstr "Tres estrellas" + +#~ msgid "Four Stars" +#~ msgstr "Cuatro Stars" + +#~ msgid "Five Stars" +#~ msgstr "Cinco estrellas" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Aplicaciones de oficina recomendadas" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Editing" +#~ msgstr "Edición" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Databases" +#~ msgstr "Bases de datos" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Disc Burning" +#~ msgstr "Grabación de discos" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Ham Radio" +#~ msgstr "Radioaficionado" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Mixer" +#~ msgstr "Mezclador" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Music" +#~ msgstr "Música" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Recorders" +#~ msgstr "Grabadores" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Sequencers" +#~ msgstr "Secuenciadores" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "Tuners" +#~ msgstr "Sintonizadores" + +#~ msgctxt "Menu subcategory of AudioVideo" +#~ msgid "TV" +#~ msgstr "TV" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Construcción" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Bases de datos" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "EID" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Perfilado" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "Gestión de proyectos" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Desarrollo web" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biología" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Informática" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Visualización de datos" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Economía" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Electricidad" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Electrónica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Ingeniería" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geología" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Ciencias de la Tierra" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Historia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Procesado de imágenes" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Mapas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Música" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Análisis numérico" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Computación en paralelo" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Física" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Espiritualidad" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Disparos" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulación" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Deportes" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "Gráficos 2D" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Publicación" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Gráficos rasterizados" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Marcado" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Correo electrónico" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Proveedor" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Transferencia de archivos" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Radioaficionado" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Mensajería instantánea" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "Clientes IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Monitorización" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonía" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Desarrollo web" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Diagrama" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Gestión de contactos" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Diccionario" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Correo-e" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Diagrama de flujo" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografía" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Gestión de proyectos" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Publicación" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Hoja de cálculo" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Visor" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Arte" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Inteligencia artificial" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomía" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biología" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Química" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Informática" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Construcción" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Visualización de datos" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Economía" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Electricidad" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Electrónica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Ingeniería" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografía" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geología" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Ciencias de la Tierra" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Historia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humanidades" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Procesado de imágenes" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Idiomas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Mapas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matemáticas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Medicina" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Análisis numérico" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Computación en paralelo" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Física" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robótica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Espiritualidad" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Deportes" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulador" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Gestor de archivos" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Herramientas de archivos" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Monitorización" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Seguridad" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Emulador de la terminal" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Accesibilidad" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Archivado" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Calculadora" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Reloj" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Compresión" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Herramientas de archivos" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Mapas" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Espiritualidad" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Herramientas de telefonía" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "Ninguna" + +#~ msgid "Audio" +#~ msgstr "Sonido" + +#~ msgid "Graphics" +#~ msgstr "Gráficos" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgid "Office" +#~ msgstr "Oficina" + +#~ msgid "Video" +#~ msgstr "Vídeo" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Edición" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Base de datos" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Grabación de discos" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Grabadores" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Calculando…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Desconocido" + +#~ msgid "_History" +#~ msgstr "_Histórico" + +#~ msgid "Size" +#~ msgstr "Tamaño" + +#~ msgid "No AppStream data found" +#~ msgstr "No se han encontrado datos de AppStream" + +#~ msgid "Internet Only Application" +#~ msgstr "Aplicación sólo para Internet" + +#~ msgid "A previous update was unfinished." +#~ msgstr "La actualización anterior no ha terminado." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "La actualización no pudo instalarse; normalmente esto indica un problema " +#~ "con la propia actualización. Espere a otra actualización e inténtelo de " +#~ "nuevo." + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Una actualización no se ha firmado de la manera correcta." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Se ha solicitado una actualización en modo desconectado, pero no hay " +#~ "paquetes que necesiten actualizarse." + +#~ msgid "No space was left on the drive." +#~ msgstr "No queda espacio en el disco" + +#~ msgid "An update failed to install correctly." +#~ msgstr "Una actualización no se ha instalado correctamente." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "" +#~ "La actualización en modo desconectado ha fallado de manera imprevista." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i aplicación y %i complementos instalado" +#~ msgstr[1] "%i aplicaciones y %i complementos instalados" + +#~ msgid "" +#~ "Depending on your country of residence, installing it could make you " +#~ "liable to prosecution." +#~ msgstr "" +#~ "Dependiendo de su país de residencia, instalarlo podría ser objeto de " +#~ "acciones legales." + +#~ msgid "If you are uncertain about this, you should obtain legal advice." +#~ msgstr "Si no está seguro, debería solicitar asesoramiento legal." + +#~| msgid "Are you sure you want to remove %s?" +#~ msgid "Do you want to enable it?" +#~ msgstr "¿Quiere activarlo?" + +#~ msgid "Set the specified debugging level" +#~ msgstr "Establecer el nivel de depurado especificado" + +#~ msgid "Picks" +#~ msgstr "Selección" + +#~| msgid "Complicated!" +#~ msgctxt "license" +#~ msgid "Complicated!" +#~ msgstr "Complicada" + +#~ msgid "January 30, 2014" +#~ msgstr "30 de enero de 2014" + +#~ msgid "_Pending" +#~ msgstr "_Pendiente" + +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "Bases de datos" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "Radioaficionado" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "Desarrollo web" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "Herramientas de archivos" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "Mapas" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "Espiritualidad" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "Tipografías" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "Codificadores" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "Fuentes de entrada" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "Paquetes de idiomas" + +#~ msgid "Done" +#~ msgstr "Hecho" + +#~ msgid "" +#~ "Add or remove folders. Your application folders can be found in the " +#~ "Activities Overview." +#~ msgstr "" +#~ "Añadir o quitar carpetas. Sus carpetas de aplicaciones se encuentran en " +#~ "la vista de actividades." + +#~ msgid "" +#~ "Choose a folder for %s. Your application folders can be found in the " +#~ "Activities Overview." +#~ msgstr "" +#~ "Elija una carpeta para %s. Sus carpetas de aplicaciones se encuentran en " +#~ "la vista de actividades." + +#~ msgid "" +#~ "Choose a folder for %s and %s. Your application folders can be found in " +#~ "the Activities Overview." +#~ msgstr "" +#~ "Elija una carpeta para %s y %s. Sus carpetas de aplicaciones se " +#~ "encuentran en la vista de actividades." + +#~ msgid "" +#~ "Choose a folder for %s, %s and %s. Your application folders can be found " +#~ "in the Activities Overview." +#~ msgstr "" +#~ "Elija una carpeta para %s, %s y %s. Sus carpetas de aplicaciones se " +#~ "encuentran en la vista de actividades." + +#~ msgid "" +#~ "Choose a folder for the selected applications. Your application folders " +#~ "can be found in the Activities Overview." +#~ msgstr "" +#~ "Elija una carpeta para las aplicaciones seleccionadas. Sus carpetas de " +#~ "aplicaciones se encuentran en la vista de actividades." + +#~ msgid "_Installed (%d)" +#~ msgstr "_Instalado (%d)" + +#~ msgid "_Updates (%d)" +#~ msgstr "_Actualizaciones (%d)" + +#~ msgid "The search term to use when starting the UI" +#~ msgstr "El término que buscar al iniciar la IU" + +#~ msgid "Shotwell" +#~ msgstr "Shotwell" + +#~| msgid "Application manager for GNOME" +#~ msgid "Open source photo management for GNOME" +#~ msgstr "Aplicación libre de gestión de fotos para GNOME" + +#~| msgid "Description" +#~ msgid "Long description" +#~ msgstr "Descripción larga" + +#~ msgid "Software has the following goals:" +#~ msgstr "Software tiene los siguientes objetivos" + +#~ msgid "View installed applications" +#~ msgstr "Ver las aplicaciones instaladas" + +#~ msgid "View available application updates" +#~ msgstr "Ver las actualizaciones disponibles para las aplicaciones" + +#~ msgid "Install available updates" +#~ msgstr "Instalar las actualizaciones disponibles" + +#~ msgid "Find an application to handle a specific type of file" +#~ msgstr "Buscar una aplicación para manejar un tipo de archivo específico" + +#~ msgid "Installed apps and updates should be available when offline" +#~ msgstr "" +#~ "Las aplicaciones y las actualizaciones instaladas deben estar disponibles " +#~ "cuando esté desconectado" + +#~ msgid "Goals:" +#~ msgstr "Objetivos:" + +#~ msgctxt "Menu subcategory of Settings" +#~ msgid "Accessibility" +#~ msgstr "Accesibilidad" + +#~ msgctxt "Menu subcategory of Settings" +#~ msgid "Printing" +#~ msgstr "Impresión" + +#~ msgctxt "Menu subcategory of Settings" +#~ msgid "Security" +#~ msgstr "Seguridad" + +#~ msgid "The Gimp" +#~ msgstr "Gimp" + +#~ msgid "GNU Image Manipulation Program" +#~ msgstr "Programa de manipulación de imágenes de GNU" + +#~ msgid "" +#~ "GIMP (GNU Image Manipulation Program) is a powerful image composition " +#~ "and\n" +#~ "editing program, which can be extremely useful for creating logos and " +#~ "other\n" +#~ "graphics for webpages. GIMP has many of the tools and filters you would " +#~ "expect\n" +#~ "to find in similar commercial offerings, and some interesting extras as " +#~ "well.\n" +#~ "GIMP provides a large image manipulation toolbox, including channel " +#~ "operations\n" +#~ "and layers, effects, sub-pixel imaging and anti-aliasing, and " +#~ "conversions, all\n" +#~ "with multi-level undo.\n" +#~ msgstr "" +#~ "GIMP (programa de manipulación de imágenes de GNU) es un potente programa " +#~ "de\n" +#~ "composición y edición de imágenes que puede resultar muy útil para crear " +#~ "logos y otras\n" +#~ "imágenes para páginas web. GIMP tiene muchas de las herramientas y " +#~ "filtros que espera\n" +#~ "para parecerse a otras herramientas comerciales similares, así como " +#~ "algunos extras interesantes.\n" +#~ "GIMP proporciona una gran caja de herramientas para manipulación de " +#~ "imágenes, incluyendo\n" +#~ "operaciones sobre canales y capas, efectos, imágenes con subpíxeles y " +#~ "alisado y conversiones,\n" +#~ "todo ello con posibilidad de deshacer.\n" + +#~ msgid "Waiting for package manager..." +#~ msgstr "Esperando al gestor de paquetes…" + +#~ msgid "Querying..." +#~ msgstr "Consultando…" + +#~ msgid "" +#~ "The author of this software has not included a 'Description' in the " +#~ "desktop file..." +#~ msgstr "" +#~ "El autor de este programa no ha incluido una «descripción» en el archivo ." +#~ "desktop…" + +#~ msgid "New" +#~ msgstr "Nuevo" + +#~ msgid "Related" +#~ msgstr "Relacionado" + +#~ msgid "Popular" +#~ msgstr "Popular" + +#~ msgid "" +#~ "Shotwell is a digital photo organiser that runs on Linux. It is the " +#~ "default photo manager in Ubuntu and Fedora." +#~ msgstr "" +#~ "Shotwell es un organizador de fotos digitales para Linux. Es el gestor de " +#~ "fotos predeterminado en Ubuntu y en Fedora." diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..f14aacb --- /dev/null +++ b/po/eu.po @@ -0,0 +1,7364 @@ +# Basque translation for gnome-software. +# Copyright (C) 2014 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Iñaki Larrañaga Murgoitio , 2014, 2015, 2017. +# Ibai Oihanguren Sala , 2020. +# Asier Saratsua Garmendia , 2019, 2020, 2021, 2022, 2023, 2024. +# Asier Saratsua Garmendia , 2025. +# +msgid "" +msgstr "Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-21 13:46+0000\n" +"PO-Revision-Date: 2025-03-02 10:10+0200\n" +"Last-Translator: Asier Saratsua \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/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Softwarea" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instalatu eta eguneratu aplikazioak" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "Software aplikazioak app berriak eta sistemaren hedapenak bilatzea eta instalatzea, edo eta instalatutako aplikazioak kentzea, ahalbidetzen du." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "Software programak aplikazio ezagunak azalpen erabilgarriekin eta aplikazioko hainbat argazkirekin bistaratzen ditu. Aplikazioak kategorien zerrendak arakatuz aurki daitezke, edo bilaketak eginez. Lineaz kanpoko eguneratzearen bidez sistema eguneratzea baimentzen du." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Ikuspegi orokorraren panela" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Xehetasunen panela" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Instalatutakoen panela" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Eguneratzeen panela" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Eguneratzeen xehetasunak" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME proiektua" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Probatu akmods gakoa Shim UEFIn" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Autentifikazioa behar da akmods gakoa Shim UEFIn probatzeko" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Erregistratu akmods gakoa Shim UEFIn" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Autentifikazioa behar da akmods gakoa Shim UEFIn erregistratzeko" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Probatu DKMS gakoa Shim UEFIn" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Autentifikazioa behar da DKMS gakoa Shim UEFIn probatzeko" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Erregistratu DKMS gakoa Shim UEFIn" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Autentifikazioa behar da DKMS gakoa Shim UEFIn erregistratzeko" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalatu appstream fitxategi bat sistemaren kokaleku batean" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Appstream fitxategi bat sistemaren kokaleku batean instalatzen" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Proiektu bateragarrien zerrenda" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "Erakutsi beharko zatekeen proiektu bateragarrien zerrenda bat da, hala nola GNOME, KDE eta XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Eguneratzeak eta bertsio-berritzeak GNOME Software aplikazioan kudeatuko diren" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "Desgaituta badago, GNOME Softwarek eguneratzeen panela ezkutatuko du, ez du eguneratze automatikorik burutuko edo bertsio-berritzeak egin nahi diren galdetuko." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Deskargatu eta instalatu eguneratzeak automatikoki" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "Gaituta balego, GNOME Softwarek automatikoki deskargatuko ditu eguneratzeak atzeko planoan eta berrabiaraztea behar ez dutenak instalatuko ditu." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Jakinarazi erabiltzaileari atzeko planoan zein software eguneratu den." + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "Gaituta badago, GNOME Softwarek erabiltzaileari jakinaraziko dio zein eguneratze egin diren erabiltzailea inaktibo zegoenean." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Konexio mugatu batean automatikoki freskatu edo ez" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "Gaituta balego, GNOME Softwarek automatikoki freskatuko du atzeko planoan, nahiz eta konexio mugatu bat erabili (metadatu batzuk noizbehinka deskargatzea, eguneratzeak begiratzea eta abar, erabiltzailearentzako kostu bat eragin dezakeelarik)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "GNOME Software aplikazioaren lehen exekuzioa den edo ez" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Erakutsi balorazioen izarrak aplikazioen alboan" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Iragazi aplikazioak urrunekoaren adar-multzo lehenetsian oinarrituz" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Libreak ez diren aplikazioek abisuaren elkarrizketa-koadroa bistaratzea instalatu aurretik" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "Libreak ez diren aplikazioak instalatzean, abisu bat erakutsiko da. Honek kontrolatzen du elkarrizketa-koadro hori kenduko den ala ez." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Eguneratzeen azken egiaztapenaren denbora-zigilua" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Bertsio-berritzeen jakinarazpenaren denbora-zigilua" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Eguneratzeen azken jakinarazpenaren denbora-zigilua" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Aurreneko segurtasun-eguneratzearen denbora-zigilua, eguneratzearen ondoren garbitutakoa" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Azken eguneratzearen denbora-zigilua" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Denbora segundotan pantaila-argazkia oraindik baliozkoa den egiaztatzeko" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "Balio handiagoa aukeratzean, gutxiagotan atzituko da urruneko zerbitzaria, baina pantaila-argazkien eguneratzeak denbora gehiago beharko du erabiltzaileari erakusteko. Irudia cachean gordeta dagoenean zerbitzaria inoiz ez begiratzeko adierazten du 0 balioak." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Aplikazioen berrikuspenetan erabiliko den zerbitzaria" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Gutxieneko karmaren puntuazioa iritzietan" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Zenbaki hau baino baxuagoko karma dutenen iritziak ez dira bistaratuko." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Hirugarrentzat hartuko ez diren biltegi ofizialen zerrenda" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Desgaitu edo kendu ezin diren beharrezko biltegien zerrenda" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Software libretzat hartuko diren biltegi ofizialen zerrenda" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "Lizentziaren URLa aplikazio bat software libretzat hartzen denean erabiltzeko" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Instalatu bildutako aplikazioak sistemaren erabiltzaile guztientzako, posible denean" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Baimendu software-biltegien elkarrizketa-koadroa atzitzea" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Eskaini aurre-argitalpenen bertsio-berritzea" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Erakutsi UI elementu batzuk erabiltzaileari aplikazio bat librea ez dela jakinaraziz" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Erakutsi instalatutako aplikazioen zerrendan aplikazioek instalatu ondoren duten tamaina" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://eu.wikipedia.org/wiki/Software_jabedun'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Libreak ez diren eta jabedun motako softwareak azaltzen duen URIa" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "Appstream fitxategietara eramaten dituzten URLen zerrenda, swcatalog karpetara deskargatuko direnak" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "Instalatu AppStream fitxategiak sistemaren kokaleku batean erabiltzaile guztientzako. Faltsua bada, fitxategiak estandarra ez den $XDG_DATA_HOME/swcatalog/xml direktorio batean instalatuko dira" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "Hobesten diren pakete-formatuen lehentasu-ordena, formaturik gogokoenak hasieran zerrendatuta. Matrize hutsak ordena lehenetsia hobetsiko du. Formatuak falta badira, azkenak zerrendatuko dira. Paketatze-formatu ezagunak: deb, flatpak, rpm, snap. Formatuak aukeran zehaztu daitezke, jatorriaren izen batekin eta bi puntuz zatituta, adibidez 'flatpack:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "Flatpak exekuzio-garaiak kentzeko azken saiakera noiz egin zen gordetzen duen denbora-zigilua" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "Ezarri 'egia' lizentzia librea duten aplikazioak soilik ikusteko eta jabedun aplikazioak ezkutatzeko." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "Ezarri 'egia' nortasuna egiaztatuta duten garatzaileen aplikazioak soilik erakusteko." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Jasotako azken eguneratze historikoen denbora-zigilua." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Saioa hasteko gnome-online-account IDa gordetzen duen kate bat" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Softwaren sistema osorako AppStream instalatzailea" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Huts egin du komando-lerroko argumentuak analizatzean" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Fitxategi-izen bakar bat zehaztu behar duzu" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Programa hau root supererabiltzaileak soilik erabil dezake" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Huts egin du eduki mota balioztatzeak: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Huts egin du lekuz aldatzeak: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Softwarea instalatzea" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instalatu hautatutako softwarea sisteman" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Marrazki bizidunen indarkeria" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Ez dago informaziorik marrazki bizidunen indarkeriari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantasiazko indarkeria" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Ez dago informaziorik fantasiazko indarkeriari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Indarkeria errealistikoa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Ez dago informaziorik indarkeria erralistikoari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Odol-isurtzea irudikatzen duen indarkeria" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Ez dago informaziorik odol-isurtzeari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Sexu-indarkeria" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Ez dago informaziorik sexu-indarkeriari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohola" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Ez dago informaziorik alkoholaren erreferentziei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotikoak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Ez dago informaziorik legez kanpoko drogen erreferentziei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabakoa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Ez dago informaziorik tabakoaren erreferentziei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Biluztasuna" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Ez dago informaziorik biluztasunari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Sexu-gaiak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Ez dago informaziorik izaera sexualeko adierazpenen erreferentziei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Biraoak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Ez dago informaziorik biraoei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Umore desegokia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Ez dago informaziorik umore desegokiari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminazioa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Ez dago informaziorik mintzaira diskriminatzaileari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Iragarkiak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Ez dago informaziorik edozein motatako iragarkiei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Apustuak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Ez dago informaziorik edozein motatako apustuei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Erosketak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Ez dago informaziorik dirua gastatzeko gaitasunari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Erabiltzaileen arteko berriketa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Ez dago informaziorik beste erabiltzaileekin berriketan aritzeari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Erabiltzaileen arteko audio-berriketa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Ez dago informaziorik beste erabiltzaileekin hitz egiteari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontaktuaren xehetasunak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "Ez dago informaziorik sare sozialetako erabiltzaile-izenak edo posta-helbideak partekatzeari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informazioaren identifikazioa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Ez dago informaziorik erabiltzaile-informazioa hirugarrenekin partekatzeari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Kokalekua partekatzea" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Ez dago informaziorik kokaleku fisikoa beste erabiltzaileekin partekatzeari buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualitatea" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Ez dago informaziorik homosexualitatearen erreferentziei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostituzioa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Ez dago informaziorik prostituzioaren erreferentziei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adulterioa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Ez dago informaziorik adulterioaren erreferentziei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Pertsonaia sexualizatuak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Ez dago informaziorik pertsonaia sexualizatuei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanazioa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Ez dago informaziorik profanazioaren erreferentziei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Giza gorpuzkiak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Ez dago informaziorik ageriko giza gorpuzkiei buruz" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Esklabotza" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Ez dago informaziorik esklabotzaren erreferentziei buruz" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Ez ditu drogei buruzko erreferentziak" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Ez ditu biraoak, profanazioak edo hizkera zakarreko beste edozein motak" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Ez ditu iragarkiak edo diru-trukeak" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Ez ditu sexua edo biluztasuna" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Ez du kontrolik gabeko berriketa-funtzionaltasuna" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Ez du indarkeriarik" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogak" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Hizkera zakarra" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Dirua" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Soziala" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Indarkeria" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Denak" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s(e)k ez du adinaren araberako balorazio ezagunik" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s denontzako da egokia" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s haur txikientzako da egokia" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s haur hangientzako da egokia" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s haur txikientzako da egokia" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s nerabeentzako da egokia" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s helduentzako da egokia" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s %s talderako da egokia" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Balorazioa adinaren arabera" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Nola lagundu falta den informazioarekin" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Fitxategi lokala" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paketea" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Zain" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Instalazioaren zain" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Kentzearen zain" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Instalatzen" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Kentzen" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Deskargatzen" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instalatu" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Desinstalatu…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Sarea" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Sarean zehar komunikatu daiteke" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Sistema-zerbitzuak" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Sistemako bus-aren D-Bus zerbitzuak atzitu ditzake" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Saio-zerbitzuak" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Saioko bus-aren D-Bus zerbitzuak atzitu ditzake" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Gailuak" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Ausazko gailuak, adibidez web-kamerak, atzitu ditzake" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Ezin ditzake sarrera-gailuak atzitu" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Mikrofonoak atzitu ditzake eta audioa erreproduzitu dezake" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Sistemaren gailu-fitxategiak atzitu ditzake" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Pantaila-edukiak" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Ezin dira pantaila-edukiak atzitu" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Karpeta nagusia" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Fitxategiak ikusi, editatu eta sortu ditzake" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Fitxategiak ikusi ditzake" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Fitxategi-sistema" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Deskargen karpeta" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Ezarpenak" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Edozein ezarpen ikusi eta aldatu dezake" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Bistaratze-sistema zaharra" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Bistaratze-sistema zaharra eta segurtasun gutxikoa darabil" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Egin ihes isolamendutik" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Isolamendutik ihes egin dezake eta beste muga batzuk saihestu ditzake" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Ez dago eguneratzearen azalpenik eskuragarri." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Eguneratzearen xehetasunak" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Baimen gehiago behar ditu" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Puntuazio-datu baliogabeak jaso dira zerbitzaritik" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Ezin da puntuazioen zerbitzariarekin komunikatu" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Berrikuspenak" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Ez da berrikuspenik aurkitu aplikazio honetarako." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Ez dago berrikuspenik" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Bertsioen historia" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Berria %s bertsioan" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "%s bertsioa" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Ez dago xehetasunik argitalpen honetarako" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%Y.eko %Bren %e" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Abioko modua: 'updates’ (eguneratzeak), ‘updated’ (eguneratuta), ‘installed’ (instalatuta) edo ‘overview’ (ikuspegi orokorra) izan daiteke," + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODUA" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Bilatu aplikazioak" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "BILATU" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Erakutsi aplikazioaren xehetasunak (aplikazioaren IDa erabiliz)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "IDa" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Erakutsi aplikazioaren xehetasunak (paketearen izena erabiliz)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKT-IZENA" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instalatu aplikazioa (aplikazioaren IDa erabiliz)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Desnstalatu aplikazioa (aplikazioaren IDa erabiliz)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Ireki pakete-fitxategia lokal bat" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FITXATEGI-IZENA" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "Ekintza honekin aurreikusitako elkarreragiketa mota: ‘none’ (bat ere ez), ‘notify’ (jakinarazi), edo ‘full’ (osoa)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ELKARREKINTZA" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Erakutsi metainfo edo appdata fitxategi lokal bat" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "Gaitu arazketaren irteera xehea (exekutatzen ari den instantziiatik, jadanik exekutatzen ari bada)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Falta diren eguneratzeak atzeko planoan instalaten ditu" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Erakutsi hobespenak" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Irten uneko instantziatik" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Hobetsi fitxategi-iturburu lokalak AppStream aurretik" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Erakutsi bertsio-zenbakia" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 GNOME Software aplikazioaren laguntzaileak" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "translator-credits" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Barkatu! Ez dago xehetasunik aplikazio horretarako." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Instalatutako tamaina" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "%s datu eta %s cache barne hartzen ditu" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "%s datu barne hartzen ditu" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "%s cache barne hartzen ditu" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Cachearen eta datuen erabilera ezezaguna" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Deskargaren tamaina" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Ez du sistemaren deskarga gehiagorik behar" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Sistemaren tamaina ezezaguneko deskarga gehigarria behar du" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Sistemaren %s deskarga gehigarria behar du" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Tamaina ezezaguna da" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Baimenik ez" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Sarea atzitu dezake" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Sistema-zerbitzuak erabiltzen ditu" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Saio-zerbitzuak erabiltzen ditu" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Hardware-gailuak atzitu ditzake" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Sistemaren gailuak atzitu ditzake" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Zure datu guztiak irakurri/idatzi ditzake" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Zure datu guztiak irakurri ditzake" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Zure deskargak irakurri/idatzi ditzake" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Zure deskargak irakurri ditzake" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Zenbait fitxategi atzitu ditzake" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Erabiltzaile-ezarpenak atzitu eta aldatu ditzake" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Leiho-sisema zaharkitua erabiltzen du" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Ausazko baimenak eskuratu ditzake" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Softwarearen garatzailea egiaztatuta dago" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Berrikustailea: SEaren banatzailea" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Berrikustailea:. %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Hirugarren batek eskainia" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Software hau ez da mantentzen jadanik" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Kode ikuskagarria" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Lizentzia ezezaguna" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Kode jabeduna" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Lizentzia berezia" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Pribilegiatua" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Segurua" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Seguru samarra" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Arriskutsua izan daiteke" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Arriskutsua" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Mugikorra soilik" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Pantaila txikietan soilik funtzionatzen du" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Mahaigaina soilik" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Pantaila handi batean soilik funtzionatzen du" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Pantaila-tamaina ez dator bat" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Ez du zure uneko pantaila-tamaina onartzen" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Ukipen-pantaila behar du" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Teklatua behar du" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Sagua behar du" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Joko-agintea behar du" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Joko-agintea behar du jokatzeko" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Moldakorra" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Telefonoetan, tabletetan eta mahaigainetan funtzionatzen du" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Ziur aski teklatua edo sagua beharko du" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Mahaigainekoetan eta eramangarrietan funtzionatzen du" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Ez dauka adinagatik desegokia izan daitekeen edukirik" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Ez dago adinaren informaziorik eskuragarri" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Bisitatu webgunea" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instalatu…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Utzi" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instalatu" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Deskargatu" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Eguneratu" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Desinstalatu…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Desinstalatzen" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Eguneratze kritikoa" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Gailua ezin da eguneratzean erabili." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Iturburua: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Izena aldatu da, aurreko izena: %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Eguneratzeak jasotzea gelditu da" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Eguneratze kritikoa" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalatua" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Lagundu %s itzultzen" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "%s nazioarteko laguntzaileen komunitate batek diseinatu, garatu eta itzuli du.\n" +"\n" +"Horrek esan nahi du zure hizkuntzan oraindik erabilgarri ez badago, zuk zeuk ere lagundu dezakezula itzultzen." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Itzulpenak" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Itzulpenen webgunea" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Saioa hasteko urreneko %s (%s domeinua) behar da" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Saioa hasi behar da" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Utzi" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Saio-hasiera" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Erabiltzailea" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Pasahitza" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Bestelakoa" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Denak" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Nabarmendua" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Editorearen hautaketa" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Berria eta eguneratua" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Webean hautatuak" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Bestelako softwarea" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s instalatu da" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Berrabiarazi egin behar da aldaketek eragina izateko" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Aplikazioa erabiltzeko prest dago" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Sistema-eguneratzeak instalatu dira" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Azken aldian instalatuta eguneratzeak eskuragarri daude berrikusteko" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Berrabiarazi" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Abiarazi" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Instalatu softwarea?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Instalatu hirugarrenen softwarea?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Gaitu software-biltegia?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Gaitu hirugarrenen software-biltegia?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "'%s' ez da software librea eta iturburu irekikoa, eta \"%s”(e)k hornitzen du." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s - hornitzailea: %s." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Software-biltegi hau gaitu behar da instalazioarekin jarraitzeko." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Herrialde batzuetan ilegala izan daiteke '%s' instalatzea edo erabiltzea." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Herrialde batzuetan ilegala izan daiteke kodeka hau instalatzea edo erabiltzea." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Ez abisatu _berriro" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Gaitu eta _instalatu" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Pakete-kudeatzaileak emandako erroreen xehetasunak:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Xehetasunak" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "It_xi" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Xehetasunak arbelean kopiatu dira" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Onartu" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Eguneratze bat instalatu da" +msgstr[1] "Eguneratzeak instalatu dira" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Aplikazio bat desinstalatu da" +msgstr[1] "Eguneratzeak instalatu dira" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Sistema berrabiarazi behar da aldaketak eragina izateko" +msgstr[1] "Berrabiaraztea eskatzen du hauek eragina izateko." + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Orain ez" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Gaur" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Atzo" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "duela egun %d" +msgstr[1] "duela %d egun" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "duela aste %d" +msgstr[1] "duela %d aste" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "duela hilabete %d" +msgstr[1] "duela %d hilabete" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "duela urte %d" +msgstr[1] "duela %d urte" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Orain" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "duela minutu %d" +msgstr[1] "duela %d minutu" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "duela ordu %d" +msgstr[1] "duela %d ordu" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Denak" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Nabarmendua" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D grafikoak" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Argazkigintza" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Eskaneatzea" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Bektore grafikoak" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Ikustaileak" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Audioaren sorrera eta edizioa" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Musika erreproduzigailuak" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Denak" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Nabarmendua" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Egutegia" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Datu-basea" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finantzak" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Testu-prozesadorea" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Testu-editoreak" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Web nabigatzaileak" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Denak" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Nabarmendua" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Ekintza" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Abentura" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkade-jokoak" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Bloke-jokoak" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Mahai-jokoak" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kartak" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatzaileak" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Umeentzako" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logika-jokoak" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rol-jokoak" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Kirolak" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estrategia" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Denak" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Nabarmendua" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Berriketa" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Denak" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Nabarmendua" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Adimen artifiziala" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomia" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kimika" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Hizkuntzak" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematikak" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Berriak" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Artea" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Bibliografia" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komikiak" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fikzioa" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Osasuna" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historia" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Bizimodua" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Kirolak" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Denak" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Nabarmendua" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Araztaileak" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDEak" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodekak" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hardwarearen kontrolatzaileak" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Letra-tipoak" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Sarrerako iturburuak" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Hizkuntza-paketeak" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Itzulpengintza" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Sortu" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Egin lan" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Jolastu" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Sozializatu" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Ikasi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Garatu" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodekak" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Hardwarearen kontrolatzaileak" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Letra-tipoak" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Sarrerako iturburuak" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Hizkuntza-paketeak" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Kokapena" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Aplikazioa" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "'%s'(e)k fitxategi-formatu gehigarriaren euskarria eskatzen ari da." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "MIME mota gehigarriak behar dira" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "'%s'(e)k letra-tipo gehigarriak eskatzen ari da." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Letra-tipo gehigarriak behar dira" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "'%s'(e)k multimediaren kodeka gehigarriak eskatzen ari da." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Multimediaren kodeka gehigarriak behar dira" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "'%s'(e)k inprimagailuen kontrolatzaile gehigarriak eskatzen ari da." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Inprimagailuen kontrolatzaile gehigarriak behar dira" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "'%s'(e)k pakete gehigarriak eskatzen ari da." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Pakete gehigarriak behar dira" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Bilatu softwarean" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "Erakutsi g_ehiago" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Erakutsi g_utxiago" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Kentzen…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Berrabiarazi behar da instalazioa amaitzeko" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Berrabiarazi behar da kentzea amaitzeko" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Zain dagoen instalazioa…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Zain dagoen eguneratzea…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Deskargatzen…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Prestatzen…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Desinstalatzen…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s ez dago instalatuta, baina oraindik bere datuak daude." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Berrabiarazi" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Gaitu…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instalatu…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s AEBko ingelesez agertuko da" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Aplikazio hau AEBko ingelesez agertuko da" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Software hau AEBko ingelesez agertuko da" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Lagundu it_zultzen" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "%s hornitzailearen beste aplikazio batzuk" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "%s garatzaileak %s softwarearen jabea dela frogatu du" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Garatzaileak %s softwarearen jabea dela frogatu du" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Interneterako sarbidea behar duzu iritzia idazteko" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Aplikazio honek ez ditu eguneratzeak jasotzen dagoeneko, ezta segurtasun-konponketak ere" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "Uneko banaketak jadanik aplikazio hau hau dauka, eta ez litzateke ordeztu behar." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "Aplikazio honek ez du estekarik eskaintzen webgune batera, kode-biltegi batera edo auzien segimenduko sistema batera joateko." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Software honek ez ditu eguneratzeak jasotzen dagoeneko, ezta segurtasun-konponketak ere" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "Uneko banaketak jadanik software hau hau dauka, eta ez litzateke ordeztu behar." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "Software honek ez du estekarik eskaintzen webgune batera, kode-biltegi batera edo auzien segimenduko sistema batera joateko." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "Software aplikazioak huts egin du “%s” aplikazioari buruzko informazioa atzitzean eta ezin ditu bere xehetasunak erakutsi." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Berrikuspen-erantzun baliogabea jaso da zerbitzaritik" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Huts egin du “%s” apllikazioaren berrikuspenaren bidalketak: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Xehetasunen orria" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Aplikazioaren xehetasunak kargatzen" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Egiaztatua" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Ireki" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Eguneratu" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Desinstalatu" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Gehigarriak" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "Aplikazio hau soilik erabil daiteke interneterako konexio aktibo batekin." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Software-biltegia sartu da" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "Aplikazio honek software-biltegi bat du eguneratzeak eskaintzeko, bai eta beste software batzuetarako sarbidea emateko ere." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Ez da software-biltegia sartu" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "Aplikazio honek ez du software-biltegirik. Ez da eguneratuko bertsio berriak daudenean." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Software-biltegia identifikatu da" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "Software-biltegi hau gehitzean, beste software batzuk eta bertsio-berritze gehigarriak eskuratuko dituzu." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Erabili zuretzat fidagarriak diren software-biltegiak soilik." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Garbitu aplikazioaren datuak" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "E_zabatu datuak" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Metadaturik ez" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Proiektuaren _webgunea" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Eman dirua" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Lagundu it_zultzen" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Jakinarazi akatsa" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Laguntza" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontaktua" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Idatzi be_rrikuspena" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Berrikuspen guztiak" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Ezin dira aplikazioaren xehetasunak erakutsi" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Berrabioaren prestaketak huts egin du" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Errore ezezaguna" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Ez da gakoa aurkitu" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Gakoa ez da erregistratu" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK erregistroa behar da" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Hurrengoa" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "Gailu honek abio segurua gaituta du. Kontrolatzaile berriak gaitzeko, makinaren jabe-gako (MOK) berria erregistratu behar da. Prozesuan zehar pasahitz bat sartu behar da. Idatzi paper batean gakoari lotutako honako pasahitza:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "MOK _pasahitzaren ohar bat egin dut" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Berrabiarazi eta erregistratu…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Konfigurazio-argibideak: irakurri arretaz" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "Berrabiarazi ondoren, gailua konfiguratzeko pantaila bat erakutsiko da. Kontrolatzaile berriak gaitzeko, jarraitu konfigurazioaren urratsak:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "• Hautatu “Erregistratu MOKa”\n" +"• Hautatu “Bai” gakoak erregistratzeko\n" +"• Sartu MOK pasahitza eskatzen zaizunean\n" +"• Hautatu “Berrabiarazi”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Segurtasun-ondorioak" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "Gakoa ondo erregistratu ondoren, kontuan izan moduluaren edo beste edozein moduluren etorkizuneko eguneratzeak inplizituki onartuko direla. Eguneratze berriak modu gardenean gertatuko dira, elkarrekintzarik edo baimenik gabe." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "Honi buruzko informazio gehiagko, dokumentuen orrian." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Metadatu gehigarrien fitxategiak deskargatzen…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " eta " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "'%s' scriptaren letra-tipo eskuragarriak" +msgstr[1] "'%s' scripten letra-tipo eskuragarriak" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Softwarea eskuragarri '%s'(r)entzako" +msgstr[1] "Softwarea eskuragarri '%s'(r)entzako" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Eskatutako softwarea ez da aurkitu" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Huts egin du eskatutako softwarea aurkitzeak" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s ez da aurkitu" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "webgunean" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Ez dago '%s' fitxategia eskaintzen duen aplikaziorik eskuragarri." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "Bai '%s' buruzko informazioa bai falta diren aplikazioak nola lor daitezkeen buruzko aukerak '%s'(e)n aurki ditzakezu." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Ez dago aplikaziorik eskuragarri '%s' euskarriarentzako." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "'%s' ez dago eskuragarri." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "Bai '%s' buruzko informazioa bai formatu hau onartzen duen aplikazioa nola lor daitekeen buruzko aukerak '%s'(e)n aurki ditzakezu." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Ez dago letra-tiporik eskuragarri '%s' scriptaren euskarriarentzako." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "Bai '%s' buruzko informazioa bai aplikazio gehigarriak nola lor daitezkeen buruzko aukerak '%s'(e)n aurki ditzakezu." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Ez dago '%s' formatuaren kodek gehigarririk eskuragarri." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "Bai '%s' buruzko informazioa bai formatu hau erreproduzi dezakeen kodeka nola lor daitekeen buruzko aukerak '%s'(e)n aurki ditzakezu." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Ez dago Plasma baliabiderik eskuragarri '%s' euskarriarentzako." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "Bai '%s' buruzko informazioa bai Plasma baliabide gehigarriak nola lor daitezkeen buruzko aukerak '%s'(e)n aurki ditzakezu." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Ez dago inprimagailuaren kontrolatzailerik eskuragarri '%s'(r)entzako." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "Bai '%s' buruzko informazioa bai inprimagailu hau onartzen duen kontrolatzailea nola lor daitekeen buruzko aukerak '%s'(e)n aurki ditzakezu." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentazioa" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "Ez da aurkitu %s %s aplikaziorako. Ikusi %s xehetasun gehiagorako." +msgstr[1] "Ez da aurkitu %s %s aplikaziorako. Ikusi %s xehetasun gehiagorako." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "Bilatutako %s kodeka ez da aurkitu. Ikusi %s xehetasun gehiagorako." +msgstr[1] "Bilatutako %s kodeka ez da aurkitu. Ikusi %s xehetasun gehiagorako." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Huts egin du bilaketa-emaitzak aurkitzeak: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "'%s' fitxategi-formatua" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Instalatu _dena" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Ezin da eskatutako softwarea aurkitu" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kodeken orria" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Ez da emaitzarik aurkitu" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Ezin da bilaketa gauzatu" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Aurrekoa" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Hurrengoa" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Nabarmendutako aplikazioen zerrenda" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Mahaiganeko euskarria" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Pantaila handian erabilitako euskarriak" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Mahaigaineko euskarri ezezaguna" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Ez dago aski informaziorik pantaila handiak onartzen diren jakiteko" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Pantaila handia behar du" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Mahaigaina ez da onartzen" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Ezin da pantaila handian erabili" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mugikorretako euskarria" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Pantaila txikian erabilitako euskarriak" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mugikorretako euskarri ezezaguna" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Ez dago aski informaziorik pantaila txikiak onartzen diren jakiteko" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Pantaila txikia behar du" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mugikorrak ez dira onartzen" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Ezin da pantaila txikian erabili" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Teklatuen euskarria" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Teklatuen euskarri ezezaguna" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Ez dago aski informaziorik teklatuak onartzen diren jakiteko" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Teklatua behar da" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Teklatuak onartzen ditu" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Teklatua ez da onartzen" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Ezin da erabili teklaturik gabe" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Saguen euskarria" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Sagua edo gailu erakuslea behar du" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Saguen euskarri ezezaguna" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "Ez dago aski informaziorik saguak edo gailu erakusleak onartzen diren jakiteko" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Sagua behar da" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Saguak eta gailu erakusleak onartzen ditu" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Sagua ez da onartzen" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Ezin da erabili saguarekin edo gailu erakuslearekin" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Ukipen-pantailen euskarria" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Ukipen-pantailen euskarri ezezaguna" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Ez dago aski informaziorik ukipen-pantailak onartzen diren jakiteko" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Ukipen-pantaila behar da" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Ukipen-pantailak onartzen ditu" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Ez ditu ukipen-pantailak onartzen" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Ezin da erabili ukipen-pantailarekin" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Joko-agintea behar da" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Joko-agintea behar du" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Joko-aginteen euskarria" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Joko-aginteak onartzen ditu" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s ziur aski ondo ibiliko da gailu honetan" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s badabil gailu honetan" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s ziur aski ondo ibiliko da gailu honetan" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s ez dabil ongi gailu honetan" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s ez dabil gailu honetan" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Hardware-euskarria" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Nabigazioa" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Joan arakatze-orrira" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Joan instalatuen orrira" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Joan eguneratzeen orrira" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Ireki bilaketa-barra" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Leihoak" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Ireki hobespenak" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Ireki software-biltegiak" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Laguntza" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Ireki laster-teklak" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalatua" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Instalatutakoen orria" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Abian" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplikazioak" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Web-aplikazioak" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Sistemako aplikazioak" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Komunitateak eraikia" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "Hartu _parte" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "Aplikazio hau nazioarteko komunitate batek eraiki du modu irekian eta %s lizentziarekin askatu du.\n" +"\n" +"Hura hobetzen lagundu dezakezu nahi baduzu." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "Aplikazio hau nazioarteko komunitate batek eraiki du modu irekian eta %s lizentziarekin askatu du.\n" +"\n" +"Hura hobetzen lagundu dezakezu nahi baduzu." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "Software hau nazioarteko komunitate batek eraiki du modu irekian eta %s lizentziarekin askatu du.\n" +"\n" +"Hura hobetzen lagundu dezakezu nahi baduzu." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "Software hau nazioarteko komunitate batek eraiki du modu irekian eta %s lizentziarekin askatu du.\n" +"\n" +"Hura hobetzen lagundu dezakezu nahi baduzu." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Lizentzia ezezaguna" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Ikasi gehiago" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "Aplikazio honek ez du zehazten zein lizentziarekin garatu den eta, beraz, jabeduna izan daiteke. Segurtasun gutxi eduki dezake detektatzeko zaila izan daitekeen tokietan, eta inolako abisurik gabe aldatu daiteke.\n" +"\n" +"Ezin izango duzu aplikazio honen garapenean lagundu." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "Software honek ez du zehazten zein lizentziarekin garatu den eta, beraz, jabeduna izan daiteke. Segurtasun gutxi eduki dezake detektatzeko zaila izan daitekeen tokietan, eta inolako abisurik gabe aldatu daiteke.\n" +"\n" +"Ezin izango duzu software honen garapenean lagundu." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Jabeduna" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "Aplikazio hau ez da modu irekian garatu eta, beraz, bere garatzaileek soilik dakite nola funtzionatzen duen. Segurtasun gutxi eduki dezake detektatzeko zaila izan daitekeen tokietan, eta inolako abisurik gabe aldatu daiteke.\n" +"\n" +"Ezin izango duzu aplikazio honen garapenean lagundu edo iritzirik eman." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "Software hau ez da modu irekian garatu eta, beraz, bere garatzaileek soilik dakite nola funtzionatzen duen. Segurtasun gutxi eduki dezake detektatzeko zaila izan daitekeen tokietan, eta inolako abisurik gabe aldatu daiteke.\n" +"\n" +"Ezin izango duzu software honen garapenean lagundu edo iritzirik eman." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Lizentzia berezia" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "Aplikazio hau %s lizentzia bereziarekin garatu da.\n" +"\n" +"Agian bere garapenean lagundu ahal izango duzu, baina ez dakigu ziur." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "Aplikazio hau “%s” lizentzia bereziarekin garatu da.\n" +"\n" +"Agian bere garapenean lagundu ahal izango duzu, baina ez dakigu ziur." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "Software hau %s lizentzia bereziarekin garatu da.\n" +"\n" +"Agian bere garapenean lagundu ahal izango duzu, baina ez dakigu ziur." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "Software hau “%s” lizentzia bereziarekin garatu da.\n" +"\n" +"Agian bere garapenean lagundu ahal izango duzu, baina ez dakigu ziur." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Datuak freskatzen" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Orria kargatzen" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Abiarazten" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Iturburu ezezaguna" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Erabiltzailea" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Gehitutakoak" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Kendutakoak" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Eguneratzeak" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Aurreko bertsiora itzulitakoak" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "hautatutako kanpoko iturburuak" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "%s iturburuko software gehigarria atzitzeko aukera ematen du. Jabedun zenbait software ere badago hor.\n" +"\n" +"Biltegi horiek geroago gaitu daitezke 'Software-biltegiak' hobespenean." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Gaitu hirugarrenen software-biltegiak?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ez ikusi egin" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Gaitu" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Zure sistema eragilerako eskuragarri" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "%s sistemarako eskuragarri" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Arakatu" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Ikuspegi orokorraren orria" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Erabilgarri dauden aplikazioak" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Beste kategoria batzuk" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Ez da aplikazioaren daturik aurkitu" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Ezezaguna" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Ados" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Erabiltzaileak baztertutako instalazioa" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Prestatu %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Ziur zaude %s biltegia kendu nahi duzula?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "%s biltegiko aplikazio guztiak desinstalatuko dira, eta biltegia berriro instalatu beharko da horiek berriro erabiltzeko." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Desinstalatu %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "%s ezin izango da erabili hura kendu ondoren." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "Ezin izango dira erabili %s exekuzio-denboraren mendekoak diren aplikazioak hura kendu ondoren." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "Ezin izango da erabili %s letra-tipoa hura kendu ondoren, hura erabiltzen duten dokumentuak beste letra-tipo batekin agertuko dira." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "Ezin izango da erabili %s kodeka hura kendu ondoren. Horren ondorioz, zenbait multimedia-fitxategia ezin izango dira erreproduzitu." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "%s firmwarearen mendekoa den hardwareak ez du ongi funtzionatuko hura kendu ondoren." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "%s ezin izango da erabili hura kendu ondoren. Aplikazioen datuak eta ezarpenak diskoan mantenduko dira, etorkizunean aplikazioa leheneratu ahal izateko." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Hobespenak" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Software-eguneratzeak" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Informazio gehiago" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "Datuak eta energia erabiltzen dira eguneratzeak bilatu eta deskargatzeko. Horregatik, eguneratze automatikoak pausatu egiten dira sare-konexio mugatuetan eta energia aurrezteko modua aktibatuta dagoenean." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatikoa" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Bilatu eta deskargatu eguneratzeak automatikoki" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Eskuzkoa" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Eguneratzeak bilatzea eta deskargatzea eskuz egin behar da" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Eguneratze-_jakinarazpen automatikoak" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Jakinarazi eguneratzeak automatikoki instalatu direnean" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Eduki-iragazkiak" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Erakutsi software _librea soilik" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Ezkutatu jabedun softwarea arakatzean eta bilatzean" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Erakutsi _egiaztatutako garatzaileak soilik" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Erakutsi nortasuna egiaztatuta duten garatzaileen aplikazioak soilik" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "Instalatutako softwarea ez da bateragarria %s sistemarekin eta automatikoki kenduko da bertsio-berritzean zehar." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Software bateraezina" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Bertsio-berritu" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Desinstalatu" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Aplikazioaren ezarpenak eta datuak" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Mantendu" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Aplikazioen ezarpenak eta edukia leheneratzea ahalbidetzen du" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "Ez_abatu" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Behin betiko ezabatzen ditu datuak, diskoko lekua irabazteko" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "“%s” gunetik instalatu den softwareak ez ditu eguneratze gehiago jasoko." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "Begiratu zein datu bidaltzen den gure pribatutasun-politikan. Zure kontuari lotutako izen osoa publikoki erakutsiko da." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "Berrikuspen %u guztira" +msgstr[1] "%u berrikuspen guztira" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "5 izarretik" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Ezezaguna" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "Portaera takarra, gehiegizkoa edo diskriminatzaileari buruzko iritziak eman ditzakezu." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "Behin emandakoan, iritzia ezkutatu egingo da administratzaile batek egiaztatu arte." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Bidali iritzia?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Jakinarazi" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Kendu iritzia?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Iritzia kentzea ezin da desegin." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Atsegin iritzia" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Desatsegin iritzia" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Eman berri…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Kendu…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "Aplikazioa ez dago isolatuta baina banaketak egiaztatu du ez dela maltzurra" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Egiaztatu hornitzaileaz fidatzen zarela, aplikazio hau ez baitago isolatuta" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Baimenik ez" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Aplikazioa osorik isolatuta dago" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Sareko sarbidea" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Ezin da internetera sartu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Ez dago sareko sarbiderik" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Ezin da internetera sartu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Erabili sistema-zerbitzuak" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Datuak sistema-zerbitzuei eskatu dakizkieke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Saio-zerbitzuak darabiltza" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Datuak saio-zerbitzuei eskatu dakizkieke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Erabiltzaile-gailuen atzipena" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Web-kamerak eta jokoetarako kontrolak bezalako gailuak atzitu daitezke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Ez dago erabiltzaile-gailuen atzipenik" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Ezin dira web-kamerak eta jokoetarako kontrolak bezalako gailuak" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Sarrera-gailuaren atzipena" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Mikrofonoa erabiltzea eta audioa erreproduzitzea" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Mikrofonoak erabiliz entzun dezake eta audioa erreproduzitu dezake baimena eskatu gabe" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Sistema-gailuen atzipena" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Goi mailako baimenak behar dituzten sistema-gailuak atzitu daitezke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Pantaila-edukiak atzitzea" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Pantaila-edukiak edo beste leiho batzuetakoak atzitu daitezke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Leiho-sistema zaharra" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Ausazko baimenak" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Erabiltzaile-ezarpenak" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Fitxategi-sistema irakurtzeko/idazteko sarbide osoa" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Ezin dira fitxategi-sistemako datu guztiak irakurri eta idatzi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Karpeta nagusia irakurtzeko/idazteko sarbidea" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Zure karpeta nagusiko datu guztiak irakurri eta idatzi daitezke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Fitxategi-sistema osoa irakurtzeko sarbidea" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Fitxategi-sistemako datu guztiak irakurri daitezke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Karpeta nagusia irakurtzeko sarbidea" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Zure karpeta nagusiko datu guztiak irakurri daitezke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Deskargen karpeta irakurtzeko/idazteko sarbidea" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Zure deskargen karpetako datu guztiak irakurri eta idatzi daitezke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Deskargen karpeta irakurtzeko sarbidea" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Zure deskargen karpetako datu guztiak irakurri daitezke" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Direktorioko datu guztiak irakurri eta idatzi daitezke" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Direktorioko datu guztiak irakurri daitezke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Fitxategi-sistemaren sarbiderik ez" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Ezin da fitxategi-sistemara sartu" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Aplikazioaren garatzailea egiaztatuta dago" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Aplikazio honen garatzailea esaten duena dela egiaztatu da" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Mendekotasun ez seguruak" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "Softwarea edo bere mendekotasunak ez dira jadanik mantentzen eta agian ez dira seguruak" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "Aplikazio honek ez du zehaztu zein lizentziarekin garatu den eta jabeduna izan daiteke." + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "Software honek ez du zehaztu zein lizentziarekin garatu den eta jabeduna izan daiteke." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Kode jabeduna" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "Iturburu-kodea ez da publikoa, eta beraz, ezin da modu independentean ikuskatu eta ez segurua izan daiteke" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Aplikazio hau “%s” lizentzia bereziarekin garatu da." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Software hau “%s” lizentzia bereziarekin garatu da" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Kode ikuskagarria" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "Iturburu-kodea publikoa da eta modu independentean ikuskatu daiteke, eta beraz, aplikazioa seguruagoa izateko aukera gehiago daude" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s pribilegiatua da" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s segurua da" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s seguru samarra da" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s agian ez da segurua" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s ez da segurua" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Ezezaguna" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Segurtasuna" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Lizentzia" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Iturburua" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "Aplikazio honek software-plataformaren (SDK) bertsio zaharkitua darabil eta konpondu ezin daitezkeen akatsak edo segurtasun-ahultasunak eduki ditzake." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Aurreko pantaila-argazkia" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Hurrengo pantaila-argazkia" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Pantaila-argazkirik ez" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Ez da pantaila-argazkirik aurkitu" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Huts egin du irudia kargatzean" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Ez da pantaila-argazkiaren tamaina aurkitu" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Ezin izan da cachea sortu" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Ez da baliozko pantaila-argazkia" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Pantaila-argazkia ez dago eskuragarri" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Pantaila-argazkia" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "bat datorren %u gehiago" +msgstr[1] "bat datozen %u gehiago" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Bilaketaren orria" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Bilatu aplikazioak" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Ez da aplikaziorik aurkitu" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "\"%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "Ezin dira eguneratzeak deskargatu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "Ezin dira firmware-eguneratzeak deskargatu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Ezin dira firmware-eguneratzeak deskargatu %s gunetik" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Ezin dira eguneratzeak deskargatu %s gunetik" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "Ezin da eguneratu: interneterako sarbidea behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "Ezin da eguneratu: ez dago diskoko nahiko lekurik" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Ezin dira eguneratzeak deskargatu %s gunetik: ez dago nahikoa leku librerik diskoan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "Ezin da eguneratu: autentifikazioa behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "Ezin da eguneratu: autentifikazio baliogabea" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "Ezin da eguneratu: baimena behar da" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Ezin dira eguneratzeak deskargatu: ez daukazu nahikoa baimen softwareak instalatzeko" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "Ezin da eguneratzeen zerrenda eskuratu" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "Ezin da instalatu: deskargak huts egin du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Ezin da %s instalatu: deskargak huts egin du %s gunetik" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Ezin da %s instalatu: deskargak huts egin du" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "Ezin da instalatu: exekuzio-denbora falta da" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Ezin da %s instalatu: %s exekuzio-denbora ez dago erabilgarri" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "Ezin da %s instalatu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "Ezin da instalatu: interneterako sarbidea behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "Ezin da instalatu: aplikazioaren formatu baliogabea" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "Ezin da instalatu: ez dago diskoko nahiko lekurik" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Ezin da %s instalatu: ez dago diskoko nahiko lekurik" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "Ezin da instalatu: autentifikazioa behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Ezin da %s instalatu: autentifikatu behar duzu" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "Ezin da instalatu: autentifikazio baliogabea" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Ezin da %s instalatu: autentifikazio baliogabea" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "Ezin da instalatu: baimena behar da" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Ezin da %s instalatu: baimena behar da" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "Ezin da instalatu: gailuak entxufatuta egon behar du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Ezin da %s instalatu: gailuak entxufatuta egon behar du" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "Ezin da instalatu: bateria gutxi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Ezin da %s instalatu: bateria gutxi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Ezin da %s eguneratu %s biltegitik: deskargak huts egin du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Ezin da %s eguneratu: deskargak huts egin du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Ezin da %s biltegiko eguneratzerik instalatu: deskargak huts egin du" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "Ezin da eguneratu: deskargak huts egin du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Ezin da %s eguneratu: ez dago diskoko nahiko lekurik" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Ezin da %s eguneratu: autentifikatu behar duzu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Ezin da %s eguneratu: autentifikazio baliogabea" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Ezin da %s eguneratu: baimena behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "Ezin da eguneratu: gailuak entxufatuta egon behar du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Ezin da %s eguneratu: gailuak entxufatuta egon behar du" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "Ezin da eguneratu: bateria gutxi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Ezin da %s eguneratu: bateria gutxi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "Ezin da %s eguneratu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "Ezin da eguneratu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "Ezin da bertsio-berritu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Ezin da %2$s(e)ndik %1$s(e)ra bertsio-berritu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "Ezin da bertsio-berritu: deskargak huts egin du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Ezin da %s bertsio-berritu: deskargak huts egin du" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "Ezin da bertsio-berritu: interneterako sarbidea behar da" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Ezin da %s bertsio-berritu: interneterako sarbidea behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "Ezin da bertsio-berritu: ez dago diskoko nahiko lekurik" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Ezin da %s bertsio-berritu: ez dago diskoko nahiko lekurik" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "Ezin da bertsio-berritu: autentifikazioa behar da" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Ezin da %s bertsio-berritu: autentifikazioa behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "Ezin da bertsio-berritu: autentifikazio baliogabea" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Ezin da %s bertsio-berritu: autentifikazio baliogabea" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "Ezin da bertsio-berritu: baimena behar da" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Ezin da %s bertsio-berritu: baimena behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Ezin da bertsio-berritu: gailuak entxufatuta egon behar du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Ezin da %s bertsio-berritu: gailuak entxufatuta egon behar du" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "Ezin da bertsio-berritu: bateria gutxi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Ezin da %s bertsio-berritu: bateria gutxi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Ezin da %s bertsio-berritu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "Ezin da bertsio-berritu: autentifikazioa behar da" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Ezin da %s desinstalatu: autentifikatu behar duzu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "Ezin da desinstalatu: autentifikazio baliogabea" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Ezin da %s desinstalatu: autentifikazio baliogabea" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "Ezin da desinstalatu: baimena behar da" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Ezin da %s desinstalatu: baimena behar da" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Ezin da desinstalatu: gailuak entxufatuta egon behar du" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Ezin da %s desinstalatu: gailuak entxufatuta egon behar du" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "Ezin da desinstalatu: bateria gutxi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Ezin da %s desinstalatu: bateria gutxi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Ezin da %s desinstalatu" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "Ezin da %s abiarazi" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "Zerbait gaizki irten da" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Ezin da %s abiarazi: %s ez dago instalatuta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "Ez dago nahiko leku librerik eragiketarako" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "Ezin da instalatu: fitxategi mota ez da onartzen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "Ezin da instalatu: autentifikazioak huts egin du" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "Ezin da instalatu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "Ezin da %s kontaktatu" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "Berrabiarazi Software aplikazioa plugin berriak erabiltzeko" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "Gailuak entxufatuta egon behar du" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "Bateria-maila baxuegia da" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Software-biltegiak" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Hobespenak" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "Las_ter-teklak" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "Softwarea aplikazioari b_uruz" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Bilatu" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menu nagusia" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Bilatu aplikazioak" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Arakatu" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalatua" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Eguneratzeak" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Joan atzera" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Bat ere ez" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Aplikazio-datuak" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Aplikazioa exekutatzeko behar diren datuak" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Erabiltzaile-datuak" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Aplikazioan sortu dituzun datuak" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Cache-datuak" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Cachean aldi baterako gorde diren datuak" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Aplikazioa bera" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Beharrezko mendekotasunak" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Aplikazio honek behar dituen sistemako osagai partekatuak" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Ezezaguna" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Cachean dauden datuak _aplikazioaren ezarpenetan garbitu daitezke." + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Biltegiratzea" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (instalatuta)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (instalatzen)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (deskargatzen)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (kentzen)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Xehetasunak" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Aztertu" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "'%s'(e)n instalatuta" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Instalatutako eguneratzeak" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Ez da eguneratzerik instalatu" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Eguneratzeak iraungita daude" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Egiaztatu eguneratzeak dauden" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Eguneratze kritikoak instalatzeko prest daude" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Instalatu eguneratze kritikoak ahal bezain laster" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Eguneratze kritikoak daude deskargarako prest" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Deskargatu eguneratze kritikoak ahal bezain laster" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Eguneratzeak instalatzeko prest daude" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Software-eguneratzeak prest eta zain daude" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Eguneratzeak deskargarako prest" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Software-eguneratzeak deskargatu daitezke" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "Aplikazio %u eguneratu da — Beharrezkoa da berrabiaraztea" +msgstr[1] "%u aplikazio eguneratu dira — Beharrezkoa da berrabiaraztea" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "Aplikazio %u eguneratu da" +msgstr[1] "%u aplikazio eguneratu dira" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s eguneratu da." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Berrabiarazi aplikazioa." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s eta %s eguneratu dira." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "Aplikazio %u berrabiarazi behar da." +msgstr[1] "%u aplikazio berrabiarazi behar dira." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s, %s eta %s barne hartzen ditu." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Sistema bere bizitzaren amaierara iritsi da" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Bertsio-berritu eguneratzeak jasotzen jarraitzeko" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s aplikazioaren bertsio berria eskuragarri dago instalatzeko" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Softwarearen bertsio berria eskuragarri" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Huts egin du softwareak eguneratzean" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Prestatutako eguneratzeak ez dira instalatu" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Erakutsi xehetasunak" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Sistemaren bertsioa berritu da" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Ongi etorri %s %s sistemara!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Softwarearen eguneratzea instalatuta" +msgstr[1] "Software-eguneratzeak instalatuta" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Sistema eragilearen eguneratze garrantzitsu bat instalatu da." +msgstr[1] "SEren eguneratze garrantzitsuak instalatu dira." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Berrikuspena" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Huts egin du eguneratzeak" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Sistema jadanik eguneratuta dago." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Eguneratzea bertan behera utzi da." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "Interneteko sarbidea behar da, baina ez dago erabilgarri. Ziurtatu Interneterako sarbidea duzula eta saiatu berriro." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "Segurtasun-arazoak daude eguneratzearekin. Kontsultatu softwarearen hornitzailearekin xehetasun gehiagorako." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Ez dago nahikoa leku librerik. Askatu leku pixka bat eta saiatu berriro." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "Sentitzen dugu: eguneratzea ezin izan da instalatu. Itxaron beste eguneratze bati eta saiatu berriro. Arazoak jarraitzen badu, jarri harremanetan software-hornitzailearekin." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Azken egiaztaketa: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Gelditu" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Egiaztatu eguneratzeak dauden" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ez ditu jadanik arazo larrietarako software-eguneratzeak jasotzen" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Zure sistema eragileak ez ditu jadanik arazo larrietarako software-eguneratzeak jasotzen" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Gastu gehigarriak sor daitezke" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "Bandazabal mugikorra erabiliz eguneratzeak dauden egiaztatzeak zure fakturaren gastua handiagotu dezake." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Egiaztatu _dena den" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Softwarearen bertsio berria deskargatu dira" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Eguneratzeak instalatzeko prest daude" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Egiaztatu eguneratzeak dauden" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Eguneratzeak" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Eguneratzeen orria" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Eguneratzeak kargatzen" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Denbora beharko du" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Eguneratuta" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Erabili mugikorreko datuak?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "Bandazabal mugikorra erabiliz eguneratzeak dauden ala ez egiaztatzeak zure fakturaren gastua handiagotu dezake" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Egiaztatu dena den" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Ez dago konexiorik" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Konektatu eguneratzeak egiaztatzeko" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Sarearen ezarpenak" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Errorea" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Eguneratzeak automatikoki kudeatzen dira" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Software-eguneratzeak pausatu dira" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Software-eguneratze automatikoak pausatu dira honako arrazoiengatik:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "\n" +"• Uneko sare-konexioa mugatua da" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "\n" +"• Uneko sare-konexioak deskarga handiak debekatuta ditu" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "\n" +"• Energia aurrezteko modua aktibo dago" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "\n" +"• Joko-modua aktibo dago" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Software-eguneratzeak pausatu dira" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Sare-konexioa mugatuta dago — software-eguneratzeak pausatu dira" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "Sare-konexioak deskarga handiak debekatuta ditu — software-eguneratzeak pausatu dira" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Energia aurrezteko modua aktibo dago — software-eguneratzeak pausatu dira" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Joko-modua aktibo dago — software-eguneratzeak pausatu dira" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Berrabiarazi eta eguneratu…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "E_guneratu dena" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Software-eguneratzeak deskargatu dira" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Eguneratzeak instalatzeko prest daude" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integratutako firmwarea" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Berrabiarazi behar da" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Aplikazioen eguneratzeak" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Gailuaren firmwarea" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Deskargatu" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s erabilgarri" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s erabilgarri" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Ikasi gehiago bertsio berriari buruz" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s / %s deskargatu da" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%% %u deskargatu da" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Bertsio-berritze nagusia, eginbide berriekin eta gehitutako dotoreziekin." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Utzi bertsio-berritzea" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Berrabiarazi eta bertsioa berritu…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Gogoratu datuen eta fitxategien babeskopia egitea bertsioa berritu baino lehen." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Errorearen xehetasunak" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Kopiatu xehetasunak" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Huts egin du “%s” fitxategia ezabatzeak: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Huts egin du “%s” direktorioa ezabatzeak: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Gehitu, kendu edo eguneratu ordenagailu honetako softwarea" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "Eguneratzeak;Bertsio-berritzeak;Iturburuak;Biltegiak;Hobespenak;Instalatu;Desinstalatu;Programa;Softwarea;Aplikazioa;Denda;App;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s prest" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s prest dago hurrengo berrabioan gaitu eta abian jar dadin." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Gaitu" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Sistemaren eguneratzeak" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "Sistemaren eguneratze orokorrak, esaterako akatsen konponketak eta segurtasunaren hobekuntzak, eta errendimendu-hobekuntzak." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Eginbide berriak eta konponketak dituen eguneratze %s." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS eguneratze-zerbitzuak ezin izan du eguneratzea atzitu eta aplikatu." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Web-aplikazioa" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Web-aplikazioen euskarria" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Exekutatu web-aplikazio ezagunak nabigatzaile batean" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "Berritu bertsioa eginbiderik berrienak, errendimendu hobea eta egonkortasun gehiago lortu nahi baduzu." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak euskarria" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak Linuxeko mahaigaineko aplikazioen lan-marko bat da" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "%s sistemaren karpeta" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "%s azpikarpeta nagusia" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Ostalariaren sistemaren karpetak" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Ostalariaren sistemaren konfigurazioa /etc direktoriotik" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Mahaigainaren karpeta" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Mahaigainaren %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Dokumentuen karpeta" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Dokumentuen %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Musikaren karpeta" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Musikaren %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Irudien karpeta" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Irudien %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Partekatze publikoko karpeta" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Partekatze publikoko %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Bideoen karpeta" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Bideoen %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Txantiloien karpeta" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Txantiloien %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Erabiltzaile-cachearen karpeta" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Erabiltzaile-cachearen %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Erabiltzaile-konfigurazioaren karpeta" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Erabiltzaile-konfigurazioaren %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Erabiltzaile-datuen karpeta" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Erabiltzaile-datuen %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Erabiltzailearen exekuzio-denboraren karpeta" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Erabiltzailearen exekuzio-denboraren %s azpikarpeta" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Fitxategi-sistemaren sarbidea %s(e)ra" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Flatpak-eko %s(r)en metadatuak eskuratzen…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Huts egin du ‘%s’ gehigarria fintzeak: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Erabiltzaile-instalazioa" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Sistemako instalazioa" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Aplikazioaren IDa" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Huts egin du ‘%s’ gehigarriarentzat instalatzeak: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Huts egin du ‘%s’ gehigarriarentzat desinstalatzeak: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "Urruneko “%s”(e)k ez du onartzen “%s” instalatzea, ziur asko bere iragazkiaren erruz. Kendu iragazkia eta errepikatu instalazioa. Errorearen xehetasunak: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Sistemak energia gutxiegi du eguneratzea gauzatzeko" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "Sistemak energia gutxiegi du eguneratzea gauzatzeko (%u%%, behar du %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Gailua ezin da atzitu, edo haririk gabeko eremutik kanpo dago" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Gailuak energia gutxiegi du" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Gailuak energia gutxiegi du (%u%%, behar du %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Gailua eguneratzea aplikatzeko zain dago" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Gailuak argindarrari konektatuta egon behar du" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Gailua ezin da erabili tapa itxita badago" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s gailuaren eguneratzea" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s sistemaren eguneratzea" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s kontrolagailu kapsulatuaren eguneratzea" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s kudeaketa-motorraren eguneratzea" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s kudeaketa-motor korporatiboaren eguneratzea" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s kontsumitzaileentzako kudeaketa-motorraren eguneratzea" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s kontrolagailuaren eguneratzea" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt kontrolagailuaren eguneratzea" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s PUZ mikrokodearen eguneratzea" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s konfigurazioaren eguneratzea" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s bateriaren eguneratzea" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s kameraren eguneratzea" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPMaren eguneratzea" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s ukipen-panelaren eguneratzea" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s saguaren eguneratzea" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s teklatuaren eguneratzea" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s biltegiratze-kontrolagailuaren eguneratzea" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s sareko interfazearen eguneratzea" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s pantailaren eguneratzea" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC eguneratzea" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB jasotzailearen eguneratzea" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s unitatearen eguneratzea" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s flash unitatearen eguneratzea" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSDaren eguneratzea" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPUaren eguneratzea" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s oinarriaren eguneratzea" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB oinarriaren eguneratzea" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmwarea" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Firmwarearen eguneratzea ezin da aplikatu: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Firmwarearen bertsioa berritzeko euskarria" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Firmwarearen bertsioa berritzeko euskarria eskaintzen du" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Instalatu sinatu gabeko softwarea?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "Instalatu nahi den softwarea ez dago sinatuta. Ezin izango da egiaztatu eguneratzeen jatorria, edo eguneratzeak faltsutu diren ala ez." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Deskargatu sinatu gabeko softwarea?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "Sinatu gabeko eguneratzeak daude. Sinadurarik gabe, ezin da egiaztatu eguneratzearen jatorria edo hura faltsutu den." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Eguneratu sinatu gabeko softwarea?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "Sinatu gabeko eguneratzeak daude. Sinadurarik gabe, ezin da egiaztatu eguneratzearen jatorria edo hura faltsutu den. Software-eguneratzeak desgaitu egingo dira sinatu gabeko eguneratzeak kendu edo eguneratu arte." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Eguneratzeen instalazioak huts egin du: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paketeak" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Huts egin du deskarga baino lehen transakzioaren amaierari itxaroteak: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Huts egin du eguneratzeen deskargak: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Huts egin du eguneratzea abiarazteak: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Sistema eragilea (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap biltegia" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap euskarria" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap Linuxeko pakete unibertsal bat da" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistema" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Sistema-osagaia" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "'%s' sysupdate lana kentzeak huts egin du, egoera: %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Sisteman softwarea kudeatzeko modu dotorea." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Sartu zenbakia 1 eta %u artean: " + +#~ msgid "Choose an app:" +#~ msgstr "Aukeratu aplikazio bat:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "'%s' instalatuta dago orain" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Aplikazio bat kendu da" +#~ msgstr[1] "Aplikazio bat" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Ezin da \"%s” aurkitu" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Software-katalogoa deskargatzen" + +#~ msgid "Moderate page" +#~ msgstr "Moderatu orria" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Ez dago berrikuspenik moderatzeko" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Iritzi hau baliagarri izan zaizu?" + +#~ msgid "Yes" +#~ msgstr "Bai" + +#~ msgid "No" +#~ msgstr "Ez" + +#~ msgid "Meh" +#~ msgstr "Beno…" + +#~ msgid "Outdated SDK version" +#~ msgstr "Zaharkitutako SDK bertsioa" + +#~ msgid "Unable to install updates" +#~ msgstr "Ezin dira eguneratzeak instalatu" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Ezin da desinstalatu: autentifikazio baliogabea" + +#~ msgid "Network Settings" +#~ msgstr "Sarearen ezarpenak" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Ezin dira eskuratu sistema eragilearen eguneratzeak" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "" +#~ "Sistema eragilearen eguneratze garrantzitsu bat ezin izan da instalatu." + +#~ msgid "No Network" +#~ msgstr "Ez dago sarerik" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Interneterako sarbidea behar da eguneratzeak egiaztatzeko." + +#~ msgid "Network _Settings" +#~ msgstr "Sarearen e_zarpenak" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Softwarearen bertsio berriak deskargatu dira eta instalatzeko prest daude." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Software-eguneratzeak deskargatu dira eta instalatzeko prest daude." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Bertsio berriaren informazioa deskargatzen…" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Zer duzu gustuko aplikazio honetan? Zure iritzia uzten baduzu, " +#~ "lagungarria izan daiteke besteontzat." + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Software-eguneratze garrantzitsua instalatzeko prest dago" + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Garrantzitsua: software-eguneratze kritikoak zain daude." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Deskargatu zain dauden software-eguneratzeak." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Eguneratze automatikoak pausatu dira" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Uneko sarea neurtutakoa da eta, beraz, datu-mugak eduki ditzake edo agian " +#~ "diru gehiago ordaindu beharko duzu. Datuak aurrezteko, eguneratze " +#~ "automatikoak pausatu egin dira.\n" +#~ "\n" +#~ "Sarea gaizki identifikatu eta neurtutakotzat hartu bada, hori ezarpenetan " +#~ "aldatu daiteke." + +#~ msgid "Open Network _Settings" +#~ msgstr "Ireki sareko _ezarpenak" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Aldaketak eta sarearen mugak saihesteko, software-eguneratzeak ez dira " +#~ "automatikoki deskargatzen konexio mugikorretan edo neurtuetan." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Software-eguneratzeak atzeko planoak deskargatzen eta instalatzen ditu, " +#~ "posible bada" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Erakutsi aplikazio _libreak soilik" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Erakutsi lizentzia librea duten aplikazioak soilik eta ezkutatu jabedun " +#~ "aplikazioak" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Ezin dira eguneratzeak deskargatu: sareko sarbidea behar da, baina ez " +#~ "dago erabilgarri." + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "" +#~ "Ezin dira eguneratzeak deskargatu: ez dago nahikoa leku librerik diskoan" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Ezin dira eguneratzeak deskargatu: autentifikazioa behar da" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Ezin dira eguneratzeak deskargatu: autentifikazioa baliogabekoa da" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Ezin da %s instalatu: ez daukazu nahikoa baimen softwarea instalatzeko" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Ezin da %s instalatu: bateria-maila baxuegia da" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Ezin da eguneratzerik instalatu: ez dago nahikoa lekurik diskoan" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Ezin dira eguneratzeak instalatu: autentifikazioa behar da" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Ezin dira eguneratzeak instalatu: autentifikazioa baliogabea da" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Ezin da %s eguneratu: ez daukazu nahikoa baimen softwarea eguneratzeko" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Ezin dira eguneratzeak instalatu: ez daukazu nahikoa baimen softwarea " +#~ "instalatzeko" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Ezin dira eguneratzeak instalatu: entxufatuta egotea behar da" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Ezin da %s eguneratu: bateria-maila baxuegia da" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Ezin dira eguneratzeak instalatu: bateria-maila baxuegia da" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Ezin da %s bertsiora berritu: interneteko sarbidea behar da, baina ez " +#~ "dago erabilgarri" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Ezin da %s bertsiora berritu: ez daukazu nahikoa baimen bertsio-berritzeko" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Ezin da %s bertsiora berritu: bateria-maila baxuegia da" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Ezin da %s kendu: autentifikazioa behar da" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Ezin da %s kendu: autentifikazioa baliogabea da" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Ezin da %s kendu: ez daukazu nahikoa baimen softwarea kentzeko" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Ezin da %s kendu: entxufatuta egotea behar da" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Ezin da %s kendu: bateria-maila baxuegia da" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Ezin da %s kendu" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Fitxategiaren instalazioak huts egin du: ez dago onartuta" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Instalazioak huts egin du: ez dago onartuta" + +#~ msgid "AC power is required" +#~ msgstr "Entxufatuta egon behar du" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Sare mugatua - eguneratze automatikoak pausatu dira" + +#~ msgid "Find Out _More" +#~ msgstr "Aurkitu _gehiago" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Eguneratzearen deskribapena kargatzen, itxaron…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Erakutsi arazketaren informazio xehea" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Fitxategiak ausaz atzitu ditzake" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Ziur zaude %s desinstalatu nahi duzula?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s desinstalatu egingo da, eta instalatu egin beharko da berriro " +#~ "erabiltzeko." + +#~ msgid "Downloading featured images…" +#~ msgstr "Nabarmendutako irudiak deskargatzen…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Sistema linean egon zen eta eguneratzeak jaso zituen azken unearen data-" +#~ "zigilua" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Hautatutako gehigarriak aplikazioarekin instalatuko dira." + +#~ msgid "Post Review" +#~ msgstr "Bidali iritzia" + +#~ msgid "_Post" +#~ msgstr "Bi_dali" + +#~ msgid "No screenshot provided" +#~ msgstr "Ez da pantaila-argazkirik eman" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Software hau ez dago zure hizkuntzan, AEBetako ingelesean agertuko da." + +#~ msgid "Applications" +#~ msgstr "Aplikazioak" + +#~ msgid "_Continue" +#~ msgstr "_Jarraitu" + +#~ msgid "Rating" +#~ msgstr "Balorazioa" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Eman zure iritziari buruzko laburpen motz bat, adibidez: \"Aplikazio ona, " +#~ "gomendatzen dut\"." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Berrikuspena" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Zein iritzi duzu aplikazio honetaz? Saiatu zure ikuspuntua arrazoitzen." + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Berrabiarazi orain" + +#~ msgid "Primary Menu" +#~ msgstr "Menu nagusia" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Eguneratzeak" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s ez da gehiago sostengatuko." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Segurtasun-eguneratzerik ez duela jasoko adierazten du honek." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Bertsio berriago batera eguneratzea gomendatzen da." + +#~ msgid "Application Updates" +#~ msgstr "Aplikazioen eguneratzea" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Ez da eguneratzerik instalatu sistema honetan." + +#~ msgid "Application manager for GNOME" +#~ msgstr "GNOMEren aplikazio-kudeatzailea" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Software-katalogoa deskargatzen ari da" + +#~ msgid "Name" +#~ msgstr "Izena" + +#~ msgid "user" +#~ msgstr "erabiltzailea" + +#~ msgid "Channel" +#~ msgstr "Kanala" + +#~ msgid "Branch" +#~ msgstr "Adarra" + +#~ msgid "URL" +#~ msgstr "URLa" + +#~ msgid "Installation" +#~ msgstr "Instalazioa" + +#~ msgid "Version" +#~ msgstr "Bertsioa" + +#~ msgid "Access arbitrary files" +#~ msgstr "Atzitu ausazko fitxategiak" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Fitxategiak ausaz atzitu ditzake fitxategi-sisteman" + +#~ msgid "A list of popular applications" +#~ msgstr "Aplikazio ospetsuen zerrenda" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Erabiliko diren aplikazioen zerrenda, sisteman zehaztutakoak gainidatziz." + +#~ msgid "Checking…" +#~ msgstr "Egiaztatzen…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Kargatzen…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Aplikazioen balorazioak deskargatzen…" + +#~ msgid "GNOME Software" +#~ msgstr "GNOME Software" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "" +#~ "Eguneratze-iragarkiaren atzeko planoari erreferentzia egiten dio URIa." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URIak '%u' arte eduki ditzake. Horiek eguneratze-bertsioekin ordeztuko " +#~ "dira." + +#~ msgid "_Add shortcut" +#~ msgstr "_Gehitu lasterbidea" + +#~ msgid "Re_move shortcut" +#~ msgstr "_Kendu lasterbidea" + +#~ msgid "Welcome" +#~ msgstr "Ongi etorri" + +#~ msgid "Welcome to Software" +#~ msgstr "Ongi etorri Softwarera" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Software aplikazioak behar dituzun software guztiak instalatzea " +#~ "ahalbidetzen dizu, dena leku batetik. Ikusi gure gomendioak, arakatu " +#~ "kategoriak, edo bilatu nahi dituzun aplikazioak." + +#~ msgid "_Browse Software" +#~ msgstr "_Arakatu softwarea" + +#~ msgid "OS Updates" +#~ msgstr "SEren eguneratzeak" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "" +#~ "Errendimenduaren, egonkortasunaren eta segurtasunaren hobekuntzak ditu." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Firmwarearen eguneratzearen sinadura deskargatzen…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Firmwarearen eguneratzearen metadatuak deskargatzen…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Softwareak baimen ezezagunak ditu" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Sfotwarea iturburu fidagarri batekoa da" + +#~ msgid "Unknown Permissions" +#~ msgstr "Baimen ezezagunak" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Aplikazio honek behar dituen baimenak ezezagunak dira" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Aplikazioa iturburu fidagarri batetik dator" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Zure banaketak egiaztatu du aplikazio hau fidagarria dela" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "Ez dago optimizatuta ukipen-pantailetarako edo telefonoetarako" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Galdetu libreak ez diren software-biltegiak instalatu nahi diren" + +#~ msgid "Requires a specific screen size" +#~ msgstr "Pantaila-tamaina zehatza behar du" + +#~ msgid "Editor’s Picks" +#~ msgstr "Editorearen hautaketa" + +#~ msgid "Recently Updated" +#~ msgstr "Azken aldian eguneratua" + +#~ msgid "_Read More" +#~ msgstr "_Irakurri gehiago" + +#~ msgid "_Read Less" +#~ msgstr "_Irakurri gutxiago" + +#~ msgid "_Launch" +#~ msgstr "_Abiarazi" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Inoiz ere ez" + +#~ msgid "Localized in your Language" +#~ msgstr "Zure hizkuntzara itzulita" + +#~ msgid "Release Activity" +#~ msgstr "Argitalpenaren jarduera" + +#~ msgid "Developer" +#~ msgstr "Garatzailea" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Desinstalatuta" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Instalatuta" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Eguneratuta" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Ezezaguna" + +#~ msgid "History" +#~ msgstr "Historia" + +#~ msgid "More…" +#~ msgstr "Gehiago…" + +#~ msgid "Recommended Games" +#~ msgstr "Gomendatutako jokoak" + +#~ msgid "Recommended Creation Applications" +#~ msgstr "Gomendatutako sorrera-aplikazioak" + +#~ msgid "Recommended Work Applications" +#~ msgstr "Gomendatutako laneko aplikazioak" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Software horietako batzuk jabedunak dira, eta ondorioz, murriztapenak " +#~ "dituzte erabiltzean, partekatzean eta kodearen iturburua atzitzean." + +#~ msgid "Find out more…" +#~ msgstr "Bilatu gehiago…" + +#~ msgid "Recent Releases" +#~ msgstr "Azken aldiko argitalpenak" + +#~ msgid "Remove “%s”?" +#~ msgstr "Kendu “%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Desgaitu \"%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Biltegi gehigarririk ez" + +#~ msgid "_Remove…" +#~ msgstr "_Kendu…" + +#~ msgid "_Disable…" +#~ msgstr "_Desgaitu…" + +#~ msgid "Disabling" +#~ msgstr "Desgaitzen" + +#~ msgid "Enabled" +#~ msgstr "Gaituta" + +#~ msgid "Disabled" +#~ msgstr "Desgaituta" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (arreta behar du)" + +#~ msgid "_Remove All" +#~ msgstr "_Kendu dena" + +#~ msgid "Setting Up Updates…" +#~ msgstr "Eguneratzeak konfiguratzen…" + +#~ msgid "Looking for New Updates…" +#~ msgstr "Eguneratze berriak bilatzen…" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Eguneratzeak ordenagailua berrabiaraztean aplikatuko dira." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "%s %s deskargaren zain" + +#~ msgid "Downloading %s %s" +#~ msgstr "%s %s deskargatzen" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Denak" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Nabarmendua" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "All" +#~ msgstr "Dena" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Denak" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Nabarmendua" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Denak" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Nabarmendua" + +#~ msgid "Audio & Video" +#~ msgstr "Audioa eta bideoa" + +#~ msgid "Developer Tools" +#~ msgstr "Garapeneko tresnak" + +#~ msgid "Education & Science" +#~ msgstr "Hezkuntza eta zientzia" + +#~ msgid "Games" +#~ msgstr "Jokoak" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafikoak eta argazkigintza" + +#~ msgid "Productivity" +#~ msgstr "Ekoizpena" + +#~ msgid "Communication & News" +#~ msgstr "Komunikazioa eta albisteak" + +#~ msgid "Utilities" +#~ msgstr "Tresnak" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Ezin izan da zehaztu sistemaren zein zati atzitzen duen aplikazio honek. " +#~ "Hori arrunta da aplikazio zaharrenetan." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Baxua" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Tartekoa" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Altua" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Ezezaguna" + +#~ msgid "Public domain" +#~ msgstr "Domeinu Publikoa" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://eu.wikipedia.org/wiki/Software_jabedun" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Erabiltzaileak honako lizentziarekin lotuta daude:" +#~ msgstr[1] "Erabiltzaileak honako lizentziekin lotuta daude:" + +#~ msgid "Sandboxed" +#~ msgstr "Isolatua" + +#~ msgid "Category" +#~ msgstr "Kategoria" + +#~ msgid "Free" +#~ msgstr "Librea" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Ezezaguna" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Softwarea libreki exekutatu, kopiatu, banatu, ikertu eta eraldatu " +#~ "daitekeela adierazten du." + +#~ msgid "Proprietary Software" +#~ msgstr "Software jabeduna" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Horrek esan nahi du softwarearen jabea banakako bat edo enpresa bat dela. " +#~ "Murriztapen asko egon ohi dira hura erabiltzeko, eta bere kode-iturburua " +#~ "ezin ohi da atzitu." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Software honen lizentziaren terminoak ezezagunak dira." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Aplikazioa honela baloratu da, ezaugarri hauek dituelako:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Ez dago balorazio honen xehetasunik eskuragarri." + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Gomendatutako audioen eta bideoen aplikazioak" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Gomendatutako ekoizpenerako aplikazioak" + +#~ msgid "ratings in total" +#~ msgstr "balorazio guztira" + +#~ msgid "Select All" +#~ msgstr "Hautatu dena" + +#~ msgid "Select None" +#~ msgstr "Ez hautatu ezer" + +#~ msgid "Featured %s" +#~ msgstr "Nabarmendua %s" + +#~ msgid "Show" +#~ msgstr "Erakutsi" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Azpikategoriak iragazteko menua" + +#~ msgid "Sort" +#~ msgstr "Ordenatu" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Azpikategoriak ordenatzeko menua" + +#~ msgid "Software is up to date" +#~ msgstr "Softwarea eguneratuta dago" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "ODRSk erabiltzaileei aplikazioen berrikuspenak egiteko zerbitzua " +#~ "eskaintzen die" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Marrazki bizidunetako pertsonaiak egoera arriskutsuetan" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Marrazki bizidunetako pertsonaiak gatazka latzetan" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Biolentzia grafikoa marrazki bizidunetako pertsonaietan" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Pertsonaiak egoera arriskuetan, errealitatetik erraz berezituz" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Pertsonaiak gatazka oldarkorrean, errealitatetik erraz berezituz" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Biolentzia grafikoa, errealitatetik erraz berezituz" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Pertsonai sasi-errealistikoak egoera arriskutsuetan" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Pertsonai errealisten adierazpenak gatazka oldarkorrean" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Biolentzia grafikoa pertsonai errealistikoetan" + +#~ msgid "No bloodshed" +#~ msgstr "Odol-isurtzerik gabekoa" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Odol-isurtze ez-errealistikoa" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Odol-isurtze errealistikoa" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Odol-isurketen eta gorputz-mozketen adierazpenak" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Bortxaketak edo bestelako indarkeriazko sexu portaerak" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Edari alkoholdunen erreferentziak" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Edari alkoholdunen erabilera" + +#~ msgid "References to illicit drugs" +#~ msgstr "Droga ilegalen erreferentziak" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Droga ilegalen erabilera" + +#~ msgid "References to tobacco products" +#~ msgstr "Tabakoen produktuen erreferentziak" + +#~ msgid "Use of tobacco products" +#~ msgstr "Tabakoen produktuen erabilera" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Biluztasun artistiko gutxi" + +#~ msgid "Prolonged nudity" +#~ msgstr "Biluztasun hedatua" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Zirikatzearen erreferentziak edo adierazpenak" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Erreferentzia edo adierazpen sexualak" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Sexu portaera grafikoa" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Erabilera baxuko biraoa" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Erabilera ertaineko biraoa" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Erabilera altuko biraoa" + +#~ msgid "Slapstick humor" +#~ msgstr "Komedia" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Umore lizuna" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Umore sexuala edo helduentzakoa" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Pertsona talde zehatz batekiko negatibotasuna" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Min emozionala eragiteko diseinatutako diskriminazioa" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Generoa, sexualitatea, arraza edo erlijioan oinarritutako diskriminazio " +#~ "esplizitua" + +#~ msgid "Product placement" +#~ msgstr "Produktu-kokapena" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Produktuen marka edo marka erregistratu zehatzen erreferentzia esplizitua" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Erabiltzaileei benetako munduko gauza zehatzak erostera bultzatzen zaie" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Ausazko gertaeretan apustu egitea fitxak edo kredituak erabiliz" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Apustuak gezurrezko diruarekin" + +#~ msgid "Gambling using real money" +#~ msgstr "Apustuak benetako diruarekin" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Erabiltzaileei benetako dirua dohaitzan ematera bultzatzen zaie" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Aplikazioan benetako dirua erabiltzeko aukera" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Erabiltzaileen arteko elkarreragiketak berriketarik gabe" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Erabiltzaileen arteko berriketa moderatuen funtzionaltasuna" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "" +#~ "Erabiltzaileen arteko kontrolik gabeko audio- edo bideo-berriketen " +#~ "funtzionaltasuna" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Sare sozialetako erabiltzaile-izen edo helbide elektronikoak partekatuta" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Aplikazioaren azken bertsioa egiaztatzea" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Besteek erabiltzailea identifikatzeko balio ez dute diagnostiko-datu " +#~ "partekatuak" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Besteek erabiltzailea identifikatzeko erabil daitekeen informazioa " +#~ "partekatuta" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Kokaleku fisikoa beste erabiltzaileekin partekatuta" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Homosexualitatearen zeharkako erreferentziak" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Sexu bereko pertsonen arteko musukatzea" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Sexu bereko pertsonen arteko sexu-jokabide esplizitua" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Prostituzioaren zeharkako erreferentziak" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Prostituzioaren erreferentzia zuzenak" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Prostituzioaren ekintzaren adierazpen grafikoak" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Adulterioaren zeharkako erreferentzia" + +#~ msgid "Direct references to adultery" +#~ msgstr "Adulterioaren erreferentzia zuzena" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Adulterioaren ekintzaren adierazpen grafikoak" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Erdi biluzik dauden giza pertsonaiak" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Oso sexualizatutako giza pertsonaiak" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Profanazio historikoen adierazpenak edo erreferentziak" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Gaur egungo giza profanazioen adierazpenak" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Gaur egungo profanazioen adierazpen grafikoak" + +#~ msgid "Visible dead human remains" +#~ msgstr "Giza gorpuzki hil ikusgaiak" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Eguraldia jasaten duten giza gorpuzki hilak" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Giza gorputzen profanazioaren adierazpen grafikoak" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Esklabotasun historikoaren adierazpenak edo erreferentziak" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Gaur egungo esklabotasunaren adierazpenak" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Gaur egungo esklabotasunaren adierazpen grafikoak" + +#~ msgid "General" +#~ msgstr "Orokorra" + +#~ msgid "ALL" +#~ msgstr "DENAK" + +#~ msgid "Teen" +#~ msgstr "Gaztea" + +#~ msgid "Everyone 10+" +#~ msgstr "10 urtetik gorakoak" + +#~ msgid "Everyone" +#~ msgstr "Edonor" + +#~ msgid "Early Childhood" +#~ msgstr "Haurtzaro goiztiarra" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Ezezaguna" + +#~ msgid "Released" +#~ msgstr "Argitaratua" + +#~ msgid "Format" +#~ msgstr "Formatua" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Atzo, %I:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Duela hiru egun" + +#~ msgid "Four days ago" +#~ msgstr "Duela lau egun" + +#~ msgid "Five days ago" +#~ msgstr "Duela bost egun" + +#~ msgid "Six days ago" +#~ msgstr "Duela sei egun" + +#~ msgid "Two weeks ago" +#~ msgstr "Duela bi aste" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Gaitu GNOME Shell hedapenen biltegia" + +#~ msgid "this website" +#~ msgstr "webgune hau" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Goazen erosketetara" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Kendua" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Aplikazio honek berrabiaraztea eskatzen du plugin berriak erabil ahal " +#~ "izateko." + +#~ msgid "Security Updates Pending" +#~ msgstr "Segurtasuneko eguneratzeak egiteko daude" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Eguneratze garrantzitsuak orain instalatzea gomendatzen da" + +#~ msgid "Restart & Install" +#~ msgstr "Berrabiarazi eta instalatu" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "SE eta aplikazioen eguneratze garrantzitsuak instalatzeko prest daude" + +#~ msgid "View" +#~ msgstr "Ikusi" + +#~ msgid "About %s" +#~ msgstr "%s aplikazioari buruz" + +#~ msgid "%s ME" +#~ msgstr "%s kudeaketa-motorra" + +#~ msgid "Extension Settings" +#~ msgstr "Hedapenen ezarpenak" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Hedapenak zure ardurapean erabiliko dira. Sisteman arazoak badituzu, " +#~ "haiek desgaitzea gomendatzen da." + +#~ msgid "Failed to load components" +#~ msgstr "Huts egin du osagaiak kargatzeak" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSSa egiaztatuta. Ongi!" + +#~ msgid "Failed to load file" +#~ msgstr "Huts egin du fitxategia kargatzean" + +#~ msgid "Unsaved changes" +#~ msgstr "Gorde gabeko aldaketak" + +#~ msgid "The application list is already loaded." +#~ msgstr "Aplikazioen zerrenda jadanik kargatuta dago." + +#~ msgid "Merge documents" +#~ msgstr "Batu dokumentuak" + +#~ msgid "Throw away changes" +#~ msgstr "Baztertu aldaketak" + +#~ msgid "Open AppStream File" +#~ msgstr "Ireki AppStream fitxategia" + +#~ msgid "Save AppStream File" +#~ msgstr "Gorde AppStream fitxategia" + +#~ msgid "_Save" +#~ msgstr "_Gorde" + +#~ msgid "%s banner design deleted." +#~ msgstr "“%s”(r)en iragarkiaren diseinua ezabatuta." + +#~ msgid "Banner design deleted." +#~ msgstr "Iragarkiaren diseinua ezabatuta." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Aplikazioen zerrendak gorde gabeko aldaketak ditu." + +#~ msgid "Use verbose logging" +#~ msgstr "Erabili erregistro xehea" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOMEko Softwaren iragarkien diseinatzailea" + +#~ msgid "No Designs" +#~ msgstr "Diseinurik ez" + +#~ msgid "Error message here" +#~ msgstr "Errorearen mezua hemen" + +#~ msgid "Category Featured" +#~ msgstr "Nabarmendutako kategoria" + +#~ msgid "Undo" +#~ msgstr "Desegin" + +#~ msgid "Banner Designer" +#~ msgstr "Iragarkien diseinatzailea" + +#~ msgid "New Banner" +#~ msgstr "Iragarki berria" + +#~ msgid "Import from file" +#~ msgstr "Inportatu fitxategitik" + +#~ msgid "Export to file" +#~ msgstr "Esportatu fitxategira" + +#~ msgid "Spacing" +#~ msgstr "Tartea" + +#~ msgid "The amount of space between children" +#~ msgstr "Umeen arteko tarte-kopurua" + +#~ msgid "Featured Applications" +#~ msgstr "Aplikazio nabarmenak" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Diseinatu GNOME Softwaren nabarmendutako iragarkiak" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell-en hedapenak" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "GNOME Shell hedapenen biltegia" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Shell hedapenen metadatuak deskargatzen…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell hedapena" + +#~ msgid "Show the folder management UI" +#~ msgstr "Erakutsi karpeten kudeaketaren UIa" + +#~ msgid "Folder Name" +#~ msgstr "Karpetaren izena" + +#~ msgid "_Add" +#~ msgstr "_Gehitu" + +#~ msgid "Add to Application Folder" +#~ msgstr "Gehitu aplikazioen karpetari" + +#~ msgid "Top Rated" +#~ msgstr "Puntuazio onena" + +#~ msgid "Click on items to select them" +#~ msgstr "Egin klik elementuen gainean hautatzeko" + +#~ msgid "Select" +#~ msgstr "Hautatu" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Gehitu karpetari…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Eraman karpetara…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Kendu karpetatik" diff --git a/po/fa.po b/po/fa.po new file mode 100644 index 0000000..deb2946 --- /dev/null +++ b/po/fa.po @@ -0,0 +1,7756 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Arash Mousavi , 2016. +# Danial Behzadi , 2017-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-21 13:46+0000\n" +"PO-Revision-Date: 2025-02-23 21:45+0330\n" +"Last-Translator: Danial Behzadi \n" +"Language-Team: \n" +"Language: fa_IR\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" +"X-DamnedLies-Scope: partial\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "نرم‌افزارها" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "نصب و به‌روز رسانی کاره‌ها" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and remove " +"existing installed apps." +msgstr "" +"نرم‌افزارها می‌گذارد کاره‌های جدید و افزونه‌های سامانه‌ای را یافته و نصب کنید و کاره‌های " +"پیش‌تر نصب‌شده را بردارید." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and multiple " +"screenshots per app. Apps can be found either through browsing the list of " +"categories or by searching. It also allows you to update your system using an " +"offline update." +msgstr "" +"نرم‌افزارها کاره‌های محبوب و برتر را همراه با توضیحات مفید و چند نماگرفت از هر کاره " +"نمایش می‌دهد. کاره‌ها می‌توانند از طریق مرور سیاههٔ دسته‌ها یا با جست‌وجو پیدا شوند. " +"همچنین اجازهٔ به‌روز رسانی سامانه از طریق به‌روز رسانی برون‌خط را می‌دهد." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "تابلوی نمای‌کلی" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "تابلوی جزییات" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "تابلوی نصب شده‌ها" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "تابلوی به‌روز رسانی‌ها" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "جزییات به‌روز رسانی" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "پروژهٔ گنوم" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "آزمودن کلید akmods در UEFI شیم" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "آزمودن کلید akmods در UEFI شیم نیازمند هویت‌سنجی است" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "ثبت کلید akmods در UEFI شیم" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "ثبت کلید akmods در UEFI شیم نیازمند هویت‌سنجی است" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "آزمودن کلید DKMS در UEFI شیم" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "آزمودن کلید DKMS در UEFI شیم نیازمند هویت‌سنجی است" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "ثبت کلید DKMS در UEFI شیم" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "ثبت کلید DKMS در UEFI شیم نیازمند هویت‌سنجی است" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "نصب یک پروندهٔ appstream در مکانی سامانه‌ای" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "در حال نصب یک پرونده appstream در مکانی سامانه‌ای" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "فهرستی از پروژه‌های سازگار" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and XFCE." +msgstr "" +"این فهرستی است از پروژه‌های سازگار مانند گنوم، KDE و XFCE است که باید نمایش دهیم." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "این که به‌روز رسانی‌ها و ارتقاها در نرم‌افزارهای گنوم مدیریت شود یا نه" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any automatic " +"updates actions or prompt for upgrades." +msgstr "" +"اگر از کار افتاده باشد، نرم‌افزارهای گنوم تابلوی به‌روز رسانی‌ها را پنهان کرده و هیچ " +"کنشی برای به‌روز رسانی خودکار یا اعلانی برای ارتقا نخواهد داد." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "بارگیری و نصب خودکار به‌روز رسانی‌ها" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"اگر به کار افتاده باشد، نرم‌افزارهای گنوم به صورت خودکار به‌روز رسانی‌ها را در " +"پس‌زمینه دریافت کرده و آن‌هایی که نیاز به شروع دوباره سامانه ندارند را هم نصب می‌کند." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "آگاهی کاربر از نرم‌افزارهای به‌روز شده در پس‌زمینه" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened whilst " +"the user was idle." +msgstr "" +"اگر به کار افتاده باشد، نرم‌افزارهای گنوم دربارهٔ به‌روز رسانی‌هایی که در زمان بی‌کار " +"بودن کاربر انجام شدند، به او آگاهی می‌دهد." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"این که هنگام بودن روی اتّصال اندازه‌گیری شده، به صورت خودکار تازه‌سازی شود یا نه" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even when " +"using a metered connection (eventually downloading some metadata, checking for " +"updates, etc., which may incur in costs for the user)." +msgstr "" +"اگر به کار افتاده باشد، نرم‌افزارهای گنوم حتا روی یک اتّصال اندازه‌گیری شده هم به " +"صورت خودکار در پس‌زمینه تازه‌سازی می‌شود (در نهایت بارگیری کمی فراداده، بررسی برای " +"به‌روز رسانی‌ها و… که ممکن است برای کاربر هزینه داشته باشد)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "این که نخستین اجرای نرم‌افزارهای گنوم است یا نه" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "نمایش رتبه‌بندی ستاره‌ای در کنار نرم‌افزارها" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "پالایش برنامه‌ها بر مبنای مجموعهٔ شاخهٔ پیش‌گزیده برای دوردست" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "برنامه‌های مالکیتی، پیش از نصب، گفت‌وگوی هشداری نمایش می‌دهند" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"هنگامی که برنامه‌های مالکیتی نصب می‌شود، می‌توان یک گفت‌وگوی هشدار نمایش داد. این " +"کنترل میکند که گفت‌وگو نمایش داده شود یا نه." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "آخرین زمان بررسی به‌روز رسانی" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "آخرین زمان آگاهی ارتقا" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "آخرین زمان آگاهی به‌روز رسانی" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "زمان نخستین به‌روز رسانی امنیتی، پاک شده بعد از به‌روز رسانی" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "آخرین زمان به‌روز رسانی" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "سن بر حسب ثانیه برای تأیید اینکه نماگرفت بالادستی هنوز معتبر است" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 means " +"to never check the server if the image already exists in the cache." +msgstr "" +"گزینش مقداری بزرگ‌تر یعنی درخواست‌های کم‌تر به کارساز دوردست، ولی ممکن است نمایش " +"به‌روز رسانی‌های نماگرفت‌ها به کاربر، بیش‌تر طول بکشد. مقدار ۰ یعنی در صورت وجود تصویر " +"در انباره، هرگز کارساز بررسی نشود." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "کارگزار جهت استفاده برای بازبینی‌های برنامه‌ها" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "کمینه امتیاز کارما برای بازبینی‌ها" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "بازبینی‌هایی با کارمای کم‌تر از این عدد، نمایش داده نخواهند شد." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "فهرستی از مخزن‌های رسمی که نباید سوم‌شخص در نظر گرفته شوند" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "فهرستی از مخزن‌های مورد نیاز که نمی‌توانند غیرفعّال یا حذف شوند" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "فهرستی از مخزن‌های رسمی که باید نرم‌افزار آزاد در نظر گرفته شوند" + +#: data/org.gnome.software.gschema.xml:98 +msgid "The licence URL to use when an application should be considered free software" +msgstr "" +"نشانی اینترنتی پروانهٔ مورد استفاده، هنگامی که برنامه‌ای باید نرم‌افزار آزاد در نظر " +"گرفته شود" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "نصب برنامه‌های بسته‌ای برای همهٔ کاربران سامانه در صورت امکان" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "اجازه دسترسی به گفت‌وگوی مخزن‌های نرم‌افزاری" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "پیشنهاد ارتقا برای پیش‌انتشارها" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "نمایش چند عنصر رابط کاربری برای مطّلع کردن کاربر از آزاد نبودن برنامه" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "نمایش اندازهٔ نصب‌شده برای کاره‌ها در فهرست برنامه‌های نصب‌شده" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://wiki.ubuntu.ir/wiki/Proprietary_Software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "نشانی اینترنتی‌ای که نرم‌افزار مالکیتی و ناآزاد را توضیح می‌دهد" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"سیاهه‌ای از نشانی‌های اشاره کننده به پرونده‌های appstream که در یک شاخهٔ swcatalog " +"بارگیری خواهند شد" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If false, " +"files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml directory" +msgstr "" +"نصب پرونده‌های AppStream به مکان سامانه‌ای برای تمامی کاربران. در صورت خاموش بودن، " +"پرونده‌ها در شاخهٔ غیر استاندارد ‪$XDG_DATA_HOME/swcatalog/xmls‬ نصب می‌شوند" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats listed " +"first. An empty array means the default order. Omitted formats are assumed to be " +"listed last. Example packaging formats are: deb, flatpak, rpm, snap. The formats " +"can be optionally specified with an origin name, divided by a colon, for example " +"'flatpak:flathub'." +msgstr "" +"ترتیب اولویت ترجیحی قالب بسته‌ها که قالب‌های مهم‌تر، نخست فهرست می‌شوند. آرایهٔ خالی به " +"معنی ترتیب پیش‌گزیده است. قالب‌های جا گذاشته به عنوان فهرست شده در انتها فرض می‌شوند. " +"قالب‌های بسته‌بندی مثال شامل: deb، flatpak، rpm و snap. قالب‌ها می‌توانند به صورت " +"اختیاری با یک نام اصلی جدا شده با دونقطه مشخّص شوند. برای مثال «flatpak:flathub»." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "برچسب زمانی آخرین تلاش برای برداشتن زمان اجراهای بی‌استفادهٔ فلت‌پک" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary apps." +msgstr "تنظیم به true برای نمایش فقط کاره‌های آزاد و نهفتن کاره‌های مالکیتی." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been verified." +msgstr "تنظیم به true برای نمایش فقط کاره‌هایی که هویت توسعه‌دهندگانشان تأیید شده." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "برچسب زمانی آخرین به‌روز رسانی تاریخی گرفته." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "برای ورود از رشته‌ای که شناسهٔ حساب برخط گنوم را ذخیره کرده استفاده شد" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "نصب‌کنندهٔ AppStream بر گسترهٔ سامانهٔ نرم‌افزارهای گنوم" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "شکست در تجزیه‌ٔ آرگومان‌های خط فرمان" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "شما باید دقیقا یک نام مشخص کنید" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "این برنامه تنها می‌تواند از طریق کاربر ریشه استفاده شود" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "شکست در تایید گونهٔ محتوا: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "شکست در جابه‌جایی: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "نصب نرم‌افزار" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "نصب نرم‌افزارهای گزیده روی سامانه" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "خشونت کارتونی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "اطّلاعاتی دربارهٔ خشونت کارتونی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "خشونت فانتزی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "اطّلاعاتی دربارهٔ خشونت فانتزی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "خشونت واقعی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "اطّلاعاتی دربارهٔ خشونت واقعی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "خشونت تجسّم خونباری" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "اطّلاعاتی دربارهٔ خون‌ریزی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "خشونت جنسی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "اطّلاعاتی دربارهٔ خشونت جنسی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "الکل" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "اطّلاعاتی دربارهٔ اشاره به نوشیدنی‌های الکلی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "مواد مخدّر" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "اطّلاعاتی دربارهٔ اشاره به مخدّرهای غیرقانونی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "دخانیات" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "اطّلاعاتی دربارهٔ اشاره به محصولات تنباکو موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "برهنگی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "اطّلاعاتی دربارهٔ هیچ نوع برهنگی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "زمینه‌های جنسی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "اطّلاعاتی دربارهٔ اشاره یا ترسیم طبیعت جنسی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "فحّاشی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "اطّلاعاتی دربارهٔ هیچ نوع ناسزا موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "شوخی‌های نامربوط" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "اطّلاعاتی دربارهٔ شوخی‌های نامربوط موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "تبعیض" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "اطّلاعاتی دربارهٔ هیچ نوع زبان تبعیض‌آمیز موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "تبلیغات" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "اطّلاعاتی دربارهٔ هیچ نوع تبلیغات موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "قمار" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "اطّلاعاتی دربارهٔ هیچ نوع قمار موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "خرید" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "اطّلاعاتی دربارهٔ امکان خرج کردن پول موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "گپ میان کاربران" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "اطّلاعاتی دربارهٔ امکان گپ با دیگر کاربران موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "گپ صوتی میان کاربران" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "اطّلاعاتی دربارهٔ امکان صحبت با دیگر کاربران موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "جزئیات تماس" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email addresses" +msgstr "" +"اطّلاعاتی دربارهٔ هم‌رسانی نام‌کاربری شبکه‌های اجتماعی یا نشانی‌های رایانامه موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "اطّلاعات تشخیصی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "اطّلاعاتی دربارهٔ هم‌رسانی اطّلاعات کاربر با سوم‌شخص‌ها موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "هم‌رسانی مکان" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "اطّلاعاتی دربارهٔ هم‌رسانی مکان فیزیکی با دیگر کاربران موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "هم‌جنسگرایی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "اطّلاعاتی دربارهٔ اشاره به هم‌جنسگرایی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "روسپیگری" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "اطّلاعاتی دربارهٔ اشاره به فاحشگی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "بی‌عفّتی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "اطّلاعاتی دربارهٔ اشاره به زنا موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "شخصیت‌های جنسیت‌زده" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "اطّلاعاتی دربارهٔ شخصیت‌های جنسیت‌زده موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "بی‌حرمتی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "اطّلاعاتی دربارهٔ اشاره به هتک حرمت موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "بقایای انسانی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "اطّلاعاتی دربارهٔ نمایانی بقایای جسد انسانی موجود نیست" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "بردگی" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "اطّلاعاتی دربارهٔ اشاره به بردگی موجود نیست" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "شامل اشاره به مواد مخدّر نیست" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "Does not include swearing, profanity, and other kinds of strong language" +msgstr "شامل فحش، بی‌حرمتی یا دیگر گونه‌های زبان خشن نیست" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "شامل تبلیغ یا تراکنش‌های مالی نیست" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "شامل نزدیکی یا برهنگی نیست" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "شامل قابلیت گپ بدون نظارت نیست" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "شامل خشونت نیست" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "مواد مخدّر" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "زبان خشن" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "پول" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "اجتماعی" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "خشونت" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "همه" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "؟" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s رده‌بندی سنی ناشناخته‌ای دارد" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s مناسب همه است" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s مناسب خردسالان است" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s مناسب کودکان است" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s مناسب کودکان است" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s مناسب نوجوانان است" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s مناسب بزرگسالان است" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s مناسب %s است" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "رتبه‌بندی سنی" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_چگونگی افزودن اطّلاعات غایب" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "پروندهٔ محلّی" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "بسته" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "در انتظار" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "منتظر نصب" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "منتظر برداشتن" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "نصب کردن" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "برداشتن" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "در حال بارگیری" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_نصب" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_حذف نصب…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "شبکه" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "توانایی ارتباط روی شبکه" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "خدمت‌های سامانه" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "می‌تواند به خدمت‌های دی‌باس روی گذرگاه سامانه دسترسی داشته باشد" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "خدمت‌های نشست" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "می‌تواند به خدمت‌های دی‌باس روی گذرگاه نشست دسترسی داشته باشد" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "‌افزاره‌ها" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "می‌تواند به افزاره‌هایی چون وب‌کم دسترسی داشته باشد" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "می‌تواند به افزاره‌های ورودی دسترسی داشته باشد" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "می‌تواند به صدابَر دسترسی داشته و صدا پخش کند" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "می‌تواند به پرونده‌های افزارهٔ سامانه دسترسی داشته باشد" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "محتوای صفحه" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "می‌تواند به محتوای صفحه دسترسی داشته باشد" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "شاخهٔ خانه" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "می‌تواند پرونده‌ها را دیده، ویراسته و ایجاد کند" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "می‌تواند پرونده‌ها را ببیند" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "سامانهٔ پرونده" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "شاخهٔ بارگیری‌ها" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "تنظیمات" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "می‌تواند هر تنظمی را دیده و تغییر دهد" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "سامانهٔ نمایشی قدیمی" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "استفاده از یک سامانهٔ نمایشی ناامن قدیمی" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "گریز از قرنطینه" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "می‌تواند از قرنطینه گریخته و هر محدودیت دیگری را دور بزند" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "هیچ توضیحی برای به‌روز رسانی موجود نیست." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "جزییات به‌روز رسانی" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "نیاز به اجازه‌های اضافی دارد" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "داده‌های رتبه‌بندی نامعتبر از کارساز دریافت شد" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "نتوانست با کارساز رتبه‌بندی ارتباط بگیرد" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "بازبینی‌ها" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "هیچ بازبینی‌ای برای این کاره پیدا نشد." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "بدون بازبینی" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "تاریخچهٔ نگارش" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "جدید در نگارش %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "نگارش %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "هیچ جزییاتی برای این انتشار موجود نیست" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%%Oe %OB %Oy" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "حالت بالا آمدن: یا «updates»، «updated»، «installed» یا «overview»" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "جست‌وجوی برنامه‌ها" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "نمایش جزییات برنامه (با استفاده از شناسه برنامه)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "نمایش جزییات برنامه (با استفاده از نام بسته)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "نصب برنامه (با استفاده از شناسهٔ برنامه)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "حذف نصب برنامه (با استفاده از شناسهٔ برنامه)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "گشودن یک پروندهٔ بسته محلّی" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILENAME" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, or " +"‘full’" +msgstr "گونهٔ برهم‌کنش مورد انتظار برای این کنش: none، notify یا full" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "نمایش یک پروندهٔ فراداده یا فرااطّلاعات محلّی" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already running)" +msgstr "" +"به کار انداختن خروجی اشکال‌زدایی پرگو (از نمونهٔ در حال اجرا اگر هنوز در حال اجرا " +"باشد)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "هر به‌روز رسانی در انتظاری را در پس‌زمینه نصب می‌کند" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "نمایش ترجیحات" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "خروج از نمونه در حال اجرا" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "ترجیح دادن منابع محلّی به AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "نمایش شماره نسخه" + +# در این رشته از نویسه LRM استفاده شده است +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "حق رونوشت © ‎۲۰۱۶-۲۰۲۳ مشارکت‌کنندگان نرم‌افزارهای گنوم" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"آرش موسوی \n" +"دانیال بهزادی \n" +"سید اسحاق مقیم شهیدانی \n" +"محمد صالح کامیاب " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "متأسفانه هیچ جزییاتی برای این برنامه وجود ندارد." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "اندازهٔ نصب‌شده" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "شامل %s داده و %s انباره" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "شامل %s داده" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "شامل %s انباره" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "استفادهٔ نامشخص از داده و انباره" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "اندازهٔ بارگیری" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "نیاز به هیچ بارگیری سامانه‌ای اضافه ندارد" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "نیاز به اندازهٔ نامشخصی از بارگیری‌های سامانه‌ای اضافه دارد" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "نیاز به %s بارگیری سامانه‌ای اضافه دارد" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "اندازه مشخص نیست" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "بدون اجازه" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "دسترسی شبکه دارد" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "از خدمت‌های سامانه استفاده می‌کند" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "از خدمت‌های نشست استفاده می‌کند" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "می‌تواند به افزاره‌های سخت‌افزاری دسترسی داشته باشد" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "توانایی دسترسی به افزاره‌های سامانه" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "می‌تواند تمامی داده‌هایتان را خوانده یا رویشان بنویسد" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "می‌تواند تمامی داده‌هایتان را بخواند" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "می‌تواند تمامی بارگیری‌هایتان را خوانده یا رویشان بنویسد" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "می‌تواند تمامی بارگیری‌هایتان را بخواند" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "می‌تواند به پرونده‌هایی خاص دسترسی داشته باشد" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "می‌تواند به تنظیمات کاربری دسترسی داشته و تغییرشان دهد" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "از یک سامانهٔ پنجرهٔ قدیمی استفاده می‌کند" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "می‌تواند اجازه‌های دلخواه را به دست آورد" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "توسعه‌دهندهٔ نرم‌افزار تأیید شده است" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "بازبینی شده به دست توزیعگر سیستم‌عامل" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "بازبینی شده به دست %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "فراهم شده به دست سوم‌شخص" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "نرم‌افزار دیگر پشتیبانی نمی‌شود" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "کد بازرسی‌پذیر" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "پروانهٔ ناشناخته" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "کد مالکیتی" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "پروانهٔ خاص" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "؛ " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "ممتاز" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "امن" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "احتمالاً امن" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "بالقوه ناامن" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "ناامن" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "فقط همراه" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "فقط روی صفحه‌های کوچک کار می‌کند" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "فقط میزکار" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "فقط روی صفحه‌های بزرگ کار می‌کند" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "ناهماهنگی در اندازهٔ صفحه" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "اندازهٔ صفحهٔ کنونیتان را پشتیبانی نمی‌کند" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "نیازمند صفحه‌لمسی" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "نیازمند صفحه‌کلید" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "نیازمند موشی" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "نیاز به دستهٔ بازی" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "نیازمند دسته برای بازی" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "وفق‌پذیر" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "کار روی تلفن‌ها، رایانک‌ها و میزکارها" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "احتمالاً نیازمند یک صفحه‌کلید یا موشی" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "کار روی میزکارها و لپ‌تاپ‌ها" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "هیچ محتوای نامرتبط به سنی ندارد" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "هیچ اطّلاعات رتبه‌بندی‌ای موجود نیست" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "مشاهدهٔ پایگاه وب" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "نصب…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "لغو" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "نصب" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "بارگیری" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "به‌روز رسانی" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "حذف نصب…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "در حال حذف" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "به‌روز رسانی بحرانی" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "از دستگاه نمی‌توان در هنگام به‌روز رسانی استفاده کرد." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "منبع: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "تغییر نام از %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "توقّف گرفتن به‌روز رسانی‌ها" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "به‌روز رسانی بحرانی" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "نصب شده" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "کمک به ترجمهٔ %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s به دست اجتماعی جهانی از داوطلبان طرّاحی، توسعه و ترجمه شده است.\n" +"\n" +"این بدان معنیست که گرچه هنوز به زبانتان موجود نیست، می‌توانید درگیر شده و خودتان به " +"ترجمه‌اش کمک کنید." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "ترجمه‌ها" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "پایگاه وب _ترجمه" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "نیاز به ورود دوردست %s (قلمرو %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "نیاز به ورود" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 src/gs-dkms-dialog.ui:120 +#: src/gs-page.c:423 src/gs-removal-dialog.ui:24 src/gs-remove-app-dialog.ui:14 +#: src/gs-repos-dialog.c:174 src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 +#: src/gs-review-row.c:235 src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_لغو" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_ورود" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_کاربر" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_گذر‌واژه" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "سایر" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "همه" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "ویژه" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "گزینش سردبیر" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "جدید و به‌روز" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "گزیده‌های وب" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "دیگر نرم‌افزارها" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s نصب شده" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "اثربخشی تغییرات نیازمند آغاز دوباره است" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "کاره آمادهٔ استفاده است" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "به‌روز رسانی سامانه نصب شده" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "برنامه‌های نصب شدهٔ اخیر آمادهٔ بازبینیند" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "آغاز دوباره" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "اجرا" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "نصب نرم‌افزار؟" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "نصب نرم‌افزار سوم‌شخص؟" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "به کار انداختن مخزن نرم‌افزاری؟" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "به کار انداختن مخزن نرم‌افزاری سوم‌شخص؟" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"برنامهٔ %s یک نرم‌افزار آزاد نیست و به دست «%s» فراهم شده است." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "برنامهٔ %s به دست «%s» فراهم شده است." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "برای ادامهٔ نصب، باید این مخزن نرم‌افزاری به کار افتاده باشد." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "ممکن است نصب یا استفاده از %s در بعضی کشورها ممنوع باشد." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "ممکن است نصب یا استفاده از این رمزینه در بعضی کشورها ممنوع باشد." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "دیگر _هشدار داده نشود" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "به کار انداختن و _نصب" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "جزییات خطاها از مدیر بسته:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "جزییات" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_بستن" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "جزییات در تخته‌گیره رونوشت شد" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_پذیرش" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "به‌روز رسانی نصب شد" +msgstr[1] "به‌روز رسانی‌ها نصب شدند" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "نصب کاره‌ایی حذف شد" +msgstr[1] "نصب کاره‌هایی حذف شد" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "اثربخشیش نیازمند آغاز دوباره است" +msgstr[1] "اثربخشیشان نیازمند آغاز دوباره است" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "الآن نه" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "امروز" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "دیروز" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%Id روز پیش" +msgstr[1] "%Id روز پیش" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%Id هفته پیش" +msgstr[1] "%Id هفته پیش" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%Id ماه پیش" +msgstr[1] "%Id ماه پیش" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%Id سال پیش" +msgstr[1] "%Id سال پیش" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "همین الآن" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%Id دقیقه پیش" +msgstr[1] "%Id دقیقه پیش" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%Id ساعت پیش" +msgstr[1] "%Id ساعت پیش" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "همه" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "ویژه" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "گرافیک سه‌بعدی" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "عکّاسی" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "پویش" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "گرافیک برداری" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "نمایشگرها" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "ساخت و ویرایش صدا" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "پخش‌کننده‌های آهنگ" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "همه" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "ویژه" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "تقویم" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "پایگاه داده" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "مالی" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "پردازشگر متن" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "ویرایشگرهای متن" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "مرورگرهای وب" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "همه" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "ویژه" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "اکشن" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "ماجراجویی" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "آرکید" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "بلوکی" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "تخته‌ای" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "کارتی" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "شبیه‌سازها" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "کودکانه" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "منطقی" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "نقش‌آفرینی" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "ورزشی" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "استراتژی" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "همه" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "ویژه" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "گپ" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "همه" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "ویژه" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "هوش مصنوعی" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "ستاره‌شناسی" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "شیمی" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "زبان‌ها" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "ریاضی" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "اخبار" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "روباتیک" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "هنر" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "زندگی‌نامه" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "کُمیک" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "داستانی" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "سلامتی" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "تاریخ" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "سبک زندگی" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "سیاسی" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "ورزشی" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "همه" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "ویژه" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "اشکال‌زداها" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "محیط‌های توسعه" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "رمزینه‌ها" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "راه‌اندازهای سخت‌افزاری" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "قلم‌ها" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "منابع ورودی" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "بسته‌های زبان" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "بومی‌سازی" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "ایجاد" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "کار" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "بازی" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "اجتماعی" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "آموزش" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "توسعه" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "رمزینه‌ها" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "راه‌اندازهای سخت‌افزاری" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "قلم‌ها" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "منابع ورودی" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "بسته‌های زبان" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "بومی سازی" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "یک کاره" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "برنامه %s درخواست پشتیبانی از یک قالب پرونده اضافی را دارد." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "نیاز به یک نوع MIME جدید" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "برنامه %s درخواست قلم‌های جدیدی دارد." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "نیاز به قلم‌های جدید" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "برنامه %s درخواست رمزینهٔ رسانه‌ای جدیدی دارد." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "نیاز به رمزینهٔ رسانه‌ای جدید" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "برنامه %s درخواست راه‌انداز چاپگر جدیدی دارد." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "نیاز به راه‌انداز چاپگر جدید" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "برنامه %s درخواست بسته‌های جدیدی دارد." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "نیاز به بسته‌های جدید" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "یافتن در نرم‌افزارها" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_نمایش بیش‌تر" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_نمایش کم‌تر" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "در حال برداشتن…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "نیازمند آغاز دوباره برای پایان نصب" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "نیازمند آغاز دوباره برای پایان برداشتن" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "نصب منتظر…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "به‌روز رسانی منتظر…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "بار گرفتن…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "آماده سازی…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "حذف کردن نصب…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s نصب نشده؛ ولی هنوز داده‌هایی دارد." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_آغاز دوباره" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_به کار انداختن…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_نصب…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s به انگلیسی آمریکایی نشان داده خواهد شد" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "این کاره به انگلیسی آمریکایی نشان داده خواهد شد" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "این نرم‌افزار به انگلیسی آمریکایی نشان داده خواهد شد" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "کمک به _ترجمه" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "دیگر کاره‌ها از %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "توسعه‌دهنده %s مالکیت %s را اثبات کرده" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "توسعه‌دهنده مالکیت %s را اثبات کرده" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "برای نوشتن بازبینی، نیاز به دسترسی به اینترنت دارید" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "این کاره دیگر به‌روز رسانی نمی‌گیرد؛ حتا رفع اشکال‌های امنیتی" + +#: src/gs-details-page.c:1931 +msgid "This app is already provided by your distribution and should not be replaced." +msgstr "این کاره از پیش به دست توزیعتان فراهم شده و نباید جایگزین شود." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue tracker." +msgstr "این کاره هیچ پیوندی به پایگاه وب، مخزن کد یا ردیاب مشکل ندارد." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "این نرم‌افزار دیگر به‌روز رسانی نمی‌گیرد؛ حتا رفع اشکال‌های امنیتی" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be replaced." +msgstr "این برنامه از پیش به دست توزیعتان فراهم شده و نباید جایگزین شود." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "این نرم‌افزار هیچ پیوندی به پایگاه وب، مخزن کد یا ردیاب مشکل ندارد." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the details " +"for this app." +msgstr "" +"نرم‌افزارها در بازیابی اطّلاعات «%s» شکست خورد و در نمایش جزییات این کاره ناتوان است." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "پاسخ بازبینی نامعتبر از کارساز دریافت شد" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "شکست در ثبت بازبینی برای «%s«: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "صفحهٔ جزییات" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "بار کردن جزییات کاره" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "تأیید شده" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_گشودن" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_به‌روز رسانی" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "حذف" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "افزودنی‌ها" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "این کاره تنها زمانی که یک اتّصال فعّال اینترنتی داشته باشید، قابل استفاده است." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "دارای مخزن نرم‌افزاری" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as access " +"to other software." +msgstr "" +"این کاره دارای یک مخزن نرم‌افزاری است که به‌روز رسانی‌ها و همچنین دسترسی به " +"نرم‌افزارهایی دیگر را فراهم می‌کند." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "بدون مخزن نرم‌افزاری" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with new " +"versions." +msgstr "" +"این کاره دارای یک مخزن نرم‌افزاری نیست و به نگارش‌های جدید به‌روز رسانی نخواهد شد." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "مخزن نرم‌افزاری شناسایی شد" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software and " +"upgrades." +msgstr "" +"افزودن این مخزن نرم‌افزاری، دسترسی به نرم‌افزارها و به‌روز رسانی‌های اضافی را می‌دهد." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "تنها از منابع نرم‌افزاری که به آن‌ها اعتماد دارید استفاده کنید." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "پاک‌سازی داده‌های کاره" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_حذف داده‌ها" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "بدون فراداده" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "پایگاه _وب پروژه" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_اعانه" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "مشارکت در _ترجمه‌ها" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_گزارش یک مشکل" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_راهنما" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_تماس" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "نوشتن _بازبینی" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "همهٔ بازبینی‌ها" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "ناتوان در نمایش جزییات کاره" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "شکست در آماده سازی راه‌اندازی دوباره" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "خطای ناشناخته" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "کلید پیدا نشد" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "کلید ثبت نشده" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "نیازمند ثبت MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_بعدی" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a new " +"machine owner key (MOK) must be enrolled. The process requires a password to be " +"entered later in the process. Please note down the following password associated " +"with the key:" +msgstr "" +"راه‌اندازی امن این افزاره به کار افتاده است. برای اجازهٔ به کار افتادن راه‌اندازهای " +"جدید باید کلید مالک دستگاه (MOK) جدید ثبت شود. فرایند نیازمند ورود گذرواژه در " +"ادامه است. لطفاً گذرواژهٔ زیر که مربوط به کلید است را یادداشت کنید:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "_گذرواژهٔ MOK را یادداشت کرده‌ام" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_شروع دوباره و ثبت…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "دستورالعمل برپایی: لطفاً با دقّت خوانده شود" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, proceed " +"through the setup steps:" +msgstr "" +"پس از آغاز دوباره صفحهٔ برپایی افزاره‌ای نشان داده خواهد شد. گام‌های برپایی را برای " +"به کار انداختن راه‌اندازهای جدید بردارید:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• گزینش «ثبت MOK»\n" +"• گزینش «بله»‌برای ثبت کلیدها\n" +"• ورود گذرواژهٔ کلید هنگام اعلان\n" +"• سپس گزینش «راه‌اندازی دوباره»" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "پیامدهای امنیتی" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the module or " +"any other module will be implicitly trusted. All future updates will happen " +"transparently with no interaction and or authorization." +msgstr "" +"آگاه باشید که به هر به‌روز رسانی بعدی پیمانه پس از ثبت موفّق کلید بی چون و چرا " +"اطمینان خواهد شد. همهٔ به‌روز رسانی‌های آینده شفاف و بدون تعامل و هویت‌سنجی رخ خواهد " +"داد." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"راهنمایی‌های بیش‌تر می‌تواند در صفحهٔ مستندات پیدا شود." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "بارگیری پرونده‌های فرادادهٔ اضافی…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " و " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr "، " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "قلم‌های موجود برای کدنوشتهٔ %s" +msgstr[1] "قلم‌های موجود برای کدنوشته‌های %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "نرم‌افزار موجود برای %s" +msgstr[1] "نرم‌افزارهای موجود برای %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "نرم‌افزار درخواستی پیدا نشد" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "شکست در یافتن نرم‌افزار درخواستی" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "مورد %s پیدا نشد" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "روی پایگاه وب" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "هیچ کاره‌ای نیست که پروندهٔ %s را فراهم کند." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might be " +"found %s." +msgstr "" +"ممکن است اطّلاعاتی درباره %s به همراه گزینه‌هایی برای چگونگی گرفتن کاره‌های ناموجود " +"در %s پیدا شود." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "هیچ کاره‌ای برای پشتیبانی %s موجود نیست." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "برنامه %s موجود نیست." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can support " +"this format might be found %s." +msgstr "" +"ممکن است اطّلاعاتی درباره %s به همراه گزینه‌هایی برای چگونگی گرفتن کاره‌ای که بتواند " +"این قالب را پشتیبانی کند در %s پیدا شود." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "هیچ قلمی برای پشتیبانی کدنوشته %s موجود نیست." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts might be " +"found %s." +msgstr "" +"اطّلاعات در مورد %s، همچنین گزینه‌هایی در خصوص دریافت قلم‌های اضافی را ممکن است در %s " +"پیدا کنید." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "هیچ رمزینهٔ افزودنی‌ای برای قالب %s موجود نیست." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can play this " +"format might be found %s." +msgstr "" +"اطّلاعات در مورد %s، همچنین گزینه‌هایی در خصوص چگونگی دریافت رمزینه‌ای که بتواند این " +"قالب را پخش کند را ممکن است در %s پیدا کنید." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "هیچ منبع پلاسمایی برای پشتیبانی %s موجود نیست." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"اطّلاعات در مورد %s، همچنین گزینه‌هایی در خصوص چگونگی دریافت منابع پلاسما اضافی را " +"ممکن است در %s پیدا کنید." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "هیچ راه اندازی چاپگری برای %s موجود نیست." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that supports " +"this printer might be found %s." +msgstr "" +"اطّلاعات در مورد %s، همچنین گزینه‌هایی در خصوص چگونگی دریافت راه‌اندازی که از این " +"چاپگر پشتیبانی کند را ممکن است در %s پیدا کنید." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "مستندات" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "ناتوان در یافتن %s درخواستی از %s. لطفاً برای اطّلاعات بیش‌تر %s را ببینید." +msgstr[1] "ناتوان در یافتن %s درخواستی از %s. لطفاً برای اطّلاعات بیش‌تر %s را ببینید." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more information." +msgstr[0] "" +"ناتوان در یافتن %s که جست‌وجویش می‌کردید. لطفاً برای اطّلاعات بیش‌تر %s را ببینید." +msgstr[1] "" +"ناتوان در یافتن %s که جست‌وجویش می‌کردید. لطفاً برای اطّلاعات بیش‌تر %s را ببینید." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "شکست در یافتن نتیجه‌ای برای جست‌وجو: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "قالب پروندهٔ %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "نصب _همه" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "نرم‌افزار درخواست شده پیدا نشد" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "صفحه رمزینه‌ها" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "هیچ نتیجه‌ای پیدا نشد" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "ناتوان در اجرای جست‌وجو" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "پیشین" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "بعدی" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "فهرست کاره‌های معرّفی‌شده" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "پشتیبانی میزکار" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "از استفاده روی صفحه‌های بزرگ پشتیبانی می‌کند" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "پشتیبانی از میزکار نامشخّص" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "اطّلاعات برای تشخیص پشتیبانی از صفحه‌های بزرگ کافی نیست" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "نیاز به صفحهٔ بزرگ دارد" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "میزکار پشتیبانی نمی‌شود" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "نمی‌تواند روی صفحهٔ بزرگ استفاده شود" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "پشتیبانی از تلفن همراه" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "از استفاده روی صفحه‌های کوچک پشتیبانی می‌کند" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "پشتیبانی از تلفن همراه نامشخّص" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "اطّلاعات برای تشخیص پشتیبانی از صفحه‌های کوچک کافی نیست" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "نیاز به صفحهٔ کوچک دارد" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "تلفن همراه پشتیبانی نمی‌شود" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "نمی‌تواند روی صفحهٔ کوچک استفاده شود" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "پشتیبانی از صفحه‌کلید" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "پشتیبانی از صفحه‌کلید نامشخّص" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "اطّلاعات برای تشخیص پشتیبانی از صفحه‌کلیدها کافی نیست" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "نیازمند صفحه‌کلید" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "از صفحه‌کلید پشتیبانی می‌کند" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "صفحه‌کلید پشتیبانی نمی‌شود" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "نمی‌تواند با صفحه‌کلید استفاده شود" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "پشتیبانی از موشی" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "نیازمند موشی یا افزاره‌ای نشانگر" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "پشتیبانی از موشی نامشخّص" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "Not enough information to know if mice or pointing devices are supported" +msgstr "اطّلاعات برای تشخیص پشتیبانی از موشی‌ها یا افزاره‌های نشانگر کافی نیست" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "موشی لازم است" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "از موشی‌ها و افزاره‌های نشانگر پشتیبانی می‌کند" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "موشی پشتیبانی نمی‌شود" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "نمی‌تواند با موشی یا افزاره‌ای نشانگر استفاده شود" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "پشتیبانی از صفحه‌لمسی" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "پشتیبانی از صفحه‌لمسی نامشخّص" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "اطّلاعات برای تشخیص پشتیبانی از صفحه‌لمسی‌ها کافی نیست" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "صفحه‌لمسی لازم است" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "از صفحه‌لمسی پشتیبانی می‌کند" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "صفحه‌لمسی پشتیبانی نمی‌شود" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "نمی‌تواند با یک صفحه‌لمسی استفاده شود" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "دستهٔ بازی لازم است" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "نیازمند دستهٔ بازی" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "پشتیبانی از دستهٔ بازی" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "از دستهٔ بازی پشتیبانی می‌کند" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "احتمالاً %s روی این افزاره کار می‌کند" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s روی این افزاره کار می‌کند" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "احتمالاً %s روی این افزاره کار می‌کند" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s به خوبی روی این افزاره کار نخواهد کرد" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s روی این افزاره کار نخواهد کرد" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "پشتیبانی از سخت‌افزار" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "ناوبری" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "رفتن به صفحهٔ کشف" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "رفتن به صفحهٔ نصب شده" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "رفتن به صفحهٔ به‌روز رسانی‌ها" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "کشودن نوار جست‌وجو" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "پنجره‌‌ها" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "گشودن ترجیحات" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "گشودن مخزن‌های نرم‌افزاری" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "راهنما" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "کشودن میان‌برهای صفحه‌کلید" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "نصب شده" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "صفحهٔ نصب شده‌ها" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "در حال پیشرفت" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "کاره‌ها" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "کاره‌های وب" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "کاره‌های سامانه" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "ساخت اجتماع" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_درگیر شدن" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released " +"under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"این کاره به صورت آزاد به دست اجتماعی جهانی از داوطلبان توسعه یافته و با پروانهٔ %s منتشر شده.\n" +"\n" +"می‌توانید در بهتر از این کردنش، مشارکت و یاری کنید." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released " +"under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"این کاره به صورت آزاد به دست اجتماعی جهانی از داوطلبان توسعه یافته و با پروانهٔ %s " +"منتشر شده.\n" +"\n" +"می‌توانید در بهتر از این کردنش، مشارکت و یاری کنید." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released " +"under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"این نرم‌افزار به صورت آزاد به دست اجتماعی جهانی از داوطلبان توسعه یافته و با پروانهٔ %s منتشر شده.\n" +"\n" +"می‌توانید در بهتر از این کردنش، مشارکت و یاری کنید." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released " +"under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"این نرم‌افزار به صورت آزاد به دست اجتماعی جهانی از داوطلبان توسعه یافته و با پروانهٔ " +"%s منتشر شده.\n" +"\n" +"می‌توانید در بهتر از این کردنش، مشارکت و یاری کنید." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "پروانهٔ ناشناخته" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_بیش‌تر بدانید" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"این کاره مشخّص نمی‌کند با چه پروانه‌ای توسعه داده شده و ممکن است مالکیتی باشد، به " +"روش‌هایی که تشخیصشان دشوار است ناامن بوده و بدون نظارت تغییر کند.\n" +"\n" +"ممکن است امکان مشارکت در این کاره را داشته یا نداشته باشید." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"این نرم‌افزار مشخّص نمی‌کند با چه پروانه‌ای توسعه داده شده و ممکن است مالکیتی باشد، به " +"روش‌هایی که تشخیصشان دشوار است ناامن بوده و بدون نظارت تغییر کند.\n" +"\n" +"ممکن است امکان مشارکت در این نرم‌افزار را داشته یا نداشته باشید." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "مالکیتی" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it works. " +"It may be insecure in ways that are hard to detect, and it may change without " +"oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"این کاره به صورت آزاد توسعه نیافته، پس فقط توسعه‌دهندگانش می‌دانند چگونه کار می‌کند. " +"این کاره ممکن است به روش‌هایی که تشخیصشان دشوار است ناامن بوده و بدون نظارت تغییر " +"کند.\n" +"\n" +"ممکن است قادر به مشارکت در این کاره نباشید." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"این نرم‌افزار به صورت آزاد توسعه نیافته، پس فقط توسعه‌دهندگانش می‌دانند چگونه کار " +"می‌کند. این کاره ممکن است به روش‌هایی که تشخیصشان دشوار است ناامن بوده و بدون نظارت " +"تغییر کند.\n" +"\n" +"ممکن است قادر به مشارکت در این نرم‌افزار نباشید." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "پروانهٔ خاص" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"این کاره با پروانهٔ خاص %s توسعه داده شده.\n" +"\n" +"ممکن است امکان مشارکت در این کاره را داشته یا نداشته باشید." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"این کاره با پروانهٔ خاص «%s» توسعه داده شده.\n" +"\n" +"ممکن است امکان مشارکت در این کاره را داشته یا نداشته باشید." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"این نرم‌افزار با پروانهٔ خاص %s توسعه داده شده.\n" +"\n" +"ممکن است امکان مشارکت در این نرم‌افزار را داشته یا نداشته باشید." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"این نرم‌افزار با پروانهٔ خاص «%s» توسعه داده شده.\n" +"\n" +"ممکن است امکان مشارکت در این نرم‌افزار را داشته یا نداشته باشید." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "تازه سازی داده‌ها" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "صفحهٔ بار" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "آفزا به کار" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "منبع ناشناخته" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "آزمایشی" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "کاربر" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "افزودنی" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "برداشتنی" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "به‌روز رسانی" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "پایین‌بری" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "منبع‌های خارجی گزیده" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"دسترسی به نرم‌افزارهای اضافی را از %s را فراهم می‌کند. شامل برخی نرم‌افزارهای " +"مالکیتی.\n" +"\n" +"می‌توانید آن مخزن‌ها را بعداُ در ترجیحات مخزن‌های نرم‌افزاری به کار بیندازید." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "به کار انداختن مخزن‌های نرم‌افزاری سوم‌شخص؟" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_چشم‌پوشی" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "به کار انداختن" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "موجود برای سیستم‌عاملتان" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "موجود برای %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "کشف" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "صفحهٔ نمای‌کلی" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "کاره‌های موجود" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "دیگر دسته‌ها" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "هیچ دادهٔ کاره‌ای پیدا نشد" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "ناشناخته" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_تأیید" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "کاربر نصب را لغو کرد" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "آماده‌سازی %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "مطمئنید می‌خواهید مخزن %s را بردارید؟" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"تمام کاره‌های %s حذف خواهند شد و برای استفادهٔ دوباره از آن‌ها، باید دوباره نصبشان " +"کنید." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "حذف %s؟" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "پس از برداشتن %s دیگر قابل استفاده نیست." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "It will not be possible to use any apps which depend on %s after removal." +msgstr "پس از برداشتن %s هیچ کاره‌ای که به آن وابسته است قابل استفاده نیست." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use it " +"will appear in a different font." +msgstr "" +"پس از برداشتن %s دیگر قابل استفاده نیست و هر سندی که از آن استفاده می‌کند در " +"پیشانه‌ای دیگر ظاهر خواهد شد." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media files " +"will no longer be playable." +msgstr "" +"پس از برداشتن %s دیگر قابل استفاده نیست. این بدان معنیست که برخی پرونده‌ّای رسانه‌ای " +"دیگر قابل پخش نخواهند بود." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "Hardware which depends on %s may no longer function correctly after removal." +msgstr "پس از برداشتن %s ممکن است سخت‌افزارهای وابسته دیگر درست کار نکنند." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will be " +"kept on disk, to allow restoring the app in the future." +msgstr "" +"پس از برداشتن %s دیگر قابل استفاده نیست. تنظیمات و داده‌های کاره روی دیسک نگه داشته " +"خواهند شد تا اجازهٔ بازگردانی کاره در آینده را بدهد." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "ترجیحات" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "به‌روز رسانی‌های نرم‌افزاری" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "اطّلاعات بیش‌تر" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when power " +"saver is on." +msgstr "" +"بررسی و بارگیری به‌روز رسانی‌ها داده و نیرو مصرف می‌کند. بنابراین به‌روز رسانی‌ها " +"خودکار روی شبکه‌های اندازه‌گیری شده و هنگامی که ذخیره‌ساز نیرو روشن است مکث می‌شود." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_خودکار" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "بررسی و بارگیری خودکار به‌روز رسانی‌ها" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_دستی" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "بررسی و بارگیری به‌روز رسانی‌ها باید دستی انجام شود" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_آگاهی‌های به‌روز رسانی خودکار" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "آگاهی هنگام نصب خودکار به‌روز رسانی‌ها" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "پالایه‌های محتوا" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "فقط نمایش نرم‌افزارهای _آزاد" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "نهفتن نرم‌افزارهای مالکیتی هنگام مرور و جست‌وجو" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "نمایش فقط توسعه‌دهندگان _تأیید شده" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "نمایش فقط کاره‌هایی که هویت توسعه‌دهندگانشان تأیید شده" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically removed " +"during upgrade." +msgstr "" +"نرم‌افزار نصب شده با %s سازگار نبوده و در طول ارتقا به صورت خودکار برداشته خواهند " +"شد." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "نرم‌افزار ناسازگار" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_ارتقا" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_حذف" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "داده‌ها و تنظمیات کاره" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_نگه‌داشتن" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "اجازهٔ بازگردانی محتوا و تنظمیات کاره را می‌دهد" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_حذف" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "داده‌ها را برای ذخیرهٔ فضای دیسک به صورت همیشگی حذف می‌کند" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "Software that has been installed from “%s” will cease to receive updates." +msgstr "نرم‌افزارهایی که از «%s» نصب شده اند، دیگر به‌روز نخواهند شد." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "از کار انداختن مخزن؟" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "برداشتن مخزن؟" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_از کار انداختن" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_برداشتن" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "به کار انداختن مخزن‌های جدید" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "روشن کردن مخزن‌های جدید هنگام افزودنشان" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "اطّلاعات بیش‌تر" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "مخزن‌های اضافی از سوم‌شخص‌های گزیده — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "مخزن‌های سوم‌شخص فدورا" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "سیستم‌عامل" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "این مخزن‌ها، نرم‌افزارهای پیش‌گزیده‌ای که به دست %s فراهم شده را تکمیل می‌کنند." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "مخزن‌های نرم‌افزاری" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "بدون مخزن" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%Iu کاره نصب شد" +msgstr[1] "%Iu کاره نصب شدند" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%Iu افزونه نصب شد" +msgstr[1] "%Iu افزونه نصب شدند" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%Iu کاره" +msgstr[1] "%Iu کاره" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%Iu افزونه" +msgstr[1] "%Iu افزونه" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s و %s نصب شد" +msgstr[1] "%s و %s نصب شدند" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "بررسی کردن نرم‌افزارهای نصب‌شده…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "برداشتن" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "بدم می‌آید" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "نمی‌پسندم" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "قابل قبول" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "می‌پسندم" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "خوشم می‌آید" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "برای گذاشتن رتبه‌دهی ستاره‌ای را برگزینید" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "لطفاً زمان بیش‌تری برای نوشتن بازبینی بگذارید" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "لطفاً یک ستاره رتبه‌بندی انتخاب کنید" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "خلاصه خیلی کوتاه است" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "خلاصه خیلی بلند است" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "توضیحات خیلی کوتاه است" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "توضیحات خیلی بلند است" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "نوشتن بازبینی" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_فرستادن" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used to " +"report problems: instead, contact the developer or your support provider." +msgstr "" +"لطفاً امتیاز، خلاصه و متن بازبینی را وارد کنید. بازبینی‌ها نباید برای گزارش مشکل " +"استفاده شوند: به جایش با توسعه‌دهنده یا فراهمگر پشتیبانیتان تماس بگیرید." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "خلاصهٔ بازبینی" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "نوشتن بازبینی‌ای کوتاه" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy " +"policy. The full name attached to your account will be shown publicly." +msgstr "" +"در سیاست محرمانگیمان ببینید چه " +"داده‌هایی ارسال می‌شوند. نام کامل پیوسته به حسابتان به صورت عمومی دیده خواهد شد." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "مجموعاً %Iu بازبینی" +msgstr[1] "مجموعاً %Iu بازبینی" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "از ۵ ستاره" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "ناشناس" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"شما می‌توانید بازبینی‌ها را به دلیل سوء استفاده، بی‌ادبی یا تبعیض آمیز بودن گزارش " +"دهید." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"زمانی که گزارش ارسال شود، بازبینی مخفی خواهد شد تا زمانی که یک مدیر آن را بررسی " +"کند." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "گزارش بازبینی؟" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_گزارش" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "برداشتن بازبینی؟" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "برداشتن بازبینی نمی‌تواند برگردانده شود." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "پسندیدن بازبینی" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "نپسندیدن بازبینی" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "گزارش…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "برداشتن…" + +#: src/gs-safety-context-dialog.c:154 +msgid "App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "کاره قرنطینه نشده؛ ولی توزیع بررسی کرده که مخرّب نباشد" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "بررسی کنید که به سازنده اطمینان دارید، چرا که کاره قرنطینه نشده" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "بدون اجازه" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "کاره کاملاً قرنطینه است" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "دسترسی شبکه" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "می‌تواند به اینترنت دسترسی داشته باشد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "بدون دسترسی شبکه" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "نمی‌تواند به اینترنت دسترسی داشته باشد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "از خدمت‌های سامانه استفاده می‌کند" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "می‌تواند از خدمت‌های سامانه، داده درخواست کند" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "از خدمت‌های نشست استفاده می‌کند" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "می‌تواند از خدمت‌های نشست، داده درخواست کند" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "دسترسی ‌افزارهٔ کاربر" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "می‌تواند به افزاره‌هایی چون وب‌کم و دسته‌ٔ بازی دسترسی داشته باشد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "بدون دسترسی افزارهٔ کاربر" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "نمی‌تواند به افزاره‌هایی چون وب‌کم و دسته‌ٔ بازی دسترسی داشته باشد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "دسترسی ‌افزارهٔ ورودی" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "دسترسی صدابَر و پخش صدا" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "می‌تواند بدون اجازه گرفتن با استفاده از صدابَر شنود کرده و صدا پخش کند" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "دسترسی ‌افزارهٔ سامانه" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "می‌تواند به افزاره‌های سامانه‌ای که نیازمند اجازه‌های زیادند دسترسی داشته باشد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "دسترسی به محتوای صفحه" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "می‌تواند به محتوای صفحه یا دیگر پنجره‌ها دسترسی داشته باشد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "سامانهٔ پنجرهٔ قدیمی" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "اجازه‌های دلخواه" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "تنظیمات کاربری" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "دسترسی خواندن و نوشتن کامل روی سامانهٔ پرونده" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "می‌تواند تمامی داده‌ها در سامانهٔ پرونده را خوانده و رویشان بنویسد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "دسترسی خواندن و نوشتن روی شاخهٔ خانه" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "می‌تواند تمامی داده‌ها در شاخهٔ خانگیتان را خوانده و رویشان بنویسد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "دسترسی خواندن کامل روی سامانهٔ پرونده" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "می‌تواند تمامی داده‌ها در سامانهٔ پرونده‌تان را بخواند" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "دسترسی خواندن شاخهٔ خانه" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "می‌تواند تمامی داده‌ها در شاخهٔ خانگیتان را بخواند" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "دسترسی خواندن و نوشتن روی شاخهٔ بارگیری‌ها" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "می‌تواند تمامی داده‌ها در شاخهٔ بارگیری‌هایتان را خوانده و رویشان بنویسد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "دسترسی خواندن شاخهٔ بارگیری‌ها" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "می‌تواند تمامی داده‌ها در شاخهٔ بارگیری‌هایتان را بخواند" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "می‌تواند تمامی داده‌ها در شاخه را خوانده و رویشان بنویسد" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "می‌تواند تمامی داده‌ها در شاخه را بخواند" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "بدون دسترسی به سامانهٔ پرونده" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "به کل نمی‌تواند به سامانهٔ پرونده دسترسی داشته باشد" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "توسعه‌دهندهٔ کاره تأیید شده است" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "تأیید شده توسعه‌دهندهٔ این کاره، همانیست که می‌گوید" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "نیازمندی‌های ناامن" + +#: src/gs-safety-context-dialog.c:399 +msgid "Software or its dependencies are no longer supported and may be insecure" +msgstr "نرم‌افزار یا نیازمندی‌هایش دیگر پشتیبانی نمی‌شوند و شاید ناامن باشند" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "این کارع مشخّص نمی‌کند با چه پروانه‌ای توسعه داده شده و ممکن است مالکیتی باشد" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"این نرم‌افزار مشخّص نمی‌کند با چه پروانه‌ای توسعه داده شده و ممکن است مالکیتی باشد" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "کد مالکیتی" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and might be " +"unsafe" +msgstr "" +"کد منبع عمومی نیست، پس نمی‌تواند مستقلانه بررسی شود و به صورت بالقوه ناامن است" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "این کاره با پروانهٔ خاص «%s» توسعه داده شده." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "این نرم‌افزار با پروانهٔ خاص «%s» توسعه داده شده." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "کد بازرسی‌پذیر" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the app " +"more likely to be safe" +msgstr "" +"کد منبع عمومی است و می‌تواند مستقلانه بررسی شود که کاره را بیش‌تر به امن بودن نزدیک " +"می‌کند" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s ممتاز است" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s امن است" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s احتمالاً امن است" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s بالقوه ناامن است" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s ناامن است" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "ناشناخته" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "امنیت" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "پروانه" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "منبع" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "کیت توسعهٔ نرم‌افزار" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might contain " +"bugs or security vulnerabilities which will not be fixed." +msgstr "" +"این کاره از نگارشی قدیمی از بن‌سازهٔ نرم‌افزاری (SDK) استفاده کرده و ممکن است دارای " +"مشکلات یا آسیب‌پذیری‌های امنیتی‌ای باشد که رفع نخواهند شد." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "نماگرفت پیشین" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "نماگرفت بعدی" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "بدون نماگرفت" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "نماگرفتی پیدا نشد" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "بارگیری تصویر شکست خورد" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "اندازه نماگرفت پیدا نشد" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "نمی‌توان انباره را ساخت" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "نماگرفت معتبر نیست" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "نماگرفتی از برنامه موجود نیست" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "نماگرفت" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%Iu مورد منطبق بیش‌تر" +msgstr[1] "%Iu مورد منطبق بیش‌تر" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "صفحهٔ جست‌وجو" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "جست‌وجوی کاره‌ها" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "هیچ کاره‌ای پیدا نشد" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "ناتوان در بارگیری به‌روز رسانی‌ها" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "ناتوان در بارگیری به‌روز رسانی‌های ثابت‌افزار" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "ناتوان در بارگیری به‌روز رسانی‌های ثابت‌افزار از %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "ناتوان در بارگیری به‌روز رسانی‌ها از %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "ناتوان در به‌روز رسانی: نیازمند دسترسی به اینترنت" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "ناتوان در به‌روز رسانی: فضای دیسک ناکافی" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "ناتوان در بارگیری به‌روز رسانی‌ها از %s: فضای دیسک ناکافی" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "ناتوان در به‌روز رسانی: نیازمند هویت‌سنجی" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "ناتوان در به‌روز رسانی: هویت‌سنجی نامعتبر" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "ناتوان در به‌روز رسانی %s: نیازمند اجازه" + +#: src/gs-shell.c:1252 +msgid "Unable to download updates: you do not have permission to install software" +msgstr "ناتوان در بارگیری به‌روز رسانی‌ها: شما اجازهٔ نصب نرم‌افزار را ندارید" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "ناتوان در گرفتن فهرست به‌روز رسانی‌ها" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "ناتوان در نصب: شکست بارگیری" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "ناتوان در نصب %s: شکست بارگیری از %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "ناتوان در نصب %s: شکست بارگیری" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "ناتوان در نصب: نبود زمان اجرا" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "ناتوان در نصب %s: موجود نبودن زمان اجرای %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "ناتوان در نصب %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "ناتوان در نصب: نیازمند دسترسی به اینترنت" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "ناتوان در نصب: قالب نامعتبر کاره" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "ناتوان در نصب: فضای دیسک ناکافی" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "ناتوان در نصب %s: فضای دیسک ناکافی" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "ناتوان در نصب: نیازمند هویت‌سنجی" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "ناتوان در نصب %s: نیازمند هویت‌سنجی" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "ناتوان در نصب: هویت‌سنجی نامعتبر" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "ناتوان در نصب %s: هویت‌سنجی نامعتبر" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "ناتوان در نصب: نیازمند اجازه" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "ناتوان در نصب %s: نیازمند اجازه" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "ناتوان در نصب: افزاره باید به برق باشد" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "ناتوان در نصب %s: افزاره باید به برق باشد" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "ناتوان در نصب: باتری کم" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "ناتوان در نصب %s: باتری کم" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "ناتوان در به‌روز رسانی %s از %s: شکست بارگیری" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "ناتوان در نصب %s: شکست بارگیری" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "ناتوان در نصب به‌روز رسانی‌ها از %s: شکست بارگیری" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "ناتوان در نصب: شکست بارگیری" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "ناتوان در به‌روز رسانی %s: فضای دیسک ناکافی" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "ناتوان در به‌روز رسانی %s: نیازمند هویت‌سنجی" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "ناتوان در به‌روز رسانی %s: هویت‌سنجی نامعتبر" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "ناتوان در به‌روز رسانی %s: نیازمند اجازه" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "ناتوان در به‌روز رسانی: افزاره باید به برق باشد" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "ناتوان در به‌روز رسانی %s: افزاره باید به برق باشد" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "ناتوان در به‌روز رسانی: باتری کم" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "ناتوان در به‌روز رسانی %s: باتری کم" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "ناتوان در به‌روز رسانی %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "ناتوان در به‌روز رسانی" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "ناتوان در ارتقا" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "ناتوان در ارتقا به %s از %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "ناتوان در ارتقا: شکست بارگیری" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "ناتوان در ارتقا به %s: شکست بارگیری" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "ناتوان در ارتقا: نیازمند دسترسی به اینترنت" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "ناتوان در ارتقا به %s: نیازمند دسترسی به اینترنت" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "ناتوان در ارتقا: فضای دیسک ناکافی" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "ناتوان در ارتقا به %s: فضای دیسک ناکافی" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "ناتوان در ارتقا: نیازمند هویت‌سنجی" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "ناتوان در ارتقا به %s: نیازمند هویت‌سنجی" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "ناتوان در ارتقا: هویت‌سنجی نامعتبر" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "ناتوان در ارتقا به %s: هویت‌سنجی نامعتبر" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "ناتوان در ارتقا: نیازمند اجازه" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "ناتوان در ارتقا به %s: نیازمند اجازه" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "ناتوان در ارتقا: افزاره باید به برق باشد" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "ناتوان در ارتقا به %s: افزاره باید به برق باشد" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "ناتوان در ارتقا: باتری کم" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "ناتوان در ارتقا به %s: باتری کم" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "ناتوان در ارتقا به %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "ناتوان در حذف نصب: نیازمند هویت‌سنجی" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "ناتوان در حذف نصب %s: نیازمند هویت‌سنجی" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "ناتوان در حذف نصب: هویت‌سنجی نامعتبر" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "ناتوان در حذف نصب %s: هویت‌سنجی نامعتبر" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "ناتوان در حذف نصب: نیازمند اجازه" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "ناتوان در حذف نصب %s: نیازمند اجازه" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "ناتوان در حذف نصب: افزاره باید به برق باشد" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "ناتوان در حذف نصب %s: افزاره باید به برق باشد" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "ناتوان در حذف نصب: باتری کم" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "ناتوان در حذف نصب %s: باتری کم" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "ناتوان در حذف نصب %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "ناتوان در اجرای %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 src/gs-shell.c:1876 +#: src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "متأسفیم، اشکالی به وجود آمد" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "ناتوان در اجرای %s: %s نصب نشده است" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "فضای دیسک کافی برای عملیات وجود ندارد" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "ناتوان در نصب: گونهٔ پروندهٔ پشتیبانی نشده" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "ناتوان در نصب: شکست هویت‌سنجی" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "ناتوان در نصب" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "ناتوان در تماس با %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "آغار دوبارهٔ نرم‌افزارها برای استفاده از افزایه‌های جدید" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "افزاره نیاز به وصل شدن به برق دارد" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "سطح باتری بیش از حد کم" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_مخزن‌های نرم‌افزاری" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_ترجیحات" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_میان‌برهای صفحه‌کلید" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_دربارهٔ نرم‌افزارها" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "جست‌وجو" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "فهرست اصلی" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "جست‌وجوی کاره‌ها" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_کشف" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_نصب شده" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_به‌روز رسانی‌ها" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "بازگشت" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "هیچ‌کدام" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "دادهٔ کاره" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "داده‌های لازم برای اجرای کاره" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "دادهٔ کاربر" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "داده‌های تولیدیتان در کاره" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "دادهٔ انباره" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "داده‌های موقّتی انبار شده" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "خود کاره" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "نیازمند پیش‌نیاز" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "این کاره نیازمند مولّفه‌های سامانه‌ای هم‌رسانده است" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "نامعلوم" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "داده‌های انباشته می‌توانند از _تنظیمات کاره پاک‌سازی شوند" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "ذخیره‌سازی" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (نصب شده)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (در حال نصب)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (بار گرفتن)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (در حال برداشتن)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_جزییات" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_بررسی" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "در %s نصب شده است" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "به‌روز رسانی‌های نصب شده" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "هیچ به‌روز رسانی‌ای نصب نشده" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "به‌روز رسانی‌ها خارج از رده‌اند" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "لطفاً به‌روز رسانی‌های موجود را بررسی کنید" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "به‌روز رسانی‌های ضروری آمادهٔ نصبند" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "نصب به‌روز رسانی‌های ضروری در نخستین فرصت" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "به‌روز رسانی‌های ضروری آمادهٔ بارگیریند" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "بارگیری به‌روز رسانی‌های ضروری در نخستین فرصت" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "به‌روز رسانی‌ها آمادهٔ نصبند" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "به‌روز رسانی‌های نرم‌افزاری آماده و منتظرند" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "به‌روز رسانی‌ها آمادهٔ بارگیریند" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "به‌روز رسانی‌های نرم‌افزاری می‌توانند بار گرفته شوند" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%Iu کاره به‌روز شد — نیاز به شروع دوباره" +msgstr[1] "%Iu کاره به‌روز شدند — نیاز به شروع دوباره" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%Iu برنامه به‌روز شد" +msgstr[1] "%Iu برنامه به‌روز شدند" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s به‌روز شد." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "لطفاً کاره را دوباره شروع کنید." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s و %s به‌روز شدند." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%Iu کاره نیاز به شروع دوباره دارد." +msgstr[1] "%Iu کاره نیاز به شروع دوباره دارند." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "شامل %s، %s و %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "سامانه به پایان عمر خود رسیده" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "ارتقا برای ادامهٔ دریافت به‌روز رسانی‌ها" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "نگارشی جدید از %s برای نصب موجود است" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "ارتقای نرم‌افزاری موجود است" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "شکست در به‌روز رسانی نرم‌افزارها" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "به‌روز رسانی‌های آناده نصب نشدند" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "نمایش جزییات" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "ارتقای سامانه کامل شد" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "به %s %s خوش‌آمدید!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "به‌روز رسانی نرم‌افزاری نصب شد" +msgstr[1] "به‌روز رسانی‌های نرم‌افزاری نصب شدkn" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "به‌روز رسانی مهم سیستم‌عامل نصب شد." +msgstr[1] "به‌روز رسانی‌های مهم سیستم‌عامل نصب شدند." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "بازبینی" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "به‌روز رسانی شکست خورد" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "سامانه از پیش به‌روز بود." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "به‌روز رسانی لغو شد." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you have " +"internet access and try again." +msgstr "" +"دسترسی به اینترنت لازم بود، اما امکان اتّصال وجود نداشت. لطفاً مطمئن شوید که دسترسی " +"به اینترنت دارید و دوباره تلاش کنید." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software provider " +"for more details." +msgstr "" +"مشکلات امنیتی در به‌روز رسانی وجود داشت. لطفاً برای اطّلاعات بیش‌تر با فراهم کننده " +"نرم‌افزار خود مشورت کنید." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "There wasn’t enough disk space. Please free up some space and try again." +msgstr "فضای دیسک کافی نبود. لطفاً کمی فضا خالی کنید و دوباره تلاش کنید." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update and try " +"again. If the problem persists, contact your software provider." +msgstr "" +"ما متأسفیم: نصب به‌روز رسانی شکست خورد. لطفاً برای یک به‌روز رسانی دیگر صبر کنید و " +"دوباره تلاش کنید. اگر باز هم مشکل داشتید، با فراهم کننده نرم‌افزار تماس بگیرید." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "آخرین بررسی: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "توقف" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "بررسی برای به‌روز رسانی‌ها" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s دیگر به‌روز رسانی‌های بحرانی را دریافت نمی‌کند" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "سیستم‌عاملتان دیگر به‌روز رسانی‌های نرم‌افزاری بحرانی را نمی‌گیرد" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "ممکن است هزینه‌بر باشد" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur charges." +msgstr "" +"بررسی به‌روز رسانی‌ها هنگام استفاده از شبکهٔ پهن‌باند همراه، ممکن است برایتان " +"هزینه‌هایی داشته باشد." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_به هر حال بررسی شود" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "ارتقاهای نرم‌افزاری بار گرفته شدند" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "ارتقاها آمادهٔ نصبند" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "بررسی برای به‌روز رسانی‌ها" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "به‌روز رسانی‌ها" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "صفحهٔ به‌روز رسانی‌ها" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "بار کردن به‌روز رسانی‌ها" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "ممکن است مدّتی طول بکشد" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "به روز" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "استفاده از دادهٔ همراه؟" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur charges" +msgstr "" +"بررسی به‌روز رسانی‌ها هنگام استفاد از شبکهٔ پهن‌باند همراه، ممکن است برایتان هزینه‌هایی " +"داشته باشد" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "به _هر حال بررسی شود" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "بدون اتّصال" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "برخط شدن برای بررسی به‌روز رسانی‌ها" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "تنظیمات _شبکه" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "خطا" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "به‌روز رسانی‌ها به طور خودکار مدیریت می‌شوند" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "مکث به‌روز رسانی نرم‌افزارها" + +#: src/gs-updates-paused-banner.c:47 +msgid "Automatic software updates have been paused for the following reasons:\n" +msgstr "به‌روز رسانی‌های خودکار نرم‌افزاری به دلایل زیر مکث شده‌اند:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• اتّصال شبکهٔ کنونی اندازه‌گیری شده است" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• اتّصال شبکهٔ کنونی از بارگیری‌های بزرگ جلوگیری می‌کند" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• حالت ذخیرهٔ نیرو فعّال است" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• حالت بازی فعّال است" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "مکث به‌روز رسانی نرم‌افزارها" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "اتّصال شبکه اندازه‌گیری شده است — به‌روز رسانی‌های نرم‌افزاری مکث شده‌اند" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"اتّصال شبکه از بارگیری‌های بزرگ جلوگیری می‌کند — به‌روز رسانی‌های نرم‌افزاری مکث شده‌اند" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "حالت ذخیرهٔ نیرو فعّال است — به‌روز رسانی‌های نرم‌افزاری مکث شده‌اند" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "حالت بازی فعّال است — به‌روز رسانی‌های نرم‌افزاری مکث شده‌اند" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_راه‌اندازی دوباره و به‌روز رسانی…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_بروزرسانی همه" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "به‌روز رسانی‌های نرم‌افزاری بار گرفته شدند" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "به‌روز رسانی‌ها آمادهٔ نصب شدنند" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "ثابت‌افزار یکپارچه" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "نیاز به راه‌اندازی دوباره دارد" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "به‌روز رسانی‌های کاره" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "ثابت‌افزار افزاره" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_بارگیری" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s موجود است" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s موجود است" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "دربارهٔ نگارش جدید بیاموزید" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s از %s بارگیری" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%Iu٪ بار گرفته" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "یک ارتقای عمده، همراه امکانات جدید و بهینه‌سازی‌های بیش‌تر." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "لغو ارتقا" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_آغاز دوباره و ارتقا…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "به یاد داشته باشید که پیش از ارتقا، از داده‌ها و پرونده‌ها پشتیبان بگیرید." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "جزییات خطا" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "رونوشت از جزییات" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "شکست در حذف پروندهٔ «‎%s»: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "شکست در حذف شاخهٔ «‎%s»: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "افزودن، برداشتن یا به‌روز رسانی نرم‌افزارهای این رایانه" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;به‌روز رسانی‌ها;ارتقا;منابع;مخازن;ترجیحات;نصب;حذف;برنامه;نرم‌افزار;اپ;استور;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s آماده است" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s آمادهٔ به کار افتادن بوده و برای راه‌اندازی بعدی روی صحنه رفته." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "به کار انداختن" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "به‌روز رسانی‌های سامانه" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "به‌روز رسانی‌های عمومی سامانه، مانند رفع اشکال و بهبودهای کارایی." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "به‌روز رسانی %s با امکانات جدید و رفع اشکال‌ها." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "خدمت به‌روز رسانی اندلس نتوانست به‌روز رسانی را گرفته و اعمال کند." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "کارهٔ وب" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "پشتیبانی برنامه‌های وبی" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "برنامه‌های وبی مشهور را در یک مرورگر اجرا کنید" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "Upgrade for the latest features, performance and stability improvements." +msgstr "ارتقا برای جدیدترین ویژگی‌ها و بهبود پایداری و کارایی." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "پشتیبانی فلت‌پک" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "فلت‌پک چارچوبی برای کاره‌های میزکار روی گنو/لینوکس است" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "شاخهٔ سامانه %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "شاخهٔ خانه %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "شاخه‌های سامانهٔ میزبان" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "پیکربندی سامانهٔ میزبان از ‪/etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "شاخهٔ میزکار" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "زیرشاخهٔ میزکار %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "شاخهٔ سندها" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "زیرشاخهٔ سندها %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "شاخهٔ آهنگ‌ها" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "زیرشاخهٔ آهنگ‌ها %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "شاخهٔ عکس‌ها" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "زیرشاخهٔ عکس‌ها %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "شاخهٔ هم‌رسانی عمومی" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "زیرشاخهٔ هم‌رسانی عمومی %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "شاخهٔ ویدیوها" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "زیرشاخهٔ ویدیوها %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "شاخهٔ قالب‌ها" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "زیرشاخهٔ قالب‌ها %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "شاخهٔ انبارش کاربر" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "زیرشاخهٔ انبارش کاربر %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "شاخهٔ پیکربندی کاربر" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "زیرشاخهٔ پیکربندی کاربر %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "شاخهٔ دادهٔ کاربر" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "زیرشاخهٔ دادهٔ کاربر %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "شاخهٔ زمان اجرای کاربر" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "زیرشاخهٔ زمان اجرای کاربر %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "دسترسی به سامانهٔ پروندهٔ %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "در حال گرفتن فرادادهٔ فلت‌پک برای %s…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "شکست در پالایش افزونهٔ «%s»: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "نصب کاربر" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "نصب سامانه" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "شناسهٔ کاره" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "شکست در افزودن به نصب برای افزونهٔ «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "شکست در افزودن به حذف برای افزونهٔ «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. Remove the " +"filter and repeat the install. Detailed error: %s" +msgstr "" +"مخزن «%s» اجازهٔ نصب «%s» را احتمالاً به خاطر پالایه‌هایش نمی‌دهد. پالایه را برداشته و " +"نصب را تکرار کنید. خطای با جزییات: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "نیروی سامانه برای انجام به‌روز رسانی بیش از حد کم است" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "نیروی سامانه برای انجام به‌روز رسانی بیش از حد کم است (%Iu٪. نیازمند %Iu٪)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "افزاره در قابل دسترسی یا در بازهٔ بی‌سیم نیست" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "نیروی باتری افزاره بیش از حد کم است" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "نیروی باتری افزار بیش از حد کم است (%Iu٪. نیازمند %Iu٪)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "افزاره منتظر اعمال به‌روز رسانی است" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "افزاره نیازمند وصل بودن نیروی جریان متناوب است" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "افزاره هنگام بسته بودن درش قابل استفاده نیست" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "به‌روز رسانی افزارهٔ %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "به‌روز رسانی سامانهٔ %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "به‌روز رسانی واپایشگر توکار %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "به‌روز رسانی موتور مدیریت %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "به‌روز رسانی موتور مدیریت تجاری %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "به‌روز رسانی موتور مدیریت مصرفی %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "به‌روز رسانی واپایشگر %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "به‌روز رسانی واپایشگر تاندربولت %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "به‌روز رسانی ریزرمز پردازندهٔ %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "به‌روز رسانی پیکربندی %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "به‌روز رسانی باتری %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "به‌روز رسانی دوربین %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "به‌روز رسانی تی‌پی‌ام %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "به‌روز رسانی صفحه لمسی %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "به‌روز رسانی موشی %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "به‌روز رسانی صفحه‌کلید %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "به‌روز رسانی واپایشگر حافظهٔ %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "به‌روز رسانی واپایشگر شبکهٔ %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "به‌روز رسانی نمایشگر %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "به‌روز رسانی BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "به‌روز رسانی گیرندهٔ یواس‌بی %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "به‌روز رسانی گردانندهٔ %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "به‌روز رسانی گردانندهٔ فلش %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "به‌روز رسانی گردانندهٔ حالت جامد %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "به‌روز رسانی شتاب دهندهٔ گرافیکی %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "به‌روز رسانی داک %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "به‌روز رسانی داک یو‌اس‌بی %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "ثابت‌افزار" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "به‌روز رسانی ثابت‌افزار نتوانست اعمال شود: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "پشتیبانی ارتقای ثابت‌افزار" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "برای ارتقاهای ثابت‌افزار، پشتیبانی فراهم می‌کند" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "نصب نرم‌افزار امضانشده؟" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to verify " +"the origin of updates to this software, or whether updates have been tampered with." +msgstr "" +"نرم‌افزاری که می‌خواهد نصب شود، امضا نشده. تأیید خاستگاه به‌روز رسانی‌های این نرم‌افزار " +"یا دستکاری نشدنشان ممکن نخواهد بود." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "بارگیری نرم‌افزار امضانشده؟" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to verify " +"the origin of the update, or whether it has been tampered with." +msgstr "" +"به‌روز رسانی‌های امضانشده موجودند. بدون امضا، تأیید خاستگاه به‌روز رسانی یا دستکاری " +"نشدنشان ممکن نیست." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "به‌روز رسانی نرم‌افزار امضانشده؟" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to verify " +"the origin of the update, or whether it has been tampered with. Software updates " +"will be disabled until unsigned updates are either removed or updated." +msgstr "" +"به‌روز رسانی‌های امضانشده موجودند. بدون امضا، تأیید خاستگاه به‌روز رسانی یا دستکاری " +"نشدنشان ممکن نیست. به‌روز رسانی‌های نرم‌افزار تا هنگام برداشته یا به‌روز شدن " +"به‌روز رسانی‌های امضا نشده، از کار خواهند افتاد." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "شکست در نصب به‌روز رسانی‌ها: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "بسته‌ها" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "شکست در انتظار برای پایان تراکنش پیش از بارگیری: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "شکست در بارگیری به‌روز رسانی‌ها: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "شکست در تحریک به‌روز رسانی: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "سیستم‌عامل (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "فروشگاه اسنپ" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "پشتیبانی اسنپ" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "اسنپ یک بستهٔ جهانی گنو/لینوکسی است" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "سامانه" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "مولّفهٔ سامانه‌ای" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "برداشتن کار «%s» از sysupdate با وضعیت %Ii شکست خورد" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "راهی خوب برای مدیریت نرم‌افزارهای سامانه‌تان." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "لطفاً عددی از ۱ تا %Iu وارد کنید: " + +#~ msgid "Choose an app:" +#~ msgstr "گزینش یک کاره:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "حالا %s نصب شد" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "کاره‌هایی برداشته شدند" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "امکان یافتن «%s» نبود" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "بارگیری کالانمایِ نرم‌افزاری" + +#~ msgid "Moderate page" +#~ msgstr "صفحهٔ مدیریت" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "هیچ بازبینی‌ای برای مدیریت وجود ندارد" + +#, c-format +#~ msgid "%s %s %s" +#~ msgstr "%s %s %s" + +#~ msgid "Was this review useful to you?" +#~ msgstr "آیا این بازبینی برای شما مفید بود؟" + +#~ msgid "Yes" +#~ msgstr "بله" + +#~ msgid "No" +#~ msgstr "خیر" + +#~ msgid "Meh" +#~ msgstr "هممم" + +#~ msgid "Outdated SDK version" +#~ msgstr "نگارش تاریخ‌گذشتهٔ کیت توسعهٔ نرم‌افزار" + +#~ msgid "Unable to install updates" +#~ msgstr "ناتوان در نصب به‌روز رسانی‌ها" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "ناتوان در حذف نصب: هویت‌سنجی نامعتبر" + +#~ msgid "Network Settings" +#~ msgstr "تنظیمات شبکه" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "به‌روز رسانی‌های سیستم‌عامل ناموجودند" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "نصب یک به‌روز رسانی مهم سیستم‌عامل شکست خورد." + +#~ msgid "No Network" +#~ msgstr "بدون شبکه" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "دسترسی به اینترنت برای بررسی به‌روز رسانی‌ها لازم است." + +#~ msgid "Network _Settings" +#~ msgstr "_تنظیمات شبکه" + +#~ msgid "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "ارتقاهای نرم‌افزاری بار گرفته و آمادهٔ نصبند." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "به‌روز رسانی‌های نرم‌افزاری بار گرفته و آمادهٔ نصبند." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "بارگیری اطّلاعات ارتقا…" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "یک به‌روز رسانی مهم نرم‌افزار، آمادهٔ نصب است." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "مهم: به روز رسانی‌های حسّاس نرم‌افزاری در انتظارند." + +#~ msgid "Please download waiting software updates." +#~ msgstr "لطفاً به‌روز رسانی‌های نرم‌افزاری منتظر را بارگیری کنید." + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your reasons " +#~ "for leaving a review is helpful for others." +#~ msgstr "" +#~ "چه چیز این کاره را پسندیدید؟ گذاشتن بازخوردتان به همراه دلایلتان به شکل بازبینی " +#~ "برای دیگران مفید است." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "به‌روز رسانی‌های خودکار مکث شدند" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be changed " +#~ "in Settings." +#~ msgstr "" +#~ "شبکهٔ کنونی اندازه‌گیری شده است و شاید محدودیت‌های داده‌ای یا هزینه‌های مربوط داشته " +#~ "باشد برای ذخیرهٔ داده، به‌روز رسانی‌های خودکار مکث شده‌اند.\n" +#~ "\n" +#~ "اگر شبکه به اشتباه به عنوان اندازه‌گیری شده شناخته شده، می‌تواند در تنظیمات تغییر " +#~ "داده شود." + +#~ msgid "Open Network _Settings" +#~ msgstr "گشودن _تنظیمات شبکه" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "شبکهٔ اندازه‌گیری شده - به‌روز رسانی‌های خودکار مکث شدند" + +#~ msgid "Find Out _More" +#~ msgstr "بیش‌تر دریابید" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t available" +#~ msgstr "ناتوان در بارگیری به‌روز رسانی‌ها: دسترسی به اینترنت مورد نیاز است" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "ناتوان در بارگیری به‌روز رسانی‌ها: فضای دیسک ناکافی" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "ناتوان در بارگیری به‌روز رسانی‌ها: نیاز به تصدیق هویت" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "ناتوان در بارگیری به‌روز رسانی‌ها: تصدیق هویت نامعتبر" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "ناتوان در نصب %s: شما اجازهٔ نصب نرم‌افزار را ندارید" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "ناتوان در نصب %s: سطح باتری بیش از حد کم" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "ناتوان در نصب به‌روز رسانی‌ها: فضای دیسک ناکافی" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "ناتوان در نصب به‌روز رسانی‌ها: نیاز به تصدیق هویت" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "ناتوان در نصب به‌روز رسانی‌ها: تصدیق هویت نامعتبر" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "ناتوان در به‌روز رسانی %s: شما اجازهٔ به‌روز رسانی نرم‌افزار را ندارید" + +#, c-format +#~ msgid "Unable to install updates: you do not have permission to update software" +#~ msgstr "ناتوان در نصب به‌روز رسانی‌ها: شما اجازهٔ به‌روز رسانی نرم‌افزار را ندارید" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "ناتوان در نصب به‌روز رسانی‌ها: نیاز به برق متناوب" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "ناتوان در به‌روز رسانی %s: سطح باتری بیش از حد کم" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "ناتوان در نصب به‌روز رسانی: سطح باتری بیش از حد کم" + +#, c-format +#~ msgid "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "ناتوان در ارتقا به %s: دسترسی به اینترنت مورد نیاز است" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "ناتوان در ارتقا به %s: شما اجازهٔ ارتقای نرم‌افزار را ندارید" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "ناتوان در ارتقا به %s: سطح باتری بیش از حد کم" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "ناتوان در برداشتن %s: نیاز به تصدیق هویت" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "ناتوان در برداشتن %s: تصدیق هویت نامعتبر" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "ناتوان در برداشتن %s: شما اجازهٔ برداشتن نرم‌افزار را ندارید" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "ناتوان در برداشتن %s: نیاز به برق متناوب" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "ناتوان در برداشتن %s: سطح باتری بیش از حد کم" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "ناتوان در برداشتن %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "شکست در نصب پرونده: عدم پشتیبانی" + +#~ msgid "Failed to install: not supported" +#~ msgstr "شکست در نصب: عدم پشتیبانی" + +#~ msgid "AC power is required" +#~ msgstr "نیاز به برق متناوب" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "برای جلوگیری از هزینه‌های شبکه، به‌روز رسانی‌های نرم‌افزاری روی اتّصال‌های اندازه‌گیری " +#~ "شده یا همراه، به صورت خودکار بارگیری نمی‌شوند." + +#~ msgid "Downloads and installs software updates in the background, when possible" +#~ msgstr "در صورت امکان، به‌روز رسانی‌های نرم‌افزاری را در پس‌زمینه بارگیری و نصب می‌کند" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "فقط نمایش کاره‌های _آزاد" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "فقط نمایش کاره‌های آزاد و نهفتن کاره‌های مالکیتی" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "بار کردن شرح به‌روز رسانی. لطفاً شکیبا باشید…" + +#~ msgid "Downloading featured images…" +#~ msgstr "بارگیری تصویرهای ویژه…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "نمایش اطّلاعات کامل اشکال‌زدایی" + +#~ msgid "Can access arbitrary files" +#~ msgstr "می‌تواند به پرونده‌های نامعقولی دسترسی داشته باشد" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "آیا مطمئنید که می‌خواهید %s را حذف کنید؟" + +#, c-format +#~ msgid "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "%s حذف خواهد شد و باید برای استفادهٔ دوباره از آن، نصبش کنید." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "آخرین زمانی که سامانه برخط بود و به‌روز رسانی‌ای دریافت کرد" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US English." +#~ msgstr "" +#~ "این نرم‌افزار به زبانتان موجود نیست و به انگلیسی آمریکایی نشان داده خواهد شد." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "افزودنی‌های گزیده همراه برنامه نصب خواهند شد." + +#~ msgid "Applications" +#~ msgstr "برنامه‌ها" + +#~ msgid "_Continue" +#~ msgstr "_ادامه" + +#~ msgid "Post Review" +#~ msgstr "فرستادن بازبینی" + +#~ msgid "_Post" +#~ msgstr "_فرستادن" + +#~ msgid "Rating" +#~ msgstr "رتبه‌بندی" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would recommend”." +#~ msgstr "" +#~ "یک خلاصه از بازبینی خود بنویسید، برای مثال: «یک برنامه عالی، پیشنهادش میکنم»." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "بازبینی" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "در مورد برنامه چه فکری می‌کنید؟ سعی کنید برای دیدگاه‌های خود دلیل بیاورید." + +#~ msgid "No screenshot provided" +#~ msgstr "هیچ نماگرفتی فراهم نشده است" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "هم‌اکنون انجام راه‌اندازی دوباره" + +#~ msgid "Primary Menu" +#~ msgstr "فهرست اصلی" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "به‌روز رسانی‌ها" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s دیگر پشتیبانی نمی‌شود." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "این یعنی به‌روز رسانی‌های امنیتی را نخواهید گرفت." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "توصیه می‌شود که به نگارشی جدیدتر ارتقا دهید." + +#~ msgid "Update All" +#~ msgstr "به‌روز رسانی همه" + +#~ msgid "Application Updates" +#~ msgstr "به‌روز رسانی برنامه‌ها" + +#~ msgid "GNOME Web" +#~ msgstr "وبِ گنوم" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "هیچ به‌روز رسانی‌ای روی این سامانه نصب نشده است." + +#~ msgid "Application manager for GNOME" +#~ msgstr "مدیر برنامه برای گنوم" + +#~ msgid "Name" +#~ msgstr "نام" + +#~ msgid "user" +#~ msgstr "کاربر" + +#~ msgid "Channel" +#~ msgstr "کانال" + +#~ msgid "Branch" +#~ msgstr "شاخه" + +#~ msgid "URL" +#~ msgstr "نشانی" + +#~ msgid "Installation" +#~ msgstr "نصب" + +#~ msgid "Version" +#~ msgstr "نگارش" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "در حال بارگیری فهرست نرم‌افزارها" + +#~ msgid "Access arbitrary files" +#~ msgstr "دسترسی به پرونده‌های نامعقول" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "می‌تواند پرونده‌هایی نامعقول در سامانهٔ پرونده‌تان را بخواند" + +#~ msgid "A list of popular applications" +#~ msgstr "فهرستی از برنامه‌های محبوب" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "فهرستی از برنامه‌ها برای استفاده. جایگزین برنامه‌های تعریف شدهٔ سامانه می‌شود." + +#~ msgid "Checking…" +#~ msgstr "در حال بررسی…" + +#~ msgid "Endless OS" +#~ msgstr "سیستم‌عامل اندلس" + +#~ msgid "Loading…" +#~ msgstr "بار کردن…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "بارگیری رتبه‌بندی‌های برنامه…" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "نشانی‌ای که به پس‌زمینهٔ بیرق ارتقا ارجاع می‌دهد." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the upgrade " +#~ "version." +#~ msgstr "نشانی می‌تواند تا سه «%Iu» باشد که با نگارش ارتقا جایگزین خواهد شد." + +#~ msgid "_Add shortcut" +#~ msgstr "_افزودن میان‌بر" + +#~ msgid "Re_move shortcut" +#~ msgstr "_برداشتن میان‌بر" + +#~ msgid "Welcome" +#~ msgstr "خوش آمدید" + +#~ msgid "Welcome to Software" +#~ msgstr "به نرم‌افزارها خوش آمدید" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. See " +#~ "our recommendations, browse the categories, or search for the applications you " +#~ "want." +#~ msgstr "" +#~ "نرم‌افزارها می‌گذارد تمامی نرم‌افزارهای مورد نیازتان را از یک جا نصب کنید. " +#~ "پیشنهادهایمان را دیده، دسته‌ها را مرور کرده، یا برای برنامه‌هایی که می‌خواهید، " +#~ "جست‌وجو کنید." + +#~ msgid "_Browse Software" +#~ msgstr "_مرور نرم‌افزارها" + +#~ msgid "OS Updates" +#~ msgstr "به‌روز رسانی‌های سیستم‌عامل" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "شامل بهینه‌سازی‌های کارایی، پایداری و امنیتی." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "بارگیری امضای به‌روز رسانی ثابت‌افزار…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "بارگیری فرادادهٔ به‌روز رسانی ثابت‌افزار…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "نرم‌افزار، اجازه‌هایی ناشناخته دارد" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "نرم‌افزار از منبعی مورد اعتماد می‌آید" + +#~ msgid "Unknown Permissions" +#~ msgstr "اجازه‌های ناشناخته" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "اجازه‌های لازم برای این کاره شناخته شده نیستند" + +#~ msgid "App comes from a trusted source" +#~ msgstr "کاره از منبعی مورد اعتماد می‌آید" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "توزیعتان تأیید کرده که این کاره مطمئن است" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "نمایش اعلان برای نصب مخزن‌ها نرم‌افزاری ناآزاد" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "برای افزاره‌های لکسی یا تلفن‌ها بهینه نشده" + +#~ msgid "Editor’s Picks" +#~ msgstr "انتخاب‌های سردبیران" + +#~ msgid "Recently Updated" +#~ msgstr "به تازگی به‌روز شده" + +#~ msgid "_Read More" +#~ msgstr "_خواندن بیش‌تر" + +#~ msgid "_Read Less" +#~ msgstr "_خواندن کم‌تر" + +#~ msgid "_Launch" +#~ msgstr "_اجرا" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on use, " +#~ "sharing, and access to source code." +#~ msgstr "" +#~ "برخی از این نرم‌افزارها مالکیتی بوده و بنابراین در استفاده، هم‌رسانی و دسترسی به " +#~ "کد مبدأ، محدودند." + +#~ msgid "Find out more…" +#~ msgstr "بیش‌تر دریابید…" + +#~ msgid "Recent Releases" +#~ msgstr "ارائه‌های اخیر" + +#~ msgid "Remove “%s”?" +#~ msgstr "برداشتن «%s»؟" + +#~ msgid "Disable “%s”?" +#~ msgstr "از کار انداختن «%s»؟" + +#~ msgid "No Additional Repositories" +#~ msgstr "بدون مخزن‌های اضافی" + +#~ msgid "_Remove…" +#~ msgstr "_برداشتن…" + +#~ msgid "_Disable…" +#~ msgstr "_از کار انداختن…" + +#~ msgid "Enabling" +#~ msgstr "به کار انداختن" + +#~ msgid "Disabling" +#~ msgstr "از کار انداختن" + +#~ msgid "Enabled" +#~ msgstr "به کار افتاده" + +#~ msgid "Disabled" +#~ msgstr "از کار افتاده" + +#~ msgid "_Remove All" +#~ msgstr "_برداشتن همه" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "به‌روز رسانی‌ها هنگام شروع دوبارهٔ رایانه اعمال خواهند شد." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "در انتظار بارگیری %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "در حال بارگیری %s %s" + +#~ msgid "Requires a specific screen size" +#~ msgstr "نیازمند اندازهٔ صفحهٔ خاص" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "هیچ وقت" + +#~ msgid "Localized in your Language" +#~ msgstr "بومی شده به زبانتان" + +#~ msgid "Release Activity" +#~ msgstr "فعالیت انتشار" + +#~ msgid "Developer" +#~ msgstr "توسعه‌دهنده" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "حذف‌شده" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "نصب شد" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "به‌روز شد" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "ناشناخته" + +#~ msgid "History" +#~ msgstr "تاریخچه" + +#~ msgid "More…" +#~ msgstr "بیش‌تر…" + +#~ msgid "Recommended Games" +#~ msgstr "بازی‌های پیشنهادی" + +#~ msgid "Recommended Creation Applications" +#~ msgstr "برنامه‌های آفرینش پیشنهادی" + +#~ msgid "Recommended Work Applications" +#~ msgstr "برنامه‌های کاری پیشنهادی" + +#~ msgid "Select All" +#~ msgstr "گزینش همه" + +#~ msgid "Select None" +#~ msgstr "گزینش هیچ‌کدام" + +#~ msgid "Featured %s" +#~ msgstr "ویژه‌های %s" + +#~ msgid "Show" +#~ msgstr "نمایش" + +#~ msgid "Subcategories filter menu" +#~ msgstr "فهرست پالایش زیردسته‌ها" + +#~ msgid "Sort" +#~ msgstr "چینش" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "فهرست چینش زیردسته‌ها" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgid "Audio & Video" +#~ msgstr "صوت و تصویر" + +#~ msgid "Developer Tools" +#~ msgstr "ابزارهای توسعه" + +#~ msgid "Education & Science" +#~ msgstr "یادگیری و علم" + +#~ msgid "Games" +#~ msgstr "بازی‌ها" + +#~ msgid "Graphics & Photography" +#~ msgstr "گرافیک و عکاسی" + +#~ msgid "Productivity" +#~ msgstr "بهره‌وری" + +#~ msgid "Communication & News" +#~ msgstr "ارتباطات و اخبار" + +#~ msgid "Utilities" +#~ msgstr "ابزارها" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. This " +#~ "is typical for older applications." +#~ msgstr "" +#~ "ناتوانی در تشخیص نواحی‌ای از سامانه که این برنامه به آن‌ها دسترسی دارد. برای " +#~ "برنامه‌های قدیمی، معمول است." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "پایین" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "متوسّط" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "بالا" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "نامعلوم" + +#~ msgid "Public domain" +#~ msgstr "دامنهٔ عمومی" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://wiki.ubuntu.ir/wiki/Free_Software" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "کاربران ملزم به پذیرفتن پروانه‌های زیر هستند:" + +#~ msgid "Sandboxed" +#~ msgstr "اجرا در محیط ایزوله" + +#~ msgid "Category" +#~ msgstr "دسته‌بندی" + +#~ msgid "Free" +#~ msgstr "آزاد" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "ناشناخته" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, studied " +#~ "and modified." +#~ msgstr "" +#~ "یعنی می‌توانید این نرم‌افزار را آزادانه اجرا، رونوشت، توزیع و مطالعه کرده یا " +#~ "تغییر دهید." + +#~ msgid "Proprietary Software" +#~ msgstr "نرم‌افزار انحصاری" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. There are " +#~ "often restrictions on its use and its source code cannot usually be accessed." +#~ msgstr "" +#~ "یعنی نرم‌افزار متعلق به یک فرد یا شرکت است. معمولاً محدودیت‌هایی در استفاده داشته " +#~ "و نمی‌توان به کد مبدأش دسترسی داشت." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "شرایط پروانهٔ این نرم‌افزار ناشناخته است." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "رتبهٔ برنامه این‌گونه‌است، چرا که:" + +#~ msgid "No details were available for this rating." +#~ msgstr "هیچ جزییاتی برای این رتبه‌بندی موجود نیست." + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "برنامه‌های صوتی و ویدیویی پیشنهادی" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "برنامه‌های فراورش پیشنهادی" + +#~ msgid "ratings in total" +#~ msgstr "رتبه‌ها در مجموع" + +#~ msgid "Looking for new updates…" +#~ msgstr "در حال بررسی برای به‌روز رسانی‌های جدید…" + +#~ msgid "Setting up updates…" +#~ msgstr "در حال برپاسازی به‌روز رسانی‌ها…" + +#~ msgid "Software is up to date" +#~ msgstr "نرم‌افزار به‌روز است" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "پرمیب خدمتی است که بازابینی‌های کاربری از برنامه‌ها را فراهم می‌کند" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "شخصیت‌های کارتونی در وضعیت‌های نا امن" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "شخصیت‌های کارتونی در وضعیت‌های درگیری" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "خشونت شامل شخصیت‌های کارتونی" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "شخصیت‌ها در موقعیت‌های نا امن که به راحتی از واقعیت قابل تشخیص هستند" + +#~ msgid "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "شخصیت‌های کارتونی در وضعیت‌های درگیری که به راحتی از واقعیت قابل تشخیص هستند" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "شامل خشونت که به راحتی از واقعیت قابل تشخیص هستند" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "شخصیت‌های تقریبا واقعی که در وضعیت‌های نا امن" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "تصاویر شخصیت‌های واقعی در وضعیت‌های درگیری" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "خشونت شامل شخصیت‌های واقعی" + +#~ msgid "No bloodshed" +#~ msgstr "بدون خون‌ریزی" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "خون‌ریزی غیر واقعی" + +#~ msgid "Realistic bloodshed" +#~ msgstr "خون‌ریزی واقعی" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "تصاویر خون‌ریزی و قطع اعضای بدن" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "تجاوز یا سایر اعمال جنسی خشونت‌آمیز" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "اشاره به نوشیدنی‌های الکلی" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "استفاده از نوشیدنی‌های الکلی" + +#~ msgid "References to illicit drugs" +#~ msgstr "اشاره به مخدرهای غیرقانونی" + +#~ msgid "Use of illicit drugs" +#~ msgstr "استفاده از مخدرهای غیرقانونی" + +#~ msgid "References to tobacco products" +#~ msgstr "اشاره به محصولات تنباکو" + +#~ msgid "Use of tobacco products" +#~ msgstr "استفاده از محصولات تنباکو" + +#~ msgid "Brief artistic nudity" +#~ msgstr "برهنگی هنری و مختصر" + +#~ msgid "Prolonged nudity" +#~ msgstr "برهنگی ممتد" + +#~ msgid "Provocative references or depictions" +#~ msgstr "اشاره و یا تصاویر تحریک‌آمیز" + +#~ msgid "Sexual references or depictions" +#~ msgstr "اشاره یا تصاویر جنسی" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "رفتارهای جنسی گرافیکی" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "استفاده کم یا ملایم از ناسزا" + +#~ msgid "Moderate use of profanity" +#~ msgstr "استفاده متوسط از ناسزا" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "استفاده زیاد یا مکرر از ناسزا" + +#~ msgid "Slapstick humor" +#~ msgstr "شوخی‌های هیجانی" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "شوخی‌های مبتذل" + +#~ msgid "Mature or sexual humor" +#~ msgstr "شوخی‌های جنسی" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "اشاره منفی به گروه خاصی از مردم" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "طراحی خاص برای ایجاد آسیب عاطفی" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "تبعیض آشکار بر اساس جنسیت، نژاد یا دین" + +#~ msgid "Product placement" +#~ msgstr "جایگذاری محصول" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "اشاره‌های واضح به برندهای مشخص یا محصولات دارای نشان تجاری" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "کاربران تشویق می‌شوند اجناسی در دنیای واقعی بخرند" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "شرط‌بندی روی رویداد اتفاقی با استفاده از توکن یا اعتبار" + +#~ msgid "Gambling using “play” money" +#~ msgstr "شرط‌بندی با استفاده از پولِ «بازی»" + +#~ msgid "Gambling using real money" +#~ msgstr "شرط‌بندی با استفاده از پول واقعی" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "کاربران تشویق می‌شوند پول واقعی اعانه کنند" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "امکان خرج کردن پول واقعی در کاره" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "ارتباط بازیکن با بازیکن بدون امکان گپ" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "امکان گپ نظارت‌شده بین کاربران" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "امکان گپ ویدیویی یا صوتی بدون نظارت بین کاربران" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "هم‌رسانی نام‌کاربری شبکه‌های اجتماعی کاربر یا آدرس پست‌های الکترونیکی" + +#~ msgid "Checking for the latest application version" +#~ msgstr "در حال بررسی برای جدیدترین نگارش برنامه" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "هم‌رسانی داده‌های تشخیصی که نمی‌گذارد دیگران، کاربر را شناسایی کنند" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "هم‌رسانی اطّلاعاتی که به دیگران اجازهٔ شناسایی کاربر را می‌دهد" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "هم‌رسانی موقعیت فیزیکی با دیگر کاربران" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "اشاره‌های غیرمستقیم به هم‌جنسگرایی" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "بوسه میان افراد هم‌جنس" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "رفتار جنسی ترسیمی میان افراد هم‌جنس" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "اشاره‌های غیرمستقیم به فاحشگی" + +#~ msgid "Direct references to prostitution" +#~ msgstr "اشاره‌های مستقیم به فاحشگی" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "ترسیم‌های عمل فاحشگی" + +#~ msgid "Indirect references to adultery" +#~ msgstr "اشاره‌های غیرمستقیم به زنا" + +#~ msgid "Direct references to adultery" +#~ msgstr "اشاره‌های مستقیم به زنا" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "ترسیم‌های عمل زنا" + +#~ msgid "Scantily clad human characters" +#~ msgstr "شخصیت‌های انسانی کم‌پوشش" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "شخصیت‌های انسانی آشکارا جنسیت‌زده" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "ترسیم یا اشاره به هتک‌حرمت تاریخی" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "ترسیم هتک‌حرمت انسانی نوین" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "تصویر هتک‌حرمت نوین" + +#~ msgid "Visible dead human remains" +#~ msgstr "بقایای جسد انسانی نمایان" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "جسدهای انسانی در معرض عناصر" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "ترسیم هتک‌حرمت به جسدهای انسان" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "ترسیم یا اشاره به بردگی تاریخی" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "ترسیم بردگی نوین" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "تصویر بردگی نوین" + +#~ msgid "General" +#~ msgstr "عمومی" + +#~ msgid "ALL" +#~ msgstr "همه" + +#~ msgid "Teen" +#~ msgstr "نوجوان" + +#~ msgid "Everyone 10+" +#~ msgstr "هرکسی بالای ۱۰" + +#~ msgid "Everyone" +#~ msgstr "هرکسی" + +#~ msgid "Early Childhood" +#~ msgstr "کودک" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "ناشناس" + +#~ msgid "Released" +#~ msgstr "منتشر شده" + +#~ msgid "Format" +#~ msgstr "قالب" + +#~ msgid "%R" +#~ msgstr "%OH:%OM" + +#~ msgid "%l:%M %p" +#~ msgstr "%Ol:%OM %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "دیروز، %Ol:%OM %p" + +#~ msgid "Three days ago" +#~ msgstr "سه روز پیش" + +#~ msgid "Four days ago" +#~ msgstr "چهار روز پیش" + +#~ msgid "Five days ago" +#~ msgstr "پنج روز پیش" + +#~ msgid "Six days ago" +#~ msgstr "شش روز پیش" + +#~ msgid "Two weeks ago" +#~ msgstr "دو هفته پیش" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "به کار انداختن مخزن افزونه‌های پوستهٔ گنوم" + +#~ msgid "this website" +#~ msgstr "این پایگاه وب" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_بزن بریم خرید" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "برداشته شد" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "مطمئنید می‌خواهید %s را بردارید؟" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "این برنامه باید برای استفاده از افزایه‌های جدید، دوباره شروع شود." + +#~ msgid "Security Updates Pending" +#~ msgstr "به‌روز رسانی‌های امنیتی در انتظار هستند" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "توصیه می‌شود که به‌روز رسانی‌های امنیتی را بلافاصله نصب کنید" + +#~ msgid "Restart & Install" +#~ msgstr "شروع دوباره و نصب" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "به‌روز رسانی‌های مهم سیستم‌عامل و برنامه‌ها برای نصب آماده هستند" + +#~ msgid "View" +#~ msgstr "نمایش" + +#~ msgid "About %s" +#~ msgstr "دربارهٔ %s" + +#~ msgid "%s ME" +#~ msgstr "موتور مدیریت %s" + +#~ msgid "Show the folder management UI" +#~ msgstr "نمایش واسط کاربری مدیریت شاخه" + +#~ msgid "Folder Name" +#~ msgstr "نام شاخه" + +#~ msgid "_Add" +#~ msgstr "_افزودن" + +#~ msgid "Add to Application Folder" +#~ msgstr "افزودن به شاخه برنامه" + +#~ msgid "Extension Settings" +#~ msgstr "تنظیمات افزونه" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it is " +#~ "recommended to disable them." +#~ msgstr "" +#~ "افزونه‌ها را با مسئولیت خودتان استفاده کنید. اگر هر گونه مشکل سیستمی‌ای داشتید، " +#~ "توصیه می‌شود که آنها را غیرفعال کنید." + +#~ msgid "Failed to load components" +#~ msgstr "شکست در بار کردن اجزا" + +#~ msgid "CSS validated OK!" +#~ msgstr "اعتبار CSS تایید شد!" + +#~ msgid "Failed to load file" +#~ msgstr "بارگیری پرونده شکست خورد" + +#~ msgid "Unsaved changes" +#~ msgstr "تغییرات ذخیره نشده" + +#~ msgid "The application list is already loaded." +#~ msgstr "فهرست برنامه‌ها قبلا بارگیری شده است." + +#~ msgid "Merge documents" +#~ msgstr "ادغام سندها" + +#~ msgid "Throw away changes" +#~ msgstr "دور انداختن تغییرات" + +#~ msgid "Open AppStream File" +#~ msgstr "گشودن پروندهٔ AppStream" + +#~ msgid "Save AppStream File" +#~ msgstr "ذخیرهٔ پروندهٔ AppStream" + +#~ msgid "_Save" +#~ msgstr "_ذخیره" + +#~ msgid "%s banner design deleted." +#~ msgstr "طراحی بنر %s حذف شد." + +#~ msgid "Banner design deleted." +#~ msgstr "طراحی بنر حذف شد." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "فهرست برنامه‌ها شامل تغییرات ذخیره نشده است." + +#~ msgid "Use verbose logging" +#~ msgstr "استفاده از ثبت وقایعِ دقیق" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "طراح بنر نرم‌افزارهای گنوم" + +#~ msgid "No Designs" +#~ msgstr "بدون طرح" + +#~ msgid "Error message here" +#~ msgstr "پیام خطا در اینجا" + +#~ msgid "Category Featured" +#~ msgstr "دستهٔ ویژه" + +#~ msgid "Undo" +#~ msgstr "برگردان" + +#~ msgid "Banner Designer" +#~ msgstr "طراح بنر" + +#~ msgid "New Banner" +#~ msgstr "بنر جدید" + +#~ msgid "Import from file" +#~ msgstr "وارد کردن از پرونده" + +#~ msgid "Export to file" +#~ msgstr "صدور به پرونده" + +#~ msgid "Spacing" +#~ msgstr "فاصله‌بندی" + +#~ msgid "The amount of space between children" +#~ msgstr "میزان فاصله بین عناصر" + +#~ msgid "Click on items to select them" +#~ msgstr "برای گزینش موارد، رویشان کلیک کنید" + +#~ msgid "Select" +#~ msgstr "گزینش" + +#~ msgid "_Add to Folder…" +#~ msgstr "_افزودن به شاخه…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_انتقال به شاخه…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_برداشتن از شاخه" + +#~ msgid "Featured Applications" +#~ msgstr "برنامه‌های منتخب" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "طرآحی بیرق‌های ویزه برای نرم‌افزارهای گنوم" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;برنامه;نرم‌افزار;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "افزونه‌های پوسته" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "مخزن افزونه‌های پوستهٔ گنوم" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "بارگیری فرادادهٔ افزونهٔ پوسته…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "افزونهٔ پوستهٔ گنوم" + +#~ msgid "Top Rated" +#~ msgstr "بالاترین رتیه‌ها" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "فهرستی از منابع اضافی که قبلا فعال شده‌اند" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing third-" +#~ "party applications." +#~ msgstr "فهرستی از منابع اضافی که قبلا هنگام نصب برنامه‌های ثالث فعال شده‌اند." + +#~ msgid "Show non-free software in search results" +#~ msgstr "نمایش نرم‌افزارهای غیر آزاد در نتایج جست‌وجوها" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "یک فهرست از منابع غیر آزاد که ممکن است به صورت اختیاری فعال شوند" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_همه" + +#~ msgid "Show profiling information for the service" +#~ msgstr "نمایش اطلاعات کارایی سرویس" + +#~ msgid "To continue you need to sign in." +#~ msgstr "برای ادامه دادن لازم است وارد شوید." + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "برای ادامه دادن لازم است به %s وارد شوید." + +#~ msgid "Email address" +#~ msgstr "آدرس پست‌الکترونیکی" + +#~ msgid "I have an account already" +#~ msgstr "من از قبل حساب دارم" + +#~ msgid "I want to register for an account now" +#~ msgstr "من می‌خواهم برای یک حساب ثبت‌نام کنم" + +#~ msgid "Sign in automatically next time" +#~ msgstr "دفعه آینده بطور خودکار وارد بشو" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "پین یک بار مصرف خود را برای تصدیق‌هویت دو مرحله‌ای وارد کنید." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "تصدیق هویت" + +#~ msgid "Continue" +#~ msgstr "ادامه" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "ارتباط از پیش تعیین شده‌ی بازیکن-با-بازیکن بدون امکان گپ" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "در حال بار کردن فهرست نرم‌افزاری" + +#~ msgid "_About" +#~ msgstr "_درباره" + +#~ msgid "_Quit" +#~ msgstr "_خروج" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "فعال‌سازی منابع نرم‌افزاری تجاری؟" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can play " +#~ "this format can be found on the website." +#~ msgstr "" +#~ "اطلاعات در مورد %s، همچنین گزینه‌هایی در مورد چگونگی دریافت کُدِک که بتواند این " +#~ "قالب را پخش کند را می‌توانید از پایگاه‌وب دریافت کنید." + +#~ msgid "A$%.2f" +#~ msgstr "A$%I.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%I.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%I.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%I.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%I.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%I.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%I.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%I.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$I%.2f" + +#~ msgid "For more information, visit %s." +#~ msgstr "برای اطلاعات بیشتر به %s مراجعه کنید." + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "هیچ برنامه یا افزودنی‌ای نصب نشده است؛ نرم‌افزارهای دیگر هنوز ممکن است باشند" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "به طور معمول در دسترسی یا استفاده از کد منبع محدودیت دارند." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "منابع نرم‌افزاری تجاری" + +#~ msgid "Remove Source" +#~ msgstr "حذف منبع" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you access to " +#~ "additional software that is not provided by %s." +#~ msgstr "" +#~ "منابع نرم‌افزاری می‌توانند از طریق اینترنت دریافت شوند. آنها امکان دسترسی به " +#~ "نرم‌افزارهای بیشتری که %s فراهم نمی‌کند را برای شما فراهم می‌کنند." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from it." +#~ msgstr "" +#~ "پاک کردن یک منبع، تمام نرم‌افزارهایی که از طریق آن نصب کرده‌اید را نیز پاک خواهد " +#~ "کرد." + +#~ msgid "No software installed from this source" +#~ msgstr "هیچ نرم‌افزاری از طریق این منبع نصب نشده است" + +#~ msgid "Installed from this Source" +#~ msgstr "نصب شده از طریق این منبع" + +#~ msgid "Last Checked" +#~ msgstr "آخرین بررسی" + +#~ msgid "Added" +#~ msgstr "اضافه شد" + +#~ msgid "Website" +#~ msgstr "پایگاه‌وب" + +#~ msgid "Downloading new updates…" +#~ msgstr "بارگیری بروزرسانی‌های جدید…" + +#~ msgid "Restart & _Install" +#~ msgstr "راه‌اندازی مجدد و _نصب" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#, fuzzy +#~| msgid "Setting up updates…" +#~ msgid "Getting runtime source…" +#~ msgstr "در حال برپاسازی بروزرسانی‌ها…" + +#~ msgid "Downloading application page…" +#~ msgstr "بارگیری صفحهٔ برنامه…" + +#~ msgid "Total" +#~ msgstr "مجموع" + +#~ msgid "Could not find '%s'" +#~ msgstr "نمی‌توان «%s» را پیدا کرد" + +#~ msgid "Installation of %s failed." +#~ msgstr "نصب %s شکست خورد" + +#~ msgid "Removal of %s failed." +#~ msgstr "حذف %s شکست خورد" + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "لطفا مطمئن شوید که دسترسی به اینترنت دارید و دوباره تلاش کنید." + +#~ msgid "Please free up some space and try again." +#~ msgstr "لطفا کمی فضا خالی کنید و دوباره تلاش کنید." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "اگر باز هم مشکل داشتید، با فراهم کننده نرم‌افزار تماس بگیرید." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "هیچکدام" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "ستاره‌شناسی" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "شیمی" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "ریاضی" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "همه" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "ویژه" + +#~ msgid "Science" +#~ msgstr "علوم" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..c9a0d8f --- /dev/null +++ b/po/fi.po @@ -0,0 +1,8580 @@ +# Finnish translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Lasse Liehu , 2014. +# Jiri Grönroos , 2013, 2014, 2015, 2016, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-26 14:22+0000\n" +"PO-Revision-Date: 2025-02-27 20:57+0200\n" +"Last-Translator: Jiri Grönroos \n" +"Language-Team: suomi \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.4.4\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Ohjelmistot" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Asenna ja päivitä sovellukset" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Ohjelmistot mahdollistaa uusien sovellusten sekä järjestelmälaajennusten " +"löytämisen ja asennuksen sekä nykyisten sovellusten poistamisen." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Ohjelmistot esittelee suosittuja sovelluksia lukuisten kuvakaappausten ja " +"kuvauksen kera. Sovellukset ovat löydettävissä eri luokkia selaamalla tai " +"nimellä etsimällä. Voit myös päivittää järjestelmän offline-päivityksenä." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Yhteenvetosivu" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Tietosivu" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Asennussivu" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Päivityssivu" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Päivityksen tiedot" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Gnome-projekti" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Testaa akmods-avain Shim UEFI:ssa" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Akmods-avaimen testaaminen Shim UEFI:ssa vaatii tunnistautumisen" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Rekisteröi akmods-avain Shim UEFI:iin" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Akmods-avaimen rekisteröinti Shim UEFI:iin vaatii tunnistautumisen" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Testaa DKMS-avain Shim UEFI:ssa" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "DKMS-avaimen testaaminen Shim UEFI:ssa vaatii tunnistautumisen" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Rekisteröi DKMS-avain Shim UEFI:iin" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "DKMS-avaimen rekisteröinti Shim UEFI:iin vaatii tunnistautumisen" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Asenna appstream-tiedosto järjestelmäsijaintiin" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Asennetaan appstream-tiedosto järjestelmäsijaintiin" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Luettelo yhteensopivista projekteista" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Luettelo yhteensopivista projekteista, jotka tulisi näyttää, esim. GNOME, " +"KDE ja XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Hallitaanko päivityksiä ja järjestelmäpäivityksiä Gnomen Ohjelmistot-" +"sovelluksessa" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Jos poistettu käytöstä, Gnomen Ohjelmistot-sovellus piilottaa päivitysosion " +"käyttöliittymästä, ei suorita automaattisia päivityksiä tai ilmoita " +"päivityksistä." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Lataa ja asenna päivitykset automaattisesti" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Jos käytössä, Gnomen ohjelmistokeskus lataa päivitykset automaattisesti " +"taustalla ja asentaa sellaiset päivitykset, jotka eivät vaadi " +"uudelleenkäynnistystä." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Ilmoita käyttäjälle taustalla päivitetyistä ohjelmistoista" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Jos käytössä, Ohjelmistot ilmoittaa käyttäjälle päivityksistä, jotka tehtiin " +"käyttäjän ollen jouten." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Päivitetäänkö ohjelmistotiedot automaattisesti, kun käytössä on käytön " +"mukaan laskutettava yhteys" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Jos käytössä, Ohjelmistot päivittää ohjelmistotiedot automaattisesti " +"taustalla jopa käytön mukaan laskutettavalla yhteydellä (ladaten metadataa, " +"tarkistaen päivityksiä yms. mistä saattaa kertyä maksua käyttäjälle)" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Käynnistetäänkö Gnomen Ohjelmistot ensimmäistä kertaa" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Näytä tähtiarvosanat sovellusten vieressä" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Ei-vapaat sovellukset näyttävät varoituksen ennen asennusta" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Kun ei-vapaita sovelluksia asennetaan, käyttäjälle voidaan näyttää varoitus. " +"Tämä määrittää, jätetäänkö varoitus näyttämättä." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Viimeisimmän päivitystarkistuksen aikaleima" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Viimeisimmän päivitysilmoituksen aikaleima" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Ensimmäisen tietoturvapäivityksen aikaleima, tyhjennetään päivityksen jälkeen" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Viimeisimmän päivityksen aikaleima" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Ikä sekunneissa, jota käytetään vahvistamaan että upstreamin kuvakaappaus on " +"edelleen kelvollinen" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Sovellusarvosteluihin käytettävä palvelin" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Karmapisteiden vähimmäismäärä arvosteluille" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Alle tämän karman olevia arvosteluja ei näytetä." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Luettelo virallisista lähteistä, joita ei tule käsitellä kolmansina " +"osapuolina" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Luettelo vaadituista ohjelmistolähteistä, joita ei voi poistaa käytöstä tai " +"poistaa lainkaan" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Luettelo virallisista lähteistä, jotka tulee käsitellä vapaina ohjelmistoina" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Salli pääsy ohjelmistolähteiden ikkunaan" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Tarjoa esijulkaisujen versiopäivityksiä" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Näytä käyttöliittymäelementtejä, joilla viestitään käyttäjälle ohjelmiston " +"olevan ei-vapaa" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Näytä sovellusten asennettu koko asennettujen sovellusten listassa" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI joka kertoo lisätietoja ei-vapaista ja suljetuista ohjelmistoista" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Asenna AppStream-tiedostot järjestelmäsijaintiin kaikille käyttäjille. Jos " +"epätosi, tiedostot asennetaan epästandardiin kansioon $XDG_DATA_HOME/" +"swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Aseta arvoksi 'true', jos haluat näkyviin vain vapaasti lisensoituja " +"sovelluksia ja piilottaaksesi kaikki omisteiset sovellukset." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Aseta arvoksi 'true', jos haluat näkyviin vain vahvistettujen kehittäjien " +"sovellukset." + +#: data/org.gnome.software.gschema.xml:151 +#, fuzzy +#| msgid "The timestamp of the first security update, cleared after update" +msgid "The timestamp of the last received historical updates." +msgstr "" +"Ensimmäisen tietoturvapäivityksen aikaleima, tyhjennetään päivityksen jälkeen" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Merkkijono, mikä pitää sisällään gnome-online-accountin id:n, jota käytetään " +"kirjautumiseen" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" +"Gnomen Ohjelmistot-sovelluksen järjestelmänlaajuinen AppStream-asennusohjelma" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Komentorivivalitsimien jäsentäminen epäonnistui" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Määritä tasan yksi tiedostonimi" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Tätä ohjelmaa voi käyttää vain root-käyttäjä" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Sisältötyypin validointi epäonnistui: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Siirtäminen epäonnistui: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Ohjelmiston asennus" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Asenna valitut ohjelmistot järjestelmään" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Piirrosväkivalta" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Ei tietoa liittyen piirosmaiseen väkivaltaan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantasianomainen väkivalta" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Ei tietoa liittyen fantasianomaiseen väkivaltaan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistinen väkivalta" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Ei tietoa liittyen realistiseen väkivaltaan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Väkivaltaa kuvaten verilöylyn" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Ei tietoa liittyen verilöylyyn" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Seksuaalinen väkivalta" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Ei tietoa liittyen seksuaaliseen väkivaltaan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkoholi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Ei tietoa liittyen viittauksista alkoholituotteisiin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Huumausaineet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Ei tietoa liittyen viittauksista laittomiin huumausaineisiin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tupakkatuotteet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Ei tietoa liittyen viittauksista tupakkatuotteisiin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Alastomuus" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Ei tietoa liittyen minkäänlaiseen alastomuuteen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Seksuaaliset teemat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Ei tietoa liittyen seksuaalisiin viittauksiin tai kuvauksiin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Kiroilu" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Ei tietoa liittyen minkäänlaiseen kiroiluun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Epäasiallinen huumori" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Ei tietoa liittyen epäasialliseen huumoriin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Syrjintä" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Ei tietoa liittyen minkäänlaiseen syrjivään kieleen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Mainostaminen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Ei tietoa liittyen minkäänlaiseen mainontaan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Uhkapelaaminen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Ei tietoa liittyen minkäänlaiseen uhkapeliin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Ostaminen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Ei tietoa liittyen mahdollisuudesta käyttää oikeaa rahaa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Keskustelu käyttäjien välillä" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" +"Ei tietoa liittyen mahdollisuuteen keskustella muiden käyttäjien kanssa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Äänikeskustelu käyttäjien välillä" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Ei tietoa liittyen mahdollisuudesta puhua muiden käyttäjien kanssa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Yhteystiedot" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Ei tietoa liittyen sosiaalisen median käyttäjätunnusten tai " +"sähköpostiosoitteiden jakamiseen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Tunnistettavat tiedot" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Ei tietoa liittyen käyttäjätiedon jakamisesta kolmansien osapuolten kanssa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Sijainnin jakaminen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Ei tietoa liittyen fyysisen sijainnin jakamisesta muille käyttäjille" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksuaalisuus" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Ei tietoa viittauksista homoseksuaalisuuteen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostituutio" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Ei tietoa liittyen viittauksista prostituutioon" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Haureus" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Ei tietoa liittyen viittauksista haureuteen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Seksualisoidut hahmot" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Ei tietoa liittyen seksualisoituihin hahmoihin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Häpäisy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Ei tietoa liittyen viittauksista häpäisyyn" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Ihmisjäänteet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Ei tietoa liittyen näkyviin kuolleen ihmisen jäännöksiin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Orjuus" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Ei tietoa liittyen viittauksista orjuuteen" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Ei sisällä viittauksia huumausaineisiin" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Ei sisällä kiroilua tai muuta voimasta kielenkäyttöä" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Ei sisällä mainoksia tai maksutapahtumia" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Ei sisällä seksiä tai alastomuutta" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Ei sisällä valvomatonta keskusteluominaisuutta käyttäjien välillä" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Ei sisällä väkivaltaa" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Huumeet" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Voimasta kielenkäyttöä" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Raha" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sosiaalinen" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Väkivalta" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Kaikki" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "Sovelluksen %s ikäraja on tuntematon" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s soveltuu kaikille" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s soveltuu taaperoille" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s soveltuu nuorille lapsille" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s soveltuu lapsille" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s soveltuu teini-ikäisille" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s on aikuisille soveltuva" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s soveltuu %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Ikäraja" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Kuinka lisätä puuttuvat tiedot" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Paikallinen tiedosto" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paketti" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Odottaa" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Odottaa asennusta" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Odottaa poistoa" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Asennetaan" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Poistetaan" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Ladataan" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Asenna" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Poista asennus…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Verkko" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Voi viestiä verkkoa käyttäen" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Järjestelmäpalvelut" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Voi käyttää D-Bus-palveluita järjestelmäväylässä" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Istuntopalvelut" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Voi käyttää D-Bus-palveluita istuntoväylässä" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Laitteet" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Voi käyttää mielivaltaisia laitteita kuten web-kameroita" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Voi käyttää syötelaitteita" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Voi käyttää mikrofoneja ja toistaa ääntä" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Voi käyttää järjestelmälaitetiedostoja" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Näytön sisältö" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Pääsy näytön sisältöön" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Kotikansio" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Voi nähdä, muokata ja luoda tiedostoja" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Voi nähdä tiedostoja" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Tiedostojärjestelmä" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Lataukset-kansio" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Asetukset" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Voi nähdä ja muuttaa mitä tahansa asetuksia" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Vanhennettu ikkunointijärjestelmä" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Käyttää vanhaa ja turvatonta ikkunointijärjestelmää" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Eristyksistä karkaaminen" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Voi paeta hiekkalaatikosta ja kiertää muita rajoituksia" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Päivityksen kuvausta ei ole saatavilla." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Päivityksen tiedot" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Vaatii lisäoikeuksia" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Virheellistä arvosteludataa vastaanotettu palvelimelta" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Yhteyttä arvostelupalvelimeen ei kyetty muodostamaan" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Arvostelut" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Tähän sovellukseen liittyviä arvosteluja ei löytynyt." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Ei arvosteluja" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Versiohistoria" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Uutta versiossa %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versio %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Tästä julkaisusta ei ole saatavilla lisätietoja" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e. %Bta %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Käynnistystila, joko \"updates\", \"updated\", \"installed\" tai \"overview\"" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "TILA" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Etsi sovelluksia" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Näytä sovelluksen tiedot (käyttäen sovelluksen tunnistetta)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Näytä sovelluksen tiedot (käyttäen paketin nimeä)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Asenna sovellus (käyttäen sovelluksen tunnistetta)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Poista sovellus (käyttäen sovelluksen tunnistetta)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Avaa paikallinen pakettitiedosto" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "TIEDOSTONIMI" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Tähän toimintoon odotettu vuorovaikutus: voi olla ‘none’, ‘notify’, tai " +"‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Näytä paikallinen metainfo- tai appdata-tiedosto" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Asentaa odottavat päivitykset taustalla" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Näytä asetukset" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Lopeta käynnissä oleva instanssi" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Näytä versionumero" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Tekijänoikeus © 2016–2023 GNOME Software -kehittäjät" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Jiri Grönroos" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Valitettavasti tästä sovelluksesta ei ole tarkempia tietoja." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Koko asennettuna" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Sisältää %s dataa ja %s välimuistia" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Sisältää %s dataa" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Sisältää %s välimuistia" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Välimuistin ja datan käyttö tuntematon" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Latauksen koko" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Ei vaadi erillisiä järjestelmään liittyviä latauksia" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Tarvitsee tuntemattoman määrän järjestelmään liittyviä latauksia" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Tarvitsee %s järjestelmään liittyviä latauksia" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Koko on tuntematon" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Ei oikeuksia" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "On pääsy verkkoon" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Käyttää järjestelmäpalveluja" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Käyttää istuntopalveluja" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Voi käyttää järjestelmälaitteita" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Voi käyttää järjestelmälaitteita" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Voi lukea/kirjoittaa kaikkea dataasi" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Voit lukea kaikkea dataasi" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Voi lukea/kirjoittaa latauksiasi" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Voi lukea latauksiasi" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Voi käyttää joitain yksittäisiä tiedostoja" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Voi lukea ja muuttaa käyttäjäasetuksia" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Käyttää vanhaa ikkunointijärjestelmää" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Voi hankkia mielivaltaisia oikeuksia" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Ohjelmistokehittäjä on vahvistettu" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Katselmoitu käyttöjärjestelmän valmistajan toimesta" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Katselmoinut %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Kolmannen osapuolen tarjoama" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Ohjelmisto ei ole enää tuettu" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Koodi auditoitavissa" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Tuntematon lisenssi" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Suljettua koodia" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Erikoislisenssi" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Etuoikeutettu" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Turvallinen" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Luultavasti turvallinen" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Mahdollisesti turvaton" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Turvaton" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Vain mobiili" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Toimii vain pienellä näytöllä" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Vain työpöytä" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Toimii vain suurella näytöllä" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Näytön koon yhteensopimattomuus" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Ei tue nykyisen näyttösi kokoa" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Vaatii kosketusnäytön" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Vaatii näppäimistön" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Vaatii hiiren" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Peliohjain on pakollinen" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Pelaaminen vaatii peliohjaimen" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Mukautuva" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Toimii puhelimilla, tableteilla ja työpöydillä" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Vaatii luultavasti näppäimistön tai hiiren" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Toimii pöytätietokoneilla ja kannettavilla" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Ei sisällä ikärajoitusta vaativaa sisältöä" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Ikärajaan liittyviä tietoja ei ole saatavilla" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Käy verkkosivustolla" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Asenna…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Peru" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Asenna" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Lataa" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Päivitä" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Poista asennus…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Poistetaan asennus" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kriittinen päivitys" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Laitetta ei voi käyttää päivityksen aikana." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Lähde: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Aiempi nimi oli %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Lopetti päivitysten vastaanottamisen" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kriittinen päivitys" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Asennettu" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Auta kääntämään %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s on suunniteltu, kehitetty ja käännetty kansainvälisen vapaaehtoisyhteisön " +"toimesta.\n" +"\n" +"Se tarkoittaa, että vaikka sovellus ei vielä ole saatavilla haluamallasi " +"kielellä, voit osallistua ja kääntää ohjelman itse." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Kielikäännökset" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Käännösten verkkosivusto" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Kirjautumisen vaativa etä %s (realm %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Kirjautuminen vaaditaan" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Peru" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Kirjaudu" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Käyttäjä" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Salasana" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Muut" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Kaikki" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Nostot" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Toimituksen valinnat" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Uudet ja päivitetyt" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Poiminnat verkosta" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Muu ohjelmisto" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s asennettu" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Muutosten voimaantulo vaatii uudelleenkäynnistyksen" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Sovellus on valmis käytettäväksi" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Järjestelmäpäivitykset asennettu" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Äskettäin asennetut päivitykset ovat nyt valmiina arvosteltaviksi" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Käynnistä uudelleen" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Käynnistä" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Asennetaanko ohjelmisto?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Asennetaanko kolmannen osapuolen ohjelmisto?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Käytetäänkö ohjelmistolähdettä?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Käytetäänkö kolmannen osapuolen ohjelmistolähdettä?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s ei ole vapaa ja avoin ohjelmisto, eikä sitä ole tarjolla " +"lähteessä “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s on tarjolla lähteestä “%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Tämä ohjelmistolähde tulee ottaa käyttöön, jotta asennusta voidaan jatkaa." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Kohteen %s asennus ja käyttö saattaa olla laitonta joissain maissa." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Tämän koodekin asennus ja käyttö saattaa olla laitonta joissain maissa." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_Älä varoita uudelleen" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "_Käytä ja asenna" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Yksityiskohtaiset virhetiedot pakettihallinnalta:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Tiedot" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Sulje" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Tiedot kopioitu leikepöydälle" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Hyväksy" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Päivitys on asennettu" +msgstr[1] "Päivitykset on asennettu" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Sovellus on poistettu" +msgstr[1] "Sovellukset on poistettu" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Muutoksen voimaan tulemiseksi vaaditaan uudelleenkäynnistys" +msgstr[1] "Muutosten voimaan tulemiseksi vaaditaan uudelleenkäynnistys" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Ei nyt" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Tänään" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Eilen" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d päivä sitten" +msgstr[1] "%d päivää sitten" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d viikko sitten" +msgstr[1] "%d viikkoa sitten" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d kuukausi sitten" +msgstr[1] "%d kuukautta sitten" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d vuosi sitten" +msgstr[1] "%d vuotta sitten" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Juuri nyt" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuutti sitten" +msgstr[1] "%d minuuttia sitten" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d tunti sitten" +msgstr[1] "%d tuntia sitten" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Kaikki" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Nostot" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D-grafiikka" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Valokuvaus" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Kuvanluku" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorigrafiikka" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Katselimet" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Äänen luonti ja muokkaus" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Musiikkisoittimet" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Kaikki" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Nostot" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalenteri" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Tietokanta" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Talous" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Tekstinkäsittely" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Tekstimuokkaimet" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Verkkoselaimet" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Kaikki" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Nostot" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Toimintapelit" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Seikkailupelit" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Pelihallipelit" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Palikkapelit" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Lautapelit" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Korttipelit" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulaattorit" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Lastenpelit" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logiikkapelit" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Roolipelit" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Urheilupelit" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategiapelit" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Kaikki" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Nostot" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Keskustelu" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Kaikki" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Nostot" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Tekoäly" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomia" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kemia" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Kielet" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematiikka" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Uutisryhmät" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotiikka" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Taide" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografia" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Sarjakuvat" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fiktio" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Terveys" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historia" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Elämäntapa" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politiikka" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Urheilu" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Kaikki" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Nostot" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Vianjäljittimet" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Kehitysympäristöt" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Koodekit" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Laitteistoajurit" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Fontit" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Syötelähteet" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Kielipaketit" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalisointi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Luo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Työskentele" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Pelaa" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Ole sosiaalinen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Opi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Kehitä" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Koodekit" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Laitteistoajurit" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Fontit" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Syötelähteet" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Kielipaketit" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalisointi" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Sovellus" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s pyytää lisätukea tiedostomuodolle." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Lisää MIME-tyyppejä vaaditaan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s pyytää lisää fontteja." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Lisäfontteja vaaditaan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s pyytää lisätukea multimediakoodekeille." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Lisää multimediakoodekkeja vaaditaan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s pyytää erillisiä tulostinajureita." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Erillisiä tulostinajureita vaaditaan" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s pyytää lisäpaketteja." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Lisäpaketteja vaaditaan" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Etsi ohjelmistoista" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Näytä lisää" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Näytä _vähemmän" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Poistetaan…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Asennuksen valmistuminen vaatii uudelleenkäynnistyksen" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Poiston valmistuminen vaatii uudelleenkäynnistyksen" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Asennus odottaa…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Päivitys odottaa…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Ladataan…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Valmistellaan…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Poistetaan asennus…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "Sovellusta %s ei ole asennettu, mutta sen dataa on yhä jäljellä." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Käynnistä uudelleen" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Käytä…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Asenna…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "Sovelluksen %s kielenä käytetään amerikanenglantia" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Tämän sovelluksen kielenä käytetään amerikanenglantia" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Tämän sovelluksen kielenä käytetään amerikanenglantia" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Auta _kielikäännöksissä" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Muut kehittäjän %s sovellukset" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Kehittäjä %s on vahvistanut sovelluksen %s omistajuuden" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Kehittäjä on vahvistanut sovelluksen %s omistajuuden" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Arvostelun kirjoittaminen vaatii internetyhteyden" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Tämä sovellus ei enää saa päivityksiä, ei edes tietoturvapäivityksiä" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Tämä sovellus sisältyy jo käyttämääsi jakeluun, eikä sitä tulisi korvata." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Tämä sovellus ei tarjoa linkkejä verkkosivustolle, koodin tietovarastoon tai " +"vianseurantajärjestelmään." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Tämä ohjelmisto ei enää saa päivityksiä, ei edes tietoturvapäivityksiä" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Tämä ohjelmisto sisältyy jo käyttämääsi jakeluun, eikä sitä tulisi korvata." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Tämä ohjelmisto ei tarjoa linkkejä verkkosivustolle, koodin tietovarastoon " +"tai vianseurantajärjestelmään." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Ohjelmistot ei kyennyt noutamaan tietoja sovelluksesta “%s”, eikä pysty " +"näyttämään kyseisen sovelluksen tietoja." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Virheellinen arviovastaus vastaanotettu palvelimelta" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Sovelluksen “%s” arvostelun lähettäminen epäonnistui: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Tietosivu" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Ladataan sovelluksen tietoja" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Vahvistettu" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Avaa" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Päivitä" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Poista asennus" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Lisäosat" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Tätä sovellusta voi käyttää ainoastaan internetyhteyden ollessa muodostettu." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Ohjelmistolähde sisällytetty" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Tämä sovellus sisältää ohjelmistolähteen, jonka kautta on saatavilla " +"päivityksiä ja mahdollisesti myös muita ohjelmistoja." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Ohjelmistolähdettä ei ole sisällytetty" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Tämä sovellus ei sisällä ohjelmistolähdettä. Sovellusta ei päivitetä " +"uudempiin versioihin." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Ohjelmistolähde tunnistettu" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Tämän ohjelmistolähteen lisääminen tarjoaa lisää ohjelmistoja ja päivityksiä." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Käytä vain ohjelmistolähteitä, joihin luotat." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Tyhjennä sovelluksen data" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Poista _data" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Ei metatietoja" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Projektin sivusto" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Lahjoita" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Osallistu k_äännöksiin" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Ilmoita ongelmasta" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Ohje" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Ota yhteys" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Kirjoita arvostelu" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Kaikki arvostelut" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Sovelluksen tietoja ei voi näyttää" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Uudelleenkäynnistyksen valmistelu epäonnistui" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Tuntematon virhe" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Avainta ei löytynyt" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Avainta ei ole rekisteröity" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK-rekisteröinti vaaditaan" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Seuraava" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Laitteessa on Secure Boot käytössä. Jotta uuden ajurin käyttöönotto " +"sallitaan, uusi koneomistaja-avain (MOK) tulee rekisteröidä. Toimenpide " +"vaatii salasanan kirjoittamista myöhemmässä vaiheessa. Ota talteen seuraava " +"avaimeen liittyvä salasana:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Minulla on _MOK-salasana tallessa" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Käynnistä uudelleen ja rekisteröi…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Määritysohjeet: lue tarkasti" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Uudelleenkäynnistyksen jälkeen laitteen määritysruutu näytetään. Ota uudet " +"ajurit käyttöön seuraavasti:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Valitse “Enroll MOK”\n" +"• Valitse “Yes” rekisteröidäksesi avaimet\n" +"• Kirjoita MOK-salasana, kun sitä pyydetään\n" +"• Valitse “Reboot”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Seuraamukset tietoturvalle" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Avaimen rekisteröinnin jälkeen kaikki tulevat päivitykset moduuliin tai " +"mihin tahansa muuhun moduuliin ovat luotettuja. Tulevat päivitykset " +"tapahtuvat läpinäkyvästi ilman vuorovaikutusta tai valtuutuksen tarvetta." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Lisäohjeita on dokumentaatiosivulla." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Ladataan ylimääräisiä metadatatiedostoja…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " ja " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Saatavilla olevat fontit \"%s\"-skriptille" +msgstr[1] "Saatavilla olevat fontit \"%s\"-skripteille" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Saatavilla olevat ohjelmistot - %s" +msgstr[1] "Saatavilla olevat ohjelmistot - %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Pyydettyä ohjelmistoa ei löytynyt" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Pyydettyä ohjelmistoa ei löytynyt" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "Kohdetta %s ei löydy" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "verkkosivustolla" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Tiedostoa %s tarjoavaa sovellusta ei ole saatavilla." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Tietoja kohteesta %s, ja ohjeita kuinka saada puuttuvat sovellukset, saattaa " +"olla tarjolla %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Sovelluksia \"%s\"-tuen tarjoamiseksi ei ole saatavilla." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s ei ole saatavilla." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Tietoja kohteesta %s, ja ohjeita kuinka saada tätä tiedostomuotoa tukeva " +"sovellus, saattaa olla tarjolla %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Fontteja ei ole saatavilla \"%s\"-skriptituen tarjoamiseksi." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Tietoja kohteesta %s, ja ohjeita kuinka saada lisäfontteja, saattaa olla " +"tarjolla tällä %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s-muotoa varten ei ole lisäkoodekkeja saatavilla." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Tietoja kohteesta %s, ja ohjeita kuinka saada tätä tiedostomuotoa tukeva " +"koodekki, saattaa olla tarjolla tällä %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Plasma-resursseja ei ole saatavilla \"%s\"-tuen tarjoamiseksi." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Tietoja kohteesta %s, ja ohjeita kuinka saada lisää Plasma-resursseja, " +"saattaa olla tarjolla tällä %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Tulostinajureita ei ole saatavilla tulostimelle %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Tietoja kohteesta %s, ja ohjeita kuinka saada tätä tulostinta tukeva ajuri, " +"saattaa olla tarjolla tällä %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentaatiosta" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Valitettavasti koodekkia %s, jota pyysi sovellus %s, ei löydy. Katso " +"lisätietoja %s." +msgstr[1] "" +"Valitettavasti koodekkeja %s, joita pyysi sovellus %s, ei löydy. Katso " +"lisätietoja %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Valitettavasti etsimääsi koodekkia %s ei löydy. Katso lisätietoja %s." +msgstr[1] "" +"Valitettavasti etsimiäsi koodekkeja %s ei löydy. Katso lisätietoja %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Hakutuloksia ei löytynyt: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s-tiedostomuoto" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Asenna _kaikki" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Pyydettyä ohjelmistoa ei löydy" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Koodekin sivu" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Tuloksia ei löytynyt" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Hakua ei voi suorittaa" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Edellinen" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Seuraava" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Nostettujen sovellusten luettelo" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Työpöytätuki" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Tukee suurella näytöllä käyttöä" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Työpöytätuki tuntematon" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Ei riittävästi tietoa suurten näyttöjen tuen osalta" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Vaatii suuren näytön" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Työpöytä ei ole tuettu" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Ei voi käyttää suurella näytöllä" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobiilituki" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Tukee käyttöä pienellä näytöllä" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobiilituki tuntematon" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Ei riittävästi tietoa pienten näyttöjen tuen osalta" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Vaatii pienen näytön" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobiili ei tuettu" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Ei voi käyttää pienellä näytöllä" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Näppäimistötuki" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Näppäimistötuki tuntematon" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Ei riittävästi tietoa näppäimistötuen osalta" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Näppäimistö on pakollinen" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Tukee näppäimistöjä" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Näppäimistö ei ole tuettu" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Ei voi käyttää näppäimistöllä" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Hiirituki" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Vaatii hiiren tai osoitinlaitteen" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Hiirituki tuntematon" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "Ei riittävästi tietoa hiiren ja osoitinlaitteiden tuen osalta" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Hiiri on pakollinen" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Tukee hiirtä ja osoitinlaitteita" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Hiiri ei ole tuettu" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Ei voi käyttää hiirellä tai osoitinlaitteella" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Kosketusnäytön tuki" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Kosketusnäytön tuki tuntematon" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Ei riittävästi tietoa kosketusnäyttöjen tuen osalta" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Kosketusnäyttö on pakollinen" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Tukee kosketusnäyttöjä" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Kosketusnäyttö ei ole tuettu" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Ei voi käyttää kosketusnäytöllä" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Peliohjain on pakollinen" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Vaatii peliohjaimen" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Peliohjaintuki" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Tukee peliohjaimia" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s toimii luultavasti tällä laitteella" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s toimii tällä laitteella" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s toimii luultavasti tällä laitteella" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s ei luultavasti toimi tällä laitteella" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s ei toimi tällä laitteella" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Laitetuki" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Liikkuminen" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Siirry Tutki-sivulle" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Siirry Asennetut-sivulle" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Siirry Päivitykset-sivulle" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Avaa hakupalkki" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Ikkunat" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Avaa asetukset" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Avaa ohjelmistolähteet" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Ohje" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Avaa pikanäppäimet" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Asennettu" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Asennussivu" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Meneillään" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Sovellukset" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Web App -sovellukset" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Järjestelmäsovellukset" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Yhteisön tekemä" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Osallistu" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tätä sovellusta kehitetään avoimesti vapaaehtoisen yhteisön toimesta, ja se " +"on julkaistu lisenssillä %s.\n" +"\n" +"Voit osallistua ja tehdä sovelluksesta entistä paremman." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tätä sovellusta kehitetään avoimesti vapaaehtoisen yhteisön toimesta, ja se " +"on julkaistu lisenssillä %s.\n" +"\n" +"Voit osallistua ja tehdä sovelluksesta entistä paremman." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tätä ohjelmistoa kehitetään avoimesti vapaaehtoisen yhteisön toimesta, ja se " +"on julkaistu lisenssillä %s.\n" +"\n" +"Voit osallistua ja tehdä ohjelmistosta entistä paremman." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tätä ohjelmistoa kehitetään avoimesti vapaaehtoisen yhteisön toimesta, ja se " +"on julkaistu lisenssillä %s.\n" +"\n" +"Voit osallistua ja tehdä ohjelmistosta entistä paremman." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Tuntematon lisenssi" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Lue lisää" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Tämä sovellus ei määritä, mitä lisenssiä se käyttää, joten se saattaa olla " +"suljettu (omisteinen). Sovellus saattaa muuttua yllättäen, ja tietoturvan " +"tason määrittäminen on vaikeaa.\n" +"\n" +"Sovelluksen kehittämiseen osallistumisesta ei ole varmuutta." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tämä ohjelmisto ei määritä, mitä lisenssiä se käyttää, joten se saattaa olla " +"suljettu (omisteinen). Ohjelmisto saattaa muuttua yllättäen, ja tietoturvan " +"tason määrittäminen on vaikeaa.\n" +"\n" +"Ohjelmiston kehittämiseen osallistumisesta ei ole varmuutta." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Suljettu" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Tätä sovellusta ei kehitetä avoimesti, joten vain sovelluksen kehittäjät " +"tietävät miten se toimii. Sovellus saattaa muuttua yllättäen, ja tietoturvan " +"tason määrittäminen on vaikeaa.\n" +"\n" +"Et välttämättä voi osallistua tai vaikuttaa sovelluksen kehittämiseen." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Tätä ohjelmistoa ei kehitetä avoimesti, joten vain ohjelman kehittäjät " +"tietävät miten se toimii. Ohjelma saattaa muuttua yllättäen, ja tietoturvan " +"tason määrittäminen on vaikeaa.\n" +"\n" +"Et välttämättä voi osallistua tai vaikuttaa ohjelmiston kehittämiseen." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Erikoislisenssi" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Tätä sovellusta kehitetään erikoislisenssin %s alaisena.\n" +"\n" +"Sovelluksen kehittämiseen osallistumisesta ei ole varmuutta." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Tätä sovellusta kehitetään erikoislisenssin “%s” alaisena.\n" +"\n" +"Sovelluksen kehittämiseen osallistumisesta ei ole varmuutta." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tätä ohjelmistoa kehitetään erikoislisenssin %s " +"alaisena.\n" +"\n" +"Ohjelmiston kehittämiseen osallistumisesta ei ole varmuutta." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tätä ohjelmistoa kehitetään erikoislisenssin “%s” alaisena.\n" +"\n" +"Ohjelmiston kehittämiseen osallistumisesta ei ole varmuutta." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Päivitetään tietoja" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Ladataan sivua" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Käynnistetään" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Tuntematon lähde" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beeta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Käyttäjä" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Lisäykset" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Poistot" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Päivitykset" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Version muutokset alempaan" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "valituista ulkoisista lähteistä" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Tarjoaa enemmän ohjelmistoja %s. Sisältää joitain suljettuja ohjelmistoja.\n" +"\n" +"Voit ottaa kyseiset ohjelmistolähteet myöhemmin käyttöön asetuksissa." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Käytetäänkö kolmansien osapuolten ohjelmistolähteitä?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Hylkää" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Käytä" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Saatavilla käyttöjärjestelmällesi" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Saatavilla jakelulle %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Tutki" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Yhteenvetosivu" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Saatavilla olevat sovellukset" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Muut luokat" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Sovellustietoja ei löytynyt" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Tuntematon" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Käyttäjä kieltäytyi asennuksesta" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Valmistele %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Poistetaanko ohjelmistolähde %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Kaikki sovellukset lähteestä %s poistetaan. Käyttääksesi kyseisiä " +"ohjelmistoja uudelleen, tulee ohjelmistolähde asentaa uudelleen." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Poistetaanko %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Sovellusta %s ei voi käyttää, kun se on poistettu." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Sovelluksia, joiden riippuvuus %s on, ei välttämättä pysty enää käyttämään " +"poistamisen jälkeen." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Fonttia %s ei voi käyttää, kun se on poistettu. Kaikki kyseistä fonttia " +"käyttävät asiakirjat näytetään jollain muulla fontilla." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Koodekkia %s ei voi käyttää, kun se on poistettu. Jotkin mediatiedostot " +"eivät välttämättä ole enää toistettavissa." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Laiteohjelmistosta %s riippuvainen laitteisto ei välttämättä enää toimi " +"oikein irrottamisen jälkeen." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Sovellusta %s ei voi käyttää, kun se on poistettu. Sovelluksen data ja " +"asetukset säilytetään levyllä, jotta sovellus on mahdollista palauttaa " +"myöhemmin." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Asetukset" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Ohjelmistopäivitykset" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Lisätietoja" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Päivitysten tarkistaminen ja lataaminen käyttää dataa sekä virtaa. " +"Automaattiset päivitysominaisuudet ovat sen vuoksi keskeytetty, kun " +"verkkoyhteys on käytön mukaan laskutettava tai virransäästötila on käytössä." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automaattinen" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Tarkista ja lataa päivitykset automaattisesti" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manuaalinen" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Päivitysten tarkistaminen ja lataaminen tulee tehdä manuaalisesti" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Automaattisen päivityksen _ilmoitukset" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Näytä ilmoitus, kun päivitykset on asennettu automaattisesti" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Sisältösuodattimet" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Näytä vain _vapaat ohjelmistot" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Piilota omisteiset ohjelmistot selatessa ja hakiessa" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Näytä vain va_hvistetut kehittäjät" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Näytä vain sovellukset, joiden omistajien identiteetti on vahvistettu" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Asennettu ohjelmisto ei ole yhteensopiva käyttöjärjestelmän %s kanssa, ja se " +"poistetaan järjestelmäpäivityksen yhteydessä." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Yhteensopimaton ohjelmisto" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Suorita järjestelmäpäivitys" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Poista asennus" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Sovelluksen asetukset ja data" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Säilytä" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Mahdollistaa sovelluksen asetusten ja sisällön palauttamisen" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Poista" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Poistaa pysyvästi datan levytilan vapauttamiseksi" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Ohjelmisto, joka on asennettu ohjelmistolähteestä “%s”, ei saa enää " +"minkäänlaisia päivityksiä." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Poistetaanko ohjelmistolähde käytöstä?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Poistetaanko ohjelmistolähde kokonaan?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Poista käytöstä" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Poista" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Ota uudet ohjelmistolähteet käyttöön" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Ota uudet ohjelmistolähteet käyttöön lisäämisen myötä" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "lisätietoja" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Lisää ohjelmistolähteitä valituilta kolmansilta osapuolilta — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedoran kolmansien osapuolten ohjelmistolähteet" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "käyttöjärjestelmä" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Nämä ohjelmistolähteet täydentävät oletusohjelmistovalikoimaa, jota %s " +"tarjoaa." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Ohjelmistolähteet" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Ei ohjelmistolähteitä" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u sovellus asennettu" +msgstr[1] "%u sovellusta asennettu" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u lisäosa asennettu" +msgstr[1] "%u lisäosaa asennettu" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u sovellus" +msgstr[1] "%u sovellusta" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u lisäosa" +msgstr[1] "%u lisäosaa" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s ja %s asennettu" +msgstr[1] "%s ja %s asennettu" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Tarkistetaan asennettuja ohjelmistoja…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Poista" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "En tykkää lainkaan" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "En tykkää erityisemmin" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Ihan OK" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Tykkään siitä" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Tykkään siitä todella paljon" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Valitse tähti jättääksesi arvion" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Käytä hieman enemmän aikaa arvostelun kirjoittamiseen" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Valitse tähtimäärä" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Yhteenveto on liian lyhyt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Yhteenveto on liian pitkä" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Kuvaus on liian lyhyt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Kuvaus on liian pitkä" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Kirjoita arvostelu" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Lähetä" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Anna arvio, yhteenveto ja arvosteluteksti. Arvosteluissa ei ole tarkoitus " +"ilmoittaa ongelmista. Jos kohtaat ongelmia, ilmoita niistä kehittäjälle tai " +"tukipalveluja tarjoavalle taholle." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Arvostelun yhteenveto" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Kirjoita lyhyt arvostelu" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Katso mitä tietoja lähetetään lukemalla tietosuojakäytäntömme. Tiliisi yhdistetty koko nimi näytetään " +"julkisesti." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u arvostelu yhteensä" +msgstr[1] "%u arvostelua yhteensä" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "/ 5 tähdestä" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Tuntematon" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Voit ilmoittaa loukkaavista, epäkohteliaista ja syrjivistä arvosteluista." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Ilmoituksen jälkeen se piilotetaan, kunnes ylläpitäjä tarkistaa arvostelun." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Haluatko tehdä ilmoituksen arvostelusta?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Ilmoita" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Poistetaanko arvostelu?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Arvostelun poistamista ei voi perua." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Tykkään tästä arvostelusta" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "En tykkää tästä arvostelusta" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Ilmoita…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Poista…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Sovellus ei ole eristetty, mutta käyttämäsi jakelu on tarkistanut, ettei " +"sovellus ole haitallinen" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Varmista että luotat toimittajaan, sillä sovellus ei ole eristetty" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Ei oikeuksia" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Sovellus on täysin eristetty" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Verkon käyttö" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Voi yhdistää internetiin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Ei pääsyä verkkoa" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Ei pääsyä internetiin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Käyttää järjestelmäpalveluja" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Voi pyytää dataa järjestelmäpalveluilta" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Käyttää istuntopalveluja" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Voi pyytää dataa istuntopalveluilta" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Pääsy käyttäjälaitteisiin" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Voi käyttää laitteita kuten web-kameroita ja peliohjaimia" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Ei pääsyä käyttäjälaitteisiin" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Ei voi käyttää laitteita kuten web-kameroita ja peliohjaimia" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Pääsy syötelaitteisiin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Mikrofonin käyttö ja äänen toisto" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Voi kuunnella mikrofonia käyttäen ja toistaa ääntä ilman luvan kysymistä" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Pääsy järjestelmälaitteisiin" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Voi käyttää järjestelmälaitteita, jotka vaativat korotettuja käyttöoikeuksia" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Pääsy näytön sisältöön" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Pääsy näytön tai ikkunoiden sisältöön" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Vanha ikkunointijärjestelmä" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Mielivaltaiset oikeudet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Käyttäjäasetukset" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Täysi luku-/kirjoitusoikeus tiedostojärjestelmään" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "" +"Voi lukea kaikkea tiedostojärjestelmän dataa ja kirjoittaa " +"tiedostojärjestelmään" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Luku-/kirjoitusoikeus kotikansioon" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "" +"Voi lukea kaikkea kotikansiossasi olevaa sisältöä ja kirjoittaa kotikansioon" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Täysi lukuoikeus tiedostojärjestelmään" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Voi lukea kaiken tiedostojärjestelmän sisällön" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Kotikansion lukuoikeus" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Voi lukea kaiken kotikansion sisällön" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Luku-/kirjoitusoikeus Lataukset-kansioon" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Voi lukea Lataukset-kansion sisällön ja kirjoittaa kyseiseen kansioon" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Lukuoikeus Lataukset-kansioon" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Voi lukea Lataukset-kansion kaiken sisällön" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Voi lukea kaikkea kansiossa olevaa sisältöä ja kirjoittaa kansioon" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Voi lukea kaiken kansion sisällön" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Ei pääsyä tiedostojärjestelmään" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Ei lainkaan pääsyä tiedostojärjestelmään" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Sovelluksen kehittäjä on vahvistettu" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Sovelluksen kehittäjän on vahvistettu olevan se, joka väittää olevansa" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Turvattomia riippuvuuksia" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Ohjelmisto tai sen riippuvuudet eivät ole enää tuettuja, ja ne saattavat " +"olla tietoturvattomia" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Tämä sovellus ei määritä, minkä lisenssin ehtojen mukaisesti sitä " +"kehitetään, ja saattaa olla suljettu" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Tämä ohjelmisto ei määritä, minkä lisenssin ehtojen mukaisesti sitä " +"kehitetään, ja saattaa olla suljettu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Suljettua koodia" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Lähdekoodi ei ole julkista, joten sitä ei voi itsenäisesti auditoida, ja " +"koodi voi olla turvatonta" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Tätä sovellusta kehitetään erikoislisenssin “%s” alaisena" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Tätä ohjelmistoa kehitetään erikoislisenssin “%s” alaisena" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Koodi auditoitavissa" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Lähdekoodi on julkista ja itsenäisesti auditoitavissa, sovellus on " +"todennäköisesti turvallinen" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s on etuoikeutettu" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s on turvallinen" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s on luultavasti turvallinen" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s on mahdollisesti turvaton" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s on turvaton" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Tuntematon" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Turvallisuus" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Lisenssi" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Lähde" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Tämä sovellus käyttää vanhentunutta ohjelmistokehityspakettia (SDK), ja se " +"saattaa sisältää bugeja ja tietoturvahaavoittuvuuksia, joita ei korjata." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Edellinen kuvakaappaus" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Seuraava kuvakaappaus" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Ei kuvakaappauksia" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Kuvakaappausta ei löytynyt" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Kuvan lataaminen epäonnistui" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Kuvakaappauksen kokoa ei löytynyt" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Välimuistin luominen ei onnistunut" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Kuvakaappaus on virheellinen" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Kuvakaappausta ei ole saataville" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Kuvakaappaus" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u tulos lisää" +msgstr[1] "%u tulosta lisää" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Hakusivu" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Etsi sovelluksia" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Sovellusta ei löytynyt" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Päivitysten lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Laiteohjelmistopäivitysten lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Laiteohjelmistopäivitysten lataaminen lähteestä %s ei onnistu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Päivitysten lataaminen lähteestä %s epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Päivitys ei onnistu: internetyhteys vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Päivitys ei onnistu: ei riittävästi levytilaa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Päivitysten lataaminen lähteestä %s epäonnistui: levytilaa ei ole riittävästi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Päivitys ei onnistu: tunnistautuminen vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Päivitys ei onnistu: tunnistautuminen oli virheellinen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Päivitys ei onnistu: oikeus vaaditaan" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Päivitysten lataaminen epäonnistui: käyttöoikeutesi eivät riitä " +"ohjelmistojen asentamiseen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Päivitysluettelon noutaminen epäonnistui" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Asennus ei onnistu: lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Sovelluksen %s asennus ei onnistu: lataaminen lähteestä %s epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Ei voi asentaa %s: lataaminen epäonnistui" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Asennus ei onnistu: runtime-kirjasto puuttuu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "" +"Sovelluksen %s asennus ei onnistu: runtime-kirjasto %s ei ole saatavilla" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Sovelluksen %s asennus epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Asennus ei onnistu: internetyhteys vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Asennus ei onnistu: virheellinen sovellusmuoto" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Asennus ei onnistu: ei riittävästi levytilaa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Ei voi asentaa %s: ei riittävästi levytilaa" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Asennus ei onnistu: tunnistautuminen vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Ei voi asentaa %s: tunnistautuminen vaaditaan" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Asennus ei onnistu: tunnistautuminen oli virheellinen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Ei voi asentaa %s: tunnistautuminen oli virheellinen" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Asennus ei onnistu: oikeus vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Ei voi asentaa %s: oikeus vaaditaan" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Asennus ei onnistu: laitteen tulee olla kytketty verkkovirtaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Ei voi asentaa %s: laitteen tulee olla kytketty verkkovirtaan" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Asennus ei onnistu: akun virta on vähissä" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Ei voi asentaa %s: akun virta on vähissä" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "" +"Sovelluksen %s päivittäminen lähteestä %s ei onnistu: lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Ei voi päivittää %s: lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Päivitysten asentaminen lähteestä %s ei onnistu: lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Päivitys ei onnistu: lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Ei voi päivittää %s: ei riittävästi levytilaa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Ei voi päivittää %s: tunnistautuminen vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Ei voi päivittää %s: tunnistautuminen oli virheellinen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Ei voi päivittää %s: oikeus vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Päivitys ei onnistu: laitteen tulee olla kytketty verkkovirtaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Ei voi päivittää %s: laitteen tulee olla kytketty verkkovirtaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Päivitys ei onnistu: akun virta on vähissä" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Ei voi päivittää %s: akun virta on vähissä" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Sovelluksen %s päivitys epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Päivittäminen ei onnistu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Versiopäivitys ei onnistu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Järjestelmäpäivitys %s lähteestä %s epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Versiopäivitys ei onnistu: lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Järjestelmäpäivitys %s ei onnistu: lataaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Versiopäivitys ei onnistu: internetyhteys vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Järjestelmäpäivitys %s ei onnistu: internetyhteys vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Versiopäivitys ei onnistu: ei riittävästi levytilaa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Järjestelmäpäivitys %s ei onnistu: ei riittävästi levytilaa" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Versiopäivitys ei onnistu: tunnistautuminen vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Järjestelmäpäivitys %s ei onnistu: tunnistautuminen vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Versiopäivitys ei onnistu: tunnistautuminen oli virheellinen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Järjestelmäpäivitys %s ei onnistu: tunnistautuminen oli virheellinen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Versiopäivitys ei onnistu: oikeus vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Järjestelmäpäivitys %s ei onnistu: oikeus vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Versiopäivitys ei onnistu: laitteen tulee olla kytketty verkkovirtaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Järjestelmäpäivitys %s ei onnistu: laitteen tulee olla kytketty verkkovirtaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Versiopäivitys ei onnistu: akun virta on vähissä" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Järjestelmäpäivitys %s ei onnistu: akun virta on vähissä" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Järjestelmäpäivitys %s epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Poistaminen ei onnistu: tunnistautuminen vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Ei voi poistaa %s: tunnistautuminen vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Ei voi poistaa: tunnistautuminen oli virheellinen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Ei voi poistaa %s: tunnistautuminen oli virheellinen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Poistaminen ei onnistu: oikeus vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Ei voi poistaa %s: oikeus vaaditaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Poistaminen ei onnistu: laitteen tulee olla kytketty verkkovirtaan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Ei voi poistaa %s: laitteen tulee olla kytketty verkkovirtaan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Poistaminen ei onnistu: akun virta on vähissä" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Ei voi poistaa %s: akun virta on vähissä" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Sovelluksen %s asennuksen poistaminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Ei voitu käynnistää %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1940 +msgid "Sorry, something went wrong" +msgstr "Valitettavasti jokin meni pieleen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Sovelluksen %s käynnistäminen epäonnistui: %s ei ole asennettu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1920 +msgid "Not enough disk space for operation" +msgstr "Levytilaa ei ole riittävästi tätä toimenpidettä varten" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Asennus ei onnistu: tiedostotyyppi ei ole tuettu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Asennus ei onnistu: tunnistautuminen epäonnistui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Asennus ei onnistu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Yhteys kohteeseen %s ei onnistu" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1924 +msgid "Restart Software to use new plugins" +msgstr "" +"Ohjelmisto tulee käynnistää uudelleen, jotta uudet liitännäiset ovat " +"käytettävissä" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1928 +msgid "Device needs to be plugged in" +msgstr "Laitteen tulee olla kytketty verkkovirtaan" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1931 +msgid "Battery level is too low" +msgstr "Akussa ei ole riittävästi virtaa" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Ohjelmistolähteet" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Asetukset" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Pikanäppäimet" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Tietoja - Ohjelmistot" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Etsi" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Päävalikko" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Etsi sovelluksia" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Tutki" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Asennetut" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Päivitykset" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Takaisin" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ei mitään" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Sovelluksen data" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Sovelluksen suorittamiseen vaadittava data" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Käyttäjän data" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Sovelluksessa luomasi data" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Välimuistin data" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Väliaikaisesti välimuistissa oleva data" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Itse sovellus" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Vaaditut riippuvuudet" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Tämän sovelluksen vaatimat jaetut järjestelmäkomponentit" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Tuntematon" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Välimuistissa olevat tiedot voi tyhjentää _sovelluksen " +"asetuksista" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Tallennustila" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Asennettu)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Asennetaan)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Ladataan)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Poistetaan)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Tiedot" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Tutki" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Asennettu %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Asennetut päivitykset" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Päivityksiä ei asennettu" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Päivitykset eivät ole ajan tasalla" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Tarkista saatavilla olevat ohjelmistopäivitykset" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Kriittisiä ohjelmistopäivityksiä valmiina asennettavaksi" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Asenna kriittiset päivitykset mahdollisimman pian" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Kriittisiä ohjelmistopäivityksiä valmiina ladattavaksi" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Lataa kriittiset päivitykset mahdollisimman pian" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Päivitykset valmiit asennettavaksi" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Ohjelmistopäivitykset odottavat asennusta" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Päivityksiä valmiina ladattavaksi" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Ohjelmistopäivityksia on ladattavissa" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u sovellus päivitetty — Uudelleenkäynnistys vaaditaan" +msgstr[1] "%u sovellusta päivitetty — Uudelleenkäynnistys vaaditaan" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u sovellus päivitetty" +msgstr[1] "%u sovellusta päivitetty" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s on päivitetty." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Käynnistä sovellus uudelleen." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s ja %s on päivitetty." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u sovellus vaatii uudelleenkäynnistyksen." +msgstr[1] "%u sovellusta vaatii uudelleenkäynnistyksen." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Mukaan lukien %s, %s ja %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Järjestelmän elinkaari on tullut päätökseen" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "" +"Päivitä käyttöjärjestelmä uudempaan versioon saadaksesi tietoturvapäivityksiä" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Uusi \"%s\"-versio on saatavilla asennusta varten" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Ohjelmistopäivitys saatavilla" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Ohjelmistopäivitykset epäonnistuivat" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Valmisteltuja päivityksiä ei asennettu" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Näytä tiedot" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Järjestelmän versiopäivitys valmistui" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Tervetuloa, käytössäsi on %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Ohjelmistopäivitys asennettu" +msgstr[1] "Ohjelmistopäivitykset asennettu" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Tärkeä käyttöjärjestelmän päivitys asennettiin." +msgstr[1] "Tärkeitä käyttöjärjestelmän päivityksiä asennettiin." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Tarkastele" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Päivitys epäonnistui" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Järjestelmä oli jo ajan tasalla." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Päivitys peruttiin." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Internetyhteys vaadittiin, mutta sitä ei ollut saatavilla. Varmista, että " +"yhteys toimii ja yritä uudelleen." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Päivityksen kanssa ilmeni tietoturvaongelmia. Ota yhteys ohjelmistojen " +"tarjoajaan saadaksesi lisätietoja." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Levytilaa ei ollut riittävästi. Vapauta levytilaa ja yritä uudelleen." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Valitettavasti päivityksen asentaminen epäonnistui. Odota toista päivitystä " +"ja yritä uudelleen. Jos ongelma jatkuu, ota yhteys ohjelmistojen tarjoajaan." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Viimeksi tarkistettu: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Pysäytä" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Tarkista päivitykset" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ei saa enää tärkeitä ohjelmistopäivityksiä" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Käyttöjärjestelmäsi ei enää saa tärkeitä ohjelmistopäivityksiä" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Saattaa aiheuttaa kuluja" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Päivitysten tarkistaminen mobiilidatayhteydellä saattaa aiheuttaa suuren " +"laskun." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Tarkista _silti" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Ohjelmistojen versiopäivitykset ladattu" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Päivitykset ovat valmiina asennettavaksi" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Tarkista päivitykset" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Päivitykset" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Päivityssivu" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Ladataan päivityksiä" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Tämä saattaa kestää hetken" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Ajan tasalla" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Käytätkö mobiilidataa?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Päivitysten tarkistaminen mobiilidatayhteydellä saattaa aiheuttaa yllättäviä " +"kuluja" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Tarkista silti" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Ei yhteyttä" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Yhdistä verkkoon tarkistaaksesi päivitykset" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Verkkoasetukset" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Virhe" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Päivityksiä hallitaan automaattisesti" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Ohjelmistopäivitykset keskeytetty" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automaattiset ohjelmistopäivitykset on keskeytetty seuraavista syistä:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Nykyinen verkkoyhteys on käytön mukaan laskutettava" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Nykyinen verkkoyhteys kieltää suuret lataukset" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Virransäästötila on aktiivinen" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Pelitila on aktiivinen" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Ohjelmistopäivitykset keskeytetty" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"Verkkoyhteys on käytön mukaan laskutettava — ohjelmistopäivitykset " +"keskeytetty" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Verkkoyhteys kieltää suuret lataukset — ohjelmistopäivitykset keskeytetty" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Virransäästötila on aktiivinen — ohjelmistopäivitykset keskeytetty" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Pelitila on aktiivinen — ohjelmistopäivitykset keskeytetty" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Käynnistä uudelleen ja päivitä…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Päivitä _kaikki" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Ohjelmistopäivitykset ladattu" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Päivitykset ovat valmiit asennettavaksi" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integroitu laiteohjelmisto" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Vaatii uudelleenkäynnistyksen" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Sovelluspäivitykset" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Laitteen laiteohjelmisto" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Lataa" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s saatavilla" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s saatavilla" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Lue lisää uudesta versiosta" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s/%s ladattu" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% ladattu" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Suuri päivitys uusin ominaisuuksin ja parannuksin." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Peru järjestelmäpäivitys" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "Käynnistä uu_delleen ja päivitä…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Varmuuskopioi tärkeät tiedostot ja muut tiedot ennen päivittämistä." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Virheen tiedot" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Kopioi tiedot" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Tiedoston “%s” poistaminen epäonnistui: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Kansion “%s” poistaminen epäonnistui: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Lisää, poista tai päivitä tietokoneen ohjelmistoja" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;Päivitys;Päivitykset;Lähteet;Ohjelmistolähteet;" +"Ohjelmistovarastot;Asenna;Poista;Ohjelma;Sovellus;Kauppa;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s valmis" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"%s on valmis otettavaksi käyttöön ja valmisteltu seuraavaa " +"uudelleenkäynnistystä varten." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Käytä" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Järjestelmäpäivitykset" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Yleiset järjestelmäpäivitykset, kuten tietoturva- ja korjauspäivitykset sekä " +"suorituskykyä parantavat päivitykset." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Käyttöjärjestelmän %s päivitys uusin ominaisuuksin ja parannuksin." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS-päivityspalvelu ei voinut noutaa ja toteuttaa päivitystä." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Web App -sovellus" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Verkkosovellusten tuki" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Suorita suosittuja verkkosovelluksia selaimessa" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Päivitä saadaksesi uusimmat ominaisuudet ja suorituskyky- sekä " +"vakausparannukset." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak-tuki" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak on viitekehys Linux-työpöytäsovelluksille" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Järjestelmäkansio %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Koti-alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Tietokoneen järjestelmäkansiot" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Tietokoneen järjestelmäasetukset kansiosta /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Työpöytäkansio" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Työpöytä-alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Asiakirjat-kansio" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Asiakirjat-alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Musiikkikansio" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Musiikki-alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Kuvat-kansio" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Kuvat-alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Julkinen Jaettu-kansio" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Julkinen Jaettu-alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Videot-kansio" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videot-alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Mallit-kansio" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Mallit-alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Käyttäjän välimuistikansio" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Käyttäjän välimuistikansion alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Käyttäjän asetuskansio" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Käyttäjän asetuskansion alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Käyttäjän datakansio" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Käyttäjän datakansion alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Käyttäjän suoritusaikainen kansio" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Käyttäjän suoritusaikaisen kansion alikansio %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Pääsy tiedostojärjestelmään %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Noudetaan flatpak-metatietoja kohteelle %s…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Lisäosan ‘%s’ jalostaminen epäonnistui: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Käyttäjäasennus" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Järjestelmäasennus" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Sovelluksen tunniste" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Lisäosan ‘%s’ lisääminen asennettavaksi epäonnistui: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Lisäosan ‘%s’ lisääminen poistettavaksi epäonnistui: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Etäpää “%s” ei salli kohteen “%s” asennusta luultavasti suodattimen vuoksi. " +"Poista suodatin ja toista asennus. Yksityiskohtainen virhe: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Järjestelmän virta ei riitä päivityksen suorittamiseen" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Järjestelmän virta ei riitä päivityksen suorittamiseen (%u%%, vaaditaan %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "" +"Laite ei ole tavoitettavissa, tai on langattoman kantomatkan ulkopuolella" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Laitteen akussa ei ole riittävästi virtaa" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Laitteen akun varaus on liian matala (%u%%, vaatii %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Laite odottaa päivityksen toteuttamista" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Laitteen tulee olla liitettynä verkkovirtaan" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Laitetta ei voi käyttää, kun kansi on suljettu" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Laitteen päivitys %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Järjestelmän päivitys %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Sulautetun ohjaimen päivitys %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "ME-päivitys %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Yritystason ME-päivitys %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Kuluttajatason ME-päivitys %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Ohjaimen päivitys %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Thunderbolt-ohjaimen päivitys %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Suorittimen mikropäivitys %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Kokoonpanon päivitys %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Akkupäivitys %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Kamerapäivitys %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "TPM-päivitys %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Kosketuslevyn päivitys %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Hiiripäivitys %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Näppäimistöpäivitys %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Tallennustilaohjaimen päivitys %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Verkkosovittimen päivitys %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Näyttöpäivitys %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "BMC-päivitys %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "USB-vastaanotinlaitteen %s päivitys" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Aseman päivitys %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Flash-aseman päivitys %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "SSD-päivitys %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Näytönohjaimen päivitys %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Telakan päivitys %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "USB-telakan päivitys %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware-laiteohjelmisto" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Laiteohjelmiston päivitystä ei voitu toteuttaa: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Laiteohjelmistojen päivitystuki" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Tarjoaa tuen laiteohjelmistojen (firmware) päivityksille" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Asennetaanko allekirjoittamaton ohjelmisto?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Asennettava ohjelmisto ei ole allekirjoitettu. Tämän ohjelmiston päivitysten " +"alkuperää ei ole mahdollista vahvistaa, eikä päivitysten peukalointia voida " +"kiistää." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Ladataanko allekirjoittamaton ohjelmisto?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Allekirjoittamattomia päivityksiä on saatavilla. Ilman allekirjoitusta " +"päivitysten alkuperää ei ole mahdollista vahvistaa, eikä päivitysten " +"peukalointia voida kiistää." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Päivitetäänkö allekirjoittamaton ohjelmisto?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Allekirjoittamattomia päivityksiä on saatavilla. Ilman allekirjoitusta " +"päivitysten alkuperää ei ole mahdollista vahvistaa, eikä päivitysten " +"peukalointia voida kiistää. Ohjelmistopäivitykset poistetaan käytöstä, " +"kunnes allekirjoittamattomat päivitykset joko poistetaan tai päivitetään." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Päivitysten asentaminen epäonnistui: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paketit" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Päivitysten lataaminen epäonnistui: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Päivitysten käynnistäminen epäonnistui: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Käyttöjärjestelmä (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap-kauppa" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap-tuki" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap on yleinen Linux-paketti" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Järjestelmä" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Järjestelmäkomponentti" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Mukava tapa hallita järjestelmän ohjelmistoja." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Kirjoita numero 1:stä %u:een: " + +#~ msgid "Choose an app:" +#~ msgstr "Valitse sovellus:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s on nyt asennettu" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Sovellus on poistettu" +#~ msgstr[1] "Sovellukset on poistettu" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Kohdetta “%s” ei löytynyt" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Ladataan ohjelmistoluetteloa" + +#~ msgid "Moderate page" +#~ msgstr "Moderoi sivua" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Ei arvosteluja moderoitavaksi" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Oliko tästä arvostelusta sinulle hyötyä?" + +#~ msgid "Yes" +#~ msgstr "Kyllä" + +#~ msgid "No" +#~ msgstr "Ei" + +#~ msgid "Meh" +#~ msgstr "No jaa" + +#~ msgid "Outdated SDK version" +#~ msgstr "Vanhentunut SDK-versio" + +#~ msgid "Unable to install updates" +#~ msgstr "Päivitysten asentaminen ei onnistunut" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Poistaminen ei onnistu: tunnistautuminen oli virheellinen" + +#~ msgid "Network Settings" +#~ msgstr "Verkkoasetukset" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Käyttöjärjestemän päivitykset eivät ole saatavilla" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Tärkeä käyttöjärjestelmän päivityksen asennus epäonnistui." + +#~ msgid "No Network" +#~ msgstr "Ei verkkoa" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Päivitysten tarkistaminen vaatii internetyhteyden." + +#~ msgid "Network _Settings" +#~ msgstr "_Verkkoasetukset" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Ohjelmistojen versiopäivitykset on ladattu ja ne odottavat asennusta." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Ohjelmistopäivitykset on ladattu ja ne odottavat asennusta." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Ladataan versiopäivitystietoja…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automaattiset päivitykset keskeytetty" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Nykyinen verkkoyhteys on käytön mukaan laskutettava. Käytön mukaan " +#~ "laskutettavissa yhteyksissä voi olla datarajoituksia tai muuttuvia " +#~ "kustannuksia. Datan säästämiseksi automaattiset päivitykset on " +#~ "keskeytetty.\n" +#~ "\n" +#~ "Jos nykyinen yhteys on väärin havaittu käytön mukaan laskutettavaksi " +#~ "yhteydeksi, mutta ei ole sellainen, tämä asetus on mahdollista muuttaa." + +#~ msgid "Open Network _Settings" +#~ msgstr "Avaa _verkkoasetukset" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Yllättävien kulujen tai verkkorajoitusten vuoksi automaattiset " +#~ "päivitykset eivät ole käytössä, kun käytetään mobiiliyhteyttä tai käytön " +#~ "mukaan laskutettavaa yhteyttä." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "Lataa ja asentaa ohjelmistopäivitykset taustalla, jos mahdollista" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Näytä vain _vapaat sovellukset" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Näytä vain vapaalla lisenssillä julkaistut sovellukset, piilota " +#~ "omisteiset sovellukset" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Mikä tässä sovelluksessa on hyvää? Jätä palaute arvostelun muodossa, se " +#~ "voi olla hyödyksi muille." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Päivitysten lataaminen epäonnistui: internetyhteys vaadittiin, mutta sitä " +#~ "ei ollut saatavilla" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Päivitysten lataaminen epäonnistui: levytilaa ei ole riittävästi" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Päivitysten lataaminen epäonnistui: tunnistautuminen vaadittiin" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "" +#~ "Päivitysten lataaminen epäonnistui: tunnistautuminen oli virheellinen" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Sovelluksen %s asennus epäonnistui: käyttöoikeutesi eivät riitä " +#~ "ohjelmistojen asennukseen" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Sovellusta %s ei voi asentaa: akussa ei ole riittävästi virtaa" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Päivitysten asentaminen ei onnistu: levytilaa ei ole riittävästi" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Päivitysten asentaminen ei onnistu: tunnistautuminen vaadittiin" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "" +#~ "Päivitysten asentaminen ei onnistu: tunnistautuminen oli virheellinen" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Sovelluksen %s päivitys epäonnistui: käyttöoikeutesi eivät riitä " +#~ "ohjelmistojen päivittämiseen" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Päivitysten asentaminen ei onnistu: käyttöoikeutesi eivät riitä " +#~ "ohjelmistojen päivittämiseen" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Päivitysten asentaminen ei onnistu: verkkovirta vaaditaan" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Sovellusta %s ei voi päivittää: akussa ei ole riittävästi virtaa" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Päivityksiä ei voi asentaa: akussa ei ole riittävästi virtaa" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "%s -järjestelmäpäivitys epäonnistui: internetyhteys vaadittiin, mutta " +#~ "sitä ei ollut saatavilla" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Järjestelmäpäivitys %s epäonnistui: käyttöoikeutesi eivät riitä " +#~ "järjestelmäpäivitykseen" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Versioon %s päivitys ei onnistu: akussa ei ole riittävästi virtaa" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Sovelluksen %s poistaminen epäonnistui: tunnistautuminen vaadittiin" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "" +#~ "Sovelluksen %s poistaminen epäonnistui: tunnistautuminen oli virheellinen" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Sovelluksen %s poistaminen epäonnistui: käyttöoikeutesi eivät riitä " +#~ "ohjelmistojen poistamiseen" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Sovelluksen %s poistaminen epäonnistui: verkkovirta vaadittiin" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Sovellusta %s ei voi poistaa: akussa ei ole riittävästi virtaa" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Sovelluksen %s poistaminen epäonnistui" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Tiedoston asentaminen epäonnistui: ei tuettu" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Asentaminen epäonnistui: ei tuettu" + +#~ msgid "AC power is required" +#~ msgstr "Verkkovirta vaaditaan" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "" +#~ "Käytön mukaan laskutettava yhteys ‒ automaattiset päivitykset keskeytetty" + +#~ msgid "Find Out _More" +#~ msgstr "Lue lisä_ä" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Tärkeä ohjelmistopäivitys on valmis asennettavaksi." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Tärkeää: kriittiset ohjelmistopäivitykset odottavat." + +#~| msgid "No update description available." +#~ msgid "Loading update description, please wait…" +#~ msgstr "Ladataan päivityksen kuvausta, odota hetki…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Näytä runsasta vianselvitystietoa" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Voi päästä mielivaltaisiin tiedostoihin tiedostojärjestelmässä" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Poistetaanko %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s poistetaan. Jos haluat käyttää sitä jatkossa, se pitää asentaa " +#~ "uudelleen." + +#~ msgid "Downloading featured images…" +#~ msgstr "Ladataan nostokuvia…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Viimeisin aikaleima, jolloin järjestelmä oli verkossa ja sai mitä tahansa " +#~ "päivityksiä" + +#~ msgid "An application" +#~ msgstr "Sovellus" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Tämä ohjelmisto ei ole saatavilla suomeksi, joten se näytetään " +#~ "englanninkielisenä." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Valitut lisäosat asennetaan sovelluksen mukana." + +#~ msgid "Applications" +#~ msgstr "Sovellukset" + +#~ msgid "_Continue" +#~ msgstr "_Jatka" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u sovellus" +#~ msgstr[1] "%u sovellusta" + +#~ msgid "Post Review" +#~ msgstr "Lähetä arvostelu" + +#~ msgid "_Post" +#~ msgstr "_Lähetä" + +#~ msgid "Rating" +#~ msgstr "Arvosana" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Kirjoita lyhyt yhteenveto arvostelustasi, esim. \"Todella hyödyllinen ja " +#~ "monipuolinen sovellus, suosittelen.\"" + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Arvostelu" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Mitä pidät tästä sovelluksesta? Yritä tuoda näkemyksiäsi selkeästi esiin." + +#~ msgid "No screenshot provided" +#~ msgstr "Ei kuvakaappausta" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Käynnistä uudelleen nyt" + +#~ msgid "Primary Menu" +#~ msgstr "Ensisijainen valikko" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Päivitykset" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s ei ole enää tuettu." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "" +#~ "Tämä tarkoittaa, ettei käyttöjärjestelmään ole saatavilla enää " +#~ "tietoturvapäivityksiä." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "" +#~ "On suositeltavaa, että päivität käyttöjärjestelmän uudempaan versioon." + +#~ msgid "Update All" +#~ msgstr "Päivitä kaikki" + +#~ msgid "Application Updates" +#~ msgstr "Sovelluspäivitykset" + +#~ msgid "GNOME Web" +#~ msgstr "Gnomen verkkoselain" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Tähän järjestelmään ei ole asennettu päivityksiä." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Sovellushallinta Gnomelle" + +#~ msgid "A list of popular applications" +#~ msgstr "Luettelo suosituista sovelluksista" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Luettelo käytettävistä sovelluksista, jotka ylittävät järjestelmän " +#~ "määrittämät sovellukset." + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Ohjelmistoluetteloa ladataan verkosta" + +#~ msgid "Name" +#~ msgstr "Nimi" + +#~ msgid "user" +#~ msgstr "käyttäjä" + +#~ msgid "Channel" +#~ msgstr "Kanava" + +#~ msgid "Branch" +#~ msgstr "Haara" + +#~ msgid "URL" +#~ msgstr "Osoite" + +#~ msgid "Installation" +#~ msgstr "Asennuskohde" + +#~ msgid "Version" +#~ msgstr "Versio" + +#~ msgid "Access arbitrary files" +#~ msgstr "Pääsy mielivaltaisiin tiedostoihin" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Voi päästä mielivaltaisiin tiedostoihin" + +#~ msgid "Checking…" +#~ msgstr "Tarkistetaan…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "GNOME Software" +#~ msgstr "Ohjelmistot" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "URI joka viittaa järjestelmäpäivitysbannerin taustaan." + +#~ msgid "Loading…" +#~ msgstr "Ladataan…" + +#~ msgid "_Add shortcut" +#~ msgstr "Lis_ää pikakuvake" + +#~ msgid "Re_move shortcut" +#~ msgstr "Poist_a pikakuvake" + +#~ msgid "Welcome" +#~ msgstr "Tervetuloa" + +#~ msgid "Welcome to Software" +#~ msgstr "Tervetuloa ohjelmistojen pariin" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Ohjelmistot mahdollistaa keskitetyn asennuspaikan eri ohjelmistoille. " +#~ "Tutustu suosituksiin, selaa eri luokkia tai etsi haluamaasi sovellusta." + +#~ msgid "_Browse Software" +#~ msgstr "_Selaa ohjelmistoja" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Ladataan sovellusarvosteluja…" + +#~ msgid "OS Updates" +#~ msgstr "Järjestelmäpäivitykset" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "" +#~ "Sisältää suorituskykyyn, vakauteen ja turvallisuuteen liittyviä " +#~ "parannuksia." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Ladataan laiteohjelmiston päivitysallekirjoituksia…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Ladataan laiteohjelmiston päivityksen metatietoja…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Ohjelmistolla on tuntemattomia oikeuksia" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Ohjelmisto tulee luotetusta lähteestä" + +#~ msgid "Unknown Permissions" +#~ msgstr "Tuntemattomat oikeudet" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Tämän sovelluksen vaatimat oikeudet eivät ole tiedossa" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Sovellus tulee luotetusta lähteestä" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Jakelusi on vahvistanut, että tähän sovellukseen voi luottaa" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Näytä kehote asentaa ei-vapaita ohjelmistolähteitä" + +#~ msgid "Select All" +#~ msgstr "Valitse kaikki" + +#~ msgid "Select None" +#~ msgstr "Älä valitse mitään" + +#~ msgid "Featured %s" +#~ msgstr "Nostot — %s" + +#~ msgid "Show" +#~ msgstr "Näytä" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Alaluokkien suodatusvalikko" + +#~ msgid "Sort" +#~ msgstr "Järjestä" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Alaluokkien lajitteluvalikko" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgid "Audio & Video" +#~ msgstr "Ääni ja video" + +#~ msgid "Developer Tools" +#~ msgstr "Kehitystyökalut" + +#~ msgid "Education & Science" +#~ msgstr "Koulutus ja tieteet" + +#~ msgid "Games" +#~ msgstr "Pelit" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafiikka ja valokuvaus" + +#~ msgid "Productivity" +#~ msgstr "Tuottavuus" + +#~ msgid "Communication & News" +#~ msgstr "Yhteydenpito ja uutiset" + +#~ msgid "Utilities" +#~ msgstr "Apuohjelmat" + +#~ msgid "_Read Less" +#~ msgstr "Lue _vähemmän" + +#~ msgid "_Launch" +#~ msgstr "_Käynnistä" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Ei voida määrittää, mihin järjestelmän osiin sovelluksella on pääsy. Tämä " +#~ "on ominaista vanhemmille sovelluksille." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Ei koskaan" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Matala" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Keskitaso" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Korkea" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Tuntematon" + +#~ msgid "Public domain" +#~ msgstr "Public domain" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://fi.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Käyttäjiä sitoo seuraava lisenssi:" +#~ msgstr[1] "Käyttäjiä sitovat seuraavat lisenssit:" + +#~ msgid "Localized in your Language" +#~ msgstr "Saatavilla suomeksi" + +#~ msgid "Release Activity" +#~ msgstr "Julkaisutoiminta" + +#~ msgid "Sandboxed" +#~ msgstr "Eristetty" + +#~ msgid "Category" +#~ msgstr "Luokka" + +#~ msgid "Free" +#~ msgstr "Avoin" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Tuntematon" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Tämä tarkoittaa, että ohjelmistoa voi vapaasti käyttää, kopioida, " +#~ "levittää, opiskella ja muokata." + +#~ msgid "Proprietary Software" +#~ msgstr "Suljettu ohjelmisto" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Tämä tarkoittaa, että ohjelmiston omistaa joko yksityinen taho tai " +#~ "yritys. Ohjelman käyttöön liittyy rajoituksia, eikä lähdekoodia ole " +#~ "yleensä saatavilla." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Tämän ohjelmiston lisenssiehdot ovat tuntemattomia." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Sovellus arvioitiin näin, koska se sisältää:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Tästä arvostelusta ei ole saatavilla lisätietoja." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Asennus poistettu" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Asennettu" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Päivitetty" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Tuntematon" + +#~ msgid "History" +#~ msgstr "Historia" + +#~ msgid "More…" +#~ msgstr "Lisää…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Suositut ääni- ja videsovellukset" + +#~ msgid "Recommended Games" +#~ msgstr "Suositut pelit" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Suositut grafiikkasovellukset" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Suositut tuottavuussovellukset" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Jotkin ohjelmistot ovat suljettuja, ja niissä on rajoituksia lähdekoodin " +#~ "käyttöön, jakamiseen ja pääsyyn liittyen." + +#~ msgid "Find out more…" +#~ msgstr "Lue lisää…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Toimituksen valinnat" + +#~ msgid "Recent Releases" +#~ msgstr "Uusimmat julkaisut" + +#~ msgid "Remove “%s”?" +#~ msgstr "Poistetaanko ohjelmistolähde “%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Poistetaanko ohjelmistolähde “%s” käytöstä?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Ei erillisiä ohjelmistolähteitä" + +#~ msgid "_Remove…" +#~ msgstr "_Poista…" + +#~ msgid "_Disable…" +#~ msgstr "_Poista käytöstä…" + +#~ msgid "Disabling" +#~ msgstr "Poistetaan käytöstä" + +#~ msgid "Enabled" +#~ msgstr "Käytössä" + +#~ msgid "Disabled" +#~ msgstr "Poistettu käytöstä" + +#~ msgid "ratings in total" +#~ msgstr "arvostelua yhteensä" + +#~ msgid "_Remove All" +#~ msgstr "_Poista kaikki" + +#~ msgid "Looking for new updates…" +#~ msgstr "Etsitään uusia päivityksiä…" + +#~ msgid "Setting up updates…" +#~ msgstr "Asetetaan päivityksiä…" + +#~ msgid "Software is up to date" +#~ msgstr "Ohjelmat ovat ajan tasalla" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "" +#~ "Päivitykset otetaan käyttöön, kun tietokone käynnistetään uudelleen." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Odotetaan, että %s %s ladataan" + +#~ msgid "Downloading %s %s" +#~ msgstr "Ladataan %s %s" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS on sovellusten käyttäjäarvioihin keskittynyt palvelu" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Ota käyttöön Gnome Shell -laajennusten ohjelmistolähde" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Piirroshahmoja vaarallisissa tilanteissa" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Piirroshahmot aggressiivisessa ristiriidassa" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Graafista väkivaltaa, johon liittyy piirroshahmoja" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Hahmoja vaarallisissa tilanteissa, helposti todellisuudesta erotettavissa" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Hahmoja aggressiivisessa ristiriidassa, helposti todellisuudesta " +#~ "erotettavissa" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Graafista väkivaltaa, helposti todellisuudesta erotettavissa" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Tunnistettavia hahmoja vaarallisissa tilanteissa" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Kuvauksia todellisista hahmoista aggressiivisessa ristiriidassa" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Graafista väkivaltaa, johon sisältyy todellisia hahmoja" + +#~ msgid "No bloodshed" +#~ msgstr "Ei verilöylyä" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Epärealistinen verilöyly" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Realistinen verilöyly" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Kuvauksia verilöylystä ja ruumiinosien silpomista" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Raiskaus tai muuta väkivaltaista seksuaalista käytöstä" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Viittauksia alkoholituotteisiin" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Alkoholin käyttöä" + +#~ msgid "References to illicit drugs" +#~ msgstr "Viittauksia laittomiin huumausaineisiin" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Laittomien huumausaineiden käyttöä" + +#~ msgid "References to tobacco products" +#~ msgstr "Viittauksia tupakkatuotteisiin" + +#~ msgid "Use of tobacco products" +#~ msgstr "Tupakan polttamista" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Hetkellistä taiteellista alastomuutta" + +#~ msgid "Prolonged nudity" +#~ msgstr "Pitkäkestoista alastomuutta" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provokatiivisia viittauksia tai kuvauksia" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Seksuaalisia viittauksia tai kuvauksia" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Graafista seksuaalista käytöstä" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Vähäistä tai epäsäännöllistä kiroilua" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Keskitason kiroilua" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Vahvaa tai säännöllistä kiroilua" + +#~ msgid "Slapstick humor" +#~ msgstr "Kermakakkukomiikkaa" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Alatyylistä wc-huumoria" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Aikuismaista tai seksuaalista huumoria" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Kielteisyyttä tiettyä ihmisryhmää kohtaan" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Syrjintää tarkoituksena aiheuttaa tunteellista epämukavuutta" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Syrjintää kohdistuen sukupuoleen, seksuaalisuuteen, rotuun tai uskontoon" + +#~ msgid "Product placement" +#~ msgstr "Tuotesijoittelua" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Selkeitä viittauksia tiettyyn brändiin tai tavaramerkkiin" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Käyttäjiä kehotetaan ostamaan tiettyjä todellisia esineitä" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Satunnaista uhkapeliä pelinappuloita käyttäen" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Uhkapeliä käyttäen pelin sisäistä rahaa" + +#~ msgid "Gambling using real money" +#~ msgstr "Uhkapeliä käyttäen oikeaa rahaa" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Käyttäjiä kehotetaan lahjoittamaan oikeaa rahaa" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Mahdollisuus käyttää oikeaa rahaa sovelluksessa" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Käyttäjien välistä vuorovaikutusta ilman keskustelumahdollisuutta" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Valvottu keskusteluominaisuus käyttäjien välillä" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Valvomaton ääni- tai videokeskusteluominaisuus käyttäjien välillä" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Sosiaalisen median käyttäjätunnusten tai sähköpostiosoitteiden jakamista" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Tarkistetaan viimeisintä sovellusversiota" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Jakaa diagnostiikkatietoja, jotka eivät ole yhdistettävissä käyttäjään" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Jakaa käyttäjään yhdistettävissä olevia tietoja" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Fyysisen sijainnin jakamista muille käyttäjille" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Epäsuoria viittauksia homoseksuaalisuuteen" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Suutelua samaa sukupuolta olevien kesken" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "" +#~ "Graafista seksuaalista käyttäytymistä samaa sukupuolta olevien kesken" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Epäsuoria viittauksia prosituutioon" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Suoria viittauksia prosituutioon" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Graafisia kuvauksia prostituutioon liittyvistä toimista" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Epäsuoria viittauksia haureuteen" + +#~ msgid "Direct references to adultery" +#~ msgstr "Suoria viittauksia haureuteen" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Graafisia kuvauksia haureuteen liittyvistä toimista" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Vähävaatteisia ihmishahmoja" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Avoimesti seksualisoituja ihmishahmoja" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Kuvauksia tai viittauksia historialliseen häpäisyyn" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Kuvauksia nykypäivän ihmishäpäisystä" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Graafisia kuvauksia nykypäivän häpäisystä" + +#~ msgid "Visible dead human remains" +#~ msgstr "Näkyviä kuolleen ihmisen jäännöksiä" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Kuolleen ihmisen jäännöksiä, jotka altistetaan elementeille" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Graafisia kuvauksia tai häpäisyä liittyen ihmisruumiisiin" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Kuvauksia tai viittauksia historialliseen orjuuteen" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Kuvauksia nykypäivän orjuudesta" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Graafisia kuvauksia nykypäivän orjuudesta" + +#~ msgid "General" +#~ msgstr "Yleinen" + +#~ msgid "ALL" +#~ msgstr "KAIKKI" + +#~ msgid "Teen" +#~ msgstr "Teinit" + +#~ msgid "Everyone 10+" +#~ msgstr "10+-vuotiaat" + +#~ msgid "Everyone" +#~ msgstr "Kaikki" + +#~ msgid "Early Childhood" +#~ msgstr "Varhaislapsuus" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Tuntematon" + +#~ msgid "this website" +#~ msgstr "tältä verkkosivulta" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Siirry ohjelmistojen pariin" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Poistettu" + +#~ msgid "Format" +#~ msgstr "Muoto" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Poistetaanko %s?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Tämä sovellus tulee käynnistää uudelleen, jotta uudet liitännäiset ovat " +#~ "käytettävissä." + +#~ msgid "Security Updates Pending" +#~ msgstr "Tietoturvapäivitykset odottavat" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "On suositeltavaa asentaa tärkeät päivitykset heti" + +#~ msgid "Restart & Install" +#~ msgstr "Käynnistä uudelleen ja asenna" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Tärkeitä järjestelmä- ja sovelluspäivityksiä on valmiina asennettavaksi" + +#~ msgid "View" +#~ msgstr "Näytä" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Eilen, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Kolme päivää sitten" + +#~ msgid "Four days ago" +#~ msgstr "Neljä päivää sitten" + +#~ msgid "Five days ago" +#~ msgstr "Viisi päivää sitten" + +#~ msgid "Six days ago" +#~ msgstr "Kuusi päivää sitten" + +#~ msgid "Two weeks ago" +#~ msgstr "Kaksi viikkoa sitten" + +#~ msgid "About %s" +#~ msgstr "Tietoja - %s" + +#~ msgid "%s ME" +#~ msgstr "%s, ME" + +#~ msgid "Extension Settings" +#~ msgstr "Laajennusasetukset" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Käytä laajennuksia omalla vastuullasi. Jos kohtaat ongelmia järjestelmän " +#~ "toiminnassa, poista laajennukset käytöstä." + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell-laajennukset" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Gnome Shell -laajennusten ohjelmistolähde" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Ladataan Shell-laajennuksen metatietoja…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell -laajennus" + +#~ msgid "Show the folder management UI" +#~ msgstr "Näytä kansiohallinnan käyttöliittymä" + +#~ msgid "Folder Name" +#~ msgstr "Kansion nimi" + +#~ msgid "_Add" +#~ msgstr "_Lisää" + +#~ msgid "Add to Application Folder" +#~ msgstr "Lisää sovelluskansioon" + +#~ msgid "Top Rated" +#~ msgstr "Parhaat arvostelut" + +#~ msgid "Failed to load components" +#~ msgstr "Komponenttien lataaminen epäonnistui" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS validoitu kelvollisesti!" + +#~ msgid "Failed to load file" +#~ msgstr "Tiedoston lataaminen epäonnistui" + +#~ msgid "Unsaved changes" +#~ msgstr "Tallentamattomia muutoksia" + +#~ msgid "The application list is already loaded." +#~ msgstr "Sovelluslista on jo ladattu." + +#~ msgid "Merge documents" +#~ msgstr "Yhdistä asiakirjat" + +#~ msgid "Throw away changes" +#~ msgstr "Hylkää muutokset" + +#~ msgid "Open AppStream File" +#~ msgstr "Avaa AppStream-tiedosto" + +#~ msgid "Save AppStream File" +#~ msgstr "Tallenna AppStream-tiedosto" + +#~ msgid "_Save" +#~ msgstr "_Tallenna" + +#~ msgid "%s banner design deleted." +#~ msgstr "\"%s\"-bannerisuunnitelma poistettu." + +#~ msgid "Banner design deleted." +#~ msgstr "Bannerisuunnitelma poistettu." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Sovelluslistassa on tallentamattomia muutoksia." + +#~ msgid "Use verbose logging" +#~ msgstr "Käytä runsasta lokitusta" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Gnomen ohjelmistojen bannerisuunnitelu" + +#~ msgid "No Designs" +#~ msgstr "Ei suunnitelmia" + +#~ msgid "Error message here" +#~ msgstr "Virheviesti tähän" + +#~ msgid "Category Featured" +#~ msgstr "Luokka \"Nostot\"" + +#~ msgid "Undo" +#~ msgstr "Kumoa" + +#~ msgid "Banner Designer" +#~ msgstr "Bannerisuunnittelu" + +#~ msgid "New Banner" +#~ msgstr "Uusi banneri" + +#~ msgid "Import from file" +#~ msgstr "Tuo tiedostosta" + +#~ msgid "Export to file" +#~ msgstr "Vie tiedostoon" + +#~ msgid "Spacing" +#~ msgstr "Välistys" + +#~ msgid "Click on items to select them" +#~ msgstr "Napsauta kohdetta valitaksesi sen" + +#~ msgid "Select" +#~ msgstr "Valitse" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Lisää kansioon…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Siirrä kansioon…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Poista kansiosta" + +#~ msgid "Featured Applications" +#~ msgstr "Valokeilassa" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "" +#~ "Suunnittele nostopaikoilla olevien sovellusten bannereita Gnomen " +#~ "ohjelmistoihin" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;sovellus;" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_Kaikki" + +#~ msgid "Sign In / Register…" +#~ msgstr "Kirjaudu sisään / Rekisteröidy…" + +#~ msgid "Continue" +#~ msgstr "Jatka" + +#~ msgid "Use" +#~ msgstr "Käytä" + +#~ msgid "Add another…" +#~ msgstr "Lisää toinen…" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Ohjelmistoluetteloa ladataan" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s asennetaan, ja sinulta veloitetaan %s." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "Kirjauduttu tilillä %s" + +#~ msgid "Sign in…" +#~ msgstr "Kirjaudu sisään…" + +#~ msgid "Sign out" +#~ msgstr "Kirjaudu ulos" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Ei voitu ostaa %s: tunnistautuminen vaadittiin" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Ei voitu ostaa %s: tunnistautuminen ei kelvannut" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Ei voitu ostaa %s: maksutapaa ei määritetty" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Ei voitu ostaa %s: maksusta kieltäydyttiin" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Jatkaaksesi sinun tulee käyttää Ubuntu One -tiliä." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Jatkaaksesi sinun tulee käyttää Ubuntu One -tiliäsi." + +#~ msgid "..." +#~ msgstr "..." + +#~ msgid "Show profiling information for the service" +#~ msgstr "Näytä palvelun profilointitietoja" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Jatkaaksesi kirjaudu sisään palveluun %s." + +#~ msgid "Email address" +#~ msgstr "Sähköpostiosoite" + +#~ msgid "I have an account already" +#~ msgstr "Minulla on jo tili" + +#~ msgid "I want to register for an account now" +#~ msgstr "Haluan rekisteröidä tilin nyt" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Kirjaudu sisään automaattisesti ensi kerralla" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "" +#~ "Anna kertakäyttöinen PIN-koodi kaksivaiheista tunnistaumista varten." + +#~ msgid "PIN" +#~ msgstr "PIN-koodi" + +#~ msgid "Authenticate" +#~ msgstr "Tunnistaudu" + +#~ msgid "_About" +#~ msgstr "_Tietoja" + +#~ msgid "_Quit" +#~ msgstr "_Lopeta" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Tietoja kohteesta %s, ja tietoa kuinka saada tätä tiedostomuotoa tukeva " +#~ "koodekki, löytyy verkkosivustolta." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "\"%s\"-tilisi on jäädytetty." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "" +#~ "Ohjelmistojen asennus ei ole mahdollista, ennen kuin tämä asia on " +#~ "selvitetty." + +#~ msgid "For more information, visit %s." +#~ msgstr "Lisätietoja on osoitteessa %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Sovelluksen %s päivitys lähteestä %s epäonnistui" + +#~ msgid "Downloading new updates…" +#~ msgstr "Ladataan uusia päivityksiä…" + +#~ msgid "Downloading application page…" +#~ msgstr "Ladataan sovellussivua…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Valven tarjoama viihdealusta" + +#~ msgid "Applications Updated" +#~ msgstr "Sovellukset päivitetty" + +#~ msgid "Includes: ." +#~ msgstr "Sisältäen: ." + +#~ msgid "Restart & _Install" +#~ msgstr "Käynnistä uudelleen ja _asenna" + +#~ msgid "Getting runtime source…" +#~ msgstr "Noudetaan runtime-lähdettä…" + +#~ msgid "Limba Support" +#~ msgstr "Limba-tuki" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "Limba tarjoaa kehittäjille helpon tavan luoda ohjelmistopaketteja" + +#~ msgid "Sorted by Name" +#~ msgstr "Lajiteltu nimen mukaan" + +#~ msgid "Sorted by Rating" +#~ msgstr "Lajiteltu arvostelun mukaan" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Luettelo lisälähteistä, jotka on otettu aiemmin käyttöön" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Luettelo lähteistä, jotka on aiemmin otettu käyttöön kolmansien " +#~ "osapuolien sovelluksia asennettaessa." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Näytä suljettuja ohjelmistoja hakutuloksissa" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "" +#~ "Luettelo suljetuista lisäohjelmistolähteistä, jotka on mahdollista ottaa " +#~ "käyttöön" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Käytetäänkö suljettua ohjelmistolähdettä?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Ei sovelluksia tai lisäosia asennettuna; muut ohjelmistot voivat silti" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Tyypillisesti rajoituksia käytön ja pääsyn lähdekoodiin suhteen." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Suljetut ohjelmistolähteet" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Ohjelmistolähteitä voi ladata internetistä. Niiden avulla on mahdollista " +#~ "ladata lisää ohjelmistoja, joita %s ei tarjoa." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Lähteen poistaminen poistaa myös ne ohjelmistot, jotka on asennettu " +#~ "kyseisestä lähteestä." + +#~ msgid "No software installed from this source" +#~ msgstr "Tästä lähteestä ei ole asennettu ohjelmistoja" + +#~ msgid "Installed from this Source" +#~ msgstr "Tästä lähteestä asennetut" + +#~ msgid "Last Checked" +#~ msgstr "Viimeksi tarkistettu" + +#~ msgid "Added" +#~ msgstr "Lisätty" + +#~ msgid "Website" +#~ msgstr "Verkkosivusto" + +#~ msgid "Remove Source" +#~ msgstr "Poista lähde" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Pelaajien välistä pelin sisäistä vuorovaikutusta ilman " +#~ "keskustelumahdollisuutta" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Käyttäjätiedon jakamista kolmansien osapuolten kanssa" + +#~ msgid "“%s” [%s]" +#~ msgstr "“%s” [%s]" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgid "Other Updates" +#~ msgstr "Muut päivitykset" + +#~ msgid "Total" +#~ msgstr "Yhteensä" + +#~ msgid "Installation of %s failed." +#~ msgstr "Kohteen %s asennus epäonnistui." + +#~ msgid "Removal of %s failed." +#~ msgstr "Kohteen %s poistaminen epäonnistui." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Varmista, että internetyhteys toimii ja yritä uudelleen." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Vapauta levytilaa ja yritä uudelleen." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Jos ongelma uusiutuu, ota yhteys ohjelmiston tarjoajaan." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Kaikki" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Nostot" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomia" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Kemia" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matematiikka" + +#~ msgid "Science" +#~ msgstr "Tiede" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Ohjelmistolähteet tarjoavat lisää ohjelmia." + +#~ msgid " or " +#~ msgstr " tai " + +#~ msgid "3rd party" +#~ msgstr "kolmas osapuoli" + +#~ msgid "nonfree" +#~ msgstr "ei-vapaa" + +#~ msgid "_Installing" +#~ msgstr "_Asennetaan" + +#~ msgid "_Removing" +#~ msgstr "_Poistetaan" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Tuntematon" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Lasketaan…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Tuntematon" + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Tämä ohjelmisto tulee kolmannelta osapuolelta ja saattaa sisältää ei-" +#~ "vapaita osia." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Tämä ohjelmisto saattaa sisältää ei-vapaita osia." + +#~ msgid "_History" +#~ msgstr "_Historia" + +#~ msgid "Size" +#~ msgstr "Koko" + +#~ msgid "non-free" +#~ msgstr "ei-vapaa" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Suositut toimistosovellukset" + +#~ msgid "One Star" +#~ msgstr "Yksi tähti" + +#~ msgid "Two Stars" +#~ msgstr "Kaksi tähteä" + +#~ msgid "Three Stars" +#~ msgstr "Kolme tähteä" + +#~ msgid "Four Stars" +#~ msgstr "Neljä tähteä" + +#~ msgid "Five Stars" +#~ msgstr "Viisi tähteä" + +#~ msgid "Audio" +#~ msgstr "Ääni" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Muokkaus" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Tietokannat" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Levyjen poltto" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Amatööriradio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Miksaus" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Musiikki" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Nauhoittimet" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Sekvensserit" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Virittimet" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Kääntäminen" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Tietokannat" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "Ohjelmointiympäristöt" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Profilointi" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Web-kehitys" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Tietojenkäsittely" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Datan visualisointi" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Talous" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Sähköoppi" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Elektroniikka" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Insinöörityö" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geotiede" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Historia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Kuvankäsittely" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Kirjallisuus" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Kartat" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Musiikki" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Numeerinen analyysi" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Rinnakkaislaskenta" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fysiikka" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Hengellisyys" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Ammuskelupelit" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulaatiopelit" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Urheilupelit" + +#~ msgid "Graphics" +#~ msgstr "Grafiikka" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D-grafiikka" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "Tekstintunnistus" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Julkaisu" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Rasterigrafiikka" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Puhelinverkkoyhteydet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Sähköposti" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Syötteet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Tiedostonsiirto" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Amatööriradio" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Pikaviestintä" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC-sovellukset" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Seuranta" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "Vertaisverkko" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Puhelinpalvelut" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Web-kehitys" + +#~ msgid "Office" +#~ msgstr "Toimisto" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Kaaviot" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Yhteystietojen hallinta" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Sanasto" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Sähköposti" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Vuokaavio" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "Kämmentietokoneet" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Valokuvaus" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Projektinhallinta" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Julkaisu" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Taulukkolaskenta" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Katselimet" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Taide" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Tekoäly" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Kemia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Tietojenkäsittely" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Rakentaminen" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Datan visualisointi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Talous" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Sähkö" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Elektroniikka" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Insinöörityö" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Maantiede" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geotiede" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Historia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humanismi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Kuvankäsittely" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Kielet" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Kirjallisuus" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Kartat" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematiikka" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Lääketiede" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Numeerinen analyysi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Rinnakkaislaskenta" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fysiikka" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotiikka" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Hengellisyys" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Urheilu" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulaattori" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Tiedostonhallinta" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Tiedostotyökalut" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Seuranta" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Tietoturva" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Pääte-emulaattorit" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Esteettömyys" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Arkistointi" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Laskimet" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Kellot" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Pakkaus" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Tiedostotyökalut" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Kartat" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Hengellisyys" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Puhelintyökalut" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Muokkaus" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Tietokanta" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Levyjen poltto" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Nauhoittimet" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" + +#~ msgid "No AppStream data found" +#~ msgstr "AppStream-tietoja ei löytynyt" + +#~ msgid "A previous update was unfinished." +#~ msgstr "Edellinen päivitys jäi viimeistelemättä." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "Päivityksen asentaminen epäonnistui. Tämä johtuu usein itse " +#~ "päivityksestä. Odota toista päivitystä ja yritä uudelleen." + +#~ msgid "Internet Only Application" +#~ msgstr "Vaatii internetyhteyden" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Päivitystä ei ollut allekirjoitettu hyväksyttävällä tavalla." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Yhteydettömän tilan päivitystä pyydettiin, mutta yksikään paketti ei " +#~ "vaadi päivitystä." + +#~ msgid "No space was left on the drive." +#~ msgstr "Asemalla ei ole vapaata tilaa." + +#~ msgid "An update failed to install correctly." +#~ msgstr "Päivityksen asennus epäonnistui." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Yhteydettömän tilan päivitys epäonnistui odottamattomalla tavalla." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i sovellus ja %i lisäosaa asennettu" +#~ msgstr[1] "%i sovellusta ja %i lisäosaa asennettu" + +#~ msgid "Set the specified debugging level" +#~ msgstr "Aseta määritelty vianjäljitystaso" + +#~ msgid "Picks" +#~ msgstr "Valikoidut" diff --git a/po/fil.po b/po/fil.po new file mode 100644 index 0000000..147c0ce --- /dev/null +++ b/po/fil.po @@ -0,0 +1,6105 @@ +# Filipino translation for gnome-software. +# Copyright (C) 2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Iverson Briones , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-06 16:48+0000\n" +"PO-Revision-Date: 2025-03-07 16:33+0800\n" +"Last-Translator: \n" +"Language-Team: Filipino \n" +"Language: fil\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.4\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Mag-install at -update ng mga app" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Gamit ang Software, makakahanap at makakapag-install ka ng mga bagong app at " +"system extension, at makakatanggal ng mga kasalukuyang naka-install na app." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Proyekto GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Karahasang Kartun" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Walang impormasyon tungkol sa karahasang kartun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Karahasang Gawa-gawa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Walang impormasyon tungkol sa karahasang gawa-gawa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Karahasang Makatotohanan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Walang impormasyon tungkol sa karahasang makatotohanan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Madugong Karahasan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Walang impormasyon tungkol sa madugong karahasan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Karahasang Sekswal" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Walang impormasyon tungkol sa karahasang sekswal" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Nakalalasing na Inumin" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "" +"Walang impormasyon tungkol sa pagpapakita ng mga nakalalasing na inumin" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Iligal na Droga" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Walang impormasyon tungkol sa pagpapakita ng iligal na droga" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabako" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Walang impormasyon tungkol sa pagpapakita ng mga produktong tabako" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Paghuhubad" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Walang impormasyon tungkol sa pagpapakita ng paghuhubad" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Sekswal na Tema" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Walang impormasyon tungkol sa pagpapakita ng mga sekswal na tema" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Pagmumura" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Walang impormasyon tungkol sa pagmumura" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Bastos na Komedya" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Walang impormasyon tungkol sa bastos na komedya" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminasyon" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Walang impormasyon tungkol sa pananalitang diskriminatoryo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Advertising" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Walang impormasyon tungkol sa mga advertisement" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Pagsusugal" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Walang impormasyon tungkol sa pagsusugal" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Pagbili" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Walang impormasyon tungkol sa kakayahang gumastos ng totoong pera" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Pag-uusap sa Pagitan ng mga User" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" +"Walang impormasyon tungkol sa mga paraan para makipag-usap sa iba pang user" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Pag-uusap sa Pagitan ng mga User Gamit ang Boses" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" +"Walang impormasyon tungkol sa mga paraan para makipag-usap sa iba pang user " +"gamit ang boses" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detalye Pangkontak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitusyon" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Lahat" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "" + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "" + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Lahat" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Fineature" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D na Grapiko" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Potograpiya" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Pag-scan" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vector na Grapiko" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Pantingin" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Paggawa at Pag-edit ng Tunog" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Pampakanta" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Lahat" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Fineature" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendaryo" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Database" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Pera" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Word Processor" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editor ng Teksto" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Web Browser" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Lahat" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Fineature" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Aksyon" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Paglalakbay" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Bloke" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Board" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kard" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulator" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Pambata" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Lohika" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Pagsasadula" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Palakasan" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estratehiya" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Lahat" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Fineature" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Pag-uusap" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Lahat" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Fineature" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Artipisyal na Katalinuhan" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomiya" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chemistry" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Wika" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Balita" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotics" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Sining" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biograpiya" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komiks" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Kathang-isip" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Kalusugan" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Kasaysayan" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Buhay" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Palakasan" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Lahat" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Fineature" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Debugger" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codec" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Driver para sa Hardware" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Font" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Source para sa Input" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Pakete ng Wika" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalisasyon" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Gumawa" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Magtrabaho" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Maglaro" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Makihalubilo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Matuto" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Mag-develop" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codec" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Driver para sa Hardware" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Font" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Source para sa Input" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Pakete ng Wika" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalisasyon" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Isang app" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Hanapin sa Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "" + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Tulungang I_salin" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Iba pang mga App ni(na)/ng %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Napatunayan ni(na)/ng %s ang pagmamay-ari niya/nila/nito sa %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Napatunayan ng developer ang pagmamay-ari niya/nila/nito sa %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Kailangan mong kumonekta sa internet para mag-iwan ng review" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "" + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontakin" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr "" + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "Gumagana siguro sa device na ito ang %s" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "Gumagana sa device na ito ang %s" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "Posibleng gumagana sa device na ito ang %s" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "Hindi gagana nang maayos sa device na ito ang %s" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "Hindi gagana sa device na ito ang %s" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Suporta sa Hardware" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Naka-install" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "" + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Ayaw ko nito" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "OK siya" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "" + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "" + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "" + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "" + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "" + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..0de6201 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,6498 @@ +# French translation for gnome-software. +# Copyright (C) 2014-2023 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Alain Lojewski , 2014-2018. +# Guillaume Bernard , 2017-2023. +# William Oprandi , 2019. +# Adrien Plazas , 2019. +# Julien Humbert , 2020. +# Hydroxyp , 2020. +# Thibault Martin , 2020. +# Alexandre Franke , 2022. +# Claude Paroz , 2022-2023. +# Charles Monzat , 2018-2022. +# Vincent Chatelain , 2024-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-23 17:16+0000\n" +"PO-Revision-Date: 2025-02-24 09:23+0100\n" +"Last-Translator: Vincent Chatelain \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: Gtranslator 45.3\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Logiciels" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Installer et mettre à jour des applications" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Logiciels sert à rechercher et installer de nouvelles applications et " +"extensions du système, ainsi qu’à supprimer celles qui sont installées sur " +"votre ordinateur." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Logiciels présente une vitrine d’applications en vedette et populaires à " +"l’aide de descriptions utiles et de plusieurs captures d’écran pour chacune " +"d’elle. Vous pouvez rechercher des logiciels soit en consultant la liste des " +"catégories, soit en interrogeant le moteur de recherche. Logiciels permet " +"aussi de mettre à jour votre système hors ligne." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panneau de vue d’ensemble" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panneau des descriptions" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panneau des installations" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panneau des mises à jour" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Détails de la mise à jour" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Le projet GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Tester la clé akmods dans le Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Une authentification est requise pour tester la clé akmods dans le Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Inscrire la clé akmods dans le Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Une authentification est requise pour inscrire la clé akmods dans le Shim " +"UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Tester la clé DKMS dans le Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" +"Une authentification est requise pour tester la clé DKMS dans le Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Inscrire la clé DKMS dans le Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" +"Une authentification est requise pour inscrire la clé DKMS dans le Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Installer un fichier appstream dans un emplacement système" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Installation d’un fichier appstream dans un emplacement système" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Une liste de projets compatibles" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Voici une liste de projets compatibles à afficher, tels que GNOME, KDE ou " +"XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Indique la façon de gérer les mises à jour et les mises à niveau de " +"Logiciels de GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Si désactivé, Logiciels de GNOME masque le panneau des mises à jour, " +"n’effectue aucune mise à jour automatique et ne demande aucune mise à niveau." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Télécharger et installer automatiquement les mises à jour" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Si activé, Logiciels de GNOME télécharge automatiquement les mises à jour " +"logicielles en arrière-plan, puis installe celles qui ne nécessitent pas de " +"redémarrage." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Signaler à l’utilisateur les mises à jour de logiciels en arrière-plan" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Si activé, Logiciels de GNOME signale à l’utilisateur les mises à jour qui " +"se sont faites pendant qu’il était inactif." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Indique s’il faut réactualiser automatiquement sur les connexions avec quotas" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Si activé, Logiciels de GNOME réactualise automatiquement en arrière-plan " +"même sur les connexions avec quotas (avec comme conséquence le " +"téléchargement de métadonnées, de mises à jour ou autres avec un coût " +"potentiel pour l’utilisateur)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Indique s’il s’agit du premier lancement de Logiciels de GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Afficher les notes à côté des applications" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtrer les applications en fonction de la branche définie par défaut pour " +"les distants" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Les applications non libres affichent un avertissement avant installation" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Quand les applications non libres sont installées, un avertissement peut " +"être affiché. Ceci contrôle cet affichage." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "L’horodatage de la dernière vérification des mises à jour" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "L’horodatage de la dernière notification de mise à jour" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "L’horodatage de la dernière notification de mise à jour" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"L’horodatage de la première mise à jour de sécurité, effacé après mise à jour" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "L’horodatage de la dernière mise à jour" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"La durée, en secondes, pour vérifier que la capture d’écran en amont est " +"encore valide" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Le choix d’une valeur plus grande donne moins d’aller-retours vers le " +"serveur distant, mais les mises à jour des captures d’écran sont plus lentes " +"à arriver. Une valeur de 0 conduit à ne jamais interroger le serveur s’il y " +"a déjà une image dans le cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Le serveur à utiliser pour les appréciations de l’application" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Le score minimum pour les appréciations" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" +"Les appréciations dont le score est inférieur à cette valeur seront masquées." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Une liste de dépôts officiels qui ne doivent pas être considérés comme " +"tierces parties" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Une liste de dépôts requis qui ne doivent pas être désactivés ou supprimés" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Une liste de dépôts officiels qui doivent être considérés comme contenant " +"des logiciels libres" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"L’URL de la licence à utiliser lorsqu’une application doit être considérée " +"comme un logiciel libre" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Installe si possible les applications enveloppées sur le système pour tous " +"les utilisateurs" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Autorise l’accès à la boîte de dialogue des dépôts de logiciels" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Propose des mises à niveau pour les versions à l’essai" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Affiche quelques éléments d’interface montrant à l’utilisateur qu’une " +"application est non libre" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Affiche leur taille d’installation dans la liste des applications installées" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://fr.wikipedia.org/wiki/Logiciel_propri%C3%A9taire'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"L’URI qui fournit une explication sur les logiciels propriétaires et non " +"libres" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Une liste d’URL pointant vers les fichiers du flux de l’application qui " +"seront téléchargés dans un dossier swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Installe les fichiers AppStream sur un emplacement de l’ensemble du système " +"pour tous les utilisateurs. Si défini à faux, les fichiers seront installés " +"dans le répertoire non-standard $XDG_DATA_HOME/swcatalog/xmls" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Ordre de priorité des formats d’empaquetage à privilégier, les formats les " +"plus importants étant répertoriés en premier. Un tableau vide signifie " +"l’ordre par défaut. Les formats ignorés sont supposés être listés en " +"dernier. Exemples de formats d’empaquetage : deb, flatpak, rpm, snap. Un nom " +"d’origine peut également être spécifié pour chaque format, séparé par un " +"deux-points, par exemple « flatpak:flathub »." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"L’horodatage de la dernière tentative de suppression des environnements " +"d’exécution Flatpak inutilisés" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Défini à vrai (true) pour n’afficher que les applications publiées sous une " +"licence de logiciel libre et cacher les applications propriétaires." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Défini à vrai (true) pour n’afficher que les applications dont l’identité " +"des développeurs a été vérifiée." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "" +"L’horodatage des dernières mises à jour de sécurité reçues dans l’historique." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Une chaîne contenant l’identifiant « Comptes en ligne » utilisé pour se " +"connecter" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" +"Outil d’installation AppStream sur l’ensemble du système de Logiciels de " +"GNOME" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Impossible d’analyser les paramètres de la ligne de commande" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Vous devez spécifier exactement un nom de fichier" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Ce logiciel ne peut être utilisé que par l’utilisateur root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Impossible de valider le type du contenu : %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Impossible de déplacer : %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Installation de l’application" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Installer l’application sélectionnée sur le système" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violence de dessins animés" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Aucune information concernant de la violence de dessins animés" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violence imaginaire" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Aucune information concernant de la violence imaginaire" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violence réaliste" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Aucune information concernant de la violence réaliste" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violence illustrant un massacre" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Aucune information concernant de l’effusion de sang" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violence sexuelle" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Aucune information concernant de la violence sexuelle" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcool" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Aucune information faisant allusion à des boissons alcoolisées" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Stupéfiants" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Aucune information faisant allusion à des stupéfiants illicites" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabac" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Aucune information faisant allusion à des produits dérivés du tabac" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nudité" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "" +"Aucune information concernant de la nudité de quelque sorte que ce soit" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Thèmes sexuels" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Aucune information faisant allusion à des images présentant un caractère " +"sexuel" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Injures" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "" +"Aucune information concernant des grossièretés de quelque nature que ce soit" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Humour déplacé" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Aucune information concernant de l’humour déplacé" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discrimination" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "" +"Aucune information concernant un discours discriminatoire de quelque nature " +"que ce soit" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Publicité" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "" +"Aucune information concernant de la publicité de quelque nature que ce soit" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Jeux d’argent" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Aucune information concernant les paris de quelque nature que ce soit" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Dépense d’argent" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Aucune information concernant la possibilité de dépenser de l’argent" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Discussion entre utilisateurs" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" +"Aucune information concernant le moyen de discuter avec les autres " +"utilisateurs" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Discussion audio entre utilisateurs" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" +"Aucune information concernant le moyen de parler avec les autres utilisateurs" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Détails de contact" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Aucune information concernant le partage des noms d’utilisateur de réseaux " +"sociaux ou des adresses courriel" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informations d’identification" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Aucune information concernant le partage des identifiants d’utilisateur avec " +"des tierces parties" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Partage de géolocalisation" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Aucune information concernant le partage de géolocalisation avec les autres " +"utilisateurs" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualité" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Aucune information faisant allusion à l’homosexualité" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitution" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Aucune information faisant allusion à la prostitution" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adultère" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Aucune information faisant allusion à l’adultère" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Représentations de personnages à caractère sexuel" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "" +"Aucune information concernant des représentations de personnages à caractère " +"sexuel" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanation" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Aucune information faisant allusion à de la profanation" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Restes humains" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Aucune information concernant des images de restes humains" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Esclavage" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Aucune information faisant allusion à l’esclavagisme" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Ne contient aucune allusion à des drogues" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" +"Ne contient aucune insulte, injure ou d’autres types de langage grossier" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Ne contient pas de publicité ou de transaction monétaire" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Ne contient pas de sexe ou de nudité" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Ne contient aucune possibilité de discuter sans contrôle" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Ne contient aucune violence" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogues" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Langage grossier" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Argent" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violence" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Pour tous" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "Aucune limite d’âge connue pour %s" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s convient à tout le monde" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s convient aux tout-petits" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s convient aux jeunes enfants" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s convient aux enfants" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s convient aux adolescents" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s convient aux adultes" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s convient à la catégorie %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Évaluation par âge" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Comment contribuer à des informations manquantes" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Fichier local" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paquet" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "En attente" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Installation en attente" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Suppression en attente" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Installation en cours" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Suppression en cours" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Téléchargement" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Installer" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Désinstaller…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Réseau" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Peut communiquer à travers le réseau" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Services système" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Peut accéder à des services DBus sur le bus système" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Services de session" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Peut accéder aux services DBus sur le bus de session" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Périphériques" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Peut accéder à des périphériques arbitraires tels la webcam" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Peut accéder aux périphériques d’entrée" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Peut accéder aux microphones et jouer de l’audio" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Peut accéder aux fichiers du système" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Contenu de l’écran" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Peut accéder au contenu de l’écran" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Dossier personnel" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Peut voir, éditer et créer des fichiers" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Peut voir les fichiers" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Système de fichiers" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Dossier de téléchargement" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Paramètres" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Peut voir et modifier n’importe quel paramètre" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Système d’affichage désuet" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Utilise un vieux système d’affichage non sécurisé" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Fuite du bac à sable" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Peut s’échapper du bac à sable et contourner d’autres restrictions" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Aucune description de la mise à jour n’a été fournie." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Détails de la mise à jour" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Demande davantage de permissions" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Données de notation invalides reçues du serveur" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Impossible de communiquer avec le serveur des notations" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Évaluations" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Aucune évaluation trouvée pour cette application." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Aucune évaluation" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Historique des versions" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Nouveautés de la version %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Version %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Aucune information n’est disponible pour cette version" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Mode de démarrage : peut être « updates » (mises à jour), « updated » (à " +"jour), « installed » (installées) ou « overview » (vue d’ensemble)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Rechercher des applications" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "RECHERCHER" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Afficher les détails de l’application (à partir de son identifiant)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Afficher les détails de l’application (à partir de son nom de paquet)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NOMDEPAQUET" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Installer l’application (à partir de son identifiant)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Désinstaller l’application (à partir de son identifiant)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Ouvrir le fichier d’un paquet local" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NOMDEFICHIER" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Le type d’interaction attendue ici : soit « none » (aucune), « notify » " +"(notifier), ou « full » (toutes)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Afficher un fichier local de type metainfo ou appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Activer la sortie de débogage verbeuse (à partir de l’instance en cours " +"d’exécution, si elle est déjà en cours d’exécution)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installer les mises à jour en attente en arrière-plan" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Afficher les préférences" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Quitter la session en cours" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Préférer les sources des fichiers locaux à AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Afficher le numéro de version" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 Les contributeurs de Logiciels de GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Alain Lojewski \n" +"Guillaume Bernard \n" +"Adrien Plazas \n" +"Julien Humbert \n" +"Charles Monzat \n" +"Vincent Chatelain " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Désolé, il n’y a aucune information sur cette application." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Taille installée" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inclut %s de données et %s de cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inclut %s de données" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inclut %s de cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Utilisation du cache et des données inconnue" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Taille du téléchargement" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Ne nécessite aucun téléchargement système supplémentaire" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" +"Nécessite une taille inconnue de téléchargements système supplémentaires" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Nécessite %s de téléchargements système supplémentaires" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Taille inconnue" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Aucune permission" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "A un accès au réseau" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Utilise les services système" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Utilise les services de session" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Peut accéder aux périphériques matériels" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Peut accéder aux périphériques du système" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Peut lire et écrire toutes vos données" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Peut lire toutes vos données" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Peut lire et écrire vos téléchargements" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Peut lire vos téléchargements" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Peut accéder à certains fichiers spécifiques" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Peut accéder aux paramètres utilisateur et les modifier" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Utilise un système de fenêtrage désuet" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Peut acquérir des permissions arbitraires" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Le développeur du logiciel est vérifié" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Vérifiée par le distributeur de votre système" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Vérifié par %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Fournie par un tiers" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Le logiciel n’est plus pris en charge" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Code vérifiable" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Licence inconnue" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Code propriétaire" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Licence spéciale" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr " ; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privilégiée" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Fiable" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Probablement fiable" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potentiellement non fiable" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Non fiable" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Mobile uniquement" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Fonctionne uniquement sur un petit écran" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Ordinateur uniquement" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Fonctionne uniquement sur un grand écran" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Non-concordance de la taille de l’écran" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Ne prend pas en charge la taille actuelle de votre écran" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Nécessite un écran tactile" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Nécessite un clavier" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Nécessite une souris" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Manette de jeu nécessaire" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Nécessite une manette de jeu pour jouer" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptative" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Fonctionne sur les téléphones, tablettes et ordinateurs" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Nécessite probablement un clavier ou une souris" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Fonctionne sur les ordinateurs de bureau et les ordinateurs portables" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Ne contient aucun contenu inapproprié lié à l’âge" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Aucune information d’évaluation par âge disponible" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visiter le site web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Installer…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Annuler" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Installer" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Télécharger" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Mettre à jour" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Désinstaller…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Désinstallation en cours" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Mise à jour critique" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "L’appareil ne peut pas être utilisé pendant la mise à jour." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Source : %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Renommée depuis %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Arrêt de la réception des mises à jour" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Mise à jour critique" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Installée" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Aider à traduire %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"Le logiciel « %s » est conçu, développé et traduit par une communauté " +"internationale de contributeurs.\n" +"\n" +"Cela signifie que même s’il n’est pas encore disponible dans votre langue, " +"vous pouvez participer et aider à le traduire." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traductions" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Site web de _traduction" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Authentification distante sur %s requise (nom de domaine %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Authentification requise" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "A_nnuler" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Authentification" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Utilisateur" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "Mot de _passe" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Autres" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Toutes" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "En vedette" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Choix de la rédaction" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nouveautés et mises à jour" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Sélection d’applications web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Autres logiciels" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s installée" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Un redémarrage est nécessaire pour terminer l’installation" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "L’application est maintenant opérationnelle" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Mises à jour du système installées" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Les mises à jour récemment installées sont maintenant consultables" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Redémarrer" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Lancer" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Installer le logiciel ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Installer le logiciel tiers ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Activer le dépôt logiciel ?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Activer les dépôts logiciels tiers ?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s n’est pas un logiciel libre et ouvert et est distribué " +"par « %s »." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s est distribué par « %s »." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Ce dépôt de logiciels doit être activé pour continuer l’installation." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Il peut être contraire à la loi d’installer et d’utiliser %s dans certains " +"pays." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Il peut être contraire à la loi d’installer et d’utiliser ce codec dans " +"certains pays." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Ne plus m’_avertir" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Activer et _installer" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Voici les détails des erreurs du gestionnaire de paquets :" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Détails" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Fermer" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Détails copiés dans le presse-papier" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Accepter" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Une mise à jour a été installée" +msgstr[1] "Des mises à jour ont été installées" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Une application a été désinstallée" +msgstr[1] "Des applications ont été désinstallées" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Un redémarrage est nécessaire pour terminer l’installation" +msgstr[1] "Un redémarrage est nécessaire pour terminer l’installation" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Pas maintenant" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Aujourd’hui" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Hier" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Il y a %d jour" +msgstr[1] "Il y a %d jours" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Il y a %d semaine" +msgstr[1] "Il y a %d semaines" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Il y a %d mois" +msgstr[1] "Il y a %d mois" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Il y a %d an" +msgstr[1] "Il y a %d ans" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "À l’instant" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Il y a %d minute" +msgstr[1] "Il y a %d minutes" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Il y a %d heure" +msgstr[1] "Il y a %d heures" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Tout" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "En vedette" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Graphisme en 3 dimensions" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Photographie" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Scan" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Dessin vectoriel" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visionneurs" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Créations et modifications audio" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Lecteurs de musique" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Tout" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "En vedette" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Agenda" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Base de données" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finance" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Traitement de texte" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Éditeurs de texte" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navigateurs web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Tout" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "En vedette" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Action" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventure" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocs" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Plateau" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartes" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Émulateurs" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Enfants" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logique" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Jeux de rôle" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sports" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Stratégie" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Tout" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "En vedette" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Discussion" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Tout" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "En vedette" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Intelligence artificielle" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomie" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chimie" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Langues" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Mathématiques" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Nouvelles" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotique" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Art" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biographie" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Bandes dessinées" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fiction" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Santé" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Histoire" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Style de vie" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politique" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sports" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Tout" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "En vedette" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Débogueurs" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "EDI" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecs" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Pilotes matériel" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Polices" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Sources de saisie" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Prise en charge linguistique" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Régionalisation" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Créer" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Travailler" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Jouer" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socialiser" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Apprendre" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Développer" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Pilotes matériel" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Polices" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Sources de saisie" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Prise en charge linguistique" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Régionalisation" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Une application" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s demande davantage de prise en charge du format du fichier." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Types MIME supplémentaires requis" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s demande davantage de polices." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Polices supplémentaires requises" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s demande davantage de codecs multimédia." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Codecs multimédia supplémentaires requis" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s demande davantage de pilotes d’imprimante." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Pilotes d’imprimante supplémentaires requis" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s demande davantage de paquets logiciels." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Paquets logiciels supplémentaires requis" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Démarrer Logiciels" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Afficher davantage" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Moins d’infos" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Suppression en cours…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Nécessite un redémarrage pour terminer l’installation" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Nécessite un redémarrage pour terminer la suppression" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Installation en attente…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Mise à jour en attente…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Téléchargement…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Préparation…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Désinstallation en cours…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s n’est pas installée, mais des données sont encore présentes." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Redémarrer" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "A_ctiver…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Installer…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s s’affichera en anglais américain" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Cette application s’affichera en anglais américain" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Ce logiciel s’affichera en anglais américain" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Aider à _traduire" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Autres applications par %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Le développeur %s a prouvé la propriété de %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Le développeur a prouvé la propriété de %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Un accès à Internet est indispensable pour rédiger une évaluation" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Cette application ne reçoit plus de mises à jour, y compris de correctifs de " +"sécurité" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Cette application fait déjà partie de votre distribution et ne devrait pas " +"être remplacée." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Cette application ne fournit aucun lien vers un site web, un dépôt de code " +"ou un outil de suivi d’anomalies." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Ce logiciel ne reçoit plus de mises à jour, y compris de correctifs de " +"sécurité" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Cette application fait déjà partie de votre distribution et ne devrait pas " +"être remplacée." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Ce logiciel ne fournit aucun lien vers un site web, un dépôt de code ou un " +"outil de suivi d’anomalie." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Impossible de récupérer les informations pour « %s » et d’afficher les " +"détails de cette application." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Réponse invalide reçue du serveur pour l’évaluation" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "La soumission de l’évaluation pour « %s » a échoué : %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Page des descriptions" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Chargement des détails de l’application" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Vérifié" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Ouvrir" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Mettre à _jour" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Désinstaller" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Extensions" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Cette application ne peut être utilisée qu’avec une connexion internet " +"active." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Dépôt de logiciels inclus" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Cette application inclut un dépôt de logiciels qui fournit les mises à jour " +"ainsi que l’accès à d’autres programmes." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Aucun dépôt de logiciels inclus" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Cette application n’inclut aucun dépôt de logiciels. Elle ne sera pas mise à " +"jour vers de nouvelles versions." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Dépôt de logiciels identifié" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Ajouter ce dépôt de logiciels vous donne accès à des logiciels " +"supplémentaires ainsi qu’aux mises à niveau." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "" +"N’utilisez que les dépôts de logiciels auxquelles vous faites confiance." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Effacer les données de l’application" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Supprim_er les données" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Aucune métadonnée" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Site _web du projet" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "Faire un _don" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Contribuer aux _traductions" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Signaler un problème" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Aid_e" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contacter" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Rédiger une évaluation" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Toutes les évaluations" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Impossible d’afficher les détails de l’application" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Impossible de préparer le redémarrage" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Erreur inconnue" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "La clé est introuvable" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "La clé n’est pas inscrite" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Inscription de la clé propriétaire machine (MOK) requise" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Suivant" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Secure Boot est activé pour cet appareil. Pour permettre l’activation de " +"nouveaux pilotes, une nouvelle clé propriétaire machine (MOK) doit être " +"inscrite. Un mot de passe vous sera demandé plus tard dans le processus. " +"Veuillez noter le mot de passe suivant, qui est associé à la clé :" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "" +"J’ai conservé une copie du _mot de passe de la clé propriétaire machine" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Redémarrer et inscrire…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instructions de configuration : veuillez lire attentivement" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Après redémarrage, un écran de configuration de l’appareil sera affiché. " +"Pour activer les nouveaux pilotes, effectuez les étapes suivantes :" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Sélectionnez « Inscire la clé propriétaire machine » ;\n" +"• Sélectionnez « Oui » pour inscrire les clés ;\n" +"• Saisissez le mot de passe lié à la clé propriétaire machine (MOK) lorsque " +"demandé ;\n" +"• Enfin, sélectionnez « Redémarrer »." + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Implications sur la sécurité" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Une fois l’inscription de la clé réussie, sachez que toute future mise à " +"jour de ce module ou de tout autre module fera l’objet d’une confiance " +"implicite. Toutes les futures mises à jour se feront de manière " +"transparente, sans interaction ni demande d’autorisation." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Plus d’informations peuvent être trouvées sur la page de documentation." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Téléchargement de fichiers de métadonnées supplémentaires…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " et " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Polices disponibles pour le script %s" +msgstr[1] "Polices disponibles pour les scripts %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Logiciel disponible pour %s" +msgstr[1] "Logiciels disponibles pour %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Logiciel demandé introuvable" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Impossible de trouver le logiciel demandé" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s sont introuvables" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "sur le site web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Aucune application disponible pour fournir le fichier %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Des informations sur %s, ainsi que des options sur la façon d’obtenir les " +"applications manquantes sont disponibles sur %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Aucune application disponible pour prendre en charge %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s est indisponible." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Des informations sur %s, ainsi que des options sur la façon d’obtenir une " +"application susceptible de prendre en charge ce format sont disponibles sur " +"%s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Aucune police n’est disponible pour la prise en charge du script %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Des informations sur %s, ainsi que des options sur la façon d’obtenir des " +"polices supplémentaires sont disponibles sur %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Aucun codec au format %s n’est disponible pour l’extension." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Des informations sur %s, ainsi que des options sur la façon d’obtenir un " +"codec susceptible de lire ce format sont disponibles sur %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" +"Aucune ressource pour plasma n’est disponible pour prendre en charge %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Des informations sur %s, ainsi que des options sur la façon d’obtenir des " +"ressources supplémentaires pour plasma sont disponibles sur %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Aucun pilote d’imprimante n’est disponible pour %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Des informations sur %s, ainsi que des options sur la façon d’obtenir un " +"pilote susceptible de prendre en charge cette imprimante sont disponibles " +"sur %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "la documentation" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Impossible de trouver le %s requis par %s. Veuillez consulter %s pour de " +"plus amples informations." +msgstr[1] "" +"Impossible de trouver les %s requis par %s. Veuillez consulter %s pour de " +"plus amples informations." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Impossible de trouver le %s que vous recherchez. Veuillez consulter %s pour " +"de plus amples informations." +msgstr[1] "" +"Impossible de trouver les %s que vous recherchez. Veuillez consulter %s pour " +"de plus amples informations." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Échec de la recherche, aucun résultat : %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Format de fichier %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "_Tout installer" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Impossible de trouver le logiciel demandé" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Page des Codecs" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Aucun résultat trouvé" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Impossible d’effectuer une recherche" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Précédent" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Suivant" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Liste des applications mises en avant" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Prise en charge de l’ordinateur" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Prend en charge l’utilisation sur un grand écran" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Prise en charge de l’ordinateur inconnue" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Pas assez d’informations pour savoir si les grands écrans sont pris en charge" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Nécessite un grand écran" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Ordinateur non pris en charge" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Non utilisable avec un grand écran" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Prise en charge du mobile" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Prend en charge l’utilisation sur un petit écran" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Prise en charge du mobile inconnue" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Pas assez d’informations pour savoir si les petits écrans sont pris en charge" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Nécessite un petit écran" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobile non pris en charge" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Non utilisable avec un petit écran" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Prise en charge du clavier" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Prise en charge du clavier inconnue" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" +"Pas assez d’informations pour savoir si les claviers sont pris en charge" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Clavier requis" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Prend en charge les claviers" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Clavier non pris en charge" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Non utilisable avec un clavier" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Prise en charge de la souris" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Nécessite une souris ou un périphérique de pointage" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Prise en charge de la souris inconnue" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Pas assez d’informations pour savoir si les souris ou les périphériques de " +"pointage sont pris en charge" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Souris requise" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Prend en charge les souris et les périphériques de pointage" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Souris non prise en charge" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Non utilisable avec une souris ou un périphérique de pointage" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Prise en charge de l’écran tactile" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Prise en charge de l’écran tactile inconnue" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Pas assez d’informations pour savoir si les écrans tactiles sont pris en " +"charge" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Écran tactile requis" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Prend en charge les écrans tactiles" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Écran tactile non pris en charge" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Non utilisable avec un écran tactile" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Manette de jeu requise" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Nécessite une manette de jeu" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Prise en charge de la manette de jeu" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Prend en charge les manettes de jeu" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s fonctionne probablement sur ce périphérique" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s fonctionne sur ce périphérique" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s peut fonctionner sur ce périphérique" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s ne fonctionnera pas correctement sur ce périphérique" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s ne fonctionnera pas sur ce périphérique" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Prise en charge du matériel" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigation" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Aller à la page « Explorer »" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Aller à la page « Installées »" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Aller à la page « Mises à jour »" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Ouvrir la barre de recherche" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Fenêtres" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Ouvrir les préférences" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Ouvrir les dépôts de logiciels" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Aide" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Ouvrir les raccourcis clavier" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Installées" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Page installée" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "En cours" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Applications" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Applications web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Applications système" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Construit par la communauté" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Comment participer" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Il s’agit d’une application libre développée par une communauté " +"internationale, et publiée sous la licence %s.\n" +"\n" +"Vous pouvez participer et aider à son amélioration." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Il s’agit d’une application libre développée par une communauté " +"internationale, et publiée sous licence %s.\n" +"\n" +"Vous pouvez participer et aider à son amélioration." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Il s’agit d’un logiciel libre développé par une communauté internationale, " +"et publié sous licence %s.\n" +"\n" +"Vous pouvez participer et aider à son amélioration." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Il s’agit d’un logiciel libre développé par une communauté internationale, " +"et publié sous licence %s.\n" +"\n" +"Vous pouvez participer et aider à son amélioration." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Licence inconnue" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_En savoir plus" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Cette application ne spécifie pas la licence sous laquelle elle est " +"développée et peut être propriétaire. Elle pourrait comporter des failles de " +"sécurité difficiles à détecter, et elle pourrait être modifiée sans " +"avertissement.\n" +"\n" +"Vous pourriez ne pas être en mesure de contribuer à cette application." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ce logiciel ne spécifie pas la licence sous laquelle il est développé et " +"peut être propriétaire. Il pourrait comporter des failles de sécurité " +"difficiles à détecter, et il pourrait être modifié sans avertissement.\n" +"\n" +"Vous pourriez ne pas être en mesure de contribuer à ce logiciel." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Propriétaire" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Il s’agit d’une application non libre ; seuls ses développeurs connaissent " +"son fonctionnement. Elle pourrait comporter des failles de sécurité " +"difficiles à détecter, et elle peut être modifiée sans avertissement.\n" +"\n" +"Vous ne pourrez pas contribuer à ce logiciel." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Il s’agit d’un logiciel non libre ; seuls ses développeurs connaissent son " +"fonctionnement. Il pourrait comporter des failles de sécurité difficiles à " +"détecter, et il peut être modifié sans avertissement.\n" +"\n" +"Vous ne pourrez peut-être pas contribuer à ce logiciel." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Licence spéciale" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Cette application est développée sous la licence spéciale %s.\n" +"\n" +"Vous pourriez ne pas être en mesure de contribuer à cette application." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Cette application est développée sous la licence spéciale « %s ».\n" +"\n" +"Vous pourriez ne pas être en mesure de contribuer à cette application." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ce logiciel est développé sous la licence spéciale %s.\n" +"\n" +"Vous pourriez ne pas être en mesure de contribuer à ce logiciel." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ce logiciel est développé sous la licence spéciale « %s ».\n" +"\n" +"Vous pourriez ne pas être en mesure de contribuer à ce logiciel." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Actualisation des données" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Chargement de la page" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Démarrage" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Source inconnue" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Bêta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Utilisateur" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Ajouts" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Suppressions" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Mises à jour" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Retour à des versions antérieures" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "sources externes sélectionnées" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Fournit l’accès à des logiciels supplémentaires à partir de %s. Certains " +"logiciels propriétaires sont inclus.\n" +"\n" +"Vous pouvez activer ces dépôts plus tard dans les paramètres des Dépôts de " +"logiciels." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Activer les dépôts logiciels tiers ?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorer" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "A_ctiver" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Disponible pour votre système d’exploitation" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Disponible pour %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Explorer" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Page d’aperçu" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Applications disponibles" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Autres catégories" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Aucune donnée trouvée pour l’application" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Inconnue" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Valider" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "L’utilisateur a refusé l’installation" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Préparation de %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Voulez-vous vraiment supprimer le dépôt %s ?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Toutes les applications de %s vont être désinstallées, et il vous faudra " +"réinstaller le dépôt afin de pouvoir les utiliser à nouveau." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Désinstaller %s ?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Il ne sera plus possible d’utiliser %s après la suppression." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Toute application dépendant de %s ne sera plus utilisable après la " +"suppression." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Il ne sera plus possible d’utiliser %s après la suppression et tout document " +"l’utilisant sera affiché avec une police différente." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Il ne sera plus possible d’utiliser %s après la suppression. Cela peut " +"signifier que certains fichiers média ne pourront plus être lus." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Le matériel dépendant de %s pourrait ne plus fonctionner correctement après " +"la suppression." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Il ne sera plus possible d’utiliser %s après la suppression. Les données de " +"l’application seront conservées sur le disque, pour permettre sa " +"restauration dans le futur." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Préférences" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Mises à jour" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Davantage d’informations" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"La vérification et le téléchargement des mises à jour utilise des données et " +"de l’énergie. Les fonctions de mise à jour automatique sont donc suspendues " +"lorsqu’une connexion avec quota est utilisée ou lorsque le mode économie " +"d’énergie est activé." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatiques" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Télécharger et installer automatiquement les mises à jour" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manuelles" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" +"La vérification et le téléchargement des mises à jour doivent être faits " +"manuellement" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Notifications de mise à jour automatique" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "" +"Envoyer une notification lorsque des mises à jour ont été installées " +"automatiquement" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtres de contenu" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "N’afficher que les logiciels _libres" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "" +"Cacher les logiciels propriétaires pendant la navigation et la recherche" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "N’afficher que les développeurs _vérifiés" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"N’afficher que les applications dont l’identité des développeurs a été " +"vérifiée" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Certains logiciels actuellement installés sont incompatibles avec %s et ils " +"vont être supprimés automatiquement durant la mise à jour." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Logiciels incompatibles" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Mettre à jour" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Désinstaller" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Paramètres et données de l’application" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Conserver" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Permet de restaurer le contenu et les paramètres de l’application" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Supprimer" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Supprime définitivement les données pour économiser de l’espace disque" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Les logiciels installés depuis « %s » cesseront de recevoir des mises à jour." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Désactiver le dépôt ?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Supprimer le dépôt ?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Désactiver" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Supprimer" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Activer les nouveaux dépôts" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Activer les nouveaux dépôts lorsqu’ils sont ajoutés" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "davantage d’informations" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Dépôts supplémentaires provenant de tierces parties — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Dépôts tiers Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "le système d’exploitation" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Ces dépôts complètent les logiciels par défaut fournis par %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Dépôts de logiciels" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Aucun dépôt" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u application installée" +msgstr[1] "%u applications installées" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u extension installée" +msgstr[1] "%u extensions installées" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u application" +msgstr[1] "%u applications" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u extension" +msgstr[1] "%u extensions" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s et %s installée" +msgstr[1] "%s et %s installées" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Vérification du logiciel installé…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Supprimer" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Détestable" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Passable" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Acceptable" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Bonne" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Excellente" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Sélectionnez une étoile pour indiquer votre évaluation" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Veuillez consacrer plus de temps à la rédaction de l’appréciation" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Veuillez choisir une appréciation" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Le résumé est trop court" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Le résumé est trop long" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "La description est trop courte" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "La description est trop longue" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Rédiger une évaluation" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Envoyer" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Veuillez fournir une note, un résumé et une évaluation. Les évaluations ne " +"doivent pas être utilisés pour signaler des problèmes : contactez plutôt le " +"développeur ou votre fournisseur de services d’assistance." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Résumé des évaluations" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Rédiger une courte évaluation" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Vous trouverez la liste des données transmises dans notre politique de confidentialité. Le nom complet " +"associé à votre compte sera affiché publiquement." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u appréciation au total" +msgstr[1] "%u appréciations au total" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "sur 5 étoiles" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Inconnu" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Vous pouvez signaler les appréciations abusives, insultantes, ou " +"discriminantes." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Une fois envoyée, l’appréciation sera masquée jusqu’à ce que celle-ci ait " +"été vérifiée par un administrateur." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Signaler l’appréciation ?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Signaler" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Supprimer l’appréciation ?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "La suppression d’une appréciation ne peut pas être annulée." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Voter pour l’évaluation" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Ne plus voter pour l’évaluation" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Signaler…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Supprimer…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"L’application ne s’exécute pas dans un bac à sable mais la distribution a " +"vérifié qu’elle n’est pas malveillante" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Vérifiez que vous faites confiance au fournisseur, car l’application ne " +"s’exécute pas dans un bac à sable" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Aucune permission" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "L’application s’exécute dans un bac à sable" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Accès au réseau" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Peut accéder à Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Aucun accès au réseau" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Ne peut pas accéder à Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Utilise les services système" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Peut demander des données aux services système" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Utilise les services de session" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Peut demander des données aux services de session" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Accès aux périphériques de l’utilisateur" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Peut accéder à des périphériques tels que des webcams ou des contrôleurs de " +"jeu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Aucun accès aux périphériques de l’utilisateur" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Ne peut pas accéder à des périphériques tels que des webcams ou des " +"contrôleurs de jeu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Accès aux périphériques d’entrée" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Accès au microphone et lecture audio" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Peut écouter à l’aide de microphones et jouer de l’audio sans demander la " +"permission" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Accès aux périphériques du système" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Peut accéder aux périphériques qui exigent un haut niveau de permissions" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Accès au contenu de l’écran" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Peut accéder au contenu de l’écran ou aux autres fenêtres" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Système de fenêtrage désuet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Permissions arbitraires" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Paramètres utilisateur" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Accès complet en lecture/écriture au système de fichiers" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "" +"Peut lire et écrire toutes les données contenues dans le système de fichiers" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Accès en lecture/écriture au dossier personnel" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "" +"Peut lire et écrire toutes les données contenues dans votre dossier personnel" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Accès complet en lecture au système de fichiers" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Peut lire toutes les données contenues dans le système de fichiers" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Accès en lecture au dossier personnel" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Peut lire toutes les données contenues dans votre dossier personnel" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Accès en lecture/écriture au dossier de téléchargement" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "" +"Peut lire et écrire toutes les données contenues dans votre répertoire de " +"téléchargements" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Accès en lecture au dossier de téléchargement" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "" +"Peut lire toutes les données contenues dans votre répertoire de " +"téléchargements" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Peut lire et écrire toutes les données contenues dans le dossier" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Peut lire toutes les données contenues dans le dossier" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Aucun accès au système de fichiers" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Ne peut en aucun cas accéder au système de fichiers" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Le développeur de l’application est vérifié" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Les développeurs de cette application ont été vérifiés et sont bien ceux " +"qu’ils prétendent être" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Dépendances non sécurisées" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Le logiciel ou ses dépendances ne sont plus pris en charge et peuvent ne pas " +"être sécurisés" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Cette application ne spécifie pas la licence sous laquelle elle est " +"développée, et peut être une application propriétaire" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Ce logiciel ne spécifie pas la licence sous laquelle il est développé, et " +"peut être un logiciel propriétaire" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Code propriétaire" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Le code source n’est pas public, il ne peut donc pas être vérifié de manière " +"indépendante et peut être non fiable" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Cette application est développée sous la licence spéciale « %s »" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Ce logiciel est développé sous la licence spéciale « %s »" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Code vérifiable" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Le code source est public et peut être vérifié de manière indépendante, ce " +"qui rend l’application plus fiable" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s est privilégiée" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s est fiable" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s est probablement fiable" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s est potentiellement non fiable" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s est non fiable" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Inconnue" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Sécurité" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licence" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Source" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Cette application utilise une version obsolète de la plaforme logicielle " +"(SDK) et pourrait contenir des bogues ou des failles de sécurité qui ne " +"seront pas corrigés." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Capture d’écran précédente" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Capture d’écran suivante" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Aucune capture d’écran" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Capture d’écran introuvable" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Échec de chargement de l’image" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Taille de capture d’écran introuvable" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Impossible de créer le cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Capture d’écran non valide" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Capture d’écran indisponible" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Capture d’écran" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "plus %u correspondance" +msgstr[1] "plus %u correspondances" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Page de recherche" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Rechercher des applications" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Aucune application trouvée" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "« %s »" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "Impossible de télécharger les mises à jour" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "Impossible de télécharger les mises à jour du micrologiciel" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Impossible de télécharger les mises à jour du micrologiciel depuis %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Impossible de télécharger les mises à jour depuis %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "Impossible de mettre à jour : accès à Internet requis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "Impossible de mettre à jour : espace disque insuffisant" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Impossible de télécharger les mises à jour depuis %s : espace disque " +"insuffisant" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "Impossible de mettre à jour : authentification requise" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "Impossible de mettre à jour : authentification non valide" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "Impossible de mettre à jour : permission requise" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Impossible de télécharger les mises à jour : vous n’avez pas la permission " +"d’installer des logiciels" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "Impossible d’obtenir la liste des mises à jour" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "Impossible d’installer : échec du téléchargement" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Impossible d’installer %s : échec du téléchargement depuis %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Impossible d’installer %s : échec du téléchargement" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "Impossible d’installer : moteur d’exécution manquant" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Impossible d’installer %s : environnement d’exécution %s indisponible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "Impossible d’installer %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "Impossible d’installer : accès à Internet requis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "Impossible d’installer : format de l’application non valide" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "Impossible d’installer : espace disque insuffisant" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Impossible d’installer %s : espace disque insuffisant" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "Impossible d’installer : authentification requise" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Impossible d’installer %s : authentification requise" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "Impossible d’installer : authentification non valide" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Impossible d’installer %s : authentification non valide" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "Impossible d’installer : permission requise" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Impossible d’installer %s : permission requise" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "Impossible d’installer : branchez l’alimentation secteur" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Impossible d’installer %s : branchez l’alimentation secteur" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "Impossible d’installer : batterie faible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Impossible d’installer %s : batterie faible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Impossible de mettre à jour %s depuis %s : échec du téléchargement" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Impossible de mettre à jour %s : échec du téléchargement" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Impossible d’installer les mises à jour depuis %s : échec du téléchargement" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "Impossible de mettre à jour : échec du téléchargement" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Impossible de mettre à jour %s : espace disque insuffisant" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Impossible de mettre à jour %s : authentification requise" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Impossible de mettre à jour %s : authentification non valide" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Impossible de mettre à jour %s : permission requise" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "Impossible de mettre à jour : branchez l’alimentation secteur" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Impossible de mettre à jour %s : branchez l’alimentation secteur" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "Impossible de mettre à jour : batterie faible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Impossible de mettre à jour %s : batterie faible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "Impossible de mettre à jour %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "Impossible de mettre à jour" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "Impossible de mettre à niveau" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Impossible de mettre à niveau vers %s depuis %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "Impossible de mettre à niveau : échec du téléchargement" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Impossible de mettre à niveau %s : échec du téléchargement" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "Impossible de mettre à niveau vers : accès à internet requis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Impossible de mettre à niveau vers %s : accès à internet requis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "Impossible de mettre à niveau : espace disque insuffisant" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Impossible de mettre à niveau vers %s : espace disque insuffisant" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "Impossible de mettre à niveau : authentification requise" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Impossible de mettre à niveau vers %s : authentification requise" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "Impossible de mettre à niveau : authentification non valide" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Impossible de mettre à niveau vers %s : authentification non valide" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "Impossible de mettre à niveau : permission requise" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Impossible de mettre à niveau vers %s : permission requise" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Impossible de mettre à niveau : branchez l’alimentation secteur" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Impossible de mettre à niveau vers %s : branchez l’alimentation secteur" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "Impossible de mettre à niveau : batterie faible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Impossible de mettre à niveau vers %s : batterie faible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Impossible de mettre à niveau vers %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "Impossible de désintaller : authentification requise" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Impossible de désintaller %s : authentification requise" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "Impossible de désintaller : authentification non valide" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Impossible de désintaller %s : authentification non valide" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "Impossible de désinstaller : permission requise" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Impossible de désinstaller %s : permission requise" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Impossible de désinstaller : branchez l’alimentation secteur" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Impossible de désinstaller %s : branchez l’alimentation secteur" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "Impossible de désinstaller : batterie faible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Impossible de désinstaller %s : batterie faible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Impossible de désinstaller %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "Impossible de démarrer %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "Désolé, quelque chose n’a pas marché" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Impossible de lancer %s : %s n’est pas installé" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "Espace disque insuffisant pour l’opération" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "Impossible de désinstaller : type de fichier non pris en charge" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "Impossible d’installer : l’authentification a échoué" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "Impossible d’installer" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "Impossible de contacter %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "Redémarrer Logiciels pour utiliser les nouveaux greffons" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "L’appareil doit être branché au secteur" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "Niveau de batterie trop faible" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Dépôts de logiciels" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Préférences" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Raccourcis clavier" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "À propos de _Logiciels" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Rechercher" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menu principal" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Rechercher des applications" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Explorer" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Installées" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Mises à jo_ur" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Retourner en arrière" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Aucune" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Données d’application" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Données nécessaires à l’exécution de l’application" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Données d’utilisateur" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Données créées par vous dans l’application" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Données de cache" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Données mises en cache de façon temporaire" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "L’application elle-même" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dépendances requises" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Composants système partagés requis par cette application" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Inconnue" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Les données mises en cache peuvent être effacées à partir des _paramètres de l’application." + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Stockage" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (installée)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (installation en cours)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (téléchargement en cours)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (suppression en cours)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Détails" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examiner" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Installées le %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Mises à jour installées" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Aucune mise à jour installée" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Les mises à jour sont obsolètes" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Veuillez rechercher des mises à jour disponibles" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Mise à jour critique prête à l’installation" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Installez les mises à jour critiques le plus rapidement possible" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Mises à jour critiques disponibles au téléchargement" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Téléchargez les mises à jour critiques le plus rapidement possible" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Mises à jour prêtes à l’installation" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "" +"Des mises à jour logicielles sont prêtes à être installées et en attente" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Mises à jour disponibles au téléchargement" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Des mises à jour logicielles peuvent être téléchargées" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u application mise à jour — Redémarrage requis" +msgstr[1] "%u applications mises à jour — Redémarrage requis" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u application mise à jour" +msgstr[1] "%u applications mises à jour" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s a été mise à jour." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Veuillez redémarrer l’application." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s et %s ont été mises à jour." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u application nécessite un redémarrage." +msgstr[1] "%u applications nécessitent un redémarrage." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inclut %s, %s et %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Le système a atteint sa fin de vie" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Mettez à niveau pour continuer à bénéficier des mises à jour" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Une nouvelle version de %s est disponible à l’installation" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Des mises à niveau logicielles sont disponibles" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Échec des mises à jour logicielles" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Les mises à jour préparées n’ont pas été installées" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Afficher les détails" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Mise à niveau système terminée" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Bienvenue dans %s %s !" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Mise à jour logicielle installée" +msgstr[1] "Mises à jour logicielles installées" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "" +"Une importante mise à jour du système d’exploitation a été installée." +msgstr[1] "" +"D’importantes mises à jour du système d’exploitation ont été installées." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Consulter" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Échec de mise à jour" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Le système était déjà à jour." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "La mise à jour a été annulée." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"L’accès à Internet est nécessaire mais n’est pas disponible. Assurez-vous " +"d’avoir un accès à Internet puis réessayez." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Il y a eu un problème de sécurité avec la mise à jour. Veuillez consulter " +"votre fournisseur de logiciels pour plus d’informations." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Il n’y avait pas assez d’espace disque. Veuillez en libérer et réessayez." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Nous sommes désolés : l’installation de la mise à jour à échoué. Veuillez " +"attendre la prochaine mise à jour et réessayer. Si le problème persiste, " +"contactez le fournisseur du logiciel." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Dernière vérification : %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Arrêter" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Rechercher des mises à jour" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ne reçoit plus les mises à jour pour les logiciels essentiels" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Votre système d’exploitation ne reçoit plus les mises à jour des logiciels " +"essentiels" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Il peut y avoir facturation" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Rechercher des mises à jour avec votre connexion mobile peut faire l’objet " +"d’une facturation." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Rechercher _quand même" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Mises à niveau logicielles téléchargées" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Les mises à jour sont prêtes être installées" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Rechercher des mises à jour" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Mises à jour" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Page des mises à jour" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Chargement des mises à jour" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Cela pourrait prendre du temps" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "À jour" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Utiliser les données mobiles ?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Rechercher des mises à jour avec votre connexion mobile pourrait faire " +"l’objet d’une facturation" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Rechercher quand même" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Aucune connexion" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Se connecter pour rechercher des mises à jour" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Paramètres du _réseau" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Erreur" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Les mises à jour sont gérées automatiquement" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Pause des mises à jour logicielles" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Les mises à jour automatiques ont été mises en pause pour les raisons " +"suivantes :\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• La connexion réseau actuelle est avec une connexion avec quota" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• La connexion réseau actuelle ne permet pas d’effectuer des téléchargements " +"importants" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Le mode économie d’énergie est activé" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Le mode jeu est activé" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Pause des mises à jour logicielles" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"La connexion réseau est avec une connexion avec quota — les mises à jour " +"logicielles sont en pause" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"La connexion réseau ne permet pas d’effectuer des téléchargements importants " +"— les mises à jour logicielles sont en pause" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"Le mode économie d’énergie est activé — les mises à jour logicielles sont en " +"pause" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Le mode jeu est activé — les mises à jour logicielles sont en pause" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Redémarrer et mettre à jour…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_Tout mettre à jour" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Mises à jour logicielles téléchargées" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Les mises à jour sont prêtes à être installées" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Micrologiciel intégré" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Redémarrage nécessaire" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Mises à jour des applications" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Micrologiciel du périphérique" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Télécharger" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s disponible" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s disponible" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "En apprendre davantage sur la nouvelle version" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s sur %s téléchargé" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u %% téléchargé" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "" +"Une mise à niveau majeure, avec de nouvelles fonctionnalités et plus belle." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Annuler la mise à jour" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Redémarrer et mettre à jour…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"N’oubliez pas de sauvegarder vos données et fichiers avant la mise à niveau." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Détails de l’erreur" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Copier les détails" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Impossible de supprimer le fichier « %s » : %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Impossible de supprimer le répertoire « %s » : %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "" +"Ajouter, supprimer ou mettre à jour des applications sur cet ordinateur" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"mises à jour;mise à niveau;sources;dépôts;préférences;installer;désinstaller;" +"programmes;logiciels;applications;magasin;boutique;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s prête" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"L’application %s est prête à être activée et programmée pour le prochain " +"redémarrage." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Activer" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Mises à jour système" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Mises à jour générales du système, telles que la sécurité ou les corrections " +"d’anomalies, et améliorations des performances." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Une mise à jour %s avec de nouvelles fonctionnalités et corrections." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Le service de mise à jour d’Endless OS n’a pas pu récupérer et appliquer la " +"mise à niveau." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Application web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Prise en charge d’applications web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Exécuter des applications web connues dans un navigateur" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Mise à niveau pour les dernières fonctionnalités et améliorations de " +"stabilité et de performances." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Prise en charge de Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak est une structure pour les applications de bureau sous Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Dossier système %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Sous-dossier personnel %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Dossiers du système hôte" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Configuration du système hôte à partir de /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Dossier Bureau" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Sous-dossier Bureau %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Dossier Documents" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Sous-dossier Documents %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Dossier Musique" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Sous-dossier Musique %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Dossier Images" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Sous-dossier Images %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Dossier partagé public" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Sous-dossier partagé public %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Dossier Vidéos" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Sous-dossier Vidéos %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Dossier Modèles" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Sous-dossier Modèles %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Dossier personnel de cache" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Sous-dossier personnel de cache %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Dossier personnel de configuration" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Sous-dossier personnel de configuration %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Dossier personnel de données" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Sous-dossier personnel de données %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Dossier personnel d’exécution" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Sous-dossier personnel d’exécution %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Accès au système de fichiers dans %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Téléchargement des métadonnées de Flatpak pour %s…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Impossible d’affiner l’extension « %s » : %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Installation utilisateur" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Installation système" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Identifiant d’application" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Impossible d’ajouter l’extension « %s » à l’installation : %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Impossible d’ajouter l’extension « %s » à la désinstallation : %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"« %s » distant ne permet pas l’installation de « %s », peut-être en raison " +"de son filtre. Enlevez le filtre et répétez l’installation. Erreur " +"détaillée : %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "" +"L’alimentation du système est trop faible pour effectuer la mise à jour" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"L’alimentation du système est trop faible pour effectuer la mise à jour " +"(%u%%, %u%% nécessaires)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "L’appareil est inaccessible ou hors de portée" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "La batterie de l’appareil est trop peu chargée" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"La batterie de l’appareil est trop peu chargée (%u%%, %u%% nécessaires)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "L’appareil attend que la mise à jour soit appliquée" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "L’appareil attend que l’alimentation soit connectée" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "L’appareil ne peut pas être utilisé lorsque l’écran est rabattu" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Mise à jour du périphérique « %s »" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Mise à jour système « %s »" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Mise à jour du contrôleur embarqué « %s »" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Mise à jour du système de gestion (« ME ») de %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Mise à jour du système de gestion pour entreprises de « %s »" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Mise à jour du système de gestion pour le grand public de « %s »" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Mise à jour du contrôleur « %s »" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Mise à jour du contrôleur Thunderbolt « %s »" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Mise à jour du microcode du processeur « %s »" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Mise à jour de la configuration de « %s »" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Mise à jour de la batterie « %s »" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Mise à jour de la caméra « %s »" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Mise à jour du module de plate-forme fiable (« TPM ») « %s »" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Mise à jour du pavé tactile « %s »" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Mise à jour de la souris « %s »" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Mise à jour du clavier « %s »" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Mise à jour du contrôleur de stockage « %s »" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Mise à jour de l’interface réseau « %s »" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Mise à jour de l’écran « %s »" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Mise à jour du système de gestion (« BMC ») de %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Mise à jour du récepteur USB « %s »" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Mise à jour du périphérique disque « %s »" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Mise à jour du périphérique flash « %s »" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Mise à jour du SSD « %s »" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Mise à jour du processeur graphique (« GPU ») « %s »" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Mise à jour de la station d’accueil « %s »" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Mise à jour de la station d’accueil USB « %s »" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Micrologiciel" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "La mise à jour du micrologiciel n’a pu être appliquée : " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Prise en charge de la mise à niveau du micrologiciel" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Fournit la prise en charge des mises à niveau du micrologiciel" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Installer le logiciel non signé ?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Le logiciel à installer n’est pas signé. Il ne sera pas possible de vérifier " +"l’origine des mises à jour de ce logiciel, ou si les mises à jour ont été " +"falsifiées." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Télécharger le logiciel non signé ?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Des mises à jour non signées sont disponibles. Sans une signature, il est " +"impossible de vérifier l’origine d’une mise à jour, ou de savoir si elle a " +"été falsifiée." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Mettre à jour le logiciel non signé ?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Des mises à jour non signées sont disponibles. Sans une signature, il est " +"impossible de vérifier l’origine d’une mise à jour, ou de savoir si elle a " +"été falsifiée. Les mises à jour logicielles seront désactivées jusqu’à ce " +"que les mises à jour non signées soient supprimées ou mises à jour." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Échec de l’installation des mises à jour : " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paquets" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "" +"L’attente de la fin des transactions avant le téléchargement a échoué : " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Échec de téléchargement des mises à jour : " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Échec de déclenchement des mises à jour : " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Système d’exploitation (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Boutique des snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Prise en charge de Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Un snap est un paquet Linux universel" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Système" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Composant système" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Échec de la suppression de la tâche sysupdate « %s » avec l’état %i" diff --git a/po/fur.po b/po/fur.po new file mode 100644 index 0000000..90aaf1c --- /dev/null +++ b/po/fur.po @@ -0,0 +1,8659 @@ +# Friulian translation for gnome-software. +# Copyright (C) 2016 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Fabio Tomat , 2016, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software gnome-3-20\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-09-25 17:50+0000\n" +"PO-Revision-Date: 2024-10-18 19:49+0000\n" +"Last-Translator: Fabio T. \n" +"Language-Team: Friulian \n" +"Language: fur\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-Editor: HaiPO 2.0 beta\n" +"X-Generator: Poedit 3.4.2\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instale e inzorne lis aplicazions" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Software ti permet di cjatâ e instalâ gnovis aplicazions e estensions di " +"sisteme e di gjavâ aplicazions instaladis." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system" +" using an offline update." +msgstr "" +"Software al met in evidence te vetrine lis aplicazions popolârs cun " +"descrizions utilis e tantis videadis par ogni aplicazion. Al è pussibil " +"cjatâ lis aplicazions sedi esplorant la liste des categoriis, sedi doprant " +"la ricercje. Ti permet ancje di inzornâ il sisteme doprant un inzornament " +"fûr rêt." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panel di panoramiche" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panel di detais" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panel instalâts" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel inzornaments" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "I detais dal inzornament" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2625 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Il progjet GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Prove la clâf akmods in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"La autenticazion e je necessarie par provâ la clâf akmods in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Regjistre la clâf akmods su Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"La autenticazion e je necessarie par regjistrâ la clâf akmods su Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Prove la clâf DKMS in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "La autenticazion e je necessarie par provâ la clâf DKMS in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Regjistre la clâf DKMS su Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" +"La autenticazion e je necessarie par regjistrâ la clâf DKMS su Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalâ un file “appstream” intune posizion dal sisteme" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Daûr a instalâ un file “appstream” intune posizion dal sisteme" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Une liste di progjets compatibii" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Cheste e je une liste di progjets compatibii che si varessin di mostrâ, come" +" GNOME, KDE e XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Indiche se gjestî i inzornaments e i avanzaments in GNOME Software" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Se disabilitât, GNOME Software al platarà il panel dai inzornaments, nol " +"metarà in vore nissune azion di inzornament automatic e nol domandarà di " +"inzornâ." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Discjarie e instale in automatic i inzornaments" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Se abilitât, GNOME Software al discjarie in automatic i inzornaments " +"software in sotfont, e ancje al instale chei che no àn bisugne che si torni " +"a inviâ il sisteme." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notifiche l'utent sul software inzornât in sotfont" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Se abilitât, GNOME Software al notifiche l'utent sui inzornaments fats " +"intant che l'utent al jere inatîf." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Indiche se tignî inzornât in automatic cuant che si è suntune conession a " +"consum" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Se abilitât, GNOME Software si tignarà inzornât in automatic par daûr ancje " +"se si dopre une conession a consum (finint duncje par discjariâ cualchi " +"meta-dât, controlâ la presince di inzornaments e vie indenant, chest al pues" +" duncje puartâ a spesis pal utent)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Indiche se e je la prime volte che si eseguìs GNOME Software" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Mostre lis stelutis di valutazion in bande des aplicazions" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtre aplicazions basadis sul ram predefinît pal terminâl lontan" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Prime di instalâlis, lis aplicazions no libaris a mostraran un dialic di " +"avertiment" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This" +" controls if that dialog is suppressed." +msgstr "" +"Cuant che lis aplicazions no libaris a vegnin instaladis, al è pussibil che " +"al vegni mostrât un dialic di avertiment. Chest al verifiche se chel barcon " +"al è soprès." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "La date dal control dal ultin inzornament" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "La date de ultime notifiche di avanzament" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "La date de ultime notifiche di inzornament" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "La date dal prin inzornament di sigurece, netât dopo l'inzornament" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "La date dal ultin inzornament" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"La etât in seconts par verificâ che la schermade da cjâf e sedi ancjemò " +"valide" + +# rount-trips -> andis e riandis -> ?? +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0" +" means to never check the server if the image already exists in the cache." +msgstr "" +"Sielzint un valôr plui larc al significhe vê mancul ladis e tornadis al " +"servidôr lontan ma ancje che i inzornaments aes videadis caturadis a duraran" +" di plui prime che a vegnin mostradis al utent. Un valôr di 0 al significhe " +"che il servidôr nol à mai di controlâ se la imagjin e esist inte memorie " +"cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Il servidôr di doprâ pes recensions des aplicazions" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "I ponts minims di karma pes recensions" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Recensions cun karma inferiôr a chest numar no vignaran mostradis." + +#: data/org.gnome.software.gschema.xml:86 +msgid "" +"A list of official repositories that should not be considered 3rd party" +msgstr "" +"Une liste di dipuesits uficiâi che no varessin di jessi considerâts di " +"tiercis parts" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Une liste di dipuesits necessaris che nol è pussibil disabilitâ o gjavâ" + +#: data/org.gnome.software.gschema.xml:94 +msgid "" +"A list of official repositories that should be considered free software" +msgstr "" +"Une liste di dipuesits uficiâi che a varessin di jessi considerâts software " +"libar" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free " +"software" +msgstr "" +"Il URL di licence di doprâ cuant che une aplicazion e varès di jessi " +"considerade software libar" + +#: data/org.gnome.software.gschema.xml:102 +msgid "" +"Install bundled applications for all users on the system where possible" +msgstr "" +"Instale i pachets di aplicazions par ducj i utents dal sisteme, dulà che al " +"è pussibil" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Permet l'acès al dialic dai dipuesits software" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Ufrìs avanzaments par distribuzions preliminaris" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Mostre cualchi element te IU par informâ l'utent che une aplicazion no je " +"libare" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Mostre la dimension instalade pes apps inte liste des aplicazions instaladis" + +#. Translators: Replace the link with a version in your language, e.g. +#. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include +#. ''. +# fâ pagjine par software proprietari su vikipedie +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://it.wikipedia.org/wiki/Software_proprietario'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Il URI che al spieghe il software proprietari e no libar" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Une liste di file che a pontin a file “appstream” che a vignaran discjariâts" +" intune cartele swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instale i files “AppStream” suntune posizion a nivel di sisteme par ducj i " +"utents. Se fals, i files a vignaran instalâts te cartele no-standard " +"$XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm," +" snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Ordin di prioritât dai formâts di pachets di preferî, cui formâts plui " +"impuartants listâts par prime. Un array vueit al significhe doprâ l'ordin " +"predefinît. I formâts lassâts fûr si presum di listâju par ultins. Esemplis " +"di formâts di pachets a son: deb, flatpak, rpm, snap. Al è pussibil spcificâ" +" in maniere opzionâl i formâts cunt non di origjin, dividût dal caratar “:” " +"(doi ponts), par esempli 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"La marche temporâl dal ultin tentatîf di gjavâ i “runtimes” di Flatpak no " +"doprâts" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Met a 'true' (vêr) par mostrâ dome lis aplicazions cun licence libare e " +"platâ dutis lis aplicazions proprietariis." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Met a 'true' (vêr) par mostrâ dome lis aplicazions di svilupadôrs cu la " +"identitât verificade." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "La marche temporâl dai ultins inzornaments storics ricevûts." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Une stringhe che e memorize il ID par jentrâ tal account online di gnome" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Instaladôr a nivel di sisteme di AppStream di GNOME Software" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "No si è rivâts a analizâ i argoments de rie di comant" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Si scugne specificâ juste un non di file" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Dome l'utent “root” al pues doprâ chest program" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Impussibil validâ il gjenar di contignût: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Nol è stât pussibil spostâ: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instale software" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instale il software selezionât tal sisteme" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violence dai cartons animâts" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nissune informazion in merit ae violence dai cartons animâts" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violence fantasy" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nissune informazion in merit ae violence di fantasie" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violence realistiche" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nissune informazion in merit ae violence realistiche" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violence che e rafigure sparniçament di sanc" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Nissune informazion in merit a sanc" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violence sessuâl" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nissune informazion in merit ae violence sessuâl" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcul" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nissune informazion in merit ai riferiment a bevandis alcolichis" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narcotics" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nissune informazion in merit ai riferiments a droghis ilecitis" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabac" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "" +"Nissune informazion in merit a riferiments a prodots derivâts dal tabac" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Crotarie" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nissune informazion in merit ae crotarie di cualsisei gjenar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Temis sessuâi" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Nissun informazion in merit a riferiments a / rafigurazions di nature " +"sessuâl" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Blasfemie" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nissune informazion in merit ae blasfemie di cualsisei gjenar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Umorisim sconvenient" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nissune informazion in merit umorisim sconvenient" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminazion" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "" +"Nissune informazion in merit a lengaç discriminatori di cualsisei gjenar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Publicitât" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nissune informazion in merit ae publicitât di cualsisei gjenar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Zûc di azart" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nissune informazion in merit a zûc di azart di cualsisei gjenar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Compris" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nissune informazion in merit ae pussibilitât di spindi bêçs" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Chat tra utents" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Nissune informazion in merit aes manieris par chatâ cun altris utents" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Chat audio tra utents" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" +"Nissune informazion in merit aes manieris par cjacarâ cun altris utents" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detais di contat" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nissune informazion in merit ae condivision di nons utent di social network " +"o direzions e-mail" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informazions di identificazion" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "" +"No information regarding sharing of user information with third parties" +msgstr "" +"Nissune informazion in merit ae condivision di informazions dal utent cun " +"tiercis parts" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Condivision de ubicazion" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Nissune informazion in merit ae condivision di posizion fisiche cun altris " +"utents" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Omosessualitât" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nissune informazion in merit a riferiments ae omosessualitât" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostituzion" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nissune informazion in merit a riferiments a prostituzion" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adulteri" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nissune informazion in merit a riferiments a adulteri" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Personaçs sessuâts" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nissune informazion in merit a caratars sessualizâts" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanazion" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nissune informazion in merit a riferiments a profanazion" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Rescj di oms muarts" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nissune informazion in merit a rescj visibii di oms muarts" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Sclavitût" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nissune informazion in merit a riferiments ae sclavitût" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "No inclût riferiments a droghis" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "No inclût blestemis, profanitâts e altris gjenars di lengaç ofensîf" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "No inclût publicitâts o transazions monetariis" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "No inclût ses o crotarie" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "No inclût funzionalitât di chat no controllade" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "No inclût violence" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Droghis" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Lengaç ofensîf" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Bêçs" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sociâl" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violence" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of +#. people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Dutis" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s al à une fasse di etât no cognossude" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s al è adat a ducj" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s al è adat ai frutins (fin a 3 agns)" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s al è adat ai fruts (fin a 5 agns)" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s al è adat ai fruts" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s al è adat ai fantats" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s al è adat ai adults" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for a specified age group. The first placeholder is the app name, the +#. second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s al è adat a %s" + +#. Translators: This is the title of the dialog which contains information +#. about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Fasse di etât" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:126 +msgid "_How to contribute missing information" +msgstr "_Cemût contribuî cu lis informazions che a mancjin" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "File locâl" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app +#. (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "Pachet" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "In spiete" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:407 +msgid "Pending install" +msgstr "Instalazion in spiete" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:414 +msgid "Pending remove" +msgstr "Rimozion in spiete" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:395 +msgid "Installing" +msgstr "Instalazion" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Rimozion" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:400 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Daûr a discjariâ" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:307 src/gs-details-page.c:1060 +#: src/gs-details-page.c:1095 src/gs-details-page.ui:243 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instale" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1180 +msgid "_Uninstall…" +msgstr "_Disinstale…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Rêt" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Al pues comunicâ vie rêt" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Servizis di sisteme" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Al pues acedi ai servizis D-Bus sul bus di sisteme" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Servizis di session" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Al pues acedi ai servizis D-Bus sul bus de session" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Dispositîfs" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Al pues acedi a dispositîfs arbitraris come lis webcams" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Al pues acedi ai dispositîfs di input" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Al pues acedi ai microfons" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Al pues acedi ai files dal dispositîf dal sisteme" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Contignûts dal schermi" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Al pues acedi ai contignûts dal schermi" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Cartele home" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Al pues viodi, modificâ e creâ i file" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Al pues viodi i file" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "File System" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with +#. actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Cartele dai discjariaments" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Impostazions" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Al pues viodi e modificâ cualsisei impostazion" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sisteme di visualizazion vecje maniere" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Al dopre un sisteme di visualizazion vieli e no sigûr" + +# aplicazion +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Jessude dal isolament" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Al pues lâ fûr dal isolament e imbroiâ cualsisei altre restrizion" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Nissune descrizion dal inzornament disponibile." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Detais dal inzornament" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Al à bisugne di permès adizionâi" + +#. Translators: Header of the section with other users' opinions about the +#. app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Recensions" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "No je stade cjatade nissune recension par cheste aplicazion." + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "Nissune recension" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "Cronologjie des versions" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novitâts te version %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Version %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Nissun detai par cheste publicazion" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e di %B dal %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Modalitât di inviament: un tra ‘updates’, ‘updated’, ‘installed’ o " +"‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODALITÂT" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Cîr aplicazions" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "CÎR" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Mostre detais aplicazions (doprant l'ID de aplicazion)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Mostre detais aplicazions (doprant il non dal pachet)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NONPACHET" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instale la aplicazion (doprant il ID de aplicazion)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Disinstale la aplicazion (doprant il ID de aplicazion)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Vierç un file di pachet locâl" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NONFILE" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Il gjenar di interazion spietade par cheste azion: sedi ‘none’, ‘notify’, o " +"‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAZION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Mostre une meta-informazion locâl o un file appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Abilite la jessude detaiade dal debug (de istance in esecuzion, se za in " +"esecuzion)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Al instale in sotfont cualsisei inzornament in spiete" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Mostre lis preferencis" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Jes de istance in esecuzion" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferìs lis sorzints di file locâi par AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Mostre il numar di version" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 i colaboradôrs di GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Fabio Tomat " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Scuse! Nissun detai par chê aplicazion." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Dimension daspò la instalazion" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Al inclût %s di dâts e %s di cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Al inclût %s di dâts" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Al inclût %s di cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Utilizazion di cache e dâts no cognossude" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Dimension dal discjariament" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Nol à bisugne di altris discjariaments di sisteme" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" +"Al à bisugne di une dimension no cognossude di altris discjariaments di " +"sisteme" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Al à bisugne di %s di discjariaments di sisteme adizionâi" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Dimension no cognossude" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Nissun permès" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Al à acès ae rêt" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Al dopre servizis di sisteme" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Al dopre servizis di session" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Al pues acedi ai dispositîfs hardware" + +#. Translators: This indicates an app can access system devices such as +#. /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Al pues acedi ai dispositîfs dal sisteme" + +#. Translators: This indicates an app can read/write to the user’s home or the +#. entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Al pues lei/scrivi ducj i tiei dâts" + +#. Translators: This indicates an app can read (but not write) from the user’s +#. home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Al pues lei ducj i tiei dâts" + +#. Translators: This indicates an app can read/write to the user’s Downloads +#. directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Al pues lei/scrivi i files discjariâts" + +#. Translators: This indicates an app can read (but not write) from the user’s +#. Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Al pues lei i files discjariâts" + +#. Translators: This indicates an app can access data in the system unknown to +#. the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Al pues acedi a cualchi specific file" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Al pues acedi e modificâ lis impostazion utent" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Al dopre un sisteme di barcons sorpassât" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Al pues cuistâ permès arbitraris" + +#. Translators: This indicates an app was written and released by a developer +#. who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Il svilupadôr software al è verificât" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Revisionât dal distributôr dal SO" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Revisionât di %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Furnît di une tierce part" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Software no plui supuartât" + +#. Translators: This indicates an app’s source code is freely available, so +#. can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Codiç che si pues ispezionâ" + +#. Translators: This indicates an app does not specify which license it's +#. developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Licence no cognossude" + +#. Translators: This indicates an app is not licensed under a free software +#. license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Codiç proprietari" + +#. Translators: This indicates an app is not licensed under a free software +#. license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Licence speciâl" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between +#. users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr ", " + +#. Translators: The app is considered privileged, aka provided by the +#. distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Provilegjât" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Sigûr" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Probabilmentri sigûr" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potenzialmentri insigûr" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Insigûr" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Dome celulâr" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Al funzione dome su schermi piçul" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Dome scritori" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Al funzione dome su schermi grant" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Dimension schermi no adate" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Nol supuarte la tô dimension di schermi atuâl" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Al domande un schermi tatil" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "E covente une tastiere" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Al covente un mouse" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Al covente il gamepad" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Al domande un gamepad par zuiâ" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adatîf" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Al funzione su celulârs, tablets e scritoris" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Probabil che al domandi une tastiere o un mouse" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Al funzione su scritoris e portatii" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Nol conten contignûts inadats pe etât" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Nissune informazion su la fasse di etât" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visite il sît web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instale…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Anule" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instale" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Discjame" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Inzorne" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Disinstale…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Daûr a disinstalâ" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 +#: src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "Inzornament critic" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Nol è pussibil doprâ il dispositîf intant che tu inzornis." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Sorzint: %s" + +#. Translators: A message to indicate that an app has been renamed. The +#. placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "Cambiât non di %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +msgid "Stopped Receiving Updates" +msgstr "Fermât di ricevi inzornaments" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Inzornament critic" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalade" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Jude a voltâ %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get involved and help translate it yourself." +msgstr "" +"%s al è progjetât, svilupât e tradot di une comunitât internazionâl di colaboradôrs.\n" +"\n" +"Chest al significhe che ancje se nol è disponibil te tô lenghe, tu puedis contribuî e judâ a voltâlu." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traduzions" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Sît web des _traduzions" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Acès esterni par %s domandât (ream %s)" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "Acès necessari" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:300 src/gs-common.c:752 +#: src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-page.c:708 +#: src/gs-removal-dialog.ui:24 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:251 src/gs-review-dialog.ui:24 +#: src/gs-review-row.c:239 src/gs-review-row.c:263 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "_Anule" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "_Jentre" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Utent" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "Password" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Altri" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Dutis" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "In risalt" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured +#. ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Sielte di noaltris" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently +#. released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Gnovis e inzornadis" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Sielzudis di Web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Altri software" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s Instalât" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Al è necessari tornâ a inviâ par rindi efetivis lis modifichis" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "La aplicazion e je pronte par jessi doprade" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Inzornaments di sisteme instalâts" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "" +"I inzornaments instalâts cumò denant a son disponibii par jessi esaminâts" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:915 +msgid "Restart" +msgstr "Torne invie" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Eseguìs" + +#. TRANSLATORS: window title +#: src/gs-common.c:234 +msgid "Install Software?" +msgstr "Instalâ software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Install Third-Party Software?" +msgstr "Instalâ software di tiercis parts?" + +#. TRANSLATORS: window title +#: src/gs-common.c:240 +msgid "Enable Software Repository?" +msgstr "Abilitâ il dipuesit software?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:242 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Abilitâ il dipuesit software di tiercis parts?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:254 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by " +"“%s”." +msgstr "" +"%s nol è software libar e open source e al è furnît di “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:264 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s al è furnît di “%s”." + +#: src/gs-common.c:273 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Chest dipuesit software al scugne jessi abilitât par continuâ la " +"instalazion." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:283 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Al podarès jessi ilegâl instalâ o doprâ %s in cualchi paîs." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:289 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Al podarès jessi ilegâl instalâ o doprâ chest codec in cualchi paîs." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:303 +msgid "Don’t _Warn Again" +msgstr "No sta _visâmi plui" + +#. TRANSLATORS: button text +#: src/gs-common.c:312 +msgid "Enable and _Install" +msgstr "Abilite e _instale" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:519 +msgid "Detailed errors from the package manager follow:" +msgstr "Chi daspò i erôrs in detai dal gjestôr dai pachets:" + +#: src/gs-common.c:526 src/gs-common.c:663 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Detais" + +#. TRANSLATORS: button text +#: src/gs-common.c:575 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Siere" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:744 +msgid "_Accept" +msgstr "_Acete" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:890 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Al è stât instalât un inzornament" +msgstr[1] "I inzornaments a son stâts instalâts" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:900 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Une aplicazion e je stade disinstalade" +msgstr[1] "A son stadis disinstaladis aplicazions" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:906 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Al è necessari tornâ a inviâ par rindilu efetîf" +msgstr[1] "Al è necessari tornâ a inviâ par rindiju efetîfs" + +#. TRANSLATORS: button text +#: src/gs-common.c:913 +msgid "Not Now" +msgstr "No cumò" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1009 +msgid "Just now" +msgstr "Propite cumò" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minût indaûr" +msgstr[1] "%d minûts indaûr" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ore indaûr" +msgstr[1] "%d oris indaûr" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d zornade indaûr" +msgstr[1] "%d dîs indaûr" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d setemane indaûr" +msgstr[1] "%d setemanis indaûr" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d mês indaûr" +msgstr[1] "%d mês indaûr" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d an indaûr" +msgstr[1] "%d agns indaûr" + +#. Translators: This is to construct a disk size string consisting of the +#. value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, +#. then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1394 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Dutis" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "In risalt" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Grafiche 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografie" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Scansion" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Grafiche vetoriâl" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visualizadôr" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Creazion e modifiche audio" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Riprodutôrs musicâi" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Dutis" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "In risalt" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendari" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Base di dâts" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finance" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Elaboradôr di tescj" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editôrs di test" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navigadôrs web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Dutis" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "In risalt" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Azion" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventure" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocs" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Taule" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cjartis" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emuladôrs" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Fruts" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logjiche" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Zûcs di rûl" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategjie" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Dutis" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "In risalt" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chat" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Dutis" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "In risalt" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Inteligjence artificiâl" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomie" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chimiche" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Lenghis" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematiche" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Notiziis" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotiche" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Art" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografie" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Comics" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Finzion" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Salût" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Storie" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Stîl di vite" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politichis" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Dutis" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "In risalt" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Debugger" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codec" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Driver Hardware" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Caratars" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Sorzints di input" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Pachets des lenghis" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localizazion" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Creâ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Lavôr" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Riprodutôrs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializâ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Aprendiment" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Disvilup" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Drivers Hardware" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Caratars" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Sorzints di input" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Pachets des lenghis" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Localizazion" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is +#. unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Une aplicazion" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s al domande supuart pal formât di file adizionâl." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Gjenar di MIME adizionâi domandâts" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s al domande caratars in plui." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Caratars in plui domandâts" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s al domande codec multimediâi in plui." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Codec multimediâi in plui domandâts" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s al domande driver di stampant adizionâi." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Driver di stampant adizionâi domandâts" + +#. TRANSLATORS: this is a notification displayed when an app wants to install +#. additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s al domande pachets in plui." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Pachets adizionâi domandâts" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Cjate in Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "_Mostre altris" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Mostre di mancul" + +#: src/gs-details-page.c:390 +msgid "Removing…" +msgstr "Daûr a gjavâ…" + +#: src/gs-details-page.c:405 +msgid "Requires restart to finish install" +msgstr "Al covente tornâ a inviâ par completâ la instalazion" + +#: src/gs-details-page.c:412 +msgid "Requires restart to finish remove" +msgstr "Al covente tornâ a inviâ par completâ la rimozion" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:428 +msgid "Pending installation…" +msgstr "In spiete pe instalazion…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:434 +msgid "Pending update…" +msgstr "In spiete pal inzornament…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:449 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Daûr a discjariâ…" + +#. Translators: This string is shown when preparing to download and install an +#. app. +#: src/gs-details-page.c:452 +msgid "Preparing…" +msgstr "Daûr a prontâ…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:455 +msgid "Uninstalling…" +msgstr "Daûr a disinstalâ…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:582 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s nol è instalât, ma al à ancjemò dâts presints." + +#: src/gs-details-page.c:1077 src/gs-toast.c:65 +msgid "_Restart" +msgstr "To_rne invie" + +#: src/gs-details-page.c:1083 +msgid "_Enable…" +msgstr "_Abilite…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1109 +msgid "_Install…" +msgstr "_Instale…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1325 +#, c-format +msgid "%s will appear in US English" +msgstr "%s al vignarà fûr in inglês dai Stâts Unîts" + +#: src/gs-details-page.c:1333 +msgid "This app will appear in US English" +msgstr "Cheste aplicazion e vignarà fûr par inglês dai Stâts Unîts" + +#: src/gs-details-page.c:1335 +msgid "This software will appear in US English" +msgstr "Cheste software al vignarà fûr par inglês dai Stâts Unîts" + +#: src/gs-details-page.c:1370 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "Jude a _tradusi" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1435 +#, c-format +msgid "Other Apps by %s" +msgstr "Altris Apps di %s" + +#. Translators: the first %s is replaced with the developer name, the second +#. %s is replaced with the app id +#: src/gs-details-page.c:1471 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Il svilupadôr %s al à apurât la proprietât di %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1474 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Un svilupadôr al à apurât la proprietât di %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1837 +msgid "You need internet access to write a review" +msgstr "Al covente un acès a internet par scrivi une recension" + +#: src/gs-details-page.c:1938 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Cheste aplicazion no sta plui ricevint inzornaments, includudis lis " +"corezions di sigurece" + +#: src/gs-details-page.c:1939 +msgid "" +"This app is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Cheste aplicazion e je za furnide de tô distribuzion e no varès di jessi " +"sostituide." + +#: src/gs-details-page.c:1940 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Cheste aplicazion no indiche nissun colegament a un sît web, dipuesit di " +"codiç o sisteme pe segnalazion di erôrs." + +#: src/gs-details-page.c:1942 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Chest software nol sta plui ricevint inzornaments, includûts i blecs di " +"sigurece" + +#: src/gs-details-page.c:1943 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Chest software al è za furnît de tô distribuzion e no varès di jessi " +"sostituide." + +#: src/gs-details-page.c:1944 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Chest software nol indiche nissun colegament a un sît web, dipuesit di codiç" +" o sisteme pe segnalazion di erôrs." + +#: src/gs-details-page.c:2034 src/gs-details-page.c:2051 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Software nol è rivât a recuperâ lis informazions par “%s” e nol rive a " +"mostrâ i detais par cheste aplicazion." + +#: src/gs-details-page.c:2406 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Nol è stât pussibil inviâ la recension par “%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Pagjine di detais" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Daûr a cjariâ i detais de aplicazion" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Verificât" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Vierç" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Inzorne" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Disinstale" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "Estensions" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Al è pussibil doprâ cheste aplicazion nome cuant che e je ative une " +"conession internet." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "Dipuesit software includût" + +#: src/gs-details-page.ui:679 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Cheste aplicazion e inclût un dipuesit software che al furnìs inzornaments, " +"e cussì ancje l'acès a altri software." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Nissun dipuesit software includût" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with" +" new versions." +msgstr "" +"Cheste aplicazion no inclût un dipuesit software. No vignarà inzornade cun " +"gnovis versions." + +#. Translators: a repository file used for installing software has been +#. discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "Dipuesit software identificât" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Zontant chest dipuesit software tu varâs acès a software in plui e " +"inzornaments." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Dopre nome i dipuesits software che tu ti fidis." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Nete dâts de aplicazion" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "_Elimine dâts" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Nissun metadât" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "Sît _web dal progjet" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "_Done" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "Contribuìs aes _traduzions" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "_Segnale un probleme" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "_Jude" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contate" + +#. Translators: Button opening a dialog where the users can write and publish +#. their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "Scrîf r_ecension" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Dutis lis recensions" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "Impussibil mostrâ i detais de aplicazion" + +#: src/gs-dkms-dialog.c:67 +msgid "Failed to prepare reboot" +msgstr "Impussibil prontâ il gnûf inviament" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "Erôr no cognossût" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "La clâf no je stade cjatade" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "La clâf no je regjistrade" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Regjistrazion MOK necessarie" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Sucessîf" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Chest dispositîf al à atîf Secure Boot. Par permeti la abilitazion dai gnûfs" +" drivers, al è necessari regjistrâ une gnove clâf di proprietari de machine " +"(MOK). Intun secont moment il procès al varà bisugne di une password. Segne " +"cheste password associade ae clâf:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Mi soi segnât la _password MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Torne invie e regjistre…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Istruzions di instalazion: lei cun atenzion" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Dopo dal gnûf inviament e vignarà mostrade une videade di configurazion dal " +"dispositîf. Par abilitâ i gnûfs drivers, va daûr dai passaçs de " +"configurazion:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Selezione “Enroll MOK”\n" +"• Selezione “Yes” par regjistrâ lis clâfs\n" +"• Ae richieste, inserìs la password MOK\n" +"• Dopo selezione “Reboot”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Implicazions su la sigurece" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Dopo vê regjistrât cun sucès la clâf, fâs atenzion che cualsisei inzornament" +" futûr al modul o a cualsisei altri modul, al sarà considerât afidabil in " +"mût implicit. Ducj i inzornaments futûrs a vignaran in maniere trasparente " +"cence nissune interazion e/o autorizazion." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Al è pussibil cjatâ altris indicazions su la pagjine dai documents." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Daûr a discjariâ i file dai metadâts adizionâi…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " e " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Caratars disponibii pal script %s" +msgstr[1] "Caratars disponibii pai script %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Software disponibil par %s" +msgstr[1] "Software disponibii par %s" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Software domandât no cjatât" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "No si è rivâts a cjatâ il software domandât" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "%s no cjatât" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "tal sît web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "No je nissune aplicazion disponibile che e furnìs il file %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Lis informazion su %s, e ancje lis opzions su cemût vê lis aplicazions che a" +" mancjin, si puedin cjatâ su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "No je nissune aplicazion disponibile pal supuart di %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "%s no je disponibile." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Lis informazion su %s, e cussì ancje lis opzions su cemût vê une aplicazion " +"che e supuarte chest formât, si puedin cjatâ su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "No son disponibii caratars pal supuart dal script %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Lis informazion su %s, e cussì ancje lis opzions su cemût vê caratars in " +"plui, a podaressin jessi cjatadis su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Nol è disponibil nissun codec pal formât %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Lis informazion su %s, e cussì ancje lis opzions su cemût otignî un codec " +"che al pues riprodusi chest formât, a podaressin jessi cjatadis su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "No je nissune risorse Plasma disponibile pal supuart di %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Lis informazion su %s, e cussì ancje lis opzions su cemût vê risorsis Plasma" +" in plui, a podaressin jessi cjatadis su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Nissun driver di stampant disponibil par %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Lis informazion su %s, e cussì ancje lis opzions su cemût otignî un driver " +"che al supuarte cheste stampant, a podaressin jessi cjatadis su %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "la documentazion" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual +#. codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is +#. a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Impussibil cjatâ il %s domandât di %s. Consultâ %s par vê plui informazions." +msgstr[1] "" +"Impussibil cjatâ i %s domandâts di %s. Consultâ %s par vê plui informazions." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual +#. codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Impussibil cjatâ il %s che tu stavis cirint. Consultâ %s par vê plui " +"informazions." +msgstr[1] "" +"Impussibil cjatâ i %s che tu stavis cirint. Consultâ %s par vê plui " +"informazions." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Impussibil cjatâ risultâts de ricercje: %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "Formât di file %s" + +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "Inst_ale ducj" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "Impussibil cjatâ il software domandât" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Pagjine dai codec" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "Nissun risultât cjatât" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "Impussibil eseguî la ricercje" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Precedent" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Prossim" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Liste aplicazions in risalt" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Supuart pal scritori" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "E supuarte la utilizazion suntun schermi grant" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Supuart pal scritori no cognossût" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "No vonde informazions par savê se a son supuartâts i schermis grancj" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "E à bisugne di un schermi grant" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Scritori no supuartât" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Nol è pussibil doprâle suntun schermi grant" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Supuart pe conession mobile" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "E supuarte la utilizazion suntun schermi piçul" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Supuart pe conession mobile no cognossût" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "No vonde informazions par savê se a son supuartâts i schermis piçui" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "E à bisugne di un schermi piçul" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Conession mobile no supuartade" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Nol è pussibil doprâle suntun schermi piçul" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Supuart pe tastiere" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Supuart pe tastiere no cognossût" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "No vonde informazions par savê se a son supuartadis lis tastieris" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Tastiere necessarie" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "E supuarte lis tastieris" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tastiere no supuartade" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Nol è pussibil doprâle cuntune tastiere" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Supuart pal mouse" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "E à bisugne di un mouse o di un dispositîf di pontament" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Supuart pal mouse no cognossût" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"No vonde informazions par savê se a son supuartâts i mouse o i dispositîfs " +"di pontament" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Mouse necessari" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Al supuarte i mouse e i dispositîfs di pontament" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Mouse no supuartât" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Nol è pussibil doprâle cuntun mouse o un dispositîf di pontament" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Supuart pal schermi tatil" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Supuart pal schermi tatil no cognossût" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "No vonde informazions par savê se a son supuartâts i schermis tatii" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Schermi tatil necessari" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "E supuarte i schermis tatii" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Schermi tatil no supuartât" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Nol è pussibil doprâle cuntun schermi tatil" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Gamepad necessari" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "E à bisugne di un gamepad" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Supuart pal gamepad" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Al supuarte i gamepads" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "Al è probabil che %s al funzioni su chest dispositîf" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s al funzione su chest dispositîf" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "Al è pussibil che %s al funzioni su chest dispositîf" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s nol funzionarà ben su chest dispositîf" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s nol funzionarà su chest dispositîf" + +#. Translators: This is the title of the dialog which contains information +#. about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Supuart hardware" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigazion" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navighe ae pagjine Esplore" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navighe ae pagjine instalâts" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navighe ae pagjine inzornaments" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Vierç Sbare di ricercje" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Barcons" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Vierç Preferencis" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Vierç Dipuesits software" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Jude" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Vierç Scurtis di tastiere" + +#. Translators: This is in the context of a list of apps which are installed +#. on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instaladis" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Pagjine instalade" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "In elaborazion" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplicazions" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "Aplicazions Web" + +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "Aplicazions di sisteme" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Fat de comunitât" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Partecipe" + +#. Translators: The first placeholder here is a link to information about the +#. license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Cheste aplicazion e je svilupade in mût viert di une comunitât internazionâl e e je publicade sot de licence %s.\n" +"\n" +"Tu puedis contribuî e judâ a rindile ancjemò miôr." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Cheste aplicazion e je svilupade in mût viert di une comunitât internazionâl e e je publicade sot de licence %s.\n" +"\n" +"Tu puedis contribuî e judâ a rindile ancjemò miôr." + +#. Translators: The first placeholder here is a link to information about the +#. license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Chest software al è disvilupât in mût viert di une comunitât internazionâl e publicât sot de licence %s.\n" +"\n" +"Tu puedis contribuî e judâ a rindilu ancjemò miôr." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Chest software al è disvilupât in mût viert di une comunitât internazionâl e publicât sot de licence %s.\n" +"\n" +"Tu puedis contribuî e judâ a rindilu ancjemò miôr." + +#. Translators: This indicates an app does not specify which license it's +#. developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Licence no cognossude" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "P_lui informazions" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be proprietary. It may be insecure in ways that are hard to detect, and it may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Cheste aplicazion no specifiche la licence doprade pal so disvilup, e podarès jessi proprietarie. Al è pussibil che no sedi sigure in manieris che a son dificilis di rilevâ e e podarès cambiâ cence supervision.\n" +"\n" +"Nol è dite che tu podedis contribuî a cheste aplicazion." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may be proprietary. It may be insecure in ways that are hard to detect, and it may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Chest software nol specifiche la licende doprade pal so disvilup e e podrès jessi proprietarie. Al è pussibil che no sedi sigure in manieris che a son dificilis di rilevâ e e podarès cambiâ cence supervision.\n" +"\n" +"Nol è dite che tu podedis contribuî a chest software." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Proprietari" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it works. It may be insecure in ways that are hard to detect, and it may change without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Cheste aplicazion no je svilupade in mût viert, duncje dome i siei disvilupadôrs a san cemût che e funzione. Al è pussibil che no sedi sigure in manieris che a son dificilis di rilevâ e e podarès cambiâ cence supervision.\n" +"\n" +"Nol è dite che tu podedis contribuî a chest software." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how it works. It may be insecure in ways that are hard to detect, and it may change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Chest software nol è disvilupât in mût viert, duncje dome i siei disvilupadôrs a san cemût che al funzione. Al è pussibil che nol sedi sigûr in manieris che a son dificilis di rilevâ e al podarès cambiâ cence supervision.\n" +"\n" +"Al è probabil che no tu podedis contribuî a chest software." + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Licence speciâl" + +#. Translators: The first placeholder here is a link to information about the +#. license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Cheste aplicazion e je svilupade sot de licence speciâl %s.\n" +"\n" +"Nol è dite che tu podedis contribuî a cheste aplicazion." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Cheste aplicazion e je svilupade sot de licence speciâl “%s”.\n" +"\n" +"Nol è dite che tu podedis contribuî a cheste aplicazion." + +#. Translators: The first placeholder here is a link to information about the +#. license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Chest software al è svilupât sot i tiermins di une licence speciâl %s.\n" +"\n" +"Nol è dite che tu podedis contribuî a chest software." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Chest software al è svilupât sot de licence speciâl “%s”.\n" +"\n" +"Nol è dite che tu podedis contribuî a chest software." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Daûr a inzornâ i dâts" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Daûr a cjariâ la pagjine" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Inviament in cors" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Sorzint no cognossude" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Zontaduris" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Rimozions" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Inzornaments" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Regressions" + +#. Translators: This is a clickable link on the third party repositories +#. message dialog. It's +#. part of a constructed sentence: "Provides access to additional software +#. from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "sorzints esternis selezionadis" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Al furnìs acès a software adizionâl che al rive di %s. Al è includût cualchi software proprietari.\n" +"\n" +"Tu puedis abilitâ chei dipuesits plui indenant tes preferencis dai dipuesits di Software." + +#. TRANSLATORS: Heading asking whether to turn third party software +#. repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Abilitâ i dipuesits software di tiercis parts?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "_Ignore" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Abilite" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "Disponibil pal to sisteme operatîf" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "Disponibil par %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Esplore" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Pagjine panoramiche" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Aplicazions disponibilis" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Altris categoriis" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nissun dât di aplicazion cjatât" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "No cognossût" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Va ben" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "L'utent al à declinât la instalazion" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Preparâ %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Gjavâ pardabon il dipuesit %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Dutis lis aplicazions che a rivin di %s a vignaran disinstaladis e tu varâs " +"di tornâ a instalâ il dipuesit par podê tornâ a doprâlis." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 +#: src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "Disinstalâ %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Nol sarà pussibil doprâ %s dopo de rimozion." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Dopo de rimozion nol sarà pussibil doprâ nissune aplicazion che e dipent su " +"%s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use" +" it will appear in a different font." +msgstr "" +"Dopo de rimozion nol sarà pussibil doprâ %s e ducj i documents che lu doprin" +" a vignaran fûr cuntun caratar diferent." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Dopo de rimozion nol sarà pussibil doprâ %s. Chest al podarès significâ che " +"nol sarà plui pussibil riprodusi cualchi file multimediâl." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Dopo de rimozion al è pussibil che l'hardware che al fâs afidament su %s nol" +" funzioni plui." + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "Impostazions e dâts de aplicazion" + +#. Translators: this is part of section about deleting app's data, where the +#. 'keep' means 'keep the data' +#: src/gs-page.c:667 +msgid "_Keep" +msgstr "_Ten" + +#: src/gs-page.c:673 +msgid "Allows restoring app settings and content" +msgstr "Al permet di ripristinâ lis impostazions e i contignûts de aplicazion" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:682 +msgid "_Delete" +msgstr "_Elimine" + +#: src/gs-page.c:688 +msgid "Permanently deletes data to save disk space" +msgstr "Al elimine par simpri i dâts par salvâ spazi su disc" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:696 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Nol sarà pussibil doprâ %s dopo de rimozion. I dâts e lis impostazions de " +"aplicazion a vignaran tignûts sul disc, par permeti un doman il " +"ripristinament de aplicazion." + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:710 +msgid "_Uninstall" +msgstr "_Disinstale" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferencis" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Inzornaments software" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "Plui informazions" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Il control e il discjariament dai inzornaments al dopre dâts e energjie. " +"Duncje, lis funzions di inzornament automatic a son metudis in pause pes " +"conessions a rêts a consum e cuant che il sparagn energjetic al è atîf." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatic" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Controle e discjame in automatic i inzornaments" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manuâl" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Il control e il discjariament dai inzornaments al à di sei fat a man" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Notifichis dai inzornaments automatics" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "" +"Mande une notifiche cuant che i inzornaments a son stâts instalâts in " +"automatic" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtris di contignûts" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Mostre dome software _libar" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Plate i software proprietaris te navigazion e te ricercje" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Mostre nome svilupadôrs _verificâts" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Mostre dome lis aplicazions di svilupadôrs che a àn une identitât verificade" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Il software instalât nol è compatibil cun %s e al vignarà gjavât in " +"automatic dilunc l'inzornament." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Software no compatibil" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Avanze" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora +#. Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Il software che al è stât instalât di “%s” al finarà di ricevi inzornaments." + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Disabilitâ il dipuesit?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Gjavâ il dipuesit?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "_Disabilite" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:266 +msgid "_Remove" +msgstr "_Gjave" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Abilite gnûfs dipuesits" + +#: src/gs-repos-dialog.c:612 +msgid "Turn on new repositories when they are added" +msgstr "Ative i gnûfs dipuesits cuant che a vegnin zontâts" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "plui informazions" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is +#. replaced +#. with a link consisting a text "more information", which constructs a +#. sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Dipuesits adizionâi che a rivin des tiercis parts selezionadis — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Dipuesits di tiercis parts di Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "il sisteme operatîf" + +#. TRANSLATORS: This is the description text displayed in the Software +#. Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Chescj dipuesits a integrin il software predefinît furnît di %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Dipuesits software" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "Nissun dipuesit" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplicazion instalade" +msgstr[1] "%u aplicazions instaladis" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u estension instalade" +msgstr[1] "%u estensions instaladis" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplicazion" +msgstr[1] "%u aplicazions" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u estension" +msgstr[1] "%u estensions" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s e %s instaladis" +msgstr[1] "%s e %s instaladis" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Daûr a controlâ il software instalât…" + +#. Translators: The first '%s' is replaced with installation kind, like in +#. case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Gjave" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "La odei" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "No mi plâs" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "E je buine" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Mi plâs" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Le adori" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Selezione une stele par lassâ une valutazion" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Cjapiti plui timp par scrivi une opinion" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Sielç une stele come valutazion" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Il struc al è masse curt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Il struc al è masse lunc" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "La descrizion e je masse curte" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "La descrizion e je masse lungje" + +#. Translators: Title of the dialog box where the users can write and publish +#. their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Scrîf une recension" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Mande" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used" +" to report problems: instead, contact the developer or your support " +"provider." +msgstr "" +"Indiche une valutazion, une sintesi e une recension testuâl. Lis recensions " +"no àn di segnalâ problemis: pitost, contate il svilupadôr o il centri di " +"assistence." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Struc de recension" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "Scrîf un piçule recension" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name " +"attached to your account will be shown publicly." +msgstr "" +"Cognòs te nestre politiche di " +"privacy cuai dâts che a vegnin inviâts. Il to non complet colegât al to " +"account al vignarà mostrât in public." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "In totâl %u recension" +msgstr[1] "In totâl %u recensions" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "su 5 stelis" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "No cognossût" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:227 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Al è pussibil segnalâ recensions compuartament ofensîf, maleducât o " +"discriminatori." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:232 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Une volte segnalade, une recension no vignarà mostrade fintant che un " +"aministradôr no le varà controlade." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:237 +msgid "Report Review?" +msgstr "Segnalâ recension?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:242 +msgid "_Report" +msgstr "_Segnale" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:258 +msgid "Remove Review?" +msgstr "Gjavâ la recension?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:261 +msgid "Removing a review cannot be undone." +msgstr "Nol è pussibil anulâ la rimozion di une recension." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "D'acuardi cu la recension" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "No soi de stesse opinion" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Segnale…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Gjave…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not " +"malicious" +msgstr "" +"La aplicazion no je isolade ma la distribuzion e à controlât che no je " +"malevule" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Controle di fidâti dal vendidôr, viodût che la aplicazion no je isolade" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Nissun permès" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Aplicazion isolade dal dut" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Acès ae rêt" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Al pues acedi a internet" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Nissun acès ae rêt" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Nol pues acedi a internet" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Al dopre servizis di sisteme" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Al pues domandâ dâts dai servizis di sisteme" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Al dopre servizis di session" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Al pues domandâ dâts dai servizis di session" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Acès a dispositîfs dal utent" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Al pues acedi a dispositîfs come webcams o controllers par zûcs" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Nissun acès a dispositîfs dal utent" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Nol pues acedi a dispositîfs come webcams o controllers pai zûcs" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Acès a dispositîfs di input" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Acès al microfon" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "Al pues scoltâ doprant i microfons cence domandâ il permès" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Acès a dispositîfs dal sisteme" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Al pues acedi a dispositîfs dal sisteme che a necessitin di autorizazions " +"elevadis" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Acès ai contignûts dal schermi" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Al pues acedi ai contignûts dal schermi o di altris barcons" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Sisteme di barcons sorpassât" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Permès arbitraris" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Impostazions utent" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Acès complet ae leture/scriture dal filesystem" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Al pues lei e scrivi ducj i dâts sul filesystem" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Acès ae leture/scriture de cartele home" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Al pues lei/scrivi ducj i dâts te tô cartele home" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Acès complet ae leture dal filesystem" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Al pues lei ducj i dâts sul filesystem" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Acès ae leture de cartele home" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Al pues lei ducj i dâts te tô cartele home" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Acès ae leture/scriture de cartele dai discjariâts" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Al pues lei/scrivi ducj i dâts te tô cartele dai files discjariâts" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Acès in leture de cartele dai discjariâts" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Al pues lei ducj i dâts te cartele dai discjariâts" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Al pues lei/scrivi ducj i dâts te cartele" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Al pues lei ducj i dâts te cartele" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Nissun acès al filesystem" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Nol pues acedi par nuie al filesystem" + +#. Translators: This indicates an app was written and released by a developer +#. who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Il svilupadôr de App al è verificât" + +#: src/gs-safety-context-dialog.c:387 +msgid "" +"The developer of this app has been verified to be who they say they are" +msgstr "" +"Al è stât verificât che il svilupadôr di cheste aplicazion al sedi cui che " +"al dîs" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Dipendencis no siguris" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Il software, o lis sôs dipendencis, nol è plui supuartât e nol è dite che al" +" sedi sigûr" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Cheste aplicazion no specifiche sot cuale licence e je svilupade e e podarès" +" jessi proprietarie" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Chest software nol specifiche sot cuale licence al è svilupât e e podarès " +"jessi proprietarie" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Codiç proprietari" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Il codiç sorzint nol è public, duncje nol è pussibil esaminâlu in mût " +"indipendent e nol è dite che al sedi sigûr" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Cheste aplicazion e je svilupade sot de licence speciâl “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Chest software al è svilupât sot de licence speciâl “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Codiç che si pues ispezionâ" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Il codiç sorzint al è public e al è pussibil esaminâlu in mût indipendent, " +"chest al rint plui probabil che la aplicazion e sedi sigure" + +#. Translators: The app is considered privileged, aka provided by the +#. distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s al è privilegjât" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s al è sigûr" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s al è probabilmentri sigûr" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s in mût potenziâl nol è sigûr" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s nol è sigûr" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "No cognossude" + +#. Translators: This is the title of the dialog which contains information +#. about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Sigurece" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licence" + +#. Translators: This is a heading for a row showing the origin/source of an +#. app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "Sorzint" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Cheste aplicazion e dopre une version sorpassade de plateforme software " +"(SDK) e e podarès contignî erôrs o vulnerabilitâts di sigurece che no " +"vignaran comedâts." + +#. Translators: This is the accessible description for a button to go to the +#. previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Videade precedente" + +#. Translators: This is the accessible description for a button to go to the +#. next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Videade sucessive" + +#. Translators: Shortened form of “no screenshots available” when showing an +#. app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Nissune videade" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Schermade no cjatade" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Cjariament de imagjin falît" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Dimension de schermade no cjatade" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Impussibil cjariâ la cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Schermade no valide" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Schermade no disponibile" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Cature" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "ancjemò %u corispondence" +msgstr[1] "ancjemò %u corispondencis" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Pagjine di ricercje" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Cîr aplicazions" + +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "Nissune aplicazion cjatade" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Impussibil discjariâ i inzornaments" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "Impussibil discjariâ i inzornaments firmware" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Impussibil discjariâ di %s i inzornaments firmware" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Impussibil discjariâ di %s i inzornaments" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "Impussibil inzornâ: acès a internet necessari" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "Impussibil inzornâ: no vonde spazi su disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Impussibil discjariâ di %s i inzornaments: nol jere vonde spazi sul disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "Impussibil inzornâ: autenticazion necessarie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "Impussibil inzornâ: autenticazion no valide" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "Impussibil inzornâ: permès necessari" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Impussibil discjariâ i inzornaments: no si à i permès par instalâ software" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Impussibil otignî la liste dai inzornaments" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "Impussibil instalâ: nol è stât pussibil discjariâ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Impussibil instalâ %s: nol è stât pussibil discjariâ di %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Impussibil instalâ %s: nol è stât pussibil discjariâ" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "Impussibil instalâ: al mancje il runtime" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Impussibil instalâ %s: il runtime %s nol è disponibil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "Impussibil instalâ %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "Impussibil instalâ: acès a internet necessari" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "Impussibil instalâ: formât di aplicazion no valit" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "Impussibil instalâ: no vonde spazi su disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Impussibil instalâ %s: nol jere vonde spazi sul disc" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "Impussibil instalâ: autenticazion necessarie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Impussibil instalâ %s: autenticazion necessarie" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "Impussibil instalâ: autenticazion no valide" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Impussibil instalâ %s: autenticazion no valide" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "Impussibil instalâ: permès necessari" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Impussibil instalâ %s: permès necessari" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "Impussibil instalâ: al covente colegâ la alimentazion" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Impussibil instalâ %s: al covente colegâ la alimentazion" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "Impussibil instalâ: batarie basse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Impussibil instalâ %s: batarie basse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Impussibil inzornâ %s di %s: nol è stât pussibil discjariâ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Impussibil inzornâ %s: nol è stât pussibil discjariâ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Impussibil instalâ i inzornaments di %s: nol è stât pussibil discjariâ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "Impussibil inzornâ: nol è stât pussibil discjariâ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Impussibil inzornâ %s: nol jere vonde spazi sul disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Impussibil inzornâ %s: autenticazion necessarie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Impussibil inzornâ %s: autenticazion no valide" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Impussibil inzornâ %s: permès necessari" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "Impussibil inzornâ: al covente colegâ la alimentazion" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Impussibil inzornâ %s: al covente colegâ la alimentazion" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "Impussibil inzornâ: batarie basse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +# from -> avendo? +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Impussibil inzornâ %s: batarie basse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "Impussibil inzornâ %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "Impussibil inzornâ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Impussibil avanzâ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +# from -> avendo? +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Impussibil avanzâ a %s di %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "Impussibil avanzâ: nol è stât pussibil discjariâ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Impussibil avanzâ a %s: nol è stât pussibil discjariâ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "Impussibil avanzâ: acès a internet necessari" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Impussibil avanzâ a %s: acès a internet necessari" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "Impussibil avanzâ: no vonde spazi su disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Impussibil avanzâ a %s: nol jere vonde spazi sul disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "Impussibil avanzâ: autenticazion necessarie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Impussibil avanzâ a %s: autenticazion necessarie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "Impussibil avanzâ: autenticazion no valide" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Impussibil avanzâ a %s: autenticazion no valide" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "Impussibil avanzâ: permès necessari" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Impussibil avanzâ a %s: permès necessari" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Impussibil avanzâ: al covente colegâ la alimentazion" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Impussibil avanzâ a %s: al covente colegâ la alimentazion" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "Impussibil avanzâ: batarie basse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Impussibil avanzâ a %s: batarie basse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Impussibil avanzâ a %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "Impussibil disinstalâ %s: autenticazion necessarie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Impussibil disinstalâ %s: autenticazion necessarie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +msgid "Unable to uninstall: invalid authentication" +msgstr "Impussibil disinstalâ: autenticazion no valide" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Impussibil disinstalâ %s: autenticazion no valide" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "Impussibil disinstalâ: permès necessari" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Impussibil disinstalâ %s: permès necessari" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Impussibil disinstalâ: al covente colegâ la alimentazion" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Impussibil disinstalâ %s: al covente colegâ la alimentazion" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "Impussibil disinstalâ: batarie basse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Impussibil disinstalâ %s: batarie basse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Impussibil disinstalâ %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "Impussibil inviâ %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "Nus displâs, alc al è lât stuart" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Impussibil inviâ %s: %s nol è instalât" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "Nol è avonde spazi libar sul disc pe operazion" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "Impussibil instalâ: gjenar di file no supuartât" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "Impussibil instalâ: autenticazion falide" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Nol è stât pussibil instalâ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "Impussibil contatâ %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' +#. means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "Torne invie Software par doprâ i gnûfs plugins" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "Al covente colegâ la alimentazion al dispositîf" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Il nivel de batarie al è masse bas" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "Informazions su Software" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "Dipuesits _software" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "Scurtis di _tastiere" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_Preferencis" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Ricercje" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Menù principâl" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Cîr aplicazions" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "_Esplore" + +#. Translators: A label for a button to show only software which is already +#. installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalât" + +#. Translators: A label for a button to show only updates which are available +#. to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Inzornaments" + +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "Torne indaûr" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nissune" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Dâts aplicazion" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Dâts necessaris pe esecuzion de aplicazion" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Dâts dal utent" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Dâts che tu âs creât te aplicazion" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Dâts de cache" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dâts de cache temporanie" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "La aplicazion stesse" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dipendencis necessaris" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Components di sisteme condividûts necessaris par cheste aplicazion" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "No cognossude" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Al è pussibil netâ i dâts de cache lant tes impostazions de " +"_aplicazion." + +#. Translators: This is the title of the dialog which contains information +#. about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Archiviazion" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instalât)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Instalazion)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Daûr a discjariâ)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Rimozion)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detais" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Esamine" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Instalât ai %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "Inzornaments instalâts" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "Nissun inzornament instalât" + +#: src/gs-update-monitor.c:215 +msgid "Updates Are Out of Date" +msgstr "I inzornaments a son sorpassâts" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "Par plasê controle la presince di inzornaments" + +#: src/gs-update-monitor.c:222 +msgid "Critical Updates Ready to Install" +msgstr "Inzornament critics pronts pe instalazion" + +#: src/gs-update-monitor.c:223 +msgid "Install critical updates as soon as possible" +msgstr "Instale i inzornaments critics a pene pussibil" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "Inzornaments critics disponibii pal discjariament" + +#: src/gs-update-monitor.c:227 +msgid "Download critical updates as soon as possible" +msgstr "Discjame i inzornaments critics a pene pussibil" + +#: src/gs-update-monitor.c:233 +msgid "Updates Ready to Install" +msgstr "Inzornament pronts pe instalazion" + +#: src/gs-update-monitor.c:234 +msgid "Software updates are ready and waiting" +msgstr "I inzornaments software a son pronts e in spiete" + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "Inzornaments disponibii pal discjariament" + +#: src/gs-update-monitor.c:241 +msgid "Software updates can be downloaded" +msgstr "Al è pussibil discjariâ inzornaments software" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplicazion inzornade — necessari tornâ a inviâ" +msgstr[1] "%u aplicazions inzornadis — necessari tornâ a inviâ" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplicazion inzornade" +msgstr[1] "%u aplicazions inzornadis" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "%s al è stât inzornât." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "Par plasê torne invie la aplicazion." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s e %s a son stâts inzornâts." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "Al è necessari tornâ a inviâ %u aplicazion." +msgstr[1] "Al è necessari tornâ a inviâ %u aplicazions." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Al inclût %s, %s e %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of- +#. life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "Il sisteme al è rivât a fin vite" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +msgid "Upgrade to continue receiving updates" +msgstr "Avanze di version par continuâ a ricevi inzornaments" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Une gnove version di %s e je disponibile pe instalazion" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "Avanzament software disponibil" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "Inzornaments software falîts" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "Prepared updates were not installed" +msgstr "I inzornaments perparâts no son stâts instalâts" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Mostre detais" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Inzornament dal sisteme completât" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Benvignûts su %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Inzornament software instalât" +msgstr[1] "Inzornaments software instalâts" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Un impuartant inzornament dal sisteme operatîf al è stât instalât." +msgstr[1] "" +"Impuartants inzornaments dal sisteme operatîf a son stâts instalâts." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Esamine" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "Inzornament falît" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "Il sisteme al è za stât inzornât." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "L'inzornament al è stât anulât." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you" +" have internet access and try again." +msgstr "" +"Al jere necessari l'acès a internet ma nol jere disponibil. Sigurâsi di vê " +"l'acès a internet e torne prove." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Si à vût problemis di sigurece cul inzornament. Consultâ il furnidôr dal " +"software par vê plui detais." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Nol jere vonde spazi libar sul disc. Liberâ un tic di spazi e torne prove." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Nus displâs: no si è rivâts a instalâ l'inzornament. Spiete un altri " +"inzornament e torne prove. Se il probleme al persist, contate il to furnidôr" +" di software." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Ultin control: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Ferme" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Controle inzornaments" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "" +"La distribuzion %s %s e à interot la ricezion di inzornaments software " +"critics" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Il to sisteme operatîf al à fermât di ricevi inzornaments software critics" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Tu podaressis spindi bêçs" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Controlâ inzornaments doprant la bande largje mobil al podarès fâti spindi " +"bêçs." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Controle _distès" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Avanzaments di software discjariâts" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "I avanzaments di version a son pronts pe instalazion" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "Control inzornaments" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Inzornaments" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Pagjine inzornaments" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "Daûr a cjariâ i inzornaments" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "Al podarès tirâle a dilunc" + +#. TRANSLATORS: This means all software (plural) installed on this system is +#. up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "Dut inzornât" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "Doprâ dâts mobii?" + +#: src/gs-updates-page.ui:232 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Il control dai inzornaments intant che si dopre la bande largje mobile al " +"podarès causâ coscj" + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "_Controle distès" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "Nissune conession" + +#: src/gs-updates-page.ui:255 +msgid "Go online to check for updates" +msgstr "Va in rêt par controlâ i inzornaments" + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "Impostazions di _rêt" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "Erôr" + +#: src/gs-updates-page.ui:293 +msgid "Updates are automatically managed" +msgstr "I inzornaments a son gjestîts in mût automatic" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Inzornaments software in pause" + +#: src/gs-updates-paused-banner.c:47 +msgid "Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"L'inzornament automatic dal software al è stât metût in pause par chescj " +"motîfs:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• La conession ae rêt atuâl e je a consum" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• La conession ae rêt atuâl e proibìs il discjariâ files grancj" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• La modalitât Sparagn energjetic e je ative" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• La modalitât Zûc e je ative" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Inzornaments software in pause" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"La conession ae rêt e je a consum — i inzornaments software a son in pause" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"La conession ae rêt e improibìs il discjariâ files grancj — i inzornaments " +"software a son in pause" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"La modalitât Sparagn energjetic e je ative — i inzornaments software a son " +"in pause" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "La modalitât Zûc e je ative — I inzornaments software a son in pause" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:321 +msgid "_Restart & Update…" +msgstr "To_rne invie e inzorne…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:327 +msgid "U_pdate All" +msgstr "I_nzorne dut" + +#: src/gs-updates-section.c:404 +msgid "Software Updates Downloaded" +msgstr "Inzornaments software discjariâts" + +#: src/gs-updates-section.c:405 +msgid "Updates are ready to be installed" +msgstr "I inzornaments a son pronts pe instalazion" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:496 +msgid "Integrated Firmware" +msgstr "Firmware integrât" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:501 +msgid "Requires Restart" +msgstr "Al covente tornâ a inviâ" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:506 +msgid "App Updates" +msgstr "Inzornaments aplicazions" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:511 +msgid "Device Firmware" +msgstr "Firmware dispositîf" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Discjarie" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s e je disponibile" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s disponibil/e" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Scuvierç di plui su la gnove version" + +#. Translators: the first '%s' is replaced with the downloaded size, the +#. second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s di %s discjariâts" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% discjariât" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Un avanzament impuartant, cun gnovis funzionalitâts e mioraments." + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "To_rne invie e inzorne…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "Visiti di fâ il backup dai dâts e dai file prime di inzornâ." + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Nol è stât pussibil eliminâ il file “%s”: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Nol è stât pussibil eliminâ la cartele “%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Zonte, gjave o inzorne software su chest computer" + +#. Translators: Search terms to find this app. Do NOT translate or localize +#. the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "" +"Inzornaments;Avanzament;Sorzints;Repositories;Dipuesits;Preferencis;Instalâ;Disinstalâ;Program;Software;Aplicazion;Negozi;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux +#. Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s pront" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux +#. Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. NVIDIA Linux Graphics Driver Ready +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the +#. next boot. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s al è pront pe abilitazion e organizât pal prossim inviament." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Abilite" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3170 +msgid "System Updates" +msgstr "Inzornaments di sisteme" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3175 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Inzornaments di sisteme gjenerâi, come chei di sigurece o che a comedin " +"erôrs, e mioraments di prestazions." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Inzornament di %s cun gnovis funzionalitâts e corezions." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Il servizi di inzornament di EOS nol rive a recuperâ e a aplicâ " +"l'inzornament." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Aplicazion web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Supuart aplicazions Web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Eseguìs lis aplicazions web popolârs intun browser" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Avanze par vê i mioraments des ultimis funzionalitâts, di stabilitât e di " +"prestazion." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Supuart Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "" +"Flatpak al è un ambient di funzionament par aplicazions di scritori su Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command- +#. reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Cartele di sisteme %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Sot-cartele di home %s" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Cartelis di sisteme dal host" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "Configurazion dal sisteme host che e rive di /etc" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Cartele Scritori" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Sot-cartele dal scritori %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Cartele dai documents" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Sot-cartele dai documents %s" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Cartele de musiche" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Sot-cartele di Musiche %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Cartele des imagjins" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Sot-cartele di imagjins %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Cartele di condivision publiche" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Sot-cartele di condivision publiche %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Cartele dai videos" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Sot-cartele dai videos %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Cartele dai modei" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Sot-cartele di modei %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Cartele de cache dal utent" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Sot-cartele de cache dal utent %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Cartele de configurazion dal utent" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Sot-cartele de configurazion dal utent %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Cartele dai dâts dal utent" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Sot-cartele di dâts utent %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Cartele di runtime dal utent" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Sot-cartele di runtime dal utent %s" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Acès dal filesystem a %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Daûr a otignî i metadâts flatpak par %s…" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "No si è rivâts a rifinî la zonte ‘%s’: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instalazion dal utent" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Integrazion di sisteme" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "ID aplicazion" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "No si è rivâts a zontâ par instalâ la zonte ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "No si è rivâts a zontâ par disinstalâ la zonte ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"“%s” lontan nol permet la instalazion di “%s”, probabilmentri par vie dai " +"siei filtris. Gjave il filtri e ripet la instalazion. Erôr in detai: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "La cjarie dal sisteme e je masse basse par eseguî l'inzornament" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"La cjarie dal sisteme e je masse basse par eseguî l'inzornament (%u%%, " +"necessari %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "" +"Nol è pussibil rivâ al dispositîf opûr al è fûr de puartade dal segnâl cence" +" fîl" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "La cjarie de batarie dal dispositîf e je masse basse" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"La cjarie de batarie dal dispositîf e je masse basse (%u%%, necessari %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Il dispositîf al sta spietant la aplicazion dal inzornament" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Il dispositîf al à bisugne di tacâsi ae alimentazion de rêt eletriche" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Nol è pussibil doprâ il dispositîf intant che il tapon al è sierât" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s Device Update" +msgstr "Inzornament dispositîf %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s System Update" +msgstr "Inzornament sisteme %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Inzornament dal controlôr incorporât %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s ME Update" +msgstr "Inzornament motôr di gjestion %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Inzornament motôr di gjestion (ME) aziendâl di %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:238 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Inzornament motôr di gjestion (ME) utent di %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:244 +#, c-format +msgid "%s Controller Update" +msgstr "Inzornament dal controlôr %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Inzornament dal controlôr Thunderbolt di %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Inzornament dal Microcode de CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:260 +#, c-format +msgid "%s Configuration Update" +msgstr "Inzornament configurazion %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Battery Update" +msgstr "Inzornament pe batarie %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:269 +#, c-format +msgid "%s Camera Update" +msgstr "Inzornament pe fotocjamare %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:273 +#, c-format +msgid "%s TPM Update" +msgstr "Inzornament pal TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:277 +#, c-format +msgid "%s Touchpad Update" +msgstr "Inzornament pal touchpad %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:281 +#, c-format +msgid "%s Mouse Update" +msgstr "Inzornament pal mouse %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:285 +#, c-format +msgid "%s Keyboard Update" +msgstr "Inzornament pe tastiere %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Inzornament dal controlôr di archiviazion %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Network Interface Update" +msgstr "Inzornament de interface di rêt %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s Display Update" +msgstr "Inzornament visôr %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s BMC Update" +msgstr "Inzornament BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:309 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Inzornament ricevidôr USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:313 +#, c-format +msgid "%s Drive Update" +msgstr "Inzornament unitât %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Inzornament unitât flash %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s SSD Update" +msgstr "Inzornament SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s GPU Update" +msgstr "Inzornament GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s Dock Update" +msgstr "Inzornament postazion di atac %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:337 +#, c-format +msgid "%s USB Dock Update" +msgstr "Inzornament postazion di atac USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1922 +msgid "Firmware update could not be applied: " +msgstr "Nol è stât pussibil aplicâ l'inzornament dal firmware: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Supuart di inzornament dai Firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Al furnìs supuart pai inzornaments dai firmware" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Instalâ il software cence firme?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Il software che si à di instalâ nol è firmât. Nol sarà pussibil verificâ la " +"origjin dai inzornaments par chest software, o se i inzornaments a son stâts" +" sfuarçâts." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Discjamâ il software cence firme?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Inzornaments no firmâts a son disponibii. Cence une firme nol è pussibil " +"verificâ la origjin dal inzornament, o se al è stât sfuarçât." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Inzornâ il software cence firme?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Inzornaments no firmâts a son disponibii. Cence une firme nol è pussibil " +"verificâ la origjin dal inzornament, o se al è stât sfuarçât. I inzornaments" +" software a vignaran disabilitâts fintremai che i inzornaments no firmâts a " +"vignaran gjavâts o inzornâts." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Nol è stât pussibil instalâ i inzornaments: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pachets" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1436 +msgid "Failed to wait on transaction end before download: " +msgstr "Nol è stât pussibil spietâ la fin de transazion prime di discjariâ: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1443 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1456 +msgid "Failed to download updates: " +msgstr "Impussibil discjariâ i inzornaments: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1495 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1505 +msgid "Failed to trigger update: " +msgstr "Nol è stât pussibil ativâ l'inzornament: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3270 +msgid "Operating System (OSTree)" +msgstr "Sisteme Operatîf (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Archivi Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Supuart Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Un snap al è un pachet universâl par Linux" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Un biel mût di ministrâ il software sul sisteme." + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Impussibil cjatâ “%s”" + +#~ msgid "Moderate page" +#~ msgstr "Moderâ pagjine" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "No son recensions di moderâ" + +#~ msgid "Was this review useful to you?" +#~ msgstr "La recension ise stade utile?" + +#~ msgid "Yes" +#~ msgstr "Sì" + +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "Meh" +#~ msgstr "Mah" + +#~ msgid "Outdated SDK version" +#~ msgstr "Version SDK datade" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Inzornaments dal Sisteme operatîf no disponibii" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "" +#~ "Nol è stât pussibil instalâ un impuartant inzornament dal sisteme operatîf." + +#~ msgid "No Network" +#~ msgstr "Nissune rêt" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "L'acès a internet al è necessari par controlâ i inzornaments." + +#~ msgid "Network _Settings" +#~ msgstr "Impostazions di _rêt" + +#~ msgid "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "I avanzaments software a son stâts discjariâts e a son pronts pe " +#~ "instalazion." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "I inzornaments software a son stâts discjariâts e a son pronts pe " +#~ "instalazion." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Inserìs un numar di 1 a %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Sielç une aplicazion:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s al è cumò instalât" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Une aplicazion e je stade gjavade" +#~ msgstr[1] "A son stadis gjavadis aplicazions" + +#~ msgid "Downloading software catalog" +#~ msgstr "Daûr a discjamâ il catalic dai softwares" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Inzornaments automatics in pause" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be changed in Settings." +#~ msgstr "" +#~ "La rêt atuâl e je a consum, duncje e podarès vê limits sui dâts o tarifis associadis a chescj. Par sparagnâ dâts, i inzornaments automatics a son stâts metûts in pause.\n" +#~ "\n" +#~ "Se la rêt no je stade identificade ben, stant che no je a consum, tu puedis cambiâ cheste configurazion in Impostazions." + +#~ msgid "Open Network _Settings" +#~ msgstr "Vierç _Impostazions di rêt" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Par evitâ spesis e gossis di rêt, i inzornaments software no vegnin " +#~ "discjamâts in automatic su conessions mobilis (celulârs e v.i.) o a consum " +#~ "(cun limits di dâts a disposizion)." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Se pussibil, al discjame e al instale in sotfont i inzornaments software" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Mostre dome aplicazions _libaris" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Mostre dome aplicazions cun licence libare e plate dutis lis aplicazions " +#~ "proprietariis" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Ce ti isal plasût di cheste aplicazion? Lassâ la tô opinion, adun cui motîfs" +#~ " par lassâ une recension, al è util par chei altris." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Impussibil discjariâ i inzornaments: al coventave l'acès a internet ma nol " +#~ "jere disponibil" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Impussibil discjariâ i inzornaments: nol jere vonde spazi sul disc" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Impussibil discjariâ i inzornaments: e coventave la autenticazion" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Impussibil discjariâ i inzornaments: la autenticazion no jere valide" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "Impussibil instalâ %s: no si à i permès par instalâ software" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Impussibil instalâ %s: il nivel de batarie al è masse bas" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Impussibil instalâ i inzornaments: nol è vonde spazi sul disc" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Impussibil instalâ i inzornaments: e coventave la autenticazion" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Impussibil instalâ i inzornaments: la autenticazion no jere valide" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "Impussibil inzornâ %s: no si à i permès par inzornâ software" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Impussibil inzornâ i inzornaments: no si à i permès par inzornâ software" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Impussibil instalâ i inzornaments: e covente tacâsi ae prese di alimentazion" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Impussibil inzornâ %s: il nivel de batarie al è masse bas" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Impussibil instalâ i inzornaments: il nivel de batarie al è masse bas" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Impussibil avanzâ a %s: al coventave l'acès a internet ma nol jere " +#~ "disponibil" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Impussibil avanzâ a %s: no si à i permès par avanzâ" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Impussibil avanzâ a %s: il nivel de batarie al è masse bas" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Impussibil gjavâ %s: e coventave la autenticazion" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Impussibil gjavâ %s: la autenticazion no jere valide" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Impussibil gjavâ %s: no si à i permès par gjavâ software" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Impussibil gjavâ %s: e covente la alimentazion vie prese" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Impussibil gjavâ %s: il nivel de batarie al è masse bas" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Impussibil gjavâ %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "No si è rivâts a instalâ il file: no supuartât" + +#~ msgid "Failed to install: not supported" +#~ msgstr "No si è rivâts a instalâ: no supuartât" + +#~ msgid "AC power is required" +#~ msgstr "Al covente jessi tacâts ae prese" + +#~ msgid "Network Settings" +#~ msgstr "Impostazions di rêt" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Rêt a consum ‒ inzornaments automatics in pause" + +#~ msgid "Find Out _More" +#~ msgstr "Par savê di _plui" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Un inzornament software impuartant al è pront pe instalazion." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Impuartant: a son in spiete inzornaments software critics." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Par plasê discjarie i inzornaments software." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Daûr a discjariâ lis informazions di avanzament…" + +#~ msgid "Downloading featured images…" +#~ msgstr "Daûr a discjariâ lis imagjins in risalt…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Mostre informazion detaiadis di debug" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Al pues acedi a files arbitraris" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Disinstalâ pardabon %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s al vignarà disinstalât e par podêlu doprâ di gnûf tu varâs di instalâlu." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "La ultime date/ore che il sisteme al jere in rêt e si à vût cualsisei " +#~ "inzornament" + +#~ msgid "_User" +#~ msgstr "_Utent" + +#~ msgid "An application" +#~ msgstr "Une aplicazion" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Chest software nol è disponibil te tô lenghe e al vignarà fûr par inglês, " +#~ "chel dai Stâts Unîts." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Lis estensions selezionadis a vignaran instaladis cu la aplicazion." + +#~ msgid "Applications" +#~ msgstr "Aplicazions" + +#~ msgid "_Continue" +#~ msgstr "_Continue" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u aplicazion" +#~ msgstr[1] "%u aplicazions" + +#~ msgid "Post Review" +#~ msgstr "Publiche recension" + +#~ msgid "_Post" +#~ msgstr "_Publiche" + +#~ msgid "Rating" +#~ msgstr "Valutazion" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Fâs un curt struc de tô recension, par esempli: \"Maraveose aplicazion, " +#~ "conseade\"." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Recension" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Ce pensitu de aplicazion? Cîr di dâ motîfs aes tôs opinions." + +#~ msgid "No screenshot provided" +#~ msgstr "Schermade no furnide" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Torne invie cumò" + +#~ msgid "Primary Menu" +#~ msgstr "Menù primari" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Inzornaments" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s no je plui supuartade." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Chest al significhe che nol ricevarà inzornaments di sigurece." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Si consee di avanzâ a une version plui resinte." + +#~ msgid "Update All" +#~ msgstr "Inzorne dut" + +#~ msgid "Application Updates" +#~ msgstr "Inzornaments aplicazion" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Gjestôr di aplicazions par GNOME" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Al ven discjariât il catalic dai software" + +#~ msgid "Name" +#~ msgstr "Non" + +#~ msgid "system" +#~ msgstr "sisteme" + +#~ msgid "user" +#~ msgstr "utent" + +#~ msgid "Channel" +#~ msgstr "Canâl" + +#~ msgid "Branch" +#~ msgstr "Ram" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Instalazion" + +#~ msgid "Version" +#~ msgstr "Version" + +#~ msgid "Access arbitrary files" +#~ msgstr "Acedi a files arbitraris" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Al pues acedi a files arbitraris sul filesystem" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Nissun inzornament al è stât instalât tal sisteme." + +#~ msgid "A list of popular applications" +#~ msgstr "Une liste di aplicazions popolârs" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Une liste di aplicazions di doprâ, passant parsore a chês definidis di " +#~ "sisteme." + +#~ msgid "Checking…" +#~ msgstr "Daûr a controlâ…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Daûr a cjariâ…" + +# recensions des aplicazions o recensions de aplicazion? +#~ msgid "Downloading application ratings…" +#~ msgstr "Daûr a discjariâ lis recensions de aplicazion…" + +#~ msgid "GNOME Software" +#~ msgstr "GNOME Software" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "L'URI che al fâs riferiment al fonts par un strisson di inzornament." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the upgrade " +#~ "version." +#~ msgstr "" +#~ "L'URI al pues contignî fin a trê '%u', che a vignaran sostituîts de version " +#~ "di inzornament." + +#~ msgid "Welcome" +#~ msgstr "Benvignûts" + +#~ msgid "Welcome to Software" +#~ msgstr "Benvignûts a Software" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. See" +#~ " our recommendations, browse the categories, or search for the applications " +#~ "you want." +#~ msgstr "" +#~ "Software ti fâs instalâ ducj i software che ti coventin, dut di un puest " +#~ "sôl. Bute un voli ai nestris conseis, esplore lis categoriis o cîr lis " +#~ "aplicazions che tu desideris." + +#~ msgid "_Browse Software" +#~ msgstr "_Esplore Software" + +#~ msgid "_Add shortcut" +#~ msgstr "_Zonte scurte" + +#~ msgid "Re_move shortcut" +#~ msgstr "Gja_ve scurte" + +#~ msgid "OS Updates" +#~ msgstr "Inzornament dal SO" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Al inclût mioraments di prestazion, stabilitât e sigurece." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Daûr a discjariâ la firme dal inzornament dal firmware…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Daûr a discjariâ i metadâts dal inzornament dal firmware…" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Mostre la domande par instalâ i dipuesits software no libars" + +#~ msgid "App comes from a trusted source" +#~ msgstr "La App e rive di une sorzint fidade" + +#~ msgid "Requires a specific screen size" +#~ msgstr "E domande une specifiche dimension di schermi" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "No otimizât par dispositîfs tatii o celulârs" + +#~ msgid "Editor’s Picks" +#~ msgstr "Selezionadis di noaltris" + +#~ msgid "Recently Updated" +#~ msgstr "Inzornadis di resint" + +#~ msgid "_Read More" +#~ msgstr "_Lei di plui" + +#~ msgid "_Read Less" +#~ msgstr "_Lei di mancul" + +#~ msgid "_Launch" +#~ msgstr "_Invie" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Mai" + +# aplicazion +#~ msgid "Localized in your Language" +#~ msgstr "Localizade te tô lenghe" + +#~ msgid "Release Activity" +#~ msgstr "Ativitât di publicazion" + +#~ msgid "Developer" +#~ msgstr "Svilupadôr" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Disinstalât" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Instalade" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Inzornade" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "No cognossude" + +#~ msgid "History" +#~ msgstr "Cronologjie" + +#~ msgid "More…" +#~ msgstr "Plui…" + +#~ msgid "Recommended Games" +#~ msgstr "Zûcs conseâts" + +#~ msgid "Recommended Creation Applications" +#~ msgstr "Aplicazions par creâ conseadis" + +#~ msgid "Recommended Work Applications" +#~ msgstr "Aplicazions par lavorâ conseadis" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on use, " +#~ "sharing, and access to source code." +#~ msgstr "" +#~ "Alc di chest software al è proprietari e duncje al à restrizions sul ûs, su " +#~ "la condivision e sul acès al codiç sorzint." + +#~ msgid "Find out more…" +#~ msgstr "Par savê di plui…" + +#~ msgid "Recent Releases" +#~ msgstr "Publicazions resintis" + +#~ msgid "Remove “%s”?" +#~ msgstr "Gjavâ “%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Disabilitâ “%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Nissun dipuesit adizionâl" + +#~ msgid "_Remove…" +#~ msgstr "_Gjave…" + +#~ msgid "_Disable…" +#~ msgstr "_Disabilite…" + +#~ msgid "Disabling" +#~ msgstr "Daûr a disabilitâ" + +#~ msgid "Enabled" +#~ msgstr "Abilitât" + +#~ msgid "Disabled" +#~ msgstr "Disabilitât" + +#~ msgid "_Remove All" +#~ msgstr "_Gjave ducj" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "" +#~ "I inzornaments a vignaran aplicâts cuant che si tornarà a inviâ il computer." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "In spiete di discjariâ %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Daûr a discjariâ %s %s" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (al domande atenzion)" + +#~ msgid "Setting Up Updates…" +#~ msgstr "Daûr a configurâ i inzornaments…" + +#~ msgid "Looking for New Updates…" +#~ msgstr "Daûr a cirî gnûfs inzornaments…" + +#~ msgid "Select All" +#~ msgstr "Selezione dut" + +#~ msgid "Select None" +#~ msgstr "Nissune selezion" + +#~ msgid "Featured %s" +#~ msgstr "In risalt par %s" + +#~ msgid "Show" +#~ msgstr "Mostre" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Menù filtrament sot-categoriis" + +#~ msgid "Sort" +#~ msgstr "Ordene" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Menù ordenament sot-categoriis" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Dutis" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgid "Audio & Video" +#~ msgstr "Audio e video" + +#~ msgid "Developer Tools" +#~ msgstr "Struments di svilup" + +#~ msgid "Education & Science" +#~ msgstr "Educazion e Sience" + +#~ msgid "Games" +#~ msgstr "Zûcs" + +#~ msgid "Graphics & Photography" +#~ msgstr "Fotografie" + +#~ msgid "Productivity" +#~ msgstr "Produtivitât" + +#~ msgid "Communication & News" +#~ msgstr "Comunicazion e notiziis" + +#~ msgid "Utilities" +#~ msgstr "Utilitâts" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Impussibil determinâ cualis parts dal sisteme a son acessibilis di cheste " +#~ "aplicazion. Chest al è solit pes aplicazions vecjis." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Bas" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Medi" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Elevât" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "No cognossût" + +#~ msgid "Public domain" +#~ msgstr "Domini public" + +# fâ pagjine par software proprietari su vikipedie +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "I utents a son limitâts de licence chi daurman:" +#~ msgstr[1] "I utents a son limitâts des licencis chi daurman:" + +# aplicazion +#~ msgid "Sandboxed" +#~ msgstr "Isolade" + +#~ msgid "Category" +#~ msgstr "Categorie" + +#~ msgid "Free" +#~ msgstr "Libar" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "No cognossude" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, studied" +#~ " and modified." +#~ msgstr "" +#~ "Chest al significhe che il software al pues jessi inviât, copiât, " +#~ "distribuît, studiât e modificât cence fastidis." + +#~ msgid "Proprietary Software" +#~ msgstr "Software proprietari" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. There " +#~ "are often restrictions on its use and its source code cannot usually be " +#~ "accessed." +#~ msgstr "" +#~ "Chest al significhe che il software al è di proprietât di une persone o di " +#~ "une compagnie. Di solit a son restrizions sul ûs e il so codiç sorzint di " +#~ "solit nol è acessibil." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "I tiermins di licence di chest software no son cognossûts." + +# proviôt o e je caraterizade? +#~ msgid "The application was rated this way because it features:" +#~ msgstr "La aplicazion e je stade valutade cussì par vie che e proviôt:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Nissun detai al jere disponibil par cheste valutazion." + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Aplicazions audio e video conseadis" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Aplicazions di produtivitât conseadis" + +#~ msgid "ratings in total" +#~ msgstr "recensions in totâl" + +#~ msgid "Software is up to date" +#~ msgstr "Il software al è inzornât" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "ODRS al è un servizi che al furnìs recensions dai utents des aplicazions" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Personaçs di cartons animâts in situazions pericolosis" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Personaçs di cartons animâts in conflit violent" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Grafiche di violence che e cjape dentri personaçs di cartons animâts" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Personaçs in situazions pericolosis facilis di distingui de realtât" + +#~ msgid "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Personaçs in conflit violent facil di distingui de realtât" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Grafiche di violence facil di distingui de realtât" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Personaçs un pôc realistics in situazions pericolosis" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Figuris di personaçs realistics in conflit violent" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Grafiche di violence che e cjape dentri personaçs realistics" + +#~ msgid "No bloodshed" +#~ msgstr "Nissun maçament" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Maçaments no realistics" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Maçaments realistics" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Figuris di sassinaments e mutilazions di tocs di cuarp" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Stupri o altris compuartaments sessuâi violents" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Riferiments a bevandis alcolichis" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Ûs di bevandis alcolichis" + +#~ msgid "References to illicit drugs" +#~ msgstr "Riferiments a droghis ilecitis" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Ûs ilecit di droghis" + +#~ msgid "References to tobacco products" +#~ msgstr "Riferiments a tabacs" + +#~ msgid "Use of tobacco products" +#~ msgstr "Ûs di tabacs" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Curte crotarie artistiche" + +#~ msgid "Prolonged nudity" +#~ msgstr "Crotarie sprolungjade" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Figuris o riferiments provocants" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Riferiments o figuris sessuâi" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Grafiche di compuartaments sessuâi" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Ûs lizêr o no frecuent di profanitâts" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Ûs moderât di blasfemie" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Ûs frecuent e fuart di blasfemie" + +#~ msgid "Slapstick humor" +#~ msgstr "Umorisim di comedie grese" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Umorisim volgâr o di cesso" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Umorisim soç o par grancj" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativitât viers un specific grup di personis" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Discriminazion pensade par fâ mâl emotivamentri" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Discriminazion esplicite basade su gjenar, sessualitât, raze o religjon" + +#~ msgid "Product placement" +#~ msgstr "Vendite di prodots" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Riferiments esplicits a marcjis specifichis o prodots firmâts" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "I utents a son incitâts a comprâ ogjets reâi specifics" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Zûc di azart su events casuâi che al dopre gjetons o credits" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Zûc di azart che al dopre bêçs “dal zûc”" + +#~ msgid "Gambling using real money" +#~ msgstr "Zûc di azart che al dopre bêçs vêrs" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "I utents a son incitâts a donâ bêçs vêrs" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Abilitât di spindi bêçs vêrs inte aplicazion" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Interazions tra utents cence funzionalitât di chat" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Funzionalitât no controllade di chat tra utents" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Funzionalitât no controllade di chat video o audio tra utents" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Condivision di nons utent di social network o direzions e-mail" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Control pe ultime version de aplicazion" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Condivision di dâts diagnostics che no permetin a altris di identificâ " +#~ "l'utent" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Condivision di dâts diagnostics che a permetin a altris di identificâ " +#~ "l'utent" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Condivision posizion fisiche cun altris utents" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Riferiments indirets ae omosessualitât" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Bussadis tra personis dal stes ses" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Compuartament sessuâl grafic tra personis dal stes ses" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Riferiments indirets ae prostituzion" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Riferiments direts ae prostituzion" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Rapresentazions grafichis dal at di prostituzion" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Riferiments indirets al adulteri" + +#~ msgid "Direct references to adultery" +#~ msgstr "Riferiment direts al adulteri" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Rapresentazions grafichis dal at di adulteri" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Personaçs umans pôc vistîts" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Personaçs umans sessuâts in maniere anomale" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Rapresentazions o riferiments a profanazions storichis" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Rapresentazion di profanazion umane moderne" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Rapresentazions grafichis di profanazion moderne" + +#~ msgid "Visible dead human remains" +#~ msgstr "Rescj di oms muarts visibii" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Rescj di oms muarts che a son esposcj ai elements" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Rapresentazions grafichis di profanazion di cuarps umans" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Rapresentazions o riferiments a sclavitût storiche" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Rapresentazions de sclavitût moderne" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Rapresentazions grafichis de sclavitût moderne" + +#~ msgid "General" +#~ msgstr "Gjenerâl" + +#~ msgid "ALL" +#~ msgstr "DUCJ" + +#~ msgid "Teen" +#~ msgstr "Fantat" + +#~ msgid "Everyone 10+" +#~ msgstr "Ducj parsore dai 10" + +#~ msgid "Everyone" +#~ msgstr "Ducj" + +#~ msgid "Early Childhood" +#~ msgstr "Prime infanzie" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "No cognossude" + +#~ msgid "Released" +#~ msgstr "Publicât" + +#~ msgid "Format" +#~ msgstr "Formât" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Îr, %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Îr, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Trê dîs indaûr" + +#~ msgid "Four days ago" +#~ msgstr "Cuatri dîs indaûr" + +#~ msgid "Five days ago" +#~ msgstr "Cinc dîs indaûr" + +#~ msgid "Six days ago" +#~ msgstr "Sîs dîs indaûr" + +#~ msgid "Two weeks ago" +#~ msgstr "Dôs setemanis indaûr" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Nin a fâ compris" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Gjavade" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Sigûrs di gjavâ %s?" + +#~ msgid "Security Updates Pending" +#~ msgstr "Inzornaments di sigurece in spiete" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Si consee di instalâ daurman i inzornaments impuartants" + +#~ msgid "Restart & Install" +#~ msgstr "Torne invie e instale" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Inzornaments impuartants pal sisteme operatîf e pes aplicazions a son pronts" +#~ " par jessi instalâts" + +#~ msgid "View" +#~ msgstr "Visualize" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Abilite il dipuesit des estensions di GNOME Shell" + +#~ msgid "this website" +#~ msgstr "chest sît web" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Si scugne tornâ a inviâ cheste aplicazion par podê doprâ i gnûfs plugin." + +#~ msgid "About %s" +#~ msgstr "Informazions su %s" + +#~ msgid "%s ME" +#~ msgstr "Motôr di gjestion (ME) di %s" + +#~ msgid "Extension Settings" +#~ msgstr "Impostazions estensions" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it is" +#~ " recommended to disable them." +#~ msgstr "" +#~ "Lis estensions a son dopradis cun to pericul. Se tu âs cualsisei probleme di" +#~ " sisteme, al è conseât di disabilitâlis." + +#~ msgid "Spacing" +#~ msgstr "Spaziadure" + +#~ msgid "The amount of space between children" +#~ msgstr "La cuantitât di spazi tra i fîs" + +#~ msgid "Featured Applications" +#~ msgstr "Aplicazions in risalt" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Estensions de Shell" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Dipuesit des estensions di GNOME Shell" + +# delle estensioni o della estensione? +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Daûr a discjariâ i metadâts de estension de shell…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Estensions de Shell di GNOME" + +#~ msgid "Failed to load components" +#~ msgstr "No si è rivâts a cjariâ i components" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS validât OK!" + +#~ msgid "Failed to load file" +#~ msgstr "No si è rivâts a cjariâ il file" + +#~ msgid "Unsaved changes" +#~ msgstr "Modifichis no salvadis" + +#~ msgid "The application list is already loaded." +#~ msgstr "La liste des aplicazions e je za cjariade." + +#~ msgid "Merge documents" +#~ msgstr "Unìs documents" + +#~ msgid "Throw away changes" +#~ msgstr "Bute vie lis modifichis" + +#~ msgid "Open AppStream File" +#~ msgstr "Vierç file AppStream" + +#~ msgid "Save AppStream File" +#~ msgstr "Salve file AppStream" + +#~ msgid "_Save" +#~ msgstr "_Salve" + +#~ msgid "%s banner design deleted." +#~ msgstr "Eliminât disen de insegne di %s." + +#~ msgid "Banner design deleted." +#~ msgstr "Eliminât disegn de insegne." + +# proviôt o e je caraterizade? +#~ msgid "The application list has unsaved changes." +#~ msgstr "La liste des aplicazions e à modifichis no salvadis." + +#~ msgid "Use verbose logging" +#~ msgstr "Dopre regjistrazions prolissis" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Progjetazion insegnis software di GNOME" + +#~ msgid "No Designs" +#~ msgstr "Nissun disen" + +#~ msgid "Error message here" +#~ msgstr "Messaç di erôr achì" + +#~ msgid "Category Featured" +#~ msgstr "Categorie “In risalt”" + +#~ msgid "Undo" +#~ msgstr "Disfe" + +#~ msgid "Banner Designer" +#~ msgstr "Progjetazion insegnis" + +#~ msgid "New Banner" +#~ msgstr "Gnove insegne" + +#~ msgid "Import from file" +#~ msgstr "Impuarte di file" + +#~ msgid "Export to file" +#~ msgstr "Espuarte su file" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Progjete lis insegnis in risalt par GNOME Software" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;Aplicazion;" + +#~ msgid "Show the folder management UI" +#~ msgstr "Mostre la IU de gjestion des cartelis" + +#~ msgid "Folder Name" +#~ msgstr "Non de cartele" + +#~ msgid "_Add" +#~ msgstr "_Zonte" + +#~ msgid "Add to Application Folder" +#~ msgstr "Zonte ae cartele aplicazions" + +#~ msgid "Click on items to select them" +#~ msgstr "Fâs clic sui elements par selezionâju" + +#~ msgid "Select" +#~ msgstr "Selezione" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Zonte ae cartele…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Sposte te cartele…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Gjave de cartele" + +#~ msgid "Top Rated" +#~ msgstr "I miôr valutâts" + +#~ msgid "_All" +#~ msgstr "_Dut" + +#~ msgid "Sign In / Register…" +#~ msgstr "Jentre / Regjistriti…" + +#~ msgid "Continue" +#~ msgstr "Continue" + +#~ msgid "Use" +#~ msgstr "Dopre" + +#~ msgid "Add another…" +#~ msgstr "Zonte un altri…" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s al sarà instalât e tu tu vignarâs contizât di %s." + +#~ msgid "A$%.2f" +#~ msgstr "%.2f$A" + +#~ msgid "C$%.2f" +#~ msgstr "%.2f$C" + +#~ msgid "CN¥%.2f" +#~ msgstr "%.2f¥CN" + +#~ msgid "€%.2f" +#~ msgstr "%.2f€" + +#~ msgid "£%.2f" +#~ msgstr "%.2f£" + +#~ msgid "¥%.2f" +#~ msgstr "%.2f¥" + +#~ msgid "NZ$%.2f" +#~ msgstr "%.2f$NZ" + +#~ msgid "₽%.2f" +#~ msgstr "%.2f₽" + +#~ msgid "US$%.2f" +#~ msgstr "%.2f$US" + +#~ msgid "Signed in as %s" +#~ msgstr "Jentrât come %s" + +#~ msgid "Sign in…" +#~ msgstr "Jentre…" + +#~ msgid "Sign out" +#~ msgstr "Disconet" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Impussibil comprâ %s: e coventave la autenticazion" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Impussibil comprâ %s: la autenticazion no jere valide" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Impussibil comprâ %s: nissun sisteme di paiament configurât" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Impussibil comprâ %s: il paiament al è stât refudât" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Par continuâ si scugne doprâ un account Ubuntu One." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Par continuâ tu scugnis doprâ il to account Ubuntu One." + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Al ven cjariât il catalic dai software" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "..." +#~ msgstr "..." + +#~ msgid "Show profiling information for the service" +#~ msgstr "Mostre lis informazions dal profîl pal servizi" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Par continuâ tu scugnis jentrâ in %s." + +#~ msgid "Email address" +#~ msgstr "Direzion e-mail" + +#~ msgid "I have an account already" +#~ msgstr "O ai za un account" + +#~ msgid "I want to register for an account now" +#~ msgstr "O desideri regjistrâ un account cumò" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Jentre in automatic la prossime volte" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Inserìs il to pin a ûs singul pe autenticazion a doi fatôrs." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Autentiche" + +#~ msgid "_About" +#~ msgstr "_Informazions" + +#~ msgid "_Quit" +#~ msgstr "_Jes" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Lis informazions su %s, cussì come lis opzions su ce mût otignî un codec par" +#~ " podê riprodusi chest formât, a puedin jessi cjatadis sul sît web." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Il to account %s al è stât sospindût." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Nol è pussibil instalâ software fintant che chest nol è stât risolt." + +#~ msgid "For more information, visit %s." +#~ msgstr "Par vê plui informazions, visite %s." + +#~ msgid "Downloading new updates…" +#~ msgstr "Daûr a discjariâ i gnûfs inzornaments…" + +# de aplicazion o des aplicazions? +#~ msgid "Downloading application page…" +#~ msgstr "Daûr a discjariâ la pagjine de aplicazion…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "La plateforme finâl di intratigniment di Valve" + +#~ msgid "Applications Updated" +#~ msgstr "Aplicazions inzornadis" + +#~ msgid "Includes: ." +#~ msgstr "Al inclût: ." + +#~ msgid "Restart & _Install" +#~ msgstr "Torne invie e _instale" + +#~ msgid "Getting runtime source…" +#~ msgstr "Daûr a recuperâ il sorzint dal runtime…" + +#~ msgid "Limba Support" +#~ msgstr "Supuart Limba" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba al furnìs ai svilupadôrs une maniere semplice par creâ racueltis di " +#~ "software" + +#~ msgid "Sorted by Name" +#~ msgstr "Ordenât par non" + +#~ msgid "Sorted by Rating" +#~ msgstr "Ordenât par valutazion" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "" +#~ "La liste di sorzints suplementârs che a son stadis abilitadis tal imprin" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing third-" +#~ "party applications." +#~ msgstr "" +#~ "La liste di sorzints che a son stadis abilitadis tal imprin cuant che si " +#~ "instalave lis aplicazions di tiercis parts." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Mostre software no libar tai risultâts de ricercje" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "" +#~ "La liste di sorzints no libaris che a puedin jessi abilitadis in maniere " +#~ "opzionâl" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Abilitâ sorzints software proprietariis?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Nissune aplicazion o estension instalade; al è pussibil che lu sedi altri " +#~ "software" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Di solit al à restrizions sul ûs e acès al codiç sorzint." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Sorzints Software proprietariis" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you access " +#~ "to additional software that is not provided by %s." +#~ msgstr "" +#~ "Lis sorzints software a puedin jessi scjariadis di internet. Ti puedin ufrî " +#~ "l'acès a software adizionâi che no son furnîts di %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from it." +#~ msgstr "" +#~ "Gjavant une sorzint tu gjavarâs ancje ducj i software che tu âs instalât di " +#~ "jê." + +#~ msgid "No software installed from this source" +#~ msgstr "Nissun software instalât di cheste sorzint" + +#~ msgid "Installed from this Source" +#~ msgstr "Instalât di cheste sorzint" + +#~ msgid "Last Checked" +#~ msgstr "Ultin control" + +#~ msgid "Added" +#~ msgstr "Zontade" + +#~ msgid "Website" +#~ msgstr "Sît web" + +#~ msgid "Remove Source" +#~ msgstr "Gjave sorzint" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Interazions predefinidis tra zuiadôrs cence funzionalitât di chat" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Condivît lis informazions dal utent cun tiercis parts" + +#~ msgid "page1" +#~ msgstr "pagjine1" + +#~ msgid "page2" +#~ msgstr "pagjine2" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgid "“%s” [%s]" +#~ msgstr "“%s” [%s]" + +#~ msgid "Total" +#~ msgstr "Totâl" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Ducj" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "In risalt" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomie" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Chimiche" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matematiche" + +#~ msgid "Science" +#~ msgstr "Sience" + +#~ msgid "Installation of %s failed." +#~ msgstr "Instalazion di %s falide." + +#~ msgid "Removal of %s failed." +#~ msgstr "Rimozion di %s falide." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Controle di vê l'acès a internet e torne prove." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Libere un tic di spazi e torne prove." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Se il probleme al persist contate il furnidôr dal software." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Nissun" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Lis sorzints software ti furnissin l'acès a software adizionâi." + +#~ msgid "3rd party" +#~ msgstr "tiercis parts" + +#~ msgid "nonfree" +#~ msgstr "no libare" + +#~ msgid "shell extension" +#~ msgstr "estension de shell" + +#~ msgid "_Installing" +#~ msgstr "_Instalazion" + +#~ msgid "_Removing" +#~ msgstr "_Rimozion" + +#~ msgid " or " +#~ msgstr " o " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "No cognossude" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Chest software al ven di tiercis parts." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Chest software al ven di une tierce part e e podarès contignî components no " +#~ "libars." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Chest software al podarès contignî components no libars." + +#~ msgid "non-free" +#~ msgstr "no libare" + +#~ msgid "One Star" +#~ msgstr "Une stele" + +#~ msgid "Two Stars" +#~ msgstr "Dôs stelis" + +#~ msgid "Three Stars" +#~ msgstr "Trê stelis" + +#~ msgid "Four Stars" +#~ msgstr "Cuatri stelis" + +#~ msgid "Five Stars" +#~ msgstr "Cinc stelis" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "Nissune" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Aplicazions di ufici conseadis" + +#~ msgid "Audio" +#~ msgstr "Audio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Modifiche" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Base di dâts" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Incision disc" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Radioamadôr" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mixer" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Musiche" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Regjistradôrs" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Secuenziadôrs" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Sintonizadôr" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Compilazion" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Base di dâts" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Analisi" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "Gjestion progjet" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Svilup web" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologjie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Informatiche" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Visualizazion di dâts" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Economie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Eletricitât" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Eletroniche" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Inzegnarie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Gjeologjie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Sience de tiere" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Storie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Elaborazion imagjin" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Leterature" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Mapis" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Musiche" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Analisis numerichis" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Calcul paralêl" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fisiche" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Spiritualitât" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Sclopetadis" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulazion" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgid "Graphics" +#~ msgstr "Grafiche" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "Grafiche 2D" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Editorie" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Grafiche raster" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Conession dialup" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Pueste eletroniche" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Notiziari" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Trasferiment file" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Radioamadôr" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Messaçs istantanis" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "Client IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Tignî di voli" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonie" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Svilup web" + +#~ msgid "Office" +#~ msgstr "Ufizi" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Diagram" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Gjestion contats" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Dizionari" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Pueste eletroniche" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Diagram di flus" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografie" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Gjestion progjet" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Editorie" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Sfuei di calcul" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Visualizadôr" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Art" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Inteligjence artificiâl" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologjie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Chimiche" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Informatiche" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Costruzion" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Visualizazion di dâts" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Economie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Eletricitât" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Eletroniche" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Inzegnarie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Gjeografie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Gjeologjie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Sience de tiere" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Storie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Umanitât" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Elaborazion imagjin" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Lenghis" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Leterature" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Mapis" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematiche" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Midisine" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Analisis numerichis" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Calcul paralêl" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fisiche" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotiche" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Spiritualitât" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emuladôr" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Gjestôr di file" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Struments pai file" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Tignî di voli" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Sigurece" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Emuladôr di terminâl" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Acessibilitât" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Archiviazion" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Calcoladorie" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Orloi" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Compression" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Struments pai file" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Mapis" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Spiritualitât" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Struments pe telefonie" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Modifiche" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Base di dâts" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Incision disc" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Regjistradôrs" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "Television" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "No cognossude" + +#~ msgid "_History" +#~ msgstr "_Cronologjie" + +#~ msgid "Size" +#~ msgstr "Dimension" diff --git a/po/ga.po b/po/ga.po new file mode 100644 index 0000000..6431bb9 --- /dev/null +++ b/po/ga.po @@ -0,0 +1,2331 @@ +# Irish translations for gnome-software package. +# Copyright (C) 2015 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-software package. +# Seán de Búrca , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software.master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-09-25 15:35-0600\n" +"PO-Revision-Date: 2015-09-25 16:08-0600\n" +"Last-Translator: Seán de Búrca \n" +"Language-Team: Irish \n" +"Language: ga\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " +"4;\n" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:1 +msgid "GNOME Software" +msgstr "Bogearraí GNOME" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:2 +msgid "Application manager for GNOME" +msgstr "" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:3 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:4 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" + +#: ../src/app-folder-dialog.ui.h:1 +msgid "Add to Application Folder" +msgstr "" + +#: ../src/app-folder-dialog.ui.h:2 ../src/gs-app-folder-dialog.c:315 +#: ../src/gs-shell-details.c:233 ../src/gs-shell-installed.c:524 +msgid "_Cancel" +msgstr "_Cealaigh" + +#: ../src/app-folder-dialog.ui.h:3 ../src/gs-app-folder-dialog.c:320 +msgid "_Add" +msgstr "Cuir _Leis" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is installed +#: ../src/app-tile.ui.h:1 ../src/gs-app-addon-row.c:96 ../src/gs-app-tile.c:72 +#: ../src/gs-app-tile.c:75 ../src/gs-feature-tile.c:67 +#: ../src/gs-popular-tile.c:73 ../src/gs-popular-tile.c:76 +#: ../src/popular-tile.ui.h:1 +msgid "Installed" +msgstr "" + +#. TRANSLATORS: this is the application name +#. set the window title back to default +#. TRANSLATORS: this is the main window title +#: ../src/org.gnome.Software.desktop.in.h:1 ../src/gnome-software.ui.h:3 +#: ../src/gs-application.c:343 ../src/gs-shell.c:159 +msgid "Software" +msgstr "Bogearraí" + +#: ../src/org.gnome.Software.desktop.in.h:2 +msgid "Add, remove or update software on this computer" +msgstr "" + +#: ../src/org.gnome.Software.desktop.in.h:3 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" + +#: ../src/gnome-software-local-file.desktop.in.h:1 +msgid "Software Install" +msgstr "" + +#: ../src/gnome-software-local-file.desktop.in.h:2 +msgid "Install selected software on the system" +msgstr "" + +#: ../src/gnome-software.ui.h:1 +msgid "Select All" +msgstr "" + +#: ../src/gnome-software.ui.h:2 +msgid "Select None" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gnome-software.ui.h:4 ../src/gs-sources-dialog.ui.h:2 +#: ../src/gs-update-dialog.ui.h:1 +msgid "Go back" +msgstr "" + +#. Translators: A label for a button to show all available software. +#: ../src/gnome-software.ui.h:6 +msgid "_All" +msgstr "_Gach Rud" + +#. Translators: A label for a button to show only software which is already installed. +#: ../src/gnome-software.ui.h:8 +msgid "_Installed" +msgstr "_Suiteáilte" + +#. Translators: A label for a button to show only updates which are available to install. +#: ../src/gnome-software.ui.h:10 +msgid "_Updates" +msgstr "_Nuashonruithe" + +#: ../src/gnome-software.ui.h:11 +msgid "Restart & _Install" +msgstr "Atosaigh & _Suiteáil" + +#: ../src/gnome-software.ui.h:12 +msgid "Select" +msgstr "Roghnaigh" + +#: ../src/gnome-software.ui.h:13 +msgid "Check for updates" +msgstr "" + +#: ../src/gs-app-folder-dialog.c:304 +msgid "Folder Name" +msgstr "Ainm Fillteáin" + +#. TRANSLATORS: this is a command line option +#: ../src/gs-application.c:90 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: ../src/gs-application.c:90 +msgid "MODE" +msgstr "" + +#: ../src/gs-application.c:92 +msgid "Search for applications" +msgstr "" + +#: ../src/gs-application.c:92 +msgid "SEARCH" +msgstr "" + +#: ../src/gs-application.c:94 +msgid "Show application details" +msgstr "" + +#: ../src/gs-application.c:94 +msgid "ID" +msgstr "CA" + +#: ../src/gs-application.c:96 +msgid "Open a local package file" +msgstr "" + +#: ../src/gs-application.c:96 +msgid "FILENAME" +msgstr "" + +#: ../src/gs-application.c:98 +msgid "Show verbose debugging information" +msgstr "" + +#: ../src/gs-application.c:100 +msgid "Show profiling information for the service" +msgstr "" + +#: ../src/gs-application.c:102 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#. TRANSLATORS: this is the title of the about window +#: ../src/gs-application.c:341 +msgid "About Software" +msgstr "Maidir le Bogearraí" + +#. TRANSLATORS: well, we seem to think so, anyway +#: ../src/gs-application.c:346 +msgid "A nice way to manage the software on your system." +msgstr "" + +#: ../src/gs-application.c:350 +msgid "translator-credits" +msgstr "Seán de Búrca " + +#. TRANSLATORS: this is a label that describes an application +#. * that has been queued for installation +#: ../src/gs-app-addon-row.c:91 ../src/gs-app-row.c:226 +#: ../src/gs-shell-details.ui.h:4 +msgid "Pending" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being installed +#: ../src/gs-app-addon-row.c:100 ../src/gs-app-row.c:250 +#: ../src/gs-app-tile.c:81 ../src/gs-app-tile.c:84 +msgid "Installing" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being removed +#: ../src/gs-app-addon-row.c:104 ../src/gs-app-row.c:259 +#: ../src/gs-app-tile.c:90 ../src/gs-app-tile.c:93 +msgid "Removing" +msgstr "" + +#. TRANSLATORS: This is how we join the licences and can +#. * be considered a "Conjunctive AND Operator" according +#. * to the SPDX specification. For example: +#. * "LGPL-2.1 and MIT and BSD-2-Clause" +#. TRANSLATORS: separator for a list of items +#: ../src/gs-app.c:1297 ../src/gs-shell-extras.c:147 +msgid " and " +msgstr " agus " + +#. TRANSLATORS: This is how we join the licences and can +#. * be considered a "Disjunctive OR Operator" according +#. * to the SPDX specification. For example: +#. * "LGPL-2.1 or MIT" +#: ../src/gs-app.c:1305 +msgid " or " +msgstr " nó " + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-row.c:210 +msgid "Visit website" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: ../src/gs-app-row.c:215 +msgid "Install…" +msgstr "Suiteáil…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: ../src/gs-app-row.c:223 +msgid "Cancel" +msgstr "Cealaigh" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#: ../src/gs-app-row.c:233 ../src/gs-utils.c:313 +msgid "Install" +msgstr "Suiteáil" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: ../src/gs-app-row.c:241 ../src/gs-page.c:178 +msgid "Remove" +msgstr "Bain" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: ../src/gs-category.c:228 +msgid "Other" +msgstr "Eile" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: ../src/gs-dbus-helper.c:307 +msgid "An application" +msgstr "Feidhmchlár" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: ../src/gs-dbus-helper.c:313 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:315 +msgid "Additional MIME Types Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: ../src/gs-dbus-helper.c:319 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:321 +msgid "Additional Fonts Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: ../src/gs-dbus-helper.c:325 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:327 +msgid "Additional Multimedia Codecs Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: ../src/gs-dbus-helper.c:331 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:333 +msgid "Additional Printer Drivers Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: ../src/gs-dbus-helper.c:337 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:339 +msgid "Additional Packages Required" +msgstr "" + +#. TRANSLATORS: this is a button that launches gnome-software +#: ../src/gs-dbus-helper.c:348 +msgid "Find in Software" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-first-run-dialog.ui.h:1 +msgid "Welcome" +msgstr "Fáilte" + +#: ../src/gs-first-run-dialog.ui.h:2 +msgid "Welcome to Software" +msgstr "Fáilte go Bogearraí" + +#: ../src/gs-first-run-dialog.ui.h:3 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" + +#: ../src/gs-first-run-dialog.ui.h:4 +msgid "_Let’s Go Shopping" +msgstr "" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: ../src/gs-hiding-box.c:384 +msgid "Spacing" +msgstr "" + +#: ../src/gs-hiding-box.c:385 +msgid "The amount of space between children" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: ../src/gs-history-dialog.c:83 +msgctxt "app status" +msgid "Removed" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: ../src/gs-history-dialog.c:89 +msgctxt "app status" +msgid "Installed" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: ../src/gs-history-dialog.c:94 +msgctxt "app status" +msgid "Updated" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: ../src/gs-history-dialog.c:100 +msgctxt "app status" +msgid "Unknown" +msgstr "Anaithnid" + +#. vim: set noexpandtab: +#: ../src/gs-history-dialog.ui.h:1 +msgid "History" +msgstr "Stair" + +#. TRANSLATORS: the transaction could not be completed +#. * as a previous transaction was unfinished +#: ../src/gs-offline-updates.c:47 +msgid "A previous update was unfinished." +msgstr "" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: ../src/gs-offline-updates.c:56 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#. * +#: ../src/gs-offline-updates.c:66 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: the transaction failed in a way the user +#. * probably cannot comprehend. Package management systems +#. * really are teh suck. +#. TRANSLATORS: the update process failed in a general +#. * way, usually this message will come from source distros +#. * like gentoo +#: ../src/gs-offline-updates.c:76 ../src/gs-offline-updates.c:99 +msgid "" +"The update couldn’t be installed; this is often a problem with the update " +"itself. Please wait for another update and try again." +msgstr "" + +#. TRANSLATORS: the user aborted the update manually +#: ../src/gs-offline-updates.c:81 +msgid "The update was cancelled." +msgstr "" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: ../src/gs-offline-updates.c:87 +msgid "The system was already up to date." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: ../src/gs-offline-updates.c:91 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: ../src/gs-offline-updates.c:104 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: these are geeky messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: ../src/gs-offline-updates.c:212 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#: ../src/gs-offline-updates.c:231 ../src/gs-shell-details.ui.h:20 +msgid "Details" +msgstr "Mionsonraí" + +#. TRANSLATORS: this is when the offline update failed +#: ../src/gs-offline-updates.c:282 +msgid "Failed To Update" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: ../src/gs-page.c:163 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: ../src/gs-page.c:175 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: ../src/gs-plugin-loader.c:779 +msgid "OS Updates" +msgstr "" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: ../src/gs-plugin-loader.c:784 +msgid "Includes performance, stability and security improvements." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-plugin-loader.c:1344 ../src/gs-shell-extras.c:389 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#: ../src/gs-plugin-loader.c:1347 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: ../src/gs-screenshot-image.c:233 +msgid "Screenshot not found" +msgstr "" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: ../src/gs-screenshot-image.c:249 +msgid "Failed to load image" +msgstr "" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: ../src/gs-screenshot-image.c:376 +msgid "Screenshot size not found" +msgstr "" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: ../src/gs-screenshot-image.c:395 +msgid "Could not create cache" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: ../src/gs-screenshot-image.c:425 +msgid "Screenshot not valid" +msgstr "" + +#. TRANSLATORS: this is when networking is not available +#: ../src/gs-screenshot-image.c:441 +msgid "Screenshot not available" +msgstr "" + +#: ../src/gs-screenshot-image.c:493 +msgid "Screenshot" +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: ../src/gs-shell-extras.c:150 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: ../src/gs-shell-extras.c:176 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: ../src/gs-shell-extras.c:184 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/gs-shell-extras.c:226 +msgid "Unable to Find Requested Software" +msgstr "" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: ../src/gs-shell-extras.c:323 +#, c-format +msgid "%s not found" +msgstr "" + +#. TRANSLATORS: hyperlink title +#: ../src/gs-shell-extras.c:327 +msgid "on the website" +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:334 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:338 ../src/gs-shell-extras.c:349 +#: ../src/gs-shell-extras.c:360 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:345 ../src/gs-shell-extras.c:367 +#, c-format +msgid "No applications are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:356 +#, c-format +msgid "%s is not available." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:371 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:378 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:382 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:393 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:400 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:404 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:411 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:415 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#: ../src/gs-shell-extras.c:460 +msgid "this website" +msgstr "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: ../src/gs-shell-extras.c:464 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/gs-shell-extras.c:544 ../src/gs-shell-extras.c:592 +#: ../src/gs-shell-extras.c:642 +msgid "Failed to find any search results" +msgstr "" + +#: ../src/gs-shell-extras.c:811 +#, c-format +msgid "%s file format" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-shell-extras.ui.h:1 +msgid "Codecs page" +msgstr "" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#: ../src/gs-shell-details.c:172 ../src/gs-shell-details.ui.h:2 +msgid "_Install" +msgstr "_Suiteáil" + +#. TRANSLATORS: button text in the header when an application +#. * is in the process of being installed +#: ../src/gs-shell-details.c:183 +msgid "_Installing" +msgstr "Á _Shuiteáil" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software sources or the like +#: ../src/gs-shell-details.c:200 +msgid "_Install…" +msgstr "_Suiteáil…" + +#. TRANSLATORS: button text in the header when an application can be erased +#: ../src/gs-shell-details.c:220 ../src/gs-shell-details.ui.h:3 +msgid "_Remove" +msgstr "_Bain" + +#. TRANSLATORS: button text in the header when an application can be installed +#: ../src/gs-shell-details.c:227 +msgid "_Removing" +msgstr "Á _Bhaint" + +#. TRANSLATORS: this is where the licence is not known +#: ../src/gs-shell-details.c:599 +msgctxt "license" +msgid "Unknown" +msgstr "Anaithnid" + +#. TRANSLATORS: this is where the version is not known +#: ../src/gs-shell-details.c:612 +msgctxt "version" +msgid "Unknown" +msgstr "Anaithnid" + +#. TRANSLATORS: this is where the size is being worked out +#: ../src/gs-shell-details.c:618 +msgctxt "size" +msgid "Calculating…" +msgstr "" + +#. TRANSLATORS: this is where the size is not known +#: ../src/gs-shell-details.c:621 +msgctxt "size" +msgid "Unknown" +msgstr "Anaithnid" + +#. TRANSLATORS: this is where the updated date is not known +#: ../src/gs-shell-details.c:633 +msgctxt "updated" +msgid "Never" +msgstr "Riamh" + +#. TRANSLATORS: this is the application isn't in any +#. * defined menu category +#: ../src/gs-shell-details.c:647 +msgctxt "menu category" +msgid "None" +msgstr "Neamhní" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: ../src/gs-shell-details.c:662 +msgctxt "origin" +msgid "Unknown" +msgstr "Anaithnid" + +#: ../src/gs-shell-details.c:927 ../src/gs-utils.c:162 +msgid "Sorry, this did not work" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-shell-details.ui.h:1 +msgid "Details page" +msgstr "Leathanach mionsonraí" + +#: ../src/gs-shell-details.ui.h:5 +msgid "Software Source Included" +msgstr "" + +#: ../src/gs-shell-details.ui.h:6 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "" + +#: ../src/gs-shell-details.ui.h:7 +msgid "No Software Source Included" +msgstr "" + +#: ../src/gs-shell-details.ui.h:8 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "" + +#: ../src/gs-shell-details.ui.h:9 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: ../src/gs-shell-details.ui.h:11 +msgid "Software Source Identified" +msgstr "" + +#: ../src/gs-shell-details.ui.h:12 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "" + +#: ../src/gs-shell-details.ui.h:13 +msgid "Only use software sources that you trust." +msgstr "" + +#: ../src/gs-shell-details.ui.h:14 +msgid "Internet Only Application" +msgstr "" + +#: ../src/gs-shell-details.ui.h:15 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" + +#: ../src/gs-shell-details.ui.h:16 +msgid "_Website" +msgstr "Suíomh _Gréasáin" + +#: ../src/gs-shell-details.ui.h:17 +msgid "_History" +msgstr "_Stair" + +#. Translators: A label for a button to execute the selected application. +#: ../src/gs-shell-details.ui.h:19 +msgid "_Launch" +msgstr "_Luchtaigh" + +#: ../src/gs-shell-details.ui.h:21 ../src/gs-sources-dialog.ui.h:8 +msgid "Version" +msgstr "Leagan" + +#: ../src/gs-shell-details.ui.h:22 +msgid "Updated" +msgstr "" + +#: ../src/gs-shell-details.ui.h:23 +msgid "Category" +msgstr "Catagóir" + +#: ../src/gs-shell-details.ui.h:24 +msgid "Source" +msgstr "Foinse" + +#: ../src/gs-shell-details.ui.h:25 +msgid "License" +msgstr "Ceadúnas" + +#: ../src/gs-shell-details.ui.h:26 +msgid "Size" +msgstr "Méid" + +#: ../src/gs-shell-details.ui.h:27 +msgid "Developer" +msgstr "Forbróir" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the main category for Add-ons +#: ../src/gs-shell-details.ui.h:28 ../src/gs-shell-installed.c:441 +#: ../src/gs-update-list.c:106 ../src/plugins/menu-spec-common.c:210 +msgid "Add-ons" +msgstr "" + +#: ../src/gs-shell-details.ui.h:29 +msgid "Selected add-ons will be installed with the application." +msgstr "" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: ../src/gs-shell-installed.c:431 +msgid "System Applications" +msgstr "Feidhmchláir Córais" + +#: ../src/gs-shell-installed.c:532 +msgid "Click on items to select them" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-shell-installed.ui.h:1 +msgid "Installed page" +msgstr "" + +#: ../src/gs-shell-installed.ui.h:2 +msgid "_Add to Folder…" +msgstr "" + +#: ../src/gs-shell-installed.ui.h:3 +msgid "_Move to Folder…" +msgstr "" + +#: ../src/gs-shell-installed.ui.h:4 +msgid "_Remove from Folder" +msgstr "_Bain ón bhFillteán" + +#. TRANSLATORS: this is a heading for audio applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:368 +msgid "Recommended Audio Applications" +msgstr "Feidhmchláir Molta Fuaime" + +#. TRANSLATORS: this is a heading for games which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:373 +msgid "Recommended Games" +msgstr "Cluichí Molta" + +#. TRANSLATORS: this is a heading for graphics applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:378 +msgid "Recommended Graphics Applications" +msgstr "" + +#. TRANSLATORS: this is a heading for office applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:383 +msgid "Recommended Office Applications" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-shell-overview.ui.h:1 +msgid "Overview page" +msgstr "" + +#: ../src/gs-shell-overview.ui.h:2 +msgid "Featured Application" +msgstr "Feidhmchlár Faoi Thrácht" + +#. Translators: This is a heading for software which has been featured ( +#: ../src/gs-shell-overview.ui.h:4 +msgid "Editor's Picks" +msgstr "Roghanna an Eagarthóra" + +#: ../src/gs-shell-overview.ui.h:5 +msgid "Categories" +msgstr "Catagóirí" + +#: ../src/gs-shell-overview.ui.h:6 +msgid "No Application Data Found" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-shell-search.ui.h:1 +msgid "Search page" +msgstr "" + +#: ../src/gs-shell-search.ui.h:2 +msgid "No Application Found" +msgstr "Feidhmchlár Gan Aimsiú" + +#. TRANSLATORS: Time in 24h format +#: ../src/gs-shell-updates.c:144 +msgid "%R" +msgstr "" + +#. TRANSLATORS: Time in 12h format +#: ../src/gs-shell-updates.c:147 +msgid "%l:%M %p" +msgstr "" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../src/gs-shell-updates.c:153 +msgid "Yesterday, %R" +msgstr "" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: ../src/gs-shell-updates.c:157 +msgid "Yesterday, %l:%M %p" +msgstr "" + +#: ../src/gs-shell-updates.c:160 +msgid "Two days ago" +msgstr "" + +#: ../src/gs-shell-updates.c:162 +msgid "Three days ago" +msgstr "" + +#: ../src/gs-shell-updates.c:164 +msgid "Four days ago" +msgstr "" + +#: ../src/gs-shell-updates.c:166 +msgid "Five days ago" +msgstr "" + +#: ../src/gs-shell-updates.c:168 +msgid "Six days ago" +msgstr "" + +#: ../src/gs-shell-updates.c:170 +msgid "One week ago" +msgstr "" + +#: ../src/gs-shell-updates.c:172 +msgid "Two weeks ago" +msgstr "" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: ../src/gs-shell-updates.c:176 +msgid "%e %B %Y" +msgstr "" + +#. TRANSLATORS: the updates are being downloaded +#: ../src/gs-shell-updates.c:192 +msgid "Downloading new updates…" +msgstr "" + +#. TRANSLATORS: the update panel is doing *something* vague +#: ../src/gs-shell-updates.c:196 +msgid "Looking for new updates…" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:251 +msgid "Setting up updates…" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:252 ../src/gs-shell-updates.c:259 +msgid "(This could take a while)" +msgstr "" + +#. TRANSLATORS: this is when the updates panel is starting up +#: ../src/gs-shell-updates.c:264 +msgid "Checking for updates…" +msgstr "" + +#. TRANSLATORS: This is the time when we last checked for updates +#: ../src/gs-shell-updates.c:405 +#, c-format +msgid "Last checked: %s" +msgstr "" + +#. TRANSLATORS: can't do updates check +#: ../src/gs-shell-updates.c:771 +msgid "No Network" +msgstr "Gan Líonra" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:775 +msgid "Internet access is required to check for updates." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:779 +msgid "Network Settings" +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: ../src/gs-shell-updates.c:798 +msgid "Charges may apply" +msgstr "" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:802 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:806 +msgid "Check Anyway" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-shell-updates.ui.h:1 +msgid "Updates page" +msgstr "" + +#: ../src/gs-shell-updates.ui.h:2 +msgid "Software is up to date" +msgstr "" + +#: ../src/gs-shell-updates.ui.h:3 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" + +#: ../src/gs-shell-updates.ui.h:4 +msgid "_Check Anyway" +msgstr "" + +#: ../src/gs-shell-updates.ui.h:5 +msgid "Go online to check for updates" +msgstr "" + +#: ../src/gs-shell-updates.ui.h:6 +msgid "_Network Settings" +msgstr "" + +#: ../src/gs-shell-updates.ui.h:7 +msgid "Updates are automatically managed" +msgstr "" + +#. TRANSLATORS: This string describes a software source that +#. has no software installed from it. +#: ../src/gs-sources-dialog.c:93 +msgid "No applications or addons installed; other software might still be" +msgstr "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software source. +#: ../src/gs-sources-dialog.c:97 +#, c-format +msgid "%i application installed" +msgid_plural "%i applications installed" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software source. +#: ../src/gs-sources-dialog.c:103 +#, c-format +msgid "%i add-on installed" +msgid_plural "%i add-ons installed" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of applications. +#: ../src/gs-sources-dialog.c:110 +#, c-format +msgid "%i application" +msgid_plural "%i applications" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of add-ons. +#: ../src/gs-sources-dialog.c:116 +#, c-format +msgid "%i add-on" +msgid_plural "%i add-ons" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: ../src/gs-sources-dialog.c:123 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/gs-sources-dialog.c:321 ../src/gs-sources-dialog.ui.h:12 +msgid "Remove Source" +msgstr "Bain Foinse" + +#: ../src/gs-sources-dialog.c:335 +msgid "Removing…" +msgstr "" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: ../src/gs-sources-dialog.c:415 +msgid "the operating system" +msgstr "" + +#. TRANSLATORS: This is the text displayed in the Software Sources +#. dialog when no OS-provided software sources are enabled. %s gets +#. replaced by the name of the actual distro, e.g. Fedora. +#: ../src/gs-sources-dialog.c:486 +#, c-format +msgid "" +"Software sources can be downloaded from the internet. They give you access " +"to additional software that is not provided by %s." +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-sources-dialog.ui.h:1 +msgid "Software Sources" +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:3 +msgid "Software sources give you access to additional software." +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:4 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:5 +msgid "No software installed from this source" +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:6 +msgid "Installed from this Source" +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:7 +msgid "Source Details" +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:9 +msgid "Last Checked" +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:10 +msgid "Added" +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:11 +msgid "Website" +msgstr "Suíomh Gréasáin" + +#. TRANSLATORS: this is where the packager did not write a +#. * description for the update +#: ../src/gs-update-dialog.c:120 +msgid "No update description available." +msgstr "" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: ../src/gs-update-dialog.c:223 +msgid "Installed Updates" +msgstr "" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window +#: ../src/gs-update-dialog.c:236 +#, c-format +msgid "Installed on %s" +msgstr "" + +#: ../src/gs-update-dialog.ui.h:2 +msgid "No updates have been installed on this system." +msgstr "" + +#: ../src/gs-update-monitor.c:108 +msgid "Security Updates Pending" +msgstr "" + +#: ../src/gs-update-monitor.c:109 +msgid "It is recommended that you install important updates now" +msgstr "" + +#: ../src/gs-update-monitor.c:112 +msgid "Restart & Install" +msgstr "" + +#: ../src/gs-update-monitor.c:116 +msgid "Software Updates Available" +msgstr "" + +#: ../src/gs-update-monitor.c:117 +msgid "Important OS and application updates are ready to be installed" +msgstr "" + +#: ../src/gs-update-monitor.c:120 +msgid "Not Now" +msgstr "" + +#: ../src/gs-update-monitor.c:121 +msgid "View" +msgstr "" + +#: ../src/gs-update-monitor.c:167 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRANSLATORS: message when we've done offline updates +#: ../src/gs-update-monitor.c:171 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/gs-update-monitor.c:177 +msgid "Software Updates Failed" +msgstr "" + +#. TRANSLATORS: message when we offline updates have failed +#: ../src/gs-update-monitor.c:179 +msgid "An important OS update failed to be installed." +msgstr "" + +#: ../src/gs-update-monitor.c:185 +msgid "Review" +msgstr "" + +#: ../src/gs-update-monitor.c:188 +msgid "Show Details" +msgstr "Taispeáin Mionsonraí" + +#. vim: set noexpandtab: +#: ../src/gs-star-widget.ui.h:1 +msgid "One Star" +msgstr "Réalta Amháin" + +#: ../src/gs-star-widget.ui.h:2 +msgid "Two Stars" +msgstr "Dhá Réalta" + +#: ../src/gs-star-widget.ui.h:3 +msgid "Three Stars" +msgstr "Trí Réalta" + +#: ../src/gs-star-widget.ui.h:4 +msgid "Four Stars" +msgstr "Ceithre Réalta" + +#: ../src/gs-star-widget.ui.h:5 +msgid "Five Stars" +msgstr "Cúig Réalta" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: ../src/gs-utils.c:136 +#, c-format +msgid "%s is now installed" +msgstr "" + +#. TRANSLATORS: this is button that opens the newly installed application +#: ../src/gs-utils.c:140 +msgid "Launch" +msgstr "Luchtaigh" + +#. TRANSLATORS: this is when the install fails +#: ../src/gs-utils.c:166 +#, c-format +msgid "Installation of %s failed." +msgstr "" + +#. TRANSLATORS: this is when the remove fails +#: ../src/gs-utils.c:171 +#, c-format +msgid "Removal of %s failed." +msgstr "" + +#. TRANSLATORS: window title +#: ../src/gs-utils.c:244 +msgid "Install Third-Party Software?" +msgstr "" + +#. TRANSLATORS: window title +#: ../src/gs-utils.c:248 +msgid "Enable Third-Party Software Source?" +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#. +#: ../src/gs-utils.c:266 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#: ../src/gs-utils.c:276 +#, c-format +msgid "%s is provided by “%s”." +msgstr "" + +#. TRANSLATORS: a software source is a repo +#: ../src/gs-utils.c:286 +msgid "This software source must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: ../src/gs-utils.c:296 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: ../src/gs-utils.c:302 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: ../src/gs-utils.c:309 +msgid "Don't Warn Again" +msgstr "" + +#. TRANSLATORS: button text +#: ../src/gs-utils.c:318 +msgid "Enable and Install" +msgstr "" + +#: ../src/plugins/gs-plugin-appstream.c:227 +#, c-format +msgid "No AppStream data found" +msgstr "" + +#: ../src/plugins/gs-plugin-moduleset.c:130 +msgid "Featured" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Audio +#: ../src/plugins/menu-spec-common.c:30 +msgid "Audio" +msgstr "Fuaim" + +#: ../src/plugins/menu-spec-common.c:31 +msgctxt "Menu subcategory of Audio" +msgid "Editing" +msgstr "Eagarthóireacht" + +#: ../src/plugins/menu-spec-common.c:32 +msgctxt "Menu subcategory of Audio" +msgid "Databases" +msgstr "Bunachair Sonraí" + +#: ../src/plugins/menu-spec-common.c:33 +msgctxt "Menu subcategory of Audio" +msgid "Disc Burning" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:34 +msgctxt "Menu subcategory of Audio" +msgid "Ham Radio" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:35 +msgctxt "Menu subcategory of Audio" +msgid "MIDI" +msgstr "MIDI" + +#: ../src/plugins/menu-spec-common.c:36 +msgctxt "Menu subcategory of Audio" +msgid "Mixer" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:37 +msgctxt "Menu subcategory of Audio" +msgid "Music" +msgstr "Ceol" + +#: ../src/plugins/menu-spec-common.c:38 +msgctxt "Menu subcategory of Audio" +msgid "Players" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:39 +msgctxt "Menu subcategory of Audio" +msgid "Recorders" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:40 +msgctxt "Menu subcategory of Audio" +msgid "Sequencers" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:41 +msgctxt "Menu subcategory of Audio" +msgid "Tuners" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Development +#: ../src/plugins/menu-spec-common.c:43 +msgid "Development Tools" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:44 +msgctxt "Menu subcategory of Development Tools" +msgid "Building" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:45 +msgctxt "Menu subcategory of Development Tools" +msgid "Databases" +msgstr "Bunachair Sonraí" + +#: ../src/plugins/menu-spec-common.c:46 +msgctxt "Menu subcategory of Development Tools" +msgid "Debuggers" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:47 +msgctxt "Menu subcategory of Development Tools" +msgid "GUI Designers" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:48 +msgctxt "Menu subcategory of Development Tools" +msgid "IDE" +msgstr "IDE" + +#: ../src/plugins/menu-spec-common.c:49 +msgctxt "Menu subcategory of Development Tools" +msgid "Profiling" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:50 +msgctxt "Menu subcategory of Development Tools" +msgid "Project Management" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:51 +msgctxt "Menu subcategory of Development Tools" +msgid "Revision Control" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:52 +msgctxt "Menu subcategory of Development Tools" +msgid "Translation" +msgstr "Aistriú" + +#: ../src/plugins/menu-spec-common.c:53 +msgctxt "Menu subcategory of Development Tools" +msgid "Web Development" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Education +#: ../src/plugins/menu-spec-common.c:55 +msgid "Education" +msgstr "Oideachas" + +#: ../src/plugins/menu-spec-common.c:56 +msgctxt "Menu subcategory of Education" +msgid "Art" +msgstr "Ealaín" + +#: ../src/plugins/menu-spec-common.c:57 +msgctxt "Menu subcategory of Education" +msgid "Artificial Intelligence" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:58 +msgctxt "Menu subcategory of Education" +msgid "Astronomy" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:59 +msgctxt "Menu subcategory of Education" +msgid "Biology" +msgstr "Bitheolaíocht" + +#: ../src/plugins/menu-spec-common.c:60 +msgctxt "Menu subcategory of Education" +msgid "Chemistry" +msgstr "Ceimic" + +#: ../src/plugins/menu-spec-common.c:61 +msgctxt "Menu subcategory of Education" +msgid "Computer Science" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:62 +msgctxt "Menu subcategory of Education" +msgid "Construction" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:63 +msgctxt "Menu subcategory of Education" +msgid "Data Visualization" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:64 +msgctxt "Menu subcategory of Education" +msgid "Economy" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:65 +msgctxt "Menu subcategory of Education" +msgid "Electricity" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:66 +msgctxt "Menu subcategory of Education" +msgid "Electronics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:67 +msgctxt "Menu subcategory of Education" +msgid "Engineering" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:68 +msgctxt "Menu subcategory of Education" +msgid "Geography" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:69 +msgctxt "Menu subcategory of Education" +msgid "Geology" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:70 +msgctxt "Menu subcategory of Education" +msgid "Geoscience" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:71 +msgctxt "Menu subcategory of Education" +msgid "History" +msgstr "Stair" + +#: ../src/plugins/menu-spec-common.c:72 +msgctxt "Menu subcategory of Education" +msgid "Humanities" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:73 +msgctxt "Menu subcategory of Education" +msgid "Image Processing" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:74 +msgctxt "Menu subcategory of Education" +msgid "Languages" +msgstr "Teangacha" + +#: ../src/plugins/menu-spec-common.c:75 +msgctxt "Menu subcategory of Education" +msgid "Literature" +msgstr "Litríocht" + +#: ../src/plugins/menu-spec-common.c:76 +msgctxt "Menu subcategory of Education" +msgid "Maps" +msgstr "Léarscáileanna" + +#: ../src/plugins/menu-spec-common.c:77 +msgctxt "Menu subcategory of Education" +msgid "Math" +msgstr "Mata" + +#: ../src/plugins/menu-spec-common.c:78 +msgctxt "Menu subcategory of Education" +msgid "Medical" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:79 +msgctxt "Menu subcategory of Education" +msgid "Music" +msgstr "Ceol" + +#: ../src/plugins/menu-spec-common.c:80 +msgctxt "Menu subcategory of Education" +msgid "Numerical Analysis" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:81 +msgctxt "Menu subcategory of Education" +msgid "Parallel Computing" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:82 +msgctxt "Menu subcategory of Education" +msgid "Physics" +msgstr "Fisic" + +#: ../src/plugins/menu-spec-common.c:83 +msgctxt "Menu subcategory of Education" +msgid "Robotics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:84 +msgctxt "Menu subcategory of Education" +msgid "Spirituality" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:85 +msgctxt "Menu subcategory of Education" +msgid "Sports" +msgstr "Spórt" + +#. TRANSLATORS: this is the menu spec main category for Games +#: ../src/plugins/menu-spec-common.c:87 +msgid "Games" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:88 +msgctxt "Menu subcategory of Games" +msgid "Action" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:89 +msgctxt "Menu subcategory of Games" +msgid "Adventure" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:90 +msgctxt "Menu subcategory of Games" +msgid "Arcade" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:91 +msgctxt "Menu subcategory of Games" +msgid "Blocks" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:92 +msgctxt "Menu subcategory of Games" +msgid "Board" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:93 +msgctxt "Menu subcategory of Games" +msgid "Card" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:94 +msgctxt "Menu subcategory of Games" +msgid "Emulators" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:95 +msgctxt "Menu subcategory of Games" +msgid "Kids" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:96 +msgctxt "Menu subcategory of Games" +msgid "Logic" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:97 +msgctxt "Menu subcategory of Games" +msgid "Role Playing" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:98 +msgctxt "Menu subcategory of Games" +msgid "Shooter" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:99 +msgctxt "Menu subcategory of Games" +msgid "Simulation" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:100 +msgctxt "Menu subcategory of Games" +msgid "Sports" +msgstr "Spórt" + +#: ../src/plugins/menu-spec-common.c:101 +msgctxt "Menu subcategory of Games" +msgid "Strategy" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: ../src/plugins/menu-spec-common.c:103 +msgid "Graphics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:104 +msgctxt "Menu subcategory of Graphics" +msgid "2D Graphics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:105 +msgctxt "Menu subcategory of Graphics" +msgid "3D Graphics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:106 +msgctxt "Menu subcategory of Graphics" +msgid "OCR" +msgstr "OCR" + +#: ../src/plugins/menu-spec-common.c:107 +msgctxt "Menu subcategory of Graphics" +msgid "Photography" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:108 +msgctxt "Menu subcategory of Graphics" +msgid "Publishing" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:109 +msgctxt "Menu subcategory of Graphics" +msgid "Raster Graphics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:110 +msgctxt "Menu subcategory of Graphics" +msgid "Scanning" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:111 +msgctxt "Menu subcategory of Graphics" +msgid "Vector Graphics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:112 +msgctxt "Menu subcategory of Graphics" +msgid "Viewer" +msgstr "Amharcán" + +#. TRANSLATORS: this is the menu spec main category for Network +#: ../src/plugins/menu-spec-common.c:114 +msgid "Internet" +msgstr "Idirlíon" + +#: ../src/plugins/menu-spec-common.c:115 +msgctxt "Menu subcategory of Internet" +msgid "Chat" +msgstr "Comhrá" + +#: ../src/plugins/menu-spec-common.c:116 +msgctxt "Menu subcategory of Internet" +msgid "Dialup" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:117 +msgctxt "Menu subcategory of Internet" +msgid "Email" +msgstr "Ríomhphost" + +#: ../src/plugins/menu-spec-common.c:118 +msgctxt "Menu subcategory of Internet" +msgid "Feed" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:119 +msgctxt "Menu subcategory of Internet" +msgid "File Transfer" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:120 +msgctxt "Menu subcategory of Internet" +msgid "Ham Radio" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:121 +msgctxt "Menu subcategory of Internet" +msgid "Instant Messaging" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:122 +msgctxt "Menu subcategory of Internet" +msgid "IRC Clients" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:123 +msgctxt "Menu subcategory of Internet" +msgid "Monitor" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:124 +msgctxt "Menu subcategory of Internet" +msgid "News" +msgstr "Nuacht" + +#: ../src/plugins/menu-spec-common.c:125 +msgctxt "Menu subcategory of Internet" +msgid "P2P" +msgstr "P2P" + +#: ../src/plugins/menu-spec-common.c:126 +msgctxt "Menu subcategory of Internet" +msgid "Remote Access" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:127 +msgctxt "Menu subcategory of Internet" +msgid "Telephony" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:128 +msgctxt "Menu subcategory of Internet" +msgid "Video Conference" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:129 +msgctxt "Menu subcategory of Internet" +msgid "Web Browser" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:130 +msgctxt "Menu subcategory of Internet" +msgid "Web Development" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Office +#: ../src/plugins/menu-spec-common.c:132 +msgid "Office" +msgstr "Oifig" + +#: ../src/plugins/menu-spec-common.c:133 +msgctxt "Menu subcategory of Office" +msgid "Calendar" +msgstr "Féilire" + +#: ../src/plugins/menu-spec-common.c:134 +msgctxt "Menu subcategory of Office" +msgid "Chart" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:135 +msgctxt "Menu subcategory of Office" +msgid "Contact Management" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:136 +msgctxt "Menu subcategory of Office" +msgid "Database" +msgstr "Bunachar Sonraí" + +#: ../src/plugins/menu-spec-common.c:137 +msgctxt "Menu subcategory of Office" +msgid "Dictionary" +msgstr "Foclóir" + +#: ../src/plugins/menu-spec-common.c:138 +msgctxt "Menu subcategory of Office" +msgid "Email" +msgstr "Ríomhphost" + +#: ../src/plugins/menu-spec-common.c:139 +msgctxt "Menu subcategory of Office" +msgid "Finance" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:140 +msgctxt "Menu subcategory of Office" +msgid "Flow Chart" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:141 +msgctxt "Menu subcategory of Office" +msgid "PDA" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:142 +msgctxt "Menu subcategory of Office" +msgid "Photography" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:143 +msgctxt "Menu subcategory of Office" +msgid "Presentation" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:144 +msgctxt "Menu subcategory of Office" +msgid "Project Management" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:145 +msgctxt "Menu subcategory of Office" +msgid "Publishing" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:146 +msgctxt "Menu subcategory of Office" +msgid "Spreadsheet" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:147 +msgctxt "Menu subcategory of Office" +msgid "Viewer" +msgstr "Amharcán" + +#: ../src/plugins/menu-spec-common.c:148 +msgctxt "Menu subcategory of Office" +msgid "Word Processor" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Science +#: ../src/plugins/menu-spec-common.c:150 +msgid "Science" +msgstr "Eolaíocht" + +#: ../src/plugins/menu-spec-common.c:151 +msgctxt "Menu subcategory of Science" +msgid "Art" +msgstr "Ealaín" + +#: ../src/plugins/menu-spec-common.c:152 +msgctxt "Menu subcategory of Science" +msgid "Artificial Intelligence" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:153 +msgctxt "Menu subcategory of Science" +msgid "Astronomy" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:154 +msgctxt "Menu subcategory of Science" +msgid "Biology" +msgstr "Bitheolaíocht" + +#: ../src/plugins/menu-spec-common.c:155 +msgctxt "Menu subcategory of Science" +msgid "Chemistry" +msgstr "Ceimic" + +#: ../src/plugins/menu-spec-common.c:156 +msgctxt "Menu subcategory of Science" +msgid "Computer Science" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:157 +msgctxt "Menu subcategory of Science" +msgid "Construction" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:158 +msgctxt "Menu subcategory of Science" +msgid "Data Visualization" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:159 +msgctxt "Menu subcategory of Science" +msgid "Economy" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:160 +msgctxt "Menu subcategory of Science" +msgid "Electricity" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:161 +msgctxt "Menu subcategory of Science" +msgid "Electronics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:162 +msgctxt "Menu subcategory of Science" +msgid "Engineering" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:163 +msgctxt "Menu subcategory of Science" +msgid "Geography" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:164 +msgctxt "Menu subcategory of Science" +msgid "Geology" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:165 +msgctxt "Menu subcategory of Science" +msgid "Geoscience" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:166 +msgctxt "Menu subcategory of Science" +msgid "History" +msgstr "Stair" + +#: ../src/plugins/menu-spec-common.c:167 +msgctxt "Menu subcategory of Science" +msgid "Humanities" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:168 +msgctxt "Menu subcategory of Science" +msgid "Image Processing" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:169 +msgctxt "Menu subcategory of Science" +msgid "Languages" +msgstr "Teangacha" + +#: ../src/plugins/menu-spec-common.c:170 +msgctxt "Menu subcategory of Science" +msgid "Literature" +msgstr "Litríocht" + +#: ../src/plugins/menu-spec-common.c:171 +msgctxt "Menu subcategory of Science" +msgid "Maps" +msgstr "Léarscáileanna" + +#: ../src/plugins/menu-spec-common.c:172 +msgctxt "Menu subcategory of Science" +msgid "Math" +msgstr "Mata" + +#: ../src/plugins/menu-spec-common.c:173 +msgctxt "Menu subcategory of Science" +msgid "Medical" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:174 +msgctxt "Menu subcategory of Science" +msgid "Numerical Analysis" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:175 +msgctxt "Menu subcategory of Science" +msgid "Parallel Computing" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:176 +msgctxt "Menu subcategory of Science" +msgid "Physics" +msgstr "Fisic" + +#: ../src/plugins/menu-spec-common.c:177 +msgctxt "Menu subcategory of Science" +msgid "Robotics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:178 +msgctxt "Menu subcategory of Science" +msgid "Spirituality" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:179 +msgctxt "Menu subcategory of Science" +msgid "Sports" +msgstr "Spórt" + +#. TRANSLATORS: this is the menu spec main category for System +#: ../src/plugins/menu-spec-common.c:181 +msgid "System" +msgstr "Córas" + +#: ../src/plugins/menu-spec-common.c:182 +msgctxt "Menu subcategory of System" +msgid "Emulator" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:183 +msgctxt "Menu subcategory of System" +msgid "File Manager" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:184 +msgctxt "Menu subcategory of System" +msgid "File System" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:185 +msgctxt "Menu subcategory of System" +msgid "File Tools" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:186 +msgctxt "Menu subcategory of System" +msgid "Monitor" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:187 +msgctxt "Menu subcategory of System" +msgid "Security" +msgstr "Slándáil" + +#: ../src/plugins/menu-spec-common.c:188 +msgctxt "Menu subcategory of System" +msgid "Terminal Emulator" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Utility +#: ../src/plugins/menu-spec-common.c:190 +msgid "Utilities" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:191 +msgctxt "Menu subcategory of Utilities" +msgid "Accessibility" +msgstr "Inrochtaineacht" + +#: ../src/plugins/menu-spec-common.c:192 +msgctxt "Menu subcategory of Utilities" +msgid "Archiving" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:193 +msgctxt "Menu subcategory of Utilities" +msgid "Calculator" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:194 +msgctxt "Menu subcategory of Utilities" +msgid "Clock" +msgstr "Clog" + +#: ../src/plugins/menu-spec-common.c:195 +msgctxt "Menu subcategory of Utilities" +msgid "Compression" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:196 +msgctxt "Menu subcategory of Utilities" +msgid "File Tools" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:197 +msgctxt "Menu subcategory of Utilities" +msgid "Maps" +msgstr "Léarscáileanna" + +#: ../src/plugins/menu-spec-common.c:198 +msgctxt "Menu subcategory of Utilities" +msgid "Spirituality" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:199 +msgctxt "Menu subcategory of Utilities" +msgid "Telephony Tools" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:200 +msgctxt "Menu subcategory of Utilities" +msgid "Text Editor" +msgstr "Eagarthóir Téacs" + +#. TRANSLATORS: this is the menu spec main category for Video +#: ../src/plugins/menu-spec-common.c:202 +msgid "Video" +msgstr "Fís" + +#: ../src/plugins/menu-spec-common.c:203 +msgctxt "Menu subcategory of Video" +msgid "Editing" +msgstr "Eagarthóireacht" + +#: ../src/plugins/menu-spec-common.c:204 +msgctxt "Menu subcategory of Video" +msgid "Database" +msgstr "Bunachar Sonraí" + +#: ../src/plugins/menu-spec-common.c:205 +msgctxt "Menu subcategory of Video" +msgid "Disc Burning" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:206 +msgctxt "Menu subcategory of Video" +msgid "Players" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:207 +msgctxt "Menu subcategory of Video" +msgid "Recorders" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:208 +msgctxt "Menu subcategory of Video" +msgid "TV" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:211 +msgctxt "Menu subcategory of Add-ons" +msgid "Fonts" +msgstr "Clónna" + +#: ../src/plugins/menu-spec-common.c:212 +msgctxt "Menu subcategory of Add-ons" +msgid "Codecs" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:213 +msgctxt "Menu subcategory of Add-ons" +msgid "Input Sources" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:214 +msgctxt "Menu subcategory of Add-ons" +msgid "Language Packs" +msgstr "" + +#: ../src/menus.ui.h:1 +msgid "_Software Sources" +msgstr "Foinsí _Bogearraí" + +#: ../src/menus.ui.h:2 +msgid "_About" +msgstr "_Maidir Leis Seo" + +#: ../src/menus.ui.h:3 +msgid "_Quit" +msgstr "_Scoir" diff --git a/po/gd.po b/po/gd.po new file mode 100644 index 0000000..69d98e1 --- /dev/null +++ b/po/gd.po @@ -0,0 +1,5097 @@ +# Scottish Gaelic translation for gnome-software. +# Copyright (C) 2015 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# GunChleoc , 2015, 2016, 2017, 2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2018-04-17 10:32+0000\n" +"PO-Revision-Date: 2018-02-23 11:01+0100\n" +"Last-Translator: GunChleoc \n" +"Language-Team: Fòram na Gàidhlig\n" +"Language: gd\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 || n==11) ? 0 : (n==2 || n==12) ? 1 : " +"(n > 2 && n < 20) ? 2 : 3;\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Launchpad-Export-Date: 2016-04-20 09:04+0000\n" +"X-Project-Style: gnome\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "Bathar-bog GNOME" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "Manaidsear nan aplacaid airson GNOME" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "Leigidh Bathar-bog leat aplacaidean is leudachain an t-siostaim ùra a lorg ’s a stàladh agus aplacaidean a chaidh a stàladh a thoirt air falbh." + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "Seallaidh Bathar-bog GNOME aplacaidean brosnaichte is mòr-chòrdte dhut le tuairisgeul feumail is iomadh glacadh-sgrìn airson gach aplacaid. Gheibh thu greim air tu aplacaidean le brabhsadh tron na roinnean-seòrsa no le lorg. ’S urrainn dhut an siostam agad ùrachadh le ùrachadh far loidhne leis cuideachd." + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "Panail an fhoir-sheallaidh" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "Panail an fhiosrachaidh" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "Panail na feadhainn stàlaichte" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "Panail nan ùrachaidhean" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "Fiosrachadh an ùrachaidh" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1075 +msgid "The GNOME Project" +msgstr "Pròiseact GNOME" + +#: data/org.gnome.software.external-appstream.policy.in:11 +msgid "Install an appstream file into a system location" +msgstr "Stàlaich faidhle appstream gu ionad air an t-siostam" + +#: data/org.gnome.software.external-appstream.policy.in:12 +msgid "Installing an appstream file into a system location" +msgstr "A’ stàladh faidhle appstream gu ionad air an t-siostam" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Liosta dhe na pròiseactan co-chòrdail" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "Seo liosta dhe na pròiseactan co-chòrdail a bu chòir dhuinn sealltainn mar GNOME, KDE agus XFCE." + +#: data/org.gnome.software.gschema.xml:10 +#| msgid "Whether to manage updates in GNOME Software" +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Co-dhiù an dèid ùrachaidhean is àrdachaidhean a stiùireadh le Bathar-bog GNOME gus nach dèid" + +#: data/org.gnome.software.gschema.xml:11 +#| msgid "" +#| "If disabled, GNOME Software will hide the updates panel and not perform " +#| "any automatic updates actions." +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "Nuair a bhios seo à comas, falaichidh Bathar-bog GNOME panail nan ùrachaidhean, cha dèan e ùrachaidhean fèin-obrachail is chan iarr e àrdachaidhean." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Whether to automatically download updates" +msgstr "Co-dhiù an dèid ùrachaidhean a luchdadh a-nuas gu fèin-obrachail gus nach dèid" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads updates in the background " +"and prompts the user to install them when ready." +msgstr "Ma tha seo an comas, luchdaichidh Bathar-bog GNOME a-nuas ùrachaidhean gu fèin-obrachail sa chùlaibh agus iarraidh e air a’ chleachdaiche an stàladh nuair a bhios iad deiseil." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Co-dhiù an dèid gus nach dèid ath-nuadhachadh gu fèin-obrachail air ceangal meadaraichte" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "Ma tha seo an comas, théid Bathar-bog GNOME ath-nuadhachadh sa chùlaibh gu fèin-obachail fiù ma bhios ceangal meadaraichte ’ga chleachdadh (adhbharaichidh seo gun dèid meata-dàta a luchdadh a-nuas, sùil a thoirt airson ùrachaidhean is msaa agus dh’fhaoidte gun èirich cosgaisean ’na lùib)." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Ge b’ e seo a’ chiad turas a tha Bathar-bog GNOME ’ga ruith" + +#: data/org.gnome.software.gschema.xml:29 +msgid "Show star ratings next to applications" +msgstr "Seall rionnagan rangachaidh ris na h-aplacaidean" + +#: data/org.gnome.software.gschema.xml:33 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Criathraich na h-aplacaidean a-rèir a’ mheòir bhunaitich a chaidh a shuidheachadh airson an tùis on taobh a-muigh" + +#: data/org.gnome.software.gschema.xml:37 +msgid "Non-free applications show a warning dialog before install" +msgstr "Seallaidh aplacaidean nach eil saor còmhradh rabhaidh mus dèid an stàladh" + +#: data/org.gnome.software.gschema.xml:38 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "Cò-dhiù an gabh còmhradh rabhaidh sealltainn nuair a thèid aplacaidean nach eil saor an stàladh. Stiùirichidh seo an dèid an còmhradh ud a mhùchadh gus nach dèid." + +#: data/org.gnome.software.gschema.xml:42 +msgid "A list of popular applications" +msgstr "Liosta dhe dh’aplacaidean air a bheil fèill mhòr" + +#: data/org.gnome.software.gschema.xml:43 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "Liosta dhe na h-aplacaidean ri an cleachdadh seach an fheadhainn a mhìnich an siostam." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "An àm mu dheireadh a chaidh sùil a thoirt airson ùrachadh" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "An stampa-tìde aig an àrdachadh mu dheireadh" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The timestamp of the first security update, cleared after update" +msgstr "An stampa-tìde aig a’ chiad ùrachadh tèarainteachd, thèid fhalamhachadh às dèidh an ùrachaidh" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The last update timestamp" +msgstr "An stampa-tìde aig an ùrachadh mu dheireadh" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Aois ann an diogan gus dearbhadh gu bheil an glacadh-sgrìn on upstream dligheach fhathast" + +#: data/org.gnome.software.gschema.xml:64 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "Ma thaghas tu luach mòr, cha leig sinn leas turas a dhèanamh gun fhrithealaiche chèin a cheart cho tric ach cuiridh e dàil air cuin a chì an cleachdaiche glacaidhean-sgrìn ùra. Is ciall do luach de 0 nach dèid sùil a thoirt air an fhrithealaiche idir ma tha an dealbh san tasgadan ann." + +#: data/org.gnome.software.gschema.xml:73 +msgid "The server to use for application reviews" +msgstr "Am frithealaiche a thèid a chleachdadh airson lèirmheasan aplacaidean" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The minimum karma score for reviews" +msgstr "An sgòr karma as lugha airson lèirmheasan" + +#: data/org.gnome.software.gschema.xml:78 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Cha nochd lèirmheasan aig a bheil nas lugha na an karma seo." + +#: data/org.gnome.software.gschema.xml:82 +#| msgid "A list of official sources that should not be considered 3rd party" +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Liosta dhe na h-ionadan-tasgaidh oifigeil nach eil ’nan treas-phartaidh" + +#: data/org.gnome.software.gschema.xml:86 +#| msgid "A list of official sources that should be considered free software" +msgid "A list of official repositories that should be considered free software" +msgstr "Liosta dhe na h-ionadan-tasgaidh oifigeil a tha ’gam measadh mar bhathar-bog saor" + +#: data/org.gnome.software.gschema.xml:90 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "URL a’ cheadachais ri chleachdadh gus bathar-bog a mheasadh mar fhear saor" + +#: data/org.gnome.software.gschema.xml:94 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Stàlaich aplacaidean an trusgain airson a h-uile cleachdaiche air an t-siostam far an gabh seo dèanamh" + +#: data/org.gnome.software.gschema.xml:98 +msgid "Show the folder management UI" +msgstr "Seall eadar-aghaidh gus na pasganan a stiùireadh" + +#: data/org.gnome.software.gschema.xml:102 +#| msgid "Allow access to the Software Sources dialog" +msgid "Allow access to the Software Repositories dialog" +msgstr "Ceadaich inntrigeadh dha chòmhradh nan ionadan-tasgaidh bathair-bhog" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Offer upgrades for pre-releases" +msgstr "Tairg àrdachaidhean airson tionndaidhean ro-sgaoilidh" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Seall fiosrachadh dhan chleachdaiche mur eil aplacaid saor" + +#: data/org.gnome.software.gschema.xml:114 +#| msgid "Show the prompt to install nonfree software sources" +msgid "Show the prompt to install nonfree software repositories" +msgstr "Seal còmhradh gus stàladh o ionadan-tasgaidh bathair-bhog nach eil saor" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Seall meud an stàlaidh airson aplacaidean air liosta nan aplacaidean stàlaichte" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "An URI a mhìnicheas dè th’ ann am bathar-bog fo sheilbh ’s nach eil saor" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "Liosa de URLaichean a thomhas gu faidhlichean appstream a thèid a luchdadh a-nuas gu pasgan app-info" + +#: data/org.gnome.software.gschema.xml:131 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "Stàlaich na faidhlichean AppStream air aon aon ionad siostaim dha na h-uile cleachdaiche" + +#: data/org.gnome.software.gschema.xml:135 +msgid "Enable GNOME Shell extensions repository" +msgstr "Cuir an comas ionad-tasgaidh nan leudachan Slige GNOME" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "Stàlaich bathar-bog" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Stàlaich roghainn de bhathar-bog air an t-siostam" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/gnome-software-local-file.desktop.in:10 +msgid "system-software-install" +msgstr "system-software-install" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "Tagh na h-uile" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "Na tagh gin" + +#: src/gnome-software.ui:24 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Bathar-bog" + +#: src/gnome-software.ui:43 src/gs-update-dialog.ui:21 +msgid "Go back" +msgstr "Air ais" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:77 +msgid "_All" +msgstr "N_a h-uile" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gnome-software.ui:104 +msgid "_Installed" +msgstr "A_ir a stàladh" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gnome-software.ui:155 +msgid "_Updates" +msgstr "Ù_rachaidhean" + +#: src/gnome-software.ui:251 +msgid "Search" +msgstr "Lorg" + +#. button in the info bar +#: src/gnome-software.ui:350 src/gs-repos-dialog.ui:6 src/gs-repos-dialog.ui:20 +#| msgid "Software Sources" +msgid "Software Repositories" +msgstr "Ionadan-tasgaidh bathair-bhog" + +#. button in the info bar +#: src/gnome-software.ui:361 +msgid "Examine Disk" +msgstr "Sgrùd an diosga" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:372 src/gs-updates-page.c:1435 +msgid "Network Settings" +msgstr "Roghainnean an lìonraidh" + +#. button in the info bar +#: src/gnome-software.ui:383 +msgid "Restart Now" +msgstr "Ath-thòisich an-dràsta" + +#. button in the info bar +#: src/gnome-software.ui:394 +msgid "More Information" +msgstr "Barrachd fiosrachaidh" + +#: src/gs-app-addon-row.c:96 src/gs-app-row.c:428 +msgid "Pending" +msgstr "Ri dhèiligeadh" + +#: src/gs-app-addon-row.c:102 src/gs-app-row.ui:209 src/gs-app-tile.ui:51 +#: src/gs-feature-tile.c:87 +msgid "Installed" +msgstr "Stàlaichte" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being installed +#: src/gs-app-addon-row.c:106 src/gs-app-row.c:217 src/gs-details-page.c:464 +#: src/gs-third-party-repo-row.c:113 +msgid "Installing" +msgstr "’Ga stàladh" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being removed +#: src/gs-app-addon-row.c:110 src/gs-app-row.c:223 src/gs-repo-row.c:140 +#: src/gs-third-party-repo-row.c:120 +msgid "Removing" +msgstr "’Ga thoirt air falbh" + +#: src/gs-app-folder-dialog.c:309 +msgid "Folder Name" +msgstr "Ainm a’ phasgain" + +#: src/gs-app-folder-dialog.c:320 src/gs-app-folder-dialog.ui:16 +#: src/gs-details-page.ui:329 src/gs-editor.c:623 src/gs-editor.c:655 +#: src/gs-installed-page.c:610 src/gs-removal-dialog.ui:33 +#: src/gs-review-dialog.ui:23 src/gs-upgrade-banner.ui:131 +msgid "_Cancel" +msgstr "_Sguir dheth" + +#: src/gs-app-folder-dialog.c:325 src/gs-app-folder-dialog.ui:24 +msgid "_Add" +msgstr "_Cuir ris" + +#: src/gs-app-folder-dialog.ui:5 +msgid "Add to Application Folder" +msgstr "Cuir ri pasgan nan aplacaid" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Modh tòiseachaidh: ‘updates’, ‘updated’, ‘installed’ no ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODH" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Lorg airson aplacaidean" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "LORG" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Seall fiosrachadh na h-aplacaid (a-rèir ID na h-aplacaid)" + +#: src/gs-application.c:128 src/gs-application.c:132 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Seall fiosrachadh na h-aplacaid (a-rèir ainm na pacaide)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "AINM-PACAIDE" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Stàlaich an aplacaid (a-rèir ID na h-aplacaid)" + +#: src/gs-application.c:134 +msgid "Open a local package file" +msgstr "Fosgail faidhle pacaid ionadail" + +#: src/gs-application.c:134 +msgid "FILENAME" +msgstr "AINM AN FHAIDHLE" + +#: src/gs-application.c:136 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "Seo na h-eadar-ghnìomhan air a bheilear an dùil airson a’ ghnìomha seo: “none”, “notify” no “full”" + +#: src/gs-application.c:139 +msgid "Show verbose debugging information" +msgstr "Seall fiosrachadh dì-bhugachaidh briathrach" + +#: src/gs-application.c:141 +msgid "Show profiling information for the service" +msgstr "Seall fiosrachadh pròifileadh airson na seirbheise" + +#: src/gs-application.c:143 +msgid "Quit the running instance" +msgstr "Fàg an t-ionstans a tha a’ ruith" + +#: src/gs-application.c:145 +msgid "Prefer local file sources to AppStream" +msgstr "’S fhearr leam tùsan faidhle ionadail na AppStream" + +#: src/gs-application.c:147 +msgid "Show version number" +msgstr "Seall àireamh an tionndaidh" + +#: src/gs-application.c:344 +msgid "translator-credits" +msgstr "GunChleoc fios@foramnagaidhlig.net\n\nLaunchpad Contributions:\n GunChleoc https://launchpad.net/~gunchleoc" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:351 +#, c-format +msgid "About %s" +msgstr "Mu %s" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:355 +msgid "A nice way to manage the software on your system." +msgstr "Dòigh mhath gus am bathar-bog air an t-siostam agad a stiùireadh." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:172 +msgid "Visit website" +msgstr "Tadhail air an làrach-lìn" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:177 +msgid "Install…" +msgstr "Stàlaich…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:184 +msgid "Cancel" +msgstr "Sguir dheth" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:191 src/gs-common.c:276 src/gs-page.c:589 +msgid "Install" +msgstr "Stàlaich" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:198 +msgid "Update" +msgstr "Ùraich" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-app-row.c:202 src/gs-app-row.c:211 src/gs-page.c:746 +#: src/gs-repos-dialog.c:336 +msgid "Remove" +msgstr "Thoir air falbh" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:328 +msgid "Device cannot be used during update." +msgstr "Cha ghabh an t-uidheam a chleachdadh rè ùrachaidh" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:338 src/gs-details-page.ui:988 +msgid "Source" +msgstr "Tùs" + +#. TRANSLATORS: this is when the service name is not known +#: src/gs-auth-dialog.c:69 +msgid "To continue you need to sign in." +msgstr "Feumaidh tu clàradh a-steach mus lean thu air adhart." + +#. TRANSLATORS: the %s is a service name, e.g. "Ubuntu One" +#: src/gs-auth-dialog.c:73 +#, c-format +msgid "To continue you need to sign in to %s." +msgstr "Feumaidh tu clàradh a-steach dha %s mus lean thu air adhart." + +#: src/gs-auth-dialog.ui:70 +msgid "Email address" +msgstr "Seòladh puist-d" + +#: src/gs-auth-dialog.ui:94 +msgid "I have an account already" +msgstr "Tha cunntas agam mar-thà" + +#: src/gs-auth-dialog.ui:113 +msgid "Password" +msgstr "Facal-faire" + +#: src/gs-auth-dialog.ui:137 +msgid "I want to register for an account now" +msgstr "Tha mi airson cunntas a chlàradh an-dràsta" + +#: src/gs-auth-dialog.ui:154 +msgid "I have forgotten my password" +msgstr "Dhìochuimhnich mi am facal-faire agam" + +#: src/gs-auth-dialog.ui:181 +msgid "Sign in automatically next time" +msgstr "Clàraich a-steach gu fèin-obrachail an ath-thuras" + +#: src/gs-auth-dialog.ui:210 +msgid "Enter your one-time pin for two-factor authentication." +msgstr "Cuir a-steach am PIN aon turais agad a chum a’ chlàraidh a-steach dhà-cheumnaich" + +#: src/gs-auth-dialog.ui:223 +msgid "PIN" +msgstr "PIN" + +#: src/gs-auth-dialog.ui:325 +msgid "Authenticate" +msgstr "Dearbhaich" + +#: src/gs-auth-dialog.ui:337 +msgid "Continue" +msgstr "Lean air adhart" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:194 +msgid "Other" +msgstr "Eile" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:199 +msgid "All" +msgstr "Na h-uile" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:203 +msgid "Featured" +msgstr "Brosnaichte" + +#. TRANSLATORS: This is a heading on the categories page. %s gets +#. replaced by the category name, e.g. 'Graphics & Photography' +#: src/gs-category-page.c:501 +#, c-format +#| msgid "Featured" +msgid "Featured %s" +msgstr "%s brosnaichte" + +#. Translators: A label for a button to sort apps by their rating. +#: src/gs-category-page.ui:24 +#| msgid "Updated" +msgid "Top Rated" +msgstr "Rangachadh às àirde" + +#. Translators: A label for a button to sort apps alphabetically. +#: src/gs-category-page.ui:30 src/gs-editor.ui:296 +msgid "Name" +msgstr "Ainm" + +#. TRANSLATORS: A label for a button to show the settings for +#. the selected shell extension. +#: src/gs-category-page.ui:137 src/gs-details-page.c:361 +msgid "Extension Settings" +msgstr "Roghainnean nan leudachan" + +#: src/gs-category-page.ui:166 +msgid "" +"Extensions are used at your own risk. If you have any system problems, it is " +"recommended to disable them." +msgstr "Cleachdaidh tu leudachain air do chunnart fhèin. Ma dh’èireas duilgheadas sam bith leis an t-siostam, mholamaid gun cuir thu à comas iad." + +#. TRANSLATORS: This is a label for the category filter drop down, which all together can read e.g. 'Show Vector Graphics'. +#: src/gs-category-page.ui:197 +msgid "Show" +msgstr "Seall" + +#: src/gs-category-page.ui:219 +msgid "Subcategories filter menu" +msgstr "Clàr-taice criathradh nam fo-roinnean-seòrsa" + +#. TRANSLATORS: This is a label for the category sort drop down, which all together can read e.g. 'Sort Top Rated'. +#: src/gs-category-page.ui:267 +msgid "Sort" +msgstr "Seòrsaich" + +#: src/gs-category-page.ui:288 +msgid "Subcategories sorting menu" +msgstr "Clàr-taice seòrsachaidh nam fo-roinnean-seòrsa" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:206 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "Cuir a-steach àireamh eadar 1 is %u: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:269 +msgid "Choose an application:" +msgstr "Tagh aplacaid:" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:136 +msgid "OS updates are now installed" +msgstr "Tha ùrachaidhean an t-siostam-obrachaidh air an stàladh" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:139 +msgid "Recently installed updates are available to review" +msgstr "Tha na h-ùrachaidhean a chaidh a stàladh o chionn ghoirid deiseil airson lèirmheas" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:143 +#, c-format +msgid "%s is now installed" +msgstr "Tha %s air a stàladh a-nis" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:146 +msgid "Application is ready to be used." +msgstr "Tha an t-aplacaid deiseil ri cleachdadh." + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:152 +msgid "Launch" +msgstr "Tòisich" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "A bheil thu airson bathar-bog treas-phàrtaidh a stàladh?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 src/gs-repos-dialog.c:247 +#| msgid "Enable Third-Party Software Source?" +msgid "Enable Third-Party Software Repository?" +msgstr "A bheil thu airson ionad-tasgaidh bathair-bhog treas-phàrtaidh a chur an comas?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:230 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "Chan eil %s na bhathar-bhog saor is open source agus tha e ga sholar le “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:240 +#, c-format +msgid "%s is provided by “%s”." +msgstr "Tha %s ga sholar le “%s”." + +#: src/gs-common.c:249 +#| msgid "This software source must be enabled to continue installation." +msgid "This software repository must be enabled to continue installation." +msgstr "Feumaidh tu an t-ionad-tasgaidh bathair-bhog seo a chur an comas mus lean thu air adhart leis an stàladh." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:259 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Dh’fhaoidte gu bheil e mì-laghail %s a stàladh no a chleachdadh ann an cuid a dhùthchannan." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:265 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Dh’fhaoidte gu bheil e mì-laghail an codec seo a stàladh no a chleachdadh ann an cuid a dhùthchannan." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:272 +msgid "Don’t Warn Again" +msgstr "Na seall an rabhadh seo dhomh a-rithist" + +#. TRANSLATORS: button text +#: src/gs-common.c:281 +msgid "Enable and Install" +msgstr "Cuir an comas is stàlaich" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:426 +msgid "Detailed errors from the package manager follow:" +msgstr "Seo fiosrachadh air na mearachdan o mhanaidsear nam pacaidean:" + +#: src/gs-common.c:445 src/gs-details-page.ui:595 +msgid "Details" +msgstr "Fiosrachadh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:75 +msgid "No cartoon violence" +msgstr "Gun ainneart cartùin" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:78 +msgid "Cartoon characters in unsafe situations" +msgstr "Pearsachan cartùin ann an suidheachaidhean nach eil sàbhailte" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "Cartoon characters in aggressive conflict" +msgstr "Pearsachan cartùin ri còmhstri ionnsaigheach" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:84 +msgid "Graphic violence involving cartoon characters" +msgstr "Ainneart grafaigeach le pearsachan cartùin" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "No fantasy violence" +msgstr "Gun ainneart fantastach" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:90 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "Pearsachan ann an suidheachaidhean nach eil sàbhailte gun choltas na fìrinne orra" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:93 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "Pearsachan ri còmhstri ionnsaigheach gun choltas na fìrinne oirre" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Graphic violence easily distinguishable from reality" +msgstr "Ainneart grafaigeach gun choltas na fìrinne air" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:99 +msgid "No realistic violence" +msgstr "Gun ainneart le coltas na fìrinne air" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:102 +msgid "Mildly realistic characters in unsafe situations" +msgstr "Pearsachan fìor-riochdail ann an suidheachaidhean nach eil sàbhailte gu socair" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "Pearsachan fìor-riochdail ri còmhstri ionnsaigheach" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:108 +msgid "Graphic violence involving realistic characters" +msgstr "Ainneart grafaigeach le pearsachan fìor-riochdail" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:111 +msgid "No bloodshed" +msgstr "Gun dòrtadh-fala" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "Unrealistic bloodshed" +msgstr "Dòrtadh-fala gun choltas na fìrinne air" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:117 +msgid "Realistic bloodshed" +msgstr "Dòrtadh-fala fìor-riochdail" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:120 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "Dòrtadh-fala agus milleadh buill na bodhaige" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:123 +msgid "No sexual violence" +msgstr "Gun ainneart gnèitheach" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Rape or other violent sexual behavior" +msgstr "Neach-èigneachadh agus giùlan feise ainneartach eile" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:129 +msgid "No references to alcohol" +msgstr "Gun iomradh air deoch-làidir" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "References to alcoholic beverages" +msgstr "Iomradh air deoch-làidir" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:135 +msgid "Use of alcoholic beverages" +msgstr "Gabhail dibhe-làidir" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:138 +msgid "No references to illicit drugs" +msgstr "Gun iomradh air drugaichean neo-cheadaichte" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:141 +msgid "References to illicit drugs" +msgstr "Iomradh air drugaichean neo-cheadaichte" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Use of illicit drugs" +msgstr "Cleachdadh dhrugaichean neo-cheadaichte" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:147 +msgid "References to tobacco products" +msgstr "Iomradh air tombaca" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:150 +msgid "Use of tobacco products" +msgstr "Cleachdadh tombaca" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:153 +msgid "No nudity of any sort" +msgstr "Gun lomnochd sam bith" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Brief artistic nudity" +msgstr "Lomnochd maiseach gu goirid" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:159 +msgid "Prolonged nudity" +msgstr "Lomnochd gu fada" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:162 +msgid "No references or depictions of sexual nature" +msgstr "Gun iomradh no sealladh feise" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Provocative references or depictions" +msgstr "Iomraidhean no seallaidhean buaireasach" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:168 +msgid "Sexual references or depictions" +msgstr "Iomraidhean no seallaidhean feise" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:171 +msgid "Graphic sexual behavior" +msgstr "Giùlan feise grafaigeach" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No profanity of any kind" +msgstr "Gun droch-chainnt sam bith" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:177 +msgid "Mild or infrequent use of profanity" +msgstr "Droch-chainnt ainneamh no shocair" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Moderate use of profanity" +msgstr "Cleachdadh droch-chainnte measarra" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:183 +msgid "Strong or frequent use of profanity" +msgstr "Droch-chainnt làidir no thric" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:186 +msgid "No inappropriate humor" +msgstr "Gun àbhachdas neo-iomchaidh sam bith" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Slapstick humor" +msgstr "Àbhachdas slapstick" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:192 +msgid "Vulgar or bathroom humor" +msgstr "Àbhachdas garbh no taighe-bhig" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:195 +msgid "Mature or sexual humor" +msgstr "Àbhachdas inbheach no feise" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "No discriminatory language of any kind" +msgstr "Gun chainnt leth-bhreithe sam bith" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:201 +msgid "Negativity towards a specific group of people" +msgstr "Dìmeas air seòrsa sònraichte de dhaoine" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:204 +msgid "Discrimination designed to cause emotional harm" +msgstr "Leth-bhreith ag amas air cron fhaireachdainnean" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "Leth-bhreith follaiseach air gnè, gnèitheachd, cinneadh no creideamh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:210 +msgid "No advertising of any kind" +msgstr "Gun sanasachd sam bith" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Product placement" +msgstr "Sanasachd" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:216 +msgid "Explicit references to specific brands or trademarked products" +msgstr "Iomraidhean follaiseach air branndaichean sònraichte no batharan le comharra-malairt" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:219 +#| msgid "Players are encouraged to purchase specific real-world items" +msgid "Users are encouraged to purchase specific real-world items" +msgstr "Tha na cleachdaichean ’gam brosnachadh ach an ceannaich iad rudan sònraichte" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:222 +msgid "No gambling of any kind" +msgstr "Gun chearrachas sam bith" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:225 +msgid "Gambling on random events using tokens or credits" +msgstr "Cearrachas air tachartasan tuaireamach le tòcanan no creideasan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "Gambling using “play” money" +msgstr "Cearrachas le airgead “cluiche”" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:231 +msgid "Gambling using real money" +msgstr "Cearrachas le fìor-airgead" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "No ability to spend money" +msgstr "Gun chomas gus airgead a chosg" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:237 +#| msgid "Players are encouraged to purchase specific real-world items" +msgid "Users are encouraged to donate real money" +msgstr "Tha na cleachdaichean ’gam brosnachadh ach an doir iad tabhartas airgid" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:240 +msgid "Ability to spend real money in-game" +msgstr "Comas gus fìor-airgead a chosg am broinn a’ gheama" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:243 +#| msgid "No way to chat with other players" +msgid "No way to chat with other users" +msgstr "Gun chomas cabadaich le cleachdaichean eile" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:246 +#| msgid "Player-to-player game interactions without chat functionality" +msgid "User-to-user game interactions without chat functionality" +msgstr "Gnìomhan geama eadar cleachdaichean sa gheama gun ghleus cabadaich" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:249 +#| msgid "Uncontrolled chat functionality between players" +msgid "Moderated chat functionality between users" +msgstr "Gleus cabadaich le maoir eadar na cleachdaichean" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:252 +#| msgid "Uncontrolled chat functionality between players" +msgid "Uncontrolled chat functionality between users" +msgstr "Gleus cabadaich gun stiùireadh eadar na cleachdaichean" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:255 +#| msgid "No way to talk with other players" +msgid "No way to talk with other users" +msgstr "Gun chomas bruidhinn ri cleachdaichean eile" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:258 +#| msgid "Uncontrolled audio or video chat functionality between players" +msgid "Uncontrolled audio or video chat functionality between users" +msgstr "Gleus cabadaich fuaime no video gun stiùireadh eadar na cleachdaichean" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "No sharing of social network usernames or email addresses" +msgstr "Gun cho-roinneadh ainmean-cleachdaiche airson lìonraidhean sòisealta no sheòlaidhean puist-d" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:264 +msgid "Sharing social network usernames or email addresses" +msgstr "Co-roinneadh ainmean-cleachdaiche airson lìonraidhean sòisealta no sheòlaidhean puist-d" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:267 +msgid "No sharing of user information with 3rd parties" +msgstr "Gun cho-roinneadh fiosrachadh a’ chleachdaiche le treas-phàrtaidhean" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "Checking for the latest application version" +msgstr "A’ toirt sùil airson an tionndaidh as ùire dhen aplacaid" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:273 +msgid "Sharing diagnostic data that does not let others identify the user" +msgstr "Co-roinneadh dàta diagnosachd nach leig le daoine eile an cleachdaiche aithneachadh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:276 +#| msgid "Sharing user information with 3rd parties" +msgid "Sharing information that lets others identify the user" +msgstr "Co-roinneadh fiosrachaidh a leigeas le daoine eile an cleachdaiche aithneachadh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:279 +msgid "No sharing of physical location to other users" +msgstr "Gun cho-roinneadh fiosrachaidh air far a bheil thu le cleachdaichean eile" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:282 +msgid "Sharing physical location to other users" +msgstr "Co-roinneadh far a bheil thu le cleachdaichean eile" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:287 +#| msgid "No references to alcohol" +msgid "No references to homosexuality" +msgstr "Gun iomradh air co-sheòrsachd" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:290 +#| msgid "No references to alcohol" +msgid "Indirect references to homosexuality" +msgstr "Leth-iomradh air co-sheòrsachd" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:293 +msgid "Kissing between people of the same gender" +msgstr "Dithis dhen aon ghnè a’ toirt pòg" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:296 +msgid "Graphic sexual behavior between people of the same gender" +msgstr "Giùlan feise grafaigeach eadar dithis dhen aon ghnè" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:299 +#| msgid "No references to alcohol" +msgid "No references to prostitution" +msgstr "Gun iomradh air siùrsachd" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:302 +#| msgid "Provocative references or depictions" +msgid "Indirect references to prostitution" +msgstr "Leth-iomradh air siùrsachd" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:305 +#| msgid "Provocative references or depictions" +msgid "Direct references of prostitution" +msgstr "Iomradh dìreach air siùrsachd" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:308 +msgid "Graphic depictions of the act of prostitution" +msgstr "Sealladh grafaigeach de shiùrsachd" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:311 +#| msgid "No references to alcohol" +msgid "No references to adultery" +msgstr "Gun iomradh air adhaltranas" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:314 +#| msgid "No references to alcohol" +msgid "Indirect references to adultery" +msgstr "Leth-iomradh air adhaltranas" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:317 +#| msgid "No references to alcohol" +msgid "Direct references of adultery" +msgstr "Iomradh dìreach air adhaltranas" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:320 +msgid "Graphic depictions of the act of adultery" +msgstr "Sealladh grafaigeach de dh’adhaltranas" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:323 +#| msgid "No sexual violence" +msgid "No sexualized characters" +msgstr "Gun phearsachan drabasta" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:326 +msgid "Scantily clad human characters" +msgstr "Pearsachan daonna le aodach gann" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:329 +msgid "Overtly sexualized human characters" +msgstr "Pearsachan daonna drabasta" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:332 +#| msgid "No references to alcohol" +msgid "No references to desecration" +msgstr "Gun iomradh air mì-naomhachadh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:335 +msgid "Depictions or references to historical desecration" +msgstr "Sealladh no iomradh air mì-naomhachadh eachdraidheil" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:338 +msgid "Depictions of modern-day human desecration" +msgstr "Sealladh no iomradh air mì-naomhachadh daonna an latha an-diugh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:341 +msgid "Graphic depictions of modern-day desecration" +msgstr "Sealladh grafaigeach air mì-naomhachadh an latha an-diugh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:344 +msgid "No visible dead human remains" +msgstr "Gun sealladh air iarsmadh daonna" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:347 +msgid "Visible dead human remains" +msgstr "Sealladh air iarsmadh daonna" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:350 +msgid "Dead human remains that are exposed to the elements" +msgstr "Iarsmadh daonna nochdte ris na dùilean" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:353 +msgid "Graphic depictions of desecration of human bodies" +msgstr "Sealladh grafaigeach air mì-naomhachadh bodhaigean daonna" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:356 +#| msgid "No references to alcohol" +msgid "No references to slavery" +msgstr "Gun iomradh air tràilleachd" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:359 +msgid "Depictions or references to historical slavery" +msgstr "Sealladh no iomradh air tràilleachd eachdraidheil" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:362 +msgid "Depictions of modern-day slavery" +msgstr "Sealladh no iomradh air tràilleachd an latha an-diugh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:365 +msgid "Graphic depictions of modern-day slavery" +msgstr "Sealladh grafaigeach air tràlleachd an latha an-diugh" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:295 +msgid "An application" +msgstr "Aplacaid" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:301 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "Tha %s ag iarraidh taic a bharrachd airson fòrmatan faidhle." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:303 +msgid "Additional MIME Types Required" +msgstr "Tha feum air seòrsaichean MIME a bharrachd" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:307 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "Tha %s ag iarraidh cruthan-clò a bharrachd." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:309 +msgid "Additional Fonts Required" +msgstr "Tha feum air cruthan-clò a bharrachd" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:313 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "Tha %s ag iarraidh barrachd codecs ioma-mheadhan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:315 +msgid "Additional Multimedia Codecs Required" +msgstr "Tha feum air codecs ioma-mheadhain a bharrachd" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:319 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "Tha %s ag iarraidh draibhearan clò-bhualadairean a bharrachd." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:321 +msgid "Additional Printer Drivers Required" +msgstr "Tha feum air draibhearan clò-bhualadairean a bharrachd" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:325 +#, c-format +msgid "%s is requesting additional packages." +msgstr "Tha %s ag iarraidh pacaidean a bharrachd." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:327 +msgid "Additional Packages Required" +msgstr "Tha feum air pacaidean a bharrachd" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:336 +msgid "Find in Software" +msgstr "Lorg sa bhathar-bhog" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo +#: src/gs-details-page.c:286 src/gs-details-page.c:314 +#: src/gs-details-page.ui:206 src/gs-third-party-repo-row.c:97 +#: src/gs-upgrade-banner.ui:146 +msgid "_Install" +msgstr "_Stàlaich" + +#. TRANSLATORS: button text in the header when an application +#. * can be live-updated +#: src/gs-details-page.c:319 +msgid "_Update" +msgstr "Ùraic_h" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo. +#. The ellipsis indicates that further steps are required +#: src/gs-details-page.c:332 src/gs-third-party-repo-row.c:89 +msgid "_Install…" +msgstr "_Stàlaich…" + +#. TRANSLATORS: A label for a button to execute the selected +#. application. +#: src/gs-details-page.c:366 +msgid "_Launch" +msgstr "_Tòisich" + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:391 src/gs-details-page.ui:241 +msgid "_Remove" +msgstr "Thoi_r air falbh" + +#: src/gs-details-page.c:459 +msgid "Removing…" +msgstr "’Ga thoirt air falbh…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:478 +msgid "Pending installation…" +msgstr "Ri stàladh…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:485 +#| msgid "Setting up updates…" +msgid "Pending update…" +msgstr "Ri ùrachadh…" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:802 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "Cha ghabh an aplacaid seo a chleachdadh ach fad a bhios tu ceangailte ris an eadar-lìon." + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:967 +msgctxt "version" +msgid "Unknown" +msgstr "Chan eil fhios" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:980 +msgctxt "updated" +msgid "Never" +msgstr "A-riamh" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1028 +msgctxt "origin" +msgid "Unknown" +msgstr "Chan eil fhios" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1425 +msgid "You need internet access to write a review" +msgstr "Feumaidh ceangal dhan eadar-lìon a bhith agad mus sgrìobh thu lèirmheas" + +#: src/gs-details-page.c:1559 +#, c-format +msgid "Unable to find “%s”" +msgstr "Cha b’ urrainn dhuinn “%s” a lorg" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2162 +msgid "Public domain" +msgstr "Public Domain" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://de.wikipedia.org/wiki/Gemeinfreiheit +#: src/gs-details-page.c:2165 +msgid "https://en.wikipedia.org/wiki/Public_domain" +msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://www.gnu.org/philosophy/free-sw.de +#: src/gs-details-page.c:2172 +msgid "https://www.gnu.org/philosophy/free-sw" +msgstr "https://www.gnu.org/philosophy/free-sw" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2182 src/gs-details-page.ui:1383 +msgid "Free Software" +msgstr "Bathar-bog saor" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2239 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "Gabhaidh an luchd-cleachdaidh ris a’ cheadachas seo:" +msgstr[1] "Gabhaidh an luchd-cleachdaidh ris na ceadachasan seo:" +msgstr[2] "Gabhaidh an luchd-cleachdaidh ris na ceadachasan seo:" +msgstr[3] "Gabhaidh an luchd-cleachdaidh ris na ceadachasan seo:" + +#: src/gs-details-page.c:2266 src/gs-details-page.ui:1492 +msgid "More information" +msgstr "Barrachd fiosrachaidh" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Duilleag an fhiosrachaidh" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: src/gs-details-page.ui:346 +msgid "_Add shortcut" +msgstr "Cuir _ath-ghoirid ris" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: src/gs-details-page.ui:361 +msgid "Re_move shortcut" +msgstr "Thoir air falbh an ath-_ghoirid" + +#: src/gs-details-page.ui:456 +msgid "No screenshot provided" +msgstr "Cha deach glacadh-sgrìn a sholar" + +#: src/gs-details-page.ui:492 +#| msgid "Software Source Included" +msgid "Software Repository Included" +msgstr "Tha ionad-tasgaidh bathair-bhog ’na bhroinn" + +#: src/gs-details-page.ui:493 +#| msgid "" +#| "This application includes a software source which provides updates, as " +#| "well as access to other software." +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "Gabhaidh am bathar-bog seo a-steach ionad-tasgaidh bathair-bhog a bheir ùrachaidhean dhut cho math ri inntrigeadh gu bathar-bog eile." + +#: src/gs-details-page.ui:506 +#| msgid "No Software Source Included" +msgid "No Software Repository Included" +msgstr "Chan eil ionad-tasgaidh bathair-bhog ’na bhroinn" + +#: src/gs-details-page.ui:507 +#| msgid "" +#| "This application does not include a software source. It will not be " +#| "updated with new versions." +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "Cha ghabh an aplacaid seo a-steach ionad-tasgaidh bathair-bhog. Cha dèid a h-ùrachadh le tionndaidhean ùra." + +#: src/gs-details-page.ui:521 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "Bheir an sgaoileadh agad am bhathar-bog seo dhut mar-thà is cha bu chòir dhut dad a chur ’na àite." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:534 +#| msgid "Software Source Identified" +msgid "Software Repository Identified" +msgstr "Chaidh ionad-tasgaidh bathair-bhog aithneachadh" + +#: src/gs-details-page.ui:535 +#| msgid "" +#| "Adding this software source will give you access to additional software " +#| "and upgrades." +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "Ma chuireas tu an ionad-tasgaidh bathair-bhog seo ris, gheibh thu inntrigeadh dha bharrachd bathair-bhog ’s ùrachaidhean." + +#: src/gs-details-page.ui:536 +#| msgid "Only use software sources that you trust." +msgid "Only use software repositories that you trust." +msgstr "Na cleachd ach ionadan-tasgaidh bathair-bhog sa bheil earbsa agad." + +#: src/gs-details-page.ui:552 +msgid "_Website" +msgstr "_Làrach-lìn" + +#: src/gs-details-page.ui:567 +msgid "_Donate" +msgstr "Thoir _tìodhlac dhuinn" + +#: src/gs-details-page.ui:701 +msgid "Localized in your Language" +msgstr "Air eagar-theangachadh dhan chànan agad" + +#: src/gs-details-page.ui:713 +msgid "Documentation" +msgstr "Docamaideadh" + +#: src/gs-details-page.ui:725 +msgid "Release Activity" +msgstr "Gnìomhachd sgaoilidh" + +#: src/gs-details-page.ui:737 +msgid "System Integration" +msgstr "Filleadh a-steach dhan t-siostam" + +#: src/gs-details-page.ui:749 +msgid "Sandboxed" +msgstr "Ann am bogsa-gainmhich" + +#: src/gs-details-page.ui:774 +msgid "Version" +msgstr "Tionndadh" + +#: src/gs-details-page.ui:811 +msgid "Age Rating" +msgstr "Rangachadh aoise" + +#: src/gs-details-page.ui:849 +msgid "Updated" +msgstr "Air ùrachadh" + +#: src/gs-details-page.ui:884 +msgid "Category" +msgstr "Roinn-seòrsa" + +#: src/gs-details-page.ui:922 +msgid "Installed Size" +msgstr "Meud an stàlaidh" + +#: src/gs-details-page.ui:955 +msgid "Download Size" +msgstr "Meud an luchdaidh a-nuas" + +#: src/gs-details-page.ui:1021 +msgid "Developer" +msgstr "Leasaichear" + +#: src/gs-details-page.ui:1055 +msgid "License" +msgstr "Ceadachas" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1075 +msgid "Free" +msgstr "Saor" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1092 +msgid "Proprietary" +msgstr "Fo sheilbh" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.ui:1109 src/gs-review-row.c:71 +msgid "Unknown" +msgstr "Chan eil fhios" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: src/gs-details-page.ui:1163 src/gs-installed-page.c:490 +#: plugins/core/gs-desktop-common.c:331 +msgid "Add-ons" +msgstr "Tuilleadain" + +#: src/gs-details-page.ui:1176 +msgid "Selected add-ons will be installed with the application." +msgstr "Thèid roghainn de thuilleadain a stàladh leis an aplacaid." + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-details-page.ui:1219 +msgid "Reviews" +msgstr "Lèirmheasan" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1235 +msgid "_Write a Review" +msgstr "Sgrìobh _lèirmheas" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1257 +msgid "_Show More" +msgstr "_Seall barrachd" + +#: src/gs-details-page.ui:1400 +msgid "" +"This means that the software can be freely run, copied, distributed, studied " +"and modified." +msgstr "Is ciall dha gum faodar am bathar-bog saor a ruith, lethbhreac dheth a dhèanamh ’s a sgaoileadh, sgrùdadh is atharrachadh mar a thograr." + +#: src/gs-details-page.ui:1459 +msgid "Proprietary Software" +msgstr "Bathar-bog fo sheilbh" + +#: src/gs-details-page.ui:1476 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "Is ciall dha seo gur ann le neach no companaidh a tha sa bhathar-bhog. Bidh cuingeachaidhean an sàs air mar a thèid a chleachdadh agus cha ghabh am bun-tùs aige inntrigeadh mar as trice." + +#: src/gs-details-page.ui:1521 +msgid "Unknown Software License" +msgstr "Ceadachas bathair-bhog nach aithne dhuinn" + +#: src/gs-details-page.ui:1538 +msgid "The license terms of this software are unknown." +msgstr "Chan aithne dhuinn teirmichean ceadachas a’ bhathair-bhog seo." + +#: src/gs-details-page.ui:1565 +msgid "The application was rated this way because it features:" +msgstr "Chaidh an aplacaid a rangachadh mar seo on a bhios na leanas aice:" + +#: src/gs-details-page.ui:1591 +msgid "No details were available for this rating." +msgstr "Chan robh fhiosrachadh ri fhaighinn airson an rangachaidh seo." + +#: src/gs-editor.c:361 +msgid "CSS validated OK!" +msgstr "Tha an CSS mar bu chòir!" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:564 +msgid "Failed to load file" +msgstr "Dh’fhàillig le luchdadh faidhle" + +#. TRANSLATORS: window title +#: src/gs-editor.c:598 src/gs-editor.c:874 +msgid "Unsaved changes" +msgstr "Atharraichean gun sàbhaladh" + +#: src/gs-editor.c:600 +msgid "The application list is already loaded." +msgstr "Chaidh liosta nan aplacaidean a luchdadh mar-thà." + +#. TRANSLATORS: button text +#: src/gs-editor.c:604 +msgid "Merge documents" +msgstr "Co-aonaich sgrìobhainnean" + +#. TRANSLATORS: button text +#: src/gs-editor.c:608 src/gs-editor.c:879 +msgid "Throw away changes" +msgstr "Tilg air falbh na h-atharraichean" + +#. import the new file +#: src/gs-editor.c:620 src/gs-editor.c:652 +msgid "Open AppStream File" +msgstr "Fosgail faidhle AppStream" + +#: src/gs-editor.c:624 +msgid "_Open" +msgstr "F_osgail" + +#: src/gs-editor.c:656 +msgid "_Save" +msgstr "_Sàbhail" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:676 +msgid "Failed to save file" +msgstr "Cha b’ urrainn dhuinn am faidhle a shàbhaladh" + +#. TRANSLATORS, the %s is the app name, e.g. 'Inkscape' +#: src/gs-editor.c:751 +#, c-format +msgid "%s banner design deleted." +msgstr "Chaidh bratach %s a sguabadh às." + +#. TRANSLATORS, this is a notification +#: src/gs-editor.c:754 +msgid "Banner design deleted." +msgstr "Chaidh co-dhealbhachd a’ bhrataich a sguabadh às." + +#: src/gs-editor.c:876 +msgid "The application list has unsaved changes." +msgstr "Tha atharraichean gun sàbhaladh air liosta nan aplacaid." + +#. TRANSLATORS: show the program version +#: src/gs-editor.c:1111 +msgid "Use verbose logging" +msgstr "Cleachd logadh briathrach" + +#. TRANSLATORS: program name, an application to add and remove software repositories +#: src/gs-editor.c:1119 +msgid "GNOME Software Banner Designer" +msgstr "Dealbhaiche brataich airson bathar-bog GNOME" + +#: src/gs-editor.ui:63 src/gs-editor.ui:77 +msgid "No Designs" +msgstr "Chan eil dealbhadh ann" + +#: src/gs-editor.ui:163 +msgid "Error message here" +msgstr "Teachdaireachd mearachd an-seo" + +#: src/gs-editor.ui:250 +msgid "App ID" +msgstr "ID na h-aplacaid" + +#: src/gs-editor.ui:341 src/gs-review-dialog.ui:142 +msgid "Summary" +msgstr "Gearr-chunntas" + +#: src/gs-editor.ui:382 +msgid "Editor’s Pick" +msgstr "Taghadh an deasaiche" + +#. This check button controls whether the application’s banner appears in the “Featured” category +#: src/gs-editor.ui:397 +msgid "Category Featured" +msgstr "San roinn-seòrsa “Brosnaichte”" + +#. button in the info bar +#: src/gs-editor.ui:471 +msgid "Undo" +msgstr "Neo-dhèan" + +#: src/gs-editor.ui:524 src/org.gnome.Software.Editor.desktop.in:3 +msgid "Banner Designer" +msgstr "Dealbhaiche brataich" + +#: src/gs-editor.ui:547 +msgid "New Banner" +msgstr "Bratach ùr" + +#: src/gs-editor.ui:615 +msgid "Import from file" +msgstr "Ion-phortaich o fhaidhle" + +#: src/gs-editor.ui:629 +msgid "Export to file" +msgstr "Às-phortaich gu faidhle" + +#: src/gs-editor.ui:643 +msgid "Delete Design" +msgstr "Sguab às an dealbhachadh" + +#: src/gs-editor.ui:670 +msgid "Featured App" +msgstr "Aplacaid bhrosnaichte" + +#: src/gs-editor.ui:684 +msgid "OS Upgrade" +msgstr "Àrdachadh an t-siostaim-obrachaidh" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:147 +msgid " and " +msgstr " ’s " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:150 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:176 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Cruthan-clò ri am faighinn airson an sgriobt %s" +msgstr[1] "Cruthan-clò ri am faighinn airson nan sgriobtaichean %s" +msgstr[2] "Cruthan-clò ri am faighinn airson nan sgriobtaichean %s" +msgstr[3] "Cruthan-clò ri am faighinn airson nan sgriobtaichean %s" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:184 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Bathar-bog ri fhaighinn airson %s" +msgstr[1] "Bathar-bog ri fhaighinn airson %s" +msgstr[2] "Bathar-bog ri fhaighinn airson %s" +msgstr[3] "Bathar-bog ri fhaighinn airson %s" + +#: src/gs-extras-page.c:226 +msgid "Unable to Find Requested Software" +msgstr "Cha deach leinn am bathar-bog a chaidh iarraidh a lorg" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:328 +#, c-format +msgid "%s not found" +msgstr "Cha deach %s a lorg" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:332 +msgid "on the website" +msgstr "air an làrach-lìn" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:339 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "Chan eil aplacaid ri làimh a bheir am faidhle %s dhut." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:343 src/gs-extras-page.c:354 src/gs-extras-page.c:365 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "Gheibh thu fiosrachadh mu %s cho math ri roghainnean gus na h-aplacaidean a tha a dhìth fhaighinn air %s ma dh’fhaoidte." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:350 src/gs-extras-page.c:372 +#, c-format +msgid "No applications are available for %s support." +msgstr "Chan eil aplacaid ri làimh a bheir taic ri %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:361 +#, c-format +msgid "%s is not available." +msgstr "Chan eil %s ri làimh." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:376 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "Gheibh thu fiosrachadh mu %s cho math ri roghainnean gus aplacaid fhaighinn a bheir taic dhan fhòrmat seo air %s ma dh’fhaoidte." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:383 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Chan eil cruth-clò ri fhaighinn a bheir taic ris an sgriobt %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:387 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "Gheibh thu fiosrachadh mu %s cho math ri roghainnean gus barrachd chruthan-clò fhaighinn air %s ma dh’fhaoidte." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:394 lib/gs-plugin-loader.c:1480 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Chan eil codec ri làimh ’na thuilleadan airson an fhòrmait %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:398 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "Gheibh thu fiosrachadh mu %s cho math ri roghainnean gus codec fhaighinn a chluicheas am fòrmat seo air %s ma dh’fhaoidte." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:405 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Chan eil goireas Plasma ri làimh a bheir taic ri %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:409 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "Gheibh thu fiosrachadh mu %s cho math ri roghainnean gus barrachd ghoireasan Plasma fhaighinn air %s ma dh’fhaoidte." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:416 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Chan eil draibhear clò-bhualadair ri làimh airson %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:420 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "Gheibh thu fiosrachadh mu %s cho math ri roghainnean gus draibhear fhaighinn bheir taic dhan chlò-bhualadair seo air %s ma dh’fhaoidte." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:464 +msgid "this website" +msgstr "an làrach-lìn seo" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "Gu mì-fhortanach, cha deach an %s a bha thu a’ sireadh a lorg. Tadhail air %s airson barrachd fiosrachaidh." +msgstr[1] "Gu mì-fhortanach, cha deach an %s a bha thu a’ sireadh a lorg. Tadhail air %s airson barrachd fiosrachaidh." +msgstr[2] "Gu mì-fhortanach, cha deach na %s a bha thu a’ sireadh a lorg. Tadhail air %s airson barrachd fiosrachaidh." +msgstr[3] "Gu mì-fhortanach, cha deach na %s a bha thu a’ sireadh a lorg. Tadhail air %s airson barrachd fiosrachaidh." + +#: src/gs-extras-page.c:539 src/gs-extras-page.c:595 src/gs-extras-page.c:634 +msgid "Failed to find any search results" +msgstr "Cha deach toradh a lorg" + +#: src/gs-extras-page.c:828 +#, c-format +msgid "%s file format" +msgstr "fòrmat faidhle %s" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Duilleag nan codec" + +#: src/gs-first-run-dialog.ui:7 src/gs-first-run-dialog.ui:16 +msgid "Welcome" +msgstr "Fàilte" + +#: src/gs-first-run-dialog.ui:50 +msgid "Welcome to Software" +msgstr "Fàilte dhan bhathar-bhog" + +#: src/gs-first-run-dialog.ui:66 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "Leigidh Bathar-bog leat a h-uile bathar-bog air a bheil thu feumach a stàladh, a h-uile rud san aon àite. Seall air na mholamaid, brabhsaich na roinnean-seòrsa no lorg airson nan aplacaidean a thogras tu." + +#: src/gs-first-run-dialog.ui:85 +msgid "_Let’s Go Shopping" +msgstr "_Tiugainn dhan bhùth" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: src/gs-hiding-box.c:381 +msgid "Spacing" +msgstr "Beàrnadh" + +#: src/gs-hiding-box.c:382 +msgid "The amount of space between children" +msgstr "Meud nam beàrnan eadar a’ chlann" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:83 +msgctxt "app status" +msgid "Removed" +msgstr "Air a thoirt air falbh" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:89 +msgctxt "app status" +msgid "Installed" +msgstr "Stàlaichte" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:95 +msgctxt "app status" +msgid "Updated" +msgstr "Air ùrachadh" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:101 +msgctxt "app status" +msgid "Unknown" +msgstr "Chan eil fhios" + +#: src/gs-history-dialog.ui:6 +msgid "History" +msgstr "Eachdraidh" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:486 +msgid "System Applications" +msgstr "Aplacaidean an t-siostaim" + +#: src/gs-installed-page.c:618 +msgid "Click on items to select them" +msgstr "Briog air nithean gus an taghadh" + +#: src/gs-installed-page.c:820 +msgid "Select" +msgstr "Tagh" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Duilleag na feadhainn stàlaichte" + +#: src/gs-installed-page.ui:65 +msgid "_Add to Folder…" +msgstr "_Cuir ri pasgan…" + +#: src/gs-installed-page.ui:73 +msgid "_Move to Folder…" +msgstr "_Gluais gu pasgan…" + +#: src/gs-installed-page.ui:81 +msgid "_Remove from Folder" +msgstr "Thoi_r air falbh on phasgan" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:75 +msgid "Software catalog is being downloaded" +msgstr "Cha catalog a’ bhathair-bhog ’ga luchdadh a-nuas" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:79 +msgid "Software catalog is being loaded" +msgstr "Cha catalog a’ bhathair-bhog ’ga luchdadh" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "A’ luchdadh na duilleige" + +#: src/gs-loading-page.ui:53 +msgid "Starting up…" +msgstr "A’ tòiseachadh…" + +#: src/gs-menus.ui:7 +#| msgid "_Software Sources" +msgid "_Software Repositories" +msgstr "_Ionadan-tasgaidh bathair-bhog" + +#: src/gs-menus.ui:14 +msgid "_About" +msgstr "_Mu dhèidhinn" + +#: src/gs-menus.ui:18 +msgid "_Quit" +msgstr "_Fàg an-seo" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "Dèan maorsainneachd air an duilleag" + +#: src/gs-moderate-page.ui:87 +msgid "There are no reviews to moderate" +msgstr "Chan eil lèirmheas sam bith feumach air maorsainneachd" + +#. add button +#: src/gs-overview-page.c:330 +msgid "More…" +msgstr "Barrachd…" + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:496 +msgid "Recommended Audio & Video Applications" +msgstr "Aplacaidean fuaime ⁊ video a mholamaid" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:501 +msgid "Recommended Games" +msgstr "Geamannan a mholamaid" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:506 +msgid "Recommended Graphics Applications" +msgstr "Aplacaidean grafaigeachd a mholamaid" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:511 +msgid "Recommended Productivity Applications" +msgstr "Aplacaidean dèanadais a mholamaid" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:889 src/gs-repos-dialog.c:840 +msgid "Access additional software from selected third party sources." +msgstr "Inntrig barrachd bathair-bog o thaghadh de thùsan threas-phàrtaidhean." + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:893 src/gs-repos-dialog.c:844 +#| msgid "" +#| "Proprietary software has restrictions on use and access to source code." +msgid "" +"Some of this software is proprietary and therefore has restrictions on use, " +"sharing, and access to source code." +msgstr "Tha cuid dhen bhathar-bhog seo fo shealbh agus ri linn sin, tha cuingeachaidhean air a chleachdaidh, air a’ cho-roinneadh is air inntrigeadh dhan bhun-tùs." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-overview-page.c:898 src/gs-repos-dialog.c:849 +msgid "Find out more…" +msgstr "Barrachd fiosrachaidh…" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:906 src/gs-repos-dialog.c:252 +msgid "Enable" +msgstr "Cuir an comas" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Duilleag an fhoir-sheallaidh" + +#: src/gs-overview-page.ui:49 +#| msgid "Enable Third-Party Software Source?" +msgid "Enable Third Party Software Repositories?" +msgstr "A bheil thu airson ionadan-tasgaidh bathair-bhog threas-phàrtaidhean a chur an comas?" + +#: src/gs-overview-page.ui:117 +msgid "Featured Application" +msgstr "Aplacaid bhrosnaichte" + +#: src/gs-overview-page.ui:150 +msgid "Categories" +msgstr "Roinnean-seòrsa" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-overview-page.ui:310 +msgid "Editor’s Picks" +msgstr "Taghadh an deasaiche" + +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-overview-page.ui:348 +msgid "Recent Releases" +msgstr "Sgaoilidhean o chionn ghoirid" + +#: src/gs-overview-page.ui:435 +msgid "No Application Data Found" +msgstr "Cha deach dàta na h-aplacaid a lorg" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:489 +#, c-format +msgid "Are you sure you want to purchase %s?" +msgstr "A bheil thu cinnteach gu bheil thu airson %s a cheannach?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:493 +#, c-format +msgid "%s will be installed, and you will be charged %s." +msgstr "Thèid %s a stàladh agus %s iarraidh ort." + +#. TRANSLATORS: this is button text to purchase the application +#: src/gs-page.c:506 +msgid "Purchase" +msgstr "Ceannaich" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:580 +#, c-format +msgid "Prepare %s" +msgstr "Ullaich %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * source name, e.g. 'GNOME Nightly' +#: src/gs-page.c:715 +#, c-format +msgid "Are you sure you want to remove the %s source?" +msgstr "A bheil thu cinnteach gu bheil thu airson an tùs %s a thoirt air falbh?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:719 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the source to use them again." +msgstr "Thèid a h-uile aplacaid o %s a thoirt air falbh agus feumaidh tu an tùs a stàladh às ùr ma tha thu airson an cleachdadh a-rithist." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:727 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "A bheil thu cinnteach gu bheil thu airson %s a thoirt air falbh?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:730 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "Thèid %s a thoirt air falbh agus feumaidh tu a stàladh às ùr ma tha thu airson a chleachdadh a-rithist." + +#: lib/gs-plugin-loader.c:1483 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "Gheibh thu fiosrachadh mu %s cho math ri roghainnean gus codec fhaighinn a chluicheas am fòrmat seo air an làrach-lìn." + +#. TRANSLATORS: this refers to an app (by name) that is installed +#: src/gs-popular-tile.c:69 src/gs-summary-tile.c:75 +#, c-format +msgid "%s (Installed)" +msgstr "%s (air a stàladh)" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-popular-tile.c:205 src/gs-shell-search-provider.c:271 +#, c-format +#| msgid "Source" +msgid "Source: %s" +msgstr "Tùs: %s" + +#: lib/gs-price.c:111 +#, c-format +msgid "A$%.2f" +msgstr "A$%.2f" + +#: lib/gs-price.c:113 +#, c-format +msgid "C$%.2f" +msgstr "C$%.2f" + +#: lib/gs-price.c:115 +#, c-format +msgid "CN¥%.2f" +msgstr "CN¥%.2f" + +#: lib/gs-price.c:117 +#, c-format +msgid "€%.2f" +msgstr "€%.2f" + +#: lib/gs-price.c:119 +#, c-format +msgid "£%.2f" +msgstr "£%.2f" + +#: lib/gs-price.c:121 +#, c-format +msgid "¥%.2f" +msgstr "¥%.2f" + +#: lib/gs-price.c:123 +#, c-format +msgid "NZ$%.2f" +msgstr "NZ$%.2f" + +#: lib/gs-price.c:125 +#, c-format +msgid "₽%.2f" +msgstr "₽%.2f" + +#: lib/gs-price.c:127 +#, c-format +msgid "US$%.2f" +msgstr "US$%.2f" + +#. Translators: %s is the currency, and %f is the amount. +#. * You can switch the order by using “%2$f %1$s” instead. +#: lib/gs-price.c:131 +#, c-format +msgid "%s %f" +msgstr "%s %f" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:128 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "Tha bathar-bog stàlaichte agad nach eil co-chòrdail ri %s. Ma leanas tu air adhart, seo na thèid a thoirt air falbh gu fèin-obrachail rè an àrdachaidh:" + +#: src/gs-removal-dialog.ui:27 +msgid "Incompatible Software" +msgstr "Bathar-bog nach eil co-chòrdail" + +#: src/gs-removal-dialog.ui:40 +msgid "_Continue" +msgstr "_Lean air adhart" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:110 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "%u aplacaid air a stàladh" +msgstr[1] "%u aplacaid air a stàladh" +msgstr[2] "%u aplacaidean air an stàladh" +msgstr[3] "%u aplacaid air an stàladh" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:117 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u tuilleadan air a stàladh" +msgstr[1] "%u thuilleadan air a stàladh" +msgstr[2] "%u tuilleadain air an stàladh" +msgstr[3] "%u tuilleadan air an stàladh" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repos-dialog.c:125 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u aplacaid" +msgstr[1] "%u aplacaid" +msgstr[2] "%u aplacaidean" +msgstr[3] "%u aplacaid" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repos-dialog.c:131 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u tuilleadan" +msgstr[1] "%u thuilleadan" +msgstr[2] "%u tuilleadain" +msgstr[3] "%u tuilleadan" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repos-dialog.c:138 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s is %s air an stàladh" +msgstr[1] "%s is %s air an stàladh" +msgstr[2] "%s is %s air an stàladh" +msgstr[3] "%s is %s air an stàladh" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:312 +#, c-format +#| msgid "“%s”" +msgid "Remove “%s”?" +msgstr "A bheil thu airson “%s” a thoirt air falbh?" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:317 +#, c-format +#| msgid "Unable to find “%s”" +msgid "Disable “%s”?" +msgstr "A bheil thu airson “%s” a chur à comas?" + +#. TRANSLATORS: longer dialog text +#: src/gs-repos-dialog.c:321 +msgid "" +"Software that has been installed from this repository will no longer receive " +"updates, including security fixes." +msgstr "Chan fhaigh am bathar-bog a chaidh a stàladh on ionad-tasgaidh seo ùrachaidhean tuilleadh, a’ gabhail a-steach càraidhean tèarainteachd." + +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-repos-dialog.c:339 +#| msgid "Enable" +msgid "Disable" +msgstr "Cuir à comas" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:750 +msgid "the operating system" +msgstr "an siostam-obrachaidh" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:819 src/gs-repos-dialog.c:855 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Cuiridh na h-ionadan-tasgaidh seo ris a’ bhathar-bhog tùsail a bheir %s dhut." + +#. TRANSLATORS: info bar title in the software repositories dialog +#: src/gs-repos-dialog.c:837 +msgid "Third Party Repositories" +msgstr "Ionadan-tasgaidh threas-phàrtaidhean" + +#: src/gs-repos-dialog.ui:82 +#| msgid "Additional Sources" +msgid "No Additional Repositories" +msgstr "Gun ionadan-tasgaidh a bharrachd" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for enabling a repo +#: src/gs-repo-row.c:110 +#| msgid "Enable" +msgid "_Enable" +msgstr "_Cuir an comas" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for removing a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:119 +#| msgid "Remove…" +msgid "_Remove…" +msgstr "Thoi_r air falbh…" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for disabling a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:124 +msgid "_Disable…" +msgstr "_Cuir à comas" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being enabled +#: src/gs-repo-row.c:132 +#| msgid "Enable" +msgid "Enabling" +msgstr "’Ga chur an comas" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being disabled +#: src/gs-repo-row.c:144 +#| msgid "Installing" +msgid "Disabling" +msgstr "’Ga chur à comas" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is enabled. +#: src/gs-repo-row.c:158 +#| msgid "Enable" +msgid "Enabled" +msgstr "Air a chur an comas" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is disabled. +#: src/gs-repo-row.c:164 +msgid "Disabled" +msgstr "Air a chur à comas" + +#: src/gs-repo-row.ui:89 +msgid "URL" +msgstr "URL" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:95 +msgid "Hate it" +msgstr "Is lugha orm i" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:99 +msgid "Don’t like it" +msgstr "Cha toigh leam i" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:103 +msgid "It’s OK" +msgstr "Tha i ceart gu leòr" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:107 +msgid "Like it" +msgstr "Is toigh leam i" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:111 +msgid "Love it" +msgstr "Is fìor-thoigh leam i" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:133 +msgid "Please take more time writing the review" +msgstr "Cuir seachad barrachd ùine a’ sgrìobhadh an lèirmheis" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:137 +msgid "Please choose a star rating" +msgstr "Tagh rionnag rangachaidh" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The summary is too short" +msgstr "Tha an gearr-chunntas ro ghoirid" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The summary is too long" +msgstr "Tha an gearr-chunntas ro fhada" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:149 +msgid "The description is too short" +msgstr "Tha an tuairisgeul ro ghoirid" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:153 +msgid "The description is too long" +msgstr "Tha an tuairisgeul ro fhada" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:11 +msgid "Post Review" +msgstr "Dèan lèirmheas" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:35 +msgid "_Post" +msgstr "_Cuir a-null" + +#: src/gs-review-dialog.ui:85 +msgid "Rating" +msgstr "Rangachadh" + +#: src/gs-review-dialog.ui:158 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "Thoir seachad gearr-chunntas air an lèirmheas agad, can: “Sàr-aplacaid, mholainn-sa i”." + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:199 +msgctxt "app review" +msgid "Review" +msgstr "Lèirmheas" + +#: src/gs-review-dialog.ui:215 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "Dè do bheachd air an aplacaid? Feuch an doir thu seachad adhbharan airson do bheachdan." + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:413 +msgid "ratings in total" +msgstr "rangachaidhean iomlan" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:234 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "’S urrainn dhut aithris a dhèanamh air lèirmheasan ri linn droch-chainnt, mì-mhodha no giùlain leth-bhreithich." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:239 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "Nuair a bhios aithris air a dhèanamh air, thèid lèirmheas fhalach gus an dug rianaire sùil air." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:253 +msgid "Report Review?" +msgstr "Ag aithris lèirmheas" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:257 +msgid "Report" +msgstr "Dèan aithris" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:112 +msgid "Was this review useful to you?" +msgstr "A bheil an lèirmheas seo feumail dhut?" + +#: src/gs-review-row.ui:134 +msgid "Yes" +msgstr "Tha" + +#: src/gs-review-row.ui:148 +msgid "No" +msgstr "Chan eil" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:162 +msgid "Meh" +msgstr "Coma co-dhiù" + +#: src/gs-review-row.ui:196 +msgid "Report…" +msgstr "Dèan aithris…" + +#: src/gs-review-row.ui:211 +msgid "Remove…" +msgstr "Thoir air falbh…" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:314 +msgid "Screenshot not found" +msgstr "Cha deach glacadh-sgrìn a lorg" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:329 +msgid "Failed to load image" +msgstr "Dh’fhàillig le luchdadh an deilbh" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:462 +msgid "Screenshot size not found" +msgstr "Cha deach meud a’ ghlacaidh-sgrìn a lorg" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:492 +msgid "Could not create cache" +msgstr "Cha b’ urrainn dhuinn tasgadan a chruthachadh" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:553 +msgid "Screenshot not valid" +msgstr "Chan eil an glacadh-sgrìn mar bu chòir" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:568 +msgid "Screenshot not available" +msgstr "Chan eil glacadh-sgrìn ri làimh" + +#: src/gs-screenshot-image.c:621 +msgid "Screenshot" +msgstr "Glacadh-sgrìn" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:158 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u mhaidse a bharrachd" +msgstr[1] "%u mhaidse a bharrachd" +msgstr[2] "%u maidsichean a bharrachd" +msgstr[3] "%u maidse a bharrachd" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Duilleag luirg" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "Cha deach aplacaid a lorg" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:834 src/gs-shell.c:839 src/gs-shell.c:854 src/gs-shell.c:858 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:910 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Cha b’ urrainn dhuinn ùrachaidhean a’ bhathair-an-sàs a luchdadh a-nuas o %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:916 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Cha b’ urrainn dhuinn na h-ùrachaidhean a luchdadh a-nuas o %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:923 +msgid "Unable to download updates" +msgstr "Cha b’ urrainn dhuinn na h-ùrachaidhean a luchdadh a-nuas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:928 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "Cha b’ urrainn dhuinn na h-ùrachaidhean a luchdadh a-nuas: bha feum air ceangal dhan eadar-lìon ach cha robh e ri fhaighinn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:937 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Cha b’ urrainn dhuinn na h-ùrachaidhean a luchdadh a-nuas o %s: chan eil àite gu leòr air an diosg" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:942 +msgid "Unable to download updates: not enough disk space" +msgstr "Cha b’ urrainn dhuinn na h-ùrachaidhean a luchdadh a-nuas: chan eil àite gu leòr air an diosg" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:950 +msgid "Unable to download updates: authentication was required" +msgstr "Cha b’ urrainn dhuinn na h-ùrachaidhean a luchdadh a-nuas: bha feum air dearbhadh" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:955 +msgid "Unable to download updates: authentication was invalid" +msgstr "Cha b’ urrainn dhuinn na h-ùrachaidhean a luchdadh a-nuas: cha robh an dearbhadh dligheach" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:960 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Cha b’ urrainn dhuinn na h-ùrachaidhean a luchdadh a-nuas: chan fhaod thu bathar-bog a stàladh" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:967 +msgid "Unable to get list of updates" +msgstr "Cha deach leinn liosta nan ùrachaidhean fhaighinn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1006 +#, c-format +#| msgid "Unable to update %s: authentication was required" +msgid "Unable to purchase %s: authentication was required" +msgstr "Cha b’ urrainn dhuinn %s a cheannach: bha feum air dearbhadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1013 +#, c-format +#| msgid "Unable to update %s: authentication was invalid" +msgid "Unable to purchase %s: authentication was invalid" +msgstr "Cha b’ urrainn dhuinn %s a cheannach: cha robh an dearbhadh dligheach" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1020 +#, c-format +#| msgid "Unable to update %s: not enough disk space" +msgid "Unable to purchase %s: no payment method setup" +msgstr "Cha b’ urrainn dhuinn %s a cheannach: cha deach dòigh pàighidh a shuidheachadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1027 +#, c-format +#| msgid "Unable to update %s: authentication was required" +msgid "Unable to purchase %s: payment was declined" +msgstr "Cha b’ urrainn dhuinn %s a cheannach: chaidh am pàigheadh a dhiùltadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1034 +#, c-format +#| msgid "Unable to update %s" +msgid "Unable to purchase %s" +msgstr "Cha b’ urrainn dhuinn %s a cheannach" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1070 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "Cha b’ urrainn dhuinn %s a stàladh on a dh’fhàillig leis an luchdadh a-nuas o %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1076 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "Cha b’ urrainn dhuinn %s a stàladh on a dh’fhàillig leis an luchdadh a-nuas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1088 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "Cha b’ urrainn dhuinn %s a stàladh air sgàth ’s nach eil %s runtime ri fhaighinn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1094 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "Cha b’ urrainn dhuinn %s a stàladh air sgàth ’s nach cuir sinn taic ris" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1101 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "Cha b’ urrainn dhuinn a stàladh: bha feum air ceangal dhan eadar-lìon ach cha robh e ri fhaighinn" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1107 +msgid "Unable to install: the application has an invalid format" +msgstr "Cha b’ urrainn dhuinn a stàladh: tha fòrmat mì-dligheach air an aplacaid" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1112 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Cha b’ urrainn dhuinn %s a stàladh: chan eil àite gu leòr air an diosg" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1120 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "Cha b’ urrainn dhuinn %s a stàladh: bha feum air dearbhadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1127 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "Cha b’ urrainn dhuinn %s a stàladh: cha robh an dearbhadh dligheach" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1134 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "Cha b’ urrainn dhuinn %s a stàladh: chan fhaod thu bathar-bog a stàladh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the name of the authentication service, +#. * e.g. "Ubuntu One" +#: src/gs-shell.c:1147 +#, c-format +msgid "Your %s account has been suspended." +msgstr "Chaidh an cunntas %s agad a chur à rèim." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1151 +msgid "It is not possible to install software until this has been resolved." +msgstr "Chan urrainn dhut bathar-bog a stàladh mus fhuasgail thu an duilgheadas seo." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the clickable link (e.g. +#. * "http://example.com/what-did-i-do-wrong/") +#: src/gs-shell.c:1162 +#, c-format +msgid "For more information, visit %s." +msgstr "Airson barrachd fiosrachaidh, tadhail air %s." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1171 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "Cha b’ urrainn dhuinn %s a stàladh: tha feum air bun-dealain" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1180 +#, c-format +msgid "Unable to install %s" +msgstr "Cha b’ urrainn dhuinn %s a stàladh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to update %s from %s" +msgstr "Cha b’ urrainn dhuinn %s ùrachadh o %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1232 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "Cha b’ urrainn dhuinn %s ùrachadh on a dh’fhàillig leis an luchdadh a-nuas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1238 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "Cha b’ urrainn dhuinn ùrachadh: bha feum air ceangal dhan eadar-lìon ach cha robh e ri fhaighinn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1246 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Cha b’ urrainn dhuinn %s ùrachadh: chan eil àite gu leòr air an diosg" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1255 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "Cha b’ urrainn dhuinn %s ùrachadh: bha feum air dearbhadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1262 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "Cha b’ urrainn dhuinn %s ùrachadh: cha robh an dearbhadh dligheach" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "Cha b’ urrainn dhuinn %s ùrachadh: chan fhaod thu bathar-bog ùrachadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1277 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "Cha b’ urrainn dhuinn %s ùrachadh: tha feum air bun-dealain" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1286 +#, c-format +msgid "Unable to update %s" +msgstr "Cha b’ urrainn dhuinn %s ùrachadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1331 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Cha b’ urrainn dhuinn àrdachadh gu %s o %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1336 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "Cha b’ urrainn dhuinn àrdachadh gu %s on a dh’fhàillig leis an luchdadh a-nuas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1343 +msgid "Unable to upgrade: internet access was required but wasn’t available" +msgstr "Cha b’ urrainn dhuinn àrdachadh: bha feum air ceangal dhan eadar-lìon ach cha robh e ri fhaighinn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1351 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Cha b’ urrainn dhuinn àrdachadh gu %s: chan eil àite gu leòr air an diosg" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "Cha b’ urrainn dhuinn àrdachadh gu %s: bha feum air dearbhadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "Cha b’ urrainn dhuinn àrdachadh gu %s: cha robh an dearbhadh dligheach" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "Cha b’ urrainn dhuinn àrdachadh gu %s: chan fhaod thu àrdachadh a dhèanamh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1381 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "Cha b’ urrainn dhuinn àrdachadh gu %s: tha feum air bun-dealain" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1390 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Cha b’ urrainn dhuinn àrdachadh gu %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "Cha b’ urrainn dhuinn %s a thoirt air falbh: bha feum air dearbhadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1438 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "Cha b’ urrainn dhuinn %s a thoirt air falbh: cha robh an dearbhadh dligheach" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1444 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "Cha b’ urrainn dhuinn %s a thoirt air falbh: chan fhaod thu bathar-bog a thoirt air falbh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1451 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "Cha b’ urrainn dhuinn %s a thoirt air falbh: tha feum air bun-dealain" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1460 +#, c-format +msgid "Unable to remove %s" +msgstr "Cha b’ urrainn dhuinn %s a thoirt air falbh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1506 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Tha b’ urrainn dhuinn %s a chur gu dol: cha deach %s a stàladh" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1513 src/gs-shell.c:1561 src/gs-shell.c:1609 +msgid "Not enough disk space — free up some space and try again" +msgstr "Chan eil àite gu leòr air an diosga – saoraich beagan àite is feuch ris a-rithist" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1521 src/gs-shell.c:1569 src/gs-shell.c:1636 +msgid "Sorry, something went wrong" +msgstr "Tha sinn duilich ach chaidh rudeigin cearr" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Failed to install file: authentication failed" +msgstr "Cha b’ urrainn dhuinn faidhle a stàladh: dh’fhàillig leis an dearbhadh" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1603 +#, c-format +msgid "Unable to contact %s" +msgstr "Cha b’ urrainn dhuinn conaltradh le %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1618 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "Tha %s feumach air ath-thòiseachadh mus cleachd thu na plugain ùra." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1623 +msgid "This application needs to be restarted to use new plugins." +msgstr "Tha an aplacaid seo feumach air ath-thòiseachadh mus cleachd thu na plugain ùra." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1630 +msgid "AC power is required" +msgstr "Tha feum air bun-dealain" + +#: src/gs-summary-tile.c:80 +#, c-format +msgid "%s (Installing)" +msgstr "%s (’ga stàladh)" + +#: src/gs-summary-tile.c:85 +#, c-format +msgid "%s (Removing)" +msgstr "%s (’ga thoirt air falbh)" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for removing multiple repos +#: src/gs-third-party-repo-row.c:106 +#| msgid "_Remove" +msgid "_Remove All" +msgstr "Thoi_r air falbh na -uile" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:131 +msgid "No update description available." +msgstr "Chan eil tuairisgeul an ùrachaidh ri fhaighinn." + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:226 +#, c-format +msgid "Installed on %s" +msgstr "Chaidh a stàladh %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:246 +msgid "Installed Updates" +msgstr "Ùrachaidhean air an stàladh" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:452 +msgid "Additions" +msgstr "Pacaidean a bharrachd" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:456 +msgid "Removals" +msgstr "Toirt air falbh" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:460 +msgid "Updates" +msgstr "Ùrachaidhean" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:464 +msgid "Downgrades" +msgstr "Ìsleachaidhean" + +#: src/gs-update-dialog.ui:111 +msgid "No updates have been installed on this system." +msgstr "Cha deach ùrachadh sam bith a stàladh air an t-siostam seo." + +#: src/gs-update-monitor.c:93 +msgid "Security Updates Pending" +msgstr "Tha ùrachaidhean tèarainteachd ri an dèiligeadh" + +#: src/gs-update-monitor.c:94 +msgid "It is recommended that you install important updates now" +msgstr "Mholamaid gun stàlaich thu na h-ùrachaidhean cudromach an-dràsta" + +#: src/gs-update-monitor.c:97 +msgid "Restart & Install" +msgstr "Tòisich às ùr ⁊ stàlaich" + +#: src/gs-update-monitor.c:101 +msgid "Software Updates Available" +msgstr "Tha ùrachaidhean bathair-bhog ri am faighinn" + +#: src/gs-update-monitor.c:102 +msgid "Important OS and application updates are ready to be installed" +msgstr "Tha ùrachaidhean cudromach airson an t-siostaim-obrachaidh is nan aplacaidean deiseil gus an stàladh" + +#. TRANSLATORS: button text +#: src/gs-update-monitor.c:105 src/gs-updates-page.c:750 +msgid "Not Now" +msgstr "Chan ann an-dràsta" + +#: src/gs-update-monitor.c:106 +msgid "View" +msgstr "Seall" + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:260 src/gs-updates-page.ui:46 +msgid "Operating System Updates Unavailable" +msgstr "Chan eil ùrachaidhean an t-siostam-obrachaidh ri am faighinn" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:262 +msgid "Upgrade to continue receiving security updates." +msgstr "Àrdaich ach am faigh thu ùrachaidhean tèarainteachd fhathast." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:316 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Tha tionndadh ùr de %s ri fhaighinn airson stàladh" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:320 +msgid "Software Upgrade Available" +msgstr "Tha àrdachadh bathair-bhog ri fhaighinn" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:633 +msgid "Software Updates Failed" +msgstr "Dh’fhàillig le stàladh nan ùrachaidhean" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:635 +msgid "An important OS update failed to be installed." +msgstr "Dh’fhàillig le stàladh ùrachadh cudromach an t-siostam-obrachaidh." + +#: src/gs-update-monitor.c:636 +msgid "Show Details" +msgstr "Seall am mion-fhiosrachadh" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:659 +msgid "System Upgrade Complete" +msgstr "Tha àrdachadh an t-siostaim deiseil" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:664 +#, c-format +#| msgid "Welcome to Software" +msgid "Welcome to %s %s!" +msgstr "Fàilte gu %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:670 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Ùrachadh bathair-bhog air a stàladh" +msgstr[1] "Ùrachaidhean bathair-bhog air an stàladh" +msgstr[2] "Ùrachaidhean bathair-bhog air an stàladh" +msgstr[3] "Ùrachaidhean bathair-bhog air an stàladh" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:674 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "Chaidh ùrachadh cudromach an t-siostaim-obrachaidh a stàladh." +msgstr[1] "Chaidh ùrachaidhean cudromach an t-siostaim-obrachaidh a stàladh." +msgstr[2] "Chaidh ùrachaidhean cudromach an t-siostaim-obrachaidh a stàladh." +msgstr[3] "Chaidh ùrachaidhean cudromach an t-siostaim-obrachaidh a stàladh." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:685 +msgctxt "updates" +msgid "Review" +msgstr "Lèirmheas" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:734 +msgid "Failed To Update" +msgstr "Dh’fhàillig leis an ùrachadh" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:740 +msgid "The system was already up to date." +msgstr "Bha an siostam cho ùr ’s a ghabhas mar-thà." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:745 +msgid "The update was cancelled." +msgstr "Chaidh sgur dhen urachadh." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:751 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "Bha feum air ceangal dhan eadar-lìon ach cha robh e ri fhaighinn. Dèan cinnteach gu bheil inntrigeadh dhan eadar-lìon agad is feuch ris a-rithist." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:757 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "Bha duilgheadasan tèarainteachd ann leis an ùrachadh. Iarr barrachd fiosrachaidh air solaraiche a’ bhathair-bhog agad." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:763 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Cha robh rum gu leòr air an diosga. Saoraich beagan ruim is feuch ris a-rithist." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:768 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "Tha sinn duilich ach cha deach leinn an t-ùrachadh a stàladh. Fuirich gus am bi ùrachadh eile ann is feuch ris a-rithist. Ma bhios an duilgheadas seo ann fhathast an uairsin, cuir fios gu solaraiche a’ bhathair-bhog agad." + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:298 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:301 +msgid "%l:%M %p" +msgstr "%l:%M%p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:307 +msgid "Yesterday, %R" +msgstr "An-dè, %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:311 +msgid "Yesterday, %l:%M %p" +msgstr "An-dè, %l:%M%p" + +#: src/gs-updates-page.c:314 +msgid "Two days ago" +msgstr "A-bhòin-dè" + +#: src/gs-updates-page.c:316 +msgid "Three days ago" +msgstr "Trì làithean air ais" + +#: src/gs-updates-page.c:318 +msgid "Four days ago" +msgstr "Ceithir làithean air ais" + +#: src/gs-updates-page.c:320 +msgid "Five days ago" +msgstr "Còig làithean air ais" + +#: src/gs-updates-page.c:322 +msgid "Six days ago" +msgstr "Sia làithean air ais" + +#: src/gs-updates-page.c:324 +msgid "One week ago" +msgstr "Seachdain air ais" + +#: src/gs-updates-page.c:326 +msgid "Two weeks ago" +msgstr "Dà sheachdain air ais" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-updates-page.c:330 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the updates are being downloaded +#: src/gs-updates-page.c:343 +msgid "Downloading new updates…" +msgstr "A’ luchdadh a-nuas ùrachaidhean ùra…" + +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:347 +msgid "Looking for new updates…" +msgstr "A’ lorg ùrachaidhean ùra…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:414 +msgid "Setting up updates…" +msgstr "A’ suidheachadh nan ùrachaidhean…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:415 src/gs-updates-page.c:422 +msgid "(This could take a while)" +msgstr "(Dh’fhaoidte gun doir seo greis)" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:527 +#, c-format +msgid "Last checked: %s" +msgstr "An sgrùdadh mu dheireadh: %s" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-updates-page.c:746 +msgid "Updates have been installed" +msgstr "Tha na h-ùrachaidhean air an stàladh" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-updates-page.c:748 +msgid "A restart is required for them to take effect." +msgstr "Tha feum air ath-thòiseachadh gus an cur an sàs." + +#. TRANSLATORS: button text +#: src/gs-updates-page.c:752 +msgid "Restart" +msgstr "Tòisich às ùr" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-page.c:822 +msgid "Integrated Firmware" +msgstr "Bathar-an-sàs amalaichte" + +#. TRANSLATORS: This is the button for upgrading all +#. * system firmware +#. TRANSLATORS: This is the button for upgrading all +#. * offline updates +#: src/gs-updates-page.c:825 src/gs-updates-page.c:835 +msgid "Restart & Update" +msgstr "Ath-thòisich ⁊ ùraich" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-page.c:832 +msgid "Requires Restart" +msgstr "Bidh feum air ath-thòiseachadh" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-page.c:842 +msgid "Application Updates" +msgstr "Àrdachaidhean aplacaid" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-page.c:845 +msgid "Update All" +msgstr "Ùraich na h-uile" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-page.c:852 +msgid "Device Firmware" +msgstr "Bathar-an-sàs uidheim" + +#. TRANSLATORS: this is an offline update +#: src/gs-updates-page.c:1041 +msgid "_Restart & Update" +msgstr "Ath-thòisich ⁊ ù_raich" + +#. TRANSLATORS: all updates will be installed +#: src/gs-updates-page.c:1045 +msgid "U_pdate All" +msgstr "Ùraich _na h-uile" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:1132 +#, c-format +msgid "%s %s is no longer supported." +msgstr "Cha chuirear taic ri %s %s tuilleadh." + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:1137 +msgid "Your OS is no longer supported." +msgstr "Cha chuirear taic ris an t-siostam-obrachaidh agad tuilleadh." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:1142 +msgid "This means that it does not receive security updates." +msgstr "Is ciall dha seo nach fhaigh thu ùrachaidhean tèarainteachd tuilleadh." + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:1146 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "Mholamaid gun dèan thu àrdachadh gu tionndadh nas ùire." + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:1403 +msgid "Charges may apply" +msgstr "Dh’fhaoidte gum bi tàillean na lùib" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1407 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "Ma bheir thu sùil airson ùrachaidhean le bann-leathann inneal-làimhe, dh’fhaoidte gun iarrar airgead ort." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:1411 +msgid "Check Anyway" +msgstr "Thoir sùil co-dhiù" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:1427 +msgid "No Network" +msgstr "Chan eil lìonra ann" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1431 +msgid "Internet access is required to check for updates." +msgstr "Tha feum air ceangal dhan eadar-lìon gus sùil a thoirt airson ùrachaidhean." + +#: src/gs-updates-page.c:1836 +msgid "Restart & _Install" +msgstr "Tòisich às ùr ⁊ stàlaich" + +#: src/gs-updates-page.c:1854 +msgid "Check for updates" +msgstr "Thoir sùil airson ùrachaidhean" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Duilleag nan ùrachaidhean" + +#: src/gs-updates-page.ui:194 +msgid "Software is up to date" +msgstr "Tha am bathar-bog cho ùr ’s a ghabhas" + +#: src/gs-updates-page.ui:245 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "Ma bheir thu sùil airson ùrachaidhean le bann-leathann inneal-làimhe, dh’fhaoidte gun iarrar airgead ort" + +#: src/gs-updates-page.ui:257 +msgid "_Check Anyway" +msgstr "Thoir sùil _co-dhiù" + +#: src/gs-updates-page.ui:300 +msgid "Go online to check for updates" +msgstr "Rach air loidhne gus sùil a toirt airson ùrachaidhean" + +#: src/gs-updates-page.ui:311 +msgid "_Network Settings" +msgstr "Roghainnean an lìo_nraidh" + +#: src/gs-updates-page.ui:393 +msgid "Updates are automatically managed" +msgstr "Tha na h-ùrachaidhean gan stiùireadh gu fèin-obrachail" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:85 +#, c-format +msgid "%s %s Now Available" +msgstr "Tha %s %s ri fhaighinn a-nis" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "Downloading %s %s" +msgstr "A’ luchdadh a-nuas %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:106 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "Tha %s %s deiseil airson stàladh" + +#: src/gs-upgrade-banner.ui:32 +msgid "A major upgrade, with new features and added polish." +msgstr "Seo mòr-àrdachadh le gleusan is grinneas ùr." + +#: src/gs-upgrade-banner.ui:52 +msgid "_Learn More" +msgstr "_Barrachd fiosrachaidh" + +#: src/gs-upgrade-banner.ui:98 +msgid "" +"It is recommended that you back up your data and files before upgrading." +msgstr "Mholamaid gun dèan thu lethbhreac-glèidhidh dhen dàta ’s dhe na faidhlichean agad mus dèan thu àrdachadh." + +#: src/gs-upgrade-banner.ui:116 +msgid "_Download" +msgstr "Luch_daich a-nuas" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Cuir ris, thoir air falbh no ùraich bathar-bog air a’ choimpiutair seo" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/org.gnome.Software.desktop.in:6 +#: src/org.gnome.Software.Editor.desktop.in:6 +msgid "org.gnome.Software" +msgstr "org.gnome.Software" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;ùrachadh;ùrachaidhean;ùraich;àrdachadh;àrdaich;tùsan;ionad-tasgaidh;ionadan-tasgaidh;stàlaidh;stàladh;dì-stàlaich;dì-stàladh;prògram;bathar-bog;aplacaid;bùth;" + +#: src/org.gnome.Software.Editor.desktop.in:4 +msgid "Design the featured banners for GNOME Software" +msgstr "Dealbhaich na brataich airson Bathar-bog GNOME brosnaichte" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.Editor.desktop.in:13 +msgid "AppStream;Software;App;" +msgstr "AppStream;Software;App;bathar-bog;aplacaid;" + +#: plugins/core/gs-desktop-common.c:30 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:33 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:36 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Clàradh ⁊ deasachadh fuaime" + +#: plugins/core/gs-desktop-common.c:42 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Cluicheadairean ciùil" + +#: plugins/core/gs-desktop-common.c:51 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:54 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:57 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Dì-bhugadairean" + +#: plugins/core/gs-desktop-common.c:60 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Àrainneachdan leasachaidh co-fhillte" + +#: plugins/core/gs-desktop-common.c:69 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:73 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:77 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Inntinn fhuadain" + +#: plugins/core/gs-desktop-common.c:80 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Reul-eòlas" + +#: plugins/core/gs-desktop-common.c:84 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Ceimigeachd" + +#: plugins/core/gs-desktop-common.c:88 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Cànain" + +#: plugins/core/gs-desktop-common.c:92 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matamataig" + +#: plugins/core/gs-desktop-common.c:99 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotaireachd" + +#: plugins/core/gs-desktop-common.c:108 +msgctxt "Menu of Games" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:111 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:114 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Action" + +#: plugins/core/gs-desktop-common.c:117 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Dàna-thuras" + +#: plugins/core/gs-desktop-common.c:120 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Faoin-chleasan" + +#: plugins/core/gs-desktop-common.c:123 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocaichean" + +#: plugins/core/gs-desktop-common.c:126 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Bòrd" + +#: plugins/core/gs-desktop-common.c:129 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cairt" + +#: plugins/core/gs-desktop-common.c:132 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Aithrisichean" + +#: plugins/core/gs-desktop-common.c:135 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Clann" + +#: plugins/core/gs-desktop-common.c:138 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Loidig" + +#: plugins/core/gs-desktop-common.c:141 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Cluich mas-fhìor" + +#: plugins/core/gs-desktop-common.c:144 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Spòrs" + +#: plugins/core/gs-desktop-common.c:148 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Ro-innleachd" + +#: plugins/core/gs-desktop-common.c:156 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:159 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:162 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Grafaigeachd 3D" + +#: plugins/core/gs-desktop-common.c:165 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Togail dhealbhan" + +#: plugins/core/gs-desktop-common.c:168 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Sganadh" + +#: plugins/core/gs-desktop-common.c:171 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Grafaigeachd vectoran" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Sealladairean" + +#: plugins/core/gs-desktop-common.c:182 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:185 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:188 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Mìosachan" + +#: plugins/core/gs-desktop-common.c:192 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Stòr-dàta" + +#: plugins/core/gs-desktop-common.c:195 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Ionmhas" + +#: plugins/core/gs-desktop-common.c:199 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Pròiseasadh fhaclan" + +#: plugins/core/gs-desktop-common.c:208 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Cruthan-clò" + +#: plugins/core/gs-desktop-common.c:211 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecs" + +#: plugins/core/gs-desktop-common.c:214 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Tùsan ion-chuir" + +#: plugins/core/gs-desktop-common.c:217 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Pacaidean cànain" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Add-ons" +msgid "Shell Extensions" +msgstr "Leudachain slige" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Ionadaileadh" + +#: plugins/core/gs-desktop-common.c:226 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Draibhearan bathair-chruaidh" + +#: plugins/core/gs-desktop-common.c:234 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:237 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:240 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Cabadaich" + +#: plugins/core/gs-desktop-common.c:247 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Naidheachdan" + +#: plugins/core/gs-desktop-common.c:251 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Brabhsairean-lìn" + +#: plugins/core/gs-desktop-common.c:259 +msgctxt "Menu of Utilities" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:262 +msgctxt "Menu of Utilities" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:265 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Deasaichean teacsa" + +#: plugins/core/gs-desktop-common.c:273 +msgctxt "Menu of Reference" +msgid "All" +msgstr "Na h-uile" + +#: plugins/core/gs-desktop-common.c:276 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "Brosnaichte" + +#: plugins/core/gs-desktop-common.c:279 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Ealan" + +#: plugins/core/gs-desktop-common.c:282 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Cruinn-eòlas" + +#: plugins/core/gs-desktop-common.c:285 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Dealbhan-èibhinn" + +#: plugins/core/gs-desktop-common.c:288 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Ficsean" + +#: plugins/core/gs-desktop-common.c:291 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Slàinte" + +#: plugins/core/gs-desktop-common.c:294 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Eachdraidh" + +#: plugins/core/gs-desktop-common.c:297 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Dòigh-bheatha" + +#: plugins/core/gs-desktop-common.c:300 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Poileataigs" + +#: plugins/core/gs-desktop-common.c:303 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Spòrs" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: plugins/core/gs-desktop-common.c:313 +msgid "Audio & Video" +msgstr "Fuaim ⁊ video" + +#. TRANSLATORS: this is the menu spec main category for Development +#: plugins/core/gs-desktop-common.c:316 +msgid "Developer Tools" +msgstr "Innealan leasachaidh" + +#. TRANSLATORS: this is the menu spec main category for Education & Science +#: plugins/core/gs-desktop-common.c:319 +msgid "Education & Science" +msgstr "Foghlam ⁊ saidheans" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:322 +msgid "Games" +msgstr "Geamannan" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: plugins/core/gs-desktop-common.c:325 +msgid "Graphics & Photography" +msgstr "Grafaigeachd ⁊ togail dhealbhan" + +#. TRANSLATORS: this is the menu spec main category for Office +#: plugins/core/gs-desktop-common.c:328 +msgid "Productivity" +msgstr "Dèanadas" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: plugins/core/gs-desktop-common.c:334 +msgid "Communication & News" +msgstr "Conaltradh ⁊ naidheachdan" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:337 +msgid "Reference" +msgstr "Iomradh" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:340 +msgid "Utilities" +msgstr "Goireasan" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:71 +msgid "OS Updates" +msgstr "Ùrachaidhean an t-siostaim-obrachaidh" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:76 +msgid "Includes performance, stability and security improvements." +msgstr "Gabhaidh seo a-steach piseach air an dèanadas, an t-seasmhachd agus an tèarainteachd." + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:55 +msgid "Downloading featured images…" +msgstr "A’ luchdadh a-nuas dealbhan brosnaichte…" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Taic ri aplacaidean-lìn" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Ruith aplacaidean-lìn mòr-còrdte am broinn brabhsair" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:112 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Inneal Bathair-bog GNOME airson AppStream a stàladh air feadh an t-siostaim" + +#: plugins/external-appstream/gs-install-appstream.c:114 +msgid "Failed to parse command line arguments" +msgstr "Cha b’ urrainn dhuinn argamaidean na loidhne-àithne a pharsadh" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:121 +msgid "You need to specify exactly one filename" +msgstr "Feumaidh tu aon ainm-fhaidhle a shònrachadh" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:128 +msgid "This program can only be used by the root user" +msgstr "Chan fhaod ach an chleachdaiche root am prògram seo a chleachdadh" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:136 +msgid "Failed to validate content type" +msgstr "Cha deach leinn seòrsa na susbainte a dhearbhadh" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:143 +msgid "Failed to copy" +msgstr "Cha deach leinn lethbhreac dheth a dhèanamh" + +#. TRANSLATORS: status text when downloading +#: plugins/external-appstream/gs-plugin-external-appstream.c:243 +msgid "Downloading extra metadata files…" +msgstr "A’ luchdadh a-nuas barrachd fhaidhlichean meata-dàta…" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:217 +msgid "Downloading upgrade information…" +msgstr "A’ luchdadh a-nuas fiosrachadh an àrdachaidh…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:311 +msgid "Upgrade your Fedora system to the latest features and improvements." +msgstr "Àrdaich an siostam Fedora agad ach am faigh thu na gleusan is leasachaidhean as ùire." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Taic ri Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "’S e frèam-obrach a th’ ann am Flatpak airson aplacaidean deasga air Linux" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:607 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "A’ faighinn meata-dàta a’ flatpak airson %s…" + +#. TRANSLATORS: status text when downloading the RuntimeRepo +#: plugins/flatpak/gs-flatpak.c:2773 +msgid "Getting runtime source…" +msgstr "A’ faighinn tùs an runtime…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:695 +msgid "Downloading firmware update signature…" +msgstr "A’ luchdadh a-nuas soidhneadh an ùrachaidh air bathar-an-sàs…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:736 +msgid "Downloading firmware update metadata…" +msgstr "A’ luchdadh a-nuas meata-dàta an ùrachaidh air bathar-an-sàs…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:826 +msgid "Downloading firmware update…" +msgstr "A’ luchdadh a-nuas ùrachadh air bathar-an-sàs…" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Taic ri àrdachadh bathair-an-sàs" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Bheir seo dhut taic ri àrdachaidhean bathair-an-sàs" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:6 +msgid "Limba Support" +msgstr "Taic ri Limba" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:7 +msgid "Limba provides developers a way to easily create software bundles" +msgstr "Bheir Limba dòigh furasta dhan luchd-leasachaidh gus trusgain bathair-bhog a chruthachadh" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:205 +msgid "Downloading application ratings…" +msgstr "A’ luchdadh a-nuas rangachaidhean nan aplacaid…" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "Taic ri rangachaidhean deasga fosgailte" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "’S e seirbheis a’ th’ ann an ODRS a bheir dhut lèirmheasan an luchd-cleachdaidh air aplacaidean" + +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:392 +#| msgctxt "Menu of Add-ons" +#| msgid "Shell Extensions" +msgid "GNOME Shell Extensions Repository" +msgstr "Ionad-tasgaidh leudachan slige GNOME" + +#. TRANSLATORS: status text when downloading +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:709 +msgid "Downloading shell extension metadata…" +msgstr "A’ luchdadh a-nuas meata-dàta an leudachain slige…" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:211 +#| msgid "Snappy Support" +msgid "Snap Store" +msgstr "Taic ri bùth Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snappy Support" +msgstr "Taic ri Snappy" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "’S e pacaid Linux uile-choitcheann a th’ ann an snap" + +#. TRANSLATORS: status text when downloading +#: plugins/steam/gs-plugin-steam.c:600 +msgid "Downloading application page…" +msgstr "A’ luchdadh a-nuas duilleag aplacaid…" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:6 +msgid "Steam Support" +msgstr "Taic ri Steam" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:7 +msgid "The ultimate entertainment platform from Valve" +msgstr "Ùrlar dibhearsain le Valve" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Liosta dhe na tùsan a bharrachd a chaidh a chur an comas roimhe" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "An liosta dhe na tùsan a chaidh a chur an comas roimhe le stàladh " +#~ "aplacaid treas-phartaidh." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Seall bathar-bog nach eil saor ann an toraidhean luirg" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "" +#~ "Liosta dhe na tùsan nach eil saor a ghabhas cur an comas gu roghainneil" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Gnìomhan ro-shocraichte eadar cluicheadairean gun gleus cabadaich" + +#~ msgid "" +#~ "Provides access to additional software, including web browsers and games." +#~ msgstr "" +#~ "Bheir seo inntrigeadh dha bharrachd bathair-bhog dhut, a’ gabhail a-" +#~ "steach brabhsairean-lìn is geamannan." + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "A bheil thu airson tùsan bathair-bhog fo sheilbh a chur an comas?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Cha dèid aplacaidean no tuilleadain a stàladh ach dh’fhaoidte gun dèid " +#~ "bathar-bog eile" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "" +#~ "Tha cuingeachaidhean cleachdaidh air agus chan fhaigh thu am bun-tùs mar " +#~ "as trice." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Tùsan bathair-bhog fo sheilbh" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Gabhaidh tùsan bathair-bhog a luchdadh a-nuas on eadar-lìon. Bheir iad " +#~ "inntrigeadh dhut dha barrachd bathair-bhog nach doir %s dhut." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Nuair a bheir thu tùs air falbh, bheir seo bathar-bog sam bith a stàlaich " +#~ "thu leis air falbh cuideachd." + +#~ msgid "No software installed from this source" +#~ msgstr "Cha deach bathar-bog a stàladh on tùs seo" + +#~ msgid "Installed from this Source" +#~ msgstr "Air a stàladh on tùs seo" + +#~ msgid "Source Details" +#~ msgstr "Mion-fhiosrachadh mun tùs" + +#~ msgid "Last Checked" +#~ msgstr "An sgrùdadh mu dheireadh" + +#~ msgid "Added" +#~ msgstr "Chaidh a chur ris" + +#~ msgid "Website" +#~ msgstr "Làrach-lìn" + +#~ msgid "About Software" +#~ msgstr "Mu bhathar-bog" + +#~ msgid "Total" +#~ msgstr "Iomlan" + +#~ msgid "Could not find '%s'" +#~ msgstr "Cha deach leinn \"%s\" a lorg" + +#~ msgid "_Install All" +#~ msgstr "_Stàlaich na h-uile" + +#~ msgid "Other Updates" +#~ msgstr "Ùrachaidhean eile" + +#~ msgid "Remove Source" +#~ msgstr "Thoir an tùs air falbh" + +#~ msgid "Installation of %s failed." +#~ msgstr "Cha deach leinn %s a stàladh." + +#~ msgid "Removal of %s failed." +#~ msgstr "Cha deach leinn %s a thoirt air falbh." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "" +#~ "Dèan cinnteach gu bheil inntrigeadh dhan eadar-lìon agad is feuch ris a-" +#~ "rithist." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Saoraich beagan ruim is feuch ris a-rithist." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "" +#~ "Ma mhaireas an duilgheadas, cuir fios gu solaraiche a' bhathair-bhog agad." + +#~ msgctxt "content rating violence-cartoon" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Na h-uile" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Brosnaichte" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Na h-uile" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Brosnaichte" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Na h-uile" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Brosnaichte" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Na h-uile" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Brosnaichte" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Na h-uile" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Brosnaichte" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Na h-uile" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Brosnaichte" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Reul-eòlas" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Ceimigeachd" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matamataig" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Na h-uile" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Brosnaichte" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Na h-uile" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Brosnaichte" + +#~ msgid "Science" +#~ msgstr "Saidheans" + +#~ msgid "3rd party" +#~ msgstr "Treas-phartaidh" + +#~ msgid "web app" +#~ msgstr "aplacaid-lìn" + +#~ msgid "nonfree" +#~ msgstr "chan eil e saor" + +#~ msgid "shell extension" +#~ msgstr "leudachain shell" + +#~ msgid "page0" +#~ msgstr "duilleag0" + +#~ msgid "page1" +#~ msgstr "duilleag1" + +#~ msgid "_Installing" +#~ msgstr "'Ga _stàladh" + +#~ msgid "_Removing" +#~ msgstr "'Ga thoi_rt air falbh" + +#~ msgid " or " +#~ msgstr " no " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Chan eil fhios" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Tha am bathar-bog seo 'ga sholar le treas-phartaidh." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Tha am bathar-bog seo 'ga sholar le treas-phartaidh agus dh'fhaoidte nach " +#~ "eil gach co-phàirt aige saor." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Dh'fhaoidte nach eil gach co-phàirt aig a' bhathar-bhog seo saor." + +#~ msgid "non-free" +#~ msgstr "chan eil e saor" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "" +#~ "Bheir tùsan bathair-bhog inntrigeadh dhut dha barrachd bathair-bhog." + +#~ msgid "One Star" +#~ msgstr "Aon rionnag" + +#~ msgid "Two Stars" +#~ msgstr "Dà rionnag" + +#~ msgid "Three Stars" +#~ msgstr "Trì rionnagan" + +#~ msgid "Four Stars" +#~ msgstr "Ceithir rionnagan" + +#~ msgid "Five Stars" +#~ msgstr "Còig rionnagan" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "Chan eil gin" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Aplacaidean oifis a mholamaid" + +#~ msgid "Audio" +#~ msgstr "Fuaim" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Deasachadh" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Stòir-dhàta" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Losgadh dhiosgan" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Rèidio neo-dhreuchdail" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Measgadair" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Ceòl" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Innealan-clàraidh" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Sequencers" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Tiùnairean" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Togail" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Stòir-dhàta" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Pròifileadh" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "Stiùireadh phròiseactan" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Revision Control" +#~ msgstr "Stiùireadh thionndaidhean" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Translation" +#~ msgstr "Eadar-theangachadh" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Leasachadh-lìn" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Bith-eòlas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Coimpiutaireachd" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Construction" +#~ msgstr "Togail" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Sealladh dàta" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Eaconamaidh" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Dealan" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Leactronachd" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Einnseanaireachd" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geòlas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Eòlas na talmhainn" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Eachdraidh" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Humanities" +#~ msgstr "Daonnachd" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Pròiseasadh dhealbhan" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Litreachas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Mapaichean" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Medical" +#~ msgstr "Leigheas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Ceòl" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Sgrùdadh àireamhan" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Coimpiutaireachd cho-shìnteach" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fiosaigeachd" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Spioradalachd" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Tilgeadh" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Mas-fhìorachd" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Spòrs" + +#~ msgid "Graphics" +#~ msgstr "Grafaigeachd" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "Grafaigeachd 2D" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "Aithneachadh lèirsinneach litrichean" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Foillseachadh" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Grafaigeachd phiogsailean" + +#~ msgid "Internet" +#~ msgstr "Eadar-lìon" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Dialup" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Post-d" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Inbhir" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Tar-chur fhaidhlichean" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Rèidio neo-dhreuchdail" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Grad-theachdaireachdan" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "Cliantan IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Monatair" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Remote Access" +#~ msgstr "Inntrigeadh cèin" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Fònadaireachd" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Leasachadh-lìn" + +#~ msgid "Office" +#~ msgstr "Oifis" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Cairt" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Stiùireadh luchd-aithne" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Faclair" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Post-d" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Cairt-srutha" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "Cuidiche pearsanta" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Togail dhealbhan" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Presentation" +#~ msgstr "Taisbeanadh" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Stiùireadh phròiseactan" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Foillseachadh" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Cliath-dhuilleag" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Sealladair" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Ealan" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Inntinnean fuadain" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Reul-eòlas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Bith-eòlas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Ceimigeachd" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Coimpiutaireachd" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Togail" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Sealladh dàta" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Eaconamaidh" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Dealan" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Leactronachd" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Einnseanaireachd" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Cruinn-eòlas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geòlas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Eòlas na talmhainn" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Eachdraidh" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Daonnachd" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Pròiseasadh dhealbhan" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Cànain" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Litreachas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Mapaichean" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matamataig" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Leigheas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Sgrùdadh àireamhan" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Coimpiutaireachd cho-shìnteach" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fiosaigeachd" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotaireachd" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Spioradalachd" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Spòrs" + +#~ msgid "System" +#~ msgstr "Siostam" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Aithrisiche" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Manaidsear fhaidhlichean" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File System" +#~ msgstr "Siostam fhaidhlichean" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Innealan faidhle" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Monatair" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Tèarainteachd" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Aithrisiche tèirmineil" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "So-ruigsinneachd" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Tasg-lannan" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Àireamhair" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Cleoc" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Dùmhlachadh" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Innealan faidhle" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Mapaichean" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Spioradalachd" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Innealan fònadaireachd" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Deasachadh" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Stòr-dàta" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Losgadh dhiosgan" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Players" +#~ msgstr "Cluicheadairean" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Innealan-clàraidh" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TBh" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "'Ga àireamhachadh…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Chan eil fhios" + +#~ msgid "Size" +#~ msgstr "Meud" + +#~ msgid "_History" +#~ msgstr "_Eachdraidh" + +#~ msgid "Open Source" +#~ msgstr "Còd fosgailte" + +#~ msgid "An update is needed to show all installable apps. Download now?" +#~ msgstr "" +#~ "Tha feum air ùrachadh gus a h-uile aplacaid a ghabhas stàladh a " +#~ "shealltainn. A bheil thu airson a luchdadh a-nuas an-dràsta?" + +#~ msgid "Ubuntu Software" +#~ msgstr "Bathar-bog Ubuntu" + +#~ msgid "No AppStream data found" +#~ msgstr "Cha deach dàta AppStream a lorg" + +#~ msgid "Incorrect email or password" +#~ msgstr "Chan eil am post-d no am facal-faire mar bu chòir" + +#~ msgid "Account deactivated" +#~ msgstr "Chaidh an cunntas a chur à gnìomh" + +#~ msgid "Email invalidated" +#~ msgstr "Chaidh am post-d a dhèanamh mì-dhligheach" + +#~ msgid "Too many requests" +#~ msgstr "Cus iarrtasan" + +#~ msgid "An error occurred" +#~ msgstr "Thachair mearachd" + +#~ msgid "Signing in…" +#~ msgstr "'Gad chlàradh a-steach…" + +#~ msgid "" +#~ "To rate and review software, you need an Ubuntu Single Sign-On account." +#~ msgstr "" +#~ "Gus bathar-bog a rangachadh is lèirmheas a dhèanamh air, feumaidh tu " +#~ "cunntas Ubuntu a chum clàradh a-steach le aon chunntas fhaighinn." + +#~ msgid "I have an Ubuntu Single Sign-On account" +#~ msgstr "Tha cunntas Ubuntu a chum clàradh a-steach le aon chunntas agam" + +#~ msgid "One-time password:" +#~ msgstr "Facal-faire aon turais:" + +#~ msgid "You are now signed into Ubuntu One." +#~ msgstr "Chaidh do chlàradh a-steach dha dh'Ubuntu One." diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..ca03915 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,6373 @@ +# Galician translations for PACKAGE package. +# Copyright (C) 2013 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Fran Diéguez , 2013-2022. +# Fran Dieguez , 2013-2023. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-26 14:22+0000\n" +"PO-Revision-Date: 2025-02-28 12:44+0100\n" +"Last-Translator: Fran Dieguez \n" +"Language-Team: Galician \n" +"Language: gl\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-DL-Branch: main\n" +"X-DL-Domain: po\n" +"X-DL-Module: gnome-software\n" +"X-DL-State: None\n" +"X-DL-Team: gl\n" +"X-Generator: Poedit 3.5\n" +"X-Project-Style: gnome\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instale e actualice aplicacións" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "Software allows you to find and install new apps and system extensions and remove existing installed apps." +msgstr "Software permítelle atopar e instalar novas aplicacións e extensións do sistema, así como eliminar aplicacións instaladas actualmente." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and multiple screenshots per app. Apps can be found either through " +"browsing the list of categories or by searching. It also allows you to update your system using an offline update." +msgstr "" +"Software móstralle aplicacións populares e destacados con descricións útiles e varias capturas por aplicación. Pode atopar aplicacións " +"explorando a lista de categorías ou buscándoas. Tamén lle permite actualizar o seu sistema usando unha actualización fóra de liña." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Páxina de vista xeral" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Páxina de detalles" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Páxina de instalados" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel de actualizacións" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Os detalles da actualización" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "O Proxecto GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Proba a chave de akmods en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Requírese a autenticación para probar a clave akmods en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Inscribir a chave de Akmods para Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Requíresxe autenticación para inscribir a chave de akmods para Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Proba a clave de DKMS en Shim uefi" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Requírese a autenticación para probar a clave de DKMS en Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Inscribir a chave de DKMS para Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Requírese autenticación para inscribir a chave de DKMS para Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalar un ficheiro «appstream» na localización do sistema" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instalando un ficheiro «appstream» na localización do sistema" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Unha lista de proxectos compatíbeis" + +#: data/org.gnome.software.gschema.xml:6 +msgid "This is a list of compatible projects we should show such as GNOME, KDE and XFCE." +msgstr "Esta é a lista de proxectos compatíbeis que deberíamos mostrar como GNOME, KDE e XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Indica se se xestionan ou non as actualizacións e anovacións en GNOME Software" + +#: data/org.gnome.software.gschema.xml:11 +msgid "If disabled, GNOME Software will hide the updates panel, not perform any automatic updates actions or prompt for upgrades." +msgstr "" +"Se esta desactivado, GNOME Software ocultará o panel de actualizacións, non levará a cabo ningunha actualización automática ou solicitará " +"anovacións." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Descargar e instalar automaticamente as anovacións" + +#: data/org.gnome.software.gschema.xml:16 +msgid "If enabled, GNOME Software automatically downloads software updates in the background, also installing ones that do not require a reboot." +msgstr "" +"Se está activado, GNOME Software descargará automaticamente as actualizacións en segundo plano e instalará aquelas que non precisen reiniciar." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notificar ao usuario sobre o software actualizado en segundo plano" + +#: data/org.gnome.software.gschema.xml:21 +msgid "If enabled, GNOME Software notifies the user about updates that happened whilst the user was idle." +msgstr "Se está activo, GNOME Software notificará ao usuario sobre as actualizacións que se leven a cabo mentres o usuario está inactivo." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Indica se se refresca automaticamente ao usar unha conexión medida" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Se está activo, GNOME Software refrescará automaticamente en segundo plano incluso ao usar unha conexión medida (eventualmente descargando " +"algúns metadatos, comprobación de anovacións, etc., o que pode acarrexar custos para o usuario)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Indica se é a primeira vez que executa GNOME Software" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Mostrar as puntuacións con estrelas ao carón das aplicacións" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtrar aplicacións baseándose na rama por defecto estabelecida polo remoto" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "As aplicacións non libres mostran un diálogo de aviso antes de instalarse" + +#: data/org.gnome.software.gschema.xml:43 +msgid "When non-free applications are installed a warning dialog can be shown. This controls if that dialog is suppressed." +msgstr "Cando se instalan aplicacións non libres mostrarase un diálogo de aviso. Isto controla se o diálogo se elimina." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "O «timestamp» da última comprobación de actualizacións" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "A «marca de tempo» da última notificación de anovación" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "A «marca de tempo» da última notificación de anovación" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "O «timestamp» da primeira actualización de seguranza, limpado despois de actualizar" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "O «timestamp» da última actualización" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "A idade en segundos para verificar se a captura de pantalla oficial segue sendo válida" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but updates to the screenshots may take longer to show to the user. A " +"value of 0 means to never check the server if the image already exists in the cache." +msgstr "" +"Elixir un valor máis grande implica menos consultas ao servidor remoto, pero as actualizacións das capturas de pantalla poden tardar máis en " +"mostrárselle ao usuario. O valor 0 implica non comprobar nunca o servidor remoto se a imaxe xa existe na caché." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "O servidor a usar para as revisións de aplicacións" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "A puntuación mínima de karma para as revisións" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "As revisións cun karma menor que este número non se mostrarán." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Unha lista de repositorios oficiais que non se deberían considerar terceiros" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Unha lista de repositorios requiridos que non se deberían desactivar ou eliminar" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Unha lista de repositorios oficiais que se deberían considerar software libre" + +#: data/org.gnome.software.gschema.xml:98 +msgid "The licence URL to use when an application should be considered free software" +msgstr "A URL da licenza a usar cando a aplicación se considera software libre" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Instalar aplicacións empaquetadas para todos os usuarios no sistema cando sexa posíbel" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Permitir o acceso ao diálogo de Repositorios de software" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Ofrecer anovacións para pre-publicacións" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Mostrar algúns elementos da IU que lle informan ao usuario que unha aplicación non é libre" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Mostrar o tamaño de instalación para as aplicacións na lista de aplicacións instaladas" + +#. Translators: Replace the link with a version in your language, e.g. +#. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include +#. ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://gl.wikipedia.org/wiki/Software_privativo'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "O URI que explica o software non libre e privativo" + +#: data/org.gnome.software.gschema.xml:127 +msgid "A list of URLs pointing to appstream files that will be downloaded into an swcatalog folder" +msgstr "Unha lista de URLs que apuntan a ficheiros «appstream» que se descargarán nun cartafol swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instalar un ficheiro de Appstream nunha localización do sistema para todos os usuarios. Se é falso, os ficheiros instalaranse no cartafol non " +"estándar $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats listed first. An empty array means the default order. Omitted formats " +"are assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, snap. The formats can be optionally specified with an origin " +"name, divided by a colon, for example 'flatpak:flathub'." +msgstr "" +"Preferencia da orde de prioridade dos formatos de empaquetado, sendo os primeiros da lista os formatos máis importantes. Unha lista baleira " +"significa que se usará a orde predeterminada. Os formatos omitidos asúmense como incluídos ao final. Os formatos de empaquetado de exemplo son: " +"deb, flatpak, rpm, snap. Os formatos poden especificarse de forma opcional co un nome de orixe, divididos por dous puntos, por exemplo: «flatpak:" +"flathub»." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "A marca de tempo do último intento de eliminar os «runtimes» de Flatpak non usados" + +#: data/org.gnome.software.gschema.xml:143 +msgid "Set to 'true' to show only freely licensed apps and hide any proprietary apps." +msgstr "Estabeleza a «verdadeiro» para mostrar só as aplicacións con licencia libre e ocultar calquera aplicación privativa." + +#: data/org.gnome.software.gschema.xml:147 +msgid "Set to 'true' to show only apps from developers whose identity has been verified." +msgstr "Estabeleza a «verdadeiro» para mostrar só as aplicacións de desenvolvedores cuxa identidade foi verificada." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "A marca de tempo das últimas actualizacións históricas recibidas." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Unha cadea que almacena o id de gnome-online-account usando para iniciar sesión" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Instalador de Appstream en todo o sistema de GNOME Software" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Produciuse un fallo ao analizar as opcións da liña de ordes" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Debe especificar exactamente un nome de ficheiro" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Este programa só pose ser usado polo usuario «root»" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Produciuse un fallo ao validar o tipo de contido: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Produciuse un erro ao mover: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalar software" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instala o software seleccionado no seu sistema" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violencia con personaxes animados" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Non hai información sobre a violencia en debuxos" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violencia fantástica" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Non hai información de violencia fantástica" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violencia realista" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Non hai información sobre violencia realística" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violencia mostrando derramamento de sangue" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Non hai información sobre matanza" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violencia sexual" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Non hai información sobre violencia sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcohol" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Non hai información sobre referencias a alcohólicas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narcóticos" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Non hai información sobre referencias a drogas ilegais" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabaco" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Non hai información sobre referencias a produtos de tabaco" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Desnudez" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Non hai información sobre desnudos de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Temas sexuais" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Non hai información sobre representacións ou referencias de natureza sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Profanidade" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Non hai información sobre referencias a blasfemia de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Humor non axeitado" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Non hai información sobre humor non axeitado" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminación" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Non hai información sobre lingüaxe discriminatorio de calqueira tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Publicidade" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Non hai información sobre publicidade de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Xogo de azar" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Non hai información sobre apostas de ningún tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Compra" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Non hai información sobre a posibilidade de gastar diñeiro" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Conversa entre usuarios" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Non hai información sobre formas de chatear con outros usuarios" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Chat de audio entre usuarios" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Non hai información sobre formas de falar con outros usuarios" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detalles de contacto" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "No information regarding sharing of social network usernames or email addresses" +msgstr "Non hai información sobre a compartición das redes socaiais de nomes de usuario ou enderezos de correo-e" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identificando información" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Non hai información sobre compartir a información do usuario con terceiros" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Compartición de localización" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Non hai información sobre compartir a localización física con outros usuarios" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualidade" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Non hai información sobre referencias a homosexualidade" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitución" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Non hai información sobre referencias a prostitución" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adulterio" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Non hai información sobre referencias ao adulterio" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Personaxes sexualizados" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Non hai información sobre personaxes sexualizados" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanación" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Non hai informacioń sobre referencias á profanación" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Restos humanos" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Non hai información sobre restos humanos mortos visíbeis" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Escravitude" + +#. TRANSLATORS: content rating description, see +#. https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Non hai información sobre referencias á escravitude" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "No inclúe referencias a drogas" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "Does not include swearing, profanity, and other kinds of strong language" +msgstr "Non inclúe insultos, blasfemias e outros tipos de linguaxe forte" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Non inclúe anuncios nin transaccións monetarias" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Non inclúe sexo ou desnudez" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Non inclúse funcionalidade de chat sen controlar" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Non inclúe violencia" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogas" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Lingüaxe forte" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Diñeiro" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violencia" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of +#. people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Todas" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s ten unha clasificación de idade descoñecida" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s é axeitado para todos" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s é axeitado para nenos pequenos" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s é axeitado para nenos xoves" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s é axeitado para nenos" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s é axeitado para adolescentes" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s é axeitado para adultos" + +#. Translators: This is a dialogue title which indicates that an app is +#. suitable +#. * for a specified age group. The first placeholder is the app name, the +#. second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s é axeitado para %s" + +#. Translators: This is the title of the dialog which contains information +#. about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Cualificación por idade" + +#: src/gs-age-rating-context-dialog.ui:61 src/gs-hardware-support-context-dialog.ui:63 src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Como contribuír con información que falta" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Ficheiro local" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app +#. (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paquete" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Pendente" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Instalación pendente" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Retirado pendente" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Instalando" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Retirando" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Descargando" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 src/gs-details-page.c:1091 src/gs-details-page.ui:203 +#: src/gs-page.c:425 plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instalar" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Desinstalar…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Rede" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Pode comunicarse pola rede" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Servizos do sistema" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Pode acceder ao servizos D-Bus no bus do sistema" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Servizos da sesión" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Pode acceder aos servizos de D-Bus no bus de sesión" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Dispositivos" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Pode acceder a dispositivos arbitrarios como cámaras web" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Pode acceder aos dispositivos de entrada" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Pode acceder aos micrófonos e reproducir audio" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Pode acceder aos ficheiros do dispositivo do sistema" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Contidos da xanela" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Pode acceder aos contidos da xanela" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Cartafol persoal" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Pode ver, editar e crear ficheiros" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Pode ver ficheiros" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistema de ficheiros" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with +#. actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Cartafol de descargas" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Configuracións" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Pode ver e cambiar calquera preferencia" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistema de pantalla antigo" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Usa un sistema de pantalla antigo e inseguro" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Saír do illamento" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Pode escapar da caixa de area e saltar calquera outra restrición" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Non hai unha descrición dispoñíbel." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Información da actualización" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Require permisos adicionais" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Datos de clasificación non válidos recibidos desde o servidor" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Non foi posíbel comunicar co servidor de revisións" + +#. Translators: Header of the section with other users' opinions about the +#. app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Revisións" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Non se atoparon revisións para esta aplicación." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Non hai revisións" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Historial de versións" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novo na versión %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versión %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Non hai detalles para esta publicación" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e de %B de %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Modo de inicio: elixa entre «updates», «updated », «installed» ou «overview»" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODO" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Buscar aplicacións" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "BUSCAR" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Mostrar información da aplicación (usando o ID da aplicación)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Mostrar información da aplicación (usando o nome do paquete)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instalar a aplicación (usando o ID da aplicación)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Desinstalar a aplicación (usando o ID da aplicación)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Abrir ficheiro de paquete local" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NOME_DE_FICHEIRO" + +#: src/gs-application.c:138 +msgid "The kind of interaction expected for this action: either ‘none’, ‘notify’, or ‘full’" +msgstr "O tipo de interacción esperada para esta acción: pode ser «none», «notify» ou «full»" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACCIÓN" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Mostrar o ficheiro local de metainformación ou appdata" + +#: src/gs-application.c:143 +msgid "Enable verbose debugging output (from the running instance, if already running)" +msgstr "Activar a saída de depuración verbosa (desde a instancia en execución, se xa está en execución)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instala calquera actualización pendente en segundo plano" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Mostrar as preferencias" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Saír da instancia en execución" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferir orixes de ficheiros locais a AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Mostrar o número de versión" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 Contribuíntes de GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Fran Diéguez , 2013-2025" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Desculpe! Non hai detalles para esta aplicación." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Tamaño instalado" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inclúe %s de data e %s de caché" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inclúe %s de data" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inclúe %s de caché" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Uso de caché e datos non coñecido" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Tamaño da descarga" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Non precisa descargas do sistema adicionais" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Precisa un tamaño descoñecido de descargas do sistema adicional" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Precisa %s de descargas do sistema adicionais" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Tamaño descoñecido" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Sen permisos" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Ten acceso á rede" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Usa os servizos do sistema" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Usa os servizos da sesión" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Pode acceder ao hardware do sistema" + +#. Translators: This indicates an app can access system devices such as +#. /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Pode acceder aos dispositivos do sistema" + +#. Translators: This indicates an app can read/write to the user’s home or the +#. entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Pode ler/escribir todos os seus datos" + +#. Translators: This indicates an app can read (but not write) from the user’s +#. home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Pode ler todos os seus datos" + +#. Translators: This indicates an app can read/write to the user’s Downloads +#. directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Pode ler/escribir nas súas descargas" + +#. Translators: This indicates an app can read (but not write) from the user’s +#. Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Pode ler as súas descargas" + +#. Translators: This indicates an app can access data in the system unknown to +#. the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Pode acceder a algúns ficheiros específicos" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Pode ver e cambiar calquera preferencia de usuario" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Usa un sistema de xanelas antigo" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Pode adquirir permisos arbitrarios" + +#. Translators: This indicates an app was written and released by a developer +#. who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "O desenvolvedor do software está verificado" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Revisado polo distribuidor do seu SO" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Revisado por %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Fornecido por un terceiro" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Software xa non é compatíbel" + +#. Translators: This indicates an app’s source code is freely available, so +#. can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Código auditábel" + +#. Translators: This indicates an app does not specify which license it's +#. developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Licenza descoñecida" + +#. Translators: This indicates an app is not licensed under a free software +#. license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Código privativo" + +#. Translators: This indicates an app is not licensed under a free software +#. license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Licenza especial" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between +#. users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the +#. distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privilexiado" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Segura" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Probablemente seguro" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potencialmente insegura" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Insegura" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Móbil só" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Só funciona nunha pantalla pequena" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 src/gs-app-context-bar.c:749 +#: src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Escritorio só" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Só funciona en pantallas grandes" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Discordancia do tamaño de pantalal" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Non admite o seu tamaño de pantalla actual" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Require unha pantalla táctil" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Require un teclado" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Require un rato" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Precisa mando de xogos" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Require un mando de xogo para xogar" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptativo" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Funciona en teléfonos, tabletas e escritorios" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Probabelmente require un teclado ou rato" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Funciona en computadoras de sobremesa e portátiles" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Contén contido non axeitado á idade" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Non hai información de cualificación por idade dispoñíbel" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visitar sitio web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instalar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Cancelar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instalar" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Descargar" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Actualizar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Desinstalar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Desinstalando" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Actualización crítica" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "O dispositivo non se pode usar durante a actualización." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Orixe: %s" + +#. Translators: A message to indicate that an app has been renamed. The +#. placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Renomeado desde %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Deteuse a recepción de actualizacións" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Actualización crítica" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalado" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Axuda a traducir %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get involved and help translate it yourself." +msgstr "" +"%s está deseñado, desenvolto e traducido por unha comunidade internacional de voluntarios.\n" +"\n" +"Isto significa que aínda que non está dispoñíbel no seu idioma pode involucrarse e axudar facéndoo vostede." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traducións" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Sitio web de _tradución" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Inicio de sesión remoto para %s requirido (reino %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Inicio de sesión requirido" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Cancelar" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Iniciar sesión" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Usuario" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Contrasinal" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Outro" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Todas" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Destacado" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured +#. ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Seleccións dos editores" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently +#. released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Novo e actualizado" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Selección desde a Web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Outro software" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s instalados" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Debe reiniciar para que os cambios se apliquen" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "A aplicación está lista para usarse" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Actualizacións do sistema instaladas" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "As actualizacións instaladas recentemente están dispoñíbeis para a súa revisión" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Reiniciar" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Iniciar" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Desexa instalar o software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Desexa instalar software de terceiros?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Desexa activar os Repositorios de software de terceiros?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Desexa activar os Repositorios de software de terceiros?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s non é software libre e de fontes abertas, e é fornecido por «%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s é fornecido por «%s»." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Este repositorios de software debe activarse para continuar a instalación." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "A instalación ou uso de %s podería ser ilegal nalgúns países." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "A instalación ou uso deste códec podería ser ilegal nalgúns países." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Non _advertir de novo" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Activar e _instalar" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Lista detallada dos erros do xestor de paquetes:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detalles" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Pechar" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Detalles copiados no portapapeis" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Aceptar" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Instalouse unha actualización" +msgstr[1] "Instaláronse as actualizacións" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Desinstalouse unha aplicación" +msgstr[1] "Desinstaláronse unha aplicación" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Debe reiniciar para aplicar os cambios" +msgstr[1] "Debe reiniciar para aplicar os cambios" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Agora non" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Hoxe" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days +#. ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Onte" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Hai %d día" +msgstr[1] "Hai %d días" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Hai %d semana" +msgstr[1] "Hai %d semanas" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Hai %d mes" +msgstr[1] "Hai %d meses" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Hai %d ano" +msgstr[1] "Hai %d anos" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Agora mesmo" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Hai %d minuto" +msgstr[1] "Hai %d minutos" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Hai %d hora" +msgstr[1] "Hai %d horas" + +#. Translators: This is to construct a disk size string consisting of the +#. value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, +#. then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Gráficos en 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografía" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Dixitalización" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Gráficos vectoriais" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visores" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Creación e edición de son" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Reprodutores de música" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendario" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Base de datos" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finanzas" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Procesador de texto" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editores de texto" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navegadores web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Acción" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventura" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Bloques" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Taboleiro" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartas" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emuladores" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Nenos" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Lóxica" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Xogos de rol" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Deportes" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estratexia" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Conversa" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Intelixencia Artificial" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomía" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Química" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Idiomas" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matemáticas" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Novas" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robótica" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Arte" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Xeografía" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Bandas deseñadas" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Acción" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Saúde" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historia" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Estilo de vida" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Política" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Deportes" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Destacado" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Depuradores" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "EIDs" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Códecs" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Preferencias do hardware" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Tipos de letra" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Orixes de entrada" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Paquetes de idiomas" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localización" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Crear" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Traballar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Xogar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Aprender" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Desenvolver" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Códecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Controladores do hardware" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Tipos de letra" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Orixes de entrada" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Paquetes de idiomas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Localización" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is +#. unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Unha aplicación" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s está solicitando compatibilidade dun formato de ficheiro adicional." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Requírese un tipo MIME adicional" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s require tipos de letra adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Requírense tipos de letra adicionais" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s require códecs multimedia adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Requírense códecs multimedia adicionais" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s require controladores de impresora adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Requírense controladores de impresora adicionais" + +#. TRANSLATORS: this is a notification displayed when an app wants to install +#. additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s require paquetes adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Requírense paquetes adicionais" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Buscar en Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Mostrar máis" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Mostrar menos" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Retirando…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Require reiniciar para rematar a instalación" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Require reiniciar para rematar o retirado" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Instalación pendente…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Actualización pendente…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Descargando…" + +#. Translators: This string is shown when preparing to download and install an +#. app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Preparando…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Desinstalando…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s non está instalado, pero aínda ten datos presentes." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Reiniciar" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Activar…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instalar…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s aparecerá en Inglés de Estados Unidos" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Esta aplicación aparecerá en Inglés de Estados Unidos" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Esta aplicación aparecerá en Inglés de Estados Unidos" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Axudar a _traducir" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Outras aplicacións de %s" + +#. Translators: the first %s is replaced with the developer name, the second +#. %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "O desenvolvedor %s demostrou a propiedade de %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "O desenvolvedor demostrou a propiedade de %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Precisa acceso a Internet para escribir unha reseña" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Este software xa non está a recibir actualizacións, incluíndo as correccións de seguranza" + +#: src/gs-details-page.c:1931 +msgid "This app is already provided by your distribution and should not be replaced." +msgstr "Este software xa está sendo fornecido pola súa distribución e non debería substituílo." + +#: src/gs-details-page.c:1932 +msgid "This app doesn’t provide any links to a website, code repository or issue tracker." +msgstr "Esta aplicación non fornece ningunha ligazón a un sitio web, repositorio de código ou xestor de problemas." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Este software xa non está a recibir actualizacións, incluíndo as correccións de seguridade" + +#: src/gs-details-page.c:1935 +msgid "This software is already provided by your distribution and should not be replaced." +msgstr "Este software xa está sendo fornecido pola súa distribución e non debería substituílo." + +#: src/gs-details-page.c:1936 +msgid "This software doesn’t provide any links to a website, code repository or issue tracker." +msgstr "Esta aplicación non fornece ningunha ligazón a un sitio web, repositorio de código ou xestor de problemas." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "Software failed to retrieve information for “%s” and is unable to show the details for this app." +msgstr "Software non conseguiu recuperar información para «%s» e non pode amosar os detalles desta aplicación." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Resposta de revisión non válida recibida desde o servidor" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Non foi posíbel enviar a revisión para «%s»: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Páxina de detalles" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Cargando detalles da aplicación" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verificado" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Abrir" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Actualizar" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Desinstalar" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Engadidos" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "Esta aplicación só pode usarse cando hai unha conexión a Internet activa." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Inclúe repositorio de software" + +#: src/gs-details-page.ui:639 +msgid "This app includes a software repository which provides updates, as well as access to other software." +msgstr "Esta aplicación inclúe unha repositorio de software que fornece actualizacións, así como acceso a outro software." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Non inclúe repositorio de software" + +#: src/gs-details-page.ui:677 +msgid "This app does not include a software repository. It will not be updated with new versions." +msgstr "Esta aplicación non inclúe un repositorio de software. Non se actualizará con novas versións." + +#. Translators: a repository file used for installing software has been +#. discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Repositorio de software identificado" + +#: src/gs-details-page.ui:746 +msgid "Adding this software repository will give you access to additional software and upgrades." +msgstr "Ao engadir este repositorio de software terá acceso a software e anovacións adicionais." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Use só repositorios de software nas que confíe." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Limpar datos de aplicación" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "E_liminar datos" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Sen metadatos" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Sitio _web do proxecto" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Donar" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Contribuír traducións" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Informar dun erro" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Axuda" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contacto" + +#. Translators: Button opening a dialog where the users can write and publish +#. their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Escribir unha revisión" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Todas as revisións" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Non foi posíbel mostrar a información da aplicación" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Produciuse un fallo ao preparar o reinicio" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Erro descoñecido" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Non se atopou a chave" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "A chave non está inscrita" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Requírese a inscrición MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Seguinte" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following password associated with the key:" +msgstr "" +"Este dispositivo ten activado o Secure Boot. Para permitir que os novos controladores estean habilitados, debe inscribirse unha nova chave de " +"propietario da máquina (MOK). O proceso require un contrasinal para introducirse máis tarde no proceso. Teña en conta o seguinte contrasinal " +"asociado á clave:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Fixen unha nota da _contrasinal de MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Reiniciar e inscribirse…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instrucións de configuración: lea atentamente" + +#: src/gs-dkms-dialog.ui:166 +msgid "After restart, a device setup screen will be shown. To enable new drivers, proceed through the setup steps:" +msgstr "" +"Despois de reiniciar, mostrarase unha pantalla de configuración do dispositivo. Para habilitar os novos controladores, continúe polos pasos de " +"configuración:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Seleccione \"Inscribir MOK”\n" +"• Seleccione \"Si\" para inscribir as chaves\n" +"• Insira o contrasinal de MOK cando se lle solicite\n" +"• A continuación, seleccione \"Reiniciar”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Implicacións de seguranza" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the module or any other module will be implicitly trusted. All future " +"updates will happen transparently with no interaction and or authorization." +msgstr "" +"Despois de inscribir correctamente a chave, teña en conta que calquera actualización futura do módulo ou calquera outro módulo. Todas as " +"actualizacións futuras sucederán de forma transparente sen interacción nin autorización." + +#: src/gs-dkms-dialog.ui:244 +msgid "Further guidance can be found on the docs page." +msgstr "" +"Pódese atopar máis orientación nas páxinas de documentación." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Descargando os ficheiros de metadatos adicionais…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " e " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tipo de letra dispoñíbel para o script %s" +msgstr[1] "Tipos de letra dispoñíbeis para o script %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Software dispoñíbel para %s" +msgstr[1] "Software dispoñíbel para %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Non se atopa o software solicitado" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Produciuse un fallo ao atopar o software solicitado" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "Non se atopou «%s»" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "no sitio web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Non hai ningunha aplicación dispoñíbel que forneza o ficheiro %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "Information about %s, as well as options for how to get missing apps might be found %s." +msgstr "A información sobre %s, así como as opcións sobre como obter aplicacións que faltan poden atoparse en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Non hai ningunha aplicación dispoñíbel compatíbel con %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s non está dispoñíbel." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "Information about %s, as well as options for how to get an app that can support this format might be found %s." +msgstr "A información sobre %s, así como as opcións sobre como obter unha aplicación que sexa compatíbel con este formato poden atoparse en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Non hai ningún tipo de letra dispoñíbel que admita o script %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "Information about %s, as well as options for how to get additional fonts might be found %s." +msgstr "A información sobre %s, así como as opcións sobre como obter un tipos de letra adicionais poden atoparse en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Non hai ningún engadido de códec dispoñíbel para o formato %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "Information about %s, as well as options for how to get a codec that can play this format might be found %s." +msgstr "A información sobre %s, así como as opcións sobre como obter un códec que poida reproducir este formato poden atoparse en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Non hai ningún recurso Plasma dispoñíbel para o formato %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "Information about %s, as well as options for how to get additional Plasma resources might be found %s." +msgstr "A información sobre %s, así como as opcións sobre como obter un recurso Plasma adicional poden atoparse en %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Non hai ningún controlador de impresora dispoñíbel para %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "Information about %s, as well as options for how to get a driver that supports this printer might be found %s." +msgstr "A información sobre %s, así como as opcións sobre como obter un controlador que sexa compatíbel con esta impresora poden atoparse en %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "a documentación" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual +#. codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is +#. a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "Non se pode atopar %s solicitado por %s. Vexa %s para obter máis información." +msgstr[1] "Non se poden atopar %s solicitados por %s. Vexa %s para obter máis información." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual +#. codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "Unable to find the %s you were searching for. Please see %s for more information." +msgid_plural "Unable to find the %s you were searching for. Please see %s for more information." +msgstr[0] "Non se pode atopar %s que está buscando. Vexa %s para obter máis información." +msgstr[1] "Non se poden atopar %s que está buscando. Vexa %s para obter máis información." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Produciuse un fallo ao buscar calquera resultado de busca: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Formato de ficheiro %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Instalar _todo" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Non foi posíbel atopar o software requirido" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Páxina dos códecs" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Non se atoparon resultados" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Non foi posíbel realizar a busca" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Anterior" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Seguinte" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Listado de aplicacións destacadas" + +#: src/gs-hardware-support-context-dialog.c:589 src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Compatibilidade con escritorio" + +#: src/gs-hardware-support-context-dialog.c:590 src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Permite o seu uso en pantallas grandes" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Compatibilidade con escritorio descoñecida" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Non hai información dabondo para saber se é compatíbel con pantallas grandes" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Require unha pantalla grande" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Escritorio non compatíbel" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Non pode usarse nunha pantalla grande" + +#: src/gs-hardware-support-context-dialog.c:609 src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Compatibilidade con móbil" + +#: src/gs-hardware-support-context-dialog.c:610 src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Admite o uso en pantallas paquenas" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Compatibilidade con móbil descoñecida" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Non hai información dabondo para saber se é compatíbel con pantallas pequenas" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Require unha pantalla pequena" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Móbel non compatíbel" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Non pode usarse nunha pantalla pequena" + +#: src/gs-hardware-support-context-dialog.c:645 src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Soporte de teclado" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Compabilidade de teclado descoñecida" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Non hai información dabondo para saber se é compatíbel con teclados" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Teclado requirido" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Compatíbel con teclados" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Non compatíbel con teclado" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Non se pode usar con un teclado" + +#: src/gs-hardware-support-context-dialog.c:665 src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Compatibilidade de rato" + +#: src/gs-hardware-support-context-dialog.c:666 src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Require un rato ou dispositivo de apuntado" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Compatibilidade con móbil descoñecida" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "Not enough information to know if mice or pointing devices are supported" +msgstr "Non hai información dabondo para saber se é compatíbel con rato ou dispositivos de apuntado" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Require rato" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Admite ratos e dispositivos de apuntado" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Non compatíbel con rato" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Non pode usarse con un rato ou dispositivo de apuntado" + +#: src/gs-hardware-support-context-dialog.c:685 src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Compatiblidade de pantalla táctil" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Compatibilidade de pantalla táctil descoñecida" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Non hai información dabondo para saber se é compatíbel con áreas táctiles" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Require área táctil" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Compatíbel con pantalla táctil" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Non compatíbel con pantalla táctil" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Non se pode usar con unha pantalla táctil" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Require mando de xogos" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Require un mando de xogo" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Compatibilidade de mando de xogo" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Compatíbel con mando de xogos" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s probabelmente funciona neste dispositivo" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s funciona neste dispositivo" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s probabelmente funciona neste dispositivo" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s non funciona correctamente neste dispositivo" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s non funciona neste dispositivo" + +#. Translators: This is the title of the dialog which contains information +#. about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Compatibilidade hardware" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navegación" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navegar á páxina Explorar" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navegar á páxina Instalados" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navegar á páxina Actualizacións" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Abrir a barra de busca" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Windows" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Abrir as preferencias" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Abrir os repositorios de software" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Axuda" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Abrir atallos de teclado" + +#. Translators: This is in the context of a list of apps which are installed +#. on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instaladas" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Páxina de instalado" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "En progreso" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplicacións" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Aplicacións web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Aplicacións do sistema" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Construído pola comunidade" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "Involu_crarse" + +#. Translators: The first placeholder here is a link to information about the +#. license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este software desenvólvese de forma aberta por unha comunidade de voluntarios, e publicado baixo a licenza %s.\n" +"\n" +"Pode contribuír e axudar a melloralo." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este software desenvólvese de forma aberta por unha comunidade de voluntarios, e publicado baixo a licenza %s.\n" +"\n" +"Pode contribuír e axudar a melloralo." + +#. Translators: The first placeholder here is a link to information about the +#. license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este software desenvólvese de forma aberta por unha comunidade de voluntarios, e publicado baixo a licenza %s.\n" +"\n" +"Pode contribuír e axudar a melloralo." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este software desenvólvese de forma aberta por unha comunidade de voluntarios, e publicado baixo a licenza %s.\n" +"\n" +"Pode contribuír e axudar a melloralo." + +#. Translators: This indicates an app does not specify which license it's +#. developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Licenza descoñecida" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Saber máis" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Este software non especifica a licenza baixo que está desenvolto, e podería ser privativo. Pode ser máis difícil saber se o software non é " +"seguro, e pode cambiar sen supervisión.\n" +"\n" +"Pode ser que non poida contribuír neste software." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may be proprietary. It may be insecure in ways that are hard to detect, " +"and it may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software non especifica a licenza baixo que está desenvolto, e podería ser privativo. Pode ser máis difícil saber se o software non é " +"seguro, e pode cambiar sen supervisión.\n" +"\n" +"Pode ser que non poida contribuír neste software ou influenciar no seu desenvolvemento." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Privativo" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Este software non se desenvolve de forma aberta, so os seus desenvolvedores saben como funciona. Pode ser máis difícil saber se o software non é " +"seguro, e pode cambiar sen supervisión.\n" +"\n" +"Pode ser que non poida contribuír neste software." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how it works. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Este software non se desenvolve de forma aberta, so os seus desenvolvedores saben como funciona. Pode ser máis difícil saber se o software non é " +"seguro, e pode cambiar sen supervisión.\n" +"Pode ser qeu non poida contribuír neste software ou influenciar no seu desenvolvemento." + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Licenza especial" + +#. Translators: The first placeholder here is a link to information about the +#. license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Este software desenvólvese baixo unha licenza especial %s.\n" +"\n" +"Pode que non se poida contribuír a esta aplicación." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Este software desenvólvese baixo unha licenza especial «%s».\n" +"\n" +"Pode que non poida contribuír a este software." + +#. Translators: The first placeholder here is a link to information about the +#. license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software desenvólvese baixo unha licenza especial %s.\n" +"\n" +"Pode que non se poida contribuír a este software." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software desenvólvese baixo unha licenza especial «%s».\n" +"\n" +"Pode que non poida contribuír a este software." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Actualizando os datos" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Cargando páxina" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Iniciando" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Orixe descoñecido" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Usuario" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "A engadir" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "A eliminar" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Actualizacións" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "A desactualizar" + +#. Translators: This is a clickable link on the third party repositories +#. message dialog. It's +#. part of a constructed sentence: "Provides access to additional software +#. from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "orixes externos seleccionados" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Fornece acceso a software adicional dende %s. Inclúese algún software privativo.\n" +"\n" +"Pode activar estes repositorios máis tarde desde as preferencias de repositorios de Software." + +#. TRANSLATORS: Heading asking whether to turn third party software +#. repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Desexa activar os repositorios de software de terceiros?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorar" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Activar" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Dispoñíbel para o seu sistema operativo" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Dispoñíbel para %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Explorar" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Páxina de vista previa" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Aplicacións dispoñíbeis" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Outras categorías" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Non se atopou ningún dato de aplicación" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Descoñecida" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Aceptar" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "O usuario declinou a instalación" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Preparar %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Está seguro de que desexa retirar o repositorio «%s»?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "All apps from %s will be uninstalled, and you will have to re-install the repository to use them again." +msgstr "Vanse desinstalar todas as aplicacións de %s, e terá que reinstalar o repositorio para usalas de novo." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Desexa desinstalar %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Non será posible usar %s despois da eliminación." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "It will not be possible to use any apps which depend on %s after removal." +msgstr "Non será posible usar calquera aplicación que dependa de %s despois da eliminación." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "It will not be possible to use %s after removal, and any documents which use it will appear in a different font." +msgstr "Non será posible usar %s despois da eliminación, calquera outro documento que o use aparecerá nun tipo de letra diferente." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "It will not be possible to use %s after removal. This may mean some media files will no longer be playable." +msgstr "Non será posible usar %s despois da eliminación. Isto pode significar que algúns ficheiros multimedia non serán reproducíbeis." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "Hardware which depends on %s may no longer function correctly after removal." +msgstr "O hardware que depende do %s podería non funcionar correctamente despois da eliminación." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "It will not be possible to use %s after removal. App data and settings will be kept on disk, to allow restoring the app in the future." +msgstr "" +"Non será posible usar %s despois da eliminación.Os datos e configuracións da aplicación manteranse no disco, para permitir a restauración da " +"aplicación no futuro." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferencias" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Actualizar software" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Máis información" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update features are therefore paused when on metered network connections and " +"when power saver is on." +msgstr "" +"Comprobar e descargar actualizacións usa datos e enerxía. As funcións de actualizacións automáticas están polo tanto pausadas cando use " +"conexións de redes medidas ou o aforro de enerxía está activo." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automático" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Comprobar e descargar automaticamente as anovacións" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "A comprobación e descarga de actualizacións debe realizarse manualmente" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Notificacións de actualizacións automáticas" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Notificar cando se instalen actualizacións automaticamente" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtros de contacto" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Só mostrar software _libre" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Ocultar o software privativo ao explorar e buscar" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Só mostrar os desenvolvedores _verificados" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Mostrar só as aplicacións para os desenvolvedores cuxa identidade foi verificada" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "Installed software is incompatible with %s, and will be automatically removed during upgrade." +msgstr "O software instalado actualmente non é compatíbel con %s, e eliminarase automaticamente durante a actualización." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Software non compatíbel" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Actualizar" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Desinstalar" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Preferencias e datos da aplicación" + +#. Translators: this is part of section about deleting app's data, where the +#. 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Manter" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Permite restaurar a configuración e contido da aplicación" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Eliminar" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Eliminar permanentemente os datos para aforrar o espazo no disco" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora +#. Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "Software that has been installed from “%s” will cease to receive updates." +msgstr "O software que foi instalado desde «%s» non recibirá novas actualizacións." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Desexa desactivar o repositorio?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Desexa quitar o repositorio?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Desactivar" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Desinstalar" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Activar novos repositorios" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Activar os novos repositorios ao engadilos" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "máis información" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is +#. replaced +#. with a link consisting a text "more information", which constructs a +#. sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Repositorios adicionais desde terceiros seleccionados — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Repositorios de terceiros de Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "o sistema operativo" + +#. TRANSLATORS: This is the description text displayed in the Software +#. Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Estes repositorios suplementan o software fornecido por omisión por %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Repositorios de software" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Non hai repositorios" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplicación instalada" +msgstr[1] "%u aplicacións instaladas" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u engadido instalado" +msgstr[1] "%u engadidos instalados" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplicación" +msgstr[1] "%u aplicacións" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u engadido" +msgstr[1] "%u engadidos" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s e %s instalado" +msgstr[1] "%s e %s instalados" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Comprobando o software instalado…" + +#. Translators: The first '%s' is replaced with installation kind, like in +#. case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Retirar" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Ódioo" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Non me gusta" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Está ben" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Gústame" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Encántame" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Seleccione unha estrela e deixe a súa valoración" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Por favor, tome uns minutos escribindo a revisión" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Escolla a puntuación" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "O resumo é demasiado curto" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "O resumo é demasiado longo" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "A descrición é demasiado curta" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "A descrición é demasiado longa" + +#. Translators: Title of the dialog box where the users can write and publish +#. their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Escribir unha revisión" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Enviar" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used to report problems: instead, contact the developer or your support " +"provider." +msgstr "" +"Por favor forneza unha puntuación, resumo ou texto de reseña. As reseñas non deberían usarse para informar de problemas: no lugar, contacte co " +"desenvolvedor ou use o fornecedor de asistencia técnica." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Resumo da revisión" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Escribir unha revisión curta" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Saiba que datos se envían na nosa política de privacidade. O nome completo anexado á súa conta " +"mostrarase publicamente." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u opinión en total" +msgstr[1] "%u opinións en total" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "de 5 estrellas" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Descoñecido" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "Pode informar de opinións por ser abusivas, groseiras ou conduta discriminatoria." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "Once reported, a review will be hidden until it has been checked by an administrator." +msgstr "En canto estea reportada, a opinión ocultarase ate que sexa revisada polo administrador." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Reportar opinión?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Informar" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Eliminar revisión?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "A eliminación dunha revisión non se pode desfacer." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Gústame a revisión" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Non me gusta a revisión" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Informar…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Retirar…" + +#: src/gs-safety-context-dialog.c:154 +msgid "App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "A aplicación non está illada pero a súa distribución comprobou que non é maliciosa" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Comprobe que confía no fornecedor, xa que a aplicación non está illada" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Sen permisos" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "A aplicación está completamente illada" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Acceso á rede" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Pode acceder a internet" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Sen acceso á rede" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Non pode acceder a internet" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Usa os servizos do sistema" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Pode solicitar datos dos servizos do sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Usa os servizos da sesión" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Pode solicitar datos dos servizos da sesión" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Acceso a dispositivos do usuario" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Pode acceder aos dispositivos como as cámaras web ou controladores de xogo" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Sen acceso a dispositivos do usuario" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Non pode acceder aos dispositivos como as cámaras web ou controladores de xogo" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Acceso ao dispositivo de entrada" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Acceso ao micrófono e reprodución de audio" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Pode escoitar o micrófono e reproducir audio sen solicitar permiso" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Acceso a dispositivos do sistema" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Pode acceder aos dispositivos do sistema o cal require de permisos elevados" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Acceso aos contidos da pantalla" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Pode acceder aos contidos da pantalla ou outras xanelas" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Sistema de xanelas antigo" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Permisos arbitrarios" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Preferencias do usuario" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Acceso de lectura/escritura ao sistema de ficheiros completo" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Pode ler escribir todos os datos no sistema de ficheiros" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Acceso de lectura e escritura ao cartafol persoal" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Pode ler e escribir todos os seus datos no seu cartafol persoal" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Acceso de lectura ao sistema de ficheiros completo" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Pode ler todos os datos no seu sistema de ficheiros" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Acceso de lectura ao cartafol personal" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Pode ler os seus datos no seu cartafol personal" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Acceso de lectura/escritura ao cartafol de Descargas" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Pode ler/escribir todos os datos no seu cartafol de descargas" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Acceso de lectura ao cartafol de Descargas" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Pode ler todos os datos no seu cartafol de descargas" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Pode ler e escribir todos os seus datos no cartafol" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Pode ler todos os seus datos no cartafol" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Sen acceso ao sistema de ficheiros" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Non pode acceder ao sistema de ficheiros de ningunha forma" + +#. Translators: This indicates an app was written and released by a developer +#. who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "O desenvolvedor da aplicación está verificado" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "O desenvolvedor desta aplicación foi verificado ser quen di ser" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Dependencias non seguras" + +#: src/gs-safety-context-dialog.c:399 +msgid "Software or its dependencies are no longer supported and may be insecure" +msgstr "O software ou as súas dependencias xa non se admiten e poden ser inseguras" + +#: src/gs-safety-context-dialog.c:412 +msgid "This app does not specify what license it is developed under, and may be proprietary" +msgstr "Este software non especifica a licenza baixo a que se desenvolve, e podería ser privativo" + +#: src/gs-safety-context-dialog.c:413 +msgid "This software does not specify what license it is developed under, and may be proprietary" +msgstr "Este software non especifica a licenza baixo a que se desenvolve, e podería ser privativo" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Código privativo" + +#: src/gs-safety-context-dialog.c:427 +msgid "The source code is not public, so it cannot be independently audited and might be unsafe" +msgstr "O código fonte non é público, polo que non pode ser auditado independentemente e podería non ser seguro" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Este software desenvólvese baixo unha licenza especial «%s»" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Este software desenvólvese baixo unha licenza especial «%s»" + +#. Translators: This refers to permissions (for example, from flatpak) which +#. an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Código auditábel" + +#: src/gs-safety-context-dialog.c:452 +msgid "The source code is public and can be independently audited, which makes the app more likely to be safe" +msgstr "O código fonte é público e pode auditarse de forma independente, o que fai que a aplicación sexa máis segura" + +#. Translators: The app is considered privileged, aka provided by the +#. distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s é privilexiado" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s é segura" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s é probabelmente segura" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s é potencialmente insegura" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s é insegura" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Descoñecida" + +#. Translators: This is the title of the dialog which contains information +#. about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Seguranza" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licenza" + +#. Translators: This is a heading for a row showing the origin/source of an +#. app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Orixe" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Esta aplicación usa unha versión desactualizada da plataforma de software (SDK) e pode conter erros ou vulnerabilidades de seguridade que non se " +"solucionarán." + +#. Translators: This is the accessible description for a button to go to the +#. previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Captura de pantalla anterior" + +#. Translators: This is the accessible description for a button to go to the +#. next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Captura de pantalla seguinte" + +#. Translators: Shortened form of “no screenshots available” when showing an +#. app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Non hai capturas de pantalla" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Captura de pantalla non atopada" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Produciuse un fallo ao cargar a imaxe" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Tamaño da captura de pantalla non atopada" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Non foi posíbel crear a caché" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Captura de pantalla non atopada" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Captura de pantalla non dispoñíbel" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u coincidencia máis" +msgstr[1] "%u coincidencias máis" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Páxina de busca" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Buscar por aplicacións" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Non se atoparon aplicacións" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Non é posíbel descargar anovacións" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Non é posíbel descargar anovacións de firmware" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Non é posíbel descargar anovacións de firmware desde %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Non é posíbel descargar anovacións desde %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Non foi posíbel actualizar: precísase acceso a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Non foi posíbel actualizar: non hai espazo en disco dabondo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Non é posíbel descargar anovacións desde %s: non hai espazo en disco dabondo" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Non foi posíbel actualizar: precísase autenticación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Non foi posíbel actualizar: a autenticación non é válida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Non foi posíbel actualizar: precísase permiso" + +#: src/gs-shell.c:1256 +msgid "Unable to download updates: you do not have permission to install software" +msgstr "Non foi posíbel descargar as anovacións: non ten permiso para instalar o software" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Non foi posíbel descargar a lista de anovacións" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Non foi posíbel instalar: fallou a descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Non foi posíbel instalar %s: a descarga fallou desde %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Non foi posíbel instalar %s: fallou a descarga" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Non foi posíbel instalar: falta o runtime" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Non foi posíbel instalar %s: o ambiente de execución %s non está dispoñíbel" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Non foi posíbel instalar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Non foi posíbel instalar: requírese acceso a internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Non foi posíbel instalar: formato de aplicación non válido" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Non foi posíbel instalar: non hai espazo en disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Non foi posíbel instalar %s: non hai espazo en disco" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Non foi posíbel instalar: requírese autenticación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Non foi posíbel instalar %s: requírese autenticación" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Non foi posíbel instalar: autenticación non válida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Non foi posíbel instalar %s: autenticación non válida" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Non foi posíbel instalar: requírese permiso" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Non foi posíbel instalar %s: requírese permiso" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Non foi posíbel instalar: o dispositivo debe enchufarse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Non foi posíbel instalar %s: o dispositivo debe enchufarse" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Non foi posíbel instalar: batería baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Non foi posíbel instalar %s: batería baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Non foi posíbel actualizar %s desde %s: a descarga fallou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Non foi posíbel actualizar %s: fallou a descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Non foi posíbel instalar actualizacións desde %s: a descarga fallou" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Non foi posíbel actualizar: fallou a descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Non foi posíbel actualizar %s: non hai espazo en disco dabondo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Non foi posíbel actualizar %s: precísase autenticación" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Non foi posíbel actualizar %s: a autenticación non é válida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Non foi posíbel actualizar %s: precísase permiso" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Non foi posíbel actualizar: o dispositivo debe enchufarse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Non foi posíbel actualizar %s: o dispositivo debe enchufarse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Non foi posíbel actualizar: batería baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Non foi posíbel actualizar %s: batería baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Non foi posíbel actualizar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Non foi posíbel actualizar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Non foi posíbel actualizar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Non foi posíbel actualizar a %s desde %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Non foi posíbel anovar: fallou a descarga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Non foi posíbel anovar %s: fallou a descarga" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Non foi posíbel anovar: requírese acceso a internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Non foi posíbel anovar %s: requírese acceso a internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Non foi posíbel anovar: non hai espazo libre no disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Non foi posíbel anovar %s: non hai espazo libre no disco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Non foi posíbel anovar: requírese autenticación" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Non foi posíbel anovar %s: requírese autenticación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Non foi posíbel anovar: autenticación non válida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Non foi posíbel anovar %s: autenticación non válida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Non foi posíbel anovar: requírese permiso" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Non foi posíbel anovar %s: requírese permiso" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Non foi posíbel anovar: o dispositivo debe enchufarse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Non foi posíbel anovar %s: o dispositivo debe enchufarse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Non foi posíbel anovar: batería baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Non foi posíbel anovar %s: batería baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Non foi posíbel anovar a %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Non foi posíbel desinstalar: requírese autenticación" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Non foi posíbel desinstalar %s: requírese autenticación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Non foi posíbel desinstalar: autenticación non válida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Non foi posíbel desinstalar %s: autenticación non válida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Non foi posíbel desinstalar: requírese permiso" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Non foi posíbel desinstalar %s: requírese permiso" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Non foi posíbel instalar: o dispositivo debe enchufarse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Non foi posíbel instalar %s: o dispositivo debe enchufarse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Non foi posíbel desinstalar: batería baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Non foi posíbel desinstalar %s: batería baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Non foi posíbel desinstalar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Non foi posíbel iniciar %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 src/gs-shell.c:1880 src/gs-shell.c:1940 +msgid "Sorry, something went wrong" +msgstr "Desculpa, isto non funcionou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Non foi posíbel iniciar %s: %s non está instalado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 src/gs-shell.c:1920 +msgid "Not enough disk space for operation" +msgstr "Non hai espazo en disco dabondo para a operación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Non foi posíbel instalar: o tipo de ficheiros non é compatíbel" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Non foi posíbel instalar: fallou a autenticación" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Non foi posíbel instalar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Non foi posíbel contactar con %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' +#. means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1924 +msgid "Restart Software to use new plugins" +msgstr "Software debe reiniciarse para usar os engadidos novos" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1928 +msgid "Device needs to be plugged in" +msgstr "O dispositivo precisa estar conectado" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1931 +msgid "Battery level is too low" +msgstr "O nivel de batería é demasiado baixo" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Repositorios de _software" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferencias" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Atallos de teclado" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Sobre Software" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Buscar" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menú principal" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Buscar aplicacións" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Explorar" + +#. Translators: A label for a button to show only software which is already +#. installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalado" + +#. Translators: A label for a button to show only updates which are available +#. to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Anovacións" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Atrás" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ningún" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Datos da aplicación" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Datos requiridos para que a aplicación se execute" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Datos de usuario" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Datos creados por vostede na aplicación" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Datos de caché" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Datos cacheados temporalmente" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "A aplicación en si mesma" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dependencias requiridas" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Compoñentes compartidos do sistema requiridos por esta aplicación" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Descoñecido" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Os datos da caché poden limparse desde as preferencias de _aplicacion" + +#. Translators: This is the title of the dialog which contains information +#. about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Almacenamento" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instalado)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Instalando)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Descargando)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Retirando)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detalles" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examinar" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Instalado o %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Actualizacións instaladas" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Non hai actualizacións instaladas" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "As actualizacións de software están obsoletas" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Comprobe as actualizacións de software" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "As actualización de software críticas están listas para instalar" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Instalar as actualizacións críticas tan pronto sexa posíbel" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Hai actualizacións críticas de software dispoñíbeis para descargar" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Descargar actualizacións críticas tan pronto sexa posíbel" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Actualizacións listas para instalarse" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Hai actualizacións de software listas e agardando" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Hai actualizacións de software dispoñíbeis para descargar" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Poden descargarse actualizacións de software" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplicación actualizada — Requírese reiniciar" +msgstr[1] "%u aplicacións actualizadas — Requírese reiniciar" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplicación actualizada" +msgstr[1] "%u aplicacións actualizadas" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s foi actualizado." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Reinicie a aplicación." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s e %s foron actualizados." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplicación require reiniciar." +msgstr[1] "%u aplicacións requiren reiniciar." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inclúe %s, %s e %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of- +#. life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "O sistema chegou ao final da vida" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Actualize para continuar recibindo anovacións de seguranza" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Hai unha nova versión de %s dispoñíbel para instalar" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Hai actualizacións de software dispoñíbeis" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Produciuse un erro ao actualizar o software" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Non se instalaron as actualizacións preparadas" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Mostrar información" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Actualización do sistema completada" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Benvida a %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Actualización de software instalada" +msgstr[1] "Actualizacións de software instaladas" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Instalouse unha actualización importante do sistema operativo." +msgstr[1] "Instaláronse actualizacións importantes do sistema operativo." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Revisar" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Produciuse un erro ao actualizar" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "O sistema xa está actualizado." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "A actualización foi cancelada." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "Internet access was required but wasn’t available. Please make sure that you have internet access and try again." +msgstr "Requírese acceso a internet pero non está dispoñíbel. Asegúrese que ten acceso a internet e probe de novo." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "There were security issues with the update. Please consult your software provider for more details." +msgstr "Producíronse problemas de seguranza coa actualización. Consulte co seu fornecedor de software para obter máis información." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "There wasn’t enough disk space. Please free up some space and try again." +msgstr "Non hai espazo en disco dabondo. Por favor libere algún espazo e ténteo de novo." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update and try again. If the problem persists, contact your software provider." +msgstr "" +"Desculpe: a actualización non puido instalarse. Agarde a que se publique unha nova actualización e ténteo de novo. Se o problema persiste, " +"contacte co seu fornecedor de software." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Última comprobación: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Deter" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Comprobar actualizacións" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s deixou de recibir actualizacións de software críticas" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "O seu sistema operativo xa non ten recibe actualizacións de software críticas" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Pode producir custos adicionais" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "Checking for updates while using mobile broadband could cause you to incur charges." +msgstr "Comprobando actualizacións ao usar banda larga móbil pode causar custos adicionais." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Comprobar de todos _modos" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Actualizacións de software descargadas" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "As actualizacións están listas para instalarse" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Buscando actualizacións" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Actualizacións" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Páxina de actualizacións" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Cargando actualizacións" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Isto pode levar un anaco" + +#. TRANSLATORS: This means all software (plural) installed on this system is +#. up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Actualizado" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Desexa usar os datos móbiles?" + +#: src/gs-updates-page.ui:180 +msgid "Checking for updates when using mobile broadband could cause you to incur charges" +msgstr "Se comprobar actualizacións mentres usa a banda larga móbil pode incorrer en custos" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Comprobar de novo" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Non hai conexión" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Conéctese para comprobar as actualizacións" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Preferencias da _rede" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Erro" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "As actualizacións xestiónanse automaticamente" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Detivéronse as actualizacións de software" + +#: src/gs-updates-paused-banner.c:47 +msgid "Automatic software updates have been paused for the following reasons:\n" +msgstr "Detivéronse as actualizacións de software polas seguintes razóns:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• A conexión de rede actual está medida" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• A conexión de rede actual prohibe as descargas grandes" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• O modo de aforro de enerxía está activa" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• O modo de xogo está activo" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Detivéronse as actualizacións de software" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "A conexión á rede é medida — detivéronse as actualizacións de software" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "A conexión de rede prohibe as descargas grandes — actualizacións de software pausadas" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "O modo de aforro de enerxía está activo — detivéronse as actualizacións de software" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Modo de xogo activado — detivéronse as actualizacións de software" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Reiniciar e actualizar…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_Actualizar todo" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Actualizacións de software descargadas" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "As actualizacións están listas para instalarse" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Firmware integrado" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Require reiniciar" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Actualizacións de aplicación" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Firmware de dispositivo" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Descargar" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s está dispoñíbel" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s dispoñíbel" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Saber máis sobre a nova versión" + +#. Translators: the first '%s' is replaced with the downloaded size, the +#. second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s de %s descargado" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% descargado" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Hai unha anovación importante, con novas características e melloras." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Cancelar actualización" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Reiniciar e actualizar…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Recoméndase facer unha copia seguranza dos seus datos e ficheiros antes de anovar." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Información do erro" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Copiar información" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Non foi posíbel eliminar o ficheiro «%s»: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Non foi posíbel eliminar o cartafol «%s»: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Engadir, quitar ou anovar software neste computador" + +#. Translators: Search terms to find this app. Do NOT translate or localize +#. the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "Actualizacións;Anovar;Orixes;Repositorios;Preferencias;Instalar;Desinstalar;Programa;Software;Aplicación;Tenda;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux +#. Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s está listo" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux +#. Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. NVIDIA Linux Graphics Driver Ready +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the +#. next boot. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "O %s está preparado para estar habilitado e posto en escena para o seguinte arranque." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Activar" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Actualización do sistema" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "General system updates, such as security or bug fixes, and performance improvements." +msgstr "Actualizacións xerais do sistema, como seguranza ou arranxo de erros, así como melloras de rendemento." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Anovación de %s con novas características e melloras." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "O servizo de actualización de EOS non puido obter e aplicar a actualización." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Aplicacións web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Compatibilidade con aplicacións web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Execute aplicacións web nun navegador" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "Upgrade for the latest features, performance and stability improvements." +msgstr "Actualice para obter as últimas características, e melloras de rendemento e estabilidade." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Compatibilidade de Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak é un ambiente de desenvolvemento de aplicacións de escritorio en Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command- +#. reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Cartafol do sistema %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Subcartafol persoal %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Cartafoles do sistema anfitrión" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Configuración do sistema do anfitrión desde /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Cartafol do escritorio" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Subcartafol do escritorio %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Cartafol de documentos" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Subcartafol de documentos %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Cartafol de música" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Subcartafoles de música %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Cartafol de imaxes" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Subcartafol de imaxes %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Cartafol de compartición pública" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Subcartafol de compartición pública %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Cartafol de vídeos" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Subcartafol de vídeos %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Cartafol de modelos" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Subcartafol de modelos %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Cartafol de caché de usuario" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Subcartafol de caché de usuario %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Cartafol de configuración de usuario" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Subcartafol de configuración de usuario %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Cartafol datos de usuario" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Subcartafol de datos de usuario %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Cartafol de «runtime» de usuario" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Subcartafol de «runtime» de usuario %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Acceso ao sistema de ficheiros a %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Obtendo os metadatos de flatpak para %s…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Non foi posíbel refinar o engadido «%s»: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instalación de usuario" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instalación do sistema" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID da aplicación" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Non foi posíbel engadir para instalar o engadido «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Non foi posíbel engadir para desinstalar o engadido «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "Remote “%s” doesn't allow install of “%s”, possibly due to its filter. Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"O remoto «%s» non permite instalar de «%s», posiblemente debido aos seu filtro. Elimine o filtro e repita a intalación. Información do erro: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "A enerxía do sistema está demasiado baixa para levar a cabo a actualización" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "A enerxía do sistema está demasiado baixa para levar a cabo a actualización (%u%%, require %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "O dispositivo non é alcanzábel, ou fóra do rango sen fíos" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "A enerxía da batería do dispositivo está demasiado baixa" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "A enerxía da batería do dispositivo é demasiado baixa (%u%%, require %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "O dispositivo está agardando para que se aplique a actualización" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "O dispositivo require enerxía AC conectada" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "O dispositivo non se pode usar namentres está pechada a tapa" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Actualización de dispositivo %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Actualización de sistema %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Actualización de controlador embebido de %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Actualización de %s ME" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Actualización de %s ME Corporativo" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Actualización de %s ME de consumidor" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Actualización de controlador %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Actualización de controlador de Thunderbolt de %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Actualización do microcódigo da CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Actualización de configuración %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Actualización de batería %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Actualización de cámara %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Actualización de TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Actualización de área táctil %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Actualización de rato %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Actualización de teclado %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Actualización de controlador do almacenamento %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Actualización de controlador da rede %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Actualización de pantalla %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Actualización de BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Actualización de Receptor USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Actualización de unidade %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Actualización de unidade flash %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Actualización de SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Actualización de GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Actualización de Dock %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Actualización de Receptor USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Non foi posíbel aplicar a actualización de firmware: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Compatibilidade de actualizacións de firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Fornece compatibilidade para actualizacións de firmware" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Desexa instalar software non asinado?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to verify the origin of updates to this software, or whether updates " +"have been tampered with." +msgstr "" +"O software que está a piques de instalar non está asinado. Non é posíbel verificar a orixe das actualizacións desde software ou se as " +"actualizacións foron manipuladas." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Desexa descargar software non asinado?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Existen actualizacións non asinadas dispoñíbeis. Sen unha sinatura, non é posíbel verificar a orixe das actualizacións desde software ou se as " +"actualizacións foron manipuladas." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Desexa actualizar software non asinado?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to verify the origin of the update, or whether it has been tampered " +"with. Software updates will be disabled until unsigned updates are either removed or updated." +msgstr "" +"Existen actualizacións non asinadas dispoñíbeis. Sen unha sinatura, non é posíbel verificar a orixe das actualizacións desde software ou se as " +"actualizacións foron manipuladas. As actualizacións de software desactivaranse ate que as actualizacións non asinadas se eliminen ou se " +"actualicen." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Produciuse un fallo ao instalar as actualizacións: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paquetes" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Produciuse un fallo ao esperar no final das transaccións antes da descarga: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Produciuse un fallo ao descar as anovacións: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Produciuse un fallo ao disparar a actualización: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Sistema operativo (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Tenda de Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Compatibilidade de Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Un snap é un paquete universal de Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistema" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Compoñente do sistema" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Eliminar o traballo sysupdate «%s» fallou co estado %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Unha gran forma de xestionar o software no seu sistema." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Escriba un número desde 1 a %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Escolla unha aplicación:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s agora está instalado" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Eliminouse unha aplicación" +#~ msgstr[1] "Elimináronse as aplicacións" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Non foi posíbel atopar «%s»" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Descargando o catálogo de software" + +#~ msgid "Moderate page" +#~ msgstr "Moderar páxina" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Non hai revisións que moderar" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Esta opinión foi útil para vostede?" + +#~ msgid "Yes" +#~ msgstr "Sí" + +#~ msgid "No" +#~ msgstr "Non" + +#~ msgid "Meh" +#~ msgstr "Meh" + +#~ msgid "Outdated SDK version" +#~ msgstr "Versión do SDK desfasada" + +#~ msgid "Unable to install updates" +#~ msgstr "Non foi posíbel instalar as actualizacións" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Non foi posíbel desinstalar: a autenticación non é válida" + +#~ msgid "Network Settings" +#~ msgstr "Preferencias da rede" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Actualizacións de sistema operativo non dispoñíbeis" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Produciuse un erro ao instalar unha actualización do sistema operativo importante." + +#~ msgid "No Network" +#~ msgstr "Non hai rede" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Requírese acceso a Internet para buscar actualizacións." + +#~ msgid "Network _Settings" +#~ msgstr "_Preferencias da rede" + +#~ msgid "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "As actualizacións de software descargáronse e están listas para instalarse." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Descargáronse as actualizacións de software descargáronse e están listas para instalarse." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Descargando a información de anovación…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Actualizacións automáticas pausadas" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be changed in Settings." +#~ msgstr "" +#~ "A rede actual é medida. As conexións medidas teñen límites ou cargos monetarios asociados a elas. Para aforrar datos, as actualizacións " +#~ "automáticas foron polo tanto pausadas.\n" +#~ "\n" +#~ "De forma alternativa, se a rede actual foi identificada de forma incorrecta como medida, esta configuración pode cambiarse desde Preferencias." + +#~ msgid "Open Network _Settings" +#~ msgstr "Abrir as _Preferencias da rede" + +#~ msgid "What did you like about this app? Leaving your feedback along with your reasons for leaving a review is helpful for others." +#~ msgstr "Que lle gustou sobre esta aplicación? Deixe a súa opinión así como as súas razóns xa que é útil para outros." + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Rede medida ‒ pausáronse as actualizacións automáticas" + +#~ msgid "Find Out _More" +#~ msgstr "Saber _máis" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Hai unha actualizacións de software importante lista para instalarse." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Importante: as actualizacións de software críticas están agardando." + +#~ msgid "To avoid charges and network caps, software updates are not automatically downloaded on mobile or metered connections." +#~ msgstr "Para evitar cargos e límites de rede, as actualizacións automáticas están desactivadas cando se usan conexións móbiles ou medidas." + +#~ msgid "Downloads and installs software updates in the background, when possible" +#~ msgstr "Descarga e Instala calquera actualización de software pendente en segundo plano, cando sexa posíbel" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Mostrar só as aplicacións _libres" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "Mostrar só as aplicacións con licencia libre e ocultar calquera aplicación privativa" + +#~ msgid "Unable to download updates: internet access was required but wasn’t available" +#~ msgstr "Non é posíbel descargar anovacións: requírese acceso a internet pero non está dispoñíbel" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Non foi posíbel descargar as anovacións: non hai espazo en disco dabondo" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Non foi posíbel descargar as anovacións: requírese autenticación" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Non foi posíbel descargar as anovacións: a autenticación non é válida" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "Non foi posíbel instalar %s: non ten permiso para instalar software" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Non foi posíbel instalar %s: O nivel de batería é demasiado baixo" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Non foi posíbel instalar as actualizacións: non hai espazo en disco dabondo" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Non foi posíbel instalar as actualizacións: requírese autenticación" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Non foi posíbel instalar as actualizacións: a autenticación non é válida" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "Non foi posíbel actualizar %s: non ten permisos para actualizar software" + +#, c-format +#~ msgid "Unable to install updates: you do not have permission to update software" +#~ msgstr "Non foi posíbel actualizar as actualizacións: non ten permisos para actualizar software" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Non foi posíbel instalar as actualizacións: precísase conexión á alimentación" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Non foi posíbel actualizar %s: O nivel de batería é demasiado baixo" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Non foi posíbel instalar as actualizacións: O nivel de batería é demasiado baixo" + +#, c-format +#~ msgid "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "Non foi posíbel actualizar a %s: precísase acceso a Internet, pero non está dispoñíbel" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Non foi posíbel actualizar a %s: non ten permiso para actualizar" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Non foi posíbel a %s: O nivel de batería é demasiado baixo" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Non foi posíbel quitar %s: precísase autenticación" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Non foi posíbel quitar %s: a autenticación non é válida" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Non foi posíbel quitar %s: non ten permisos para quitar software" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Non foi posíbel quitar %s: precísase conexión á alimentación" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Non foi posíbel quitar %s: O nivel de batería é demasiado baixo" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Non foi posíbel quitar «%s»" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Produciuse un fallo ao instalar o ficheiro: non compatíbel" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Produciuse un fallo na instalación: non compatíbel" + +#~ msgid "AC power is required" +#~ msgstr "Precísase conexión á alimentación" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Cargando a descrición da actualización, agarde…" diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..6bd99f1 --- /dev/null +++ b/po/he.po @@ -0,0 +1,8199 @@ +# gnome-software Hebrew translation +# Copyright (C) 2013 Richard Hughes +# This file is distributed under the same license as the gnome-software package. +# Elad Alfassa , 2013. +# Yosef Or Boczko , 2014-2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-26 14:22+0000\n" +"PO-Revision-Date: 2025-02-26 16:54+0200\n" +"Last-Translator: Yaron Shahrabani \n" +"Language-Team: Hebrew\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.5\n" +"X-DL-Lang: he\n" +"X-DL-Module: gnome-software\n" +"X-DL-Branch: main\n" +"X-DL-Domain: po\n" +"X-DL-State: Translating\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "תכנה" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "התקנה ועדכון יישומים" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"תכנה מאפשר לך למצוא ולהתקין יישומים חדשים והרחבות מערכת ולהסיר יישומים " +"מותקנים קיימים." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"תכנה מציג יישומים מומלצים ופופולריים עם תיאור שימושי ומספר צילומי מסך לכל " +"יישום. ניתן למצוא יישומים באמצעות קטגוריות או באמצעות חיפוש. כמו כן ניתן אף " +"לעדכן את המערכת שלך באמצעות עדכונים לא מקוונים." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "עמוד סקירה" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "לוח פרטים" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "עמוד מותקנים" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "דף עדכונים" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "פרטי עדכון" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "מיזם GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "בדיקת מפתח akmods ב־Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "צריך אימות כדי לבדוק מפתח akmods ב־Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "רישום מפתח akmods ב־Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "צריך אימות כדי לרשום מפתח akmods ב־Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "בדיקת מפתח DKMS מול Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "צריך אימות כדי לבדוק את מפתח DKMS מול Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "רישום מפתח DKMS ב־Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "צריך אימות כדי לרשום מפתח DKMS ל־Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "התקנת קובץ appstream לתוך מערכת מקומית" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "מתקין קובץ appstream לתוך מערכת מקומית" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "רשימה של מיזמים נתמכים" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "זאת רשימה של מיזמים נתמכים שאנחנו צריכים להציג כגון GNOME,‏ KDE ו־XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "האם לנהל עדכונים ושדרוגים במרכז התכנה של GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automatically download and install updates" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notify the user about software updated in the background" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Whether to automatically refresh when on a metered connection" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Whether it’s the very first run of GNOME Software" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Show star ratings next to applications" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filter applications based on the default branch set for the remote" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Non-free applications show a warning dialog before install" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "The last update check timestamp" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "The last upgrade notification timestamp" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "The last update notification timestamp" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "The timestamp of the first security update, cleared after update" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "The last update timestamp" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "The age in seconds to verify the upstream screenshot is still valid" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "The server to use for application reviews" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "The minimum karma score for reviews" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Reviews with karma less than this number will not be shown." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "A list of official repositories that should not be considered 3rd party" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "רשימה של מאגרים נפוצים שאי אפשר להשבית או להסיר" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "A list of official repositories that should be considered free software" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"The licence URL to use when an application should be considered free software" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Install bundled applications for all users on the system where possible" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Allow access to the Software Repositories dialog" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Offer upgrades for pre-releases" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Show some UI elements informing the user that an app is non-free" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Show the installed size for apps in the list of installed applications" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "The URI that explains nonfree and proprietary software" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided by " +"a colon, for example 'flatpak:flathub'." +msgstr "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided by " +"a colon, for example 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "The timestamp of the last attempt to remove unused Flatpak runtimes" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary apps." +msgstr "" +"Set to 'true' to show only freely licensed apps and hide any proprietary apps." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "The timestamp of the last received historical updates." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "A string storing the gnome-online-account id used to login" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "מתקין כלל מערכתי ל־AppStream כחלק מתכנה של GNOME" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Failed to parse command line arguments" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "עליך לציין שם קובץ אחד בלבד" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "תכנה זו יכולה לפעול אך ורק באמצעות משתמש מנהל" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "תיקוף סוג התוכן נכשל: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "העברה נכשלה: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "התקנת תכנית" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "התקנת התכנית הנבחרת על המערכת" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "אלימות בין דמויות מצוירות" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "אין מידע על אלימות בין דמויות מצוירות" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "אלימות בלתי מציאותית" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "אין מידע על אלימות בלתי מציאותית" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "אלימות מציאותית" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "אין מידע על אלימות מציאותית" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "אלימות עם שפיכות דמים" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "אין מידע על אלימות עם שפיכות דמים" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "אלימות מינית" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "אין מידע על אלימות מינית" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "אלכוהול" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "אין מידע על התייחסויות לאלכוהול" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "סמים" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "אין מידע על התייחסויות לסמים לא חוקיים" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "טבק" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "אין מידע על התייחסויות למוצרי טבק" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "עירום" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "אין מידע על עירום מכל סוג שהו" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "נושאים מיניים" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "אין מידע על התייחסויות לתיאורים מיניים" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "קללות" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "אין מידע על קללות מכל סוג שהן" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "הומור בלתי הולם" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "אין מידע על הומור בלתי הולם" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "אפליה" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "אין מידע על אפליה מכל סוג שהיא" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "פרסום" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "אין מידע על פרסום מכל סוג שהוא" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "הימורים" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "אין מידע על הימורים מכל סוג שהם" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "רכישה" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "אין מידע על היכולת להוציא כסף" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "צ׳אט בין משתמשים" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "אין מידע על דרכים לשוחח עם משתמשים אחרים" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "שיחה קולית בין משתמשים" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "אין מידע על דרכים לבצע שיחה קולית עם משתמשים אחרים" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "פרטי יצירת קשר" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "אין מידע על שיתוף של שמות משתמשים או כתובות דוא״ל של רשת חברתית" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "פרטים מזהים" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "אין מידע על שיתוף מידע של המשתמש לצד שלישי" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "שיתוף מיקום" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "אין מידע על שיתוף מיקום פיזי עם משתמשים אחרים" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "הומוסקסואליות" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "אין מידע על התייחסויות להומוסקסואליות" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "זנות" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "אין מידע על התייחסויות לזנות" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "ניאוף" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "אין מידע על התייחסויות לניאוף" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "דמויות מיניות" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "אין מידע על התייחסויות לדמויות מיניות" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "חילול השם" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "אין מידע על התייחסויות לחילול השם" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "חלקי גופות" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "אין מידע על מראה של חלקי גופות" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "עבדות" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "אין מידע על התייחסויות לעבדות" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "לא כולל התייחסויות לסמים" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "Does not include swearing, profanity, and other kinds of strong language" +msgstr "לא כולל שבועות, קללות או כל שימוש אחר בשפה פוגענית" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "לא כולל פרסומות או עסקאות כספיות" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "לא כולל מין או עירום" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "לא כולל אפשרויות לצ׳אט ללא בקרה" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "לא כולל אלימות" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "סמים" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "שפה פוגענית" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "כסף" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "חברתי" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "אלימות" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "הכול" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "אין בנמצא דירוג גיל מתאים עבור %s" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "‫%s מתאים לכולם" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "‫%s מתאים לפעוטות" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "‫%s מתאים לילדים צעירים" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "‫%s מתאים לילדים" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "‫%s מתאים לנוער" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "‫%s מתאים למבוגרים" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "‫%s מתאים ל%s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "דירוג גיל מומלץ" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_איך לתרום מידע חסר" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "קובץ מקומי" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "‏%s ‏(%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "חבילה" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "בהמתנה" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "בהמתנה להתקנה" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "בהמתנה להסרה" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "בהתקנה" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "בהסרה" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "בהורדה" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "ה_תקנה" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "ה_סרת התקנה…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "רשת" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "ניתן לתקשר על גבי הרשת" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "שירותי מערכת" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "ניתן לגשת לשירות D-Bus על ערוץ המערכת" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "שירותי הפעלה" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "ניתן לגשת לשירות D-Bus על ערוץ הפעלה" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "התקנים" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "רשאי לגשת להתקנים שונים כמו מצלמות רשת" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "רשאי לגשת להתקני קלט" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "רשאי לגשת למיקרופון ולהשמיע צליל" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "ניתן לגשת לקובצי התקן המערכת" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "תוכן מסך" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "יכול לגשת לתוכן המסך" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "תיקיית הבית" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "ניתן לצפות, לערוך וליצור קבצים" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "ניתן לצפות בקבצים" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "מערכת קבצים" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "תיקיית הורדות" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "הגדרות" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "ניתן לצפות ולשנות הגדרות" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "מערכת תצוגה מיושנת" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "משתמש במערכת תצוגה מיושנת ולא בטוחה" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "עקיפת ארגז חול" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "יכול לצאת מארגז החול ולעקוף הגבלות אחרות" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "אין תיאור זמין לעדכון." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "פרטי עדכון" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "נדרשות הרשאות נוספות" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "התקבלו מהשרת נתוני דירוגים שגויים" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "לא ניתן לתקשר עם שרת הדירוגים" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "ביקורות" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "לא נמצאו ביקורות עבור יישום זה." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "אין ביקורות" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "היסטוריית גרסאות" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "חדש בגרסה %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "גרסה %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "אין מידע עבור גרסה זו" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "‏%e ב%B ‏%Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Search for applications" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Show application details (using application ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Show application details (using package name)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Install the application (using application ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Uninstall the application (using application ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Open a local package file" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILENAME" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, or " +"‘full’" +msgstr "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, or " +"‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "הצגת קובצי metainfo או appdata מקומיים" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Enable verbose debugging output (from the running instance, if already " +"running)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installs any pending updates in the background" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Show preferences" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Quit the running instance" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Prefer local file sources to AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Show version number" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "כל הזכויות שמורות © 2016–2023 יוצרי מרכז התכנה של GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Elad Alfassa \n" +"ירון שהרבני \n" +"יוסף אור בוצ׳קו \n" +"מיזם תרגום GNOME לעברית https://l10n.gnome.org/teams/he/" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "אנו מצטערים! אין מידע עבור יישום זה." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "גודל התקנה" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "כולל %s של נתונים ו־%s של מטמון" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "כולל %s של נתונים" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "כולל %s של מטמון" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "השימוש במטמון ובנתונים לא ידוע" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "גודל הורדה" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "לא דורש הורדות מערכת נוספות" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "דורש גודל לא ידוע של הורדות מערכת נוספות" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "דורש %s של הורדות מערכת נוספות" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "הגודל לא ידוע" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "אין הרשאות" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "יש גישה לרשת" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "משתמש בשירותי מערכת" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "משתמש בשירותי הפעלה" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "רשאי לגשת להתקני חומרה" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "רשאי לגשת להתקני מערכת" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "יכול לקרוא/לכתוב את כל הנתונים שלך" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "יכול לקרוא את כל הנתונים שלך" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "יכול לקרוא/לכתוב את ההורדות שלך" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "יכול לקרוא את ההורדות שלך" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "ניתן לגשת למספר קבצים מסוימים" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "רשאי לגשת ולשנות הגדרות משתמש" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "משתמש במערכת חלונאית מיושנת" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "רשאי לקבל הרשאות שרירותיות" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "גוף פיתוח התכנה מאומת" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "נבדק על ידי מפיץ מערכת ההפעלה שלך" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "נבדק על ידי %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "מסופק על ידי צד־שלישי" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "התכנית לא נתמכת עוד" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "קוד שניתן לפקח עליו" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "רישיון לא ידוע" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "קוד קנייני" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "רישיון מיוחד" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr ", " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "מהימן" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "בטוח" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "כנראה בטוח" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "כנראה לא בטוח" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "לא בטוח" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "נייד בלבד" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "עובד על מסך קטן בלבד" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "שולחן עבודה בלבד" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "עובד על מסך גדול בלבד" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "אין התאמה בגודל המסך" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "לא תומך בגודל המסך הנוכחי שלך" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "דורש מסך מגע" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "דורש מקלדת" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "דורש עכבר" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "דרוש בקר משחקים" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "דורש בקר משחקים כדי לשחק" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "מסתגל" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "עובד על טלפונים, מחשבי לוח ושולחנות עבודה" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "כנראה דורש מקלדת או עכבר" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "עובד על שולחנות עבודה ומחשבים ניידים" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "מכיל תוכן ראוי לכל גיל" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "אין פירוט דירוג גיל זמין" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "ביקור באתר" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "התקנה…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "ביטול" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "התקנה" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "הורדה" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "עדכון" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "הסרה…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "מתבצעת הסרה" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "עדכון קריטי" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "לא נתן להשתמש בהתקן בזמן העדכון." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "מקור: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "שונה השם מ־%s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "הפסיק לקבל עדכונים" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "עדכון קריטי" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "הותקן" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "סיוע בתרגום %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s מתוכנן, מפותח ומתורגם על ידי קהילה בינלאומית של מתנדבים.\n" +"‬\n" +"‫משמעות הדבר היא שאם עדיין אין תרגום לשפה שלך, ניתן להירתם ולסייע בתרגום בעצמך." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "תרגומים" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "אתר ה_תרגום" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "נדרשת התחברות מרוחקת ‏%s (תחום %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "נדרשת התחברות" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 src/gs-dkms-dialog.ui:120 +#: src/gs-page.c:423 src/gs-removal-dialog.ui:24 src/gs-remove-app-dialog.ui:14 +#: src/gs-repos-dialog.c:174 src/gs-repos-dialog.c:250 +#: src/gs-review-dialog.ui:24 src/gs-review-row.c:235 src/gs-review-row.c:259 +#: src/gs-updates-page.c:852 src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_ביטול" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_כניסה" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_משתמש" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_סיסמה" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "אחר" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "הכול" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "מומלצים" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "בחירת העורכים" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "חדש ועדכני" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "בחירה מהרשת" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "תכניות אחרות" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "‏%s הותקן" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "יש להפעיל מחדש את המערכת על מנת שהשינויים יכנסו לתוקף" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "היישום מוכן לשימוש" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "הותקנו עדכוני מערכת" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "עדכונים אחרונים שהותקנו זמינים לצפייה" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "הפעלה מחדש" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "הפעלה" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "להתקין את התכנה?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "להתקין תכנית צד־שלישי?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "לאפשר מקורות תכנה?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "לאפשר מקורות תכנה מצד־שלישי?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"‏%s אינו תכנה " +"חופשית וקוד פתוח, ומסופק על ידי „%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "‏%s מסופק על ידי „%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "מקור תכנה זה חייב להיות פעיל על מנת להמשיך בהתקנה." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "התקנה או שימוש ב־%s עשוי להיות לא חוקי בכמה מדינות." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "התקנה או שימוש במקודדים עשוי להיות לא חוקי בכמה מדינות." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "לא לה_זהיר שוב" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "לאפשר ולה_תקין" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "להלן שגיאות מפורטות ממנהל החבילות:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "פרטים" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_סגירה" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "הפרטים הועתקו ללוח הגזירים" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_אישור" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "עדכון הותקן" +msgstr[1] "עדכונים הותקנו" +msgstr[2] "עדכונים הותקנו" +msgstr[3] "עדכונים הותקנו" + +# msgid_plural "Updates have been installed" +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "הוסרה התקנה של יישום אחד" +msgstr[1] "הוסרו התקנות של מספר יישומים" +msgstr[2] "הוסרו התקנות של מספר יישומים" +msgstr[3] "הוסרו התקנות של מספר יישומים" + +# msgid_plural "A restart is required for them to take effect." +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "יש להפעיל את המערכת מחדש כדי שהעדכון יכנס לתוקף" +msgstr[1] "יש להפעיל את המערכת מחדש כדי שהעדכונים יכנסו לתוקף" +msgstr[2] "יש להפעיל את המערכת מחדש כדי שהעדכונים יכנסו לתוקף" +msgstr[3] "יש להפעיל את המערכת מחדש כדי שהעדכונים יכנסו לתוקף" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "לא עכשיו" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "היום" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "אתמול" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "אתמול" +msgstr[1] "שלשום" +msgstr[2] "‫לפני %d ימים" +msgstr[3] "‫לפני %d ימים" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "לפני שבוע" +msgstr[1] "לפני שבועיים" +msgstr[2] "‫לפני %d שבועות" +msgstr[3] "‫לפני %d שבועות" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "לפני חודש" +msgstr[1] "לפני חודשיים" +msgstr[2] "‫לפני %d חודשים" +msgstr[3] "‫לפני %d חודשים" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "לפני שנה" +msgstr[1] "לפני שנתיים" +msgstr[2] "לפני %d שנים" +msgstr[3] "‫לפני %d שנים" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "רק עכשיו" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "לפני דקה" +msgstr[1] "לפני שתי דקות" +msgstr[2] "‫לפני %d דקות" +msgstr[3] "‫‫לפני %d דקות" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "לפני שעה" +msgstr[1] "לפני שעתיים" +msgstr[2] "‫לפני %d שעות" +msgstr[3] "‫לפני %d שעות" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "‏%s ‏‎%s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "הכול" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "מומלצים" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "גרפיקה תלת־ממדית" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "צילום" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "סריקה" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "גרפיקה וקטורית" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "מציגים" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "יצירה ועריכת שמע" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "נגני מוזיקה" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "הכול" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "מומלצים" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "לוח שנה" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "מסד נתונים" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "כספים" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "מעבד תמלילים" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "עורכי טקסט" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "דפדפנים" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "הכול" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "מומלצים" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "פעולה" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "הרפתקה" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "ארקייד" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "לבנים" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "לוח" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "קלפים" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "הדמייה" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "ילדים" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "היגיון" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "משחקי תפקידים" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "ספורט" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "אסטרטגיה" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "הכול" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "מומלצים" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "צ׳אט" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "הכול" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "מומלצים" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "בינה מלאכותית" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "אסטרונומיה" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "כימיה" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "שפות" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "מתמטיקה" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "חדשות" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "רובוטיקה" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "אומנות" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "ביוגרפיה" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "קומיקס" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "בדיוני" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "רפואה" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "היסטוריה" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "אורח חיים" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "פוליטיקה" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "ספורט" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "הכול" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "מומלצים" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "מנפי שגיאות" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "סביבות פיתוח משולבות (IDE)" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "מקודדים" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "התקני חומרה" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "גופנים" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "מקורות קלט" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "חבילות שפה" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "בנאום" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "יצירה" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "עבודה" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "משחקים" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "תקשורת" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "לימודים" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "פיתוח" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "מקודדים" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "מנהלי התקני חומרה" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "גופנים" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "מקורות קלט" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "חבילות שפה" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "בינאום" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "יישום" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s דורש תמיכה בתבנית קובץ נוספת." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "נדרש סוג MIME נוסף" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s דורש גופנים נוספים." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "נדרשים גופנים נוספים" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "‫%s דורש מפענחים נוספים." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "נדרשים מפענחים נוספים" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s דורש התקני מדפסת נוספים." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "נדרשים התקני מדפסת נוספים" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s דורש חבילות נוספות." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "נדרשות חבילות נוספות" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "חיפוש בין התכניות" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "לה_ציג עוד" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "לה_ציג פחות" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "בהסרה…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "נדרשת הפעלה מחדש כדי לסיים את ההתקנה" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "נדרשת הפעלה מחדש כדי לסיים את ההסרה" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "בהמתנה להתקנה…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "בהמתנה לעדכון…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "בהורדה…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "בהכנה…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "מתבצעת הסרת התקנה…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "‏%s לא מותקן, אבל עדיין מידע ממנו קיים." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "הפעלה מ_חדש" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "ה_פעלה…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "ה_תקנה…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "‏%s יופיע באנגלית אמריקאית" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "יישום זה יופיע באנגלית אמריקאית" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "יישום זה יופיע באנגלית אמריקאית" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "_עזרה בתרגום" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "יישומים נוספים מאת %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "המפתח %s הוכיח את הבעלות על %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "המפתח הוכיח את הבעלות על %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "נדרשת גישה לרשת אל מנת לכתוב ביקורת" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "יישום זה לא מקבל עוד עדכונים, לרבות תיקוני אבטחה" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "יישום זה כבר מסופק על ידי ההפצה שלך, ואין צורך להחליפו." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "יישום זה לא מספק קישורים כלשהם לאתר, למאגר קוד או למערכת מעקב תקלות." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "תכנה זו לא מקבלת עוד עדכונים, לרבות תיקוני אבטחה" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "תכנה זו כבר מסופקת על ידי ההפצה שלך, ואין צורך להחליפה." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"התכנית הזאת לא מספקת קישורים כלשהם לאתר, למאגר קוד או למערכת מעקב תקלות." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "נכשלה קבלת מידע עבור „%s” ולכן לא ניתן להציג את הפרטים עבור יישום זה." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "התקבלה תגובת סקירה שגויה מהשרת" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "ארע כשל בהעלאת הביקורת על „%s”: ‏‎%s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "דף פרטים" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "פרטי יישום נטענים" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "אומת" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_פתיחה" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_עדכון" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "הסרת התקנה" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "תוספים" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "יישום זה ניתן לשימוש רק כאשר יש חיבור אינטרנט פעיל." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "מקור תכנה כלול" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "יישום זה כולל מקור תכנה המספק עדכונים, כמו גם גישה לתכנה אחרת." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "לא כלול אף מקור תכנה" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "יישום זה אינו כולל אף מקור תכנה. הוא לא יעודכן בגרסאות חדשות." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "מקור תכנה מזוהה" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "הוספת מקור תכנה זה ייתן לך גישה לתכנות ושדרוגים נוספים." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "יש להשתמש אך ורק במקורות תכנה מהימנים לך." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "ניקוי נתוני יישום" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_מחיקת נתונים" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "אין נתוני על" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_אתר המיזם" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_תרומה" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "תרומת _תרגומים" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_דיווח על תקלה" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "ע_זרה" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "יצירת _קשר" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "כתיבת _ביקורת" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "כל הביקורות" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "לא ניתן להציג את פרטי היישום" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "הכנת הטעינה מחדש נכשלה" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "שגיאה לא ידועה" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "המפתח לא נמצא" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "המפתח לא נרשם" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "צריך רישום MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "ה_בא" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a password " +"to be entered later in the process. Please note down the following password " +"associated with the key:" +msgstr "" +"במכשיר הזה מופעל Secure Boot (טעינה מאובטחת). כדי לאפשר הפעלת מנהלי התקנים " +"חדשים, צריך לרשום מפתח בעלות מכונה (MOK) חדש. התהליך דורש ססמה שתוקלד בהמשך " +"התהליך. נא לתעד את הססמה הבאה שמשויכת עם המפתח הזה:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "רשמתי לי ב_צד את ססמת ה־MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "הפעלה מ_חדש ורישום…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "הנחיות התקנה: נא לקרוא בעיון" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"לאחר הפעלה מחדש, יופיע מסך התקנת מכשיר. כדי להפעיל מנהלי התקנים חדשים, יש " +"להמשיך בשלבי ההתקנה:" + +# המילים שאינן מתורגמות הן חלק מה־EFI, נכון להיום אין הרבה סיכוי שהן אי פעם תתורגמנה. +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• יש לבחור ב־„Enroll MOK”\n" +"• ב־„Yes” כדי לרשום מפתחות\n" +"• למלא את ססמת ה־MOK כשמופיעה בקשה\n" +"• לאחר מכן לבחור ב־„Reboot”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "השלכות אבטחת מידע" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"לאחר רישום מפתחות מוצלח, ראוי לשים לב שעדכונים עתיקיים למודול או לכל מודול " +"אחר ייחשבו לאמינים. כל העדכונים העתידיים יתבצעו מאחורי הקלעים בלי צורך " +"בהתערבות או במתן אישור." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"אפשר למצוא הנחיות נוספות בעמוד המסמכים." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "קובצי נתוני העל הנוספים מתקבלים…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " וגם " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "גופנים זמינים עבור הסקריפט %s" +msgstr[1] "‫גופנים זמינים עבור הסקריפטים %s" +msgstr[2] "גופנים זמינים עבור הסקריפטים %s" +msgstr[3] "‫גופנים זמינים עבור הסקריפטים %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "תכניות זמינות עבור %s" +msgstr[1] "‫תכניות זמינות עבור %s" +msgstr[2] "‫תכניות זמינות עבור %s" +msgstr[3] "‫תכניות זמינות עבור %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "לא נמצאה התכנה הדרושה" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "איתור התכנית המבוקשת נכשל" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s לא נמצא" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "באתר האינטרנט" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "אין יישומים זמינים המספקים את הקובץ %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might be " +"found %s." +msgstr "מידע על %s, כמו גם אפשרויות לקבלת יישומים חסרים ניתן למצוא %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "אין יישומים זמינים עבור תמיכה ב־%s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s אינו זמין." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "מידע על %s, כמו גם אפשרויות לקבלת יישום התומך בתבנית זו ניתן למצוא %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "אין גופנים זמינים עבור תמיכה בתסריט %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "מידע על %s, כמו גם אפשרויות לקבלת גופנים נוספים ניתן למצוא %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "לא זמינים מקודדים עבור התבנית %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can play " +"this format might be found %s." +msgstr "" +"מידע על %s, כמו גם אפשרויות לקבלת מקודד היודע לנגן תבנית זו ניתן למצוא %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "אין משאבי פלזמה זמינים עבור תמיכה ב־%s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "מידע על %s, כמו גם אפשרויות לקבלת משאבי פלזמה נוספים ניתן למצוא %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "אין התקני מדפסת זמינים עבור %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"מידע על %s, כמו גם אפשרויות לקבלת התקנים התומכים במדפסת זו ניתן למצוא %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "תיעוד" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "לא ניתן למצוא את %s שנדרש על ידי %s. נא לעיין ב%s למידע נוסף." +msgstr[1] "‫לא ניתן למצוא את %s שנדרשו על ידי %s. נא לעיין ב%s למידע נוסף." +msgstr[2] "‫לא ניתן למצוא את %s שנדרש על ידי %s. נא לעיין ב%s למידע נוסף." +msgstr[3] "‫לא ניתן למצוא את %s שנדרש על ידי %s. נא לעיין ב%s למידע נוסף." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "לא הצלחנו למצוא את %s שחיפשת. נא לעיין ב%s למידע נוסף." +msgstr[1] "‫לא הצלחנו למצוא את %s שחיפשת. נא לעיין ב%s למידע נוסף." +msgstr[2] "‫לא הצלחנו למצוא את %s שחיפשת. נא לעיין ב%s למידע נוסף." +msgstr[3] "‫לא הצלחנו למצוא את %s שחיפשת. נא לעיין ב%s למידע נוסף." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "איתור תוצאות חיפוש נכשל: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s תבנית קובץ" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "התקנת ה_כל" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "לא ניתן למצוא את התכנה הדרושה" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "דף מקודדים" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "לא נמצאו תוצאות" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "לא ניתן לבצע חיפוש" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "הקודם" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "הבא" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "רשימת יישומים מומלצים" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "תמיכה בשולחן עבודה" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "תומך אפשרות לשימוש במסך גדול" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "התמיכה בשולחן עבודה לא ידועה" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "אין מספיק פרטים לדעת אם יש תמיכה במסכים גדולים" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "דורש מסך גדול" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "אין תמיכה בשולחן עבודה" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "לא זמין לשימוש במסך גדול" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "תמיכה בניידים" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "תומך אפשרות לשימוש במסך קטן" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "התמיכה בניידים לא ידועה" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "אין מספיק פרטים לדעת אם יש תמיכה במסכים קטנים" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "דורש מסך קטן" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "אין תמיכה בניידים" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "אי אפשר להשתמש במסך קטן" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "תמיכה במקלדת" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "תמיכה במקלדת לא ידועה" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "אין מספיק פרטים לדעת אם יש תמיכה במקלדות" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "דורש מקלדת" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "תומך במקלדות" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "אין תמיכה במקלדת" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "אי אפשר להשתמש עם מקלדת" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "תמיכה בעכבר" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "דורש עכבר או התקן הצבעה" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "התמיכה בעכבר לא ידועה" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "Not enough information to know if mice or pointing devices are supported" +msgstr "אין מספיק פרטים לדעת אם יש תמיכה בעכברים או בהתקני הצבעה" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "דרוש עכבר" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "תומך בעכברים ובהתקני הצבעה" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "אין תמיכה בעכבר" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "לא זמין לשימוש עם עכבר או התקן הצבעה" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "תמיכה במסך מגע" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "התמיכה במסך מגע אינה ידועה" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "אין מספיק פרטים כדי לדעת אם יש תמיכה במסך מגע" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "דרוש מסך מגע" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "תומך במסכי מגע" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "אין תמיכה במסך מגע" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "לא ניתן לשימוש עם מסך מגע" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "דרוש בקר משחקים" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "דורש בקר משחקים" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "תמיכה בבקר משחקים" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "תמיכה בבקרי משחקים" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "‫%s ודאי יעבוד על מכשיר זה" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "‫%s יעבוד על מכשיר זה" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "‫%s כנראה יעבוד על מכשיר זה" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "‫%s לא יעבוד כראוי במכשיר הזה" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "‫%s לא יעבוד על מכשיר זה" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "תמיכה בחומרה" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "ניווט" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "ניווט לדף הסיור" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "ניווט לדף ההתקנה" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "ניווט לדף עדכונים" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "פתיחת שורת חיפוש" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "חלונות" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "פתיחת העדפות" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "פתיחת מקורות תכנה" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "עזרה" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "פתיחת צירופי מקשים" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "מותקן" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "דף התקנה" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "בתהליך" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "יישומים" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "יישום רשת" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "יישומי מערכת" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "נבנה על ידי הקהילה" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "הי_רתמות" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released " +"under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"יישום זה מפותח בגלוי על ידי קהילה של מתנדבים, וכפוף %s " +"לרישיון.\n" +"‬\n" +"‫אפשר לתרום ולסייע לשפר אותו." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released " +"under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"יישום זה מפותח בגלוי על ידי קהילה של מתנדבים והוא כפוף לרישיון ‎%s‎.\n" +"\n" +"‫אפשר לתרום ולסייע לשפר אותו." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"התכנית הזאת מפותחת בגלוי על ידי קהילה של מתנדבים, וכפופה %s " +"לרישיון.\n" +"‬\n" +"‫אפשר לתרום ולסייע לשפר אותה." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"התכנית הזאת מפותחת בגלוי על ידי קהילה של מתנדבים והיא כפופה לרישיון ‎%s‎.\n" +"\n" +"‫אפשר לתרום ולסייע לשפר אותה." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "רישיון לא ידוע" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_ללמוד עוד" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"יישום זה מפותח ברישיון לא ידוע, ואף יתכן שהוא יישום קנייני. קשה יותר למצוא בו " +"בעיות אבטחה, והוא עשוי לעבור שינויים ללא פיקוח.\n" +"\n" +"‫יתכן ולא תהיה לך אפשרות לתרום ליישום זה." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"תכנית זו מפותחת ברישיון לא ידוע, ואף יתכן שהיא תכנה קניינית. קשה יותר למצוא " +"בה בעיות אבטחה, והיא עשויה לעבור שינויים ללא פיקוח.\n" +"\n" +"‫יתכן ולא תהיה לך אפשרות לתרום לתכנית הזאת." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "קנייני" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"יישום זה אינו מפותח בגלוי, לכן רק המפתחים שלו יודעים איך הוא עובד. קשה יותר " +"למצוא בו בעיות אבטחה, והוא עשוי לעבור שינויים ללא פיקוח.\n" +"\n" +"‫אין לך אפשרות לתרום לתכנית הזאת." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"תכנית זו אינה מפותחת בגלוי, לכן רק המפתחים שלה יודעים איך היא עובדת. קשה יותר " +"למצוא בה בעיות אבטחה, והיא עשויה לעבור שינויים ללא פיקוח.\n" +"\n" +"‫אין לך אפשרות לתרום לתכנית הזאת." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "רישיון מיוחד" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"יישום זה מפותח בכפוף לרישיון המיוחד %s.\n" +"\n" +"יתכן ולא תהיה לך אפשרות לתרום ליישום זה." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"יישום זה מפותח בכפוף לרישיון המיוחד „%s”.\n" +"\n" +"יתכן ולא תהיה לך אפשרות לתרום ליישום זה." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"התכנית מפותחת בכפוף %s לרישיון.\n" +"‬\n" +"‫יתכן ולא תהיה באפשרותך לתרום ולסייע לשפר אותה." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"התכנית מפותחת בכפוף לרישיון „%s”.\n" +"‬\n" +"‫יתכן ולא תהיה באפשרותך לתרום ולסייע לשפר אותה." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "מרענן מידע" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "דף בטעינה" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "מתחיל" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "מקור לא ידוע" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "בטא" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "משתמש" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "נוספו" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "הוסרו" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "עדכונים" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "שונמכו" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "מקורות חיצוניים נבחרים" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"מספק גישה לתכניות נוספות דרך %s. כולל גם תכנות קנייניות.\n" +"\n" +"ניתן לאפשר מאגרים אלה מאוחר יותר בהעדפות מקורות תכנה." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "לאפשר מקורות תכנה מצד שלישי?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "ה_תעלמות" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "ל_אפשר" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "זמין עבור מערכת ההפעלה שלך" + +# msgid_plural "Available software for %s" +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "זמין עבור %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "חשיפה" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "דף סקירה" + +# msgid_plural "Available software for %s" +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "יישומים זמינים" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "קטגוריות אחרות" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "לא נמצא מידע על יישומים" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "לא ידועה" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_אישור" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "המשתמש דחה את ההתקנה" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "מכין את %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "להסיר את המקור %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"כל היישומים מהמקור %s יוסרו, ויהיה עליך להתקין מחדש את המקור על מנת להשתמש " +"בהם שוב." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "להסיר את התקנת %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "לא תהיה אפשרות להשתמש ביישום %s לאחר ההסרה שלו." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "לא תהיה אפשרות להשתמש באף יישום התלוי ב־%s לאחר ההסרה שלו." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"לא תהיה אפשרות להשתמש בגופן %s לאחר ההסרה שלו, ובכל מסמך שנעשה בו שימוש יופיע " +"גופן שונה." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"לא תהיה אפשרות להשתמש במקודד %s לאחר ההסרה שלו. המשמעות לכך היא שלא יהיה ניתן " +"להפעיל כמה סוגי קובצי מדיה." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "חומרה התלויה בקושחה %s לא תפעל כראוי לאחר הסרתה." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"תהיה אפשרות לחזור ולהשתמש ביישום %s לאחר ההסרה. נתוני היישום וההגדרות שלו " +"ישמרו על הכונן, על מנת לאפשר שחזור של היישום בעתיד." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "העדפות" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "עדכוני תכנה" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "מידע נוסף" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"בדיקה והורדת עדכונים משתמשת בנתונים וצורכת חשמל. משכך, תכונת בדיקת אוטומטית " +"מושהית כאשר ההתחברות לרשת מוגבלת או בזמן שחיסכון בחשמל פועל." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_אוטומטי" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "בדיקה והורדה אוטומטית של עדכונים" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_ידני" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "בדיקה והורדת עדכונים תתבצע בצורה ידנית בלבד" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "ה_תרעות עדכונים אוטומטיים" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "הצגת התרעות עם התקנת עדכונים אוטומטיים" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "סינון תוכן" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "תכנה _חופשית בלבד" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "הסתרת תכנה קניינית בסיור ובחיפוש" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "הצגת מפתחים _מאומתים בלבד" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "הצגת יישומים ממפתחים שזהותם אומתה" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically removed " +"during upgrade." +msgstr "כמה מהתכנות המותקנות אינן תואמות עם %s, ותוסרנה אוטומטית בזמן השדרוג." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "תכנה לא תואמת" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_שדרוג" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "ה_סרת התקנה" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "הגדרות יישום ונתונים" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_שמירה" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "לאפשר שחזור נתוני היישום וההגדרות שלו" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_מחיקה" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "למחוק את הנתונים לצמיתות על מנת לחסוך מקום בכונן" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "תכניות שהותקנו דרך „%s” תפסקנה לקבל עדכונים." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "להשבית מאגר?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "להסיר מאגר?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "ה_שבתה" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "ה_סרה" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "הפעלת מאגרים חדשים" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "להפעיל מאגרים חדשים ברגע הוספתם" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "מידע נוסף" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "מאגרים נוספים ממקורות צד־שלישי נבחרים — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "מאגרי צד־שלישי של פדורה" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "מערכת ההפעלה" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "מקור זה משלים את התכנה המסופקת על ידי %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "מקורות תכנה" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "אין מאגרים" + +# msgid_plural "%u applications installed" +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "הותקן יישום אחד" +msgstr[1] "הותקנו שני יישומים" +msgstr[2] "‫הותקנו %u יישומים" +msgstr[3] "‫הותקנו %u יישומים" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "תוסף אחד הותקן" +msgstr[1] "שני תוספים הותקנו" +msgstr[2] "‫%u תוספים הותקנו" +msgstr[3] "‏‫%u תוספים הותקנו" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "יישום אחד" +msgstr[1] "שני יישומים" +msgstr[2] "‏%u יישומים" +msgstr[3] "‏%u יישומים" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "תוסף אחד" +msgstr[1] "שני תוספים" +msgstr[2] "־‫‏%u תוספים" +msgstr[3] "־‫%u תוספים" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "‫%s ו%s הותקנו" +msgstr[1] "‫%s ו%s הותקנו" +msgstr[2] "‫%s ו%s הותקנו" +msgstr[3] "‏‫%s ו%s הותקנו" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "בודק את התכנה שהותקנה…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "הסרה" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "שנוּא" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "לא משהו" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "בסדר" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "חביב" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "אהוב" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "יש לבחור כוכב על מנת להשאיר דירוג" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "נא להשקיע קצת יותר בכתיבת הביקורת" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "נא לבחור מספר כוכבים לדירוג" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "הביקורת קצרה מדי" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "הביקורת ארוכה מדי" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "התיאור קצר מדי" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "התיאור ארוך מדי" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "כתיבת ביקורת" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_שליחה" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"נא לספק טקסט דירוג, תקציר וסקירה. אין להשתמש בסקירות כדי לדווח על תקלות: " +"במקום, יש לפנות למפתחים או לספק השירות שלך." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "תקציר הביקורת" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "כתיבת תקציר לביקורת" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"ניתן לראות איזה מידע נשלח במדיניות " +"הפרטיות שלנו. השם המלא מהחשבון שלך יוצג באופן גלוי לציבור." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "סקירה אחת בסך הכול" +msgstr[1] "שתי סקירות בסך הכול" +msgstr[2] "‫%u סקירות בסך הכול" +msgstr[3] "‫%u סקירות בסך הכול" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "מתוך 5 כוכבים" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "לא ידוע" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "ניתן לדווח על ביקורת מעליבה, גסה או משפילה." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "לאחר הדיווח, הביקורת תוסתר עד שתיבדק על יד ההנהלה." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "לדווח על הביקורת?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_דיווח" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "למחוק את הביקורת?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "לא יהיה ניתן לשחזר את הביקורת לאחר המחיקה." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "ביקורת חיובית" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "ביקורת שלילית" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "דיווח…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "הסרה…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "היישום אינו מבודד אך ההפצה בדקה שאינו זדוני" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "נא לוודא שהספק הזה מהימן, כיוון שהיישום אינו מבודד" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "אין הרשאות" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "היישום מבודד לחלוטין" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "גישה לרשת" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "יכול לגשת לאינטרנט" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "אין גישה לרשת" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "לא ניתן לגשת לרשת האינטרנט" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "משתמש בשירותי מערכת" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "יכול לבקש נתונים משירותי המערכת" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "משתמש בשירותי הפעלה" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "יכול לבקש נתונים משירותי ההפעלה" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "גישה להתקני משתמש" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "יכול לגשת להתקנים כגון מצלמות או בקרי משחקים" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "אין גישה להתקני משתמש" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "לא יכול לגשת להתקנים כגון מצלמות או בקרי משחקים" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "גישה להתקני קלט" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "גישה למיקרופון והשמעת צליל" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "יכול להאזין באמצעות המיקרופון ולנגן צלילים מבלי לבקש הרשאה" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "גישה להתקני מערכת" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "יכול לגשת להתקני מערכת הדורשים הרשאות מיוחדות" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "גישה לתוכן המסך" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "יכול לגשת לתוכן של המסך או של חלונות אחרים" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "מערכת חלונאית מיושנת" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "הרשאות שרירותיות" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "הגדרות משתמש" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "גישת קריאה/כתיבה מלאה למערכת הקבצים" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "יכול לקרוא ולכתוב את כל הנתונים במערכת הקבצים" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "גישת קריאה/כתיבה לתיקיית הבית" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "יכול לקרוא ולכתוב את כל הנתונים בתיקיית הבית שלך" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "גישה מלאה לקרוא ממערכת הקבצים" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "יכול לקרוא את כל הנתונים ממערכת הקבצים" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "גישה לקריאת תיקיית הבית" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "יכול לקרוא את כל הנתונים בתיקיית הבית שלך" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "גישת קריאה/כתיבה לתיקיית ההורדות" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "יכול לקרוא ולכתוב את כל הנתונים בתיקיית ההורדות שלך" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "גישה לקריאה מתיקיית ההורדות" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "יכול לקרוא את כל הנתונים בתיקיית ההורדות שלך" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "יכול לקרוא ולכתוב את כל הנתונים בתיקייה" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "יכול לקרוא את כל הנתונים בתיקייה" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "אין גישה למערכת הקבצים" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "אין גישה כלל למערכת הקבצים" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "גוף פיתוח היישום מאומת" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "גוף הפיתוח של היישום הזה אומת והוא אכן מי שהוא טוען שהוא" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "תלויות מפוקפקות" + +#: src/gs-safety-context-dialog.c:399 +msgid "Software or its dependencies are no longer supported and may be insecure" +msgstr "התמיכה בתכנית או בתלויות שלה נגמרה והן עלולות להיות מפוקפקות" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "יישום זה לא מספק את הרישיון אליו הוא כפוף, ויתכן שהוא קנייני" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may be " +"proprietary" +msgstr "תכנה זו לא מספקת את הרישיון אליה היא כפופה, ויתכן שהיא קניינית" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "קוד קנייני" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"קוד המקור אינו ציבורי, לכן אין אפשרות לפקח עליו באופן עצמאי והוא עשוי להיות " +"לא בטוח" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "יישום זה מפותח בכפוף לרישיון המיוחד „%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "התכנית הזאת מפותחת בכפוף לרישיון „%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "קוד שניתן לפקח עליו" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"קוד המקור ציבורי וניתן לפקח עליו באופן בלתי תלוי, מה שאומר שסביר להניח " +"שהיישום די בטוח" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "היישום %s סופק על ידי המפיץ" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "היישום ‫%s בטוח" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "היישום ‫%s כנראה בטוח" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "היישום ‫%s עשוי להזיק" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "היישום ‫%s אינו בטוח" + +# msgctxt "Distribution name" +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "לא ידוע" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "אבטחה" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "רישיון" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "מקור" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "‫SDK (ערכת פיתוח)" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"יישום זה מבוסס על גרסה מיושנת של ערכת פיתוח (SDK) ועשוי להכיל יישומים או " +"פרצות אבטחה שלא יתוקנו." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "צילום המסך הקודם" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "צילום המסך הבא" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "אין צילומי מסך" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "לא נמצא צילום מסך" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "טעינת התמונה נכשלה" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "גודל צילום מסך לא נמצא" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "לא ניתן ליצור מטמון" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "צילום מסך לא תקף" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "אין צילום מסך" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "צילום מסך" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "עוד תוצאה אחת" +msgstr[1] "עוד שתי תוצאות" +msgstr[2] "עוד %u תוצאות" +msgstr[3] "‫עוד %u תוצאות" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "דף חיפוש" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "חיפוש אחר יישומים" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "לא נמצאו יישומים" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "‏„%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "לא ניתן להוריד עדכונים" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "לא ניתן להוריד עדכוני קושחה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "לא ניתן להוריד עדכוני קושחה מ־%s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "לא ניתן להוריד עדכונים מ־%s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "לא ניתן לעדכן: נדרשת גישה לאינטרנט" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "לא ניתן לעדכן: אין מספיק מקום בכונן" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "לא ניתן להוריד עדכונים מ־%s: אין מספיק מקום בכונן" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "לא ניתן לעדכן: נדרש אימות" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "לא ניתן לעדכן: האימות לא היה תקין" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "לא ניתן לעדכן: נדרשת הרשאה" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "לא ניתן להוריד עדכונים: אין לך את ההרשאות להתקנה תכנה" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "לא ניתן לקבל את רשימת העדכונים" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "לא ניתן להתקין: ההורדה נכשלה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "לא ניתן להתקין את %s: ההורדה מ־%s נכשלה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "לא ניתן להתקין את %s: ההורדה נכשלה" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "לא ניתן להתקין: חסרים רכיבי זמן ריצה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "לא ניתן להתקין את %s: ספריית זמן הריצה %s אינה זמינה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "לא ניתן להקין את %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "לא ניתן להתקין: נדרשת גישה לאינטרנט" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "לא ניתן להתקין: ליישום יש תבנית לא חוקית" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "לא ניתן להתקין: אין מספיק מקום בכונן" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "לא ניתן להתקין את %s: אין מספיק מקום בכונן" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "לא ניתן להתקין: נדרש אימות" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "לא ניתן להתקין את %s: נדרש אימות" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "לא ניתן להתקין: האימות לא היה תקין" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "לא ניתן להתקין את %s: האימות לא היה תקין" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "לא ניתן להתקין: נדרשת הרשאה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "לא ניתן להתקין את %s: נדרשת הרשאה" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "לא ניתן להתקין: ההתקן צריך להיות מחובר לחשמל" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "לא ניתן להתקין את %s: ההתקן חייב להיות מחובר לחשמל" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "לא ניתן להתקין: סוללה חלשה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "לא ניתן להתקין את %s: סוללה חלשה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "לא ניתן לעדכן את %s מ־%s: ההורדה נכשלה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "לא ניתן לעדכן את %s: ההורדה נכשלה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "לא ניתן להתקין עדכונים מ־%s: שההורדה נכשלה" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "לא ניתן לעדכן: ההורדה נכשלה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "לא ניתן לעדכן את %s: אין מספיק מקום בכונן" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "לא ניתן לעדכן את %s: נדרש אימות" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "לא ניתן לעדכן את %s: האימות לא היה תקין" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "לא ניתן לעדכן את %s: נדרשת הרשאה" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "לא ניתן לעדכן: ההתקן חייב להיות מחובר לחשמל" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "לא ניתן לעדכן את %s: ההתקן חייב להיות מחובר לחשמל" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "לא ניתן לעדכן: סוללה חלשה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "לא ניתן לעדכן את %s: סוללה חלשה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "לא ניתן לעדכן את %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "לא ניתן לעדכן" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "לא ניתן לשדרג" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "לא ניתן לשדרג אל %s מ־%s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "לא ניתן לשדרג: ההורדה נכשלה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "לא ניתן לשדרג אל %s: ההורדה נכשלה" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "לא ניתן לשדרג: נדרשת גישה לאינטרנט" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "לא ניתן לשדרג אל %s: נדרשת גישה לאינטרנט" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "לא ניתן לשדרג: אין מספיק מקום בכונן" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "לא ניתן לשדרג אל %s: אין מספיק מקום בכונן" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "לא ניתן לשדרג: נדרש אימות" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "לא ניתן לשדרג אל %s: נדרש אימות" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "לא ניתן לשדרג: האימות לא היה תקין" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "לא ניתן לשדרג אל %s: האימות לא היה תקין" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "לא ניתן לשדרג: נדרשת הרשאה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "לא ניתן לשדרג אל %s: נדרשת הרשאה" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "לא ניתן לשדרג: ההתקן חייב להיות מחובר לחשמל" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "לא ניתן לשדרג אל %s: ההתקן חייב להיות מחובר לחשמל" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "לא ניתן לשדרג: סוללה חלשה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "לא ניתן לשדרג אל %s: סוללה חלשה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "לא ניתן לשדרג אל %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "לא ניתן להסיר את ההתקנה: נדרש אימות" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "לא ניתן להסיר את ההתקנה של %s: נדרש אימות" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "לא ניתן להסיר את ההתקנה: האימות לא היה תקין" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "לא ניתן להסיר את ההתקנה של %s: האימות לא היה תקין" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "לא ניתן להסיר את ההתקנה: נדרשת הרשאה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "לא ניתן להסיר את ההתקנה של %s: נדרשת הרשאה" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "לא ניתן להסיר את ההתקנה: ההתקן חייב להיות מחובר לחשמל" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "לא ניתן להסיר את ההתקנה של %s: ההתקן חייב להיות מחובר לחשמל" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "לא ניתן להסיר את ההתקנה: סוללה חלשה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "לא ניתן להסיר את ההתקנה של %s: סוללה חלשה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "לא ניתן להסיר את התקנת %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "לא ניתן להפעיל את %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1940 +msgid "Sorry, something went wrong" +msgstr "משהו לא עבד, עמך הסליחה" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "לא ניתן להפעיל את %s: ‏%s לא מותקן" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1920 +msgid "Not enough disk space for operation" +msgstr "אין מספיק מקום פנוי בכונן כדי לבצע פעולה זו" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "לא ניתן להתקין: סוג הקובץ לא נתמך" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "לא ניתן להתקין: האימת לא היה תקין" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "לא ניתן להקין" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "לא ניתן ליצור קשר עם %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1924 +msgid "Restart Software to use new plugins" +msgstr "יש להפעיל מחדש את מרכז התכנה כדי להשתמש בתוספים חדשים" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1928 +msgid "Device needs to be plugged in" +msgstr "ההתקן צריך להיות מחובר לחשמל" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1931 +msgid "Battery level is too low" +msgstr "הסוללה חלשה מדי" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "מ_קורות תכנה" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_העדפות" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_צירופי מקשים" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_על תכנה" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "חיפוש" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "תפריט ראשי" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "חיפוש יישומים" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_סיור" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_מותקן" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_עדכונים" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "חזרה" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "אין" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "נתוני יישום" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "נתונים שנדרשים ליישום כדי לפעול" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "נתוני משתמש" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "הנתונים שנוצרו על ידיך ביישום" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "נתונים במטמון" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "נתונים שנשמרו במטמון זמנית" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "היישום עצמו" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "תלויות נדרשות" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "רכיבי מערכת שיתופיים שנדרשים ליישום זה" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "לא ידוע" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"נתונים ששמורים במטמון ניתן לפינוי דרך ה_גדרות היישום" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "אחסון" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "‏%s (הותקן)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "‏%s (בהתקנה)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "‏%s (בהורדה)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "‏%s (בהסרה)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_פרטים" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_בחינה" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "מותקן על %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "עדכונים מותקנים" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "לא הותקנו עדכונים" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "העדכונים אינם בתוקף" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "נא לבדוק אם יש עדכונים תוכנה זמינים" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "עדכונים מהותיים מוכנים להתקנה" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "יש להתקין עדכונים מהותיים במהירות האפשרית" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "עדכונים מהותיים זמינים להורדה" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "להוריד עדכונים מהותיים במהירות האפשרית" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "עדכונים מוכנים להתקנה" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "עדכוני תכנה מוכנים וממתינים" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "עדכונים זמינים להורדה" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "ניתן להוריד עדכוני תכנה" + +# msgid_plural "%u Applications Updated — Restart Required" +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "יישום אחד עודכן - נדרשת הפעלה מחדש" +msgstr[1] "שני יישומים עודכנו - נדרשת הפעלה מחדש" +msgstr[2] "‫‏%u יישומים עודכנו - נדרשת הפעלה מחדש" +msgstr[3] "‫‏%u יישומים עודכנו - נדרשת הפעלה מחדש" + +# msgid_plural "%u Applications Updated" +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "יישום אחד עודכן" +msgstr[1] "שני יישומים עודכנו" +msgstr[2] "‫‏%u יישומים עודכנו" +msgstr[3] "‫‏%u יישומים עודכנו" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "‏%s עודכן." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "יש להפעיל את היישום מחדש." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "‏%s ו־%s עודכנו." + +# msgid_plural "%u applications require a restart." +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "יישום אחד דורש הפעלה מחדש." +msgstr[1] "שני יישומים דורשים הפעלה מחדש." +msgstr[2] "‫%u יישומים דורשים הפעלה מחדש." +msgstr[3] "‫%u יישומים דורשים הפעלה מחדש." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "כולל ‏%s, ‏%s ו־%s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "המערכת הגיעה לסיום התמיכה שלה" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "יש לשדרג כדי להמשיך לקבל עדכונים" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "גרסה חדשה של %s זמינה להתקנה" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "שדרוג תכנה זמין" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "עדכון התכנה נכשל" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "עדכונים שהוכנו לא הותקנו" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "הצגת פרטים" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "עדכון המערכת הושלם" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "ברוך בואך אל %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "הותקן עדכון תכנה" +msgstr[1] "הותקנו עדכוני תכנה" +msgstr[2] "הותקנו עדכוני תכנה" +msgstr[3] "הותקנו עדכוני תכנה" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "הותקן עדכון חשוב למערכת הפעלה." +msgstr[1] "הותקנו עדכונים חשובים למערכת הפעלה." +msgstr[2] "הותקנו עדכונים חשובים למערכת הפעלה." +msgstr[3] "הותקנו עדכונים חשובים למערכת הפעלה." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "ביקורת" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "העדכון נכשל" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "המערכת כבר היתה עדכנית." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "העדכון בוטל." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"נדרשה גישה לאינטרנט אך זו לא היתה זמינה. נא לוודא כי יש לך גישה לאינטרנט ואחר " +"כך לנסות שוב." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "היתה בעיית אבטחה עם העדכון. נא להתייעץ עם ספק התכנה שלך למידע נוסף." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "There wasn’t enough disk space. Please free up some space and try again." +msgstr "לא היה מספיק מקום פנוי בכונן הקשיח שלך. נא לפנות מקום ולנסות שוב." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update and " +"try again. If the problem persists, contact your software provider." +msgstr "" +"עמך הסליחה: התקנת העדכון נכשלה. נא להמתין לעדכון נוסף ולנסות שוב. אם הבעיה " +"נמשכת, נא ליצור קשר עם ספק התכנה שלך." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "בדיקה אחרונה: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "עצירה" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "בדיקת עדכונים" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "‏%s %s הפסיק לקבל עדכוני תכנה חיוניים" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "מערכת ההפעלה שלך הפסיקה לקבל עדכוני תכנה חיוניים" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "עשויים לחול חיובים" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "בדיקת עדכונים תוך שימוש בפס רחב נייד עשויה לשאת בחיובים נוספים." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_לבדוק בכל מקרה" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "שדרוג תכנה הורד" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "שדרוגים מוכנים להתקנה" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "בדיקת עדכונים" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "עדכונים" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "דף עדכונים" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "העדכונים נטענים" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "פעולה זו עשויה לקחת זמן מה" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "עדכני" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "להשתמש בחבילת הגלישה?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "בדיקת עדכונים תוך שימוש בפס רחב נייד עשויה לשאת בחיובים נוספים" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "ל_בדוק בכל מקרה" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "אין חיבור" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "יש להתחבר לאינטרנט כדי לבדוק אם יש עדכונים" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "הגדרות _רשת" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "שגיאה" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "עדכונים מנוהלים אוטומטית" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "עדכוני התכנה מושהים" + +#: src/gs-updates-paused-banner.c:47 +msgid "Automatic software updates have been paused for the following reasons:\n" +msgstr "עדכוני תוכנה אוטומטיים הושהו מהסיבות הבאות:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• החיבור הנוכחי לרשת מדוד" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• החיבור הנוכחי לרשת מונע הורדות גדולות" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• מצב חיסכון בחשמל פעיל" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• מצב משחק פעיל" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "עדכוני התכנה מושהים" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "החיבור לרשת מדוד - עדכוני תכנה מושהים" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "החיבור לרשת מונע הורדות גדולות - עדכוני תכנה מושהים" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "מצב חיסכון בחשמל פעיל - עדכוני תכנה מושהים" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "מצב משחקים פעיל - עדכוני תכנה מושהים" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "ה_פעלה מחדש ועדכון…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "עדכון של ה_כול" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "עדכוני תכנה הורדו" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "עדכונים מוכנים להתקנה" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "קושחה מוטמעת" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "נדרשת הפעלה מחדש" + +# msgctxt "Packages to be updated during a system upgrade" +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "עדכוני יישומים" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "קושחת התקן" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "הו_רדה" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "‫%s %s זמינה" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "‫%s זמינה" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "מידע על הגרסה החדשה" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "התקבלו %s מתוך %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "‫%u%% התקבלו" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "עדכון גדול, עם תכונות חדשות וליטוש נוסף." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "ביטול שדרוג" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "הפעלה מ_חדש ושדרוג…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "עליך לזכור לגבות את הנתונים ואת הקבצים בטרם השדרוג." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "פרטי שגיאה" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "העתקת פרטים" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "ארע כשל במחיקת הקובץ „%s”: ‏‎%s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "ארע כשל במחיקת התיקייה „%s”: ‏‎%s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "הוספה, הסרה ועדכון של תוכנות במחשב זה" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"עדכונים;שדרוג;מקורות;מאגרים;העדפות;התקנה;הסרה;מחיקה;תכנית;תכנה;יישום;חנות;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s מוכן" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s מוכן להפעלה ולהגשה לטעינת המערכת הבא." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "לאפשר" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "עדכוני מערכת" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "עדכוני מערכת כלליים, כגון אבטחה או תיקוני תקלות לרבות שיפורי ביצועים." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "עדכון עבור %s, עם תכונות חדשות ותיקונים נוספים." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "שירות העדכון של EOS לא הצליח לקבל ולהחיל את העדכון." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "יישום רשת" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "תמיקה ביישומי רשת" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "הרצת יישומי רשת פופולריים בדפדפן" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "Upgrade for the latest features, performance and stability improvements." +msgstr "" +"כדאי לעדכן כדי לקבל את היכולות העדכניות לצד שיפורים הן בביצועים והן ביציבות." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "תמיכת Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "‏Flatpak זוהי מסגרת עבור יישומים שולחניים על לינוקס" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "תיקיית מערכת %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "תת־תיקיית הבית %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "תיקיות מערכת אירוח" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "הגדרות מערכת מארחת מ־‎/etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "תיקיית שולחן עבודה" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "תת־תיקיית שולחן עבודה %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "תיקיית מסמכים" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "תת־תיקיית מסמכים %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "תיקיית מוזיקה" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "תת־תיקיית מוזיקה %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "תיקיית תמונות" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "תת־תיקיית תמונות %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "תיקיית שיתוף ציבורית" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "תת־תיקיית שיתוף ציבורית %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "תיקיית וידאו" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "תת־תיקיית וידאו %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "תיקיית תבניות" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "תת־תיקיית תבניות %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "תיקיית מטמון משתמש" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "תת־תיקיית מטמון משתמש %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "תיקיית הגדרות משתמש" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "תת־תיקיית הגדרות משתמש %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "תיקיית נתוני משתמש" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "תת־תיקיית נתוני משתמש %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "תיקיית זמן ריצת משתמש" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "תת־תיקיית זמן ריצת משתמש %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "גישה למערכת הקבצים אל %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "מקבל מידע Flatpak עבור %s…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "כוונון התוסף ‚%s’ נכשל: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "התקנת משתמש" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "התקנת מערכת" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "מזהה יישום" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "‫הוספה להתקנה של התוסף ‚%s’ נכשלה: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "‫הוספה להסרה של התוסף ‚%s’ נכשלה: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. Remove " +"the filter and repeat the install. Detailed error: %s" +msgstr "" +"‏„%s” המרוחקת אינה מאפשרת התקנה של „%s”, יתכן בגלל המסנן שלה. יש להסיר את המסן " +"ולחזור על ההתקנה. פרטי שגיאה: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "סוללת המערכת חלשה מדי כדי לבצע עדכון" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "סוללת המערכת חלשה מדי כדי לבצע עדכון (%u%%, נדרש %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "לא ניתן להשיג את ההתקן, או שהוא מחוץ לטווח הרשת האלחוטית" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "סוללת ההתקן חלשה מדי" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "סוללת ההתקן חלשה מדי כדי לבצע עדכון (%u%%, נדרש %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "ההתקן ממתין להחלת העדכון" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "ההתקן דורש זרם חילופין כדי להתחבר" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "לא ניתן להשתמש בהתקן בזמן שהכיסוי סגור" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "עדכון להתקן %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "עדכון מערכת ל־%s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "עדכון לבקר משובץ ל־%s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "עדכון מנוע ניהול ל־%s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "עדכון מנוע ניהול לשימוש עסקי ל־%s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "עדכון מנוע ניהול לשימוש ביתי ל־%s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "עדכון לבקר %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "עדכון לבקר Thunderbolt ל־%s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "עדכון מיקרוקוד למעבד של %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "עדכון הגדרות ל־%s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "עדכון סוללה ל־%s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "עדכון מצלמה ל־%s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "עדכון TPM‏ ל־%s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "עדכון משטח מגע ל־%s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "עדכון עכבר ל־%s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "עדכון מקלדת ל־%s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "עדכון לבקר אחסון %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "עדכון למנשק תקשורת %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "עדכון לצג %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "עדכון ל־‏BMC‏ %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "עדכון להתקן USB ‏%s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "עדכון להתקן %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "עדכון להתקן הבזק %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "עדכון ל־SSD ‏%s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "עדכון ל־GPU ‏%s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "עדכון לתחנת עגינה %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "עדכון לתחנת עגינה USB ‏%s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "קושחה" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "לא ניתן להחיל את עדכוני הקושחה: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "תמיכה בשדרוג קושחות" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "מספק תמיכה עבור שדרוג קושחות" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "להתקין תכנית לא חתומה?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"התכנית המיועדת להתקנה אינה חתומה. לא ניתן יהיה לאמת את מקור עדכוני התכנית " +"הזאת או האם בוצעה חבלה בעדכונים." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "להוריד תכנית לא חתומה?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"עדכונים לא חתומים זמינים. ללא חתימה, לא ניתן יהיה לוודא את מקור העדכון או האם " +"בוצעה בהם חבלה." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "לעדכן תכנית לא חתומה?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"עדכונים לא חתומים זמינים. ללא חתימה, לא ניתן יהיה לוודא את מקור העדכון או האם " +"בוצעה בהם חבלה. עדכוני תכנה הושבתו עד שעדכוני תכנה חתומים מוסרים או מעודכנים." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "התקנת עדכונים נכשלה: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "חבילות" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "המתנה לסוף ההעברה בטרם ההורדה נכשלה: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "הורדת עדכונים נכשלה: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "קבלת עדכונים נכשלה: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "מערכת הפעלה (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "חנות Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "תמיכה ב־Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "‏Snap זו חבילה שנתמכת במגוון הפצות לינוקס" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "מערכת" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "רכיב מערכת" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "הסרת משימת עדכון המערכת ‚%s’ נכשלה עם הודעת המצב %i" + +#~ msgid "Was this review useful to you?" +#~ msgstr "ביקורת זו הועילה לך?" + +#~ msgid "Yes" +#~ msgstr "כן" + +#~ msgid "No" +#~ msgstr "לא" + +#~ msgid "_app settings" +#~ msgstr "הגדרות _יישום" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "עדכוני מערכת הפעלה לא זמינים" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "התקנת עדכוני מערכת חשובים נכשלה." + +#~ msgid "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "שדרוגי תכנה הורדו זה מכבר ומוכנים להתקנה." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "עדכוני הורדו זה מכבר ומוכנים להתקנה." + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "דרך נוחה לנהל את התכניות במחשב שלך." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "יש למלא מספר מ־1 עד %u: " + +#~ msgid "Choose an app:" +#~ msgstr "בחירת יישום:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "היישום %s הותקן" + +# msgid_plural "Applications have been removed" +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "יישום הוסר" +#~ msgstr[1] "שני יישומים הוסרו" +#~ msgstr[2] "יישומים הוסרו" +#~ msgstr[3] "יישומים הוסרו" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "לא ניתן למצוא את „%s”" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "מוריד קטלוג תכנה" + +#~ msgid "Moderate page" +#~ msgstr "פיקוח על דף" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "אין סקירות לפיקוח" + +#~ msgid "Meh" +#~ msgstr "לא במיוחד" + +#~ msgid "Outdated SDK version" +#~ msgstr "גרסת SDK שפג תוקפה" + +#~ msgid "Unable to install updates" +#~ msgstr "לא ניתן להתקין עדכונים" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "לא ניתן להסיר את ההתקנה: האימות לא היה תקין" + +#~ msgid "Network Settings" +#~ msgstr "הגדרות רשת" + +#~ msgid "No Network" +#~ msgstr "אין רשת" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "צריכה להיות גישה לאינטרנט כדי לבדוק אם יש עדכונים." + +#~ msgid "Network _Settings" +#~ msgstr "ה_גדרות רשת" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "פרטי השדרוג מתקבלים…" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "עדכון תכנה חשוב מוכן להתקנה." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "חשוב: עדכוני תכנה קריטיים בהמתנה." + +#~ msgid "Please download waiting software updates." +#~ msgstr "נא להוריד עדכוני תכנה שבהמתנה." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "עדכונים אוטומטיים מושהים" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "חיבור הרשת הנוכחי מוגבל. לחיבור מוגבל קיימת מגבלת נתונים, או לחלופין " +#~ "מתקבלים חיובים נוספים על שימוש בנתונים. על מנת לחסוך במידע, העדכונים " +#~ "האוטומטיים הושהו.\n" +#~ "\n" +#~ "אם החיבור הנוכחי זוהה באופן שגוי כחיבור מוגבל, ניתן לשנות זאת בהגדרות." + +#~ msgid "Open Network _Settings" +#~ msgstr "פתיחת _הגדרות רשת" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "מה אהוב בעינך ביישום זה? השארת המשוב שלך עם הסיבות להשארת הביקורת" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "חיבור רשת מוגבל - עדכונים אוטומטיים מושהים" + +#~ msgid "Find Out _More" +#~ msgstr "פרטים _נוספים" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "לא ניתן להוריד עדכונים: צריכה להיות גישה לאינטרנט אבל אין" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "לא ניתן להוריד עדכונים: אין מספיק מקום בכונן" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "לא ניתן להוריד עדכונים: נדרש אימות" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "לא ניתן להוריד עדכונים: האימות נכשל" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "לא ניתן להתקין את %s: אין לך את ההרשאות להתקנה תכנה" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "לא ניתן להתקין את %s: הסוללה כמעט ריקה" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "לא ניתן להתקין עדכונים: אין מספיק מקום בכונן" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "לא ניתן להתקין עדכונים: נדרש אימות" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "לא ניתן לעדכן עדכונים: האימות לא היה תקין" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "לא ניתן לעדכן את %s: אין לך את ההרשאות לעדכון תכנה" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "לא ניתן להתקין עדכונים: אין לך את ההרשאות לעדכון תכנה" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "לא ניתן להתקין עדכונים: יש לחבר לחשמל" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "לא ניתן לעדכן את %s: הסוללה כמעט ריקה" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "לא ניתן להתקין עדכונים: הסוללה כמעט ריקה" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "לא ניתן לשדרג אל %s: נדרשת גישה לאינטרנט אך זו אינה זמינה" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "לא ניתן לשדרג אל %s: אין לך את ההרשאות לעדכון תכנה" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "לא ניתן לשדרג אל %s: הסוללה כמעט ריקה" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "לא ניתן להסיר את %s: נדרש אימות" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "לא ניתן להסיר את %s: האימות לא היה תקין" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "לא ניתן להסיר את %s: אין לך את ההרשאות להסרת תכנה" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "לא ניתן להסיר את %s: יש לחבר לחשמל" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "לא ניתן להסיר את %s: הסוללה כמעט ריקה" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "לא ניתן להסיר את %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "התקנת הקובץ נכשלה: לא נתמך" + +#~ msgid "Failed to install: not supported" +#~ msgstr "התקנה נכשלה: אין תמיכה" + +#~ msgid "AC power is required" +#~ msgstr "יש לחבר לחשמל" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "כדי להימנע מחיובים ותקורת תעבורה, עדכוני תכנה לא נמשכים אוטומטית בחיבורים " +#~ "מוגבלים או סלולריים." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "מוריד ומתקין את עדכוני התכנה ברקע, כשניתן" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "הצגת יישומים _חופשיים בלבד" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "הצגת יישומים שכפופים לרישיון חופשי והסתרת יישומים שכפופים לרישיון קנייני" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "טוען את פרטי העדכון, נא להמתין…" + +#~ msgid "Downloading featured images…" +#~ msgstr "מוריד תמונות מומלצות…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Show verbose debugging information" + +#~ msgid "Can access arbitrary files" +#~ msgstr "רשאי לגשת לקבצים שרירותיים" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "להסיר את %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "‏%s יוסר, ויהיה עליך להתקין אותו כדי להשתמש בו שוב." + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "התוספים הנבחרים יותקנו עם היישום." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "The last timestamp when the system was online and got any updates" + +#~ msgid "An application" +#~ msgstr "יישום" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "התכנית הזאת אינה זמינה בשפה שלך ותופיע באנגלית אמריקאית." + +#~ msgid "Applications" +#~ msgstr "יישומים" + +#~ msgid "Web Applications" +#~ msgstr "יישומי רשת" + +#~ msgid "_Continue" +#~ msgstr "המ_שך" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "יישום אחד" +#~ msgstr[1] "‫שני יישומים" +#~ msgstr[2] "‫%u יישומים" +#~ msgstr[3] "‏‫%u יישומים" + +#~ msgid "Post Review" +#~ msgstr "פרסום ביקורת" + +#~ msgid "_Post" +#~ msgstr "_פרסום" + +#~ msgid "Rating" +#~ msgstr "דירוג" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "יש לתת תקציר של הביקורת שלך, לדוגמה: „יישום מצוין, מומלץ בחום”." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "ביקורות" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "מה דעתך על היישום? עדיף לנסות לנמק את השקפתך." + +#~ msgid "No screenshot provided" +#~ msgstr "לא סופקו צילומי מסך" + +#, c-format +#~ msgid "%s…" +#~ msgstr "‫%s…" + +#~ msgid "Restart Now" +#~ msgstr "הפעלה מחדש כעת" + +#~ msgid "Primary Menu" +#~ msgstr "תפריט עיקרי" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "עדכונים" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "‏%s %s לא נתמך עוד." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "המשמעות לכך היא שלא יתקבלו עוד עדכוני אבטחה." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "מומלץ לשדרג לגרסה חדשה יותר." + +#~ msgid "Application Updates" +#~ msgstr "עדכוני יישומים" + +#~ msgid "GNOME Web" +#~ msgstr "דפדפן GNOME" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "לא הותקנו עדכונים על מערכת זו." + +#~ msgid "Application manager for GNOME" +#~ msgstr "מנהל יישומים עבור GNOME" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "רשימת תכנות בהורדה" + +#~ msgid "Name" +#~ msgstr "שם" + +#~ msgid "user" +#~ msgstr "משתמש" + +#~ msgid "Channel" +#~ msgstr "ערוץ" + +#~ msgid "Branch" +#~ msgstr "ענף" + +#~ msgid "URL" +#~ msgstr "כתובת" + +#~ msgid "Installation" +#~ msgstr "התקנה" + +#~ msgid "Version" +#~ msgstr "גרסה" + +#~ msgid "Access arbitrary files" +#~ msgstr "גישה לקבצים שרירותית" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "יכול לגשת לקבצים שרירותיים במערכת הקבצים" + +#~ msgid "A list of popular applications" +#~ msgstr "A list of popular applications" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "A list of applications to use, overriding the system defined ones." + +#~ msgid "Checking…" +#~ msgstr "מתבצעת בדיקה…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "בטעינה…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "דירוגי יישום מתקבלים…" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "הכתובת (URI) שמתייחסת לרקע עבור כרזת שדרוג." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "הכתובת (URI) יכולה להכיל ‚%u’ עד שלוש פעמים, שיוחלפו על ידי הגרסה המשודרגת." + +#~ msgid "Welcome" +#~ msgstr "ברוך בואך" + +#~ msgid "Welcome to Software" +#~ msgstr "ברוך בואך לתכנה" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "תכנה מאפשר לכם להתקין את כל התכנות שתצטרכו, הכל ממקום אחד. ראו ההמלצות " +#~ "שלנו, סיירו בקטגוריות, או חפשו את היישומים שברצונכם." + +#~ msgid "_Browse Software" +#~ msgstr "_סיור בתכנה" + +#~ msgid "_Add shortcut" +#~ msgstr "הוס_פת צירוף מקשים" + +#~ msgid "Re_move shortcut" +#~ msgstr "ה_סרת צירוף מקשים" + +#~ msgid "OS Updates" +#~ msgstr "עדכונים למערכת ההפעלה" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "לרבות שיפורי ביצועים, יציבות ואבטחה." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "חתימת עדכון הקושחה מתקבלת…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "נתוני העל של עדכון הקושחה מתקבלים…" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Show the prompt to install nonfree software repositories" + +#~ msgid "Recently Updated" +#~ msgstr "עודכנו לאחרונה" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "All" +#~ msgstr "כולם" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "הכול" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "הכול" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgid "Audio & Video" +#~ msgstr "שמע ווידאו" + +#~ msgid "Developer Tools" +#~ msgstr "כלי פיתוח" + +#~ msgid "Education & Science" +#~ msgstr "חינוך ומדע" + +#~ msgid "Games" +#~ msgstr "משחקים" + +#~ msgid "Graphics & Photography" +#~ msgstr "גרפיקה וצילום" + +#~ msgid "Productivity" +#~ msgstr "משרד" + +#~ msgid "Communication & News" +#~ msgstr "תקשורת וחדשות" + +#~ msgid "Utilities" +#~ msgstr "עזרים" + +#~ msgid "_Read Less" +#~ msgstr "_לקרוא פחות" + +#~ msgid "_Launch" +#~ msgstr "_הפעלה" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "לא ניתן לקבוע איזה חלקים של המערכת נגישים ליישום זה. זה בדרך כלל עבור " +#~ "יישום ישנים." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "לעולם לא" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "נמוך" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "בינוני" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "גבוה" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "לא ידוע" + +#~ msgid "Public domain" +#~ msgstr "נחלת הכלל" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "‫https://he.wikipedia.org/wiki/רשות_הציבור" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "‫https://www.gnu.org/philosophy/free-sw.he.html" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "משתמשים מחויבים לרישיון הבא:" +#~ msgstr[1] "משתמשים מחויבים לרישיונות הבאים:" +#~ msgstr[2] "משתמשים מחויבים לרישיונות הבאים:" +#~ msgstr[3] "משתמשים מחויבים לרישיונות הבאים:" + +#~ msgid "Localized in your Language" +#~ msgstr "מתורגם לשפה שלך" + +#~ msgid "Release Activity" +#~ msgstr "פעיל" + +#~ msgid "Sandboxed" +#~ msgstr "ארגז חול" + +#~ msgid "Category" +#~ msgstr "קטגוריה" + +#~ msgid "Free" +#~ msgstr "חופשי" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "לא ידוע" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "המשמעות לכך היא שהיישום ניתן להרצה, העתקה, הפצה, לימוד ושינוי באופן חופשי." + +#~ msgid "Proprietary Software" +#~ msgstr "תכנה קניינית" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. There " +#~ "are often restrictions on its use and its source code cannot usually be " +#~ "accessed." +#~ msgstr "" +#~ "המשמעות לכך היא שהתכנה בבעלות אדם או חברה. לרוב יש הגבלות בשימוש וקוד " +#~ "המקור בדרך כלל אינו נגיש." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "תנאי הרישיון של תכנה זו אינם ידועים." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "היישום דורג כך עבור התכונות הבאות:" + +#~ msgid "No details were available for this rating." +#~ msgstr "אין מידע על דירוג זה." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "נמחק" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "הותקן" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "עודכן" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "לא ידוע" + +#~ msgid "History" +#~ msgstr "היסטוריה" + +#~ msgid "More…" +#~ msgstr "עוד…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "יישומי שמע ווידאו מומלצים" + +#~ msgid "Recommended Games" +#~ msgstr "משחקים מומלצים" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "יישומי גרפיקה מומלצים" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "יישומים משרדיים מומלצים" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "חלק מתכנה זו הוא קנייני ולכן ישנן הגבלות בשימוש, בשיתוף ובגישה לקוד המקור." + +#~ msgid "Find out more…" +#~ msgstr "למידע נוסף…" + +#~ msgid "Recent Releases" +#~ msgstr "שחרורים אחרונים" + +#~ msgid "Remove “%s”?" +#~ msgstr "להסיר את „%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "להשבית את „%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "אין מקורות נוספים" + +#~ msgid "_Remove…" +#~ msgstr "ה_סרה…" + +#~ msgid "_Disable…" +#~ msgstr "ה_שבתה…" + +#~ msgid "Disabling" +#~ msgstr "משבית" + +#~ msgid "Enabled" +#~ msgstr "מאופשר" + +#~ msgid "Disabled" +#~ msgstr "מושבת" + +#~ msgid "ratings in total" +#~ msgstr "סך כל הביקורות" + +#~ msgid "%s (needs attention)" +#~ msgstr "‫%s (דרושה התייחסות)" + +#~ msgid "_Remove All" +#~ msgstr "ה_סרת הכול" + +#~ msgid "Setting Up Updates…" +#~ msgstr "העדכונים מתגבשים…" + +#~ msgid "Looking for New Updates…" +#~ msgstr "מתבצע חיפוש אחר עדכונים חדשים…" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "העדכון ייכנס לתוקף עם הפעלת המחשב מחדש." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "בהמתנה להורדת %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "‫%s %s בהורדה" + +#~ msgid "Select All" +#~ msgstr "בחירה בהכול" + +#~ msgid "Select None" +#~ msgstr "ביטול הבחירה" + +#~ msgid "Featured %s" +#~ msgstr "מומלצי %s" + +#~ msgid "Show" +#~ msgstr "הצגה" + +#~ msgid "Subcategories filter menu" +#~ msgstr "תפריט מסנן קטגרויות משנה" + +#~ msgid "Sort" +#~ msgstr "מיון" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "תפריט מיון קטגוריות משנה" + +#~ msgid "Software is up to date" +#~ msgstr "כל התכניות עדכניות" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "‏ODRS הוא שרת המספק תמיכה בביקורות משתמשים עבור יישומים" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Enable GNOME Shell extensions repository" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Cartoon characters in unsafe situations" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Cartoon characters in aggressive conflict" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Graphic violence involving cartoon characters" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Characters in unsafe situations easily distinguishable from reality" + +#~ msgid "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Characters in aggressive conflict easily distinguishable from reality" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Graphic violence easily distinguishable from reality" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Mildly realistic characters in unsafe situations" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Depictions of realistic characters in aggressive conflict" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Graphic violence involving realistic characters" + +#, fuzzy +#~| msgid "Realistic bloodshed" +#~ msgid "No bloodshed" +#~ msgstr "Realistic bloodshed" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Unrealistic bloodshed" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Depictions of bloodshed and the mutilation of body parts" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Rape or other violent sexual behavior" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "References to alcoholic beverages" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Use of alcoholic beverages" + +#~ msgid "References to illicit drugs" +#~ msgstr "References to illicit drugs" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Use of illicit drugs" + +#~ msgid "References to tobacco products" +#~ msgstr "References to tobacco products" + +#~ msgid "Use of tobacco products" +#~ msgstr "Use of tobacco products" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Brief artistic nudity" + +#~ msgid "Prolonged nudity" +#~ msgstr "Prolonged nudity" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provocative references or depictions" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Sexual references or depictions" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Graphic sexual behavior" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Mild or infrequent use of profanity" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Moderate use of profanity" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Strong or frequent use of profanity" + +#~ msgid "Slapstick humor" +#~ msgstr "Slapstick humor" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgar or bathroom humor" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Mature or sexual humor" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativity towards a specific group of people" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Discrimination designed to cause emotional harm" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "Explicit discrimination based on gender, sexuality, race or religion" + +#~ msgid "Product placement" +#~ msgstr "Product placement" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Explicit references to specific brands or trademarked products" + +#, fuzzy +#~| msgid "Players are encouraged to purchase specific real-world items" +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Players are encouraged to purchase specific real-world items" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Gambling on random events using tokens or credits" + +#, fuzzy +#~| msgid "Gambling using \"play\" money" +#~ msgid "Gambling using “play” money" +#~ msgstr "Gambling using \"play\" money" + +#~ msgid "Gambling using real money" +#~ msgstr "Gambling using real money" + +#, fuzzy +#~| msgid "Players are encouraged to purchase specific real-world items" +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Players are encouraged to purchase specific real-world items" + +#, fuzzy +#~| msgid "Ability to spend real money in-game" +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Ability to spend real money in-game" + +#, fuzzy +#~| msgid "Player-to-player game interactions without chat functionality" +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Player-to-player game interactions without chat functionality" + +#, fuzzy +#~| msgid "Uncontrolled chat functionality between players" +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Uncontrolled chat functionality between players" + +#, fuzzy +#~| msgid "Uncontrolled audio or video chat functionality between players" +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Uncontrolled audio or video chat functionality between players" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Sharing social network usernames or email addresses" + +#, fuzzy +#~| msgid "Sharing user information with 3rd parties" +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Sharing user information with 3rd parties" + +#, fuzzy +#~| msgid "Sharing physical location to other users" +#~ msgid "Sharing physical location with other users" +#~ msgstr "Sharing physical location to other users" + +#, fuzzy +#~| msgid "Provocative references or depictions" +#~ msgid "Indirect references to prostitution" +#~ msgstr "Provocative references or depictions" + +#, fuzzy +#~| msgid "Provocative references or depictions" +#~ msgid "Direct references to prostitution" +#~ msgstr "Provocative references or depictions" + +#~ msgid "General" +#~ msgstr "כללי" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "לא ידוע" + +#~ msgid "this website" +#~ msgstr "אתר אינטרנט זה" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_בואו לעשות קניות" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "הוסר" + +#~ msgid "Security Updates Pending" +#~ msgstr "עדכוני אבטחה ממתינים" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "מומלץ להתקין עדכונים חשובים כעת" + +#~ msgid "Restart & Install" +#~ msgstr "הפעלה מחדש והתקנה" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "עדכוני מערכת ויישומים חשובים מוכנים להתקנה" + +#~ msgid "View" +#~ msgstr "הצגה" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "אתמול, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "לפני שלושה ימים" + +#~ msgid "Four days ago" +#~ msgstr "לפני ארבעה ימים" + +#~ msgid "Five days ago" +#~ msgstr "לפני חמישה ימים" + +#~ msgid "Six days ago" +#~ msgstr "לפני שישה ימים" + +#~ msgid "Two weeks ago" +#~ msgstr "לפני שבועיים" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "The list of extra sources that have been previously enabled" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." + +#~ msgid "Show the folder management UI" +#~ msgstr "Show the folder management UI" + +#~ msgid "Show non-free software in search results" +#~ msgstr "Show non-free software in search results" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "A list of non-free sources that can be optionally enabled" + +#~ msgid "Add to Application Folder" +#~ msgstr "הוספה לתיקיית יישומים" + +#~ msgid "_Add" +#~ msgstr "_הוספה" + +#~ msgid "_All" +#~ msgstr "ה_כול" + +#~ msgid "Folder Name" +#~ msgstr "שם תיקייה" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Show profiling information for the service" + +#~ msgid "To continue you need to sign in." +#~ msgstr "על מנת להמשיך יש להתחבר." + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "על מנת להמשיך יש להתחבר אל %s." + +#~ msgid "Email address" +#~ msgstr "כתובת דוא״ל" + +#~ msgid "I have an account already" +#~ msgstr "כבר יש ברשותי חשבון" + +#~ msgid "I want to register for an account now" +#~ msgstr "ברצוני להירשם עכשיו" + +#~ msgid "Sign in automatically next time" +#~ msgstr "התחברות אוטומטית להבא" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "יש להזין את הקוד הסודי החד פעמי עבור שני גורמי אימות." + +#~ msgid "PIN" +#~ msgstr "קוד סוגי" + +#~ msgid "Continue" +#~ msgstr "המשך" + +#~ msgid "Spacing" +#~ msgstr "Spacing" + +#~ msgid "The amount of space between children" +#~ msgstr "The amount of space between children" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "מידע על אודות %s, כמו גם אפשרויות לקבלת מקודד היודע לנגן תבנית זו ניתן " +#~ "למצוא באתר האינטרנט." + +#~ msgid "Total" +#~ msgstr "סך הכל" + +#~ msgid "Extension Settings" +#~ msgstr "הגדרות הרחבות" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "הרחבות משמשות על אחריותך בלבד. אם נתקלת בבעיות במערכת, מומלץ להשבית אותן." + +#~ msgid "Could not find '%s'" +#~ msgstr "לא נתן למצוא את „%s”" + +#~ msgid "Click on items to select them" +#~ msgstr "יש ללחוץ על פריטים כדי לבחור אותם" + +#~ msgid "Select" +#~ msgstr "בחירה" + +#~ msgid "_Add to Folder…" +#~ msgstr "_הוספה לתיקייה…" + +#~ msgid "_Move to Folder…" +#~ msgstr "ה_עברה לתיקייה…" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "לאפשר מקורות תכנה קניינית?" + +#~ msgid "Restart & _Install" +#~ msgstr "הפעלה מחדש וה_תקנה" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "אין יישומים או הרחבות מותקנים; תכנות אחרות עדיין עשויות להימצא" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "על פי רוב יש הגבלות בשימוש ובגישה לקוד המקור." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "מקורות תכנה קניינית" + +#~ msgid "Remove Source" +#~ msgstr "הסרת מקור" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you access " +#~ "to additional software that is not provided by %s." +#~ msgstr "" +#~ "נתן להוריד תכנה מהאינטרנט. הדבר יתן לך גישה לתכנה נוספת שאינה מסופקת על " +#~ "ידי %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from it." +#~ msgstr "הסרת מקור תכנה גם תסיר כל תכנה שהותקנה ממנו." + +#~ msgid "No software installed from this source" +#~ msgstr "לא הותקנו תכנות ממקור זה" + +#~ msgid "Installed from this Source" +#~ msgstr "הותקן ממקור זה" + +#~ msgid "Last Checked" +#~ msgstr "בדיקה אחרונה" + +#~ msgid "Added" +#~ msgstr "נוסף" + +#~ msgid "Website" +#~ msgstr "אתר אינטרנט" + +#~ msgid "Installation of %s failed." +#~ msgstr "התקנת %s נכשלה." + +#~ msgid "Removal of %s failed." +#~ msgstr "מחיקת %s נכשלה." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "נא לוודא כי יש לך גישה לאינטרנט ואחר לנסות שוב." + +#~ msgid "Please free up some space and try again." +#~ msgstr "נא לפנות מעט מקום ולנסות שוב." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "אם הבעיה נמשכת, נא ליצור קשר עם ספק התכנה שלך." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Player-to-player preset interactions without chat functionality" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgid "_About" +#~ msgstr "על _אודות" + +#~ msgid "_Quit" +#~ msgstr "י_ציאה" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "רשימת תכנות בטעינה" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Addons" +#~ msgid "Shell Extensions" +#~ msgstr "הרחבות מעטפת" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "אסטרונומיה" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "כימיה" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "מתמטיקה" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "הכל" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "מומלצים" + +#~ msgid "Science" +#~ msgstr "מדע" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "מקורות תכנה נותנים לך גישה לתכנות נוספות." + +#~ msgid "A previous update was unfinished." +#~ msgstr "עדכון קודם לא הסתיים." + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "עדכון לא נחתם בדרך הנכונה." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "היה דרוש עדכון במצב לא מקוון אך אין חבילות הדורשות עדכון." + +#~ msgid "No space was left on the drive." +#~ msgstr "לא נשאר מקום על ההתקן." + +#~ msgid "An update failed to install correctly." +#~ msgstr "ארע כשל בהתקנת עדכון כראוי." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "העדכון הלא מקוון נכשל בדרך בלתי צפויה." + +#~ msgid "_Installing" +#~ msgstr "_בהתקנה" + +#~ msgid "_Removing" +#~ msgstr "_בהסרה" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "לא ידוע" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "מחשב…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "לא ידוע" + +#~ msgid "Internet Only Application" +#~ msgstr "יישומי רשת בלבד" + +#~ msgid "_History" +#~ msgstr "_היסטוריה" + +#~ msgid "Size" +#~ msgstr "גודל" + +#~ msgid "Recommended Office Applications" +#~ msgstr "יישומים משרדיים מומלצים" + +#~ msgid "One Star" +#~ msgstr "כוכב אחד" + +#~ msgid "Two Stars" +#~ msgstr "שני כוכבים" + +#~ msgid "Three Stars" +#~ msgstr "שלושה כוכבים" + +#~ msgid "Four Stars" +#~ msgstr "ארבעה כוכבים" + +#~ msgid "Five Stars" +#~ msgstr "חמישה כוכבים" + +#~ msgid "No AppStream data found" +#~ msgstr "לא נמצאו נתוני AppStream" + +#~ msgid " or " +#~ msgstr " או " + +#~ msgid "Audio" +#~ msgstr "שמע" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "מסדי נתונים" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "צריבת תקליטורים" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "רדיו חובבים" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "מערבל" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "מוזיקה" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "מקליטים" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "רצף תשדיר (Sequencer)" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "מלקטים" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "פיתוח" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "מסדי נתונים" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "GUI Designers" +#~ msgstr "מעצבי מנשק משתמש" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "סביבות פיתוח משולבות" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "אפיון" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Revision Control" +#~ msgstr "בקרת גרסאות" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "פיתוח אינטרנט" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "ביולוגיה" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "מדעי המחשב" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "המחשת נתונים" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "כלכלה" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "חשמל" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "אלקטרוניקה" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "הנדסה" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "גיאולוגיה" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "מדעי כדור הארץ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "היסטוריה" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "עיבוד תמונות" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "ספרות" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "מפות" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "מוזיקה" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "אנליזה נומרית" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "עיבוד מקבילי" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "פיזיקה" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "רוחניות" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "משחקי יריות" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "הדמיית ניהול ממוחשבות" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "ספורט" + +#~ msgid "Graphics" +#~ msgstr "גרפיקה" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "גרפיקה דו־ממדית" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "זיהוי תווים אופטי" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "תמונת מפת סיביות" + +#~ msgid "Internet" +#~ msgstr "אינטרנט" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "חיוג" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "דואר אלקטרוני" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "הזנות" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "העברת קבצים" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "רדיו חובבים" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "מסרים מיידים" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "לקוחות IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "מעקב" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "עמית לעמית" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "טלפוניה" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "בניית אתרים" + +#~ msgid "Office" +#~ msgstr "משרד" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "תרשים" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "ניהול אנשי קשר" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "מילון" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "דואר אלקטרוני" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "תרשים זרימה" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "מחשב כף יד" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "צילום" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "ניהול מיזמים" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "הוצאה לאור" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "גיליון נתונים" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "צופה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "אמנות" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "בינה מלאכותית" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "אסטרונומיה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "ביולוגיה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "כימיה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "מדעי המחשב" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "המחשת נתונים" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "כלכלה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "חשמל" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "אלקטרוניקה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "הנדסה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "גיאוגרפיה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "גיאולוגיה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "מדעי כדור הארץ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "היסטוריה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "מדעי הרוח" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "עיבוד תמונה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "שפות" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "ספרות" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "מפות" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "מתמטיקה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "רפואה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "אנליזה נומרית" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "עיבוד מקבילי" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "פיזיקה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "רובוטיקה" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "רוחניות" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "ספורט" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "הדמייה" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "מנהל קבצים" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "כלי קבצים" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "מעקב" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "אבטחה" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "מדמה מסוף" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "נגישות" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "ארכיבים" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "מחשבון" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "שעון" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "דחיסה" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "כלי קבצים" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "מפות" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "רוחניות" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "כלי טלפוניה" + +#~ msgid "Video" +#~ msgstr "וידאו" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "עריכה" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "מסד נתונים" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "צריבת תקליטורים" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "מקליטים" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "טלוויזיה" + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "הותקנו יישום אחד ותוסף אחד" +#~ msgstr[1] "הותקנו %i יישומים ו־%i תוספים" +#~ msgstr[2] "הותקנו שני יישומים ושני תוספים" + +#~ msgid "" +#~ "Depending on your country of residence, installing it could make you " +#~ "liable to prosecution." +#~ msgstr "בהתאם לארץ מגוריך, התקנה זו עשויה לחשוף אותך לתביעה." + +#~ msgid "If you are uncertain about this, you should obtain legal advice." +#~ msgstr "אם אין ברצונך לסמוך על כך, כדאי לך לקבל ייעוץ משפטי." + +#~ msgid "Do you want to enable it?" +#~ msgstr "האם אכן ברצונך לאפשר זאת?" + +#~ msgid "Set the specified debugging level" +#~ msgstr "Set the specified debugging level" + +#~ msgid "Picks" +#~ msgstr "יישומים נבחרים" + +#, fuzzy +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "מסדי נתונים" + +#, fuzzy +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "רדיו חובבים" + +#, fuzzy +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "פיתוח לאינטרנט" + +#, fuzzy +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "כלי קבצים" + +#, fuzzy +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "מפות" + +#, fuzzy +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "רוחניות" + +#, fuzzy +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "גופנים" + +#, fuzzy +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "מקודדים" + +#, fuzzy +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "מקורות קלט" + +#, fuzzy +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "חבילות שפה" + +#~ msgid "Done" +#~ msgstr "סיום" + +#~ msgid "Printing" +#~ msgstr "הדפסה" diff --git a/po/hi.po b/po/hi.po new file mode 100644 index 0000000..a4882ef --- /dev/null +++ b/po/hi.po @@ -0,0 +1,6300 @@ +# Hindi translation for gnome-software. +# Copyright (C) 2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# e2f_in c7 , 2016-2018 +# Roddy Shuler , 2016-2017 +# Scrambled777 , 2024-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-04-11 02:03+0000\n" +"PO-Revision-Date: 2025-04-22 17:52+0700\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 47.1\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "सॉफ्टवेयर" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "ऐप्स स्थापित और अद्यतन करें" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"सॉफ्टवेयर आपको नए ऐप्स और सिस्टम विस्तार खोजने और स्थापित करने और मौजूदा स्थापित किए " +"गए ऐप्स को हटाने की अनुमति देता है।" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"गनोम सॉफ्टवेयर उपयोगी विवरणों और प्रति अनुप्रयोग एकाधिक स्क्रीनशॉट के साथ विशिष्ट और " +"लोकप्रिय अनुप्रयोग को दिखाता है। अनुप्रयोग को श्रेणियों की सूची को ब्राउज़ करके या उन्हें " +"खोजकर ब्राउज़ किया जा सकता है। यह आपको ऑफ़लाइन अद्यतन का उपयोग करके आपके सिस्टम को " +"भी अद्यतित करने देता है।" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "अवलोकन फलक" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "विवरण फलक" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "स्थापित फलक" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "अद्यतन फलक" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "अद्यतन विवरण" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2789 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "गनोम परियोजना" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "शिम UEFI में akmods कुंजी का परीक्षण करें" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "शिम UEFI में akmods कुंजी परीक्षण हेतु प्रमाणीकरण आवश्यक" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "akmods कुंजी को शिम UEFI में नामांकित करें" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "शिम UEFI में akmods कुंजी नामांकन हेतु प्रमाणीकरण आवश्यक" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "शिम UEFI में DKMS कुंजी का परीक्षण करें" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "शिम UEFI में DKMS कुंजी परीक्षण हेतु प्रमाणीकरण आवश्यक" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "DKMS कुंजी को शिम UEFI में नामांकित करें" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "शिम UEFI में DKMS कुंजी नामांकन हेतु प्रमाणीकरण आवश्यक" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "सिस्टम स्थान में कोई ऐपस्ट्रीम फाइल स्थापित करें" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "सिस्टम स्थान में कोई ऐपस्ट्रीम फाइल स्थापित कर रहा है" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "संगत परियोजनाओं की सूची" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"यह संगत परियोजनाओं की एक सूची है जिसे हमें दिखाना चाहिए जैसे कि GNOME, KDE और XFCE।" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "क्या गनोम सॉफ्टवेयर में अद्यतन और उन्नयन प्रबंधित करना है" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"अक्षम होने पर, गनोम सॉफ्टवेयर अद्यतन फलक को छिपा देगा, कोई स्वचालित अद्यतन कार्रवाई " +"नहीं करेगा या उन्नयन के लिए संकेत नहीं देगा।" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "अद्यतन स्वचालित रूप से डाउनलोड और स्थापित करें" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"सक्षम होने पर, गनोम सॉफ्टवेयर स्वचालित रूप से पृष्ठभूमि में सॉफ्टवेयर अद्यतन डाउनलोड करता " +"है, साथ ही ऐसे अद्यतन भी स्थापित करता है जिन्हें रीबूट की आवश्यकता नहीं होती है।" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "पृष्ठभूमि में अद्यतित सॉफ्टवेयर के बारे में उपयोक्ता को सूचित करता है" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"सक्षम होने पर, गनोम सॉफ्टवेयर उपयोक्ता को उन अद्यतन के बारे में सूचित करता है जो उपयोक्ता " +"के निष्क्रिय रहने के दौरान हुए थे।" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "मीटरीकृत कनेक्शन पर होने पर स्वचालित रूप से रिफ़्रेश करना है या नहीं" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"सक्षम होने पर, मीटरीकृत कनेक्शन का उपयोग करने पर भी गनोम सॉफ्टवेयर स्वचालित रूप से " +"पृष्ठभूमि में रिफ़्रेश होगा (फलतः कुछ मेटाडाटा डाउनलोड करना, अद्यतन के लिए जांचना इत्यादि, " +"जिससे हो सकता है कि उपयोक्ता पर शुल्क लगेे)।" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "चाहे यह गनोम सॉफ्टवेयर का पहला संचालन हो" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "अनुप्रयोग के पास तारा रेटिंग दिखाएं" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "रिमोट के लिए निर्धारित तयशुदा शाखा के आधार पर अनुप्रयोगों को फिल्टर करें" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "सशुल्क अनुप्रयोग स्थापित होने के पहले चेतावनी संवाद दिखाते हैं" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"सशुल्क अनुप्रयोग के स्थापित होने पर चेतावनी संवाद दिखाई दे सकता है। उस संवाद के दबे होने पर " +"वह इसे नियंत्रित करता है।" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "अंतिम अद्यतन जांच टाइमस्टैम्प" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "अंतिम नवीनीकरण सूचना टाइमस्टैम्प" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "अंतिम अद्यतन अधिसूचना टाइमस्टैम्प" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "पहले सुरक्षा अद्यतन का टाइमस्टैम्प, जो अद्यतन के बाद साफ किया गया" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "अंतिम अद्यतन टाइमस्टैम्प" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "अपस्ट्रीम स्क्रीनशॉट अभी भी मान्य है, यह सत्यापित करने के लिए सेकंड में समयावधि" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"बड़ा मान चुनने का अर्थ होगा कि रिमोट सर्वर के लिए कम राउंड-ट्रिप्स लेकिन उपयोक्ताओं को " +"स्क्रीनशॉट्स के अद्यतन दिखाने में अधिक समय लग सकता है। 0 मान का अर्थ है कि अगर छवि पहले " +"से ही कैशे में मौजूद है तो सर्वर की कभी जांच नहीं की जाएगी।" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "अनुप्रयोग समीक्षाओं के लिए उपयोग किया जाने वाला सर्वर" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "समीक्षाओं के लिए न्यूनतम कर्मा स्कोर" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "इस संख्या से कम कर्मा वाली समीक्षाओं को दिखाया नहीं जाएगा।" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "आधिकारिक रिपॉजिटरी की एक सूची जिसे तृतीय पक्ष नहीं माना जाना चाहिए" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "आवश्यक रिपॉजिटरी की एक सूची जिसे अक्षम या हटाया नहीं जा सकता" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "आधिकारिक रिपॉजिटरी की एक सूची जिसे मुफ़्त सॉफ्टवेयर माना जाना चाहिए" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"किसी अनुप्रयोग को निःशुल्क सॉफ्टवेयर के रूप में माने जाने पर उपयोग किए जाने के लिए लाइसेंस " +"URL" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"जहाँ भी संभव हो, वहाँ सिस्टम पर सभी उपयोक्ताओं के लिए बंडल किए गए अनुप्रयोग स्थापित करें" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "सॉफ्टवेयर रिपॉजिटरी संवाद तक पहुंच की अनुमति दें" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "प्री-रिलीज़ के लिए उन्नयन की पेशकश करें" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "उपयोक्ता को यह सूचित करने वाले कुछ UI घटक दिखाएं कि ऐप शुल्क सहित है" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "स्थापित अनुप्रयोग की सूची में ऐप्स के लिए स्थापना आकार दिखाएं" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "वह URI जो गैर-मुक्त और स्वामित्व सॉफ्टवेयर की व्याख्या करता है" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"ऐपस्ट्रीम फाइलों की ओर इशारा करने वाले URL की एक सूची जिसे swcatalog फोल्डर में " +"डाउनलोड किया जाएगा" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"सभी उपयोक्ताओं के लिए ऐपस्ट्रीम फाइलों को सिस्टम-व्यापी स्थान पर स्थापित करता है। यदि " +"गलत है, तो फाइलें गैर-मानक $XDG_DATA_HOME/swcatalog/xml निर्देशिका में स्थापित की " +"जाती हैं" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"पैकेजिंग प्रारूपों का प्राथमिकता क्रम, पहले सूचीबद्ध अधिक महत्वपूर्ण प्रारूपों के साथ। एक खाली " +"सरणी का मतलब तयशुदा क्रम है। छोड़े गए प्रारूपों को अंतिम रूप से सूचीबद्ध माना जाता है। " +"उदाहरण पैकेजिंग प्रारूप हैं: deb, flatpak, rpm, snap। प्रारूपों को वैकल्पिक रूप से एक मूल " +"नाम के साथ निर्दिष्ट किया जा सकता है, जिसे कोलन द्वारा विभाजित किया जाता है, उदाहरण " +"के लिए 'flatpak:flathub'।" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "अप्रयुक्त फ्लैटपैक रनटाइम को हटाने के अंतिम प्रयास का टाइमस्टैम्प" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"केवल स्वतंत्र रूप से लाइसेंस प्राप्त ऐप्स दिखाने और किसी भी स्वामित्व वाले ऐप्स को छिपाने के " +"लिए इसे 'सही' पर निर्धारित करें।" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"केवल उन डेवलपर्स के ऐप्स दिखाने के लिए 'सही' पर निर्धारित करें जिनकी पहचान सत्यापित हो " +"चुकी है।" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "अंतिम प्राप्त ऐतिहासिक अद्यतन का टाइमस्टैम्प।" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"लॉगिन करने के लिए उपयोग की जाने वाली gnome-online-account id को संग्रहीत करने वाली " +"एक स्ट्रिंग" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "गनोम सॉफ़्टवेयर ऐपस्ट्रीम सिस्टम-व्यापी इंस्टॉलर" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "कमांड-लाइन तर्कों का विश्लेषण करने में विफल" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "आपको केवल एक फाइल नाम निर्दिष्ट करना होगा" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "इस प्रोग्राम का उपयोग केवल रूट उपयोक्ता द्वारा किया जा सकता है" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "सामग्री प्रकार सत्यापित करने में विफल: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "स्थानांतरण विफल: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "सॉफ्टवेयर स्थापना" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "सिस्टम पर चयनित सॉफ्टवेयर स्थापित करें" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "कार्टून हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "कार्टून हिंसा के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "काल्पनिक हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "काल्पनिक हिंसा के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "यथार्थवादी हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "यथार्थवादी हिंसा के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "रक्तपात को दर्शाती हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "रक्तपात को दर्शाती हिंसा के संबंध में कोई जानकारी नहीं है" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "यौन हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "यौन हिंसा के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "शराब" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "शराब के संदर्भ में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "नशीले पदार्थ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "अवैध दवाओं के संदर्भ में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "तंबाकू" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "तम्बाकू उत्पादों के संदर्भ में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "नग्नता" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "किसी भी प्रकार की नग्नता के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "यौन प्रसंग" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "यौन प्रकृति के संदर्भ या चित्रण के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "अभद्र भाषा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "किसी भी प्रकार के अभद्र भाषा के संबंध में कोई जानकारी नहीं है" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "अनुचित हास्य" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "अनुचित हास्य के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "भेदभाव" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "किसी भी प्रकार की भेदभावपूर्ण भाषा के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "विज्ञापन" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "किसी भी प्रकार के विज्ञापन के संबंध में कोई जानकारी नहीं है" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "जुआ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "जुए के संबंध में किसी भी प्रकार की कोई जानकारी नहीं है" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "खरीददारी" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "पैसे खर्च करने की क्षमता के बारे में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "उपयोक्ताओं के बीच बातचीत" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "अन्य उपयोक्ताओं के साथ बातचीत करने के तरीकों के बारे में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "उपयोक्ताओं के बीच ऑडियो चैट" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "अन्य उपयोक्ताओं से बात करने के तरीकों के बारे में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "संपर्क विवरण" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "सोशल नेटवर्क उपयोक्ता नाम या ईमेल पते साझा करने के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "पहचान के लिए जानकारी" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "तीसरे पक्ष के साथ उपयोक्ता की जानकारी साझा करने के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "स्थान साझाकरण" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "अन्य उपयोक्ताओं के साथ भौतिक स्थान साझा करने के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "समलैंगिकता" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "समलैंगिकता के संदर्भ में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "वेश्यावृत्ति" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "वेश्यावृत्ति के संदर्भ में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "व्यभिचार" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "व्यभिचार के संदर्भ में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "कामुक चरित्र" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "कामुक चरित्रों के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "अपवित्रीकरण" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "अपवित्रता के संदर्भ के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "मानव अवशेष" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "दृश्यमान मृत मानव अवशेषों के संबंध में कोई जानकारी नहीं" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "गुलामी" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "गुलामी के संदर्भ के संबंध में कोई जानकारी नहीं" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "इसमें दवाओं का संदर्भ शामिल नहीं है" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "इसमें गाली-गलौज, अपशब्द और अन्य प्रकार की कड़ी भाषा शामिल नहीं है" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "इसमें विज्ञापन या मौद्रिक लेनदेन शामिल नहीं हैं" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "इसमें लिंग या नग्नता शामिल नहीं है" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "इसमें अनियंत्रित चैट कार्यक्षमता शामिल नहीं है" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "इसमें हिंसा शामिल नहीं है" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "ड्रग्स" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "सशक्त भाषा" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "धन" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "सामाजिक" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "हिंसा" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "सभी" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s की अज्ञात आयु रेटिंग है" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s सभी के लिए उपयुक्त है" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s बहुत छोटे बच्चों के लिए उपयुक्त है" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s छोटे बच्चों के लिए उपयुक्त है" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s बच्चों के लिए उपयुक्त है" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s किशोरों के लिए उपयुक्त है" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s वयस्कों के लिए उपयुक्त है" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s %s के लिए उपयुक्त है" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "आयु रेटिंग" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "छूटी हुई जानकारी का योगदान कैसे करें (_H)" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "स्थानीय फाइल" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "पैकेज" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "लंबित" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "स्थापना लंबित है" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "हटाना लंबित है" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "स्थापित किया जा रहा है" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "हटाया जा रहा है" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "डाउनलोड किया जा रहा है" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "स्थापित करें (_I)" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "अस्थापित करें (_U)…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "नेटवर्क" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "नेटवर्क पर संचार कर सकता हैं" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "सिस्टम सेवाएं" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "सिस्टम बस पर डी-बस सेवाओं तक पहुंच सकता हैं" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "सत्र सेवाएं" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "सत्र बस पर डी-बस सेवाओं तक पहुंच सकता हैं" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "उपकरण" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "वेबकैम जैसे मनमाने उपकरणों तक पहुंच सकता हैं" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "इनपुट उपकरण तक पहुंच सकता हैं" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "माइक्रोफ़ोन तक पहुंच सकता है और ऑडियो चला सकता है" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "सिस्टम उपकरण फाइलों तक पहुंच सकता हैं" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "स्क्रीन सामग्री" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "स्क्रीन सामग्री तक पहुंच सकता हैं" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "गृह फोल्डर" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "फाइलें देख, संपादित और बना सकता हैं" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "फाइलें देख सकता हैं" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "फाइल सिस्टम" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "डाउनलोड फोल्डर" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "सेटिंग" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "किसी भी सेटिंग को देख और बदल सकता हैं" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "विरासत प्रदर्शन सिस्टम" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "पुराने, असुरक्षित प्रदर्शन सिस्टम का उपयोग करता है" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "सैंडबॉक्स से बचाव" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "सैंडबॉक्स से बच सकता हैं और किसी भी अन्य प्रतिबंध से बच सकता हैं" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "कोई अद्यतन विवरण उपलब्ध नहीं है।" + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "अद्यतन विवरण" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "अतिरिक्त अनुमतियों की आवश्यकता है" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "सर्वर से अमान्य रेटिंग डेटा प्राप्त हुआ" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "रेटिंग सर्वर से संचार नहीं हो सका" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "समीक्षाएं" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "इस ऐप के लिए कोई समीक्षा नहीं मिली।" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "कोई समीक्षाएं नहीं" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "संस्करण इतिहास" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "संस्करण %s में नया" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "संस्करण %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "इस रिलीज़ के लिए कोई विवरण नहीं" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "स्टार्ट अप मोड: या तो 'अद्यतन', 'अद्यतित', 'स्थापित' या 'अवलोकन'" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "मोड" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "अनुप्रयोग खोजें" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "खोजें" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "अनुप्रयोग का विवरण दिखाएं (अनुप्रयोग ID उपयोग करके)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "अनुप्रयोग का विवरण दिखाएं (पैकेज का नाम उपयोग करके)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "पैकेज का नाम" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "अनुप्रयोग स्थापित करें (अनुप्रयोग ID का उपयोग करके)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "अनुप्रयोग अस्थापित करें (अनुप्रयोग ID का उपयोग करके)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "स्थानीय पैकेज फाइल खोलें" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "फाइलनाम" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"इस क्रिया के लिए अपेक्षित अंतर्क्रिया का प्रकार: या तो ‘कोई नहीं’, ‘सूचित करें’ या ‘पूर्ण’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "अंतर्क्रिया" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "एक स्थानीय मेटाइन्फो या एपडेटा फाइल दिखाएं" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "वाचाल डिबगिंग आउटपुट सक्षम करें (चल रहे इंस्टैंस से, यदि पहले से चल रहा है)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "किसी भी लंबित अद्यतन को पृष्ठभूमि में स्थापित करता है" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "प्राथमिकताएं दिखाएं" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "चल रहे इंस्टैंस से बाहर आएं" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "ऐपस्ट्रीम के बजाय स्थानीय फाइल स्रोतों को प्राथमिकता दें" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "संस्करण संख्या दिखाएं" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "कॉपीराइट © 2016-2023 गनोम सॉफ्टवेयर योगदानकर्ता" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Scrambled777 " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "माफ़ करें! उस अनुप्रयोग का कोई विवरण नहीं है।" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "स्थापित आकार" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "%s का डेटा और %s का कैशे शामिल है" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "%s का डेटा शामिल है" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "%s का कैशे शामिल है" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "कैशे और डेटा उपयोग अज्ञात" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "डाउनलोड आकार" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "किसी अतिरिक्त सिस्टम डाउनलोड की आवश्यकता नहीं है" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "अतिरिक्त सिस्टम डाउनलोड के अज्ञात आकार की आवश्यकता है" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "अतिरिक्त सिस्टम डाउनलोड की %s आवश्यकता है" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "आकार अज्ञात है" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "कोई अनुमति नहीं" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "नेटवर्क पहुंच है" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "सिस्टम सेवाओं का उपयोग करता है" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "सत्र सेवाओं का उपयोग करता है" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "हार्डवेयर उपकरणों तक पहुंच सकता हैं" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "सिस्टम उपकरणों तक पहुंच सकता हैं" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "आपके सभी डेटा को पढ़/लिख सकता है" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "आपका सारा डेटा पढ़ सकता है" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "आपके डाउनलोड पढ़/लिख सकता हैं" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "आपके डाउनलोड पढ़ सकता हैं" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "कुछ विशिष्ट फाइलों तक पहुंच सकता हैं" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "उपयोक्ता सेटिंग्स तक पहुंच और उन्हें बदल सकता हैं" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "अप्रचलित विंडो सिस्टम का उपयोग करता है" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "मनमानी अनुमतियां प्राप्त कर सकता हैं" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "सॉफ्टवेयर डेवलपर सत्यापित है" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "OS वितरक द्वारा समीक्षित" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "%s द्वारा समीक्षित" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "किसी तीसरे पक्ष द्वारा उपलब्ध कराया गया" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "सॉफ्टवेयर अब समर्थित नहीं है" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "लेखापरीक्षा योग्य कोड" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "अज्ञात लाइसेंस" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "मालिकाना कोड" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "विशेष लाइसेंस" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "विशेषाधिकृत" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "सुरक्षित" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "संभवतः सुरक्षित" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "संभावित रूप से असुरक्षित" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "असुरक्षित" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "केवल मोबाइल" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "केवल छोटी स्क्रीन पर काम करता है" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "केवल डेस्कटॉप" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "केवल बड़ी स्क्रीन पर काम करता है" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "स्क्रीन साइज बेमेल" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "आपके वर्तमान स्क्रीन आकार का समर्थन नहीं करता" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "टचस्क्रीन की आवश्यकता है" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "कीबोर्ड की आवश्यकता है" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "माउस की आवश्यकता है" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "गेमपैड की आवश्यकता है" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "खेलने के लिए गेमपैड की आवश्यकता है" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "अनुकूली" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "फोन, टैबलेट और डेस्कटॉप पर काम करता है" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "संभवतः एक कीबोर्ड या माउस की आवश्यकता है" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "डेस्कटॉप और लैपटॉप पर काम करता है" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "इसमें कोई आयु-अनुचित सामग्री नहीं है" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "कोई आयु रेटिंग जानकारी उपलब्ध नहीं है" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "वेबसाइट पर जाएं" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "स्थापित करें…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "रद्द करें" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "स्थापित करें" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "डाउनलोड" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "अद्यतन" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "अस्थापित करें…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "अस्थापित किया जा रहा है" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "महत्वपूर्ण अद्यतन" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "अद्यतन के दौरान उपकरण का उपयोग नहीं किया जा सकता।" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "स्रोतः %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "%s से नाम बदला गया" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "अद्यतन प्राप्त होना बंद हो गया" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "गंभीर अद्यतन" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "स्थापित" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "%s का अनुवाद करने में सहायता करें" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s को योगदानकर्ताओं के एक अंतर्राष्ट्रीय समुदाय द्वारा डिज़ाइन, विकसित और अनुवादित किया " +"गया है।\n" +"\n" +"इसका मतलब यह है कि हालांकि यह अभी तक आपकी भाषा में उपलब्ध नहीं है, आप इसमें शामिल हो " +"सकते हैं और इसका अनुवाद करने में स्वयं मदद कर सकते हैं।" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "अनुवाद" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "अनुवाद वेबसाइट (_T)" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "लॉगिन हेतु रिमोट %s की आवश्यकता है (रियल्म %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "लॉगिन आवश्यक" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "रद्द करें (_C)" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "लॉगिन (_L)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "उपयोक्ता (_U)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "पासवर्ड (_P)" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "अन्य" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "सभी" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "विशिष्ट" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "संपादक की पसंद" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "नए एवं अद्यतित" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "वेब से चुने हुए" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "अन्य सॉफ्टवेयर" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s स्थापित" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "परिवर्तनों को प्रभावी बनाने के लिए पुनरारंभ आवश्यक है" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "ऐप उपयोग के लिए तैयार है" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "सिस्टम अद्यतन स्थापित" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "हालिया स्थापित अद्यतन अब समीक्षा के लिए उपलब्ध हैं" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "पुनरारंभ" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "शुरू करें" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "सॉफ्टवेयर स्थापित करें?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "तृतीय-पक्ष सॉफ्टवेयर स्थापित करें?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "सॉफ्टवेयर रिपॉजिटरी सक्षम करें?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "तृतीय-पक्ष सॉफ्टवेयर रिपोजिटरी सक्षम करें?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s मुफ़्त और खुला स्रोत सॉफ्टवेयर नहीं है, और “%s” द्वारा प्रदान " +"किया जाता है।" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s “%s” द्वारा प्रदान किया जाता है।" + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "स्थापना जारी रखने के लिए इस सॉफ्टवेयर रिपॉजिटरी को सक्षम किया जाना चाहिए।" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "कुछ देशों में %s को स्थापित करना या उपयोग करना अवैध हो सकता है।" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "कुछ देशों में इस कोडेक को स्थापित करना या उपयोग करना अवैध हो सकता है।" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "दोबारा चेतावनी न दें (_W)" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "सक्षम और स्थापित करें (_I)" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "पैकेज मैनेजर की विस्तृत त्रुटियां इस प्रकार हैं:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "विवरण" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "बंद करें (_C)" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "विवरण क्लिपबोर्ड पर कॉपी किया गया" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "स्वीकारें (_A)" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "एक अद्यतन स्थापित" +msgstr[1] "अद्यतन स्थापित" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "एक ऐप अस्थापित" +msgstr[1] "ऐप्स अस्थापित" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "इसे प्रभावी बनाने के लिए पुनरारंभ आवश्यक है" +msgstr[1] "उन्हें प्रभावी बनाने के लिए पुनरारंभ आवश्यक है" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "अभी नहीं" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "आज" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "बिता कल" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d दिन पहले" +msgstr[1] "%d दिनों पहले" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d हफ्ता पहले" +msgstr[1] "%d हफ्तों पहले" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d महीना पहले" +msgstr[1] "%d महीने पहले" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d वर्ष पहले" +msgstr[1] "%d वर्षों पहले" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "बस अभी" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d मिनट पहले" +msgstr[1] "%d मिनट पहले" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d घंटा पहले" +msgstr[1] "%d घंटे पहले" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "सभी" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "विशिष्ट" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D ग्राफिक्स" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "फोटोग्राफी" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "स्कैनिंग" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "वेक्टर ग्राफिक्स" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "दर्शक" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "ऑडियो निर्माण एवं संपादन" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "संगीत प्लेयर" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "सभी" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "विशिष्ट" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "कैलेंडर" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "डेटाबेस" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "वित्त" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "शब्द संसाधक" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "पाठ संपादक" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "वेब ब्राउज़र्स" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "सभी" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "विशिष्ट" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "क्रिया" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "साहसिक" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "आर्केड" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "ब्लॉक्स" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "बोर्ड" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "कार्ड" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "अनुकरणकर्ता" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "बच्चे" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "तर्क" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "भूमिका निभाना" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "खेलकूद" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "रणनीति" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "सभी" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "विशिष्ट" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "चैट" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "सभी" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "विशिष्ट" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "कृत्रिम बुद्धि" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "खगोल विद्या" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "रसायन शास्त्र" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "भाषाएं" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "गणित" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "समाचार" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "रोबोटिक्स" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "कला" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "जीवनी" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "कॉमिक्स" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "काल्पनिक कहानी" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "स्वास्थ्य" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "इतिहास" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "जीवनशैली" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "राजनीति" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "खेल" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "सभी" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "विशिष्ट" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "डिबगर्स" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDEs" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "कोडेक" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "हार्डवेयर ड्राइवर्स" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "फॉन्ट" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "इनपुट स्रोत" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "भाषा पैक" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "स्थानीयकरण" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "बनाएं" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "कार्य" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "खेलें" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "सामाजिककरण" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "शिक्षण" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "विकास करें" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "कोडेक" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "हार्डवेयर ड्राइवर" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "फॉन्ट" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "इनपुट स्रोत" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "भाषा पैक" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "स्थानीयकरण" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "एक ऐप" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s अतिरिक्त फाइल प्रारूप समर्थन का अनुरोध कर रहा है।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "अतिरिक्त माइम प्रकार आवश्यक" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s अतिरिक्त फॉन्ट का अनुरोध कर रहा है।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "अतिरिक्त फॉन्ट आवश्यक" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s अतिरिक्त मल्टीमीडिया कोडेक्स का अनुरोध कर रहा है।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "अतिरिक्त मल्टीमीडिया कोडेक्स आवश्यक" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s अतिरिक्त प्रिंटर ड्राइवर का अनुरोध कर रहा है।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "अतिरिक्त प्रिंटर ड्राइवर आवश्यक" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s अतिरिक्त पैकेज का अनुरोध कर रहा है।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "अतिरिक्त पैकेज आवश्यक" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "सॉफ्टवेयर में खोजें" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "और दिखाएं (_S)" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "कम दिखाएं (_S)" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "हटाया जा रहा है…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "स्थापना समाप्त करने के लिए पुनरारंभ आवश्यक है" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "हटाने को पूरा करने के लिए पुनरारंभ आवश्यक है" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "लंबित स्थापना…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "लंबित अद्यतन…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "डाउनलोड किया जा रहा है…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "तैयार कर रहे हैं…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "अस्थापित किया जा रहा है…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s स्थापित नहीं है, लेकिन इसका डेटा अभी भी मौजूद है।" + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "पुनरारंभ (_R)" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "सक्षम (_E)…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "स्थापित करें (_I)…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s अमेरिकी अंग्रेजी में दिखाई देगा" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "यह ऐप अमेरिकी अंग्रेजी में दिखाई देगा" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "यह सॉफ्टवेयर अमेरिकी अंग्रेज़ी में दिखाई देगा" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "अनुवाद में सहायता करें (_T)" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "%s द्वारा अन्य ऐप्स" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "विकासकर्ता %s ने %s का स्वामित्व सिद्ध कर दिया है" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "विकासकर्ता ने %s का स्वामित्व सिद्ध कर दिया है" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "समीक्षा लिखने के लिए आपको इंटरनेट पहुँच की आवश्यकता है" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "इस ऐप को अब सुरक्षा सुधारों सहित अद्यतन नहीं मिल रहे हैं" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"यह ऐप आपके वितरण द्वारा पहले से ही उपलब्ध कराया गया है और इसे प्रतिस्थापित नहीं किया " +"जाना चाहिए।" + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"यह ऐप किसी वेबसाइट, कोड रिपॉजिटरी या मुद्दा ट्रैकर के लिए कोई लिंक प्रदान नहीं करता है।" + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "इस सॉफ्टवेयर को अब सुरक्षा सुधारों सहित अद्यतन प्राप्त नहीं हो रहे हैं" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"यह सॉफ्टवेयर आपके वितरण द्वारा पहले से ही प्रदान किया गया है और इसे प्रतिस्थापित नहीं " +"किया जाना चाहिए।" + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"यह सॉफ्टवेयर किसी वेबसाइट, कोड रिपॉजिटरी या मुद्दा ट्रैकर के लिए कोई लिंक प्रदान नहीं " +"करता है।" + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"सॉफ़्टवेयर “%s” के लिए जानकारी प्राप्त करने में विफल रहा और इस ऐप के लिए विवरण दिखाने में " +"असमर्थ है।" + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "सर्वर से अमान्य समीक्षा प्रतिक्रिया प्राप्त हुई" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "“%s” के लिए समीक्षा प्रस्तुत करने में विफल: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "विवरण पृष्ठ" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "ऐप विवरण लोड हो रहा है" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "सत्यापित" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "खोलें (_O)" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "अद्यतन करें (_U)" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "अस्थापित करें" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "ऐड-ऑन" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "इस ऐप का उपयोग केवल तभी किया जा सकता है जब सक्रिय इंटरनेट कनेक्शन हो।" + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "सॉफ्टवेयर रिपोजिटरी शामिल है" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"इस ऐप में एक सॉफ्टवेयर रिपॉजिटरी शामिल है जो अद्यतन के साथ-साथ अन्य सॉफ्टवेयर तक पहुंच " +"प्रदान करती है।" + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "कोई सॉफ्टवेयर रिपॉजिटरी शामिल नहीं है" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"इस ऐप में सॉफ्टवेयर रिपॉजिटरी शामिल नहीं है। इसे नए संस्करणों के साथ अद्यतन नहीं किया " +"जाएगा।" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "सॉफ्टवेयर रिपॉजिटरी की पहचान की गई" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"इस सॉफ्टवेयर रिपॉजिटरी को जोड़ने से आपको अतिरिक्त सॉफ्टवेयर और उन्नयन तक पहुंच मिल " +"जाएगी।" + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "केवल उन सॉफ्टवेयर रिपॉजिटरी का उपयोग करें जिन पर आपको भरोसा है।" + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "ऐप डेटा साफ करें" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "डेटा मिटाएं (_e)" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "कोई मेटाडेटा नहीं" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "परियोजना वेबसाइट (_W)" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "दान करें (_D)" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "अनुवाद में योगदान करें (_T)" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "मामले की रिपोर्ट करें (_R)" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "सहायता (_H)" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "संपर्क (_C)" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "समीक्षा लिखें (_e)" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "सभी समीक्षाएं" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "ऐप विवरण दिखाने में असमर्थ" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "रीबूट तैयार करने में विफल" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "अज्ञात त्रुटि" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "कुंजी नहीं मिली" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "कुंजी नामांकित नहीं है" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK नामांकन आवश्यक" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "अगला (_N)" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"इस उपकरण में सिक्योर बूट सक्षम है। नये ड्राइवरों को सक्षम करने के लिए, एक नई मशीन ओनर की " +"(MOK) नामांकित की जानी चाहिए। इस प्रक्रिया में बाद में पासवर्ड दर्ज करना आवश्यक होता " +"है। कृपया कुंजी से संबद्ध निम्नलिखित पासवर्ड नोट कर लें:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "मैंने MOK पासवर्ड नोट कर लिया है (_p)" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "पुनरारंभ और नामांकन (_R)…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "सेटअप निर्देश: कृपया ध्यानपूर्वक पढ़ें" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"पुनरारंभ के बाद, उपकरण सेटअप स्क्रीन दिखाई देगी। नए ड्राइवर सक्षम करने के लिए, सेटअप " +"चरणों की पलना करें:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• “Enroll MOK” चुनें\n" +"• कुंजियां नामांकन हेतु “Yes” चुनें\n" +"• संकेत मिलने पर MOK पासवर्ड दर्ज करें\n" +"• फिर “Reboot” चुनें" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "सुरक्षा निहितार्थ" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"सफल कुंजी नामांकन के बाद, ध्यान रखें कि मॉड्यूल या किसी अन्य मॉड्यूल के किसी भी भविष्य के " +"अद्यतन पर पूरी तरह से भरोसा किया जाएगा। भविष्य में सभी अद्यतन बिना किसी संकेत या " +"प्राधिकरण के होंगें।" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"आगे का मार्गदर्शन दस्तावेज़ पृष्ठ पर पाया जा सकता है।" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "अतिरिक्त मेटाडेटा फाइलें डाउनलोड हो रही हैं…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " और " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s स्क्रिप्ट के लिए उपलब्ध फॉन्ट" +msgstr[1] "%s स्क्रिप्ट के लिए उपलब्ध फॉन्ट" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s के लिए उपलब्ध सॉफ्टवेयर" +msgstr[1] "%s के लिए उपलब्ध सॉफ्टवेयर" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "अनुरोधित सॉफ्टवेयर नहीं मिला" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "अनुरोधित सॉफ्टवेयर खोजने में विफल" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s नहीं मिला" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "वेबसाइट पर" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "कोई भी ऐप उपलब्ध नहीं है जो फाइल %s प्रदान करता हो।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"%s के बारे में जानकारी, साथ ही अनुपलब्ध ऐप्स को कैसे प्राप्त करें इसके विकल्प भी %s में मिल " +"सकते हैं।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s समर्थन के लिए कोई ऐप उपलब्ध नहीं है।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s उपलब्ध नहीं है।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"%s के बारे में जानकारी, साथ ही इस प्रारूप का समर्थन करने वाला ऐप कैसे प्राप्त करें, इसके " +"विकल्प %s में मिल सकते हैं।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s स्क्रिप्ट समर्थन के लिए कोई फॉन्ट उपलब्ध नहीं है।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"%s के बारे में जानकारी, साथ ही अतिरिक्त फॉन्ट कैसे प्राप्त करें इसके विकल्प %s में मिल सकते हैं।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s प्रारूप के लिए कोई ऐडऑन कोडेक्स उपलब्ध नहीं है।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"%s के बारे में जानकारी, साथ ही इस प्रारूप को चलाने वाले कोडेक को कैसे प्राप्त करें, इसके " +"विकल्प %s में मिल सकते हैं।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s समर्थन के लिए कोई प्लाज़्मा संसाधन उपलब्ध नहीं है।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"%s के बारे में जानकारी, साथ ही अतिरिक्त प्लाज़्मा संसाधन कैसे प्राप्त करें इसके विकल्प %s में " +"मिल सकते हैं।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s के लिए कोई प्रिंटर ड्राइवर उपलब्ध नहीं हैं।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"%s के बारे में जानकारी, साथ ही इस प्रिंटर का समर्थन करने वाला ड्राइवर कैसे प्राप्त करें, " +"इसके विकल्प %s में मिल सकते हैं।" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "दस्तावेज़ीकरण" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "%s द्वारा अनुरोधित %s को खोजने में असमर्थ। अधिक जानकारी के लिए कृपया %s देखें।" +msgstr[1] "%s द्वारा अनुरोधित %s को खोजने में असमर्थ. अधिक जानकारी के लिए कृपया %s देखें।" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"आप जिस %s को खोज रहे थे उसे खोजने में असमर्थ। अधिक जानकारी के लिए कृपया %s देखें।" +msgstr[1] "" +"आप जिस %s को खोज रहे थे उसे ढूंढने में असमर्थ। अधिक जानकारी के लिए कृपया %s देखें।" + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "कोई भी खोज परिणाम खोजने में विफल: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s फाइल प्रारूप" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "सभी स्थापित करें (_A)" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "अनुरोधित सॉफ्टवेयर खोजने में असमर्थ" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "कोडेक्स पृष्ठ" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "कोई परिणाम नहीं मिला" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "खोज निष्पादित करने में असमर्थ" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "पिछला" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "अगला" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "विशिष्ट ऐप्स सूची" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "डेस्कटॉप समर्थन" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "बड़ी स्क्रीन पर उपयोग किए जाने का समर्थन करता है" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "डेस्कटॉप समर्थन अज्ञात" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "यह जानने के लिए पर्याप्त जानकारी नहीं है कि बड़ी स्क्रीन समर्थित हैं या नहीं" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "बड़ी स्क्रीन की आवश्यकता है" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "डेस्कटॉप समर्थित नहीं है" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "बड़ी स्क्रीन पर उपयोग नहीं किया जा सकता" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "मोबाइल समर्थन" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "छोटे स्क्रीन पर उपयोग किये जाने का समर्थन" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "मोबाइल समर्थन अज्ञात" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "यह जानने के लिए पर्याप्त जानकारी नहीं है कि क्या छोटी स्क्रीन समर्थित हैं" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "छोटी स्क्रीन की आवश्यकता है" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "मोबाइल समर्थित नहीं" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "छोटे स्क्रीन पर उपयोग नहीं किया जा सकता" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "कीबोर्ड समर्थन" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "कीबोर्ड समर्थन अज्ञात" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "यह जानने के लिए पर्याप्त जानकारी नहीं है कि क्या कीबोर्ड समर्थित हैं" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "कीबोर्ड आवश्यक" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "कीबोर्ड का समर्थन करता है" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "कीबोर्ड समर्थित नहीं" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "कीबोर्ड के साथ उपयोग नहीं किया जा सकता" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "माउस का समर्थन" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "एक माउस या सूचक उपकरण की आवश्यकता है" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "माउस समर्थन अज्ञात" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"यह जानने के लिए पर्याप्त जानकारी नहीं है कि माउस या सूचक उपकरण समर्थित हैं या नहीं" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "माउस आवश्यक" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "माउस और सूचक उपकरणों का समर्थन करता है" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "माउस समर्थित नहीं" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "माउस या सूचक उपकरण के साथ उपयोग नहीं किया जा सकता" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "टचस्क्रीन समर्थन" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "टचस्क्रीन समर्थन अज्ञात" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "यह जानने के लिए पर्याप्त जानकारी नहीं है कि क्या टचस्क्रीन समर्थित है" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "टचस्क्रीन आवश्यक" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "टचस्क्रीन का समर्थन करता है" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "टचस्क्रीन समर्थित नहीं" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "टचस्क्रीन के साथ उपयोग नहीं किया जा सकता" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "गेमपैड आवश्यक" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "गेमपैड की आवश्यकता है" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "गेमपैड समर्थन" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "गेमपैड का समर्थन करता है" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s संभवतः इस उपकरण पर काम करता है" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s इस उपकरण पर काम करता है" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s संभवतः इस उपकरण पर काम करता है" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s इस उपकरण पर ठीक से काम नहीं करेगा" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s इस उपकरण पर काम नहीं करेगा" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "हार्डवेयर समर्थन" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "नेविगेशन" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "अन्वेषण पृष्ठ पर जाएं" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "स्थापित पृष्ठ पर जाएं" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "अद्यतन पृष्ठ पर जाएं" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "खोज पट्टी खोलें" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "विंडो" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "प्राथमिकताएं खोलें" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "सॉफ्टवेयर रिपोजिटरी खोलें" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "सहायता" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "कीबोर्ड शॉर्टकट खोलें" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "स्थापित" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "स्थापित पृष्ठ" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "प्रगति पर है" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "ऐप्स" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "वेब ऐप्स" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "सिस्टम ऐप्स" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "समुदाय निर्मित" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "सम्मिलित हों (_G)" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"यह ऐप एक अंतरराष्ट्रीय समुदाय द्वारा खुले तौर पर विकसित किया गया है, और %s लाइसेंस के तहत जारी किया गया है।\n" +"\n" +"आप भाग ले सकते हैं और इसे और भी बेहतर बनाने में मदद कर सकते हैं।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"यह ऐप एक अंतरराष्ट्रीय समुदाय द्वारा खुले तौर पर विकसित किया गया है, और %s लाइसेंस के " +"तहत जारी किया गया है।\n" +"\n" +"आप भाग ले सकते हैं और इसे और भी बेहतर बनाने में मदद कर सकते हैं।" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"यह सॉफ्टवेयर एक अंतरराष्ट्रीय समुदाय द्वारा खुले तौर पर विकसित किया गया है, और %s लाइसेंस के तहत जारी किया गया है।\n" +"\n" +"आप भाग ले सकते हैं और इसे और भी बेहतर बनाने में मदद कर सकते हैं।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"यह सॉफ्टवेयर एक अंतरराष्ट्रीय समुदाय द्वारा खुले तौर पर विकसित किया गया है, और %s " +"लाइसेंस के तहत जारी किया गया है।\n" +"\n" +"आप भाग ले सकते हैं और इसे और भी बेहतर बनाने में मदद कर सकते हैं।" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "अज्ञात लाइसेंस" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "अधिक जानें (_L)" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"यह ऐप निर्दिष्ट नहीं करता है कि इसे किस लाइसेंस के तहत विकसित किया गया है, और यह " +"मालिकाना हो सकता है। यह उन तरीकों से असुरक्षित हो सकता है जिनका पता लगाना कठिन हो, " +"और यह निरीक्षण के बिना बदल सकता है।\n" +"\n" +"आप इस सॉफ्टवेयर में योगदान करने में सक्षम भी हो सकते हैं और नहीं भी।" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"यह सॉफ्टवेयर निर्दिष्ट नहीं करता है कि इसे किस लाइसेंस के तहत विकसित किया गया है, और यह " +"मालिकाना हो सकता है। यह उन तरीकों से असुरक्षित हो सकता है जिनका पता लगाना कठिन हो, " +"और यह निरीक्षण के बिना बदल सकता है।\n" +"\n" +"आप इस सॉफ्टवेयर में योगदान करने में सक्षम भी हो सकते हैं और नहीं भी।" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "मालिकाना" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"यह ऐप खुले तौर पर विकसित नहीं किया गया है, इसलिए केवल इसके डेवलपर्स ही जानते हैं कि यह " +"कैसे काम करता है। यह उन तरीकों से असुरक्षित हो सकता है जिनका पता लगाना कठिन हो, और " +"यह निरीक्षण के बिना बदल सकता है।\n" +"\n" +"हो सकता है कि आप इस ऐप में योगदान न कर पाएं।" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"यह सॉफ्टवेयर खुले में विकसित नहीं किया गया है, इसलिए केवल इसके विकासकर्ता ही जानते हैं कि " +"यह कैसे काम करता है। यह उन तरीकों से असुरक्षित हो सकता है जिनका पता लगाना कठिन हो, " +"और यह निरीक्षण के बिना बदल सकता है।\n" +"\n" +"हो सकता है कि आप इस ऐप में योगदान न कर पाएं।" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "विशेष लाइसेंस" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"यह ऐप विशेष लाइसेंस %s के तहत विकसित किया गया है।\n" +"\n" +"आप इस सॉफ्टवेयर में योगदान करने में सक्षम भी हो सकते हैं और नहीं भी।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"यह ऐप विशेष लाइसेंस \"%s\" के तहत विकसित किया गया है।\n" +"\n" +"आप इस सॉफ्टवेयर में योगदान करने में सक्षम भी हो सकते हैं और नहीं भी।" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"यह सॉफ्टवेयर विशेष लाइसेंस %s के अंतर्गत विकसित किया गया है।\n" +"\n" +"आप इस सॉफ्टवेयर में योगदान करने में सक्षम भी हो सकते हैं और नहीं भी।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"यह सॉफ्टवेयर विशेष लाइसेंस “%s” के अंतर्गत विकसित किया गया है।\n" +"\n" +"आप इस सॉफ्टवेयर में योगदान करने में सक्षम भी हो सकते हैं और नहीं भी।" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "डेटा ताज़ा किया जा रहा" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "पृष्ठ लोड हो रहा है" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "प्रारंभ हो रहा है" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "अज्ञात स्रोत" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "बीटा" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "उपयोक्ता" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "जोड़े जायेंगे" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "हटाये जायेंगे" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "अद्यतन" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "डाउनग्रेड" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "चयनित बाह्य स्रोत" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"%s से अतिरिक्त सॉफ्टवेयर तक पहुंच प्रदान करता है। कुछ मालिकाना सॉफ्टवेयर शामिल है।\n" +"\n" +"आप उन रिपॉजिटरी को बाद में सॉफ्टवेयर रिपॉजिटरी प्राथमिकताओं में सक्षम कर सकते हैं।" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "तृतीय पक्ष सॉफ्टवेयर रिपॉजिटरी सक्षम करें?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "नजरअंदाज (_I)" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "सक्षम (_E)" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "आपके ऑपरेटिंग सिस्टम के लिए उपलब्ध है" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "%s के लिए उपलब्ध है" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "अन्वेषण" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "अवलोकन पृष्ठ" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "उपलब्ध ऐप्स" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "अन्य श्रेणियां" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "कोई ऐप डेटा नहीं मिला" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "अज्ञात" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "ठीक है (_O)" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "उपयोक्ता ने स्थापना अस्वीकार कर दी" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s को तैयार करें" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "क्या आप वाकई %s रिपॉजिटरी को हटाना चाहते हैं?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"%s से सभी ऐप्स अस्थापित कर दिये जाएंगे, और आपको उन्हें दोबारा उपयोग करने के लिए " +"रिपॉजिटरी की फिर से स्थापना करनी होगी।" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "%s अस्थापित करें?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "हटाने के बाद %s का उपयोग करना संभव नहीं होगा।" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "हटाने के बाद %s पर निर्भर किसी भी ऐप का उपयोग करना संभव नहीं होगा।" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"इसे हटाने के बाद %s का उपयोग करना संभव नहीं होगा, तथा इसका उपयोग करने वाले सभी " +"दस्तावेज़ भिन्न फॉन्ट में दिखाई देंगे।" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"%s को हटाने के बाद उसका उपयोग नहीं किया जा सकेगा। इसका मतलब यह हो सकता है कि कुछ " +"मीडिया फाइलें अब चलाने योग्य नहीं होंगी।" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "%s पर निर्भर हार्डवेयर हटाने के बाद शायद ठीक से काम न करे।" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"हटाने के बाद %s का उपयोग करना संभव नहीं होगा। भविष्य में ऐप को पुनर्स्थापित करने की " +"अनुमति देने के लिए ऐप डेटा और सेटिंग्स को डिस्क पर रखा जाएगा।" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "प्राथमिकताएं" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "सॉफ्टवेयर अद्यतन" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "अधिक जानकारी" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"अद्यतनों की जांच करना और डाउनलोड करना डेटा और पावर का उपयोग करता है। इसलिए " +"मीटरीकृत नेटवर्क कनेक्शन पर और पावर सेवर चालू होने पर स्वचालित अद्यतन सुविधाएं रोक दी " +"जाती हैं।" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "स्वचालित (_A)" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "स्वचालित रूप से अद्यतनों की जांच करें और डाउनलोड करें" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "हस्तचालित (_M)" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "अद्यतनों की जांच करना और उन्हें डाउनलोड करना हस्तचालित रूप से किया जाना चाहिए" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "स्वचालित अद्यतन अधिसूचना (_N)" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "अद्यतन स्वचालित रूप से स्थापित होने पर सूचित करें" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "सामग्री फिल्टर" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "केवल मुफ़्त सॉफ्टवेयर दिखाएं (_F)" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "देखते और खोजते समय मालिकाना सॉफ्टवेयर छिपाएं" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "केवल सत्यापित विकासकर्ता दिखाएं (_V)" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "केवल उन विकासकर्ता के ऐप्स दिखाएं जिनकी पहचान सत्यापित हो चुकी है" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"स्थापित सॉफ्टवेयर %s के साथ असंगत है, और उन्नयन के दौरान स्वचालित रूप से हटा दिया जाएगा।" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "असंगत सॉफ्टवेयर" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "उन्नयन (_U)" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "अस्थापित करें (_U)" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "ऐप सेटिंग्स & डेटा" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "रखें (_K)" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "ऐप सेटिंग्स और सामग्री को पुनर्स्थापित करने की अनुमति देता है" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "मिटाएं (_D)" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "डिस्क स्थान बचाने के लिए डेटा को स्थायी रूप से हटा देता है" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "सॉफ्टवेयर जो “%s” से स्थापित किया गया है, उसे अद्यतन प्राप्त होना बंद हो जाएगा।" + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "रिपोजिटरी अक्षम करें?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "रिपोजिटरी हटाएं?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "अक्षम करें (_D)" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "हटाएं (_R)" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "नई रिपॉजिटरी सक्षम करें" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "जब नए रिपॉजिटरीज जोड़े जाएं तो उन्हें चालू करें" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "अधिक जानकारी" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "चयनित तृतीय पक्षों से अतिरिक्त रिपॉजिटरी - %s।" + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "फेडोरा तृतीय पक्ष रिपॉजिटरी" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "ऑपरेटिंग सिस्टम" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "ये रिपॉजिटरी %s द्वारा प्रदान किए गए तयशुदा सॉफ्टवेयर का पूरक हैं।" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "सॉफ्टवेयर रिपॉजिटरी" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "कोई रिपॉजिटरी नहीं" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u ऐप स्थापित" +msgstr[1] "%u ऐप्स स्थापित" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u ऐड-ऑन स्थापित" +msgstr[1] "%u ऐड-ऑन्स स्थापित" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u ऐप" +msgstr[1] "%u ऐप्स" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u ऐड-ऑन" +msgstr[1] "%u ऐड-ऑन्स" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s और %s स्थापित" +msgstr[1] "%s और %s स्थापित" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "स्थापित सॉफ्टवेयर की जांच…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "हटाएं" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "इससे नफ़रत है" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "यह पसंद नहीं" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "यह ठीक है" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "यह पसंद है" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "यह अत्यधिक पसंद है" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "रेटिंग देने के लिए एक सितारा चुनें" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "कृपया समीक्षा के लिए अधिक समय लें" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "कृपया तारा रेटिंग चुनें" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "सारांश बहुत ही छोटा है" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "सारांश बहुत बड़ा है" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "विवरण बहुत छोटा है" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "विवरण बहुत बड़ा है" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "समीक्षा लिखें" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "भेजें (_S)" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"कृपया एक रेटिंग, सारांश और समीक्षा पाठ प्रदान करें। समस्याओं की रिपोर्ट करने के लिए " +"समीक्षाओं का उपयोग नहीं किया जाना चाहिए: इसके बजाय, विकासकर्ता या अपने सहायता " +"प्रदाता से संपर्क करें।" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "सारांश की समीक्षा करें" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "एक संक्षिप्त समीक्षा लिखें" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"हमारी गोपनीयता नीति में पता " +"लगाएं कि कौन सा डेटा भेजा गया है। आपके खाते से जुड़ा पूरा नाम सार्वजनिक रूप से दिखाया " +"जाएगा।" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "कुल %u समीक्षा" +msgstr[1] "कुल %u समीक्षाएं" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "5 सितारों में से" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "अज्ञात" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "आप अपमानजनक, असभ्य या भेदभावपूर्ण व्यवहार के लिए समीक्षाओं की रिपोर्ट कर सकते हैं।" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"एक बार रिपोर्ट किए जाने के बाद, समीक्षा तब तक छिपी रहेगी जब तक कि किसी व्यवस्थापक " +"द्वारा इसकी जांच न कर ली जाए।" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "समीक्षा की रिपोर्ट करें?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "रिपोर्ट (_R)" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "समीक्षा हटाएं?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "समीक्षा को हटाना पूर्ववत नहीं किया जा सकता।" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "समीक्षा पसंद करें" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "समीक्षा नापसंद करें" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "रिपोर्ट…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "हटाएं…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"ऐप को सैंडबॉक्स नहीं किया गया है लेकिन वितरण ने जांच की है कि यह दुर्भावनापूर्ण नहीं है" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "जांचें कि आप विक्रेता पर भरोसा करते हैं, क्योंकि ऐप सैंडबॉक्स्ड नहीं है" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "कोई अनुमतियां नहीं" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "ऐप पूरी तरह से सैंडबॉक्स्ड है" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "नेटवर्क पहुंच" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "इंटरनेट तक पहुंच सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "कोई नेटवर्क पहुंच नहीं" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "इंटरनेट तक नहीं पहुंच सकता" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "सिस्टम सेवाओं का उपयोग करता है" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "सिस्टम सेवाओं से डेटा का अनुरोध कर सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "सत्र सेवाओं का उपयोग करता है" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "सत्र सेवाओं से डेटा का अनुरोध कर सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "उपयोक्ता उपकरण तक पहुंच" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "वेबकैम या गेमिंग कंट्रोलर जैसे उपकरणों तक पहुंच सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "कोई उपयोक्ता उपकरण तक पहुंच नहीं" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "वेबकैम या गेमिंग कंट्रोलर जैसे उपकरणों तक नहीं पहुंच सकता" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "इनपुट उपकरण तक पहुंच" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "माइक्रोफोन तक पहुंच और ऑडियो प्लेबैक" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"बिना अनुमति मांगे माइक्रोफोन का उपयोग करके सुन और बिना अनुमति के ऑडियो चला सकता है" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "सिस्टम उपकरण तक पहुंच" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "उन सिस्टम उपकरणों तक पहुंच सकते हैं जिनके लिए उन्नत अनुमतियों की आवश्यकता होती है" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "स्क्रीन सामग्री तक पहुंच" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "स्क्रीन या अन्य विंडो की सामग्री तक पहुंच सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "अप्रचलित विंडो सिस्टम" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "मनमानी अनुमतियां" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "उपयोक्ता सेटिंग" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "संपूर्ण फाइल सिस्टम पढ़ने/लिखने की पहुंच" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "फाइल सिस्टम पर सभी डेटा को पढ़ और लिख सकते हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "गृह फोल्डर पढ़ने/लिखने की पहुंच" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "अपने गृह फोल्डर में सभी डेटा को पढ़ और लिख सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "पूर्ण फाइल सिस्टम पढ़ने की पहुंच" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "फाइल सिस्टम पर सभी डेटा पढ़ सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "गृह फोल्डर पढ़ने की पहुंच" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "आपके गृह डायरेक्टरी में सभी डेटा पढ़ सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "डाउनलोड फोल्डर पढ़ने/लिखने की पहुंच" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "आपकी डाउनलोड निर्देशिका में सभी डेटा को पढ़ और लिख सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "डाउनलोड फोल्डर पढ़ने की पहुंच" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "आपकी डाउनलोड निर्देशिका में सभी डेटा पढ़ सकते हैं" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "निर्देशिका में सभी डेटा को पढ़ और लिख सकता हैं" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "निर्देशिका में सभी डेटा पढ़ सकता हैं" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "कोई फाइल सिस्टम पहुंच नहीं" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "फाइल सिस्टम तक बिल्कुल भी नहीं पहुंच सकता" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "ऐप विकासकर्ता सत्यापित है" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "इस ऐप के विकासकर्ता को सत्यापित किया गया है कि वे वही हैं जो वे कहते हैं" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "असुरक्षित निर्भरताएं" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "सॉफ्टवेयर या इसकी निर्भरताएं अब समर्थित नहीं हैं और असुरक्षित हो सकती हैं" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"यह ऐप निर्दिष्ट नहीं करता है कि इसे किस लाइसेंस के तहत विकसित किया गया है, और यह " +"मालिकाना हो सकता है" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"यह सॉफ्टवेयर निर्दिष्ट नहीं करता है कि इसे किस लाइसेंस के तहत विकसित किया गया है, और यह " +"मालिकाना हो सकता है" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "मालिकाना कोड" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"स्रोत कोड सार्वजनिक नहीं है, इसलिए इसका स्वतंत्र रूप से ऑडिट नहीं किया जा सकता है और यह " +"असुरक्षित हो सकता है" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "यह ऐप विशेष लाइसेंस \"%s\" के अंतर्गत विकसित किया गया है" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "यह सॉफ्टवेयर विशेष लाइसेंस \"%s\" के अंतर्गत विकसित किया गया है" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "लेखापरीक्षा योग्य कोड" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"स्रोत कोड सार्वजनिक है और इसका स्वतंत्र रूप से ऑडिट किया जा सकता है, जिससे ऐप के सुरक्षित " +"होने की अधिक संभावना है" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s को विशेषाधिकार प्राप्त है" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s सुरक्षित है" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s संभवतः सुरक्षित है" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s संभवतः असुरक्षित है" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s असुरक्षित है" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "अज्ञात" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "सुरक्षा" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "लाइसेंस" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "स्रोत" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"यह ऐप सॉफ्टवेयर प्लेटफॉर्म (SDK) के पुराने संस्करण का उपयोग करता है और इसमें बग या सुरक्षा " +"कमजोरियां हो सकती हैं जिन्हें ठीक नहीं किया जा सकेगा।" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "पिछला स्क्रीनशॉट" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "अगला स्क्रीनशॉट" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "कोई स्क्रीनशॉट नहीं" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "स्क्रीनशॉट नहीं मिला" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "छवि लोड करने में विफल" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "स्क्रीनशॉट का आकार नहीं मिला" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "संचय नहीं बना सके" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "स्क्रीनशॉट मान्य नहीं" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "स्क्रीनशॉट उपलब्ध नहीं" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "स्क्रीनशॉट" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u अधिक मिलान" +msgstr[1] "%u अधिक मिलान" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "खोज पृष्ठ" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "ऐप्स खोजें" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "कोई ऐप नहीं मिला" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "अद्यतन डाउनलोड करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "फर्मवेयर अद्यतन डाउनलोड करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "%s से फर्मवेयर अद्यतन डाउनलोड करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "%s से अद्यतन डाउनलोड करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "अद्यतन करने में असमर्थ: इंटरनेट का उपयोग आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "अद्यतन करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "%s से अद्यतन डाउनलोड करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "अद्यतन करने में असमर्थ: प्रमाणीकरण आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "अद्यतन करने में असमर्थ: अमान्य प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "अद्यतन करने में असमर्थ: अनुमति आवश्यक है" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"अद्यतन डाउनलोड करने में असमर्थ: आपके पास सॉफ़्टवेयर को स्थापित करने की अनुमति नहीं है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "अद्यतनों की सूची प्राप्त करने में असमर्थ" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "स्थापित करने में असमर्थ: डाउनलोड विफल रहा" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s स्थापित करने में असमर्थ: %s से डाउनलोड विफल" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s स्थापित करने में असमर्थ: डाउनलोड विफल" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "स्थापित करने में असमर्थ: रनटाइम गुम है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s स्थापित करने में असमर्थ: रनटाइम %s अनुपलब्ध" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "%s को स्थापित करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "स्थापित करने में असमर्थ: इंटरनेट का उपयोग आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "स्थापित करने में असमर्थ: अमान्य ऐप प्रारूप" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "स्थापित करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s स्थापित करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं है" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "स्थापित करने में असमर्थ: प्रमाणीकरण आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s स्थापित करने में असमर्थ: प्रमाणीकरण आवश्यक" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "स्थापित करने में असमर्थ: अमान्य प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s स्थापित करने में असमर्थ: अमान्य प्रमाणीकरण" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "स्थापित करने में असमर्थ: अनुमति आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s स्थापित करने में असमर्थ: अनुमति आवश्यक" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "स्थापित करने में असमर्थ: उपकरण को प्लग इन करना होगा" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s स्थापित करने में असमर्थ: उपकरण प्लग इन होना चाहिए" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "स्थापित करने में असमर्थ: बैटरी कम है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s स्थापित करने में असमर्थ: बैटरी कम है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%1$s को %2$s से अद्यतन करने में असमर्थ: डाउनलोड विफल" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s को अद्यतन करने में असमर्थ: डाउनलोड विफल रहा" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "%s से अद्यतन स्थापित करने में असमर्थ: डाउनलोड विफल" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "अद्यतन करने में असमर्थ: डाउनलोड विफल रहा" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s को अद्यतन करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s को अद्यतन करने में असमर्थ: प्रमाणीकरण आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s को अद्यतन करने में असमर्थ: अमान्य प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s को अद्यतन करने में असमर्थ: अनुमति आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "अद्यतन करने में असमर्थ: उपकरण प्लग इन होना चाहिए" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s को अद्यतन करने में असमर्थ: उपकरण प्लग इन होना चाहिए" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "अद्यतन करने में असमर्थ: कम बैटरी" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s को अद्यतन करने में असमर्थ: कम बैटरी" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "%s को अद्यतन करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "अद्यतन करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "उन्नयन करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%s से %s पर नवीनीकृत करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "उन्नयन करने में असमर्थ: डाउनलोड विफल रहा" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "%s में उन्नयन करने में असमर्थ: डाउनलोड विफल रहा" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "उन्नयन करने में असमर्थ: इंटरनेट का उपयोग आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "%s में उन्नयन करने में असमर्थ: इंटरनेट का उपयोग आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "उन्नयन करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "%s में उन्नयन करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "उन्नयन करने में असमर्थ: प्रमाणीकरण आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "%s में उन्नयन करने में असमर्थ: प्रमाणीकरण आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "उन्नयन करने में असमर्थ: अमान्य प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "%s में उन्नयन करने में असमर्थ: अमान्य प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "उन्नयन करने में असमर्थ: अनुमति आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "%s में उन्नयन करने में असमर्थ: अनुमति आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "उन्नयन करने में असमर्थ: उपकरण को प्लग इन करना होगा" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "%s में उन्नयन करने में असमर्थ: उपकरण को प्लग इन करना होगा" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "उन्नयन करने में असमर्थ: कम बैटरी" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "%s में उन्नयन करने में असमर्थ: कम बैटरी" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "%s में उन्नयन करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "अस्थापित करने में असमर्थ: प्रमाणीकरण आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s को अस्थापित करने में असमर्थ: प्रमाणीकरण आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "अस्थापित करने में असमर्थ: अमान्य प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s को अस्थापित करने में असमर्थ: अमान्य प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "अस्थापित करने में असमर्थ: अनुमति आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s को अस्थापित करने में असमर्थ: अनुमति आवश्यक है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "अस्थापित करने में असमर्थ: उपकरण प्लग इन होना चाहिए" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s को अस्थापित करने में असमर्थ: उपकरण प्लग इन होना चाहिए" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "अस्थापित करने में असमर्थ: कम बैटरी" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s को अस्थापित करने में असमर्थ: कम बैटरी" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s को अस्थापित करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "%s प्रारंभ करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "क्षमा करें, कुछ गलत हुआ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s को शुरू करने में असमर्थ: %s स्थापित नहीं है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "अभियान के लिए पर्याप्त डिस्क स्थान नहीं" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "स्थापित करने में असमर्थ: फाइल प्रकार समर्थित नहीं है" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "स्थापित करने में असमर्थ: प्रमाणीकरण विफल रहा" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "स्थापित करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "%s से संपर्क करने में असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "नए प्लगइन्स का उपयोग करने के लिए सॉफ्टवेयर को पुनरारंभ करें" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "उपकरण को प्लग इन करना होगा" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "बैटरी का स्तर बहुत कम है" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "सॉफ्टवेयर रिपोजिटरी (_S)" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "प्राथमिकताएं (_P)" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "कीबोर्ड शॉर्टकट (_K)" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "सॉफ्टवेयर के बारे में (_A)" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "खोजें" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "मुख्य मेनू" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "ऐप्स खोजें" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "अन्वेषण (_E)" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "स्थापित (_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "अद्यतन (_U)" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "पीछे जाएं" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "कोई नहीं" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "ऐप डेटा" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "ऐप चलाने के लिए डेटा की आवश्यकता है" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "उपयोक्ता का डेटा" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "ऐप में आपके द्वारा बनाया गया डेटा" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "कैशे डेटा" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "अस्थायी कैश्ड डेटा" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "ऐप स्वयं" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "आवश्यक निर्भरताएं" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "इस ऐप के लिए आवश्यक साझा सिस्टम घटक" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "अज्ञात" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "कैश्ड डेटा को ऐप सेटिंग्स (_a) से हटाया जा सकता है" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "स्टोरेज" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (स्थापित)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (स्थापना करना)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (डाउनलोड हो रहा है)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (निकालना)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "विवरण (_D)" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "परीक्षण करें (_E)" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "%s पर स्थापित" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "स्थापित अद्यतन" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "कोई अद्यतन स्थापित नहीं" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "अद्यतन पुराने हो चुके हैं" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "कृपया उपलब्ध अद्यतनों की जांच करें" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "महत्वपूर्ण अद्यतन स्थापित करने के लिए तैयार हैं" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "यथाशीघ्र महत्वपूर्ण अद्यतन स्थापित करें" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "महत्वपूर्ण अद्यतन डाउनलोड करने के लिए उपलब्ध हैं" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "यथाशीघ्र महत्वपूर्ण अद्यतन डाउनलोड करें" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "अद्यतन स्थापित करने के लिए तैयार हैं" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "सॉफ्टवेयर अद्यतन तैयार हैं और प्रतीक्षा में हैं" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "अद्यतन डाउनलोड के लिए उपलब्ध हैं" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "सॉफ्टवेयर अद्यतन डाउनलोड किया जा सकता है" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u ऐप अद्यतित - पुनरारंभ आवश्यक" +msgstr[1] "%u ऐप्स अद्यतित - पुनरारंभ आवश्यक" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u ऐप अद्यतित" +msgstr[1] "%u ऐप्स अद्यतित" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s अद्यतित।" + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "कृपया ऐप पुनरारंभ करें।" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s और %s अद्यतित।" + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u ऐप को पुनरारंभ की आवश्यकता है।" +msgstr[1] "%u ऐप्स को पुनरारंभ की आवश्यकता है।" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s, %s और %s शामिल हैं।" + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "सिस्टम जीवन के अंत तक पहुंच गया है" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "अद्यतन प्राप्त करना जारी रखने के लिए उन्नयन करें" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s का नया संस्करण स्थापित करने के लिए उपलब्ध है" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "सॉफ्टवेयर नवीनीकरण उपलब्ध" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "सॉफ्टवेयर अद्यतन विफल" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "तैयार अद्यतन स्थापित नहीं किए गए" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "विवरण दिखाएं" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "सिस्टम उन्नयन पूरा हो गया" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "%s %s में आपका स्वागत है!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "सॉफ्टवेयर अद्यतन स्थापित" +msgstr[1] "सॉफ्टवेयर अद्यतन स्थापित" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "एक महत्वपूर्ण ऑपरेटिंग सिस्टम अद्यतन स्थापित किया गया है।" +msgstr[1] "महत्वपूर्ण ऑपरेटिंग सिस्टम अद्यतन स्थापित किए गए हैं." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "समीक्षा" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "अद्यतन करने में विफल" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "सिस्टम पहले से ही अद्यतन था।" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "अद्यतन रद्द कर दिया गया।" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"इंटरनेट पहुंच आवश्यक थी लेकिन उपलब्ध नहीं थी। कृपया सुनिश्चित करें कि आपके पास इंटरनेट पहुंच है " +"और पुनः प्रयास करें।" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"अद्यतन के साथ सुरक्षा समस्याएं थीं। कृपया अधिक विवरण के लिए अपने सॉफ्टवेयर प्रदाता से " +"परामर्श लें।" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "पर्याप्त डिस्क स्थान नहीं था। कृपया कुछ स्थान रिक्त करें और पुनः प्रयास करें।" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"हमें क्षमा करें: अद्यतन स्थापित करना विफल। कृपया अन्य अद्यतन के लिए प्रतीक्षा करें और पुनः " +"प्रयास करें। यदि समस्या बनी रहती है, तो अपने सॉफ्टवेयर प्रदाता से संपर्क करें।" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "अंतिम जांच: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "रोकें" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "अद्यतनों के लिए जांच करें" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ने महत्वपूर्ण सॉफ्टवेयर अद्यतन प्राप्त करना बंद कर दिया है" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "आपके ऑपरेटिंग सिस्टम को महत्वपूर्ण सॉफ्टवेयर अद्यतन मिलना बंद हो गया है" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "शुल्क लागू हो सकते हैं" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "मोबाइल ब्रॉडबैंड का उपयोग करते समय अद्यतन की जांच करने से शुल्क लागू हो सकते हैं।" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "फिर भी जांचें (_A)" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "सॉफ्टवेयर उन्नयन डाउनलोड किए गए" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "उन्नयन स्थापित करने के लिए तैयार हैं" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "अद्यतनों के लिए जांच करें" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "अद्यतन" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "अद्यतन पृष्ठ" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "अद्यतन लोड हो रहें हैं" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "इसमें कुछ समय लग सकता है" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "अद्यतित" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "मोबाइल डेटा का उपयोग करें?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "मोबाइल ब्रॉडबैंड का उपयोग करते समय अद्यतन की जांच करने से शुल्क लागू हो सकते हैं" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "फिर भी जांचें (_C)" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "कोई कनेक्शन नहीं" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "अद्यतन जांचने के लिए ऑनलाइन जाएं" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "नेटवर्क सेटिंग्स (_N)" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "त्रुटि" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "अद्यतन स्वचालित रूप से प्रबंधित किए जाते हैं" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "सॉफ्टवेयर अद्यतन रोके गए" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "निम्नलिखित कारणों से स्वचालित सॉफ्टवेयर अद्यतन रोक दिए गए हैं:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• वर्तमान नेटवर्क कनेक्शन मीटरीकृत है" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• वर्तमान नेटवर्क कनेक्शन बड़े डाउनलोड को प्रतिबंधित करता है" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• पावर सेवर मोड सक्रिय है" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• गेम मोड सक्रिय है" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "सॉफ्टवेयर अद्यतन रोके गए" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "नेटवर्क कनेक्शन मीटरीकृत है - सॉफ्टवेयर अद्यतन रोके गए" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "नेटवर्क कनेक्शन बड़े डाउनलोड को प्रतिबंधित करता है - सॉफ्टवेयर अद्यतन रोके गए" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "ऊर्जा बचत मोड सक्रिय है - सॉफ्टवेयर अद्यतन रोके गए" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "गेम मोड सक्रिय है - सॉफ्टवेयर अद्यतन रोके गए" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "पुनरारंभ और अद्यतन करें (_R)…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "सभी अद्यतन करें (_P)" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "सॉफ्टवेयर अद्यतन डाउनलोड किए गए" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "अद्यतन स्थापित करने के लिए तैयार हैं" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "एकीकृत फर्मवेयर" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "पुनरारंभ आवश्यक" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "ऐप अद्यतन" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "उपकरण फर्मवेयर" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "डाउनलोड (_D)" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s उपलब्ध है" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s उपलब्ध है" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "नए संस्करण के बारे में जानें" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s में से %s डाउनलोड किया गया" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% डाउनलोड हो गया" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "नई सुविधाओं और अतिरिक्त पॉलिश के साथ एक प्रमुख उन्नयन।" + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "उन्नयन रद्द करें" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "पुनरारंभ और उन्नयन करें (_R)…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "उन्नयन करने से पहले डेटा और फाइलों का बैकअप लेना याद रखें।" + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "त्रुटि विवरण" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "विवरण कॉपी करें" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "फाइल “%s” को हटाने में विफल: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "निर्देशिका “%s” को हटाने में विफल: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "इस कंप्यूटर पर सॉफ्टवेयर जोड़ें, हटाएं या अद्यतन करें" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "" +"अद्यतन;नवीनीकरण;स्रोत;भंडार;प्राथमिकताएं;स्थापित करें;अस्थापित " +"करें;प्रोग्राम;सॉफ्टवेयर;ऐप;स्टोर;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s तैयार" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s सक्षम हेतु तैयार और अगले बूट के लिए मंचित।" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "सक्षम करें" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "सिस्टम अद्यतन" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "सामान्य सिस्टम अद्यतन, जैसे सुरक्षा या बग फिक्स, और प्रदर्शन में सुधार।" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "नई सुविधाओं और सुधारों के साथ %s अद्यतन।" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS अद्यतन सेवा अद्यतन प्राप्त और लागू नहीं कर सकी।" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "वेब ऐप" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "वेब ऐप्स समर्थन" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "किसी ब्राउज़र में लोकप्रिय वेब अनुप्रयोग चलाएं" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "नवीनतम सुविधाओं, प्रदर्शन और स्थिरता में सुधार के लिए उन्नयन करें।" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "फ्लैटपैक समर्थन" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "फ्लैटपैक लिनक्स पर डेस्कटॉप ऐप्स के लिए एक रूपरेखा है" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "सिस्टम फोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "गृह उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "होस्ट सिस्टम फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "/etc से होस्ट सिस्टम विन्यास" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "डेस्कटॉप फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "डेस्कटॉप उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "दस्तावेज़ फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "दस्तावेज़ उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "संगीत फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "संगीत उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "चित्र फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "चित्र उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "सार्वजनिक साझा फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "सार्वजनिक साझा उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "वीडियो फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "वीडियो उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "टेम्प्लेट फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "टेम्प्लेट उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "उपयोक्ता कैशे उपफोल्डर" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "उपयोक्ता कैशे उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "उपयोक्ता विन्यास उपफोल्डर" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "उपयोक्ता विन्यास उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "उपयोक्ता डेटा फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "उपयोक्ता डेटा उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "उपयोक्ता रनटाइम फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "उपयोक्ता रनटाइम उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "%s तक फाइल सिस्टम पहुंच" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "%s के लिए फ्लैटपैक मेटाडेटा प्राप्त कर रहा है…" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "ऐडऑन '%s' को परिष्कृत करने में विफल: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "उपयोक्ता स्थापना" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "सिस्टम स्थापना" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ऐप ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "स्थापित करने के लिए ऐडऑन '%s' जोड़ने में विफल: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "अस्थापित करने के लिए ऐडऑन '%s' जोड़ने में विफल: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"रिमोट “%s” संभवतः इसके फिल्टर के कारण, “%s” की स्थापना की अनुमति नहीं देता है। फिल्टर " +"हटाएं और स्थापना दोहराएं। विस्तृत त्रुटि: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "अद्यतन करने के लिए सिस्टम पावर बहुत कम है" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "अद्यतन करने के लिए सिस्टम पावर बहुत कम है (%u%%, %u%% की आवश्यकता है)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "उपकरण पहुंच योग्य नहीं है, या वायरलेस सीमा से बाहर है" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "उपकरण की बैटरी पावर बहुत कम है" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "उपकरण की बैटरी पावर बहुत कम है (%u%%, %u%% की आवश्यकता है)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "उपकरण अद्यतन लागू होने की प्रतीक्षा कर रहा है" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "उपकरण को कनेक्ट करने के लिए AC पॉवर की आवश्यकता होती है" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "लिड बंद होने पर उपकरण का उपयोग नहीं किया जा सकता" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s उपकरण अद्यतन" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s सिस्टम अद्यतन" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s एंबेडेड नियंत्रक अद्यतन" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME अद्यतन" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s कॉर्पोरेट ME अद्यतन" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s उपभोक्ता ME अद्यतन" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s नियंत्रक अद्यतन" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s थंडरबोल्ट नियंत्रक अद्यतन" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU माइक्रोकोड अद्यतन" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s विन्यास अद्यतन" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s बैटरी अद्यतन" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s कैमरा अद्यतन" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM अद्यतन" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s टचपैड अद्यतन" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s माउस अद्यतन" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s कीबोर्ड अद्यतन" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s संग्रहण नियंत्रक अद्यतन" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s नेटवर्क इंटरफ़ेस अद्यतन" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s प्रदर्शन अद्यतन" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC अद्यतन" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB रिसीवर अद्यतन" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s ड्राइव अद्यतन" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s फ़्लैश ड्राइव अद्यतन" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD अद्यतन" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU अद्यतन" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s डॉक अद्यतन" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB डॉक अद्यतन" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "फर्मवेयर" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "फर्मवेयर अद्यतन लागू नहीं किया जा सका: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "फर्मवेयर उन्नयन समर्थन" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "फर्मवेयर उन्नयन के लिए समर्थन प्रदान करता है" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "अहस्ताक्षरित सॉफ्टवेयर स्थापित करें?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"जो सॉफ्टवेयर स्थापित किया जाना है वह हस्ताक्षरित नहीं है। इस सॉफ्टवेयर के अद्यतन की " +"उत्पत्ति को सत्यापित करना संभव नहीं होगा, या अद्यतन के साथ छेड़छाड़ की गई है या नहीं।" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "अहस्ताक्षरित सॉफ्टवेयर डाउनलोड करें?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"अहस्ताक्षरित अद्यतन उपलब्ध हैं। हस्ताक्षर के बिना, अद्यतन की उत्पत्ति को सत्यापित करना " +"संभव नहीं है, या इसके साथ छेड़छाड़ की गई है या नहीं।" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "अहस्ताक्षरित सॉफ्टवेयर अद्यतन करें?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"अहस्ताक्षरित अद्यतन उपलब्ध हैं। हस्ताक्षर के बिना, अद्यतन की उत्पत्ति को सत्यापित करना " +"संभव नहीं है, या इसके साथ छेड़छाड़ की गई है या नहीं। सॉफ्टवेयर अद्यतन तब तक अक्षम रहेंगे जब " +"तक कि अहस्ताक्षरित अद्यतन को हटा नहीं दिया जाता या अद्यतन नहीं कर दिया जाता।" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "अद्यतन स्थापित करने में विफल: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "पैकेज" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "डाउनलोड से पहले लेनदेन समाप्ति पर प्रतीक्षा करने में विफल: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "अद्यतन डाउनलोड करने में विफल: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "अद्यतन ट्रिगर करने में विफल: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "ऑपरेटिंग सिस्टम (OStree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "स्नैप स्टोर" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "स्नैप समर्थन" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "स्नैप एक सार्वभौमिक लिनक्स पैकेज है" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "सिस्टम" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "सिस्टम घटक" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "sysupdate कार्य '%s' को हटाना %i स्थिति के साथ विफल रहा" diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000..b719e6e --- /dev/null +++ b/po/hr.po @@ -0,0 +1,7456 @@ +# Croatian translation for gnome-software +# Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 +# This file is distributed under the same license as the gnome-software package. +# FIRST AUTHOR , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2022-10-21 14:41+0000\n" +"PO-Revision-Date: 2022-10-21 17:59+0200\n" +"Last-Translator: gogo \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Launchpad-Export-Date: 2017-03-15 15:32+0000\n" +"X-Generator: Poedit 3.1.1\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:21 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Softver" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instalirajte i nadopunite aplikacije" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" +"Softver vam omogućuje pretraživanje i instalaciju novih aplikacija " +"proširenja sustava i uklanjanje postojećih instaliranih aplikacija." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" +"Softver prikazuje istaknute i popularne aplikacije s korisnim opisima i " +"snimkama aplikacija. Aplikacije se mogu pronaći pregledavanjem popisa " +"kategorija ili pretraživanjem. Isto tako vam omogućuje nadopunu vašeg " +"sustava kada nemate pristup Internetu." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panel prikaza" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panel pojedinosti" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panel instaliranog" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel nadopuna" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Pojedinosti nadopune" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2076 +#: src/gs-application.c:256 +msgid "The GNOME Project" +msgstr "GNOME projekt" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instaliraj appstream datoteku u lokaciju sustava" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instalacija appstream datoteke u lokaciju sustava" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Popis kompatibilnih projekata" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Ovo je popis kompatibilnih projekata koji bi trebali biti prikazani poput " +"GNOMA, KDE i XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Treba li upravljati nadopunama i nadogradnjama u GNOME Softveru" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Ako je onemogućeno, GNOME Softver će sakriti panel nadopuna i neće obaviti " +"bilo kakvu radnju automatske nadopune ili upitat za nadogradnju." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automatski preuzmi i instaliraj nadopune" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Ako je omogućeno, GNOME Softver automatski preuzima nadopune u pozadini i " +"instalira one koje ne zahtijevaju ponovno pokretanje." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Obavijesti korisnika o dostupnoj softverskoj nadopuni u pozadini" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Ako je omogućeno, GNOME Softver obavještava korisnika o nadopunama koje su " +"se izvele kada je korisnik mirovao." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Treba li automatski osvježiti pri odmjerenom povezivanju" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Ako je omogućeno, GNOME Softver automatski osvježava u pozadini čak i kada " +"se koristi odmjereno povezivanje (moguće preuzimanje određenih metapodataka, " +"provjeravanje nadopuna, itd., koje može prouzročiti troškove korisniku)" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Je li ovo prvo pokretanje GNOME Softvera" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Prikaži zvjezdice ocjene pokraj aplikacija" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Suzi izbor aplikacija temeljen na zadanom ogranku postavljenom za udaljeno" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Vlasničke aplikacije prikazuju dijalog upozorenja prije instalacije" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Kada se vlasničke aplikacije instaliraju može se prikazati dijalog " +"upozorenja. Ovo upravlja prikazom tog dijaloga." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Vrijeme posljednje provjere nadopune" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Vremenska oznaka obavijesti posljednje nadogradnje" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Vrijeme obavijesti posljednje nadopune" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Vrijeme prve sigurnosne nadopune, uklonjeno nakon nadopune" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Vrijeme posljednje nadopune" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The last timestamp when the system was online and got any updates" +msgstr "" +"Posljednje vrijeme kada je sustav bio povezan s internetom i obavio nadopunu" + +#: data/org.gnome.software.gschema.xml:71 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Vrijeme u sekundama za provjeru valjanosti poslane slike zaslona" + +#: data/org.gnome.software.gschema.xml:72 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Odabir veće vrijednosti znači manje povratnih posjeta na udaljeni " +"poslužitelj, ali nadopuna prikaza slike zaslona može potrajati duže. " +"Vrijednost 0 znači da se nikada ne provjerava poslužitelj ako slika već " +"postoji u predmemoriji." + +#: data/org.gnome.software.gschema.xml:81 +msgid "The server to use for application reviews" +msgstr "Poslužitelj koji će se koristiti za recenzije aplikacija" + +#: data/org.gnome.software.gschema.xml:85 +msgid "The minimum karma score for reviews" +msgstr "Najmanje karma bodova za recenziju" + +#: data/org.gnome.software.gschema.xml:86 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Recenzije s karmom manjom od ovog broja neće biti prikazane." + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Popis službenih repozitorija koji se ne bi trebali smatrati repozitorijima " +"treće strane" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Popis potrebnih repozitorija koji se ne mogu onemogućiti ili ukloniti" + +#: data/org.gnome.software.gschema.xml:98 +msgid "A list of official repositories that should be considered free software" +msgstr "Popis službenih repozitorija koji se mogu smatrati slobodnim softverom" + +#: data/org.gnome.software.gschema.xml:102 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"URL licence koja se koristi kada se aplikacija smatra slobodnim softverom" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Instaliraj paket aplikacija za sve korisnike sustava gdje je moguće" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Allow access to the Software Repositories dialog" +msgstr "Dopusti pristup dijalogu softverskih repozitorija" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Offer upgrades for pre-releases" +msgstr "Predloži nadogradnju na predizdanja" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Prikaži određene elemente grafičkog sučelja za informiranje korisnika da je " +"aplikacija neslobodna" + +#: data/org.gnome.software.gschema.xml:122 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Prikaži instaliranu veličinu aplikacija u popisu instaliranih aplikacija" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:126 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://wiki.open.hr/wiki/Vlasnički_softver'" + +#: data/org.gnome.software.gschema.xml:127 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI koji pojašnjava neslobodni i vlasnički softver" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Popis URL-ova usmjeruje na appstream datoteke koje će biti preuzete u " +"swcatalog mapu" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instaliraj Appstream datoteku u lokaciju sustava za sve korisnike. Ako je " +"laž, datoteke su instalirane na nestandardni $XDG_DATA_HOME/swcatalog/xml " +"direktorij" + +#: data/org.gnome.software.gschema.xml:139 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Poželjni poredak prioriteta formata pakiranja, s najbitnijim formatom " +"poredanim kao prvim. Prazno znači zadani poredak. Izostavljeni formati " +"pretpostavljeno su poredani kao posljednji. Primjeri formata pakiranja su: " +"deb, flatpak, rpm, snap. Formati se po potrebi mogu navesti nazivom izvora, " +"odvojenim dvotočkom, primjerice 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:146 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Pohranjeni izraz gnome-online-account id-a korišten za prijavu" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Softver AppStream instalacijski program za cijeli sustav" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Neuspjela obrada argumenta naredbenog redka" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Morate navesti točno jedan naziv datoteke" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Ovaj program može samo koristiti korijenski korisnik" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Neuspjela provjera sadržaja vrste: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Neuspjelo premještanje: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instaliraj softver" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instaliraj odabrani softver na sustav" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Nasilje u crtićima" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nema informacija o nasilju iz crtića" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Umišljeno nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nema informacija o umišljenom nasilju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Stvarno nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nema informacija o stvarnom nasilju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Nasilje koje prikazuje krvoproliće" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Nema informacija o nasilju krvoprolića" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Seksualno nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nema informacija o seksualnom nasilju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nema informacija o alkoholu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotici" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nema informacija o narkoticima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Duhan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Nema informacija o duhanskim proizvodima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Golotinja" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nema informacija o golotinji" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Seksualne teme" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Nema informacija o aluziji ili prikazu seksualne prirode" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Vulgarnost" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nema informacija o psovki bilo koje vrste" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Neprimjereni humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nema informacija o neprimjerenom humoru" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminacija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Nema informacija o diskriminirajućem jeziku bilo koje vrste" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Oglašavanje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nema informacija o oglasima bilo koje vrste" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Kockanje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nema informacija o kockanju bilo koje vrste" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Kupovina" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nema informacija o mogućnosti trošenja stvarnog novca" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Razgovor između korisnika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Nema informacija o mogućnost razgovora s drugim korisnicima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Zvučni razgovor između korisnika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Nema informacija o mogućnost razgovora s drugim korisnicima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Pojedinosti kontakta" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "Nema informacija o dijeljenju imena i adresa e-pošte društvenih mreža" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identifikacijske informacije" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Nema informacija o dijeljenju informacija korisnika sa trećom stranom" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Dijeljenje lokacije" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Nema informacija o dijeljenju fizičke lokacije sa ostalim korisnicima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksualnost" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nema informacija o pozivanju na homoseksualnost" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitucija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nema informacija o pozivanju na prostituciju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Preljub" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nema informacija o pozivanju na preljub" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Seksualizirani likovi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nema informacija o seksualiziranim likovima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Skrnavljenje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nema informacija o pozivanju na oskvrnuće" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Ljudski ostaci" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nema informacija o vidljivim mrtvim ljudskim ostatacima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Ropstvo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nema informacija o pozivanju na ropstvo" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Ne uključuje pozivanje na droge" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Ne uključuje psovke, kletve i druge vrste nepristojnog govora" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Ne uključuje oglase ili novčane transakcije" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Ne uključuje seks ili golotinju" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Ne uključuje nekontroliranu mogućnost razgovora" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Ne uključuje nasilje" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Droge" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Nepristojan govor" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Novac" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Druženje" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Nasilje" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:658 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Za svakoga" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an application is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1023 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s je prikladan za svakoga" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1027 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s je prikladan za bebe" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1031 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s je prikladan za malu djecu" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1039 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s je prikladan za tinejdžere" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1043 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s je prikladan za odrasle" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1048 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s je prikladan za %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:5 src/gs-app-context-bar.ui:211 +msgid "Age Rating" +msgstr "Dobna ocjena" + +#: src/gs-age-rating-context-dialog.ui:68 +#: src/gs-hardware-support-context-dialog.ui:71 +#: src/gs-safety-context-dialog.ui:221 +msgid "How to contribute missing information" +msgstr "Kako dodati informacije koje nedostaju" + +#: lib/gs-app.c:6178 +msgid "Local file" +msgstr "Lokalna datoteka" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6197 src/gs-safety-context-dialog.c:439 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#: lib/gs-app.c:6274 +msgid "Package" +msgstr "Paket" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:460 +msgid "Pending" +msgstr "Na čekanju" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:464 src/gs-details-page.c:369 +msgid "Pending install" +msgstr "Čekanje na instalaciju" + +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:468 src/gs-details-page.c:376 +msgid "Pending remove" +msgstr "Čekanje na uklanjanje" + +#: src/gs-app-addon-row.c:111 src/gs-app-row.ui:197 src/gs-app-tile.ui:50 +#: src/gs-feature-tile.c:535 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalirano" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:208 src/gs-details-page.c:362 +msgid "Installing" +msgstr "Instalacija" + +#: src/gs-app-addon-row.c:119 +msgid "Removing" +msgstr "Uklanjanje" + +#: src/gs-app-addon-row.ui:64 src/gs-details-page.c:1015 +msgid "_Uninstall" +msgstr "_Deinstaliraj" + +#: src/gs-app-details-page.c:68 +msgid "Network" +msgstr "Mreža" + +#: src/gs-app-details-page.c:68 +msgid "Can communicate over the network" +msgstr "Nemoguća komunikacija putem mreže" + +#: src/gs-app-details-page.c:69 +msgid "System Services" +msgstr "Usluge sustava" + +#: src/gs-app-details-page.c:69 +msgid "Can access D-Bus services on the system bus" +msgstr "Može pristupiti D-bus uslugama na sabirnici sustava" + +#: src/gs-app-details-page.c:70 +msgid "Session Services" +msgstr "Usluge sesije" + +#: src/gs-app-details-page.c:70 +msgid "Can access D-Bus services on the session bus" +msgstr "Može pristupiti D-bus uslugama na sabirnici sesije" + +#: src/gs-app-details-page.c:71 +msgid "Devices" +msgstr "Uređaji" + +#: src/gs-app-details-page.c:71 +msgid "Can access system device files" +msgstr "Može pristupiti datotekama uređaja sustava" + +#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73 +msgid "Home folder" +msgstr "Osobna mapa" + +#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:74 +#: src/gs-app-details-page.c:77 src/gs-app-details-page.c:150 +msgid "Can view, edit and create files" +msgstr "Može vidjeti, uređivati i stvarati datoteke" + +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:75 +#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:145 +msgid "Can view files" +msgstr "Može vidjeti datoteke" + +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75 +msgid "File system" +msgstr "Datotečni sustav" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:77 src/gs-app-details-page.c:78 +msgid "Downloads folder" +msgstr "Mapa preuzimanja" + +#: src/gs-app-details-page.c:79 +msgid "Settings" +msgstr "Postavke" + +#: src/gs-app-details-page.c:79 +msgid "Can view and change any settings" +msgstr "Može vidjeti i promijeniti sve postavke" + +#: src/gs-app-details-page.c:80 +msgid "Legacy display system" +msgstr "Zastarjeli sustav prikaza" + +#: src/gs-app-details-page.c:80 +msgid "Uses an old, insecure display system" +msgstr "Koristi zastarjeli, nesigurni sustav prikaza" + +#: src/gs-app-details-page.c:81 +msgid "Sandbox escape" +msgstr "Zaobilaženje sigurnog okruženja" + +#: src/gs-app-details-page.c:81 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Može izbjeći sigurno okruženje i zaobići bilo koja druga ograničenja" + +#. FIXME support app == NULL +#. set window title +#: src/gs-app-details-page.c:166 +msgid "Update Details" +msgstr "Pojedinosti nadopune" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:174 +msgid "No update description available." +msgstr "Nema dostupnog opisa nadopune." + +#: src/gs-app-details-page.ui:25 src/gs-os-update-page.ui:25 +#: src/gs-shell.ui:367 src/gs-shell.ui:458 +msgid "Go back" +msgstr "Natrag" + +#: src/gs-app-details-page.ui:48 src/gs-app-row.c:523 +msgid "Requires additional permissions" +msgstr "Zahtijeva dodatne dozvole" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:866 +msgid "Reviews" +msgstr "Recenzije" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No reviews were found for this application." +msgstr "Nema pronađenih recenzija za ovu aplikaciju." + +#: src/gs-app-reviews-dialog.ui:27 +msgid "No Reviews" +msgstr "Nema recenzija" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:544 +msgid "Version History" +msgstr "Povijest inačice" + +#: src/gs-app-version-history-row.c:71 +#, c-format +msgid "New in Version %s" +msgstr "Novo u inačici %s" + +#: src/gs-app-version-history-row.c:78 +#, c-format +msgid "Version %s" +msgstr "Inačica %s" + +#: src/gs-app-version-history-row.c:80 +msgid "No details for this release" +msgstr "Nema pojedinosti za ovo izdanje" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:94 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Način pokretanja: ili ‘updates’, ‘updated’, ‘installed’ ili ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "NAČIN RADA" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Pretraži aplikacije" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "PRETRAŽI" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Prikaži pojedinosti aplikacije (upotrebom ID-a aplikacije)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Prikaži pojedinosti aplikacije (upotrebom naziva aplikacije)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NAZIV PAKETA" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instaliraj aplikaciju (upotrebom ID-a aplikacije)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Deinstaliraj aplikaciju (upotrebom ID-a aplikacije)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Otvori lokalni paket aplikacije" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NAZIV DATOTEKE" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Vrsta očekivanog međudjelovanja za ovu radnju: ili ‘none’, ‘notify’, ili " +"‘full’" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Prikaži lokalne metainformacije ili appdata datoteku" + +#: src/gs-application.c:143 +msgid "Show verbose debugging information" +msgstr "Prikaži opširnije informacije otklanjanja greške" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instaliraj sve nadopune na čekanju u pozadini" + +#: src/gs-application.c:147 +msgid "Show update preferences" +msgstr "Prikaži osobitosti nadopune" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Zatvori pokrenuti primjerak" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferiraj lokalne izvore paketa za AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Prikaži broj inačice" + +#: src/gs-application.c:261 src/gs-application.c:269 +msgid "Copyright © 2016–2022 GNOME Software contributors" +msgstr "Autorsko pravo © 2016–2022 GNOME Softver doprinositelji" + +#: src/gs-application.c:263 src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" gogo https://launchpad.net/~trebelnik-stefina" + +#. TRANSLATORS: this is the title of the about window +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-application.c:277 src/gs-shell.c:2156 +msgid "About Software" +msgstr "O softveru" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:280 +msgid "A nice way to manage the software on your system." +msgstr "Jednostavniji način za upravljanje softverom na vašem sustavu." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:468 +msgid "Sorry! There are no details for that application." +msgstr "Nažalost, ne postoje pojedinosti za ovu aplikaciju." + +#. Translators: The disk usage of an application when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Veličina instalacije" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Uključuje %s podataka i %s predmemorije" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Uključuje %s podataka" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Uključuje %s predmemorije" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Predmemorija i upotreba podataka su nepoznati" + +#. Translators: The download size of an application. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Veličina preuzimanja" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Ne zahtijeva dodatno preuzimanje sustava" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Zahtijeva nepoznatu veličinu dodatnog preuzimanja sustava" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Potrebno je %s dodatnog preuzimanja sustava" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Nepoznata veličina" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:282 +msgid "No permissions" +msgstr "Bez dozvole" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "Has network access" +msgstr "Ima pristup mreži" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:300 +msgid "Uses system services" +msgstr "Koristi usluge sustava" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:307 +msgid "Uses session services" +msgstr "Koristi usluge sesije" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:314 +msgid "Can access hardware devices" +msgstr "Može pristupiti hardverskim uređajima" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:326 +msgid "Can read/write all your data" +msgstr "Može čitati/pisati sve vaše podatke" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:338 +msgid "Can read all your data" +msgstr "Može čitati sve vaše podatke" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:345 +msgid "Can read/write your downloads" +msgstr "Može čitati/pisati sva vaša preuzimanja" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can read your downloads" +msgstr "Može čitati sva vaša preuzimanja" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:359 +msgid "Can access arbitrary files" +msgstr "Može pristupiti proizvoljnim datotekama" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:366 src/gs-safety-context-dialog.c:227 +msgid "Can access and change user settings" +msgstr "Može pristupiti i promijeniti korisničke postavke" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:373 src/gs-safety-context-dialog.c:211 +msgid "Uses a legacy windowing system" +msgstr "Koristi zastarjeli sustav prikaza prozora" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:380 src/gs-safety-context-dialog.c:219 +msgid "Can acquire arbitrary permissions" +msgstr "Može dobiti proizvoljne dozvole" + +#. Translators: This indicates that an application has been packaged +#. * by the user’s distribution and is safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:406 src/gs-safety-context-dialog.c:146 +msgid "Reviewed by your distribution" +msgstr "Pakirano od strane vaše distribucije" + +#. Translators: This indicates that an application has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:413 src/gs-safety-context-dialog.c:143 +msgid "Provided by a third party" +msgstr "Omogućeno od treće strane" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 +msgid "Proprietary code" +msgstr "Vlasnički kôd" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:431 +msgid "Auditable code" +msgstr "Kôd za reviziju" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Razvijatelj softvera je provjeren" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:447 +msgid "Software no longer supported" +msgstr "Softver više nije podržan" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#: src/gs-app-context-bar.c:459 src/gs-app-context-bar.c:730 +msgid "; " +msgstr "; " + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:467 +msgid "Safe" +msgstr "Pouzdan" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:474 +msgid "Potentially Unsafe" +msgstr "Potencijalno nepouzdano" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:481 +msgid "Unsafe" +msgstr "Nepouzdano" + +#: src/gs-app-context-bar.c:560 src/gs-app-context-bar.c:592 +#: src/gs-hardware-support-context-dialog.c:603 +msgid "Mobile Only" +msgstr "Samo za mobitele" + +#: src/gs-app-context-bar.c:561 +msgid "Only works on a small screen" +msgstr "Radi samo na malim zaslonima" + +#: src/gs-app-context-bar.c:566 src/gs-app-context-bar.c:599 +#: src/gs-app-context-bar.c:606 src/gs-app-context-bar.c:656 +#: src/gs-app-context-bar.c:661 src/gs-hardware-support-context-dialog.c:583 +msgid "Desktop Only" +msgstr "Samo za stolna računala" + +#: src/gs-app-context-bar.c:567 +msgid "Only works on a large screen" +msgstr "Radi samo na velikim zaslonima" + +#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621 +msgid "Screen Size Mismatch" +msgstr "Veličina zaslona se ne podudara" + +#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622 +msgid "Doesn’t support your current screen size" +msgstr "Ne podržava vašu trenutnu veličinu zaslona" + +#: src/gs-app-context-bar.c:593 src/gs-hardware-support-context-dialog.c:674 +#: src/gs-hardware-support-context-dialog.c:680 +msgid "Requires a touchscreen" +msgstr "Zahtijeva zaslon na dodir" + +#: src/gs-app-context-bar.c:600 src/gs-hardware-support-context-dialog.c:634 +#: src/gs-hardware-support-context-dialog.c:640 +msgid "Requires a keyboard" +msgstr "Zahtijeva tipkovnicu" + +#: src/gs-app-context-bar.c:607 +msgid "Requires a mouse" +msgstr "Zahtijeva miš" + +#: src/gs-app-context-bar.c:618 +msgid "Gamepad Needed" +msgstr "Zahtijeva upravljača igre" + +#: src/gs-app-context-bar.c:619 +msgid "Requires a gamepad to play" +msgstr "Zahtijeva upravljača igre za igranje" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:643 +msgid "Adaptive" +msgstr "Prilagodljivo" + +#: src/gs-app-context-bar.c:644 +msgid "Works on phones, tablets and desktops" +msgstr "Radi na telefonima, tabletima i stolnim računalima" + +#: src/gs-app-context-bar.c:657 +msgid "Probably requires a keyboard or mouse" +msgstr "Najvjerojatnije zahtijeva tipkovnicu i miš" + +#: src/gs-app-context-bar.c:662 +msgid "Works on desktops and laptops" +msgstr "Radi na prijenosnim i stolnim računalima" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:705 +msgid "Contains no age-inappropriate content" +msgstr "Ne sadrži dobno neprikladan sadržaj" + +#: src/gs-app-context-bar.c:753 +msgid "No age rating information available" +msgstr "Nema dostupne informacije dobne ocjene" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:155 +msgid "Visit Website" +msgstr "Posjeti web stranicu" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:161 +msgid "Install…" +msgstr "Instaliraj…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:169 src/gs-updates-section.ui:62 +msgid "Cancel" +msgstr "Odustani" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:177 src/gs-common.c:286 src/gs-page.c:374 +msgid "Install" +msgstr "Instaliraj" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:185 +msgid "Update" +msgstr "Nadopuni" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: button text in the header when an application can be erased +#. TRANSLATORS: this is button text to remove the application +#: src/gs-app-row.c:191 src/gs-app-row.c:201 src/gs-details-page.ui:289 +#: src/gs-page.c:549 +msgid "Uninstall" +msgstr "Deinstaliraj" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#: src/gs-app-row.c:215 +msgid "Uninstalling" +msgstr "Deinstalacija" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:330 +msgid "Device cannot be used during update." +msgstr "Uređaj se ne može koristiti tijekom nadopune." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:340 src/gs-shell-search-provider.c:264 +#, c-format +msgid "Source: %s" +msgstr "Repozitorij: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:530 +#, c-format +msgid "Renamed from %s" +msgstr "Preimenovano iz %s" + +#. Translators: The placeholder is an application name +#: src/gs-app-translation-dialog.c:67 +#, c-format +msgid "Help Translate %s" +msgstr "Pomozite prevesti %s" + +#. Translators: The placeholder is an application name +#: src/gs-app-translation-dialog.c:70 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"volunteers.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s je dizajniran, razvijen i preveden od strane međunarodne zajednice " +"dobrovoljaca.\n" +"\n" +"To znači da ako još nije odstupan na vašam jeziku, možete se priključiti i " +"pomoći u prijevodu." + +#: src/gs-app-translation-dialog.ui:5 +msgid "Translations" +msgstr "Prijevodi" + +#: src/gs-app-translation-dialog.ui:92 +msgid "_Translation Website" +msgstr "_Web stranica prijevoda" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Prijava zahtijeva udaljeni %s (realm %s)" + +#: src/gs-basic-auth-dialog.ui:13 +msgid "Login Required" +msgstr "Zahtjev prijave" + +#: src/gs-basic-auth-dialog.ui:21 src/gs-common.c:612 +#: src/gs-details-page.ui:305 src/gs-removal-dialog.ui:28 +#: src/gs-review-dialog.ui:18 +msgid "_Cancel" +msgstr "_Odustani" + +#: src/gs-basic-auth-dialog.ui:35 +msgid "_Login" +msgstr "_Prijava" + +#: src/gs-basic-auth-dialog.ui:88 +msgid "_User" +msgstr "_Korisnik" + +#: src/gs-basic-auth-dialog.ui:107 +msgid "_Password" +msgstr "_Lozinka" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Ostalo" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Sve" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Popularno" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:41 src/gs-overview-page.ui:106 +msgid "Editor’s Choice" +msgstr "Odabir distribucije" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:129 +msgid "New & Updated" +msgstr "Novo i nadopunjeno" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:97 +msgid "Picks from the Web" +msgstr "Odabir s interneta" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:125 +msgid "Other Software" +msgstr "Ostali softver" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:194 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "Upišite broj od 1 do %u: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:266 +msgid "Choose an application:" +msgstr "Odaberi aplikaciju:" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Popularno" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D grafika" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografija" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skeniranje" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorska grafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Preglednici" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Zvučno stvaralaštvo i uređivanje" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Glazbeni reporoduktori" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Popularno" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendar" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Baza podataka" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Financije" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Obrada teksta" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Uređivači teksta" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Web preglednici" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Popularno" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Akcija" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Avantura" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkada" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokovi" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Društvene igre" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kartaške igre" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatori" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Djeca" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logika" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Igranje uloga" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategija" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Popularno" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Razgovor" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Popularno" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Umjetna inteligencija" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomija" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kemija" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Jezici" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Vijesti" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Umjetnost" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Životopis" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Stripovi" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fantastika" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Zdravlje" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Povijest" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Životni stil" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Popularno" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Otklanjanje grešaka" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Integrirana razvojna okruženja" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kôdeki" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Upravljački programi" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Slova" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Tipkovnički načini unosa" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Jezični paketi" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalizacija" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Stvaralaštvo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Rad" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Igre" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Druženje" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Obrazovanje" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Razvoj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kôdeki" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Upravljački programi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Slova" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Načini unosa" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Jezični paketi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalizacija" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:68 src/gs-common.c:91 +#, c-format +msgid "%s is now installed" +msgstr "%s je uspješno instaliran" + +#. TRANSLATORS: an application has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:72 src/gs-common.c:95 +msgid "A restart is required for the changes to take effect." +msgstr "" +"Potrebno je ponovno pokretanje računala kako bi se promjene primijenile." + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:76 +msgid "Application is ready to be used." +msgstr "Aplikacija je spremna za korištenje." + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "System updates are now installed" +msgstr "Nadopune sustava su sada instalirane" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:87 +msgid "Recently installed updates are available to review" +msgstr "Nedavno instalirane nadopune su sada dostupne za prikaz" + +#. TRANSLATORS: button text +#: src/gs-common.c:106 src/gs-common.c:775 +msgid "Restart" +msgstr "Ponovno pokreni" + +#: src/gs-common.c:112 +msgid "Launch" +msgstr "Pokreni" + +#. TRANSLATORS: window title +#: src/gs-common.c:218 +msgid "Install Third-Party Software?" +msgstr "Želite li instalirati softver treće strane?" + +#. TRANSLATORS: window title +#: src/gs-common.c:222 src/gs-repos-dialog.c:168 +msgid "Enable Third-Party Software Repository?" +msgstr "Želite li omogućiti repozitorij softvera treće strane?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:240 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s nije slobodan softver otvorenog kôda, i dostupan je putem " +"“%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:250 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s je dostupan putem “%s”." + +#: src/gs-common.c:259 +msgid "This software repository must be enabled to continue installation." +msgstr "Repozitorij softvera mora biti omogućen za nastavak instalacije." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:269 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Moguća je nezakonita instalacija ili korištenje %s u određenim zemljama." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:275 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Moguća je nezakonita instalacija ili korištenje ovog kôdeka u određenim " +"zemljama." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:282 +msgid "Don’t Warn Again" +msgstr "Ne upozoravaj ponovno" + +#. TRANSLATORS: button text +#: src/gs-common.c:291 +msgid "Enable and Install" +msgstr "Omogući i instaliraj" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:493 +msgid "Detailed errors from the package manager follow:" +msgstr "Opširne greške iz upravitelja paketa slijede:" + +#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72 +msgid "Details" +msgstr "Pojedinosti" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:600 +msgid "_Accept" +msgstr "_Prihvati" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:750 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Nadopuna je instalirana" +msgstr[1] "Nadopune su instalirane" +msgstr[2] "Nadopune su instalirane" + +#. TRANSLATORS: we've just removed some apps +#: src/gs-common.c:760 +msgid "An application has been removed" +msgid_plural "Applications have been removed" +msgstr[0] "Aplikacija je uklonjena" +msgstr[1] "Aplikacije su uklonjene" +msgstr[2] "Aplikacije su uklonjene" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:766 +msgid "A restart is required for it to take effect." +msgid_plural "A restart is required for them to take effect." +msgstr[0] "Potrebno je ponovno pokretanje računala kako bi se primijenila." +msgstr[1] "Potrebno je ponovno pokretanje računala kako bi se primijenile." +msgstr[2] "Potrebno je ponovno pokretanje računala kako bi se primijenile." + +#. TRANSLATORS: button text +#: src/gs-common.c:773 +msgid "Not Now" +msgstr "Ne sada" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:869 +msgid "Just now" +msgstr "Upravo sada" + +#: src/gs-common.c:871 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "prije %d minute" +msgstr[1] "prije %d minute" +msgstr[2] "prije %d minuta" + +#: src/gs-common.c:875 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "prije %d sata" +msgstr[1] "prije %d sata" +msgstr[2] "prije %d sati" + +#: src/gs-common.c:879 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "prije %d dana" +msgstr[1] "prije %d dana" +msgstr[2] "prije %d dana" + +#: src/gs-common.c:883 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Prije %d tjedna" +msgstr[1] "Prije %d tjedna" +msgstr[2] "Prije %d tjedana" + +#: src/gs-common.c:887 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "prije %d mjeseca" +msgstr[1] "prije %d mjeseca" +msgstr[2] "prije %d mjeseca" + +#: src/gs-common.c:891 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "prije %d godine" +msgstr[1] "prije %d godine" +msgstr[2] "prije %d godina" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1255 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An application" +msgstr "Aplikacija" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s zahtijeva dodatnu podršku datotečnog formata." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Dodatna MIME vrsta je potrebna" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s zahtijeva dodatna slova." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Doadatna slova su potrebna" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s zahtijeva dodatne multimedijske kôdeke." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Dodatni multimedijski kôdeki su potrebni" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s zahtijeva dodatne upravljačke programe pisača." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Dodatni upravljački programi pisača su potrebni" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s zahtijeva dodatne pakete." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Potrebni su dodatni programi" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Potraži u Softveru" + +#: src/gs-description-box.c:67 src/gs-description-box.c:269 +msgid "_Show More" +msgstr "_Prikaži više" + +#: src/gs-description-box.c:67 +msgid "_Show Less" +msgstr "_Prikaži manje" + +#: src/gs-details-page.c:357 +msgid "Removing…" +msgstr "Uklanjanje…" + +#: src/gs-details-page.c:367 +msgid "Requires restart to finish install" +msgstr "Zahtijeva ponovno pokretanje za završetak instalacije" + +#: src/gs-details-page.c:374 +msgid "Requires restart to finish remove" +msgstr "Zahtijeva ponovno pokretanje za završetak uklanjanja" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:391 +msgid "Pending installation…" +msgstr "Čekanje na instalaciju…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:398 +msgid "Pending update…" +msgstr "Čekanje na nadopunu…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:414 +msgid "Preparing…" +msgstr "Pripremanje…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:417 +msgid "Uninstalling…" +msgstr "Deinstalacija…" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#: src/gs-details-page.c:908 src/gs-details-page.c:934 +#: src/gs-details-page.ui:229 plugins/packagekit/gs-packagekit-task.c:150 +msgid "_Install" +msgstr "_Instaliraj" + +#: src/gs-details-page.c:924 +msgid "_Restart" +msgstr "_Ponovno pokreni" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:948 +msgid "_Install…" +msgstr "_Instaliraj…" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1237 +#, c-format +msgid "Other Apps by %s" +msgstr "Ostale aplikacije od %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1620 +msgid "You need internet access to write a review" +msgstr "Potreban vam je pristup internetu za pisanje recenzije" + +#: src/gs-details-page.c:1784 src/gs-details-page.c:1800 +#, c-format +msgid "Unable to find “%s”" +msgstr "Nemoguće je pronaći “%s”" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Stranica pojedinosti" + +#: src/gs-details-page.ui:39 +msgid "Loading application details…" +msgstr "Učitavanje pojedinosti aplikacije…" + +#: src/gs-details-page.ui:77 +msgid "" +"This software is not available in your language and will appear in US " +"English." +msgstr "" +"Ovaj softver nije dostupan na vašem jeziku i biti će prikazan na SAD " +"engleskom jeziku." + +#: src/gs-details-page.ui:83 +msgid "Help _Translate" +msgstr "Pomozite _prevesti" + +#. TRANSLATORS: A label for a button to execute the selected application. +#: src/gs-details-page.ui:246 +msgid "_Open" +msgstr "_Otvori" + +#: src/gs-details-page.ui:262 plugins/packagekit/gs-packagekit-task.c:160 +msgid "_Update" +msgstr "_Nadopuni" + +#: src/gs-details-page.ui:330 +msgid "Downloading" +msgstr "Preuzimanje" + +#: src/gs-details-page.ui:467 src/gs-installed-page.ui:135 +msgid "Add-ons" +msgstr "Dodaci" + +#: src/gs-details-page.ui:478 +msgid "Selected add-ons will be installed with the application." +msgstr "Odabrani dodaci će biti instalirani s aplikacijom." + +#: src/gs-details-page.ui:578 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" +"Ova aplikacija se može samo koristiti kada je dostupan pristup internetu." + +#: src/gs-details-page.ui:598 +msgid "Software Repository Included" +msgstr "Softverski repozitorij je uključen" + +#: src/gs-details-page.ui:599 +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "" +"Ova aplikacija uključuje softverski repozitorij koji pruža nadopune, kao i " +"pristup ostalom softveru." + +#: src/gs-details-page.ui:616 +msgid "No Software Repository Included" +msgstr "Nema uključenog softverskog repozitorija" + +#: src/gs-details-page.ui:617 +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "" +"Ova aplikacija ne uključuje softverski repozitorij, stoga neće pružati " +"nadopune na nove inačice." + +#: src/gs-details-page.ui:635 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Ovaj softver je već dostupan putem vaše distribucije i ne bi trebao biti " +"zamijenjen." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:652 +msgid "Software Repository Identified" +msgstr "Softverski repozitorij otkriven" + +#: src/gs-details-page.ui:653 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Dodavanje ovog softverskog repozitorija dati će vam pristup dodatnom " +"softveru i nadopunama." + +#: src/gs-details-page.ui:654 +msgid "Only use software repositories that you trust." +msgstr "Koristite samo repozitorije softvera kojima vjerujete." + +#: src/gs-details-page.ui:719 +msgid "No Metadata" +msgstr "Nema metapodataka" + +#: src/gs-details-page.ui:728 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Ovaj softver ne omogućuje poveznice do web stranice, repozitorija kôda ili " +"pratitelja grešaka." + +#: src/gs-details-page.ui:756 +msgid "Project _Website" +msgstr "Web stranica _projekta" + +#: src/gs-details-page.ui:773 +msgid "_Donate" +msgstr "_Donirajte" + +#: src/gs-details-page.ui:790 +msgid "Contribute _Translations" +msgstr "Doprinesite _prijevodu" + +#: src/gs-details-page.ui:807 +msgid "_Report an Issue" +msgstr "_Prijavite problem" + +#: src/gs-details-page.ui:824 +msgid "_Help" +msgstr "_Pomoć" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:918 +msgid "_Write Review" +msgstr "_Napiši recenziju" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:955 +msgid "All Reviews" +msgstr "Sve recenzije" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Preuzimanje dodatnih datoteke metapodataka…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " i " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Dostupna slova za %s skriptu" +msgstr[1] "Dostupna slova za %s skripte" +msgstr[2] "Dostupna slova za %s skripte" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Dostupan softver za %s" +msgstr[1] "Dostupan softver za %s" +msgstr[2] "Dostupan softver za %s" + +#: src/gs-extras-page.c:242 +msgid "Requested software not found" +msgstr "Zatraženi softver nije pronađen" + +#: src/gs-extras-page.c:244 +msgid "Failed to find requested software" +msgstr "Nemoguć pronalazak zatraženog softvera" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:343 +#, c-format +msgid "%s not found" +msgstr "%s nije pronađeno" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:347 +msgid "on the website" +msgstr "na web stranici" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:354 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "Nema dostupnih aplikacija koje pružaju datoteku %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:358 src/gs-extras-page.c:369 src/gs-extras-page.c:380 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" +"Informacije o %s, kao i upute kako nabaviti aplikacije koje nedostaju mogu " +"se pronaći na %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:365 src/gs-extras-page.c:387 +#, c-format +msgid "No applications are available for %s support." +msgstr "Nema dostupnih aplikacija za %s podršku." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:376 +#, c-format +msgid "%s is not available." +msgstr "%s nije dostupno." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:391 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" +"Informacije o %s, kao i upute kako nabaviti aplikaciju koja koja podržava " +"ovaj format mogu se pronaći na %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:398 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Nema dostupnih slova za %s podršku skripte." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:402 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informacije o %s, kao i upute kako nabaviti dodatna slova mogu se pronaći na " +"%s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:409 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Nema dostupnih dodatka kôdeka za %s format." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:413 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informacije o %s, kao i upute kako nabaviti kôdek koji može reproducirati " +"ovaj format mogu se pronaći na %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Nema dostupnih Plasma resursa za %s podršku." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informacije o %s, kao i upute kako nabaviti dodatne Plasma resurse mogu se " +"pronaći na %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Nema dostupnih upravljačkih programa pisača za %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:435 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informacije o %s, kao i upute kako nabaviti upravljački program za ovaj " +"pisač mogu se pronaći na %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:481 +msgid "the documentation" +msgstr "dokumentacija" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the application name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:487 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Nemoguć pronalazak %s zatraženog od strane %s. Pogledajte %s za više " +"informacija." +msgstr[1] "" +"Nemoguć pronalazak %s zatraženog od strane %s. Pogledajte %s za više " +"informacija." +msgstr[2] "" +"Nemoguć pronalazak %s zatraženog od strane %s. Pogledajte %s za više " +"informacija." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:496 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Nemoguć je pronaći %s koji ste zatražili. Pogledajte %s za više informacija." +msgstr[1] "" +"Nažalost, %s koje ste tražili ne mogu se pronaći. Pogledajte %s za više " +"informacija." +msgstr[2] "" +"Nažalost, %s koje ste tražili ne mogu se pronaći. Pogledajte %s za više " +"informacija." + +#: src/gs-extras-page.c:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Neuspjelo pretraživanje svih rezultata pretrage: %s" + +#: src/gs-extras-page.c:874 +#, c-format +msgid "%s file format" +msgstr "%s datotečni format" + +#: src/gs-extras-page.c:1254 +msgid "Unable to Find Requested Software" +msgstr "Nemoguć pronalazak zatraženog softvera" + +#: src/gs-extras-page.ui:6 +msgid "Codecs page" +msgstr "Stranica kôdeka" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Prijašnje" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Sljedeće" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Popis popularnih aplikacija" + +#: src/gs-hardware-support-context-dialog.c:577 +#: src/gs-hardware-support-context-dialog.c:586 +msgid "Desktop Support" +msgstr "Podrška za radnu površinu" + +#: src/gs-hardware-support-context-dialog.c:578 +#: src/gs-hardware-support-context-dialog.c:587 +msgid "Supports being used on a large screen" +msgstr "Podrška se koristi na velikom zaslonu" + +#: src/gs-hardware-support-context-dialog.c:580 +msgid "Desktop Support Unknown" +msgstr "Podrška radne površine nepoznata" + +#: src/gs-hardware-support-context-dialog.c:581 +msgid "Not enough information to know if large screens are supported" +msgstr "Nedovoljno informacija o podršci velikih zaslona" + +#: src/gs-hardware-support-context-dialog.c:584 +msgid "Requires a large screen" +msgstr "Zahtijeva veliki zaslon" + +#: src/gs-hardware-support-context-dialog.c:589 +msgid "Desktop Not Supported" +msgstr "Radna površina nije podržana" + +#: src/gs-hardware-support-context-dialog.c:590 +msgid "Cannot be used on a large screen" +msgstr "Ne može se koristi na velikom zaslonu" + +#: src/gs-hardware-support-context-dialog.c:597 +#: src/gs-hardware-support-context-dialog.c:606 +msgid "Mobile Support" +msgstr "Podrška za mobilne uređaje" + +#: src/gs-hardware-support-context-dialog.c:598 +#: src/gs-hardware-support-context-dialog.c:607 +msgid "Supports being used on a small screen" +msgstr "Podrška za korištenje na malim zaslonima" + +#: src/gs-hardware-support-context-dialog.c:600 +msgid "Mobile Support Unknown" +msgstr "Podrška mobilnih uređaja nepoznata" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Not enough information to know if small screens are supported" +msgstr "Nedovoljno informacija o podršci malih zaslona" + +#: src/gs-hardware-support-context-dialog.c:604 +msgid "Requires a small screen" +msgstr "Zahtijeva mali zaslon" + +#: src/gs-hardware-support-context-dialog.c:609 +msgid "Mobile Not Supported" +msgstr "Mobilni uređaji nisu podržani" + +#: src/gs-hardware-support-context-dialog.c:610 +msgid "Cannot be used on a small screen" +msgstr "Ne može se koristi na malom zaslonu" + +#: src/gs-hardware-support-context-dialog.c:633 +#: src/gs-hardware-support-context-dialog.c:642 +msgid "Keyboard Support" +msgstr "Podrška za tipkovnicu" + +#: src/gs-hardware-support-context-dialog.c:636 +msgid "Keyboard Support Unknown" +msgstr "Podrška tipkovnice nepoznata" + +#: src/gs-hardware-support-context-dialog.c:637 +msgid "Not enough information to know if keyboards are supported" +msgstr "Nedovoljno informacija o podršci tipkovnice" + +#: src/gs-hardware-support-context-dialog.c:639 +msgid "Keyboard Required" +msgstr "Potrebna je tipkovnica" + +#: src/gs-hardware-support-context-dialog.c:643 +msgid "Supports keyboards" +msgstr "Podržava tipkovnicu" + +#: src/gs-hardware-support-context-dialog.c:645 +msgid "Keyboard Not Supported" +msgstr "Tipkovnica nije podržana" + +#: src/gs-hardware-support-context-dialog.c:646 +msgid "Cannot be used with a keyboard" +msgstr "Ne može se koristiti s tipkovnicom" + +#: src/gs-hardware-support-context-dialog.c:653 +#: src/gs-hardware-support-context-dialog.c:662 +msgid "Mouse Support" +msgstr "Podrška za miš" + +#: src/gs-hardware-support-context-dialog.c:654 +#: src/gs-hardware-support-context-dialog.c:660 +msgid "Requires a mouse or pointing device" +msgstr "Zahtijeva miš ili pokazivački uređaj" + +#: src/gs-hardware-support-context-dialog.c:656 +msgid "Mouse Support Unknown" +msgstr "Podrška za miš nepoznata" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "Nedovoljno informacija o podršci miša ili pokazivačkog uređaja" + +#: src/gs-hardware-support-context-dialog.c:659 +msgid "Mouse Required" +msgstr "Potreban je miš" + +#: src/gs-hardware-support-context-dialog.c:663 +msgid "Supports mice and pointing devices" +msgstr "Podržava miš i pokazivačke uređaje" + +#: src/gs-hardware-support-context-dialog.c:665 +msgid "Mouse Not Supported" +msgstr "Miš nije podržan" + +#: src/gs-hardware-support-context-dialog.c:666 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Ne može se koristiti s mišem ili pokazivačkim uređajem" + +#: src/gs-hardware-support-context-dialog.c:673 +#: src/gs-hardware-support-context-dialog.c:682 +msgid "Touchscreen Support" +msgstr "Podrška za zaslone na dodir" + +#: src/gs-hardware-support-context-dialog.c:676 +msgid "Touchscreen Support Unknown" +msgstr "Podrška zaslona na dodir nepoznata" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Nedovoljno informacija o podršci zaslona na dodir" + +#: src/gs-hardware-support-context-dialog.c:679 +msgid "Touchscreen Required" +msgstr "Potreban je zaslon na dodir" + +#: src/gs-hardware-support-context-dialog.c:683 +msgid "Supports touchscreens" +msgstr "Podržava zaslone na dodir" + +#: src/gs-hardware-support-context-dialog.c:685 +msgid "Touchscreen Not Supported" +msgstr "Zaslon na dodir nije podržan" + +#: src/gs-hardware-support-context-dialog.c:686 +msgid "Cannot be used with a touchscreen" +msgstr "Ne može se koristiti sa zaslonom na dodir" + +#: src/gs-hardware-support-context-dialog.c:699 +msgid "Gamepad Required" +msgstr "Potreban je upravljač igre" + +#: src/gs-hardware-support-context-dialog.c:700 +msgid "Requires a gamepad" +msgstr "Zahtijeva upravljača igre" + +#: src/gs-hardware-support-context-dialog.c:702 +msgid "Gamepad Support" +msgstr "Podrška za upravljače igrama" + +#: src/gs-hardware-support-context-dialog.c:703 +msgid "Supports gamepads" +msgstr "Podržava upravljače igrama" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:712 +#, c-format +msgid "%s probably works on this device" +msgstr "%s vjerojatno radi na ovom uređaju" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:719 +#, c-format +msgid "%s works on this device" +msgstr "%s radi na ovom uređaju" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:726 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s neće raditi ispravno na ovom uređaju" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:733 +#, c-format +msgid "%s will not work on this device" +msgstr "%s neće raditi na ovom uređaju" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:5 +msgid "Hardware Support" +msgstr "Hardverska podrška" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-installed-page.c:812 src/gs-shell.ui:307 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalirano" + +#: src/gs-installed-page.ui:6 +msgid "Installed page" +msgstr "Instalirana strana" + +#: src/gs-installed-page.ui:55 +msgid "In Progress" +msgstr "U tijeku" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:75 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Applications" +msgstr "Aplikacije" + +#: src/gs-installed-page.ui:95 +msgid "Web Applications" +msgstr "Web aplikacije" + +#: src/gs-installed-page.ui:115 +msgid "System Applications" +msgstr "Aplikacije sustava" + +#: src/gs-license-tile.c:96 +msgid "Community Built" +msgstr "Izgradnja zajednice" + +#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98 +msgid "_Get Involved" +msgstr "_Pridružite se" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:114 +#, c-format +msgid "" +"This software is developed in the open by a community of volunteers, and " +"released under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" +"Ovaj softver je slobodnog kôda i razvijen je od strane zajednice " +"dobrovoljaca, objavljen je pod %s licencom.\n" +"\n" +"Možete doprinijeti i pomoći ga učiniti boljim." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This software is developed in the open by a community of volunteers, and " +"released under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" +"Ovaj softver je slobodnog kôda i razvijen je od strane zajednice " +"dobrovoljaca, objavljen je pod %s licencom.\n" +"\n" +"Možete doprinijeti i pomoći ga učiniti boljim." + +#: src/gs-license-tile.c:127 +msgid "Proprietary" +msgstr "Vlasnički softver" + +#: src/gs-license-tile.c:133 +msgid "_Learn More" +msgstr "_Saznajte više" + +#: src/gs-license-tile.c:135 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Ovaj softver je vlasnički, stoga samo njegovi razvijatelji znaju kako radi. " +"Može biti nesiguran na načine koje je teško otkriti i može se mijenjati bez " +"nadzora.\n" +"\n" +"Ne možete doprinijeti ovom softveru ili utjecati na njegov razvoj." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:56 +msgid "Downloading software catalog" +msgstr "Preuzimanje kataloga softvera" + +#: src/gs-loading-page.ui:6 +msgid "Loading page" +msgstr "Učitavanje stranice" + +#: src/gs-loading-page.ui:11 +msgid "Starting up…" +msgstr "Pokretanje…" + +#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256 +msgid "Automatic Updates Paused" +msgstr "Automatsko nadopunjivanje pauzirano" + +#: src/gs-metered-data-dialog.ui:9 +msgid "" +"The current network is metered. Metered connections have data limits or " +"charges associated with them. To save data, automatic updates have therefore " +"been paused.\n" +"\n" +"Automatic updates will be resumed when an un­metered network becomes " +"available. Until then, it is still possible to manually install updates.\n" +"\n" +"Alternatively, if the current network has been in­correctly identified as " +"being metered, this setting can be changed." +msgstr "" +"Trenutna mreža je ograničena podacima. Povezivanje ograničeno podacima ima " +"ograničenje preuzimanja podataka, dodatni preuzeti podaci iznad ograničenja " +"mogu se dodatno naplaćivati. Kako bi uštedjeli podatke, automatsko " +"nadopunjivanje je pauzirano .\n" +"\n" +"Automatsko nadopunjivanje će se nastaviti kada postane dostupna mreža s " +"neograničenim podacima. Do tada, još uvijek je moguće ručno instalirati " +"nadopune.\n" +"\n" +"Alternativno, ako je trenutna mreža pogrešno identificirana kao mreža s " +"ograničenim podacima, ova postavka se može promijeniti." + +#: src/gs-metered-data-dialog.ui:17 +msgid "Open Network _Settings" +msgstr "Otvori mrežne _postavke" + +#: src/gs-moderate-page.ui:6 +msgid "Moderate page" +msgstr "Stranica moderiranja" + +#: src/gs-moderate-page.ui:71 +msgid "There are no reviews to moderate" +msgstr "Nema recenzija za moderiranje" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Nepoznat izvor" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:108 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:138 +msgid "User" +msgstr "Korisnik" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:250 +msgid "Additions" +msgstr "Dodaci" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:254 +msgid "Removals" +msgstr "Uklanjanje" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:258 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Nadopune" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:262 +msgid "Downgrades" +msgstr "Vraćanje starije inačice" + +#. Translators: This is a clickable link on the third party repositories info bar. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:876 +msgid "selected external sources" +msgstr "odabranog vanjskog izvora" + +#. Translators: This is the third party repositories info bar. The %s is replaced with "selected external sources" link. +#: src/gs-overview-page.c:878 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included." +msgstr "" +"Omogućuje pristup dodatnom softveru iz %s. Određeni vlasnički softver je " +"uključen." + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:887 src/gs-repos-dialog.c:173 +msgid "Enable" +msgstr "Omogući" + +#. Translators: This is the title of the main page of the UI. +#. Translators: A label for a button to show all available software. +#: src/gs-overview-page.c:946 src/gs-shell.ui:294 +msgid "Explore" +msgstr "Istraži" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Stranica pojedinosti" + +#: src/gs-overview-page.ui:35 +msgid "Enable Third Party Software Repositories?" +msgstr "Želite li omogućiti repozitorij softvera treće strane?" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:180 +msgid "Other Categories" +msgstr "Ostale kategorije" + +#: src/gs-overview-page.ui:221 +msgid "No Application Data Found" +msgstr "Nema pronađenih podataka o aplikaciji" + +#: lib/gs-plugin-loader.c:2829 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Nepoznat" + +#: src/gs-page.c:274 +msgid "User declined installation" +msgstr "Korisnik je odbio instalaciju" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:365 +#, c-format +msgid "Prepare %s" +msgstr "Pripremam %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:518 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Sigurno želite ukloniti %s repozitorij?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:522 +#, c-format +msgid "" +"All applications from %s will be uninstalled, and you will have to re-" +"install the repository to use them again." +msgstr "" +"Sve aplikacije iz %s će biti deinstalirane i morati ćete ponovno instalirati " +"repozitorij kako bi ga ponovno koristili." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:530 +#, c-format +msgid "Are you sure you want to uninstall %s?" +msgstr "Sigurno želite deinstalirati %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:533 +#, c-format +msgid "" +"%s will be uninstalled, and you will have to install it to use it again." +msgstr "" +"%s će biti deinstaliran i trebat ćete ga ponovno instalirati kako bi ga " +"mogli koristiti." + +#: src/gs-prefs-dialog.ui:5 +msgid "Update Preferences" +msgstr "Osobitosti nadopune" + +#: src/gs-prefs-dialog.ui:16 +msgid "" +"To avoid charges and network caps, software updates are not automatically " +"downloaded on mobile or metered connections." +msgstr "" +"Kako bi se izbjegli troškovi i ograničenja mreže, nadopune softvera ne " +"preuzimaju se automatski na mobilnom povezivanju ili povezivanju ograničenom " +"podacima." + +#: src/gs-prefs-dialog.ui:19 +msgid "Automatic Updates" +msgstr "Automatsko nadopunjivanje" + +#: src/gs-prefs-dialog.ui:20 +msgid "" +"Downloads and installs software updates in the background, when possible." +msgstr "Preuzmi i instaliraj nadopune softvera u pozadini, kada je moguće." + +#: src/gs-prefs-dialog.ui:32 +msgid "Automatic Update Notifications" +msgstr "Obavijesti automatske nadopune" + +#: src/gs-prefs-dialog.ui:33 +msgid "Show notifications when updates have been automatically installed." +msgstr "Prikazuje obavijesti kada se nadopune instaliraju automatski." + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Instalirani softver nije kompatibilan sa %s i biti će automatski uklonjen " +"tijekom nadogradnje." + +#: src/gs-removal-dialog.ui:7 +msgid "Incompatible Software" +msgstr "Nekompatibilan softver" + +#: src/gs-removal-dialog.ui:37 +msgid "_Upgrade" +msgstr "_Nadogradi" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:239 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "Softver koji je instaliran iz “%s” prestat će primati nadopune." + +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Onemogući repozitorij?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Ukloni repozitorij?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Onemogući" + +#. TRANSLATORS: this is button text to remove a repo +#: src/gs-repos-dialog.c:257 +msgid "_Remove" +msgstr "_Ukloni" + +#: src/gs-repos-dialog.c:508 +msgid "Enable New Repositories" +msgstr "Omogući nove repozitorije" + +#: src/gs-repos-dialog.c:509 +msgid "Turn on new repositories when they are added." +msgstr "Uključi nove repozitorije kada su dodani." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:518 +msgid "more information" +msgstr "više informacija" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:523 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Dodatni repozitoriji iz odabranih trećih strana — %s." + +#: src/gs-repos-dialog.c:528 +msgid "Fedora Third Party Repositories" +msgstr "Fedora repozitoriji treće strane" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:670 +msgid "the operating system" +msgstr "operativan sustav" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:728 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Ovi repozitoriji nadopunjuju zadani softver koji pruža %s." + +#. button in the info bar +#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88 +msgid "Software Repositories" +msgstr "Repozitoriji softvera" + +#: src/gs-repos-dialog.ui:53 +msgid "No Repositories" +msgstr "Nema repozitorija" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repo-row.c:160 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "%u aplikacija instalirana" +msgstr[1] "%u aplikacije instalirane" +msgstr[2] "%u aplikacija instalirano" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repo-row.c:167 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u dodatak instaliran" +msgstr[1] "%u dodatka instalirana" +msgstr[2] "%u dodataka instalirana" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repo-row.c:175 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u aplikacija" +msgstr[1] "%u aplikacije" +msgstr[2] "%u aplikacija" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repo-row.c:181 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u dodatak" +msgstr[1] "%u dodatka" +msgstr[2] "%u dodataka" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repo-row.c:188 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s i %s instalirano" +msgstr[1] "%s i %s instalirano" +msgstr[2] "%s i %s instalirano" + +#. Translators: The first '%s' is replaced with a text like '10 applications installed', +#. the second '%s' is replaced with installation kind, like in case of Flatpak 'User Installation'. +#: src/gs-repo-row.c:243 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:78 +msgid "Hate it" +msgstr "Mrzim ga" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:82 +msgid "Don’t like it" +msgstr "Ne sviđa mi se" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:86 +msgid "It’s OK" +msgstr "U redu je" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:90 +msgid "Like it" +msgstr "Sviđa mi se" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:94 +msgid "Love it" +msgstr "Obožavam ga" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:118 +msgid "Please take more time writing the review" +msgstr "Odvojite više vremena kako bi napisali recenziju" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:122 +msgid "Please choose a star rating" +msgstr "Odaberite zvjezdicu ocjene" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:126 +msgid "The summary is too short" +msgstr "Sadržaj je prekratak" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:130 +msgid "The summary is too long" +msgstr "Sadržaj je predugačak" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:134 +msgid "The description is too short" +msgstr "Opis je prekratak" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too long" +msgstr "Opis je predugačak" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:10 +msgid "Post Review" +msgstr "Objavi recenziju" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:26 +msgid "_Post" +msgstr "_Objavi" + +#: src/gs-review-dialog.ui:56 +msgid "Rating" +msgstr "Ocjena" + +#: src/gs-review-dialog.ui:88 +msgid "Summary" +msgstr "Sažetak" + +#: src/gs-review-dialog.ui:97 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" +"Dajte nam kratak opis vaše recenzije, na primjer \"Izvrsna aplikacija, " +"preporučujem je svakome\"." + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:119 +msgctxt "app review" +msgid "Review" +msgstr "Recenzija" + +#: src/gs-review-dialog.ui:128 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "Što mislite o aplikaciji? Dajte nam svoje mišljenje o aplikaciji." + +#: src/gs-review-dialog.ui:156 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Saznajte koji se podaci šalju u pravilima privatnosti. Puno ime povezano s vašim računom bit " +"će javno prikazano." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u recenzija ukupno" +msgstr[1] "%u recenzije ukupno" +msgstr[2] "%u recenzija ukupno" + +#: src/gs-review-histogram.ui:93 +msgid "out of 5 stars" +msgstr "od 5 zvjezdica" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Nepoznato" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:220 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Možete prijaviti uvredljive, nepristojne ili diskriminirajuće recenzije." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:225 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Jednom kada je objavljena, recenzija neće biti dostupna dok je ne provjeri i " +"odobri administrator." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:239 +msgid "Report Review?" +msgstr "Prijavi recenziju?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:243 +msgid "Report" +msgstr "Prijavi" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:84 +msgid "Was this review useful to you?" +msgstr "Je li vam ova recenzija bila korisna?" + +#: src/gs-review-row.ui:100 +msgid "Yes" +msgstr "Da" + +#: src/gs-review-row.ui:108 +msgid "No" +msgstr "Ne" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:116 +msgid "Meh" +msgstr "Ah" + +#: src/gs-review-row.ui:128 +msgid "Report…" +msgstr "Prijavi…" + +#: src/gs-review-row.ui:137 +msgid "Remove…" +msgstr "Ukloni…" + +#: src/gs-safety-context-dialog.c:144 +msgid "Check that you trust the vendor, as the application isn’t sandboxed" +msgstr "" +"Provjerite vjerujete li dobavljaču softvera, pošto aplikacija nije u " +"sigurnom okruženju" + +#: src/gs-safety-context-dialog.c:147 +msgid "" +"Application isn’t sandboxed but the distribution has checked that it is not " +"malicious" +msgstr "" +"Aplikacija nije u sigurnom okruženju ali nije zlonamjerna jer je provjerena " +"od strane distribucije" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:160 +msgid "No Permissions" +msgstr "Bez dozvola" + +#: src/gs-safety-context-dialog.c:161 +msgid "App is fully sandboxed" +msgstr "Aplikacija je potpuno u osiguranome okruženju" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:172 +msgid "Network Access" +msgstr "Mrežni pristup" + +#: src/gs-safety-context-dialog.c:173 +msgid "Can access the internet" +msgstr "Može pristupiti internetu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Network Access" +msgstr "Nema mrežnog pristupa" + +#: src/gs-safety-context-dialog.c:177 +msgid "Cannot access the internet" +msgstr "Ne može pristupiti internetu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:183 +msgid "Uses System Services" +msgstr "Koristi usluge sustava" + +#: src/gs-safety-context-dialog.c:184 +msgid "Can request data from system services" +msgstr "Može zahtijevati podatke iz usluga sustava" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:191 +msgid "Uses Session Services" +msgstr "Koristi usluge sesije" + +#: src/gs-safety-context-dialog.c:192 +msgid "Can request data from session services" +msgstr "Može zahtijevati podatke iz usluga sesije" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Device Access" +msgstr "Pristup uređaju" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Može pristupiti uređajima poput web kamera ili upravljača igrama" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:203 +msgid "No Device Access" +msgstr "Nema pristupa uređaju" + +#: src/gs-safety-context-dialog.c:204 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Ne može pristupiti uređajima poput web kamera ili upravljača igrama" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:210 +msgid "Legacy Windowing System" +msgstr "Zastarjeli sustav prikaza prozora" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:218 +msgid "Arbitrary Permissions" +msgstr "Proizvoljne dozvole" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "User Settings" +msgstr "Korisničke postavke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:238 +msgid "Full File System Read/Write Access" +msgstr "Potpuni pristup čitanja/zapisivanja u datotečnom sustavu" + +#: src/gs-safety-context-dialog.c:239 +msgid "Can read and write all data on the file system" +msgstr "Može čitati i pisati sve podatke na datotečnom sustavu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:247 +msgid "Home Folder Read/Write Access" +msgstr "Potpuni pristup čitanja/zapisivanja u osobnoj mapi" + +#: src/gs-safety-context-dialog.c:248 +msgid "Can read and write all data in your home directory" +msgstr "Može čitati i pisati sve podatke u vašoj osobnoj mapi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:256 +msgid "Full File System Read Access" +msgstr "Potpuni pristup čitanja u datotečnom sustavu" + +#: src/gs-safety-context-dialog.c:257 +msgid "Can read all data on the file system" +msgstr "Može čitati sve podatke na datotečnom sustavu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Home Folder Read Access" +msgstr "Pristup čitanja u osobnoj mapi" + +#: src/gs-safety-context-dialog.c:267 +msgid "Can read all data in your home directory" +msgstr "Može čitati sve podatke u vašoj osobnoj mapi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:276 +msgid "Download Folder Read/Write Access" +msgstr "Pristup čitanja/zapisivanja u mapi preuzimanja" + +#: src/gs-safety-context-dialog.c:277 +msgid "Can read and write all data in your downloads directory" +msgstr "Može čitati i zapisivati sve podatke u vašem direktoriju preuzimanja" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:288 +msgid "Download Folder Read Access" +msgstr "Pristup čitanja u mapi preuzimanja" + +#: src/gs-safety-context-dialog.c:289 +msgid "Can read all data in your downloads directory" +msgstr "Može čitati sve podatke u vašem direktoriju preuzimanja" + +#: src/gs-safety-context-dialog.c:299 +msgid "Can read and write all data in the directory" +msgstr "Može čitati i pisati sve podatke u direktoriju" + +#: src/gs-safety-context-dialog.c:310 +msgid "Can read all data in the directory" +msgstr "Može čitati sve podatke u direktoriju" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:326 +msgid "No File System Access" +msgstr "Nema pristupa datotečnom sustavu" + +#: src/gs-safety-context-dialog.c:327 +msgid "Cannot access the file system at all" +msgstr "Ne možete pristupiti datotečnom sustavu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:341 +msgid "Proprietary Code" +msgstr "Vlasnički kôd" + +#: src/gs-safety-context-dialog.c:342 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Izvorni kôd nije javan, stoga se ne može revidirati i može biti nesiguran" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:345 +msgid "Auditable Code" +msgstr "Kôd za reviziju" + +#: src/gs-safety-context-dialog.c:346 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Izvorni kôd je javan i može se revidirati, što čini aplikaciju sigurnijom" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:354 +msgid "App developer is verified" +msgstr "Razvijatelj aplikacije je provjeren" + +#: src/gs-safety-context-dialog.c:355 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Razvijatelj ove aplikacije je provjeren da je onaj kime se predstavlja" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:366 +msgid "Insecure Dependencies" +msgstr "Nesigurne zavisnosti" + +#: src/gs-safety-context-dialog.c:367 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Softver ili njegove zavisnosti nisu više podržani i mogu biti nesigurni" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:376 +#, c-format +msgid "%s is safe" +msgstr "%s je pouzdan" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:383 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s je potencijalno nepouzdan" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:390 +#, c-format +msgid "%s is unsafe" +msgstr "%s je nepouzdan" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:5 +msgid "Safety" +msgstr "Pouzdanost" + +#: src/gs-safety-context-dialog.ui:101 +msgid "License" +msgstr "Licenca" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:141 +msgid "Source" +msgstr "Repozitorij" + +#: src/gs-safety-context-dialog.ui:181 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:205 +msgid "Outdated SDK version" +msgstr "Zastarjela SDK inačica" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Prijašnja slika zaslona" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Sljedeća slika zaslona" + +#: src/gs-screenshot-carousel.ui:127 +msgid "No screenshot provided" +msgstr "Nema slike zaslona" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:362 src/gs-screenshot-image.c:419 +#: src/gs-screenshot-image.c:623 +msgid "Screenshot not found" +msgstr "Snimak zaslona nije dostupan" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:438 +msgid "Failed to load image" +msgstr "Neuspjelo učitavanje slike" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:651 +msgid "Screenshot size not found" +msgstr "Veličina snimka zaslona nije pronađena" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:733 +msgid "Could not create cache" +msgstr "Nemoguće stvaranje predmemorije" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:747 +msgid "Screenshot not valid" +msgstr "Snimak zaslona nije valjan" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:797 +msgid "Screenshot not available" +msgstr "Snimak zaslona nije dostupan" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Slika zaslona" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:180 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "Još %u podudaranje" +msgstr[1] "Još %u podudaranja" +msgstr[2] "Još %u podudaranja" + +#: src/gs-search-page.ui:6 +msgid "Search page" +msgstr "Stranica pretrage" + +#: src/gs-search-page.ui:17 +msgid "Search for Apps" +msgstr "Pretraži aplikacije" + +#: src/gs-search-page.ui:46 +msgid "No Application Found" +msgstr "Nema pronađene aplikacije" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1199 src/gs-shell.c:1204 src/gs-shell.c:1219 +#: src/gs-shell.c:1223 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. Translators: The '%s' is replaced with an error message, which had been shortened. +#. The dots at the end are there to highlight that to the user. +#: src/gs-shell.c:1240 +#, c-format +msgid "%s…" +msgstr "%s…" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1275 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nemoguće preuzimanje nadopuna frimvera s %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1281 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nemoguće preuzimanje nadopuna s %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1288 src/gs-shell.c:1328 +msgid "Unable to download updates" +msgstr "Nemoguće preuzimanje nadopuna" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1293 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" +"Nemoguće preuzimanje nadopuna: pristup internetu je potreban, ali nije " +"dostupan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1301 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Nemoguće preuzimanje nadopuna s %s: nema dovoljno slobodnog diskovnog " +"prostora" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1306 +msgid "Unable to download updates: not enough disk space" +msgstr "" +"Nemoguće preuzimanje nadopuna: nema dovoljno slobodnog diskovnog prostora" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1312 +msgid "Unable to download updates: authentication was required" +msgstr "Nemoguće preuzimanje nadopuna: potrebna je ovjera" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to download updates: authentication was invalid" +msgstr "Nemoguće preuzimanje nadopuna: pogrešna ovjera" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1320 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Nemoguće preuzimanje nadopuna: nemate dozvolu za instalaciju softvera" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to get list of updates" +msgstr "Nemoguće je preuzeti popis nadopuna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "Nemoguća je instalirati %s uslijed neuspješnog preuzimanja s %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1379 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "Nemoguća je instalirati %s uslijed neuspješnog preuzimanja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1391 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "Nemoguća je instalirati %s jer radni proces %s nije dostupan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1397 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "Nemoguće je instalirati %s jer nije podržano" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1403 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "Nemoguća instalacija: pristup internetu je potreban, ali nije dostupan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1408 +msgid "Unable to install: the application has an invalid format" +msgstr "Nemoguća instalacija: aplikacija ima neispravni format" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Nemoguće je instalirati %s: nema dovoljno slobodnog diskovnog prostora" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1418 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "Nemoguće je instalirati %s: potrebna je ovjera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1424 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "Nemoguće je instalirati %s: pogrešna ovjera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "Nemoguće je instalirati %s: nemate dozvolu za instalaciju softvera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1437 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "Nemoguće je instalirati %s: potrebno je priključiti napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install %s: The battery level is too low" +msgstr "Nemoguće je instalirati %s: energija baterije je preslaba" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1452 +#, c-format +msgid "Unable to install %s" +msgstr "Nemoguće je instalirati %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1497 +#, c-format +msgid "Unable to update %s from %s as download failed" +msgstr "Nemoguće je nadopuniti %s iz %s uslijed neuspješnog preuzimanja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1504 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "Nemoguća je nadopuniti %s uslijed neuspješnog preuzimanja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1511 +#, c-format +msgid "Unable to install updates from %s as download failed" +msgstr "Nemoguće je instalirati nadopune iz %s uslijed neuspješnog preuzimanja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1515 +#, c-format +msgid "Unable to install updates as download failed" +msgstr "Nemoguće je instalirati nadopune uslijed neuspješnog preuzimanja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1520 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "Nemoguća nadopuna: pristup internetu je potreban, ali nije dostupan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Nemoguće je nadopuniti %s: nema dovoljno slobodnog diskovnog prostora" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1534 +#, c-format +msgid "Unable to install updates: not enough disk space" +msgstr "" +"Nemoguće je instalirati nadopune: nema dovoljno slobodnog diskovnog prostora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1543 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "Nemoguće je nadopuniti %s: potrebna je ovjera" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1548 +#, c-format +msgid "Unable to install updates: authentication was required" +msgstr "Nemoguće je instalirati nadopune: potrebna je ovjera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1556 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "Nemoguće je nadopuniti %s: pogrešna ovjera" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to install updates: authentication was invalid" +msgstr "Nemoguće je instalirati nadopune: pogrešna ovjera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "Nemoguće je nadopuniti %s: nemate dozvolu za nadopunu softvera" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1575 +#, c-format +msgid "" +"Unable to install updates: you do not have permission to update software" +msgstr "Nemoguće je instalirati nadopune: nemate dozvolu za nadopunu softvera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1584 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "Nemoguće je nadopuniti %s: potrebno je priključiti napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1590 +#, c-format +msgid "Unable to install updates: AC power is required" +msgstr "Nemoguće je instalirati nadopune: potrebno je priključiti napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1598 +#, c-format +msgid "Unable to update %s: The battery level is too low" +msgstr "Nemoguće je nadopuniti %s: energija baterije je preslaba" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to install updates: The battery level is too low" +msgstr "Nemoguće je instalirati nadopune: energija baterije je preslaba" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1615 +#, c-format +msgid "Unable to update %s" +msgstr "Nemoguća je nadopuniti %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1618 +#, c-format +msgid "Unable to install updates" +msgstr "Nemoguće je instalirati nadopune" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1660 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Nemoguća nadogradnja na %s s %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1665 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "Nemoguća je nadograditi %s uslijed neuspješnog preuzimanja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1673 +#, c-format +msgid "" +"Unable to upgrade to %s: internet access was required but wasn’t available" +msgstr "" +"Nemoguća nadogradnja na %s: pristup internetu je potreban, ali nije dostupan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1681 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Nemoguća nadogradnja na %s: nema dovoljno slobodnog diskovnog prostora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1688 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "Nemoguća nadogradnja na %s: potrebna je ovjera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "Nemoguća nadogradnja na %s: pogrešna ovjera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1700 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "Nemoguća nadogradnja na %s: nemate dozvolu za nadogradnju" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1706 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "Nemoguća nadogradnja na %s: potrebno je priključiti napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1712 +#, c-format +msgid "Unable to upgrade to %s: The battery level is too low" +msgstr "Nemoguća nadogradnja na %s: energija baterije je preslaba" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1721 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nemoguća nadogradnja na %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1758 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "Nemoguće je ukloniti %s: potrebna je ovjera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1763 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "Nemoguće je ukloniti %s: pogrešna ovjera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "Nemoguće je ukloniti %s: nemate dozvolu za uklanjanje softvera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1774 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "Nemoguće je ukloniti %s: potrebno je priključiti napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1780 +#, c-format +msgid "Unable to remove %s: The battery level is too low" +msgstr "Nemoguće je ukloniti %s: energija baterije je preslaba" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1792 +#, c-format +msgid "Unable to remove %s" +msgstr "Nemoguće je ukloniti %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1833 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Nemoguće je pokrenuti %s: %s nije instaliran" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1841 src/gs-shell.c:1857 src/gs-shell.c:1905 +#: src/gs-shell.c:1943 src/gs-shell.c:1996 +msgid "Sorry, something went wrong" +msgstr "Nažalost, nešto je pošlo po krivu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1846 src/gs-shell.c:1894 src/gs-shell.c:1932 +#: src/gs-shell.c:1975 +msgid "Not enough disk space — free up some space and try again" +msgstr "" +"Nema dovoljno slobodnog diskovnog prostora — oslobodite nešto prostora i " +"pokušajte ponovno" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1888 +msgid "Failed to install file: not supported" +msgstr "Neuspješna instalacija datoteke: nije podržana" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1891 +msgid "Failed to install file: authentication failed" +msgstr "Neuspješna instalacija datoteke: ovjera neuspjela" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1926 +msgid "Failed to install: not supported" +msgstr "Neuspješna instalacija: nije podržano" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1929 +msgid "Failed to install: authentication failed" +msgstr "Neuspješna instalacija: ovjera neuspjela" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1970 +#, c-format +msgid "Unable to contact %s" +msgstr "Nemoguće je kontaktirati %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'. +#: src/gs-shell.c:1980 +msgid "Software needs to be restarted to use new plugins." +msgstr "" +"Softver se mora ponovno pokrenuti kako bi se mogao koristiti novi priključak." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1984 +msgid "AC power is required" +msgstr "Potrebno je priključiti napajanje" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1987 +msgid "The battery level is too low" +msgstr "Energija baterije je preslaba" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "_Repozitoriji softvera" + +#: src/gs-shell.ui:12 +msgid "_Update Preferences" +msgstr "_Osobitosti nadopunjivanja" + +#. button in the info bar +#: src/gs-shell.ui:98 +msgid "Examine Disk" +msgstr "Istraži disk" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-shell.ui:108 src/gs-updates-page.c:881 +msgid "Network Settings" +msgstr "Mrežne postavke" + +#. button in the info bar +#: src/gs-shell.ui:118 +msgid "Restart Now" +msgstr "Ponovno pokreni odmah" + +#. button in the info bar +#: src/gs-shell.ui:128 +msgid "More Information" +msgstr "Više informacija" + +#: src/gs-shell.ui:189 +msgid "Search" +msgstr "Pretraga" + +#: src/gs-shell.ui:204 +msgid "Primary Menu" +msgstr "Glavni izbornik" + +#: src/gs-shell.ui:274 +msgid "Find Out _More" +msgstr "Potražite _više" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:328 +msgctxt "Header bar button for list of apps to be updated" +msgid "Updates" +msgstr "Nadopune" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nepoznata" + +#: src/gs-storage-context-dialog.c:139 +msgid "Application Data" +msgstr "Podaci aplikacije" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the application to run" +msgstr "Podaci potrebni kako bi se aplikacija pokrenula" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Korisnički podaci" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the application" +msgstr "Podaci stvoreni od vaše strane u aplikaciji" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Podaci predmemorije" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Privremena predmemorija podataka" + +#: src/gs-storage-context-dialog.c:172 +msgid "The application itself" +msgstr "Sama aplikacija" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Potrebne zavisnosti" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this application" +msgstr "Komponente dijeljene sustavom koje su potrebne ovoj aplikaciji" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Nepoznata" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:5 +msgid "Storage" +msgstr "Pohrana" + +#. Translators: Please do not translate the markup or link href +#: src/gs-storage-context-dialog.ui:69 +msgid "" +"Cached data can be cleared from the _application settings." +msgstr "" +"Predmemorija podataka može se ukloniti iz _postavke " +"aplikacije." + +#: src/gs-summary-tile.c:118 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instalirano)" + +#: src/gs-summary-tile.c:123 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Instaliranje)" + +#: src/gs-summary-tile.c:128 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Uklanjanje)" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:65 src/gs-update-dialog.c:152 +msgid "Installed Updates" +msgstr "Instalirane nadopune" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:131 +#, c-format +msgid "Installed on %s" +msgstr "Instalirano %s" + +#: src/gs-update-dialog.ui:77 +msgid "No Updates Installed" +msgstr "Nema instaliranih nadopuna" + +#: src/gs-update-monitor.c:213 +msgid "Software Updates Are Out of Date" +msgstr "Nadopune softvera su zastarjele" + +#: src/gs-update-monitor.c:214 +msgid "Please check for software updates." +msgstr "Provjerite nadopune softvera." + +#: src/gs-update-monitor.c:220 +msgid "Critical Software Update Ready to Install" +msgstr "Kritična softverska nadopuna je spremna za instalaciju" + +#: src/gs-update-monitor.c:221 +msgid "An important software update is ready to be installed." +msgstr "Bitna nadopuna softvera je spremna za instalaciju." + +#: src/gs-update-monitor.c:224 +msgid "Critical Software Updates Available to Download" +msgstr "Kritične nadopune softvera su dostupne za preuzimanje" + +#: src/gs-update-monitor.c:225 +msgid "Important: critical software updates are waiting." +msgstr "Bitno: kritične nadopune softvera su na čekanju." + +#: src/gs-update-monitor.c:231 +msgid "Software Updates Ready to Install" +msgstr "Softverske nadopune su spremne za instalaciju" + +#: src/gs-update-monitor.c:232 +msgid "Software updates are waiting and ready to be installed." +msgstr "Softverske nadopune su na čekanju i spremne su za instalaciju." + +#: src/gs-update-monitor.c:238 +msgid "Software Updates Available to Download" +msgstr "Softverske nadopune dostupne za preuzimanje" + +#: src/gs-update-monitor.c:239 +msgid "Please download waiting software updates." +msgstr "Čekanje preuzimanja softverskih nadopuna." + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:355 +#, c-format +msgid "%u Application Updated — Restart Required" +msgid_plural "%u Applications Updated — Restart Required" +msgstr[0] "%u aplikacija je nadopunjena — potrebno je ponovno pokretanje" +msgstr[1] "%u aplikacije su nadopunjene — potrebno je ponovno pokretanje" +msgstr[2] "%u aplikacija je nadopunjeno — potrebno je ponovno pokretanje" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:361 +#, c-format +msgid "%u Application Updated" +msgid_plural "%u Applications Updated" +msgstr[0] "%u aplikacija je nadopunjena" +msgstr[1] "%u aplikacije su nadopunjene" +msgstr[2] "%u aplikacija je nadopunjeno" + +#. TRANSLATORS: %1 is an application name, e.g. Firefox +#: src/gs-update-monitor.c:372 +#, c-format +msgid "%s has been updated." +msgstr "%s je nadopunjen." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:375 +msgid "Please restart the application." +msgstr "Ponovno pokrenite aplikaciju." + +#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox +#: src/gs-update-monitor.c:383 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s i %s su nadopunjeni." + +#. TRANSLATORS: at least one application needs restarting +#: src/gs-update-monitor.c:389 src/gs-update-monitor.c:408 +#, c-format +msgid "%u application requires a restart." +msgid_plural "%u applications require a restart." +msgstr[0] "%u aplikacija zahtijeva ponovno pokretanje." +msgstr[1] "%u aplikacije zahtijevaju ponovno pokretanje." +msgstr[2] "%u aplikacija zahtijeva ponovno pokretanje." + +#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox +#: src/gs-update-monitor.c:401 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Uključuje %s, %s i %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:671 src/gs-updates-page.ui:20 +msgid "Operating System Updates Unavailable" +msgstr "Nadopune operativnog sustava nisu dostupne" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:673 +msgid "Upgrade to continue receiving security updates." +msgstr "Nadogradi za nastavak preuzimanja sigurnosnih nadopuna." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:728 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Nova %s inačica je dostupna za instalaciju" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:732 +msgid "Software Upgrade Available" +msgstr "Dostupna je nadogradnja softvera" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1137 +msgid "Software Updates Failed" +msgstr "Neuspjelo nadopunjavanje softvera" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1139 +msgid "An important operating system update failed to be installed." +msgstr "Bitna nadopuna operativnog sustava je neuspješno instalirana." + +#: src/gs-update-monitor.c:1140 +msgid "Show Details" +msgstr "Prikaži pojedinosti" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1162 +msgid "System Upgrade Complete" +msgstr "Nadogradnja sustava završena" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1167 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Dobrodošli u %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1173 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Softverska nadopuna je instalirana" +msgstr[1] "Softverske nadopune su instalirane" +msgstr[2] "Softverske nadopune su instalirane" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1177 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Bitna nadopuna operativnog sustava je instalirana." +msgstr[1] "Bitne nadopune operativnog sustava su instalirane." +msgstr[2] "Bitne nadopune operativnog sustava su instalirane." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1188 +msgctxt "updates" +msgid "Review" +msgstr "Recenzija" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1237 +msgid "Failed To Update" +msgstr "Neuspjea nadopuna" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1242 +msgid "The system was already up to date." +msgstr "Sustav ima najnovije nadopune." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1247 +msgid "The update was cancelled." +msgstr "Nadopunjivanje je prekinuto." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1252 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Potreban je pristup Internetu ali nije dostupan. Pobrinite se da ste " +"povezani s Internetom i pokušajte ponovno." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1257 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Postoji sigurnosni problem s nadopunom. Obratite se svome pružatelju " +"softvera za više pojedinosti." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1262 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Nema dovoljno slobodnog diskovnog prostora. Oslobodite nešto prostora i " +"pokušajte ponovno." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1266 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Nažalost, nadopuna se neuspješno instalirala. Pričekajte drugu nadopunu i " +"pokušajte ponovno. Ako se problem nastavi, obratite se svome pružatelju " +"softvera." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:247 +#, c-format +msgid "Last checked: %s" +msgstr "Posljednja provjera: %s" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:559 +#, c-format +msgid "%s %s is no longer supported." +msgstr "%s %s više nije podržan(a)." + +#: src/gs-updates-page.c:563 +msgid "Your operating system is no longer supported." +msgstr "Vaš operativni sustav više nije podržan." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:568 +msgid "This means that it does not receive security updates." +msgstr "To znači da više nećete primati sigurnosne nadopune." + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:572 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "" +"Preporučljivo je da vaš operativni sustav nadogradite na najnovije izdanje." + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:849 +msgid "Charges May Apply" +msgstr "Mogu nastati dodatni novčani troškovi" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:853 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Provjeravanje nadopuna korištenjem mobilnog širokopojasnog interneta može " +"prouzročiti dodatne novčane troškove." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:857 +msgid "Check _Anyway" +msgstr "Svejedno _provjeri" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:873 +msgid "No Network" +msgstr "Nema pristupa internetu" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:877 +msgid "Internet access is required to check for updates." +msgstr "Potreban je pristup Internetu za provjeru nadopuna." + +#: src/gs-updates-page.c:1250 +msgid "Check for updates" +msgstr "Potraži nadopune" + +#: src/gs-updates-page.c:1286 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Nadopune" + +#: src/gs-updates-page.ui:6 +msgid "Updates page" +msgstr "Stranica nadopuna" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:82 +msgid "Loading Updates…" +msgstr "Učitavanje nadopuna…" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:95 +msgid "This could take a while." +msgstr "Ovo može potrajati određeno vrijeme." + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:203 +msgid "Up to Date" +msgstr "Nadopunjeno" + +#: src/gs-updates-page.ui:242 +msgid "Use Mobile Data?" +msgstr "Koristite mobilne podatke?" + +#: src/gs-updates-page.ui:243 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Provjeravanje nadopuna korištenjem mobilnog širokopojasnog interneta može " +"prouzročiti dodatne novčane troškove." + +#: src/gs-updates-page.ui:246 +msgid "_Check Anyway" +msgstr "_Svejedno provjeri" + +#: src/gs-updates-page.ui:262 +msgid "No Connection" +msgstr "Bez povezivanja" + +#: src/gs-updates-page.ui:263 +msgid "Go online to check for updates." +msgstr "Provjerite nadopune putem Interneta." + +#: src/gs-updates-page.ui:266 +msgid "_Network Settings" +msgstr "_Mrežne postavke" + +#: src/gs-updates-page.ui:295 +msgid "Error" +msgstr "Greška" + +#: src/gs-updates-page.ui:296 +msgid "Updates are automatically managed." +msgstr "Nadopune su automatski upravljane." + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:312 +msgid "Restart & Update" +msgstr "Ponovno pokreni i nadopuni" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-section.c:318 +msgid "Update All" +msgstr "Nadopuni sve" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:450 +msgid "Integrated Firmware" +msgstr "Ugrađeni firmver" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:455 +msgid "Requires Restart" +msgstr "Zahtijeva ponovno pokretanje" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:460 +msgid "Application Updates" +msgstr "Nadopune aplikacija" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:465 +msgid "Device Firmware" +msgstr "Firmver uređaja" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72 +#: plugins/packagekit/gs-packagekit-task.c:155 +msgid "_Download" +msgstr "_Preuzmi" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:90 +#, c-format +msgid "%s %s Available" +msgstr "%s %s je dostupan" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "%s Available" +msgstr "%s je dostupan" + +#: src/gs-upgrade-banner.c:143 +msgid "Learn about the new version" +msgstr "Saznajte više o novoj inačici" + +#: src/gs-upgrade-banner.c:167 +msgid "Downloading…" +msgstr "Preuzimanje…" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:185 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s od %s preuzeto" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:189 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% preuzeto" + +#: src/gs-upgrade-banner.ui:42 +msgid "A major upgrade, with new features and added polish." +msgstr "Glavna nadopuna, s novim značajkama i poboljšanjima." + +#: src/gs-upgrade-banner.ui:187 +msgid "_Restart & Upgrade" +msgstr "_Ponovno pokreni i nadogradi" + +#: src/gs-upgrade-banner.ui:201 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Preporučljivo je da sigurnosno kopirate svoje podatke i datoteke prije " +"nadogradnje." + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Dodaj, ukloni ili nadopuni softver na ovom računalu" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Nadopune;Nadogradnja;Izvori;Repozitoriji;Osobitosti;Instaliraj;Deinstaliraj;" +"Program;Softver;Aplikacija;Trgovina;" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:67 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2969 +msgid "System Updates" +msgstr "Nadopune sustava" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:72 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2974 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Opće nadopune sustava, poput sigurnosnih nadopuna ili popravaka grešaka i " +"poboljšanja performansi." + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:155 +msgid "Downloading featured images…" +msgstr "Preuzimanje potrebnih slika…" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:637 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s nadopuna s novim značajkama i popravcima." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:970 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS usluga nadopune ne može preuzeti i primijeniti nadopunu." + +#: plugins/epiphany/gs-plugin-epiphany.c:499 +#: plugins/epiphany/gs-plugin-epiphany.c:503 +msgid "Web App" +msgstr "Web aplikacija" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Podrška web aplikacija" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Pokrenite popularne web aplikacije u pregledniku" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257 +msgid "Downloading upgrade information…" +msgstr "Preuzimanje informacija nadogradnje…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:405 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Nadogradite kako bi imali najnovije značajke, performanse i poboljšanja " +"sustava." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak podrška" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "Flatpak je radni okvir za aplikacije radne površine na Linuxu" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:313 +#, c-format +msgid "System folder %s" +msgstr "Mapa sustava %s" + +#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315 +#, c-format +msgid "Home subfolder %s" +msgstr "Podmapa osobne mape %s" + +#: plugins/flatpak/gs-flatpak.c:316 +msgid "Host system folders" +msgstr "Mape sustava računala" + +#: plugins/flatpak/gs-flatpak.c:317 +msgid "Host system configuration from /etc" +msgstr "Podešavanje sustava računala iz /etc" + +#: plugins/flatpak/gs-flatpak.c:318 +msgid "Desktop folder" +msgstr "Mapa radne površine" + +#: plugins/flatpak/gs-flatpak.c:318 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Podmapa mape radne površine %s" + +#: plugins/flatpak/gs-flatpak.c:319 +msgid "Documents folder" +msgstr "Mapa dokumenata" + +#: plugins/flatpak/gs-flatpak.c:319 +#, c-format +msgid "Documents subfolder %s" +msgstr "Podmapa mape dokumenata %s" + +#: plugins/flatpak/gs-flatpak.c:320 +msgid "Music folder" +msgstr "Mapa glazbe" + +#: plugins/flatpak/gs-flatpak.c:320 +#, c-format +msgid "Music subfolder %s" +msgstr "Podmapa mape glazbe %s" + +#: plugins/flatpak/gs-flatpak.c:321 +msgid "Pictures folder" +msgstr "Mapa slika" + +#: plugins/flatpak/gs-flatpak.c:321 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Podmapa mape slika %s" + +#: plugins/flatpak/gs-flatpak.c:322 +msgid "Public Share folder" +msgstr "Mapa javnog dijeljenja" + +#: plugins/flatpak/gs-flatpak.c:322 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Podmapa mape javnog dijeljenja %s" + +#: plugins/flatpak/gs-flatpak.c:323 +msgid "Videos folder" +msgstr "Mapa snimki" + +#: plugins/flatpak/gs-flatpak.c:323 +#, c-format +msgid "Videos subfolder %s" +msgstr "Podmapa mape snimki %s" + +#: plugins/flatpak/gs-flatpak.c:324 +msgid "Templates folder" +msgstr "Mapa predloška" + +#: plugins/flatpak/gs-flatpak.c:324 +#, c-format +msgid "Templates subfolder %s" +msgstr "Podmapa mape predloška %s" + +#: plugins/flatpak/gs-flatpak.c:325 +msgid "User cache folder" +msgstr "Mapa privremenih datoteka korisnika" + +#: plugins/flatpak/gs-flatpak.c:325 +#, c-format +msgid "User cache subfolder %s" +msgstr "Podmapa mape privremenih datoteka korisnika %s" + +#: plugins/flatpak/gs-flatpak.c:326 +msgid "User configuration folder" +msgstr "Mapa korisnikovih podešavanja" + +#: plugins/flatpak/gs-flatpak.c:326 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Podmapa mape korisnikovih podešavanja %s" + +#: plugins/flatpak/gs-flatpak.c:327 +msgid "User data folder" +msgstr "Mapa korisnikovih podataka" + +#: plugins/flatpak/gs-flatpak.c:327 +#, c-format +msgid "User data subfolder %s" +msgstr "Podmapa mape korisnikovih podataka %s" + +#: plugins/flatpak/gs-flatpak.c:328 +msgid "User runtime folder" +msgstr "Mapa radnog procesa korisnika" + +#: plugins/flatpak/gs-flatpak.c:328 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Podmapa mape radnog procesa korisnika %s" + +#: plugins/flatpak/gs-flatpak.c:386 +#, c-format +msgid "Filesystem access to %s" +msgstr "Pristup datotečnom sustavu za %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1403 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Dobivanje flatpak metapodataka za %s…" + +#: plugins/flatpak/gs-flatpak.c:3580 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Neuspjelo čišćenje dodatka ‘%s’: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instalacija korisnika" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instalacija sustava" + +#: plugins/flatpak/gs-plugin-flatpak.c:1038 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Neuspjelo dodavanje instalacije za dodatak ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1052 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Neuspjelo dodavanje deinstalacije za dodatak ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1318 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Udaljeni “%s” ne dopušta instalaciju “%s”, vjerojatno zbog njegovog filtra. " +"Uklonite filter i ponovite instalaciju. Pojedinosti greške: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Energija sustava je preslaba za obavljanje nadopune" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Energija sustava je preslaba za obavljanje nadopune (%u%%, potrebno je %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Uređaj je nedostupan, ili je izvan bežičnog dosega" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Energija baterije uređaja je preslaba" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Energija baterije uređaja je preslaba (%u%%, potrebno je %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Uređaj čeka za primjenu nadopuna" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Uređaj zahtijeva vanjski izvor energije" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Uređaj se ne može koristiti dok je poklopac spušten" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s Device Update" +msgstr "%s nadopuna uređaja" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s System Update" +msgstr "%s nadopuna sustava" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s nadopuna ugrađenog upravljačkog uređaja" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s ME Update" +msgstr "%s nadopuna PU" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:238 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s nadopuna korporativnog PU" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s nadopuna potrošačkog PU" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Controller Update" +msgstr "%s nadopuna upravljačkog uređaja" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s nadopuna Thunderbolt upravljačkog uređaja" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:260 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s nadopuna CPU mikrokôda" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:265 +#, c-format +msgid "%s Configuration Update" +msgstr "%s nadopuna podešavanja" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:269 +#, c-format +msgid "%s Battery Update" +msgstr "%s nadopuna baterije" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:274 +#, c-format +msgid "%s Camera Update" +msgstr "%s nadopuna kamere" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:278 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM nadopuna" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:282 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s nadopuna touchpada" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:286 +#, c-format +msgid "%s Mouse Update" +msgstr "%s nadopuna miša" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:290 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s nadopuna tipkovnice" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s nadopuna upravljačkog uređaja pohrane" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s nadopuna mrežnog sučelja" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s Display Update" +msgstr "%s nadopuna zaslona" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:309 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC nadopuna" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:314 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s nadopuna USB prijemnika" + +#: plugins/fwupd/gs-plugin-fwupd.c:1244 +msgid "Firmware" +msgstr "Firmver" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Podrška za nadogradnju frimvera" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Omogućuje podršku za nadogradnju frimvera" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "Install Unsigned Software?" +msgstr "Želite li instalirati nepotpisani softver?" + +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Softver koji će se instalirati je nepotpisan. Nije moguće provjeriti izvor " +"nadopuna za ovaj softver ili s kime su nadopune povezane." + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "Download Unsigned Software?" +msgstr "Želite li preuzeti nepotpisani softver?" + +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Nepotpisane nadopune su dostupne. Bez potpisa, nije moguće provjeriti izvor " +"nadopuna za ovaj softver ili s kime su nadopune povezane." + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "Update Unsigned Software?" +msgstr "Želite li nadopuniti nepotpisani softver?" + +#: plugins/packagekit/gs-packagekit-task.c:159 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Nepotpisane nadopune su dostupne. Bez potpisa, nije moguće provjeriti izvor " +"nadopuna za ovaj softver ili s kime su nadopune povezane. Softverske " +"nadopune će biti onemogućene sve dok se nepotpisane nadopune ne uklone ili " +"nadopune." + +#: plugins/packagekit/gs-plugin-packagekit.c:367 +msgid "Packages" +msgstr "Paketi" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690 +msgid "Operating System (OSTree)" +msgstr "Operativni sustav (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap trgovina" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap podrška" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap je univerzalan Linux paket" + +#~ msgid "_Continue" +#~ msgstr "_Nastavi" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Nema instaliranih nadopuna na ovom sustavu." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Upravitelj aplikacijama za GNOME" + +#~ msgid "A list of popular applications" +#~ msgstr "Popis popularnih aplikacija" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Popis aplikacija koje se koriste, bez određenih aplikacija sustavom." + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Katalog softvera se preuzima" + +#~ msgid "Name" +#~ msgstr "Naziv" + +#~ msgid "system" +#~ msgstr "sustav" + +#~ msgid "user" +#~ msgstr "korisnik" + +#~ msgid "Channel" +#~ msgstr "Kanal" + +#~ msgid "Branch" +#~ msgstr "Ogranak" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Instalacija" + +#~ msgid "Version" +#~ msgstr "Inačica" + +#~ msgid "Checking…" +#~ msgstr "Provjeravanje…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Učitavanje…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Preuzimanje ocjena aplikacija…" + +#~ msgid "GNOME Software" +#~ msgstr "GNOME Softver" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "URI koji upućuje na pozadinu za nadogradnju transparenta." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URI može sadržavati do tri '%u', koje će bit zamijenjeni nadograđenom " +#~ "inačicom." + +#~ msgid "_Add shortcut" +#~ msgstr "_Dodaj prečac" + +#~ msgid "Re_move shortcut" +#~ msgstr "Uk_loni prečac" + +#~ msgid "Welcome" +#~ msgstr "Dobrodošli" + +#~ msgid "Welcome to Software" +#~ msgstr "Dobrodošli u Softver" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Softver vam omogućuje instalaciju svog potrebnog softvera, sve s jednog " +#~ "mjesta. Pogledajte naše preporuke, pregledajte kategorije ili potražite " +#~ "željenu aplikaciju." + +#~ msgid "_Browse Software" +#~ msgstr "_Pregledaj softver" + +#~ msgid "OS Updates" +#~ msgstr "Nadopune operativnog sustava" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "" +#~ "Uključuje poboljšanja performansa, stabilnosti i sigurnosna poboljšanja." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Preuzimanje potpisa nadopune frimvera…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Preuzimanje metapodataka nadopune frimvera…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Softver ima nepoznate dozvole" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Softver dolazi iz pouzdanog izvora" + +#~ msgid "Unknown Permissions" +#~ msgstr "Nepoznate dozvole" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Dozvole potrebne za ovu aplikaciju su nepoznate" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Aplikacija dolazi iz pouzdanog izvora" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Vaša distribucija je potvrdila da je ova aplikacija pouzdana" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Prikaži upit za instalaciju neslobodnih softverskih repozitroija" + +#~ msgid "Select All" +#~ msgstr "Odaberi sve" + +#~ msgid "Select None" +#~ msgstr "Ukloni odabir" + +#~ msgid "_Installed" +#~ msgstr "_Instalirano" + +#~ msgid "_Updates" +#~ msgstr "_Nadopune" + +#~ msgid "Featured %s" +#~ msgstr "Popularno %s" + +#~ msgid "Show" +#~ msgstr "Prikaži" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Izbornik filtra podkategorija" + +#~ msgid "Sort" +#~ msgstr "Razvrstaj" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Izbornik razvrstavanja podkategorija" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgid "Audio & Video" +#~ msgstr "Glazba i video" + +#~ msgid "Developer Tools" +#~ msgstr "Alati za razvijatelje" + +#~ msgid "Education & Science" +#~ msgstr "Edukacija i znanost" + +#~ msgid "Games" +#~ msgstr "Igre" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafika i fotografija" + +#~ msgid "Productivity" +#~ msgstr "Produktivnost" + +#~ msgid "Communication & News" +#~ msgstr "Komuniciranje i vijesti" + +#~ msgid "Reference" +#~ msgstr "Preporuke" + +#~ msgid "Utilities" +#~ msgstr "Pomagala" + +#~ msgid "_Read Less" +#~ msgstr "_Pročitaj manje" + +#~ msgid "_Launch" +#~ msgstr "_Pokreni" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Nemoguće otkrivanje koji dijelovi sustava pristupaju ovoj aplikaciji. Ovo " +#~ "je uobičajeno za starije aplikacije." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Nikada" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Niska" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Srednja" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Visoka" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Nepoznata" + +#~ msgid "Public domain" +#~ msgstr "Javno vlasništvo" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Korisnici su ograničeni sljedećom licencom:" +#~ msgstr[1] "Korisnici su ograničeni sljedećim licencama:" +#~ msgstr[2] "Korisnici su ograničeni sljedećim licencama:" + +#~ msgid "Localized in your Language" +#~ msgstr "Lokalizirano na vaš jezik" + +#~ msgid "Release Activity" +#~ msgstr "Aktivnosti izdanja" + +#~ msgid "Sandboxed" +#~ msgstr "Sigurno okruženje" + +#~ msgid "Category" +#~ msgstr "Kategorija" + +#~ msgid "Free" +#~ msgstr "Slobodan softver" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Nepoznata" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "To znači da se softver može slobodno koristiti, kopirati, dijeliti, " +#~ "proučavati i mijenjati." + +#~ msgid "Proprietary Software" +#~ msgstr "Vlasnički softver" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "To znači da je softver u vlasništvu pojedinaca ili kompanije. Često je " +#~ "pod ograničenjima u korištenju i ne može se pristupiti njegovom izvornom " +#~ "kôdu." + +#~ msgid "Unknown Software License" +#~ msgstr "Nepoznata licenca softvera" + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Uvjeti upotrebe za ovaj softver su nepoznati." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Aplikacija je ocjenjena na ovaj način jer sadrži:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Nema dostupnih pojedinosti za ovu ocjenu." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Deinstalirano" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Instalirano" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Nadopunjeno" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Nepoznato" + +#~ msgid "History" +#~ msgstr "Povijest" + +#~ msgid "More…" +#~ msgstr "Više…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Preporučene aplikacije videa i zvuka" + +#~ msgid "Recommended Games" +#~ msgstr "Preporučene igre" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Preporučene aplikacije za grafiku" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Preporučene aplikacije produktivnosti" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Pojedini softver je vlasnički softver i stoga ima ograničenje korištenja " +#~ "i pristup izvornom kôdu." + +#~ msgid "Find out more…" +#~ msgstr "Potražite više…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Odabir distribucije" + +#~ msgid "Recent Releases" +#~ msgstr "Nedavna izdanja" + +#~ msgid "Remove “%s”?" +#~ msgstr "Ukloni “%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Onemogući “%s”?" + +#~ msgid "Remove" +#~ msgstr "Ukloni" + +#~ msgid "No Additional Repositories" +#~ msgstr "Nema dodatnih repozitorija" + +#~ msgid "_Enable" +#~ msgstr "_Omogući" + +#~ msgid "_Remove…" +#~ msgstr "_Ukloni…" + +#~ msgid "_Disable…" +#~ msgstr "_Onemogući…" + +#~ msgid "Disabling" +#~ msgstr "Onemogućavanje" + +#~ msgid "Enabled" +#~ msgstr "Omogućeno" + +#~ msgid "Disabled" +#~ msgstr "Onemogućeno" + +#~ msgid "ratings in total" +#~ msgstr "ukupno ocjena" + +#~ msgid "_Remove All" +#~ msgstr "_Ukloni sve" + +#~ msgid "Looking for new updates…" +#~ msgstr "Pretraživanje novih nadopuna…" + +#~ msgid "Setting up updates…" +#~ msgstr "Postavljanje nadopuna…" + +#~ msgid "Software is up to date" +#~ msgstr "Softver je nadopunjen" + +#~ msgid "_Restart Now" +#~ msgstr "_Ponovno pokreni odmah" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Nadopune će se primijeniti kada se računalo ponovno pokrene." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Čekanje preuzimanja %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Preuzimam %s %s" + +#~ msgid "%s %s Ready to be Installed" +#~ msgstr "%s %s spremno za instalaciju" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS je usluga koja omogućuje korisničke recenzije aplikacija" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Omogući repozitorij proširenja GNOME ljuske" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Likovi crtića su u opasnim situacijama" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Likovi crtića su u agresivnim sukobima" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Animirano nasilje uključuje likove crtića" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Likovi u opasnim situacijama se lako mogu razlikovati od stvarnosti" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Likovi u agresivnim sukobima se lako mogu razlikovati od stvarnosti" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Animirano nasilje se lako može razlikovati od stvarnosti" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Srednje realni likovi u agresivnom sukobu" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Prikaz realnih likova u agresivnom sukobu" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Animirano nasilje uključuje realne likove" + +#~ msgid "No bloodshed" +#~ msgstr "Bez krvoprolića" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Nerealno krvoproliće" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Realno krvoproliće" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Prikaz krvoprolića i sakaćenja dijelova tijela" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Silovanje ili ostalo nasilje seksualnog ponašanja" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Pozivanje na alkoholna pića" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Upotreba alkoholnih pića" + +#~ msgid "References to illicit drugs" +#~ msgstr "Pozivanje na nedopuštene droge" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Upotreba nedopuštenih droga" + +#~ msgid "References to tobacco products" +#~ msgstr "Pozivanje na duhanske proizvode" + +#~ msgid "Use of tobacco products" +#~ msgstr "Upotreba duhanskih proizvoda" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Kratka umjetnička golotinja" + +#~ msgid "Prolonged nudity" +#~ msgstr "Dugotrajna golotinja" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provokativne aluzije ili crteži" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Seksualne aluzije ili crteži" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Animirano seksualno ponašanje" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Blaga ili sporadičnu upotreba psovki" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Umjerena upotreba psovki" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Snažna ili česta upotreba psovki" + +#~ msgid "Slapstick humor" +#~ msgstr "Urnebesni humor" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgaran ili kafanski humor" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Seksualni ili humor za odrasle" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativnost prema određenoj skupini ljudi" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Diskriminacija osmišljena da uzrokuje emocionalno nasilje" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Eksplicitna diskriminacija na osnovi spola, spolnosti, rasi ili religiji" + +#~ msgid "Product placement" +#~ msgstr "Plasman proizvoda" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Jasne odredbe zaštićene robne marke ili zaštitnog znaka proizvoda" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Korisnici se potiču na kupnju određenog stvarnog predmeta" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Kockanje na slučajnim događajima pomoću žetona ili kredita" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Kockanje upotrebom novca iz \"igre\"" + +#~ msgid "Gambling using real money" +#~ msgstr "Kockanje upotrebno stvarnog novca" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Korisnici se potiču na kupnju određenog stvarnog predmeta" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Mogućnost trošenja stvarnog novca u aplikaciji" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "" +#~ "Korisnik-prema-korisniku interakcija bez mogućnosti međusobnog razgovora" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Ograničena mogućnost razgovora između korisnika" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "" +#~ "Nekontrolirana mogućnost glasovnog i video razgovora između korisnika" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Dijeljenje imena i adresa e-pošte društvenih mreža" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Provjera najnovije inačice aplikacije" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Dijeljenji dijagnostički podaci koji ne dopuštaju drugima da " +#~ "identificiraju korisnika" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Dijeljene informacije koju dopuštaju drugima da identificiraju korisnika" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Dijeljenje fizičke lokacije sa ostalim korisnicima" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Neizrano pozivanje na homoseksualnost" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Ljubljenje između ljudi istog spola" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Grafičko spolno ponašanje između ljudi istog spola" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Neizravno pozivanje na prostituciju" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Izravno pozivanje na prostituciju" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Grafički prikaz čina prostitucije" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Neizravno pozivanje na preljub" + +#~ msgid "Direct references to adultery" +#~ msgstr "Izravno pozivanje na preljub" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Grafički prikaz čina preljuba" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Oskudno odjeveni likovi" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Javno neprimjereni seksualni likovi" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Prikaz ili poziv na povijesno oskvrnuće" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Prikaz oskvrnuća ljudske suvremenosti" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Grafički prikaz oskvrnuća ljudske suvremenosti" + +#~ msgid "Visible dead human remains" +#~ msgstr "Vidlji mrtvi ljudski ostaci" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Vidlji mrtvi ljudski ostaci koji su izloženi u elementima" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Grafički prikazi oskvrnuća ljudskih tijela" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Prikaz ili poziv na povijesno ropstvo" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Prikaz suvremenog ropstva" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Grafički prikaz suvremenog ropstva" + +#~ msgid "General" +#~ msgstr "Općenito" + +#~ msgid "ALL" +#~ msgstr "SVE" + +#~ msgid "Teen" +#~ msgstr "Za tinejdžere" + +#~ msgid "Everyone 10+" +#~ msgstr "Iznad 10 god" + +#~ msgid "Everyone" +#~ msgstr "Bez dobnog ograničenja" + +#~ msgid "Early Childhood" +#~ msgstr "Rano djetinjstvo" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Nepoznata" + +#~ msgid "this website" +#~ msgstr "ova web stranica" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Krenimo u kupovinu" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Uklonjeno" + +#~ msgid "Format" +#~ msgstr "Format" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Sigurno želite ukloniti %s?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Aplikacija se mora ponovno pokrenuti kako bi se mogao koristiti novi " +#~ "priključak." + +#~ msgid "Security Updates Pending" +#~ msgstr "Sigurnosne nadopune na čekanju" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Preporučljivo je da važne nadopune instalirate odmah" + +#~ msgid "Restart & Install" +#~ msgstr "Ponovno pokreni i instaliraj" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Bitne nadopune operativnog sustava i aplikacija su spremne za instalaciju" + +#~ msgid "View" +#~ msgstr "Preglednik" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Jučer, %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Jučer, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "prije tri dana" + +#~ msgid "Four days ago" +#~ msgstr "prije četiri dana" + +#~ msgid "Five days ago" +#~ msgstr "prije pet dana" + +#~ msgid "Six days ago" +#~ msgstr "prije šest dana" + +#~ msgid "Two weeks ago" +#~ msgstr "prije dva tjedna" + +#~ msgid "About %s" +#~ msgstr "O %s" + +#~ msgid "%s ME" +#~ msgstr "%s PU" + +#~ msgid "Extension Settings" +#~ msgstr "Postavke proširenja" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Proširenja koristite na vlastit rizik. Ako imate bilo kakvih problema sa " +#~ "sustavom, preporučeno je njihovo onemogućavanje." + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Proširenja ljuske" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Repozitorij proširenja GNOME ljuske" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Preuzimanje metapodataka proširenja ljuske…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Proširenja GNOME ljuske" + +#~ msgid "Show the folder management UI" +#~ msgstr "Prikaži korisničko sučelje upravljanja mapom" + +#~ msgid "Folder Name" +#~ msgstr "Naziv mape" + +#~ msgid "_Add" +#~ msgstr "_Dodaj" + +#~ msgid "Add to Application Folder" +#~ msgstr "Dodaj u mapu aplikacije" + +#~ msgid "Top Rated" +#~ msgstr "Najpopularnije" + +#~ msgid "Failed to load components" +#~ msgstr "Neuspjelo učitavanje komponenti" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS je prošao provjeru!" + +#~ msgid "Failed to load file" +#~ msgstr "Neuspješno učitavanje datoteke" + +#~ msgid "Unsaved changes" +#~ msgstr "Nespremljene promjene" + +#~ msgid "The application list is already loaded." +#~ msgstr "Popis aplikacija je već učitan." + +#~ msgid "Merge documents" +#~ msgstr "Spoji dokumente" + +#~ msgid "Throw away changes" +#~ msgstr "Odbaci promjene" + +#~ msgid "Open AppStream File" +#~ msgstr "Otvori AppStream datoteku" + +#~ msgid "Save AppStream File" +#~ msgstr "Spremi AppStream datoteku" + +#~ msgid "_Save" +#~ msgstr "_Spremi" + +#~ msgid "Failed to save file" +#~ msgstr "Neuspješno spremanje datoteke" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s transparent je obrisan." + +#~ msgid "Banner design deleted." +#~ msgstr "Transparent je obrisan." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Popis aplikacija ima nespremljene promjene." + +#~ msgid "Use verbose logging" +#~ msgstr "Koristi opširnije zapisivanje" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME softver dizajner transparenata" + +#~ msgid "No Designs" +#~ msgstr "Nema dizajna" + +#~ msgid "Error message here" +#~ msgstr "Ovdje poruka greške" + +#~ msgid "App ID" +#~ msgstr "ID aplikacije" + +#~ msgid "Category Featured" +#~ msgstr "Popularne kategorije" + +#~ msgid "Undo" +#~ msgstr "Vrati" + +#~ msgid "Banner Designer" +#~ msgstr "Dizajner transparenta" + +#~ msgid "New Banner" +#~ msgstr "Novi transparent" + +#~ msgid "Import from file" +#~ msgstr "Uvezi iz datoteke" + +#~ msgid "Export to file" +#~ msgstr "Izvezi u datoteku" + +#~ msgid "Delete Design" +#~ msgstr "Obriši dizajn" + +#~ msgid "Spacing" +#~ msgstr "Razmak" + +#~ msgid "The amount of space between children" +#~ msgstr "Količina razmaka među sadržanim elementima" + +#~ msgid "Click on items to select them" +#~ msgstr "Kliknite na stavku za odabir" + +#~ msgid "Select" +#~ msgstr "Odaberi" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Dodaj u mapu…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Premjesti u mapu…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Ukloni iz mape" + +#~ msgid "Featured Applications" +#~ msgstr "Istaknute aplikacije" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Dizajniraj potrebne transparente za GNOME Softver" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Softver;Aplikacija;" + +#~ msgid "_All" +#~ msgstr "_Sve" + +#~ msgid "Sign In / Register…" +#~ msgstr "Prijava / Registracija…" + +#~ msgid "Continue" +#~ msgstr "Nastavi" + +#~ msgid "Use" +#~ msgstr "Koristi" + +#~ msgid "Add another…" +#~ msgstr "_Dodaj drugi…" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s će biti instaliran, i biti će naplaćen %s." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "Prijavljen kao %s" + +#~ msgid "Sign in…" +#~ msgstr "Prijava…" + +#~ msgid "Sign out" +#~ msgstr "Odjava" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Nemoguće je kupiti %s: potrebna je ovjera" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Nemoguće je kupiti %s: pogrešna ovjera" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Nemoguće je kupiti %s: nema postavljenog načina plaćanja" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Nemoguće je kupiti %s: plaćanje je odbijeno" + +#~ msgid "Unable to purchase %s" +#~ msgstr "Nemoguća je kupiti %s" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Za nastavak, potreban vam je račun Ubuntu jednokratne prijave." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "" +#~ "Za nastavak, potreban vam je vlastiti račun Ubuntu jednokratne prijave." + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Prikaži određene informacije za uslugu" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Za nastavak se morate prijaviti na %s." + +#~ msgid "Email address" +#~ msgstr "Adresa e-pošte" + +#~ msgid "I have an account already" +#~ msgstr "Već posjedujem račun" + +#~ msgid "Password" +#~ msgstr "Lozinka" + +#~ msgid "I want to register for an account now" +#~ msgstr "Želim registrirati račun odmah" + +#~ msgid "I have forgotten my password" +#~ msgstr "Zaboravio sam svoju lozinku" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Prijavi se automatski sljedeći put" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Upišite svoj jednokratan pin za dvostruku ovjeru." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Ovjera" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Katalog softvera se učitava" + +#~ msgid "_About" +#~ msgstr "_O programu" + +#~ msgid "_Quit" +#~ msgstr "_Izlaz" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Informacije o %s, kao i upute kako nabaviti kôdek koji može reproducirati " +#~ "ovaj format mogu se pronaći na web stranici." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Instalacija softvera nije moguća sve dok se ovo ne razriješi." + +#~ msgid "For more information, visit %s." +#~ msgstr "Za više informacija, posjetite %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Nemoguća je nadopuniti %s s %s" + +#~ msgid "Downloading new updates…" +#~ msgstr "Preuzimanje novih nadopuna…" + +#~ msgid "U_pdate All" +#~ msgstr "N_adopuni sve" + +#~ msgid "Restart & _Install" +#~ msgstr "Ponovno pokreni i _instaliraj" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Getting runtime source…" +#~ msgstr "Dobivanje izvora komponente izvršavanja…" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba omogućuje razvijateljima lagan način stvaranja softverskih paketa" + +#~ msgid "Downloading application page…" +#~ msgstr "Preuzimanje stranice aplikacije…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Ultimativna platforma za zabavu od Valvea" + +#~ msgid "Sorted by Name" +#~ msgstr "Razvrstano po nazivu" + +#~ msgid "Sorted by Rating" +#~ msgstr "Razvrstano po ocjeni" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Popis dodatnih repozitorija koji su prije omogućeni" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Popis repozitorija koji su prije omogućeni prilikom instalacije " +#~ "aplikacija treće strane." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Prikaži neslobodni softver u rezultatima pretrage" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "Popis neslobodnih repozitorija koji se mogu omogućiti po potrebi" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Igrač-prema-igraču unaprijed postavljena interakcija igre bez mogućnosti " +#~ "međusobnog razgovora" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Dijeljenje informacija korisnika sa trećom stranom" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Omogući vlasničke repozitorije softvera?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Nema instaliranih aplikacija ili dodataka; drugi softver je možda prisutan" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Uobičajeno ima ograničenja korištenja i pristupa izvornom kôdu." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Repozitoriji vlasničkog softvera" + +#~ msgid "Remove Source" +#~ msgstr "Ukloni repozitorij" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Repozitoriji softvera mogu se preuzeti s Interneta. Omogućuju vam pristup " +#~ "dodatnom softveru koji nije dostupan putem %s repozitorija." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Uklanjanje repozitorija će isto tako ukloniti sav softver koji je " +#~ "instaliran iz njega." + +#~ msgid "No software installed from this source" +#~ msgstr "Nema softvera instaliranog iz ovog repozitorija" + +#~ msgid "Installed from this Source" +#~ msgstr "Instalirano iz ovog repozitorija" + +#~ msgid "Last Checked" +#~ msgstr "Posljednja provjera" + +#~ msgid "Added" +#~ msgstr "Dodano" + +#~ msgid "Website" +#~ msgstr "Web stranica" + +#~ msgid "page1" +#~ msgstr "stranica1" + +#~ msgid "page2" +#~ msgstr "stranica2" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgid "“%s” [%s]" +#~ msgstr "“%s” [%s]" + +#~ msgid "Total" +#~ msgstr "Ukupno" + +#~ msgid "Could not find '%s'" +#~ msgstr "Nemoguće je pronaći '%s'" + +#~ msgid "_Install All" +#~ msgstr "_Instaliraj sve" + +#~ msgid "Other Updates" +#~ msgstr "Ostale nadopune" + +#~ msgid "Installation of %s failed." +#~ msgstr "%s instalacija neuspješna." + +#~ msgid "Removal of %s failed." +#~ msgstr "Uklanjanje %s neuspjelo" + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Pobrinite se da imate pristup internetu i pokušajte ponovno." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Oslobodite nešto diskovnog prostora i pokušajte ponovno." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "" +#~ "Ako se problem nastavi, kontaktirajte svojeg softverskog opskrbitelja." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Nepoznat" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Nepoznato" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Popularno" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomija" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Kemija" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgid "Science" +#~ msgstr "Znanost" + +#~ msgid " or " +#~ msgstr " ili " + +#~ msgid "Open Source" +#~ msgstr "Otvoreni kôd" + +#~ msgid "3rd party" +#~ msgstr "3 strana" + +#~ msgid "web app" +#~ msgstr "web aplikacija" + +#~ msgid "nonfree" +#~ msgstr "vlasničko" + +#~ msgid "_Installing" +#~ msgstr "_Instalacija" + +#~ msgid "_Removing" +#~ msgstr "_Uklanjanje" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Nepoznata" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Nepoznata" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "Nepoznata" + +#~ msgid "_History" +#~ msgstr "_Povijest" + +#~ msgid "Size" +#~ msgstr "Veličina" + +#~ msgid "non-free" +#~ msgstr "neslobodno" + +#~ msgid "%i add-on" +#~ msgid_plural "%i add-ons" +#~ msgstr[0] "%i dodatak" +#~ msgstr[1] "%i dodatka" +#~ msgstr[2] "%i dodatka" + +#~ msgid "Two Stars" +#~ msgstr "Dvije zvjezdice" + +#~ msgid "Three Stars" +#~ msgstr "Tri zvjezdice" + +#~ msgid "Four Stars" +#~ msgstr "Četiri zvjezdice" + +#~ msgid "Five Stars" +#~ msgstr "Pet zvjezdica" + +#~ msgid "An error occurred" +#~ msgstr "Greška se dogodila" + +#~ msgid "_Email address:" +#~ msgstr "_Adresa e-pošte:" + +#~ msgid "One-time password:" +#~ msgstr "Jednostruka lozinka:" + +#~ msgid "You are now signed into Ubuntu One." +#~ msgstr "Sada ste prijavljeni na Ubuntu One." + +#~ msgid "Audio" +#~ msgstr "Zvuk" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Uređivanje" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Baze podataka" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Snimanje diskova" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Amaterski radio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Glazba" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Snimači" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Prijemnici" + +#~ msgid "Development Tools" +#~ msgstr "Razvojni alati" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Izgradnja" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Baze podataka" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Oblikovanje" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Razvoj weba" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Astronomy" +#~ msgstr "Astronomija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Chemistry" +#~ msgstr "Kemija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Računalna znanost" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Inženjerstvo" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geography" +#~ msgstr "Geografija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Povijest" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Obrada slika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fizika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Arcade" +#~ msgstr "Arkada" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Board" +#~ msgstr "Društvene igre" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Card" +#~ msgstr "Kartaške igre" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Emulators" +#~ msgstr "Emulatori" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Role Playing" +#~ msgstr "Role playing" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulacija" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Strategy" +#~ msgstr "Strategija" + +#~ msgid "Graphics" +#~ msgstr "Grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "3D Graphics" +#~ msgstr "3D grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Photography" +#~ msgstr "Fotografija" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Izdavaštvo" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Vector Graphics" +#~ msgstr "Vektorska grafika" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "E-pošta" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Prijenos datoteka" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Amaterski radio" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC klijenti" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "News" +#~ msgstr "Vijesti" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonija" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Video Conference" +#~ msgstr "Video konferencija" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Browser" +#~ msgstr "Web preglednik" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Razvoj weba" + +#~ msgid "Office" +#~ msgstr "Ured" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Calendar" +#~ msgstr "Kalendar" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Database" +#~ msgstr "Baza podataka" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Rječnik" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "E-pošta" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Finance" +#~ msgstr "Financije" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografija" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Izdavaštvo" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Proračunska tablica" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Word Processor" +#~ msgstr "Obrada teksta" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Kemija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Računalna znanost" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Inženjerstvo" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Povijest" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Obrada slika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Jezici" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Mape" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Numerička analiza" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Usporedno izračunavanje" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fizika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Duhovnost" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulator" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Upravitelj datoteka" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Alati za datoteke" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Nadgledanje" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Sigurnost" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Emulator terminala" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Pristupačnost" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Arhiviranje" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Kalkulator" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Sat" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Sažimanje" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Alati za datatoteke" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Mape" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Duhovnost" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Alati za telefoniju" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Text Editor" +#~ msgstr "Obrada teksta" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Uređivanje" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Baza podataka" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Snimanje diskova" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Players" +#~ msgstr "Reproduktori" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Snimači" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "Televizija" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Fonts" +#~ msgstr "Slova" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Codecs" +#~ msgstr "Kôdeki" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Language Packs" +#~ msgstr "Jezični paketi" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Proširenja ljuske" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Localization" +#~ msgstr "Lokalizacija" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Preporučene aplikacije za ured" + +#~ msgid "Recommended Audio Applications" +#~ msgstr "Preporučene aplikacije za zvuk" + +#~ msgid "%i add-on installed" +#~ msgid_plural "%i add-ons installed" +#~ msgstr[0] "%i dodatak instaliran" +#~ msgstr[1] "%i dodatka instalirana" +#~ msgstr[2] "%i dodataka instalirano" + +#~ msgid "%i application" +#~ msgid_plural "%i applications" +#~ msgstr[0] "%i aplikacija" +#~ msgstr[1] "%i aplikacije" +#~ msgstr[2] "%i aplikacija" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Repozitoriji softvera omogućuju vam pristup dodatnom softveru." + +#~ msgid "One Star" +#~ msgstr "Jedna zvjezidca" + +#~ msgid "Too many requests" +#~ msgstr "Previše zahtjeva" + +#~ msgid "An update is needed to show all installable apps. Download now?" +#~ msgstr "" +#~ "Nadopuna je potrebna za prikaz svih aplikacija koje se mogu instalirati. " +#~ "Preuzmi odmah?" + +#~ msgid "Incorrect email or password" +#~ msgstr "Neispravna adresa e-pošte ili lozinka" + +#~ msgid "Account deactivated" +#~ msgstr "Račun deaktiviran" + +#~ msgid "Email invalidated" +#~ msgstr "Adresa e-pošte neispravna" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mikser" + +#~ msgid "I have an Ubuntu Single Sign-On account" +#~ msgstr "Posjedujem račun Ubuntu jedinstvene prijave." + +#~ msgid "" +#~ "To rate and review software, you need an Ubuntu Single Sign-On account." +#~ msgstr "" +#~ "Za ocjenu i recenziranje softvera, potreban vam je račun Ubuntu " +#~ "jedinstvene prijave." + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Debuggers" +#~ msgstr "Otklanjanje grešaka" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Usklađivači" + +#~ msgid "I've forgotten my password" +#~ msgstr "Zaboravio/la sam lozinku" + +#~ msgid "Enter your one-time password for two-factor authentication." +#~ msgstr "Upišite svoju jednostruku lozinku za dvostruku provjeru ovjere." + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Artificial Intelligence" +#~ msgstr "Umjetna inteligencija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Art" +#~ msgstr "Umjetnost" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Električna energija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Ekonomija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Vizualizacija podataka" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Construction" +#~ msgstr "Graditeljstvo" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geo-znanost" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "Upravljanje projektima" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Usporedno izračunavanje" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Robotics" +#~ msgstr "Robotika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Glazba" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Mape" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Medical" +#~ msgstr "Medicina" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Languages" +#~ msgstr "Jezici" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Numerička analiza" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Logic" +#~ msgstr "Logika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Scanning" +#~ msgstr "Skeniranje" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Duhovnost" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Action" +#~ msgstr "Akcija" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Adventure" +#~ msgstr "Avantura" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Blocks" +#~ msgstr "Blokovi" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Pucačina" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Kids" +#~ msgstr "Djeca" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Viewer" +#~ msgstr "Preglednici" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Upravljanje kontaktima" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Grafikon" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Nadgledanje" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Dijagrami toka" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "Dlanovnik" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Upravljanje projektima" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Trenutno dopisivanje" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Vizualizacija podataka" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Ekonomija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Električna energija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geo-znanost" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Umjetna inteligencija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Umjetnost" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humanističke znanosti" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Input Sources" +#~ msgstr "Ulazni izvori" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Rasterska grafika" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Kanali" + +#~ msgid "Ubuntu Software" +#~ msgstr "Ubuntu softver" + +#~ msgid "No AppStream data found" +#~ msgstr "AppStream podaci nisu pronađeni" + +#~ msgid "" +#~ "To install and remove snaps, you need an Ubuntu Single Sign-On account." +#~ msgstr "" +#~ "Za instalaciju ili uklanjanje snap paketa, potreban vam je račun Ubuntu " +#~ "jedinstvene prijave." + +#~ msgid "%i application installed" +#~ msgid_plural "%i applications installed" +#~ msgstr[0] "%i aplikacija instalirana" +#~ msgstr[1] "%i aplikacije instalirane" +#~ msgstr[2] "%i aplikacija instalirano" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Chat" +#~ msgstr "Razgovor" + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Ovaj softver dolazi od treće strane i može sadržavati vlasničke " +#~ "komponente." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Ovaj softver može sadržavati vlasničke komponente." diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..89d4651 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,6445 @@ +# Hungarian translation for gnome-software. +# Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-software package. +# +# Balázs Úr , 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. +# Gabor Kelemen , 2013, 2014, 2015, 2016, 2017, 2018. +# Balázs Meskó , 2020, 2021, 2022. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-03 19:04+0000\n" +"PO-Revision-Date: 2025-03-06 17:46+0100\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 23.08.5\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Szoftver" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Alkalmazások telepítése és frissítése" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"A Szoftverek lehetővé teszi új alkalmazások és rendszerkiterjesztések " +"keresését, telepítését, valamint a meglévő telepített alkalmazások " +"eltávolítását." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"A Szoftver bemutatja a kiemelt és népszerű alkalmazásokat, hasznos " +"leírásokat és alkalmazásonként több képernyőképet is megjelenít. Az " +"alkalmazások a kategóriák listáinak tallózásával vagy kereséssel találhatók " +"meg. A program lehetővé teszi a rendszer frissítését kapcsolat nélküli " +"frissítés használatával is." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Áttekintés panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Részletek panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Telepített panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Frissítések panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "A frissítés részletei" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "A GNOME projekt" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Az akmods-kulcs próbája a Shim UEFI-ben" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Hitelesítés szükséges az akmods-kulcs próbájához a Shim UEFI-ben" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Az akmods-kulcs bejegyzése a Shim UEFI-be" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Hitelesítés szükséges az akmods-kulcs bejegyzéséhez a Shim UEFI-be" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "A DKMS-kulcs próbája a Shim UEFI-ben" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Hitelesítés szükséges a DKMS-kulcs próbájához a Shim UEFI-ben" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "A DKMS-kulcs bejegyzése a Shim UEFI-be" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Hitelesítés szükséges a DKMS-kulcs bejegyzéséhez a Shim UEFI-be" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Appstream fájl telepítése egy, a rendszer számára elérhető helyre" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Appstream fájl telepítése egy, a rendszer számára elérhető helyre" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Kompatibilis projektek listája" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Ez a megjelenítendő kompatibilis projektek listája, például GNOME, KDE és " +"XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Kezelje-e a frissítéseket és új verziókat a GNOME Szoftverben" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Ha le van tiltva, akkor a GNOME Szoftver elrejti a frissítések panelt, és " +"nem végez automatikus frissítési műveleteket és nem tesz fel kérdéseket." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Frissítések automatikus letöltése és telepítése" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Ha engedélyezve van, akkor a GNOME Szoftver automatikusan letölti a " +"szoftverfrissítéseket a háttérben, és telepíti is azokat, amelyek nem " +"igényelnek újraindítást." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "A felhasználó értesítése, hogy szoftverek frissültek a háttérben" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Ha engedélyezve van, akkor a GNOME Szoftver értesíti a felhasználót azokról " +"a frissítésekről, amelyek akkor történetek, amikor a felhasználó tétlen volt." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Automatikus legyen-e a keresés, ha forgalomkorlátos kapcsolatot használ" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Ha be van kapcsolva, akkor a GNOME Szoftver automatikusan keres a háttérben, " +"még akkor is, ha forgalomkorlátos kapcsolatot használ (letölt néhány " +"metaadatot, frissítéseket keres stb., amely költségeket okozhat a " +"felhasználónak)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Vajon ez a GNOME Szoftver legelső futása-e" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Csillagos értékelések megjelenítése az alkalmazások mellett" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Az alkalmazások szűrése a távoli tárolóhoz beállított alapértelmezett ág " +"alapján" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"A nem szabad szoftverekhez figyelmeztető ablak jelenik meg telepítés előtt" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Nem szabad szoftverek telepítése előtt megjeleníthető egy figyelmeztető " +"ablak. Itt beállítható ennek megjelenése." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Utolsó frissítéskeresés időbélyege" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Az utolsó frissítés értesítésének időbélyege" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Az utolsó frissítés értesítésének időbélyege" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Az első biztonsági frissítés időbélyege, a frissítés után törlődik" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Utolsó frissítés időbélyege" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"A kor másodpercben, annak megállapítására, hogy a képernyőkép még érvényes-e" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"A nagyobb érték kevesebb fordulót jelent a távoli kiszolgálóhoz, de a " +"frissített képernyőképek később jelennek meg a felhasználónál. A 0 érték azt " +"jelenti, hogy sosem ellenőrzi a kiszolgálót, ha már létezik kép a " +"gyorsítótárban." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Az alkalmazásértékelésekhez használandó kiszolgáló" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "A vélemények minimális karma pontszáma" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Az ennél alacsonyabb karmájú vélemények nem jelennek meg." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Azon hivatalos tárolók listája, amelyeket nem szabad harmadik féltől " +"származónak tekinteni" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Azon kötelező tárolók listája, amelyeket nem lehet letiltani vagy " +"eltávolítani" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Azon hivatalos tárolók listája, amelyeket szabad szoftvernek kell tekinteni" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"A használandó licenc URL, ha az alkalmazást szabad szoftvernek kell tekinteni" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Csomagolt alkalmazások telepítése az összes felhasználónak a rendszeren, " +"ahol csak lehetséges" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Hozzáférés engedélyezése a Szoftvertárolók párbeszédablakhoz" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Frissítések ajánlása előzetes kiadásokhoz" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Néhány felhasználói felületelem megjelenítése a felhasználó tájékoztatására, " +"hogy egy alkalmazás nem szabad" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Az alkalmazások telepített méretének megjelenítése a telepített alkalmazások " +"listájában" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" +"'https://hu.wikipedia.org/wiki/Z%C3%A1rt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"Az URI, amely elmagyarázza a nem szabad és a tulajdonosi (zárt) szoftvereket" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"URL-ek listája, amelyek azokra az appstream fájlokra mutatnak, amelyek " +"letöltésre kerülnek egy swcatalog mappába" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Az AppStream fájlok telepítése rendszerszinten elérhető helyre, az összes " +"felhasználó számára. Ha hamis, akkor a fájlok a nem szabványos " +"$XDG_DATA_HOME/swcatalog/xml könyvtárba lesznek telepítve." + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Az előnyben részesítendő csomagformátumok prioritásos sorrendje, ahol a " +"fontosabb formátumok elöl szerepelnek. Az üres tömb az alapértelmezett " +"sorrendet jelenti. A kihagyott formátumok lesznek az utolsók. Példa a " +"csomagformátumokra: deb, flatpak, rpm, snap. A formátumok esetlegesen " +"megadhatók eredetnévvel, kettősponttal elválasztva, például „flatpak:" +"flathub”." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Az utolsó kísérlet időbélyege a nem használt Flatpak futtatókörnyezetek " +"eltávolításához" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Állítsa „igaz” értékre a csak szabad licencelésű alkalmazások " +"megjelenítéséhez és a tulajdonosi (zárt) alkalmazások elrejtéséhez." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Állítsa „igaz” értékre a csak olyan fejlesztőktől származó alkalmazások " +"megjelenítéséhez, akiknek a személyazonossága ellenőrizve van." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Az utoljára megkapott múltbeli frissítések időbélyege." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Egy karakterlánc, amely a bejelentkezéshez használt gnome-online-account " +"azonosítót tárolja" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Szoftver – AppStream rendszerszintű telepítő" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "A parancssori argumentumok feldolgozása meghiúsult" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Pontosan egy fájlnevet kell megadnia" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Ezt a programot csak a root felhasználó használhatja" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "A tartalomtípus ellenőrzése sikertelen: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Az áthelyezés sikertelen: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Szoftvertelepítő" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "A kijelölt szoftverek telepítése a rendszerre" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Rajzfilmes erőszak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nincs információ a rajzfilmes erőszakkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantasy erőszak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nincs információ a fantasy erőszakkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realisztikus erőszak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nincs információ a realisztikus erőszakkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Vérontást ábrázoló erőszak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Nincs információ a vérontással kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Szexuális erőszak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nincs információ a szexuális erőszakkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nincs információ az alkoholra történő hivatkozásokkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Kábítószerek" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "" +"Nincs információ az illegális kábítószerekre történő hivatkozásokkal " +"kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Dohány" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "" +"Nincs információ a dohánytermékekre történő hivatkozásokkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Meztelenség" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nincs információ semmilyen meztelenséggel kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Szexuális témák" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Nincs információ a szexuális jellegű hivatkozásokkal vagy ábrázolásokkal " +"kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Káromkodás" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nincs információ semmiféle káromkodással kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Nem helyénvaló humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nincs információ a nem helyénvaló humorral kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diszkrimináció" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Nincs információ semmiféle diszkriminatív nyelvezettel kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklám" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nincs információ semmiféle reklámozással kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Szerencsejáték" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nincs információ semmiféle szerencsejátékkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Vásárlás" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nincs információ a pénzköltési lehetőséggel kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Csevegés felhasználók között" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" +"Nincs információ a más felhasználókkal történő csevegés módjaival " +"kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Hangalapú csevegés a felhasználók között" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" +"Nincs információ a más felhasználókkal történő beszélgetés módjaival " +"kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kapcsolati részletek" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nincs információ a közösségi hálózati felhasználónevek vagy e-mail-címek " +"megosztásával kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Azonosításra alkalmas információk" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Nincs információ a felhasználói adatok harmadik felekkel való megosztásával " +"kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Helymegosztás" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Nincs információ a fizikai hely más felhasználókkal való megosztásával " +"kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoszexualitás" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "" +"Nincs információ a homoszexualitásra történő hivatkozásokkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitúció" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nincs információ a prostitúcióra történő hivatkozásokkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Házasságtörés" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "" +"Nincs információ a házasságtörésre történő hivatkozásokkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Szexualizált karakterek" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nincs információ a szexualizált karakterekkel kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Gyalázás" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nincs információ a gyalázásra történő hivatkozásokkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Emberi maradványok" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nincs információ a látható halott emberi maradványokkal kapcsolatban" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Rabszolgaság" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nincs információ a rabszolgaságra történő hivatkozásokkal kapcsolatban" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Nem tartalmaz kábítószerekre való hivatkozásokat" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Nem tartalmaz káromkodást, trágárságot és egyéb durva beszédet" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Nem tartalmaz hirdetéseket vagy pénzügyi tranzakciókat" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Nem tartalmaz szexet vagy meztelenséget" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Nem tartalmaz ellenőrizetlen csevegőfunkciót" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Nem tartalmaz erőszakot" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Kábítószerek" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Durva beszéd" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Pénz" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Közösségi" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Erőszak" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Összes" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "A(z) %s ismeretlen korhatár-besorolással rendelkezik" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "A(z) %s mindenki számára megfelelő" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "A(z) %s a totyogók számára megfelelő" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "A(z) %s a kisgyermekek számára megfelelő" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "A(z) %s a gyermekek számára megfelelő" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "A(z) %s a tizenévesek számára megfelelő" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "A(z) %s a felnőttek számára megfelelő" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "A(z) %s a következők számára megfelelő: %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Korhatár-besorolás" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Hogyan adhatók hozzá a hiányzó információk" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Helyi fájl" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Csomag" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Függőben" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Függőben lévő telepítés" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Függőben lévő eltávolítás" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Telepítés" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Eltávolítás" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Letöltés" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Telepítés" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Eltávolítás…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Hálózat" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Kommunikálhat a hálózaton keresztül" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Rendszerszolgáltatások" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Hozzáférhet a D-Bus szolgáltatásokhoz a rendszerbuszon" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Munkamenet-szolgáltatások" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Hozzáférhet a D-Bus szolgáltatásokhoz a munkamenetbuszon" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Eszközök" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Hozzáférhet tetszőleges eszközökhöz, például webkamerákhoz" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Hozzáférhet a beviteli eszközökhöz" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +#| msgid "Can access microphones" +msgid "Can access microphones and play audio" +msgstr "Hozzáférhet a mikrofonokhoz és hangot játszhat le" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Hozzáférhet a rendszereszköz fájljaihoz" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Képernyőtartalom" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Hozzáférhet a képernyő tartalmához" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Saját mappa" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Megtekinthet, szerkeszthet és létrehozhat fájlokat" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Megtekinthet fájlokat" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Fájlrendszer" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Letöltések mappa" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Beállítások" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Megtekinthet és megváltoztathat bármilyen beállítást" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Örökölt megjelenítési rendszer" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Egy régi, nem biztonságos megjelenítési rendszert használ" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Biztonságos környezet elhagyása" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" +"Elhagyhatja a biztonságos környezetet és megkerülhet bármilyen korlátozást" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Nem áll rendelkezésre frissítési leírás." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "A frissítés részletei" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "További jogosultságokat igényel" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Érvénytelen értékelési adatok érkeztek a kiszolgálóról" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Nem sikerült kommunikálni az értékelő kiszolgálóval" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Vélemények" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Nem találhatók vélemények ehhez az alkalmazáshoz." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Nincsenek vélemények" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Verziótörténet" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Újdonság a(z) %s verzióban" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "%s verzió" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Nincsenek részletek ehhez a kiadáshoz" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%Y. %B %-e." + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Indítási mód: az „updates” (frissítések), „updated” (frissítve), „installed” " +"(telepített) vagy „overview” (áttekintés) egyike" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MÓD" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Alkalmazások keresése" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "KERESÉS" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Alkalmazásadatok megjelenítése (alkalmazásazonosító használata)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "AZONOSÍTÓ" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Alkalmazásadatok megjelenítése (csomagnév használata)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "CSOMAGNÉV" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Alkalmazás telepítése (alkalmazásazonosító használata)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Az alkalmazás eltávolítása (alkalmazásazonosító használata)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Egy helyi csomagfájl megnyitása" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FÁJLNÉV" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"A művelettől várt interakció típusa: a „none” (nincs), „notify” (értesítés) " +"vagy „full” (teljes) egyike" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKCIÓ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Helyi metainfo vagy appdata fájl megjelenítése" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Részletes hibakeresési kimenet engedélyezése (a futó példányból, ha már fut)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Telepíti az összes függőben lévő frissítést a háttérben" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Beállítások megjelenítése" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Kilépés a futó példányból" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Helyi fájlforrások előnyben részesítése az alkalmazáshoz" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Verziószám megjelenítése" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 A GNOME Szoftver közreműködői" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Kelemen Gábor \n" +"Úr Balázs \n" +"Meskó Balázs " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Elnézést, nincsenek részletek ahhoz az alkalmazáshoz." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Telepített méret" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "%s adatot és %s gyorsítótárat tartalmaz" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "%s adatot tartalmaz" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "%s gyorsítótárat tartalmaz" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "A gyorsítótár- és adathasználat ismeretlen" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Letöltési méret" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Nem igényel további rendszerszintű letöltéseket" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Ismeretlen mennyiségű további rendszerszintű letöltéseket igényel" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "További %s rendszerszintű letöltéseket igényel" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "A méret ismeretlen" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Nincsenek jogosultságok" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Hálózati eléréssel rendelkezik" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Rendszerszolgáltatásokat használ" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Munkamenet-szolgáltatásokat használ" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Hardverszereszközökhöz férhet hozzá" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Hozzáférhet a rendszereszközhöz" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Olvashatja/írhatja az összes adatát" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Olvashatja az összes adatát" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Olvashatja/írhatja a letöltéseit" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Olvashatja a letöltéseit" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Hozzáférhet néhány speciális fájlhoz" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Megtekintheti és módosíthatja a felhasználói beállításokat" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Örökölt ablakkezelő-rendszert használ" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Tetszőleges jogosultságokat szerezhet" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "A szoftverfejlesztő megerősített" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Az operációs rendszer terjesztője véleményezte" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Véleményezte: %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Harmadik fél által biztosított" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "A szoftver már nem támogatott" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Auditálható kód" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Ismeretlen licenc" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Tulajdonosi (zárt) kód" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Különleges licenc" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Kiváltságos" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Biztonságos" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Valószínűleg biztonságos" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potenciálisan nem biztonságos" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Nem biztonságos" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Csak mobilos" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Csak kis képernyőn működik" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Csak asztali" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Csak nagy képernyőn működik" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Képernyőméret-eltérés" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Nem támogatja a jelenlegi kijelzőméretét" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Érintőképernyőt igényel" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Billentyűzetet igényel" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Egeret igényel" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Játékvezérlő szükséges" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "A játékhoz játékvezérlő szükséges" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Alkalmazkodó" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Telefonon, táblagépen és asztali gépen is működik" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Valószínűleg billentyűzetet és egeret igényel" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Asztali és hordozható számítógépen működik" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Nem tartalmaz korhatáros tartalmat" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Nem áll rendelkezésre korhatár-besorolás" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Honlap felkeresése" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Telepítés…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Mégse" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Telepítés" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Letöltés" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Frissítés" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Eltávolítás…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Eltávolítás" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritikus frissítés" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Az eszköz nem használható frissítés közben." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Forrás: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Átnevezve erről: %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Nem kap több frissítést" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritikus frissítés" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Telepítve" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Segítsen a(z) %s fordításában" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"A(z) %s alkalmazást egy közreműködőkből álló nemzetközi közösség tervezi, " +"fejleszti és fordítja le.\n" +"\n" +"Ez azt jelenti, hogy nem biztos, hogy az Ön nyelvén is elérhető. Ön is " +"beszállhat, és besegíthet a fordításban." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Fordítások" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Fordítási weboldal" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Bejelentkezés szükséges távoli %s (tartomány: %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Bejelentkezés szükséges" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "Mé_gse" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Bejelentkezés" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +#| msgid "User" +msgid "_User" +msgstr "_Felhasználó" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +#| msgid "Password" +msgid "_Password" +msgstr "_Jelszó" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Egyéb" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Összes" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Kiemelt" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Szerkesztő választása" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Új és frissített" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Választások a webről" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Egyéb szoftverek" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s telepítve" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Újraindítás szükséges a változtatások érvénybe léptetéséhez" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Az alkalmazás használatra kész" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Rendszerfrissítések telepítve" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "A nemrég telepített frissítések megtekinthetőek" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Újraindítás" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Indítás" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Telepíti a szoftvert?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Telepíti a harmadik féltől származó szoftvereket?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Engedélyezi a szoftvertárolót?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Engedélyezi a harmadik féltől származó szoftvertárolót?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"A(z) %s nem szabad és nyílt forrású szoftver, és a következő " +"biztosítja: „%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "A(z) %s alkalmazást ez biztosítja: „%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Ezt a szoftvertárolót engedélyezni kell a telepítés folytatásához." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Néhány országban szabálytalan lehet a(z) %s alkalmazás telepítése vagy " +"használata." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Néhány országban szabálytalan lehet ezen kodek telepítése vagy használata." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Ne _figyelmeztessen többé" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Engedélyezés és _telepítés" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "A részletes hibaüzenetek a következők voltak a csomagkezelőtől:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Részletek" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Bezárás" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "A részletek a vágólapra másolva" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Elfogadás" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Egy frissítés lett telepítve" +msgstr[1] "Frissítések lettek telepítve" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Egy alkalmazás eltávolításra került" +msgstr[1] "Az alkalmazások eltávolításra kerültek" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Újraindítás szükséges az érvénybe léptetéséhez" +msgstr[1] "Újraindítás szükséges az érvénybe léptetésükhöz" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Most nem" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Ma" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Tegnap" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d nappal ezelőtt" +msgstr[1] "%d nappal ezelőtt" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d héttel ezelőtt" +msgstr[1] "%d héttel ezelőtt" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d hónappal ezelőtt" +msgstr[1] "%d hónappal ezelőtt" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d évvel ezelőtt" +msgstr[1] "%d évvel ezelőtt" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Épp most" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d perccel ezelőtt" +msgstr[1] "%d perccel ezelőtt" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d órával ezelőtt" +msgstr[1] "%d órával ezelőtt" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Összes" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Kiemelt" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D grafika" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fényképészet" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Lapolvasás" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorgrafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Megjelenítők" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Zeneszerkesztés" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Zenelejátszók" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Összes" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Kiemelt" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Naptár" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Adatbázis" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Pénzügyek" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Szövegszerkesztő" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Szövegszerkesztők" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Webböngészők" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Összes" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Kiemelt" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Akció" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Kaland" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Ügyességi" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Kockák" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Tábla" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kártya" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulátorok" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Gyerekjátékok" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logikai" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Szerepjátékok" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Stratégia" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Összes" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Kiemelt" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Csevegés" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Összes" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Kiemelt" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Mesterséges intelligencia" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Csillagászat" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kémia" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Nyelvek" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Hírolvasó" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Művészet" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Életrajz" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Képregény" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Kitalált" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Egészség" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Történelem" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Életstílus" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Összes" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Kiemelt" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Hibakeresők" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE-k" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodekek" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hardver illesztőprogramok" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Betűkészletek" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Beviteli források" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Nyelvi csomagok" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Honosítás" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Alkosson" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Dolgozzon" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Játsszon" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Társalogjon" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Tanuljon" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Fejlesszen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodekek" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Hardver-illesztőprogramok" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Betűkészletek" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Beviteli források" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Nyelvi csomagok" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Honosítás" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Egy alkalmazás" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "A(z) %s további fájlformátum támogatást kér." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "További MIME-típusok szükségesek" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "A(z) %s további betűkészleteket kér." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "További betűkészletek szükségesek" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "A(z) %s további multimédia kodekeket kér." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "További multimédia kodekek szükségesek" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "A(z) %s további nyomtató illesztőprogramokat kér." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "További nyomtató illesztőprogramok szükségesek" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "A(z) %s további csomagokat kér." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "További csomagok szükségesek" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Keresés a Szoftverben" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Több" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Kevesebb" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Eltávolítás…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Újraindítás szükséges a telepítés befejezéséhez" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Újraindítás szükséges az eltávolítás befejezéséhez" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Függőben lévő telepítés…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Függőben lévő frissítés…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Letöltés…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Előkészítés…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Eltávolítás…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "A(z) %s nincs telepítve, de még mindig rendelkezik adatokkal." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "Új_raindítás" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Engedélyezés…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Telepítés…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "A(z) %s amerikai angol nyelven fog megjelenni" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Ez az alkalmazás amerikai angol nyelven fog megjelenni" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Ez a szoftver amerikai angol nyelven fog megjelenni" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Segítsen a _fordításban" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Egyéb alkalmazások a következőtől: %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "%s fejlesztő bizonyította a(z) %s tulajdonjogát" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "A fejlesztő bizonyította a(z) %s tulajdonjogát" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Értékelés írásához internetelérés szükséges" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Ez az alkalmazás többé már nem kap frissítéseket, még biztonsági javításokat " +"sem" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Ezt az alkalmazást a disztribúciója már biztosítja, és nem szabad lecserélni." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Ez az alkalmazás nem biztosít hivatkozásokat a weboldalhoz, a kódtárolóhoz " +"vagy a hibakövetőhöz." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Ez a szoftver többé már nem kap frissítéseket, még biztonsági javításokat sem" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Ezt a szoftvert a disztribúciója már biztosítja, és nem szabad lecserélni." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Ez a szoftver nem biztosít hivatkozásokat a weboldalhoz, a kódtárolóhoz vagy " +"a hibakövetőhöz." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"A Szoftver nem tudta lekérni a(z) „%s” információit, és nem tudja " +"megjeleníteni ennek az alkalmazásnak a részleteit." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Érvénytelen véleményválasz érkezett a kiszolgálóról" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Nem sikerült a(z) „%s” véleményét: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Részletek oldal" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Alkalmazás részleteinek betöltése" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Ellenőrzött" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Megnyitás" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Frissítés" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Eltávolítás" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Kiegészítők" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Ez az alkalmazás csak akkor használható, ha van aktív internet-kapcsolat." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Szoftvertárolót tartalmaz" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Ez az alkalmazás szoftvertárolót tartalmaz, amely frissítéseket és más " +"szoftverekhez való hozzáférést biztosít." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Nem tartalmaz szoftvertárolót" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Ez az alkalmazás nem tartalmaz szoftvertárolót. Nem lesz új verziókkal " +"frissítve." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Szoftvertároló azonosítva" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Ezen szoftvertároló hozzáadása hozzáférést biztosít további szoftverekhez és " +"frissítésekhez." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Csak olyan szoftvertárolókat használjon, amelyekben megbízik." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Alkalmazásadatok törlése" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Adatok _törlése" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Nincsenek metaadatok" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Projekt _webhelye" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Adományozás" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Közreműködés a _fordításban" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Hiba jelentése" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Súgó" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kapcsolatfelvétel" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Vélemény írása" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Összes vélemény" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Nem lehet megjeleníteni az alkalmazás részleteit" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Nem sikerült előkészíteni az újraindítást" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Ismeretlen hiba" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "A kulcs nem található" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "A kulcs nincs bejegyezve" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK-bejegyzés szükséges" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Következő" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Ezen az eszközön engedélyezve van a biztonságos rendszerindítás. Az új " +"illesztőprogramok engedélyezésének lehetővé tételéhez új géptulajdonosi " +"kulcsot (MOK) kell bejegyezni. A folyamathoz egy jelszó megadása szükséges a " +"folyamat későbbi szakaszában. Jegyezze fel a kulcshoz hozzárendelt következő " +"jelszót:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Feljegyeztem a MOK _jelszavát" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "Új_raindítás és bejegyzés…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Beállítási utasítások: olvassa el figyelmesen" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Az újraindítás után megjelenik a készülék beállítási képernyője. Az új " +"illesztőprogramok engedélyezéséhez kövesse a beállítási lépéseket:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Válassza a „MOK bejegyzése” lehetőséget\n" +"• Válassza az „Igen” lehetőséget a kulcsok bejegyzéséhez\n" +"• Adja meg a MOK jelszavát, ha kérik\n" +"• Majd válassza az „Újraindítás” lehetőséget" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Biztonsági következtetések" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"A sikeres kulcsbejegyzés után vegye figyelembe, hogy a modul vagy bármely " +"más modul bármely jövőbeli frissítése implicit módon megbízható lesz. Az " +"összes jövőbeli frissítés átlátható módon, interakció és vagy felhatalmazás " +"nélkül fog történni." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"További útmutatás található a dokumentációs oldalon." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Extra metaadatfájlok letöltése…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " és " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Elérhető betűkészletek a(z) %s írásrendszerhez" +msgstr[1] "Elérhető betűkészletek a(z) %s írásrendszerekhez" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Elérhető szoftverek ehhez: %s" +msgstr[1] "Elérhető szoftverek ehhez: %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "A kért szoftver nem található" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "A kért szoftver keresése sikertelen" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "„%s” nem található" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "ezen a weblapon" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Nem érhetők el alkalmazások, amelyek ezt a fájlt szolgáltatják: %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Információk a(z) %s kodekről, valamint a hiányzó alkalmazások beszerzésének " +"lehetőségei %s találhatók." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Nem érhetők el alkalmazások a következő támogatásához: %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s nem érhető el." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Információk a(z) %s kodekről, valamint a formátumot támogató alkalmazások " +"beszerzésének lehetőségei %s találhatók." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" +"Nem érhetők el betűkészletek a következő írásrendszer támogatásához: %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Információk a(z) %s kodekről, valamint további betűkészletek beszerzésének " +"lehetőségei %s találhatók." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Nem érhetők el kiegészítő kodekek ehhez a formátumhoz: %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Információk a(z) %s kodekről, valamint a formátumot lejátszani képes kodek " +"beszerzésének lehetőségei %s találhatók." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Nem érhetők el Plasma erőforrások a következő támogatásához: %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Információk a(z) %s kodekről, valamint további Plasma erőforrások " +"beszerzésének lehetőségei %s találhatók." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Nem érhetők el nyomtató illesztőprogramok ehhez: %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Információk a(z) %s kodekről, valamint a nyomtatót támogató illesztőprogram " +"beszerzésének lehetőségei %s találhatók." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "a dokumentációt" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Nem található a(z) %2$s által kért %1$s kodek. További információkért nézze " +"meg %3$s." +msgstr[1] "" +"Nem található a(z) %2$s által kért %1$s kodek. További információkért nézze " +"meg %3$s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Nem található a keresett %s kodek. További információkért nézze meg %s." +msgstr[1] "" +"Nem található a keresett %s kodek. További információkért nézze meg %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Semmilyen keresési találatokat sem sikerült találni: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s fájlformátum" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Összes _telepítése" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Nem találhatók a kért szoftverek" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kodekek oldal" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Nincsenek találatok" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Nem végezhető el a keresés" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Előző" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Következő" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Kiemelt alkalmazások listája" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Asztali támogatás" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Támogatja a nagy képernyőn történő használatot" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Asztali támogatás ismeretlen" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Nincs elég információ arról, hogy a nagy képernyők támogatottak-e" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Nagy képernyő szükséges" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Az asztali számítógépek nem támogatottak" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Nem használható nagy képernyőn" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobilos támogatás" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Támogatja a kis képernyőn történő használatot" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobilos támogatás ismeretlen" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Nincs elég információ arról, hogy a kis képernyők támogatottak-e" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Kis képernyő szükséges" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "A mobilok nem támogatottak" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Nem használható kis képernyőn" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Billentyűzettámogatás" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Billentyűzettámogatás ismeretlen" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Nincs elég információ arról, hogy a billentyűzetek támogatottak-e" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Billentyűzet szükséges" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Támogatja a billentyűzeteket" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "A billentyűzet nem támogatott" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Nem használható billentyűzettel" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Egértámogatás" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Egér vagy mutatóeszköz szükséges" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Egértámogatás ismeretlen" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Nincs elég információ arról, hogy az egerek vagy mutatóeszközök támogatottak-" +"e" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Egér szükséges" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Támogatja az egereket és mutatóeszközöket" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Az egerek nem támogattok" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Nem használható egérrel vagy mutatóeszközzel" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Érintőképernyő-támogatás" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Érintőképernyő-támogatás ismeretlen" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Nincs elég információ arról, hogy az érintőképernyők támogatottak-e" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Érintőképernyő szükséges" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Támogatja az érintőképernyőket" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Az érintőképernyők nem támogatottak" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Nem használható érintőképernyővel" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Játékvezérlő szükséges" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Játékvezérlő szükséges" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Játékvezérlő-támogatás" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Támogatja a játékvezérlőket" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "A(z) %s valószínűleg működik ezen az eszközön" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "A(z) %s működik ezen az eszközön" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "A(z) %s valószínűleg működik ezen az eszközön" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "A(z) %s nem fog megfelelően működni ezen az eszközön" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "A(z) %s nem fog működni ezen az eszközön" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Hardvertámogatás" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigáció" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navigálás a felfedezés oldalra" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navigálás a telepítettek oldalra" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navigálás a frissítések oldalra" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Keresési sáv megnyitása" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Ablakok" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Beállítások megnyitása" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Szoftvertárolók megnyitása" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Súgó" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Gyorsbillentyűk megnyitása" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Telepítve" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Telepítettek oldal" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Folyamatban" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Alkalmazások" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Webalkalmazások" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Rendszeralkalmazások" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Közösségileg készítve" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Csatlakozzon" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ezt az alkalmazást egy nemzetközi közösség fejleszti nyilvánosan, és a(z) %s licenc alatt adja közre.\n" +"\n" +"Részt vehet, és segíthet még jobbá tenni." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ezt az alkalmazást egy nemzetközi közösség fejleszti nyilvánosan, és a(z) %s " +"licenc alatt adja közre.\n" +"\n" +"Részt vehet, és segíthet még jobbá tenni." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ezt a szoftvert egy nemzetközi közösség fejleszti nyilvánosan, és a(z) %s licenc alatt adja közre.\n" +"\n" +"Részt vehet, és segíthet még jobbá tenni." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ezt a szoftvert egy nemzetközi közösség fejleszti nyilvánosan, és a(z) %s " +"licenc alatt adja közre.\n" +"\n" +"Részt vehet, és segíthet még jobbá tenni." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Ismeretlen licenc" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Tudjon meg többet" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ez az alkalmazás nem adja meg, hogy milyen licenc alatt fejlesztik, akár " +"tulajdonosi is lehet. Lehet, hogy nem biztonságos és ez nehezen deríthető " +"ki, valamint felügyelet nélkül változhat.\n" +"\n" +"Lehet, hogy közre tud működni ebben az alkalmazásban, de az is lehet, hogy " +"nem." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ez a szoftver nem adja meg, hogy milyen licenc alatt fejlesztik, akár " +"tulajdonosi is lehet. Lehet, hogy nem biztonságos és ez nehezen deríthető " +"ki, valamint felügyelet nélkül változhat.\n" +"\n" +"Lehet, hogy közre tud működni ebben a szoftverben, de az is lehet, hogy nem." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Tulajdonosi (zárt)" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Ezt az alkalmazást nem nyilvánosan fejlesztik, így csak a fejlesztői tudják, " +"hogyan is működik. Lehet, hogy nem biztonságos és ez nehezen deríthető ki, " +"valamint felügyelet nélkül változhat.\n" +"\n" +"Lehet, hogy nem tud közreműködni ebben az alkalmazásban." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Ezt a szoftvert nem nyilvánosan fejlesztik, így csak a fejlesztői tudják, " +"hogyan is működik. Lehet, hogy nem biztonságos és ez nehezen deríthető ki, " +"valamint felügyelet nélkül változhat.\n" +"\n" +"Lehet, hogy nem tud közreműködni ebben a szoftverben." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Különleges licenc" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ezt az alkalmazást egy különleges, %s licenc alatt " +"fejlesztik.\n" +"\n" +"Lehet, hogy közre tud működni ebben az alkalmazásban, de az is lehet, hogy " +"nem." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ezt az alkalmazást egy különleges, „%s” licenc alatt fejlesztik.\n" +"\n" +"Lehet, hogy közre tud működni ebben az alkalmazásban, de az is lehet, hogy " +"nem." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ezt az szoftvert egy különleges, %s licenc alatt " +"fejlesztik.\n" +"\n" +"Lehet, hogy közre tud működni ebben a szoftverben, de az is lehet, hogy nem." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ezt az szoftvert egy különleges, „%s” licenc alatt fejlesztik.\n" +"\n" +"Lehet, hogy közre tud működni ebben a szoftverben, de az is lehet, hogy nem." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Adatok frissítése" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Betöltési oldal" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Indítás" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Ismeretlen forrás" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Béta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Felhasználó" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Telepítendők" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Eltávolítandók" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Frissítések" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Visszafejlesztendők" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "kiválasztott külső források" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Hozzáférést biztosít további, innen származó szoftverekhez: %s. Tulajdonosi " +"(zárt) szoftvereket is tartalmazhat.\n" +"\n" +"Ezeket a tárolókat később a szoftvertárolók beállításaiban engedélyezheti." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Engedélyezi a harmadik féltől származó szoftvertárolókat?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Mellőzés" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Engedélyezés" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Elérhető az Ön operációs rendszeréhez" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Elérhető ehhez: %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Felfedezés" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Áttekintés oldal" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Elérhető alkalmazások" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Egyéb kategóriák" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nem találhatók alkalmazásadatok" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Ismeretlen" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "A felhasználó elutasította a telepítést" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s előkészítése" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Biztosan el szeretné távolítani a(z) %s tárolót?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Az összes alkalmazás el lesz távolítva a(z) %s tárolóból, és újra kell majd " +"telepítenie a tárolót, hogy ismét használhassa." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Eltávolítja ezt: %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Nem lesz lehetséges a(z) %s használata az eltávolítás után." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Nem lesz lehetséges olyan alkalmazások használata, amelyek a(z) %s " +"futtatókörnyezettől függenek az eltávolítás után." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Nem lesz lehetséges a(z) %s használata az eltávolítás után, és minden " +"dokumentum, amely ezt használja, más betűtípussal jelenik meg." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Nem lesz lehetséges a(z) %s használata az eltávolítás után. Ez azt " +"jelentheti, hogy néhány médiafájl többé nem lesz lejátszható." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"A(z) %s belső vezérlőprogramtól függő hardverek esetleg nem működnek többé " +"megfelelően az eltávolítás után." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Nem lesz lehetséges a(z) %s használata az eltávolítás után. Az alkalmazás " +"adatai és beállításai megmaradnak a lemezen, hogy lehetővé tegye az " +"alkalmazás jövőbeni helyreállítását." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Beállítások" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Szoftverfrissítések" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "További információk" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"A frissítések keresése és letöltése adatforgalmat és energiát használ. Az " +"automatikus frissítési funkciók ezért szüneteltetve vannak, ha " +"forgalomkorlátos hálózaton van, illetve ha az energiatakarékos üzemmód be " +"van kapcsolva." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatikus" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Frissítések automatikus keresése és letöltése" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Kézi" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "A frissítések keresését és letöltését kézzel kell elvégezni" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Automatikus frissítés é_rtesítései" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Értesítés, ha a frissítések automatikusan telepítve lettek" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Tartalomszűrők" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Csak _szabad szoftverek megjelenítése" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Tulajdonosi szoftverek elrejtése böngészéskor és kereséskor" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Csak _ellenőrzött fejlesztők megjelenítése" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Csak olyan fejlesztőktől származó alkalmazások megjelenítése, akik " +"személyazonossága ellenőrizve lett" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"A telepített szoftver nem összeférhető ezzel: %s. Automatikusan el lesz " +"távolítva a rendszerfrissítés során." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Összeférhetetlen szoftverek" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Frissítés" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Eltávolítás" + +#: src/gs-remove-app-dialog.ui:19 +#| msgid "App Settings & Data" +msgid "App Settings & Data" +msgstr "Alkalmazás beállításai és adatai" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Megtartás" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "" +"Lehetővé teszi az alkalmazás beállításainak és tartalmának helyreállítását" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Törlés" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Véglegesen törli az adatokat a lemezterület megtakarítása érdekében" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"A(z) „%s” helyről telepített szoftverek nem fognak további frissítéseket " +"kapni." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Letiltja a tárolót?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Eltávolítja a tárolót?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Letiltás" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Eltávolítás" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Új tárolók engedélyezése" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Új tárolók bekapcsolása a hozzáadásuk után" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "további információk" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "További tárolók a kiválasztott harmadik felektől – %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Harmadik féltől származó Fedora tárolók" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "az operációs rendszer" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Ezek a tárolók kiegészítik a(z) %s által biztosított alapértelmezett " +"szoftvereket." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Szoftvertárolók" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Nincsenek tárolók" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u alkalmazás telepítve" +msgstr[1] "%u alkalmazás telepítve" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u kiegészítő telepítve" +msgstr[1] "%u kiegészítő telepítve" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u alkalmazás" +msgstr[1] "%u alkalmazás" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u kiegészítő" +msgstr[1] "%u kiegészítő" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s és %s telepítve" +msgstr[1] "%s és %s telepítve" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Telepített szoftverek ellenőrzése…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Eltávolítás" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Utálom" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Nem kedvelem" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Rendben van" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Kedvelem" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Imádom" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Válasszon csillagot az értékeléshez" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Töltsön több időt véleménye megírásával" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Válasszon egy csillagos értékelést" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Az összegzés túl rövid" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Az összegzés túl hosszú" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "A leírás túl rövid" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "A leírás túl hosszú" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Vélemény írása" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Küldés" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Adjon meg értékelést, összefoglalót és véleményszöveget. A vélemények nem " +"használhatók problémák bejelentésére: ehelyett vegye fel a kapcsolatot a " +"fejlesztővel vagy a támogató szolgáltatóval." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Vélemény összegzése" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Rövid vélemény írása" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Keresse meg az adatvédelmi " +"irányelveinkben, hogy mely adatok lettek elküldve. A fiókjához csatolt " +"teljes név nyilvánosan megjelenítésre kerül." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u értékelés összesen" +msgstr[1] "%u értékelés összesen" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "az 5 csillagból" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Ismeretlen" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Bejelentheti a zaklató, nyers vagy diszkriminatív szöveget tartalmazó " +"véleményeket." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"A bejelentés után a vélemény elrejtésre kerül, amíg egy adminisztrátor nem " +"ellenőrzi." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Jelenti a véleményt?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Jelentés" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Eltávolítja a véleményt?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Egy vélemény eltávolítása nem vonható vissza." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Vélemény kedvelése" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Vélemény nem kedvelése" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Jelentés…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Eltávolítás…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Az alkalmazás nem biztonságos környezetben fut, de a disztribúció " +"ellenőrizte, hogy nem rosszindulatú" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Ellenőrizze, hogy megbízik-e a gyártóban, mivel az alkalmazás nem " +"biztonságos környezetben fut" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Nincsenek jogosultságok" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Az alkalmazás kizárólag biztonságos környezetben fut" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Hálózati hozzáférés" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Hozzáférhet az internethez" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Nincs hálózati hozzáférés" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Nem férhet hozzá az internethez" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Rendszerszolgáltatásokat használ" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Adatokat kérhet rendszerszolgáltatásoktól" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Munkamenet-szolgáltatásokat használ" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Adatokat kérhet munkamenet-szolgáltatásoktól" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Felhasználói eszközhöz való hozzáférés" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Hozzáférhet olyan eszközökhöz, mint a webkamerák vagy a játékvezérlők" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Nincs felhasználói eszközhöz való hozzáférés" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Nem férhet hozzá olyan eszközökhöz, mint a webkamerák vagy a játékvezérlők" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Beviteli eszközhöz való hozzáférés" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +#| msgid "Microphone Access" +msgid "Microphone Access and Audio Playback" +msgstr "Mikrofonhoz való hozzáférés és hanglejátszás" + +#: src/gs-safety-context-dialog.c:235 +#| msgid "Can listen using microphones without asking permission" +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Jogosultságkérés nélkül hallgatózhat a mikrofonok használatával és hangot" +" játszhat le" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Rendszereszközhöz való hozzáférés" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Hozzáférhet a rendszereszközökhöz, ami emelt szintű jogosultságokat igényel" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Képernyőtartalomhoz való hozzáférés" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Hozzáférhet a képernyő vagy más ablakok tartalmához" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Örökölt ablakkezelő-rendszer" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Tetszőleges jogosultságok" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Felhasználói beállítások" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Teljes fájlrendszer olvasási/írási hozzáférése" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Olvashatja és írhatja az összes adatát a fájlrendszeren" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Saját mappa olvasási/írási hozzáférése" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Olvashatja és írhatja az összes adatát a saját könyvtárában" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Teljes fájlrendszer olvasási hozzáférése" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Olvashatja az összes adatát a fájlrendszeren" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Saját mappa olvasási hozzáférése" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Olvashatja az összes adatát a saját könyvtárában" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Letöltési mappa olvasási/írási hozzáférése" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Olvashatja és írhatja az összes adatát a letöltési könyvtárában" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Letöltési mappa olvasási hozzáférése" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Olvashatja az összes adatát a letöltési könyvtárában" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Olvashatja és írhatja az összes adatot a könyvtárban" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Olvashatja az összes adatot a könyvtárban" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Nincs fájlrendszer-hozzáférés" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Egyáltalán nem érheti el a fájlrendszert" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Az alkalmazásfejlesztő megerősített" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Az alkalmazás fejlesztője megerősítésre került: az, akinek mondja magát" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Nem biztonságos függőségek" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"A szoftver vagy függőségei már nem támogatottak, és lehet, hogy nem " +"biztonságosak" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Ez az alkalmazás nem adja meg, hogy milyen licenc alatt fejlesztik, akár " +"tulajdonosi is lehet" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Ez a szoftver nem adja meg, hogy milyen licenc alatt fejlesztik, akár " +"tulajdonosi is lehet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Tulajdonosi (zárt) kód" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"A forráskód nem nyilvános, így nem lehet függetlenül auditálni, és lehet, " +"hogy nem biztonságos" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Ezt az alkalmazást egy különleges, „%s” licenc alatt fejlesztik" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Ezt a szoftvert egy különleges, „%s” licenc alatt fejlesztik" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Auditálható kód" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"A forráskód nyilvános, és függetlenül auditálható, emiatt az alkalmazás " +"valószínűbb, hogy biztonságos" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "A(z) %s kiváltságos" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "A(z) %s biztonságos" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "A(z) %s valószínűleg biztonságos" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "A(z) %s potenciálisan nem biztonságos" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "A(z) %s nem biztonságos" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Ismeretlen" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Biztonság" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licenc" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Forrás" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Ez az alkalmazás a szoftverplatform (SDK) elavult verzióját használja, és " +"olyan hibákat vagy biztonsági sérülékenységeket tartalmazhat, amelyek nem " +"lesznek javítva." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Előző képernyőkép" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Következő képernyőkép" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Nincsenek képernyőképek" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Nem található képernyőkép" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "A kép betöltése meghiúsult" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "A képernyőkép mérete nem található" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Nem lehet létrehozni a gyorsítótárat" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "A képernyőkép nem érvényes" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "A képernyőkép nem érhető el" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Képernyőkép" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u további találat" +msgstr[1] "%u további találat" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Keresés az oldalon" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Alkalmazások keresése" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Nem található alkalmazás" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "„%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Nem tölthetők le a frissítések" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Nem tölthetők le a belső vezérlőprogram frissítései" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nem tölthetők le a belső vezérlőprogram frissítései innen: %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nem tölthetők le a frissítések innen: %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Nem lehet frissíteni: internetelérés szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Nem lehet frissíteni: nincs elég lemezterület" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Nem tölthetők le a frissítések innen: %s, nincs elég lemezterület" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Nem lehet frissíteni: hitelesítés szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Nem lehet frissíteni: érvénytelen hitelesítés" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Nem lehet frissíteni: jogosultság szükséges" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Nem tölthetők le a frissítések: nincs jogosultsága szoftvereket telepíteni" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "A frissítések listája nem kérhető le" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Nem lehet telepíteni: a letöltés sikertelen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "A(z) %s nem telepíthető: nem sikerült letölteni innen: %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "A(z) %s nem telepíthető: a letöltés sikertelen" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Nem lehet telepíteni: hiányzó futtatókörnyezet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "A(z) %s nem telepíthető: a(z) %s futtatókörnyezet nem érhető el" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "A(z) %s nem telepíthető" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Nem lehet telepíteni: internetelérés szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Nem lehet telepíteni: érvénytelen alkalmazásformátum" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Nem lehet telepíteni: nincs elég lemezterület" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "A(z) %s nem telepíthető: nincs elég lemezterület" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Nem lehet telepíteni: hitelesítés szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "A(z) %s nem telepíthető: hitelesítés szükséges" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Nem lehet telepíteni: érvénytelen hitelesítés" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "A(z) %s nem telepíthető: érvénytelen hitelesítés" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Nem lehet telepíteni: jogosultság szükséges" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "A(z) %s nem telepíthető: jogosultság szükséges" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Nem lehet telepíteni: az eszközt áramforráshoz kell csatlakoztatni" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "A(z) %s nem telepíthető: az eszközt áramforráshoz kell csatlakoztatni" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Nem lehet telepíteni: alacsony telepfeszültség" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "A(z) %s nem telepíthető: alacsony telepfeszültség" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "A(z) %s nem frissíthető innen: %s, a letöltés sikertelen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "A(z) %s nem frissíthető: a letöltés sikertelen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Nem lehet telepíteni a frissítéseket innen: %s, a letöltés sikertelen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Nem lehet frissíteni: a letöltés sikertelen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "A(z) %s nem frissíthető: nincs elég lemezterület" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "A(z) %s nem frissíthető: hitelesítés szükséges" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "A(z) %s nem frissíthető: érvénytelen hitelesítés" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "A(z) %s nem frissíthető: jogosultság szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Nem lehet frissíteni: az eszközt áramforráshoz kell csatlakoztatni" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "A(z) %s nem frissíthető: az eszközt áramforráshoz kell csatlakoztatni" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Nem lehet frissíteni: alacsony telepfeszültség" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "A(z) %s nem frissíthető: alacsony telepfeszültség" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "A(z) %s nem frissíthető" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Nem lehet frissíteni" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Nem lehet frissíteni" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Nem lehet frissíteni erre: %s, erről: %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Nem lehet frissíteni: a letöltés sikertelen" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Nem lehet frissíteni erre: %s, a letöltés sikertelen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Nem lehet frissíteni: internetelérés szükséges" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Nem lehet frissíteni erre: %s, internetelérés szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Nem lehet frissíteni: nincs elég lemezterület" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Nem lehet frissíteni erre: %s, nincs elég lemezterület" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Nem lehet frissíteni: hitelesítés szükséges" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Nem lehet frissíteni erre: %s, hitelesítés szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Nem lehet frissíteni: érvénytelen hitelesítés" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Nem lehet frissíteni erre: %s, érvénytelen hitelesítés" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Nem lehet frissíteni: jogosultság szükséges" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Nem lehet frissíteni erre: %s, jogosultság szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Nem lehet frissíteni: az eszközt áramforráshoz kell csatlakoztatni" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Nem lehet frissíteni erre: %s, az eszközt áramforráshoz kell csatlakoztatni" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Nem lehet frissíteni: alacsony telepfeszültség" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Nem lehet frissíteni erre: %s, alacsony telepfeszültség" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nem lehet frissíteni erre: %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Nem lehet eltávolítani: hitelesítés szükséges" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "A(z) %s nem távolítható el: hitelesítés szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Nem lehet eltávolítani: érvénytelen hitelesítés" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "A(z) %s nem távolítható el: érvénytelen hitelesítés" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Nem lehet eltávolítani: jogosultság szükséges" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "A(z) %s nem távolítható el: jogosultság szükséges" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Nem lehet eltávolítani: az eszközt áramforráshoz kell csatlakoztatni" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "" +"A(z) %s nem távolítható el: az eszközt áramforráshoz kell csatlakoztatni" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Nem lehet eltávolítani: alacsony telepfeszültség" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "A(z) %s nem távolítható el: alacsony telepfeszültség" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "A(z) %s nem távolítható el" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "A(z) %s nem indítható el" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Elnézést, hiba történt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "A(z) %s nem indítható el: a(z) %s nincs telepítve" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Nincs elég lemezterület a művelethez" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Nem lehet telepíteni: a fájltípus nem támogatott" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Nem lehet telepíteni: a hitelesítés sikertelen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Nem lehet telepíteni" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Nem vehető fel a kapcsolat ezzel: %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Indítsa újra a Szoftver alkalmazást az új bővítmények használatához" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "A eszközt áramforráshoz kell csatlakoztatni" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Az akkumulátorszint túl alacsony" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "S_zoftvertárolók" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Beállítások" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Gyorsbillentyűk" + +#: src/gs-shell.ui:23 +#| msgid "About Software" +msgid "_About Software" +msgstr "A Szoftver _névjegye" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Keresés" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Főmenü" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Alkalmazások keresése" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Felfedezés" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Telepítve" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Frissítések" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Vissza" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Egyik sem" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Alkalmazásadatok" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Az alkalmazás futásához szükséges adatok" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Felhasználói adatok" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Az Ön által létrehozott adatok az alkalmazásban" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Gyorsítótáradatok" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Átmenetileg gyorsítótárazott adatok" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Az alkalmazás maga" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Szükséges függőségek" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Az alkalmazáshoz szükséges megosztott rendszerösszetevők" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Ismeretlen" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"A gyorsítótárazott adatok törölhetők az _alkalmazásbeállításokban" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Tárhely" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (telepítve)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (telepítés)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (letöltés)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (eltávolítás)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Részletek" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Vizsgálat" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Telepítve ekkor: %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Telepített frissítések" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Nem lett frissítés telepítve" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "A frissítések elavultak" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Ellenőrizze az elérhető frissítéseket" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Kritikus frissítések állnak telepítésre készen" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Kritikus frissítések telepítése, amint lehetséges" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Kritikus frissítések érhetők el letöltésre" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Kritikus frissítések letöltése, amint lehetséges" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Frissítések állnak telepítésre készen" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Szoftverfrissítések állnak készen és várakoznak" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Frissítések érhetők el letöltésre" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Szoftverfrissítések tölthetők le" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u alkalmazás frissítve — újraindítás szükséges" +msgstr[1] "%u alkalmazás frissítve — újraindítás szükséges" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u alkalmazás frissítve" +msgstr[1] "%u alkalmazás frissítve" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "A(z) %s frissítve lett." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Indítsa újra az alkalmazást." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "A(z) %s és a(z) %s frissítve lett." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u alkalmazás újraindítást igényel." +msgstr[1] "%u alkalmazás újraindítást igényel." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Tartalmazza a következőket: %s, %s és %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "A rendszer elérte az életciklusa végét" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Frissítsen, hogy továbbra is kapjon frissítéseket" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "A(z) %s egy új verziója érhető el telepítésre" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Disztribúciófrissítés érhető el" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "A szoftverfrissítések meghiúsultak" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Az előkészített frissítések nem lettek telepítve" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Részletek megjelenítése" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Rendszerfrissítés kész" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Üdvözli a(z) %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Szoftverfrissítés telepítve" +msgstr[1] "Szoftverfrissítések telepítve" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Fontos operációs rendszer frissítés lett telepítve." +msgstr[1] "Fontos operációs rendszer frissítések lettek telepítve." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Vélemény" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "A frissítés meghiúsult" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "A rendszer már naprakész volt." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "A frissítés megszakítva." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Internet-hozzáférés volt szükséges, de nem volt elérhető. Győződjön meg " +"arról, hogy van internet-hozzáférése, és próbálja újra." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Biztonsági problémák voltak a frissítéssel. Kérjen tanácsot a " +"szoftverszolgáltatójától a további részletekért." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Nem volt elég lemezterület. Szabadítson fel egy kis helyet, és próbálja újra." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Sajnáljuk: a frissítés telepítése nem sikerült. Várjon egy másik frissítést, " +"és próbálja újra. Ha a probléma továbbra is fennáll, akkor lépjen " +"kapcsolatba a szoftverszolgáltatójával." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Utolsó ellenőrzés: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Leállítás" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Frissítések keresése" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "A(z) %s %s nem kap több kritikus szoftverfrissítést" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Az operációs rendszere nem kap több kritikus szoftverfrissítést" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Költségek merülhetnek fel" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Frissítések keresése mobil széles sáv használatakor költségek " +"kiszámlázásához vezethet." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Keresés _mindenképp" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Szoftverfrissítések letöltve" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "A frissítések készen állnak a telepítésre" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Frissítések keresése" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Frissítések" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Frissítések oldal" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Frissítések betöltése" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Ez eltarthat egy ideig" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Naprakész" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Mobil adatkapcsolat használata?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"A mobil széles sávú kapcsolaton történő frissítés-keresés költségek " +"felmerüléséhez vezethet" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Keresés mindenképp" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Nincs kapcsolat" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Csatlakozzon az internetre a frissítések kereséséhez" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Hálózati beállítások" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Hiba" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "A frissítések automatikusan kezelve vannak" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "A szoftverfrissítések szüneteltetve vannak" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Az automatikus szoftverfrissítések szüneteltetve lettek a következő okok " +"miatt:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• A jelenlegi hálózati kapcsolat forgalomkorlátos" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• A jelenlegi hálózati kapcsolat nem engedi a nagy letöltéseket" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Az energiatakarékos üzemmód aktív" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• A játékmód aktív" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "A szoftverfrissítések szüneteltetve vannak" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"A hálózati kapcsolat forgalomkorlátos – a szoftverfrissítések szüneteltetve " +"vannak" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"A hálózati kapcsolat nem engedi a nagy letöltéseket – a szoftverfrissítések " +"szüneteltetve vannak" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"Az energiatakarékos üzemmód aktív – a szoftverfrissítések szüneteltetve " +"vannak" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "A játékmód aktív – a szoftverfrissítések szüneteltetve vannak" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "Új_raindítás és frissítés…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Összes _frissítése" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Szoftverfrissítések letöltve" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Frissítések állnak telepítésre készen" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Beépített belső vezérlőprogram" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Újraindítás szükséges" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Alkalmazásfrissítések" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Eszköz belső vezérlőprogramja" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Letöltés" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "A(z) %s %s már elérhető" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "A(z) %s már elérhető" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Tudjon meg többet az új verzióról" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s / %s letöltve" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% letöltve" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Jelentős frissítés, új funkciókkal és felületi újításokkal." + +#: src/gs-upgrade-banner.ui:153 +#| msgid "_Upgrade" +msgid "Cancel Upgrade" +msgstr "Frissítés megszakítása" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "Új_raindítás és frissítés…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Ne felejtsen el biztonsági másolatot készíteni az adatairól és fájljairól a " +"frissítés előtt." + +#: src/gs-utils-error-dialog-simple.ui:4 +#| msgid "Show Details" +msgid "Error Details" +msgstr "Hiba részletei" + +#: src/gs-utils-error-dialog-simple.ui:34 +#| msgid "Show Details" +msgid "Copy Details" +msgstr "Részletek másolása" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Nem sikerült törölni a(z) „%s” fájlt: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Nem sikerült törölni a(z) „%s” könyvtárat: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Szoftver hozzáadása, eltávolítása vagy frissítése ezen a számítógépen" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Frissítések;Frissítés;Források;Tárolók;Beállítások;Telepítés;Eltávolítás;" +"Program;Szoftver;Alkalmazás;Bolt;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "A(z) %s kész" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"A(z) %s készen áll az engedélyezéshez, és elő van készítve a következő " +"rendszerindításhoz." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Engedélyezés" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Rendszerfrissítések" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Általános rendszerfrissítések, például biztonsági vagy hibajavítások, " +"valamint teljesítménybeli fejlesztések." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Egy %s-frissítés új funkciókkal és javításokkal." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Az EOS frissítési szolgáltatás nem tudta letölteni és alkalmazni a " +"frissítést." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Webalkalmazás" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Webalkalmazások támogatása" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Népszerű webalkalmazások futtatása egy böngészőben" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Frissítés a legújabb funkciókért, teljesítmény és stabilitási javításokért." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak támogatás" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "A Flatpak egy keretrendszer a Linuxon futó asztali alkalmazásokhoz" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "%s rendszermappa" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Saját mappa %s almappája" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Gazdarendszer mappái" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Gazdarendszer konfigurációja az /etc mappából" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Asztal mappa" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Asztal %s almappája" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Dokumentumok mappa" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Dokumentumok %s almappája" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Zenék mappa" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Zenék %s almappája" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Képek mappa" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Képek %s almappája" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Nyilvános megosztás mappa" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Nyilvános megosztás %s almappája" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Videók mappa" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videók %s almappája" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Sablonok mappa" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Sablonok %s almappája" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Felhasználói gyorsítótár mappa" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Felhasználói gyorsítótár %s almappája" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Felhasználói beállítás mappa" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Felhasználói beállítás %s almappája" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Felhasználói adatok mappa" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Felhasználói adatok %s almappája" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Felhasználói futtatókörnyezet mappa" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Felhasználói futtatókörnyezet %s almappája" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Fájlrendszer-hozzáférés a következőhöz: %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Flatpak metaadatok lekérése ehhez: %s…" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Nem sikerült finomítani a(z) „%s” bővítményt: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Felhasználói telepítés" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Rendszerszintű telepítés" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Alkalmazásazonosító" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Nem sikerült hozzáadni a telepítéshez a(z) „%s” bővítménynél: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Nem sikerült hozzáadni az eltávolításhoz a(z) „%s” bővítménynél: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"A(z) „%s” távoli tároló nem engedélyezi a(z) „%s” telepítését, valószínűleg " +"a szűrője miatt. Távolítsa el a szűrőt, és ismételje meg a telepítést. " +"Részletes hiba: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "A rendszer akkumulátorszintje túl alacsony a frissítés végrehajtásához" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"A rendszer akkumulátorszintje túl alacsony a frissítés végrehajtásához " +"(%u%%, de %u%% szükséges)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Az eszköz elérhetetlen vagy a vezeték nélküli hatótávolságon kívül van" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Az eszköz akkumulátorszintje túl alacsony" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Az eszköz akkumulátorszintje túl alacsony (%u%%, de %u%% szükséges)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Az eszköz a frissítés alkalmazására vár" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Az eszközhöz elektromos áram csatlakoztatása szükséges" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Az eszköz nem használható, amíg a fedél le van csukva" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s eszköz frissítése" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s rendszer frissítése" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s beágyazott vezérlő frissítése" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME frissítése" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s vállalati ME frissítése" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s fogyasztói ME frissítése" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s vezérlő frissítése" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt vezérlő frissítése" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU mikrokód frissítése" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s konfigurációs frissítése" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s akkumulátor frissítése" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s kamera frissítése" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM frissítése" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s érintőtábla frissítése" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s egér frissítése" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s billentyűzet frissítése" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s tárolóvezérlő frissítése" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s hálózati csatoló frissítése" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s kijelző frissítése" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s alaplapkezelő-vezérlő frissítése" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB-vevő frissítése" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s meghajtó frissítése" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s flashmeghajtó frissítése" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD frissítése" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU frissítése" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s dokkoló frissítése" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB-dokkoló frissítése" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Belső vezérlőprogram" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "A belső vezérlőprogram frissítését nem sikerült alkalmazni: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Belső vezérlőprogram frissítésének támogatása" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Támogatást biztosít a belső vezérlőprogram frissítéseihez" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Telepíti a nem aláírt szoftvert?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"A telepítendő szoftver nincs aláírva. Nem fogja tudni ellenőrizni a szoftver " +"frissítéseinek eredetét, vagy hogy nem manipulálták-e azokat." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Letölti a nem aláírt szoftvert?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Nem aláírt frissítések érhetők el. Az aláírás hiányában nem lehet " +"ellenőrizni a frissítés eredetét, vagy hogy nem manipulálták-e azt." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Frissíti a nem aláírt szoftvert?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Nem aláírt frissítések érhetők el. Az aláírás hiányában nem lehet " +"ellenőrizni a frissítés eredetét, vagy hogy nem manipulálták-e azt. A " +"szoftverfrissítések addig le lesznek tiltva, amíg a nem aláírt frissítések " +"eltávolításra vagy frissítésre nem kerülnek." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Nem sikerült telepíteni a frissítéseket: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Csomagok" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Nem sikerült várakozni a tranzakció végére a letöltés előtt: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Nem sikerült letölteni a frissítéseket: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Nem sikerült aktiválni a frissítést: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Operációs rendszer (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap tároló" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap támogatás" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "A snapek univerzális Linuxos csomagok" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +#| msgid "System Apps" +msgid "System" +msgstr "Rendszer" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +#| msgid "System Upgrade Complete" +msgid "System component" +msgstr "Rendszerösszetevő" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "" +"A(s) „%s” rendszerfrissítési feladat eltávolítása sikertelen %i állapottal" + diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..e9c418e --- /dev/null +++ b/po/id.po @@ -0,0 +1,6357 @@ +# Indonesian translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Andika Triwidada , 2013-2015, 2017, 2018, 2021-2025. +# Dirgita , 2015. +# Kukuh Syafaat , 2017-2024. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-10 21:07+0000\n" +"PO-Revision-Date: 2025-03-11 19:39+0700\n" +"Last-Translator: Andika Triwidada \n" +"Language-Team: Indonesian \n" +"Language: id\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/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Perangkat Lunak" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Pasang dan mutakhirkan aplikasi" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Perangkat Lunak memungkinkan Anda menemukan dan memasang aplikasi dan " +"ekstensi sistem baru dan menghapus aplikasi yang telah dipasang." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Perangkat Lunak memajang aplikasi-aplikasi populer dan pilihan dengan " +"deskripsi yang berguna dan beberapa cuplikan layar per aplikasi. Aplikasi " +"bisa ditemukan dengan meramban daftar kategori atau dengan mencari. Itu juga " +"memungkinkan Anda memutakhirkan sistem Anda memakai pemutakhiran luring." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panel ringkasan" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panel rincian" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panel terpasang" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel pemutakhiran" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Detail pemutakhiran" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Proyek GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Uji kunci akmods di Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Otentikasi diperlukan untuk menguji kunci akmods di Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Daftarkan kunci akmods ke Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Otentikasi diperlukan untuk mendaftarkan kunci akmods ke Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Uji kunci DKMS di Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Otentikasi diperlukan untuk menguji kunci DKMS di Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Mendaftarkan kunci DKMS ke Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Otentikasi diperlukan untuk mendaftarkan kunci DKMS ke Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Pasang berkas AppStream ke lokasi sistem" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Sedang memasang berkas AppStream ke lokasi sistem" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Daftar proyek yang kompatibel" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Ini adalah daftar proyek yang kompatible yang mesti kami tampilkan seperti " +"misalnya GNOME, KDE, dan XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Apakah mengelola pemutakhiran dan peningkatan dalam GNOME Perangkat Lunak" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Bila tak difungsikan, GNOME Perangkat Lunak akan menyembunyikan panel " +"pemutakhiran, tidak melalukan sebarang aksi pemutakhiran atau peningkatan " +"otomatis." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Unduh dan pasang pemutakhiran secara otomatis" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Bila diaktifkan, GNOME Perangkat Lunak secara otomatis mengunduh " +"pemutakhiran perangkat lunak di latar belakang dan memasang yang tidak " +"memerlukan nyala ulang." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"Beri tahu pengguna tentang pemutakhiran perangkat lunak di latar belakang" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Jika diaktifkan, GNOME Perangkat Lunak memberi tahu pengguna tentang " +"pemutakhiran yang terjadi saat pengguna dalam keadaan menganggur." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Apakah secara otomatis menyegarkan ketika memakai koneksi dengan kuota" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Bila difungsikan, GNOME Perangkat Lunak secara otomatis menyegarkan di latar " +"belakang bahkan ketika memakai koneksi dengan kuota (pada akhirnya mengunduh " +"beberapa metadata, memeriksa pemutakhiran, dsb., yang mungkin berakibat " +"biaya bagi pengguna)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Apakah ini pertama kalinya GNOME Perangkat Lunak dijalankan" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Tampilkan nilai bintang di sebelah aplikasi" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Menyaring aplikasi berdasarkan cabang baku yang diatur bagi remote" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Aplikasi bukan bebas menampilkan suatu dialog peringatan sebelum pemasangan" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Ketika aplikasi bukan-bebas dipasang, suatu dialog peringatan dapat " +"ditampilkan. Ini mengendalikan apakah dialog tersebut dimunculkan." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Stempel waktu pemeriksaan pemutakhiran terakhir" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Stempel waktu pemberitahuan peningkatan terakhir" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Stempel waktu pemberitahuan pemutakhiran terakhir" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Stempel waktu dari pemutakhiran keamanan pertama, dibersihkan setelah " +"pemutakhiran" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Stempel waktu pemutakhiran terakhir" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Umur dalam detik untuk verifikasi apakah cuplikan layar hulu masih valid" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Memilih nilai yang lebih besar berarti lebih sedikit bolak-balik ke peladen " +"jauh tapi pemutakhiran ke cuplikan layar mungkin memakan waktu lebih lama " +"untuk tampil ke pengguna. Nilai 0 berarti jangan pernah memeriksa ke peladen " +"apakah citra telah ada dalam singgahan." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Peladen yang dipakai untuk ulasan aplikasi" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Nilai karma minimum bagi ulasan" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Ulasan dengan karma kurang dari angka ini tidak akan ditampilkan." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Daftar repositori resmi yang tidak boleh dianggap sebagai pihak ke-3" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Daftar repositori wajib yang tidak dapat dinonaktifkan atau dihapus" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Daftar repositori resmi yang mesti dianggap sebagai perangkat lunak bebas" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"URL lisensi yang dipakai ketika suatu aplikasi mesti dianggap perangkat " +"lunak bebas" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Pasang aplikasi terbundel bagi semua pengguna pada sistem bila mungkin" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Izinkan akses ke dialog Repositori Perangkat Lunak" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Tawarkan peningkatan bagi prarilis" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Tampilkan beberapa elemen UI yang menginformasikan ke pengguna bahwa app " +"bukan bebas" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Tampilkan ukuran terpasang bagi app dalam daftar aplikasi terpasang" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URL yang menerangkan perangkat lunak tak bebas dan proprietari" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Daftar URL yang menunjuk ke berkas appstream yang akan diunduh ke dalam " +"suatu folder swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Pasang berkas AppStream ke lokasi seluruh sistem untuk semua pengguna. Jika " +"diisi false, berkas dipasang di direktori $XDG_DATA_HOME/app-info/xmls non-" +"standar" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Urutan prioritas format pemaketan yang disukai, dengan format yang lebih " +"penting tercantum terlebih dahulu. Larik kosong berarti urutan baku. Format " +"yang dihilangkan diasumsikan terdaftar terakhir. Contoh format pemaketan " +"adalah: deb, flatpak, rpm, snap. Format secara opsional juga dapat " +"dinyatakan dengan nama asal, dipisah dengan titik dua, misalnya 'flatpak:" +"flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Stempel waktu dari upaya terakhir untuk menghapus runtime Flatpak yang tidak " +"digunakan" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Atur ke 'true' untuk hanya menampilkan aplikasi berlisensi bebas dan " +"menyembunyikan aplikasi proprietari apa pun." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Atur ke 'true' untuk hanya menampilkan aplikasi dari pengembang yang " +"identitasnya telah diverifikasi." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Stempel waktu dari pemutakhiran historis yang terakhir diterima." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Sebuah string yang menyimpan id gnome-online-account yang digunakan untuk " +"masuk" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Installer seluruh sistem GNOME Software AppStream" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Gagal mengurai argumen baris perintah" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Anda perlu menentukan satu nama berkas" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Program ini hanya dapat digunakan oleh pengguna root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Gagal memvalidasi tipe konten: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Gagal memindahkan: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Pasang Perangkat Lunak" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Pasang perangkat lunak yang dipilih pada sistem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Kekerasan Kartun" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Tidak ada informasi mengenai kekerasan kartun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Kekerasan Fantasi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Tidak ada informasi mengenai kekerasan fantasi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Kekerasan Realistis" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Tidak ada informasi mengenai kekerasan yang realistis" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Kekerasan yang Menggambarkan Pertumpahan Darah" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Tidak ada informasi mengenai pertumpahan darah" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Kekerasan Seksual" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Tidak ada informasi mengenai kekerasan seksual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Tidak ada informasi mengenai referensi untuk alkohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Tidak ada informasi mengenai referensi untuk obat-obatan terlarang" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tembakau" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Tidak ada informasi mengenai referensi untuk produk tembakau" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Ketelanjangan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Tidak ada informasi mengenai ketelanjangan dalam bentuk apa pun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Tema Seksual" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Tidak ada informasi mengenai referensi atau penggambaran sifat seksual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Senonoh" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Tidak ada informasi mengenai senonoh dalam bentuk apa pun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Humor yang Tidak Pantas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Tidak ada informasi mengenai humor yang tidak pantas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminasi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Tidak ada informasi mengenai bahasa diskriminatif dalam bentuk apa pun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Iklan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Tidak ada informasi mengenai iklan dalam bentuk apa pun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Perjudian" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Tidak ada informasi mengenai perjudian dalam bentuk apa pun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Membeli" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Tidak ada informasi mengenai kemampuan untuk menghabiskan uang" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Obrolan Antar Pengguna" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Tidak ada informasi mengenai cara mengobrol dengan pengguna lain" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Obrolan Audio Antar Pengguna" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Tidak ada informasi mengenai cara berbicara dengan pengguna lain" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detail Kontak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Tidak ada informasi mengenai berbagi nama pengguna jejaring sosial atau " +"alamat surel" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Mengidentifikasi Informasi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Tidak ada informasi mengenai berbagi informasi pengguna dengan pihak ketiga" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Berbagi Lokasi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Tidak ada informasi mengenai berbagi lokasi fisik dengan pengguna lain" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksualitas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Tidak ada informasi mengenai referensi homoseksualitas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Pelacuran" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Tidak ada informasi mengenai referensi untuk prostitusi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Perzinaan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Tidak ada informasi mengenai referensi untuk perzinahan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Karakter Seksual" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Tidak ada informasi mengenai karakter seksual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Penodaan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Tidak ada informasi mengenai referensi untuk penodaan" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Sisa-sisa Manusia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Tidak ada informasi mengenai sisa-sisa manusia mati yang terlihat" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Perbudakan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Tidak ada informasi mengenai referensi untuk perbudakan" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Tidak termasuk referensi untuk obat-obatan" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Tidak termasuk sumpah serapah, senonoh, dan jenis bahasa kuat lainnya" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Tidak termasuk iklan atau transaksi moneter" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Tidak termasuk seks atau ketelanjangan" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Tidak termasuk fungsi obrolan yang tidak terkontrol" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Tidak termasuk kekerasan" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Obat-obatan" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Bahasa yang Kuat" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Uang" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sosial" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Kekerasan" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Semua" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s memiliki peringkat usia yang tidak diketahui" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s cocok untuk semua orang" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s cocok untuk bayi yang belajar berjalan" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s untuk anak usia muda" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s cocok untuk anak-anak" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s cocok untuk remaja" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s cocok untuk orang dewasa" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s cocok untuk %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Peringkat Umur" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "Cara _menyumbangkan informasi yang kurang" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Berkas lokal" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paket" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Tertunda" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Pemasangan tertunda" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Penghapusan tertunda" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Memasang" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Menghapus" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Mengunduh" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Pasang" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "Hap_us pemasangan…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Jaringan" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Dapat berkomunikasi melalui jaringan" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Layanan Sistem" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Dapat mengakses layanan D-Bus pada bus sistem" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Layanan Sesi" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Dapat mengakses layanan D-Bus pada bus sesi" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Perangkat" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Dapat mengakses perangkat arbitrer seperti kamera web" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Dapat mengakses perangkat masukan" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Dapat mengakses mikrofon dan memutar audio" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Dapat mengakses berkas perangkat sistem" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Isi Layar" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Dapat mengakses isi layar" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Folder rumah" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Dapat melihat, menyunting, dan membuat berkas" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Dapat melihat berkas" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistem berkas" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Folder unduhan" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Pengaturan" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Dapat melihat dan mengubah pengaturan apa pun" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistem tampilan lama" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Menggunakan sistem tampilan yang lama dan tidak aman" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Sandbox escape" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Dapat menghindari sandbox dan menghindari pembatasan lainnya" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Deskripsi pemutakhiran tak tersedia." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Detail Pemutakhiran" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Membutuhkan izin tambahan" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Data peringat yang tidak valid diterima dari server" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Tidak bisa berkomunikasi dengan server peringkat" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Ulasan" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Tidak ada ulasan yang ditemukan untuk aplikasi ini." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Tidak Ada Ulasan" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Riwayat Versi" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Baru dalam Versi %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versi %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Tidak ada detail untuk rilis ini" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Mode awal mula: bisa ‘updates’, ‘updated’, ‘installed’, atau ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Cari aplikasi" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "CARI" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Tampilkan rincian aplikasi (memakai ID aplikasi)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Tampilkan rincian aplikasi (memakai nama paket)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NAMAPAKET" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Pasang aplikasi (memakai ID aplikasi)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Hapus aplikasi (memakai ID aplikasi)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Buka suatu berkas paket lokal" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NAMABERKAS" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Jenis interaksi yang diharapkan untuk tindakan ini: baik 'tidak ada (none)', " +"'memberitahu (notify)', atau 'penuh (full)'" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKSI" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Tampilkan berkas metainfo atau appdata lokal" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Fungsikan keluaran pengawakutuan rinci (dari instansi yang sedang berjalan, " +"bila sudah berjalan)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Pasang semua pemutakhiran yang tertunda di latar belakang" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Tampilkan preferensi" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Keluar dari instansi yang tengah berjalan" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Lebih suka sumber berkas lokal daripada AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Tampilkan nomor versi" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Hak Cipta © 2016–2023 Kontributor Perangkat Lunak GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Andika Triwidada , 2013-2015, 2017, 2018, 2021-2025.\n" +"Dirgita , 2015.\n" +"Kukuh Syafaat , 2017-2024." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Maaf! Tidak ada detail untuk aplikasi itu." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Ukuran Terpasang" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Termasuk %s data dan %s singgahan" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Termasuk %s data" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Termasuk %s singgahan" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Singgahan dan penggunaan data tidak diketahui" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Ukuran Unduh" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Tidak memerlukan unduhan sistem tambahan" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Membutuhkan ukuran unduhan sistem tambahan yang tidak diketahui" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Membutuhkan %s unduhan sistem tambahan" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Ukuran tidak diketahui" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Tidak ada izin" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Memiliki akses jaringan" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Gunakan layanan sistem" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Gunakan layanan sesi" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Dapat mengakses perangkat keras" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Dapat mengakses perangkat sistem" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Dapat membaca/menulis semua data Anda" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Dapat membaca semua data Anda" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Dapat membaca/menulis unduhan Anda" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Dapat membaca unduhan Anda" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Dapat mengakses beberapa berkas spesifik" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Dapat mengakses dan mengubah pengaturan pengguna" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Menggunakan sistem jendela yang lama dan tidak aman" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Dapat memperoleh izin sewenang-wenang" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Pengembang perangkat lunak terverifikasi" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Ditinjau oleh distribusi OS" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Ditinjau oleh %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Disediakan oleh pihak ketiga" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Perangkat lunak tidak lagi didukung" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Kode yang dapat diaudit" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Lisensi tidak diketahui" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Kode proprietari" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Lisensi spesial" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Keistimewaan" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Aman" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Mungkin Aman" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Berpotensi Tidak Aman" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Tidak Aman" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Hanya Seluler" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Hanya berfungsi pada layar kecil" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Hanya Destop" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Hanya berfungsi pada layar besar" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Ketidakcocokan Ukuran Layar" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Tidak mendukung ukuran layar Anda saat ini" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Membutuhkan layar sentuh" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Membutuhkan papan tik" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Membutuhkan tetikus" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Gamepad Dibutuhkan" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Membutuhkan gamepad untuk bermain" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptif" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Bekerja pada ponsel, tablet, dan destop" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Mungkin membutuhkan papan tik atau tetikus" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Bekerja pada desktop dan laptop" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Berisi konten yang tidak sesuai dengan usia" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Tidak ada informasi peringkat usia yang tersedia" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Kunjungi Situs Web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Pasang…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Batal" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Pasang" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Unduh" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Mutakhiran" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Hapus pemasangan…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Menghapus pemasangan" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Pemutakhiran kritis" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Perangkat tidak dapat dipakai selama pemutakhiran." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Sumber: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Ganti nama dari %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Berhenti Menerima Pemutakhiran" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Pemutakhiran Kritis" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Terpasang" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Bantu Terjemahkan %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s dirancang, dikembangkan, dan diterjemahkan oleh komunitas sukarelawan " +"internasional.\n" +"\n" +"Ini berarti bahwa meskipun belum tersedia dalam bahasa Anda, Anda dapat " +"terlibat dan membantu menerjemahkannya sendiri." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Terjemahan" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Situs Web _Terjemahan" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Diperlukan log masuk jarak jauh %s (bidang %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Log Masuk Diperlukan" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Batal" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Log Masuk" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "Pengg_una" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "Kata _Sandi" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Lainnya" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Semua" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Pilihan" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Pilihan Penyunting" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Baru & Dimutakhirkan" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Pilihan dari Web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Perangkat Lunak Lain" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s Terpasang" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Mulai ulang diperlukan agar perubahan diterapkan" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Aplikasi siap untuk digunakan" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Pembaruan Sistem Telah Terpasang" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Pemutakhiran yang baru dipasang tersedia untuk ditinjau" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Mulai Ulang" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Luncurkan" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Pasang Perangkat Lunak?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Pasang Perangkat Lunak Pihak Ketiga?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Fungsikan Repositori Perangkat Lunak?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Fungsikan Repositori Perangkat Lunak Pihak Ketiga?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s bukanlah perangkat lunak bebas dan terbuka, dan disediakan oleh " +"“%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s disediakan oleh “%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Repositori perangkat lunak ini harus diaktifkan untuk melanjutkan pemasangan." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Mungkin tak legal untuk memasang atau memakai %s di beberapa negara." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Bisa saja ilegal untuk memasang atau menggunakan kodek ini di sejumlah " +"negara." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Jangan _Peringatkan Lagi" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Fungs_ikan dan Pasang" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Rincian galat dari manajer paket adalah:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Rincian" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Tutup" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Rincian disalin ke papan klip" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "Terim_a" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Pemutakhiran telah dipasang" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Aplikasi telah dihapus instalasinya" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Mulai ulang diperlukan agar berdampak" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Jangan Sekarang" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Hari Ini" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Kemarin" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d hari yang lalu" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d minggu yang lalu" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d bulan yang lalu" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d tahun lalu" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Baru saja" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d menit yang lalu" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d jam yang lalu" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Semua" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Pilihan" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Grafik 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografi" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Pemindaian" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Grafik Vektor" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Penilik" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Pembuatan & Penyuntingan Audio" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Pemutar Musik" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Semua" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Pilihan" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalender" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Basis Data" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Keuangan" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Pengolah Kata" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Penyunting Teks" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Peramban Web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Semua" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Pilihan" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Aksi" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Petualangan" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blok" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Papan" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kartu" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulator" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Anak-anak" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logika" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Memainkan Peran" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Olah Raga" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategi" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Semua" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Pilihan" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Mengobrol" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Semua" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Pilihan" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Kecerdasan Buatan" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomi" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kimia" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Bahasa" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Berita" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Seni" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografi" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komik" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fiksi" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Kesehatan" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Sejarah" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Gaya Hidup" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politik" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Olah Raga" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Semua" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Pilihan" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Pengawakutu" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodek" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Penggerak Perangkat Keras" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Fonta" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Sumber Masukan" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Paket Bahasa" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Penerjemahan" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Mencipta" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Bekerja" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Bermain" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Bersosialisasi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Belajar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Mengembangkan" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodek" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Penggerak Perangkat Keras" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Fonta" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Sumber Masukan" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Paket Bahasa" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Penerjemahan" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Aplikasi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s meminta dukungan format berkas tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Memerlukan Jenis MIME Tambahan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s meminta fonta tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Memerlukan Fonta Tambahan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s meminta kodek multimedia tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Memerlukan Kodek Multimedia Tambahan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s meminta pengandar pencetak tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Memerlukan Pengandar Pencetak Tambahan" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s meminta paket tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Memerlukan Paket Tambahan" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Cari dalam Perangkat Lunak" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "Tampilkan _Rinciannya" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Tampilkan Lebih Sedikit" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Menghapus…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Membutuhkan nyala ulang untuk menyelesaikan pemasangan" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Membutuhkan nyala ulang untuk menyelesaikan penghapusan" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Pemasangan tertunda…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Pemutakhiran tertunda…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Mengunduh…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Mempersiapkan…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Menghapus pemasangan…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s tidak terpasang, tetapi itu masih punya data." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "Mu_lai ulang" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "F_ungsikan…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Pasang…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s akan muncul dalam bahasa Inggris AS" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Aplikasi ini akan muncul dalam bahasa Inggris AS" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Perangkat lunak ini akan muncul dalam bahasa Inggris AS" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Bantu Terjemahkan" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Aplikasi Lain oleh %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Pengembang %s telah membuktikan kepemilikan %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Pengembang telah membuktikan kepemilikan %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Anda perlu akses internet untuk menulis ulasan" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Aplikasi ini tidak lagi menerima pemutakhiran, termasuk perbaikan keamanan" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "Aplikasi ini telah disediakan distribusi Anda dan tak boleh diganti." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Aplikasi ini tidak menyediakan tautan ke situs web, repositori kode, atau " +"pelacak masalah." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Perangkat lunak ini tidak lagi menerima pemutakhiran, termasuk perbaikan " +"keamanan" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Perangkat lunak ini telah disediakan distribusi Anda dan tak boleh diganti." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Perangkat lunak ini tidak menyediakan tautan ke situs web, repositori kode, " +"atau pelacak masalah." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Perangkat Lunak gagal mengambil informasi untuk \"%s\" dan tidak dapat " +"menampilkan detail untuk aplikasi ini." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Respon tinjauan yang tidak valid diterima dari server" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Gagal mengirim ulasan bagi \"%s\": %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Halaman rincian" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Memuat Detail Aplikasi" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Terverifikasi" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Buka" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "M_utakhirkan" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Hapus pemasangan" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Tambahan" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "Aplikasi ini hanya dapat dipakai ketika ada koneksi internet aktif." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Repositori Perangkat Lunak Yang Disertakan" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Aplikasi ini menyertakan repositori perangkat lunak yang menyediakan " +"pemutakhiran maupun akses ke perangkat lunak lain." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Tak Ada Repositori Perangkat Lunak Yang Disertakan" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Aplikasi ini tak termasuk repositori perangkat lunak. Ini tak akan " +"dimutakhirkan ke versi-versi lebih baru." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Repositori Perangkat Lunak Teridentifikasi" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Menambahkan repositori perangkat lunak ini akan memberi Anda akses ke " +"perangkat lunak tambahan dan peningkatan." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Hanya pakai repositori perangkat lunak yang Anda percayai." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Bersihkan data aplikasi" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Hapus Data" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Tidak Ada Metadata" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Situs _Web Proyek" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Donasi" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Kontribusi _Terjemahan" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "Lapo_rkan Masalah" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Bantuan" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontak" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Tulis Ulasan" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Semua Ulasan" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Tidak Dapat Menampilkan Detail Aplikasi" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Gagal menyiapkan reboot" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Galat tidak dikenal" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Kunci tidak ditemukan" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Kunci tidak terdaftar" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Diperlukan Pendaftaran MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "Sela_njutnya" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Perangkat ini mengaktifkan Boot Aman. Untuk mengizinkan driver baru " +"diaktifkan, kunci pemilik mesin (machine owner key, MOK) baru harus " +"didaftarkan. Proses ini membutuhkan kata sandi untuk dimasukkan nanti dalam " +"proses. Harap catat kata sandi berikut yang terkait dengan kunci:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Saya telah mencatat kata _sandi MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Restart & Daftar…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instruksi Penyiapan: Silakan Baca dengan Seksama" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Setelah restart, layar penyiapan perangkat akan ditampilkan. Untuk " +"mengaktifkan driver baru, lanjutkan melalui langkah-langkah penyiapan:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Pilih \"Daftar MOK\"\n" +"• Pilih \"Ya\" untuk mendaftarkan kunci\n" +"• Masukkan kata sandi MOK saat diminta\n" +"• Kemudian pilih \"Reboot\"" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Implikasi Keamanan" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Setelah pendaftaran kunci berhasil, ketahuilah bahwa setiap pembaruan di " +"masa mendatang untuk modul atau modul lainnya akan dipercaya secara " +"implisit. Semua pembaruan di masa mendatang akan terjadi secara transparan " +"tanpa interaksi dan atau otorisasi." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Panduan lebih lanjut dapat ditemukan di halaman dokumen." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Mengunduh berkas ekstra metadata…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " dan " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Fonta yang tersedia untuk skrip %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Perangkat lunak yang tersedia untuk %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Perangkat lunak yang diminta tak ditemukan" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Gagal menemukan perangkat lunak yang diminta" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s tak ditemukan" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "pada laman situs" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Tak satu pun aplikasi yang ada menyediakan berkas %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informasi tentang %s, maupun opsi tentang bagaimana mendapatkan aplikasi " +"yang kurang mungkin dapat ditemukan %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Tak satu pun aplikasi yang ada untuk dukungan %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s tak tersedia." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informasi tentang %s, maupun opsi tentang bagaimana mendapatkan suatu " +"aplikasi yang dapat mendukung format ini mungkin dapat ditemukan %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Tak ada fonta yang tersedia bagi dukungan skrip %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informasi tentang %s, maupun opsi tentang bagaimana mendapatkan fonta " +"tambahan mungkin dapat ditemukan %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Tak ada kodek tambahan yang tersedia bagi format %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informasi tentang %s, maupun opsi tentang bagaimana mendapatkan suatu kodek " +"yang dapat memutar format ini mungkin dapat ditemukan %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Tak ada sumber daya Plasma yang tersedia bagi dukungan %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informasi tentang %s, maupun opsi tentang bagaimana mendapatkan sumber daya " +"Plasma tambahan mungkin dapat ditemukan %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Tak ada penggerak pencetak yang tersedia bagi %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informasi tentang %s, maupun opsi tentang bagaimana mendapatkan suatu " +"penggerak yang mendukung pencetak ini mungkin dapat ditemukan %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentasi" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Tidak bisa menemukan %s yang diminta oleh %s. Silakan lihat %s untuk " +"informasi lebih lanjut." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Tidak bisa menemukan %s yang Anda cari. Silakan lihat %s informasi lebih " +"lanjut." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Gagal menemukan hasil pencarian: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Format berkas %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Pas_ang Semua" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Tak Menemukan Perangkat Lunak yang Dicari" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Halaman kodek" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Tidak Ditemukan Hasil" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Tidak Dapat Melakukan Pencarian" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Sebelumnya" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Selanjutnya" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Daftar Aplikasi Unggulan" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Dukungan Destop" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Mendukung digunakan pada layar besar" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Dukungan Destop Tidak Diketahui" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Tidak cukup informasi untuk mengetahui apakah layar besar didukung" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Membutuhkan layar besar" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Destop Tidak Didukung" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Tidak dapat digunakan pada layar besar" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Dukungan Seluler" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Mendukung digunakan pada layar kecil" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Dukungan Seluler Tidak Diketahui" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Tidak cukup informasi untuk mengetahui apakah layar kecil didukung" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Membutuhkan layar kecil" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Seluler Tidak Didukung" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Tidak dapat digunakan pada layar kecil" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Dukungan Papan Tik" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Dukungan Papan Tik Tidak Diketahui" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Tidak cukup informasi untuk mengetahui apakah papan tik didukung" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Papan Tik Diperlukan" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Mendukung papan tik" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Papan Tik Tidak Didukung" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Tidak dapat digunakan dengan papan tik" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Dukungan Tetikus" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Membutuhkan tetikus atau perangkat penunjuk" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Dukungan Tetikus Tidak Diketahui" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Tidak cukup informasi untuk mengetahui apakah tetikus atau perangkat " +"penunjuk didukung" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Tetikus Diperlukan" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Mendukung tetikus dan perangkat penunjuk" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Tetikus Tidak Didukung" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Tidak dapat digunakan dengan tetikus atau perangkat penunjuk" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Dukungan Layar Sentuh" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Dukungan Layar Sentuh Tidak Diketahui" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Tidak cukup informasi untuk mengetahui apakah layar sentuh didukung" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Layar Sentuh Diperlukan" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Mendukung layar sentuh" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Layar Sentuh Tidak Didukung" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Tidak dapat digunakan dengan layar sentuh" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Gamepad Diperlukan" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Membutuhkan gamepad" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Dukungan Gamepad" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Mendukung gamepad" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s barangkali bekerja pada perangkat ini" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s bekerja pada perangkat ini" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s barangkali bekerja pada perangkat ini" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s tidak akan berfungsi dengan baik pada perangkat ini" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s tidak akan berfungsi pada perangkat ini" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Dukungan Perangkat Keras" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Arah" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Arahkan ke Halaman Jelajahi" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Arahkan ke Halaman Terpasang" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Arahkan ke Halaman Pemutakhiran" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Buka Bilah Pencarian" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Jendela" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Buka Preferensi" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Buka Repositori Perangkat Lunak" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Bantuan" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Buka Pintasan Papan Tik" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Terpasang" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Halaman terpasang" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Dalam Proses" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplikasi" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Aplikasi Web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Aplikasi Sistem" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Komunitas Dibangun" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "I_kut Terlibat" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aplikasi ini dikembangkan secara terbuka oleh komunitas internasional, dan " +"dirilis di bawah lisensi %s.\n" +"\n" +"Anda dapat berkontribusi dan membantu membuatnya lebih baik." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aplikasi ini dikembangkan secara terbuka oleh komunitas internasional, dan " +"dirilis di bawah lisensi %s.\n" +"\n" +"Anda dapat berkontribusi dan membantu membuatnya lebih baik." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Perangkat lunak ini dikembangkan secara terbuka oleh komunitas " +"internasional, dan dirilis di bawah the lisensi %s.\n" +"\n" +"Anda dapat berkontribusi dan membantu membuatnya lebih baik." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Perangkat lunak ini dikembangkan secara terbuka oleh komunitas " +"internasional, dan dirilis di bawah lisensi %s.\n" +"\n" +"Anda dapat berkontribusi dan membantu membuatnya lebih baik." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Lisensi Tidak Diketahui" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "Pelajari _Lebih Jauh" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Aplikasi ini tidak menentukan lisensi apa yang dikembangkannya, dan mungkin " +"merupakan proprietari. Ini mungkin tidak aman sehingga sulit dideteksi, dan " +"dapat berubah tanpa pengawasan.\n" +"\n" +"Anda mungkin dapat atau tidak dapat berkontribusi pada aplikasi ini." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Perangkat lunak ini tidak menentukan lisensi apa yang dikembangkannya, dan " +"mungkin merupakan proprietari. Ini mungkin tidak aman sehingga sulit " +"dideteksi, dan dapat berubah tanpa pengawasan.\n" +"\n" +"Anda mungkin dapat atau tidak dapat berkontribusi pada perangkat lunak ini." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Proprietari" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Aplikasi ini tidak dikembangkan secara terbuka, jadi hanya pengembangnya " +"yang mengetahui cara kerjanya. Ini mungkin tidak aman sehingga sulit " +"dideteksi, dan dapat berubah tanpa pengawasan.\n" +"\n" +"Anda mungkin tidak dapat berkontribusi pada aplikasi ini." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Perangkat lunak ini tidak dikembangkan secara terbuka, jadi hanya " +"pengembangnya yang tahu cara kerjanya. Ini mungkin tidak aman dengan cara " +"yang sulit dideteksi, dan dapat berubah tanpa pengawasan.\n" +"\n" +"Anda mungkin tidak dapat berkontribusi pada perangkat lunak ini." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Lisensi Spesial" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Aplikasi ini dikembangkan di bawah lisensi khusus %s.\n" +"\n" +"Anda mungkin dapat atau tidak dapat berkontribusi pada aplikasi ini." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Aplikasi ini dikembangkan di bawah lisensi khusus “%s”.\n" +"\n" +"Anda mungkin dapat atau tidak dapat berkontribusi pada aplikasi ini." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Perangkat lunak ini dikembangkan di bawah lisensi khusus %s.\n" +"\n" +"Anda mungkin dapat atau tidak dapat berkontribusi pada perangkat lunak ini." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Perangkat lunak ini dikembangkan di bawah lisensi khusus “%s”.\n" +"\n" +"Anda mungkin dapat atau tidak dapat berkontribusi pada perangkat lunak ini." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Menyegarkan Data" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Memuat halaman" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Memulai" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Sumber tidak diketahui" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Pengguna" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Penambahan" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Penghapusan" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Pemutakhiran" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Penurunan" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "sumber eksternal yang dipilih" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Menyediakan akses ke perangkat lunak tambahan dari %s. Beberapa perangkat " +"lunak proprietari disertakan.\n" +"\n" +"Anda dapat memfungsikan repostori tersebut nanti dalam preferensi Repositori " +"Perangkat Lunak." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Fungsikan Repositori Perangkat Lunak Pihak Ketiga?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "Aba_ikan" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "F_ungsikan" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Tersedia untuk sistem operasi Anda" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Tersedia untuk %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Jelajahi" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Halaman ringkasan" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Aplikasi Yang Tersedia" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Kategori Lain" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Tak Ada Data Aplikasi Yang Ditemukan" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Tak diketahui" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Pengguna menolak pemasangan" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Persiapkan %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Anda yakin ingin menghapus repositori %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Semua aplikasi dari %s akan dihapus pemasangannya, dan Anda perlu memasang " +"ulang repositori untuk memakainya lagi." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Hapus pemasangan %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Tidak akan mungkin memakai %s setelah pengahapusan." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Tidak akan mungkin menggunakan aplikasi apa pun yang bergantung pada %s " +"setelah penghapusan." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Tidak akan mungkin untuk menggunakan %s setelah dihapus, dan dokumen apa pun " +"yang menggunakannya akan muncul dalam fonta yang berbeda." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Tidak akan mungkin menggunakan %s setelah dilepas. Ini mungkin berarti " +"beberapa file media tidak akan dapat diputar lagi." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Perangkat keras yang bergantung pada %s mungkin tidak lagi berfungsi dengan " +"benar setelah dilepas." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Tidak akan mungkin memakai %s setelah penghapusan. Data dan pengaturan " +"aplikasi akan dipertahankan pada diska, untuk mengizinkan pemulihan aplikasi " +"nanti." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferensi" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Pemutakhiran Perangkat Lunak" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Informasi lebih lanjut" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Memeriksa dan mengunduh pemutakhiran menggunakan data dan daya. Oleh karena " +"itu, fitur pemutakhiran otomatis dijeda saat menggunakan koneksi berkuota " +"dan saat penghemat daya aktif." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "Otom_atis" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Periksa dan unduh pemutakhiran secara otomatis" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Memeriksa dan mengunduh pemutakhiran harus dilakukan secara manual" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Pemberitahua_n Pemutakhiran Otomatis" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Beri tahu ketika pemutakhiran telah dipasang secara otomatis" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Penyaring Konten" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "_Hanya Tampilkan Perangkat Lunak Bebas" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Sembunyikan perangkat lunak proprietari saat menjelajah dan mencari" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Hanya Tampilkan Pengembang Ter_verifikasi" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Hanya tampilkan aplikasi dari pengembang yang identitasnya telah diverifikasi" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Beberapa perangkat lunak yang terpasang tidak kompatibel dengan %s, dan akan " +"secara otomatis dihapus saat peningkatan." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Perangkat Lunak Tak Kompatibel" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Tingkatkan" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "Hap_us pemasangan" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Data & Pengaturan Aplikasi" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Pertahankan" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Izinkan memulihkan pengaturan dan konten aplikasi" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Hapus" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Secara permanen menghapus data untuk menghemat ruang diska" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Perangkat lunak yang telah dipasang dari “%s” akan berhenti menerima " +"pemutakhiran." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Nonaktifkan Repositori?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Hapus Repositori?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Nonaktif" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Hapus" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Aktifkan Repositori Baru" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Aktifkan repositori baru saat mereka ditambahkan" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "informasi lebih lanjut" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Repositori tambahan dari pihak ketiga yang dipilih — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Repositori Pihak Ketiga Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "sistem operasi" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Repositori-repositori ini melengkapi perangkat lunak baku yang disediakan " +"oleh %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Repositori Perangkat Lunak" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Tidak Ada Repositori" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplikasi terpasang" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u tambahan terpasang" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplikasi" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u tambahan" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s dan %s terpasang" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Memeriksa perangkat lunak terpasang…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Hapus" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Benci" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Tidak suka" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "OK" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Suka" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Cinta" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Pilih Bintang untuk Memberi Peringkat" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Harap sisihkan lebih banyak waktu saat menulis ulasan" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Harap pilih nilai bintang" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Ringkasan terlalu pendek" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Ringkasan terlalu panjang" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Keterangan terlalu pendek" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Keterangan terlalu panjang" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Tulis Ulasan" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Kirim" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Harap berikan peringkat, ringkasan, dan teks ulasan. Ulasan tidak boleh " +"digunakan untuk melaporkan masalah: sebaliknya, hubungi pengembang atau " +"penyedia dukungan Anda." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Ringkasan Ulasan" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Tulis ulasan singkat" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Temukan data apa yang dikirim di kebijakan privasi kami. Nama lengkap yang dilampirkan ke akun " +"Anda akan ditampilkan secara publik." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u total ulasan" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "dari 5 bintang" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Tak diketahui" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Anda dapat melaporkan ulasan untuk perilaku diskriminatif, kasar, atau " +"abusif." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Sekali dilaporkan, suatu ulasan akan disembunyikan sampai diperiksa oleh " +"seorang administrator." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Laporkan Ulasan?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "Lapo_r" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Hapus Ulasan?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Menghapus ulasan tidak dapat dibatalkan." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Ulasan Suka" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Ulasan Tidak Suka" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Laporan…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Hapus…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Aplikasi tidak di-sandbox tetapi distribusi telah memeriksa bahwa itu tidak " +"berbahaya" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Periksa apakah Anda memercayai vendornya, karena aplikasinya tidak di-sandbox" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Tidak Ada Izin" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Aplikasi sepenuhnya sandboxed" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Akses Jaringan" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Dapat mengakses internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Tidak Ada Akses Jaringan" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Tidak dapat mengakses internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Gunakan Layanan Sistem" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Dapat meminta data dari layanan sistem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Gunakan Layanan Sesi" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Dapat meminta data dari layanan sesi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Akses Perangkat Pengguna" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Dapat mengakses perangkat seperti kamera web atau pengontrol gim" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Tidak Ada Akses Perangkat Pengguna" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Tidak dapat mengakses perangkat seperti kamera web atau pengontrol gim" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Akses Perangkat Masukan" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Akses Mikrofon dan Putar Audio" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Dapat mendengarkan menggunakan mikrofon dan memutar audio tanpa meminta izin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Akses Perangkat Sistem" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Dapat mengakses perangkat sistem yang memerlukan izin yang lebih tinggi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Akses Isi Layar" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Dapat mengakses isi layar atau jendela lainnya" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Sistem Jendela Lama" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Izin Sewenang-wenang" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Pengaturan Pengguna" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Akses Baca/Tulis Sistem Berkas Lengkap" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Dapat membaca dan menulis semua data pada sistem berkas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Akses Baca/Tulis Folder Rumah" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Dapat membaca dan menulis semua data di direktori rumah Anda" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Akses Baca Sistem Berkas Lengkap" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Dapat membaca semua data pada sistem berkas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Akses Baca Folder Rumah" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Dapat membaca semua data di direktori rumah Anda" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Unduh Akses Baca/Tulis Folder" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Dapat membaca dan menulis semua data di direktori unduhan Anda" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Unduh Akses Baca Folder" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Dapat membaca semua data di direktori unduhan Anda" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Dapat membaca dan menulis semua data di direktori" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Dapat membaca semua data di direktori" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Tidak Ada Akses Sistem Berkas" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Tidak dapat mengakses sistem berkas sama sekali" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Pengembang aplikasi diverifikasi" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Pengembang aplikasi ini telah diverifikasi untuk menjadi siapa yang mereka " +"katakan" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Dependensi yang Tidak Aman" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Perangkat lunak atau dependensinya tidak lagi didukung dan mungkin tidak aman" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Aplikasi ini tidak menentukan lisensi apa yang dikembangkannya, dan mungkin " +"merupakan proprietari" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Perangkat lunak ini tidak menentukan lisensi apa yang dikembangkannya, dan " +"mungkin merupakan proprietari" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Kode Proprietari" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Kode sumber tidak bersifat publik, sehingga tidak dapat diaudit secara " +"independen dan mungkin tidak aman" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Aplikasi ini dikembangkan di bawah lisensi khusus “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Perangkat lunak ini dikembangkan di bawah lisensi khusus “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Kode yang Dapat Diaudit" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Kode sumber bersifat publik dan dapat diaudit secara independen, yang " +"membuat aplikasi lebih mungkin aman" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s diistimewakan" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s aman" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s barangkali aman" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s berpotensi tidak aman" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s tidak aman" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Tak Diketahui" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Keamanan" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Lisensi" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Sumber" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Aplikasi ini menggunakan versi platform perangkat lunak (SDK) yang sudah " +"kedaluwarsa dan mungkin berisi bug atau kerentanan keamanan yang tidak akan " +"diperbaiki." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Cuplikan Layar Sebelumnya" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Cuplikan Layar Berikutnya" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Tidak Ada Cuplikan layar" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Cuplikan layar tak ditemukan" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Gagal memuat citra" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Ukuran cuplikan layar tak ditemukan" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Tidak bisa membuat singgahan" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Cuplikan layar tak valid" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Cuplikan layar tak tersedia" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Cuplikan layar" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u lagi yang cocok" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Halaman pencarian" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Mencari Aplikasi" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Tak Ada Aplikasi Yang Ditemukan" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "\"%s\"" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Tidak bisa mengunduh pemutakhiran" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Tidak bisa mengunduh pemutakhiran perangkat tegar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Tidak bisa mengunduh pemutakhiran firmware dari %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Tidak bisa mengunduh pemutakhiran dari %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Tidak bisa memutakhirkan: akses internet diperlukan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Tidak bisa memutakhirkan: ruang diska tidak cukup" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Tidak bisa mengunduh pemutakhiran dari %s: ruang disk tidak cukup" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Tidak bisa memutakhirkan: perlu autentikasi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Tidak bisa memutakhirkan: autentikasi tidak valid" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Tidak bisa memutakhirkan: diperlukan izin" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Tidak bisa mengunduh pemutakhiran: Anda tidak punya hak untuk memasang " +"perangkat lunak" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Tidak bisa mendapat daftar pemutakhiran" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Tidak bisa memasang: pengunduhan gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Tidak bisa memasang %s: pengunduhan gagal dari %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Tidak bisa memasang %s: pengunduhan gagal" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Tidak bisa memasang: runtime hilang" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Tidak bisa memasang %s: runtime %s tidak tersedia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Tidak bisa memasang %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Tidak bisa memasang: akses internet diperlukan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Tidak bisa memasang: format aplikasi tidak valid" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Tidak bisa memasang: ruang diska tidak cukup" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Tidak bisa memasang %s: ruang diska tidak cukup" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Tidak bisa memasang: diperlukan autentikasi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Tidak bisa memasang %s: diperlukan ptentikasi" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Tidak bisa memasang: autentikasi tidak valid" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Tidak bisa memasang %s: otentikasi tidak valid" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Tidak bisa memasang: diperlukan izin" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Tidak bisa memasang %s: diperlukan izin" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Tidak bisa memasang: perangkat harus dicolokkan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Tidak bisa memasang %s: perangkat harus dicolokkan" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Tidak bisa memasang: baterai lemah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Tidak bisa memasang %s: baterai lemah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Tidak bisa memutakhirkan %s dari %s: pengunduhan gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Tidak bisa memutakhirkan %s: pengunduhan gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Tidak bisa memasang pemutakhiran dari %s: pengunduhan gagal" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Tidak bisa memutakhirkan: pengunduhan gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Tidak bisa memutakhirkan %s: ruang diska tidak cukup" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Tidak bisa memutakhirkan %s: perlu otentikasi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Tidak bisa memutakhirkan %s: otentikasi tidak valid" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Tidak bisa memutakhirkan %s: diperlukan izin" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Tidak bisa memutakhirkan: perangkat harus dicolokkan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Tidak bisa memutakhirkan %s: perangkat harus dicolokkan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Tidak bisa memutakhirkan: baterai lemah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Tidak bisa memutakhirkan %s: baterai lemah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Tidak bisa memutakhirkan %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Tidak bisa memutakhirkan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Tidak bisa meningkatkan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Tidak bisa meningkatkan ke %s dari %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Tidak bisa meningkatkan: pengunduhan gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Tidak bisa meningkatkan ke %s: pengunduhan gagal" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Tidak bisa meningkatkan: akses internet diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Tidak bisa meningkatkan ke %s: akses internet diperlukan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Tidak bisa meningkatkan: ruang diska tidak cukup" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Tidak bisa meningkatkan ke %s: ruang diska tidak cukup" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Tidak bisa meningkatkan: diperlukan autentikasi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Tidak bisa meningkatkan ke %s: diperlukan otentikasi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Tidak bisa meningkatkan: autentikasi tidak valid" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Tidak bisa meningkatkan ke %s: otentikasi tidak valid" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Tidak bisa meningkatkan: diperlukan izin" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Tidak bisa meningkatkan ke %s: diperlukan izin" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Tidak bisa meningkatkan: perangkat harus dicolokkan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Tidak bisa meningkatkan ke %s: perangkat harus dicolokkan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Tidak bisa meningkatkan: baterai lemah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Tidak bisa meningkatkan ke %s: baterai lemah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Tidak bisa meningkatkan ke %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Tidak bisa menghapus instalasi: diperlukan otentikasi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Tidak bisa menghapus instalasi %s: diperlukan otentikasi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Tidak bisa menghapus instalasi: otentikasi tidak valid" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Tidak bisa menghapus instalasi %s: otentikasi tidak valid" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Tidak bisa menghapus instalasi: diperlukan izin" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Tidak bisa menghapus instalasi %s: diperlukan izin" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Tidak bisa menghapus instalasi: perangkat harus dicolokkan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Tidak bisa menghapus instalasi %s: perangkat harus dicolokkan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Tidak bisa menghapus instalasi: baterai lemah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Tidak bisa menghapus instalasi %s: baterai lemah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Tidak bisa menghapus instalasi %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Tidak bisa meluncurkan %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Maaf, ada yang tidak beres" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Tidak bisa meluncurkan %s: %s tidak terpasang" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Ruang diska tidak cukup untuk pengoperasian" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Tidak bisa memasang: jenis berkas tidak didukung" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Tidak bisa memasang: autentikasi gagal" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Tidak bisa memasang" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Tidak bisa mengontak %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Mulai ulang Perangkat Lunak untuk menggunakan pengaya baru" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Perangkat harus dicolokkan" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Level baterai terlalu rendah" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Repo_sitori Perangkat Lunak" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferensi" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "Pintasan Papan Ti_k" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "Tent_ang Perangkat Lunak" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Pencarian" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menu Utama" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Cari aplikasi" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "J_elajahi" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Terpasang" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Pembar_uan" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Kembali" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nihil" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Data Aplikasi" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Data yang diperlukan agar aplikasi berjalan" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Data Pengguna" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Data yang dibuat oleh Anda dalam aplikasi" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Data Singgahan" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Data singgahan sementara" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Aplikasi itu sendiri" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dependensi yang Diperlukan" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Komponen sistem bersama yang diperlukan oleh aplikasi ini" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Tak Diketahui" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Data yang disinggahkan dapat dibersihkan dari pengaturan " +"_aplikasi" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Penyimpanan" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Terpasang)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Memasang)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Mengunduh)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s( Menghapus)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detail" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "P_eriksa" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Dipasang pada %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Pemutakhiran Terpasang" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Tidak Ada Pemutakhiran yang Dipasang" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Pemutakhiran Sudah Kedaluwarsa" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Silakan periksa pemutakhiran perangkat lunak" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Pemutakhiran Penting Siap Dipasang" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Pasang pemutakhiran penting sesegera mungkin" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Pemutakhiran Penting Tersedia untuk Diunduh" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Unduh pemutakhiran penting sesegera mungkin" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Pemutakhiran Siap Dipasang" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Pemutakhiran perangkat lunak siap dan sedang menunggu" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Pemutakhiran Tersedia untuk Diunduh" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Pemutakhiran Perangkat Lunak dapat diunduh" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u Aplikasi Dimutakhirkan — Mulai Ulang Diperlukan" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u Aplikasi Dimutakhirkan" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s telah dimutakhirkan." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Mohon memulai ulang aplikasi." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s dan %s telah dimutakhirkan." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplikasi memerlukan mulai ulang." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Termasuk %s, %s dan %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Sistem Telah Mencapai Akhir Masa Pakai" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Tingkatkan versi untuk terus menerima pemutakhiran" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Sebuah versi baru %s telah tersedia untuk dipasang" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Pemutakhiran Perangkat Lunak Tersedia" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Pemutakhiran Perangkat Lunak Gagal" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Pembaruan yang disiapkan tidak dipasang" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Tampilkan Rincian" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Peningkatan Sistem Selesai" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Selamat datang di %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Pemutakhiran Perangkat Lunak Terpasang" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Pemutakhiran sistem operasi penting telah dipasang." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Ulasan" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Gagal Memutakhirkan" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Sistem sudah pada kondisi terbaru." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Pemutakhiran dibatalkan." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Akses Internet yang diperlukan tidak tersedia. Pastikan Anda terhubung pada " +"Internet dan coba lagi." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Terdapat masalah keamanan pada pemutakhiran perangkat lunak. " +"Konsultasikanlah pada penyedia perangkat lunak Anda untuk informasi lebih " +"rinci." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Tidak tersedia ruang diska yang cukup. Kosongkanlah beberapa dan coba lagi." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Maaf: pemutakhiran gagal dipasang. Tunggulah untuk pemutakhiran yang lain " +"dan coba lagi. Jika terus berlanjut, hubungi penyedia perangkat lunak Anda." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Terakhir diperiksa: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Berhenti" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Periksa Pemutakhiran" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s telah berhenti menerima pemutakhiran perangkat lunak penting" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Sistem operasi Anda telah berhenti menerima pemutakhiran perangkat lunak " +"penting" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Mungkin Ada Biaya" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Memeriksa pemutakhiran ketika memakai data seluler bisa menyebabkan tambahan " +"biaya." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Periksa S_aja" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Pemutakhiran Perangkat Lunak Diunduh" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Peningkatan siap dipasang" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Periksa pemutakhiran" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Pemutakhiran" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Halaman pemutakhiran" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Memuat Pemutakhiran" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Ini mungkin memakan waktu" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Mutakhir" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Gunakan Data Seluler?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Memeriksa pemutakhiran ketika memakai data seluler bisa menambah tagihan" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Periksa Saja" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Tidak Ada Koneksi" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Pergi daring untuk memeriksa pemutakhiran" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Pe_ngaturan Jaringan" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Kesalahan" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Pemutakhiran dikelola secara otomatis" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Pemutakhiran Perangkat Lunak Dijeda" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Pemutakhiran perangkat lunak otomatis telah dihentikan sementara karena " +"alasan berikut:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Koneksi jaringan saat ini berkuota" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Koneksi jaringan saat ini melarang pengunduhan dalam jumlah besar" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Mode hemat daya aktif" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Mode permainan aktif" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Pemutakhiran perangkat lunak dijeda" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Koneksi jaringan berkuota - pemutakhiran perangkat lunak dijeda" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Koneksi jaringan melarang pengunduhan dalam jumlah besar - pemutakhiran " +"perangkat lunak dijeda" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Mode hemat daya aktif - pemutakhiran perangkat lunak dijeda" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Mode permainan aktif - pemutakhiran perangkat lunak dijeda" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "Mulai Ulang & Perba_rui…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_Perbarui Semua" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Pemutakhiran Perangkat Lunak Diunduh" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Pembaruan siap dipasang" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Perangkat Tegar Terpadu" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Perlu Mulai Ulang" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Pemutakhiran Aplikasi" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Perangkat Tegar" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "Un_duh" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s Tersedia" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s Tersedia" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Pelajari tentang versi baru" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s dari %s terunduh" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% terunduh" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Peningkatan mayor, dengan fitur-fitur baru dan polesan tambahan." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Batalkan Peningkatan" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Mulai Ulang & Tingkatkan…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Ingatlah untuk mencadangkan data dan berkas sebelum memutakhirkan." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Rincian Galat" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Salin Rincian" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Gagal menghapus berkas \"%s\": %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Gagal menghapus direktori \"%s\": %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Tambah, hapus, atau mutakhirkan perangkat lunak pada komputer ini" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Pemutakhiran;Peningkatan;Sumber;Repositori;Preferensi;Pasang;Copot;Program;" +"Perangkat Lunak;App;Toko;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s Siap" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s siap diaktifkan dan dipentaskan untuk boot berikutnya." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Fungsikan" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Pemutakhiran Sistem" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Pemutakhiran sistem umum, seperti keamanan atau perbaikan kutu, dan " +"peningkatan kinerja." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s memutakhirkan dengan fitur dan perbaikan baru." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Layanan pemutakhiran EOS tidak dapat mengambil dan menerapkan pemutakhiran." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Aplikasi Web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Dukungan Aplikasi Web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Jalankan aplikasi web populer di peramban" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "Tingkatkan untuk fitur, kinerja, dan stabilitas terbaru." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Dukungan Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak adalah kerangka kerja untuk aplikasi desktop di Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Folder sistem %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Subfolder rumah %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Folder sistem host" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Konfigurasi sistem host dari /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Folder destop" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Subfolder destop %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Folder dokumen" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Subfolder dokumen %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Folder Musik" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Subfolder Musik %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Folder Gambar" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Subfolder Gambar %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Folder Berbagi Publik" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Subfolder Berbagi Publik %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Folder Video" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Subfolder Video %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Folder Templat" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Subfolder Templat %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Folder singgahan pengguna" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Subfolder singgahan pengguna %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Folder konfigurasi pengguna" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Subfolder konfigurasi pengguna %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Folder data pengguna" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Subfolder data pengguna %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Folder runtime pengguna" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Subfolder runtime pengguna %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Akses sistem berkas ke %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Mendapatkan metadata flatpak untuk %s…" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Gagal memperbaiki tambahan '%s': %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Pemasangan Pengguna" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instalasi Sistem" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID Aplikasi" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Gagal menambahkan ke memasang untuk tambahan '%s': %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Gagal menambahkan ke menghapus untuk tambahan '%s': %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Remote \"%s\" tidak mengizinkan pemasangan \"%s\", mungkin karena filternya. " +"Lepaskan filter dan ulangi pemasangan. Detail galat: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Daya sistem terlalu rendah untuk melakukan pemutakhiran" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Daya sistem terlalu rendah untuk melakukan pemutakhiran (%u%%, membutuhkan " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Perangkat tidak dapat dijangkau, atau di luar jangkauan nirkabel" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Daya baterai perangkat terlalu rendah" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Daya baterai perangkat terlalu rendah (%u%%, membutuhkan %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Perangkat sedang menunggu pemutakhiran diterapkan" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Perangkat membutuhkan daya AC tersambung" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Perangkat tidak dapat digunakan saat lid tertutup" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Pemutakhiran Perangkat %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Pemutakhiran Sistem %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Pemutakhiran Pengontrol Tertanam %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Pemutakhiran ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Pemutakhiran ME Korporat %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Pemutakhiran ME Konsumer %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Pemutakhiran Pengendali %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Pemutakhiran Pengontrol Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Pemutakhiran Mikrokode CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Pemutakhiran Konfigurasi %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Pemutakhiran Baterai %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Pemutakhiran Kamera %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Pemutakhiran TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Pemutakhiran Touchpad %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Pemutakhiran Tetikus %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Pemutakhiran Papan Tik %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Pemutakhiran Pengontrol Penyimpanan %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Pemutakhiran Antarmuka Jaringan %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Pemutakhiran Tampilan %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Pemutakhiran MBC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Pemutakhiran Penerima USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Pemutakhiran Drive %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Pemutakhiran Flash Disk %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Pemutakhiran SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Pemutakhiran GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Pemutakhiran Dok %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Pemutakhiran Dok USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Perangkat Tegar (Firmware)" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Pemutakhiran firmware tidak bisa diterapkan: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Dukungan Peningkatan Perangkat Tegar" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Menyediakan dukungan untuk peningkatan perangkat tegar" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Pasang Perangkat Lunak yang Tidak Ditandatangani?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Perangkat lunak yang akan dipasang tidak ditandatangani. Tidak mungkin " +"memverifikasi asal pemutakhiran perangkat lunak ini, atau apakah " +"pemutakhiran telah diubah." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Unduh Perangkat Lunak yang Tidak Ditandatangani?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Pemutakhiran yang tidak ditandatangani tersedia. Tanpa tanda tangan, tidak " +"mungkin untuk memverifikasi asal pemutakhiran, atau apakah itu telah diubah." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Mutakhirkan Perangkat Lunak yang Tidak Ditandatangani?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Pemutakhiran yang tidak ditandatangani tersedia. Tanpa tanda tangan, tidak " +"mungkin untuk memverifikasi asal pemutakhiran, atau apakah itu telah diubah. " +"Pemutakhiran perangkat lunak akan dinonaktifkan hingga pemutakhiran yang " +"tidak ditandatangani dihapus atau diperbarui." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Tidak bisa memasang pemutakhiran: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paket" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Gagal menunggu akhir transaksi sebelum mengunduh: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Gagal mengunduh pembaruan: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Gagal memicu pembaruan: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Sistem Operasi (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Toko Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Dukungan Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap adalah paket Linux yang universal" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistem" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Komponen sistem" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Menghapus tugas sysupdate '%s' gagal dengan status %i" diff --git a/po/ie.po b/po/ie.po new file mode 100644 index 0000000..b60ee89 --- /dev/null +++ b/po/ie.po @@ -0,0 +1,3681 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"software&keywords=I18N+L10N&component=General\n" +"POT-Creation-Date: 2017-03-09 15:59+0700\n" +"PO-Revision-Date: 2017-03-09 16:42+0700\n" +"Last-Translator: OIS \n" +"Language-Team: IE\n" +"Language: ie\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:1 +msgid "GNOME Software" +msgstr "Programmarium de GNOME" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:2 +msgid "Application manager for GNOME" +msgstr "Gerentiator de applicationes por GNOME" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:3 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:4 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:5 +#, fuzzy +msgid "Overview panel" +msgstr "Panel" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:6 +#, fuzzy +msgid "Details panel" +msgstr "_Detallies..." + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:7 +#, fuzzy +msgid "Installed panel" +msgstr "Installat" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:8 +#, fuzzy +msgid "Updates panel" +msgstr "Panel" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:9 +#, fuzzy +msgid "The update details" +msgstr "Act_ualisar" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:10 +msgid "The GNOME Project" +msgstr "Li projecte GNOME" + +#: ../data/org.gnome.software.gschema.xml.h:1 +#, fuzzy +msgid "A list of compatible projects" +msgstr "_Projectes" + +#: ../data/org.gnome.software.gschema.xml.h:2 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:3 +msgid "Whether to automatically download updates" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:4 +msgid "" +"If enabled, GNOME Software automatically downloads updates in the background " +"and prompts the user to install them when ready." +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:5 +msgid "Whether it's the very first run of GNOME Software" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:6 +msgid "Show star ratings next to applications" +msgstr "Monstrar evaluationes in forme de stelles apu applicationes" + +#: ../data/org.gnome.software.gschema.xml.h:7 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:8 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:9 +#, fuzzy +msgid "A list of popular applications" +msgstr "Monstra un liste de conosset _applicationes" + +#: ../data/org.gnome.software.gschema.xml.h:10 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:11 +msgid "The list of extra sources that have been previously enabled" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:12 +msgid "" +"The list of sources that have been previously enabled when installing third-" +"party applications." +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:13 +#, fuzzy +msgid "The last update check timestamp" +msgstr "Actualisat:" + +#: ../data/org.gnome.software.gschema.xml.h:14 +#, fuzzy +msgid "The last upgrade notification timestamp" +msgstr "Actualisat:" + +#: ../data/org.gnome.software.gschema.xml.h:15 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:16 +#, fuzzy +msgid "The last update timestamp" +msgstr "actualisat: %s" + +#: ../data/org.gnome.software.gschema.xml.h:17 +msgid "The server to use for application reviews" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:18 +msgid "The minimum karma score for reviews" +msgstr "Li conte minimal de karma por recensiones" + +#: ../data/org.gnome.software.gschema.xml.h:19 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:20 +msgid "A list of official sources that should not be considered 3rd party" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:21 +msgid "A list of official sources that should be considered free software" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:22 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:23 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:24 +#, fuzzy +msgid "Show the folder management UI" +msgstr "Monstrar optiones de gerentie de session" + +#: ../data/org.gnome.software.gschema.xml.h:25 +msgid "Allow access to the Software Sources dialog" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:26 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:27 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:28 +msgid "Show the prompt to install nonfree software sources" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:29 +msgid "Show non-free software in search results" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:30 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" + +#: ../data/org.gnome.software.gschema.xml.h:31 +msgid "A list of non-free sources that can be optionally enabled" +msgstr "" + +#: ../src/gs-app-folder-dialog.ui.h:1 +#, fuzzy +msgid "Add to Application Folder" +msgstr "Adjunter un _fólder..." + +#: ../src/gs-app-folder-dialog.ui.h:2 ../src/gs-app-folder-dialog.c:322 +#: ../src/gs-removal-dialog.ui.h:2 ../src/gs-review-dialog.ui.h:3 +#: ../src/gs-shell-details.c:359 ../src/gs-shell-details.ui.h:6 +#: ../src/gs-shell-installed.c:530 ../src/gs-upgrade-banner.ui.h:5 +msgid "_Cancel" +msgstr "_Annular" + +#: ../src/gs-app-folder-dialog.ui.h:3 ../src/gs-app-folder-dialog.c:327 +msgid "_Add" +msgstr "_Adjunter" + +#. vim: set noexpandtab: +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is installed +#. vim: set noexpandtab: +#: ../src/gs-app-tile.ui.h:1 ../src/gs-app-addon-row.c:103 +#: ../src/gs-app-row.ui.h:1 ../src/gs-feature-tile.c:66 +#: ../src/gs-popular-tile.c:72 ../src/gs-popular-tile.c:75 +#: ../src/gs-summary-tile.c:78 ../src/gs-summary-tile.ui.h:1 +#: ../src/gs-popular-tile.ui.h:1 +msgid "Installed" +msgstr "Installat" + +#: ../src/gnome-software-local-file.desktop.in.h:1 +msgid "Software Install" +msgstr "Installar un programma" + +#: ../src/gnome-software-local-file.desktop.in.h:2 +#, fuzzy +msgid "Install selected software on the system" +msgstr "Installar li selectet lingue" + +#: ../src/gnome-software.ui.h:1 +msgid "Select All" +msgstr "Select omnicos" + +#: ../src/gnome-software.ui.h:2 +#, fuzzy +msgid "Select None" +msgstr "(Null)" + +#. TRANSLATORS: this is the application name +#. set the window title back to default +#. TRANSLATORS: this is the main window title +#: ../src/gnome-software.ui.h:3 ../src/gs-application.c:389 +#: ../src/gs-shell.c:273 ../src/org.gnome.Software.desktop.in.h:1 +msgid "Software" +msgstr "Programmarium" + +#. vim: set noexpandtab: +#: ../src/gnome-software.ui.h:4 ../src/gs-sources-dialog.ui.h:2 +#: ../src/gs-update-dialog.ui.h:1 +msgid "Go back" +msgstr "Ear retro" + +#. Translators: A label for a button to show all available software. +#: ../src/gnome-software.ui.h:6 +msgid "_All" +msgstr "_Omni" + +#. Translators: A label for a button to show only software which is already installed. +#: ../src/gnome-software.ui.h:8 +msgid "_Installed" +msgstr "_Installat" + +#. Translators: A label for a button to show only updates which are available to install. +#: ../src/gnome-software.ui.h:10 +msgid "_Updates" +msgstr "_Actualisamentes" + +#: ../src/gnome-software.ui.h:11 +msgid "Search" +msgstr "Serchar" + +#: ../src/gs-app-addon-row.c:97 ../src/gs-app-row.c:427 +#: ../src/gs-shell-details.ui.h:7 +msgid "Pending" +msgstr "In linea" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being installed +#: ../src/gs-app-addon-row.c:107 ../src/gs-app-row.c:217 +#: ../src/gs-shell-details.c:411 ../src/gs-summary-tile.c:86 +msgid "Installing" +msgstr "Installante" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being removed +#: ../src/gs-app-addon-row.c:111 ../src/gs-app-row.c:223 +#: ../src/gs-summary-tile.c:94 +msgid "Removing" +msgstr "Essente removet" + +#: ../src/gs-app-folder-dialog.c:311 +msgid "Folder Name" +msgstr "Nómine del fólder" + +#. TRANSLATORS: this is a command line option +#: ../src/gs-application.c:103 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: ../src/gs-application.c:103 +msgid "MODE" +msgstr "MODE" + +#: ../src/gs-application.c:105 +#, fuzzy +msgid "Search for applications" +msgstr "Un intern error ha evenit penante serchar por applicationes:" + +#: ../src/gs-application.c:105 +#, fuzzy +msgid "SEARCH" +msgstr "Serchar" + +#: ../src/gs-application.c:107 +#, fuzzy +msgid "Show application details (using application ID)" +msgstr "Monstrar detallies del application" + +#: ../src/gs-application.c:107 +msgid "ID" +msgstr "ID" + +#: ../src/gs-application.c:109 +#, fuzzy +msgid "Show application details (using package name)" +msgstr "Monstrar detallies del application" + +#: ../src/gs-application.c:109 +msgid "PKGNAME" +msgstr "" + +#: ../src/gs-application.c:111 +msgid "Open a local package file" +msgstr "Aperter un local file de paccage" + +#: ../src/gs-application.c:111 +msgid "FILENAME" +msgstr "FIL-NOMINE" + +#: ../src/gs-application.c:113 +#, fuzzy +msgid "Show verbose debugging information" +msgstr "Monstrar li information del version" + +#: ../src/gs-application.c:115 +#, fuzzy +msgid "Show profiling information for the service" +msgstr "Monstrar li information del version" + +#: ../src/gs-application.c:117 +#, fuzzy +msgid "Quit the running instance" +msgstr "Salir Ristretto" + +#: ../src/gs-application.c:119 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: ../src/gs-application.c:121 +msgid "Show version number" +msgstr "Monstra li numeró del version" + +#: ../src/gs-application.c:382 +msgid "translator-credits" +msgstr "OIS , 2016" + +#. TRANSLATORS: this is the title of the about window +#: ../src/gs-application.c:386 +msgid "About Software" +msgstr "Pri li Programmarium" + +#. TRANSLATORS: well, we seem to think so, anyway +#: ../src/gs-application.c:392 +msgid "A nice way to manage the software on your system." +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-row.c:170 +#, fuzzy +msgid "Visit website" +msgstr "Visitar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: ../src/gs-app-row.c:175 +msgid "Install…" +msgstr "Installar..." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: ../src/gs-app-row.c:182 +msgid "Cancel" +msgstr "Anullar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#. TRANSLATORS: update the fw +#. TRANSLATORS: button text +#: ../src/gs-app-row.c:191 ../src/gs-app-row.c:198 ../src/gs-page.c:393 +#: ../src/gs-common.c:342 +msgid "Install" +msgstr "Installar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: ../src/gs-app-row.c:202 ../src/gs-app-row.c:211 ../src/gs-page.c:541 +msgid "Remove" +msgstr "Remover" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: ../src/gs-app-row.c:327 +msgid "Device cannot be used during update." +msgstr "" + +#. TRANSLATORS: this refers to where the app came from +#: ../src/gs-app-row.c:337 ../src/gs-shell-details.ui.h:34 +msgid "Source" +msgstr "Orígine" + +#. TRANSLATORS: this is when the service name is not known +#: ../src/gs-auth-dialog.c:70 +msgid "To continue you need to sign in." +msgstr "" + +#. TRANSLATORS: the %s is a service name, e.g. "Ubuntu One" +#: ../src/gs-auth-dialog.c:74 +#, c-format +msgid "To continue you need to sign in to %s." +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-auth-dialog.ui.h:1 +msgid "Email address" +msgstr "Adresse de e-post" + +#: ../src/gs-auth-dialog.ui.h:2 +msgid "I have an account already" +msgstr "Yo ja have un conto" + +#: ../src/gs-auth-dialog.ui.h:3 +msgid "Password" +msgstr "Contrasigne" + +#: ../src/gs-auth-dialog.ui.h:4 +msgid "I want to register for an account now" +msgstr "Yo desira registrar un conto" + +#: ../src/gs-auth-dialog.ui.h:5 +#, fuzzy +msgid "I have forgotten my password" +msgstr "Yo ha obliviat mi contrasigne" + +#: ../src/gs-auth-dialog.ui.h:6 +#, fuzzy +msgid "Sign in automatically next time" +msgstr "Ne questionar denov" + +#: ../src/gs-auth-dialog.ui.h:7 +msgid "Enter your one-time pin for two-factor authentication." +msgstr "" + +#: ../src/gs-auth-dialog.ui.h:8 +msgid "PIN" +msgstr "PIN" + +#: ../src/gs-auth-dialog.ui.h:9 +msgid "Continue" +msgstr "Continuar" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: ../src/gs-category.c:193 +msgid "Other" +msgstr "Altris" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: ../src/gs-category.c:198 +msgid "All" +msgstr "Omnis" + +#. TRANSLATORS: this is a subcategory of featured apps +#: ../src/gs-category.c:202 +msgid "Featured" +msgstr "Promoet" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: ../src/gs-dbus-helper.c:293 +msgid "An application" +msgstr "Un application" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: ../src/gs-dbus-helper.c:299 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:301 +msgid "Additional MIME Types Required" +msgstr "Additional MIME-tipes es besonat" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: ../src/gs-dbus-helper.c:305 +#, fuzzy, c-format +msgid "%s is requesting additional fonts." +msgstr "Additional fondes es besonat" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:307 +msgid "Additional Fonts Required" +msgstr "Additional fondes es besonat" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: ../src/gs-dbus-helper.c:311 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:313 +#, fuzzy +msgid "Additional Multimedia Codecs Required" +msgstr "Additional MIME-tipes es besonat" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: ../src/gs-dbus-helper.c:317 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:319 +#, fuzzy +msgid "Additional Printer Drivers Required" +msgstr "Extra driveres" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: ../src/gs-dbus-helper.c:323 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: ../src/gs-dbus-helper.c:325 +msgid "Additional Packages Required" +msgstr "Additional paccages es besonat" + +#. TRANSLATORS: this is a button that launches gnome-software +#: ../src/gs-dbus-helper.c:334 +msgid "Find in Software" +msgstr "Trovar in Programmas" + +#. vim: set noexpandtab: +#: ../src/gs-first-run-dialog.ui.h:1 +msgid "Welcome" +msgstr "Benevenit" + +#: ../src/gs-first-run-dialog.ui.h:2 +msgid "Welcome to Software" +msgstr "Benevenit al Programarium" + +#: ../src/gs-first-run-dialog.ui.h:3 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" + +#: ../src/gs-first-run-dialog.ui.h:4 +msgid "_Let’s Go Shopping" +msgstr "_Lass nos ear a comprar" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: ../src/gs-hiding-box.c:383 +#, fuzzy +msgid "Spacing" +msgstr "Interspacie" + +#: ../src/gs-hiding-box.c:384 +msgid "The amount of space between children" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: ../src/gs-history-dialog.c:83 +msgctxt "app status" +msgid "Removed" +msgstr "Removet" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: ../src/gs-history-dialog.c:89 +msgctxt "app status" +msgid "Installed" +msgstr "Installat" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: ../src/gs-history-dialog.c:95 +msgctxt "app status" +msgid "Updated" +msgstr "Actualisat" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: ../src/gs-history-dialog.c:101 +msgctxt "app status" +msgid "Unknown" +msgstr "Ínconosset" + +#. vim: set noexpandtab: +#: ../src/gs-history-dialog.ui.h:1 +msgid "History" +msgstr "Diarium" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: ../src/gs-page.c:384 +#, fuzzy, c-format +msgid "Prepare %s" +msgstr "%s%s, %s, %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * source name, e.g. 'GNOME Nightly' +#: ../src/gs-page.c:510 +#, fuzzy, c-format +msgid "Are you sure you want to remove the %s source?" +msgstr "" +"Esque vu vole remover\n" +"«%s» permanentmen?" + +#. TRANSLATORS: longer dialog text +#: ../src/gs-page.c:514 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the source to use them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: ../src/gs-page.c:522 +#, fuzzy, c-format +msgid "Are you sure you want to remove %s?" +msgstr "" +"Esque vu vole remover\n" +"«%s» permanentmen?" + +#. TRANSLATORS: longer dialog text +#: ../src/gs-page.c:525 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: ../src/gs-plugin-loader.c:1149 +msgid "OS Updates" +msgstr "Actualisamentes de SO" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: ../src/gs-plugin-loader.c:1154 +msgid "Includes performance, stability and security improvements." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-plugin-loader.c:1851 ../src/gs-shell-extras.c:386 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#: ../src/gs-plugin-loader.c:1854 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: ../src/gs-removal-dialog.c:128 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-removal-dialog.ui.h:1 +msgid "Incompatible Software" +msgstr "Programmas íncompatibil" + +#: ../src/gs-removal-dialog.ui.h:3 +msgid "_Continue" +msgstr "_Continuar" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: ../src/gs-review-dialog.c:98 +msgid "Hate it" +msgstr "Odia it" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: ../src/gs-review-dialog.c:102 +#, fuzzy +msgid "Don't like it" +msgstr "Adío. Esque vu vole..." + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: ../src/gs-review-dialog.c:106 +#, fuzzy +msgid "It's OK" +msgstr "_OK" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: ../src/gs-review-dialog.c:110 +#, fuzzy +msgid "Like it" +msgstr "Esque vu vole deleter ti-ci tema?" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: ../src/gs-review-dialog.c:114 +msgid "Love it" +msgstr "" + +#. TRANSLATORS: the review can't just be copied and pasted +#: ../src/gs-review-dialog.c:136 +msgid "Please take more time writing the review" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: ../src/gs-review-dialog.c:140 +#, fuzzy +msgid "Please choose a star rating" +msgstr "Ples selecter" + +#. TRANSLATORS: the review is not acceptable +#: ../src/gs-review-dialog.c:144 +msgid "The summary is too short" +msgstr "Li compendie es tro curt" + +#. TRANSLATORS: the review is not acceptable +#: ../src/gs-review-dialog.c:148 +msgid "The summary is too long" +msgstr "Li compendie es tre long" + +#. TRANSLATORS: the review is not acceptable +#: ../src/gs-review-dialog.c:152 +msgid "The description is too short" +msgstr "Li descrition es tro curt" + +#. TRANSLATORS: the review is not acceptable +#: ../src/gs-review-dialog.c:156 +msgid "The description is too long" +msgstr "Li descrition es tre long" + +#. vim: set noexpandtab: +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: ../src/gs-review-dialog.ui.h:2 +msgid "Post Review" +msgstr "Inviar un recension" + +#. Translators: A button to publish the user's opinion about the app. +#: ../src/gs-review-dialog.ui.h:5 +msgid "_Post" +msgstr "_Inviar" + +#: ../src/gs-review-dialog.ui.h:6 +msgid "Rating" +msgstr "Evaluation" + +#: ../src/gs-review-dialog.ui.h:7 +msgid "Summary" +msgstr "Compendie" + +#: ../src/gs-review-dialog.ui.h:8 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" + +#. Translators: This is where the users enter their opinions about the apps. +#: ../src/gs-review-dialog.ui.h:10 +msgctxt "app review" +msgid "Review" +msgstr "Recension" + +#: ../src/gs-review-dialog.ui.h:11 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "" + +#: ../src/gs-review-histogram.ui.h:1 +msgid "Total" +msgstr "Total" + +#. TRANSLATORS: this is when a user doesn't specify a name +#. This refers to the license of the application +#: ../src/gs-review-row.c:71 ../src/gs-shell-details.ui.h:42 +msgid "Unknown" +msgstr "Ínconosset" + +#. TRANSLATORS: we explain what the action is going to do +#: ../src/gs-review-row.c:211 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: ../src/gs-review-row.c:216 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: ../src/gs-review-row.c:230 +msgid "Report Review?" +msgstr "Raportar li recense?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: ../src/gs-review-row.c:234 +msgid "Report" +msgstr "Raportar" + +#. vim: set noexpandtab: +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: ../src/gs-review-row.ui.h:2 +msgid "Was this review useful to you?" +msgstr "Esque ti-ci recension esset util por vu?" + +#: ../src/gs-review-row.ui.h:3 +msgid "Yes" +msgstr "Yes" + +#: ../src/gs-review-row.ui.h:4 +msgid "No" +msgstr "No" + +#. Translators: Button text for indifference, only used when moderating +#: ../src/gs-review-row.ui.h:6 +msgid "Meh" +msgstr "" + +#: ../src/gs-review-row.ui.h:7 +msgid "Report…" +msgstr "Raportar..." + +#: ../src/gs-review-row.ui.h:8 +msgid "Remove…" +msgstr "_Remover..." + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: ../src/gs-screenshot-image.c:223 +#, fuzzy +msgid "Screenshot not found" +msgstr "Captura" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: ../src/gs-screenshot-image.c:238 +msgid "Failed to load image" +msgstr "Ne posset cargar li image" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: ../src/gs-screenshot-image.c:352 +#, fuzzy +msgid "Screenshot size not found" +msgstr "Captura" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: ../src/gs-screenshot-image.c:380 +msgid "Could not create cache" +msgstr "Ne posset crear un cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: ../src/gs-screenshot-image.c:426 +#, fuzzy +msgid "Screenshot not valid" +msgstr "Captura" + +#. TRANSLATORS: this is when networking is not available +#: ../src/gs-screenshot-image.c:441 +#, fuzzy +msgid "Screenshot not available" +msgstr "Captura" + +#: ../src/gs-screenshot-image.c:484 +msgid "Screenshot" +msgstr "Captura de ecran" + +#. vim: set noexpandtab: +#: ../src/gs-shell-category.ui.h:1 +#, fuzzy +msgid "Extension Settings" +msgstr "Secun _extension" + +#: ../src/gs-shell-category.ui.h:2 +msgid "" +"Extensions are used at your own risk. If you have any system problems, it is " +"recommended to disable them." +msgstr "" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#: ../src/gs-shell-details.c:268 ../src/gs-shell-details.c:288 +#: ../src/gs-shell-details.ui.h:2 ../src/gs-upgrade-banner.ui.h:6 +msgid "_Install" +msgstr "_Installar" + +#. TRANSLATORS: button text in the header when an application +#. * can be live-updated +#: ../src/gs-shell-details.c:293 +msgid "_Update" +msgstr "Act_ualisar" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software sources or the like +#: ../src/gs-shell-details.c:306 +msgid "_Install…" +msgstr "_Installar..." + +#. TRANSLATORS: button text in the header when an application can be erased +#: ../src/gs-shell-details.c:353 ../src/gs-shell-details.ui.h:5 +msgid "_Remove" +msgstr "_Remover" + +#: ../src/gs-shell-details.c:406 ../src/gs-sources-dialog.c:503 +msgid "Removing…" +msgstr "Removente..." + +#. TRANSLATORS: this is the warning box +#: ../src/gs-shell-details.c:690 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" + +#. TRANSLATORS: this is where the version is not known +#: ../src/gs-shell-details.c:817 +msgctxt "version" +msgid "Unknown" +msgstr "Ínconosset" + +#. TRANSLATORS: this is where the updated date is not known +#: ../src/gs-shell-details.c:851 +msgctxt "updated" +msgid "Never" +msgstr "Nequande" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: ../src/gs-shell-details.c:897 +msgctxt "origin" +msgid "Unknown" +msgstr "Ínconosset" + +#: ../src/gs-shell-details.c:1337 +#, c-format +msgid "Could not find '%s'" +msgstr "Ne posset trovar «%s»" + +#. TRANSLATORS: the file format was not recognised by +#. * any plugin, e.g. if you try installing a .tar.gz +#: ../src/gs-shell-details.c:1398 +#, fuzzy +msgid "The file is not supported." +msgstr "EXIF es ínsuportat por ti-ci formate de file" + +#. TRANSLATORS: install or removed failed +#: ../src/gs-shell-details.c:1408 ../src/gs-common.c:161 +#, fuzzy +msgid "Sorry, this did not work" +msgstr "Applicationes quel ne convene por li altri categories" + +#. TRANSLATORS: see the wikipedia page +#: ../src/gs-shell-details.c:1778 +msgid "Public domain" +msgstr "Dominia public" + +#. TRANSLATORS: see GNU page +#: ../src/gs-shell-details.c:1794 ../src/gs-shell-details.ui.h:51 +msgid "Free Software" +msgstr "Programmas líbre" + +#. TRANSLATORS: for the free software popover +#: ../src/gs-shell-details.c:1851 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "" +msgstr[1] "" + +#: ../src/gs-shell-details.c:1867 ../src/gs-shell-details.ui.h:55 +#, fuzzy +msgid "More information" +msgstr "Information" + +#. vim: set noexpandtab: +#: ../src/gs-shell-details.ui.h:1 +msgid "Details page" +msgstr "Págine de detallies" + +#. Translators: A label for a button to execute the selected application. +#: ../src/gs-shell-details.ui.h:4 +msgid "_Launch" +msgstr "_Lansar" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: ../src/gs-shell-details.ui.h:9 +#, fuzzy +msgid "_Add shortcut" +msgstr "Rapid-taste:" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: ../src/gs-shell-details.ui.h:11 +#, fuzzy +msgid "Re_move shortcut" +msgstr "Re_mover" + +#: ../src/gs-shell-details.ui.h:12 +#, fuzzy +msgid "No screenshot provided" +msgstr "Captura" + +#: ../src/gs-shell-details.ui.h:13 +#, fuzzy +msgid "Software Source Included" +msgstr "Null programmas es installat ex ti-ci orígine" + +#: ../src/gs-shell-details.ui.h:14 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "" + +#: ../src/gs-shell-details.ui.h:15 +#, fuzzy +msgid "No Software Source Included" +msgstr "Null programmas es installat ex ti-ci orígine" + +#: ../src/gs-shell-details.ui.h:16 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "" + +#: ../src/gs-shell-details.ui.h:17 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: ../src/gs-shell-details.ui.h:19 +#, fuzzy +msgid "Software Source Identified" +msgstr "Null programmas es installat ex ti-ci orígine" + +#: ../src/gs-shell-details.ui.h:20 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "" + +#: ../src/gs-shell-details.ui.h:21 +msgid "Only use software sources that you trust." +msgstr "" + +#: ../src/gs-shell-details.ui.h:22 +msgid "_Website" +msgstr "" + +#: ../src/gs-shell-details.ui.h:23 ../src/gs-common.c:782 +msgid "Details" +msgstr "Detallies" + +#: ../src/gs-shell-details.ui.h:24 +msgid "Localized in your Language" +msgstr "Localisat in vor lingue" + +#: ../src/gs-shell-details.ui.h:25 +msgid "Documentation" +msgstr "Documentation" + +#: ../src/gs-shell-details.ui.h:26 +#, fuzzy +msgid "Release Activity" +msgstr "Publication" + +#: ../src/gs-shell-details.ui.h:27 +msgid "System Integration" +msgstr "Integration del sistema" + +#: ../src/gs-shell-details.ui.h:28 +msgid "Sandboxed" +msgstr "" + +#: ../src/gs-shell-details.ui.h:29 ../src/gs-sources-dialog.ui.h:8 +msgid "Version" +msgstr "Version" + +#: ../src/gs-shell-details.ui.h:30 +msgid "Updated" +msgstr "Actualisat" + +#: ../src/gs-shell-details.ui.h:31 +msgid "Category" +msgstr "Categorie" + +#: ../src/gs-shell-details.ui.h:32 +msgid "Installed Size" +msgstr "Grandore installat" + +#: ../src/gs-shell-details.ui.h:33 +msgid "Download Size" +msgstr "Grandore de descarga" + +#: ../src/gs-shell-details.ui.h:35 +msgid "Developer" +msgstr "Developator" + +#: ../src/gs-shell-details.ui.h:36 +msgid "License" +msgstr "Licentie" + +#. This refers to the license of the application +#: ../src/gs-shell-details.ui.h:38 +msgid "Free" +msgstr "Líber" + +#. This refers to the license of the application +#: ../src/gs-shell-details.ui.h:40 +msgid "Proprietary" +msgstr "Proprietari" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: ../src/gs-shell-details.ui.h:43 ../src/gs-shell-installed.c:438 +#: ../src/gs-update-list.c:138 ../src/plugins/gs-desktop-common.c:344 +#, fuzzy +msgid "Add-ons" +msgstr "Monstra ic_ones in menú" + +#: ../src/gs-shell-details.ui.h:44 +msgid "Selected add-ons will be installed with the application." +msgstr "" + +#. Translators: Header of the section with other users' opinions about the app. +#: ../src/gs-shell-details.ui.h:46 +msgid "Reviews" +msgstr "Recensiones" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: ../src/gs-shell-details.ui.h:48 +msgid "_Write a Review" +msgstr "_Scrir un recension" + +#. Translators: Button to return more application-submitted reviews. +#: ../src/gs-shell-details.ui.h:50 +msgid "_Show More" +msgstr "_Monstrar plu" + +#: ../src/gs-shell-details.ui.h:52 +msgid "" +"This means that the software can be freely run, copied, distributed, studied " +"and modified." +msgstr "" + +#: ../src/gs-shell-details.ui.h:53 +msgid "Proprietary Software" +msgstr "Proprietari" + +#: ../src/gs-shell-details.ui.h:54 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "" + +#: ../src/gs-shell-details.ui.h:56 +msgid "Unknown Software License" +msgstr "Ínconosset licentie" + +#: ../src/gs-shell-details.ui.h:57 +msgid "The license terms of this software are unknown." +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: ../src/gs-shell-extras.c:145 +msgid " and " +msgstr " e " + +#. TRANSLATORS: separator for a list of items +#: ../src/gs-shell-extras.c:148 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: ../src/gs-shell-extras.c:174 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: ../src/gs-shell-extras.c:182 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Programma disponibil por %s" +msgstr[1] "Programmas disponibil por %s" + +#: ../src/gs-shell-extras.c:224 +#, fuzzy +msgid "Unable to Find Requested Software" +msgstr "Trovar in Programmas" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: ../src/gs-shell-extras.c:320 +#, c-format +msgid "%s not found" +msgstr "%s ne esset trovat" + +#. TRANSLATORS: hyperlink title +#: ../src/gs-shell-extras.c:324 +msgid "on the website" +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:331 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:335 ../src/gs-shell-extras.c:346 +#: ../src/gs-shell-extras.c:357 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:342 ../src/gs-shell-extras.c:364 +#, fuzzy, c-format +msgid "No applications are available for %s support." +msgstr "Applicationes disponibil" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:353 +#, c-format +msgid "%s is not available." +msgstr "%s ne es disponibil" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:368 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:375 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:379 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:390 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:397 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:401 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-shell-extras.c:408 +#, fuzzy, c-format +msgid "No printer drivers are available for %s." +msgstr "%s de %s disponibil" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: ../src/gs-shell-extras.c:412 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: ../src/gs-shell-extras.c:457 +msgid "this website" +msgstr "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: ../src/gs-shell-extras.c:461 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +msgstr[1] "" + +#: ../src/gs-shell-extras.c:532 ../src/gs-shell-extras.c:587 +#: ../src/gs-shell-extras.c:627 +msgid "Failed to find any search results" +msgstr "" + +#: ../src/gs-shell-extras.c:808 +#, c-format +msgid "%s file format" +msgstr "Formate de file %s" + +#. vim: set noexpandtab: +#: ../src/gs-shell-extras.ui.h:1 +msgid "Codecs page" +msgstr "Págine de codecs" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: ../src/gs-shell-installed.c:428 +msgid "System Applications" +msgstr "Applicationes de sistema" + +#: ../src/gs-shell-installed.c:538 +#, fuzzy +msgid "Click on items to select them" +msgstr "Clicca un element por selecter it" + +#: ../src/gs-shell-installed.c:738 +msgid "Select" +msgstr "Selecter" + +#. vim: set noexpandtab: +#: ../src/gs-shell-installed.ui.h:1 +msgid "Installed page" +msgstr "Págine de installates" + +#: ../src/gs-shell-installed.ui.h:2 +msgid "_Add to Folder…" +msgstr "_Adjunter a fólder..." + +#: ../src/gs-shell-installed.ui.h:3 +#, fuzzy +msgid "_Move to Folder…" +msgstr "Mover a..." + +#: ../src/gs-shell-installed.ui.h:4 +msgid "_Remove from Folder" +msgstr "_Remover ex li fólder" + +#: ../src/gs-shell-moderate.ui.h:1 +#, fuzzy +msgid "Moderate page" +msgstr "Moderat usage de blasfemation" + +#: ../src/gs-shell-moderate.ui.h:2 +#, fuzzy +msgid "There are no reviews to moderate" +msgstr "Recensiones" + +#. add button +#: ../src/gs-shell-overview.c:242 +msgid "More…" +msgstr "Plu..." + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:421 +#, fuzzy +msgid "Recommended Audio & Video Applications" +msgstr "Recomandat applicationes por audio" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:426 +msgid "Recommended Games" +msgstr "Recomandat ludes" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:431 +msgid "Recommended Graphics Applications" +msgstr "Recomandat applicationes por grafica" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:436 +#, fuzzy +msgid "Recommended Productivity Applications" +msgstr "Applicationes de officie e productivitá" + +#. TRANSLATORS: this is the proprietary info bar +#: ../src/gs-shell-overview.c:712 +msgid "" +"Provides access to additional software, including web browsers and games." +msgstr "" + +#. TRANSLATORS: this is the proprietary info bar +#: ../src/gs-shell-overview.c:716 +msgid "Proprietary software has restrictions on use and access to source code." +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the proprietary info bar +#: ../src/gs-shell-overview.c:723 ../src/gs-sources-dialog.c:262 +#, fuzzy +msgid "Find out more…" +msgstr "&Trovar..." + +#. TRANSLATORS: button to turn on proprietary software sources +#: ../src/gs-shell-overview.c:756 +msgid "Enable" +msgstr "Permisser" + +#. vim: set noexpandtab: +#: ../src/gs-shell-overview.ui.h:1 +#, fuzzy +msgid "Overview page" +msgstr "Págine:" + +#: ../src/gs-shell-overview.ui.h:2 +#, fuzzy +msgid "Enable Proprietary Software Sources?" +msgstr "Orígines de _programmas" + +#: ../src/gs-shell-overview.ui.h:3 +msgid "Categories" +msgstr "Categories" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: ../src/gs-shell-overview.ui.h:5 +msgid "Editor's Picks" +msgstr "Lu max bon" + +#: ../src/gs-shell-overview.ui.h:6 +msgid "No Application Data Found" +msgstr "Null data de applicationes trovat" + +#. vim: set noexpandtab: +#: ../src/gs-shell-search.ui.h:1 +msgid "Search page" +msgstr "Págine de sercha" + +#: ../src/gs-shell-search.ui.h:2 +msgid "No Application Found" +msgstr "Null applicationes trovat" + +#. TRANSLATORS: Time in 24h format +#: ../src/gs-shell-updates.c:198 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: ../src/gs-shell-updates.c:201 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../src/gs-shell-updates.c:207 +msgid "Yesterday, %R" +msgstr "Yer, %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: ../src/gs-shell-updates.c:211 +msgid "Yesterday, %l:%M %p" +msgstr "Yer, %l:%M %p" + +#: ../src/gs-shell-updates.c:214 +msgid "Two days ago" +msgstr "Anteyer" + +#: ../src/gs-shell-updates.c:216 +msgid "Three days ago" +msgstr "Ante tri dies" + +#: ../src/gs-shell-updates.c:218 +msgid "Four days ago" +msgstr "Ante quar dies" + +#: ../src/gs-shell-updates.c:220 +msgid "Five days ago" +msgstr "Ante quin dies" + +#: ../src/gs-shell-updates.c:222 +msgid "Six days ago" +msgstr "Ante six dies" + +#: ../src/gs-shell-updates.c:224 +msgid "One week ago" +msgstr "Ante un semane" + +#: ../src/gs-shell-updates.c:226 +msgid "Two weeks ago" +msgstr "Ante du semanes" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: ../src/gs-shell-updates.c:230 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the updates are being downloaded +#: ../src/gs-shell-updates.c:243 +#, fuzzy +msgid "Downloading new updates…" +msgstr "Actualisamentes" + +#. TRANSLATORS: the update panel is doing *something* vague +#: ../src/gs-shell-updates.c:247 +#, fuzzy +msgid "Looking for new updates…" +msgstr "Actualisation:" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:287 +#, fuzzy +msgid "Setting up updates…" +msgstr "Supra" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:288 ../src/gs-shell-updates.c:295 +#, fuzzy +msgid "(This could take a while)" +msgstr "Capturar un image del ecran" + +#. TRANSLATORS: This is the time when we last checked for updates +#: ../src/gs-shell-updates.c:428 +#, c-format +msgid "Last checked: %s" +msgstr "Ultim control: %s" + +#. TRANSLATORS: all updates will be installed +#: ../src/gs-shell-updates.c:501 +msgid "_Install All" +msgstr "_Installar omni" + +#. TRANSLATORS: this is an offline update +#: ../src/gs-shell-updates.c:505 ../src/gs-shell-updates.c:1382 +msgid "Restart & _Install" +msgstr "Restartar e _installar" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: ../src/gs-shell-updates.c:838 +#, fuzzy +msgid "Charges may apply" +msgstr "_Applicar" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:842 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:846 +#, fuzzy +msgid "Check Anyway" +msgstr "Controlar:" + +#. TRANSLATORS: can't do updates check +#: ../src/gs-shell-updates.c:862 +msgid "No Network" +msgstr "Manca de Rete" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:866 +msgid "Internet access is required to check for updates." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:870 +msgid "Network Settings" +msgstr "Parametres de Rete" + +#. TRANSLATORS: we've just live-updated some apps +#: ../src/gs-shell-updates.c:960 +msgid "Updates have been installed" +msgstr "Actualisamentes ha esset installat" + +#. TRANSLATORS: the new apps will not be run until we restart +#: ../src/gs-shell-updates.c:962 +msgid "A restart is required for them to take effect." +msgstr "" + +#. TRANSLATORS: button text +#: ../src/gs-shell-updates.c:964 ../src/gs-update-monitor.c:102 +msgid "Not Now" +msgstr "Ne nu" + +#. TRANSLATORS: button text +#: ../src/gs-shell-updates.c:966 +msgid "Restart" +msgstr "Restartar" + +#: ../src/gs-shell-updates.c:1400 +msgid "Check for updates" +msgstr "Controlar actualisamentes" + +#. vim: set noexpandtab: +#: ../src/gs-shell-updates.ui.h:1 +msgid "Updates page" +msgstr "Págine de actualisation" + +#: ../src/gs-shell-updates.ui.h:2 +msgid "Other Updates" +msgstr "Altri actualisamentes" + +#: ../src/gs-shell-updates.ui.h:3 +#, fuzzy +msgid "Software is up to date" +msgstr "Date" + +#: ../src/gs-shell-updates.ui.h:4 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" + +#: ../src/gs-shell-updates.ui.h:5 +#, fuzzy +msgid "_Check Anyway" +msgstr "Controlar:" + +#: ../src/gs-shell-updates.ui.h:6 +#, fuzzy +msgid "Go online to check for updates" +msgstr "Controlar actualisamentes..." + +#: ../src/gs-shell-updates.ui.h:7 +msgid "_Network Settings" +msgstr "_Parametres de Rete" + +#: ../src/gs-shell-updates.ui.h:8 +#, fuzzy +msgid "Updates are automatically managed" +msgstr "Adjunter li permissiones automaticmen" + +#. TRANSLATORS: This string describes a software source that +#. has no software installed from it. +#: ../src/gs-sources-dialog.c:99 +msgid "No applications or addons installed; other software might still be" +msgstr "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software source. +#: ../src/gs-sources-dialog.c:104 +#, fuzzy, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "%i application installat" +msgstr[1] "%i applicationes installat" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software source. +#: ../src/gs-sources-dialog.c:111 +#, fuzzy, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%i application installat" +msgstr[1] "%i applicationes installat" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of applications. +#: ../src/gs-sources-dialog.c:119 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u application" +msgstr[1] "%u applicationes" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of add-ons. +#: ../src/gs-sources-dialog.c:125 +#, fuzzy, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "Monstra ic_ones in menú" +msgstr[1] "Monstra ic_ones in menú" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: ../src/gs-sources-dialog.c:132 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: nonfree software +#: ../src/gs-sources-dialog.c:252 +msgid "Typically has restrictions on use and access to source code." +msgstr "" + +#. TRANSLATORS: list header +#: ../src/gs-sources-dialog.c:273 +#, fuzzy +msgid "Proprietary Software Sources" +msgstr "Orígines de _programmas" + +#: ../src/gs-sources-dialog.c:489 ../src/gs-sources-dialog.ui.h:12 +#, fuzzy +msgid "Remove Source" +msgstr "Remover" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: ../src/gs-sources-dialog.c:572 +msgid "the operating system" +msgstr "sistema operativ" + +#. TRANSLATORS: This is the text displayed in the Software Sources +#. dialog when no OS-provided software sources are enabled. %s gets +#. replaced by the name of the actual distro, e.g. Fedora. +#: ../src/gs-sources-dialog.c:665 +#, c-format +msgid "" +"Software sources can be downloaded from the internet. They give you access " +"to additional software that is not provided by %s." +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-sources-dialog.ui.h:1 +msgid "Software Sources" +msgstr "Orígines de programmas" + +#: ../src/gs-sources-dialog.ui.h:3 +#, fuzzy +msgid "Additional Sources" +msgstr "Fontes" + +#: ../src/gs-sources-dialog.ui.h:4 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "" + +#: ../src/gs-sources-dialog.ui.h:5 +msgid "No software installed from this source" +msgstr "Null programmas es installat ex ti-ci orígine" + +#: ../src/gs-sources-dialog.ui.h:6 +#, fuzzy +msgid "Installed from this Source" +msgstr "Null programmas es installat ex ti-ci orígine" + +#: ../src/gs-sources-dialog.ui.h:7 +msgid "Source Details" +msgstr "Detallies de orígine" + +#: ../src/gs-sources-dialog.ui.h:9 +#, fuzzy +msgid "Last Checked" +msgstr "_Ultim" + +#: ../src/gs-sources-dialog.ui.h:10 +msgid "Added" +msgstr "Adjuntet" + +#: ../src/gs-sources-dialog.ui.h:11 +msgid "Website" +msgstr "" + +#: ../src/gs-summary-tile.c:74 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Installat)" + +#: ../src/gs-summary-tile.c:82 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Installante)" + +#: ../src/gs-summary-tile.c:90 +#, fuzzy, c-format +msgid "%s (Removing)" +msgstr "Remotion de «%s»" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: ../src/gs-update-dialog.c:121 +#, fuzzy +msgid "No update description available." +msgstr "Null descrition disponibil" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: ../src/gs-update-dialog.c:216 +#, c-format +msgid "Installed on %s" +msgstr "Installat a %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: ../src/gs-update-dialog.c:236 +msgid "Installed Updates" +msgstr "Actualisamentes installat" + +#: ../src/gs-update-dialog.ui.h:2 +msgid "No updates have been installed on this system." +msgstr "" + +#: ../src/gs-update-monitor.c:90 +msgid "Security Updates Pending" +msgstr "Actualisamentes de securitá es atendent" + +#: ../src/gs-update-monitor.c:91 +msgid "It is recommended that you install important updates now" +msgstr "" + +#: ../src/gs-update-monitor.c:94 +msgid "Restart & Install" +msgstr "Restartar e installar" + +#: ../src/gs-update-monitor.c:98 +msgid "Software Updates Available" +msgstr "Actualisamentes es disponibil" + +#: ../src/gs-update-monitor.c:99 +msgid "Important OS and application updates are ready to be installed" +msgstr "" + +#: ../src/gs-update-monitor.c:103 +msgid "View" +msgstr "Monstrar" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: ../src/gs-update-monitor.c:271 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: ../src/gs-update-monitor.c:275 +#, fuzzy +msgid "Software Upgrade Available" +msgstr "Actualisamentes es disponibil" + +#. TRANSLATORS: title when we offline updates have failed +#: ../src/gs-update-monitor.c:462 +msgid "Software Updates Failed" +msgstr "Actualisamentes ne successat" + +#. TRANSLATORS: message when we offline updates have failed +#: ../src/gs-update-monitor.c:464 +msgid "An important OS update failed to be installed." +msgstr "" + +#: ../src/gs-update-monitor.c:465 +msgid "Show Details" +msgstr "Monstrar detallies" + +#. TRANSLATORS: title when we've done offline updates +#: ../src/gs-update-monitor.c:487 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: message when we've done offline updates +#: ../src/gs-update-monitor.c:491 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: ../src/gs-update-monitor.c:502 +msgctxt "updates" +msgid "Review" +msgstr "Inspecter" + +#. TRANSLATORS: this is when the offline update failed +#: ../src/gs-update-monitor.c:546 +#, fuzzy +msgid "Failed To Update" +msgstr "Act_ualisar" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: ../src/gs-update-monitor.c:552 +msgid "The system was already up to date." +msgstr "" + +#. TRANSLATORS: the user aborted the update manually +#: ../src/gs-update-monitor.c:557 +#, fuzzy +msgid "The update was cancelled." +msgstr "Annulat" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: ../src/gs-update-monitor.c:563 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: ../src/gs-update-monitor.c:569 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: ../src/gs-update-monitor.c:575 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: ../src/gs-update-monitor.c:580 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: ../src/gs-upgrade-banner.c:86 +#, c-format +msgid "%s %s Now Available" +msgstr "%s %s es disponibil nu" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: ../src/gs-upgrade-banner.c:96 +#, c-format +msgid "Downloading %s %s" +msgstr "Descargante %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: ../src/gs-upgrade-banner.c:107 +#, fuzzy, c-format +msgid "%s %s Ready to be Installed" +msgstr "%s nu es installat" + +#. vim: set noexpandtab: +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: ../src/gs-upgrade-banner.ui.h:1 +#: ../src/plugins/gs-plugin-fedora-distro-upgrades.c:397 +msgid "A major upgrade, with new features and added polish." +msgstr "" + +#: ../src/gs-upgrade-banner.ui.h:2 +#, fuzzy +msgid "_Learn More" +msgstr "Plu information" + +#: ../src/gs-upgrade-banner.ui.h:3 +msgid "" +"It is recommended that you back up your data and files before upgrading." +msgstr "" + +#: ../src/gs-upgrade-banner.ui.h:4 +msgid "_Download" +msgstr "_Descargar" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: ../src/gs-common.c:137 +#, c-format +msgid "%s is now installed" +msgstr "%s nu es installat" + +#. TRANSLATORS: this is button that opens the newly installed application +#: ../src/gs-common.c:141 +msgid "Launch" +msgstr "Lansar" + +#. TRANSLATORS: this is when the install fails +#: ../src/gs-common.c:168 +#, c-format +msgid "Installation of %s failed." +msgstr "Installation de %s ne successat." + +#. TRANSLATORS: this is when the remove fails +#: ../src/gs-common.c:173 +#, fuzzy, c-format +msgid "Removal of %s failed." +msgstr "Ne successat lansar «%s»" + +#. TRANSLATORS: this is when the upgrade download fails +#: ../src/gs-common.c:182 +#, fuzzy, c-format +msgid "Upgrade to %s failed." +msgstr "Ne successat lansar «%s»" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: ../src/gs-common.c:197 +msgid "Internet access was required but wasn’t available." +msgstr "" + +#. TRANSLATORS: plug in the network cable... +#: ../src/gs-common.c:200 +msgid "Please make sure that you have internet access and try again." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: ../src/gs-common.c:205 +msgid "There wasn’t enough disk space." +msgstr "" + +#. TRANSLATORS: delete some stuff! +#: ../src/gs-common.c:208 +msgid "Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: we didn't handle the error type +#: ../src/gs-common.c:213 +msgid "If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: window title +#: ../src/gs-common.c:273 +#, fuzzy +msgid "Install Third-Party Software?" +msgstr "Installar un programma" + +#. TRANSLATORS: window title +#: ../src/gs-common.c:277 +msgid "Enable Third-Party Software Source?" +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#. +#: ../src/gs-common.c:295 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#: ../src/gs-common.c:305 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s es providet de «%s»." + +#. TRANSLATORS: a software source is a repo +#: ../src/gs-common.c:315 +msgid "This software source must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: ../src/gs-common.c:325 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: ../src/gs-common.c:331 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: ../src/gs-common.c:338 +#, fuzzy +msgid "Don't Warn Again" +msgstr "Ne monstrar plu" + +#. TRANSLATORS: button text +#: ../src/gs-common.c:347 +#, fuzzy +msgid "Enable and Install" +msgstr "Permisser accessibilitá" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:394 +#, fuzzy +msgctxt "content rating violence-cartoon" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:397 +#, fuzzy +msgid "Cartoon characters in unsafe situations" +msgstr "Caracteres dessinat in un conflicte agressiv" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:400 +msgid "Cartoon characters in aggressive conflict" +msgstr "Caracteres dessinat in un conflicte agressiv" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:403 +msgid "Graphic violence involving cartoon characters" +msgstr "Violentie grafic involuente caracteres dessinat" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:406 +#, fuzzy +msgctxt "content rating violence-fantasy" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:409 +#, fuzzy +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "Violentie grafic quel es facilmen distintet del realitá" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:412 +#, fuzzy +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "Violentie grafic quel es facilmen distintet del realitá" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:415 +msgid "Graphic violence easily distinguishable from reality" +msgstr "Violentie grafic quel es facilmen distintet del realitá" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:418 +#, fuzzy +msgctxt "content rating violence-realistic" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:421 +#, fuzzy +msgid "Mildly realistic characters in unsafe situations" +msgstr "Caracteres dessinat in un conflicte agressiv" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:424 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "Caracteres realistic in un conflicte agressiv" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:427 +msgid "Graphic violence involving realistic characters" +msgstr "Violentie grafic involuente caracteres realistic" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:430 +msgctxt "content rating violence-bloodshed" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:433 +msgid "Unrealistic bloodshed" +msgstr "Carnage ínrealistic" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:436 +msgid "Realistic bloodshed" +msgstr "Carnage realistic" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:439 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:442 +#, fuzzy +msgctxt "content rating violence-sexual" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:445 +msgid "Rape or other violent sexual behavior" +msgstr "Violation o altri conduida sexual violent" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:448 +#, fuzzy +msgctxt "content rating drugs-alcohol" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:451 +#, fuzzy +msgid "References to alcoholic beverages" +msgstr "Usage de alcoholic trincages" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:454 +msgid "Use of alcoholic beverages" +msgstr "Usage de alcoholic trincages" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:457 +msgctxt "content rating drugs-narcotics" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:460 +msgid "References to illicit drugs" +msgstr "Mentiones de drogues illicit" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:463 +msgid "Use of illicit drugs" +msgstr "Usage de drogues illicit" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:466 +msgid "References to tobacco products" +msgstr "Mentiones de tabac-productes" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:469 +msgid "Use of tobacco products" +msgstr "Usage de tabac-productes" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:472 +#, fuzzy +msgctxt "content rating sex-nudity" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:475 +msgid "Brief artistic nudity" +msgstr "Brevi artistic nuditá" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:478 +msgid "Prolonged nudity" +msgstr "Extendet nuditá" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:481 +#, fuzzy +msgctxt "content rating sex-themes" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:484 +#, fuzzy +msgid "Provocative references or depictions" +msgstr "Referenties:" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:487 +#, fuzzy +msgid "Sexual references or depictions" +msgstr "Referenties:" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:490 +msgid "Graphic sexual behavior" +msgstr "Grafic conduida sexual" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:493 +#, fuzzy +msgctxt "content rating language-profanity" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:496 +#, fuzzy +msgid "Mild or infrequent use of profanity" +msgstr "Moderat usage de blasfemation" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:499 +msgid "Moderate use of profanity" +msgstr "Moderat usage de blasfemation" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:502 +#, fuzzy +msgid "Strong or frequent use of profanity" +msgstr "Moderat usage de blasfemation" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:505 +#, fuzzy +msgctxt "content rating language-humor" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:508 +#, fuzzy +msgid "Slapstick humor" +msgstr "Humor adult o sexual" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:511 +msgid "Vulgar or bathroom humor" +msgstr "Humor grossieri o scatologic" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:514 +msgid "Mature or sexual humor" +msgstr "Humor adult o sexual" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:517 +#, fuzzy +msgctxt "content rating language-discrimination" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:520 +msgid "Negativity towards a specific group of people" +msgstr "" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:523 +msgid "Discrimination designed to cause emotional harm" +msgstr "" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:526 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:529 +#, fuzzy +msgctxt "content rating money-advertising" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:532 +#, fuzzy +msgid "Product placement" +msgstr "Plazzament" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:535 +msgid "Explicit references to specific brands or trademarked products" +msgstr "" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:538 +msgid "Players are encouraged to purchase specific real-world items" +msgstr "" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:541 +#, fuzzy +msgctxt "content rating money-gambling" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:544 +msgid "Gambling on random events using tokens or credits" +msgstr "" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:547 +#, fuzzy +msgid "Gambling using \"play\" money" +msgstr "Ludes hasardal con moné real" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:550 +msgid "Gambling using real money" +msgstr "Ludes hasardal con moné real" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:553 +#, fuzzy +msgctxt "content rating money-purchasing" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:556 +msgid "Ability to spend real money in-game" +msgstr "" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:559 +#, fuzzy +msgctxt "content rating social-chat" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:562 +msgid "Player-to-player game interactions without chat functionality" +msgstr "" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:565 +msgid "Player-to-player preset interactions without chat functionality" +msgstr "" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:568 +msgid "Uncontrolled chat functionality between players" +msgstr "" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:571 +#, fuzzy +msgctxt "content rating social-audio" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:574 +msgid "Uncontrolled audio or video chat functionality between players" +msgstr "" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:577 +#, fuzzy +msgctxt "content rating social-contacts" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:580 +msgid "Sharing social network usernames or email addresses" +msgstr "" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:583 +#, fuzzy +msgctxt "content rating social-info" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:586 +#, fuzzy +msgid "Sharing user information with 3rd parties" +msgstr "Monstrar li information del version" + +#. TRANSLATORS: content rating description +#: ../src/gs-common.c:589 +#, fuzzy +msgctxt "content rating social-location" +msgid "None" +msgstr "Null" + +#. TRANSLATORS: content rating description: comments welcome +#: ../src/gs-common.c:592 +msgid "Sharing physical location to other users" +msgstr "" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: ../src/gs-common.c:763 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#. vim: set noexpandtab: +#: ../src/gs-menus.ui.h:1 +msgid "_Software Sources" +msgstr "Orígines de _programmas" + +#: ../src/gs-menus.ui.h:2 +msgid "_About" +msgstr "_Pri li application" + +#: ../src/gs-menus.ui.h:3 +msgid "_Quit" +msgstr "Sa_lir" + +#: ../src/org.gnome.Software.desktop.in.h:2 +msgid "Add, remove or update software on this computer" +msgstr "Adjunter, remover o actualisar programmas sur ti-ci computator" + +#: ../src/org.gnome.Software.desktop.in.h:3 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" + +#. TRANSLATORS: initial start +#: ../src/gs-shell-loading.c:63 +msgid "Software catalog is being downloaded" +msgstr "" + +#. TRANSLATORS: initial start +#: ../src/gs-shell-loading.c:68 +#, fuzzy +msgid "Software catalog is being loaded" +msgstr "Actualisamentes es disponibil" + +#. vim: set noexpandtab: +#: ../src/gs-shell-loading.ui.h:1 +#, fuzzy +msgid "Loading page" +msgstr "Carga..." + +#: ../src/gs-shell-loading.ui.h:2 +#, fuzzy +msgid "Starting up…" +msgstr "Startante %s" + +#: ../src/plugins/gs-desktop-common.c:30 +#, fuzzy +msgctxt "Menu of AudioVideo" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:33 +#, fuzzy +msgctxt "Menu of AudioVideo" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:36 +#, fuzzy +msgctxt "Menu of AudioVideo" +msgid "Audio Creation & Editing" +msgstr "Creation de ligamentes" + +#: ../src/plugins/gs-desktop-common.c:42 +#, fuzzy +msgctxt "Menu of AudioVideo" +msgid "Music Players" +msgstr "Reproductores de musica portabil" + +#: ../src/plugins/gs-desktop-common.c:51 +#, fuzzy +msgctxt "Menu of Development" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:54 +#, fuzzy +msgctxt "Menu of Development" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:57 +msgctxt "Menu of Development" +msgid "Debuggers" +msgstr "" + +#: ../src/plugins/gs-desktop-common.c:60 +msgctxt "Menu of Development" +msgid "IDEs" +msgstr "" + +#: ../src/plugins/gs-desktop-common.c:69 +#, fuzzy +msgctxt "Menu of Education" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:72 +#, fuzzy +msgctxt "Menu of Education" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:75 +#, fuzzy +msgctxt "Menu of Education" +msgid "Astronomy" +msgstr "Astronomie" + +#: ../src/plugins/gs-desktop-common.c:78 +#, fuzzy +msgctxt "Menu of Education" +msgid "Chemistry" +msgstr "Chimie" + +#: ../src/plugins/gs-desktop-common.c:81 +#, fuzzy +msgctxt "Menu of Education" +msgid "Languages" +msgstr "Lingues" + +#: ../src/plugins/gs-desktop-common.c:85 +#, fuzzy +msgctxt "Menu of Education" +msgid "Math" +msgstr "Matematica" + +#: ../src/plugins/gs-desktop-common.c:94 +#, fuzzy +msgctxt "Menu of Games" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:97 +#, fuzzy +msgctxt "Menu of Games" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:100 +#, fuzzy +msgctxt "Menu of Games" +msgid "Action" +msgstr "Action" + +#: ../src/plugins/gs-desktop-common.c:103 +#, fuzzy +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventuras" + +#: ../src/plugins/gs-desktop-common.c:106 +#, fuzzy +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: ../src/plugins/gs-desktop-common.c:109 +#, fuzzy +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocs" + +#: ../src/plugins/gs-desktop-common.c:112 +#, fuzzy +msgctxt "Menu of Games" +msgid "Board" +msgstr "Table" + +#: ../src/plugins/gs-desktop-common.c:115 +#, fuzzy +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartes" + +#: ../src/plugins/gs-desktop-common.c:118 +#, fuzzy +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatores" + +#: ../src/plugins/gs-desktop-common.c:121 +#, fuzzy +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Infantil" + +#: ../src/plugins/gs-desktop-common.c:124 +#, fuzzy +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logical" + +#: ../src/plugins/gs-desktop-common.c:127 +#, fuzzy +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Ludes de rol" + +#: ../src/plugins/gs-desktop-common.c:130 +#, fuzzy +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: ../src/plugins/gs-desktop-common.c:134 +#, fuzzy +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategies" + +#: ../src/plugins/gs-desktop-common.c:142 +#, fuzzy +msgctxt "Menu of Graphics" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:145 +#, fuzzy +msgctxt "Menu of Graphics" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:148 +msgctxt "Menu of Graphics" +msgid "3D Graphics" +msgstr "Graphica 3D" + +#: ../src/plugins/gs-desktop-common.c:151 +msgctxt "Menu of Graphics" +msgid "Photography" +msgstr "Fotografie" + +#: ../src/plugins/gs-desktop-common.c:154 +msgctxt "Menu of Graphics" +msgid "Scanning" +msgstr "Scannation" + +#: ../src/plugins/gs-desktop-common.c:157 +msgctxt "Menu of Graphics" +msgid "Vector Graphics" +msgstr "Graphica vector" + +#: ../src/plugins/gs-desktop-common.c:160 +msgctxt "Menu of Graphics" +msgid "Viewers" +msgstr "Visores" + +#: ../src/plugins/gs-desktop-common.c:168 +msgctxt "Menu of Office" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:171 +msgctxt "Menu of Office" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:174 +msgctxt "Menu of Office" +msgid "Calendar" +msgstr "Calendare" + +#: ../src/plugins/gs-desktop-common.c:178 +msgctxt "Menu of Office" +msgid "Database" +msgstr "Base de data" + +#: ../src/plugins/gs-desktop-common.c:181 +msgctxt "Menu of Office" +msgid "Finance" +msgstr "Financie" + +#: ../src/plugins/gs-desktop-common.c:185 +msgctxt "Menu of Office" +msgid "Word Processor" +msgstr "Processor de textus" + +#: ../src/plugins/gs-desktop-common.c:194 +msgctxt "Menu of Addons" +msgid "Fonts" +msgstr "Fondes" + +#: ../src/plugins/gs-desktop-common.c:197 +msgctxt "Menu of Addons" +msgid "Codecs" +msgstr "Codecs" + +#: ../src/plugins/gs-desktop-common.c:200 +#, fuzzy +msgctxt "Menu of Addons" +msgid "Input Sources" +msgstr "Fontes" + +#: ../src/plugins/gs-desktop-common.c:203 +#, fuzzy +msgctxt "Menu of Addons" +msgid "Language Packs" +msgstr "Paquettes de _lingue" + +#: ../src/plugins/gs-desktop-common.c:206 +#, fuzzy +msgctxt "Menu of Addons" +msgid "Shell Extensions" +msgstr "Extensiones de shell" + +#: ../src/plugins/gs-desktop-common.c:209 +msgctxt "Menu of Addons" +msgid "Localization" +msgstr "Localisation" + +#: ../src/plugins/gs-desktop-common.c:212 +#, fuzzy +msgctxt "Menu of Addons" +msgid "Hardware Drivers" +msgstr "Extra driveres" + +#: ../src/plugins/gs-desktop-common.c:220 +msgctxt "Menu of Science" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:223 +msgctxt "Menu of Science" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:226 +msgctxt "Menu of Science" +msgid "Artificial Intelligence" +msgstr "Intelligentie artificial" + +#: ../src/plugins/gs-desktop-common.c:229 +msgctxt "Menu of Science" +msgid "Astronomy" +msgstr "Astronomie" + +#: ../src/plugins/gs-desktop-common.c:232 +msgctxt "Menu of Science" +msgid "Chemistry" +msgstr "Chimie" + +#: ../src/plugins/gs-desktop-common.c:235 +msgctxt "Menu of Science" +msgid "Math" +msgstr "Matematica" + +#: ../src/plugins/gs-desktop-common.c:240 +msgctxt "Menu of Science" +msgid "Robotics" +msgstr "Robotica" + +#: ../src/plugins/gs-desktop-common.c:248 +msgctxt "Menu of Communication" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:251 +msgctxt "Menu of Communication" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:254 +msgctxt "Menu of Communication" +msgid "Chat" +msgstr "Chat" + +#: ../src/plugins/gs-desktop-common.c:261 +msgctxt "Menu of Communication" +msgid "News" +msgstr "Novas" + +#: ../src/plugins/gs-desktop-common.c:265 +msgctxt "Menu of Communication" +msgid "Web Browsers" +msgstr "Navigation Web" + +#: ../src/plugins/gs-desktop-common.c:273 +msgctxt "Menu of Utility" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:276 +msgctxt "Menu of Utility" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:279 +#, fuzzy +msgctxt "Menu of Utility" +msgid "Text Editors" +msgstr "Redactores" + +#: ../src/plugins/gs-desktop-common.c:287 +msgctxt "Menu of Reference" +msgid "All" +msgstr "Omni" + +#: ../src/plugins/gs-desktop-common.c:290 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "Promoet" + +#: ../src/plugins/gs-desktop-common.c:293 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Artes" + +#: ../src/plugins/gs-desktop-common.c:296 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografie" + +#: ../src/plugins/gs-desktop-common.c:299 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "" + +#: ../src/plugins/gs-desktop-common.c:302 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "" + +#: ../src/plugins/gs-desktop-common.c:305 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "" + +#: ../src/plugins/gs-desktop-common.c:308 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historie" + +#: ../src/plugins/gs-desktop-common.c:311 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "" + +#: ../src/plugins/gs-desktop-common.c:314 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politica" + +#: ../src/plugins/gs-desktop-common.c:317 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: ../src/plugins/gs-desktop-common.c:326 +msgid "Audio & Video" +msgstr "Audio e video" + +#. TRANSLATORS: this is the menu spec main category for Development +#: ../src/plugins/gs-desktop-common.c:329 +#, fuzzy +msgid "Developer Tools" +msgstr "Developator:" + +#. TRANSLATORS: this is the menu spec main category for Education +#: ../src/plugins/gs-desktop-common.c:332 +msgid "Education" +msgstr "Education" + +#. TRANSLATORS: this is the menu spec main category for Game +#: ../src/plugins/gs-desktop-common.c:335 +msgid "Games" +msgstr "Ludes" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: ../src/plugins/gs-desktop-common.c:338 +msgid "Graphics & Photography" +msgstr "Grafica e fotografie" + +#. TRANSLATORS: this is the menu spec main category for Office +#: ../src/plugins/gs-desktop-common.c:341 +msgid "Productivity" +msgstr "Productivitá" + +#. TRANSLATORS: this is the menu spec main category for Science +#: ../src/plugins/gs-desktop-common.c:347 +msgid "Science" +msgstr "Scientie" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: ../src/plugins/gs-desktop-common.c:350 +msgid "Communication & News" +msgstr "Communication e novas" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: ../src/plugins/gs-desktop-common.c:353 +#, fuzzy +msgid "Reference" +msgstr "Referentie de ped-note" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: ../src/plugins/gs-desktop-common.c:356 +msgid "Utilities" +msgstr "Utensiles" + +#~ msgid " or " +#~ msgstr " o " + +#, fuzzy +#~ msgid "Open Source" +#~ msgstr "Orígine:" + +#, fuzzy +#~ msgid "Ubuntu Software" +#~ msgstr "Programmarium" + +#~ msgid "3rd party" +#~ msgstr "3-im partise" + +#~ msgid "web app" +#~ msgstr "app web" + +#~ msgid "_Installing" +#~ msgstr "_Installante" + +#~ msgid "_Removing" +#~ msgstr "_Removente" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Ínconosset" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Calculante..." + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Ínconosset" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "Null" + +#~ msgid "_History" +#~ msgstr "_Diarium" + +#~ msgid "Size" +#~ msgstr "Grandore" + +#~ msgid "non-free" +#~ msgstr "non-líber" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Recomandat applicationes por officie" + +#~ msgid "Featured Application" +#~ msgstr "Application promoet" + +#~ msgid "One Star" +#~ msgstr "Un stelle" + +#~ msgid "Two Stars" +#~ msgstr "Du stelles" + +#~ msgid "Three Stars" +#~ msgstr "Tri stelles" + +#~ msgid "Four Stars" +#~ msgstr "Quar stelles" + +#~ msgid "Five Stars" +#~ msgstr "Quin stelles" + +#, fuzzy +#~ msgid "Downloading change information…" +#~ msgstr "Modificar" + +#, fuzzy +#~ msgid "_Software & Updates" +#~ msgstr "Actualisamentes es disponibil" + +#~ msgid "No AppStream data found" +#~ msgstr "Null data de AppStream es trovat" + +#, fuzzy +#~ msgid "Incorrect email or password" +#~ msgstr "_Contrasigne:" + +#, fuzzy +#~ msgid "Account suspended" +#~ msgstr "Conto" + +#, fuzzy +#~ msgid "Account deactivated" +#~ msgstr "Conto" + +#, fuzzy +#~ msgid "Email invalidated" +#~ msgstr "Postage electronic" + +#, fuzzy +#~ msgid "Two-factor authentication failed" +#~ msgstr "Autentication ne successat." + +#, fuzzy +#~ msgid "Password reset required" +#~ msgstr "Un contrasigne es besonat" + +#, fuzzy +#~ msgid "Too many requests" +#~ msgstr "Li compendie es tro curt" + +#, fuzzy +#~ msgid "An error occurred" +#~ msgstr "Un errore evenit" + +#, fuzzy +#~ msgid "One-time password:" +#~ msgstr "Hora" + +#~ msgid "Ubuntu Snappy Store" +#~ msgstr "Butíca Ubuntu Snappy" + +#~ msgid "Audio" +#~ msgstr "Audio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Redactores" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Registratores de discos" + +#, fuzzy +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Radio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Musica" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Registrators" + +#, fuzzy +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "GUI Designers" +#~ msgstr "GUI" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Profilation" + +#, fuzzy +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "Administration de projectes" + +#, fuzzy +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Revision Control" +#~ msgstr "Centre de control" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Translation" +#~ msgstr "Traduction" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Developation por Web" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologie" + +#, fuzzy +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Scientie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Construction" +#~ msgstr "Construction" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Visualisation de data" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Economie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Electricitá" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Electronica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Ingenierie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geoscientie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Historie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Humanities" +#~ msgstr "Humanitari" + +#, fuzzy +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "processante un tache" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Litteratura" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Land-cartes" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Medical" +#~ msgstr "Medicinal" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Musica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Computation in paralel" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fisica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Spiritual" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulatores" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgid "Graphics" +#~ msgstr "Graphica" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "Graphica 2D" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Publication" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Graphica raster" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Post electronic" + +#, fuzzy +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Feed" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Transferte de files" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Radio dilettantic" + +#, fuzzy +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Menú de comunication" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "Clientes IRC" + +#, fuzzy +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Monitor del sistema GNOME" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#, fuzzy +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Remote Access" +#~ msgstr "accesse" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonie" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Developation por Web" + +#~ msgid "Office" +#~ msgstr "Oficie" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Diagrammas" + +#, fuzzy +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Contacte" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Dictionarium" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Postage electronic" + +#, fuzzy +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Diagrammas" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografie" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Presentation" +#~ msgstr "Presentation" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Administration de projectes" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Publication" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Folie de calcules" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Visor" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Artes" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Intelligentie artificial" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Chimie" + +#, fuzzy +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Scientie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Construction" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Visualisation de data" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Economica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Electricitá" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Electronica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Ingenierie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geographie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geoscientie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Historie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humanitari" + +#, fuzzy +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "processante un tache" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Lingues" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Litteratura" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Land-cartes" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Medicinal" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Computation in paralel" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fisica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Spiritualitá" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgid "System" +#~ msgstr "Sistema" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulator" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Gerentiator de files" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File System" +#~ msgstr "Sistema de files" + +#, fuzzy +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Utensiles" + +#, fuzzy +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Monitor del sistema GNOME" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Securitá" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Emulator de Terminal" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Accessibilitá" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Archivation" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Calculator" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Horloge" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Compression" + +#, fuzzy +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Utensiles" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Land-cartes" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Spiritual" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Utensiles de telefonie" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Redaction" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Bases de data" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Registratores de discos" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Players" +#~ msgstr "Reproductores" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Registrators" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" + +#, fuzzy +#~ msgid "shell extension" +#~ msgstr "Shell" diff --git a/po/is.po b/po/is.po new file mode 100644 index 0000000..f37fcd0 --- /dev/null +++ b/po/is.po @@ -0,0 +1,5751 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Sveinn í Felli , 2017, 2018, 2019, 2021, 2022. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2022-10-10 16:35+0000\n" +"PO-Revision-Date: 2022-10-17 15:42+0000\n" +"Last-Translator: Sveinn í Felli \n" +"Language-Team: Icelandic\n" +"Language: is\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 21.12.3\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:21 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Hugbúnaður" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +#| msgid "Installed Updates" +msgid "Install and update apps" +msgstr "Uppsetning og uppfærsla forrita" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Yfirlitsspjald" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Spjald með nánari upplýsingum" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Spjald með uppsettu" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Spjald með uppfærslum" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Nánari upplýsingar um uppfærslu" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2043 +#: src/gs-application.c:256 +msgid "The GNOME Project" +msgstr "GNOME verkefnið" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Listi yfir samhæfð verkefni" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Tímamerki á síðustu athugun með uppfærslu" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Tímamerki síðustu tilkynningar um kerfisuppfærslu" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Tímamerki síðustu tilkynningar um uppfærslu" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Tímamerki síðustu uppfærslu" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The last timestamp when the system was online and got any updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:71 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:72 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The server to use for application reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:85 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:86 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" + +#: data/org.gnome.software.gschema.xml:98 +msgid "A list of official repositories that should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:102 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Allow access to the Software Repositories dialog" +msgstr "" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:122 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:126 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://is.wikipedia.org/wiki/Séreignarhugbúnaður'" + +#: data/org.gnome.software.gschema.xml:127 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Slóð sem útskýrir ófrjálsan- og séreignarhugbúnað" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap." +msgstr "" + +#: data/org.gnome.software.gschema.xml:146 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:143 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: gs-install-appstream/gs-install-appstream.c:145 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:152 +msgid "You need to specify exactly one filename" +msgstr "Þú þarft að tilgreina nákvæmlega eitt skráarheiti" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:159 +msgid "This program can only be used by the root user" +msgstr "Einungis kerfisstjóri getur keyrt þetta forrit" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:167 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Mistókst að votta gerð efnis: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:178 +#, c-format +msgid "Failed to move: %s" +msgstr "Mistókst að færa: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Uppsetning hugbúnaðar" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Setja valinn hugbúnað upp á kerfinu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Teiknimyndaofbeldi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Engar upplýsingar varðandi teiknimyndaofbeldi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantasíuofbeldi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Engar upplýsingar varðandi fantasíuofbeldi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Raunsæislegt ofbeldi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Engar upplýsingar varðandi raunsæislegt ofbeldi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Ofbeldi sem sýnir blóðsúthellingar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Engar upplýsingar varðandi blóðsúthellingar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Kynferðislegt ofbeldi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Engar upplýsingar varðandi kynferðislegt ofbeldi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Áfengi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Engar upplýsingar varðandi tilvísanir í áfengi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Fíkniefni" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Engar upplýsingar varðandi tilvísanir í ólögleg lyf" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tóbak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Engar upplýsingar varðandi tilvísanir í tóbaksvörur" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nekt" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Engar upplýsingar varðandi nekt af einhverju tagi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Kynlífstengt" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Engar upplýsingar varðandi kynferðislegar tilvísanir eða myndefni" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Blótsyrði" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Óviðeigandi húmor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Engar upplýsingar varðandi óviðeigandi húmor" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Mismunun" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Engar upplýsingar varðandi mismunandi orðfæri af einhverju tagi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Auglýsingar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Engar upplýsingar varðandi auglýsingar af einhverju tagi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Fjárhættuspil" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Engar upplýsingar varðandi fjárhættuspil af einhverju tagi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Verslun" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Spjall milli notenda" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Hljóðspjall milli notenda" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Nánar um tengilið" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Auðkennandi upplýsingar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Deiling staðsetninga" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Hinsegin" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Vændi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Fullorðinsefni" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Kyngerfðar persónur" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Líkamsleifar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Þrælahald" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Inniheldur ekki nekt eða kynlíf" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Inniheldur ekki ofbeldi" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Eiturlyf" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Sterklega tekið til orða" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Peningar" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Félagslegt" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Ofbeldi" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:658 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +#| msgid "All" +msgctxt "Age rating" +msgid "All" +msgstr "Allt" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an application is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1023 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s hentar fyrir alla aldurshópa" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1027 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s hentar fyrir smábörn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1031 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s hentar fyrir ung börn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1039 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s hentar fyrir unglinga" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1043 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s hentar fyrir fullorðna" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1048 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s hentar fyrir %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:5 src/gs-app-context-bar.ui:211 +msgid "Age Rating" +msgstr "Aldursbil" + +#: src/gs-age-rating-context-dialog.ui:68 +#: src/gs-hardware-support-context-dialog.ui:71 +#: src/gs-safety-context-dialog.ui:221 +#| msgid "How to add missing information" +msgid "How to contribute missing information" +msgstr "Hvernig á að leggja fram upplýsingar sem vantar" + +#: lib/gs-app.c:6175 +msgid "Local file" +msgstr "Staðbundin skrá" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6194 src/gs-safety-context-dialog.c:439 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#: lib/gs-app.c:6271 +msgid "Package" +msgstr "Pakki" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457 +msgid "Pending" +msgstr "Í bið" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369 +msgid "Pending install" +msgstr "Uppsetning í bið" + +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376 +msgid "Pending remove" +msgstr "Fjarlæging í bið" + +#: src/gs-app-addon-row.c:111 src/gs-app-row.ui:197 src/gs-app-tile.ui:50 +#: src/gs-feature-tile.c:535 +#| msgid "Installed" +msgctxt "Single app" +msgid "Installed" +msgstr "Uppsett" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:205 src/gs-details-page.c:362 +msgid "Installing" +msgstr "Set upp" + +#: src/gs-app-addon-row.c:119 +msgid "Removing" +msgstr "Fjarlægi" + +#: src/gs-app-addon-row.ui:64 +msgid "_Uninstall" +msgstr "F_jarlægja" + +#: src/gs-app-details-page.c:68 +msgid "Network" +msgstr "Netkerfi" + +#: src/gs-app-details-page.c:68 +msgid "Can communicate over the network" +msgstr "Getur átt samskipti yfir netið" + +#: src/gs-app-details-page.c:69 +msgid "System Services" +msgstr "Kerfisþjónustur" + +#: src/gs-app-details-page.c:69 +msgid "Can access D-Bus services on the system bus" +msgstr "Getur nálgast D-Bus þjónustur á kerfisrásinni" + +#: src/gs-app-details-page.c:70 +msgid "Session Services" +msgstr "Þjónustur setu" + +#: src/gs-app-details-page.c:70 +msgid "Can access D-Bus services on the session bus" +msgstr "Getur nálgast D-Bus þjónustur á seturásinni" + +#: src/gs-app-details-page.c:71 +msgid "Devices" +msgstr "Tæki" + +#: src/gs-app-details-page.c:71 +msgid "Can access system device files" +msgstr "Getur nálgast tækjaskrár kerfis" + +#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73 +msgid "Home folder" +msgstr "Heimamappa" + +#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:74 +#: src/gs-app-details-page.c:77 src/gs-app-details-page.c:150 +msgid "Can view, edit and create files" +msgstr "Getur skoðað, breytt og búið til skrár" + +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:75 +#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:145 +msgid "Can view files" +msgstr "Getur skoðað skrár" + +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75 +msgid "File system" +msgstr "Skráakerfi" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:77 src/gs-app-details-page.c:78 +msgid "Downloads folder" +msgstr "Niðurhalsmappa" + +#: src/gs-app-details-page.c:79 +msgid "Settings" +msgstr "Stillingar" + +#: src/gs-app-details-page.c:79 +msgid "Can view and change any settings" +msgstr "Má skoða og breyta öllum stillingum" + +#: src/gs-app-details-page.c:80 +msgid "Legacy display system" +msgstr "" + +#: src/gs-app-details-page.c:80 +msgid "Uses an old, insecure display system" +msgstr "" + +#: src/gs-app-details-page.c:81 +msgid "Sandbox escape" +msgstr "Flótti úr einangrun" + +#: src/gs-app-details-page.c:81 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" + +#. FIXME support app == NULL +#. set window title +#: src/gs-app-details-page.c:166 +#| msgid "The update details" +msgid "Update Details" +msgstr "Nánar um uppfærslu" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:174 +msgid "No update description available." +msgstr "Engin lýsing til á uppfærslu." + +#: src/gs-app-details-page.ui:25 src/gs-os-update-page.ui:25 +#: src/gs-shell.ui:367 src/gs-shell.ui:458 +msgid "Go back" +msgstr "Fara til baka" + +#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516 +msgid "Requires additional permissions" +msgstr "Krefst viðbótarheimilda" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:855 +msgid "Reviews" +msgstr "Umsagnir" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No reviews were found for this application." +msgstr "Engar umsagnir fundust fyrir þetta forrit." + +#: src/gs-app-reviews-dialog.ui:27 +msgid "No Reviews" +msgstr "Engar umsagnir" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533 +msgid "Version History" +msgstr "Útgáfuferill" + +#: src/gs-app-version-history-row.c:71 +#, c-format +msgid "New in Version %s" +msgstr "Nýtt í útgáfu %s" + +#: src/gs-app-version-history-row.c:78 +#, c-format +msgid "Version %s" +msgstr "Útgáfa %s" + +#: src/gs-app-version-history-row.c:80 +msgid "No details for this release" +msgstr "Engar nánari upplýsingar til fyrir þessa útgáfu" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:94 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e. %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "HAMUR" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Leita að forritum" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "LEITA" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PAKKAHEITI" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "SKRÁARHEITI" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "" + +#: src/gs-application.c:143 +msgid "Show verbose debugging information" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "" + +#: src/gs-application.c:147 +msgid "Show update preferences" +msgstr "" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Birta útgáfunúmer" + +#: src/gs-application.c:261 src/gs-application.c:269 +msgid "Copyright © 2016–2022 GNOME Software contributors" +msgstr "Höfundarréttur © 2016–2022 höfundar hugbúnaðar í GNOME" + +#: src/gs-application.c:263 src/gs-application.c:272 +msgid "translator-credits" +msgstr "Sveinn í Felli, sv1@fellsnet.is" + +#. TRANSLATORS: this is the title of the about window +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-application.c:277 src/gs-shell.c:2156 +msgid "About Software" +msgstr "Um hugbúnaðinn" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:280 +msgid "A nice way to manage the software on your system." +msgstr "" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:468 +msgid "Sorry! There are no details for that application." +msgstr "Því miður! Engar nánari upplýsingar finnast fyrir forritið." + +#. Translators: The disk usage of an application when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Uppsett stærð" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "" + +#. Translators: The download size of an application. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Niðurhalsstærð" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Stærð er óþekkt" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:282 +msgid "No permissions" +msgstr "Engar heimildir" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "Has network access" +msgstr "Er með aðgang að netkerfi" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:300 +msgid "Uses system services" +msgstr "Notar kerfisþjónustur" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:307 +msgid "Uses session services" +msgstr "Notar setuþjónustur" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:314 +msgid "Can access hardware devices" +msgstr "Hefur aðgang að vélbúnaði" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:326 +msgid "Can read/write all your data" +msgstr "Getur lesið/skrifað öll gögnin þín" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:338 +msgid "Can read all your data" +msgstr "Getur lesið öll gögnin þín" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:345 +msgid "Can read/write your downloads" +msgstr "Getur lesið/skrifað niðurhalið þitt" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can read your downloads" +msgstr "Getur lesið niðurhalið þitt" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:359 +msgid "Can access arbitrary files" +msgstr "Hefur aðgang að allskyns skrám" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:366 src/gs-safety-context-dialog.c:227 +msgid "Can access and change user settings" +msgstr "Getur skoðað og breytt stillingum notenda" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:373 src/gs-safety-context-dialog.c:211 +msgid "Uses a legacy windowing system" +msgstr "Notar gamaldags gluggakerfi" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:380 src/gs-safety-context-dialog.c:219 +msgid "Can acquire arbitrary permissions" +msgstr "" + +#. Translators: This indicates that an application has been packaged +#. * by the user’s distribution and is safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:406 src/gs-safety-context-dialog.c:146 +msgid "Reviewed by your distribution" +msgstr "Yfirfarið af dreifingunni þinni" + +#. Translators: This indicates that an application has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:413 src/gs-safety-context-dialog.c:143 +msgid "Provided by a third party" +msgstr "Í boði frá utanaðkomandi aðila" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 +msgid "Proprietary code" +msgstr "Séreignarkóði" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:431 +msgid "Auditable code" +msgstr "Yfirfaranlegur kóði" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:447 +msgid "Software no longer supported" +msgstr "Hugbúnaður er ekki lengur studdur" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new +#: src/gs-app-context-bar.c:459 src/gs-app-context-bar.c:730 +msgid "; " +msgstr "; " + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:467 +msgid "Safe" +msgstr "Öruggt" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:474 +msgid "Potentially Unsafe" +msgstr "Mögulega óöruggt" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:481 +msgid "Unsafe" +msgstr "Óöruggt" + +#: src/gs-app-context-bar.c:560 src/gs-app-context-bar.c:592 +#: src/gs-hardware-support-context-dialog.c:603 +msgid "Mobile Only" +msgstr "" + +#: src/gs-app-context-bar.c:561 +msgid "Only works on a small screen" +msgstr "" + +#: src/gs-app-context-bar.c:566 src/gs-app-context-bar.c:599 +#: src/gs-app-context-bar.c:606 src/gs-app-context-bar.c:656 +#: src/gs-app-context-bar.c:661 src/gs-hardware-support-context-dialog.c:583 +msgid "Desktop Only" +msgstr "" + +#: src/gs-app-context-bar.c:567 +msgid "Only works on a large screen" +msgstr "" + +#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621 +msgid "Screen Size Mismatch" +msgstr "" + +#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622 +msgid "Doesn’t support your current screen size" +msgstr "" + +#: src/gs-app-context-bar.c:593 src/gs-hardware-support-context-dialog.c:674 +#: src/gs-hardware-support-context-dialog.c:680 +msgid "Requires a touchscreen" +msgstr "Krefst snertiskjás" + +#: src/gs-app-context-bar.c:600 src/gs-hardware-support-context-dialog.c:634 +#: src/gs-hardware-support-context-dialog.c:640 +msgid "Requires a keyboard" +msgstr "Krefst lyklaborðs" + +#: src/gs-app-context-bar.c:607 +msgid "Requires a mouse" +msgstr "Krefst músar" + +#: src/gs-app-context-bar.c:618 +msgid "Gamepad Needed" +msgstr "" + +#: src/gs-app-context-bar.c:619 +msgid "Requires a gamepad to play" +msgstr "" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:643 +msgid "Adaptive" +msgstr "Aðlaganlegt" + +#: src/gs-app-context-bar.c:644 +msgid "Works on phones, tablets and desktops" +msgstr "" + +#: src/gs-app-context-bar.c:657 +msgid "Probably requires a keyboard or mouse" +msgstr "" + +#: src/gs-app-context-bar.c:662 +msgid "Works on desktops and laptops" +msgstr "" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:705 +msgid "Contains no age-inappropriate content" +msgstr "" + +#: src/gs-app-context-bar.c:753 +msgid "No age rating information available" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:153 +msgid "Visit Website" +msgstr "Fara á heimasíðu" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:159 +msgid "Install…" +msgstr "Setja inn…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:167 src/gs-updates-section.ui:62 +msgid "Cancel" +msgstr "Hætta við" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:175 src/gs-common.c:286 src/gs-page.c:374 +msgid "Install" +msgstr "Setja inn" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:183 +msgid "Update" +msgstr "Uppfæra" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: button text in the header when an application can be erased +#. TRANSLATORS: this is button text to remove the application +#: src/gs-app-row.c:188 src/gs-app-row.c:198 src/gs-details-page.ui:281 +#: src/gs-page.c:549 +msgid "Uninstall" +msgstr "Taka út" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#: src/gs-app-row.c:212 +msgid "Uninstalling" +msgstr "Tek út uppsetningu" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:327 +msgid "Device cannot be used during update." +msgstr "" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:337 src/gs-shell-search-provider.c:264 +#, c-format +msgid "Source: %s" +msgstr "Uppruni: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:523 +#, c-format +msgid "Renamed from %s" +msgstr "Endurnefnt úr %s" + +#. Translators: The placeholder is an application name +#: src/gs-app-translation-dialog.c:67 +#, c-format +msgid "Help Translate %s" +msgstr "Hjálpa við þýðingu %s" + +#. Translators: The placeholder is an application name +#: src/gs-app-translation-dialog.c:70 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"volunteers.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" + +#: src/gs-app-translation-dialog.ui:5 +msgid "Translations" +msgstr "Þýðingar" + +#: src/gs-app-translation-dialog.ui:92 +msgid "_Translation Website" +msgstr "Vefsvæði þýðinga" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:13 +msgid "Login Required" +msgstr "Krafist er innskráningar" + +#: src/gs-basic-auth-dialog.ui:21 src/gs-common.c:612 +#: src/gs-details-page.ui:294 src/gs-removal-dialog.ui:17 +#: src/gs-review-dialog.ui:18 +msgid "_Cancel" +msgstr "_Hætta við" + +#: src/gs-basic-auth-dialog.ui:35 +msgid "_Login" +msgstr "_Innskráning" + +#: src/gs-basic-auth-dialog.ui:88 +msgid "_User" +msgstr "N_otandi" + +#: src/gs-basic-auth-dialog.ui:107 +msgid "_Password" +msgstr "_Lykilorð" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Annað" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +#| msgid "All" +msgctxt "Category" +msgid "All" +msgstr "Allt" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Í deiglunni" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:41 src/gs-overview-page.ui:106 +msgid "Editor’s Choice" +msgstr "Valið af ritstjórn" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:129 +msgid "New & Updated" +msgstr "Nýtt og uppfært" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:97 +msgid "Picks from the Web" +msgstr "" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:125 +msgid "Other Software" +msgstr "Annar hugbúnaður" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:194 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "Settu inn tölu frá 1 og upp í %u: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:266 +msgid "Choose an application:" +msgstr "Veldu forrit:" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Allt" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Í deiglunni" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Þrívíddarmyndvinnsla" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Ljósmyndun" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skönnun" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vigrateikning" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Skoðarar" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Hljóðvinnsla og blöndun" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Tónlistarspilarar" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Allt" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Í deiglunni" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Dagatal" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Gagnagrunnar" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Fjármál" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Ritvinnsla" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Textaritlar" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Netvafrar" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Allt" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Í deiglunni" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Aðgerð" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Ævintýraleikir" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Spilasalur" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Kubbar" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Borðleikir" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Spjald" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Hermar" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Krakkaleikir" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Rökrænt" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Hlutverkaleikir" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Íþróttir" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Herkænska" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Allt" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Í deiglunni" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Spjall" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Allt" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Í deiglunni" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Gervigreind" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Stjörnufræði" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Efnafræði" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Tungumál" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Stærðfræði" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Fréttir" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Vélmennafræði" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Listir" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Æviágrip" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Myndasögur" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Skáldskapur" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Heilsa" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Ferill" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Lífstíll" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Pólitík" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Íþróttir" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Allt" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Í deiglunni" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Aflúsarar" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Forritunarumhverfi" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kóðunarlyklar (codecs)" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Vélbúnaðarreklar" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Letur" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Inntaksgjafar" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Tungumálapakkar" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Staðfærsla" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Hönnun" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Vinna" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Leikur" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Félagslíf" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Lærdómur" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Forritun" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kóðunarlyklar (codecs)" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Vélbúnaðarreklar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Letur" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Inntaksgjafar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Tungumálapakkar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Staðfærsla" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:68 src/gs-common.c:91 +#, c-format +msgid "%s is now installed" +msgstr "%s er núna uppsett" + +#. TRANSLATORS: an application has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:72 src/gs-common.c:95 +msgid "A restart is required for the changes to take effect." +msgstr "Endurræsing er nauðsynleg til að breytingarnar taki gildi." + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:76 +msgid "Application is ready to be used." +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "System updates are now installed" +msgstr "Uppfærslur á kerfinu eru núna uppsettar" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:87 +msgid "Recently installed updates are available to review" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:106 src/gs-common.c:775 +msgid "Restart" +msgstr "Endurræsa" + +#: src/gs-common.c:112 +msgid "Launch" +msgstr "Ræsa" + +#. TRANSLATORS: window title +#: src/gs-common.c:218 +msgid "Install Third-Party Software?" +msgstr "Setja inn hugbúnað frá utanaðkomandi aðilum?" + +#. TRANSLATORS: window title +#: src/gs-common.c:222 src/gs-repos-dialog.c:168 +msgid "Enable Third-Party Software Repository?" +msgstr "Virkja hugbúnaðarsöfn utanaðkomandi aðila?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:240 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:250 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s er gefið út af “%s”." + +#: src/gs-common.c:259 +msgid "This software repository must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:269 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:275 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:282 +msgid "Don’t Warn Again" +msgstr "Ekki vara mig við aftur" + +#. TRANSLATORS: button text +#: src/gs-common.c:291 +msgid "Enable and Install" +msgstr "Virkja og setja upp" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:493 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72 +msgid "Details" +msgstr "Nánar" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:600 +msgid "_Accept" +msgstr "S_amþykkja" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:750 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: we've just removed some apps +#: src/gs-common.c:760 +msgid "An application has been removed" +msgid_plural "Applications have been removed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:766 +msgid "A restart is required for it to take effect." +msgid_plural "A restart is required for them to take effect." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: button text +#: src/gs-common.c:773 +msgid "Not Now" +msgstr "Ekki núna" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:869 +msgid "Just now" +msgstr "Í þessum töluðu orðum" + +#: src/gs-common.c:871 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "fyrir %d mínútu" +msgstr[1] "fyrir %d mínútum" + +#: src/gs-common.c:875 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "fyrir %d klukkustund" +msgstr[1] "fyrir %d klukkustundum" + +#: src/gs-common.c:879 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "fyrir %d degi" +msgstr[1] "fyrir %d dögum" + +#: src/gs-common.c:883 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "fyrir %d viku" +msgstr[1] "fyrir %d vikum" + +#: src/gs-common.c:887 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "fyrir %d mánuði" +msgstr[1] "fyrir %d mánuðum" + +#: src/gs-common.c:891 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "fyrir %d ári" +msgstr[1] "fyrir %d árum" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1255 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An application" +msgstr "Forrit" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Finna í hugbúnaði" + +#: src/gs-description-box.c:67 src/gs-description-box.c:269 +msgid "_Show More" +msgstr "_Birta meira" + +#: src/gs-description-box.c:67 +msgid "_Show Less" +msgstr "_Birta minna" + +#: src/gs-details-page.c:357 +msgid "Removing…" +msgstr "Fjarlægi…" + +#: src/gs-details-page.c:367 +msgid "Requires restart to finish install" +msgstr "Krefst endurræsingar til að ljúka uppsetningu" + +#: src/gs-details-page.c:374 +msgid "Requires restart to finish remove" +msgstr "Krefst endurræsingar til að ljúka fjarlægingu" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:391 +msgid "Pending installation…" +msgstr "Bíður uppsetningar…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:398 +msgid "Pending update…" +msgstr "Bíður uppfærslu…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:414 +msgid "Preparing…" +msgstr "Undirbý…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:417 +msgid "Uninstalling…" +msgstr "Tek út uppsetningu…" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#: src/gs-details-page.c:870 src/gs-details-page.c:896 +#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150 +msgid "_Install" +msgstr "Setja _inn" + +#: src/gs-details-page.c:886 +msgid "_Restart" +msgstr "Endu_rræsa" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:910 +msgid "_Install…" +msgstr "Setja _inn…" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1187 +#, c-format +msgid "Other Apps by %s" +msgstr "" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1570 +msgid "You need internet access to write a review" +msgstr "" + +#: src/gs-details-page.c:1732 src/gs-details-page.c:1748 +#, c-format +msgid "Unable to find “%s”" +msgstr "Gat ekki fundið \"%s\"" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "" + +#: src/gs-details-page.ui:39 +msgid "Loading application details…" +msgstr "" + +#: src/gs-details-page.ui:77 +msgid "" +"This software is not available in your language and will appear in US " +"English." +msgstr "" + +#: src/gs-details-page.ui:83 +msgid "Help _Translate" +msgstr "Hjálpa _til við þýðingu" + +#. TRANSLATORS: A label for a button to execute the selected application. +#: src/gs-details-page.ui:244 +msgid "_Open" +msgstr "_Opna" + +#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160 +msgid "_Update" +msgstr "_Uppfæra" + +#: src/gs-details-page.ui:319 +msgid "Downloading" +msgstr "Sæki gögn" + +#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135 +msgid "Add-ons" +msgstr "Viðbætur" + +#: src/gs-details-page.ui:467 +msgid "Selected add-ons will be installed with the application." +msgstr "" + +#: src/gs-details-page.ui:567 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" + +#: src/gs-details-page.ui:587 +msgid "Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:588 +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "" + +#: src/gs-details-page.ui:605 +msgid "No Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:606 +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "" + +#: src/gs-details-page.ui:624 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:641 +msgid "Software Repository Identified" +msgstr "" + +#: src/gs-details-page.ui:642 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" + +#: src/gs-details-page.ui:643 +msgid "Only use software repositories that you trust." +msgstr "" + +#: src/gs-details-page.ui:708 +msgid "No Metadata" +msgstr "Engin lýsigögn" + +#: src/gs-details-page.ui:717 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" + +#: src/gs-details-page.ui:745 +msgid "Project _Website" +msgstr "_Vefsvæði verkefnisins" + +#: src/gs-details-page.ui:762 +msgid "_Donate" +msgstr "St_yrkja" + +#: src/gs-details-page.ui:779 +msgid "Contribute _Translations" +msgstr "_Taka þátt í þýðingum" + +#: src/gs-details-page.ui:796 +msgid "_Report an Issue" +msgstr "Til_kynna um vandamál" + +#: src/gs-details-page.ui:813 +msgid "_Help" +msgstr "_Hjálp" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:908 +msgid "_Write Review" +msgstr "Skrifa _umsögn" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:945 +msgid "All Reviews" +msgstr "Allar umsagnir" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:244 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " og " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tiltækt letur fyrir %s skriftuna" +msgstr[1] "Tiltækt letur fyrir %s skrifturnar" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Tiltækur hugbúnaður fyrir %s" +msgstr[1] "Tiltækur hugbúnaður fyrir %s" + +#: src/gs-extras-page.c:242 +msgid "Requested software not found" +msgstr "Umbeðinn hugbúnaður fannst ekki" + +#: src/gs-extras-page.c:244 +msgid "Failed to find requested software" +msgstr "Mistókst að finna umbeðinn hugbúnað" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:343 +#, c-format +msgid "%s not found" +msgstr "%s fannst ekki" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:347 +msgid "on the website" +msgstr "á vefsvæðinu" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:354 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:358 src/gs-extras-page.c:369 src/gs-extras-page.c:380 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:365 src/gs-extras-page.c:387 +#, c-format +msgid "No applications are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:376 +#, c-format +msgid "%s is not available." +msgstr "%s er ekki tiltækt." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:391 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:398 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:402 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:409 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:413 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:435 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:481 +msgid "the documentation" +msgstr "handbækurnar" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the application name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:487 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:496 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "" + +#: src/gs-extras-page.c:874 +#, c-format +msgid "%s file format" +msgstr "%s skráasnið" + +#: src/gs-extras-page.c:1254 +msgid "Unable to Find Requested Software" +msgstr "" + +#: src/gs-extras-page.ui:6 +msgid "Codecs page" +msgstr "Síða um kóðunarlykla (codecs)" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Fyrri" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Næsta" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Listi yfir forrit í deiglunni" + +#: src/gs-hardware-support-context-dialog.c:577 +#: src/gs-hardware-support-context-dialog.c:586 +msgid "Desktop Support" +msgstr "Stuðningur við skjáborðsumhverfi" + +#: src/gs-hardware-support-context-dialog.c:578 +#: src/gs-hardware-support-context-dialog.c:587 +msgid "Supports being used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:580 +msgid "Desktop Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:581 +msgid "Not enough information to know if large screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:584 +msgid "Requires a large screen" +msgstr "Krefst stórs skjás" + +#: src/gs-hardware-support-context-dialog.c:589 +msgid "Desktop Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:590 +msgid "Cannot be used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:597 +#: src/gs-hardware-support-context-dialog.c:606 +msgid "Mobile Support" +msgstr "Stuðningur við farsíma" + +#: src/gs-hardware-support-context-dialog.c:598 +#: src/gs-hardware-support-context-dialog.c:607 +msgid "Supports being used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:600 +msgid "Mobile Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Not enough information to know if small screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:604 +msgid "Requires a small screen" +msgstr "Krefst lítils skjás" + +#: src/gs-hardware-support-context-dialog.c:609 +msgid "Mobile Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:610 +msgid "Cannot be used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:633 +#: src/gs-hardware-support-context-dialog.c:642 +msgid "Keyboard Support" +msgstr "Stuðningur við lyklaborð" + +#: src/gs-hardware-support-context-dialog.c:636 +msgid "Keyboard Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:637 +msgid "Not enough information to know if keyboards are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:639 +msgid "Keyboard Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:643 +msgid "Supports keyboards" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:645 +msgid "Keyboard Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:646 +msgid "Cannot be used with a keyboard" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:653 +#: src/gs-hardware-support-context-dialog.c:662 +msgid "Mouse Support" +msgstr "Stuðningur við mús" + +#: src/gs-hardware-support-context-dialog.c:654 +#: src/gs-hardware-support-context-dialog.c:660 +msgid "Requires a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:656 +msgid "Mouse Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:659 +msgid "Mouse Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:663 +msgid "Supports mice and pointing devices" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:665 +msgid "Mouse Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:666 +msgid "Cannot be used with a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:673 +#: src/gs-hardware-support-context-dialog.c:682 +msgid "Touchscreen Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:676 +msgid "Touchscreen Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:679 +msgid "Touchscreen Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:683 +msgid "Supports touchscreens" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:685 +msgid "Touchscreen Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:686 +msgid "Cannot be used with a touchscreen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:699 +msgid "Gamepad Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:700 +msgid "Requires a gamepad" +msgstr "Krefst leikjastýringar" + +#: src/gs-hardware-support-context-dialog.c:702 +msgid "Gamepad Support" +msgstr "Stuðningur við leikjafjarstýringar" + +#: src/gs-hardware-support-context-dialog.c:703 +msgid "Supports gamepads" +msgstr "" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:712 +#, c-format +msgid "%s probably works on this device" +msgstr "" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:719 +#, c-format +msgid "%s works on this device" +msgstr "" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:726 +#, c-format +msgid "%s will not work properly on this device" +msgstr "" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:733 +#, c-format +msgid "%s will not work on this device" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:5 +msgid "Hardware Support" +msgstr "Vélbúnaðarstuðningur" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-installed-page.c:812 src/gs-shell.ui:307 +#| msgid "Installed" +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Uppsett" + +#: src/gs-installed-page.ui:6 +msgid "Installed page" +msgstr "" + +#: src/gs-installed-page.ui:55 +msgid "In Progress" +msgstr "Í vinnslu" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:75 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Applications" +msgstr "Forrit" + +#: src/gs-installed-page.ui:95 +#| msgid "Applications" +msgid "Web Applications" +msgstr "Vefforrit" + +#: src/gs-installed-page.ui:115 +msgid "System Applications" +msgstr "Kerfisforrit" + +#: src/gs-license-tile.c:96 +msgid "Community Built" +msgstr "" + +#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98 +msgid "_Get Involved" +msgstr "_Taktu þátt" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:114 +#, c-format +msgid "" +"This software is developed in the open by a community of volunteers, and " +"released under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This software is developed in the open by a community of volunteers, and " +"released under the %s license.\n" +"\n" +"You can contribute and help make it even better." +msgstr "" + +#: src/gs-license-tile.c:127 +msgid "Proprietary" +msgstr "Séreignarhugbúnaður" + +#: src/gs-license-tile.c:133 +#| msgid "Learn" +msgid "_Learn More" +msgstr "_Kanna nánar" + +#: src/gs-license-tile.c:135 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:56 +#| msgid "Download Unsigned Software?" +msgid "Downloading software catalog" +msgstr "Sæki lista yfir hugbúnað" + +#: src/gs-loading-page.ui:6 +msgid "Loading page" +msgstr "Hleð inn síðu" + +#: src/gs-loading-page.ui:11 +msgid "Starting up…" +msgstr "Keyri upp…" + +#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256 +msgid "Automatic Updates Paused" +msgstr "Sjálfvirkar uppfærslur í bið" + +#: src/gs-metered-data-dialog.ui:9 +msgid "" +"The current network is metered. Metered connections have data limits or " +"charges associated with them. To save data, automatic updates have therefore " +"been paused.\n" +"\n" +"Automatic updates will be resumed when an un­metered network becomes " +"available. Until then, it is still possible to manually install updates.\n" +"\n" +"Alternatively, if the current network has been in­correctly identified as " +"being metered, this setting can be changed." +msgstr "" + +#: src/gs-metered-data-dialog.ui:17 +msgid "Open Network _Settings" +msgstr "Opna net_stillingar" + +#: src/gs-moderate-page.ui:6 +msgid "Moderate page" +msgstr "" + +#: src/gs-moderate-page.ui:71 +msgid "There are no reviews to moderate" +msgstr "" + +#: src/gs-origin-popover-row.c:105 +#| msgid "Unknown" +msgid "Unknown source" +msgstr "Óþekktur uppruni" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:108 +msgid "Beta" +msgstr "Beta-prófunarútgáfa" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:138 +#| msgid "_User" +msgid "User" +msgstr "Notandi" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:250 +msgid "Additions" +msgstr "Viðbætur" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:254 +msgid "Removals" +msgstr "Fjarlægingar" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:258 +#| msgid "Updates" +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Uppfærslur" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:262 +msgid "Downgrades" +msgstr "Niðurfærslur" + +#. Translators: This is a clickable link on the third party repositories info bar. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:876 +msgid "selected external sources" +msgstr "" + +#. Translators: This is the third party repositories info bar. The %s is replaced with "selected external sources" link. +#: src/gs-overview-page.c:878 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included." +msgstr "" +"Gefur aðgang að viðbótarhugbúnaði frá %s. Einhver séreignarhugbúnaður er þar " +"á meðal." + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:887 src/gs-repos-dialog.c:173 +msgid "Enable" +msgstr "Virkja" + +#. Translators: This is the title of the main page of the UI. +#. Translators: A label for a button to show all available software. +#: src/gs-overview-page.c:946 src/gs-shell.ui:294 +msgid "Explore" +msgstr "Kanna" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Yfirlitssíða" + +#: src/gs-overview-page.ui:35 +msgid "Enable Third Party Software Repositories?" +msgstr "Virkja hugbúnaðarsöfn annarra aðila?" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:180 +msgid "Other Categories" +msgstr "Aðrir flokkar" + +#: src/gs-overview-page.ui:221 +msgid "No Application Data Found" +msgstr "Engin forritsgögn fundust" + +#: lib/gs-plugin-loader.c:2829 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Óþekkt" + +#: src/gs-page.c:274 +msgid "User declined installation" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:365 +#, c-format +msgid "Prepare %s" +msgstr "Undirbúa %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:518 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Ertu viss um að þú viljir fjarlægja %s hugbúnaðarsafnið?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:522 +#, c-format +msgid "" +"All applications from %s will be uninstalled, and you will have to re-" +"install the repository to use them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:530 +#, c-format +msgid "Are you sure you want to uninstall %s?" +msgstr "Ertu viss um að þú viljir fjarlægja %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:533 +#, c-format +msgid "" +"%s will be uninstalled, and you will have to install it to use it again." +msgstr "" + +#: src/gs-prefs-dialog.ui:5 +msgid "Update Preferences" +msgstr "Kjörstillingar uppfærslu" + +#: src/gs-prefs-dialog.ui:16 +msgid "" +"To avoid charges and network caps, software updates are not automatically " +"downloaded on mobile or metered connections." +msgstr "" + +#: src/gs-prefs-dialog.ui:19 +msgid "Automatic Updates" +msgstr "Sjálfvirkar uppfærslur" + +#: src/gs-prefs-dialog.ui:20 +msgid "" +"Downloads and installs software updates in the background, when possible." +msgstr "" + +#: src/gs-prefs-dialog.ui:32 +msgid "Automatic Update Notifications" +msgstr "" + +#: src/gs-prefs-dialog.ui:33 +msgid "Show notifications when updates have been automatically installed." +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:89 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" + +#: src/gs-removal-dialog.ui:4 +msgid "Incompatible Software" +msgstr "" + +#: src/gs-removal-dialog.ui:23 +msgid "_Continue" +msgstr "_Halda áfram" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:239 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" + +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Gera hugbúnaðarsafn óvirkt?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Fjarlægja hugbúnaðarsafnið?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Gera óvirkt" + +#. TRANSLATORS: this is button text to remove a repo +#: src/gs-repos-dialog.c:257 +msgid "_Remove" +msgstr "Fja_rlægja" + +#: src/gs-repos-dialog.c:508 +msgid "Enable New Repositories" +msgstr "Virkja ný hugbúnaðarsöfn" + +#: src/gs-repos-dialog.c:509 +msgid "Turn on new repositories when they are added." +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:518 +msgid "more information" +msgstr "nánari upplýsingar" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:523 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Viðbótar-hugbúnaðarsöfn frá völdum utanaðkomandi aðilum - %s." + +#: src/gs-repos-dialog.c:528 +msgid "Fedora Third Party Repositories" +msgstr "Fedora -hugbúnaðarsöfn utanaðkomandi aðila" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:670 +msgid "the operating system" +msgstr "stýrikerfið" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:728 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#. button in the info bar +#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88 +msgid "Software Repositories" +msgstr "Hugbúnaðarsöfn" + +#: src/gs-repos-dialog.ui:53 +msgid "No Repositories" +msgstr "Engin hugbúnaðarsöfn" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repo-row.c:160 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "%u forrit uppsett" +msgstr[1] "%u forrit uppsett" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repo-row.c:167 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u viðbót uppsett" +msgstr[1] "%u viðbætur uppsettar" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repo-row.c:175 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u forrit" +msgstr[1] "%u forrit" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repo-row.c:181 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u viðbót" +msgstr[1] "%u viðbætur" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repo-row.c:188 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s og %s uppsett" +msgstr[1] "%s og %s uppsett" + +#. Translators: The first '%s' is replaced with a text like '10 applications installed', +#. the second '%s' is replaced with installation kind, like in case of Flatpak 'User Installation'. +#: src/gs-repo-row.c:243 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:78 +msgid "Hate it" +msgstr "Hata það" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:82 +msgid "Don’t like it" +msgstr "Líkar það ekki" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:86 +msgid "It’s OK" +msgstr "Það er í lagi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:90 +msgid "Like it" +msgstr "Líkar það" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:94 +msgid "Love it" +msgstr "Kann mjög vel við" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:118 +msgid "Please take more time writing the review" +msgstr "Taktu þér meiri tíma í að skrifa umsögnina" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:122 +msgid "Please choose a star rating" +msgstr "Veldu stjörnugjöf" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:126 +msgid "The summary is too short" +msgstr "Samantektin er of stutt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:130 +msgid "The summary is too long" +msgstr "Samantektin er of löng" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:134 +msgid "The description is too short" +msgstr "Lýsingin er of stutt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too long" +msgstr "Lýsingin er of löng" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:10 +msgid "Post Review" +msgstr "Senda umsögn" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:26 +msgid "_Post" +msgstr "_Senda inn" + +#: src/gs-review-dialog.ui:56 +msgid "Rating" +msgstr "Einkunn" + +#: src/gs-review-dialog.ui:88 +msgid "Summary" +msgstr "Samantekt" + +#: src/gs-review-dialog.ui:97 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:119 +msgctxt "app review" +msgid "Review" +msgstr "Yfirfara" + +#: src/gs-review-dialog.ui:128 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "" + +#: src/gs-review-dialog.ui:156 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be shown " +"publicly." +msgstr "" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u umsögn alls" +msgstr[1] "%u umsagnir alls" + +#: src/gs-review-histogram.ui:93 +msgid "out of 5 stars" +msgstr "af 5 stjörnum" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Óþekkt" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:220 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Þú getur kært umsagnir fyrir misnotkun, ókurteisi eða særandi framkomu." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:225 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Eftir að umsögn hefur verið kærð, er hún falin þar til stjórnandi hefur " +"yfirfarið málið." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:239 +msgid "Report Review?" +msgstr "Kæra umsögn?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:243 +msgid "Report" +msgstr "Kæra" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:84 +msgid "Was this review useful to you?" +msgstr "Var þessi umsögn hjálpleg?" + +#: src/gs-review-row.ui:100 +msgid "Yes" +msgstr "Já" + +#: src/gs-review-row.ui:108 +msgid "No" +msgstr "Nei" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:116 +msgid "Meh" +msgstr "Meh" + +#: src/gs-review-row.ui:128 +msgid "Report…" +msgstr "Kæra…" + +#: src/gs-review-row.ui:137 +msgid "Remove…" +msgstr "Fjarlægja…" + +#: src/gs-safety-context-dialog.c:144 +msgid "Check that you trust the vendor, as the application isn’t sandboxed" +msgstr "" + +#: src/gs-safety-context-dialog.c:147 +msgid "" +"Application isn’t sandboxed but the distribution has checked that it is not " +"malicious" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:160 +msgid "No Permissions" +msgstr "Engar heimildir" + +#: src/gs-safety-context-dialog.c:161 +msgid "App is fully sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:172 +msgid "Network Access" +msgstr "Netaðgangur" + +#: src/gs-safety-context-dialog.c:173 +msgid "Can access the internet" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Network Access" +msgstr "Engin netaðgangur" + +#: src/gs-safety-context-dialog.c:177 +msgid "Cannot access the internet" +msgstr "Getur ekki tengst við internetið" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:183 +msgid "Uses System Services" +msgstr "Notar kerfisþjónustur" + +#: src/gs-safety-context-dialog.c:184 +msgid "Can request data from system services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:191 +msgid "Uses Session Services" +msgstr "" + +#: src/gs-safety-context-dialog.c:192 +msgid "Can request data from session services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Device Access" +msgstr "Aðgangur tækis" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:203 +msgid "No Device Access" +msgstr "Enginn aðgangur tækis" + +#: src/gs-safety-context-dialog.c:204 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:210 +msgid "Legacy Windowing System" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:218 +msgid "Arbitrary Permissions" +msgstr "Ýmsar heimildir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "User Settings" +msgstr "Stillingar notanda" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:238 +msgid "Full File System Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:239 +msgid "Can read and write all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:247 +msgid "Home Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:248 +msgid "Can read and write all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:256 +msgid "Full File System Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:257 +msgid "Can read all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Home Folder Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:267 +msgid "Can read all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:276 +msgid "Download Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:277 +msgid "Can read and write all data in your downloads directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:288 +msgid "Download Folder Read Access" +msgstr "Lesaðgangur niðurhalsmöppu" + +#: src/gs-safety-context-dialog.c:289 +msgid "Can read all data in your downloads directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:299 +#| msgid "Can read/write all your data" +msgid "Can read and write all data in the directory" +msgstr "Getur lesið og skrifað öll gögn í möppunni" + +#: src/gs-safety-context-dialog.c:310 +#| msgid "Can read all your data" +msgid "Can read all data in the directory" +msgstr "Getur lesið öll gögn í möppunni" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:326 +msgid "No File System Access" +msgstr "Enginn aðgangur að skráakerfi" + +#: src/gs-safety-context-dialog.c:327 +msgid "Cannot access the file system at all" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:341 +msgid "Proprietary Code" +msgstr "Séreignarkóði" + +#: src/gs-safety-context-dialog.c:342 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:345 +msgid "Auditable Code" +msgstr "Yfirfaranlegur kóði" + +#: src/gs-safety-context-dialog.c:346 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:354 +msgid "App developer is verified" +msgstr "" + +#: src/gs-safety-context-dialog.c:355 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:366 +msgid "Insecure Dependencies" +msgstr "Óörugg kerfisákvæði" + +#: src/gs-safety-context-dialog.c:367 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:376 +#, c-format +msgid "%s is safe" +msgstr "%s er öruggt" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:383 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s er mögulega óöruggt" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:390 +#, c-format +msgid "%s is unsafe" +msgstr "%s er ekki öruggt" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:5 +msgid "Safety" +msgstr "Öryggi" + +#: src/gs-safety-context-dialog.ui:101 +msgid "License" +msgstr "Notkunarleyfi" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:141 +msgid "Source" +msgstr "Upptök" + +#: src/gs-safety-context-dialog.ui:181 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:205 +msgid "Outdated SDK version" +msgstr "" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Fyrri skjámynd" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Næsta skjámynd" + +#: src/gs-screenshot-carousel.ui:127 +msgid "No screenshot provided" +msgstr "Engin skjámynd uppgefin" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:362 src/gs-screenshot-image.c:419 +#: src/gs-screenshot-image.c:623 +msgid "Screenshot not found" +msgstr "Skjámynd fannst ekki" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:438 +msgid "Failed to load image" +msgstr "Get ekki opnað myndina" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:651 +msgid "Screenshot size not found" +msgstr "" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:733 +msgid "Could not create cache" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:747 +msgid "Screenshot not valid" +msgstr "Skjámynd ekki gild" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:797 +msgid "Screenshot not available" +msgstr "Skjámynd ekki tiltæk" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Skjámynd" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:180 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-search-page.ui:6 +msgid "Search page" +msgstr "Leitarsíða" + +#: src/gs-search-page.ui:17 +msgid "Search for Apps" +msgstr "Leita að forritum" + +#: src/gs-search-page.ui:46 +msgid "No Application Found" +msgstr "Ekkert forrit fannst" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1199 src/gs-shell.c:1204 src/gs-shell.c:1219 +#: src/gs-shell.c:1223 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. Translators: The '%s' is replaced with an error message, which had been shortened. +#. The dots at the end are there to highlight that to the user. +#: src/gs-shell.c:1240 +#, c-format +msgid "%s…" +msgstr "%s…" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1275 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1281 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1288 src/gs-shell.c:1328 +msgid "Unable to download updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1293 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1301 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1306 +msgid "Unable to download updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1312 +msgid "Unable to download updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to download updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1320 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to get list of updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1379 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1391 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1397 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1403 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1408 +msgid "Unable to install: the application has an invalid format" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1418 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1424 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1437 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1452 +#, c-format +msgid "Unable to install %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1497 +#, c-format +msgid "Unable to update %s from %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1504 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1511 +#, c-format +msgid "Unable to install updates from %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1515 +#, c-format +msgid "Unable to install updates as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1520 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1534 +#, c-format +msgid "Unable to install updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1543 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1548 +#, c-format +msgid "Unable to install updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1556 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to install updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1575 +#, c-format +msgid "" +"Unable to install updates: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1584 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1590 +#, c-format +msgid "Unable to install updates: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1598 +#, c-format +msgid "Unable to update %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to install updates: The battery level is too low" +msgstr "Tókst ekki að setja inn uppfærslur: Hleðsla rafhlöðu er of lítil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1615 +#, c-format +msgid "Unable to update %s" +msgstr "Tókst ekki að uppfæra %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1618 +#, c-format +msgid "Unable to install updates" +msgstr "Tókst ekki að setja inn uppfærslur" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1660 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1665 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1673 +#, c-format +msgid "" +"Unable to upgrade to %s: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1681 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1688 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1700 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1706 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1712 +#, c-format +msgid "Unable to upgrade to %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1721 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1758 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1763 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1774 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1780 +#, c-format +msgid "Unable to remove %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1792 +#, c-format +msgid "Unable to remove %s" +msgstr "Mistókst að fjarlægja %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1833 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1841 src/gs-shell.c:1857 src/gs-shell.c:1905 +#: src/gs-shell.c:1943 src/gs-shell.c:1996 +msgid "Sorry, something went wrong" +msgstr "Því miður, eitthvað fór úrskeiðis" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1846 src/gs-shell.c:1894 src/gs-shell.c:1932 +#: src/gs-shell.c:1975 +msgid "Not enough disk space — free up some space and try again" +msgstr "Það er ekki nóg diskpláss - losaðu meira pláss og prófaðu svo aftur" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1888 +msgid "Failed to install file: not supported" +msgstr "Ekki tókst að setja upp skrána: ekki studd" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1891 +msgid "Failed to install file: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1926 +msgid "Failed to install: not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1929 +msgid "Failed to install: authentication failed" +msgstr "Ekki tókst að setja upp skrána: auðkenning mistókst" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1970 +#, c-format +msgid "Unable to contact %s" +msgstr "Get ekki tengst %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'. +#: src/gs-shell.c:1980 +msgid "Software needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1984 +msgid "AC power is required" +msgstr "" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1987 +msgid "The battery level is too low" +msgstr "Hleðsla rafhlöðu er of lítil" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "Hugbúnaðar_söfn" + +#: src/gs-shell.ui:12 +msgid "_Update Preferences" +msgstr "Kjörstillingar _uppfærslu" + +#. button in the info bar +#: src/gs-shell.ui:98 +msgid "Examine Disk" +msgstr "Athuga disk" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-shell.ui:108 src/gs-updates-page.c:881 +msgid "Network Settings" +msgstr "Netstillingar" + +#. button in the info bar +#: src/gs-shell.ui:118 +msgid "Restart Now" +msgstr "Endurræsa núna" + +#. button in the info bar +#: src/gs-shell.ui:128 +msgid "More Information" +msgstr "Nánari upplýsingar" + +#: src/gs-shell.ui:189 +msgid "Search" +msgstr "Leita" + +#: src/gs-shell.ui:204 +msgid "Primary Menu" +msgstr "Aðalvalmynd" + +#: src/gs-shell.ui:274 +msgid "Find Out _More" +msgstr "_Frekari upplýsingar" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:328 +#| msgid "Updates" +msgctxt "Header bar button for list of apps to be updated" +msgid "Updates" +msgstr "Uppfærslur" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ekkert" + +#: src/gs-storage-context-dialog.c:139 +msgid "Application Data" +msgstr "Forritsgögn" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the application to run" +msgstr "" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Notandagögn" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the application" +msgstr "Gögn sem þú hefur búið til í forritinu" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Gögn í skyndiminni" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Bráðabirgðagögn tímabundið í skyndiminni" + +#: src/gs-storage-context-dialog.c:172 +msgid "The application itself" +msgstr "Forritið sjálft" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Nauðsynleg kerfisákvæði" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this application" +msgstr "" + +#: src/gs-storage-context-dialog.c:188 +#| msgid "Unknown" +msgctxt "Download size" +msgid "Unknown" +msgstr "Óþekkt" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:5 +msgid "Storage" +msgstr "Geymslurými" + +#. Translators: Please do not translate the markup or link href +#: src/gs-storage-context-dialog.ui:69 +msgid "" +"Cached data can be cleared from the _application settings." +msgstr "" + +#: src/gs-summary-tile.c:118 +#, c-format +msgid "%s (Installed)" +msgstr "%s (uppsett)" + +#: src/gs-summary-tile.c:123 +#, c-format +msgid "%s (Installing)" +msgstr "%s (set inn)" + +#: src/gs-summary-tile.c:128 +#, c-format +msgid "%s (Removing)" +msgstr "%s (fjarlægi)" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:65 src/gs-update-dialog.c:152 +msgid "Installed Updates" +msgstr "Uppsettar uppfærslur" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:131 +#, c-format +msgid "Installed on %s" +msgstr "Uppsett þann %s" + +#: src/gs-update-dialog.ui:77 +#| msgid "Software Updates Failed" +msgid "No Updates Installed" +msgstr "Engar uppfærslur settar inn" + +#: src/gs-update-monitor.c:213 +msgid "Software Updates Are Out of Date" +msgstr "" + +#: src/gs-update-monitor.c:214 +msgid "Please check for software updates." +msgstr "Athugaðu með hugbúnaðaruppfærslur." + +#: src/gs-update-monitor.c:220 +msgid "Critical Software Update Ready to Install" +msgstr "" + +#: src/gs-update-monitor.c:221 +msgid "An important software update is ready to be installed." +msgstr "" + +#: src/gs-update-monitor.c:224 +msgid "Critical Software Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:225 +msgid "Important: critical software updates are waiting." +msgstr "" + +#: src/gs-update-monitor.c:231 +msgid "Software Updates Ready to Install" +msgstr "Hugbúnaðaruppfærslur tilbúnar til uppsetningar" + +#: src/gs-update-monitor.c:232 +msgid "Software updates are waiting and ready to be installed." +msgstr "" + +#: src/gs-update-monitor.c:238 +msgid "Software Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:239 +msgid "Please download waiting software updates." +msgstr "" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:355 +#, c-format +msgid "%u Application Updated — Restart Required" +msgid_plural "%u Applications Updated — Restart Required" +msgstr[0] "%u forrit uppfært - Endurræsing nauðsynleg" +msgstr[1] "%u forrit uppfærð - Endurræsing nauðsynleg" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:361 +#, c-format +msgid "%u Application Updated" +msgid_plural "%u Applications Updated" +msgstr[0] "%u forrit uppfært" +msgstr[1] "%u forrit uppfærð" + +#. TRANSLATORS: %1 is an application name, e.g. Firefox +#: src/gs-update-monitor.c:372 +#, c-format +msgid "%s has been updated." +msgstr "%s hefur verið uppfært." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:375 +msgid "Please restart the application." +msgstr "Endurræstu forritið." + +#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox +#: src/gs-update-monitor.c:383 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s og %s hafa verið uppfærð." + +#. TRANSLATORS: at least one application needs restarting +#: src/gs-update-monitor.c:389 src/gs-update-monitor.c:408 +#, c-format +msgid "%u application requires a restart." +msgid_plural "%u applications require a restart." +msgstr[0] "%u forrit krefst endurræsingar." +msgstr[1] "%u forrit krefjast endurræsingar." + +#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox +#: src/gs-update-monitor.c:401 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Innifelur %s, %s og %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:671 src/gs-updates-page.ui:20 +msgid "Operating System Updates Unavailable" +msgstr "Uppfærslur stýrikerfis ekki tiltækar" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:673 +msgid "Upgrade to continue receiving security updates." +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:728 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:732 +msgid "Software Upgrade Available" +msgstr "Hugbúnaðaruppfærsla tiltæk" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1137 +msgid "Software Updates Failed" +msgstr "Hugbúnaðaruppfærslur mistókust" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1139 +msgid "An important operating system update failed to be installed." +msgstr "" + +#: src/gs-update-monitor.c:1140 +msgid "Show Details" +msgstr "Sýna nánar" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1162 +msgid "System Upgrade Complete" +msgstr "Stýrikerfisuppfærslu er lokið" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1167 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Velkomin í %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1173 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1177 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1188 +msgctxt "updates" +msgid "Review" +msgstr "Yfirfara" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1237 +msgid "Failed To Update" +msgstr "Mistókst að uppfæra" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1242 +msgid "The system was already up to date." +msgstr "Kerfið var þegar með öllum nýjasta hugbúnaðinum." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1247 +msgid "The update was cancelled." +msgstr "Hætt var við uppfærsluna." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1252 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1257 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1262 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1266 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:247 +#, c-format +msgid "Last checked: %s" +msgstr "Síðast athugað: %s" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:559 +#, c-format +msgid "%s %s is no longer supported." +msgstr "%s %s er ekki lengur stutt." + +#: src/gs-updates-page.c:563 +msgid "Your operating system is no longer supported." +msgstr "Stýrikerfið þitt er ekki lengur stutt." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:568 +msgid "This means that it does not receive security updates." +msgstr "" + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:572 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:849 +msgid "Charges May Apply" +msgstr "Gæti leitt til kostnaðar" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:853 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:857 +msgid "Check _Anyway" +msgstr "_Athuga samt" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:873 +msgid "No Network" +msgstr "Engin nettenging" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:877 +msgid "Internet access is required to check for updates." +msgstr "" + +#: src/gs-updates-page.c:1250 +msgid "Check for updates" +msgstr "Leita að uppfærslum" + +#: src/gs-updates-page.c:1286 +#| msgid "Updates" +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Uppfærslur" + +#: src/gs-updates-page.ui:6 +msgid "Updates page" +msgstr "Uppfærslusíða" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:82 +msgid "Loading Updates…" +msgstr "Hleð inn uppfærslum…" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:95 +msgid "This could take a while." +msgstr "Þetta gæti tekið nokkra stund." + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:203 +msgid "Up to Date" +msgstr "Allt uppfært" + +#: src/gs-updates-page.ui:242 +msgid "Use Mobile Data?" +msgstr "Nota farsímagögn?" + +#: src/gs-updates-page.ui:243 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#: src/gs-updates-page.ui:246 +msgid "_Check Anyway" +msgstr "Athu_ga samt" + +#: src/gs-updates-page.ui:262 +msgid "No Connection" +msgstr "Engin nettenging" + +#: src/gs-updates-page.ui:263 +msgid "Go online to check for updates." +msgstr "Farðu á netið til að athuga með uppfærslur." + +#: src/gs-updates-page.ui:266 +msgid "_Network Settings" +msgstr "_Netstillingar" + +#: src/gs-updates-page.ui:295 +msgid "Error" +msgstr "Villa" + +#: src/gs-updates-page.ui:296 +msgid "Updates are automatically managed." +msgstr "" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:312 +msgid "Restart & Update" +msgstr "Endurræsa & uppfæra" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-section.c:318 +msgid "Update All" +msgstr "Uppfæra allt" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:450 +msgid "Integrated Firmware" +msgstr "Innbyggður grunnhugbúnaður/firmware" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:455 +msgid "Requires Restart" +msgstr "Krefst endurræsingar" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:460 +msgid "Application Updates" +msgstr "Uppfærslur forrita" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:465 +msgid "Device Firmware" +msgstr "Grunnhugbúnaður/firmware tækja" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72 +#: plugins/packagekit/gs-packagekit-task.c:155 +msgid "_Download" +msgstr "Sæ_kja" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:90 +#, c-format +msgid "%s %s Available" +msgstr "%s %s tiltækt" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "%s Available" +msgstr "%s tiltækt" + +#: src/gs-upgrade-banner.c:143 +msgid "Learn about the new version" +msgstr "Kynntu þér nýju útgáfuna" + +#: src/gs-upgrade-banner.c:167 +msgid "Downloading…" +msgstr "Sæki gögn…" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:185 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s af %s sótt" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:189 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% sótt" + +#: src/gs-upgrade-banner.ui:42 +msgid "A major upgrade, with new features and added polish." +msgstr "" + +#: src/gs-upgrade-banner.ui:187 +msgid "_Restart & Upgrade" +msgstr "Endu_rræsa & uppfæra" + +#: src/gs-upgrade-banner.ui:201 +msgid "Remember to back up data and files before upgrading." +msgstr "" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Bæta við, fjarlægja eða uppfæra hugbúnað á þessari tölvu" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:67 +msgid "System Updates" +msgstr "Kerfisuppfærslur" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:72 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:155 +msgid "Downloading featured images…" +msgstr "" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:637 +#, c-format +msgid "%s update with new features and fixes." +msgstr "" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:970 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#: plugins/epiphany/gs-plugin-epiphany.c:498 +#| msgid "GNOME Software" +msgid "GNOME Web" +msgstr "GNOME vefforrit" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +#| msgid "Desktop Support" +msgid "Web Apps Support" +msgstr "Stuðningur við vefforrit" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257 +msgid "Downloading upgrade information…" +msgstr "Sæki upplýsingar um uppfærslu…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:405 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak-stuðningur" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:313 +#, c-format +#| msgid "System Updates" +msgid "System folder %s" +msgstr "Kerfismappa %s" + +#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315 +#, c-format +#| msgid "Home folder" +msgid "Home subfolder %s" +msgstr "Undirmappa heimamöppu %s" + +#: plugins/flatpak/gs-flatpak.c:316 +#| msgid "Home folder" +msgid "Host system folders" +msgstr "Kerfismöppur hýsivélar" + +#: plugins/flatpak/gs-flatpak.c:317 +msgid "Host system configuration from /etc" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:318 +#| msgid "Desktop Support" +msgid "Desktop folder" +msgstr "Skjáborðsmappa" + +#: plugins/flatpak/gs-flatpak.c:318 +#, c-format +#| msgid "Desktop Support" +msgid "Desktop subfolder %s" +msgstr "Undirmappa skjáborðsmöppu %s" + +#: plugins/flatpak/gs-flatpak.c:319 +#| msgid "Home folder" +msgid "Documents folder" +msgstr "Skjalamappa" + +#: plugins/flatpak/gs-flatpak.c:319 +#, c-format +#| msgid "Home folder" +msgid "Documents subfolder %s" +msgstr "Undirmappa skjalamöppu %s" + +#: plugins/flatpak/gs-flatpak.c:320 +#| msgctxt "Menu of Audio & Video" +#| msgid "Music Players" +msgid "Music folder" +msgstr "Tónlistarmappa" + +#: plugins/flatpak/gs-flatpak.c:320 +#, c-format +#| msgctxt "Menu of Audio & Video" +#| msgid "Music Players" +msgid "Music subfolder %s" +msgstr "Undirmappa tónlistarmöppu %s" + +#: plugins/flatpak/gs-flatpak.c:321 +#| msgid "Picture" +msgid "Pictures folder" +msgstr "Myndamappa" + +#: plugins/flatpak/gs-flatpak.c:321 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Undirmappa myndamöppu %s" + +#: plugins/flatpak/gs-flatpak.c:322 +msgid "Public Share folder" +msgstr "Mappa fyrir opinbera deilingu" + +#: plugins/flatpak/gs-flatpak.c:322 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Undirmappa fyrir opinbera deilingu %s" + +#: plugins/flatpak/gs-flatpak.c:323 +#| msgid "Home folder" +msgid "Videos folder" +msgstr "Myndskeiðamappa" + +#: plugins/flatpak/gs-flatpak.c:323 +#, c-format +#| msgid "%s is suitable for %s" +msgid "Videos subfolder %s" +msgstr "Undirmappa myndskeiðamöppu %s" + +#: plugins/flatpak/gs-flatpak.c:324 +#| msgid "Home folder" +msgid "Templates folder" +msgstr "Sniðmátamappa" + +#: plugins/flatpak/gs-flatpak.c:324 +#, c-format +msgid "Templates subfolder %s" +msgstr "Undirmappa sniðmátamöppu %s" + +#: plugins/flatpak/gs-flatpak.c:325 +msgid "User cache folder" +msgstr "Skyndiminnismappa notanda" + +#: plugins/flatpak/gs-flatpak.c:325 +#, c-format +msgid "User cache subfolder %s" +msgstr "Undirmappa fyrir skyndiminni notanda %s" + +#: plugins/flatpak/gs-flatpak.c:326 +#| msgid "%s Configuration Update" +msgid "User configuration folder" +msgstr "Mappa fyrir notandastillingar" + +#: plugins/flatpak/gs-flatpak.c:326 +#, c-format +#| msgid "%s Configuration Update" +msgid "User configuration subfolder %s" +msgstr "Undirmappa fyrir notandastillingar %s" + +#: plugins/flatpak/gs-flatpak.c:327 +#| msgid "User Data" +msgid "User data folder" +msgstr "Gagnamappa notanda" + +#: plugins/flatpak/gs-flatpak.c:327 +#, c-format +msgid "User data subfolder %s" +msgstr "Undirmappa fyrir gögn notanda %s" + +#: plugins/flatpak/gs-flatpak.c:328 +#| msgid "Home folder" +msgid "User runtime folder" +msgstr "Keyrslumappa notanda" + +#: plugins/flatpak/gs-flatpak.c:328 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Undirmappa fyrir keyrslumöppu notanda %s" + +#: plugins/flatpak/gs-flatpak.c:386 +#, c-format +#| msgid "No File System Access" +msgid "Filesystem access to %s" +msgstr "Aðgangur að skráakerfi fyrir %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1403 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Næ í flatpak-lýsigögn fyrir %s…" + +#: plugins/flatpak/gs-flatpak.c:3580 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Mistókst að fínstilla viðbótina ‘%s’: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Uppsetning notanda" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Uppsetning kerfis" + +#: plugins/flatpak/gs-plugin-flatpak.c:1037 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1051 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1317 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:134 +#, c-format +msgid "%s Device Update" +msgstr "%s uppfærsla tækis" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:139 +#, c-format +msgid "%s System Update" +msgstr "%s kerfisuppfærsla" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:144 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s uppfærsla ívafinna stýringa" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:149 +#, c-format +msgid "%s ME Update" +msgstr "%s ME uppfærsla" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:154 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s ME fyrirtækjauppfærsla" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:159 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s ME notendauppfærsla" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:165 +#, c-format +msgid "%s Controller Update" +msgstr "%s stýringaruppfærsla" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:171 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt-stýringaruppfærsla" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:176 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s uppfærsla CPU-Microcode" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:181 +#, c-format +msgid "%s Configuration Update" +msgstr "%s uppsetningaruppfærsla" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:185 +#, c-format +msgid "%s Battery Update" +msgstr "%s rafhlöðuuppfærsla" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:190 +#, c-format +msgid "%s Camera Update" +msgstr "%s myndavélaruppfærsla" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:194 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM uppfærsla" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:198 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s uppfærsla snertiplatta" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:202 +#, c-format +msgid "%s Mouse Update" +msgstr "%s músaruppfærsla" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:206 +#, c-format +msgid "%s Keyboard Update" +msgstr "Lyklaborðsuppfærsla %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:210 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s geymslustýringaruppfærsla" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:215 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s netkortsuppfærsla" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:220 +#, c-format +msgid "%s Display Update" +msgstr "%s skjákortsuppfærsla" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:225 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC uppfærsla" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:230 +#, c-format +#| msgid "%s Device Update" +msgid "%s USB Receiver Update" +msgstr "%s uppfærsla USB-móttakara" + +#: plugins/fwupd/gs-plugin-fwupd.c:1240 +msgid "Firmware" +msgstr "Grunnhugbúnaður" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Stuðningur við uppfærslu grunnhugbúnaður (firmware)" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Veitir stuðning við uppfærslu grunnhugbúnaðar" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "Install Unsigned Software?" +msgstr "Setja inn óundirritaðan hugbúnað?" + +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "Download Unsigned Software?" +msgstr "Sækja óundirritaðan hugbúnað?" + +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "Update Unsigned Software?" +msgstr "Uppfæra óundirritaðan hugbúnað?" + +#: plugins/packagekit/gs-packagekit-task.c:159 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" + +#: plugins/packagekit/gs-plugin-packagekit.c:367 +msgid "Packages" +msgstr "Pakkar" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690 +msgid "Operating System (OSTree)" +msgstr "Stýrikerfi (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap-miðstöð" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Stuðningur við Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap-pakkar eru algildir Linux-pakkar" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Forritaumsýsla fyrir GNOME" + +#~ msgid "A list of popular applications" +#~ msgstr "Listi yfir vinsæl forrit" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Name" +#~ msgstr "Heiti" + +#~ msgid "system" +#~ msgstr "kerfis" + +#~ msgid "user" +#~ msgstr "notanda" + +#~ msgid "Channel" +#~ msgstr "Rás" + +#~ msgid "Branch" +#~ msgstr "Grein" + +#~ msgid "URL" +#~ msgstr "Slóð (URL)" + +#~ msgid "Installation" +#~ msgstr "Uppsetning" + +#~ msgid "Version" +#~ msgstr "Útgáfa" + +#~| msgid "Can access D-Bus services on the system bus" +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Hefur aðgang að allskyns skrám á skráarkerfinu" + +#~ msgid "Checking…" +#~ msgstr "Athuga..." + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~| msgid "Removing…" +#~ msgid "Loading…" +#~ msgstr "Hleð inn..." + +#~ msgid "_Add shortcut" +#~ msgstr "Bæt_a við flýtilykli" + +#~ msgid "Re_move shortcut" +#~ msgstr "Fjarlæ_gja flýtilykil" + +#~ msgid "Welcome" +#~ msgstr "Velkomin" + +#~ msgid "Welcome to Software" +#~ msgstr "Velkomin í hugbúnaðarstýringuna" + +#~| msgid "Free Software" +#~ msgid "_Browse Software" +#~ msgstr "Skoða hug_búnað" + +#~ msgid "OS Updates" +#~ msgstr "Uppfærslur stýrikerfis" + +#~ msgid "Select All" +#~ msgstr "Velja allt" + +#~ msgid "Select None" +#~ msgstr "Velja ekkert" + +#~ msgid "_All" +#~ msgstr "_Allt" + +#~ msgid "_Installed" +#~ msgstr "U_ppsett" + +#~ msgid "_Updates" +#~ msgstr "_Uppfærslur" + +#~ msgid "Folder Name" +#~ msgstr "Heiti möppu" + +#~ msgid "_Add" +#~ msgstr "_Bæta við" + +#~ msgid "Add to Application Folder" +#~ msgstr "Bæta við forritamöppu" + +#~ msgid "About %s" +#~ msgstr "Um %s" + +#~ msgid "Remove" +#~ msgstr "Fjarlægja" + +#~ msgid "Continue" +#~ msgstr "Halda áfram" + +#~ msgid "Use" +#~ msgstr "Nota" + +#~| msgid "_Add to Folder…" +#~ msgid "Add another…" +#~ msgstr "Bæta við öðru…" + +#~ msgid "Featured %s" +#~ msgstr "%s í deiglunni" + +#~ msgid "Top Rated" +#~ msgstr "Hæsta einkunn" + +#~ msgid "Show" +#~ msgstr "Birta" + +#~ msgid "Sort" +#~ msgstr "Raða" + +#~ msgid "_Launch" +#~ msgstr "_Ræsa" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Óþekkt" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Aldrei" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "Óþekkt" + +#~ msgid "Public domain" +#~ msgstr "Almenningseign" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Localized in your Language" +#~ msgstr "Staðfært tungumálið þitt" + +#~ msgid "Category" +#~ msgstr "Flokkur" + +#~ msgid "Free" +#~ msgstr "Frjálst" + +#~ msgid "Proprietary Software" +#~ msgstr "Séreignarhugbúnaður" + +#~ msgid "Unknown Software License" +#~ msgstr "Óþekkt hugbúnaðarleyfi" + +#~ msgid "Failed to load file" +#~ msgstr "Mistókst að hlaða inn skrá" + +#~ msgid "Unsaved changes" +#~ msgstr "Óvistaðar breytingar" + +#~ msgid "Throw away changes" +#~ msgstr "Henda breytingum" + +#~ msgid "_Save" +#~ msgstr "Vi_sta" + +#~ msgid "Failed to save file" +#~ msgstr "Tókst ekki að vista skrá" + +#, fuzzy +#~| msgid "GNOME Software" +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME hugbúnaður" + +#~ msgid "Error message here" +#~ msgstr "Villuskilaboð hér" + +#~ msgid "App ID" +#~ msgstr "Auðkenni forrits" + +#~ msgid "Category Featured" +#~ msgstr "Flokkur í deiglunni" + +#~ msgid "Undo" +#~ msgstr "Afturkalla" + +#~ msgid "New Banner" +#~ msgstr "Nýr borði" + +#~ msgid "Import from file" +#~ msgstr "Flytja inn úr skrá" + +#~ msgid "Export to file" +#~ msgstr "Flytja út í skrá" + +#~ msgid "OS Upgrade" +#~ msgstr "Uppfærsla stýrikerfis" + +#~ msgid "Spacing" +#~ msgstr "Millibil" + +#~ msgid "The amount of space between children" +#~ msgstr "Bil milli afleiða" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Fjarlægt" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Uppsett" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Uppfært" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Óþekkt" + +#~ msgid "History" +#~ msgstr "Ferill" + +#~ msgid "Click on items to select them" +#~ msgstr "Smelltu á atriði til að velja þau" + +#~ msgid "Select" +#~ msgstr "Velja" + +#~ msgid "_Add to Folder…" +#~ msgstr "Bæt_a í möppu…" + +#~ msgid "_Move to Folder…" +#~ msgstr "Flytja í _möppu…" + +#~ msgid "_Remove from Folder" +#~ msgstr "Fja_rlægja úr möppu" + +#~ msgid "Format" +#~ msgstr "Snið" + +#~ msgid "More…" +#~ msgstr "Meira…" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Sumt af þessu hugbúnaði er séreignarhugbúnaður og er þar af leiðandi með " +#~ "hömlur á notkun, deilingu og aðgangi að grunnkóða." + +#~| msgid "System Applications" +#~ msgid "Featured Applications" +#~ msgstr "Helstu forrit" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Ertu viss um að þú viljir fjarlægja %s?" + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Remove “%s”?" +#~ msgstr "Fjarlægja „%s“?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Gera “%s” óvirkt?" + +#~ msgid "_Enable" +#~ msgstr "V_irkja" + +#~ msgid "_Remove…" +#~ msgstr "Fja_rlægja…" + +#~ msgid "_Disable…" +#~ msgstr "_Gera óvirkt…" + +#~ msgid "Disabling" +#~ msgstr "Geri óvirkt" + +#~ msgid "Enabled" +#~ msgstr "Virkt" + +#~ msgid "Disabled" +#~ msgstr "Óvirkt" + +#~ msgid "_Remove All" +#~ msgstr "Fja_rlægja allt" + +#~ msgid "Restart & Install" +#~ msgstr "Endurræsa og setja inn" + +#~ msgid "View" +#~ msgstr "Skoða" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Í gær kl. %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Í gær, kl. %I:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Fyrir þremur dögum síðan" + +#~ msgid "Four days ago" +#~ msgstr "Fyrir fjórum dögum síðan" + +#~ msgid "Five days ago" +#~ msgstr "Fyrir fimm dögum síðan" + +#~ msgid "Six days ago" +#~ msgstr "Fyrir sex dögum síðan" + +#~ msgid "Two weeks ago" +#~ msgstr "Fyrir tveimur vikum síðan" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell Extension skeljarviðbætur" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgid "Audio & Video" +#~ msgstr "Hjóð/Myndskeið" + +#~ msgid "Developer Tools" +#~ msgstr "Forritunartól" + +#~ msgid "Education & Science" +#~ msgstr "Menntun & vísindi" + +#~ msgid "Games" +#~ msgstr "Leikir" + +#~ msgid "Graphics & Photography" +#~ msgstr "Ljósmyndun og myndefni" + +#~ msgid "Productivity" +#~ msgstr "Vinna" + +#~ msgid "Communication & News" +#~ msgstr "Samskipti og fréttir" + +#~ msgid "Reference" +#~ msgstr "Uppflettirit" + +#~ msgid "Utilities" +#~ msgstr "Nytjatól" + +#~| msgctxt "Menu of Add-ons" +#~| msgid "Shell Extensions" +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell Extension skeljarviðbætur" + +#~ msgid "Email address" +#~ msgstr "Tölvupóstfang" + +#~ msgid "PIN" +#~ msgstr "PIN-númer" + +#~ msgid "Authenticate" +#~ msgstr "Auðkenna" + +#~ msgid "_About" +#~ msgstr "_Um hugbúnaðinn" + +#~ msgid "_Quit" +#~ msgstr "_Hætta" + +#~| msgid "More information" +#~ msgid "For more information, visit %s." +#~ msgstr "Til að vita meira ættirðu að skoða %s." + +#~| msgid "_Update" +#~ msgid "U_pdate All" +#~ msgstr "U_ppfæra allt" + +#~ msgid "Restart & _Install" +#~ msgstr "Endurræsa og setja _inn" + +#~| msgid "Software" +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Total" +#~ msgstr "Samtals" + +#~ msgid "_Install All" +#~ msgstr "Setja allt _inn" + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Upptök séreignarhugbúnaðar" + +#~ msgid "Added" +#~ msgstr "Bætt við" + +#~ msgid "Website" +#~ msgstr "Vefsvæði" + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Ekkert" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Stjörnufræði" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Efnafræði" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Stærðfræði" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Allt" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Í deiglunni" + +#~ msgid "Science" +#~ msgstr "Vísindi" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..b8f6e29 --- /dev/null +++ b/po/it.po @@ -0,0 +1,6239 @@ +# Italian translation of gnome-software +# Copyright (C) 2013-2019, 2020 Free Software Foundation +# This file is distributed under the same license as the gnome-software +# package. +# Milo Casagrande , 2020. +# Gianvito Cavasoli , 2013-2023. +# Vittorio Monti , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software 3.26\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-05-24 20:19+0000\n" +"PO-Revision-Date: 2024-05-25 00:27+0300\n" +"Last-Translator: Vittorio Monti \n" +"Language-Team: Italian \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" +"Generated-By: Babel 2.15.0\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Installa e aggiorna le applicazioni" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Software consente di trovare e installare nuove applicazioni, estensioni di " +"sistema e rimuovere applicazioni già esistenti." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Software mette in mostra e in evidenza le applicazioni più popolari con " +"utili descrizioni e varie schermate per ognuna di esse. Le applicazioni " +"possono essere trovate tramite l'esplorazione dell'elenco delle categorie o " +"tramite la ricerca. Software consente anche di aggiornare il sistema usando " +"un aggiornamento non in linea." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Riquadro panoramica" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Riquadro dettagli" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Riquadro installate" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Riquadro aggiornamenti" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "I dettagli dell'aggiornamento" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2507 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Il progetto GNOME" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Installa un file appstream in una posizione del sistema" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Installazione di un file appstream in una posizione del sistema" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Un elenco di progetti compatibili" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Questo è un elenco di progetti compatibili che si dovrebbero mostrare, come " +"GNOME, KDE e XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Indica se gestire gli aggiornamenti e gli avanzamenti in GNOME Software" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Se disabilitata, GNOME Software nasconderà il riquadro aggiornamenti e non " +"eseguirà alcuna azione automatica degli aggiornamenti o proporrà degli " +"avanzamenti." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Scarica automaticamente e installa gli aggiornamenti" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Se abilitata, GNOME Software scaricherà automaticamente in background gli " +"aggiornamenti software, e installerà anche quelli che non richiedono un " +"riavvio." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notifica l'utente sul software aggiornato in background" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Se abilitata, GNOME Software notificherà sul software aggiornato mentre " +"l'utente era inattivo." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Indica se aggiornare automaticamente quando si è su una connessione a consumo" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Se abilitata, GNOME Software aggiornerà automaticamente in background anche " +"quando si sta usando una connessione a consumo (eventualmente scaricando " +"alcuni metadati, controllando gli aggiornamenti, eccetera, che possono " +"incorrere in costi per l'utente)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Indica se è la prima volta che si esegue GNOME Software" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Mostra le stelle di valutazione accanto alle applicazioni" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtra applicazioni basate sul ramo predefinito impostato per il remoto" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Le applicazioni non libere mostreranno un dialogo di avvertimento prima di " +"installarle" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Quando applicazioni non libere sono installate un dialogo di avvertimento " +"potrebbe essere visualizzato. Questo indica se sopprimere l'avviso." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "La data del controllo dell'ultimo aggiornamento" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "La data dell'ultima notifica di avanzamento" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "La data dell'ultima notifica di aggiornamento" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"La data del primo aggiornamento di sicurezza, azzerata dopo l'aggiornamento" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "La data dell'ultimo aggiornamento" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"La data in secondi per verificare che la schermata upstream sia ancora valida" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Scegliere un valore alto sta a significare meno traffico in entrata e in un " +"uscita al server remoto ma gli aggiornamenti alle schermate potrebbero " +"prendere più tempo per essere mostrate all'utente. Un valore di 0 significa " +"non controllare mai il server se l'immagine esiste già nella cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Il server da usare per le recensioni delle applicazioni" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Il punteggio minimo di karma per le recensioni" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" +"Recensioni con karma inferiore a questo numero non saranno visualizzate." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Un elenco di repository ufficiali che non devono essere considerati di terze " +"parti" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Un elenco di repository necessari che non possono essere disabilitati o " +"rimossi" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Un elenco di repository ufficiali che devono essere considerati software " +"libero" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"L'URL della licenza da usare quando un'applicazione è stata considerata " +"software libero" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Dove possibile, installare le applicazioni raggruppate per tutti gli utenti " +"sul sistema" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Consente l'accesso alla finestra di dialogo Repository software" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Propone gli avanzamenti di pre-rilascio" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Mostra alcuni elementi di interfaccia che informano l'utente che " +"un'applicazione non è libera" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Mostra la dimensione installata per le applicazioni nell'elenco di quelle " +"installate" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://it.wikipedia.org/wiki/Software_proprietario'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "L'URI che spiega il software non libero e proprietario" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Un elenco di URL che punta a file appstream che saranno scaricati in una " +"cartella swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Installa un file AppStream in una posizione del sistema per tutti gli " +"utenti. Se FALSO, i file saranno installati in una directory $XDG_DATA_HOME/" +"swcatalog/xml non standard" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Ordine di priorità dei formati di pacchetti da preferire, con i più " +"importanti formati elencati per primi. Una disposizione vuota indicherà " +"l'ordine predefinito. Si presume che i formati omessi saranno elencati per " +"ultimi. Esempi di formati di pacchetti sono: deb, flatpak, rpm, snap. " +"Opzionalmente i formati possono essere specificati con un nome di origine " +"diviso da due punti, per esempio: 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"La data dell'ultimo tentativo di rimuovere le runtime non utilizzate di " +"Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Imposta a «VERO» per mostrare solo le applicazioni con licenza libera e " +"nascondere quelle proprietarie." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Imposta a «VERO» per mostrare solo le applicazioni degli sviluppatori la cui " +"identità è stata verificata." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "La data degli ultimi aggiornamenti ricevuti." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Una stringa che salva l'identificativo di gnome-online-account usato per " +"l'accesso" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Installatore globale di sistema GNOME Software AppStream" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Analisi degli argomenti della riga di comando non riuscita" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "È necessario specificare esattamente un solo nome di file" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Questo programma può essere usato solo dall'utente root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Convalida del tipo di contenuto non riuscita: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Spostamento non riuscito: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Installa software" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Installa il software selezionato sul sistema" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violenza animata" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nessuna informazione riguardante la violenza in cartoni animati" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violenza fantastica" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nessuna informazione riguardante la violenza di genere fantastico" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violenza realistica" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nessuna informazione riguardante la violenza realistica" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violenza raffigurante spargimento di sangue" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "" +"Nessuna informazione riguardante la violenza raffigurante spargimento di " +"sangue" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violenza sessuale" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nessuna informazione riguardante la violenza sessuale" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nessuna informazione riguardante dei riferimenti all'alcol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narcotici" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nessuna informazione riguardante dei riferimenti alle droghe illecite" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabacco" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "" +"Nessuna informazione riguardante dei riferimenti a dei prodotti del tabacco" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nudità" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nessuna informazione riguardante le nudità di qualsiasi tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Temi sessuali" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Nessuna informazione riguardante riferimenti o raffigurazioni di natura " +"sessuale" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Volgarità" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nessuna informazione riguardante qualsiasi sorta di volgarità" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Umorismo inappropriato" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nessuna informazione riguardante l'umorismo inappropriato" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminazione" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "" +"Nessuna informazione riguardante qualsiasi sorta di linguaggio " +"discriminatorio" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Pubblicità" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nessuna informazione riguardante qualsiasi sorta di pubblicità" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Gioco d'azzardo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nessuna informazione riguardante qualsiasi sorta di gioco d'azzardo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Acquisti" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nessuna informazione riguardante l'abilità di spendere soldi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Conversazioni scritte fra utenti" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" +"Nessuna informazione riguardante l'uso di conversazioni scritte con altri " +"utenti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Conversazioni vocali fra utenti" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" +"Nessuna informazione riguardante l'uso di conversazioni vocali con altri " +"utenti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Dettagli di contatto" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nessuna informazione riguardante la condivisione del nome utente dei social " +"network o indirizzi di posta elettronica" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informazioni di identificazione" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Nessuna informazione riguardante la condivisione delle informazioni " +"dell'utente con terze parti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Condivisione della posizione" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Nessuna informazione riguardante la condivisione delle posizione fisica con " +"altri utenti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Omosessualità" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nessuna informazione riguardante dei riferimenti sull'omosessualità" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostituzione" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nessuna informazione riguardante dei riferimenti sulla prostituzione" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adulterio" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nessuna informazione riguardante dei riferimenti all'adulterio" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Personaggi sessualizzati" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nessuna informazione riguardante dei personaggi sessualizzati" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanazione" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nessuna informazione riguardante dei riferimenti alla profanazione" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Resti umani" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "" +"Nessuna informazione riguardante la visibilità di resti di corpi umani " +"deceduti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Schiavitù" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nessuna informazione riguardante dei riferimenti alla schiavitù" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Non include riferimenti alle droghe" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" +"Non include imprecazioni, profanità e qualsiasi altro tipo di linguaggio " +"forte" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Non include pubblicità o transazioni monetarie" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Non include sesso o nudità" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Non include funzionalità di conversazioni scritte non controllate" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Non include violenza" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Droghe" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Linguaggio forte" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Soldi" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sociale" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violenza" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Tutte" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s ha una fascia d'età sconosciuta" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s è adatta per tutti" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s è adatta per i molto piccoli" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s è adatta per i bambini piccoli" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s è adatta per i bambini" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s è adatta per gli adolescenti" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s è adatta per gli adulti" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s è adatta per i %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:5 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Fasce di età" + +#: src/gs-age-rating-context-dialog.ui:60 +#: src/gs-hardware-support-context-dialog.ui:62 +#: src/gs-safety-context-dialog.ui:125 +#, fuzzy +msgid "_How to contribute missing information" +msgstr "Come contribuire con le informazioni mancanti" + +#: lib/gs-app.c:6353 +msgid "Local file" +msgstr "File locale" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6372 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6449 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:89 +msgid "Package" +msgstr "Pacchetto" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "In attesa" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:402 +msgid "Pending install" +msgstr "Installazione in attesa" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:409 +msgid "Pending remove" +msgstr "Rimozione in attesa" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:390 +msgid "Installing" +msgstr "Installazione" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Rimozione" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:395 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Scaricamento" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:311 src/gs-details-page.c:1055 +#: src/gs-details-page.c:1082 src/gs-details-page.ui:243 src/gs-page.c:427 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Installa" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1164 +msgid "_Uninstall…" +msgstr "_Disinstalla…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Rete" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Può comunicare attraverso la rete" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Servizi di sistema" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Può accedere ai servizi D-Bus sul bus di sistema" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Servizi di sessione" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Può accedere ai servizi D-Bus sul bus di sessione" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Dispositivi" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Può accedere a dispositivi arbitrari come le webcam" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Può accedere ai dispositivi di input" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Può accedere ai microfoni" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Può accedere ai file di sistema del dispositivo" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Contenuto della schermata" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Può accedere ai contenuti dello schermo" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Cartella home" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Può visualizzare, modificare e creare file" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Può visualizzare file" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "File system" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Cartella degli scaricamenti" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Impostazioni" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Può visualizzare e modificare qualsiasi impostazione" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistema di visualizzazione obsoleto" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Usa un vecchio sistema di visualizzazione non sicuro" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Evita ambiente di prova" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Può evitare l'ambiente di prova ed aggirare ogni altra restrizione" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Nessuna descrizione dell'aggiornamento disponibile." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Dettagli aggiornamento" + +#: src/gs-app-details-page.ui:26 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Richiede permessi aggiuntivi" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:4 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Recensioni" + +#: src/gs-app-reviews-dialog.ui:19 +msgid "No reviews were found for this app." +msgstr "Non è stata trovata nessuna recensione per questa applicazione." + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No Reviews" +msgstr "Nessuna recensione" + +#: src/gs-app-version-history-dialog.ui:4 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "Cronologia versioni" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novità della versione %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versione %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Nessun dettaglio per questo rilascio" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Modalità d'avvio: a scelta fra «updates», «updated», «installed» o «overview»" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODALITÀ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Cerca le applicazioni" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "CERCA" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Mostra i dettagli dell'applicazione (usando l'ID dell'applicazione)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Mostra i dettagli dell'applicazione (usando il nome del pacchetto)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Installa l'applicazione (usando l'ID dell'applicazione)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Disinstalla l'applicazione (usando l'identificativo dell'applicazione)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Apre un file di pacchetto locale" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NOMEFILE" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Il tipo di interazione prevista per questa azione: una fra «none», «notify» " +"o «full»" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAZIONE" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Mostra un file locale di metainfo o appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Abilita l'output di debug dettagliato (dall'istanza in esecuzione, se già in " +"esecuzione)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installa in background gli aggiornamenti in attesa" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Mostra le preferenze" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Chiude l'istanza in esecuzione" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferisce sorgenti di file locali ad AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Mostra il numero della versione" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 contributori di GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Gianvito Cavasoli \n" +"Salvatore Cocuzza free and open source software, and is provided by “%s”." +msgstr "" +"%s non è software libero e open source, ed è " +"fornito da «%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:268 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s è fornito da «%s»." + +#: src/gs-common.c:277 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Questo repository software deve essere abilitato per continuare " +"l'installazione." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:287 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Può essere illegale installare o usare %s in alcuni paesi." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:293 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Può essere illegale installare o usare questo codec in alcuni paesi." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:307 +msgid "Don’t _Warn Again" +msgstr "Non a_vvisare più" + +#. TRANSLATORS: button text +#: src/gs-common.c:316 +msgid "Enable and _Install" +msgstr "Abilita e _installa" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:523 +msgid "Detailed errors from the package manager follow:" +msgstr "Seguono gli errori dettagliati del gestore dei pacchetti:" + +#: src/gs-common.c:530 src/gs-common.c:667 src/gs-safety-context-dialog.ui:66 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Dettagli" + +#. TRANSLATORS: button text +#: src/gs-common.c:579 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Chiudi" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:748 +msgid "_Accept" +msgstr "_Accetta" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:894 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Un aggiornamento è stato installato" +msgstr[1] "Degli aggiornamenti sono stati installati" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:904 +#, fuzzy +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Un aggiornamento è stato installato" +msgstr[1] "Degli aggiornamenti sono stati installati" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:910 +#, fuzzy +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "È richiesto un riavvio finché abbia effetto." +msgstr[1] "È richiesto un riavvio finché abbiano effetto." + +#. TRANSLATORS: button text +#: src/gs-common.c:917 +msgid "Not Now" +msgstr "Non ora" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Proprio ora" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuto fa" +msgstr[1] "%d minuti fa" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ora fa" +msgstr[1] "%d ore fa" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d giorno fa" +msgstr[1] "%d giorni fa" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d settimana fa" +msgstr[1] "%d settimane fa" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d mese fa" +msgstr[1] "%d mesi fa" + +#: src/gs-common.c:1035 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d anno fa" +msgstr[1] "%d anni fa" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1398 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Un'applicazione" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s richiede supporto per il formato di file aggiuntivi." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Tipi di MIME aggiuntivi richiesti" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s richiede tipi di carattere aggiuntivi." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Tipi di carattere aggiuntivi richiesti" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s richiede codec multimediali aggiuntivi." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Codec multimediali aggiuntivi richiesti" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s richiede driver di stampa aggiuntivi." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Driver di stampa aggiuntivi richiesti" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s richiede pacchetti aggiuntivi." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Pacchetti aggiuntivi richiesti" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Trova in Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "_Mostra altro" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Mostra meno" + +#: src/gs-details-page.c:385 +msgid "Removing…" +msgstr "Rimozione…" + +#: src/gs-details-page.c:400 +msgid "Requires restart to finish install" +msgstr "Richiede il riavvio per terminare l'installazione" + +#: src/gs-details-page.c:407 +msgid "Requires restart to finish remove" +msgstr "Richiede il riavvio per terminare la rimozione" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:424 +msgid "Pending installation…" +msgstr "Installazione in attesa…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:430 +msgid "Pending update…" +msgstr "Aggiornamento in attesa…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:445 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Scaricamento…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:448 +msgid "Preparing…" +msgstr "Preparazione…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:451 +msgid "Uninstalling…" +msgstr "Disinstallazione…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:578 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s non è installato, ma sono ancora presenti dati." + +#: src/gs-details-page.c:1072 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Riavvia" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1096 +msgid "_Install…" +msgstr "_Installa…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1309 +#, c-format +msgid "%s will appear in US English" +msgstr "%s apparirà in inglese americano" + +#: src/gs-details-page.c:1317 +msgid "This app will appear in US English" +msgstr "Questa applicazione apparirà in inglese americano" + +#: src/gs-details-page.c:1319 +msgid "This software will appear in US English" +msgstr "Questo software verrà visualizzato in inglese americano" + +#: src/gs-details-page.c:1354 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "Aiuta a _tradurlo" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1419 +#, c-format +msgid "Other Apps by %s" +msgstr "Altre applicazioni di %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1455 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Lo sviluppatore %s ha dimostrato di possedere %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1458 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Lo sviluppatore ha dimostrato di possedere %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1821 +msgid "You need internet access to write a review" +msgstr "È necessario un accesso Internet per scrivere una recensione" + +#: src/gs-details-page.c:1922 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Questa applicazione non riceve più aggiornamenti, incluse correzioni di " +"sicurezza" + +#: src/gs-details-page.c:1923 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Questa applicazione è già fornita dalla tua distribuzione e non deve essere " +"sostituita." + +#: src/gs-details-page.c:1924 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Questa applicazione non fornisce alcun collegamento a un sito Web, a un " +"repository di codici o a un tracker di problemi." + +#: src/gs-details-page.c:1926 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Questo software non riceve più aggiornamenti, incluse correzioni di sicurezza" + +#: src/gs-details-page.c:1927 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Questo software è già fornito dalla distribuzione e non dovrebbe essere " +"sostituito." + +#: src/gs-details-page.c:1928 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Questo software non fornisce alcun collegamento a un sito web, repository " +"del codice o tracciatore di bug." + +#: src/gs-details-page.c:2018 src/gs-details-page.c:2034 +#, c-format +msgid "Unable to find “%s”" +msgstr "Impossibile trovare «%s»" + +#: src/gs-details-page.c:2382 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Impossibile inviare la recensione per “%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Pagina dettagli" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Caricamento dettagli dell'applicazione" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Verificato" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Apri" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Aggiorna" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Disinstalla" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:135 +msgid "Add-ons" +msgstr "Estensioni" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Questa applicazione può essere usata solo quando c'è una connessione a " +"Internet attiva." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "Repository software incluso" + +#: src/gs-details-page.ui:679 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Questa applicazione include un repository software che fornisce " +"aggiornamenti, nonché l'accesso ad altri software." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Nessun repository software incluso" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Questa applicazione non include un repository software. Non verrà aggiornata " +"con nuove versioni." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "Repository software identificato" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"L'aggiunta di questo repository software darà l'accesso a software e " +"aggiornamenti aggiuntivi." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Usare solo repository software di cui si ha fiducia." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Cancella i dati dell'app" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "_Elimina dati" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Nessun metadato" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "Sito _web del progetto" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "Fai una _donazione" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "Contribuisci alle _traduzioni" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "_Segnala un problema" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "_Documentazione" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contatta" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "Scrivi r_ecensione" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Tutte le recensioni" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Scaricamento file metadati aggiuntivi…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " e " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tipi di carattere disponibili per la scrittura %s" +msgstr[1] "Tipi di carattere disponibili per le scritture %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Software disponibile per %s" +msgstr[1] "Software disponibili per %s" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Software richiesto non trovato" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Impossibile trovare il software richiesto" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:418 +#, c-format +msgid "%s not found" +msgstr "%s non trovato" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:422 +msgid "on the website" +msgstr "sul sito web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:429 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Non è disponibile alcuna applicazione che fornisce il file %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:433 src/gs-extras-page.c:444 src/gs-extras-page.c:455 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Le informazioni su %s, così come le opzioni su come ottenere le applicazioni " +"mancanti, potrebbero essere trovate su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:440 src/gs-extras-page.c:462 +#, c-format +msgid "No apps are available for %s support." +msgstr "Non è disponibile alcuna applicazione per il supporto a %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:451 +#, c-format +msgid "%s is not available." +msgstr "%s non è disponibile." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:466 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Le informazioni su %s, così come le opzioni su come ottenere un'applicazione " +"mancante che può supportare questo formato, potrebbero essere trovate su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:473 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" +"Non è disponibile alcun tipo di carattere aggiuntivo per il supporto alla " +"scrittura %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:477 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Le informazioni su %s, così come le opzioni su come ottenere tipi di " +"carattere aggiuntivi potrebbero essere trovate su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:484 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Non è disponibile alcun codec per il formato %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:488 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Le informazioni su %s, così come le opzioni su come ottenere un codec per " +"riprodurre questo formato potrebbero essere trovate su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:495 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Non è disponibile alcuna risorsa di Plasma per il supporto di %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:499 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Le informazioni su %s, così come le opzioni su come ottenere risorse " +"aggiuntive per Plasma, potrebbero essere trovate su %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:506 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Non è disponibile alcun driver di stampa per %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:510 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Le informazioni su %s, così come le opzioni su come ottenere un driver che " +"supporti questa stampante potrebbero essere trovate su %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:556 +msgid "the documentation" +msgstr "la documentazione" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Impossibile trovare %s richiesto da %s. Consultare %s per maggiori " +"informazioni." +msgstr[1] "" +"Impossibile trovare %s richiesto da %s. Consultare %s per maggiori " +"informazioni." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:571 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Impossibile trovare %s che si stava cercando. Consultare %s per maggiori " +"informazioni." +msgstr[1] "" +"Impossibile trovare %s che si stava cercando. Consultare %s per maggiori " +"informazioni." + +#: src/gs-extras-page.c:649 src/gs-extras-page.c:706 src/gs-extras-page.c:746 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Impossibile trovare alcun risultato della ricerca: %s" + +#: src/gs-extras-page.c:965 +#, c-format +msgid "%s file format" +msgstr "Formato di file %s" + +#: src/gs-extras-page.c:1323 +msgid "Install _All" +msgstr "Installa _tutto" + +#: src/gs-extras-page.c:1353 +msgid "Unable to Find Requested Software" +msgstr "Impossibile trovare il software richiesto" + +#: src/gs-extras-page.ui:6 +msgid "Codecs page" +msgstr "Pagina dei codec" + +#: src/gs-extras-page.ui:92 +#, fuzzy +msgid "No Results Found" +msgstr "Applicazione non trovata" + +#: src/gs-extras-page.ui:104 +msgid "Unable To Perform Search" +msgstr "" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Precedente" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Successiva" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Elenco applicazioni in evidenza" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Supporto desktop" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Supporta l'uso su uno schermo grande" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Supporto desktop sconosciuto" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Informazioni insufficienti per sapere se gli schermi grandi sono supportati" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Richiede uno schermo grande" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Desktop non supportato" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Non è possibile usarla su uno schermo grande" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Supporto mobile" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Supporta l'uso su uno schermo piccolo" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Supporto mobile sconosciuto" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Informazioni insufficienti per sapere se gli schermi piccoli sono supportati" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Richiede uno schermo piccolo" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobile non supportato" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Non è possibile usarla su uno schermo piccolo" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Supporto tastiera" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Supporto tastiera sconosciuto" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Informazioni insufficienti per sapere se le tastiere sono supportate" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Richiede tastiera" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Supporta le tastiere" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tastiera non supportata" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Non è possibile usarla con una tastiera" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Supporto mouse" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Richiede un mouse o un dispositivo di puntamento" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Supporto mouse sconosciuto" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Informazioni insufficienti per sapere se mouse o dispositivi di puntamento " +"sono supportati" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Richiesto mouse" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Supporta i mouse e i dispositivi di puntamento" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Mouse non supportato" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Non è possibile usarla con un mouse o un dispositivo di puntamento" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Supporto schermo a tocco" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Supporto schermo a tocco sconosciuto" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Informazioni insufficienti per sapere se gli schermi a tocco sono supportati" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Richiesto schermo a tocco" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Supporta gli schermi a tocco" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Schermo a tocco non supportato" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Non è possibile usarla con uno schermo a tocco" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Richiesta pulsantiera da gioco" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Richiede una pulsantiera da gioco" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Supporto pulsantiera da gioco" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Supporta le pulsantiere da gioco" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s probabilmente funziona su questo dispositivo" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s funziona su questo dispositivo" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s probabilmente funziona su questo dispositivo" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s non funzionerà correttamente su questo dispositivo" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s non funzionerà su questo dispositivo" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:5 +msgid "Hardware Support" +msgstr "Supporto hardware" + +#: src/gs-help-overlay.ui:12 +msgid "Navigation" +msgstr "Navigazione" + +#: src/gs-help-overlay.ui:17 +msgid "Navigate to Explore Page" +msgstr "Passare alla pagina Esplora" + +#: src/gs-help-overlay.ui:23 +msgid "Navigate to Installed Page" +msgstr "Passare alla pagina Installate" + +#: src/gs-help-overlay.ui:29 +msgid "Navigate to Updates Page" +msgstr "Passare alla pagina Aggiornamenti" + +#: src/gs-help-overlay.ui:35 +msgid "Open Search Bar" +msgstr "Apri la barra di ricerca" + +#: src/gs-help-overlay.ui:43 +msgid "Windows" +msgstr "Finestre" + +#: src/gs-help-overlay.ui:48 +msgid "Open Preferences" +msgstr "Apri Preferenze" + +#: src/gs-help-overlay.ui:54 +msgid "Open Software Repositories" +msgstr "Apri Repository software" + +#: src/gs-help-overlay.ui:62 +msgid "Help" +msgstr "Documentazione" + +#: src/gs-help-overlay.ui:67 +msgid "Open Keyboard Shortcuts" +msgstr "Apri le scorciatoie da tastiera" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Installate" + +#: src/gs-installed-page.ui:6 +msgid "Installed page" +msgstr "Pagina installata" + +#: src/gs-installed-page.ui:55 +msgid "In Progress" +msgstr "In corso" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:75 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Applicazioni" + +#: src/gs-installed-page.ui:95 +msgid "Web Apps" +msgstr "Applicazioni web" + +#: src/gs-installed-page.ui:115 +msgid "System Apps" +msgstr "Applicazioni di sistema" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Costruito dalla comunità" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:86 +msgid "_Get Involved" +msgstr "_Fatti coinvolgere" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Questa applicazione è sviluppata liberamente da una comunità internazionale " +"e rilasciata sotto la %s licenza.\n" +"\n" +"Puoi contribuire a renderla ancora migliore." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Questa applicazione è sviluppata liberamente da una comunità internazionale " +"e rilasciata con la licenza %s.\n" +"\n" +"Puoi contribuire a renderla ancora migliore." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Questo software è sviluppato liberamente da una comunità internazionale e " +"rilasciato sotto la %s licenza.\n" +"\n" +"Puoi contribuire a renderlo ancora migliore." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Questo software è sviluppato liberamente da una comunità internazionale e " +"rilasciato sotto la licenza %s.\n" +"\n" +"Puoi contribuire a renderlo ancora migliore." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Licenza sconosciuta" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "Maggiori in_formazioni" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Questa applicazione non specifica con quale licenza è sviluppata e potrebbe " +"essere proprietaria. Potrebbe essere insicura in modi difficili da rilevare " +"e potrebbe cambiare senza supervisione.\n" +"\n" +"Potresti o meno essere in grado di contribuire a questa app." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Questo software non specifica la licenza con cui è sviluppato e potrebbe " +"essere proprietario. Potrebbe essere insicuro in modi difficili da rilevare " +"e potrebbe cambiare senza supervisione.\n" +"\n" +"Potresti o meno essere in grado di contribuire a questo software." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Proprietaria" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Questa applicazione non è sviluppata apertamente, quindi solo i suoi " +"sviluppatori sanno come funziona. Potrebbe essere insicura in modi difficili " +"da rilevare e potrebbe cambiare senza supervisione.\n" +"\n" +"Potresti non essere in grado di contribuire a questa app." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Questo software non è sviluppato liberamente, quindi solo i suoi " +"sviluppatori conoscono come funziona. Potrebbe essere non sicuro in modi " +"difficile da rilevare, e potrebbe cambiare senza una supervisione.\n" +"\n" +"Potresti non essere in grado di contribuire a questo software." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Licenza speciale" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Questa app è sviluppata con la licenza speciale %s.\n" +"\n" +"Potresti o meno essere in grado di contribuire a questa app." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Questa app è sviluppata con la licenza speciale “%s”.\n" +"\n" +"Potresti o meno essere in grado di contribuire a questa app." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Questo software è sviluppato con la licenza speciale %s.\n" +"\n" +"Potresti o meno essere in grado di contribuire a questo software." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Questo software è sviluppato con la licenza speciale “%s”.\n" +"\n" +"Potresti o meno essere in grado di contribuire a questo software." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:56 +msgid "Refreshing Data" +msgstr "" + +#: src/gs-loading-page.ui:6 +msgid "Loading page" +msgstr "Caricamento pagina" + +#: src/gs-loading-page.ui:11 +msgid "Starting Up" +msgstr "Avvio" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Sorgente sconosciuta" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:104 +msgid "Beta" +msgstr "Beta" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Aggiuntivi" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Rimozioni" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Aggiornamenti" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Retrocessioni" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "sorgenti esterne selezionate" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Fornisce accesso a software aggiuntivo da %s. Sono inclusi alcuni software " +"proprietari.\n" +"\n" +"Si possono abilitare questi repository più tardi dalle preferenze di " +"«Repository software»." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Abilitare repository software di terze parti?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "_Ignora" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Abilita" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "Disponibile per il tuo sistema operativo" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "Disponibile per %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Esplora" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Pagina panoramica" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "App disponibili" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Altre categorie" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Dati applicazione non trovati" + +#: lib/gs-plugin-loader.c:2797 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Sconosciuta" + +#. TRANSLATORS: button text +#: src/gs-page.c:92 +msgid "_OK" +msgstr "_Fatto" + +#: src/gs-page.c:273 +msgid "User declined installation" +msgstr "L'utente ha rifiutato l'installazione" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:419 +#, c-format +msgid "Prepare %s" +msgstr "Preparazione %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:564 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Rimuovere il repository %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:568 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Tutte le applicazioni da %s saranno disinstallate, si dovrà reinstallare il " +"repository per poterle riutilizzare." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:578 +#, c-format +msgid "Uninstall %s?" +msgstr "Disinstallare %s?" + +#: src/gs-page.c:587 +msgid "App Settings & Data" +msgstr "Impostazioni e dati dell'app" + +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:590 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Non sarà possibile utilizzare %s dopo la rimozione." + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:613 +msgid "_Keep" +msgstr "_Mantieni" + +#: src/gs-page.c:619 +msgid "Allows restoring app settings and content" +msgstr "Consente di ripristinare le impostazioni e i contenuti dell'app" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:628 +msgid "_Delete" +msgstr "_Elimina" + +#: src/gs-page.c:634 +msgid "Permanently deletes data to save disk space" +msgstr "Elimina definitivamente i dati per risparmiare spazio su disco" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:641 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Non sarà possibile utilizzare %s dopo la rimozione. I dati e le impostazioni " +"dell'app verranno conservati su disco, per consentire il ripristino dell'app " +"in futuro." + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:656 +msgid "_Uninstall" +msgstr "_Disinstalla" + +#: src/gs-prefs-dialog.ui:4 +msgid "Preferences" +msgstr "Preferenze" + +#: src/gs-prefs-dialog.ui:15 +msgid "Software Updates" +msgstr "Aggiornamenti software" + +#: src/gs-prefs-dialog.ui:18 src/gs-safety-context-dialog.ui:103 +#, fuzzy +msgid "More Information" +msgstr "maggiori informazioni" + +#: src/gs-prefs-dialog.ui:28 +msgid "_Automatic" +msgstr "_Automatico" + +#: src/gs-prefs-dialog.ui:29 +msgid "Automatically check for and download updates" +msgstr "Controlla e scarica automaticamente gli aggiornamenti" + +#: src/gs-prefs-dialog.ui:43 +msgid "_Manual" +msgstr "_Manuale" + +#: src/gs-prefs-dialog.ui:44 +msgid "Checking for and downloading updates must be done manually" +msgstr "" +"La verifica e lo scaricamento degli aggiornamenti devono essere effettuati " +"manualmente" + +#: src/gs-prefs-dialog.ui:62 +msgid "Automatic Update _Notifications" +msgstr "_Notifiche aggiornamenti automatici" + +#: src/gs-prefs-dialog.ui:63 +msgid "Notify when updates have been automatically installed" +msgstr "" +"Notifica quando gli aggiornamenti sono stati installati automaticamente" + +#: src/gs-prefs-dialog.ui:72 +msgid "Content Filters" +msgstr "Filtri dei contenuti" + +#: src/gs-prefs-dialog.ui:75 +msgid "Only Show _Free Software" +msgstr "Mostra solo _Software libero" + +#: src/gs-prefs-dialog.ui:76 +msgid "Hide proprietary software when browsing and searching" +msgstr "Nascondi il software proprietario durante la navigazione e la ricerca" + +#: src/gs-prefs-dialog.ui:83 +msgid "Only Show _Verified Developers" +msgstr "Mostra solo sviluppatori _verificati" + +#: src/gs-prefs-dialog.ui:84 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Mostra solo le applicazioni di sviluppatori la cui identità è stata " +"verificata" + +#: src/gs-prefs-dialog.ui:106 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Il controllo e lo scaricamento degli aggiornamenti consuma dati ed energia. " +"Le operazioni di aggiornamento automatico vengono quindi sospese quando si " +"utilizzano connessioni di rete a consumo e quando è attivo il risparmio " +"energetico." + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Il software installato è incompatibile con %s e sarà automaticamente " +"disinstallato durante l'aggiornamento." + +#: src/gs-removal-dialog.ui:4 +msgid "Incompatible Software" +msgstr "Software incompatibile" + +#: src/gs-removal-dialog.ui:31 +msgid "_Upgrade" +msgstr "_Aggiorna" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Il software che è stato installato da «%s» cesserà di ricevere aggiornamenti." + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Disabilitare il repository?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Rimuovere il repository?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "_Disabilita" + +#. TRANSLATORS: this is button text to remove a repo +#: src/gs-repos-dialog.c:259 +msgid "_Remove" +msgstr "_Rimuovi" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Abilitare nuovi repository" + +#: src/gs-repos-dialog.c:612 +#, fuzzy +msgid "Turn on new repositories when they are added" +msgstr "Attiva i nuovi repository quando sono aggiunti." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "maggiori informazioni" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Repository aggiuntivi da fonti selezionate di terze parti — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Repository Fedora di terze parti" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:781 +msgid "the operating system" +msgstr "il sistema operativo" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:837 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Questi repository integrano il software predefinito fornito da %s." + +#: src/gs-repos-dialog.ui:4 +msgid "Software Repositories" +msgstr "Repository software" + +#: src/gs-repos-dialog.ui:44 +msgid "No Repositories" +msgstr "Nessun repository" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u applicazione installata" +msgstr[1] "%u applicazioni installate" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u estensione installata" +msgstr[1] "%u estensioni installate" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u applicazione" +msgstr[1] "%u applicazioni" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u estensione" +msgstr[1] "%u estensioni" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s e %s installate" +msgstr[1] "%s e %s installate" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Controllo del software installato…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Rimuovi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "La detesto" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Non mi piace" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "Va bene" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Mi piace" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "La adoro" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Scegli una stella per lasciare una valutazione" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Prenditi più tempo per scrivere la recensione" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Scegliere una stella come valutazione" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Il riassunto è troppo corto" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Il riassunto è troppo lungo" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "La descrizione è troppo corta" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "La descrizione è troppo lunga" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:5 +msgid "Write a Review" +msgstr "Scrivi una recensione" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:31 +msgid "_Send" +msgstr "_Invia" + +#: src/gs-review-dialog.ui:41 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Si prega di fornire una valutazione, un riassunto e il testo della " +"recensione. Le recensioni non devono essere utilizzate per segnalare " +"problemi: contattare lo sviluppatore o il proprio fornitore di assistenza." + +#: src/gs-review-dialog.ui:75 +msgid "Review Summary" +msgstr "Riassunto della recensione" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:107 +msgctxt "app review" +msgid "Write a short review" +msgstr "Scrivere una breve recensione" + +#: src/gs-review-dialog.ui:149 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Consultare la politica di " +"riservatezza per vedere quali dati vengono inviati. Il nome completo " +"collegato al proprio account sarà mostrato pubblicamente." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u recensione in totale" +msgstr[1] "%u recensioni in totale" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "su 5 stelle" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Sconosciuto" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:222 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"È possibile segnalare recensioni per comportamento offensivo, maleducato o " +"discriminatorio." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:227 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Una volta segnalata, una recensione non sarà visibile fino a quando un " +"amministratore non la controlla." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:232 +msgid "Report Review?" +msgstr "Segnalare la recensione?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:237 +msgid "_Report" +msgstr "_Segnala" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:84 +msgid "Was this review useful to you?" +msgstr "La recensione è stata utile?" + +#: src/gs-review-row.ui:100 +msgid "Yes" +msgstr "Sì" + +#: src/gs-review-row.ui:108 +msgid "No" +msgstr "No" + +#: src/gs-review-row.ui:120 +msgid "Report…" +msgstr "Segnala…" + +#: src/gs-review-row.ui:129 +msgid "Remove…" +msgstr "Rimuovi…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"L'applicazione non è in modalità sandbox ma la distribuzione ha verificato " +"che non è dannosa" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Verificare se fidarsi del fornitore, poiché l'applicazione non è in modalità " +"sandbox" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Nessun permesso" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "L'applicazione è completamente in modalità sandbox" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Accesso alla rete" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Può accedere a Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Nessun accesso alla rete" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Non può accedere a Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Usa servizi di sistema" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Può richiedere dei dati dai servizi di sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Usa servizi di sessione" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Può richiedere dei dati dai servizi di sessione" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Accesso al dispositivo dell'utente" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Può accedere ai dispositivi come webcam o controller di gioco" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Nessun accesso ai dispositivi dell'utente" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Non può accedere ai dispositivi come webcam o controller di gioco" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Accesso a dispositivi di input" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Accesso al microfono" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "Può ascoltare utilizzando i microfoni senza chiedere il permesso" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Accesso a dispositivi di sistema" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Può accedere ai dispositivi di sistema che richiedono permessi elevati" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Accesso ai contenuti dello schermo" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Può accedere al contenuto dello schermo o di altre finestre" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Sistema di gestione delle finestre obsoleto" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Permessi arbitrari" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Impostazioni dell'utente" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Accesso completo al file system in lettura/scrittura" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Può leggere e scrivere tutti i dati sul file system" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Accesso alla cartella Home in lettura/scrittura" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Può leggere e scrivere tutti i vostri dati nella directory home" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Accesso completo in lettura al file system" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Può leggere tutti i dati nel file system" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Accesso in lettura alla cartella Home" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Può leggere tutti i vostri dati della directory home" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Accesso in lettura/scrittura alla cartella scaricamenti" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "" +"Può leggere e scrivere tutti i vostri dati della directory degli scaricamenti" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Accesso in lettura alla cartella scaricamenti" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Può leggere tutti i vostri dati della directory degli scaricamenti" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Può leggere e scrivere tutti i dati nella directory" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Può leggere tutti i dati della directory" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Nessun accesso al file system" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Non può accedere del tutto al file system" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Lo sviluppatore dell'applicazione è verificato" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Lo sviluppatore di questa applicazione è stato verificato e corrisponde a se " +"stesso" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Dipendenze non sicure" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Il software o le sue dipendenze non sono più supportate e potrebbero essere " +"non sicure" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Questa applicazione non specifica con quale licenza è sviluppata e potrebbe " +"essere proprietaria" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Questo software non specifica la licenza con cui è sviluppato e potrebbe " +"essere proprietario" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Codice proprietario" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Il codice sorgente non è pubblico, quindi non è possibile ispezionarlo in " +"modo indipendente e potrebbe essere non sicuro" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Questa applicazione è sviluppata con la licenza speciale “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Questo software è sviluppato con la licenza speciale “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Codice ispezionabile" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Il codice sorgente è pubblico e può essere ispezionato in modo indipendente, " +"il che rende l'applicazione probabilmente più sicura" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s è privilegiata" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s è sicura" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s è probabilmente sicura" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s è potenzialmente non sicura" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s non è sicura" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Sconosciuto" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:5 +msgid "Safety" +msgstr "Sicura" + +#: src/gs-safety-context-dialog.ui:69 +msgid "License" +msgstr "Licenza" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:79 +msgid "Source" +msgstr "Sorgente" + +#: src/gs-safety-context-dialog.ui:99 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:147 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Schermata precedente" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Schermata successiva" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Nessuna schermata" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Schermata non trovata" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Caricamento dell'immagine non riuscito" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Dimensione schermata non trovata" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Impossibile creare la cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Schermata non valida" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Schermata non disponibile" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Schermata" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u altro risultato" +msgstr[1] "Altri %u risultati" + +#: src/gs-search-page.ui:6 +msgid "Search page" +msgstr "Pagina di ricerca" + +#: src/gs-search-page.ui:17 +msgid "Search for Apps" +msgstr "Cerca le applicazioni" + +#: src/gs-search-page.ui:46 +msgid "No App Found" +msgstr "Applicazione non trovata" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Impossibile scaricare gli aggiornamenti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "Impossibile scaricare gli aggiornamenti firmware" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, fuzzy, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Impossibile scaricare gli aggiornamenti firmware" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, fuzzy, c-format +msgid "Unable to download updates from %s" +msgstr "Impossibile scaricare gli aggiornamenti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "Impossibile aggiornare: è richiesto l'accesso a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "Impossibile aggiornare: spazio su disco insufficiente" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, fuzzy, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Impossibile aggiornare: spazio su disco insufficiente" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "Impossibile aggiornare: è richiesta l'autenticazione" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "Impossibile aggiornare: autenticazione non valida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "Impossibile aggiornare: autorizzazione richiesta" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Impossibile ottenere l'elenco degli aggiornamenti" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "Impossibile installare: scaricamento non riuscito" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, fuzzy, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Impossibile installare: scaricamento non riuscito" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, fuzzy, c-format +msgid "Unable to install %s: download failed" +msgstr "Impossibile installare: scaricamento non riuscito" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "Impossibile installare: runtime mancante" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, fuzzy, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Impossibile installare: runtime mancante" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "Impossibile installare %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "Impossibile installare: è richiesto l'accesso a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "Impossibile installare: formato dell'app non valido" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "Impossibile installare: spazio su disco insufficiente" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, fuzzy, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Impossibile installare: spazio su disco insufficiente" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "Impossibile installare: è richiesta l'autenticazione" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, fuzzy, c-format +msgid "Unable to install %s: authentication required" +msgstr "Impossibile installare: è richiesta l'autenticazione" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "Impossibile installare: autenticazione non valida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, fuzzy, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Impossibile installare: autenticazione non valida" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "Impossibile installare: autorizzazione richiesta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, fuzzy, c-format +msgid "Unable to install %s: permission required" +msgstr "Impossibile installare: autorizzazione richiesta" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "Impossibile installare: il dispositivo deve essere collegato" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, fuzzy, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Impossibile installare: il dispositivo deve essere collegato" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "Impossibile installare: batteria scarica" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, fuzzy, c-format +msgid "Unable to install %s: low battery" +msgstr "Impossibile installare: batteria scarica" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, fuzzy, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Impossibile aggiornare: scaricamento non riuscito" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, fuzzy, c-format +msgid "Unable to update %s: download failed" +msgstr "Impossibile aggiornare: scaricamento non riuscito" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, fuzzy, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Impossibile installare: scaricamento non riuscito" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "Impossibile aggiornare: scaricamento non riuscito" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, fuzzy, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Impossibile aggiornare: spazio su disco insufficiente" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, fuzzy, c-format +msgid "Unable to update %s: authentication required" +msgstr "Impossibile aggiornare: è richiesta l'autenticazione" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, fuzzy, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Impossibile aggiornare: autenticazione non valida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, fuzzy, c-format +msgid "Unable to update %s: permission required" +msgstr "Impossibile aggiornare: autorizzazione richiesta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "Impossibile aggiornare: il dispositivo deve essere collegato" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, fuzzy, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Impossibile aggiornare: il dispositivo deve essere collegato" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "Impossibile aggiornare: batteria scarica" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, fuzzy, c-format +msgid "Unable to update %s: low battery" +msgstr "Impossibile aggiornare: batteria scarica" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "Impossibile aggiornare %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +#, fuzzy +msgid "Unable to update" +msgstr "Impossibile aggiornare %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Impossibile eseguire l'aggiornamento" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, fuzzy, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Impossibile eseguire l'aggiornamento" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "Impossibile eseguire l'aggiornamento: scaricamento non riuscito" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Impossibile eseguire l'aggiornamento: scaricamento non riuscito" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "Impossibile aggiornare: è richiesto l'accesso a Internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Impossibile aggiornare: è richiesto l'accesso a Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "Impossibile eseguire l'aggiornamento: spazio su disco insufficiente" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Impossibile eseguire l'aggiornamento: spazio su disco insufficiente" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "Impossibile eseguire l'aggiornamento: è richiesta l'autenticazione" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Impossibile eseguire l'aggiornamento: è richiesta l'autenticazione" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "Impossibile eseguire l'aggiornamento: autenticazione non valida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Impossibile eseguire l'aggiornamento: autenticazione non valida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "Impossibile eseguire l'aggiornamento: autorizzazione richiesta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Impossibile eseguire l'aggiornamento: autorizzazione richiesta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "" +"Impossibile eseguire l'aggiornamento: il dispositivo deve essere collegato" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Impossibile eseguire l'aggiornamento: il dispositivo deve essere collegato" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "Impossibile aggiornare: batteria scarica" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, fuzzy, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Impossibile aggiornare: batteria scarica" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, fuzzy, c-format +msgid "Unable to upgrade to %s" +msgstr "Impossibile eseguire l'aggiornamento" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "Impossibile disinstallare: è richiesta l'autenticazione" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, fuzzy, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Impossibile disinstallare: è richiesta l'autenticazione" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +#, fuzzy +msgid "Unable to uninstall: invalid authentication" +msgstr "Impossibile installare: autenticazione non valida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, fuzzy, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Impossibile installare: autenticazione non valida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "Impossibile disinstallare: autorizzazione richiesta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, fuzzy, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Impossibile disinstallare: autorizzazione richiesta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Impossibile disinstallare: il dispositivo deve essere collegato" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, fuzzy, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Impossibile disinstallare: il dispositivo deve essere collegato" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "Impossibile disinstallare: batteria scarica" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, fuzzy, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Impossibile disinstallare: batteria scarica" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Impossibile disinstallare %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "Impossibile avviare %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "Qualcosa è andato storto" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, fuzzy, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Impossibile avviare %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "Spazio su disco insufficiente per il funzionamento" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "Impossibile installare: tipo di file non supportato" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "Impossibile installare: autenticazione non riuscita" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Impossibile installare" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "Impossibile contattare %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "Riavvia Software per usare i nuovi plugin" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "Il dispositivo deve essere collegato" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Il livello della batteria è troppo basso" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "Informazioni su Software" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "Repository _software" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "_Tasti rapidi" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "Preferen_ze" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Cerca" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Menù principale" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Cerca applicazioni" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:202 +msgid "_Explore" +msgstr "_Esplora" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:216 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Installate" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:238 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "A_ggiornamenti" + +#: src/gs-shell.ui:274 src/gs-shell.ui:345 +msgid "Go back" +msgstr "Vai indietro" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nessuna" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Dati applicazione" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Dati necessari per avviare l'applicazione" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Dati utente" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Dati creati dall'utente nell'applicazione" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Dati cache" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dati temporanei nella cache" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "L'applicazione stessa" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dipendenze richieste" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Componenti di sistema condivisi richiesti da questa applicazione" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Sconosciuta" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:5 +msgid "Storage" +msgstr "Archiviazione" + +#. Translators: Please do not translate the markup or link href +#: src/gs-storage-context-dialog.ui:63 +msgid "" +"Cached data can be cleared from the _app settings." +msgstr "" +"I dati memorizzati possono essere ripuliti nelle impostazioni dell'_applicazione." + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Installato)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Installazione)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Scaricamento in corso)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Rimozione)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Dettagli" + +#: src/gs-toast.c:62 +#, fuzzy +msgid "_Examine" +msgstr "Esamina disco" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Installato il %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:130 +msgid "Installed Updates" +msgstr "Aggiornamenti installati" + +#: src/gs-update-dialog.ui:64 +msgid "No Updates Installed" +msgstr "Nessun aggiornamento installato" + +#: src/gs-update-monitor.c:216 +msgid "Updates Are Out of Date" +msgstr "Aggiornamenti scaduti" + +#: src/gs-update-monitor.c:217 +msgid "Please check for available updates" +msgstr "Controllare gli aggiornamenti disponibili" + +#: src/gs-update-monitor.c:223 +msgid "Critical Updates Ready to Install" +msgstr "Aggiornamenti critici pronti per essere installati" + +#: src/gs-update-monitor.c:224 +msgid "Install critical updates as soon as possible" +msgstr "Installare gli aggiornamenti critici il prima possibile" + +#: src/gs-update-monitor.c:227 +msgid "Critical Updates Available to Download" +msgstr "Aggiornamenti critici disponibili per lo scaricamento" + +#: src/gs-update-monitor.c:228 +msgid "Download critical updates as soon as possible" +msgstr "Scaricare gli aggiornamenti critici il prima possibile" + +#: src/gs-update-monitor.c:234 +msgid "Updates Ready to Install" +msgstr "Aggiornamenti pronti per l'installazione" + +#: src/gs-update-monitor.c:235 +msgid "Software updates are ready and waiting" +msgstr "" +"Gli aggiornamenti software sono pronti e in attesa per essere installati" + +#: src/gs-update-monitor.c:241 +msgid "Updates Available to Download" +msgstr "Aggiornamenti disponibili per lo scaricamento" + +#: src/gs-update-monitor.c:242 +msgid "Software updates can be downloaded" +msgstr "Gli aggiornamenti software possono essere scaricati" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:358 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u applicazione aggiornata — Riavvio richiesto" +msgstr[1] "%u applicazioni aggiornate — Riavvio richiesto" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:364 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u applicazione aggiornata" +msgstr[1] "%u applicazioni aggiornate" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:375 +#, c-format +msgid "%s has been updated." +msgstr "%s è stata aggiornata." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:378 +msgid "Please restart the app." +msgstr "Riavviare l'applicazione." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:386 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s e %s sono state aggiornate." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:392 src/gs-update-monitor.c:411 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u applicazione richiede il riavvio." +msgstr[1] "%u applicazioni richiedono il riavvio." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:404 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Include %s, %s e %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:704 +msgid "Operating System Updates Unavailable" +msgstr "Aggiornamenti del sistema operativo non disponibili" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:706 +msgid "Upgrade to continue receiving security updates." +msgstr "Avanzare per continuare a ricevere gli aggiornamenti di sicurezza." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:761 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Una nuova versione di %s è disponibile per l'installazione" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:765 +msgid "Software Upgrade Available" +msgstr "Avanzamento software disponibile" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1210 +msgid "Software Updates Failed" +msgstr "Aggiornamenti software non riusciti" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1212 +msgid "An important operating system update failed to be installed." +msgstr "" +"Non è riuscita l'installazione di un aggiornamento importante del sistema " +"operativo." + +#: src/gs-update-monitor.c:1213 +msgid "Show Details" +msgstr "Mostra dettagli" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1258 +msgid "System Upgrade Complete" +msgstr "Avanzamento del sistema completato" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1263 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Benvenuto a %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1272 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Aggiornamento software installato" +msgstr[1] "Aggiornamenti software installati" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1276 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "" +"È stato installato un aggiornamento importante del sistema operativo." +msgstr[1] "" +"Sono stati installati degli aggiornamenti importanti del sistema operativo." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1287 +msgctxt "updates" +msgid "Review" +msgstr "Esamina" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1337 +msgid "Failed To Update" +msgstr "Aggiornamento non riuscito" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1342 +msgid "The system was already up to date." +msgstr "Il sistema è già stato aggiornato." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1347 +msgid "The update was cancelled." +msgstr "L'aggiornamento è stato annullato." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1352 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"L'accesso a Internet era richiesto ma non era disponibile. Assicurarsi di " +"avere l'accesso a Internet e riprovare." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1357 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Ci sono problemi di sicurezza con l'aggiornamento. Consultare il fornitore " +"del software per maggiori dettagli." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1362 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Non c'è abbastanza spazio libero sul disco. Liberare dello spazio e " +"riprovare." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1366 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"L'installazione dell'aggiornamento non è riuscita. Attendere per un altro " +"aggiornamento e riprovare. Se il problema persiste, contattare il fornitore " +"del software." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Ultimo controllo: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Interrompi" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Controlla gli aggiornamenti" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ha interrotto la ricezione di aggiornamenti critici del software" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Il sistema operativo ha interrotto la ricezione di aggiornamenti critici del " +"software" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Potrebbero esserci dei costi" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Controllare gli aggiornamenti quando si usa la banda larga mobile potrebbe " +"causare costi aggiuntivi." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Controlla _comunque" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Aggiornamenti software scaricati" + +#: src/gs-updates-page.c:893 +msgid "Software upgrades have been downloaded and are ready to be installed." +msgstr "" +"Gli aggiornamenti software sono stati scaricati e sono pronti per essere " +"installati." + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Controllo aggiornamenti" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Aggiornamenti" + +#: src/gs-updates-page.ui:6 +msgid "Updates page" +msgstr "Pagina aggiornamenti" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:58 +msgid "Loading Updates" +msgstr "Caricamento Aggiornamenti" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:71 +msgid "This could take a while" +msgstr "Potrebbe richiedere tempo" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:191 +msgid "Up to Date" +msgstr "Aggiornato" + +#: src/gs-updates-page.ui:230 +msgid "Use Mobile Data?" +msgstr "Usare dati mobili?" + +#: src/gs-updates-page.ui:231 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Controllare gli aggiornamenti quando si usa la banda larga mobile potrebbe " +"causare costi aggiuntivi" + +#: src/gs-updates-page.ui:234 +msgid "_Check Anyway" +msgstr "_Controlla comunque" + +#: src/gs-updates-page.ui:253 +msgid "No Connection" +msgstr "Nessuna connessione" + +#: src/gs-updates-page.ui:254 +msgid "Go online to check for updates" +msgstr "Vai online per verificare la presenza di aggiornamenti" + +#: src/gs-updates-page.ui:257 +msgid "_Network Settings" +msgstr "Impostazioni della _rete" + +#: src/gs-updates-page.ui:277 src/gs-updates-page.ui:291 +msgid "Error" +msgstr "Errore" + +#: src/gs-updates-page.ui:292 +msgid "Updates are automatically managed" +msgstr "Gli aggiornamenti sono gestiti automaticamente" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Aggiornamenti software in pausa" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Gli aggiornamenti automatici del software sono stati sospesi per i seguenti " +"motivi:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• La connessione di rete attuale è a consumo" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• La connessione di rete attuale non consente scaricamenti di grandi " +"dimensioni" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• È attiva la modalità di risparmio energetico" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• È attiva la modalità Gioco" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Aggiornamenti software in pausa" + +#: src/gs-updates-paused-banner.c:84 +#, fuzzy +msgid "Network connection is metered — software updates paused" +msgstr "" +"La connessione di rete è a consumo - gli aggiornamenti software sono in pausa" + +#: src/gs-updates-paused-banner.c:86 +#, fuzzy +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"La connessione di rete non consente di scaricare grandi quantità di dati - " +"gli aggiornamenti software sono in pausa" + +#: src/gs-updates-paused-banner.c:88 +#, fuzzy +msgid "Power saver mode is active — software updates paused" +msgstr "Modalità risparmio energetico attiva - aggiornamenti software in pausa" + +#: src/gs-updates-paused-banner.c:90 +#, fuzzy +msgid "Game mode is active — software updates paused" +msgstr "È attiva la modalità Gioco - gli aggiornamenti software sono in pausa" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:324 +msgid "_Restart & Update…" +msgstr "_Riavvia e aggiorna…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:330 +msgid "U_pdate All" +msgstr "A_ggiorna tutto" + +#: src/gs-updates-section.c:407 +msgid "Software Updates Downloaded" +msgstr "Aggiornamenti software scaricati" + +#: src/gs-updates-section.c:408 +msgid "Software updates have been downloaded and are ready to be installed." +msgstr "" +"Gli aggiornamenti software sono stati scaricati e sono pronti per essere " +"installati." + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:499 +msgid "Integrated Firmware" +msgstr "Firmware integrato" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:504 +msgid "Requires Restart" +msgstr "Riavvio richiesto" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:509 +msgid "App Updates" +msgstr "Aggiornamenti applicazione" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:514 +msgid "Device Firmware" +msgstr "Firmware dispositivo" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Scarica" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "È disponibile %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "È disponibile %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Maggiori informazioni sulla nuova versione" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s di %s scaricati" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Scaricato il %u%%" + +#: src/gs-upgrade-banner.ui:42 +msgid "A major upgrade, with new features and added polish." +msgstr "" +"Un avanzamento importante, con nuove funzionalità e migliorie aggiuntive." + +#: src/gs-upgrade-banner.ui:187 +msgid "_Restart & Upgrade…" +msgstr "_Riavvia e avanza…" + +#: src/gs-upgrade-banner.ui:215 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Ricorda di fare un backup dei dati e dei file prima di eseguire " +"l'avanzamento." + +#: lib/gs-utils.c:523 lib/gs-utils.c:554 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Impossibile eliminare il file “%s”: %s" + +#: lib/gs-utils.c:565 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Impossibile eliminare la directory “%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Aggiunge, rimuove o aggiorna software su questo computer" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Store;Aggiornamenti;Avanzamento;Sorgenti;Repository;" +"Preferenze;Installare;Disinstallare;Programma;Software;Applicazione;Negozio;" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:71 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3377 +msgid "System Updates" +msgstr "Aggiornamenti del sistema" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:76 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3382 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Aggiornamenti generali del sistema, come correzioni di sicurezza e di bug, e " +"miglioramenti delle prestazioni." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:689 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Aggiornamento di %s con nuove funzionalità e correzioni." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1306 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Impossibile per il servizio di aggiornamento di EOS recuperare e applicare " +"l'aggiornamento." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Applicazione web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Supporto applicazione web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Lancia popolari applicazioni web in un browser" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Avanzamento per le ultime funzionalità, prestazioni e miglioramenti di " +"stabilità." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Supporto Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak è un framework per le applicazioni desktop su Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Cartella sistema %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Sottocartella %s della home" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Cartelle sistema ospite" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "Configurazione sistema ospite da /etc" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Cartella Scrivania" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Sottocartella %s di Scrivania" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Cartella Documenti" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Sottocartella %s di Documenti" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Cartella Musica" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Sottocartella %s di Musica" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Cartella Immagini" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Sottocartella %s di Immagini" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Cartella Pubblici" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Sottocartella %s di Pubblici" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Cartella Video" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Sottocartella %s di Video" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Cartella Modelli" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Sottocartella %s di Modelli" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Cartella cache utente" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Sottocartella cache utente %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Cartella configurazione utente" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Sottocartella configurazione utente %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Cartella dati utente" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Sottocartella dati utente %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Cartella runtime utente" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Sottocartella runtime utente %s" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Accesso file system a %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1373 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Recupero metadati flatpak di %s…" + +#: plugins/flatpak/gs-flatpak.c:3589 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Impossibile affinare il plugin «%s»: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Installazione utente" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Installazione sistema" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "ID dell'app" + +#: plugins/flatpak/gs-plugin-flatpak.c:1343 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Aggiunta all'installazione del plugin «%s» non riuscita: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1357 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Aggiunta alla disinstallazione del plugin «%s» non riuscita: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1946 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"«%s» remoto non consente l'installazione di «%s», probabilmente a causa di " +"qualche filtro. Rimuovere il filtro e ripetere l'installazione. Dettagli " +"dell'errore: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "La batteria di sistema è troppo bassa per effettuare l'aggiornamento" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"La batteria di sistema è troppo bassa per effettuare l'aggiornamento (%u%%, " +"richiede %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Il dispositivo non è raggiungibile o è fuori dal campo wireless" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "La batteria del dispositivo è troppo bassa" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "La batteria del dispositivo è troppo bassa (%u%%, richiede %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Il dispositivo è in attesa che gli aggiornamenti siano applicati" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Il dispositivo richiede che l'alimentatore sia connesso" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Il dispositivo non può essere usato quando il coperchio è chiuso" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s Device Update" +msgstr "Aggiornamento dispositivo %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s System Update" +msgstr "Aggiornamento sistema %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Aggiornamento controller incorporato %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s ME Update" +msgstr "Aggiornamento ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Aggiornamento ME aziendale %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:238 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Aggiornamento ME consumer %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:244 +#, c-format +msgid "%s Controller Update" +msgstr "Aggiornamento controller %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Aggiornamento controller Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Aggiornamento microcodice processore %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:260 +#, c-format +msgid "%s Configuration Update" +msgstr "Aggiornamento configurazione %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Battery Update" +msgstr "Aggiornamento batteria %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:269 +#, c-format +msgid "%s Camera Update" +msgstr "Aggiornamento videocamera %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:273 +#, c-format +msgid "%s TPM Update" +msgstr "Aggiornamento TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:277 +#, c-format +msgid "%s Touchpad Update" +msgstr "Aggiornamento schermo tattile %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:281 +#, c-format +msgid "%s Mouse Update" +msgstr "Aggiornamento mouse %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:285 +#, c-format +msgid "%s Keyboard Update" +msgstr "Aggiornamento tastiera %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Aggiornamento controller di archiviazione %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Network Interface Update" +msgstr "Aggiornamento interfaccia di rete %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s Display Update" +msgstr "Aggiornamento schermo %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s BMC Update" +msgstr "Aggiornamento BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:309 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Aggiornamento del ricevitore USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:313 +#, c-format +msgid "%s Drive Update" +msgstr "%s aggiornamento del disco" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s aggiornamento della pennetta" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s SSD Update" +msgstr "%s aggiornamento del SSD" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s GPU Update" +msgstr "%s aggiornamento della GPU" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s Dock Update" +msgstr "%s aggiornamento della dock" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:337 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s aggiornamento della dock USB" + +#: plugins/fwupd/gs-plugin-fwupd.c:1705 +msgid "Firmware update could not be applied: " +msgstr "Impossibile applicare l'aggiornamento firmware: " + +#: plugins/fwupd/gs-plugin-fwupd.c:1893 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Supporto aggiornamento firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Fornisce il supporto agli aggiornamenti firmware" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Installare software non firmato?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Il software che si sta installando non è firmato. Non è possibile verificare " +"l'origine degli aggiornamenti di questo software, o se questi sono stati " +"manomessi." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Scaricare software non firmato?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Sono disponibili degli aggiornamenti non firmati. Senza una firma non è " +"possibile verificare l'origine dell'aggiornamento o se questo è stato " +"manomesso." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Aggiornare software non firmato?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Sono disponibili degli aggiornamenti non firmati. Senza una firma non è " +"possibile verificare l'origine dell'aggiornamento o se questo è stato " +"manomesso. Gli aggiornamenti software saranno disabilitati fino a quando gli " +"aggiornamenti non firmati saranno rimossi o aggiornati." + +#: plugins/packagekit/gs-plugin-packagekit.c:373 +msgid "Packages" +msgstr "Pacchetti" + +#: plugins/packagekit/gs-plugin-packagekit.c:3781 +msgid "Failed to install updates: " +msgstr "Impossibile installare gli aggiornamenti: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3091 +msgid "Operating System (OSTree)" +msgstr "Sistema operativo (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Supporto Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Uno snap è un pacchetto universale per Linux" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Un piacevole modo per gestire il software sul sistema." + +#, c-format, python-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Immettere un numero da 1 a %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Scegliere un'applicazione:" + +#, c-format, python-format +#~ msgid "%s is now installed" +#~ msgstr "%s è ora installato" + +#~ msgid "System updates are now installed" +#~ msgstr "Gli aggiornamenti del sistema sono ora installati" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Un'applicazione è stata rimossa" +#~ msgstr[1] "Delle applicazioni sono state rimosse" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Scaricamento Catalogo software" + +#~ msgid "Moderate page" +#~ msgstr "Pagina moderata" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Non ci sono recensioni da moderare" + +#, c-format, python-format +#~ msgid "%s %s %s" +#~ msgstr "%s %s %s" + +#~ msgid "Meh" +#~ msgstr "Indifferente" + +#~ msgid "Outdated SDK version" +#~ msgstr "Versione SDK obsoleta" + +#~ msgid "Unable to install updates" +#~ msgstr "Impossibile installare gli aggiornamenti" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Impossibile disinstallare: autenticazione non valida" + +#~ msgid "Network Settings" +#~ msgstr "Impostazioni rete" + +#~ msgid "_Restart Now…" +#~ msgstr "_Riavvia ora…" + +#~ msgid "No Network" +#~ msgstr "Nessuna rete" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "L'accesso alla rete è richiesto per controllare gli aggiornamenti." + +#~ msgid "Network _Settings" +#~ msgstr "Imposta_zioni di rete" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Scaricamento informazioni d'avanzamento…" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..9bd3d86 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,7274 @@ +# Japanese translation for gnome-software. +# Copyright (C) 2013-2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Jiro Matsuzawa , 2013-2018. +# Hajime Taira , 2015. +# Kentaro KAZUHAMA , 2015. +# Rockworld , 2016. +# Takashi Oshie <>, 2016. +# sujiniku , 2018, 2020-2021. +# Shinichirou Yamada , 2018. +# sicklylife , 2019-2020, 2022. +# Yuki Okushi , 2021. +# Umoxfo , 2025. +# Kusano Takayuki , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software gnome-48\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-05-13 19:46+0000\n" +"PO-Revision-Date: 2025-05-18 23:31+0900\n" +"Last-Translator: Kusano Takayuki \n" +"Language-Team: Japanese \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" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "ソフトウェア" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "アプリのインストールと更新" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"“ソフトウェア”では、新しいアプリやシステム拡張機能を検索してインストールでき" +"ます。また、インストール済みのアプリを削除することもできます。" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"“ソフトウェア”では、おすすめのアプリや人気のアプリを、分かりやすい説明文と豊" +"富なスクリーンショットと共に紹介しています。目的のアプリを簡単に見つけられる" +"よう、カテゴリ一覧や検索機能を備えています。また、オフライン更新によるシステ" +"ムの更新も可能です。" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "概要パネル" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "詳細パネル" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "インストール済みパネル" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "アップデートパネル" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "アップデートの詳細" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2789 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "The GNOME Project" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Shim UEFI で akmods キーをテスト" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Shim UEFI で akmods キーをテストするには、認証が必要です" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Shim UEFI に akmods キーを登録" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Shim UEFI に akmods キーを登録するには、認証が必要です" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Shim UEFI で DKMS キーをテスト" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Shim UEFI で DKMS キーをテストするには、認証が必要です" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Shim UEFI に DKMS キーを登録" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Shim UEFI に DKMS キーを登録するには、認証が必要です" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "appstream ファイルをシステムのある場所にインストールする" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "appstream ファイルをシステムのある場所にインストールしています" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "互換性のあるプロジェクトのリスト" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"これは、GNOME、KDE、XFCE など、表示すべき互換性のあるプロジェクトの一覧です。" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "GNOMEソフトウェアでアップデートとアップグレードを管理するかどうか" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"無効にすると、GNOMEソフトウェアはアップデートパネルを非表示にし、自動アップ" +"デートの処理を実行せず、アップグレードのプロンプトも表示しません。" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "アップデートを自動的にダウンロードしてインストールする" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"有効にすると、GNOME ソフトウェアはバックグラウンドでソフトウェアアップデート" +"を自動的にダウンロードし、再起動を必要としないアップデートは自動的にインス" +"トールします。" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"バックグラウンドでアップデートされたソフトウェアについてユーザーに通知する" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"有効にすると、GNOME ソフトウェアはユーザーがアイドル状態のときに起きたアップ" +"デートについて通知します。" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "従量制課金接続時に自動でリフレッシュするかどうか" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"有効にすると、GNOME ソフトウェアは従量制課金接続を利用している場合でも、バッ" +"クグラウンドで自動更新を行います (メタデータのダウンロード、アップデートの確" +"認などを行うため、ユーザーに費用が発生する可能性があります)。" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "GNOME ソフトウェアの初回起動かどうか" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "アプリケーションの横に星評価を表示する" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"リモートに設定されたデフォルトブランチに基づいてアプリケーションをフィルター" +"する" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"非フリーのアプリケーションをインストールする際に警告ダイアログを表示する" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"非フリーのアプリケーションをインストールする際に警告ダイアログを表示すること" +"ができます。この設定は、そのダイアログの表示を抑制するかどうかを制御します。" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "最終アップデートチェックのタイムスタンプ" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "最終アップグレード通知のタイムスタンプ" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "最終アップデート通知のタイムスタンプ" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"最初のセキュリティアップデートのタイムスタンプ (アップデート後にクリアされま" +"す)" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "最終アップデートのタイムスタンプ" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"アップストリームのスクリーンショットがまだ有効かどうかを検証するための経過秒" +"数" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"大きな値を選択すると、リモートサーバへのラウンドトリップが少なくなりますが、" +"スクリーンショットの更新がユーザーに表示されるまでに時間がかかる可能性があり" +"ます。値に 0 を設定すると、キャッシュに既に画像がある場合には、サーバーへの確" +"認を行わなくなります。" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "アプリケーションのレビューに使用するサーバー" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "レビューの最低カルマスコア" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "カルマがこの数値より低いレビューは表示されません。" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "サードパーティとして見なされない公式リポジトリのリスト" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "無効化や削除できない必須リポジトリのリスト" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "自由ソフトウェアとして見なされるべき公式リポジトリのリスト" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"アプリケーションが自由ソフトウェアとして見なされる場合に使用するライセンスの " +"URL" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"可能な場合、システム上の全ユーザー向けにバンドルされたアプリケーションをイン" +"ストールする" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "「ソフトウェアリポジトリ」ダイアログへのアクセスを許可する" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "プレリリース版へのアップグレードを提供する" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "アプリがプロプライエタリであることをユーザーに知らせるUI要素を表示する" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "インストール済みアプリ一覧に、各アプリのインストールサイズを表示する" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://ja.wikipedia.org/wiki/プロプライエタリソフトウェア'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "非自由およびプロプライエタリソフトウェアを説明する URI" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"swcatalog フォルダーにダウンロードされる AppStream ファイルへの URL の一覧" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"すべてのユーザー向けに、AppStream ファイルをシステムワイドな場所にインストー" +"ルする。false の場合、ファイルは非標準の $XDG_DATA_HOME/swcatalog/xml ディレ" +"クトリにインストールされます" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"パッケージ形式の優先順位を指定します。より重要な形式を先頭に記載してくださ" +"い。空の配列はデフォルトの順序を意味し、リストに含まれていない形式は末尾に配" +"置されるとみなされます。例として、deb、flatpak、rpm、snap などがあります。形" +"式はオプションでオリジン名を指定でき、コロンで区切って表記します(例: " +"flatpak:flathub)。" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "最後に未使用の Flatpak ランタイムの削除を試みた時のタイムスタンプ" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"'true' に設定すると、自由ライセンスのアプリのみを表示し、プロプライエタリなア" +"プリを非表示にします。" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"'true' に設定すると、本人確認済みの開発者によるアプリのみを表示します。" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "最後に受信した履歴更新のタイムスタンプ。" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "ログインに使用される GNOME オンラインアカウントの ID を格納する文字列" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME ソフトウェア AppStream システムワイドインストーラー" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "コマンドライン引数の解析に失敗しました" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "ファイル名を一つ指定する必要があります" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "このプログラムは root ユーザーのみ実行可能です" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "コンテンツタイプの検証に失敗しました: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "移動に失敗しました: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "ソフトウェアのインストール" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "選択したソフトウェアをシステムにインストールします" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "アニメ的暴力表現" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "アニメ的暴力表現に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "ファンタジー暴力表現" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "ファンタジー暴力表現に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "リアルな暴力表現" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "リアルな暴力表現に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "流血を伴う暴力表現" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "流血表現に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "性的暴力表現" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "性的暴力表現に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "アルコール" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "アルコールへの言及に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "麻薬" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "違法薬物への言及に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "タバコ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "タバコ製品への言及に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "ヌード" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "いかなる種類のヌードに関する情報もありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "性的なテーマ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "性的な性質への言及または描写に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "冒涜的な言葉" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "いかなる種類の冒涜的な言葉に関する情報もありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "不適切なユーモア" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "不適切なユーモアに関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "差別" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "いかなる種類の差別的な言葉に関する情報もありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "広告" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "いかなる種類の広告に関する情報もありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "ギャンブル" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "いかなる種類のギャンブルに関する情報もありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "購入" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "金銭を消費する機能に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "ユーザー間のチャット" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "他のユーザーとチャットする方法に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "ユーザー間の音声チャット" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "他のユーザーと会話する方法に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "連絡先の詳細" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"ソーシャルネットワークのユーザー名またはメールアドレスの共有に関する情報はあ" +"りません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "個人を特定できる情報" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "第三者とのユーザー情報の共有に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "位置情報の共有" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "他のユーザーとの物理的な位置情報の共有に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "同性愛" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "同性愛への言及に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "売春" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "売春への言及に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "不倫" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "不倫への言及に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "性的に描写されたキャラクター" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "性的に描写されたキャラクターに関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "冒涜" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "冒涜への言及に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "人間の遺体" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "目に見える人間の遺体に関する情報はありません" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "奴隷制度" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "奴隷制度への言及に関する情報はありません" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "薬物への言及は含まれていません" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "罵り言葉、冒涜的な言葉、その他の種類の強い言葉遣いは含まれていません" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "広告や金銭取引は含まれていません" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "性的な内容やヌードは含まれていません" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "制御されていないチャット機能は含まれていません" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "暴力表現は含まれていません" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "薬物" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "強い言葉遣い" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "金銭" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "ソーシャル" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "暴力" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "全年齢" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s には不明な年齢評価があります" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s はすべての人に適しています" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s は幼児に適しています" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s は幼い子供に適しています" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s は子供に適しています" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s はティーンエイジャーに適しています" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s は大人に適しています" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s は %s に適しています" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "推奨年齢レーティング" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "不足している情報を追加するには(_H)" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "ローカルファイル" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "パッケージ" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "保留中" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "インストール保留中" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "削除保留中" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "インストール中" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "削除中" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "ダウンロード中" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "インストール(_I)" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "アンインストール…(_U)" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "ネットワーク" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "ネットワーク経由で通信できます" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "システムサービス" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "システムバス上の D-Bus サービスにアクセスできます" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "セッションサービス" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "セッションバス上の D-Bus サービスにアクセスできます" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "デバイス" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "ウェブカメラなどの任意のデバイスにアクセスできます" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "入力デバイスにアクセスできます" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "マイクにアクセスし、音声を再生できます" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "システムのデバイスファイルにアクセスできます" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "画面の内容" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "画面の内容にアクセスできます" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "ホームフォルダー" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "ファイルを作成、表示、編集できます" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "ファイルを表示できます" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "ファイルシステム" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "ダウンロードフォルダー" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "設定" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "すべての設定を表示および変更できます" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "レガシーなディスプレイシステム" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "古く、セキュリティが不十分なディスプレイシステムを使用します" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "サンドボックス脱出" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "サンドボックスから抜け出し、色々な制限を回避できます" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "アップデートの説明はありません。" + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "アップデートの詳細" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "追加の権限が必要です" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "サーバーから無効な評価データを受信しました" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "評価サーバーと通信できませんでした" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "レビュー" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "このアプリのレビューが見つかりませんでした。" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "レビューなし" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "バージョン履歴" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "バージョン %s の更新内容" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "バージョン %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "このリリースの詳細はありません" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%x" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"起動モード (指定可能な値): ‘updates’, ‘updated’, ‘installed’, ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "アプリケーションを検索する" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "アプリケーションの詳細を表示する (アプリケーション ID を指定)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "アプリケーションの詳細を表示する (パッケージ名を指定)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "アプリケーションをインストールする (アプリケーション ID を指定)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "アプリケーションをアンインストールする (アプリケーション ID を指定)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "ローカルのパッケージファイルを開く" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILENAME" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"このアクションに期待される対話の種類 (指定可能な値): ‘none’, ‘notify’, ‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "ローカルの metainfo または appdata ファイルを表示" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"詳細なデバッグ出力を有効にする (実行中のインスタンスから、既に実行されている" +"場合)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "保留中のアップデートをバックグラウンドでインストールする" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "設定を表示" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "実行中のインスタンスを終了する" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "AppStream よりもローカルファイルソースを優先する" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "バージョン番号を表示する" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 GNOME Software contributors" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"松澤 二郎 \n" +"Hajime Taira \n" +"Kentaro KAZUHAMA \n" +"Rockworld \n" +"Shinichirou Yamada \n" +"sicklylife \n" +"sujiniku \n" +"Takashi Oshie <>\n" +"Yuki Okushi \n" +"Umoxfo \n" +"Japanese Translation Team https://l10n.gnome.org/teams/ja/\n" +"Kusano Takayuki https://bsky.app/profile/tkusano.jp" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "申し訳ありません。そのアプリケーションの詳細はありません。" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "インストールサイズ" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "%s のデータと %s のキャッシュを含む" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "%s のデータを含む" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "%s のキャッシュを含む" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "キャッシュとデータの使用量は不明です" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "ダウンロードサイズ" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "追加のシステムダウンロードは必要ありません" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "不明なサイズの追加のシステムダウンロードが必要です" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "%s の追加のシステムダウンロードが必要です" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "サイズは不明です" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "権限なし" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "ネットワークアクセスあり" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "システムサービスの使用" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "セッションサービスの使用" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "ハードウェアデバイスにアクセス可能" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "システムデバイスにアクセス可能" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "すべてのデータを読み書き可能" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "すべてのデータを読み取り可能" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "「ダウンロード」を読み書き可能" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "「ダウンロード」を読み取り可能" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "特定のファイルにアクセス可能" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "ユーザー設定へのアクセスと変更が可能" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "レガシーなウィンドウシステムを使用" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "任意の権限を取得可能" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "ソフトウェア開発者は認証済み" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "OS ディストリビュータによりレビュー済み" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "%s によるレビュー済み" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "サードパーティーによる提供" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "ソフトウェアのサポートは終了しました" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "監査可能なコード" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "ライセンス不明" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "プロプライエタリコード" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "特別ライセンス" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "特権" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "安全" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "安全でない可能性" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "潜在的に危険" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "危険" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "モバイルのみ" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "小さい画面でのみ動作する" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "デスクトップのみ" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "大きい画面でのみ動作する" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "画面サイズの不一致" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "現在の画面サイズをサポートしていません" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "タッチスクリーンが必要です" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "キーボードが必要です" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "マウスが必要です" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "ゲームパッド必須" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "プレイするにはゲームパッドが必要です" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "適応" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "スマートフォン、タブレット、デスクトップで動作します" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "おそらくキーボードまたはマウスが必要です" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "デスクトップとノートパソコンで動作します" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "全年齢対象" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "推奨年齢レーティング情報がありません" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "ウェブサイトにアクセス" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "インストール…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "キャンセル" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "インストール" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "ダウンロード" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "アップデート" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "アンインストール…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "アンインストール中" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "重要なアップデート" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "アップデート中はデバイスを使用できません。" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "ソース: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "%s から名前が変更されました" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "アップデートの受信を停止しました" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "重要なアップデート" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "インストール済み" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "%s の翻訳を手伝う" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s は貢献者の国際的なコミュニティによってデザイン、開発、翻訳されています。\n" +"\n" +"そのため、まだあなたの言語では利用できませんが、あなた自身がコミュニティに参" +"加して翻訳を手伝うことができます。" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "翻訳" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "翻訳ウェブサイト(_T)" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "リモート %s (レルム %s) へのログインが必要です" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "ログインが必要です" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "キャンセル(_C)" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "ログイン(_L)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "ユーザー(_U)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "パスワード(_P)" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "その他" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "すべて" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "おすすめ" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "編集者のおすすめ" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "新規 & アップデート" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "ウェブからのおすすめ" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "その他のソフトウェア" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s (インストール済み)" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "変更を有効にするには再起動が必要です" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "アプリを使用する準備ができました" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "システムアップデートがインストールされました" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "最近インストールされたアップデートを確認できます" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "再起動" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "起動" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "ソフトウェアをインストールしますか?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "サードパーティ製ソフトウェアをインストールしますか?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "ソフトウェアリポジトリーを有効にしますか?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "サードパーティのソフトウェアリポジトリを有効にしますか?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s は自由でオープンソースのソ" +"フトウェアではなく、“%s”によって提供されています。" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s は“%s”によって提供されています。" + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"インストールを続行するには、このソフトウェアリポジトリを有効にする必要があり" +"ます。" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"一部の国や地域では %s のインストールまたは使用が違法となる場合があります。" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"一部の国や地域ではこのコーデックのインストールまたは使用が違法となる場合があ" +"ります。" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "今後警告しない(_W)" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "有効にしてインストール(_I)" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "パッケージマネージャーからのエラーの詳細:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "詳細" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "閉じる(_C)" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "詳細をクリップボードにコピーしました" + +# 署名なしソフトウェアのインストール/アップデート時に表示されるボタンだと思われる。gnome-bluetooth と同じように「承認」と訳しておく。 +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "承認(_A)" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "アップデートがインストールされました" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "アプリがアンインストールされました" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "有効にするには再起動が必要です" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "今はしない" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "今日" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "昨日" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d 日前" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d 週間前" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d か月前" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d 年前" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "たった今" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d 分前" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d 時間前" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "すべて" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "おすすめ" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D グラフィック" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "写真" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "スキャニング" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "ベクターグラフィック" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "ビューアー" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "オーディオ作成 & 編集" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "音楽プレーヤー" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "すべて" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "おすすめ" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "カレンダー" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "データベース" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "ファイナンス" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "ワープロ" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "テキストエディター" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "ウェブブラウザー" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "すべて" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "おすすめ" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "アクション" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "アドベンチャー" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "アーケード" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "ブロック" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "ボード" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "カード" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "エミュレーター" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "キッズ" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "ロジック" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "ロールプレイング" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "スポーツ" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "ストラテジー" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "すべて" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "おすすめ" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "チャット" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "すべて" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "おすすめ" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "人工知能" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "天文学" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "化学" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "言語" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "数学" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "ニュース" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "ロボット工学" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "アート" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "地理学" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "コミック" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "フィクション" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "健康" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "歴史" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "ライフスタイル" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "政治" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "スポーツ" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "すべて" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "おすすめ" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "デバッガー" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "コーデック" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "ハードウェアドライバー" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "フォント" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "入力ソース" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "言語パック" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "ローカライゼーション" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "クリエイト" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "仕事" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "遊び" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "ソーシャライズ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "学習" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "開発" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "コーデック" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "ハードウェアドライバー" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "フォント" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "入力ソース" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "言語パック" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "ローカライゼーション" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "アプリ" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s は追加のファイル形式のサポートを要求しています。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "追加の MIME タイプが必要です" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s は追加のフォントを要求しています。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "追加のフォントが必要です" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s は追加のマルチメディアコーデックを要求しています。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "追加のマルチメディアコーデックが必要です" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s は追加のプリンタードライバーを要求しています。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "追加のプリンタードライバーが必要です" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s は追加のパッケージを要求しています。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "追加のパッケージが必要です" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "“ソフトウェア”で探す" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "詳細を表示(_S)" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "一部を表示(_S)" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "削除中…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "インストールを完了するには再起動が必要です" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "削除を完了するには再起動が必要です" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "インストール保留中…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "アップデート保留中…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "ダウンロード中…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "準備中…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "アンインストール中…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s はインストールされていませんが、データは残っています。" + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "再起動(_R)" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "有効化…(_E)" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "インストール…(_I)" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s はアメリカ英語で表示されます" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "このアプリはアメリカ英語で表示されます" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "このソフトウェアはアメリカ英語で表示されます" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "翻訳を手伝う(_T)" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "%s による他のアプリ" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "開発者 %s は %s の所有権を証明しました" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "開発者は %s の所有権を証明しました" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "レビューを書くにはインターネット接続が必要です" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "このアプリはセキュリティ修正を含むアップデートが今後提供されません" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"このアプリは既にお使いのディストリビューションによって提供されており、置き換" +"えるべきではありません。" + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"このアプリはウェブサイト、コードリポジトリ、または課題トラッカーへのリンクを" +"提供していません。" + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"このソフトウェアはセキュリティ修正を含むアップデートが今後提供されません" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"このソフトウェアは既にお使いのディストリビューションによって提供されており、" +"置き換えるべきではありません。" + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"このソフトウェアはウェブサイト、コードリポジトリ、または課題トラッカーへのリ" +"ンクを提供していません。" + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"ソフトウェアは “%s” の情報を取得できなかったため、このアプリの詳細を表示でき" +"ません。" + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "サーバーから無効なレビュー応答を受信しました" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "“%s”のレビュー送信に失敗しました: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "詳細ページ" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "アプリの詳細を読み込み中" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "検証済み" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "開く(_O)" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "アップデート(_U)" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "アンインストール" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "アドオン" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "このアプリはインターネットに接続しているときのみ使用できます。" + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "ソフトウェアリポジトリが含まれています" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"このアプリには、アップデートや他のソフトウェアへのアクセスを提供するソフト" +"ウェアリポジトリが含まれています。" + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "ソフトウェアリポジトリは含まれていません" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"このアプリにはソフトウェアリポジトリが含まれていません。新しいバージョンへの" +"アップデートは行われません。" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "ソフトウェアリポジトリが検出されました" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"このソフトウェアリポジトリを追加すると、追加のソフトウェアやアップグレードを" +"利用できるようになります。" + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "信頼できるソフトウェアリポジトリのみを使用してください。" + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "アプリデータを消去" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "データを削除(_E)" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "メタデータなし" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "プロジェクトのウェブサイト(_W)" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "寄付(_D)" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "翻訳に貢献(_T)" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "問題を報告(_R)" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "ヘルプ(_H)" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "問い合わせる(_C)" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "レビューを書く(_E)" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "すべてのレビュー" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "アプリの詳細を表示できません" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "再起動の準備に失敗しました" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "不明なエラー" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "キーが見つかりませんでした" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "キーが登録されていません" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK の登録が必要です" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "次へ(_N)" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"このデバイスではセキュアブートが有効になっています。新しいドライバーを有効に" +"するには、新しいマシン所有者キー (MOK) を登録する必要があります。このプロセス" +"では、後ほどパスワードの入力が求められます。キーに関連付けられている次のパス" +"ワードをメモしてください:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "MOK パスワードを控えました(_P)" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "再起動して登録…(_R)" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "セットアップ手順: 注意してお読みください" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"再起動後、デバイスセットアップ画面が表示されます。 新しいドライバーを有効にす" +"るには、セットアップ手順に従ってください:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• 「MOK を登録」を選択\n" +"• 「はい」を選択してキーを登録\n" +"• プロンプトが表示されたら MOK パスワードを入力\n" +"• 次に「再起動」を選択" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "セキュリティへの影響" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"キーの登録が正常に完了した後、このモジュールまたは他のモジュールへの今後の" +"アップデートは暗黙的に信頼されることに注意してください。すべてのアップデート" +"は、ユーザーの操作や承認を求めることなく自動的に行われます。" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"詳細なガイダンスはドキュメントページで確認できます。" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "追加のメタデータをダウンロード中…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " および " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s スクリプトを利用可能なフォント" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s に対応したソフトウェア" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "要求されたソフトウェアが見つかりませんでした" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "要求されたソフトウェアの検索に失敗しました" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s が見つかりませんでした" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "ウェブサイト" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "ファイル %s を提供するアプリが見つかりませんでした。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"%s に関する情報やインストールされていないアプリの入手方法は %s で確認できる可" +"能性があります。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s をサポートするアプリが見つかりませんでした。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s は利用できません。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"%s についての情報やこのフォーマットをサポートするアプリの入手方法は %s で確認" +"できる可能性があります。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s スクリプトをサポートする利用可能なフォントが見つかりませんでした。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"%s についての情報や追加フォントの入手方法は %s で確認できる可能性があります。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s フォーマットに対応するアドオンコーデックが見つかりませんでした。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"%s についての情報やこのフォーマットを再生できるコーデックの入手方法は %s で確" +"認できる可能性があります。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s のサポートに必要な Plasma リソースが見つかりませんでした。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"%s についての情報や追加の Plasma リソースの入手方法は %s で確認できる可能性が" +"あります。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s 向けのプリンタードライバーが見つかりませんでした。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"%s についての情報やこのプリンターをサポートするドライバーの入手方法は %s で確" +"認できる可能性があります。" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "ドキュメント" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"%2$s によって要求された %1$s が見つかりませんでした。詳細については %3$s を参" +"照してください。" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"お探しの %s が見つかりませんでした。詳細については %s を参照してください。" + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "検索結果が見つかりませんでした: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s ファイル形式" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "すべてインストール(_A)" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "要求されたソフトウェアが見つかりません" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "コーデックページ" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "検索結果が見つかりませんでした" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "検索を実行できません" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "前へ" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "次へ" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "おすすめアプリ一覧" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "デスクトップサポート" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "大きな画面での使用をサポート" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "デスクトップサポート不明" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "大きな画面がサポートされているか判断するための十分な情報がありません" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "大きな画面が必須です" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "デスクトップはサポートされていません" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "大きな画面では使用できません" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "モバイルサポート" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "小さな画面での使用をサポート" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "モバイルサポート不明" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "小さな画面がサポートされているか判断するための十分な情報がありません" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "小さな画面が必須です" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "モバイルはサポートされていません" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "小さな画面では使用できません" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "キーボードサポート" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "キーボードサポート不明" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "キーボードをサポートされているか判断するための十分な情報がありません" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "キーボード必須" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "キーボードをサポート" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "キーボードはサポートされていません" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "キーボードでは使用できません" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "マウスサポート" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "マウスまたはポインティングデバイスが必須です" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "マウスサポート不明" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"マウスまたはポインティングデバイスをサポートされているか判断するための十分な" +"情報がありません" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "マウス必須" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "マウスとポインティングデバイスをサポート" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "マウスはサポートされていません" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "マウスまたはポインティングデバイスでは使用できません" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "タッチスクリーンサポート" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "タッチスクリーンサポート不明" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"タッチスクリーンをサポートされているか判断するための十分な情報がありません" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "タッチスクリーン必須" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "タッチスクリーンをサポート" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "タッチスクリーンはサポートされていません" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "タッチスクリーンでは使用できません" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "ゲームパッド必須" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "ゲームパッドが必須です" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "ゲームパッドサポート" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "ゲームパッドをサポート" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s はおそらくこのデバイスで動作します" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s はこのデバイスで動作します" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s はこのデバイスで動作する可能性があります" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s はこのデバイスで正しく動作しません" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s はこのデバイスでは動作しません" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "ハードウェアサポート" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "ナビゲーション" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "「見つける」ページに移動" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "「インストール済み」ページに移動" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "「アップデート」ページに移動" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "検索バーを開く" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "ウィンドウ" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "設定を開く" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "ソフトウェアリポジトリを開く" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "ヘルプ" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "キーボードショートカットを開く" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "インストール済み" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "インストール済みページ" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "処理中" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "アプリ" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "ウェブアプリ" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "システムアプリ" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "コミュニティビルド" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "参加する(_G)" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"このアプリは国際的なコミュニティによってオープンに開発され、%s ライセンスの下でリリースされています。\n" +"\n" +"あなたも参加して、より良くすることができます。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"このアプリは国際的なコミュニティによってオープンに開発され、%s ライセンスの下" +"でリリースされています。\n" +"\n" +"あなたも参加して、より良くすることができます。" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"このソフトウェアは国際的なコミュニティによってオープンに開発され、%s ライセンスの下でリリースされています。\n" +"\n" +"あなたも参加して、より良くすることができます。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"このソフトウェアは国際的なコミュニティによってオープンに開発され、%s ライセン" +"スの下でリリースされています。\n" +"\n" +"あなたも参加して、より良くすることができます。" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "不明なライセンス" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "詳細(_L)" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"このアプリはどのライセンスで開発されているかが明記されておらず、プロプライエ" +"タリである可能性があります。また、検出が困難な形で安全性に問題がある可能性が" +"あり、監視されずに変更される恐れがあります。\n" +"\n" +"このアプリに貢献できる場合とできない場合があります。" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"このソフトウェアは、どのライセンスで開発されているかが明記されておらず、プロ" +"プライエタリである可能性があります。また、検出が困難な形で安全性に問題がある" +"可能性があり、監視されずに変更される恐れがあります。\n" +"\n" +"このソフトウェアに貢献できる場合とできない場合があります。" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "プロプライエタリ" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"このアプリはオープンに開発されていないため、その動作の詳細は開発者のみが把握" +"しています。また、検出が困難な形で安全性に問題がある可能性があり、監視されず" +"に変更される恐れがあります。\n" +"\n" +"このアプリに貢献できない可能性があります。" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"このソフトウェアはオープンに開発されていないため、その動作の詳細は開発者のみ" +"が把握しています。また、検出が困難な形で安全性に問題がある可能性があり、監視" +"されずに変更される恐れがあります。\n" +"\n" +"このソフトウェアに貢献できない可能性があります。" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "特別な許可" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"このアプリは、特別なライセンス %s の下で開発されていま" +"す。\n" +"\n" +"このアプリに貢献できる場合とできない場合があります。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"このアプリは、特別なライセンス “%s” の下で開発されています。\n" +"\n" +"このアプリに貢献できる場合とできない場合があります。" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"このソフトウェアは、特別なライセンス %s の下で開発されてい" +"ます。\n" +"\n" +"このソフトウェアに貢献できる場合とできない場合があります。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"このソフトウェアは、特別なライセンス “%s” の下で開発されています。\n" +"\n" +"このソフトウェアに貢献できる場合とできない場合があります。" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "データを更新中" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "ページを読み込み中" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "起動中" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "不明なソース" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "ベータ版" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "ユーザー" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "追加" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "削除" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "アップデート" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "ダウングレード" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "選択した外部ソース" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"%s からの追加のソフトウェアへアクセスできます。プロプライエタリなソフトウェア" +"がいくつか含まれます。\n" +"\n" +"これらのリポジトリは、後ほど「ソフトウェア」のメインメニューにある「ソフト" +"ウェアリポジトリの設定」で有効にできます。" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "サードパーティーのソフトウェアリポジトリを有効にしますか?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "無視(_I)" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "有効にする(_E)" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "お使いのオペレーティングシステムで利用可能" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "%s で利用可能" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "探索" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "概要ページ" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "利用可能なアプリ" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "その他のカテゴリ" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "アプリのデータが見つかりません" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "不明" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "ユーザーがインストールを拒否しました" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s を準備する" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "本当に %s リポジトリを削除してもよろしいですか?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"%s から提供されるすべてのアプリがアンインストールされ、再び使用するにはリポジ" +"トリを再インストールする必要があります。" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "%s をアンインストールしますか?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "削除後は %s を使用できなくなります。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "削除後は %s に依存するアプリは使用できなくなります。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"削除後は %s を使用できなくなり、それを使用している文書は別のフォントで表示さ" +"れます。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"削除後は %s を使用できなくなります。これにより、一部のメディアファイルが再生" +"できなくなる可能性があります。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"削除後、%s に依存するハードウェアは正しく機能しなくなる可能性があります。" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"削除後は %s を使用できなくなります。アプリのデータと設定は、将来アプリを復元" +"できるようにディスク上に保持されます。" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "設定" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "ソフトウェアのアップデート" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "詳細情報" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"アップデートの確認とダウンロードはデータと電力を消費します。そのため、従量課" +"金制のネットワーク接続中や省電力モードが有効な場合には、自動アップデート機能" +"が一時停止されます。" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "自動(_A)" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "自動的にアップデートを確認し、ダウンロードする" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "手動(_M)" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "アップデートの確認とダウンロードは手動で行う必要があります" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "自動アップデートの通知(_N)" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "アップデートが自動的にインストールされたときに通知する" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "コンテンツフィルター" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "自由ソフトウェアのみ表示(_F)" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "閲覧時および検索時にプロプライエタリソフトウェアを非表示にする" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "本人確認済みの開発者のみ表示(_V)" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "本人確認済みの開発者によるアプリのみを表示する" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"インストール済みのソフトウェアは %s と互換性がなく、アップグレード中に自動的" +"に削除されます。" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "互換性のないソフトウェア" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "アップグレード(_U)" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "アンインストール(_U)" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "アプリの設定とデータ" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "保持(_K)" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "アプリの設定とコンテンツを復元できるようにする" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "削除(_D)" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "ディスク容量を節約するため、データを完全に削除する" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"“%s”からインストールされたソフトウェアは今後アップデートが提供されなくなりま" +"す。" + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "リポジトリを無効にしますか?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "リポジトリを削除しますか?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "無効(_D)" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "削除(_R)" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "新しいリポジトリを有効にする" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "新しいリポジトリが追加されたときに有効にする" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "詳細情報" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "選択されたサードパーティからの追加リポジトリ — %s。" + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora サードパーティリポジトリ" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "オペレーティングシステム" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"これらのリポジトリは %s によって提供される既定のソフトウェアを補完します。" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "ソフトウェアリポジトリ" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "リポジトリがありません" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u 個のアプリがインストール済み" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u 個のアドオンがインストール済み" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u 個のアプリ" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u 個のアドオン" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s と %sがインストール済み" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "インストール済みのソフトウェアを確認中…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "削除" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "嫌い" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "好きではない" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "まあまあ" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "気に入った" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "とても気に入った" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "評価を残すために、星を選んでください" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "レビューを書く際はもう少し時間をかけてご記入ください" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "星評価を選んでください" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "概要が短すぎます" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "概要が長すぎます" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "レビュー内容が短すぎます" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "レビュー内容が長すぎます" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "レビューを書く" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "送信(_S)" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"評価、概要、およびレビュー本文を入力してください。レビューは問題報告のために" +"使用しないでください。問題が発生した場合は、開発者またはサポート提供者にご連" +"絡ください。" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "レビュー概要" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "レビューを書く" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"送信されるデータの内容はプライバ" +"シーポリシーで確認できます。あなたのアカウントの氏名は公開されます。" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u 件のレビュー" + +# 4.5 out of 5 stars のように表示されるが、ここは訳す必要ない気がする +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr " " + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "不明" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "侮辱的、無礼、または差別的なレビューを通報することができます。" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"一度通報されると、そのレビューは管理者によって確認されるまで非表示になりま" +"す。" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "このレビューを通報しますか?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "通報(_R)" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "このレビューを削除しますか?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "レビューを削除すると、元に戻すことはできません。" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "レビューをいいねする" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "レビューを低評価する" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "通報する…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "削除する…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"アプリはサンドボックス化されていませんが、ディストリビューション側で悪意のあ" +"るものではないことが確認されています" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"アプリはサンドボックス化されていないため、提供元が信頼できるか確認してくださ" +"い" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "権限がありません" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "アプリは完全にサンドボックス化されています" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "ネットワークアクセス" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "インターネットにアクセスできます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "ネットワークアクセスがありません" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "インターネットにアクセスできません" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "システムサービスの使用" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "システムサービスからのデータを要求できます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "セッションサービスの使用" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "セッションサービスからのデータを要求できます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "ユーザーデバイスアクセス" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "ウェブカメラやゲームコントローラーなどのデバイスにアクセスできます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "ユーザーデバイスへのアクセスなし" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "ウェブカメラやゲームコントローラーなどのデバイスにアクセスできません" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "入力デバイスへのアクセス" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "マイクへのアクセスおよびオーディオ再生" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"ユーザーの許可を求めることなく、マイクで音声を拾い、オーディオを再生できます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "システムデバイスへのアクセス" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "管理者権限が必要なシステムデバイスにアクセスできます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "画面の内容へのアクセス" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "画面やその他のウィンドウの内容にアクセスできます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "レガシーなウィンドウシステム" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "任意の権限" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "ユーザー設定" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "ファイルシステム全体の読み取り/書き込みアクセス" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "ファイルシステム内のすべてのデータを読み書きできます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "ホームフォルダーの読み取り/書き込みアクセス" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "あなたのホームフォルダー内のすべてのデータを読み書きできます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "ファイルシステム全体の読み取りアクセス" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "ファイルシステム内のすべてのデータを読み取れます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "ホームフォルダーの読み取りアクセス" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "あなたのホームフォルダー内のすべてのデータを読み取れます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "ダウンロードフォルダーの読み取り/書き込みアクセス" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "あなたのダウンロードフォルダー内のすべてのデータを読み書きできます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "ダウンロードフォルダーの読み取りアクセス" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "あなたのダウンロードフォルダー内のすべてのデータを読み取れます" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "ディレクトリ内のすべてのデータを読み書きできます" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "ディレクトリ内のすべてのデータを読み取れます" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "ファイルシステムへのアクセスなし" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "ファイルシステムへは一切アクセスできません" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "アプリ開発者は認証済み" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "このアプリの開発者は、本人であることが確認されています" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "脆弱な依存関係" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"ソフトウェアまたはその依存関係は、サポートが終了しており脆弱である可能性があ" +"ります" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"このアプリは、どのライセンスの下で開発されたかが明記されておらず、プロプライ" +"エタリである可能性があります" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"このソフトウェアは、どのライセンスの下で開発されたかが明記されておらず、プロ" +"プライエタリである可能性があります" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "プロプライエタリコード" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"ソースコードが公開されていないため、独立した監査ができず、安全でない可能性が" +"ある" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "このアプリは特別ライセンス“%s”の下で開発されています" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "このソフトウェアは特別ライセンス“%s”の下で開発されています" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "監査可能なコード" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"ソースコードは公開されており、独立した監査が可能であるため、アプリが安全であ" +"る可能性が高い" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s は特権アプリです" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s は安全です" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s はおそらく安全です" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s は安全ではない可能性があります" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s は安全ではありません" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "不明" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "安全性" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "ライセンス" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "ソース" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"このアプリは古いバージョンのソフトウェアプラットフォーム (SDK) を使用してお" +"り、修正されないバグやセキュリティ脆弱性が含まれている可能性があります。" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "前のスクリーンショット" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "次のスクリーンショット" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "スクリーンショットなし" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "スクリーンショットが見つかりません" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "画像の読み込みに失敗しました" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "スクリーンショットのサイズが見つかりません" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "キャッシュの作成に失敗しました" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "スクリーンショットが無効です" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "スクリーンショットは利用できません" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "スクリーンショット" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "他 %u 件" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "検索ページ" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "アプリを検索" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "アプリが見つかりません" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "アップデートをダウンロードできません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "ファームウェアアップデートをダウンロードできません" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "ファームウェアアップデートを %s からダウンロードできません" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "アップデートを %s からダウンロードできません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "アップデートできません: インターネット接続が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "アップデートできません: ディスク容量が不足しています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"%s からアップデートをダウンロードできません: ディスク容量が不足しています" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "アップデートできません: 認証が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "アップデートできません: 認証できませんでした" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "アップデートできません: 権限が必要です" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"アップデートをダウンロードできません: ソフトウェアをインストールする権限があ" +"りません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "アップデートの一覧を取得できません" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "インストールできません: ダウンロードに失敗しました" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s をインストールできません: %s からのダウンロードに失敗しました" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s をインストールできません: ダウンロードに失敗しました" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "インストールできません: 必要なランタイムがありません" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s をインストールできません: ランタイム %s が利用できません" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "%s をインストールできません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "インストールできません: インターネット接続が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "インストールできません: アプリフォーマットが無効です" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "インストールできません: ディスク容量が不足しています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s をインストールできません: ディスク容量が不足しています" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "インストールできません: 認証が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s をインストールできません: 認証が必要です" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "インストールできません: 認証できませんでした" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s をインストールできません: 認証できませんでした" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "インストールできません: 権限が必要です" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s をインストールできません: 権限が必要です" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "インストールできません: デバイスを電源に接続してください" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s をインストールできません: デバイスを電源に接続してください" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "インストールできません: バッテリー残量が少なくなっています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s をインストールできません: バッテリー残量が少なくなっています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%2$s から %1$s をアップデートできません: ダウンロードに失敗しました" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s をアップデートできません: ダウンロードに失敗しました" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"%s からアップデートをインストールできません: ダウンロードに失敗しました" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "アップデートできません: ダウンロードに失敗しました" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s をアップデートできません: ディスク容量が不足しています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s をアップデートできません: 認証が必要です" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s をアップデートできません: 認証できませんでした" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s をアップデートできません: 権限が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "アップデートできません: デバイスを電源に接続してください" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s をアップデートできません: デバイスを電源に接続してください" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "アップデートできません: バッテリー残量が少なくなっています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s をアップデートできません: バッテリー残量が少なくなっています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "%s をアップデートできません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "アップデートできません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "アップグレードできません" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%2$s から %1$s にアップグレードできません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "アップグレードできません: ダウンロードに失敗しました" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "%s へアップグレードできません: ダウンロードに失敗しました" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "アップグレードできません: インターネット接続が必要です" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "%s へアップグレードできません: インターネット接続が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "アップグレードできません: ディスク容量が不足しています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "%s へアップグレードできません: ディスク容量が不足しています" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "アップグレードできません: 認証が必要です" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "%s へアップグレードできません: 認証が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "アップグレードできません: 認証できませんでした" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "%s へアップグレードできません: 認証できませんでした" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "アップグレードできません: 権限が必要です" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "%s へアップグレードできません: 権限が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "アップグレードできません: デバイスを電源に接続してください" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "%s へアップグレードできません: デバイスを電源に接続してください" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "アップグレードできません: バッテリー残量が少なくなっています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "%s へアップグレードできません: バッテリー残量が少なくなっています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "%s にアップグレードできません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "アンインストールできません: 認証が必要です" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s をアンインストールできません: 認証が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "アンインストールできません: 認証できませんでした" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s をアンインストールできません: 認証できませんでした" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "アンインストールできません: 権限が必要です" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s をアンインストールできません: 権限が必要です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "アンインストールできません: デバイスを電源に接続してください" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s をアンインストールできません: デバイスを電源に接続してください" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "アンインストールできません: バッテリー残量が少なくなっています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s をアンインストールできません: バッテリー残量が少なくなっています" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s をアンインストールできません" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "%s を起動できません" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "申し訳ありません、問題が発生しました" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s を起動できません: %s はインストールされていません" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "操作に必要なディスク容量が不足しています" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "インストールできません: サポートされていないファイル形式です" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "インストールできません: 認証に失敗しました" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "インストールできません" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "%s に接続できません" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "新しいプラグインを使用するには“ソフトウェア”を再起動してください" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "デバイスを AC 電源に接続する必要があります" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "バッテリー残量が少なすぎます" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "ソフトウェアリポジトリ(_S)" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "設定(_P)" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "キーボードショートカット(_K)" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "“ソフトウェア”について(_A)" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "検索" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "メインメニュー" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "アプリを検索" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "探す(_E)" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "インストール済み(_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "アップデート(_U)" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "戻る" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "なし" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "アプリデータ" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "アプリの実行に必要なデータ" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "ユーザーデータ" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "アプリで作成したデータ" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "キャッシュデータ" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "一時的にキャッシュされたデータ" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "アプリ本体" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "必要な依存関係" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "このアプリに必要な共有システムコンポーネント" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "不明" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "キャッシュデータはアプリ設定(_A)から消去できます" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "ストレージ" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (インストール済み)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (インストール中)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (ダウンロード中)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (削除中)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "詳細(_D)" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "検査(_E)" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "%s にインストール済み" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "インストール済みのアップデート" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "インストール済みのアップデートはありません" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "アップデートが古くなっています" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "利用可能なアップデートを確認してください" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "重要なアップデートのインストール準備完了" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "できるだけ早く重要なアップデートをインストールしてください" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "ダウンロード可能な重要なアップデートがあります" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "できるだけ早く重要なアップデートをダウンロードしてください" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "アップデートのインストール準備完了" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "ソフトウェアアップデートの準備ができています" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "ダウンロード可能なアップデートがあります" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "ソフトウェアアップデートをダウンロードできます" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u 個のアプリがアップデートされました — 再起動が必要です" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u 個のアプリがアップデートされました" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s がアップデートされました。" + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "アプリを再起動してください。" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s と %s がアップデートされました。" + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u 個のアプリは再起動が必要です。" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s、%s、および %s を含みます。" + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "システムのサポートは終了しました" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "アップデートを受け取り続けるにはアップグレードしてください" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s の新しいバージョンが利用可能です" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "ソフトウェアのアップグレードが利用可能です" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "ソフトウェアのアップデートに失敗しました" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "準備されたアップデートはインストールされませんでした" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "詳細を表示" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "システムのアップグレードが完了しました" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "%s %s へようこそ!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "ソフトウェアアップデートをインストールしました" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "重要なオペレーティングシステムアップデートをインストールしました。" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "確認" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "アップデートに失敗しました" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "システムはすでに最新の状態です。" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "アップデートがキャンセルされました。" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"インターネット接続が必要でしたが、利用できませんでした。インターネットに接続" +"していることを確認して、もう一度お試しください。" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"アップデートにセキュリティ上の問題がありました。詳細については、ソフトウェア" +"提供元にお問い合わせください。" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"ディスク容量が不足しています。空き容量を確保して、もう一度お試しください。" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"申し訳ありません: アップデートのインストールに失敗しました。次のアップデート" +"をお待ちいただき、再度お試しください。問題が継続する場合は、ソフトウェア提供" +"元にお問い合わせください。" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "最終確認: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "中止" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "アップデートを確認" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s は重要なソフトウェアアップデートの提供が終了しました" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"お使いのオペレーティングシステムは、重要なソフトウェアアップデートの提供が終" +"了しました" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "料金が発生する場合があります" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"モバイルブロードバンド接続中にアップデートを確認すると、料金が発生する可能性" +"があります。" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "とにかく確認(_A)" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "ソフトウェアのアップグレードがダウンロードされました" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "アップグレードのインストール準備が完了しました" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "アップデートを確認" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "アップデート" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "アップデートページ" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "アップデートを読み込み中" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "これには時間がかかる場合があります" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "最新の状態です" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "モバイルデータを使用しますか?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"モバイルブロードバンド接続中にアップデートの確認を行うと、料金が発生する可能" +"性があります" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "とにかく確認する(_C)" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "接続なし" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "オンラインにしてアップデートを確認してください" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "ネットワーク設定(_N)" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "エラー" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "アップデートは自動的に管理されています" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "ソフトウェアのアップデートが一時停止中" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "自動ソフトウェアアップデートが以下の理由により一時停止されています\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• 現在のネットワーク接続が従量課金制です" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• 現在のネットワーク接続では、大容量のダウンロードが禁止されています" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• 省電力モードが有効です" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• ゲームモードが有効です" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "ソフトウェアのアップデートは一時停止中です" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"ネットワーク接続は従量課金制です — ソフトウェアアップデートが一時停止中" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"ネットワーク接続では、大容量のダウンロードが禁止されています — ソフトウェア" +"アップデートが一時停止中" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "省電力モードが有効です — ソフトウェアアップデートが一時停止中" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "ゲームモードが有効です — ソフトウェアアップデートが一時停止中" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "再起動してアップデート… (_R)" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "すべてアップデート(_P)" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "ソフトウェアアップデートがダウンロードされました" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "アップデートのインストール準備が完了しました" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "統合ファームウェア" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "再起動が必要" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "アプリのアップデート" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "デバイスファームウェア" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "ダウンロード(_D)" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s が利用可能です" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s が利用可能です" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "新しいバージョンについて学ぶ" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s / %s ダウンロード済み" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% ダウンロード済み" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "メジャーアップグレード — 新機能が追加され、改良が施されています。" + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "アップグレードをキャンセル" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "再起動してアップグレード… (_R)" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"アップグレードする前にデータおよびファイルのバックアップを取ることを忘れない" +"でください 。" + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "エラーの詳細" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "詳細をコピー" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "ファイル “%s” の削除に失敗しました: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "ディレクトリ “%s” の削除に失敗しました: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "このコンピュータのソフトウェアを追加、削除、または更新する" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +"更新;アップデート;アップグレード;ソース;リポジトリ;レポジトリ;設定;インストー" +"ル;アンインストール;プログラム;ソフトウェア;アプリケーション;ストア;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s の準備完了" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s は有効化され、次回起動時に適用される準備が整いました。" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "有効" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "システムアップデート" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"セキュリティやバグの修正、パフォーマンスの改善など、一般的なシステムのアップ" +"デート。" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "新機能と修正を含む %s のアップデート。" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOSアップデートサービスはアップデートの取得および適用に失敗しました。" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Web アプリ" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Web アプリのサポート" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "人気 Web アプリケーションをブラウザで実行します" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "最新の機能、パフォーマンス、および安定性の向上のためのアップグレード。" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak サポート" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak は Linux 上のデスクトップアプリのためのフレームワークです" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:361 +#, c-format +msgid "System folder %s" +msgstr "システムフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:362 plugins/flatpak/gs-flatpak.c:363 +#, c-format +msgid "Home subfolder %s" +msgstr "ホームサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system folders" +msgstr "ホストシステムフォルダー" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Host system configuration from /etc" +msgstr "/etc からのホストシステム設定" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Desktop folder" +msgstr "デスクトップフォルダー" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Desktop subfolder %s" +msgstr "デスクトップサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Documents folder" +msgstr "ドキュメントフォルダー" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Documents subfolder %s" +msgstr "ドキュメントサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Music folder" +msgstr "ミュージックフォルダー" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Music subfolder %s" +msgstr "ミュージックサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Pictures folder" +msgstr "ピクチャフォルダー" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Pictures subfolder %s" +msgstr "ピクチャサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Public Share folder" +msgstr "パブリック共有フォルダー" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Public Share subfolder %s" +msgstr "パブリック共有サブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Videos folder" +msgstr "ビデオフォルダー" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Videos subfolder %s" +msgstr "ビデオサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "Templates folder" +msgstr "テンプレートフォルダー" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "Templates subfolder %s" +msgstr "テンプレートサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User cache folder" +msgstr "ユーザーキャッシュフォルダー" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User cache subfolder %s" +msgstr "ユーザーキャッシュサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User configuration folder" +msgstr "ユーザー設定フォルダー" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User configuration subfolder %s" +msgstr "ユーザー設定サブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User data folder" +msgstr "ユーザーデータフォルダー" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User data subfolder %s" +msgstr "ユーザーデータサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:376 +msgid "User runtime folder" +msgstr "ユーザーランタイムフォルダー" + +#: plugins/flatpak/gs-flatpak.c:376 +#, c-format +msgid "User runtime subfolder %s" +msgstr "ユーザーランタイムサブフォルダー %s" + +#: plugins/flatpak/gs-flatpak.c:434 +#, c-format +msgid "Filesystem access to %s" +msgstr "%s へのファイルシステムアクセス" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1387 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "%s の Flatpak メタデータを取得中…" + +#: plugins/flatpak/gs-flatpak.c:3613 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "アドオン ‘%s’ の絞り込みに失敗しました: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "ユーザーインストール" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "システムインストール" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "アプリ ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "アドオン ‘%s’ をインストール対象に追加できませんでした: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "アドオン ‘%s’ をアンインストール対象に追加できませんでした: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"リモート \"%s\" では、おそらくフィルターが原因で \"%s\" のインストールが許可" +"されていません。フィルターを解除してインストールを再試行してください。詳細エ" +"ラー: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "バッテリー残量が不足しているため、アップデートを実行できません" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"バッテリー残量が不足しているため、アップデートを実行できません(現在 %u%%、必" +"要 %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "デバイスに接続できません、またはワイヤレス通信範囲外です" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "デバイスのバッテリー残量が不足しています" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "デバイスのバッテリー残量が不足しています(現在 %u%%、必要 %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "デバイスはアップデートの適用を待機しています" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "デバイスは AC 電源に接続されている必要があります" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "ノートパソコンの蓋が閉まっている間はデバイスを使用できません" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s デバイスのアップデート" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s システムのアップデート" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s 組み込みコントローラーのアップデート" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME のアップデート" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s コーポレート ME のアップデート" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s コンシューマ ME のアップデート" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s コントローラーのアップデート" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt コントローラーのアップデート" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU マイクロコードのアップデート" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s 構成のアップデート" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s バッテリーのアップデート" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s カメラのアップデート" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM のアップデート" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s タッチパッドのアップデート" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s マウスのアップデート" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s キーボードのアップデート" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s ストレージコントローラーのアップデート" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s ネットワークインターフェースのアップデート" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s ディスプレイのアップデート" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC のアップデート" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB レシーバーのアップデート" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s ドライブのアップデート" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s フラッシュドライブのアップデート" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD のアップデート" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU のアップデート" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s ドックのアップデート" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB ドックのアップデート" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "ファームウェア" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "ファームウェアアップデートを適用できませんでした: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "ファームウェアアップグレードのサポート" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "ファームウェアのアップグレード機能を提供します" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "署名されていないソフトウェアをインストールしますか?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"インストールされるソフトウェアは署名されていません。このソフトウェアアップ" +"デートの提供元や、アップデートが改ざんされていないかどうかを検証することはで" +"きません。" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "署名されていないソフトウェアをダウンロードしますか?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"署名されていないアップデートが利用可能です。署名がないため、アップデートの提" +"供元や、アップデートが改ざんされていないかどうかを検証することはできません。" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "署名されていないソフトウェアをアップデートしますか?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"署名されていないアップデートが利用可能です。署名がないため、アップデートの提" +"供元や、アップデートが改ざんされていないかどうかを検証することはできません。" +"署名されていないアップデートが削除されるか更新されるまで、ソフトウェアのアッ" +"プデートは無効化されます。" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "アップデートのインストールに失敗しました: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "パッケージ" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "ダウンロード前にトランザクションの終了を待機できませんでした: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "アップデートのダウンロードに失敗しました: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "アップデートの開始に失敗しました: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "オペレーティングシステム (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap ストア" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap サポート" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap は汎用的な Linux パッケージです" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:774 +msgid "System" +msgstr "システム" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:778 +msgid "System component" +msgstr "システムコンポーネント" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1029 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "sysupdate ジョブ '%s' の削除に失敗しました (ステータス %i)" + +#~ msgid "Installed" +#~ msgstr "インストール済み" + +#~ msgid "Uses non-portal system services" +#~ msgstr "非ポータルのシステムサービスを使用" + +#~ msgid "Uses non-portal session services" +#~ msgstr "非ポータルのセッションサービスを使用" + +#~ msgid "Can access some specific non-portal services" +#~ msgstr "特定の非ポータルサービスにアクセス可能" + +#, c-format +#~ msgid "Use the %s System Service" +#~ msgstr "%s システムサービスを使用" + +#, c-format +#~ msgid "Use the %s Session Service" +#~ msgstr "%s セッションサービスを使用" + +#, c-format +#~ msgid "Use the %s Service" +#~ msgstr "%s サービスを使用" + +#~ msgid "Can see the non-portal service" +#~ msgstr "非ポータルサービスを表示できます" + +#~ msgid "Can talk to the non-portal service" +#~ msgstr "非ポータルサービスと通信できます" + +#~ msgid "Can own the non-portal service" +#~ msgstr "非ポータルサービスを所有できます" + +#~ msgid "Your review" +#~ msgstr "あなたのレビュー" + +#~ msgid "No Service Access" +#~ msgstr "サービスへのアクセスなし" + +#~ msgid "Cannot access non-portal session or system services at all" +#~ msgstr "" +#~ "ポータル以外のセッションサービスおよびシステムサービスへは一切アクセスでき" +#~ "ません" + +#~ msgid "Download failed" +#~ msgstr "ダウンロードに失敗しました" + +#, c-format +#~ msgid "Do you want to import key %s?" +#~ msgstr "キー %s をインポートしますか?" + +#, c-format +#~ msgid "Key %s" +#~ msgstr "キー %s" + +#, c-format +#~ msgid "Key user: %s" +#~ msgstr "キーユーザー: %s" + +#, c-format +#~ msgid "Fingerprint: %s" +#~ msgstr "フィンガープリント: %s" + +#, c-format +#~ msgid "From: %s" +#~ msgstr "インポート元: %s" + +#~ msgid "Import Key" +#~ msgstr "キーをインポート" + +#~ msgid "Do you want to import keys?" +#~ msgstr "キーをインポートしますか?" + +#~ msgid "_Import Key" +#~ msgstr "キーをインポート(_I)" + +#~ msgid "GNOME Software" +#~ msgstr "GNOME ソフトウェア" + +#~ msgid "Application manager for GNOME" +#~ msgstr "GNOME 用アプリケーションマネージャー" + +#~ msgid "A list of popular applications" +#~ msgstr "人気のあるアプリケーションの一覧" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "おすすめとして表示するアプリケーションの一覧。システムで定義されている一覧" +#~ "よりも優先します。" + +#, c-format +#~ msgid "Failed to copy: %s" +#~ msgstr "コピーに失敗しました: %s" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Show verbose debugging information" +#~ msgstr "詳細なデバッグ情報を表示する" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "システムのソフトウェア管理に役立ちます" + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "1 から %u までの数字を入力してください: " + +#~ msgid "Choose an application:" +#~ msgstr "アプリケーションを選択してください:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s をインストールしました" + +#~ msgid "System updates are now installed" +#~ msgstr "システムアップデートをインストールしました" + +#~ msgid "An application has been removed" +#~ msgid_plural "Applications have been removed" +#~ msgstr[0] "アプリケーションを削除しました" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "“%s”が見つかりません" + +#~ msgid "Loading…" +#~ msgstr "読み込み中…" + +#~ msgid "_Add shortcut" +#~ msgstr "ショートカットを追加(_A)" + +#~ msgid "Re_move shortcut" +#~ msgstr "ショートカットを削除(_M)" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "" +#~ "選択したアドオンはこのアプリケーションと一緒にインストールされます。" + +#~ msgid "Welcome" +#~ msgstr "ようこそ" + +#~ msgid "Welcome to Software" +#~ msgstr "“ソフトウェア”へようこそ" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "“ソフトウェア”では必要なアプリケーションをすべてインストールすることができ" +#~ "ます。おすすめのアプリケーションをチェックしたり、カテゴリーから探してみて" +#~ "ください。欲しいアプリケーションを検索することもできます。" + +#~ msgid "_Browse Software" +#~ msgstr "ソフトウェアを探す(_B)" + +#~ msgid "Applications" +#~ msgstr "アプリケーション" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "ソフトウェアカタログをダウンロードしています" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "自動アップデート一時停止中" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an un­metered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been in­correctly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "現在のネットワークは従量制です。従量制課金接続にはデータ量の制限があり、超" +#~ "過すると追加料金が発生する場合があります。データ量の消費を抑えるため、自動" +#~ "アップデートを一時的に停止しています。\n" +#~ "\n" +#~ "制限のないネットワークが利用可能になると、自動アップデートを再開します。そ" +#~ "れまでの間、手動でアップデートをインストールすることは可能です。\n" +#~ "\n" +#~ "現在のネットワークが従量制に誤認識されてしまっている場合は、設定を変更して" +#~ "みてください。" + +#~ msgid "Open Network _Settings" +#~ msgstr "ネットワーク設定を開く(_S)" + +#~ msgid "Moderate page" +#~ msgstr "審査ページ" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "審査するレビューはありません" + +#~ msgid "Downloading application ratings…" +#~ msgstr "アプリケーションの評価をダウンロード中…" + +#~ msgid "Name" +#~ msgstr "名前" + +#~ msgid "user" +#~ msgstr "ユーザー" + +#~ msgid "Channel" +#~ msgstr "チャンネル" + +#~ msgid "Branch" +#~ msgstr "ブランチ" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "インストール" + +#~ msgid "Version" +#~ msgstr "バージョン" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "本当に %s をアンインストールしますか?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s はアンインストールされます。再び使用するにはインストールし直す必要があ" +#~ "ります。" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "費用の発生や通信容量の減少を避けるため、モバイル接続や従量制課金接続ではソ" +#~ "フトウェアアップデートの自動ダウンロードは行いません。" + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible." +#~ msgstr "" +#~ "可能ならソフトウェアアップデートをバックグラウンドでダウンロードしてインス" +#~ "トールします。" + +#~ msgid "_Continue" +#~ msgstr "続行(_C)" + +#~ msgid "Post Review" +#~ msgstr "レビューを投稿" + +#~ msgid "_Post" +#~ msgstr "投稿(_P)" + +#~ msgid "Rating" +#~ msgstr "評価" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "レビューの短い要約を書いてください(例:「すばらしいアプリです。おすすめし" +#~ "ます」)。" + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "レビュー" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "このアプリケーションについてどう思いますか。できれば理由もあわせて書いてく" +#~ "ださい。" + +#~ msgid "Was this review useful to you?" +#~ msgstr "このレビューは役に立ちましたか?" + +#~ msgid "Yes" +#~ msgstr "はい" + +#~ msgid "No" +#~ msgstr "いいえ" + +#~ msgid "Meh" +#~ msgstr "どうでもいい" + +#~ msgid "Outdated SDK version" +#~ msgstr "古い SDK のバージョン" + +#~ msgid "No screenshot provided" +#~ msgstr "スクリーンショットは未提供です" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "アップデートをダウンロードできません: インターネットアクセスが必要でしたが" +#~ "接続できませんでした" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "" +#~ "アップデートをダウンロードできません: 十分なディスク領域がありません" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "アップデートをダウンロードできません: 認証が必要です" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "アップデートをダウンロードできません: 認証できませんでした" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "%s をインストールできません: ソフトウェアをインストールする権限がありませ" +#~ "ん" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "%s をインストールできません: バッテリー残量に余裕がありません" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "" +#~ "アップデートをインストールできません: 十分なディスク領域がありません" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "アップデートをインストールできません: 認証が必要です" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "アップデートをインストールできません: 認証できませんでした" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "%s をアップデートできません: ソフトウェアをアップデートする権限がありませ" +#~ "ん" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "アップデートをインストールできません: ソフトウェアをアップデートする権限が" +#~ "ありません" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "アップデートをインストールできません: AC 電源が必要です" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "%s をアップデートできません: バッテリー残量に余裕がありません" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "アップデートをインストールできません: バッテリー残量に余裕がありません" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "%s にアップグレードできません: インターネットアクセスが必要でしたが接続で" +#~ "きませんでした" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "%s にアップグレードできません: アップグレードする権限がありません" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "%s にアップグレードできません: バッテリー残量に余裕がありません" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "%s を削除できません: 認証が必要です" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "%s を削除できません: 認証できませんでした" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "%s を削除できません: ソフトウェアを削除する権限がありません" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "%s を削除できません: AC 電源が必要です" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "%s を削除できません: バッテリー残量に余裕がありません" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "%s を削除できません" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "ファイルのインストールに失敗しました: サポートしていません" + +#~ msgid "Failed to install: not supported" +#~ msgstr "インストールに失敗しました: サポートしていません" + +#~ msgid "AC power is required" +#~ msgstr "AC 電源が必要です" + +#~ msgid "Network Settings" +#~ msgstr "ネットワーク設定" + +#~ msgid "Restart Now" +#~ msgstr "再起動" + +#~ msgid "Primary Menu" +#~ msgstr "プライマリーメニュー" + +#~ msgid "Find Out _More" +#~ msgstr "詳細を確認(_M)" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "このシステムにインストールされたアップデートはありません。" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "重要なソフトウェアアップデートをインストールする準備ができました。" + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "注意: 重要なソフトウェアアップデートが待機中です。" + +#~ msgid "Please download waiting software updates." +#~ msgstr "待機中のソフトウェアアップデートをダウンロードしてください。" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "オペレーティングシステムのアップデートは利用できません" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "" +#~ "重要なオペレーティングシステムアップデートのインストールに失敗しました。" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s はサポートが終了しています。" + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "セキュリティアップデートを受け取ることはできません。" + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "より新しいバージョンへアップグレードすることをお勧めします。" + +#~ msgid "No Network" +#~ msgstr "ネットワークがありません" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "" +#~ "アップデートを確認するにはインターネットにアクセスする必要があります。" + +#~ msgid "Checking…" +#~ msgstr "確認中…" + +#~ msgid "Application Updates" +#~ msgstr "アプリケーションのアップデート" + +#~ msgid "OS Updates" +#~ msgstr "OS のアップデート" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "" +#~ "このアップデートには性能、安定性、およびセキュリティの向上が含まれていま" +#~ "す。" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "アップグレード情報をダウンロード中…" + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "ファームウェアアップデートの署名をダウンロード中…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "ファームウェアアップデートのメタデータをダウンロード中…" + +#~ msgid "Select All" +#~ msgstr "すべて選択" + +#~ msgid "Select None" +#~ msgstr "すべて解除" + +#~ msgid "Featured %s" +#~ msgstr "注目の%s" + +#~ msgid "Show" +#~ msgstr "表示" + +#~ msgid "Subcategories filter menu" +#~ msgstr "サブカテゴリーの絞り込みメニュー" + +#~ msgid "Sort" +#~ msgstr "並べ替え" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "サブカテゴリーの並び替えメニュー" + +#~ msgid "_Launch" +#~ msgstr "起動(_L)" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "このアプリケーションは一般的な古い形式のアプリケーションのため、システムの" +#~ "どの部分にアクセスするか確認できません。" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "なし" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgid "Low" +#~ msgstr "低" + +#~ msgid "Medium" +#~ msgstr "中" + +#~ msgid "High" +#~ msgstr "高" + +#~ msgid "Public domain" +#~ msgstr "パブリックドメイン" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "" +#~ "https://ja.wikipedia.org/wiki/" +#~ "%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw.ja" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "ユーザーは下記のライセンスによる拘束を受けることになります:" + +#~ msgid "Localized in your Language" +#~ msgstr "お使いの言語にローカライズされているか" + +#~ msgid "Release Activity" +#~ msgstr "活発なリリース" + +#~ msgid "Sandboxed" +#~ msgstr "サンドボックス化" + +#~ msgid "Category" +#~ msgstr "カテゴリー" + +#~ msgid "Free" +#~ msgstr "フリー (自由)" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "該当のソフトウェアは実行、複製、配布、調査、および改変を自由に行えることを" +#~ "意味します。" + +#~ msgid "Proprietary Software" +#~ msgstr "プロプライエタリソフトウェア" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "該当のソフトウェアは特定の個人または企業が所有していることを意味します。使" +#~ "用上の制約がある場合が多く、通常ソースコードへのアクセスは許可されていませ" +#~ "ん。" + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "このソフトウェアのライセンス条項が不明です。" + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "このアプリのレーティング理由:" + +#~ msgid "this website" +#~ msgstr "このウェブサイト" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "ショッピングに行きましょう(_L)" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "削除" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "インストール" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "アップデート" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgid "History" +#~ msgstr "履歴" + +#~ msgid "Format" +#~ msgstr "フォーマット" + +#~ msgid "More…" +#~ msgstr "さらに…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "おすすめのオーディオ、ビデオアプリケーション" + +#~ msgid "Recommended Games" +#~ msgstr "おすすめのゲーム" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "おすすめのグラフィックアプリケーション" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "おすすめのプロダクティビティアプリケーション" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "このソフトウェアの一部はプロプライエタリです。使用、共有、ソースコードへの" +#~ "アクセスに制限があります。" + +#~ msgid "Find out more…" +#~ msgstr "もっと探す…" + +#~ msgid "Editor’s Picks" +#~ msgstr "編集者のおすすめ" + +#~ msgid "Recent Releases" +#~ msgstr "最近のリリース" + +#~ msgid "Remove “%s”?" +#~ msgstr "“%s”を削除しますか?" + +#~ msgid "Disable “%s”?" +#~ msgstr "“%s”を無効にしますか?" + +#~ msgid "No Additional Repositories" +#~ msgstr "追加のリポジトリはありません" + +#~ msgid "_Remove…" +#~ msgstr "削除(_R)…" + +#~ msgid "_Disable…" +#~ msgstr "無効(_D)…" + +#~ msgid "Disabling" +#~ msgstr "無効化中" + +#~ msgid "Enabled" +#~ msgstr "有効" + +#~ msgid "Disabled" +#~ msgstr "無効" + +#~ msgid "ratings in total" +#~ msgstr "回の評価 (合計)" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "新しいプラグインを使用するには、このアプリケーションを再起動する必要があり" +#~ "ます。" + +#~ msgid "_Remove All" +#~ msgstr "すべて削除(_R)" + +#~ msgid "Security Updates Pending" +#~ msgstr "セキュリティアップデートが未適用です" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "重要なアップデートはすぐにインストールすることをお勧めします" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "OS やアプリケーションの重要なアップデートをインストールする準備ができまし" +#~ "た" + +#~ msgid "View" +#~ msgstr "表示" + +#~ msgid "%R" +#~ msgstr "%H:%M" + +#~ msgid "%l:%M %p" +#~ msgstr "%p %l:%M" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "昨日 %p %l:%M" + +#~ msgid "Three days ago" +#~ msgstr "3 日前" + +#~ msgid "Four days ago" +#~ msgstr "4 日前" + +#~ msgid "Five days ago" +#~ msgstr "5 日前" + +#~ msgid "Six days ago" +#~ msgstr "6 日前" + +#~ msgid "Two weeks ago" +#~ msgstr "2 週間前" + +#~ msgid "Looking for new updates…" +#~ msgstr "新しいアップデートを確認中…" + +#~ msgid "Setting up updates…" +#~ msgstr "アップデート準備中…" + +#~ msgid "Software is up to date" +#~ msgstr "ソフトウェアは最新です" + +#~ msgid "_Restart Now" +#~ msgstr "再起動(_R)" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "アップデートはコンピューターを再起動したときに適用されます。" + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "%s %s のダウンロードを待っています" + +#~ msgid "Downloading %s %s" +#~ msgstr "%s %s をダウンロード中" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "すべて" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "注目のソフト" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "すべて" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "注目のソフト" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "すべて" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "注目のソフト" + +#~ msgid "Audio & Video" +#~ msgstr "オーディオ & ビデオ" + +#~ msgid "Developer Tools" +#~ msgstr "開発ツール" + +#~ msgid "Education & Science" +#~ msgstr "教育と科学" + +#~ msgid "Games" +#~ msgstr "ゲーム" + +#~ msgid "Graphics & Photography" +#~ msgstr "グラフィック & 写真" + +#~ msgid "Productivity" +#~ msgstr "プロダクティビティ" + +#~ msgid "Communication & News" +#~ msgstr "コミュニケーション & ニュース" + +#~ msgid "Utilities" +#~ msgstr "ユーティリティ" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS はアプリケーションのユーザーレビューを提供するサービスです" + +#~ msgid "About %s" +#~ msgstr "“%s”について" + +#~ msgid "%s ME" +#~ msgstr "%s ME" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "拡張機能はユーザー自身のリスクで使用してください。システムに何らかの問題が" +#~ "発生した場合、拡張機能を無効化することが推奨されます。" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell 拡張機能" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "GNOME Shell 拡張機能リポジトリ" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "GNOME Shell 拡張機能のメタデータをダウンロード中…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell 拡張機能" + +#~ msgid "Add to Application Folder" +#~ msgstr "アプリケーションフォルダーに追加" + +#~ msgid "Top Rated" +#~ msgstr "高評価" + +#~ msgid "Unsaved changes" +#~ msgstr "未保存の変更" + +#~ msgid "Merge documents" +#~ msgstr "ドキュメントをマージ" + +#~ msgid "Throw away changes" +#~ msgstr "変更を破棄" + +#~ msgid "The application list has unsaved changes." +#~ msgstr "アプリケーション一覧に未保存の変更があります。" + +#~ msgid "No Designs" +#~ msgstr "デザインがありません" + +#~ msgid "Error message here" +#~ msgstr "エラーメッセージはこちら" + +#~ msgid "Sign In / Register…" +#~ msgstr "サインイン / 登録…" + +#~ msgid "Continue" +#~ msgstr "続行" + +#~ msgid "Use" +#~ msgstr "使用" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "%s を購入できません: 認証が必要です" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "%s を購入できません: 認証できませんでした" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "%s を購入できません: 支払い方法が設定されていません" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "%s を購入できません: 支払いが拒否されました" + +#~ msgid "Show profiling information for the service" +#~ msgstr "サービス用のプロファイル情報を表示する" + +#~ msgid "Sign in automatically next time" +#~ msgstr "次は自動的にサインインする" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "二要素認証用のワンタイム PIN を入力してください。" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "%s についての情報および、このフォーマットを再生できるコーデックの入手方法" +#~ "はウェブサイト上で確認できます。" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba は開発者がソフトウェアバンドルを簡単に作成できる方法を提供します" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Valve による究極のエンターテイメントプラットフォーム" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "以前に有効化された追加ソースの一覧" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "サードパーティーのアプリケーションをインストールする時に有効化したソースの" +#~ "リストです。" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "プロプライエタリのソフトウェアソースを有効にしますか?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "アプリケーションやアドオンはインストールされていません。他のソフトウェアも" +#~ "まだそうかもしれません" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "ソフトウェアソースはインターネットからダウンロードできます。ソフトウェア" +#~ "ソースを追加すると、%s で提供されていないソフトウェアも利用できるようにな" +#~ "ります。" + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "ソースを削除すると、そのソースからインストールしたソフトウェアもすべて削除" +#~ "することになります。" diff --git a/po/ka.po b/po/ka.po new file mode 100644 index 0000000..d890fe8 --- /dev/null +++ b/po/ka.po @@ -0,0 +1,6609 @@ +# Georgian translation for gnome-software. +# Copyright (C) 2023, gnome-software's authors. +# This file is distributed under the same license as the gnome-software package. +# Ekaterine Papava , 2023-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-21 13:46+0000\n" +"PO-Revision-Date: 2025-02-23 06:23+0100\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=1; plural=0;\n" +"X-Generator: Poedit 3.5\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "პროგრამები" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "აპების დაყენება და განახლება" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Software საშუალებას გაძლევთ იპოვოთ და დააყენოთ ახალი აპები და სისტემის " +"გაფართოებები და არსებული დაყენებული აპები წაშალოთ." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"პროგრამები გამოხატავენ პოპულარულ აპებს გამოსადეგი აღწერებით და ერთზე მეტი " +"ეკრანის ანაბეჭდით თითოეული აპისთვის. აპების პოვნა ან კატეგორიების " +"თვალიერებით შეგიძლიათ, ან ძებნით. მას ასევე შეუძლია ამ პროგრამების " +"ინტერნეტის გარეშე განახლებაც." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "გადახედვის პანელი" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "დეტალების პანელი" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "დაყენებულების პანელი" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "განახლებების პანელი" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "განახლების დეტალები" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "პროექტი \"GNOME\"" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "'akmods' გასაღების შემოწმება Shim UEFI-ში" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "'akmods' გასაღების შემოწმებას Shim UEFI-ში ავვთენტიკაცია სჭირდება" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "'akmods' გასაღების რეგისტრაცია Shim UEFI-ში" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "'akmods' გასაღების რეგისტრაციას Shim UEFI-ში ავვთენტიკაცია სჭირდება" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "DKMS გასაღების შემოწმება Shim UEFI-ში" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "DKMS გასაღების შემოწმებას Shim UEFI-ში ავთენტიკაცია სჭირდება" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "DKMS გასაღების რეგისტრაცია Shim UEFI-ში" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "DKMS გასაღების რეგისტრაციას Shim UEFI-ში ავთენტიკაცია სჭირდება" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Appstream ფაილის სისტემურ მდებარეობაზე დაყენება" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Appstream ფაილის სისტემურ მდებარეობაზე დაყენება" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "ყველა თავსებადი პროექტის სია" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"თავსებადი პროექტების სია, რომელიც უნდა გაჩვენოთ. მაგ: GNOME, KDE, XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "მართული იქნება GNOME-ის პროგრამების განახლებები, თუ არა" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"თუ გათიშულია, GNOME Software დამალავს განახლებების პანელს, არ განახორციელებს " +"ავტომატურ განახლებებს და არ შემოგთავაზებთ ვერსიის აწევას." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "განახლებების ავტომატურად ჩამოტვირთვა და დაყენება" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"თუ ჩართულია, GNOME Software ავტომატურად გადმოწერს პროგრამის განახლებებს " +"ფონურად და დააყენებს მათ, რომლებსაც გადატვირთვა არ სჭირდებათ." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "მომხმარებლის შეტყობინება პროგრამების ფონური განახლების შესახებ" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"თუ ჩართულია, GNOME Software მომხმარებელს შეატყობინებს იმ განახლებების " +"შესახებ, რომელიც მაშინ მოხდა, როცა მომხმარებელი უქმედ იყო." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "მოხდება თუ არა განახლება გაზომვად მიერთებაზე" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"თუ ჩართულია, GNOME Software ავტომატურად განაახლებს ფონურად მაშინაც კი, როცა " +"გამოიყენება გაზომვადი მიერთება (გადმოწერილი იქნება მეტამონაცემების ნაწილი, " +"მოხდება განახლებების შემოწმება და ა.შ., რაც, შეიძლება, მომხმარებელს თანხა " +"დაუჯდეს)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "ეშვება GNOME პირველად, თუ არა" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "აპლიკაციის გასწვრივ ვარსკვლავების რეიტინგის ჩვენება" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "აპლიკაციების გაფილტვრა დაშორებულისთვის დაყენებული ნაგულისხმევი ბრენჩით" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "არა-უფასო პროგრამები დაყენებამდე გაფრთხილებას აჩვენებს" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"როცა აყენებთ არა-თავისუფალ აპლიკაციას, გაფრთხილების დიალოგს გაჩვენებთ. ეს " +"აკონტროლებს, ჩაჩუმდება თუ არა ის დიალოგი." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "განახლების უკანასკნელი შემოწმების დროის შტამპი" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "უკანასკნელი გაუმჯობესების შეტყობინების დროის შტამპი" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "უკანასკნელი განახლების შეტყობინების დროის შტამპი" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"პირველი უსაფრთხოების განახლების დროის შტამპი. სუფთავდება განახლების შემდეგ" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "უკანასკნელი განახლების დროის შტამპი" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"ასაკი წამებში, გადასამოწმებლად, აღმავლის ეკრანის ანაბეჭდი ჯერ კიდევ სწორია, " +"თუ არა" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"უფრო დიდი მნიშვნელობა ნიშნავს ნაკლებ წრეებს დაშორებულ სერვერამდე, მაგრამ " +"ეკრანის ანაბეჭდების განახლებას უფრო მეტი დრო დასჭირდება. მნიშვნელობა 0 " +"ნიშნავს, რომ სერვერზე არასდროს შემოწმდება, თუ ფაილი კეშში უკვე არსებობს." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "აპლიკაციის მიმოხილვების სერვერი" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "მინიმალური კარმა მიმოხილვებისთვის" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "ამ რიცხვზე ნაკლები კარმის მქონე მიმოხილვები ნაჩვენები არ იქნება." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"ოფიციალური რეპოზიტორიების სია, რომელიც მესამე პირის მიერ მოწოდებულად არ " +"ჩაითვლება" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "აუცილებელი რეპოზიტორიების სია, რომლების გათიშვა ან წაშლა შეუძლებელია" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"ოფიციალური რეპოზიტორიების სია, რომლებიც თავისუფალ პროგრამებად ჩაითვლება" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"ლიცენზიის URL, რომელიც გამოიყენება, როცა პროგრამა ჩათვლილია, როგორც " +"თავისუფალი" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"აწყობილი აპლიკაციების დაყენება ყველა მომხმარებლისთვის, როცა ეს შესაძლებელია" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "წვდომის დაშვება პროგრამის რეპოზიტორიის ფანჯარაშთან" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "პრე-რელიზების ვერსიის აწევის შეთავაზება" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "ინტერფესის ზოგიერი ელემენტი იტყობინება, რომ აპი უფასო არაა" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "დაყენებული აპლიკაციების სიაში მათი ზომის ცვენება" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"URI, რომელიც უფასო, დახურული კოდის მქონე პროგრამების შესახებ შეგატყობინებთ" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"ბმულების სია, რომელიც მიუთითებს აღმავლის ფაილებზე, რომლებიც swcatalog " +"საქაღალდეში იქნება გადმოწერილი" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"AppStream-ის ფაილების მთელი სისტემისთვის დაყენება. თუ ცრუა. ფაილები " +"არასტანდარტულ $XDG_DATA_HOME/swcatalog/xml საქაღალდეში დადგება" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"პაკეტის ფორმატების პრიორიტეტების მიმდევრობა. მნიშვნელოვანი ფორმატები სიის " +"დასაწყისშია. ცარიელი მასივი ნიშნავს ნაგულისხმევ მიმდევრობას. ამოღებული " +"ფორმატები, როგორც წესი, ბოლოა სიაში. მაგალითები პაკეტის ფორმატებისთვის: deb, " +"flatpack. rpm, snap. ფორმატები ასევე შეგიძლიათ, წყაროს სახელით მიუთითოთ, ორი " +"წერტილით გამოყოფით. მაგ: 'flatpack:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"გამოუყენებელი Flatpak-ის გაშვების გარემოების წაშლის ბოლო მცდელობის დროის " +"შტამპი" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"დააყენეთ ჭეშმარიტზე, რომ, მხოლოდ, უფასო ლიცენზიის მქონე აპები გაჩვენოთ და " +"დავმალო ფასიანები." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"დააყენეთ ჭეშმარიტზე, რომ, მხოლოდ, გადამოწმებული პროგრამისტების პროგრამები " +"გაჩვენოთ." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "ბოლოს მიღებული ისტორიული განახლებების დროის შტამპი." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "სტრიქონი, რომელიც gnome-online-account-ის ID-ს შეიცავს, შესასვლელად" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME-ის AppStream პროგრამების მთელ სისტემაში დაყენება" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "ბრძანებების სტრიქონის პარამეტრების დამუშავების შეცდომა" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "საჭიროა მიუთითოთ მხოლოდ ერთი ფაილის სახელი" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "ამ პროგრამის გამოყენება მხოლოდ root მომხმარებელს შეუძლია" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "შემცველობის ტიპის გადამოწმების შეცდომა: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "გადატანის შეცდომა: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "პროგრამების დაყენება" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "მონიშნული პროგრამების დაყენება" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "მულტფილმში ძალადობით" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "ინფორმაცია მულტფილმში ძალადობის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "წარმოსადგენი ძალადობა" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "ინფორმაცია წარმოსადგენი ძალადობის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "რეალისტური ძალადობა" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "ინფორმაცია რეალისტური ძალადობის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "სისხლიანი ძალადობა" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "ინფორმაცია სისხლიანი ძალადობის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "სექსუალური ძალადობა" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "ინფორმაცია სექსუალური ძალადობის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "ალკოჰოლი" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "ინფორმაცია ალკოჰოლზე მიმართვის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "ნარკოტიკები" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "ინფორმაცია ნარკოტინებზე მიმართვის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "თამბაქო" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "ინფორმაცია თამბაქოს პროდუქტების შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "სიშიშვლე" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "ინფორმაცია სიშიშვლის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "სექსუალური თემები" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "ინფორმაცია სექსუალური ხასიათის მითითების შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "პროფანაცია" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "ინფორმაცია პროფანაციის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "შეუსაბამო იუმორი" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "ინფორმაცია შეუსაბამო იუმორის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "დისკრიმინაცია" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "ინფორმაცია დისკრიმინაციული ენის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "რეკლამირება" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "ინფორმაცია რაიმე სახის რეკლამების შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "ფულზე თამაში" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "ინფორმაცია რაიმე სახით გემბლინგის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "შეძენები" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "ინფორმაცია მასში ფულის დახარჯვის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "საუბარი მომხმარებლებს შორის" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "ინფორმაცია სხვა მომხმარებლებთან ჩატის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "ხმოვანი საუბარი მომხმარებლებს შორის" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "ინფორმაცია სხვა მომხმარებლებთან საუბრის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "კონტაქტის დეტალები" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"ინფორმაცია სოციალური ქსელის მომხმარებლის ან ელფოსტის მისამართის გაზიარების " +"შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "ინფორმაციის იდენტიფიკაცია" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"ინფორმაცია მომხმარებლის ინფორმაციის მესამე პირებისთვის გადაცემის შესახებ არ " +"არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "მდებარეობის გაზიარება" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"ინფორმაცია სხვა მომხმარებლებისთვის ფიზიკური მდებარეობის გაზიარების შესახებ " +"არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "ჰომოსექსუალიზმი" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "ინფორმაცია ჰომოსექსუალიზმთან მიმართვების შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "პროსტიტუცია" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "ინფორმაცია პროსტიტუციაზე მიმართვების შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "მრუშობა" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "ინფორმაცია მრუშობაზე მიმართვის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "სექსუალიზებული პერსონაჟები" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "ინფორმაცია ზედმეტად სექსუალიზებული ადამიანების შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "შეურაცხყოფა" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "ინფორმაცია შეურაცხყოფაზე მიმართვის შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "ადამიანის ნარჩენები" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "ინფორმაცია ადამიანის ხილული ნარჩენების შესახებ არ არსებობს" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "მონობა" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "ინფორმაცია მონობაზე მიმართვის შესახებ არ არსებობს" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "ნარკოტიკებზე მიმართვას არ შეიცავს" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "არ შეიცავს მიმართვას გინებაზე, პროფანულობაზე ან სხვა უხეშ ენაზე" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "არ შეიცავს რეკლამას ან ფულად გადარიცხვებს" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "არ შეიცავს სექსს ან სიშიშვლეს" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "არ შეიცავს უკონტროლო ჩატის ფუნქციებს" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "არ შეიცავს ძალადობას" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "ნარკოტიკები" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "ლანძღვა" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "ფული" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "სოციალური" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "ძალადობა" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "ყველა" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s-ის ასაკის უცნობი შეზღუდვა" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s ყველას შეეფერება" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s ჩვილებს შეეფერება" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s პატარა ბავშვებს შეეფერება" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s პატარა ბავშვებს შეეფერება" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s თინეიჯერებს შეეფერება" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s ზრდასრულებს შეეფერება" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s %s-ს შეეფერება" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "ასაკის რეიტინგი" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_როგორ მოგაწოდოთ ნაკლული ინფორმაცია" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "ლოკალური ფაილი" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "პაკეტი" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "დარჩენილი" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "დარჩენილი დასაყენებელი" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "დარჩენილი წასაშლელი" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "დაყენება" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "წაშლა" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "გადმოწერა" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_დაყენება" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_წაშლა…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "ქსელი" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "ქსელის საშუალებით შეერთება" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "სისტემური სერვისები" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "D-Bus-ის სერვისებთან წვდომა შეუძლებელია სისტემურ მატარებელზე" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "სესიის სერვსები" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "D-Bus-ის სერვისებთან წვდომა შეუძლებელია სესიის მატარებელზე" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "მოწყობილობები" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "აქვს წვდომა ისეთ მოწყობილობებთან, როგორიცაა ვებკამერა" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "აქვს წვდომა შეყვანის მოწყობილობებთან" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "აქვს წვდომა მიკროფონებთან და შეუძლია ხმის დაკვრა" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "მოწყობილობების ფაილებთან წვდომა" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "ეკრანის შემცველობა" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "აქვს წვდომა ეკრანის შემცველობასთან" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "საწყისი საქაღალდე" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "ფაილების ნახვის, ჩასწორების და შექმნის უფლება" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "ფაილების ნახვის უფლება" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "ფაილური სისტემა" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "საქაღალდის გადმოწერა" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "მორგება" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "შეუძლია პარამეტრების ნახვა და შეცვლა" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "ჩვენების მოძველებული სისტემა" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "იყენებს ძველ, დაუცველ ეკრანის სისტემას" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "სენდბოქსიდან გაპარვა" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "შეუძლია გაძვრეს სენდბოქსიდან და თავიდან აიცილოს ყველა სხვა შეზღუდვა" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "განახლების აღწერა ხელმისაწვდომი არაა." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "კონტაქტის დეტალები" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "საჭიროა დამატებითი წვდომები" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "სერვერიდან მიღებულია არასწორი რეიტინგის მონაცემები" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "რეიტინგების სერვერთან მიერთება შეუძლებელია" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "მიმოხილვები" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "ამ აპის მიმოხილვა აღმოჩენილი არაა." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "შეფასებების გარეშე" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "ვერსიის ისტორია" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "სიახლე ვერსიაში %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "ვერისა %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "ამ რელიზის დეტალები ვერ მოიძებნა" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"გაშვების რეჟიმი: 'განახლებები', 'განახლებული', 'დაყენებული ან 'გადახედვა'" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "რეჟიმი" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "აპლიკაციების ძებნა" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ძებნა" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "აპლიკაციის დეტალების ჩვენება (აპლიკაციის ID-ით)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "აპლიკაციის დეტალების ჩვენება (აპლიკაციის სახელით)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "პაკეტის სახელი" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "აპლიკაციის დაყენება (აპლიკაციის ID-ით)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "აპლიკაციის წაშლა (აპლიკაციის ID-ით)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "ლოკალური პაკეტის ფაილის გახსნა" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILENAME" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"ურთიერთობა, რომელსაც მოველი ამ ქმედებისთვის: 'none', 'notify' ან 'full'" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ურთიერთქმედება" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "AppData-ის ფაილის ლოკალური მეტაინფორმაციის ჩვენება" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"დამატებითი გამართვის შეტყობინებების ჩართვა (გაშვებული ასლიდან, თუ უკვე " +"გაშვებულია)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "როცა შესაძლებელია, განახლებების ფონურ რეჟიმში გადმოწერა და დაყენება" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "პარამეტრების _ჩვენება" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "გაშვებული ასლის დაბრუნებ" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "" +"AppStream-სთვის ლოკალური ფაილის წყაროებისთვის მეტი პრიორიტეტის მინიჭება" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "ვერსიის ნომრის ჩვენება" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "© 2016–2023 GNOME Software contributors, ყველა უფლება დაცულია" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "მთარგმნელის შესახებ" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "უკაცრავად! ამ აპლიკაციის შესახებ დეტალები არ აქვს." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "დაყენებული ზომა" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "შეიცავს %s მონაცემებს და %s კეშს" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "შეიცავს %s მონაცემებს" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "შეიცავს %s კეშს" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "კეშის და მონაცემების გამოყენება უცნობია" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "გადმოწერის ზომა" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "დამატებითი სისტემური გადმოწერები არ სჭირდება" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "სჭირდება დამატებითი სისტემური გადმოწერების უცნობი ზომა" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "დამატებითი %s დამატებითი სისტემური გადმოწერა" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "უცნობი ზომა" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "წვდომები არ გაქვთ" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "აქვს ქსელთან წვდომა" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "იყენებს სისტემურ სერვისებს" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "იყენებს სესიის სერვისებს" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "შეუძლია აპარატურასთან წვდომა" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "აქვს წვდომა სისტემურ მოწყობილობებთან" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "შეუძლია წაიკითხოს/ჩაწერის ყველა თქვენი მონაცემი" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "შეუძლია თქვენი მონაცემების წაკითხვა" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "შეუძლია წაიკითხოს/ჩაწეროს თქვენს გადმოწერილ ფაილებში" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "შეუძლია წაიკითხოს თქვენი გადმოწერილი ფაილები" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "აქვს ზოგიერთ ფაილთან წვდომა" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "შეუძლია წვდომა ჰქონდეს და შეცვალოს მომხმარებლის პარამეტრები" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "იყენებს მოძველებულ ფანჯრულ სისტემას" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "შეუძლია ჩვეულებრივი წვდომების მიღება" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "პროგრამის ავტორი შემოწმებულია" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "განხილულია ოს-ის დისტრიბუტორის მიერ" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "მიმოხილულია %s-ის მიერ" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "მოწოდებულია მესამე პირის მიერ" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "პროგრამა მხარდაჭერილი აღარაა" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "აუდიტირებადი კოდი" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "უცნობი ლიცენზია" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "დახურული კოდი" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "სპეციალური ლიცენზია" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "პრივილეგირებულია" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "უსაფრთხო" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "ალბათ უსაფრთხო" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "პოტენციურად სახიფათო" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "სახიფათო" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "მხოლოდ მობილური" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "მუშაობს მხოლოდ პატარა ეკრანზე" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "მხოლოდ სამუშაო მაგიდა" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "მუშაობს მხოლოდ სამუშაო მაგიდაზე" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "ეკრანის ზომა არ ემთხვევა" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "ეკრანის მიმდინარე ზომა მხარდაუჭერელია" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "მოითხოვს სენსორულ ეკრანს" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "მოითხოვს კლავიატურას" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "მოითხოვს თაგუნას" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "მოითხოვს გეიმპედს" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "სათამაშოდ მოითხოვს გეიმპედს" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "შეგუებადი" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "მუშაობს ტელეფონზე, ტაბლეტზე და სამუშაო კომპიუტერზე" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "ალბათ მოითხოვს კლავიატურას ან თაგუნას" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "მუშაობს სამუშაო კომპიუტერებზე და ლეპტოპებზე" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "ასაკისთვის დაუშვებელ შემცველობას არ შეიცავს" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "ასაკზე შეზღუდვის ინფორმაცია მიუწვდომელია" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "საიტზე გადასვლა" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "დაყენება…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "გაუქმება" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "დაყენება" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "გადმოწერა" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "განახლება" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "წაშლა…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "წაშლა" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "კრიტიკული განახლება" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "განახლებისას მოწყობილობას ვერ გამოიყენებთ." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "წყარო: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "სახელი გადაერქვა %s-დან" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "განახლებების მიღება შეჩერებულია" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "კრიტიკული განახლება" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "ჩადგმულია" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "დაგვეხმარეთ, ვთარგმნოთ %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s იქმნება, იწერება და ითარგმნება საერთაშორისო მოხალისეების საზოგადოების " +"მიერ.\n" +"\n" +"ეს ნიშნავს, რომ თუ ის ხელმისაწვდომი არაა თქვენს ენაზე, შეგიძლიათ, ის " +"თვითონაც თარგმნოთ." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "თარგმანები" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_თარგმანის ვებგვერდი" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "დაშორებულზე %s შესვლა აუცილებელია (რეალმი (%s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "შესვლა აუცილებელია" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_გაუქმება" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_მომხმარებელი" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_მომხმარებელი" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_პაროლი" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "სხვები" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "ყველა" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "პოპულარული" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "რედაქტორის არჩევანი" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "ახალი და განახლებული" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "ვებიდან აღება" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "სხვა პროგრამები" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s დაყენებულია" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "ცვლილებების ძალაში შესასვლელად საჭიროა გადატვირთვა" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "აპლიკაცია მზადაა გამოსაყენებლად" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "სისტემური განახლებები დაყენებულია" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "ახლახან დაყენებული განახლებები ხელმისაწვდომია გადასახედად" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "გადატვრთვა" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "გაშვება" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "დავაყენო პროგრამები?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "დავაყენო პროგრამები მესამე პირებისგან?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "ჩავრთო პროგრამების რეპოზიტორია?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "ჩავრთო მესამე პირებისგან მოწოდებული რეპოზიტორია?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s არაა თავისუფალი და ღია პროგრამა. მოგეწოდებათ რეპოზიტორიიდან " +"“%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s მოწოდებულია “%s”-ის მიერ." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "დაყენების გასაგრძელებლად ეს რეპოზიტორია ჩართული უნდა იყოს." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "შეიძლება ზოგიერთ ქვეყანაში %s-ის დაყენება და გამოყენება უკანონო იყოს." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"შეიძლება ზოგიერთ ქვეყანაში ამ კოდეკის დაყენება ან გამოყენება უკანონო იყოს." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_აღარ გამაფრთხილო" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "ჩართვა და _დაყენება" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "დეტალური შეცდომები პაკეტების მმართველიდან:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "დეტალები" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "და_კეტვა" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "დეტალები დაკოპირდა გაცვლის ბაფერში" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_თანხმობა" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "განახლებდა დადგა" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "აპი წაიშალა" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "ცვლილებების ძალაში შესასვლელად საჭიროა გადატვირთვა" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "არა ახლა" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "დღეს" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "გუშინ" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d დღის წინ" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d კვირის წინ" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d თვის წინ" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d წლის წინ" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "ახლა" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d წუთის წინ" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d საათის წინ" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "ყველა" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "პოპულარული" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D გრაფიკა" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "ფოტოგრაფია" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "სკანირება" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "ვექტორული გრაფიკა" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "დამთვალიერებლები" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "აუდიოს შექმნა და ჩასწორება" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "მუსიკის დამკვრელები" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "ყველა" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "პოპულარული" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "კალენდარი" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "მონაცემთა ბაზა" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "ფინანსები" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "რედაქტორი" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "ტექსტური რედაქტორები" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "ვებ-ბრაუზერები" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "ყველა" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "პოპულარული" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "მოქმედება" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "თავგადასავალი" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "არკადა" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "ბლოკები" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "ბორდი" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "კარტი" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "ემულატორები" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "საბავშვო" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "ლოგიკური" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "როლპლეი" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "სპორტი" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "სტრატეგია" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "ყველა" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "პოპულარული" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "ჩატი" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "ყველა" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "პოპულარული" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "ხელოვნური ინტელექტი" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "ასტრონომია" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "ქიმია" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "ენები" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "მათემატიკა" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "სიახლეები" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "რობოტიკა" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "ხელოვნება" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "ბიოგრაფია" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "კომიქსები" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "ფანტასტიკა" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "ჯანმრთელობა" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "ისტორია" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "ცხოვრების სტილი" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "პოლიტიკა" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "სპორტი" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "ყველა" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "პოპულარული" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "გამმართველები" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE-ები" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "კოდეკები" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "აპარატურის დრაივერები" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "ფონტები" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "შემოტანის წყაროები" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "ენის ნაკრებები" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "ლოკალიზაცია" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "შექმნა" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "სამუშაო" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "დაკვრა" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "სოციალიზაცია" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "სწავლა" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "შემუშავება" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "კოდეკები" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "აპარატურის დრაივერები" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "ფონტები" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "შემოტანის წყაროები" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "ენის ნაკრებები" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "ლოკალიზაცია" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "აპი" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s დამატებით ფაილის ტიპების მხარდაჭერას მოითხოვს." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "დამატებითი MIME ტიპები აუცილებელია" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s დამატებით ფონტებს მოითხოვს." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "საჭიროა დამატებითი ფონტები" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s დამატებით მულტიმედია კოდეკებს მოითხოვს." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "საჭიროა დამატებითი მულტიმედია კოდეკები" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s დამატებით პრინტერის დრაივერს მოითხოვს." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "საჭიროა დამატებითი პრინტერის დრაივერი" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s-ს დამატებითი პაკეტები სჭირდება." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "საჭიროა დამატებითი პროგრამები" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "პროგრამებში ძებნა" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_მეტის ჩვენება" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_ნაკლების ჩვენება" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "წაშლა…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "დასაყენებლად გადატვირთვაა საჭირო" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "წასაშლელად გადატვირთვაა საჭრო" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "დარჩენილი დაყენება…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "დარჩენილი განახლება…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "გადმოწერა…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "მომზადება…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "წაშლა…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s დაყენებული არაა, მაგრამ მისი მონაცემები ჯერ კიდევ ხელმისაწვდომია." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_გადატვირთვა" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_ჩართვა…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_დაყენება…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s აშშ ინგლისურზე გამოჩნდება" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "ეს აპი აშშ ინგლისურზე გამოჩნდება" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "ეს აპი აშშ ინგლისურზე გამოჩნდება" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "დაგვეხმარეთ, ვთარგმნოთ" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "სხვა აპები %s-სგან" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "პროგრამისტმა %s დაამტკიცა %s-ის მფლობელობა" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "პროგრამისტმა დაამტკიცა %s-ის მფლობელობა" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "მიმოხილვის დასაწერად ინტერნეტთან წვდომა გჭირდებათ" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "ეს აპი აღარ იღებს განახლებების, უსაფრთხოების განახლებების ჩათვლით" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "ამ აპს თქვენი დისტრიბუტივი უკვე გაწვდით და ის არ უნდა ჩაანაცვლოთ." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"ამ აპს არ აქვს ბმულები ვებგვერდამდე, კოდის რეპოზიტორიამდე ან შეცდომების " +"ანგარიშის ვებგვერდამდე." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "ეს პროგრამა აღარ იღებს განახლებებს, უსაფრთხოების განახლების ჩათვლით" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"ამ პროგრამას თქვენი დისტრიბუტივი უკვე გაწვდით და ის არ უნდა ჩაანაცვლოთ." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"ამ პროგრამას არ აქვს ბმულები ვებგვერდამდე, კოდის რეპოზიტორიამდე ან " +"შეცდომების ანგარიშის ვებგვერდამდე." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Software-ის მცდელობა, მიეღო ინფორმაცია \"%s\"-სთვის, ჩავარდა და ამ აპისთვის " +"დეტალებს ვერ გაჩვენებთ." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "სერვერიდან მიღებულია არასწორი მიმოხილვის პასუხი" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "\"%s\"-ის მიმოხილვის გადაცემა ჩავარდა: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "დეტალების გვერდი" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "აპის დეტალების ჩატვირთვა" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "დამოწმებულია" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_გახსნა" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_განახლება" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "ამოშლა" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "დამატებები" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "ეს აპი, მხოლოდ, აქტიური ინტერნეტკავშირის დროს შეგძლიათ, გამოიყენოთ." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "პროგრამების რეპოზიტორია ჩასმულია" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"ეს აპი შეიცავს პროგრამების რეპოზიტორიას, რომელიც მოგაწოდებთ განახლებებს, " +"სხვა პროგრამებთან წვდომის ჩათვლით." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "პროგრამების რეპოზიტორია ჩასმული არაა" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"ეს აპი არ შეიცავს პროგრამების რეპოზიტორიას. ის არ განახლდება ახალ ვერსიებზე." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "პროგრამების რეპოზიტორია იდენტიფიცირებულია" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"ამ პროგრამების რეპოზიტორიის დამატება დამატებით პროგრამებთან და განახლებებთან " +"მოგცემთ წვდომას." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "მხოლოდ, გამოიყენეთ პროგრამის რეპოზიტორიები, რომლებსაც ენდობით." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "აპის მონაცემების გასუფთავება" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_მონაცემების წაშლა" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "მეტამონაცემების გარეშე" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "პროექტის _ვებგვერდი" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_შეწირვა" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_თარგმანების შეწირვა" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_პრობლემის რეპორტი" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_დახმარება" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_კონტაქტი" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Მიმოხილვის _დაწერა" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "ყველა მიმოხილვა" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "აპის დეტალების ჩვენება შეუძლებელია" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "გადატვირთვისთვის მომზადება ჩავარდა" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "უცნობი შეცდომა" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "გასაღები ვერ ვიპოვე" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "ეს გასაღები რეგისტრირებული არაა" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK რეგისტრაცია აუცილებელია" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_შემდეგი" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"მოწყობილობაზე ჩართულია Secure Boot. იმისათვის, რომ დააყენოთ ახალი " +"დრაივერები, ახალი მანქანის მფლობელის გასაღების (MOK) დაყენება დაგჭირდებათ. " +"ამ პროცესს მოგვიანებით ავთენტიკაცია დასჭირდება. ჩაიწერეთ გასაღებთან " +"ასოცირებული პაროლი:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "მე ჩავიწერე MOK-ის _პაროლი" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_გადატვირთვა & რეგისტრაცია…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "მორგები ინსტრუქციები: ყურადღებით წაიკითხეთ, გეთაყვა" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"გადატვირთვის შემდეგ ნაჩვენები იქნება მოწყობილობის მოგების ეკრანი. იმისათვი, " +"რომ დააყენოთ ახალი დრაივერები, მიჰყევით შემდეგ ნაბიჯებს:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• აირჩიეთ \"Enroll MOK\"\n" +"• აირჩიეთ \"დიახ\", რომ დაარეგისტრიროთ გასაღებები\n" +"• შეიყვანეთ MOK-ი პაროლი, როცა გკითხავთ\n" +"• აირჩიეთ \"Reboot\"" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "უსაფრთხოების პრობლემები" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"გასაღების წარმატებული რეგისტრაციის შემდეგ ფრთხილად იყავით, რადგან მოდული " +"განახლებები და სხვა მოდულები უპირობოდ სანდოდ გამოცხადდება. ყველა განახლება, " +"რომელიც მოხდება, გამჭვირვალედ, ჩარევის და პაროლის კითხვის გარეშე მოხდება." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"კიდევ უფრო მეტი დოკუმენტაცია, შეგიძლიათ, დოკუმენტაციის გვერდზე იპოვოთ." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "დამატებითი მეტამონაცემების ფაილების გადმოწერა…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " და " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s სკრიპტისთვის ხელმისაწვდომი ფონტები" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s-სთვის ხელმისაწვდომი პროგრამები" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "საჭირო პროგრამები ვერ ვიპოვე" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "საჭირო პროგრამები ვერ ვიპოვე" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s ნაპოვნი არაა" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "ვებგვერდზე" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "%s-ის მხარდაჭერისთვის აპი აღმოჩენილი არაა." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"ინფორმაცია %s-ის შესახებ, არჩევნის ჩათვლით, როგორ და სად იპოვოთ ნაკლული " +"პროგრამები, შეგიძლიათ იპოვოთ ბმულზე %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s-ის მხარდაჭერისთვის აპი აღმოჩენილი არაა." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s ხელმიუწვდომელია." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"ინფორმაცია %s-ის შესახებ, ისევე, როგორც ვარიანტები, როგორ მიიღოთ აპი, " +"რომელსაც ამ ფორმატის მხარდაჭერა გააჩნია, შეგიძლიათ იპოვოთ ბმულზე %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s სკრიპტის მხარდაჭერისთვის ფონტები ხელმისაწვდომი არაა." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"ინფორმაცია %s-ის შესახებ, ისევე, როგორც ვარიანტები, როგორ მიიღოთ დამატებითი " +"ფონტები, შეგიძლიათ იპოვოთ მისამართზე %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s ფორმატისთვის დამატებითი კოდეკები ხელმისაწვდომი არაა." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"ინფორმაცია %s-ის შესახებ, ისევე, როგორც ვარიანტები, როგორ მიიღოთ კოდეკი, " +"რომელსაც ამ ფორმატის დაკვრა შეუძლია, შეგიძლიათ იპოვოთ მისამართზე %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s-ის მხარდაჭერისთვის Plasma-ის რესურსები ხელმისაწვდომი არაა." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"ინფორმაცია %s-ის შესახებ, ისევე, როგორც ვარიანტებს, როგორ მიიღოთ დამატებითი " +"Plasma-ის რესურსები, შეგიძლიათ იპოვოთ მისამართზე %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s-სთვის პრინტერის დრაივერი ხელმისაწვდომი არაა." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"ინფორმაცია %s-ის შესახებ, ისევე, როგორც ვარიანტები, როგორ მიიღოთ დრაივერი, " +"რომელსაც ამ პრინტერის მხარდაჭერა გააჩნია, შეგიძლიათ იპოვოთ მისამართზე %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "დოკუმენტაცია" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"%s, რომელიც %s-მა გაოითხოვა, ვერ ვიპოვე. იხილეთ %s მეტი ინფორმაციისთვის." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "ვერ ვიპოვე %s, რომელსაც ეძებდით. მეტი ინფორმაციისთვის იხილეთ %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "ძებნამ შედეგი არ გამოიღო: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s ფაილის ფორმატი" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "_ყველას დაყენება" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "მოთხოვნილი პროგრამების მოძებნა შეუძლებელია" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "კოდეკების გვერდი" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "შედეგების გარეშე" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "ძებნის შესრულების შეცდომა" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "წინა" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "შემდეგი" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "პოპულარული აპების სია" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "სამუშაო მაგიდის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "აქვს დიდ ეკრანზე მუშაობის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "სამუშაო მაგიდის მხარდაჭერა უცნობია" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"ინფორმაცია იმის შესახებ, მხარდაჭერილია თუ არა დიდი ეკრანი, საკმარისი არაა" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "ესაჭიროება დიდი ეკრანი" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "სამუშაო მაგიდა მხარდაუჭერელია" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "დიდ ეკრანზე ვერ მუშაობს" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "მობილურის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "აქვს პატარა ეკრანზე მუშაობის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "მობილურის მხარდაჭერა უცნობია" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"ინფორმაცია იმის შესახებ, მხარდაჭერილია თუ არა პატარა ეკრანი, საკმარისი არაა" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "ესაჭიროება პატარა ეკრანი" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "მობილური მხარდაუჭერელია" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "პატარა ეკრანზე ვერ მუშაობს" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "კლავიატურის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "კლავიატურის მხარდაჭერა უცნობია" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" +"ინფორმაცია იმის შესახებ, მხარდაჭერილია თუ არა კლავიატურა, საკმარისი არაა" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "კლავიატურა აუცილებელია" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "აქვს კლავიატურის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "კლავიატურა მხარდაჭერილი არაა" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "კლავიატურასთან ერთად ვერ გამოიყენებთ" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "თაგუნას მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "მოითხოვს თაგუნას" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "თაგუნას მხარდაჭერა უცნობია" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"ინფორმაცია იმის შესახებ, მხარდაჭერილია თუ არა თაგუნა ან სხვა მაჩვენებელი " +"მოწყობილობა, საკმარისი არაა" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "თაგუნა აუცილებელია" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "აქვს თაგუნას და მაჩვენებელი მოწყობილობების მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "თაგუნა მხარდაჭერილი არაა" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "თაგუნასთან ან მაჩვენებელ მოწყობილობებთან ერთად ვერ გამოიყენებთ" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "სენსორული ეკრანის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "სენსორული ეკრანის მხარდაჭერა უცნობია" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"ინფორმაცია იმის შესახებ, მხარდაჭერილია თუ არა სენსორული ეკრანი, საკმარისი " +"არაა" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "სენსორული ეკრანი აუცილებელია" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "აქვს სენსორული ეკრანის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "სენსორული ეკრანი მხარდაუჭერელია" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "შეუძლებელია სენსორული ეკრანით გამოყენება" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "გეიმპადი აუცილებელია" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "სათამაშოდ მოითხოვს გეიმპედს" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "გეიმპადის მხარდაჭერა" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "აქვს გეიმპადის მხარდაჭერა" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s ალბათ იმუშავებს ამ მოწყობილობაზე" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s მუშაობს ამ მოწყობილობაზე" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s ალბათ მუშაობს ამ მოწყობილობაზე" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s ალბათ ამ მოწყობილობაზე სწორად არ იმუშავებს" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s ამ მოწყობილობაზე არ იმუშავებს" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "აპარატურული ნაწილის მხარდაჭერა" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "ნავიგაცია" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "გადასვლა დათვალიერების გვერდზე" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "გადასვლა დაყენებულ გვერდზე" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "გადასვლა განახლებების გვერდზე" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "ძებნის ზოლის გახსნა" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "ფანჯრები" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "მორგების ფანჯრის გახსნა" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "ღია პროგრამის რეპოზიტორიები" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "დახმარება" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "კლავიატურის მალსახმობების გახსნა" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "ჩადგმულია" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "დაყენებული გვერდი" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "მიმდინარეობს" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "აპები" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "ვებ აპები" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "სისტემური აპები" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "საზოგადოების მიერ აგებული" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_შემოგვიერთდით" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ეს აპი დაწერილია ღიად, საერთაშორისო საზოგადოების მიერ და ვრცელდება %s ლიცენზიით.\n" +"\n" +"შეგიძლიათ, მონაწილეობა მიიღოთ და დაგვეხმაროთ, ის კიდევ უფრო უკეთესო გავხადოთ." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ეს აპი დაწერილია ღიად, საერთაშორისო საზოგადოების მიერ და ვრცელდება %s " +"ლიცენზიით.\n" +"\n" +"შეგიძლიათ, მონაწილეობა მიიღოთ და დაგვეხმაროთ, ის კიდევ უფრო უკეთესო გავხადოთ." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ეს პროგრამა დაწერილია ღიად, საერთაშორისო საზოგადოების მიერ და ვრცელდება %s ლიცენზიით.\n" +"\n" +"შეგიძლიათ, მონაწილეობა მიიღოთ და დაგვეხმაროთ, ის კიდევ უფრო უკეთესო გავხადოთ." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ეს პროგრამა დაწერილია ღიად, საერთაშორისო საზოგადოების მიერ და ვრცელდება %s " +"ლიცენზიით.\n" +"\n" +"შეგიძლიათ, მონაწილეობა მიიღოთ და დაგვეხმაროთ, ის კიდევ უფრო უკეთესო გავხადოთ." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "უცნობი ლიცენზია" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "სწავლა" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"ამ აპს არ აქვს მითითებული ლიცენზია, რომლითაც ის ვრცელდება და შეიძლება, " +"ფასიანი იყოს. შეიძლება, დაუცველი იყოს ძნელად აღმოსაჩენი გზებით და შეიძლება, " +"გაფრთხილების გარეშე შეიცვალოს.\n" +"\n" +"ამ აპისთვის შეწირვა ან შეგიძლიათ, ან არა." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ამ პროგრამას არ აქვს მითითებული ლიცენზია, რომლითაც ის ვრცელდება და შეიძლება, " +"ფასიანი იყოს. შეიძლება, დაუცველი იყოს ძნელად აღმოსაჩენი გზებით და შეიძლება, " +"გაფრთხილების გარეშე შეიცვალოს.\n" +"\n" +"ამ აპისთვის შეწირვა ან შეგიძლიათ, ან არა." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "დახურული კოდი" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"ეს აპი არ დაწერილა ღია კოდით, და მხოლოდ მისმა ავტორმა იცის, როგორ მუშაობს. " +"ის შეიძლება მოწყვლადი იყოს ძნელად აღმოსაჩენი შეცდომებით, და შეიძლება, " +"გაუფრთხილებლად შეიცვალოს.\n" +"\n" +"აპისთვის შეწირვა ან შეგიძლიათ, ან არა." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"ეს პროგრამა არ დაწერილა ღია კოდით, და მხოლოდ მისმა ავტორმა იცის, როგორ " +"მუშაობს. ის შეიძლება მოწყვლადი იყოს ძნელად აღმოსაჩენი შეცდომებით, და " +"შეიძლება, გაუფრთხილებლად შეიცვალოს.\n" +"\n" +"აპისთვის შეწირვა ან შეგიძლიათ, ან არა." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "სპეციალური ლიცენზია" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"ეს აპი დაწერილია სპეციალური ლიცენზიით %s.\n" +"\n" +"აპისთვის შეწირვა ან შეგიძლიათ, ან არა." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"ეს აპი დაწერილია სპეციალური ლიცენზიით \"%s\".\n" +"\n" +"აპისთვის შეწირვა ან შეგიძლიათ, ან არა." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ეს პროგრამა დაწერილია სპეციალური ლიცენზიით %s.\n" +"\n" +"აპისთვის შეწირვა ან შეგიძლიათ, ან არა." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ეს პროგრამა დაწერილია სპეციალური ლიცენზიით \"%s\".\n" +"\n" +"აპისთვის შეწირვა ან შეგიძლიათ, ან არა." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "მონაცემების განახლება" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "გვერდის ჩატვირთვა" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "გაშვება" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "უცნობი წყარო" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "ბეტა" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "მომხმარებელი" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "დამატებები" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "წაშლები" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "განახლებები" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "ვერსიის ჩამოწევა" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "მონიშნული გარე რესურსები" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"მოგაწვდით წვდომას დამატებით პროგრამებთან %s-დან. ასევე შეიცავს ზოგიერთ " +"კომერციულ პროგრამას.\n" +"\n" +"ეს რეპოზიტორიები მოგვიანებით შეგიძლიათ ჩართოთ პროგრამის რეპოზიტორიების " +"პარამეტრებიდან." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "ჩავრთო მესამე პირებისგან მოწოდებული რეპოზიტორიები?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_იგნორი" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_ჩართვა" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "ხელმისაწვდომია თქვენი ოპერაციული სისტემისთვის" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "ხელმისაწვდომია %s-სთვის" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "დათვალიერება" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "გვერდის მიმოხილვა" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "ხელმისაწვდომი აპები" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "სხვა კატეგორიები" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "აპლიკაციის მონაცემები ვერ ვიპოვე" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "უცნობი" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_დიახ" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "მომხმარებელმა გააუქმა დაყენება" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "მომზადება: %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "დარწმუნებული ბრძანდებით, რომ გნებავთ, წაშალოთ %s რეპოზიტორია?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"ყველა აპი %s-დან წაიშლება და რეპოზიტორიის თავიდან დაყენება მოგიწევთ, თუ მათ " +"გამოყენებას დააპირებთ." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "წავშალო %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "წაშლის შემდეგ %s-ს ვერ გამოიყენებთ." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "წაშლის შემდეგ აპებს, რომლებსაც %s სჭირდებათ, ვეღარ გამოიყენებთ." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"წაშლის შემდეგ %s-ს ვეღარ გამოიყენებთ და დოკუმენტები, რომლებიც მას " +"იყენებდნენ, სხვა ფონტით გამოჩნდება." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"წაშლის შემდეგ %s-ს ვეღარ გამოიყენებთ. ეს შეიძლება ნიშნავდეს, რომ ზოგიერთ " +"მედიაფალს ვეღარ დაუკრავთ." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"აპარატურამ, რომელიც %s-ზეა დამოკიდებული, შეიძლება, წაშლის შემდეგ, სწორად " +"აღარ იმუშაოს." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"წაშლის შემდეგ %s-ს ვეღარ გამოიყენებთ. აპის მონაცემები და პარამეტრები დარჩება " +"დისკზე, რითიც მომავალში აპის აღდგენის საშუალებას მოგცემთ." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "მორგება" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "პროგრამული განახლებები" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "მეტი ინფორმაცია" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"განახლებების შემოწმება და გადმოწერა ტრაფიკს და ენერგიას ხარჯავს. ასე რომ, " +"ავტომატური განახლებების ფუნქცია დროებით შეჩერებულია, სანამ გაზომვადი ქსელური " +"მიერთება და ენერგიის დაზოგვა ჩართულია." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_ავტომატური" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "განახლებების ავტომატური შემოწმება და გადმოწერ" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_ხელით" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "განახლებების შემოწმება და გადმოწერა ხელით უნდა მოხდეს" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "ავტომატური განახლებების _შეტყობინებები" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "გაფრთხილება, როცა განახლებები ავტომატურად იქნება დაყენებული" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "შემცველობის ფილტრები" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "მხოლოდ თავისუფალი _პროგრამების ჩვენება" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "ფასიანი პროგრამების დამალვა ძებნისას" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "მხოლოდ, გადამოწმებული პროგრამისტების ჩ_ვენება" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"მხოლოდ, იმ პროგრამისტების აპების ჩვენება, ვისი იდენტიფიკაციაც გადამოწმებულია" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"დაყენებული პროგრამა შეუთავსებელია %s-სთან და ავტომატურად წაიშლება ვერსიის " +"აწევისას." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "შეუთავსებელი პროგრამები" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_განახლება" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_წაშლა" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "აპის პარამეტრები & მონაცემები" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "დატოვება" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "აპის პარამეტრებისა და შემცველობის აღდგენის დაშვება" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_წაშლა" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "მონაცემების სამუდამოდ წაშლა დისკზე ადგილის დაზოგვის მიზნით" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"პროგრამები, რომელიც \"%s\"-დან დააყენეთ, განახლებების მიღებას შეწყვეტს." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "გამოვრთო რეპოზიტორია?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "წავშალო რეპოზიტორია?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_გამორთვა" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_წაშლა" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "ჩართეთ ახალი რეპოზიტორიები" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "ახალი რეპოზიტორიების ჩართვა მათ დამატებისას" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "მეტი ინფორმაცია" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "დამატებითი რეპოზიტორიები არცეული მესამე პირებისგან — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "მესამე პირების მიერ მოწოდებული რეპოზიტორიები Fedora-სთვის" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "ოპერაციული სისტემა" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"ეს რეპოზიტორიები მიემატება %s-ის მიერ მოწოდებულ ნაგულისხმევ პროგრამებს." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "პროგრამის რეპოზიტორიები" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "რეპოზიტორიების გარეშე" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "დაყენებულია %u პროგრამა" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u დამატება დაყენებულია" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u აპი" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u დამატება" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s და %s დაყენებულია" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "დაყენებული პროგრამების შემოწმება…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "წაშლა" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "ვერ ვიტან" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "არ მომწონს" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "ნორმალურია" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "მომწონს" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "მიყვარს" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "აირჩიეთ ვარსკვლავი რეიტინგის დასატოვებლად" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "დახარჯეთ მეტი დრო მიმოხილვის დასაწერად" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "აირჩიეთ ვარსკვლავების რეიტინგი" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "მიმოხილვა ძალიან მოკლეა" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "მიმოხილვა ძალიან გრძელია" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "აღწერა ძალიან მოკლეა" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "აღწერა ძალიან გრძელია" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "შეფასების დაწერა" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_გაგზავნა" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"შეიყვანეთ შეფასება, შეჯამება და შეჯამების ტექსტი. შეჯამებები პრობლემების " +"შესახებ მოსაწერად არ გამოიყენოთ. დაუკავშირდით პროგრამისტს ან თქვენი " +"მხარდაჭერის მომწოდებელს." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "გადახედვის შეჯამება" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "მოკლე შეფასების დაწერა" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"ნახეთ, რა მონაცემები გვეგზავნება ჩვენს კონფიდენციალობის პოლიტიკაში. სრული სახელი, რომელიც თქვენს " +"ანგარიშზეა მიბმული, საჯაროდ გამოჩნდება." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "სულ %u მიმოხილვა" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "5 ვარსკვლავიდან" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "უცნობი" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "შეგიძლიათ მოგვწეროთ აგრესიული, უხეში ან დამამცირებელი ქცევის შესახებ." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"როცა მოგვწერთ, მიმოხილვა დამალული იქნება, სანამ მას ადმინისტრატორი არ " +"შეამოწმებს." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "გადავცე მიმოხილვა?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_ანგარიში" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "წავშალო მიმოხილვა?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "გადახედვის წაშლა შეუქცევადია." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Მიმოხილვის მოწონება" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Მიმოხილვის არმოწონება" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "ანგარიში…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "წაშლა…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "აპი სენდბოქსში არაა, მაგრამ დისტრიბუტივმა შეამოწმა, ის მავნე არაა" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"შეამოწმეთ, ენდობით მომწოდებელს, თუ არა, რადგან აპი სენდბოქსში არ ეშვება" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "წვდომების გარეშე" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "აპი მთლიანად შემოსაზღვრულია" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "ქსელური წვდომა" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "წვდომა ინტერნეტთან" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "ქსელთან წვდომის გარეშე" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "არ აქვს ინტერნეტთან წვდომა" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "იყენებს სისტემურ სერვისებს" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "შეუძლია მონაცემების გამოთხოვა სისტემური რესურსებიდან" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "იყენებს სესიის სერვისებს" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "შეუძლია მონაცემების გამოთხოვა სესიის რესურსებიდან" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "მომხმარებლის მოწყობილობასთან წვდომა" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "აქვს ისეთ მოწყობილობებთან წვდომა, როგორიცაა ვებკამერა ან ჯოისტიკი" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "მომხმარებლის მოწყობილობებთან წვდომის გარეშე" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "არ აქვს ისეთ მოწყობილობებთან წვდომა, როგორიცაა ვებკამერა ან ჯოისტიკი" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "შეყვანის მოწყობილობასთან წვდომა" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "მიკროფონთან წვდომა და ხმის დაკვრა" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "შეუძლია მოსმენა მიკროფონით და ხმის დაკვრა, ნებართვის კითხვის გარეშე" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "სისტემურ მოწყობილობასთან წვდომა" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"აქვს წვდომა სისტემურ მოწყობილობებთან, რომლებსაც დამატებითი წვდომები " +"ესაჭიროება" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "წვდომა ეკრანის შემცველობასთან" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "ეკრანის ან სხვა ფანჯრების შემცველობასთან წვდომა აკრძალულია" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "მოძველებული ფანჯრული სისტემა" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "ჩვეულებრივი წვდომები" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "მომხმარებლის პარამეტრები" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "სრული ფაილური სისტემის ჩაწერა/წაკითხვის წვდომა" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "შეუძლია ფაილური სისტემიდან წაკთხვა და მასზე ჩაწერა" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "საწყისი საქაღალდის ჩაწერა/წაკითხვის წვდომა" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "შეუძლია ჩაწეროს თქვენს საწყის საქაღალდეში" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "სრული ფაილური სისტემის კითხვის შეცდომა" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "შეუძლია ფაილური სისტემიდან წაკთხვა" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "საწყისი საქაღალდის წაკითხვის წვდომა" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "შეუძლია წაიკითხოს თქვენი საწყისი საქალდიდან" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "გადმოწერის საქაღალდის ჩაწერა/წაკითხვის წვდომა" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "შეუძლია ჩაწეროს და წაიკითხოს თქვენი გადმოწერის საქაღალდიდან" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "გადმოწერის საქაღალდის წაკითხვის წვდომა" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "შეუძლია წაიკითხოს თქვენი გადმოწერის საქაღალდიდან" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "შეუძლია საქაღალდეში მონაცემები ჩაწეროს და წაიკითხოს" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "შეუძლია წაიკითხოს ყველა მონაცემები საქაღალდიდან" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "ფაილურ სისტემასთან წვდომის გარეშე" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "ფაილურ სისტემასთან წვდომა საერთოდ არ მაქვს" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "აპის ავტორი შემოწმებულია" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "ამ პროგრამისტმა დაამტკიცა, რომ ისაა, ვისადაც თავი მოაქვს" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "დაუცველი დამოკიდებულებები" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"პროგრამა ან მისი დამოკიდებულებები მხარდაჭერილი აღარაა და შეიძლება, საფრთხეს " +"შეიცავდეს" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"ამ აპს არ აქვს მითითებული, რა ლიცენზიის ქვეშაა და შეიძლება, ფასიანი იყოს" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"ამ პროგრამას არ აქვს მითითებული, რა ლიცენზიის ქვეშაა და შეიძლება, ფასიანი " +"იყოს" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "დახურული კოდი" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"პროგრამის კოდი საჯარო არაა, ასე რომ, მას დამოუკიდებლად ვერ გადახედავთ, " +"ამიტომ ის უსაფრთხო არაა" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "ეს პროგრამა იწერება სპეციალური ლიცენზიით \"%s\"" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "პროგრამა იწერება სპეციალური ლიცენზიით \"%s\"" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "აუდიტირებადი კოდი" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"საწყისი კოდი საჯაროა და შეიძლება, დამოუკიდებელი აუდიტი ჩაუტარდეს, რაც აპს " +"უფრო დიდ შანსს აძლევს, უსაფრთხო იყოს" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s პრივილეგირებულია" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s უსაფრთხოა" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s ალბათ უსაფრთხოა" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s პოტენციურად სახიფათოა" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s სახიფათოა" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "უცნობი" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "უსაფრთხოება" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "ლიცენზია" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "წყარო" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"ეს აპი პროგრამული პლატფორმის (SDK) მოძველებულ ვერსიას იყენებს და შეიძლება, " +"შეცდომებს და უსაფრთხოების მოწყვლადობებს შეიცავდეს, რომლებიც აღარ გასწორდება." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "წინა ეკრანის ანაბეჭდი" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "შემდეგი ეკრანის ანაბეჭდი" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "ეკრანის ანაბეჭდების გარეშე" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "ეკრანის ანაბეჭდი ვერ ვიპოვე" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "გამოსახულების ჩატვირთვის შეცდომა" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "ეკრანის ანაბეჭდის ზომა ვერ ვიპოვე" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "ქეშის შექმნის შეცდომა" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "ეკრანის ანაბეჭდი არასწორია" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "ეკრანის ანაბეჭდი ხელმიუწვდომელია" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "ეკრანის ანაბეჭდი" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "კიდევ %u დამთხვევა" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "გვერდის მოძებნა" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "აპების მოძებნა" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "აპი ვერ ვიპოვე" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "განახლებების გადმოწერის შეცდომა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "მიკროკოდის განახლების გადმოწერის შეცდომა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "%s-დან მიკროკოდის განახლების გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "%s-დან განახლებების გადმოწერის შეცდომა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "განახლება შეუძლებელია: ინტერნეტთან წვდომა აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "განახლების შეცდომა: დისკზე თავისუფალი ადგილი საკმარისი არაა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"%s-დან განახლებების გადმოწერის შეცდომა: დისკზე თავისუფალი ადგილი საკმარისი " +"არაა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "განახლებების შეცდომა: ავთენტიკაცია აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "განახლება შეუძლებელია: ავთენტიკაცია არასწორია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "განახლება შეუძლებელია: აუცილებელია წვდომები" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"განახლებების გადმოწერის შეცდომა: პროგრამების დაყენების წვდომა არ გაგაჩნიათ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "განახლებების სიის მიღების შეცდომა" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "დაყენების შეცდომა: გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s-ის დაყენების შეცდომა: %s-დან გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s-ის დაყენების შეცდომა: გადმოწერის შეცდომა" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "დაყენება შეუძლებელია: გაშვების გარემო აღმოჩენილი არაა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s-ის დაყენების შეცდომა: გაშვების გარემო %s ხელმისაწვდომი არაა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "%s-ის დაყენების შეცდომა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "წაშლა შეუძლებელია: ინტერნეტთან წვდომა აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "დაყენების შეცდომა: აპლიკაციის არასწორი ფორმატი" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "დაყენების შეცდომა: დისკზე თავისუფალი ადგილი საკმარისი არაა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s-ის დაყენების შეცდომა: დისკზე თავისუფალი ადგილი საკმარისი არაა" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "დაყენების შეცდომა: ავთენტიკაცია აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s-ის დაყენების შეცდომა: ავთენტიკაცია აუცილებელია" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "დაყენების შეცდომა: ავთენტიკაციის შეცდომა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s-ის დაყენების შეცდომა: ავთენტიკაცია ვერ გაიარეთ" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "დაყენების შეცდომა: საჭიროა წვდომები" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s-ის დაყენება შეუძლებელია: აუცილებელია წვდომები" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "დაყენება შეუძლებელია: მოწყობილობა მიერთებული უნდა იყოს" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s-ის განახლება შეუძლებელია: მოწყობილობა მიერთებული უნდა იყოს" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "დაყენება შეუძლებელია: ელემენტის მუხტი ძალიან დაბალია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s-ის დაყენების შეცდომა: ელემენტის მუხტი მეტისმეტად მცირეა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%s-ის განახლება %s-დან შეუძლებელია: გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s-ის განახლება შეუძლებელია: გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "%s-დან განახლებების დაყენება შეუძლებელია: გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "განახლება შეუძლებელია: გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s-ის განახლების შეცდომა: დისკზე თავისუფალი ადგილი საკმარისი არაა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s-ის განახლება შეუძლებელია: აუცილებელია ავთენტიკაცია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s-ის განახლება შეუძლებელია: ავთენტიკაცია არასწორია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s-ის განახლება შეუძლებელია: აუცილებელია წვდომები" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "განახლება შეუძლებელია: მოწყობილობა მიერთებული უნდა იყოს" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s-ის განახლება შეუძლებელია: მოწყობილობა მიერთებული უნდა იყოს" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "განახლება შეუძლებელია: ელემენტის მუხტი ძალიან დაბალია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s-ის განახლება შეუძლებელია: ელემენტის მუხტი ძალიან დაბალია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "%s-ის განახლების შეცდომა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "განახლება შეუძლებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "ვერსიის აწევა შეუძლებელია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%2$s-დან %1$s-ზე ვერსიის აწევა შეუძლებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "ვერსიის აწევა შეუძლებელია: გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "%s-ზე ვერსიის აწევა შეუძლებელია: გადმოწერა ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "ვერსიის აწევა შეუძლებელია: ინტერნეტთან წვდომა აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "%s-მდე ვერსიის აწევა შეუძლებელია: ინტერნეტთან წვდომა აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "ვერსიის აწევა შეუძლებელია: დისკზე თავისუფალი ადგილი საკმარისი არაა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" +"%s-ზე ვერსიის აწევა შეუძლებელია: დისკზე თავისუფალი ადგილი საკმარისი არაა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "ვერსიის აწევა შეუძლებელია: ავთენტიკაცია აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "%s-ზე ვერსიის აწევა შეუძლებელია: ავთენტიკაცია აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "ვერსიის აწევა შეუძლებელია: ავთენტიკაცია არასწორია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "%s-ზე ვერსიის აწევა შეუძლებელია: ავთენტიკაცია არასწორია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "ვერსიის აწევა შეუძლებელია: აუცილებელია წვდომები" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "%s-ზე ვერსიის აწევა შეუძლებელია: წვდომები აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "ვერსიის აწევა შეუძლებელია: მოწყობილობა მიერთებული უნდა იყოს" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "%s-მდე ვერსიის აწევა შეუძლებელია: მოწყობილობა მიერთებული უნდა იყოს" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "ვერსიის აწევა შეუძლებელია: ელემენტის მუხტი ძალიან დაბალია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "%s-ზე ვერსიის აწევა შეუძლებელია: ელემენტის მუხტი მეტისმეტად მცირეა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "%s-ზე ვერსიის აწევა შეუძლებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "წაშლის შეცდომა: ავთენტიკაცია აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s-ის წაშლის შეცდომა: ავთენტიკაცია აუცილებელია" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "წაშლის შეცდომა: ავთენტიკაცია ვერ გაიარეთ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s-ის წაშლის შეცდომა: ავთენტიკაცია ვერ გაიარეთ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "წაშლის შეცდომა: საჭიროა წვდომები" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s-ის წაშლის შეცდომა: საჭიროა წვდომები" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "წაშლა შეუძლებელია: მოწყობილობა მიერთებული უნდა იყოს" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s-ის წაშლა შეუძლებელია: მოწყობილობა მიერთებული უნდა იყოს" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "წაშლა შეუძლებელია: ელემენტის მუხტი ძალიან დაბალია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s-ის წაშლა შეუძლებელია: ელემენტის მუხტი ძალიან დაბალია" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s-ის წაშლა შეუძლებელია" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "%s-ის გაშვება შეუძლებელია" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "რაღაც არასწორად ხდება" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s-ის გაშვება ჩავარდა: %s დაყენებული არაა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "ოპერაციის დასასრულებლად დისკზე საკმარისი ადგილი არაა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "დაყენების შეცდომა: ფაილის ტიპი მხარდაჭერილი არაა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "დაყენების შეცდომა: ავთენტიკაცია ჩავარდა" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "დაყენების შეცდომა" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "%s-სთან მიერთების შეცდომა" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "ახალი დამატებების გამოსაყენებლად პროგრამას გადატვირთვა ესაჭიროება" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "საჭიროა მოწყობილობის მიერთება" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "ელემენტის მუხტი მეტისმეტად მცირეა" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_პროგრამის რეპოზიტორიები" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_გამართვა" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_კლავიატურის მალსახმობები" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "პროგრ_ამის შესახებ" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "ძებნა" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "მთავარი მენიუ" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "აპების ძებნა" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_დათვალიერება" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_დაყენებულია" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_განახლებები" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "უკან გადასვლა" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "არც_ერთი" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "აპლიკაციის მონაცემები" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "მონაცემები, რომელიც აპს გასაშვებად სჭირდება" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "მომხმარებლის მონაცემები" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "აპში თქვენს მიერ შექმნილი მონაცემები" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "ქეშის მონაცემები" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "დროებით ქეში" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "თვითონ აპლიკაცია" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "აუცილებელი დამოკიდებულებები" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "აპლიკაციისთვის საჭირო გაზიარებული სისტემური კომპონენტები" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "უცნობი" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"დაკეშილი მონაცემების გასუფთავება შეიძლება _app settings-დან" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "საცავი" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (დაყენებული)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (დაყენება)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (გადმოწერა)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (წაშლა)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_დეტალები" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_ანალიზი" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "დაყენებულია %s-ზე" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "დაყენებული განახლებები" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "განახლებები დაყენებული არაა" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "განახლებები მოძველებულია" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "ხელმისაწვდომი განახლებების შემოწმება" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "კრიტიკული განახლებები დასაყენებლად მზადაა" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "კრიტიკული განახლებების დაყენება რაც შეიძლება სწრაფად" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "კრიტიკული განახლებები გადმოსაწერად მზადაა" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "კრიტიკული განახლებების გადმოწერა რაც შეიძლება სწრაფად" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "განახლებები დასაყენებლად მზადაა" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "პროგრამის განახლებები მზადაა და გელოდებათ" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "ხელმისაწვდომია გადმოწერადი განახლებები" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "პროგრამის განახლებები გადმოსაწერად მზადაა" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u აპი განახლდა -- გადატვირთვა აუცილებელია" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u აპი განახლდა" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s განახლდა." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "გადატვირთეთ აპი." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s და %s განახლდა." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u აპი საჭიროებს გადატვირთვას." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "შეიცავს %s-ს, %s-ს და %s-ს." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "სისტემამ ცხოვრების ბოლო ნაბიჯს მიაღწია" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "ასწიეთ ვერსია განახლებების მიღების გასაგრძელებლად" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "დასაყენებლად ხელმისაწვდომია %s-ის ახალი ვერსია" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "ხელმისაწვდომია პროგრამების გაუმჯობესებები" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "პროგრამების განახლების შეცდომა" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "მომზადებული განახლებების დაყენება არ მომხდარა" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "დეტალების ჩვენება" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "სისტემის გაუმჯობესება დასრულდა" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "კეთილი იყოს თქვენი მობრძანება %s %s-ში!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "პროგრამის განახლებები დაყენებულია" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "დაყენებულია ოპერაციული სისტემის მნიშვნელოვანი განახლება." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Მიმოხილვა" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "განახლების შეცდომა" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "სისტემა უკვე განახლებულია." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "განახლება გაუქმდა." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"ინტერნეტთან წვდომა აუცილებელია, მაგრამ ის ხელმისაწვდომი არაა. დარწმუნდით, " +"რომ ინტერნეტი გაქვთ და თავიდან სცადეთ." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"ამ განახლებას უსაფრთხოების პრობლემები გააჩნია. მეტი დეტალებისთვის " +"დაუკავშირდით პროგრამის მომწოდებელს." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"დისკზე საკმარისი ადგილი აღარაა. გაათავისუფლეთ ადგილი და თავიდან სცადეთ." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"უკაცრავად: განახლებების დაყენება ჩავარდა. დაელოდეთ სხვა განახლებას და " +"თავიდან სცადეთ. თუ პრობლემა არ გადაწყდება, დაუკავშირდით პროგრამების " +"მომწოდებელს." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "ბოლო შემოწმება: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "გაჩერება" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "განახლებების შემოწმება" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s-მა შეწყვიტა კრიტიკული პროგრამული განახლებების მიღება" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"თქვენმა ოპერაციულმა სისტემამ შეწყვიტა კრიტიკული პროგრამული განახლებების " +"მიღება" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "შეიძლება გადასახდელი გაგიხდეთ" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"მობილური ფართოზოლოვანი მიერთებისას განახლებების შემოწმებამ, შეიძლება, " +"საკმაოდ დიდი ხარჯი დაგიჯდეთ." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_მაინც შემოწმება" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "პროგრამების გაუმჯობესებები გადმოწერილია" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "ვერსიის აწევისთვის მომზადება დასრულდა" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "განახლებების შემოწმება" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "განახლებები" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "განახლებების გვერდი" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "განახლებების ჩატვირთვა" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "ამას საკმაო დრო დასჭირდება" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "განახლებულია" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "გამოვიყენო მობილური ინტერნეტი?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"მობილური ფართოზოლოვანი მიერთებისას განახლებების შემოწმებამ, შეიძლება, " +"საკმაოდ დიდი ხარჯი დაგიჯდეთ" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_მაინც შემოწმება" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "მიერთების გარეშე" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "ჩართეთ ინტერნეტი განახლებების შესამოწმებლად" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_ქსელის მორგება" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "შეცდომა" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "განახლებები ავტომატურად იმართება" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "პროგრამის განახლებები შეჩერებულია" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "ავტომატური პროგრამების განახლება შეჩერებულია შემდეგი მიზეზებით:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• მიმდინარე ქსელთან მიერთება გაზომვადია" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• მიმდინარე ქსელთან მიერთბა კრძალავს დიდი ფაილების გადმოწერას" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• ენერგიის დაზოგვის რეჟიმი აქტიურია" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• თამაშის რეჟიმი აქტიურია" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "პროგრამის განახლებები შეჩერებულია" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "ქსელთან მიერთება გაზომვადია - პროგრამების განახლება შეჩერდა" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"ქსელურ მიერთებას დიდი ფაილების გადმოწერა არ შეუძლია - პროგრამის განახლებები " +"შეჩერებულია" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "ენერგიის შენახვის რეჟიმი აქტიურია - პროგრამის განახლებები შეჩერებულია" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "თამაშის რეჟიმი აქტიურია - პროგრამის განახლებები შეჩერებულია" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "&გადატვირთვა და განახლება…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_ყველას განახლება" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "პროგრამების განახლებები გადმოწერილია" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "განახლებები დასაყენებლად მზადაა" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "ინტეგრირებული მიკროკოდი" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "საჭიროებს გადატვირთვას" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "აპლიკაციის განახლებები" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "მოწყობილობის მიკროკოდი" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_გადმოწერა" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s ხელმისაწვდომია" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s ხელმისაწვდომია" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "გაიგეთ მეტი ახალ ვერსიაზე" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s/%s გადმოწერილია" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% გადმოწერილია" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "დიდი განახლება, ახალი ფუნქციებით და უფრო ნაკლები შეცდომით." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "განახლება გაუქმება" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_გადატვირთვა და სისტემის განახლება…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "ვერსიის აწევამდე დაიმახსოვრეთ, დაამარქაფოთ მონაცემები და ფაილები." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "შეცდომის დეტალები" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "დეტალების კოპირება" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "ფაილის წაშლა ვერ მოხერხდა \"%s\": %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "საქაღალდის (\"%s\") წაშლის შეცდომა: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "დაამატეთ, წაშალეთ და განაახლეთ პროგრამები ამ კომპიუტერზე" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;განახლებები;წყაროები;რეპოზიტორიები;მაღაზია;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s მზადაა" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s მზადაა ჩასართავად შემდეგი გადატვირთვისას." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "ჩართვა" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "სისტემური განახლებები" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"ზოგადი სისტემური განახლებები, როგორიცაა უსაფრთხოების და მოწყვლადობების " +"განახლებები და წარმადობის გაუმჯობესებები." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s განახლება ახალი ფუნქციებითა და ნაკლები შეცდომით." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS განახლების სერვისმა განახლება ვერ გადმოწერა და გადაატარა." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "ვებ აპლიკაცია" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "ვებ აპების მხარდაჭერა" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "გაუშვით პოპულარული ვებაპები ბრაუზერში" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"განახლდით უახლესი ფუნქციებისთვის, წარმადობისა და სტაბილურობის " +"გაუმჯობესებებისათვის." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak-ის მხარდაჭერა" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak ლინუქსზე სამუშაო მაგიდების დისტრიბუტივის სისტემაა" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "სისტემური საქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "საწყისი ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "ჰოსტი სისტემის საქაღალდეები" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "ჰოსტი სისტემის კონფიგურაცია /etc-დან" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "სამუშაო მაგიდის საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "სამუშაო მაგიდის ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "დოკუმენტების საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "დოკუმენტების ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "მუსიკის საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "მუსიკის საქაღალდე: %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "სურთების საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "სურათების ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "საჯარო გაზიარების საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "საჯარო გაზიარების ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "ვიდეოების საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "ვიდეოების ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "შაბლონების საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "შაბლონების ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "მომხმარებლის ქეშის საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "მომხმარებლის ქეშის ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "მომხმარებლის კონფიგურაციის საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "მომხმარებლის კონფიგურაციის ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "მომხმარებლის მონაცემების საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "მომხმარებლის მონაცემების ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "მომხმარებლის პროგრამების მონაცემების საქაღალდე" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "მომხმარებლის გაშვების გარემოს ქვესაქაღალდე %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "ფაილური სისტემის წვდომა %s-ზე" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Flatpak-ის მეტამონაცემების მიღება %s-სთვის…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "ჩავარდა დაზუსტება დამატებისთვის '%s': %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "მომხმარებლისთვის დაყენება" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "სისტემაში დაყენება" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "App ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "დაყენება ჩავარდა დამატებისთვის '%s': %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "წაშლა ჩავარდა დამატებისთვის '%s': %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"დაშორებული \"%s\" არ გაძლევთ საშუალებას, \"%s\" დააყენოთ. ალბათ, ფილტრის " +"გამო. წაშალეთ ფილტრი და გაიმეორეთ დაყენება. დეტალური შეცდომა: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "სისტემის კვების სიმძლავრე განახლებისთვის მეტისმეტად დაბალია" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"სისტემის კვების სიმძლავრე განახლებისთვის მეტისმეტად დაბალია(%u%%, საჭიროა " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "" +"მოწყობილობა მიუწვდომელია ან გასულია უსადენო ინტერნეტის წვდომის არეალიდან" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "მოწყობილობის ელემენტის სიმძლავრე მეტისმეტად დაბალია" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"მოწყობილობის ელემენტის სიმძლავრე მეტისმეტად დაბალია(%u%%, საჭიროა %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "მოწყობილობა განახლების დასრულებას ელოდება" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "მოწყობილობას ესაჭიროება 220V კვება" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "მოწყობილობას ვერ გამოიყენებთ, თუ ის დახურულია" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s მოწყობილობის განახლება" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s სისტემის განახლება" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s ჩადგმული კონტროლერის განახლება" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME-ის განახლება" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s კორპორატიული ME-ის განახლება" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s მომხმარებლის ME-ის განახლება" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s კონტროლერის განახლება" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt კონტროლერის განახლება" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU მიკროკოდის განახლება" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s კონფიგურაციის განახლება" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s ელემენტის განახლება" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s კამერის განახლება" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM განახლება" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s თაჩპედის განახლება" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s თაგუნას განახლება" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s კლავიატურის განახლება" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s საცავის კონტროლერის განახლება" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s ქსელის ინტერფეისის განახლება" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s ეკრანის განახლება" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC -ის განახლება" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB მიმღების განახლება" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s დისკის განახლება" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s Flash დისკის განახლება" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD -ის განახლება" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU -ის განახლება" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s დოკის განახლება" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB დოკის განახლება" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "მიკროკოდი" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "მიკროკოდის განახლების დაყენება შეუძლებელია: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "მიკროკოდის განახლების მხარდაჭერა" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "მიკროკოდის განახლების მხარდაჭერა" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "დავაყენო ხელმოუწერელი პროგრამები?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"პროგრამა რომლის დაყენებასაც აპირებთ, ხელმოწერილი არაა. ამ პროგრამის " +"განახლებების წყაროს გადამოწმება შეუძლებელი იქნება, ანუ, შეცვლილია თუ არა " +"განახლების ფაილი." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "გადმოვწერო ხელმოუწერელი პროგრამები?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"ხელმისაწვდომია ხელმოუწერელი განახლებები. ხელმოწერის გარეშე შეუძლებელია " +"განახლების წყაროს გადამოწმება ან ვინმემ ხომ არ შეცვალა განახლებები." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "განვაახლო ხელმოუწერელი პროგრამები?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"ხელმისაწვდომია ხელმოუწერელი განახლებები. ხელმოწერის გარეშე შეუძლებელია " +"განახლების წყაროს გადამოწმება და იმისაც, შეცვლილია თუ არა განახლება. " +"პროგრამის განახლებები გაითიშება, სანამ ხელმოუწერელ განახლებებს ან წაშლით ან " +"განაახლებთ." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "განახლებების დაყენების შეცდომა: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "პაკეტები" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "ჩავარდა ტრანზაქციის დასრულების მოლოდინი გადმოწერამდე: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "განახლებების გადმოწერის შეცდომა: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "განახლების ტრიგერის შეცდომა: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "ოპერაცული სისტემა (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap -ის მხარდაჭერა" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap ლინუქსის უნივერსალური პაკეტია" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "სისტემა" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "სისტემის კომპონენტი" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "იშლება sysupdate-ის დავალება '%s'. ის ჩავარდა სტატუსით %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "სასიამოვნო გზა, მართოთ თქვენი პროგრამები." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "შეიყვანეთ რიცხვი 1-დან %u-მდე: " + +#~ msgid "Choose an app:" +#~ msgstr "აირჩიეთ აპლიკაცია:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s ახლა დაყენებულია" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "აპი წაშლილია" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "\"%s\"-ის პოვნა შეუძლებელია" + +#~ msgid "Moderate page" +#~ msgstr "გვერდის ჩასწორება" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "ჩასასწორებელი მიმოხილვების გარეშე" + +#~ msgid "Was this review useful to you?" +#~ msgstr "მიმოხილვა სასარგებლო იყო?" + +#~ msgid "Yes" +#~ msgstr "დიახ" + +#~ msgid "No" +#~ msgstr "არა" + +#~ msgid "Meh" +#~ msgstr "ისე რა" + +#~ msgid "Outdated SDK version" +#~ msgstr "SDK-ის მოძველებული ვერსია" + +#~ msgid "Unable to install updates" +#~ msgstr "განახლებების დაყენების შეცდომა" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "წაშლის შეცდომა: ავთენტიკაცია ვერ გაიარეთ" + +#~ msgid "Network Settings" +#~ msgstr "ქსელის მორგება" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "ოპერაციული სისტემის განახლებები ხელმიუწვდომელია" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "მნიშვნელობანი ოპერაციული სისტემის განახლების დაყენება ჩავარდა." + +#~ msgid "No Network" +#~ msgstr "ქსელის გარეშე" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "განახლებების შესამოწმებლად აუცილებელია ინტერნეტთან წვდომა." + +#~ msgid "Network _Settings" +#~ msgstr "_ქსელის მორგება" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "პროგრამის განახლებები გადმოწერილია და მზადაა დასაყენებლად." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "პროგრამის განახლებები გადმოწერილია და მზადაა დასაყენებლად." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "ვერსიის აწევის ინფორმაციის გადმოწერა…" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "პროგრამების კატალოგის გადმოწერა" + +#, c-format +#~| msgid "%s %s" +#~ msgid "%s %s %s" +#~ msgstr "%s %s %s" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "მნიშვნელოვანი პროგრამის განახლებები დასაყენებლად მზადაა." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "მნიშვნელოვანია: გელოდებათ კრიტიკული პროგრამის განახლებები." + +#~ msgid "Please download waiting software updates." +#~ msgstr "გადმოწერეთ მომლოდინე პროგრამის განახლებები." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "ავტომატური განახლებები შეჩერებულია" + +#~ msgid "Open Network _Settings" +#~ msgstr "_ქსელის პარამეტრების გახსნა" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "განახლებების გადმოწერის შეცდომა: ინტერნეტთან წვდომა აუცილებელია, მაგრამ " +#~ "ის მიუწვდომელია" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "განახლებების გადმოწერის შეცდომა: დისკზე საკმარისი ადგილი არაა" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "განახლებების გადმოწერის შეცდომა: ავთენტიკაცია აუცილებელია" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "განახლებების გადმოწერის შეცდომა: ავთენტიკაცია ვერ გავიარე" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "%s-ის დაყენების შეცდომა: პროგრამების დაყენების წვდომა არ გაგაჩნიათ" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "%s-ის დაყენების შეცდომა: ელემენტის მუხტი მეტისმეტად მცირეა" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "" +#~ "განახლებების დაყენების შეცდომა: დისკზე თავისუფალი ადგილი საკმარისი არაა" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "განახლებების დაყენების შეცდომა: ავთენტიკაცია არასწორია" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "%s-ის განახლების შეცდომა: პროგრამების განახლების წვდომა არ გაგაჩნიათ" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "განახლებების დაყენების შეცდომა: პროგრამების განახლების წვდომა არ გაგაჩნიათ" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "განახლებების დაყენების შეცდომა: საჭიროა დამტენზე მიერთება" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "%s-ის დაყენების შეცდომა: ელემენტის მუხტი მეტისმეტად მცირეა" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "განახლებების დაყენების შეცდომა: ელემენტის მუხტი მეტისმეტად მცირეა" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "%s-ზე ვერსიის აწევა შეუძლებელია: ინტერნეტთან წვდომა აუცილებელია, მაგრამ " +#~ "ის მიუწვდომელია" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "%s-ზე ვერსიის აწევა შეუძლებელია: ვერსიის აწევის წვდომა არ გაგაჩნიათ" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "%s-ზე ვერსიის აწევა შეუძლებელია: ელემენტის მუხტი მეტისმეტად მცირეა" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "%s-ის წაშლის შეცდომა: ავთენტიკაცია აუცილებელია" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "%s-ის წაშლის შეცდომა: ავთენტიკაცია არასწორი იყო" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "%s-ის წაშლის შეცდომა: პროგრამების წაშლის წვდომა არ გაგაჩნიათ" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "%s-ის წაშლის შეცდომა: საჭიროა დამტენზე მიერთება" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "%s-ის წაშლის შეცდომა: ელემენტის მუხტი მეტისმეტად მცირეა" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "წაშლის შეცდომა: %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "ფაილის დაყენების შეცდომა: მხარდაუჭერელია" + +#~ msgid "Failed to install: not supported" +#~ msgstr "დაყენების შეცდომა: მხარდაუჭერელია" + +#~ msgid "AC power is required" +#~ msgstr "დამტენის მიერთება აუცილებელია" + +#~ msgid "Find Out _More" +#~ msgstr "_გაიგეთ მეტი" + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "როცა შესაძლებელია, პროგრამების განახლებების ფონურ რეჟიმში გადმოწერა და " +#~ "დაყენება" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "_მხოლოდ უფასო აპების ჩვენება" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "მიმდინარეობს განახლების აღწერის ჩატვირთვა. მოითმინეთ…" + +#~ msgid "Can access arbitrary files" +#~ msgstr "შეუძლია ჩვეულებრივ ფაილებთან წვდომა" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "დარწმუნებული ბრძანდებით, რომ გნებავთ, წაშალოთ %s?" + +#~ msgid "Post Review" +#~ msgstr "მიმოხილვის დაწერა" + +#~ msgid "_Post" +#~ msgstr "_დაპოსტვა" + +#~ msgid "No screenshot provided" +#~ msgstr "ეკრანის ანაბეჭდი მოწოდებული არაა" + +#~ msgid "Applications" +#~ msgstr "პროგრამები" + +#~ msgid "_Continue" +#~ msgstr "_გაგრძელება" + +#~ msgid "Rating" +#~ msgstr "შეფასება" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Primary Menu" +#~ msgstr "ძირითადი მენიუს" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "განახლებები" + +#~ msgid "Application Updates" +#~ msgstr "აპლიკაციის განახლებები" + +#~ msgid "Name" +#~ msgstr "სახელი" + +#~ msgid "user" +#~ msgstr "მომხმარებელი" + +#~ msgid "Channel" +#~ msgstr "არხი" + +#~ msgid "Branch" +#~ msgstr "ბრენჩი" + +#~ msgid "URL" +#~ msgstr "ბმული" + +#~ msgid "Installation" +#~ msgstr "ჩადგმა" + +#~ msgid "Version" +#~ msgstr "ვერსია" diff --git a/po/kab.po b/po/kab.po new file mode 100644 index 0000000..a6bd909 --- /dev/null +++ b/po/kab.po @@ -0,0 +1,6276 @@ +# 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. +# ButterflyOfFire , 2024-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: unnamed project\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-16 10:06+0000\n" +"PO-Revision-Date: 2025-03-29 18:14+0100\n" +"Last-Translator: ButterflyOfFire \n" +"Language-Team: Kabyle\n" +"Language: kab\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" +"X-DL-Team: kab\n" +"X-DL-Module: gnome-software\n" +"X-DL-Branch: main\n" +"X-DL-Domain: po\n" +"X-DL-State: Translating\n" +"X-DL-Lang: kab\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Aseɣẓan" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Sbedd sakin leqqem isansen" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Afeggag n talqayt" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Afeggag n ileqman" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Talqayt n lqem" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2768 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Asenfaṛ n GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Akk" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Afaylu adigan" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Akemmus" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Yegguni" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Asebded yegguni" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Tukksa tegguni" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Yesbedday" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Tukksa" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Asider" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "Sebded (_I)" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "Kkes-it (_U)…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Aẓeṭṭa" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Ibenkan" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Igburen n ugdil" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Akaram umager" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Anagraw n yifuyla" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Akaram n isidar" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Iɣewwaṛen" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "" + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Talqayt n lqem" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Iceggiren" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Ur yesɛa ara iceggiren" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Amazray n lqem" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "D amaynut deg lqem %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Lqem %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Anadi ɣef yisnasen" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "ISEM N UFAYLU" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Sken ismenyifen" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Izerfan © 2016–2023 n yimttekkiyen deg useɣẓan n GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +" tasutlelli17 https://launchpad.net/~tafziri13\n" +" ButterflyOfFire" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Teɣzi n usider" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Ulac tisirag" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "D aɣellsan" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Ahat d aɣellsan" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "D araɣellsan s wudem abruyan" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "D araɣellsan" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Aziraz kan" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Iteddu ala ɣef ugdil ameẓẓyan" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Tanarit kan" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Yesra agdil amaḍes" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Yesra anasiw" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Yesra taɣerdayt" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Rzu ɣer usmel web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Sebdd…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Semmet" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Sebdd" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Sider" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Leqqem" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Kkes-it…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Tukksa" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Aɣbalu: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Yettwasbedd" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Mudd afus i usuqel n %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Tisuqilin" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Asmel Web n tsuqilt" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Tuqqna tettwasra" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "Semmet (_C)" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "Qqen (_L)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "Aseqdac (_U)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "Awal n uɛeddi (_P)" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Wayeḍ" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Akk" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Ifaz" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Imaynuten akked wid yettyleqmen" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Iseɣẓanen-nniḍen" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s (yettwasbedd)" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Asnas-nni yewjed i useqdec." + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Ileqqman n unagraw ttwasbedden" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Ales asenker" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Sekker" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Sebded aseɣẓan?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Rmed ikufan n useɣẓan ?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "" + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Talqayt" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "Mdel (_C)" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "Qbel (_A)" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Mačči tura" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Ass-a" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Iḍelli" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d wass aya" +msgstr[1] "%d n wussan aya" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d umalas aya" +msgstr[1] "%d n yimalas aya" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d waggur aya" +msgstr[1] "%d n wagguren aya" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d useggas aya" +msgstr[1] "%d n yiseggasen aya" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Tura kan" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d n tesdidt aya" +msgstr[1] "%d n tesdatin aya" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d usrag aya" +msgstr[1] "%d n yisragen aya" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Akk" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Ifaz" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Tawlaft" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Tasleṭ" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Imeskanen" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Imeɣriyen n uẓawan" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Akk" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Ifaz" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Awitay" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Azadur n isefka" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Tadrimt" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Imaẓragen n uḍris" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Iminigen n web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Akk" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Ifazen" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Tigawt" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Iḥedran" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Takarḍa" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Arrac" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Tameẓla" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Addalen" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Akk" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Ifaz" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Asqerdec" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Akk" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Ifaz" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Tigzi taragmawant" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Tasnallunt" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Takrura" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Tutlayin" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Tusnakt" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Isallen" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Taẓuri" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Tameddurt" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Iseḍsayen" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Tadawsa" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Amazray" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Tasertit" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Addalen" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Akk" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Ifaz" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Ikudaken" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Tisefsiyin" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Iɣbula n unekcum" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Ikemmusen n tutlayt" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Asideg" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Snulfu-d" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Axeddim" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Urar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Senmetti" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Issin" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Taneflit" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Ikudaken" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Tisefsiyin" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Iɣbula n unekcum" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Ikemmusen n tutlayt" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Asideg" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Yiwen n wesnas" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Af-d deg Useɣẓan" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Sken-d ugar" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Sken-d drus" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Tukksa…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Yesra askar akken ad ifak asebded" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Yesra askar akken ad ifak tukksa" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Yessadar-d…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Asewjed…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Itekkes…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "" + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "Ales asekka_r" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "S_ermed…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "Sebded… (_I)" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s ad d-iban s tanglizit tamarikanit" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Asnas-a ad d-iban s tanglizit tamarikanit" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Aseɣẓan-a ad d-iban s tanglizit tamarikanit" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Mudd afus i usuqel (_T)" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Isnasen-nniḍen sɣur %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Asali n telqayt n usnas" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Yettwasenqed" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "Ldi (_O)" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Leqqem (_U)" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Kkes asbeddi" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Izegrar" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "" + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Sfeḍ isefka n usnas" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Kk_es isefka" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Ulac iɣefisefka" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Asmel _web n usenfaṛ" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "Mu_dd tawsa" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Ttekki deg tsuqilt" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "Azen-d ugu_r" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Tallalt (_H)" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "Nnermes-aɣ-d (_C)" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Aru ac_eggir" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Akk iceggiren" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Ur yezmir ad d-yesken talqayt n usnas" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Tuccḍa tarussint" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Tasarutt ur tettwaf ara" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "Uḍfir (_N)" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " akked " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s ur yettwaf ara" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "ɣef usmel Web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "tasemlit" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Sebdd-iten _akk" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Asebter n ikudaken" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Ulac igmad i yettwafen" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Uzwir" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Uḍfir" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Tabdart n isnasen ifazen" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Tallalt n warrum" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Inig" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Inig ɣer usebter n usnirem" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Inig ɣer usebter yettwasbedden" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Inig ɣer usebter n yileqman" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Ldi afeggag n unadi" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Isfuyla" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Ldi ismenyifen" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Ldi ikufan n useɣẓan" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Tallalt" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Ldi inegzumen n unasiw" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Yettwasbedd" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Iteddu" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Isnasen" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Isnasen Web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Isnasen n unagraw" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "Ttekki yid-neɣ (_G)" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Turagt tarussint" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "Issin ugar (_L)" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Turagt tamaẓlayt" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Asmiren n yisefka" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Aɛebbi n usebter" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Aɣbalu arussin" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Biṭa" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Aseqdac" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Imerna" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Ileqman" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "Anef-as (_I)" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "Sermed (_E)" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Yella i unagraw-ik·im n wammud" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Yella i %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Snirem" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Isnasen yellan" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Taggayin-nniḍen" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Arussin" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "IH (_O)" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Imenyafen" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Ileqman n yiseɣẓanen" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Ugar n yisallen" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Awurman" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "S ufus (_M)" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "Leqqem (_U)" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "Kkes-it (_U)" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "Anef-as (_K)" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "Kkes (_D)" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Ad tekkseḍ akufi ?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "Kkes arma_d" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "Kkes (_R)" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Rmed ikufan imaynuten" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "Ugar n telɣut" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "" + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Ikufan n wis tlata n Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "anagraw n wammud" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Ikufan n useɣzan" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Ulac ikufan" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Kkes" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Kreh-aɣ-t" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Yelha" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Ḥemmel-aɣ-t" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Aglam wezzil aṭas" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Aglam wezzil aṭas" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Aru acegger" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "Azen (_S)" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "ɣef 5 n yitran" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Arussin" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "Aneqqis (_R)" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Ad tekkseḍ aceggir?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Aneqqis…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Kkes…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Ulac tisirag" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Iɣewwaṛen n useqdac" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Arussin" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Turagt" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Aɣbalu" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Tuṭṭfa n ugdil tuzwirt" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Tuṭṭfa n ugdil tuḍfirt" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Ur yesɛa ara tuṭṭfiwin n wegdil" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Tuṭṭfa-nni n ugdil ur tettwaf ara" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "D awezɣi uɛebbi n tugna" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Tuṭṭfa n wegdil d tarameɣtutt." + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Tuṭṭfa n ugdil" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Asebter n unadi" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Nadi ɣef isnasen" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Ulac asnas yettwafen" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Aswir n weẓru yenzef" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Ikufan n yi_seɣẓanen" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "Ismenyafen (_P)" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "Inegzumen n unasiw (_K)" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "Ɣef Useɣẓ_an" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Anadi" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Umuɣ agejdan" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Nadi isnasen" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "Snir_em" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "Yettwasbedd (_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Ileqman (_U)" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Uɣal ɣer deffir" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ula yiwen" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Isefka n usnas" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Isefka n useqdac" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Tazarkatut n yisefka" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Arussin" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (yettwasbedd)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (yettusbedday)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (yettuzḍam-d)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (yettekkes-it)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "Talqayt (_D)" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Yettwasebded ass n %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Ileqman yettwasbedden" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s yettwalqam." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Ttxil-k·m, ales asenker n wesnas-nni." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "" + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Deg-s %s, %s akked %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Sken-d talqayt" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Ansuf ɣer %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Cegger" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Anagraw yettwalqem yakan." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Aleqqem-nni yettwasemmet" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Isefqed aneggaru: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Seḥbes" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Asefqed ɣef ileqman" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Senqed _akken yebɣu yili" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Ileqman wejden i usebded" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Ssefqed ɣef ileqman" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Ileqman" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Asebter n yileqman" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Yessalay-d ileqman" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Aya yezmer ad yeṭṭef cwiṭ n wakud" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Yettwaleqqem" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "Senqed akken yebɣu yili (_C)" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Ulac tuqqna" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Iɣewwaṛe_n n uẓeṭṭa" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Tuccḍa" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "Ales asenke_r rnu leqqem…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Leqqem-iten akk (_P)" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Ileqman wejden ad ttwasbedden" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Ileqman n yisnasen" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "Si_der" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Yella %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Yella %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Issin ugar ɣef lqem amaynut" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "" + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Semmet aleqqem" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "Ales asekker sakin leqqem…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Talqayt n tuccḍa" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Nɣel talqayt" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "Yewjed %s" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Activer" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Ileqqman n unagraw" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Asnas Web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Akaram n unagraw %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Akaram n tnarit" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Akaram n yisemliyen" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Akaram n uẓawan" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Akaram n tewlafin" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Akaram n tvidyutin" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Asbeddi n useqdac" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Asbeddi n unagraw" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID n usnas" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Afreɣẓan" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "" + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Ikemmusen" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Anagraw n wammud (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Anagraw" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "" + +#~ msgid "Choose an app:" +#~ msgstr "Fren yiwen n wesnas :" + +#~ msgid "Yes" +#~ msgstr "Ih" + +#~ msgid "No" +#~ msgstr "Uhu" + +#~ msgid "Network Settings" +#~ msgstr "Iɣewwaṛen n uẓeṭṭa" + +#~ msgid "No Network" +#~ msgstr "Ulac azeṭṭa" + +#~| msgid "Network Settings" +#~ msgid "Network _Settings" +#~ msgstr "Iɣewwaṛen n uẓeṭṭa (_S)" + +#~ msgid "GNOME Software" +#~ msgstr "GNOME Software" + +#~ msgid "Select All" +#~ msgstr "Tout sélectionner" + +#~ msgid "Rating" +#~ msgstr "Tazmilt" + +#~ msgid "Name" +#~ msgstr "Isem" + +#~ msgid "Show" +#~ msgstr "Sken" + +#~ msgid "Sort" +#~ msgstr "Asmizzwer" + +#~ msgid "General" +#~ msgstr "Amatu" + +#~ msgid "ALL" +#~ msgstr "AKK" + +#~ msgid "Mature" +#~ msgstr "Amawaḍ" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Arussin" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Werjin" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "Arussin" + +#~ msgid "Low" +#~ msgstr "Faible" + +#~ msgid "Medium" +#~ msgstr "D alemmas" + +#~ msgid "High" +#~ msgstr "Haut" + +#~ msgid "Public domain" +#~ msgstr "Taɣult tazayezt" + +#~ msgid "Channel" +#~ msgstr "Abadu" + +#~ msgid "Category" +#~ msgstr "Catégorie" + +#~ msgid "Free" +#~ msgstr "Ilelli" + +#~ msgid "Welcome" +#~ msgstr "Anṣuf" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Yettwasbedd" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Yettwalqem" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Arussin" + +#~ msgid "History" +#~ msgstr "Amazray" + +#~ msgid "user" +#~ msgstr "aseqdac" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Format" +#~ msgstr "Amasal" + +#~ msgid "More…" +#~ msgstr "Uggar …" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "kra seg yiseɣzan-a sɛan bab ɣef waya sɛan tilas n useqdec, n beṭṭu d " +#~ "unekcum ɣer tengalt taɣbalut." + +#, c-format +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "D tidet tebɣiḍ ad tekkseḍ %s?" + +#~ msgid "_Continue" +#~ msgstr "_Kemmel" + +#~ msgid "Enabled" +#~ msgstr "Yermed" + +#~ msgid "Disabled" +#~ msgstr "Ittwarermed" + +#~ msgid "View" +#~ msgstr "Askan" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Tous" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Yuɣal ɣer sdat" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Tous" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Yuɣal ɣer sdat" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Tous" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Yuɣal ɣer sdat" + +#~ msgid "Developer Tools" +#~ msgstr "Ifecka n uneflay" + +#~ msgid "Games" +#~ msgstr "Uraren" diff --git a/po/kk.po b/po/kk.po new file mode 100644 index 0000000..15e7ca1 --- /dev/null +++ b/po/kk.po @@ -0,0 +1,8201 @@ +# Kazakh translation for gnome-software. +# Copyright (C) 2014 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Baurzhan Muftakhidinov , 2014-2021. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-08-18 22:36+0000\n" +"PO-Revision-Date: 2024-09-01 17:52+0500\n" +"Last-Translator: Baurzhan Muftakhidinov \n" +"Language-Team: Kazakh \n" +"Language: kk\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/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Бағд. қамтама" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Қолданбаларды орнату және жаңарту" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Software қолданбасы сізге жаңа қолданбалар мен жүйелік кеңейтулерді тауып, " +"орнатуды және орнатылған қолданбаларды өшіруді мүмкін қылады." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"БҚ қолданбасы ұсынылатын және әйгілі қолданбаларды көрсетіп отырады, олардың " +"пайдалы сипаттамасы және әрбіреуінің бірнеше скриншоты бар болады. " +"Қолданбаларды санаттар тізімдерін шолу арқылы немесе тікелеі іздеу арқылы " +"табуға болады. Сонымен қатар, бұл қолданба арқылы жүйеңізді желіден тыс " +"жаңартуларымен жаңартуға болады." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Шолу панелі" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Көбірек ақпарат панелі" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Орнатылған панелі" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Жаңартулар панелі" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Жаңарту ақпараты" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2564 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME жобасы" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Appstream файлын жүйелік орналасуға орнату" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Appstream файлы жүйелік орналасуға орнатылуда" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Үйлесімді жобалар тізімі" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"GNOME, KDE және XFCE сияқты көрсетуіміз керек болатын үйлесімді жобалар " +"тізімі." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Жаңартуларды GNOME Software көмегімен басқару керек пе" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Сөндірілген болса, GNOME Software жаңартулар панелін жасырады, және ешбір " +"автожаңарту немесе жүйелік жаңарту әрекеттерін орындамайды." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Жаңартуларды автоматты түрде жүктеп алу және орнату" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Іске қосылған болса, GNOME Software фонда жаңартуларды жүктеп алып, жүйені " +"қайта іске қосуды талап етпейтіндерді өздігінен орнатады." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Фонда жаңартылған БҚ туралы пайдаланушыға хабарлау" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Іске қосылған болса, GNOME БҚ пайдаланушыға ол іссіз болған кезде орын алған " +"жаңартулар туралы хабарлайды." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Өлшенетін байланыста жаңартуларды автоматты түрде жүктеп алу керек пе" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Іске қосылған болса, GNOME Software фонда автожаңартылады, егер өлшенетін " +"байланыста болса да (кейбір метадеректерді алу, жаңартуларды тексеру, т.б., " +"бұл пайдаланушы байланыс үшін төлейтін ақысын арттыруы мүмкін)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "GNOME Software қолданбасының бірінші жөнелтілуі ме" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Қолданбалар қасында рейтингті жұлдызшалар ретінде көрсету" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Еркін емес қолданбалар орнату алдында ескерту сұхбатын көрсетеді" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Еркін емес қолданбалар орнатылған кезде ескерту сұхбатын көрсетілуі мүмкін. " +"Осында ондай сұхбатты басуға болады." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Соңғы рет жаңартуды тексерудің уақыт белгісі" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Соңғы рет жаңарту туралы ескертудің уақыт белгісі" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Соңғы рет жаңарту туралы ескертудің уақыт белгісі" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Жаңартудан кейін тазартылатын қауіпсіздіктің бірінші жаңартуының уақыт " +"белгісі" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Соңғы рет жаңартудың уақыт белгісі" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Қолданбаларға пікірлерді қалдыру үшін қолданылатын сервер" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Шолулар үшін карманың ең төменгі баллы" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"3-ші жақты тарап ретінде қарастырылмауы тиіс ресми репозиторийлер тізімі" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Сөндіруге немесе өшіруге болмайтын міндетті репозиторийлер тізімі" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Еркін бағдарламалық қамтама ретінде қарастырылуы тиіс ресми репозиторийлер " +"тізімі" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "БҚ көздерін баптау сұхбатына қатынауды рұқсат ету" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Шығарылымға дейінгі нұсқаларға дейін жаңартуды ұсынып отыру" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Орнатылған бағдарламалар тізімінде бағдарламалардың орнатылған өлшемін " +"көрсету" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Тегін емес және меншігі бар бағдарламалық қамтаманы түсіндіретін URI" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"AppStream файлдарын барлық пайдаланушылар үшін жүйелік орналасуға орнату. " +"Жалған болса, файлдар стандартты емес $XDG_DATA_HOME/swcatalog/xml бумасына " +"орнатылатын болады" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Соңғы алынған тарихи жаңартулардың уақыт белгісі." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Кіру үшін қолданылған gnome-online-account id сақтайтын мәтіндік жол" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Software AppStream жүйелік орынға орнатқышы" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Командалық жол аргументтерін талдау сәтсіз аяқталды" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Тек бір файл атын көрсету керек" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Бұл бағдарламаны тек әкімші (root) пайдалана алады" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Құрама түрін растау сәтсіз аяқталды: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Жылжыту сәтсіз: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "БҚ орнату" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Таңдалған БҚ-ны жүйеге орнату" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Мультфильмдегі зорлық-зомбылық" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Фэнтези зорлық-зомбылық" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Реалистік зорлық-зомбылық" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Жыныстық зорлық-зомбылық" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Алкоголь" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Алкогольге сілтемелер туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Есірткі" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Заңсыз есірткіге сілтемелер туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Темекі" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Темекі өнімдеріне сілтемелер туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Жалаңаштық" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Қандай да бір жалаңаштық туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Жыныстық тақырыптар" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Сексуалдық сипаттағы сілтемелер немесе бейнелер туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Қарғыс" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Орынсыз әзіл" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Кемсітушілік" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Ешқандай дискриминациялық тіл туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Жарнама" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Қандай да бір жарнама туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Құмар ойындар" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Ешқандай құмар ойын туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Сатып алу" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Ақшаны жарату мүмкіндігі туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Пайдаланушылар арасында чат" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Басқа ойыншылармен чат мүмкіндігі туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Пайдаланушылар арасындағы дыбыстық чат" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Басқа ойыншылармен сөйлесу мүмкіндігі туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Контакт ақпараты" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Әлеуметтік желілердегі аттар немесе эл. пошта адрестермен бөлісу туралы " +"ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Анықтайтын ақпарат" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Пайдаланушы ақпаратын үшінші тараппен бөлісу туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Орналасумен бөлісу" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Басқа пайдаланушылармен физикалық орналасумен бөлісу туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Гомосексуалдылық" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Гомосексуализмге сілтемелер туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Жезөкшелік" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Жезөкшелікке сілтемелер туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Сексуалды кейіпкерлер" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Арандатушылық сілтемелер немесе бейнелер туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Адам қалдықтары" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Көзге көрінетін өлі адам туралы ақпарат жоқ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Құлдық" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Құлдыққа сілтемелерге қатысты ақпарат жоқ" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Есірткіге сілтемелер жоқ" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Жыныс қатынас немесе жалаңаштық жоқ" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Басқарылмайтын чат мүмкіндігі жоқ" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Зорлық-зомбылығы жоқ" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Есірткі" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Қатаң тіл" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Ақша" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Әлеуметтік" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Зорлық-зомбылық" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Барлығы" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s барлығына жарамды" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s сәбилерге жарамды" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s кішкентай балаларға жарамды" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s балаларға жарамды" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s жасөспiрiмдерге жарамды" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s ересектерге жарамды" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s %s үшін жарамды" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Жас бойынша рейтингі" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:126 +msgid "_How to contribute missing information" +msgstr "Жетіспейтін ақпаратты қ_осу тәртібі" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "Жергілікті файл" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "Десте" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Кезекте" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:407 +msgid "Pending install" +msgstr "Орнату кезекте тұр" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:414 +msgid "Pending remove" +msgstr "Өшіріруде кезекте" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:395 +msgid "Installing" +msgstr "Орнатылуда" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Өшірілуде" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:400 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Жүктеп алуда" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:307 src/gs-details-page.c:1060 +#: src/gs-details-page.c:1095 src/gs-details-page.ui:243 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "Ор_нату" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1180 +msgid "_Uninstall…" +msgstr "Ө_шіру…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Желі" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Желік арқылы байланыса алады" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Жүйелік қызметтер" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Жүйелік шинада D-Bus қызметтеріне қатынай алады" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Сессия қызметтері" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Сессиялық шинада D-Bus қызметтеріне қатынай алады" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Құрылғылар" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Веб-камералар сияқты құрылғыларға қатынай алады" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Енгізу құрылғыларға қол жеткізе алады" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Микрофондарға қол жеткізе алады" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Жүйелік құрылғылар файлдарына қатынай алады" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Экран мазмұны" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Экран мазмұнына қол жеткізе алады" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Үй бумасы" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Файлдарды қарау, түзету және жасау құқығы бар" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Файлдарды қарай алады" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Файлдық жүйе" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Жүктемелер бумасы" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Баптаулар" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Кез келген параметрлерді көре және өзгерте алады" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Баяғы дисплей жүйесі" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Ескі, қауіпсіз емес дисплей жүйесін пайдаланады" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Құмсалғыштан шығып кету" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Құмсалғыштан қашып, кез келген басқа шектеулерді айналып өте алады" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Жаңартудың сипаттамасы жоқ." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Жаңарту ақпараты" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Қосымша рұқсаттарды талап етеді" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Пікірлер" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "Бұл қолданба үшін пікірлер табылмады." + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "Пікірлер жоқ" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "Нұсқа тарихы" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Нұсқа %s жаңалықтары" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Нұсқа %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Бұл шығарылым үшін ақпараты жоқ" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Іске қосылу режимі келесіден біреу: ‘updates’, ‘updated’, ‘installed’ не " +"‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "РЕЖИМІ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Қолданбаларды іздеу" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ІЗДЕУ" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Қолданба ақпаратын көрсету (қолданба ID-ін қолданып)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Қолданба ақпаратын көрсету (десте атын қолданып)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "ДЕСТЕ_АТЫ" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Қолданбаны орнату (қолданба ID-ін қолданып)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Қолданбаны өшіру (қолданба ID-ін қолданып)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Жергілікті десте файлын ашу" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "ФАЙЛ_АТЫ" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Бұл әрекет үшін күтілетін өзара іс-қимыл түрі: \"none\", \"notify\" немесе " +"\"full\"" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ӘРЕКЕТТЕСУ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Жергілікті метаақпаратты немесе appdata файлын көрсету" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Кезекте тұрған әрбір жаңартуды фонда орнату" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Баптауларды көрсету" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Орындалып тұрған нұсқаның жұмысын аяқтау" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "AppStream орнына жергілікті файлдағы қайнар көздерін қалау" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Нұсқа ақпаратын шығару" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 GNOME Software үлесін қосушылар" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Baurzhan Muftakhidinov " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Кешіріңіз! Бұл қолданба үшін ақпараты жоқ." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Орнатылған өлшемі" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Соның ішінде деректер %s және кэш %s" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Соның ішінде деректер %s" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Соның ішінде кэш %s" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Кэш және деректерді пайдалану белгісіз" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Жүктеп алынатын өлшемі" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Қосымша жүйе жүктеулері қажет емес" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Қосымша жүйе жүктеулерінің белгісіз өлшемі қажет" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Қосымша жүйе жүктеулерінің %s қажет" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Өлшемі белгісіз" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Рұқсаттар жоқ" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Желіге қатынау құқығы бар" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Жүйелік қызметтерді пайдаланады" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Пайдаланушы сессия қызметтері" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Аппараттық құрылғыларға қатынай алады" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Жүйелік файлдарына қатынай алады" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Барлық деректеріңізді оқи/жаза алады" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Барлық деректеріңізді оқи алады" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Жүктемелеріңізді оқи/жаза алады" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Жүктемелеріңізді оқи алады" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Кейбір файлдарға қатынай алады" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Пайдаланушы баптауларына қатынай және өзгерте алады" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Ескі терезелер жүйесін пайдаланады" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Еркін рұқсаттарды ала алады" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Бағдарламалық қамтама әзірлеуші тексерілді" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "ОЖ таратушысы тексерген" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "%s тексерген" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Үшінші тарап ұсынған" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Бағдарламалық қамтамаға енді қолдау жоқ" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Тексерілетін код" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Белгісіз лицензия" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Проприетарлы код" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Арнайы лицензия" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Привилегияланған" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Қауіпсіз" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Қауіпсіз сияқты" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Ықтимал қауіпсіз" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Қауіпсіз емес" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Тек мобильді" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Тек кішкентай экранда жұмыс істейді" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Тек жұмыс үстелі" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Тек үлкен экранда жұмыс істейді" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Экран өлшемінің сәйкес келмеуі" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Ағымдағы экран өлшеміңізді қолдамайды" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Сенсорлы экран қажет" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Пернетақтаны қажет етеді" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Тышқанды қажет етеді" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Джойстик керек" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Ойнау үшін джойстик керек" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Адаптивті" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Телефондар, планшеттер және жұмыс үстелдерінде жұмыс істейді" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Пернетақта немесе тышқанды қажет етуі мүмкін" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Жұмыс үстелдер мен ноутбуктерде жұмыс істейді" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Жасына сәйкес келмейтін мазмұн жоқ" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Жас рейтингі туралы ақпарат жоқ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Веб-сайтын шолу" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Орнату…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Бас тарту" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Орнату" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Жүктеп алу" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Жаңарту" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Өшіру…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Өшірілуде" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 +#: src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "Критикалық жаңарту" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Құрылғыны жаңарту кезінде қолдану мүмкін емес." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Қайнар көзі: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "Бұрынғы %s атынан аты ауыстырылды" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +msgid "Stopped Receiving Updates" +msgstr "Жаңартуларды алу тоқтатылды" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Критикалық жаңарту" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Орнатылған" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "%s аударуға көмектесу" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Аудармалар" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Аудармалар веб-сайты" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "Жүйеге кіру қажет" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:300 src/gs-common.c:752 +#: src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-page.c:708 +#: src/gs-removal-dialog.ui:24 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:251 src/gs-review-dialog.ui:24 src/gs-review-row.c:239 +#: src/gs-review-row.c:263 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "Ба_с тарту" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "_Логин" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Пайдаланушы" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "Пароль" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Басқа" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Барлығы" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Ұсынылатын" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Редактор таңдауы" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Жаңа және жаңартылған" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Интернеттен таңдалғандар" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Басқа бағд. қамтама" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s орнатылды" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Өзгерістер іске асуы үшін жүйені қайта қосу керек" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Қолданба қолданылуға дайын" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Жүйелік жаңартулар орнатылды" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Жуырда орнатылған жаңартулар бағалау үшін қолжетімді" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:915 +msgid "Restart" +msgstr "Қайта қосу" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Жөнелту" + +#. TRANSLATORS: window title +#: src/gs-common.c:234 +msgid "Install Software?" +msgstr "БҚ орнату керек пе?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Install Third-Party Software?" +msgstr "Үшінші жақты БҚ орнату керек пе?" + +#. TRANSLATORS: window title +#: src/gs-common.c:240 +msgid "Enable Software Repository?" +msgstr "БҚ көзін іске қосу керек пе?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:242 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Үшінші жақты БҚ көзін іске қосу керек пе?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:254 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s еркін және ашық БҚ емес болып табылады, және оны “%s” " +"ұсынады." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:264 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s дестесін “%s” ұсынады." + +#: src/gs-common.c:273 +msgid "This software repository must be enabled to continue installation." +msgstr "Орнатуды жалғастыру үшін бұл БҚ көзі іске қосылған болуы тиіс." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:283 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "%s кейбір елдерде орнату немесе қолдану заңсыз болуы мүмкін." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:289 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Бұл кодекті кейбір елдерде орнату немесе қолдану заңсыз болуы мүмкін." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:303 +msgid "Don’t _Warn Again" +msgstr "Келесіде ескерт_пеу" + +#. TRANSLATORS: button text +#: src/gs-common.c:312 +msgid "Enable and _Install" +msgstr "Іске қосу және _орнату" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:519 +msgid "Detailed errors from the package manager follow:" +msgstr "Дестелер басқарушысы ұсынған толығырақ ақпараты бар қателер:" + +#: src/gs-common.c:526 src/gs-common.c:663 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Ақпараты" + +#. TRANSLATORS: button text +#: src/gs-common.c:575 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "Жа_бу" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:744 +msgid "_Accept" +msgstr "Қ_абылдау" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:890 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Жаңартулар орнатылды" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:900 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Қолданба(лар) өшірілді" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:906 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Ол(ар) іске асуы үшін жүйені қайта іске қосу керек" + +#. TRANSLATORS: button text +#: src/gs-common.c:913 +msgid "Not Now" +msgstr "Қазір емес" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1009 +msgid "Just now" +msgstr "Жаңа ғана" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d минут бұрын" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d сағат бұрын" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d күн бұрын" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d апта бұрын" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d ай бұрын" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d жыл бұрын" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1394 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Барлығы" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Ұсынылатын" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D графикасы" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Фотография" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Сканерлеу" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Векторлық графика" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Қарау қолданбалары" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Аудионы жасау және түзету" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Музыкалық плеерлер" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Барлығы" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Ұсынылатын" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Күнтізбе" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Дерекқор" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Қаржы" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Мәтіндік процессор" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Мәтін түзетушілері" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Веб браузерлері" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Барлығы" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Ұсынылатын" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Әрекет" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Саяхат" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Аркадалар" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Блоктар" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Тақталы" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Карта ойындары" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Эмуляторлар" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Балалар үшін" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Логикалық" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Рольмен ойнау" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Спорт" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Стратегиялық" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Барлығы" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Ұсынылатын" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Чат" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Барлығы" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Ұсынылатын" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Жасанды интеллект" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Астрономия" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Химия" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Тілдер" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Математика" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Жаңалықтар" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Робототехника" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Өнер" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Өмірбаян" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Комикстер" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Фантастика" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Деңсаулық" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Тарих" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Өмір стилі" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Саясат" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Спорт" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Барлығы" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Ұсынылатын" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Жөндеушілер" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Өндіру орталары" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Кодектер" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Құрылғылық драйверлер" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Қаріптер" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Кіріс қайнар көздері" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Тілдік дестелер" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Локализация" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Жасау" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Жұмыс" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Ойнау" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Әлеуметтендіру" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Үйрену" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Өндіру" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Кодектер" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Құрылғылық драйверлер" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Қаріптер" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Кіріс қайнар көздері" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Тілдік дестелер" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Локализация" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Қолданба" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s қосымша файл пішімдерін қолдауды талап етеді." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Қосымша MIME түрлері керек" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s қосымша қаріптерді талап етеді." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Қосымша қаріптер керек" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s қосымша мультимедиа кодектерін талап етеді." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Қосымша мультимедиа кодектері керек" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s қосымша принтер драйверлерін талап етеді." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Қосымша принтер драйверлері керек" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s қосымша дестелерді талап етеді." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Қосымша дестелер керек" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Software ішінен табу" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "_Көбірек көрсету" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Азырақ көр_сету" + +#: src/gs-details-page.c:390 +msgid "Removing…" +msgstr "Өшірілуде…" + +#: src/gs-details-page.c:405 +msgid "Requires restart to finish install" +msgstr "Орнатуды аяқтау үшін қайта іске қосу қажет" + +#: src/gs-details-page.c:412 +msgid "Requires restart to finish remove" +msgstr "Өшіруді аяқтау үшін қайта іске қосу қажет" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:428 +msgid "Pending installation…" +msgstr "Орнату кезекте тұр…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:434 +msgid "Pending update…" +msgstr "Жаңарту кезекте…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:449 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Жүктеп алынуда…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:452 +msgid "Preparing…" +msgstr "Дайындау…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:455 +msgid "Uninstalling…" +msgstr "Өшірілуде…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:582 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s орнатылмаған, бірақ сонда да оның деректері бар болып тұр." + +#: src/gs-details-page.c:1077 src/gs-toast.c:65 +msgid "_Restart" +msgstr "Қа_йта қосу" + +#: src/gs-details-page.c:1083 +msgid "_Enable…" +msgstr "Іск_е қосу…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1109 +msgid "_Install…" +msgstr "Ор_нату…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1325 +#, c-format +msgid "%s will appear in US English" +msgstr "%s АҚШ ағылшын тілінде көрсетіледі" + +#: src/gs-details-page.c:1333 +msgid "This app will appear in US English" +msgstr "Бұл қолданба АҚШ ағылшын тілінде көрсетіледі" + +#: src/gs-details-page.c:1335 +msgid "This software will appear in US English" +msgstr "Бұл бағдарламалық қамтама АҚШ ағылшын тілінде көрсетіледі" + +#: src/gs-details-page.c:1370 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "_Аударуға көмектесу" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1435 +#, c-format +msgid "Other Apps by %s" +msgstr "%s ұсынған басқа қолданбалар" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1471 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1474 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1837 +msgid "You need internet access to write a review" +msgstr "Пікірді қалдыру үшін интернетпен байланыс керек" + +#: src/gs-details-page.c:1938 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" + +#: src/gs-details-page.c:1939 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Бұл қолданба сіздің дистрибутивіңізбен ұсынылып тұр, оны алмастырмау керек." + +#: src/gs-details-page.c:1940 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Бұл қолданба веб-сайтқа, код қоймасына немесе шығарылым трекеріне ешқандай " +"сілтемені ұсынбайды." + +#: src/gs-details-page.c:1942 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" + +#: src/gs-details-page.c:1943 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "Бұл БҚ сіздің дистрибутивіңізбен ұсынылып тұр, оны алмастырмау керек." + +#: src/gs-details-page.c:1944 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Бұл бағдарламалық қамтама веб-сайтқа, код қоймасына немесе шығарылым " +"трекеріне ешқандай сілтемені ұсынбайды." + +#: src/gs-details-page.c:2034 src/gs-details-page.c:2051 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" + +#: src/gs-details-page.c:2406 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "\"%s\" үшін пікірді қалдыру сәтсіз аяқталды: \"%s\"" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Көбірек ақпарат парағы" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Қолданба ақпараты жүктелуде" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Тексерілді" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Ашу" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Жаңар_ту" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Өшіру" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "Қосымшалар" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Бұл қолданбаны тек Интернетпен белсенді байланыс болған кезде ғана қолдануға " +"болады." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "БҚ қайнар көзі қоса берілді" + +#: src/gs-details-page.ui:679 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Бұл қолданбада жаңартуларды және басқа да БҚ-қа қатынауды ұсынатын БҚ " +"репозиторийі бар." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Ешбір БҚ қайнар көзі қоса берілмеді" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Бұл қолданбада БҚ репозиторийі жоқ. Ол жаңа нұсқаларға жаңартылмайтын болады." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "БҚ қайнар көзі анықталды" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Бұл БҚ репозиторийін қосу сізге қосымша БҚ және жаңартуларға қол жеткізеді." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Тек сенімді БҚ қайнар көздерін қолданыңыз." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Қолданба деректерін тазарту" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "Деректерді ө_шіру" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Метадеректер жоқ" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "Жобаның _веб-сайты" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "Ақ_шалай көмектесу" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "_Аудармалармен үлес қосу" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "Мәселені хаба_рлау" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "_Көмек" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "Байланы_су" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "Пі_кір қалдыру" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Барлық пікірлер" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "Қолданба ақпаратын көрсету мүмкін емес" + +#: src/gs-dkms-dialog.c:67 +msgid "Failed to prepare reboot" +msgstr "Қайта іске қосуды дайындау сәтсіз аяқталды" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "Белгісіз қате" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "Кілт табылмады" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +#| msgid "Mouse Required" +msgid "MOK Enrollment Required" +msgstr "" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Келесі" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" + +#: src/gs-dkms-dialog.ui:83 +#| msgid "I have forgotten my password" +msgid "I have made a note of the MOK _password" +msgstr "" + +#: src/gs-dkms-dialog.ui:128 +#| msgid "_Restart Now…" +msgid "_Restart & Enroll…" +msgstr "" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" + +#: src/gs-dkms-dialog.ui:211 +#| msgid "Search for applications" +msgid "Security Implications" +msgstr "" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Қосымша метадеректер файлдарын жүктеп алу…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " және " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s жазуы үшін қолжетерлік қаріптер" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s үшін қолжетерлік БҚ" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Сұралған БҚ табылмады" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Сұралған БҚ табу сәтсіз аяқталды" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "%s табылмады" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "вебсайттан" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "%s файлын ұсынатын бірде-бір қолданба жоқ." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"%s туралы ақпаратты және жетіспейтін қолданбаларды орнату жолы жөнінде %s " +"білуге болады." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s қолдауы үшін бірде-бір қолданба жоқ." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "%s қолжетерсіз." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"%s туралы ақпаратты және бұл пішімді қолдай алатын қолданбаны орнату жолы " +"жөнінде %s білуге болады." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s жазудың қолдауы үшін бірде-бір қаріп жоқ." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"%s туралы ақпаратты және қосымша қаріптерді орнату жолы жөнінде %s білуге " +"болады." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s пішімі үшін бірде-бір аддон кодектері жоқ." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"%s туралы ақпаратты және бұл пішімді ойната алатын кодекті орнату жолы " +"жөнінде %s білуге болады." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s қолдауы үшін бірде-бір Plasma ресурсы жоқ." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"%s туралы ақпаратты және қосымша Plasma ресурстарын орнату жолы жөнінде %s " +"білуге болады." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s үшін принтер драйверлері жоқ." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"%s туралы ақпаратты және бұл принтерді қолдайтын драйверді орнату жолы " +"жөнінде %s білуге болады." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "құжаттама" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "%s сұраған %s табу мүмкін емес. Көбірек білу үшін, %s қараңыз." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "Сіз іздеген %s табу мүмкін емес. Көбірек білу үшін, %s қараңыз." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Іздеу нәтижелері табылмады: %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "%s файл пішімі" + +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "Барлығын ор_нату" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "Сұралған БҚ табу мүмкін емес" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Кодектер беті" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "Нәтижелер табылмады" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Алдыңғы" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Келесі" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Ұсынылатын қолданбалар тізімі" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Жұмыс үстел қолдауы" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Үлкен экранда қолданылатынын қолдайды" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Жұмыс үстеліне қолдау көрсету белгісіз" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Үлкен экрандарға қолдау көрсетіліп жатқанын білу үшін ақпарат жеткіліксіз" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Үлкен экранды қажет етеді" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Жұмыс үстеліне қолдау әлі көрсетілмейді" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Үлкен экранда пайдалану мүмкін емес" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Мобильді қолдауы" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Кішкентай экранда қолданылатынын қолдайды" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Мобильді қолдау белгісіз" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Кішкентай экрандарға қолдау көрсетіліп жатқанын білу үшін ақпарат жеткіліксіз" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Кішкентай экранды қажет етеді" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Мобильді қолдау жоқ" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Кішкентай экранда пайдалану мүмкін емес" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Пернетақта қолдауы" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Пернетақтаны қолдау белгісіз" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Пернетақталарға қолдау көрсетілгенін білу үшін ақпарат жеткіліксіз" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Пернетақта керек" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Пернетақталарды қолдайды" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Пернетақтаға қолдау жоқ" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Пернетақтамен пайдалану мүмкін емес" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Тышқан қолдауы" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Тышқан немесе нұсқағыш құрылғыны қажет етеді" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Тышқанды қолдау белгісіз" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Тышқан немесе көрсету құрылғыларының қолдауы бар-жоқ екенін білу үшін " +"ақпарат жеткіліксіз" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Тышқан керек" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Тышқандар мен көрсету құрылғыларын қолдайды" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Тышқанға қолдау жоқ" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Тышқан немесе нұсқағыш құрылғыны пайдалану мүмкін емес" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Сенсорлы экран қолдауы" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Сенсорлы экран қолдауы белгісіз" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Сенсорлы экрандардың қолдауы бар-жоғын білу үшін ақпарат жеткіліксіз" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Сенсорлы экран керек" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Сенсорлы экрандарды қолдайды" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Сенсорлы экрандарға қолдау жоқ" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Сенсорлы экранмен пайдалану мүмкін емес" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Джойстик керек" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Ойнау үшін джойстик керек" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Джойстик қолдауы" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Джойстиктерді қолдайды" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s осы құрылғыда жұмыс істейтін сияқты" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s осы құрылғыда жұмыс істейді" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s осы құрылғыда жұмыс істеуі мүмкін" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s бұл құрылғыда дұрыс жұмыс істемейді" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s бұл құрылғыда жұмыс істемейді" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Құрылғылық қолдау" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Навигация" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Шолу бетіне өту" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Орнатылған бетіне өту" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Жаңартулар бетіне өту" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Windows" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Баптауларды ашу" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Көмек" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Орнатылған" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Орнатылған парағы" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "Орындалуда" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Қолданбалар" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "Веб-қолданбалары" + +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "Жүйелік қолданбалар" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Қауымдастық құрастырған" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "Қа_тысу" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Белгісіз лицензия" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "Көбірек бі_лу" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Бұл қолданба қай лицензия аясында әзірленгенін көрсетпейді, және де " +"проприетарлы болуы мүмкін. Ол анықтауға қиын болатын жолдармен қауіпсіз емес " +"болуы мүмкін және ол бақылаусыз өзгеруі мүмкін.\n" +"\n" +"Сіз бұл қолданбаға үлес қоса алмауыңыз мүмкін." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Бұл бағдарламалық қамтама қай лицензия аясында әзірленгенін көрсетпейді, " +"және де проприетарлы болуы мүмкін. Ол анықтауға қиын болатын жолдармен " +"қауіпсіз емес болуы мүмкін және ол бақылаусыз өзгеруі мүмкін.\n" +"\n" +"Сіз бұл бағдарламалық қамтамаға үлес қоса алмауыңыз мүмкін." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Проприетарлы" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Бұл қолданба ашық түрде әзірленбеген, сондықтан оның қалай жұмыс істейтінін " +"оның әзірлеушілері ғана біледі. Ол анықтауға қиын болатын жолдармен қауіпсіз " +"емес болуы мүмкін және ол бақылаусыз өзгеруі мүмкін.\n" +"\n" +"Сіз бұл қолданбаға үлес қоса алмауыңыз мүмкін." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Бұл бағдарламалық қамтама ашық түрде әзірленбеген, сондықтан оның қалай " +"жұмыс істейтінін оның әзірлеушілері ғана біледі. Ол анықтауға қиын болатын " +"жолдармен қауіпсіз емес болуы мүмкін және ол бақылаусыз өзгеруі мүмкін.\n" +"\n" +"Сіз бұл бағдарламалық қамтамаға үлес қоса алмауыңыз мүмкін." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Арнайы лицензия" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Бұл бағдарламалық қамтама арнайы %s лицензиясы аясында " +"әзірленген.\n" +"\n" +"Сіз бұл бағдарламалық қамтамаға үлес қосуыңыз де, қоса алмауыңыз да мүмкін." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:56 +msgid "Refreshing Data" +msgstr "" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Бетті жүктеу" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Іске қосылу" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Белгісіз қайнар көзі" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Бета" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Қосылатындар" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Өшірілетіндер" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Жаңартулар" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Нұсқасы төмендетілетіндер" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "таңдалған сыртқы дереккөздер" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Үшінші жақты БҚ көздерін іске қосу керек пе?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "Еле_меу" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "Іск_е қосу" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "Сіздің операциялық жүйеңіз үшін қолжетімді" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "%s үшін қолжетімді" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Шолу" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Шолу парағы" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Қолжетімді қолданбалар" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Басқа санаттар" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Қолданба деректері табылмады" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Белгісіз" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_ОК" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Пайдаланушы орнатудан бас тартты" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s дайындау" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "%s репозиторийін өшіруді шынымен қалайсыз ба?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"%s ішінен барлық қолданбалар өшіріледі, және оларды қолданғыңыз келсе, сізге " +"бұл репозиторийді қайтадан орнату керек болады." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 +#: src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "%s өшіру керек пе?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Өшіруден кейін %s қолдану мүмкін болмайды." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, c-format +#| msgid "It will not be possible to use %s after removal." +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, c-format +#| msgid "It will not be possible to use %s after removal." +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, c-format +#| msgid "It will not be possible to use %s after removal." +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "Қолданба баптаулары мен деректері" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:667 +msgid "_Keep" +msgstr "Қа_лдыру" + +#: src/gs-page.c:673 +msgid "Allows restoring app settings and content" +msgstr "" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:682 +msgid "_Delete" +msgstr "Ө_шіру" + +#: src/gs-page.c:688 +msgid "Permanently deletes data to save disk space" +msgstr "Дискідегі орынды сақтау үшін деректерді толығымен өшіреді" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:696 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:710 +msgid "_Uninstall" +msgstr "Ө_шіру" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Баптаулар" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Бағд. қамтама жаңартулары" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "Көбірек ақпарат" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Автоматты түрде" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Автоматты жаңарту е_скертулері" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Мазмұн сүзгілері" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Үйлесімсіз БҚ" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Жаңарту" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Репозиторийді сөндіру керек пе?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Репозиторийді өшіру керек пе?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "Сөн_діру" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:266 +msgid "_Remove" +msgstr "Ө_шіру" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Жаңа репозиторийлерді іске қосу" + +#: src/gs-repos-dialog.c:612 +msgid "Turn on new repositories when they are added" +msgstr "Жаңа репозиторийлер қосылған кезде оларды іске қосу" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "қосымша ақпарат" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Таңдалған үшінші жақты ұсынушыларынан қосымша БҚ репозиторийлер — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Үшінші жақты Fedora репозиторийлері" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "операциялық жүйе" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "БҚ қайнар көздері" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "Репозиторийлер жоқ" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u қолданба орнатылды" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u қосымша орнатылды" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u қолданба" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u қосымша" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s және %s орнатылды" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Орнатылған БҚ тексеру…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Өшіру" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Жек көремін" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Ұнатпаймын" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "Жарайды" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Ұнатамын" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Тамаша" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Рейтингті қалдыру үшін жұлдызшаны таңдаңыз" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Пікірді жазу үшін көбірек уақыт жұмсаңыз" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Жұлдызшалы рейтингті таңдаңыз" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Қорытындысы тым қысқа" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Қорытындысы тым ұзын" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "Сипаттамасы тым қысқа" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "Сипаттамасы тым ұзын" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Пікір қалдыру" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Жіберу" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Пікір қорытындысы" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "Қысқа пікірді қалдыру" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u пікір" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "5 жұлдыздың ішінен" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Белгісіз" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:227 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Әдепсіз, дөрекілік немесе кемсітушілік пікірлер туралы хабарлауға болады." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:232 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "Хабарланғаннан кейін пікір әкімші тексергенге дейін жасырылған болады." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:237 +msgid "Report Review?" +msgstr "Пікірге шағым жазу керек пе?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:242 +msgid "_Report" +msgstr "Шағым жібе_ру" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:258 +msgid "Remove Review?" +msgstr "Пікірді өшіру керек пе?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:261 +msgid "Removing a review cannot be undone." +msgstr "" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Пікірді ұнату" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Пікірден ұнатуды алып тастау" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Шағым жіберу…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Өшіру…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Рұқсаттар жоқ" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Қолданба толығымен құмсалғышта жасайды" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Желіге қатынау" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Интернетке қатынай алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Желіге қатынау жоқ" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Интернетке қатынай алмайды" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Жүйелік қызметтерді пайдаланады" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Жүйелік қызметтерден деректерді сұрай алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Пайдаланушы сессия қызметтері" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Сеанс қызметтерінен деректерді сұрай алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Пайдаланушы құрылғыларына қатынау" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Веб-камера немесе ойын контроллері сияқты құрылғыларға қатынай алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Пайдаланушы құрылғыларына қатынау мүмкіндік жоқ" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Веб-камера немесе ойын контроллері сияқты құрылғыларға қатынай алмайды" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Микрофонға қатынау" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Жүйелік құрылғыларға қатынау" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Бұрыңғы терезелер жүйесі" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Еркін рұқсаттар" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Пайдаланушы баптаулары" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Файлдық жүйесіне толық оқу/жазу рұқсаты" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Файл жүйесінде барлық деректерді оқи және жаза алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Үй бумасына оқу/жазу рұқсаты" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Үй бумаңызда барлық деректерді оқи және жаза алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Файлдық жүйесіне толық оқу рұқсаты" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Файл жүйесінде барлық деректерді оқи алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Үй бумасына оқу рұқсаты" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Үй бумаңызда барлық деректерді оқи алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Жүктемелер бумасына оқу/жазу рұқсаты" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Жүктемелер бумаңызда барлық деректерді оқи және жаза алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Жүктемелер бумасына оқу рұқсаты" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Жүктемелер бумаңызда барлық деректерді оқи алады" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Бумадағы барлық деректерді оқи және жаза алады" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Бумадағы барлық деректерді оқи алады" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Файл жүйесіне қатынау жоқ" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Файл жүйесіне мүлдем қатынай алмайды" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Бағдарламаны әзірлеуші тексерілді" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Осы бағдарламаны әзірлеуші олардың кім екеніне тексерілді" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Қауіпсіз емес тәуелділіктер" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Проприетарлы код" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Бастапқы код ашық емес, сондықтан оны өз бетінше тексеру мүмкін емес және " +"қауіпсіз емес болуы мүмкін" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Тексерілетін код" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Бастапқы код ашық болып табылады және тәуелсіз аудиттен өтуі мүмкін, бұл " +"қолданбаның қауіпсіз болуына көбірек мүмкін етеді" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s привилегияланған" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s қауіпсіз" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s қауiпсiз сияқты" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s қауiпсiз емес болуы мүмкін" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s қауiпсiз еме" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Белгісіз" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Қауіпсіздік" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Лицензиясы" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "Қайнар көзі" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Алдыңғы скриншот" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Келесі скриншот" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Скриншоттар жоқ" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Скриншот табылмады" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Бейнені жүктеу сәтсіз аяқталды" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Скриншот өлшемі табылмады" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Кэшті жасау мүмкін емес" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Скриншот жарамсыз" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Скриншот қолжетерсіз" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Скриншот" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "тағы %u сәйкестік" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Іздеу парағы" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Қолданбаларды іздеу" + +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "Қолданбалар табылмады" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "\"%s\"" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Жаңартуларды жүктеп алу сәтсіз аяқталды" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "%s адресінен екілік кодтар жаңартуларын жүктеп алу мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "%s адресінен жаңартуларды жүктеп алу мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "Жаңарту мүмкін емес: интернетпен байланыс керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "Жаңарту мүмкін емес: диск орны жеткіліксіз" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "%s адресінен жаңартуларды жүктеп алу мүмкін емес: диск орны жетпейді" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "Жаңарту мүмкін емес: аутентификация керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "Жаңарту мүмкін емес: аутентификация жарамсыз" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "Жаңарту мүмкін емес: рұқсат керек" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Жаңартуларды жүктеп алу мүмкін емес: сізде БҚ орнатуға рұқсаттар жоқ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Жаңартулар тізімін алу мүмкін емес" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "Орнату мүмкін емес: жүктеп алу сәтсіз аяқталды" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s орнату мүмкін емес: %s адресінен жүктеп алу сәтсіз аяқталды" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s орнату мүмкін емес: жүктеп алу сәтсіз аяқталды" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "Орнату мүмкін емес: орындалу ортасы жоқ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s орнату мүмкін емес: %s орындалу ортасы қолжетімді емес" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "%s орнату мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "Орнату мүмкін емес: интернетпен байланыс керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "Орнату мүмкін емес: қолданба пішімі жарамсыз" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "Орнату мүмкін емес: диск орны жеткіліксіз" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s орнату мүмкін емес: диск орны жеткіліксіз" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "Орнату мүмкін емес: аутентификация керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s орнату мүмкін емес: аутентификация керек" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "Орнату мүмкін емес: аутентификация жарамсыз" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s орнату мүмкін емес: аутентификация жарамсыз" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "Орнату мүмкін емес: рұқсат керек" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s орнату мүмкін емес: рұқсат керек" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "Орнату мүмкін емес: құрылғы эл. желісіне жалғануы керек" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s орнату мүмкін емес: құрылғы эл. желісіне жалғануы керек" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "Орнату мүмкін емес: батарея заряды төмен" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s орнату мүмкін емес: батарея заряды төмен" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%s %s адресінен жаңарту мүмкін емес: жүктеп алу сәтсіз аяқталды" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s жаңарту мүмкін емес: жүктеп алу сәтсіз аяқталды" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Жаңартуларды %s адресінен орнату мүмкін емес: жүктеп алу сәтсіз аяқталды" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "Жаңарту мүмкін емес: жүктеп алу сәтсіз аяқталды" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s жаңарту мүмкін емес: диск орны жеткіліксіз" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s жаңарту мүмкін емес: аутентификация керек" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s жаңарту мүмкін емес: аутентификация жарамсыз" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s жаңарту мүмкін емес: рұқсат керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "Жаңарту мүмкін емес: құрылғы эл. желісіне жалғануы керек" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s жаңарту мүмкін емес: құрылғы эл. желісіне жалғануы керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "Жаңарту мүмкін емес: батарея заряды төмен" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s жаңарту мүмкін емес: батарея заряды төмен" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "%s жаңарту мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "Жаңарту мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Жаңарту мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%s дейін %s өнімін жаңарту мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, c-format +#| msgid "Unable to update %s from %s as download failed" +msgid "Unable to upgrade to %s: download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, c-format +#| msgid "" +#| "Unable to upgrade to %s: internet access was required but wasn’t available" +msgid "Unable to upgrade to %s: internet access required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, c-format +#| msgid "Unable to download updates from %s: not enough disk space" +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, c-format +#| msgid "Unable to purchase %s: authentication was required" +msgid "Unable to upgrade to %s: authentication required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, c-format +#| msgid "Unable to purchase %s: authentication was invalid" +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, c-format +#| msgid "Unable to remove %s: AC power is required" +msgid "Unable to upgrade to %s: permission required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, c-format +#| msgid "Unable to install: device must be plugged in" +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, c-format +#| msgid "Unable to upgrade to %s from %s" +msgid "Unable to upgrade to %s: low battery" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, c-format +#| msgid "Unable to upgrade to %s from %s" +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "Өшіру мүмкін емес: аутентификация керек" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s өшіру мүмкін емес: аутентификация керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +msgid "Unable to uninstall: invalid authentication" +msgstr "Өшіру мүмкін емес: аутентификация жарамсыз" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s өшіру мүмкін емес: аутентификация жарамсыз" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "Өшіру мүмкін емес: рұқсат керек" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s өшіру мүмкін емес: рұқсат керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Өшіру мүмкін емес: құрылғы электр қуат көзіне қосылған болуы тиіс" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s өшіру мүмкін емес: құрылғы эл. желісіне жалғануы керек" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "Өшіру мүмкін емес: батарея заряды төмен" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s өшіру мүмкін емес: батарея заряды төмен" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s өшіру мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "%s орындау мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "Кешіріңіз, бірнәрсе қате кетті" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s жөнелту мүмкін емес: %s орнатылмаған" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "Орнату мүмкін емес: аутентификация сәтсіз аяқталды" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Орнату мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "%s адресіне байланысу мүмкін емес" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "Жаңа плагиндерді пайдалану үшін БҚ қолданбасын қайта іске қосу" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Батареяның деңгейі тым төмен" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "Осы туралы" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "_БҚ қайнар көздері" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "_Пернетақта жарлықтары" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "Ба_птаулар" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Іздеу" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Басты мәзір" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Қолданбаларды іздеу" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "_Шолу" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "Орнат_ылған" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Жаңар_тулар" + +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "Артқа" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ешнәрсе" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Қолданба деректері" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Қолданбаның жұмысы үшін қажетті деректер" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Пайдаланушы деректері" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Қолданбада сіз жасаған деректер" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Кэш деректері" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Уақытша кэштелген деректер" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Қолданбаның өзі" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Талап етілетін тәуелділіктер" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Осы қолданбаға қажетті жүйенің ортақ компоненттері" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Белгісіз" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Кэштелген деректерді қолд_анба параметрлерінен тазартуғаболады" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Сақтау орны" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Орнатылған)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Орнатылуда)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Жүктеліп алынуда)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Өшірілуде)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Ақпараты" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "Т_ексеру" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Орнатылған %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "Орнатылған жаңартулар" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "Жаңартулар орнатылмады" + +#: src/gs-update-monitor.c:215 +msgid "Updates Are Out of Date" +msgstr "Мерзімі аяқталған жаңартулар" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "Қолжетімді жаңартуларды тексеру" + +#: src/gs-update-monitor.c:222 +msgid "Critical Updates Ready to Install" +msgstr "Орнатуға дайын критикалық жаңартулар" + +#: src/gs-update-monitor.c:223 +msgid "Install critical updates as soon as possible" +msgstr "" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "Жүктеуге дайын критикалық жаңартулар" + +#: src/gs-update-monitor.c:227 +msgid "Download critical updates as soon as possible" +msgstr "" + +#: src/gs-update-monitor.c:233 +msgid "Updates Ready to Install" +msgstr "Орнатуға дайын жаңартулар" + +#: src/gs-update-monitor.c:234 +msgid "Software updates are ready and waiting" +msgstr "Бағдарламалық қамтама жаңартулары дайын және күтуде" + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "Жүктеуге болатын жаңартулар" + +#: src/gs-update-monitor.c:241 +msgid "Software updates can be downloaded" +msgstr "" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u қолданба жаңартылды — қайта іске қосу керек" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u қолданба жаңартылды" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "%s жаңартылды." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "Қолданбаны қайта іске қосыңыз." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s және %s жаңартылды." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u қолданба қайта іске қосуды талап етеді." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Соның ішінде %s, %s және %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +msgid "Upgrade to continue receiving updates" +msgstr "Қауіпсіздік жаңартуларын алуды жалғастыру үшін жүйені жаңартыңыз" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Орнату үшін %s жаңа нұсқасы қолжетерлік" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "БҚ жаңартулары қолжетерлік" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "БҚ жаңартулары сәтсіз" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "Prepared updates were not installed" +msgstr "Дайындалған жаңартулар орнатылмады" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Деректерді көрсету" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Жүйелік жаңарту аяқталды" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "%s %s ішіне қош келдіңіз!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "БҚ жаңартулары орнатылды" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Маңызды жүйе жаңартулары орнатылды." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Қарап шығу" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "Жаңарту сәтсіз аяқталды" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "Жүйе жаңа болып тұр." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "Жаңартудан бас тартылды." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Интернетпен байланыс керек болды, бірақ ол жоқ. Оны тексеріп, қайталап " +"көріңіз." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Жаңартудың қауіпсіздік мәселелері бар. Көбірек білу үшін БҚ өндірушісіне " +"хабарласыңыз." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Диск орны жетпеді. Орынды босатып, қайталап көріңіз." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Кешірім сұраймыз: жаңартуды орнату сәтсіз аяқталды. Басқа жаңартуды күтіп, " +"қайталап көріңіз. Сонда да мәселе кетпесе, БҚ өндірушісіне хабарласыңыз." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Соңғы тексерілген: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Тоқтату" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Жаңартуларға тексеру" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s критикалық жаңартуларды алуды тоқтатты" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Сіздің операциялық жүйеңіз критикалық жаңартуларды алуды тоқтатты" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Ақы алынуы мүмкін" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Сымсыз кеңжолақты желісін пайдалану кезінде жаңартуларға тексеру қосымша " +"шығындарға әкеп соғуы мүмкін." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Сонд_а да тексеру" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "БҚ жаңартулары жүктеліп алынды" + +#: src/gs-updates-page.c:893 +#| msgid "%s %s Ready to be Installed" +msgid "Upgrades are ready to be installed" +msgstr "" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "Жаңартуларға тексеру" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Жаңартулар" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Жаңартулар парағы" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "Жаңартулар жүктеліп алынуда" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "Бұл біраз уақытты алуы мүмкін" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "Жаңа болып тұр" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "Мобильді деректерді қолдану керек пе?" + +#: src/gs-updates-page.ui:232 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Сымсыз кеңжолақты желісін пайдалану кезінде жаңартуларға тексеру қосымша " +"шығындарға әкеп соғуы мүмкін" + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "_Сонда да тексеру" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "Байланыс жоқ" + +#: src/gs-updates-page.ui:255 +msgid "Go online to check for updates" +msgstr "Жаңартуларды тексеру үшін онлайн өту" + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "_Желі баптаулары" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "Қате" + +#: src/gs-updates-page.ui:293 +msgid "Updates are automatically managed" +msgstr "Жаңартулар автоматты түрде басқарылады" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "БҚ жаңартулары аялдатылды" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Ағымдағы желі байланысты өлшенеді" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Ағымдағы желілік байланыс үлкен жүктеулерге тыйым салды" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Қуат үнемдеу режимі белсенді" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Ойын режимі белсенді" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "БҚ жаңартулары аялдатылды" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"Желілік байланыс өлшенетін болып табылады — бағдарламалық қамтама " +"жаңартулары аялдатылды" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Ағымдағы желілік байланыс үлкен жүктеулерге тыйым салады — бағдарламалық " +"қамтама жаңартулары аялдатылды" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"Қуат үнемдеу режимі белсенді — бағдарламалық қолданба жаңартулары аялдатылды" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Ойын режимі белсенді — бағдарламалық қамтама жаңартулары аялдатылды" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:321 +msgid "_Restart & Update…" +msgstr "Қа_йта қосу және жаңарту…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:327 +msgid "U_pdate All" +msgstr "Барлығын жаңа_рту" + +#: src/gs-updates-section.c:404 +msgid "Software Updates Downloaded" +msgstr "БҚ жаңартулары жүктеліп алынды" + +#: src/gs-updates-section.c:405 +msgid "Updates are ready to be installed" +msgstr "Жаңартулар орнатуға дайын" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:496 +msgid "Integrated Firmware" +msgstr "Құрамындағы бинарлық кодтар" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:501 +msgid "Requires Restart" +msgstr "Қайта қосуды талап етеді" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:506 +msgid "App Updates" +msgstr "Қолданба жаңартулары" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:511 +msgid "Device Firmware" +msgstr "Құрылғының бинарлық кодтары" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "Жү_ктеп алу" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s қолжетімді" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s қолжетімді" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Жаңа нұсқа туралы көбірек білу" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s жүктелді, барлығы %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% жүктелді" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Маңызды жаңарту, жаңа мүмкіндіктерді әкеледі." + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "Қа_йта қосу және жаңарту…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Жаңартылу алдында деректер және файлдарыңыздың қор көшірмелерін жасауды " +"ұмытпаңыз." + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "\"%s\" файлын өшіру қатесі: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "\"%s\" бумасын өшіру қатесі: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Бұл компьютерде БҚ-ны қосу, өшіру не жаңарту" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Жаңарту;Қайнар көздер;Репозиторийлер;Баптаулар;Орнату;Өшіру;Бағдарлама;БҚ;" +"Қолданба;Дүкен;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s дайын" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Іске қосу" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:71 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3167 +msgid "System Updates" +msgstr "Жүйе жаңартулары" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:76 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3172 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Қауіпсіздік немесе қателерді түзету және өнімділікті жақсарту сияқты жалпы " +"жүйе жаңартулары." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Жаңа мүмкіндіктер мен түзетулері бар %s жаңартуы." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Веб-қолданбасы" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Веб қолданбалар қолдауы" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Әйгілі веб қолданбаларын браузер ішінде жөнелту" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Соңғы мүмкіндіктер, өнімділік және тұрақтылық жақсартуларын алу үшін жаңарту." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak қолдауы" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak - бұл Linux үшін жұмыс үстел қолданбаларының жүйесі" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Жүйелік бума %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Үй бумасында ішкі бума %s" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Хост-жүйенің бумалары" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "/etc ішінен хост жүйесінің баптаулары" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Жұмыс үстелі бумасы" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Жұмыс үстелдің ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Құжаттар бумасы" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Құжаттар бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Музыка бумасы" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Музыка бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Суреттер бумасы" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Суреттер бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Жалпы ортақ бөлісу бумасы" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Жалпы ортақ бөлісу бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Видеолар бумасы" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Видеолар бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Үлгілер бумасы" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Үлгілер бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Пайдаланушының кэш бумасы" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Пайдаланушының кэш бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Пайдаланушы баптаулары бумасы" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Пайдаланушы баптаулары бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Пайдаланушы деректері бумасы" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Пайдаланушының деректер бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Пайдаланушының орындалу уақытындағы деректер бумасы" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Пайдаланушының орындалу уақытындағы деректер бумасының ішкі бумасы %s" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Файл жүйенің %s үшін қатынау" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "%s үшін flatpak метадеректерін алу…" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Пайдаланушы орнатуы" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Жүйелік орнату" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "Қолданба анықтағышы" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Жүйе заряды жаңартуды орындау үшін тым төмен" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Жүйе заряды жаңартуды орындау үшін тым төмен (%u%%, ал керек шамасы %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Құрылғы батареясының деңгейі тым төмен" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Құрылғы батареясының заряды тым төмен (%u%%, ал керек шамасы %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Құрылғы жаңартуды іске асыруды күтіп тұр" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Құрылғы байланысу үшін эл. желі қорегінің жалғанғанын талап етеді" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Қақпақ жабық кезінде құрылғыны қолдану мүмкін емес" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s Device Update" +msgstr "%s құрылғы жаңартуы" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s System Update" +msgstr "%s жүйе жаңартуы" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s ендірілген контроллер жаңартуы" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s ME Update" +msgstr "%s ME жаңартуы" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s корпоративтік ME жаңартуы" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:238 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s пайдаланушылық ME жаңартуы" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:244 +#, c-format +msgid "%s Controller Update" +msgstr "%s контроллер жаңартуы" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt контроллері жаңартуы" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s процессор микрокодының жаңартуы" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:260 +#, c-format +msgid "%s Configuration Update" +msgstr "%s баптаулар жаңартуы" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Battery Update" +msgstr "%s батарея жаңартуы" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:269 +#, c-format +msgid "%s Camera Update" +msgstr "%s камера жаңартуы" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:273 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM жаңартуы" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:277 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s тачпад жаңартуы" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:281 +#, c-format +msgid "%s Mouse Update" +msgstr "%s тышқан жаңартуы" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:285 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s пернетақта жаңартуы" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s сақтауыш контроллер жаңартуы" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s желілік контроллер жаңартуы" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s Display Update" +msgstr "%s монитор жаңартуы" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s BMC Update" +msgstr "%s ME жаңартуы" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:309 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB қабылдағышының жаңартуы" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:313 +#, c-format +msgid "%s Drive Update" +msgstr "%s жетек жаңартуы" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s Flash жетегі жаңартуы" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD жаңартуы" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU жаңартуы" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s Dock Update" +msgstr "%s док станция жаңартуы" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:337 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB Dock жаңартуы" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Бинарлық кодтар" + +#: plugins/fwupd/gs-plugin-fwupd.c:1922 +msgid "Firmware update could not be applied: " +msgstr "Бинарлы кодтар жаңартуын іске асыру мүмкін емес: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Бинарлық кодтарды жаңарту қолдауы" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Бинарлық кодтарды жаңарту мүмкіндігін ұсынады" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Қолтаңбасы жоқ БҚ орнату керек пе?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Қолтаңбасы жоқ БҚ жүктеп алу керек пе?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Қолтаңбасы жоқ БҚ жаңарту керек пе?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Жаңартуларды орнату мүмкін емес: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Дестелер" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1410 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1433 +msgid "Failed to wait on transaction end before download: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1440 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1453 +msgid "Failed to download updates: " +msgstr "Жаңартуларды жүктеп алу сәтсіз аяқталды: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1492 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1502 +msgid "Failed to trigger update: " +msgstr "Жаңартуды іске мүмкін емес: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3267 +msgid "Operating System (OSTree)" +msgstr "Операциялық жүйе (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap дүкені" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap қолдауы" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap - бұл әмбебап Linux дестесі" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Жүйеңізде БҚ-ны басқарудың ыңғайлы жолы." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "1 және %u арасындағы санды енгізіңіз: " + +#~ msgid "Choose an app:" +#~ msgstr "Қолданбаны таңдаңыз:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s енді орнатылған" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Қолданба(лар) өшірілді" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "\"%s\" табу мүмкін емес" + +#~ msgid "Moderate page" +#~ msgstr "Бетті модерациялау" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Модерациялау үшін пікірлер жоқ" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Бұл пікір сізге пайдалы болды ма?" + +#~ msgid "Yes" +#~ msgstr "Иә" + +#~ msgid "No" +#~ msgstr "Жоқ" + +#~ msgid "Outdated SDK version" +#~ msgstr "Ескірген SDK нұсқасы" + +#~ msgid "Unable to install updates" +#~ msgstr "Жаңартуларды орнату мүмкін емес" + +#~ msgid "Network Settings" +#~ msgstr "Желі баптаулары" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "ОЖ жаңартулары қолжетерсіз" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Маңызды жүйе жаңартуларын орнату сәтсіз аяқталды." + +#~ msgid "No Network" +#~ msgstr "Желі жоқ" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Жаңартуларға тексеру үшін Интернетпен байланыс керек." + +#~ msgid "Network _Settings" +#~ msgstr "_Желі баптаулары" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "БҚ жаңартулары жүктеліп алынды және орнатуға дайын." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "БҚ жаңартулары жүктеліп алынды және орнатуға дайын." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Жаңарту ақпаратын жүктеп алу…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Автоматты жаңартулар аялдатылған" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Ағымдағы желі өлшенеді. Өлшенетін желілерде деректер шектеулері немесе " +#~ "олармен байланысты төлемдер бар. Деректерді үнемдеу үшін автоматты " +#~ "жаңартулар уақытша тоқтатылды.\n" +#~ "\n" +#~ "Ал, ағымдағы желі өлшенетін ретінде қате анықталған болса, бұл параметрді " +#~ "өзгертуге болады." + +#~ msgid "Open Network _Settings" +#~ msgstr "Желі ба_птауларын ашу" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Шығындар және желі тежелуін болдырмау үшін, автожаңартулар мобильді " +#~ "немесе өлшенетін байланыста сөндірілген болады." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Мүмкін болса, бағдарламалық қамтама жаңартуларын фондық режимде жүктеп " +#~ "алады және орнатады" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Тек е_ркін қолданбаларды көрсету" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Тек еркін лицензияланған қолданбаларды көрсету және кез келген " +#~ "проприетарлы қолданбаларды жасыру" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Бұл қолданбада сізге не ұнады? Пікірдің өзін және оның себептерін қалдыру " +#~ "басқаларға пайдалы." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Жаңартуларды жүктеп алу мүмкін емес: интернетке байланыс керек, бірақ, ол " +#~ "қолжетерсіз" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Жаңартуларды жүктеп алу мүмкін емес: диск орны жетпейді" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Жаңартуларды жүктеп алу мүмкін емес: аутентификация керек болды" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Жаңартуларды жүктеп алу мүмкін емес: аутентификация қате болды" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "%s орнату мүмкін емес: сізде БҚ орнатуға рұқсаттар жоқ" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "%s орнату мүмкін емес: батарея деңгейі тым төмен" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Жаңартуларды орнату мүмкін емес: аутентификация керек болды" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Жаңартуларды орнату мүмкін емес: аутентификация сәтсіз аяқталды" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "%s жаңарту мүмкін емес: сізде БҚ орнатуға рұқсаттар жоқ" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "Жаңартуларды орнату мүмкін емес: сізде БҚ жаңарту құқығы жоқ" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "%s жаңарту мүмкін емес: батарея деңгейі тым төмен" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Жаңартуларды орнату мүмкін емес: батарея деңгейі тым төмен" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "%s дейін жаңартылу мүмкін емес: сізде жүйені жаңартуға рұқсаттар жоқ" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "%s дейін жаңартылу мүмкін емес: батарея деңгейі тым төмен" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "%s өшіру мүмкін емес: аутентификация керек болды" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "%s өшіру мүмкін емес: аутентификация қате болды" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "%s өшіру мүмкін емес: сізде БҚ орнатуға рұқсаттар жоқ" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "%s өшіру мүмкін емес: батарея деңгейі тым төмен" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "%s өшіру мүмкін емес" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Файлды орнату сәтсіз аяқталды: қолдауы жоқ" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Орнату сәтсіз аяқталды: қолдау жоқ" + +#~ msgid "AC power is required" +#~ msgstr "Эл. қорегіне қосылу керек" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Өлшенетін желі ‒ автоматты жаңартулар аялдатылған" + +#~ msgid "Find Out _More" +#~ msgstr "Кө_бірек білу" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Маңызды БҚ жаңартуы орнатуға дайын." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Маңызды: критикалық БҚ жаңартулары күтуде." + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Жаңартудың сипаттамасы жүктелуде, күте тұрыңыз…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Жүйе онлайн режимінде болған және кез келген жаңартулар алғанның соңғы " +#~ "уақыт белгісі" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Кеңейтілген жөндеу ақпаратын көрсету" + +#~ msgid "_User" +#~ msgstr "Па_йдаланушы" + +#~ msgid "An application" +#~ msgstr "Қолданба" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Бұл бағдарламалық қамтама сіздің тіліңізде қолжетімсіз және АҚШ ағылшын " +#~ "тілінде болады." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Таңдалған кеңейтулер қолданбамен бірге орнатылады." + +#~ msgid "Applications" +#~ msgstr "Қолданбалар" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "%s өшіруді шынымен қалайсыз ба?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s өшіріледі, және оны қолданғыңыз келсе, сізге оны қайтадан орнату керек " +#~ "болады." + +#~ msgid "_Continue" +#~ msgstr "Жалға_стыру" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u қолданба" + +#~ msgid "Post Review" +#~ msgstr "Пікірді жариялау" + +#~ msgid "_Post" +#~ msgstr "_Жариялау" + +#~ msgid "Rating" +#~ msgstr "Рейтинг" + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Пікір" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Қолданба туралы не ойлайсыз? Пікірлеріңіздің себептерін келтіріп көріңіз." + +#~ msgid "No screenshot provided" +#~ msgstr "Скриншот жоқ" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Қазір қайта қосу" + +#~ msgid "Primary Menu" +#~ msgstr "Басты мәзір" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Жаңартулар" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s үшін енді қолдау жоқ." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Бұл дегеніміз, ол енді қауіпсіздік жаңартуларын алмайтын болады." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Жаңалау нұсқаға дейін жаңарту ұсынылады." + +#~ msgid "Update All" +#~ msgstr "Барлығын жаңарту" + +#~ msgid "Application Updates" +#~ msgstr "Қолданба жаңартулары" + +#~ msgid "Downloading featured images…" +#~ msgstr "Ұсынылатын суреттерді жүктеп алу…" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "Application manager for GNOME" +#~ msgstr "GNOME үшін қолданбалар басқарушысы" + +#~ msgid "A list of popular applications" +#~ msgstr "Әйгілі қолданбалар тізімі" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "Жүйелік қолданбалардың орнына пайдаланылатын қолданбалар тізімі." + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "БҚ каталогы жүктеліп алынуда" + +#~ msgid "Name" +#~ msgstr "Аты" + +#~ msgid "system" +#~ msgstr "жүйе" + +#~ msgid "user" +#~ msgstr "пайдаланушы" + +#~ msgid "Channel" +#~ msgstr "Арна" + +#~ msgid "Branch" +#~ msgstr "Бұтақ" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Орнату" + +#~ msgid "Version" +#~ msgstr "Нұсқасы" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Бұл жүйеде ешбір жаңарту орнатылмаған." + +#~ msgid "Checking…" +#~ msgstr "Тексеру…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Бағдарламалық қамтаманың белгісіз рұқсаттары бар" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Бағдарламалық қамтама сенімді дереккөзден келіп тұр" + +#~ msgid "Loading…" +#~ msgstr "Жүктелуде…" + +#~ msgid "_Add shortcut" +#~ msgstr "Жарлықты қо_су" + +#~ msgid "Re_move shortcut" +#~ msgstr "Жарлықты ө_шіру" + +#~ msgid "Welcome" +#~ msgstr "Қош келдіңіз" + +#~ msgid "Welcome to Software" +#~ msgstr "Software қолданбасына қош келдіңіз" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Software қолданбасы өзіңізге керек барлық БҚ-ны бір жерден орнатуға " +#~ "мүмкін қылады. Біздің ұсыныстарымызды қарап, санаттарды шолыңыз, немесе " +#~ "керек қолданбаны іздеп көріңіз." + +#~ msgid "_Browse Software" +#~ msgstr "БҚ _шолу" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Қолданбалар рейтингтерін жүктеп алу…" + +#~ msgid "Unknown Permissions" +#~ msgstr "Рұқсаттар белгісіз" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Бұл бағдарламаға қажетті рұқсаттар белгісіз" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Бағдарлама сенімді көзден келеді" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Дистрибутивіңіз осы бағдарламаға сенуге болатынын тексерді" + +#~ msgid "OS Updates" +#~ msgstr "ОЖ жаңартулары" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Өнімділік, тұрақтылық және қауіпсіздік жақсартуларын әкеледі." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Бинарлы кодтар жаңартудың қолтаңбасын жүктеп алу…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Бинарлы кодтар жаңартудың метадеректерін жүктеп алу…" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "" +#~ "Тегін емес бағдарламалық қамтама репозиторийлерін орнату үшін сұрауды " +#~ "көрсету" + +#~ msgid "Select All" +#~ msgstr "Барлығын таңдау" + +#~ msgid "Select None" +#~ msgstr "Ештеңе таңдамау" + +#~ msgid "Featured %s" +#~ msgstr "Ұсынылатын %s" + +#~ msgid "Show" +#~ msgstr "Көрсету" + +#~ msgid "Sort" +#~ msgstr "Сұрыптау" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgid "Audio & Video" +#~ msgstr "Аудио және видео" + +#~ msgid "Developer Tools" +#~ msgstr "Өндіру саймандары" + +#~ msgid "Education & Science" +#~ msgstr "Білім алу және ғылым" + +#~ msgid "Games" +#~ msgstr "Ойындар" + +#~ msgid "Graphics & Photography" +#~ msgstr "Графика және фотография" + +#~ msgid "Productivity" +#~ msgstr "Өнімділік" + +#~ msgid "Communication & News" +#~ msgstr "Байланысу және жаңалықтар" + +#~ msgid "Utilities" +#~ msgstr "Утилиталар" + +#~ msgid "_Read Less" +#~ msgstr "Азырақ оқ_у" + +#~ msgid "_Launch" +#~ msgstr "Жөне_лту" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Ешқашан" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "Белгісіз" + +#~ msgid "Low" +#~ msgstr "Төмен" + +#~ msgid "Medium" +#~ msgstr "Орташа" + +#~ msgid "High" +#~ msgstr "Жоғары" + +#~ msgid "Public domain" +#~ msgstr "Публикалық меншік" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Пайдаланушылар келесі лицензиялармен шектелген:" + +#~ msgid "Localized in your Language" +#~ msgstr "Сіздің тіліңізде аудармасы бар" + +#~ msgid "Release Activity" +#~ msgstr "Шығарылым әрекеттері" + +#~ msgid "Sandboxed" +#~ msgstr "Құмсалғышта" + +#~ msgid "Category" +#~ msgstr "Санат" + +#~ msgid "Free" +#~ msgstr "Тегін" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Бұл дегеніміз, бағдарламалық қамтаманы еркін іске қосып, көшіру, тарату, " +#~ "зерттеу және өзгертуге болады." + +#~ msgid "Proprietary Software" +#~ msgstr "Проприетарлы БҚ" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Бұл дегеніміз, бағдарламалық қамтаманың иесі жеке тұлға немесе компания " +#~ "болып табылады. Көбінесе, оның қолдануға қойылған шектеулер, және оның " +#~ "бастапқы кодтың қолжетімсіз болу жағдайлары орын алады." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Қолданбаның лицензиялық шарттары белгісіз." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Қолданба осылай бағаланды, себебі ол ұсынады:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Бұл рейтинг үшін ақпараты жоқ." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Өшірілген" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Орнатылған" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Жаңартылған" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Белгісіз" + +#~ msgid "History" +#~ msgstr "Тарихы" + +#~ msgid "More…" +#~ msgstr "Көбірек…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Ұсынылатын аудио және видео қолданбалары" + +#~ msgid "Recommended Games" +#~ msgstr "Ұсынылатын ойындар" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Ұсынылатын графикалық қолданбалары" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Ұсынылатын өнімділік қолданбалары" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Бұл БҚ ішінен кейбірі проприетарлы БҚ, оның қолданылу және бастапқы " +#~ "кодтарға қатынау бойынша шектеулері бар." + +#~ msgid "Find out more…" +#~ msgstr "Көбірек білу…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Редакторлар таңдауы" + +#~ msgid "Recent Releases" +#~ msgstr "Соңғы шығарылымдар" + +#~ msgid "Remove “%s”?" +#~ msgstr "\"%s\" өшіру керек пе?" + +#~ msgid "Disable “%s”?" +#~ msgstr "\"%s\" сөндіру керек пе?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Қосымша қайнар көздері жоқ" + +#~ msgid "_Remove…" +#~ msgstr "Ө_шіру…" + +#~ msgid "_Disable…" +#~ msgstr "Сө_ндіру…" + +#~ msgid "Disabling" +#~ msgstr "Сөндірілуде" + +#~ msgid "Enabled" +#~ msgstr "Іске қосылған" + +#~ msgid "Disabled" +#~ msgstr "Сөндірілген" + +#~ msgid "_Remove All" +#~ msgstr "Барлық ө_шіру" + +#~ msgid "Looking for new updates…" +#~ msgstr "Жаңа жаңартуларды іздеу…" + +#~ msgid "Setting up updates…" +#~ msgstr "Жаңартуларды баптау…" + +#~ msgid "Software is up to date" +#~ msgstr "БҚ ескірмеді" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Жаңартулар компьютер қайта іске қосылғанда іске асырылатын болады." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "%s %s жүктелуді күту" + +#~ msgid "Downloading %s %s" +#~ msgstr "%s %s жүктеліп алынуда" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "GNOME қоршамы кеңейтулері репозиторийін іске қосу" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Мультфильм кейіпкерлері қауіпті жағдайларда" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Агрессивті жанжалдағы мультфильм кейіпкерлері" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Мультфильм кейіпкерлерінің қатысуымен графикалық зорлық-зомбылық" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Қауіпті жағдайлардағы кейіпкерлер шындықтан оңай ажыратылады" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Агрессивті жанжалдағы кейіпкерлер шындықтан оңай ажыратылады" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Графикалық зорлық-зомбылық шындықтан оңай ажыратылады" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Қауіпті жағдайларда шынайыға ұқсайтын кейіпкерлер" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Агрессивті жанжалдағы шынайы кейіпкерлердің бейнелері" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Нақты кейіпкерлерді қамтитын графикалық зорлық-зомбылық" + +#~ msgid "No bloodshed" +#~ msgstr "Қантөгіс жоқ" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Шындыққа жанаспайтын қантөгіс" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Реалистік қантөгіс" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Қантөгіст және дене мүшелерінің зақымдануы" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Зорлау немесе басқа жыныстық зорлық-зомбылық" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Алкогольді өнімдеріне сілтемелер" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Алкогольді өнімдерін пайдалану" + +#~ msgid "References to illicit drugs" +#~ msgstr "Заңсыз есірткіге сілтемелер" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Заңсыз есірткіні қолдану" + +#~ msgid "References to tobacco products" +#~ msgstr "Темекі өнімдеріне сілтемелер" + +#~ msgid "Use of tobacco products" +#~ msgstr "Темекі өнімдерін пайдалану" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Қысқа көркем жалаңаштық" + +#~ msgid "Prolonged nudity" +#~ msgstr "Ұзақ жалаңаштық" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Сексуалдық сілтемелер немесе бейнелер" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Графикалық жыныстық мінез-құлық" + +#~ msgid "Slapstick humor" +#~ msgstr "Жай әзіл" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Дөрекі немесе дәретханалық әзіл" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Жетілген немесе жыныстық әзіл" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Адамдардың белгілі бір тобына деген теріс көзқарас" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Эмоционалдық зиян келтіруге арналған кемсітушілік" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "Жынысы, сексуалдылық, нәсілі немесе діні бойынша айқын кемсіту" + +#~ msgid "Product placement" +#~ msgstr "Өнімнің өз-өзін беру" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Кейбір брендтер немесе сауда маркасымен қорғалған өнімдерге тікелей сілтеу" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Пайдаланушыларға шын әлемнен кейбір нәрселерді сатып алу ұсынылады" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "" +#~ "Кездейсоқ оқиғалардағы токендер немесе кредиттер арқылы құмар ойындар" + +#~ msgid "Gambling using “play” money" +#~ msgstr "\"Ойын\" ақшасын пайдаланатын құмар ойындар" + +#~ msgid "Gambling using real money" +#~ msgstr "Нақты ақшаны пайдаланатын құмар ойындар" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Пайдаланушылар шын ақшаны жіберуге ұсынылады" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Нақты ақшаны бағдарламада жұмсай алу мүмкіндігі" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "" +#~ "Сөйлесу функциясынсыз пайдаланушы-пайдаланушы арасындағы қарым-қатынас" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Ойыншылар арасындағы басқарылатын чат мүмкіндігі" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "" +#~ "Ойыншылар арасындағы басқарылмайтын аудио немесе видео чат мүмкіндігі" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Әлеуметтік желілердегі аттар немесе эл. пошта адрестермен бөлісу" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Қолданбаның соңғы нұсқасы тексерілуде" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Басқалар пайдаланушыны анықтауға мүмкіндік бермейтін диагностикалық " +#~ "деректерді бөлісу" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Басқалар пайдаланушыны анықтай алатын ақпаратымен бөлісу" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Басқа пайдаланушылармен физикалық орналасумен бөлісу" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Гомосексуализмге жанама сілтемелер" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Бір жыныстағы адамдар арасындағы сүйісу" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Бір жыныстағы адамдар арасындағы графикалық жыныстық қатынас" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Жезөкшелікке жанама сілтемелер" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Жезөкшелікке тікелей сілтемелер" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Жезөкшелік актісінің графикалық бейнелері" + +#~ msgid "Visible dead human remains" +#~ msgstr "Көрінетін өлі адамның қалдықтары" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Элементтерге ұшыраған адамның өлі қалдықтары" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Тарихи құлдықтың бейнелері немесе сілтемелері" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Қазіргі уақыттағы құлдықтың суреттелуі" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Қазіргі уақыттағы құлдықтың графикалық бейнелері" + +#~ msgid "General" +#~ msgstr "Жалпы" + +#~ msgid "ALL" +#~ msgstr "БАРЛЫҒЫ" + +#~ msgid "Teen" +#~ msgstr "Жасөспірім" + +#~ msgid "Everyone 10+" +#~ msgstr "Әркім 10+" + +#~ msgid "Everyone" +#~ msgstr "Әркім" + +#~ msgid "Early Childhood" +#~ msgstr "Ерте балалық шақ" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Белгісіз" + +#~ msgid "this website" +#~ msgstr "бұл вебсайт" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Шолуға өту" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Өшірілген" + +#~ msgid "Format" +#~ msgstr "Пішім" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "%s өшіруді шынымен қалайсыз ба?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Бұл қолданба жаңа плагиндерді қолдану үшін қайта іске қосылуы керек." + +#~ msgid "Security Updates Pending" +#~ msgstr "Қауіпсіздік жаңартулары кезекте бар" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Маңызды жаңартуларды қазір орнату ұсынылады" + +#~ msgid "Restart & Install" +#~ msgstr "Қайта қосу және орнату" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "Маңызды ОЖ және қолданба жаңартулары орнатылуға дайын" + +#~ msgid "View" +#~ msgstr "Қарау" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Кеше, %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Кеше, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Үш күн бұрын" + +#~ msgid "Four days ago" +#~ msgstr "Төрт күн бұрын" + +#~ msgid "Five days ago" +#~ msgstr "Бес күн бұрын" + +#~ msgid "Six days ago" +#~ msgstr "Алты күн бұрын" + +#~ msgid "Two weeks ago" +#~ msgstr "Екі апта бұрын" + +#~ msgid "About %s" +#~ msgstr "%s туралы" + +#~ msgid "Show the folder management UI" +#~ msgstr "Бумаларды басқару интерфейсін көрсету" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "Б_арлығы" + +#~ msgid "Folder Name" +#~ msgstr "Бума атауы" + +#~ msgid "_Add" +#~ msgstr "Қо_су" + +#~ msgid "Add to Application Folder" +#~ msgstr "Қолданбалар бумасына қосу" + +#~ msgid "Sign In / Register…" +#~ msgstr "Кіру / Тіркелу…" + +#~ msgid "Continue" +#~ msgstr "Жалғастыру" + +#~ msgid "Use" +#~ msgstr "Қолдану" + +#~| msgid "_Add to Folder…" +#~ msgid "Add another…" +#~ msgstr "Басқасын қосу…" + +#~ msgid "Top Rated" +#~ msgstr "Үздік" + +#~ msgid "Extension Settings" +#~ msgstr "Кеңейту баптаулары" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Кеңейтулерді өз тәуекеліңізге қарай қолданыңыз. Егер де жүйеңізде " +#~ "мәселелер болса, оларды сөндіру ұсынылады." + +#~ msgid "..." +#~ msgstr "..." + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS сәтті тексерілді!" + +#~ msgid "Failed to load file" +#~ msgstr "Файлды жүктеу сәтсіз аяқталды" + +#~ msgid "Unsaved changes" +#~ msgstr "Сақталмаған өзгерістер" + +#~ msgid "The application list is already loaded." +#~ msgstr "Қолданбалар тізімі жүктелген болып тұр." + +#~ msgid "Merge documents" +#~ msgstr "Құжаттарды біріктіру" + +#~ msgid "Throw away changes" +#~ msgstr "Өзгерістерді елемеу" + +#~ msgid "Open AppStream File" +#~ msgstr "AppStream файлын ашу" + +#~ msgid "_Save" +#~ msgstr "_Сақтау" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s баннер дизайны өшірілді." + +#~ msgid "Banner design deleted." +#~ msgstr "Баннер дизайны өшірілді." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Қолданбалар тізімінің сақталмаған өзгерістері бар." + +#~ msgid "Use verbose logging" +#~ msgstr "Кеңейтілген журналдауды қолдану" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME Software баннерлер дизайнері" + +#~ msgid "No Designs" +#~ msgstr "Дизайндар жоқ" + +#~ msgid "Error message here" +#~ msgstr "Қате хабарламасы осында" + +#~ msgid "Category Featured" +#~ msgstr "Ұсынылған санаты" + +#~ msgid "Undo" +#~ msgstr "Болдырмау" + +#~ msgid "Banner Designer" +#~ msgstr "Баннерлер дизайнері" + +#~ msgid "New Banner" +#~ msgstr "Жаңа баннер" + +#~ msgid "Import from file" +#~ msgstr "Файлдан импорттау" + +#~ msgid "Export to file" +#~ msgstr "Файлға экспорттау" + +#~ msgid "Spacing" +#~ msgstr "Аралық" + +#~ msgid "The amount of space between children" +#~ msgstr "Екі ұрпақ арасындағы бос аралық шамасы" + +#~ msgid "Click on items to select them" +#~ msgstr "Бірнәрсені таңдау үшін оның үстіне шертіңіз" + +#~ msgid "Select" +#~ msgstr "Таңдау" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Бумаға қосу…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Бумаға жылжыту…" + +#~ msgid "_Remove from Folder" +#~ msgstr "Бумадан ө_шіру" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "БҚ каталогы жүктелуде" + +#~ msgid "Featured Applications" +#~ msgstr "Ұсынылатын қолданбалар" + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "%s ретінде кіргенсіз" + +#~ msgid "Sign in…" +#~ msgstr "Кіру…" + +#~| msgid "Sign out from %s" +#~ msgid "Sign out" +#~ msgstr "Шығу" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "%s сатып алу мүмкін емес: ешбір төлеу тәсілі бапталмаған" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "%s сатып алу мүмкін емес: төлем тайдырылған" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "GNOME Software үшін ұсынылатын баннерлер дизайнын жасау" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;Бағдарламалық қамтама;БҚ;Қолданба;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Қоршам кеңейтулері" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "GNOME Shell кеңейтулер репозиторийі" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Қоршам кеңейтуінің метадеректерін жүктеп алу…" + +#~| msgctxt "Menu of Add-ons" +#~| msgid "Shell Extensions" +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell кеңейтуі" + +#~| msgid "To continue you need to sign in." +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Жалғастыру үшін, сізге Ubuntu One тіркелгісін қолдану керек." + +#~| msgid "To continue you need to sign in." +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Жалғастыру үшін, сізге Ubuntu One тіркелгіңізді қолдану керек." + +#~ msgid "Show profiling information for the service" +#~ msgstr "Қызмет үшін профильдеу ақпаратын көрсету" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Жалғастыру үшін сізге %s ішіне кіру керек." + +#~ msgid "Email address" +#~ msgstr "Эл. пошта адресі" + +#~ msgid "I have an account already" +#~ msgstr "Менде тіркелгім бар" + +#~ msgid "I want to register for an account now" +#~ msgstr "Тіркелгі жасағым келеді" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Келесі рет автокіру" + +#~ msgid "PIN" +#~ msgstr "PIN коды" + +#~ msgid "Authenticate" +#~ msgstr "Аутентификация" + +#~ msgid "_About" +#~ msgstr "Осы т_уралы" + +#~ msgid "_Quit" +#~ msgstr "_Шығу" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "%s туралы ақпаратты және бұл пішімді ойната алатын кодекті орнату жолы " +#~ "жөнінде вебсайттан білуге болады." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Бұл шешілмегенше, БҚ орнату мүмкін емес." + +#~ msgid "For more information, visit %s." +#~ msgstr "Көбірек ақпарат алу үшін, %s шолыңыз." + +#~ msgid "Applications Updated" +#~ msgstr "Қолданбалар жаңартылды" + +#~ msgid "Downloading new updates…" +#~ msgstr "Жаңа жаңартуларды жүктеп алу…" + +#~ msgid "Downloading application page…" +#~ msgstr "Қолданба парағын жүктеп алу…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Valve ұсынған көңіл көтеру платформасы" + +#~ msgid "Restart & _Install" +#~ msgstr "Қайта қосу және _орнату" + +#~ msgid "Limba Support" +#~ msgstr "Limba қолдауы" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "Limba өңдірушілерге БҚ пакеттерін жасау мүмкіндігін береді" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Осыған дейін іске қосылған қосымша БҚ көздер тізімі" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Осыған дейін үшінші жақты қолданбаларды орнату кезінде іске қосылған " +#~ "қосымша БҚ көздер тізімі." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Іздеу нәтижелерінде еркін емес БҚ көрсету" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "" +#~ "Еркін емес қайнар көздер тізімі, оны қосымша түрде іске қосуға болады" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Проприетарлы БҚ қайнар көздерін іске қосу керек пе?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "Қолданба не қосымшалар орнатылмады; басқа БҚ болуы мүмкін" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "" +#~ "Әдетте қолданылу және бастапқы кодтарға қатынау бойынша шектеулері бар." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Проприетарлы БҚ қайнар көздері" + +#~ msgid "Remove Source" +#~ msgstr "Қайнар көзін өшіру" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "БҚ көздерін интернеттен алуға болады. Бұл %s құрамында келмейтін қосымша " +#~ "БҚ-ға қол жеткізеді." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Қайнар көзін өшіру нәтижесінде одан орнатылған барлық БҚ-ның өшірілуіне " +#~ "де әкеп соғады." + +#~ msgid "No software installed from this source" +#~ msgstr "Бұл қайнар көзінен ешбір БҚ орнатылмаған" + +#~ msgid "Installed from this Source" +#~ msgstr "Бұл қайнар көзінен орнатылған" + +#~ msgid "Last Checked" +#~ msgstr "Соңғы тексерілген" + +#~ msgid "Added" +#~ msgstr "Қосылған" + +#~ msgid "Website" +#~ msgstr "Веб сайты" + +#~ msgid "page1" +#~ msgstr "page1" + +#~ msgid "page2" +#~ msgstr "page2" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgid "“%s” [%s]" +#~ msgstr "\"%s\" [%s]" + +#~ msgid "Other Updates" +#~ msgstr "Басқа жаңартулар" + +#~ msgid "Total" +#~ msgstr "Жалпы" + +#~ msgid "Installation of %s failed." +#~ msgstr "%s орнату сәтсіз аяқталды." + +#~ msgid "Removal of %s failed." +#~ msgstr "%s өшіру сәтсіз аяқталды." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Интернетпен байланысты тексеріп, қайталап көріңіз." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Дисктегі орынды босатып, қайталап көріңіз." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Ешнәрсе" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Барлығы" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Ұсынылатын" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Астрономия" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Химия" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Математика" + +#~ msgid "Science" +#~ msgstr "Ғылым" + +#~ msgid "3rd party" +#~ msgstr "3-ші жақтық" + +#~ msgid "nonfree" +#~ msgstr "еркін_емес" + +#~ msgid "shell extension" +#~ msgstr "қоршам кеңейтуі" + +#~ msgid "_Installing" +#~ msgstr "Ор_натылуда" + +#~ msgid "_Removing" +#~ msgstr "Ө_шірілуде" + +#~ msgid " or " +#~ msgstr " немесе " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Белгісіз" + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "Бұл БҚ үшінші жақтан келді, онда еркін емес құрамасы болуы мүмкін." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Бұл БҚ-да еркін емес құрамасы болуы мүмкін." + +#~ msgid "non-free" +#~ msgstr "еркін_емес" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "БҚ қайнар көздері сізге қосымша БҚ-ға жол ашады." + +#~ msgid "One Star" +#~ msgstr "Бір жұлдыз" + +#~ msgid "Two Stars" +#~ msgstr "Екі жұлдыз" + +#~ msgid "Three Stars" +#~ msgstr "Үш жұлдыз" + +#~ msgid "Four Stars" +#~ msgstr "Төрт жұлдыз" + +#~ msgid "Five Stars" +#~ msgstr "Бес жұлдыз" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Есептеу…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Белгісіз" + +#~ msgid "_History" +#~ msgstr "_Тарихы" + +#~ msgid "Size" +#~ msgstr "Өлшемі" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Ұсынылатын кеңселік қолданбалары" + +#~ msgid "No AppStream data found" +#~ msgstr "AppStream деректері табылмады" + +#~ msgid "Audio" +#~ msgstr "Аудио" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Түзету" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Дерекқорлар" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Дисктерді жазу" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Әуесқойлық радио" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Миксер" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Музыка" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Жазу" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Секвенсор" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Тюнер" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Жинау" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Дерекқорлар" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Профильдеу" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Веб үшін өндіру" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Биология" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Информатика" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Деректерді бейнелеу" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Экономика" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Электр" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Электроника" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Инжиниринг" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Геология" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Жер қойнауы ғылымдары" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Тарих" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Суреттерді өңдеу" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Әдебиет" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Карталар" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Музыка" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Сандық анализ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Параллельді есептеу" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Физика" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Руханият" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Ату" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Симуляторлар" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Спорт" + +#~ msgid "Graphics" +#~ msgstr "Графика" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D графикасы" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "Мәтінді тану" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Жариялау" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Растрлық графика" + +#~ msgid "Internet" +#~ msgstr "Интернет" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Коммутация" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Эл. пошта" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Таспа" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Файлдармен алмасу" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Әуесқойлық радио" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Лезде хабарласу" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC клиенттері" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Бақылау" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Телефония" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Веб үшін өндіру" + +#~ msgid "Office" +#~ msgstr "Офис" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Диаграммалар" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Контакттарды басқару" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Сөздік" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Эл. пошта" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Блок-сұлбалар" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "ҚДК" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Фотография" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Жобаларды басқару" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Жариялау" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Эл. кестелер" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Көрсетуші" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Өнер" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Жасанды интеллект" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Астрономия" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Биология" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Химия" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Информатика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Құрылыс" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Деректерді бейнелеу" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Экономика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Электр" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Электроника" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Инжиниринг" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "География" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Геология" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Жер қойнауы ғылымдары" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Тарих" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Гуманитарлық ғылымдар" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Суреттерді өңдеу" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Тілдер" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Әдебиет" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Карталар" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Математика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Медицина" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Сандық анализ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Параллельді есептеу" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Физика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Робототехника" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Руханият" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Спорт" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Эмулятор" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Файлдар басқарушысы" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Файлдық саймандар" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Бақылау" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Қауіпсіздік" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Терминал эмуляторы" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Қол жетерлілік" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Архивтеу" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Калькулятор" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Сағат" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Сығу" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Файлдық саймандар" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Карталар" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Руханият" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Телефония" + +#~ msgid "Video" +#~ msgstr "Видео" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Түзету" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Дерекқор" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Дисктерді жазу" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Жазу қолданбалары" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" + +#~ msgid "A previous update was unfinished." +#~ msgstr "Алдыңғы жаңарту аяқталмаған." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "Жаңартуды орнату мүмкін емес; мәселе жаңартудың өзінде болуы мүмкін. " +#~ "Басқа жаңартуды күтіп, қайталап көріңіз." + +#~ msgid "Internet Only Application" +#~ msgstr "Тек интернет болғанда істейтін қолданбалар" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Жаңартуға дұрыс қолтаңба қойылған жоқ." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Желіден тыс жаңарту сұралған, бірақ, бірде-бір десте жаңартуды талап " +#~ "етпейді." + +#~ msgid "No space was left on the drive." +#~ msgstr "Дискте орын қалмады." + +#~ msgid "An update failed to install correctly." +#~ msgstr "Жаңарту дұрыс орнатыла алмады." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Желіден тыс жаңарту күтпеген түрде сәтсіз аяқталды." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i қолданба және %i қосымша орнатылды" diff --git a/po/km.po b/po/km.po new file mode 100644 index 0000000..0f89f5a --- /dev/null +++ b/po/km.po @@ -0,0 +1,1900 @@ +# Khmer translation for gnome-software. +# Copyright (C) 2014 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Khoem Sokhem , 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-software&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-04-21 19:29+0000\n" +"PO-Revision-Date: 2014-04-21 19:29+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Khmer \n" +"Language: km\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: WordForge0.8 RC1\n" +"X-Language: km-KH\n" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:1 +msgid "Application manager for GNOME" +msgstr "កម្មវិធី​គ្រប់គ្រង​កម្មវិធី​សម្រាប់ GNOME" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:2 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" +"កម្មវិធីអនុញ្ញាត​ឲ្យ​អ្នក​រក និង​ដំឡើង​កម្មវិធីថ្មីៗ​ " +"ព្រមទាំង​ផ្នែក​បន្ថែម​ប្រព័ន្ធ​ និង​លុប​កម្មវិធី​ដែល​បានឡើង​មាន​ស្រាប់​ចេញ។" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:3 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" +"កម្មវិធី GNOME បង្ហាញ​កម្មវិធី​បាន​ជ្រើសរើស " +"និង​មាន​ប្រជាប្រិយ​​រួម​នឹង​ការ​ពណ៌នា​មាន​ប្រយោជន៍​ " +"ព្រម​ទាំង​រូបថត​អេក្រង់​ជា​ច្រើន​ក្នុង​កម្មវិធី​មួយៗ​។ " +"កម្មវិធី​អាច​រក​បាន​ទាំង​តាម​ការរុករក​បញ្ជី​​តាម​ប្រភេទ ឬ​ដោយ​ស្វែងរក​។ វា​ក" +"៏​អនុញ្ញាត​ឲ្យ​អ្នក​ធ្វើ​បច្ចុប្បន្នភាព​ប្រព័ន្ធ​របស់​អ្នក​ដោយ​ប្រើ​បច្ចុប្ប" +"ន្នភាព​ក្រៅ​បណ្ដាញ​។" + +#: ../src/app-folder-dialog.ui.h:1 +msgid "Add to Application Folder" +msgstr "បន្ថែម​ទៅ​ថត​កម្មវិធី" + +#: ../src/app-folder-dialog.ui.h:2 ../src/gs-app-folder-dialog.c:325 +#: ../src/gs-shell-details.c:229 ../src/gs-shell-installed.c:590 +msgid "_Cancel" +msgstr "បោះបង់" + +#: ../src/app-folder-dialog.ui.h:3 ../src/gs-app-folder-dialog.c:330 +msgid "_Add" +msgstr "បន្ថែម" + +#: ../src/app-menu.ui.h:1 +msgid "_Software Sources" +msgstr "ប្រភព​កម្មវិធី" + +#: ../src/app-menu.ui.h:2 +msgid "_About" +msgstr "អំពី" + +#: ../src/app-menu.ui.h:3 +msgid "_Quit" +msgstr "ចាកចេញ" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is installed +#: ../src/app-tile.ui.h:1 ../src/gs-app-tile.c:80 ../src/gs-app-tile.c:83 +#: ../src/gs-feature-tile.c:76 ../src/gs-popular-tile.c:79 +#: ../src/gs-popular-tile.c:82 ../src/popular-tile.ui.h:1 +msgid "Installed" +msgstr "បាន​ដំឡើង" + +#. TRANSLATORS: this is the application name +#. TRANSLATORS: this is the main window title +#: ../src/org.gnome.Software.desktop.in.h:1 ../src/gnome-software.ui.h:3 +#: ../src/gs-application.c:240 ../src/gs-shell.c:161 +msgid "Software" +msgstr "កម្មវិធី" + +#: ../src/org.gnome.Software.desktop.in.h:2 +msgid "Add, remove or update software on this computer" +msgstr "បន្ថែម, លុប ឬ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​លើ​កុំព្យូទ័រ​នេះ" + +#: ../src/gnome-software-local-file.desktop.in.h:1 +msgid "Software Install" +msgstr "ដំឡើង​កម្មវិធី" + +#: ../src/gnome-software-local-file.desktop.in.h:2 +msgid "Install selected software on the system" +msgstr "ដំឡើង​កម្មវិធី​បាន​ជ្រើស​លើ​ប្រព័ន្ធ" + +#: ../src/gnome-software.ui.h:1 +msgid "Select All" +msgstr "ជ្រើស​ទាំងអស់" + +#: ../src/gnome-software.ui.h:2 +msgid "Select None" +msgstr "មិន​ជ្រើស​ទាំងអស់" + +#. vim: set noexpandtab: +#: ../src/gnome-software.ui.h:4 ../src/gs-sources-dialog.ui.h:2 +#: ../src/gs-update-dialog.ui.h:1 +msgid "Go back" +msgstr "ត្រឡប់ក្រោយ" + +#. Translators: A label for a button to show all available software. +#: ../src/gnome-software.ui.h:6 +msgid "_All" +msgstr "ទាំងអស់" + +#. Translators: A label for a button to show only software which is already installed. +#: ../src/gnome-software.ui.h:8 +msgid "_Installed" +msgstr "បាន​ដំឡើង" + +#. Translators: A label for a button to show only updates which are available to install. +#: ../src/gnome-software.ui.h:10 +msgid "_Updates" +msgstr "បច្ចុប្បន្នភាព" + +#: ../src/gnome-software.ui.h:11 +msgid "Restart & _Install" +msgstr "ចាប់ផ្ដើម​ឡើងវិញ និង​ដំឡើង" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#: ../src/gnome-software.ui.h:12 ../src/gs-shell-details.c:178 +msgid "_Install" +msgstr "ដំឡើង" + +#. TRANSLATORS: button text in the header when an application can be erased +#: ../src/gnome-software.ui.h:13 ../src/gs-shell-details.c:216 +msgid "_Remove" +msgstr "លុបចេញ" + +#: ../src/gnome-software.ui.h:14 +msgid "Select" +msgstr "ជ្រើស" + +#: ../src/gnome-software.ui.h:15 +msgid "Check for updates" +msgstr "ពិនិត្យ​មើល​បច្ចុប្បន្នភាព" + +#: ../src/gs-app-folder-dialog.c:313 +msgid "Folder Name" +msgstr "ឈ្មោះថត" + +#. TRANSLATORS: this is the title of the about window +#: ../src/gs-application.c:238 +msgid "About Software" +msgstr "អំពី​កម្មវិធី" + +#. TRANSLATORS: well, we seem to think so, anyway +#: ../src/gs-application.c:243 +msgid "A nice way to manage the software on your system." +msgstr "វិធី​ដ៏​ល្អ​ដើម្បី​គ្រប់គ្រង​កម្មវិធី​លើ​ប្រព័ន្ធ​របស់​អ្នក" + +#: ../src/gs-application.c:247 +msgid "translator-credits" +msgstr "ខឹម សុខែម, សេង សុត្ថា, សុខ សុភាព" + +#: ../src/gs-application.c:488 +msgid "Enter GApplication service mode" +msgstr "បញ្ចូល​របៀប​សេវាកម្ម GApplication" + +#. TRANSLATORS: this is a command line option +#: ../src/gs-application.c:491 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"របៀប​ចាប់ផ្ដើម​៖ ថា​តើ ‘​ធ្វើ​បច្ចុប្បន្នភាព’, ‘បាន​ធ្វើបច្ចុប្បន្នភាព’, " +"‘បាន​ដំឡើង’ ឬ ‘ទិដ្ឋភាព​ទូទៅ’" + +#: ../src/gs-application.c:491 +msgid "MODE" +msgstr "របៀប" + +#: ../src/gs-application.c:493 +msgid "Search for applications" +msgstr "ស្វែងរក​កម្មវិធី" + +#: ../src/gs-application.c:493 +msgid "SEARCH" +msgstr "ស្វែងរក" + +#: ../src/gs-application.c:495 ../src/gs-application.c:497 +msgid "Show application details" +msgstr "បង្ហាញ​ព័ត៌មាន​លម្អិត​កម្មវិធី" + +#: ../src/gs-application.c:495 ../src/gs-application.c:497 +#: ../src/gs-application.c:499 +msgid "ID" +msgstr "លេខ​សម្គាល់" + +#: ../src/gs-application.c:499 +msgid "Set the specified debugging level" +msgstr "កំណត់​កម្រិត​កែ​កំហុស​បាន​បញ្ជាក់" + +#: ../src/gs-application.c:501 +msgid "Show profiling information for the service" +msgstr "បង្ហាញ​ព័ត៌មាន​ប្រវត្តិរូប​សម្រាប់​សេវាកម្ម" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being installing +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#: ../src/gs-app-tile.c:89 ../src/gs-app-tile.c:92 ../src/gs-app-widget.c:237 +msgid "Installing" +msgstr "ដំឡើង" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being removed +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#: ../src/gs-app-tile.c:98 ../src/gs-app-tile.c:101 ../src/gs-app-widget.c:246 +msgid "Removing" +msgstr "លុបចេញ" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user there is an update for the installed +#. * application available +#: ../src/gs-app-tile.c:107 ../src/gs-app-tile.c:111 +#: ../src/gs-feature-tile.c:81 ../src/gs-popular-tile.c:88 +#: ../src/gs-popular-tile.c:92 +msgid "Updates" +msgstr "ធ្វើ​បច្ចុប្បន្នភាព" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-widget.c:200 +msgid "Visit website" +msgstr "មើល​តំបន់​បណ្ដាញ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: ../src/gs-app-widget.c:207 +msgid "Cancel" +msgstr "បោះបង់" + +#. TRANSLATORS: this is a label that describes an application +#. * that has been queued for installation +#: ../src/gs-app-widget.c:210 +msgid "Pending" +msgstr "រង់ចាំ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-widget.c:217 +msgid "Install" +msgstr "ដំឡើង" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: ../src/gs-app-widget.c:226 ../src/gs-shell-details.c:1044 +#: ../src/gs-shell-installed.c:210 ../src/gs-shell-search.c:166 +msgid "Remove" +msgstr "លុបចេញ" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: ../src/gs-category.c:172 +msgid "Other" +msgstr "ផ្សេងៗ" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: ../src/gs-history-dialog.c:82 +msgctxt "app status" +msgid "Removed" +msgstr "បាន​លុប​ចេញ" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: ../src/gs-history-dialog.c:88 +msgctxt "app status" +msgid "Installed" +msgstr "បាន​ដំឡើង" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: ../src/gs-history-dialog.c:93 +msgctxt "app status" +msgid "Updated" +msgstr "បាន​ធ្វើ​បច្ចុប្បន្នភាព" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: ../src/gs-history-dialog.c:99 +msgctxt "app status" +msgid "Unknown" +msgstr "មិន​ស្គាល់" + +#. vim: set noexpandtab: +#: ../src/gs-history-dialog.ui.h:1 +msgid "History" +msgstr "ប្រវត្តិ" + +#. TRANSLATORS: this is when the offline update failed +#: ../src/gs-offline-updates.c:249 +msgid "Failed To Update" +msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ធ្វើ​បច្ចុប្បន្នភាព" + +#. TRANSLATORS: the transaction could not be completed +#. * as a previous transaction was unfinished +#: ../src/gs-offline-updates.c:255 +msgid "A previous update was unfinished." +msgstr "បច្ចុប្បន្ន​មុន​មិន​ត្រូវ​បាន​បញ្ចប់។" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: ../src/gs-offline-updates.c:265 +msgid "Network access was required but not available." +msgstr "ការ​ចូល​ដំណើរការ​បណ្ដាញ​ត្រូវ​បាន​ទាមទារ​ប៉ុន្តែ​មិន​អាច​ប្រើ​បាន។" + +#. TRANSLATORS: if the package is not signed correctly +#. * +#: ../src/gs-offline-updates.c:274 +msgid "An update was not signed in the correct way." +msgstr "បច្ចុប្បន្នភាព​មិន​ត្រូវ​បាន​ចូល​តាម​វិធី​ត្រឹមត្រូវ។" + +#. TRANSLATORS: the transaction failed in a way the user +#. * probably cannot comprehend. Package management systems +#. * really are teh suck. +#: ../src/gs-offline-updates.c:284 +msgid "The update could not be completed." +msgstr "មិន​អាច​បញ្ចប់​បច្ចុប្បន្នភាព។" + +#. TRANSLATORS: the user aborted the update manually +#: ../src/gs-offline-updates.c:289 +msgid "The update was cancelled." +msgstr "បច្ចុប្បន្នភាព​ត្រូវ​បាន​​បោះបង់។" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: ../src/gs-offline-updates.c:295 +msgid "An offline update was requested but no packages required updating." +msgstr "" +"បាន​ស្នើ​បច្ចុប្បន្នភាព​ក្រៅ​បណ្ដាញ " +"ប៉ុន្តែ​គ្មាន​កញ្ចប់​បាន​ទាមទារ​ធ្វើ​បច្ចុប្បន្នភាព​។" + +#. TRANSLATORS: we ran out of disk space +#: ../src/gs-offline-updates.c:299 +msgid "No space was left on the drive." +msgstr "គ្មាន​ទំហំ​នៅ​សល់​លើ​ថាស" + +#. TRANSLATORS: the update process failed in a general +#. * way, usually this message will come from source distros +#. * like gentoo +#: ../src/gs-offline-updates.c:307 +msgid "An update failed to install correctly." +msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ដំឡើង​បច្ចុប្បន្នភាព​ត្រឹមត្រូវ។" + +#. TRANSLATORS: We didn't handle the error type +#: ../src/gs-offline-updates.c:312 +msgid "The offline update failed in an unexpected way." +msgstr "បច្ចុប្បន្នភាព​ក្រៅ​បណ្ដាញ​បាន​បរាជ័យ​តាម​វិធី​​ដែល​មិន​រំពឹង​ទុក។" + +#. TRANSLATORS: these are geeky messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: ../src/gs-offline-updates.c:321 +msgid "Detailed errors from the package manager follow:" +msgstr "កំហុស​លម្អិត​ពី​កម្មវិធី​គ្រប់គ្រង​កញ្ចប់​ដូច​ខាង​ក្រោម៖" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: ../src/gs-plugin-loader.c:713 +msgid "OS Updates" +msgstr "បច្ចុប្បន្នភាព​ប្រព័ន្ធ​ប្រតិបត្តិការ" + +#. TRANSLATORS: this is a longer description of the +#. * os-update item +#: ../src/gs-plugin-loader.c:718 +msgid "" +"Includes performance, stability and security improvements for all users." +msgstr "" +"រួម​បញ្ចូលការ​បង្កើន​ការ​​អនុវត្ត, ស្ថេរភាព " +"និងសុវត្ថិភាព​សម្រាប់អ្នក​ប្រើ​ទាំងអស់។" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-plugin-loader.c:1311 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "មិនមាន​កូឌិក​បន្ថែម​សម្រាប់​ទ្រង់ទ្រាយ %s ។" + +#: ../src/gs-plugin-loader.c:1314 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "" +"ព័ត៌មាន​អំពី %s, ព្រម​ទាំង​ជម្រើស​ម្រាប់​វិធី​ទទួល​កូឌិក​ដែល​អាច​ចាក់ទ្រង់ទ្" +"រាយ​នេះ​អាច​រក​បាននៅ​លើ​វេបសាយ។" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: ../src/gs-screenshot-image.c:130 +msgid "Screenshot not found" +msgstr "រកមិន​ឃើញ​រូបថត​អេក្រង់" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: ../src/gs-screenshot-image.c:238 +msgid "Screenshot size not found" +msgstr "រក​មិន​ឃើញ​ទំហំ​រូបថត​អេក្រង់" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: ../src/gs-screenshot-image.c:252 +msgid "Could not create cache" +msgstr "មិន​អាច​បង្កើតឃ្លាំង​សម្ងាត់" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: ../src/gs-screenshot-image.c:269 +msgid "Screenshot not valid" +msgstr "រូបថត​អេក្រង់មិន​ត្រឹមត្រូវ" + +#. TRANSLATORS: this is when networking is not available +#: ../src/gs-screenshot-image.c:275 +msgid "Screenshot not available" +msgstr "មិនមាន​រូបថត​អេក្រង់" + +#: ../src/gs-screenshot-image.c:328 +msgid "Screenshot" +msgstr "រូបថត​អេក្រង់" + +#: ../src/gs-shell-details.c:161 +msgid "_Pending" +msgstr "រង់ចាំ" + +#. TRANSLATORS: button text in the header when an application +#. * is in the process of being installed +#: ../src/gs-shell-details.c:189 +msgid "_Installing" +msgstr "ដំឡើង" + +#. TRANSLATORS: button text in the header when an application can be installed +#: ../src/gs-shell-details.c:223 +msgid "_Removing" +msgstr "លុបចេញ" + +#. TRANSLATORS: this is where the licence is not known +#: ../src/gs-shell-details.c:594 +msgctxt "license" +msgid "Unknown" +msgstr "មិន​ស្គាល់" + +#. TRANSLATORS: this is where the licence is insanely +#. * complicated and the full string is put into the tooltip +#: ../src/gs-shell-details.c:599 +msgctxt "license" +msgid "Complicated!" +msgstr "ស្មុគស្មាញ!" + +#. TRANSLATORS: this is where the version is not known +#: ../src/gs-shell-details.c:612 +msgctxt "version" +msgid "Unknown" +msgstr "មិន​ស្គាល់" + +#. TRANSLATORS: this is where the size is being worked out +#: ../src/gs-shell-details.c:618 +msgctxt "size" +msgid "Calculating…" +msgstr "កំពុង​គណនា..." + +#. TRANSLATORS: this is where the size is not known +#: ../src/gs-shell-details.c:621 +msgctxt "size" +msgid "Unknown" +msgstr "មិន​ស្គាល់" + +#. TRANSLATORS: this is where the updated date is not known +#: ../src/gs-shell-details.c:633 +msgctxt "updated" +msgid "Never" +msgstr "កុំ" + +#. TRANSLATORS: this is the application isn't in any +#. * defined menu category +#: ../src/gs-shell-details.c:648 +msgctxt "menu category" +msgid "None" +msgstr "គ្មាន" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: ../src/gs-shell-details.c:658 +msgctxt "origin" +msgid "Unknown" +msgstr "មិន​ស្គាល់" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: ../src/gs-shell-details.c:1029 ../src/gs-shell-installed.c:195 +#: ../src/gs-shell-search.c:151 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "តើអ្នកប្រាកដ​ជា​ចង់​លុប %s?" + +#. TRANSLATORS: longer dialog text +#: ../src/gs-shell-details.c:1041 ../src/gs-shell-installed.c:207 +#: ../src/gs-shell-search.c:163 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" +"%s នឹង​ត្រូវ​បាន​លុប​ចេញ " +"ហើយ​អ្នក​នឹង​ត្រូវ​ដំឡើង​វា​ដើម្បី​ប្រើ​វា​ម្ដង​ទៀត។" + +#. vim: set noexpandtab: +#: ../src/gs-shell-details.ui.h:1 +msgid "Details page" +msgstr "ទំព័រ​លម្អិត" + +#: ../src/gs-shell-details.ui.h:2 +msgid "Software Source Included" +msgstr "រួម​បញ្ចូល​ប្រភព​កម្មវិធី" + +#: ../src/gs-shell-details.ui.h:3 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "" +"កម្មវិធី​នេះរួមមាន​ប្រភពកម្មវិធី​ដែល​ផ្ដល់បច្ចុប្បន្នភាព " +"ព្រម​ទាំង​ចូល​ដំណើរការ​កម្មវិធី​ផ្សេង។" + +#: ../src/gs-shell-details.ui.h:4 +msgid "No Software Source Included" +msgstr "គ្មាន​ប្រភព​កម្មវិធី​បាន​ដាក់​បញ្ចូល" + +#: ../src/gs-shell-details.ui.h:5 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "" +"កម្មវិធីនេះ​មិន​ដាក់បញ្ចូល​ប្រភព​កម្មវិធី។ " +"វា​នឹង​មិន​ត្រូវ​បាន​ធ្វើបច្ចុប្បន្នភាព​ជា​មួយ​កំណែ​ថ្មី​ទេ។" + +#: ../src/gs-shell-details.ui.h:6 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"កម្មវិធី​នេះ​ត្រូវ​បាន​ផ្ដល់​ឲ្យ​រួច​ហើយ​ដោយ​ការចែកចាយ​របស់ " +"និង​មិន​គួរត្រូវ​បាន​ជំនួស​ទេ។" + +#. Translators: a repository file used for installing software has been discovered. +#: ../src/gs-shell-details.ui.h:8 +msgid "Software Source Identified" +msgstr "បាន​បញ្ជាក់អត្តសញ្ញាណ​ប្រភព​កម្មវិធី" + +#: ../src/gs-shell-details.ui.h:9 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "" +"ការ​បន្ថែម​ប្រភព​កម្មវិធី​នេះ​ផ្ដល់ឲ្យ​អ្នកចូល​ដំណើរការ​កម្មវិធី " +"និង​បច្ចុប្បន្នភាព​បន្ថែម។" + +#: ../src/gs-shell-details.ui.h:10 +msgid "Only use software sources that you trust." +msgstr "ប្រើ​តែ​ប្រភព​កម្មវិធី​ដែលអ្នក​ទុក​ចិត្ត។" + +#: ../src/gs-shell-details.ui.h:11 +msgid "Internet Only Application" +msgstr "តែ​កម្មវិធីអ៊ីនធឺណិត" + +#: ../src/gs-shell-details.ui.h:12 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "កម្មវិធី​នេះ​អាច​ត្រូវ​បាន​ប្រើ​តែ​នៅ​ពេល​មាន​ការ​ភ្ជាប់​អ៊ីនធឺណិត​។" + +#: ../src/gs-shell-details.ui.h:13 +msgid "_Website" +msgstr "តំបន់​បណ្ដាញ" + +#: ../src/gs-shell-details.ui.h:14 +msgid "_History" +msgstr "ប្រវត្តិ" + +#. Translators: A label for a button to execute the selected application. +#: ../src/gs-shell-details.ui.h:16 +msgid "_Launch" +msgstr "ចាប់ផ្ដើម" + +#: ../src/gs-shell-details.ui.h:17 +msgid "Details" +msgstr "ព័ត៌មាន​លម្អិត" + +#: ../src/gs-shell-details.ui.h:18 ../src/gs-sources-dialog.ui.h:9 +msgid "Version" +msgstr "កំណែ" + +#: ../src/gs-shell-details.ui.h:19 +msgid "Updated" +msgstr "បាន​ធ្វើ​បច្ចុប្បន្នភាព" + +#: ../src/gs-shell-details.ui.h:20 +msgid "Category" +msgstr "ប្រភេទ" + +#: ../src/gs-shell-details.ui.h:21 +msgid "Source" +msgstr "ប្រភព" + +#: ../src/gs-shell-details.ui.h:22 +msgid "Licence" +msgstr "អាជ្ញាប័ណ្ណ" + +#: ../src/gs-shell-details.ui.h:23 +msgid "Size" +msgstr "ទំហំ" + +#: ../src/gs-shell-details.ui.h:24 +msgid "Developer" +msgstr "អ្នក​អភិវឌ្ឍន៍" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the main category for Add-ons +#: ../src/gs-shell-installed.c:509 ../src/gs-shell-updates.c:617 +#: ../src/plugins/menu-spec-common.c:210 +msgid "Add-ons" +msgstr "ផ្នែកបន្ថែម" + +#: ../src/gs-shell-installed.c:598 +msgid "Click on items to select them" +msgstr "ចុច​លើធាតុ ដើម្បីជ្រើសពួកវា" + +#. vim: set noexpandtab: +#: ../src/gs-shell-installed.ui.h:1 +msgid "Installed page" +msgstr "ទំព័រ​បាន​ដំឡើង" + +#: ../src/gs-shell-installed.ui.h:2 +msgid "_Add to Folder…" +msgstr "បន្ថែម​ទៅថត..." + +#: ../src/gs-shell-installed.ui.h:3 +msgid "_Move to Folder…" +msgstr "ផ្លាស់ទីទៅថត..." + +#: ../src/gs-shell-installed.ui.h:4 +msgid "_Remove from Folder" +msgstr "លុប​ចេញ​ពី​ថត" + +#. vim: set noexpandtab: +#: ../src/gs-shell-overview.ui.h:1 +msgid "Overview page" +msgstr "ទំព័រ​ទិដ្ឋភាព​ទូទៅ" + +#: ../src/gs-shell-overview.ui.h:2 +#: ../src/plugins/gs-plugin-hardcoded-categories.c:160 +msgid "Featured" +msgstr "ពិសេស" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: ../src/gs-shell-overview.ui.h:4 +msgid "Picks" +msgstr "ជ្រើស" + +#: ../src/gs-shell-overview.ui.h:5 +msgid "Categories" +msgstr "ប្រភេទ" + +#: ../src/gs-shell-overview.ui.h:6 +msgid "No Application Data Found" +msgstr "រកមិន​ឃើញ​ទិន្នន័យ​កម្មវិធី" + +#. vim: set noexpandtab: +#: ../src/gs-shell-search.ui.h:1 +msgid "Search page" +msgstr "ស្វែងរក​ទំព័រ" + +#: ../src/gs-shell-search.ui.h:2 +msgid "No Application Found" +msgstr "រក​មិន​ឃើញ​កម្មវិធី" + +#. TRANSLATORS: Time in 24h format +#: ../src/gs-shell-updates.c:144 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: ../src/gs-shell-updates.c:147 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../src/gs-shell-updates.c:153 +msgid "Yesterday, %R" +msgstr "ម្សិលមិញ %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: ../src/gs-shell-updates.c:157 +msgid "Yesterday, %l:%M %p" +msgstr "ម្សិលមិញ %l:%M %p" + +#: ../src/gs-shell-updates.c:160 +msgid "Two days ago" +msgstr "ពីរថ្ងៃ​មុន" + +#: ../src/gs-shell-updates.c:162 +msgid "Three days ago" +msgstr "បីថ្ងៃ​មុន" + +#: ../src/gs-shell-updates.c:164 +msgid "Four days ago" +msgstr "បួន​ថ្ងៃ​មុន" + +#: ../src/gs-shell-updates.c:166 +msgid "Five days ago" +msgstr "ប្រាំថ្ងៃ​មុន" + +#: ../src/gs-shell-updates.c:168 +msgid "Six days ago" +msgstr "ប្រាំមួយ​ថ្ងៃ​មុន" + +#: ../src/gs-shell-updates.c:170 +msgid "One week ago" +msgstr "មួយ​សប្ដាហ៍​មុន" + +#: ../src/gs-shell-updates.c:172 +msgid "Two weeks ago" +msgstr "ពីរសប្ដាហ៍​មុន" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: ../src/gs-shell-updates.c:176 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:235 +msgid "Setting up updates…" +msgstr "កំពុង​រៀបចំ​បច្ចុប្បន្នភាព…" + +#: ../src/gs-shell-updates.c:236 ../src/gs-shell-updates.c:243 +msgid "(This could take a while)" +msgstr "(វា​អាច​ចំណាយ​ពេល​មួយ​រយៈ)" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:242 +msgid "Looking for new updates…" +msgstr "កំពុង​រកមើល​បច្ចុប្បន្នភាព​ថ្មី…" + +#. TRANSLATORS: this is when the updates panel is starting up +#: ../src/gs-shell-updates.c:249 +msgid "Checking for updates…" +msgstr "កំពុង​ពិនិត្យ​មើល​បច្ចុប្បន្នភាព…" + +#. TRANSLATORS: This is the time when we last checked for updates +#: ../src/gs-shell-updates.c:365 +#, c-format +msgid "Last checked: %s" +msgstr "បាន​ពិនិត្យ​ចុងក្រោយ៖ %s" + +#. TRANSLATORS: window title to suggest that we are showing +#. * the offline updates that have just been applied +#: ../src/gs-shell-updates.c:502 +msgid "Recent Software Updates" +msgstr "បច្ចុប្បន្នភាព​កម្មវិធីថ្មីៗ" + +#. TRANSLATORS: can't do updates check +#: ../src/gs-shell-updates.c:807 +msgid "No Network" +msgstr "គ្មាន​បណ្ដាញ" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:811 +msgid "Internet access is required to check for updates." +msgstr "ទាមទារ​អ៊ីនធឺណិតដើម្បី​ពិនិត្យ​មើល​បច្ចុប្បន្នភាព។" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:815 +msgid "Network Settings" +msgstr "ការ​កំណត់​បណ្ដាញ" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: ../src/gs-shell-updates.c:835 +msgid "Charges may apply" +msgstr "ការ​គិតលុយ​អាច​អនុវត្ត" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:839 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "ការ​ពិនិត្យ​បច្ចុប្បន្នភាព​ខណៈ​ពេលប្រើប្រតបែន​ចល័ត​អាច​គិត​លុយ​បន្ថែម។" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:843 +msgid "Check Anyway" +msgstr "អញ្ចឹង ពិនិត្យ​មើល" + +#. vim: set noexpandtab: +#: ../src/gs-shell-updates.ui.h:1 +msgid "Updates page" +msgstr "ទំព័រ​បច្ចុប្ប​ន្នភាព" + +#: ../src/gs-shell-updates.ui.h:2 +msgid "Software is up to date" +msgstr "កម្មវិធីគឺ​ទាន់សម័យ​ហើយ" + +#: ../src/gs-shell-updates.ui.h:3 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "ពិនិត្យ​បច្ចុប្បន្នភាព​ពេលប្រើប្រតបែន​ចល័ត​អាច​គិត​ថ្លៃ​បន្ថែម" + +#: ../src/gs-shell-updates.ui.h:4 +msgid "_Check Anyway" +msgstr "អញ្ចឹង ពិនិត្យ​មើល" + +#: ../src/gs-shell-updates.ui.h:5 +msgid "Go online to check for updates" +msgstr "ចូល​លើបណ្ដាញ ដើម្បី​ពិនិត្យ​មើល​បច្ចុប្បន្នភាព" + +#: ../src/gs-shell-updates.ui.h:6 +msgid "_Network Settings" +msgstr "ការ​កំណត់​បណ្ដាញ" + +#. TRANSLATORS: this source has no apps installed from it +#: ../src/gs-sources-dialog.c:91 +msgid "No software installed" +msgstr "គ្មាន​កម្មវិធី​បាន​ដំឡើង" + +#. TRANSLATORS: this source has some apps installed from it +#: ../src/gs-sources-dialog.c:94 +#, c-format +msgid "%i application installed" +msgid_plural "%i applications installed" +msgstr[0] "%i applications installed" + +#. TRANSLATORS: this source has some apps installed from it +#: ../src/gs-sources-dialog.c:99 +#, c-format +msgid "%i add-on installed" +msgid_plural "%i add-ons installed" +msgstr[0] "%i add-ons installed" + +#. TRANSLATORS: this source has some apps and addons installed from it +#: ../src/gs-sources-dialog.c:104 +#, c-format +msgid "%i application and %i add-ons installed" +msgid_plural "%i applications and %i add-ons installed" +msgstr[0] "%i applications and %i add-ons installed" + +#: ../src/gs-sources-dialog.c:296 ../src/gs-sources-dialog.ui.h:13 +msgid "Remove Source" +msgstr "លុប​ប្រភព​ចេញ" + +#: ../src/gs-sources-dialog.c:311 +msgid "Removing…" +msgstr "កំពុងលុប​ចេញ" + +#. vim: set noexpandtab: +#: ../src/gs-sources-dialog.ui.h:1 +msgid "Software Sources" +msgstr "ប្រភព​កម្មវិធី" + +#: ../src/gs-sources-dialog.ui.h:3 +msgid "No sources found." +msgstr "រក​មិន​ឃើញ​ប្រភព។" + +#: ../src/gs-sources-dialog.ui.h:4 +msgid "Software sources give you access to additional software." +msgstr "ប្រភព​កម្មវិធី​ផ្ដល់​ឲ្យ​អ្នក​ចូល​ដំណើរការ​កម្មវិធី​បន្ថែម។" + +#: ../src/gs-sources-dialog.ui.h:5 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "ការលុប​ប្រភព​នឹង​លុប​កម្មវិធីមួយ​ចំនួន​ដែលអ្នក​បាន​ដំឡើង​ពីរ​វា​ផង​ដែរ។" + +#: ../src/gs-sources-dialog.ui.h:6 +msgid "No software installed from this source" +msgstr "គ្មាន​កម្មវិធី​បាន​ដំឡើង​ពី​ប្រភព​នេះ" + +#: ../src/gs-sources-dialog.ui.h:7 +msgid "Installed from this Source" +msgstr "បាន​ដំឡើង​ពី​ប្រភព​នេះ" + +#: ../src/gs-sources-dialog.ui.h:8 +msgid "Source Details" +msgstr "ព័ត៌មាន​លម្អិត​ប្រភព" + +#: ../src/gs-sources-dialog.ui.h:10 +msgid "Last Checked" +msgstr "បាន​ពិនិត្យ​ចុងក្រោយ" + +#: ../src/gs-sources-dialog.ui.h:11 +msgid "Added" +msgstr "បាន​បន្ថែម" + +#: ../src/gs-sources-dialog.ui.h:12 +msgid "Website" +msgstr "វេបសាយ" + +#: ../src/gs-update-monitor.c:102 +msgid "Software Updates Available" +msgstr "មាន​បច្ចុប្បន្ន​ភាព​កម្មវិធី" + +#: ../src/gs-update-monitor.c:103 +msgid "Important OS and application updates are ready to be installed" +msgstr "" +"បច្ចុប្បន្នភាព​ប្រព័ន្ធ​ប្រតិបត្តិការ " +"និង​កម្មវិធី​សំខាន់ៗ​ត្រូវ​បាន​ដំឡើងរួច​ហើយ" + +#: ../src/gs-update-monitor.c:106 +msgid "View" +msgstr "ទិដ្ឋភាព" + +#: ../src/gs-update-monitor.c:107 +msgid "Not Now" +msgstr "មិនមែន​ឥឡូវ" + +#: ../src/gs-update-monitor.c:148 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "បាន​ដំឡើង​បច្ចុប្បន្នភាព" + +#. TRANSLATORS: message when we've done offline updates +#: ../src/gs-update-monitor.c:152 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "បាន​ដំឡើង​បច្ចុប្បន្នភាព​ប្រព័ន្ធ​ប្រតិបត្តិការ​សំខាន់។" + +#: ../src/gs-update-monitor.c:157 +msgid "Software Updates Failed" +msgstr "បាន​បរាជ័យ​ក្នុងការ​ធ្វើបច្ចុប្បន្នភាព​កម្មវិធី" + +#. TRANSLATORS: message when we offline updates have failed +#: ../src/gs-update-monitor.c:159 +msgid "An important OS update failed to be installed." +msgstr "បាន​បរាជ័យ​ក្នុងការ​ដំឡើង​បច្ចុប្បន្នភាព​ប្រព័ន្ធ​ប្រតិបត្តិការ​សំខាន់។" + +#: ../src/gs-update-monitor.c:168 +msgid "Review" +msgstr "ពិនិត្យ​ឡើងវិញ" + +#: ../src/gs-update-monitor.c:170 +msgid "Show Details" +msgstr "បង្ហាញព័ត៌មាន​លម្អិត" + +#: ../src/gs-update-monitor.c:171 +msgid "OK" +msgstr "យល់ព្រម" + +#. vim: set noexpandtab: +#: ../src/gs-star-widget.ui.h:1 +msgid "One Star" +msgstr "ផ្កាយ​មួយ" + +#: ../src/gs-star-widget.ui.h:2 +msgid "Two Stars" +msgstr "ផ្កាយ​ពីរ" + +#: ../src/gs-star-widget.ui.h:3 +msgid "Three Stars" +msgstr "ផ្កាយ​បី" + +#: ../src/gs-star-widget.ui.h:4 +msgid "Four Stars" +msgstr "ផ្កាយ​បួន" + +#: ../src/gs-star-widget.ui.h:5 +msgid "Five Stars" +msgstr "ផ្កាយ​ប្រាំ" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: ../src/gs-utils.c:131 +#, c-format +msgid "%s is now installed" +msgstr "ឥឡូវ​បាន​ដំឡើង %s" + +#. TRANSLATORS: this is button that opens the newly installed application +#: ../src/gs-utils.c:135 +msgid "Launch" +msgstr "ចាប់ផ្ដើម" + +#: ../src/gs-utils.c:160 +msgid "Sorry, this did not work" +msgstr "សូម​ទោស វា​មិន​ដំណើរការ​ទេ" + +#. TRANSLATORS: this is when the install fails +#: ../src/gs-utils.c:164 +#, c-format +msgid "Installation of %s failed." +msgstr "ការ​ដំឡើង %s បាន​បរាជ័យ។" + +#. TRANSLATORS: this is when the remove fails +#: ../src/gs-utils.c:169 +#, c-format +msgid "Removal of %s failed." +msgstr "បាន​បរាជ័យ​ក្នុងការលុប %s ។" + +#: ../src/plugins/gs-plugin-appstream.c:171 +#, c-format +msgid "No AppStream data found" +msgstr "រក​មិន​ឃើញ​ទិន្នន័យ AppStream" + +#. TRANSLATORS: this is when a webapp has no comment +#: ../src/plugins/gs-plugin-epiphany.c:143 +#, c-format +msgid "Web app" +msgstr "កម្មវិធី​បណ្ដាញ" + +#. TRANSLATORS: this is the licence of the web-app +#: ../src/plugins/gs-plugin-epiphany.c:151 +msgid "Proprietary" +msgstr "មាន​កម្មសិទ្ធិ" + +#. TRANSLATORS: this is where update details either are +#. * no longer available or were never provided in the first place +#: ../src/plugins/gs-plugin-packagekit-refine.c:414 +msgid "No update details were provided" +msgstr "គ្មាន​ព័ត៌មាន​លម្អិត​បច្ចុប្បន្នភាព​ត្រូវ​បាន​ផ្ដល់ឲ្យ" + +#. TRANSLATORS: this is the menu spec main category for Audio +#: ../src/plugins/menu-spec-common.c:30 +msgid "Audio" +msgstr "អូឌីយ៉ូ" + +#: ../src/plugins/menu-spec-common.c:31 +msgctxt "Menu subcategory of Audio" +msgid "Editing" +msgstr "កែសម្រួល" + +#: ../src/plugins/menu-spec-common.c:32 +msgctxt "Menu subcategory of Audio" +msgid "Databases" +msgstr "មូលដ្ឋាន​ទិន្នន័យ" + +#: ../src/plugins/menu-spec-common.c:33 +msgctxt "Menu subcategory of Audio" +msgid "Disc Burning" +msgstr "ការ​ដុតថាស" + +#: ../src/plugins/menu-spec-common.c:34 +msgctxt "Menu subcategory of Audio" +msgid "Ham Radio" +msgstr "វិទ្យុ Ham" + +#: ../src/plugins/menu-spec-common.c:35 +msgctxt "Menu subcategory of Audio" +msgid "MIDI" +msgstr "មីឌី" + +#: ../src/plugins/menu-spec-common.c:36 +msgctxt "Menu subcategory of Audio" +msgid "Mixer" +msgstr "ឧបករណ៍​លាយ" + +#: ../src/plugins/menu-spec-common.c:37 +msgctxt "Menu subcategory of Audio" +msgid "Music" +msgstr "តន្ត្រី" + +#: ../src/plugins/menu-spec-common.c:38 +msgctxt "Menu subcategory of Audio" +msgid "Players" +msgstr "កម្មវិធី​ចាក់" + +#: ../src/plugins/menu-spec-common.c:39 +msgctxt "Menu subcategory of Audio" +msgid "Recorders" +msgstr "កម្មវិធី​ថត" + +#: ../src/plugins/menu-spec-common.c:40 +msgctxt "Menu subcategory of Audio" +msgid "Sequencers" +msgstr "ដាក់​ជា​លំដាប់" + +#: ../src/plugins/menu-spec-common.c:41 +msgctxt "Menu subcategory of Audio" +msgid "Tuners" +msgstr "Tuners" + +#. TRANSLATORS: this is the menu spec main category for Development +#: ../src/plugins/menu-spec-common.c:43 +msgid "Development Tools" +msgstr "ឧបករណ៍​អភិវឌ្ឍន៍" + +#: ../src/plugins/menu-spec-common.c:44 +msgctxt "Menu subcategory of Development" +msgid "Building" +msgstr "បង្កើត" + +#: ../src/plugins/menu-spec-common.c:45 +msgctxt "Menu subcategory of Development" +msgid "Databases" +msgstr "មូលដ្ឋាន​ទិន្នន័យ" + +#: ../src/plugins/menu-spec-common.c:46 +msgctxt "Menu subcategory of Development" +msgid "Debuggers" +msgstr "អ្នកែ​កំហុស" + +#: ../src/plugins/menu-spec-common.c:47 +msgctxt "Menu subcategory of Development" +msgid "GUI Designers" +msgstr "អ្នករចនា GUI" + +#: ../src/plugins/menu-spec-common.c:48 +msgctxt "Menu subcategory of Development" +msgid "IDE" +msgstr "IDE" + +#: ../src/plugins/menu-spec-common.c:49 +msgctxt "Menu subcategory of Development" +msgid "Profiling" +msgstr "ប្រវត្តិរូប" + +#: ../src/plugins/menu-spec-common.c:50 +msgctxt "Menu subcategory of Development" +msgid "Project Management" +msgstr "ការ​គ្រប់គ្រង​គម្រោង" + +#: ../src/plugins/menu-spec-common.c:51 +msgctxt "Menu subcategory of Development" +msgid "Revision Control" +msgstr "Revision Control" + +#: ../src/plugins/menu-spec-common.c:52 +msgctxt "Menu subcategory of Development" +msgid "Translation" +msgstr "បកប្រែ" + +#: ../src/plugins/menu-spec-common.c:53 +msgctxt "Menu subcategory of Development" +msgid "Web Development" +msgstr "អភិវឌ្ឍន៍​បណ្ដាញ" + +#. TRANSLATORS: this is the menu spec main category for Education +#: ../src/plugins/menu-spec-common.c:55 +msgid "Education" +msgstr "អប់រំ" + +#: ../src/plugins/menu-spec-common.c:56 +msgctxt "Menu subcategory of Education" +msgid "Art" +msgstr "សិល្បៈ" + +#: ../src/plugins/menu-spec-common.c:57 +msgctxt "Menu subcategory of Education" +msgid "Artificial Intelligence" +msgstr "ទំនាក់ទំនង​ក្លែងក្លាយ" + +#: ../src/plugins/menu-spec-common.c:58 +msgctxt "Menu subcategory of Education" +msgid "Astronomy" +msgstr "តារាវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:59 +msgctxt "Menu subcategory of Education" +msgid "Biology" +msgstr "ជីវវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:60 +msgctxt "Menu subcategory of Education" +msgid "Chemistry" +msgstr "គីមីវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:61 +msgctxt "Menu subcategory of Education" +msgid "Computer Science" +msgstr "វិទ្យាសាស្ត្រ​កុំព្យូទ័រ" + +#: ../src/plugins/menu-spec-common.c:62 +msgctxt "Menu subcategory of Education" +msgid "Construction" +msgstr "សំណង់" + +#: ../src/plugins/menu-spec-common.c:63 +msgctxt "Menu subcategory of Education" +msgid "Data Visualization" +msgstr "រូបភាព​ទិន្នន័យ" + +#: ../src/plugins/menu-spec-common.c:64 +msgctxt "Menu subcategory of Education" +msgid "Economy" +msgstr "សេដ្ឋកិច្ច" + +#: ../src/plugins/menu-spec-common.c:65 +msgctxt "Menu subcategory of Education" +msgid "Electricity" +msgstr "អគ្គិសនី" + +#: ../src/plugins/menu-spec-common.c:66 +msgctxt "Menu subcategory of Education" +msgid "Electronics" +msgstr "អេឡិចត្រូនិក" + +#: ../src/plugins/menu-spec-common.c:67 +msgctxt "Menu subcategory of Education" +msgid "Engineering" +msgstr "វិស្វករ" + +#: ../src/plugins/menu-spec-common.c:68 +msgctxt "Menu subcategory of Education" +msgid "Geography" +msgstr "ភូមិវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:69 +msgctxt "Menu subcategory of Education" +msgid "Geology" +msgstr "ភូគុព្ភវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:70 +msgctxt "Menu subcategory of Education" +msgid "Geoscience" +msgstr "ភូគុព្ភសាស្ត្រ" + +#: ../src/plugins/menu-spec-common.c:71 +msgctxt "Menu subcategory of Education" +msgid "History" +msgstr "ប្រវត្តិវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:72 +msgctxt "Menu subcategory of Education" +msgid "Humanities" +msgstr "មនុស្សធម៌" + +#: ../src/plugins/menu-spec-common.c:73 +msgctxt "Menu subcategory of Education" +msgid "Image Processing" +msgstr "ដំណើរការ​រូបភាព" + +#: ../src/plugins/menu-spec-common.c:74 +msgctxt "Menu subcategory of Education" +msgid "Languages" +msgstr "ភាសា" + +#: ../src/plugins/menu-spec-common.c:75 +msgctxt "Menu subcategory of Education" +msgid "Literature" +msgstr "អក្សរ​សាស្ត្រ" + +#: ../src/plugins/menu-spec-common.c:76 +msgctxt "Menu subcategory of Education" +msgid "Maps" +msgstr "ផែនទី" + +#: ../src/plugins/menu-spec-common.c:77 +msgctxt "Menu subcategory of Education" +msgid "Math" +msgstr "គណិត" + +#: ../src/plugins/menu-spec-common.c:78 +msgctxt "Menu subcategory of Education" +msgid "Medical" +msgstr "វេជ្ជសាស្ត្រ" + +#: ../src/plugins/menu-spec-common.c:79 +msgctxt "Menu subcategory of Education" +msgid "Music" +msgstr "តន្ត្រី" + +#: ../src/plugins/menu-spec-common.c:80 +msgctxt "Menu subcategory of Education" +msgid "Numerical Analysis" +msgstr "ការ​វិភាគ​ជា​លេខ" + +#: ../src/plugins/menu-spec-common.c:81 +msgctxt "Menu subcategory of Education" +msgid "Parallel Computing" +msgstr "ការ​គណនា​ស្រប​គ្នា" + +#: ../src/plugins/menu-spec-common.c:82 +msgctxt "Menu subcategory of Education" +msgid "Physics" +msgstr "រូបវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:83 +msgctxt "Menu subcategory of Education" +msgid "Robotics" +msgstr "មនុស្ស​យន្ត" + +#: ../src/plugins/menu-spec-common.c:84 +msgctxt "Menu subcategory of Education" +msgid "Spirituality" +msgstr "ផ្លូវ​ចិត្ត" + +#: ../src/plugins/menu-spec-common.c:85 +msgctxt "Menu subcategory of Education" +msgid "Sports" +msgstr "កីឡា" + +#. TRANSLATORS: this is the menu spec main category for Games +#: ../src/plugins/menu-spec-common.c:87 +msgid "Games" +msgstr "ហ្គេម" + +#: ../src/plugins/menu-spec-common.c:88 +msgctxt "Menu subcategory of Games" +msgid "Action" +msgstr "សកម្មភាព" + +#: ../src/plugins/menu-spec-common.c:89 +msgctxt "Menu subcategory of Games" +msgid "Adventure" +msgstr "ការ​ផ្សងព្រេង" + +#: ../src/plugins/menu-spec-common.c:90 +msgctxt "Menu subcategory of Games" +msgid "Arcade" +msgstr "ផ្សារ​ទំនើប" + +#: ../src/plugins/menu-spec-common.c:91 +msgctxt "Menu subcategory of Games" +msgid "Blocks" +msgstr "ទប់ស្កាត់" + +#: ../src/plugins/menu-spec-common.c:92 +msgctxt "Menu subcategory of Games" +msgid "Board" +msgstr "ក្ដារ" + +#: ../src/plugins/menu-spec-common.c:93 +msgctxt "Menu subcategory of Games" +msgid "Card" +msgstr "បៀរ​" + +#: ../src/plugins/menu-spec-common.c:94 +msgctxt "Menu subcategory of Games" +msgid "Emulators" +msgstr "អ្នក​ប្រណាំង" + +#: ../src/plugins/menu-spec-common.c:95 +msgctxt "Menu subcategory of Games" +msgid "Kids" +msgstr "កុមារ" + +#: ../src/plugins/menu-spec-common.c:96 +msgctxt "Menu subcategory of Games" +msgid "Logic" +msgstr "តក្កវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:97 +msgctxt "Menu subcategory of Games" +msgid "Role Playing" +msgstr "ការ​ដើរតួ" + +#: ../src/plugins/menu-spec-common.c:98 +msgctxt "Menu subcategory of Games" +msgid "Shooter" +msgstr "អ្នក​បាញ់" + +#: ../src/plugins/menu-spec-common.c:99 +msgctxt "Menu subcategory of Games" +msgid "Simulation" +msgstr "ការ​ក្លែងធ្វើ" + +#: ../src/plugins/menu-spec-common.c:100 +msgctxt "Menu subcategory of Games" +msgid "Sports" +msgstr "កីឡា" + +#: ../src/plugins/menu-spec-common.c:101 +msgctxt "Menu subcategory of Games" +msgid "Strategy" +msgstr "យុទ្ធសាស្ត្រ" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: ../src/plugins/menu-spec-common.c:103 +msgid "Graphics" +msgstr "ក្រាហ្វិក" + +#: ../src/plugins/menu-spec-common.c:104 +msgctxt "Menu subcategory of Graphics" +msgid "2D Graphics" +msgstr "ក្រាហ្វិក​ទ្វេ​មាត្រ" + +#: ../src/plugins/menu-spec-common.c:105 +msgctxt "Menu subcategory of Graphics" +msgid "3D Graphics" +msgstr "ក្រាហ្វិក​ត្រីមាត្រ" + +#: ../src/plugins/menu-spec-common.c:106 +msgctxt "Menu subcategory of Graphics" +msgid "OCR" +msgstr "OCR" + +#: ../src/plugins/menu-spec-common.c:107 +msgctxt "Menu subcategory of Graphics" +msgid "Photography" +msgstr "រូបថត" + +#: ../src/plugins/menu-spec-common.c:108 +msgctxt "Menu subcategory of Graphics" +msgid "Publishing" +msgstr "បោះពុម្ពផ្សាយ" + +#: ../src/plugins/menu-spec-common.c:109 +msgctxt "Menu subcategory of Graphics" +msgid "Raster Graphics" +msgstr "ក្រាហ្វិក​រ៉ាស្ទ័រ" + +#: ../src/plugins/menu-spec-common.c:110 +msgctxt "Menu subcategory of Graphics" +msgid "Scanning" +msgstr "ការ​វិភាគ" + +#: ../src/plugins/menu-spec-common.c:111 +msgctxt "Menu subcategory of Graphics" +msgid "Vector Graphics" +msgstr "ក្រាហ្វិក​វ៉ិចទ័រ" + +#: ../src/plugins/menu-spec-common.c:112 +msgctxt "Menu subcategory of Graphics" +msgid "Viewer" +msgstr "កម្មវិធី​មើល" + +#. TRANSLATORS: this is the menu spec main category for Network +#: ../src/plugins/menu-spec-common.c:114 +msgid "Internet" +msgstr "អ៊ីនធឺណិត" + +#: ../src/plugins/menu-spec-common.c:115 +msgctxt "Menu subcategory of Network" +msgid "Chat" +msgstr "ជជែក" + +#: ../src/plugins/menu-spec-common.c:116 +msgctxt "Menu subcategory of Network" +msgid "Dialup" +msgstr "ចុច" + +#: ../src/plugins/menu-spec-common.c:117 +msgctxt "Menu subcategory of Network" +msgid "Email" +msgstr "អ៊ីមែល" + +#: ../src/plugins/menu-spec-common.c:118 +msgctxt "Menu subcategory of Network" +msgid "Feed" +msgstr "អត្ថបទព័ត៌មាន" + +#: ../src/plugins/menu-spec-common.c:119 +msgctxt "Menu subcategory of Network" +msgid "File Transfer" +msgstr "ការ​ផ្ទេរ​ឯកសារ" + +#: ../src/plugins/menu-spec-common.c:120 +msgctxt "Menu subcategory of Network" +msgid "Ham Radio" +msgstr "វិទ្យុ Ham" + +#: ../src/plugins/menu-spec-common.c:121 +msgctxt "Menu subcategory of Network" +msgid "Instant Messaging" +msgstr "ការ​ផ្ញើសារ​បន្ទាន់" + +#: ../src/plugins/menu-spec-common.c:122 +msgctxt "Menu subcategory of Network" +msgid "IRC Clients" +msgstr "ម៉ាស៊ីន​កូន IRC" + +#: ../src/plugins/menu-spec-common.c:123 +msgctxt "Menu subcategory of Network" +msgid "Monitor" +msgstr "ត្រួតពិនិត្យ" + +#: ../src/plugins/menu-spec-common.c:124 +msgctxt "Menu subcategory of Network" +msgid "News" +msgstr "ព័ត៌មាន" + +#: ../src/plugins/menu-spec-common.c:125 +msgctxt "Menu subcategory of Network" +msgid "P2P" +msgstr "P2P" + +#: ../src/plugins/menu-spec-common.c:126 +msgctxt "Menu subcategory of Network" +msgid "Remote Access" +msgstr "ការ​ចូល​ដំណើរការ​ពី​ចម្ងាយ" + +#: ../src/plugins/menu-spec-common.c:127 +msgctxt "Menu subcategory of Network" +msgid "Telephony" +msgstr "ទូរស័ព្ទ" + +#: ../src/plugins/menu-spec-common.c:128 +msgctxt "Menu subcategory of Network" +msgid "Video Conference" +msgstr "សន្និសីទ​វីដេអូ" + +#: ../src/plugins/menu-spec-common.c:129 +msgctxt "Menu subcategory of Network" +msgid "Web Browser" +msgstr "កម្មវិធីរុករក​បណ្ដាញ" + +#: ../src/plugins/menu-spec-common.c:130 +msgctxt "Menu subcategory of Network" +msgid "Web Development" +msgstr "ការ​អភវិឌ្ឍន៍​បណ្ដាញ" + +#. TRANSLATORS: this is the menu spec main category for Office +#: ../src/plugins/menu-spec-common.c:132 +msgid "Office" +msgstr "ការិយាល័យ" + +#: ../src/plugins/menu-spec-common.c:133 +msgctxt "Menu subcategory of Office" +msgid "Calendar" +msgstr "ប្រតិទិន" + +#: ../src/plugins/menu-spec-common.c:134 +msgctxt "Menu subcategory of Office" +msgid "Chart" +msgstr "គំនូស​តាង" + +#: ../src/plugins/menu-spec-common.c:135 +msgctxt "Menu subcategory of Office" +msgid "Contact Management" +msgstr "ការ​គ្រប់គ្រង​ទំនាក់ទំនង" + +#: ../src/plugins/menu-spec-common.c:136 +msgctxt "Menu subcategory of Office" +msgid "Database" +msgstr "មូលដ្ឋាន​ទិន្នន័យ" + +#: ../src/plugins/menu-spec-common.c:137 +msgctxt "Menu subcategory of Office" +msgid "Dictionary" +msgstr "វចនានុក្រម" + +#: ../src/plugins/menu-spec-common.c:138 +msgctxt "Menu subcategory of Office" +msgid "Email" +msgstr "អ៊ីមែល" + +#: ../src/plugins/menu-spec-common.c:139 +msgctxt "Menu subcategory of Office" +msgid "Finance" +msgstr "ហិរញ្ញវត្ថុ" + +#: ../src/plugins/menu-spec-common.c:140 +msgctxt "Menu subcategory of Office" +msgid "Flow Chart" +msgstr "គំនូស​តាង​លំហូរ" + +#: ../src/plugins/menu-spec-common.c:141 +msgctxt "Menu subcategory of Office" +msgid "PDA" +msgstr "PDA" + +#: ../src/plugins/menu-spec-common.c:142 +msgctxt "Menu subcategory of Office" +msgid "Photography" +msgstr "រូបថត" + +#: ../src/plugins/menu-spec-common.c:143 +msgctxt "Menu subcategory of Office" +msgid "Presentation" +msgstr "ការ​បង្ហាញ" + +#: ../src/plugins/menu-spec-common.c:144 +msgctxt "Menu subcategory of Office" +msgid "Project Management" +msgstr "ការ​គ្រប់គ្រង​គម្រោង" + +#: ../src/plugins/menu-spec-common.c:145 +msgctxt "Menu subcategory of Office" +msgid "Publishing" +msgstr "ការបោះពុម្ពផ្សាយ" + +#: ../src/plugins/menu-spec-common.c:146 +msgctxt "Menu subcategory of Office" +msgid "Spreadsheet" +msgstr "សៀវភៅ​បញ្ជី" + +#: ../src/plugins/menu-spec-common.c:147 +msgctxt "Menu subcategory of Office" +msgid "Viewer" +msgstr "កម្មវិធី​មើល" + +#: ../src/plugins/menu-spec-common.c:148 +msgctxt "Menu subcategory of Office" +msgid "Word Processor" +msgstr "កម្មវិធី​វាយ​អត្ថបទ" + +#. TRANSLATORS: this is the menu spec main category for Science +#: ../src/plugins/menu-spec-common.c:150 +msgid "Science" +msgstr "វិទ្យាសាស្ត្រ" + +#: ../src/plugins/menu-spec-common.c:151 +msgctxt "Menu subcategory of Science" +msgid "Art" +msgstr "សិល្បៈ" + +#: ../src/plugins/menu-spec-common.c:152 +msgctxt "Menu subcategory of Science" +msgid "Artificial Intelligence" +msgstr "ទំនាក់ទំនងក្លែងក្លាយ" + +#: ../src/plugins/menu-spec-common.c:153 +msgctxt "Menu subcategory of Science" +msgid "Astronomy" +msgstr "តារាវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:154 +msgctxt "Menu subcategory of Science" +msgid "Biology" +msgstr "ជីវវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:155 +msgctxt "Menu subcategory of Science" +msgid "Chemistry" +msgstr "គីមីវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:156 +msgctxt "Menu subcategory of Science" +msgid "Computer Science" +msgstr "វិទ្យាសាស្ត្រ​កុំព្យូទ័រ" + +#: ../src/plugins/menu-spec-common.c:157 +msgctxt "Menu subcategory of Science" +msgid "Construction" +msgstr "សំណង់" + +#: ../src/plugins/menu-spec-common.c:158 +msgctxt "Menu subcategory of Science" +msgid "Data Visualization" +msgstr "ការ​បង្ហាញ​ទិន្នន័យ" + +#: ../src/plugins/menu-spec-common.c:159 +msgctxt "Menu subcategory of Science" +msgid "Economy" +msgstr "សេដ្ឋកិច្ច" + +#: ../src/plugins/menu-spec-common.c:160 +msgctxt "Menu subcategory of Science" +msgid "Electricity" +msgstr "អគ្គិសនី" + +#: ../src/plugins/menu-spec-common.c:161 +msgctxt "Menu subcategory of Science" +msgid "Electronics" +msgstr "អេឡិចត្រូនិក" + +#: ../src/plugins/menu-spec-common.c:162 +msgctxt "Menu subcategory of Science" +msgid "Engineering" +msgstr "វិស្វករ" + +#: ../src/plugins/menu-spec-common.c:163 +msgctxt "Menu subcategory of Science" +msgid "Geography" +msgstr "ភូមិវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:164 +msgctxt "Menu subcategory of Science" +msgid "Geology" +msgstr "ភូគុព្ភវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:165 +msgctxt "Menu subcategory of Science" +msgid "Geoscience" +msgstr "ភូគុព្ភសាស្ត្រ" + +#: ../src/plugins/menu-spec-common.c:166 +msgctxt "Menu subcategory of Science" +msgid "History" +msgstr "ប្រវត្តិវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:167 +msgctxt "Menu subcategory of Science" +msgid "Humanities" +msgstr "មនុស្ស​ធម៌" + +#: ../src/plugins/menu-spec-common.c:168 +msgctxt "Menu subcategory of Science" +msgid "Image Processing" +msgstr "ដំណើរការ​រូបភាព" + +#: ../src/plugins/menu-spec-common.c:169 +msgctxt "Menu subcategory of Science" +msgid "Languages" +msgstr "ភាសា" + +#: ../src/plugins/menu-spec-common.c:170 +msgctxt "Menu subcategory of Science" +msgid "Literature" +msgstr "អក្សរសាស្ត្រ" + +#: ../src/plugins/menu-spec-common.c:171 +msgctxt "Menu subcategory of Science" +msgid "Maps" +msgstr "ផែនទី" + +#: ../src/plugins/menu-spec-common.c:172 +msgctxt "Menu subcategory of Science" +msgid "Math" +msgstr "គណិត" + +#: ../src/plugins/menu-spec-common.c:173 +msgctxt "Menu subcategory of Science" +msgid "Medical" +msgstr "វេជ្ជសាស្ត្រ" + +#: ../src/plugins/menu-spec-common.c:174 +msgctxt "Menu subcategory of Science" +msgid "Numerical Analysis" +msgstr "ការ​វិភាគ​ជា​លេខ" + +#: ../src/plugins/menu-spec-common.c:175 +msgctxt "Menu subcategory of Science" +msgid "Parallel Computing" +msgstr "ការ​គណនា​ស្រប" + +#: ../src/plugins/menu-spec-common.c:176 +msgctxt "Menu subcategory of Science" +msgid "Physics" +msgstr "រូបវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:177 +msgctxt "Menu subcategory of Science" +msgid "Robotics" +msgstr "មនុស្ស​យន្ត" + +#: ../src/plugins/menu-spec-common.c:178 +msgctxt "Menu subcategory of Science" +msgid "Spirituality" +msgstr "ផ្លូវចិត្ត" + +#: ../src/plugins/menu-spec-common.c:179 +msgctxt "Menu subcategory of Science" +msgid "Sports" +msgstr "កីឡា" + +#. TRANSLATORS: this is the menu spec main category for System +#: ../src/plugins/menu-spec-common.c:181 +msgid "System" +msgstr "ប្រព័ន្ធ" + +#: ../src/plugins/menu-spec-common.c:182 +msgctxt "Menu subcategory of System" +msgid "Emulator" +msgstr "វត្ថុ​ត្រាប់​តាម" + +#: ../src/plugins/menu-spec-common.c:183 +msgctxt "Menu subcategory of System" +msgid "File Manager" +msgstr "កម្មវិធីគ្រប់គ្រង​ឯកសារ" + +#: ../src/plugins/menu-spec-common.c:184 +msgctxt "Menu subcategory of System" +msgid "File System" +msgstr "ប្រព័ន្ធ​ឯកសារ" + +#: ../src/plugins/menu-spec-common.c:185 +msgctxt "Menu subcategory of System" +msgid "File Tools" +msgstr "ឧបករណ៍​ឯកសារ" + +#: ../src/plugins/menu-spec-common.c:186 +msgctxt "Menu subcategory of System" +msgid "Monitor" +msgstr "ត្រួតពិនិត្យ" + +#: ../src/plugins/menu-spec-common.c:187 +msgctxt "Menu subcategory of System" +msgid "Security" +msgstr "សុវត្ថិភាព" + +#: ../src/plugins/menu-spec-common.c:188 +msgctxt "Menu subcategory of System" +msgid "Terminal Emulator" +msgstr "វត្ថុ​ត្រាប់តាម​ស្ថានីយ" + +#. TRANSLATORS: this is the menu spec main category for Utility +#: ../src/plugins/menu-spec-common.c:190 +msgid "Utilities" +msgstr "ការ​​ប្រើប្រាស់" + +#: ../src/plugins/menu-spec-common.c:191 +msgctxt "Menu subcategory of Utility" +msgid "Accessibility" +msgstr "មធ្យោបាយ​ងាយស្រួល" + +#: ../src/plugins/menu-spec-common.c:192 +msgctxt "Menu subcategory of Utility" +msgid "Archiving" +msgstr "ប័ណ្ណសារ" + +#: ../src/plugins/menu-spec-common.c:193 +msgctxt "Menu subcategory of Utility" +msgid "Calculator" +msgstr "ម៉ាស៊ីន​គិតលេខ" + +#: ../src/plugins/menu-spec-common.c:194 +msgctxt "Menu subcategory of Utility" +msgid "Clock" +msgstr "នាឡិកា" + +#: ../src/plugins/menu-spec-common.c:195 +msgctxt "Menu subcategory of Utility" +msgid "Compression" +msgstr "ការ​បង្ហាប់" + +#: ../src/plugins/menu-spec-common.c:196 +msgctxt "Menu subcategory of Utility" +msgid "File Tools" +msgstr "ឧបករណ៍​ឯកសារ" + +#: ../src/plugins/menu-spec-common.c:197 +msgctxt "Menu subcategory of Utility" +msgid "Maps" +msgstr "ផែនទី" + +#: ../src/plugins/menu-spec-common.c:198 +msgctxt "Menu subcategory of Utility" +msgid "Spirituality" +msgstr "ចិត្តវិទ្យា" + +#: ../src/plugins/menu-spec-common.c:199 +msgctxt "Menu subcategory of Utility" +msgid "Telephony Tools" +msgstr "ឧបករណ៍​ទូរស័ព្ទ" + +#: ../src/plugins/menu-spec-common.c:200 +msgctxt "Menu subcategory of Utility" +msgid "Text Editor" +msgstr "កម្មវិធីកែ​អត្ថបទ" + +#. TRANSLATORS: this is the menu spec main category for Video +#: ../src/plugins/menu-spec-common.c:202 +msgid "Video" +msgstr "វីដេអូ" + +#: ../src/plugins/menu-spec-common.c:203 +msgctxt "Menu subcategory of Video" +msgid "Editing" +msgstr "កែសម្រួល" + +#: ../src/plugins/menu-spec-common.c:204 +msgctxt "Menu subcategory of Video" +msgid "Database" +msgstr "មូលដ្ឋាន​ទិន្នន័យ" + +#: ../src/plugins/menu-spec-common.c:205 +msgctxt "Menu subcategory of Video" +msgid "Disc Burning" +msgstr "ការ​ដុតថាស" + +#: ../src/plugins/menu-spec-common.c:206 +msgctxt "Menu subcategory of Video" +msgid "Players" +msgstr "កម្មវិធីចាក់" + +#: ../src/plugins/menu-spec-common.c:207 +msgctxt "Menu subcategory of Video" +msgid "Recorders" +msgstr "កម្មវិធី​ថត" + +#: ../src/plugins/menu-spec-common.c:208 +msgctxt "Menu subcategory of Video" +msgid "TV" +msgstr "ទូរទស្សន៍" + +#: ../src/plugins/menu-spec-common.c:211 +msgctxt "Menu subcategory of Addons" +msgid "Fonts" +msgstr "ពុម្ពអក្សរ" + +#: ../src/plugins/menu-spec-common.c:212 +msgctxt "Menu subcategory of Addons" +msgid "Codecs" +msgstr "កូឌិក" + +#: ../src/plugins/menu-spec-common.c:213 +msgctxt "Menu subcategory of Addons" +msgid "Input Sources" +msgstr "ប្រភព​បញ្ចូល" + +#: ../src/plugins/menu-spec-common.c:214 +msgctxt "Menu subcategory of Addons" +msgid "Language Packs" +msgstr "កញ្ចប់​ភាសា" diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..58961c1 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,6704 @@ +# Korean translation for gnome-software. +# Copyright (C) 2013 gnome-software's all of contributors. +# This file is distributed under the same license as the gnome-software package. +# Seong-ho Cho , 2013-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-21 13:46+0000\n" +"PO-Revision-Date: 2025-02-26 01:21+0900\n" +"Last-Translator: Seong-ho Cho \n" +"Language-Team: GNOME Korea \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.5\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "소프트웨어" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "앱을 설치하고 업데이트합니다" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"소프트웨어에서 새 앱과 시스템 확장을 찾아 설치할 수 있고, 기존에 설치한 앱을 " +"제거할 수 있습니다." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"소프트웨어 프로그램은 각각의 추천 항목과 인기 있는 앱을 요긴한 설명과 여러가" +"지 미리보기 화면을 곁들여 선보입니다. 분류 목록을 탐색하거나 검색을 통해 앱" +"을 찾을 수 있습니다. 오프라인 업데이트를 사용하여 시스템을 업데이트할 수도 있" +"습니다." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "개요 패널" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "세부 정보 패널" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "설치한 항목 패널" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "업데이트 패널" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "업데이트 세부 항목" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "그놈 프로젝트" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Shim UEFI의 akmods 키 시험" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Shim UEFI에서 akmods 키를 시험하려면 인증이 필요합니다" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Shim UEFI에 akmods 키 등록" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Shim UEFI에 akmods 키를 등록하려면 인증이 필요합니다" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Shim UEFI에서 DKMS 키 시험" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Shim UEFI에서 DKMS 키를 시험하려면 인증이 필요합니다" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Shim UEFI에 DKMS 키 등록" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Shim UEFI에 DKMS 키를 등록하려면 인증이 필요합니다" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "시스템 관리 위치에 appstream 파일 설치" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "시스템 관리 위치에 appstream 파일을 설치합니다" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "호환 프로젝트 목록" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "그놈, KDE, XFCE와 같이 나타낼 호환 프로젝트 목록입니다." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "그놈 소프트웨어 업데이트 및 업그레이드 관리 여부" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"비활성화하면, 그놈 소프트웨어는 업데이트 패널을 숨기며 자동 업데이트 동작을 " +"수행하거나 업그레이드 여부를 물어보지 않습니다." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "업데이트를 자동으로 다운로드하고 설치" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"설정을 활성화하면, 그놈 소프트웨어는 백그라운드에서 업데이트를 자동으로 다운" +"로드하며, 재시작이 필요치 않은 항목을 설치합니다." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "백그라운드 프로그램 업데이트를 사용자에게 알림" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"활성화하면, 그놈 소프트웨어에서 사용자가 아무런 일을 하지 않을 때 업데이트 진" +"행 여부를 알립니다." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "종량제 연결을 활용할 때 자동으로 새로 고침 여부" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"활성하면, 그놈 소프트웨어는 자동으로 종량제 연결을 활용하더라도 백그라운드에" +"서 상태를 새로 고칩니다(일부 메타데이터를 다운로드하고, 업데이트를 검사하는 " +"등의 동작으로 추가 요금이 발생할 수 있음)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "그놈 소프트웨어 처음 실행 여부" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "프로그램 옆에 별점 표시" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "원격 기본 브랜치 세트를 기반으로 프로그램 구분" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "독점 프로그램을 설치하기 전 경고 대화상자 표시" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"독점 프로그램을 설치할 때 경고 대화상자를 표시할 수 있습니다. 대화 상자를 표" +"시 여부를 다룹니다." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "최근 업데이트 확인 타임스탬프" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "최근 업그레이드 알림 타임스탬프" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "최근 업데이트 알림 타임스탬프" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "첫 보안 업데이트 실시 후 정리한 타임스탬프" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "최근 업데이트 타임스탬프" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "업스트림 스크린샷을 검증할 초단위 경과 시간은 여전히 유효합니다" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"큰 값을 설정하면 원격 서버 접근 횟수는 적어지지만 사용자에게 보여줄 스크린샷 " +"업데이트 시간이 오래걸릴 수 있습니다. 0 값은 캐시에 이미 그림이 있을 경우 검" +"사하지 않음을 의미합니다." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "프로그램 평가에 활용할 서버" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "평가에 대한 최소 카르마 점수" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "이 숫자보다 적은 카르마를 보유한 평가는 나타나지 않습니다." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "제 3자 공급원으로 간주하지 않는 공식 저장소 목록" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "사용 중지하거나 제거할 수 없는 필수 저장소 목록" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "자유 프로그램으로 간주하는 공식 저장소 목록" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "자유 프로그램으로 간주하는 프로그램 항목에 활용할 라이선스 URL" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "가능한 시스템에 모든 사용자용 번들 프로그램 설치" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "프로그램 저장소 대화상자 접근 허용" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "릴리스 이전판 업그레이드 제공" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "사용자에게 비 자유 앱을 알리는 일부 UI 구성 요소 표시" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "설치 프로그램 목록에 앱 설치 크기 표시" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" +"'https://ko.wikipedia.org/wiki/" +"%EC%82%AC%EC%9C%A0_%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "비 자유-상업용 프로그램을 나타내는 URI" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "swcatalog 폴더로 다운로드할 appstream 파일을 가리키는 URL 목록" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"모든 사용자가 활용할 시스템 경로에 AppStream 파일을 설치합니다. 거짓으로 설정" +"했다면, 해당 파일을 비표준 $XDG_DATA_HOME/swcatalog/xml 디렉터리 경로에 설치" +"합니다" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"선호하는 패키징 형식 우선순위에 따라 중요한 순으로 나타냅니다. 빈 배열은 기" +"본 순서를 나타냅니다. 형식을 생략하면 가장 뒤로 정렬함을 간주합니다. 패키징 " +"형식의 예로 deb, flatpak, rpm, snap이 있습니다. 원래 형식 이름을 'flatpak:" +"flathub'처럼 콜론으로 구분하여 지정할 수 있습니다." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "사용하지 않는 플랫팩 런타임을 제거하려 한 최종 타임스탬프" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"자유 라이선스 앱만 표시하고 상업용 앱을 가리려면 '참'으로 설정하십시오." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "개발자 신원을 인증한 앱만 나타내려면 '참'으로 설정하십시오." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "최근 수신한 기록 업데이트의 타임스탬프입니다." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "로그인 할 때 사용하려 gnome-online-account에 저장하는 ID 문자열" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "그놈 소프트웨어 AppStream 시스템 범위 설치 프로그램" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "명령행 인자 해석에 실패했습니다" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "정확히 파일 이름 하나를 지정해야합니다" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "이 프로그램은 루트 사용자만 활용할 수 있습니다" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "내용 형식 검증에 실패했습니다: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "이동 실패: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "프로그램 설치" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "선택한 프로그램을 시스템에 설치" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "만화 수준 폭력" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "만화 폭력 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "판타지 폭력" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "공상적 폭력 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "사실적인 폭력" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "사실적 폭력 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "유혈 묘사 폭력" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "혈흔 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "성폭력" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "성폭력 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "주류" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "주류 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "마약" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "불법 약물 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "담배" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "담배 상품 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "노출" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "나체류 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "성적 요소" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "성적 본성 묘사 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "비속어" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "비속어 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "부적절한 유머" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "부적절한 유머 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "차별" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "차별 언어 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "광고" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "광고 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "도박" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "도박 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "구매" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "금전 소비 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "타인과의 문자 대화" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "타 사용자와의 문자 대화 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "타인과의 음성 대화" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "타 사용자와의 음성 대화 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "연락처 상세 정보" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "소셜 네트워크 사용자 이름 또는 전자메일 주소 공유 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "식별 정보" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "제 3자 업체와의 사용자 정보 공유 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "위치 공유" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "타인과의 위치 정보 공유 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "동성애" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "동성애 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "성매매" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "매춘 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "간통" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "간통 관련 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "성적 대상화 주인공" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "성적 대상 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "신성 모독" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "신성 모독 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "시체" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "시체 노출 내용 없음" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "노예" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "노예 관련 내용 없음" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "약물 관련 내용 없음" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "욕설, 비속어, 악담 내용 없음" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "광고, 송금 내용 없음" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "성적 표현 또는 나체 내용 없음" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "비통제 대화 기능 없음" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "폭력 내용 없음" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "약물" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "악담" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "현금" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "사회" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "폭력" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "모두" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s에 알 수 없는 연령 등급 정보가 있습니다" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s이(가) 전연령에 적합합니다" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s이(가) 유아에게 적합합니다" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s이(가) 어린이에게 적합합니다" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s은(는) 어린이에게 적합합니다" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s이(가) 10대 연령에 적합합니다" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s이(가) 성인에게 적합합니다" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%1$s이(가) %2$s에 적합합니다" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "연령별 등급" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "누락 정보 기여 방법(_H)" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "로컬 파일" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "패키지" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "대기중" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "설치 대기" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "제거 대기" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "설치중" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "제거중" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "다운로드 중" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "설치(_I)" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "설치 제거(_U)…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "네트워크" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "네트워크 통신할 수 있습니다" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "시스템 서비스" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "시스템 버스에서 D-Bus 서비스에 접근할 수 있습니다" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "세션 서비스" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "세션 버스에서 D-Bus 서비스에 접근할 수 있습니다" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "장치" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "웹캠 같은 장치에 순차 접근할 수 있음" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "입력 장치에 접근할 수 없습니다" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "마이크와 오디오 재생에 접근할 수 있습니다" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "시스템 장치 파일에 접근할 수 있습니다" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "화면 내용" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "화면 내용에 접근할 수 있음" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "내 폴더" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "파일 내용을 보고 편집하고 만들 수 있습니다" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "파일 내용을 볼 수 있습니다" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "파일 시스템" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "다운로드 폴더" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "설정" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "임의 설정을 보고 바꿀 수 있습니다" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "이전 디스플레이 시스템" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "오래된, 안전하지 않은 디스플레이 시스템을 사용합니다" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "샌드박스 외부 동작" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "샌드박스를 벗어나서 제한 요소를 회피할 수 있습니다" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "업데이트 설명이 없습니다." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "업데이트 세부 항목" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "추가 권한 필요" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "서버에서 부적절한 등급 데이터를 받았습니다" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "등급 지정 서버와 통신할 수 없습니다" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "평가" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "이 앱의 평가가 없습니다." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "평가 없음" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "버전 기록" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "%s 새 버전이 있습니다" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "버전 %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "이 릴리스의 세부 정보가 없습니다" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%Y년 %B %e일" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "시작 모드: ‘updates’, ‘updated’, ‘installed’, ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "<모드>" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "프로그램 검색" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "<검색>" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "프로그램 세부 정보 표시(application ID 사용)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "프로그램 세부 정보 표시(패키지 이름 사용)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "<패키지이름>" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "프로그램 설치(application ID 사용)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "프로그램 설치 제거(application ID 사용)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "로컬 패키지 파일 열기" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "<파일이름>" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "이 동작에 따른 상호 반응 형태: ‘none’, ‘notify’, ‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "<상호작용>" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "로컬 metainfo 또는 appdata 파일 표시" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "자세한 디버깅 출력 활성(실행 중일 경우 실행 인스턴스 출력)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "백그라운드에서 업데이트 대기 중인 항목 설치" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "기본 설정 표시" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "실행 인스턴스 끝내기" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "로컬 파일 공급원을 앱스트림에 준비" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "버전 번호 표시" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 GNOME Software contributors" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "조성호 " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "죄송합니다! 해당 프로그램의 세부 정보가 없습니다." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "설치 용량" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "%s 데이터와 %s 캐시 포함" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "%s 데이터 포함" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "%s 캐시 포함" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "캐시, 데이터 사용여부 알 수 없음" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "다운로드 용량" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "추가 시스템 다운로드가 필요하지 않음" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "알 수 없는 용량의 추가 시스템 다운로드 필요" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "%s의 추가 시스템 다운로드 필요" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "알 수 없는 용량" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "권한 없음" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "네트워크 접근" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "시스템 서비스 활용" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "세션 서비스 활용" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "하드웨어 장치에 접근할 수 있음" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "시스템 장치에 접근할 수 있습니다" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "모든 데이터를 읽고 쓸 수 있음" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "모든 데이터를 읽을 수 있음" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "다운로드를 읽고 쓸 수 있음" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "다운로드를 읽을 수 있음" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "일부 특정 파일에 접근할 수 있음" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "사용자 설정에 접근하고 바꿀 수 있음" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "이전 윈도우 시스템 사용" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "임의 권한이 필요할 수 있습니다" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "검증된 프로그램 개발자" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "운영체제 배포판에서 검토함" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "%s이(가) 검토함" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "제 3자 공급원에서 제공" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "소프트웨어를 더 이상 지원하지 않습니다" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "검수할 수 있는 코드" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "알 수 없는 라이선스" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "상업용 코드" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "별도 라이선스" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "관리자 권한 필요" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "안전함" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "안전한 것 같음" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "잠재적으로 불안전" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "안전하지 않음" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "모바일 전용" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "작은 화면에서만 동작" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "데스크톱 전용" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "큰 화면에서만 동작" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "화면 크기가 일치하지 않습니다" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "현재 화면 크기를 지원하지 않음" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "터치스크린이 필요합니다" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "키보드가 필요합니다" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "마우스가 필요합니다" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "게임패드 필요" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "실행에 게임패드가 필요합니다" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "적응형" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "폰, 태블릿, 데스크톱에서 동작" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "아마도 키보드 또는 마우스가 필요할 지도 모릅니다" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "데스크톱 및 랩톱에서 동작" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "연령 부적합 내용이 들어있습니다" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "연령 등급 정보가 없습니다" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "웹사이트 방문" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "설치…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "취소" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "설치" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "다운로드" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "업데이트" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "설치 제거…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "설치 제거중" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "중요 업데이트" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "업데이트 하는 동안 장치를 사용할 수 없습니다." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "공급원: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "%s(에)서 이름을 바꿨습니다" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "업데이트 수신을 멈췄습니다" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "중요 업데이트" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "설치함" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "%s 번역 돕기" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s은(는) 기여자 국제 모임에서 설계, 개발, 번역합니다.\n" +"\n" +"원하는 언어가 아직 없을 수 있긴 하지만, 직접 참여하여 번역을 도울 수 있습니" +"다." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "번역" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "웹사이트 번역(_T)" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "원격 %s에 로그인해야합니다(%s 영역)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "로그인 필요" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "취소(_C)" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "로그인(_L)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "사용자(_U)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "암호(_P)" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "기타" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "모두" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "추천" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "편집자 추천" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "최신" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "웹 추천" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "기타 프로그램" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s 설치함" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "바뀐 내용대로 동작하게 하려면 다시 시작해야합니다" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "앱 사용 준비를 마쳤습니다" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "시스템 업데이트를 설치했습니다" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "최근 설치한 업데이트를 평가할 수 있습니다" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "다시 시작" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "실행" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "프로그램을 설치합니까?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "제 3자 프로그램을 설치합니까?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "프로그램 저장소를 활용하시겠습니까?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "제 3자 프로그램 저장소를 활성화하시겠습니까?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s 프로그램은 자유 오픈 소스 소프트웨어가 아니며, “%s”에서 제공합니" +"다." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "“%2$s”에서 %1$s 프로그램을 제공함." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "설치를 계속하려면 이 프로그램 저장소를 활성화해야합니다." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "일부 국가에서는 %s 설치 및 사용이 법에 저촉될 수 있습니다." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "일부 국가에서는 이 코덱의 설치 및 사용이 법에 저촉될 수 있습니다." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "다시 경고 안함(_W)" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "활용 설정 및 설치(_I)" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "패키지 관리자의 자세한 오류 정보는 다음과 같습니다:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "자세히 보기" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "닫기(_C)" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "세부 내용을 클립보드에 복사했습니다" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "수락(_A)" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "업데이트를 설치했습니다" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "설치한 앱을 제거했습니다" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "제대로 동작하게 하려면 다시 시작해야합니다" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "아직 안함" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "오늘" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "어제" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d일 전" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d주 전" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d달 전" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d년 전" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "지금" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d분 전" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d시간 전" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "모두" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "추천" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D 그래픽" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "사진" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "스캐닝" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "벡터 그래픽" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "뷰어" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "오디오 창작 및 편집" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "음악 재생 프로그램" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "모두" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "추천" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "달력" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "데이터베이스" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "금융" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "워드프로세서" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "텍스트 편집기" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "웹 브라우저" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "모두" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "추천" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "액션" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "어드벤처" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "아케이드" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "블록" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "보드" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "카드" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "에뮬레이터" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "어린이" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "로직" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "롤플레잉" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "스포츠" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "전략" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "모두" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "추천" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "대화" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "모두" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "추천" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "인공지능" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "천문학" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "화학" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "언어" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "수학" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "뉴스" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "로봇 공학" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "예술" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "위인전" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "만화" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "소설" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "건강" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "역사" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "생활 방식" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "정치" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "스포츠" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "모두" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "추천" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "디버거" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "통합개발환경" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "코덱" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "하드웨어 드라이버" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "글꼴" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "입력기" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "언어팩" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "지역화" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "생산" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "업무" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "놀이" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "모임" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "학습" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "개발" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "코덱" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "하드웨어 드라이버" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "글꼴" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "입력기" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "언어팩" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "지역화" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "앱" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s이(가) 추가 파일 형식 지원을 요청합니다." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "추가 MIME 형식이 필요함" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s이(가) 추가 글꼴을 요청합니다." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "추가 글꼴이 필요함" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s이(가) 추가 멀티미디어 코덱을 요청합니다." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "추가 멀티미디어 코덱이 필요함" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s이(가) 추가 프린터 드라이버를 요청합니다." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "추가 프린터 드라이버가 필요함" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s이(가) 추가 패키지를 요청합니다." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "추가 패키지가 필요함" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "소프트웨어에서 찾기" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "더 보기(_S)" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "줄여보기(_S)" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "제거중…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "설치를 끝내려면 다시 시작해야합니다" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "제거를 끝내려면 다시 시작해야합니다" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "설치 대기중…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "업데이트 대기중…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "다운로드 중…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "준비중…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "설치 제거중…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s은(는) 설치하지 않았지만 여전히 데이터가 남아있습니다." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "다시 시작(_R)" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "활성(_E)…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "설치(_I)…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s은(는) 미국 영어로 나타납니다" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "이 앱은 미국 영어로 나타납니다" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "이 프로그램은 미국 영어로 나타납니다" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "번역 지원(_T)" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "%s의 다른 앱" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "%s 개발자가 %s 소유자임을 확인함" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "개발자가 %s 소유자임을 확인함" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "평가를 작성하려면 인터넷 연결이 필요합니다" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "이 앱은 더 이상 보안 수정 등의 업데이트가 없습니다" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "이 앱은 이미 배포판에서 제공하고 있으며, 바뀌면 안됩니다." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "이 앱에는 웹사이트, 코드 저장소 또는 문제 추적 사이트 링크가 없습니다." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "이 프로그램은 더 이상 보안 수정 등의 업데이트가 없습니다" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"이 프로그램은 이미 배포판에서 제공하며 다른 프로그램으로 바꿀 수 없습니다." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"이 프로그램은 웹사이트, 코드 저장소 또는 문제 추적 사이트 링크가 없습니다." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"소프트웨어에서 “%s” 정보 수신에 실패하여 이 앱의 자세한 정보를 표시할 수 없습" +"니다." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "서버에서 부적절한 평가 응답을 받았습니다" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "“%s” 평가 제출에 실패했습니다: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "세부 정보 페이지" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "앱 세부 정보 불러오는 중" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "검증됨" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "열기(_O)" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "업데이트(_U)" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "설치 제거" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "추가 프로그램" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "이 앱은 인터넷에 연결되어 있을 때만 사용할 수 있습니다." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "포함된 프로그램 저장소" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"이 앱에는 다른 프로그램처럼 접근하여 업데이트를 제공하는 프로그램 저장소가 있" +"습니다." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "포함된 프로그램 저장소 없음" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"이 앱에는 프로그램 저장소가 없습니다. 새 버전으로 업데이트하지 않겠습니다." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "식별된 프로그램 저장소" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"이 프로그램 저장소을 추가하면 추가 프로그램과 업그레이드에 접근할 수 있습니" +"다." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "신뢰하는 프로그램 저장소만 사용합니다." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "앱 데이터 지우기" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "데이터 삭제(_E)" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "메타데이터 없음" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "프로젝트 웹사이트(_W)" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "기부(_D)" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "번역 기여(_T)" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "문제 보고(_R)" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "도움말(_H)" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "연락하기(_C)" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "평가 작성(_E)" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "모든 평가" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "앱 상세 정보를 보여줄 수 없습니다" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "다시 시작 준비에 실패했습니다" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "알 수 없는 오류" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "키를 찾을 수 없습니다" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "키를 등록하지 않았습니다" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK 등록이 필요합니다" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "다음(_N)" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"이 장치에서 보안 부팅을 사용합니다. 새 드라이버를 사용하려면 새 장치 소유자 " +"키(MOK)를 등록해야 합니다. 이 과정을 진행하는 도중 암호 입력이 필요합니다. 다" +"음 키 관련 암호를 어딘가에 기록해두십시오:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "MOK 키 암호를 기록해두었습니다(_P)" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "다시 시작하고 등록(_R)…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "설치 과정: 주의 깊게 읽어내려가십시오" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"다시 시작한 후, 장치 설정 화면이 나타납니다. 새 드라이버르 사용하려면, 설정 " +"과정을 따라가십시오:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• “MOK 등록” 선택\n" +"• “예”를 선택하여 키 등록\n" +"• MOK 암호를 요구하는 경우 입력\n" +"• “다시 시작” 선택" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "보안 영향" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"키 등록에 성공하고 나면, 해당 모듈 또는 다른 모듈을 앞으로 업데이트할 때 잠정" +"적으로 동의하는 것으로 인지하십시오. 앞으로의 모든 업데이트 과정은 별도의 확" +"인/응답 과정 내지는 인증 과정 없이 진행합니다." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"더 많은 안내 내용은 문서 페이지에서 확인하실 수 있습니다." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "추가 메타데이터 파일 다운로드 중…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " 그리고 " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s 문자에 대응하는 글꼴" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s용 프로그램" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "요청한 프로그램 정보가 없습니다" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "요청한 프로그램 찾기에 실패했습니다" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s이(가) 없습니다" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "웹사이트" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "%s 파일을 제공하는 앱이 없습니다." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "빠진 앱 가져오기 설정 항목 같은 %s 정보는 %s에서 찾을 수 있습니다." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s을(를) 지원하는 앱이 없습니다." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s이(가) 없습니다." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"이 형식을 지원하는 앱 가져오기 설정 항목 같은 %s 정보는 %s에서 찾을 수 있습니" +"다." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s 문자를 지원하는 글꼴이 없습니다." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "추가 글꼴 가져오기 설정 항목 같은 %s 정보는 %s에서 찾을 수 있습니다." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s 형식에 대한 추가 코덱이 없습니다." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"이 형식을 재생할 수 있는 코덱 가져오기 설정 항목 같은 %s 정보는 %s에서 찾을 " +"수 있습니다." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s을(를) 지원하는 플라즈마 자원이 없습니다." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"추가 플라즈마 자원 가져오기 설정 항목 같은 %s 정보는 %s에서 찾을 수 있습니다." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s용 프린터 드라이버가 없습니다." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"이 프린터를 지원하는 드라이버 가져오기 설정 항목 같은 %s 정보는 %s에서 찾을 " +"수 있습니다." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "문서" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"안타깝게도, %2$s에서 요청한 %1$s을(를) 찾지 못했습니다. 더 알아보시려면 %3$s" +"을(를) 참고하십시오." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"안타깝게도, %s 찾기 대상을 찾지 못했습니다. 더 알아보시려면 %s을(를) 참고하십" +"시오." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "일부 검색 결과 찾기 실패: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s 파일 형식" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "모두 설치(_A)" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "요청한 프로그램을 찾을 수 없습니다" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "코덱 페이지" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "결과가 없습니다" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "검색을 수행할 수 없습니다" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "이전" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "다음" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "추천 앱 목록" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "데스크톱 지원" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "보통 큰 화면을 지원함" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "데스크톱 지원 여부 알 수 없음" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "큰 화면 지원 여부에 대한 충분한 정보가 없습니다" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "큰 화면 필요" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "데스크톱 지원 안함" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "큰 화면에서 사용할 수 없음" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "모바일 지원" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "보통 작은 화면을 지원함" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "모바일 지원 여부 알 수 없음" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "작은 화면 지원 여부에 대한 충분한 정보가 없습니다" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "작은 화면 필요" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "모바일 지원 안함" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "작은 화면에서 사용할 수 없음" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "키보드 지원" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "키보드 지원 여부 알 수 없음" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "키보드 지원 여부에 대한 충분한 정보가 없습니다" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "키보드 필요" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "키보드 지원" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "키보드를 지원하지 않음" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "키보드를 사용할 수 없음" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "마우스 지원" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "마우스 또는 지시 장치 필요" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "마우스 지원 여부 알 수 없음" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "마우스 지원 여부에 대한 충분한 정보가 없습니다" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "마우스 필요" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "마우스 및 지시 장치 지원" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "마우스를 지원하지 않음" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "마우스 또는 지시 장치를 사용할 수 없음" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "터치스크린 지원" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "터치스크린 지원여부 알 수 없음" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "터치스크린 지원 여부에 대한 충분한 정보가 없습니다" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "터치스크린 필요" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "터치스크린 지원" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "터치스크린을 지원하지 않음" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "터치스크린을 사용할 수 없습니다" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "게임패드 필요" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "게임 패드가 필요합니다" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "게임패드 지원" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "게임패드를 지원합니다" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "이 장치에 %s이(가) 동작할 수도 있습니다" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "이 장치에 %s이(가) 동작합니다" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s은(는) 이 장치에서 동작할 수도 있습니다" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "이 장치에 %s이(가) 동작하지 않을 수도 있습니다" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "이 장치에 %s이(가) 동작하지 않습니다" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "하드웨어 지원" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "탐색" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "탐색 페이지 탐색" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "설치한 항목 페이지 탐색" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "업데이트 페이지 탐색" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "검색 표시줄 열기" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "윈도우" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "기본 설정 열기" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "프로그램 저장소 열기" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "도움말" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "키보드 바로 가기 키 열기" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "설치함" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "설치한 페이지" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "진행 중" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "앱" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "웹 앱" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "시스템 앱" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "커뮤니티에서 빌드함" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "참여하기(_G)" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"이 앱은 국제 모임에서 공개 개발하며, %s 라이선스 하에 출시" +"합니다.\n" +"\n" +"앱 개선 기여에 참여할 수 있습니다." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"이 앱은 국제 모임에서 공개 개발하며, %s 라이선스 하에 출시합니다.\n" +"\n" +"앱 개선 기여에 참여할 수 있습니다." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"이 프로그램은 국제 모임에서 공개 개발하며, %s 라이선스 하" +"에 출시합니다.\n" +"\n" +"프로그램 개선 기여에 참여할 수 있습니다." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"이 프로그램은 국제 모임에서 공개 개발하며, %s 라이선스 조항 하에 출시합니" +"다.\n" +"\n" +"프로그램 개선 기여에 참여할 수 있습니다." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "알 수 없는 라이선스" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "더 알아보기(_L)" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"이 앱은 개발 라이선스를 지정하지 않았으며, 상업용일 수도 있습니다. 사용상 제" +"약이 있을 수 있으며, 앱이 안전한 지 여부를 알 수 없습니다.\n" +"\n" +"이 앱에 기여하거나 개발 과정에 영향을 줄 수 없습니다." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"이 프로그램은 개발 라이선스를 지정하지 않았으며, 상업용일 수도 있습니다. 사용" +"상 제약이 있을 수 있으며, 앱이 안전한 지 여부를 알 수 없습니다.\n" +"\n" +"이 프로그램에 기여하거나 개발 과정에 영향을 줄 수 없습니다." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "상업용" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"이 앱은 공개적으로 개발하지 않아 동작하는 방식은 개발자만 알고 있습니다. 사용" +"상 제약이 있을 수 있으며, 앱이 안전한 지 여부를 알 수 없습니다.\n" +"\n" +"이 앱에 기여하거나 개발 과정에 영향을 줄 수 없습니다." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"이 프로그램은 공개적으로 개발하지 않아 동작하는 방식은 개발자만 알고 있습니" +"다. 사용상 제약이 있을 수 있으며, 프로그램이 안전한 지 여부를 알 수 없습니" +"다.\n" +"\n" +"이 프로그램에 기여하거나 개발 과정에 영향을 줄 수 없습니다." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "별도 라이선스" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"이 엡은 %s 특별 라이선스로 개발했습니다.\n" +"\n" +"이 앱의 개선에 기여할 수 있거나 기여하지 못할 수도 있습니다." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"이 앱은 “%s” 특별 라이선스로 개발했습니다.\n" +"\n" +"이 앱의 개선에 기여할 수 있거나 기여하지 못할 수도 있습니다." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"이 프로그램은 %s 특별 라이선스로 개발했습니다.\n" +"\n" +"프로그램 개선 기여에 참여할 수 있거나 못할 수 있습니다." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"이 프로그램은 “%s” 특별 라이선스로 개발했습니다.\n" +"\n" +"이 앱의 개선에 기여하지 못할 수도 있습니다." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "데이터 새로 고침 중" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "페이지 읽어들이는 중" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "시작 중" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "알 수 없는 원본" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "베타" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "사용자" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "추가" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "제거" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "업데이트" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "다운그레이드" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "선택한 외부 공급원" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"%s에서 추가 프로그램을 제공합니다. 일부 상업용 프로그램이 들어있습니다.\n" +"\n" +"소프트웨어 저장소 기본 설정에서 나중에 활용 설정할 수 있습니다." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "제 3자 프로그램 저장소를 활성화하시겠습니까?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "무시(_I)" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "활용 설정(_E)" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "운영체제에서 사용할 수 있음" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "%s에서 사용할 수 있음" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "탐색" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "개요 페이지" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "사용할 수 있는 앱" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "기타 분류" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "앱 데이터가 없습니다" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "알 수 없음" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "확인(_O)" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "사용자가 거절한 설치" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s 준비" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "정말로 %s 저장소를 제거하시겠습니까?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"%s에서 모든 앱을 제거합니다. 다시 사용하려면 저장소를 다시 설치해야 합니다." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "%s을(를) 설치 제거할까요?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "제거하면 %s을(를) 사용하지 못할 수 있습니다." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "제거하면 %s에 의존하는 앱을 사용할 수 없습니다." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"제거하면 %s을(를) 사용할 수 없으며, 해당 요소를 활용하는 문서의 글꼴이 다른 " +"형태로 나타납니다." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"제거하면 %s을(를) 사용할 수 없습니다. 일부 미디어 파일을 더 이상 재생하지 못" +"할 수도 있음을 의미합니다." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"%s에 의존하는 하드웨어는 제거 후 더 이상 제대로 동작하지 않을 수도 있습니다." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"제거하면 %s을(를) 사용하지 못할 수도 있습니다. 나중에 앱을 복원할 수 있도록 " +"앱 데이터와 설정을 디스크에 그대로 두겠습니다." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "기본 설정" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "프로그램 업데이트" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "자세한 정보" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"업데이트 검사 및 다운로드시 데이터와 전력을 소모합니다. 종량제 네트워크에 연" +"결했거나 전원 절약 모드를 켜면 자동 업데이트 기능을 잠시 멈춥니다." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "자동(_A)" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "업데이트를 자동으로 확인하고 다운로드" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "설명서(_M)" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "업데이트 확인 및 다운로드를 직접 끝내야 합니다" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "자동 업데이트 알림(_N)" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "업데이트를 자동으로 설치할 때 알림" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "내용 구분 검색" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "자유 소프트웨어만 표시(_F)" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "프로그램 탐색 및 검색시 상업용 프로그램 숨기기" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "개발자 인증한 프로그램만 표시(_V)" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "개발자 신원을 검증한 앱만 표시" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"설치한 프로그램이 %s와의 호환성이 없습니다. 업그레이드를 진행하는 동안 자동으" +"로 제거합니다." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "호환성 없는 프로그램" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "업그레이드(_U)" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "설치 제거(_U)" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "앱 설정 및 데이터" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "유지(_K)" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "앱 설정 및 내용 복원 허용" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "삭제(_D)" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "데이터를 완전히 삭제하여 디스크 공간을 확보" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "“%s”에서 설치한 프로그램이 업데이트 수신을 중단합니다." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "저장소 사용을 중단할까요?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "저장소를 제거할까요?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "비활성(_D)" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "제거(_R)" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "새 저장소 활성" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "새 공급원을 추가했을 때 바로 연결합니다" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "추가 정보" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "선택한 제 3자 공급원의 추가 저장소 — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "페도라 제 3자 저장소" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "운영체제" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "기본 프로그램을 공급하는 저장소는 %s에서 제공합니다." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "프로그램 저장소" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "저장소 없음" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "앱 %u개 설치함" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "추가 기능 %u개 설치함" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "앱 %u개" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "추가 기능 %u개" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s 및 %s을(를) 설치했습니다" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "설치한 프로그램 검사중…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "제거" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "싫어요" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "별로예요" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "괜찮군요" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "좋아요" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "완전 좋아요" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "점수를 매길 별을 선택하십시오" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "시간을 내어 평가를 작성해주세요" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "별점을 선택하세요" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "요약 내용이 너무 짧습니다" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "요약 내용이 너무 깁니다" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "설명이 너무 짧습니다" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "설명이 너무 깁니다" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "평가 작성" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "보내기(_S)" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"별점, 요약, 평가를 내려주세요. 평가는 문제 보고용으로 사용하면 안됩니다. 문" +"제 보고시 개발자 또는 기술 지원 담당자에게 연락하세요." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "평가 요약" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "간단한 평가 작성" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"개인 정보 보호 정책에서 어떤 " +"데이터를 보내는지 확인해보십시오. 계정에 붙는 성명 정보는 공개됩니다." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "총 평가 %u건" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "별점 5점 만점" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "알 수 없음" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"시스템에 해를 가하거나, 기능이 제대로 동작하지 않거나, 사용자를 차별하는 기능" +"에 대한 평가를 보고할 수 있습니다." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "제출하고 나면, 관리자가 확인하기 전까지는 평가 내용을 숨겨놓습니다." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "평가를 제출하시겠습니까?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "제출(_R)" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "평가를 제거하시겠습니까?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "검토 제거는 되돌릴 수 없습니다." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "이 평가가 좋아요" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "이 평가가 싫어요" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "보고…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "제거…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"앱을 샌드박싱하지 않았지만 배포판 관리자가 취약점이 없음을 확인했습니다" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "앱을 샌드박싱하지 않았습니다. 신뢰할 수 있는 공급자인지 확인하십시오" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "권한 없음" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "샌드박스에서만 온전히 실행하는 앱" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "네트워크 접근" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "인터넷에 접근할 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "네트워크 접근 안함" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "인터넷에 접근할 수 없음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "시스템 서비스 활용" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "시스템 서비스에서 데이터를 요청할 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "세션 서비스 활용" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "세션 서비스에서 데이터를 요청할 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "사용자 장치 접근" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "웹캠 또는 게임 컨트롤러 장치에 접근할 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "사용자 장치 접근 안함" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "웹캠 또는 게임 컨트롤러 장치에 접근할 수 없음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "입력 장치 접근" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "마이크 접근 및 오디오 재생" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "권한을 묻지 않고 마이크 음성을 듣고 오디오를 재생할 수 있습니다" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "시스템 장치 접근" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "권한 승격이 필요한 시스템 장치 파일에 접근할 수 있습니다" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "화면 내용 접근" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "화면 내용 또는 다른 창에 접근할 수 있습니다" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "이전 윈도우 시스템" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "임의 권한" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "사용자 설정" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "전체 파일 시스템 읽기/쓰기 접근" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "파일 시스템의 모든 데이터를 읽고 쓸 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "사용자 폴더 읽기/쓰기 접근" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "사용자 디렉터리의 모든 데이터를 읽고 쓸 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "전체 파일 시스템 읽기 접근" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "파일 시스템의 모든 데이터를 읽을 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "사용자 폴더 읽기 접근" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "사용자 디렉터리의 모든 데이터를 읽을 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "다운로드 폴더 읽기/쓰기 접근" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "다운로드 디렉터리의 모든 데이터를 읽고 쓸 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "다운로드 폴더 읽기 접근" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "다운로드 디렉터리의 모든 데이터를 읽을 수 있음" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "디렉터리의 모든 데이터를 읽고 쓸 수 있음" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "디렉터리의 모든 데이터를 읽을 수 있음" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "파일 시스템 접근 안함" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "파일 시스템 어디든 접근할 수 없음" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "검증 완료한 앱 개발자" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "이 앱의 개발자 신원을 검증했습니다" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "안전하지 않은 의존 항목" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"프로그램 또는 의존 요소를 더 이상 지원하지 않으며 안전하지 않을 수 있습니다" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"이 앱에는 어떤 라이선스로 개발했는지 정보가 없으며, 아마도 상업용일 수도 있습" +"니다" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"이 프로그램은 어떤 라이선스로 개발했는지 정보가 없으며, 아마도 상업용일 수도 " +"있습니다" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "상업용 코드" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"소스 코드가 공개 상태가 아니어서 개별적으로 검수할 수 없으며 안전하지 않을 " +"수 있습니다" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "이 앱은 “%s” 별도 라이선스로 개발했습니다" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "이 프로그램은 “%s” 별도 라이선스로 개발했습니다" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "검수 가능 코드" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"소스 코드가 공개 상태이며 개별 검수 가능하고, 앱을 좀 더 안전하게 개선할 수 " +"있습니다" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s을(를) 승인했습니다" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s은(는) 안전합니다" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s은(는) 안전한 것 같습니다" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s은(는) 잠재적으로 불안전합니다" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s은(는) 불안전합니다" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "알 수 없음" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "안전" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "라이선스" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "공급원" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"이 앱은 오래된 소프트웨어 플랫폼 (SDK) 버전을 쓰고 있으며 수정하지 않을 버그" +"가 있거나 보안 취약점이 있을 수도 있습니다." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "이전 스크린샷" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "다음 스크린샷" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "스크린샷 없음" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "스크린샷을 찾지 못했습니다" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "이미지 읽어들이기에 실패했습니다" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "스크린샷 크기 정보가 없습니다" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "캐시를 만들 수 없습니다" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "스크린샷이 올바르지 않습니다" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "스크린샷이 없습니다" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "스크린샷" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "일치하는 결과 %u개 더" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "검색 페이지" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "프로그램 검색" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "앱 없음" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "업데이트를 다운로드할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "펌웨어 업데이트를 다운로드할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "%s에서 펌웨어 업데이트를 다운로드할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "%s에서 업데이트를 다운로드할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "업데이트할 수 없음: 인터넷 연결이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "업데이트할 수 없음: 디스크 용량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "%s에서 업데이트를 다운로드할 수 없음: 디스크 용량 부족" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "업데이트할 수 없음: 인증이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "업데이트할 수 없음: 인증 정보 잘못됨" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "업데이트할 수 없음: 권한이 필요함" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "업데이트를 다운로드할 수 없음: 프로그램 설치 권한 없음" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "업데이트 목록을 가져올 수 없습니다" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "설치할 수 없음: 다운로드 실패" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s을(를) 설치할 수 없음: %s(에)서 다운로드 실패" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s을(를) 설치할 수 없음: 다운로드 실패" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "설치할 수 없음: 런타임 빠짐" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s을(를) 설치할 수 없음: %s 런타임을 사용할 수 없음" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "%s을(를) 설치할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "설치할 수 없음: 인터넷 접근이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "설치할 수 없음: 잘못된 앱 형식" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "설치할 수 없음: 디스크 용량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s을(를) 설치할 수 없음: 디스크 용량 부족" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "설치할 수 없음: 인증이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s을(를) 설치할 수 없음: 인증이 필요함" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "설치할 수 없음: 인증 정보 잘못됨" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s을(를) 설치할 수 없음: 인증 정보 잘못됨" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "설지할 수 없음: 권한이 필요함" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s을(를) 설지할 수 없음: 권한이 필요함" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "설지할 수 없음: 장치를 연결해야 함" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s을(를) 설지할 수 없음: 장치를 연결해야 함" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "설치할 수 없음: 배터리 잔량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s을(를) 설치할 수 없음: 배터리 잔량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%2$s에서 %1$s 업데이트할 수 없음: 다운로드 실패" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s을(를) 업데이트할 수 없음: 다운로드 실패" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "%s(에)서 업데이트를 설치할 수 없음: 다운로드 실패" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "업데이트할 수 없음: 다운로드 실패" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s을(를) 업데이트할 수 없음: 디스크 용량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s을(를) 업데이트할 수 없음: 인증이 필요함" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s을(를) 업데이트할 수 없음: 인증 정보 잘못됨" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s을(를) 업데이트할 수 없음: 권한이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "업데이트할 수 없음: 장치 연결 필요" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s을(를) 업데이트할 수 없음: 장치 연결 필요" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "업데이트할 수 없음: 배터리 잔량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s을(를) 업데이트할 수 없음: 배터리 잔량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "%s을(를) 업데이트할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "업데이트할 수 없음" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "업그레이드할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%2$s에서 %1$s(으)로 업그레이드할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "업그레이드할 수 없음: 다운로드 실패" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "%s을(를) 업그레이드할 수 없음: 다운로드 실패" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "업그레이드할 수 없음: 인터넷 접근이 필요함" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "%s을(를) 업그레이드할 수 없음: 인터넷 접근이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "업그레이드할 수 없음: 디스크 용량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "%s을(를) 업그레이드할 수 없음: 디스크 용량 부족" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "업그레이드할 수 없음: 인증이 필요함" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "%s을(를) 업그레이드할 수 없음: 인증이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "업그레이드할 수 없음: 인증 정보 잘못됨" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "%s을(를) 업그레이드할 수 없음: 인증 정보 잘못됨" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "업그레이드할 수 없음: 권한이 필요함" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "%s을(를) 업그레이드할 수 없음: 권한이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "업그레이드할 수 없음: 장치 연결 필요" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "%s을(를) 업그레이드할 수 없음: 장치 연결 필요" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "업그레이드할 수 없음: 배터리 잔량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "%s을(를) 업그레이드할 수 없음: 배터리 잔량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "%s(으)로 업그레이드할 수 없음" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "설치 제거할 수 없음: 인증이 필요함" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s을(를) 설치 제거할 수 없음: 인증이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "설치 제거할 수 없음: 인증 정보 잘못됨" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s을(를) 설치 제거할 수 없음: 인증 정보 잘못됨" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "설치 제거할 수 없음: 권한이 필요함" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s을(를) 설치 제거할 수 없음: 권한이 필요함" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "설치 제거할 수 없음: 장치 연결 필요" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s을(를) 설치 제거할 수 없음: 장치 연결 필요" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "설치 제거할 수 없음: 배터리 잔량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s을(를) 설치 제거할 수 없음: 배터리 잔량 부족" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s 설치를 제거할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "%s을(를) 실행할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "유감스럽게도 뭔가가 잘못되었군요" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s을(를) 실행할 수 없음: %s을(를) 설치하지 않음" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "처리 디스크 용량 부족" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "설치할 수 없음: 파일 형식을 지원하지 않음" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "설치할 수 없음: 인증 실패" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "설치할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "%s에 연락할 수 없습니다" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "새 플러그인을 활용하려면 프로그램을 다시 시작하십시오" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "장치를 연결해야 합니다" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "배터리 잔량이 매우 부족합니다" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "프로그램 저장소(_S)" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "기본 설정(_P)" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "키보드 바로 가기 키(_K)" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "소프트웨어 정보(_A)" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "검색" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "주 메뉴" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "앱 검색" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "탐색(_E)" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "설치함(_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "업데이트(_U)" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "뒤로 가기" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "없음" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "앱 데이터" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "앱 실행에 데이터 필요" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "사용자 데이터" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "앱에서 만든 데이터" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "캐시 데이터" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "임시 캐시 데이터" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "자체 앱" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "필요한 의존 항목" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "이 앱에서 공유 시스템 구성 요소가 필요합니다" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "알 수 없음" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"앱 설정(_A)에서 캐시에 임시 저장한 데이터를 지울 수 있습니다" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "저장소" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (설치함)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (설치 중)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (다운로드 중)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (제거 중)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "자세히 보기(_D)" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "검사(_E)" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "%s에 설치함" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "설치한 업데이트" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "설치한 업데이트가 없습니다" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "업데이트가 오래됐습니다" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "프로그램 업데이트를 확인하십시오" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "중요 업데이트 설치를 준비했습니다" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "중요 업데이트를 가능한 대로 바로 설치하십시오" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "중요 업데이트를 다운로드할 수 있습니다" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "중요 업데이트를 가능한 대로 바로 다운로드하십시오" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "업데이트 설치를 준비했습니다" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "프로그램 업데이트를 준비했고 기다리고 있습니다" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "업데이트를 다운로드할 수 있습니다" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "프로그램 업데이트를 다운로드할 수 있습니다" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "앱 %u개 업데이트 함 — 다시 시작해야합니다" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "앱 %u개 업데이트 함" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s 프로그램을 업데이트했습니다." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "앱을 다시 시작하십시오." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s 프로그램과 %s 프로그램을 업데이트했습니다." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "앱 %u개를 다시 시작해야합니다." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s, %s, %s을(를) 포함합니다." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "시스템이 지원 주기 만기에 도달했습니다" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "업데이트를 계속 받으려면 업그레이드하십시오" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s 새 버전을 설치할 수 있습니다" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "업그레이드할 프로그램이 있습니다" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "프로그램 업데이트에 실패했습니다" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "준비한 업데이트를 설치하지 않았습니다" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "상세 정보 표시" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "시스템 업그레이드 완료" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "%s %s 사용을 환영합니다!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "프로그램 업데이트를 설치했습니다" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "중요한 운영체제 업데이트를 설치했습니다." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "평가" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "업데이트에 실패했습니다" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "시스템이 이미 최신입니다." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "업데이트를 취소했습니다." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"인터넷 연결이 필요하지만 연결할 수 없습니다. 인터넷 연결을 확인하고 다시 시도" +"하십시오." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"업데이트에 보안 문제가 있습니다. 자세한 문제를 알아보려면 프로그램 공급자에" +"게 연락하십시오." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"디스크 공간이 충분하지 않습니다. 여분의 공간을 확보하고 다시 시도하십시오." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"죄송합니다. 업데이트 설치에 실패했습니다. 다른 업데이트를 기다린 후 다시 시도" +"하십시오. 문제가 계속되면 프로그램 공급자에게 연락하십시오." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "마지막 확인 일시: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "정지" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "업데이트 검사" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "중요 프로그램 업데이트를 받는 중 %s %s을(를) 멈추었습니다" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "중요 프로그램 업데이트를 받는 동안 운영체제가 멈추었습니다" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "요금이 청구될 수 있음" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"모바일 광대역망을 사용하여 업데이트를 확인하면 추가 요금이 발생할 수 있습니" +"다." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "어쨌든 확인(_A)" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "프로그램 업그레이드 다운로드함" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "업그레이드 설치를 준비했습니다" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "업데이트 검사" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "업데이트" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "업데이트 페이지" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "업데이트 불러오는 중" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "시간이 좀 걸릴 수 있습니다" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "최신" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "모바일 데이터를 사용합니까?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"모바일 광대역망을 사용하여 업데이트를 확인하면 추가 요금이 발생할 수 있습니다" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "어쨌든 확인(_C)" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "연결 끊김" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "온라인에서 업데이트를 확인하십시오" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "네트워크 설정(_N)" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "오류" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "업데이트를 자동으로 관리합니다" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "프로그램 업데이트 잠시 멈춤" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "자동 프로그램 업데이트를 다음 이유로 잠시 멈추었습니다:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• 현재 네트워크 연결에 요금을 부과함" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• 현재 네트워크 연결이 대용량 다운로드를 금지함" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• 전원 절약 모드 활성화" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• 게임 모드 활성화" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "프로그램 업데이트를 잠시 멈추었습니다" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "종량제 네트워크 연결입니다 — 프로그램 업데이트를 잠시 멈추었습니다" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"대용량 다운로드 금지 네트워크 연결입니다 — 프로그램 업데이트를 잠시 멈추었습" +"니다" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"전원 절약 모드를 활성 설정했습니다 — 프로그램 업데이트를 잠시 멈추었습니다" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "게임 모드 활성 — 프로그램 업데이트를 잠시 멈추었습니다" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "다시 시작하고 업데이트(_R)…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "모두 업데이트(_P)" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "프로그램 업데이트 다운로드함" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "업데이트 설치를 준비했습니다" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "통합 펌웨어" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "다시 시작 필요" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "앱 업데이트" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "장치 펌웨어" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "다운로드(_D)" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s이(가) 있습니다" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s이(가) 있습니다" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "새 버전 알아보기" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%2$s중 %1$s 다운로드함" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% 다운로드함" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "새 기능을 추가하고 매끄럽게 다듬은 주요 업그레이드." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "업그레이드 취소" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "다시 시작하고 업그레이드(_R)…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "업그레이드 전 데이터와 파일을 백업하는 것이 좋습니다." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "오류 상세 정보" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "복사 상세 정보" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "“%s” 파일 삭제 실패: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "“%s” 디렉터리 삭제 실패: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "이 컴퓨터에 프로그램을 추가, 제거, 업데이트 합니다" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;업데이트;Upgrade;업그레이드;Sources;공급원;Repositories;저장소;" +"Preferences;기본 설정;Install;설치;Uninstall;설치 제거;Program;프로그램;" +"Software;소프트웨어;App;앱;Store;스토어;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s 준비함" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s 사용을 준비했으며 다시 부팅하고 나면 시스템에서 사용할 수 있습니다." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "활성" + +# flatpak 설치 범위를 나타냅니다. user vs system +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "시스템 업데이트" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"보안 업데이트 또는 버그 수정, 성능 개선 등의 일반 시스템 업데이트 입니다." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "새 기능과 수정 사항이 들어간 %s 업데이트입니다." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS 업데이트 서비스에서 업데이트를 가져오고 적용할 수 없습니다." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "웹 앱" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "웹 앱 지원" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "브라우저에서 인기있는 웹 프로그램 실행" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "최신 기능, 성능, 안정성 개선 업그레이드입니다." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak 지원" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "플랫팩은 리눅스 데스크톱 앱용 프레임워크입니다" + +# flatpak 설치 범위를 나타냅니다. user vs system +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "시스템 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "내 폴더의 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "호스트 시스템 폴더" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "/etc 호스트 시스템 설정" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "데스크톱 폴더" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "데스크톱 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "문서 폴더" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "문서 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "음악 폴더" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "음악 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "사진 폴더" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "사진 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "공개 공유 폴더" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "공개 공유 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "비디오 폴더" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "비디오 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "서식 폴더" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "서식 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "사용자 캐시 폴더" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "사용자 캐시 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "사용자 설정 폴더" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "사용자 설정 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "사용자 데이터 폴더" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "사용자 데이터 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "사용자 실행 시간 폴더" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "사용자 실행 시간 하위 폴더 %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "파일 시스템에서 %s에 접근함" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "%s flatpak 메타데이터 가져오는 중…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "‘%s’ 추가 기능 정제에 실패했습니다: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "사용자 설치" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "시스템 설치" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "앱 ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "‘%s’ 추가 기능의 설치 동작 추가에 실패했습니다: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "‘%s’ 추가 기능의 제거 동작 추가에 실패했습니다: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"원격 “%s”은(는) 필터 문제로 인해 “%s” 설치를 허용하지 않습니다. 필터를 제거하" +"고 설치를 다시 진행하십시오. 세부 오류: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "업데이트를 수행하기에 시스템 전원 용량이 매우 부족합니다" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"업데이트를 수행하기에 시스템 젼원 용량이 매우 부족합니다(%u%%, %u%% 필요함)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "장치에 접근할 수 없거나, 무선 거리 밖으로 벗어났습니다" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "장치 배터리 전원 용량이 매우 부족합니다" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "장치 매터리 전원 용량이 매우 부족합니다(%u%%, %u%% 필요함)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "장치에서 업데이트 적용을 기다리고 있습니다" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "장치에 교류 전원 연결이 필요합니다" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "덮개를 닫아둔 동안 장치를 사용할 수 없습니다" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s 장치 업데이트" + +# flatpak 설치 범위를 나타냅니다. user vs system +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s 시스템 업데이트" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s 내장 컨트롤러 업데이트" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s 관리 엔진 업데이트" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s 기업 관리 엔진 업데이트" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s 고객 관리 엔진 업데이트" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s 컨트롤러 업데이트" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s 썬더볼트 컨트롤러 업데이트" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU 마이크로코드 업데이트" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s 설정 업데이트" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s 배터리 업데이트" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s 카메라 업데이트" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM 업데이트" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s 터치패드 업데이트" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s 마우스 업데이트" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s 키보드 업데이트" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s 저장소 컨트롤러 업데이트" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s 네트워크 인터페이스 업데이트" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s 디스플레이 업데이트" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC 업데이트" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB 수신기 업데이트" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s 드라이브 업데이트" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s 플래시 드라이브 업데이트" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD 업데이트" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU 업데이트" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s 도크 업데이트" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB 도크 업데이트" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "펌웨어" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "펌웨어 업데이트를 적용할 수 없습니다: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "펌웨어 업그레이드 지원" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "펌웨어 업그레이드 지원 기능이 들어있습니다" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "서명하지 않은 프로그램을 설치합니까?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"설치할 프로그램에 서명이 없습니다. 이 프로그램의 업데이트 원본을 검증할 수 없" +"거나, 부당한 수정이 있었는지 여부를 알 수 없습니다." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "서명하지 않은 프로그램을 다운로드합니까?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"서명하지 않은 업데이트가 있습니다. 서명이 없으면 업데이트 원본을 검증할 수 없" +"거나, 부당한 수정이 있었는지 여부를 알 수 없습니다." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "서명하지 않은 프로그램을 업데이트합니까?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"서명하지 않은 업데이트가 있습니다. 서명이 없으면 업데이트 원본을 검증할 수 없" +"거나, 부당한 수정이 있었는지 여부를 알 수 없습니다. 서명하지 않은 업데이트를 " +"제거하거나 업데이트하기 전에는 프로그램 업데이트를 진행할 수 없습니다." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "업데이트 설치 실패: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "패키지" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "다운로드하기 전 끝난 트랜잭션의 기다림에 실패했습니다: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "업데이트 다운로드에 실패했습니다: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "업데이트 시작에 실패했습니다: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "운영체제 (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "스냅 스토어" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "스냅 지원" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "스냅은 통합 리눅스 패키지 형식입니다" + +# flatpak 설치 범위를 나타냅니다. user vs system +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "시스템" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "시스템 구성 요소" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "'%s' 시스템 업데이트 작업 제거에 %i 상태로 실패했습니다" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "시스템의 프로그램을 관리하는 세련된 수단입니다." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "1과 %u 사이의 숫자 값을 입력하십시오: " + +#~ msgid "Choose an app:" +#~ msgstr "앱을 선택하십시오:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s을(를) 설치했습니다" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "앱을 제거했습니다" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "“%s”을(를) 찾을 수 없습니다." + +#~ msgid "Downloading Software Catalog" +#~ msgstr "프로그램 목록 다운로드 중" + +#~ msgid "Moderate page" +#~ msgstr "관리 페이지" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "관리할 평가가 없습니다" + +#, c-format +#~| msgid "%s %s" +#~ msgid "%s %s %s" +#~ msgstr "%s %s %s" + +#~ msgid "Was this review useful to you?" +#~ msgstr "평가 내용이 도움 됐나요?" + +#~ msgid "Yes" +#~ msgstr "예" + +#~ msgid "No" +#~ msgstr "아니요" + +#~ msgid "Meh" +#~ msgstr "지루해요" + +#~ msgid "Outdated SDK version" +#~ msgstr "오래된 SDK 버전" + +#~ msgid "Unable to install updates" +#~ msgstr "업데이트를 설치할 수 없습니다" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "설치 제거할 수 없음: 인증 정보 잘못됨" + +#~ msgid "Network Settings" +#~ msgstr "네트워크 설정" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "운영체제 업데이트가 없습니다" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "중요한 운영체제 업데이트 설치에 실패했습니다." + +#~ msgid "No Network" +#~ msgstr "네트워크 연결 없음" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "업데이트를 확인하려면 인터넷 접근이 필요합니다." + +#~ msgid "Network _Settings" +#~ msgstr "네트워크 설정(_S)" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "프로그램 업그레이드를 다운로드했고 설치할 준비가 끝났습니다." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "프로그램 업데이트를 다운로드했고 설치할 준비가 끝났습니다." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "업그레이드 정보 다운로드 중…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "자동 업데이트 멈춤" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "현재 접속 네트워크는 종량제입니다. 종량제 연결은 데이터 사용량, 속도 등을 " +#~ "제한하거나 해당 사용건에 대해 요금을 부과합니다. 데이터 사용량을 절약하려" +#~ "면 자동 업데이트를 멈춰야합니다.\n" +#~ "\n" +#~ "대신 현재 네트워크를 종량제 네트워크로 잘못 인식했다면, 이 설정을 바꿀 수 " +#~ "있습니다." + +#~ msgid "Open Network _Settings" +#~ msgstr "네트워크 설정 열기(_S)" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "프로그램 업데이트는 네트워크 과금을 방지할 목적으로 모바일 또는 종량제 연" +#~ "결망에서 자동으로 다운로드하지 않습니다." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "가능할 때 백그라운드에서 프로그램 업데이트를 다운로드하고 설치" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "자유 앱만 표시(_F)" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "자유 라이선스 앱만 표시하고 상업용 앱은 가립니다" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "이 앱의 어떤 점이 좋았나요? 다른 사용자에게 도움이 되는 평가글을 남길 때 " +#~ "이유를 반응 글로 남겨주세요." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "업데이트를 다운로드할 수 없음: 필요한 인터넷 연결이 끊어짐" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "업데이트를 다운로드할 수 없음: 디스크 용량 부족" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "업데이트를 다운로드할 수 없음: 인증 필요" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "업데이트를 다운로드할 수 없음: 인증 정보 잘못됨" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "%s을(를) 설치할 수 없음: 프로그램 설치 권한 없음" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "%s을(를) 설지할 수 없음: 배터리 잔여량 매우 부족" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "업데이트를 설치할 수 없음: 디스크 용량 부족" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "업데이트를 설치할 수 없음: 인증 필요" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "업데이트를 설치할 수 없음: 인증 정보 잘못됨" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "%s을(를) 업데이트할 수 없음: 프로그램 업데이트 권한 없음" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "업데이트를 설치할 수 없음: 프로그램을 업데이트할 권한이 없음" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "업데이트를 설치할 수 없음: 교류 전원을 연결해야 함" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "%s을(를) 업데이트할 수 없음: 배터리 잔여량이 매우 부족합니다" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "업데이트를 설치할 수 없음: 배터리 잔여량이 매우 부족합니다" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "%s(으)로 업그레이드할 수 없음: 인터넷 연결이 필요하지만 연결할 수 없음" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "%s을(를) 업그레이드할 수 없음: 업그레이드 권한 없음" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "%s을(를) 업그레이드할 수 없음: 배터리 잔여량 매우 부족" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "%s을(를) 제거할 수 없음: 인증 필요" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "%s을(를) 제거할 수 없음: 인증 정보 잘못됨" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "%s을(를) 제거할 수 없음: 프로그램 제거 권한 없음" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "%s을(를) 제거할 수 없음: 교류 전원 필요" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "%s을(를) 제거할 수 없음: 배터리 잔여량이 매우 부족합니다" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "%s을(를) 제거할 수 없습니다" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "파일 설치 실패: 지원하지 않음" + +#~ msgid "Failed to install: not supported" +#~ msgstr "설치 실패: 지원하지 않음" + +#~ msgid "AC power is required" +#~ msgstr "교류 전원 필요" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "종량제 네트워크 - 자동 업데이트 멈춤" + +#~ msgid "Find Out _More" +#~ msgstr "더 찾아보기(_M)" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "중요한 프로그램 설치를 준비했습니다." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "중요: 중대한 프로그램 업데이트를 기다리고 있습니다." + +#~ msgid "Show verbose debugging information" +#~ msgstr "디버깅 정보 자세히 표시" + +#~ msgid "Can access arbitrary files" +#~ msgstr "파일에 순차 접근할 수 있음" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "정말로 %s 프로그램을 제거하시겠습니까?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "%s 프로그램을 제거하겠으며, 다시 사용하려면 설치해야 합니다." + +#~ msgid "Downloading featured images…" +#~ msgstr "추천 그림 다운로드 중…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "시스템을 네트워크에 연결하여 업데이트를 받은 최종 일시(타임스탬프)" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "이 프로그램은 시스템에서 사용중인 언어 메시지를 제공하지 않아 미국 영어 버" +#~ "전으로 나타납니다." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "선택한 추가 기능을 프로그램과 함께 설치합니다." + +#~ msgid "Applications" +#~ msgstr "프로그램" + +#~ msgid "_Continue" +#~ msgstr "계속(_C)" + +#~ msgid "Post Review" +#~ msgstr "평가 제출" + +#~ msgid "_Post" +#~ msgstr "게시(_P)" + +#~ msgid "Rating" +#~ msgstr "평점 매기기" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "“대단한데요, 추천합니다”와 같이 간단한 평가 소감을 적어주세요." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "평가" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "이 앱은 어떤가요? 평가해보시고 이유를 이야기해보세요." + +#~ msgid "No screenshot provided" +#~ msgstr "스크린샷이 없습니다" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Primary Menu" +#~ msgstr "초기 메뉴" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "업데이트" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s을(를) 더 이상 지원하지 않습니다." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "보안 업데이트를 더 이상 받지 않음을 의미합니다." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "좀 더 최신 버전으로 업그레이드 하시는 편이 좋습니다." + +#~ msgid "Application Updates" +#~ msgstr "프로그램 업데이트" + +#~ msgid "GNOME Web" +#~ msgstr "그놈 웹" + +#~ msgid "Application manager for GNOME" +#~ msgstr "그놈용 프로그램 관리자" + +#~ msgid "A list of popular applications" +#~ msgstr "인기있는 프로그램 목록" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "시스템에서 지정한 프로그램 목록보다 우선해서 활용할 프로그램 목록." + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "소프트웨어 카탈로그를 다운로드하고 있습니다" + +#~ msgid "Name" +#~ msgstr "이름" + +# flatpak 설치 범위를 나타냅니다. user vs system +#~ msgid "user" +#~ msgstr "사용자 계정" + +#~ msgid "Channel" +#~ msgstr "채널" + +#~ msgid "Branch" +#~ msgstr "브랜치" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "설치 대상" + +#~ msgid "Version" +#~ msgstr "버전" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "이 시스템에 설치한 업데이트가 없습니다." + +#~ msgid "Checking…" +#~ msgstr "검사 중…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "불러오는 중…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "프로그램 등급 정보 다운로드 중…" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "업그레이드 배너용 백그라운드 참조 URI 입니다." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URI는 최대 3 '%u' 만큼 넣을 수 있으며, 업그레이드 버전으로 바꿀 수 있습니" +#~ "다." + +#~ msgid "_Add shortcut" +#~ msgstr "바로 가기 추가(_A)" + +#~ msgid "Re_move shortcut" +#~ msgstr "바로 가기 제거(_M)" + +#~ msgid "Welcome" +#~ msgstr "환영합니다" + +#~ msgid "Welcome to Software" +#~ msgstr "소프트웨어 사용을 환영합니다" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "소프트웨어는 여러분이 필요한 모든 프로그램을 한 곳에서 모두 설치할 수 있" +#~ "게 해줍니다. 추천 항목을 살펴보고, 분류를 탐색하거나, 원하는 프로그램을 검" +#~ "색해보세요." + +#~ msgid "_Browse Software" +#~ msgstr "소프트웨어 탐색(_B)" + +#~ msgid "OS Updates" +#~ msgstr "운영체제 업데이트" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "성능, 안정성, 보안 개선 요소가 있습니다." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "펌웨어 업데이트 서명 다운로드 중…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "펌웨어 업데이트 메타데이터 다운로드 중…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "프로그램에서 알 수 없는 권한을 요구합니다" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "믿을 수 있는 공급처에서 제공한 프로그램" + +#~ msgid "Unknown Permissions" +#~ msgstr "알 수 없는 권한" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "이 앱에서 필요한 권한의 종류를 알 수 없음" + +#~ msgid "App comes from a trusted source" +#~ msgstr "믿을 수 있는 공급처에서 제공한 앱" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "배포판에서 이 앱을 신뢰할 수 있다고 검증했습니다" diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..f62356b --- /dev/null +++ b/po/lt.po @@ -0,0 +1,8652 @@ +# Lithuanian translation for gnome-software. +# Copyright (C) 2014 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# FULL NAME , 2014, 2015. +# Aurimas Černius , 2014-2023. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-21 13:46+0000\n" +"PO-Revision-Date: 2025-02-21 22:24+0200\n" +"Last-Translator: Aurimas Černius \n" +"Language-Team: Lietuvių \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 3.5\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programinė įranga" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Įdiegti ir atnaujinti programas" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Programinė įranga leidžia jums rasti ir įdiegti naujas programas bei " +"sistemos plėtinius, taip pat pašalinti įdiegtas programas." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Programinė įranga parodo siūlomas bei populiarias programas su naudingais " +"aprašymais bei keliomis ekrano nuotraukomis kiekvienai programai. Programas " +"galima rasti naršant po kategorijų sąrašą arba ieškant. Taip pat galima " +"atnaujinti sistemą naudojant atnaujinimą atsijungus." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Apžvalgos skydelis" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Detalių skydelis" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Įdiegtų skydelis" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Atnaujinimų skydelis" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Atnaujinimo detalės" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME projektas" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Testuoti akmods raktą Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Būtina patvirtinti tapatybę akmods rakto testavimui Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Įtraukti akmods raktą į Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Būtina patvirtinti tapatybę norint įtraukti akmods raktą į Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Testuoti DKMS raktą Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Būtina patvirtinti tapatybę norint testuoti DKMS raktą Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Įtraukti DKMS raktą į Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Būtina patvirtinti tapatybę norint įtraukti DKMS raktą į Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Įdiegti appstream failą į sisteminę vietą" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Diegiamas appstream failas į sisteminę vietą" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Suderinamų projektų sąrašas" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Tai yra suderinamų projektų, tokių kaip GNOME, KDE ir XFCE, kuriuos mes " +"turėtume rodyti, sąrašas." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Ar tvarkyti atnaujinimus GNOME Programinėje įrangoje" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Jei išjungta, GNOME Programinė įranga paslėps atnaujinimų skydelį ir " +"nevykdys automatinio atnaujinimo veiksmų." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automatiškai atsisiųsti ir įdiegti atnaujinimus" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Jei įjungta, GNOME Programinė įranga automatiškai fone atsisiunčia " +"atnaujinimus, taip pat įdiegia tuos, kuriems nereikia iš naujo paleisti " +"sistemos." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Pranešti naudotojui apie programinės įrangos atnaujinimą fone" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Jei įjungta, GNOME Programinės įranga praneša naudotojai apie atnaujinimus, " +"kurie vyko jam nedirbant." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Ar atsisiųsti atnaujinimus automatiškai esant prisijungus prie skaičiuojamo " +"ryšio" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Jei įjungta, GNOME Programinė įranga automatiškai atnaujinama fone net esant " +"prisijungus prie matuojamo ryšio (galiausiai atsisiųsdama kai kuriuos " +"metaduomenis, tikrina atnaujinimus ir t. t., dėl ko gali būti išlaidų " +"naudotojui)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Ar tai yra pirmasis GNOME Programinės įrangos paleidimas" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Šalia programų rodyti jų įvertinimą žvaigždutėmis" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtruoti programas pagal numatytąją šaką, nustatytą nutolusiam kompiuteriui" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Nelaisvos programos prieš įdiegimą rodo įspėjimo dialogą" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Kai yra įdiegiamos nelaisvos programos, gali būti rodomas įspėjimo dialogas. " +"Šis nustatymas nurodo, ar šis dialogas bus nuslopinamas." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Paskutinio atnaujinimų patikrinimo laiko žyma" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Paskutinio pranešimo apie atnaujinimą laiko žyma" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Paskutinio pranešimo apie atnaujinimą laiko žyma" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Pirmojo saugos atnaujinimo laiko žyma, išvaloma po atnaujinimo" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Paskutinio atnaujinimo laiko žyma" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Amžius sekundėmis kada tikrinama, ar ekrano nuotrauka vis dar tinkama" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Pasirinkus didesnę vertę bus mažiau užklausų nutolusiam serveriui, bet " +"atnaujinimų parodymas naudotojui gali ilgiau užtrukti. Vertė 0 reiškia, kad " +"serveris niekada nebus tikrinamas, jei paveikslėlis yra podėlyje." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Programų atsiliepimams naudojamas serveris" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Mažiausias atsiliepimų karmos įvertis" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Atsiliepimai su mažesne nei ši karma nebus rodomi." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Oficialių šaltinių, kurie neturėtų būti laikomi trečiosiomis šalimis, sąrašas" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Būtinų šaltinių, kurių negalima pašalinti, sąrašas" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Oficialių šaltinių, kurie neturėtų būti laikomi laisvąja programine įranga, " +"sąrašas" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Licencijos URL, naudojamas, kai programa neturi būti laikoma laisva " +"programine įranga" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Kai tik įmanoma, įdiegti supakuotas programas visiems sistemos naudotojams" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Leisti prieigą prie programinės įrangos šaltinių dialogo" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Siūlyti atnaujinimus į negalutines versijas" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Rodyti sąsajos elementus, pranešančius, kad programa yra nelaisva" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Rodyti įdiegtų programų dydį įdiegtų programų sąraše" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI, kuris paaiškina ne laisvą ir nuosavybinę programinę įrangą" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Sąrašas URL, nurodančių appstream failus, kurie bus atsisiųsti į jūsų " +"swcatalog aplanką" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Įdiegti AppStream failą į sisteminę vietą visiems naudotojams. Jei neigiama, " +"failai yra diegiami nestandartiniame aplanke $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Pageidaujamų paketų formatų prioritetinis sąrašas, svarbiausi pradžioje. " +"Tuščias masyvas reiškia numatytąją tvarką. Praleisti formatai laikomi " +"esančiais sąrašo pabaigoje. Formatų pavyzdžiai: deb, flatpak, rpm, snap. " +"Formatus taip pat galima nurodyti su šaltinio pavadinimu, atskirtu kableliu, " +"pavyzdžiui „flatpak:flathub“." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Laiko žyma paskutiniam bandymui pašalinti nenaudojamas Flatpak vykdymo " +"aplinkas" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Nustatykite teigiamą, kad būtų rodomos tik laisvos licencijos programos, o " +"nuosavybinės būtų slepiamos." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Nustatykite teigiamai, kad būtų rodomos tik programos, kurių kūrėjų tapatybė " +"buvo patikrinta." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Paskutinio saugos atnaujinimo laiko žyma." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Simboliu eilutė, sauganti gnome-online-account id, naudojamą prisijungimui" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Programinės įrangos AppStream sisteminė diegtuvė" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Nepavyko perskaityti komandų eilutės argumentų" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Reikia nurodyti vienintelį failą" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Šią programą gali naudoti tik root naudotojas" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Nepavyko patikrinti turinio tipo: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Nepavyko perkelti: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Programinės įrangos diegimas" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Įdiegti pažymėtą programinę įrangą sistemoje" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Animacinis smurtas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nėra informacijos apie animacinį smurtą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantastinis smurtas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nėra informacijos apie fantastinį smurtą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Tikroviškas smurtas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nėra informacijos apie realistinį smurtą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Smurtas su kraujo praliejimu" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Nėra informacijos apie kraują" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Seksualinis smurtas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nėra informacijos apie seksualinį smurtą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkoholis" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nėra informacijos apie nuorodas į alkoholį" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotikai" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nėra informacijos apie nuorodas į neteisėtus narkotikus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabakas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Nėra informacijos apie nuorodas į tabako produktus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nuogybės" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nėra informacijos apie bet kokio pavidalo nuogumą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Seksualinės temos" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Nėra informacijos apie nuorodas į arba seksualinio pobūdžio atvaizdavimus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Smurtinė kalba" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nėra informacijos apie keiksmažodžius" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Netinkamas humoras" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nėra informacijos apie netinkamą humorą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminacija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Nėra informacijos apie bet kokio pobūdžio diskriminuojančią kalbą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklamos" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nėra informacijos apie jokio pobūdžio reklamas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Azartiniai lošimai" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nėra informacijos apie jokio pobūdžio azartinius lošimus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Pirkimas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nėra informacijos apie galimybės išleisti pinigus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Pokalbiai tarp naudotojų" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Nėra informacijos apie galimybę susirašinėti su kitais žaidėjais" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Pokalbiai balsu tarp naudotojų" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Nėra informacijos apie galimybę kalbėti su kitais žaidėjais" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontaktinė informacija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nėra informacijos apie dalinimąsi socialinių tinklų naudotojų vardais ar el. " +"pašto adresais" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Indentifikacinė informacija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Nėra informacijos apie dalinimosi naudotojo informacija su trečiosiomis " +"šalimis" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Dalinimasis vieta" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Nėra informacijos apie dalinimąsi savo fizine buvimo vieta su kitais " +"naudotojais" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksualumas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nėra informacijos apie nuorodas į homoseksualumą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitucija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nėra informacijos apie nuorodas į prostituciją" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Tik suaugusiems" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nėra informacijos apie nuorodas į turinį suaugusiems" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Išreikšto seksualumo veikėjai" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nėra informacijos apie seksualizuotus veikėjus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Šventvagystės" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nėra informacijos apie nuorodas į išniekinimą" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Žmonių likučiai" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nėra informacijos apie matomus mirusių žmonių palaikus" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Vergovė" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nėra informacijos apie nuorodas į vergiją" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Nėra nuorodų į narkotikus" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Nėra keiksmažodžių ar kito pobūdžio nepadorios kalbos" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Nėra reklamų ar piniginių tranzakcijų" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Nėra sekso ar nuogybių" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Nėra neprižiūrimo pokalbių funkcionalumas" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Nėra smurto" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Narkotikai" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Nepadori kalba" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Pinigai" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Socializacija" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Smurtas" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Visiems" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s turi nežinomą amžiaus vertinimą" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s yra tinkama visiems" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s yra tinkama kūdikiams" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s yra tinkama mažiems vaikams" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s yra tinkama vaikams" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s yra tinkama paaugliams" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s yra tinkama suaugusiems" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s yra tinkama %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Amžiaus įvertinimas" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Kaip pridėti trūkstamą informaciją" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Vietinis failas" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paketas" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Laukia" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Laukia diegimo" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Laukia pašalinimo" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Diegiama" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Šalinama" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Atsisiunčiama" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "Į_diegti" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Pašalinti…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Tinklas" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Gali komunikuoti per tinklą" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Sistemos tarnybos" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Gali pasiekti D-Bus tarnybas sisteminėje magistralėje" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Seanso tarnybos" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Gali pasiekti D-Bus tarnybas seanso magistralėje" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Įrenginiai" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Gali pasiekti įvairius įrenginius, tokius kaip kameros" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Gali pasiekti įvesties įrenginius" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Gali pasiekti mikrofonus bei groti garsą" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Gali pasiekti sistemos įrenginių failus" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Ekrano turinys" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Gali pasiekti ekrano turinį" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Namų aplankas" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Gali rodyti, redaguoti arba sukurti failus" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Gali rodyti failus" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Failų sistema" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Atsisiuntimų aplankas" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Nustatymai" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Gali rodyti bei keisti bet kokius nustatymus" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Pasenusi vaizduoklio sistema" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Naudoja seną, nesaugią vaizduoklio sistemą" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Išėjimas iš dėžės" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Gali išeiti iš dėžės ir apeiti kitus ribojimus" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Nėra prieinamo atnaujinimo aprašo." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Atnaujinimo detalės" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Reikia papildomų leidimų" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Iš serverio gauti neteisingi reitingų duomenys" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Nepavyko susisiekti su reitingų serveriu" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Atsiliepimai" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Šiai programai nėra atsiliepimų." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Nėra atsiliepimų" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Versijos istorija" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Nauja versijoje %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versija %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Nėra informacijos šiam leidimui" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%Y %e %B" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Paleidimo veiksena: viena iš „updates“, „updated“, „installed“ arba " +"„overview“" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "VEIKSENA" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Ieškoti programų" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "IEŠKOTI" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Rodyti programas detalią informaciją (naudojant programos ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Rodyti programas detalią informaciją (naudojant paketo pavadinimą)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Įdiegti programą (naudojant programos ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Pašalinti programą (naudojant programos ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Atverti vietinį paketo failą" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FAILOPAVADINIMAS" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "Tikimosi interaktyvumo šiam veiksmui: „none“, „notify“ arba „full“" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "SĄVEIKA" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Rodyti vietinę meta informaciją arba appdata failą" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Įjungti išsamią derinimo išvestį (veikiančiai programai, jei jau veikia)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Įdiegia paruoštus atnaujinimus fone" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Rodyti nuostatas" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Išeiti iš veikiančio vieneto" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Teikti pirmenybę vietiniams failų šaltiniams vietoj AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Rodyti versijos numerį" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "" +"Autorių teisės saugomos © 2016–2023 GNOME Programinės įrangos pagalbininkai" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Išvertė:\n" +"Aurimas Černius " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Atsiprašome! Apie šią programą nėra informacijos." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Dydis įdiegus" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Įskaitant %s duomenų ir %s podėlio" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Įskaitant %s duomenų" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Įskaitant %s podėlio" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Podėlio ir duomenų naudojimas nežinomas" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Atsisiuntimo dydis" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Nereikia jokių papildomų sisteminių atsisiuntimų" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Reikia nežinomo dydžio papildomų sisteminių atsisiuntimų" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Reikia %s papildomų sisteminių atsisiuntimų" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Dydis nežinomas" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Nėra leidimų" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Turi tinklo prieigą" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Naudoja sistemos tarnybas" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Naudoja seanso tarnybas" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Gali pasiekti sistemos įrenginius" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Gali pasiekti sistemos įrenginius" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Gali rašyti ir skaityti visus jūsų duomenis" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Gali skaityti visus jūsų duomenis" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Gali skaityti ir rašyti visus jūsų atsisiuntimus" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Gali skaityti jūsų atsiuntimus" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Gali pasiekti kai kuriuos specifinius failus" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Gali pasiekti bei keisti naudotojo nustatymus" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Naudoja seną langų sistemą" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Gali gauti papildomų leidimų" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Programos kūrėjas yra patikrintas" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Peržiūrėta jūsų OS distribucijos" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Peržiūrėjo %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Peržiūrėta trečiosios šalies" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Programinė įranga daugiau nebepalaikoma" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Audituojamas kodas" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Nežinoma licencija" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Nuosavybinis kodas" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Speciali licencija" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privilegijuota" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Saugi" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Greičiausiai saugi" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Galimai nesaugi" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Nesaugi" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Tik mobiliems įrenginiams" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Veikia tik mažuose ekranuose" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Tik darbalaukiui" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Veikia tik dideliuose ekranuose" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Ekrano dydžio neatitikimas" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Nepalaiko jūsų dabartinio ekrano dydžio" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Reikalauja liečiamojo ekrano" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Reikalauja klaviatūros" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Reikalauja pelės" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Reikia žaidimų valdiklio" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Žaidimui reikalauja žaidimų valdiklio" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptyvi" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Veikia telefonuose, planšetėse ir darbalaukiuose" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Greičiausiai reikalauja klaviatūros arba pelės" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Veikia darbalaukiuose ir planšetėse" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Programa neturi netinkamo turinio" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Nėra prieinamos amžiaus informacijos" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Aplankyti tinklalapį" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Įdiegti…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Atsisakyti" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Įdiegti" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Atsisiųsti" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Atnaujinti" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Šalinti…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Šalinama" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritinis atnaujinimas" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Atnaujinimo metu įrenginio naudoti negalima." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Šaltinis: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Pervadinta iš %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Nustojo gauti atnaujinimus" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritinis atnaujinimas" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Įdiegta" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Padėkite išversti %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s kuria ir verčia tarptautinė pagalbininkų bendruomenė.\n" +"\n" +"Todėl, nors vis dar neprieinama jūsų kalba, galite prisidėti ir padėti ją " +"išversti." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Vertimai" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Vertimų tinklalapis" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Reikalingas nuotolinis prisijungimas %s (sritis %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Reikia prisijungti" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Atsisakyti" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Prisijungti" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "Na_udotojas" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "Sla_ptažodis" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Kita" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Visos" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Siūlomos" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Redaktoriaus pasirinkimai" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nauja ir atnaujinta" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Pasirinkimai iš žiniatinklio" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Kita programinė įranga" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s įdiegta" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Reikia paleisti iš naujo, kad pakeitimai įsigaliotų" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Programa paruošta naudojimui" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Įdiegti sistemos atnaujinimai" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Galima parašyti atsiliepimą apie neseniai įdiegtus atnaujinimus" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Paleisti iš naujo" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Paleisti" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Įdiegti programinę įrangą?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Įdiegti trečių šalių programinę įrangą?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Įjungti programinės įrangos šaltinį?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Įjungti trečių šalių programinės įrangos šaltinį?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s nėra laisva ir atviro kodo programinė įranga, o ją tiekia " +"„%s“." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s tiekia „%s“." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Šį programinės įrangos šaltinį reikia įjungti prieš tęsiant diegimą." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Kai kuriose šalyse gali būti nelegalu naudoti %s." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Kai kuriose šalyse įdiegti ar naudoti kodeką gali būti nelegalu." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Daugiau _neperspėti" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Įjungti ir į_diegti" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Detalios klaidos iš paketų tvarkytuvės:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detali informacija" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Užverti" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Detalės nukopijuotos į iškarpinę" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Priimti" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Atnaujinimas buvo įdiegtas" +msgstr[1] "Atnaujinimai buvo įdiegti" +msgstr[2] "Atnaujinimai buvo įdiegti" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Programa buvo pašalinta" +msgstr[1] "Programos buvo pašalintos" +msgstr[2] "Programos buvo pašalintos" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Reikia paleisti iš naujo, kad jis įsigaliotų" +msgstr[1] "Reikia paleisti iš naujo, kad jie įsigaliotų" +msgstr[2] "Reikia paleisti iš naujo, kad jie įsigaliotų" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Ne dabar" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Šiandien" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Vakar" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "prieš %d dieną" +msgstr[1] "prieš %d dienas" +msgstr[2] "prieš %d dienų" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "prieš %d savaitę" +msgstr[1] "prieš %d savaites" +msgstr[2] "prieš %d savaičių" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "prieš %d mėnesį" +msgstr[1] "prieš %d mėnesius" +msgstr[2] "prieš %d mėnesių" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "prieš %d metus" +msgstr[1] "prieš %d metus" +msgstr[2] "prieš %d metų" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Ką tik" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "prieš %d minutę" +msgstr[1] "prieš %d minutes" +msgstr[2] "prieš %d minučių" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "prieš %d valandą" +msgstr[1] "prieš %d valandas" +msgstr[2] "prieš %d valandų" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Visos" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Siūlomos" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D grafika" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografija" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skenavimas" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorinė grafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Žiūryklės" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Garso kūrimo ir redagavimo" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Muzikos grotuvai" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Visos" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Siūlomos" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendoriai" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Duomenų bazės" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finansų" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Teksto procesoriai" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Tekstų redaktoriai" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Žiniatinklio naršyklės" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Visos" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Siūlomos" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Veiksmo" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Nuotykių" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkada" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokai" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Stalo" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kortų" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emuliatoriai" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Vaikams" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logika" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rolių" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sportas" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategija" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Visos" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Siūlomos" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Pokalbiai" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Visos" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Siūlomos" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Dirbtinis intelektas" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomija" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chemija" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Kalbos" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Naujienos" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Meno" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografija" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komiksai" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Veiksmo" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Sveikata" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Istorija" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Gyvenimo būdas" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sportas" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Visos" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Siūlomos" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Derintuvės" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Integruotos aplinkos" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodekai" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Aparatūros tvarkyklės" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Šriftai" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Įvesties šaltiniai" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Kalbų paketai" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalizacija" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Kūrimas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Darbas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Grotuvai" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializacija" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Mokslas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Programavimas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodekai" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Aparatūros tvarkyklės" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Šriftai" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Įvesties šaltiniai" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Kalbų paketai" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalizacija" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Programa" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s prašo papildomo failo formato palaikymo." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Reikalingas papildomas MIME tipas" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s prašo papildomų šriftų." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Reikalingi papildomi šriftai" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s prašo papildomų daugialypės terpės kodekų." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Reikalingi papildomi daugialypės terpės kodekai" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s prašo papildomų spausdintuvo tvarkyklių." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Reikalingos papildomos spausdintuvo tvarkyklės" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s prašo papildomų paketų." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Reikalingi papildomi paketai" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Rasti programinėje įrangoje" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Rodyti daugiau" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Rodyti mažiau" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Šalinama…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Diegimo užbaigimui reikia perleisti" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Pašalinimo užbaigimui reikia perleisti" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Laukia diegimo…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Laukia atnaujinimo…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Atsisiunčiama…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Ruošiama…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Šalinama…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s neįdiegta, bet vis dar turi duomenų." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "Pe_rleisti" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "Į_jungti…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "Į_diegti…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s bus rodoma anglu kalba" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Ši programa bus rodoma anglu kalba" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Ši programa bus rodoma anglu kalba" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Padėti iš_versti" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Kitos %s programos" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Kūrėjas %s įrodė, kad kuria %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Kūrėjas įrodė, kad kuria %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Norėdami parašyti atsiliepimą turite prisijungti prie interneto" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Ši programa nebegauna atnaujinimų, taip pat ir saugumo" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Šią programinę įrangą jau pateikia jūsų distribucija ir jos nereikėtų " +"pakeisti." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Ši programa nepateikia nuorodų į tinklalapį, kodo saugyklą ar klaidų sistemą." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Ši programinė įranga nebegauna atnaujinimų, įskaitant saugumo" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Šią programinę įrangą jau pateikia jūsų distribucija ir jos nereikėtų " +"pakeisti." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Ši programinė įranga nepateikia nuorodų į tinklalapį, kodo saugyklą ar " +"klaidų sistemą." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Programinei įrangai nepavyko gauti informacijos apie „%s“ ir nepavyko " +"parodyti šios programos informacijos." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Iš serverio gautas neteisingas įvertinimo atsakas" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Nepavyko pateikti atsiliepimo apie „%s“: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Detalių puslapis" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Įkeliamos programų detalės" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Patikrinta" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Atverti" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Atnaujinti" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Pašalinti" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Priedai" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "Šią programą galima naudoti tik esant aktyviam interneto ryšiui." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Įtrauktas programinė įrangos šaltinis" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Ši programa įtraukia programinės įrangos šaltinį, kuris pateikia " +"atnaujinimus, taip pat leidžia prieiti prie kitos programinės įrangos." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Neįtrauktas programinės įrangos šaltinis" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Ši programa neturi programinės įrangos šaltinio. Ji nebus atnaujinama į " +"naujas versijas." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Programinės įrangos šaltinis identifikuotas" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Šio programinės įrangos šaltinio pridėjimas suteiks jums priėjimą prie " +"papildomos programinės įrangos ir atnaujinimų." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Naudoti tik patikimą programinę įrangą." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Išvalyti programos duomenis" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Iš_trinti duomenis" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Nėra metaduomenų" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Projekto _tinklalapis" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Paremti" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Prisidėti prie _vertimo" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "P_ranešti apie klaidą" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Žinynas" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontaktinė informacija" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Raš_yti atsiliepimą" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Visi atsiliepimai" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Nepavyko parodyti programos detalios informacijos" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Nepavyko paruošti paleidimo iš naujo" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Nežinoma klaida" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Raktas nerastas" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Raktas neįtrauktas" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Būtinas MOK įtraukimas" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Kitas" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Įrenginyje įjungtas Saugus paleidimas. Kad naujos tvarkyklės būti įjungtos, " +"turi būti įtrauktas naujas savininko raktas (MOK). Šis procesas vėlesniuose " +"žingsniuose reikalauja įvesti slaptažodį. Užsirašykite šį su raktu susietą " +"slaptažodį:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Užsirašiau MOK sla_ptažodį" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "Pe_rleisti ir įtraukti…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Nustatymo instrukcija: atidžiai perskaitykite" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Po paleidimo iš naujo įrenginys rodys nustatymo ekraną. Naujoms tvarkyklėms " +"įjungti, atlikite šiuos žingsnius:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Pasirinkite „Enroll MOK“\n" +"• Pasirinkite „Yes“ raktams įtraukti\n" +"• Kai bus paprašyta, įveskite MOK slaptažodį\n" +"• Tuomet pasirinkite „Reboot“" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Saugumo rezultatas" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Po sėkmingo rakto įtraukimo bet kokiu būsimu modulio atnaujinimu ar bet " +"kokiu kitu moduliu bus numatytai pasitikima. Būsimi atnaujinimai vyks " +"savaime be jokių klausimų ir leidimų." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Daugiau informacijos galima rasti dokumentacijoje." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Atsisiunčiami papildomi metaduomenų failai…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " ir " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Galimi šriftai %s scenarijui" +msgstr[1] "Galimi šriftai %s scenarijams" +msgstr[2] "Galimi šriftai %s scenarijų" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s prieinama programinė įranga" +msgstr[1] "%s prieinama programinė įranga" +msgstr[2] "%s prieinama programinė įranga" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Prašoma programinė įranga nerasta" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Nepavyko rasti prašomos programinės įrangos" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s nerasta" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "žiniatinklyje" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Nėra programų, kurios pateikia failą %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informaciją apie %s, taip pat kaip gauti trūkstamas programas, galite rasti " +"tinklalapyje %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Nėra programų %s palaikymui." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s neprieinama." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informaciją apie %s, taip pat kaip gauti programą, kuri gali palaikyti šį " +"formatą, galite rasti tinklalapyje %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Nėra šriftų %s scenarijaus palaikymui." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informaciją apie %s, taip pat kaip gauti papildomus šriftus, galite rasti " +"tinklalapyje %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Nėra papildomų kodekų %s formatui." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informaciją apie %s, taip pat kaip gauti kodeką, kuris gali groti šį " +"formatą, galite rasti tinklalapyje %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Nėra Plasma išteklių %s palaikymui." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informaciją apie %s, taip pat kaip gauti papildomus Plasma išteklius, galite " +"rasti tinklalapyje %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Nėra %s prieinamų spausdintuvo tvarkyklių." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informaciją apie %s, taip pat kaip gauti tvarkyklę, kuri palaiko šį " +"spausdintuvą, galite rasti tinklalapyje %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentacija" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "Nepavyko rasti %s, prašomo %s. Daugiau informacijos rasite %s." +msgstr[1] "Nepavyko rasti %s, prašomo %s. Daugiau informacijos rasite %s." +msgstr[2] "Nepavyko rasti %s, prašomo %s. Daugiau informacijos rasite %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[1] "" +"Deja, jūsų ieškomų %s nepavyko rasti. Daugiau informacijos rasite %s." +msgstr[2] "" +"Deja, jūsų ieškomų %s nepavyko rasti. Daugiau informacijos rasite %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Nepavyko rasti jokių rezultatų: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s failo formatas" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Įdiegti _viską" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Nepavyko rasti prašomos programinės įrangos" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kodekų puslapis" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Nerasta rezultatų." + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Nepavyko vykdyti paieškos" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Ankstesnis" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Kitas" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Siūlomų programų sąrašas" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Darbalaukio palaikymas" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Palaiko naudojimą dideliuose ekranuose" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Darbalaukio palaikymas nežinomas" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Nepakanka informacijos apie didelių ekranų palaikymą" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Reikalauja didelio ekrano" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Darbalaukis nepalaikomas" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Negali būti naudojama dideliuose ekranuose" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobiliųjų palaikymas" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Veikia mažuose ekranuose" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobiliųjų palaikymas nežinomas" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Nepakanka informacijos apie mažų ekranų palaikymą" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Reikalauja mažo ekrano" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobilieji nepalaikomi" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Neveikia mažuose ekranuose" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Klaviatūros palaikymas" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Klaviatūros palaikymas nežinomas" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Nepakanka informacijos apie klaviatūros palaikymą" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Būtina klaviatūra" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Palaiko klaviatūrą" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Nepalaiko klaviatūros" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Negali būti naudojama su klaviatūra" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Pelės palaikymas" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Reikalauja pelės ar rodomojo įrenginio" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Pelės palaikymas nežinomas" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "Nepakanka informacijos apie pelės ar rodomojo įrenginio palaikymą" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Būtina pelė" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Palaiko pelę ir rodomuosius įrenginius" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Pelė nepalaikoma" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Negali būti naudojama pele ar rodomuoju įrenginiu" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Liečiamojo ekrano palaikymas" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Liečiamojo ekrano palaikymas nežinomas" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Nepakanka informacijos apie liečiamojo ekrano palaikymą" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Reikia liečiamojo ekrano" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Palaiko liečiamąjį ekraną" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Nepalaiko liečiamojo ekrano" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Negali būti naudojama liečiamuoju ekranu" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Reikia žaidimų valdiklio" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Žaidimui reikalauja žaidimų valdiklio" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Žaidimų valdiklio palaikymas" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Palaiko žaidimų valdiklius" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s greičiausiai veiktų šiame įrenginyje" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s veiktų šiame įrenginyje" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s greičiausiai veiktų šiame įrenginyje" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s neveiktų tvarkingai šiame įrenginyje" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s neveiktų šiame įrenginyje" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Aparatinės įrangos palaikymas" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Judėjimas" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Eiti į naršymo puslapį" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Eiti į įdiegtų puslapį" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Eiti į atnaujinimų puslapį" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Atverti paieškos juostą" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Langai" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Atverti nuostatas" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Atverti programinės įrangos šaltinius" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Žinynas" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Atverti klaviatūros trumpinius" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Įdiegta" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Įdiegtų puslapis" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Vykdoma" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Programos" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Internetinės programos" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Sisteminės programos" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Bendruomenės kūrinys" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Prisidėti" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Šią programą sukūrė atvira pagalbininkų bendruomenė ir išleido pagal %s licenciją.\n" +"\n" +"Galite prisidėti ir ją pagerinti." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Šią programą sukūrė atvira pagalbininkų bendruomenė ir išleido pagal %s " +"licenciją.\n" +"\n" +"Galite prisidėti ir ją pagerinti." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Šią programinę įrangą sukūrė atvira pagalbininkų bendruomenė ir išleido " +"pagal %s licenciją.\n" +"\n" +"Galite prisidėti ir ją pagerinti." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Šią programinę įrangą sukūrė atvira pagalbininkų bendruomenė ir išleido " +"pagal %s licenciją.\n" +"\n" +"Galite prisidėti ir ją pagerinti." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Nežinoma licencija" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Sužinoti daugiau" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ši programa nėra kuriama atvirai, tad tik jos kūrėjai žino, kaip ji veikia. " +"Jos naudojimui gali būti taikomi ribojimai ir gali būti sunkiau pasakyti, ar " +"programinė įranga yra nesaugi.\n" +"\n" +"Galite negalėti prisidėti ar įtakoti šios programinės įrangos kūrimą." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ši programinė įranga nėra kuriama atvirai, tad tik jos kūrėjai žino, kaip ji " +"veikia. Jos naudojimui gali būti taikomi ribojimai ir gali būti sunkiau " +"pasakyti, ar programinė įranga yra nesaugi.\n" +"\n" +"Galite negalėti prisidėti ar įtakoti šios programinės įrangos kūrimą." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Nuosavybinė" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Ši programa nėra kuriama atvirai, tad tik jos kūrėjai žino, kaip ji veikia. " +"Jos naudojimui gali būti taikomi ribojimai ir gali būti sunkiau pasakyti, ar " +"programinė įranga yra nesaugi.\n" +"\n" +"Galite negalėti prisidėti ar įtakoti šios programinės įrangos kūrimą." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Ši programinė įranga nėra kuriama atvirai, tad tik jos kūrėjai žino, kaip ji " +"veikia. Jos naudojimui gali būti taikomi ribojimai ir gali būti sunkiau " +"pasakyti, ar programinė įranga yra nesaugi.\n" +"\n" +"Galite negalėti prisidėti ar įtakoti šios programinės įrangos kūrimą." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Speciali licencija" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ši programa yra kuriama pagal specialią licenciją %s.\n" +"\n" +"Jūsų galimybės prisidėti nežinomos." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ši programa yra kuriama pagal specialią licenciją „%s“.\n" +"\n" +"Jūsų galimybės prisidėti nežinomos." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ši programinė įranga yra kuriama pagal specialią licenciją %s.\n" +"\n" +"Jūsų galimybės prisidėti nežinomos." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ši programinė įranga yra kuriama pagal specialią licenciją „%s“.\n" +"\n" +"Jūsų galimybės prisidėti nežinomos." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Atnaujinami duomenys" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Įkeliamas puslapis" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Paleidžiama" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Nežinomas šaltinis" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Naudotojas" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Pridedama" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Šalinama" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Atnaujinimai" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Grąžinama senesnė versija" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "pasirinkti išoriniai šaltiniai" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Pateikia prieiga prie papildomos programinės įrangos iš %s. Įtraukia " +"nuosavybinę programinę įrangą.\n" +"\n" +"Galite įjungti šias saugyklas vėliau Programinės įrangos saugyklų nuostatose." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Įjungti trečių šalių programinės įrangos šaltinius?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Nepaisyti" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "Į_jungti" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Prieinama jūsų operacinėje sistemoje" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Prieinama %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Naršyti" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Apžvalgos puslapis" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Prieinamos programos" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Kitos kategorijos" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nerasta programos duomenų" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Nežinomas" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Gerai" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Naudotojas neleido įdiegti" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Paruošiama %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Ar tikrai norite pašalinti %s saugyklą?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Visos programos iš %s bus pašalintos ir turėsite vėl įdiegti saugyklą, jei " +"norite jomis naudotis." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Pašalinti %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Nebebus galima naudotis %s po pašalinimo." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Po pašalinimo nebebus galima naudotis jokia programa, kuri priklauso nuo %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Po pašalinimo nebebus galima naudoti %s, bet kokie jį naudojantys dokumentai " +"bus rodomi kitu šriftu." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Po pašalinimo nebebus galima naudoti %s. Tai reiškia, kad tam tikro tipo " +"multimedijos failų nebebus galima groti." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Aparatinė įranga, kuri priklauso nuo %s, po pašalinimo gali tvarkingai " +"nebeveikti." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Nebebus galima naudoti %s po pašalinimo. Programos duomenis bei nuostatos " +"bus paliktos diske ir leis ateityje atstatyti programą." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Nuostatos" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Programinės įrangos atnaujinimai" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Daugiau informacijos" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Atnaujinimų tikrinimas bei atsisiuntimas naudoja duomenis bei energiją. " +"Todėl automatiniai atnaujinimai yra pristabdomi naudojant matuojamus tinkus " +"bei kai energijos taupymas yra įjungtas." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatiniai" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Automatiškai atsisiųsti ir įdiegti atnaujinimus" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Rankiniai" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Atnaujinimų tikrinimas ir atsisiuntimas turi būti atliktas rankomis" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Automatinių at_naujinimų pranešimai" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Rodyti pranešimus automatiškai įdiegus atnaujinimus" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Turinio filtrai" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Rodyti tik _laisvą programinę įrangą" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Slėpti nuosavybinę programinę įrangą naršant ir ieškant" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Rodyti tik pa_tikrintus kūrėjus" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Rodyti tik programas, kurių kūrėjų tapatybė buvo patikrinta" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Dalis šiuo metu įdiegtos programinės įrangos nėra suderinama su %s ir bus " +"automatiškai pašalinti atnaujinant." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Nesuderinama programinė įranga" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "Atna_ujinti" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Pašalinti" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Programų nuostatos ir duomenys" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "Pali_kti" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Leidžia atstatyti programos nuostatas ir turinį" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "Iš_trinti" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Negrįžtamai ištrina duomenis disko vietai taupyti" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "Programinė įranga, kuri buvo įdiegta iš „%s“, nebegaus atnaujinimų." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Išjungti saugyklą?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Pašalinti saugyklą?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "Iš_jungti" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Pašalinti" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Įjungti naujas saugyklas" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Įjungti naujas saugyklas, kai jos pridedamos" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "daugiau informacijos" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Papildomos saugyklos iš pažymėtų trečiųjų šalių – %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora trečiųjų šalių saugyklos" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "operacinė sistema" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Šie šaltiniai papildo numatytąjį %s pateiktą šaltinį." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Programinės įrangos šaltiniai" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Nėra saugyklų" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "Įdiegta %u programa" +msgstr[1] "Įdiegtos %u programos" +msgstr[2] "Įdiegta %u programų" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "Įdiegtas %u priedas" +msgstr[1] "Įdiegti %u priedai" +msgstr[2] "Įdiegta %u priedų" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u programa" +msgstr[1] "%u programos" +msgstr[2] "%u programų" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u priedas" +msgstr[1] "%u priedai" +msgstr[2] "%u priedų" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "Įdiegta: %s ir %s" +msgstr[1] "Įdiegta: %s ir %s" +msgstr[2] "Įdiegta: %s ir %s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Tikrinama įdiegta programinė įranga…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Pašalinti" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Šlamštas" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Nepatinka" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Gera" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Patinka" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Nuostabi" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Pasirinkite žvaigždutę reitingui palikti" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Prašome atsiliepimo rašymui skirti daugiau laiko" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Prašome pasirinkti įvertinimą žvaigždutėmis" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Santrauka pernelyg trumpa" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Santrauka pernelyg ilga" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Aprašas pernelyg trumpas" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Aprašas pernelyg ilgas" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Rašyti atsiliepimą" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Siųsti" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Pateikite reitingą, santrauką ir apžvalgos tekstą. Apžvalgos neturėtų būti " +"naudojamos pranešimui apie klaidas: susisiekite su kūrėju arba savo pagalbos " +"tiekėju." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Atsiliepimo santrauka" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Rašyti trumpą atsiliepimą" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Mūsų siunčiamus duomenis sužinosite perskaitę mūsų privatumo politiką. Su jūsų paskyra susietas pilnas " +"vardas bus rodomas viešai." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "Iš viso %u apžvalga" +msgstr[1] "Iš viso %u apžvalgos" +msgstr[2] "Iš viso %u apžvalgų" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "iš 5 žvaigždučių" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Nežinomas" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Jūs galite pranešti apie įžeidžiančius, nepadorius ir diskriminacinio " +"pobūdžio atsiliepimus." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Pranešus, atsiliepimas bus paslėptas tol, kol jo nepatikrins " +"administratorius." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Pranešti apie atsiliepimą?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "P_ranešti" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Pašalinti atsiliepimą?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Atsiliepimo pašalinimo negalima atšaukti." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Pamėgti atsiliepimą" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Nemėgti atsiliepimo" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Pranešti…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Šalinti…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Programa nėra apribota, bet distribucija patikrino, kad ji nekenksminga" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Įsitikinkite, kad pasitikite tiekėju, nes programa nėra apribota" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Nėra leidimų" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Ši programa yra visiškai izoliuota" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Tinklo prieigą" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Gali pasiekti internetą" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Nėra tinklo prieigos" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Negali pasiekti interneto" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Naudoja sistemos tarnybas" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Gali prašyti duomenų iš sistemos tarnybų" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Naudoja seanso tarnybas" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Gali prašyti duomenų iš seanso tarnybų" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Naudotojo įrenginių prieiga" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Gali pasiekti tokius įrenginius kaip internetinė kamera ar žaidimų valdikliai" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Nėra naudotojo įrenginių prieigos" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Negali pasiekti tokius įrenginių kaip internetinė kamera ar žaidimų " +"valdikliai" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Įvesties įrenginių prieiga" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Mikrofono prieiga ir garso grojimas" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Gali klausytis naudodama mikrofonus bei groti garsą neprašydama leidimo" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Sistemos įrenginių prieiga" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Gali pasiekti sistemos įrenginius, kuriems reikia didesnių leidimų" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Ekrano turinio prieiga" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Gali pasiekti ekrano ar kitų langų turinį" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Sena langų sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Papildomi leidimai" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Naudotojo nustatymai" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Visa failų sistemos skaitymo/rašymo prieiga" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Gali skaityti bei rašyti duomenis failų sistemoje" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Namų aplanko skaitymo/rašymo prieiga" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Gali rašyti ir skaityti visus jūsų namų aplanko duomenis" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Visos failų sistemos skaitymo prieiga" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Gali skaityti visus duomenis failų sistemoje" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Namų aplanko skaitymo prieiga" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Gali skaityti visus jūsų namų aplanko duomenis" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Atsisiuntimų aplanko skaitymo/rašymo prieiga" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Gali skaityti ir rašyti visus jūsų atsisiuntimus" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Atsisiuntimų aplanko skaitymo prieiga" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Gali skaityti jūsų atsiuntimus" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Gali rašyti ir skaityti visus jūsų namų aplanko duomenis" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Gali skaityti visus duomenis aplanke" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Nėra failų sistemos prieigos" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Išvis negali pasiekti failų sistemos" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Programos kūrėjas yra patikrintas" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Šios programos kūrėjas buvo patikrintas" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Nesaugios priklausomybės" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Programinė įranga arba jos priklausomybės nebepalaikomos ir gali būti " +"nesaugios" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Ši programa nenurodo, pagal kokią licenciją ji kuriama, ir gali būti " +"nuosavybinė" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Ši programinė įranga nenurodo, pagal kokią licenciją ji kuriama, ir gali " +"būti nuosavybinė" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Nuosavybinis kodas" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Programos kodas nėra viešas, todėl ji negali būti nepriklausomai audituota " +"bei gali būti nesaugi" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Ši programa yra kuriama pagal specialią licenciją „%s“" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Ši programinė įranga yra kuriama pagal specialią licenciją „%s“" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Audituojamas kodas" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Programos kodas yra viešas ir gali būti nepriklausomai audituotas, todėl " +"programa yra tikėtinai saugi" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s yra privilegijuota" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s yra saugi" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s yra greičiausiai saugi" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s yra galimai nesaugi" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s yra nesaugi" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Nežinoma" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Saugumas" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licencija" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Šaltinis" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Ši programa naudoja pasenusią programinės įrangos platformą (SDK) ir joje " +"gali būti klaidų ar saugumo spragų, kurios nebus pataisytos." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Ankstesnė ekrano nuotrauka" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Kita ekrano nuotrauka" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Nėra ekranvaizdžių" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Ekrano nuotrauka nerasta" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Nepavyko įkelti paveikslėlio" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Ekrano nuotraukos dydis nerastas" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Nepavyko sukurti podėlio" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Ekrano nuotrauka netinkama" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Ekrano nuotrauka neprieinama" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Ekrano nuotrauka" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "dar %u atitikmuo" +msgstr[1] "dar %u atitikmenys" +msgstr[2] "dar %u atitikmenų" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Paieškos puslapis" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Ieškoti programų" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Nerasta programa" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "„%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "Nepavyksta atsisiųsti atnaujinimų" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "Nepavyksta atsisiųsti aparatinės programinės įrangos atnaujinimų" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nepavyksta atsisiųsti aparatinės programinės įrangos atnaujinimų iš %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nepavyksta atsisiųsti atnaujinimų iš %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "Nepavyko atnaujinti: būtina interneto prieiga" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "Nepavyko atnaujinti: nepakanka disko vietos" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Nepavyksta atsisiųsti atnaujinimų iš %s: nepakanka disko vietos" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "Nepavyko atnaujinti: būtina patvirtinti tapatybę" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "Nepavyko atnaujinti: nepavyko patvirtinti tapatybės" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "Nepavyko atnaujinti: būtinas leidimas" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Nepavyksta atsisiųsti atnaujinimų: neturite leidimo įdiegti programinę įrangą" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "Nepavyko gauti atnaujinimų sąrašo" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "Nepavyko įdiegti: nepavyko atsisiųsti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Nepavyko įdiegti %s: nepavyko atsisiųsti iš %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Nepavyko įdiegti %s: nepavyko atsisiųsti" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "Nepavyko įdiegti: trūksta vykdymo aplinkos" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Nepavyko įdiegti %s: vykdymo aplinka %s nėra prieinama" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "Nepavyko įdiegti %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "Nepavyko įdiegti: būtina interneto prieiga" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "Nepavyko įdiegti: programa yra netinkamo formato" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "Nepavyko įdiegti: nepakanka disko vietos" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Nepavyko įdiegti %s: nepakanka disko vietos" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "Nepavyko įdiegti: būtina patvirtinti tapatybę" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Nepavyko įdiegti %s: būtina patvirtinti tapatybę" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "Nepavyko įdiegti: nepavyko patvirtinti tapatybės" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Nepavyko įdiegti %s: nepavyko patvirtinti tapatybės" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "Nepavyko įdiegti: būtinas leidimas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Nepavyko įdiegti %s: būtinas leidimas" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "" +"Nepavyko įdiegti: įrenginys turi būti prijungtas prie energijos šaltinio" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "" +"Nepavyko įdiegti %s: įrenginys turi būti prijungtas prie energijos šaltinio" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "Nepavyko įdiegti: senka baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Nepavyko įdiegti %s: senka baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Nepavyko atnaujinti %s iš %s: nepavyko atsisiųsti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Nepavyko atnaujinti %s: nepavyko atsisiųsti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Nepavyko įdiegti atnaujinimų iš %s: nepavyko atsisiųsti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "Nepavyko atnaujinti, nepavyko atsisiųsti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Nepavyko atnaujinti %s: nepakanka disko vietos" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Nepavyko atnaujinti %s: būtina patvirtinti tapatybę" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Nepavyko atnaujinti %s: nepavyko patvirtinti tapatybės" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Nepavyko atnaujinti %s: būtinas leidimas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "" +"Nepavyko atnaujinti: įrenginys turi būti prijungtas prie energijos šaltinio" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "" +"Nepavyko atnaujinti %s: įrenginys turi būti prijungtas prie energijos " +"šaltinio" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "Nepavyko atnaujinti: senka baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Nepavyko atnaujinti %s: senka baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "Nepavyko atnaujinti %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "Nepavyko atnaujinti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "Nepavyko iš esmės atnaujinti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Nepavyko iš esmės atnaujinti %s iš %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "Nepavyko iš esmės atnaujinti, nepavyko atsisiųsti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Nepavyko iš esmės atnaujinti į %s: nepavyko atsisiųsti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "Nepavyko iš esmės atnaujinti: būtina interneto prieiga" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Nepavyko iš esmės atnaujinti į %s: būtina interneto prieiga" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "Nepavyko iš esmės atnaujinti: nepakanka disko vietos" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Nepavyko iš esmės atnaujinti į %s: nepakanka disko vietos" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "Nepavyko iš esmės atnaujinti: būtina patvirtinti tapatybę" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Nepavyko iš esmės atnaujinti į %s: būtina patvirtinti tapatybę" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "Nepavyko iš esmės atnaujinti: nepavyko patvirtinti tapatybės" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Nepavyko iš esmės atnaujinti į %s: nepavyko patvirtinti tapatybės" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "Nepavyko iš esmės atnaujinti: būtinas leidimas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Nepavyko iš esmės atnaujinti į %s: būtinas leidimas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "" +"Nepavyko iš esmės atnaujinti: įrenginys turi būti prijungtas prie energijos " +"šaltinio" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Nepavyko iš esmės atnaujinti į%s: įrenginys turi būti prijungtas prie " +"energijos šaltinio" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "Nepavyko iš esmės atnaujinti: senka baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Nepavyko iš esmės atnaujinti į %s: senka baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nepavyko iš esmės atnaujinti į %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "Nepavyko išdiegti: būtina patvirtinti tapatybę" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Nepavyko išdiegti %s: būtina patvirtinti tapatybę" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "Nepavyko išdiegti: nepavyko patvirtinti tapatybės" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Nepavyko išdiegti %s: nepavyko patvirtinti tapatybės" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "Nepavyko išdiegti: būtinas leidimas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Nepavyko išdiegti %s: būtinas leidimas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "" +"Nepavyko išdiegti: įrenginys turi būti prijungtas prie energijos šaltinio" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "" +"Nepavyko išdiegti %s: įrenginys turi būti prijungtas prie energijos šaltinio" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "Nepavyko išdiegti: senka baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Nepavyko išdiegti %s: senka baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Nepavyko išdiegti %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "Nepavyko paleisti %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "Atleiskite, atsitiko kažkas negero" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Nepavyko paleisti %s: %s neįdiegta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "Nepakanka disko vietos veiksmui" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "Nepavyko įdiegti: failo tipas nepalaikomas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "Nepavyko įdiegti: būtina patvirtinti tapatybę" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "Nepavyko įdiegti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "Nepavyko susisiekti su %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "Reikia perleisti Programinę įrangą norint naudoti naujus įskiepius" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "Įrenginys turi būti prijungtas prie energijos šaltinio" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "Akumuliatorius per daug išsikrovęs" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Programinės įrangos šaltiniai" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Nuostatos" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Klaviatūros trumpiniai" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Apie programinę įrangą" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Paieška" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Pagrindinis meniu" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Ieškoti programų" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Naršyti" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "Į_diegta" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Atnaujinimai" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Grįžti atgal" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nėra" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Programų duomenys" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Programos vykdymui reikalingi duomenys" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Naudotojo duomenys" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Jūsų sukurti duomenys programoje" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Podėlio duomenys" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Laikini podėlio duomenys" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Pati programa" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Būtinos priklausomybės" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Bendri sistemos komponentai, kurių reikia šiai programai" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Nežinoma" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Podėlio duomenys gali būti išvalyti naudojant progr_amos " +"nuostatas" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Saugykla" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (įdiegta)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (diegiama)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (atsisiunčiama)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (šalinama)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detali informacija" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Tikrinti" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Įdiegta %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Įdiegti atnaujinimai" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Nėra įdiegtų atnaujinimų" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Atnaujinimai yra pasenę" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Patikrinkite, ar yra atnaujinimų" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Kritiniai atnaujinimai paruošti diegimui" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Kaip galima greičiau įdiekite kritinius atnaujinimus" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Galima atsisiųsti kritinius atnaujinimus" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Kaip galima greičiau atsisiųskite kritinius atnaujinimus" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Atnaujinimai paruošti diegimui" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Programinės įrangos atnaujinimai paruošti ir laukia" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Galima atsisiųsti atnaujinimų" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Galima atsisiųsti programinės įrangos atnaujinimų" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u programa atnaujinta – reikia paleisti iš naujo" +msgstr[1] "%u programos atnaujintos – reikia paleisti iš naujo" +msgstr[2] "%u programų atnaujinta – reikia paleisti iš naujo" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u programa atnaujinta" +msgstr[1] "%u programos atnaujintos" +msgstr[2] "%u programų atnaujinta" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s buvo atnaujinta." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Paleiskite programą iš naujo." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s ir %s buvo atnaujintos." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "Reikia iš naujo paleisti %u programą." +msgstr[1] "Reikia iš naujo paleisti %u programas." +msgstr[2] "Reikia iš naujo paleisti %u programų." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Įskaitant %s, %s bei %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Baigėsi sistemos gyvavimo laikas" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Atnaujinkite, jei norite toliau gauti saugumo spragų taisymus" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Nauja %s versija yra prieinama diegimui" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Yra programinės įrangos atnaujinimas" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Nepavyko įdiegti atnaujinimų" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Paruošti atnaujinimai nebuvo įdiegti" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Rodyti detalią informaciją" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Sistemos esminis atnaujinimas baigtas" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Sveiki pradėję naudoti %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Programinės įrangos atnaujinimas įdiegtas" +msgstr[1] "Programinės įrangos atnaujinimai įdiegti" +msgstr[2] "Programinės įrangos atnaujinimai įdiegti" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Buvo įdiegtas svarbus operacinės sistemos atnaujinimas." +msgstr[1] "Buvo įdiegti svarbūs operacinės sistemos atnaujinimai." +msgstr[2] "Buvo įdiegti svarbūs operacinės sistemos atnaujinimai." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Peržiūrėti" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Nepavyko atnaujinti" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Sistema jau buvo atnaujinta." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Atnaujinimas buvo nutrauktas." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Buvo būtinas tinklo ryšys, bet jis neprieinamas. Patikrinkite, ar yra " +"interneto ryšys ir bandykite dar kartą." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Atnaujinant kilo saugumo problemų. Pasikonsultuokite su programinės įrangos " +"tiekėju." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Nepakanka disko vietos. Atlaisvinkite vietos ir bandykite vėl." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Atsiprašome, atnaujinimo nepavyko įdiegti. Palaukite kito atnaujinimo ir " +"bandykite vėl. Jei problema išliks, kreipkitės į programinės įrangos tiekėją." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Paskutinį kartą tikrinta: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Stabdyti" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Tikrinti, ar yra atnaujinimų" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s nustojo gauti kritinius programinės įrangos atnaujinimus" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Jūsų operacinė sistema nustojo gauti kritinius programinės įrangos " +"atnaujinimus" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Tai gali kainuoti" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Atnaujinimų tikrinimas naudojant mobilų plačiajuostį ryšį gali kainuoti." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Vistiek tikrinti" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Programinės įrangos atnaujinimai atsiųsti" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Esminiai atnaujinimai paruošti įdiegimui" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Tikrinti, ar yra atnaujinimų" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Atnaujinimai" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Atnaujinimų puslapis" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Įkeliami atnaujinimai" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Tai gali užtrukti" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Naujausia" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Naudoti mobiliuosius duomenis?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Atnaujinimų tikrinimas naudojant mobilųjį plačiajuostį ryšį gali kainuoti" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Vistiek tikrinti" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Nėra ryšio" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Prisijungti ir tikrinti, ar yra atnaujinimų" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Tinklo _nustatymai" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Klaida" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Atnaujinimai tvarkomi automatiškai" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Programinės įrangos atnaujinimai pristabdyti" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automatiniai programinės įrangos atnaujinimai buvo pristabdyti dėl šių " +"priežasčių:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Dabartinis tinklo ryšys yra matuojamas" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Dabartinis tinklo ryšys neleidžia didelių atsisiuntimų" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Įjungta energijos taupymo veiksena" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Įjungta žaidimų veiksena" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Programinės įrangos atnaujinimai pristabdyti" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"Tinklo ryšys yra matuojamas — programinės įrangos atnaujinimai pristabdyti" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Tinklo ryšys neleidžia didelių atsisiuntimų — programinės įrangos " +"atnaujinimai pristabdyti" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"Įjungta energijos taupymo veiksena — programinės įrangos atnaujinimai " +"pristabdyti" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "" +"Įjungta žaidimų veiksena — programinės įrangos atnaujinimai pristabdyti" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "Pe_rleisti ir atnaujinti…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_Atnaujinti viską" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Programinės įrangos atnaujinimai atsisiųsti" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Atnaujinimai paruošti diegimui" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integruota aparatinė programinė įranga" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Reikia perleisti" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Programų atnaujinimai" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Įrenginio aparatinė programinė įranga" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Atsisiųsti" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Dabar prieinama %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Prieinama %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Sužinokite apie naujausią versiją" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Atsisiųsta %s iš %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Atsisiųsta %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "" +"Esminis atnaujinimas su naujomis ypatybėmis ir pridėtomis įmantrybėmis." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Atsisakyti atnaujinti" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "Pe_rleisti ir atnaujinti…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Prieš atnaujinant pasidarykite savo duomenų ir failų atsarginę kopiją." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Klaidos detalią informaciją" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Kopijuoti detalią informaciją" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Nepavyko ištrinti failo „%s“: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Nepavyko ištrinti aplanko „%s“: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Pridėti, šalinti arba atnaujinti šio kompiuterio programinę įrangą" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Atnaujinimai;Šaltiniai;Saugyklos;Nuostatos;Įdiegti;Išdiegti;Programa;" +"Programinė;Įranga;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s paruoštas" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s paruoštas įjungimai ir parengtas kitam paleidimui." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Įjungti" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Sistemos atnaujinimai" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Bendri sistemos atnaujinimai, tokie kaip saugumo ar klaidų taisymai, našumo " +"pagerinimai." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s atnaujinimas su naujomis ypatybėmis ir taisymais." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS atnaujinimo tarnybai nepavyko gauti ir pritaikyti atnaujinimo." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Internetinė programa" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Žiniatinklio programų palaikymas" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Vykdyti populiarias žiniatinklio programas naršyklėje" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "Atnaujinkite ir gaukite naujausias savybes bei patobulinimus." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak palaikymas" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak yra karkasas, skirtas darbalaukio programoms Linux sistemose" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Sistemos aplankas %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Namų aplankas %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Pagrindinės sistemos aplankai" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Pagrindinės sistemos konfigūracija iš /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Darbastalio aplankas" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Darbastalio poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Dokumentų aplankas" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Dokumentų poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Muzikos aplankas" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Muzikos poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Paveikslėlių aplankas" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Paveikslėlių poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Viešinių aplankas" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Viešinių poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Vaizdo įrašų aplankas" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Vaizdo įrašų poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Šablonų aplankas" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Šablonų poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Naudotojo podėlio aplankas" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Naudotojo podėlio poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Naudotojo konfigūracijos aplankas" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Naudotojo konfigūracijos poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Naudotojo duomenų aplankas" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Naudotojo duomenų poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Naudotojo vykdymo aplinkos aplankas" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Naudotojo vykdymo aplinkos poaplankis %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Failų sistemos prieiga prie %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Gaunami %s flatpak metaduomenys…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Nepavyko patikslinti priedo „%s“: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Naudotojo diegimas" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Sistemos diegimas" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Programos ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Nepavyko pridėti prie diegimo priedo „%s“: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Nepavyko pridėti prie šalinimo priedo „%s“: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Nuotolinis „%s“ neleidžia diegti „%s“, galimai dėl jo filtro. Pašalinkite " +"filtrą ir pakartokite diegimą. Detali klaida: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Sistemai trūksta energijos atnaujinimui" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "Sistemai trūksta energijos atnaujinimui (%u%%, reikia %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Įrenginys nepasiekiamas arba už belaidžio ryšio ribų" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Akumuliatorius per daug išsikrovęs" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Akumuliatorius per daug išsikrovęs (%u%%, reikia %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Įrenginys laukia, kol bus pritaikytas atnaujinimas" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Įrenginį reikia prijungti prie srovės šaltinio" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Įrenginio negalima naudoti užversto" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s įrenginio atnaujinimas" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s sistemos atnaujinimas" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s integruoto valdiklio atnaujinimas" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME atnaujinimas" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s korporacijos ME atnaujinimas" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s naudotojo ME atnaujinimas" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s valdiklio atnaujinimas" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt valdiklio atnaujinimas" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU mikrokodo atnaujinimas" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s konfigūracijos atnaujinimas" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s baterijos atnaujinimas" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s kameros atnaujinimas" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM atnaujinimas" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s jutiklinio kilimėlio atnaujinimas" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s pelės atnaujinimas" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s klaviatūros atnaujinimas" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s saugyklos valdiklio atnaujinimas" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s tinklo sąsajos atnaujinimas" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s vaizduoklio atnaujinimas" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC atnaujinimas" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB imtuvo atnaujinimas" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s disko atnaujinimas" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s Flash atnaujinimas" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD atnaujinimas" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU atnaujinimas" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s doko atnaujinimas" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB doko atnaujinimas" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Įrenginio aparatinė programinė įranga" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Aparatinės programinės įrangos atnaujinimo nepavyko pritaikyti: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Programinės aparatinės įrangos naujinimo palaikymas" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Pateikia palaikymą, skirtą programinės aparatinės įrangos naujinimams" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Įdiegti nepasirašytą programinę įrangą?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Diegiama programinė įranga nepasirašyta. Nebus galima patikrinti šios " +"programinės įrangos atnaujinimų šaltinio ar atnaujinimų integralumo." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Atsisiųsti nepasirašytą programinę įrangą?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Yra nepasirašytų atnaujinimų. Be parašo neįmanoma patikrinti atnaujinimo " +"šaltinio ar jo integralumo." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Atnaujinti nepasirašytą programinę įrangą?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Yra nepasirašytų atnaujinimų. Be parašo neįmanoma patikrinti atnaujinimo " +"šaltinio ar jo integralumo. Programinės įrangos atnaujinimai bus išjungti " +"iki nepasirašyti atnaujinimai bus pašalinti arba atnaujinti." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Nepavyko įdiegti atnaujinimų: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paketai" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Nepavyko sulaukti tranzakcijos pabaigos prieš atsisiunčiant: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Nepavyko atsisiųsti atnaujinimų: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Nepavyko paleisti atnaujinimų: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Operacinė sistema (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap parduotuvė" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap palaikymas" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap yra universalus Linux paketas" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistema" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Sisteminis komponentas" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Nepavyko pašalinamas sysupdate darbo „%s“ su būsena %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Gražus būdas tvarkyti sistemos programinę įrangą." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Įveskite skaičių nuo 1 iki %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Pasirinkite programą:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s dabar įdiegta" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Programa buvo pašalinta" +#~ msgstr[1] "Programos buvo pašalintos" +#~ msgstr[2] "Programos buvo pašalintos" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Nepavyko rasti „%s“" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Atsisiunčiamas programinės įrangos katalogas" + +#~ msgid "Moderate page" +#~ msgstr "Moderuoti puslapį" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Nėra atsiliepimų, kuriuos moderuoti" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Ar šis atsiliepimas buvo jums naudingas?" + +#~ msgid "Yes" +#~ msgstr "Taip" + +#~ msgid "No" +#~ msgstr "Ne" + +#~ msgid "Meh" +#~ msgstr "Šiaip sau" + +#~ msgid "Outdated SDK version" +#~ msgstr "Pasenusi SDK versija" + +#~ msgid "Unable to install updates" +#~ msgstr "Nepavyko įdiegti atnaujinimų" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Nepavyko išdiegti: nepavyko patvirtinti tapatybės" + +#~ msgid "Network Settings" +#~ msgstr "Tinklo nustatymai" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Yra programinės įrangos atnaujinimų" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Nepavyko įdiegti svarbaus operacinės sistemos atnaujinimo." + +#~ msgid "No Network" +#~ msgstr "Nėra tinklo" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Atnaujinimų tikrinimui reikalingas tinklo ryšys." + +#~ msgid "Network _Settings" +#~ msgstr "Tinklo _nustatymai" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Programinės įrangos atnaujinimai buvo atsisiųsti ir laukia diegimo." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Programinės įrangos atnaujinimai atsisiųsti ir laukia diegimo." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Atsisiunčiami atnaujinimo informacija…" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Svarbus programinės įrangos atnaujinimas paruoštas diegimui." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Svarbu: kritiniai programinės įrangos atnaujinimai laukia." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Atsisiųskite laukiančius programinės įrangos atnaujinimus." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automatiniai atnaujinimai pristabdyti" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Dabartinis tinklas yra matuojamas, tad gali turėti duomenų ribas ir su " +#~ "jomis susijusias kainas. Siekiant apriboti duomenų naudojimą, " +#~ "automatiniai atnaujinimai buvo pristabdyti.\n" +#~ "\n" +#~ "Jei dabartinis tinklas buvo neteisingai identifikuotas kaip matuojamas, " +#~ "šį nustatymą galima pakeisti Nustatymuose." + +#~ msgid "Open Network _Settings" +#~ msgstr "Atverti tinklo _nustatymus" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Vengiant išlaidų ir tinklo ribojimų, automatiniai atnaujinimai yra " +#~ "išjungti esant prisijungus prie mobilaus ar matuojamo ryšio." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "Atsisiunčia ir įdiegia atnaujinimus fone, kai galima" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Rodyti tik _laisvas programas" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "Rodyti tik laisvos licencijos programas, o nuosavybines slėpti" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Kas jums patiko šioje programoje? Palikdami atsiliepimą su priežastimis, " +#~ "kodėl jį parašėte, yra naudinga kitiems." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Nepavyksta atsisiųsti atnaujinimų: buvo reikalinga interneto prieiga, bet " +#~ "nebuvo prieinama" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Nepavyksta atsisiųsti atnaujinimų: nepakanka disko vietos" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Nepavyksta atsisiųsti atnaujinimų: reikia patvirtinti tapatybę" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Nepavyksta atsisiųsti atnaujinimų: nepavyko patvirtinti tapatybės" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "Nepavyko įdiegti %s: neturite leidimo diegti programinę įrangą" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Nepavyko įdiegti %s: akumuliatorius per daug išsikrovęs" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Nepavyko įdiegti atnaujinimų: nepakanka disko vietos" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Nepavyko įdiegti atnaujinimų: būtina patvirtinti tapatybę" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Nepavyko įdiegti atnaujinimų: nepavyko patvirtinti tapatybės" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Nepavyko atnaujinti %s: neturite leidimo atnaujinti programinę įrangą" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Nepavyko atnaujinti atnaujinimų: neturite leidimo atnaujinti programinę " +#~ "įrangą" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Nepavyko įdiegti atnaujinimų: būtinas kintamosios srovės šaltinis" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Nepavyko atnaujinti %s: akumuliatorius per daug išsikrovęs" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Nepavyko įdiegti atnaujinimų: akumuliatorius per daug išsikrovęs" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Nepavyko iš esmės atnaujinti į %s: buvo reikalinga interneto prieiga, bet " +#~ "nebuvo prieinama" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Nepavyko iš esmės atnaujinti į %s: neturite leidimo atnaujinti" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "" +#~ "Nepavyko iš esmės atnaujinti į %s: akumuliatorius per daug išsikrovęs" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Nepavyko pašalinti %s: būtina patvirtinti tapatybę" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Nepavyko pašalinti %s: nepavyko patvirtinti tapatybės" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Nepavyko pašalinti %s: neturite leidimo pašalinti programinę įrangą" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Nepavyko pašalinti %s: būtinas kintamosios srovės šaltinis" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Nepavyko pašalinti %s: akumuliatorius per daug išsikrovęs" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Nepavyko pašalinti %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Nepavyko įdiegti failo: nepalaikoma" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Nepavyko įdiegti: nepalaikoma" + +#~ msgid "AC power is required" +#~ msgstr "Būtinas kintamosios srovės šaltinis" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Matuojamas tinklas – automatiniai atnaujinimai pristabdyti" + +#~ msgid "Find Out _More" +#~ msgstr "Sužinokite _daugia" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Rodyti išsamią derinimo informaciją" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Gali pasiekti visus failus" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Ar tikrai norite pašalinti %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "%s bus pašalinta, norint naudotis, reikės vėl įdiegti." + +#~ msgid "Downloading featured images…" +#~ msgstr "Atsisiunčiami siūlomų programų paveikslėliai…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "Paskutinė laiko žyma, kai sistema buvo įjungta ir atnaujinta" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Pasirinkti priedai bus įdiegti su programa." + +#~ msgid "An application" +#~ msgstr "Programa" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "Ši programinė įranga neprieinama jūsų kalba ir bus JAV anglų kalba" + +#~ msgid "Applications" +#~ msgstr "Programos" + +#~ msgid "_Continue" +#~ msgstr "_Tęsti" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u programa" +#~ msgstr[1] "%u programos" +#~ msgstr[2] "%u programų" + +#~ msgid "Post Review" +#~ msgstr "Siųsti atsiliepimą" + +#~ msgid "_Post" +#~ msgstr "S_iųsti" + +#~ msgid "Rating" +#~ msgstr "Įvertinimas" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Pateikite trumpą savo atsiliepimo aprašą, pavyzdžiui: \"Puiki programa, " +#~ "rekomenduoju\"." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Atsiliepimas" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Ką manote apie šią programą? Pasistenkite pateikti savo nuomonės " +#~ "priežastis." + +#~ msgid "No screenshot provided" +#~ msgstr "Nepateikta ekrano nuotrauka" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Paleisti dabar" + +#~ msgid "Primary Menu" +#~ msgstr "Pagrindinis meniu" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Atnaujinimai" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s daugiau nebepalaikoma." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Tai reiškia, kad daugiau nebegausite saugumo spragų taisymų." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Rekomenduojama dabar atsinaujinti į paskutinę versiją." + +#~ msgid "Update All" +#~ msgstr "Atnaujinti viską" + +#~ msgid "Application Updates" +#~ msgstr "Programos atnaujinimai" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Žiniatinklis" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Šioje sistemoje nebuvo įdiegta atnaujinimų." + +#~ msgid "Application manager for GNOME" +#~ msgstr "GNOME programų tvarkytuvė" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Programinės įrangos katalogas yra siunčiamas" + +#~ msgid "Name" +#~ msgstr "Pavadinimas" + +#~ msgid "user" +#~ msgstr "naudotojui" + +#~ msgid "Channel" +#~ msgstr "Kanalas" + +#~ msgid "Branch" +#~ msgstr "Šaka" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Diegimas" + +#~ msgid "Version" +#~ msgstr "Versija" + +#~ msgid "Access arbitrary files" +#~ msgstr "Pasiekti visus failus" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Gali pasiekti visus failus failų sistemoje" + +#~ msgid "A list of popular applications" +#~ msgstr "Populiarių programų sąrašas" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Naudotinų programų, nustelbiančių sistemos apibrėžtąsias programas, " +#~ "sąrašas." + +#~ msgid "Checking…" +#~ msgstr "Tikrinama…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Įkeliama…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Atsisiunčiami programų reitingai…" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "Atnaujinimo paveikslėlio URI." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URI gali turėti iki trijų „%u“, kurie bus pakeisti atnaujinimo versija." + +#~ msgid "_Add shortcut" +#~ msgstr "_Pridėti trumpinį" + +#~ msgid "Re_move shortcut" +#~ msgstr "Paša_linti trumpinį" + +#~ msgid "Welcome" +#~ msgstr "Sveiki" + +#~ msgid "Welcome to Software" +#~ msgstr "Sveiki pradėję naudoti Programinę įrangą" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Programinė įranga leidžia įdiegti visą reikiamą programinę įrangą, viską " +#~ "vienoje vietoje. Matykite mūsų rekomendacijas, naršykite kategorijas ar " +#~ "ieškokite pageidaujamų programų." + +#~ msgid "_Browse Software" +#~ msgstr "_Naršyti programinę įrangą" + +#~ msgid "OS Updates" +#~ msgstr "OS atnaujinimai" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Našumo, stabilumo bei saugumo patobulinimai." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Atsisiunčiamas aparatinės programinės įrangos atnaujinimo parašas…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "" +#~ "Atsisiunčiami aparatinės programinės įrangos atnaujinimo metaduomenys…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Programos leidimai nežinomi" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Programa yra iš patikimo šaltinio" + +#~ msgid "Unknown Permissions" +#~ msgstr "Nežinomi leidimai" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Šiai programai reikalingi leidimai nežinomi" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Programa yra iš patikimo šaltinio" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Jūsų distribucija patikrino, kad ši programa yra saugi" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Rodyti pranešimą ne laisvos programinės įrangos šaltinius" + +#~ msgid "Requires a specific screen size" +#~ msgstr "Reikalauja specifinio dydžio ekrano" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "Neoptimizuota liečiamiesiems įrenginiams ar telefonams" + +#~ msgid "Editor’s Picks" +#~ msgstr "Redaktoriaus pasirinkimai" + +#~| msgid "Restart & Update" +#~ msgid "Recently Updated" +#~ msgstr "Neseniai atnaujinta" + +#~ msgid "_Read More" +#~ msgstr "_Rodyti daugiau" + +#~ msgid "_Read Less" +#~ msgstr "_Rodyti mažiau" + +#~ msgid "_Launch" +#~ msgstr "Pa_leisti" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Niekada" + +#~ msgid "Localized in your Language" +#~ msgstr "Lokalizuota jūsų kalbai" + +#~ msgid "Release Activity" +#~ msgstr "Leidimo veikla" + +#~ msgid "Developer" +#~ msgstr "Kūrėjas" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Pašalinti" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Įdiegta" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Atnaujinta" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Nežinoma" + +#~ msgid "History" +#~ msgstr "Istorija" + +#~ msgid "More…" +#~ msgstr "Daugiau…" + +#~ msgid "Recommended Games" +#~ msgstr "Rekomenduojami žaidimai" + +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Creation Applications" +#~ msgstr "Rekomenduojamos kūrimo programos" + +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Work Applications" +#~ msgstr "Rekomenduojamos darbo programos" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Dalis šios programinės įrangos turi naudojimo, platinimo bei prieigos " +#~ "prie pradinio kodo ribojimų." + +#~ msgid "Find out more…" +#~ msgstr "Sužinokite daugiau…" + +#~ msgid "Recent Releases" +#~ msgstr "Nauji leidimai" + +#~ msgid "Remove “%s”?" +#~ msgstr "Pašalinti „%s“?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Išjungti „%s“?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Nėra papildomų šaltinių" + +#~ msgid "_Remove…" +#~ msgstr "Š_alinti…" + +#~ msgid "_Disable…" +#~ msgstr "_Išjungti…" + +#~ msgid "Disabling" +#~ msgstr "Išjungiamas" + +#~ msgid "Enabled" +#~ msgstr "Įjungtas" + +#~ msgid "Disabled" +#~ msgstr "Išjungtas" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (reikia dėmesio)" + +#~ msgid "_Remove All" +#~ msgstr "Ša_linti visus" + +#~| msgid "Setting up updates…" +#~ msgid "Setting Up Updates…" +#~ msgstr "Nustatomi atnaujinimai…" + +#~| msgid "Looking for new updates…" +#~ msgid "Looking for New Updates…" +#~ msgstr "Ieškoma naujų atnaujinimų…" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "" +#~ "Atnaujinimai bus pritaikyti, kai kompiuteris bus paleistas iš naujo." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Laukiama atsisiuntimo %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Atsisiunčiama %s %s" + +#~ msgid "Select All" +#~ msgstr "Žyminė viską" + +#~ msgid "Select None" +#~ msgstr "Nežymėti nieko" + +#~ msgid "Featured %s" +#~ msgstr "Siūlomos %s" + +#~ msgid "Show" +#~ msgstr "Rodyti" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Sub-kategorijų filtrų meniu" + +#~ msgid "Sort" +#~ msgstr "Rikiuoti" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Sub-kategorijų rikiavimo meniu" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgid "Audio & Video" +#~ msgstr "Garsas ir vaizdas" + +#~ msgid "Developer Tools" +#~ msgstr "Kūrėjo įrankiai" + +#~ msgid "Education & Science" +#~ msgstr "Mokomoji ir mokslinė" + +#~ msgid "Games" +#~ msgstr "Žaidimai" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafika ir fotografija" + +#~ msgid "Productivity" +#~ msgstr "Produktyvumas" + +#~ msgid "Communication & News" +#~ msgstr "Komunikacija ir naujienos" + +#~ msgid "Utilities" +#~ msgstr "Priemonės" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Nepavyksta nustatyti, kurias sistemos dalis ši programa pasiekia. Tai " +#~ "įprasta senoms programoms." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Žema" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Vidutinė" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Aukšta" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Nežinoma" + +#~ msgid "Public domain" +#~ msgstr "Visuotinio naudojimo" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Naudotojams taikoma ši licencija:" +#~ msgstr[1] "Naudotojams taikomos šios licencijos:" +#~ msgstr[2] "Naudotojams taikomos šios licencijos:" + +#~ msgid "Sandboxed" +#~ msgstr "Apsaugota" + +#~ msgid "Category" +#~ msgstr "Kategorija" + +#~ msgid "Free" +#~ msgstr "Laisva" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Nežinoma" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Tai reiškia, kad programą galima laisvai vykdyti, kopijuoti, platinti, " +#~ "nagrinėti bei keisti." + +#~ msgid "Proprietary Software" +#~ msgstr "Nuosavybinė programinė įranga" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Tai reiškia, kad programinė įranga priklauso individui ar kompanijai. " +#~ "Dažniausiai yra apribojimų, ką su ja galima daryti, bei dažniausiai " +#~ "negalima prieiti jos pradinio kodo." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Šios programinės įrangos licencijos sąlygos yra nežinomos." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Programa buvo taip įvertinta dėl šių priežasčių:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Nėra informacijos apie šį reitingą." + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Rekomenduojamos garso ir vaizdo programos" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Rekomenduojamos produktyvumo programos" + +#~ msgid "ratings in total" +#~ msgstr "visi įvertinimai" + +#~ msgid "Software is up to date" +#~ msgstr "Programinė įranga yra naujausia" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS yra paslauga, pateikianti naudotojų įvertinimus apie programas" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Animaciniai personažai nesaugiose situacijose" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Animaciniai personažai agresyviame konflikte" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Grafinis smurtas, įtraukiantis animacinius personažus" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Personažai nesaugiose, lengvai nuo realybės atskiriamose, situacijose" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Personažai agresyviame, lengvai nuo realybės atskiriamame, konflikte" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Grafinis, lengvai nuo realybės atskiriamas, smurtas" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Švelnūs tikroviški personažai nesaugiose situacijose" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Tikroviškų personažų vaizdavimai agresyviame konflikte" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Grafinis smurtas, įtraukiantis tikroviškus personažus" + +#~ msgid "No bloodshed" +#~ msgstr "Nėra kraujo praliejimo" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Netikroviškas kraujo praliejimas" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Tikroviškas kraujo praliejimas" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Kraujo praliejimo ir kūno dalių sužalojimo vaizdavimai" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Išprievartavimai ar kita smurtinė seksualinė elgsena" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Nuorodos į alkoholinius gėrimus" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Alkoholinių gėrimų vartojimas" + +#~ msgid "References to illicit drugs" +#~ msgstr "Nuorodos į uždraustus narkotikus" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Uždraustų narkotikų vartojimas" + +#~ msgid "References to tobacco products" +#~ msgstr "Nuorodos į tabako gaminius" + +#~ msgid "Use of tobacco products" +#~ msgstr "Tabako gaminių vartojimas" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Trumpas meninis nuogumas" + +#~ msgid "Prolonged nudity" +#~ msgstr "Užsitęsęs nuogumas" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provokuojančios nuorodos ar vaizdavimai" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Seksualinės nuorodos ar vaizdavimai" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Grafinė seksualinė elgsena" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Nesmarkus ar nedažnas keiksmų naudojimas" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Vidutinis keiksmų naudojimas" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Smarkus ar dažnas keiksmų naudojimas" + +#~ msgid "Slapstick humor" +#~ msgstr "Papliauškų humoras" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgarus ar tualeto humoras" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Suaugusiųjų ar seksualinis humoras" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Priešiškumas, nukreiptas į tam tikrą žmonių grupę" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Diskriminacija, sukurta sukelti emocinę žalą" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "Atvira diskriminacija dėl lyties, rasės ar religijos" + +#~ msgid "Product placement" +#~ msgstr "Produktų išdėstymas" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Atviros nuorodos į tam tikrus prekės ženklus ar produktus su prekyženkliu" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Naudotojai yra skatinami įsigyti tam tikrus realaus pasaulio daiktus" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Lošimas iš atsitiktinių įvykių, naudojantis žetonais ar kreditais" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Lošimai naudojant „žaidimo“ pinigus" + +#~ msgid "Gambling using real money" +#~ msgstr "Lošimai naudojant tikrus pinigus" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Naudotojai yra skatinami aukoti realius pinigus" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Galimybė žaidime išleisti tikrus pinigus" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Žaidėjo su žaidėju sąveikos žaidime be pokalbių funkcionalumo" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Prižiūrimas pokalbių funkcionalumas tarp žaidėjų" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Neprižiūrimas garso ir vaizdo pokalbių funkcionalumas tarp žaidėjų" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Dalinimasis socialinių tinklų naudotojų vardais ar el. pašto adresais" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Tikrinama, ar naujausia programos versija" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Dalinimasis diagnostikos duomenimis neleidžia kitiems identifikuoti " +#~ "naudotojų" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Dalinimasis informacija, kuri leidžia kitiems identifikuoti naudotoją" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Dalinimasis savo fizine buvimo vieta su kitais naudotojais" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Netiesioginės nuorodos į homoseksualumą" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Bučiniai tarp tos pačios lyties asmenų" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Vazdinis seksualus elgesys tarp tos pačios lyties asmenų" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Netiesioginės nuorodos į prostituciją" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Tiesioginės nuorodos į prostituciją" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Vaizdinis prostitucijos akto atvaizdavimas" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Netiesioginės nuorodos į turinį suaugusiems" + +#~ msgid "Direct references to adultery" +#~ msgstr "Tiesioginės nuorodos į turinį suaugusiems" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Vaizdinis turinio suaugusiems atvaizdavimas" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Mažai apsirengę žmonės/herojai" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Itin seksualūs žmonės/herojai" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Vaizdavimai arba nuorodos į istorinį išniekinimą" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Šiuolaikinio žmonių išniekinimo vaizdavimai" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Šiuolaikinio žmonių išniekinimo vaizdai" + +#~ msgid "Visible dead human remains" +#~ msgstr "Matomi mirusių žmonių palaikai" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Detaliai vaizduojami mirusių žmonių palaikai" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Žmonių kūnų išniekinimo vaizdai" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Vaizdavimai arba nuorodos į istorinę vergiją" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Šiuolaikinės vergijos vaizdavimai" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Šiuolaikinės vergijos vaizdai" + +#~ msgid "General" +#~ msgstr "Bendra" + +#~ msgid "ALL" +#~ msgstr "VISKAS" + +#~ msgid "Teen" +#~ msgstr "Paaugliams" + +#~ msgid "Everyone 10+" +#~ msgstr "Visiems nuo 10-ies" + +#~ msgid "Everyone" +#~ msgstr "Visiems" + +#~ msgid "Early Childhood" +#~ msgstr "Ankstyvai vaikystei" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Nežinoma" + +#~| msgid "Recent Releases" +#~ msgid "Released" +#~ msgstr "Išleista" + +#~ msgid "Format" +#~ msgstr "Formatas" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Vakar, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Prieš tris dienas" + +#~ msgid "Four days ago" +#~ msgstr "Prieš keturias dienas" + +#~ msgid "Five days ago" +#~ msgstr "Prieš penkias dienas" + +#~ msgid "Six days ago" +#~ msgstr "Prieš šešias dienas" + +#~ msgid "Two weeks ago" +#~ msgstr "Prieš dvi savaites" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Įjungti GNOME apvalkalo plėtinių saugyklą" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Pradėkite apsipirkinėti" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Pašalinta" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Ar tikrai norite pašalinti %s?" + +#~ msgid "Security Updates Pending" +#~ msgstr "Yra saugumo atnaujinimų" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Rekomenduojama dabar įdiegti svarbius atnaujinimus" + +#~ msgid "Restart & Install" +#~ msgstr "Perleisti ir įdiegti" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "Svarbūs OS ir programų atnaujinimai paruošti diegimui" + +#~ msgid "View" +#~ msgstr "Rodyti" + +#~ msgid "this website" +#~ msgstr "šiame tinklalapyje" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Šią programą reikia paleisti iš naujo norint naudoti naujus įskiepius." + +#~ msgid "About %s" +#~ msgstr "Apie %s" + +#~ msgid "%s ME" +#~ msgstr "%s ME" + +#~ msgid "Show the folder management UI" +#~ msgstr "Rodyti aplanko valdymo sąsają" + +#~ msgid "Folder Name" +#~ msgstr "Aplanko pavadinimas" + +#~ msgid "_Add" +#~ msgstr "_Pridėti" + +#~ msgid "Add to Application Folder" +#~ msgstr "Pridėti programų aplanką" + +#~ msgid "Top Rated" +#~ msgstr "Geriausiai įvertintos" + +#~ msgid "Extension Settings" +#~ msgstr "Plėtinio nustatymai" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Plėtiniai yra naudojami jūsų pačių rizika. Jeigu susidūrėte su sistemos " +#~ "problemomis, yra rekomenduojama juos išjungti." + +#~| msgid "Failed to load image" +#~ msgid "Failed to load components" +#~ msgstr "Nepavyko įkelti komponentų" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS patikrinimas sėkmingas!" + +#~ msgid "Failed to load file" +#~ msgstr "Nepavyko įkelti failo" + +#~ msgid "Unsaved changes" +#~ msgstr "Neįrašyti pakeitimai" + +#~ msgid "The application list is already loaded." +#~ msgstr "Programų sąrašas jau įkeltas." + +#~ msgid "Merge documents" +#~ msgstr "Sulieti dokumentus" + +#~ msgid "Throw away changes" +#~ msgstr "Išmesti pakeitimus" + +#~ msgid "Open AppStream File" +#~ msgstr "Atverti AppStream failą" + +#~| msgid "Open AppStream File" +#~ msgid "Save AppStream File" +#~ msgstr "Įrašyti AppStream failą" + +#~ msgid "_Save" +#~ msgstr "Į_rašyti" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s reklamjuostė ištrinta." + +#~ msgid "Banner design deleted." +#~ msgstr "Reklamjuostė ištrinta." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Programų sąraše yra neįrašytų pakeitimų." + +#~ msgid "Use verbose logging" +#~ msgstr "Vesti išsamų žurnalą" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME programinės įrangos reklamjuosčių kūrėjas" + +#~ msgid "No Designs" +#~ msgstr "Nėra reklamjuosčių" + +#~ msgid "Error message here" +#~ msgstr "Čia pranešimas apie klaidą" + +#~ msgid "Category Featured" +#~ msgstr "Siūlomų kategorijoje" + +#~ msgid "Undo" +#~ msgstr "Atšaukti" + +#~ msgid "Banner Designer" +#~ msgstr "Reklamjuosčių kūrėjas" + +#~ msgid "New Banner" +#~ msgstr "Nauja reklamjuostė" + +#~ msgid "Import from file" +#~ msgstr "Importuoti iš failo" + +#~ msgid "Export to file" +#~ msgstr "Eksportuoti į failą" + +#~ msgid "Spacing" +#~ msgstr "Tarpai" + +#~ msgid "The amount of space between children" +#~ msgstr "Tarpas tarp vaikų" + +#~ msgid "Click on items to select them" +#~ msgstr "Spauskite elementui pažymėti" + +#~ msgid "Select" +#~ msgstr "Žymėti" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Pridėti į aplanką…" + +#~ msgid "_Move to Folder…" +#~ msgstr "Per_kelti į aplanką…" + +#~ msgid "_Remove from Folder" +#~ msgstr "Paša_linti iš aplanko" + +#~ msgid "Featured Applications" +#~ msgstr "Įtrauktos programos" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Kurkite GNOME programinėje įrangoje siūlomų programų reklamjuostes" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Programinė įranga;Programa;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Apvalkalo plėtiniai" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "GNOME apvalkalo plėtinių saugykla" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Parsiunčiami apvalkalo plėtinių metaduomenys…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Apvalkalo plėtiniai" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_Viskas" + +#~ msgid "Sign In / Register…" +#~ msgstr "Prisijungti / prisiregistruoti…" + +#~ msgid "Continue" +#~ msgstr "Tęsti" + +#~ msgid "Use" +#~ msgstr "Naudoti" + +#~ msgid "Add another…" +#~ msgstr "Pridėti kitą…" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Įkeliamas programinės įrangos katalogas" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s bus įdiegta, o jums teks sumokėti %s." + +#~ msgid "A$%.2f" +#~ msgstr "%.2f A$" + +#~ msgid "C$%.2f" +#~ msgstr "%.2f C$" + +#~ msgid "CN¥%.2f" +#~ msgstr "%.2f CN¥" + +#~ msgid "€%.2f" +#~ msgstr "%.2f €" + +#~ msgid "£%.2f" +#~ msgstr "%.2f £" + +#~ msgid "¥%.2f" +#~ msgstr "%.2f ¥" + +#~ msgid "NZ$%.2f" +#~ msgstr "%.2f NZ$" + +#~ msgid "₽%.2f" +#~ msgstr "%.2f ₽" + +#~ msgid "US$%.2f" +#~ msgstr "%.2f US$" + +#~ msgid "Signed in as %s" +#~ msgstr "Prisijungta naudotoju %s" + +#~ msgid "Sign in…" +#~ msgstr "Prisijungiama…" + +#~ msgid "Sign out" +#~ msgstr "Atsijungti" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Nepavyko įsigyti %s: reikėjo patvirtinti tapatybę" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Nepavyko įsigyti %s: tapatybės patvirtinimas buvo neteisingas" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Nepavyko įsigyti %s: nėra mokėjimo būdo sąrankos" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Nepavyko įsigyti %s: mokėjimas buvo atmestas" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Norėdami tęsti, turite naudoti Ubuntu One paskyrą." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Norėdami tęsti, turite naudoti savo Ubuntu One paskyrą." + +#~ msgid "..." +#~ msgstr "..." + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Norėdami tęsti, turite prisijungti prie %s." + +#~ msgid "Email address" +#~ msgstr "El. pašto adresas" + +#~ msgid "I have an account already" +#~ msgstr "Jau turiu paskyrą" + +#~ msgid "I want to register for an account now" +#~ msgstr "Noriu dabar registruoti paskyrą" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Automatiškai prisijungti kitą kartą" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Įveskite vienkartinį PIN dviejų žingsnių tapatybės patvirtinimui." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Patvirtinti tapatybę" + +#~ msgid "_About" +#~ msgstr "_Apie" + +#~ msgid "_Quit" +#~ msgstr "_Išeiti" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Informaciją apie %s, taip pat kaip gauti kodeką, kuris gali groti šį " +#~ "formatą, galite rasti tinklalapyje." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Jūsų %s paskyros galiojimas sustabdytas." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Neįmanoma diegti programinės įrangos iki tai bus išspręsta." + +#~ msgid "For more information, visit %s." +#~ msgstr "Daugiau informacijos rasite apsilankę %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Nepavyko atnaujinti %s iš %s" + +#~ msgid "Downloading new updates…" +#~ msgstr "Parsiunčiami nauji atnaujinimai…" + +#~ msgid "Downloading application page…" +#~ msgstr "Parsiunčiamas programos puslapis…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Didžiausia pramogų platforma iš Valve" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Rodyti tarnybos profiliavimo informaciją" + +#~| msgid "Application Updates" +#~ msgid "Applications Updated" +#~ msgstr "Programos atnaujinimai" + +#~ msgid "Includes: ." +#~ msgstr "Įskaitant: ." + +#~ msgid "Restart & _Install" +#~ msgstr "Perleisti ir į_diegti" + +#~ msgid "Getting runtime source…" +#~ msgstr "Gaunamas vykdymo aplinkos šaltinis…" + +#~ msgid "Limba Support" +#~ msgstr "Limba palaikymas" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba pateikia kūrėjams būdą lengvai kurti programinės įrangos rinkinius" + +#~ msgid "Sorted by Name" +#~ msgstr "Rikiuojama pagal pavadinimą" + +#~ msgid "Sorted by Rating" +#~ msgstr "Rikiuojama pagal įvertinimą" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Anksčiau įjungtų, papildomų šaltinių sąrašas" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Šaltinių, kurie buvo anksčiau įjungti įdiegiant trečiųjų šalių programas, " +#~ "sąrašas." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Rodyti ne laisvą programinę įrangą paieškos rezultatuose" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "Papildomų ne laisvų šaltinių, kuriuos galima įjungti, sąrašas" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Įjungti nuosavybinės programinės įrangos šaltinius?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Nebuvo įdiegta programų ar priedų; gali būti kitos programinės įrangos" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Įprastai turi naudojimo ir prieigos prie pradinio kodo ribojimų." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Nuosavybinės programinės įrangos šaltiniai" + +#~ msgid "Remove Source" +#~ msgstr "Pašalinti šaltinį" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Programinės įrangos šaltinius galima parsisiųsti iš interneto. Jie " +#~ "suteiks jums priėjimą prie papildomos programinės įrangos, kurios " +#~ "neteikia %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Šaltinio pašalinimas taip pat pašalins visą iš jo įdiegtą programinę " +#~ "įrangą." + +#~ msgid "No software installed from this source" +#~ msgstr "Nėra iš šio šaltinio įdiegtos programinės įrangos" + +#~ msgid "Installed from this Source" +#~ msgstr "Įdiegta iš šio šaltinio" + +#~ msgid "Last Checked" +#~ msgstr "Paskutinį kartą tikrinta" + +#~ msgid "Added" +#~ msgstr "Pridėta" + +#~ msgid "Website" +#~ msgstr "Tinklalapis" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Žaidėjo su žaidėju iš anksto nustatytos sąveikos be pokalbių funkcionalumo" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Dalinimasis naudotojo informacija su trečiosiomis šalimis" + +#~ msgid "page1" +#~ msgstr "puslapis1" + +#~ msgid "page2" +#~ msgstr "puslapis2" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgid "“%s” [%s]" +#~ msgstr "„%s“ [%s]" + +#~ msgid "Total" +#~ msgstr "Viso" + +#~ msgid "Could not find '%s'" +#~ msgstr "Nepavyko rasti „%s“" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Visos" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Siūlomos" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomija" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Chemija" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgid "Science" +#~ msgstr "Mokslas" + +#~ msgid "Installation of %s failed." +#~ msgstr "Nepavyko įdiegti %s." + +#~ msgid "Removal of %s failed." +#~ msgstr "Nepavyko pašalinti %s." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Patikrinkite, ar yra interneto ryšys ir bandykite dar kartą." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Atlaisvinkite vietos ir bandykite vėl." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Jei problema išliks, kreipkitės į savo programinės įrangos tiekėją." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "" +#~ "Programinės įrangos šaltiniai suteikia priėjimą prie papildomos " +#~ "programinės įrangos." + +#~ msgid " or " +#~ msgstr " arba " + +#~ msgid "3rd party" +#~ msgstr "Trečiosios šalies" + +#~ msgid "nonfree" +#~ msgstr "nelaisva" + +#~ msgid "shell extension" +#~ msgstr "apvalkalo plėtinys" + +#~ msgid "_Installing" +#~ msgstr "_Diegiama" + +#~ msgid "_Removing" +#~ msgstr "Š_alinama" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Nežinoma" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "Nėra" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Ši programinė įranga yra pateikiama trečiųjų šalių." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Ši programinė įranga yra pateikiama trečiųjų šalių ir joje gali būti " +#~ "nelaisvųjų komponentų." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Šioje programinėje įrangoje gali būti nelaisvųjų komponentų." + +#~ msgid "non-free" +#~ msgstr "nelaisva" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Rekomenduojamos raštinės programos" + +#~ msgid "One Star" +#~ msgstr "Viena žvaigždutė" + +#~ msgid "Two Stars" +#~ msgstr "Dvi žvaigždutės" + +#~ msgid "Three Stars" +#~ msgstr "Trys žvaigždutės" + +#~ msgid "Four Stars" +#~ msgstr "Keturios žvaigždutės" + +#~ msgid "Five Stars" +#~ msgstr "Penkios žvaigždutės" + +#~ msgid "Audio" +#~ msgstr "Garsas" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Redagavimas" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Duomenų bazės" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Diskų kūrimas" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Jam radijas" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mikseris" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Muzika" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Įrašymo programos" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Grotuvai" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Reguliatoriai" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Kūrimas" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Duomenų bazės" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Profiliavimas" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "Projektų tvarkymas" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Žiniatinklio kūrimas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Kompiuterių mokslas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Duomenų vizualizacija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Ekonomika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Elektros grandinės" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Inžinerija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geomokslas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Istorija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Paveikslėlių apdorojimas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Literatūra" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Žemėlapiai" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Muzika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Skaitiniai metodai" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Lygiagretūs skaičiavimai" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fizika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Dvasiniai dalykai" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Šaudyklės" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simuliatoriai" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Sporto" + +#~ msgid "Graphics" +#~ msgstr "Grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Žiniasklaida" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Rastrinė grafika" + +#~ msgid "Internet" +#~ msgstr "Internetas" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Prisijungimas" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "El. paštas" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Sklaidos kanalai" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Failų perdavimas" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Ham radijas" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Tiesioginiai pranešimai" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC klientai" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Monitorius" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonija" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Žiniatinklio kūrimas" + +#~ msgid "Office" +#~ msgstr "Ofisas" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Diagrama" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Kontaktų tvarkymas" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Žodynas" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "El. paštas" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Tėkmės diagrama" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "Delninukas" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografija" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Projektų tvarkymas" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Žiniasklaida" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Skaičiuoklė" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Žiūryklė" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Menas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Dirbtinis intelektas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Chemija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Kompiuterių mokslas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Statyba" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Duomenų vizualizacija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Ekonomika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Elektros grandinės" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Inžinerija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geomokslas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Istorija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humanitariniai mokslai" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Paveikslėlių apdorojimas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Kalbos" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Literatūra" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Žemėlapiai" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Medicina" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Skaitiniai metodai" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Lygiagretūs skaičiavimai" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fizika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Dvasiniai dalykai" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Sportas" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emuliatorius" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Failų tvarkytuvė" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Failų įrankiai" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Monitorius" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Saugumas" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Terminalo emuliatorius" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Prieiga" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Archyvavimas" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Skaičiuotuvas" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Laikrodis" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Suspaudimas" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Failų įrankiai" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Žemėlapiai" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Dvasiniai dalykai" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Telefonijos įrankiai" + +#~ msgid "Video" +#~ msgstr "Vaizdas" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Redagavimas" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Duomenų bazė" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Diskų kūrimas" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Įrašymo programos" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Skaičiuojama…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Nežinoma" + +#~ msgid "_History" +#~ msgstr "_Istorija" + +#~ msgid "Size" +#~ msgstr "Dydis" + +#~ msgid "No AppStream data found" +#~ msgstr "Nerasta AppStream duomenų" + +#~ msgid "Depictions of or dialog including slapstick humor" +#~ msgstr "Vaizdavimai ar dialogai, kuriuose yra papliauškų (slapstick) humoro" + +#~ msgid "Depictions of or dialog including vulgar humor; bathroom humor" +#~ msgstr "" +#~ "Vaizdavimai ar dialogai, kuriuose yra vulgaraus humoro; tualeto humoro" + +#~ msgid "Depictions of or dialog including mature humor; sexual humor" +#~ msgstr "" +#~ "Vaizdavimai ar dialogai, kuriuose yra suaugusiųjų humoro; seksualinio " +#~ "humoro" + +#~ msgid "" +#~ "Player-to-player scripted interactions (e.g. giving an axe for a quest) " +#~ "without chat functionality" +#~ msgstr "" +#~ "Scenarizuotos žaidėjo su žaidėju sąveikos (pvz., kirvio perdavimas " +#~ "užduočiai atlikti) be pokalbių funkcionalumo" + +#~ msgid "" +#~ "Ability to share Twitter, Facebook or email addresses to other players" +#~ msgstr "" +#~ "Galimybė dalintis savo Twitter, Facebook ar el. pašto adresais su kitais " +#~ "žaidėjais" + +#~ msgid "A previous update was unfinished." +#~ msgstr "Ankstesnis atnaujinimas nebuvo baigtas." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "Atnaujinimo nepavyko įdiegti; tai dažniausiai yra problema su pačiu " +#~ "atnaujinimu. Palaukite kito atnaujinimo ir bandykite vėl." + +#~ msgid "Internet Only Application" +#~ msgstr "Interneto reikalaujanti programa" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Atnaujinimas nebuvo tvarkingai pasirašytas." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "Atnaujinimas atsijungus buvo prašytas, bet nėra atnaujinamų paketų." + +#~ msgid "No space was left on the drive." +#~ msgstr "Diske neliko vietos." + +#~ msgid "An update failed to install correctly." +#~ msgstr "Atnaujinimo nepavyko tvarkingai įdiegti." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Atnaujinimas atsijungus nepavyko netikėtu būdu." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "Įdiegta %i programa(-os) ir %i priedas(-ai)" +#~ msgstr[1] "Įdiegta %i programa(-os) ir %i priedas(-ai)" +#~ msgstr[2] "Įdiegta %i programa(-os) ir %i priedas(-ai)" diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000..0a4d35e --- /dev/null +++ b/po/lv.po @@ -0,0 +1,7679 @@ +# This file is distributed under the same license as the gnome-software package. +# +# SPDX-FileCopyrightText: 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2024, 2025 Rūdolfs Mazurs +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-04-23 14:22+0000\n" +"PO-Revision-Date: 2025-05-01 17:15+0300\n" +"Last-Translator: Rūdolfs Mazurs \n" +"Language-Team: Latvian \n" +"Language: lv\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 != 0 ? 1 :" +" 2);\n" +"X-Generator: Lokalize 23.08.5\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programmatūra" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instalēt un atjaunināt lietotnes" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"“Programmatūra” jums ļauj atrast un instalēt jaunas lietotnes un sistēmas " +"paplašinājumus, kā arī izņemt jau instalētās lietotnes." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"“Programmatūra” rāda izceltās un populārās lietotnes, ar noderīgiem " +"aprakstiem un vairākiem ekrānattēliem uz lietotni. Lietotnes var atrast vai " +"nu pārlūkojot kategoriju sarakstu, vai arī meklējot. Tā jums ļauj arī atrast " +"sistēmas atjauninājumus, izmantojot nesaistes atjaunināšanu." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Pārskata rūts" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Sīkākas informācijas rūts" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Instalēto lietotņu rūts" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Atjauninājumu rūts" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Atjauninājumu informācija" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2789 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME projekts" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Testēt akmods atslēgu iekš Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Ir nepieciešama autentifikācija, lai testētu akmods atslēgu iekš Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Reģistrēt akmods atslēgu iekš Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Ir nepieciešama autentifikācija, lai reģistrētu akmods atslēgu iekš Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Testēt DKMS atslēgu iekš Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" +"Ir nepieciešama autentifikācija, lai testētu DKMS atslēgu iekš Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Reģistrēt DKMS atslēgu iekš Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" +"Ir nepieciešama autentifikācija, lai reģistrētu DKMS atslēgu iekš Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalēt appstream datni sistēmas atrašanās vietā" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instalē appstream datni sistēmas atrašanās vietā" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Saraksts ar savietojamiem projektiem" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Šis ir saraksts ar savietojamiem projektiem, ko rādīt, piemēram GNOME, KDE " +"un XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Vai pārvaldīt atjauninājumus un uzlabojumus “GNOME programmatūrā”" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Ja izslēgts, “GNOME Programmatūra” paslēps atjauninājumu paneli, neizpildīs " +"nekādas automātiskās atjaunināšanas darbības un neprasīs atjaunināt." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automātiski lejupielādēt un instalēt atjauninājumus" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Ja ieslēgts, “GNOME programmatūra” fonā automātiski lejupielādēs " +"atjauninājumus un instalēs tos, kuriem nav nepieciešama pārstartēšana." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Ziņot lietotājam par fonā atjaunināto programmatūru" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Ja ieslēgts, “GNOME programmatūra” lietotājam ziņos par atjauninājumiem, " +"kamēr lietotājs nav aktīvs." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Vai automātiski atsvaidzināt, kad ir uz savienojuma ar mērītāju" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Ja ieslēgts, “GNOME Programmatūra” automātiski atsvaidzina fonu, pat ja " +"lieto savienojumu ar skaitītāju (dažkārt lejupielādējot kādus metadatus, " +"pārbaudot atjauninājumus utt., kas var novest pie izmaksām lietotājam)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Vai šī ir pirmā “GNOME programmatūras” palaišanas reize" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Pie lietotnēm rādīt vērtējumu" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtrēt lietotnes, balstoties uz noklusējuma zara kopu attālajam" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Ne-brīvas lietotnes pirms instalēšanas rāda brīdinājuma dialoglodziņu" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Kad instalē nebrīvu lietotni, tiek rādīts brīdinājuma dialoglodziņš. Šis " +"nosaka, vai dialoglodziņu nerādīt." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Pēdējās atjauninājumu pārbaudīšanas laika spiedogs" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Pēdējā uzlabošanas paziņojuma laika spiedogs" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Pēdējā atjaunināšanas paziņojuma laika spiedogs" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Laika spiedogs pirmajam drošības atjauninājumam, pēc atjaunināšanas tiek " +"attīrīts" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Pēdējais atjauninājuma laika spiedogs" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Vecums sekundēs, lai pārbaudītu, vai augšteces ekrānattēls joprojām ir derīgs" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Lielākas vērtības izvēlēšanās nozīmē mazāk apkārtceļošanas uz attālo " +"serveri, bet ekrānattēlu atjaunināšana var aizņemt ilgāku laiku, līdz tie " +"parādās lietotājam. Vērtība 0 nozīmē nekad nepārbaudīt serverī, ja attēls " +"jau ir kešatmiņā." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Serveris, ko izmantot lietotņu recenzijām" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Recenziju minimālais karmas reitings" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Netiks rādītas recenzijas, kurām karma ir mazāka par šo skaitli." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Saraksts ar oficiālajām krātuvēm, kuras nevajadzētu uzskatīt par trešās " +"puses krātuvēm" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Saraksts ar nepieciešamajām krātuvēm, kuras nevar izslēgt vai izņemt" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Saraksts ar oficiālajām krātuvēm, kuras vajadzētu uzskatīt par brīvo " +"programmatūru" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Licences URL, ko izmantot, kad lietotni jāuzskata par brīvu programmatūru" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Ja iespējams, instalēt sakopotās lietotnes visiem sistēmas lietotājiem" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Ļaut piekļūt programmatūras krātuvju dialoglodziņam" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Piedāvāt uzlabojumus testa laidieniem" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Rādīt dažus UI elementus, kas informē lietotāju, ka lietotne nav brīva" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Instalēto lietotņu sarakstā rādīt lietotņu aizņemto vietu uz diska" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI, kur izskaidro nebrīvu un īpašnieku programmatūru" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Saraksts ar URL, kas norāda uz appstream datnēm, kuras tiks lejupielādētas " +"swcatalog mapē" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instalēt AppStream datnes sistēmas atrašanās vietā visiem lietotājiem. Ja " +"aplams, datnes tiek instalētas nestandarta direktorijā $XDG_DATA_HOME/" +"swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Vēlamo pakošanas formātu prioritāšu secība, kur svarīgākie formāti ir " +"uzskaitīti pirmie. Tukšs masīvs nozīmē noklusējuma secību. Tiek pieņemts, ka " +"izlaistie formāti ir saraksta beigās. Piemēra pakotņu formāti: deb, flatpak, " +"rpm, snap. Ja vēlas, formātus var norādīt ar izcelsmes nosaukumu, atdalītu " +"ar kolu, piemēram, “flatpak:flathub”." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "Laika spiedogs pēdējam mēģinājumam izņemt Flatpak izpildlaiku" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Iestatiet uz “patiess”, lai rādītu tikai brīvi pieejamas lietotnes un slēptu " +"visas slēgtās lietotnes." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Iestatiet uz “patiess”, lai rādītu lietotnes tikai no izstrādātājiem, kuru " +"identitāte ir pārbaudīta." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Laika spiedogs pēdējiem saņemtiem vēsturiskajiem atjauninājumiem." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Virkne, kurā ir gnome-online-account id, kuru izmanto, lai ierakstītos" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Software AppStream sistēmas mēroga instalētājs" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Neizdevās parsēt komandrindas argumentus" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Jums jānorāda tieši vienu datnes nosaukumu" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Šo programmu var lietot tikai root lietotājs" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Neizdevās validēt satura tipu: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Neizdevās pārvietot: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Programmatūras instalēšana" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instalēt izvēlēto programmatūru sistēmā" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Nav multeņu vardarbības" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nav informācijas par multeņu vardarbību" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Nav fantāzijas vardarbības" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nav informācijas par fantāzijas vardarbību" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Nav reālistiskas vardarbības" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nav informācijas par reālistisku vardarbību" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Vardarbība, kas ataino asinsizliešanu" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Nav informācijas par asinsizliešanu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Nav seksuālas vardarbības" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nav informācijas par seksuālu vardarbību" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohols" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nav informācijas par norādēm uz alkoholiskiem dzērieniem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotikas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nav informācijas par norādēm uz nelegālām narkotikām" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabaka" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Nav informācijas par norādēm uz tabakas produktiem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Kailums" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nav informācijas par jebkāda veida kailumu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Seksuāli motīvi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Nav informācijas par seksuālas dabas norādēm vai atainojumiem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Rupjības" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nav informācijas par jebkāda veida rupjībām" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Nepiedienīgs humors" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nav informācijas par nepiedienīgu humoru" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminācija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Nav informācijas par jebkāda veida diskriminējošu valodu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklamēšana" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nav informācijas par jebkāda veida reklāmām" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Azartspēles" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nav informācijas par jebkāda veida azartspēlēm" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Pirkšana" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nav informācijas par iespējām tērēt naudu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Tērzēšana starp lietotājiem" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Nav informācijas par tērzēšanas iespējām ar citiem lietotājiem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Audio tērzēšana starp lietotājiem" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Nav informācijas par sarunāšanās iespējām ar citiem lietotājiem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontakta informācija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nav informācijas par dalīšanos ar sociālo tīklu lietotājvārdiem vai e-pasta " +"adresēm" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identitātes informācija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Nav informācijas par dalīšanos ar lietotāju informāciju ar trešajām pusēm" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Dalīšanās ar atrašanās vietu" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Nav informācijas par dalīšanos ar fizisko atrašanās vietu ar citiem " +"lietotājiem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksualitāte" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nav informācijas par norādēm uz homoseksualitāti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitūcija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nav informācijas par norādēm uz prostitūciju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Laulības pārkāpšana" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nav informācijas par norādēm uz laulības pārkāpšanu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Seksualizēti tēli" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nav informācijas par seksualizētiem tēliem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Apraksts" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nav informācijas par norādēm uz apgānīšanu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Cilvēku mirstīgās atliekas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nav informācijas par redzamām cilvēku mirstīgajām atliekām" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Verdzība" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nav informācijas par norādēm uz verdzību" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Nav norāžu uz nelegālām narkotikām" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Nesatur lamāšanos un rupjības" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Nesatur reklāmas vai naudas transakcijas" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Nesatur seksu vai kailumu" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Nesatur nekontrolētu tērzēšanas funkcionalitāti" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Nesatur vardarbību" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Narkotikas" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Rupjības" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Nauda" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sociāls" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Vardarbība" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Visiem" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s nav zināms vecuma vērtējums" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s ir piemērots visiem" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s ir piemērots mazuļiem" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s ir piemērots jauniem bērniem" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s ir piemērots bērniem" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s ir piemērots pusaudžiem" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s ir piemērots pieaugušajiem" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s ir piemērots auditorijai %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Vecuma vērtējums" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Kā papildināt trūkstošo informāciju" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Lokālā datne" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Pakotne" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Gaida" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Instalēšana gaida" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Izņemšana gaida" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Instalē" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Izņem" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Lejupielādē" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instalēt" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Atinstalēt…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Tīkls" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Var sazināties caur tīklu" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Sistēmas pakalpojumi" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Var piekļūt D-Bus pakalpojumiem uz sistēmas kopnes" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Sesijas pakalpojumi" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Var piekļūt D-Bus pakalpojumiem uz sesijas kopnes" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Ierīces" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Var piekļūt patvaļīgām ierīcēm, piemēram, tīmekļa kamerai" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Var piekļūt ievades ierīcēm" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +#| msgid "Can access microphones" +msgid "Can access microphones and play audio" +msgstr "Var piekļūt mikrofoniem un atskaņot audio" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Var piekļūt sistēmas ierīču datnēm" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Ekrāna saturs" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Var piekļūt ekrāna saturam" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Mājas mape" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Var skatīt, rediģēt un izveidot datnes" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Var skatīt datnes" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Datņu sistēma" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Lejupielāžu mape" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Iestatījumi" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Var skatīt un mainīt jebkurus iestatījumus" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Mantotā attēlošanas sistēma" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Izmanto vecu, nedrošu attēlošanas sistēmu" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Izmukšana no smilškastes" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Var izkļūt no smilškastes un apiet citus ierobežojumus" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Nav pieejams atjauninājumu apraksts." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Atjauninājumu informācija" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Nepieciešamas papildu atļaujas" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "No servera ir saņemti nederīgi vērtējumu dati" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Nevarēja sazināties ar vērtējumu serveri" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Atsauksmes" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Nav atrastas atsauksmes par šo lietotni." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Nav atsauksmju" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Versiju vēsture" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Jaunumi versijā %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versija %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Nav detalizētas informācijas par šo laidienu" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e. %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Ieslēgšanās režīms: var būt “updates”, “updated”, “installed” vai “overview”" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "REŽĪMS" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Meklēt lietotnes" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "MEKLĒT" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Rādīt informāciju par lietotni (izmantojot lietotnes ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Rādīt informāciju par lietotni (izmantojot pakotes nosaukumu)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNOSAUKUMS" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instalēt lietotni (izmantojot lietotnes ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Atinstalēt lietotni (izmantojot lietotnes ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Atvērt lokālas pakotnes datni" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "DATNES_NOSAUKUMS" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Mijiedarbības veids, sagaidīts šai darbībai: vai nu “neviens”, “paziņot” vai " +"arī “pilns”" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "MIJIEDARBĪBA" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Rādīt lokālo metainfo vai appdata datni" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Ieslēgt detalizētu atkļūdošanas izvadi (no esošas instances, ja tāda jau " +"darbojas)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Fonā instalē rindā esošos atjauninājumus" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Rādīt iestatījumus" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Iziet no strādājošas instances" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Dot priekšroku lokālo datņu avotiem, nevis AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Rādīt versijas numuru" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Autortiesības © 2016–2023 GNOME “Programmatūras” veidotāji" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Rūdolfs Mazurs " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Atvainojiet, bet par šo lietotni nav papildu informācijas." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Instalācijas izmērs" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Iekļauj %s datu un %s kešatmiņas" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Iekļauj %s datu" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Iekļauj %s kešatmiņas" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Nav zināms kešatmiņas un datu lietojums" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Lejupielādes izmērs" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Vajag papildu sistēmas lejupielādes" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Vajag nezināma apjoma papildu sistēmas lejupielādes" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Vajag %s papildu sistēmas lejupielādes" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Izmērs nav zināms" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Nav atļauju" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Ir piekļuve tīklam" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Izmanto sistēmas pakalpojumus" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Izmanto sesijas pakalpojumus" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Var piekļūt aparatūras ierīcēm" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Var piekļūt sistēmas ierīcēm" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Var lasīt un rakstīt visus jūsu datus" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Var lasīt visus jūsu datus" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Var lasīt un rakstīt visas jūsu lejupielādes" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Var lasīt visas jūsu lejupielādes" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Var piekļūt dažām specifiskām datnēm" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Var piekļūt un mainīt lietotāja iestatījumus" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Izmantot mantoto logu sistēma" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Var saņemt patvaļīgas atļaujas" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Programmatūras izstrādātājs ir pārbaudīts" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Pārbaudīja OS izplatītāji" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Pārbaudīja %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Nodrošina trešā puse" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Programmatūra vairs netiek atbalstīta" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Pārbaudāms kods" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Nezināma licence" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Īpašnieka kods" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Īpaša licence" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Priviliģēts" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Drošs" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Droši vien drošs" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potenciāli nedrošs" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Nedrošs" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Tikai mobilais" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Darbojas tikai uz maziem ekrāniem" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Tikai darbvirsma" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Darbojas tikai uz lieliem ekrāniem" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Ekrāna izmēru neatbilstība" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Neatbalsta jūsu pašreizējo ekrāna izmēru" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Nepieciešams skārienekrāns" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Nepieciešama tastatūra" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Nepieciešama pele" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Nepieciešams spēļu kontrolieris" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Nepieciešams spēļu kontrolieris, lai spēlētu" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptīvs" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Darbojas uz tālruņiem, planšetēm un darbvirsmām" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Droši vien ir nepieciešama tastatūra vai pele" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Darbojas uz darbvirsmām un klēpjdatoriem" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Nesatur vecumam neatbilstošu saturu" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Informācija nav pieejama par vecuma vērtējumu" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Apmeklēt tīmekļa vietni" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instalēt…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Atcelt" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instalēt" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Lejupielādēt" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Atjaunināt" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Atinstalēt…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Atinstalē" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritisks atjauninājums" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Uzlabošanas laikā nevar izmantot ierīci" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Avots: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Pārdēvēt no %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Beidza saņemt atjauninājums" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritisks atjauninājums" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalēts" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Palīdziet tulkot %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s projektēja, izstrādāja un tulkoja starptautiska veidotāju kopiena.\n" +"\n" +"Ja šī lietotne nav pieejama jūsu valodā, jūs varat iesaistīties tās " +"tulkošanā." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Tulkojumi" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Tulkošanas tīmekļa vietne" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Attālajam %s vajag ierakstīties (apgabals %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Nepieciešama ierakstīšanās" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "At_celt" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Ierakstīties" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Lietotājs" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +#| msgid "Password" +msgid "_Password" +msgstr "_Parole" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Citas" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Visas" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Piedāvātās" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Redaktora izvēle" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Jaunas un atjauninātas" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Izlase no tīmekļa" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Cita programmatūra" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s ir instalēts" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Nepieciešama pārstartēšana, lai izmaiņas stātos spēkā" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Lietotne ir gatava lietošanai" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Sistēmas atjauninājumi ir instalēti" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Nesen instalētie atjauninājumi ir pieejami atsauksmju izteikšanai" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Pārstartēt" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Palaist" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Instalēt programmatūru?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Instalēt trešās puses programmatūru?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Ieslēgt programmatūras krātuves?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Ieslēgt trešās puses programmatūras krātuves?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s nav brīva un atvērta programmatūra, un to nodrošina “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s nodrošina “%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Jāieslēdz šīs programmatūras krātuves, lai varētu turpināt instalēšanu." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "%s instalēšana vai izmantošana dažās valstīs varētu būt nelegāla." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Šī kodeka instalēšana vai izmantošana dažās valstīs varētu būt nelegāla." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_Vairs nebrīdināt" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "_Ieslēgt un instalēt" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Seko detalizēta informācija par kļūdām no pakotņu pārvaldnieka:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Sīkāka informācija" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Aizvērt" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Informācija nokopēta starpliktuvē" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Pieņemt" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Atjauninājums tika uzinstalēts" +msgstr[1] "Atjauninājumi tika uzinstalēti" +msgstr[2] "Atjauninājumi tika uzinstalēti" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Lietotne ir tika atinstalēta" +msgstr[1] "Lietotnes ir tika atinstalētas" +msgstr[2] "Lietotnes ir tika atinstalētas" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Nepieciešama pārstartēšana, lai tas stātos spēkā" +msgstr[1] "Nepieciešama pārstartēšana, lai tie stātos spēkā" +msgstr[2] "Nepieciešama pārstartēšana, lai tie stātos spēkā" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Ne tagad" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Šodien" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +#| msgid "Yesterday, %R" +msgid "Yesterday" +msgstr "Vakar" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Pirms %d dienas" +msgstr[1] "Pirms %d dienām" +msgstr[2] "Pirms %d dienām" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Pirms %d nedēļas" +msgstr[1] "Pirms %d nedēļām" +msgstr[2] "Pirms %d nedēļām" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Pirms %d mēneša" +msgstr[1] "Pirms %d mēnešiem" +msgstr[2] "Pirms %d mēnešiem" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Pirms %d gada" +msgstr[1] "Pirms %d gadiem" +msgstr[2] "Pirms %d gadiem" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Tikko" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Pirms %d minūtes" +msgstr[1] "Pirms %d minūtēm" +msgstr[2] "Pirms %d minūtēm" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Pirms %d stundas" +msgstr[1] "Pirms %d stundām" +msgstr[2] "Pirms %d stundām" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Visa" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Piedāvātā" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D grafika" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografēšana" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skenēšana" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorgrafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Skatītāji" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Audio veidošana un rediģēšana" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Mūzikas atskaņotāji" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Visa" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Piedāvātā" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendāri" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Datubāzes" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finanses" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Tekstapstrādes programmas" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Teksta redaktori" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Tīmekļa pārlūki" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Visa" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Piedāvātā" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Darbības" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Piedzīvojumu" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkādes" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Bloku" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Galda" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kāršu" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatori" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Bērnu" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Loģikas" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Lomu spēļu" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sporta" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Stratēģijas" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Visa" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Piedāvātā" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Tērzēšanai" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Visa" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Piedāvātā" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Mākslīgais intelekts" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomija" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Ķīmija" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Valodas" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matemātika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Ziņas" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Māksla" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biogrāfija" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komiksi" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Daiļliteratūra" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Veselība" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Vēsture" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Dzīvesveids" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sports" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Visa" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Piedāvātā" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Atkļūdotāji" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Izstrādes vides" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeki" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Aparatūra un draiveri" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Fonti" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Ievades avoti" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Valodu pakas" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalizācija" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Izveidot" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Strādā" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Spēlē" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializējies" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Mācies" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Izstrādā" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodeki" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Aparatūras draiveri" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Fonti" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Ievades avoti" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Valodu pakas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalizācija" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Lietotne" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s pieprasa papildu datņu formātu atbalstu." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Nepieciešami papildu MIME tipi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s pieprasa papildu fontus." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Nepieciešami papildu fonti" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s pieprasa papildu multimediju kodekus." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Nepieciešami papildu multimediju kodeki" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s pieprasa papildu printeru draiverus." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Nepieciešami printeru draiveri" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s pieprasa papildu pakotnes." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Nepieciešama papildu pakotnes" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Meklēt programmatūrā" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Rādīt vairāk" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Rādīt mazāk" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Izņem…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Jāpārstartē, lai pabeigtu instalēt" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Jāpārstartē, lai pabeigtu izņemšanu" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Instalēšana gaida…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Atjaunināšana gaida…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Lejupielādē…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Sagatavo…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Atinstalē…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s nav instalēta, bet uz sistēmas atrodas tās dati." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "Pā_rstartēt" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "I_eslēgt…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instalēt…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s būs ASV angļu valodā" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Šī lietotne būs ASV angļu valodā" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Šī programmatūra būs ASV angļu valodā" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Palīdzi _tulkot" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Citas lietotnes no %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Izstrādātājs %s ir pierādījis, ka ir %s īpašnieks" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Izstrādātājs ir pierādījis, ka ir %s īpašnieks" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Jums vajadzīga interneta piekļuve, lai rakstītu apskatu" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Šī lietotne vairs nesaņem drošības atjauninājumus, tai skaitā drošības " +"ielāpus" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "Šo lietotni jau piegādā jūsu distribūcija un to nevajadzētu aizvietot." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Šī lietotne nepiedāvā nekādas saites uz tīmekļa vietni, pirmkoda krātuvēm " +"vai kļūdu izsekotāju." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Šī programmatūra vairs nesaņem drošības atjauninājumus, tai skaitā drošības " +"ielāpus" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Šo programmatūru jau piegādā jūsu distribūcija un to nevajadzētu aizvietot." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Šī programmatūra nepiedāvā nekādas saites uz tīmekļa vietni, pirmkoda " +"krātuvēm vai kļūdu izsekotāju." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Programmatūrai neizdevās saņemt informāciju par “%s” un tā nevar parādīt " +"sīkāku informāciju par šo lietotni." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "No servera ir saņemta nederīga vērtējumu atbilde" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Neizdevās iesniegt atsauksmi par “%s” — %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Sīkākas informācijas lapa" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Ielādē informāciju par lietotni" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Pārbaudīts" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Atvērt" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Atja_unināt" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Atinstalēt" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Pielikumi" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "Šo lietotni var izmantot tikai tad, kad ir savienojums ar internetu." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Programmatūras krātuve ir iekļauta" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Šī lietotne iekļauj programmatūras krātuvi, kas sniedz atjauninājumus, kā " +"arī piekļuvi citai programmatūrai." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Programmatūras krātuve nav iekļauta" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Šī lietotne neiekļauj programmatūras krātuves. Tā netiks atjaunināta līdz ar " +"jaunām versijām." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Programmatūras krātuve identificēta" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Šīs programmatūras krātuves pievienošana jums sniegs piekļuvi papildu " +"programmatūrai un uzlabojumiem." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Izmantojiet tikai uzticamas programmatūras krātuves." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Attīrīt lietotnes datus" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "D_zēst datus" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Nav metadatu" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Projekta tīmekļa _vietne" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Ziedot" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Palīdzi _tulkot" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Ziņot par problēmu" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Palīdzība" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Saiznāties" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Rakstīt atsauksmi" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Visas atsauksmes" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Nevar parādīt sīkāku informāciju par lietotni" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Neizdevās sagatavot pārstartēšanu" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Nezināma kļūda" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Atslēga nav atrasta" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Atslēga nav reģistrēta" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Nepieciešama MOK reģistrācija" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Nākamais" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Šai ierīcei ir ieslēgts Secure Boot. Lai atļautu ieslēgt draiverus, ir " +"jāreģistrē jauna datora lietotāja atslēga (MOK). Vēlāk procesā ir jāievada " +"parole. Lūdzu, piefiksējiet sekojošo paroli, kas ir saistīta ar šo atslēgu:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Esmu piefiksējis MOK _paroli" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "Pā_rstartēt un reģistrēt…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Uzstādīšanas instrukcijas — izlasiet rūpīgi" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Pēc pārstartēšanas tiks parādīts uzstādīšanas ekrāns. Lai ieslēgtu jaunos " +"draiverus, ejiet cauri šiem uzstādīšanas soļiem:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Izvēlieties “Reģistrēt MOK”\n" +"• Izvēlieties “Yes”, lai reģistrētu atslēgas\n" +"• Ievadiet MOK paroli, kad tā tiek pieprasīta\n" +"• Izvēlieties “Pārstartēt”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Ietekme uz drošību" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Pēc veiksmīgas atslēgas reģistrācijas ņemiet vērā, ka sistēma uzticēsies " +"jebkuriem turpmākajiem moduļiem vai jebkuram citam moduļa atjauninājumam bez " +"jautāšanas. Visi turpmākie atjauninājumi notiks nemanāmi bez mijiedarbības " +"un/vai pilnvarošanas." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Turpmākus norādījumus var atrast dokumentācijas lapā." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Lejupielādē papildu metadatu datnes…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " un " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Pieejamie fonti %s skriptam" +msgstr[1] "Pieejamie fonti %s skriptiem" +msgstr[2] "Pieejamie fonti %s skriptiem" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Pieejamā programmatūra kodekam %s" +msgstr[1] "Pieejamā programmatūra kodekiem %s" +msgstr[2] "Pieejamā programmatūra kodekiem %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Pieprasītā programmatūra nav atrasta" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Neizdevās atrast pieprasīto programmatūru" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s nav atrasts" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "tīmekļa vietnē" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Nav lietotņu, kas nodrošinātu datni %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informācija par %s, kā arī opcijas par to, kā saņemt trūkstošās lietotnes, " +"var atrast %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s atbalstam nav pieejamu lietotņu." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s nav pieejams." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informāciju par %s, kā arī opcijas par to, kā saņemt lietotnes, kas atbalsta " +"šo formātu, var atrast %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s rakstības atbalstam nav pieejamu fontu." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informāciju par %s, kā arī opcijas par to, kā saņemt papildu fontus, var " +"atrast %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s formātam nav pieejamu papildinājuma kodeku." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informāciju par %s, kā arī opcijas par to, kā saņemt kodeku, kas var " +"atskaņot šo formātu, var atrast %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s atbalstam nav pieejamu Plasma resursu." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informāciju par %s, kā arī opcijas par to, kā saņemt papildu Plasma " +"resursus, var atrast %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s nav pieejamu printera draiveru." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informāciju par %s, kā arī opcijas par to, kā saņemt draiveri, kas atbalsta " +"šo printeri, var atrast %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentācija" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Nevarēja atrast %s, ko pieprasīja %s. Lūdzu, skatiet %s, lai uzzinātu vairāk." +msgstr[1] "" +"Nevarēja atrast %s, ko pieprasīja %s. Lūdzu, skatiet %s, lai uzzinātu vairāk." +msgstr[2] "" +"Nevarēja atrast %s, ko pieprasīja %s. Lūdzu, skatiet %s, lai uzzinātu vairāk." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Neizdevās atrast jūsu meklēto %s. Lūdzu, skatiet %s, lai uzzinātu vairāk." +msgstr[1] "" +"Neizdevās atrast jūsu meklētos %s. Lūdzu, skatiet %s, lai uzzinātu vairāk." +msgstr[2] "" +"Neizdevās atrast jūsu meklētos %s. Lūdzu, skatiet %s, lai uzzinātu vairāk." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Neizdevās atrast nevienu meklēšanas rezultātu: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s datnes formāts" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Inst_alēt visu" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Nevarēja atrast pieprasīto programmatūru" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kodeku lapa" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Nav atrastu rezultātu" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Nevar veikt meklēšanu" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Iepriekšējais" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Nākamais" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Piedāvāto lietotņu saraksts" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Darbvirsmas atbalsts" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Atbalsta izmantošanu uz lielā ekrāna" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Darbvirsmas atbalsts nav zināms" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Nepietiek informācijas, lai zinātu, vai lieli ekrāni ir atbalstīti" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Pieprasa lielu ekrānu" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Darbvirsma nav atbalstīta" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Nevar izmantot uz liela ekrāna" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobilais atbalsts" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Atbalsta izmantošanu uz maza ekrāna" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobilais atbalsts nav zināms" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Nepietiek informācijas, lai zinātu, vai mazi ekrāni ir atbalstīti" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Pieprasa mazu ekrānu" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobilais nav atbalstīts" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Nevar izmantot uz maza ekrāna" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Tastatūras atbalsts" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Nezināms tastatūras atbalsts" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Nepietiek informācijas, lai zinātu, vai tastatūras ir atbalstītas" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Nepieciešama tastatūra" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Atbalsta tastatūras" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tastatūras nav atbalstītas" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Nevar izmantot ar tastatūru" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Peles atbalsts" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Nepieciešama pele vai rādīšanas ierīce" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Peles atbalsts nav zināms" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Nepietiek informācijas, lai zinātu, vai ir atbalstītas peles vai rādīšanas " +"ierīces" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Nepieciešama pele" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Atbalsta peles un rādīšanas ierīces" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Peles nav atbalstītas" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Nevar izmantoto peli vai rādīšanas ierīci" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Skārienekrānu atbalsts" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Skārienekrānu atbalsts nav zināms" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Nepietiek informācijas, lai zinātu, vai skārienekrāni ir atbalstīti" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Nepieciešams skārienekrāns" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Atbalsta skārienekrānus" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Skārienekrāni nav atbalstīti" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Nevar izmantot ar skārienekrānu" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Nepieciešams spēļu kontrolieris" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Nepieciešams spēļu kontrolieris" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Spēļu kontroliera atbalsts" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Atbalsta spēļu kontrolierus" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s droši vien strādās ar šo ierīci" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s strādā ar šo ierīci" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s iespējams strādās ar šo ierīci" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s nestrādās korekti ar šo ierīci" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s nestrādās ar šo ierīci" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Aparatūras atbalsts" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigācija" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Iet uz pārskatīšanas lapu" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Iet uz instalēto lietotņu lapu" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Iet uz atjauninājumu lapu" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Atvērt meklēšanas joslu" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Logi" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Atvērt iestatījumus" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Atvērt programmatūras krātuves" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Palīdzība" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Atvērt tastatūras īsinājumtaustiņus" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalētās" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Instalētās lapas" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Tiek izpildīts" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Lietotnes" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Tīmekļa lietotnes" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Sistēmas lietotnes" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Kopienas veidots" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Piedalīties" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Šī programmatūra tika izstrādāta starptautiskā kopienā un tā ir izlaista zem " +"%s licences.\n" +"\n" +"Jūs varat piedalīties un padarīt to vēl labāku." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Šī programmatūra tika izstrādāta starptautiskā kopienā un tā ir izlaista zem " +"%s licences.\n" +"\n" +"Jūs varat piedalīties un padarīt to vēl labāku." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Šī lietotne tika izstrādāta starptautiskā kopienā un tā ir izlaista zem %s licences.\n" +"\n" +"Jūs varat piedalīties un padarīt to vēl labāku." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Šī lietotne tika izstrādāta starptautiskā kopienā un tā ir izlaista zem %s " +"licences.\n" +"\n" +"Jūs varat piedalīties un padarīt to vēl labāku." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Nezināma licence" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Uzzināt vairāk" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Šī lietotne nav norādījusi, kāda ir tās licence, un tā varētu būt slēgta. " +"Tajā varētu būt grūti atklāt drošības problēmas un tā varētu tikt mainīta " +"bez pārraudzības.\n" +"\n" +"Jūs nevarēsiet dot savu ieguldījumu šīs lietotnes attīstībā." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Šī programmatūra nav norādījusi, kāda ir tās licence, un tā varētu būt " +"slēgta. Tajā varētu būt grūti atklāt drošības problēmas un tā varētu tikt " +"mainīta bez pārraudzības.\n" +"\n" +"Jūs nevarēsiet dot savu ieguldījumu šīs lietotnes attīstībā." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Īpašnieka" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Šī lietotne nav izstrādāta atvērtā formā un tikai tās izstrādātāji zina, kā " +"tā darbojas. Tajā varētu būt grūti atklāt drošības problēmas un tā varētu " +"tikt mainīta bez pārraudzības.\n" +"\n" +"Jūs nevarēsiet dot savu ieguldījumu šīs lietotnes attīstībā." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Šī programmatūra nav izstrādāta atvērtā formā un tikai tās izstrādātāji " +"zina, kā tā darbojas. Tajā varētu būt grūti atklāt drošības problēmas un tā " +"varētu tikt mainīta bez pārraudzības.\n" +"\n" +"Jūs nevarēsiet dot savu ieguldījumu šīs programmatūras attīstībā." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Īpaša licence" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Šī lietotne ir izstrādāta zem īpašas licences %s.\n" +"\n" +"Varētu būt, ka jūs nevarēsiet uzlabot šo lietotni." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Šī lietotne ir izstrādāta zem īpašas licences “%s”.\n" +"\n" +"Varētu būt, ka jūs nevarēsiet uzlabot šo lietotni." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Šī programmatūra ir izstrādāta zem īpašas licences %s.\n" +"\n" +"Varētu būt, ka jūs nevarēsiet uzlabot šo programmatūru." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Šī programmatūra ir izstrādāta zem īpašas licences “%s”.\n" +"\n" +"Varētu būt, ka jūs nevarēsiet uzlabot šo programmatūru." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Atsvaidzina datus" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Ielādē lapu" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Startējas" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Nezināms avots" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Lietotājs" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Pievienotās" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Izņemtās" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Atjauninājumi" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Pazeminājumi" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "izvēlētie ārējie avoti" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Sniedz pieeju papildu programmatūrai no %s. Tajā ir iekļauta arī " +"īpašniekprogrammatūra.\n" +"\n" +"Jūs varat ieslēgt šīs krātuves vēlāk lietotnes Programmatūras Krātuves " +"iestatījumos." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Ieslēgt trešās puses programmatūras krātuves?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorēt" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "I_eslēgt" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Pieejams šajā operētājsistēmā" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Pieejams distribūcijai %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Pārskatīt" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Pārskata lapa" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Pieejamās lietotnes" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Citas kategorijas" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nav atrastu lietotņu datu" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Nezināma" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Labi" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Lietotāja liegta instalācija" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Sagatavot %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Vai tiešām vēlaties izņemt %s krātuvi?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Visas lietotnes no %s tiks atinstalētas. Lai tās lietotu atkal, krātuve būs " +"jāpārinstalē." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Atinstalēt %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "To nevarēs lietot pēc %s izņemšanas." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Pēc %s izņemšanas nevarēs lietot tās lietotnes, kas bija no tā atkarīgs." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"To nevarēs lietot pēc %s izņemšanas. Un visus dokumentos, kuros tas tika " +"izmantots, parādīsies cits fonts." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"To nevarēs lietot pēc %s izņemšanas. Tas varētu nozīmēt, ka dažas " +"multimediju datnes vairs nevarēs atskaņot." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Pēc noņemšanas, aparatūra, kura ir atkarīga no %s, varētu vairs nedarboties " +"pareizi." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"To nevarēs lietot pēc %s izņemšanas. Lietotnes dati un iestatījumi tiks " +"saglabāti uz diska, lai nākotnē varētu atjaunot lietotni." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Iestatījumi" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Programmatūras atjauninājumi" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Vairāk informācijas" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Atjauninājumu pārbaudīšana patērē datus un elektrību. Tāpēc automātiskās " +"atjaunināšanas iespējas ir izslēgtas uz mērītiem tīkla savienojumiem un kad " +"ir ieslēgta elektrības taupīšana." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automātiski" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Automātiski pārbaudīt un lejupielādēt atjauninājumus" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Pašrocīgi" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Atjauninājumu pārbaudīšana un lejupielādēšana jāveic pašrocīgi" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Automātiskās atjaunināšanas _paziņojumi" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Paziņot, kad atjauninājumi ir automātiski uzinstalēti" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Satura filtri" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Rādīt tikai _brīvo programmatūru" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Slēpt slēgto programmatūru, kad pārlūko un meklē" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Rādīt tikai _pārbaudītos izstrādātājus" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Rādīt lietotnes tikai no izstrādātājiem, kuru identitāte ir pārbaudīta" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Instalētā programmatūra nav savietojama ar %s un tiks automātiski izņemta " +"uzlabošanas laikā." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Nesavietojamā programmatūra" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Uzlabot" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Atinstalēt" + +#: src/gs-remove-app-dialog.ui:19 +#| msgid "App Settings & Data" +msgid "App Settings & Data" +msgstr "Lietotņu iestatījumi un dati" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Paturēt" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Ļauj atjaunot lietotnes iestatījumus un saturu" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Dzēst" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Pavisam izdzēš datus, lai saglabātu diska vietu" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Programmatūras, kas tika instalēta no “%s”, vairs nesaņems atjauninājumus." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Deaktivizēt krātuvi" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Izņemt krātuvi?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Izslēgt" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Izņemt" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Aktivizēt jaunas krātuves" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Ieslēgt krātuves kad tās ir pievienotas" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "vairāk informācijas" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Papildu krātuves no izvēlētajām trešajām pusēm — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora trešo pušu krātuves" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "šī operētājsistēma" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Šīs krātuves papildina noklusējuma programmatūru, ko nodrošina %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Programmatūras krātuves" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Nav krātuvju" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "Instalēta %u lietotne" +msgstr[1] "Instalētas %u lietotnes" +msgstr[2] "Instalētas %u lietotnes" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "Instalēts %u papildinājums" +msgstr[1] "Instalēti %u papildinājumi" +msgstr[2] "Instalēti %u papildinājumi" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u lietotne" +msgstr[1] "%u lietotnes" +msgstr[2] "%u lietotņu" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u papildinājums" +msgstr[1] "%u papildinājumi" +msgstr[2] "%u papildinājumu" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s un %s instalēts" +msgstr[1] "%s un %s instalēti" +msgstr[2] "%s un %s instalēti" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Pārbauda instalēto programmatūru…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Izņemt" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Nevaru ciest" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Nepatīk" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Ir labi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Patīk" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Esmu sajūsmā" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Izvēlieties zvaigzni, lai atstātu vērtējumu" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Lūdzu, veltiet vairāk laika, rakstot atsauksmi" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Ludzu, izvēlieties zvaigznes vērtējumu" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Kopsavilkums ir pārāk īss" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Kopsavilkums ir pārāk garš" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Apraksts ir pārāk īss" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Apraksts ir pārāk garš" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Rakstīt atsauksmi" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Sūtīt" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Lūdzu, sniedziet vērtējumu, kopsavilkumu un atsauksmes tekstu. Atsauksmes " +"nevajadzētu izmantot, lai ziņotu par kļūdām, tā vietā sazinieties ar " +"izstrādātāju vai savu atbalsta sniedzēju." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Atsauksmes kopsavilkums" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Rakstīt īsu atsauksmi" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Mūsu privātuma politikā varat " +"uzzināt, kādi dati tiek nosūtīti. Jūsu vārds, kas ir saistīts ar jūsu kontu, " +"būs publiski redzams." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u atsauksme kopā" +msgstr[1] "%u atsauksmes kopā" +msgstr[2] "%u atsauksmju kopā" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "no 5 zvaigznēm" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Nezināms" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Jūs varat ziņot par rupjām, nepiedienīgām vai diskriminējošām atsauksmēm." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Kad atsauksme ir nosūtīta, tā būs paslēpta līdz to izskatīs administrators." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Ziņot par atsauksmi?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Ziņot" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Noņemt atsauksmi?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Atsauksmes noņemšanu nevar atsaukt." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Atsauksmei pielikt \"Patīk\"" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Atsauksmei pielikt \"Nepatīk\"" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Ziņot…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Izņemt…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Lietotne nav izolēta smilškastē, bet izplatītājs ir pārliecinājies, ka tā " +"nav ļaundabīga" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Pārliecinieties, ka uzticaties piegādātājam, jo lietotne nav ierobežota " +"smilškastē" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Nav atļauju" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Lietotne ir pilnībā izolēta smilškastē" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Piekļuve tīklam" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Var piekļūt internetam" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Nav piekļuve tīklam" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Nevar piekļūt internetam" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Izmanto sistēmas pakalpojumus" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Var pieprasīt datus no sistēmas pakalpojumiem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Izmanto sesijas pakalpojumus" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Var pieprasīt datus no sesijas pakalpojumiem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Piekļuve lietotāja ierīcēm" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Var piekļūt ierīcēm, piemēram, tīmekļa kamerām vai spēļu kontrolieriem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Nav piekļuve lietotāja ierīcēm" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Nevar piekļūt ierīcēm, piemēram, tīmekļa kamerām vai spēļu kontrolieriem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Piekļuve ievades ierīcēm" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +#| msgid "Microphone Access" +msgid "Microphone Access and Audio Playback" +msgstr "Piekļuve mikrofonam un audio atskaņošana" + +#: src/gs-safety-context-dialog.c:235 +#| msgid "Can listen using microphones without asking permission" +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Var klausīties, izmantojot mikrofonu, un atskaņot, neprasot atļauju" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Piekļuve sistēmasierīcēm" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "Var piekļūt sistēmas ierīcēm, kurām vajag īpašas atļaujas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Ekrāna satura piekļuve" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Var piekļūt saturam uz ekrāna vai citos logos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Mantotā logu sistēma" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Patvaļīgas atļaujas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Lietotāja iestatījumi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Pilnas tiesības lasīt/rakstīt datņu sistēmā" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Var lasīt un rakstīt visus datus datņu sistēmā" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Lasīšanas/rakstīšanas piekļuve mājas mapei" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Var lasīt un rakstīt visus datus jūsu mājas direktorijā" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Pilnas tiesības lasīt datņu sistēmā" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Var lasīt visus datus datņu sistēmā" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Lasīšanas piekļuve mājas mapei" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Var lasīt visus datus jūsu mājas direktorijā" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Lasīšanas/rakstīšanas piekļuve lejupielāžu mapei" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Var lasīt un rakstīt visus datus jūsu lejupielāžu direktorijā" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Lasīšanas piekļuve lejupielāžu mapei" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Var lasīt visus datus jūsu lejupielāžu direktorijā" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Var lasīt un rakstīt visus datus direktorijā" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Var lasīt visus datus direktorijā" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Tiesība tiesības piekļūt datņu sistēmai" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Vispār nevar piekļūt datņu sistēmai" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Lietotnes izstrādātājs ir pārbaudīts" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Ir pārbaudīts, ka šīs lietotnes izstrādātājs ir tas, par ko uzdodas" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Nedrošas atkarības" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Programmatūra vai tās atkarības vairs nav atbalstītas un varētu būt nedrošas" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Šī lietotne nav norādījusi, kāda ir tās licence, un tā varētu būt slēgta." + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Šī programmatūra nav norādījusi, kāda ir tās licence, un tā varētu būt " +"slēgta." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Īpašnieka kods" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Pirmkods nav publisks, tāpēc to nevar neatkarīgi pārbaudīt un tas varētu būt " +"nedrošs" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Šī lietotne ir izstrādāta zem īpašas licences “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Šī programmatūra ir izstrādāta zem īpašas licences “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Pārbaudāms kods" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Pirmkods ir publiski pieejams un to var neatkarīgi pārbaudīt, tāpēc ir " +"lielāka iespēja, ka lietotne ir droša" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s ir priviliģēta" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s ir droša" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s droši vien ir droša" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s ir potenciāli nedroša" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s ir nedroša" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Nezināma" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Drošība" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licence" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Avots" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Šī lietotne izmanto novecojušu programmatūras platformu (SDK) un tajā varētu " +"būt kļūdas un drošības ievainojamības, kuras netiks labotas." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Iepriekšējais ekrānattēls" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Nākamais ekrānattēls" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Nav ekrānattēlu" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Ekrānattēls nav atrasts" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Neizdevās ielādēt attēlu" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Ekrānattēla izmērs nav atrasts" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Neizdevās izveidot kešu" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Ekrānattēls nav derīgs" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Ekrānattēls nav pieejams" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Ekrānattēls" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "Vēl %u atbilstība" +msgstr[1] "Vēl %u atbilstības" +msgstr[2] "Vēl %u atbilstību" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Meklēšanas lapa" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Meklēt lietotnes" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Nav atrastu lietotņu" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Nevar lejupielādēt atjauninājumus" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Nevar lejupielādēt aparātprogrammatūras atjauninājumus" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nevar lejupielādēt aparātprogrammatūras atjauninājumus no %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nevar lejupielādēt atjauninājumus no %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Nevar atjaunināt: nepieciešama piekļuve internetam" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Nevar atjaunināt — nepietiek diska vietas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Nevar lejupielādēt atjauninājumus no %s: nepietiek diska vietas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Nevar atjaunināt — vajadzīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Nevar atjaunināt — nederīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Nevar atjaunināt — nepieciešama atļauja" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Nevar lejupielādēt atjauninājumus: jums nav atļaujas instalēt programmatūru" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Nevar iegūt atjauninājumu sarakstu" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Nevar instalēt — neizdevās lejupielādēt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Nevar instalēt %s — neizdevās lejupielādēt no %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Nevar instalēt %s — neizdevās lejupielādēt" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Nevar instalēt — nav izpildlaika" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Nevar instalēt %s — izpildlaiks %s nav pieejams" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Nevar instalēt %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Nevar instalēt — nepieciešama piekļuve internetam" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Nevar instalēt — nederīgs lietotnes formāts" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Nevar instalēt — nepietiek diska vietas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Nevar instalēt %s — nepietiek diska vietas" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Nevar instalēt — vajadzīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Nevar instalēt %s — vajadzīga autentifikācija" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Neizdevās instalēt — nederīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Neizdevās instalēt %s — nederīga autentifikācija" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Nevar instalēt — nepieciešama atļauja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Nevar instalēt %s — nepieciešama atļauja" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Nevar instalēt — ierīcei ir jābūt piespraustai" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Nevar instalēt %s — ierīcei ir jābūt piespraustai" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Nevar instalēt — baterijā maz enerģijas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Nevar instalēt %s — baterijā maz enerģijas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Nevar atjaunināt %s no %s — neizdevās lejupielādēt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Nevar atjaunināt %s — neizdevās lejupielādēt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Nevar instalēt atjauninājumus no %s — neizdevās lejupielādēt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Nevar atjaunināt — neizdevās lejupielādēt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Nevar atjaunināt %s — nepietiek diska vietas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Nevar atjaunināt %s — vajadzīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Nevar atjaunināt %s — nederīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Nevar atjaunināt %s — nepieciešama atļauja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Nevar atjaunināt — ierīcei ir jābūt pieslēgtai barošanai" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Nevar atjaunināt %s — ierīcei ir jābūt pieslēgtai barošanai" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Nevar atjaunināt — baterijā maz enerģijas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Nevar atjaunināt %s — baterijā maz enerģijas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Nevar atjaunināt %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Nevar atjaunināt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Nevar uzlabot" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Nevar uzlabot uz %s no %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Nevar uzlabot — neizdevās lejupielādēt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Nevar uzlabot uz %s — neizdevās lejupielādēt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Nevar uzlabot — nepieciešama piekļuve internetam" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Nevar uzlabot uz %s — nepieciešama piekļuve internetam" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Nevar uzlabot — nepietiek diska vietas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Nevar uzlabot uz %s — nepietiek diska vietas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Nevar uzlabot — vajadzīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Nevar uzlabot uz %s — vajadzīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Nevar uzlabot — nederīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Nevar uzlabot uz %s — nederīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Nevar uzlabot — nepieciešama atļauja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Nevar uzlabot uz %s — nepieciešama atļauja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Nevar uzlabot — ierīcei ir jābūt pieslēgtai barošanai" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Nevar uzlabot uz %s — ierīcei ir jābūt pieslēgtai barošanai" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Nevar uzlabot — baterijā maz enerģijas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Nevar uzlabot uz %s — baterijā maz enerģijas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nevar uzlabot uz %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Nevar atinstalēt — vajadzīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Nevar atinstalēt %s — vajadzīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Neizdevās atinstalēt — nederīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Neizdevās atinstalēt %s — nederīga autentifikācija" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Nevar atinstalēt — nepieciešama atļauja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Nevar atinstalēt %s — nepieciešama atļauja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Nevar atinstalēt — ierīcei ir jābūt pieslēgtai barošanai" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Nevar atinstalēt %s — ierīcei ir jābūt pieslēgtai barošanai" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Nevar atinstalēt — baterijā maz enerģijas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Nevar atinstalēt %s — baterijā maz enerģijas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Nevar atinstalēt %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Nevar palaist %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Diemžēl kaut kas nogāja greizi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Nevar palaist %s: %s nav instalēts" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Darbībai nepietiek diska vietas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Nevar instalēt — datnes tips nav atbalstīts" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Nevar instalēt — autentifikācija neizdevās" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Nevar instalēt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Nevar sazināties ar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Jāpārstartē “Programmatūru”, lai lietotu jaunos spraudņus" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Ierīcei ir jābūt pieslēgtai barošanai" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Baterijas līmenis ir pārāk zems" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Programmatūra_s krātuves" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Iestatījumi" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Tastatūras īsinājumtaustiņi" + +#: src/gs-shell.ui:23 +#| msgid "About Software" +msgid "_About Software" +msgstr "P_ar “Programmatūru”" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Meklēt" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Galvenā izvēlne" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Meklēt lietotnes" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Pārskatīt" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalētās" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Atjauninājumi" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Iet atpakaļ" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nekas" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Lietotnes dati" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Nepieciešamie dati, lai lietotne varētu strādāt" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Lietotāja dati" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Jūsu izveidotie dati lietotnē" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Kešatmiņas dati" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Pagaidu kešatmiņas dati" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Pati lietotne" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Nepieciešamās atkarības" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Koplietotās sistēmas komponentes, kas ir nepieciešamas šai lietotnei" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Nezināms" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Kešatmiņas datus var izdzēst _lietotņu iestatījumos" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Krātuve" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (instalēts)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (instalē)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (lejupielādē)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (izņem)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Sīkāka informācija" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Izpētīt" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Instalēts %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Instalētās lietotnes" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Nav instalētu atjauninājumu" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Atjauninājumi ir novecojuši" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Lūdzu, pārbaudiet pieejamos atjauninājumus." + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Kritiski atjauninājumi ir gatavi instalēšanai" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Instalēt kritiskos atjauninājumus pēc iespējas agrāk" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Kritiski atjauninājumi ir pieejami lejupielādēšanai" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Lejupielādēt kritiskos atjauninājumus pēc iespējas agrāk" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Atjauninājumi ir gatavi instalēšanai" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Programmatūras atjauninājumi ir gatavi un gaida" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Atjauninājumi ir pieejami lejupielādēšanai" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Programmatūras atjauninājumus var lejupielādēt" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u lietotne ir atjaunināta — Nepieciešama pārstartēšana" +msgstr[1] "%u lietotnes ir atjauninātas — Nepieciešama pārstartēšana" +msgstr[2] "%u lietotnes ir atjauninātas — Nepieciešama pārstartēšana" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u lietotne ir atjaunināta" +msgstr[1] "%u lietotnes ir atjauninātas" +msgstr[2] "%u lietotnes ir atjauninātas" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s tika atjaunināts." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Lūdzu, pārstartējiet lietotni." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s un %s tika atjaunināti." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u lietotne pieprasa pārstartēšanu." +msgstr[1] "%u lietotnes pieprasa pārstartēšanu." +msgstr[2] "%u lietotņu pieprasa pārstartēšanu." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Iekļauj %s, %s un %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Sistēma ir sasniegusi savas dzīves nogali" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Pārejiet uz jaunāku OS versiju, lai turpinātu saņemt atjauninājumus" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Jauna %s versija ir pieejama instalēšanai" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Pieejami programmatūras atjauninājumi" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Neizdevās atjaunināt programmatūru" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Sagatavotie atjauninājumi netika uzinstalēti" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Rādīt sīkāku informāciju" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Sistēmas uzlabošana ir pabeigta" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Laipni lūdzam sistēmā %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Programmatūras atjauninājums uzinstalēts" +msgstr[1] "Programmatūras atjauninājumi uzinstalēti" +msgstr[2] "Programmatūras atjauninājumi uzinstalēti" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Tika uzinstalēts svarīgs operētājsistēmas atjauninājums." +msgstr[1] "Tika uzinstalēti svarīgi operētājsistēmas atjauninājumi." +msgstr[2] "Tika uzinstalēti svarīgi operētājsistēmas atjauninājumi." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Pārskats" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Neizdevās atjaunināt" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Sistēma jau ir aktuāla." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Atjaunināšana tika atcelta." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Bija nepieciešama pieeja internetam, bet tā nebija pieejama. " +"Pārliecinieties, ka jums ir pieeja internetam un mēģiniet vēlreiz." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Šim atjauninājumam bija problēmas ar drošību. Lūdzu, sazinieties ar " +"programmatūras nodrošinātāju, lai uzzinātu vairāk." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Nepietika diska vietas. Lūdzu, atbrīvojiet vietu un mēģiniet vēlreiz." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Diemžēl neizdevās uzinstalēt atjauninājumu. Gaidiet nākamo atjauninājumu un " +"tad mēģiniet vēlreiz. Ja problēma neatrisinās, sazinieties ar programmatūras " +"nodrošinātāju." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Pēdējo reizi pārbaudīts: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Apturēt" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Pārbaudīt atjauninājumus" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s vairs nesaņem kritiskus programmatūras atjauninājumus" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Jūsu operētājsistēma vairs nesaņem kritiskus programmatūras atjauninājumus" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Var tikt piemērota maksa" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Atjauninājumu pārbaudīšana, lietojot mobilo platjoslas savienojumu, var " +"maksāt papildus" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Tomēr pārbaudīt" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Programmatūras uzlabojumi ir lejupielādēti" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Uzlabojumi ir gatavi instalēšanai" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Pārbaudīt atjauninājumus" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Atjauninājumi" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Atjauninājumu mape" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Ielādē atjauninājumus" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Tas var aizņemt kādu laiciņu" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Aktuāls" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Izmantojat mobilos datus?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Atjauninājumu pārbaudīšana, lietojot mobilo platjoslas savienojumu, var " +"izmaksās papildus" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Tomēr pārbaudīt" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Nav savienojuma" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Doties tiešsaistē, lai pārbaudītu atjauninājumus" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Tīkla iestatījumi" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Kļūda" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Atjauninājumi tika automātiski sapludināti" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Programmatūras atjaunināšana ir pauzēta" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Automātiskie programmatūras atjauninājumi ir pauzēti šo iemeslu dēļ:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Pašreizējais tīkla savienojums ir mērīts" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Pašreizējais tīkla savienojums aizliedz lielas lejupielādes" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Ir ieslēgta enerģijas taupīšana" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Ir ieslēgts spēļu režīms" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Programmatūras atjaunināšana ir pauzēta" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Tīkla savienojums ir mērīts — programmatūras atjaunināšana ir pauzēta" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Tīkla savienojums aizliedz lielas lejupielādes — programmatūras " +"atjaunināšana ir pauzēta" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"Enerģijas taupīšanas režīms ir aktīvs — programmatūras atjaunināšana ir " +"pauzēta" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Spēļu režīms ir aktīvs — programmatūras atjaunināšana ir pauzēta" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "Pā_rstartēt un atjaunināt…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "_Atjaunināt visu" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Programmatūras atjauninājumi ir lejupielādēti" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Atjauninājumi ir gatavi instalēšanai" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integrētā aparātprogrammatūra" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Pieprasa pārstartēšanu" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Lietotņu atjauninājumi" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Ierīces aparātprogrammatūra" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Lejupielādēt" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Pieejami %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s ir pieejams" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Uzziniet par jauno versiju" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Lejupielādēti %s no %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Lejupielādēti %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Liels uzlabojums, ar jaunām iespējām un uzlabojumiem." + +#: src/gs-upgrade-banner.ui:153 +#| msgid "_Upgrade" +msgid "Cancel Upgrade" +msgstr "Atcelt uzlabošanu" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "Pā_rstartēt un uzlabot…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Pirms uzlabošanas atcerieties izveidot datu un datņu dublējumu." + +#: src/gs-utils-error-dialog-simple.ui:4 +#| msgid "Show Details" +msgid "Error Details" +msgstr "Vairāk par kļūdu" + +#: src/gs-utils-error-dialog-simple.ui:34 +#| msgid "Show Details" +msgid "Copy Details" +msgstr "Kopēt informāciju" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Neizdevās dzēst datni “%s” — %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Neizdevās dzēst direktoriju “%s” — %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Pievienot, izņemt vai atjaunināt programmatūru uz šī datora" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Atjauninājumi;Uzlabojumi;Avoti;Krātuves;Repozitoriji;Iestatījumi;Instalēt;" +"Uzstādīt;Atinstalēt;Noņemt;Programmatūra;Lietotne;Veikals;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s ir gatavs" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s ir gatavs ieslēgšanai un ir sagatavots nākamajai sistēmas ielādei." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Ieslēgt" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Sistēmas atjauninājumi" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Vispārīgie sistēmas atjauninājumi, piemēram, drošības un kļūdu labojumi kā " +"arī veiktspējas uzlabojumi." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s atjauninājumus ar jaunām iespējām un labojumiem." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS atjauninājumu pakalpojums nevarēja saņemt un uzlikt atjauninājumu." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Tīmekļa lietotnes" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Tīmekļa lietotņu atbalsts" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Palaist populāras tīmekļa lietotnes pārlūkā" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Uzlabojiet uz jaunākajām iespējām, veiktspējas un stabilitātes uzlabojumiem." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak atbalsts" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak ir ietvars darbvirsmas lietotnēm uz Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:361 +#, c-format +msgid "System folder %s" +msgstr "Sistēmas mape %s" + +#: plugins/flatpak/gs-flatpak.c:362 plugins/flatpak/gs-flatpak.c:363 +#, c-format +msgid "Home subfolder %s" +msgstr "Mājas apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system folders" +msgstr "Saimniekdatora sistēmas mapes" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Host system configuration from /etc" +msgstr "Saimniekdatora sistēmas konfigurācija no /etc" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Desktop folder" +msgstr "Darbvirsmas mape" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Darbvirsmas apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Documents folder" +msgstr "Dokumentu mape" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Documents subfolder %s" +msgstr "Dokumentu apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Music folder" +msgstr "Mūzikas mape" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Music subfolder %s" +msgstr "Mūzikas apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Pictures folder" +msgstr "Bilžu mape" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Bilžu apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Public Share folder" +msgstr "Publiska koplietošanas mape" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Publiska koplietošanas apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Videos folder" +msgstr "Video mape" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Videos subfolder %s" +msgstr "Video apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "Templates folder" +msgstr "Veidņu mape" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "Templates subfolder %s" +msgstr "Veidņu apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User cache folder" +msgstr "Lietotāja kešatmiņas mape" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User cache subfolder %s" +msgstr "Lietotāja kešatmiņas apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User configuration folder" +msgstr "Lietotāja konfigurācijas mape" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Lietotāja konfigurācijas apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User data folder" +msgstr "Lietotāja datu mape" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User data subfolder %s" +msgstr "Lietotāja datu apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:376 +msgid "User runtime folder" +msgstr "Lietotāja izpildlaika mape" + +#: plugins/flatpak/gs-flatpak.c:376 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Lietotāja izpildlaika apakšmape %s" + +#: plugins/flatpak/gs-flatpak.c:434 +#, c-format +msgid "Filesystem access to %s" +msgstr "Datņu sistēmas piekļuve %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1387 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Saņem %s flatpak metadatus…" + +#: plugins/flatpak/gs-flatpak.c:3613 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Neizdevās rafinēt papildinājumu “%s”: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Lietotāja instalācija" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Sistēmas instalācija" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Lietotnes ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Papildinājumam “%s” neizdevās pievienot instalāciju: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Papildinājumam “%s” neizdevās atinstalēt instalāciju: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Attālais “%s” neatļauj instalēt “%s”, iespējams, dēļ tā filtra. Noņemiet " +"filtru un mēģiniet instalēt atkal. Informācija par kļūdu: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Sistēmai pietrūkst baterijas enerģijas, lai veiktu atjaunināšanu" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Sistēmai pietrūkst baterijas enerģijas, lai veiktu atjaunināšanu(%u%%, vajag " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Ierīce ir nesasniedzama vai ārpus bezvadu diapazona" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Ierīces baterijā ir pārāk maz enerģijas" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Ierīces baterijā ir pārāk maz enerģijas (%u%%, vajag %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Ierīce gaida uz atjauninājumu pielietošanu" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Ierīce gaida, kad tiks pievienots maiņstrāvas avots" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Ierīci nevar izmantot, kad ir aizvērts vāks" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s ierīces atjauninājums" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s sistēmas atjauninājumus" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s iegultā kontroliera atjauninājumus" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME atjauninājumus" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s uzņēmumu ME atjauninājumus" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s patērētāju ME atjauninājumus" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s kontroliera atjauninājumus" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt kontroliera atjauninājumus" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU mikrokoda atjauninājumus" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s konfigurācijas atjauninājumus" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s baterijas atjauninājumus" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s kameras atjauninājumus" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM atjauninājumus" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s skārienpaliktņa atjauninājumus" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s peles atjauninājumus" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s tastatūras atjauninājumus" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s krātuves kontroliera atjauninājumus" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s tīkla saskarnes atjauninājumus" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s displeja atjauninājums" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC atjauninājumus" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB uztvērēja atjauninājums" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s dziņa atjauninājums" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s zib-dziņa atjauninājums" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD atjauninājumus" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU atjauninājumus" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s doka atjauninājums" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB doka atjauninājums" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Aparātprogrammatūra" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Nevarēja pielietot programmatūras atjauninājumu: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Aparātprogrammatūras uzlabošanas atbalsts" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Nodrošina atbalstu aparātprogrammatūras uzlabojumiem" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Instalēt neparakstītu programmatūru?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Programmatūra, kura ir rindā uz uzinstalēšanu, nav parakstīta. Nebūs " +"iespējams pārbaudīt šīs programmatūras atjauninājumu izcelsmi un vai kāds " +"nav tos mainījis." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Lejupielādēt neparakstītu programmatūru?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Ir pieejami neparakstīti atjauninājumi. Bez paraksta nevar pārbaudīt šīs " +"programmatūras atjauninājumu izcelsmi un vai kāds nav tos mainījis." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Atjaunināt neparakstītu programmatūru?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Ir pieejami neparakstīti atjauninājumi. Bez paraksta nevar pārbaudīt šīs " +"programmatūras atjauninājumu izcelsmi un vai kāds nav tos mainījis. " +"Programmatūras atjaunināšana tiks izslēgta līdz neparakstītie atjauninājumi " +"tiks izņemti vai atjaunināti." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Neizdevās instalēt atjauninājumus: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pakotnes" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Neizdevās gaidīt uz transakcijas beigām pirms lejupielādes: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Neizdevās lejupielādēt atjauninājumus: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Neizdevās izraisīt atjaunināšanu: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Operētājsistēma (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap veikals" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap atbalsts" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "snap ir universāla Linux pakotne" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:774 +#| msgid "system" +msgid "System" +msgstr "Sistēma" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:778 +#| msgid "System Upgrade Complete" +msgid "System component" +msgstr "Sistēmas komponente" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1029 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Noņem sysupdate uzdevumu, “%s” neizdevās ar statusu %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Labs veids, kā pārvaldīt programmatūru uz sava datora." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Lūdzu, ievadiet skaitli no 1 līdz %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Izvēlieties lietotni:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s tagad ir instalēts" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Lietotne ir izņemta" +#~ msgstr[1] "Lietotnes ir izņemtas" +#~ msgstr[2] "Lietotnes ir izņemtas" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Nevar atrast “%s”" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Lejupielādē programmatūras katalogu" + +#~ msgid "Moderate page" +#~ msgstr "Moderācijas lapa" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Nav atsauksmju, ko pārbaudīt" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Vai šī atsauksme bija noderīga?" + +#~ msgid "Yes" +#~ msgstr "Jā" + +#~ msgid "No" +#~ msgstr "Nē" + +#~ msgid "Meh" +#~ msgstr "Meh" + +#~ msgid "Outdated SDK version" +#~ msgstr "Novecojusi SDK versija" + +#~ msgid "Unable to install updates" +#~ msgstr "Nevar instalēt atjauninājumus" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Nevar atinstalēt — nederīga autentifikācija" + +#~ msgid "Network Settings" +#~ msgstr "Tīkla iestatījumi" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Operētājsistēmai atjauninājumi nav pieejami" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Neizdevās uzinstalēt svarīgu operētājsistēmas atjauninājumu." + +#~ msgid "No Network" +#~ msgstr "Nav tīkla" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Lai pārbaudītu atjauninājumus, nepieciešama piekļuve internetam." + +#~ msgid "Network _Settings" +#~ msgstr "Tīkla ie_statījumi" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Programmatūras atjauninājumi ir lejupielādēti un ir gatavi instalēšanai." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Programmatūras uzlabojumi ir lejupielādēti un ir gatavi instalēšanai." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Lejupielādē informāciju par uzlabojumiem…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Pēdējais laika spiedogs, kad sistēma bija tiešsaistē un saņēma kādus " +#~ "atjauninājumus" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Rādīt izvērstu atkļūdošanas informāciju" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Izvēlētie papildinājumi tiks instalēti kopā ar lietotni." + +#~ msgid "Applications" +#~ msgstr "Lietotnes" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automātiska atjaunināšana ir pauzēta" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an un­metered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been in­correctly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "Pašreizējais tīkls tiek mērīts. Mērītiem savienojumiem ir datu limiti vai " +#~ "ir jāmaksā par patērēto datu apjomu. Lai saglabātu datus, automātiskā " +#~ "atjaunināšana ir pauzēta.\n" +#~ "\n" +#~ "Automātisko atjaunināšanu var turpināt, kad ir pieejams nemērīts tīkls. " +#~ "Līdz tam brīdim atjauninājumus var instalēt pašrocīgi.\n" +#~ "\n" +#~ "Vēl varētu būt tā, ka šis tīkls ir nepareizi identificēts kā mērīts " +#~ "tīkls. Šo iestatījumu var mainīt." + +#~ msgid "Open Network _Settings" +#~ msgstr "Atvērt tīkla ie_statījumus" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Vai tiešām vēlaties atinstalēt %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "%s tiks atinstalēta. Lai to lietotu atkal, tā būs jāuzinstalē." + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Lai izvairītos no papildu samaksas vai tīkla ātruma ierobežošanas, " +#~ "programmatūras atjauninājumi netiks izmantoti uz mobilajiem un mērītajiem " +#~ "savienojumiem." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible." +#~ msgstr "" +#~ "Lejupielādē un instalē programmatūras atjauninājumus fonā, ja tas ir " +#~ "iespējams." + +#~ msgid "_Continue" +#~ msgstr "_Turpināt" + +#~ msgid "Post Review" +#~ msgstr "Publicēt atsauksmi" + +#~ msgid "_Post" +#~ msgstr "_Sūtīt" + +#~ msgid "Rating" +#~ msgstr "Vērtējums" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Sniedziet atsauksmes kopsavilkumu, piemēram: “Lieliska programma, iesaku”." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Atsauksme" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Ko jūs domājat par šo lietotni? Mēģiniet pamatot savu viedokli." + +#~ msgid "No screenshot provided" +#~ msgstr "Ekrānattēls nav nodrošināts" + +#, c-format +#~| msgid "“%s”" +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Nevar lejupielādēt atjauninājumus: bija nepieciešama pieeja internetam, " +#~ "bet tā nebija pieejama" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Nevar lejupielādēt atjauninājumus: nepietiek diska vietas" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Nevar lejupielādēt atjauninājumus: bija vajadzīga autentifikācija" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Nevar lejupielādēt atjauninājumus: autentifikācija bija nederīga" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "Nevar instalēt %s: jums nav atļaujas instalēt programmatūru" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Nevar instalēt %s: baterijā ir pārāk maz enerģijas" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Nevar instalēt atjauninājumus: nepietiek vietas uz diska" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Nevar instalēt atjauninājumus: bija vajadzīga autentifikācija" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Nevar instalēt atjauninājumus: autentifikācija bija nederīga" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "Nevar atjaunināt %s: jums nav atļaujas atjaunināt programmatūru" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Nevar instalēt atjauninājumus: jums nav atļaujas atjaunināt programmatūru" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Nevar instalēt atjauninājumus: ir vajadzīgs maiņstrāvas pieslēgums" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Nevar atjaunināt %s: baterijā ir pārāk maz enerģijas" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Nevar instalēt atjauninājumus: baterijā ir pārāk maz enerģijas" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Nevar uzlabot uz %s: bija nepieciešama pieeja internetam, bet tā nebija " +#~ "pieejama" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Nevar uzlabot uz %s: jums nav atļaujas uzlabot" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Nevar uzlabot %s: baterijā ir pārāk maz enerģijas" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Nevar noņemt %s: bija vajadzīga autentifikācija" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Nevar noņemt %s: autentifikācija bija nederīga" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Nevar noņemt %s: jums nav atļaujas noņemt programmatūru" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Nevar noņemt %s: ir vajadzīgs maiņstrāvas pieslēgums" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Nevar noņemt %s: baterijā ir pārāk maz enerģijas" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Nevar noņemt %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Neizdevās instalēt datni: nav atbalstīta" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Neizdevās instalēt: nav atbalstīts" + +#~ msgid "AC power is required" +#~ msgstr "Ir vajadzīgs maiņstrāvas pieslēgums" + +#~ msgid "Restart Now" +#~ msgstr "Pārstartēt tagad" + +#~ msgid "Primary Menu" +#~ msgstr "Galvenā izvēle" + +#~ msgid "Find Out _More" +#~ msgstr "Uzzināt _vairāk" + +#~| msgid "Updates" +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Atjauninājumi" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Svarīgs programmatūras atjauninājumus ir gatavs instalēšanai." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Svarīgi: rindā gaida kritiski programmatūras atjauninājumi." + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s vairs netiek atbalstīta." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Tas nozīmē, ka tā vairs nesaņem drošības atjauninājumus." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Ieteicams uzlabot OS uz jaunāku versiju." + +#~ msgid "Update All" +#~ msgstr "Atjaunināt visu" + +#~ msgid "Application Updates" +#~ msgstr "Lietotņu atjauninājumi" + +#~ msgid "Downloading featured images…" +#~ msgstr "Lejupielādē piedāvātos attēlus…" + +#~| msgid "GNOME Software" +#~ msgid "GNOME Web" +#~ msgstr "GNOME tīmeklis" + +#~ msgid "Application manager for GNOME" +#~ msgstr "GNOME lietotņu pārvaldnieks" + +#~ msgid "A list of popular applications" +#~ msgstr "Populāru lietotņu saraksts" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "Saraksts ar lietotnēm, ko izmantot. Pārraksta sistēmas noteiktās." + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "URI, kas norāda uz uzlabošanas karoga fonu." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URI var saturēt līdz pat trīs “%u”, ko aizvietos uzlabošanas versijas." + +#, c-format +#~| msgid "%s %f" +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~| msgid "Removing…" +#~ msgid "Loading…" +#~ msgstr "Ielādē…" + +#~ msgid "_Add shortcut" +#~ msgstr "Pievienot s_aīsni" + +#~ msgid "Re_move shortcut" +#~ msgstr "Izņe_mt saīsni" + +#~ msgid "Welcome" +#~ msgstr "Laipni lūdzam" + +#~ msgid "Welcome to Software" +#~ msgstr "Laipni lūdzam “Programmatūrā”" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "“Programmatūra” ļauj instalēt visu jums vajadzīgo programmatūru. " +#~ "Apskatiet ieteikumus, pārlūkojiet kategorijas vai meklējiet lietotnes." + +#~| msgid "Free Software" +#~ msgid "_Browse Software" +#~ msgstr "_Pārlūkot “Programmatūrā”" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Programmatūras katalogs tiek lejupielādēts" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Lejupielādē lietotnes vērtējumus…" + +#~ msgid "Name" +#~ msgstr "Nosaukums" + +#~ msgid "user" +#~ msgstr "lietotāja" + +#~ msgid "Channel" +#~ msgstr "Kanāls" + +#~ msgid "Branch" +#~ msgstr "Zars" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Instalācija" + +#~ msgid "Version" +#~ msgstr "Versija" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Uz šīs sistēmas netika instalēti nekādi atjauninājumi." + +#~ msgid "Checking…" +#~ msgstr "Pārbauda…" + +#~ msgid "OS Updates" +#~ msgstr "OS atjauninājumi" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Iekļauj veiktspējas, stabilitātes un drošības uzlabojumus." + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Lejupielādē aparātprogrammatūras atjauninājumu parakstu…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Lejupielādē aparātprogrammatūras atjauninājumu metadatus…" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Rādīt uzvedni, lai instalētu nebrīvās programmatūras krātuves" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Ieslēgt GNOME čaulas paplašinājumu krātuvi" + +#~ msgid "Select All" +#~ msgstr "Izvēlēties visu" + +#~ msgid "Select None" +#~ msgstr "Neizvēlēties nevienu" + +#~ msgid "Featured %s" +#~ msgstr "Piedāvājums “%s”" + +#~ msgid "Show" +#~ msgstr "Rādīt" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Apakškategoriju filtru izvēlne" + +#~ msgid "Sort" +#~ msgstr "Kārtot" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Apakškategoriju kārtošanas izvēlne" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Multeņu tēli nedrošās situācijās" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Multeņu tēli agresīvā konfliktā" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Grafiska vardarbība, kur iesaistīti multeņu tēli" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Tēli nedrošās situācijās, ko viegli atšķirt no realitātes" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Tēli agresīvā konfliktā, ko viegli atšķirt no realitātes" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Grafiska vardarbība, ko viegli atšķirt no realitātes" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Nedaudz reālistiski tēli nedrošās situācijās" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Ataino reālistiskus tēlus agresīvā konfliktā" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Grafiska vardarbība, kur iesaistīti reālistiski tēli" + +#~ msgid "No bloodshed" +#~ msgstr "Nav asinsizliešanas" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Nereālistiska asinsizliešana" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Reālistiska asinsizliešana" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Ataino asinsizliešanu un ķermeņu daļu kropļošanu" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Izvarošana un cita vardarbīga seksuāla uzvedība" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Norādes uz alkoholiskiem dzērieniem" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Alkoholisku dzērienu lietošana" + +#~ msgid "References to illicit drugs" +#~ msgstr "Norādes uz nelegālām narkotikām" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Nelegālu narkotiku lietošana" + +#~ msgid "References to tobacco products" +#~ msgstr "Norādes uz tabakas produktiem" + +#~ msgid "Use of tobacco products" +#~ msgstr "Tabakas produktu izmantošana" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Īss māksliniecisks kailums" + +#~ msgid "Prolonged nudity" +#~ msgstr "Ilglaicīgs kailums" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provocējošas norādes vai atainojumi" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Seksuālas norādes vai atainojumi" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Grafiska seksuāla uzvedība" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Neliela vai reta rupjību lietošana" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Mērena rupjību lietošana" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Stipra vai bieža rupjību lietošana" + +#~ msgid "Slapstick humor" +#~ msgstr "Farsa humors" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgārs vai atejas humors" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Pieaugušo vai seksuāls humors" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativitāte pret noteiktu cilvēku grupu" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Diskriminācija, kas paredzēta emocionāla kaitējuma izraisīšanai" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Eksplicīta dzimuma, seksualitātes, rases vai reliģijas diskriminācija" + +#~ msgid "Product placement" +#~ msgstr "Produktu izvietošana" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Atklātas norādes uz noteikiem zīmoliem vai preču zīmju produktiem" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Lietotāji tiek iedrošināti iegādāties noteiktas reālās pasaules preces" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "" +#~ "Likt derības uz nejaušiem notikumiem, izmantojot žetonus vai kredītus" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Likt derības ar “spēļu” naudu" + +#~ msgid "Gambling using real money" +#~ msgstr "Likt derības ar īstu naudu" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Lietotāji tiek iedrošināti ziedot īstu naudu" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Iespēja lietotnē tērēt īstu naudu" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Lietotāju savstarpēja mijiedarbība bez tērzēšanas iespējām" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Moderēta tērzēšanas iespēja starp lietotājiem" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Nekontrolēta audio un video tērzēšanas iespēja starp lietotājiem" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Dalās ar sociālo tīklu lietotājvārdiem vai e-pasta adresēm" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Pārbauda, vai ir jaunāka lietotnes versija" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Dalās ar diagnostikas datiem, kas neļauj citiem identificēt lietotāju" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Dalās informāciju, kas ļauj citiem identificēt lietotāju" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Dalās ar citiem lietotājiem ar fizisko atrašanās vietu" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Netiešas norādes uz homoseksualitāti" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Skūpstīšanās starp viena dzimuma cilvēkiem" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Grafiska seksuāla uzvedība starp viena dzimuma cilvēkiem" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Netiešas norādes uz prostitūciju" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Tiešas norādes uz prostitūciju" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Grafisks prostitūcijas akta atainojums" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Netiešas norādes uz laulības pārkāpšanu" + +#~ msgid "Direct references to adultery" +#~ msgstr "Tiešas norādes uz laulības pārkāpšanu" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Grafisks laulības pārkāpšanas akta atainojums" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Daļēji apģērbti cilvēku tēli" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Atklāti seksualizēti cilvēki tēli" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Apraksti vai norādes uz vēsturisku apgānīšanu" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Mūsdienu apgānīšanas atainojumi" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Grafiski mūsdienu apgānīšanas atainojumi" + +#~ msgid "Visible dead human remains" +#~ msgstr "Redzamas cilvēku mirstīgās atliekas" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Cilvēku mirstīgās atliekas skarbos vides apstākļos" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Grafiski cilvēku ķermeņu apgānīšanas atainojumi" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Apraksti vai norādes uz vēsturisku verdzību" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Mūsdienu verdzības atainojumi" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Grafiski mūsdienu verdzības atainojumi" + +#~ msgid "General" +#~ msgstr "Vispārīgi" + +#~ msgid "ALL" +#~ msgstr "Visiem" + +#~ msgid "Teen" +#~ msgstr "Pusaudžiem" + +#~ msgid "Everyone 10+" +#~ msgstr "Ikvienam 10+" + +#~ msgid "Everyone" +#~ msgstr "Ikvienam" + +#~ msgid "Early Childhood" +#~ msgstr "Agrā bērnībā" + +#~ msgid "_Launch" +#~ msgstr "Pa_laist" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Nevarēja noteikt, kurām sistēmas daļām šī lietotne piekļūst. Vecākām " +#~ "lietotnēm tas ir tipiski." + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Nezināma" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Nekad" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "Nezināma" + +#~ msgid "Low" +#~ msgstr "Zems" + +#~ msgid "Medium" +#~ msgstr "Vidējs" + +#~ msgid "High" +#~ msgstr "Augsts" + +#~ msgid "Public domain" +#~ msgstr "Sabiedriskā īpašuma" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://lv.wikipedia.org/wiki/Neaizsarg%C4%81jams_darbs" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Uz lietotāju attiecas šī licence:" +#~ msgstr[1] "Uz lietotāju attiecas šīs licences:" +#~ msgstr[2] "Uz lietotāju attiecas šīs licences:" + +#~ msgid "Localized in your Language" +#~ msgstr "Lokalizēts jūsu valodā" + +#~ msgid "Release Activity" +#~ msgstr "Laidiena aktivitāte" + +#~ msgid "Sandboxed" +#~ msgstr "Smilškastē" + +#~ msgid "Category" +#~ msgstr "Kategorija" + +#~ msgid "Free" +#~ msgstr "Brīva" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Tas nozīmē, ka programmatūru var brīvi izpildīt, kopēt, izplatīt, pētīt " +#~ "un modificēt." + +#~ msgid "Proprietary Software" +#~ msgstr "Īpašnieka programmatūra" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Tas nozīmē, ka programmatūra var piederēt indivīdiem vai uzņēmumam. " +#~ "Nereti ir ierobežojumi tās izmantošanai un parasti tās pirmkodam nevar " +#~ "piekļūt." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Šīs programmatūras licences nosacījumi nav zināmi." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Lietotne tika novērtēta šādā veidā, jo tā satur šādas iespējas:" + +#~ msgid "this website" +#~ msgstr "šī tīmekļa vietne" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Iesim iepirkties" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Izņemta" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Instalēta" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Atjaunināta" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Nezināma" + +#~ msgid "History" +#~ msgstr "Vēsture" + +#~ msgid "Format" +#~ msgstr "Formāts" + +#~ msgid "More…" +#~ msgstr "Vairāk…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Ieteiktās audio un video lietotnes" + +#~ msgid "Recommended Games" +#~ msgstr "Ieteiktās spēles" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Ieteiktās grafikas lietotnes" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Ieteiktās produktivitātes lietotnes" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Daļa no šīs programmatūras ir slēgta un tāpēc ir ierobežojumi tās " +#~ "lietošanai, izplatīšanai un piekļuvei pirmkodam." + +#~ msgid "Find out more…" +#~ msgstr "Uzzināt vairāk…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Redaktora izvēle" + +#~ msgid "Recent Releases" +#~ msgstr "Nesenie laidieni" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Vai tiešām vēlaties izņemt %s?" + +#~ msgid "Remove “%s”?" +#~ msgstr "Izņemt “%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Izslēgt “%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Nav papildu krātuvju" + +#~ msgid "_Remove…" +#~ msgstr "_Izņemt…" + +#~ msgid "_Disable…" +#~ msgstr "I_zslēgt…" + +#~ msgid "Disabling" +#~ msgstr "Izslēdz" + +#~ msgid "Enabled" +#~ msgstr "Ieslēgts" + +#~ msgid "Disabled" +#~ msgstr "Izslēgts" + +#~ msgid "ratings in total" +#~ msgstr "vērtējumi kopumā" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Šai lietotnei vajadzīgs tikt pārstartētai, lai lietotu jaunos spraudņus." + +#~ msgid "_Remove All" +#~ msgstr "Izņemt _visas" + +#~ msgid "Security Updates Pending" +#~ msgstr "Rindā gaida drošības atjauninājumi" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Ieteicams jau tagad instalēt svarīgus atjauninājumus" + +#~ msgid "Restart & Install" +#~ msgstr "Pārstartēt un instalēt" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Svarīgi operētājsistēmas un lietotņu atjauninājumi ir gatavi instalēšanai" + +#~ msgid "View" +#~ msgstr "Skatīt" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l.%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Vakar %l.%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Pirms trīs dienām" + +#~ msgid "Four days ago" +#~ msgstr "Pirms četrām dienām" + +#~ msgid "Five days ago" +#~ msgstr "Pirms piecām dienām" + +#~ msgid "Six days ago" +#~ msgstr "Pirms sešām dienām" + +#~ msgid "Two weeks ago" +#~ msgstr "Pirms divām nedēļām" + +#~ msgid "Looking for new updates…" +#~ msgstr "Meklē jaunus atjauninājumus…" + +#~ msgid "Setting up updates…" +#~ msgstr "Iestata atjauninājumus…" + +#~ msgid "Software is up to date" +#~ msgstr "Programmatūra ir aktuāla" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Atjauninājumi tiks piemēroti, kad dators tiks pārstartēts." + +#~| msgid "Downloading %s %s" +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Gaida uz %s %s lejupielādēšanu" + +#~ msgid "Downloading %s %s" +#~ msgstr "Lejupielādē %s %s" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Visas" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Piedāvātās" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Visa" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Piedāvātā" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Visas" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Piedāvātās" + +#~ msgid "Audio & Video" +#~ msgstr "Audio un video" + +#~ msgid "Developer Tools" +#~ msgstr "Izstrādes rīki" + +#~ msgid "Education & Science" +#~ msgstr "Izglītība un zinātne" + +#~ msgid "Games" +#~ msgstr "Spēles" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafika un fotografēšana" + +#~ msgid "Productivity" +#~ msgstr "Produktivitāte" + +#~ msgid "Communication & News" +#~ msgstr "Komunikācijas un ziņas" + +#~ msgid "Utilities" +#~ msgstr "Utilītprogrammas" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "ODRS ir pakalpojums, kas nodrošina lietotāju atsauksmes par lietotnēm" + +#~ msgid "Show the folder management UI" +#~ msgstr "Rādīt mapju pārvaldības UI" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_Visas" + +#~ msgid "Folder Name" +#~ msgstr "Mapes nosaukums" + +#~ msgid "_Add" +#~ msgstr "_Pievienot" + +#~ msgid "Add to Application Folder" +#~ msgstr "Pievienot lietotņu mapei" + +#~ msgid "About %s" +#~ msgstr "Par %s" + +#~| msgid "Sign in to %s…" +#~ msgid "Sign In / Register…" +#~ msgstr "Ierakstīties / reģistrēties…" + +#~ msgid "Continue" +#~ msgstr "Turpināt" + +#~ msgid "Use" +#~ msgstr "Izmantot" + +#~| msgid "_Add to Folder…" +#~ msgid "Add another…" +#~ msgstr "Pievienot citu…" + +#~ msgid "Top Rated" +#~ msgstr "Augstāk novērtētās" + +#~ msgid "Extension Settings" +#~ msgstr "Paplašinājuma iestatījumi" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Paplašinājumus izmantojiet uz savu atbildību. Ja gadās problēmas ar " +#~ "sistēmu, tos ir ieteicams izslēgt." + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS validācija ir OK!" + +#~ msgid "Failed to load file" +#~ msgstr "Neizdevās ielādēt datni" + +#~ msgid "Unsaved changes" +#~ msgstr "Nesaglabātās izmaiņas" + +#~ msgid "The application list is already loaded." +#~ msgstr "Lietotņu saraksts jau ir ielādēts." + +#~ msgid "Merge documents" +#~ msgstr "Apvienot dokumentus" + +#~ msgid "Throw away changes" +#~ msgstr "Izmest izmaiņas" + +#~ msgid "Open AppStream File" +#~ msgstr "Atvērt AppStream datni" + +#~ msgid "_Save" +#~ msgstr "_Saglabāt" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s karoga dizains ir dzēsts." + +#~ msgid "Banner design deleted." +#~ msgstr "Karoga dizains ir dzēsts." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Lietotņu sarakstam ir nesaglabātas izmaiņas." + +#~ msgid "Use verbose logging" +#~ msgstr "Izmantot detalizētu reģistrēšanu žurnālā" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME programmatūras karoga dizaineris" + +#~ msgid "No Designs" +#~ msgstr "Nav dizainu" + +#~ msgid "Error message here" +#~ msgstr "Kļūdu ziņojums šeit" + +#~ msgid "Category Featured" +#~ msgstr "Kategoriju piedāvātā" + +#~ msgid "Undo" +#~ msgstr "Atsaukt" + +#~ msgid "Banner Designer" +#~ msgstr "Karogu dizaineri" + +#~ msgid "New Banner" +#~ msgstr "Jauns karogs" + +#~ msgid "Import from file" +#~ msgstr "Importēt no datnes" + +#~ msgid "Export to file" +#~ msgstr "Eksportēt uz datni" + +#~ msgid "Spacing" +#~ msgstr "Atstarpe" + +#~ msgid "The amount of space between children" +#~ msgstr "Atstarpes lielums starp bērniem" + +#~ msgid "Click on items to select them" +#~ msgstr "Spiediet uz vienumiem, lai tos izvēlētos" + +#~ msgid "Select" +#~ msgstr "Izvēlēties" + +#~ msgid "_Add to Folder…" +#~ msgstr "Pievienot uz m_api…" + +#~ msgid "_Move to Folder…" +#~ msgstr "Pārvietot uz _mapi…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Izņemt no mapes" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Programmatūras katalogs tiek ielādēts" + +#~ msgid "Featured Applications" +#~ msgstr "Izceltās lietotnes" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s tiks instalēts un jums būs jāmaksā %s." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~| msgid "Signed in into %s as %s" +#~ msgid "Signed in as %s" +#~ msgstr "Ierakstījās kā %s" + +#~| msgid "Sign in to %s…" +#~ msgid "Sign in…" +#~ msgstr "Ierakstīties…" + +#~| msgid "Sign out from %s" +#~ msgid "Sign out" +#~ msgstr "Izrakstīties" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Nevar iegādāties %s: bija vajadzīga autentifikācija" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Nevar iegādāties %s: autentifikācija bija nederīga" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Nevar iegādāties %s: nav iestatīta maksājumu metode" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Nevar iegādāties %s: maksājums tika noraidīts" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Veidot ieteiktās programmatūras karogus “GNOME programmatūrai”" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Programmatūra;Lietotne;Aplikācija;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Čaulas paplašinājumi" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "GNOME čaulas paplašinājumu krātuve" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Lejupielādē čaulas paplašinājumu metadatus…" + +#~| msgctxt "Menu of Add-ons" +#~| msgid "Shell Extensions" +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME čaulas paplašinājums" + +#~| msgid "To continue you need to sign in." +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Lai turpinātu, jums jāizmanto Ubuntu One konts." + +#~| msgid "To continue you need to sign in." +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Lai turpinātu, jums jāizmanto savs Ubuntu One konts." + +#~ msgid "Show profiling information for the service" +#~ msgstr "Rādīt pakalpojuma profilēšanas informāciju" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Lai turpinātu, jums jāierakstās %s." + +#~ msgid "Email address" +#~ msgstr "E-pasta adrese" + +#~ msgid "I have an account already" +#~ msgstr "Man jau ir konts" + +#~ msgid "I want to register for an account now" +#~ msgstr "Vēlos reģistrēt kontu tagad" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Nākamajā reizē ierakstīties automātiski" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Ievadiet savu vienreizējo paroli divu pakāpju autentifikācijai." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Autentificēt" + +#~ msgid "_About" +#~ msgstr "P_ar" + +#~ msgid "_Quit" +#~ msgstr "I_ziet" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Informāciju par %s, kā arī opcijas par to, kā saņemt kodeku, kas var " +#~ "atskaņot šo formātu, var atrast tīmekļa vietnē." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Jūsu %s konts ir aizturēts." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Nav iespējams instalēt programmatūru līdz šis tiks atrisināts." + +#~ msgid "For more information, visit %s." +#~ msgstr "Lai iegūtu vairāk informācijas, apmeklējiet %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Nevar atjaunināt %s no %s" + +#~ msgid "Downloading new updates…" +#~ msgstr "Lejupielādē jaunus atjauninājumus…" + +#~ msgid "Downloading application page…" +#~ msgstr "Lejupielādē lietotnes lapu…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Valve izklaides platforma" + +#~| msgid "Application Updates" +#~ msgid "Applications Updated" +#~ msgstr "Lietotnes ir atjauninātas" + +#~ msgid "Includes: ." +#~ msgstr "Tajā skaitā: ." + +#~ msgid "Restart & _Install" +#~ msgstr "Pārstartēt un _instalēt" + +#~ msgid "Getting runtime source…" +#~ msgstr "Saņem izpildlaika pirmkodu…" + +#~ msgid "Limba Support" +#~ msgstr "Limba atbalsts" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba sniedz izstrādātājiem veidu, kādā viegli izveidot programmatūras " +#~ "komplektus" + diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 0000000..6b9a7bc --- /dev/null +++ b/po/meson.build @@ -0,0 +1,6 @@ +i18n.gettext(meson.project_name(), + preset : 'glib', + args: [ + '--default-domain=' + meson.project_name(), + ] +) diff --git a/po/mjw.po b/po/mjw.po new file mode 100644 index 0000000..f08ea59 --- /dev/null +++ b/po/mjw.po @@ -0,0 +1,4203 @@ +# Karbi translation for gnome-software. +# Copyright (C) 2019 gnome-software's Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-software package. +# Jor Teron , 2019-20. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2020-02-01 12:49+0000\n" +"PO-Revision-Date: 2020-02-22 22:35+0530\n" +"Last-Translator: Jor Teron \n" +"Language-Team: Karbi \n" +"Language: mjw\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: Gedit\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "GNOME Software" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1449 +msgid "The GNOME Project" +msgstr "GNOME Project" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" + +#: data/org.gnome.software.gschema.xml:47 +msgid "A list of popular applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:48 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "" + +#: data/org.gnome.software.gschema.xml:52 +msgid "The last update check timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:56 +msgid "The last upgrade notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:60 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: data/org.gnome.software.gschema.xml:64 +msgid "The last update timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:68 +msgid "The last timestamp when the system was online and got any updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:72 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:73 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:82 +msgid "The server to use for application reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:86 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:87 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:91 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" + +#: data/org.gnome.software.gschema.xml:95 +msgid "A list of official repositories that should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:99 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:103 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:107 +msgid "Allow access to the Software Repositories dialog" +msgstr "" + +#: data/org.gnome.software.gschema.xml:111 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: data/org.gnome.software.gschema.xml:115 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:119 +msgid "Show the prompt to install nonfree software repositories" +msgstr "" + +#: data/org.gnome.software.gschema.xml:123 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:127 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" + +#: data/org.gnome.software.gschema.xml:128 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:132 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:136 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "" + +#: data/org.gnome.software.gschema.xml:140 +msgid "Enable GNOME Shell extensions repository" +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "Angse chongvai" + +#: src/gnome-software.ui:38 +msgid "_Software Repositories" +msgstr "" + +#: src/gnome-software.ui:43 +msgid "_Update Preferences" +msgstr "" + +#: src/gnome-software.ui:52 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: src/gnome-software.ui:68 src/gs-update-dialog.ui:20 +msgid "Go back" +msgstr "Phi chedam" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:100 +msgid "_Explore" +msgstr "" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gnome-software.ui:123 +msgid "_Installed" +msgstr "" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gnome-software.ui:163 +msgid "_Updates" +msgstr "_Updates" + +#: src/gnome-software.ui:232 +msgid "Search" +msgstr "Kiri" + +#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos +#. TRANSLATORS: this refers to where the app came from +#: src/gnome-software.ui:276 src/gs-app-row.c:287 src/gs-details-page.ui:886 +msgid "Source" +msgstr "Source" + +#. button in the info bar +#: src/gnome-software.ui:381 src/gs-repos-dialog.ui:5 src/gs-repos-dialog.ui:18 +msgid "Software Repositories" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:389 +msgid "Examine Disk" +msgstr "" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:397 src/gs-updates-page.c:921 +msgid "Network Settings" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:405 +msgid "Restart Now" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:413 +msgid "More Information" +msgstr "" + +#: src/gnome-software.ui:465 src/gs-metered-data-dialog.ui:5 +#: src/gs-metered-data-dialog.ui:17 +msgid "Automatic Updates Paused" +msgstr "" + +#: src/gnome-software.ui:484 +msgid "Find Out _More" +msgstr "" + +#. TRANSLATORS: this is a locally downloaded package +#: lib/gs-app.c:4504 +msgid "Local file" +msgstr "" + +#: lib/gs-app.c:4556 +msgid "Package" +msgstr "" + +#: src/gs-app-addon-row.c:82 src/gs-app-row.c:412 +msgid "Pending" +msgstr "" + +#: src/gs-app-addon-row.c:88 src/gs-app-row.ui:175 src/gs-app-tile.ui:51 +#: src/gs-feature-tile.c:68 +msgid "Installed" +msgstr "Thaptang" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being installed +#: src/gs-app-addon-row.c:92 src/gs-app-row.c:165 src/gs-details-page.c:329 +#: src/gs-third-party-repo-row.c:99 +msgid "Installing" +msgstr "Thapbom" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being removed +#: src/gs-app-addon-row.c:96 src/gs-app-row.c:171 src/gs-repo-row.c:125 +#: src/gs-third-party-repo-row.c:106 +msgid "Removing" +msgstr "Thanbom" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:109 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: src/gs-application.c:109 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:111 +msgid "Search for applications" +msgstr "" + +#: src/gs-application.c:111 +msgid "SEARCH" +msgstr "KIRI" + +#: src/gs-application.c:113 +msgid "Show application details (using application ID)" +msgstr "" + +#: src/gs-application.c:113 src/gs-application.c:117 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:115 +msgid "Show application details (using package name)" +msgstr "" + +#: src/gs-application.c:115 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:117 +msgid "Install the application (using application ID)" +msgstr "" + +#: src/gs-application.c:119 +msgid "Open a local package file" +msgstr "" + +#: src/gs-application.c:119 +msgid "FILENAME" +msgstr "FILE-MEN" + +#: src/gs-application.c:121 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:124 +msgid "Show verbose debugging information" +msgstr "" + +#: src/gs-application.c:126 +msgid "Installs any pending updates in the background" +msgstr "" + +#: src/gs-application.c:128 +msgid "Show update preferences" +msgstr "" + +#: src/gs-application.c:130 +msgid "Quit the running instance" +msgstr "" + +#: src/gs-application.c:132 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:134 +msgid "Show version number" +msgstr "Version phai paklang" + +#: src/gs-application.c:328 +msgid "translator-credits" +msgstr "Jor Teron " + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#. TRANSLATORS: this is the menu item that opens the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:335 src/gs-shell.c:2104 +#, c-format +msgid "About %s" +msgstr "%s Aputhak" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:339 +msgid "A nice way to manage the software on your system." +msgstr "" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:567 +msgid "Sorry! There are no details for that application." +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:120 +msgid "Visit website" +msgstr "Website kevur" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:125 +msgid "Install…" +msgstr "Install…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:132 src/gs-updates-section.c:476 +msgid "Cancel" +msgstr "Pasang-kok" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:139 src/gs-common.c:287 src/gs-page.c:273 +msgid "Install" +msgstr "Install" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:146 +msgid "Update" +msgstr "Update" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-app-row.c:150 src/gs-app-row.c:159 src/gs-page.c:434 +#: src/gs-repos-dialog.c:325 +msgid "Remove" +msgstr "Kethan" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:277 +msgid "Device cannot be used during update." +msgstr "" + +#: src/gs-app-row.c:470 src/gs-update-dialog.ui:182 +msgid "Requires additional permissions" +msgstr "" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:177 +msgid "Other" +msgstr "Kaprek" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:182 +msgid "All" +msgstr "Kado-kawe" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:186 +msgid "Featured" +msgstr "Kemesen" + +#. TRANSLATORS: This is a heading on the categories page. %s gets +#. replaced by the category name, e.g. 'Graphics & Photography' +#: src/gs-category-page.c:467 +#, c-format +msgid "Featured %s" +msgstr "Kemesen %s" + +#. Translators: A label for a button to sort apps by their rating. +#: src/gs-category-page.ui:26 src/gs-review-dialog.ui:74 +msgid "Rating" +msgstr "Rating" + +#. Translators: A label for a button to sort apps alphabetically. +#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm" +#: src/gs-category-page.ui:32 src/gs-origin-popover-row.c:58 +msgid "Name" +msgstr "Amen" + +#. TRANSLATORS: This is a label for the category filter drop down, which all together can read e.g. 'Show Vector Graphics'. +#: src/gs-category-page.ui:111 +msgid "Show" +msgstr "Paklang" + +#: src/gs-category-page.ui:128 +msgid "Subcategories filter menu" +msgstr "" + +#. TRANSLATORS: This is a label for the category sort drop down, which all together can read e.g. 'Sort Top Rated'. +#: src/gs-category-page.ui:159 +msgid "Sort" +msgstr "" + +#: src/gs-category-page.ui:175 +msgid "Subcategories sorting menu" +msgstr "" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:190 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "" + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:253 +msgid "Choose an application:" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:123 +msgid "OS updates are now installed" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:126 +msgid "Recently installed updates are available to review" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:131 src/gs-common.c:145 +#, c-format +msgid "%s is now installed" +msgstr "" + +#. TRANSLATORS: an application has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:135 src/gs-common.c:149 +msgid "A restart is required for the changes to take effect." +msgstr "" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:139 +msgid "Application is ready to be used." +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:159 src/gs-common.c:638 +msgid "Restart" +msgstr "" + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:163 +msgid "Launch" +msgstr "Ingpu" + +#. TRANSLATORS: window title +#: src/gs-common.c:221 +msgid "Install Third-Party Software?" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:225 src/gs-repos-dialog.c:234 +msgid "Enable Third-Party Software Repository?" +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:241 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:251 +#, c-format +msgid "%s is provided by “%s”." +msgstr "" + +#: src/gs-common.c:260 +msgid "This software repository must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:270 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:276 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:283 +msgid "Don’t Warn Again" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:292 +msgid "Enable and Install" +msgstr "" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:440 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#: src/gs-common.c:459 src/gs-details-page.ui:447 +msgid "Details" +msgstr "" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:624 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:629 +msgid "A restart is required for it to take effect." +msgid_plural "A restart is required for them to take effect." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: button text +#: src/gs-common.c:636 src/gs-update-monitor.c:119 +msgid "Not Now" +msgstr "Non kali" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:59 +msgid "No cartoon violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:61 +msgid "Cartoon characters in unsafe situations" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:63 +msgid "Cartoon characters in aggressive conflict" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:65 +msgid "Graphic violence involving cartoon characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:70 +msgid "No fantasy violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:72 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:74 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:76 +msgid "Graphic violence easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "No realistic violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:83 +msgid "Mildly realistic characters in unsafe situations" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:85 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "Graphic violence involving realistic characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:92 +msgid "No bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:94 +msgid "Unrealistic bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Realistic bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:98 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:103 +msgid "No sexual violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Rape or other violent sexual behavior" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:112 +msgid "No references to alcohol" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "References to alcoholic beverages" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:116 +msgid "Use of alcoholic beverages" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:122 +msgid "No references to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:124 +msgid "References to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Use of illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "No references to tobacco products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:134 +msgid "References to tobacco products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:136 +msgid "Use of tobacco products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:142 +msgid "No nudity of any sort" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Brief artistic nudity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:146 +msgid "Prolonged nudity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:152 +msgid "No references to or depictions of sexual nature" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:154 +msgid "Provocative references or depictions" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Sexual references or depictions" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:158 +msgid "Graphic sexual behavior" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:163 +msgid "No profanity of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Mild or infrequent use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:167 +msgid "Moderate use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:169 +msgid "Strong or frequent use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No inappropriate humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:176 +msgid "Slapstick humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:178 +msgid "Vulgar or bathroom humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Mature or sexual humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:185 +msgid "No discriminatory language of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:187 +msgid "Negativity towards a specific group of people" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Discrimination designed to cause emotional harm" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:191 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:196 +msgid "No advertising of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "Product placement" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:200 +msgid "Explicit references to specific brands or trademarked products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:202 +msgid "Users are encouraged to purchase specific real-world items" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "No gambling of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:209 +msgid "Gambling on random events using tokens or credits" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:211 +msgid "Gambling using “play” money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Gambling using real money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:218 +msgid "No ability to spend money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:220 +msgid "Users are encouraged to donate real money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:223 +msgid "Ability to spend real money in-app" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "No way to chat with other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:230 +msgid "User-to-user interactions without chat functionality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:232 +msgid "Moderated chat functionality between users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "Uncontrolled chat functionality between users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:239 +msgid "No way to talk with other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:241 +msgid "Uncontrolled audio or video chat functionality between users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:248 +msgid "No sharing of social network usernames or email addresses" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:250 +msgid "Sharing social network usernames or email addresses" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:257 +msgid "No sharing of user information with third parties" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:259 +msgid "Checking for the latest application version" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "Sharing diagnostic data that does not let others identify the user" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:263 +msgid "Sharing information that lets others identify the user" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:268 +msgid "No sharing of physical location with other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "Sharing physical location with other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:279 +msgid "No references to homosexuality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:281 +msgid "Indirect references to homosexuality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:283 +msgid "Kissing between people of the same gender" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:285 +msgid "Graphic sexual behavior between people of the same gender" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:290 +msgid "No references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:292 +msgid "Indirect references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:294 +msgid "Direct references to prostitution" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:296 +msgid "Graphic depictions of the act of prostitution" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:301 +msgid "No references to adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:303 +msgid "Indirect references to adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:305 +msgid "Direct references to adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:307 +msgid "Graphic depictions of the act of adultery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:312 +msgid "No sexualized characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:315 +msgid "Scantily clad human characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:317 +msgid "Overtly sexualized human characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:322 +msgid "No references to desecration" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:324 +msgid "Depictions of or references to historical desecration" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:326 +msgid "Depictions of modern-day human desecration" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:328 +msgid "Graphic depictions of modern-day desecration" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:333 +msgid "No visible dead human remains" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:335 +msgid "Visible dead human remains" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:337 +msgid "Dead human remains that are exposed to the elements" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:339 +msgid "Graphic depictions of desecration of human bodies" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:344 +msgid "No references to slavery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:346 +msgid "Depictions of or references to historical slavery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:348 +msgid "Depictions of modern-day slavery" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:350 +msgid "Graphic depictions of modern-day slavery" +msgstr "" + +#. TRANSLATORS: This is the formatting of English and localized name +#. of the rating e.g. "Adults Only (solo adultos)" +#: src/gs-content-rating.c:406 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#: src/gs-content-rating.c:540 +msgid "General" +msgstr "" + +#: src/gs-content-rating.c:549 +msgid "ALL" +msgstr "KADO-KAWE" + +#: src/gs-content-rating.c:553 +msgid "Adults Only" +msgstr "Kethe-atum anchot" + +#: src/gs-content-rating.c:555 +msgid "Mature" +msgstr "Arta-kangtang" + +#: src/gs-content-rating.c:557 +msgid "Teen" +msgstr "Pariso mir-mir" + +#: src/gs-content-rating.c:559 +msgid "Everyone 10+" +msgstr "Arta 10+ aphan" + +#: src/gs-content-rating.c:561 +msgid "Everyone" +msgstr "Kado-kawe aphan" + +#: src/gs-content-rating.c:563 +msgid "Early Childhood" +msgstr "Oso-bihek" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:281 +msgid "An application" +msgstr "Application" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:287 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:289 +msgid "Additional MIME Types Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:293 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:295 +msgid "Additional Fonts Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:299 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:301 +msgid "Additional Multimedia Codecs Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:305 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:307 +msgid "Additional Printer Drivers Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:311 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:313 +msgid "Additional Packages Required" +msgstr "" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:322 +msgid "Find in Software" +msgstr "" + +#: src/gs-details-page.c:324 +msgid "Removing…" +msgstr "Than bomlo…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:343 +msgid "Pending installation…" +msgstr "" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:350 +msgid "Pending update…" +msgstr "" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:710 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo +#: src/gs-details-page.c:855 src/gs-details-page.c:872 +#: src/gs-details-page.ui:167 src/gs-third-party-repo-row.c:83 +#: src/gs-upgrade-banner.c:70 +msgid "_Install" +msgstr "_Install" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo. +#. The ellipsis indicates that further steps are required +#: src/gs-details-page.c:886 src/gs-third-party-repo-row.c:75 +msgid "_Install…" +msgstr "_Install…" + +#. TRANSLATORS: A label for a button to execute the selected application. +#: src/gs-details-page.c:928 +msgid "_Launch" +msgstr "_Launch" + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:952 src/gs-details-page.ui:192 +msgid "_Remove" +msgstr "Kethan" + +#: src/gs-details-page.c:983 src/gs-update-dialog.c:92 +msgid "Network" +msgstr "Network" + +#: src/gs-details-page.c:983 src/gs-update-dialog.c:92 +msgid "Can communicate over the network" +msgstr "" + +#: src/gs-details-page.c:984 src/gs-update-dialog.c:93 +msgid "System Services" +msgstr "" + +#: src/gs-details-page.c:984 src/gs-update-dialog.c:93 +msgid "Can access D-Bus services on the system bus" +msgstr "" + +#: src/gs-details-page.c:985 src/gs-update-dialog.c:94 +msgid "Session Services" +msgstr "" + +#: src/gs-details-page.c:985 src/gs-update-dialog.c:94 +msgid "Can access D-Bus services on the session bus" +msgstr "" + +#: src/gs-details-page.c:986 src/gs-update-dialog.c:95 +msgid "Devices" +msgstr "" + +#: src/gs-details-page.c:986 src/gs-update-dialog.c:95 +msgid "Can access system device files" +msgstr "" + +#: src/gs-details-page.c:987 src/gs-details-page.c:988 +#: src/gs-update-dialog.c:96 src/gs-update-dialog.c:97 +msgid "Home folder" +msgstr "" + +#: src/gs-details-page.c:987 src/gs-details-page.c:989 +#: src/gs-details-page.c:991 src/gs-update-dialog.c:96 +#: src/gs-update-dialog.c:98 src/gs-update-dialog.c:100 +msgid "Can view, edit and create files" +msgstr "" + +#: src/gs-details-page.c:988 src/gs-details-page.c:990 +#: src/gs-details-page.c:992 src/gs-update-dialog.c:97 +#: src/gs-update-dialog.c:99 src/gs-update-dialog.c:101 +msgid "Can view files" +msgstr "" + +#: src/gs-details-page.c:989 src/gs-details-page.c:990 +#: src/gs-update-dialog.c:98 src/gs-update-dialog.c:99 +msgid "File system" +msgstr "File system" + +#: src/gs-details-page.c:991 src/gs-details-page.c:992 +#: src/gs-update-dialog.c:100 src/gs-update-dialog.c:101 +msgid "Downloads folder" +msgstr "" + +#: src/gs-details-page.c:993 src/gs-update-dialog.c:102 +msgid "Settings" +msgstr "" + +#: src/gs-details-page.c:993 src/gs-update-dialog.c:102 +msgid "Can view and change any settings" +msgstr "" + +#: src/gs-details-page.c:994 src/gs-update-dialog.c:103 +msgid "Legacy display system" +msgstr "" + +#: src/gs-details-page.c:994 src/gs-update-dialog.c:103 +msgid "Uses an old, insecure display system" +msgstr "" + +#: src/gs-details-page.c:995 src/gs-update-dialog.c:104 +msgid "Sandbox escape" +msgstr "" + +#: src/gs-details-page.c:995 src/gs-update-dialog.c:104 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" + +#: src/gs-details-page.c:1010 +msgid "This application is fully sandboxed." +msgstr "" + +#: src/gs-details-page.c:1018 +msgid "" +"Unable to determine which parts of the system this application accesses. " +"This is typical for older applications." +msgstr "" + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:1177 +msgctxt "version" +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:1190 +msgctxt "updated" +msgid "Never" +msgstr "" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1243 +msgctxt "origin" +msgid "Unknown" +msgstr "" + +#: src/gs-details-page.c:1296 +msgid "Low" +msgstr "" + +#: src/gs-details-page.c:1298 +msgid "Medium" +msgstr "" + +#: src/gs-details-page.c:1300 +msgid "High" +msgstr "" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.c:1302 src/gs-details-page.ui:1006 +#: src/gs-review-row.c:57 +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1640 +msgid "You need internet access to write a review" +msgstr "" + +#: src/gs-details-page.c:1826 src/gs-details-page.c:1842 +#, c-format +msgid "Unable to find “%s”" +msgstr "" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2420 +msgid "Public domain" +msgstr "" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://de.wikipedia.org/wiki/Gemeinfreiheit +#: src/gs-details-page.c:2423 +msgid "https://en.wikipedia.org/wiki/Public_domain" +msgstr "" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://www.gnu.org/philosophy/free-sw.de +#: src/gs-details-page.c:2430 +msgid "https://www.gnu.org/philosophy/free-sw" +msgstr "" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2440 src/gs-details-page.ui:1250 +msgid "Free Software" +msgstr "Software akejoi" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2497 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-details-page.c:2524 src/gs-details-page.ui:1322 +msgid "More information" +msgstr "" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "" + +#: src/gs-details-page.ui:222 +msgid "Downloading" +msgstr "" + +#: src/gs-details-page.ui:252 src/gs-removal-dialog.ui:32 +#: src/gs-review-dialog.ui:22 src/gs-upgrade-banner.ui:112 +msgid "_Cancel" +msgstr "" + +#: src/gs-details-page.ui:262 +msgid "_Update" +msgstr "" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: src/gs-details-page.ui:278 +msgid "_Add shortcut" +msgstr "" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: src/gs-details-page.ui:292 +msgid "Re_move shortcut" +msgstr "" + +#: src/gs-details-page.ui:366 +msgid "No screenshot provided" +msgstr "" + +#: src/gs-details-page.ui:386 +msgid "Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:387 +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "" + +#: src/gs-details-page.ui:394 +msgid "No Software Repository Included" +msgstr "" + +#: src/gs-details-page.ui:395 +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "" + +#: src/gs-details-page.ui:403 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:410 +msgid "Software Repository Identified" +msgstr "" + +#: src/gs-details-page.ui:411 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" + +#: src/gs-details-page.ui:412 +msgid "Only use software repositories that you trust." +msgstr "" + +#: src/gs-details-page.ui:422 +msgid "_Website" +msgstr "" + +#: src/gs-details-page.ui:431 +msgid "_Donate" +msgstr "" + +#: src/gs-details-page.ui:541 +msgid "Localized in your Language" +msgstr "" + +#: src/gs-details-page.ui:552 +msgid "Documentation" +msgstr "" + +#: src/gs-details-page.ui:563 +msgid "Release Activity" +msgstr "" + +#: src/gs-details-page.ui:574 +msgid "System Integration" +msgstr "" + +#: src/gs-details-page.ui:585 +msgid "Sandboxed" +msgstr "" + +#. TRANSLATORS: the title for Snap channels +#: src/gs-details-page.ui:605 src/gs-origin-popover-row.c:102 +msgid "Channel" +msgstr "" + +#. Translators: The available version of an app +#: src/gs-details-page.ui:641 src/gs-origin-popover-row.ui:151 +msgid "Version" +msgstr "Version" + +#: src/gs-details-page.ui:677 +msgid "Age Rating" +msgstr "" + +#: src/gs-details-page.ui:715 src/gs-details-page.ui:1408 +msgid "Permissions" +msgstr "" + +#: src/gs-details-page.ui:753 +msgid "Updated" +msgstr "" + +#: src/gs-details-page.ui:787 +msgid "Category" +msgstr "Muluk" + +#: src/gs-details-page.ui:824 +msgid "Installed Size" +msgstr "" + +#: src/gs-details-page.ui:855 +msgid "Download Size" +msgstr "" + +#: src/gs-details-page.ui:917 +msgid "Developer" +msgstr "Developer" + +#: src/gs-details-page.ui:963 +msgid "License" +msgstr "License" + +#. This refers to the license of the application +#: src/gs-details-page.ui:982 +msgid "Free" +msgstr "Kejoi" + +#. This refers to the license of the application +#: src/gs-details-page.ui:994 +msgid "Proprietary" +msgstr "Kejoi-kali" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: src/gs-details-page.ui:1044 src/gs-installed-page.c:441 +#: plugins/core/gs-desktop-common.c:314 +msgid "Add-ons" +msgstr "Add-ons" + +#: src/gs-details-page.ui:1056 +msgid "Selected add-ons will be installed with the application." +msgstr "" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-details-page.ui:1094 +msgid "Reviews" +msgstr "Reviews" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1112 +msgid "_Write a Review" +msgstr "Review ketok" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1133 +msgid "_Show More" +msgstr "Ako dolang" + +#: src/gs-details-page.ui:1261 +msgid "" +"This means that the software can be freely run, copied, distributed, studied " +"and modified." +msgstr "" + +#: src/gs-details-page.ui:1301 +msgid "Proprietary Software" +msgstr "" + +#: src/gs-details-page.ui:1312 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "" + +#: src/gs-details-page.ui:1344 +msgid "Unknown Software License" +msgstr "" + +#: src/gs-details-page.ui:1355 +msgid "The license terms of this software are unknown." +msgstr "" + +#: src/gs-details-page.ui:1375 +msgid "The application was rated this way because it features:" +msgstr "" + +#: src/gs-details-page.ui:1389 +msgid "No details were available for this rating." +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:134 +msgid " and " +msgstr " lapen " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:137 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:163 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:213 +msgid "Unable to Find Requested Software" +msgstr "" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:318 +#, c-format +msgid "%s not found" +msgstr "%s longle" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:322 +msgid "on the website" +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:329 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:333 src/gs-extras-page.c:344 src/gs-extras-page.c:355 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:340 src/gs-extras-page.c:362 +#, c-format +msgid "No applications are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:351 +#, c-format +msgid "%s is not available." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:366 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:373 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:377 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:384 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:388 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:395 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:399 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:406 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:410 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:454 +msgid "this website" +msgstr "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:458 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:526 src/gs-extras-page.c:582 src/gs-extras-page.c:621 +msgid "Failed to find any search results" +msgstr "" + +#: src/gs-extras-page.c:809 +#, c-format +msgid "%s file format" +msgstr "" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Codecs page" + +#: src/gs-first-run-dialog.ui:6 src/gs-first-run-dialog.ui:15 +msgid "Welcome" +msgstr "Kur-e-wang" + +#: src/gs-first-run-dialog.ui:43 +msgid "Welcome to Software" +msgstr "" + +#: src/gs-first-run-dialog.ui:53 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" + +#: src/gs-first-run-dialog.ui:62 +msgid "_Let’s Go Shopping" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:69 +msgctxt "app status" +msgid "Removed" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:75 +msgctxt "app status" +msgid "Installed" +msgstr "Thaptang" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:81 +msgctxt "app status" +msgid "Updated" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:87 +msgctxt "app status" +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-history-dialog.c:110 src/gs-review-row.c:64 src/gs-updates-page.c:257 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#: src/gs-history-dialog.ui:5 +msgid "History" +msgstr "" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:437 +msgid "System Applications" +msgstr "" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:61 src/gs-loading-page.c:65 +msgid "Software catalog is being downloaded" +msgstr "" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "" + +#: src/gs-loading-page.ui:47 +msgid "Starting up…" +msgstr "" + +#: src/gs-metered-data-dialog.ui:38 +msgid "" +"The current network is metered. Metered connections have data limits or " +"charges associated with them. To save data, automatic updates have therefore " +"been paused.\n" +"\n" +"Automatic updates will be resumed when an un­metered network becomes " +"available. Until then, it is still possible to manually install updates.\n" +"\n" +"Alternatively, if the current network has been in­correctly identified as " +"being metered, this setting can be changed." +msgstr "" + +#: src/gs-metered-data-dialog.ui:53 +msgid "Open Network _Settings" +msgstr "" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "" + +#: src/gs-moderate-page.ui:85 +msgid "There are no reviews to moderate" +msgstr "" + +#. TRANSLATORS: the installation location for flatpaks +#: src/gs-origin-popover-row.c:83 +msgid "system" +msgstr "system" + +#. TRANSLATORS: the installation location for flatpaks +#: src/gs-origin-popover-row.c:86 +msgid "user" +msgstr "user" + +#. TRANSLATORS: the title for Flatpak branches +#. Translators: The branch, e.g. 'stable' or '3.32' +#: src/gs-origin-popover-row.c:107 src/gs-origin-popover-row.ui:122 +msgid "Branch" +msgstr "" + +#: src/gs-origin-popover-row.ui:35 src/gs-repo-row.ui:75 +msgid "URL" +msgstr "URL" + +#. Translators: The packaging format of the app being installed, e.g. 'RPM' or 'Flatpak' +#: src/gs-origin-popover-row.ui:64 +msgid "Format" +msgstr "Format" + +#. Translators: The installation location for flatpaks, e.g. 'user' or 'system' +#: src/gs-origin-popover-row.ui:93 +msgid "Installation" +msgstr "" + +#. add button +#: src/gs-overview-page.c:312 +msgid "More…" +msgstr "" + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:562 +msgid "Recommended Audio & Video Applications" +msgstr "" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:567 +msgid "Recommended Games" +msgstr "" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:572 +msgid "Recommended Graphics Applications" +msgstr "" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:577 +msgid "Recommended Productivity Applications" +msgstr "" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:925 src/gs-repos-dialog.c:827 +msgid "Access additional software from selected third party sources." +msgstr "" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:929 src/gs-repos-dialog.c:831 +msgid "" +"Some of this software is proprietary and therefore has restrictions on use, " +"sharing, and access to source code." +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-overview-page.c:934 src/gs-repos-dialog.c:836 +msgid "Find out more…" +msgstr "" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:942 src/gs-repos-dialog.c:239 +msgid "Enable" +msgstr "" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "" + +#: src/gs-overview-page.ui:39 +msgid "Enable Third Party Software Repositories?" +msgstr "" + +#: src/gs-overview-page.ui:101 +msgid "Previous" +msgstr "Aphi" + +#: src/gs-overview-page.ui:126 +msgid "Next" +msgstr "Dunthu" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-overview-page.ui:149 +msgid "Editor’s Picks" +msgstr "" + +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-overview-page.ui:175 +msgid "Recent Releases" +msgstr "" + +#: src/gs-overview-page.ui:209 +msgid "Categories" +msgstr "" + +#: src/gs-overview-page.ui:274 +msgid "No Application Data Found" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:264 +#, c-format +msgid "Prepare %s" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:403 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Nangli paka lo %s phan repository pen than pong po?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:407 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the repository to use them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:415 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "Nangli paka lo %s than pong po?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:418 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "%s than pong po, mo ot thu ji pulote thap thu nangpo." + +#. TRANSLATORS: this refers to an app (by name) that is installed +#: src/gs-popular-tile.c:52 src/gs-summary-tile.c:85 +#, c-format +msgid "%s (Installed)" +msgstr "" + +#: src/gs-prefs-dialog.ui:5 src/gs-prefs-dialog.ui:17 +msgid "Update Preferences" +msgstr "" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatic Updates" +msgstr "" + +#: src/gs-prefs-dialog.ui:70 +msgid "Automatic updates are disabled when on mobile or metered connections." +msgstr "" + +#: src/gs-prefs-dialog.ui:88 +msgid "Automatic Update Notifications" +msgstr "" + +#: src/gs-prefs-dialog.ui:102 +msgid "Show notifications when updates have been automatically installed." +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:114 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" + +#: src/gs-removal-dialog.ui:26 +msgid "Incompatible Software" +msgstr "" + +#: src/gs-removal-dialog.ui:39 +msgid "_Continue" +msgstr "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:97 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:104 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repos-dialog.c:112 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repos-dialog.c:118 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repos-dialog.c:125 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:301 +#, c-format +msgid "Remove “%s”?" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:306 +#, c-format +msgid "Disable “%s”?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-repos-dialog.c:310 +msgid "" +"Software that has been installed from this repository will no longer receive " +"updates, including security fixes." +msgstr "" + +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-repos-dialog.c:328 +msgid "Disable" +msgstr "" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:740 +msgid "the operating system" +msgstr "" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:806 src/gs-repos-dialog.c:842 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#. TRANSLATORS: info bar title in the software repositories dialog +#: src/gs-repos-dialog.c:824 +msgid "Third Party Repositories" +msgstr "" + +#: src/gs-repos-dialog.ui:73 +msgid "No Additional Repositories" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for enabling a repo +#: src/gs-repo-row.c:95 +msgid "_Enable" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for removing a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:104 +msgid "_Remove…" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for disabling a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:109 +msgid "_Disable…" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being enabled +#: src/gs-repo-row.c:117 +msgid "Enabling" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being disabled +#: src/gs-repo-row.c:129 +msgid "Disabling" +msgstr "" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is enabled. +#: src/gs-repo-row.c:143 +msgid "Enabled" +msgstr "" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is disabled. +#: src/gs-repo-row.c:149 +msgid "Disabled" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:81 +msgid "Hate it" +msgstr "Lang un-eh" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:85 +msgid "Don’t like it" +msgstr "Ning hang heh" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:89 +msgid "It’s OK" +msgstr "Chok chit" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:93 +msgid "Like it" +msgstr "Ning hang" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:97 +msgid "Love it" +msgstr "Ning dok-it lo" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:119 +msgid "Please take more time writing the review" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:123 +msgid "Please choose a star rating" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:127 +msgid "The summary is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:131 +msgid "The summary is too long" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The description is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The description is too long" +msgstr "" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:10 +msgid "Post Review" +msgstr "Review Kelo" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:34 +msgid "_Post" +msgstr "Kelo" + +#: src/gs-review-dialog.ui:108 +msgid "Summary" +msgstr "" + +#: src/gs-review-dialog.ui:118 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "Lamthe thi hek review ketok, lason “App mepik, Ot vek nangji”." + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:143 +msgctxt "app review" +msgid "Review" +msgstr "Review" + +#: src/gs-review-dialog.ui:153 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "Laso app phan nangli kopi si puji? Ason pi tame." + +#: src/gs-review-dialog.ui:185 +msgid "" +"Find what data is sent in our privacy policy." +msgstr "" + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:412 +msgid "ratings in total" +msgstr "kado-kawe ratings" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:222 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:227 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:241 +msgid "Report Review?" +msgstr "" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:245 +msgid "Report" +msgstr "Report" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:105 +msgid "Was this review useful to you?" +msgstr "" + +#: src/gs-review-row.ui:121 +msgid "Yes" +msgstr "" + +#: src/gs-review-row.ui:130 +msgid "No" +msgstr "" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:139 +msgid "Meh" +msgstr "Meh" + +#: src/gs-review-row.ui:162 +msgid "Report…" +msgstr "" + +#: src/gs-review-row.ui:172 +msgid "Remove…" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:235 +msgid "Screenshot not found" +msgstr "" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:250 +msgid "Failed to load image" +msgstr "" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:381 +msgid "Screenshot size not found" +msgstr "" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:411 +msgid "Could not create cache" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:471 +msgid "Screenshot not valid" +msgstr "" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:486 +msgid "Screenshot not available" +msgstr "" + +#: src/gs-screenshot-image.c:544 +msgid "Screenshot" +msgstr "" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:142 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1090 src/gs-shell.c:1095 src/gs-shell.c:1110 +#: src/gs-shell.c:1114 +#, c-format +msgid "“%s”" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1161 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1167 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1174 src/gs-shell.c:1219 +msgid "Unable to download updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1180 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1189 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1194 +msgid "Unable to download updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1201 +msgid "Unable to download updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1206 +msgid "Unable to download updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1211 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1222 +msgid "Unable to get list of updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1265 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1271 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1284 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1290 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1297 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 +msgid "Unable to install: the application has an invalid format" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1308 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1315 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1329 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1337 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1400 +#, c-format +msgid "Unable to update %s from %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1407 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1414 +#, c-format +msgid "Unable to install updates from %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1418 +#, c-format +msgid "Unable to install updates as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1424 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1434 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1449 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1454 +#, c-format +msgid "Unable to install updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1463 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1468 +#, c-format +msgid "Unable to install updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1483 +#, c-format +msgid "" +"Unable to install updates: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1493 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to install updates: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1508 +#, c-format +msgid "Unable to update %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1514 +#, c-format +msgid "Unable to install updates: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1525 +#, c-format +msgid "Unable to update %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +#, c-format +msgid "Unable to install updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1571 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "" +"Unable to upgrade to %s: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1594 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1602 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1609 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1623 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1630 +#, c-format +msgid "Unable to upgrade to %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1639 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1677 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1683 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1696 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1703 +#, c-format +msgid "Unable to remove %s: The battery level is too low" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1715 +#, c-format +msgid "Unable to remove %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1758 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1765 src/gs-shell.c:1816 src/gs-shell.c:1857 +#: src/gs-shell.c:1905 +msgid "Not enough disk space — free up some space and try again" +msgstr "" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1776 src/gs-shell.c:1827 src/gs-shell.c:1868 +#: src/gs-shell.c:1939 +msgid "Sorry, something went wrong" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1808 +msgid "Failed to install file: not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1812 +msgid "Failed to install file: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1849 +msgid "Failed to install: not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1853 +msgid "Failed to install: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1899 +#, c-format +msgid "Unable to contact %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1914 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1919 +msgid "This application needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1926 +msgid "AC power is required" +msgstr "AC current pacheju nanagji" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1930 +msgid "The battery level is too low" +msgstr "Battery kom pik" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-shell-search-provider.c:256 +#, c-format +msgid "Source: %s" +msgstr "Source: %s" + +#: src/gs-summary-tile.c:90 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Thap bom)" + +#: src/gs-summary-tile.c:95 +#, c-format +msgid "%s (Removing)" +msgstr "" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for removing multiple repos +#: src/gs-third-party-repo-row.c:92 +msgid "_Remove All" +msgstr "" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:187 +msgid "No update description available." +msgstr "" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:291 +#, c-format +msgid "Installed on %s" +msgstr "" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:311 +msgid "Installed Updates" +msgstr "" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:527 +msgid "Additions" +msgstr "" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:531 +msgid "Removals" +msgstr "" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:535 +msgid "Updates" +msgstr "Updates" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:539 +msgid "Downgrades" +msgstr "Downgrades" + +#: src/gs-update-dialog.ui:100 +msgid "No updates have been installed on this system." +msgstr "" + +#: src/gs-update-monitor.c:107 +msgid "Security Updates Pending" +msgstr "" + +#: src/gs-update-monitor.c:108 +msgid "It is recommended that you install important updates now" +msgstr "" + +#: src/gs-update-monitor.c:111 +msgid "Restart & Install" +msgstr "" + +#: src/gs-update-monitor.c:115 +msgid "Software Updates Available" +msgstr "Software Updates Dolo" + +#: src/gs-update-monitor.c:116 +msgid "Important OS and application updates are ready to be installed" +msgstr "" + +#: src/gs-update-monitor.c:120 +msgid "View" +msgstr "Kelang" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:228 +#, c-format +msgid "%u Application Updated — Restart Required" +msgid_plural "%u Applications Updated — Restart Required" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:234 +#, c-format +msgid "%u Application Updated" +msgid_plural "%u Applications Updated" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1 is an application name, e.g. Firefox +#: src/gs-update-monitor.c:245 +#, c-format +msgid "%s has been updated." +msgstr "%s updated tanglo." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:248 +msgid "Please restart the application." +msgstr "" + +#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox +#: src/gs-update-monitor.c:256 +#, c-format +msgid "%s and %s have been updated." +msgstr "" + +#. TRANSLATORS: at least one application needs restarting +#: src/gs-update-monitor.c:262 src/gs-update-monitor.c:281 +#, c-format +msgid "%u application requires a restart." +msgid_plural "%u applications require a restart." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox +#: src/gs-update-monitor.c:274 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "" + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:515 src/gs-updates-page.ui:43 +msgid "Operating System Updates Unavailable" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:517 +msgid "Upgrade to continue receiving security updates." +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:572 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:576 +msgid "Software Upgrade Available" +msgstr "" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:965 +msgid "Software Updates Failed" +msgstr "" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:967 +msgid "An important OS update failed to be installed." +msgstr "" + +#: src/gs-update-monitor.c:968 +msgid "Show Details" +msgstr "" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:991 +msgid "System Upgrade Complete" +msgstr "" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:996 +#, c-format +msgid "Welcome to %s %s!" +msgstr "" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1002 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1006 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1017 +msgctxt "updates" +msgid "Review" +msgstr "Review" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1065 +msgid "Failed To Update" +msgstr "" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1071 +msgid "The system was already up to date." +msgstr "" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1076 +msgid "The update was cancelled." +msgstr "" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1082 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1088 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1094 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1099 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:225 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:228 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:234 +msgid "Yesterday, %R" +msgstr "Yesterday, %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:238 +msgid "Yesterday, %l:%M %p" +msgstr "Tumi, %l:%M %p" + +#: src/gs-updates-page.c:241 +msgid "Two days ago" +msgstr "Ni ni aphrang" + +#: src/gs-updates-page.c:243 +msgid "Three days ago" +msgstr "Ni thom aphrang" + +#: src/gs-updates-page.c:245 +msgid "Four days ago" +msgstr "Ni phli aphrang" + +#: src/gs-updates-page.c:247 +msgid "Five days ago" +msgstr "Ni pho aphrang" + +#: src/gs-updates-page.c:249 +msgid "Six days ago" +msgstr "Ni throk aphrang" + +#: src/gs-updates-page.c:251 +msgid "One week ago" +msgstr "Erui aphrang" + +#: src/gs-updates-page.c:253 +msgid "Two weeks ago" +msgstr "Rui ni aphrang" + +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:269 +msgid "Looking for new updates…" +msgstr "Updates kimi lang bomlo…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:338 +msgid "Setting up updates…" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:339 src/gs-updates-page.c:346 +msgid "(This could take a while)" +msgstr "(ajir ding chet tahi)" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:453 +#, c-format +msgid "Last checked: %s" +msgstr "Kelang arni: %s" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:617 +#, c-format +msgid "%s %s is no longer supported." +msgstr "%s %s support pe tanglo." + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:622 +msgid "Your OS is no longer supported." +msgstr "Nangli OS support pe tanglo." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:627 +msgid "This means that it does not receive security updates." +msgstr "" + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:631 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:889 +msgid "Charges May Apply" +msgstr "Ador do tahai" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:893 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "Mobile broadband pen updates lote tangka dam tahai." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:897 +msgid "Check _Anyway" +msgstr "Chok, langle langnoi" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:913 +msgid "No Network" +msgstr "Network awe" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:917 +msgid "Internet access is required to check for updates." +msgstr "Updates phan internet chepho do nangji." + +#. This label indicates that the update check is in progress +#: src/gs-updates-page.c:1340 +msgid "Checking…" +msgstr "Lang bom…" + +#: src/gs-updates-page.c:1353 +msgid "Check for updates" +msgstr "Updates kelang" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Updates page" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:177 +msgid "Software is up to date" +msgstr "Software update tanglo" + +#: src/gs-updates-page.ui:225 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "Mobile broadband pen updates lote tangka dam tahai" + +#: src/gs-updates-page.ui:237 +msgid "_Check Anyway" +msgstr "Chok, langle langnoi" + +#: src/gs-updates-page.ui:273 +msgid "Go online to check for updates" +msgstr "" + +#: src/gs-updates-page.ui:284 +msgid "_Network Settings" +msgstr "" + +#: src/gs-updates-page.ui:357 +msgid "Updates are automatically managed" +msgstr "" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:278 +msgid "Restart & Update" +msgstr "Restart & Update" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-section.c:284 +msgid "Update All" +msgstr "Update All" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:415 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:419 +msgid "Requires Restart" +msgstr "Restart nangji" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:423 +msgid "Application Updates" +msgstr "" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:427 +msgid "Device Firmware" +msgstr "" + +#: src/gs-updates-section.c:455 src/gs-upgrade-banner.ui:102 +msgid "_Download" +msgstr "_Download" + +#: src/gs-upgrade-banner.c:64 +msgid "_Restart Now" +msgstr "_Restart Nonmat" + +#: src/gs-upgrade-banner.c:66 +msgid "Updates will be applied when the computer is restarted." +msgstr "" + +#: src/gs-upgrade-banner.c:72 +msgid "" +"It is recommended that you back up your data and files before upgrading." +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:87 +#, c-format +msgid "%s %s Now Available" +msgstr "%s %s Non dolo" + +#. TRANSLATORS: This is the text displayed while waiting to +#. * download a distro upgrade. First %s is the distro name and +#. * the 2nd %s is the version, e.g. "Waiting to Download Fedora 23" +#: src/gs-upgrade-banner.c:97 +#, c-format +msgid "Waiting to Download %s %s" +msgstr "Download chonghong %s %s" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:107 +#, c-format +msgid "Downloading %s %s" +msgstr "San bom lo %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:118 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "%s %s Ready to be Installed" + +#: src/gs-upgrade-banner.ui:30 +msgid "A major upgrade, with new features and added polish." +msgstr "" + +#: src/gs-upgrade-banner.ui:50 +msgid "_Learn More" +msgstr "" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" + +#: plugins/core/gs-desktop-common.c:16 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:19 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:22 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Lun/Seh Semar pen Editing" + +#: plugins/core/gs-desktop-common.c:28 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Music Players" + +#: plugins/core/gs-desktop-common.c:37 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:40 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:43 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Debuggers" + +#: plugins/core/gs-desktop-common.c:46 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDEs" + +#: plugins/core/gs-desktop-common.c:55 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:59 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:63 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Artificial Intelligence" + +#: plugins/core/gs-desktop-common.c:66 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomy" + +#: plugins/core/gs-desktop-common.c:70 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chemistry" + +#: plugins/core/gs-desktop-common.c:74 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Languages" + +#: plugins/core/gs-desktop-common.c:78 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Math" + +#: plugins/core/gs-desktop-common.c:85 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotics" + +#: plugins/core/gs-desktop-common.c:94 +msgctxt "Menu of Games" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:97 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:100 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Action" + +#: plugins/core/gs-desktop-common.c:103 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Adventure" + +#: plugins/core/gs-desktop-common.c:106 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: plugins/core/gs-desktop-common.c:109 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocks" + +#: plugins/core/gs-desktop-common.c:112 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Board" + +#: plugins/core/gs-desktop-common.c:115 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Card" + +#: plugins/core/gs-desktop-common.c:118 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulators" + +#: plugins/core/gs-desktop-common.c:121 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Osotum" + +#: plugins/core/gs-desktop-common.c:124 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logic" + +#: plugins/core/gs-desktop-common.c:127 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Role Playing" + +#: plugins/core/gs-desktop-common.c:130 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sports" + +#: plugins/core/gs-desktop-common.c:134 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategy" + +#: plugins/core/gs-desktop-common.c:142 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:145 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:148 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D Graphics" + +#: plugins/core/gs-desktop-common.c:151 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Photography" + +#: plugins/core/gs-desktop-common.c:154 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Scanning" + +#: plugins/core/gs-desktop-common.c:157 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vector Graphics" + +#: plugins/core/gs-desktop-common.c:160 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Viewers" + +#: plugins/core/gs-desktop-common.c:168 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:171 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendar" + +#: plugins/core/gs-desktop-common.c:178 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Database" + +#: plugins/core/gs-desktop-common.c:181 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Tangka" + +#: plugins/core/gs-desktop-common.c:185 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Word Processor" + +#: plugins/core/gs-desktop-common.c:194 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Fonts" + +#: plugins/core/gs-desktop-common.c:197 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecs" + +#: plugins/core/gs-desktop-common.c:200 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Input Sources" + +#: plugins/core/gs-desktop-common.c:203 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Language Packs" + +#: plugins/core/gs-desktop-common.c:206 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localisation" + +#: plugins/core/gs-desktop-common.c:209 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hardware Drivers" + +#: plugins/core/gs-desktop-common.c:217 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chat" + +#: plugins/core/gs-desktop-common.c:230 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Birta" + +#: plugins/core/gs-desktop-common.c:234 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Web Browsers" + +#: plugins/core/gs-desktop-common.c:242 +msgctxt "Menu of Utilities" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:245 +msgctxt "Menu of Utilities" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:248 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Text Editors" + +#: plugins/core/gs-desktop-common.c:256 +msgctxt "Menu of Reference" +msgid "All" +msgstr "Kado-kawe" + +#: plugins/core/gs-desktop-common.c:259 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "Kemesen" + +#: plugins/core/gs-desktop-common.c:262 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Art" + +#: plugins/core/gs-desktop-common.c:265 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biography" + +#: plugins/core/gs-desktop-common.c:268 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Comics" + +#: plugins/core/gs-desktop-common.c:271 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fiction" + +#: plugins/core/gs-desktop-common.c:274 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Health" + +#: plugins/core/gs-desktop-common.c:277 +msgctxt "Menu of Reference" +msgid "History" +msgstr "History" + +#: plugins/core/gs-desktop-common.c:280 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Lifestyle" + +#: plugins/core/gs-desktop-common.c:283 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politics" + +#: plugins/core/gs-desktop-common.c:286 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sports" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: plugins/core/gs-desktop-common.c:296 +msgid "Audio & Video" +msgstr "Lun pen lun-arjan" + +#. TRANSLATORS: this is the menu spec main category for Development +#: plugins/core/gs-desktop-common.c:299 +msgid "Developer Tools" +msgstr "Developer Hormu" + +#. TRANSLATORS: this is the menu spec main category for Education & Science +#: plugins/core/gs-desktop-common.c:302 +msgid "Education & Science" +msgstr "Lo-charli" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:305 +msgid "Games" +msgstr "Pathu-Kejui" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: plugins/core/gs-desktop-common.c:308 +msgid "Graphics & Photography" +msgstr "Graphics & Photography" + +#. TRANSLATORS: this is the menu spec main category for Office +#: plugins/core/gs-desktop-common.c:311 +msgid "Productivity" +msgstr "Productivity" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: plugins/core/gs-desktop-common.c:317 +msgid "Communication & News" +msgstr "Chingki-chethan lapen Birta" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:320 +msgid "Reference" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:323 +msgid "Utilities" +msgstr "Utilities" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:55 +msgid "OS Updates" +msgstr "OS ke Updates" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:60 +msgid "Includes performance, stability and security improvements." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:41 +msgid "Downloading featured images…" +msgstr "" + +#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/ +#: plugins/eos-updater/gs-plugin-eos-updater.c:561 +msgid "Endless OS" +msgstr "Endless OS" + +#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/ +#: plugins/eos-updater/gs-plugin-eos-updater.c:564 +msgid "An Endless OS update with new features and fixes." +msgstr "" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:825 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:139 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: plugins/external-appstream/gs-install-appstream.c:141 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:148 +msgid "You need to specify exactly one filename" +msgstr "" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:155 +msgid "This program can only be used by the root user" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:163 +msgid "Failed to validate content type" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:173 +msgid "Failed to copy" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/external-appstream/gs-plugin-external-appstream.c:235 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:192 +msgid "Downloading upgrade information…" +msgstr "Upgrade information san bomlo…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:283 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak Support" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:861 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:135 +#, c-format +msgid "%s Device" +msgstr "" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:140 +#, c-format +#| msgid "system" +msgid "%s System" +msgstr "%s System" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:145 +#, c-format +msgid "%s Embedded Controller" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:150 +#, c-format +msgid "%s ME" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:155 +#, c-format +msgid "%s Corporate ME" +msgstr "" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:160 +#, c-format +msgid "%s Consumer ME" +msgstr "" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:166 +#, c-format +msgid "%s Controller" +msgstr "" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:172 +#, c-format +msgid "%s Thunderbolt Controller" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:669 +msgid "Downloading firmware update signature…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:710 +msgid "Downloading firmware update metadata…" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Firmware Upgrade Support" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:196 +msgid "Downloading application ratings…" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:228 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap Support" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" + +#~ msgid "_All" +#~ msgstr "K_ado-kawe" + +#~ msgid "Folder Name" +#~ msgstr "Folder men" + +#~ msgid "App ID" +#~ msgstr "App ID" + +#~ msgid "Featured App" +#~ msgstr "Kemesen App" + +#~ msgid "OS Upgrade" +#~ msgstr "OS Upgrade" + +#~ msgid "Featured Applications" +#~ msgstr "Kemesen Applications" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell Extensions" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell Extension" diff --git a/po/ml.po b/po/ml.po new file mode 100644 index 0000000..c43edda --- /dev/null +++ b/po/ml.po @@ -0,0 +1,3961 @@ +# Malayalam translation for gnome-software. +# Copyright (C) 2018 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# HIjas T , 2018. +# Ranjith Siji , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2018-10-18 16:09+0000\n" +"PO-Revision-Date: 2018-10-27 10:46+0530\n" +"Last-Translator: Ranjith Siji \n" +"Language-Team: Malayalam \n" +"Language: ml\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "ഗ്നോം സോഫ്റ്റ്‌വെയര്‍" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "ഗ്നോമിന് വേണ്ടിയുള്ള അപ്ലിക്കേഷൻ മാനേജർ" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "Software allows you to find and install new applications and system extensions and remove existing installed applications." +msgstr "പുതിയ ആപ്ലിക്കേഷനുകളും സിസ്റ്റം വിപുലീകരണങ്ങളും കണ്ടെത്താനും ഇൻസ്റ്റാൾ ചെയ്യാനും നിലവിലുള്ള ഇൻസ്റ്റാൾ ചെയ്ത ആപ്ലിക്കേഷനുകളെ നീക്കംചെയ്യുന്നതിനും സോഫ്റ്റ്‌വെയര്‍ നിങ്ങളെ അനുവദിക്കുന്നു." + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "GNOME Software showcases featured and popular applications with useful descriptions and multiple screenshots per application. Applications can be found either through browsing the list of categories or by searching. It also allows you to update your system using an offline update." +msgstr "ഓരോ ആപ്ലിക്കേഷനുമുള്ള ഉപയോഗപ്രദമായ വിവരണങ്ങളും ഒന്നിലധികം സ്ക്രീൻഷോട്ടുകളും ഉപയോഗിച്ച്ഫീച്ചർ ചെയ്തതും ജനപ്രീതിയാർജ്ജിച്ചതുമായ ആപ്ലിക്കേഷനുകൾ ഗ്നോം സോഫ്റ്റ്‌വെയര്‍ പ്രദർശിപ്പിച്ചിരിക്കുന്നു. ആപ്ലിക്കേഷനുകൾ വിഭാഗങ്ങളുടെ പട്ടിക ബ്രൗസ് ചെയ്യുന്നതിലൂടെയോ തിരയുന്നതിലൂടെയോ കണ്ടെത്താനാകും. ഓഫ്‌ലൈൻ നവീകരണം ഉപയോഗിച്ച് നിങ്ങളുടെ സിസ്റ്റം നവീകരിക്കാനും ഇത് അനുവദിക്കുന്നു." + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "അവലോകന പട്ടിക" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "വിശദാംശ പട്ടിക" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "ഇൻസ്റ്റാൾ ചെയ്തതിൻ്റെ പട്ടിക" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "പുതുക്കലുകളുടെ പട്ടിക" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "പുതുക്കിയതിൻ്റെ വിശദാംശങ്ങൾ" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1199 +msgid "The GNOME Project" +msgstr "ഗ്നോം പദ്ധതി" + +#: data/org.gnome.software.external-appstream.policy.in:11 +msgid "Install an appstream file into a system location" +msgstr "സിസ്റ്റത്തിലെ സ്ഥാനത്തേക്ക് ഒരു ആപ്സ് സ്ട്രീം ഫയൽ ഇൻസ്റ്റാൾ ചെയ്യുക" + +#: data/org.gnome.software.external-appstream.policy.in:12 +msgid "Installing an appstream file into a system location" +msgstr "സിസ്റ്റത്തിലെ സ്ഥാനത്തേക്ക് ഒരു ആപ്സ് സ്ട്രീം ഫയൽ ഇൻസ്റ്റാൾ ചെയ്ത് കൊണ്ടിരിക്കുന്നു" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "അനുയോജ്യമായ പദ്ധതികളുടെ ഒരു ലിസ്റ്റ്" + +#: data/org.gnome.software.gschema.xml:6 +msgid "This is a list of compatible projects we should show such as GNOME, KDE and XFCE." +msgstr "ഗ്നോം, കെഡിഇ, എക്സ്എഫ്‌സിഇ എന്നിവ പോലെയുളള അനുയോജ്യമായ പദ്ധതികളുടെ ഒരു പട്ടികയാണിത്." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "ഗ്നോം സോഫ്റ്റ്‌വെയറിൽ പുതുക്കലുകളും നവീകരണങ്ങളും കൈകാര്യം ചെയ്യണമോ എന്ന്" + +#: data/org.gnome.software.gschema.xml:11 +msgid "If disabled, GNOME Software will hide the updates panel, not perform any automatic updates actions or prompt for upgrades." +msgstr "അപ്രാപ്തമാക്കിയിരിക്കുകയാണെങ്കിൽ, ഗ്നോം സോഫ്റ്റ്‌വെയര്‍ പുതുക്കൽ പട്ടിക മറയ്ക്കുകയും, ഏതെങ്കിലും സ്വമേധയായുള്ള പുതുക്കൽ പ്രവർത്തനങ്ങൾ നടത്തുകയോ നവീകരണത്തിനോ ആവശ്യപ്പെടുകയോ ചെയ്യുന്നില്ല." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "പുതുക്കലുകൾ സ്വമേധയാ ഡൗൺലോഡ് ചെയ്ത് ഇൻസ്റ്റാൾ ചെയ്യുക" + +#: data/org.gnome.software.gschema.xml:16 +msgid "If enabled, GNOME Software automatically downloads software updates in the background, also installing ones that do not require a reboot." +msgstr "പ്രാപ്തമാക്കിയാൽ, പശ്ചാത്തലത്തിൽ ഗ്നോം സോഫ്റ്റ്‌വെയര്‍ സ്വപ്രേരിതമായി സോഫ്റ്റ്‌വെയര്‍ പുതുക്കുവാനുള്ളവ ഡൗൺലോഡ് ചെയ്യുന്നു, പുനഃരാരംഭം ആവശ്യമില്ലാത്തവ ഇൻസ്റ്റാളും ചെയ്യുന്നു." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "പശ്ചാത്തലത്തിൽ പുതുക്കിയ സോഫ്റ്റ്‌വെയറിനെ കുറിച്ച് ഉപയോക്താവിനെ അറിയിക്കുക" + +#: data/org.gnome.software.gschema.xml:21 +msgid "If enabled, GNOME Software notifies the user about updates that happened whilst the user was idle." +msgstr "പ്രവർത്തന സജ്ജമാക്കിയാൽ, ഉപയോക്താവ് നിഷ്ക്രിയമായിരിക്കുമ്പോൾ സംഭവിച്ച പുതുക്കളുകളെ സംബന്ധിച്ച് ഉപയോക്താവിനെ ഗ്നോം സോഫ്റ്റ്‌വെയര്‍ അറിയിക്കുന്നു." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "മീറ്റർ ചെയ്യപ്പെട്ട കണക്ഷനിൽ ആയിരിക്കുമ്പോൾ സ്വമേധയാ പുതുക്കണമോ എന്ന്" + +#: data/org.gnome.software.gschema.xml:26 +msgid "If enabled, GNOME Software automatically refreshes in the background even when using a metered connection (eventually downloading some metadata, checking for updates, etc., which may incur in costs for the user)." +msgstr "പ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, മീറ്റർ ചെയ്ത കണക്ഷൻ ഉപയോഗിക്കുമ്പോൾ പോലും ഗ്നോം സോഫ്റ്റ്‌വെയര്‍ സ്വമേധയാ പശ്ചാത്തലത്തിൽ പുതുക്കപ്പെടുന്നു (ഒടുവിൽ ചില മെറ്റാഡാറ്റ ഡൗൺലോഡ് ചെയ്യുന്നു, പുതുക്കാൻ വേണ്ടി പരിശോധിക്കുന്നു മുതലായവ ചെയ്യപ്പെടുന്നു. ഇത് ഉപയോക്താവിനായി ചെലവുകൾക്ക് ഇടയാക്കിയേക്കാം)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "ഗ്നോം സോഫ്റ്റ്വെയറിന്റെ ആദ്യത്തെ ഉപയോഗമാണോയെന്ന്" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "ആപ്ലിക്കേഷനുകൾക്ക് അടുത്തുള്ള നക്ഷത്ര മൂല്യം കാണിക്കുക" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "വിദൂരമായി സജ്ജമാക്കിയ സ്വതവേ ശാഖ അടിസ്ഥാനമാക്കിയുള്ള ആപ്ലിക്കേഷനുകൾ വേർതിരിക്കുക" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനു മുമ്പ് സൗജന്യമല്ലാത്ത ആപ്ലിക്കേഷൻസ് ഒരു മുന്നറിയിപ്പ് കാണിക്കുന്നു" + +#: data/org.gnome.software.gschema.xml:43 +msgid "When non-free applications are installed a warning dialog can be shown. This controls if that dialog is suppressed." +msgstr "സൗജന്യമല്ലാത്ത ആപ്ലിക്കേഷനുകൾ ഇൻസ്റ്റാൾ ചെയ്യുമ്പോൾ ഒരു മുന്നറിയിപ്പ് ദൃശ്യമാക്കാം. ആ മുന്നറിയിപ്പ് അടിച്ചമർത്തപ്പെട്ടാൽ ഇത് നിയന്ത്രിക്കുന്നു." + +#: data/org.gnome.software.gschema.xml:47 +msgid "A list of popular applications" +msgstr "ജനപ്രിയ അപ്ലിക്കേഷനുകളുടെ ഒരു പട്ടിക" + +#: data/org.gnome.software.gschema.xml:48 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "സിസ്റ്റം നിഷ്കർഷിച്ചിട്ടുള്ളവക്ക് പകരം ഉപയോഗിക്കേണ്ട അപ്ലിക്കേഷനുകളുടെ ഒരു പട്ടിക." + +#: data/org.gnome.software.gschema.xml:52 +msgid "The last update check timestamp" +msgstr "അവസാന പുതുക്കൽ പരിശോധനാ സമയവിവരം" + +#: data/org.gnome.software.gschema.xml:56 +msgid "The last upgrade notification timestamp" +msgstr "അവസാന നവീകരണ പരിശോധനാ സമയവിവരം" + +#: data/org.gnome.software.gschema.xml:60 +msgid "The timestamp of the first security update, cleared after update" +msgstr "ആദ്യത്തെ സുരക്ഷാ പുതുക്കലിന്റെ സമയവിവരം, പുതുക്കലിന് ശേഷം മായ്ച്ചു കളയുന്നതാണ്" + +#: data/org.gnome.software.gschema.xml:64 +msgid "The last update timestamp" +msgstr "അവസാനമായി പുതുക്കിയതിന്റെ സമയവിവരം" + +#: data/org.gnome.software.gschema.xml:68 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "ആപ്പ്സ്‌ട്രീമിൻ്റെ സ്ക്രീൻഷോട്ട് പരിശോധിക്കുന്നതിനുള്ള സമയം ഇപ്പോഴും സാധുവാണ്" + +#: data/org.gnome.software.gschema.xml:69 +msgid "Choosing a larger value will mean less round-trips to the remote server but updates to the screenshots may take longer to show to the user. A value of 0 means to never check the server if the image already exists in the cache." +msgstr "വലിയ മൂല്യം തിരഞ്ഞെടുക്കുന്നത് വിദൂര സെർവറിലേക്ക് കുറച്ച് റൗണ്ട് ട്രിപ്പുകൾ എന്നതാണർത്ഥം, എന്നാൽ സ്ക്രീൻഷോട്ടുകളുടെ പുതുക്കലുകൾ ഉപയോക്താവിന് കാണിക്കാൻ കൂടുതൽ സമയമെടുത്തേക്കാം. ഇമേജ് കാഷിൽ നിലവിലുണ്ടെങ്കിൽ സെർവർ ഒരിക്കലും പരിശോധനയലല്ല എന്നതാണ് പൂജ്യം കൊണ്ട് അർത്ഥമാക്കുന്നത്." + +#: data/org.gnome.software.gschema.xml:78 +msgid "The server to use for application reviews" +msgstr "അപ്ലിക്കേഷൻ അവലോകനങ്ങൾക്കായി ഉപയോഗിക്കുന്ന സെർവർ" + +#: data/org.gnome.software.gschema.xml:82 +msgid "The minimum karma score for reviews" +msgstr "അവലോകനങ്ങൾക്കുള്ള ഏറ്റവും കുറഞ്ഞ കർമ രേഖ" + +#: data/org.gnome.software.gschema.xml:83 +msgid "Reviews with karma less than this number will not be shown." +msgstr "ഈ നമ്പരിനേക്കാൾ കുറഞ്ഞ കർമയുമായുള്ള അവലോകനങ്ങൾ പ്രദർശിപ്പിക്കുകയില്ല." + +#: data/org.gnome.software.gschema.xml:87 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "മൂന്നാം കക്ഷിയായിരിക്കാൻ പാടില്ലാത്ത ഔദ്യോഗിക റിപ്പോസിറ്ററികളുടെ ഒരു പട്ടിക" + +#: data/org.gnome.software.gschema.xml:91 +msgid "A list of official repositories that should be considered free software" +msgstr "സ്വതന്ത്ര സോഫ്റ്റ്‌വെയറായി കണക്കാക്കേണ്ട ഔദ്യോഗിക റിപ്പോസിറ്ററികളുടെ പട്ടിക" + +#: data/org.gnome.software.gschema.xml:95 +msgid "The licence URL to use when an application should be considered free software" +msgstr "ഒരു ആപ്ലിക്കേഷൻ സ്വതന്ത്ര സോഫ്റ്റ്‌വെയറായി പരിഗണിക്കപ്പെടുമ്പോൾ ഉപയോഗിക്കാനുള്ള ലൈസൻസിൻ്റെ ലിങ്ക്" + +#: data/org.gnome.software.gschema.xml:99 +msgid "Install bundled applications for all users on the system where possible" +msgstr "സാധ്യമാകുന്നിടത്തെല്ലാം എല്ലാ ഉപയോക്താക്കൾക്കും ഒരുമിച്ചുള്ള ആപ്ലിക്കേഷനുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക" + +#: data/org.gnome.software.gschema.xml:103 +msgid "Show the folder management UI" +msgstr "ഫോൾഡർ നിർവഹണത്തിൻ്റെ ഉപഭോക്താ-സമ്പർക്കം കാണിക്കുക" + +#: data/org.gnome.software.gschema.xml:107 +msgid "Allow access to the Software Repositories dialog" +msgstr "സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററികളുടെ ഡയലോഗിലേക്ക് പ്രവേശനം അനുവദിക്കുക" + +#: data/org.gnome.software.gschema.xml:111 +msgid "Offer upgrades for pre-releases" +msgstr "ആദ്യ പ്രസിദ്ധീകരണത്തിന് നവീകരണം വാഗ്ദാനം ചെയ്യുക" + +#: data/org.gnome.software.gschema.xml:115 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "ഒരു ആപ്ലിക്കേഷൻ സൗജന്യമല്ലെന്ന് ഉപയോക്താവിനെ അറിയിക്കുന്ന ചില ഉപഭോക്താ-സമ്പർക്ക ഘടകങ്ങൾ കാണിക്കുക" + +#: data/org.gnome.software.gschema.xml:119 +msgid "Show the prompt to install nonfree software repositories" +msgstr "സൗജന്യമല്ലാത്ത സോഫ്റ്റ്‌വെയർ റെപ്പോസിറ്ററികൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനായി പ്രോംപ്റ്റ് പ്രദർശിപ്പിക്കുക" + +#: data/org.gnome.software.gschema.xml:123 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "ഇൻസ്റ്റാൾ ചെയ്ത അപ്ലിക്കേഷനുകളുടെ പട്ടികയിൽ അപ്ലിക്കേഷനുകളുടെ ഇൻസ്റ്റാൾ ചെയ്ത വലിപ്പം കാണിക്കുക" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:127 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://ml.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:128 +msgid "The URI that explains nonfree and proprietary software" +msgstr "സ്വതന്ത്രമല്ലാത്തതും കുത്തക സോഫ്റ്റ്‌വെയറുകളേയും പറ്റി വിശദീകരിക്കുന്ന ലിങ്ക്" + +#: data/org.gnome.software.gschema.xml:132 +msgid "A list of URLs pointing to appstream files that will be downloaded into an app-info folder" +msgstr "ഒരു അപ്ലിക്കേഷൻ-വിവര ഫോൾഡറിൽ ഡൗൺലോഡ് ചെയ്യപ്പെടുന്ന ആപ്ലിക്കേഷൻ സ്ട്രീമിനെ സൂചിപ്പിക്കുന്ന ലിങ്കുകളുടെ ഒരു പട്ടിക" + +#: data/org.gnome.software.gschema.xml:136 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "എല്ലാ ഉപയോക്താക്കൾക്കുമായുള്ള സിസ്റ്റം മുഴുക്കെയുള്ള സ്ഥാനത്തേക്ക് ആപ്പ്സ്ട്രീം ഫയലുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക" + +#: data/org.gnome.software.gschema.xml:140 +msgid "Enable GNOME Shell extensions repository" +msgstr "ഗ്നോം ഷെൽ എക്സ്റ്റൻഷനുകളുടെ റിപോസിറ്ററി പ്രവർത്തന സജ്ജമാക്കുക" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "സോഫ്റ്റ്‌വെയർ ഇൻസ്റ്റാൾ ചെയ്യുക" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "സിസ്റ്റത്തിൽ തിരഞ്ഞെടുത്ത സോഫ്റ്റ്‌വെയർ ഇൻസ്റ്റാൾ ചെയ്യുക" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/gnome-software-local-file.desktop.in:10 +msgid "system-software-install" +msgstr "system-software-install" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "എല്ലാം തിരഞ്ഞെടുക്കുക" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "ഒന്നും തിരഞ്ഞെടുക്കാതിരിക്കുക" + +#: src/gnome-software.ui:38 +msgid "_Software Repositories" +msgstr "സോഫ്റ്റ്‍വെയർ റെപ്പോസിറ്ററികൾ(_S)" + +#: src/gnome-software.ui:43 +msgid "_Update Preferences" +msgstr "മുന്‍ഗണനകള്‍ പുതുക്കുക(_U)" + +#: src/gnome-software.ui:52 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "സോഫ്റ്റ്‌വെയർ" + +#: src/gnome-software.ui:68 src/gs-update-dialog.ui:20 +msgid "Go back" +msgstr "തിരികെ പോവുക" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:100 +msgid "_All" +msgstr "എല്ലാം(_A)" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gnome-software.ui:123 +msgid "_Installed" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യപ്പെട്ടത്(_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gnome-software.ui:163 +msgid "_Updates" +msgstr "പുതുക്കലുകൾ(_U)" + +#: src/gnome-software.ui:232 +msgid "Search" +msgstr "തിരയുക" + +#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos +#. TRANSLATORS: this refers to where the app came from +#: src/gnome-software.ui:276 src/gs-app-row.c:306 src/gs-details-page.ui:781 +msgid "Source" +msgstr "ഉറവിടം" + +#. button in the info bar +#: src/gnome-software.ui:383 src/gs-repos-dialog.ui:5 src/gs-repos-dialog.ui:18 +msgid "Software Repositories" +msgstr "സോഫ്റ്റ്‍വെയർ റെപ്പോസിറ്ററികൾ" + +#. button in the info bar +#: src/gnome-software.ui:391 +msgid "Examine Disk" +msgstr "ഡിസ്ക് പരിശോധിക്കുക" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:399 src/gs-updates-page.c:932 +msgid "Network Settings" +msgstr "ശൃംഖല ക്രമീകരണങ്ങൾ" + +#. button in the info bar +#: src/gnome-software.ui:407 +msgid "Restart Now" +msgstr "പുനരാരംഭിക്കുക" + +#. button in the info bar +#: src/gnome-software.ui:415 +msgid "More Information" +msgstr "കൂടുതൽ വിവരങ്ങൾ" + +#. TRANSLATORS: this is a locally downloaded package +#: lib/gs-app.c:4476 +msgid "Local file" +msgstr "പ്രാദേശിക ഫയൽ" + +#: lib/gs-app.c:4523 +msgid "Package" +msgstr "പാക്കേജ്" + +#: src/gs-app-addon-row.c:96 src/gs-app-row.c:428 +msgid "Pending" +msgstr "തീരുമാനിക്കപ്പെടാത്ത" + +#: src/gs-app-addon-row.c:102 src/gs-app-row.ui:182 src/gs-app-tile.ui:51 +#: src/gs-feature-tile.c:87 +msgid "Installed" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യപ്പെട്ടത്" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being installed +#: src/gs-app-addon-row.c:106 src/gs-app-row.c:185 src/gs-details-page.c:325 +#: src/gs-third-party-repo-row.c:113 +msgid "Installing" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യുന്നു" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being removed +#: src/gs-app-addon-row.c:110 src/gs-app-row.c:191 src/gs-repo-row.c:140 +#: src/gs-third-party-repo-row.c:120 +msgid "Removing" +msgstr "നീക്കം ചെയ്യുന്നു" + +#: src/gs-app-folder-dialog.c:310 +msgid "Folder Name" +msgstr "ഫോൾഡർ നാമം" + +#: src/gs-app-folder-dialog.c:321 src/gs-app-folder-dialog.ui:16 +#: src/gs-details-page.ui:240 src/gs-editor.c:623 src/gs-editor.c:655 +#: src/gs-installed-page.c:612 src/gs-removal-dialog.ui:32 +#: src/gs-review-dialog.ui:22 src/gs-upgrade-banner.ui:112 +msgid "_Cancel" +msgstr "റദ്ദാക്കുക (_C)" + +#: src/gs-app-folder-dialog.c:326 src/gs-app-folder-dialog.ui:24 +msgid "_Add" +msgstr "ചേര്‍ക്കുക(_A)" + +#: src/gs-app-folder-dialog.ui:5 +msgid "Add to Application Folder" +msgstr "അപ്ലിക്കേഷൻ ഫോൾഡറിൽ ചേർക്കുക" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:123 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "ആരംഭിക്കുന്ന മോഡ്: ഒന്നുകിൽ 'പുതുക്കലുകൾ', 'പുതുക്കിയത്', 'ഇൻസ്റ്റാൾ ചെയ്തത്' അല്ലെങ്കിൽ 'അവലോകനം'" + +#: src/gs-application.c:123 +msgid "MODE" +msgstr "സമ്പ്രദായം" + +#: src/gs-application.c:125 +msgid "Search for applications" +msgstr "ആപ്ലിക്കേഷനുകൾക്കായി തിരയുക" + +#: src/gs-application.c:125 +msgid "SEARCH" +msgstr "തിരയുക" + +#: src/gs-application.c:127 +msgid "Show application details (using application ID)" +msgstr "അപ്ലിക്കേഷൻ വിശദാംശങ്ങൾ കാണിക്കുക (അപ്ലിക്കേഷൻ ഐഡി ഉപയോഗിച്ച്)" + +#: src/gs-application.c:127 src/gs-application.c:131 +msgid "ID" +msgstr "ഐഡി" + +#: src/gs-application.c:129 +msgid "Show application details (using package name)" +msgstr "അപ്ലിക്കേഷൻ വിശദാംശങ്ങൾ കാണിക്കുക (പാക്കേജ് പേര് ഉപയോഗിച്ച്)" + +#: src/gs-application.c:129 +msgid "PKGNAME" +msgstr "പാക്കേജ് നാമം" + +#: src/gs-application.c:131 +msgid "Install the application (using application ID)" +msgstr "അപ്ലിക്കേഷൻ ഇൻസ്റ്റാൾ ചെയ്യുക (അപ്ലിക്കേഷൻ ഐഡി ഉപയോഗിച്ച്)" + +#: src/gs-application.c:133 +msgid "Open a local package file" +msgstr "ഒരു ലോക്കൽ പാക്കേജ് ഫയൽ തുറക്കുക" + +#: src/gs-application.c:133 +msgid "FILENAME" +msgstr "ഫയൽ നാമം" + +#: src/gs-application.c:135 +msgid "The kind of interaction expected for this action: either ‘none’, ‘notify’, or ‘full’" +msgstr "ഈ പ്രവർത്തനത്തിന് പ്രതീക്ഷിക്കുന്ന പ്രവർത്തനരീതി: 'ഒന്നുമില്ല', 'അറിയിക്കുക', അല്ലെങ്കിൽ 'പൂർണ്ണമായി'" + +#: src/gs-application.c:138 +msgid "Show verbose debugging information" +msgstr "വെർബോസ് ഡീബഗ്ഗിംഗ് വിവരങ്ങൾ കാണിക്കുക" + +#: src/gs-application.c:140 +msgid "Installs any pending updates in the background" +msgstr "പശ്ചാത്തലത്തിൽ തീരാത്ത ഏതെങ്കിലും അപ്ഡേറ്റുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക" + +#: src/gs-application.c:142 +msgid "Show update preferences" +msgstr "മുന്‍ഗണനാ പുതുക്കുലുകൾ പ്രദർശിപ്പിക്കുക" + +#: src/gs-application.c:144 +msgid "Quit the running instance" +msgstr "പ്രവർത്തിപ്പിക്കുന്ന സംഭവം ഉപേക്ഷിക്കുക" + +#: src/gs-application.c:146 +msgid "Prefer local file sources to AppStream" +msgstr "ആപ്പ്സ്ട്രീമിലേക്ക് പ്രാദേശിക ഫയൽ ഉറവിടങ്ങൾ തിരഞ്ഞെടുക്കുക" + +#: src/gs-application.c:148 +msgid "Show version number" +msgstr "പതിപ്പ് നമ്പർ കാണിക്കുക" + +#: src/gs-application.c:342 +msgid "translator-credits" +msgstr "പരിഭാഷക-അംഗീകാരങ്ങൾ" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#. TRANSLATORS: this is the menu item that opens the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:349 src/gs-shell.c:1947 +msgid "About %s" +msgstr "%s സംബന്ധിച്ച്" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:353 +msgid "A nice way to manage the software on your system." +msgstr "നിങ്ങളുടെ സിസ്റ്റത്തിൽ സോഫ്റ്റ്‌വെയർ കൈകാര്യം ചെയ്യുന്നതിനുള്ള ഒരു നല്ല മാർഗ്ഗം." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:140 +msgid "Visit website" +msgstr "വെബ്സൈറ്റ് സന്ദർശിക്കുക" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:145 +msgid "Install…" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യുക…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:152 src/gs-updates-section.c:441 +msgid "Cancel" +msgstr "റദ്ദാക്കുക" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:159 src/gs-common.c:285 src/gs-page.c:596 +msgid "Install" +msgstr "ഇൻസ്റ്റാൾ" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:166 +msgid "Update" +msgstr "പുതുക്കുക" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-app-row.c:170 src/gs-app-row.c:179 src/gs-page.c:755 +#: src/gs-repos-dialog.c:336 +msgid "Remove" +msgstr "നീക്കം ചെയ്യുക" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:296 +msgid "Device cannot be used during update." +msgstr "അപ്ഡേറ്റ് ചെയ്യുമ്പോൾ ഉപകരണം ഉപയോഗിക്കാൻ കഴിയില്ല." + +#. TRANSLATORS: this is when the service name is not known +#: src/gs-auth-dialog.c:69 +msgid "To continue you need to sign in." +msgstr "തുടരുന്നതിന് നിങ്ങൾ സൈൻ ഇൻ ചെയ്യേണ്ടതുണ്ട്." + +#. TRANSLATORS: the %s is a service name, e.g. "Ubuntu One" +#: src/gs-auth-dialog.c:73 +msgid "To continue you need to sign in to %s." +msgstr "തുടരുന്നതിന് നിങ്ങൾ %s ൽ സൈൻ ഇൻ ചെയ്യേണ്ടതുണ്ട്." + +#: src/gs-auth-dialog.ui:57 +msgid "Email address" +msgstr "ഇമെയിൽ വിലാസം" + +#: src/gs-auth-dialog.ui:81 +msgid "I have an account already" +msgstr "എനിക്ക് ഇതിനകം ഒരു അക്കൗണ്ട് ഉണ്ട്" + +#: src/gs-auth-dialog.ui:98 +msgid "Password" +msgstr "പാസ്‌വേർഡ്" + +#: src/gs-auth-dialog.ui:122 +msgid "I want to register for an account now" +msgstr "എനിക്ക് ഇപ്പോൾ ഒരു അക്കൗണ്ടിനായി രജിസ്റ്റർ ചെയ്യണം" + +#: src/gs-auth-dialog.ui:138 +msgid "I have forgotten my password" +msgstr "ഞാൻ എന്റെ പാസ്‌വേർഡ് മറന്നുപോയി" + +#: src/gs-auth-dialog.ui:163 +msgid "Sign in automatically next time" +msgstr "അടുത്ത തവണ സ്വമേധയാ പ്രവേശിക്കുക" + +#: src/gs-auth-dialog.ui:189 +msgid "Enter your one-time pin for two-factor authentication." +msgstr "രണ്ട്-വസ്തുത പ്രാമാണീകരണത്തിനായി നിങ്ങളുടെ ഒറ്റത്തവണ പിൻ നൽകുക." + +#: src/gs-auth-dialog.ui:201 +msgid "PIN" +msgstr "പിൻ" + +#: src/gs-auth-dialog.ui:284 +msgid "Authenticate" +msgstr "സാധുവാക്കുക" + +#: src/gs-auth-dialog.ui:296 +msgid "Continue" +msgstr "തുടരുക" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:194 +msgid "Other" +msgstr "മറ്റുള്ളവ" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:199 +msgid "All" +msgstr "മുഴുവന്‍" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:203 +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#. TRANSLATORS: This is a heading on the categories page. %s gets +#. replaced by the category name, e.g. 'Graphics & Photography' +#: src/gs-category-page.c:494 +msgid "Featured %s" +msgstr "സവിശേഷമാക്കപെട്ട %s" + +#. Translators: A label for a button to sort apps by their rating. +#: src/gs-category-page.ui:26 +msgid "Top Rated" +msgstr "ഉയർന്ന മൂല്യമുള്ളവ" + +#. Translators: A label for a button to sort apps alphabetically. +#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm" +#: src/gs-category-page.ui:32 src/gs-editor.ui:225 +#: src/gs-origin-popover-row.c:63 +msgid "Name" +msgstr "പേര്" + +#. TRANSLATORS: A label for a button to show the settings for +#. the selected shell extension. +#: src/gs-category-page.ui:118 src/gs-details-page.c:890 +msgid "Extension Settings" +msgstr "വിപുലീകരണ ക്രമീകരണങ്ങൾ" + +#: src/gs-category-page.ui:136 +msgid "Extensions are used at your own risk. If you have any system problems, it is recommended to disable them." +msgstr "നിങ്ങളുടെ സ്വന്തം ഉത്തരവാദിത്തത്തിൽ വിപുലീകരണങ്ങൾ ഉപയോഗിക്കും. നിങ്ങൾക്ക് സിസ്റ്റം സംബന്ധിയായ പ്രശ്നങ്ങൾ ഉണ്ടെങ്കിൽ, അവ പ്രവർത്തന രഹിതമാക്കുന്നത് ഉത്തമം." + +#. TRANSLATORS: This is a label for the category filter drop down, which all together can read e.g. 'Show Vector Graphics'. +#: src/gs-category-page.ui:156 +msgid "Show" +msgstr "പ്രദര്‍ശിപ്പിക്കുക" + +#: src/gs-category-page.ui:173 +msgid "Subcategories filter menu" +msgstr "ഉപവിഭാഗങ്ങളുടെ അരിച്ചെടുത്ത പട്ടിക" + +#. TRANSLATORS: This is a label for the category sort drop down, which all together can read e.g. 'Sort Top Rated'. +#: src/gs-category-page.ui:204 +msgid "Sort" +msgstr "തരം" + +#: src/gs-category-page.ui:220 +msgid "Subcategories sorting menu" +msgstr "ഉപവിഭാഗങ്ങൾ അടുക്കിവയ്ക്കുന്ന പട്ടിക" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:204 +msgid "Please enter a number from 1 to %u: " +msgstr "ദയവായി 1 മുതൽ %u വരെയുള്ള ഒരു നമ്പർ നൽകുക: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:267 +msgid "Choose an application:" +msgstr "ഒരു അപ്ലിക്കേഷൻ തിരഞ്ഞെടുക്കുക:" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:137 +msgid "OS updates are now installed" +msgstr "OS പുതുക്കലുകൾ ഇപ്പോൾ ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:140 +msgid "Recently installed updates are available to review" +msgstr "സമീപകാലത്ത് ഇൻസ്റ്റാൾ ചെയ്ത പുതുക്കലുകൾ അവലോകനം ചെയ്യാൻ ലഭ്യമാണ്" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:145 src/gs-common.c:153 +msgid "%s is now installed" +msgstr "%s ഇൻസ്റ്റാൾ ചെയ്യപ്പെട്ടു" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:148 +msgid "Application is ready to be used." +msgstr "ആപ്ലിക്കേഷൻ ഉപയോഗിക്കാൻ തയാറാണ്." + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:161 +msgid "Launch" +msgstr "തുടങ്ങുക" + +#. TRANSLATORS: window title +#: src/gs-common.c:219 +msgid "Install Third-Party Software?" +msgstr "മൂന്നാം-കക്ഷി സോഫ്റ്റ്‌വെയർ ഇൻസ്റ്റാൾ ചെയ്യണോ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:223 src/gs-repos-dialog.c:247 +msgid "Enable Third-Party Software Repository?" +msgstr "മൂന്നാം-കക്ഷി സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററി പ്രാപ്തമാക്കണോ?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:239 +msgid "%s is not free and open source software, and is provided by “%s”." +msgstr "%s എന്നത് സ്വതന്ത്രവും സ്വതന്ത്രവുമായ സോഫ്റ്റ്വെയർ അല്ല, കൂടാതെ അത് \"%s\" ആണ് നൽകുന്നത്." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:249 +msgid "%s is provided by “%s”." +msgstr "%s നൽകുന്നത് \"%s\" ആണ്." + +#: src/gs-common.c:258 +msgid "This software repository must be enabled to continue installation." +msgstr "ഇൻസ്റ്റാളേഷൻ തുടരുന്നതിന് ഈ സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററി പ്രാപ്തമാക്കണം." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:268 +msgid "It may be illegal to install or use %s in some countries." +msgstr "ചില രാജ്യങ്ങളിൽ %s ഇൻസ്റ്റാൾ ചെയ്യുകയോ ഉപയോഗിക്കുകയോ ചെയ്യുന്നത് നിയമവിരുദ്ധമാണ്." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:274 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "ചില രാജ്യങ്ങളിൽ ഈ കോഡെക് ഇൻസ്റ്റാൾ ചെയ്യുകയോ ഉപയോഗിക്കുകയോ ചെയ്യുന്നത് നിയമവിരുദ്ധമാണ്." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:281 +msgid "Don’t Warn Again" +msgstr "വീണ്ടും മുന്നറിയിപ്പ് നൽകരുത്" + +#. TRANSLATORS: button text +#: src/gs-common.c:290 +msgid "Enable and Install" +msgstr "പ്രാപ്തമാക്കി ഇൻസ്റ്റാൾ ചെയ്യുക" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:435 +msgid "Detailed errors from the package manager follow:" +msgstr "പാക്കേജ് കാര്യസ്ഥനിൽ നിന്നുള്ള വിശദമായ പിശകുകൾ:" + +#: src/gs-common.c:454 src/gs-details-page.ui:417 +msgid "Details" +msgstr "വിശദാംശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:75 +msgid "No cartoon violence" +msgstr "കാർട്ടൂൺ അക്രമം പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:78 +msgid "Cartoon characters in unsafe situations" +msgstr "സുരക്ഷിതമല്ലാത്ത സാഹചര്യങ്ങളിലെ കാർട്ടൂൺ പ്രതീകങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "Cartoon characters in aggressive conflict" +msgstr "ആക്രമണ സംഘർഷത്താലുള്ള കാർട്ടൂൺ പ്രതീകങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:84 +msgid "Graphic violence involving cartoon characters" +msgstr "കാർട്ടൂൺ പ്രതീകങ്ങൾ ഉൾപ്പെടുന്ന വിവരണരൂപേണയുള്ള അക്രമം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "No fantasy violence" +msgstr "കാൽപനിക അക്രമം പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:90 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "സുരക്ഷിതമല്ലാത്ത സാഹചര്യങ്ങളിൽ പ്രതീകങ്ങൾ യാഥാർഥ്യത്തിൽ നിന്ന് എളുപ്പത്തിൽ വേർതിരിച്ചറിയാൻ കഴിയുന്നതാണ്" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:93 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "ആക്രമണകാരികളായ പ്രതീകങ്ങൾ യാഥാർഥ്യത്തിൽ നിന്ന് എളുപ്പത്തിൽ വേർതിരിച്ചറിയാൻ കഴിയുന്നതാണ്" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Graphic violence easily distinguishable from reality" +msgstr "യാഥാർത്ഥ്യത്തെ തിരിച്ചറിയാൻ വിവരണരൂപേണയുള്ള അതിക്രമം എളുപ്പത്തിൽ വേർതിരിച്ചറിയാൻ കഴിയും" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:99 +msgid "No realistic violence" +msgstr "യാഥാർഥ്യമായ അക്രമം പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:102 +msgid "Mildly realistic characters in unsafe situations" +msgstr "സുരക്ഷിതമല്ലാത്ത സാഹചര്യങ്ങളിലെ യാഥാസ്ഥിതിക സൗമ്യ പ്രതീകങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "ആക്രമണാത്മക സംഘർഷത്തിൽ യാഥാസ്ഥിതിക കഥാപാത്രങ്ങളുടെ ചിത്രീകരണം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:108 +msgid "Graphic violence involving realistic characters" +msgstr "യഥാർത്ഥ പ്രതീകങ്ങൾ ഉൾപ്പെടുന്ന വിവരണരൂപേണയുള്ള അക്രമം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:111 +msgid "No bloodshed" +msgstr "രക്തച്ചൊരിച്ചില്‍ പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "Unrealistic bloodshed" +msgstr "അയാഥാര്‍ത്ഥ്യമായ രക്തച്ചൊരിച്ചില്‍" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:117 +msgid "Realistic bloodshed" +msgstr "യഥാർത്ഥ രക്തച്ചൊരിച്ചിൽ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:120 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "രക്തച്ചൊരിച്ചിലെ പ്രതിബന്ധം, ശരീര ഭാഗങ്ങളുടെ അവയവഛേദം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:123 +msgid "No sexual violence" +msgstr "ലൈംഗിക അതിക്രമം പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Rape or other violent sexual behavior" +msgstr "ബലാത്സംഗം അല്ലെങ്കിൽ മറ്റ് അക്രമാസക്തമായ ലൈംഗിക പെരുമാറ്റം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:129 +msgid "No references to alcohol" +msgstr "മദ്യത്തെ പറ്റി പരാമർശിച്ചിട്ടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "References to alcoholic beverages" +msgstr "ലഹരിപാനീയങ്ങൾക്കുള്ള പരാമർശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:135 +msgid "Use of alcoholic beverages" +msgstr "ലഹരിപാനീയങ്ങളുടെ ഉപയോഗം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:138 +msgid "No references to illicit drugs" +msgstr "നിയമവിരുദ്ധമായ ലഹരിമരുന്നുകളെ പറ്റിയുള്ള പരാമർശങ്ങളൊന്നുമില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:141 +msgid "References to illicit drugs" +msgstr "നിയമവിരുദ്ധമായ ലഹരിമരുന്നുകളെ പറ്റിയുള്ള പരാമർശം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Use of illicit drugs" +msgstr "അനധികൃത മരുന്നുകളുടെ ഉപയോഗം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:147 +msgid "References to tobacco products" +msgstr "പുകയില ഉത്പന്നങ്ങൾക്കുള്ള പരാമർശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:150 +msgid "Use of tobacco products" +msgstr "പുകയില ഉൽപന്നങ്ങളുടെ ഉപയോഗം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:153 +msgid "No nudity of any sort" +msgstr "ഏത് തരത്തിലുള്ള നഗ്നതയും പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Brief artistic nudity" +msgstr "ലഘു കലാപരമായ നഗ്നത" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:159 +msgid "Prolonged nudity" +msgstr "നീണ്ട നഗ്നത" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:162 +msgid "No references or depictions of sexual nature" +msgstr "ലൈംഗിക സ്വഭാവം സംബന്ധിച്ച പരാമർശങ്ങളോ ചിത്രങ്ങളോ ഇല്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Provocative references or depictions" +msgstr "പ്രകോപനപരമായ പരാമർശങ്ങൾ അല്ലെങ്കിൽ ചിത്രീകരണങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:168 +msgid "Sexual references or depictions" +msgstr "ലൈംഗിക പരാമർശങ്ങൾ അല്ലെങ്കിൽ ചിത്രീകരണങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:171 +msgid "Graphic sexual behavior" +msgstr "വിവരണരൂപേണയുള്ള ലൈംഗിക പെരുമാറ്റം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No profanity of any kind" +msgstr "ഒരു തരത്തിലുള്ള അശ്ലീലവും ഇല്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:177 +msgid "Mild or infrequent use of profanity" +msgstr "ചെറുതോ അപൂര്‍വ്വമായതോ അശ്ലീലങ്ങളുടെ ഉപയോഗം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Moderate use of profanity" +msgstr "അശ്ലീലത്തിൻറെ മിതമായ ഉപയോഗം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:183 +msgid "Strong or frequent use of profanity" +msgstr "വൃത്തികെട്ട അല്ലെങ്കിൽ പതിവായി ഉപയോഗിക്കുന്ന അശ്ലീലം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:186 +msgid "No inappropriate humor" +msgstr "അനുചിതമായ ഹാസ്യം പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Slapstick humor" +msgstr "തരം താണ ഹാസ്യം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:192 +msgid "Vulgar or bathroom humor" +msgstr "അസഭ്യമായ അല്ലെങ്കിൽ ബാത്ത്റൂം ഹാസ്യം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:195 +msgid "Mature or sexual humor" +msgstr "പക്വമായ അല്ലെങ്കിൽ ലൈംഗിക ഹാസ്യം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "No discriminatory language of any kind" +msgstr "ഏതെങ്കിലും തരത്തിലുള്ള വിവേചന ഭാഷയില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:201 +msgid "Negativity towards a specific group of people" +msgstr "ഒരു പ്രത്യേക കൂട്ടത്തോടുള്ള അവഗണന" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:204 +msgid "Discrimination designed to cause emotional harm" +msgstr "വൈകാരികമായ ദോഷം ഉണ്ടാക്കുന്നതിന് രൂപകൽപ്പന ചെയ്തിരിക്കുന്ന വിവേചനങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "ലിംഗഭേദം, ലൈംഗികത, വർഗം അല്ലെങ്കിൽ മതം എന്നിവയെ അടിസ്ഥാനമാക്കിയുള്ള വിവേചനം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:210 +msgid "No advertising of any kind" +msgstr "ഒരു തരത്തിലുള്ള പരസ്യവും പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Product placement" +msgstr "ഉൽപന്നനിയമനം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:216 +msgid "Explicit references to specific brands or trademarked products" +msgstr "നിർദ്ദിഷ്ട ബ്രാൻഡുകൾ അല്ലെങ്കിൽ വ്യാപാരമുദ്ര ഉല്പന്നങ്ങൾക്ക് വ്യക്തമായ പരാമർശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:219 +msgid "Users are encouraged to purchase specific real-world items" +msgstr "ഉപയോക്താക്കൾക്ക് നിർദ്ദിഷ്ട യഥാർത്ഥ ഇനങ്ങൾ വാങ്ങാൻ പ്രോത്സാഹിപ്പിക്കുന്നു" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:222 +msgid "No gambling of any kind" +msgstr "ഒരു തരത്തിലുള്ള ചൂതാട്ടവുമില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:225 +msgid "Gambling on random events using tokens or credits" +msgstr "അടയാളങ്ങൾ അല്ലെങ്കിൽ വായ്‌പ്പ ഉപയോഗിച്ചുള്ള ആകസ്‌മികമായ ഇനങ്ങളിലെ ചൂതാട്ടം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "Gambling using “play” money" +msgstr "യഥാർത്ഥമല്ലാത്ത പണം ഉപയോഗിച്ച് ചൂതാട്ടം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:231 +msgid "Gambling using real money" +msgstr "യഥാർത്ഥ പണം ഉപയോഗിച്ച് ചൂതാട്ടം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "No ability to spend money" +msgstr "പണം ചെലവഴിക്കാൻ ശേഷിയില്ല" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:237 +msgid "Users are encouraged to donate real money" +msgstr "യഥാർത്ഥ പണം സംഭാവന ചെയ്യാൻ ഉപയോക്താക്കളെ പ്രോത്സാഹിപ്പിക്കുന്നു" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:240 +msgid "Ability to spend real money in-game" +msgstr "കളിയിൽ യഥാർത്ഥ പണം ചെലവാക്കാനുള്ള കഴിവ്" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:243 +msgid "No way to chat with other users" +msgstr "മറ്റ് ഉപയോക്താക്കളുമായി ചാറ്റ് ചെയ്യുന്നതിനുള്ള മാർഗമില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:246 +msgid "User-to-user game interactions without chat functionality" +msgstr "സംഭാഷണ പ്രവർത്തനം കൂടാതെ ഉപയോക്താവിൽ നിന്നും ഉപയോക്തവിലേക്കുള്ള മത്സര ഇടപെടലുകൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:249 +msgid "Moderated chat functionality between users" +msgstr "ഉപയോക്താക്കൾക്കിടയിലുള്ള മിതമായ സംഭാഷണ പ്രവർത്തനം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:252 +msgid "Uncontrolled chat functionality between users" +msgstr "ഉപയോക്താക്കൾക്കിടയിൽ നിയന്ത്രിക്കാത്ത സംഭാഷണ പ്രവർത്തനം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:255 +msgid "No way to talk with other users" +msgstr "മറ്റ് ഉപയോക്താക്കളുമായി സംസാരിക്കാൻ യാതൊരു വഴിയുമില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:258 +msgid "Uncontrolled audio or video chat functionality between users" +msgstr "ഉപയോക്താക്കളെ തമ്മിൽ നിയന്ത്രിക്കാത്ത ഓഡിയോ അല്ലെങ്കിൽ വീഡിയോ ചാറ്റ് പ്രവർത്തനം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "No sharing of social network usernames or email addresses" +msgstr "സാമൂഹിക ശൃംഖലകളിലെ ഉപയോക്തൃനാമങ്ങൾ അല്ലെങ്കിൽ ഇമെയിൽ വിലാസങ്ങൾ പങ്കിടരുത്" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:264 +msgid "Sharing social network usernames or email addresses" +msgstr "സാമൂഹിക ശൃംഖലകളിലെ ഉപയോക്തൃനാമങ്ങൾ അല്ലെങ്കിൽ ഇമെയിൽ വിലാസങ്ങൾ പങ്കിടുന്നു" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:267 +msgid "No sharing of user information with 3rd parties" +msgstr "മൂന്നാം കക്ഷികളുമായി ഉപയോക്തൃ വിവരങ്ങളുടെ പങ്കാളിത്തം ഒന്നുമില്ല" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "Checking for the latest application version" +msgstr "ഏറ്റവും പുതിയ അപ്ലിക്കേഷൻ പതിപ്പിനായി പരിശോധിക്കുന്നു" + +#. v1.1 +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:273 +msgid "Sharing diagnostic data that does not let others identify the user" +msgstr "മറ്റുള്ളവർക്ക് തിരിച്ചറിയാത്ത രീതിയിൽ ഡയഗണോസ്റ്റിക് വിവരം പങ്കുവെയ്ക്കുന്നു" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:276 +msgid "Sharing information that lets others identify the user" +msgstr "മറ്റുള്ളവരെ തിരിച്ചറിയാൻ അനുവദിക്കുന്ന വിവരങ്ങൾ പങ്കുവെക്കൽ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:279 +msgid "No sharing of physical location to other users" +msgstr "മറ്റ് ഉപയോക്താക്കൾക്ക് ഭൗതിക സ്ഥാനം പങ്കിടരുത്" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:282 +msgid "Sharing physical location to other users" +msgstr "മറ്റ് ഉപയോക്താക്കൾക്ക് ഭൗതിക സ്ഥാനം പങ്കിടൽ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:287 +msgid "No references to homosexuality" +msgstr "സ്വവർഗാനുരാഗത്തെക്കുറിച്ച് പരാമർശങ്ങളില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:290 +msgid "Indirect references to homosexuality" +msgstr "സ്വവർഗ്ഗരതിയെക്കുറിച്ചുള്ള പരോക്ഷ പരാമർശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:293 +msgid "Kissing between people of the same gender" +msgstr "ഒരേ ലിംഗത്തിലുള്ള ആളുകൾ തമ്മിലുള്ള ചുംബനം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:296 +msgid "Graphic sexual behavior between people of the same gender" +msgstr "ഒരേ ലിംഗത്തിലുള്ള ആളുകൾ തമ്മിലുള്ള വിവരണരൂപേനയുള്ള ലൈംഗിക പെരുമാറ്റം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:299 +msgid "No references to prostitution" +msgstr "വേശ്യാവൃത്തിയെ പറ്റി പരാമർശങ്ങളൊന്നുമില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:302 +msgid "Indirect references to prostitution" +msgstr "വേശ്യാവൃത്തിക്ക് പരോക്ഷ സൂചനകൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:305 +msgid "Direct references of prostitution" +msgstr "വ്യഭിചാരം സംബന്ധിച്ച നേരിട്ടുള്ള പരാമർശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:308 +msgid "Graphic depictions of the act of prostitution" +msgstr "വേശ്യാവൃത്തിയെ പറ്റിയുള്ള വിവരണരൂപേനയുള്ള ചിത്രീകരണം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:311 +msgid "No references to adultery" +msgstr "വ്യഭിചാരത്തെ പറ്റി പരാമർശങ്ങളില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:314 +msgid "Indirect references to adultery" +msgstr "വ്യഭിചാരത്തെക്കുറിച്ച് പരോക്ഷ സൂചനകൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:317 +msgid "Direct references of adultery" +msgstr "വ്യഭിചാരത്തെക്കുറിച്ച് നേരിട്ടുള്ള പരാമർശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:320 +msgid "Graphic depictions of the act of adultery" +msgstr "വ്യഭിചാരത്തെ പറ്റിയുള്ള വിവരണരൂപേനയുള്ള ചിത്രീകരണം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:323 +msgid "No sexualized characters" +msgstr "ലൈംഗികതയുള്ള പ്രതീകങ്ങൾ പാടില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:326 +msgid "Scantily clad human characters" +msgstr "നാമമാത്രമായ വസ്ത്രമുള്ള മനുഷ്യ പ്രതീകങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:329 +msgid "Overtly sexualized human characters" +msgstr "അതിലൈംഗികതയുള്ള മനുഷ്യ പ്രതീകങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:332 +msgid "No references to desecration" +msgstr "ഹീനതയെ പറ്റിയുള്ള പരാമർശങ്ങളൊന്നുമില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:335 +msgid "Depictions or references to historical desecration" +msgstr "ചരിത്രാപരമായ ഹീനതയെ പറ്റിയുള്ള പ്രതീകങ്ങളും പരാമർശങ്ങളും" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:338 +msgid "Depictions of modern-day human desecration" +msgstr "ആധുനിക മനുഷ്യഹീനതയെ പറ്റിയുള്ള ചിത്രീകരണം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:341 +msgid "Graphic depictions of modern-day desecration" +msgstr "ആധുനിക ദിനാചരണത്തിൻ്റെ വിവരണരൂപേനയുള്ള ചിത്രീകരണം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:344 +msgid "No visible dead human remains" +msgstr "മരിച്ചവരുടെ മൃതദേഹങ്ങൾ കാണാതിരിക്കൽ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:347 +msgid "Visible dead human remains" +msgstr "മരിച്ചവരുടെ അവശിഷ്ടങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:350 +msgid "Dead human remains that are exposed to the elements" +msgstr "അംഗഭംഗം സംഭവിച്ച മനുഷ്യ മൃതദേഹങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:353 +msgid "Graphic depictions of desecration of human bodies" +msgstr "മനുഷ്യ ശരീരം നശിപ്പിക്കുന്നതിൻ്റെ വിവരണരൂപേനയുള്ള ചിത്രീകരണം" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:356 +msgid "No references to slavery" +msgstr "അടിമത്തെ പറ്റി പരാമർശമില്ല" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:359 +msgid "Depictions or references to historical slavery" +msgstr "ചരിത്രപരമായ അടിമത്തത്തോടുള്ള പ്രതീകങ്ങൾ അല്ലെങ്കിൽ പരാമർശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:362 +msgid "Depictions of modern-day slavery" +msgstr "ആധുനിക കാലഘട്ടത്തിലെ അടിമത്തത്തെ പറ്റിയുള്ള പരാമർശങ്ങൾ" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:365 +msgid "Graphic depictions of modern-day slavery" +msgstr "ആധുനിക കാലഘട്ടത്തിലെ അടിമത്തത്തിൻ്റെ വിവരണരൂപേനയുള്ള ചിത്രീകരണം" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:295 +msgid "An application" +msgstr "ഒരു അപ്ലിക്കേഷൻ" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:301 +msgid "%s is requesting additional file format support." +msgstr "%s കൂടുതൽ ഫയൽ ഘടനക്ക് വേണ്ടിയുള്ള പിന്തുണ അഭ്യർത്ഥിക്കുന്നു." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:303 +msgid "Additional MIME Types Required" +msgstr "കൂടുതൽ MIME തരങ്ങൾ ആവശ്യമാണ്" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:307 +msgid "%s is requesting additional fonts." +msgstr "%s കൂടുതൽ ഫോണ്ടുകൾ അഭ്യർത്ഥിക്കുന്നു." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:309 +msgid "Additional Fonts Required" +msgstr "കൂടുതൽ ഫോണ്ടുകൾ ആവശ്യമാണ്" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:313 +msgid "%s is requesting additional multimedia codecs." +msgstr "%s കൂടുതൽ മൾട്ടിമീഡിയ കോഡെക്കുകൾ അഭ്യർത്ഥിക്കുന്നു." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:315 +msgid "Additional Multimedia Codecs Required" +msgstr "അധിക മൾട്ടിമീഡിയ കോഡെക്കുകൾ ആവശ്യമാണ്" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:319 +msgid "%s is requesting additional printer drivers." +msgstr "%s കൂടുതൽ പ്രിന്റർ ഡ്രൈവറുകൾ ആവശ്യപ്പെടുന്നു." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:321 +msgid "Additional Printer Drivers Required" +msgstr "അധിക പ്രിന്റർ ഡ്രൈവറുകൾ ആവശ്യമാണ്" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:325 +msgid "%s is requesting additional packages." +msgstr "%s കൂടുതൽ പാക്കേജുകൾ ആവശ്യപ്പെടുന്നു." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:327 +msgid "Additional Packages Required" +msgstr "കൂടുതൽ പാക്കേജുകൾ ആവശ്യമുണ്ട്" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:336 +msgid "Find in Software" +msgstr "സോഫ്റ്റ്‌വെയറിൽ കണ്ടെത്തുക" + +#: src/gs-details-page.c:320 +msgid "Removing…" +msgstr "നീക്കം ചെയ്യുന്നു…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:339 +msgid "Pending installation…" +msgstr "ഇൻസ്റ്റാളേഷൻ ശേഷിക്കുന്നു…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:346 +msgid "Pending update…" +msgstr "പുതുക്കലുകൾ ശേഷിക്കുന്നു…" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:667 +msgid "This application can only be used when there is an active internet connection." +msgstr "സജീവ ഇൻറർനെറ്റ് കണക്ഷൻ ലഭ്യമാകുമ്പോൾ മാത്രമേ ഈ അപ്ലിക്കേഷൻ ഉപയോഗിക്കാൻ കഴിയൂ." + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo +#: src/gs-details-page.c:815 src/gs-details-page.c:843 +#: src/gs-details-page.ui:159 src/gs-third-party-repo-row.c:97 +#: src/gs-upgrade-banner.ui:122 +msgid "_Install" +msgstr "ഇൻസ്റ്റാൾ(_I)" + +#. TRANSLATORS: button text in the header when an application +#. * can be live-updated +#: src/gs-details-page.c:848 +msgid "_Update" +msgstr "പുതുക്കൽ(_U)" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo. +#. The ellipsis indicates that further steps are required +#: src/gs-details-page.c:861 src/gs-third-party-repo-row.c:89 +msgid "_Install…" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യുക…(_I)" + +#. TRANSLATORS: A label for a button to execute the selected +#. application. +#: src/gs-details-page.c:895 +msgid "_Launch" +msgstr "തുടങ്ങുക(_L)" + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:920 src/gs-details-page.ui:184 +msgid "_Remove" +msgstr "നീക്കം ചെയ്യുക(_R)" + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:1050 +msgctxt "version" +msgid "Unknown" +msgstr "അജ്ഞാതം" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:1063 +msgctxt "updated" +msgid "Never" +msgstr "ഒരിക്കലുമില്ല" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1111 +msgctxt "origin" +msgid "Unknown" +msgstr "അജ്ഞാതം" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1504 +msgid "You need internet access to write a review" +msgstr "ഒരു അവലോകനം എഴുതാൻ നിങ്ങൾക്ക് ഇന്റർനെറ്റ് ലഭ്യത ആവശ്യമാണ്" + +#: src/gs-details-page.c:1693 +msgid "Unable to find “%s”" +msgstr "\"%s\" കണ്ടെത്താൻ കഴിയുന്നില്ല" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2230 +msgid "Public domain" +msgstr "പൊതുസഞ്ചയം" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://de.wikipedia.org/wiki/Gemeinfreiheit +#: src/gs-details-page.c:2233 +msgid "https://en.wikipedia.org/wiki/Public_domain" +msgstr "https://ml.wikipedia.org/wiki/പൊതുസഞ്ചയം" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://www.gnu.org/philosophy/free-sw.de +#: src/gs-details-page.c:2240 +msgid "https://www.gnu.org/philosophy/free-sw" +msgstr "https://www.gnu.org/philosophy/free-sw.html" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2250 src/gs-details-page.ui:1143 +msgid "Free Software" +msgstr "സ്വതന്ത്ര സോഫ്റ്റ്‌വെയർ" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2307 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "ഉപയോക്താക്കൾക്ക് ഇനിപ്പറയുന്ന ലൈസൻസിനാൽ നിയന്ത്രിക്കപ്പെട്ടിരിക്കുന്നു:" +msgstr[1] "ഉപയോക്താക്കൾക്ക് ഇനിപ്പറയുന്ന ലൈസൻസുകളാൽ നിയന്ത്രിക്കപ്പെട്ടിരിക്കുന്നു:" + +#: src/gs-details-page.c:2334 src/gs-details-page.ui:1215 +msgid "More information" +msgstr "കൂടുതൽ വിവരങ്ങൾ" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "വിശദാംശങ്ങളുടെ പേജ്" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: src/gs-details-page.ui:251 +msgid "_Add shortcut" +msgstr "കുറുക്കുവഴി ചേർക്കുക(_A)" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: src/gs-details-page.ui:262 +msgid "Re_move shortcut" +msgstr "കുറുക്കുവഴി നീക്കം ചെയ്യുക" + +#: src/gs-details-page.ui:336 +msgid "No screenshot provided" +msgstr "സ്ക്രീൻഷോട്ട് നൽകിയിട്ടില്ല" + +#: src/gs-details-page.ui:356 +msgid "Software Repository Included" +msgstr "സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററി അടങ്ങിയിരിക്കുന്നു" + +#: src/gs-details-page.ui:357 +msgid "This application includes a software repository which provides updates, as well as access to other software." +msgstr "ഈ ആപ്ലിക്കേഷൻ പുതുക്കലുകൾ നൽകുന്ന ഒരു സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററിയും മറ്റ് സോഫ്റ്റ്‌വെയറിലേയ്ക്കുള്ള പ്രവേശനവും ഉൾപ്പെടുത്തുന്നു." + +#: src/gs-details-page.ui:364 +msgid "No Software Repository Included" +msgstr "സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററി അടങ്ങിയിട്ടില്ല" + +#: src/gs-details-page.ui:365 +msgid "This application does not include a software repository. It will not be updated with new versions." +msgstr "ഈ ആപ്ലിക്കേഷനിൽ സോഫ്റ്റ്‌വെയർ റിപോസിറ്ററി ഉൾപ്പെടുന്നില്ല. പുതിയ പതിപ്പുകൾ ഉപയോഗിച്ച് ഇത് പുതുക്കുവാനും പറ്റില്ല." + +#: src/gs-details-page.ui:373 +msgid "This software is already provided by your distribution and should not be replaced." +msgstr "ഈ സോഫ്റ്റ്‌വെയർ ഇതിനകം നിങ്ങളുടെ വിതരണത്തിലൂടെ നൽകിയിട്ടുണ്ട്, പകരം മാറ്റി വയ്ക്കരുത്." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:380 +msgid "Software Repository Identified" +msgstr "സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററി തിരിച്ചറിയപ്പെട്ടു" + +#: src/gs-details-page.ui:381 +msgid "Adding this software repository will give you access to additional software and upgrades." +msgstr "ഈ സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററി ചേർക്കുന്നത് നിങ്ങൾക്ക് കൂടുതൽ സോഫ്റ്റ്‌വെയറുകളിലേക്കും നവീകരണങ്ങളിലേക്കും പ്രവേശനം നൽകും." + +#: src/gs-details-page.ui:382 +msgid "Only use software repositories that you trust." +msgstr "നിങ്ങൾ വിശ്വാസമുള്ള സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററികൾ മാത്രം ഉപയോഗിക്കുക." + +#: src/gs-details-page.ui:392 +msgid "_Website" +msgstr "വെബ്സൈറ്റ്(_W)" + +#: src/gs-details-page.ui:401 +msgid "_Donate" +msgstr "സംഭാവനചെയ്യുക(_D)" + +#: src/gs-details-page.ui:511 +msgid "Localized in your Language" +msgstr "നിങ്ങളുടെ ഭാഷയിൽ പ്രാദേശികവത്കരിക്കുക" + +#: src/gs-details-page.ui:522 +msgid "Documentation" +msgstr "ആധാരമാക്കുക" + +#: src/gs-details-page.ui:533 +msgid "Release Activity" +msgstr "പ്രസിദ്ധീകരണ പ്രവർത്തനം" + +#: src/gs-details-page.ui:544 +msgid "System Integration" +msgstr "സിസ്റ്റം ഏകീകരണം" + +#: src/gs-details-page.ui:555 +msgid "Sandboxed" +msgstr "സാൻഡ് ബോക്സ്" + +#: src/gs-details-page.ui:574 +msgid "Version" +msgstr "പതിപ്പ്" + +#: src/gs-details-page.ui:610 +msgid "Age Rating" +msgstr "പ്രായനിർണയം" + +#: src/gs-details-page.ui:648 +msgid "Updated" +msgstr "പുതുക്കിയത്" + +#: src/gs-details-page.ui:682 +msgid "Category" +msgstr "വിഭാഗം" + +#: src/gs-details-page.ui:719 +msgid "Installed Size" +msgstr "ഇൻസ്റ്റാൾ ചെയ്ത വലുപ്പം" + +#: src/gs-details-page.ui:750 +msgid "Download Size" +msgstr "ഡൗൺലോഡ് വലിപ്പം" + +#: src/gs-details-page.ui:812 +msgid "Developer" +msgstr "ഡെവലപ്പർ" + +#: src/gs-details-page.ui:857 +msgid "License" +msgstr "ലൈസൻസ്" + +#. This refers to the license of the application +#: src/gs-details-page.ui:876 +msgid "Free" +msgstr "സ്വതന്ത്രമായ" + +#. This refers to the license of the application +#: src/gs-details-page.ui:888 +msgid "Proprietary" +msgstr "കുത്തക" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.ui:900 src/gs-review-row.c:71 +msgid "Unknown" +msgstr "അജ്ഞാതം" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: src/gs-details-page.ui:938 src/gs-installed-page.c:492 +#: plugins/core/gs-desktop-common.c:331 +msgid "Add-ons" +msgstr "ആഡ്-ഓണുകൾ" + +#: src/gs-details-page.ui:950 +msgid "Selected add-ons will be installed with the application." +msgstr "തിരഞ്ഞെടുത്ത ആഡ്-ഓണുകൾ അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് ഇൻസ്റ്റാൾ ചെയ്യപ്പെടും." + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-details-page.ui:988 +msgid "Reviews" +msgstr "അവലോകനങ്ങൾ" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1006 +msgid "_Write a Review" +msgstr "ഒരു അവലോകനം എഴുതുക(_W)" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1027 +msgid "_Show More" +msgstr "കൂടുതൽ കാണിക്കുക(_S)" + +#: src/gs-details-page.ui:1154 +msgid "This means that the software can be freely run, copied, distributed, studied and modified." +msgstr "സോഫ്റ്റ്‌വെയർ സ്വതന്ത്രമായി പ്രവർത്തിപ്പിക്കാനും പകർത്താനും വിതരണം ചെയ്യാനും പഠിക്കാനും പരിഷ്കരിക്കാനും കഴിയുമെന്നാണ് ഇതിനർത്ഥം." + +#: src/gs-details-page.ui:1194 +msgid "Proprietary Software" +msgstr "കുത്തക സോഫ്റ്റ്‌വെയർ" + +#: src/gs-details-page.ui:1205 +msgid "This means that the software is owned by an individual or a company. There are often restrictions on its use and its source code cannot usually be accessed." +msgstr "ഇതിനർത്ഥം സോഫ്റ്റ്‌വെയർ ഒരു വ്യക്തിയുടെയോ അല്ലെങ്കിൽ കമ്പനിയുടെയോ ഉടമസ്ഥതയിൽ ആണെന്നാണ്. ഇതിന്റെ ഉപയോഗത്തിൽ പലപ്പോഴും നിയന്ത്രണങ്ങൾ ഉണ്ട്, ഇതിൻറെ സോഴ്സ് കോഡ് സാധാരണയായി ആക്സസ് ചെയ്യാൻ കഴിയില്ല." + +#: src/gs-details-page.ui:1237 +msgid "Unknown Software License" +msgstr "അജ്ഞാത സോഫ്റ്റ്‌വെയർ ലൈസൻസ്" + +#: src/gs-details-page.ui:1248 +msgid "The license terms of this software are unknown." +msgstr "ഈ സോഫ്റ്റ്‌വെയറിന്റെ ലൈസൻസ് നിബന്ധനകൾ അജ്ഞാതമാണ്." + +#: src/gs-details-page.ui:1268 +msgid "The application was rated this way because it features:" +msgstr "ഈ സവിശേഷത ഉള്ളതിനാൽ ഈ അപ്ലിക്കേഷൻ മൂല്യനിർണയം ചെയ്തു:" + +#: src/gs-details-page.ui:1282 +msgid "No details were available for this rating." +msgstr "ഈ നിർണയത്തെ സംബന്ധിച്ച വിശദാംശങ്ങൾ ലഭ്യമല്ല." + +#: src/gs-editor.c:361 +msgid "CSS validated OK!" +msgstr "സിഎസ്എസ് സാധുതയുള്ളതാണെന് ശരി വെച്ചു!" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:564 +msgid "Failed to load file" +msgstr "ഫയൽ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു" + +#. TRANSLATORS: window title +#: src/gs-editor.c:598 src/gs-editor.c:874 +msgid "Unsaved changes" +msgstr "മാറ്റങ്ങൾ സംരക്ഷിച്ചിട്ടില്ല" + +#: src/gs-editor.c:600 +msgid "The application list is already loaded." +msgstr "അപ്ലിക്കേഷൻ പട്ടിക ഇതിനകം ലോഡുചെയ്തു." + +#. TRANSLATORS: button text +#: src/gs-editor.c:604 +msgid "Merge documents" +msgstr "പ്രമാണങ്ങൾ ലയിപ്പിക്കുക" + +#. TRANSLATORS: button text +#: src/gs-editor.c:608 src/gs-editor.c:879 +msgid "Throw away changes" +msgstr "മാറ്റങ്ങൾ ഒഴിവാക്കുക" + +#. import the new file +#: src/gs-editor.c:620 src/gs-editor.c:652 +msgid "Open AppStream File" +msgstr "ആപ്പ്സ്ട്രീം ഫയൽ തുറക്കുക" + +#: src/gs-editor.c:624 +msgid "_Open" +msgstr "തുറക്കുക(_O)" + +#: src/gs-editor.c:656 +msgid "_Save" +msgstr "സൂക്ഷിക്കുക (_S)" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:676 +msgid "Failed to save file" +msgstr "ഫയൽ സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു" + +#. TRANSLATORS, the %s is the app name, e.g. 'Inkscape' +#: src/gs-editor.c:751 +msgid "%s banner design deleted." +msgstr "%s അറിയിപ്പുകളുടെ രൂപകൽപന ഇല്ലാതാക്കി." + +#. TRANSLATORS, this is a notification +#: src/gs-editor.c:754 +msgid "Banner design deleted." +msgstr "അറിയിപ്പുകളുടെ രൂപകല്‌പന നീക്കംചെയ്തു." + +#: src/gs-editor.c:876 +msgid "The application list has unsaved changes." +msgstr "അപ്ലിക്കേഷൻ പട്ടികയിൽ സംരക്ഷിക്കാത്ത മാറ്റങ്ങളുണ്ട്." + +#. TRANSLATORS: show the program version +#: src/gs-editor.c:1111 +msgid "Use verbose logging" +msgstr "വെർബോസ് ലോഗിംഗ് ഉപയോഗിക്കുക" + +#. TRANSLATORS: program name, an application to add and remove software repositories +#: src/gs-editor.c:1119 +msgid "GNOME Software Banner Designer" +msgstr "ഗ്നോം സോഫ്റ്റ്‌വെയർ അറിയിപ്പുകളുടെ രൂപകല്‌പന" + +#: src/gs-editor.ui:53 src/gs-editor.ui:62 +msgid "No Designs" +msgstr "രൂപകല്‌പനകളില്ല" + +#: src/gs-editor.ui:137 +msgid "Error message here" +msgstr "പിശകുകളെ കുറിച്ചുള്ള സന്ദേശം" + +#: src/gs-editor.ui:196 +msgid "App ID" +msgstr "അപ്ലിക്കേഷൻ ഐഡി" + +#: src/gs-editor.ui:253 src/gs-review-dialog.ui:109 +msgid "Summary" +msgstr "സംഗ്രഹം" + +#: src/gs-editor.ui:278 +msgid "Editor’s Pick" +msgstr "എഡിറ്റർ തിരഞ്ഞെടുത്തത്" + +#. This check button controls whether the application’s banner appears in the “Featured” category +#: src/gs-editor.ui:287 +msgid "Category Featured" +msgstr "സവിശേഷതയുള്ള വിഭാഗം" + +#. button in the info bar +#: src/gs-editor.ui:336 +msgid "Undo" +msgstr "നിഷ്‌ഫലമാക്കുക" + +#: src/gs-editor.ui:371 src/org.gnome.Software.Editor.desktop.in:3 +msgid "Banner Designer" +msgstr "അറിയിപ്പുകളുടെ രൂപകല്‌പന" + +#: src/gs-editor.ui:392 +msgid "New Banner" +msgstr "പുതിയ അറിയിപ്പുകള്‍" + +#: src/gs-editor.ui:452 +msgid "Import from file" +msgstr "ഫയലിൽ നിന്ന് ഇറക്കുമതി ചെയ്യുക" + +#: src/gs-editor.ui:461 +msgid "Export to file" +msgstr "ഫയലിലേക്ക് കയറ്റുമതി ചെയ്യുക" + +#: src/gs-editor.ui:470 +msgid "Delete Design" +msgstr "രൂപകല്‌പന നീക്കം ചെയ്യുക" + +#: src/gs-editor.ui:491 +msgid "Featured App" +msgstr "സവിശേഷതയുള്ള ആപ്പ്" + +#: src/gs-editor.ui:500 +msgid "OS Upgrade" +msgstr "OS നവീകരണം" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:147 +msgid " and " +msgstr " ഉം " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:150 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:176 +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s സ്ക്രിപ്റ്റിനായി ലഭ്യമായ അക്ഷരസഞ്ചയം" +msgstr[1] "%s സ്ക്രിപ്റ്റിനായി ലഭ്യമായ അക്ഷരസഞ്ചയങ്ങൾ" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:184 +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s നായി ലഭ്യമായ സോഫ്റ്റ്‌വെയർ" +msgstr[1] "%s നായി ലഭ്യമായ സോഫ്റ്റ്‌വെയർ" + +#: src/gs-extras-page.c:226 +msgid "Unable to Find Requested Software" +msgstr "അഭ്യർത്ഥിച്ച സോഫ്റ്റ്‌വെയർ കണ്ടെത്താനായില്ല" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:325 +msgid "%s not found" +msgstr "%s കണ്ടെത്താനായില്ല" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:329 +msgid "on the website" +msgstr "വെബ്സൈറ്റിൽ" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:336 +msgid "No applications are available that provide the file %s." +msgstr "%s ഫയൽ നൽകുന്ന അപ്ലിക്കേഷനുകളൊന്നും ലഭ്യമല്ല." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:340 src/gs-extras-page.c:351 src/gs-extras-page.c:362 +msgid "Information about %s, as well as options for how to get missing applications might be found %s." +msgstr "%s സംബന്ധിച്ചുളള വിവരങ്ങൾ, കൂടാതെ ലഭ്യമല്ലാത്ത പ്രയോഗങ്ങൾ എങ്ങനെ ലഭ്യമാകണമെന്നതിനുള്ള ഐച്ഛികങ്ങൾ %s ൽ ലഭ്യമായിരിക്കുന്നു." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:347 src/gs-extras-page.c:369 +msgid "No applications are available for %s support." +msgstr "%s പിന്തുണയ്ക്കായി അപ്ലിക്കേഷനുകളൊന്നും ലഭ്യമല്ല." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:358 +msgid "%s is not available." +msgstr "%s ലഭ്യമല്ല." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:373 +msgid "Information about %s, as well as options for how to get an application that can support this format might be found %s." +msgstr "%s സംബന്ധിച്ചുള്ള വിവരങ്ങളും, ഈ ഘടനയെ പിന്തുണയ്ക്കാൻ കഴിയുന്ന ഒരു ആപ്ലിക്കേഷൻ എങ്ങനെ ലഭിയ്ക്കും എന്നതിനുള്ള ഓപ്ഷനുകൾ %s ൽ കണ്ടേക്കാം." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:380 +msgid "No fonts are available for the %s script support." +msgstr "%s സ്ക്രിപ്റ്റ് പിന്തുണയ്ക്കായി ഫോണ്ടുകൾ ലഭ്യമല്ല." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:384 +msgid "Information about %s, as well as options for how to get additional fonts might be found %s." +msgstr "%s സംബന്ധിച്ചുളള വിവരങ്ങൾ, കൂടാതെ എങ്ങനെയാണ് കൂടുതൽ ഫിൽറ്ററുകൾ ലഭ്യമാകുന്നത് എന്നതിന്റെ ഐച്ഛികങ്ങളും %s ൽ കണ്ടേക്കാം." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:391 +msgid "No addon codecs are available for the %s format." +msgstr "%s ഘടനക്കായി ആഡ്-ഓൺ കോഡെക്കുകൾ ലഭ്യമല്ല." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:395 +msgid "Information about %s, as well as options for how to get a codec that can play this format might be found %s." +msgstr "%s സംബന്ധിച്ചുള്ള വിവരങ്ങളും, ഈ ഘടന എങ്ങനെ പ്രവർത്തിപ്പിക്കണമെന്ന കോഡെക് സ്വീകരിക്കുന്നതിനുള്ള ഐച്ഛികങ്ങളും %s ൽ കണ്ടേക്കാം." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:402 +msgid "No Plasma resources are available for %s support." +msgstr "%s പിന്തുണയ്ക്കായി പ്ലാസ്മ വിഭവങ്ങൾ ലഭ്യമല്ല." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:406 +msgid "Information about %s, as well as options for how to get additional Plasma resources might be found %s." +msgstr "%s സംബന്ധിച്ചുളള വിവരങ്ങൾ, അതുപോലെ തന്നെ പ്ലാസ്മ വിഭവങ്ങൾ ലഭ്യമാക്കുന്നതിനുള്ള ഐച്ഛികങ്ങൾ %s ൽ ലഭ്യമായിരിക്കുന്നു." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:413 +msgid "No printer drivers are available for %s." +msgstr "%s നായി പ്രിന്റർ ഡ്രൈവറുകൾ ലഭ്യമല്ല." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:417 +msgid "Information about %s, as well as options for how to get a driver that supports this printer might be found %s." +msgstr "%s സംബന്ധിച്ചുള്ള വിവരങ്ങളും, ഈ പ്രിന്ററുകളെ പിന്തുണയ്ക്കുന്ന ഡ്രൈവറെ എങ്ങനെ ലഭ്യമാക്കാം എന്നും %s ൽ കണ്ടേക്കാം." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:461 +msgid "this website" +msgstr "ഈ വെബ്സൈറ്റ്" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:465 +msgid "Unfortunately, the %s you were searching for could not be found. Please see %s for more information." +msgid_plural "Unfortunately, the %s you were searching for could not be found. Please see %s for more information." +msgstr[0] "നിർഭാഗ്യവശാൽ, നിങ്ങൾ തിരയുന്ന %s നെ കണ്ടെത്താനായില്ല. കൂടുതൽ വിവരങ്ങൾക്ക് ദയവായി %s ൽ കാണുക." +msgstr[1] "നിർഭാഗ്യവശാൽ, നിങ്ങൾ തിരയുന്ന %s നെ കണ്ടെത്താനായില്ല. കൂടുതൽ വിവരങ്ങൾക്ക് ദയവായി %s ൽ കാണുക." + +#: src/gs-extras-page.c:533 src/gs-extras-page.c:589 src/gs-extras-page.c:628 +msgid "Failed to find any search results" +msgstr "തിരയൽ ഫലങ്ങൾ ഒന്നും കണ്ടെത്താനായില്ല" + +#: src/gs-extras-page.c:816 +msgid "%s file format" +msgstr "%s ഫയൽ ഘടന" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "കോഡെക്കുകളുടെ താൾ" + +#: src/gs-first-run-dialog.ui:6 src/gs-first-run-dialog.ui:15 +msgid "Welcome" +msgstr "സ്വാഗതം" + +#: src/gs-first-run-dialog.ui:40 +msgid "Welcome to Software" +msgstr "സോഫ്റ്റ്വെയറിലേക്ക് സ്വാഗതം" + +#: src/gs-first-run-dialog.ui:50 +msgid "Software lets you install all the software you need, all from one place. See our recommendations, browse the categories, or search for the applications you want." +msgstr "നിങ്ങൾക്കാവശ്യമുള്ള എല്ലാ സോഫ്റ്റ്‌വെയറുകളും ഇൻസ്റ്റാൾ ചെയ്യാൻ സോഫ്റ്റ്‌വെയർ നിങ്ങളെ അനുവദിക്കുന്നു. ഞങ്ങളുടെ ശുപാർശകൾ കാണുക, വിഭാഗങ്ങൾ ബ്രൗസുചെയ്യുക, അല്ലെങ്കിൽ നിങ്ങൾക്ക് ആവശ്യമുള്ള ആപ്ലിക്കേഷനുകൾക്കായി തിരയുക." + +#: src/gs-first-run-dialog.ui:59 +msgid "_Let’s Go Shopping" +msgstr "ഷോപ്പിങ്ങിന് പോകാം(_L)" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: src/gs-hiding-box.c:381 +msgid "Spacing" +msgstr "അകലം" + +#: src/gs-hiding-box.c:382 +msgid "The amount of space between children" +msgstr "കുട്ടികൾക്കിടയിലുള്ള അകലത്തിന്റെ അളവ്" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:83 +msgctxt "app status" +msgid "Removed" +msgstr "നീക്കം ചെയ്തു" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:89 +msgctxt "app status" +msgid "Installed" +msgstr "ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:95 +msgctxt "app status" +msgid "Updated" +msgstr "പുതുക്കപ്പെട്ടു" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:101 +msgctxt "app status" +msgid "Unknown" +msgstr "അജ്ഞാതമാണ്" + +#: src/gs-history-dialog.ui:5 +msgid "History" +msgstr "ചരിത്രം" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:488 +msgid "System Applications" +msgstr "സിസ്റ്റം ആപ്ലിക്കേഷനുകൾ" + +#: src/gs-installed-page.c:622 +msgid "Click on items to select them" +msgstr "അവ തിരഞ്ഞെടുക്കുന്നതിന് ഇനങ്ങൾ ക്ലിക്കുചെയ്യുക" + +#: src/gs-installed-page.c:826 +msgid "Select" +msgstr "തിരഞ്ഞെടുക്കുക" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "ഇൻസ്റ്റാൾ ചെയ്ത താൾ" + +#: src/gs-installed-page.ui:65 +msgid "_Add to Folder…" +msgstr "ഫോൾഡറിലേക്ക് ചേർക്കുക…(_A)" + +#: src/gs-installed-page.ui:73 +msgid "_Move to Folder…" +msgstr "ഫോൾഡറിലേക്ക് നീക്കുക…(_M)" + +#: src/gs-installed-page.ui:81 +msgid "_Remove from Folder" +msgstr "ഫോൾഡറിൽ നിന്ന് നീക്കംചെയ്യുക(_R)" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:75 +msgid "Software catalog is being downloaded" +msgstr "സോഫ്റ്റ്‌വെയർ സൂചിതപത്രം ഡൗൺലോഡ് ചെയ്യുകയാണ്" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:79 +msgid "Software catalog is being loaded" +msgstr "സോഫ്റ്റ്‌വെയർ സൂചിതപത്രം ലോഡ് ചെയ്യുന്നു" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "താൾ ലോഡ് ചെയ്യുന്നു" + +#: src/gs-loading-page.ui:47 +msgid "Starting up…" +msgstr "ആരംഭിക്കുന്നു…" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "മോഡറേറ്റ് താൾ" + +#: src/gs-moderate-page.ui:85 +msgid "There are no reviews to moderate" +msgstr "മദ്ധ്യസ്ഥതചെയ്യുന്നതിന് അവലോകനങ്ങളൊന്നുമില്ല" + +#: src/gs-origin-popover-row.ui:35 src/gs-repo-row.ui:75 +msgid "URL" +msgstr "യുആർഎൽ" + +#. Translators: The packaging format of the app being installed, e.g. 'RPM' or 'Flatpak' +#: src/gs-origin-popover-row.ui:64 +msgid "Format" +msgstr "ഫോർമാറ്റ് ചെയ്യുക" + +#. add button +#: src/gs-overview-page.c:332 +msgid "More…" +msgstr "കൂടുതൽ…" + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:610 +msgid "Recommended Audio & Video Applications" +msgstr "ശുപാർശ ചെയ്ത ശബ്‌ദ, ചലച്ചിത്ര ആപ്ലിക്കേഷനുകൾ" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:615 +msgid "Recommended Games" +msgstr "ശുപാർശ ചെയ്ത വിനോദങ്ങൾ" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:620 +msgid "Recommended Graphics Applications" +msgstr "ശുപാർശ ചെയ്ത ഗ്രാഫിക്സ് ആപ്ലിക്കേഷനുകൾ" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:625 +msgid "Recommended Productivity Applications" +msgstr "ശുപാർശിത ഉൽപ്പാദനക്ഷമതാ ആപ്ലിക്കേഷനുകൾ" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:1007 src/gs-repos-dialog.c:836 +msgid "Access additional software from selected third party sources." +msgstr "തിരഞ്ഞെടുത്ത മൂന്നാം കക്ഷി സ്രോതസ്സുകളിൽ നിന്ന് അധിക സോഫ്റ്റ്‌വെയർ ഉപയോഗിക്കുക." + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:1011 src/gs-repos-dialog.c:840 +msgid "Some of this software is proprietary and therefore has restrictions on use, sharing, and access to source code." +msgstr "ഈ സോഫ്റ്റ്‌വെയറിൽ ചിലത് കുത്തകയാണ്, അതിനാൽ സോഴ്സ് കോഡ് ഉപയോഗിയ്ക്കാനും പങ്കിടാനും ലഭ്യമാക്കാനുമുള്ള നിയന്ത്രണങ്ങൾ ഉണ്ട്." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-overview-page.c:1016 src/gs-repos-dialog.c:845 +msgid "Find out more…" +msgstr "കൂടുതല് കണ്ടെത്തുക…" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:1024 src/gs-repos-dialog.c:252 +msgid "Enable" +msgstr "പ്രാപ്തമാക്കുക" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "അവലോകന താൾ" + +#: src/gs-overview-page.ui:39 +msgid "Enable Third Party Software Repositories?" +msgstr "മൂന്നാം കക്ഷി സോഫ്റ്റ്‌വെയർ റിപ്പോസിറ്ററികൾ പ്രാപ്തമാക്കണോ?" + +#: src/gs-overview-page.ui:83 +msgid "Featured Applications" +msgstr "സവിശേഷമാക്കപെട്ട ആപ്ലിക്കേഷനുകൾ" + +#: src/gs-overview-page.ui:116 +msgid "Categories" +msgstr "വിഭാഗങ്ങൾ" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-overview-page.ui:232 +msgid "Editor’s Picks" +msgstr "എഡിറ്റർമാർ തിരഞ്ഞെടുത്തവ" + +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-overview-page.ui:258 +msgid "Recent Releases" +msgstr "സമീപകാല പ്രസിദ്ധപ്പെടുത്തിയവ" + +#: src/gs-overview-page.ui:328 +msgid "No Application Data Found" +msgstr "അപ്ലിക്കേഷൻ വിവരം കണ്ടെത്താൻ പറ്റിയില്ല" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:496 +msgid "Are you sure you want to purchase %s?" +msgstr "%s വാങ്ങാൻ നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടോ?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:500 +msgid "%s will be installed, and you will be charged %s." +msgstr "%s ഇൻസ്റ്റാൾ ചെയ്യപ്പെടും, നിങ്ങളിൽ നിന്ന് %s ഈടാക്കും." + +#. TRANSLATORS: this is button text to purchase the application +#: src/gs-page.c:513 +msgid "Purchase" +msgstr "വാങ്ങൽ" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:587 +msgid "Prepare %s" +msgstr "%s തയ്യാറാക്കുക" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:724 +msgid "Are you sure you want to remove the %s repository?" +msgstr "%s റിപ്പോസിറ്ററി നീക്കം ചെയ്യണമെന്ന് ഉറപ്പാണോ?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:728 +msgid "All applications from %s will be removed, and you will have to re-install the repository to use them again." +msgstr "%s ൽ നിന്നുള്ള എല്ലാ അപ്ലിക്കേഷനുകളും നീക്കം ചെയ്യപ്പെടും, അവ വീണ്ടും ഉപയോഗിക്കാനായി നിങ്ങൾ റിപ്പോസിറ്ററി വീണ്ടും ഇൻസ്റ്റോൾ ചെയ്യേണ്ടതായി വരും." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:736 +msgid "Are you sure you want to remove %s?" +msgstr "%s നീക്കം ചെയ്യണമെന്ന് തീർച്ചയാണോ?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:739 +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "%s നീക്കംചെയ്യും, അത് വീണ്ടും ഉപയോഗിക്കാൻ നിങ്ങൾ ഇത് ഇൻസ്റ്റാൾ ചെയ്യണം." + +#. TRANSLATORS: this refers to an app (by name) that is installed +#: src/gs-popular-tile.c:68 src/gs-summary-tile.c:75 +msgid "%s (Installed)" +msgstr "%s (ഇൻസ്റ്റാൾ ചെയ്തു)" + +#: src/gs-prefs-dialog.ui:5 src/gs-prefs-dialog.ui:17 +msgid "Update Preferences" +msgstr "മുൻഗണനകൾ പുതുക്കുക" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatic Updates" +msgstr "സ്വമേധയായുള്ള പുതുക്കലുകൾ" + +#: src/gs-prefs-dialog.ui:70 +msgid "Automatic updates are disabled when on mobile or metered connections." +msgstr "മൊബൈൽ അല്ലെങ്കിൽ മീറ്റർ ചെയ്യപ്പെട്ട ബന്ധങ്ങളിൽ സ്വമേധയായുള്ള പുതുക്കലുകൾ പ്രവർത്തനരഹിതമാണ്." + +#: src/gs-prefs-dialog.ui:88 +msgid "Automatic Update Notifications" +msgstr "സ്വമേധയായുള്ള പുതുക്കലുകളുടെ അറിയിപ്പുകൾ" + +#: src/gs-prefs-dialog.ui:102 +msgid "Show notifications when updates have been automatically installed." +msgstr "പുതുക്കിയത് സ്വപ്രേരിതമായി ഇൻസ്റ്റാൾ ചെയ്യുമ്പോൾ അറിയിപ്പുകൾ കാണിക്കുക." + +#: lib/gs-price.c:111 +msgid "A$%.2f" +msgstr "A$%.2f" + +#: lib/gs-price.c:113 +msgid "C$%.2f" +msgstr "C$%.2f" + +#: lib/gs-price.c:115 +msgid "CN¥%.2f" +msgstr "CN¥%.2f" + +#: lib/gs-price.c:117 +msgid "€%.2f" +msgstr "€%.2f" + +#: lib/gs-price.c:119 +msgid "£%.2f" +msgstr "£%.2f" + +#: lib/gs-price.c:121 +msgid "¥%.2f" +msgstr "¥%.2f" + +#: lib/gs-price.c:123 +msgid "NZ$%.2f" +msgstr "NZ$%.2f" + +#: lib/gs-price.c:125 +msgid "₽%.2f" +msgstr "₽%.2f" + +#: lib/gs-price.c:127 +msgid "US$%.2f" +msgstr "US$%.2f" + +#. Translators: %s is the currency, and %f is the amount. +#. * You can switch the order by using “%2$f %1$s” instead. +#: lib/gs-price.c:131 +msgid "%s %f" +msgstr "%s %f" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:127 +msgid "Some of the currently installed software is not compatible with %s. If you continue, the following will be automatically removed during the upgrade:" +msgstr "നിലവിൽ ഇൻസ്റ്റാൾ ചെയ്ത ചില സോഫ്റ്റ്‌വെയറുകൾ %s നോട് അനുയോജ്യമല്ല. നിങ്ങൾ തുടരുകയാണെങ്കിൽ, താഴെ പറയുന്നവയിൽ നിന്നും സ്വമേധയാ നീക്കം ചെയ്യുന്നതാണ്:" + +#: src/gs-removal-dialog.ui:26 +msgid "Incompatible Software" +msgstr "അനുയോജ്യമല്ലാത്ത സോഫ്റ്റ്‌വെയർ" + +#: src/gs-removal-dialog.ui:39 +msgid "_Continue" +msgstr "തുടരുക(_C)" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:110 +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "%u അപ്ലിക്കേഷൻ ഇൻസ്റ്റാൾ ചെയ്തു" +msgstr[1] "%u അപ്ലിക്കേഷനുകൾ ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:117 +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u ആഡ്-ഓൺ ഇൻസ്റ്റാൾ ചെയ്തു" +msgstr[1] "%u ആഡ്-ഓണുകൾ ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repos-dialog.c:125 +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u അപ്ലിക്കേഷൻ" +msgstr[1] "%u അപ്ലിക്കേഷനുകൾ" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repos-dialog.c:131 +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u ആഡ് ഓൺ" +msgstr[1] "%u ആഡ്-ഓണുകൾ" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repos-dialog.c:138 +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s , %s എന്നിവ ഇൻസ്റ്റാൾ ചെയ്തു" +msgstr[1] "%s , %s എന്നിവ ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:312 +msgid "Remove “%s”?" +msgstr "\"%s\" നീക്കംചെയ്യണോ?" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:317 +msgid "Disable “%s”?" +msgstr "\"%s\" അപ്രാപ്തമാക്കണോ?" + +#. TRANSLATORS: longer dialog text +#: src/gs-repos-dialog.c:321 +msgid "Software that has been installed from this repository will no longer receive updates, including security fixes." +msgstr "ഈ റിപ്പോസിറ്ററിയിൽ നിന്നും ഇൻസ്റ്റാളുചെയ്ത സോഫ്റ്റ്‌വെയർ സുരക്ഷ പരിഹാരങ്ങൾ ഉൾപ്പെടെയുള്ള അപ്ഡേറ്റുകൾ തുടർന്നങ്ങോട്ട് സ്വീകരിക്കില്ല." + +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-repos-dialog.c:339 +msgid "Disable" +msgstr "അപ്രാപ്തമാക്കുക" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:748 +msgid "the operating system" +msgstr "പ്രവർത്തിക്കുന്ന സിസ്റ്റം" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:815 src/gs-repos-dialog.c:851 +msgid "These repositories supplement the default software provided by %s." +msgstr "ഈ റിപ്പോസിറ്ററികൾ %s നൽകുന്ന ഡിഫോൾട്ടായ സോഫ്റ്റ്‌വെയറെ കൂട്ടിച്ചേർക്കുന്നു." + +#. TRANSLATORS: info bar title in the software repositories dialog +#: src/gs-repos-dialog.c:833 +msgid "Third Party Repositories" +msgstr "മൂന്നാം കക്ഷി റിപ്പോസിറ്ററികൾ" + +#: src/gs-repos-dialog.ui:73 +msgid "No Additional Repositories" +msgstr "അധിക റിപ്പോസിറ്ററികളൊന്നുമില്ല" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for enabling a repo +#: src/gs-repo-row.c:110 +msgid "_Enable" +msgstr "പ്രാപ്തമാക്കുക(_E)" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for removing a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:119 +msgid "_Remove…" +msgstr "നീക്കംചെയ്യുക…(_R)" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for disabling a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:124 +msgid "_Disable…" +msgstr "അപ്രാപ്തമാക്കുക…(_D)" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being enabled +#: src/gs-repo-row.c:132 +msgid "Enabling" +msgstr "പ്രാപ്തമാക്കുന്നു" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being disabled +#: src/gs-repo-row.c:144 +msgid "Disabling" +msgstr "അപ്രാപ്തമാക്കുന്നു" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is enabled. +#: src/gs-repo-row.c:158 +msgid "Enabled" +msgstr "പ്രാപ്തമാക്കി" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is disabled. +#: src/gs-repo-row.c:164 +msgid "Disabled" +msgstr "അപ്രാപ്തമാക്കി" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:95 +msgid "Hate it" +msgstr "വെറുക്കുന്നു" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:99 +msgid "Don’t like it" +msgstr "ഇഷ്ടപ്പെട്ടില്ല" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:103 +msgid "It’s OK" +msgstr "കൊള്ളാം" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:107 +msgid "Like it" +msgstr "ഇഷ്ടപ്പെട്ടു" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:111 +msgid "Love it" +msgstr "വളരെ ഇഷ്ടപ്പെട്ടു" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:133 +msgid "Please take more time writing the review" +msgstr "അവലോകനം എഴുതാൻ കൂടുതൽ സമയം ചിലവഴിക്കുക" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:137 +msgid "Please choose a star rating" +msgstr "ദയവായി ഒരു നക്ഷത്ര മൂല്യം തിരഞ്ഞെടുക്കുക" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The summary is too short" +msgstr "ചുരുക്കം വളരെ ചെറുതാണ്" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The summary is too long" +msgstr "ചുരുക്കം ദൈർഘ്യമേറിയതാണ്" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:149 +msgid "The description is too short" +msgstr "വിവരണം വളരെ ചെറുതാണ്" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:153 +msgid "The description is too long" +msgstr "വിവരണം ദൈർഘ്യമേറിയതാണ്" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:10 +msgid "Post Review" +msgstr "അവലോകനം പ്രസിദ്ധീകരിക്കുക" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:34 +msgid "_Post" +msgstr "പ്രസിദ്ധീകരിക്കുക(_P)" + +#: src/gs-review-dialog.ui:75 +msgid "Rating" +msgstr "മൂല്യനിർണയം" + +#: src/gs-review-dialog.ui:119 +msgid "Give a short summary of your review, for example: “Great app, would recommend”." +msgstr "നിങ്ങളുടെ അവലോകനത്തിൻ്റെ ഒരു ഹ്രസ്വ സംഗ്രഹം നൽകുക, ഉദാഹരണത്തിന്: \"നല്ല അപ്ലിക്കേഷൻ, ശുപാർശചെയ്യുന്നു\"." + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:144 +msgctxt "app review" +msgid "Review" +msgstr "അവലോകനം" + +#: src/gs-review-dialog.ui:154 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "ആപ്ലിക്കേഷനെക്കുറിച്ച് എന്ത് തോന്നുന്നു? നിങ്ങളുടെ കാഴ്ചപ്പാടുകൾക്ക് കാരണങ്ങൾ നൽകാൻ ശ്രമിക്കുക." + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:412 +msgid "ratings in total" +msgstr "ആകെയുള്ള മൂല്യനിർണയം" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:234 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "നിങ്ങൾക്ക് അധിക്ഷേപിക്കുന്ന, അസഭ്യമല്ലാത്ത അല്ലെങ്കിൽ വിവേചനപരമായ പെരുമാറ്റം സംബന്ധിച്ച അവലോകനങ്ങൾ റിപ്പോർട്ടുചെയ്യാൻ കഴിയും." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:239 +msgid "Once reported, a review will be hidden until it has been checked by an administrator." +msgstr "ഒരിക്കൽ റിപ്പോർട്ടുചെയ്താൽ, ഒരു രക്ഷാധികാരി അത് പരിശോധിക്കുന്നതുവരെ അവലോകനം മറയ്ക്കപ്പെടും." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:253 +msgid "Report Review?" +msgstr "അവലോകനം റിപ്പോർട്ടുചെയ്യണോ?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:257 +msgid "Report" +msgstr "റിപ്പോർട്ട്" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:105 +msgid "Was this review useful to you?" +msgstr "ഈ അവലോകനം നിങ്ങൾക്ക് ഉപയോഗപ്രദമായിരുന്നോ?" + +#: src/gs-review-row.ui:121 +msgid "Yes" +msgstr "അതെ" + +#: src/gs-review-row.ui:130 +msgid "No" +msgstr "ഇല്ല" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:139 +msgid "Meh" +msgstr "മെഹ്" + +#: src/gs-review-row.ui:162 +msgid "Report…" +msgstr "റിപ്പോർട്ട്…" + +#: src/gs-review-row.ui:172 +msgid "Remove…" +msgstr "നീക്കംചെയ്യുക…" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:314 +msgid "Screenshot not found" +msgstr "സ്ക്രീൻഷോട്ട് കണ്ടെത്തിയില്ല" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:329 +msgid "Failed to load image" +msgstr "ചിത്രം ലോഡു ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:462 +msgid "Screenshot size not found" +msgstr "സ്ക്രീൻഷോട്ട് വലുപ്പം കണ്ടെത്തിയില്ല" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:492 +msgid "Could not create cache" +msgstr "കാഷെ സൃഷ്ടിക്കാനായില്ല" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:553 +msgid "Screenshot not valid" +msgstr "സ്ക്രീൻഷോട്ട് അസാധുവാണ്" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:568 +msgid "Screenshot not available" +msgstr "സ്ക്രീൻഷോട്ട് ലഭ്യമല്ല" + +#: src/gs-screenshot-image.c:621 +msgid "Screenshot" +msgstr "സ്ക്രീൻഷോട്ട്" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:155 +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u ആയി കൂടുതൽ പൊരുത്തം" +msgstr[1] "%u ആയി കൂടുതൽ പൊരുത്തങ്ങൾ" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "ഏട് തിരയുക" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "അപ്ലിക്കേഷനൊന്നും കണ്ടെത്തിയില്ല" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:915 src/gs-shell.c:920 src/gs-shell.c:935 src/gs-shell.c:939 +msgid "“%s”" +msgstr "\"%s\"" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:991 +msgid "Unable to download firmware updates from %s" +msgstr "%s എന്നതിൽ നിന്ന് ഫേംവെയർ പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:997 +msgid "Unable to download updates from %s" +msgstr "%s എന്നതിൽ നിന്ന് പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1004 +msgid "Unable to download updates" +msgstr "പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1009 +msgid "Unable to download updates: internet access was required but wasn’t available" +msgstr "പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല: ഇന്റർനെറ്റ് പ്രവേശനം ആവശ്യമാണ് പക്ഷേ ലഭ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1018 +msgid "Unable to download updates from %s: not enough disk space" +msgstr "%s എന്നതിൽ നിന്ന് പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല: ആവശ്യത്തിന് സ്ഥലം ഡിസ്കിലില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1023 +msgid "Unable to download updates: not enough disk space" +msgstr "പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല: ആവശ്യത്തിന് സ്ഥലം ഡിസ്കിലില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1031 +msgid "Unable to download updates: authentication was required" +msgstr "പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല: പ്രാമാണീകരണം ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1036 +msgid "Unable to download updates: authentication was invalid" +msgstr "പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല: പ്രാമാണീകരണം അസാധുവായിരുന്നു" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1041 +msgid "Unable to download updates: you do not have permission to install software" +msgstr "പുതുക്കലുകൾ ഡൗൺലോഡു ചെയ്യാൻ കഴിയുന്നില്ല: സോഫ്റ്റ്‌വെയർ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിന് നിങ്ങള്ക്ക് അനുമതിയില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1051 +msgid "Unable to get list of updates" +msgstr "പുതുക്കലുകളുടെ പട്ടിക ലഭ്യമായില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1090 +msgid "Unable to purchase %s: authentication was required" +msgstr "%s വാങ്ങാൻ കഴിയുന്നില്ല: പ്രാമാണീകരണം ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1097 +msgid "Unable to purchase %s: authentication was invalid" +msgstr "%s വാങ്ങാൻ കഴിയുന്നില്ല: പ്രാമാണീകരണം അസാധുവായിരുന്നു" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1104 +msgid "Unable to purchase %s: no payment method setup" +msgstr "%s വാങ്ങാൻ കഴിയുന്നില്ല: പണമടയ്ക്കൽ സജ്ജീകരണം ഒന്നുമില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1111 +msgid "Unable to purchase %s: payment was declined" +msgstr "%s വാങ്ങാൻ കഴിയുന്നില്ല: പണമടയ്ക്കൽ നിരസിക്കപ്പെട്ടു" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1118 +msgid "Unable to purchase %s" +msgstr "%s വാങ്ങാൻ കഴിയുന്നില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1154 +msgid "Unable to install %s as download failed from %s" +msgstr "%s എന്നതിൽ നിന്ന് ഡൗൺലോഡു ചെയ്യാത്തതിനാൽ %s ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1160 +msgid "Unable to install %s as download failed" +msgstr "ഡൗൺലോഡ് ചെയ്യുന്നത് പരാജയപ്പെടുന്നതിനാൽ %s ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1172 +msgid "Unable to install %s as runtime %s not available" +msgstr "റൺടൈം %s ലഭ്യമല്ലത്തതിനാൽ %s ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1178 +msgid "Unable to install %s as not supported" +msgstr "ആശ്രയം ഇല്ലാത്തതിനാൽ %s ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1185 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല: ഇന്റർനെറ്റ് പ്രവേശനം ആവശ്യമാണ് പക്ഷേ ലഭ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1191 +msgid "Unable to install: the application has an invalid format" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല: അപ്ലിക്കേഷന് ഒരു അസാധുവായ ഘടനയാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1196 +msgid "Unable to install %s: not enough disk space" +msgstr "%s ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല: ആവശ്യത്തിന് സ്ഥലം ഡിസ്കിലില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1204 +msgid "Unable to install %s: authentication was required" +msgstr "%s ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല: പ്രാമാണീകരണം ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1211 +msgid "Unable to install %s: authentication was invalid" +msgstr "%s ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല: പ്രാമാണീകരണം അസാധുവായിരുന്നു" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1218 +msgid "Unable to install %s: you do not have permission to install software" +msgstr "%s ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല: സോഫ്റ്റ്‌വെയർ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിന് നിങ്ങൾക്ക് അനുമതിയില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the name of the authentication service, +#. * e.g. "Ubuntu One" +#: src/gs-shell.c:1231 +msgid "Your %s account has been suspended." +msgstr "നിങ്ങളുടെ %s അക്കൗണ്ട് താൽക്കാലികമായി നിർത്തിവച്ചു." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1235 +msgid "It is not possible to install software until this has been resolved." +msgstr "ഇത് പരിഹരിക്കപ്പെടുന്നതുവരെ സോഫ്റ്റ്‌വെയർ ഇൻസ്റ്റാൾ ചെയ്യാൻ സാധ്യമല്ല." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the clickable link (e.g. +#. * "http://example.com/what-did-i-do-wrong/") +#: src/gs-shell.c:1246 +msgid "For more information, visit %s." +msgstr "കൂടുതൽ വിവരങ്ങൾക്ക് %s സന്ദർശിക്കുക." + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1255 +msgid "Unable to install %s: AC power is required" +msgstr "%s ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല: എസി വൈദ്യുതി ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1264 +msgid "Unable to install %s" +msgstr "%s ഇൻസ്റ്റാൾ ചെയ്യുവാൻ സാധ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1310 +msgid "Unable to update %s from %s" +msgstr "%s ൽ നിന്ന് %s പുതുക്കുവാൻ സാധ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1316 +msgid "Unable to update %s as download failed" +msgstr "ഡൗൺലോഡ് പരാജയപ്പെട്ടതിനാൽ %s പുതുക്കുവാൻ സാധ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1322 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "പുതുക്കുവാൻ സാധ്യമല്ല: ഇന്റർനെറ്റ് പ്രവേശനം ആവശ്യമാണ് പക്ഷേ ലഭ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1330 +msgid "Unable to update %s: not enough disk space" +msgstr "%s പുതുക്കുവാൻ സാധ്യമല്ല: ആവശ്യത്തിന് സ്ഥലം ഡിസ്കിലില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1339 +msgid "Unable to update %s: authentication was required" +msgstr "%s പുതുക്കുവാൻ സാധ്യമല്ല: പ്രാമാണീകരണം ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1346 +msgid "Unable to update %s: authentication was invalid" +msgstr "%s പുതുക്കുവാൻ സാധ്യമല്ല: പ്രാമാണീകരണം അസാധുവായിരുന്നു" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1353 +msgid "Unable to update %s: you do not have permission to update software" +msgstr "%s പുതുക്കുവാൻ സാധ്യമല്ല: സോഫ്റ്റ്‌വെയർ പുതുക്കുവാൻ നിങ്ങൾക്ക് അനുമതിയില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1361 +msgid "Unable to update %s: AC power is required" +msgstr "%s പുതുക്കുവാൻ സാധ്യമല്ല: എസി വൈദ്യുതി ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1370 +msgid "Unable to update %s" +msgstr "%s പുതുക്കുവാൻ സാധ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1415 +msgid "Unable to upgrade to %s from %s" +msgstr "%s ൽ നിന്ന് %s നവീകരിക്കാൻ സാധ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1420 +msgid "Unable to upgrade to %s as download failed" +msgstr "ഡൗൺലോഡ് പരാജയപ്പെട്ടതിനാൽ %s നവീകരിക്കാൻ സാധ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1427 +msgid "Unable to upgrade: internet access was required but wasn’t available" +msgstr "നവീകരിക്കാൻ സാധ്യമല്ല: ഇന്റർനെറ്റ് പ്രവേശനം ആവശ്യമാണ് പക്ഷേ ലഭ്യമല്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1435 +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "%s നവീകരിക്കാൻ സാധ്യമല്ല: ആവശ്യത്തിന് സ്ഥലം ഡിസ്കിലില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1444 +msgid "Unable to upgrade to %s: authentication was required" +msgstr "%s നവീകരിക്കാൻ സാധ്യമല്ല: പ്രാമാണീകരണം ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1451 +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "%s എന്നതിലേക്ക് നവീകരിക്കാൻ കഴിഞ്ഞില്ല: പ്രാമാണീകരണം അസാധുവാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1458 +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "%s എന്നതിലേക്ക് നവീകരിക്കാൻ കഴിഞ്ഞില്ല: നിങ്ങൾക്ക് നവീകരിക്കാൻ അനുമതിയില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1465 +msgid "Unable to upgrade to %s: AC power is required" +msgstr "%s എന്നതിലേക്ക് നവീകരിക്കാൻ കഴിഞ്ഞില്ല: ഏസി വിദ്യുച്ഛക്തി ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1474 +msgid "Unable to upgrade to %s" +msgstr "%s എന്നതിലേക്ക് നവീകരിക്കാൻ കഴിഞ്ഞില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1516 +msgid "Unable to remove %s: authentication was required" +msgstr "%s നീക്കം ചെയ്യാൻ കഴിയുന്നില്ല: പ്രാമാണീകരണം ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1522 +msgid "Unable to remove %s: authentication was invalid" +msgstr "%s നീക്കം ചെയ്യാൻ കഴിയുന്നില്ല: പ്രാമാണീകരണം അസാധുവായിരുന്നു" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1528 +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "%s നീക്കം ചെയ്യാൻ കഴിയുന്നില്ല: നിങ്ങൾക്ക് സോഫ്റ്റ്‌വെയർ നീക്കം ചെയ്യാനുള്ള അനുമതിയില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1535 +msgid "Unable to remove %s: AC power is required" +msgstr "%s നീക്കം ചെയ്യാൻ കഴിയുന്നില്ല: ഏസി പവർ ആവശ്യമാണ്" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1547 +msgid "Unable to remove %s" +msgstr "%s നീക്കം ചെയ്യാൻ കഴിയുന്നില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1593 +msgid "Unable to launch %s: %s is not installed" +msgstr "%s തുടങ്ങാൻ കഴിയുന്നില്ല: %s ഇൻസ്റ്റാൾ ചെയ്തില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1600 src/gs-shell.c:1654 src/gs-shell.c:1698 +#: src/gs-shell.c:1749 +msgid "Not enough disk space — free up some space and try again" +msgstr "ആവശ്യമായ ഡിസ്ക് സ്ഥലം ലഭ്യമല്ല - കുറച്ച് സ്ഥലം ശൂന്യമാക്കി വീണ്ടും ശ്രമിക്കുക" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1611 src/gs-shell.c:1665 src/gs-shell.c:1709 +#: src/gs-shell.c:1779 +msgid "Sorry, something went wrong" +msgstr "ക്ഷമിക്കണം, എന്തോ കുഴപ്പം സംഭവിച്ചു" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1646 +msgid "Failed to install file: not supported" +msgstr "ഫയൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു: പിന്തുണയ്ക്കുന്നില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1650 +msgid "Failed to install file: authentication failed" +msgstr "ഫയൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു: പ്രാമാണീകരണം പരാജയപ്പെട്ടു" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1690 +msgid "Failed to install: not supported" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു: പിന്തുണയ്ക്കുന്നില്ല" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1694 +msgid "Failed to install: authentication failed" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു: പ്രാമാണീകരണം പരാജയപ്പെട്ടു" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1743 +msgid "Unable to contact %s" +msgstr "%s മായി ബന്ധപ്പെടാനായില്ല" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1758 +msgid "%s needs to be restarted to use new plugins." +msgstr "പുതിയ പ്ലഗിനുകൾ ഉപയോഗിക്കുന്നതിന് %s പുനരാരംഭിക്കേണ്ടതുണ്ട്." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1763 +msgid "This application needs to be restarted to use new plugins." +msgstr "പുതിയ പ്ലഗിന്നുകൾ ഉപയോഗിക്കുന്നതിന് ഈ അപ്ലിക്കേഷൻ പുനരാരംഭിക്കേണ്ടതുണ്ട്." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1770 +msgid "AC power is required" +msgstr "എസി വൈദ്യുതി ആവശ്യമാണ്" + +#. TRANSLATORS: menu item that signs into the named account with a particular username +#: src/gs-shell.c:2146 +msgid "Signed in into %s as %s" +msgstr "%s ആയി %s സൈൻ ഇൻ ചെയ്തു" + +#. TRANSLATORS: menu item that signs into the named account +#: src/gs-shell.c:2151 +msgid "Sign in to %s…" +msgstr "%s ലേക്ക് സൈൻ ഇൻ ചെയ്യുക…" + +#. TRANSLATORS: menu item for signing out from the named account +#: src/gs-shell.c:2159 +msgid "Sign out from %s" +msgstr "%s ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യുക" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-shell-search-provider.c:270 +msgid "Source: %s" +msgstr "ഉറവിടം:%s" + +#: src/gs-summary-tile.c:80 +msgid "%s (Installing)" +msgstr "%s (ഇൻസ്റ്റാൾ ചെയ്യുന്നു)" + +#: src/gs-summary-tile.c:85 +msgid "%s (Removing)" +msgstr "%s (നീക്കം ചെയ്യുന്നു)" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for removing multiple repos +#: src/gs-third-party-repo-row.c:106 +msgid "_Remove All" +msgstr "എല്ലാം നീക്കം ചെയ്യുക(_R)" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:131 +msgid "No update description available." +msgstr "പുതുക്കൽ വിവരണമൊന്നും ലഭ്യമല്ല." + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:226 +msgid "Installed on %s" +msgstr "%s ൽ ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:246 +msgid "Installed Updates" +msgstr "പുതുക്കലുകൾ ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:452 +msgid "Additions" +msgstr "കൂട്ടിച്ചേർക്കലുകൾ" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:456 +msgid "Removals" +msgstr "നീക്കം ചെയ്യൽ" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:460 +msgid "Updates" +msgstr "പുതുക്കലുകൾ" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:464 +msgid "Downgrades" +msgstr "തരാം താഴ്ത്തുക" + +#: src/gs-update-dialog.ui:100 +msgid "No updates have been installed on this system." +msgstr "ഈ സിസ്റ്റത്തിൽ ഒരു പുതുക്കലുകളും ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല." + +#: src/gs-update-monitor.c:113 +msgid "Security Updates Pending" +msgstr "സുരക്ഷാ പുതുക്കലുകൾ ശേഷിക്കുന്നു" + +#: src/gs-update-monitor.c:114 +msgid "It is recommended that you install important updates now" +msgstr "നിങ്ങൾ പ്രധാനപ്പെട്ട പുതുക്കലുകൾ ഇപ്പോൾ ഇൻസ്റ്റാൾ ചെയ്യണമെന്ന് ശുപാർശ ചെയ്തിട്ടുണ്ട്" + +#: src/gs-update-monitor.c:117 +msgid "Restart & Install" +msgstr "പുനരാരംഭിക്കുക & ഇൻസ്റ്റാൾ ചെയ്യുക" + +#: src/gs-update-monitor.c:121 +msgid "Software Updates Available" +msgstr "സോഫ്റ്റ്‌വെയർ പുതുക്കലുകൾ ലഭ്യമാണ്" + +#: src/gs-update-monitor.c:122 +msgid "Important OS and application updates are ready to be installed" +msgstr "പ്രധാനപ്പെട്ട OS, അപ്ലിക്കേഷൻ പുതുക്കലുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ തയാറാണ്" + +#. TRANSLATORS: button text +#: src/gs-update-monitor.c:125 src/gs-updates-section.c:307 +msgid "Not Now" +msgstr "ഇപ്പോൾ വേണ്ട" + +#: src/gs-update-monitor.c:126 +msgid "View" +msgstr "കാണുക" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:224 +msgid "%u Application Updated — Restart Required" +msgid_plural "%u Applications Updated — Restart Required" +msgstr[0] "%u അപ്ലിക്കേഷന് പുതുക്കി- പുനരാരംഭിക്കേണ്ടതുണ്ട്" +msgstr[1] "%u അപ്ലിക്കേഷനുകൾ പുതുക്കി- പുനരാരംഭിക്കേണ്ടതുണ്ട്" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:230 +msgid "%u Application Updated" +msgid_plural "%u Applications Updated" +msgstr[0] "%u അപ്ലിക്കേഷന് പുതുക്കി" +msgstr[1] "%u അപ്ലിക്കേഷനുകൾ പുതുക്കി" + +#. TRANSLATORS: %1 is an application name, e.g. Firefox +#: src/gs-update-monitor.c:241 +msgid "%s has been updated." +msgstr "%s പുതുക്കി." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:244 +msgid "Please restart the application." +msgstr "ദയവായി അപ്ലിക്കേഷൻ പുനരാരംഭിക്കുക." + +#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox +#: src/gs-update-monitor.c:252 +msgid "%s and %s have been updated." +msgstr "%s , %s എന്നിവ പുതുക്കി." + +#. TRANSLATORS: at least one application needs restarting +#: src/gs-update-monitor.c:258 src/gs-update-monitor.c:277 +msgid "%u application requires a restart." +msgid_plural "%u applications require a restart." +msgstr[0] "%u അപ്ലിക്കേഷന് ഒരു പുനരാരംഭിക്കേണ്ടതുണ്ട്." +msgstr[1] "%u അപ്ലിക്കേഷനുകൾ ഒരു പുനരാരംഭിക്കേണ്ടതുണ്ട്." + +#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox +#: src/gs-update-monitor.c:270 +msgid "Includes %s, %s and %s." +msgstr "%s , %s , %s എന്നിവ ഉൾപ്പെടുന്നു." + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:486 src/gs-updates-page.ui:43 +msgid "Operating System Updates Unavailable" +msgstr "ഓപ്പറേറ്റിംഗ് സിസ്റ്റം പുതുക്കലുകൾ ലഭ്യമല്ല" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:488 +msgid "Upgrade to continue receiving security updates." +msgstr "സുരക്ഷ പുതുക്കലുകൾ തുടർന്നും ലഭിക്കുന്നതിന് നവീകരിക്കുക." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:543 +msgid "A new version of %s is available to install" +msgstr "ഇൻസ്റ്റാൾ ചെയ്യാൻ %s എന്ന പുതിയ പതിപ്പ് ലഭ്യമാണ്" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:547 +msgid "Software Upgrade Available" +msgstr "സോഫ്റ്റ്‌വെയർ നവീകരണം ലഭ്യമാണ്" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:858 +msgid "Software Updates Failed" +msgstr "സോഫ്റ്റ്‌വെയർ പുതുക്കലുകൾ പരാജയപ്പെട്ടു" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:860 +msgid "An important OS update failed to be installed." +msgstr "ഒരു പ്രധാനപ്പെട്ട ഓഎസ് പുതുക്കൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു." + +#: src/gs-update-monitor.c:861 +msgid "Show Details" +msgstr "വിശദാംശങ്ങൾ കാണിക്കുക" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:884 +msgid "System Upgrade Complete" +msgstr "സിസ്റ്റം നവീകരണം പൂർത്തിയായി" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:889 +msgid "Welcome to %s %s!" +msgstr "%s %s ലേക്ക് സ്വാഗതം!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:895 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "സോഫ്റ്റ്‌വെയർ പുതുക്കൽ ഇൻസ്റ്റാൾ ചെയ്തു" +msgstr[1] "സോഫ്റ്റ്‌വെയർ പുതുക്കലുകൾ ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:899 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "ഒരു പ്രധാനപ്പെട്ട ഓഎസ് പുതുക്കൽ ഇൻസ്റ്റാൾ ചെയ്തു." +msgstr[1] "ഒരു പ്രധാനപ്പെട്ട ഓഎസ് പുതുക്കലുകൾ ഇൻസ്റ്റാൾ ചെയ്തു." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:910 +msgctxt "updates" +msgid "Review" +msgstr "അവലോകനം ചെയ്യുക" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:958 +msgid "Failed To Update" +msgstr "പുതുക്കുന്നതിൽ പരാജയപ്പെട്ടു" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:964 +msgid "The system was already up to date." +msgstr "സിസ്റ്റം കാലികമായിരുന്നു." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:969 +msgid "The update was cancelled." +msgstr "പുതുക്കൽ റദ്ദാക്കി." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:975 +msgid "Internet access was required but wasn’t available. Please make sure that you have internet access and try again." +msgstr "ഇന്റർനെറ്റ് ഉപയോഗം ആവശ്യമാണെങ്കിലും ലഭ്യമല്ല. നിങ്ങൾക്ക് ഇന്റർനെറ്റ് പ്രവേശനം ഉണ്ടെന്ന് ഉറപ്പുവരുത്തി വീണ്ടും ശ്രമിക്കുക." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:981 +msgid "There were security issues with the update. Please consult your software provider for more details." +msgstr "പരിഷ്‌കരിച്ചതിൽ സുരക്ഷാ പ്രശ്നങ്ങൾ ഉണ്ടായിരുന്നു. കൂടുതൽ വിവരങ്ങൾക്കായി നിങ്ങളുടെ സോഫ്റ്റ്‌വെയർ ദാതാവുമായി ബന്ധപ്പെടുക." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:987 +msgid "There wasn’t enough disk space. Please free up some space and try again." +msgstr "മതിയായ സ്ഥലം ഡിസ്കിൽ ഇല്ലായിരുന്നു. കുറച്ച് സ്ഥലം ശൂന്യമാക്കി വീണ്ടും ശ്രമിക്കുക." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:992 +msgid "We’re sorry: the update failed to install. Please wait for another update and try again. If the problem persists, contact your software provider." +msgstr "ക്ഷമിക്കണം: ഇൻസ്റ്റാൾ ചെയ്യുന്നതിന് പുതുക്കൽ പരാജയപ്പെട്ടു. മറ്റൊരു പുതുക്കലിനായി കാത്തിരുന്ന് വീണ്ടും ശ്രമിക്കുക. പ്രശ്നം നിലനിൽക്കുകയാണെങ്കിൽ, നിങ്ങളുടെ സോഫ്റ്റ്‌വെയർ ദാതാവിനെ ബന്ധപ്പെടുക." + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:241 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:244 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:250 +msgid "Yesterday, %R" +msgstr "ഇന്നലെ,%R ന്" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:254 +msgid "Yesterday, %l:%M %p" +msgstr "ഇന്നലെ, %l:%M %p" + +#: src/gs-updates-page.c:257 +msgid "Two days ago" +msgstr "രണ്ട് ദിവസം മുമ്പ്" + +#: src/gs-updates-page.c:259 +msgid "Three days ago" +msgstr "മൂന്ന് ദിവസം മുമ്പ്" + +#: src/gs-updates-page.c:261 +msgid "Four days ago" +msgstr "നാല് ദിവസം മുമ്പ്" + +#: src/gs-updates-page.c:263 +msgid "Five days ago" +msgstr "അഞ്ച് ദിവസം മുമ്പ്" + +#: src/gs-updates-page.c:265 +msgid "Six days ago" +msgstr "ആറ് ദിവസം മുമ്പ്" + +#: src/gs-updates-page.c:267 +msgid "One week ago" +msgstr "ഒരാഴ്ച മുമ്പ്" + +#: src/gs-updates-page.c:269 +msgid "Two weeks ago" +msgstr "രണ്ടു ആഴ്ച മുമ്പ്" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-updates-page.c:273 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the updates are being downloaded +#: src/gs-updates-page.c:286 +msgid "Downloading new updates…" +msgstr "പുതിയ പുതുക്കലുകൾ ഡൗൺലോഡ് ചെയ്യുന്നു…" + +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:290 +msgid "Looking for new updates…" +msgstr "പുതിയ പുതുക്കലുകൾ തിരയുന്നു…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:359 +msgid "Setting up updates…" +msgstr "പുതുക്കലുകൾ സജ്ജീകരിക്കുന്നു…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:360 src/gs-updates-page.c:367 +msgid "(This could take a while)" +msgstr "(ഇതിന് കുറച്ച് സമയമെടുത്തേക്കാം)" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:466 +msgid "Last checked: %s" +msgstr "അവസാനം പരിശോധിച്ചത്: %s" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:637 +msgid "%s %s is no longer supported." +msgstr "%s %s നെ ഇനി പിന്തുണയ്ക്കില്ല." + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:642 +msgid "Your OS is no longer supported." +msgstr "നിങ്ങളുടെ ഓഎസ് ഇനി പിന്തുണയ്ക്കില്ല." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:647 +msgid "This means that it does not receive security updates." +msgstr "ഇത് സുരക്ഷാ പുതുക്കലുകൾ ലഭിക്കുന്നില്ലെന്നാണ് ഇതിനർത്ഥം." + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:651 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "ഏറ്റവും പുതിയ പതിപ്പിലേക്ക് നിങ്ങൾ നവീകരിക്കാൻ ശുപാർശചെയ്യുന്നു." + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:900 +msgid "Charges may apply" +msgstr "നിരക്കുകൾ ബാധകമാകാം" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:904 +msgid "Checking for updates while using mobile broadband could cause you to incur charges." +msgstr "മൊബൈൽ ബ്രോഡ്ബാൻഡ് ഉപയോഗിക്കുന്ന സമയത്ത് പുതുക്കലുകൾക്കായി പരിശോധിക്കുന്നത് ചാർജുകളെ ബാധിക്കും." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:908 +msgid "Check Anyway" +msgstr "എന്തായാലും പരിശോധിക്കുക" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:924 +msgid "No Network" +msgstr "നെറ്റ് വർക്കില്ല" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:928 +msgid "Internet access is required to check for updates." +msgstr "പുതുക്കൽ പരിശോധിക്കാൻ ഇന്റർനെറ്റ് പ്രവേശനം ആവശ്യമാണ്." + +#. This label indicates that the update check is in progress +#: src/gs-updates-page.c:1351 +msgid "Checking…" +msgstr "പരിശോധിക്കുന്നു…" + +#: src/gs-updates-page.c:1364 +msgid "Check for updates" +msgstr "പുതുക്കലുകൾക്കായി പരിശോധിക്കുക" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "പുതുക്കൽ താൾ" + +#: src/gs-updates-page.ui:177 +msgid "Software is up to date" +msgstr "സോഫ്റ്റ്‌വെയർ കാലികമാണ്" + +#: src/gs-updates-page.ui:225 +msgid "Checking for updates when using mobile broadband could cause you to incur charges" +msgstr "മൊബൈൽ ബ്രോഡ്ബാൻഡ് ഉപയോഗിക്കുമ്പോൾ നിങ്ങൾക്ക് പുതുക്കലുകൾക്കായി പരിശോധിക്കുന്നത് ചാർജുകളെ ബാധിക്കും" + +#: src/gs-updates-page.ui:237 +msgid "_Check Anyway" +msgstr "എന്തായാലും പരിശോധിക്കുക(_C)" + +#: src/gs-updates-page.ui:273 +msgid "Go online to check for updates" +msgstr "പുതുക്കലുകൾക്കായി പരിശോധിക്കുന്നതിനായി ഓൺലൈനിൽ പോകുക" + +#: src/gs-updates-page.ui:284 +msgid "_Network Settings" +msgstr "ശൃംഖല സജ്ജീകരണങ്ങൾ(_N)" + +#: src/gs-updates-page.ui:357 +msgid "Updates are automatically managed" +msgstr "പുതുക്കലുകൾ യാന്ത്രികമായി കൈകാര്യം ചെയ്യുന്നു" + +#. TRANSLATORS: This is the button for upgrading all +#. * offline updates +#: src/gs-updates-section.c:257 +msgid "Restart & Update" +msgstr "പുനരാരംഭിക്കുക & പുതുക്കുക" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-section.c:263 +msgid "Update All" +msgstr "എല്ലാം പുതുക്കുക" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-updates-section.c:303 +msgid "Updates have been installed" +msgstr "പുതുക്കുക്കിയത് ഇൻസ്റ്റാൾ ചെയ്തു" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-updates-section.c:305 +msgid "A restart is required for them to take effect." +msgstr "അവ പ്രാബല്യത്തിൽ വരാൻ പുനരാരംഭിക്കേണ്ടതുണ്ട്." + +#. TRANSLATORS: button text +#: src/gs-updates-section.c:309 +msgid "Restart" +msgstr "പുനരാരംഭിക്കുക" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:389 +msgid "Integrated Firmware" +msgstr "സംയോജിത ഫേംവെയർ" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:393 +msgid "Requires Restart" +msgstr "പുനരാരംഭിക്കേണ്ടതുണ്ട്" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:397 +msgid "Application Updates" +msgstr "അപ്ലിക്കേഷൻ പുതുക്കലുകൾ" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:401 +msgid "Device Firmware" +msgstr "ഉപകരണ ഫേംവെയർ" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:85 +msgid "%s %s Now Available" +msgstr "%s %s ഇപ്പോൾ ലഭ്യമാണ്" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:95 +msgid "Downloading %s %s" +msgstr "%s %s ഡൗൺലോഡ് ചെയ്യുന്നു" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:106 +msgid "%s %s Ready to be Installed" +msgstr "%s %s ഇൻസ്റ്റാൾ ചെയ്യാൻ തയ്യാറായിക്കഴിഞ്ഞു" + +#: src/gs-upgrade-banner.ui:30 +msgid "A major upgrade, with new features and added polish." +msgstr "ഒരു പുതിയ നവീകരണവും പുതിയ സവിശേഷതകളും ചേർത്തിരിയ്ക്കുന്നു." + +#: src/gs-upgrade-banner.ui:50 +msgid "_Learn More" +msgstr "കൂടുതലറിയാൻ(_L)" + +#: src/gs-upgrade-banner.ui:85 +msgid "It is recommended that you back up your data and files before upgrading." +msgstr "നവീകരിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ ഡാറ്റയും ഫയലുകളും ബാക്കപ്പ് ചെയ്യുന്നതിന് ശുപാർശചെയ്യുന്നു." + +#: src/gs-upgrade-banner.ui:102 +msgid "_Download" +msgstr "ഡൗൺലോഡ് ചെയ്യുക(_D)" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "ഈ കമ്പ്യൂട്ടറിൽ സോഫ്റ്റ്‌വെയർ ചേർക്കുക, നീക്കംചെയ്യുക അല്ലെങ്കിൽ പുതുക്കുക" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/org.gnome.Software.desktop.in:6 +#: src/org.gnome.Software.Editor.desktop.in:6 +msgid "org.gnome.Software" +msgstr "org.gnome.Software" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "പുതുക്കലുകൾ;നവീകരണങ്ങൾ;ഉറവിടങ്ങൾ;റിപ്പോസിറ്ററികൾ;മുൻഗണനകൾ;ഇൻസ്റ്റാൾ ചെയ്യുക;അൺഇൻസ്റ്റാൾ ചെയ്യുക;പ്രോഗ്രാം;സോഫ്റ്റ്‌വെയർ;ആപ്പ്;കലവറ;" + +#: src/org.gnome.Software.Editor.desktop.in:4 +msgid "Design the featured banners for GNOME Software" +msgstr "ഗ്നോം സോഫ്റ്റ്‌വെയറിനായുള്ള വിശേഷണ അറിയിപ്പുകൾ രൂപകൽപ്പന ചെയ്യുക" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.Editor.desktop.in:13 +msgid "AppStream;Software;App;" +msgstr "ആപ്പ്സ്ട്രീം;സോഫ്റ്റ്‌വെയർ;അപ്ലിക്കേഷൻ;" + +#: plugins/core/gs-desktop-common.c:30 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:33 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:36 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "ശബ്ദ രചനയും ചിട്ടപ്പെടുത്താലും" + +#: plugins/core/gs-desktop-common.c:42 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "സംഗീത സഹായികൾ" + +#: plugins/core/gs-desktop-common.c:51 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:54 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:57 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "ഡീബഗ്ഗർമാർ" + +#: plugins/core/gs-desktop-common.c:60 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE- കൾ" + +#: plugins/core/gs-desktop-common.c:69 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:73 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:77 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "നിർമ്മിത ബുദ്ധി" + +#: plugins/core/gs-desktop-common.c:80 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "ജ്യോതിശാസ്ത്രം" + +#: plugins/core/gs-desktop-common.c:84 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "രസതന്ത്രം" + +#: plugins/core/gs-desktop-common.c:88 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "ഭാഷകൾ" + +#: plugins/core/gs-desktop-common.c:92 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "ഗണിതം" + +#: plugins/core/gs-desktop-common.c:99 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "യന്ത്രസംവിധാനം" + +#: plugins/core/gs-desktop-common.c:108 +msgctxt "Menu of Games" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:111 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:114 +msgctxt "Menu of Games" +msgid "Action" +msgstr "പ്രവർത്തനം" + +#: plugins/core/gs-desktop-common.c:117 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "സാഹസികത" + +#: plugins/core/gs-desktop-common.c:120 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "ആർക്കേഡ്" + +#: plugins/core/gs-desktop-common.c:123 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "ബ്ലോക്കുകൾ" + +#: plugins/core/gs-desktop-common.c:126 +msgctxt "Menu of Games" +msgid "Board" +msgstr "പലക" + +#: plugins/core/gs-desktop-common.c:129 +msgctxt "Menu of Games" +msgid "Card" +msgstr "കാർഡ്" + +#: plugins/core/gs-desktop-common.c:132 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "അനുകരണം" + +#: plugins/core/gs-desktop-common.c:135 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "കുട്ടികൾ" + +#: plugins/core/gs-desktop-common.c:138 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "യുക്തിപരമായ" + +#: plugins/core/gs-desktop-common.c:141 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "കഥാപാത്ര പ്രവർത്തനം" + +#: plugins/core/gs-desktop-common.c:144 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "കായികം" + +#: plugins/core/gs-desktop-common.c:148 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "തന്ത്രം" + +#: plugins/core/gs-desktop-common.c:156 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:159 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:162 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D ഗ്രാഫിക്സ്" + +#: plugins/core/gs-desktop-common.c:165 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "ഛായാഗ്രഹണം" + +#: plugins/core/gs-desktop-common.c:168 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "സ്കാൻ ചെയ്യുന്നു" + +#: plugins/core/gs-desktop-common.c:171 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "വെക്റ്റർ ഗ്രാഫിക്സ്" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "കാഴ്ചക്കാർ" + +#: plugins/core/gs-desktop-common.c:182 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:185 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:188 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "കലണ്ടർ" + +#: plugins/core/gs-desktop-common.c:192 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "ഡാറ്റാബേസ്" + +#: plugins/core/gs-desktop-common.c:195 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "ധനകാര്യം" + +#: plugins/core/gs-desktop-common.c:199 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "വേഡ് പ്രോസസർ" + +#: plugins/core/gs-desktop-common.c:208 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "ഫോണ്ടുകൾ" + +#: plugins/core/gs-desktop-common.c:211 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "കോഡെക്കുകൾ" + +#: plugins/core/gs-desktop-common.c:214 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "ഇൻപുട്ട് ഉറവിടങ്ങൾ" + +#: plugins/core/gs-desktop-common.c:217 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "ഭാഷ കൂട്ടം" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Add-ons" +msgid "Shell Extensions" +msgstr "ഷെൽ എക്സ്റ്റെൻഷനുകൾ" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "പ്രാദേശികവൽക്കരണം" + +#: plugins/core/gs-desktop-common.c:226 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "ഹാർഡ്‌വെയർ ഡ്രൈവറുകൾ" + +#: plugins/core/gs-desktop-common.c:234 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:237 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:240 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "സംഭാഷണം" + +#: plugins/core/gs-desktop-common.c:247 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "വാർത്ത" + +#: plugins/core/gs-desktop-common.c:251 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "വെബ് ബ്രൗസറുകൾ" + +#: plugins/core/gs-desktop-common.c:259 +msgctxt "Menu of Utilities" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:262 +msgctxt "Menu of Utilities" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:265 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "ടെക്സ്റ്റ് എഡിറ്ററുകൾ" + +#: plugins/core/gs-desktop-common.c:273 +msgctxt "Menu of Reference" +msgid "All" +msgstr "എല്ലാം" + +#: plugins/core/gs-desktop-common.c:276 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "സവിശേഷമായവ" + +#: plugins/core/gs-desktop-common.c:279 +msgctxt "Menu of Art" +msgid "Art" +msgstr "കല" + +#: plugins/core/gs-desktop-common.c:282 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "ജീവചരിത്രം" + +#: plugins/core/gs-desktop-common.c:285 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "കോമിക്സ്" + +#: plugins/core/gs-desktop-common.c:288 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "കല്‍പിതം" + +#: plugins/core/gs-desktop-common.c:291 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "ആരോഗ്യം" + +#: plugins/core/gs-desktop-common.c:294 +msgctxt "Menu of Reference" +msgid "History" +msgstr "ചരിത്രം" + +#: plugins/core/gs-desktop-common.c:297 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "ജീവിതശൈലി" + +#: plugins/core/gs-desktop-common.c:300 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "രാഷ്ട്രീയം" + +#: plugins/core/gs-desktop-common.c:303 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "ഡെവലപ്പർ ഉപകരണങ്ങൾ" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: plugins/core/gs-desktop-common.c:313 +msgid "Audio & Video" +msgstr "ശബ്ദവും ചലച്ചിത്രവും" + +#. TRANSLATORS: this is the menu spec main category for Development +#: plugins/core/gs-desktop-common.c:316 +msgid "Developer Tools" +msgstr "ഡെവലപ്പർ ഉപകരണങ്ങൾ" + +#. TRANSLATORS: this is the menu spec main category for Education & Science +#: plugins/core/gs-desktop-common.c:319 +msgid "Education & Science" +msgstr "വിദ്യാഭ്യാസവും ശാസ്ത്രവും" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:322 +msgid "Games" +msgstr "വിനോദങ്ങൾ" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: plugins/core/gs-desktop-common.c:325 +msgid "Graphics & Photography" +msgstr "ഗ്രാഫിക്സും ഛായാഗ്രഹണവും" + +#. TRANSLATORS: this is the menu spec main category for Office +#: plugins/core/gs-desktop-common.c:328 +msgid "Productivity" +msgstr "ഉത്പാദനക്ഷമത" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: plugins/core/gs-desktop-common.c:334 +msgid "Communication & News" +msgstr "ആശയവിനിമയവും വാർത്തയും" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:337 +msgid "Reference" +msgstr "പരാമര്‍ശം" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:340 +msgid "Utilities" +msgstr "ആവശ്യവസ്തുകൾ" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:73 +msgid "OS Updates" +msgstr "OS പുതുക്കലുകൾ" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:78 +msgid "Includes performance, stability and security improvements." +msgstr "പ്രകടനം, സ്ഥിരത, സുരക്ഷാ മെച്ചപ്പെടുത്തലുകൾ എന്നിവ ഉൾപ്പെടുന്നു." + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:55 +msgid "Downloading featured images…" +msgstr "സവിശേഷമായ ചിത്രങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്നു…" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "വെബ് അപ്ലിക്കേഷനുകളുടെ പിന്തുണ" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "ജനപ്രിയ ബ്രൗസറിൽ വെബ് ആപ്ലിക്കേഷനുകൾ പ്രവർത്തിപ്പിക്കുക" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:112 +msgid "GNOME Software AppStream system-wide installer" +msgstr "ഗ്നോം സോഫ്റ്റ്‌വെയർ ആപ്പ്സ്ട്രീം സിസ്റ്റം-മുഴുകെയുള്ള ഇൻസ്റ്റാളർ" + +#: plugins/external-appstream/gs-install-appstream.c:114 +msgid "Failed to parse command line arguments" +msgstr "നിര്‍ദേശ ലൈൻ ആർഗ്യുമെന്റുകൾ വിശകലനം ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:121 +msgid "You need to specify exactly one filename" +msgstr "നിങ്ങൾ ഒരു ഫയൽനാമം വ്യക്തമാക്കേണ്ടതുണ്ട്" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:128 +msgid "This program can only be used by the root user" +msgstr "ഈ പ്രയോഗം റൂട്ട് ഉപയോക്താവിനായി മാത്രം ഉപയോഗിയ്ക്കുവാൻ സാധിയ്ക്കുന്നു" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:136 +msgid "Failed to validate content type" +msgstr "ഉള്ളടക്ക തരം സാധൂകരിക്കുന്നതിൽ പരാജയപ്പെട്ടു" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:143 +msgid "Failed to copy" +msgstr "പകർത്തുന്നത് പരാജയപ്പെട്ടു" + +#. TRANSLATORS: status text when downloading +#: plugins/external-appstream/gs-plugin-external-appstream.c:243 +msgid "Downloading extra metadata files…" +msgstr "അധിക മെറ്റാഡാറ്റ ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യുന്നു…" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:217 +msgid "Downloading upgrade information…" +msgstr "നവീകരണ വിവരം ഡൗൺലോഡ് ചെയ്യുന്നു…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:308 +msgid "Upgrade for the latest features, performance and stability improvements." +msgstr "ഏറ്റവും പുതിയ സവിശേഷതകൾ, പ്രകടനം, സ്ഥിരത മെച്ചപ്പെടുത്തലുകൾ എന്നിവയ്ക്കായുള്ള നവീകരണം." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "ഫ്ലാറ്റ്പാക്ക് പിന്തുണ" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "ലിനക്സിൽ പണിയിട പ്രയോഗങ്ങൾക്കു വേണ്ടിയുള്ള ഒരു ചട്ടക്കൂടാണ് ഫ്ളാറ്റ്പാക്ക്" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:571 +msgid "Getting flatpak metadata for %s…" +msgstr "%s എന്നതിനായി ഫ്ളാറ്റ്പാക്ക് മെറ്റാഡാറ്റ സ്വീകരിക്കുന്നു…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:673 +msgid "Downloading firmware update signature…" +msgstr "ഫേംവെയർ പുതുക്കൽ സിഗ്നേച്ചർ ഡൗൺലോഡ് ചെയ്യുന്നു…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:714 +msgid "Downloading firmware update metadata…" +msgstr "ഫേംവെയർ പുതുക്കൽ മെറ്റാഡാറ്റ ഡൗൺലോഡ് ചെയ്യുന്നു…" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "ഫേംവെയർ നവീകരണ പിന്തുണ" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "ഫേംവെയർ നവീകരിക്കാനുള്ള പിന്തുണ ലഭ്യമാക്കുന്നു" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:205 +msgid "Downloading application ratings…" +msgstr "അപ്ലിക്കേഷൻ മൂല്യം ഡൗൺലോഡ് ചെയ്യുന്നു…" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "ഡെസ്ക്ടോപ്പ് മൂല്യങ്ങളുടെ പിന്തുണ തുറക്കുക" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "ആപ്ലിക്കേഷനുകളുടെ ഉപയോക്തൃ അവലോകനങ്ങൾ നൽകുന്ന ഒരു സേവനമാണ് ODRS" + +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:392 +msgid "GNOME Shell Extensions Repository" +msgstr "ഗ്നോം ഷെൽ എക്സ്റ്റെൻഷനുകൾ റിപോസിറ്ററി" + +#. TRANSLATORS: status text when downloading +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:704 +msgid "Downloading shell extension metadata…" +msgstr "ഷെൽ എക്സ്റ്റൻഷൻ മെറ്റാഡാറ്റ ഡൗൺലോഡ് ചെയ്യുന്നു…" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:209 +msgid "Snap Store" +msgstr "സ്നാപ്പ് കലവറ" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snappy Support" +msgstr "സ്നാപ്പ് പിന്തുണ" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "സ്നാപ്പ് ഒരു സാർവത്രിക ലിനക്സ് പാക്കേജാണ്" diff --git a/po/mr.po b/po/mr.po new file mode 100644 index 0000000..16cf419 --- /dev/null +++ b/po/mr.po @@ -0,0 +1,3881 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Translators: +# Roddy Shuler , 2017 +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-06-12 13:14-0700\n" +"PO-Revision-Date: 2018-06-12 20:17+0000\n" +"Last-Translator: Roddy Shuler \n" +"Language-Team: Marathi (http://www.transifex.com/endless-os/gnome-software/language/mr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1007 +msgid "The GNOME Project" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in:11 +msgid "Install an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in:12 +msgid "Installing an appstream file into a system location" +msgstr "" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates in GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel and not perform any " +"automatic updates actions." +msgstr "" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Whether to automatically perform updates" +msgstr "" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads and installs updates in " +"the background (except for some app types like packages, where it prompts " +"the user to install them when ready)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:29 +msgid "Show star ratings next to applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:33 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" + +#: data/org.gnome.software.gschema.xml:37 +msgid "Non-free applications show a warning dialog before install" +msgstr "" + +#: data/org.gnome.software.gschema.xml:38 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This" +" controls if that dialog is suppressed." +msgstr "" + +#: data/org.gnome.software.gschema.xml:42 +msgid "A list of popular applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:43 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The list of extra sources that have been previously enabled" +msgstr "" + +#: data/org.gnome.software.gschema.xml:48 +msgid "" +"The list of sources that have been previously enabled when installing third-" +"party applications." +msgstr "" + +#: data/org.gnome.software.gschema.xml:52 +msgid "The last update check timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:56 +msgid "The last upgrade notification timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:60 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" + +#: data/org.gnome.software.gschema.xml:64 +msgid "The last update timestamp" +msgstr "" + +#: data/org.gnome.software.gschema.xml:68 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:69 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0" +" means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:78 +msgid "The server to use for application reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:82 +msgid "The minimum karma score for reviews" +msgstr "" + +#: data/org.gnome.software.gschema.xml:83 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" + +#: data/org.gnome.software.gschema.xml:87 +msgid "A list of official sources that should not be considered 3rd party" +msgstr "" + +#: data/org.gnome.software.gschema.xml:91 +msgid "A list of official sources that should be considered free software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:95 +msgid "" +"The licence URL to use when an application should be considered free " +"software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:99 +msgid "" +"Install bundled applications for all users on the system where possible" +msgstr "" + +#: data/org.gnome.software.gschema.xml:103 +msgid "Show the folder management UI" +msgstr "" + +#: data/org.gnome.software.gschema.xml:107 +msgid "Allow access to the Software Sources dialog" +msgstr "" + +#: data/org.gnome.software.gschema.xml:111 +msgid "Offer upgrades for pre-releases" +msgstr "" + +#: data/org.gnome.software.gschema.xml:115 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" + +#: data/org.gnome.software.gschema.xml:119 +msgid "Show the prompt to install nonfree software sources" +msgstr "" + +#: data/org.gnome.software.gschema.xml:123 +msgid "Show non-free software in search results" +msgstr "" + +#: data/org.gnome.software.gschema.xml:127 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" + +#: data/org.gnome.software.gschema.xml:131 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" + +#: data/org.gnome.software.gschema.xml:135 +msgid "A list of non-free sources that can be optionally enabled" +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "" + +#: data/org.gnome.software.gschema.xml:143 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "Sorts the apps shown in the overview in alphabetical order" +msgstr "" + +#: data/org.gnome.software.gschema.xml:151 +msgid "" +"Overrides the name of the \"Featured\" entry in the side-filter (category " +"list)" +msgstr "" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "" + +#. Translators: Do NOT translate or transliterate this text (this is an icon +#. file name)! +#: src/gnome-software-local-file.desktop.in:10 +msgid "system-software-install" +msgstr "" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "" + +#: src/gnome-software.ui:24 +msgid "Software" +msgstr "" + +#: src/gnome-software.ui:43 src/gs-sources-dialog.ui:23 +#: src/gs-update-dialog.ui:21 +msgid "Go back" +msgstr "" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:77 +msgid "_All" +msgstr "" + +#. Translators: A label for a button to show only software which is already +#. installed. +#: src/gnome-software.ui:104 +msgid "_Installed" +msgstr "" + +#. Translators: A label for a button to show only updates which are available +#. to install. +#: src/gnome-software.ui:155 +msgid "_Updates" +msgstr "" + +#: src/gnome-software.ui:251 +msgid "Search" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:350 src/gs-sources-dialog.ui:6 +#: src/gs-sources-dialog.ui:46 +msgid "Software Sources" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:361 +msgid "Examine Disk" +msgstr "" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:372 src/gs-updates-page.c:1478 +msgid "Network Settings" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:383 +msgid "Restart Now" +msgstr "" + +#. button in the info bar +#: src/gnome-software.ui:394 +msgid "More Information" +msgstr "" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:430 +msgid "Pending" +msgstr "" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.ui:210 src/gs-app-tile.ui:51 +#: src/gs-background-tile.ui:67 src/gs-feature-tile.c:88 +#: src/gs-popular-tile.c:70 +msgid "Installed" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:218 src/gs-details-page.c:466 +msgid "Installing" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#: src/gs-app-addon-row.c:109 src/gs-app-row.c:224 +msgid "Removing" +msgstr "" + +#: src/gs-app-folder-dialog.c:310 +msgid "Folder Name" +msgstr "" + +#: src/gs-app-folder-dialog.c:321 src/gs-app-folder-dialog.ui:16 +#: src/gs-details-page.ui:342 src/gs-editor.c:623 src/gs-editor.c:655 +#: src/gs-installed-page.c:612 src/gs-removal-dialog.ui:33 +#: src/gs-review-dialog.ui:23 src/gs-upgrade-banner.ui:131 +msgid "_Cancel" +msgstr "" + +#: src/gs-app-folder-dialog.c:326 src/gs-app-folder-dialog.ui:24 +msgid "_Add" +msgstr "" + +#: src/gs-app-folder-dialog.ui:5 +msgid "Add to Application Folder" +msgstr "" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:128 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: src/gs-application.c:128 +msgid "MODE" +msgstr "" + +#: src/gs-application.c:130 +msgid "Search for applications" +msgstr "" + +#: src/gs-application.c:130 +msgid "SEARCH" +msgstr "" + +#: src/gs-application.c:132 +msgid "Show application details (using application ID)" +msgstr "" + +#: src/gs-application.c:132 src/gs-application.c:136 +msgid "ID" +msgstr "" + +#: src/gs-application.c:134 +msgid "Show application details (using package name)" +msgstr "" + +#: src/gs-application.c:134 +msgid "PKGNAME" +msgstr "" + +#: src/gs-application.c:136 +msgid "Install the application (using application ID)" +msgstr "" + +#: src/gs-application.c:138 +msgid "Open a local package file" +msgstr "" + +#: src/gs-application.c:138 +msgid "FILENAME" +msgstr "" + +#: src/gs-application.c:140 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" + +#: src/gs-application.c:143 +msgid "Show verbose debugging information" +msgstr "" + +#: src/gs-application.c:145 +msgid "Show profiling information for the service" +msgstr "" + +#: src/gs-application.c:147 +msgid "Quit the running instance" +msgstr "" + +#: src/gs-application.c:149 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:151 +msgid "Show version number" +msgstr "" + +#: src/gs-application.c:353 +msgid "translator-credits" +msgstr "" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:360 +#, c-format +msgid "About %s" +msgstr "" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:364 +msgid "A nice way to manage the software on your system." +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:171 +msgid "Visit website" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:176 +msgid "Install…" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:183 +msgid "Cancel" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:192 src/gs-common.c:279 src/gs-page.c:544 +msgid "Install" +msgstr "" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:199 +msgid "Update" +msgstr "" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: src/gs-app-row.c:203 src/gs-app-row.c:212 src/gs-page.c:700 +msgid "Uninstall" +msgstr "" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:330 +msgid "Device cannot be used during update." +msgstr "" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:340 src/gs-details-page.ui:991 +msgid "Source" +msgstr "" + +#. TRANSLATORS: this is when the service name is not known +#: src/gs-auth-dialog.c:68 +msgid "To continue you need to sign in." +msgstr "" + +#. TRANSLATORS: the %s is a service name, e.g. "Ubuntu One" +#: src/gs-auth-dialog.c:72 +#, c-format +msgid "To continue you need to sign in to %s." +msgstr "" + +#: src/gs-auth-dialog.ui:70 +msgid "Email address" +msgstr "" + +#: src/gs-auth-dialog.ui:94 +msgid "I have an account already" +msgstr "" + +#: src/gs-auth-dialog.ui:113 +msgid "Password" +msgstr "" + +#: src/gs-auth-dialog.ui:137 +msgid "I want to register for an account now" +msgstr "" + +#: src/gs-auth-dialog.ui:154 +msgid "I have forgotten my password" +msgstr "" + +#: src/gs-auth-dialog.ui:181 +msgid "Sign in automatically next time" +msgstr "" + +#: src/gs-auth-dialog.ui:210 +msgid "Enter your one-time pin for two-factor authentication." +msgstr "" + +#: src/gs-auth-dialog.ui:223 +msgid "PIN" +msgstr "" + +#: src/gs-auth-dialog.ui:325 +msgid "Authenticate" +msgstr "" + +#: src/gs-auth-dialog.ui:337 +msgid "Continue" +msgstr "" + +#. TRANSLATORS: This is the name and state of an app for the ATK object +#: src/gs-background-tile.c:159 src/gs-summary-tile.c:75 +#, c-format +msgid "%s (Installed)" +msgstr "" + +#: src/gs-background-tile.ui:81 +msgid "Scheduled update" +msgstr "" + +#: src/gs-background-tile.ui:95 +msgid "Available in a USB drive" +msgstr "" + +#: src/gs-background-tile.ui:109 +msgid "Requires download" +msgstr "" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:193 +msgid "Other" +msgstr "" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:198 +msgid "All" +msgstr "" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:202 src/gs-shell.c:2325 +msgid "Featured" +msgstr "" + +#: src/gs-category-page.ui:81 +msgid "Extension Settings" +msgstr "" + +#: src/gs-category-page.ui:110 +msgid "" +"Extensions are used at your own risk. If you have any system problems, it is" +" recommended to disable them." +msgstr "" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:205 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "" + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:268 +msgid "Choose an application:" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:135 +msgid "OS updates are now installed" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:138 +msgid "Recently installed updates are available to review" +msgstr "" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:142 +#, c-format +msgid "%s is now installed" +msgstr "" + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:145 +msgid "Application is ready to be used." +msgstr "" + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:151 +msgid "Launch" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Third-Party Software Source?" +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#: src/gs-common.c:232 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by " +"“%s”." +msgstr "" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software source name, e.g. fedora-optional +#: src/gs-common.c:242 +#, c-format +msgid "%s is provided by “%s”." +msgstr "" + +#. TRANSLATORS: a software source is a repo +#: src/gs-common.c:252 +msgid "This software source must be enabled to continue installation." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:262 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:268 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t Warn Again" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and Install" +msgstr "" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:429 +msgid "Detailed errors from the package manager follow:" +msgstr "" + +#: src/gs-common.c:448 src/gs-details-page.ui:579 +msgid "Details" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:75 +msgid "No cartoon violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:78 +msgid "Cartoon characters in unsafe situations" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "Cartoon characters in aggressive conflict" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:84 +msgid "Graphic violence involving cartoon characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "No fantasy violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:90 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:93 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Graphic violence easily distinguishable from reality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:99 +msgid "No realistic violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:102 +msgid "Mildly realistic characters in unsafe situations" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:108 +msgid "Graphic violence involving realistic characters" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:111 +msgid "No bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "Unrealistic bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:117 +msgid "Realistic bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:120 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:123 +msgid "No sexual violence" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Rape or other violent sexual behavior" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:129 +msgid "No references to alcohol" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "References to alcoholic beverages" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:135 +msgid "Use of alcoholic beverages" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:138 +msgid "No references to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:141 +msgid "References to illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Use of illicit drugs" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:147 +msgid "References to tobacco products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:150 +msgid "Use of tobacco products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:153 +msgid "No nudity of any sort" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Brief artistic nudity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:159 +msgid "Prolonged nudity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:162 +msgid "No references or depictions of sexual nature" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Provocative references or depictions" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:168 +msgid "Sexual references or depictions" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:171 +msgid "Graphic sexual behavior" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No profanity of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:177 +msgid "Mild or infrequent use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Moderate use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:183 +msgid "Strong or frequent use of profanity" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:186 +msgid "No inappropriate humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Slapstick humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:192 +msgid "Vulgar or bathroom humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:195 +msgid "Mature or sexual humor" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "No discriminatory language of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:201 +msgid "Negativity towards a specific group of people" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:204 +msgid "Discrimination designed to cause emotional harm" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:210 +msgid "No advertising of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Product placement" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:216 +msgid "Explicit references to specific brands or trademarked products" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:219 +msgid "Players are encouraged to purchase specific real-world items" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:222 +msgid "No gambling of any kind" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:225 +msgid "Gambling on random events using tokens or credits" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "Gambling using “play” money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:231 +msgid "Gambling using real money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "No ability to spend money" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:237 +msgid "Ability to spend real money in-game" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:240 +msgid "No way to chat with other players" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:243 +msgid "Player-to-player game interactions without chat functionality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:246 +msgid "Player-to-player preset interactions without chat functionality" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:249 +msgid "Uncontrolled chat functionality between players" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:252 +msgid "No way to talk with other players" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:255 +msgid "Uncontrolled audio or video chat functionality between players" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:258 +msgid "No sharing of social network usernames or email addresses" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "Sharing social network usernames or email addresses" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:264 +msgid "No sharing of user information with 3rd parties" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:267 +msgid "Sharing user information with 3rd parties" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "No sharing of physical location to other users" +msgstr "" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:273 +msgid "Sharing physical location to other users" +msgstr "" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is +#. unknown +#: src/gs-dbus-helper.c:294 +msgid "An application" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. MIME types. +#: src/gs-dbus-helper.c:300 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:302 +msgid "Additional MIME Types Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. fonts. +#: src/gs-dbus-helper.c:306 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:308 +msgid "Additional Fonts Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. codecs. +#: src/gs-dbus-helper.c:312 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:314 +msgid "Additional Multimedia Codecs Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app needs additional +#. printer drivers. +#: src/gs-dbus-helper.c:318 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:320 +msgid "Additional Printer Drivers Required" +msgstr "" + +#. TRANSLATORS: this is a notification displayed when an app wants to install +#. additional packages. +#: src/gs-dbus-helper.c:324 +#, c-format +msgid "%s is requesting additional packages." +msgstr "" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:326 +msgid "Additional Packages Required" +msgstr "" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:335 +msgid "Find in Software" +msgstr "" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#: src/gs-details-page.c:296 src/gs-details-page.c:330 +#: src/gs-details-page.ui:237 +msgid "_Install" +msgstr "" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed but needs to be downloaded first +#: src/gs-details-page.c:300 src/gs-upgrade-banner.ui:116 +msgid "_Download" +msgstr "" + +#. TRANSLATORS: button text in the header when an application +#. * can be live-updated +#: src/gs-details-page.c:334 +msgid "_Update" +msgstr "" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software sources or the like +#: src/gs-details-page.c:346 +msgid "_Install…" +msgstr "" + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:393 src/gs-details-page.ui:536 +msgid "_Uninstall" +msgstr "" + +#: src/gs-details-page.c:461 +msgid "Removing…" +msgstr "" + +#: src/gs-details-page.c:480 +msgid "Pending installation…" +msgstr "" + +#: src/gs-details-page.c:487 +msgid "Pending update…" +msgstr "" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:844 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:988 +msgctxt "version" +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:1024 +msgctxt "updated" +msgid "Never" +msgstr "" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1072 +msgctxt "origin" +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1481 +msgid "You need internet access to write a review" +msgstr "" + +#: src/gs-details-page.c:1610 +#, c-format +msgid "Unable to find “%s”" +msgstr "" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2217 +msgid "Public domain" +msgstr "" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2233 src/gs-details-page.ui:1386 +msgid "Free Software" +msgstr "" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2290 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-details-page.c:2306 src/gs-details-page.ui:1495 +msgid "More information" +msgstr "" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "" + +#. Translators: A label for a button to add a shortcut to the selected +#. application. +#: src/gs-details-page.ui:209 +msgid "_Add to Desktop" +msgstr "" + +#. Translators: A label for a button to remove a shortcut to the selected +#. application. +#: src/gs-details-page.ui:226 +msgid "_Remove from Desktop" +msgstr "" + +#. Translators: A label for a button to execute the selected application. +#: src/gs-details-page.ui:259 +msgid "_Launch" +msgstr "" + +#: src/gs-details-page.ui:439 +msgid "No screenshot provided" +msgstr "" + +#: src/gs-details-page.ui:475 +msgid "Software Source Included" +msgstr "" + +#: src/gs-details-page.ui:476 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "" + +#: src/gs-details-page.ui:489 +msgid "No Software Source Included" +msgstr "" + +#: src/gs-details-page.ui:490 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "" + +#: src/gs-details-page.ui:504 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#. Translators: a repository file used for installing software has been +#. discovered. +#: src/gs-details-page.ui:517 +msgid "Software Source Identified" +msgstr "" + +#: src/gs-details-page.ui:518 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "" + +#: src/gs-details-page.ui:519 +msgid "Only use software sources that you trust." +msgstr "" + +#: src/gs-details-page.ui:551 +msgid "_Donate" +msgstr "" + +#: src/gs-details-page.ui:592 +msgid "Developer _Website" +msgstr "" + +#: src/gs-details-page.ui:704 +msgid "Localized in your Language" +msgstr "" + +#: src/gs-details-page.ui:716 +msgid "Documentation" +msgstr "" + +#: src/gs-details-page.ui:728 +msgid "Release Activity" +msgstr "" + +#: src/gs-details-page.ui:740 +msgid "System Integration" +msgstr "" + +#: src/gs-details-page.ui:752 +msgid "Sandboxed" +msgstr "" + +#: src/gs-details-page.ui:777 src/gs-sources-dialog.ui:365 +msgid "Version" +msgstr "" + +#: src/gs-details-page.ui:814 +msgid "Age Rating" +msgstr "" + +#: src/gs-details-page.ui:852 +msgid "Updated" +msgstr "" + +#: src/gs-details-page.ui:887 +msgid "Category" +msgstr "" + +#: src/gs-details-page.ui:925 +msgid "Installed Size" +msgstr "" + +#: src/gs-details-page.ui:958 +msgid "Download Size" +msgstr "" + +#: src/gs-details-page.ui:1024 +msgid "Developer" +msgstr "" + +#: src/gs-details-page.ui:1058 +msgid "License" +msgstr "" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1078 +msgid "Free" +msgstr "" + +#. This refers to the license of the application +#: src/gs-details-page.ui:1095 +msgid "Proprietary" +msgstr "" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.ui:1112 src/gs-review-row.c:71 +msgid "Unknown" +msgstr "" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#: src/gs-details-page.ui:1166 src/gs-installed-page.c:490 +msgid "Add-ons" +msgstr "" + +#: src/gs-details-page.ui:1179 +msgid "Selected add-ons will be installed with the application." +msgstr "" + +#. Translators: Header of the section with other users' opinions about the +#. app. +#: src/gs-details-page.ui:1222 +msgid "Reviews" +msgstr "" + +#. Translators: Button opening a dialog where the users can write and publish +#. their opinions about the apps. +#: src/gs-details-page.ui:1238 +msgid "_Write a Review" +msgstr "" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1260 +msgid "_Show More" +msgstr "" + +#: src/gs-details-page.ui:1403 +msgid "" +"This means that the software can be freely run, copied, distributed, studied" +" and modified." +msgstr "" + +#: src/gs-details-page.ui:1462 +msgid "Proprietary Software" +msgstr "" + +#: src/gs-details-page.ui:1479 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "" + +#: src/gs-details-page.ui:1524 +msgid "Unknown Software License" +msgstr "" + +#: src/gs-details-page.ui:1541 +msgid "The license terms of this software are unknown." +msgstr "" + +#: src/gs-details-page.ui:1568 +msgid "The application was rated this way because it features:" +msgstr "" + +#: src/gs-details-page.ui:1594 +msgid "No details were available for this rating." +msgstr "" + +#: src/gs-editor.c:361 +msgid "CSS validated OK!" +msgstr "" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:564 +msgid "Failed to load file" +msgstr "" + +#. TRANSLATORS: window title +#: src/gs-editor.c:598 src/gs-editor.c:874 +msgid "Unsaved changes" +msgstr "" + +#: src/gs-editor.c:600 +msgid "The application list is already loaded." +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-editor.c:604 +msgid "Merge documents" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-editor.c:608 src/gs-editor.c:879 +msgid "Throw away changes" +msgstr "" + +#. import the new file +#: src/gs-editor.c:620 src/gs-editor.c:652 +msgid "Open AppStream File" +msgstr "" + +#: src/gs-editor.c:624 +msgid "_Open" +msgstr "" + +#: src/gs-editor.c:656 +msgid "_Save" +msgstr "" + +#. TRANSLATORS: error dialog title +#: src/gs-editor.c:676 +msgid "Failed to save file" +msgstr "" + +#. TRANSLATORS, the %s is the app name, e.g. 'Inkscape' +#: src/gs-editor.c:751 +#, c-format +msgid "%s banner design deleted." +msgstr "" + +#. TRANSLATORS, this is a notification +#: src/gs-editor.c:754 +msgid "Banner design deleted." +msgstr "" + +#: src/gs-editor.c:876 +msgid "The application list has unsaved changes." +msgstr "" + +#. TRANSLATORS: show the program version +#: src/gs-editor.c:1111 +msgid "Use verbose logging" +msgstr "" + +#. TRANSLATORS: program name, an application to add and remove software +#. repositories +#: src/gs-editor.c:1119 +msgid "GNOME Software Banner Designer" +msgstr "" + +#: src/gs-editor.ui:63 src/gs-editor.ui:77 +msgid "No Designs" +msgstr "" + +#: src/gs-editor.ui:163 +msgid "Error message here" +msgstr "" + +#: src/gs-editor.ui:250 +msgid "App ID" +msgstr "" + +#: src/gs-editor.ui:296 +msgid "Name" +msgstr "" + +#: src/gs-editor.ui:341 src/gs-review-dialog.ui:142 +msgid "Summary" +msgstr "" + +#: src/gs-editor.ui:382 +msgid "Editor’s Pick" +msgstr "" + +#. This check button controls whether the application’s banner appears in the +#. “Featured” category +#: src/gs-editor.ui:397 +msgid "Category Featured" +msgstr "" + +#. button in the info bar +#: src/gs-editor.ui:471 +msgid "Undo" +msgstr "" + +#: src/gs-editor.ui:524 src/org.gnome.Software.Editor.desktop.in:3 +msgid "Banner Designer" +msgstr "" + +#: src/gs-editor.ui:547 +msgid "New Banner" +msgstr "" + +#: src/gs-editor.ui:615 +msgid "Import from file" +msgstr "" + +#: src/gs-editor.ui:629 +msgid "Export to file" +msgstr "" + +#: src/gs-editor.ui:643 +msgid "Delete Design" +msgstr "" + +#: src/gs-editor.ui:670 +msgid "Featured App" +msgstr "" + +#: src/gs-editor.ui:684 +msgid "OS Upgrade" +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid " and " +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:149 +msgid ", " +msgstr "" + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:175 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:183 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:225 +msgid "Unable to Find Requested Software" +msgstr "" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:325 +#, c-format +msgid "%s not found" +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:329 +msgid "on the website" +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:336 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:340 src/gs-extras-page.c:351 src/gs-extras-page.c:362 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications" +" might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:347 src/gs-extras-page.c:369 +#, c-format +msgid "No applications are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:358 +#, c-format +msgid "%s is not available." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:373 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:380 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:384 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:391 lib/gs-plugin-loader.c:1458 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:395 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:402 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:406 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:413 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:417 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:462 +msgid "this website" +msgstr "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual +#. codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:466 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:538 src/gs-extras-page.c:594 src/gs-extras-page.c:633 +msgid "Failed to find any search results" +msgstr "" + +#: src/gs-extras-page.c:827 +#, c-format +msgid "%s file format" +msgstr "" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "" + +#: src/gs-first-run-dialog.ui:7 src/gs-first-run-dialog.ui:16 +msgid "Welcome" +msgstr "" + +#: src/gs-first-run-dialog.ui:50 +msgid "Welcome to Software" +msgstr "" + +#: src/gs-first-run-dialog.ui:66 +msgid "" +"Software lets you install all the software you need, all from one place. See" +" our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" + +#: src/gs-first-run-dialog.ui:85 +msgid "_Let’s Go Shopping" +msgstr "" + +#. TRANSLATORS: Here are 2 strings the same as in gtk/gtkbox.c +#. in GTK+ project. Please use the same translation. +#: src/gs-hiding-box.c:381 +msgid "Spacing" +msgstr "" + +#: src/gs-hiding-box.c:382 +msgid "The amount of space between children" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:82 +msgctxt "app status" +msgid "Removed" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:88 +msgctxt "app status" +msgid "Installed" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:94 +msgctxt "app status" +msgid "Updated" +msgstr "" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:100 +msgctxt "app status" +msgid "Unknown" +msgstr "" + +#: src/gs-history-dialog.ui:6 +msgid "History" +msgstr "" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:486 +msgid "System Applications" +msgstr "" + +#: src/gs-installed-page.c:620 +msgid "Click on items to select them" +msgstr "" + +#: src/gs-installed-page.c:826 +msgid "Select" +msgstr "" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "" + +#: src/gs-installed-page.ui:65 +msgid "_Add to Folder…" +msgstr "" + +#: src/gs-installed-page.ui:73 +msgid "_Move to Folder…" +msgstr "" + +#: src/gs-installed-page.ui:81 +msgid "_Remove from Folder" +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:76 +msgid "Software catalog is being downloaded" +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Software catalog is being loaded" +msgstr "" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "" + +#: src/gs-loading-page.ui:37 +msgid "Starting up…" +msgstr "" + +#: src/gs-menus.ui:7 +msgid "_Software Sources" +msgstr "" + +#: src/gs-menus.ui:14 +msgid "_About" +msgstr "" + +#: src/gs-menus.ui:18 +msgid "_Quit" +msgstr "" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "" + +#: src/gs-moderate-page.ui:87 +msgid "There are no reviews to moderate" +msgstr "" + +#. add button +#: src/gs-overview-page.c:372 +msgid "More…" +msgstr "" + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:588 +msgid "Recommended Audio & Video Applications" +msgstr "" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:593 +msgid "Recommended Games" +msgstr "" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:598 +msgid "Recommended Graphics Applications" +msgstr "" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:603 +msgid "Recommended Productivity Applications" +msgstr "" + +#. TRANSLATORS: this is the proprietary info bar +#: src/gs-overview-page.c:992 +msgid "" +"Provides access to additional software, including web browsers and games." +msgstr "" + +#. TRANSLATORS: this is the proprietary info bar +#: src/gs-overview-page.c:996 +msgid "" +"Proprietary software has restrictions on use and access to source code." +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the proprietary info bar +#: src/gs-overview-page.c:1003 src/gs-sources-dialog.c:290 +msgid "Find out more…" +msgstr "" + +#. TRANSLATORS: button to turn on proprietary software sources +#: src/gs-overview-page.c:1054 +msgid "Enable" +msgstr "" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "" + +#: src/gs-overview-page.ui:54 +msgid "Enable Proprietary Software Sources?" +msgstr "" + +#: src/gs-overview-page.ui:122 +msgid "Featured Application" +msgstr "" + +#: src/gs-overview-page.ui:155 +msgid "Categories" +msgstr "" + +#. Translators: This is a heading for software which has been featured +#. ('picked') by the distribution. +#: src/gs-overview-page.ui:315 +msgid "Editor’s Picks" +msgstr "" + +#. Translators: This is a heading for software which has been recently +#. released upstream. +#: src/gs-overview-page.ui:359 +msgid "Recent Releases" +msgstr "" + +#: src/gs-overview-page.ui:446 +msgid "No Application Data Found" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:445 +#, c-format +msgid "Are you sure you want to purchase %s?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:449 +#, c-format +msgid "%s will be installed, and you will be charged %s." +msgstr "" + +#. TRANSLATORS: this is button text to purchase the application +#: src/gs-page.c:462 +msgid "Purchase" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:535 +#, c-format +msgid "Prepare %s" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * source name, e.g. 'GNOME Nightly' +#: src/gs-page.c:669 +#, c-format +msgid "Are you sure you want to remove the %s source?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:673 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the source to use them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:681 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:684 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" + +#: lib/gs-plugin-loader.c:1461 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "" + +#: lib/gs-price.c:111 +#, c-format +msgid "A$%.2f" +msgstr "" + +#: lib/gs-price.c:113 +#, c-format +msgid "C$%.2f" +msgstr "" + +#: lib/gs-price.c:115 +#, c-format +msgid "CN¥%.2f" +msgstr "" + +#: lib/gs-price.c:117 +#, c-format +msgid "€%.2f" +msgstr "" + +#: lib/gs-price.c:119 +#, c-format +msgid "£%.2f" +msgstr "" + +#: lib/gs-price.c:121 +#, c-format +msgid "¥%.2f" +msgstr "" + +#: lib/gs-price.c:123 +#, c-format +msgid "NZ$%.2f" +msgstr "" + +#: lib/gs-price.c:125 +#, c-format +msgid "₽%.2f" +msgstr "" + +#: lib/gs-price.c:127 +#, c-format +msgid "US$%.2f" +msgstr "" + +#. Translators: %s is the currency, and %f is the amount. +#. * You can switch the order by using “%2$f %1$s” instead. +#: lib/gs-price.c:131 +#, c-format +msgid "%s %f" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:128 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" + +#: src/gs-removal-dialog.ui:27 +msgid "Incompatible Software" +msgstr "" + +#: src/gs-removal-dialog.ui:40 +msgid "_Continue" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:98 +msgid "Hate it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:102 +msgid "Don’t like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:106 +msgid "It’s OK" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:110 +msgid "Like it" +msgstr "" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:114 +msgid "Love it" +msgstr "" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:136 +msgid "Please take more time writing the review" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:140 +msgid "Please choose a star rating" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:144 +msgid "The summary is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:148 +msgid "The summary is too long" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:152 +msgid "The description is too short" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:156 +msgid "The description is too long" +msgstr "" + +#. Translators: Title of the dialog box where the users can write and publish +#. their opinions about the apps. +#: src/gs-review-dialog.ui:11 +msgid "Post Review" +msgstr "" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:35 +msgid "_Post" +msgstr "" + +#: src/gs-review-dialog.ui:85 +msgid "Rating" +msgstr "" + +#: src/gs-review-dialog.ui:158 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:199 +msgctxt "app review" +msgid "Review" +msgstr "" + +#: src/gs-review-dialog.ui:215 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "" + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:413 +msgid "ratings in total" +msgstr "" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:234 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:239 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:253 +msgid "Report Review?" +msgstr "" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:257 +msgid "Report" +msgstr "" + +#. Translators: Users can express their opinions about other users' opinions +#. about the apps. +#: src/gs-review-row.ui:112 +msgid "Was this review useful to you?" +msgstr "" + +#: src/gs-review-row.ui:134 +msgid "Yes" +msgstr "" + +#: src/gs-review-row.ui:148 +msgid "No" +msgstr "" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:162 +msgid "Meh" +msgstr "" + +#: src/gs-review-row.ui:196 +msgid "Report…" +msgstr "" + +#: src/gs-review-row.ui:211 +msgid "Remove…" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:313 +msgid "Screenshot not found" +msgstr "" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:328 +msgid "Failed to load image" +msgstr "" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:461 +msgid "Screenshot size not found" +msgstr "" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:491 +msgid "Could not create cache" +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:552 +msgid "Screenshot not valid" +msgstr "" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:567 +msgid "Screenshot not available" +msgstr "" + +#: src/gs-screenshot-image.c:626 +msgid "Screenshot" +msgstr "" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:157 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "" +msgstr[1] "" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:890 src/gs-shell.c:895 src/gs-shell.c:910 src/gs-shell.c:914 +#, c-format +msgid "“%s”" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:942 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:948 +#, c-format +msgid "Unable to download updates from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:955 +msgid "Unable to download updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:960 +msgid "" +"Unable to download updates: internet access was required but wasn’t " +"available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:969 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:974 +msgid "Unable to download updates: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:982 +msgid "Unable to download updates: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:987 +msgid "Unable to download updates: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:992 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:999 +msgid "Unable to get list of updates" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1045 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1051 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1063 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1069 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1076 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1082 +msgid "Unable to install: the application has an invalid format" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1087 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1095 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1102 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1109 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the name of the authentication service, +#. * e.g. "Ubuntu One" +#: src/gs-shell.c:1122 +#, c-format +msgid "Your %s account has been suspended." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1126 +msgid "It is not possible to install software until this has been resolved." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the clickable link (e.g. +#. * "http://example.com/what-did-i-do-wrong/") +#: src/gs-shell.c:1137 +#, c-format +msgid "For more information, visit %s." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1146 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1155 +#, c-format +msgid "Unable to install %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1201 +#, c-format +msgid "Unable to update %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1207 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1230 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1244 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1252 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1261 +#, c-format +msgid "Unable to update %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1306 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1311 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1318 +msgid "Unable to upgrade: internet access was required but wasn’t available" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1335 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1342 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1349 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1356 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1365 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1407 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1413 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1435 +#, c-format +msgid "Unable to remove %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1488 src/gs-shell.c:1536 src/gs-shell.c:1584 +msgid "Not enough disk space — free up some space and try again" +msgstr "" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1496 src/gs-shell.c:1544 src/gs-shell.c:1611 +msgid "Sorry, something went wrong" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1531 +msgid "Failed to install file: authentication failed" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1578 +#, c-format +msgid "Unable to contact %s" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1593 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1598 +msgid "This application needs to be restarted to use new plugins." +msgstr "" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1605 +msgid "AC power is required" +msgstr "" + +#. TRANSLATORS: This string describes a software source that +#. has no software installed from it. +#: src/gs-sources-dialog.c:109 +msgid "No applications or addons installed; other software might still be" +msgstr "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software source. +#: src/gs-sources-dialog.c:114 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software source. +#: src/gs-sources-dialog.c:121 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of applications. +#: src/gs-sources-dialog.c:129 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the number of add-ons. +#: src/gs-sources-dialog.c:135 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software source. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-sources-dialog.c:142 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: nonfree software +#: src/gs-sources-dialog.c:280 +msgid "Typically has restrictions on use and access to source code." +msgstr "" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-sources-dialog.c:587 +msgid "the operating system" +msgstr "" + +#. TRANSLATORS: list header +#: src/gs-sources-dialog.c:679 +msgid "Proprietary Software Sources" +msgstr "" + +#. TRANSLATORS: This is the text displayed in the Software Sources +#. dialog when no OS-provided software sources are enabled. %s gets +#. replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-sources-dialog.c:687 +#, c-format +msgid "" +"Software sources can be downloaded from the internet. They give you access " +"to additional software that is not provided by %s." +msgstr "" + +#: src/gs-sources-dialog.ui:161 +msgid "Additional Sources" +msgstr "" + +#: src/gs-sources-dialog.ui:181 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "" + +#: src/gs-sources-dialog.ui:266 +msgid "No software installed from this source" +msgstr "" + +#: src/gs-sources-dialog.ui:293 +msgid "Installed from this Source" +msgstr "" + +#: src/gs-sources-dialog.ui:339 +msgid "Source Details" +msgstr "" + +#: src/gs-sources-dialog.ui:396 +msgid "Last Checked" +msgstr "" + +#: src/gs-sources-dialog.ui:413 +msgid "Added" +msgstr "" + +#: src/gs-sources-dialog.ui:430 +msgid "Website" +msgstr "" + +#: src/gs-summary-tile.c:80 +#, c-format +msgid "%s (Installing)" +msgstr "" + +#: src/gs-summary-tile.c:85 +#, c-format +msgid "%s (Removing)" +msgstr "" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:129 +msgid "No update description available." +msgstr "" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:224 +#, c-format +msgid "Installed on %s" +msgstr "" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:244 +msgid "Installed Updates" +msgstr "" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:420 +msgid "Additions" +msgstr "" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:424 +msgid "Removals" +msgstr "" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:428 +msgid "Updates" +msgstr "" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:432 +msgid "Downgrades" +msgstr "" + +#: src/gs-update-dialog.ui:111 +msgid "No updates have been installed on this system." +msgstr "" + +#: src/gs-update-monitor.c:169 +msgid "Security Updates Pending" +msgstr "" + +#: src/gs-update-monitor.c:170 +msgid "It is recommended that you install important updates now" +msgstr "" + +#: src/gs-update-monitor.c:173 +msgid "Restart & Install" +msgstr "" + +#: src/gs-update-monitor.c:177 +msgid "Software Updates Available" +msgstr "" + +#: src/gs-update-monitor.c:178 +msgid "Important OS and application updates are ready to be installed" +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-update-monitor.c:181 src/gs-updates-page.c:800 +msgid "Not Now" +msgstr "" + +#: src/gs-update-monitor.c:182 +msgid "View" +msgstr "" + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:696 src/gs-updates-page.ui:79 +msgid "Operating System Updates Unavailable" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:698 +msgid "Upgrade to continue receiving security updates." +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:752 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:756 +msgid "Software Upgrade Available" +msgstr "" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1040 +msgid "Software Updates Failed" +msgstr "" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1042 +msgid "An important OS update failed to be installed." +msgstr "" + +#: src/gs-update-monitor.c:1043 +msgid "Show Details" +msgstr "" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1065 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1069 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1080 +msgctxt "updates" +msgid "Review" +msgstr "" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1127 +msgid "Failed To Update" +msgstr "" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1133 +msgid "The system was already up to date." +msgstr "" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1138 +msgid "The update was cancelled." +msgstr "" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1144 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you" +" have internet access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1150 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1156 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1161 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:306 +msgid "%R" +msgstr "" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:309 +msgid "%l:%M %p" +msgstr "" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:315 +msgid "Yesterday, %R" +msgstr "" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:319 +msgid "Yesterday, %l:%M %p" +msgstr "" + +#: src/gs-updates-page.c:322 +msgid "Two days ago" +msgstr "" + +#: src/gs-updates-page.c:324 +msgid "Three days ago" +msgstr "" + +#: src/gs-updates-page.c:326 +msgid "Four days ago" +msgstr "" + +#: src/gs-updates-page.c:328 +msgid "Five days ago" +msgstr "" + +#: src/gs-updates-page.c:330 +msgid "Six days ago" +msgstr "" + +#: src/gs-updates-page.c:332 +msgid "One week ago" +msgstr "" + +#: src/gs-updates-page.c:334 +msgid "Two weeks ago" +msgstr "" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-updates-page.c:338 +msgid "%e %B %Y" +msgstr "" + +#. FIXME: We are commenting out the code that checked the status because +#. * the message it returned is not what a plugin may be doing (it can be +#. * simply refreshing the metadata), so we need to fix this (maybe adding +#. * different types of 'downloading' status) in the future. +#. if (status == GS_PLUGIN_STATUS_DOWNLOADING) { +#. /\* TRANSLATORS: the updates are being downloaded *\/ +#. return _("Downloading new updates…"); +#. } +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:359 +msgid "Looking for new updates…" +msgstr "" + +#: src/gs-updates-page.c:389 +msgid "automatic updates on" +msgstr "" + +#: src/gs-updates-page.c:392 +msgid "automatic updates off" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:440 +msgid "Setting up updates…" +msgstr "" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:441 src/gs-updates-page.c:448 +msgid "(This could take a while)" +msgstr "" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:554 +#, c-format +msgid "Last checked: %s" +msgstr "" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-updates-page.c:796 +msgid "Updates have been installed" +msgstr "" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-updates-page.c:798 +msgid "A restart is required for them to take effect." +msgstr "" + +#. TRANSLATORS: button text +#: src/gs-updates-page.c:802 +msgid "Restart" +msgstr "" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-page.c:872 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the button for upgrading all +#. * system firmware +#. TRANSLATORS: This is the button for upgrading all +#. * offline updates +#: src/gs-updates-page.c:875 src/gs-updates-page.c:885 +msgid "Restart & Update" +msgstr "" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-page.c:882 +msgid "Requires Restart" +msgstr "" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-page.c:892 +msgid "Application Updates" +msgstr "" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-page.c:895 +msgid "Update All" +msgstr "" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-page.c:902 +msgid "Device Firmware" +msgstr "" + +#. TRANSLATORS: this is an offline update +#: src/gs-updates-page.c:1087 +msgid "_Restart & Update" +msgstr "" + +#. TRANSLATORS: all updates will be installed +#: src/gs-updates-page.c:1091 +msgid "U_pdate All" +msgstr "" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:1175 +#, c-format +msgid "%s %s is no longer supported." +msgstr "" + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:1180 +msgid "Your OS is no longer supported." +msgstr "" + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:1185 +msgid "This means that it does not receive security updates." +msgstr "" + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:1189 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:1446 +msgid "Charges may apply" +msgstr "" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1450 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:1454 +msgid "Check Anyway" +msgstr "" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:1470 +msgid "No Network" +msgstr "" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:1474 +msgid "Internet access is required to check for updates." +msgstr "" + +#: src/gs-updates-page.c:1907 +msgid "Restart & _Install" +msgstr "" + +#: src/gs-updates-page.c:1925 +msgid "Check for updates" +msgstr "" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "" + +#: src/gs-updates-page.ui:227 +msgid "Software is up to date" +msgstr "" + +#: src/gs-updates-page.ui:278 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" + +#: src/gs-updates-page.ui:290 +msgid "_Check Anyway" +msgstr "" + +#: src/gs-updates-page.ui:333 +msgid "Go online to check for updates" +msgstr "" + +#: src/gs-updates-page.ui:344 +msgid "_Network Settings" +msgstr "" + +#: src/gs-updates-page.ui:426 +msgid "Updates are automatically managed" +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:85 +#, c-format +msgid "%s %s Now Available" +msgstr "" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:95 +#, c-format +msgid "Downloading %s %s" +msgstr "" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:106 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "" + +#: src/gs-upgrade-banner.ui:32 +msgid "A major upgrade, with new features and added polish." +msgstr "" + +#: src/gs-upgrade-banner.ui:52 +msgid "_Learn More" +msgstr "" + +#: src/gs-upgrade-banner.ui:98 +msgid "Updates will be applied when the computer is restarted." +msgstr "" + +#: src/gs-upgrade-banner.ui:146 +msgid "_Restart Now" +msgstr "" + +#: src/org.gnome.Software.desktop.in:3 +msgid "App Center" +msgstr "" + +#: src/org.gnome.Software.desktop.in:4 +msgid "More Apps" +msgstr "अधिक ऍप्स" + +#: src/org.gnome.Software.desktop.in:5 +msgid "Add, remove or update software on this computer" +msgstr "" + +#. Translators: Do NOT translate or transliterate this text (this is an icon +#. file name)! +#: src/org.gnome.Software.desktop.in:7 +#: src/org.gnome.Software.Editor.desktop.in:6 +msgid "org.gnome.Software" +msgstr "" + +#. Translators: Search terms to find this application. Do NOT translate or +#. localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:13 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "" + +#: src/org.gnome.Software.Editor.desktop.in:4 +msgid "Design the featured banners for GNOME Software" +msgstr "" + +#. Translators: Search terms to find this application. Do NOT translate or +#. localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.Editor.desktop.in:13 +msgid "AppStream;Software;App;" +msgstr "" + +#: plugins/core/gs-desktop-common.c:31 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:35 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "" + +#: plugins/core/gs-desktop-common.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "" + +#: plugins/core/gs-desktop-common.c:49 +msgctxt "Menu of Graphics" +msgid "3D Graphics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:52 +msgctxt "Menu of Graphics" +msgid "Photography" +msgstr "" + +#: plugins/core/gs-desktop-common.c:55 +msgctxt "Menu of Graphics" +msgid "Scanning" +msgstr "" + +#: plugins/core/gs-desktop-common.c:58 +msgctxt "Menu of Graphics" +msgid "Vector Graphics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:61 +msgctxt "Menu of Graphics" +msgid "Viewers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:69 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:72 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:75 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:78 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:87 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:91 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:95 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "" + +#: plugins/core/gs-desktop-common.c:98 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "" + +#: plugins/core/gs-desktop-common.c:102 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "" + +#: plugins/core/gs-desktop-common.c:106 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "" + +#: plugins/core/gs-desktop-common.c:110 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "" + +#: plugins/core/gs-desktop-common.c:117 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:126 +msgctxt "Menu of Games" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:129 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:132 +msgctxt "Menu of Games" +msgid "Action" +msgstr "" + +#: plugins/core/gs-desktop-common.c:135 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "" + +#: plugins/core/gs-desktop-common.c:138 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "" + +#: plugins/core/gs-desktop-common.c:141 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "" + +#: plugins/core/gs-desktop-common.c:144 +msgctxt "Menu of Games" +msgid "Board" +msgstr "" + +#: plugins/core/gs-desktop-common.c:147 +msgctxt "Menu of Games" +msgid "Card" +msgstr "" + +#: plugins/core/gs-desktop-common.c:150 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "" + +#: plugins/core/gs-desktop-common.c:153 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "" + +#: plugins/core/gs-desktop-common.c:156 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "" + +#: plugins/core/gs-desktop-common.c:159 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "" + +#: plugins/core/gs-desktop-common.c:162 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "" + +#: plugins/core/gs-desktop-common.c:166 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:177 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:180 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "" + +#: plugins/core/gs-desktop-common.c:184 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "" + +#: plugins/core/gs-desktop-common.c:187 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "" + +#: plugins/core/gs-desktop-common.c:191 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "" + +#: plugins/core/gs-desktop-common.c:200 +msgctxt "Menu of Utility" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:206 +msgctxt "Menu of Utility" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:210 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "" + +#: plugins/core/gs-desktop-common.c:213 +msgctxt "Menu of Communication" +msgid "Chat" +msgstr "" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "" + +#: plugins/core/gs-desktop-common.c:226 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "" + +#: plugins/core/gs-desktop-common.c:229 +msgctxt "Menu of Add-ons" +msgid "Shell Extensions" +msgstr "" + +#: plugins/core/gs-desktop-common.c:232 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "" + +#: plugins/core/gs-desktop-common.c:235 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:238 +msgctxt "Menu of Utility" +msgid "Text Editors" +msgstr "" + +#: plugins/core/gs-desktop-common.c:241 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "" + +#: plugins/core/gs-desktop-common.c:244 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "" + +#: plugins/core/gs-desktop-common.c:248 +msgctxt "Menu of Settings" +msgid "Settings" +msgstr "" + +#: plugins/core/gs-desktop-common.c:257 +msgctxt "Menu of System" +msgid "System" +msgstr "" + +#: plugins/core/gs-desktop-common.c:270 plugins/core/gs-desktop-common.c:314 +msgctxt "Menu of Reference" +msgid "All" +msgstr "" + +#: plugins/core/gs-desktop-common.c:273 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "" + +#: plugins/core/gs-desktop-common.c:276 +msgctxt "Menu of Reference" +msgid "Art" +msgstr "" + +#: plugins/core/gs-desktop-common.c:279 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "" + +#: plugins/core/gs-desktop-common.c:282 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:285 +msgctxt "Menu of Reference" +msgid "Feed" +msgstr "" + +#: plugins/core/gs-desktop-common.c:288 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "" + +#: plugins/core/gs-desktop-common.c:291 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "" + +#: plugins/core/gs-desktop-common.c:294 +msgctxt "Menu of Reference" +msgid "History" +msgstr "" + +#: plugins/core/gs-desktop-common.c:297 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "" + +#: plugins/core/gs-desktop-common.c:300 +msgctxt "Menu of Reference" +msgid "News" +msgstr "" + +#: plugins/core/gs-desktop-common.c:303 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "" + +#: plugins/core/gs-desktop-common.c:306 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Learning +#: plugins/core/gs-desktop-common.c:324 +msgid "Learning" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:327 +msgid "Games" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Multimedia +#: plugins/core/gs-desktop-common.c:330 +msgid "Multimedia" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Work +#: plugins/core/gs-desktop-common.c:333 +msgid "Work" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:336 +msgid "Reference & News" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:339 +msgid "Utilities" +msgstr "" + +#. TRANSLATORS: this is the menu spec main category for Dev Tools; it +#. * should be a relatively short label; as an example, in Portuguese and +#. * Spanish the direct translation of "Programming" (noun) is used +#: plugins/core/gs-desktop-common.c:344 +msgid "Dev Tools" +msgstr "" + +#: plugins/core/gs-desktop-common.c:346 +msgid "USB" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-appstream.c:693 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:65 +msgid "OS Updates" +msgstr "" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:70 +msgid "Includes performance, stability and security improvements." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:55 +msgid "Downloading featured images…" +msgstr "" + +#: plugins/eos/gs-plugin-eos.c:1917 +#, c-format +msgid "Could not launch this application." +msgstr "" + +#: plugins/eos/gs-plugin-eos.c:1974 +msgid "Endless Platform" +msgstr "" + +#: plugins/eos/gs-plugin-eos.c:1977 +msgid "Framework for applications" +msgstr "" + +#: plugins/eos/gs-plugin-eos.c:2126 +msgid "An Endless update with new features and fixes." +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:102 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" + +#: plugins/external-appstream/gs-install-appstream.c:104 +msgid "Failed to parse command line arguments" +msgstr "" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:111 +msgid "You need to specify exactly one filename" +msgstr "" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:118 +msgid "This program can only be used by the root user" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:126 +msgid "Failed to validate content type" +msgstr "" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:133 +msgid "Failed to copy" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:217 +msgid "Downloading upgrade information…" +msgstr "" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:311 +msgid "Upgrade your Fedora system to the latest features and improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:871 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:2114 +#, c-format +msgid "" +"The app %s is missing its runtime. Update the app to repair this problem." +msgstr "" + +#. TRANSLATORS: status text when downloading the RuntimeRepo +#: plugins/flatpak/gs-flatpak.c:3274 +msgid "Getting runtime source…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:864 plugins/fwupd/gs-plugin-fwupd.c:963 +msgid "Downloading firmware update signature…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:905 plugins/fwupd/gs-plugin-fwupd.c:1009 +msgid "Downloading firmware update metadata…" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:1100 +msgid "Downloading firmware update…" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:6 +msgid "Limba Support" +msgstr "" + +#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:7 +msgid "Limba provides developers a way to easily create software bundles" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:205 +msgid "Downloading application ratings…" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:674 +msgid "Downloading shell extension metadata…" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snappy Support" +msgstr "" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" + +#. TRANSLATORS: status text when downloading +#: plugins/steam/gs-plugin-steam.c:600 +msgid "Downloading application page…" +msgstr "" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:6 +msgid "Steam Support" +msgstr "" + +#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:7 +msgid "The ultimate entertainment platform from Valve" +msgstr "" diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 0000000..bae0f95 --- /dev/null +++ b/po/ms.po @@ -0,0 +1,4380 @@ +# Malay translation for gnome-software. +# Copyright (C) 2020 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# abuyop , 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2020-01-23 12:43+0000\n" +"PO-Revision-Date: 2020-01-24 08:59+0800\n" +"Language-Team: Pasukan Terjemahan GNOME\n" +"Language: ms\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" +"Last-Translator: abuyop \n" +"X-Generator: Poedit 2.0.6\n" + +#: data/appdata/org.gnome.Software.appdata.xml.in:7 +msgid "GNOME Software" +msgstr "Perisian GNOME" + +#: data/appdata/org.gnome.Software.appdata.xml.in:8 +msgid "Application manager for GNOME" +msgstr "Pengurus aplikasi untuk GNOME" + +#: data/appdata/org.gnome.Software.appdata.xml.in:10 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" +"Perisian yang memudahkan pencarian dan pemasangan aplikasi-aplikasi baharu " +"dan sambungan-sambungan sistem serta membuang aplikasi-aplikasi terpasang " +"yang ada." + +#: data/appdata/org.gnome.Software.appdata.xml.in:14 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" +"Perisian GNOME mewar-warkan aplikasi-aplikasi terfitur dan terkenal berserta " +"keterangan yang berguna dan beberapa tangkap layarnya mengikut aplikasi. " +"Aplikasi-aplikasi boleh ditemui sama ada melalui pelayaran senarai kategori " +"atau dengan cara menggelintar. Ia juga membolehkan anda kemaskini sistem " +"anda menggunakan kemaskini luar talian." + +#: data/appdata/org.gnome.Software.appdata.xml.in:25 +msgid "Overview panel" +msgstr "Panel selayang pandang" + +#: data/appdata/org.gnome.Software.appdata.xml.in:29 +msgid "Details panel" +msgstr "Panel perincian" + +#: data/appdata/org.gnome.Software.appdata.xml.in:33 +msgid "Installed panel" +msgstr "Panel terpasang" + +#: data/appdata/org.gnome.Software.appdata.xml.in:37 +msgid "Updates panel" +msgstr "Panel kemas kini" + +#: data/appdata/org.gnome.Software.appdata.xml.in:41 +msgid "The update details" +msgstr "Perincian kemas kini" + +#: data/appdata/org.gnome.Software.appdata.xml.in:1449 +msgid "The GNOME Project" +msgstr "Projek GNOME" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Pasang satu fail appstream ke dalam lokasi sistem" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Memasang fail appstream ke dalam lokasi sistem" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Satu senarai projek-projek yang serasi" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Ini merupakan satu senarai projek-projek serasi yang ditunjukkan seperti " +"GNOME, KDE dan XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Sama ada hendak mengemas kini dan menatar dalam Perisian GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Jika dilumpuhkan Perisian GNOME akan mengemas kini panel, tidak membuat apa-" +"apa tindakan kemas kini automatik atau memaklumkan penataran yang ada." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Muat turun dan pasang kemas kini secara automatik" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Jika dibenarkan, Perisian GNOME akan memuat turun kemas kini secara " +"automatik di balik tabir, dan juga memasang yang tidak memerlukan but semula." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Maklum pengguna berkenaan perisian yang dikemas kini dari balik tabir" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Jika dibenarkan Perisian GNOME akan memaklumkan pengguna berkenaan kemas " +"kini yang berlaku ketika pengguna melahu." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Sama ada hendak menyegar semula secara automatik ketika dalam sambung " +"bermeter" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Jika dibenarkan, Perisian GNOME menyegar semula secara automatik di balik " +"tabir walaupun menggunakan sambungan bermeter (walaupun memuat turun " +"beberapa data meta, memeriksa kemas kini, dll., yang mungkin menimbulkan kos " +"data buat pengguna)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Sama ada ini adalah kali pertama menjalankan Perisian GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Tunjuk penarafan bintang di sebelah aplikasi" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Tapis aplikasi-aplikasi berdasarkan set cabang lalai secara jauh" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Aplikasi-aplikasi bukan-bebas atau bukan-percuma menunjukkan dialog amaran " +"sebelum pemasangan" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Ketika aplikasi-aplikasi bukan-bebas atau bukan-percuma dipasang, satu " +"dialog amaran dipaparkan. Kawalan ini menunjukkan dialog tersebut boleh " +"dipaksa atau sebaliknya." + +#: data/org.gnome.software.gschema.xml:47 +msgid "A list of popular applications" +msgstr "Satu senarai aplikasi-aplikasi terkenal" + +#: data/org.gnome.software.gschema.xml:48 +msgid "A list of applications to use, overriding the system defined ones." +msgstr "" +"Satu senarai aplikasi-aplikasi yang hendak digunakan, membatalkan apa yang " +"telah ditakrif oleh sistem." + +#: data/org.gnome.software.gschema.xml:52 +msgid "The last update check timestamp" +msgstr "Setem masa semakan kemas kini terakhir" + +#: data/org.gnome.software.gschema.xml:56 +msgid "The last upgrade notification timestamp" +msgstr "Setem masa pemberitahuan tatar yang terakhir" + +#: data/org.gnome.software.gschema.xml:60 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Setem masa bagi kemas kini keselamatan terakhir, dipadamkan selepas kemas " +"kini" + +#: data/org.gnome.software.gschema.xml:64 +msgid "The last update timestamp" +msgstr "Setem masa kemas kini terakhir" + +#: data/org.gnome.software.gschema.xml:68 +msgid "The last timestamp when the system was online and got any updates" +msgstr "" +"Setem masa terakhir bila sistem berada di dalam talian dan mendapat kemas " +"kini" + +#: data/org.gnome.software.gschema.xml:72 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Usia dalam saat untuk mengesahkan tangkap layar huluan masih sah" + +#: data/org.gnome.software.gschema.xml:73 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Pemilihan nilai lebih besar menyebabkan proses ke pelayan jauh lebih cepat " +"tetapi kemaskini-kemaskini bagi tangkap layar mengambil masa dipaparkan " +"kepada pengguna. Nilai 0 bermaksud tidak sesekali memeriksa pelayan " +"sekiranya imej sudah ada di dalam cache." + +#: data/org.gnome.software.gschema.xml:82 +msgid "The server to use for application reviews" +msgstr "Pelayan yang digunakan untuk tinjauan-tinjauan aplikasi" + +#: data/org.gnome.software.gschema.xml:86 +msgid "The minimum karma score for reviews" +msgstr "Skor karma minimum untuk tinjauan-tinjauan" + +#: data/org.gnome.software.gschema.xml:87 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" +"Tinjauan-tinjauan dengan nilai karma kurang daripada angka ini tidak akan " +"ditunjukkan." + +#: data/org.gnome.software.gschema.xml:91 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Satu senarai repositori rasmi yang tidak dianggap sebagai pihak ke-3" + +#: data/org.gnome.software.gschema.xml:95 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Satu senarai repositori rasmi yang patut dianggap sebagai perisian bebas" + +#: data/org.gnome.software.gschema.xml:99 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"URL lesen yang digunakan ketika sesebuah aplikasi patut dianggap sebagai " +"perisian bebas" + +#: data/org.gnome.software.gschema.xml:103 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Pasang aplikasi-aplikasi berkas untuk semua pengguna dalam sistem jika boleh" + +#: data/org.gnome.software.gschema.xml:107 +msgid "Allow access to the Software Repositories dialog" +msgstr "Benarkan capaian ke dialog Repositori-Repositori Perisian" + +#: data/org.gnome.software.gschema.xml:111 +msgid "Offer upgrades for pre-releases" +msgstr "Tawat penataran ketika pra-keluaran" + +#: data/org.gnome.software.gschema.xml:115 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Tunjuk beberapa unsur UI yang memberitahu pengguna apl tersebut jenis bukan-" +"bebas" + +#: data/org.gnome.software.gschema.xml:119 +msgid "Show the prompt to install nonfree software repositories" +msgstr "" +"Tunjuk makluman ketika memasang repositori-repositori perisian bukan-bebas" + +#: data/org.gnome.software.gschema.xml:123 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Tunjuk saiz terpasang bagi apl di dalam senarai aplikasi-aplikasi terpasang" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:127 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:128 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"URL yang menjelaskan apa itu perisian bukan-bebas atau nonfree dan " +"proprietari" + +#: data/org.gnome.software.gschema.xml:132 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"app-info folder" +msgstr "" +"Satu senarai URL yang menuju ke fail-fail appstream yang akan dimuat turun " +"ke dalam folder app-info" + +#: data/org.gnome.software.gschema.xml:136 +msgid "Install the AppStream files to a system-wide location for all users" +msgstr "" +"Pasang fail-fail AppStream ke dalam lokasi menyeluruhi-sistem untuk semua " +"pengguna" + +#: data/org.gnome.software.gschema.xml:140 +msgid "Enable GNOME Shell extensions repository" +msgstr "Benarkan repositori sambungan-sambungan GNOME Shell" + +#: data/org.gnome.software.gschema.xml:147 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Satu rentetan yang menyimpan id gnome-online-account yang digunakan ketika " +"mendaftar masuk" + +#: src/gnome-software-local-file.desktop.in:3 +msgid "Software Install" +msgstr "Pasang Perisian" + +#: src/gnome-software-local-file.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Pasang perisian terpilih di dalam sistem" + +#: src/gnome-software.ui:10 +msgid "Select All" +msgstr "Pilih Semua" + +#: src/gnome-software.ui:16 +msgid "Select None" +msgstr "Jangan Pilih Apa-Apa" + +#: src/gnome-software.ui:38 +msgid "_Software Repositories" +msgstr "Repositori _Perisian" + +#: src/gnome-software.ui:43 +msgid "_Update Preferences" +msgstr "_Kemas Kini Keutamaan" + +#: src/gnome-software.ui:52 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Perisian" + +#: src/gnome-software.ui:68 src/gs-update-dialog.ui:20 +msgid "Go back" +msgstr "Pergi balik" + +#. Translators: A label for a button to show all available software. +#: src/gnome-software.ui:100 +msgid "_Explore" +msgstr "_Jelajah" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gnome-software.ui:123 +msgid "_Installed" +msgstr "_Dipasang" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gnome-software.ui:163 +msgid "_Updates" +msgstr "_Kemas kini" + +#: src/gnome-software.ui:232 +msgid "Search" +msgstr "Gelintar" + +#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos +#. TRANSLATORS: this refers to where the app came from +#: src/gnome-software.ui:276 src/gs-app-row.c:287 src/gs-details-page.ui:886 +msgid "Source" +msgstr "Sumber" + +#. button in the info bar +#: src/gnome-software.ui:383 src/gs-repos-dialog.ui:5 src/gs-repos-dialog.ui:18 +msgid "Software Repositories" +msgstr "Repositori-Repositori Perisian" + +#. button in the info bar +#: src/gnome-software.ui:391 +msgid "Examine Disk" +msgstr "Periksa Cakera" + +#. button in the info bar +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gnome-software.ui:399 src/gs-updates-page.c:921 +msgid "Network Settings" +msgstr "Tetapan Rangkaian" + +#. button in the info bar +#: src/gnome-software.ui:407 +msgid "Restart Now" +msgstr "Mula Semula Sekarang" + +#. button in the info bar +#: src/gnome-software.ui:415 +msgid "More Information" +msgstr "Lagi Maklumat" + +#. TRANSLATORS: this is a locally downloaded package +#: lib/gs-app.c:4504 +msgid "Local file" +msgstr "Fail setempat" + +#: lib/gs-app.c:4556 +msgid "Package" +msgstr "Pakej" + +#: src/gs-app-addon-row.c:82 src/gs-app-row.c:412 +msgid "Pending" +msgstr "Menunggu" + +#: src/gs-app-addon-row.c:88 src/gs-app-row.ui:175 src/gs-app-tile.ui:51 +#: src/gs-feature-tile.c:68 +msgid "Installed" +msgstr "Dipasang" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being installed +#: src/gs-app-addon-row.c:92 src/gs-app-row.c:165 src/gs-details-page.c:329 +#: src/gs-third-party-repo-row.c:99 +msgid "Installing" +msgstr "Memasang" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being removed +#: src/gs-app-addon-row.c:96 src/gs-app-row.c:171 src/gs-repo-row.c:126 +#: src/gs-third-party-repo-row.c:106 +msgid "Removing" +msgstr "Membuang" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:109 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Mod permulaan: sama ada 'kemas kini', 'dikemas kini', 'dipasang' atau " +"'selayang pandang'" + +#: src/gs-application.c:109 +msgid "MODE" +msgstr "MOD" + +#: src/gs-application.c:111 +msgid "Search for applications" +msgstr "Gelintar aplikasi" + +#: src/gs-application.c:111 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:113 +msgid "Show application details (using application ID)" +msgstr "Tunjuk perincian aplikasi (menggunakan ID aplikasi)" + +#: src/gs-application.c:113 src/gs-application.c:117 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:115 +msgid "Show application details (using package name)" +msgstr "Tunjuk perincian aplikasi (menggunakan nama pakej)" + +#: src/gs-application.c:115 +msgid "PKGNAME" +msgstr "NAMAPKG" + +#: src/gs-application.c:117 +msgid "Install the application (using application ID)" +msgstr "Pasang aplikasi (menggunakan ID aplikasi)" + +#: src/gs-application.c:119 +msgid "Open a local package file" +msgstr "Buka satu fail pakej setempat" + +#: src/gs-application.c:119 +msgid "FILENAME" +msgstr "NAMAFAIL" + +#: src/gs-application.c:121 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Jenis interaksi yang dijangka bagi tindakan ini: sama ada 'tiada', 'maklum', " +"atau 'penuh'" + +#: src/gs-application.c:124 +msgid "Show verbose debugging information" +msgstr "Tunjuk maklumat penyahpepijat berjela" + +#: src/gs-application.c:126 +msgid "Installs any pending updates in the background" +msgstr "Pasang mana-mana kemas kini-kemas kini tertangguh di balik tabir" + +#: src/gs-application.c:128 +msgid "Show update preferences" +msgstr "Tunjuk keutamaan kemas kini" + +#: src/gs-application.c:130 +msgid "Quit the running instance" +msgstr "Tutup kejadian yang masih berjalan" + +#: src/gs-application.c:132 +msgid "Prefer local file sources to AppStream" +msgstr "Utamakan sumber-sumber fail setempat ke AppStream" + +#: src/gs-application.c:134 +msgid "Show version number" +msgstr "Tunjuk nombor versi" + +#: src/gs-application.c:328 +msgid "translator-credits" +msgstr "abuyop" + +#. TRANSLATORS: this is the title of the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#. TRANSLATORS: this is the menu item that opens the about window, e.g. +#. * 'About Software' or 'About Application Installer' where the %s is +#. * the application name chosen by the distro +#: src/gs-application.c:335 src/gs-shell.c:1891 +#, c-format +msgid "About %s" +msgstr "Mengenai %s" + +#. TRANSLATORS: well, we seem to think so, anyway +#: src/gs-application.c:339 +msgid "A nice way to manage the software on your system." +msgstr "Satu cara yang elok mengurus perisian di dalam sistem anda." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:567 +msgid "Sorry! There are no details for that application." +msgstr "Mohon maaf, tiada perincian untuk aplikasi tersebut." + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: src/gs-app-row.c:120 +msgid "Visit website" +msgstr "Lawati tapak sesawang" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:125 +msgid "Install…" +msgstr "Pasang…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: src/gs-app-row.c:132 src/gs-updates-section.c:476 +msgid "Cancel" +msgstr "Batal" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#. TRANSLATORS: button text +#. TRANSLATORS: update the fw +#: src/gs-app-row.c:139 src/gs-common.c:287 src/gs-page.c:273 +msgid "Install" +msgstr "Pasang" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:146 +msgid "Update" +msgstr "Kemas kini" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-app-row.c:150 src/gs-app-row.c:159 src/gs-page.c:434 +#: src/gs-repos-dialog.c:326 +msgid "Remove" +msgstr "Buang" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:277 +msgid "Device cannot be used during update." +msgstr "Peranti tidak dapat digunakan ketika kemas kini." + +#: src/gs-app-row.c:470 src/gs-update-dialog.ui:182 +msgid "Requires additional permissions" +msgstr "Memerlukan keizinan tambahan" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: lib/gs-category.c:177 +msgid "Other" +msgstr "Lain-lain" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:182 +msgid "All" +msgstr "Semua" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:186 +msgid "Featured" +msgstr "Difiturkan" + +#. TRANSLATORS: This is a heading on the categories page. %s gets +#. replaced by the category name, e.g. 'Graphics & Photography' +#: src/gs-category-page.c:475 +#, c-format +msgid "Featured %s" +msgstr "%s Terfitur" + +#. Translators: A label for a button to sort apps by their rating. +#: src/gs-category-page.ui:26 src/gs-review-dialog.ui:74 +msgid "Rating" +msgstr "Penarafan" + +#. Translators: A label for a button to sort apps alphabetically. +#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm" +#: src/gs-category-page.ui:32 src/gs-origin-popover-row.c:58 +msgid "Name" +msgstr "Nama" + +#. TRANSLATORS: A label for a button to show the settings for +#. the selected shell extension. +#: src/gs-category-page.ui:118 src/gs-details-page.c:930 +msgid "Extension Settings" +msgstr "Tetapan Sambungan" + +#: src/gs-category-page.ui:136 +msgid "" +"Extensions are used at your own risk. If you have any system problems, it is " +"recommended to disable them." +msgstr "" +"Sambungan-sambungan digunakan atas risiko anda sendiri. Jika anda masih " +"menghadapi masalah sistem, disarankan melumpuhkannya." + +#. TRANSLATORS: This is a label for the category filter drop down, which all together can read e.g. 'Show Vector Graphics'. +#: src/gs-category-page.ui:156 +msgid "Show" +msgstr "Tunjuk" + +#: src/gs-category-page.ui:173 +msgid "Subcategories filter menu" +msgstr "Menu tapisan sub-kategori" + +#. TRANSLATORS: This is a label for the category sort drop down, which all together can read e.g. 'Sort Top Rated'. +#: src/gs-category-page.ui:204 +msgid "Sort" +msgstr "Isih" + +#: src/gs-category-page.ui:220 +msgid "Subcategories sorting menu" +msgstr "Menu pengisihan sub-kategori" + +#. TRANSLATORS: the user isn't reading the question +#: lib/gs-cmd.c:190 +#, c-format +msgid "Please enter a number from 1 to %u: " +msgstr "Sila masukkan nombor dari 1 hingga %u: " + +#. TRANSLATORS: asking the user to choose an app from a list +#: lib/gs-cmd.c:253 +msgid "Choose an application:" +msgstr "Pilih satu aplikasi:" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:123 +msgid "OS updates are now installed" +msgstr "Kemas kini-kemas kini OS kini telah dipasang" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:126 +msgid "Recently installed updates are available to review" +msgstr "" +"Kemas kini-kemas kini dipasang baru-baru ini telah tersedia untuk ditinjau " +"semula" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:131 src/gs-common.c:145 +#, c-format +msgid "%s is now installed" +msgstr "%s kini telah dipasang" + +#. TRANSLATORS: an application has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:135 src/gs-common.c:149 +msgid "A restart is required for the changes to take effect." +msgstr "Satu mula semula diperlukan supaya perubahan yang dibuat berkesan." + +#. TRANSLATORS: this is the body of a notification that an application +#. * has been successfully installed +#: src/gs-common.c:139 +msgid "Application is ready to be used." +msgstr "Aplikasi sedia digunakan." + +#. TRANSLATORS: button text +#: src/gs-common.c:159 src/gs-common.c:638 +msgid "Restart" +msgstr "Mula semula" + +#. TRANSLATORS: this is button that opens the newly installed application +#: src/gs-common.c:163 +msgid "Launch" +msgstr "Lancar" + +#. TRANSLATORS: window title +#: src/gs-common.c:221 +msgid "Install Third-Party Software?" +msgstr "Pasang Perisian Pihak-Ketiga?" + +#. TRANSLATORS: window title +#: src/gs-common.c:225 src/gs-repos-dialog.c:235 +msgid "Enable Third-Party Software Repository?" +msgstr "Benarkan Repositori Perisian Pihak-Ketiga?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:241 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s bukan perisian bebas dan bersumber terbuka, dan disediakan " +"oleh \"%s\"." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. Application name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:251 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s disediakan oleh \"%s\"." + +#: src/gs-common.c:260 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Repositori perisian ini mesti dibenarkan supaya pemasangan dapat diteruskan." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:270 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Ia mungkin menyalahi undang-undang jika memasang atau menggunakan %s di " +"beberapa negara tertentu." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:276 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Ia mungkin menyalahi undang-undang jika memasang atau menggunakan kodeks ini " +"di beberapa negara tertentu." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:283 +msgid "Don’t Warn Again" +msgstr "Jangan Beri Amaran Lagi" + +#. TRANSLATORS: button text +#: src/gs-common.c:292 +msgid "Enable and Install" +msgstr "Benarkan dan Pasang" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:440 +msgid "Detailed errors from the package manager follow:" +msgstr "Ralat-ralat secara terperinci daripada pengurus pakej berikut:" + +#: src/gs-common.c:459 src/gs-details-page.ui:447 +msgid "Details" +msgstr "Perincian" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:624 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Satu kemas kini telah dipasang" +msgstr[1] "Kemas kini telah dipasang" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:629 +msgid "A restart is required for it to take effect." +msgid_plural "A restart is required for them to take effect." +msgstr[0] "Satu mula diperlukan supaya ia berkesan." +msgstr[1] "Satu mula diperlukan supaya ia berkesan." + +#. TRANSLATORS: button text +#: src/gs-common.c:636 src/gs-update-monitor.c:119 +msgid "Not Now" +msgstr "Bukan Sekarang" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:59 +msgid "No cartoon violence" +msgstr "Tiada aksi keganasan kartun" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:61 +msgid "Cartoon characters in unsafe situations" +msgstr "Karakter-karakter kartun dalam situasi-situasi tidak selamat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:63 +msgid "Cartoon characters in aggressive conflict" +msgstr "Karakter-karakter kartun berada dalam konflik yang agresif" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:65 +msgid "Graphic violence involving cartoon characters" +msgstr "Keganasan dalam bentuk grafik yang melibatkan karakter-karakter kartun" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:70 +msgid "No fantasy violence" +msgstr "Tiada aksi keganasan fantasi" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:72 +msgid "Characters in unsafe situations easily distinguishable from reality" +msgstr "" +"Karakter-karakter dalam situasi tidak selamat yang mudah dibezakan dengan " +"realiti" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:74 +msgid "Characters in aggressive conflict easily distinguishable from reality" +msgstr "" +"Karakter-karakter berada dalam konflik agresif yang mudah dibezakan dengan " +"realiti" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:76 +msgid "Graphic violence easily distinguishable from reality" +msgstr "Keganasan dalam bentuk grafik yang mudah dibezakan dengan realiti" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:81 +msgid "No realistic violence" +msgstr "Tiada aksi keganasan realistik" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:83 +msgid "Mildly realistic characters in unsafe situations" +msgstr "" +"Karakter-karakter berkeadaan sedikit realistik dalam situasi-situasi tidak " +"selamat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:85 +msgid "Depictions of realistic characters in aggressive conflict" +msgstr "Gambaran karakter-karakter berkeadaan realistik dengan konflik agresif" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:87 +msgid "Graphic violence involving realistic characters" +msgstr "" +"Keganasan dalam bentuk grafik yang melibatkan karakter-karakter berkeadaan " +"realistik" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:92 +msgid "No bloodshed" +msgstr "Tiada pertumpahan darah" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:94 +msgid "Unrealistic bloodshed" +msgstr "Pertumpahan darah tidak realistik" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:96 +msgid "Realistic bloodshed" +msgstr "Pertumpahan darah yang realistik" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:98 +msgid "Depictions of bloodshed and the mutilation of body parts" +msgstr "Gambaran pertumpahan darah dan pencacatan anggota badan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:103 +msgid "No sexual violence" +msgstr "Tiada aksi keganasan seks" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:105 +msgid "Rape or other violent sexual behavior" +msgstr "Aksi rogol atau lain-lain kelakuan seks ganas" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:112 +msgid "No references to alcohol" +msgstr "Tiada penggambaran berkenaan alkohol" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:114 +msgid "References to alcoholic beverages" +msgstr "Gambaran berkenaan minuman beralkohol" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:116 +msgid "Use of alcoholic beverages" +msgstr "Penggunaan minuman beralkohol" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:122 +msgid "No references to illicit drugs" +msgstr "Tiada penggambaran berkenaan dadah-dadah terlarang" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:124 +msgid "References to illicit drugs" +msgstr "Gambaran berkenaan dadah-dadah terlarang" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:126 +msgid "Use of illicit drugs" +msgstr "Penggunaan dadah-dadah terlarang" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:132 +msgid "No references to tobacco products" +msgstr "Tiada rujukan terhadap produk-produk tembakau" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:134 +msgid "References to tobacco products" +msgstr "Gambaran berkenaan produk-produk tembakau" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:136 +msgid "Use of tobacco products" +msgstr "Penggunaan produk-produk tembakau" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:142 +msgid "No nudity of any sort" +msgstr "Tiada unsur-unsur kebogelan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:144 +msgid "Brief artistic nudity" +msgstr "Sedikit unsur-unsur kebogelan bersifat artistik" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:146 +msgid "Prolonged nudity" +msgstr "Gambaran kebogelan yang berlanjutan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:152 +msgid "No references to or depictions of sexual nature" +msgstr "Tiada gambaran berkenaan tabiat-tabiat seks" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:154 +msgid "Provocative references or depictions" +msgstr "Gambaran berkenaan sikap-sikap provokatif" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:156 +msgid "Sexual references or depictions" +msgstr "Gambaran berkenaan aksi-aksi seksual" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:158 +msgid "Graphic sexual behavior" +msgstr "Kelakuan seksual yang jelas dan nyata" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:163 +msgid "No profanity of any kind" +msgstr "Tiada aksi-aksi tidak senonoh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:165 +msgid "Mild or infrequent use of profanity" +msgstr "Sedikit atau jarang-jarang kelakuan tidak senonoh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:167 +msgid "Moderate use of profanity" +msgstr "Ada pelakuan tidak senonoh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:169 +msgid "Strong or frequent use of profanity" +msgstr "Aksi-aksi tidak senonoh kerap ditayangkan atau sangat menonjol" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:174 +msgid "No inappropriate humor" +msgstr "Tiada lawak tidak senonoh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:176 +msgid "Slapstick humor" +msgstr "Lawak bodoh" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:178 +msgid "Vulgar or bathroom humor" +msgstr "Lawak ganas" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:180 +msgid "Mature or sexual humor" +msgstr "Lawak dewasa atau seks" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:185 +msgid "No discriminatory language of any kind" +msgstr "Tiada pengucapan bersifat diskriminasi" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:187 +msgid "Negativity towards a specific group of people" +msgstr "Ada unsur-unsur negatif yang khusus kepada kumpulan tertentu" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:189 +msgid "Discrimination designed to cause emotional harm" +msgstr "Ada unsur-unsur diskriminasi yang mengugat emosi" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:191 +msgid "Explicit discrimination based on gender, sexuality, race or religion" +msgstr "Ada unsur-unsur diskriminasi terhadap jantina, seks, bangsa atau agama" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:196 +msgid "No advertising of any kind" +msgstr "Tiada pengiklanan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:198 +msgid "Product placement" +msgstr "Ada memaparkan produk-produk tertentu" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:200 +msgid "Explicit references to specific brands or trademarked products" +msgstr "Gambaran jelas terhadap jenama-jenama atau produk-produk tertentu" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:202 +msgid "Users are encouraged to purchase specific real-world items" +msgstr "Para pengguna digalakkan membeli item-item sebenar" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:207 +msgid "No gambling of any kind" +msgstr "Tiada aksi-aksi perjudian" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:209 +msgid "Gambling on random events using tokens or credits" +msgstr "" +"Ada unsur-unsur perjudian pada acara-acara secara rawak menggunakan token " +"atau kredit" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:211 +msgid "Gambling using “play” money" +msgstr "Ada aksi perjudian menggunakan duit \"khusus\" yang lain" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:213 +msgid "Gambling using real money" +msgstr "Ada aksi perjudian menggunakan duit sebenar" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:218 +msgid "No ability to spend money" +msgstr "Tidak melibatkan penggunaan duit" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:220 +msgid "Users are encouraged to donate real money" +msgstr "Para pengguna digalakkan menderma duit sebenar" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:223 +msgid "Ability to spend real money in-app" +msgstr "Ada fungsi yang melibatkan duit di dalam permainan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:228 +msgid "No way to chat with other users" +msgstr "Tiada fungsi sembang dengan pengguna lain" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:230 +msgid "User-to-user interactions without chat functionality" +msgstr "Interaksi permainan pengguna-dengan-pengguna tanpa fungsi sembang" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:232 +msgid "Moderated chat functionality between users" +msgstr "Ada fungsi sembang terpantau antara pengguna" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:234 +msgid "Uncontrolled chat functionality between users" +msgstr "Ada fungsi sembang tanpa kawalan antara pengguna" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:239 +msgid "No way to talk with other users" +msgstr "Tiada fungsi berbual dengan pengguna lain" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:241 +msgid "Uncontrolled audio or video chat functionality between users" +msgstr "Ada fungsi sembang audio atau video tanpa kawalan antara pengguna" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:248 +msgid "No sharing of social network usernames or email addresses" +msgstr "Tiada perkongsian nama pengguna rangkaian sosial atau alamat emel" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:250 +msgid "Sharing social network usernames or email addresses" +msgstr "Ada perkongsian nama pengguna rangkaian sosial atau alamat emel" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:257 +msgid "No sharing of user information with third parties" +msgstr "Tiada perkongsian maklumat pengguna dengan pihak ketiga" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:259 +msgid "Checking for the latest application version" +msgstr "Ada pemeriksaan versi aplikasi yang terkini" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:261 +msgid "Sharing diagnostic data that does not let others identify the user" +msgstr "" +"Ada perkongsian data diagnostik yang membolehkan orang lain dapat mengenal " +"pasti pengguna" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:263 +msgid "Sharing information that lets others identify the user" +msgstr "" +"Ada perkongsian maklumat yang membolehkan orang lain dapat mengenal pasti " +"pengguna" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:268 +msgid "No sharing of physical location with other users" +msgstr "Tiada perkongsian lokasi sebenar dengan pengguna lain" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:270 +msgid "Sharing physical location with other users" +msgstr "Ada perkongsian lokasi sebenar dengan pengguna lain" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:279 +msgid "No references to homosexuality" +msgstr "Tiada gambaran berkenaan homoseks" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:281 +msgid "Indirect references to homosexuality" +msgstr "Gambaran tidak langsung berkenaan homoseks" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:283 +msgid "Kissing between people of the same gender" +msgstr "Ada adegan cium antara sama jantina" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:285 +msgid "Graphic sexual behavior between people of the same gender" +msgstr "Ada adegan seks yang jelas dan nyata antara sama jantina" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:290 +msgid "No references to prostitution" +msgstr "Tiada gambaran berkenaan pelacuran" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:292 +msgid "Indirect references to prostitution" +msgstr "Gambaran tidak langsung berkenaan pelacuran" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:294 +msgid "Direct references to prostitution" +msgstr "Ada gambaran jelas berkenaan pelacuran" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:296 +msgid "Graphic depictions of the act of prostitution" +msgstr "Ada gambaran yang jelas dan nyata aksi-aksi pelacuran" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:301 +msgid "No references to adultery" +msgstr "Tiada penggambaran berkenaan zina" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:303 +msgid "Indirect references to adultery" +msgstr "Ada gambaran tidak langsung berkenaan zina" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:305 +msgid "Direct references to adultery" +msgstr "Ada gambaran jelas berkenaan zina" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:307 +msgid "Graphic depictions of the act of adultery" +msgstr "Ada gambaran yang jelas dan nyata berkenaan aksi-aksi penzinaan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:312 +msgid "No sexualized characters" +msgstr "Tiada karakter-karakter seks" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:315 +msgid "Scantily clad human characters" +msgstr "Ada karakter-karakter manusia hampir tidak berpakaian" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:317 +msgid "Overtly sexualized human characters" +msgstr "Ada karakter-karakter manusia berkelakuan seks yang melampau" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:322 +msgid "No references to desecration" +msgstr "Tiada gambaran berkenaan penodaan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:324 +msgid "Depictions of or references to historical desecration" +msgstr "Ada gambaran berkenaan penodaan bersejarah" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:326 +msgid "Depictions of modern-day human desecration" +msgstr "Ada gambaran berkenaan penodaan manusia di era modern" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:328 +msgid "Graphic depictions of modern-day desecration" +msgstr "Ada gambaran jelas penodaan di era modern" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:333 +msgid "No visible dead human remains" +msgstr "Tiada penampakan mayat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:335 +msgid "Visible dead human remains" +msgstr "Ada penampakan mayat" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:337 +msgid "Dead human remains that are exposed to the elements" +msgstr "Ada penampakan mayat yang telah terdedah dengan persekitaran" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:339 +msgid "Graphic depictions of desecration of human bodies" +msgstr "Ada gambaran jelas penodaan jasad manusia" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:344 +msgid "No references to slavery" +msgstr "Tiada gambaran berkenaan perhambaan" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:346 +msgid "Depictions of or references to historical slavery" +msgstr "Ada gambaran berkenaan perhambaan bersejarah" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:348 +msgid "Depictions of modern-day slavery" +msgstr "Ada gambaran berkenaan perhambaan di era modern" + +#. TRANSLATORS: content rating description +#: src/gs-content-rating.c:350 +msgid "Graphic depictions of modern-day slavery" +msgstr "Ada gambaran jelas perhambaan di era modern" + +#. TRANSLATORS: This is the formatting of English and localized name +#. of the rating e.g. "Adults Only (solo adultos)" +#: src/gs-content-rating.c:406 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#: src/gs-content-rating.c:540 +msgid "General" +msgstr "Am" + +#: src/gs-content-rating.c:549 +msgid "ALL" +msgstr "SEMUA" + +#: src/gs-content-rating.c:553 +msgid "Adults Only" +msgstr "Dewasa Sahaja" + +#: src/gs-content-rating.c:555 +msgid "Mature" +msgstr "Dewasa" + +#: src/gs-content-rating.c:557 +msgid "Teen" +msgstr "Remaja" + +#: src/gs-content-rating.c:559 +msgid "Everyone 10+" +msgstr "Sesiapa Sahaja 10+" + +#: src/gs-content-rating.c:561 +msgid "Everyone" +msgstr "Sesiapa Sahaja" + +#: src/gs-content-rating.c:563 +msgid "Early Childhood" +msgstr "Awal Kanak-Kanak" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:281 +msgid "An application" +msgstr "Satu aplikasi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:287 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s memohon sokongan format fail tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:289 +msgid "Additional MIME Types Required" +msgstr "Jenis MIME Tambahan Diperlukan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:293 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s memohon fon-fon tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:295 +msgid "Additional Fonts Required" +msgstr "Fon-fon Tambahan Diperlukan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:299 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s memohon kodeks-kodeks multimedia tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:301 +msgid "Additional Multimedia Codecs Required" +msgstr "Kodeks-Kodeks Multimedia Tambahan Diperlukan" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:305 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s memohon pemacu pencetak tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:307 +msgid "Additional Printer Drivers Required" +msgstr "Pemacu Pencetak Tambahan Diperlukan" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:311 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s memohon pakej-pakej tambahan." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:313 +msgid "Additional Packages Required" +msgstr "Pakej-Pakej Tambahan Diperlukan" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:322 +msgid "Find in Software" +msgstr "Cari dalam Perisian" + +#: src/gs-details-page.c:324 +msgid "Removing…" +msgstr "Membuang…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:343 +msgid "Pending installation…" +msgstr "Pemasangan tertangguh…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:350 +msgid "Pending update…" +msgstr "Kemas kini tertangguh…" + +#. TRANSLATORS: this is the warning box +#: src/gs-details-page.c:710 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "" +"Aplikasi ini hanya boleh digunakan jika ada sambungan internet yang aktif." + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo +#: src/gs-details-page.c:855 src/gs-details-page.c:872 +#: src/gs-details-page.ui:167 src/gs-third-party-repo-row.c:83 +#: src/gs-upgrade-banner.c:70 +msgid "_Install" +msgstr "_Pasang" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#. TRANSLATORS: this is a button in the software repositories +#. dialog for installing a repo. +#. The ellipsis indicates that further steps are required +#: src/gs-details-page.c:886 src/gs-third-party-repo-row.c:75 +msgid "_Install…" +msgstr "_Pasang…" + +#. TRANSLATORS: A label for a button to execute the selected +#. application. +#: src/gs-details-page.c:935 +msgid "_Launch" +msgstr "_Lancar" + +#. TRANSLATORS: button text in the header when an application can be erased +#: src/gs-details-page.c:960 src/gs-details-page.ui:192 +msgid "_Remove" +msgstr "B_uang" + +#: src/gs-details-page.c:991 src/gs-update-dialog.c:92 +msgid "Network" +msgstr "Rangkaian" + +#: src/gs-details-page.c:991 src/gs-update-dialog.c:92 +msgid "Can communicate over the network" +msgstr "Boleh berkomunikasi menerusi rangkaian" + +#: src/gs-details-page.c:992 src/gs-update-dialog.c:93 +msgid "System Services" +msgstr "Perkhidmatan-Perkhidmatan Sistem" + +#: src/gs-details-page.c:992 src/gs-update-dialog.c:93 +msgid "Can access D-Bus services on the system bus" +msgstr "Boleh mencapai perkhidmatan-perkhidmatan D-Bus di dalam bas sistem" + +#: src/gs-details-page.c:993 src/gs-update-dialog.c:94 +msgid "Session Services" +msgstr "Perkhidmatan-Perkhidmatan Sesi" + +#: src/gs-details-page.c:993 src/gs-update-dialog.c:94 +msgid "Can access D-Bus services on the session bus" +msgstr "Boleh mencapai perkhidmatan-perkhidmatan D-Bus di dalam bas sesi" + +#: src/gs-details-page.c:994 src/gs-update-dialog.c:95 +msgid "Devices" +msgstr "Peranti" + +#: src/gs-details-page.c:994 src/gs-update-dialog.c:95 +msgid "Can access system device files" +msgstr "Boleh mencapai fail-fail peranti sistem" + +#: src/gs-details-page.c:995 src/gs-details-page.c:996 +#: src/gs-update-dialog.c:96 src/gs-update-dialog.c:97 +msgid "Home folder" +msgstr "Folder rumah" + +#: src/gs-details-page.c:995 src/gs-details-page.c:997 +#: src/gs-details-page.c:999 src/gs-update-dialog.c:96 +#: src/gs-update-dialog.c:98 src/gs-update-dialog.c:100 +msgid "Can view, edit and create files" +msgstr "Boleh lihat, sunting dan cipta fail" + +#: src/gs-details-page.c:996 src/gs-details-page.c:998 +#: src/gs-details-page.c:1000 src/gs-update-dialog.c:97 +#: src/gs-update-dialog.c:99 src/gs-update-dialog.c:101 +msgid "Can view files" +msgstr "Boleh melihat fail-fail" + +#: src/gs-details-page.c:997 src/gs-details-page.c:998 +#: src/gs-update-dialog.c:98 src/gs-update-dialog.c:99 +msgid "File system" +msgstr "Sistem fail" + +#: src/gs-details-page.c:999 src/gs-details-page.c:1000 +#: src/gs-update-dialog.c:100 src/gs-update-dialog.c:101 +msgid "Downloads folder" +msgstr "Folder Muat Turun" + +#: src/gs-details-page.c:1001 src/gs-update-dialog.c:102 +msgid "Settings" +msgstr "Tetapan" + +#: src/gs-details-page.c:1001 src/gs-update-dialog.c:102 +msgid "Can view and change any settings" +msgstr "Boleh melihat dan mengubah apa jua tetapan" + +#: src/gs-details-page.c:1002 src/gs-update-dialog.c:103 +msgid "Legacy display system" +msgstr "Sistem paparan legasi" + +#: src/gs-details-page.c:1002 src/gs-update-dialog.c:103 +msgid "Uses an old, insecure display system" +msgstr "Menggunakan sistem paparan yang lama dan tidak selamat" + +#: src/gs-details-page.c:1003 src/gs-update-dialog.c:104 +msgid "Sandbox escape" +msgstr "Sandbox escape" + +#: src/gs-details-page.c:1003 src/gs-update-dialog.c:104 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Boleh keluar dari kotak pasir dan memintas apa jua sekatan yang lain" + +#: src/gs-details-page.c:1018 +msgid "This application is fully sandboxed." +msgstr "Aplikasi ini sepenuhnya dikotakpasirkan." + +#: src/gs-details-page.c:1026 +msgid "" +"Unable to determine which parts of the system this application accesses. " +"This is typical for older applications." +msgstr "" +"Tidak boleh menentukan bahagian sistem bagi aplikasi ini yang manakah boleh " +"dicapai. Ia biasa berlaku kepada aplikasi-aplikasi yang lama." + +#. TRANSLATORS: this is where the version is not known +#: src/gs-details-page.c:1185 +msgctxt "version" +msgid "Unknown" +msgstr "Tidak Diketahui" + +#. TRANSLATORS: this is where the updated date is not known +#: src/gs-details-page.c:1198 +msgctxt "updated" +msgid "Never" +msgstr "Tidak sesekali" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: src/gs-details-page.c:1251 +msgctxt "origin" +msgid "Unknown" +msgstr "Tidak Diketahui" + +#: src/gs-details-page.c:1304 +msgid "Low" +msgstr "Rendah" + +#: src/gs-details-page.c:1306 +msgid "Medium" +msgstr "Sederhana" + +#: src/gs-details-page.c:1308 +msgid "High" +msgstr "Tinggi" + +#. This refers to the license of the application +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-details-page.c:1310 src/gs-details-page.ui:1006 +#: src/gs-review-row.c:57 +msgid "Unknown" +msgstr "Tidak Diketahui" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1648 +msgid "You need internet access to write a review" +msgstr "Anda perlukan capaian internet untuk menulis ulasan" + +#: src/gs-details-page.c:1834 src/gs-details-page.c:1850 +#, c-format +msgid "Unable to find “%s”" +msgstr "Tidak dapat mencari \"%s\"" + +#. TRANSLATORS: see the wikipedia page +#: src/gs-details-page.c:2428 +msgid "Public domain" +msgstr "Domain awam" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://de.wikipedia.org/wiki/Gemeinfreiheit +#: src/gs-details-page.c:2431 +msgid "https://en.wikipedia.org/wiki/Public_domain" +msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#. TRANSLATORS: Replace the link with a version in your language, +#. * e.g. https://www.gnu.org/philosophy/free-sw.de +#: src/gs-details-page.c:2438 +msgid "https://www.gnu.org/philosophy/free-sw" +msgstr "https://www.gnu.org/philosophy/free-sw" + +#. TRANSLATORS: see GNU page +#: src/gs-details-page.c:2448 src/gs-details-page.ui:1250 +msgid "Free Software" +msgstr "Perisian Bebas" + +#. TRANSLATORS: for the free software popover +#: src/gs-details-page.c:2505 +msgid "Users are bound by the following license:" +msgid_plural "Users are bound by the following licenses:" +msgstr[0] "Pengguna terikat dengan lesen berikut:" +msgstr[1] "Pengguna terikat dengan lesen-lesen berikut:" + +#: src/gs-details-page.c:2532 src/gs-details-page.ui:1322 +msgid "More information" +msgstr "Maklumat lanjut" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Halaman perincian" + +#: src/gs-details-page.ui:222 +msgid "Downloading" +msgstr "Memuat turun" + +#: src/gs-details-page.ui:252 src/gs-removal-dialog.ui:32 +#: src/gs-review-dialog.ui:22 src/gs-upgrade-banner.ui:112 +msgid "_Cancel" +msgstr "Bata_l" + +#: src/gs-details-page.ui:262 +msgid "_Update" +msgstr "_Kemas Kini" + +#. Translators: A label for a button to add a shortcut to the selected application. +#: src/gs-details-page.ui:278 +msgid "_Add shortcut" +msgstr "_Tambah pintasan" + +#. Translators: A label for a button to remove a shortcut to the selected application. +#: src/gs-details-page.ui:292 +msgid "Re_move shortcut" +msgstr "_Buang pintasan" + +#: src/gs-details-page.ui:366 +msgid "No screenshot provided" +msgstr "Tiada tangkap layar disediakan" + +#: src/gs-details-page.ui:386 +msgid "Software Repository Included" +msgstr "Repositori perisian disertakan" + +#: src/gs-details-page.ui:387 +msgid "" +"This application includes a software repository which provides updates, as " +"well as access to other software." +msgstr "" +"Aplikasi ini menyertakan satu repositori perisian yang dapat menyediakan " +"kemas kini-kemas kini, dan juga capaian ke lain-lain perisian." + +#: src/gs-details-page.ui:394 +msgid "No Software Repository Included" +msgstr "Tiada Repositori Perisian Disertakan" + +#: src/gs-details-page.ui:395 +msgid "" +"This application does not include a software repository. It will not be " +"updated with new versions." +msgstr "" +"Aplikasi ini tidak menyertakan satu repositori perisian. Ia tidak " +"dikemaskinikan dengan versi-versi baharu." + +#: src/gs-details-page.ui:403 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Perisian ini sudah pun disediakan oleh distribusi anda dan tidak perlu " +"diganti." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:410 +msgid "Software Repository Identified" +msgstr "Repositori Perisian Dikenal Pasti" + +#: src/gs-details-page.ui:411 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Dengan menambah repositori perisian, ia membolehkan anda capai perisian " +"tambahan dan penatarannya." + +#: src/gs-details-page.ui:412 +msgid "Only use software repositories that you trust." +msgstr "Hanya guna repositori-repositori perisian yang anda percayai." + +#: src/gs-details-page.ui:422 +msgid "_Website" +msgstr "_Tapak Sesawang" + +#: src/gs-details-page.ui:431 +msgid "_Donate" +msgstr "_Derma" + +#: src/gs-details-page.ui:541 +msgid "Localized in your Language" +msgstr "Diterjemah dalam Bahasa anda" + +#: src/gs-details-page.ui:552 +msgid "Documentation" +msgstr "Dokumentasi" + +#: src/gs-details-page.ui:563 +msgid "Release Activity" +msgstr "Aktiviti Keluaran" + +#: src/gs-details-page.ui:574 +msgid "System Integration" +msgstr "Penyepaduan Sistem" + +#: src/gs-details-page.ui:585 +msgid "Sandboxed" +msgstr "Dikotakpasirkan" + +#. TRANSLATORS: the title for Snap channels +#: src/gs-details-page.ui:605 src/gs-origin-popover-row.c:102 +msgid "Channel" +msgstr "Saluran" + +#. Translators: The available version of an app +#: src/gs-details-page.ui:641 src/gs-origin-popover-row.ui:151 +msgid "Version" +msgstr "Versi" + +#: src/gs-details-page.ui:677 +msgid "Age Rating" +msgstr "Penarafan Usia" + +#: src/gs-details-page.ui:715 src/gs-details-page.ui:1408 +msgid "Permissions" +msgstr "Keizinan" + +#: src/gs-details-page.ui:753 +msgid "Updated" +msgstr "Dikemaskini" + +#: src/gs-details-page.ui:787 +msgid "Category" +msgstr "Kategori" + +#: src/gs-details-page.ui:824 +msgid "Installed Size" +msgstr "Saiz Dipasang" + +#: src/gs-details-page.ui:855 +msgid "Download Size" +msgstr "Saiz Muat Turun" + +#: src/gs-details-page.ui:917 +msgid "Developer" +msgstr "Pembangun" + +#: src/gs-details-page.ui:963 +msgid "License" +msgstr "Lesen" + +#. This refers to the license of the application +#: src/gs-details-page.ui:982 +msgid "Free" +msgstr "Lapang" + +#. This refers to the license of the application +#: src/gs-details-page.ui:994 +msgid "Proprietary" +msgstr "Proprietari" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the menu spec main category for Add-ons +#: src/gs-details-page.ui:1044 src/gs-installed-page.c:441 +#: plugins/core/gs-desktop-common.c:317 +msgid "Add-ons" +msgstr "Tambahan" + +#: src/gs-details-page.ui:1056 +msgid "Selected add-ons will be installed with the application." +msgstr "Tambahan terpilih akan dipasang bersama-sama aplikasi." + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-details-page.ui:1094 +msgid "Reviews" +msgstr "Ulasan" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1112 +msgid "_Write a Review" +msgstr "_Tulis satu Ulasan" + +#. Translators: Button to return more application-submitted reviews. +#: src/gs-details-page.ui:1133 +msgid "_Show More" +msgstr "Tunjuk _Lagi" + +#: src/gs-details-page.ui:1261 +msgid "" +"This means that the software can be freely run, copied, distributed, studied " +"and modified." +msgstr "" +"Ini bermaksud perisian boleh dijalankan, disalin, diagih, dikaji dan " +"diubahsuai secara bebas." + +#: src/gs-details-page.ui:1301 +msgid "Proprietary Software" +msgstr "Perisian Proprietari" + +#: src/gs-details-page.ui:1312 +msgid "" +"This means that the software is owned by an individual or a company. There " +"are often restrictions on its use and its source code cannot usually be " +"accessed." +msgstr "" +"Ini bermaksud perisian ini adalah milik individu atau syarikat tertentu. " +"Maka terdapat beberapa sekatan terhadap penggunaannya dan juga kod sumbernya " +"tidak boleh dicapai." + +#: src/gs-details-page.ui:1344 +msgid "Unknown Software License" +msgstr "Lesen Perisian Tidak Diketahui" + +#: src/gs-details-page.ui:1355 +msgid "The license terms of this software are unknown." +msgstr "Terma lesen bagi perisian ini tidak diketahui." + +#: src/gs-details-page.ui:1375 +msgid "The application was rated this way because it features:" +msgstr "Aplikasi telah ditaraf dengan cara ini kerana fiturnya:" + +#: src/gs-details-page.ui:1389 +msgid "No details were available for this rating." +msgstr "Tiada perincian tersedia untuk penarafan ini." + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:134 +msgid " and " +msgstr " dan " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:137 +msgid ", " +msgstr ", " + +#. TRANSLATORS: Application window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:163 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Fon tersedia untuk skrip %s" +msgstr[1] "Fon tersedia untuk skrip %s" + +#. TRANSLATORS: Application window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Perisian tersedia untuk %s" +msgstr[1] "Perisian tersedia untuk %s" + +#: src/gs-extras-page.c:213 +msgid "Unable to Find Requested Software" +msgstr "Tidak boleh Cari Perisian yang Dipinta" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:318 +#, c-format +msgid "%s not found" +msgstr "%s tidak ditemui" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:322 +msgid "on the website" +msgstr "di dalam laman sesawang" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:329 +#, c-format +msgid "No applications are available that provide the file %s." +msgstr "Tiada aplikasi-aplikasi yang tersedia menyertakan fail %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:333 src/gs-extras-page.c:344 src/gs-extras-page.c:355 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing applications " +"might be found %s." +msgstr "" +"Maklumat berkenaan%s, dan juga pilihan-pilihan bagaimana hendak mendapatkan " +"aplikasi-aplikasi boleh dapatkan di %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:340 src/gs-extras-page.c:362 +#, c-format +msgid "No applications are available for %s support." +msgstr "Tiada aplikasi tersedia untuk sokongan %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:351 +#, c-format +msgid "%s is not available." +msgstr "%s tidak tersedia." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:366 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an application that " +"can support this format might be found %s." +msgstr "" +"Maklumat berkenaan%s, dan juga pilihan-pilihan bagaimana hendak mendapatkan " +"aplikasi-aplikasi yang menyokong format ini boleh dapatkan di %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:373 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Tiada fon-fon tersedia untuk sokongan skrip %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:377 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Maklumat berkenaan%s, dan juga pilihan-pilihan bagaimana hendak mendapatkan " +"fon-fon tambahan boleh dapatkan di %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:384 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Tiada kodeks tambahan tersedia untuk format %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:388 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Maklumat berkenaan%s, dan juga pilihan-pilihan bagaimana hendak mendapatkan " +"kodeks yang dapat memainkan format ini bolehlah dapatkan di %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:395 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Tiada sumber-sumber Plasma tersedia untuk sokongan %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:399 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Maklumat berkenaan%s, dan juga pilihan-pilihan bagaimana hendak mendapatkan " +"sumber-sumber Plasma tambahan bolehlah dapatkan di %s." + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:406 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Tiada pemacu pencetak tersedia untuk %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:410 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Maklumat berkenaan%s, dan juga pilihan-pilihan bagaimana hendak mendapatkan " +"pemacu yang menyokong pencetak ini bolehlah dapatkan di %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:454 +msgid "this website" +msgstr "laman sesawang ini" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "this website" +#: src/gs-extras-page.c:458 +#, c-format +msgid "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgid_plural "" +"Unfortunately, the %s you were searching for could not be found. Please see " +"%s for more information." +msgstr[0] "" +"Malangnya, %s yang anda gelintar tidak ditemui. Sila rujuk %s untuk maklumat " +"lanjut." +msgstr[1] "" +"Malangnya, %s yang anda gelintar tidak ditemui. Sila rujuk %s untuk maklumat " +"lanjut." + +#: src/gs-extras-page.c:526 src/gs-extras-page.c:582 src/gs-extras-page.c:621 +msgid "Failed to find any search results" +msgstr "Gagal mencari apa-apa keputusan gelintar" + +#: src/gs-extras-page.c:809 +#, c-format +msgid "%s file format" +msgstr "Format fail %s" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Halaman kodeks" + +#: src/gs-first-run-dialog.ui:6 src/gs-first-run-dialog.ui:15 +msgid "Welcome" +msgstr "Selamat Datang" + +#: src/gs-first-run-dialog.ui:43 +msgid "Welcome to Software" +msgstr "Selamat Datang ke Perisian" + +#: src/gs-first-run-dialog.ui:53 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "" +"Perisian membolehkan anda pasang perisian yang anda perlukan, semuanya dalam " +"satu tempat. Sila rujuk cadangan-cadangan kami, layari kategori-kategori, " +"atau gelintar aplikasi-aplikasi yang anda mahukan." + +#: src/gs-first-run-dialog.ui:62 +msgid "_Let’s Go Shopping" +msgstr "_Jom Membeli-belah" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: src/gs-history-dialog.c:69 +msgctxt "app status" +msgid "Removed" +msgstr "Telah Dibuang" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: src/gs-history-dialog.c:75 +msgctxt "app status" +msgid "Installed" +msgstr "Dipasang" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: src/gs-history-dialog.c:81 +msgctxt "app status" +msgid "Updated" +msgstr "Dikemaskini" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: src/gs-history-dialog.c:87 +msgctxt "app status" +msgid "Unknown" +msgstr "Tidak Diketahui" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-history-dialog.c:110 src/gs-review-row.c:64 src/gs-updates-page.c:257 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#: src/gs-history-dialog.ui:5 +msgid "History" +msgstr "Sejarah" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: src/gs-installed-page.c:437 +msgid "System Applications" +msgstr "Aplikasi-Aplikasi Sistem" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Halaman terpasang" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:61 src/gs-loading-page.c:65 +msgid "Software catalog is being downloaded" +msgstr "Katalog perisian telah dimuat turun" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Memuatkan halaman" + +#: src/gs-loading-page.ui:47 +msgid "Starting up…" +msgstr "Memulakan…" + +#: src/gs-moderate-page.ui:7 +msgid "Moderate page" +msgstr "Halaman moderasi" + +#: src/gs-moderate-page.ui:85 +msgid "There are no reviews to moderate" +msgstr "Tiada ulasan untuk dimoderasikan" + +#. TRANSLATORS: the installation location for flatpaks +#: src/gs-origin-popover-row.c:83 +msgid "system" +msgstr "sistem" + +#. TRANSLATORS: the installation location for flatpaks +#: src/gs-origin-popover-row.c:86 +msgid "user" +msgstr "pengguna" + +#. TRANSLATORS: the title for Flatpak branches +#. Translators: The branch, e.g. 'stable' or '3.32' +#: src/gs-origin-popover-row.c:107 src/gs-origin-popover-row.ui:122 +msgid "Branch" +msgstr "Cabang" + +#: src/gs-origin-popover-row.ui:35 src/gs-repo-row.ui:75 +msgid "URL" +msgstr "URL" + +#. Translators: The packaging format of the app being installed, e.g. 'RPM' or 'Flatpak' +#: src/gs-origin-popover-row.ui:64 +msgid "Format" +msgstr "Format" + +#. Translators: The installation location for flatpaks, e.g. 'user' or 'system' +#: src/gs-origin-popover-row.ui:93 +msgid "Installation" +msgstr "Pemasangan" + +#. add button +#: src/gs-overview-page.c:312 +msgid "More…" +msgstr "Lagi…" + +#. TRANSLATORS: this is a heading for audio applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:562 +msgid "Recommended Audio & Video Applications" +msgstr "Aplikasi Audio & Video yang Disarankan" + +#. TRANSLATORS: this is a heading for games which have been +#. * featured ('recommended') by the distribution +#: src/gs-overview-page.c:567 +msgid "Recommended Games" +msgstr "Permainan Disarankan" + +#. TRANSLATORS: this is a heading for graphics applications +#. * which have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:572 +msgid "Recommended Graphics Applications" +msgstr "Aplikasi Grafik Disarankan" + +#. TRANSLATORS: this is a heading for office applications which +#. * have been featured ('recommended') by the distribution +#: src/gs-overview-page.c:577 +msgid "Recommended Productivity Applications" +msgstr "Aplikasi Produktiviti Disarankan" + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:925 src/gs-repos-dialog.c:828 +msgid "Access additional software from selected third party sources." +msgstr "" +"Capai perisian tambahan melalui sumber-sumber pihak ketiga yang terpilih." + +#. TRANSLATORS: this is the third party repositories info bar. +#: src/gs-overview-page.c:929 src/gs-repos-dialog.c:832 +msgid "" +"Some of this software is proprietary and therefore has restrictions on use, " +"sharing, and access to source code." +msgstr "" +"Sesetengah perisian bersifat proprietari dan memiliki sekatan terhadap " +"penggunaan, perkongsian, dan capaian kepada kod sumbernya." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-overview-page.c:934 src/gs-repos-dialog.c:837 +msgid "Find out more…" +msgstr "Ketahui lagi…" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:942 src/gs-repos-dialog.c:240 +msgid "Enable" +msgstr "Aktifkan" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Halaman selayang pandang" + +#: src/gs-overview-page.ui:39 +msgid "Enable Third Party Software Repositories?" +msgstr "Benarkan repositori-repositori Perisian Pihak Ketiga?" + +#: src/gs-overview-page.ui:101 +msgid "Previous" +msgstr "Terdahulu" + +#: src/gs-overview-page.ui:126 +msgid "Next" +msgstr "Berikutnya" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-overview-page.ui:149 +msgid "Editor’s Picks" +msgstr "Pilihan Editor" + +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-overview-page.ui:175 +msgid "Recent Releases" +msgstr "Keluaran Baru-baru Ini" + +#: src/gs-overview-page.ui:209 +msgid "Categories" +msgstr "Kategori" + +#: src/gs-overview-page.ui:274 +msgid "No Application Data Found" +msgstr "Tiada Data Aplikasi Ditemui" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:264 +#, c-format +msgid "Prepare %s" +msgstr "Sediakan %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:403 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Anda pasti mahu membuang repositori %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:407 +#, c-format +msgid "" +"All applications from %s will be removed, and you will have to re-install " +"the repository to use them again." +msgstr "" +"Semua aplikasi daripada %s akan dibuang, dan anda perlu memasang-semula " +"repositori sebelum dapat menggunakannya semula." + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * application summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:415 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "Anda pasti mahu membuang %s?" + +#. TRANSLATORS: longer dialog text +#: src/gs-page.c:418 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" +"%s akan dibuang, dan anda perlu memasang-semulanya sebelum dapat " +"menggunakannya lagi." + +#. TRANSLATORS: this refers to an app (by name) that is installed +#: src/gs-popular-tile.c:52 src/gs-summary-tile.c:96 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Telah Dipasang)" + +#: src/gs-prefs-dialog.ui:5 src/gs-prefs-dialog.ui:17 +msgid "Update Preferences" +msgstr "Kemas Kini Keutamaan" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatic Updates" +msgstr "Kemas Kini-Kemas Kini Automatik" + +#: src/gs-prefs-dialog.ui:70 +msgid "Automatic updates are disabled when on mobile or metered connections." +msgstr "" +"Kemas kini-kemas kini automatik telah dilumpuhkan ketika menggunakan " +"sambungan telefon bimbit atau bermeter." + +#: src/gs-prefs-dialog.ui:88 +msgid "Automatic Update Notifications" +msgstr "Pemberitahuan Kemas Kini Automatik" + +#: src/gs-prefs-dialog.ui:102 +msgid "Show notifications when updates have been automatically installed." +msgstr "" +"Tunjuk pemberitahuan ketika kemas kini-kemas kini telah dipasang secara " +"automatik." + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:114 +#, c-format +msgid "" +"Some of the currently installed software is not compatible with %s. If you " +"continue, the following will be automatically removed during the upgrade:" +msgstr "" +"Sesetengah perisian yang dipasang tidak serasi dengan %s. Sekiranya anda " +"teruskan, yang berikut akan dibuang secara automatik ketika penataran:" + +#: src/gs-removal-dialog.ui:26 +msgid "Incompatible Software" +msgstr "Perisian Tidak Serasi" + +#: src/gs-removal-dialog.ui:39 +msgid "_Continue" +msgstr "_Teruskan" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:97 +#, c-format +msgid "%u application installed" +msgid_plural "%u applications installed" +msgstr[0] "%u aplikasi dipasang" +msgstr[1] "%u aplikasi dipasang" + +#. TRANSLATORS: This string is used to construct the 'X add-ons +#. installed' sentence, describing a software repository. +#: src/gs-repos-dialog.c:104 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u tambahan dipasang" +msgstr[1] "%u tambahan dipasang" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of applications. +#: src/gs-repos-dialog.c:112 +#, c-format +msgid "%u application" +msgid_plural "%u applications" +msgstr[0] "%u aplikasi" +msgstr[1] "%u aplikasi" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the number of add-ons. +#: src/gs-repos-dialog.c:118 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u tambahan" +msgstr[1] "%u tambahan" + +#. TRANSLATORS: This string is used to construct the 'X applications +#. and y add-ons installed' sentence, describing a software repository. +#. The correct form here depends on the total number of +#. applications and add-ons. +#: src/gs-repos-dialog.c:125 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s dan %s dipasang" +msgstr[1] "%s dan %s dipasang" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:302 +#, c-format +msgid "Remove “%s”?" +msgstr "Buang \"%s\"?" + +#. TRANSLATORS: this is a prompt message, and '%s' is a +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-repos-dialog.c:307 +#, c-format +msgid "Disable “%s”?" +msgstr "Lumpuhkan \"%s\"?" + +#. TRANSLATORS: longer dialog text +#: src/gs-repos-dialog.c:311 +msgid "" +"Software that has been installed from this repository will no longer receive " +"updates, including security fixes." +msgstr "" +"Perisian yang telah dipasang melalui repositori ini tidak lagi boleh " +"menerima kemas kini, termasuklah pembaikan keselamatan." + +#. TRANSLATORS: this is button text to remove the repo +#: src/gs-repos-dialog.c:329 +msgid "Disable" +msgstr "Lumpuhkan" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:741 +msgid "the operating system" +msgstr "sistem pengoperasian" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:807 src/gs-repos-dialog.c:843 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Repositori-repositori ini menambah baik perisian lalai yang disediakan oleh " +"%s." + +#. TRANSLATORS: info bar title in the software repositories dialog +#: src/gs-repos-dialog.c:825 +msgid "Third Party Repositories" +msgstr "Repositori-Repositori Pihak Ketiga" + +#: src/gs-repos-dialog.ui:73 +msgid "No Additional Repositories" +msgstr "Tiada Repositori-Repositori Tambahan" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for enabling a repo +#: src/gs-repo-row.c:96 +msgid "_Enable" +msgstr "_Benarkan" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for removing a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:105 +msgid "_Remove…" +msgstr "_Buang…" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. for disabling a repo. The ellipsis indicates that further +#. steps are required +#: src/gs-repo-row.c:110 +msgid "_Disable…" +msgstr "_Lumpuhkan…" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being enabled +#: src/gs-repo-row.c:118 +msgid "Enabling" +msgstr "Membenarkan" + +#. TRANSLATORS: this is a button in the software repositories dialog +#. that shows the status of a repo being disabled +#: src/gs-repo-row.c:130 +msgid "Disabling" +msgstr "Membenarkan" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is enabled. +#: src/gs-repo-row.c:144 +msgid "Enabled" +msgstr "Dibenarkan" + +#. TRANSLATORS: this is a label in the software repositories +#. dialog that indicates that a repo is disabled. +#: src/gs-repo-row.c:150 +msgid "Disabled" +msgstr "Dilumpuhkan" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad application +#: src/gs-review-dialog.c:81 +msgid "Hate it" +msgstr "Benci" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great application +#: src/gs-review-dialog.c:85 +msgid "Don’t like it" +msgstr "Tidak suka" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good application +#: src/gs-review-dialog.c:89 +msgid "It’s OK" +msgstr "OK lah" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good application +#: src/gs-review-dialog.c:93 +msgid "Like it" +msgstr "Suka" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome application +#: src/gs-review-dialog.c:97 +msgid "Love it" +msgstr "Sangat Suka" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:119 +msgid "Please take more time writing the review" +msgstr "Sila luangkan sedikit masa untuk menulis ulasan ini" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:123 +msgid "Please choose a star rating" +msgstr "Sila pilh satu penarafan bintang" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:127 +msgid "The summary is too short" +msgstr "Penulisan terlalu pendek" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:131 +msgid "The summary is too long" +msgstr "Penulisan terlalu panjang" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The description is too short" +msgstr "Huraian terlalu pendek" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The description is too long" +msgstr "Huraian terlalu panjang" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:10 +msgid "Post Review" +msgstr "Hantar Ulasan" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:34 +msgid "_Post" +msgstr "_Hantar" + +#: src/gs-review-dialog.ui:108 +msgid "Summary" +msgstr "Ringkasan" + +#: src/gs-review-dialog.ui:118 +msgid "" +"Give a short summary of your review, for example: “Great app, would " +"recommend”." +msgstr "" +"Berikan catatan ringkas bagi ulasan anda, sebagai contoh: \"Apl hebat, " +"sangat disarankan\"." + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:143 +msgctxt "app review" +msgid "Review" +msgstr "Tinjauan" + +#: src/gs-review-dialog.ui:153 +msgid "What do you think of the app? Try to give reasons for your views." +msgstr "" +"Apa yang anda fikirkan berkenaan apl ini? Cuba berikan sebab-sebab pandangan " +"anda." + +#: src/gs-review-dialog.ui:185 +msgid "" +"Find what data is sent in our privacy policy." +msgstr "" +"Cari apakah data yang dihantar dalam dasar kerahsiaan kami." + +#. Translators: A label for the total number of reviews. +#: src/gs-review-histogram.ui:412 +msgid "ratings in total" +msgstr "keseluruhan penarafan" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:222 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Anda boleh laporkan ulasan-ulasan berbentuk kasar, tidak senonoh, atau " +"menunjukkan kelakuan diskriminikasi." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:227 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Setelah dilaporkan, ulasan tersebut akan disembunyikan sehinggalah ia " +"disemak oleh pihak pentadbir." + +#. TRANSLATORS: window title when +#. * reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:241 +msgid "Report Review?" +msgstr "Laporkan Ulasan?" + +#. TRANSLATORS: button text when +#. * sending a review for moderation +#: src/gs-review-row.c:245 +msgid "Report" +msgstr "Lapor" + +#. Translators: Users can express their opinions about other users' opinions about the apps. +#: src/gs-review-row.ui:105 +msgid "Was this review useful to you?" +msgstr "Adakah ulasan ini berguna?" + +#: src/gs-review-row.ui:121 +msgid "Yes" +msgstr "Ya" + +#: src/gs-review-row.ui:130 +msgid "No" +msgstr "Tidak" + +#. Translators: Button text for indifference, only used when moderating +#: src/gs-review-row.ui:139 +msgid "Meh" +msgstr "Iya Ke" + +#: src/gs-review-row.ui:162 +msgid "Report…" +msgstr "Lapor…" + +#: src/gs-review-row.ui:172 +msgid "Remove…" +msgstr "Buang…" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:235 +msgid "Screenshot not found" +msgstr "Tangkap layar tidak ditemui" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:250 +msgid "Failed to load image" +msgstr "Gagal memuatkan imej" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:381 +msgid "Screenshot size not found" +msgstr "Saiz tangkap layar tidak ditemui" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:411 +msgid "Could not create cache" +msgstr "Tidak dapat cipta cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:471 +msgid "Screenshot not valid" +msgstr "Tangkap layar tidak sah" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:486 +msgid "Screenshot not available" +msgstr "Tangkap layar tidak tersedia" + +#: src/gs-screenshot-image.c:544 +msgid "Screenshot" +msgstr "Tangkap layar" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:142 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u padanan lagi" +msgstr[1] "%u padanan lagi" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Gelintar halaman" + +#: src/gs-search-page.ui:54 +msgid "No Application Found" +msgstr "Tiada Aplikasi Ditemui" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:877 src/gs-shell.c:882 src/gs-shell.c:897 src/gs-shell.c:901 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:948 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "" +"Tidak boleh memuat turun kemas kini-kemas kini perisian tegar daripada %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:954 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Tidak boleh memuat turun kemas kini-kemas kini daripada %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:961 src/gs-shell.c:1006 +msgid "Unable to download updates" +msgstr "Tidak boleh memuat turun kemas kini-kemas kini" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:967 +msgid "" +"Unable to download updates: internet access was required but wasn’t available" +msgstr "" +"Tidak boleh memuat turun kemas kini-kemas kini: capaian internet diperlukan " +"tetapi tidak disediakan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:976 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Tidak boleh memuat turun kemas kini-kemas kini daripada %s: ruang cakera " +"tidak mencukupi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:981 +msgid "Unable to download updates: not enough disk space" +msgstr "" +"Tidak boleh memuat turun kemas kini-kemas kini: ruang cakera tidak mencukupi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:988 +msgid "Unable to download updates: authentication was required" +msgstr "" +"Tidak boleh memuat turun kemas kini-kemas kini: pengesahihan diperlukan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:993 +msgid "Unable to download updates: authentication was invalid" +msgstr "Tidak boleh memuat turun kemas kini-kemas kini: pengesahihan tidak sah" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:998 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Tidak boleh memuat turun kemas kini-kemas kini: anda tidak memiliki keizinan " +"untuk memasang perisian" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1009 +msgid "Unable to get list of updates" +msgstr "Tidak memperoleh senarai kemas kini" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1052 +#, c-format +msgid "Unable to install %s as download failed from %s" +msgstr "Tidak boleh memasang %s kerana muat turun gagal daripada %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1058 +#, c-format +msgid "Unable to install %s as download failed" +msgstr "Tidak boleh memasang %s kerana muat turun gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1071 +#, c-format +msgid "Unable to install %s as runtime %s not available" +msgstr "Tidak boleh memasang %s kerana masa jalan %s tidak tersedia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1077 +#, c-format +msgid "Unable to install %s as not supported" +msgstr "Tidak boleh memasang %s kerana tidak disokong" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1084 +msgid "Unable to install: internet access was required but wasn’t available" +msgstr "" +"Tidak boleh memasang: capaian internet diperlukan tetapi tidak disediakan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1090 +msgid "Unable to install: the application has an invalid format" +msgstr "Tidak boleh memasang: aplikasi mempunyai format tidak sah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1095 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Tidak boleh memasang %s: ruang cakera tidak mencukupi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1102 +#, c-format +msgid "Unable to install %s: authentication was required" +msgstr "Tidak boleh memasang %s: pengesahihan diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1109 +#, c-format +msgid "Unable to install %s: authentication was invalid" +msgstr "Tidak boleh memasang %s: pengesahihan tidak sah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1116 +#, c-format +msgid "Unable to install %s: you do not have permission to install software" +msgstr "" +"Tidak boleh memasang %s: anda tidak memiliki keizinan untuk memasang perisian" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1124 +#, c-format +msgid "Unable to install %s: AC power is required" +msgstr "Tidak boleh memasang %s: kuasa AC diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1131 +#, c-format +msgid "Unable to install %s: The battery level is too low" +msgstr "Tidak boleh memasang %s: Kuasa bateri terlalu rendah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1140 +#, c-format +msgid "Unable to install %s" +msgstr "Tidak boleh memasang %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1187 +#, c-format +msgid "Unable to update %s from %s as download failed" +msgstr "Tidak boleh mengemas kini %s daripada %s kerana muat turun gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1194 +#, c-format +msgid "Unable to update %s as download failed" +msgstr "Tidak boleh mengemas kini %s kerana muat turun gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1201 +#, c-format +msgid "Unable to install updates from %s as download failed" +msgstr "" +"Tidak boleh memasang kemas kini-kemas kini daripada %s kerana muat turun " +"gagal" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1205 +#, c-format +msgid "Unable to install updates as download failed" +msgstr "Tidak boleh memasang kemas kini-kemas kini kerana muat turun gagal" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1211 +msgid "Unable to update: internet access was required but wasn’t available" +msgstr "" +"Tidak boleh mengemas kini: capaian internet diperlukan tetapi tidak " +"disediakan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Tidak boleh mengemask ini %s: ruang cakera tidak mencukupi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to install updates: not enough disk space" +msgstr "" +"Tidak boleh memasang kemas kini-kemas kini: ruang cakera tidak mencukupi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1236 +#, c-format +msgid "Unable to update %s: authentication was required" +msgstr "Tidak boleh mengemas kini %s: pengesahihan diperlukan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to install updates: authentication was required" +msgstr "Tidak boleh memasang kemas kini: pengesahihan diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1250 +#, c-format +msgid "Unable to update %s: authentication was invalid" +msgstr "Tidak boleh mengemas kini %s: pengesahihan tidak sah" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 +#, c-format +msgid "Unable to install updates: authentication was invalid" +msgstr "Tidak boleh memasang kemas kini-kemas kini: pengesahihan tidak sah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1264 +#, c-format +msgid "Unable to update %s: you do not have permission to update software" +msgstr "" +"Tidak boleh mengemas kini %s: anda tidak memiliki keizinan untuk memasang " +"perisian" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1270 +#, c-format +msgid "" +"Unable to install updates: you do not have permission to update software" +msgstr "" +"Tidak boleh memasang kemas kini-kemas kini: anda tidak memiliki keizinan " +"untuk mengemas kini perisian" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1280 +#, c-format +msgid "Unable to update %s: AC power is required" +msgstr "Tidak boleh mengemas kini %s: kuasa AC diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1286 +#, c-format +msgid "Unable to install updates: AC power is required" +msgstr "Tidak boleh memasang kemas kini-kemas kini: kuasa AC diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1295 +#, c-format +msgid "Unable to update %s: The battery level is too low" +msgstr "Tidak boleh mengemas kini %s: Kuasa bateri terlalu rendah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1301 +#, c-format +msgid "Unable to install updates: The battery level is too low" +msgstr "Tidak boleh memasang kemas kini: Kuasa bateri terlalu rendah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1312 +#, c-format +msgid "Unable to update %s" +msgstr "Tidak boleh mengemas kini %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1315 +#, c-format +msgid "Unable to install updates" +msgstr "Tidak boleh memasang kemas kini-kemas kini" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1358 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Tidak boleh menatar %s daripada %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1363 +#, c-format +msgid "Unable to upgrade to %s as download failed" +msgstr "Tidak boleh menatar %s kerana muat turun gagal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1372 +#, c-format +msgid "" +"Unable to upgrade to %s: internet access was required but wasn’t available" +msgstr "" +"Tidak boleh menatar %s: capaian internet diperlukan tetapi tidak disediakan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1381 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Tidak boleh menatar %s: ruang cakera tidak mencukupi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1389 +#, c-format +msgid "Unable to upgrade to %s: authentication was required" +msgstr "Tidak boleh menatar %s: pengesahihan diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1396 +#, c-format +msgid "Unable to upgrade to %s: authentication was invalid" +msgstr "Tidak boleh menatar %s: pengesahihan tidak sah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1403 +#, c-format +msgid "Unable to upgrade to %s: you do not have permission to upgrade" +msgstr "Tidak boleh menatar %s: anda tidak memiliki keizinan untuk menatarnya" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1410 +#, c-format +msgid "Unable to upgrade to %s: AC power is required" +msgstr "Tidak boleh menatar %s: kuasa AC diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1417 +#, c-format +msgid "Unable to upgrade to %s: The battery level is too low" +msgstr "Tidak boleh menatar ke %s: Kuasa bateri terlalu rendah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Tidak boleh menatar %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1464 +#, c-format +msgid "Unable to remove %s: authentication was required" +msgstr "Tidak boleh membuang %s: pengesahihan diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to remove %s: authentication was invalid" +msgstr "Tidak boleh membuang %s: pengesahihan tidak sah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1476 +#, c-format +msgid "Unable to remove %s: you do not have permission to remove software" +msgstr "" +"Tidak boleh membuang %s: anda tidak memiliki keizinan untuk membuang perisian" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1483 +#, c-format +msgid "Unable to remove %s: AC power is required" +msgstr "Tidak boleh membuang %s: kuasa AC diperlukan" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1490 +#, c-format +msgid "Unable to remove %s: The battery level is too low" +msgstr "Tidak boleh membuang %s: Kuasa bateri terlalu rendah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1502 +#, c-format +msgid "Unable to remove %s" +msgstr "Tidak boleh membuang %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the application name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1545 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Tidak boleh melancarkan %s: %s tidak dipasang" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1552 src/gs-shell.c:1603 src/gs-shell.c:1644 +#: src/gs-shell.c:1692 +msgid "Not enough disk space — free up some space and try again" +msgstr "" +"Ruang cakera tidak mencukupi — bebaskan sedikit ruang dan cuba sekali lagi" + +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1563 src/gs-shell.c:1614 src/gs-shell.c:1655 +#: src/gs-shell.c:1726 +msgid "Sorry, something went wrong" +msgstr "Maaf, ada masalah berlaku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1595 +msgid "Failed to install file: not supported" +msgstr "Gagal memasang fail: tidak disokong" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1599 +msgid "Failed to install file: authentication failed" +msgstr "Gagal memasang fail: pengesahihan tidak sah" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1636 +msgid "Failed to install: not supported" +msgstr "Gagal memasang: tidak disokong" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1640 +msgid "Failed to install: authentication failed" +msgstr "Gagal memasang: pengesahihan tidak sah" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to contact %s" +msgstr "Tidak boleh menghubungi %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the application name (e.g. "GIMP") +#: src/gs-shell.c:1701 +#, c-format +msgid "%s needs to be restarted to use new plugins." +msgstr "" +"%s perlu dimulakan semula supaya pemalam-pemalam baharu dapat digunakan." + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "This application needs to be restarted to use new plugins." +msgstr "" +"Aplikasi ini perlu dimulakan semula supaya pemalam-pemalam baharu dapat " +"digunakan." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1713 +msgid "AC power is required" +msgstr "Kuasa AC diperlukan" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1717 +msgid "The battery level is too low" +msgstr "Kuasa bateri terlalu rendah" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-shell-search-provider.c:256 +#, c-format +msgid "Source: %s" +msgstr "Sumber: %s" + +#: src/gs-summary-tile.c:101 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Memasang)" + +#: src/gs-summary-tile.c:106 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Membuang)" + +#. TRANSLATORS: this is a button in the software repositories +#. dialog for removing multiple repos +#: src/gs-third-party-repo-row.c:92 +msgid "_Remove All" +msgstr "_Buang Semua" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-update-dialog.c:187 +msgid "No update description available." +msgstr "Tiada keterangan kemas kini tersedia." + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:291 +#, c-format +msgid "Installed on %s" +msgstr "Dipasang pada %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:311 +msgid "Installed Updates" +msgstr "Kemas kini-Kemas kini Terpasang" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-update-dialog.c:527 +msgid "Additions" +msgstr "Penambahan" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-update-dialog.c:531 +msgid "Removals" +msgstr "Pembuangan" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-update-dialog.c:535 +msgid "Updates" +msgstr "Kemas kini-Kemas kini" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-update-dialog.c:539 +msgid "Downgrades" +msgstr "Nyahtatar" + +#: src/gs-update-dialog.ui:100 +msgid "No updates have been installed on this system." +msgstr "Tiada kemas kini-kemas kini telah dipasang dalam sistem ini." + +#: src/gs-update-monitor.c:107 +msgid "Security Updates Pending" +msgstr "Kemas kini-Kemas kini Keselamatan Tertangguh" + +#: src/gs-update-monitor.c:108 +msgid "It is recommended that you install important updates now" +msgstr "Disarankan anda memasang kemas kini-kemas kini penting sekarang" + +#: src/gs-update-monitor.c:111 +msgid "Restart & Install" +msgstr "Mula Semula & Pasang" + +#: src/gs-update-monitor.c:115 +msgid "Software Updates Available" +msgstr "Kemas kini-Kemas kini Perisian Sudah Tersedia" + +#: src/gs-update-monitor.c:116 +msgid "Important OS and application updates are ready to be installed" +msgstr "Kemas kini-kemas kini OS dan aplikasi penting sedia dipasangkan" + +#: src/gs-update-monitor.c:120 +msgid "View" +msgstr "Pandangan" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:228 +#, c-format +msgid "%u Application Updated — Restart Required" +msgid_plural "%u Applications Updated — Restart Required" +msgstr[0] "%u Aplikasi Dikemas Kini — Mula Semula Diperlukan" +msgstr[1] "%u Aplikasi Dikemas Kini — Mula Semula Diperlukan" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:234 +#, c-format +msgid "%u Application Updated" +msgid_plural "%u Applications Updated" +msgstr[0] "%u Aplikasi Dikemas Kini" +msgstr[1] "%u Aplikasi Dikemas Kini" + +#. TRANSLATORS: %1 is an application name, e.g. Firefox +#: src/gs-update-monitor.c:245 +#, c-format +msgid "%s has been updated." +msgstr "%s telah dikemaskinikan." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:248 +msgid "Please restart the application." +msgstr "Sila mulakan semula aplikasi." + +#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox +#: src/gs-update-monitor.c:256 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s dan %s telah dikemaskinikan." + +#. TRANSLATORS: at least one application needs restarting +#: src/gs-update-monitor.c:262 src/gs-update-monitor.c:281 +#, c-format +msgid "%u application requires a restart." +msgid_plural "%u applications require a restart." +msgstr[0] "%u aplikasi memerlukan satu mula semula." +msgstr[1] "%u aplikasi memerlukan satu mula semula." + +#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox +#: src/gs-update-monitor.c:274 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Termasuk %s, %s dan %s." + +#. TRANSLATORS: this is when the current OS version goes end-of-life +#: src/gs-update-monitor.c:515 src/gs-updates-page.ui:43 +msgid "Operating System Updates Unavailable" +msgstr "Tiada Kemas kini-Kemas kini Sistem Pengoperasian" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:517 +msgid "Upgrade to continue receiving security updates." +msgstr "Tatar untuk teruskan penerimaan kemas kini-kemas kini keselamatan." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:572 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Satu versi baharu %s telah sedia untuk dipasangkan" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:576 +msgid "Software Upgrade Available" +msgstr "Penataran Perisian Sudah Tersedia" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:965 +msgid "Software Updates Failed" +msgstr "Kemas kini-Kemas kini Perisian Gagal" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:967 +msgid "An important OS update failed to be installed." +msgstr "Satu kemask ini OS penting gagal dipasang." + +#: src/gs-update-monitor.c:968 +msgid "Show Details" +msgstr "Tunjuk Butiran" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:991 +msgid "System Upgrade Complete" +msgstr "Penataran Sistem Selesai" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:996 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Selamat datang ke %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1002 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Kemas Kini Perisian Dipasang" +msgstr[1] "Kemas Kini Perisian Dipasang" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1006 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "Satu kemas kini OS penting telah dipasang." +msgstr[1] "Beberapa kemas kini OS penting telah dipasang." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the application reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1017 +msgctxt "updates" +msgid "Review" +msgstr "Tinjauan" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1065 +msgid "Failed To Update" +msgstr "Gagal Dikemaskinikan" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1071 +msgid "The system was already up to date." +msgstr "Sistem sudah dikemaskinikan." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1076 +msgid "The update was cancelled." +msgstr "Kemas kini dibatalkan." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1082 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Capaian internet diperlukan tetapi tidak tersedia. Sila pastikan anda " +"mempunyai capaian internet kemudian cuba sekali lagi." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1088 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Terdapat beberapa masalah keselamatan dengan kemas kini. Sila rujuk penyedia " +"perisian anda untuk maklumat lanjut." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1094 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Ruang cakera tidak mencukupi. Sila bebaskan sedikit ruang dan cuba sekali " +"lagi." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1099 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Mohon maaf: kemas kini gagal dipasang. Sila tunggu kemaskini yang lain " +"kemudian cuba sekali lagi. Sekiranya masalah masih berlanjutan, hubungi " +"penyedia perisian anda." + +#. TRANSLATORS: Time in 24h format +#: src/gs-updates-page.c:225 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: src/gs-updates-page.c:228 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: src/gs-updates-page.c:234 +msgid "Yesterday, %R" +msgstr "Semalam, %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: src/gs-updates-page.c:238 +msgid "Yesterday, %l:%M %p" +msgstr "Semalam, %l:%M %p" + +#: src/gs-updates-page.c:241 +msgid "Two days ago" +msgstr "Dua hari yang lalu" + +#: src/gs-updates-page.c:243 +msgid "Three days ago" +msgstr "Tiga hari yang lalu" + +#: src/gs-updates-page.c:245 +msgid "Four days ago" +msgstr "Empat hari yang lalu" + +#: src/gs-updates-page.c:247 +msgid "Five days ago" +msgstr "Lima hari yang lalu" + +#: src/gs-updates-page.c:249 +msgid "Six days ago" +msgstr "Enam hari yang lalu" + +#: src/gs-updates-page.c:251 +msgid "One week ago" +msgstr "Seminggu yang lalu" + +#: src/gs-updates-page.c:253 +msgid "Two weeks ago" +msgstr "Dua minggu yang lalu" + +#. TRANSLATORS: the update panel is doing *something* vague +#: src/gs-updates-page.c:269 +msgid "Looking for new updates…" +msgstr "Mencari kemas kini-kemas kini baharu…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:338 +msgid "Setting up updates…" +msgstr "Menetapkan kemas kini…" + +#. TRANSLATORS: the updates panel is starting up +#: src/gs-updates-page.c:339 src/gs-updates-page.c:346 +msgid "(This could take a while)" +msgstr "(Ia mengambil sedikit masa)" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:453 +#, c-format +msgid "Last checked: %s" +msgstr "Terakhir Diperiksa: %s" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:617 +#, c-format +msgid "%s %s is no longer supported." +msgstr "%s %s tidak lagi disokong." + +#. TRANSLATORS: OS refers to operating system, e.g. Fedora +#: src/gs-updates-page.c:622 +msgid "Your OS is no longer supported." +msgstr "OS anda tidak lagi disokong." + +#. TRANSLATORS: EOL distros do not get important updates +#: src/gs-updates-page.c:627 +msgid "This means that it does not receive security updates." +msgstr "" +"Ini bermaksud ia tidak lagi menerima kemas kini-kemas kini keselamatan." + +#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 +#: src/gs-updates-page.c:631 +msgid "It is recommended that you upgrade to a more recent version." +msgstr "Oleh itu disarankan anda menatar ke versi yang terkini." + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:889 +msgid "Charges May Apply" +msgstr "Bayaran Mungkin Dikenakan" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:893 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Memeriksa kemas kini-kemas kini ketika menggunakan jalur lebar telefon " +"bimbit boleh menambah kos bila anda." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: src/gs-updates-page.c:897 +msgid "Check _Anyway" +msgstr "Periksa _Juga" + +#. TRANSLATORS: can't do updates check +#: src/gs-updates-page.c:913 +msgid "No Network" +msgstr "Tiada Rangkaian" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: src/gs-updates-page.c:917 +msgid "Internet access is required to check for updates." +msgstr "Capaian internet diperlukan untuk memeriksa kemas kini." + +#. This label indicates that the update check is in progress +#: src/gs-updates-page.c:1340 +msgid "Checking…" +msgstr "Memeriksa…" + +#: src/gs-updates-page.c:1353 +msgid "Check for updates" +msgstr "Periksa kemas kini" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Halaman kemas kini" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:177 +msgid "Software is up to date" +msgstr "Perisian sudah dikemaskinikan" + +#: src/gs-updates-page.ui:225 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Memeriksa kemas kini-kemas kini ketika menggunakan jalur lebar mudah alih " +"boleh menambah kos bila anda" + +#: src/gs-updates-page.ui:237 +msgid "_Check Anyway" +msgstr "_Periksa Juga" + +#: src/gs-updates-page.ui:273 +msgid "Go online to check for updates" +msgstr "Ke dalam talian untuk memeriksa kemas kini" + +#: src/gs-updates-page.ui:284 +msgid "_Network Settings" +msgstr "Tetapan _Rangkaian" + +#: src/gs-updates-page.ui:357 +msgid "Updates are automatically managed" +msgstr "Kemas kini telah diurus secara automatik" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:278 +msgid "Restart & Update" +msgstr "Mula Semula & Kemas Kini" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable applications +#: src/gs-updates-section.c:284 +msgid "Update All" +msgstr "Kemas Kini Semua" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:415 +msgid "Integrated Firmware" +msgstr "Perisian Tegar Bersepadu" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:419 +msgid "Requires Restart" +msgstr "Perlukan Mula Semula" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:423 +msgid "Application Updates" +msgstr "Kemas Kini-Kemas Kini Aplikasi" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:427 +msgid "Device Firmware" +msgstr "Perisian Tegar Peranti" + +#: src/gs-updates-section.c:455 src/gs-upgrade-banner.ui:102 +msgid "_Download" +msgstr "_Muat Turun" + +#: src/gs-upgrade-banner.c:64 +msgid "_Restart Now" +msgstr "_Mula Semula Sekarang" + +#: src/gs-upgrade-banner.c:66 +msgid "Updates will be applied when the computer is restarted." +msgstr "Kemas kini-kemas kini akan diterap ketika komputer dimulakan semula." + +#: src/gs-upgrade-banner.c:72 +msgid "" +"It is recommended that you back up your data and files before upgrading." +msgstr "" +"Oleh itu disarankan anda menyandar data dan fail anda sebelum ditatarkan." + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. First %s is the distro name and the +#. * 2nd %s is the version, e.g. "Fedora 23 Now Available" +#: src/gs-upgrade-banner.c:87 +#, c-format +msgid "%s %s Now Available" +msgstr "%s %s Kini Tersedia" + +#. TRANSLATORS: This is the text displayed while waiting to +#. * download a distro upgrade. First %s is the distro name and +#. * the 2nd %s is the version, e.g. "Waiting to Download Fedora 23" +#: src/gs-upgrade-banner.c:97 +#, c-format +msgid "Waiting to Download %s %s" +msgstr "Menunggu Muat Turun %s %s" + +#. TRANSLATORS: This is the text displayed while downloading a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Downloading Fedora 23" +#: src/gs-upgrade-banner.c:107 +#, c-format +msgid "Downloading %s %s" +msgstr "Memuat turun %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade has been downloaded and is ready to be installed. +#. * First %s is the distro name and the 2nd %s is the version, +#. * e.g. "Fedora 23 Ready to be Installed" +#: src/gs-upgrade-banner.c:118 +#, c-format +msgid "%s %s Ready to be Installed" +msgstr "%s %s Sedia Dipasangkan" + +#: src/gs-upgrade-banner.ui:30 +msgid "A major upgrade, with new features and added polish." +msgstr "" +"Satu penataran major, dengan fitur-fitur baharu dan sedikit penambahbaikan " +"visual." + +#: src/gs-upgrade-banner.ui:50 +msgid "_Learn More" +msgstr "_Ketahui Lagi" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Tambah, buang atau kemas kini perisian di dalam komputer ini" + +#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Kemas kini;Tatar;Sumber;Repositori;Keutamaan;Pasang;Nyahpasang;Program;" +"Perisian;Apl;Kedai;" + +#: plugins/core/gs-desktop-common.c:16 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:19 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:22 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Penciptaan & Penyuntingan Audio" + +#: plugins/core/gs-desktop-common.c:28 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Pemain Muzik" + +#: plugins/core/gs-desktop-common.c:37 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:40 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:43 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Penyahpepijat" + +#: plugins/core/gs-desktop-common.c:46 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: plugins/core/gs-desktop-common.c:55 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:59 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:63 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Kecerdasan Buatan" + +#: plugins/core/gs-desktop-common.c:66 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomi" + +#: plugins/core/gs-desktop-common.c:70 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kimia" + +#: plugins/core/gs-desktop-common.c:74 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Bahasa" + +#: plugins/core/gs-desktop-common.c:78 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematik" + +#: plugins/core/gs-desktop-common.c:85 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotik" + +#: plugins/core/gs-desktop-common.c:94 +msgctxt "Menu of Games" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:97 +msgctxt "Menu of Games" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:100 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Tindakan" + +#: plugins/core/gs-desktop-common.c:103 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Pengembaraan" + +#: plugins/core/gs-desktop-common.c:106 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arked" + +#: plugins/core/gs-desktop-common.c:109 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blok" + +#: plugins/core/gs-desktop-common.c:112 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Berpapan" + +#: plugins/core/gs-desktop-common.c:115 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kad" + +#: plugins/core/gs-desktop-common.c:118 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulator" + +#: plugins/core/gs-desktop-common.c:121 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Kanak-Kanak" + +#: plugins/core/gs-desktop-common.c:124 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logik" + +#: plugins/core/gs-desktop-common.c:127 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Main Peranan" + +#: plugins/core/gs-desktop-common.c:130 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Olahraga" + +#: plugins/core/gs-desktop-common.c:134 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategi" + +#: plugins/core/gs-desktop-common.c:142 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:145 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:148 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Grafik 3D" + +#: plugins/core/gs-desktop-common.c:151 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografi" + +#: plugins/core/gs-desktop-common.c:154 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Pengimbasan" + +#: plugins/core/gs-desktop-common.c:157 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Grafik Vektor" + +#: plugins/core/gs-desktop-common.c:160 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Pelihat" + +#: plugins/core/gs-desktop-common.c:168 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:171 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:174 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendar" + +#: plugins/core/gs-desktop-common.c:178 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Pangkalan Data" + +#: plugins/core/gs-desktop-common.c:181 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Kewangan" + +#: plugins/core/gs-desktop-common.c:185 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Pemprosesan Kata" + +#: plugins/core/gs-desktop-common.c:194 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Fon" + +#: plugins/core/gs-desktop-common.c:197 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeks" + +#: plugins/core/gs-desktop-common.c:200 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Sumber Input" + +#: plugins/core/gs-desktop-common.c:203 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Pek Bahasa" + +#: plugins/core/gs-desktop-common.c:206 +msgctxt "Menu of Add-ons" +msgid "Shell Extensions" +msgstr "Sambungan Shell" + +#: plugins/core/gs-desktop-common.c:209 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Penyetempatan" + +#: plugins/core/gs-desktop-common.c:212 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Pemacu Perkakasan" + +#: plugins/core/gs-desktop-common.c:220 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:223 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:226 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Sembang" + +#: plugins/core/gs-desktop-common.c:233 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Berita" + +#: plugins/core/gs-desktop-common.c:237 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Pelayar Sesawang" + +#: plugins/core/gs-desktop-common.c:245 +msgctxt "Menu of Utilities" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:248 +msgctxt "Menu of Utilities" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:251 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Penyunting Teks" + +#: plugins/core/gs-desktop-common.c:259 +msgctxt "Menu of Reference" +msgid "All" +msgstr "Semua" + +#: plugins/core/gs-desktop-common.c:262 +msgctxt "Menu of Reference" +msgid "Featured" +msgstr "Difiturkan" + +#: plugins/core/gs-desktop-common.c:265 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Seni" + +#: plugins/core/gs-desktop-common.c:268 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografi" + +#: plugins/core/gs-desktop-common.c:271 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komik" + +#: plugins/core/gs-desktop-common.c:274 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Cerekaan" + +#: plugins/core/gs-desktop-common.c:277 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Kesihatan" + +#: plugins/core/gs-desktop-common.c:280 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Sejarah" + +#: plugins/core/gs-desktop-common.c:283 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Gaya Hidup" + +#: plugins/core/gs-desktop-common.c:286 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politik" + +#: plugins/core/gs-desktop-common.c:289 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Olahraga" + +#. TRANSLATORS: this is the menu spec main category for Audio & Video +#: plugins/core/gs-desktop-common.c:299 +msgid "Audio & Video" +msgstr "Audio & Video" + +#. TRANSLATORS: this is the menu spec main category for Development +#: plugins/core/gs-desktop-common.c:302 +msgid "Developer Tools" +msgstr "Alatan Pembangun" + +#. TRANSLATORS: this is the menu spec main category for Education & Science +#: plugins/core/gs-desktop-common.c:305 +msgid "Education & Science" +msgstr "Pendidikan & Sains" + +#. TRANSLATORS: this is the menu spec main category for Game +#: plugins/core/gs-desktop-common.c:308 +msgid "Games" +msgstr "Permainan" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: plugins/core/gs-desktop-common.c:311 +msgid "Graphics & Photography" +msgstr "Grafik & Fotografi" + +#. TRANSLATORS: this is the menu spec main category for Office +#: plugins/core/gs-desktop-common.c:314 +msgid "Productivity" +msgstr "Produktiviti" + +#. TRANSLATORS: this is the menu spec main category for Communication +#: plugins/core/gs-desktop-common.c:320 +msgid "Communication & News" +msgstr "Komunikasi & Berita" + +#. TRANSLATORS: this is the menu spec main category for Reference +#: plugins/core/gs-desktop-common.c:323 +msgid "Reference" +msgstr "Rujukan" + +#. TRANSLATORS: this is the menu spec main category for Utilities +#: plugins/core/gs-desktop-common.c:326 +msgid "Utilities" +msgstr "Utiliti" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:55 +msgid "OS Updates" +msgstr "Kemas Kini OS" + +#. TRANSLATORS: this is a longer description of the +#. * "OS Updates" string +#: plugins/core/gs-plugin-generic-updates.c:60 +msgid "Includes performance, stability and security improvements." +msgstr "Melibatkan penambahbaikan prestasi, kestabilan dan keselamatan." + +#. TRANSLATORS: status text when downloading +#: plugins/core/gs-plugin-rewrite-resource.c:41 +msgid "Downloading featured images…" +msgstr "Memuat turun imej-imej terfitur…" + +#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/ +#: plugins/eos-updater/gs-plugin-eos-updater.c:561 +msgid "Endless OS" +msgstr "Endless OS" + +#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/ +#: plugins/eos-updater/gs-plugin-eos-updater.c:564 +msgid "An Endless OS update with new features and fixes." +msgstr "" +"Terdapat kemas kini Endless OS dengan fitur-fitur baharu dan pembaikan." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:825 +msgid "EOS update service could not fetch and apply the update." +msgstr "Perkhidmatan kemas kini EOS tidak memperoleh dan terapkan kemas kini." + +#. TRANSLATORS: tool that is used when copying profiles system-wide +#: plugins/external-appstream/gs-install-appstream.c:139 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Pemasang menyeluruhi-sistem AppStream Perisian GNOME" + +#: plugins/external-appstream/gs-install-appstream.c:141 +msgid "Failed to parse command line arguments" +msgstr "Gagal menghurai argumen-argumen baris perintah" + +#. TRANSLATORS: user did not specify a valid filename +#: plugins/external-appstream/gs-install-appstream.c:148 +msgid "You need to specify exactly one filename" +msgstr "Anda perlu nyatakan satu nama fail sahaja" + +#. TRANSLATORS: only able to install files as root +#: plugins/external-appstream/gs-install-appstream.c:155 +msgid "This program can only be used by the root user" +msgstr "Program ini hanya boleh digunakan oleh pengguna root" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:163 +msgid "Failed to validate content type" +msgstr "Gagal mengesahkan jenis kandungan" + +#. TRANSLATORS: error details +#: plugins/external-appstream/gs-install-appstream.c:173 +msgid "Failed to copy" +msgstr "Gagal disalin" + +#. TRANSLATORS: status text when downloading +#: plugins/external-appstream/gs-plugin-external-appstream.c:235 +msgid "Downloading extra metadata files…" +msgstr "Memuat turun fail-fail data meta tambahan…" + +#. TRANSLATORS: status text when downloading +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:192 +msgid "Downloading upgrade information…" +msgstr "Memuat turun maklumat penataran…" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:283 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Tatar untuk dapatkan fitur-fitur terkini, penambahanbaikan prestasi dan " +"kestabilan." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Sokongan Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop applications on Linux" +msgstr "Flatpak merupakan rangka kerja untuk aplikasi-aplikasi atas meja Linux" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:861 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Mendapatkan data meta flatpak untuk %s…" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:135 +#, c-format +msgid "%s Device" +msgstr "Peranti %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:140 +#, c-format +msgid "%s System" +msgstr "Sistem %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:145 +#, c-format +msgid "%s Embedded Controller" +msgstr "Pengawal Terbenam %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:150 +#, c-format +msgid "%s ME" +msgstr "ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:155 +#, c-format +msgid "%s Corporate ME" +msgstr "ME Korporat %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:160 +#, c-format +msgid "%s Consumer ME" +msgstr "ME Pelanggan %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:166 +#, c-format +msgid "%s Controller" +msgstr "Pengawal %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:172 +#, c-format +msgid "%s Thunderbolt Controller" +msgstr "Pengawal Thunderbolt %s" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:669 +msgid "Downloading firmware update signature…" +msgstr "Memuat turun tandatangan kemas kini perisian tegar…" + +#. TRANSLATORS: status text when downloading +#: plugins/fwupd/gs-plugin-fwupd.c:710 +msgid "Downloading firmware update metadata…" +msgstr "Memuat turun data meta kemas kini perisian tegar…" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Sokongan Penataran Perisian Tegar" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Menyediakan sokongan untuk penataran perisian tegar" + +#. TRANSLATORS: status text when downloading +#: plugins/odrs/gs-plugin-odrs.c:196 +msgid "Downloading application ratings…" +msgstr "Memuat turun penarafan aplikasi…" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6 +msgid "Open Desktop Ratings Support" +msgstr "Open Desktop Ratings Support" + +#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7 +msgid "ODRS is a service providing user reviews of applications" +msgstr "" +"ODRS merupakan perkhidmatan yang menyediakan ulasan-ulasan pengguna terhadap " +"aplikasi" + +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:74 +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:150 +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:910 +msgid "GNOME" +msgstr "GNOME" + +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:406 +msgid "GNOME Shell Extensions Repository" +msgstr "Repositori Sambungan Shell GNOME" + +#. TRANSLATORS: status text when downloading +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:806 +msgid "Downloading shell extension metadata…" +msgstr "Memuat turun data meta sambungan shell…" + +#. TRANSLATORS: the one-line summary +#: plugins/shell-extensions/gs-plugin-shell-extensions.c:914 +msgid "GNOME Shell Extension" +msgstr "Sambungan GNOME Shell" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:191 +msgid "Snap Store" +msgstr "Kedai Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Sokongan Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap merupakan pakej Linux universal" diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000..df18259 --- /dev/null +++ b/po/nb.po @@ -0,0 +1,6388 @@ +# 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: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-28 13:49+0000\n" +"PO-Revision-Date: 2025-03-01 14:52+0100\n" +"Last-Translator: Brage \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.4.4\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Appsenter" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Installer og oppdater apper" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "Appsenter lar deg finne, installere, oppdatere og slette apper." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Utvalgte og populære apper blir fremhevet med nyttige beskrivelser og mange " +"skjermbilder. Apper kan bli funnet ved å utforske forskjellige kategorier, " +"eller ved å søke. Appsenter lar deg også oppdatere systemet ditt på en enkel " +"og sikker måte." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Oversiktsside" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Informasjonsside" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Installert-side" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Oppdateringsside" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Oppdateringsinformasjon" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Test Akmods-nøkkel i Shim-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Autentisering kreves for å teste Akmods-nøkkelen i Shim-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Registrer Akmods-nøkkel i Shim-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Autentisering kreves for å registrere Akmods-nøkkelen i Shim-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Test DKMS-nøkkel i Shim-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Autentisering kreves for å teste DKMS-nøkkelen i Shim-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Registrer DKMS-nøkkel i Shim-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Autentisering kreves for å registrere DKMS-nøkkelen i Shim-UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Installere AppStream-fil på systemet" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Installerer AppStream-fil på systemet" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Liste over kompatible prosjekter" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "Dette er en liste over kompatible prosjekter, som GNOME, KDE og XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Håndter oppdateringer i Appsenter" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Hvis denne innstillingen er slått av, vil Appsenter skjule " +"oppdateringssiden. Det vil ikke bli gjort automatiske oppdateringer, og " +"Appsenter vil heller ikke spørre om oppdateringer." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automatiske oppdateringer" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Hvis denne innstillingen er slått på, vil Appsenter automatisk laste ned " +"oppdateringer i bakgrunnen og installere oppdateringer som ikke krever at " +"systemet starter på nytt." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Varsle om bakgrunnsoppdateringer" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Hvis denne innstillingen er slått på, vil Appsenter varsle om oppdateringer " +"som har skjedd i bakgrunnen." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Last ned data med forbruksmålt tilkobling" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Hvis denne innstillingen er slått på, vil Appsenter automatisk laste ned " +"data i bakgrunnen selv når det brukes en forbruksmålt tilkobling." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Om det er aller første gang Appsenter kjører" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Vis stjernevurderinger ved siden av apper" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtrer apper basert på innholdskildens standardgren" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Advarselsvindu for proprietære apper" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Når proprietær apper installeres, kan det vises et advarselsvindu. Denne " +"innstillingen bestemmer om vinduet skal vises." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Siste oppdateringssjekk" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Siste systemoppdateringsvarsling" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Forrige oppdateringsvarsling" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Tidspunkt for første sikkerhetsoppdatering, fjernet etter oppdatering" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Siste oppdatering" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Nedtelling i sekunder til sjekking av at at skjermbilder fortsatt er gyldige" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Å velge en høyere tall betyr færre rundturer til den eksterne tjeneren, men " +"det kan ta lengre tid å vise oppdaterte skjermbilder. Hvis innstillingen er " +"satt til 0, vil det aldri bli sjekket etter oppdaterte skjermbilder hvis det " +"allerede eksisterer et." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Anmeldelsestjener" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Minste mulige karma for anmeldelser" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Anmeldelser med karma mindre enn dette tallet vil ikke vises." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Liste over offisielle innholdskilder som ikke bør regnes som " +"tredjepartskilder" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Liste over nødvendige innholdskilder som ikke kan slås av eller fjernes" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Liste over offisielle innholdskilder som bør regnes som frie" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "Lisenslenken som bør brukes når en app regnes som fri" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Installer apper for alle brukere på systemet når mulig" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Gi tilgang til Innholdskilder-vinduet" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Tilby systemoppdateringer til ustabile versjoner" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Vis at apper er proprietære" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Vis den installerte størrelsen til apper i listen over installerte apper" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://no.wikipedia.org/wiki/Propriet%C3%A6r_programvare'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI-en som forklarer proprietært innhold" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"En liste over lenker til AppStream-filer som vil lastes ned til en swcatalog-" +"mappe" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Installer AppStream-filene på systemet slik at de er tilgjengelige for alle " +"brukere. Hvis denne innstillingen er slått av, vil filer installeres i den " +"ikke-standardiserte mappen $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Rekkefølge på foretrukne appformater, med viktigere formater lenger oppe. En " +"tom liste vil sette formatene i standard rekkefølge. Formater som ikke er " +"listet her, vil bli satt nederst. Eksempler på formater er: deb, Flatpak, " +"RPM og Snap." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "Forrige forsøk på å fjerne ubrukte Flatpak-baser" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "Velg 'true' for å bare vise frie apper og skjule alt proprietært." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "Velg 'true' for å bare vise apper fra verifiserte utviklere." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Tidspunkt for siste mottatte historiske oppdateringer." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "gnome-online-account-ID-en brukt til å logge inn" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "AppStream-systeminstallering" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Lesing av argumenter mislyktes" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Du må oppgi nøyaktig ett filnavn" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Dette programmet kan bare brukes av systembrukeren" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Sjekking av innholdstype mislyktes: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Flytting mislyktes: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Installering" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Installer valgt innhold på systemet" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Fantasivold" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Ingen informasjon om fantasivold" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Illustrert vold" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Ingen informasjon om illustrert vold" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Virkelighetsnær vold" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Ingen informasjon om virkelighetsnær vold" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Blodighet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Ingen informasjon om blodighet" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Seksuelle overgrep" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Ingen informasjon om seksuelle overgrep" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Ingen informasjon om henvisninger til alkohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Ingen informasjon om henvisninger til ulovlige rusmidler" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tobakk" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Ingen informasjon om henvisninger til tobakksprodukter" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nakenhet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Ingen informasjon om nakenhet" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Seksuell tematikk" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Ingen informasjon om seksuelle henvisninger eller fremstillinger" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Banning" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Ingen informasjon om banning" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Vulgær humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Ingen informasjon om vulgær humor" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminering" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Ingen informasjon om diskriminerende språkbruk" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Annonser" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Ingen informasjon om annonser" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Sjansespill" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Ingen informasjon om sjansespill" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Pengebruk" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Ingen informasjon om muligheter for pengebruk" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Meldinger" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Ingen informasjon om muligheter for kommunikasjon med meldinger" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Lyd og video" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Ingen informasjon om muligheter for kommunikasjon med lyd eller video" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontaktopplysninger" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "Ingen informasjon om deling av eksterne brukernavn og e-postadresser" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Personopplysninger" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Ingen informasjon om deling av personopplysninger med tredjeparter" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Posisjon" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Ingen informasjon om deling av posisjon med andre" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homofili" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Ingen informasjon om henvisninger til homofili" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitusjon" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Ingen informasjon om henvisninger til prostitusjon" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Utroskap" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Ingen informasjon om henvisninger til utroskap" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Seksualiserte figurer" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Ingen informasjon om seksualiserte figurer" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Blasfemi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Ingen informasjon om henvisninger til blasfemi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Menneskelik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Ingen informasjon om synlige menneskelik" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Slaveri" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Ingen informasjon om henvisninger til slaveri" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Inneholder ikke henvisninger til rusmidler" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Inneholder ikke banning eller annen sterk språkbruk" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Inneholder ikke annonser eller pengeoverføringer" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Inneholder ikke sex eller nakenhet" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Inneholder ikke funksjonalitet for ukontrollert kommunikasjon" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Inneholder ikke vold" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Rusmidler" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Sterkt språk" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Penger" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sosialt" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Vold" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "A" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s har ukjent aldersgrense" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s passer for alle" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s passer for småbarn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s passer for førskolebarn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s passer for barn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s passer for ungdommer" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s passer for voksne" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s passer for %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Aldersgrense" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Bidra med informasjon" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Lokal fil" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Pakke" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Venter" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Venter på installering" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Venter på avinstallering" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Installerer" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Avinstallerer" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Laster ned" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Installer" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Avinstaller…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Nettverk" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Kan bruke nettverket" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Systemtjenester" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Kan bruke systemtjenester" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Økttjenester" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Kan bruke økttjenester" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Enheter" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Kan bruke vilkårlige enheter, som kameraer" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Kan bruke inndataenheter" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Kan bruke mikrofon og spille lyd" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Kan bruke systemets enheter" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Skjerminnhold" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Kan se skjerminnhold" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Hjemmemappe" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Kan se, redigere og opprette filer" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Kan se filer" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Filsystem" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Nedlastingsmappe" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Innstillinger" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Kan se og endre alle innstillinger" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Foreldet vindussystem" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Bruker et foreldet og usikkert vindussystem" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Innhegningsbrytning" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Kan bryte ut av innhegningen og omgå alle andre begrensninger" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Ingen beskrivelse." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Oppdatering" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Trenger flere tillatelser" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Ugyldige anmeldelsesdata mottatt" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Henting av anmeldelser mislyktes" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Anmeldelser" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Fant ingen anmeldelser av denne appen." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Ingen anmeldelser" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Tidligere oppdateringer" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Nytt i versjon %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versjon %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Ingen beskrivelse" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e. %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Oppstartsmodus: enten ‘updates’, ‘updated’, ‘installed’ eller ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Søk etter apper" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Vis appinformasjon (med app-ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Vis appinformasjon (med pakkenavn)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Installer appen (med app-ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Avinstaller appen (med app-ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Åpne lokal pakkefil" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILENAME" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Typen interaksjon forventet fra denne handlingen: enten ‘none’, ‘notify’, or " +"‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Vis lokal metainfo/appdata-fil" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Slå på utdypende feilsøkingsutdata (fra den kjørende prosessen, hvis den " +"allerede kjører)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installerer ventende oppdateringer i bakgrunnen" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Vis innstillinger" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Avslutt kjørende prosess" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Foretrekk lokale filer over AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Vis versjonsnummer" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Opphavsrett © 2016–2023 Appsenter-bidragsyterne" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Kjartan Maraas \n" +"Torstein Adolf Winterseth \n" +"Harald H. \n" +"Brage Fuglseth https://bragefuglseth.dev" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Fant ingen informasjon om appen." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Installert størrelse" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inkluderer %s data og %s hurtiglagring" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inkluderer %s data" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inkluderer %s hurtiglagring" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Ukjent datamengde og hurtiglagring" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Størrelse" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Trenger ikke ekstra nedlastinger" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Trenger en ukjent mengde ekstra nedlastinger" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Trenger %s ekstra nedlastinger" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Ukjent størrelse" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Ingen tillatelser" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Har nettverkstilgang" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Bruker systemtjenester" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Bruker økttjenester" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Har maskinvaretilgang" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Har systemtilgang" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Kan se og endre dataene dine" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Kan se dataene dine" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Kan se og endre nedlastingene dine" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Kan se nedlastingene dine" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Har tilgang til enkelte data" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Kan se og endre innstillingene dine" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Bruker et foreldet visningssystem" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Kan gi seg selv vilkårlige tillatelser" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Utvikleren er verifisert" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Kontrollert av system" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Kontrollert av %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Levert av tredjepart" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Ikke lenger støttet" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Åpen kildekode" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Ukjent lisens" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Proprietær kildekode" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Spesiell lisens" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Spesialtstatus" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Trygg" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Sannsynligvis trygg" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potensielt utrygg" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Utrygg" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Kun for mobil" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Kan bare brukes på små skjermer" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Kun for datamaskin" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Kan bare brukes på store skjermer" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Inkompatibel" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Kan ikke brukes med skjermstørrelsen din" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Kan bare brukes med trykkskjerm" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Kan bare brukes med tastatur" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Kan bare brukes med pekeenhet" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Spillkontroll" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Trenger spillkontroll for å brukes" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Fleksibel" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Kan brukes på datamaskin, nettbrett og mobil" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Trenger sannsynligvis tastatur eller pekeenhet" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Kan brukes på stasjonære og bærbare datamaskiner" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Har ikke aldersbegrenset innhold" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Ingen informasjon om aldersgrense" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Besøk nettsted" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Installer…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Avbryt" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Installer" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Last ned" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Oppdater" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Avinstaller…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Avinstallerer" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Viktig oppdatering" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Enheten kan ikke brukes under oppdateringen." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Kilde: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Het tidligere %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Oppdateres ikke" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Viktig oppdatering" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Installert" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Oversett %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s utvikles og oversettes i det åpne av et internasjonalt fellesskap.\n" +"\n" +"Appen er ikke tilgjengelig på norsk ennå, men du kan bli med på dugnaden og " +"hjelpe til med oversettelsene selv." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Oversettelser" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Oversett" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Innlogging kreves for appkilden %s (domene %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Innlogging kreves" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Avbryt" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Logg inn" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Bruker" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Passord" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Annet" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Alt" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Fremhevet" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Fremhevet" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nytt og oppdatert" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Utvalgte nettapper" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Annet" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s installert" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Systemet må starte på nytt for å fullføre handlingen" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Appen er klar til bruk" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Systemoppdateringer installert" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "De nylig installerte oppdateringene er tilgjengelige for inspeksjon" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Start på nytt" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Åpne" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Installere innhold?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Installere tredjepartsinnhold?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Aktivere kilde?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Aktivere tredjepartskilde?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s er ikke fri og " +"åpen, og leveres av «%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s leveres av «%s»." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Denne innholdskilden må aktiveres for å fortsette installeringen." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Det kan være ulovlig å bruke %s i enkelte land." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Det kan være ulovlig å installere og bruke denne kodeken i enkelte land." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_Ikke vis igjen" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Aktiver og _installer" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Utdypende feilmeldinger fra pakkebehandleren:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Informasjon" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Lukk" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Informasjon kopiert til utklippstavlen" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Aksepter" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "En oppdatering har blitt installert" +msgstr[1] "Flere oppdateringer har blitt installert" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "En app har blitt avinstallert" +msgstr[1] "Flere apper har blitt avinstallert" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Systemet må starte på nytt for å fullføre handlingen" +msgstr[1] "Systemet må starte på nytt for å fullføre handlingen" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Ikke nå" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "I dag" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "I går" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag siden" +msgstr[1] "%d dager siden" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d uke siden" +msgstr[1] "%d uker siden" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d måned siden" +msgstr[1] "%d måneder siden" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d år siden" +msgstr[1] "%d år siden" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Nettopp" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minutt siden" +msgstr[1] "%d minutter siden" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d time siden" +msgstr[1] "%d timer siden" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Alt" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Fremhevet" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D-grafikk" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografi" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skanning" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorgrafikk" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visning" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Lydskaping" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Musikkspilling" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Alt" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Fremhevet" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalender" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Database" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finans" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Tekstbehandling" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Tekstredigering" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Nettlesere" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Alt" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Fremhevet" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Spenning" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Eventyr" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokker" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Brettspill" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kortspill" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Systemsimulering" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Barn" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Hjernetrim" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rollespill" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategi" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Alt" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Fremhevet" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Meldinger" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Alt" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Fremhevet" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Kunstig intelligens" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomi" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kjemi" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Språk" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matte" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Nyheter" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotikk" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Kunst" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografisk" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Tegneserier" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Skjønnlitteratur" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Helse" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historie" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Livsstil" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politikk" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Alt" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Fremhevet" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Feilsøking" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Utviklingsmiljøer" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeker" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Drivere" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Skrifttyper" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Inndatakilder" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Språkpakker" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Språk" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Kreativitet" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Produktivitet" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Spill" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Sosialisering" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Læring" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Utvikling" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodeker" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Drivere" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Skrifttyper" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Inndatakilder" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Språkpakker" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Språk" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "En app" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s ber om støtte for flere filtyper." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Flere filtyper kreves" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s ber om flere skrifttyper." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Flere skrifttyper kreves" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s ber om flere multimediekodeker." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Flere kodeker kreves" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s ber om flere skriverdrivere." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Flere skriverdrivere kreves" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s ber om flere pakker." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Flere pakker kreves" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Finn i Appsenter" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Vis mer" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Vis mindre" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Avinstallerer…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Krever omstart for å fullføre installering" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Krever omstart for å fullføre avinstallering" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Venter…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Venter…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Laster ned…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Gjør klart…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Avinstallerer…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s er ikke installert, men har fortsatt data på enheten." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Start på nytt" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Aktiver…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Installer…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s er ikke tilgjengelig på norsk" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Denne appen er ikke tilgjengelig på norsk" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Dette innholdet er ikke tilgjengelig på norsk" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "_Oversett" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Andre apper fra %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "%s har verifisert seg som eieren av %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Utvikleren har verifisert seg som eieren av %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Det kreves nettilkobling for å sende inn en anmeldelse" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Denne appen får ikke lenger sikkerhetsoppdateringer" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Denne appen er allerede installert av systemet ditt, og bør ikke byttes ut." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Denne appen har ingen lenker til nettsted, kildekode eller arbeidsområde." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Dette innholdet får ikke lenger sikkerhetsoppdateringer" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Dette innholdet er allerede installert av systemet ditt, og bør ikke byttes " +"ut." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Dette innholdet har ingen lenker til nettsted, kildekode eller arbeidsområde." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Informasjon om %s kunne ikke hentes ut, og kan derfor heller ikke vises." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Ugyldig svar fra anmeldelsestjenesten" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Innsending av anmeldelse av «%s» mislyktes: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Informasjon" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Laster inn informasjon" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verifisert" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Åpne" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Oppdater" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Avinstaller" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Tillegg" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "Denne appen kan bare brukes når systemet er tilkoblet internett." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Innholdskilde inkludert" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Denne appen inkluderer en innholdskilde som sender ut oppdateringer og gir " +"tilgang til annet innhold." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Ingen innholdskilde inkludert" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Denne appen inkluderer ikke en innholdskilde. Den vil ikke få oppdateringer." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Innholdskilde funnet" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Å legge til denne innholdskilden vil gi tilgang til oppdateringer og annet " +"innhold." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Bare bruk innholdskilder du stoler på." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Slett appdata" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Slett data" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Ingen informasjon" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Nettsted" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Doner" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Oversett" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Meld om problem" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Hjelp" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontakt" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Sk_riv anmeldelse" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Alle anmeldelser" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Visning av informasjon mislyktes" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Omstart mislyktes" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Ukjent feil" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Fant ikke nøkkel" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Nøkkelen er ikke registrert" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK-registrering kreves" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Neste" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Denne enheten har sikret oppstart slått på. For å installere nye drivere, må " +"en ny eiernøkkel (MOK) registreres. Prosessen vil kreve at et passord blir " +"skrevet inn underveis. Skriv ned dette passordet, som er knyttet til " +"nøkkelen:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Passordet har blitt skrevet ned" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Start på nytt…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Oppsettsinstrukser: les nøye" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Etter at enheten har startet på nytt, vil det vises en oppsettsskjerm. For å " +"aktivere nye drivere, følg disse trinnene:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Velg «Registrer MOK»\n" +"• Velg «Ja» for å registrere nøklene\n" +"• Skriv inn MOK-passordet når det blir bedt om\n" +"• Velg «Start på nytt»" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Sikkerhetsmessige konsekvenser" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Etter registreringen, vil alle oppdateringer til hvilken som helst modul bli " +"regnet som sikre. Alle fremtidige oppdateringer vil dermed skje av seg selv, " +"uten noen form for bekreftelse eller autentisering." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"For å lære mer, se MOK-veiledningen." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Laster ned ekstra informasjon…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " og " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tilgjengelige skrifttyper for %s" +msgstr[1] "Tilgjengelige skrifttyper for %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Tilgjengelig innhold for %s" +msgstr[1] "Tilgjengelig innhold for %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Fant ikke innhold" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Søk etter innhold mislyktes" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "Fant ikke %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "på nettstedet" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Fant ingen apper med filen %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informasjon om %s og måter å få tak i manglende apper på, finnes muligens %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Fant ingen apper med støtte for %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "Fant ikke %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informasjon om %s og måter å få tak i en app som kan støtte dette formatet " +"på, finnes muligens %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Fant ingen skrifttyper som støtter %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informasjon om %s og måter å få tak i flere skrifttyper på, finnes muligens " +"%s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Fant ingen tillegskodeker til %s-formatet." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informasjon om %s og måter å få tak i en kodek som kan spille av dette " +"formatet på, finnes muligens %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Fant ingen Plasma-ressurser med %s-støtte." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informasjon om %s og måter å få tak i flere Plasma-ressurser på, finnes " +"muligens %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Fant ingen skriverdrivere til %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informasjon om %s og måter å få tak i en driver til denne skriveren på, " +"finnes muligens %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentasjonen" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "Fant ikke %s, som ble spurt om av %s. Se i %s for mer informasjon." +msgstr[1] "Fant ikke %s, som ble spurt om av %s. Se i %s for mer informasjon." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "Fant ikke %s. Se i %s for mer informasjon." +msgstr[1] "Fant ikke %s. Se i %s for mer informasjon." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Ingen treff: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s-filtypen" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Installer _alt" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Fant ikke innhold" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kodekside" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Ingen treff" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Utføring av søk mislyktes" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Forrige" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Neste" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Fremhevede apper" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Datamaskin støttes" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Kan brukes på store skjermer" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Datamaskin støttes kanskje" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Ikke nok informasjon til å vite om appen kan brukes på store skjermer" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Kan bare brukes på store skjermer" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Datamaskin støttes ikke" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Kan ikke brukes på store skjermer" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobil støttes" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Kan brukes på små skjermer" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobil støttes kanskje" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Ikke nok informasjon til å vite om appen kan brukes på små skjermer" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Kan bare brukes på små skjermer" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobil støttes ikke" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Kan ikke brukes på små skjermer" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Tastatur støttes" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Tastatur støttes kanskje" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Ikke nok informasjon til å vite om appen kan brukes med tastatur" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Tastatur nødvendig" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Kan brukes med tastatur" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tastatur støttes ikke" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Kan ikke brukes med tastatur" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Pekeenhet støttes" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Trenger mus eller styreflate" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Pekeenhet støttes kanskje" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Ikke nok informasjon til å vite om appen kan brukes med mus eller styreflate" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Pekeenhet nødvendig" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Kan brukes med mus eller styreflate" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Pekeenhet støttes ikke" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Kan ikke brukes med mus eller styreflate" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Trykkskjerm støttes" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Trykkskjerm støttes kanskje" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Ikke nok informasjon til å vite om appen kan brukes med trykkskjerm" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Trykkskjerm nødvendig" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Kan brukes med trykkskjerm" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Trykkskjerm støttes ikke" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Kan ikke brukes med trykkskjerm" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Spillkontroll nødvendig" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Trenger spillkontroll" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Spillkontroll støttes" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Kan brukes med spillkontroll" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s virker sannsynligvis på denne enheten" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s virker på denne enheten" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s virker kanskje på denne enheten" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s virker delvis på denne enheten" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s virker ikke på denne enheten" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Enhetsstøtte" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigasjon" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Utforsk" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Installert" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Oppdateringer" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Søk" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Vindu" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Innstillinger" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Innholdskilder" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Hjelp" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Tastatursnarveier" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Installert" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Installert-side" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Installerer" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Apper" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Nettapper" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Systemapper" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Fri og åpen" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Bli med" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Denne appen utvikles i det åpne av et internasjonalt fellesskap, og utgis " +"under %s-lisensen.\n" +"\n" +"Du kan bli med på dugnaden og hjelpe til med å gjøre den enda bedre." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Denne appen utvikles i det åpne av et internasjonalt fellesskap, og utgis " +"under %s-lisensen.\n" +"\n" +"Du kan bli med på dugnaden og hjelpe til med å gjøre den enda bedre." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Dette innholdet utvikles i det åpne av et internasjonalt fellesskap, og " +"utgis under %s-lisensen.\n" +"\n" +"Du kan bli med på dugnaden og hjelpe til med å gjøre det enda bedre." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Dette innholdet utvikles i det åpne av et internasjonalt fellesskap, og " +"utgis under %s-lisensen.\n" +"\n" +"Du kan bli med på dugnaden og hjelpe til med å gjøre det enda bedre." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Ukjent lisens" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Lær mer" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Denne appen oppgir ikke hvilken lisens den utgis under, og er muligens " +"proprietær. Den kan inneholde skjulte sikkerhetstrusler og utføre utrygge " +"handlinger.\n" +"\n" +"Du kan sannsynligvis ikke hjelpe til med å forbedre den." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Dette innholdet oppgir ikke hvilken lisens det utgis under, og er muligens " +"proprietært. Det kan inneholde skjulte sikkerhetstrusler og utføre utrygge " +"handlinger.\n" +"\n" +"Du kan sannsynligvis ikke hjelpe til med å forbedre det." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Proprietær" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Denne appen utvikles ikke i det åpne, så bare skaperne vet hvordan den " +"virker. Den kan inneholde skjulte sikkerhetstrusler og utføre utrygge " +"handlinger.\n" +"\n" +"Du kan sannsynligvis ikke hjelpe til med å forbedre den." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Dette innholdet utvikles ikke i det åpne, så bare skaperne vet hvordan det " +"virker. Det kan inneholde skjulte sikkerhetstrusler og utføre utrygge " +"handlinger.\n" +"\n" +"Du kan sannsynligvis ikke hjelpe til med å forbedre det." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Spesiell lisens" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Denne appen utgis under den spesielle lisensen «%s».\n" +"\n" +"Du kan sannsynligvis ikke hjelpe til med å forbedre den." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Denne appen utgis under den spesielle lisensen «%s».\n" +"\n" +"Du kan sannsynligvis ikke hjelpe til med å forbedre den." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Dette innholdet utgis under den spesielle lisensen «%s».\n" +"\n" +"Du kan sannsynligvis ikke hjelpe til med å forbedre det." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Dette innholdet utgis under den spesielle lisensen «%s».\n" +"\n" +"Du kan sannsynligvis ikke hjelpe til med å forbedre det." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Laster inn" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Innlastingsside" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Starter opp" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Ukjent kilde" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Bruker" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Lagt til" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Fjernet" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Oppdatert" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Neddatert" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "utvalgte eksterne kilder" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Gir tilgang til innhold fra %s. Dette innholdet kan være proprietært.\n" +"\n" +"Du kan aktivere kildene senere i innstillingene for innholdskilder." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Aktivere tredjepartskilder?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorer" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Aktiver" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Tilgjengelig for dette systemet" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Tilgjengelig for %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Utforsk" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Oversiktsside" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Tilgjengelige apper" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Andre kategorier" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Fant ikke appinformasjon" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Ukjent" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Bruker avslo installering" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Gjør klar %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Er du sikker på at du ønsker å fjerne %s-kilden?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Alle apper fra %s vil avinstalleres, og du vil måtte legge til kilden på " +"nytt for å bruke dem igjen." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Avinstallere %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Det vil ikke være mulig å bruke %s etter avinstalleringen." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Det vil ikke være mulig å bruke apper som trenger %s etter avinstalleringen." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Det vil ikke være mulig å bruke %s etter avinstalleringen. Dokumenter som " +"bruker den, vil vises med en annen skrifttype i stedet." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Det vil ikke være mulig å bruke %s etter avinstalleringen. Enkelte " +"mediefiler kan bli uspillbare." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "Maskinvare som avhenger av %s, kan slutte å fungere som den skal." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Det vil ikke være mulig å bruke %s etter avinstalleringen. Data og " +"innstillinger fra appen vil beholdes på enheten, for å kunne gjenopprettes i " +"fremtiden." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Innstillinger" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Oppdateringer" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Mer informasjon" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Å se etter og installere oppdateringer krever mye data og strøm. Automatiske " +"oppdateringer blir derfor satt på pause når det registreres en forbruksmålt " +"tilkobling eller strømsparing er på." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatisk" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "La oppdateringer installeres automatisk" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manuelt" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Se etter og installer oppdateringer manuelt" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Oppdateringsvarslinger" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Send varslinger når oppdateringer har blitt installert automatisk" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Innholdsfiltrering" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Kun _fritt innhold" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Skjul proprietære apper fra utforskingssider og søketreff" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Kun _verifiserte utviklere" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Skjul apper fra utviklere som ikke har verifisert identiteten sin" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Dette innholdet er inkompatibelt med %s, og vil fjernes under oppdateringen." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Inkompatibelt innhold" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Oppdater" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Avinstaller" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Data og innstillinger" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Behold" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "La data og innstillinger være igjen på enheten" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Slett" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Spar lagringsplass ved å slette alt permanent" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "Innhold fra «%s» vil ikke oppdateres lenger." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Deaktivere kilde?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Fjerne kilde?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Deaktiver" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Fjern" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Aktiver nye kilder" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Ta nye kilder i bruk når de legges til" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "mer informasjon" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Kilder fra utvalgte tredjeparter — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Tredjepartskilder" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "systemet" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Kilder med annet innhold enn det som allerede leveres av %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Innholdskilder" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Ingen kilder" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u app installert" +msgstr[1] "%u apper installert" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u tillegg installert" +msgstr[1] "%u tillegg installert" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u app" +msgstr[1] "%u apper" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u tillegg" +msgstr[1] "%u tillegg" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s og %s installert" +msgstr[1] "%s og %s installert" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Sjekker installert innhold…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Fjern" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Elendig" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Dårlig" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Helt grei" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Ganske bra" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Fantastisk" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Velg en stjerne for å gi en vurdering" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Bruk mer tid på anmeldelsen" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Velg en stjerne" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Sammendraget er for kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Sammendraget er for langt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Beskrivelsen er for kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Beskrivelsen er for lang" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Anmeldelse" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Send inn" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Oppgi en stjernevurdering, et sammendrag og en beskrivelse. Anmeldelser bør " +"ikke brukes til å melde om problemer; kontakt utvikleren eller leverandøren " +"i stedet for å gjøre det." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Sammendrag" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Beskrivelse" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Finn ut hva slags data som sendes i anmeldelsessystemets personvernerklæring. Det fulle navnet på " +"brukeren din vil vises i anmeldelsen." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u anmeldelse totalt" +msgstr[1] "%u anmeldelser totalt" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "av 5 stjerner" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Ukjent" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Du kan rapportere anmeldelser hvis de har upassende, uhøflig eller " +"diskriminerende innhold." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Når en anmeldelse er rapportert, vil den skjules til den har blitt " +"gjennomgått av en administrator." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Rapportere anmeldelse?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Rapporter" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Fjerne anmeldelse?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Anmeldelsen vil ikke kunne gjenopprettes." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Lik anmeldelse" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Stem ned anmeldelse" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Rapporter…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Fjern…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "Ikke innhegnet, men systemet har kontrollert at den er trygg" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Pass på at utvikleren er troverdig, siden appen ikke er innhegnet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Ingen tillatelser" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Appen er fullstendig innhegnet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Nettverkstilgang" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Kan bruke internett" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Ingen nettverkstilgang" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Kan ikke bruke internett" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Bruker systemtjenester" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Kan hente data fra systemtjenester" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Bruker økttjenester" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Kan hente data fra økttjenester" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Enhetstilgang" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Kan bruke enheter som kameraer og spillkontroller" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Ingen enhetstilgang" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Kan ikke bruke enheter som kameraer og spillkontroller" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Inndatatilgang" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Mikrofontilgang og spilling av lyd" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Kan lytte med mikrofon og spille lyd uten å be om tillatelse" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Systemtilgang" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "Kan bruke systemenheter som krever spesielle tillatelser" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Skjermtilgang" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Kan se innhold på skjermen eller i vinduer" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Foreldet visningssystem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Vilkårlige tillatelser" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Innstillinger" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Full datatilgang" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Kan se og endre alle data på systemet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Hjemmemappetilgang" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Kan se og endre alle data i hjemmemappen din" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Delvis datatilgang" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Kan se alle data på systemet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Delvis hjemmemappetilgang" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Kan se alle data i hjemmemappen din" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Nedlastingstilgang" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Kan se og endre alle nedlastingene dine" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Delvis nedlastingstilgang" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Kan se alle nedlastingene dine" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Kan se og endre alle data i mappen" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Kan se alle data i mappen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Ingen datatilgang" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Kan ikke se eller endre data på systemet" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Verifisert utvikler" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Utvikleren har verifisert identiteten sin" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Usikre komponenter" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "Har komponenter som ikke oppdateres lenger og kan være usikre" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "Oppgir ikke hvilken lisens den utgis under, og kan være proprietær" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "Oppgir ikke hvilken lisens det utgis under, og kan være proprietært" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Proprietær kildekode" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "Har ikke åpent tilgjengelig og kontrollerbar kildekode" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Utgitt under den spesielle lisensen «%s»" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Utgitt under den spesielle lisensen «%s»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Åpen kildekode" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "Har åpent tilgjengelig og kontrollerbar kildekode" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s har spesialstatus" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s er trygg" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s er sannsynligvis trygg" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s er potensielt utrygg" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s er utrygg" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Ukjent" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Sikkerhet" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Lisens" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Kilde" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "Base" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Denne appen bruker en utdatert base, og kan inneholde feil eller sårbarheter " +"som ikke vil bli fikset." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Forrige skjermbilde" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Neste skjermbilde" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Ingen skjermbilder" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Fant ikke skjermbilde" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Innlasting av bilde mislyktes" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Fant ikke størrelse på skjermbilde" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Oppretting av hurtiglagring mislyktes" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Skjermbilde ugyldig" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Skjermbilde utilgjengelig" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Skjermbilde" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u treff til" +msgstr[1] "%u treff til" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Søkeside" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Søk etter apper" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Fant ingen apper" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Nedlasting av oppdateringer mislyktes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Nedlasting av oppdateringer mislyktes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nedlasting av oppdateringer fra %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nedlasting av oppdateringer fra %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Oppdatering mislyktes: trenger nettilgang" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Oppdatering mislyktes: ikke nok lagringsplass" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Nedlasting av oppdateringer fra %s mislyktes: ikke nok lagringsplass" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Oppdatering mislyktes: autentisering kreves" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Oppdatering mislyktes: ugyldig autentisering" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Oppdatering mislyktes: trenger tillatelse" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Nedlasting av oppdateringer mislyktes: har ikke tillatelse til å installere " +"programvare" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Henting av oppdateringsliste mislyktes" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Installering mislyktes: nedlasting avbrutt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Installering av %s mislyktes: nedlasting fra %s avbrutt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Installering av %s mislyktes: nedlasting avbrutt" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Installering mislyktes: manglende base" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Installering av %s mislyktes: basen %s er utilgjengelig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Installering av %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Installering mislyktes: trenger nettilgang" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Installering mislyktes: ugyldig apptype" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Installering mislyktes: ikke nok lagringsplass" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Installering av %s mislyktes: ikke nok lagringsplass" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Installering mislyktes: autentisering kreves" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Installering av %s mislyktes: autentisering kreves" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Installering mislyktes: ugyldig autentisering" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Installering av %s mislyktes: ugyldig autentisering" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Installering mislyktes: trenger tillatelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Installering av %s mislyktes: trenger tillatelse" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Installering mislyktes: enheten må kobles til" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Installering av %s mislyktes: enheten må kobles til" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Installering mislyktes: lavt batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Installering av %s mislyktes: lavt batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Oppdatering av %s fra %s mislyktes: nedlasting avbrutt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Oppdatering av %s mislyktes: nedlasting avbrutt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Oppdateringer fra %s mislyktes: nedlasting avbrutt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Oppdatering mislyktes: nedlasting avbrutt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Oppdatering av %s mislyktes: ikke nok lagringsplass" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Oppdatering av %s mislyktes: autentisering kreves" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Oppdatering av %s mislyktes: ugyldig autentisering" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Oppdatering av %s mislyktes: trenger tillatelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Oppdatering mislyktes: enheten må kobles til" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Oppdatering av %s mislyktes: enheten må kobles til" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Oppdatering mislyktes: lavt batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Oppdatering av %s mislyktes: lavt batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Oppdatering av %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Oppdatering mislyktes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Oppdatering mislyktes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Oppdatering fra %s til %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Oppdatering mislyktes: nedlasting avbrutt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Oppdatering til %s mislyktes: nedlasting avbrutt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Oppdatering mislyktes: trenger nettilgang" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Oppdatering til %s mislyktes: trenger nettilgang" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Oppdatering mislyktes: ikke nok lagringsplass" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Oppdatering til %s mislyktes: ikke nok lagringsplass" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Oppdatering mislyktes: autentisering kreves" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Oppdatering til %s mislyktes: autentisering kreves" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Oppdatering mislyktes: ugyldig autentisering" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Oppdatering til %s mislyktes: ugyldig autentisering" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Oppdatering mislyktes: trenger tillatelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Oppdatering til %s mislyktes: trenger tillatelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Oppdatering mislyktes: enheten må kobles til" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Oppdatering til %s mislyktes: enheten må kobles til" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Oppdatering mislyktes: lavt batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Oppdatering til %s mislyktes: lavt batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Oppdatering til %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Avinstallering mislyktes: autentisering kreves" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Avinstallering av %s mislyktes: autentisering kreves" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Avinstallering mislyktes: ugyldig autentisering" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Avinstallering av %s mislyktes: ugyldig autentisering" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Avinstallering mislyktes: trenger tillatelse" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Avinstallering av %s mislyktes: trenger tillatelse" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Avinstallering mislyktes: enheten må kobles til" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Avinstallering av %s mislyktes: enheten må kobles til" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Avinstallering mislyktes: lavt batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Avinstallering av %s mislyktes: lavt batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Avinstallering av %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Åpning av %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Noe gikk galt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Åpning av %s mislyktes: %s er ikke installert" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Ikke nok lagringsplass til handling" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Installering mislyktes: filtypen støttes ikke" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Installering mislyktes: autentisering avbrutt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Installering mislyktes" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Tilkobling til %s mislyktes" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Start Appsenter på nytt for å ta nye tillegg i bruk" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Enheten må kobles til" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Batterinivået er for lavt" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Innholds_kilder" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Innstillinger" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Tastatursnarveier" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Om Appsenter" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Søk" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Hovedmeny" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Søk etter apper" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Utforsk" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Installert" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Oppdateringer" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Gå tilbake" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ingen" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Appdata" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Nødvendig data for å åpne appen" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Brukerdata" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Data skapt gjennom bruk av appen" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Hurtiglagring" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Data lagret midlertidig for å gjøre appen raskere" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Selve appen" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Nødvendige komponenter" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Komponenter delt med resten av systemet" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Ukjent" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Hurtiglagring kan fjernes i _app-instillingene" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Lagringsplass" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Installert)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Installerer)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Laster ned)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Avinstallerer)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Informasjon" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Undersøk" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Installert %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Installerte oppdateringer" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Ingen oppdateringer installert" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Potensielt utdatert innhold" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Se etter tilgjengelige oppdateringer i Appsenter" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Klart for viktige oppdateringer" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Installer viktige oppdateringer så snart som mulig" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Viktige oppdateringer tilgjengelig" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Last ned viktige oppdateringer så snart som mulig" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Klart for oppdateringer" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Nye oppdateringer er klare til installering" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Oppdateringer tilgjengelig" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Nye oppdateringer er klare til nedlasting" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u app oppdatert — åpne på nytt" +msgstr[1] "%u apper oppdatert — åpne på nytt" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u app oppdatert" +msgstr[1] "%u apper oppdatert" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s har blitt oppdatert." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Avslutt og åpne appen på nytt." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s og %s har blitt oppdatert." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u app må åpnes på nytt." +msgstr[1] "%u apper må åpnes på nytt." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inkluderer %s, %s og %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Systemet er utdatert" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Oppdater for å fortsette å motta sikkerhetsoppdateringer" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Ny versjon av %s tilgjengelig" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Oppdatering tilgjengelig" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Oppdatering mislyktes" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Klargjorte oppdateringer ble ikke installert" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Vis informasjon" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Oppdatering fullført" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Velkommen til %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Oppdatering installert" +msgstr[1] "Oppdateringer installert" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "En viktig systemoppdatering har blitt installert." +msgstr[1] "Viktige systemoppdateringer har blitt installert." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Vis informasjon" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Oppdatering mislyktes" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Systemet er allerede oppdatert." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Oppdateringen ble avbrutt." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Nettilkobling er nødvendig, men var ikke tilgjengelig. Pass på at enheten " +"har nettilgang og prøv igjen." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Det var sikkerhetsproblemer med oppdateringen. Kontakt innholdsleverandøren " +"din for mer informasjon." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Det var ikke nok lagringsplass. Frigjør nok plass og prøv igjen." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Kunne ikke installere oppdateringen. Vent på en ny oppdatering og prøv " +"igjen. Hvis problemet fortsetter, kontakt innholdsleverandøren din." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Sist sjekket: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Avbryt" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Se etter oppdateringer" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s får ikke lenger viktige oppdateringer" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Systemet ditt får ikke lenger viktige oppdateringer" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Kostnader kan påløpe" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Å se etter oppdateringer med mobilt bredbånd kan føre til økte kostnader." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Se _uansett" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Klart for oppdatering" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Oppdateringene er klare til å installeres" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Se etter oppdateringer" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Oppdateringer" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Oppdateringsside" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Laster inn oppdateringer" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Dette kan ta en stund" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Oppdatert" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Bruke mobildata?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "Å se etter oppdateringer med mobildata kan føre til økte kostnader" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Se uansett" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Ikke på nett" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Koble til nettet for å se etter oppdateringer" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Nettverk" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Noe gikk galt" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Oppdateringer sees etter automatisk" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Oppdateringer satt på pause" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Automatiske oppdateringer er satt på pause fordi:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Nettverkstilkoblingen er forbruksmålt" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Nettverkstilkoblingen hindrer store nedlastinger" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Strømsparing er på" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Spillmodus er på" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Oppdateringer satt på pause" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Forbruksmålt tilkobling — oppdateringer satt på pause" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "Tilkobling hindrer store nedlastinger — oppdateringer satt på pause" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Strømsparing på — oppdateringer satt på pause" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Spillmodus på — oppdateringer satt på pause" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Start på nytt…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Opp_dater alt" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Oppdateringer lastet ned" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Det er klart for installering av oppdateringer" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integrert fastvare" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Trenger omstart" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Apper" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Fastvare" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Last ned" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s er ute" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s er ute" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Lær om den nye oppdateringen" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s av %s lastet ned" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u %% lastet ned" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "En stor oppdatering med nye funksjoner og forbedringer." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Avbryt oppdatering" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Start på nytt…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Husk å sikkerhetskopiere data og filer før oppdateringen." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Feilinformasjon" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Kopier informasjon" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Sletting av «%s» mislyktes: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Sletting av «%s» mislyktes: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Installer og oppdater apper" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Oppdateringer;Oppgraderinger;Innholds;Kilder;Installer;Avinstaller;Apper;" +"Programmer;Applikasjoner;Programvare;Butikk;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s er klar" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "Det er klart for å aktivere %s ved neste oppstart." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Aktiver" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Systemoppdateringer" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Generelle oppdateringer til systemet, som feilrettinger, økt sikkerhet og " +"forbedret ytelse." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s-oppdatering med nye funksjoner og feilrettinger." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"EOS-oppdateringsstjenesten kunne ikke hente og installere oppdateringen." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Nettapper" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Støtte for nettapper" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Installer populære nettapper og åpne dem i en nettleser" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "Oppdater for å få nye funksjoner, forbedret ytelse og økt stabilitet." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Installer apper med Flatpak-rammeverket" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Systemmappe %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Hjemmemappe %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Systemmapper" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Systeminnstillinger fra /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Skrivebordsmappe" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Skrivebordsmappe %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Dokumentmappe" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Dokumentmappe %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Musikkmappe" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Musikkmappe %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Bildemappe" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Bildemappe %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Offentlig-mappe" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Offentlig-mappe %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Videomappe" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videomappe %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Malmappe" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Malmappe %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Hurtiglagringsmappe" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Hurtiglagringsmappe %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Innstillingsmappe" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Innstillingsmappe %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Datamappe" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Datamappe %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Basemappe" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Basemappe %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Tilgang til %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1382 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Laster ned Flatpak-informasjon for %s…" + +#: plugins/flatpak/gs-flatpak.c:3608 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Behandling av tillegg «%s» mislyktes: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Brukerinstallering" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Systeminstallering" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "App-ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Installering av tillegg «%s» mislyktes: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Avinstallering av tillegg «%s» mislyktes: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"KIlde «%s» tillater ikke installering av «%s», muligens på grunn av " +"filteret. Fjern filteret og prøv på nytt. Informasjon: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "For lavt batterinivå til å oppdatere" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "For lavt batterinivå til å oppdatere (%u %%, trenger %u %%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Enheten kan ikke nås" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Enheten har for lavt batterinivå" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Enheten har for lavt batterinivå (%u %%, trenger %u %%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Enheten venter på installering av oppdateringen" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Enheten trenger strømtilførsel for å kobles til" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Enheten kan ikke brukes mens den er lukket" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Enhetsoppdatering til %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Systemoppdatering til %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Kontrolloppdatering til %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "ME-oppdatering til %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Organisasjons-ME-oppdatering til %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Forbruker-ME-oppdatering til %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Kontrolloppdatering til %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Thunderbolt-kontrolloppdatering til %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Prosessoroppdatering til %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Instillingsoppdatering til %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Batterioppdatering til %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Kameraoppdatering til %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "TPM-oppdatering til %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Styreflateoppdatering til %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Museoppdatering til %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Tastaturoppdatering til %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Lagringsoppdatering til %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Nettverksoppdatering til %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Skjermoppdatering til %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "BMC-oppdatering til %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "USB-oppdatering til %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Lagringsoppdatering til %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Lagringsoppdatering til %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Lagringsoppdatering til %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Grafikkkortsoppdatering til %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Stasjonsoppdatering til %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "USB-stasjonsoppdatering til %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Fastvare" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Oppdatering av fastvare mislyktes: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Fastvareoppdateringer" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Oppdater systemets fastvare" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Installere ukjent innhold?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Innholdet som installeres er ukjent. Det vil ikke være mulig å verifisere " +"hvor oppdateringer til det kommer fra, eller om oppdateringene har blitt " +"manipulert." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Laste ned ukjent innhold?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Ukjente oppdateringer er tilgjengelig. Uten en signatur, er det ikke mulig å " +"verifisere hvor en oppdatering kommer fra, eller om den har blitt manipulert." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Oppdatere ukjent innhold?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Ukjente oppdateringer er tilgjengelig. Uten en signatur, er det ikke mulig å " +"verifisere hvor en oppdatering kommer fra, eller om den har blitt " +"manipulert. Oppdateringer vil slås av frem til ukjente oppdateringer fjernes " +"eller oppdateres." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Oppdatering mislyktes: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pakker" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Overføring før nedlasting mislyktes: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Nedlasting av oppdateringer mislyktes: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Oppdatering mislyktes: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "System (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snapcraft" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Installer apper med Snap-rammeverket" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "System" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Systemkomponent" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Fjerner oppdateringsprosess «%s», mislyktes med status %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "En fin måte å håndtere appene på systemet ditt på." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Skriv inn et tall fra 1 til %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Velg en app:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s har blitt installert" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "En app har blitt avinstallert" +#~ msgstr[1] "Flere apper har blitt avinstallert" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Fant ikke «%s»" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Laster inn apper" + +#~ msgid "Moderate page" +#~ msgstr "Modereringsside" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Ingen anmeldelser" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Var denne anmeldelsen nyttig?" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgid "No" +#~ msgstr "Nei" + +#~ msgid "Meh" +#~ msgstr "Verken eller" + +#~ msgid "Outdated SDK version" +#~ msgstr "Utdatert baseversjon" + +#~ msgid "Unable to install updates" +#~ msgstr "Installering av oppdateringer mislyktes" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Avinstallering mislyktes: ugyldig autentisering" + +#~ msgid "Network Settings" +#~ msgstr "Nettverk" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Systemoppdateringer utilgjengelig" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "En viktig systemoppdatering kunne ikke installeres." + +#~ msgid "No Network" +#~ msgstr "Ikke på nett" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Det er nødvendig med nettilgang for å se etter oppdateringer." + +#~ msgid "Network _Settings" +#~ msgstr "_Nettverk" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Oppdateringer er klare for installering." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Oppdateringer har blitt lastet ned og er klare for installering." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Laster ned oppdateringsinformasjon…" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "En viktig oppdatering er klar for installering." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Viktige oppdateringer er klare for nedlasting." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Oppdateringer er klare for nedlasting." diff --git a/po/ne.po b/po/ne.po new file mode 100644 index 0000000..fb5f0f5 --- /dev/null +++ b/po/ne.po @@ -0,0 +1,7401 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Gnome Nepali Translation Project\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-16 10:06+0000\n" +"PO-Revision-Date: 2025-03-17 07:28+0545\n" +"Last-Translator: Pawan Chitrakar \n" +"Language-Team: Nepali Translation Team \n" +"Language: ne\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-Bookmarks: -1,-1,-1,-1,-1,-1,-1,-1,281,-1\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "सफ्टवेयर" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "अनुप्रयोगहरू स्थापना र अद्यावधिक गर्नुहोस्" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and remove existing " +"installed apps." +msgstr "" +"सफ्टवेयरले तपाईंलाई नयाँ अनुप्रयोगहरू र प्रणाली एक्सटेन्सनहरू फेला पार्न र स्थापना गर्न र अवस्थित स्थापना गरिएका " +"अनुप्रयोगहरू हटाउन अनुमति दिन्छ।." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and multiple screenshots " +"per app. Apps can be found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" +"सफ्टवेयरले उपयोगी विवरणहरू र प्रति अनुप्रयोग बहुविध स्क्रिनशटहरूको साथ विशेषता र लोकप्रिय अनुप्रयोगहरू प्रदर्शन " +"गर्दछ। श्रेणीहरूको सूची ब्राउज गरेर वा खोजी गरेर अनुप्रयोगहरू फेला पार्न सकिन्छ। यसले तपाईंलाई अफलाइन अपडेट " +"प्रयोग गरेर तपाईंको प्रणाली अद्यावधिक गर्न अनुमति दिन्छ।." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "समिक्षा प्यानल" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "विस्तृत विवरणहरू" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "स्थापित प्यानल" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "अपडेट प्यानल" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "अद्यावधिक विवरण" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2768 src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "जिनोम परियोजना" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "शिम यूईएफआईमा परीक्षण अकमोड्स कुञ्जी" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "शिम यूईएफआईमा एकेमोड कुञ्जी परीक्षण गर्न प्रमाणीकरण आवश्यक छ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "शिम यूईएफआईमा एकमोड्स कुञ्जी दर्ता गर्नुहोस्" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "शिम यूईएफआईमा एकमोड कुञ्जी दर्ता गर्न प्रमाणीकरण आवश्यक छ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "शिम यूईएफआईमा परीक्षण डीकेएमएस कुञ्जी" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "शिम यूईएफआईमा डीकेएमएस कुञ्जी परीक्षण गर्न प्रमाणीकरण आवश्यक छ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "शिम यूईएफआईमा डीकेएमएस कुञ्जी दर्ता गर्नुहोस्" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "शिम यूईएफआईमा डीकेएमएस कुञ्जी दर्ता गर्न प्रमाणीकरण आवश्यक छ" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "प्रणाली स्थानमा अनुप्रयोगप्रवाह फाइल स्थापना गर्नुहोस्" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "प्रणाली स्थानमा अनुप्रयोगप्रवाह फाइल स्थापना गर्नुहोस्" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "मिल्दो परियोजनाहरूको सूची" + +#: data/org.gnome.software.gschema.xml:6 +msgid "This is a list of compatible projects we should show such as GNOME, KDE and XFCE." +msgstr "यो जिनोम, केडीई र एक्सएफसीई जस्ता हामीले देखाउनु पर्ने संगत परियोजनाहरूको सूची हो ।." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "जिनोम सफ्टवेयरमा अद्यावधिक र अद्यावधिकहरू व्यवस्थापन गर्ने या नगर्ने" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any automatic updates " +"actions or prompt for upgrades." +msgstr "" +"यदि अक्षम पारियो भने, जिनोम सफ्टवेयरले अद्यावधिक प्यानल लुकाउँदछ, कुनै स्वचालित अद्यावधिक कार्य हरू गर्दैन वा " +"उन्नयनका लागि संकेत गर्दैन ।." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "स्वचालित रूपमा डाउनलोड गर्नुहोस् र अद्यावधिकहरू स्थापना गर्नुहोस्" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the background, also " +"installing ones that do not require a reboot." +msgstr "" +"यदि सक्षम पारियो भने, जिनोम सफ्टवेयरले स्वचालित रूपमा पृष्ठभूमिमा सफ्टवेयर अद्यावधिकहरू डाउनलोड गर्दछ, रिबूट " +"आवश्यक नपर्ने हरू पनि स्थापना गर्दछ।." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "पृष्ठभूमिमा अद्यावधिक गरिएको सफ्टवेयरको बारेमा प्रयोगकर्तालाई सूचित गर्नुहोस्" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened whilst the user was " +"idle." +msgstr "" +"यदि सक्षम पारियो भने, जिनोम सफ्टवेयरले प्रयोगकर्ता निष्क्रिय भएको बेलामा भएका अद्यावधिकहरूको बारेमा " +"प्रयोगकर्तालाई सूचित गर्दछ ।." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "मिटर जडानमा हुँदा स्वचालित रूपमा ताजा गर्ने या नगर्ने" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even when using a metered " +"connection (eventually downloading some metadata, checking for updates, etc., which may incur " +"in costs for the user)." +msgstr "" +"यदि सक्षम पारियो भने, जिनोम सफ्टवेयरले मिटर गरिएको जडान प्रयोग गर्दा पनि पृष्ठभूमिमा स्वचालित रूपमा ताजा " +"पार्छ (अन्ततः केही मेटाडेटा डाउनलोड गर्दछ, अद्यावधिकहरूको लागि जाँच गर्दछ, आदि, जुन प्रयोगकर्ताको लागि लागत " +"मा पर्न सक्छ)।." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "यो जिनोम सफ्टवेयरको पहिलो रन हो कि होइन" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "अनुप्रयोगको छेउमा तारा रेटिङ देखाउनुहोस्" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "रिमोटका लागि पूर्वनिर्धारित शाखा सेटमा आधारित अनुप्रयोगहरू फिल्टर गर्नुहोस्" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "गैर-मुक्त अनुप्रयोगहरूले स्थापना गर्नु अघि चेतावनी संवाद देखाउँदछन्" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This controls if that " +"dialog is suppressed." +msgstr "" +"जब गैर-मुक्त अनुप्रयोगहरू स्थापना गरिन्छ एक चेतावनी संवाद देखाउन सकिन्छ। यदि त्यो संवाद दबाइयो भने यसले " +"नियन्त्रण गर्दछ ।." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "पछिल्लो अद्यावधिक जाँच टाइमस्ट्याम्प" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "अन्तिम स्तरवृद्धि सूचना टाइमस्ट्याम्प" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "अन्तिम अद्यावधिक सूचना टाइमस्टाम्प" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "अद्यावधिक खाली पछि पहिलो सुरक्षा अद्यावधिक को टाइमस्ट्याम्प" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "अन्तिम अद्यावधिक टाइमस्ट्याम्प" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "अपस्ट्रीम स्क्रिनसट प्रमाणित गर्न सेकेन्डमा उमेर अझै पनि वैध छ" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but updates to the " +"screenshots may take longer to show to the user. A value of 0 means to never check the server " +"if the image already exists in the cache." +msgstr "" +"ठूलो मान छनौट गर्नुको अर्थ रिमोट सर्भरमा कम राउन्ड-ट्रिपहरू हुनेछ तर स्क्रिनशटहरूमा अद्यावधिकहरू प्रयोगकर्तालाई " +"देखाउन बढी समय लाग्न सक्छ। ० को मानको अर्थ यदि छवि पहिल्यै क्यासमा अवस्थित छ भने सर्भरकहिल्यै जाँच गर्नु हुँदैन " +"।." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "सर्भर प्रयोगका लागि अनुप्रयोग समीक्षाहरू" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "समीक्षाका लागि न्यूनतम कर्म स्कोर" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "यो संख्याभन्दा कम कर्म भएका समीक्षाहरू देखाइने छैनन्।." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "तेस्रो पक्ष मान्नु नपर्ने आधिकारिक भण्डारको सूची" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "अक्षम पार्न वा हटाउन नसकिने आवश्यक भण्डारहरूको सूची" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "नि:शुल्क सफ्टवेयर मान्नुपर्ने आधिकारिक भण्डारहरूको सूची" + +#: data/org.gnome.software.gschema.xml:98 +msgid "The licence URL to use when an application should be considered free software" +msgstr "अनुप्रयोगलाई नि: शुल्क सफ्टवेयर मान्नु पर्ने बेलामा प्रयोग गर्ने इजाजतपत्र यूआरएल" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "सम्भव भएसम्म प्रणालीमा सबै प्रयोगकर्ताहरूका लागि बन्डल गरिएको अनुप्रयोगहरू स्थापना गर्नुहोस्" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "सफ्टवेयर भण्डार संवादमा पहुँच अनुमति दिनुहोस्" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "पूर्व-रिलीजका लागि प्रस्ताव अपग्रेडहरू" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "अनुप्रयोग नि: शुल्क छ भनेर प्रयोगकर्तालाई सूचित गर्ने केही UI तत्वहरू देखाउनुहोस्" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "स्थापना गरिएका अनुप्रयोगहरूको सूचीमा अनुप्रयोगहरूका लागि स्थापना गरिएको साइज देखाउनुहोस्" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "यूआरआई जसले गैर-मुक्त र स्वामित्व सफ्टवेयर व्याख्या गर्दछ" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an swcatalog folder" +msgstr "अनुप्रयोगप्रवाह फाइलहरूलाई सङ्केत गर्ने यूआरएलहरूको सूची जुन स्वाक्याटलग फोल्डरमा डाउनलोड गरिनेछ" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If false, files are " +"installed in non-standard $XDG_DATA_HOME/swcatalog/xml directory" +msgstr "" +"सबै प्रयोगकर्ताहरूका लागि प्रणाली-व्यापी स्थानमा अनुप्रयोगस्ट्रिम फाइलहरू स्थापना गर्नुहोस्। यदि गलत भएमा, " +"फाइलहरू गैर-मानक $XDG_DATA_HOME/swcatalog/xml डाइरेक्टरीमा स्थापना गरिन्छ" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats listed first. An " +"empty array means the default order. Omitted formats are assumed to be listed last. Example " +"packaging formats are: deb, flatpak, rpm, snap. The formats can be optionally specified with " +"an origin name, divided by a colon, for example 'flatpak:flathub'." +msgstr "" +"पहिले सूचीबद्ध अधिक महत्त्वपूर्ण ढाँचाहरूको साथ, प्राथमिकता दिन प्याकेजिङ ढाँचाहरूको प्राथमिकता क्रम। खाली " +"सरणीको अर्थ पूर्वनिर्धारित क्रम हो । छोडिएका ढाँचाहरू अन्तिममा सूचीबद्ध भएको मानिएको छ । उदाहरण प्याकेजिङ " +"ढाँचाहरू हुन्: डेब, फ्ल्याटप्याक, आरपीएम, स्न्याप। ढाँचाहरू वैकल्पिक रूपमा मूल नामको साथ निर्दिष्ट गर्न सकिन्छ, " +"बृहदान्त्रद्वारा विभाजित, उदाहरणका लागि 'फ्ल्याटपाक: फ्लाथब'।." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "अप्रयुक्त फ्ल्याटप्याक रनटाइम हटाउने अन्तिम प्रयासको टाइमस्टाम्प" + +#: data/org.gnome.software.gschema.xml:143 +msgid "Set to 'true' to show only freely licensed apps and hide any proprietary apps." +msgstr "" +"स्वतन्त्र रूपमा इजाजतपत्र प्राप्त अनुप्रयोगहरू मात्र देखाउन र कुनै पनि स्वामित्व अनुप्रयोगहरू लुकाउन 'सत्य' मा सेट " +"गर्नुहोस्।." + +#: data/org.gnome.software.gschema.xml:147 +msgid "Set to 'true' to show only apps from developers whose identity has been verified." +msgstr "पहिचान प्रमाणित गरिएको विकासकर्ताहरूको अनुप्रयोगहरू मात्र देखाउन 'सत्य' मा सेट गर्नुहोस् ।." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "अन्तिमको टाइमस्टाम्पले ऐतिहासिक अद्यावधिकहरू प्राप्त गर्यो।." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "लगइन गर्न प्रयोग गरिएको जिनोम-अनलाइन-खाता आईडी भण्डारण गर्ने स्ट्रिङ" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "जिनोम सफ्टवेयर AppStream प्रणाली-व्यापी स्थापनाकर्ता" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "आदेश पङ्क्ति तर्क पद वर्णन गर्न असफल भयो" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "तपाईँले ठ्याक्कै एउटा फाइलनाम निर्दिष्ट गर्न आवश्यक छ" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "यो कार्यक्रम मूल प्रयोगकर्ताद्वारा मात्र प्रयोग गर्न सकिन्छ" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "सामग्री प्रकार प्रमाणित गर्न असफल भयो: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "सार्न असफल: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "सफ्टवेयर स्थापना गर्नुहोस्" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "प्रणालीमा चयन गरिएको सफ्टवेयर स्थापना गर्नुहोस्" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "कार्टुन हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "कार्टून हिंसा सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "काल्पनिक हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "काल्पनिक हिंसा सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "यथार्थपरक हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "यथार्थपरक हिंसा सम्बन्धि कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "रक् तपातचित्रण गर्ने हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "रक् तपातचित्रण गर्ने हिंसा सम्बन्धि कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "यौन हिंसा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "यौन हिंसा सम्बन्धि कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "रक्सी" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "रक्सीको सन्दर्भ सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "लागु पदार्थ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "गैरकानुनी लागुऔषधको सन्दर्भ सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "सुर्तीजन्य पदार्थ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "सुर्तीजन्य पदार्थको सन्दर्भ सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "नग्नटा" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "कुनै पनि प्रकारको नग्नता बारे कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "यौन विषयवस्तु" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "यौन प्रकृतिको सन्दर्भ वा चित्रणको बारेमा कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "अपवित्र" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "कुनै प्रकारको अपवित्रता सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "अनुपयुक्त विनोद" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "अनुपयुक्त हास्य सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "भेदभाव" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "कुनै पनि प्रकारको भेदभावपूर्ण भाषाको बारेमा कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "विज्ञापन गर्दै" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "कुनै प्रकारको विज्ञापन सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "जुवातास खेल्नु" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "कुनै पनि प्रकारको जुवा सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "खरिद" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "पैसा खर्च गर्ने क्षमता सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "प्रयोगकर्ताहरू बीचमा कुराकानी" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "अन्य प्रयोगकर्ताहरूसँग च्याट गर्ने तरिकाहरूको बारेमा कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "प्रयोगकर्ताहरू बीच अडियो च्याट" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "अन्य प्रयोगकर्ताहरूसँग कुरा गर्ने तरिकाहरूको बारेमा कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "सम्पर्क विवरण" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "No information regarding sharing of social network usernames or email addresses" +msgstr "सामाजिक सञ्जाल प्रयोगकर्ता नाम वा इमेल ठेगानाहरू साझेदारी गर्ने सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "सूचना पहिचान गर्दै" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "तेस्रो पक्षसँग प्रयोगकर्ता को जानकारी साझेदारी गर्ने सम्बन्धमा कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "स्थान साझेदारी" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "अन्य प्रयोगकर्ताहरूसँग भौतिक स्थान साझेदारी गर्ने सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "समलैङ्गिकता" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "समलैङ्गिकताको सन्दर्भ सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "वेश्यावृत्ति" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "वेश्यावृत्ति सन्दर्भ सम्बन्धि कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "व्यभिचार" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "व्यभिचारको सन्दर्भसम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "यौन चरित्र" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "यौन चरित्र सम्बन्धि कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "अखण्डन गर्नुहोस्" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "अपवित्र सन्दर्भको सम्बन्धी कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "मानव अवशेष" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "दृश्य मृत मानव अवशेष को बारेमा कुनै जानकारी छैन" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "दासत्व" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "दासत्व सन्दर्भ सम्बन्धि कुनै जानकारी छैन" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "लागूपदार्थको सन्दर्भ समावेश गर्दैन" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "Does not include swearing, profanity, and other kinds of strong language" +msgstr "यसमा शपथ ग्रहण, अपवित्रता र अन्य प्रकारका कडा भाषा समावेश छैन" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "विज्ञापन वा मौद्रिक कारोबार समावेश गर्दैन" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "यौन वा नग्नता समावेश छैन" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "अनियंत्रित कुराकानी कार्यक्षमता समावेश गर्दैन" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "हिंसा समावेश छैन" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "लागु पदार्थ" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "कडा भाषा" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "पैसा" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "सामाजिक" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "हिंसा" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "सबै" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s सँग एउटा अज्ञात उमेर रेटिङ छ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s सबैका लागि उपयुक्त छ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s बच्चाका लागि उपयुक्त छ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s साना केटाकेटीका लागि उपयुक्त छ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s बालबालिकाका लागि उपयुक्त छ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s किशोरकिशोरीका लागि उपयुक्त छ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s वयस्कहरूका लागि उपयुक्त छ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s %s का लागि उपयुक्त छ" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "उमेर मूल्याङ्कन" + +#: src/gs-age-rating-context-dialog.ui:61 src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "छुटेको जानकारी कसरी योगदान गर्ने" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "स्थानीय फाइल" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "प्याकेज" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "विचाराधिन" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "स्थापना विचाराधीन" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "विचाराधीन हटाउनुहोस्" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "स्थापना गर्दै" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "हटाउँदैछ" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "डाउनलोड हुँदैछ" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "स्थापना गर्नुहोस्" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "अनुप्रहयोग हटाउनुहोस्…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "सञ्जाल" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "सञ्जालमा सञ्चार गर्न सकिन्छ" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "प्रणाली सेवाहरू" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "प्रणाली बसमा डी-बस सेवाहरू पहुँच गर्न सक्दछ" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "सत्र सेवाहरू" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "सत्र बसमा डी-बस सेवाहरू पहुँच गर्न सक्दछ" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 src/gs-app-details-page.c:65 +#: src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "यन्त्रहरू" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "वेबक्याम जस्ता स्वेच्छाचारी यन्त्रहरू पहुँच गर्न सक्दछ" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "आगत यन्त्रहरू पहुँच गर्न सकिन्छ" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "माइक्रोफोनपहुँच गर्न र अडियो प्ले गर्न सक्दछ" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "प्रणाली यन्त्र फाइलपहुँच गर्न सकिन्छ" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "स्क्रिन सामग्री" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "स्क्रिन सामग्री पहुँच गर्न सकिन्छ" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "गृह फोल्डर" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 src/gs-app-details-page.c:73 +#: src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "फाइलहरू हेर्न, सम्पादन गर्न र सिर्जना गर्न सक्नुहुन्छ" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 src/gs-app-details-page.c:74 +#: src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "फाइल हेर्न सक्नुहुन्छ" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "फाइल प्रणाली" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "डाउनलोड फोल्डर" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "सेटिङ्" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "कुनै पनि सेटिङ हेर्न र परिवर्तन गर्न सकिन्छ" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "पारमपारीक प्रदर्शन प्रणाली" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "पुरानो, असुरक्षित प्रदर्शन प्रणाली प्रयोग गर्दछ" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "स्यान्डबक्स भाग्न" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "स्यान्डबक्सबाट बच्न सक्छ र अन्य कुनै प्रतिबन्धहरू हटाउन सक्छ" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "अद्यावधिक वर्णन उपलब्ध छैन ।." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "अद्यावधिक विवरण" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "थप अनुमति आवश्यक पर्दछ" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "सर्भरबाट प्राप्त अवैध मूल्याङ्कन डेटा" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "रेटिङ सर्भरसँग सञ्चार गर्न सकेन" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "समीक्षा" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "यस अनुप्रयोगका लागि कुनै समीक्षा फेला परेन ।." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "समीक्षा छैन" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "संस्करण इतिहास" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "संस्करण %s मा नयाँ" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "%s संस्करण" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "यो निस्काशनका लागि कुनै विवरण छैन" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "मोड" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "अनुप्रयोगहरु खोज्नुहोस्" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "खोजी गर्नुहोस्" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "अनुप्रयोग (अनुप्रयोगहरु आईडी) विवरण देखाउनुहोस्" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "आईडी" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "अनुप्रयोग (प्याकेज नाम) विवरण देखाउनुहोस्" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "अनुप्रयोग (अनुप्रयोगहरु आईडी) स्थापना गर्नुहोस्" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "स्थानिय प्याकेज खोल्नुहोस्" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "फाइलको नाम" + +#: src/gs-application.c:138 +msgid "The kind of interaction expected for this action: either ‘none’, ‘notify’, or ‘full’" +msgstr "" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "" + +#: src/gs-application.c:143 +msgid "Enable verbose debugging output (from the running instance, if already running)" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "पृष्ठभूमिमा कुनै विचाराधिन अद्यावधिकहरू स्थापना गर्दछ" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "प्राथमिकता देखाउनुहोस्" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "चालु दृष्टान्त अन्त्य गर्नुहोस्" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "संस्करण नम्बर देखाऊ" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "प्रतिलिपि अधिकार © २०१६–२०२३ जिनोम सफ्टवेयर योगदानकर्ताहरू" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "pawan Chitrakar " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "स्थापना आकार" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "डेटाको %s र क्यासको %s समावेश गर्दछ" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "डेटाको %s समावेश गर्दछ" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "क्यासको %s समावेश गर्दछ" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "क्यास र डाटा उपयोग अज्ञात" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "डाउनलोड आकार" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "साइज अज्ञात छ" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "अनुमतिहरू छैन" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "सञ्जाल पहुँच" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "प्रणाली सेवा प्रयोग गर्दछ" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "सत्र सेवा प्रयोग गर्दछ" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "हार्डवेयर यन्त्र पहुँच गर्न सकिन्छ" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "प्रणाली यन्त्रहरू पहुँच गर्न सकिन्छ" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "तपाईँको सबै डेटा पढ्न/लेख्न सक्नुहुन्छ" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "तपाईँको सबै डेटा पढ्न सक्नुहुन्छ" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "तपाईँको डाउनलोड पढ्न/लेख्न सक्नुहुन्छ" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "तपाईँको डाउनलोड पढ्न सक्नुहुन्छ" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "केही निर्दिष्ट फाइलहरू पहुँच गर्न सकिन्छ" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "प्रयोगकर्ता सेटिङ पहुँच गर्न र परिवर्तन गर्न सक्नुहुन्छ" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "पारमपारीक सञ्झ्याल प्रणाली प्रयोग गर्दछ" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "स्वेच्छाचारी अनुमतिहरू प्राप्त गर्न सक्नुहुन्छ" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "अनुप्रयोग विकासकर्ता रूजू गरिएको छ" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "ओएस वितरक द्वारा समीक्षा" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "%s द्वारा पुनरावलोकन गरियो" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "तेस्रो पक्षद्वारा प्रदान गरिएको" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "सफ्टवेयर अब समर्थित छैन" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "लेखा योग्य कोड" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "अज्ञात अनुमतिपत्र" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "स्वामित्व कोड" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "विशेष अनुमतिपत्र" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "विशेषाधिकार" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "सुरक्षित" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "सम्भवतः सुरक्षित" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "सम्भावित असुरक्षित छ" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "असुरक्षित" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "मोबाइल मात्र" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "सानो पर्दामा मात्र काम गर्दछ" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 src/gs-app-context-bar.c:693 +#: src/gs-app-context-bar.c:743 src/gs-app-context-bar.c:748 +#: src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "डेस्कटप मात्र" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "ठूलो पर्दामा मात्र काम गर्दछ" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "पर्दा साइज मिलेन" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "तपाईँको हालको पर्दा साइज समर्थन गर्दैन" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "टचस्क्रिन आवश्यक" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "कुञ्जीपाटी आवश्यक हुन्छ" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "माउस आवश्यक हुन्छ" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "गेमप्याड आवश्यक" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "खेल्नको लागि गेमप्याड आवश्यक हुन्छ" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "अनुकूल गर्नुहोस्" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "फोन, ट्याब्लेट र डेस्कटपमा काम गर्दछ" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "सम्भवत: कुञ्जीपाटी वा माउस आवश्यक पर्दछ" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "डेस्कटप र ल्यापटपमा काम गर्दछ" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "कुनै उमेर-अनुपयुक्त सामग्री समावेश गर्दैन" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "उमेर मूल्याङ्कन जानकारी उपलब्ध छैन" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "वेबसाइट हेर्नुहोस्" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "स्थापना गर्नुहोस्…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "रद्द गर्नुहोस्" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "स्थापना गर्नुहोस्" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "डाउनलोड" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "अद्यावधिक गर्नुहोस्" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "अनुप्रहयोग हटाउनुहोस्…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "अनुप्रहयोग हटाउदै" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "महत्वपूर्ण अद्यावधिक" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "अद्यावधिक गर्दा यन्त्र प्रयोग गर्न सकिँदैन ।." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "स्रोत: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "%s बाट पुन: नामकरण गरियो" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "अद्यावधिक हरू प्राप्त गर्न रोकियो" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "महत्वपूर्ण अद्यावधिक" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "स्थापना भयो" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "मद्दत अनुवाद %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get involved and help " +"translate it yourself." +msgstr "" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "अनुवाद" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "अनुवाद वेबसाइट" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "लगइनलाई आवश्यक टाढा %s (realm %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "लगइन आवश्यक" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 src/gs-dkms-dialog.ui:120 +#: src/gs-page.c:423 src/gs-removal-dialog.ui:24 src/gs-remove-app-dialog.ui:14 +#: src/gs-repos-dialog.c:174 src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 +#: src/gs-review-row.c:235 src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "रद्द गर्नुहोस्" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "लगइन" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "प्रयोगकर्ता" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "पासवर्ड" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "अन्य" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "सबै" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "प्रदर्शित" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "सम्पादकको छनौट" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "नयाँ र अध्यावधिक" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "वेबबाट चयन गर्दछ" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "अन्य सफ्टवेयर" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s स्थापना भयो" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "परिवर्तनहरूले प्रभाव पार्नका लागि पुन: सुरुआत आवश्यक हुन्छ" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "अनुप्रयोग प्रयोग गर्न तयार छ" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "प्रणाली अद्यावधिक स्थापना गरियो" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "हालै स्थापना गरिएका अद्यावधिकहरू पुनरावलोकनका लागि उपलब्ध छन्" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "फेरि सुरु गर्नुहोस्" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "सुरुआत गर्नुहोस्" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "सफ्टवेयर स्थापना गर्नुहुन्छ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "तेस्रो-पक्ष सफ्टवेयर स्थापना गर्नुहुन्छ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "सफ्टवेयर भण्डार सक्षम पार्नुहुन्छ?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "तेस्रो-पक्ष सफ्टवेयर भण्डार सक्षम पार्नुहुन्छ?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and " +"open source software, and is provided by “%s”." +msgstr "" +"%s स्वतन्त्र र खुला स्रोत " +"सफ्टवेयर छैन, र \"%s\" द्वारा उपलब्ध गराइएको छ ।." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s “%s” बाट प्राप्त भयो." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "यो सफ्टवेयर भण्डार स्थापना जारी राख्न सक्षम हुनुपर्दछ ।." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "केही देशहरूमा %s स्थापना वा प्रयोग गर्नु गैरकानुनी हुन सक्दछ ।." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "कुनै-कुनै देशमा यो कोडेक स्थापना गर्नु वा प्रयोग गर्नु गैरकानुनी हुन सक्छ।." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "फेरि चेतावनी नदिनुहोस्" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "सक्षम र स्थापना गर्नुहोस्" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "प्याकेज प्रबन्धकबाट निम्न त्रुटी जानकारीहरू दिइयो:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 src/gs-updates-paused-banner.c:77 +#: src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "विवरण" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "बन्द गर्नुहोस्" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "क्लिपबोर्डमा विवरण प्रतिलिपि गरियो" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "स्विकार गर्नुहोस्" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "एउटा अद्यावधिक स्थापना गरिएको छ" +msgstr[1] "अद्यावधिकहरू स्थापना गरिएको छ" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "एउटा अनुप्रयोग स्थापना रद्द गरिएको छ" +msgstr[1] "अनुप्रयोगहरू स्थापना रद्द गरिएका छन्" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "यसलाई प्रभावकारी बनाउन पुन: सुरुआत आवश्यक हुन्छ" +msgstr[1] "यिनीहरूलाई प्रभावकारी बनाउन पुन: सुरुआत आवश्यक हुन्छ" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "अहिले होईन" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "आज" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "हिजो" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d दिन अघि" +msgstr[1] "%d दिन अघि" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d हप्ता अघि" +msgstr[1] "%d हप्ता अघि" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d महिना अघि" +msgstr[1] "%d महिना अघि" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d वर्ष अघि" +msgstr[1] "%d वर्ष अघि" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "अहिले" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d मिनेट अगाडि" +msgstr[1] "%d मिनेट अगाडि" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d घन्टा अगाडि" +msgstr[1] "%d घन्टा अगाडि" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "सबै" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "प्रदर्शित" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "३डि ग्राफिक्स" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "फोटोग्राफि" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "स्क्यान गर्दै" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "कागजातहरु/भेक्टर ग्राफिक्स" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "दर्शक" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "अडियो सिर्जना र सम्पादन" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "सङ्गीत बजाउने" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "सबै" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "प्रदर्शित" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "क्यालेन्डर" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "डाटाबेस" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "वित्त" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "कागजातहरु/वर्ड प्रोसेसर" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "सम्पादकहरू" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "वेब ब्राउजर" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "सबै" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "प्रदर्शित" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "कार्य" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "साहसिक" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "आर्केड" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "ब्लकहरू" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "बोर्ड" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "तास खेलहरू" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "इमुलेटरहरू" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "बालबालिका" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "बुद्धिबर्दक" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "भुमिका निर्वाह" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "खेलकुद" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "रणनीति" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "सबै" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "प्रदर्शित" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "कुराकानी" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "सबै" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "प्रदर्शित" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "कृत्रिम बुद्धि" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "खगोल शास्त्र" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "रसायन शास्त्र" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "भाषाहरु" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "गणित" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "समाचारहरू" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "रोबोटिक्स" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "कला" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "जीवनी" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "हास्य" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "कथा" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "स्वास्थ्य" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "इतिहास" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "जीवन शैली" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "राजनीति" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "खेलकुद" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "सबै" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "प्रदर्शित" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "कोडेक" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "हार्डवेयर ड्राइभरहरु" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "फन्ट" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "आगत स्रोतहरू" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "भाषा प्याक" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "स्थानियकरण" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "सिर्जना गर्नुहोस्" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "काम" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "खेल खेल्नुहोस्" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "सामाजिकीकरण गर्नुहोस्" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "सिक्नुहोस्" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "विकास" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "कोडेक" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "हार्डवेयर ड्राइभरहरु" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "फन्टहरू" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "आगत स्रोतहरू" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "भाषा प्याक" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "स्थानियकरण" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "अनुप्रयोग" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s ले थप फाइल ढाँचा समर्थन अनुरोध गर्दैछ ।." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "थप माइम प्रकार आवश्यक" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s ले अतिरिक्त फन्ट अनुरोध गर्दैछ ।." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "थप फन्ट आवश्यक" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s ले थप मल्टिमिडिया सङ्केतक अनुरोध गर्दैछ ।." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "अतिरिक्त मल्टिमिडिया कोडेकहरू आवश्यक" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s ले थप मुद्रक ड्राइभर अनुरोध गर्दैछ ।." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "थप मुद्रक ड्राइभर आवश्यक" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s ले थप प्याकेजअनुरोध गर्दैछ ।." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "थप प्याकेजहरू आवश्यक" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "सफ्टवेयरमा खोज्नुहोस्" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "अरू देखाउनुहोस्" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "थोरै देखाउनुहोस्" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "हटाउँदैछ…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "स्थापना समाप्त गर्न पुन: सुरुआत आवश्यक हुन्छ" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "हटाउन समाप्त गर्न पुन: सुरुआत आवश्यक हुन्छ" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "विचाराधिन स्थापना …" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "विचाराधिन अद्यावधिक…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "डाउनलोड हुँदैछ…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "तयारी गर्दैछ…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "अनुप्रहयोग हटाउदै…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "" + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "फेरि सुरु गर्नुहोस्" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "सक्षम…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_स्थापना गर्नुहोस्…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "मद्दत अनुवाद" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "अन्य अनुप्रयोगहरू %s द्वारा" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" + +#: src/gs-details-page.c:1931 +msgid "This app is already provided by your distribution and should not be replaced." +msgstr "" + +#: src/gs-details-page.c:1932 +msgid "This app doesn’t provide any links to a website, code repository or issue tracker." +msgstr "" + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" + +#: src/gs-details-page.c:1935 +msgid "This software is already provided by your distribution and should not be replaced." +msgstr "" + +#: src/gs-details-page.c:1936 +msgid "This software doesn’t provide any links to a website, code repository or issue tracker." +msgstr "" + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the details for this " +"app." +msgstr "" + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "विवरण पृ्ष्ठ" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "रूजु गर्नुहोस्" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "खोल्नुहोस्" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "अद्यावधिक (_U)" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "अनुप्रहयोग हटाउनुहोस्" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "एड-इनहरू" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "सफ्टवेयर भण्डार समावेश गरियो" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as access to other " +"software." +msgstr "" + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "सफ्टवेयर भण्डार समावेश गरिएको छैन" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with new versions." +msgstr "" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "सफ्टवेयर भण्डार पहिचान गरियो" + +#: src/gs-details-page.ui:746 +msgid "Adding this software repository will give you access to additional software and upgrades." +msgstr "" + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "" + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "अनुप्रयोग डेटा खाली गर्नुहोस्" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "डेटा मेट्नुहोस्" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "मेटाडेटा छैन" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "वेबसाइट परियोजना" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "दान गर्नुहोस्" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "अनुवाद योगदान गर्नुहोस्" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "एउटा मुद्दा रिपोर्ट गर्नुहोस्" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_सहयोग" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "सम्पर्क" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "समीक्षा लेख्नुहोस्" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "सबै समीक्षा" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "अज्ञात त्रुटी" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_पछिल्लो" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a new machine owner " +"key (MOK) must be enrolled. The process requires a password to be entered later in the " +"process. Please note down the following password associated with the key:" +msgstr "" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, proceed through the " +"setup steps:" +msgstr "" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the module or any other " +"module will be implicitly trusted. All future updates will happen transparently with no " +"interaction and or authorization." +msgstr "" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " र " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s स्क्रिप्टका लागि उपलब्ध फन्टहरू" +msgstr[1] "%s स्क्रिप्टहरूका लागि उपलब्ध फन्टहरू" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s का लागि उपलब्ध सफ्टवेयर" +msgstr[1] "%s का लागि उपलब्ध सफ्टवेयर" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "अनुरोध सफ्टवेयर भेटिएन" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "अनुरोध गरिएको सफ्टवेयर फेला पार्न असफल" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s फेला परेन" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "वेबसाइटमा" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "Information about %s, as well as options for how to get missing apps might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s उपलब्ध छैन।." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can support this format " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s स्क्रिप्ट समर्थनका लागि कुनै फन्ट उपलब्ध छैन ।." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s ढाँचाका लागि कुनै एडन कोडेक उपलब्ध छैन ।." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can play this format " +"might be found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma resources might be " +"found %s." +msgstr "" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s मुद्रणयन्त्र ड्राइभर उपलब्ध छैन ." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that supports this printer " +"might be found %s." +msgstr "" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "मिसिलिकरण" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "Unable to find the %s you were searching for. Please see %s for more information." +msgid_plural "Unable to find the %s you were searching for. Please see %s for more information." +msgstr[0] "" +msgstr[1] "" + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "कुनै पनि खोजी परिणाम फेला पार्न असफल भयो: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s ढाँचाको फाइल" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "अनुरोध सफ्टवेयर भेटिएन" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "कोडेक पृष्ठ" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "नतिजा भेटिएन" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "खोजी कार्यसम्पादन गर्न अक्षम" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "अघिल्लो" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "पछिल्लो" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "फिचर गरिएको अनुप्रयोग सूची" + +#: src/gs-hardware-support-context-dialog.c:589 src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "डेस्कटप समर्थन" + +#: src/gs-hardware-support-context-dialog.c:590 src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "ठूलो पर्दामा प्रयोग गरिएको समर्थन" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "अज्ञात डेस्कटप समर्थन" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "ठूलो पर्दा आवश्यक हुन्छ" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "डेस्कटप समर्थित छैन" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "ठूलो पर्दामा प्रयोग गर्न सकिँदैन" + +#: src/gs-hardware-support-context-dialog.c:609 src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "मोबाइल समर्थन" + +#: src/gs-hardware-support-context-dialog.c:610 src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "सानो पर्दामा प्रयोग गरिएको समर्थन" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "अज्ञात मोबाइल समर्थन" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "सानो पर्दा आवश्यक पर्दछ" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "मोबाइल समर्थन गरिएन" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "सानो पर्दामा प्रयोग गर्न सकिँदैन" + +#: src/gs-hardware-support-context-dialog.c:645 src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "कुञ्जीपाटी समर्थन" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "अज्ञात कुञ्जीपाटी समर्थन" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "कुञ्जीपाटी आवश्यक" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "कुञ्जीपाटी समर्थन गर्दछ" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "कुञ्जीपाटी समर्थित छैन" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "कुञ्जीपाटीसँग प्रयोग गर्न सकिदैन" + +#: src/gs-hardware-support-context-dialog.c:665 src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "माउस समर्थन" + +#: src/gs-hardware-support-context-dialog.c:666 src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "माउस वा इङ्गित गर्ने यन्त्र आवश्यक पर्दछ" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "अज्ञात माउस समर्थन" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "Not enough information to know if mice or pointing devices are supported" +msgstr "मउस वा सूचक यन्त्र समर्थित छन् या छैनन् जान्नका लागि पर्याप्त सूचना छैन" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "माउस आवश्यक" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "मउस र सूचक यन्त्र समर्थन गर्दछ" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "माउस समर्थित छैन" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "माउस वा सूचक यन्त्रसँग प्रयोग गर्न सकिँदैन" + +#: src/gs-hardware-support-context-dialog.c:685 src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "टचस्क्रिन समर्थन" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "अज्ञात टचस्क्रिन समर्थन" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "टचस्क्रिन समर्थन गरिएको छ कि छैन जान्नका लागि पर्याप्त सूचना छैन" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "टचस्क्रिन आवश्यक" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "टचस्क्रिन समर्थन गर्दछ" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "टचस्क्रिन समर्थित छैन" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "टचस्क्रिनसँग प्रयोग गर्न सकिँदैन" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "गेमप्याड आवश्यक" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "गेमप्याड आवश्यक हुन्छ" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "गेमप्याड समर्थन" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "गेमप्याड समर्थन गर्दछ" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s ले सम्भवत यो यन्त्रमा काम गर्दछ" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "सञ्जाल यन्त्र:\t%s" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s ले यो यन्त्रमा काम गर्ने छैन" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "हार्डवेयर समर्थन" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "नेभिगेशन" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "सञ्झ्यालहरू" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "प्राथमिकताहरू खोल्नुहोस्" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "सहयोग" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "स्थापना भयो" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "स्थापित पृष्ठ" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "प्रगतिमा" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "अनुप्रयोगहरू" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "वेब अनुप्रयोगहरू" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "सामुदायिक निर्माण" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "सहभागी हुनुहोस्" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released under the %s " +"license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released under the " +"%s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released under the " +"%s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "अरु जान्नुहोस्" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be proprietary. It may " +"be insecure in ways that are hard to detect, and it may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may be proprietary. It " +"may be insecure in ways that are hard to detect, and it may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "स्वामित्व भएको" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it works. It may be " +"insecure in ways that are hard to detect, and it may change without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how it works. It may " +"be insecure in ways that are hard to detect, and it may change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "पृष्ठ लोड" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "सुरु गर्दै" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "अज्ञात स्रोत" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "बिटा" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "प्रयोगकर्ता" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "थप गर्नुहोस्" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "हटाउनेहरू" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "अद्यावधिक गर्नुहोस्" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "अवनति गर्नुहोस्" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "चयन गरिएका बाह्य स्रोतहरू" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "तेस्रो पक्ष सफ्टवेयर भण्डार सक्षम पार्नुहुन्छ?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "वेवास्ता गर्नुहोस" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "सक्षम" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "“%s” का लागि उपलब्ध छ" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "अन्वेषण" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "अधिलेखन पृष्ठ" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "अन्य कोटिहरू" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "अज्ञात" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "ठिक छ" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "प्रयोगकर्ताले स्थापना अस्वीकार गरे" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s तयार गर्नुहोस्" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the repository to use " +"them again." +msgstr "" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 src/gs-page.c:623 +#: src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "\"%s\" स्थापनाबाट हटाउनु?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "It will not be possible to use any apps which depend on %s after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use it will appear in " +"a different font." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media files will no longer " +"be playable." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "Hardware which depends on %s may no longer function correctly after removal." +msgstr "" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will be kept on disk, " +"to allow restoring the app in the future." +msgstr "" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "प्राथमिकताहरू" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "सफ्टवेयर अद्यावधिकहरू" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "थप जानकारी" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update features are " +"therefore paused when on metered network connections and when power saver is on." +msgstr "" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "स्वचालित" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "म्यानुअल" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "स्वचालित अद्यावधिक सुचनाहरू" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "सामग्री फिल्टर" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically removed during upgrade." +msgstr "" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "नमिल्दो सफ्टवेयर" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "स्तरोन्नति" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "अनुप्रहयोग हटाउनुहोस्" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "राख्नुहोस्" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "मेट्नुहोस्" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "Software that has been installed from “%s” will cease to receive updates." +msgstr "" + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "भण्डारण असक्षम पार्नुहोस्?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "भण्डारण हटाउनुहोस्?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "असक्षम पार्नुहोस्" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_हटाउनुहोस्" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "नया भण्डार सक्षम" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "थप जानकारी" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "" + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "फेडोरा तेस्रो पक्षका भण्डारहरू" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "सञ्चालन प्रणाली" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "सफ्टवेर भण्डार" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "भण्डारणहरू छैन" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u एड-इन स्थापना गरिएको छ" +msgstr[1] "%u एड-इनहरू स्थापना गरिएका छन्" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u एड-इन" +msgstr[1] "%u एड-इनहरू स्थापना गरिएका छन्" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s र%s स्थापना भयो" +msgstr[1] "%s र%s स्थापना भयो" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "हटाउने" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "मन नपर्ने" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "मन नपरेको" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "ठिकै छ" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "मन परेको" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "मन पर्यो" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "कृपया एउटा तारा दर रोज्नुहोस्" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "सारंश अति छोटो छ" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "सारंश अति लामो छ" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "वर्णन अति छोटो छ" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "वर्णन अति लामो छ" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "समिक्षा लेख्नुहोस्" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "पठाउनुहोस्" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used to report " +"problems: instead, contact the developer or your support provider." +msgstr "" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. " +"The full name attached to your account will be shown publicly." +msgstr "" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "जम्मा %u समीक्षा" +msgstr[1] "जम्मा %u समीक्षाहरू" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "अज्ञात" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "Once reported, a review will be hidden until it has been checked by an administrator." +msgstr "" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "प्रतिवेदन पुनरावलोकन गर्नुहुन्छ?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "प्रतिवेदन" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "प्रतिवेदन…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "हटाउनुहोस्…" + +#: src/gs-safety-context-dialog.c:154 +msgid "App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "अनुमतिहरू छैन" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "अनुप्रयोग पूर्ण रूपमा स्यान्डबक्स गरिएको छ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "सञ्जाल पहुँच" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "इन्टरनेट पहुँच गर्न सक्नुहुन्छ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "सञ्जाल पहुँच छैन" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "इन्टरनेट पहुँच गर्न सकिँदैन" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "प्रणाली सेवा प्रयोग गर्दछ" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "सत्र सेवा प्रयोग गर्दछ" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "पारमपारीक सञ्झ्याल प्रणाली" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "स्वेच्छाचारी अनुमतिहरू" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "प्रयोगकर्ता सेटिङ्ग" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "पूरा फाइल प्रणाली पढ्ने पहुँच" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "गृह फोल्डर पढ्ने पहुँच" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "डाउनलोड फोल्डर पढ्न/लेख्न पहुँच" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "डाउनलोड फोल्डर पढ्ने पहुँच" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "डाइरेक्टरीमा सबै डेटा पढ्न सकिन्छ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "फाइल प्रणाली पहुँच छैन" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "फाइल प्रणालीमा पहुँच प्राप्त गर्न सकिँदैन" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "अनुप्रयोग विकासकर्ता रूजू गरिएको छ" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "असुरक्षित निर्भरताहरू" + +#: src/gs-safety-context-dialog.c:398 +msgid "Software or its dependencies are no longer supported and may be insecure" +msgstr "" + +#: src/gs-safety-context-dialog.c:411 +msgid "This app does not specify what license it is developed under, and may be proprietary" +msgstr "" + +#: src/gs-safety-context-dialog.c:412 +msgid "This software does not specify what license it is developed under, and may be proprietary" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "स्वामित्व कोड" + +#: src/gs-safety-context-dialog.c:426 +msgid "The source code is not public, so it cannot be independently audited and might be unsafe" +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "लेखा योग्य कोड" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the app more likely to " +"be safe" +msgstr "" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s सुरक्षित छ" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s सम्भावित असुरक्षित छ" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s असुरक्षित छ" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "अज्ञात" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "सुरक्षा" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "इजाजतपत्र" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "स्रोत" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might contain bugs or " +"security vulnerabilities which will not be fixed." +msgstr "" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "अघिल्लो स्क्रिनसट" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "पछिल्लो स्क्रिनसट" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "स्क्रिनसट छैन" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "स्क्रिनसट फेला परेन" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "छवि लोड गर्न असफल" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "स्क्रिनसट साईज फेला परेन" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "क्यास बनाउन सकिएन" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "स्क्रिनसट अवैध छ" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "स्क्रिनसट उपलब्ध छैन" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "स्क्रिनसट" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u धेरै समनता" +msgstr[1] "%u धेरै समनता" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "पानामा खोज्नुहोस्" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "अनुप्रयोगका लागि खोजी गर्नुहोस्" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "अनुप्रयोग फेला परेन" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "अद्यावधिकहरू डाउनलोड गर्न असक्षम भयो" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "फर्मवेयर अपडेटहरू डाउनलोड गर्न सकिएन" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "%s बाट फर्मवेयर अद्यावधिकहरू डाउनलोड गर्न असक्षम" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "%s बाट अद्यावधिकहरू डाउनलोड गर्न असक्षम भयो" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "अद्यावधिक गर्न अक्षम: इन्टरनेट पहुँच आवश्यक" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "अद्यावधिक गर्न अक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "%s बाट अद्यावधिकहरू डाउनलोड गर्न अक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "अद्यावधिक गर्न अक्षम: प्रमाणीकरण आवश्यक" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "अद्यावधिक गर्न अक्षम: अवैध प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "अद्यावधिक गर्न अक्षम: अनुमति आवश्यक" + +#: src/gs-shell.c:1256 +msgid "Unable to download updates: you do not have permission to install software" +msgstr "अद्यावधिकहरू डाउनलोड गर्न अक्षम: तपाईँसँग सफ्टवेयर स्थापना गर्ने अनुमति छैन" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "अद्यावधिकहरू सुची पाउन असक्षम भयो" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "स्थापना गर्न अक्षम: डाउनलोड असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s स्थापना गर्न अक्षम: %s बाट डाउनलोड असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s स्थापना गर्न अक्षम: डाउनलोड असफल भयो" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "स्थापना गर्न अक्षम: रनटाइम हराइरहेको छ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s स्थापना गर्न अक्षम: रनटाइम %s उपलब्ध छैन" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "%s स्थापना असक्षम" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "स्थापना गर्न अक्षम: इन्टरनेट पहुँच आवश्यक" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "स्थापना गर्न अक्षम: अवैध अनुप्रयोग ढाँचा" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "स्थापना गर्न अक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s स्थापना गर्न असक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "स्थापना गर्न अक्षम: प्रमाणीकरण आवश्यक" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s स्थापना गर्न अक्षम: प्रमाणीकरण आवश्यक छ" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "स्थापना गर्न अक्षम: अवैध प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s स्थापना गर्न अक्षम: अवैध प्रमाणीकरण" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "स्थापना गर्न अक्षम: अनुमति आवश्यक" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s स्थापना गर्न अक्षम: अनुमति आवश्यक छ" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "स्थापना गर्न अक्षम: यन्त्र जडान हुनुपर्दछ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s स्थापना गर्न अक्षम: यन्त्र जडान हुनुपर्दछ" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "स्थापना गर्न अक्षम: कम ब्याट्री" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s स्थापना गर्न अक्षम: कम ब्याट्री" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%s बाट %s अद्यावधिक गर्न अक्षम: डाउनलोड असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s अद्यावधिक गर्न अक्षम: डाउनलोड असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "%s बाट अद्यावधिकहरू स्थापना गर्न अक्षम: डाउनलोड असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "अद्यावधिक गर्न अक्षम: डाउनलोड असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s अद्यावधिक गर्न असक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s अद्यावधिक गर्न अक्षम: प्रमाणीकरण आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s अद्यावधिक गर्न अक्षम: अवैध प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s अद्यावधिक गर्न अक्षम: अनुमति आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "अद्यावधिक गर्न अक्षम: यन्त्र जडान हुनुपर्दछ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s अद्यावधिक गर्न अक्षम: यन्त्र जडान हुनुपर्दछ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "अद्यावधिक गर्न अक्षम: कम ब्याट्री" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s अद्यावधिक गर्न अक्षम: कम ब्याट्री" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "%s अद्यावधिक गर्न असक्षम भयो" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "अद्यावधिक गर्न असक्षम भयो" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "स्तरोन्नति गर्न सकिएन" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%s बाट %s मा स्तरवृद्धि गर्न असक्षम" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "अपग्रेड गर्न अक्षम: डाउनलोड असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "%s मा अपग्रेड गर्न अक्षम: डाउनलोड असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "अपग्रेड गर्न अक्षम: इन्टरनेट पहुँच आवश्यक" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "%s मा अपग्रेड गर्न अक्षम: इन्टरनेट पहुँच आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "अद्यावधिक गर्न अक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "%s मा स्तरवृद्धि गर्न असक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "अपग्रेड गर्न अक्षम: प्रमाणीकरण आवश्यक" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "%s मा अपग्रेड गर्न अक्षम: प्रमाणीकरण आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "अपग्रेड गर्न अक्षम: अवैध प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "%s मा अपग्रेड गर्न अक्षम: अवैध प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "अपग्रेड गर्न अक्षम: अनुमति आवश्यक" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "%s मा अपग्रेड गर्न अक्षम: अनुमति आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "अपग्रेड गर्न अक्षम: यन्त्र जडान हुनुपर्दछ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "%s मा अपग्रेड गर्न अक्षम: यन्त्र जडान गर्नु पर्दछ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "अपग्रेड गर्न अक्षम: कम ब्याट्री" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "%s मा अपग्रेड गर्न अक्षम: कम ब्याट्री" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "%s मा स्तरवृद्धि गर्न असक्षम" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "स्थापना रद्द गर्न अक्षम: प्रमाणीकरण आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s स्थापना रद्द गर्न अक्षम: प्रमाणीकरण आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "स्थापना रद्द गर्न अक्षम: अवैध प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s स्थापना रद्द गर्न अक्षम: अवैध प्रमाणीकरण" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "स्थापना रद्द गर्न अक्षम: अनुमति आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s स्थापना रद्द गर्न अक्षम: अनुमति आवश्यक छ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "स्थापना रद्द गर्न अक्षम: यन्त्र जडान हुनुपर्दछ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s स्थापना रद्द गर्न अक्षम: यन्त्र जडान हुनुपर्दछ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "स्थापना रद्द गर्न अक्षम: कम ब्याट्री" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s स्थापना रद्द गर्न अक्षम: कम ब्याट्री" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s स्थापना रद्द गर्न अक्षम" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "%s सुरु गर्न असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 src/gs-shell.c:1880 +#: src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "ओहो, केही गलत भयो" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s सुरुआत गर्न असक्षम: %s स्थापना भएको छैन" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "सञ्चालनका लागि पर्याप्त डिस्क स्थान छैन" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "स्थापना गर्न अक्षम: फाइल प्रकार समर्थित छैन" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "स्थापना गर्न अक्षम: प्रमाणीकरण असफल भयो" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "स्थापना गर्न असमर्थ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "%s सँग सम्पर्क गर्न अक्षम" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "नयाँ प्लगइन प्रयोग गर्न सफ्टवेयर पुन: सुरु गर्नुहोस्" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "यन्त्र जडान गर्न आवश्यक छ" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "ब्याट्री स्तर धेरै न्यून छ" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "सफ्टवेर भण्डार" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_प्राथमिकताहरू" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "कुञ्जीपाटी सटकर्ट" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "सफ्टवेयर बारेमा" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "_खोज" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "मुख्य मेनु" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "अनुप्रयोग खोजी गर्नुहोस्" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "अन्वेषण" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "स्थापित भयो" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "अद्यावधिक गर्नुहोस्" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "पछाडी जानुहोस्" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "None" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "एप डेटा" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "फ्प्रयोगकर्ता डाटा" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "क्यास डाटा" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "अस्थायी क्यास गरिएको डेटा" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "आवश्यक निर्भरताहरू" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "अज्ञात" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "भण्डारण" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s स्थापना भयो" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s स्थापना गरिदैछ" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (हटाउँदैछ)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "विस्तृत" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "परिक्षण" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "%s मा स्थापना गरियो" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "अद्यावधिक स्थापना गरियो" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "अद्यावधिक स्थापना गरिएका छन्" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "सफ्टवेयर अद्यावधिकहरू म्याद समाप्त भएका छन्" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "सफ्टवेयर अद्यावधिकहरू स्थापना गर्न तयार" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "सफ्टवेयर अद्यावधिकहरू डाउनलोड गर्न उपलब्ध छ" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s अद्यावधिक गरिएको छ ।." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s र %s अद्यावधिक गरिएको छ ।." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s, %s र %s समावेश गर्दछ ।." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "सफ्टवेयर अपडेटहरू उपलब्ध छन्" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "सफ्टवेयर अद्यावधिकहरू असफल भयो" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "अरू धेरै विवरण देखाउनुहोस्" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "प्रणाली स्तरवृद्धि पुरा भयो" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "%s %s स्वागतम!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "सफ्टवेयर अद्यावधिक स्थापना गरिएको छ" +msgstr[1] "सफ्टवेयर अद्यावधिक स्थापना गरिएका छन्" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "एउटा महत्वपूर्ण सञ्चालन प्रणाली अद्यावधिक स्थापना गरिएको छ ।." +msgstr[1] "एउटा महत्वपूर्ण सञ्चालन प्रणाली अद्यावधिकहरू स्थापना गरिएको छ ।." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "पुनरावलोकन गर्नुहोस्" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "अद्यावधिक गर्न असफल भयो" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "प्रणाली पहिले नै अद्यावधिक गरिएको थियो ।." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "अद्यावधिक रद्द गरियो।." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you have internet " +"access and try again." +msgstr "" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software provider for more " +"details." +msgstr "" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "There wasn’t enough disk space. Please free up some space and try again." +msgstr "" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update and try again. If " +"the problem persists, contact your software provider." +msgstr "" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "अन्तिम जाँच : %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "रोक्नुहोस्" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "अपडेट जाँच गर्नुहोस्" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "शुल्क लागु हुन सक्छ" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "Checking for updates while using mobile broadband could cause you to incur charges." +msgstr "" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "जसरी पनि जाँच्नुहोस्" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "अपडेट जाँच गर्नुहोस्" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "अद्यावधिक गर्नुहोस्" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "अद्यावधिक पृष्ठ" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "अद्यावधिक हरू लोड गरिँदैछ" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "यसो गर्न केही समय लाग्न सक्छ" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "प्रणाली पहिले नै अद्यावधिक छ" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "मोबाइल डेटा प्रयोग गर्नुहुन्छ?" + +#: src/gs-updates-page.ui:180 +msgid "Checking for updates when using mobile broadband could cause you to incur charges" +msgstr "" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "जसरी पनि जाँच्नुहोस्" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "जडान छैन" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "अद्यावधिकहरू जाँच गर्न अनलाइन जानुहोस्" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "सञ्जाल सेटिङ" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "त्रुटी" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "अद्यावधिकहरू स्वचालित रूपले व्यवस्थापन हुन्छन्" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:47 +msgid "Automatic software updates have been paused for the following reasons:\n" +msgstr "" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "अद्यावधिक पुन: सुरु गर्नुहोस्…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "सबै स्तरबृध्दि गर्नुहोस्" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "सफ्टवेयर अद्यावधिक डाउनलोड गरियो" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "विस्तार अद्यावधिकहरू स्थापना गर्न तयार छन्" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "एकीकृत फर्मवेयर" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "फेरि सुरू गर्न आवश्यक" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "अनुप्रयोग अद्यावधिक" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "उपकरण फर्मवेयर" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "डाउनलोड" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s उपलब्ध छ" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s उपलब्ध छ" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "नयाँ संस्करणका बारेमा सिक्नुहोस्" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s को %s डाउनलोड गरियो" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% डाउनलोड भयो" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "एक प्रमुख अपग्रेड, नयाँ सुविधाहरू र थपिएको पोलिशको साथ।." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "अपग्रेड रद्द गर्नुहोस्" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "पुन: सुरु गर्नुहोस् र स्तरोन्नति गर्नुहोस्…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "अपग्रेड गर्नु अघि डेटा र फाइलहरू ब्याकअप गर्न नबिर्सनुहोस्।." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "त्रुटि विवरण" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "विवरण प्रतिलिपि बनाउनुहोस्" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "\"%s\" फाइल मेट्न असफल भयो: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "डाइरेक्टरी \"%s\" मेट्न असफल भयो: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "यो कम्प्युटरमा सफ्टवेयर थप्नुहोस्, हटाउनुहोस् वा अद्यावधिक गर्नुहोस्" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "" +"अपडेटहरू; अपग्रेड; स्रोतहरू; रिपोजिटरीज़; प्राथमिकताहरू; स्थापना गर्नुहोस्; स्थापना रद्द; कार्यक्रम; सफ्टवेयर; " +"अनुप्रयोग; स्टोर;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s तयार छ" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "सक्षम पार्नुहोस्" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "प्रणाली अद्यावधिक" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "General system updates, such as security or bug fixes, and performance improvements." +msgstr "" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "वेब अनुप्रयोग" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "Upgrade for the latest features, performance and stability improvements." +msgstr "" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "फ्ल्याटपाक समर्थन" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "गृह उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "होस्ट प्रणाली फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "डेस्कटप फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "डेस्कटप उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "कागजात फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "कागजात उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "सङ्गीत फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "सङ्गीत उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "तस्विर फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "चित्र सबफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "सार्वजनिक शेयर फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "सार्वजनिक शेयर उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "भिडियो फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "टेम्प्लेट फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "टेम्प्लेट उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "प्रयोगकर्ता क्यास फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "प्रयोगकर्ता कन्फिगरेसन फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "प्रयोगकर्ता कन्फिगरेसन उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "प्रयोगकर्ता डाटा फोल्डर" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "फ्प्रयोगकर्ता डाटा उपफोल्डर %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "एडअन '%s' परिष्कृत गर्न असफल: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "प्रयोगकर्ता स्थापना" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "सञ्चालन प्रणाली स्थापना" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "एप ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "'%s' एडअनका लागि स्थापना गर्न असफल: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. Remove the filter and " +"repeat the install. Detailed error: %s" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "अद्यावधिक गर्न प्रणाली शक्ति धेरै कम छ" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "अद्यावधिक गर्न प्रणाली शक्ति धेरै कम छ (%u%%, आवश्यक %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "यन्त्र पहुँच योग्य छैन, वा वायरलेस दायरा भन्दा बाहिर छ" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "यन्त्रको ब्याट्री पावर धेरै कम छ" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "यन्त्र ब्याट्री पावर धेरै कम छ (%u%%, आवश्यक %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "यन्त्रले अद्यावधिक लागू गर्न प्रतिक्षा गरिरहेको छ" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "यन्त्रलाई जडान गर्न एसी पावर आवश्यक पर्दछ" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "ढक्कन बन्द हुँदा यन्त्र प्रयोग गर्न सकिँदैन" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s यन्त्र अद्यावधिक" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s प्रणाली अद्यावधिक" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s सम्मिलित नियन्त्रक अद्यावधिक" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME अद्यावधिक" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s उपभोक्ता ME अद्यावधिक" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s उपभोक्ता ME अद्यावधिक" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s नियन्त्रक अद्यावधिक" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s थन्डरबोल्ट नियन्त्रक अद्यावधिक" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s सीपीयू माइक्रोकोड अद्यावधिक" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s कन्फिगरेसन अद्यावधिक" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s ब्याट्री अद्यावधिक" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s क्यामेरा अद्यावधिक" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM अद्यावधिक" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s टचप्याड अद्यावधिक" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s माउस अद्यावधिक" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s कुञ्जीपाटी अद्यावधिक" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s भण्डारण नियन्त्रक अद्यावधिक" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s सञ्जाल इन्टरफेस अद्यावधिक" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s प्रदर्शन अद्यावधिक" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC अद्यावधिक" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB प्राप्तकर्ता अद्यावधिक" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s ड्राइभ अद्यावधिक" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s फ्ल्यास ड्राइभ अद्यावधिक" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD अपडेट" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s जीपीयू अद्यावधिक" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s डक अद्यावधिक" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB डक अद्यावधिक" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "फर्मवेयर" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "फर्मवेयर अद्यावधिक लागू गर्न सकिएन: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "फर्मवेयर स्तरोन्नति समर्थन" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "फर्मवेयर उन्नयनका लागि समर्थन प्रदान गर्दछ" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "हस्ताक्षर नगरिएको सफ्टवेयर स्थापना गर्नुहुन्छ?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to verify the origin " +"of updates to this software, or whether updates have been tampered with." +msgstr "" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "अहस्ताक्षरित सफ्टवेयर डाउनलोड गर्नुहुन्छ?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to verify the origin " +"of the update, or whether it has been tampered with." +msgstr "" +"अहस्ताक्षरित अद्यावधिकहरू उपलब्ध छन् । हस्ताक्षर बिना, यो अद्यावधिकको उत्पत्ति पुष्टि गर्न सम्भव छैन, वा यो सँग " +"छेडछाड गरिएको छ कि छैन।." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "हस्ताक्षर नगरिएको सफ्टवेयर अद्यावधिक गर्नुहुन्छ?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to verify the origin " +"of the update, or whether it has been tampered with. Software updates will be disabled until " +"unsigned updates are either removed or updated." +msgstr "" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "अद्यावधिकहरू स्थापना गर्न असफल: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "प्याकेजहरू" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "डाउनलोड गर्नु अघि लेनदेन अन्त्यमा प्रतिक्षा गर्न असफल: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "अद्यावधिकहरू डाउनलोड गर्न असफल: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "अद्यावधिक ट्रिगर गर्न असफल: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "सञ्चालन प्रणाली (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "स्न्याप स्टोर" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "स्न्याप स्टोर समर्थन गर्नुहोस्" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "स्न्याप एक सार्वभौमिक लिनक्स प्याकेज हो" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "प्रणाली" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "प्रणाली अवयव" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "अन्तिम टाइमस्टाम्प जब प्रणाली अनलाइन थियो र कुनै पनि अद्यावधिक प्राप्त भयो" + +#, fuzzy +#~ msgid "Show verbose debugging information" +#~ msgstr "डिबग विकल्पहरू देखाउनुहोस्" + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "कृपया १ देखि %u सम्म कुनै सङ्ख्या प्रविष्ट गर्नुहोस्:" + +#~ msgid "Choose an application:" +#~ msgstr "अनुप्रयोग छान्नुहोस्:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s अहिले स्थापना भएको छ" + +#~ msgid "An application has been removed" +#~ msgid_plural "Applications have been removed" +#~ msgstr[0] "एउटा अनुप्रयोग हटाइएको छ" +#~ msgstr[1] "अनुप्रयोगहरू हटाइएको छ" + +#~ msgid "An application" +#~ msgstr "अनुप्रयोग" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "फेला पार्न असक्षम: \"%s\"" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "चयन गरिएका एड-अनहरू अनुप्रयोगमा स्थापना गरिनेछ ।" + +#~ msgid "Applications" +#~ msgstr "अनुप्रयोग" + +#~ msgid "Web Applications" +#~ msgstr "वेब अनुप्रयोग" + +#, fuzzy +#~ msgid "Downloading software catalog" +#~ msgstr "सफ्टवेयर विवरणिका डाउनलोड भइरहेको छ" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "स्वचालित अद्यावधिक पज गरियो" + +#~ msgid "Open Network _Settings" +#~ msgstr "सञ्जाल सेटिङ्ग खोल्नुहोस्" + +#~ msgid "Moderate page" +#~ msgstr "मध्यम पृष्ठ" + +#, fuzzy +#~ msgid "There are no reviews to moderate" +#~ msgstr "समीक्षा" + +#, fuzzy, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "तपाईँ साँच्चिकै '%s' उपकरण मेट्न चाहनुहुन्छ ?" + +#~ msgid "_Continue" +#~ msgstr "जारी राख्नुहोस्" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u अनुप्रयोग" +#~ msgstr[1] "%u अनुप्रयोगहरू" + +#~ msgid "Post Review" +#~ msgstr "समिक्षा पोस्ट गर्नुहोस्" + +#~ msgid "_Post" +#~ msgstr "पोस्ट" + +#~ msgid "Rating" +#~ msgstr "दर निर्धारण गर्दै" + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "पुनरावलोकन गर्नुहोस्" + +#, fuzzy +#~ msgid "Was this review useful to you?" +#~ msgstr "पुनरावलोकन गर्नुहोस्" + +#~ msgid "Yes" +#~ msgstr "ठिक छ" + +#~ msgid "No" +#~ msgstr "कुनै पनि होइन" + +#~ msgid "Outdated SDK version" +#~ msgstr "म्याद समाप्त भएको SDK संस्करण" + +#~ msgid "No screenshot provided" +#~ msgstr "स्क्रिनसट प्रदान गरिएको छैन" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "अद्यावधिक हरू डाउनलोड गर्न असक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "अद्यावधिक डाउनलोड गर्न असक्षम: प्रमाणीकरण आवश्यक थियो" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "अद्यावधिक हरू डाउनलोड गर्न असक्षम: प्रमाणीकरण अवैध थियो" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "%s स्थापना गर्न असक्षम: ब्याट्रीको स्तर धेरै न्यून छ" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "अद्यावधिक हरू स्थापना गर्न असक्षम: पर्याप्त डिस्क खाली स्थान छैन" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "अद्यावधिकहरू स्थापना गर्न असक्षम: प्रमाणीकरण आवश्यक थियो" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "अद्यावधिक हरू स्थापना गर्न असक्षम: प्रमाणीकरण अवैध" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "अद्यावधिकहरू स्थापना गर्न असक्षम: AC पावर आवश्यक छ" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "%s अद्यावधिक गर्न असक्षम: ब्याट्री स्तर धेरै न्यून छ" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "अद्यावधिक हरू स्थापना गर्न असक्षम: ब्याट्री स्तर धेरै न्यून छ" + +#, fuzzy, c-format +#~ msgid "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "%s प्रमाणिकरण आवश्यक छ ।" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "%s मा स्तरवृद्धि गर्न असक्षम: ब्याट्रीको स्तर धेरै न्यून छ" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "%s हटाउन असक्षम: प्रमाणीकरण आवश्यक थियो" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "%s हटाउन असक्षम: प्रमाणीकरण अवैध थियो" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "%s हटाउन असक्षम: AC पावर आवश्यक छ" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "%s हटाउन असक्षम: ब्याट्रीको स्तर धेरै न्यून छ" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "\"%s\" हटाउन असक्षम" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "फाइल स्थापना गर्न असफल: समर्थन गर्दैन" + +#~ msgid "Failed to install: not supported" +#~ msgstr "स्थापना गर्न असफल: समर्थन गरेन" + +#~ msgid "AC power is required" +#~ msgstr "AC पावर आवश्यक" + +#~ msgid "Network Settings" +#~ msgstr "सञ्जाल सेटिङ" + +#~ msgid "Restart Now" +#~ msgstr "फेरि सुरु गर्नुहोस्" + +#~ msgid "Primary Menu" +#~ msgstr "मुख्य मेनु" + +#~ msgid "Find Out _More" +#~ msgstr "अरू फेला पार्नुहोस्" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "अद्यावधिक गर्नुहोस्" + +#~ msgid "Application Data" +#~ msgstr "अनुप्रयोग डेटा" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "एउटा महत्वपूर्ण सफ्टवेयर अद्यावधिक स्थापना गर्न तयार छ।" + +#, fuzzy +#~ msgid "Please download waiting software updates." +#~ msgstr "कृपया सफ्टवेयर अद्यावधिकका लागि जाँच गर्नुहोस् ।" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "सञ्चालन प्रणाली अद्यावधिक उपलब्ध छैन" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "एउटा महत्वपूर्ण सञ्चालन प्रणाली अद्यावधिक स्थापना गर्न असफल भयो ।" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s अब उप्रान्त समर्थित छैन।." + +#~ msgid "No Network" +#~ msgstr "सञ्जाल छैन" + +#~ msgid "Update All" +#~ msgstr "सबै अद्यावधिक गर्नुहोस्" + +#~ msgid "Application Updates" +#~ msgstr "अनुप्रयोग अद्यावधिक" + +#~ msgid "Downloading featured images…" +#~ msgstr "फिचर गरिएका छविहरू डाउनलोड गर्दैछ..." + +#~ msgid "GNOME Web" +#~ msgstr "जिनोम वेब" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "स्तर बृद्वि जानकारी डाउनलोड गर्दैछ..." + +#~ msgid "Application manager for GNOME" +#~ msgstr "जिनोमको लागि अनुप्रयोग प्रबन्धक" + +#~ msgid "A list of popular applications" +#~ msgstr "लोकप्रिय अनुप्रयोगहरूको सूची" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "प्रणाली परिभाषित एक अधिलेखन, प्रयोग गर्न अनुप्रयोगहरूको सूची ।." + +#, c-format +#~| msgid "%s %f" +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "सफ्टवेयर विवरणिका डाउनलोड भइरहेको छ" + +#~ msgid "Name" +#~ msgstr "नाम" + +#~ msgid "user" +#~ msgstr "प्रयोगकर्ता" + +#~ msgid "Channel" +#~ msgstr "च्यानल" + +#~ msgid "Branch" +#~ msgstr "शाखा" + +#~ msgid "URL" +#~ msgstr "युआरएल" + +#~ msgid "Installation" +#~ msgstr "स्थापना गर्नुहोस्" + +#~ msgid "Version" +#~ msgstr "संस्करण" + +#~ msgid "Access arbitrary files" +#~ msgstr "स्वेच्छाचारी फाइलहरू पहुँच" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "यो प्रणालीमा अद्यावधिक स्थापना गरिएको छैन." + +#~ msgid "Checking…" +#~ msgstr "जाँच गरिँदै छ…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Select All" +#~ msgstr "सबै चयन गर्नुहोस्" + +#~ msgid "Select None" +#~ msgstr "कुनै पनि होइन (पूर्वानिर्धारित)" + +#, fuzzy, c-format +#~| msgid "Featured" +#~ msgid "Featured %s" +#~ msgstr "प्रदर्शित" + +#~ msgid "Show" +#~ msgstr "देखाउने" + +#, fuzzy +#~ msgid "Subcategories filter menu" +#~ msgstr "छनौट गर्नु" + +#~ msgid "Sort" +#~ msgstr "क्रमबद्ध गर्नुहोस्" + +#, fuzzy +#~ msgid "Subcategories sorting menu" +#~ msgstr "क्रमबद्धता" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "सबै" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgid "Audio & Video" +#~ msgstr "अडियो/भिडियो" + +#~ msgid "Developer Tools" +#~ msgstr "विकासकर्ता उपकरणहरू" + +#~ msgid "Education & Science" +#~ msgstr "शिक्षा र विज्ञान" + +#~ msgid "Games" +#~ msgstr "खेलहरू" + +#~ msgid "Graphics & Photography" +#~ msgstr "फोटोग्राफि र ग्राफिक्स" + +#~ msgid "Productivity" +#~ msgstr "उत्पादकता" + +#, fuzzy +#~ msgid "Communication & News" +#~ msgstr "समाचारहरू" + +#~ msgid "Utilities" +#~ msgstr "अनुप्रयोगहरू" + +#~ msgid "_Read Less" +#~ msgstr "कम पढ्नुहोस्" + +#~ msgid "_Launch" +#~ msgstr "सुरुआत गर्नुहोस्" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "कहिल्यै पनि" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "अज्ञात" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "न्युन" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "मध्यम" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "उच्च" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "अज्ञात" + +#~ msgid "Loading…" +#~ msgstr "लोड गर्दै…" + +#~ msgid "Public domain" +#~ msgstr "सार्वजनिक डोमेन" + +#, fuzzy +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "_Add shortcut" +#~ msgstr "सर्टकट थप्नुहोस्" + +#~ msgid "Re_move shortcut" +#~ msgstr "सर्टकटहटाउनुहोस्" + +#~ msgid "Localized in your Language" +#~ msgstr "तपाँईको भाषामा स्थानियकरण गर्नुहोस्" + +#~ msgid "Release Activity" +#~ msgstr "निष्कासन कार्य" + +#~ msgid "Category" +#~ msgstr "कोटि" + +#~ msgid "Free" +#~ msgstr "नि:शुल्क" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "अज्ञात" + +#~ msgid "Proprietary Software" +#~ msgstr "स्वामित्व सफ्टवेयर" + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "सफ्टवेर लाईसेन्स सर्तहरू अज्ञात छन." + +#~ msgid "Welcome" +#~ msgstr "स्वागतम्" + +#~ msgid "Welcome to Software" +#~ msgstr "अनुप्रयोगमा स्वागत छ" + +#~ msgid "_Browse Software" +#~ msgstr "सफ्टवेयर ब्राउज़ गर्नुहोस" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "अनुप्रहयोग हटाउनुहोस्" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "स्थापना भयो" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "अद्यावधिक गरियो" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "अज्ञात" + +#~ msgid "History" +#~ msgstr "इतिहास" + +#~ msgid "More…" +#~ msgstr "अरू…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "सिफारिश गरिएको अडियो/भिडियो अनुप्रयोग" + +#~ msgid "Recommended Games" +#~ msgstr "सिफारिश गरिएका खेलहरू" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "सिफारिश गरिएको ग्राफिक्स अनुप्रयोग" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "सिफारिश गरिएको उत्पादकता अनुप्रयोग" + +#~ msgid "Find out more…" +#~ msgstr "अरू फेला पार्नुहोस्…" + +#~ msgid "Editor’s Picks" +#~ msgstr "सम्पादकको छनौट" + +#~ msgid "Recent Releases" +#~ msgstr "हालको विज्ञप्ति" + +#, c-format +#~ msgid "Remove “%s”?" +#~ msgstr "\"%s\" हटाउनुहुन्छ?" + +#, c-format +#~| msgid "Unable to find “%s”" +#~ msgid "Disable “%s”?" +#~ msgstr "“%s” अक्षम पार्नुहुन्छ?" + +#, fuzzy +#~| msgid "Additional Sources" +#~ msgid "No Additional Repositories" +#~ msgstr "थप सफ्टवेयर आवश्यक" + +#~ msgid "_Remove…" +#~ msgstr "हटाउनुहोस्…" + +#~ msgid "_Disable…" +#~ msgstr "अक्षम पार्नुहोस्…" + +#~ msgid "Disabling" +#~ msgstr "अक्षम पार्नुहोस्" + +#~ msgid "Enabled" +#~ msgstr "सक्षम पारियो" + +#~ msgid "Disabled" +#~ msgstr "अक्षम पारिएको" + +#, fuzzy +#~ msgid "ratings in total" +#~ msgstr "जम्मा:" + +#~ msgid "_Remove All" +#~ msgstr "सबै हटाउनुहोस्" + +#~ msgid "Looking for new updates…" +#~ msgstr "नयाँ अद्यावधिकहरू खोज्दै…" + +#~ msgid "Setting up updates…" +#~ msgstr "अद्यावधिक सेटअप गर्दै…" + +#~ msgid "Software is up to date" +#~ msgstr "सफ्टवेयर अद्यावधिक छ" + +#~ msgid "_Restart Now" +#~ msgstr "फेरि सुरु गर्नुहोस्" + +#, fuzzy, c-format +#~| msgid "Downloading %s %s" +#~ msgid "Waiting to Download %s %s" +#~ msgstr "ताल्चा प्राप्त गर्न सकिएन %s\n" + +#, c-format +#~ msgid "Downloading %s %s" +#~ msgstr "%s %s डाउनलोड गर्दै" + +#~ msgid "OS Updates" +#~ msgstr "OS अद्यावधिक" + +#~ msgid "Failed to copy" +#~ msgstr "प्रतिलिपी गर्दा असफल भयो" + +#, fuzzy +#~ msgid "Downloading firmware update signature…" +#~ msgstr "नयाँ/अद्यावधिक गरिएको द्रष्टव्यहरू डाउनलोड गर्दैछ..." + +#, fuzzy +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "नयाँ/अद्यावधिक गरिएको द्रष्टव्यहरू डाउनलोड गर्दैछ..." + +#, fuzzy +#~ msgid "Downloading application ratings…" +#~ msgstr "डाउनलोड हुँदैछ" + +#, fuzzy +#~ msgid "Show the folder management UI" +#~ msgstr "सत्र प्रबन्ध विकल्प देखाउनुहोस्" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "सबै" + +#~ msgid "Folder Name" +#~ msgstr "फोल्डरको नाम" + +#~ msgid "_Add" +#~ msgstr "थप्नुहोस्" + +#~ msgid "Add to Application Folder" +#~ msgstr "अनुपर्योग फो्डर थप्नुहोस्" + +#, fuzzy +#~ msgid "Show profiling information for the service" +#~ msgstr "विशेष सेवा देखाउनुहोस्" + +#~ msgid "About %s" +#~ msgstr "%s का बारेमा" + +#~ msgid "To continue you need to sign in." +#~ msgstr "जारी राख्नको लागि साइन गर्नु " + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "जारी राख्नको लागि साइन गर्नु %s " + +#~ msgid "Email address" +#~ msgstr "इमेल ठेगाना" + +#, fuzzy +#~ msgid "I have an account already" +#~ msgstr "%s खाता पहिले नै अवस्थित छ %s" + +#, fuzzy +#~ msgid "Sign in automatically next time" +#~ msgstr "यो संवाद अर्को पटक देखाउनुहोस्।." + +#~ msgid "PIN" +#~ msgstr "पिन" + +#~ msgid "Continue" +#~ msgstr "जारी राख्नुहोस्" + +#, fuzzy +#~| msgid "Network Settings" +#~ msgid "Extension Settings" +#~ msgstr "विस्तार द्वारा" + +#, fuzzy +#~ msgid "References to alcoholic beverages" +#~ msgstr "सन्दर्भहरू:" + +#, fuzzy +#~ msgid "Use of alcoholic beverages" +#~ msgstr "जस्ताको तस्तै प्रयोग गर्नुहोस्" + +#, fuzzy +#~ msgid "References to illicit drugs" +#~ msgstr "सन्दर्भहरू:" + +#, fuzzy +#~ msgid "Use of illicit drugs" +#~ msgstr "जस्ताको तस्तै प्रयोग गर्नुहोस्" + +#, fuzzy +#~ msgid "Use of tobacco products" +#~ msgstr "प्रयोग:" + +#, fuzzy +#~ msgid "Brief artistic nudity" +#~ msgstr "कलात्मक" + +#, fuzzy +#~ msgid "Sexual references or depictions" +#~ msgstr "सन्दर्भहरू:" + +#, fuzzy +#~ msgid "Graphic sexual behavior" +#~ msgstr "व्यवहार" + +#, fuzzy +#~ msgid "Moderate use of profanity" +#~ msgstr "मध्यम सिमसिम" + +#, fuzzy +#~| msgctxt "Menu subcategory of Development Tools" +#~| msgid "Project Management" +#~ msgid "Product placement" +#~ msgstr "वस्तु" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "अज्ञात" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS वैध छ!" + +#~ msgid "Failed to load file" +#~ msgstr "फाइल लोड गर्न असफल" + +#~ msgid "Unsaved changes" +#~ msgstr "बचत नगरिएको परिवर्तनहरू" + +#~ msgid "Merge documents" +#~ msgstr "कागजातहरू गाभ्नुहोस्" + +#, fuzzy +#~ msgid "Throw away changes" +#~ msgstr "टाढा" + +#, fuzzy +#~ msgid "Open AppStream File" +#~ msgstr "अस्थायी फाइल खोल्न असफल" + +#~ msgid "_Save" +#~ msgstr "बचत गर्नुहोस्" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s ब्यानर डिजाइन मेटियो" + +#~ msgid "Banner design deleted." +#~ msgstr "ब्यानर डिजाइनको मेटियो" + +#, fuzzy +#~ msgid "Use verbose logging" +#~ msgstr "धेरै शब्द हुनु" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "जिनोमका सफ्टवेयर ब्यानर डिजाइनर" + +#, fuzzy +#~ msgid "No Designs" +#~ msgstr "GUI तत्व" + +#~ msgid "page1" +#~ msgstr "पृष्ठ १" + +#, fuzzy +#~ msgid "Error message here" +#~ msgstr "त्रुटि सन्देश" + +#~ msgid "Category Feature" +#~ msgstr "श्रेणी सुविधा" + +#~ msgid "page2" +#~ msgstr "पृष्ठ २" + +#~ msgid "Undo" +#~ msgstr "पुर्वस्थितिमा फर्काउनुहोस्" + +#~ msgid "New Banner" +#~ msgstr "नया ब्यानर" + +#, fuzzy +#~ msgid "Import from file" +#~ msgstr "फाईलबाट आयात गर्नुहोस्" + +#, fuzzy +#~ msgid "Export to file" +#~ msgstr "लोड गरिएको फाइल निर्यात गर्नुहोस् र निस्कनुहोस्" + +#~ msgid "this website" +#~ msgstr "यो वेबसाइट" + +#, fuzzy +#~ msgid "_Let’s Go Shopping" +#~ msgstr "जानुहोस्: %s (%s)" + +#~ msgid "Spacing" +#~ msgstr "दूरी (अन्तराल)" + +#~ msgid "The amount of space between children" +#~ msgstr "शाखाहरुको बीचको ठाँउको मूल्य" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "हटाईयो" + +#~ msgid "Click on items to select them" +#~ msgstr "वस्तु चयन गर्न तपाईँले यसमा क्लिक गर्नु पर्दछ ।" + +#~ msgid "Select" +#~ msgstr "चयन गर्नुहोस्" + +#~ msgid "_Add to Folder…" +#~ msgstr "फोल्डरमा थप्नुहोस्…" + +#~ msgid "_Move to Folder…" +#~ msgstr "फोल्डरमा सार्नुहोस्…" + +#, fuzzy +#~ msgid "Software catalog is being loaded" +#~ msgstr "सफ्टवेयर सुची अपडेट गर्न यहाँले प्रमाणित गर्नुपर्ने हुन्छ" + +#~ msgid "_About" +#~ msgstr "बारेमा" + +#~ msgid "_Quit" +#~ msgstr "अन्त्य गर्नुहोस्" + +#, fuzzy +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "सफ्टवयर स्रोतहरू" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "%s हटाउन निश्चित हुनुहुन्छ ?" + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "For more information, visit %s." +#~ msgstr "अरु जानकारी को लागि %s मा जानुहोस्" + +#, fuzzy +#~ msgid "Proprietary Software Sources" +#~ msgstr "सफ्टवयर स्रोतहरू" + +#~ msgid "Remove Source" +#~ msgstr "स्रोत हटाउनुहोस्" + +#, fuzzy +#~ msgid "No software installed from this source" +#~ msgstr "श्रोत प्याकेजहरू स्थापित गर्न सकिएन" + +#, fuzzy +#~ msgid "Installed from this Source" +#~ msgstr "श्रोत प्याकेजहरू स्थापित गर्न सकिएन" + +#~ msgid "Last Checked" +#~ msgstr "अन्तिम जाँच गरियो" + +#~ msgid "Added" +#~ msgstr "थपियो" + +#~ msgid "Website" +#~ msgstr "वेबसाइट" + +#, fuzzy +#~ msgid "Security Updates Pending" +#~ msgstr "बाकि अनुप्रयोग स्थापना गर्नुहोस्" + +#~ msgid "View" +#~ msgstr "दृश्य" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "हिजो, %l∶%M %p" + +#~ msgid "Three days ago" +#~ msgstr "तीन दिन पहिला" + +#~ msgid "Four days ago" +#~ msgstr "चार दिनपहिला" + +#~ msgid "Five days ago" +#~ msgstr "पाँच दिनपहिला" + +#~ msgid "Six days ago" +#~ msgstr "छ दिन पहिला" + +#~ msgid "Two weeks ago" +#~ msgstr "दुई हप्ता पहिला" + +#~ msgid "Downloading new updates…" +#~ msgstr "नयाँ अद्यावधिक डाउनलोड गर्दैछ..." + +#~ msgid "Restart & _Install" +#~ msgstr "पुन शुरु र स्थापना गर्नुहोस्" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Banner Designer" +#~ msgstr "ब्यानर डिजाइनर" + +#, fuzzy +#~ msgid "AppStream;Software;App;" +#~ msgstr "एप ID" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "सेल विस्तारहरू" + +#, fuzzy +#~ msgid "Getting runtime source…" +#~ msgstr "रनटाइम" + +#, fuzzy +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "विस्तार डाउनलोड गर्दैछ" + +#, fuzzy +#~ msgid "Downloading application page…" +#~ msgstr "डाउनलोड हुँदैछ" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "_सबै" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "प्रदर्शित" + +#, fuzzy +#~ msgid "An update failed to install correctly." +#~ msgstr "चेतावनी: `%s' स्किमा `%s' लोक्याल स्थापना गर्न असफल भयो: %s\n" + +#, fuzzy +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "अवयव`%.255s' (in %.255s)खोल्न अप्रत्यासित रुपले असफल" + +#~ msgid "_Installing" +#~ msgstr "स्थापना गर्नुहोस्..." + +#~ msgid "_Removing" +#~ msgstr "हटाउँदैछ" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "अज्ञात" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "गणना गरिदै" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "अज्ञात" + +#, fuzzy +#~ msgid "Internet Only Application" +#~ msgstr "अनुप्रयोग प्रतिमा मात्रै" + +#~ msgid "_History" +#~ msgstr "इतिहास" + +#~ msgid "Size" +#~ msgstr "साइज" + +#, fuzzy +#~ msgid "Recommended Office Applications" +#~ msgstr "अनुप्रयोग पाईएन" + +#~ msgid "One Star" +#~ msgstr "प्रतीक तारा" + +#, fuzzy +#~ msgid "Two Stars" +#~ msgstr "दुईवटा सुट" + +#, fuzzy +#~ msgid "Three Stars" +#~ msgstr "तीन चौथाइ" + +#, fuzzy +#~ msgid "Four Stars" +#~ msgstr "चारवटा सुट" + +#, fuzzy +#~ msgid "Five Stars" +#~ msgstr "चिडीको पञ्जा" + +#, fuzzy +#~ msgid "Installation of %s failed." +#~ msgstr "प्रयोग स्थापना असफल भयो!" + +#, fuzzy +#~ msgid "Removal of %s failed." +#~ msgstr "फ्रोक असफल" + +#, fuzzy +#~ msgid "No AppStream data found" +#~ msgstr "पीजीपी डेटा फेला परेन ।" + +#~ msgid " or " +#~ msgstr " वा" + +#~ msgid "Audio" +#~ msgstr "अडियो" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "डेटाबेस" + +#, fuzzy +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "डिस्क सङ्ख्या" + +#, fuzzy +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "%s समूह रेडियो" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "च्यानल मिश्रण" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "सङ्गीत" + +#, fuzzy +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "दृश्य निर्माण गरिदैछ" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "डेटाबेस" + +#, fuzzy +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "सचेतक घडीको प्रोफाइल हुँदैछ" + +#, fuzzy +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Revision Control" +#~ msgstr "बायाँ नियन्त्रण" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "वेब विकास" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "जीव शास्त्र" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "कम्प्युटर नाम:" + +#, fuzzy +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "दृश्यात्मक साइज:" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "इलेक्ट्रोनिक्स" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "इञ्जिनियरिङ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "जियो विज्ञान" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "इतिहास" + +#, fuzzy +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "प्रक्रिया गर्दा त्रुटि" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "मानचित्र" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "सङ्गीत" + +#, fuzzy +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "डेटा विश्लेषण" + +#, fuzzy +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "आधारभूत रणनीति कम्प्युटिङ गर्नुहोस्..." + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "भौतिक शास्त्र" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "नक्कल" + +#~ msgid "Graphics" +#~ msgstr "ग्राफिक्स" + +#, fuzzy +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "ग्राफिक्स अनुप्रयोग" + +#~ msgid "Internet" +#~ msgstr "इन्टरनेट" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "इमेल" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "फिड" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "फाइल स्थानान्तरण" + +#, fuzzy +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "%s समूह रेडियो" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "शीघ्र सन्देश" + +#, fuzzy +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC प्रोटोकल प्लगइन" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "मोनिटर" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "टेलिफोनि" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "वेब विकास" + +#~ msgid "Office" +#~ msgstr "कार्यालय" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "चित्रपट" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "-समपर्क व्यवस्थापन" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "शब्दकोश" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "इमेल" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "स्टारचार्ट चार्ट " + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "परियोजना व्यवस्थापन" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "प्रकाशन गर्दै" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "स्प्रेडसिट" + +#, fuzzy +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "लग दर्शक" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "कला" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "खगोल शास्त्र" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "जीव शास्त्र" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "रसायन शास्त्र" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "कम्प्युटर विज्ञान" + +#, fuzzy +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "सन्देश निर्माण असफल भयो ।" + +#, fuzzy +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "दृश्यात्मक साइज:" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "इलेक्ट्रोनिक्स" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "इञ्जिनियरिङ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "जियो विज्ञान" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "इतिहास" + +#, fuzzy +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "प्रक्रिया गर्दा त्रुटि" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "भाषाहरु" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "मानचित्र" + +#, fuzzy +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "प्रतीक, म्याथ" + +#, fuzzy +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "डेटा विश्लेषण" + +#, fuzzy +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "आधारभूत रणनीति कम्प्युटिङ गर्नुहोस्..." + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "भौतिक शास्त्र" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "फाइल प्रबन्धक" + +#, fuzzy +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "/उपकरणहरू/फाइल स्थानान्तरणहरू" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "मोनिटर" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "सुरक्षा" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "टर्मिनल अनुप्रयोग" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "पहुँचता" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "गणकयन्त्र" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "घडी" + +#, fuzzy +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "दवाब" + +#, fuzzy +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "/उपकरणहरू/फाइल स्थानान्तरणहरू" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "मानचित्र" + +#, fuzzy +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "/उपकरणहरू/गोपनीयता" + +#~ msgid "Video" +#~ msgstr "भिडियो" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "सम्पादन गर्दै" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "डेटाबेस" + +#, fuzzy +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "डिस्क सङ्ख्या" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "टिभी" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..89301d6 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,8601 @@ +# Dutch translation for gnome-software. +# Copyright (C) 2015 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# software repository - softwarebron +# +# Nathan Follens , 2015-2024. +# Justin van Steijn 2015, 2016, 2017, 2018, 2019, 2022. +# Hannie Dumoleyn , 2016, 2018, 2019, 2020, 2021. +# Reinout van Schouwen , 2016 (review). +# Philip Goto, 2022. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software gnome-3-16\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-09-25 12:01+0000\n" +"PO-Revision-Date: 2024-10-28 11:22+0100\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.4.4\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Installeer en update toepassingen" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Met GNOME Software kunt u nieuwe toepassingen en systeemuitbreidingen vinden " +"en installeren, en bestaande geïnstalleerde toepassingen verwijderen." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Software geeft aanbevolen en populaire toepassingen weer met nuttige " +"beschrijvingen en meerdere schermafdrukken per toepassing. U vindt " +"toepassingen door de lijst van categorieën te bekijken of door te zoeken. U " +"kunt ook uw systeem bijwerken met behulp van een offline-update." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Overzichtstabblad" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Tabblad met details" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Tabblad met geïnstalleerde toepassingen" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Tabblad met updates" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Details van de update" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2625 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Het GNOME-project" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "akmods-sleutel testen in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Aanmelding vereist om akmods-sleutel te testen in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "akmods-sleutel inschrijven bij Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Aanmelding vereist om akmods-sleutel in te schrijven bij Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "DKMS-sleutel testen in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Aanmelding vereist om DKMS-sleutel te testen in Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "DKMS-sleutel inschrijven bij Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Aanmelding vereist om DKMS-sleutel in te schrijven bij Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Een appstream-bestand installeren op een systeemlocatie" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Een appstream-bestand installeren op een systeemlocatie" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Een lijst met compatibele projecten" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Dit is een lijst met compatibele projecten die getoond moeten worden, zoals " +"GNOME, KDE en Xfce." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Of updates en upgrades worden beheerd in GNOME Software" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Indien uitgeschakeld zal GNOME Software het tabblad met updates verbergen, " +"geen automatische updates uitvoeren en geen upgrades aanbieden." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Updates automatisch downloaden en installeren" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Indien ingeschakeld zal GNOME Software automatisch updates op de achtergrond " +"downloaden, waarbij ook updates die geen herstart vereisen worden " +"geïnstalleerd." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"De gebruiker informeren over software die op de achtergrond bijgewerkt is" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Indien ingeschakeld, informeert GNOME Software de gebruiker over updates die " +"gedaan zijn terwijl de gebruiker niet actief was." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Of automatisch ververst wordt bij een verbinding met een datalimiet" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Indien ingeschakeld zal GNOME Software automatisch op de achtergrond " +"vernieuwen, zelfs als een verbinding met datalimiet wordt gebruikt (dat " +"leidt tot het downloaden van wat metadata, controleren op updates, enz., " +"hetgeen kosten voor de gebruiker met zich mee kan brengen)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Of het de eerste keer opstarten van GNOME Software is of niet" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Beoordelingen met sterren naast toepassingen tonen" + +# Betere suggesties zijn welkom - Justin +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Toepassingen filteren gebaseerd op de standaard-branchset van de server op " +"afstand" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Waarschuwen voor het installeren van niet-vrije toepassingen" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Voordat niet-vrije toepassingen worden geïnstalleerd kan een " +"waarschuwingsvenster worden weergegeven. Dit bepaalt of dat venster wel of " +"niet wordt weergegeven." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Tijdstempel van de laatste updatecontrole" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Tijdstempel van de laatste upgradecontrole" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Tijdstempel van de laatste updatemelding" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Het tijdstempel van de eerste veiligheidsupdate, gewist na de update" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Tijdstempel van laatste update" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"De tijd in seconden om te controleren of de bovenstroomse schermafdruk nog " +"geldig is" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Als u een hogere waarde kiest, betekent dit dat u minder heen en terug moet " +"naar de externe server, maar kan het langer duren tot bijgewerkte " +"schermafdrukken worden getoond aan de gebruiker. De waarde 0 betekent dat de " +"server nooit gecontroleerd wordt als het beeld al in de cache staat." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "De server die moet worden gebruikt voor toepassingsbeoordelingen" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "De minimale karma-score voor beoordelingen" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Beoordelingen met minder karma dan dit aantal worden niet getoond." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Een lijst met officiële softwarebronnen die niet als van derden moeten " +"worden beschouwd" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Een lijst met vereiste softwarebronnen die niet uitgeschakeld of verwijderd " +"kan worden" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Een lijst met officiële softwarebronnen die als vrije software moeten worden " +"beschouwd" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"De URL van de te gebruiken licentie wanneer een toepassing als vrije " +"software moet worden beschouwd" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Gebundelde toepassingen installeren voor alle gebruikers op het systeem waar " +"mogelijk" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Toegang geven tot het softwarebronnen-dialoogvenster" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Opwaarderingen aanbieden voor pre-releases" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Enkele UI-elementen tonen waarmee de gebruiker geïnformeerd wordt dat een " +"app niet-vrij is" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"De grootte van geïnstalleerde toepassingen tonen in de lijst met " +"geïnstalleerde toepassingen" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://nl.wikipedia.org/wiki/Propri%C3%ABtaire_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"De URI waarin uitleg wordt gegeven over niet-vrije en propriëtaire software" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Een lijst met URL’s die verwijzen naar appstream-bestanden die gedownload " +"zullen worden naar een swcatalog-map" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Installeer de AppStream-bestanden installeren op een locatie die voor alle " +"gebruikers toegankelijk is. Indien uitgeschakeld worden bestanden " +"geïnstalleerd in een niet-standaard map $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Prioriteit voor pakketformaten, waarbij de belangrijkste formaten eerst " +"opgelijst staan. Een lege lijst betekent de standaardvolgorde. Weggelaten " +"formaten worden achteraan gezet. Voorbeelden van pakketformaten zijn: deb, " +"flatpak, rpm, snap. De formaten kunnen desgewenst nader bepaald worden met " +"een bronnaam, gescheiden door een dubbelpunt, bijvoorbeeld ‘flatpak:flathub’." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Het moment waarop laatst geprobeerd wordt ongebruikte Flatpak-runtimes te " +"verwijderen" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Stel dit in op ‘true’ (waar) om enkel toepassingen gepubliceerd onder een " +"vrije licentie weer te geven, en alle propriëtaire toepassingen te verbergen." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Stel dit in op ‘true’ (waar) om enkel toepassingen van ontwikkelaars met een " +"geverifieerde identiteit weer te geven." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "De tijdstempel van de laatst ontvangen updates." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Een tekenreeks met het id van de gnome-online-account om in te loggen" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Software AppStream systeembrede installer" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Opdrachtregelargumenten ontleden mislukt" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "U dient exact één bestandsnaam op te geven" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Dit programma kan alleen worden gebruikt door de root-gebruiker" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Valideren van inhoudstype is mislukt: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Verplaatsen is mislukt: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Software-installatie" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "De geselecteerde software installeren op het systeem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Stripgeweld" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Geen informatie over stripgeweld" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantasiegeweld" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Geen informatie over fantasiegeweld" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistisch geweld" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Geen informatie over realistisch geweld" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Geweld met bloedvergieten" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Geen informatie over geweld met bloedvergieten" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Seksueel geweld" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Geen informatie over seksueel geweld" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Geen informatie over verwijzingen naar alcohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Drugs" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Geen informatie over verwijzingen naar illegale drugs" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Geen informatie over verwijzingen naar tabaksproducten" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Naaktheid" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Geen informatie over enige naaktheid" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Seksuele thema’s" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Geen informatie over seksueel verwijzingen of afbeeldingen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Scheldwoorden" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Geen informatie over enige godslastering" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Ongepaste humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Geen informatie over ongepaste humor" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminatie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Geen informatie over discriminerend taalgebruik" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reclame" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Geen informatie over enige reclame" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Gokken" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Geen informatie over gokken" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Aankopen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Geen informatie over de mogelijkheid om echt geld uit te geven" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Gesprekken tussen gebruikers" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Geen informatie over mogelijkheden om met andere gebruikers te chatten" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Audiogesprekken tussen gebruikers" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Geen informatie over mogelijkheden om met andere gebruikers te praten" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Contactgegevens" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Geen informatie over het delen van gebruikersnamen van sociale netwerken of " +"e-mailadressen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identificerende informatie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Geen informatie over het delen van gebruikersinformatie met derden" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Locatie delen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Geen informatie over het delen van de fysieke locatie met andere gebruikers" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksualiteit" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Geen informatie over verwijzingen naar homoseksualiteit" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitutie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Geen informatie over verwijzingen naar prostitutie" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Overspel" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Geen informatie over verwijzingen naar overspel" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Geseksualiseerde personages" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Geen informatie over geseksualiseerde personages" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Heiligschennis" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Geen informatie over verwijzingen naar heiligschennis" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Menselijke overblijfselen" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Geen informatie over zichtbare overblijfselen van dode mensen" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Slavernij" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Geen informatie over verwijzingen naar slavernij" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Bevat geen verwijzingen naar drugs" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Bevat geen scheldwoorden of ander grof taalgebruik" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Bevat geen reclame of monetaire transacties" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Bevat geen seks of naaktheid" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "" +"Bevat geen niet-gecontroleerde gespreksfunctionaliteit tussen gebruikers" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Bevat geen geweld" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drugs" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Grof taalgebruik" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Geld" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sociaal" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Geweld" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Alle" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s heeft een onbekende leeftijdsbeoordeling" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s is geschikt voor iedereen" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s is geschikt voor kleuters" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s is geschikt voor jonge kinderen" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s is geschikt voor kinderen" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s is geschikt voor tieners" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s is geschikt voor volwassenen" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s is geschikt voor %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Leeftijdsbeoordeling" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:126 +msgid "_How to contribute missing information" +msgstr "_Hoe ontbrekende informatie bijdragen" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "Lokaal bestand" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "Pakket" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "In behandeling" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:407 +msgid "Pending install" +msgstr "Installatie in afwachting" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:414 +msgid "Pending remove" +msgstr "Verwijdering in afwachting" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:395 +msgid "Installing" +msgstr "Wordt geïnstalleerd" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Wordt verwijderd" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:400 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Downloaden" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:307 src/gs-details-page.c:1060 +#: src/gs-details-page.c:1095 src/gs-details-page.ui:243 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Installeren" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1180 +msgid "_Uninstall…" +msgstr "Verwij_deren…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Netwerk" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Kan over het netwerk communiceren" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Systeemdiensten" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Heeft toegang tot D-Bus-diensten op de systeembus" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Sessiediensten" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Heeft toegang tot D-Bus-diensten op de sessiebus" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Apparaten" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Heeft toegang tot alle apparaten, zoals webcams" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Heeft toegang tot invoerapparaten" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Heeft toegang tot microfoons" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Kan systeem-apparaatbestanden lezen" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Scherminhoud" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Heeft toegang tot scherminhoud" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Persoonlijke map" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Kan bestanden lezen, bewerken en aanmaken" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Kan bestanden lezen" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Bestandssysteem" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Downloadmap" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Instellingen" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Kan alle instellingen inzien en wijzigen" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Verouderd weergavesysteem" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Gebruikt een oud en onveilig weergavesysteem" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Zandbak omzeilen" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Kan de zandbak en andere beperkingen omzeilen" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Geen updatebeschrijving beschikbaar." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Update-details" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Vereist extra rechten" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Beoordelingen" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "Er zijn geen beoordelingen voor deze toepassing." + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "Geen beoordelingen" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "Versiegeschiedenis" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Nieuw in versie %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versie %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Er zijn geen details beschikbaar voor deze uitgave" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Opstartmodus: ofwel ‘updates’, ‘updated’ (bijgewerkt), ‘installed’ " +"(geïnstalleerd) of ‘overview’ (overzicht)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "Modus" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Naar toepassingen zoeken" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "Zoeken" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Toepassingsgegevens tonen (met gebruikmaking van toepassings-ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Toepassingsgegevens tonen (met gebruikmaking van pakketnaam)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "Pakketnaam" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "De toepassing installeren (met behulp van toepassings-ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "De toepassing verwijderen (met behulp van toepassings-ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Een lokaal pakketbestand openen" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "Bestandsnaam" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"De soort interactie verwacht voor deze actie: ‘none’ (geen), ‘notify’ " +"(melden) of ‘full’ (volledig)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTIE" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Lokaal metainfo- of appdatabestand tonen" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Gedetailleerde debuguitvoer inschakelen (van de draaiende instantie, indien " +"er al een is)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installeert updates die op de achtergrond klaar staan" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Voorkeuren tonen" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Draaiende instantie afsluiten" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Lokale bestandsbronnen verkiezen boven AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Versienummer tonen" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 De bijdragers aan GNOME Software" + +# Met het nieuwe over-venster ziet de lege regel tussen vertalers en meer info er vreemd uit, mij lijkt het beter om deze weg te laten. +# - Philip +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Nathan Follens \n" +"Justin van Steijn\n" +"Hannie Dumoleyn\n" +"Philip Goto\n" +"Meer info over GNOME-NL https://nl.gnome.org" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Er zijn helaas geen details voor die toepassing." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Grootte na installatie" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Bevat %s aan gegevens en %s aan cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Bevat %s aan gegevens" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Bevat %s aan cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Cache- en gegevensverbruik onbekend" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Downloadgrootte" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Vereist geen extra systeemdownloads" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Vereist een onbekende hoeveelheid aan extra systeemdownloads" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Vereist %s aan extra systeemdownloads" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Grootte is onbekend" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Geen toegangsrechten" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Heeft netwerktoegang" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Gebruikt systeemdiensten" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Gebruikt sessiediensten" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Heeft toegang tot hardware-apparaten" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Heeft toegang tot systeemapparaten" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Kan al uw gegevens lezen/schrijven" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Kan al uw gegevens lezen" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Kan uw downloads lezen/schrijven" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Kan uw downloads lezen" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Heeft toegang tot sommige specifieke bestanden" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Heeft toegang tot gebruikersinstellingen en kan die wijzigen" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Gebruikt een verouderd venstersysteem" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Kan willekeurige toegangsrechten verkrijgen" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Softwareontwikkelaar is geverifieerd" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Nagekeken door de distributeur van het besturingssysteem" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Nagekeken door %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Geleverd door een derde partij" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Deze software wordt niet meer ondersteund" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Controleerbare code" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Onbekende licentie" + +# Ik heb toch maar gekozen voor Bedrijfseigen i.p.v. proriëtair. - Hannie +# ‘Proprietary’ is het tegenovergestelde van ‘free’ en is dus een synoniem van ‘nonfree’; in dit geval is het het meest logisch om in het Nederlands te kiezen voor ‘niet-vrij’. Niet-vrije software hoeft niet door een bedrijf ontwikkeld te zijn. - Justin +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Propriëtaire code" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Speciale licentie" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Geprivilegieerd" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Veilig" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Waarschijnlijk veilig" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Mogelijk onveilig" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Onveilig" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Alleen mobiel" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Werkt alleen op een klein scherm" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Alleen bureaublad" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Werkt alleen op een groot scherm" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Schermgrootte komt niet overeen" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Biedt geen ondersteuning voor uw huidige schermgrootte" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Vereist een aanraakscherm" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Vereist een toetsenbord" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Vereist een muis" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Gamepad vereist" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Vereist een gamepad om te spelen" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptief" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Werkt op smartphones, tablets en bureaubladen" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Vereist waarschijnlijk een toetsenbord of muis" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Werkt op bureaubladen en laptops" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Bevat geen leeftijd-ongepaste inhoud" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Geen leeftijdsbeoordeling beschikbaar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Website bezoeken" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Installeren…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Annuleren" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Installeren" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Downloaden" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Bijwerken" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Verwijderen…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Wordt verwijderd" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 +#: src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "Kritieke update" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Apparaat kan niet worden gebruikt tijdens het bijwerken." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Bron: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "%s hernoemd" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +msgid "Stopped Receiving Updates" +msgstr "Ontvangt geen updates meer" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Kritieke update" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Geïnstalleerd" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Help mee met het vertalen van %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s wordt ontworpen, ontwikkeld en vertaald door een internationale " +"gemeenschap van bijdragers.\n" +"\n" +"Dit betekent dat hoewel het nog niet in uw taal te verkrijgen is, u kunt " +"meehelpen en het zelf vertalen." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Vertalingen" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Ver_talingswebsite" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Aanmelding externe server %s (realm %s) verplicht" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "Aanmelding vereist" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:300 src/gs-common.c:752 +#: src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-page.c:708 +#: src/gs-removal-dialog.ui:24 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:251 src/gs-review-dialog.ui:24 src/gs-review-row.c:239 +#: src/gs-review-row.c:263 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "_Annuleren" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "_Aanmelden" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Gebruiker" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "Wachtwoord" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Andere" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Alle" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Aanbevolen" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Keuze van de redactie" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nieuw & bijgewerkt" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Selectie van webtoepassingen" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Overige software" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s is geïnstalleerd" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Pas na een herstart zullen de wijzigingen van kracht zijn" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "De toepassing is klaar voor gebruik" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Systeemupdates zijn geïnstalleerd" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Recent geïnstalleerde updates zijn klaar voor beoordeling" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:915 +msgid "Restart" +msgstr "Herstarten" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Starten" + +#. TRANSLATORS: window title +#: src/gs-common.c:234 +msgid "Install Software?" +msgstr "Software installeren?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Install Third-Party Software?" +msgstr "Software van derden installeren?" + +#. TRANSLATORS: window title +#: src/gs-common.c:240 +msgid "Enable Software Repository?" +msgstr "Softwarebron inschakelen?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:242 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Softwarebron van derden inschakelen?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:254 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s is geen vrije en openbronsoftware, en " +"wordt geleverd door ‘%s’." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:264 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s wordt geleverd door ‘%s’." + +#: src/gs-common.c:273 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Deze softwarebron moet ingeschakeld worden om met de installatie verder te " +"kunnen gaan." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:283 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"In sommige landen kan het illegaal zijn %s te installeren of te gebruiken." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:289 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"In sommige landen kan het illegaal zijn deze codec te installeren of te " +"gebruiken." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:303 +msgid "Don’t _Warn Again" +msgstr "Niet opnieuw _waarschuwen" + +#. TRANSLATORS: button text +#: src/gs-common.c:312 +msgid "Enable and _Install" +msgstr "Inschakelen en _installeren" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:519 +msgid "Detailed errors from the package manager follow:" +msgstr "Gedetailleerde fouten van de pakketbeheerder volgen:" + +#: src/gs-common.c:526 src/gs-common.c:663 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Gegevens" + +#. TRANSLATORS: button text +#: src/gs-common.c:575 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "Sl_uiten" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:744 +msgid "_Accept" +msgstr "_Aanvaarden" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:890 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Er is een update geïnstalleerd" +msgstr[1] "Er zijn updates geïnstalleerd" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:900 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Er is een toepassing verwijderd" +msgstr[1] "Er zijn toepassingen verwijderd" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:906 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Pas na een herstart zal deze van kracht zijn" +msgstr[1] "Pas na een herstart zullen ze van kracht zijn" + +#. TRANSLATORS: button text +#: src/gs-common.c:913 +msgid "Not Now" +msgstr "Niet nu" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1009 +msgid "Just now" +msgstr "Zojuist" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuut geleden" +msgstr[1] "%d minuten geleden" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d uur geleden" +msgstr[1] "%d uur geleden" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag geleden" +msgstr[1] "%d dagen geleden" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d week geleden" +msgstr[1] "%d weken geleden" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d maand geleden" +msgstr[1] "%d maanden geleden" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d jaar geleden" +msgstr[1] "%d jaar geleden" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1394 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Alles" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Aanbevolen" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografie" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Scannen" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vectorafbeeldingen" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Viewers" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Audiocreatie en -bewerking" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Muziekspelers" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Alles" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Aanbevolen" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Agenda" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Database" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Financiën" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Tekstverwerker" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Tekstverwerkers" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Webbrowsers" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Alles" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Aanbevolen" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Actie" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Avontuur" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokken" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Bordspellen" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kaartspellen" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulators" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Kinderen" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logica" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rollenspellen" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategische spellen" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Alles" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Aanbevolen" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chat" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Alles" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Aanbevolen" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Kunstmatige intelligentie" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomie" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Scheikunde" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Talen" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Wiskunde" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Nieuws" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotica" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Kunst" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografie" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Strips" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fictie" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Gezondheid" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Geschiedenis" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Levensstijl" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politiek" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Alles" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Aanbevolen" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Foutopsporingsprogramma’s" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE’s" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecs" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hardware-stuurprogramma’s" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Lettertypes" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Invoerbronnen" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Taalpakketten" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalisatie" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Maken" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Werken" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Spelen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socialiseren" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Leren" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Ontwikkelen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Hardwarestuurprogramma’s" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Lettertypen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Invoerbronnen" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Taalpakketten" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalisatie" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Een toepassing" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s vraagt om extra bestandsformaatondersteuning." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Aanvullende MIME-types vereist" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s vraagt om extra lettertypes." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Extra lettertypes vereist" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s vraagt om extra multimedia-codecs." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Extra multimedia-codecs vereist" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s vraagt om extra printerstuurprogramma’s." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Extra printerstuurprogramma’s vereist" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s vraagt om extra pakketten." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Extra pakketten vereist" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Zoeken in Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "_Meer weergeven" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Minder weergeven" + +#: src/gs-details-page.c:390 +msgid "Removing…" +msgstr "Wordt verwijderd…" + +#: src/gs-details-page.c:405 +msgid "Requires restart to finish install" +msgstr "Herstart vereist om installatie te voltooien" + +#: src/gs-details-page.c:412 +msgid "Requires restart to finish remove" +msgstr "Herstart vereist om verwijdering te voltooien" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:428 +msgid "Pending installation…" +msgstr "Installatie in afwachting…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:434 +msgid "Pending update…" +msgstr "Update in afwachting…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:449 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Downloaden…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:452 +msgid "Preparing…" +msgstr "Voorbereiden…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:455 +msgid "Uninstalling…" +msgstr "Wordt verwijderd…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:582 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s is niet geïnstalleerd, maar er blijven nog gegevens over." + +#: src/gs-details-page.c:1077 src/gs-toast.c:65 +msgid "_Restart" +msgstr "He_rstarten" + +#: src/gs-details-page.c:1083 +msgid "_Enable…" +msgstr "Inschak_elen…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1109 +msgid "_Install…" +msgstr "_Installeren…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1325 +#, c-format +msgid "%s will appear in US English" +msgstr "%s zal weergegeven worden in het Amerikaans-Engels" + +#: src/gs-details-page.c:1333 +msgid "This app will appear in US English" +msgstr "Deze toepassing zal weergegeven worden in het Amerikaans-Engels" + +#: src/gs-details-page.c:1335 +msgid "This software will appear in US English" +msgstr "Deze software zal weergegeven worden in het Amerikaans-Engels" + +#: src/gs-details-page.c:1370 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "Help mee ver_talen" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1435 +#, c-format +msgid "Other Apps by %s" +msgstr "Andere toepassingen van %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1471 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Ontwikkelaar %s heeft bewezen de eigenaar van %s te zijn" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1474 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "De ontwikkelaar heeft bewezen de eigenaar van %s te zijn" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1837 +msgid "You need internet access to write a review" +msgstr "U heeft internettoegang nodig om een beoordeling te schrijven" + +#: src/gs-details-page.c:1938 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Deze toepassing ontvangt geen updates meer, ook geen beveiligingsupdates" + +#: src/gs-details-page.c:1939 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Deze toepassing wordt al door uw distributie aangeboden en hoeft niet " +"vervangen te worden." + +#: src/gs-details-page.c:1940 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Deze toepassing levert geen verwijzingen naar een website, broncode of " +"probleemtracker." + +#: src/gs-details-page.c:1942 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Deze software ontvangt geen updates meer, ook geen beveiligingsupdates" + +#: src/gs-details-page.c:1943 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Deze software wordt al door uw distributie aangeboden en hoeft niet " +"vervangen te worden." + +#: src/gs-details-page.c:1944 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Deze software levert geen verwijzingen naar een website, broncode of " +"probleemtracker." + +#: src/gs-details-page.c:2034 src/gs-details-page.c:2051 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Software kon geen informatie verkrijgen voor ‘%s’ en kan geen gegevens voor " +"deze toepassing tonen." + +#: src/gs-details-page.c:2406 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Indienen van recensie voor ‘%s’ is mislukt: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Pagina met informatie" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Toepassingsdetails worden geladen" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Geverifieerd" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Openen" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Bijwerken" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Verwijderen" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "Add-ons" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Deze toepassing kan alleen gebruikt worden met een actieve " +"internetverbinding." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "Inclusief softwarebron" + +#: src/gs-details-page.ui:679 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Deze toepassing bevat een softwarebron die naast updates ook toegang biedt " +"tot andere software." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Geen softwarebron inbegrepen" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Deze toepassing bevat geen softwarebron en zal niet bijgewerkt worden met " +"nieuwe versies." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "Softwarebron geïdentificeerd" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Door het toevoegen van deze softwarebron krijgt u toegang tot extra software " +"en upgrades." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Gebruik alleen softwarebronnen die u vertrouwt." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Toepassingsgegevens wissen" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "Gegevens v_erwijderen" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Geen metadata" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "Project_website" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "_Doneren" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "Ver_talingen bijdragen" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "P_robleem melden" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "_Hulp" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contact opnemen" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "B_eoordeling schrijven" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Alle beoordelingen" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "Kan toepassingsgegevens niet tonen" + +#: src/gs-dkms-dialog.c:67 +msgid "Failed to prepare reboot" +msgstr "Voorbereiden van herstart mislukt" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "Onbekende fout" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "De sleutel is niet gevonden" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "De sleutel is niet ingeschreven" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Inschrijven van MOK vereist" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "Volge_nde" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Secure Boot is ingeschakeld op dit apparaat. Om nieuwe stuurprogramma’s te " +"installeren moet er een nieuwe sleutel van de machine-eigenaar (MOK) " +"ingeschreven worden. Verder in dit proces wordt daarvoor een wachtwoord " +"vereist. Noteer het volgende wachtwoord dat aan de sleutel verbonden is:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Ik heb het MOK-_wachtwoord genoteerd" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "He_rstarten & inschrijven…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instructies voor gebruik: lees deze instructie zorgvuldig" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Wanneer het apparaat opnieuw opgestart is, zal er een scherm verschijnen om " +"het apparaat in te stellen. Doorloop de volgende stappen om nieuwe " +"stuurprogramma’s in te schakelen:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Selecteer ‘MOK inschrijven’\n" +"• Selecteer ‘Ja’ om de sleutels in te schrijven\n" +"• Voer het MOK-wachtwoord in wanneer het wordt gevraagd\n" +"• Selecteer dan ‘Herstarten’" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Beveilingsrisico’s" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Wanneer de sleutels succesvol ingeschreven zijn, zullen toekomstige updates " +"aan de module of aan andere modules stilzwijgend vertrouwd worden. Alle " +"toekomstige updates zullen transparant gebeuren, zonder interactie of " +"autorisatie." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Verdere uitleg vindt u op de documentatiepagina." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Extra metadatabestanden worden gedownload…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " en " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Beschikbare lettertypes voor het %s-script" +msgstr[1] "Beschikbare lettertypes voor de %s-scripts" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Beschikbare software voor %s" +msgstr[1] "Beschikbare software voor %s" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Gevraagde software niet gevonden" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Gevraagde software niet gevonden" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "%s niet gevonden" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "op de website" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Er zijn geen toepassingen beschikbaar die het bestand %s aanbieden." + +# Ik vraag mij af waar het woord "op" vandaan moet komen (op %s). +# Van de entry die hier 2 boven staat - Justin +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informatie over %s en opties voor het verkrijgen van ontbrekende " +"toepassingen kunnen mogelijk gevonden worden %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "Er zijn geen toepassingen beschikbaar die %s ondersteunen." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "%s is niet beschikbaar." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informatie over %s en opties voor het verkrijgen van een toepassing die dit " +"formaat ondersteunt kunnen mogelijk gevonden worden %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "" +"Er zijn geen lettertypes beschikbaar voor ondersteuning van het %s-script." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informatie over %s en opties voor het verkrijgen van extra lettertypes " +"kunnen mogelijk gevonden worden %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Geen add-on-codecs beschikbaar voor het formaat %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informatie over %s en opties voor het verkrijgen van een codec die dit " +"formaat kan afspelen kunnen mogelijk gevonden worden %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Geen Plasma-bronnen beschikbaar die %s ondersteunen." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informatie over %s en opties voor het verkrijgen van extra Plasma-bronnen " +"kunnen gevonden worden %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Geen printerstuurprogramma’s beschikbaar voor %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informatie over %s en opties voor het verkrijgen van een stuurprogramma dat " +"deze printer ondersteunt kunnen gevonden worden %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "de documentatie" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"%s gevraagd door %s kon niet gevonden worden. Zie %s voor meer informatie." +msgstr[1] "" +"%s gevraagd door %s konden niet gevonden worden. Zie %s voor meer informatie." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"%s waar u naar zocht kon niet gevonden worden. Zie %s voor meer informatie." +msgstr[1] "" +"%s waar u naar zocht konden niet gevonden worden. Zie %s voor meer " +"informatie." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Geen zoekresultaten gevonden: %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "%s bestandsformaat" + +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "_Alles installeren" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "Gevraagde software kon niet gevonden worden" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Codecs-pagina" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "Geen resultaten gevonden" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "Kan zoekopdracht niet uitvoeren" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Vorige" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Volgende" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Lijst met aanbevolen toepassingen" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Bureaubladondersteuning" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Kan gebruikt worden op een groot scherm" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Bureaubladondersteuning onbekend" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Onvoldoende informatie om te weten of grote schermen ondersteund worden" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Vereist een groot scherm" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Bureaublad niet ondersteund" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Kan niet gebruikt worden op een groot scherm" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobiele ondersteuning" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Kan gebruikt worden op een klein scherm" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobiele ondersteuning onbekend" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Onvoldoende informatie om te weten of kleine schermen ondersteund worden" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Vereist een klein scherm" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobiel niet ondersteund" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Kan niet gebruikt worden op een klein scherm" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Toetsenbordondersteuning" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Toetsenbordondersteuning onbekend" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Onvoldoende informatie om te weten of toetsenborden ondersteund worden" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Toetsenbord vereist" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Ondersteunt toetsenborden" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Toetsenbord niet ondersteund" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Kan niet gebruikt worden met een toetsenbord" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Muisondersteuning" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Vereist een muis of aanwijsapparaat" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Muisondersteuning onbekend" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Onvoldoende informatie om te weten of muizen of aanwijsapparaten ondersteund " +"worden" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Muis vereist" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Ondersteunt muizen en aanwijsapparaten" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Muis niet ondersteund" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Kan niet gebruikt worden met een muis of aanwijsapparaat" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Aanraakschermondersteuning" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Aanraakschermondersteuning onbekend" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Onvoldoende informatie om te weten of aanraakschermen ondersteund worden" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Aanraakscherm vereist" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Ondersteunt aanraakschermen" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Aanraakscherm niet ondersteund" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Kan niet gebruikt worden met een aanraakscherm" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Gamepad vereist" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Vereist een gamepad" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Gamepadondersteuning" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Ondersteunt gamepads" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s werkt waarschijnlijk op dit apparaat" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s werkt op dit apparaat" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s werkt mogelijk op dit apparaat" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s zal niet correct werken op dit apparaat" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s zal niet werken op dit apparaat" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Hardwareondersteuning" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigatie" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Ga naar pagina Ontdekken" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Ga naar pagina Geïnstalleerd" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Ga naar pagina Updates" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Zoekbalk openen" + +# of Windows? - Nathan +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Vensters" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Voorkeuren openen" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Softwarebronnen openen" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Hulp" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Sneltoetsen openen" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Geïnstalleerd" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Geïnstalleerd-pagina" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "In behandeling" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Toepassingen" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "Webtoepassingen" + +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "Systeemtoepassingen" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Gemaakt door de gemeenschap" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Help mee" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Deze toepassing wordt openbaar ontwikkeld door een internationale " +"gemeenschap, en wordt uitgegeven onder de %s-licentie.\n" +"\n" +"U kunt meehelpen en de toepassing zo nog beter maken." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Deze toepassing wordt openbaar ontwikkeld door een internationale " +"gemeenschap, en wordt uitgegeven onder de %s-licentie.\n" +"\n" +"U kunt meehelpen en de toepassing zo nog beter maken." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Deze software wordt openbaar ontwikkeld door een internationale gemeenschap, " +"en wordt uitgegeven onder de %s-licentie.\n" +"\n" +"U kunt meehelpen en de software zo nog beter maken." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Deze software wordt openbaar ontwikkeld door een internationale gemeenschap, " +"en wordt uitgegeven onder de %s-licentie.\n" +"\n" +"U kunt meehelpen en de software zo nog beter maken." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Onbekende licentie" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Meer informatie" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Deze toepassing vermeldt niet onder welke licentie ze ontwikkeld wordt, en " +"is mogelijk propriëtair. De toepassing kan onveilig zijn op manieren die " +"moeilijk te detecteren zijn, en kan veranderen zonder dat er toezicht op " +"is.\n" +"\n" +"Misschien kunt u bijdragen aan de toepassing, misschien niet." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Deze software vermeldt niet onder welke licentie hij ontwikkeld wordt, en is " +"mogelijk propriëtair. De software kan onveilig zijn op manieren die moeilijk " +"te detecteren zijn, en kan veranderen zonder dat er toezicht op is.\n" +"\n" +"Misschien kunt u bijdragen aan deze software, misschien niet." + +# Ik heb toch maar gekozen voor Bedrijfseigen i.p.v. proriëtair. - Hannie +# ‘Proprietary’ is het tegenovergestelde van ‘free’ en is dus een synoniem van ‘nonfree’; in dit geval is het het meest logisch om in het Nederlands te kiezen voor ‘niet-vrij’. Niet-vrije software hoeft niet door een bedrijf ontwikkeld te zijn. - Justin +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Niet-vrij" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Deze toepassing wordt niet openbaar ontwikkeld, dus enkel de ontwikkelaars " +"weten hoe het werkt. De toepassing kan onveilig zijn op manieren die " +"moeilijk te detecteren zijn, en kan veranderen zonder dat er toezicht op " +"is.\n" +"\n" +"Misschien kunt u bijdragen aan de toepassing, misschien niet." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Deze software wordt niet openbaar ontwikkeld, dus enkel de ontwikkelaars " +"weten hoe het werkt. De software kan onveilig zijn op manieren die moeilijk " +"te detecteren zijn, en kan veranderen zonder dat er toezicht op is.\n" +"\n" +"U kunt waarschijnlijk niet meehelpen aan de ontwikkeling van deze software." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Speciale licentie" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Deze toepassing wordt ontwikkeld onder de speciale licentie %s.\n" +"\n" +"Misschien kunt u bijdragen aan de toepassing, misschien niet." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Deze toepassing wordt ontwikkeld onder de speciale licentie ‘%s’.\n" +"\n" +"Misschien kunt u bijdragen aan de toepassing, misschien niet." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Deze software wordt ontwikkeld onder de speciale licentie %s.\n" +"\n" +"Misschien kunt u bijdragen aan de toepassing, misschien niet." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Deze software wordt ontwikkeld onder de speciale licentie ‘%s’.\n" +"\n" +"Misschien kunt u bijdragen aan deze software, misschien niet." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Gegevens worden vernieuwd" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Laden-pagina" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Opstarten" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Onbekende bron" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Bèta" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Aanvullingen" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Verwijderingen" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Updates" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Neerwaarderingen" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "geselecteerde externe bronnen" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Geeft toegang tot extra software van %s. Bevat ook sommige propriëtaire " +"software.\n" +"\n" +"U kunt deze softwarebronnen ook later inschakelen via de voorkeuren voor " +"Softwarebronnen." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Softwarebronnen van derden inschakelen?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "_Negeren" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Inschakelen" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "Beschikbaar voor uw besturingssysteem" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "Beschikbaar voor %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Verkennen" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Overzicht-pagina" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Beschikbare toepassingen" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Overige categorieën" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Geen toepassingsgegevens gevonden" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Onbekend" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Oké" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Gebruikt heeft installatie afgewezen" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s voorbereiden" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Weet u zeker dat u de softwarebron %s wilt verwijderen?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Alle toepassingen van %s zullen verwijderd worden en u zult de softwarebron " +"opnieuw moeten installeren om ze weer te kunnen gebruiken." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 +#: src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "%s verwijderen?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Wanneer u %s verwijdert zult u het niet meer kunnen gebruiken." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Wanneer u %s verwijdert zult u toepassing die er gebruik van maken niet meer " +"kunnen gebruiken." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Wanneer u %s verwijdert zult u het niet meer kunnen gebruiken, en documenten " +"die er gebruik van maken zullen in een ander lettertype verschijnen." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Wanneer u %s verwijdert zult u het niet meer kunnen gebruiken. Dit betekent " +"dat sommige mediabestanden niet meer afgespeeld zullen kunnen worden." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Hardware die gebruik maakt van %s zal misschien niet meer correct werken " +"wanneer u het verwijdert." + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "Toepassingsinstellingen en -gegevens" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:667 +msgid "_Keep" +msgstr "_Behouden" + +#: src/gs-page.c:673 +msgid "Allows restoring app settings and content" +msgstr "Laat herstellen van toepassingsinstellingen en -inhoud toe" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:682 +msgid "_Delete" +msgstr "Verwij_deren" + +#: src/gs-page.c:688 +msgid "Permanently deletes data to save disk space" +msgstr "Verwijdert gegevens voorgoed om schijfruimte te besparen" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:696 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Wanneer u %s verwijdert zult u het niet meer kunnen gebruiken. " +"Toepassingsgegevens en -instellingen worden bewaard op de schijf om de " +"toepassing in de toekomst te kunnen herstellen." + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:710 +msgid "_Uninstall" +msgstr "Verwij_deren" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Voorkeuren" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Software-updates" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "Meer informatie" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Controleren op updates en ze downloaden verbruikt gegevens en stroom. Daarom " +"worden de functies voor automatische updates gepauzeerd wanneer u een " +"verbinding met datalimiet gebruikt, en wanneer de energiebesparingsmodus " +"ingeschakeld is." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatisch" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Automatisch controleren op updates en ze downloaden" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "Hand_matig" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Controleren op updates en ze downloaden moet handmatig gebeuren" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Meldi_ngen over automatische updates" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Melden wanneer updates automatisch geïnstalleerd zijn" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Inhoudsfilters" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Enkel _vrije software tonen" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Verberg propriëtaire software bij het bladeren en zoeken" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Enkel ge_verifieerde ontwikkelaars tonen" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Enkel toepassingen van ontwikkelaars met een geverifieerde identiteit " +"weergeven" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"De geïnstalleerde software is niet compatibel met %s, en wordt automatisch " +"verwijderd bij het opwaarderen." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Incompatibele software" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Opwaardering" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Software die vanuit ‘%s’ is geïnstalleerd zal geen updates meer ontvangen." + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Softwarebron uitschakelen?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Softwarebron verwijderen?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "_Uitschakelen" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:266 +msgid "_Remove" +msgstr "_Verwijderen" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Nieuwe softwarebronnen inschakelen" + +#: src/gs-repos-dialog.c:612 +msgid "Turn on new repositories when they are added" +msgstr "Schakel nieuwe softwarebronnen in wanneer ze toegevoegd worden" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "meer informatie" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Aanvullende softwarebronnen van geselecteerde derde partijen — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Fedora-softwarebronnen van derden" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "het besturingssysteem" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Deze softwarebronnen leveren de standaardsoftware vanuit %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Softwarebronnen" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "Geen softwarebronnen" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u toepassing geïnstalleerd" +msgstr[1] "%u toepassingen geïnstalleerd" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u add-on geïnstalleerd" +msgstr[1] "%u add-ons geïnstalleerd" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u toepassing" +msgstr[1] "%u toepassingen" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u add-on" +msgstr[1] "%u add-ons" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s en %s geïnstalleerd" +msgstr[1] "%s en %s geïnstalleerd" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Geïnstalleerde software controleren…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Verwijderen" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Ik haat het" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Vind het niet leuk" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "Het is oké" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Vind het leuk" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Ik hou ervan" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Selecteer een ster om een beoordeling te geven" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Gelieve de tijd te nemen voor het schrijven van de beoordeling" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Kies één of meer sterren voor de beoordeling" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "De samenvatting is te kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "De samenvatting is te lang" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "De beschrijving is te kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "De beschrijving is te lang" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Schrijf een beoordeling" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "Ver_sturen" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Geef een beoordeling, samenvatting en tekst voor de recensie. Gebruik " +"recensies niet om problemen te melden: neem daarvoor rechtstreeks contact op " +"met de ontwikkelaar of met uw ondersteuningsleverancier." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Samenvatting van beoordeling" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "Schrijf een korte beoordeling" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Bekijk welke gegevens er worden verzonden in ons privacybeleid. De volledige naam die aan uw account " +"gekoppeld is zal weergegeven worden." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u beoordeling" +msgstr[1] "%u beoordelingen" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "van 5 sterren" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Onbekend" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:227 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"U kunt beoordelingen rapporteren vanwege misbruik, onbeleefdheid of " +"discriminatie." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:232 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Als een beoordeling is gerapporteerd zal zij worden verborgen totdat het " +"door een beheerder is gecontroleerd." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:237 +msgid "Report Review?" +msgstr "Beoordeling rapporteren?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:242 +msgid "_Report" +msgstr "_Melden" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:258 +msgid "Remove Review?" +msgstr "Beoordeling verwijderen?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:261 +msgid "Removing a review cannot be undone." +msgstr "Een beoordeling verwijderen kan niet ongedaan gemaakt worden." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Akkoord" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Niet akkoord" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Rapporteren…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Verwijderen…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"De toepassing bevindt zich niet in een zandbak, maar de distributie heeft " +"nagekeken dat deze niet kwaadwillend is" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Kijk na of u de leverancier vertrouwt, want de toepassing bevindt zich niet " +"in een zandbak" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Geen toegangsrechten" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Toepassing bevindt zich volledig in een zandbak" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Netwerktoegang" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Heeft toegang tot het internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Geen netwerktoegang" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Heeft geen toegang tot het internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Gebruikt systeemdiensten" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Kan gegevens opvragen van systeemdiensten" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Gebruikt sessiediensten" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Kan gegevens opvragen van sessiediensten" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Gebruikerstoegang tot apparaat" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Kan toegang verkrijgen tot apparaten zoals webcams of spelcontrollers" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Geen gebruikerstoegang tot apparaat" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Kan geen toegang verkrijgen tot apparaten zoals webcams of spelcontrollers" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Toegang tot invoerapparaten" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Toegang tot microfoon" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "Kan naar microfoons luisteren zonder toestemming te vragen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Systeemtoegang tot apparaat" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Heeft toegang tot systeemapparaten die verhoogde toegangsrechten vereisen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Toegang tot scherminhoud" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Kan de inhoud van het scherm of andere vensters benaderen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Verouderd venstersysteem" + +# Kan beter - Nathan +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Willekeurige toegangsrechten" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Gebruikersinstellingen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Lees- en schrijftoegang tot volledig bestandssysteem" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Kan alle gegevens op het bestandssysteem lezen en schrijven" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Lees- en schrijftoegang tot persoonlijke map" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Kan alle gegevens in uw persoonlijke map lezen en schrijven" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Leestoegang tot volledig bestandssysteem" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Kan alle gegevens op het bestandssysteem lezen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Leestoegang tot persoonlijke map" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Kan alle gegevens in uw persoonlijke map lezen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Lees- en schrijftoegang tot downloadmap" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Kan alle gegevens in uw downloadmap lezen en schrijven" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Leestoegang tot downloadmap" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Kan alle gegevens in uw downloadmap lezen" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Kan alle gegevens in de map lezen en schrijven" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Kan alle gegevens in de map lezen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Geen toegang tot bestandssysteem" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Heeft geen enkele toegang tot het bestandssysteem" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Toepassingsontwikkelaar is geverifieerd" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"De ontwikkelaar van deze toepassing is geverifieerd en is geen imitator" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Onveilige afhankelijkheden" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Deze software of de afhankelijkheden ervan worden niet meer ondersteund en " +"kunnen onveilig zijn" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Deze toepassing vermeldt niet onder welke licentie ze ontwikkeld wordt, en " +"is mogelijk propriëtair" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Deze software vermeldt niet onder welke licentie hij ontwikkeld wordt, en is " +"mogelijk propriëtair" + +# Ik heb toch maar gekozen voor Bedrijfseigen i.p.v. proriëtair. - Hannie +# ‘Proprietary’ is het tegenovergestelde van ‘free’ en is dus een synoniem van ‘nonfree’; in dit geval is het het meest logisch om in het Nederlands te kiezen voor ‘niet-vrij’. Niet-vrije software hoeft niet door een bedrijf ontwikkeld te zijn. - Justin +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Propriëtaire code" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"De broncode is niet openbaar, kan dus niet onafhankelijk gecontroleerd " +"worden en is mogelijk onveilig" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Deze toepassing wordt ontwikkeld onder de speciale licentie ‘%s’" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Deze software wordt ontwikkeld onder de speciale licentie ‘%s’" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Controleerbare code" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"De broncode is openbaar en kan onafhankelijk gecontroleerd worden, waardoor " +"het waarschijnlijker is dat de toepassing veilig is" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s is geprivilegieerd" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s is veilig" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s is waarschijnlijk veilig" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s is mogelijk onveilig" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s is onveilig" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Onbekend" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Veiligheid" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licentie" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "Bron" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Deze toepassing maakt gebruik van een verouderde versie van het " +"softwareplatform (SDK) en bevat mogelijk fouten of beveiligingsrisico’s die " +"niet meer opgelost zullen worden." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Vorige schermafdruk" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Volgende schermafdruk" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Geen schermafdrukken" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Schermafdruk niet gevonden" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Laden van afbeelding mislukt" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Schermafdrukgrootte niet gevonden" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Cache kon niet worden aangemaakt" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Schermafdruk ongeldig" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Schermafdruk niet beschikbaar" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Schermafdruk" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "nog %u resultaat" +msgstr[1] "nog %u resultaten" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Zoek-pagina" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Zoeken naar toepassingen" + +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "Geen toepassing gevonden" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "‘%s’" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Downloaden van updates mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "Downloaden van firmware-updates mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Downloaden van firmware-updates van %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Downloaden van updates van %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "Bijwerken mislukt: internettoegang vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "Bijwerken mislukt: niet genoeg schijfruimte" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Downloaden van updates van %s mislukt: niet genoeg schijfruimte" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "Bijwerken mislukt: authenticatie vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "Bijwerken mislukt: authenticatie ongeldig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "Bijwerken mislukt: toestemming vereist" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Downloaden van updates mislukt: u heeft niet de rechten om software te " +"installeren" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Verkrijgen van lijst met updates mislukt" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "Installatie mislukt: download mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Installatie van %s mislukt: downloaden van %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Installatie van %s mislukt: download mislukt" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "Installatie mislukt: runtime ontbreekt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Installatie van %s mislukt: runtime %s niet beschikbaar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "Installeren van %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "Installatie mislukt: internettoegang vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "Installatie mislukt: ongeldig toepassingsformaat" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "Installatie mislukt: niet genoeg schijfruimte" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Installatie van %s mislukt: niet genoeg schijfruimte" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "Installatie mislukt: authenticatie vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Installatie van %s mislukt: authenticatie vereist" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "Installatie mislukt: authenticatie ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Installatie van %s mislukt: authenticatie ongeldig" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "Installatie mislukt: toestemming vereist" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Installatie van %s mislukt: toestemming vereist" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "Installatie mislukt: apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "" +"Installatie van %s mislukt: apparaat moet aangesloten zijn op netstroom" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "Installatie mislukt: accuniveau te laag" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Installatie van %s mislukt: accuniveau te laag" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Bijwerken van %s mislukt: downloaden van %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Bijwerken van %s mislukt: download mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Installatie van updates van %s mislukt: download mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "Bijwerken mislukt: download mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Bijwerken van %s mislukt: niet genoeg schijfruimte" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Bijwerken van %s mislukt: authenticatie vereist" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Bijwerken van %s mislukt: authenticatie ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Bijwerken van %s mislukt: toestemming vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "Bijwerken mislukt: apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Bijwerken van %s mislukt: apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "Bijwerken mislukt: accuniveau te laag" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Bijwerken van %s mislukt: accuniveau te laag" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "Bijwerken van %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "Bijwerken mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Opwaarderen mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%s opwaarderen van %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "Opwaarderen mislukt: download mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Opwaarderen naar %s mislukt: download mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "Opwaarderen mislukt: internettoegang vereist" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Opwaarderen naar %s mislukt: internettoegang vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "Opwaarderen mislukt: niet genoeg schijfruimte" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Opwaarderen naar %s mislukt: niet genoeg schijfruimte" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "Opwaarderen mislukt: authenticatie vereist" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Opwaarderen naar %s mislukt: authenticatie vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "Opwaarderen mislukt: authenticatie ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Opwaarderen naar %s mislukt: authenticatie ongeldig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "Opwaarderen mislukt: toestemming vereist" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Opwaarderen naar %s mislukt: toestemming vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Opwaarderen mislukt: apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Opwaarderen naar %s mislukt: apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "Opwaarderen mislukt: accuniveau te laag" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Opwaarderen naar %s mislukt: accuniveau te laag" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Opwaarderen naar %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "Verwijderen mislukt: authenticatie vereist" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Verwijderen van %s mislukt: authenticatie vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +msgid "Unable to uninstall: invalid authentication" +msgstr "Verwijderen mislukt: authenticatie ongeldig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Verwijderen van %s mislukt: authenticatie ongeldig" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "Verwijderen mislukt: toestemming vereist" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Verwijderen van %s mislukt: toestemming vereist" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Verwijderen mislukt: apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "" +"Verwijderen van %s mislukt: apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "Verwijderen mislukt: accuniveau te laag" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Verwijderen van %s mislukt: accuniveau te laag" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Kan %s niet verwijderen" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "Kan %s niet starten" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "Helaas, er ging iets mis" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Starten van %s mislukt: %s is niet geïnstalleerd" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "Niet genoeg schijfruimte om bewerking uit te voeren" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "Installatie mislukt: bestandstype niet ondersteund" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "Installatie mislukt: authenticatie mislukt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Installatie mislukt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "Contact opnemen met %s mislukt" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "Herstart Software om nieuwe plug-ins te gebruiken" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "Apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Accuniveau is te laag" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "Over Software" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "_Softwarebronnen" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "Snel_toetsen" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_Voorkeuren" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Zoeken" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Hoofdmenu" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Toepassingen zoeken" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "V_erkennen" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Geïnstalleerd" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Updates" + +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "Ga terug" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Geen" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Toepassingsgegevens" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Gegevens vereist voor het uitvoeren van de toepassing" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Gebruikersgegevens" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Gegevens die door u in de toepassing aangemaakt zijn" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Cachegegevens" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Tijdelijk gecachete gegevens" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "De toepassing zelf" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Vereiste afhankelijkheden" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Gedeelde systeemonderdelen die door deze toepassing vereist worden" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Onbekend" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Gecachete gegevens kunnen gewist worden vanuit de toep_assingsinstellingen" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Opslag" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (geïnstalleerd)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (wordt geïnstalleerd)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (downloaden)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (wordt verwijderd)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Gegevens" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "Ond_erzoeken" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Geïnstalleerd op %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "Geïnstalleerde updates" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "Geen updates geïnstalleerd" + +#: src/gs-update-monitor.c:215 +msgid "Updates Are Out of Date" +msgstr "Updates zijn verouderd" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "Gelieve te controleren of er updates beschikbaar zijn" + +#: src/gs-update-monitor.c:222 +msgid "Critical Updates Ready to Install" +msgstr "Kritieke updates klaar voor installatie" + +#: src/gs-update-monitor.c:223 +msgid "Install critical updates as soon as possible" +msgstr "Installeer kritieke updates zo snel mogelijk" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "Kritieke updates beschikbaar om te downloaden" + +#: src/gs-update-monitor.c:227 +msgid "Download critical updates as soon as possible" +msgstr "Download kritieke updates zo snel mogelijk" + +#: src/gs-update-monitor.c:233 +msgid "Updates Ready to Install" +msgstr "Updates klaar voor installatie" + +#: src/gs-update-monitor.c:234 +msgid "Software updates are ready and waiting" +msgstr "Software-updates staan klaar" + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "Updates beschikbaar om te downloaden" + +#: src/gs-update-monitor.c:241 +msgid "Software updates can be downloaded" +msgstr "Software-updates kunnen gedownload worden" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u toepassing bijgewerkt — herstarten vereist" +msgstr[1] "%u toepassingen bijgewerkt — herstarten vereist" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u toepassing bijgewerkt" +msgstr[1] "%u toepassingen bijgewerkt" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "%s is bijgewerkt." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "Herstart de toepassing." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s en %s zijn bijgewerkt." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u toepassing vereist een herstart." +msgstr[1] "%u toepassingen vereisen een herstart." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Bevat %s, %s en %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "Systeem is nu end-of-life" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +msgid "Upgrade to continue receiving updates" +msgstr "Opwaardeer uw systeem om updates te blijven ontvangen" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Er is een nieuwe versie van %s beschikbaar voor installatie" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "Software-upgrade beschikbaar" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "Software-updates mislukt" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "Prepared updates were not installed" +msgstr "De voorbereide updates zijn niet geïnstalleerd" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Gegevens tonen" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Systeemupgrade voltooid" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Welkom bij %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Software-update geïnstalleerd" +msgstr[1] "Software-updates geïnstalleerd" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Er is een belangrijke systeemupdate geïnstalleerd." +msgstr[1] "Belangrijke systeemupdates zijn geïnstalleerd." + +# in de zin van: Bekijk updates (die zijn geïnstalleerd) +# Ik maak er "Bekijken" van als knoptitel - Hannie +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Bekijken" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "Bijwerken mislukt" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "Het systeem was al bijgewerkt." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "De update is geannuleerd." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Internettoegang is vereist maar was niet beschikbaar. Zorg ervoor dat u " +"internettoegang heeft en probeer het opnieuw." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Er zijn veiligheidsproblemen met de update. Gelieve uw softwareleverancier " +"te raadplegen voor meer details." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Er is niet genoeg opslagruimte. Maak wat ruimte vrij en probeer het opnieuw." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Het spijt ons: de update kon niet geïnstalleerd worden. Wacht op een andere " +"update en probeer het dan opnieuw. Als het probleem zich blijft voordoen, " +"neem dan contact op met uw softwareleverancier." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Laatst gecontroleerd: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Stoppen" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Controleren op updates" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s krijgt geen kritieke softwareupdates meer" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Uw besturingssysteem krijgt geen kritieke softwareupdates meer" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Er kunnen kosten aan verbonden zijn" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Er zijn mogelijk kosten aan verbonden wanneer u via mobiele breedband " +"controleert op updates." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Toch controleren" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Software-upgrades gedownload" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Upgrades zijn klaar voor installatie" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "Controleren op updates" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Updates" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Updates-pagina" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "Updates laden" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "Dit kan even duren" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "Up-to-date" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "Mobiele gegevens gebruiken?" + +#: src/gs-updates-page.ui:232 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Er zijn mogelijk kosten aan verbonden wanneer u via mobiele breedband " +"controleert op updates" + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "Toch _controleren" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "Geen verbinding" + +#: src/gs-updates-page.ui:255 +msgid "Go online to check for updates" +msgstr "Ga online om te controleren op updates" + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "_Netwerkinstellingen" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "Fout" + +#: src/gs-updates-page.ui:293 +msgid "Updates are automatically managed" +msgstr "Updates worden automatisch beheerd" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Software-updates gepauzeerd" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automatische software-updates zijn gepauzeerd voor de volgende redenen:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• De huidige netwerkverbinding heeft een datalimiet" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• De huidige netwerkverbinding verbiedt grote downloads" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Energiebesparingsmodus is actief" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Spelmodus is actief" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Software-updates gepauzeerd" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Netwerkverbinding met datalimiet — software-updates gepauzeerd" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Netwerkverbinding verbiedt grote downloads — software-updates gepauzeerd" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Energiebesparingsmodus is actief — software-updates gepauzeerd" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Spelmodus is actief — software-updates gepauzeerd" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:321 +msgid "_Restart & Update…" +msgstr "He_rstarten & bijwerken…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:327 +msgid "U_pdate All" +msgstr "Alles _bijwerken" + +#: src/gs-updates-section.c:404 +msgid "Software Updates Downloaded" +msgstr "Software-updates gedownload" + +#: src/gs-updates-section.c:405 +msgid "Updates are ready to be installed" +msgstr "Updates zijn klaar voor installatie" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:496 +msgid "Integrated Firmware" +msgstr "Geïntegreerde firmware" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:501 +msgid "Requires Restart" +msgstr "Herstart vereist" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:506 +msgid "App Updates" +msgstr "Toepassingsupdates" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:511 +msgid "Device Firmware" +msgstr "Apparaatfirmware" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Downloaden" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s is beschikbaar" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s is beschikbaar" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Kom meer te weten over de nieuwe versie" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s van %s gedownload" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% gedownload" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Een belangrijke upgrade, met nieuwe functies en toegevoegde extra’s." + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "He_rstarten & opwaarderen…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Denk eraan een reservekopie van uw gegevens en bestanden te maken voordat u " +"opwaardeert." + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Kon bestand ‘%s’ niet verwijderen: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Kon map ‘%s’ niet verwijderen: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Software op deze computer toevoegen, verwijderen of bijwerken" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Bronnen;Repositories;Preferences;Voorkeuren;Install;" +"Installeren;Uninstall;Verwijderen;Program;Programma;Software;App;Toepassing;" +"Applicatie;Store;Winkel;Pakketbronnen;Softwarebronnen;Broncode;Opslagbronnen;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s is klaar" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"%s is klaar om ingeschakeld te worden wanneer u het apparaat de volgende " +"keer opstart." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Inschakelen" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3170 +msgid "System Updates" +msgstr "Systeemupdates" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3175 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Algemene systeemupdates, zoals beveiligings- en probleemoplossingsupdates, " +"en prestatieverbeteringen." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s-update met nieuwe functies en verbeteringen." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS-updateservice kan de update niet ophalen en toepassen." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Webtoepassing" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Ondersteuning voor webtoepassingen" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Voer populaire webtoepassingen uit in een browser" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Upgrade voor de nieuwste functies en verbeteringen in prestaties en " +"stabiliteit." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak-ondersteuning" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak is een raamwerk voor bureaubladtoepassingen op Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Systeemmap %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Persoonlijke submap %s" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Systeemmappen van host" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "Systeemconfiguratie van host in /etc" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Bureaublad-map" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Bureaublad-submap %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Documenten-map" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Documenten-submap %s" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Muziek-map" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Muziek-submap %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Afbeeldingen-map" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Afbeeldingen-submap %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Openbaar-map" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Openbaar-submap %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Video’s-map" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Video’s-submap %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Sjablonen-map" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Sjablonen-submap %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Cachemap van gebruiker" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Cache-submap %s van gebruiker" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Configuratiemap van gebruiker" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Configuratie-submap %s van gebruiker" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Gegevensmap van gebruiker" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Gegevens-submap %s van gebruiker" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Runtime-map van gebruiker" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Runtime-submap %s van gebruiker" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Toegang tot %s in bestandssysteem" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Flatpak-metadata voor %s worden opgehaald…" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Add-on ‘%s’ kan niet verfijnd worden: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Gebruikersinstallatie" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Systeeminstallatie" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "Toepassings-ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Toevoegen om te installeren van add-on ‘%s’ is mislukt: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Toevoegen om te verwijderen van add-on ‘%s’ is mislukt: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Externe server ‘%s’ verhindert de installatie van ‘%s’, mogelijk door de " +"filter. Verwijder de filter en herhaal de installatie. Gedetailleerde " +"foutmelding: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Systeem heeft onvoldoende stroom om de update uit te voeren" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Systeem heeft onvoldoende stroom om de update uit te voeren (%u%%, maar " +"heeft %u%% nodig)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Apparaat is onbereikbaar of buiten draadloos bereik" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Accuniveau van apparaat is te laag" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Accuniveau van apparaat is te laag (%u%%, maar heeft %u%% nodig)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Apparaat wacht op de installatie van de update" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Apparaat moet aangesloten zijn op netstroom" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Apparaat kan niet gebruikt worden terwijl het deksel gesloten is" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s Device Update" +msgstr "Apparaatupdate voor %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s System Update" +msgstr "Systeemupdate voor %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Update voor embedded controller %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s ME Update" +msgstr "Update voor ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Update voor bedrijfs-ME %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:238 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Update voor consument-ME %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:244 +#, c-format +msgid "%s Controller Update" +msgstr "Update voor controller %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Update voor Thunderbolt-controller %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Update voor CPU-microcode %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:260 +#, c-format +msgid "%s Configuration Update" +msgstr "Update voor configuratie %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Battery Update" +msgstr "Update voor batterij %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:269 +#, c-format +msgid "%s Camera Update" +msgstr "Update voor camera %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:273 +#, c-format +msgid "%s TPM Update" +msgstr "Update voor TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:277 +#, c-format +msgid "%s Touchpad Update" +msgstr "Update voor touchpad %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:281 +#, c-format +msgid "%s Mouse Update" +msgstr "Update voor muis %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:285 +#, c-format +msgid "%s Keyboard Update" +msgstr "Update voor toetsenbord %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Update voor opslagcontroller %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Network Interface Update" +msgstr "Update voor netwerkinterface %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s Display Update" +msgstr "Update voor scherm %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s BMC Update" +msgstr "Update voor BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:309 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Update van USB-ontvanger voor %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:313 +#, c-format +msgid "%s Drive Update" +msgstr "Update voor schijf %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Update voor USB-stick %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s SSD Update" +msgstr "Update voor SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s GPU Update" +msgstr "Update voor GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s Dock Update" +msgstr "Update voor dock %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:337 +#, c-format +msgid "%s USB Dock Update" +msgstr "Update voor USB-dock %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1922 +msgid "Firmware update could not be applied: " +msgstr "Firmware-update kon niet toegepast worden: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Ondersteuning voor opwaarderen van firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Biedt ondersteuning voor het opwaarderen van firmware" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Niet-ondertekende software installeren?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"De te installeren softwaren is niet ondertekend. Het zal niet mogelijk zijn " +"om de oorsprong van updates aan deze software te verifiëren, of na te gaan " +"of er met de updates geknoeid is." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Niet-ondertekende software downloaden?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Er zijn niet-ondertekende updates beschikbaar. Zonder ondertekening is het " +"onmogelijk te oorsprong van de update te verifiëren, of na te gaan of er met " +"de update geknoeid is." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Niet-ondertekende software bijwerken?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Er zijn niet-ondertekende updates beschikbaar. Zonder ondertekening is het " +"onmogelijk te oorsprong van de update te verifiëren, of na te gaan of er met " +"de update geknoeid is. Updates voor deze software zullen uitgeschakeld " +"worden totdat de niet-ondertekende updates verwijderd of bijgewerkt zijn." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Kon updates niet installeren: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pakketten" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1436 +msgid "Failed to wait on transaction end before download: " +msgstr "Wachten op einde van transactie voor download is mislukt: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1443 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1456 +msgid "Failed to download updates: " +msgstr "Downloaden van updates mislukt: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1495 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1505 +msgid "Failed to trigger update: " +msgstr "Starten van update mislukt: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3270 +msgid "Operating System (OSTree)" +msgstr "Besturingssysteem (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap-winkel" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap-ondersteuning" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Een snap is een universeel Linux-pakket" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Een prettige manier om de software op uw systeem te beheren." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Voer een getal in van 1 tot %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Kies een toepassing:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s is nu geïnstalleerd" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Een toepassing is verwijderd" +#~ msgstr[1] "Toepassingen zijn verwijderd" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "‘%s’ niet gevonden" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Softwarecatalogus downloaden" + +# Moet dit niet ‘pagina modereren’ zijn? +#~ msgid "Moderate page" +#~ msgstr "Modereren-pagina" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Er zijn geen beoordelingen om te modereren" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Was deze beoordeling nuttig voor u?" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgid "No" +#~ msgstr "Nee" + +#~ msgid "Meh" +#~ msgstr "Een beetje" + +#~ msgid "Outdated SDK version" +#~ msgstr "Verouderde SDK-versie" + +#~ msgid "Unable to install updates" +#~ msgstr "Installeren van updates mislukt" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Verwijderen mislukt: authenticatie ongeldig" + +#~ msgid "Network Settings" +#~ msgstr "Netwerkinstellingen" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Updates voor besturingssysteem niet beschikbaar" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "De installatie van een belangrijke systeemupdate is mislukt." + +#~ msgid "No Network" +#~ msgstr "Geen netwerk" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Internettoegang is vereist voor het controleren op updates." + +#~ msgid "Network _Settings" +#~ msgstr "Netwerkin_stellingen" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Software-upgrades zijn gedownload en klaar voor installatie." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Software-updates zijn gedownload en klaar voor installatie." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Opwaarderingsinformatie wordt gedownload…" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Een belangrijke software-update staat klaar voor installatie." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Belangrijk: kritieke software-updates staan klaar." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Gelieve klaarstaande software-updates te downloaden." + +#~ msgid "Show verbose debugging information" +#~ msgstr "Gedetailleerde foutopsporingsinformatie tonen" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Heeft toegang tot alle bestanden" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automatische updates gepauzeerd" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an un­metered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been in­correctly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "Het huidige netwerk heeft een datalimiet. Netwerken met een datalimiet " +#~ "brengen doorgaans kosten met zich mee. Om data te besparen zijn " +#~ "automatische updates gepauzeerd.\n" +#~ "\n" +#~ "Automatische updates worden hervat zodra er een netwerk zonder datalimiet " +#~ "beschikbaar is. U kunt tot dan nog altijd handmatig updates installeren.\n" +#~ "\n" +#~ "Als het huidige netwerk verkeerdelijk geïdentificeerd is als netwerk met " +#~ "een datalimiet, kan deze instelling aangepast worden." + +#~ msgid "Open Network _Settings" +#~ msgstr "Netwerkin_stellingen openen" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Weet u zeker dat u %s wilt verwijderen?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s zal verwijderd worden en u zult het opnieuw moeten installeren om het " +#~ "te gebruiken." + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Om extra kosten en netwerklimieten te vermijden worden softwareupdates " +#~ "niet automatisch gedownload op mobiele verbindingen en verbindingen met " +#~ "een datalimiet." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Downloadt en installeert softwareupdates op de achtergrond, indien " +#~ "mogelijk" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Enkel _vrije toepassingen tonen" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Toon enkel toepassingen onder een vrije licentie, en verberg alle " +#~ "propriëtaire toepassingen" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Wat vindt u goed aan deze toepassing? Door een beoordeling te geven helpt " +#~ "u anderen." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Downloaden van updates mislukt: internettoegang vereist, maar niet " +#~ "beschikbaar" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Downloaden van updates mislukt: niet genoeg schijfruimte" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Downloaden van updates mislukt: authenticatie vereist" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Downloaden van updates mislukt: authenticatie ongeldig" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Installeren van %s mislukt: u heeft niet de rechten om software te " +#~ "installeren" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Installeren van %s mislukt: accuniveau is te laag" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Installeren van updates mislukt: niet genoeg schijfruimte" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Installeren van updates mislukt: authenticatie vereist" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Installeren van updates mislukt: authenticatie ongeldig" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Bijwerken van %s mislukt: u heeft niet de rechten om software te " +#~ "installeren" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Installeren van updates mislukt: u heeft niet de rechten om software te " +#~ "installeren" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Installeren van updates mislukt: wisselstroomvermogen vereist" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Bijwerken van %s mislukt: accuniveau is te laag" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Installeren van updates mislukt: accuniveau is te laag" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Opwaarderen naar %s mislukt: internettoegang vereist, maar niet " +#~ "beschikbaar" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Opwaarderen naar %s mislukt: u heeft niet de rechten om software te " +#~ "installeren" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Opwaarderen naar %s mislukt: accuniveau is te laag" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Verwijderen van %s mislukt: authenticatie vereist" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Verwijderen van %s mislukt: authenticatie ongeldig" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Verwijderen van %s mislukt: u heeft niet de rechten om software te " +#~ "installeren" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Verwijderen van %s mislukt: wisselstroomvermogen vereist" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Verwijderen van %s mislukt: accuniveau is te laag" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Verwijderen van %s mislukt" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Installeren van bestand mislukt: niet ondersteund" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Installeren mislukt: niet ondersteund" + +#~ msgid "AC power is required" +#~ msgstr "Wisselstroomvermogen vereist" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Verbinding met datalimiet ‒ automatische updates gepauzeerd" + +#~ msgid "Find Out _More" +#~ msgstr "Kom _meer te weten" + +#~ msgid "Downloading featured images…" +#~ msgstr "Afbeeldingen worden gedownload…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "De laatste tijdstempel toen het systeem online was en bijgewerkt werd" + +#~ msgid "_User" +#~ msgstr "Gebr_uiker" + +#~ msgid "An application" +#~ msgstr "Een toepassing" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Deze software is niet beschikbaar in uw taal en zal daarom in het " +#~ "Amerikaans Engels weergegeven worden." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "" +#~ "Geselecteerde add-ons zullen met de toepassing worden geïnstalleerd." + +#~ msgid "Applications" +#~ msgstr "Toepassingen" + +#~ msgid "_Continue" +#~ msgstr "_Doorgaan" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u toepassing" +#~ msgstr[1] "%u toepassingen" + +#~ msgid "Post Review" +#~ msgstr "Beoordeling plaatsen" + +#~ msgid "_Post" +#~ msgstr "_Plaatsen" + +#~ msgid "Rating" +#~ msgstr "Beoordeling" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Geef een korte samenvatting van uw beoordeling, bijvoorbeeld: “Geweldige " +#~ "app, een aanrader”." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Beoordeling" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Wat vindt u van de app? Probeer uw mening nader te verklaren." + +#~ msgid "No screenshot provided" +#~ msgstr "Geen schermafdruk beschikbaar" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Nu herstarten" + +#~ msgid "Primary Menu" +#~ msgstr "Primair menu" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Updates" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s wordt niet meer ondersteund." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Dit betekent dat het geen beveiligingsupdates meer ontvangt." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "" +#~ "Het wordt aanbevolen om uw besturingssysteem bij te werken naar een meer " +#~ "recente versie." + +#~ msgid "Update All" +#~ msgstr "Alles bijwerken" + +#~ msgid "Application Updates" +#~ msgstr "Toepassingsupdates" + +#~ msgid "GNOME Web" +#~ msgstr "Gnome Web" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Er zijn geen updates geïnstalleerd op dit systeem." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Toepassingsbeheer voor Gnome" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "De softwarecatalogus wordt gedownload" + +#~ msgid "Name" +#~ msgstr "Naam" + +#~ msgid "system" +#~ msgstr "systeem" + +#~ msgid "user" +#~ msgstr "gebruiker" + +#~ msgid "Channel" +#~ msgstr "Kanaal" + +#~ msgid "Branch" +#~ msgstr "Branch" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Installatie" + +#~ msgid "Version" +#~ msgstr "Versie" + +#~ msgid "Access arbitrary files" +#~ msgstr "Toegang tot alle bestanden" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Heeft toegang tot alle bestanden op het bestandssysteem" + +#~ msgid "A list of popular applications" +#~ msgstr "Lijst van populaire toepassingen" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Een lijst met te gebruiken toepassingen die de door het systeem " +#~ "gedefinieerde toepassingen overschrijven." + +#~ msgid "Checking…" +#~ msgstr "Controleren…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "De URI die verwijst naar de achtergrond voor een upgradebanier." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "De URI kan tot drie ‘%u’ bevatten, die door de upgradeversie vervangen " +#~ "zullen worden." + +#~ msgid "Loading…" +#~ msgstr "Wordt geladen…" + +#~ msgid "_Add shortcut" +#~ msgstr "Sneltoets _toevoegen" + +#~ msgid "Re_move shortcut" +#~ msgstr "Sneltoets _verwijderen" + +#~ msgid "Welcome" +#~ msgstr "Welkom" + +#~ msgid "Welcome to Software" +#~ msgstr "Welkom bij Software" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Met Software kunt u vanaf één plek alle software installeren die u nodig " +#~ "heeft. Bekijk onze aanbevelingen, doorzoek de categorieën of zoek naar de " +#~ "gewenste toepassingen." + +#~ msgid "_Browse Software" +#~ msgstr "Software _doorbladeren" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Toepassingswaarderingen worden gedownload…" + +#~ msgid "OS Updates" +#~ msgstr "OS-updates" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Inclusief verbeteringen voor prestatie, stabiliteit en veiligheid." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Ondertekening van firmware-update wordt gedownload…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Metadata van firmware-update worden gedownload…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Software heeft onbekende toegangsrechten" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Software komt van een betrouwbare bron" + +#~ msgid "Unknown Permissions" +#~ msgstr "Onbekende toegangsrechten" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "De toegangsrechten vereist door deze toepassing zijn niet bekend" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Toepassing komt van een betrouwbare bron" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "" +#~ "Uw distributie heeft geverifieerd dat deze toepassing vertrouwd kan worden" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "De prompt voor het installeren van niet-vrije softwarebronnen tonen" + +#~ msgid "Select All" +#~ msgstr "Alles selecteren" + +#~ msgid "Select None" +#~ msgstr "Niets selecteren" + +#~ msgid "Featured %s" +#~ msgstr "Aanbevolen %s" + +#~ msgid "Show" +#~ msgstr "Tonen" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Filtermenu voor subcategorieën" + +#~ msgid "Sort" +#~ msgstr "Sorteren" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Sorteermenu voor subcategorieën" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgid "Audio & Video" +#~ msgstr "Audio & video" + +#~ msgid "Developer Tools" +#~ msgstr "Ontwikkelhulpmiddelen" + +#~ msgid "Education & Science" +#~ msgstr "Onderwijs & wetenschap" + +#~ msgid "Games" +#~ msgstr "Spelletjes" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafisch & fotografie" + +#~ msgid "Productivity" +#~ msgstr "Productiviteit" + +#~ msgid "Communication & News" +#~ msgstr "Communicatie & nieuws" + +#~ msgid "Utilities" +#~ msgstr "Hulpprogramma’s" + +#~ msgid "_Read Less" +#~ msgstr "_Minder informatie" + +#~ msgid "_Launch" +#~ msgstr "_Starten" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Kan niet bepalen tot welke delen van het systeem deze toepassing toegang " +#~ "heeft. Dit geldt vaak voor oudere toepassingen." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Nooit" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Laag" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Gemiddeld" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Hoog" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgid "Public domain" +#~ msgstr "Publiek domein" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://nl.wikipedia.org/wiki/Publiek_domein" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw.nl" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Gebruikers zijn gebonden aan de volgende licentie:" +#~ msgstr[1] "Gebruikers zijn gebonden aan de volgende licenties:" + +#~ msgid "Localized in your Language" +#~ msgstr "Vertaald in uw taal" + +# Ik weet niet wat hier met Release bedoeld wordt. Ik laat het maar even onvertaald. +#~ msgid "Release Activity" +#~ msgstr "Uitgave-activiteit" + +#~ msgid "Sandboxed" +#~ msgstr "In een zandbak" + +#~ msgid "Category" +#~ msgstr "Categorie" + +#~ msgid "Free" +#~ msgstr "Vrij" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Dit betekent dat de software vrij kan worden gebruikt, gekopieerd, " +#~ "verspreid, bestudeerd en gewijzigd." + +#~ msgid "Proprietary Software" +#~ msgstr "Niet-vrije software" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Dit betekent dat de software eigendom is van een individu of bedrijf. " +#~ "Vaak zijn er beperkingen met betrekking tot het gebruik ervan en er is " +#~ "meestal geen toegang tot de broncode." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "De licentievoorwaarden van deze software zijn niet bekend." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "De beoordeling van deze toepassing is gebaseerd op:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Er zijn geen details beschikbaar voor deze beoordeling." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Gedeïnstalleerd" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Geïnstalleerd" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Bijgewerkt" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgid "History" +#~ msgstr "Geschiedenis" + +#~ msgid "More…" +#~ msgstr "Meer…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Aanbevolen audio- en videotoepassingen" + +#~ msgid "Recommended Games" +#~ msgstr "Aanbevolen spelletjes" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Aanbevolen grafische toepassingen" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Aanbevolen productiviteitstoepassingen" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Deze software is niet-vrij en er heeft daarom beperkingen met betrekking " +#~ "tot het gebruik, verspreiding, en toegang tot de broncode." + +#~ msgid "Find out more…" +#~ msgstr "Meer te weten komen…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Keuze van de redactie" + +#~ msgid "Recent Releases" +#~ msgstr "Recente uitgaven" + +#~ msgid "Remove “%s”?" +#~ msgstr "‘%s’ verwijderen?" + +#~ msgid "Disable “%s”?" +#~ msgstr "‘%s’ uitschakelen?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Geen aanvullende softwarebronnen" + +#~ msgid "_Remove…" +#~ msgstr "_Verwijderen…" + +#~ msgid "_Disable…" +#~ msgstr "_Uitschakelen…" + +#~ msgid "Disabling" +#~ msgstr "Wordt uitgeschakeld" + +#~ msgid "Enabled" +#~ msgstr "Ingeschakeld" + +#~ msgid "Disabled" +#~ msgstr "Uitgeschakeld" + +#~ msgid "ratings in total" +#~ msgstr "aantal beoordelingen" + +#~ msgid "_Remove All" +#~ msgstr "Alle _verwijderen" + +#~ msgid "Looking for new updates…" +#~ msgstr "Zoeken naar nieuwe updates…" + +#~ msgid "Setting up updates…" +#~ msgstr "Instellen van nieuwe updates…" + +#~ msgid "Software is up to date" +#~ msgstr "Software is up-to-date" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Updates worden toegepast wanneer de computer opnieuw wordt gestart." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Wachten op het downloaden van %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "%s %s wordt gedownload" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "ODRS is een dienst die gebruikersrecensies van toepassingen aanbiedt" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Pakketbron met GNOME Shell-uitbreidingen inschakelen" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Stripfiguren in onveilige situaties" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Stripfiguren in een agressieve conflictsituatie" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Grafisch geweld met stripfiguren" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Figuren in onveilige situaties, gemakkelijk te onderscheiden van de " +#~ "werkelijkheid" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Figuren in agressieve conflictsituaties, gemakkelijk te onderscheiden van " +#~ "de werkelijkheid" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Grafisch geweld, gemakkelijk te onderscheiden van de werkelijkheid" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Enigszins realistisch figuur in onveilige situaties" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "" +#~ "Afbeeldingen van realistische figuren in agressieve conflictsituatie" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Grafisch geweld met realistische figuren" + +#~ msgid "No bloodshed" +#~ msgstr "Geen bloedvergieten" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Niet-realistisch bloedvergieten" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Realistisch bloedvergieten" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Afbeeldingen van bloedvergieten en het mutileren van lichaamsdelen" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Verkrachting of ander gewelddadig seksueel gedrag" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Verwijzingen naar alcoholische dranken" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Gebruik van alcoholische dranken" + +#~ msgid "References to illicit drugs" +#~ msgstr "Verwijzingen naar illegale drugs" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Gebruik van illegale drugs" + +#~ msgid "References to tobacco products" +#~ msgstr "Verwijzingen naar tabaksproducten" + +#~ msgid "Use of tobacco products" +#~ msgstr "Gebruik van tabaksproducten" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Beknopt artistiek naakt" + +#~ msgid "Prolonged nudity" +#~ msgstr "Langdurig naakt" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provocerende verwijzingen of afbeeldingen" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Seksuele verwijzingen of afbeeldingen" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Grafisch seksueel gedrag" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Mild of niet veelvuldig gebruik van godslastering" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Matig gebruik van godslastering" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Sterk of veelvuldig gebruik van godslastering" + +#~ msgid "Slapstick humor" +#~ msgstr "Slapstick-humor" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgaire of platte humor" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Volwassen of seksuele humor" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativiteit in de richting van een specifieke groep mensen" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Discriminatie met de bedoeling emotionele schade te berokkenen" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Expliciete discriminatie op grond van geslacht, seksuele geaardheid, ras " +#~ "of religie" + +#~ msgid "Product placement" +#~ msgstr "Sluikreclame" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Expliciete verwijzingen naar bepaalde merken of producten met handelsmerk" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Gebruikers worden aangemoedigd om bepaalde echte artikelen te kopen" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "" +#~ "Gokken op willekeurige gebeurtenissen met behulp van tokens of credits" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Gokken met ‘speel’geld" + +#~ msgid "Gambling using real money" +#~ msgstr "Gokken met echt geld" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Gebruikers worden aangemoedigd om echt geld te doneren" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Mogelijk om in de toepassing echt geld uit te geven" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Interactie tussen gebruikers zonder gespreksfunctionaliteit" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Gecontroleerde gespreksfunctionaliteit tussen gebruikers" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "" +#~ "Niet-gecontroleerde audio- of videogespreksfunctionaliteit tussen " +#~ "gebruikers" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Deelt gebruikersnamen van sociale netwerken of e-mailadressen" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Controleert voor de nieuwste toepassingsversie" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Deelt diagnostische gegevens waarmee anderen de gebruiker niet kunnen " +#~ "identificeren" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Deelt diagnostische gegevens waarmee anderen de gebruiker kunnen " +#~ "identificeren" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Deelt fysieke locatie met andere gebruikers" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Indirecte verwijzingen naar homoseksualiteit" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Mensen van hetzelfde geslacht kussen" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Grafisch seksueel gedrag tussen mensen van hetzelfde geslacht" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Indirecte verwijzingen naar prostitutie" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Directe verwijzingen naar prostitutie" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Grafische vertoningen van prostitutiedaden" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Indirecte verwijzingen naar overspel" + +#~ msgid "Direct references to adultery" +#~ msgstr "Directe verwijzingen naar overspel" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Grafische vertoningen van overspel" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Schaars geklede menselijke personages" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Openlijk geseksualiseerde menselijke personages" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Vertoningen van of verwijzingen naar historische beschadigingen" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Vertoningen van moderne menselijke beschadigingen" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Grafische vertoningen van moderne menselijke beschadigingen" + +#~ msgid "Visible dead human remains" +#~ msgstr "Zichtbare dode menselijke overblijfselen" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "" +#~ "Dode menselijke overblijfselen die worden blootgesteld aan weer en wind" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Grafische vertoningen van beschadiging van menselijke lichamen" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Vertoningen van of verwijzingen naar historische slavernij" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Vertoningen van moderne slavernij" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Grafische vertoningen van moderne slavernij" + +#~ msgid "General" +#~ msgstr "Algemeen" + +#~ msgid "ALL" +#~ msgstr "ALLES" + +#~ msgid "Teen" +#~ msgstr "Tieners" + +#~ msgid "Everyone 10+" +#~ msgstr "Iedereen 10+" + +#~ msgid "Everyone" +#~ msgstr "Iedereen" + +#~ msgid "Early Childhood" +#~ msgstr "Jonge kinderen" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgid "this website" +#~ msgstr "deze website" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Laten we winkelen" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Verwijderd" + +#~ msgid "Format" +#~ msgstr "Indeling" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Weet u zeker dat u %s wilt verwijderen?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Deze toepassing moet opnieuw opgestart worden om nieuwe plug-ins te " +#~ "gebruiken." + +#~ msgid "Security Updates Pending" +#~ msgstr "Veiligheidsupdates staan klaar" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Het wordt aanbevolen om belangrijke updates nu te installeren" + +#~ msgid "Restart & Install" +#~ msgstr "Herstarten & installeren" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Belangrijke updates voor OS en toepassingen staan klaar om geïnstalleerd " +#~ "te worden" + +#~ msgid "View" +#~ msgstr "Bekijken" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Gisteren, %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Gisteren, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Drie dagen geleden" + +#~ msgid "Four days ago" +#~ msgstr "Vier dagen geleden" + +#~ msgid "Five days ago" +#~ msgstr "Vijf dagen geleden" + +#~ msgid "Six days ago" +#~ msgstr "Zes dagen geleden" + +#~ msgid "Two weeks ago" +#~ msgstr "Twee weken geleden" + +#~ msgid "About %s" +#~ msgstr "Over %s" + +#~ msgid "%s ME" +#~ msgstr "ME %s" + +#~ msgid "Show the folder management UI" +#~ msgstr "Mapbeheer-interface tonen" + +#~ msgid "Folder Name" +#~ msgstr "Mapnaam" + +#~ msgid "_Add" +#~ msgstr "_Toevoegen" + +#~ msgid "Add to Application Folder" +#~ msgstr "Toevoegen aan Toepassingenmap" + +#~ msgid "Top Rated" +#~ msgstr "Hoogst gewaardeerd" + +#~ msgid "Extension Settings" +#~ msgstr "Instellingen voor uitbreidingen" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Het gebruiken van uitbreidingen is voor eigen risico. Als u " +#~ "systeemproblemen heeft, wordt het aanbevolen deze uit te schakelen." + +#~| msgid "Failed to load image" +#~ msgid "Failed to load components" +#~ msgstr "Laden van onderdelen mislukt" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS-validatie: in orde!" + +#~ msgid "Failed to load file" +#~ msgstr "Laden van bestand mislukt" + +#~ msgid "Unsaved changes" +#~ msgstr "Niet opgeslagen wijzigingen" + +#~ msgid "The application list is already loaded." +#~ msgstr "De toepassingslijst is al geladen." + +#~ msgid "Merge documents" +#~ msgstr "Documenten samenvoegen" + +#~ msgid "Throw away changes" +#~ msgstr "Wijzigingen verwerpen" + +#~ msgid "Open AppStream File" +#~ msgstr "AppStream-bestand openen" + +#~| msgid "Open AppStream File" +#~ msgid "Save AppStream File" +#~ msgstr "AppStream-bestand opslaan" + +#~ msgid "_Save" +#~ msgstr "Op_slaan" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s-bannerontwerp verwijderd." + +#~ msgid "Banner design deleted." +#~ msgstr "Bannerontwerp verwijderd." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "De toepassingslijst heeft niet opgeslagen wijzigingen." + +#~ msgid "Use verbose logging" +#~ msgstr "Gedetailleerd logboek gebruiken" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Gnome Software-bannerontwerper" + +#~ msgid "No Designs" +#~ msgstr "Geen ontwerpen" + +#~ msgid "Error message here" +#~ msgstr "Foutbericht hier" + +#~ msgid "Category Featured" +#~ msgstr "Aanbevolen in categorie" + +#~ msgid "Undo" +#~ msgstr "Ongedaan maken" + +#~ msgid "Banner Designer" +#~ msgstr "Banner-ontwerper" + +#~ msgid "New Banner" +#~ msgstr "Nieuwe banner" + +#~ msgid "Import from file" +#~ msgstr "Importeren uit bestand" + +#~ msgid "Export to file" +#~ msgstr "Exporteren naar bestand" + +#~ msgid "Spacing" +#~ msgstr "Spatiëring" + +#~ msgid "The amount of space between children" +#~ msgstr "De hoeveelheid ruimte tussen kinderen" + +#~ msgid "Click on items to select them" +#~ msgstr "Klik op items om ze te selecteren" + +#~ msgid "Select" +#~ msgstr "Selecteren" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Toevoegen aan map…" + +#~ msgid "_Move to Folder…" +#~ msgstr "Ver_plaatsen naar map…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Verwijderen uit map" + +#~ msgid "Featured Applications" +#~ msgstr "Aanbevolen toepassingen" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Ontwerp de banners te zien in Gnome Software" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;Toepassing;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell-uitbreidingen" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Pakketbron met Gnome Shell-uitbreidingen" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Metadata van shell-uitbreiding worden gedownload…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Gnome Shell-uitbreiding" + +#~ msgid "_All" +#~ msgstr "_Alles" + +#~ msgid "Sign In / Register…" +#~ msgstr "Aanmelden / registreren…" + +#~ msgid "Continue" +#~ msgstr "Doorgaan" + +#~ msgid "Use" +#~ msgstr "Gebruiken" + +#~ msgid "Add another…" +#~ msgstr "Nog één toevoegen…" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s zal geïnstalleerd worden, en u zal %s aangerekend worden." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "Aangemeld als %s" + +#~ msgid "Sign in…" +#~ msgstr "Aanmelden…" + +#~ msgid "Sign out" +#~ msgstr "Afmelden" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "%s kopen mislukt: authenticatie vereist" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "%s kopen mislukt: authenticatie ongeldig" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "%s kopen mislukt: geen betaalwijze ingesteld" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "%s kopen mislukt: betaling is geweigerd" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Om door te gaan heeft u een Ubuntu One-account nodig." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Om door te gaan dient u uw Ubuntu One-account te gebruiken." + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "De softwarecatalogus wordt geladen" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "..." +#~ msgstr "..." + +#~ msgid "Show profiling information for the service" +#~ msgstr "Profielinformatie voor de dienst tonen" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Om door te gaan dient u zich aan te melden bij %s." + +#~ msgid "Email address" +#~ msgstr "E-mailadres" + +#~ msgid "I have an account already" +#~ msgstr "Ik heb al een account" + +#~ msgid "I want to register for an account now" +#~ msgstr "Ik wil nu een account aanmaken" + +#~ msgid "Sign in automatically next time" +#~ msgstr "De volgende keer automatisch aanmelden" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Uw eenmalige pincode invoeren voor twee-factor authenticatie." + +#~ msgid "PIN" +#~ msgstr "Pincode" + +#~ msgid "Authenticate" +#~ msgstr "Aanmelden" + +#~ msgid "_About" +#~ msgstr "_Info" + +#~ msgid "_Quit" +#~ msgstr "_Afsluiten" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Informatie over %s, evenals opties voor het verkrijgen van een codec die " +#~ "dit formaat kan afspelen, is te vinden op de website." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Het aanmaken van uw %s-account is nog niet rond." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "" +#~ "Het installeren van software is niet mogelijk totdat dit is opgelost." + +#~ msgid "For more information, visit %s." +#~ msgstr "Voor meer informatie, ga naar %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "%s bijwerken van %s mislukt" + +#~ msgid "Applications Updated" +#~ msgstr "Toepassingen bijgewerkt" + +#~ msgid "Includes: ." +#~ msgstr "Bevat: ." + +#~ msgid "Downloading new updates…" +#~ msgstr "Nieuwe updates worden gedownload…" + +#~ msgid "Downloading application page…" +#~ msgstr "Toepassingspagina wordt gedownload…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Het ultieme amusementsplatform van Valve" + +#~ msgid "Restart & _Install" +#~ msgstr "Herstarten & i_nstalleren" + +#~ msgid "Getting runtime source…" +#~ msgstr "Ophalen van runtimebron…" + +#~ msgid "Limba Support" +#~ msgstr "Limba-ondersteuning" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba biedt ontwikkelaars een eenvoudige manier om softwarepakketten te " +#~ "maken" + +#~ msgid "Sorted by Name" +#~ msgstr "Gesorteerd op naam" + +#~ msgid "Sorted by Rating" +#~ msgstr "Gesorteerd op waardering" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "De lijst van extra bronnen die eerder zijn ingeschakeld" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "De lijst van bronnen die zijn ingeschakeld toen toepassingen van derden " +#~ "werden geïnstalleerd." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Niet-vrije software tonen in zoekresultaten" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "" +#~ "Een lijst met niet-vrije bronnen die eventueel ingeschakeld kunnen worden" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Bronnen met niet-vrije software inschakelen?" + +# Geen toepassingen of add-ons vanuit deze softwarebron geïnstelleerd, echter misschien is er andere geïnstalleerde software wel uit deze bron afkomstig (https://bugzilla.gnome.org/show_bug.cgi?id=726819) +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Geen toepassingen of add-ons geïnstalleerd; andere software misschien nog " +#~ "wel" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "" +#~ "Heeft doorgaans beperkingen met betrekking tot gebruik en toegang tot de " +#~ "broncode." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Bronnen met niet-vrije software" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Softwarebronnen kunnen gedownload worden van het internet. Ze geven u " +#~ "toegang tot extra software die niet door %s meegeleverd is." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Het verwijderen van een bron zal ook alle software verwijderen die u " +#~ "ervan geïnstalleerd heeft." + +#~ msgid "No software installed from this source" +#~ msgstr "Geen software geïnstalleerd van deze bron" + +#~ msgid "Installed from this Source" +#~ msgstr "Geïnstalleerd van deze bron" + +#~ msgid "Last Checked" +#~ msgstr "Laatst gecontroleerd" + +#~ msgid "Added" +#~ msgstr "Toegevoegd" + +#~ msgid "Website" +#~ msgstr "Website" + +#~ msgid "Remove Source" +#~ msgstr "Bron verwijderen" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Vooraf ingestelde interactie tussen spelers zonder gespreksfunctionaliteit" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Deelt gebruikersinformatie met derden" + +#~ msgid "“%s” [%s]" +#~ msgstr "‘%s’ [%s]" + +#~ msgid "Other Updates" +#~ msgstr "Overige updates" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgid "Total" +#~ msgstr "Totaal" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Alles" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Aanbevolen" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomie" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Chemie" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Wiskunde" + +#~ msgid "Science" +#~ msgstr "Wetenschap" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr " Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Geen" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Geen" + +#~ msgid " or " +#~ msgstr " of " + +#~ msgid "3rd party" +#~ msgstr "Van derden" + +#~ msgid "nonfree" +#~ msgstr "niet-vrij" + +#~ msgid "_Installing" +#~ msgstr "Wordt ge_ïnstalleerd" + +#~ msgid "_Removing" +#~ msgstr "_Wordt verwijderd" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "Deze software is van derden en kan niet-vrije onderdelen bevatten." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Deze software kan niet-vrije onderdelen bevatten." + +#~ msgid "_History" +#~ msgstr "Gesc_hiedenis" + +#~ msgid "Size" +#~ msgstr "Grootte" + +#~ msgid "non-free" +#~ msgstr "niet-vrij" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Aanbevolen kantoortoepassingen" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Softwarebronnen geven u toegang tot extra software." + +#~ msgid "One Star" +#~ msgstr "Een ster" + +#~ msgid "Two Stars" +#~ msgstr "Twee sterren" + +#~ msgid "Three Stars" +#~ msgstr "Drie sterren" + +#~ msgid "Four Stars" +#~ msgstr "Vier sterren" + +#~ msgid "Five Stars" +#~ msgstr "Vijf sterren" + +#~ msgid "Installation of %s failed." +#~ msgstr "Installatie van %s is mislukt." + +#~ msgid "Removal of %s failed." +#~ msgstr "Verwijderen van %s is mislukt." + +#~ msgid "No AppStream data found" +#~ msgstr "Geen AppStream-data gevonden" + +#~ msgid "Audio" +#~ msgstr "Audio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Bewerken" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Databases" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Schijf branden" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Amateurradio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mixer" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Muziek" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Recorders" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Sequencers" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Tuners" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Builden" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Databases" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Profielanalyse" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Webontwikkeling" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Computerwetenschappen" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Gegevensvisualisatie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Economie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Elektriciteit" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Elektronica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Techniek" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologie" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geowetenschappen" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Geschiedenis" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Beeldverwerking" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Literatuur" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Kaarten" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Muziek" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Numerieke analyse" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Parallel computing" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Natuurkunde" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Spiritualiteit" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Schietspellen" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulatie" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgid "Graphics" +#~ msgstr "Grafisch" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Publiceren" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Rasterafbeeldingen" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Inbelverbinding" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Feed" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Bestandsoverdracht" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Amateurradio" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Chatten" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC-cliënten" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonie" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Webontwikkeling" + +#~ msgid "Office" +#~ msgstr "Kantoor" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Diagram" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Contactbeheer" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Woordenboek" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Stroomdiagram" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografie" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Projectbeheer" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Publiceren" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Spreadsheet" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Viewer" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Kunst" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Kunstmatige intelligentie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Chemie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Computerwetenschappen" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Bouw" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Gegevensvisualisatie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Economie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Elektriciteit" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Elektronica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Techniek" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geowetenschappen" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Geschiedenis" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Geesteswetenschappen" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Beeldverwerking" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Talen" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Literatuur" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Kaarten" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Wiskunde" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Geneeskunde" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Numerieke analyse" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Parallel computing" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Natuurkunde" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Spiritualiteit" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulator" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Bestandsbeheer" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Bestandshulpmiddelen" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Beveiliging" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Terminal emulator" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Toegankelijkheid" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Archivering" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Rekenmachine" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Klok" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Compressie" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Bestandshulpmiddelen" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Kaarten" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Spiritualiteit" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Telefoniehulpmiddelen" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Videobewerking" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Database" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Schijf branden" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Recorders" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" diff --git a/po/oc.po b/po/oc.po new file mode 100644 index 0000000..50e5e19 --- /dev/null +++ b/po/oc.po @@ -0,0 +1,8977 @@ +# Occitan translation for gnome-calendar. +# Copyright (C) 2013 gnome-calendar's COPYRIGHT HOLDER +# This file is distributed under the same license as the GNOME Calendar package. +# Cédric Valmary (Tot en òc) , 2015. +# Cédric Valmary (totenoc.eu) , 2016, 2017, 2018. +# Cedric , 2019. +msgid "" +msgstr "" +"Project-Id-Version: gnome-calendar master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-09-10 16:29+0000\n" +"PO-Revision-Date: 2024-09-10 20:52+0200\n" +"Last-Translator: Quentin PAGÈS\n" +"Language-Team: Tot en òc\n" +"Language: oc\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" +"X-Project-Style: gnome\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Logicials" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Installar e metre a jorn las aplicacions" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +#, fuzzy +#| msgid "" +#| "Software allows you to find and install new applications and system " +#| "extensions and remove existing installed applications." +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Logicials servís a recercar e installar de novèlas aplicacions e extensions " +"del sistèma, e tanben a suprimir las que son installadas sus vòstre ordenador." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +#, fuzzy +#| msgid "" +#| "GNOME Software showcases featured and popular applications with useful " +#| "descriptions and multiple screenshots per application. Applications can be " +#| "found either through browsing the list of categories or by searching. It " +#| "also allows you to update your system using an offline update." +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Logicials de GNOME presenta una veirina d'aplicacions conegudas amb l'ajuda " +"de descripcions utilas e de mantuna captura d'ecran per caduna d'elas. Podètz " +"recercar de logicials siá en consultant la lista de las categorias, siá en " +"interrogant lo motor de recèrca. Logicials permet tanben de metre a jorn " +"vòstre sistèma fòra linha." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panèl de vista d'ensemble" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panèl de las descripcions" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panèl de las installacions" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panèl de las mesas a jorn" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Detalhs de la mesa a jorn" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2594 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Lo projècte GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Installar un fichièr d'aplicacion dins lo sistèma" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Installacion d'un fichièr d'aplicacion dins lo sistèma" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Una lista de projèctes compatibles" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Aquò es un lista de projèctes compatibles a afichar, tals coma GNOME, KDE e " +"XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Indica la façon de gerir las mesas a jorn e las mesas al nivèl de Logicials " +"de GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Se desactivat, Logicials de GNOME amaga lo panèl de las mesas a jorn, efectua " +"pas cap de mesa a jorn automatica e demanda pas cap de mesa al nivèl." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Telecargar e installar automaticament las mesas a jorn" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Se activat, Logicials de GNOME telecarga automaticament las mesas a jorn " +"logicialas en rèireplan, puèi installa las que necessitan pas de reaviada." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Senhalar a l’utilizaire las mesas a jorn de logicials en rèireplan" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Se activat, Logicials de GNOME senhala a l’utilizaire las mesas a jorn que se " +"son fachas pendent qu’èra inactiu." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Indica se cal reactualizar automaticament sus las connexions pagantas" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Se activat, GNOME Logicials réactualiza automaticament en rèireplan quitament " +"sus las connexions pagantas (amb coma consequéncia lo telecargament de " +"metadonadas, de mesas a jorn o autres amb un còst potencial per l'utilizaire)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Indica se s'agís de la primièra aviada de GNOME Logicials" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Afichar las nòtas al costat de las aplicacions" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtrar las aplicacions en foncion de la branca definida per defaut per los " +"distants" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Las aplicacion non-liuras afichant un avertiment abans installacion" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Quand las aplicacions non-liuras son installadas, un avertiment pòt èsser " +"afichat. Aquò contraròtla aqueste afichatge." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "L'orodatatge de la darrièra verificacion de las mesas a jorn" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "L'orodatatge de la darrièra notificacion de mesa a jorn" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "L'orodatatge de la darrièra notificacion de mesa a jorn" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"L'orodatatge de la primièra mesa a jorn de seguretat, escafat aprèp mesa a " +"jorn" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "L'orodatatge de la darrièra mesa a jorn" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"La durada, en segondas, per verificar que la captura d'ecran en amont es " +"encara valid" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"La causida d'una valor mai granda dona mens d'anar-tornar cap al servidor " +"distant, mas las mesas a jorn de las capturas d'ecran son mai lentas a " +"arribar. Una valor de 0 mena a interrogar jamai lo servidor se i a ja un " +"imatge dins lo cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Lo servidor a utilizar per las apreciacions d'aplicacions" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "La marca minimum per las apreciacions" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" +"Las apreciacions que lo karma n'es inferior a aquesta valor seràn amagadas." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Una lista de depauses oficials que devon pas èsser considerats coma tèrças " +"partidas" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Una lista de depauses oficials que se pòt pas desactivar o suprimir" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Una lista de depauses oficials que devon èsser considerats coma contenent de " +"logicials liures" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"L'URL de la licéncia d'utilizar quand una aplicacion deu èsser considerada " +"coma un logicial liure" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Installa se possible las aplicacions envelopadas sul sistèma per totes los " +"utilizaires" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Autoriza l’accès a la bóstia de dialòg dels depauses del logicial" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Prepausa de mesas a jorn per las versions en tèst" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Aficha qualques elements d'interfàcia que mòstran a l'utilizaire qu'una " +"aplicacion es non-liura" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Afichar lor talha d'installacion dins la lista de las aplicacions installadas" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://fr.wikipedia.org/wiki/Logicial_propri%C3%A9taire'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"L'URI que provesís una explicacion suls logicials proprietaris e non-liures" + +#: data/org.gnome.software.gschema.xml:127 +#, fuzzy +#| msgid "" +#| "A list of URLs pointing to appstream files that will be downloaded into an " +#| "app-info folder" +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Una lista d'URLs que puntan cap als fichièrs del flux de l'aplicacion que " +"seràn telecargats dins un dorsièr d'informacions" + +#: data/org.gnome.software.gschema.xml:131 +#, fuzzy +#| msgid "" +#| "Install the AppStream files to a system-wide location for all users. If " +#| "false, files are installed in non-standard $XDG_DATA_HOME/app-info/xmls " +#| "directory" +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Installa los fichièrs AppStream per totes los utilizaires. Se definit a " +"false, los fichièrs son plaçats dins lo repertòri non estandard " +"$XDG_DATA_HOME/app-info/xmls" + +#: data/org.gnome.software.gschema.xml:135 +#, fuzzy +#| msgid "" +#| "Priority order of packaging formats to prefer, with more important formats " +#| "listed first. An empty array means the default order. Omitted formats are " +#| "assumed to be listed last." +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided by " +"a colon, for example 'flatpak:flathub'." +msgstr "" +"Òrdre de prioritat dels formats d’empaquetatge a preferir, format mai " +"importat en primièr. Una cadena de tèxt voida significa òrdre per defaut. Los " +"formats omeses son considerats coma listats en darrièr." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary apps." +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" + +#: data/org.gnome.software.gschema.xml:151 +#, fuzzy +#| msgid "The timestamp of the first security update, cleared after update" +msgid "The timestamp of the last received historical updates." +msgstr "" +"L'orodatatge de la primièra mesa a jorn de seguretat, escafat aprèp mesa a " +"jorn" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Una cadena que conten l’identificant « Comptes en linha » utilizat per se " +"connectar" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "" +"Aisina d'installacion AppStream sus l'ensemble del sistèma de GNOME Logicials" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Impossible d'analisar los arguments en linha de comanda" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Vos cal especificar exactament un nom de fichièr" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Aqueste logicial pòt pas èsser utilizat que per l'utilizaire root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Impossible de validar lo tipe del contengut : %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Impossible de desplaçar : %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Installacion de l'aplicacion" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Installar l'aplicacion seleccionada sul sistèma" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violéncia de dessenhs animats" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violéncias fantasticas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violéncia realista" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violéncia sexuala" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcoòl" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +#, fuzzy +#| msgid "No references to alcohol" +msgid "No information regarding references to alcohol" +msgstr "Pas cap d'allusion a de bevendas alcoolizadas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narcotics" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +#, fuzzy +#| msgid "No references to illicit drugs" +msgid "No information regarding references to illicit drugs" +msgstr "Pas cap d'allusion a de drògas illicitas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Pas cap de referéncias als produches ligats al tabac" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nuditat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +#, fuzzy +#| msgid "No nudity of any sort" +msgid "No information regarding nudity of any sort" +msgstr "Pas cap de nud, de cap de mena" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +#, fuzzy +#| msgid "No references to or depictions of sexual nature" +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Pas cap d'allusion o d'imatge amb caractèr sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +#, fuzzy +#| msgid "No profanity of any kind" +msgid "No information regarding profanity of any kind" +msgstr "Pas cap de profanacion, de cap de mena" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Umor desplaçat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Pas cap d’informacion tocan l'umor desplaçat" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminacions" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +#, fuzzy +#| msgid "No discriminatory language of any kind" +msgid "No information regarding discriminatory language of any kind" +msgstr "Pas cap d'allusion discriminatòria, de cap de mena" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Publicitat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +#, fuzzy +#| msgid "No advertising of any kind" +msgid "No information regarding advertising of any kind" +msgstr "Pas cap de publicitat, de cap de mena" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Jòga" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +#, fuzzy +#| msgid "No gambling of any kind" +msgid "No information regarding gambling of any kind" +msgstr "Pas cap de pariatge, de cap de mena" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Crompa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +#, fuzzy +#| msgid "No ability to spend money" +msgid "No information regarding the ability to spend money" +msgstr "Pas cap de possibilitat de despensar d'argent" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Discussion àudio entre utilizaires" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +#, fuzzy +#| msgid "No way to chat with other users" +msgid "No information regarding ways to chat with other users" +msgstr "Pas cap de possibilitat de discutir amb los autres utilizaires" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Discussion àudio entre utilizaires" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +#, fuzzy +#| msgid "No way to talk with other users" +msgid "No information regarding ways to talk with other users" +msgstr "Pas cap de mejan de parlar amb los autres utilizaires" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detalhs de contacte" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +#, fuzzy +#| msgid "No sharing of social network usernames or email addresses" +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Pas cap de partiment dels noms d'utilizaire de rets socialas o d'adreças " +"electronicas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informacions d’identificacion" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +#, fuzzy +#| msgid "No sharing of user information with third parties" +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Pas cap de partiment dels identificants d’utilizaire amb de tèrças partidas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Partatge de localizacion" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +#, fuzzy +#| msgid "No sharing of physical location with other users" +msgid "No information regarding sharing of physical location with other users" +msgstr "Pas cap de partiment de geolocalizacion amb los autres utilizaires" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +#, fuzzy +#| msgid "No references to homosexuality" +msgid "No information regarding references to homosexuality" +msgstr "Pas cap d'allusion a l’omosexualitat" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitucion" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +#, fuzzy +#| msgid "No references to prostitution" +msgid "No information regarding references to prostitution" +msgstr "Pas cap d'allusion a la prostitucion" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adultèri" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +#, fuzzy +#| msgid "No references to adultery" +msgid "No information regarding references to adultery" +msgstr "Pas cap d'allusion a l’adultèri" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Personatges sexualizats" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanacion" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +#, fuzzy +#| msgid "No references to desecration" +msgid "No information regarding references to desecration" +msgstr "Pas cap d'allusion a de profanacion" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +#, fuzzy +#| msgctxt "Menu subcategory of Education" +#| msgid "Humanities" +msgid "Human Remains" +msgstr "Sciéncias umanas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +#, fuzzy +#| msgid "No visible dead human remains" +msgid "No information regarding visible dead human remains" +msgstr "Pas cap d'imatge de rèstas umanas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Esclavatge" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Pas cap d'allusion a l’esclavagisme" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Pas cap d'allusion a de drògas" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "Does not include swearing, profanity, and other kinds of strong language" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "" + +#: src/gs-age-rating-context-dialog.c:502 +#, fuzzy +#| msgid "Uncontrolled chat functionality between users" +msgid "Does not include uncontrolled chat functionality" +msgstr "Possibilitat de discutir sens contròtle entre utilizaires" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Conten pas cap de violéncia" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drògas" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Lengatge grossièr" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Argent" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Socializacion" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violéncia" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Tot" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s a un limit d’atge desconegut" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s es adeqüat per tot lo monde" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s es adeqüat pels mainatges" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s es adeqüat pels dròlles joves" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s es adeqüat pel mainatge" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s es adeqüat pels adolescents" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s es adeqüat pels adults" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s es adeqüat per %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Evaluacion per edat" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:126 +#, fuzzy +#| msgid "How to add missing information" +msgid "_How to contribute missing information" +msgstr "Cossí apondre d’informacions absentas" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "Fichièr local" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "Paquet" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "En espèra" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:407 +msgid "Pending install" +msgstr "Installacion en espèra" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:414 +msgid "Pending remove" +msgstr "Supression en espèra" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:395 +msgid "Installing" +msgstr "Installacion en cors" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Supression en cors" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:400 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Telecargament" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:307 src/gs-details-page.c:1060 +#: src/gs-details-page.c:1095 src/gs-details-page.ui:243 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Installar" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1180 +msgid "_Uninstall…" +msgstr "_Desinstallar…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Ret" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Pòt comunicar a travèrs la ret" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Servicis sistèma" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Pòt accedir a de servicis DBus sul bus sistèma" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Servicis de session" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Pòt accedir als servicis DBus sul bus de session" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Periferics" + +#: src/gs-app-details-page.c:63 +#, fuzzy +#| msgid "Can access arbitrary files" +msgid "Can access arbitrary devices such as webcams" +msgstr "Pòt accedir als fichièr arbitràriament" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access input devices" +msgstr "Pòt accedir als fichièrs del sistèma" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access microphones" +msgstr "Pòt accedir als fichièrs del sistèma" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Pòt accedir als fichièrs del sistèma" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Captura d'ecran" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +#, fuzzy +#| msgid "Can access the internet" +msgid "Can access screen contents" +msgstr "Pòt accedir a l'internet" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Dorsièr personal" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Pòt veire, editar e crear de fichièrs" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Pòt veire los fichièrs" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistèma de fichièrs" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Dorsièr de telecargament" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Paramètres" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Pòt veire e modificar quin paramètre que siá" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistèma d’afichatge desuet" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Utiliza un vièlh sistèma d’afichatge non securizat" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Fugida del nauc de sabla" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Se pòt escapar del nauc de sabla e contornar d’autras restriccions" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Cap de descripcion de la mesa a jorn es pas estada provesida." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Detalhs de la mesa a jorn" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Demanda mai de permissions" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Avaloracions" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "Cap de revista per aquesta aplicacion." + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "Cap d’avís" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "Istoric de versions" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novetats dins la version %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Version %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Cap d'informacion es pas disponibla per aquesta version" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e %B de %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Mòde d'aviada : pòt èsser « updates » (mesas a jorn), « updated » (a jorn), « " +"installed » (installadas) o « overview » (vista d'ensemble)." + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MÒDE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Recercar d'aplicacions" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "RECERCAR" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Afichar los detalhs de l'aplicacion (en utilizant l'ID de l'aplicacion)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Afichar los detalhs de l'aplicacion (en utilizant lo nom del paquet)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NOM_DE_PAQUET" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Installar l'aplicacion (à partir de son identificant)" + +#: src/gs-application.c:134 +#, fuzzy +#| msgid "Install the application (using application ID)" +msgid "Uninstall the application (using application ID)" +msgstr "Installar l'aplicacion (à partir de son identificant)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Dobrir lo fichièr d'un paquet local" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NOM_DE_FICHIÈR" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, or " +"‘full’" +msgstr "" +"Lo tipe d'interaccion esperada aicí : siá « none » (aucune), « notify " +"» (notifier), o « full » (toutes)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACCION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Afichar un fichièr local metainfo o appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installar las mesas a jorn en espèra en rèireplan" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Afichar las preferéncias" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Quitar la session en cors" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferir las fonts dels fichièrs locals a AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Mostrar lo numèro de version" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 Los contributors de GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Cédric Valmary (totenoc.eu) , 2015-2017.\n" +"Quentin PAGÈS" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "O planhèm, i a pas cap d'informacion sus aquesta aplicacion." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Talha installada" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inclutz %s de donadas e %s de cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inclutz %s de donadas" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inclutz %s de cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Cache e utilizacion donadas desconeguts" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Talha dels fichièrs telecargats" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Requerís pas cap de telecargament sistèma suplementari" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Requerís un telecargament sistèma suplementari d’una talha desconeguda" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Requerís un telecargament sistèma suplementari de %s" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "La talha es desconeguda" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Cap d’autorizacion" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "A accès a la ret" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Utiliza los servicis sistèma" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Utiliza los servicis de session" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Pòt accedir als periferics materials" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access system devices" +msgstr "Pòt accedir als fichièrs del sistèma" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Pòt legir/escriure totas vòstras donadas" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Pòt legir totas vòstras donadas" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Pòt legir/escriure vòstres telecargaments" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Pòt legir vòstres telecargaments" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access some specific files" +msgstr "Pòt accedir als fichièrs del sistèma" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Pòt veire e modificar los paramètre de l’utilizaire" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Utiliza un vièlh sistèma d’afichatge non securizat" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Pòt aquerir d’autorizacions arbitràrias" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Lo desvolopaire es verificat" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +#, fuzzy +#| msgid "Reviewed by your distribution" +msgid "Reviewed by OS distributor" +msgstr "Repassat per vòstra distribucion" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Repassat per %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Provesit per una tèrça part" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Logicial pas mai pres en carga" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Còdi analisable" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Licéncia desconeguda" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Còdi proprietari" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Licéncia especiala" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr " ; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privilegiat" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Segur" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Probablament segur" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potencialament pas segur" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Pas segur" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Mobil solament" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Fonciona solament sus un ecran pichon" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Ordenador de burèu solament" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Fonciona solament sus un ecran grand" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Incoeréncia de talha d'ecran" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Pren pas en cargar la talha d’ecran actuala" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Requerís un ecran tactil" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Requerís un clavièr" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Requerís una mirga" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Maneta requerida" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Requerís una maneta per jogar" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptatiu" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Fonciona suls mobils, tauletas e ordenadors de burèu" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Requerís probablament un clavièr o una mirga" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Fonciona suls ordenadors de burèu e portatius" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "L'aplicacion conten pas cap de contengut somés a un atge minimum" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Cap d’informacion sus l’atge requerit pas disponibla" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visitar lo site Web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Installar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Anullar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Installar" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Telecargar" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Metre a jorn" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Desinstallar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Desinstallacion" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 +#: src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "Mesa a jorn critica" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "L'aparelh pòt pas èsser utilizat pendent la mesa a jorn." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Font : %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "S'apelava %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +#, fuzzy +#| msgid "%s Device Update" +msgid "Stopped Receiving Updates" +msgstr "Mesa a jorn del periferic « %s »" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Mesa a jorn critica" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Installada" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Ajudar a traduire %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, fuzzy, c-format +#| msgid "" +#| "%s is designed, developed, and translated by an international community of " +#| "volunteers.\n" +#| "\n" +#| "This means that while it’s not yet available in your language, you can get " +#| "involved and help translate it yourself." +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s es concebut, desvolopat e traduch per un comunitat internacionala de " +"benevòls.\n" +"\n" +"Aquò significa que s'es pas disponible dins vòstra lenga, podètz vos implicar " +"e ajudar a lo traduire." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traduccion" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Site de _traduccion" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Autentificacion distanta requerida sus %s (nom de domeni %s)" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "Autentificacion requerida" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:300 src/gs-common.c:752 +#: src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 src/gs-dkms-dialog.ui:120 +#: src/gs-page.c:423 src/gs-page.c:708 src/gs-removal-dialog.ui:24 +#: src/gs-repos-dialog.c:175 src/gs-repos-dialog.c:251 +#: src/gs-review-dialog.ui:24 src/gs-review-row.c:239 src/gs-review-row.c:263 +#: src/gs-updates-page.c:852 src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "A_nullar" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "_Connexion" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Utilizaire" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "Senhal" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Autres" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Totas" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Mesas en avant" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Seleccion de l’editor" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Novetats e actualizacions" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Còps de còr del Web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Autres logicial" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s (installada)" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +#, fuzzy +#| msgid "A restart is required for the changes to take effect." +msgid "A restart is required for the changes to take effect" +msgstr "Una reaviada es necessària per acabar l’installacion." + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +#, fuzzy +#| msgid "App is ready to be used." +msgid "The app is ready to be used" +msgstr "L'aplicacion es ara operacionala." + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Mesas a jorn sistèma installadas" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Las mesas a jorn installadas recentament son ara consultablas" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:915 +msgid "Restart" +msgstr "Reaviar" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Aviar" + +#. TRANSLATORS: window title +#: src/gs-common.c:234 +msgid "Install Software?" +msgstr "Installarlo logicial ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Install Third-Party Software?" +msgstr "Installar lo logicial tèrç ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:240 +msgid "Enable Software Repository?" +msgstr "Activar lo repertòri de Logicial ?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:242 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Activar los depauses logicials tèrces ?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:254 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s es pas un logicial liure e dobèrt e es distribuit per « " +"%s »." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:264 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s es distribuit per « %s »." + +#: src/gs-common.c:273 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Aqueste depaus de logicials deu èsser activat per contunhar l’installacion." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:283 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Pòt èsser contrari a la lei d'installar e d'utilizar %s dins certans païses." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:289 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Pòt èsser contrari a la lei d'installar e d'utilizar aqueste codec dins " +"certans païses." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:303 +msgid "Don’t _Warn Again" +msgstr "M'avertir pas _mai" + +#. TRANSLATORS: button text +#: src/gs-common.c:312 +msgid "Enable and _Install" +msgstr "Activar e _installar" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:519 +msgid "Detailed errors from the package manager follow:" +msgstr "Aquí los detalhs de las errors del gestionari de paquets :" + +#: src/gs-common.c:526 src/gs-common.c:663 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Detalhs" + +#. TRANSLATORS: button text +#: src/gs-common.c:575 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Tampar" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:744 +msgid "_Accept" +msgstr "_Acceptar" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:890 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Una mesa a jorn es estada installada sus aqueste sistèma" +msgstr[1] "De mesas a jorn son estadas installadas sus aqueste sistèma" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:900 +#, fuzzy +#| msgid "An update has been installed" +#| msgid_plural "Updates have been installed" +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Una mesa a jorn es estada installada sus aqueste sistèma" +msgstr[1] "De mesas a jorn son estadas installadas sus aqueste sistèma" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:906 +#, fuzzy +#| msgid "A restart is required for it to take effect." +#| msgid_plural "A restart is required for them to take effect." +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Una reaviada es necessària per acabar l’installacion." +msgstr[1] "Una reaviada es necessària per acabar l’installacion." + +#. TRANSLATORS: button text +#: src/gs-common.c:913 +msgid "Not Now" +msgstr "Pas ara" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1009 +msgid "Just now" +msgstr "Ara meteis" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "fa %d minuta" +msgstr[1] "fa %d minutas" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "fa %d ora" +msgstr[1] "fa %d oras" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "fa %d jorn" +msgstr[1] "fa %d jorns" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "fa %d setmana" +msgstr[1] "fa %d setmanas" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "fa %d mes" +msgstr[1] "fa %d meses" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "fa %d an" +msgstr[1] "fa %d ans" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1394 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Tot" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Mesas en avant" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Grafisme en 3 dimensions" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografia" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Scan" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Dessenh vectorial" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visionadors" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Creacions e modificacions àudio" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Lectors de musica" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Tot" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Mesas en avant" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Agenda" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Basa de donadas" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finança" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Tractament de tèxte" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editors de tèxte" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navigadors Web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Tot" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Mesas en avant" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Accion" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventura" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcada" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blòts" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Platèu" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartas" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulators" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Enfants" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logica" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Jòcs de ròtle" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Espòrts" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estrategia" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Tot" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Mesas en avant" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Discussion" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Tot" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Mesas en avant" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Intelligéncia artificiala" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomia" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Quimia" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Lengas" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematicas" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Nòvas" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotica" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Art" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografia" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Bendas dessenhadas" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Ficcion" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Santat" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Istòria" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Estil de vida" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politica" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Espòrts" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Tot" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Mesas en avant" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Desbugadors" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "EDI" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecs" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Pilòts material" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Poliças" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Fonts de picada" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Presa en carga lingüistica" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Regionalizacion" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Crear" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Trabalhar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Jogar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializacion" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Aprendre" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Desvolopament" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Pilòts material" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Poliças" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Fonts de picada" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Paquets lingüistics" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Regionalizacion" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Una aplicacion" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s demanda mai de presa en carga del format del fichièr." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Tipes MIME suplementaris requesits" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s demanda mai de poliças." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Poliças suplementàrias requesidas" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s demanda mai de codecs multimèdia." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Codecs multimèdia suplementaris requesits" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s demanda mai de pilòts d'imprimenta." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Pilòts d'imprimenta suplementaris requesits" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s demanda mai de paquets logicials." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Paquets logicials suplementaris requesits" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Aviar Logicials" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "A_fichar mai" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Ne veire _mens" + +#: src/gs-details-page.c:390 +msgid "Removing…" +msgstr "Supression en cors…" + +#: src/gs-details-page.c:405 +msgid "Requires restart to finish install" +msgstr "Requerís una reaviada per acabar l’installacion" + +#: src/gs-details-page.c:412 +msgid "Requires restart to finish remove" +msgstr "Requerís una reaviada per acabar la supression" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:428 +msgid "Pending installation…" +msgstr "Installacion en espèra…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:434 +msgid "Pending update…" +msgstr "Mesa a jorn en espèra…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:449 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Telecargament…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:452 +msgid "Preparing…" +msgstr "Preparacion…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:455 +msgid "Uninstalling…" +msgstr "Desinstallacion…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:582 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s es pas mai installat mas possedís encara de donadas." + +#: src/gs-details-page.c:1077 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Reaviar" + +#: src/gs-details-page.c:1083 +msgid "_Enable…" +msgstr "_Activar…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1109 +msgid "_Install…" +msgstr "_Installar…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1325 +#, c-format +msgid "%s will appear in US English" +msgstr "%s s’aficharà en anglés estatsunidenc" + +#: src/gs-details-page.c:1333 +msgid "This app will appear in US English" +msgstr "Aquesta aplicacion s’aficharà en anglés estatsunidenc" + +#: src/gs-details-page.c:1335 +msgid "This software will appear in US English" +msgstr "Aquest logicial s’aficharà en anglés estatsunidenc" + +#: src/gs-details-page.c:1370 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "Ajudar a _traduire" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1435 +#, c-format +msgid "Other Apps by %s" +msgstr "Autras aplicacions de %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1471 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1474 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1837 +msgid "You need internet access to write a review" +msgstr "Un accès a Internet es indispensable per redigir una evaluacion" + +#: src/gs-details-page.c:1938 +#, fuzzy +#| msgid "" +#| "This software is no longer receiving updates, including security fixes" +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Aqueste logicial recep pas mai de mesas a jorn, inclutz de correccions de " +"seguretat" + +#: src/gs-details-page.c:1939 +#, fuzzy +#| msgid "" +#| "This software is already provided by your distribution and should not be " +#| "replaced." +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Aquesta aplicacion fa ja partida de vòstra distribucion e deuriá pas èsser " +"remplaçada." + +#: src/gs-details-page.c:1940 +#, fuzzy +#| msgid "" +#| "This software doesn’t provide any links to a website, code repository or " +#| "issue tracker." +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Aqueste logicial provesís pas cap de ligam cap al site web, repertòri de còdi " +"o traçador d’avarias." + +#: src/gs-details-page.c:1942 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Aqueste logicial recep pas mai de mesas a jorn, inclutz de correccions de " +"seguretat" + +#: src/gs-details-page.c:1943 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Aquesta aplicacion fa ja partida de vòstra distribucion e deuriá pas èsser " +"remplaçada." + +#: src/gs-details-page.c:1944 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Aqueste logicial provesís pas cap de ligam cap al site web, repertòri de còdi " +"o traçador d’avarias." + +#: src/gs-details-page.c:2034 src/gs-details-page.c:2051 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" + +#: src/gs-details-page.c:2406 +#, fuzzy, c-format +#| msgid "Failed to refine addon ‘%s’: %s" +msgid "Failed to submit review for “%s”: %s" +msgstr "Impossible de tornar definir l’extension « %s » : %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Pagina de las descripcions" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Cargament dels detalhs de l'aplicacion" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Verificat" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Dobrir" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Mesa a jorn" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Desinstallar" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "Extensions" + +#: src/gs-details-page.ui:646 +#, fuzzy +#| msgid "" +#| "This application can only be used when there is an active internet " +#| "connection." +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Aquesta aplicacion pòt pas èsser utilizada que se una connexion a Internet es " +"activa." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "Depaus de logicials inclús" + +#: src/gs-details-page.ui:679 +#, fuzzy +#| msgid "" +#| "This application includes a software repository which provides updates, as " +#| "well as access to other software." +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Aquesta aplicacion inclutz un depaus de logicials que provesís las mesas a " +"jorn e tanben l’accès a d’autres programas." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Pas cap de depaus de logicials inclús" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Aquesta aplicacion inclutz pas cap de depaus de logicials. Serà pas mesa a " +"jorn cap a de novèlas versions." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "Depaus de logicials identificat" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Apondre aqueste depaus de logicials vos dona accès a de logicials " +"suplementaris e tanben las mesas al nivèl." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Utilizetz sonque los depauses de logicials que vos i fisatz." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Escafar las donadas d’aplicacion" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "Supr_imir las donadas" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Cap de metadonadas" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "Site _Web del projècte" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "Far un _don" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "Contribuir _Traduccions" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "_Senhalar una avaria" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "_Ajuda" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contacte" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "_Redigir una avaloracion" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Totas las avaloracions" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "Impossible d’afichar los detalhs de l’aplicacion" + +#: src/gs-dkms-dialog.c:67 +#, fuzzy +#| msgid "Failed to save file" +msgid "Failed to prepare reboot" +msgstr "Fracàs d’enregistrament del fichièr" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "Error desconeguda" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "La clau es pas estada trobada" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "La clau es pas marcada" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +#, fuzzy +#| msgid "Mouse Required" +msgid "MOK Enrollment Required" +msgstr "Mirga requerida" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Seguent" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a password " +"to be entered later in the process. Please note down the following password " +"associated with the key:" +msgstr "" + +#: src/gs-dkms-dialog.ui:83 +#, fuzzy +#| msgid "I have forgotten my password" +msgid "I have made a note of the MOK _password" +msgstr "Ai doblidat mon senhal" + +#: src/gs-dkms-dialog.ui:128 +#, fuzzy +#| msgid "_Restart Now…" +msgid "_Restart & Enroll…" +msgstr "_Reaviar ara…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instruccions d’installacion : mercés de legir amb precausion" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" + +#: src/gs-dkms-dialog.ui:211 +#, fuzzy +#| msgid "Search for applications" +msgid "Security Implications" +msgstr "Recercar d'aplicacions" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Telecargament de novèls fichièrs de metadonadas…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " e " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Poliça disponibla per l'escript en %s" +msgstr[1] "Poliças disponiblas per l'escript en %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Logicial disponible per %s" +msgstr[1] "Logicials disponibles per %s" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Cap de logicial es pas estat trobat" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Impossible de trobar lo logicial demandat" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "%s son introbables" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "sul site Web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, fuzzy, c-format +#| msgid "No applications are available that provide the file %s." +msgid "No apps are available that provide the file %s." +msgstr "Cap d'aplicacion pas disponibla per provesir lo fichièr %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, fuzzy, c-format +#| msgid "" +#| "Information about %s, as well as options for how to get missing " +#| "applications might be found %s." +msgid "" +"Information about %s, as well as options for how to get missing apps might be " +"found %s." +msgstr "" +"D'informacions sus %s, e tanben d'opcions sul biais d'obténer las aplicacions " +"mancantas son disponiblas sus %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, fuzzy, c-format +#| msgid "No applications are available for %s support." +msgid "No apps are available for %s support." +msgstr "Cap d'aplicacion pas disponibla per prene en carga %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "%s es indisponible." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, fuzzy, c-format +#| msgid "" +#| "Information about %s, as well as options for how to get an application " +#| "that can support this format might be found %s." +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"D'informacions sus %s, e tanben d'opcions sul biais d'obténer una aplicacion " +"susceptibla de prene en carga aqueste format son disponiblas sus %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Cap de poliça d'extension es pas disponibla per prene en carga %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"D'informacions sus %s, e tanben d'opcions sul biais d'obténer de poliças " +"suplementàrias son disponiblas sus %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Cap de codec al format %s es pas disponible per l'extension." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can play " +"this format might be found %s." +msgstr "" +"D'informacions sus %s, e tanben d'opcions sul biais d'obténer un codec " +"susceptible de legir aqueste format son disponiblas sus %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Cap de ressorsa per plasma es pas disponibla per prene en carga %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"D'informacions sus %s, e tanben d'opcions sul biais d'obténer de ressorsas " +"suplementàrias per plasma son disponiblas sus %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Cap de pilòt d'imprimenta es pas disponible per %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"D'informacions sus %s, e tanben d'opcions sul biais d'obténer un pilòt " +"susceptible de prene en carga aquesta imprimenta son disponiblas sus %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "la documentacion" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Impossible de trobar %s demandat per %s. Consultatz %s per mai d’informacion." +msgstr[1] "" +"Impossible de trobar %s demandats per %s. Consultatz %s per mai d’informacion." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Malurosament, %s que recercatz es introbable. Consultatz %s per mai " +"d'informacions." +msgstr[1] "" +"Malurosament, %s que recercatz son introbables. Consultatz %s per mai " +"d'informacions." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Fracàs de la recèrca, pas cap de resultat : %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "Format de fichièr %s" + +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "_Tot installar" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "Impossible de trobar lo logicial demandat" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Pagina de Codecs" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "Cap de resultat pas trobat" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Precedent" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Seguent" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "List d’aplicacions mesas en avant" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Presa en carga burèu" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Se pòt pas utilizar sus un ecran grand" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Presa en carga burèu desconeguda" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Pas pro d’informacions per saber se los ecrans grands son preses en carga" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Requerís un ecran grand" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Ordenador de burèu pas pres en carga" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Se pòt pas utilizar sus un ecran grand" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Presa en carga mobil" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Se pòt pas utilizar sus un ecran pichon" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Presa en carga mobil desconeguda" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Pas pro d’informacions per saber se los ecrans pichons son preses en carga" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Requerís un ecran pichon" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobil pas pres en carga" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Se pòt pas utilizar sus un ecran pichon" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Presa en carga clavièr" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Presa en carga clavièr desconeguda" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Pas pro d’informacions per saber se los clavièrs son preses en carga" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Clavièr requerit" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Pren en carga los clavièrs" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Clavièr pas pres en carga" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Se pòt pas utilizar amb un clavièr" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Presa en carga de la mirga" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Requerís una mirga o un dispositiu de puntatge" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Presa en carga de la mirga desconeguda" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Pas pro d’informacions per saber se las morgas o los dispositius de puntatge " +"son preses en carga" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Mirga requerida" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Mirgas e dispositius de puntatge preses en carga" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Mirga pas presa en carga" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Se pòt pas utilizar amb una mirga o un dispositiu de puntatge" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Ecran tactil pres en carga" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Presa en carga ecran tactil desconeguda" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Pas pro d’informacions per saber se los ecrans tactils son preses en carga" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Ecran tactil requerit" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Pren en carga los ecrans tactils" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Ecran tactil pas pres en carga" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Se pòt pas utilizar sus un ecran tactil" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Maneta requerida" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Requerís una maneta" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Presa en carga maneta" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Pren en cagar las manetas" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s fonciona probablament sus aqueste aparelh" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s fonciona sus aqueste aparelh" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s fonciona probablament sus aqueste aparelh" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s foncionarà probablament pas sus aqueste aparelh" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s foncionarà pas sus aqueste aparelh" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Presa en carga materiala" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navegacion" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "" + +#: src/gs-help-overlay.ui:24 +#, fuzzy +#| msgid "Installed page" +msgid "Navigate to Installed Page" +msgstr "Pagina installada" + +#: src/gs-help-overlay.ui:30 +#, fuzzy +#| msgid "Updates page" +msgid "Navigate to Updates Page" +msgstr "Pagina de las mesas a jorn" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Dobrir la barra de recèrca" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Dobrir las preferéncias" + +#: src/gs-help-overlay.ui:55 +#, fuzzy +#| msgid "Software Repositories" +msgid "Open Software Repositories" +msgstr "Depauses de Logicials" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Ajuda" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Dobrir los acorchis clavièr" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Installadas" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Pagina installada" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "En cors" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplicacions" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "Aplicacions web" + +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "Aplicacions sistèma" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Construch per la comunautat" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Participar" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, fuzzy, c-format +#| msgid "" +#| "This software is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This app is developed in the open by an international community, and released " +"under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aqueste logicial es desvolopat per una comunitat liura de benevòls, e " +"publicat sota la licéncia %s.\n" +"\n" +"Podètz contribuir e ajudar a lo rendre melhor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, fuzzy, c-format +#| msgid "" +#| "This software is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This app is developed in the open by an international community, and released " +"under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aqueste logicial es desvolopat per una comunitat liura de benevòls, e " +"publicat sota la licéncia %s.\n" +"\n" +"Podètz contribuir e ajudar a lo rendre melhor." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, fuzzy, c-format +#| msgid "" +#| "This software is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aqueste logicial es desvolopat per una comunitat liura de benevòls, e " +"publicat sota la licéncia %s.\n" +"\n" +"Podètz contribuir e ajudar a lo rendre melhor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, fuzzy, c-format +#| msgid "" +#| "This software is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Aqueste logicial es desvolopat per una comunitat liura de benevòls, e " +"publicat sota la licéncia %s.\n" +"\n" +"Podètz contribuir e ajudar a lo rendre melhor." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Licéncia desconeguda" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Ne saber mai" + +#: src/gs-license-tile.c:157 +#, fuzzy +#| msgid "" +#| "This software is not developed in the open, so only its developers know " +#| "how it works. There may be restrictions on its use, and it may be harder " +#| "to tell if the software is insecure.\n" +#| "\n" +#| "You may not be able to contribute to this software or influence its " +#| "development." +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Aqueste logicial es pas desvelopat en transparéncia, doncas sonque sos " +"desvelopaires sabon cossí fonciona. Pòt i aver restriccions tocant son " +"utilizacion, e pòt èsser mai complicat de dire se lo logicial es pas segur.\n" +"\n" +"Benlèu que poiretz pas contribuir a aqueste logicial o influenciar son " +"desvelopament." + +#: src/gs-license-tile.c:161 +#, fuzzy +#| msgid "" +#| "This software is not developed in the open, so only its developers know " +#| "how it works. There may be restrictions on its use, and it may be harder " +#| "to tell if the software is insecure.\n" +#| "\n" +#| "You may not be able to contribute to this software or influence its " +#| "development." +msgid "" +"This software does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Aqueste logicial es pas desvelopat en transparéncia, doncas sonque sos " +"desvelopaires sabon cossí fonciona. Pòt i aver restriccions tocant son " +"utilizacion, e pòt èsser mai complicat de dire se lo logicial es pas segur.\n" +"\n" +"Benlèu que poiretz pas contribuir a aqueste logicial o influenciar son " +"desvelopament." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Proprietari" + +#: src/gs-license-tile.c:175 +#, fuzzy +#| msgid "" +#| "This software is not developed in the open, so only its developers know " +#| "how it works. There may be restrictions on its use, and it may be harder " +#| "to tell if the software is insecure.\n" +#| "\n" +#| "You may not be able to contribute to this software or influence its " +#| "development." +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Aqueste logicial es pas desvelopat en transparéncia, doncas sonque sos " +"desvelopaires sabon cossí fonciona. Pòt i aver restriccions tocant son " +"utilizacion, e pòt èsser mai complicat de dire se lo logicial es pas segur.\n" +"\n" +"Benlèu que poiretz pas contribuir a aqueste logicial o influenciar son " +"desvelopament." + +#: src/gs-license-tile.c:179 +#, fuzzy +#| msgid "" +#| "This software is not developed in the open, so only its developers know " +#| "how it works. There may be restrictions on its use, and it may be harder " +#| "to tell if the software is insecure.\n" +#| "\n" +#| "You may not be able to contribute to this software or influence its " +#| "development." +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Aqueste logicial es pas desvelopat en transparéncia, doncas sonque sos " +"desvelopaires sabon cossí fonciona. Pòt i aver restriccions tocant son " +"utilizacion, e pòt èsser mai complicat de dire se lo logicial es pas segur.\n" +"\n" +"Benlèu que poiretz pas contribuir a aqueste logicial o influenciar son " +"desvelopament." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Licéncia especiala" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, fuzzy, c-format +#| msgid "" +#| "This software is developed in the open by a community of volunteers, and " +#| "released under the %s license.\n" +#| "\n" +#| "You can contribute and help make it even better." +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Aqueste logicial es desvolopat per una comunitat liura de benevòls, e " +"publicat sota la licéncia %s.\n" +"\n" +"Podètz contribuir e ajudar a lo rendre melhor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Actualizacion de las donadas" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Pagina de Codecs" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Aviada" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Font desconeguda" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Apondons" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Supressions" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Mesas a jorn" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Degradacions" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "sorgas extèrnas seleccionadas" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, fuzzy, c-format +#| msgid "" +#| "Provides access to additional software from %s. Some proprietary software " +#| "is included." +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Provesís l'accès a de logicials suplementaris de %s estant. D’unes logicials " +"proprietaris son incluses." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Activar los depauses logicials tèrces ?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "_Ignorar" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Activar" + +#: src/gs-overview-page.c:951 +#, fuzzy +#| msgid "the operating system" +msgid "Available for your operating system" +msgstr "lo sistèma operatiu" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "Disponible per %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Explorar" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Apercebut de la pagina" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Aplicacions disponiblas" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Autras categorias" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Cap de donada d'aplicacion pas trobada" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Desconegut" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_D'acòrdi" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "L’utilizaire a refusat l’installacion" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Preparar %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Volètz vertadièrament suprimir lo depaus %s ?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, fuzzy, c-format +#| msgid "" +#| "All applications from %s will be uninstalled, and you will have to re-" +#| "install the repository to use them again." +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Totas las aplicacions de %s seràn suprimidas e la vos caldrà reïnstallar per " +"poder utilizar aquestes logicials tornamai." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 +#: src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "Desinstallar %s ?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Se poirà pas utilizar %s aprèp sa supression." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, fuzzy, c-format +#| msgid "It will not be possible to use %s after removal." +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "Se poirà pas utilizar %s aprèp sa supression." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, fuzzy, c-format +#| msgid "" +#| "It will not be possible to use %s after removal. App data and settings " +#| "will be kept on disk, to allow restoring the app in the future." +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Serà pas possible d'utilizar %s après la supression. Las donadas e " +"configuracions de las aplicacions se conservaràn sul disc, per permetre de " +"restaurar l'aplicacion dins l'avenir." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, fuzzy, c-format +#| msgid "" +#| "It will not be possible to use %s after removal. App data and settings " +#| "will be kept on disk, to allow restoring the app in the future." +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Serà pas possible d'utilizar %s après la supression. Las donadas e " +"configuracions de las aplicacions se conservaràn sul disc, per permetre de " +"restaurar l'aplicacion dins l'avenir." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "Donadas e paramètres de l'aplicacion" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:667 +msgid "_Keep" +msgstr "_Conservar" + +#: src/gs-page.c:673 +msgid "Allows restoring app settings and content" +msgstr "Permet de restaurar los paramètres e lo contengut de l’aplicacion" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:682 +msgid "_Delete" +msgstr "_Suprimir" + +#: src/gs-page.c:688 +msgid "Permanently deletes data to save disk space" +msgstr "Suprimís per totjorn las donadas per estalviar d’espaci disc" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:696 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Serà pas possible d'utilizar %s après la supression. Las donadas e " +"configuracions de las aplicacions se conservaràn sul disc, per permetre de " +"restaurar l'aplicacion dins l'avenir." + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:710 +msgid "_Uninstall" +msgstr "_Desinstallar" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferéncias" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Mesa a jorn dels logicials" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "Mai d'informacions" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatic" + +#: src/gs-prefs-dialog.ui:43 +#, fuzzy +#| msgid "Automatically download and install updates" +msgid "Automatically check for and download updates" +msgstr "Telecargar e installar automaticament las mesas a jorn" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Notificacions de mesa a jorn automatica" + +#: src/gs-prefs-dialog.ui:77 +#, fuzzy +#| msgid "Show notifications when updates have been automatically installed" +msgid "Notify when updates have been automatically installed" +msgstr "" +"Afichar de notificacions quand de mesas a jorn son estadas installadas " +"automaticament" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtres de contengut" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Afichar sonque los logicials _liures" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, fuzzy, c-format +#| msgid "" +#| "Some of the currently installed software is not compatible with %s. If you " +#| "continue, the following will be automatically removed during the upgrade:" +msgid "" +"Installed software is incompatible with %s, and will be automatically removed " +"during upgrade." +msgstr "" +"Certans logicials actualament installats son incompatibles amb %s. Se " +"contunhatz, los que son listats çaijós seràn automaticament suprimits pendent " +"la mesa al nivèl :" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Logicial incompatible" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Metre a nivèl" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Lo logicial installat a partir de « %s » quitarà de recebre de mesas a jorn." + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Desactivar lo depaus logicial ?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Suprimir lo depaus logicial ?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "_Desactivar" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:266 +msgid "_Remove" +msgstr "_Suprimir" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Activar de depauses de logicials novèls" + +#: src/gs-repos-dialog.c:612 +#, fuzzy +#| msgid "Turn on new repositories when they are added." +msgid "Turn on new repositories when they are added" +msgstr "Activar los repertòris novèls quand son aponduts." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "mai d'informacions" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Repertòris addicionals a partir de fonts tèrças seleccionadas — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Depauses tèrces de Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "lo sistèma operatiu" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Aquestes depauses complètan lo logicial per defaut provesit per %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Depauses de Logicials" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "Cap de depaus" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplicacion installada" +msgstr[1] "%u aplicacions installadas" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u extension installada" +msgstr[1] "%u extensions installadas" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplicacion" +msgstr[1] "%u aplicacions" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u extension" +msgstr[1] "%u extensions" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s e %s installada" +msgstr[1] "%s e %s installadas" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Recèrca dels logicials installats…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Suprimir" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Detèsti" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Passable" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "Acceptable" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "M'agrada" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Adòri" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Causissètz una estela per quitar l’avaloracion" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Consacratz mai de temps a la redaccion de l'avís" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Causissètz una apreciacion" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Lo resumit es tròp cort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Lo resumit es tròp long" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "La descripcion es tròp corta" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "La descripcion es tròp longa" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Redigir una avaloracion" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Enviar" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" + +#: src/gs-review-dialog.ui:76 +#, fuzzy +#| msgid "Summary" +msgid "Review Summary" +msgstr "Resumit" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "_Redigir un avís cort" + +#: src/gs-review-dialog.ui:150 +#, fuzzy +#| msgid "" +#| "Find what data is sent in our privacy policy." +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be shown " +"publicly." +msgstr "" +"Trobaretz la lista de las donadas transmesas dins nòstra politica de confidencialitat." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u avís total" +msgstr[1] "%u avises totals" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "sus 5 estelas" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Desconegut" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:227 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Podètz senhalar las apreciacions abusivas, insultantas, e discriminantas." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:232 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Un còp mandada, l'apreciacion serà amagada fins al moment qu'aquela serà " +"estada verificada per un administrator." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:237 +msgid "Report Review?" +msgstr "Senhalar un abús ?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:242 +msgid "_Report" +msgstr "_Senhalar" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:258 +#, fuzzy +#| msgid "Report Review?" +msgid "Remove Review?" +msgstr "Senhalar un abús ?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:261 +msgid "Removing a review cannot be undone." +msgstr "" + +#: src/gs-review-row.ui:89 +#, fuzzy +#| msgid "Write R_eview" +msgid "Like Review" +msgstr "_Redigir una avaloracion" + +#: src/gs-review-row.ui:101 +#, fuzzy +#| msgid "Write R_eview" +msgid "Dislike Review" +msgstr "_Redigir una avaloracion" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Senhalar…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Suprimir…" + +#: src/gs-safety-context-dialog.c:154 +#, fuzzy +#| msgid "" +#| "Application isn’t sandboxed but the distribution has checked that it is " +#| "not malicious" +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"L’aplicacion es pas isolada en nauc de sabla mas la distribucion verifiquèt " +"qu'es pas malvolenta" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Verificatz que vos fisatz del vendeire, perque l’aplicacion es pas isolada" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Cap d’autorizacion" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "L’aplicacion s’executa completament dins un nauc de sabla" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Accès a la ret" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Pòt accedir a l'internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Cap d’accès a la ret" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Pòt pas accedir a l'internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Utiliza los servicis sistèma" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Pòt demandar de donadas als servicis del sistèma" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Utiliza los servicis de session" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Pòt demandar de donadas als servicis de session" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Accès al periferic utilizaire" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Pòt accedir als periferics coma las camèras o las manetas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Cap d'accès al periferic de l’utilizaire" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Pòt pas accedir als periferics coma las camèras o las manetas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Accès al periferic d’entrada" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Accès al microfòn" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Accès al periferic sistèma" + +#: src/gs-safety-context-dialog.c:244 +#, fuzzy +#| msgid "Can access system device files" +msgid "Can access system devices which require elevated permissions" +msgstr "Pòt accedir als fichièrs del sistèma" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Sistèma d’afichatge eretat" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Autorizacions arbitràrias" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Paramètres de l’utilizaire" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Accès complet en lectura e escritura al sistèma de fichièrs" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Pòt legir e escriure de donadas sul sistèma de fichièrs" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Accès en lectura e escritura al repertòri personal" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Pòt legir e escriure totas las donadas del repertòri personal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Accès complet al sistèma de fichièrs" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Pòt legir totas las donadas del sistèma de fichièrs" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Accès complet al repertòri personal" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Pòt legir totas las donadas del repertòri personal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Accès en lectura e escritura sul dossièr de telecargaments" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "" +"Pòt legir e escriure totas las donadas de vòstre dossièr de telecargaments" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Accès en lectura sul dorsièr de telecargaments" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Pòt legir las donadas de vòstre dossièr de telecargaments" + +#: src/gs-safety-context-dialog.c:348 +#, fuzzy +#| msgid "Can read and write all data in your home directory" +msgid "Can read and write all data in the directory" +msgstr "Pòt legir e escriure totas las donadas del repertòri personal" + +#: src/gs-safety-context-dialog.c:359 +#, fuzzy +#| msgid "Can read all data in your home directory" +msgid "Can read all data in the directory" +msgstr "Pòt legir totas las donadas del repertòri personal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Cap d’accès al sistèma de fichièrs" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Pòt pas accedir als fichièrs del sistèma del tot" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Lo desvolopaire de l’aplicacion es verificat" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Lo desvolopaire d’aquesta aplicacion foguèt verificat per èsser segur de lor " +"identitat" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Dependéncias pas seguras" + +#: src/gs-safety-context-dialog.c:399 +msgid "Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Logicial e sas dependàncias son pas mai preses en carga e poirián èsser pas " +"segurs" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Còdi proprietari" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Lo còdi font es pas public, pòt pas èsser auditat d’un biais independent e " +"pòt èsser perilhós" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Còdi analisable" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Lo còdi font es public, pòt èsser auditat d’un biais independent, çò que fa " +"que l’aplicacion a mai de probabilitat d’èsser segura" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s es privilegiat" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s es segur" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s es probablament segur" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s es potencialament pas segur" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s es pas segur" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Desconeguda" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Seguretat" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licéncia" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "Font" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Captura d'ecran precedenta" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Captura d'ecran seguenta" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Cap de captura d'ecran" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Captura d'ecran introbabla" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Fracàs de cargament de l'imatge" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Talha de captura d'ecran introbabla" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Impossible de crear lo cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Captura d'ecran invalida" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Captura d'ecran indisponibla" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Captura d'ecran" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "mai %u correspondéncia" +msgstr[1] "mai %u correspondéncias" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Pagina de recèrca" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Recercar d'aplicacions" + +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "Cap d'aplicacion pas trobada" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "« %s »" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Impossible de telecargar las mesas a jorn" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +#, fuzzy +#| msgid "Unable to download firmware updates from %s" +msgid "Unable to download firmware updates" +msgstr "" +"Impossible de telecargar las mesas a jorn del micrologicial a partir de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, fuzzy, c-format +#| msgid "Unable to download firmware updates from %s" +msgid "Unable to download firmware updates from %s" +msgstr "" +"Impossible de telecargar las mesas a jorn del micrologicial a partir de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Impossible de telecargar las mesas a jorn a partir de %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +#, fuzzy +#| msgid "Unable to update: internet access was required but wasn’t available" +msgid "Unable to update: internet access required" +msgstr "" +"Impossible de metre a jorn : l'accès a Internet es necessari mas indisponible" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +#, fuzzy +#| msgid "Unable to update %s: not enough disk space" +msgid "Unable to update: not enough disk space" +msgstr "Impossible de metre a jorn %s : i a pas pro d'espaci de disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Impossible de telecargar las mesas a jorn a partir de %s : espaci de disc " +"insufisent" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +#, fuzzy +#| msgid "Unable to update %s: authentication was required" +msgid "Unable to update: authentication required" +msgstr "Impossible de metre a jorn %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +#, fuzzy +#| msgid "Unable to update %s: authentication was invalid" +msgid "Unable to update: invalid authentication" +msgstr "Impossible de metre a jorn %s : autentificacion invalida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +#, fuzzy +#| msgid "Unable to update %s: AC power is required" +msgid "Unable to update: permission required" +msgstr "Impossible de metre a jorn %s : brancatz lo sector" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Impossible de telecargar las mesas a jorn : avètz pas la permission " +"d'installar de logicials" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Impossible d'obténer la lista de las mesas a jorn" + +#: src/gs-shell.c:1351 +#, fuzzy +#| msgid "Unable to install %s as download failed" +msgid "Unable to install: download failed" +msgstr "Impossible d'installar %s : lo telecargament a fracassat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, fuzzy, c-format +#| msgid "Unable to install %s as download failed from %s" +msgid "Unable to install %s: failed download from %s" +msgstr "Impossible d'installar %s : lo telecargament dempuèi %s a fracassat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, fuzzy, c-format +#| msgid "Unable to install %s as download failed" +msgid "Unable to install %s: download failed" +msgstr "Impossible d'installar %s : lo telecargament a fracassat" + +#: src/gs-shell.c:1368 +#, fuzzy +#| msgid "Unable to install updates" +msgid "Unable to install: missing runtime" +msgstr "Impossible d’installar las mesas a jorn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, fuzzy, c-format +#| msgid "Unable to install %s as runtime %s not available" +msgid "Unable to install %s: runtime %s unavailable" +msgstr "" +"Impossible d'installar %s : l'environament d'execucion %s es pas disponible" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "Impossible d'installar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +#, fuzzy +#| msgid "Unable to install: internet access was required but wasn’t available" +msgid "Unable to install: internet access required" +msgstr "" +"Installacion impossibla : l'accès a Internet es necessari mas indisponible" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +#, fuzzy +#| msgid "Unable to install: the application has an invalid format" +msgid "Unable to install: invalid app format" +msgstr "Installacion impossibla : lo format de l'aplicacion es pas valid" + +#: src/gs-shell.c:1389 +#, fuzzy +#| msgid "Unable to install %s: not enough disk space" +msgid "Unable to install: not enough disk space" +msgstr "Impossible d'installar %s : i a pas pro d'espaci de disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, fuzzy, c-format +#| msgid "Unable to install %s: not enough disk space" +msgid "Unable to install %s: not enough disk space" +msgstr "Impossible d'installar %s : i a pas pro d'espaci de disc" + +#: src/gs-shell.c:1396 +#, fuzzy +#| msgid "Unable to install %s: authentication was required" +msgid "Unable to install: authentication required" +msgstr "Impossible d'installar %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, fuzzy, c-format +#| msgid "Unable to install %s: authentication was required" +msgid "Unable to install %s: authentication required" +msgstr "Impossible d'installar %s : autentificacion requesida" + +#: src/gs-shell.c:1402 +#, fuzzy +#| msgid "Failed to install file: authentication failed" +msgid "Unable to install: invalid authentication" +msgstr "Impossible d'installar lo fichièr : l'autentificacion a fracassat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, fuzzy, c-format +#| msgid "Failed to install file: authentication failed" +msgid "Unable to install %s: invalid authentication" +msgstr "Impossible d'installar lo fichièr : l'autentificacion a fracassat" + +#: src/gs-shell.c:1409 +#, fuzzy +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to install: permission required" +msgstr "Impossible d'installar %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, fuzzy, c-format +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to install %s: permission required" +msgstr "Impossible d'installar %s : brancatz lo sector" + +#: src/gs-shell.c:1416 +#, fuzzy +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to install: device must be plugged in" +msgstr "Impossible d'installar %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, fuzzy, c-format +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to install %s: device must be plugged in" +msgstr "Impossible d'installar %s : brancatz lo sector" + +#: src/gs-shell.c:1422 +#, fuzzy +#| msgid "Unable to install updates" +msgid "Unable to install: low battery" +msgstr "Impossible d’installar las mesas a jorn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, fuzzy, c-format +#| msgid "Unable to install updates" +msgid "Unable to install %s: low battery" +msgstr "Impossible d’installar las mesas a jorn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, fuzzy, c-format +#| msgid "Unable to update %s from %s as download failed" +msgid "Unable to update %s from %s: download failed" +msgstr "" +"Impossible de metre a jorn %s dempuèi %s, perque lo telecargament a fracassat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, fuzzy, c-format +#| msgid "Unable to update %s as download failed" +msgid "Unable to update %s: download failed" +msgstr "Impossible de metre a jorn %s : lo telecargament a fracassat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, fuzzy, c-format +#| msgid "Unable to install updates from %s as download failed" +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Impossible d’installar las mesas a jorn dempuèi %s, perque lo telecargament a " +"fracassat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +#, fuzzy +#| msgid "Unable to update %s as download failed" +msgid "Unable to update: download failed" +msgstr "Impossible de metre a jorn %s : lo telecargament a fracassat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, fuzzy, c-format +#| msgid "Unable to update %s: not enough disk space" +msgid "Unable to update %s: not enough disk space" +msgstr "Impossible de metre a jorn %s : i a pas pro d'espaci de disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, fuzzy, c-format +#| msgid "Unable to update %s: authentication was required" +msgid "Unable to update %s: authentication required" +msgstr "Impossible de metre a jorn %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, fuzzy, c-format +#| msgid "Unable to update %s: authentication was invalid" +msgid "Unable to update %s: invalid authentication" +msgstr "Impossible de metre a jorn %s : autentificacion invalida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, fuzzy, c-format +#| msgid "Unable to update %s: AC power is required" +msgid "Unable to update %s: permission required" +msgstr "Impossible de metre a jorn %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +#, fuzzy +#| msgid "Unable to update %s: AC power is required" +msgid "Unable to update: device must be plugged in" +msgstr "Impossible de metre a jorn %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, fuzzy, c-format +#| msgid "Unable to update %s: AC power is required" +msgid "Unable to update %s: device must be plugged in" +msgstr "Impossible de metre a jorn %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +#, fuzzy +#| msgid "Unable to update %s" +msgid "Unable to update: low battery" +msgstr "Impossible de metre a jorn %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, fuzzy, c-format +#| msgid "Unable to update %s" +msgid "Unable to update %s: low battery" +msgstr "Impossible de metre a jorn %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "Impossible de metre a jorn %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "Impossible de metre a jorn" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Impossible de metre a nivèl" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Impossible de metre a nivèl cap a %s dempuèi %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +#, fuzzy +#| msgid "Unable to upgrade to %s as download failed" +msgid "Unable to upgrade: download failed" +msgstr "Impossible de metre a nivèl cap a %s : lo telecargament a fracassat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s as download failed" +msgid "Unable to upgrade to %s: download failed" +msgstr "Impossible de metre a nivèl cap a %s : lo telecargament a fracassat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +#, fuzzy +#| msgid "Unable to upgrade to %s: authentication was required" +msgid "Unable to upgrade: internet access required" +msgstr "Impossible de metre a nivèl cap a %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s: authentication was required" +msgid "Unable to upgrade to %s: internet access required" +msgstr "Impossible de metre a nivèl cap a %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +#, fuzzy +#| msgid "Unable to upgrade to %s: not enough disk space" +msgid "Unable to upgrade: not enough disk space" +msgstr "Impossible de metre a nivèl cap a %s : espaci de disc insufisent" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s: not enough disk space" +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Impossible de metre a nivèl cap a %s : espaci de disc insufisent" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +#, fuzzy +#| msgid "Unable to upgrade to %s: authentication was required" +msgid "Unable to upgrade: authentication required" +msgstr "Impossible de metre a nivèl cap a %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s: authentication was required" +msgid "Unable to upgrade to %s: authentication required" +msgstr "Impossible de metre a nivèl cap a %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +#, fuzzy +#| msgid "Unable to upgrade to %s: authentication was invalid" +msgid "Unable to upgrade: invalid authentication" +msgstr "Impossible de metre a nivèl cap a %s : autentificacion invalida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s: authentication was invalid" +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Impossible de metre a nivèl cap a %s : autentificacion invalida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +#, fuzzy +#| msgid "Unable to upgrade to %s: AC power is required" +msgid "Unable to upgrade: permission required" +msgstr "Impossible de metre a nivèl cap a %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s: AC power is required" +msgid "Unable to upgrade to %s: permission required" +msgstr "Impossible de metre a nivèl cap a %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +#, fuzzy +#| msgid "Unable to upgrade to %s: AC power is required" +msgid "Unable to upgrade: device must be plugged in" +msgstr "Impossible de metre a nivèl cap a %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s: AC power is required" +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Impossible de metre a nivèl cap a %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +#, fuzzy +#| msgid "Unable to upgrade to %s" +msgid "Unable to upgrade: low battery" +msgstr "Impossible de metre a nivèl cap a %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s" +msgid "Unable to upgrade to %s: low battery" +msgstr "Impossible de metre a nivèl cap a %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, fuzzy, c-format +#| msgid "Unable to upgrade to %s from %s" +msgid "Unable to upgrade to %s" +msgstr "Impossible de metre a nivèl cap a %s dempuèi %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +#, fuzzy +#| msgid "Unable to install %s: authentication was required" +msgid "Unable to uninstall: authentication required" +msgstr "Impossible d'installar %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, fuzzy, c-format +#| msgid "Unable to install %s: authentication was required" +msgid "Unable to uninstall %s: authentication required" +msgstr "Impossible d'installar %s : autentificacion requesida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +#, fuzzy +#| msgid "Failed to install file: authentication failed" +msgid "Unable to uninstall: invalid authentication" +msgstr "Impossible d'installar lo fichièr : l'autentificacion a fracassat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, fuzzy, c-format +#| msgid "Failed to install file: authentication failed" +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Impossible d'installar lo fichièr : l'autentificacion a fracassat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +#, fuzzy +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to uninstall: permission required" +msgstr "Impossible d'installar %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, fuzzy, c-format +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to uninstall %s: permission required" +msgstr "Impossible d'installar %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +#, fuzzy +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to uninstall: device must be plugged in" +msgstr "Impossible d'installar %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, fuzzy, c-format +#| msgid "Unable to install %s: AC power is required" +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Impossible d'installar %s : brancatz lo sector" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +#, fuzzy +#| msgid "Unable to install updates" +msgid "Unable to uninstall: low battery" +msgstr "Impossible d’installar las mesas a jorn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, fuzzy, c-format +#| msgid "Unable to install updates" +msgid "Unable to uninstall %s: low battery" +msgstr "Impossible d’installar las mesas a jorn" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, fuzzy, c-format +#| msgid "Unable to install %s" +msgid "Unable to uninstall %s" +msgstr "Impossible d'installar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "Impossible d'aviar %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "O planhèm, quicòm a pas foncionat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Impossible de lancer %s : %s es pas installat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "Espaci de disc insufisent per l’operacion" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +#, fuzzy +#| msgid "Unable to install %s as not supported" +msgid "Unable to install: file type not supported" +msgstr "Impossible d'installar %s : es pas pres en carga" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +#, fuzzy +#| msgid "Failed to install: authentication failed" +msgid "Unable to install: authentication failed" +msgstr "Impossible d’installar : l’autentificacion a fracassat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Installacion impossibla" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "Impossible de contactar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +#, fuzzy +#| msgid "Software needs to be restarted to use new plugins." +msgid "Restart Software to use new plugins" +msgstr "Logicials deu èsser reaviat per utilizar los novèls empeutons." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Lo nivèl de batariá es tròp feble" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "A prepaus de Logicials" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "_Depauses de Logicials" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "_Acorchis clavièr" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_Preferéncias" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Recercar" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Menú principal" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Recercar d'aplicacions" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "_Explorar" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Installadas" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Me_sas a jorn" + +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "Tornar en arrièr" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Pas cap" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Donada d'aplicacion" + +#: src/gs-storage-context-dialog.c:140 +#, fuzzy +#| msgid "Data needed for the application to run" +msgid "Data needed for the app to run" +msgstr "Donadas requeridas pel fonciona de l’aplicacion" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Donadas utilizaire" + +#: src/gs-storage-context-dialog.c:146 +#, fuzzy +#| msgid "Data created by you in the application" +msgid "Data created by you in the app" +msgstr "Donadas que creèretz dins l’aplicacion" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Donadas de cache" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Donadas temporàrias en cache" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "La quita aplicacion" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dependéncias requeridas" + +#: src/gs-storage-context-dialog.c:178 +#, fuzzy +#| msgid "Shared system components required by this application" +msgid "Shared system components required by this app" +msgstr "Compausants sistèma partejats requerits per aquesta aplicacion" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Desconegut" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +#, fuzzy +#| msgid "" +#| "Cached data can be cleared from the _application " +#| "settings." +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Las donadas en cache se pòdon escafar als _paramètres de " +"l’aplicacion." + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Emmagazinatge" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (installada)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (installacion en cors)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Telecargament)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (supression en cors)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detalhs" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examinar" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Installadas sus %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "Mesas a jorn installadas" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "Cap de mesa a jorn logiciala pas installada" + +#: src/gs-update-monitor.c:215 +#, fuzzy +#| msgid "Software Updates Are Out of Date" +msgid "Updates Are Out of Date" +msgstr "Las mesas a jorn logicialas son passadas de validitat" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "Verificatz las mesas a jorn logicialas" + +#: src/gs-update-monitor.c:222 +#, fuzzy +#| msgid "Critical Software Update Ready to Install" +msgid "Critical Updates Ready to Install" +msgstr "Mesa a jorn logiciala criticas d'installar" + +#: src/gs-update-monitor.c:223 +#, fuzzy +#| msgid "Unable to install updates as download failed" +msgid "Install critical updates as soon as possible" +msgstr "" +"Impossible d’installar las mesas a jorn, perque lo telecargament a fracassat" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "De mesas a jorn importantas son disponiblas" + +#: src/gs-update-monitor.c:227 +#, fuzzy +#| msgid "Unable to install updates as download failed" +msgid "Download critical updates as soon as possible" +msgstr "" +"Impossible d’installar las mesas a jorn, perque lo telecargament a fracassat" + +#: src/gs-update-monitor.c:233 +#, fuzzy +#| msgid "Software Updates Ready to Install" +msgid "Updates Ready to Install" +msgstr "Mesas a jorn logiciala d'installar" + +#: src/gs-update-monitor.c:234 +#, fuzzy +#| msgid "Software updates are waiting and ready to be installed." +msgid "Software updates are ready and waiting" +msgstr "Mesas a jorn logicials en espèra e prèsta per l’installacion." + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "De mesas a jorn son disponiblas" + +#: src/gs-update-monitor.c:241 +#, fuzzy +#| msgid "Software Updates Failed" +msgid "Software updates can be downloaded" +msgstr "Fracàs de las mesas a jorn logicialas" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplicacion mesa a jorn — Reaviada requesida" +msgstr[1] "%u aplicacions mesas a jorn — Reaviada requesida" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplicacion mesa a jorn" +msgstr[1] "%u aplicacions mesas a jorn" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "%s es estada mesa a jorn." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "Reaviatz l’aplicacion." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s e %s son estadas mesas a jorn." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplicacion requerís una reaviada." +msgstr[1] "%u aplicacions requerisson una reaviada." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inclutz %s, %s e %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +#, fuzzy +#| msgid "Upgrade to continue receiving security updates." +msgid "Upgrade to continue receiving updates" +msgstr "" +"Metètz al nivèl per contunhar de beneficiar de las mesas a jorn de seguretat." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Una novèla version de %s es disponibla a l'installacion" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "De mesas a jorn logicialas son disponiblas" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "Fracàs de las mesas a jorn logicialas" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +#, fuzzy +#| msgid "System updates are now installed" +msgid "Prepared updates were not installed" +msgstr "Las mesas a jorn del sistèma operatiu son ara installadas" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Afichar los detalhs" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Mesa al nivèl sistèma acabada" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Benvenguda dins %s %s !" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Mesa a jorn logiciala installada" +msgstr[1] "Mesas a jorn logicialas installadas" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "" +"Una importanta mesa a jorn del sistèma operatiu es estada installada." +msgstr[1] "" +"D'importantas mesas a jorn del sistèma operatiu son estadas installadas." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Passar en revista" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "Fracàs de mesa a jorn" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "Lo sistèma èra ja a jorn." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "La mesa a jorn es estada anullada." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"L'accès a Internet es necessari mas es pas disponible. Asseguratz-vos " +"qu'avètz un accès a Internet puèi ensajatz tornarmai." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"I a agut un problèma de seguretat amb la mesa a jorn. Consultatz vòstre " +"provesidor de logicial per mai d'informacions." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "There wasn’t enough disk space. Please free up some space and try again." +msgstr "I aviá pas pro d'espaci de disc. Liberatz-ne e ensajatz tornarmai." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update and " +"try again. If the problem persists, contact your software provider." +msgstr "" +"O planhèm : l'installacion de la mesa a jorn a fracassat. Esperatz la mesa a " +"jorn que ven e ensajatz tornarmai. Se lo problèma contunha, contactatz vòstre " +"provesidor de logicials." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Darrièra verificacion : %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Arrestar" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Verificar las mesas a jorn" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +#, fuzzy +#| msgid "Your operating system is no longer supported." +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Vòstre sistèma operatiu es pas mai pres en carga." + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "I pòt aver facturacion" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Recercar de mesas a jorn amb vòstra connexion mobila pòt far l'objècte d'una " +"facturacion." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Recercar m_algrat tot" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Mesas a jorn logicialas telecargadas" + +#: src/gs-updates-page.c:893 +#, fuzzy +#| msgid "%s %s Ready to be Installed" +msgid "Upgrades are ready to be installed" +msgstr "%s e %s prèstes a èsser installadas" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "Recercar de mesas a jorn" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Mesas a jorn" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Pagina de las mesas a jorn" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "Cargament de las mesas a jorn" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "Aquò pòt prendre de temps" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "A jorn" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "Utilizar la connexion mobila ?" + +#: src/gs-updates-page.ui:232 +#, fuzzy +#| msgid "" +#| "Checking for updates when using mobile broadband could cause you to incur " +#| "charges." +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Recercar de mesas a jorn amb vòstre telefòn portable vos pòt èsser facturat." + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "_Recercar malgrat tot" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "Cap de connexion" + +#: src/gs-updates-page.ui:255 +#, fuzzy +#| msgid "Go online to check for updates." +msgid "Go online to check for updates" +msgstr "Se connectar per recercar de mesas a jorn." + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "Paramètres de la _ret" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "Error" + +#: src/gs-updates-page.ui:293 +#, fuzzy +#| msgid "Updates are automatically managed." +msgid "Updates are automatically managed" +msgstr "Las mesas a jorn son geridas automaticament." + +#: src/gs-updates-paused-banner.c:44 +#, fuzzy +#| msgid "Software Updates Failed" +msgid "Software Updates Paused" +msgstr "Fracàs de las mesas a jorn logicialas" + +#: src/gs-updates-paused-banner.c:47 +msgid "Automatic software updates have been paused for the following reasons:\n" +msgstr "" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" + +#: src/gs-updates-paused-banner.c:79 +#, fuzzy +#| msgid "Software Updates Failed" +msgid "Software updates paused" +msgstr "Fracàs de las mesas a jorn logicialas" + +#: src/gs-updates-paused-banner.c:84 +#, fuzzy +#| msgid "Please download waiting software updates." +msgid "Network connection is metered — software updates paused" +msgstr "Telecargatz las mesas a jorn logicials en espèra." + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"La connexion ret interditz los gròsses telecargaments — mesas a jorn " +"logicialas en pausa" + +#: src/gs-updates-paused-banner.c:88 +#, fuzzy +#| msgid "Please download waiting software updates." +msgid "Power saver mode is active — software updates paused" +msgstr "Telecargatz las mesas a jorn logicials en espèra." + +#: src/gs-updates-paused-banner.c:90 +#, fuzzy +#| msgid "Please download waiting software updates." +msgid "Game mode is active — software updates paused" +msgstr "Telecargatz las mesas a jorn logicials en espèra." + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:321 +msgid "_Restart & Update…" +msgstr "_Reaviar e metre a jorn…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:327 +msgid "U_pdate All" +msgstr "Tot metre a j_orn" + +#: src/gs-updates-section.c:404 +#, fuzzy +#| msgid "Software Updates Failed" +msgid "Software Updates Downloaded" +msgstr "Fracàs de las mesas a jorn logicialas" + +#: src/gs-updates-section.c:405 +#, fuzzy +#| msgid "Software Updates Ready to Install" +msgid "Updates are ready to be installed" +msgstr "Mesas a jorn logiciala d'installar" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:496 +msgid "Integrated Firmware" +msgstr "Micrologicial integrat" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:501 +msgid "Requires Restart" +msgstr "Reaviada necessària" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:506 +msgid "App Updates" +msgstr "Mesas a jorn logicialas" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:511 +msgid "Device Firmware" +msgstr "Micrologicial del periferic" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Telecargar" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s disponible" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s disponible" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Ne saber mai tocant la version novèla" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s de %s telecargat" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% telecargat" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Una mesa al nivèl màger, amb de novèlas foncionalitats e mai polida." + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "_Reaviar e metre a nivèl…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Remembratz-vos de salvar vòstras donadas e fichièrs abans una mesa al nivèl." + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, fuzzy, c-format +#| msgid "Failed to refine addon ‘%s’: %s" +msgid "Failed to delete file “%s”: %s" +msgstr "Impossible de tornar definir l’extension « %s » : %s" + +#: lib/gs-utils.c:623 +#, fuzzy, c-format +#| msgid "Failed to refine addon ‘%s’: %s" +msgid "Failed to delete directory “%s”: %s" +msgstr "Impossible de tornar definir l’extension « %s » : %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Apondre, suprimir o metre a jorn d'aplicacions sus aqueste ordenador" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Actualizacion;mesas a jorn;mesa a nivèl;fonts;depauses;preferéncias;installar;" +"desinstallar;programa;aplicacion;logicial;magazin;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "Compatible %s" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Activar" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:71 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3167 +msgid "System Updates" +msgstr "Mesas a jorn sistèma" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:76 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3172 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Mesas a jorn sistèma generalas, talas coma las correccions de seguretat o " +"d’anomalia, e los melhoraments de performanças." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, fuzzy, c-format +#| msgid "An Endless OS update with new features and fixes." +msgid "%s update with new features and fixes." +msgstr "" +"Una mesa a jorn d’Endless OS, amb de novèlas foncionalitats e correccions." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"Lo servici de mesa a jorn d’Endless OS a pas pogut recuperar e aplicar la " +"mesa a nivèl." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Web Aplicacion" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Presa en carga de las aplicacions web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Aviar d'aplicacions web dins un navigador" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Mesa a nivèl per las darrièras foncionalitats e melhoraments d'estabilitat e " +"de performanças." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Presa en carga de Flatpak" + +# Je n'ai trouvé aucune traduction ja existante de Framework dans les modules ja traduits. +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +#, fuzzy +#| msgid "Flatpak is a framework for desktop applications on Linux" +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak es un component logicial per las aplicacions de burèus Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Dorsièr sistèma %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Jos dorsièr personal %s" + +#: plugins/flatpak/gs-flatpak.c:345 +#, fuzzy +#| msgid "Home folder" +msgid "Host system folders" +msgstr "Dorsièr personal" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Repertòri del burèu" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Jos dorsièr Burèu %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Repertòri de documents" + +#: plugins/flatpak/gs-flatpak.c:348 +#, fuzzy, c-format +#| msgid "Home folder" +msgid "Documents subfolder %s" +msgstr "Dorsièr personal" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Repertòri de musica" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Jos dorsièr Musica %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Repertòri d'imatges" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Jos dorsièr Imatges %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Dorsièr public partejat" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Dorsièr public partejat %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Repertòri de vidèos" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Jos dorsièr Vidèos %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Repertòri de modèls" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Jos dorsièr Modèls %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Repertòri de cache utilizaire" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Dorsièr de configuracion utilizaire" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Dorsièr de configuracion utilizaire %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Repertòri de donadas utilizaire" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Dorsièr personal d’environament d’execucion" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Accès al sistèma de fichièrs a %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Telecargament de las metadonadas de Flatpak per %s…" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Impossible de tornar definir l’extension « %s » : %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Installacion per l’utilizaire" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Installacion pel sistèma" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "Identificant de l’aplicacion" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Fracàs de l'installacion de l'apondon « %s » : %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Fracàs de la desinstallacion de l'apondon « %s » : %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. Remove " +"the filter and repeat the install. Detailed error: %s" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "La batariá del periferic es pas pro cargada" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Lo periferic requerís de brancar una alimentacion electrica" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +#, fuzzy +#| msgid "Device cannot be used during update." +msgid "Device cannot be used while the lid is closed" +msgstr "L'aparelh pòt pas èsser utilizat pendent la mesa a jorn." + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s Device Update" +msgstr "Mesa a jorn del periferic « %s »" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s System Update" +msgstr "Mesa a jorn sistèma « %s »" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Mesa a jorn del contrarotlaire embarcat « %s »" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s ME Update" +msgstr "Mesa a jorn del sistèma de gestion (« ME ») de %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Mesa a jorn del sistèma de gestion per entrepresa de (« ME ») de %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:238 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Mesa a jorn del sistèma de gestion pel public màger de (« ME ») de %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:244 +#, c-format +msgid "%s Controller Update" +msgstr "Mesa a jorn del contrarotlaire de %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Mesa a jorn del contrarotlaire Thunderbolt de %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Mesa a jorn del microcodi del processor %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:260 +#, c-format +msgid "%s Configuration Update" +msgstr "%s mesa a jorn de configuracion" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Battery Update" +msgstr "Mesa a jorn de la batariá %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:269 +#, c-format +msgid "%s Camera Update" +msgstr "Mesa a jorn de la camèra %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:273 +#, c-format +msgid "%s TPM Update" +msgstr "Mesa a jorn del TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:277 +#, c-format +msgid "%s Touchpad Update" +msgstr "Mesa a jorn del pavat tactil %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:281 +#, c-format +msgid "%s Mouse Update" +msgstr "Mesa a jorn de la mirga %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:285 +#, c-format +msgid "%s Keyboard Update" +msgstr "Mesa a jorn del clavièr %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Mesa a jorn del contrarotlaire d’emmagazinatge %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Network Interface Update" +msgstr "Mesa a jorn de l’interfàcia ret %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s Display Update" +msgstr "Mesa a jorn de l’afichatge del portatil « %s »" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:304 +#, fuzzy, c-format +#| msgid "%s ME Update" +msgid "%s BMC Update" +msgstr "Mesa a jorn del sistèma de gestion (« ME ») de %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:309 +#, fuzzy, c-format +#| msgid "%s Device Update" +msgid "%s USB Receiver Update" +msgstr "Mesa a jorn del periferic « %s »" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:313 +#, fuzzy, c-format +#| msgid "%s Device Update" +msgid "%s Drive Update" +msgstr "Mesa a jorn del periferic « %s »" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:317 +#, fuzzy, c-format +#| msgid "%s Device Update" +msgid "%s Flash Drive Update" +msgstr "Mesa a jorn del periferic « %s »" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:322 +#, fuzzy, c-format +#| msgid "%s ME Update" +msgid "%s SSD Update" +msgstr "Mesa a jorn del sistèma de gestion (« ME ») de %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:327 +#, fuzzy, c-format +#| msgid "%s TPM Update" +msgid "%s GPU Update" +msgstr "Mesa a jorn del TPM %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:332 +#, fuzzy, c-format +#| msgid "%s Device Update" +msgid "%s Dock Update" +msgstr "Mesa a jorn del periferic « %s »" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:337 +#, fuzzy, c-format +#| msgid "%s ME Update" +msgid "%s USB Dock Update" +msgstr "Mesa a jorn del sistèma de gestion (« ME ») de %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Micrologicial" + +#: plugins/fwupd/gs-plugin-fwupd.c:1922 +#, fuzzy +#| msgid "The update could not be completed." +msgid "Firmware update could not be applied: " +msgstr "La mesa a jorn a fracassat." + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Presa en carga de la mesa a jorn del micrologicial" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Provesís una presa en carga de las mesas a jorn del micrologicial" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Installar un logicial non signat ?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Lo logicial qu’es per èsser installat es pas signat. Serà pas possible de " +"verificar l’origina de las mesas a jorn d’aqueste logicial o se las mesas a " +"jorn foguèron manipuladas." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Telecargar un logicial non signat ?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"De mesas a jorn pas signadas son disponiblas. Sens signatura, es pas possible " +"de verificar l’origina de la mesa a jorn o se foguèt manipulada." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Actualizar lo logicial non signat ?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"De mesas a jorn pas signadas son disponiblas. Sens signatura, es pas possible " +"de verificar l’origina de la mesa a jorn o se foguèt manipulada. Las mesas a " +"jorn logicialas seràn desactivadas fins que las mesas a jorn pas signadas " +"sián levadas o actualizadas." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +#, fuzzy +#| msgid "Unable to install updates" +msgid "Failed to install updates: " +msgstr "Impossible d’installar las mesas a jorn" + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paquet" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1410 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1433 +msgid "Failed to wait on transaction end before download: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1440 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1453 +#, fuzzy +#| msgid "Unable to download updates" +msgid "Failed to download updates: " +msgstr "Impossible de telecargar las mesas a jorn" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1492 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1502 +#, fuzzy +#| msgid "Unable to install updates" +msgid "Failed to trigger update: " +msgstr "Impossible d’installar las mesas a jorn" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3267 +msgid "Operating System (OSTree)" +msgstr "Sistèma operatiu (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Botiga dels snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Presa en carga de Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Un snap es un paquet logicial Linux universal" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Una faiçon eleganta de gerir las aplicacions de vòstre sistèma." + +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Picatz una chifra de 1 a %u : " + +#~ msgid "Choose an app:" +#~ msgstr "Causissètz una aplicacion :" + +#~ msgid "%s is now installed" +#~ msgstr "%s es ara installada" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Una aplicacion es estada suprimida" +#~ msgstr[1] "Mai d’una aplicacion son estadas suprimidas" + +#~ msgid "Unable to find “%s”" +#~ msgstr "Impossible de trobar « %s »" + +#, fuzzy +#~| msgid "Downloading software catalog" +#~ msgid "Downloading Software Catalog" +#~ msgstr "Telecargament del catalòg de logicials" + +#~ msgid "Moderate page" +#~ msgstr "Moderar la pagina" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "I a pas d'avaloracion a moderar" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Aqueste avís vos es estat util ?" + +#~ msgid "Yes" +#~ msgstr "Òc" + +#~ msgid "No" +#~ msgstr "Non" + +#~ msgid "Meh" +#~ msgstr "Bòf" + +#~ msgid "Outdated SDK version" +#~ msgstr "Version de SDK obsolèta" + +#~ msgid "Unable to install updates" +#~ msgstr "Impossible d’installar las mesas a jorn" + +#, fuzzy +#~| msgid "Unable to install %s: authentication was invalid" +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Impossible d'installar %s : autentificacion invalida" + +#~ msgid "Network Settings" +#~ msgstr "Paramètres ret" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Las mesas a jorn del sistèma operatiu son indisponiblas" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "" +#~ "Fracàs d'installacion d'una importanta mesa a jorn del sistèma operatiu." + +#~ msgid "No Network" +#~ msgstr "Pas cap de ret" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "L'accès a Internet es necessari per recercar de mesas a jorn." + +#~ msgid "Network _Settings" +#~ msgstr "Paramètres _ret" + +#, fuzzy +#~| msgid "Software updates are waiting and ready to be installed." +#~ msgid "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Mesas a jorn logicials en espèra e prèsta per l’installacion." + +#, fuzzy +#~| msgid "Software updates are waiting and ready to be installed." +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Mesas a jorn logicials en espèra e prèsta per l’installacion." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Telecargament de las informacions de mesa al nivèl…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Mesas a jorn automaticas en pausa" + +#, fuzzy +#~| msgid "" +#~| "The current network is metered. Metered connections have data limits or " +#~| "charges associated with them. To save data, automatic updates have " +#~| "therefore been paused.\n" +#~| "\n" +#~| "Automatic updates will be resumed when an un­metered network becomes " +#~| "available. Until then, it is still possible to manually install updates.\n" +#~| "\n" +#~| "Alternatively, if the current network has been in­correctly identified as " +#~| "being metered, this setting can be changed." +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "La ret actuala es ligada a un quòta. Las connexions mesuradas possedisson " +#~ "de limits de donadas o de fraisses. Per estalviar de donadas, las mesas a " +#~ "jorn automaticas son en pausa.\n" +#~ "\n" +#~ "Las mesas a jorn automaticas tornaràn tre qu’una ret sens quòta serà " +#~ "disponibla. Pasmens es totjorn possible d’installar manualament las mesas " +#~ "a jorn.\n" +#~ "\n" +#~ "Se la ret actuala foguèt incorrèctament identificada coma limitada, se pòt " +#~ "modificar aqueste paramètre." + +#~ msgid "Open Network _Settings" +#~ msgstr "Dobrir los paramètre_s ret" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Per evitar de despensas e de quòta ret, las mesas a jorn de logicials son " +#~ "pas automaticament telecargadas sus connexion mobil o limitadas." + +#, fuzzy +#~| msgid "" +#~| "Downloads and installs software updates in the background, when possible." +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Telecargar e installar las mesas a jorn logicialas en rèireplan, quand se " +#~ "pòt." + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Afichar sonque las aplicacions liuras" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Afichar sonque las aplicacions jos licéncia liura e amagar las aplicacions " +#~ "proprietaris" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "De qué vos agrada dins aquesta aplicacion? Daissar vòstre retorn amb " +#~ "vòstras rasons d’escriure un avís ajuda los autres." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Impossible de telecargar las mesas a jorn : l'accès a Internet èra " +#~ "necessari mas indisponible" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "" +#~ "Impossible de telecargar las mesas a jorn : espaci de disc insufisent" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "" +#~ "Impossible de telecargar las mesas a jorn : autentificacion requesida" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Impossible de telecargar las mesas a jorn : autentificacion invalida" + +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Impossible d'installar %s : avètz pas la permission d'installar de " +#~ "logicials" + +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Impossible d’installar %s : la batariá es pas pro cargada" + +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Impossible d’installar las mesas a jorn : espaci de disc insufisent" + +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "" +#~ "Impossible d’installar las mesas a jorn : una autentificacion èra requesida" + +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "" +#~ "Impossible d’installar las mesas a jorn : l’autentificacion èra pas valida" + +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Impossible de metre a jorn %s : avètz pas la permission de metre a jorn " +#~ "los logicials" + +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Impossible d’installar las mesas a jorn : avètz pas la permission de metre " +#~ "a jorn los logicials" + +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Impossible d’installar las mesas a jorn : brancatz l’alimentacion sector" + +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Impossible de metre a jorn %s : la batariá es pas pro cargada" + +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "Impossible d’installar las mesas a jorn : la batariá es pas pro cargada" + +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Impossible de metre a nivèl cap a %s : l’accès a Internet èra necessari " +#~ "mas èra pas disponible" + +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Impossible de metre a nivèl cap a %s : avètz pas la permission d'efectuar " +#~ "la mesa a nivèl" + +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Impossible de metre a nivèl cap a %s : la batariá es pas pro cargada" + +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Impossible de desinstallar %s : autentificacion requesida" + +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Impossible de desinstallar %s : autentificacion invalida" + +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Impossible de desinstallar %s : avètz pas la permission de desinstallar lo " +#~ "logicial" + +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Impossible de desinstallar %s : brancatz lo sector" + +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Impossible de desinstallar %s : la batariá es pas pro cargada" + +#~ msgid "Unable to remove %s" +#~ msgstr "Impossible de desinstallar %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Impossible d’installar lo fichièr : es pas pres en carga" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Impossible d’installar : pas pres en carga" + +#~ msgid "AC power is required" +#~ msgstr "Brancatz lo sector" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Connexion limitada ‒ Mesas a jorn automaticas en pausa" + +#~ msgid "Find Out _More" +#~ msgstr "Ne saber _mai" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Una importanta mesa a jorn logiciala es prèsta per l’installacion." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Important : de mesas a jorn criticas son en espèra." + +#~ msgid "Show verbose debugging information" +#~ msgstr "Afichar las informacions detalhadas de desbugatge" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Pòt accedir als fichièr arbitràriament" + +#~ msgid "Downloading featured images…" +#~ msgstr "Telecargament dels imatges meses en avant…" + +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Volètz vertadièrament desinstallar %s ?" + +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s serà suprimida e la vos caldrà reïnstallar per la poder utilizar " +#~ "tornamai." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "L’orodatatge del darrièr moment quand lo sistèma èra en linha e qu'a " +#~ "obtengut de mesas a jorn" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Aquesta aplicacion es pas disponibla dins vòstra lenga e s’aficharà en " +#~ "anglés estatsunidenc." + +#, fuzzy +#~| msgid "Selected add-ons will be installed with the application." +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Las extensions seleccionadas seràn installadas amb l'aplicacion." + +#~ msgid "Post Review" +#~ msgstr "Mandar l'apreciacion" + +#~ msgid "_Post" +#~ msgstr "_Mandar" + +#~ msgid "No screenshot provided" +#~ msgstr "Cap de captura d'ecran pas provesida" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Mesas a jorn" + +#~ msgid "Refresh" +#~ msgstr "Actualizar" + +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s es pas mai pres en carga." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Aquò significa que recep pas mai de mesas a jorn de seguretat." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Es recomandat de metre al nivèl cap a una version mai recenta." + +#~ msgid "Update All" +#~ msgstr "Tot metre a jorn" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Gestionari d'aplicacions per GNOME" + +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "An application" +#~ msgstr "Una aplicacion" + +#~ msgid "Applications" +#~ msgstr "Aplicacions" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Telecargament del catalòg de logicials en cors" + +#~ msgid "Name" +#~ msgstr "Nom" + +#~ msgid "system" +#~ msgstr "sistèma" + +#~ msgid "user" +#~ msgstr "utilizaire" + +#~ msgid "Channel" +#~ msgstr "Canal" + +#~ msgid "Branch" +#~ msgstr "Branca" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Installacion" + +#~ msgid "Version" +#~ msgstr "Version" + +#~ msgid "_Continue" +#~ msgstr "_Contunhar" + +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u aplicacion" +#~ msgstr[1] "%u aplicacions" + +#~ msgid "Rating" +#~ msgstr "Avaloracion" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Donatz un brèu resumit de vòstra apreciacion, coma : « Aplicacion geniala, " +#~ "recomandi »." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Repassar" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Qué pensatz de l'aplicacion ? Argumentatz vòstres motius." + +#~ msgid "Access arbitrary files" +#~ msgstr "Accès arbitrari als fichièrs" + +#, fuzzy +#~| msgid "Can read all data on the file system" +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Pòt legir totas las donadas del sistèma de fichièrs" + +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Primary Menu" +#~ msgstr "Menú principal" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Cap de de mesa a jorn pas installada sus aqueste sistèma." + +#~ msgid "Application Updates" +#~ msgstr "Mesas a jorn de l'aplicacion" + +#~ msgid "GNOME Web" +#~ msgstr "Web GNOME" + +#~ msgid "A list of popular applications" +#~ msgstr "Recercar d'aplicacions" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Una lista d'aplicacion a utilizar, passant otra la qu'es definida pel " +#~ "sistèma." + +#~ msgid "Checking…" +#~ msgstr "Verificacion…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "GNOME Software" +#~ msgstr "Logicials de GNOME" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "" +#~ "L’URI que fa referéncia al rèireplan per una banièra de mesa a nivèl." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "L’URI pòt conténer fins a tres « %u », que seràn remplaçats per la version " +#~ "de la mesa a nivèl." + +#~ msgid "Loading…" +#~ msgstr "Cargament…" + +#~ msgid "Welcome" +#~ msgstr "Benvenguda" + +#~ msgid "Welcome to Software" +#~ msgstr "Benvenguda dins Logicials" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Logicials vos permet d'installar totas las aplicacions que n'avètz besonh " +#~ "a partir d'un sol endreit. Consultatz nòstras recomandacions, las " +#~ "categorias, e recercatz las aplicacions que vos interèssan." + +#~ msgid "_Browse Software" +#~ msgstr "_Percórrer los Logicials" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Telecargament de las apreciacions sus l’aplicacion…" + +#~ msgid "_Add shortcut" +#~ msgstr "_Apondre un acorchi" + +#~ msgid "Re_move shortcut" +#~ msgstr "Supri_mir l’acorchi" + +#~ msgid "OS Updates" +#~ msgstr "Mesas a jorn del sistèma operatiu" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "" +#~ "Inclutz de melhoraments de performàncias, d'estabilitat e de seguretat." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Telecargament de la signatura de la mesa a jorn del micrologicial…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Telecargament de las metadonadas de mesa a jorn del micrologicial…" + +#, fuzzy +#~| msgid "App has unknown permissions" +#~ msgid "Software has unknown permissions" +#~ msgstr "L'aplicacion a d’autorizacions desconegudas" + +#, fuzzy +#~| msgid "No software installed from this source" +#~ msgid "Software comes from a trusted source" +#~ msgstr "Cap de logicial pas installat dempuèi aquesta font" + +#~ msgid "Unknown Permissions" +#~ msgstr "Autorizacions desconegudas" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "" +#~ "Aficha lo convit de comandas per installar los depauses de logicials non-" +#~ "liures" + +#~ msgid "Editor’s Picks" +#~ msgstr "Seleccion de la distribucion" + +#~ msgid "Recently Updated" +#~ msgstr "Mes a jorn recentament" + +#~ msgid "_Read More" +#~ msgstr "_Ne saber mai" + +#~ msgid "_Read Less" +#~ msgstr "_Ne veire mens" + +#~ msgid "_Launch" +#~ msgstr "A_viar" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Pas jamai" + +#~ msgid "Localized in your Language" +#~ msgstr "Localizat dins vòstra lenga" + +#~ msgid "Release Activity" +#~ msgstr "Activitat de publicacion" + +#~ msgid "Developer" +#~ msgstr "Desvolopaire" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Desinstallada" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Installada" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Mesa a jorn" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Desconeguda" + +#~ msgid "History" +#~ msgstr "Istoric" + +#~ msgid "More…" +#~ msgstr "Mai…" + +#~ msgid "Recommended Games" +#~ msgstr "Jòcs recomandats" + +#, fuzzy +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Creation Applications" +#~ msgstr "Aplicacions de dessenh recomandadas" + +#, fuzzy +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Work Applications" +#~ msgstr "Aplicacions de dessenh recomandadas" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Certans d'aqueles logicials son proprietaris e compòrtan de restriccions a " +#~ "prepaus de l’utilizacion, lo partiment e l’accès al còdi font." + +#~ msgid "Find out more…" +#~ msgstr "Ne saber mai…" + +#~ msgid "Recent Releases" +#~ msgstr "Versions recentas" + +#~ msgid "Remove “%s”?" +#~ msgstr "Suprimir « %s » ?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Desactivar « %s » ?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Pas cap de depaus suplementari" + +#~ msgid "_Remove…" +#~ msgstr "_Suprimir…" + +#~ msgid "_Disable…" +#~ msgstr "_Desactivar…" + +#~ msgid "Disabling" +#~ msgstr "Desactivacion" + +#~ msgid "Enabled" +#~ msgstr "Activat" + +#~ msgid "Disabled" +#~ msgstr "Desactivat" + +#~ msgid "_Remove All" +#~ msgstr "Suprimir _tot" + +#~ msgid "Setting Up Updates…" +#~ msgstr "Reglar las mesas a jorn en cors…" + +#~ msgid "Looking for New Updates…" +#~ msgstr "Recèrca de novèlas mesas a jorn…" + +#~ msgid "_Restart Now" +#~ msgstr "_Reaviar ara" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Las mesas a jorn seràn aplicadas un còp l’ordenador reaviat." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "En espèra del telecargament de %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Telecargament de %s %s" + +#~ msgid "Select All" +#~ msgstr "Seleccionar tot" + +#~ msgid "Select None" +#~ msgstr "Seleccionar pas res" + +#~ msgid "Featured %s" +#~ msgstr "%s mesas en avant" + +#~ msgid "Show" +#~ msgstr "Afichar" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Menú del filtre de las soscategorias" + +#~ msgid "Sort" +#~ msgstr "Triar" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Menú de triada de las soscategorias" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgid "Audio & Video" +#~ msgstr "Àudio e vidèo" + +#~ msgid "Developer Tools" +#~ msgstr "Aisinas de desvolopament" + +#~ msgid "Education & Science" +#~ msgstr "Educacion e sciéncias" + +#~ msgid "Games" +#~ msgstr "Jòcs" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafismes e fotografia" + +#~ msgid "Productivity" +#~ msgstr "Burotica" + +#~ msgid "Communication & News" +#~ msgstr "Comunicacion e nòvas" + +#~ msgid "Utilities" +#~ msgstr "Utilitaris" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Impossible de determinar a quina partida del sistèma aquesta aplicacion a " +#~ "accès. Es tipic de las aplicacions ancianas." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Bassas" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Intermediàrias" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Elevadas" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Desconeguda" + +#~ msgid "Public domain" +#~ msgstr "Domeni public" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://oc.wikipedia.org/wiki/Domeni_public" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Los utilizaires son tenguts al respècte d'aquesta licéncia :" +#~ msgstr[1] "Los utilizaires son tenguts al respècte d'aquestas licéncias :" + +#~ msgid "Sandboxed" +#~ msgstr "Dins un nauc de sabla" + +#~ msgid "Category" +#~ msgstr "Categoria" + +#~ msgid "Free" +#~ msgstr "Liure" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Desconeguda" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Aquò significa que lo logicial pòt èsser liurament utilizat, copiat, " +#~ "distribuit, estudiat e modificat." + +#~ msgid "Proprietary Software" +#~ msgstr "Logicial proprietari" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. There " +#~ "are often restrictions on its use and its source code cannot usually be " +#~ "accessed." +#~ msgstr "" +#~ "Aquò significa que lo logicial es la proprietat d'una persona fisica e " +#~ "morala. Son utilizacion es lo mai sovent restrenta e son còdi font de " +#~ "costuma inaccessible." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Los tèrmes de la licéncia d'aqueste logicial son desconeguts." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "L'aplicacion es estada avalorada atal perque representa :" + +#~ msgid "No details were available for this rating." +#~ msgstr "Cap d'informacion es pas disponibla per aquesta avaloracion." + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Aplicacions àudio e vidèo recomandadas" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Aplicacions de burotica recomandadas" + +#~ msgid "ratings in total" +#~ msgstr "total de las evaluacions" + +#~ msgid "Software is up to date" +#~ msgstr "Los logicials son a jorn" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "ORDS es un servici que permet als utilizaires d'evaluar las aplicacions" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Activar lo depaus d’extensions GNOME Shell" + +#~ msgid "About %s" +#~ msgstr "A prepaus de %s" + +#~ msgid "Extension Settings" +#~ msgstr "Paramètres ret" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Las extensions son a utilizar a vòstres pròpris risques. Se avètz de " +#~ "problèmas, es recomandat de las desactivar." + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Personatges de dessenh animat en situacion de dangièr" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Personatges de dessenh animat en conflicte agressiu" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "" +#~ "Illustracion de violéncias implicant los personatges del dessenh animat" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Personatges en situacions dangierosas francament irrealas" + +#~ msgid "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Personatges en situacion de conflicte agressiu francament irreal" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Illustracion violenta francament irreala" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Personatges mejanament realistas en situacion dangierosa" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Illustracions de personatges realistas en conflicte agressiu" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Illustracions de violéncias implicant de personatges realistas" + +#~ msgid "No bloodshed" +#~ msgstr "Pas cap de massacre" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Chaple irrealista" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Chaple realista" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Illustracions d'un chaple e de mutilacions corporalas" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Viòl e autre compòrtament sexual violent" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Allusions a de bevendas alcoolizadas" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Usatge de bevendas alcoolicas" + +#~ msgid "References to illicit drugs" +#~ msgstr "Allusions a de drògas illicitas" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Usatge de drògas illicitas" + +#~ msgid "Use of tobacco products" +#~ msgstr "Referéncia al tabat" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Nud artistic de corta durada" + +#~ msgid "Prolonged nudity" +#~ msgstr "Nuditat perlongada" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Allusions e imatges provocators" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Recercar d'aplicacions" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Illustracions de compòrtaments sexuals" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Utilizacion moderada e ocasionnala d'injúrias" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Utilizacion moderada d'injúrias" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Utilizacion fòrta e frequenta d'injúrias" + +#~ msgid "Slapstick humor" +#~ msgstr "Umor burlèsc" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Umor vulgar e de regòla" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Umor per adultes e sexual" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Actituds negativas de cap a de gropes especifics de gents" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Discriminacions destinadas a nafrar emocionalament" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Discriminacions explicitas basadas sul genre, lo sèxe, la raça e la " +#~ "religion" + +#~ msgid "Product placement" +#~ msgstr "Gestion de projècte" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Allusions explicitas a de produits de marca especifica e depausada" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Los utilizaires son encoratjats a crompar d'elements especifics del monde " +#~ "real" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "" +#~ "Pariatges sus d'eveniments aleatòris amb l'ajuda de getons e a crèdit" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Pariatges amb de moneda « fictiva »" + +#~ msgid "Gambling using real money" +#~ msgstr "Pariatges amb d'argent vertadièr" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Los utilizaires son encoratjats a donar d’argent real" + +#~| msgid "Ability to spend real money in-game" +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Possibilitat de despensar d'argent vertadièr dins l’aplicacion" + +#~| msgid "User-to-user game interactions without chat functionality" +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Interaccions entre utilizaires sens possibilitat de discussion" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Possibilitat moderada de discutir entre utilizaires" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Possibilitat de discutir o se veire sens contròtle entre utilizaires" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Partiment dels noms d'utilizaire de rets socialas e de las adreças corrièr " +#~ "electronic" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Verificacion se s’agís de la darrièra version de l’aplicacion" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Partiment de las donadas de diagnostic que permet pas l’identification de " +#~ "l’utilizaire" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Partiment d’informacions que permet l’identificacion de l’utilizaire" + +#~| msgid "Sharing physical location to other users" +#~ msgid "Sharing physical location with other users" +#~ msgstr "Partiment de geolocalizacion amb los autres utilizaires" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Allusions indirèctas a l’omosexualitat" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Estrentas entre personas d’un meteis sèxe" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Imatges de comportaments sexuals entre personas d’un meteis sèxe" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Allusions indirèctas a la prostitucion" + +#~| msgid "Direct references of prostitution" +#~ msgid "Direct references to prostitution" +#~ msgstr "Allusions dirèctas a la prostitucion" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Imatges d’actes de prostitucion" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Allusions indirèctas a l’adultèri" + +#~| msgid "Direct references of adultery" +#~ msgid "Direct references to adultery" +#~ msgstr "Allusions dirèctas a l’adultèri" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Imatges d’actes d’adultèri" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Representacions umanas leugièrament vestidas" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Representacions umanas amb caractèr dobèrtament sexual" + +#~| msgid "Depictions or references to historical desecration" +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Allusions o imatges de profanacions istoricas" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Representacions d’actes de profanacion contemporanèus sus umans" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Imatges d’actes de profanacion contemporanèus sus umans" + +#~ msgid "Visible dead human remains" +#~ msgstr "Imatges de rèstas umanas" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Rèstas umanas expausadas als elements" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Imatges de profanacions sus de còsses umans" + +#~| msgid "Depictions or references to historical slavery" +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Representacions o allusions a l’esclavagisme istoric" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Representacions d’esclavagisme contemporanèu" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Imatges d’esclavagisme contemporanèu" + +#~ msgid "General" +#~ msgstr "General" + +#~ msgid "ALL" +#~ msgstr "TOTES" + +#~ msgid "Teen" +#~ msgstr "Adolescents" + +#~ msgid "Everyone 10+" +#~ msgstr "10 ans e mai" + +#~ msgid "Everyone" +#~ msgstr "Tot lo monde" + +#~ msgid "Early Childhood" +#~ msgstr "Bas atge" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Desconeguda" + +#~| msgid "Failed to load image" +#~ msgid "Failed to load components" +#~ msgstr "Fracàs de cargament de components" + +#~ msgid "CSS validated OK!" +#~ msgstr "Lo CSS es estat validat confòrme !" + +#~ msgid "Failed to load file" +#~ msgstr "Fracàs de cargament del fichièr" + +#~ msgid "Unsaved changes" +#~ msgstr "Modificacions non enregistradas" + +#~ msgid "The application list is already loaded." +#~ msgstr "La lista d’aplicacions es ja cargada." + +#~ msgid "Merge documents" +#~ msgstr "Fusionar los documents" + +#~ msgid "Throw away changes" +#~ msgstr "Abandonar las modificacions" + +#~ msgid "Open AppStream File" +#~ msgstr "Dobrir lo fichièr AppStream" + +#~| msgid "Open AppStream File" +#~ msgid "Save AppStream File" +#~ msgstr "Enregistrar lo fichièr AppStream" + +#~ msgid "_Save" +#~ msgstr "_Enregistrar" + +#~ msgid "%s banner design deleted." +#~ msgstr "Lo dessenh de la bandièra de %s es suprimit." + +#~ msgid "Banner design deleted." +#~ msgstr "Lo dessenh de la bandièra es suprimit." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "La lista d’aplicacions compòrta de modificacions non enregistradas." + +#~ msgid "Use verbose logging" +#~ msgstr "Afichar las informacions detalhadas de desbugatge" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Conceptor de la bandièra « Logicials de GNOME »" + +#~ msgid "No Designs" +#~ msgstr "Pas cap de dessenh" + +#~ msgid "Error message here" +#~ msgstr "Messatge d’error aicí" + +#~ msgid "Category Featured" +#~ msgstr "Mesa en avant de la categoria" + +#~ msgid "Undo" +#~ msgstr "Anullar" + +#~ msgid "Banner Designer" +#~ msgstr "Conceptor de la bandièra" + +#~ msgid "New Banner" +#~ msgstr "Novèla bandièra" + +#~ msgid "Import from file" +#~ msgstr "Importar dempuèi lo fichièr" + +#~ msgid "Export to file" +#~ msgstr "Exportar cap al fichièr" + +#~ msgid "this website" +#~ msgstr "aqueste site Web" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Anam far las crompas" + +#~ msgid "Spacing" +#~ msgstr "Espaçament" + +#~ msgid "The amount of space between children" +#~ msgstr "L'espaçament entre elements enfants" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Suprimida" + +#~ msgid "Format" +#~ msgstr "Format" + +#~| msgid "Featured Application" +#~ msgid "Featured Applications" +#~ msgstr "Aplicacions mesas en avant" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Sètz segur que volètz suprimir %s ?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Aquesta aplicacion deu èsser raviada per utilizar los novèls empeutons." + +#~ msgid "Security Updates Pending" +#~ msgstr "Mesas a jorn de seguretat en espèra" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Es recomandat d'installar las mesas a jorn importantas ara" + +#~ msgid "Restart & Install" +#~ msgstr "Reaviar e _installar" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "D'importantas mesas a jorn del sistèma operatiu e d'aplicacions son " +#~ "prèstas a èsser installadas." + +#~ msgid "View" +#~ msgstr "Afichar" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Ièr, %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Ièr, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "I a tres jorns" + +#~ msgid "Four days ago" +#~ msgstr "I a quatre jorns" + +#~ msgid "Five days ago" +#~ msgstr "I a cinc jorns" + +#~ msgid "Six days ago" +#~ msgstr "I a sièis jorns" + +#~ msgid "Two weeks ago" +#~ msgstr "I a doas setmanas" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Concebre las melhoras bandièras per Logicials de GNOME" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Logicials;Aplicacions;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Extensions Shell" + +#~ msgid "%s ME" +#~ msgstr "Sistèma de gestion « %s »" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Depaus d’extensions GNOME Shell" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Telecargament de las metadonadas de l’extension shell…" + +#~| msgctxt "Menu of Add-ons" +#~| msgid "Shell Extensions" +#~ msgid "GNOME Shell Extension" +#~ msgstr "Extensions GNOME Shell" + +#~ msgid "Show the folder management UI" +#~ msgstr "Aficha l'interfàcia d'utilizaire de gestion dels dorsièrs" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_Tot" + +#~ msgid "Folder Name" +#~ msgstr "Nom del dorsièr" + +#~ msgid "_Add" +#~ msgstr "_Apondre" + +#~ msgid "Add to Application Folder" +#~ msgstr "Apondre al dorsièr Aplicacions" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Afichar las informacions de perfilatge del servici" + +#~ msgid "To continue you need to sign in." +#~ msgstr "Vos cal vos autentificar per contunhar." + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Vos cal vos autentificar alprèp de %s per contunhar." + +#~ msgid "Email address" +#~ msgstr "Adreça de corrièr electronic" + +#~ msgid "I have an account already" +#~ msgstr "Ai ja un compte" + +#~ msgid "I want to register for an account now" +#~ msgstr "Vòli enregistrar un compte ara" + +#~ msgid "Sign in automatically next time" +#~ msgstr "M'autentificar automaticament lo còp que ven" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Sasir vòstre còdi personal d'autentificacion d'usatge unic." + +#~ msgid "PIN" +#~ msgstr "Còdi personal" + +#~ msgid "Authenticate" +#~ msgstr "M’autentificar" + +#~ msgid "Continue" +#~ msgstr "Contunhar" + +#~| msgid "Updated" +#~ msgid "Top Rated" +#~ msgstr "Las melhor notadas" + +#~ msgid "Click on items to select them" +#~ msgstr "Clicatz suls elements per los seleccionar" + +#~ msgid "Select" +#~ msgstr "Seleccionar" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Apondre al dorsièr…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Desplaçar cap a lo dorsièr…" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Fracàs de las mesas a jorn logicialas" + +#~ msgid "_About" +#~ msgstr "A _prepaus" + +#~ msgid "_Quit" +#~ msgstr "_Quitar" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s va èsser installat e seretz facturat %s." + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "D'informacions sus %s, e tanben de possibilitats d'obtencion d'un codec " +#~ "capable de difusar aqueste format son disponiblas sul site Web." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~| msgid "Unable to update %s: authentication was required" +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Impossible de metre a jorn %s : autentificacion requesida" + +#~| msgid "Unable to update %s: authentication was invalid" +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Impossible de metre a jorn %s : autentificacion invalida" + +#~| msgid "Unable to update %s: not enough disk space" +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Impossible de metre a jorn %s : i a pas pro d’espaci de disc" + +#~| msgid "Unable to update %s: authentication was required" +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Impossible de metre a jorn %s : autentificacion requesida" + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Es impossible d'installar de logicials tant qu'aquò es pas resolgut." + +#~ msgid "For more information, visit %s." +#~ msgstr "I a mai d'informacions aicí : %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Impossible de metre a jorn %s dempuèi %s" + +#~ msgid "Downloading new updates…" +#~ msgstr "Telecargament de novèlas mesas a jorn…" + +#~ msgid "Restart & _Install" +#~ msgstr "Reaviar e _installar" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~| msgid "Setting up updates…" +#~ msgid "Getting runtime source…" +#~ msgstr "Telecargament de las fonts dels environaments d’execucion…" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba permet als desvolopaires de crear aisidament d'aplicacions autonòmas" + +#~| msgid "Downloading new updates…" +#~ msgid "Downloading application page…" +#~ msgstr "Telecargament de la pagina de l’aplicacion…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "L'ultima plataforma de divertiment de Valve" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "" +#~ "La lista de las fonts suplementàrias que son estadas activadas " +#~ "precedentament" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "La lista de fonts que son estatdas activadas precedentament al moment de " +#~ "l'installacion d'aplicacions tierces." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Afichar las logicials non-liures dins las résultats de recèrca" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "" +#~ "Una lista de las fonts non-liuras que pòdon èsser activadas opcionalament" + +#~ msgid "“%s” [%s]" +#~ msgstr "« %s » [%s]" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Activar las fonts logicialas proprietàrias ?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Pas cap d'aplicacion e d'extension installada ; d'autres logicials o " +#~ "poirián èsser" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "" +#~ "A generalament de restriccions a prepaus de l'utilizacion e l'accès al " +#~ "còdi font." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Fonts logicialas proprietàrias" + +#~ msgid "Remove Source" +#~ msgstr "Suprimir la font" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you access " +#~ "to additional software that is not provided by %s." +#~ msgstr "" +#~ "Las fonts de logicials pòdon èsser telecargadas dempuèi Internet. Vos " +#~ "dònan accès a de logicials que son pas provesits per %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from it." +#~ msgstr "" +#~ "Suprimir una font suprimís tanben totes los logicials installats dempuèi " +#~ "aquesta." + +#~ msgid "Installed from this Source" +#~ msgstr "Installats dempuèi aquesta font" + +#~ msgid "Last Checked" +#~ msgstr "Darrièra verificacion" + +#~ msgid "Added" +#~ msgstr "Aponduda" + +#~ msgid "Website" +#~ msgstr "Site Web" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Accions de jòc pré-définies entre jogaires sens possibilitat de discussion" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~| msgid "All" +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Tot" + +#~| msgid "Featured" +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Tot" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~ msgid "Total" +#~ msgstr "Total" + +#~ msgid "Could not find '%s'" +#~ msgstr "« %s » es introuvable" + +#~ msgid "Installation of %s failed." +#~ msgstr "L'installacion de %s a fracassat." + +#~ msgid "Removal of %s failed." +#~ msgstr "La desinstallacion de %s a fracassat." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Asseguratz-vos d'avoir un accès a Internet puèi réessayez." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Liberatz-ne e ensajatz tornamai." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "" +#~ "Se lo problèma persistís, contactatz lo provesidor de vòstre logicial." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~| msgid "All" +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Tot" + +#~| msgid "Featured" +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~| msgid "All" +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Tot" + +#~| msgid "Featured" +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Mesas en avant" + +#~| msgctxt "Menu subcategory of Education" +#~| msgid "Astronomy" +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomia" + +#~| msgctxt "Menu subcategory of Education" +#~| msgid "Chemistry" +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Quimia" + +#~| msgctxt "Menu subcategory of Education" +#~| msgid "Math" +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matematicas" + +#~ msgid "Science" +#~ msgstr "Sciéncia" + +#~ msgid "3rd party" +#~ msgstr "3ena part" + +#~ msgid "nonfree" +#~ msgstr "pas liure" + +#~ msgid "shell extension" +#~ msgstr "extension shell" + +#~ msgid "_Installing" +#~ msgstr "_Installacion en cors" + +#~ msgid "_Removing" +#~ msgstr "_Supression en cors" + +#~ msgid " or " +#~ msgstr " o " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Desconeguda" + +#~ msgid "non-free" +#~ msgstr "pas liure" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Aplicacions de burèu recomandadas" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Las fonts de logicials vos donan accès a de logicials suplementaris." + +#~ msgid "One Star" +#~ msgstr "Una estela" + +#~ msgid "Two Stars" +#~ msgstr "Doas estelas" + +#~ msgid "Three Stars" +#~ msgstr "Tres estelas" + +#~ msgid "Four Stars" +#~ msgstr "Quatre estelas" + +#~ msgid "Five Stars" +#~ msgstr "Cinc estelas" + +#~ msgid "Audio" +#~ msgstr "Àudio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Edicion" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Basa de donadas" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Gravadura" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Ràdio amator" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mixatge" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Musica" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Enregistradors" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Sequenciadors" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Receptors" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Construccion" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Bancas de donadas" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "EDI (Environaments de desvolopament integrats)" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Perfilatge" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "Gestion de projècte" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Desvolopament Web" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Informatica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Afichatge de donadas" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Economia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Electricitat" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Electronica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Ingenhariá" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geosciéncia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Istòria" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Tractament d'imatges" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Geografia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Musica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Analisi numerica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Informatica en ret" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fisica" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Espiritualitat" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Tir" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulator" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Espòrts" + +#~ msgid "Graphics" +#~ msgstr "Grafisme" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "Grafisme en 2 dimensions" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "Reconeissença optica" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Edicion" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Dessenh matricial" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Accès telefonic" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Corrièr electronic" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Flux" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Transferiment de fichièrs" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Ràdio amator" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Messatjariá instantanèa" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "Clients de discussion per Internet (IRC)" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Susvelhança" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "Par a per (P2P)" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonia" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Desvolopament Web" + +#~ msgid "Office" +#~ msgstr "Burèu" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Grafic" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Gestion dels contactes" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Diccionari" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Corrièr electronic" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Organigrama" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "Assistent numeric personal (PDA)" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografia" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Gestion de projècte" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Edicion" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Tablador" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Visionador" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Art" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Intelligéncia artificiala" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Quimia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Informatica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Construccion" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Afichatge de donadas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Economia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Electricitat" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Electronica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Ingenhariá" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geosciéncia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Istòria" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Sciéncias umanas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Tractament d'imatges" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Lengas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Geografia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematicas" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Medecina" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Analisi numerica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Calcul parallèl" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fisica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotica" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Espiritualitat" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Espòrts" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulator" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Gestionari de fichièrs" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Aisinas fichièrs" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Susvelhança" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Seguretat" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Emulator de terminal" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Accessibilitat" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Archivatge" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Calculadoiras" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Relòtges" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Compression" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Aisinas fichièrs" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Geografia" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Espiritualitat" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Telefonia" + +#~ msgid "Video" +#~ msgstr "Vidèo" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Edicion" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Basa de donadas" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Gravadura" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Enregistradors" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "Televisor" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "Pas cap" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Calcul en cors…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Desconeguda" + +#~ msgid "_History" +#~ msgstr "_Istoric" + +#~ msgid "Size" +#~ msgstr "Talha" + +#~ msgid "No AppStream data found" +#~ msgstr "Cap de donada AppStream pas trobada" + +#~ msgid "A previous update was unfinished." +#~ msgstr "Una mesa a jorn anteriora s'es pas acabada." + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "La signatura d'una mesa a jorn es incorrècta." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Una mesa a jorn fòra linha es estada demandada mas cap de paquet necessita " +#~ "de mesa a jorn." + +#~ msgid "No space was left on the drive." +#~ msgstr "Mai de plaça disponibla sul disc." + +#~ msgid "An update failed to install correctly." +#~ msgstr "Fracàs a l'installacion d'una mesa a jorn." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "La mesa a jorn fòra linha a fracassat d'un biais inesperat." + +#~ msgid "Internet Only Application" +#~ msgstr "Aplicacion sus Internet unicament" + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i aplicacion e %i extension installada" +#~ msgstr[1] "%i aplicacions e %i extensions installadas" + +#~ msgid "Set the specified debugging level" +#~ msgstr "Definir lo nivèl de desbugatge especificat" + +#~ msgctxt "license" +#~ msgid "Complicated!" +#~ msgstr "Complicada !" + +#~ msgid "Picks" +#~ msgstr "Recomandadas" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Supprimer du dossier" + +#~ msgid "Sign In / Register…" +#~ msgstr "S’identifier / S’enregistrer" + +#~ msgid "Use" +#~ msgstr "Utiliser" + +#~ msgid "Add another…" +#~ msgstr "Ajouter un autre…" + +#~ msgid "Signed in as %s" +#~ msgstr "Connecté en tant que %s" + +#~ msgid "Sign in…" +#~ msgstr "Connexion…" + +#~ msgid "Sign out" +#~ msgstr "Se déconnecter" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Vous devez vous utiliser un compte Ubuntu One pour continuer." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Vous devez utiliser votre compte Ubuntu One pour continuer." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Votre compte %s est suspendu." + +#~ msgid "Applications Updated" +#~ msgstr "Applications mises à jour" + +#~ msgid "Includes: ." +#~ msgstr "Cela inclut : ." diff --git a/po/pa.po b/po/pa.po new file mode 100644 index 0000000..b0e0b14 --- /dev/null +++ b/po/pa.po @@ -0,0 +1,8628 @@ +# Punjabi translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# SPDX-FileCopyrightText: 2013, 2014, 2016, 2017, 2018, 2019, 2021, 2022, 2023, 2024, 2025 A S Alam +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-14 08:06+0000\n" +"PO-Revision-Date: 2025-03-14 15:56-0500\n" +"Last-Translator: A S Alam \n" +"Language-Team: Punjabi \n" +"Language: pa\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/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "ਸਾਫਟਵੇਅਰ" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "ਐਪਾਂ ਇੰਸਟਾਲ ਤੇ ਅੱਪਡੇਟ" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"ਸਾਫਟਵੇਅਰ ਤੁਹਾਨੂੰ ਨਵੀਆਂ ਐਪਾਂ ਤੇ ਸਿਸਟਮ ਇਕਸਟੈਂਸ਼ਨਾਂ ਲੱਭਣ ਅਤੇ ਇੰਸਟਾਲ ਕਰਨ ਅਤੇ ਮੌਜੂਦਾ" +" ਇੰਸਟਾਲ ਹੋਈਆਂ ਐਪਾਂ " +"ਹਟਾਉਣ ਲਈ ਸਹਾਇਕ ਹੈ।" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"ਸਾਫਟਵੇਅਰ ਖਾਸ ਅਤੇ ਹਰਮਨਪਿਆਰੀਆਂ ਐਪਾਂ ਨੂੰ ਹਰੇਕ ਐਪ ਲਈ ਫਾਇਦੇਮੰਦ ਵੇਰਵੇ ਅਤੇ ਕਈ ਤਸਵੀਰਾਂ" +" ਨਾਲ ਵੇਖਾਉਂਦਾ " +"ਹੈ। ਐਪਾਂ ਨੂੰ ਵਰਗਾਂ ਦੀ ਸੂਚੀ ਵਿਚੋਂ ਚੁਣਿਆ ਜਾਂ ਖੋਜ ਕਰਕੇ ਲੱਭਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਇਹ ਤੁਹਾਨ" +"ੂੰ ਤੁਹਾਡੇ ਸਿਸਟਮ ਨੂੰ " +"ਆਫਲਾਈਨ ਅੱਪਡੇਟ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਵੀ ਸਹਾਇਕ ਹੈ।" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "ਸਾਰ ਪੈਨਲ" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "ਵੇਰਵਾ ਪੈਨਲ" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "ਇੰਸਟਾਲ ਹੋਏ ਪੈਨਲ" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "ਅੱਪਡੇਟ ਪੈਨਲ" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "ਅੱਪਡੇਟ ਦੇ ਵੇਰਵੇ" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2768 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "ਗਨੋਮ ਪਰੋਜੈੱਕਟ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Shim UEFI ਵਿੱਚ akmods ਕੁੰਜੀ ਨੂੰ ਟੈਸਟ ਕਰੋ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Shim UEFI ਵਿੱਚ akmods ਕੁੰਜੀ ਟੈਸਟ ਕਰਨ ਵਾਸਤੇ ਪਰਮਾਣੀਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Shim UEFI ਲਈ akmods ਕੁੰਜੀ ਨੂੰ ਹਿੱਸਾ ਬਣਾਓ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Shim UEFI ਲਈ akmods ਕੁੰਜੀ ਨੂੰ ਹਿੱਸਾ ਬਣਾਉਣ ਵਾਸਤੇ ਪਰਮਾਣੀਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Shim UEFI ਵਿੱਚ DKMS ਕੁੰਜੀ ਨੂੰ ਟੈਸਟ ਕਰੋ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Shim UEFI ਵਿੱਚ DKMS ਕੁੰਜੀ ਟੈਸਟ ਕਰਨ ਵਾਸਤੇ ਪਰਮਾਣੀਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Shim UEFI ਲਈ DKMS ਕੁੰਜੀ ਨੂੰ ਹਿੱਸਾ ਬਣਾਓ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Shim UEFI ਲਈ DKMS ਕੁੰਜੀ ਨੂੰ ਹਿੱਸਾ ਬਣਾਉਣ ਵਾਸਤੇ ਪਰਮਾਣੀਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "ਐਪ-ਸਟਰੀਮ ਫਾਇਲ ਨੂੰ ਸਿਸਟਮ ਟਿਕਾਣੇ 'ਤੇ ਇੰਸਟਾਲ ਕਰੋ" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "ਐਪ-ਸਟਰੀਮ ਫਾਇਲ ਨੂੰ ਸਿਸਟਮ ਟਿਕਾਣੇ 'ਤੇ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "ਮਾਫ਼ਕ ਪਰੋਜੈਕਟਾਂ ਦੀ ਸੂਚੀ" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"ਇਹ ਮਾਫ਼ਕ ਪਰੋਜੈਕਟਾਂ ਦੀ ਸੂਚੀ ਹੈ, ਜਿਹਨਾਂ ਨੂੰ ਸਾਨੂੰ ਦਿਖਾਉਣਾ ਚਾਹੀਦਾ ਹੈ ਜਿਵੇਂ ਕਿ ਗਨੋਮ" +", ਕੇਡੀਈ ਅਤੇ " +"XFCE ਆਦਿ।" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "ਕੀ ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਵਿੱਚ ਅੱਪਡੇਟ ਅਤੇ ਅੱਪਗਰੇਡਾਂ ਦਾ ਬੰਦੋਬਸਤ ਕਰਨਾ ਹੈ" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"ਜੇ ਅਸਮਰੱਥ ਹੁੰਦਾ ਹੈ ਤਾਂ ਗਨੋਮ ਸਾਫ਼ਟਵੇਅਰ ਅੱਪਡੇਟ ਪੈਨਲ ਨੂੰ ਲੁਕਾਉਂਦਾ ਹੈ ਅਤੇ ਕੋਈ ਵੀ ਆ" +"ਪਣੇ-ਆਪ ਅੱਪਡੇਟ ਕਾਰਵਾਈ " +"ਨਹੀਂ ਕਰੇਗਾ ਜਾਂ ਅੱਪਗਰੇਡ ਲਈ ਨਹੀਂ ਪੁੱਛੇਗਾ।" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "ਅੱਪਡੇਟ ਆਪਣੇ-ਆਪ ਡਾਊਨਲੋਡ ਅਤੇ ਇੰਸਟਾਲ ਕਰੋ" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"ਜੇ ਸਮਰੱਥ ਕੀਤਾ ਤਾਂ ਗਨੋਮ ਸਾਫ਼ਟਵੇਅਰ ਬੈਕਗਰਾਊਂਡ 'ਚ ਆਪਣੇ-ਆਪ ਡਾਊਨਲੋਡ ਕਰਦਾ ਹੈ, ਅਤੇ ਉਹਨ" +"ਾਂ ਨੂੰ ਇੰਸਟਾਲ " +"ਵੀ ਕਰਦਾ ਹੈ, ਜਿਹਨਾਂ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਨਹੀਂ ਹੁੰਦੀ ਹੈ।" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"ਜਦੋਂ ਬੈਕਗਰਾਊਂਡ ਵਿੱਚ ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਹੁੰਦੇ ਹਨ ਤਾਂ ਵਰਤੋਂਕਾਰ ਨੂੰ ਸੂਚਨਾ ਦਿਓ" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"ਜੇ ਸਮਰੱਥ ਕੀਤਾ ਤਾਂ ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਵਰਤੋਂਕਾਰ ਨੂੰ ਵੇਹਲੇ ਹੋਣ ਦੇ ਦੌਰਾਨ ਵਾਪਰੇ ਅੱਪਡੇਟਾਂ" +" ਬਾਰੇ ਸੂਚਨਾ ਦੇਵੇਗਾ।" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "ਜਦੋਂ ਮੀਟਰ ਵਾਲਾ ਕਨੈਕਸ਼ਨ ਹੋਵੇ ਤਾਂ ਕੀ ਆਪਣੇ-ਆਪ ਤਾਜ਼ਾ ਕਰਨਾ ਹੈ" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"ਜੇ ਸਮਰੱਥ ਕੀਤਾ ਤਾਂ ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਮੀਟਰ ਵਾਲੇ ਕਨੈਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਦੌਰਾਨ ਵੀ ਪਿਛੋਕੜ ਵਿੱਚ" +" ਆਪਣੇ-ਆਪ " +"ਤਾਜ਼ਾ ਹੁੰਦਾ ਰਹੇਗਾ (ਜਿਸ ਨਾਲ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਕਰਨ ਵਾਸਤੇ ਕੁਝ ਮੇਟਾਡਾਟਾ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜ" +"ਾਵੇਗਾ, " +"ਜਿਸ ਨਾਲ ਵਰਤੋਂਕਾਰ ਨੂੰ ਲਾਗਤ ਸਹਿਣੀ ਪੈ ਸਕਦੀ ਹੈ)।" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "ਕੀ ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਪਹਿਲੀ ਵਾਰ ਚਲਾਇਆ ਹੈ" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੇ ਅੱਗੇ ਤਾਰਾਬੱਧ ਦਰਜੇ ਦਿਖਾਉਣੇ ਹਨ" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "ਰਿਮੋਟ ਲਈ ਮੂਲ ਬਰਾਂਚ ਦੇ ਮੁਤਾਬਕ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਛਾਣੋ" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"ਗ਼ੈਰ-ਮੁਕਤ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਇੰਸਟਾਲ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਚੇਤਾਵਨੀ ਜਾਣਕਾਰੀ ਦਿਖਾਈ ਦਿਖਾਈ ਜਾਵ" +"ੇਗੀ" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"ਜਦੋਂ ਗ਼ੈਰ-ਮੁਕਤ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ ਤਾਂ ਚੇਤਾਵਨੀ ਜਾਣਕਾਰੀ ਦਿਖਾਈ ਜਾਵ" +"ੇਗੀ। ਇਸ ਨਾਲ " +"ਜਾਣਕਾਰੀ ਦਿਖਾਉਣ ਨੂੰ ਦਬਾਉਣ ਨੂੰ ਕਾਬੂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "ਆਖਰੀ ਅੱਪਡੇਟ ਜਾਂਚ ਸਮਾਂ" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "ਆਖਰੀ ਅੱਪਗਰੇਡ ਸੂਚਨਾ ਸਮਾਂ" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "ਆਖਰੀ ਅੱਪਡੇਟ ਸੂਚਨਾ ਸਮਾਂ-ਮੋਹਰ" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "ਪਹਿਲੇ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਦਾ ਸਮਾਂ, ਅੱਪਡੇਟ ਦੇ ਬਾਅਦ ਸਾਫ਼ ਕੀਤਾ" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "ਆਖਰੀ ਅੱਪਡੇਟ ਦਾ ਸਮਾਂ" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "ਤਸਦੀਕ ਕਰਨ ਲਈ ਸਕਿੰਟਾਂ ਵਿੱਚ ਸਮਾਂ, ਜਿਸ ਲਈ ਅਪਸਟਰੀਨ ਸਕਰੀਨਸ਼ਾਟ ਦੇ ਵਾਜਬ ਹੈ" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"ਵੱਡੀ ਗਿਣਤੀ ਦਾ ਅਰਥ ਹੈ ਕਿ ਰਿਮੋਟ ਸਰਵਰ ਲਈ ਘੱਟ ਫੇਰੇ ਲਾਉਣੇ ਪੈਣਗੇ, ਪਰ ਵਰਤੋਂਕਾਰ ਨੂੰ ਸਕ" +"ਰੀਨਸ਼ਾਟ ਲਈ " +"ਅੱਪਡੇਟ ਵਿਖਾਉਣ ਲਈ ਵੱਧ ਵੇਲਾ ਲੱਗੇਗਾ। 0 ਦਾ ਅਰਥ ਹੋਵੇਗਾ ਕਿ ਜੇ ਚਿੱਤਰ ਪਹਿਲਾਂ ਹੀ ਕੈਸ਼ 'ਚ" +" ਮੌਜੂਦ ਹੋਵੇਗਾ " +"ਤਾਂ ਸਰਵਰ ਦੀ ਕਦੇ ਜਾਂਚ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ।" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਪੜਤਾਲਾਂ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਸਰਵਰ" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "ਪੜਤਾਲਾਂ ਲਈ ਘੱਟ ਤੋਂ ਘੱਟ ਕਰਮਾ ਗਿਣਤੀ" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "ਇਸ ਅੰਕ ਤੋਂ ਘੱਟ ਕਰਮਿਆਂ ਵਾਲੀਆਂ ਪੜਤਾਲਾਂ ਨੂੰ ਦਿਖਾਇਆ ਨਹੀਂ ਜਾਵੇਗਾ।" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"ਅਧਿਕਾਰਿਤ ਰਿਪੋਜ਼ਟਰੀਆਂ ਦੀ ਸੂਚੀ, ਜਿਹਨਾਂ ਨੂੰ 3ਜੀ ਧਿਰ ਨਹੀਂ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"ਚਾਹੀਦੀਆਂ ਰਿਪੋਜ਼ਟਰੀਆਂ ਦੀ ਸੂਚੀ, ਜਿਹਨਾਂ ਨੂੰ ਅਸਮਰੱਥ ਕੀਤਾ ਜਾਂ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"ਅਧਿਕਾਰਿਤ ਰਿਪੋਜ਼ਟਰੀਆਂ ਦੀ ਸੂਚੀ, ਜਿਹਨਾਂ ਨੂੰ ਮੁਕਤ ਸਾਫ਼ਟਵੇਅਰ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "ਜਦੋਂ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਮੁਕਤ ਸਾਫਟਵੇਅਰ ਮੰਨਿਆ ਜਾਵੇ ਤਾਂ ਵਰਤਣ ਲਈ ਲਸੰਸ URL" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"ਜਦੋਂ ਵੀ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਸਿਸਟਮ 'ਤੇ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਬੰਡਲ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ" +" ਇੰਸਟਾਲ ਕਰੋ" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "ਸਾਫ਼ਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਡਾਈਲਾਗ ਲਈ ਪਹੁੰਚ ਦੀ ਇਜਾਜ਼ਤ" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "ਰੀਲਿਜ਼ ਤੋਂ ਪਹਿਲਾਂ ਲਈ ਅੱਪਗਰੇਡ ਵਾਸਤੇ ਪੇਸ਼ਕਸ਼ ਦਿਓ" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"ਵਰਤੋਂਕਾਰ ਨੂੰ ਜਾਣਕਾਰੀ ਦੇਣ ਲਈ ਕੁਝ UI ਭਾਗ ਵੇਖਾਓ, ਜਦੋਂ ਕਿ ਐਪ ਦੀ ਗ਼ੈਰ-ਮੁਕਤ ਹੋਵੇ" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"ਇੰਸਟਾਲ ਹੋਈਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੀ ਸੂਚੀ ਵਿੱਚ ਐਪਾਂ ਲਈ ਇੰਸਟਾਲ ਹੋਏ ਆਕਾਰ ਨੂੰ ਦਿਖਾਓ" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI, ਜੋ ਕਿ ਗ਼ੈਰ-ਆਜ਼ਾਦ ਅਤੇ ਪਰੋਪਰੈਟਰੀ ਸਾਫ਼ਟਵੇਅਰਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦਿੰਦਾ ਹੈ" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"ਐਪਸਟਰੀਮ ਫਾਇਲਾਂ ਨੂੰ ਦਰਸਾਉਂਦੇ URL ਦੀ ਸੂਚੀ, ਜਿਸ ਤੋਂ ਇਸ ਨੂੰ swcatalog ਫੋਲਡਰ 'ਚ ਡਾਊ" +"ਨਲੋਡ ਕੀਤਾ " +"ਜਾ ਸਕਦਾ ਹੈ।" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"ਐਪ-ਸਟਰੀਮ ਫਾਇਲਾਂ ਨੂੰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਸਿਸਟਮ ਰੂਪੀ ਟਿਕਾਣੇ ਲਈ ਇੰਸਟਾਲ ਕਰੋ। ਜੇ ਇਹ " +"ਗਲਤ ਹੈ ਤਾਂ " +"ਫ਼ਾਇਲਾਂ ਨੂੰ ਗੈਰ-ਮਿਆਰੀ ਡਾਇਰੈਕਟਰੀ $XDG_DATA_HOME/swcatalog/xml ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ ਇੰਸ" +"ਟਾਲ " +"ਕੀਤਾ ਜਾਵੇਗਾ" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"ਪੈਕੇਜ ਕਰ ਨਵਾਲੇ ਫਾਰਮੈਟਾਂ ਦੀ ਤਰਜੀਹੀ ਲੜੀ, ਵੱਧ ਮਹੱਤਵਪੂਰਨ ਪੈਕੇਜ ਪਹਿਲਾਂ ਦਿੱਤੇ ਹਨ। ਖਾ" +"ਲੀ ਲੜੀ ਦਾ " +"ਅਰਥ ਹੈ ਕਿ ਮੂਲ ਲੜੀ ਮੁਤਾਬਕ। ਛੱਡੇ ਗਏ ਫਾਰਮੈਟ ਸੂਚੀ ਦੇ ਆਖਰ ਵਿੱਚ ਹਨ। ਮਿਸਾਲ ਵਜੋਂ ਪੈਕੇਜ਼" +"ਿੰਗ ਫਾਰਮੈਟ " +"ਹਨ: deb, flatpak, rpm, snap। ਫਾਰਮੈਟਾਂ ਨੂੰ ਮੁੱਢ ਦੇ ਨਾਂ ਮੁਤਾਬਕ ਕਾਲਮ ਪਾ ਕੇ ਵੀ ਵੰਡ" +"ਿਆ ਜਾ " +"ਸਕਦਾ ਹੈ, ਜਿਵੇਂ 'flatpak:flathub'।" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "ਨਾ-ਵਰਤੇ Flatpak runtimes ਨੂੰ ਹਟਾਉਣ ਲਈ ਆਖਰੀ ਕੋਸ਼ਿਸ਼ ਦਾ ਸਮਾਂ" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"ਸਿਰਫ਼ ਮੁਕਤ ਲਸੰਸ ਵਾਲੀਆਂ ਐਪਾਂ ਹੀ ਵੇਖਾਉਣ ਅਤੇ ਕੋਈ ਵੀ ਪ੍ਰੋਪੇਟਰੀ ਐਪਾਂ ਨੂੰ ਲੁਕਾਉਣ ਲਈ '" +"ਸਹੀ' ਸੈੱਟ ਕਰੋ।" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"ਸਿਰਫ਼ ਉਹਨਾਂ ਡਿਵੈਲਪਰਾਂ ਦੀਆਂ ਐਪਾਂ, ਜਿਨ੍ਹਾਂ ਨੂੰ ਤਸਦੀਕ ਕੀਤਾ ਗਿਆ ਹੋਵੇ, ਨੂੰ ਵੇਖਾਉਣ ਲਈ" +" 'ਸਹੀ' ਸੈੱਟ ਕਰੋ।" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "ਪਿਛਲੇ ਪ੍ਰਾਪਤ ਹੋਏ ਇਤਿਹਾਸਿਕ ਅੱਪਡੇਟਾਂ ਲਈ ਸਮਾਂ-ਮੋਹਰ।" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "ਲਾਗਇਨ ਕਰਨ ਲਈ gnome-online-account ਪਛਾਣ ਨੂੰ ਸੰਭਾਲਣ ਵਾਲੀ ਸਤਰ" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਐਪਸਟਰੀਮ ਸਿਸਟਮ ਲਈ ਇੰਸਟਾਲਰ" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "ਕਮਾਂਡ ਲਾਈਨ ਆਰਗੂਮੈਂਟ ਪਾਰਸ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "ਤੁਹਾਨੂੰ ਪੂਰਾ ਠੀਕ ਫਾਇਲ-ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "ਇਹ ਪਰੋਗਰਾਮ ਕੇਵਲ ਰੂਟ (root) ਵਰਤੋਂਕਾਰਾਂ ਵਲੋਂ ਹੀ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "ਸਮੱਗਰੀ ਕਿਸਮ ਪਰਮਾਣਿਤ ਲਈ ਅਸਫ਼ਲ ਹੈ: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "ਸਾਫਟਵੇਅਰ ਇੰਸਟਾਲ" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "ਚੁਣੇ ਸਾਫਟਵੇਅਰ ਸਿਸਟਮ ਉੱਤੇ ਇੰਸਟਾਲ ਕਰੋ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "ਕਾਰਟੂਨ ਤਸ਼ਦੱਦ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "ਕਾਰਟੂਨ ਤਸ਼ਦੱਦ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "ਕਲਪਨਿਕ ਤਸ਼ਦੱਦ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "ਕਲਪਨਿਕ ਤਸ਼ਦੱਦ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "ਅਸਲੀ ਤਸ਼ਦੱਦ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "ਅਸਲੀ ਤਸ਼ਦੱਦ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "ਖ਼ੂਨ ਖ਼ਰਾਬੇ ਦਿਖਾਉਣ ਵਾਲਾ ਤਸ਼ਦੱਦ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "ਖ਼ੂਨ-ਖਰਾਬੇ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "ਜਿਨਸੀ ਧੱਕਾ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "ਜਿਨਸੀ ਧੱਕੇ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "ਸ਼ਰਾਬ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "ਸ਼ਰਾਬੀ ਪੀਣ ਦੇ ਹਵਾਲਿਆਂ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "ਨਸ਼ੀਲੇ ਪਦਾਰਥ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "ਵਰਜਿਤ ਦਵਾਈਆਂ (ਨਸ਼ਿਆਂ) ਦੇ ਹਵਾਲੇ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "ਤੰਬਾਕੂ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "ਤਮਾਕੂ ਉਤਪਾਦਾਂ ਲਈ ਹਵਾਲੇ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "ਨੰਗੇਜ਼" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "ਕਿਸੇ ਵੀ ਕਿਸਮ ਦੇ ਨੰਗੇਜ਼ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "ਜਿਨਸੀ ਥੀਮ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "ਜਿਨਸੀ ਕਿਸਮ ਦੇ ਹਵਾਲੇ ਜਾਂ ਵਰਣਨ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "ਗਾਲਾਂ ਕੱਢਣਾ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "ਕਿਸੇ ਵੀ ਕਿਸਮ ਦੀ ਬੇਅਦਬੀ ਬਾਰੇ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "ਅਢੁੱਕਵਾਂ ਮਜ਼ਾਕ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "ਅਢੁੱਕਵਾਂ ਮਜ਼ਾਕ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "ਭੇਦਭਾਵ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "ਕਿਸੇ ਵੀ ਕਿਸਮ ਦੀ ਪੱਖਪਾਤੀ ਭਾਸ਼ਾ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ।" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "ਇਸ਼ਤਿਹਾਰ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "ਕਿਸੇ ਵੀ ਕਿਸਮ ਦੇ ਇਸ਼ਤਿਹਾਰ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "ਜੂਆ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "ਕਿਸੇ ਵੀ ਕਿਸਮ ਦੇ ਜੂਏ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "ਖਰੀਦਦਾਰੀ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "ਧਨ ਖ਼ਰਚ ਦੇ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "ਵਰਤੋਂਕਾਰ ਵਿਚਾਲੇ ਗੱਲਬਾਤ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "ਹੋਰ ਵਰਤੋਂਕਾਰ ਨਾਲ ਗੱਲਬਾਤ ਕਰਨ ਦੇ ਢੰਗਾਂ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "ਵਰਤੋਂਕਾਰ ਵਿਚਾਲੇ ਆਡੀਓ ਗੱਲਬਾਤ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਨਾਲ ਗੱਲਾਂ (ਬੋਲ ਕੇ) ਕਰਨ ਦੇ ਢੰਗ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "ਸੰਪਰਕ ਵੇਰਵੇ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"ਸਮਾਜਿਕ ਨੈੱਟਵਰਕ ਵਰਤੋਂਕਾਰ ਜਾਂ ਈਮੇਲ ਸਿਰਨਾਵੇਂ ਸਾਂਝੇ ਕਰਨ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "ਪਛਾਣ ਕਰਨ ਵਾਲੀ ਜਾਣਕਾਰੀ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"ਤੀਜੀਆਂ ਧਿਰਾਂ ਨਾਲ ਵਰਤੋਂਕਾਰ ਜਾਣਕਾਰੀ ਸਾਂਝੀ ਕਰਨ ਬਾਰੇ ਕੋਈ ਵੀ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "ਟਿਕਾਣਾ ਸਾਂਝਾ ਕਰਨਾ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਨਾਲ ਭੂਗੋਲਿਕ ਟਿਕਾਣਾ ਸਾਂਝਾ ਕਰਨ ਬਾਰੇ ਕੋਈ ਵੀ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "ਸਮਲਿੰਗ ਕਾਮੁਕਤਾ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "ਸਮਲਿੰਗ ਕਾਮੁਕਤਾ ਦੇ ਹਵਾਲੇ ਨਾਲ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "ਕੰਜਰਪੁਣਾ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "ਕੋਈ ਕੰਜਰਪੁਣੇ ਦੇ ਹਵਾਲੇ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ।" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "ਬਦਕਾਰੀ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "ਕੋਈ ਬਦਕਾਰੀ ਲਈ ਹਵਾਲੇ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "ਕਾਮਕਤਾ ਪਾਤਰ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "ਕਾਮਕਤਾ ਪਾਤਰ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "ਬੇਹੁਰਮਤੀ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "ਕੋਈ ਬੇਹੁਰਮਤੀ ਦੇ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "ਇਨਸਾਨੀ ਅੰਗ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "ਕੋਈ ਮਰੇ ਹੋਏ ਮਨੁੱਖੀ ਬਚੇ ਹੋਏ ਸਰੀਰਿਕ ਹਿੱਸਿਆਂ ਬਾਰੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "ਗੁਲਾਮੀ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "ਗੁਲਾਮੀ ਦੇ ਹਵਾਲੇ ਸੰਬੰਧੀ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "ਵਰਜਿਤ ਦਵਾਈਆਂ (ਨਸ਼ਿਆਂ) ਲਈ ਹਵਾਲੇ ਨਹੀਂ ਹਨ" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "ਖਰ੍ਹਵੀ, ਗੰਦੀ ਜਾਂ ਕਿਸੇ ਹੋਰ ਕਿਸਮ ਦੀ ਸਖ਼ਤ ਭਾਸ਼ ਸ਼ਾਮਲ ਨਹੀਂ ਹੈ" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "ਇਸ਼ਤਿਹਾਰ ਜਾਂ ਪੈਸੇ ਦਾ ਲੈਣ-ਦੇਣ ਸ਼ਾਮਲ ਨਹੀਂ ਹੈ" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "ਜਿਨਸੀ ਸੰਬੰਧ ਜਾਂ ਨੰਗੇਜ਼ ਸ਼ਾਮਲ ਨਹੀਂ ਹੈ" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "ਬਿਨਾਂ-ਕੰਟਰੋਲ ਗੱਲਬਾਤ ਸਹੂਲਤਾਂ ਸ਼ਾਮਲ ਨਹੀਂ ਹਨ" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "ਤਸ਼ਦੱਦ ਨਹੀਂ ਹੈ" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "ਨਸ਼ੇ" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "ਸਖ਼ਤ ਬੋਲੀ" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "ਧਨ" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "ਸਮਾਜਿਕ" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "ਹਿੰਸਾ" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "ਸਭ" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s ਲਈ ਅਣਪਛਾਤਾ ਉਮਰ ਦਰਜਾ ਹੈ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s ਹਰ ਕਿਸੇ ਲਈ ਢੁੱਕਵੀਂ ਹੈ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s ਨਿੱਕੇ ਬਾਲਾਂ ਲਈ ਢੁੱਕਵੀਂ ਹੈ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s ਵੱਡੇ ਬੱਚਿਆਂ ਲਈ ਢੁੱਕਵੀਂ ਹੈ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s ਬੱਚਿਆਂ ਲਈ ਢੁੱਕਵੀਂ ਹੈ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s ਅੱਲੜ੍ਹਾਂ ਲਈ ਢੁੱਕਵੀਂ ਹੈ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s ਬਾਲਗਾਂ ਲਈ ਢੁੱਕਵੀਂ ਹੈ" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s %s ਲਈ ਢੁੱਕਵੀਂ ਹੈ" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "ਉਮਰ ਦਰਜਾ" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "ਗੁੰਮ ਹੋਈ ਜਾਣਕਾਰੀ ਲਈ ਕਿਵੇਂ ਯੋਗਦਾਨ ਪਾਇਆ ਜਾਵੇ(_H)" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "ਲੋਕਲ ਫ਼ਾਇਲ" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "ਪੈਕੇਜ" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "ਬਾਕੀ" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "ਇੰਸਟਾਲ ਕਰਨਾ ਬਾਕੀ" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "ਹਟਾਉਣਾ ਬਾਕੀ" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "ਇੰਸਟਾਲ ਕਰੋ(_I)" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "…ਅਣ-ਇੰਸਟਾਲ(_U)" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "ਨੈੱਟਵਰਕ" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "ਨੈੱਟਵਰਕ ਉੱਤੇ ਸੰਚਾਰ ਕਰ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "ਸਿਸਟਮ ਸੇਵਾਵਾਂ" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "ਸਿਸਟਮ ਬਸ ਨਾਲ ਡੀ-ਬੱਸ ਸੇਵਾਵਾਂ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "ਸ਼ੈਸ਼ਨ ਸੇਵਾਵਾਂ" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "ਸ਼ੈਸ਼ਨ ਬਸ ਨਾਲ ਡੀ-ਬੱਸ ਸੇਵਾਵਾਂ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "ਡਿਵਾਈਸ" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "ਮਨਮਰਜ਼ੀ ਦੇ ਡਿਵਾਈਸ ਜਿਵੇਂ ਕਿ ਵੈੱਬਕੈਮ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "ਇਨਪੁੱਟ ਡਿਵਾਈਸ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦਾ ਹੈ" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "ਮਾਈਕਰੋਫ਼ੋਨ ਲਈ ਪਹੁੰਚ ਕਰ ਅਤੇ ਆਡੀਓ ਚਲਾ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "ਸਿਸਟਮ ਡਿਵਾਈਸ ਫਾਇਲਾਂ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "ਸਕਰੀਨ ਦੀ ਸਮੱਗਰੀ" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "ਸਕਰੀਨ ਦੀ ਸਮੱਗਰੀ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "ਘਰ ਫੋਲਡਰ" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "ਫ਼ਾਇਲਾਂ ਵੇਖ, ਸੋਧ ਅਤੇ ਬਣਾ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "ਫ਼ਾਇਲਾਂ ਵੇਖ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "ਫਾਇਲ ਸਿਸਟਮ" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "ਡਾਊਨਲੋਡ ਫੋਲਡਰ" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "ਸੈਟਿੰਗਾਂ" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "ਕੋਈ ਵੀ ਸੈਟਿੰਗਾਂ ਵੇਖਣ ਅਤੇ ਬਦਲ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "ਪੁਰਾਣਾ ਡਿਸਪਲੇਅ ਸਿਸਟਮ" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "ਪੁਰਾਣੇ, ਅਸੁਰੱਖਿਅਤ ਡਿਸਪਲੇਅ ਸਿਸਟਮ ਨੂੰ ਵਰਤ ਸਕਦਾ ਹੈ" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "ਸੈਂਡਬਾਕਸ ਛੁਟਕਾਰਾ" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "ਸੈਂਡਬਾਕਸ ਤੋਂ ਛੁਟਕਾਰਾ ਪਾ ਸਕਦੀ ਹੈ ਅਤੇ ਹੋਰ ਰੋਕਾਂ ਨੂੰ ਝਾਂਸਾ ਦੇ ਸਕਦੀ ਹੈ" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "ਕੋਈ ਅੱਪਡੇਟ ਵੇਰਵਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।" + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "ਅੱਪਡੇਟ ਦੇ ਵੇਰਵੇ" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "ਹੋਰ ਮਨਜ਼ੂਰੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "ਸਰਵਰ ਤੋਂ ਗ਼ੈਰ-ਵਾਜਬ ਰੇਟਿੰਗ ਡਾਟਾ ਮਿਲਿਆ" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "ਰੇਟਿੰਗ ਸਰਵਰ ਨਾਲ ਸੰਚਾਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "ਪੜਤਾਲਾਂ" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "ਇਸ ਐਪ ਲਈ ਕੋਈ ਪੜਤਾਲਾਂ ਨਹੀਂ ਹਨ।" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "ਕੋਈ ਪੜਤਾਲਾਂ ਨਹੀਂ" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "ਵਰਜ਼ਨ ਦਾ ਅਤੀਤ" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "ਵਰਜ਼ਨ %s ਵਿੱਚ ਨਵਾਂ" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "ਵਰਜ਼ਨ %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "ਇਸ ਰੀਲਿਜ਼ ਲਈ ਕੋਈ ਵੇਰਵੇ ਨਹੀਂ ਹਨ" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "ਸ਼ੁਰੂ ਢੰਗ: ‘updates’, ‘updated’, ‘installed’ ਜਾਂ ‘overview’" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "ਮੋਡ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਖੋਜ" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ਖੋਜ" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਵੇਰਵੇ ਵੇਖਾਓ (ਐਪਲੀਕੇਸ਼ਨ ID ਦੀ ਵਰਤੋਂ ਕਰਕੇ)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਵੇਰਵੇ ਵੇਖਾਓ (ਪੈਕੇਜ ਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "ਪੈਕੇਜ-ਨਾਂ" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਇੰਸਟਾਲ ਕਰੋ (ਐਪਲੀਕੇਸ਼ਨ ID ਦੀ ਵਰਤੋਂ ਕਰਕੇ)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਅਣ-ਇੰਸਟਾਲ ਕਰੋ (ਐਪਲੀਕੇਸ਼ਨ ID ਦੀ ਵਰਤੋਂ ਕਰਕੇ)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "ਲੋਕਲ ਪੈਕੇਜ ਫਾਇਲ ਨੂੰ ਖੋਲ੍ਹੋ" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "ਫਾਇਲ-ਨਾਂ" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "ਇਸ ਕਾਰਵਾਈ ਲਈ ਉਮੀਦ ਕੀਤੇ ਤਾਲਮੇਲ ਦੀ ਕਿਸਮ: ‘ਕੋਈ ਨਹੀਂ‘, ‘ਸੂਚਨਾ‘, ਜਾਂ ‘ਪੂਰਾ‘" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ਤਾਲਮੇਲ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "ਲੋਕਲ ਮੇਟਾ-ਜਾਣਕਾਰੀ ਜਾਂ ਐਪ-ਡਾਟਾ ਫ਼ਾਇਲ ਵੇਖਾਓ" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"ਵੱਧ ਜਾਣਾਕਰੀ ਵਾਲੀ ਡੀਬੱਗ ਆਉਟਪੁੱਟ ਸਮਰੱਥ ਕਰੋ (ਜੇ ਪਹਿਲਾਂ ਹੀ ਚੱਲਦਾ ਹੈ ਤਾਂ ਚੱਲਦੇ ਮੌਕੇ" +" ਤੋਂ)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "ਕਿਸੇ ਵੀ ਬਾਕੀ ਰਹਿੰਦੇ ਅੱਪਡੇਟਾਂ ਨੂੰ ਬੈਕਗਰਾਊਂਡ ਵਿੱਚ ਇੰਸਟਾਲ ਕਰਦਾ ਹੈ" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "ਪਸੰਦਾਂ ਨੂੰ ਵੇਖਾਓ" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "ਚੱਲਦੇ ਮੌਕੇ ਨੂੰ ਬੰਦ ਕਰੋ" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "AppStream ਲਈ ਲੋਕਲ ਫਾਇਲ ਸਰੋਤ ਨੂੰ ਪਹਿਲ" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "ਵਰਜ਼ਨ ਨੰਬਰ ਨੂੰ ਵੇਖਾਓ" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "ਕਾਪੀਰਾਈਟ © 2016–2023 ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਯੋਗਦਾਨੀ" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ ੨੦੧੬-੨੦੨੩\n" +"ਪੰਜਾਬੀ ਓਪਨਸੋਰਸ ਟੀਮ (POST) - www.punlinux.org" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "ਅਫ਼ਸੋਸ! ਉਸ ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਕੋਈ ਵੇਰਵੇ ਨਹੀਂ ਹਨ।" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "ਇੰਸਟਾਲ ਲਈ ਆਕਾਰ" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "ਡਾਟਾ %s ਅਤੇ ਕੈਸ਼ %s ਦੇ ਸਮੇਤ ਹੈ" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "%s ਡਾਟੇ ਸਮੇਤ" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "%s ਕੈਸ਼ ਸਮੇਤ" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "ਕੈਸ਼ ਅਤੇ ਡਾਟਾ ਵਰਤੋਂ ਅਣਪਛਾਤੀ ਹੈ" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "ਡਾਊਨਲੋਡ ਸਾਈਜ਼" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "ਕਿਸੇ ਹੋਰ ਵਾਧੂ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "ਅਣਪਛਾਤੇ ਆਕਾਰ ਦੇ ਹੋਰ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਚਾਹੀਦੇ ਹਨ" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "%s ਹੋਰ ਵਾਧੂ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਚਾਹੀਦੇ ਹਨ" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "ਆਕਾਰ ਦਾ ਪਤਾ ਨਹੀਂ ਹੈ" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "ਕੋਈ ਮਨਜ਼ੂਰੀਆਂ ਨਹੀਂ" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "ਨੈੱਟਵਰਕ ਪਹੁੰਚ ਹੈ" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਵਰਤਦੀ ਹੈ" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "ਸ਼ੈਸ਼ਨ ਸੇਵਾਵਾਂ ਵਰਤਦੀ ਹੈ" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "ਹਾਰਡਵੇਅਰ ਡਿਵਾਈਸ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "ਸਿਸਟਮ ਡਿਵਾਈਸ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦਾ ਹੈ" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "ਤੁਹਾਡੇ ਸਾਰੇ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ/ਲਿਖ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "ਤੁਹਾਡੇ ਸਾਰੇ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "ਤੁਹਾਡੇ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਪੜ੍ਹ/ਲਿਖ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "ਤੁਹਾਡੇ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "ਕੁਝ ਖਾਸ ਫ਼ਾਇਲਾਂ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "ਵਰਤੋਂਕਾਰ ਸੈਟਿੰਗਾਂ ਲਈ ਪਹੁੰਚ ਕਰ ਅਤੇ ਬਦਲ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "ਪੁਰਾਣਾ ਵਿੰਡੋ ਸਿਸਟਮ ਵਰਤਦੀ ਹੈ" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "ਮਨਮਰਜ਼ੀ ਦੀਆਂ ਇਜਾਜ਼ਤਾਂ ਲੈ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "ਸਾਫਟਵੇਅਰ ਡਿਵੈਲਪਰ ਨੂੰ ਤਸਦੀਕ ਕੀਤਾ ਹੈ" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "ਓ.ਸਿ. ਡਿਸਟਰੀਬਿਊਟਰ ਵਲੋਂ ਪੜਤਾਲਿਆ" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "%s ਰਾਹੀਂ ਪੜਤਾਲ ਕੀਤੀ" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "ਤੀਜੀ ਧਿਰ ਵਲੋਂ ਦਿੱਤਾ ਗਿਆ ਹੈ" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "ਸਾਫ਼ਟਵੇਅਰ ਹੁਣ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "ਆਡਿਟਯੋਗ ਕੋਡ" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "ਅਣਪਛਾਤਾ ਲਸੰਸ" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "ਪਰੋਪ੍ਰੈਟਰੀ ਕੋਡ" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "ਖਾਸ ਲਸੰਸ" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "ਵਿਸ਼ੇਸ਼" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "ਸੁਰੱਖਿਅਤ" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "ਸੰਭਵ ਤੌਰ ਉੱਤੇ ਸੁਰੱਖਿਅਤ" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "ਸੰਭਵ ਰੂਪ ਵਿੱਚ ਅਸੁਰੱਖਿਅਤ" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "ਅਸੁਰੱਖਿਅਤ" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "ਸਿਰਫ਼ ਮੋਬਾਈਲ" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "ਸਿਰਫ਼ ਛੋਟੀਆਂ ਸਕਰੀਨਾਂ ਲਈ ਕੰਮ ਕਰਦੀ ਹੈ" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "ਸਿਰਫ਼ ਡੈਸਕਟਾਪ" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "ਸਿਰਫ਼ ਵੱਡੀਆਂ ਸਕਰੀਨਾਂ ਲਈ ਕੰਮ ਕਰਦੀ ਹੈ" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "ਸਕਰੀਨ ਆਕਾਰ ਨਾਲ ਮਿਲਦਾ ਨਹੀਂ ਹੈ" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਸਕਰੀਨ ਆਕਾਰ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "ਟੱਚ-ਸਕਰੀਨ ਚਾਹੀਦੀ ਹੈ" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "ਕੀਬੋਰਡ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "ਮਾਊਸ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "ਗੇਮਪੈਡ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "ਖੇਡਣ ਲਈ ਗੇਮ-ਪੈਡ ਦੀ ਲੋੜ ਹੈ" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "ਅਡੈਪਟਿਵ" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "ਫ਼ੋਨ, ਟੇਬਲੇਟ ਅਤੇ ਡੈਸਕਟਾਪਾਂ ਲਈ ਕੰਮ ਕਰਦੀ ਹੈ" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "ਸ਼ਾਇਦ ਕੀਬੋਰਡ ਜਾਂ ਮਾਊਸ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "ਡੈਸਕਟਾਪ ਅਤੇ ਲੈਪਟਾਪਾਂ ਲਈ ਕੰਮ ਕਰਦੀ ਹੈ" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "ਕੋਈ ਉਮਰ ਲਈ ਅਢੁੱਕਵੀਂ ਸਮੱਗਰੀ ਨਹੀਂ ਹੈ" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "ਕੋਈ ਉਮਰ ਦਰਜੇਬੰਦੀ ਸੰਬੰਧੀ ਜਾਣਕਾਰੀ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "ਵੈੱਬਸਾਈਟ ਨੂੰ ਵੇਖੋ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "…ਇੰਸਟਾਲ ਕਰੋ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "ਰੱਦ ਕਰੋ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "ਇੰਸਟਾਲ ਕਰੋ" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "ਡਾਊਨਲੋਡ ਕਰੋ" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "ਅੱਪਡੇਟ ਕਰੋ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "…ਅਣ-ਇੰਸਟਾਲ ਕਰੋ" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "ਅਣ-ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "ਨਾਜ਼ੁਕ ਅੱਪਡੇਟ" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "ਡਿਵਾਈਸ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੌਰਾਨ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "ਸਰੋਤ: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "%s ਤੋਂ ਨਾਂ ਬਦਲਿਆ ਗਿਆ" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਨੂੰ ਰੋਕਿਆ" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "ਨਾਜ਼ੁਕ ਅੱਪਡੇਟ" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "ਇੰਸਟਾਲ ਹੈ" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "%s ਦੇ ਉਲੱਥੇ ਲਈ ਮਦਦ ਕਰੋ" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s ਨੂੰ ਯੋਗਦਾਨ ਦੇਣ ਵਾਲੀਆਂ ਕੌਮਾਂਤਰੀ ਕਮਿਊਨਟੀ ਵਲੋਂ ਡਿਜ਼ਾਇਨ ਕੀਤਾ, ਵਿਕਾਸ ਅਤੇ ਉਲੱਥਾ ਕੀ" +"ਤਾ ਗਿਆ " +"ਹੈ।\n" +"\n" +"ਸੋ ਜੇ ਇਹ ਹਾਲੇ ਤੁਹਾਡੀ ਭਾਸ਼ਾ ਵਿੱਚ ਮੌਜੂਦ ਨਾ ਹੋਵੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਦਾ ਖੁਦ ਉਲੱਥਾ ਕਰਨ ਲਈ " +"ਮਦਦ ਕਰਕੇ ਹਿੱਸਾ " +"ਪਾ ਸਕਦਾ ਹੋ।" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "ਉਲੱਥਾ" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "ਵੈੱਬਸਾਈਟ ਉਲੱਥਾ(_T)" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "ਰਿਮੋਟ %s (realm %s) ਲਈ ਲਾਗਇਨ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "ਲਾਗਇਨ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "ਰੱਦ ਕਰੋ(_C)" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "ਲਾਗਇਨ(_L)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "ਵਰਤੋਂਕਾਰ(_U)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "ਪਾਸਵਰਡ(_P)" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "ਹੋਰ" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "ਸਭ" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "ਫੀਚਰ" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "ਐਡੀਟਰ ਦੀ ਪਸੰਦ" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "ਨਵੀਂ ਤੇ ਅੱਪਡੇਟ ਕੀਤੀ" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "ਵੈੱਬ ਤੋਂ ਚੁਣੋ" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "ਹੋਰ ਸਾਫਟਵੇਅਰ" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s ਇੰਸਟਾਲ ਹੈ" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "ਐਪ ਵਰਤਣ ਲਈ ਤਿਆਰ ਹੈ" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "ਸਿਸਟਮ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਹੈ" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "ਹੁਣੇ ਇੰਸਟਾਲ ਕੀਤੇ ਅੱਪਡੇਟ ਪੜਤਾਲ ਲਈ ਉਪਲਬਧ ਹਨ" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "ਚਲਾਓ" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "ਸਾਫ਼ਟਵੇਅਰ ਇੰਸਟਾਲ ਕਰਨਾ ਹੈ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "ਸੁਤੰਤਰ-ਧਿਰ ਸਾਫਟਵੇਅਰ ਇੰਸਟਾਲ ਕਰਨਾ ਹੈ?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "ਸਾਫ਼ਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਸਮਰੱਥ ਕਰਨੀ ਹੈ?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "ਸੁਤੰਤਰ-ਧਿਰ ਸਾਫ਼ਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਸਮਰੱਥ ਕਰਨੀ ਹੈ?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s ਮੁਫ਼ਤ ਅਤੇ ਆਜ਼ਾਦ ਸਰੋਤ ਸਾਫ਼ਟਵੇਅਰ ਨਹੀਂ ਹੈ ਅਤੇ “%s” ਵਲੋਂ ਦਿੱ" +"ਤਾ ਜਾ ਰਿਹਾ " +"ਹੈ।" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s ਨੂੰ “%s” ਵਲੋਂ ਦਿੱਤਾ ਜਾ ਰਿਹਾ ਹੈ।" + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"ਇੰਸਟਾਲੇਸ਼ਨ ਨੂੰ ਜਾਰੀ ਰੱਖਣ ਲਈ ਇਸ ਸਾਫ਼ਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਸਮਰੱਥ ਕਰਨਾ ਜ਼ਰੂਰੀ ਹੈ।" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "ਕੁਝ ਦੇਸ਼ਾਂ 'ਚ %s ਨੂੰ ਇੰਸਟਾਲ ਕਰਨਾ ਜਾਂ ਵਰਤਣਾ ਗ਼ੈਰਕਨੂੰਨੀ ਹੋ ਸਕਦਾ ਹੈ।" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"ਕੁਝ ਦੇਸ਼ਾਂ 'ਚ ਇਸ ਕੋਡਕਸ ਨੂੰ ਇੰਸਟਾਲ ਕਰਨਾ ਜਾਂ ਵਰਤਣਾ ਗ਼ੈਰਕਨੂੰਨੀ ਹੋ ਸਕਦਾ ਹੈ।" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "ਮੁੜ ਚੇਤਾਵਨੀ ਨਾ ਦਿਓ(_W)" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "ਸਮਰੱਥ ਤੇ ਇੰਸਟਾਲ ਕਰੋ(_I)" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "ਪੈਕੇਜ ਮੈਨੇਜਰ ਤੋਂ ਵੇਰਵੇ ਸਮੇਤ ਗਲਤੀਆਂ ਅੱਗੇ ਹਨ:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "ਵੇਰਵੇ" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "ਬੰਦ ਕਰੋ(_C)" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "ਵੇਰਵਿਆਂ ਨੂੰ ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਕੀਤਾ" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "ਮਨਜ਼ੂਰ(_A)" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ" +msgstr[1] "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕੀਤੇ ਜਾ ਚੁੱਕੇ ਹਨ" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "ਐਪ ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ" +msgstr[1] "ਐਪਾਂ ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "ਇਸ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" +msgstr[1] "ਇਹਨਾਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "ਹੁਣ ਨਹੀਂ" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "ਅੱਜ" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "ਕੱਲ੍ਹ" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ" +msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d ਹਫ਼ਤਾ ਪਹਿਲਾਂ" +msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d ਮਹੀਨਾ ਪਹਿਲਾਂ" +msgstr[1] "%d ਮਹੀਨੇ ਪਹਿਲਾਂ" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d ਸਾਲ ਪਹਿਲਾਂ" +msgstr[1] "%d ਸਾਲ ਪਹਿਲਾਂ" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "ਹੁਣੇ ਹੀ" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d ਮਿੰਟ ਪਹਿਲਾਂ" +msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ" +msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "ਸਭ" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D ਗਰਾਫਿਕਸ" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "ਫੋਟੋਗਰਾਫ਼ੀ" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "ਸਕੈਨ ਕਰਨਾ" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "ਵੈਕਟਰ ਗਰਾਫਿਕਸ" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "ਵਿਊਅਰ" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "ਆਡੀਓ ਬਣਾਉਣਾ ਤੇ ਸੋਧਣਾ" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "ਸੰਗੀਤ ਪਲੇਅਰ" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "ਸਭ" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "ਕੈਲੰਡਰ" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "ਡਾਟਾਬੇਸ" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "ਵਿੱਤੀ" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "ਵਰਡ ਪਰੋਸੈਸ" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "ਲਿਖਤ ਐਡੀਟਰ" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "ਵੈੱਬ ਬਰਾਊਜ਼ਰ" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "ਸਭ" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "ਕਾਰਵਾਈ" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "ਜਾਂਬਾਜ਼ੀ" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "ਆਰਕੇਡ" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "ਬਲਾਕ" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "ਬੋਰਡ" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "ਤਾਸ਼" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "ਈਮੂਲੇਟਰ" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "ਬੱਚੇ" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "ਲਾਜਿਕ" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "ਭੂਮਿਕਾ ਨਿਭਾਉਣਾ" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "ਖੇਡਾਂ" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "ਕਾਰਜਨੀਤੀ" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "ਸਭ" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "ਗੱਲਬਾਤ" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "ਸਭ" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "ਨਕਲੀ ਮੁਹਾਰਤ" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "ਤਾਰਾ-ਵਿਗਿਆਨ" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "ਰਸਾਇਣ-ਵਿਗਿਆਨ" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "ਭਾਸ਼ਾਵਾਂ" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "ਗਣਿਤ" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "ਖ਼ਬਰਾਂ" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "ਰੋਬੋਟ" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "ਕਲਾ" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "ਆਤਮ-ਕਥਾ" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "ਕਾਮਿਕ" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "ਗਲਪ" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "ਸਿਹਤ" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "ਅਤੀਤ" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "ਜੀਵਨ-ਜਾਚ" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "ਰਾਜਨੀਤੀ" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "ਖੇਡਾਂ" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "ਸਭ" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "ਡੀਬੱਗਰ" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "ਕੋਡਕਸ" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "ਹਾਰਡਵੇਅਰ ਡਰਾਇਵਰ" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "ਫ਼ੋਂਟ" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "ਇੰਪੁੱਟ ਸਰੋਤ" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "ਭਾਸ਼ਾ ਪੈਕ" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "ਉਲੱਥਾ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "ਬਣਾਓ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "ਕੰਮ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "ਚਲਾਓ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "ਸਮਾਜਿਕ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "ਸਿੱਖੋ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "ਡਿਵੈਲਪ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "ਕੋਡਕਸ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "ਹਾਰਡਵੇਅਰ ਡਰਾਇਵਰ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "ਫ਼ੌਂਟ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "ਇਨਪੁੱਟ ਸਰੋਤ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "ਭਾਸ਼ਾ ਪੈਕ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "ਉਲੱਥਾ" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "ਐਪ" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s ਨੇ ਹੋਰ ਫਾਇਲ ਫਾਰਮੈਟ ਸਹਿਯੋਗ ਦੀ ਮੰਗ ਕੀਤੀ ਹੈ।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "ਹੋਰ MIME ਕਿਸਮਾਂ ਚਾਹੀਦੀ ਹੈ" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s ਹੋਰ ਫ਼ੋਂਟਾਂ ਦੀ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "ਹੋਰ ਫ਼ੋਂਟਾਂ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s ਹੋਰ ਮਲਟੀਮੀਡੀਆ ਕੋਡਕਸ ਦੀ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "ਹੋਰ ਮਲਟੀਮੀਡੀਆ ਕੋਡਕਸ ਚਾਹੀਦੇ ਹਨ" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s ਹੋਰ ਪਰਿੰਟਰ ਡਰਾਇਵਰਾਂ ਦੀ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "ਹੋਰ ਪਰਿੰਟਰ ਡਰਾਇਵਰਾਂ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s ਹੋਰ ਪੈਕੇਜਾਂ ਦੀ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ।" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "ਹੋਰ ਪੈਕੇਜਾਂ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "ਸਾਫਟਵੇਅਰ ਵਿੱਚੋਂ ਲੱਭੋ" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "ਹੋਰ ਵੇਖੋ(_S)" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "ਘੱਟ ਵੇਖੋ(_S)" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "...ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "ਇੰਸਟਾਲ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਾਸਤੇ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "ਹਟਾਉਣ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਾਸਤੇ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "…ਇੰਸਟਾਲੇਸ਼ਨ ਬਾਕੀ ਪਈ ਹੈ" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "…ਅੱਪਡੇਟ ਬਾਕੀ ਪਏ ਹਨ" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "…ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "...ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "…ਅਣ-ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ, ਪਰ ਇਸ ਦਾ ਡਾਟਾ ਹਾਲੇ ਵੀ ਮੌਜੂਦ ਹੈ।" + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ(_R)" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "…ਸਮਰੱਥ ਕਰੋ(_E)" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "...ਇੰਸਟਾਲ ਕਰੋ(_I)" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s ਅਮਰੀਕੀ ਅੰਗਰੇਜ਼ੀ ਵਿੱਚ ਦਿਖਾਈ ਦੇਵੇਗੀ" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "ਇਹ ਐਪ ਅਮਰੀਕੀ ਅੰਗਰੇਜ਼ੀ ਵਿੱਚ ਦਿਖਾਈ ਦੇਵੇਗੀ" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "ਇਹ ਸਾਫ਼ਟਵੇਅਰ ਅਮਰੀਕੀ ਅੰਗਰੇਜ਼ੀ ਵਿੱਚ ਦਿਖਾਈ ਦੇਵੇਗਾ" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "ਉਲੱਥੇ ਲਈ ਮਦਦ ਕਰੋ(_T)" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "%s ਵਲੋਂ ਹੋਰ ਐਪਾਂ" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "ਡਿਵੈਲਪਰ %s ਨੇ %s ਦੀ ਮਲਕੀਅਤ ਸਿੱਧ ਕੀਤੀ ਹੈ" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "ਡਿਵੈਲਪਰ ਨੇ %s ਦੀ ਮਲਕੀਅਤ ਸਿੱਧ ਕੀਤੀ ਹੈ" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "ਸਮੀਖਿਆ ਲਿਖਣ ਲਈ ਤੁਹਾਨੂੰ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਚਾਹੀਦੀ ਹੈ" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"ਇਹ ਐਪ ਕੋਈ ਵੀ ਅੱਪਡੇਟ, ਜਿਸ ਵਿੱਚ ਸੁਰੱਖਿਆ ਸੁਧਾਰ ਵੀ ਸ਼ਾਮਲ ਹਨ, ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰੇਗੀ" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"ਇਹ ਐਪ ਪਹਿਲਾਂ ਹੀ ਤੁਹਾਡੀ ਡਿਸਟ੍ਰਿਬਿਊਸ਼ਨ ਵਲੋਂ ਦਿੱਤੀ ਜਾ ਰਹੀ ਹੈ ਅਤੇ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੀਦਾ" +" ਹੈ।" + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"ਇਹ ਐਪ ਵੈੱਬਸਾਈਟ, ਕੋਡ ਰਿਪੋਜ਼ਟਰੀ ਜਾਂ ਮਸਲਾ ਟਰੈਕਰ ਲਈ ਕੋਈ ਵੀ ਲਿੰਕ ਨਹੀਂ ਦਿੰਦੀ ਹੈ।" + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"ਇਹ ਸਾਫ਼ਟਵੇਅਰ ਕੋਈ ਵੀ ਅੱਪਡੇਟ, ਜਿਸ ਵਿੱਚ ਸੁਰੱਖਿਆ ਸੁਧਾਰ ਵੀ ਸ਼ਾਮਲ ਹਨ, ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰੇਗ" +"ਾ" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"ਇਹ ਸਾਫਟਵੇਅਰ ਪਹਿਲਾਂ ਹੀ ਤੁਹਾਡੀ ਡਿਸਟ੍ਰਿਬਿਊਸ਼ਨ ਵਲੋਂ ਦਿੱਤਾ ਜਾ ਰਿਹਾ ਹੈ ਅਤੇ ਬਦਲਣਾ ਨਹੀਂ" +" ਚਾਹੀਦਾ " +"ਹੈ।" + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"ਇਹ ਸਾਫ਼ਟਵੇਅਰ ਵੈੱਬਸਾਈਟ, ਕੋਡ ਰਿਪੋਜ਼ਟਰੀ ਜਾਂ ਮਸਲਾ ਟਰੈਕਰ ਲਈ ਕੋਈ ਵੀ ਲਿੰਕ ਨਹੀਂ ਦਿੰਦਾ ਹੈ" +"।" + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"ਸਾਫਟਵੇਅਰ “%s” ਲਈ ਜਾਣਕਾਰੀ ਲੈਣ ਲਈ ਅਸਫ਼ਲ ਹੈ ਅਤੇ ਇਸ ਐਪ ਬਾਰੇ ਵੇਰਵੇ ਸਮੇਤ ਜਾਣਕਾਰੀ ਵੇਖਾ" +"ਈ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।" + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "ਸਰਵਰ ਤੋਂ ਗਲਤ ਪੜਤਾਲ ਜਵਾਬ ਮਿਲਿਆ" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "“%s” ਲਈ ਪੜਤਾਲ ਭੇਜਣ ਲਈ ਅਸਫ਼ਲ ਹੈ: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "ਵੇਰਵਿਆਂ ਦਾ ਸਫ਼ਾ" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "ਐਪ ਵੇਰਵੇ ਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "ਜਾਂਚਿਆ" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "ਖੋਲ੍ਹੋ(_O)" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "ਅੱਪਡੇਟ ਕਰੋ(_U)" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "ਅਣ-ਇੰਸਟਾਲ ਕਰੋ" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "ਐਡ-ਆਨ" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "ਇਸ ਐਪ ਨੂੰ ਕੇਵਲ ਤਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਜਦੋਂ ਇੰਟਰਨੈੱਟ ਕੁਨੈਕਸ਼ਨ ਚਾਲੂ ਹੈ" + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਸਮੇਤ" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"ਇਹ ਐਪ ਵਿੱਚ ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਸ਼ਾਮਿਲ ਹੈ, ਜੋ ਕਿ ਅੱਪਡੇਟ ਦੇ ਨਾਲ ਨਾਲ ਹੋਰ ਸਾਫਟਵੇਅਰ ਵੀ" +" ਦਿੰਦੀ ਹੈ।" + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "ਕੋਈ ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਸ਼ਾਮਿਲ ਨਹੀਂ ਹੈ" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"ਇਹ ਐਪ ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਸ਼ਾਮਲ ਨਹੀਂ ਹੈ। ਇਸ ਨੂੰ ਨਵੇਂ ਵਰਜ਼ਨ ਲਈ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤ" +"ਾ ਜਾਵੇਗਾ।" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਦੀ ਪਛਾਣ ਕੀਤੀ ਗਈ" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"ਇਹ ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਜੋੜਨ ਨਾਲ ਤੁਹਾਨੂੰ ਵਾਧੂ ਸਾਫਟਵੇਅਰ ਅਤੇ ਅੱਪਗਰੇਡ ਮਿਲਣਗੇ।" + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "ਕੇਵਲ ਉਹੀ ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਵਰਤੋਂ, ਜਿਸ ਉੱਤੇ ਤੁਹਾਨੂੰ ਭਰੋਸਾ ਹੈ।" + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "ਐਪ ਡਾਟਾ ਮਿਟਾਓ" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "ਡਾਟੇ ਨੂੰ ਹਟਾਓ(_e)" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "ਕੋਈ ਮੇਟਾਡਾਟਾ ਨਹੀਂ" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "ਪਰੋਜੈਕਟ ਵੈੱਬਸਾਈਟ(_W)" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "ਦਾਨ ਦਿਓ(_D)" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "ਉਲੱਥੇ ਲਈ ਯੋਗਦਾਨ(_T)" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ(_R)" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "ਮਦਦ(_H)" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "ਸੰਪਰਕ(_C)" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "ਪੜਤਾਲ ਲਿਖੋ(_e)" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "ਸਭ ਪੜਤਾਲਾਂ" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "ਐਪ ਵੇਰਵਿਆਂ ਨੂੰ ਵੇਖਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "ਅਣਜਾਣ ਗਲਤੀ" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "ਕੁੰਜੀ ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕਿਆ ਸੀ" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "ਕੁੰਜੀ ਇਨਰੋਲ ਨਹੀਂ ਕੀਤੀ ਹੈ" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK ਇਨਰੋਲ ਚਾਹੀਦਾ ਸੀ" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "ਅੱਗੇ(_N)" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"ਇਸ ਡਿਵਾਈਸ ਲਈ ਸੁਰੱਖਿਅਤ ਬੂਟ (Secure Boot) ਸਮਰੱਥ ਹੈ। ਨਵੇਂ ਡਰਾਇਵਰਾਂ ਨੂੰ ਸਮਰੱਥ ਕਰਨ " +"ਦੀ " +"ਮਨਜ਼ੂਰੀ ਵਾਸਤੇ ਨਵੀਂ ਮਸ਼ੀਨ ਓਨਰ ਕੀ (MOK) ਦਾ ਹਿੱਸਾ ਬਣਨਾ ਜ਼ਰੂਰੀ ਹੈ। ਇਸ ਕਾਰਵਾਈ ਲਈ ਬਾਅਦ " +"ਵਿੱਚ ਪਾਸਵਰਡ ਭਰਨ ਦੀ ਲੋੜ ਪਵੇਗੀ। ਕੁੰਜੀ ਨਾਲ ਸੰਬੰਧਿਤ ਅੱਗੇ ਦਿੱਤੇ ਪਾਸਵਰਡ ਨੂੰ ਸੰਭਾਲ ਕੇ" +" ਰੱਖੋ।" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "ਮੈਂ MOK ਪਾਸਵਰਡ ਨੋਟ ਕਰ ਚੁੱਕਾ/ਚੁੱਕੀ ਹਾਂ(_p)" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "ਮੁੜ-ਚਾਲੂ ਅਤੇ ਦਾਖ਼ਲ ਕਰੋ(_R)…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "ਸੈਟਅੱਪ ਹਦਾਇਤਾਂ: ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੇ ਬਾਅਦ ਡਿਵਾਈਸ ਸੈਟਅੱਪ ਸਕਰੀਨ ਦਿਖਾਈ ਜਾਵੇਗੀ। ਨਵੇਂ ਡਰਾਇਵਰਾਂ ਨੂੰ ਸਮਰੱਥ" +" ਕਰਨ ਲਈ, " +"ਸੈਟਅੱਪ ਪੜਾਆਵਾਂ ਰਾਹੀਂ ਜਾਰੀ ਰੱਖੋ:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• “MOK ਲਈ ਦਾਖ਼ਲਾ” ਨੂੰ ਚੁਣੋ\n" +"• ਕੁੰਜੀਆਂ ਨੂੰ ਦਾਖਲ ਕਰਨ ਲਈ “ਹਾਂ” ਨੂੰ ਚੁਣੋ\n" +"• ਜਦੋਂ ਪੁੱਛਿਆ ਜਾਵੇ ਤਾਂ MOK ਪਾਸਵਰਡ ਨੂੰ ਭਰੋ\n" +"• ਫੇਰ “ਮੁੜ-ਚਾਲੂ ਕਰੋ” ਨੂੰ ਚੁਣੋ" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "ਸੁਰੱਖਿਆ ਅਸਰ" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"ਕਾਮਯਾਬੀ ਨਾਲ ਹਿੱਸਾ ਬਣਨ ਦੇ ਬਾਅਦ ਯਾਦ ਰੱਖੋ ਕਿ ਮੋਡੀਊਲ ਲਈ ਕੋਈ ਵੀ ਆਉਣ ਵਾਲੇ ਅੱਪਡੇਟ ਜਾਂ" +" ਕਿਸੇ ਵੀ " +"ਹੋਰ ਮੋਡੀਊਲ ਲਈ ਖਾਸ ਤੌਰ ਉੱਤੇ ਭਰੋਸਾ ਕੀਤਾ ਜਾਵੇਗਾ। ਸਾਰੇ ਆਉਣ ਵਾਲੇ ਅੱਪਡੇਟ ਬਿਨਾਂ ਕਿਸੇ " +"ਸੂਚਨਾ ਦਿੱਤੇ ਜਾਂ " +"ਪਰਮਾਣਿਤ ਹੋਏ ਹੀ ਲਾਗੂ ਕੀਤੇ ਜਾਣਗੇ।" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"ਹੋਰ ਹਦਾਇਤਾਂ ਨੂੰ ਦਸਤਾਵੇਜ਼ ਸਫ਼ੇ ਉੱਤੇ ਵੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "…ਵਾਧੂ ਮੇਟਾਡਾਟਾ ਫਾਇਲਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " ਅਤੇ " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s ਸਕ੍ਰਿਫਤ ਲਈ ਮੌਜੂਦ ਫ਼ੋਂਟ" +msgstr[1] "%s ਸਕ੍ਰਿਪਟਾਂ ਲਈ ਮੌਜੂਦ ਫ਼ੋਂਟ" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s ਲਈ ਮੌਜੂਦ ਸਾਫਟਵੇਅਰ" +msgstr[1] "%s ਲਈ ਮੌਜੂਦ ਸਾਫਟਵੇਅਰ" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "ਮੰਘ ਕੀਤਾ ਸਾਫਟਵੇਅਰ ਨਹੀਂ ਲੱਭਿਆ" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "ਮੰਗ ਕੀਤੇ ਸਾਫਟਵੇਅਰ ਨੂੰ ਲੱਭਣ ਲਈ ਫੇਲ੍ਹ ਹੈ" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s ਨਹੀਂ ਲੱਭਿਆ" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "ਵੈੱਬਸਾਈਟ ਉੱਤੇ" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "%s ਫਾਇਲ ਦੇਣ ਵਾਲੀ ਕੋਈ ਵੀ ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"%s ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇ ਨਾਲ ਨਾਲ ਚੋਣਾਂ ਦਿਓ ਕਿ ਕਿਵੇਂ ਗੁੰਮ ਹੋਈਆਂ ਐਪ ਨੂੰ ਲੱਭਿਆ ਜਾ ਸਕਦਾ " +"ਹੈ %s।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s ਸਹਿਯੋਗ ਲਈ ਕੋਈ ਐਪ ਮੌਜੂਦ ਹੈ।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s ਮੌਜੂਦ ਨਹੀਂ ਹੈ।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"%s ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇ ਨਾਲ ਨਾਲ ਚੋਣਾਂ ਦਿਓ ਕਿ ਕਿਵੇਂ ਐਪ ਲਈ ਜਾ ਸਕਦੀ ਹੈ, ਜੋ ਕਿ ਇਸ ਫਾਰਮੈ" +"ਟ ਲਈ " +"ਸਹਾਇਕ ਹੋ ਸਕਦੀ ਹੈ %s।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s ਸਕ੍ਰਿਪਟ ਸਹਿਵੋਗ ਲਈ ਕੋਈ ਫ਼ੋਂਟ ਉਪਲਬਧ ਨਹੀਂ ਹਨ।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"%s ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇ ਨਾਲ ਨਾਲ ਚੋਣਾਂ ਦਿਓ ਕਿ ਕਿਵੇਂ ਹੋਰ ਫ਼ੋਂਟ ਲੱਭੇ ਜਾ ਸਕਦੇ ਹਨ %s।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s ਫਾਰਮੈਟ ਲਈ ਕੋਈ ਐਡ-ਆਨ ਕੋਡਕ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"%s ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇ ਨਾਲ ਨਾਲ ਚੋਣਵਾਂ ਦਿਓ ਕਿ ਇਸ ਫਾਰਮੈਟ ਨੂੰ ਚਲਾਉਣ ਵਾਲੇ ਕੋਡਕ ਨੂੰ ਲੱਭ" +"ਿਆ ਜਾ ਸਕਦਾ " +"ਹੈ %s।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s ਸਹਿਯੋਗ ਲਈ ਕੋਈ ਪਲਾਜ਼ਮਾ ਸਰੋਤ ਮੌਜੂਦ ਨਹੀਂ ਹਨ।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"%s ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇ ਨਾਲ ਨਾਲ ਚੋਣਾਂ ਦਿਓ ਕਿ ਕਿਵੇਂ ਹੋਰ ਪਲਾਜ਼ਮਾ ਸਰੋਤ ਲੱਭੇ ਜਾ ਸਕਦੇ ਹਨ " +"%s।" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s ਲਈ ਕੋਈ ਪਰਿੰਟਰ ਡਰਾਇਵਰ ਮੌਜੂਦ ਨਹੀਂ ਹਨ।" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"%s ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇ ਨਾਲ ਨਾਲ ਚੋਣਾਂ ਕਿ ਇਸ ਪਰਿੰਟਰ ਲਈ ਸਹਾਇਕ ਡਰਾਇਵਰ ਕਿਵੇਂ ਲਿਆ ਜਾ ਸਕਦ" +"ਾ ਹੈ, " +"ਬਾਰੇ %s ਲੱਭਿਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "ਦਸਤਾਵੇਜ਼" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"%s, ਜੋ ਕਿ %s ਵਲੋਂ ਮੰਗ ਕੀਤੀ ਸੀ, ਨੂੰ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ ਹੈ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ %s ਨੂੰ ਵੇ" +"ਖੋ।" +msgstr[1] "" +"%s, ਜੋ ਕਿ %s ਵਲੋਂ ਮੰਗ ਕੀਤੀ ਸੀ, ਨੂੰ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ ਹੈ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ %s ਨੂੰ ਵੇ" +"ਖੋ।" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"%s ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ ਹੈ, ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਲੱਭ ਰਹੇ ਸੀ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ %s ਨੂੰ ਵੇਖੋ।" +msgstr[1] "" +"%s ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ ਹੈ, ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਲੱਭ ਰਹੇ ਸੀ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ %s ਨੂੰ ਵੇਖੋ।" + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "ਕੋਈ ਵੀ ਖੋਜ ਨਤੀਜੇ ਲੱਭਣ ਲਈ ਫੇਲ੍ਹ: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s ਫਾਇਲ ਫਾਰਮੈਟ" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "ਸਭ ਨੂੰ ਇੰਸਟਾਲ ਕਰੋ(_A)" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "ਮੰਗ ਕੀਤੇ ਸਾਫਟਵੇਅਰ ਨੂੰ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "ਕੋਡਕਸ ਸਫ਼ਾ" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਲੱਭੇ" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "ਖੋਜ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "ਪਿੱਛੇ" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "ਅੱਗੇ" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "ਖਾਸ ਐਪ ਸੂਚੀ" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "ਡੈਸਕਟਾਪ ਸਹਿਯੋਗ" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "ਵੱਡੀ ਸਕਰੀਨ ਉੱਤੇ ਵਰਤਣੇ ਜਾਣ ਲਈ ਸਹਾਇਕ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "ਡੈਸਕਟਾਪ ਸਹਿਯੋਗ ਅਣਪਛਾਤਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "ਵੱਡੀਆਂ ਸਕਰੀਨਾਂ ਲਈ ਸਹਿਯੋਗ ਹੋਣ ਬਾਰੇ ਲੋੜੀਂਦੀ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ।" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "ਵੱਡੀ ਸਕਰੀਨ ਚਾਹੀਦੀ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "ਡੈਸਕਟਾਪ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "ਵੱਡੀ ਸਕਰੀਨ ਉੱਤੇ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "ਮੋਬਾਇਲ ਸਹਿਯੋਗ" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "ਛੋਟੀ ਸਕਰੀਨ ਉੱਤੇ ਵਰਤਣੇ ਜਾਣ ਲਈ ਸਹਾਇਕ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "ਮੋਬਾਇਲ ਸਹਿਯੋਗ ਅਣਪਛਾਤਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "ਛੋਟੀਆਂ ਸਕਰੀਨਾਂ ਲਈ ਸਹਿਯੋਗ ਹੋਣ ਬਾਰੇ ਲੋੜੀਂਦੀ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ।" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "ਛੋਟੀ ਸਕਰੀਨ ਚਾਹੀਦੀ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "ਮੋਬਾਇਲ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "ਛੋਟੀ ਸਕਰੀਨ ਉੱਤੇ ਨਹੀਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "ਕੀਬੋਰਡ ਸਹਿਯੋਗ" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "ਕੀਬੋਰਡ ਸਹਿਯੋਗ ਅਣਪਛਾਤਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "ਕੀਬੋਰਡਾਂ ਲਈ ਸਹਿਯੋਗ ਹੋਣ ਬਾਰੇ ਲੋੜੀਂਦੀ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ।" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "ਕੀਬੋਰਡ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "ਕੀਬੋਰਡ ਲਈ ਸਹਾਇਕ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "ਕੀਬੋਰਡ ਸਹਾਇਕ ਨਹੀਂ" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "ਕੀਬੋਰਡ ਨਾਲ ਨਹੀਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "ਮਾਊਸ ਸਹਿਯੋਗ" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "ਮਾਊਸ ਜਾਂ ਪੁਆਇੰਟਿੰਗ ਡਿਵਾਈਸ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "ਮਾਊਸ ਮੋਬਾਇਲ ਸਹਿਯੋਗ ਅਣਪਛਾਤਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"ਮਾਊਸ ਅਤੇ ਪੁਆਇੰਟਿੰਗ ਡਿਵਾਈਸਾਂ ਨਾਲ ਸਹਿਯੋਗ ਹੋਣ ਬਾਰੇ ਲੋੜੀਂਦੀ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ।" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "ਮਾਊਸ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "ਮਾਊਸ ਅਤੇ ਪੁਆਇੰਟਿੰਗ ਡਿਵਾਈਸਾਂ ਲਈ ਸਹਾਇਕ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "ਮਾਊਸ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "ਮਾਊਸ ਜਾਂ ਪੁਆਇੰਟਿੰਗ ਡਿਵਾਈਸ ਨਾਲ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "ਟੱਚ-ਸਕਰੀਨ ਸਹਿਯੋਗ" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "ਟੱਚ-ਸਕਰੀਨ ਸਹਿਯੋਗ ਅਣਪਛਾਤਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "ਟੱਚ ਸਕਰੀਨਾਂ ਲਈ ਸਹਿਯੋਗ ਹੋਣ ਬਾਰੇ ਲੋੜੀਂਦੀ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ।" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "ਟੱਚ-ਸਕਰੀਨ ਚਾਹੀਦੀ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "ਟੱਚ ਸਕਰੀਨਾਂ ਲਈ ਸਹਾਇਕ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "ਟੱਚ ਸਕਰੀਨ ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "ਟੱਚ-ਸਕਰੀਨ ਨਾਲ ਨਹੀਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "ਗੇਮਪੈਡ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "ਗੇਮ-ਪੈਡ ਦੀ ਲੋੜ ਹੈ" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "ਗੇਮਪੈਡ ਸਹਿਯੋਗ" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "ਗੇਮਪੈਡ ਲਈ ਸਹਾਇਕ ਹੈ" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਸ਼ਾਇਦ ਕੰਮ ਕਰਦੀ ਹੈ" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਕੰਮ ਕਰਦੀ ਹੈ" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s ਸੰਭਵ ਤੌਰ ਉੱਤੇ ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਕੰਮ ਕਰਦੀ ਹੈ" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਠੀਕ ਢੰਗ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰੇਗੀ" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਕੰਮ ਨਹੀਂ ਕਰੇਗੀ" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "ਹਾਰਡਵੇਅਰ ਸਹਿਯੋਗ" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "ਨੇਵੀਗੇਸ਼ਨ" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "ਛਾਣਬੀਣ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "ਇੰਸਟਾਲ ਕੀਤਿਆਂ ਦੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "ਅੱਪਡੇਟ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "ਖੋਜ ਪੱਟੀ ਨੂੰ ਖੋਲ੍ਹੋ" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "ਵਿੰਡੋਜ਼" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "ਪਸੰਦਾਂ ਨੂੰ ਖੋਲ੍ਹੋ" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀਆਂ ਨੂੰ ਖੋਲ੍ਹੋ" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "ਮਦਦ" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟਾਂ ਨੂੰ ਖੋਲ੍ਹੋ" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "ਇੰਸਟਾਲ ਹੈ" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "ਇੰਸਟਾਲ ਕੀਤਾ ਸਫ਼ਾ" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "ਜਾਰੀ ਹੈ" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "ਐਪਾਂ" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "ਵੈੱਬ ਐਪਾਂ" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "ਸਿਸਟਮ ਐਪਾਂ" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "ਕਮਿਊਨਟੀ ਵਲੋਂ ਤਿਆਰ ਕੀਤੇ" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "ਹਿੱਸਾ ਬਣੋ(_G)" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ਇਸ ਐਪ ਨੂੰ ਕੌਮਾਂਤਰੀ ਕਮਿਊਨਟੀ ਵਲੋਂ ਆਜ਼ਾਦ ਰੂਪ ਵਿੱਚ ਤਿਆਰ ਕੀਤਾ ਹੈ ਗਿਆ ਹੈ ਅਤੇ %s ਲਸੰਸ ਅਧੀਨ ਜਾਰੀ ਕੀਤਾ ਹੈ।\n" +"\n" +"ਤੁਸੀਂ ਹਿੱਸਾ ਪਾ ਕੇ ਇਸ ਨੂੰ ਹੋਰ ਬੇਹਤਰ ਬਣਾ ਸਕਦੇ ਹੋ।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ਇਸ ਐਪ ਨੂੰ ਕੌਮਾਂਤਰੀ ਕਮਿਊਨਟੀ ਵਲੋਂ ਆਜ਼ਾਦ ਰੂਪ ਵਿੱਚ ਤਿਆਰ ਕੀਤਾ ਹੈ ਗਿਆ ਹੈ ਅਤੇ %s ਲਸੰਸ" +" ਅਧੀਨ ਜਾਰੀ " +"ਕੀਤਾ ਹੈ।\n" +"\n" +"ਤੁਸੀਂ ਹਿੱਸਾ ਪਾ ਕੇ ਇਸ ਨੂੰ ਹੋਰ ਬੇਹਤਰ ਬਣਾ ਸਕਦੇ ਹੋ।" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ਇਸ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ ਕੌਮਾਂਤਰੀ ਕਮਿਊਨਟੀ ਵਲੋਂ ਆਜ਼ਾਦ ਰੂਪ ਵਿੱਚ ਤਿਆਰ ਕੀਤਾ ਹੈ ਗਿਆ ਹੈ ਅਤੇ %s ਲਸੰਸ ਅਧੀਨ ਜਾਰੀ ਕੀਤਾ ਹੈ।\n" +"\n" +"ਤੁਸੀਂ ਹਿੱਸਾ ਪਾ ਕੇ ਇਸ ਨੂੰ ਹੋਰ ਬੇਹਤਰ ਬਣਾ ਸਕਦੇ ਹੋ।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ਇਸ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ ਕੌਮਾਂਤਰੀ ਦੀ ਕਮਿਊਨਟੀ ਵਲੋਂ ਆਜ਼ਾਦ ਰੂਪ ਵਿੱਚ ਤਿਆਰ ਕੀਤਾ ਹੈ ਗਿਆ ਹੈ ਅਤੇ" +" %s ਲਸੰਸ " +"ਅਧੀਨ ਜਾਰੀ ਕੀਤਾ ਹੈ।\n" +"\n" +"ਤੁਸੀਂ ਹਿੱਸਾ ਪਾ ਕੇ ਇਸ ਨੂੰ ਹੋਰ ਬੇਹਤਰ ਬਣਾ ਸਕਦੇ ਹੋ।" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "ਅਣਪਛਾਤਾ ਲਸੰਸ" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "ਹੋਰ ਜਾਣੋ(_L)" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"ਇਹ ਐਪ ਨੇ ਦਰਸਾਇਆ ਨਹੀਂ ਹੈ ਕਿ ਕਿਹੜੇ ਲਸੰਸ ਅਧੀਨ ਇਸ ਨੂੰ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ, ਸ਼ਾਇਦ ਇਹ " +"ਪਰੋਪ੍ਰੈਟਰੀ " +"ਹੋਵੇ। ਇਹ ਅਜਿਹੇ ਢੰਗ ਨਾਲ ਅਸੁਰੱਖਿਅਤ ਵੀ ਹੋ ਸਕਦਾ ਹੈ, ਜਿਸ ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਔਖਾ ਹੋਵੇ ਅਤੇ" +" ਇਸ ਨੂੰ " +"ਬਿਨਾਂ ਦੱਸੇ ਬਦਲਿਆ ਵੀ ਜਾ ਸਕਦਾ ਹੈ।\n" +"\n" +"ਇਸ ਐਪ ਲਈ ਤੁਸੀਂ ਯੋਗਦਾਨ ਪਾ ਵੀ ਸਕਦੇ ਹੋ ਅਤੇ ਨਹੀਂ ਵੀ।" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ਇਹ ਸਾਫ਼ਟਵੇਅਰ ਨੇ ਦਰਸਾਇਆ ਨਹੀਂ ਹੈ ਕਿ ਕਿਹੜੇ ਲਸੰਸ ਅਧੀਨ ਇਸ ਨੂੰ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ, ਸ਼ਾ" +"ਇਦ ਇਹ " +"ਪਰੋਪ੍ਰੈਟਰੀ ਹੋਵੇ। ਇਹ ਅਜਿਹੇ ਢੰਗ ਨਾਲ ਅਸੁਰੱਖਿਅਤ ਵੀ ਹੋ ਸਕਦਾ ਹੈ, ਜਿਸ ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਔ" +"ਖਾ ਹੋਵੇ ਅਤੇ " +"ਇਸ ਨੂੰ ਬਿਨਾਂ ਦੱਸੇ ਬਦਲਿਆ ਵੀ ਜਾ ਸਕਦਾ ਹੈ।\n" +"\n" +"ਇਸ ਸਾਫ਼ਟਵੇਅਰ ਲਈ ਤੁਸੀਂ ਯੋਗਦਾਨ ਪਾ ਵੀ ਸਕਦੇ ਹੋ ਅਤੇ ਨਹੀਂ ਵੀ।" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "ਪਰੋਪ੍ਰੈਟਰੀ" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"ਇਹ ਐਪ ਨੂੰ ਖੁੱਲ੍ਹੇ ਰੂਪ ਵਿੱਚ ਤਿਆਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ, ਸੋ ਡਿਵੈਲਪਰ ਹੀ ਜਾਣੇ ਕਿ ਇਹ ਕਿੱਦਾਂ" +" ਕੰਮ ਕਰਦਾ ਹੈ। " +"ਇਹ ਅਜਿਹੇ ਢੰਗ ਨਾਲ ਅਸੁਰੱਖਿਅਤ ਵੀ ਹੋ ਸਕਦਾ ਹੈ, ਜਿਸ ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਔਖਾ ਹੋਵੇ ਅਤੇ ਇਸ ਨੂ" +"ੰ ਬਿਨਾਂ ਦੱਸੇ " +"ਬਦਲਿਆ ਵੀ ਜਾ ਸਕਦਾ ਹੈ।\n" +"\n" +"ਇਸ ਐਪ ਲਈ ਤੁਸੀਂ ਯੋਗ ਨਹੀਂ ਵੀ ਪਾ ਸਕਦੇ ਹੋ।" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"ਇਹ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ ਖੁੱਲ੍ਹੇ ਰੂਪ ਵਿੱਚ ਤਿਆਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ, ਸੋ ਡਿਵੈਲਪਰ ਹੀ ਜਾਣੇ ਕਿ ਇਹ " +"ਕਿੱਦਾਂ ਕੰਮ " +"ਕਰਦਾ ਹੈ। ਇਹ ਅਜਿਹੇ ਢੰਗ ਨਾਲ ਅਸੁਰੱਖਿਅਤ ਵੀ ਹੋ ਸਕਦਾ ਹੈ, ਜਿਸ ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਔਖਾ ਹੋਵੇ " +"ਅਤੇ ਇਸ ਨੂੰ " +"ਬਿਨਾਂ ਦੱਸੇ ਬਦਲਿਆ ਵੀ ਜਾ ਸਕਦਾ ਹੈ।\n" +"\n" +"ਇਸ ਸਾਫ਼ਟਵੇਅਰ ਲਈ ਤੁਸੀਂ ਯੋਗ ਨਹੀਂ ਵੀ ਪਾ ਸਕਦੇ ਹੋ।" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "ਖਾਸ ਲਸੰਸ" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"ਇਸ ਐਪ ਨੂੰ ਖਾਸ ਲਸੰਸ %s ਰਾਹੀਂ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ।\n" +"\n" +"ਤੁਸੀਂ ਇਸ ਐਪ ਲਈ ਯੋਗਦਾਨ ਪਾ ਵੀ ਸਕਦੇ ਹੋ ਜਾਂ ਨਹੀਂ ਵੀ।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"ਇਸ ਐਪ ਨੂੰ ਖਾਸ ਲਸੰਸ “%s“ ਰਾਹੀਂ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ।\n" +"\n" +"ਤੁਸੀਂ ਇਸ ਐਪ ਲਈ ਯੋਗਦਾਨ ਪਾ ਵੀ ਸਕਦੇ ਹੋ ਜਾਂ ਨਹੀਂ ਵੀ।" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ਇਸ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ ਖਾਸ ਲਸੰਸ %s ਰਾਹੀਂ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ।\n" +"\n" +"ਤੁਸੀਂ ਇਸ ਐਪ ਲਈ ਯੋਗਦਾਨ ਪਾ ਵੀ ਸਕਦੇ ਹੋ ਜਾਂ ਨਹੀਂ ਵੀ।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ਇਸ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ ਖਾਸ ਲਸੰਸ “%s“ ਰਾਹੀਂ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ।\n" +"\n" +"ਤੁਸੀਂ ਇਸ ਐਪ ਲਈ ਯੋਗਦਾਨ ਪਾ ਵੀ ਸਕਦੇ ਹੋ ਜਾਂ ਨਹੀਂ ਵੀ।" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "ਡਾਟੇ ਨੂੰ ਤਾਜ਼ਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "ਸਫ਼ਾ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "ਅਣਪਛਾਤਾ ਸਰੋਤ" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "ਬੀਟਾ" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "ਵਰਤੋਂਕਾਰ" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "ਹੋਰ" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "ਹਟਾਓ" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "ਅੱਪਡੇਟ" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "ਅੱਪਗਰੇਡ" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "ਚੁਣੇ ਬਾਹਰੀ ਸਰੋਤ" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"%s ਤੋਂ ਵਾਧੂ ਸਾਫ਼ਟਵੇਅਰਾਂ ਲਈ ਪਹੁੰਚ ਦਿੰਦਾ ਹੈ। ਕੁਝ ਪ੍ਰੋਪਰੇਟਰੀ ਸਾਫ਼ਟਵੇਅਰ ਮੌਜੂਦ ਹਨ।\n" +"\n" +"ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ ਸਾਫ਼ਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਪਸੰਦਾਂ ਵਿੱਚ ਇਹਨਾਂ ਰਿਪੋਜ਼ਟਰੀਆਂ ਨੂੰ ਸਮਰੱਥ ਕਰ ਸਕ" +"ਦੇ ਹੋ।" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "ਸੁਤੰਤਰ-ਧਿਰ ਸਾਫ਼ਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀਆਂ ਸਮਰੱਥ ਕਰਨੀਆਂ ਹਨ?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "ਅਣਡਿੱਠਾ ਕਰੋ(_I)" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "ਸਮਰੱਥ ਕਰੋ(_E)" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "ਤੁਹਾਡੇ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਲਈ ਮੌਜੂਦ ਹੈ" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "%s ਲਈ ਮੌਜੂਦ" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "ਛਾਣਬੀਣ" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "ਸਾਰ ਸਫ਼ਾ" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "ਐਪਾਂ ਮੌਜੂਦ ਹਨ" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "ਹੋਰ ਕੈਟਾਗਰੀਆਂ" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "ਕੋਈ ਐਪ ਡਾਟਾ ਨਹੀਂ ਲੱਭਿਆ" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "ਅਣਪਛਾਤਾ" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "ਠੀਕ ਹੈ(_O)" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "ਵਰਤੋਂਕਾਰ ਨੇ ਇੰਸਟਾਲੇਸ਼ਨ ਤੋਂ ਨਾਂਹ ਕੀਤੀ" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s ਲਈ ਤਿਆਰੀ" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "ਕੀ ਤੁਸੀਂ %s ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"%s ਤੋਂ ਸਭ ਐਪ ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ ਅਤੇ ਤੁਹਾਨੂੰ ਇਹਨਾਂ ਨੂੰ ਵਰਤਣ ਲਈ ਰਿਪੋਜ਼ਟਰੀ " +"ਤੋਂ ਮੁੜ-ਇੰਸਟਾਲ " +"ਕਰਨਾ ਪਵੇਗਾ।" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨਾ ਹੈ?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "ਹਟਾਉਣ ਦੇ ਬਾਅਦ %s ਨੂੰ ਵਰਤਣਾ ਸੰਭਵ ਨਹੀਂ ਹੋਵੇਗਾ।" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "ਹਟਾਉਣ ਦੇ ਬਾਅਦ %s ਉੱਤੇ ਨਿਰਭਰਤ ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਵਰਤਣਾ ਸੰਭਵ ਨਹੀਂ ਹੋਵੇਗਾ।" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +#| msgid "" +#| "It will not be possible to use %s after removal. App data and settings " +#| "will be kept on disk, to allow restoring the app in the future." +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"ਹਟਾਉਣ ਦੇ ਬਾਅਦ %s ਨੂੰ ਵਰਤਣਾ ਸੰਭਵ ਨਹੀਂ ਹੋਵੇਗਾ ਅਤੇ ਇਸ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵਾਲੇ ਕੋਈ ਵੀ ਦਸ" +"ਤਾਵੇਜ਼ ਵੱਖਰੇ ਫ਼ੋਂਟ ਵਿੱਚ ਦਿਖਾਈ ਦੇਣਗੇ।" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +#| msgid "" +#| "It will not be possible to use %s after removal. App data and settings " +#| "will be kept on disk, to allow restoring the app in the future." +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"ਹਟਾਉਣ ਦੇ ਬਾਅਦ %s ਨੂੰ ਵਰਤਣਾ ਸੰਭਵ ਨਹੀਂ ਹੋਵੇਗਾ। ਇਸ ਨਾਲ ਕੁਝ ਮੀਡੀਆ ਫ਼ਾਇਲਾਂ ਚਲਾਉਣ ਯੋਗ" +" ਨਹੀਂ ਹੋਣਗੀਆਂ।" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"%s ਨੂੰ ਹਟਾਉਣ ਦੇ ਬਾਅਦ ਇਸ ਉੱਤੇ ਨਿਰਭਰ ਹਾਰਡਵੇਅਰ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਹੀਂ ਵੀ ਕਰ ਸਕਦਾ ਹੈ।" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"ਹਟਾਉਣ ਦੇ ਬਾਅਦ %s ਨੂੰ ਵਰਤਣਾ ਸੰਭਵ ਨਹੀਂ ਹੋਵੇਗਾ। ਐਪ ਡਾਟਾ ਅਤੇ ਸੈਟਿਂਗਾਂ ਨੂੰ ਡਿਸਕ ਉੱਤ" +"ੇ ਰੱਖਿਆ ਜਾਵੇਗਾ, " +"ਜਿਸ ਨਾਲ ਭਵਿੱਖ ਵਿੱਚ ਐਪ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਸੰਭਵ ਹੋਵੇਗਾ।" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "ਪਸੰਦਾਂ" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "ਹੋਰ ਜਾਣਕਾਰੀ" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"ਅੱਪਡੇਟਾਂ ਨੂੰ ਚੈੱਕ ਅਤੇ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਡਾਟਾ ਅਤੇ ਪਾਵਰ ਲੱਗਦੀ ਹੈ। ਜਦੋਂ ਮੀਟਰ ਵਾਲਾ ਨੈ" +"ੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਹੋਵੇ " +"ਅਤੇ ਪਾਵਰ ਬੱਚਤ ਚਾਲੂ ਹੋਵੇ ਤਾਂ ਆਪਣੇ-ਆਪ ਅੱਪਡੇਟ ਫ਼ੀਚਰਾਂ ਨੂੰ ਰੋਕ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "ਆਪਣੇ-ਆਪ(_A)" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "ਅੱਪਡੇਟਾਂ ਲਈ ਆਪਣੇ-ਆਪ ਜਾਂਚ ਕਰੋ ਅਤੇ ਡਾਊਨਲੋਡ ਕਰੋ" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "ਖੁਦ(_M)" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "ਅੱਪਡੇਟਾਂ ਦੀ ਜਾਂਚ ਅਤੇ ਡਾਊਨਲੋਡ ਨੂੰ ਖੁਦ ਕੀਤਾ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "ਆਪਣੇ-ਆਪ ਅੱਪਡੇਟ ਸੂਚਨਾਵਾਂ(_N)" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "ਜਦੋਂ ਅੱਪਡੇਟਾਂ ਨੂੰ ਆਪਣੇ-ਆਪ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੋਵੇ ਤਾਂ ਸੂਚਨਾ ਦਿਓ" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "ਸਮੱਗਰੀ ਲਈ ਫਿਲਟਰ" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "ਸਿਰਫ਼ ਆਜ਼ਾਦ ਸਾਫਟਵੇਅਰ ਹੀ ਵੇਖਾਓ(_F)" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "ਜਦੋਂ ਵੀ ਬਰਾਊਜ਼ ਅਤੇ ਖੋਜ ਕਰਨੇ ਹੋਣ ਤਾਂ ਪਰੋਪ੍ਰੇਟਰੀ ਸਾਫਟਵੇਅਰਾਂ ਨੂੰ ਓਹਲੇ ਰੱਖੋ" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "ਸਿਰਫ਼ ਤਸਦੀਕ ਕੀਤੇ ਡਿਵੈਲਪਰ ਹੀ ਵੇਖਾਓ(_V)" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"ਸਿਰਫ਼ ਉਹਨਾਂ ਡਿਵੈਲਪਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਹੀ ਵੇਖਾਓ, ਜਿਨ੍ਹਾਂ ਨੂੰ ਤਸਦੀਕ ਕੀਤਾ ਗਿਆ ਹੋਵੇ" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"ਇੰਸਟਾਲ ਹੋਏ ਸਾਫ਼ਟਵੇਅਰ %s ਨਾਲ ਮਾਫ਼ਕ ਨਹੀਂ ਹਨ ਅਤੇ ਅੱਪਗਰੇਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਅੱਗੇ ਦਿੱਤੇ " +"ਆਪਣੇ-ਆਪ ਹਟਾਏ " +"ਜਾਣਗੇ।" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "ਨਾ-ਮਾਫ਼ਕ ਸਾਫਟਵੇਅਰ" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "ਅੱਪਗਰੇਡ(_U)" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "ਅਣ-ਇੰਸਟਾਲ(_U)" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "ਐਪ ਸੈਟਿੰਗਾਂ ਅਤੇ ਡਾਟਾ" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "ਰੱਖੋ(_K)" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "ਐਪ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸਮੱਗਰੀ ਨੂੰ ਬਹਾਲ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "ਹਟਾਓ(_D)" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "ਡਿਸਕ ਥਾਂ ਬਚਾਉਣ ਲਈ ਡਾਟੇ ਨੂੰ ਪੱਕੇ ਤੌਰ ਉੱਤੇ ਹਟਾਓ" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "“%s“ ਤੋਂ ਇੰਸਟਾਲ ਕੀਤੇ ਸਾਫ਼ਟਵੇਅਰ ਲਈ ਅੱਪਡੇਟ ਰੋਕ ਦਿੱਤੇ ਜਾਣਗੇ।" + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "ਰਿਪੋਜ਼ਟਰੀ ਅਸਮਰੱਥ ਕਰਨੀ ਹੈ?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "ਰਿਪੋਰਜ਼ਟਰੀ ਹਟਾਉਣੀ ਹੈ?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "ਅਸਮਰੱਥ(_D)" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "ਹਟਾਓ(_R)" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "ਨਵੀਆਂ ਰਿਪੋਜ਼ਟਰੀਆਂ ਸਮਰੱਥ ਕਰੋ" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "ਜਦੋਂ ਨਵੀਆਂ ਰਿਪੋਜ਼ਟਰੀਆਂ ਨੂੰ ਜੋੜਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਉਹਨਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "ਹੋਰ ਜਾਣਕਾਰੀ" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "ਚੁਣੇ ਗਏ ਤੀਜੀ ਧਿਰ ਸਰੋਤਾਂ ਤੋਂ ਵਧੀਕ ਰਿਪੋਜ਼ਟਰੀਆਂ — %s।" + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "ਫੇਡੋਰਾ ਤੀਜੀ ਧਿਰ ਰਿਪੋਜ਼ਟਰੀਆਂ" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "ਇਹ ਰਿਪੋਜ਼ਟਰੀਆਂ %s ਵਲੋਂ ਦਿੱਤੇ ਮੂਲ ਸਾਫਟਵੇਅਰਾਂ ਦਾ ਸਹਾਇਕ ਹਿੱਸਾ ਹਨ।" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀਆਂ" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "ਕੋਈ ਰਿਪੋਜ਼ਟਰੀ ਨਹੀਂ" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u ਐਪ ਇੰਸਟਾਲ ਹੈ" +msgstr[1] "%u ਐਪਾਂ ਇੰਸਟਾਲ ਹਨ" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u ਐਡ-ਆਨ ਇੰਸਟਾਲ ਹੈ" +msgstr[1] "%u ਐਡ-ਆਨ ਇੰਸਟਾਲ ਹਨ" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u ਐਪ" +msgstr[1] "%u ਐਪਾਂ" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u ਐਡ-ਆਨ" +msgstr[1] "%u ਐਡ-ਆਨ" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s ਅਤੇ %s ਇੰਸਟਾਲ ਹੈ" +msgstr[1] "%s ਅਤੇ %s ਇੰਸਟਾਲ ਹਨ" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "…ਇੰਸਟਾਲੇਸ਼ਨ ਸਾਫ਼ਟਵੇਅਰਾਂ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "ਹਟਾਓ" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "ਇਸ ਨਾਲ ਨਫ਼ਰਤ ਹੈ" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "ਇਹ ਪਸੰਦ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "ਇਹ ਠੀਕ ਹੈ" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "ਇਹ ਪਸੰਦ ਹੈ" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "ਇਸ ਨਾਲ ਪਿਆਰ ਹੈ" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "ਦਰਜਾ ਦੇਣ ਲਈ ਤਾਰਾ ਚੁਣੋ" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "ਪੜਤਾਲ ਲਿਖਣ ਲਈ ਕੁਝ ਹੋਰ ਸਮਾਂ ਲਗਾਓ" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "ਤਾਰਾ ਲਗਾ ਕੇ ਦਰਜਾ ਦਿਓ" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "ਸਾਰ ਬਹੁਤ ਛੋਟਾ ਹੈ" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "ਸਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "ਵਰਣਨ ਬਹੁਤ ਛੋਟਾ ਹੈ" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "ਵਰਣਨ ਬਹੁਤ ਲੰਮਾ ਹੈ" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "ਪੜਤਾਲ ਲਿਖੋ" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "ਭੇਜੋ(_S)" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"ਰੇਟਿੰਗ, ਸਾਰ ਅਤੇ ਪੜਤਾਲ ਲਿਖਤ ਦਿਓ। ਪੜਤਾਲ ਨੂੰ ਸਮੱਸਿਆਵਾਂ ਦੀ ਰਿਪੋਰਟ ਕਰਨ ਲਈ ਨਹੀਂ ਵਰਤਿ" +"ਆ ਜਾ " +"ਸਕਦਾ ਹੈ: ਇਸ ਦੀ ਬਜਾਏ ਡਿਵੈਲਪਰ ਜਾਂ ਆਪਣੇ ਸਹਿਯੋਗ ਪੂਰਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "ਪੜਤਾਲ ਸਾਰ" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "ਸੰਖੇਪ ਜਿਹੀ ਪੜਤਾਲ ਲਿਖੋ" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"ਪਰਦੇਦਾਰੀ ਨੀਤੀ ਵਿੱਚ ਵੇਖੋ ਕਿ ਕਿਹੜ" +"ਾ " +"ਡਾਟਾ ਭੇਜਿਆ ਜਾਂਦਾ ਹੈ। ਤੁਹਾਡੇ ਖਾਤੇ ਨਾਲ ਸੰਬੰਧਿਤ ਪੂਰੇ ਨਾਂ ਨੂੰ ਜਨਤਕ ਤੌਰ ਉੱਤੇ ਦਿਖਾਇਆ" +" ਜਾਵੇਗਾ।" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "ਕੁੱਲ %u ਪੜਤਾਲ" +msgstr[1] "ਕੁੱਲ %u ਪੜਤਾਲਾਂ" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "5 ਵਿੱਚੋਂ ਤਾਰੇ" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "ਅਣਪਛਾਤਾ" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"ਤੁਸੀਂ ਪੜਤਾਲਾਂ ਦੇ ਨਿੰਦਾਪੂਰਨ, ਉਜੱਡ, ਅਸ਼ਲੀਲ ਜਾਂ ਪੱਖਪਾਤੀ ਰਵੱਈਏ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇ ਸਕਦੇ" +" ਹੋ।" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"ਇੱਕ ਵਾਰ ਜਾਣਕਾਰ ਦੇਣ ਉੱਤੇ, ਪੜਤਾਲ ਨੂੰ ਪਰਸ਼ਾਸ਼ਕ ਵਲੋਂ ਜਾਂਚੇ ਜਾਣ ਤੱਕ ਓਹਲੇ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "ਪੜਤਾਲ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇਣੀ ਹੈ?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "ਰਿਪੋਰਟ ਕਰੋ(_R)" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "ਪੜਤਾਲ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "ਪੜਤਾਲ ਦੇ ਹਟਾਉਣ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "ਪੜਤਾਲ ਪਸੰਦ ਕਰੋ" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "ਪੜਤਾਲ ਪਸੰਦ ਨਹੀਂ" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "…ਜਾਣਕਾਰੀ ਦਿਓ" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "... ਨੂੰ ਹਟਾਓ" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"ਐਪ ਸੈਂਡ-ਬਾਕਸ ਕੀਤੀ ਨਹੀਂ ਹੈ, ਪਰ ਡਿਸਟਰੀਬਿਊਸ਼ਨ ਨੇ ਇਸ ਦੇ ਦੋਖੀ ਹੋਣ ਦੀ ਜਾਂਚ ਕੀਤੀ ਹੈ" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"ਐਪ ਦੇ ਸੈਂਡ ਬਾਕਸ ਨਾ ਕੀਤੇ ਹੋਣ ਕਰਕੇ ਜਾਂਚ ਕਰੋ ਕਿ ਤੁਸੀਂ ਵੇਂਡਰ ਉੱਤੇ ਭਰੋਸਾ ਕਰਦੇ ਹੋ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "ਕੋਈ ਮਨਜ਼ੂਰੀ ਨਹੀਂ" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "ਇਹ ਐਪ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸੈਂਡਬਾਕਸ ਕੀਤੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "ਨੈੱਟਵਰਕ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "ਇੰਟਰਨੈੱਟ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "ਕੋਈ ਨੈੱਟਵਰਕ ਪਹੁੰਚ ਨਹੀਂ" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "ਇੰਟਰਨੈੱਟ ਲਈ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੀ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਵਰਤਦੀ ਹੈ" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਤੋਂ ਡਾਟੇ ਦੀ ਮੰਗ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "ਸ਼ੈਸ਼ਨ ਸੇਵਾਵਾਂ ਵਰਤਦੀ ਹੈ" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "ਸ਼ੈਸ਼ਨ ਸੇਵਾਵਾਂ ਤੋਂ ਡਾਟੇ ਦੀ ਮੰਗ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "ਵਰਤੋਂਕਾਰ ਡਿਵਾਈਸ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "ਵੈੱਬ-ਕੈਮ ਜਾਂ ਗੇਮਿੰਗ ਕੰਟਰੋਲਰ ਵਰਗੇ ਡਿਵਾਈਸ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "ਕਿਸੇ ਵਰਤੋਂਕਾਰ ਡਿਵਾਈਸ ਲਈ ਪਹੁੰਚ ਨਹੀਂ ਹੈ" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "ਵੈੱਬ-ਕੈਮ ਜਾਂ ਗੇਮਿੰਗ ਕੰਟਰੋਲਰ ਵਰਗੇ ਡਿਵਾਈਸ ਲਈ ਪਹੁੰਚ ਕਰ ਨਹੀਂ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "ਇਨਪੁੱਟ ਡਿਵਾਈਸ ਪਹੁੰਚ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "ਮਾਈਕਰੋਫ਼ੋਨ ਪਹੁੰਚ ਅਤੇ ਆਡੀਓ ਪਲੇਅਬੈਕ" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "ਬਿਨਾਂ ਇਜਾਜ਼ਤ ਲਏ ਮਾਈਕਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸੁਣ ਅਤੇ ਆਡੀਓ ਪਲੇਅ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "ਸਿਸਟਮ ਡਿਵਾਈਸ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"ਸਿਸਟਮ ਡਿਵਾਈਸ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਹਨਾਂ ਲਈ ਉੱਚੇ ਪੱਧਰ ਦੀਆਂ ਇਜਾਜ਼ਤਾਂ ਚਾਹੀਦੀਆਂ ਹਨ" +"।" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "ਸਕਰੀਨ ਦੀ ਸਮੱਗਰੀ ਲਈ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "ਸਕਰੀਨ ਜਾਂ ਹੋਰ ਵਿੰਡੋਆਂ ਦੀ ਸਮੱਗਰੀ ਲਈ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "ਪੁਰਾਣਾ ਵਿੰਡੋਇੰਗ ਸਿਸਟਮ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "ਮਨਮਰਜ਼ੀ ਦੀਆਂ ਇਜਾਜ਼ਤਾਂ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "ਵਰਤੋਂਕਾਰ ਸੈਟਿੰਗਾਂ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "ਪੂਰੀ ਫਾਇਲ ਸਿਸਟਮ ਪੜ੍ਹਨ/ਲਿਖਣ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "ਫ਼ਾਇਲ ਸਿਸਟਮ ਉਤੇ ਸਾਰਾ ਡਾਟਾ ਪੜ੍ਹ ਅਤੇ ਲਿਖ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "ਹੋਮ ਫੋਲਡਰ ਪੜ੍ਹਨ/ਲਿਖਣ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "ਤੁਹਾਡੀ ਘਰ ਡਾਇਕੈਟਰੀ ਵਿੱਚ ਸਭ ਡਾਟਾ ਪੜ੍ਹ ਅਤੇ ਲਿਖ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "ਪੂਰੀ ਫਾਇਲ ਸਿਸਟਮ ਪੜ੍ਹਨ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "ਫ਼ਾਇਲ ਸਿਸਟਮ ਉਤੇ ਸਾਰਾ ਡਾਟਾ ਪੜ੍ਹ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "ਹੋਮ ਫੋਲਡਰ ਪੜ੍ਹਨ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "ਤੁਹਾਡੀ ਹੋਮ ਡਾਇਕੈਟਰੀ ਵਿੱਚ ਸਭ ਡਾਟਾ ਪੜ੍ਹ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਪੜ੍ਹਨ/ਲਿਖਣ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "ਤੁਹਾਡੀ ਡਾਊਨਲੋਡ ਡਾਇਕੈਟਰੀ ਵਿੱਚ ਸਭ ਡਾਟਾ ਪੜ੍ਹ ਅਤੇ ਲਿਖ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਪੜ੍ਹਨ ਪਹੁੰਚ" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "ਤੁਹਾਡੀ ਡਾਊਨਲੋਡ ਡਾਇਕੈਟਰੀ ਵਿੱਚ ਸਭ ਡਾਟਾ ਪੜ੍ਹ ਸਕਦੀ ਹੈ" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "ਡਾਇਕੈਟਰੀ ਵਿੱਚ ਸਭ ਡਾਟਾ ਪੜ੍ਹ ਅਤੇ ਲਿਖ ਸਕਦੀ ਹੈ" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "ਡਾਇਕੈਟਰੀ ਵਿੱਚ ਸਭ ਡਾਟਾ ਪੜ੍ਹ ਸਕਦੀ ਹੈ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "ਕੋਈ ਫਾਇਲ ਸਿਸਟਮ ਪਹੁੰਚ ਨਹੀਂ" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "ਕਿਸੇ ਵੀ ਫਾਇਲ ਸਿਸਟਮ ਲਈ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੀ ਹੈ" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "ਐਪ ਡਿਵੈਲਪਰ ਨੂੰ ਤਸਦੀਕ ਕੀਤਾ ਹੈ" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "ਇਸ ਐਪ ਦੇ ਡਿਵੈਲਪਰ ਨੂੰ ਜੋ ਉਹ ਹਨ, ਲਈ ਤਸਦੀਕ ਕੀਤਾ ਗਿਆ ਹੈ" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "ਨਾ-ਸੁਰੱਖਿਅਤ ਨਿਰਭਰਤਾਵਾਂ" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"ਸਾਫ਼ਟਵੇਅਰ ਜਾਂ ਇਸ ਦੀਆਂ ਨਿਰਭਰਤਾਵਾਂ ਹੁਣ ਸਹਾਇਕ ਨਹੀਂ ਹਨ ਅਤੇ ਅਸੁਰੱਖਿਅਤ ਹੋ ਸਕਦੀਆਂ ਹਨ" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"ਇਹ ਐਪ ਨੇ ਦਰਸਾਇਆ ਨਹੀਂ ਹੈ ਕਿ ਕਿਹੜੇ ਲਸੰਸ ਅਧੀਨ ਇਸ ਨੂੰ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ, ਸ਼ਾਇਦ ਇਹ " +"ਪਰੋਪ੍ਰੈਟਰੀ " +"ਹੋਵੇ।" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"ਇਹ ਸਾਫ਼ਟਵੇਅਰ ਨੇ ਦਰਸਾਇਆ ਨਹੀਂ ਹੈ ਕਿ ਕਿਹੜੇ ਲਸੰਸ ਅਧੀਨ ਇਸ ਨੂੰ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ, ਸ਼ਾ" +"ਇਦ ਇਹ " +"ਪਰੋਪ੍ਰੈਟਰੀ ਹੋਵੇ।" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "ਪਰੋਪ੍ਰੈਟਰੀ ਕੋਡ" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"ਸਰੋਤ ਕੋਡ ਜਨਤਕ ਨਹੀਂ ਹੈ, ਕਿਸੇ ਵੀ ਸੁਤੰਤਰ ਧਿਰ ਵਲੋਂ ਜਾਂਚਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ ਅਤੇ ਅਸੁਰ" +"ੱਖਿਅਤ ਹੋ ਸਕਦਾ ਹੈ" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "ਇਸ ਐਪ ਨੂੰ ਖਾਸ ਲਸੰਸ “%s“ ਰਾਹੀਂ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "ਇਸ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ ਖਾਸ ਲਸੰਸ “%s“ ਰਾਹੀਂ ਡਿਵੈਲਪ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "ਆਡਿਟਯੋਗ ਕੋਡ" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"ਸਰੋਤ ਕੋਡ ਜਨਤਕ ਹੈ ਅਤੇ ਕਿਸੇ ਵੀ ਸੁਤੰਤਰ ਧਿਰ ਵਲੋਂ ਜਾਂਚਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਐਪ ਵੱਧ" +" ਸੁਰੱਖਿਅਤ ਹੋਣ " +"ਦੀ ਸੰਭਾਵਨਾ ਹੈ" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s ਵਿਸ਼ੇਸ਼ ਹੈ" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s ਸੁਰੱਖਿਅਤ" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s ਸ਼ਾਇਦ ਸੁਰੱਖਿਅਤ ਹੈ" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s ਸੰਭਵ ਰੂਪ ਵਿੱਚ ਅਸੁਰੱਖਿਅਤ" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s ਅਸੁਰੱਖਿਅਤ" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "ਅਣਪਛਾਤਾ" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "ਸੁਰੱਖਿਆ" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "ਲਸੰਸ" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "ਸਰੋਤ" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"ਇਹ ਐਪ ਸਾਫਟਵੇਅਰ ਪਲੇਟਫਾਰਮ (SDK) ਦਾ ਪੁਰਾਣੇ ਵਰਜ਼ਨ ਨੂੰ ਵਰਤਦੀ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ ਅਜਿਹੇ ਬੱ" +"ਗ ਜਾਂ " +"ਸੁਰੱਖਿਆ ਕਮੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ, ਜਿਨ੍ਹਾਂ ਨੂੰ ਠੀਕ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "ਪਿਛਲਾ ਸਕਰੀਨਸ਼ਾਟ" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "ਅਗਲਾ ਸਕਰੀਨਸ਼ਾਟ" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "ਕੋਈ ਸਕਰੀਨਸ਼ਾਟ ਨਹੀਂ" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "ਸਕਰੀਨਸ਼ਾਟ ਨਹੀਂ ਲੱਭਿਆ" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "ਚਿੱਤਰ ਲੋਡ ਕਰਨ ਲਈ ਫੇਲ੍ਹ" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "ਸਕਰੀਨਸ਼ਾਟ ਆਕਾਰ ਨਹੀਂ ਲੱਭਿਆ" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "ਕੈਸ਼ ਨਹੀਂ ਬਣਾਈ ਜਾ ਸਕਦੀ ਹੈ" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "ਸਕਰੀਨਸ਼ਾਟ ਠੀਕ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "ਸਕਰੀਨਸ਼ਾਟ ਨਹੀਂ ਹੈ" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "ਸਕਰੀਨਸ਼ਾਟ" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u ਹੋਰ ਮੇਲ" +msgstr[1] "%u ਹੋਰ ਮੇਲ" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "ਖੋਜ ਸਫ਼ਾ" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "ਐਪਾਂ ਲਈ ਖੋਜ" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "ਕੋਈ ਐਪ ਨਹੀਂ ਲੱਭੀ" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "ਫਿਰਮਵੇਅਰ ਅੱਪਡੇਟ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "%s ਤੋਂ ਫਿਰਮਵੇਅਰ ਅੱਪਡੇਟ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "%s ਤੋਂ ਅੱਪਡੇਟਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਲੋੜੀਂਦੀ ਡਿਸਕ ਥਾਂ ਮੌਜੂਦ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "%s ਤੋਂ ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਸੀ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਅਵੈਧ ਪਰਮਾਣੀਕਰਨ " + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਇਜਾਜ਼ਤ ਚਾਹੀਦੀ ਹੈ" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਤੁਹਾਨੂੰ ਸਾਫਟਵੇਅਰ ਇੰਸਟਾਲ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "ਅੱਪਡੇਟਾਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s ਤੋਂ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਾਊਨਲੋਡ ਅਸਫ਼ਲ ਹੈ" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਰਨਟਾਈਮ ਮੌਜੂਦ ਨਹੀਂ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s ਰਨਟਾਈਮ ਅਸਮਰੱਥ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "%s ਨੂੰ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਐਪ ਦਾ ਫਾਰਮੈਟ ਅਢੁੱਕਵਾਂ ਹੈ" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਚਾਹੀਦੀ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਪਰਮਾਣੀਕਰਨ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਪਰਮਾਣੀਕਰਨ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਅਵੈਧ ਪਰਮਾਣੀਕਰਨ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਅਵੈਧ ਪਰਮਾਣੀਕਰਨ" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਇਜਾਜ਼ਤ ਚਾਹੀਦੀ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਇਜਾਜ਼ਤ ਚਾਹੀਦੀ ਹੈ" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਿਵਾਈਸ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਿਵਾਈਸ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਘੱਟ ਬੈਟਰੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਘੱਟ ਬੈਟਰੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%2$s ਤੋਂ %1$s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਾਊਨਲੋਡ ਅਸਫ਼ਲ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "%s ਤੋਂ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਾਊਨਲੋਡ ਅਸਫ਼ਲ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਲੋੜੀਂਦੀ ਡਿਸਕ ਥਾਂ ਮੌਜੂਦ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਪਰਮਾਣੀਕਰਨ ਚਾਹੀਦੀ ਸੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਅਵੈਧ ਪਰਮਾਣੀਕਰਨ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਇਜਾਜ਼ਤ ਚਾਹੀਦੀ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਿਵਾਈਸ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਿਵਾਈਸ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਘੱਟ ਬੈਟਰੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਘੱਟ ਬੈਟਰੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "%s ਅੱਪਡੇਟ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "ਅੱਪਡੇਟ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%2$s ਤੋਂ %1$s ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਲੋੜੀਂਦੀ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਲੋੜੀਂਦੀ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣੀਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣੀਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਅਵੈਧ ਪਰਮਾਣੀਕਰਨ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਅਵੈਧ ਪਰਮਾਣੀਕਰਨ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਇਜਾਜ਼ਤ ਚਾਹੀਦੀ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਇਜਾਜ਼ਤ ਚਾਹੀਦੀ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਡਿਵਾਈਸ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਡਿਵਾਈਸ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਘੱਟ ਬੈਟਰੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਘੱਟ ਬੈਟਰੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਪਰਮਾਣੀਕਰਨ ਚਾਹੀਦਾ ਸੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਪਰਮਾਣੀਕਰਨ ਚਾਹੀਦਾ ਸੀ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਅਵੈਧ ਪਰਮਾਣੀਕਰਨ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਅਵੈਧ ਪਰਮਾਣੀਕਰਨ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਇਜਾਜ਼ਤ ਚਾਹੀਦੀ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਇਜਾਜ਼ਤ ਚਾਹੀਦੀ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਿਵਾਈਸ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਡਿਵਾਈਸ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਘੱਟ ਬੈਟਰੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਘੱਟ ਬੈਟਰੀ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "%s ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "ਅਫਸੋਸ, ਕੁਝ ਗ਼ਲਤ ਵਾਪਰਿਆ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "ਕਾਰਵਾਈ ਲਈ ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਫਾਇਲ ਦੀ ਕਿਸਮ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਪਰਮਾਣੀਕਰਨ ਫੇਲ੍ਹ ਹੈ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "%s ਨਾਲ ਸੰਪਰਕ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "ਨਵੀਆਂ ਪਲੱਗਇਨਾਂ ਵਰਤਣ ਵਾਸਤੇ ਸਾਫਟਵੇਅਰ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰੋ" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "ਡਿਵਾਈਸ ਨੂੰ ਪਲੱਗ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀਆਂ(_S)" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "ਪਸੰਦਾਂ(_P)" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ(_K)" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "ਸਾਫਟਵੇਅਰ ਬਾਰੇ(_A)" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "ਖੋਜ" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "ਮੁੱਖ ਮੇਨੂ" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "ਐਪਾਂ ਲਈ ਖੋਜ" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "ਛਾਣਬੀਨ ਕਰੋ(_E)" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "ਇੰਸਟਾਲ ਕੀਤੇ(_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "ਅੱਪਡੇਟ(_U)" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "ਪਿੱਛੇ ਜਾਓ" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "ਕੋਈ ਨਹੀਂ" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "ਐਪ ਡਾਟਾ" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "ਐਪ ਚਲਾਉਣ ਲਈ ਡਾਟਾ ਚਾਹੀਦਾ ਹੈ" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "ਵਰਤੋਂਕਾਰ ਡਾਟਾ" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "ਤੁਹਾਡੇ ਵਲੋਂ ਐਪ ਵਿਚ ਬਣਾਇਆ ਗਿਆ ਡਾਟਾ" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "ਕੈਸ਼ ਡਾਟਾ" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "ਆਰਜ਼ੀ ਕੈਸ਼ ਕੀਤਾ ਡਾਟਾ" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "ਐਪ ਵਲੋਂ ਖੁਦ" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "ਨਿਰਭਰਤਾਵਾਂ ਚਾਹੀਦੀਆਂ ਹਨ" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "ਇਸ ਐਪ ਰਾਹੀਂ ਸਾਂਝੇ ਕੀਤੇ ਸਿਸਟਮ ਭਾਗ ਚਾਹੀਦੇ ਹਨ" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "ਅਣਪਛਾਤਾ" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"ਕੈਸ਼ ਕੀਤੇ ਡਾਟੇ ਨੂੰ ਐਪ ਸੈਟਿੰਗਾਂ(_a) ਤੋਂ ਮਿਟਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "ਸਟੋਰੇਜ਼" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (ਇੰਸਟਾਲ ਹੈ)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "ਵੇਰਵੇ(_D)" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "ਜਾਂਚ ਕਰੋ(_E)" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "%s ਨੂੰ ਇੰਸਟਾਲ ਕੀਤਾ" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "ਇੰਸਟਾਲ ਹੋਏ ਅੱਪਡੇਟ" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "ਕੋਈ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "ਅੱਪਡੇਟ ਪੁਰਾਣੇ ਹੋ ਗਏ ਹਨ" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "ਮੌਜੂਦ ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਕਰੋ" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "ਨਾਜ਼ੁਕ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਤਿਆਰ ਹੈ" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "ਨਾਜ਼ੁਕ ਅੱਪਡੇਟਾਂ ਨੂੰ ਫ਼ੌਰਨ ਇੰਸਟਾਲ ਕਰੋ" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "ਨਾਜ਼ੁਕ ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ ਹੈ" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "ਨਾਜ਼ੁਕ ਅੱਪਡੇਟਾਂ ਨੂੰ ਫ਼ੌਰਨ ਡਾਊਨਲੋਡ ਕਰੋ" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਤਿਆਰ ਹਨ" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਤਿਆਰ ਹਨ ਅਤੇ ਉਡੀਕ ਵਿੱਚ ਹਨ" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ ਹੈ" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u ਐਪ ਅੱਪਡੇਟ ਕੀਤੀ — ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" +msgstr[1] "%u ਐਪਾਂ ਅੱਪਡੇਟ ਕੀਤੀਆਂ — ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u ਐਪ ਅੱਪਡੇਟ ਕੀਤੀ" +msgstr[1] "%u ਐਪ ਅੱਪਡੇਟ ਕੀਤੀਆਂ" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ।" + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "ਐਪ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰੋ।" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s ਅਤੇ %s ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ।" + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u ਐਪ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।" +msgstr[1] "%u ਐਪ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s, %s ਅਤੇ %s ਸ਼ਾਮਲ ਹਨ।" + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "ਸਿਸਟਮ ਦੀ ਉਮਰ ਪੂਰੀ ਹੋਈ ਹੈ" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "ਅੱਪਗਰੇਡ ਲੈਣੇ ਜਾਰੀ ਰੱਖਣ ਲਈ ਅੱਪਗਰੇਡ ਕਰੋ" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s ਦਾ ਨਵਾਂ ਵਰਜ਼ਨ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਮੌਜੂਦ ਹੈ" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਗਰੇਡ ਮੌਜੂਦ ਹੈ" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਫੇਲ੍ਹ ਹੈ" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "ਤਿਆਰ ਕੀਤੇ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤੇ ਗਏ ਸਨ" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "ਵੇਰਵਾ ਵੇਖੋ" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "ਸਿਸਟਮ ਅੱਪਗਰੇਡ ਪੂਰਾ" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "%s %s ਵਲੋਂ ਜੀ ਆਇਆਂ ਨੂੰ!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਹੈ" +msgstr[1] "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਹਨ" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "ਇੱਕ ਜ਼ਰੂਰੀ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ।" +msgstr[1] "ਜ਼ਰੂਰੀ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹਨ।" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "ਪੜਤਾਲ" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "ਅੱਪਡੇਟ ਲਈ ਫੇਲ੍ਹ" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "ਸਿਸਟਮ ਪਹਿਲਾਂ ਹੀ ਅੱਪ ਟੂ ਡੇਟ ਹੈ।" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "ਅੱਪਡੇਟ ਰੱਦ ਕੀਤਾ ਗਿਆ ਸੀ।" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਦੀ ਲੋੜ ਸੀ, ਪਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਇੰਟਰਨੈੱਟ ਦੀ" +" ਪਹੁੰਚ ਹੈ ਅਤੇ ਮੁੜ " +"ਕੋਸ਼ਿਸ਼ ਕਰੋ।" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"ਅੱਪਡੇਟ ਨਾਲ ਸੁਰੱਖਿਆ ਮਸਲੇ ਸਨ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਆਪਣੇ ਸਾਫਟਵੇਅਰ ਪਰੋਵਾਇਡਰ ਨਾਲ ਸੰਪਰਕ ਕਰ" +"ੋ।" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਸੀ। ਕੁਝ ਥਾਂ ਖਾਲੀ ਕਰਕੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"ਸਾਨੂੰ ਅਫ਼ਸੋਸ ਹੈ: ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ। ਹੋਰ ਅੱਪਡੇਟ ਦੀ ਉਡੀਕ ਕਰੋ ਤੇ ਮੁੜ " +"ਕੋਸ਼ਿਸ਼ ਕਰੋ। ਜੇ " +"ਸਮੱਸਿਆ ਬਣੀ ਰਹਿੰਦੀ ਹੈ ਤਾਂ ਆਪਣੇ ਸਾਫਟਵੇਅਰ ਪਰੋਵਾਇਡਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "ਆਖਰੀ ਜਾਂਚ ਕੀਤੀ: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "ਰੋਕੋ" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "ਅੱਪਡੇਟਾਂ ਲਈ ਚੈੱਕ ਕਰੋ" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ਲਈ ਗੰਭੀਰ ਸਾਫ਼ਟਵੇਅਰ ਅੱਪਡੇਟ ਮਿਲਣੇ ਰੁਕ ਗਏ ਹਨ।" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "ਤੁਹਾਡੇ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਨੂੰ ਗੰਭੀਰ ਸਾਫ਼ਟਵੇਅਰ ਅੱਪਡੇਟ ਮਿਲਣੇ ਰੁਕ ਗਏ ਹਨ" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "ਖ਼ਰਚਾ ਹੋ ਸਕਦਾ ਹੈ" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"ਮੋਬਾਇਲ ਬਰਾਂਡਬੈਂਡ ਦੀ ਵਰਤੋਂ ਹੋਵੇ ਤਾਂ ਅੱਪਡੇਟ ਲਈ ਚੈੱਕ ਕਰਨ ਦੌਰਾਨ ਤੁਹਾਨੂੰ ਵਾਧੂ ਖਰਚਾ " +"ਹੋ ਸਕਦਾ ਹੈ।" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "ਕਿਵੇਂ ਵੀ ਚੈੱਕ ਕਰੋ(_A)" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਗਰੇਡ ਡਾਊਨਲੋਡ ਕੀਤਾ ਹੈ" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "ਅੱਪਗਰੇਡ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਤਿਆਰ ਹਨ" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "ਅੱਪਡੇਟ ਲਈ ਚੈੱਕ ਕਰੋ" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "ਅੱਪਡੇਟ" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "ਅੱਪਡੇਟ ਸਫ਼ਾ" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "ਅੱਪਡੇਟ ਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "ਇਸ ਨੂੰ ਕੁਝ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "ਅੱਪ ਟੂ ਡੇਟ ਹੈ" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤਣਾ ਹੈ?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"ਮੋਬਾਇਲ ਬਰਾਂਡਬੈਂਡ ਦੀ ਵਰਤੋਂ ਹੋਵੇ ਤਾਂ ਅੱਪਡੇਟ ਲਈ ਚੈੱਕ ਕਰਨ ਦੌਰਾਨ ਤੁਹਾਨੂੰ ਵਾਧੂ ਖਰਚਾ " +"ਹੋ ਸਕਦਾ ਹੈ।" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "ਕਿਵੇਂ ਵੀ ਚੈੱਕ ਕਰੋ(_C)" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "ਕੋਈ ਕਨੈਕਸ਼ਨ ਨਹੀਂ ਹੈ" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਆਨਲਾਈਨ ਜਾਓ" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ(_N)" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "ਗਲਤੀ" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "ਅੱਪਡੇਟ ਦਾ ਇੰਤਜ਼ਾਮ ਆਪਣੇ-ਆਪ ਕੀਤਾ ਜਾਂਦਾ ਹੈ" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਰੋਕੇ" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "ਅੱਗੇ ਦਿੱਤੇ ਕਾਰਨਾਂ ਕਰਕੇ ਆਪਣੇ-ਆਪ ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• ਮੌਜੂਦਾ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਮੀਟਰ ਵਾਲਾ ਹੈ" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• ਮੌਜੂਦਾ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਉੱਤੇ ਵੱਡੇ ਡਾਊਨਲੋਡਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲੱਗੀ ਹੋਈ ਹੈ" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• ਪਾਵਰ ਬੱਚਤ ਢੰਗ ਸਰਗਰਮ ਹੈ" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• ਗੇਮ ਮੋਡ ਸਰਗਰਮ ਹੈ" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟਾਂ ਉੱਤੇ ਰੋਕ ਲੱਗੀ ਹੈ" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਮੀਟਰ ਵਾਲਾ ਹੈ — ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟਾਂ ਰੋਕੇ ਗਏ" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਉੱਤੇ ਵੱਡੇ ਡਾਊਨਲੋਡਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲੱਗੀ ਹੋਈ ਹੈ — ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟਾਂ" +" ਰੋਕੇ ਗਏ" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "ਪਾਵਰ ਬੱਚਤ ਢੰਗ ਸਰਗਰਮ ਹੈ — ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟਾਂ ਰੋਕੇ ਗਏ" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "ਗੇਮ ਮੋਡ ਸਰਗਰਮ ਹੈ — ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟਾਂ ਰੋਕੇ ਗਏ" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "ਮੁੜ-ਚਾਲੂ ਅਤੇ ਅੱਪਡੇਟ ਕਰੋ(_R)…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "ਸਾਰੇ ਅੱਪਡੇਟ ਕਰੋ(_p)" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕੀਤੇ" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਤਿਆਰ ਹਨ" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "ਐਂਟੀਗਰੇਟਡ ਫਿਰਮਵੇਅਰ" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "ਐਪ ਅੱਪਡੇਟ" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "ਡਿਵਾਈਸ ਫਿਰਮਵੇਅਰ" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "ਡਾਊਨਲੋਡ ਕਰੋ(_D)" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s ਮੌਜੂਦ ਹੈ" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s ਮੌਜੂਦ ਹੈ" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "ਨਵੇਂ ਵਰਜ਼ਨ ਬਾਰੇ ਜਾਣੋ" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%2$s ਵਿੱਚੋਂ %1$s ਡਾਊਨਲੋਡ ਕੀਤਾ" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% ਡਾਊਨਲੋਡ ਕੀਤੇ" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "ਵੱਡਾ ਅੱਪਗਰੇਡ, ਨਵੇਂ ਫ਼ੀਚਰਾਂ ਅਤੇ ਕੀਤੇ ਸੁਧਾਰਾਂ ਨਾਲ।" + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "ਅੱਪਗਰੇਡ ਨੂੰ ਰੱਦ ਕਰੋ" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "ਮੁੜ-ਚਾਲੂ ਅਤੇ ਅੱਪਗਰੇਡ ਕਰੋ(_R)…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "ਅੱਪਗਰੇਡ ਕਰਨ ਪਹਿਲਾਂ ਆਪਣੇ ਡਾਟੇ ਤੇ ਫਾਇਲਾਂ ਦਾ ਬੈਕਅੱਪ ਲੈਣਾ ਯਾਦ ਰੱਖੋ।" + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "ਗਲਤੀ ਦੇ ਵੇਰਵੇ" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "ਵੇਰਵਿਆਂ ਨੂੰ ਕਾਪੀ ਕਰੋ" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "“%s” ਫ਼ਾਇਲ ਹਟਾਉਣ ਲਈ ਅਸਫ਼ਲ ਹੈ: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "ਡਾਇਰੈਕਟਰੀ “%s” ਹਟਾਉਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "ਇਹ ਕੰਪਿਊਟਰ ਉੱਤੇ ਸਾਫਟਵੇਅਰ ਸ਼ਾਮਿਲ ਕਰੋ, ਹਟਾਉ ਜਾਂ ਅੱਪਡੇਟ ਕਰੋ" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"ਅੱਪਡੇਟ;ਸਰੋਤ;ਰਿਪੋਜ਼ਟਰੀ;ਪਸੰਦ,ਇੰਸਟਾਲ;ਸਟੋਰ;ਅੱਪਗਰੇਡ;Updates;Upgrade;Sources;Reposito" +"ries;" +"Preferences;Install;Store;ਅਣਇੰਸਟਾਲ;ਅਣ-ਇੰਸਟਾਲ;ਪ੍ਰੋਗਰਾਮ;ਸਾਫਟਵੇਅਰ;ਐਪ;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s ਤਿਆਰ ਹੈ" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s ਸਮਰੱਥ ਕਰਨ ਲਈ ਤਿਆਰ ਹੈ ਅਤੇ ਅਗਲੇ ਬੂਟ ਲਈ ਤਿਆਰ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "ਸਮਰੱਥ ਕਰੋ" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "ਸਿਸਟਮ ਅੱਪਡੇਟ" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"ਆਮ ਸਿਸਟਮ ਅੱਪਡੇਟ ਹਨ, ਜਿਵੇਂ ਕਿ ਸੁਰੱਖਿਆ ਜਾਂ ਬੱਗ ਸੁਧਾਰ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਧਾਰ ਹਨ।" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "ਨਵੇਂ ਫ਼ੀਚਰਾਂ ਅਤੇ ਕੀਤੇ ਸੁਧਾਰਾਂ ਨਾਲ %s ਅੱਪਡੇਟ ਹੈ।" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS ਅੱਪਡੇਟ ਸੇਵਾ ਅੱਪਡੇਟ ਲੱਭ ਅਤੇ ਲਾਗੂ ਨਹੀਂ ਕਰ ਸਕੀ ਹੈ।" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "ਵੈੱਬ ਐਪ" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "ਵੈੱਬ ਐਪ ਸਹਿਯੋਗ" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "ਬਰਾਊਜ਼ਰ ਵਿੱਚ ਹਰਮਨਪਿਆਰੇ ਵੈੱਬ ਐਪਲੀਕੇਸ਼ਨ ਚਲਾਓ" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "ਨਵੇਂ ਨਕੋਰ ਫੀਚਰ, ਕਾਰਗੁਜ਼ਾਰੀ ਅਤੇ ਸਥਿਰਤਾ ਸੁਧਾਰਾਂ ਲਈ ਅੱਪਗਰੇਡ ਕਰੋ।" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "ਫਲੈਟਪਕ ਸਹਿਯੋਗ" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "ਫਲੈਟਪਕ (Flatpak) ਲੀਨਕਸ 'ਤੇ ਡੈਸਕਟਾਪ ਐਪ ਲਈ ਢਾਂਚਾ ਹੈ।" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "ਸਿਸਟਮ ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "ਘਰ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "ਹੋਸਟ ਸਿਸਟਮ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "/etc ਤੋਂ ਹੋਸਟ ਸਿਸਟਮ ਸੰਰਚਨਾ" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "ਡੈਸਕਟਾਪ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "ਡੈਸਕਟਾਪ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "ਦਸਤਾਵੇਜ਼ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "ਦਸਤਾਵੇਜ਼ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "ਸੰਗੀਤ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "ਸੰਗੀਤ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "ਤਸਵੀਰ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "ਤਸਵੀਰ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "ਪਬਲਿਕ ਸ਼ੇਅਰ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "ਪਬਲਿਕ ਸ਼ੇਅਰ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "ਵੀਡੀਓ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "ਵੀਡੀਓ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "ਟੈਂਪਲੇਟ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "ਟੈਂਪਲੇਟ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "ਵਰਤੋਂਕਾਰ ਕੈਸ਼ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "ਵਰਤੋਂਕਾਰ ਕੈਸ਼ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "ਵਰਤੋਂਕਾਰ ਸੰਰਚਨਾ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "ਵਰਤੋਂਕਾਰ ਸੰਰਚਨਾ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "ਵਰਤੋਂਕਾਰ ਡਾਟਾ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "ਵਰਤੋਂਕਾਰ ਡਾਟਾ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "ਵਰਤੋਂਕਾਰ ਰਨਟਾਈਮ ਫੋਲਡਰ" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "ਵਰਤੋਂਕਾਰ ਰਨਟਾਈਮ ਸਬ-ਫੋਲਡਰ %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "%s ਲਈ ਫ਼ਾਇਲ-ਸਿਸਟਮ ਪਹੁੰਚ" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "…%s ਲਈ ਫਲੈਟਪਕ ਮੇਟਾਡਾਟਾ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "‘%s’ ਐਡ-ਆਨ ਸੋਧਣ ਲਈ ਫੇਲ੍ਹ ਹੈ: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "ਵਰਤੋਂਕਾਰ ਇੰਸਟਾਲੇਸ਼ਨ" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "ਸਿਸਟਮ ਇੰਸਟਾਲੇਸ਼ਨ" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ਐਪ ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "‘%s’ ਐਡ-ਆਨ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਜੋੜਨ ਵਾਸਤੇ ਫੇਲ੍ਹ: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "‘%s’ ਐਡ-ਆਨ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਜੋੜਨ ਵਾਸਤੇ ਫੇਲ੍ਹ: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"ਰਿਮੋਟ “%s” “%s” ਦੇ ਇੰਸਟਾਲ ਦੀ ਮਨਜ਼ੂਰੀ ਨਹੀਂ ਦਿੰਦਾ ਹੈ, ਸੰਭਵ ਹੈ ਕਿ ਇਸਦੇ ਫ਼ਿਲਟਰ ਕਰਕੇ" +"।ਫ਼ਿਲਟਰ " +"ਹਟਾਓ ਅਤੇ ਇੰਸਟਾਲ ਕਰਨ ਦੀ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ। ਵੇਰਵੇ ਸਮੇਤ ਗਲਤੀ: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸਿਸਟਮ ਪਾਵਰ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸਿਸਟਮ ਪਾਵਰ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ (%u%%, %u%% ਚਾਹੀਦਾ ਹੈ)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "ਡਿਵਾਈਸ ਪਹੁੰਚ ਵਿੱਚ ਨਹੀਂ ਹੈ ਜਾਂ ਬੇਤਾਰ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਹੈ" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "ਡਿਵਾਈਸ ਦੀ ਬੈਟਰੀ ਦਾ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "ਡਿਵਾਈਸ ਦੀ ਬੈਟਰੀ ਦਾ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ (%u%%, %u%% ਚਾਹੀਦਾ ਹੈ)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "ਡਿਵਾਈਸ ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "ਡਿਵਾਈਸ ਨੂੰ ਏਸੀ ਪਾਵਰ ਨਾਲ ਕਨੈਕਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "ਡਿਵਾਈਸ ਦਾ ਕਵਰ ਬੰਦ ਹੋਣ ਦੌਰਾਨ ਇਸ ਨੂੰ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s ਡਿਵਾਈਸ ਅੱਪਡੇਟ" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s ਸਿਸਟਮ ਅੱਪਡੇਟ" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s ਇੰਬੈੱਡਡ ਕੰਟਰੋਲਰ ਅੱਪਡੇਟ" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME ਅੱਪਡੇਟ" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s ਕਾਰਪੋਰੇਟ ME ਅੱਪਡੇਟ" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s ਖਪਤਕਾਰ ME ਅੱਪਡੇਟ" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s ਕੰਟਰੋਲਰ ਅੱਪਡੇਟ" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s ਥੰਡਰਬੋਲਟ ਕੰਟਰੋਲਰ ਅੱਪਡੇਟ" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU ਮਾਈਕਰੋਕੋਡ ਅੱਪਡੇਟ" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s ਸੰਰਚਨਾ ਅੱਪਡੇਟ" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s ਬੈਟਰੀ ਅੱਪਡੇਟ" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s ਕੈਮਰਾ ਅੱਪਡੇਟ" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM ਅੱਪਡੇਟ" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s ਟੱਚਪੈਡ ਅੱਪਡੇਟ" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s ਮਾਊਸ ਅੱਪਡੇਟ" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s ਕੀਬੋਰਡ ਅੱਪਡੇਟ" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s ਸਟੋਰੇਜ਼ ਕੰਟਰੋਲਰ ਅੱਪਡੇਟ" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s ਨੈੱਟਵਰਕ ਇੰਟਰਫੇਸ ਅੱਪਡੇਟ" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s ਡਿਸਪਲੇਅ ਅੱਪਡੇਟ" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC ਅੱਪਡੇਟ" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB ਰਿਸੀਵਰ ਅੱਪਡੇਟ" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s ਡਿਵਾਈਸ ਅੱਪਡੇਟ" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s ਫ਼ਲੈਸ਼ ਡਰਾਇਵ ਡਿਵਾਈਸ ਅੱਪਡੇਟ" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD ਅੱਪਡੇਟ" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU ਅੱਪਡੇਟ" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s ਡੌਕ ਅੱਪਡੇਟ" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB ਡੌਕ ਅੱਪਡੇਟ" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "ਫਿਰਮਵੇਅਰ" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "ਫਿਰਮਵੇਅਰ ਅੱਪਡੇਟ ਲਾਗੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "ਫਿਰਮਵੇਅਰ ਅੱਪਗਰੇਡ ਸਹਿਯੋਗ" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "ਫਿਰਮਵੇਅਰ ਅੱਪਗਰੇਡ ਲਈ ਸਹਿਯੋਗ ਦਿੰਦਾ ਹੈ" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "ਗ਼ੈਰ-ਦਸਤਖਤੀ ਸਾਫਟਵੇਅਰ ਇੰਸਟਾਲ ਕਰਨਾ ਹੈ?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"ਇੰਸਟਾਲ ਕੀਤੇ ਜਾਣ ਵਾਲਾ ਸਾਫਟਵੇਅਰ ਸਾਈਨ ਨਹੀ ਕੀਤਾ ਹੈ। ਇਸ ਸਾਫਟਵੇਅਰ ਦੇ ਅੱਪਡੇਟ ਦੇ ਮੂਲ ਜ" +"ਾਂ ਕੀ " +"ਅੱਪਡੇਟ ਨਾਲ ਛੇੜਛਾੜ ਹੋਈ ਹੈ, ਦੀ ਜਾਂਚ ਕਰਨੀ ਸੰਭਵ ਨਹੀਂ ਹੈ।" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "ਬਿਨਾਂ-ਦਸਤਖਤੀ ਕੀਤੇ ਸਾਫਟਵੇਅਰ ਡਾਊਨਲੋਡ ਕਰਨੇ ਹਨ?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"ਨਾ ਸਾਈਨ ਕੀਤੇ ਅੱਪਡੇਟ ਮੌਜੂਦ ਹਨ। ਬਿਨਾਂ ਦਸਤਖ਼ਤਾਂ ਦੇ, ਅੱਪਡੇਟ ਦੇ ਮੂਲ ਦੀ ਜਾਂਚ ਜਾਂ ਇਸ " +"ਨਾਲ ਛੇੜਛਾੜ ਹੋਣ " +"ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਸੰਭਵ ਨਹੀਂ ਹੈ।" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "ਗ਼ੈਰ-ਦਸਤਖਤੀ ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਕਰਨਾ ਹੈ?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"ਨਾ ਸਾਈਨ ਕੀਤੇ ਅੱਪਡੇਟ ਮੌਜੂਦ ਹਨ। ਬਿਨਾਂ ਦਸਤਖ਼ਤਾਂ ਦੇ, ਅੱਪਡੇਟ ਦੇ ਮੂਲ ਦੀ ਜਾਂਚ ਜਾਂ ਇਸ " +"ਨਾਲ ਛੇੜਛਾੜ ਹੋਣ " +"ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਸੰਭਵ ਨਹੀਂ ਹੈ। ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟਾਂ ਨੂੰ ਨਾ-ਸਾਈਨ ਕੀਤੇ ਅੱਪਡੇਟ ਨੂੰ ਜਾਂ " +"ਹਟਾਏ ਜਾਂ ਅੱਪਡੇਟ " +"ਕੀਤੇ ਜਾਣ ਤੱਕ ਅਸਮਰੱਥ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "ਅੱਪਡੇਟਾਂ ਨੂੰ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਫ਼ੇਲ੍ਹ: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "ਪੈਕੇਜ" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "ਡਾਊਨਲੋਡ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਟਰਾਂਜ਼ੈਕਸ਼ਨ ਦੀ ਉਡੀਕ ਅਸਫ਼ਲ ਹੋਈ: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "ਅੱਪਡੇਟਾਂ ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਫ਼ੇਲ੍ਹ: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "ਸਨੈਪ ਸਟੋਰ" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "ਸਨੈਪ ਸਹਿਯੋਗ" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "ਸਨੈਪ ਯੂਨੀਵਰਸਲ ਲੀਨਕਸ ਪੈਕੇਜ ਹੈ" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "ਸਿਸਟਮ" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "ਸਿਸਟਮ ਭਾਗ" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "sysupdate ਜੌਬ '%s' ਨੂੰ ਹਟਾਉਣਾ %i ਹਾਲਤ ਵਿੱਚ ਫੇਲ੍ਹ ਹੋਇਆ" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "ਤੁਹਾਡੇ ਸਿਸਟਮ ਉੱਤੇ ਸਾਫਟਵੇਅਰ ਦੇ ਪ੍ਰਬੰਧ ਲਈ ਵਧੀਆ ਢੰਗ ਹੈ।" + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "1 ਤੋਂ %u ਲਈ ਕੋਈ ਨੰਬਰ ਦਿਓ: " + +#~ msgid "Choose an app:" +#~ msgstr "ਐਪ ਚੁਣੋ:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s ਹੁਣ ਇੰਸਟਾਲ ਹੈ" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "ਐਪ ਨੂੰ ਹਟਾਇਆ ਗਿਆ ਹੈ" +#~ msgstr[1] "ਐਪਾਂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ ਹੈ" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "“%s” ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ" + +#~| msgid "Downloading software catalog" +#~ msgid "Downloading Software Catalog" +#~ msgstr "ਸਾਫਟਵੇਅਰ ਕੈਟਾਲਾਗ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "Moderate page" +#~ msgstr "ਨਿਯਮਿਤ ਸਫ਼ਾ" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "ਨਿਯਮਿਤ ਕਰਨ ਲਈ ਕੋਈ ਸਮੀਖਿਆ ਨਹੀਂ ਹੈ" + +#~ msgid "Was this review useful to you?" +#~ msgstr "ਕੀ ਇਹ ਪੜਤਾਲ ਤੁਹਾਡੇ ਲਈ ਫਾਇਦੇਮੰਦ ਸੀ?" + +#~ msgid "Yes" +#~ msgstr "ਹਾਂ" + +#~ msgid "No" +#~ msgstr "ਨਹੀਂ" + +#~ msgid "Meh" +#~ msgstr "ਮੀਹ" + +#~ msgid "Outdated SDK version" +#~ msgstr "ਪੁਰਾਣਾ SDK ਵਰਜ਼ਨ" + +#~ msgid "Unable to install updates" +#~ msgstr "ਅੱਪਡੇਟਾਂ ਨੂੰ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#~| msgid "Unable to install %s: authentication was invalid" +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "ਅਣ-ਇੰਸਾਟਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣੀਕਰਨ ਅਵੈਧ" + +#~ msgid "Network Settings" +#~ msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਅੱਪਡੇਟ ਮੌਜੂਦ ਨਹੀਂ ਹਨ" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "ਜ਼ਰੂਰੀ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹਨ।" + +#~ msgid "No Network" +#~ msgstr "ਨੈੱਟਵਰਕ ਨਹੀਂ" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਇੰਟਰਨੈੱਟ ਦੀ ਲੋੜ ਹੈ।" + +#~ msgid "Network _Settings" +#~ msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ(_S)" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "ਸਾਫ਼ਟਵੇਅਰ ਅੱਪਗਰੇਡਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ ਅਤੇ ਇੰਸਟਾਲ ਹੋਣ ਲਈ ਤਿਆਰ ਹਨ।" + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "ਸਾਫ਼ਟਵੇਅਰ ਅੱਪਡੇਟਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ ਅਤੇ ਇੰਸਟਾਲ ਹੋਣ ਲਈ ਤਿਆਰ ਹਨ।" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "…ਅੱਪਗਰੇਡ ਜਾਣਕਾਰੀ ਡਾਊਨਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "ਆਪਣੇ-ਆਪ ਅੱਪਡੇਟ ਵਿਰਾਮ ਕੀਤੇ" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "ਮੌਜੂਦਾ ਨੈੱਟਵਰਕ ਮੀਟਰ ਵਾਲਾ ਹੈ, ਇਸਕਰਕੇ ਕਨੈਕਸ਼ਨ ਲਈ ਡਾਟਾ ਹੱਦ ਹੋ ਸਕਦੀ ਹੈ ਜਾਂ ਉਹਨਾਂ ਨਾਲ ਖ਼ਰਚੇ ਹੋ " +#~ "ਸਕਦੇ ਹਨ। ਡਾਟਾ ਬਚਾਉਣ ਲਈ ਆਟੋਮੈਟਿਕ ਅੱਪਡੇਟਾਂ ਨੂੰ ਰੋਕ ਦਿੱਤਾ ਗਿਆ ਹੈ।\n" +#~ "\n" +#~ "ਜੇ ਨੈੱਟਵਰਕ ਨੂੰ ਗਲਤੀ ਨਾਲ ਮੀਟਰ ਵਾਲੇ ਵਜੋਂ ਪਛਾਣਿਆ ਗਿਆ ਹੈ ਤਾਂ ਇਸ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#~ msgid "Open Network _Settings" +#~ msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ(_S)" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "ਖਰਚਿਆਂ ਅਤੇ ਨੈੱਟਵਰਕ ਪਾਬੰਦੀਆਂ ਤੋਂ ਬਚਣ ਲਈ, ਸਾਫ਼ਟਵੇਅਰ ਅੱਪਡੇਟ ਮੋਬਾਇਲ ਜਾਂ ਮੀਟਰ ਵਾਲੇ ਕਨੈਕਸ਼ਨਾਂ ਉੱਤੇ " +#~ "ਆਟੋਮੈਟਿਕ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੇ ਜਾਣਗੇ।" + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "ਜਦੋਂ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਸਾਫ਼ਟਵੇਅਰ ਅੱਪਡੇਟਾਂ ਨੂੰ ਬੈਕਗਰਾਊਂਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਅਤੇ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "ਸਿਰਫ਼ ਮੁਫ਼਼ਤ ਐਪਾਂ ਹੀ ਦਿਖਾਓ(_F)" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "ਸਿਰਫ਼ ਮੁਕਤ ਲਸੰਸ ਵਾਲੀਆਂ ਐਪਾਂ ਹੀ ਵੇਖਓ ਅਤੇ ਕੋਈ ਵੀ ਪ੍ਰੋਪੇਟਰੀ ਐਪਾਂ ਨੂੰ ਲੁਕਾਓ" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "ਇਸ ਐਪ ਬਾਰੇ ਤੁਹਾਨੂੰ ਕੀ ਚੰਗਾ ਲੱਗਾ? ਤੁਹਾਡੀ ਪੜਤਾਲ ਲਈ ਕਾਰਨਾਂ ਦੇ ਨਾਲ ਤੁਹਾਡੀ ਫ਼ੀਡਬੈਕ ਹੋਰਾਂ ਲਈ " +#~ "ਮਦਦਗਾਰ ਸਾਬਤ ਹੁੰਦੀ ਹੈ।" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਦੀ ਲੋੜ ਸੀ, ਪਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਅਢੁੱਕਵੀਂ ਹੈ" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਤੁਹਾਨੂੰ ਸਾਫਟਵੇਅਰ ਇੰਸਟਾਲ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਸੀ" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਅਯੋਗ ਸੀ" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਤੁਹਾਨੂੰ ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr " ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਤੁਹਾਨੂੰ ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: AC ਪਾਵਰ ਚਾਹੀਦੀ ਹੈ" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "%s ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਦੀ ਲੋੜ ਸੀ, ਪਰ ਉਪਲਬਧ ਨਹੀਂ ਸੀ" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "%s ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਤੁਹਾਨੂੰ ਅੱਪਗਰੇਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "%s ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਸੀ" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਗ਼ਲਤ ਸੀ" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਤੁਹਾਨੂੰ ਸਾਫਟਵੇਅਰ ਹਟਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ: AC ਪਾਵਰ ਚਾਹੀਦੀ ਹੈ" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "ਫਾਇਲ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਫ਼ਲ: ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#~ msgid "Failed to install: not supported" +#~ msgstr "ਫਾਇਲ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਫ਼ਲ: ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#~ msgid "AC power is required" +#~ msgstr "AC ਊਰਜਾ ਦੀ ਲੋੜ ਹੈ" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "ਮੀਟਰ ਵਾਲਾ ਕਨੈਕਸ਼ਨ - ਆਪਣੇ-ਆਪ ਅੱਪਡੇਟ ਵਿਰਾਮ ਕੀਤੇ" + +#~ msgid "Find Out _More" +#~ msgstr "ਹੋਰ ਲੱਭੋ(_M)" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "ਖਾਸ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਤਿਆਰ ਹੈ।" + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "ਖ਼ਾਸ: ਨਾਜ਼ੁਕ ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਉਡੀਕ ਕਰ ਰਹੇ ਹਨ।" + +#~| msgid "No update description available." +#~ msgid "Loading update description, please wait…" +#~ msgstr "ਅੱਪਡੇਟ ਵਰਣਨ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ, ਉਡੀਕੋ…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "ਆਖਰੀ ਵਾਰ ਸਿਸਟਮ ਦੇ ਆਨਲਾਈਨ ਹੋਣ ਅਤੇ ਕਿਸੇ ਵੀ ਅੱਪਡੇਟ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਦਾ ਸਮਾਂ" + +#~ msgid "Show verbose debugging information" +#~ msgstr "ਵੇਰਵੇ ਸਮੇਤ ਡੀਬੱਗ ਜਾਣਕਾਰੀ ਵੇਖਾਓ" + +#~ msgid "An application" +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "ਚੁਣੇ ਐਡ-ਆਨ ਨੂੰ ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਨਾਲ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#~| msgid "An application" +#~ msgid "Applications" +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨਾਂ" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "ਕੀ ਤੁਸੀਂ %s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ ਅਤੇ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਵਰਤਣ ਲਈ ਫੇਰ ਇੰਸਟਾਲ ਕਰਨਾ ਪਵੇਗਾ।" + +#~ msgid "_Continue" +#~ msgstr "ਜਾਰੀ ਰੱਖੋ(_C)" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u ਐਪਲੀਕੇਸ਼ਨ" +#~ msgstr[1] "%u ਐਪਲੀਕੇਸ਼ਨਾਂ" + +#~ msgid "Post Review" +#~ msgstr "ਪੜਤਾਲ ਨੂੰ ਭੇਜੋ" + +#~ msgid "_Post" +#~ msgstr "ਭੇਜੋ(_P)" + +#~ msgid "Rating" +#~ msgstr "ਰੇਟਿੰਗ" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "ਆਪਣੀ ਪੜਤਾਲ ਬਾਰੇ ਸੰਖੇਪ ਜਾਣਕਾਰੀ ਦਿਓ, ਜਿਵੇਂ ਕਿ: “ਵਧੀਆ ਐਪ, ਸਿਫ਼ਾਰਸ਼ ਕਰਦੇ ਹਾਂ“।" + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "ਪੜਤਾਲ" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "ਐਪ ਬਾਰੇ ਤੁਸੀਂ ਕੀ ਸੋਚਦੇ ਹੋ? ਆਪਣੇ ਪੱਖ ਬਾਰੇ ਕੁਝ ਕਾਰਨ ਦਿਉ।" + +#~ msgid "No screenshot provided" +#~ msgstr "ਕੋਈ ਸਕਰੀਨਸ਼ਾਟ ਨਹੀਂ ਗਿਆ" + +#, c-format +#~| msgid "“%s”" +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "ਹੁਣੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ" + +#~ msgid "Primary Menu" +#~ msgstr "ਪ੍ਰਾਇਮਰੀ ਮੇਨੂ" + +#~| msgid "Updates" +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "ਅੱਪਡੇਟ" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s ਹੁਣ ਸਹਾਇਕ ਨਹੀਂ ਰਿਹਾ ਹੈ।" + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "ਇਸ ਦਾ ਅਰਥ ਹੈ ਕਿ ਇਹ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਨਹੀਂ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ।" + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਕਿ ਤੁਸੀਂ ਹੋਰ ਨਵੇਂ ਵਰਜ਼ਨ ਲਈ ਅੱਪਗਰੇਡ ਕਰੋ।" + +#~ msgid "Update All" +#~ msgstr "ਸਾਰੇ ਅੱਪਡੇਟ" + +#~ msgid "Application Updates" +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਅੱਪਡੇਟ" + +#~ msgid "Downloading featured images…" +#~ msgstr "…ਫੀਚਰ ਈਮੇਜ਼ ਡਾਊਨਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ" + +#~| msgid "GNOME Software" +#~ msgid "GNOME Web" +#~ msgstr "ਗਨੋਮ ਵੈੱਬ" + +#~ msgid "Application manager for GNOME" +#~ msgstr "ਗਨੋਮ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਮੈਨੇਜਰ" + +#~ msgid "A list of popular applications" +#~ msgstr "ਹਰਮਨਪਿਆਰੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੀ ਸੂਚੀ" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "ਸਿਸਟਮ ਵਲੋਂ ਨਿਰਧਾਰਿਤ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਨ ਵਾਲੀਆਂ ਦੀ ਸੂਚੀ ਹੈ।" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "ਗ਼ੈਰ-ਆਜ਼ਾਦ ਸਾਫ਼ਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀਆਂ ਨੂੰ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਪੁੱਛੋ" + +#~ msgid "Select All" +#~ msgstr "ਸਭ ਚੁਣੋ" + +#~ msgid "Select None" +#~ msgstr "ਕੋਈ ਨਾ ਚੁਣੋ" + +#, c-format +#~ msgid "Featured %s" +#~ msgstr "%s ਫ਼ੀਚਰ" + +#~ msgid "Name" +#~ msgstr "ਨਾਂ" + +#~ msgid "Show" +#~ msgstr "ਵੇਖਾਓ" + +#~ msgid "Subcategories filter menu" +#~ msgstr "ਅਧੀਨ-ਵਰਗ ਫਿਲਟਰ ਮੇਨੂ" + +#~ msgid "Sort" +#~ msgstr "ਲੜੀਬੱਧ" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "ਅਧੀਨ-ਵਰਗ ਲੜੀਬੱਧ ਮੇਨੂ" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "ਵਿਸ਼ੇਸ਼ਤਾ" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "ਵਿਸ਼ੇਸ਼ਤਾ" + +#~ msgid "Audio & Video" +#~ msgstr "ਆਡੀਓ ਤੇ ਵੀਡੀਓ" + +#~ msgid "Developer Tools" +#~ msgstr "ਡਿਵੈਲਪਰ ਟੂਲ" + +#~ msgid "Education & Science" +#~ msgstr "ਸਿੱਖਿਆ ਤੇ ਵਿਗਿਆਨ" + +#~ msgid "Games" +#~ msgstr "ਗੇਮਾਂ" + +#~ msgid "Graphics & Photography" +#~ msgstr "ਗਰਾਫਿਕਸ ਤੇ ਫੋਟੋਗਰਾਫ਼ੀ" + +#~ msgid "Productivity" +#~ msgstr "ਉਤਪਾਦਨ" + +#~ msgid "Communication & News" +#~ msgstr "ਸੰਚਾਰ ਤੇ ਖ਼ਬਰਾਂ" + +#~ msgid "Utilities" +#~ msgstr "ਸਹੂਲਤਾਂ" + +#~ msgid "_Read More" +#~ msgstr "ਵੱਧ ਪੜ੍ਹੋ(_R)" + +#~ msgid "_Read Less" +#~ msgstr "ਘੱਟ ਪੜ੍ਹੋ(_R)" + +#~ msgid "_Launch" +#~ msgstr "ਚਲਾਓ(_L)" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "ਪਤਾ ਲਗਾਉਣ ਲਈ ਅਸਫ਼ਲ ਕਿ ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਸਿਸਟਮ ਦੇ ਕਿਹੜਾ ਹਿੱਸਿਆਂ ਲਈ ਪਹੁੰਚ ਕਰੇਗੀ। ਇਹ ਅਕਸਰ " +#~ "ਪੁਰਾਣੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨਾਲ ਹੁੰਦਾ ਹੈ।" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "ਕਦੇ ਨਹੀਂ" + +#~| msgid "Low" +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "ਘੱਟ" + +#~| msgid "Medium" +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "ਮੱਧਮ" + +#~| msgid "High" +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "ਵੱਧ" + +#~| msgid "Unknown" +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "ਅਣਪਛਾਤੀ" + +#~ msgid "Loading…" +#~ msgstr "...ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "Public domain" +#~ msgstr "ਪਬਲਿਕ ਡੋਮੇਨ" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "ਵਰਤੋਂਕਾਰ ਲਈ ਅੱਗੇ ਦਿੱਤੇ ਲਸੰਸ ਦੀ ਬੰਦਿਸ਼ ਹੈ:" +#~ msgstr[1] "ਵਰਤੋਂਕਾਰ ਲਈ ਅੱਗੇ ਦਿੱਤੇ ਲਸੰਸਾਂ ਦੀ ਬੰਦਿਸ਼ ਹੈ:" + +#~ msgid "_Add shortcut" +#~ msgstr "ਸ਼ਾਰਟਕੱਟ ਜੋੜੋ(_A)" + +#~ msgid "Re_move shortcut" +#~ msgstr "ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਹਟਾਓ(_m)" + +#~ msgid "Localized in your Language" +#~ msgstr "ਤੁਹਾਡੀ ਭਾਸ਼ਾ ਵਿੱਚ ਉਲੱਥਾ ਕੀਤਾ" + +#~ msgid "Release Activity" +#~ msgstr "ਰੀਲਿਜ਼ ਸਰਗਰਮੀ" + +#~ msgid "Sandboxed" +#~ msgstr "ਸੈਂਡਬਾਕਸ" + +#~ msgid "Channel" +#~ msgstr "ਚੈਨਲ" + +#~ msgid "Category" +#~ msgstr "ਕੈਟਾਗਰੀ" + +#~ msgid "Free" +#~ msgstr "ਮੁਕਤ" + +#~| msgid "Unknown" +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "ਅਣਪਛਾਤਾ" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "ਇਸ ਦਾ ਭਾਵ ਹੈ ਕਿ ਮੁਕਤ ਸਾਫਟਵੇਅਰ ਨੂੰ ਖੁੱਲ੍ਹੇ ਤੌਰ ਉੱਤੇ ਚਲਾਇਆ, ਕਾਪੀ ਕੀਤਾ, ਵੰਡਿਆ, ਸਮਝਿਆ ਅਤੇ " +#~ "ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#~ msgid "Proprietary Software" +#~ msgstr "ਪਰੋਪ੍ਰੈਟਰੀ ਸਾਫਟਵੇਅਰ" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "ਇਸ ਦਾ ਭਾਵ ਹੈ ਕਿ ਸਾਫਟਵੇਅਰ ਦੀ ਮਲਕੀਅਤ ਕਿਸੇ ਵਿਅਕਤੀ ਜਾਂ ਕੰਪਨੀ ਕੋਲ ਹੈ। ਅਕਸਰ ਇਸ ਦੀ ਵਰਤੋਂ " +#~ "ਲਈ ਪਾਬੰਦੀਆਂ ਹੁੰਦੀਆਂ ਹਨ ਅਤੇ ਇਸ ਦੇ ਸਰੋਤ ਕੋਡ ਲਈ ਆਮ ਤੌਰ 'ਤੇ ਪਹੁੰਚ ਨਹੀਂ ਹੁੰਦੀ ਹੈ।" + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "ਇਸ ਸਾਫਟਵੇਅਰ ਦੀਆਂ ਲਸੰਸ ਸ਼ਰਤਾਂ ਅਣਪਛਾਤੀਆਂ ਹਨ।" + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਇਸ ਢੰਗ ਨਾਲ ਰੇਟ ਕੀਤਾ ਗਿਆ ਹੈ, ਕਿਉਂਕਿ ਇਸ ਦੇ ਫ਼ੀਚਰ ਹਨ:" + +#~ msgid "No details were available for this rating." +#~ msgstr "ਇਸ ਰੇਟਿੰਗ ਲਈ ਕੋਈ ਵੇਰਵੇ ਨਹੀਂ ਉਪਲਬਧ ਹਨ।" + +#~ msgid "Welcome" +#~ msgstr "ਜੀ ਆਇਆਂ ਨੂੰ" + +#~ msgid "Welcome to Software" +#~ msgstr "ਸਾਫਟਵੇਅਰ ਉੱਤੇ ਜੀ ਆਇਆਂ ਨੂੰ" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "ਸਾਫਟਵੇਅਰ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਲੋੜ ਮੁਤਾਬਕ ਸਭ ਸਾਫਟਵੇਅਰ ਇੱਕ ਹੀ ਥਾਂ ਤੋਂ ਇੰਸਟਾਲ ਕਰਨ ਦਿੰਦਾ ਹੈ। ਸਾਡੀਆਂ " +#~ "ਸਿਫਾਰਸ਼ਾਂ ਵੇਖੋ, ਕੈਟਾਗਰੀਆਂ ਦੀ ਝਲਕ ਵੇਖੋ ਜਾਂ ਤੁਹਾਡੇ ਵਲੋਂ ਚਾਹੀਦੀਆਂ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਖੋਜ ਕਰੋ।" + +#~ msgid "_Browse Software" +#~ msgstr "ਸਾਫਟਵੇਅਰਾਂ ਦੀ ਝਲਕ ਵੇਖੋ(_B)" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "ਅਣ-ਇੰਸਟਾਲ ਹੈ" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "ਇੰਸਟਾਲ ਹੈ" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "ਅੱਪਡੇਟ ਕੀਤਾ" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "ਅਣਪਛਾਤਾ" + +#~ msgid "History" +#~ msgstr "ਅਤੀਤ" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "ਸਾਫਟਵੇਅਰ ਕੈਟਾਲਾਗ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "user" +#~ msgstr "ਵਰਤੋਂਕਾਰ" + +#~ msgid "Branch" +#~ msgstr "ਬਰਾਂਚ" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Version" +#~ msgstr "ਵਰਜ਼ਨ" + +#~ msgid "More…" +#~ msgstr "…ਹੋਰ" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਆਡੀਓ ਤੇ ਵੀਡੀਓ ਐਪਲੀਕੇਸ਼ਨਾਂ" + +#~ msgid "Recommended Games" +#~ msgstr "ਸਿਫਾਰਸ਼ੀ ਖੇਡਾਂ" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "ਸਿਫਾਰਸ਼ੀ ਗਰਾਫਿਕਸ ਐਪਲੀਕੇਸ਼ਨ" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਉਤਪਾਦਨ ਐਪਲੀਕੇਸ਼ਨ" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "ਇਹ ਸਾਫਟਵੇਅਰਾਂ ਵਿੱਚੋਂ ਕੁਝ ਨਿੱਜੀ ਮਲਕੀਅਤ ਵਾਲੇ ਹਨ ਅਤੇ ਇਸਕਰਕੇ ਵਰਤਣ, ਸਾਂਝਾ ਕਰਨਾ ਅਤੇ ਸਰੋਤ ਕੋਡ " +#~ "ਲਈ ਪਹੁੰਚ ਉੇੱਤੇ ਪਾਬੰਦੀਆਂ ਲੱਗੀਆਂ ਹਨ।" + +#~ msgid "Find out more…" +#~ msgstr "…ਹੋਰ ਲੱਭੋ" + +#~ msgid "Editor’s Picks" +#~ msgstr "ਐਡੀਟਰ ਦੀ ਚੋਣ" + +#~ msgid "Recent Releases" +#~ msgstr "ਤਾਜ਼ਾ ਰੀਲਿਜ਼" + +#, c-format +#~ msgid "Remove “%s”?" +#~ msgstr "“%s” ਨੂੰ ਹਟਾਉਣਾ ਹੈ?" + +#, c-format +#~ msgid "Disable “%s”?" +#~ msgstr "“%s” ਨੂੰ ਅਸਮਰੱਥ ਕਰਨਾ ਹੈ?" + +#~ msgid "No Additional Repositories" +#~ msgstr "ਕੋਈ ਹੋਰ ਰਿਪੋਜ਼ਟਰੀਆਂ ਨਹੀਂ" + +#~ msgid "_Remove…" +#~ msgstr "…ਹਟਾਓ(_R)" + +#~ msgid "_Disable…" +#~ msgstr "ਅਸਮਰੱਥ ਕਰੋ(_D)…" + +#~ msgid "Disabling" +#~ msgstr "ਅਸਮਰੱਥ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "Enabled" +#~ msgstr "ਸਮਰੱਥ ਹੈ" + +#~ msgid "Disabled" +#~ msgstr "ਅਸਮਰੱਥ ਹੈ" + +#~ msgid "ratings in total" +#~ msgstr "ਕੁੱਲ ਰੇਟਿੰਗਾਂ 'ਚ" + +#~ msgid "_Remove All" +#~ msgstr "ਸਭ ਹਟਾਓ(_R)" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "ਇਸ ਸਿਸਟਮ ਉੱਤੇ ਕੋਈ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ।" + +#~ msgid "Looking for new updates…" +#~ msgstr "...ਨਵੇਂ ਅੱਪਡੇਟ ਲਈ ਚੈੱਕ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "Setting up updates…" +#~ msgstr "...ਅੱਪਡੇਟ ਸੈੱਟ ਅੱਪ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ" + +#~ msgid "Checking…" +#~ msgstr "…ਚੈੱਕ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "Software is up to date" +#~ msgstr "ਸਭ ਸਾਫਟਵੇਅਰ ਅੱਪ ਟੂ ਡੇਟ ਹਨ" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "ਕੰਪਿਊਟਰ ਦੇ ਮੁੜ-ਚਾਲੂ ਹੋਣ ਸਮੇਂ ਅੱਪਡੇਟਾਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#, c-format +#~ msgid "Waiting to Download %s %s" +#~ msgstr "%s %s ਡਾਊਨਲੋਡ ਹੋਣ ਦੀ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#, c-format +#~ msgid "Downloading %s %s" +#~ msgstr "%s %s ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "OS Updates" +#~ msgstr "ਓ.ਸਿ. ਅੱਪਡੇਟ" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "ਕਾਰਗੁਜ਼ਾਰੀ, ਸਥਿਰਤਾ ਅਤੇ ਸੁਰੱਖਿਆ ਸੁਧਾਰ ਸ਼ਾਮਲ ਹਨ।" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Failed to copy" +#~ msgstr "ਕਾਪੀ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ" + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "…ਫਿਰਮਵੇਅਰ ਅੱਪਡੇਟ ਦਸਤਖ਼ਤ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "…ਫਿਰਮਵੇਅਰ ਅੱਪਡੇਟ ਮੇਟਾਡਾਟਾ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "Downloading application ratings…" +#~ msgstr "…ਐਪਲੀਕੇਸ਼ਨ ਰੇਟਿੰਗ ਡਾਊਨਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੀ ਵਰਤੋਂਕਾਰ ਪੜਤਾਲਾਂ ਦੇਣ ਵਾਲੀ ਸੇਵਾ ਹੈ" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "ਅਸੁਰੱਖਿਅਤ ਹਾਲਤਾਂ 'ਚ ਕਾਰਟੂਨ ਕਰੈਟਰ" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "ਲੜਾਕੇ ਟਾਕਰਿਆਂ ਵਿੱਚ ਕਾਰਟੂਨ ਕਰੈਟਰ" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "ਕਾਰਟੂਨ ਕਰੈਟਰ ਦੇ ਨਾਲ ਗਰਾਫਿਕ ਤਸ਼ਦੱਦ" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "ਅਸੁਰੱਖਿਅਤ ਹਾਲਤਾਂ ਵਿੱਚ ਅਸਲੀਅਤ ਤੋਂ ਸੌਖੀ ਤਰ੍ਹਾਂ ਪਛਾਣੇ ਜਾਣ ਵਾਲੇ ਚਿੰਨ੍ਹ" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "ਹਮਲਾਵਰ ਟਕਰਾ ਵਿੱਚ ਅਸਲੀਅਤ ਤੋਂ ਸੌਖੀ ਤਰ੍ਹਾਂ ਪਛਾਣੇ ਜਾਣ ਵਾਲੇ ਚਿੰਨ੍ਹ" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "ਅਸਲੀਅਤ ਤੋਂ ਸੌਖੀ ਤਰ੍ਹਾਂ ਪਛਾਣੇ ਜਾਣ ਵਾਲਾ ਚਿੱਤਰਨ ਕੀਤਾ ਤਸ਼ਦੱਦ" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "ਅਸੁਰੱਖਿਅਤ ਹਾਲਤਾਂ 'ਚ ਨਰਮ ਰੁਖ ਵਾਲਾ ਯਥਾਰਥਿਕ ਚਿੰਨ੍ਹ" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "ਲੜਾਕੇ ਟਾਕਰਿਆਂ ਵਿੱਚ ਅਸਲੀ ਚਿੰਨ੍ਹਾਂ ਦਾ ਚਿੱਤਰਨ" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "ਯਥਾਰਥਿਕ ਕਰੈਟਰ ਦੇ ਨਾਲ ਗਰਾਫਿਕ ਤਸ਼ਦੱਦ" + +#~ msgid "No bloodshed" +#~ msgstr "ਕੋਈ ਖ਼ੂਨ-ਖ਼ਰਾਬਾ ਨਹੀਂ" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "ਕਾਲਪਨਿਕ ਖ਼ੂਨ-ਖ਼ਰਾਬਾ" + +#~ msgid "Realistic bloodshed" +#~ msgstr "ਅਸਲੀ ਖ਼ੂਨ-ਖ਼ਰਾਬਾ" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "ਖ਼ੂਨ-ਖ਼ਰਾਬੇ ਦਾ ਵਰਣਨ ਅਤੇ ਸਰੀਰਿਕ ਅੰਗਾਂ ਦੀ ਕੱਟ-ਵੱਢ" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "ਜਬਰ-ਜ਼ਿਨਾਹ ਜਾਂ ਹੋਰ ਧੱਕੇ ਵਾਲਾ ਜਿਨਸੀ ਰਵੱਈਆ" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "ਸ਼ਰਾਬੀ ਖਾਣ-ਪੀਣ ਲਈ ਹਵਾਲੇ" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "ਸ਼ਰਾਬੀ ਖਾਣ-ਪੀਣ ਦੀ ਵਰਤੋਂ" + +#~ msgid "References to illicit drugs" +#~ msgstr "ਵਰਜਿਤ ਦਵਾਈਆਂ (ਨਸ਼ਿਆਂ) ਲਈ ਹਵਾਲੇ" + +#~ msgid "Use of illicit drugs" +#~ msgstr "ਵਰਜਿਤ ਦਵਾਈਆਂ (ਨਸ਼ਿਆਂ) ਦੀ ਵਰਤੋਂ" + +#~ msgid "References to tobacco products" +#~ msgstr "ਤਮਾਕੂ ਉਤਪਾਦਾਂ ਲਈ ਹਵਾਲੇ" + +#~ msgid "Use of tobacco products" +#~ msgstr "ਤਮਾਕੂ ਉਤਪਾਦਾਂ ਦੀ ਵਰਤੋਂ" + +#~ msgid "Brief artistic nudity" +#~ msgstr "ਸੰਖੇਪ ਕਲਕਾਰੀ ਨੰਗੇਜ਼" + +#~ msgid "Prolonged nudity" +#~ msgstr "ਲੰਮੇ ਸਮੇਂ ਲਈ ਨੰਗੇਜ਼" + +#~ msgid "Provocative references or depictions" +#~ msgstr "ਭੜਕਾਊ ਹਵਾਲੇ ਜਾਂ ਵਰਣਨ" + +#~ msgid "Sexual references or depictions" +#~ msgstr "ਜਿਨਸੀ ਹਵਾਲੇ ਜਾਂ ਵਰਣਨ" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "ਗਰਾਫ਼ਿਕ ਜਿਨਸੀ ਰਵੱਈਆ" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "ਹਲਕੀ ਜਾਂ ਕਦੇ ਕਦਾਈ ਬੇਅਦਬੀ ਦੀ ਵਰਤੋਂ" + +#~ msgid "Moderate use of profanity" +#~ msgstr "ਬੇਅਦਬੀ ਦੀ ਠੀਕ-ਠਾਕ ਵਰਤੋਂ" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "ਬੇਅਦਬੀ ਦੀ ਜ਼ੋਰਦਾਰ ਜਾਂ ਅਕਸਰ ਵਰਤੋਂ" + +#~ msgid "Slapstick humor" +#~ msgstr "ਮਸ਼ਕਰੀਆ ਮਜ਼ਾਕ" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "ਘਟੀਆ ਜਾਂ ਬਾਥਰੂਮ ਮਜ਼ਾਕ" + +#~ msgid "Mature or sexual humor" +#~ msgstr "ਪ੍ਰੋੜ੍ਹ ਜਾਂ ਜਿਨਸੀ ਮਜ਼ਾਕ" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "ਖਾਸ ਕਿਸਮ ਦੇ ਲੋਕਾਂ ਦੇ ਖਿਲਾਫ਼ ਨਿਖੇਧੀ" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "ਜ਼ਜ਼ਬਾਤੀ ਨੁਕਸਾਨ ਕਰਨ ਲਈ ਤਿਆਰ ਕੀਤਾ ਪੱਖਪਾਤ" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "ਲਿੰਗ, ਜਿਨਸ, ਨਸਲ ਜਾਂ ਧਰਮ 'ਤੇ ਅਧਾਰਿਤ ਸਾਫ਼ ਸਾਫ਼ ਪੱਖਪਾਤ" + +#~ msgid "Product placement" +#~ msgstr "ਉਤਪਾਦ ਸਥਾਪਨਾ" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "ਖਾਸ ਬਰੈਂਡਾਂ ਜਾਂ ਟਰੇਡਮਾਰਕ ਉਤਪਾਦਾਂ ਲਈ ਅਲਹਿਦਾ ਹਵਾਲੇ" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਖਾਸ ਅਸਲ ਸੰਸਾਰ ਦੀਆਂ ਚੀਜ਼ਾਂ ਖਰੀਦਣ ਲਈ ਉਤਸ਼ਾਹਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "ਟੋਕਨ ਜਾਂ ਕਰੈਡਿਟ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਰਲਵੇਂ ਈਵੈਂਟਾਂ ਲਈ ਜੂਆ ਖੇਡਣਾ" + +#~ msgid "Gambling using “play” money" +#~ msgstr "\"ਪਲੇਅ\" ਧਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਜੂਆ ਖੇਡਣਾ" + +#~ msgid "Gambling using real money" +#~ msgstr "ਅਸਲੀ ਧਨ ਦੀ ਵਰਤੋਂਂ ਨਾਲ ਜੂਆ ਖੇਡਣਾ" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਅਸਲ ਧਨ ਦਾਨ ਕਰਨ ਲਈ ਉਤਸ਼ਾਹਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "ਐਪ ਵਿੱਚ ਅਸਲ ਧਨ ਖ਼ਰਚ ਕਰਨ ਦੀ ਸਮਰੱਥਾ" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "ਗੱਲਬਾਤ ਸਹੂਲਤ ਦੇ ਬਿਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਦਾ ਆਪਸ 'ਚ ਤਾਲਮੇਲ" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "ਵਰਤੋਂਕਾਰਾਂ ਵਿਚਾਲੇ ਸੰਜਮੀ ਗੱਲਬਾਤ ਸਹੂਲਤ" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "ਵਰਤੋਂਕਾਰਾਂ 'ਚ ਬਿਨਾਂ-ਕੰਟਰੋਲ ਆਡੀਓ ਜਾਂ ਵੀਡੀਓ ਗੱਲਬਾਤ ਸਹੂਲਤ" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "ਸਮਾਜਿਕ ਨੈੱਟਵਰਕ ਵਰਤੋਂਕਾਰ ਜਾਂ ਈਮੇਲ ਸਿਰਨਾਵੇਂ ਸਾਂਝੇ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ" + +#~ msgid "Checking for the latest application version" +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਨਵੇਂ ਵਰਜ਼ਨ ਲਈ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "ਜਾਂਚ-ਪੜਤਾਲ ਡਾਟਾ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ, ਜੋ ਕਿ ਹੋਰਾਂ ਨੂੰ ਵਰਤੋਂਕਾਰ ਦੀ ਪਛਾਣ ਨਹੀਂ ਕਰਨ " +#~ "ਦਿੰਦਾ ਹੈ" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "ਜਾਣਕਾਰੀ ਸਾਂਝੀ ਕਰਨੀ, ਜਿਸ ਨਾਲ ਹੋਰ ਵਰਤੋਂਕਾਰ ਦੀ ਪਛਾਣ ਕਰਦੇ ਹਨ" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਨਾਲ ਭੂਗੋਲਿਕ ਟਿਕਾਣਾ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "ਸਮਲਿੰਗ ਕਾਮੁਕਤਾ ਲਈ ਅਸਿੱਧੇ ਹਵਾਲੇ" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "ਇੱਕੋ ਲਿੰਗ ਦੇ ਲੋਕਾਂ ਵਿਚਾਲੇ ਚੁੰਮਣ" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "ਇੱਕੋ ਲਿੰਗ ਦੇ ਲੋਕਾਂ ਵਿਚਾਲੇ ਜਿਨਸੀ ਸੰਬੰਧਾਂ ਦਾ ਚਿੱਤਰਨ" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "ਕੰਜਰਪੁਣੇ ਲਈ ਅਸਿੱਧੇ ਹਵਾਲੇ" + +#~ msgid "Direct references to prostitution" +#~ msgstr "ਕੰਜਰਪੁਣੇ ਲਈ ਸਿੱਧੇ ਹਵਾਲੇ" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "ਕੰਜਰਪੁਣੇ ਦੇ ਕੰਮ ਲਈ ਚਿੱਤਰਨ" + +#~ msgid "Indirect references to adultery" +#~ msgstr "ਬਦਕਾਰੀ ਲਈ ਅਸਿੱਧੇ ਹਵਾਲੇ" + +#~ msgid "Direct references to adultery" +#~ msgstr "ਬਦਕਾਰੀ ਲਈ ਸਿੱਧੇ ਹਵਾਲੇ" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "ਬਦਕਾਰੀ ਦੇ ਕੰਮ ਲਈ ਚਿੱਤਰਨ" + +#~ msgid "Scantily clad human characters" +#~ msgstr "ਟਾਵੇਂ-ਟਾਵੇਂ ਕੱਪੜੇ ਪਾਏ ਹੋਏ ਮਨੁੱਖੀ ਪਾਤਰ" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "ਪ੍ਰਤੱਖ ਜਿਨਸੀ ਸੰਬੰਧਾਂ ਵਿੱਚ ਰੁਝੇ ਮਨੁੱਖੀ ਪਾਤਰ" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "ਇਤਿਹਾਸਿਕ ਬੇਹੁਰਮਤੀ ਲਈ ਚਿੱਤਰਨ ਜਾਂ ਹਵਾਲੇ" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "ਅੱਜ ਦੀ ਮਨੁੱਖੀ ਬੇਅਦਬੀ ਦਾ ਚਿੱਤਰਨ" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "ਅੱਜ ਦੀ ਬੇਅਦਬੀ ਦਾ ਚਿੱਤਰ ਰੂਪੀ ਵਰਣਨ" + +#~ msgid "Visible dead human remains" +#~ msgstr "ਮਰੇ ਹੋਏ ਮਨੁੱਖੀ ਬਚੇ ਹੋਏ ਸਰੀਰਿਕ ਹਿੱਸੇ" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "ਮਰੇ ਹੋਏ ਮਨੁੱਖ ਦੇ ਸਰੀਰਿਕ ਹਿੱਸੇ, ਜੋ ਕਿ ਤੱਤਾਂ ਦੇ ਸਾਹਮਣੇ ਨੰਗੇ ਸਨ" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "ਮਨੁੱਖੀ ਸਰੀਰ ਦੇ ਹਿੱਸਿਆਂ ਦੀ ਬੇਅਦਬੀ ਦਾ ਚਿੱਤਰਾਂ ਦੇ ਰੂਪ ਵਿੱਚ ਵਰਣਨ" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "ਇਤਿਹਾਸਕ ਗ਼ੁਲਾਮੀ ਲਈ ਚਿੱਤਰਨ ਜਾਂ ਹਵਾਲੇ" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "ਅੱਜ ਦੀ ਗ਼ੁਲਾਮੀ ਲਈ ਚਿੱਤਰਨ" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "ਅੱਜ ਦੀ ਗ਼ੁਲਾਮੀ ਲਈ ਚਿੱਤਰਾਂ ਦੇ ਰੂਪ ਵਿੱਚ ਵਰਣਨ" + +#~ msgid "General" +#~ msgstr "ਆਮ" + +#~ msgid "ALL" +#~ msgstr "ਸਭ" + +#~ msgid "Mature" +#~ msgstr "ਪ੍ਰੋੜ੍ਹ" + +#~ msgid "Teen" +#~ msgstr "ਅੱਲੜ੍ਹ" + +#~ msgid "Everyone 10+" +#~ msgstr "ਹਰੇਕ 10+" + +#~ msgid "Everyone" +#~ msgstr "ਹਰੇਕ" + +#~ msgid "Early Childhood" +#~ msgstr "ਮੁੱਢਲਾ ਬਚਪਨ" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "ਅਣਜਾਣ" + +#~| msgid "Recent Releases" +#~ msgid "Released" +#~ msgstr "ਰੀਲਿਜ਼ ਹੈ" + +#~ msgid "Format" +#~ msgstr "ਫਾਰਮੈਟ" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "ਕੱਲ੍ਹ, :%l∶%M %p" + +#~ msgid "Three days ago" +#~ msgstr "ਤਿੰਨ ਦਿਨ ਪਹਿਲਾਂ" + +#~ msgid "Four days ago" +#~ msgstr "ਚਾਰ ਦਿਨ ਪਹਿਲਾਂ" + +#~ msgid "Five days ago" +#~ msgstr "ਪੰਜ ਦਿਨ ਪਹਿਲਾਂ" + +#~ msgid "Six days ago" +#~ msgstr "ਛੇ ਦਿਨ ਪਹਿਲਾਂ" + +#~ msgid "Two weeks ago" +#~ msgstr "ਦੋ ਹਫ਼ਤੇ ਪਹਿਲਾਂ" + +#~ msgid "Show the folder management UI" +#~ msgstr "ਫੋਲਡਰ ਪਰਬੰਧ UI ਦਿਖਾਓ" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "ਗਨੋਮ ਸ਼ੈੱਲ ਇਕਸਟੈਨਸ਼ਨਾਂ ਰਿਪੋਜ਼ਟਰੀ ਸਮਰੱਥ ਕਰੋ" + +#~ msgid "Folder Name" +#~ msgstr "ਫੋਲਡਰ ਨਾਂ" + +#~ msgid "_Add" +#~ msgstr "ਸ਼ਾਮਲ(_A)" + +#~ msgid "Add to Application Folder" +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਫੋਲਡਰ ਵਿੱਚ ਜੋੜੋ" + +#~ msgid "About %s" +#~ msgstr "%s ਬਾਰੇ" + +#~ msgid "Top Rated" +#~ msgstr "ਚੋਟੀ ਦਾ ਦਰਜਾ" + +#~ msgid "Extension Settings" +#~ msgstr "ਇਕਸਟੈਨਸ਼ਨ ਦੀਆਂ ਸੈਟਿੰਗਾਂ" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "ਇਕਸਟੈਨਸ਼ਨਾਂ ਨੂੰ ਆਪਣੀ ਜ਼ੁੰਮੇਵਾਰੀ 'ਤੇ ਵਰਤੋਂ। ਜੇ ਤੁਹਾਨੂੰ ਕੋਈ ਸਿਸਟਮ ਸਮੱਸਿਆਵਾਂ ਆਈਆਂ ਹਨ ਤਾਂ ਉਹਨਾਂ ਨੂੰ " +#~ "ਅਸਮਰੱਥ ਕਰਨ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।" + +#~| msgid "Failed to load image" +#~ msgid "Failed to load components" +#~ msgstr "ਭਾਗ ਲੋਡ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS ਵੈਧਤਾ ਠੀਕ ਹੈ!" + +#~ msgid "Failed to load file" +#~ msgstr "ਫਾਇਲ ਲੋਡ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ" + +#~ msgid "Unsaved changes" +#~ msgstr "ਨਾ-ਸੰਭਾਲੀਆਂ ਤਬਦੀਲੀਆਂ" + +#~ msgid "The application list is already loaded." +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਸੂਚੀ ਪਹਿਲਾਂ ਹੀ ਲੋਡ ਕੀਤੀ ਹੈ।" + +#~ msgid "Merge documents" +#~ msgstr "ਦਸਤਾਵੇਜ਼ਾਂ ਨੂੰ ਮਿਲਾਓ" + +#~ msgid "Throw away changes" +#~ msgstr "ਤਬਦੀਲੀਆਂ ਨੂੰ ਛੱਡੋ" + +#~ msgid "Open AppStream File" +#~ msgstr "ਐਪਸਟਰੀਮ ਫਾਇਲ ਨੂੰ ਖੋਲ੍ਹੋ" + +#~| msgid "Open AppStream File" +#~ msgid "Save AppStream File" +#~ msgstr "ਐਪਸਟਰੀਮ ਫਾਇਲ ਨੂੰ ਸੰਭਾਲੋ" + +#~ msgid "_Save" +#~ msgstr "ਸੰਭਾਲੋ(_S)" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s ਬੈਨਰ ਡਿਜ਼ਾਇਨ ਹਟਾਇਆ।" + +#~ msgid "Banner design deleted." +#~ msgstr "ਬੈਨਰ ਡਿਜ਼ਾਇਨ ਹਟਾਇਆ।" + +#~ msgid "The application list has unsaved changes." +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਸੂਚੀ ਵਿੱਚ ਨਾ-ਸੰਭਾਲੀਆਂ ਤਬਦੀਲੀਆਂ ਹਨ।" + +#~ msgid "Use verbose logging" +#~ msgstr "ਵੇਰਵੇ ਸਮੇਤ ਲਾਗ ਵਰਤੋਂ" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਬੈਨਰ ਡਿਜ਼ਾਇਨਰ" + +#~ msgid "No Designs" +#~ msgstr "ਕੋਈ ਡਿਜਾਇਨ ਨਹੀਂ" + +#~ msgid "Error message here" +#~ msgstr "ਇੱਥੇ ਗਲਤੀ ਸੁਨੇਹੇ" + +#~ msgid "Category Featured" +#~ msgstr "ਕੈਟਾਗਰੀ ਵਿਸ਼ੇਸ਼ਤਾ" + +#~ msgid "Undo" +#~ msgstr "ਵਾਪਸ" + +#~ msgid "Banner Designer" +#~ msgstr "ਬੈਨਰ ਡਿਜ਼ਾਇਨਰ" + +#~ msgid "New Banner" +#~ msgstr "ਨਵਾਂ ਬੈਨਰ" + +#~ msgid "Import from file" +#~ msgstr "ਫਾਇਲ ਤੋਂ ਇੰਪੋਰਟ ਕਰੋ" + +#~ msgid "Export to file" +#~ msgstr "ਫਾਇਲ ਲਈ ਐਕਸਪੋਰਟ ਕਰੋ" + +#~ msgid "this website" +#~ msgstr "ਇਹ ਵੈੱਬਸਾਈਟ" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "ਆਓ ਖਰੀਦਦਾਰੀ ਕਰੀਏ(_L)" + +#~ msgid "Spacing" +#~ msgstr "ਫਾਸਲਾ" + +#~ msgid "The amount of space between children" +#~ msgstr "ਚੈਲਡਰਨ ਵਿਚਾਲੇ ਕਿੰਨਾ ਫਾਸਲਾ ਹੈ" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "ਹਟਾਇਆ" + +#~ msgid "Click on items to select them" +#~ msgstr "ਆਈਟਮਾਂ ਨੂੰ ਚੁਣਨ ਲਈ ਉਹਨਾਂ ਉੱਤੇ ਕਲਿੱਕ ਕਰੋ" + +#~ msgid "Select" +#~ msgstr "ਚੁਣੋ" + +#~ msgid "_Add to Folder…" +#~ msgstr "...ਫੋਲਡਰ ਵਿੱਚ ਜੋੜੋ(_A)" + +#~ msgid "_Move to Folder…" +#~ msgstr "...ਫੋਲਡਰ ਵਿੱਚ ਭੇਜੋ(_M)" + +#~ msgid "_Remove from Folder" +#~ msgstr "ਫੋਲਡਰ ਤੋਂ ਹਟਾਓ(_R)" + +#~| msgid "Featured Application" +#~ msgid "Featured Applications" +#~ msgstr "ਖਾਸ ਐਪਲੀਕੇਸ਼ਨ" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "ਕੀ ਤੁਸੀਂ %s ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "ਨਵੀਆਂ ਪਲੱਗਇਨਾਂ ਵਰਤਣ ਲਈ ਇਸ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।" + +#~ msgid "Security Updates Pending" +#~ msgstr "ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਬਾਕੀ ਹਨ" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਕਿ ਤੁਸੀਂ ਖਾਸ ਅੱਪਡੇਟਾਂ ਨੂੰ ਹੁਣੇ ਇੰਸਟਾਲ ਕਰੋ" + +#~ msgid "Restart & Install" +#~ msgstr "ਮੁੜ-ਚਾਲੂ ਤੇ ਇੰਸਟਾਲ ਕਰੋ" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "ਖਾਸ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਅਤੇ ਐਪਲੀਕੇਸ਼ਨ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਉਪਲਬਧ ਹਨ" + +#~ msgid "View" +#~ msgstr "ਵੇਖੋ" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਲਈ ਖਾਸ ਬੈਨਰਾਂ ਲਈ ਡਿਜ਼ਾਇਨ" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "ਐਪਸਟਰੀਮ;ਸਾਫਟਵੇਅਰ;ਐਪ;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "ਸ਼ੈੱਲ ਇਕਸਟੈਨਸ਼ਨਾਂ" + +#~ msgid "%s ME" +#~ msgstr "%s ME" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "ਗਨੋਮ ਸ਼ੈੱਲ ਇਕਸਟੈਨਸ਼ਨਾਂ ਰਿਪੋਜ਼ਟਰੀ" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "…ਸ਼ੈਲ ਇਕਸਟੈਨਸ਼ਨ ਮੇਟਾਡਾਟਾ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~| msgctxt "Menu of Add-ons" +#~| msgid "Shell Extensions" +#~ msgid "GNOME Shell Extension" +#~ msgstr "ਗਨੋਮ ਸ਼ੈੱਲ ਇਕਸਟੈਨਸ਼ਨਾਂ" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "ਸਭ(_A)" + +#~ msgid "Show profiling information for the service" +#~ msgstr "ਸੇਵਾ ਲਈ ਪ੍ਰੋਫਾਇਲ ਜਾਣਕਾਰੀ ਵੇਖਾਓ" + +#~ msgid "To continue you need to sign in." +#~ msgstr "ਜਾਰੀ ਰੱਖਣ ਲਈ ਤੁਹਾਨੂੰ ਸਾਇਨ ਇਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "ਜਾਰੀ ਰੱਖਣ ਲਈ ਤੁਹਾਨੂੰ %s ਵਿੱਚ ਸਾਇਨ ਇਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।" + +#~ msgid "Email address" +#~ msgstr "ਈਮੇਲ ਪਤਾ" + +#~ msgid "I have an account already" +#~ msgstr "ਮੇਰੇ ਕੋਲ ਪਹਿਲਾਂ ਹੀ ਖਾਤਾ ਹੈ" + +#~ msgid "I want to register for an account now" +#~ msgstr "ਮੈਂ ਹੁਣੇ ਖਾਤੇ ਲਈ ਰਜਿਸਟਰ ਕਰਨਾ ਚਾਹੁੰਦਾ/ਚਾਹੁੰਦੀ ਹਾਂ" + +#~ msgid "Sign in automatically next time" +#~ msgstr "ਅਗਲੀ ਵਾਰ ਮੈਨੂੰ ਆਪਣੇ-ਆਪ ਸਾਇਨ ਇਨ ਕਰੋ" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "ਦੋ-ਪੜ੍ਹਾਵੀਂ ਪਰਮਾਣਕਿਤਾ ਲਈ ਆਪਣਾ ਇੱਕ ਵਾਰ ਵਾਲਾ ਪਿੰਨ ਦਿਓ।" + +#~ msgid "PIN" +#~ msgstr "ਪਿੰਨ" + +#~ msgid "Authenticate" +#~ msgstr "ਪਰਮਾਣਿਤ" + +#~ msgid "Continue" +#~ msgstr "ਜਾਰੀ ਰੱਖੋ" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "ਸਾਫਟਵੇਅਰ ਕੈਟਾਲਾਗ ਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#~ msgid "_About" +#~ msgstr "ਇਸ ਬਾਰੇ(_A)" + +#~ msgid "_Quit" +#~ msgstr "ਬੰਦ ਕਰੋ(_Q)" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s ਨੂੰ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ ਅਤੇ ਤੁਹਾਡੇ ਕੋਲੋ %s ਵਸੂਲੇ ਜਾਣਗੇ।" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "%s ਦੇ ਨਾਲ ਨਾਲ ਚੋਣਵਾਂ ਬਾਰੇ ਵੀ ਜਾਣਕਾਰੀ ਦਿਓ, ਜਿਸ ਨਾਲ ਇਹ ਫਾਰਮੈਟ ਨੂੰ ਚਲਾਉਣ ਵਾਲੇ ਕੋਡਕ " +#~ "ਵੈੱਬਸਾਈਟ ਉੱਤੇ ਲੱਭਿਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "%s %f" +#~ msgstr "%s %f" + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "ਇਹ ਹੱਲ਼ ਹੋਣ ਤੱਕ ਸਾਫਟਵੇਅਰ ਇੰਸਟਾਲ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ।" + +#~ msgid "For more information, visit %s." +#~ msgstr "ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ %s ਨੂੰ ਖੋਲ੍ਹੋ।" + +#~ msgid "Unable to update %s from %s" +#~ msgstr "%2$s ਤੋਂ %1$s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#~ msgid "Downloading new updates…" +#~ msgstr "…ਨਵੇਂ ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ" + +#~ msgid "Restart & _Install" +#~ msgstr "ਮੁੜ-ਚਾਲੂ ਤੇ ਇੰਸਟਾਲ ਕਰੋ(_I)" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Getting runtime source…" +#~ msgstr "…ਰਨਟਾਈਮ ਸਰੋਤ ਲਏ ਜਾ ਰਹੇ ਹਨ" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "ਲੀਮਬਾ ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਸੌਖੀ ਤਰ੍ਹਾਂ ਸਾਫਟਵੇਅਰ ਬੰਡਲ ਬਣਾਉਣ ਦਾ ਢੰਗ ਦਿੰਦਾ ਹੈ" + +#~ msgid "Downloading application page…" +#~ msgstr "…ਐਪਲੀਕੇਸ਼ਨ ਸਫ਼ੇ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "ਵਾਲਵ ਲਈ ਸਿਰੇ ਦਾ ਮਨੋਰੰਜਨ ਪਲੇਟਫਾਰਮ ਹੈ" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "ਵਾਧੂ ਸਰੋਤਾਂ ਦੀ ਸੂਚੀ, ਜਿਹਨਾਂ ਨੂੰ ਪਹਿਲਾਂ ਸਮਰੱਥ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ" + +#~ msgid "Show non-free software in search results" +#~ msgstr "ਖੋਜ ਨਤੀਜਿਆਂ 'ਚ ਗ਼ੈਰ-ਆਜ਼ਾਦ ਸਾਫ਼ਟਵੇਅਰ ਵੇਖੋ" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "ਗ਼ੈਰ-ਆਜ਼ਾਦ ਸਰੋਤਾਂ ਦੀ ਸੂਿਚੀ, ਜਿਸ ਨੂੰ ਚੋਣਵੇਂ ਰੂਪ 'ਚ ਸਮਰੱਥ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "ਪਰੋਪਰੈਟਰੀ ਸਾਫਟਵੇਅਰ ਸਰੋਤ ਸਮਰੱਥ ਕਰਨੇ ਹਨ?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "ਕੋਈ ਐਪਲੀਕੇਸ਼ਨਾਂ ਜਾਂ ਐਡ-ਆਨ ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ; ਹੋਰ ਸਾਫਟਵੇਅਰ ਹਾਲੇ ਵੀ" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "ਅਕਸਰ ਵਰਤਣ ਅਤੇ ਸਰੋਤ ਕੋਡ ਲਈ ਪਹੁੰਚ ਵਾਸਤੇ ਪਾਬੰਦੀਆਂ ਹੁੰਦੀਆਂ ਹਨ।" + +#~ msgid "Proprietary Software Sources" +#~ msgstr "ਪਰੋਪਰੈਟਰੀ ਸਾਫਟਵੇਅਰ ਸਰੋਤ" + +#~ msgid "Remove Source" +#~ msgstr "ਸਰੋਤ ਹਟਾਓ" + +#~| msgid "" +#~| "Adding this software source will give you access to additional software " +#~| "and upgrades." +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "ਸਾਫ਼ਟਵੇਅਰ ਸਰੋਤਾਂ ਨੂੰ ਇੰਟਰਨੈੱਟ ਤੋਂ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਇਸ ਨਾਲ ਤੁਹਾਨੂੰ ਹੋਰ ਸਾਫ਼ਟਵੇਅਰਾਂ ਲਈ " +#~ "ਪਹੁੰਚ ਮਿਲਦੀ ਹੈ, ਜਿਹਨਾਂ ਨੂੰ %s ਵਲੋਂ ਨਹੀਂ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।" + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "ਸਰੋਤ ਨੂੰ ਹਟਾਉਣ ਨਾਲ ਤੁਹਾਡੇ ਵਲੋਂ ਉਸ ਸਰੋਤ ਕੋਂ ਇੰਸਟਾਲ ਕੀਤੇ ਕਿਸੇ ਵੀ ਸਾਫਟਵੇਅਰ ਨੂੰ ਵੀ ਹਟਾਇਆ " +#~ "ਜਾਵੇਗਾ।" + +#~ msgid "No software installed from this source" +#~ msgstr "ਇਸ ਸਰੋਤ ਤੋਂ ਕੋਈ ਸਾਫਟਵੇਅਰ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ" + +#~ msgid "Installed from this Source" +#~ msgstr "ਇਹ ਸਰੋਤ ਤੋਂ ਇੰਸਟਾਲ ਹੈ" + +#~ msgid "Last Checked" +#~ msgstr "ਆਖਰੀ ਵਾਰ ਕੀਤੀ ਜਾਂਚ" + +#~ msgid "Added" +#~ msgstr "ਸ਼ਾਮਲ ਕੀਤੇ" + +#~ msgid "Website" +#~ msgstr "ਵੈੱਬਸਾਈਟ" + +#~ msgid "page1" +#~ msgstr "ਸਫ਼ਾ1" + +#~ msgid "page2" +#~ msgstr "ਸਫ਼ਾ2" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "ਖਾਸ" + +#~| msgid "_All" +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~| msgid "Featured" +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#~| msgid "All" +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~| msgid "Featured" +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#~| msgid "_All" +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~| msgid "Featured" +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#~| msgid "_All" +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~| msgid "Featured" +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#~| msgid "_All" +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~| msgid "Featured" +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#~| msgid "_All" +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#~| msgid "Featured" +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#~ msgid "3rd party" +#~ msgstr "3ਜੀ ਧਿਰ" + +#~ msgid "nonfree" +#~ msgstr "ਗ਼ੈਰ-ਮੁਕਤ" + +#~ msgid "shell extension" +#~ msgstr "ਸ਼ੈੱਲ ਦੀ ਇਕਸਟੈਨਸ਼ਨ" + +#~ msgid "Total" +#~ msgstr "ਕੁੱਲ" + +#~ msgid "_Installing" +#~ msgstr "ਇੰਸਟਾਲ ਕਰਨਾ ਜਾਰੀ(_I)" + +#~ msgid "_Removing" +#~ msgstr "ਹਟਾਉਣਾ ਜਾਰੀ(_R)" + +#~ msgid " or " +#~ msgstr " ਜਾਂ " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "ਅਣਜਾਣ" + +#~ msgid "non-free" +#~ msgstr "ਗ਼ੈਰ-ਮੁਕਤ" + +#~| msgid "OS Updates" +#~ msgid "Other Updates" +#~ msgstr "ਹੋਰ ਅੱਪਡੇਟ" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "ਸਾਫਟਵੇਅਰ ਸਰੋਤ ਤੁਹਾਨੂੰ ਵਾਧੂ ਸਾਫਟਵੇਅਰ ਦਿੰਦਾ ਹੈ।" + +#~ msgid "One Star" +#~ msgstr "ਇੱਕ ਤਾਰਾ" + +#~ msgid "Two Stars" +#~ msgstr "ਦੋ ਤਾਰੇ" + +#~ msgid "Three Stars" +#~ msgstr "ਤਿੰਨ ਤਾਰੇ" + +#~ msgid "Four Stars" +#~ msgstr "ਚਾਰ ਤਾਰੇ" + +#~ msgid "Five Stars" +#~ msgstr "ਪੰਜ ਤਾਰੇ" + +#~ msgid "Installation of %s failed." +#~ msgstr "%s ਦੀ ਇੰਸਟਾਲੇਸ਼ਨ ਫੇਲ੍ਹ ਹੈ।" + +#~ msgid "Removal of %s failed." +#~ msgstr "%s ਹਟਾਉਣ ਲਈ ਫੇਲ੍ਹ ਹੈ।" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#~| msgctxt "menu category" +#~| msgid "None" +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "ਕੋਈ ਨਹੀਂ" + +#, fuzzy +#~| msgid "_All" +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#, fuzzy +#~| msgid "Featured" +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#, fuzzy +#~| msgid "_All" +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "ਸਭ" + +#, fuzzy +#~| msgid "Featured" +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "ਫੀਚਰ" + +#, fuzzy +#~| msgctxt "Menu subcategory of Education" +#~| msgid "Astronomy" +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "ਭਵਿੱਖਬਾਣੀ" + +#, fuzzy +#~| msgctxt "Menu subcategory of Education" +#~| msgid "Chemistry" +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "ਰਸਾਇਣ-ਵਿਗਿਆਨ" + +#, fuzzy +#~| msgctxt "Menu subcategory of Education" +#~| msgid "Math" +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "ਗਣਿਤ" + +#~ msgid "A previous update was unfinished." +#~ msgstr "ਪਿਛਲਾ ਅੱਪਡੇਟ ਅਧੂਰਾ ਪਿਆ ਹੈ।" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "ਅੱਪਡੇਟ ਠੀਕ ਤਰ੍ਹਾਂ ਸਾਇਨ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "ਆਫਲਾਈਨ ਅੱਪਡੇਟ ਦੀ ਮੰਗ ਕੀਤੀ ਗਈ ਸੀ, ਪਰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਕੋਈ ਪੈਕੇਜ ਨਹੀਂ ਚਾਹੀਦੀ ਹੈ।" + +#~ msgid "No space was left on the drive." +#~ msgstr "ਜੰਤਰ ਉੱਤੇ ਕੋਈ ਥਾਂ ਨਹੀਂ ਬਾਕੀ ਬਚੀ।" + +#~ msgid "An update failed to install correctly." +#~ msgstr "ਅੱਪਡੇਟ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ।" + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "ਆਫਲਾਈਨ ਅੱਪਡੇਟ ਅਣਜਾਣੇ ਢੰਗ ਨਾਲ ਫੇਲ੍ਹ ਹੋਇਆ।" + +#~| msgid "Calculating…" +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "...ਗਿਣਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#~| msgid "Unknown" +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "ਅਣਜਾਣ" + +#~ msgid "Internet Only Application" +#~ msgstr "ਕੇਵਲ ਇੰਟਰਨੈੱਟ ਐਪਲੀਕੇਸ਼ਨ ਹੀ" + +#~ msgid "_History" +#~ msgstr "ਅਤੀਤ(_H)" + +#~ msgid "Size" +#~ msgstr "ਸਾਈਜ਼" + +#~ msgid "Recommended Office Applications" +#~ msgstr "ਸਿਫਾਰਸ਼ੀ ਦਫ਼ਤਰੀ ਐਪਲੀਕੇਸ਼ਨ" + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i ਐਪਲੀਕੇਸ਼ਨ ਤੇ %i ਐਡ-ਆਨ ਇੰਸਟਾਲ ਹਨ" +#~ msgstr[1] "%i ਐਪਲੀਕੇਸ਼ਨ ਤੇ %i ਐਡ-ਆਨ ਇੰਸਟਾਲ ਹਨ" + +#~ msgid "No AppStream data found" +#~ msgstr "ਕੋਈ ਐਪਸਟਰੀਮ ਡਾਟਾ ਨਹੀਂ ਲੱਭਿਆ" + +#~ msgid "Audio" +#~ msgstr "ਆਡੀਓ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "ਡਾਟਾਬੇਸ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "ਡਿਸਕ ਲਿਖਣੀ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "ਹਮ ਰੇਡੀਓ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "ਮਿਕਸਰ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "ਸੰਗੀਤ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "ਰਿਕਾਰਡਰ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "ਸੀਕਵਅੰਸਰ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "ਟਿਊਨਰ" + +#~| msgctxt "Menu subcategory of Development" +#~| msgid "Building" +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "ਬਿਲਡਿੰਗ" + +#~| msgctxt "Menu subcategory of Audio" +#~| msgid "Databases" +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "ਡਾਟਾਬੇਸ" + +#~| msgctxt "Menu subcategory of Development" +#~| msgid "IDE" +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~| msgctxt "Menu subcategory of Development" +#~| msgid "Profiling" +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "ਪਰੋਫਾਇਲਿੰਗ" + +#~| msgctxt "Menu subcategory of Development" +#~| msgid "Web Development" +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "ਵੈੱਬ ਡਿਵੈਲਪਮੈਂਟ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "ਬਾਇਓਲੋਜੀ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "ਕੰਪਿਊਟਰ ਵਿਗਿਆਨ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "ਡਾਟਾ ਚਿਤਰਨ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "ਅਰਥਚਾਰਾ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "ਬਿਜਲੀ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "ਇਲੈਕਟਰੋਨਿਕਸ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "ਇੰਜਨੀਅਰਗ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "ਭੂ-ਵਿਗਿਆਨ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "ਜਿਓਸਾਇੰਸ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "ਅਤੀਤ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "ਚਿੱਤਰ ਕਾਰਵਾਈ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "ਫੀਚਰ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "ਨਕਸ਼ੇ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "ਸੰਗੀਤ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "ਅੰਕੜੇ ਪੜਤਾਲ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "ਸਮਾਂਤਰ ਕੰਪਿਊਟਿੰਗ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "ਭੌਤਿਕ-ਵਿਗਿਆਨ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "ਰੂਹਾਨੀਅਤ" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "ਸ਼ੂਟਰ" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "ਸਿਮੂਲੇਸ਼ਨ" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "ਖੇਡਾਂ" + +#~ msgid "Graphics" +#~ msgstr "ਗਰਾਫਿਕਸ" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D ਗ੍ਰਾਫਿਕਸ" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "ਗਰਾਫਿਕਸ" + +#~ msgid "Internet" +#~ msgstr "ਇੰਟਰਨੈੱਟ" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "Dialup" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "ਡਾਇਲਅੱਪ" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "Email" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "ਈ-ਮੇਲ" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "Feed" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "ਫੀਡ" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "File Transfer" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "ਫਾਇਲ ਟਰਾਂਸਫਰ" + +#~| msgctxt "Menu subcategory of Audio" +#~| msgid "Ham Radio" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "ਹਮ ਰੇਡੀਓ" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "Instant Messaging" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "ਝੱਟਪਟ ਸੁਨੇਹੇ" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "IRC Clients" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC ਕਲਾਂਇਟ" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "Monitor" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "ਮਾਨੀਟਰ" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "P2P" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~| msgctxt "Menu subcategory of Network" +#~| msgid "Telephony" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "ਟੈਲੀਫੋਨੀ" + +#~| msgctxt "Menu subcategory of Development" +#~| msgid "Web Development" +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "ਵੈੱਬ ਡਿਵੈਲਪਮੈਂਟ" + +#~ msgid "Office" +#~ msgstr "ਆਫਿਸ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "ਚਾਰਟ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "ਸੰਪਰਕ ਪ੍ਰਬੰਧ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "ਡਿਕਸ਼ਨਰੀ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "ਈ-ਮੇਲ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "ਫਲੋਅ ਚਾਰਟ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "ਫੋਟੋਗਰਾਫ਼ੀ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "ਪ੍ਰੋਜੈਕਟ ਪ੍ਰਬੰਧ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "ਪਰਕਾਸ਼ਨ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "ਸਪਰੈਡਸ਼ੀਟ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "ਦਰਸ਼ਕ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "ਕਲਾ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "ਨਕਲੀ ਮੁਹਾਰਤ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "ਭਵਿੱਖਬਾਣੀ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "ਜੀਵ-ਵਿਗਿਆਨ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "ਰਸਾਇਣ-ਵਿਗਿਆਨ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "ਕੰਪਿਊਟਰ ਵਿਗਿਆਨ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "ਨਿਰਮਾਣ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "ਡਾਟਾ ਚਿਤਰਨ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "ਅਰਥਚਾਰਾ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "ਬਿਜਲੀ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "ਇਲੈਕਟਰੋਨਿਕਸ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "ਇੰਜਨੀਅਰਗ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "ਭੂਗੋਲ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "ਭੂ-ਵਿਗਿਆਨ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "ਜਿਓਸਾਇੰਸ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "ਇਤਿਹਾਸ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "ਹਿਊਮੈਨਾਟਿਸ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "ਚਿੱਤਰ ਕਾਰਵਾਈ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "ਭਾਸ਼ਾਵਾਂ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "ਸਾਹਿਤ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "ਨਕਸ਼ੇ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "ਗਣਿਤ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "ਮੈਡੀਕਲ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "ਅੰਕੜੇ ਪੜਤਾਲ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "ਸਮਾਂਤਰ ਕੰਪਿਊਟਿੰਗ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "ਭੌਤਿਕ-ਵਿਗਿਆਨ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "ਰੋਬੋਟ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "ਰੂਹਾਨੀਅਤ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "ਖੇਡਾਂ" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "ਈਮੂਲੇਟਰ" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "ਫਾਇਲ ਮੈਨੇਜਰ" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "ਫਾਇਲ ਟੂਲ" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "ਮਾਨੀਟਰ" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "ਸੁਰੱਖਿਆ" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "ਟਰਮੀਨਲ ਸਮਰੂਪ" + +#~| msgctxt "Menu subcategory of Utility" +#~| msgid "Accessibility" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "ਅਸੈੱਸਬਿਲਟੀ" + +#~| msgctxt "Menu subcategory of Utility" +#~| msgid "Archiving" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "ਅਕਾਇਵ" + +#~| msgctxt "Menu subcategory of Utility" +#~| msgid "Calculator" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "ਕੈਲਕੂਲੇਟਰ" + +#~| msgctxt "Menu subcategory of Utility" +#~| msgid "Clock" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "ਘੜੀ" + +#~| msgctxt "Menu subcategory of Utility" +#~| msgid "Compression" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "ਨਪੀੜਨ" + +#~| msgctxt "Menu subcategory of System" +#~| msgid "File Tools" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "ਫਾਇਲ ਟੂਲ" + +#~| msgctxt "Menu subcategory of Education" +#~| msgid "Maps" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "ਨਕਸ਼ੇ" + +#~| msgctxt "Menu subcategory of Education" +#~| msgid "Spirituality" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "ਰੂਹਾਨੀਅਤ" + +#~| msgctxt "Menu subcategory of Utility" +#~| msgid "Telephony Tools" +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "ਟੈਲੀਫੋਨੀ ਟੂਲ" + +#~ msgid "Video" +#~ msgstr "ਵਿਡੀਓ" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "ਸੰਪਾਦਨ" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "ਡਾਟਾਬੇਸ" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "ਡਿਸਕ ਲਿਖਣੀ" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "ਰਿਕਾਰਡਰ" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "ਟੀਵੀ" + +#~ msgid "Picks" +#~ msgstr "ਚੁਣੋ" + +#~ msgid "January 30, 2014" +#~ msgstr "ਜਨਵਰੀ 30, 2014" + +#~ msgid "Set the specified debugging level" +#~ msgstr "ਤਹਿ-ਸ਼ੁਦਾ ਡੀਬੱਗ ਲੈਵਲ ਦਿਓ" + +#~ msgid "_Pending" +#~ msgstr "ਬਾਕੀ ਹੈ(_P)" + +#~ msgid "Complicated!" +#~ msgstr "ਗੁੰਝਲਦਾਰ!" + +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "ਡਾਟਾਬੇਸ" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "ਹਮ ਰੇਡੀਓ" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "ਵੈੱਬ ਡਿਵੈਲਪਮੈਂਟ" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "ਫਾਇਲ ਟੂਲ" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "ਨਕਸ਼ੇ" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "ਰੂਹਾਨੀਅਤ" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "ਫੋਂਟ" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "ਕੋਡਕ" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "ਇੰਪੁੱਟ ਸਰੋਤ" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "ਭਾਸ਼ਾ ਪੈਕ" + +#~ msgid "New" +#~ msgstr "ਨਵਾਂ" + +#~ msgid "Popular" +#~ msgstr "ਹਰਮਨਪਿਆਰੇ" + +#~ msgid "Waiting for package manager..." +#~ msgstr "...ਪੈਕੇਜ ਮੈਨੇਜਰ ਲਈ ਉਡੀਕ ਜਾਰੀ" + +#~ msgid "Querying..." +#~ msgstr "...ਜਾਣਕਾਰੀ ਲਈ ਜਾ ਰਹੀ ਹੈ" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..e1b7070 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,6446 @@ +# Polish translation for gnome-software. +# Copyright © 2012-2025 the gnome-software authors. +# This file is distributed under the same license as the gnome-software package. +# Piotr Drąg , 2012-2025. +# Aviary.pl , 2012-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-28 13:49+0000\n" +"PO-Revision-Date: 2025-03-02 13:42+0100\n" +"Last-Translator: Piotr Drąg \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Oprogramowanie" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instalowanie i aktualizowanie programów" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Menedżer oprogramowania umożliwia wyszukiwanie i instalowanie nowych " +"programów i rozszerzeń systemu oraz usuwanie już zainstalowanych programów." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Menedżer oprogramowania prezentuje polecane i popularne programy " +"z przydatnymi opisami i wieloma zrzutami ekranu. Programy mogą być " +"wyszukiwane lub przeglądane według kategorii. Możliwe jest także " +"aktualizowanie systemu za pomocą funkcji aktualizacji w trybie offline." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panel przeglądu" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panel informacji o programie" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panel zainstalowanych programów" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel aktualizacji" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Informacje o aktualizacji" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Projekt GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Testowanie klucza akmod w UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Wymagane jest uwierzytelnienie, aby przetestować klucz akmod w UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Zapisanie klucza akmod w UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Wymagane jest uwierzytelnienie, aby zapisać klucz akmod w UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Testowanie klucza DKMS w UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" +"Wymagane jest uwierzytelnienie, aby przetestować klucz DKMS w UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Zapisanie klucza DKMS w UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Wymagane jest uwierzytelnienie, aby zapisać klucz DKMS w UEFI Shim" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalacja pliku AppStream w położeniu systemowym" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instalowanie pliku AppStream w położeniu systemowym" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Lista zgodnych projektów" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"To jest lista zgodnych projektów, które powinny być wyświetlane, takie jak " +"GNOME, KDE i Xfce." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Czy zarządzać aktualizacjami i aktualizacjami systemu w Menedżerze " +"oprogramowania GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Jeśli jest wyłączone, to Menedżer oprogramowania GNOME ukryje panel " +"aktualizacji, nie będzie wykonywał aktualizacji automatycznych ani pytał " +"o aktualizacje systemu." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automatyczne pobieranie i instalowanie aktualizacji" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Jeśli jest włączone, to Menedżer oprogramowania GNOME automatycznie pobiera " +"aktualizacje oprogramowania w tle, instalując te niewymagające ponownego " +"uruchomienia." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Powiadamianie użytkownika o oprogramowaniu zaktualizowanym w tle" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Jeśli jest włączone, to Menedżer oprogramowania GNOME powiadamia użytkownika " +"o aktualizacjach wykonanych, kiedy nie używał komputera." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Czy automatycznie odświeżać na połączeniach taryfowych" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Jeśli jest włączone, to Menedżer oprogramowania GNOME automatycznie odświeża " +"w tle, nawet podczas używania połączenia taryfowego (pobieranie metadanych, " +"wyszukiwanie aktualizacji itp., co może oznaczać koszty dla użytkownika)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Czy to pierwsze uruchomienie Menedżera oprogramowania GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Wyświetlanie ocen obok programów" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtrowanie programów na podstawie domyślnie ustawionej gałęzi dla " +"repozytorium" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Wyświetlanie ostrzeżenia przed instalowaniem własnościowych programów" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Można wyświetlać ostrzeżenie przed instalowaniem własnościowych programów. " +"To ustawienie kontroluje, czy to ostrzeżenie jest wstrzymywane." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Czas ostatniego sprawdzenia aktualizacji" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Czas ostatniego powiadomienia o aktualizacji" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Czas ostatniego powiadomienia o aktualizacji" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Czas pierwszej aktualizacji bezpieczeństwa, czyszczony po aktualizacji" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Czas ostatniej aktualizacji" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Czas w sekundach do sprawdzania, czy zrzut ekranu jest nadal prawidłowy" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Wybranie większej wartości oznacza mniej wycieczek do zdalnego serwera, ale " +"wyświetlenie aktualizacji zrzutów ekranu mogą zająć więcej czasu. Wartość 0 " +"oznacza, że serwer nigdy nie zostanie sprawdzony, jeśli obraz już istnieje " +"w pamięci podręcznej." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Serwer używany do wyświetlania recenzji programów" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Minimalna karma recenzji" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Recenzje o niższej karmie nie będą wyświetlane." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Lista oficjalnych repozytoriów, które nie powinny być traktowane jako " +"dostarczane przez stronę trzecią" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Lista obowiązkowych repozytoriów, których nie można wyłączać ani usuwać" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Lista oficjalnych repozytoriów, które powinny być traktowane jako wolne " +"oprogramowanie" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Adres URL licencji używanej, kiedy program powinien być traktowany jako " +"wolne oprogramowanie" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Instalowanie pakietów dla wszystkich użytkowników systemu tam, gdzie to " +"możliwe" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Zezwolenie na używanie okna repozytoriów oprogramowania" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Oferowanie aktualizacji do wydań testowych" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Wyświetlanie elementu interfejsu informującego użytkownika, że program jest " +"własnościowy" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Wyświetlanie rozmiaru programów po zainstalowaniu na liście zainstalowanych " +"programów" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://pl.wikipedia.org/wiki/Zamknięte_oprogramowanie'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Adres URI wyjaśniający własnościowe oprogramowanie" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Lista adresów URL wskazujących na pliki AppStream, które będą pobierane do " +"katalogu „swcatalog”" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instalowanie plików AppStream w położeniu systemowym dla wszystkich " +"użytkowników. Wyłączenie spowoduje instalowanie plików w niestandardowym " +"katalogu $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Kolejność priorytetów preferowanych formatów pakietów, z ważniejszymi " +"formatami wymienionymi jako pierwsze. Pusta macierz oznacza domyślną " +"kolejność. Pominięte formaty są uznawane jako wymienione na końcu. " +"Przykładowe formaty pakietów: deb, flatpak, rpm, snap. Formaty mogą być " +"opcjonalnie podane z nazwą repozytorium oddzieloną dwukropkiem, na przykład " +"„flatpak:flathub”." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Czas ostatniej próby usunięcia nieużywanych środowisk wykonawczych Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Ustawienie na wartość „true” spowoduje wyświetlanie tylko programów na " +"wolnej licencji i ukrywanie wszystkich programów własnościowych." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Ustawienie na wartość „true” spowoduje wyświetlanie tylko programów od " +"autorów, których tożsamość została zweryfikowana." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Czas ostatnich otrzymanych aktualizacji historycznych." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Ciąg przechowujący identyfikator usługi gnome-online-accounts używany do " +"logowania" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Instalator plików AppStream w systemie" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Przetworzenie wiersza poleceń się nie powiodło" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Należy podać dokładnie jedną nazwę pliku" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Ten program może być używany tylko przez roota" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Sprawdzenie poprawności typu treści się nie powiodło: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Przeniesienie się nie powiodło: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalacja oprogramowania" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instalowanie wybranego oprogramowania na komputerze" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Rysunkowa przemoc" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Brak informacji o rysunkowej przemocy" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Nierzeczywista przemoc" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Brak informacji o nierzeczywistej przemocy" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistyczna przemoc" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Brak informacji o realistycznej przemocy" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Przemoc przedstawiająca rozlew krwi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Brak informacji o rozlewie krwi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Przemoc seksualna" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Brak informacji o przemocy seksualnej" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Brak informacji o odniesieniach do alkoholu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotyki" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Brak informacji o odniesieniach do narkotyków" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tytoń" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Brak informacji o odniesieniach do produktów tytoniowych" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nagość" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Brak informacji o wszelkiego rodzaju nagości" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Motywy seksualne" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Brak informacji o odniesieniach lub przedstawieniach o naturze seksualnej" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Przekleństwa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Brak informacji o wszelkiego rodzaju przekleństwach" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Nieodpowiedni humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Brak informacji o nieodpowiednim humorze" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Dyskryminacja" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Brak informacji o wszelkiego rodzaju języku dyskryminującym" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklamy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Brak informacji o wszelkiego rodzaju reklamach" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Hazard" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Brak informacji o wszelkiego rodzaju hazardzie" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Zakupy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Brak informacji o możliwości wydawania pieniędzy" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Rozmowy między użytkownikami" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" +"Brak informacji o możliwościach rozmów tekstowych z innymi użytkownikami" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Rozmowy głosowe między użytkownikami" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" +"Brak informacji o możliwościach rozmów głosowych z innymi użytkownikami" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Informacje kontaktowe" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Brak informacji o udostępnianiu nazw użytkowników serwisów społecznościowych " +"lub adresów e-mail" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informacje identyfikujące" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Brak informacji o udostępnianiu informacji o użytkownikach stronom trzecim" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Udostępnianie położenia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Brak informacji o udostępnianiu rzeczywistego adresu innym użytkownikom" + +# I really wish "homophobia" was a category instead of this :/ +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksualność" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Brak informacji o odniesieniach do homoseksualności" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostytucja" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Brak informacji o odniesieniach do prostytucji" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Cudzołóstwo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Brak informacji o odniesieniach do cudzołóstwa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Seksualizowane postacie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Brak informacji o seksualizowanych postaciach" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanacja" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Brak informacji o odniesieniach do profanacji" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Zwłoki ludzkie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Brak informacji o widocznych zwłokach ludzkich" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Niewolnictwo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Brak informacji o odniesieniach do niewolnictwa" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Nie zawiera odniesień do narkotyków" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Nie zawiera przekleństw ani żadnego rodzaju mocnego języka" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Nie zawiera reklam ani transakcji pieniężnych" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Nie zawiera przedstawień seksu ani nagości" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Nie zawiera niekontrolowanej funkcji rozmów tekstowych" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Nie zawiera przemocy" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Narkotyki" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Mocny język" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Pieniądze" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Funkcje społecznościowe" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Przemoc" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Dla wszystkich" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "Program %s ma nieznaną klasyfikację wiekową" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "Program %s jest odpowiedni dla wszystkich" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "Program %s jest odpowiedni dla niemowląt" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "Program %s jest odpowiedni dla małych dzieci" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "Program %s jest odpowiedni dla dzieci" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "Program %s jest odpowiedni dla nastolatków" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "Program %s jest odpowiedni dla dorosłych" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "Program %s jest odpowiedni dla osób %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Klasyfikacja wiekowa" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Jak dodać brakujące informacje" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Lokalny plik" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Pakiet" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Oczekujące" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Oczekuje na instalację" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Oczekuje na usunięcie" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Instalowanie" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Usuwanie" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Pobieranie" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Zainstaluj" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Odinstaluj…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Sieć" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Może komunikować się przez sieć" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Usługi systemowe" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Ma dostęp do usług D-Bus na magistrali systemowej" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Usługi sesji" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Ma dostęp do usług D-Bus na magistrali sesji" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Urządzenia" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Ma dostęp do dowolnych urządzeń, takich jak kamerki" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Ma dostęp do urządzeń wejściowych" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Ma dostęp do mikrofonów i odtwarzania dźwięku" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Ma dostęp do plików na urządzeniach systemowych" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Zawartość ekranu" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Ma dostęp do zawartości ekranu" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Katalog domowy" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Może wyświetlać, modyfikować i tworzyć pliki" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Może wyświetlać pliki" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "System plików" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Katalog pobierania" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Ustawienia" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Może wyświetlać i zmieniać dowolne ustawienia" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Przestarzały system wyświetlania" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Używa starego, niezabezpieczonego systemu wyświetlania" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Wyjście z izolacji" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Może opuszczać izolację i omijać inne ograniczenia" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Brak opisu aktualizacji." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Informacje o aktualizacji" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Wymaga dodatkowych uprawnień." + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Otrzymano nieprawidłowe dane ocen z serwera" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Nie można komunikować się z serwerem ocen" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Recenzje" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Nie odnaleziono recenzji tego programu." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Brak recenzji" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Historia wersji" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Nowości w wersji %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Wersja %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Nie ma informacji o tym wydaniu" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%-d %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "Tryb startowy: „updates”, „updated”, „installed” lub „overview”" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "TRYB" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Wyszukuje programy" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "WYSZUKIWANIE" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Wyświetla informacje o programie (za pomocą jego identyfikatora)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "IDENTYFIKATOR" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Wyświetla informacje o programie (za pomocą jego nazwy pakietu)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NAZWA-PAKIETU" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instaluje program (za pomocą jego identyfikatora)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Odinstalowuje program (za pomocą jego identyfikatora)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Otwiera lokalny plik pakietu" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NAZWA-PLIKU" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Rodzaj interakcji oczekiwanej dla tego działania: „none”, „notify” lub „full”" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKCJA" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Wyświetla lokalny plik Metainfo lub AppData" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Włącza więcej komunikatów wyjścia debugowania (z uruchomionego wystąpienia, " +"jeśli jest już uruchomione)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instaluje wszystkie oczekujące aktualizacje w tle" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Wyświetla preferencje" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Kończy działanie uruchomionego wystąpienia" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferuje lokalne źródła plików nad danymi AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Wyświetla numer wersji" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016-2023 współtwórcy Menedżera oprogramowania GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Piotr Drąg , 2012-2025\n" +"Aviary.pl , 2012-2025" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Nie ma informacji o tym programie." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Rozmiar po zainstalowaniu" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "W tym %s danych i %s pamięci podręcznej" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "W tym %s danych" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "W tym %s pamięci podręcznej" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Nieznane użycie pamięci podręcznej i danych" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Rozmiar pobierania" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Nie wymaga dodatkowego pobierania" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Wymaga dodatkowego pobierania o nieznanym rozmiarze" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Wymaga %s dodatkowego pobierania" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Nieznany rozmiar" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Bez uprawnień" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Ma dostęp do sieci" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Używa usług systemowych" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Używa usług sesji" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Ma dostęp do urządzeń sprzętowych" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Ma dostęp do urządzeń systemowych" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Może odczytywać/zapisywać wszystkie dane użytkownika" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Może odczytywać wszystkie dane użytkownika" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Może odczytywać/zapisywać pobrane pliki" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Może odczytywać pobrane pliki" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Ma dostęp do określonych plików" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Może używać i zmieniać ustawienia użytkownika" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Używa przestarzałego systemu okien" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Może uzyskać dowolne uprawnienia" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Zweryfikowany autor oprogramowania" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Zatwierdzone przez dystrybutora systemu operacyjnego" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Zatwierdzone przez: %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Dostarczane przez stronę trzecią" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Oprogramowanie nie jest już wspierane" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Kod do wglądu" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Nieznana licencja" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Kod własnościowy" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Licencja specjalna" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr ", " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Systemowe" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Bezpieczne" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Prawdopodobnie bezpieczne" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potencjalnie niebezpieczne" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Niebezpieczne" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Tylko dla telefonów" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Działa tylko na małym ekranie" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Tylko dla komputerów" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Działa tylko na dużym ekranie" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Niepasujący rozmiar ekranu" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Nie obsługuje rozmiaru obecnego ekranu" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Wymaga ekranu dotykowego" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Wymaga klawiatury" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Wymaga myszy" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Kontroler jest wymagany" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Do gry wymaga kontrolera" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptacyjny" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Działa na telefonach, tabletach i komputerach" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Prawdopodobnie wymaga klawiatury lub myszy" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Działa na komputerach stacjonarnych i laptopach" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Nie zawiera treści nieodpowiednich dla dzieci" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Brak informacji o klasyfikacji wiekowej" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Witryna" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Zainstaluj…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Anuluj" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Zainstaluj" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Pobierz" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Zaktualizuj" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Odinstaluj…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Odinstalowywanie" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Krytyczna aktualizacja" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Nie można używać urządzenia podczas aktualizacji." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Źródło: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Zmieniono nazwę z „%s”" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Przestało otrzymywać aktualizacje" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Krytyczna aktualizacja" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Zainstalowane" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Pomóż tłumaczyć program %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"Program %s jest projektowany, tworzony i tłumaczony przez międzynarodową " +"społeczność.\n" +"\n" +"Oznacza to, że chociaż nie jest on jeszcze dostępny w używanym języku, można " +"dołączyć do społeczności i pomóc go tłumaczyć." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Tłumaczenia" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Witryna tłu_maczeń" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Repozytorium %s wymaga zalogowania (obszar %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Wymagane jest zalogowanie" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Anuluj" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Zaloguj się" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Użytkownik" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Hasło" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Inne" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Wszystkie" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Polecane" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Nasz wybór" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nowe i zaktualizowane" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Polecane programy WWW" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Inne oprogramowanie" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "Zainstalowano „%s”" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Wymagane jest ponowne uruchomienie, aby zastosować zmiany" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Program jest gotowy do użytku" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Zainstalowano aktualizacje systemu" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Można przejrzeć ostatnio zainstalowane aktualizacje" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Uruchom ponownie" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Uruchom" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Zainstalować oprogramowanie?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Zainstalować oprogramowanie dostarczane przez stronę trzecią?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Włączyć repozytorium oprogramowania?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Włączyć repozytorium oprogramowania dostarczane przez stronę trzecią?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"Program %s nie jest wolnym i otwartym oprogramowaniem, " +"a jest dostarczany przez źródło „%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "Program %s jest dostarczany przez źródło „%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"To repozytorium oprogramowania musi zostać włączone, aby kontynuować " +"instalację." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Zainstalowanie lub używanie programu %s może być nielegalne w niektórych " +"krajach." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Zainstalowanie lub używanie tego kodeku może być nielegalne w niektórych " +"krajach." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_Bez ostrzegania ponownie" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "_Włącz i zainstaluj" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Informacje o błędach z menedżera pakietów:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Informacje" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "Za_mknij" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Skopiowano informacje do schowka" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "Z_aakceptuj" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Zainstalowano aktualizację" +msgstr[1] "Zainstalowano aktualizacje" +msgstr[2] "Zainstalowano aktualizacje" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Odinstalowano program" +msgstr[1] "Odinstalowano programy" +msgstr[2] "Odinstalowano programy" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Wymagane jest ponowne uruchomienie, aby zastosować zmiany" +msgstr[1] "Wymagane jest ponowne uruchomienie, aby zastosować zmiany" +msgstr[2] "Wymagane jest ponowne uruchomienie, aby zastosować zmiany" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Nie teraz" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Dzisiaj" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Wczoraj" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dzień temu" +msgstr[1] "%d dni temu" +msgstr[2] "%d dni temu" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d tydzień temu" +msgstr[1] "%d tygodnie temu" +msgstr[2] "%d tygodni temu" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d miesiąc temu" +msgstr[1] "%d miesiące temu" +msgstr[2] "%d miesięcy temu" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d rok temu" +msgstr[1] "%d lata temu" +msgstr[2] "%d lat temu" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Przed chwilą" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuta temu" +msgstr[1] "%d minuty temu" +msgstr[2] "%d minut temu" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d godzina temu" +msgstr[1] "%d godziny temu" +msgstr[2] "%d godzin temu" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Wszystkie" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Polecane" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Grafika 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografia" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skanowanie" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Grafika wektorowa" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Przeglądarki" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Tworzenie i edycja dźwięku" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Odtwarzacze muzyki" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Wszystkie" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Polecane" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendarze" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Bazy danych" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finanse" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Procesory tekstu" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Edytory tekstu" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Przeglądarki WWW" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Wszystkie" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Polecane" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Gry akcji" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Gry przygodowe" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Gry platformowe" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Gry w klocki" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Gry planszowe" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Gry karciane" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatory" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Gry dla dzieci" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Gry logiczne" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Gry fabularne" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Gry sportowe" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Gry strategiczne" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Wszystkie" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Polecane" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Komunikatory" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Wszystkie" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Polecane" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Sztuczna inteligencja" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomia" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chemia" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Języki" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematyka" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Aktualności" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotyka" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Sztuka" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografie" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komiksy" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Beletrystyka" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Zdrowotne" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historyczne" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Luksusowe" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Polityczne" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sportowe" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Wszystkie" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Polecane" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Debugery" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Środowiska programistyczne" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeki" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Sterowniki sprzętowe" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Czcionki" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Źródła wprowadzania" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Pakiety językowe" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Tłumaczenia" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Twórz" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Pracuj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Graj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Komunikuj się" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Ucz się" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Programuj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodeki" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Sterowniki sprzętowe" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Czcionki" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Źródła wprowadzania" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Pakiety językowe" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Tłumaczenia" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Program" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "Program %s wymaga dodatkowej obsługi formatu pliku." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Wymagany jest dodatkowy typ MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "Program %s wymaga dodatkowych czcionek." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Wymagane są dodatkowe czcionki" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "Program %s wymaga dodatkowych kodeków multimedialnych." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Wymagane są dodatkowe kodeki multimedialne" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "Program %s wymaga dodatkowych sterowników drukarki." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Wymagane są dodatkowe sterowniki drukarki" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "Program %s wymaga dodatkowych pakietów." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Wymagane są dodatkowe pakiety" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Znajdź w menedżerze oprogramowania" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Więcej" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Mniej" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Usuwanie…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Dokończenie instalacji wymaga ponownego uruchomienia" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Dokończenie usunięcia wymaga ponownego uruchomienia" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Oczekująca instalacja…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Oczekująca aktualizacja…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Pobieranie…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Przygotowywanie…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Odinstalowywanie…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "Program %s nie jest zainstalowany, ale nadal ma przechowywane dane." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Uruchom ponownie" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Włącz…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Zainstaluj…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "Program %s będzie w języku angielskim" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Ten program będzie w języku angielskim" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "To oprogramowanie będzie w języku angielskim" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "_Pomóż tłumaczyć" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Inne programy od: %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Autor %s dowiódł, że jest właścicielem programu %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Autor dowiódł, że jest właścicielem programu %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Wymagany jest dostęp do Internetu, aby napisać recenzję" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Ten program nie otrzymuje już aktualizacji, w tym poprawek bezpieczeństwa" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Ten program jest już dostarczany przez dystrybucję i nie powinien być " +"zastępowany." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Ten program nie dostarcza żadnych odnośników do strony, repozytorium kodu " +"ani systemu śledzenia błędów." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"To oprogramowanie nie otrzymuje już aktualizacji, w tym poprawek " +"bezpieczeństwa" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"To oprogramowanie jest już dostarczane przez dystrybucję i nie powinno być " +"zastępowane." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"To oprogramowanie nie dostarcza żadnych odnośników do strony, repozytorium " +"kodu ani systemu śledzenia błędów." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Menedżer oprogramowanie nie mógł pobrać informacji o programie „%s” i nie " +"może wyświetlić informacji o nim." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Otrzymano nieprawidłową odpowiedź recenzji z serwera" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Wysłanie recenzji programu „%s” się nie powiodło: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Strona informacji" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Wczytywanie informacji o programie" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Zweryfikowany" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Otwórz" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Z_aktualizuj" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Odinstaluj" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Dodatki" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Ten program może być używany tylko, kiedy dostępne jest aktywne połączenie " +"internetowe." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Dołączono repozytorium oprogramowania" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Ten program zawiera repozytorium oprogramowania, dostarczające aktualizacje " +"i dostęp do innego oprogramowania." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Nie dołączono repozytorium oprogramowania" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Ten program nie zawiera repozytorium oprogramowania. Nie będzie on " +"aktualizowany do nowszych wersji." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Rozpoznano repozytorium oprogramowania" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Dodanie tego repozytorium oprogramowania umożliwi dostęp do dodatkowego " +"oprogramowania i aktualizacji." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Należy używać tylko zaufanych repozytoriów oprogramowania." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Czyści dane programu" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Usuń dane" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Brak metadanych" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Witryna projektu" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "W_spomóż" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Pomóż tłu_maczyć" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Zgłoś problem" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Pomo_c" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontakt" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Napisz recenzję" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Wszystkie recenzje" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Nie można wyświetlić informacji o programie" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Przygotowanie ponownego uruchomienia się nie powiodło" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Nieznany błąd" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Nie odnaleziono klucza" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Klucz nie jest zapisany" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Wymagane jest zapisanie klucza MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Dalej" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"To urządzenie ma włączony mechanizm Secure Boot. Aby umożliwić włączenie " +"nowych sterowników, nowy klucz właściciela komputera (MOK) musi zostać " +"zapisany. Proces ten wymaga podania hasła na późniejszym etapie. Proszę " +"zapisać sobie poniższe hasło powiązane z kluczem:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Mam zapisane _hasło MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Uruchom ponownie i zapisz…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instrukcje konfiguracji: proszę uważnie przeczytać" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Po ponownym uruchomieniu zostanie wyświetlony ekran konfiguracji urządzenia. " +"Aby włączyć nowe sterowniki, należy wykonać poniższe kroki:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Wybierz „Enroll MOK” („Zapisz MOK”)\n" +"• Wybierz „Yes” („Tak”), aby zapisać klucze\n" +"• Podaj hasło MOK\n" +"• Następnie wybierz „Reboot” („Uruchom ponownie”)" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Konsekwencje dla bezpieczeństwa" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Po pomyślnym zapisaniu klucza należy pamiętać, że wszelkie przyszłe " +"aktualizacje tego lub innego modułu będą uznawane za bezwarunkowo zaufane. " +"Wszelkie przyszłe aktualizacje będą odbywać się bez udziału ani upoważnienia " +"użytkownika." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Dokumentacja zawiera więcej informacji." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Pobieranie dodatkowych plików metadanych…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " i " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Dostępne czcionki dla pisma „%s”" +msgstr[1] "Dostępne czcionki dla pism: %s" +msgstr[2] "Dostępne czcionki dla pism: %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Dostępne oprogramowanie dla „%s”" +msgstr[1] "Dostępne oprogramowanie dla: %s" +msgstr[2] "Dostępne oprogramowanie dla: %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Nie odnaleziono wymaganego oprogramowania" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Odnalezienie wymaganego oprogramowania się nie powiodło" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "Nie odnaleziono „%s”" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "na stronie WWW" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Brak programów dostarczających plik %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informacje o „%s”, a także o możliwościach uzyskania brakujących programów " +"można znaleźć %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Brak programów do obsługi „%s”." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "Program %s jest niedostępny." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informacje o „%s”, a także o możliwościach uzyskania programu obsługującego " +"ten format można znaleźć %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Brak czcionek do obsługi pisma „%s”." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informacje o „%s”, a także o możliwościach uzyskania dodatkowych czcionek " +"można znaleźć %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Brak dodatkowych kodeków dla formatu „%s”." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informacje o „%s”, a także o możliwościach uzyskania kodeku odtwarzającego " +"ten format można znaleźć %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Brak zasobów Plasmy do obsługi „%s”." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informacje o „%s”, a także o możliwościach uzyskania dodatkowych zasobów " +"Plasmy można znaleźć %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Brak sterowników drukarki dla „%s”." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informacje o „%s”, a także o możliwościach uzyskania sterownika " +"obsługującego tę drukarkę można znaleźć %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentacji" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Nie można odnaleźć kodeku %s wymaganego przez program %s. Więcej informacji " +"można znaleźć w %s." +msgstr[1] "" +"Nie można odnaleźć kodeków %s wymaganych przez program %s. Więcej informacji " +"można znaleźć w %s." +msgstr[2] "" +"Nie można odnaleźć kodeków %s wymaganych przez program %s. Więcej informacji " +"można znaleźć w %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "Nie można odnaleźć kodeku %s. Więcej informacji można znaleźć w %s." +msgstr[1] "" +"Nie można odnaleźć kodeków %s. Więcej informacji można znaleźć w %s." +msgstr[2] "" +"Nie można odnaleźć kodeków %s. Więcej informacji można znaleźć w %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Wyszukanie się nie powiodło: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Format plików %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Zainstaluj _wszystko" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Nie można odnaleźć wymaganego oprogramowania" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Strona kodeków" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Brak wyników" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Nie można wyszukać" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Wstecz" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Dalej" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Lista polecanych programów" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Obsługa komputerów" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Obsługuje używanie na dużym ekranie" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Nieznana obsługa komputerów" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Za mało informacji, aby stwierdzić, czy duże ekrany są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Wymaga dużego ekranu" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Komputery nie są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Nie może być używane na dużym ekranie" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Obsługa telefonów" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Obsługuje używanie na małym ekranie" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Nieznana obsługa telefonów" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Za mało informacji, aby stwierdzić, czy małe ekrany są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Wymaga małego ekranu" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Telefony nie są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Nie może być używane na małym ekranie" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Obsługa klawiatury" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Obsługa klawiatury jest nieznana" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Za mało informacji, aby stwierdzić, czy klawiatury są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Wymagana jest klawiatura" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Obsługuje klawiatury" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Klawiatury nie są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Nie może być używane za pomocą klawiatury" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Obsługa myszy" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Wymaga myszy lub urządzenia wskazującego" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Obsługa myszy jest nieznana" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Za mało informacji, aby stwierdzić, czy myszy lub urządzenia wskazujące są " +"obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Wymagana jest mysz" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Obsługuje myszy i urządzenia wskazujące" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Myszy nie są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Nie można używać za pomocą myszy lub urządzenia wskazującego" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Obsługa ekranów dotykowych" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Obsługa ekranów dotykowych jest nieznana" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Za mało informacji, aby stwierdzić, czy ekrany dotykowe są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Wymagany jest ekran dotykowy" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Obsługuje ekrany dotykowe" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Ekrany dotykowe nie są obsługiwane" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Nie można używać za pomocą ekranu dotykowego" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Wymagany jest kontroler" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Wymaga kontrolera" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Obsługa kontrolera" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Obsługuje kontrolery" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "Program %s prawdopodobnie działa na tym urządzeniu" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "Program %s działa na tym urządzeniu" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "Program %s być może działa na tym urządzeniu" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "Program %s nie będzie poprawnie działał na tym urządzeniu" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "Program %s nie będzie działał na tym urządzeniu" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Obsługa sprzętu" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Nawigacja" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Przejście do strony odkrywania" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Przejście do strony zainstalowanych" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Przejście do strony aktualizacji" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Otwarcie paska wyszukiwania" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Okna" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Otwarcie preferencji" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Otwarcie repozytoriów oprogramowania" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Pomoc" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Otwarcie skrótów klawiszowych" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Zainstalowane" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Strona zainstalowanych" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "W trakcie" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Programy" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Programy WWW" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Programy systemowe" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Tworzone przez społeczność" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Dołącz do społeczności" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ten program jest publicznie tworzony przez międzynarodową społeczność " +"i wydany na warunkach licencji %s.\n" +"\n" +"Można dołączyć do społeczności i pomóc jeszcze bardziej go ulepszyć." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ten program jest publicznie tworzony przez międzynarodową społeczność " +"i wydany na warunkach licencji %s.\n" +"\n" +"Można dołączyć do społeczności i pomóc jeszcze bardziej go ulepszyć." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"To oprogramowanie jest publicznie tworzone przez międzynarodową społeczność " +"i wydane na warunkach licencji %s.\n" +"\n" +"Można dołączyć do społeczności i pomóc jeszcze bardziej je ulepszyć." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"To oprogramowanie jest publicznie tworzone przez międzynarodową społeczność " +"i wydane na warunkach licencji %s.\n" +"\n" +"Można dołączyć do społeczności i pomóc jeszcze bardziej je ulepszyć." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Nieznana licencja" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Więcej informacji" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ten program nie podaje, na warunkach jakiej licencji jest tworzony i może " +"być własnościowy. Może być niebezpieczny na trudne do wykrycia sposoby " +"i może zmienić się niespodziewanie.\n" +"\n" +"Nie wiadomo, czy można pomóc go ulepszać." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"To oprogramowanie nie podaje, na warunkach jakiej licencji jest tworzone " +"i może być własnościowe. Może być niebezpieczne na trudne do wykrycia " +"sposoby i może zmienić się niespodziewanie.\n" +"\n" +"Nie wiadomo, czy można pomóc je ulepszać." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Własnościowe" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Ten program nie jest tworzony publicznie, więc tylko jego autorzy wiedzą, " +"jak działa. Może być niebezpieczny na trudne do wykrycia sposoby i może " +"zmienić się niespodziewanie.\n" +"\n" +"Nie można pomóc go ulepszać." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"To oprogramowanie nie jest tworzone publicznie, więc tylko jego autorzy " +"wiedzą, jak działa. Może być niebezpieczne na trudne do wykrycia sposoby " +"i może zmienić się niespodziewanie.\n" +"\n" +"Nie można pomóc je ulepszać." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Licencja specjalna" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ten program jest tworzony na warunkach specjalnej licencji %s.\n" +"\n" +"Nie wiadomo, czy można pomóc go ulepszać." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ten program jest tworzony na warunkach specjalnej licencji „%s”.\n" +"\n" +"Nie wiadomo, czy można pomóc go ulepszać." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"To oprogramowanie jest tworzone na warunkach specjalnej licencji %s.\n" +"\n" +"Nie wiadomo, czy można pomóc je ulepszać." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"To oprogramowanie jest tworzone na warunkach specjalnej licencji „%s”.\n" +"\n" +"Nie wiadomo, czy można pomóc je ulepszać." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Odświeżanie danych" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Wczytywanie strony" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Uruchamianie" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Nieznane źródło" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Użytkownika" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Dodawane" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Usuwane" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Aktualizowane" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Instalowanie poprzedniej wersji" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "wybranych źródeł zewnętrznych" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Zapewnia dostęp do dodatkowego oprogramowania z %s. Część oprogramowania " +"jest własnościowa.\n" +"\n" +"Można później włączyć te repozytoria w preferencjach repozytoriów " +"oprogramowania." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Włączyć repozytoria oprogramowania dostarczane przez stronę trzecią?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Zignoruj" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Włącz" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Dostępne dla używanego systemu operacyjnego" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Dostępne dla systemu %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Odkrywaj" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Strona przeglądu" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Dostępne programy" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Inne kategorie" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nie odnaleziono danych programu" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Nieznana" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Użytkownik odmówił instalacji" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Przygotuj program %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Na pewno usunąć repozytorium „%s”?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Wszystkie programy z „%s” zostaną odinstalowane. Należy ponownie " +"zainstalować repozytorium, aby móc używać ich ponownie." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Odinstalować „%s”?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Po usunięciu nie będzie można używać „%s”." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Po usunięciu nie będzie można używać programów wymagających środowiska %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Po usunięciu nie będzie można używać czcionki %s, a używające jej dokumenty " +"będą wyświetlane za pomocą innej czcionki." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Po usunięciu nie będzie można używać kodeku %s. Może to oznaczać, że nie " +"będzie można odtwarzać części plików multimedialnych." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Sprzęt wymagający oprogramowania sprzętowego %s może nie działać poprawnie " +"po jego usunięciu." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Po usunięciu nie będzie można używać programu %s. Jego dane i ustawienia " +"zostaną zachowane na dysku, aby umożliwić jego przywrócenie w przyszłości." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferencje" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Aktualizacje oprogramowania" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Więcej informacji" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Wyszukiwanie i pobieranie aktualizacji używa dane i prąd. Z tego powodu " +"funkcje automatycznego aktualizowania są wstrzymane podczas korzystania " +"z taryfowych połączeń sieciowych i trybu oszczędzania energii." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatyczne" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Automatyczne wyszukiwanie i pobieranie aktualizacji" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Ręczne" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Wyszukiwanie i pobieranie aktualizacji musi być wykonywane ręcznie" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Powiadomienia o automatycznej aktualizacji" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Powiadamianie po automatycznej instalacji aktualizacji" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtry treści" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Tylko _wolne oprogramowanie" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "" +"Ukrywanie własnościowego oprogramowania podczas przeglądania i wyszukiwania" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Tylko _zweryfikowani autorzy programów" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Wyświetlanie tylko programów od autorów, których tożsamość została " +"zweryfikowana" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Zainstalowane oprogramowanie jest niezgodna z systemem %s i zostanie " +"automatycznie usunięte podczas aktualizacji systemu." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Niezgodne oprogramowanie" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Zaktualizuj" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Odinstaluj" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Ustawienia i dane programu" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Zachowaj" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Umożliwia przywrócenie ustawień i treści programu" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Usuń" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Trwale usuwa dane, aby oszczędzić miejsce na dysku" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Oprogramowanie zainstalowane z repozytorium „%s” nie będzie już " +"aktualizowane." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Wyłączyć repozytorium?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Usunąć repozytorium?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Wyłącz" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Usuń" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Włączanie nowych repozytoriów" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Włączanie nowych repozytoriów po dodaniu" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "Więcej informacji" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Dodatkowe repozytoria od wybranych stron trzecich. %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Repozytoria Fedory dostarczane przez stronę trzecią" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "operacyjny" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Te repozytoria uzupełniają domyślne oprogramowanie dostarczane przez system " +"%s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Repozytoria oprogramowania" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Brak repozytoriów" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "Zainstalowano %u program" +msgstr[1] "Zainstalowano %u programy" +msgstr[2] "Zainstalowano %u programów" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "Zainstalowano %u dodatek" +msgstr[1] "Zainstalowano %u dodatki" +msgstr[2] "Zainstalowano %u dodatków" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u program" +msgstr[1] "%u programy" +msgstr[2] "%u programów" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u dodatek" +msgstr[1] "%u dodatki" +msgstr[2] "%u dodatków" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "Zainstalowano %s i %s" +msgstr[1] "Zainstalowano %s i %s" +msgstr[2] "Zainstalowano %s i %s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Sprawdzanie zainstalowanego oprogramowania…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Usuwa" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Zły" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Słaby" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "W porządku" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Dobry" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Wspaniały" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Proszę wybrać gwiazdkę, aby ocenić program" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Proszę poświęcić więcej czasu na napisanie recenzji" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Proszę wybrać ocenę" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Podsumowanie jest za krótkie" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Podsumowanie jest za długie" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Opis jest za krótki" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Opis jest za długi" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Pisanie recenzji" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Wyślij" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Proszę podać ocenę, podsumowanie i tekst recenzji. Recenzje nie powinny być " +"używane do zgłaszania problemów: zamiast tego należy skontaktować się " +"z autorem programu lub dostawcą wsparcia." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Podsumowanie recenzji" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Proszę napisać krótką recenzję" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Zasady ochrony prywatności " +"zawierają informacje o tym, jakie dane są przesyłane. Imię i nazwisko " +"powiązane z kontem będą wyświetlane publicznie." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u recenzja" +msgstr[1] "%u recenzje" +msgstr[2] "%u recenzji" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "na 5 gwiazdek" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Nieznany" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Można zgłosić recenzję za znieważające, nieprzyzwoite lub dyskryminujące " +"zachowanie." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Recenzja zostanie ukryta po jej zgłoszeniu aż do jej sprawdzenia przez " +"administratora." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Zgłosić recenzję?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Zgłoś" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Usunąć recenzję?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Usunięcia recenzji nie da się cofnąć." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Oznacza recenzję jako lubianą" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Oznacza recenzję jako nielubianą" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Zgłasza…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Usuwa…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Program nie jest izolowany, ale dystrybucja sprawdziła, że nie jest on " +"szkodliwy" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Proszę sprawdzić, czy dostawca jest zaufany, jako że program nie jest " +"izolowany" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Brak uprawnień" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Program jest w pełni izolowany" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Dostęp do sieci" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Ma dostęp do sieci" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Brak dostępu do sieci" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Nie ma dostępu do sieci" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Używa usług systemowych" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Może żądać danych z usług systemowych" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Używa usług sesji" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Może żądać danych z usług sesji" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Dostęp do urządzeń użytkownika" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Może mieć dostęp do urządzeń, na przykład kamerki lub kontrolera" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Brak dostępu do urządzeń użytkownika" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Nie ma dostępu do urządzeń, na przykład kamerki lub kontrolera" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Dostęp do urządzeń wejściowych" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Dostęp do mikrofonu i odtwarzania dźwięku" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Może nasłuchiwać za pomocą mikrofonów i odtwarzać dźwięk bez pytania " +"o pozwolenie" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Dostęp do urządzeń systemowych" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Ma dostęp do urządzeń systemowych, które wymagają zwiększonych uprawnień" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Dostęp do zawartości ekranu" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Ma dostęp do zawartości ekranu lub innych okien" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Przestarzały system okien" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Dowolne uprawnienia" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Ustawienia użytkownika" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Dostęp do pełnego systemu plików do odczytu i zapisu" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Może odczytywać i zapisywać dowolne dane w systemie plików" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Dostęp do katalogu domowego do odczytu i zapisu" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Może odczytywać i zapisywać dowolne dane w katalogu domowym" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Dostęp do pełnego systemu plików do odczytu" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Może odczytywać dowolne dane w systemie plików" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Dostęp do katalogu domowego do odczytu" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Może odczytywać dowolne dane w katalogu domowym" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Dostęp do katalogu pobierania do odczytu i zapisu" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Może odczytywać i zapisywać dowolne dane w katalogu pobierania" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Dostęp do katalogu pobierania do odczytu" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Może odczytywać dowolne dane w katalogu pobierania" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Może odczytywać i zapisywać dowolne dane w katalogu" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Może odczytywać dowolne dane w katalogu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Brak dostępu do systemu plików" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "W ogóle nie ma dostępu do systemu plików" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Zweryfikowany autor programu" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Tożsamość autora tego programu została zweryfikowana" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Niezabezpieczone zależności" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Oprogramowanie lub jego zależności nie są już wspierane, a jego " +"bezpieczeństwo może być niepewne" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Ten program nie podaje, na warunkach jakiej licencji jest tworzony i może " +"być własnościowy" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"To oprogramowanie nie podaje, na warunkach jakiej licencji jest tworzone " +"i może być własnościowe" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Kod własnościowy" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Kod źródłowy nie jest publiczny, więc nie może być niezależnie badany i może " +"być niebezpieczny" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Ten program jest tworzony na warunkach specjalnej licencji „%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "To oprogramowanie jest tworzone na warunkach specjalnej licencji „%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Kod do wglądu" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Kod źródłowy jest publiczny i może być niezależnie badany, więc " +"bezpieczeństwo programu jest pewniejsze" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "Program %s jest systemowy" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "Program %s jest bezpieczny" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "Program %s jest prawdopodobnie bezpieczny" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "Program %s jest potencjalnie niebezpieczny" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "Program %s jest niebezpieczny" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Nieznana" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Bezpieczeństwo" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licencja" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Źródło" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "Środowisko programistyczne" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Ten program używa przestarzałej wersji platformy oprogramowania (środowiska " +"programistycznego) i może zawierać błędy lub problemy zabezpieczeń, które " +"nie zostaną naprawione." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Poprzedni zrzut ekranu" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Następny zrzut ekranu" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Brak zrzutów ekranu" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Nie odnaleziono zrzutu ekranu" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Wczytanie obrazu się nie powiodło" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Nie odnaleziono wymiarów zrzutu ekranu" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Nie można utworzyć pamięci podręcznej" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Nieprawidłowy zrzut ekranu" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Zrzut ekranu jest niedostępny" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Zrzut ekranu" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u więcej" +msgstr[1] "%u więcej" +msgstr[2] "%u więcej" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Strona wyszukiwania" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Wyszukiwanie programów" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Nie odnaleziono żadnego programu" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "„%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Nie można pobrać aktualizacji" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Nie można pobrać aktualizacji oprogramowania sprzętowego" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nie można pobrać aktualizacji oprogramowania sprzętowego z %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nie można pobrać aktualizacji z %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Nie można zaktualizować: wymagany jest dostęp do Internetu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Nie można zaktualizować: za mało miejsca na dysku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Nie można pobrać aktualizacji z %s: za mało miejsca na dysku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Nie można zaktualizować: wymagane jest uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Nie można zaktualizować: nieprawidłowe uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Nie można zaktualizować: wymagane jest uprawnienie" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Nie można pobrać aktualizacji: brak uprawnienia do instalacji oprogramowania" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Nie można pobrać listy aktualizacji" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Nie można zainstalować: pobranie się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Nie można zainstalować programu %s: pobranie z „%s” się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Nie można zainstalować programu %s: pobranie się nie powiodło" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Nie można zainstalować: brak środowiska wykonawczego" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "" +"Nie można zainstalować programu %s: środowisko wykonawcze %s jest niedostępne" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Nie można zainstalować programu %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Nie można zainstalować: wymagany jest dostęp do Internetu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Nie można zainstalować: nieprawidłowy format programu" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Nie można zainstalować: za mało miejsca na dysku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Nie można zainstalować programu %s: za mało miejsca na dysku" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Nie można zainstalować: wymagane jest uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Nie można zainstalować programu %s: wymagane jest uwierzytelnienie" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Nie można zainstalować: nieprawidłowe uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Nie można zainstalować programu %s: nieprawidłowe uwierzytelnienie" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Nie można zainstalować: wymagane jest uprawnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Nie można zainstalować programu %s: wymagane jest uprawnienie" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Nie można zainstalować: urządzenie musi być podłączone" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Nie można zainstalować programu %s: urządzenie musi być podłączone" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Nie można zainstalować: niski poziom naładowania akumulatora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "" +"Nie można zainstalować programu %s: niski poziom naładowania akumulatora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Nie można zaktualizować programu %s z „%s”: pobranie się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Nie można zaktualizować programu %s: pobranie się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Nie można zainstalować aktualizacji z „%s”: pobranie się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Nie można zaktualizować: pobranie się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Nie można zaktualizować programu %s: za mało miejsca na dysku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Nie można zaktualizować programu %s: wymagane jest uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Nie można zaktualizować programu %s: nieprawidłowe uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Nie można zaktualizować programu %s: wymagane jest uprawnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Nie można zaktualizować: urządzenie musi być podłączone" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Nie można zaktualizować programu %s: urządzenie musi być podłączone" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Nie można zaktualizować: niski poziom naładowania akumulatora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "" +"Nie można zaktualizować programu %s: niski poziom naładowania akumulatora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Nie można zaktualizować programu %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Nie można zaktualizować" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Nie można zaktualizować systemu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Nie można zaktualizować do systemu %s z „%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Nie można zaktualizować systemu: pobranie się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Nie można zaktualizować do systemu %s: pobranie się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Nie można zaktualizować systemu: wymagany jest dostęp do Internetu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "" +"Nie można zaktualizować do systemu %s: wymagany jest dostęp do Internetu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Nie można zaktualizować systemu: za mało miejsca na dysku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Nie można zaktualizować do systemu %s: za mało miejsca na dysku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Nie można zaktualizować systemu: wymagane jest uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Nie można zaktualizować do systemu %s: wymagane jest uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Nie można zaktualizować systemu: nieprawidłowe uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Nie można zaktualizować do systemu %s: nieprawidłowe uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Nie można zaktualizować systemu: wymagane jest uprawnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Nie można zaktualizować do systemu %s: wymagane jest uprawnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Nie można zaktualizować systemu: urządzenie musi być podłączone" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Nie można zaktualizować do systemu %s: urządzenie musi być podłączone" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Nie można zaktualizować systemu: niski poziom naładowania akumulatora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "" +"Nie można zaktualizować do systemu %s: niski poziom naładowania akumulatora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nie można zaktualizować do systemu %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Nie można odinstalować: wymagane jest uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Nie można odinstalować programu %s: wymagane jest uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Nie można odinstalować: nieprawidłowe uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Nie można odinstalować programu %s: nieprawidłowe uwierzytelnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Nie można odinstalować: wymagane jest uprawnienie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Nie można odinstalować programu %s: wymagane jest uprawnienie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Nie można odinstalować: urządzenie musi być podłączone" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Nie można odinstalować programu %s: urządzenie musi być podłączone" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Nie można odinstalować: niski poziom naładowania akumulatora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "" +"Nie można odinstalować programu %s: niski poziom naładowania akumulatora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Nie można odinstalować programu %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Nie można uruchomić programu %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Coś się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Nie można uruchomić programu %s: środowisko %s nie jest zainstalowane" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Za mało miejsca na dysku do działania" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Nie można zainstalować: typ pliku jest nieobsługiwany" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Nie można zainstalować: uwierzytelnienie się nie powiodło" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Nie można zainstalować" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Nie można skontaktować się z „%s”" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "" +"Menedżer oprogramowania musi zostać ponownie uruchomiony, aby móc używać " +"nowych wtyczek" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Urządzenie musi być podłączone" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Poziom naładowania akumulatora jest za niski" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Repozytoria oprogramowania" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferencje" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Skróty klawiszowe" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_O programie" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Wyszukuje" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menu główne" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Wyszukiwanie programów" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Odkrywaj" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "Zai_nstalowane" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Aktualizacje" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Wstecz" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "nic" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Dane programu" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Dane wymagane do działania programu" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Dane użytkownika" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Dane utworzone przez użytkownika w programie" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Dane pamięci podręcznej" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dane tymczasowe w pamięci podręcznej" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Sam program" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Wymagane zależności" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Współdzielone składniki systemu wymagane przez ten program" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Nieznany" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Dane w pamięci podręcznej można usunąć w _ustawieniach programu" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Miejsce na dysku" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (zainstalowane)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (instalowanie)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (pobieranie)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (usuwanie)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Informacje" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Sprawdź" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Zainstalowano w dniu %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Zainstalowane aktualizacje" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Nie zainstalowano żadnych aktualizacji" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Aktualizacje są nieaktualne" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Proszę wyszukać dostępne aktualizacje." + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Krytyczne aktualizacje są gotowe do instalacji" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Należy instalować aktualizacje krytyczne tak szybko, jak to możliwe" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Krytyczne aktualizacje są dostępne do pobrania" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Należy pobierać aktualizacje krytyczne tak szybko, jak to możliwe" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Aktualizacje są gotowe do instalacji" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Aktualizacje oprogramowania są gotowe" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Aktualizacje są dostępne do pobrania" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Można pobrać aktualizacje oprogramowania" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "Zaktualizowano %u program — wymagane jest ponowne uruchomienie" +msgstr[1] "Zaktualizowano %u programy — wymagane jest ponowne uruchomienie" +msgstr[2] "Zaktualizowano %u programów — wymagane jest ponowne uruchomienie" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "Zaktualizowano %u program" +msgstr[1] "Zaktualizowano %u programy" +msgstr[2] "Zaktualizowano %u programów" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "Program %s został zaktualizowany." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Proszę uruchomić go ponownie." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "Programy %s i %s zostały zaktualizowane." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u program wymaga ponownego uruchomienia." +msgstr[1] "%u programy wymagają ponownego uruchomienia." +msgstr[2] "%u programów wymaga ponownego uruchomienia." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "W tym: %s, %s i %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "System nie jest już wspierany" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Należy zaktualizować system, aby nadal otrzymywać aktualizacje" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Nowa wersja systemu %s jest gotowa do zainstalowania" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Dostępna jest aktualizacja oprogramowania" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Aktualizacje oprogramowania się nie powiodły" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Przygotowane aktualizacje nie zostały zainstalowane" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Wyświetl informacje" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Ukończono aktualizację systemu" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Witamy w systemie %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Zainstalowano aktualizację oprogramowania" +msgstr[1] "Zainstalowano aktualizacje oprogramowania" +msgstr[2] "Zainstalowano aktualizacje oprogramowania" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Zainstalowano ważną aktualizację systemu operacyjnego." +msgstr[1] "Zainstalowano ważne aktualizacje systemu operacyjnego." +msgstr[2] "Zainstalowano ważne aktualizacje systemu operacyjnego." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Przejrzyj" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Aktualizacja się nie powiodła" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Komputer jest już aktualny." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Anulowano aktualizację." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Wymagany jest dostęp do Internetu, ale nie jest on dostępny. Proszę się " +"upewnić, że można połączyć się z Internetem i spróbować ponownie." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Aktualizacja zawiera błędy bezpieczeństwa. Proszę skontaktować się " +"z dostawcą oprogramowania, aby dowiedzieć się więcej." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Za mało miejsca na dysku. Proszę zwolnić trochę miejsca i spróbować ponownie." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Zainstalowanie aktualizacji się nie powiodło. Proszę poczekać na następną " +"aktualizację i spróbować ponownie. Jeśli problem nie zniknie, to proszę " +"skontaktować się z dostawcą oprogramowania." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Ostatnio wyszukano: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Zatrzymuje" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Wyszukuje aktualizacje" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "System %s %s nie otrzymuje już krytycznych aktualizacji oprogramowania" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Używany system operacyjny nie otrzymuje już krytycznych aktualizacji " +"oprogramowania" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Możliwe opłaty" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Wyszukiwanie aktualizacji na połączeniu komórkowym może spowodować " +"naniesienie opłat." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Wyszukaj _mimo to" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Pobrano aktualizacje oprogramowania" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Aktualizacje są gotowe do zainstalowania" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Wyszukaj aktualizacje" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Aktualizacje" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Strona aktualizacji" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Wczytywanie aktualizacji" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Może to chwilę zająć" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Oprogramowanie jest aktualne" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Użyć połączenia komórkowego?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Wyszukiwanie aktualizacji na połączeniu komórkowym może spowodować " +"naniesienie opłat" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Wyszukaj mimo to" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Brak połączenia" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Należy przejść do trybu online, aby wyszukać aktualizacje" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Ustawienia _sieci" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Błąd" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Aktualizacje są automatycznie zarządzane" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Wstrzymano aktualizacje oprogramowania" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automatyczne aktualizacje oprogramowania zostały wstrzymane z tych powodów:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Obecne połączenie sieciowe jest taryfowe" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Obecne połączenie sieciowe zabrania pobierania dużych plików" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Aktywny jest tryb oszczędzania energii" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Aktywny jest tryb gier" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Wstrzymano aktualizacje oprogramowania" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"Połączenie sieciowe jest taryfowe — wstrzymano aktualizacje oprogramowania" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Połączenie sieciowe zabrania pobierania dużych plików — wstrzymano " +"aktualizacje oprogramowania" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"Tryb oszczędzania energii jest aktywny — wstrzymano aktualizacje " +"oprogramowania" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Tryb gier jest aktywny — wstrzymano aktualizacje oprogramowania" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Uruchom ponownie i zaktualizuj…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Z_aktualizuj wszystko" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Pobrano aktualizacje oprogramowania" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Aktualizacje są gotowe do zainstalowania" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Zintegrowane oprogramowanie sprzętowe" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Wymaga ponownego uruchomienia" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Aktualizacje programów" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Oprogramowanie sprzętowe urządzenia" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Pobierz" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "System %s %s jest dostępny" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "System %s jest dostępny" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Więcej informacji o nowej wersji" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Pobrano %s z %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Pobrano %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Duża aktualizacja, dodająca nowe funkcje i naprawiająca błędy." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Anuluje aktualizację" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Uruchom ponownie i zaktualizuj…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Przed aktualizacją należy utworzyć kopię zapasową danych i plików." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Informacje o błędzie" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Kopiuje informacje" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Usunięcie pliku „%s” się nie powiodło: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Usunięcie katalogu „%s” się nie powiodło: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Dodawanie, usuwanie i aktualizowanie oprogramowania na komputerze" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Aktualizacje;Aktualizuj;Zaktualizuj;Uaktualnienia;Uaktualnij;Update;Upgrade;" +"Źródła;Źródło;Repozytoria;Repozytorium,Preferencje;Opcje;Ustawienia;" +"Instalacja;Zainstaluj;Odinstaluj;Deinstalacja;Deinstaluj;Program;" +"Oprogramowanie;Software;Aplikacja;Aplikacje;App;Apps;Sklep;Store;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "„%s” jest gotowe" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"„%s” jest gotowe do włączenia, co nastąpi podczas następnego uruchomienia." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Włącz" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Aktualizacje systemu" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Ogólne aktualizacje systemu, takie jak poprawki zabezpieczeń i błędów oraz " +"ulepszenia wydajności." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Aktualizacja systemu %s, dodająca nowe funkcje i naprawiająca błędy." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Usługa aktualizacji EOS nie może pobrać i zastosować aktualizacji." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Program WWW" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Obsługa programów WWW" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Uruchamianie popularnych programów WWW w przeglądarce" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Aktualizacja zapewnia najnowsze funkcje oraz ulepszenia wydajności " +"i stabilności." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Obsługa pakietów Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak to system dla programów w systemie Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Katalog systemu %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Podkatalog domowy %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Katalogi systemu" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Konfiguracja systemu z /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Katalog pulpitu" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Podkatalog pulpitu %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Katalog dokumentów" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Podkatalog dokumentów %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Katalog muzyki" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Podkatalog muzyki %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Katalog obrazów" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Podkatalog obrazów %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Katalog publicznie udostępnianych" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Podkatalog publicznie udostępnianych %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Katalog wideo" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Podkatalog wideo %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Katalog szablonów" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Podkatalog szablonów %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Katalog pamięci podręcznej użytkownika" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Podkatalog pamięci podręcznej użytkownika %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Katalog konfiguracji użytkownika" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Podkatalog konfiguracji użytkownika %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Katalog danych użytkownika" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Podkatalog danych użytkownika %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Katalog wykonawczy użytkownika" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Podkatalog wykonawczy użytkownika %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Dostęp do systemu plików do %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1382 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Pobieranie metadanych Flatpak dla %s…" + +#: plugins/flatpak/gs-flatpak.c:3608 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Dopracowanie dodatku „%s” się nie powiodło: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instalacja użytkownika" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instalacja systemowa" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Identyfikator programu" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Dodanie do instalacji dla dodatku „%s” się nie powiodło: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Dodanie do odinstalowania dla dodatku „%s” się nie powiodło: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Repozytorium „%s” nie pozwala zainstalować „%s”, prawdopodobnie z powodu " +"jego filtru. Proszę usunąć filtr i powtórzyć instalację. Informacje " +"o błędzie: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Poziom naładowania komputera jest za niski, aby wykonać aktualizację" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Poziom naładowania komputera jest za niski, aby wykonać aktualizację (%u%%, " +"wymaga %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Nie można komunikować się z urządzeniem lub jest poza zasięgiem" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Poziom naładowania akumulatora urządzenia jest za niski" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"Poziom naładowania akumulatora urządzenia jest za niski (%u%%, wymaga %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Urządzenie oczekuje na zastosowanie aktualizacji" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Urządzenie wymaga podłączenia do prądu" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Nie można używać urządzenia, kiedy pokrywa jest zamknięta" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Aktualizacja urządzenia %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Aktualizacja komputera %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Aktualizacja wbudowanego kontrolera %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Aktualizacja podsystemu ME urządzenia %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Aktualizacja firmowego podsystemu ME urządzenia %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Aktualizacja podsystemu ME użytkownika końcowego urządzenia %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Aktualizacja kontrolera %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Aktualizacja kontrolera Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Aktualizacja mikrokodu procesora %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Aktualizacja konfiguracji %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Aktualizacja akumulatora %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Aktualizacja aparatu %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Aktualizacja TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Aktualizacja panelu dotykowego %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Aktualizacja myszy %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Aktualizacja klawiatury %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Aktualizacja kontrolera pamięci masowej %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Aktualizacja interfejsu sieciowego %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Aktualizacja ekranu %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Aktualizacja BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Aktualizacja odbiornika USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Aktualizacja dysku %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Aktualizacja dysku półprzewodnikowego %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Aktualizacja dysku SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Aktualizacja karty graficznej %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Aktualizacja stacji dokującej %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Aktualizacja replikatora portów USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Oprogramowanie sprzętowe" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Nie można zastosować aktualizacji oprogramowania sprzętowego: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Obsługa aktualizacji oprogramowania sprzętowego" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Dostarcza obsługę aktualizacji oprogramowania sprzętowego" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Zainstalować niepodpisane oprogramowanie?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Instalowane oprogramowanie nie jest podpisane. Sprawdzenie pochodzenia " +"aktualizacji tego oprogramowania ani czy aktualizacje są nienaruszone będzie " +"niemożliwe." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Pobrać niepodpisane oprogramowanie?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Dostępne są niepodpisane aktualizacje. Bez podpisu nie można sprawdzić " +"pochodzenia aktualizacji ani czy jest ona nienaruszona." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Zaktualizować niepodpisane oprogramowanie?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Dostępne są niepodpisane aktualizacje. Bez podpisu nie można sprawdzić " +"pochodzenia aktualizacji ani czy jest ona nienaruszona. Aktualizacje " +"oprogramowania będą wyłączone do czasu usunięcia lub zaktualizowania " +"niepodpisanych aktualizacji." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Zainstalowanie aktualizacji się nie powiodło: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pakiety" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Oczekiwanie na koniec transakcji przed pobraniem się nie powiodło: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Pobranie aktualizacji się nie powiodło: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Wywołanie aktualizacji się nie powiodło: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "System operacyjny (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Sklep Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Obsługa pakietów Snap" + +# This is an obvious lie. +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap to uniwersalny pakiet dla systemu Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "System" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Składnik systemu" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Usunięcie zadania sysupdate „%s” się nie powiodło ze stanem %i" diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 0000000..e349e62 --- /dev/null +++ b/po/pt.po @@ -0,0 +1,7984 @@ +# Portuguese translation for gnome-software. +# Copyright © 2014-2025 gnome-software +# This file is distributed under the same license as the gnome-software package. +# Tiago Santos , 2014, 2015, 2016. +# Pedro Albuquerque , 2015. +# Sérgio Cardeira , 2016. +# João Nuno Matos , 2020. +# Juliano de Souza Camargo , 2020. +# Hugo Carvalho , 2021. +# Luís Da Costa , 2024. +# João Carvalhinho , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-25 17:19+0000\n" +"PO-Revision-Date: 2025-02-25 22:52+0000\n" +"Last-Translator: Hugo Carvalho \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.5\n" +"X-DamnedLies-Scope: partial\n" +"X-Project-Style: gnome\n" +"X-DL-Team: pt\n" +"X-DL-Module: gnome-software\n" +"X-DL-Branch: main\n" +"X-DL-Domain: po\n" +"X-DL-State: Translating\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Software" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instalar e atualizar aplicações" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"O Software permite-lhe encontrar e instalar novas aplicações e extensões do " +"sistema, além de remover aplicações já instaladas." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"O Software apresenta aplicações populares em destaque com descrições úteis e " +"várias capturas de ecrã por aplicação. As aplicações podem ser encontradas " +"tanto ao navegar pela lista de categorias como ao procurar. Também lhe " +"permite atualizar o seu sistema utilizando uma atualização offline." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Painel geral" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Painel de detalhes" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Painel de aplicações instaladas" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Painel de atualizações" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Detalhes sobre as atualizações" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "O Projeto GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Teste a chave akmods no Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "A autenticação é necessária para testar a chave akmods no Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Registe a chave akmods para o Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "A autenticação é necessária para registar a chave akmods no Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Teste a chave DKMS no Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "A autenticação é necessária para testar a chave DKMS no Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Registar a chave DKMS no Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "A autenticação é necessária para registar a chave DKMS no Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalar um ficheiro appstream numa localização do sistema" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "A instalar um ficheiro appstream numa localização do sistema" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Lista de projetos compatíveis" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Esta é uma lista de projetos compatíveis que deverão aparecer como GNOME, " +"KDE e XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Se o GNOME Software deve ser usado para gerir atualizações" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Se desativado, o GNOME Software irá ocultar o painel de atualizações, " +"deixará de executá-las e notificá-las automaticamente." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Transferir e instalar atualizações automaticamente" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Se ativado, o GNOME Software transfere automaticamente atualizações em " +"segundo plano, e instala aquelas que não necessitam de um reinício do " +"sistema." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notificar utilizador acerca de atualização pendente em segundo plano" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Se ativado, o GNOME Software notificará o utilizador acerca de atualizações " +"que ocorreram quando o mesmo estava inativo." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Se recarregar automaticamente quando a ligação é limitada" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Se ativado, o GNOME Software atualiza automaticamente em segundo plano " +"quando a utilizar uma ligação limitada (eventualmente transfere alguns " +"metadados, procura por atualizações, etc... que podem implicar em gastos ao " +"utilizador)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Se é a primeira vez que o GNOME Software é executado" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Mostrar a classificação por estrelas à frente das aplicações" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtra aplicações baseado na ramificação predefinida especificada como remota" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Aplicações non-free(gratuitas ou de código aberto) mostram um aviso antes de " +"serem instaladas" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Quando aplicações não livres são instaladas um aviso é mostrado. Isto " +"controla se o aviso é suprimido." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "A última verificação de data e hora" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "A data e hora da última notificação de atualização" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "A data e hora da última notificação de atualização" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"A data e hora da primeira atualização de segurança, limpo depois da " +"atualização" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "O data e hora da última atualização" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"O tempo (em segundos) para verificar se a imagem de versão mais recente " +"ainda é válida" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Escolher um número maior implicará em menos viagens de ida e volta ao " +"servidor remoto, mas atualizações de imagens podem demorar a chegar ao " +"utilizador. Um valor 0 significa nunca verificar junto ao servidor se a " +"imagem já existe em memória." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "O servidor a utilizar para análises de aplicações" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "O valor mínimo de karma para as análises" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Análises com karma menor que este número não serão mostradas." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Uma lista oficial de fontes que não deverão ser consideradas como de " +"terceiros" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Uma lista de repositórios necessários que não podem ser desativados ou " +"removidos" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Uma lista oficial de fontes que deverão ser consideradas como contendo " +"apenas software livre" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"O URL da licença a ser utilizado quando uma aplicação deve ser considerada " +"como software livre" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Instalar aplicações associadas em todos os utilizadores do sistema sempre " +"que possível" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Permitir acesso ao diálogo Repositórios de Software" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Oferecer atualizações para pré-lançamentos" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Mostrar alguns elementos do IU a informar o utilizador que a aplicação não é " +"livre" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Ver o tamanho ocupado pelas aplicações instalada na lista de aplicações " +"instaladas" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "O URI que explica o software não-livre e proprietário" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"A lista de URLs a apontar aos ficheiros 'appstream' que serão transferidos " +"para uma pasta 'swcatalog'" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instalar os ficheiros 'AppStream' numa localização do sistema para todos " +"utilizadores. Se falso, os ficheiros são instalados num diretório " +"$XDG_DATA_HOME/swcatalog/xml não-predefinido" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Ordem prioritária de formatos de empacotamento a preferir, com os formatos " +"mais importantes listados primeiro. Uma matriz vazia significa a ordem " +"predefinida. Os formatos omitidos são assumidos como os últimos a serem " +"listados. Exemplos de formatos de empacotamento são: deb, flatpak, rpm, " +"snap. Os formatos podem ser opcionalmente especificados com um nome de " +"origem, dividido por dois pontos, por exemplo 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"O carimbo temporal da última tentativa de remover os tempos de execução não " +"utilizados do Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Definir para 'verdadeiro' para mostrar apenas aplicações licenciadas " +"livremente e ocultar todas as aplicações proprietárias." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Defina como 'verdadeiro' para mostrar apenas aplicações de programadores " +"cuja identidade tenha sido verificada." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "A data e hora das últimas atualizações históricas recebidas." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Um texto a gravar o id utilizado no início de sessão da conta online Gnome" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Instalador global AppStream do GNOME Software" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Falha ao processar os argumentos da linha de comando" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "É necessário especificar um, e só um, nome de ficheiro" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Este programa pode apenas ser usado pelo utilizador root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Falha ao validar o tipo de conteúdo: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Falha ao mover: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalação de aplicações" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instalar as aplicações selecionadas no seu sistema" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violência dos desenhos animados" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nenhuma informação sobre a violência dos desenhos animados" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violência fantasiosa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nenhuma informação sobre violência fantasiosa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violência realista" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nenhuma informação sobre violência realista" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violência que representa o derramamento de sangue" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Nenhuma informação sobre derramamento de sangue" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violência sexual" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nenhuma informação sobre violência sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Álcool" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nenhuma informação relativa a referências a álcool" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narcóticos" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nenhuma informação relativa a referências a drogas ilícitas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabaco" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Nenhuma informação relativa a referências a produtos do tabaco" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nudez" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nenhuma informação sobre a nudez de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Temas sexuais" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Nenhuma informação relativa a referências ou representações de natureza " +"sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Profanidade" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nenhuma informação sobre profanidades de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Humor inapropriado" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nenhuma informação sobre humor inapropriado" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminação" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Nenhuma informação sobre linguagem discriminatória de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Publicidade" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nenhuma informação sobre publicidade de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Jogos de azar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nenhuma informação sobre jogos de apostas de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Compras" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nenhuma informação sobre a possibilidade de gastar dinheiro" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Conversa entre utilizadores" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" +"Nenhuma informação relativa a formas de conversar com outros utilizadores" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Conversa áudio entre utilizadores" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Nenhuma informação relativa a formas de falar com outros utilizadores" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detalhes do contato" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nenhuma informação relativa à partilha de nomes de utilizador de redes " +"sociais ou endereços de correio eletrónico" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informação de identificação" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Nenhuma informação relativa à partilha de informação do utilizador com " +"terceiros" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Partilha de localização" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Nenhuma informação relativa à partilha de localização física com outros " +"utilizadores" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homossexualidade" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nenhuma informação relativa a referências à homossexualidade" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostituição" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nenhuma informação relativa a referências à prostituição" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adultério" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nenhuma informação relativa a referências a adultério" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Personagens sexualizadas" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nenhuma informação relativa a personagens sexualizadas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanação" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nenhuma informação relativa a referências à profanação" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Restos Humanos" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nenhuma informação relativa a restos mortais humanos visíveis" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Escravidão" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nenhuma informação relativa a referências à escravatura" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Não inclui referências a drogas" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Não inclui palavrões, profanidades, e outros tipos de linguagem forte" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Não inclui anúncios ou transações monetárias" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Não inclui sexo ou nudez" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Não inclui a funcionalidade de conversa não controlada" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Não inclui violência" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogas" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Linguagem forte" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Dinheiro" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violência" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Todas" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s tem uma classificação etária desconhecida" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s é adequado para todos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s é adequado para crianças" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s é adequado para crianças pequenas" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s é adequado para crianças" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s é adequado para adolescentes" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s é adequado para adultos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s é adequado para %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Classificação etária" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "Como contribuir com informação em falta" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Ficheiro local" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Pacote" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Pendente" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Instalação pendente" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Remoção pendente" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "A instalar" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "A remover" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "A transferir" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instalar" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Desinstalar…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Rede" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Pode comunicar através da rede" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Serviços do Sistema" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Pode aceder a serviços D-Bus através do barramento do sistema" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Serviços da Sessão" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Pode aceder a serviços D-Bus através do barramento da sessão" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Dispositivos" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Pode aceder a ficheiros arbitrários tais como webcams" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Pode aceder a dispositivos de entrada" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Pode aceder aos microfones e reproduzir áudio" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Pode aceder diretamente aos dispositivos do sistema" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Conteúdo do ecrã" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Pode aceder ao conteúdo do ecrã" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Pasta pessoal" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Pode ver, editar, e criar ficheiros" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Pode ver ficheiros" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistema de ficheiros" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Pasta das transferências" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Definições" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Pode ver e modificar quaisquer definições" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistema de visualização antigo" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Usa um sistema de visualização antigo e inseguro" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Evasão da sandbox" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Pode sair da sandbox e evitar quaisquer outras restrições à execução" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Nenhuma descrição de atualização foi fornecida." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Detalhes da atualização" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Requer permissões adicionais" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Os dados de classificação recebidos do servidor são inválidos" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Não foi possível comunicar com o servidor de classificações" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Análises" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Não foram encontradas análises sobre esta aplicação." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Sem análises" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Histórico da versão" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novidade na versão %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versão %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Sem detalhes para este lançamento" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Modo de inicialização: pode ser \"updates\" (para atualizações), \"updated\" " +"(para atualizados), \"installed\" (para instalados) ou \"overview\" (para " +"visão geral)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODO" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Procurar aplicações" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "PROCURAR" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Mostrar detalhes da aplicação (usando o ID da aplicação)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Mostrar detalhes da aplicação (usando o nome do pacote)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NOMEDOPACOTE" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instalar aplicação (usando o seu ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Desinstalar a aplicação (usando o ID da aplicação)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Abrir um ficheiro de pacote local" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NOMEDOFICHEIRO" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"O tipo de interação esperada para esta ação: 'nenhuma', 'notificar', ou " +"'completa'" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAÇÃO" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Mostra um ficheiro metainfo ou appdata local" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Ativar o resultado de depuração detalhado (da instância em execução, se já " +"estiver em execução)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instala qualquer atualização pendente em segundo plano" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Mostrar preferências" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Sair da instância atual" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferir ficheiros locais de origens à AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Mostrar número da versão" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Direitos de autor © 2016-2023 Colaboradores do GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Hugo Carvalho \n" +"Tiago Santos \n" +"Pedro Albuquerque \n" +"João Nuno Matos \n" +"Juliano de Souza Camargo \n" +"Luís Da Costa \n" +"João Carvalhinho " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Ups! Não foram encontrados detalhes sobre a aplicação." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Tamanho instalado" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inclui %s de dados e %s de cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inclui %s de dados" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inclui %s de cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Cache e uso de dados desconhecidos" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Tamanho da transferência" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Não necessita de transferências adicionais do sistema" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "" +"Necessita de um tamanho desconhecido de transferências adicionais do sistema" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Necessita de %s de transferências adicionais do sistema" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "O tamanho é desconhecido" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Sem permissões" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Tem acesso à rede" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Usa serviços do sistema" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Usa serviços de sessão" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Pode aceder aos dispositivos do equipamento" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Pode aceder diretamente aos dispositivos do sistema" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Pode ler/gravar todos os seus dados" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Pode ler todos os seus dados" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Pode ler/gravar as suas transferências" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Pode ler as suas transferências" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Pode aceder a alguns ficheiros específicos" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Pode aceder e alterar as definições do utilizador" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Usa um sistema de janelas antigo" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Pode adquirir permissões arbitrárias" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "O programador do software está verificado" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Revisto pelo distribuidor do SO" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Revisto por %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Fornecido por terceiros" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Software já não suportado" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Código auditável" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Licença desconhecida" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Código proprietário" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Licença especial" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privilegiado" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Seguro" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Provavelmente seguro" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potencialmente Inseguro" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Inseguro" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Apenas no telemóvel" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Apenas funciona num ecrã pequeno" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Apenas no computador" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Apenas funciona num ecrã grande" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Incompatibilidade de tamanho do ecrã" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Não suporta o tamanho atual do ecrã" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Requer um ecrã sensível ao toque" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Requer um teclado" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Requer um rato" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "É necessário um controlador" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Requer um controlador para jogar" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptável" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Funciona em telefones, tablets e computadores" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Provavelmente requer um teclado ou rato" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Funciona em computadores de secretária e portáteis" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Não contém conteúdo impróprio para a idade" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Nenhuma informação de classificação etária disponível" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visitar a página web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instalar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Cancelar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instalar" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Transferir" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Atualizar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Desinstalar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "A desinstalar" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Atualização crítica" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "O dispositivo não pode ser usado durante a atualização." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Fonte: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Renomeado de %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Parou de receber atualizações" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Atualização crítica" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalado" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Ajudar a traduzir %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s é concebida, desenvolvida e traduzida por uma comunidade internacional de " +"voluntários.\n" +"\n" +"Isto significa que, embora ainda não esteja disponível no seu idioma, pode " +"participar e ajudar a traduzi-la você mesmo." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traduções" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Website de tradução" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Autenticação remota necessária %s (domínio %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Autenticação necessária" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Cancelar" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Início de sessão" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Utilizador" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Palavra-passe" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Outros" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Todas" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Destaques" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Escolha de Editor" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Novo e atualizado" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Escolhas da Web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Outro software" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s Instalada" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "" +"É necessário reiniciar o dispositivo para que as mudanças tenham efeito" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "A aplicação está pronta a ser usada" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Atualizações do sistema instaladas" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Há atualizações recentes que podem ser revistas" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Reiniciar" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Iniciar" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Instalar software?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Instalar aplicações de terceiros?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Ativar o repositório de software?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Ativar fontes de software de terceiros?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s não é um programa livre e de código aberto, e " +"é fornecido por “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s é fornecido por “%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Esta fonte de software tem de ser ativada para continuar a instalação." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Poderá ser ilegal instalar ou usar %s nalguns países." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Poderá ser ilegal instalar ou usar este codec nalguns países." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Não avisar novamente" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Ativar e _instalar" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Seguem os erros detalhados do gestor de pacotes:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detalhes" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Fechar" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Detalhes copiados para a área de transferência" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Aceitar" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Foi instalada uma atualização" +msgstr[1] "Foram instaladas aplicações" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Foi instalada uma aplicação" +msgstr[1] "Foram instaladas aplicações" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "" +"É necessário reiniciar o dispositivo para que a alteração surta efeito" +msgstr[1] "" +"É necessário reiniciar o dispositivo para que as alterações surtam efeito" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Agora não" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Hoje" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Ontem" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Há %d dia atrás" +msgstr[1] "Há %d dias atrás" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Há %d semana atrás" +msgstr[1] "Há %d semanas atrás" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Há %d mês atrás" +msgstr[1] "Há %d meses atrás" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Há %d ano atrás" +msgstr[1] "Há %d anos atrás" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Agora mesmo" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Há %d minuto atrás" +msgstr[1] "Há %d minutos atrás" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Há %d hora atrás" +msgstr[1] "Há %d horas atrás" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Tudo" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Gráficos em 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografia" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Digitalização" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Gráficos vetoriais" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visualizadores" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Criação e edição de áudio" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Reprodutores de música" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Tudo" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendários" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Base de dados" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finanças" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Processadores de texto" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editores de texto" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navegadores de Internet" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Tudo" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Ação" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventura" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcada" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocos" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Tabuleiro" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartas" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emuladores" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Infantil" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Lógica" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "RPG" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Desporto" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estratégia" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Tudo" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Conversação" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Tudo" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Inteligência Artificial" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomia" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Química" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Idiomas" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matemática" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Notícias" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robótica" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Arte" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografia" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Banda Desenhada" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Ficção" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Saúde" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "História" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Estilo de vida" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Política" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Desporto" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Tudo" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Depuradores" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Ambientes de desenvolvimento integrado" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codificadores" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Controladores de dispositivos" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Tipos de letra" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Fontes de entrada" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Pacotes de idiomas" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localização" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Criar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Trabalho" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Jogar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Aprender" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Desenvolver" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codificadores" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Controladores de hardware" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Tipos de letra" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Fontes de entrada" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Pacotes de idiomas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Localização" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Uma aplicação" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s está a pedir suporte adicional a formato de ficheiro." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Tipos MIME adicionais necessários" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s está a pedir tipos de letra adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Tipos de letra adicionais necessários" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s está a pedir codecs multimédia adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Codecs multimédia adicionais necessários" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s está a pedir controladores de impressora adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Controladores de impressora adicionais necessários" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s está a pedir pacotes adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Pacotes adicionais requeridos" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Localizar em Software" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "Mostrar mai_s" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Mostrar menos" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "A remover…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "É necessário reiniciar para terminar a instalação" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "É necessário reiniciar para terminar a remoção" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Instalação pendente…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Atualização pendente…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "A transferir…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "A preparar…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "A desinstalar…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s não está instalado, mas ainda tem dados presentes." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Reiniciar" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Ativar…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instalar…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s aparecerá em inglês dos EUA" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Esta aplicação aparecerá em inglês dos EUA" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Esta aplicação aparecerá em inglês dos EUA" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Ajude a _traduzir" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Outras aplicações por %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "O programador %s comprovou a propriedade de %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "O programador comprovou a propriedade de %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "É necessário conexão à Internet para escrever uma avaliação" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Esta aplicação já não está a receber atualizações, incluindo correções de " +"segurança" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Esta aplicação já é fornecida pela sua distribuição e não deve ser " +"substituída." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Esta aplicação não fornece quaisquer ligações a um website, repositório de " +"código ou rastreador de problemas." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Este software já não está a receber atualizações, incluindo correções de " +"segurança" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Esta aplicação já é fornecida pela sua distribuição e não deve ser " +"substituída." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"O software não fornece quaisquer ligações a um website, repositório de " +"código ou rastreador de problemas." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"O software não conseguiu recuperar as informações de \"%s\" e não pode " +"mostrar os detalhes dessa aplicação." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Os dados de análise recebidos do servidor são inválidos" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Falha ao submeter a revisão para \"%s\": %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Página de detalhes" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "A carregar os detalhes das aplicações" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verificado" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Abrir" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Atualizar" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Desinstalar" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Complementos" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Esta aplicação apenas pode ser usada se tiver uma ligação à Internet ativa." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Fonte de software incluída" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Esta aplicação inclui um repositório de software que fornece atualizações, " +"assim como acesso a outro software." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Sem fontes de software incluídas" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Esta aplicação não inclui um repositório de software. Não será atualizada " +"com novas versões." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Fonte de software identificada" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Adicionar esta fonte de software dar-lhe-á acesso a aplicações e " +"atualizações adicionais." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Utilize apenas repositórios de software em que confie." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Limpar dados de aplicações" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "El_iminar dados" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Sem metadados" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Página do _Website" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Doar" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Contribuir com _tradução" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Reportar um problema" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Ajuda" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contactar" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Escrever análise" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Todas as análises" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Impossível mostrar detalhes da aplicação" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Falha ao preparar o arranque" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Erro desconhecido" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "A chave não foi encontrada" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "A chave não foi registada" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "É necessário registo de chave MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "Seguinte" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Este dispositivo tem o Arranque Seguro ativado. Para permitir a ativação de " +"novos controladores, uma nova Chave de Dono da Máquina (MOK) tem que ser " +"registada. O processo requer a inserção de uma palavra-passe durante o " +"processo. Anote a seguinte palavra-passe associada com a Chave:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Já tomei nota da _palavra passe MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Reiniciar e registar…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instruções de instalação: Por favor leia atentamente" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Depois de reiniciar, um ecrã de configuração do dispositivo será " +"apresentado. Para ativar novos controladores, prossiga com os passos de " +"configuração:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Selecione “Enroll MOK”\n" +"• Selecione “Yes” para registar as chaves\n" +"• Insira a palavra-passe MOK quando requisitada\n" +"• Finalmente selecione \"Reiniciar\"" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Implicações de segurança" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Após um registo de chave com sucesso, tenha em atenção que qualquer " +"atualização futura ao módulo ou qualquer outro módulo será confiada " +"implicitamente. Todas as atualizações futuras acontecerão com transparência " +"e sem qualquer interação ou autorização." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Informações adicionais podem ser encontradas na documentação." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "A transferir ficheiros de metadados adicionais…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " e " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tipos de letras disponíveis para a escrita %s" +msgstr[1] "Tipos de letra disponíveis para as escritas %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Software disponível para o %s" +msgstr[1] "Software disponível para os %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Software solicitado não encontrado" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Falha ao encontrar o software solicitado" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s não encontrado" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "na página web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Não existem aplicações disponíveis que forneçam o ficheiro %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informação sobre %s, bem como as opções de como obter aplicações em falta " +"podem ser encontrada em %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Não existem aplicações disponíveis para suporte a %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s indisponível." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informação sobre %s, bem como as opções de como obter uma aplicação que " +"suporte este formato podem ser encontrada em %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Sem letras disponíveis para suporte ao script %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informações sobre %s, bem como as opções de como obter letras adicionais " +"podem ser encontradas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Não há complementos de codecs disponíveis para o formato %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informações sobre %s, bem como as opções de como obter um codec que possa " +"reproduzir este formato podem ser encontradas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Não há recursos de Plasma disponíveis para suporte a %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informações sobre %s, bem como as opções de como obter recursos Plasma " +"adicionais podem ser encontradas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Não há controladores de impressora disponíveis para %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informações sobre %s, bem como as opções de como obter um controlador que " +"suporte esta impressora podem ser encontradas %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "a documentação" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Incapaz de encontrar o %s solicitado por %s. Veja %s para mais informações." +msgstr[1] "" +"Incapaz de encontrar os %s solicitado por %s. Veja %s para mais informações." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Infelizmente o %s que procura não foi encontrado. Veja %s para mais " +"informação." +msgstr[1] "" +"Infelizmente o %s que procura não foram encontrados. Veja %s para mais " +"informação." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Falha ao localizar resultados da procura: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Formato de ficheiro %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Instalar _tudo" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Impossível encontrar o software solicitado" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Página de codecs" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Pesquisa sem resultados" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Impossível realizar pesquisa" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Anterior" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Seguinte" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Lista de aplicações em destaque" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Suporte a desktop" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Suporta ser utilizado num ecrã grande" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Suporte desconhecido a desktop" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Não há informações suficientes para saber se os ecrãs grandes são suportados" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Requer um ecrã grande" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Desktop não suportado" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Não pode ser usado num ecrã grande" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Suporte a dispositivo móvel" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Suporta ser utilizado num ecrã pequeno" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Suporte desconhecido a dispositivo móvel" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Não há informações suficientes para saber se os ecrãs pequenos são suportados" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Requer um ecrã pequeno" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Dispositivo móvel não suportado" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Não pode ser utilizado num ecrã pequeno" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Suporte a teclado" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Suporte desconhecido a teclado" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" +"Não há informações suficientes para saber se os teclados são suportados" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Teclado necessário" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Tem suporte a teclados" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Teclado não suportado" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Não pode ser usado com um teclado" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Suporte ao rato" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Requer um rato ou dispositivo apontador" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Suporte desconhecido ao rato" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Não há informações suficientes para saber se os ratos ou dispositivos " +"apontadores são suportados" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Rato necessário" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Tem suporte a ratos e dispositivos apontadores" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Rato não suportado" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Não pode ser usado com um rato ou dispositivo apontador" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Suporte a ecrã tátil" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Suporte desconhecido a ecrã tátil" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Não há informações suficientes para saber se os ecrãs táteis são suportados" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Ecrã tátil necessário" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Tem suporte a ecrãs táteis" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Ecrã tátil não suportado" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Não pode ser utilizado com um ecrã tátil" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Controlador de jogo necessário" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Requer um controlador de jogo" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Suporte a controlador de jogo" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Tem suporte a controladores de jogo" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s provavelmente funciona neste dispositivo" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s funciona neste dispositivo" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s provavelmente funciona neste dispositivo" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s não vai funcionar corretamente neste dispositivo" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s não vai funcionar neste dispositivo" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Suporte a hardware" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navegação" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navegar para a página Explorar" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navegar para a página Instalado" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navegar para a página Atualizações" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Abrir página de pesquisa" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Janelas" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Abre as Preferências" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Abrir Repositórios de Software" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Ajuda" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Abrir Teclas de atalho" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalado" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Página de instaladas" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Em curso" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplicações" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Aplicações web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Aplicações do sistema" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Compilado pela comunidade" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Participe" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Esta aplicação é desenvolvida de forma aberta por uma comunidade " +"internacional de voluntários e disponibilizado sob a licença %s licença.\n" +"\n" +"Pode contribuir e ajudar a torná-la ainda melhor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Esta aplicação é desenvolvida de forma aberta por uma comunidade " +"internacional de voluntários e disponibilizada sob a licença %s.\n" +"\n" +"Pode contribuir e ajudar a torná-la ainda melhor." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este software é desenvolvido de forma aberta por uma comunidade " +"internacional de voluntários e disponibilizado sob a licença %s licença.\n" +"\n" +"Pode contribuir e ajudar a torná-lo ainda melhor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este software é desenvolvido de forma aberta por uma comunidade " +"internacional de voluntários e disponibilizada sob a licença %s.\n" +"\n" +"Pode contribuir e ajudar a torná-lo ainda melhor." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Licença desconhecida" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Saiba mais" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Esta aplicação não especifica a licença ao abrigo da qual foi desenvolvida e " +"pode ser proprietária. Pode ser insegura de formas difíceis de detetar e " +"pode ser alterada sem supervisão.\n" +"\n" +"Pode ou não ser possível contribuir para esta aplicação." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software não especifica a licença ao abrigo da qual foi desenvolvido e " +"pode ser proprietário. Pode ser inseguro de formas que são difíceis de " +"detetar e pode mudar sem supervisão.\n" +"\n" +"Pode ou não ser possível contribuir para este software." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Proprietário" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Esta aplicação não é desenvolvida de forma aberta, pelo que apenas os seus " +"programadores sabem como funciona. Pode ser insegura de formas difíceis de " +"detetar e pode mudar sem supervisão.\n" +"\n" +"Poderá não ser possível contribuir para esta aplicação." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Este software não é desenvolvido abertamente, por isso apenas os seus " +"programadores sabem como ele funciona. Pode ser inseguro em maneiras " +"difíceis de detetar e pode\n" +"alterar sem supervisão.\n" +"\n" +"Poderá não ser possível contribuir para este software." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Licença especial" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Esta aplicação foi desenvolvida sob uma licença especial %s.\n" +"\n" +"Poderá, ou não, contribuir para esta aplicação." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Esta aplicação é desenvolvida sob a licença especial “%s”.\n" +"\n" +"Poderá, ou não, contribuir para esta aplicação." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software é desenvolvido sob a licença especial %s.\n" +"\n" +"Poderá, ou não, contribuir para este programa." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este software é desenvolvido sob a licença especial “%s”.\n" +"\n" +"Poderá, ou não, contribuir para este software." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Atualizar Dados" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "A abrir página" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "A iniciar" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Fonte desconhecida" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Utilizador" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Adições" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Remoções" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Atualizações" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Reversões" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "fontes externas selecionadas" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Fornece acesso a software adicional a partir de %s. Está incluído algum " +"software proprietário.\n" +"\n" +"Pode ativar esses repositórios mais tarde nas preferências de Repositórios " +"de Software." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Ativar repositórios de software de terceiros?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorar" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Ativar" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Disponível para o seu sistema operativo" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Disponível para %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Explorar" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Visão geral" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Aplicações disponíveis" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Outras categorias" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nenhuns dados de aplicação encontrados" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Desconhecida" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "A_ceitar" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "O utilizador recusou a instalação" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Preparar %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Tem certeza que quer remover %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Todas as aplicações de %s serão desinstaladas, e terá de reinstalar o " +"repositório para as utilizar novamente." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Desinstalar %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Não será possível utilizar %s após a remoção." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Não será possível utilizar qualquer aplicação que dependa de %s após a sua " +"remoção." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Não será possível utilizar %s após a remoção, e qualquer documento que use " +"será exibido com um tipo de letra diferente." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Não será possível utilizar %s após a remoção. Isto pode significar que " +"alguns ficheiros de media poderão ficar indisponíveis." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Equipamento que dependa de %s pode não funcionar corretamente após a remoção." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Não será possível utilizar %s após a remoção. Os dados e definições da " +"aplicação serão mantidos no disco, para permitir restaurar a aplicação no " +"futuro." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferências" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Atualizações de Software" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Mais informação" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"A verificação e transferência de atualizações utilizam dados e energia. " +"Assim, as funcionalidades de atualização automática são pausadas quando em " +"ligações de rede com tarifação fixa e quando o modo de poupança de energia " +"está ativado." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "Automática" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Procurar e transferir atualizações automaticamente" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" +"A verificação e a transferência de atualizações devem ser feitos manualmente" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Notificações de atualizações automáticas" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "" +"Mostrar notificações quando atualizações forem instaladas automaticamente" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtros de conteúdo" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Mostrar apenas software _livre" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Ocultar software proprietário ao navegar e procurar" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Mostrar apenas programadores _verificados" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Mostrar apenas aplicações de programadores cuja identidade foi verificada" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"O software instalado é incompatível com o %s, e será automaticamente " +"removido durante a atualização." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Software incompatível" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "Atualizar" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Desinstalar" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Definições e dados da aplicação" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Manter" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Permite restaurar as definições e o conteúdo da aplicação" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Eliminar" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Elimina permanentemente os dados para poupar espaço no disco" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"O software que foi instalado a partir do \"%s\" deixará de receber " +"atualizações." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Desativar o repositório?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Remover o repositório?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Desativar" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Remover" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Ativar novos repositórios" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Ativar novos repositórios quando estes são adicionados" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "mais informação" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Repositórios adicionais de terceiros selecionados - %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Repositórios de terceiros do Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "o sistema operativo" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Estes repositórios de software suplementam o software predefinido do %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Repositórios de Software" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Sem repositórios" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplicação instalada" +msgstr[1] "%u aplicações instaladas" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u complemento instalado" +msgstr[1] "%u complementos instalados" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplicação" +msgstr[1] "%u aplicações" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u complemento" +msgstr[1] "%u complementos" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s e %s instaladas" +msgstr[1] "%s e %s instaladas" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "A verificar software instalado…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Remover" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Odeio" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Não gosto" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Tudo bem" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Gosto" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Muito boa" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Selecione uma estrela para deixar uma classificação" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Demore mais tempo para escrever a sua análise" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Escolha uma classificação em estrelas" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "O resumo é demasiado curto" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "O resumo é demasiado longo" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "A descrição é demasiado curta" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "A descrição é demasiado longa" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Escreva uma análise" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Enviar" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Por favor, forneça uma classificação, resumo e texto de avaliação. As " +"avaliações não devem ser usadas para reportar problemas: em vez disso, " +"contacte o programador ou o seu fornecedor de suporte." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Resumo da análise" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Escreva uma curta análise" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Saiba que dados são enviados na nossa política de privacidade. O nome completo anexado à sua conta " +"será mostrado publicamente." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u análise total" +msgstr[1] "%u análises totais" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "de 5 estrelas" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Desconhecido" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Pode reportar análises por comportamento abusivo, rude ou discriminatório." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Uma vez reportada, a análise ficará oculta até que seja verificada por um " +"administrador." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Reportar análise?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Reportar" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Remover análise?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "A remoção de uma análise não pode ser anulada." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Gostar da análise" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Não gostar da análise" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Reporte…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Remover…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"A aplicação não passa por uma sandbox mas a distribuição verificou que não é " +"maliciosa" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Verifique se confia no fornecedor, uma vez que a aplicação não passa por uma " +"sandbox" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Sem permissões" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "A aplicação é totalmente executada numa caixa de proteção" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Acesso à rede" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Pode aceder à Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Sem acesso à rede" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Não é possível aceder à Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Usa serviços do sistema" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Pode requisitar dados aos serviços do sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Usa serviços da sessão" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Pode requisitar dados dos serviços da sessão" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Acesso ao dispositivo do utilizador" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Pode aceder a dispositivos tais como webcams ou controladores de jogos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Sem acesso ao dispositivo do utilizador" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Não é possível aceder a dispositivos tais como webcams ou controladores de " +"jogos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Acesso ao Dispositivo de Entrada" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Acesso ao microfone e à reprodução de áudio" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Pode ouvir usando microfone e reproduzir áudios sem pedir permissão" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Acesso ao dispositivo do sistema" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Pode aceder aos dispositivos do sistema que requerem permissões elevadas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Acesso aos conteúdos do ecrã" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Pode aceder aos conteúdos do ecrã ou de outras janelas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Sistema de janelas antigo" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Permissões arbitrárias" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Definições do utilizador" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Acesso de leitura/gravar a todo o sistema de ficheiros" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Pode ler e gravar todos os dados no sistema de ficheiros" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Acesso de leitura/gravar na pasta pessoal" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Pode ler e gravar todos os seus dados na sua pasta pessoal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Acesso de leitura a todo o sistema de ficheiros" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Pode ler todos os dados no sistema de ficheiros" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Acesso de leitura da pasta pessoal" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Pode ler todos os dados no diretório da pasta pessoal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Acesso de leitura/gravar à pasta de Transferências" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Pode ler e gravar todos os dados no seu diretório de transferências" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Acesso de leitura à pasta de Transferências" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Pode ler todos os dados no seu diretório de transferências" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Pode ler e gravar todos os dados no diretório" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Pode ler todos os dados no diretório" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Sem acesso ao sistema de ficheiros" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Não é possível aceder ao sistema de ficheiros" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "O programador da aplicação está verificado" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Foi verificado que o programador desta aplicação é quem diz ser" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Dependências inseguras" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"O software ou as suas dependências já não são suportados e podem ser " +"inseguros" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Esta aplicação não especifica sob que licença é desenvolvida, e pode ser " +"proprietária" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Este software não especifica sob que licença é desenvolvido, e pode ser " +"proprietário" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Código proprietário" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"O código fonte não é público, pelo que não pode ser objeto de auditoria " +"independente e pode não ser seguro" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Esta aplicação é desenvolvida sob a licença especial “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Este software é desenvolvido sob a licença especial “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Código auditável" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"O código fonte é público e pode ser auditado independentemente, o que torna " +"a aplicação mais segura" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s é privilegiado" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s é segura" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s é provavelmente segura" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s é potencialmente insegura" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s é insegura" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Desconhecida" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Segurança" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licença" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Fonte" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Esta aplicação usa uma versão desatualizada da Plataforma de Desenvolvimento " +"de Software (SDK) e pode conter erros ou vulnerabilidades de segurança que " +"não serão corrigidos." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Captura de ecrã anterior" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Captura de ecrã seguinte" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Sem capturas de ecrã" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Impossível encontrar captura de ecrã" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Falha ao carregar imagem" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Impossível encontrar tamanho da captura de ecrã" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Impossível criar cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Captura de ecrã inválida" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Captura de ecrã indisponível" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Captura de ecrã" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "Mais %u correspondência" +msgstr[1] "Mais %u correspondências" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Página de procura" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Procurar por Aplicações" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Nenhuma aplicação encontrada" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Não foi possível transferir atualizações" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Não foi possível transferir atualizações de firmware" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Não foi possível transferir atualizações de firmware de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Não foi possível transferir atualizações de %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Não foi possível atualizar: acesso à Internet é necessário" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Não foi possível atualizar: não há espaço suficiente em disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Não foi possível transferir atualizações de %s: sem espaço suficiente" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Não foi possível atualizar: autenticação necessária" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Não foi possível atualizar: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Não foi possível atualizar: é necessária autorização" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Não foi possível transferir atualizações: não tem permissões para instalar " +"software" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Não foi possível obter a lista de atualizações" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Não foi possível instalar: transferência falhada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "" +"Não foi possível instalar %s porque a transferência a partir de %s falhou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Não foi possível instalar %s: transferência falhada" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Não foi possível instalar: runtime em falta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "" +"Não foi possível instalar %s porque o ambiente de execução %s não está " +"disponível" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Não foi possível instalar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Não foi possível instalar: é necessário acesso à Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Não foi possível instalar: formato de aplicação inválido" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Não foi possível instalar: espaço em disco insuficiente" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Não foi possível instalar %s: espaço em disco insuficiente" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Não foi possível instalar: autenticação necessária" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Não foi possível instalar %s: autenticação necessária" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Não foi possível instalar: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Não foi possível instalar %s: autenticação inválida" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Não foi possível instalar: permissão necessária" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Não foi possível instalar %s: permissão necessária" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Não foi possível instalar: o dispositivo tem de estar ligado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Não foi possível instalar %s: o dispositivo tem de estar ligado" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Não foi possível instalar: bateria fraca" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Não foi possível instalar %s: bateria fraca" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Não foi possível atualizar %s a partir de %s: falha na transferência" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Não foi possível atualizar %s: transferência falhada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Não foi possível instalar atualizações a partir da fonte %s: transferência " +"falhou" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Não foi possível atualizar: transferência falhada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Não foi possível atualizar %s: não há espaço suficiente" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Não foi possível atualizar %s: autenticação necessária" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Não foi possível atualizar %s: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Não foi possível atualizar %s: é necessária autorização" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Não foi possível atualizar: o dispositivo tem de estar ligado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Não foi possível atualizar %s: o dispositivo tem de estar ligado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Não foi possível atualizar: bateria fraca" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Não foi possível atualizar %s: bateria fraca" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Não foi possível atualizar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Não foi possível atualizar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Não foi possível atualizar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Não foi possível atualizar do %s para o %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Não foi possível atualizar: transferência falhada" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Não foi possível atualizar para o %s: transferência falhada" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Não foi possível atualizar: é necessário acesso à Internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Não foi possível atualizar para o %s: é necessário acesso à Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Não foi possível atualizar: espaço em disco insuficiente" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Não foi possível atualizar para o %s: espaço em disco insuficiente" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Não foi possível atualizar: autenticação necessária" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Não foi possível atualizar para o %s: autenticação necessária" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Não foi possível atualizar: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Não foi possível atualizar para o %s: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Não foi possível atualizar: permissão necessária" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Não foi possível atualizar para o %s: permissão necessária" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Não foi possível atualizar: o dispositivo tem de estar ligado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Não foi possível atualizar para o %s: o dispositivo tem de estar ligado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Não foi possível atualizar: bateria fraca" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Não foi possível atualizar para o %s: bateria fraca" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Não foi possível atualizar para o %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Não foi possível desinstalar: autenticação necessária" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Não foi possível desinstalar %s: autenticação necessária" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Não foi possível desinstalar: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Não foi possível desinstalar %s: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Não foi possível desinstalar: permissão necessária" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Não foi possível desinstalar %s: permissão necessária" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Não foi possível desinstalar: o dispositivo tem de estar ligado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Não foi possível desinstalar %s: o dispositivo tem de estar ligado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Não foi possível desinstalar: bateria fraca" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Não foi possível desinstalar %s: bateria fraca" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Não foi possível desinstalar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Não foi possível iniciar %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1940 +msgid "Sorry, something went wrong" +msgstr "Lamentamos, alguma coisa correu mal" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Não foi possível abrir %s: %s não está instalado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1920 +msgid "Not enough disk space for operation" +msgstr "Espaço em disco insuficiente para a operação" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Não foi possível instalar: tipo de ficheiro não suportado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Não foi possível instalar: falha na autenticação" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Não foi possível instalar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Não foi possível ligar-se a %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1924 +msgid "Restart Software to use new plugins" +msgstr "Reiniciar o software para usar novos plugins" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1928 +msgid "Device needs to be plugged in" +msgstr "O dispositivo precisa de estar ligado" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1931 +msgid "Battery level is too low" +msgstr "O nível da bateria está muito baixo" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Repositórios de _Software" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferências" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Teclas de atalho" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Acerca do Software" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Pesquisa" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menu principal" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Procurar aplicações" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Explorar" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instaladas" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Atualizações" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Recuar" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nenhum" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Dados da aplicação" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Dados necessários para que a aplicação seja executada" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Dados do utilizador" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Dados criados por si na aplicação" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Dados de cache" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dados temporários em cache" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "A aplicação em si" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dependências necessárias" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Componentes do sistema partilhados exigidos por esta aplicação" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Desconhecido" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Os dados em cache podem ser removidos das definições da " +"_aplicação" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Armazenamento" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instalada)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (A instalar)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (a transferir)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (A remover)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detalhes" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examinar" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Instalada em %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Atualizações instaladas" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Sem atualizações instaladas" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "As Atualizações de Software estão desatualizadas" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Verificar se existem atualizações disponíveis" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Atualizações críticas prontas para instalar" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Instalar atualizações críticas o mais rapidamente possível" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Atualizações críticas disponíveis para transferir" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Transferir atualizações críticas o mais rapidamente possível" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Atualizações prontas para instalar" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Atualizações estão prontas e à espera para serem instaladas" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Atualizações disponíveis para transferir" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Atualizações de software podem ser transferidas" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplicação foi atualizada — é necessário reiniciar o sistema" +msgstr[1] "%u aplicações foram atualizadas — é necessário reiniciar o sistema" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplicação foi atualizada" +msgstr[1] "%u aplicações foram atualizadas" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s foi atualizada." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Reinicie a aplicação." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s e %s foram atualizadas." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "É necessário reiniciar %u aplicação." +msgstr[1] "É necessário reiniciar %u aplicações." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inclui %s, %s e %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "O Sistema chegou ao Fim de Suporte" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Atualize para continuar a receber atualizações" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Está disponível uma nova versão de %s para instalar" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Atualização de software disponível" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Falha na atualização de software" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "As atualizações não foram instaladas" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Mostrar detalhes" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Atualização do sistema concluída" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Bem-vindo(a) ao %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Atualização de software instalado" +msgstr[1] "Atualizações de software instaladas" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Foi instalada uma atualização importante do sistema operativo." +msgstr[1] "Foram instaladas atualizações importantes do sistema operativo." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Análise" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Falha ao atualizar" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "O sistema já estava atualizado." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "A atualização foi cancelada." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Foi pedido acesso à Internet mas não estava disponível. Assegure-se que tem " +"acesso à Internet e tente novamente." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Houve problemas de segurança com a atualização. Consulte o seu fornecedor de " +"programas para mais detalhes." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Não houve espaço suficiente em disco. Liberte algum espaço e tente novamente." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Lamentamos: falha na instalação da atualização. Aguarde por outra " +"atualização e tente novamente. Se o problema persistir, contacte o seu " +"fornecedor de programas." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Última verificação: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Parar" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Procurar atualizações" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s parou de receber atualizações críticas de software" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"O sistema operativo deixou de receber atualizações críticas de software" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Podem ser aplicados custos adicionais" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Procurar atualizações em redes móveis de banda larga pode incorrer em custos." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Ainda assim procurar" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Atualizações de software transferidas" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Atualizações prontas para instalação" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Procurar atualizações" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Atualizações" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Página das atualizações" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "A carregar atualizações" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Isto pode demorar algum tempo" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Atualizado" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Usar dados móveis?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "Procurar atualizações em redes de banda larga pode incorrer em custos" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "Ainda assim pro_curar" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Sem ligação" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Ligue-se à Internet para procurar atualizações" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Defi_nições de rede" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Erro" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "As atualizações são geridas automaticamente" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Atualizações de Software em Pausa" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"As atualizações automáticas de software foram pausadas pelos seguintes " +"motivos:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• A ligação de rede atual é limitada" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• A ligação de rede atual proíbe grandes transferências" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Modo de poupança de energia está ativo" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Modo de jogo está ativo" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Atualizações de software em pausa" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "A ligação de rede é limitada - atualizações de software em pausa" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"A ligação de rede proíbe grandes transferências - atualizações de software " +"em pausa" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"O modo de poupança de energia está ativo — atualizações de software em pausa" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "O modo de jogo está ativo — atualizações de software em pausa" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Reiniciar e atualizar…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "A_tualizar tudo" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Atualizações de software transferidas" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Atualizações prontas para instalar" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Firmware integrado" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "É necessário reiniciar o sistema" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Atualizações de aplicações" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Firmware do dispositivo" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Transferir" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s / %s Disponível" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s Disponível" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Saiba mais sobre a nova versão" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s de %s transferido" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% transferido" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Uma atualização significativa, com novas funções e mais polimento." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Cancelar Atualização" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Reiniciar e atualizar…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Lembre-se de fazer uma cópia de segurança dos dados e ficheiros antes de " +"atualizar." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Detalhes de erro" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Copiar detalhes" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Falha ao eliminar o ficheiro \"%s\": %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Falha ao eliminar o diretório \"%s\": %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Adiciona, remove ou atualiza software neste computador" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Atualizações;Fontes;Origens;Repositórios;Preferências;Instalar;Desinstalar;" +"Programa;Software;App;Loja;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s Pronto" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "O %s está pronto a ser ativado e inicializado no próximo arranque." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Ativar" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Atualizações do sistema" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Atualizações gerais do sistema, tais como correções de segurança ou de erros " +"inesperados e melhorias de desempenho." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Atualização do %s com novas funcionalidades e correções." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"O serviço de atualizações EOS não conseguiu obter e aplicar a atualização." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Aplicação web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Suporte de aplicações web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Executar aplicações web populares num navegador" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Atualizar para obter as últimas funcionalidades e melhorias de desempenho e " +"estabilidade." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Suporte para Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "O Flatpak é uma estrutura para aplicações de computador no Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Pasta do sistema %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Subpasta pessoal %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Pastas do sistema host" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Configuração do sistema host de /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Pasta da área de trabalho" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Subpasta da área de trabalho %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Pasta de documentos" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Subpasta de documentos %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Pasta de música" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Subpasta de música %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Pasta de imagens" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Subpasta de imagens %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Pasta de partilha pública" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Subpasta de partilha pública %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Pasta de vídeos" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Subpasta de vídeos %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Pasta de modelos" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Modelos de subpasta %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Pasta de cache do utilizador" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Subpasta de cache do utilizador %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Pasta de configuração do utilizador" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Subpasta de configuração do utilizador %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Pasta de dados do utilizador" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Subpasta de dados do utilizador %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Pasta de tempo de execução do utilizador" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Subpasta de tempo de execução do utilizador %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Acesso ao sistema de ficheiros a %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "A obter metadados flatpak para %s…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Falha ao refinar o complemento ‘%s’: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instalação do utilizador" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instalação do sistema" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID da aplicação" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Falha ao adicionar para instalação o complemento ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Falha ao adicionar para desinstalação o complemento ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"O \"%s\" remoto não permite a instalação de \"%s\", possivelmente devido ao " +"seu filtro. Remova o filtro e repita a instalação. Erro detalhado: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "A energia do sistema é demasiado baixa para executar a atualização" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"A energia do sistema é demasiado baixa para executar a atualização (%u%%, " +"requer %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "O dispositivo está inacessível ou fora do alcance da rede sem fios" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "A energia da bateria do dispositivo está demasiado baixa" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"A energia da bateria do dispositivo é demasiado baixa (%u%%, requer %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "O dispositivo está à espera que a atualização seja efetuada" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "O dispositivo requer alimentação CA para ser ligado" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "O dispositivo não pode ser utilizado enquanto a tampa estiver fechada" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Atualização de dispositivo do %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Atualização de sistema do %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Atualização de controlador integrado do %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Atualização do ME do %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Atualização do ME empresarial do %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Atualização do ME consumidor do %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Atualização de controlador do %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Atualização de controlador Thunderbolt do %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Atualização de microcódigo da CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Atualização de configuração do %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Atualização da bateria do %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Atualização da câmara do %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Atualização do TPM do %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Atualização do painel tátil do %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Atualização do rato do %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Atualização do teclado do %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Atualização do controlador de armazenamento %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Atualização da interface de rede %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Atualização de ecrã do %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Atualização do BMC do %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Atualização do receptor USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Atualização da unidade %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Atualização da unidade %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Atualização do SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Atualização da GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Atualização da doca %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Atualização da doca USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Não foi possível aplicar a atualização do firmware: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Suporte para atualizações de firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Permite realizar atualizações de firmware" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Instalar software não assinado?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"O software a ser instalado não está assinado. Não será possível verificar a " +"origem das atualizações deste software ou se as atualizações foram " +"adulteradas." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Transferir software não assinado?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"As atualizações não assinadas estão disponíveis. Sem uma assinatura, não é " +"possível verificar a origem da atualização ou se a mesma foi adulterada." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Atualizar software não assinado?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"As atualizações não assinadas estão disponíveis. Sem uma assinatura, não é " +"possível verificar a origem da atualização ou se a mesma foi adulterada. As " +"atualizações de software serão desativadas até que as atualizações não " +"assinadas sejam removidas ou atualizadas." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Falha ao instalar atualizações: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pacotes" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Falha na espera pelo fim da transação antes de transferir: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Não foi possível transferir atualizações: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Falha a iniciar atualização: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Sistema Operativo (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Suporte a Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Um snap é um pacote universal para Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistema" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Componente de sistema" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "A remoção do trabalho de sysupdate '%s' falhou com o estado %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Um modo agradável de gerir as aplicações no sistema." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Introduza um número de 1 a %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Escolha uma aplicação:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s está agora instalada" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Uma aplicação foi removida" +#~ msgstr[1] "As aplicações foram removidas" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Impossível encontrar «%s»" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "A transferir o catálogo de software" + +#~ msgid "Moderate page" +#~ msgstr "Moderar página" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Não existem análises para moderar" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Esta análise foi-lhe útil?" + +#~ msgid "Yes" +#~ msgstr "Sim" + +#~ msgid "No" +#~ msgstr "Não" + +#~ msgid "Meh" +#~ msgstr "Meh" + +#~ msgid "Outdated SDK version" +#~ msgstr "Versão SDK desatualizada" + +#~ msgid "Unable to install updates" +#~ msgstr "Não foi possível instalar atualizações" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Não foi possível desinstalar: autenticação inválida" + +#~ msgid "Network Settings" +#~ msgstr "Definições de rede" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Atualizações do sistema operativo disponíveis" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Falha ao instalar uma atualização importante do sistema operativo." + +#~ msgid "No Network" +#~ msgstr "Sem rede" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "É necessário acesso à Internet para procurar atualizações." + +#~ msgid "Network _Settings" +#~ msgstr "_Definições de Rede" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "As atualizações de software foram transferidas e estão prontas para serem " +#~ "instaladas." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "As atualizações de software foram transferidas e estão prontas para serem " +#~ "instaladas." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "A transferir informação sobre a atualização…" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "A carregar a descrição da atualização, aguarde…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Atualizações automáticas interrompidas" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an unmetered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been incorrectly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "A rede atual é limitada. As ligações limitadas têm limites de dados ou " +#~ "custos associados. Para poupar dados, as atualizações automáticas foram " +#~ "interrompidas.\n" +#~ "\n" +#~ "As atualizações automáticas serão retomadas quando uma ligação sem " +#~ "limites fique disponível. Até lá, continua a ser possível instalar " +#~ "manualmente as atualizações.\n" +#~ "\n" +#~ "Em alternativa, se a rede atual foi identificada como limitada " +#~ "incorretamente, esta definição pode ser alterada." + +#~ msgid "Open Network _Settings" +#~ msgstr "Abrir as _Definições de Rede" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Para evitar cobranças e limites de rede, as atualizações de software não " +#~ "são transferidas automaticamente em ligações móveis ou com limite." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Transfere e instala atualizações de software em segundo plano, quando " +#~ "possível" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Mostrar apenas aplicações _livres" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Mostrar apenas aplicações licenciadas livremente e ocultar todas as " +#~ "aplicações proprietárias" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "O que lhe agradou nesta aplicação? Deixar o seu feedback juntamente com " +#~ "as suas razões para deixar uma análise é útil para os outros." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Não foi possível descarregar atualizações: acesso à Internet é " +#~ "necessário, mas não está disponível" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Não foi possível descarregar atualizações: sem espaço suficiente" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Não foi possível descarregar atualizações: autenticação necessária" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Não foi possível descarregar atualizações: autenticação inválida" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Não foi possível instalar %s: não tem permissão para instalar software" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Não foi possível instalar %s: a bateria não tem carga suficiente" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "" +#~ "Não foi possível instalar atualizações: não há espaço suficiente em disco" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Não foi possível instalar atualizações: autenticação obrigatória" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Não foi possível instalar atualizações: autenticação inválida" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Não foi possível atualizar %s: não tem permissão para atualizar software" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Não foi possível instalar atualizações: não tem permissão para atualizar " +#~ "software" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Não foi possível instalar atualizações: necessária ligação à corrente " +#~ "elétrica" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Não foi possível atualizar %s: a bateria não tem carga suficiente" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "Não foi possível instalar atualizações: a bateria não tem carga suficiente" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "Não foi possível atualizar para o %s: a transferência falhou" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Não foi possível atualizar para o %s: não tem permissão para atualizar a " +#~ "distribuição" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "" +#~ "Não foi possível atualizar para o %s: a bateria não tem carga suficiente" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Não foi possível remover %s: autenticação obrigatória" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Não foi possível remover %s: autenticação inválida" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Não foi possível remover %s: não tem permissão para remover software" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Não foi possível remover %s: necessária ligação à corrente elétrica" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Não foi possível remover %s: a bateria não tem carga suficiente" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Não foi possível remover %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Falha ao instalar o ficheiro: não é suportado" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Falha ao instalar: não suportado" + +#~ msgid "AC power is required" +#~ msgstr "Necessária ligação à corrente elétrica" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Rede limitada ‒ atualizações automáticas interrompidas" + +#~ msgid "Find Out _More" +#~ msgstr "Saber _mais" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Uma atualização importante está pronta para ser instalada." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Importante: atualizações críticas estão em espera." + +#~ msgid "Show verbose debugging information" +#~ msgstr "Mostra informação de depuração detalhada" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Pode aceder a ficheiros arbitrários" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Tem certeza que deseja desinstalar %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s será desinstalada, e terá de a instalar para a utilizar novamente." + +#~ msgid "Downloading featured images…" +#~ msgstr "A transferir imagens destacadas…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "O último registro de data/hora quando o sistema actualizou pela última vez" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Os complementos selecionados serão instalados com a aplicação." + +#~ msgid "An application" +#~ msgstr "Uma aplicação" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Este software não está disponível no seu idioma e aparecerá em inglês dos " +#~ "EUA." + +#~ msgid "Applications" +#~ msgstr "Aplicações" + +#~ msgid "_Continue" +#~ msgstr "_Continuar" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u aplicação" +#~ msgstr[1] "%u aplicações" + +#~ msgid "Post Review" +#~ msgstr "Publicar análise" + +#~ msgid "_Post" +#~ msgstr "_Publicar" + +#~ msgid "Rating" +#~ msgstr "Pontuação" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Dar um breve resumo da sua avaliação, por exemplo: \"Grande aplicação, " +#~ "recomendo\"." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Análise" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "O que pensa desta aplicação? Tente dar argumentos para os seus pontos de " +#~ "vista." + +#~ msgid "No screenshot provided" +#~ msgstr "Sem capturas de ecrã" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Reiniciar" + +#~ msgid "Primary Menu" +#~ msgstr "Menu principal" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Atualizações" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "O %s %s não é mais suportado." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Isto significa que não recebe atualizações de segurança." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "É recomendável que atualize para uma versão mais recente." + +#~ msgid "Application Updates" +#~ msgstr "Atualizações de aplicações" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Nenhumas atualizações instaladas neste sistema." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Gestor de aplicações para o GNOME" + +#~ msgid "Name" +#~ msgstr "Nome" + +#~ msgid "user" +#~ msgstr "utilizador" + +#~ msgid "Channel" +#~ msgstr "Canal" + +#~ msgid "Branch" +#~ msgstr "Ramo" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Instalação" + +#~ msgid "Version" +#~ msgstr "Versão" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "O catálogo de software está a ser transferido" + +#~ msgid "Access arbitrary files" +#~ msgstr "Acesso a ficheiros arbitrários" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Pode aceder a ficheiros arbitrários no sistema de ficheiros" + +#~ msgid "A list of popular applications" +#~ msgstr "Lista de aplicações populares" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Uma lista de aplicações a serem utilizadas. Substituí as predefinidas " +#~ "pelo sistema." + +#~ msgid "Checking…" +#~ msgstr "A procurar…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "A carregar…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "A transferir avaliações das aplicações…" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "O URI que faz referência ao fundo para uma faixa de atualização." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "O URI pode conter até três '%u', que serão substituídos pela versão de " +#~ "atualização." + +#~ msgid "Welcome" +#~ msgstr "Bem-vindo" + +#~ msgid "Welcome to Software" +#~ msgstr "Bem-vindo ao Aplicações" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "O Aplicações permite-lhe instalar os programas que necessita num único " +#~ "local. Veja as nossas recomendações, navegue pelas categorias ou procure " +#~ "as aplicações que quiser." + +#~ msgid "_Browse Software" +#~ msgstr "_Procurar aplicações" + +#~ msgid "_Add shortcut" +#~ msgstr "_Adicionar atalho" + +#~ msgid "Re_move shortcut" +#~ msgstr "Re_mover atalho" + +#~ msgid "OS Updates" +#~ msgstr "Atualizações do SO" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Inclui melhorias de desempenho, estabilidade e segurança." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "A transferir assinaturas criptográficas da atualização de firmware…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "A transferir metadados da atualização de firmware…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "O software tem permissões desconhecidas" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "O software vem de uma fonte confiável" + +#~ msgid "Unknown Permissions" +#~ msgstr "Permissões desconhecidas" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "As permissões necessárias por esta aplicação não são reconhecidas" + +#~ msgid "App comes from a trusted source" +#~ msgstr "A aplicação vem de uma fonte confiável" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "A distribuição verificou que esta aplicação pode ser confiável" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "Não optimizado para dispositivos de toque ou telefones" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "" +#~ "Ver linha de comando para instalar repositórios 'nonfree' de aplicações" + +#~ msgid "_Read More" +#~ msgstr "_Leia mais" + +#~ msgid "_Read Less" +#~ msgstr "_Leia menos" + +#~ msgid "_Launch" +#~ msgstr "_Iniciar" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Algumas destas aplicações são proprietárias, e portanto têm restrições " +#~ "sobre o seu uso, partilha, e acesso ao código fonte." + +#~ msgid "Find out more…" +#~ msgstr "Saber mais…" + +#~ msgid "_Remove All" +#~ msgstr "_Remover tudo" + +#~ msgid "Recently Updated" +#~ msgstr "Atualizado recentemente" + +#~ msgid "More…" +#~ msgstr "Mais…" + +#~ msgid "Recommended Games" +#~ msgstr "Jogos recomendados" + +#~ msgid "Recommended Creation Applications" +#~ msgstr "Aplicações de criação recomendadas" + +#~ msgid "Recommended Work Applications" +#~ msgstr "Aplicações de trabalho recomendadas" + +#~ msgid "Recent Releases" +#~ msgstr "Lançamentos Recentes" + +#~ msgid "Remove “%s”?" +#~ msgstr "Remover «%s»?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Desativar «%s»?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Sem fontes adicionais" + +#~ msgid "_Remove…" +#~ msgstr "_Remover…" + +#~ msgid "_Disable…" +#~ msgstr "_Desativar…" + +#~ msgid "Enabling" +#~ msgstr "A ativar" + +#~ msgid "Disabling" +#~ msgstr "A desativar" + +#~ msgid "Enabled" +#~ msgstr "Ativa" + +#~ msgid "Disabled" +#~ msgstr "Inativa" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "As atualizações serão aplicadas quando o sistema for reiniciado." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "À espera para transferir o %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "A transferir o %s %s" + +#~ msgid "Requires a specific screen size" +#~ msgstr "Requer um tamanho de ecrã específico" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Nunca" + +#~ msgid "Localized in your Language" +#~ msgstr "Traduzida para o seu idioma" + +#~ msgid "Release Activity" +#~ msgstr "Atividade de lançamentos" + +#~ msgid "Developer" +#~ msgstr "Programador" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Desinstalada" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Instalada" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Atualizada" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Desconhecida" + +#~ msgid "History" +#~ msgstr "Histórico" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (precisa de atenção)" + +#~ msgid "Setting Up Updates…" +#~ msgstr "A configurar as atualizações…" + +#~ msgid "Looking for New Updates…" +#~ msgstr "A procurar novas atualizações…" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "All" +#~ msgstr "Tudo" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Tudo" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgid "Audio & Video" +#~ msgstr "Áudio e Vídeo" + +#~ msgid "Developer Tools" +#~ msgstr "Ferramentas de programação" + +#~ msgid "Education & Science" +#~ msgstr "Educação e Ciência" + +#~ msgid "Games" +#~ msgstr "Jogos" + +#~ msgid "Graphics & Photography" +#~ msgstr "Gráficos e Fotografia" + +#~ msgid "Productivity" +#~ msgstr "Produtividade" + +#~ msgid "Communication & News" +#~ msgstr "Comunicação e Notícias" + +#~ msgid "Utilities" +#~ msgstr "Utilitários" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Aplicações áudio e vídeo recomendadas" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Aplicações de produtividade recomendadas" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Não foi possível determinar quais partes do sistema são acedidas por esta " +#~ "aplicação. Isto é normal em aplicações mais antigas." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Baixa" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Média" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Alta" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Desconhecida" + +#~ msgid "Public domain" +#~ msgstr "Domínio público" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://pt.wikipedia.org/wiki/Domínio_público" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Os utilizadores são regidos pela seguinte licença:" +#~ msgstr[1] "Os utilizadores são regidos pelas seguintes licenças:" + +#~ msgid "Sandboxed" +#~ msgstr "Numa sandbox" + +#~ msgid "Category" +#~ msgstr "Categoria" + +#~ msgid "Free" +#~ msgstr "Livre" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Desconhecida" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Isto significa que o software pode ser livremente executado, copiado, " +#~ "distribuído, estudado e modificado." + +#~ msgid "Proprietary Software" +#~ msgstr "Aplicação Proprietária" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Isto significa que este software pertence a um indivíduo ou companhia. " +#~ "Existem frequentemente restrições ao seu uso e o seu código-fonte, por " +#~ "norma, não é acessível." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Os termos da licença deste software são desconhecidos." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "A aplicação tem esta classificação pelas seguintes razões:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Não há detalhes disponíveis para esta classificação." + +#~ msgid "ratings in total" +#~ msgstr "avaliações publicadas" + +#~ msgid "Select All" +#~ msgstr "Selecionar tudo" + +#~ msgid "Select None" +#~ msgstr "Não selecionar nenhuma" + +#~ msgid "Featured %s" +#~ msgstr "Destaques - %s" + +#~ msgid "Show" +#~ msgstr "Mostrar" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Menu de filtração de subcategorias" + +#~ msgid "Sort" +#~ msgstr "Ordenar por" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Menu de ordenação de subcategorias" + +#~ msgid "Software is up to date" +#~ msgstr "As aplicações estão atualizadas" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "O ODR é um serviço que permite obter avaliações das aplicações dadas " +#~ "pelos seus utilizadores" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Personagem de desenhos animados em situações inseguras" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Personagem de desenhos animados em conflito agressivo" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Violência gráfica envolvendo personagem de desenhos animados" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Personagens em situações inseguras facilmente distinguíveis da realidade" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Personagem em conflito agressivo facilmente distinguíveis da realidade" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Violência gráfica facilmente distinguível da realidade" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Personagens moderadamente realistas em situações inseguras" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Personagens moderadamente realistas em conflito agressivo" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Violência gráfica envolvendo personagens realistas" + +#~ msgid "No bloodshed" +#~ msgstr "Sem derrame de sangue" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Derrame de sangue não realista" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Derrame de sangue realista" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Representações de derrame de sangue e mutilações de partes do corpo" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Violação ou outro comportamento sexual violento" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Referência a bebidas alcoólicas" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Uso de bebidas alcoólicas" + +#~ msgid "References to illicit drugs" +#~ msgstr "Referência a drogas ilícitas" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Uso de drogas ilícitas" + +#~ msgid "References to tobacco products" +#~ msgstr "Referências a produtos com tabaco" + +#~ msgid "Use of tobacco products" +#~ msgstr "Uso de produtos com tabaco" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Nudez artística breve" + +#~ msgid "Prolonged nudity" +#~ msgstr "Nudez prolongada" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Referências ou representações provocatórias" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Referências ou representações sexuais" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Comportamento sexual gráfico" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Uso ligeiro ou infrequente de profanidades" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Uso moderado de profanidades" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Uso constante ou frequente de profanidades" + +#~ msgid "Slapstick humor" +#~ msgstr "Humor brejeiro" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Humor vulgar ou visceral" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Humor maduro ou sexual" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negatividade em relação a um grupo específico de pessoas" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Discriminação destinada a causar dano emocional" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Discriminação explícita baseada em género, sexualidade, raça ou religião" + +#~ msgid "Product placement" +#~ msgstr "Colocação de produtos" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Referências explícitas a determinadas marcas ou produtos registados" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Os jogadores são encorajados a comprar itens específicos do mundo real" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "" +#~ "Jogo de apostas com eventos aleatórios utilizando tokens ou créditos" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Jogo de apostas com dinheiro fictício" + +#~ msgid "Gambling using real money" +#~ msgstr "Jogo de apostas com dinheiro real" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Os utilizadores são encorajados a doar dinheiro real" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Possibilidade de gastar dinheiro real dentro do programa" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Interações entre jogadores sem funcionalidade de conversação" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Conversa controlada entre utilizadores" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Conversa em áudio e vídeo entre utilizadores não controlada" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Partilha de nomes de utilizadores de redes sociais e endereços de email" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Procura uma versão mais recente do programa" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Partilha dados de diagnósticos que não possiblitam identificar o " +#~ "utilizador" + +# Profiling já foi traduzido como perfilamento, porém a tradução também pode ser a de criação de perfil --Enrico +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Partilha dados que possiblitam indentificar o utilizador" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Partilha de localização com outros utilizadores" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Referências indiretas à homossexualidade" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Beijos entre pessoas do mesmo género" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Comportamento sexualmente explícito entre pessoas do mesmo género" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Referências indiretas à prostituição" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Referências diretas à prostituição" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Representações gráficas de prostituição" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Referências indiretas ao adultério" + +#~ msgid "Direct references to adultery" +#~ msgstr "Referências diretas ao adultério" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Representações gráficas de adultério" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Personagens humanas semi-nuas" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Personagens humanas explicitamente sexualizadas" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Representações ou referências a profanações históricas" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Representações de profanações contemporâneas" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "" +#~ "Representações graficamente explícitas de profanações contemporâneas" + +#~ msgid "Visible dead human remains" +#~ msgstr "Cadáveres humanos visíveis" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Cadáveres humanos sujeitos às intempéries" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Representações explícitas de profanação de cadáveres" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Representações ou referências históricas a escravatura" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Representações de escravatura contemporânea" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Representações graficamente explícitas de escravatura contemporânea" + +#~ msgid "General" +#~ msgstr "Todas as audiências" + +#~ msgid "ALL" +#~ msgstr "Todas as audiências" + +#~ msgid "Teen" +#~ msgstr "Maiores de 13" + +#~ msgid "Everyone 10+" +#~ msgstr "Maiores de 10" + +#~ msgid "Everyone" +#~ msgstr "Maiores de 6" + +#~ msgid "Early Childhood" +#~ msgstr "Até 3 anos" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Desconhecido" + +#~ msgid "Released" +#~ msgstr "Lançado" + +#~ msgid "Format" +#~ msgstr "Formato" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Ontem, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Há três dias atrás" + +#~ msgid "Four days ago" +#~ msgstr "Há quatro dias atrás" + +#~ msgid "Five days ago" +#~ msgstr "Há cinco dias atrás" + +#~ msgid "Six days ago" +#~ msgstr "Há sies dias atrás" + +#~ msgid "Two weeks ago" +#~ msgstr "Há duas semanas atrás" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Removida" + +#~ msgid "Security Updates Pending" +#~ msgstr "Instalações de segurança pendentes" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "É recomendável que instale atualizações importantes agora" + +#~ msgid "Restart & Install" +#~ msgstr "Reiniciar & _Instalar" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Atualizações importantes do sistema operativo e de aplicações estão " +#~ "prontas para serem instaladas" + +#~ msgid "View" +#~ msgstr "Ver" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Vamos às compras" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Ativa o repositório de extensões do GNOME Shell" + +#~ msgid "this website" +#~ msgstr "esta página web" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Esta aplicação precisa de ser reiniciada para usar os novos plugins." + +#~| msgid "_About" +#~ msgid "About %s" +#~ msgstr "_Sobre o %s" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Listas de fontes que foram ativadas anteriormente" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Lista de fontes que tenham sido ativadas quando são instaladas aplicações " +#~ "de terceiros." + +#~ msgid "Show the folder management UI" +#~ msgstr "Mostrar a pasta de gestão de IU" + +#~ msgid "Add to Application Folder" +#~ msgstr "Adicionar à pasta da aplicação" + +#~ msgid "_Add" +#~ msgstr "_Adicionar" + +#~ msgid "_All" +#~ msgstr "_Todas" + +#~ msgid "Folder Name" +#~ msgstr "Nome da pasta" + +# Profiling já foi traduzido como perfilamento, porém a tradução também pode ser a de criação de perfil --Enrico +#~ msgid "Show profiling information for the service" +#~ msgstr "Mostrar informações de criação de perfil para este serviço" + +#~ msgid "To continue you need to sign in." +#~ msgstr "Para continuar tem de autenticar-se" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Para continuar tem de autenticar-se em %s." + +#~ msgid "Email address" +#~ msgstr "Endereço de e-mail" + +#~ msgid "I have an account already" +#~ msgstr "Eu já tenho uma conta" + +#~ msgid "I want to register for an account now" +#~ msgstr "Pretendo criar agora uma conta" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Autentique-se automaticamente da próxima vez" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Introduza o seu PIN único para a autenticação com dois fatores" + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Continue" +#~ msgstr "Continuar" + +#~ msgid "Spacing" +#~ msgstr "Espaçamento" + +#~ msgid "The amount of space between children" +#~ msgstr "O espaço entre filhos" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Informações sobre %s, bem como as opções de como obter um codec que pode " +#~ "reproduzir este formato podem ser encontradas na paǵina web." + +#~ msgid "Total" +#~ msgstr "Total" + +#~ msgid "Extension Settings" +#~ msgstr "Definições da extensão" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Use extensões por sua conta e risco. Se o seu sistema tiver problemas, é " +#~ "recomendado que as desative." + +#~ msgid "Could not find '%s'" +#~ msgstr "Impossível encontrar \"%s\"" + +#~ msgid "Click on items to select them" +#~ msgstr "Clique nos itens para os selecionar" + +#~ msgid "Select" +#~ msgstr "Selecionar" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Adicionar à pasta…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Mover para a pasta…" + +#~ msgid "Restart & _Install" +#~ msgstr "Reiniciar & _Instalar" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Sem aplicações ou extensões instaladas; outro programa pode ainda estar" + +#~ msgid "Remove Source" +#~ msgstr "Remover fonte" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Fontes de aplicações podem ser transferidas da Internet. Dão-lhe acesso a " +#~ "programas adicionais que não são fornecidos por %s." + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Fontes de aplicações dão-lhe acesso a programas adicionais." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Remover a fonte também removerá qualquer aplicação instalada a partir " +#~ "dela." + +#~ msgid "No software installed from this source" +#~ msgstr "Nenhuma aplicação instalada desta fonte" + +#~ msgid "Installed from this Source" +#~ msgstr "Instalada desta fonte" + +#~ msgid "Last Checked" +#~ msgstr "Última verificação" + +#~ msgid "Added" +#~ msgstr "Adicionada" + +#~ msgid "Website" +#~ msgstr "Página Web" + +#~ msgid "Installation of %s failed." +#~ msgstr "Falha ao instalar %s." + +#~ msgid "Removal of %s failed." +#~ msgstr "Falha ao remover %s." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Certifique-se que tem acesso à Internet e tente novamente." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Por favor, liberte algum e tente novamente." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Se o problema persistir, contacte o seu fornecedor de software." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Interações entre jogadores com mensagens predefinidas sem funcionalidade " +#~ "de conversação." + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgid "_Quit" +#~ msgstr "_Sair" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "O catálogo de aplicações está a ser carregado" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Addons" +#~ msgid "Shell Extensions" +#~ msgstr "Extensões da interface" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomia" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Química" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matemática" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Todas" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Destaques" + +#~ msgid "Science" +#~ msgstr "Ciência" + +#~ msgid "One Star" +#~ msgstr "Uma estrela" + +#~ msgid "Two Stars" +#~ msgstr "Duas estrelas" + +#~ msgid "Three Stars" +#~ msgstr "Três estrelas" + +#~ msgid "Four Stars" +#~ msgstr "Quatro estrelas" + +#~ msgid "Five Stars" +#~ msgstr "Cinco estrelas" + +#~ msgid "3rd party" +#~ msgstr "Terceiros" + +#~ msgid "nonfree" +#~ msgstr "não grátis" + +#~ msgid "shell extension" +#~ msgstr "extensões da interface" + +#~ msgid "page0" +#~ msgstr "página0" + +#~ msgid "page1" +#~ msgstr "página1" + +#~ msgid "_Installing" +#~ msgstr "A _instalar" + +#~ msgid "_Removing" +#~ msgstr "A _remover" + +#~ msgid " or " +#~ msgstr " ou " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Desconhecido" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Este programa vem de terceiros." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "Este programa vem de terceiros e pode conter componente não livres." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Este programa pode conter componentes não livres." + +#~ msgid "non-free" +#~ msgstr "não livre" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Aplicações de escritório recomendadas" + +#~ msgid "Audio" +#~ msgstr "Áudio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Edição" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Base de dados" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Gravação de discos" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Radio amador" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Misturadores" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Música" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Gravadores" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Sequenciadores" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Sintonizadores" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Compilação" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Base de dados" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..4c93b54 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,6986 @@ +# Brazilian Portuguese translation for gnome-software. +# Copyright (C) 2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Juan Diego Martins da Costa Cruz , 2013. +# Georges Basile Stavracas Neto , 2013, 2014. +# Felipe Braga , 2015. +# Artur de Aquino Morais , 2016. +# Fábio Nogueira , 2015, 2016. +# Gustavo Marques , 2016. +# Ricardo Silva Veloso , 2018. +# Bruno Lopes , 2018, 2021. +# Enrico Nicoletto , 2013-2016, 2018, 2021-2022. +# Matheus Barbosa , 2022. +# Leônidas Araújo , 2022-2023. +# Juliano de Souza Camargo , 2024. +# Rafael Fontenelle , 2013-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-13 15:24+0000\n" +"PO-Revision-Date: 2025-02-14 22:50-0300\n" +"Last-Translator: Rafael Fontenelle \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 47.1\n" +"X-Project-Style: gnome\n" +"X-DL-Team: pt_BR\n" +"X-DL-Module: gnome-software\n" +"X-DL-Branch: main\n" +"X-DL-Domain: po\n" +"X-DL-State: Translating\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programas" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instale e atualize aplicativos" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"O aplicativo Programas permite que você encontre e instale novos aplicativos " +"e extensões do sistema, além de remover aplicativos já instalados." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"O Programas apresenta aplicativos populares e em destaque com descrições " +"úteis e várias capturas de tela por aplicativo. Os aplicativos podem ser " +"encontrados navegando na lista de categorias ou pesquisando. Ele também " +"permite que você atualize seu sistema usando uma atualização offline." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Painel de visão geral" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Painel de detalhes" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Painel de instalados" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Painel de atualizações" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Os detalhes da atualização" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "O projeto GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Testa a chave akmods em UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Autenticação requerida para testar a chave akmods em UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Registrar a chave akmods em UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Autenticação requerida para registrar a chave akmods em UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Testar chave DKMS em UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Autenticação requerida para testar a chave DKMS em UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Registrar a chave DKMS em UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Autenticação requerida para registrar a chave DKMS em UEFI Shim" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalar um arquivo appstream em um local do sistema" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instalando um arquivo appstream em um local do sistema" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Uma lista de projetos compatíveis" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Esta é uma lista de projetos compatíveis que devemos mostrar como GNOME, KDE " +"e XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Se atualizações devem ser gerenciadas no GNOME Programas" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Se desativado, o GNOME Programas ocultará o painel de atualizações, não " +"executará quaisquer ações de atualizações automáticas nem perguntará sobre " +"atualizações." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Baixar e instalar automaticamente as atualizações" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Se habilitado, o GNOME Programas baixa automaticamente as atualizações em " +"segundo plano, também instalando as que não requerem reinicialização." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notificar o usuário sobre aplicativos atualizados em segundo plano" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Se habilitado, o GNOME Programas notificará o usuário sobre atualizações que " +"aconteceram enquanto o usuário estava ocioso." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Se deve atualizar automaticamente ao usar uma conexão limitada" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Se habilitado, o GNOME Programas atualiza automaticamente em segundo plano " +"mesmo quando estiver sendo executado em uma conexão limitada (eventualmente, " +"baixar alguns metadados, verificar atualizações, etc., o que pode resultar " +"em custos para o usuário)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Se é a primeira execução do GNOME Programas" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Mostrar estrela de classificações ao lado de aplicativos" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtra aplicativos baseado no ramo padrão definido para o remoto" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Aplicações não livres mostram um diálogo de aviso antes de instalar" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Quando as aplicações não livres estão instaladas um diálogo de aviso pode " +"ser mostrado. Isto controla se esse diálogo é suprimido." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Marca de tempo de verificação da última atualização" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "A marca de tempo da notificação da última atualização" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "A marca de tempo da notificação da última atualização" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"A marca de tempo da primeira atualização de segurança, apagada após " +"atualização" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "A marca de tempo da última atualização" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"A idade em segundos para verificar se a captura de tela ainda está válida" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Escolher um valor maior significará menos conexões com o servidor remoto, " +"mas atualizações para as capturas de tela podem levar mais tempo para serem " +"mostradas ao usuário. Um valor igual a 0 significa nunca verificar no " +"servidor se a imagem já existir no cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "O servidor a ser usado para avaliações de aplicativos" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "A pontuação carma mínima para ser avaliada" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Avaliações com carma menor do que este número não serão mostradas." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Uma lista de repositórios oficiais que não devem ser considerados como de " +"terceiros" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Uma lista de repositórios necessários que não podem ser desabilitados ou " +"removidos" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Uma lista de repositórios oficiais que devem ser considerados como de " +"programa livre" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"A URL da licença a ser usada quando um aplicativo deve ser considerado como " +"um programa livre" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Instalar aplicativos empacotados para os todos usuários no sistema, se " +"possível" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Permitir acesso ao diálogo de repositórios de programas" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Oferecer atualizações para pré-lançamentos" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Mostrar alguns elementos de interface gráfica informando ao usuário que um " +"aplicativo é não livre" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Mostrar o tamanho instalado para aplicativos na lista de aplicativos " +"instalados" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://pt.wikipedia.org/wiki/Software_privativo'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "A URI que explica programas não livres e privativos" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Uma lista de URLs apontando para arquivos appstream que serão baixados em " +"uma pasta swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instala os arquivos AppStream em um local de todo o sistema para todos os " +"usuários. Se false, os arquivos são instalados no diretório não padrão " +"$XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Ordem de prioridade dos formatos de empacotamentos preferidos, com os " +"formatos mais importantes listados primeiro. Uma matriz vazia significa a " +"ordem padrão. Presume-se que os formatos omitidos sejam listados por último. " +"Exemplos de formatos de empacotamento são: deb, flatpak, rpm, snap. Os " +"formatos podem ser opcionalmente especificados com um nome de origem, " +"dividido por dois pontos. Por exemplo 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"A marca de tempo da última tentativa de remover tempos de execução Flatpak " +"não utilizados" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Defina como 'true' para mostrar apenas aplicativos licenciados gratuitamente " +"e ocultar quaisquer aplicativos privativos." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Defina como 'true' para mostrar apenas aplicativos de desenvolvedores cuja a " +"identidade foi verificada." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "A marca de tempo do último histórico de atualizações recebido." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Uma string armazenando o id da gnome-online-account usada para iniciar a " +"sessão" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Instalador geral de AppStream do GNOME Programas" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Falha ao analisar os argumentos da linha de comando" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Você precisa especificar exatamente um nome de arquivo" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Este programa somente pode ser usado pelo usuário root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Falha ao validar o tipo de conteúdo: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Falha ao mover: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalação de programa" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instale programas selecionados no sistema" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violência de desenho animado" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nenhuma informação sobre violência de desenho animado" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violência de fantasia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nenhuma informação sobre violência de fantasia" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violência realista" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nenhuma informação sobre violência realista" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violência representando derramamento de sangue" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Nenhuma informação sobre derramamento de sangue" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violência sexual" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nenhuma informação sobre violência sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Álcool" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nenhuma informação sobre referências ao álcool" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narcóticos" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nenhuma informação sobre referências a drogas ilícitas" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabaco" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Nenhuma informação sobre referências a produtos de tabaco" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nudez" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nenhuma informação sobre nudez da qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Temas sexuais" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "" +"Nenhuma informação sobre referências ou representações de natureza sexual" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Palavrão" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nenhuma informação sobre palavrão de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Humor impróprio" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nenhuma informação sobre humor impróprio" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminação" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Nenhuma informação sobre linguagem discriminatória de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Propaganda" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nenhuma informação sobre propaganda de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Jogos de azar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nenhuma informação sobre jogos de azar de qualquer tipo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Compra" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nenhuma informação sobre a capacidade de gastar dinheiro" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Bate-papo entre usuários" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Nenhuma informação sobre formas de conversar com outros usuários" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Bate-papo por áudio entre usuários" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Nenhuma informação sobre formas de falar com outros usuários" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Destalhes do contato" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nenhuma informação sobre o compartilhamento de nomes de usuários de redes " +"sociais ou endereços de e-mail" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Informações de identificação" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Nenhuma informação sobre o compartilhamento de informações do usuário com " +"terceiros" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Compartilhamento de localização" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Nenhuma informação sobre o compartilhamento da localização física com outros " +"usuários" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homossexualidade" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nenhuma informação sobre referências a homossexualidade" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostituição" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nenhuma informação sobre referências a prostituição" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adultério" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nenhuma informação sobre referências a adultério" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Personagens sexualizados" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nenhuma informação sobre personagens sexualizados" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanação" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nenhuma informação sobre referências à profanação" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Restos humanos" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nenhuma informação sobre restos humanos mortos visíveis" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Escravidão" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nenhuma informação sobre referências a escravidão" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Não inclui referências a drogas" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Não inclui xingamentos, palavrões e outros tipos de linguagem forte" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Não inclui anúncios ou transações monetárias" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Não inclui sexo ou nudez" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Não inclui funcionalidade de bate-papo não controlada" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Não inclui violência" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogas" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Linguagem forte" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Dinheiro" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violência" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Todas" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s tem uma classificação por idade desconheçida" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s é adequado para todo mundo" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s é adequado para crianças de colo" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s é adequado para crianças pequenas" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s é adequado para crianças" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s é adequado para adolescentes" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s é adequado para adultos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s é adequado para %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Classificação por idade" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Como contribuir com informações ausentes" + +#: lib/gs-app.c:6367 +msgid "Local file" +msgstr "Arquivo local" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6386 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6463 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Pacote" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Pendente" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Instalação pendente" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Remoção pendente" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Instalando" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Removendo" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Baixando" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instalar" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Desinstalar…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Rede" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Pode se comunicar pela rede" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Serviços de sistema" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Pode acessar serviços D-Bus no barramento de sistema" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Serviços de seção" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Pode acessar serviços D-Bus no barramento de sessão" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Dispositivos" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Pode acessar dispositivos arbitrários, como webcams" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Pode acessar dispositivos de entrada" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Pode acessar microfones e reproduzir áudio" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Pode acessar arquivos de dispositivo de sistema" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Conteúdos da tela" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Pode acessar conteúdos da tela" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Pasta pessoal (home)" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Pode ver, editar e criar arquivos" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Pode ver arquivos" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistema de arquivos" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Pasta de downloads" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Configurações" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Pode ver ou alterar quaisquer configurações" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistema de exibição legado" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Usa um sistema de exibição antigo e inseguro" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Escape sandbox" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Pode escapar da sandbox e contornar quaisquer outras restrições" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Não foi disponibilizada a descrição da atualização." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Detalhes da atualização" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Requer permissões adicionais" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Dados de classificação inválidos recebidos do servidor" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Não foi possível comunicar com o servidor de classificação" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Avaliações" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Nenhuma avaliação foi encontrada para este app." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Sem avaliações" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Histórico de versões" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novo na versão %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versão %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Nenhum detalhe para este lançamento" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e de %B de %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Modo de inicialização, podendo ser “updates” (para atualizações), “updated” " +"(para atualizados), “installed” (para instalados) ou “overview” (para visão " +"geral)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODO" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Pesquisa por aplicativos" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "PESQUISA" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Mostra detalhes do aplicativo (usando o ID do aplicativo)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Mostra detalhes do aplicativo (usando o nome do pacote)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NOMEPACOTE" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instala o aplicativo (usando o ID do aplicativo)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Desinstala o aplicativo (usando o ID do aplicativo)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Abre um arquivo de pacote local" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NOMEDOARQUIVO" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"O tipo de interação para essa ação: pode ser ‘none’, ‘notify’ ou ‘full’" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAÇÃO" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Mostra um arquivo metainfo ou appdata local" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Ativar a verbose de depuração da saída (de uma instância atual, se já " +"execução)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instala quaisquer atualizações pendentes em segundo plano" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Mostra preferências" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Sai da instância atual" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferência a fontes locais de arquivos ao AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Mostra o número da versão" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 contribuidores do Aplicativos GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Rafael Fontenelle \n" +"Enrico Nicoletto \n" +"Georges Basile Stavracas Neto \n" +"Gustavo Marques \n" +"Ricardo Silva Veloso \n" +"Bruno Lopes \n" +"Leônidas Araújo \n" +"Matheus Barbosa \n" +"Juliano de Souza Camargo " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Sinto muito! Não há detalhes para esse aplicativo." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Tamanho instalado" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inclui %s de dados e %s de cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inclui %s de dados" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inclui %s de cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Uso de cache e de dados desconhecido" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Tamanho para baixar" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Não precisa de downloads adicionais de sistema" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Precisa de um tamanho desconhecido de downloads adicionais de sistema" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Precisa de %s de downloads adicionais de sistema" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "O tamanho é desconhecido" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Sem permissões" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Tem acesso à rede" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Usa serviços de sistema" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Usa serviços de seção" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Pode acessar dispositivo de hardware" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Pode acessar dispositivos do sistema" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Pode ler/escrever todos os seus dados" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Pode ler todos os seus dados" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Pode ler/escrever seus downloads" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Pode ler seus downloads" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Pode acessar alguns arquivos específico" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Pode acessar ou alterar as configurações de usuário" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Usa um sistema de exibição antigo" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Pode obter permissões arbitrárias" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "O desenvolvedor do programa é verificado" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Avaliado por sua distribuição" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Avaliado por %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Fornecido por um terceiro" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "O programa não possui mais suporte" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Código auditável" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Licença desconhecida" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Código privativo" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Licença especial" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privilegiado" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Seguro" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Provavelmente seguro" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potencialmente inseguro" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Inseguro" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Móvel apenas" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Funciona apenas em uma tela pequena" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Desktop apenas" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Funciona apenas em uma tela grande" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Tamanho de tela incompatível" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Não é compatível com o tamanho de tela atual" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Requer um touchscreen" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Requer um teclado" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Requer um mouse" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Precisa de gamepad" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Requer um controle/gamepad para jogar" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptativo" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Funciona em telefones, tablets e desktops" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Provavelmente requer um teclado ou mouse" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Funciona em desktops e laptops" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "" +"Contém nenhum conteúdo inapropriado com base na classificação por idade" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Nenhuma informação disponível sobre classificação por idade" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Visitar o site" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instalar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Cancelar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instalar" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Baixar" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Atualizar" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Desinstalar…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Desinstalando" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Atualização crítica" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "O dispositivo não pode ser utilizado durante a atualização." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Fonte: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Renomeado de %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Parou de receber atualizações" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Atualização crítica" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalado" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Ajudar a traduzir %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s é projetado, desenvolvido e traduzido por uma comunidade internacional de " +"voluntários.\n" +"\n" +"Isso significa que, embora ele ainda não esteja disponível em seu idioma, " +"você pode se envolver e ajudar a traduzi-lo sozinho." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traduções" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Site de _tradução" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Autenticação necessária para remoto %s (reino %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Autenticação necessária" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Cancelar" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Autenticação" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Usuário" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Senha" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Outros" + +# Embora "All" seja de uma categoria, ela refere-se a tipos de aplicativos. "Todos" aplicativos me pareceu mais adequado -- Rafael +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Todos" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Destaques" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Escolha do editor" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Novos e atualizados" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Escolhas da web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Outros programas" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s Instalado" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Um reinício é necessário para que as alterações tenham efeito" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "O aplicativo está pronto para ser usado" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Atualizações de sistema instaladas" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "" +"As atualizações recentemente instaladas estão disponíveis para avaliação" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Reiniciar" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Executar" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Instalar programa?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Instalar programa de terceiros?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Ativar repositório de software?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Habilitar repositório de programas de terceiros?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s não é um programa de código aberto e livre, e " +"é fornecido por “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s é fornecido por “%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Esta repositório de programas deve estar habilitado para continuar a " +"instalação." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Pode ser ilegal instalar ou usar %s em alguns países." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "Pode ser ilegal instalar ou usar este codec em alguns países." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Não _avisar novamente" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Habilitar e _instalar" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Seguem os erros detalhados do gerenciador de pacotes:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detalhes" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Fechar" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Detalhes copiados para a área de transferência" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Aceitar" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Uma atualização foi instalada" +msgstr[1] "Atualizações foram instaladas" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Uma app foi desinstalada" +msgstr[1] "Apps foram desinstaladas" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Um reinício é necessário para que ele tenha efeito" +msgstr[1] "Um reinício é necessário para que eles tenham efeito" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Agora não" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Hoje" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Ontem" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dia atrás" +msgstr[1] "%d dias atrás" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d semana atrás" +msgstr[1] "%d semanas atrás" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d mês atrás" +msgstr[1] "%d meses atrás" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d ano atrás" +msgstr[1] "%d anos atrás" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Agora mesmo" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuto atrás" +msgstr[1] "%d minutos atrás" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d hora atrás" +msgstr[1] "%d horas atrás" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Gráficos em 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografia" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Digitalização" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Gráficos vetoriais" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visualizadores" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Criação e edição de áudio" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Reprodutores de músicas" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Agenda" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Banco de dados" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finanças" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Processador de texto" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editores de texto" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navegadores web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Ação" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventura" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocos" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Tabuleiro" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cartas" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emuladores" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Infantil" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Lógica" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "RPG" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Esportes" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Estratégia" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Bate-papo" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Inteligência artificial" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomia" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Química" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Idiomas" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matemática" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Notícias" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robótica" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Artes" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografia" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "História em quadrinhos" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Ficção" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Saúde" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "História" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Estilo de vida" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Política" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Esportes" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Todos" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Destaques" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Depuradores" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDEs" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecs" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Drivers de hardware" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Fontes" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Fontes de entrada" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Pacotes de idiomas" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localização" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Criação" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Trabalho" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Jogo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socialização" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Aprendizagem" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Desenvolvimento" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecs" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Drivers de hardware" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Fontes" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Fontes de entrada" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Pacotes de idiomas" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Localização" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Um aplicativo" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s está requisitando suporte a formato do arquivo adicional." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Tipos MIME adicionais necessárias" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s está requisitando fontes adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Fontes adicionais necessárias" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s está requisitando codecs de multimídia adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Codecs multimídia adicionais necessários" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s está requisitando drivers de impressora adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Drivers de impressora adicionais necessários" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s está requisitando pacotes adicionais." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Pacotes adicionais necessários" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Localizar em Programas" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Mostrar mais" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Mostrar menos" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Removendo…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Requer reinício para finalizar a instalação" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Requer reinício para finalizar a remoção" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Instalação pendente…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Atualização pendente…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Baixando…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Preparando…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Desinstalando…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s não está instalado, mas ainda possui dados em disco." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Reiniciar" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Habilitar…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instalar…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s aparecerá em inglês dos EUA" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Este aplicativo aparecerá em inglês dos EUA" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Este programa aparecerá em inglês dos EUA" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Ajudar a _traduzir" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Outros aplicativos de %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "O desenvolvedor %s provou ser sua propriedade o %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "O desenvolvedor provou ser sua propriedade o %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Você precisa de acesso à Internet para escrever uma avaliação" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Este app não está mais recebendo atualizações, inclusive as de segurança" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Esse aplicativo já é fornecido por sua distribuição e não deve ser " +"substituído." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Este aplicativo não fornece links para um site, repositório de código ou " +"rastreador de problemas." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Este programa não está mais recebendo atualizações, inclusive as de segurança" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Esse programa já é fornecido por sua distribuição e não deve ser substituído." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Este programa não fornece links para um site, repositório de código ou " +"rastreador de problemas." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"O Programas falhou em recuperar informação de “%s” e é incapaz de mostrar " +"detalhes para este aplicativo." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Resposta de revisão inválida recebida do servidor" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Falha ao enviar a avaliação ao “%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Página de detalhes" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Carregando detalhes do app" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verificado" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "A_brir" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Atualizar" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Desinstalar" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Complementos" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Este aplicativo só pode ser usado quando há uma conexão de Internet ativa." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Repositório de programas incluído" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Este aplicativo inclui um repositório de software que fornece atualizações, " +"bem como acesso a outros softwares." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Nenhum repositório de programas incluído" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Este aplicativo não inclui um repositório de software. Não será atualizado " +"com novas versões." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Repositório de programas identificado" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Adicionar esse repositório de programas lhe fornecerá acesso a programas e " +"atualizações adicionais." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Use apenas repositórios de programas que você confia." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Limpar dados do app" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "R_emover dados" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Sem metadados" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Site do projeto" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Doar" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Contribuir com _tradução" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Relatar um problema" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Aj_uda" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contatar" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Escrever avaliação" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Todas as avaliações" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Não foi possível mostrar detalhes da app" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Falha ao preparar a reinicialização" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Erro desconhecido" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "A chave não foi encontrada" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "A chave não está registrada" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Registro MOK requerido" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Próxima" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Este dispositivo tem o Secure Boot ativado. Para permitir que novos drivers " +"sejam ativados, a nova chave de dono da máquina (MOK) deve ser registrada. O " +"processo requer uma senha a ser inserida depois no processo. Por favor, " +"anote a seguinte senha associada a esta chave:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Eu fiz uma anotação da _senha MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Reiniciar e registrar…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instruções de configuração: por favor, leia atentamente" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Após a reinicialização, uma tela de configuração do dispositivo será " +"mostrada. Para ativar os novos drivers, proceda através dos passos de " +"configuração:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Selecione “Registrar MOK”\n" +"• Selecione “Sim” para registrar as chaves\n" +"• Insira a senha do MOK quando perguntada\n" +"• Então, selecione “Reiniciar”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Implicações de segurança" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Após um registro com sucesso, esteja atento que quaisquer futuras " +"atualizações do módulo ou qualquer outro módulo irá ser implicitamente " +"confiado. Todas as futuras atualizações irão acontecer de forma transparente " +"sem nenhuma interação ou autorização." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Mais orientação pode ser encontrada em página de " +"documentos." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Baixando arquivos extras de metadados…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " e " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Fontes disponíveis para o script %s" +msgstr[1] "Fontes disponíveis para os scripts %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Programa disponível para %s" +msgstr[1] "Programas disponíveis para %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "O programa requisitado não foi localizado" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Falha ao localizar o programa requisitado" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s não foi encontrado" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "no site" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Não há aplicativos disponíveis que forneçam o arquivo %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informações sobre %s, bem como opções de como obter aplicativos ausentes " +"podem ser encontradas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Nenhum aplicativo está disponível para suporte a %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s não está disponível." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informações sobre %s, bem como opções de como obter um aplicativo compatível " +"com esse formato, podem ser encontradas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Não há fontes disponíveis com suporte ao script %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informações sobre %s, bem como as opções de como obter fontes adicionais " +"podem ser encontradas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Não há complementos de codecs disponíveis para o formato %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informações sobre %s, bem como as opções de como obter um codec que possa " +"reproduzir este formato podem ser encontradas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Não há recursos Plasma disponíveis para suporte a %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informações sobre %s, bem como as opções de como obter recursos Plasma " +"adicionais podem ser encontradas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Não há drivers de impressora disponíveis para %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informações sobre %s, bem como as opções de como obter um driver que ofereça " +"suporte a esta impressora podem ser encontradas %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "a documentação" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Não foi possível encontrar o %s solicitado por %s. Por favor, veja %s para " +"mais informações." +msgstr[1] "" +"Não foi possível encontrar os %s solicitados por %s. Por favor, veja %s para " +"mais informações." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Não foi possível encontrar o %s que você estava procurando. Por favor, veja " +"%s para mais informações." +msgstr[1] "" +"Não foi possível encontrar os %s que você estava procurando. Por favor, veja " +"%s para mais informações." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Falha em localizar qualquer resultado de pesquisa: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Formato de arquivo %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Instalar _todos" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Não foi possível localizar o programa requisitado" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Página de codecs" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Nenhum resultado encontrado" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Não foi possível performar uma busca" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Anterior" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Próxima" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Lista de aplicativos em destaque" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Suporte a desktop" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Tem suporte a ser usado em uma tela grande" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Suporte desconhecido a desktop" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Não há informações suficientes para saber se telas grandes são suportadas" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Requer uma tela grande" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Desktop não suportado" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Não pode ser usado em uma tela grande" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Suporte a dispositivo móvel" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Tem suporte a ser usado em uma tela pequena" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Suporte desconhecido a dispositivo móvel" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Não há informações suficientes para saber se telas pequenas são suportadas" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Requer uma tela pequena" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Dispositivo móvel não suportado" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Não pode ser usado em uma tela pequena" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Suporte a teclado" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Suporte desconhecido a teclado" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Não há informações suficientes para saber se teclados são suportados" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Teclado necessário" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Tem suporte a teclados" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Teclado não suportado" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Não pode ser usado com um teclado" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Suporte a mouse" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Requer um mouse ou dispositivo de apontamento" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Suporte desconhecido a mouse" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Não há informações suficientes para saber se mouses ou dispositivos de " +"apontamento são suportados" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Mouse necessário" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Tem suporte a mouses e dispositivos de apontamento" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Mouse não suportado" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Não pode ser usado com um mouse ou dispositivo de apontamento" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Suporte a touchscreen" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Suporte desconhecido a touchscreen" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Não há informações suficientes para saber se touchscreens são suportadas" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Touchscreen necessária" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Tem suporte a touchscreens" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Touchscreen não suportado" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Não pode ser usado com uma touchscreen" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Gamepad necessário" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Requer um gamepad" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Suporte a gamepad" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Tem suporte a gamepads" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s provavelmente funciona neste dispositivo" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s funciona neste dispositivo" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s provavelmente funciona neste dispositivo" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s não vai funcionar corretamente neste dispositivo" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s não vai funcionar neste dispositivo" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Suporte a hardware" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navegação" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navegar pela página explorar" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navegar pela página instaladas" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navegar pela página atualizações" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Abrir barra de pesquisa" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Janelas" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Abrir preferências" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Abrir repositórios de programas" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Ajuda" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Abrir atalhos de teclado" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalados" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Página de instalados" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Em progresso" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplicativos" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Aplicativos web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Aplicativos do sistema" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Construído pela comunidade" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Participe" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este aplicativo é desenvolvido abertamente por uma comunidade de voluntários " +"e lançado sob a licença %s.\n" +"\n" +"Você pode contribuir e ajudar a torná-lo ainda melhor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este aplicativo é desenvolvido abertamente por uma comunidade de voluntários " +"e lançado sob a licença %s.\n" +"\n" +"Você pode contribuir e ajudar a torná-lo ainda melhor." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este programa é desenvolvido abertamente por uma comunidade de voluntários e " +"lançado sob a licença %s.\n" +"\n" +"Você pode contribuir e ajudar a torná-lo ainda melhor." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Este programa é desenvolvido abertamente por uma comunidade de voluntários e " +"lançado sob a licença %s.\n" +"\n" +"Você pode contribuir e ajudar a torná-lo ainda melhor." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Licença desconhecida" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "A_prenda mais" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Este aplicativo não informa sob qual licença é desenvolvido, e pode ser " +"privativo. Pode ser inseguro de maneiras difíceis de detectar e pode mudar " +"sem muito alarde.\n" +"\n" +"Você pode não ser capaz de contribuir para este aplicativo." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este programa não informa sob qual licença é desenvolvido, e pode ser " +"privativo. Pode ser inseguro de maneiras difíceis de detectar e pode mudar " +"sem muito alarde.\n" +"\n" +"Você pode não ser capaz de contribuir para este programa." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Privativo" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Este aplicativo não é desenvolvido abertamente, então apenas seus " +"desenvolvedores sabem como ele funciona. Pode ser inseguro de maneiras " +"difíceis de detectar e pode mudar sem muito alarde.\n" +"\n" +"Você pode não ser capaz de contribuir para este aplicativo." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Este programa não é desenvolvido abertamente, então apenas seus " +"desenvolvedores sabem como ele funciona. Pode ser inseguro de maneiras " +"difíceis de detectar e pode mudar sem muito alarde.\n" +"\n" +"Você pode não ser capaz de contribuir para este programa." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Licença especial" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Este aplicativo é desenvolvido sob a licença especial %s.\n" +"\n" +"Você pode não ser capaz de contribuir para este aplicativo." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Este aplicativo é desenvolvido sob a licença especial “%s”.\n" +"\n" +"Você pode não ser capaz de contribuir para este aplicativo." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este programa é desenvolvido sob a licença especial %s.\n" +"\n" +"Você pode não ser capaz de contribuir para este programa." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Este programa é desenvolvido sob a licença especial “%s”.\n" +"\n" +"Você pode não ser capaz de contribuir para este programa." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Atualizando dados" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Carregando página" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Iniciando" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Fonte desconhecida" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Usuário" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Adições" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Remoções" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Atualizações" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Downgrades" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "fontes externas selecionadas" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Fornece acesso a software adicional de %s. Está incluído algum software " +"privativo.\n" +"\n" +"Você pode habilitar esses repositórios posteriormente nas preferências de " +"repositórios de programas." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Habilitar repositórios de programas de terceiros?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorar" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Habilitar" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Disponível para seu sistema operacional" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Disponível para %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Explorar" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Página de visão geral" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Apps disponíveis" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Outras categorias" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nenhum dado de aplicativo encontrado" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Desconhecida" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Ok" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Instalação recusada pelo usuário" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Preparar %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Você tem certeza de que deseja remover o repositório %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Todos os aplicativos de %s serão desinstalados e você terá que reinstalar o " +"repositório para usá-los novamente." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Desinstalar %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Não será possível utilizar %s após sua remoção." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Não será possível utilizar quaisquer apps que dependam de %s após a sua " +"remoção." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Não será mais possível utilizar %s após a sua remoção, e quaisquer " +"documentos que a utilizem vão aparecer numa fonte diferente." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Não será mais possível utilizar %s após a sua remoção. Isto pode significar " +"que alguns arquivos de mídia não serão mais reproduzíveis." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Hardware que dependa de %s pode não mais funcionar corretamente após a " +"remoção." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Não será mais possível utilizar %s após a remoção. Dados do app e " +"configurações serão mantidas em disco para possibilitar a restauração do app " +"no futuro." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferências" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Atualizações de programas" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Mais informações" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Verificar por e baixar atualizações usa dados e energia. Atualizações " +"automáticas são, portanto, postas em pausa quando em conexão de rede " +"limitada ou em economia de energia." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "Automático" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Verificar por e baixar atualizações automaticamente" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Verificar por e baixar atualizações deve ser feito manualmente" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Notificações de atualização automática" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Notificar quando as atualizações forem instaladas automaticamente" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtros de conteúdo" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Mostrar somente programas _livre" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Ocultar programas privativos quando navegando ou buscando" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Mostrar somente desenvolvedores _verificados" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Mostrar apenas aplicações de desenvolvedores cuja identidade foi verificada" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"O software instalado é incompatível com %s e será removido automaticamente " +"durante a atualização." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Programa incompatível" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "At_ualizar" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Desinstalar" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Configurações e dados do aplicativo" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Manter" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Permite restaurar configurações e conteúdos do app" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Remover" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Remove permanentemente dados para poupar espaço em disco" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Programas que foram instalados a partir de “%s” vão deixar de receber " +"atualizações." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Desabilitar repositório?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Remover repositório?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Desabilitar" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Remover" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Habilitar novos repositórios" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Ativa novos repositórios quando eles forem adicionados" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "mais informações" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Repositórios adicionais a partir de terceiros selecionados — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Repositórios de terceiros do Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "o sistema operacional" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Esses repositórios complementam o programa padrão fornecido por %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Repositórios de programas" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Nenhum repositório" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplicativo instalado" +msgstr[1] "%u aplicativos instalados" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u complemento instalado" +msgstr[1] "%u complementos instalados" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplicativo" +msgstr[1] "%u aplicativos" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u complemento" +msgstr[1] "%u complementos" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s e %s instalado" +msgstr[1] "%s e %s instalados" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Verificando programas instalados…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Remover" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Odiei" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Não gostei" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "É bom" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Gostei" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Adorei" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Selecione uma estrela para deixar uma avaliação" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Por favor, leve mais tempo escrevendo a avaliação" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Por favor, escolha uma estrela de classificação" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "A resenha está curta demais" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "A resenha está grande demais" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "A descrição está curta demais" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "A descrição está grande demais" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Escreva uma avaliação" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Enviar" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Favor fornecer uma nota, resumo e avaliação. Avaliações não devem ser usadas " +"para relatar problemas: antes, contate um desenvolvedor ou seu provedor de " +"suporte." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Resumo da avaliação" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Escreva uma breve avaliação" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Encontre quais dados são enviados em nossa política de privacidade. O nome completo anexado à sua conta " +"será mostrada publicamente." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u avaliação no total" +msgstr[1] "%u avaliações no total" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "de 5 estrelas" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Desconhecido" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Você pode relatar avaliações para comportamento abusivo, rude ou " +"discriminatório." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Uma vez relatada, uma avaliação será ocultada até que seja verificada por um " +"administrador." + +# Semelhante a denunciar um abuso do usuário que escreveu a avaliação +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Relatar avaliação?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Relatar" + +# Semelhante a denunciar um abuso do usuário que escreveu a avaliação +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Remover avaliação?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Remover uma avaliação não pode ser desfeito." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Gostar duma avaliação" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Desgostar duma avaliação" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Relatar…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Remover…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"O aplicativo não funciona em sandbox, mas a distribuição verificou que não é " +"malicioso" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Verifique se você confia no fornecedor, já que o aplicativo não funciona em " +"sandbox" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Sem permissões" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "O aplicativo é totalmente executado em uma caixa de proteção" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Acesso de rede" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Pode acessar a internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Sem acesso à rede" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Não pode acessar a internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Usa serviços de sistema" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Pode requisitar dados de serviços de sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Usa serviços de seção" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Pode requisitar dados de serviços de seção" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Acesso ao dispositivo do usuário" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Pode acessar dispositivos tais como webcams ou controles de jogos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Sem acesso ao dispositivo do usuário" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Não pode acessar dispositivos tais como webcams ou controles de jogos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Acesso aos dispositivo de entrada" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Acesso ao microfone e reprodução de áudio" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Pode ouvir usando microfones e reproduzir áudio sem pedir permissão" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Acesso ao dispositivo do sistema" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Pode acessar dispositivos do sistema que requerem permissões elevadas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Acesso aos conteúdos da tela" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Pode acessar os conteúdos da tela ou outras janelas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Sistema de exibição antigo" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Permissões arbitrárias" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Configurações de usuário" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Acesso de leitura/escrita a todo o sistema de arquivos" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Pode ler e escrever todos os dados no sistema de arquivos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Acesso de leitura/escrita à pasta Home" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Pode ler e escrever todos os dados em seu diretório pessoal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Acesso de leitura a todo o sistema de arquivos" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Pode ler todos os dados no sistema de arquivos" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Acesso de leitura à pasta Home" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Pode ler todos os dados em seu diretório pessoal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Acesso de leitura/escrita a pasta Downloads" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Pode ler e escrever todos os dados em seu diretório de downloads" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Acesso de leitura à pasta downloads" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Pode ler todos os dados em seu diretório de downloads" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Pode ler e escrever todos os dados no diretório" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Pode ler todos os dados no diretório" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Sem acesso ao sistema de arquivos" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Não pode acessar o sistema de arquivos" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "O desenvolvedor do aplicativo é verificado" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"O desenvolvedor deste aplicativo foi verificado como sendo quem diz ser" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Dependências inseguras" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"O programa ou suas dependências não possui mais suporte ou pode ser inseguro" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Este app não especifica sob qual licença está sendo desenvolvido, e pode ser " +"privativo" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Este programa não especifica sob qual licença está sendo desenvolvido, e " +"pode ser privativo" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Código privativo" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"O código-fonte não é público, portanto não pode ser auditado de forma " +"independente e pode não ser seguro" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Este app é desenvolvido sob a licença especial “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Este programa é desenvolvido sob a licença especial “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Código auditável" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"O código-fonte é público, portanto pode ser auditado de forma independente, " +"o que aumenta a probabilidade do aplicativo ser seguro" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s é privilegiado" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s é seguro" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s é provavelmente seguro" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s é potencialmente inseguro" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s é inseguro" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Desconhecida" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Segurança" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licença" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Fonte" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Esta app usa uma versão desatualizada da plataforma de software (SDK) e pode " +"conter erros ou vulnerabilidades de segurança que não foram consertadas." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Captura de tela anterior" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Próxima captura de tela" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Sem capturas de tela" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "A captura de tela não foi localizada" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Ocorreu falha ao carregar imagem" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "O tamanho da captura de tela não foi localizada" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Não foi possível criar o cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "A captura de tela não é válida" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "A captura de tela não está disponível" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Captura de tela" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "mais %u correspondência" +msgstr[1] "mais %u correspondências" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Página de pesquisa" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Pesquisa por Apps" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Nenhum aplicativo encontrado" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "Não foi possível baixar as atualizações" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "Não foi possível baixar atualizações de firmware" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Não foi possível baixar atualizações de firmware de %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Não foi possível baixar atualizações de %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "Não foi possível atualizar: requer acesso à Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "Não foi possível atualizar: não há espaço suficiente em disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Não foi possível baixar as atualizações de %s: não há espaço suficiente em " +"disco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "Não foi possível atualizar: requer autenticação" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "Não foi possível atualizar: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "Não foi possível atualizar: requer permissão" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Não foi possível baixar atualizações: você não tem permissão para instalar " +"esse programa" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "Não foi possível obter a lista de atualizações" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "Não foi possível instalar: o download falhou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Não foi possível instalar %s: o download de %s falhou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Não foi possível instalar %s: o download falhou" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "Não foi possível instalar: tempo de execução faltante" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Não foi possível instalar %s: o runtime %s não está disponível" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "Não foi possível instalar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "Não foi possível instalar: requer acesso à Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "Não foi possível instalar: o aplicativo tem um formato inválido" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "Não foi possível instalar: não há espaço suficiente em disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Não foi possível instalar %s: não há espaço suficiente em disco" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "Não foi possível instalar: requer autenticação" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Não foi possível instalar %s: requer autenticação" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "Não foi possível instalar: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Não foi possível instalar %s: autenticação inválida" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "Não foi possível instalar: requer permissões" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Não foi possível instalar %s: requer permissões" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "Não foi possível instalar: requer energia CA" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Não foi possível instalar %s: requer energia CA" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "Não foi possível instalar: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Não foi possível instalar %s: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Não foi possível atualizar %s de %s: o download falhou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Não foi possível atualizar %s: o download falhou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Não foi possível instalar atualizações de %s: o download falhou" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "Não foi possível atualizar: o download falhou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Não foi possível atualizar %s: não há espaço suficiente em disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Não foi possível atualizar %s: requer autenticação" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Não foi possível atualizar %s: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Não foi possível atualizar %s: requer permissão" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "Não foi possível atualizar: requer energia CA" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Não foi possível atualizar %s: requer energia CA" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "Não foi possível atualizar: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Não foi possível atualizar %s: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "Não foi possível atualizar %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "Não foi possível atualizar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "Não foi possível atualizar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Não foi possível atualizar para %s de %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "Não foi possível atualizar: o download falhou" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Não foi possível atualizar para %s: o download falhou" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "Não foi possível atualizar: requer acesso à Internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Não foi possível atualizar para %s: requer acesso à Internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "Não foi possível atualizar: não há espaço suficiente em disco" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Não foi possível atualizar para %s: não há espaço suficiente em disco" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "Não foi possível atualizar: requer autenticação" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Não foi possível atualizar para %s: requer autenticação" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "Não foi possível atualizar: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Não foi possível atualizar para %s: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "Não foi possível atualizar: requer permissões" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Não foi possível atualizar para %s: requer permissões" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Não foi possível atualizar: requer energia CA" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Não foi possível atualizar para %s: requer energia CA" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "Não foi possível atualizar: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Não foi possível atualizar para %s: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Não foi possível atualizar para %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "Não foi possível desinstalar: requer autenticação" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Não foi possível desinstalar %s: requer autenticação" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "Não foi possível desinstalar: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Não foi possível desinstalar %s: autenticação inválida" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "Não foi possível desinstalar: requer permissões" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Não foi possível desinstalar %s: requer permissões" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Não foi possível desinstalar: requer energia CA" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Não foi possível desinstalar %s: requer energia CA" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "Não foi possível desinstalar: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Não foi possível desinstalar %s: bateria baixa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Não foi possível desinstalar %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "Não foi possível abrir %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "Desculpe, alguma coisa deu errado" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Não é possível iniciar %s: %s não está instalado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "Não há espaço suficiente em disco para a operação" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "Não foi possível instalar: tipo de arquivo não suportado" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "Não foi possível instalar: a autenticação falhou" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "Não foi possível instalar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "Não foi possível entrar em contato com %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "O Programas precisa ser reiniciado para usar novos plug-ins" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "O dispositivo necessita estar conectado à energia CA" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "O nível da bateria está baixo demais" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Repositório_s de programas" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferências" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "A_talhos de teclado" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Sobre o Programas" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Pesquisar" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Menu principal" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Pesquisar aplicativos" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Explorar" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalados" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Atualizações" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Voltar" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nada" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Dados do aplicativo" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Dados necessários para o aplicativo ser executado" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Dados do usuário" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Dados criados por você no aplicativo" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Dados do cache" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dados armazenados temporariamente em cache" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "O aplicativo em si" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dependências necessárias" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Componentes de sistema compartilhados exigidos por este aplicativo" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Desconhecido" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Os dados em cache podem ser limpos nas configurações da " +"_aplicação." + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Armazenamento" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instalado)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Instalando)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Baixando)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Removendo)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detalhes" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examine" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Instalado em %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Atualizações instaladas" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Nenhuma atualização instalada" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Atualizações estão desatualizadas" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Verifique por atualizações disponíveis" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Atualizações críticas prontas para instalação" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Instalar atualizações críticas assim que possível" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Atualizações críticas disponíveis para download" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Baixar atualizações críticas assim que possível" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Atualizações prontas para instalação" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Atualizações de programa estão prontas e aguardando" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Atualizações disponíveis para download" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Atualizações de programas podem ser baixadas" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplicativo atualizado — é necessário reiniciar" +msgstr[1] "%u aplicativos atualizados — é necessário reiniciar" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplicativo atualizado" +msgstr[1] "%u aplicativos atualizados" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s foi atualizado." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Por favor, reinicie o aplicativo." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s e %s foram atualizados." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplicativo requer reinicialização." +msgstr[1] "%u aplicativos requerem reinicialização." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inclui %s, %s e %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "O sistema atingiu o fim da vida" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Atualize o sistema para continuar a receber atualizações" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Uma nova versão de %s está disponível para instalação" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Atualizações de programas disponíveis" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Ocorreu falha em atualizações de programas" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "As atualizações preparadas não foram instaladas" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Mostrar detalhes" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Atualização do sistema concluída" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Bem-vindo ao %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Atualização de programa instalada" +msgstr[1] "Atualizações de programas instaladas" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Uma atualização importante do sistema operacional foi instalada." +msgstr[1] "Atualizações importantes do sistema operacional foram instaladas." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Verificar" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Ocorreu falha ao atualizar" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "O sistema já está atualizado." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "A atualização foi cancelada." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Era necessário acesso à internet, mas que não estava disponível. Por favor, " +"certifique-se de que você possui acesso à internet e tente novamente." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Ocorreram problemas de segurança com a atualização. Por favor consulte o seu " +"fornecedor de programa para mais detalhes." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Não há espaço suficiente em disco. Por favor libere algum espaço e tente " +"novamente." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Desculpe-nos: ocorreu falha na instalação da atualização. Por favor aguarde " +"por outra atualização e tente novamente. Se o problema continuar, entre em " +"contato com seu fornecedor de programa." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Última verificação: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Parar" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Verificar por atualizações" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s parou de receber atualizações críticas de software" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Seu sistema operacional parou de receber atualizações críticas de software" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Podem ser feitas cobranças" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Verificar atualizações quando se está usando conexão móvel pode resultar em " +"cobranças extras." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Verificar mesmo _assim" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Atualizações de programas baixadas" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Atualizações estão prontas para serem instaladas" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Verificação de atualizações" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Atualizações" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Página de atualizações" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Carregando atualizações" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Isso pode levar um tempo" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Atualizado" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Usar dados móveis?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Verificar atualizações quando se está usando conexão móvel pode resultar em " +"cobranças extras" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "Verifi_car mesmo assim" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Sem conexão" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Fique online para verificar atualizações" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Co_nfigurações de rede" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Erro" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "As atualizações são gerenciadas automaticamente" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Atualizações de programas em pausa" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Atualizações automáticas de programas está em pausa devido as seguintes " +"razões:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• A conexão de rede atual é limitada" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• A conexão de rede atual proíbe grandes downloads" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Modo economia de energia ativado" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Modo jogo ativado" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Atualizações de programas em pausa" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Conexão de rede limitada - atualizações de programas em pausa" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Conexão de rede proíbe grandes downloads - atualizações de programas em pausa" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Modo economia de energia ativado - atualizações de programas em pausa" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Modo jogo ativado - atualizações de programas em pausa" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Reiniciar e atualizar…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "At_ualizar tudo" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Atualizações de programas baixadas" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Atualizações prontas para instalação" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Firmware integrado" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Requer reinício" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Atualizações do aplicativo" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Firmware de dispositivo" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Baixar" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s disponível" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s disponível" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Saiba mais sobre a nova versão" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s de %s baixado" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% baixado" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Uma atualização importante, com novos recursos e polimento adicionado." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Cancelar atualização" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Reiniciar e atualizar…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Lembre-se de fazer backup dos dados e arquivos antes de atualizar." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Detalhes do erro" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Copiar detalhes" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Falha ao remover o arquivo “%s”: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Falha ao remover o diretório “%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Adicione, remova ou atualize programas neste computador" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "Atualizações;Upgrade;Atualização;Fontes;Repositórios;Preferências;Instalação;Instalar;Desinstalar;Programa;Software;Aplicativo;App;Loja;Store;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s Pronta" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "O %s está pronto para ser ativado e entrar na próxima reinicialização." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Habilitar" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Atualização do sistema" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Atualizações gerais do sistema, como segurança ou correção de bugs e " +"melhorias de desempenho." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Atualização de %s com novos recursos e correções." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" +"O serviço de atualização do EOS não conseguiu obter e aplicar a atualização." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Aplicativos web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Suporte a aplicativos web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Execute aplicativos populares da web em um navegador" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Atualize para os últimos recursos, melhorias de desempenho e estabilidade." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Suporte a flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak é um framework para aplicativos de desktop no Linux." + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Pasta do sistema %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Subpasta de pasta pessoal %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Pastas do sistema hospedeiro" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Configuração do sistema hospedeiro de /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Pasta da área de trabalho" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Subpasta da área de trabalho %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Pasta de documentos" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Subpasta de documentos %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Pasta de músicas" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Subpastas de músicas %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Pasta de fotos" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Subpasta de imagens %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Pasta de compartilhamento público" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Subpasta de compartilhamento público %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Pasta de vídeos" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Subpasta de vídeos %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Pasta de modelos" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Subpasta de modelos %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Pasta de cache do usuário" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Subpasta de cache do usuário %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Pasta de configuração do usuário" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Subpasta de configuração do usuário %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Pasta de dados do usuário" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Subpasta de dados do usuário %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Pasta de tempo de execução do usuário" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Subpasta de tempo de execução do usuário %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Acesso ao sistema de arquivos para %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Obtendo metadados de flatpak para %s…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Falha ao refinar o complemento “%s”: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instalação de usuário" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instalação de sistema" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID do app" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Falha ao adicionar para instalação para o complemento “%s”: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Falha ao adicionar para desinstalação para o complemento “%s”: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"O “%s” remoto não permite a instalação do “%s”, possivelmente devido ao seu " +"filtro. Remova o filtro e repita a instalação. Detalhes do erro: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "A energia do sistema está muito baixa para realizar a atualização" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"A energia do sistema está muito baixa para executar a atualização (%u%%, " +"requer %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "O dispositivo está inacessível ou fora do alcance sem fio" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "A energia da bateria do dispositivo está muito baixa" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"A energia da bateria do dispositivo está muito baixa (%u%%, requer %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "O dispositivo está aguardando a atualização para ser aplicada" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "O dispositivo requer energia CA para ser conectado" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "O dispositivo não pode ser usado enquanto a tampa estiver fechada" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Atualização do dispositivo %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Atualização do sistema %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Atualização do controlador embarcado %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Atualização do ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Atualização corporativa de ME para %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Atualização consumidor-final de ME para %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Atualização do controlador %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Atualização de Controlador Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Atualização de microcódigo de CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Atualização da configuração de %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Atualização de bateria de %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Atualização de câmera %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Atualização TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Atualização do touchpad %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Atualização do mouse %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Atualização do teclado %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Atualização do controlador de armazenamento %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Atualização da interface de rede %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Atualização da tela %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Atualização do BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Atualização do receptor USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Atualização da unidade %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Atualização da unidade flash %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Atualização do SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Atualização da GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Atualização da dock %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Atualização da dock USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Atualização de firmware não pôde ser aplicada: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Suporte a atualização de firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Fornece suporte para atualizações de firmwares" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Instalar programa sem assinatura?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"O software a ser instalado não possui assinatura. Não será possível " +"verificar a origem das atualizações deste software ou se as atualizações " +"foram adulteradas." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Baixar programa sem assinatura?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Atualizações sem assinatura estão disponíveis. Sem uma assinatura, não será " +"possível verificar a origem da atualização ou se foi adulterada." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Atualizar programa sem assinatura?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Atualizações sem assinatura estão disponíveis. Sem uma assinatura, não será " +"possível verificar a origem da atualização ou se foi adulterada. " +"Atualizações de programas serão desabilitadas até que as atualizações sem " +"assinaturas sejam removidas ou atualizadas." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Não foi possível instalar atualizações: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pacotes" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Falhou em esperar o fim de em transação antes do download: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Não foi possível baixar as atualizações: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Não foi possível instalar atualizações: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Sistema operacional (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Suporte a Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Um snap é um pacote universal de Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistema" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Componente do sistema" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "A remoção do trabalho sysupdate '%s' falhou com o status %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Um modo agradável de gerenciar programas no seu sistema." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Por favor, insira um nível de 1 a %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Escolha um aplicativo:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s está agora instalado" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Um aplicativo foi removido" +#~ msgstr[1] "Aplicativos foram removidos" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Não foi possível localizar “%s”" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Baixando o catálogo de programas" + +#~ msgid "Moderate page" +#~ msgstr "Página moderada" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Não há avaliações para moderar" + +#~ msgid "Was this review useful to you?" +#~ msgstr "A avaliação foi útil para você?" + +#~ msgid "Yes" +#~ msgstr "Sim" + +#~ msgid "No" +#~ msgstr "Não" + +#~ msgid "Meh" +#~ msgstr "Meh" + +#~ msgid "Outdated SDK version" +#~ msgstr "Versão de SDK desatualizada" + +#~ msgid "Unable to install updates" +#~ msgstr "Não foi possível instalar atualizações" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Não foi possível desinstalar: autenticação inválida" + +#~ msgid "Network Settings" +#~ msgstr "Configurações de rede" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Atualizações de sistema operacional indisponíveis" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "" +#~ "Uma atualização importante do sistema operacional para ser instalada." + +#~ msgid "No Network" +#~ msgstr "Nenhuma rede" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Acesso à internet é necessário para verificar atualizações." + +#~ msgid "Network _Settings" +#~ msgstr "Configuraçõe_s de rede" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Atualizações de programa estão baixadas e prontas para serem instaladas." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Atualizações de programas estão baixadas e prontas para serem instaladas." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Baixando informação de atualização…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Mostra informações detalhadas de depuração" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Pode acessar arquivos arbitrários" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Atualizações automáticas pausadas" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an un­metered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been in­correctly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "A rede atual é limitada. As conexões limitadas têm limites de dados ou " +#~ "cobranças associadas a elas. Para economizar dados, as atualizações " +#~ "automáticas foram pausadas.\n" +#~ "\n" +#~ "As atualizações automáticas serão retomadas quando uma rede não limitada " +#~ "estiver disponível. Até lá, ainda é possível instalar atualizações " +#~ "manualmente.\n" +#~ "\n" +#~ "Como alternativa, se a rede atual tiver sido incorretamente identificada " +#~ "como sendo limitada, essa configuração poderá ser alterada." + +#~ msgid "Open Network _Settings" +#~ msgstr "Abrir configuraçõe_s de rede" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Você tem certeza de que deseja desinstalar %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s será desinstalado e você precisará instalar para usá-lo novamente." + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Para evitar cobranças e limites de rede, atualizações de software não são " +#~ "baixadas automaticamente em conexões móveis ou limitadas." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Baixa e instala atualizações de software em segundo plano, quando possível" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Mostrar apenas _aplicativos gratuitos" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Mostre apenas aplicativos licenciados gratuitamente e oculte todos os " +#~ "aplicativos privativos" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "O que você gostou neste aplicativo? Deixando seu feedback junto com as " +#~ "razões para deixar um comentário são úteis para os outros." + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Não foi possível baixar as atualizações: foi solicitado acesso à " +#~ "Internet, mas a mesma não está disponível" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "" +#~ "Não foi possível baixar as atualizações: não há espaço suficiente em disco" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Não foi possível baixar atualizações: requer autenticação" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Não foi possível baixar atualizações: autenticação inválida" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Não foi possível instalar %s: você não tem permissão para instalar esse " +#~ "programa" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Não foi possível instalar %s: o nível da bateria está baixo demais" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "" +#~ "Não foi possível instalar atualizações: não há espaço suficiente em disco" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Não foi possível instalar atualizações: requer autenticação" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Não foi possível instalar atualizações: autenticação inválida" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Não foi possível atualizar %s: você não tem permissão para atualizar esse " +#~ "programa" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Não foi possível instalação atualizações: você não tem permissão para " +#~ "atualizar esse programa" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Não foi possível instalar atualizações: requer energia AC" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Não foi possível atualizar %s: o nível da bateria está baixo demais" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "Não foi possível instalar atualizações: o nível da bateria está baixo " +#~ "demais" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Não foi possível atualizar para %s: foi solicitado acesso à Internet, mas " +#~ "não está disponível" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Não foi possível atualizar para %s: você não tem permissão para atualizar" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "" +#~ "Não foi possível atualizar para %s: o nível da bateria está baixo demais" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Não foi possível remover %s: requer autenticação" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Não foi possível remover %s: autenticação inválida" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Não foi possível remover %s: você não tem permissão para remover esse " +#~ "programa" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Não foi possível remover %s: requer energia AC" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Não foi possível remover %s: o nível da bateria está baixo demais" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Não foi possível remover %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Falha ao instalar o arquivo: não há suporte" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Falha ao instalar: não há suporte" + +#~ msgid "AC power is required" +#~ msgstr "Energia AC é necessária" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Rede limitada ‒ atualizações automáticas em pausa" + +#~ msgid "Find Out _More" +#~ msgstr "Saiba _mais" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "" +#~ "Uma atualização importante de programa está pronta para ser instalada." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Importante: atualizações críticas de programa estão aguardando." + +#~ msgid "Downloading featured images…" +#~ msgstr "Baixando imagens de destaques…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "A última marca de tempo quando o sistema esteve online e obteve alguma " +#~ "atualização" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Este programa não está disponível em seu idioma e aparecerá em inglês." + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Os complementos selecionados serão instalados com o aplicativo." + +#~ msgid "Applications" +#~ msgstr "Aplicativos" + +#~ msgid "_Continue" +#~ msgstr "_Continuar" + +#~ msgid "Post Review" +#~ msgstr "Publicar avaliação" + +#~ msgid "_Post" +#~ msgstr "_Publicar" + +#~ msgid "Rating" +#~ msgstr "Classificação" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Forneça uma breve resenha da sua avaliação, por exemplo: “Ótimo " +#~ "aplicativo, eu recomendo”." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Avaliação" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "O que você acha deste aplicativo? Tente justificar seu ponto de vista." + +#~ msgid "No screenshot provided" +#~ msgstr "Nenhuma captura de tela fornecida" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Reiniciar agora" + +#~ msgid "Primary Menu" +#~ msgstr "Menu principal" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Atualizações" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s não possui mais suporte." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Isso significa que ele não recebe atualizações de segurança." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "É recomendável que você atualize para uma versão mais recente." + +#~ msgid "Application Updates" +#~ msgstr "Atualizações de aplicativos" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Gerenciador de aplicativos para o GNOME" + +#~ msgid "Name" +#~ msgstr "Nome" + +#~ msgid "user" +#~ msgstr "usuário" + +#~ msgid "Channel" +#~ msgstr "Canal" + +#~ msgid "Branch" +#~ msgstr "Ramo" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Instalação" + +#~ msgid "Version" +#~ msgstr "Versão" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Nenhuma atualização foi instalada neste sistema." + +#~ msgid "A list of popular applications" +#~ msgstr "Uma lista de aplicações populares" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Uma lista de aplicativos para usar, substituindo aqueles definidos pelo " +#~ "sistema." + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "O catálogo de programas está sendo baixado" + +#~ msgid "Access arbitrary files" +#~ msgstr "Acesse arquivos arbitrários" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Pode acessar arquivos arbitrários no sistema de arquivos" + +#~ msgid "Checking…" +#~ msgstr "Verificando…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Carregando…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Baixando classificações de aplicativo…" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "" +#~ "A URI que referencia o plano de fundo para um banner de atualização." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "A URI pode conter até três “%u”, que serão substituídos pela versão da " +#~ "atualização." + +#~ msgid "Welcome" +#~ msgstr "Bem-vindo" + +#~ msgid "Welcome to Software" +#~ msgstr "Bem-vindo ao Programas" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "O Programas permite a você instalar todos os programas que você precisa, " +#~ "tudo de um só lugar. Consulte nossas recomendações, navegue pelas " +#~ "categorias ou pesquise pelos aplicativos que desejar." + +#~ msgid "_Browse Software" +#~ msgstr "_Navegar no Programas" + +#~ msgid "_Add shortcut" +#~ msgstr "_Adicionar atalho" + +#~ msgid "Re_move shortcut" +#~ msgstr "Re_mover atalho" + +#~ msgid "OS Updates" +#~ msgstr "Atualizações do SO" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Inclui melhorias de desempenho, estabilidade e segurança." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Baixando assinatura de atualização de firmware…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Baixando metadados de atualização de firmware…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "O programa tem permissões desconhecidas" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "O programa vem de uma fonte confiável" + +#~ msgid "Unknown Permissions" +#~ msgstr "Permissões desconhecidas" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "As permissões necessárias por este aplicativo não são reconhecidas" + +#~ msgid "App comes from a trusted source" +#~ msgstr "O aplicativo vem de uma fonte desconhecida" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Sua distribuição verificou que este aplicativo é confiável" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "" +#~ "Mostrar pergunta quanto a instalação de repositórios de programas não " +#~ "livres" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "Não otimizado para telefones ou dispositivos de toque" + +#~ msgid "_Read More" +#~ msgstr "_Ler mais" + +#~ msgid "_Read Less" +#~ msgstr "_Ler menos" + +#~ msgid "_Launch" +#~ msgstr "_Executar" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Alguns destes programas são privativos e, portanto, possuem restrições de " +#~ "uso, compartilhamento e acesso ao código fonte." + +#~ msgid "Find out more…" +#~ msgstr "Saiba mais…" + +#~ msgid "_Remove All" +#~ msgstr "_Remover todos" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Atualizações serão aplicadas quando o computador for reiniciado." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Aguardando para baixar %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Baixando %s %s" + +#~ msgid "Recently Updated" +#~ msgstr "Atualizado recentemente" + +#~ msgid "Recent Releases" +#~ msgstr "Lançamentos recentes" + +#~ msgid "Remove “%s”?" +#~ msgstr "Remover “%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Desabilitar “%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Nenhum repositório adicional" + +#~ msgid "_Remove…" +#~ msgstr "_Remover…" + +#~ msgid "_Disable…" +#~ msgstr "_Desabilitar…" + +#~ msgid "Enabling" +#~ msgstr "Habilitando" + +#~ msgid "Disabling" +#~ msgstr "Desabilitando" + +#~ msgid "Enabled" +#~ msgstr "Habilitado" + +#~ msgid "Disabled" +#~ msgstr "Desabilitado" diff --git a/po/ro.po b/po/ro.po new file mode 100644 index 0000000..4657026 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,6443 @@ +# Romanian translation for gnome-software. +# Copyright (C) 2014 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Bogdan Mințoi , 2014. +# Daniel Șerbănescu , 2014-2019. +# Daniel Batalu , 2022. +# Antonio Marin , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-10 21:07+0000\n" +"PO-Revision-Date: 2025-03-11 12:37+0100\n" +"Last-Translator: Antonio Marin \n" +"Language-Team: Romanian; Moldavian; Moldovan \n" +"Language: ro\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==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2);\n" +"X-Generator: Gtranslator 47.1\n" +"X-Project-Style: gnome\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Aplicații" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instalează și actualizează aplicații" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Permite găsirea și instalarea de aplicații noi și extensii de sistem și " +"eliminarea aplicațiilor instalate." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Prezintă aplicații recomandate și populare cu descrieri utile și multiple " +"instantanee de ecran per aplicație. Aplicațiile pot fi găsite fie prin " +"navigarea listei de categorii, fie prin căutare. De asemenea, permite " +"actualizarea sistemului fără conectare la internet." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panoul de prezentare" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panoul cu detalii" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panoul cu instalate" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panoul cu actualizări" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Detaliile actualizărilor" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2742 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Proiectul GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Încearcă cheia akmods în Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Autentificarea este necesară pentru a încerca cheia akmods în Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Înscrie cheia akmods la Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Autentificarea este necesară pentru a înscrie cheia akmods la Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Încearcă cheia DKMS în Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Autentificarea este necesară pentru a încerca cheia DKMS în Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Inscrie cheia DKMS la Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Autentificarea este necesară pentru a înscrie cheia DKMS la Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instalează un fișier appstream într-o locație din sistem" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Se instalează un fișier appstream într-o locație din sistem" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "O listă de proiecte compatibile" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Aceasta este o listă de proiecte compatibile pe care trebuie să le prezentăm " +"cum ar fi GNOME, KDE și XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Dacă să se administreze actualizări și avansări în Aplicații GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Dacă opțiunea este dezactivată, Aplicații GNOME va ascunde panoul de " +"actualizări, nu va efectua nicio acțiune de actualizare automată și nu va " +"solicita avansări." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Descarcă și instalează actualizări automat" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Dacă opțiunea este activată, Aplicații GNOME va descărca automat " +"actualizările în ascuns și le va instala pe acelea care nu necesită o " +"repornire." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Notifică utilizatorul despre aplicațiile actualizate în ascuns" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Dacă opțiunea este activată, Aplicații GNOME va notifica utilizatorul despre " +"actualizările care s-au petrecut în timp ce utilizatorul era inactiv." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Dacă să se actualizeze automat cu o conexiune contorizată" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Dacă opțiunea este activată, Aplicații GNOME se actualizează automat în " +"ascuns chiar dacă este în uz o conexiune contorizată (descărcând eventual " +"unele metadate, căutând actualizări etc., ceea ce poate genera costuri " +"pentru utilizator)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Dacă se pornește pentru prima dată Aplicații GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Arată steluțe de evaluare lângă aplicații" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtrează aplicații pe baza unui set de ramuri de la distanță" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Aplicațiile nelibere vor arăta un dialog de avertizare înainte de instalare" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Când sunt instalate aplicații care nu sunt gratuite, poate fi afișat un " +"dialog de avertizare. Aceasta controlează dacă acel dialog este suprimat." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Ultima dată când au fost căutate actualizări" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Data ultimei înștiințări de avansare" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Data ultimei înștiințări de actualizare" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Data primei actualizări de securitate, ștearsă după actualizare" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Data ultimei actualizări" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Timpul în secunde la care să se verifice dacă captura de ecran de la " +"distanță încă este validă" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Alegând o valoare mai mare înseamnă mai puține conexiuni către server dar " +"actualizări ale capturilor de ecran pot dura mai mult până ajung la " +"utilizator. O valoare de 0 înseamnă că nu se va contacta serverul niciodată " +"dacă imaginea există în memoria cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Serverul de folosit pentru recenzii pentru aplicații" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Scorul minim karma pentru recenzii" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Recenzii cu karma mai mic decât acest număr nu vor fi afișate." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "O listă de depozite oficiale care nu ar trebui considerate terțe" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"O listă a depozitelor necesare care nu pot fi dezactivate sau eliminate" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"O listă de depozite oficiale care ar trebui considerate aplicații libere" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"URL-ul licenței de folosit când o aplicație trebuie considerată aplicație " +"liberă" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Instalează aplicații împachetate pentru toți utilizatorii sistemului când " +"este posibil" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Permite accesul la dialogul Depozite de aplicații" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Oferă upgrade-uri pentru pre-lansate" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Arată unele elemente UI informând utilizatorul că aplicația este neliberă" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Arată dimensiunea instalării pentru aplicațiile din lista de aplicații " +"instalate" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://ro.wikipedia.org/wiki/Software_proprietar'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI-ul care explică programele nelibere și proprietare" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"O listă de URL-uri care arată către fișiere appstream care vor fi descărcate " +"într-un dosar swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instalează fișierele AppStream la o locație la nivelul întregului sistem " +"pentru toți utilizatorii. Dacă este fals, fișierele sunt instalate într-un " +"director non-standard $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Ordinea de prioritate a formatelor de împachetare de preferat, cu formatele " +"mai importate listate mai întâi. O matrice goală înseamnă ordinea implicită. " +"Se presupune că formatele omise sunt listate ultimele. Exemple de formate de " +"împachetare sunt: deb, flatpak, rpm, snap. Formatele pot fi specificate " +"opțional cu un nume de origine, separat prin două puncte, de exemplu " +"„flatpak:flathub”." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "Data ultimei încercări de a elimina executările Flatpak neutilizate" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Stabilește la „true” pentru a fi arătate doar aplicațiile cu licență liberă " +"și a fi ascunse aplicațiile nelibere." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Stabilește la „true” pentru a fi arătate doar aplicații de la programatori a " +"căror identitate a fost verificată." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Data ultimelor actualizări primite." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Un șir de caractere ce stochează id-ul pentru contul google folosit la " +"autentificare" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Instalator AppStream pentru Aplicații GNOME" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Eroare la parsarea argumentelor din linia de comandă" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Trebuie să specificați exact un nume de fișier" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Acest program poate fi utilizat numai de utilizatorul root" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Nu s-a putut valida tipul de conținut: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Nu s-a putut muta: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalare aplicații" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instalează aplicațiile selectate pe calculator" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Violență animată" + +# Inițial a fost tradus „fără referințe la”, deși cred că ar fi mai corect „nicio informație despre” +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nicio informație despre violența animată" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Violență fantastică" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nicio informație referitoare la violență fantastică" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Violență reală" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nicio informație referitoare la violență realistică" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Violență reprezentată prin vărsare de sânge" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "" +"Nicio informație referitoare la violență reprezentată prin vărsare de sânge" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Violență sexuală" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nicio informație referitoare la violență sexuală" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alcool" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nicio informație referitoare la alcool" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narcotice" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nicio informație referitoare la droguri ilegale" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tutun" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Nicio informație referitoare la produse cu tutun" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nuditate" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nicio informație referitoare la nuditate de orice tip" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Teme sexuale" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Nicio informație referitoare la sau descrieri de natură sexuală" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Injurii" + +# „Injurii” mi se pare mai sugestiv decât „profanare” și mai aproape de termenul din engleză; alternativ ar fi „insulte” +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nicio informație referitoare la injurii de orice tip" + +# „inadecvat” mi se pare mai potrivit decât „inapropriat” +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Umor inadecvat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nicio informație referitoare la umor inadecvat" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Discriminare" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Nicio informație referitoare la limbaj discriminator de orice tip" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reclame" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nicio informație referitoare la reclame de orice tip" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Jocuri de noroc" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nicio informație referitoare la jocuri de noroc de orice tip" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Cumpărături" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nicio informație referitoare la abilitatea de a cheltui bani" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Chat între utilizatori" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Nu există informații despre modalitățile de chat cu alți utilizatori" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Chat audio între utilizatori" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" +"Nu există informații despre modalitățile de a vorbi cu alți utilizatori" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Detalii de contact" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nu există informații despre partajarea numelor de utilizator sau adreselor " +"de email ale rețelelor sociale" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Se identifică informațiile" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Nu există informații despre partajarea informațiilor utilizatorului cu părți " +"terțe" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Partajarea locației" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Nu există informații despre partajarea locației fizice cu alți utilizatori" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualitate" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nicio informație referitoare la homosexualitate" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostituție" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nicio informație referitoare la prostituție" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Adulter" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nicio informație referitoare la adulter" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Personaje sexualizate" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nicio informație referitoare la personaje sexualizate" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Profanare istorică" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nicio informație referitoare la profanare" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Rămășițe umane" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nu există informații despre rămășițele umane moarte vizibile" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Sclavie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nicio informație referitoare la sclavagism" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Nu include referințe la droguri" + +# În loc de „nu include” ar merge și „nu prezintă”, care mi se pare ceva mai flexibil ex: „nu prezintă droguri” față de „nu include droguri” +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Nu include înjurături, obscenități și alte tipuri de limbaj puternic" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Nu include reclame sau tranzacții monetare" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Nu include sex sau nuditate" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Nu include funcționalitatea de chat necontrolată" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Nu include violență" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Droguri" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Limbaj puternic" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Bani" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Social" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Violență" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Toate" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s are un rating de vârstă necunoscut" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s este adecvat pentru oricine" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s este adecvat pentru copilași" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s este adecvat pentru copii mici" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s este adecvat pentru copii" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s este adecvat pentru adolescenți" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s este adecvat pentru adulți" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s este adecvat pentru %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Categorie de vârstă" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Cum se contribuie la informațiile lipsă" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Fișier local" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Pachet" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "În așteptare" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Instalare în așteptare" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Eliminare în așteptare" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Se instalează" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Se elimină" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Descărcare" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instalează" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Dezinstalează…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Rețea" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Pot comunica prin rețea" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Servicii ale sistemului" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Poate accesa serviciile D-Bus pe magistrala sistemului" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Servicii de sesiune" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Poate accesa serviciile D-Bus pe magistrala sesiunilor" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Dispozitive" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Poate accesa dispozitive arbitrare, cum ar fi camere web" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Poate accesa dispozitive de intrare" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Poate accesa microfoanele și reda audio" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Pot accesa fișierele de sistem ale dispozitivelor" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Conținutul ecranului" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Pot accesa conținutul ecranului" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Dosar personal" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Poate vedea, edita și crea fișiere" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Poate vedea fișiere" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistem de fișiere" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Dosar descărcări" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Configurări" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Poate vedea și modifica orice configurare" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Sistem de afișare vechi" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Folosește un sistem de afișare vechi și nesigur" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Evadare din izolare" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Poate evada din izolare și poate evita orice alte restricții" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Nu este disponibilă nicio descriere a actualizării." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Detalii actualizări" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Necesită permisiuni suplimentare" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Date de evaluare incorecte primite de la server" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Nu s-a putut comunica cu serverul de evaluare" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Recenzii" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Nu s-au găsit recenzii pentru această aplicație." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Nicio recenzie" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Istoricul versiunilor" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Noutăți în versiunea %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versiunea %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Niciun detaliu disponibil pentru această lansare" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Mod de pornire: fie „updates” (actualizări), „updated” (actualizat), " +"„installed” (instalat) sau „overview” (prezentare generală)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MOD" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Caută aplicații" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "CAUTĂ" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Arată detaliile aplicației (folosind ID-ul aplicației)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Arată detaliile aplicației (folosind numele pachetului)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NUME PACHET" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Instalează aplicația (folosind ID-ul aplicației)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Dezinstalează aplicația (utilizând ID-ul aplicației)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Deschide un pachet local" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NUME FIȘIER" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Tipul de interacție așteptat de la această acțiune: fie „none”, „notifiy”, " +"sau „full”" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACȚIUNE" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Arată un fișier local metainfo sau appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Activează ieșirea de depanare detaliată (din instanța care rulează, dacă " +"deja rulează)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instalează orice actualizări apărute în fundal" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Arată preferințele" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Ieși din instanța în curs de rulare" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Preferă surse de fișiere locale pentru AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Arată numărul de versiune" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Drepturi de autor © 2016–2023 Contribuitorii Software GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Bogdan Mințoi , 2014\n" +"Adrian Gabor , 2015\n" +"Daniel Șerbănescu , 2016-2021\n" +"Florentina Mușat , " +"2020-2021, 2023\n" +"Antonio Marin , 2025" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Nu există detalii pentru aplicația aceea." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Dimensiunea instalării" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Include %s de date și %s de cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Include %s de date" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Include %s de cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Utilizarea datelor și a cache-ului necunoscută" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Dimensiunea descărcării" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Nu necesită descărcări suplimentare de sistem" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Necesită o dimensiune necunoscută de descărcări de sistem suplimentare" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Necesită %s de descărcări de sistem suplimentare" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Dimensiunea nu este cunoscută" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Nu există permisiuni" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Are acces la rețea" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Utilizează serviciile sistemului" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Utilizează serviciile sesiunii" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Poate accesa dispozitivele hardware" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Pot accesa dispozitivele sistemului" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Poate să citească/scrie toate datele" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Poate să citească toate datele" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Poate să citească/scrie toate descărcările" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Poate să citească toate descărcările" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Pot accesa unele fișiere specifice" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Poate accesa și schimba configurările utilizatorului" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Folosește un sistem vechi de ferestre" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Poate obține permisiuni arbitrare" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Dezvoltatorul aplicației este verificat" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Revizuit de distribuitorul SO" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Revizuit de %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Oferit de o parte terță" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Aplicația nu mai este întreținută" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Cod verificabil" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Licență necunoscută" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Cod proprietar" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Licență specială" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Privilegiat" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Sigur" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Probabil sigur" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potențial nesigur" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Nesigur" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Doar Mobil" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Funcționează doar pe un ecran mic" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Doar pe desktop" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Funcționează doar pe un ecran mare" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Nepotrivire a dimensiunii ecranului" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Nu acceptă mărimea actuală a ecranului" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Necesită un ecran tactil" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Necesită o tastatură" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Necesită un maus" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Este necesar un gamepad" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Necesită un gamepad pentru a juca" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptiv" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Funcționează pe telefoane, tablete și desktop-uri" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Probabil necesită o tastatură și un maus" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Funcționează pe desktopuri și laptopuri" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Nu conține conținut neadecvat vârstei" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Nu sunt disponibile informații pentru ratingul de vârstă" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Vizitați situl web" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instalează…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Anulează" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instalează" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Descarcă" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Actualizează" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Dezinstalare…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Se dezinstalează" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Actualizare critică" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Dispozitivul nu poate fi folosit în timpul actualizării." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Sursă: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Redenumit de la %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Nu mai primește actualizări" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Actualizare critică" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalat" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Ajutați la traducerea %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s este concepută, dezvoltată și tradusă de o comunitate internațională de " +"colaboratori.\n" +"\n" +"Aceasta înseamnă că dacă nu este disponibilă în limba ta, te poți implica și " +"ajuta la traducere." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Traduceri" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Si_tul web al traducerilor" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Autentificare la distanță necesară %s (realm %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Autentificare necesară" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Anulează" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Autentificare" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Utilizator" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Parola" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Altele" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Toate" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Recomandate" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Sugerate" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Noi și actualizate" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Alegeri de pe web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Alte aplicații" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s Instalată" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "O repornire este necesară pentru ca modificările să aibă efect" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Aplicația este gata de utilizare" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Actualizări de sistem instalate" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Actualizări instalate recent sunt disponibile pentru recenzie" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Repornește" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Lansează" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Instalați software-ul?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Instalați aplicații din sursă terță?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Activați depozitul de software?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Activați depozitul terț de aplicații?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s nu este aplicație liberă cu sursa deschisă, și este furnizat de " +"către „%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s este furnizat de către „%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Acest depozit de aplicații trebuie activat pentru a putea continua " +"instalarea." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Ar putea fi ilegală instalarea sau folosirea lui %s în anumite țări." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Ar putea fi ilegală instalarea sau folosirea acestui codec în anumite țări." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Nu _atenționa din nou" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Activează și _instalează" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Erorile detaliate ale administratorului de pachete:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detalii" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "În_chide" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Detalii copiate în memorie" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Acceptă" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "O actualizare a fost instalată" +msgstr[1] "Actualizările au fost instalate" +msgstr[2] "Actualizările au fost instalate" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "O aplicație a fost dezinstalată" +msgstr[1] "Aplicațiile au fost dezinstalate" +msgstr[2] "Aplicațiile au fost dezinstalate" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Este necesară o repornire ca să aibă efect" +msgstr[1] "Este necesară o repornire ca să aibă efect" +msgstr[2] "Este necesară o repornire ca să aibă efect" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Nu acum" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Azi" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Ieri" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d zi în urmă" +msgstr[1] "%d zile în urmă" +msgstr[2] "%d de zile în urmă" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d săptămână în urmă" +msgstr[1] "%d săptămâni în urmă" +msgstr[2] "%d de săptămâni în urmă" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d lună în urmă" +msgstr[1] "%d luni în urmă" +msgstr[2] "%d de luni în urmă" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d an în urmă" +msgstr[1] "%d ani în urmă" +msgstr[2] "%d de ani în urmă" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Tocmai acum" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minut în urmă" +msgstr[1] "%d minute în urmă" +msgstr[2] "%d de minute în urmă" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d oră în urmă" +msgstr[1] "%d ore în urmă" +msgstr[2] "%d de ore în urmă" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Toate" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Recomandate" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Grafică 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografie" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Scanare" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Grafică vectorială" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Vizualizatoare" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Creare și modificare audio" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Playere de muzică" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Toate" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Recomandate" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Calendar" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Baze de date" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finanțe" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Procesoare de text" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Editoare de text" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Navigatoare web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Toate" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Recomandate" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Acțiune" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Aventură" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcadă" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blocuri" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "De masă" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Cărți" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatoare" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Copii" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logică" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Pe roluri" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategie" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Toate" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Recomandate" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Conversație" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Toate" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Recomandate" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Inteligență artificială" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomie" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chimie" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Limbi" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematică" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Știri" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotică" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Artă" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografie" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Benzi desenate" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Ficțiune" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Sănătate" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Istorie" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Stil de viață" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politică" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Toate" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Recomandate" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Depanatoare" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Medii de dezvoltare integrate" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Codecuri" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Drivere pentru hardware" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Caractere" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Surse de intrare" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Pachete de limbă" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Localizare" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Creați" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Lucrați" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Jucați" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializați" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Învățați" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Dezvoltați" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Codecuri" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Drivere pentru hardware" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Caractere" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Surse de intrare" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Pachete lingvistice" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Localizare" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "O aplicație" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s cere un element suplimentar pentru formatul de fișier." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Sunt necesare tipuri MIME suplimentare" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s cere caractere suplimentare." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Sunt necesare caractere suplimentare" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s cere codecuri multimedia suplimentare." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Sunt necesare codecuri multimedia suplimentare" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s cere drivere suplimentare pentru imprimantă." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Sunt necesare drivere suplimentare pentru imprimantă" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s cere pachete suplimentare." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Sunt necesare pachete suplimentare" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Caută în Aplicații" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Arată mai multe" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Arată mai puțin" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Se elimină…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Necesită repornirea pentru finalizarea instalării" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Necesită repornirea pentru finalizarea eliminării" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Instalare în așteptare…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Actualizare în așteptare…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Se descarcă…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Se pregătește…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Se dezinstalează…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s nu este instalat, dar încă are date prezente." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Repornește" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "Activ_ează…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Instalează…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s va apărea în engleză americană" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Această aplicație va apărea în engleză americană" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Acest software va apărea în engleză americană" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Ajută la _traducere" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Alte aplicații de %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Programatorul %s a demonstrat că %s îi aparține" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Programatorul a demonstrat că %s îi aparține" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Aveți nevoie de acces la internet pentru a scrie o recenzie" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Această aplicație nu mai primește actualizări, inclusiv remedieri de " +"securitate" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Această aplicație este deja furnizată de distribuție și nu ar trebui să fie " +"înlocuită." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Această aplicație nu oferă nicio legătură către o pagină web, un depozit de " +"cod sau un instrument de urmărire a problemelor." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Acest software nu mai primește actualizări, inclusiv remedieri de securitate" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Această aplicație este deja furnizată de distribuția instalată și nu ar " +"trebui înlocuită." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Acest program nu oferă adrese către un sit web, depozit de cod sau urmăritor " +"de probleme." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Nu s-au putut obține informații despre „%s” și nu pot fi arătate detalii " +"despre această aplicație." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Răspuns incorect primit de la server pentru recenzie" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Nu s-a putut trimite recenzia pentru „%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Pagina cu detalii" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Se încarcă detaliile aplicației" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verificat" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Deschide" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Actualizează" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Dezinstalează" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Suplimente" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Această aplicație poate fi utilizată doar când există o conexiune la " +"internet activă." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Depozit de aplicații inclus" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Această aplicație include un depozit software care furnizează actualizări, " +"precum și acces la alt software." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Niciun depozit de aplicații inclus" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Această aplicație nu include un depozit software. Nu va fi actualizată cu " +"versiuni noi." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Depozit de aplicații identificat" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Adăugarea acestui depozit de aplicații vă va oferi acces la upgrade-uri și " +"aplicații suplimentare." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Utilizați doar depozite de aplicații de încredere." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Curăță datele aplicației" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Șt_erge datele" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Fără metadate" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Sit _web al proiectului" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Donează" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Contribuiți cu _traduceri" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Raportează o problemă" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Ajutor" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Contact" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Scri_e o recenzie" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Toate recenziile" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Nu pot fi afișate detaliile aplicației" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Nu s-a putut pregăti repornirea" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Eroare necunoscută" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Cheia nu a fost găsită" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Cheia nu este înscrisă" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Înscriere MOK necesară" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Următorul" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Acest aparat are „Secure Boot” activat. Pentru a permite activarea de noi " +"drivere, trebuie înscrisă o nouă cheie MOK (Machine Owner Key). Procesul " +"necesită o parolă care urmează să fie introdusă ulterior în proces. Se " +"recomandă ca următoarea parolă asociată cu cheia să fie notată:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Am notat _parola MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Repornește și înscrie…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Instrucțiuni de configurare: A se citi cu atenție" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"După repornire, va apărea o fereastră de configurare a aparatului. Pentru a " +"activa drivere noi, trebuie parcurși pașii de configurare:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Alege „Înscrie MOK”\n" +"• Alege „Da” pentru a înscrie cheile\n" +"• Introdu parola MOK atunci când se solicită\n" +"• Apoi alege „Repornește”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Consecințe privind siguranța" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"După înscrierea cu succes a cheii, reține că orice actualizare viitoare a " +"modulului sau a oricărui alt modul va fi implicit de încredere. Toate " +"actualizările viitoare vor avea loc în mod transparent, fără interacțiune și/" +"sau autorizare." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Mai multe îndrumări pot fi găsite pe pagina documente." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Se descarcă fișierele cu metadate…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " și " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Caractere disponibile pentru scriptul %s" +msgstr[1] "Caractere disponibile pentru scripturile %s" +msgstr[2] "Caractere disponibile pentru scripturile %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Aplicații disponibile pentru %s" +msgstr[1] "Aplicații disponibile pentru %s" +msgstr[2] "Aplicații disponibile pentru %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Programul cerut nu a fost găsit" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Eșec la găsirea programului cerut" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s nu a fost găsit" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "pe situl web" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Nu sunt disponibile aplicații care să furnizeze fișierul %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informații despre %s, precum și opțiuni pentru cum să obțineți aplicații " +"care lipsesc pot fi găsite %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Nicio aplicație disponibilă pentru a gestiona %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s nu este disponibilă." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informații despre %s, precum și opțiuni privind obținerea aplicațiilor " +"pentru acest format, sunt disponibile la %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Nu sunt disponibile caractere pentru scriptul %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informații despre %s, precum și opțiuni pentru a obține caractere " +"suplimentare pot fi găsite %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Niciun codec suplimentar disponibil pentru formatul %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informații despre %s, precum și opțiuni despre cum să obțineți un codec care " +"să poată reda acest format pot fi găsite %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Nu sunt disponibile resurse Plasma pentru %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informații despre %s, precum și opțiuni despre cum să obțineți resurse " +"Plasma suplimentare pot fi găsite %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Nu sunt disponibile drivere pentru %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informații despre %s, precum și opțiuni privind obținerea unui driver pentru " +"această imprimantă pot fi găsite la %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "documentația" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Nu s-a putut găsi %s cerut de %s. Consultați %s pentru mai multe informații." +msgstr[1] "" +"Nu s-au putut găsi %s cerute de %s. Consultați %s pentru mai multe " +"informații." +msgstr[2] "" +"Nu s-au putut găsi %s cerute de %s. Consultați %s pentru mai multe " +"informații." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Nu s-a putut găsi %s pe care îl căutați. Consultați %s pentru mai multe " +"informații." +msgstr[1] "" +"Nu s-au putut găsi %s pe care le căutați. Consultați %s pentru mai multe " +"informații." +msgstr[2] "" +"Din păcate, %s pe care le căutați nu au putut fi găsite. Consultați %s " +"pentru mai multe informații." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Nu s-au putut găsi rezultatele căutării: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "format fișier %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Instalează to_ate" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Aplicația căutată nu a putut fi găsită" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Pagina de codecuri" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Niciun rezultat" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Nu se pot efectua căutări" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Anteriorul" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Următorul" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Lista de aplicații recomandate" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Ecran mare" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Acceptă utilizarea cu un ecran mare" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Nu se știe dacă acceptă un ecran mare" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Nu sunt destule informații pentru a afla dacă ecranele mari sunt acceptate" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Necesită un ecran mare" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Ecranul mare nu este acceptat" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Nu poate fi folosită cu un ecran mare" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobil" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Poate fi folosită cu un ecran mic" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Nu se știe dacă este compatibilă cu un mobil" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Nu sunt destule informații pentru a afla dacă ecranele mici sunt acceptate" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Necesită un ecran mic" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobilul nu este acceptat" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Nu poate fi folosită cu un ecran mic" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Tastatură" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Compatibilitate necunoscută cu tastatura" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" +"Nu sunt destule informații pentru a afla dacă tastaturile sunt acceptate" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Tastatură necesară" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Acceptă tastaturile" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tastatura nu este acceptată" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Nu poate fi folosită cu o tastatură" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Maus" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Necesită un maus sau dispozitiv de indicare" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Compatibilitate necunoscută cu mausul" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Nu sunt destule informații pentru a afla dacă mausurile și dispozitivele de " +"indicare sunt acceptate" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Este necesar un maus" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Acceptă mausuri și dispozitive de indicare" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Mausul nu este acceptat" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Nu poate fi folosită cu un maus sau dispozitiv de indicare" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Ecran tactil" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Copatibilitate necunoscută cu ecranul tactil" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Nu sunt destule informații pentru a afla dacă ecranele tactile sunt acceptate" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Este necesar un ecran tactil" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Acceptă ecranele tactile" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Ecranul tactil nu este acceptat" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Nu poate fi folosită cu un ecran tactil" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Este necesar un controler de jocuri" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Necesită un controler de jocuri" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Controler de jocuri" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Acceptă controler de jocuri" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s probabil funcționează cu acest aparat" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s funcționează cu acest aparat" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s poate că funcționează cu acest aparat" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s nu va funcționa adecvat cu acest aparat" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s nu va funcționa cu acest aparat" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Aparat" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigare" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Trece la pagina Explorează" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Trece la pagina Instalate" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Trece la pagina Actualizări" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Apare spațiul de căutare" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Ferestre" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Deschide Preferințe" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Deschide Depozite de aplicații" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Ajutor" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Deschide Scurtături" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalate" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Pagină instalată" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "În curs" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplicații" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Aplicații web" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Aplicații de sistem" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Generat de comunitate" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Implicați-vă" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Această aplicație este dezvoltată în mod public de o comunitate " +"internațională și lansată sub %s licența.\n" +"\n" +"Poți contribui și ajuta la îmbunătățirea ei." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Această aplicație este dezvoltată în mod public de o comunitate " +"internațională și lansată sub licența %s.\n" +"\n" +"Poți participa și ajuta la îmbunătățirea ei." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Acest program este dezvoltată în mod public de o comunitate internațională " +"și este lansat sub %s licența.\n" +"\n" +"Poți contribui și ajuta la îmbunătățirea lui." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Acest program este dezvoltată în mod public de o comunitate internațională " +"și este lansat sub licența %s.\n" +"\n" +"Poți participa și ajuta la îmbunătățirea lui." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Licență necunoscută" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "Află mai mu_lte" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Această aplicație nu specifică sub ce licență este dezvoltată și poate fi " +"neliberă. Poate fi nesigură în moduri greu de detectat și se poate schimba " +"fără supraveghere.\n" +"\n" +"Este posibil sau nu să contribui la această aplicație." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Acest program nu specifică sub ce licență este dezvoltat și poate fi " +"neliberă. Poate fi nesigur în moduri greu de detectat și se poate schimba " +"fără supraveghere.\n" +"\n" +"Este posibil sau nu să contribui la acest program." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Neliberă" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Această aplicație nu este dezvoltată în mod public, așa că doar " +"dezvoltatorii acesteia știu cum funcționează. Poate fi nesigură în moduri " +"greu de detectat și se poate schimba fără supraveghere.\n" +"\n" +"Este posibil să nu poți contribui la această aplicație." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Acest program nu este dezvoltat în mod public, așa că doar dezvoltatorii " +"acestuia știu cum funcționează. Poate fi nesigur în moduri greu de detectat " +"și se poate schimba fără supraveghere.\n" +"\n" +"Este posibil să nu poți contribui la acest program." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Licență specială" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Această aplicație este dezvoltată sub licența specială %s.\n" +"\n" +"Este posibil sau nu să puteți contribui la această aplicație." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Această aplicație este dezvoltată sub licența specială „%s”.\n" +"\n" +"Este posibil sau nu să puteți contribui la această aplicație." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Acest software este dezvoltat sub licența specială %s.\n" +"\n" +"Este posibil sau nu să puteți contribui la acest software." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Acest software este dezvoltat sub licența specială „%s”.\n" +"\n" +"Este posibil sau nu să puteți contribui la acest software." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Se actualizează datele" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Se încarcă pagina" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Se pornește" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Sursă necunoscută" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Utilizator" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Adiții" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Eliminări" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Actualizări" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Retrogradări" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "surse externe selectate" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Furnizează acces la software adițional de la %s. Sunt incluse unele software-" +"uri proprietare.\n" +"\n" +"Puteți activa acele depozite mai târziu în preferințele depozitelor software." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Activați depozitele terțe de aplicații?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignoră" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "Activ_ează" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Disponibil pentru acest sistem de operare" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Disponibil pentru %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Explorează" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Pagina cu prezentarea de ansamblu" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Aplicații disponibile" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Alte categorii" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nu s-au găsit datele aplicației" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Necunoscut" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Utilizatorul a refuzat instalarea" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Pregătește %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Sigur doriți să eliminați depozitul %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Toate aplicațiile de la %s vor fi dezinstalate și va trebui să reinstalați " +"depozitul pentru a le utiliza din nou." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Dezinstalați %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Nu va fi posibil să utilizați %s după eliminare." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"După eliminare, nu va fi posibilă utilizarea niciunei aplicații care depinde " +"de %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Nu se va putea utiliza %s după eliminare, iar orice document care îl " +"folosește va apărea cu un tip de caractere diferit." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"După eliminare, %s nu va mai putea fi utilizat. Acest lucru poate însemna că " +"unele fișiere media nu vor mai putea fi redate." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Este posibil ca după eliminare să nu mai funcționeze corect componentele " +"calculatorului care depind de %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Nu va fi posibil să utilizați %s după eliminare. Datele și configurările " +"aplicației vor fi păstrate pe disc, pentru a permite restaurarea aplicației " +"în viitor." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Preferințe" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Actualizări software" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Mai multe informații" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Căutarea și descărcarea actualizărilor utilizează date și energie. Prin " +"urmare, actualizarea automată este întreruptă când se folosesc conexiuni la " +"rețea contorizate și când economisirea energiei este pornită." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automate" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Caută și descarcă automat actualizările" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manual" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Verificarea și descărcarea actualizărilor trebuie făcute manual" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Î_nștiințări de actualizare automată" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Înștiințează când actualizările au fost instalate automat" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtre de conținut" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Arată doar aplicații lib_ere" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Ascunde la navigare și căutare aplicațiile nelibere" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Arată doar programatori _verificați" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Arată numai aplicații ale programatorilor a căror identitate a fost " +"verificată" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Programul instalat nu este compatibil cu %s, și va fi eliminat automat în " +"timpul avansării." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Aplicații incompatibile" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Avansează" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Dezinstalează" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Configurări aplicație & Date" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Păstrează" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Permite restaurarea configurărilor aplicației și a conținutului" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "Șt_erge" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Șterge permanent datele pentru a salva spațiu pe disc" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Programul care a fost instalat de la „%s” va înceta să mai primească " +"actualizări." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Dezactivați depozitul?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Eliminați depozitul?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Dezactivează" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Elimină" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Activează noi depozite" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Activează noile depozite când sunt adăugate" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "mai multe informații" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Depozite suplimentare din părțile terțe selectate — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Depozite terțe Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "sistemul de operare" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Aceste depozite suplimentează aplicațiile implicite oferite de %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Depozite de aplicații" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Niciun depozit" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u aplicație instalată" +msgstr[1] "%u aplicații instalate" +msgstr[2] "%u de aplicații instalate" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u supliment adițional instalat" +msgstr[1] "%u suplimente adiționale instalate" +msgstr[2] "%u de suplimente adiționale instalate" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplicație" +msgstr[1] "%u aplicații" +msgstr[2] "%u de aplicații" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u supliment" +msgstr[1] "%u suplimente" +msgstr[2] "%u de suplimente" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s și %s instalată" +msgstr[1] "%s și %s instalate" +msgstr[2] "%s și %s instalate" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Se verifică software-ul instalat…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Elimină" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "O urăsc" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Nu îmi place" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Este OK" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Îmi place" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "O iubesc" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Selectați o stea pentru a lăsa un rating" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Folosiți mai mult timp pentru a scrie recenzia" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Alegeți o stea de evaluare" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Rezumatul este prea scurt" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Rezumatul este prea lung" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Descrierea este prea scurtă" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Descrierea este prea lungă" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Scrieți o recenzie" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Trimite" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Furnizează o evaluare, un rezumat și textul recenziei. Recenzile nu trebuie " +"utilizate pentru a raporta probleme: mai degrabă, contactează programatorul " +"sau furnizorul de asistență." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Rezumat recenzie" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Scrie o recenzie scurtă" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Aflați ce date sunt trimise în politica noastră de confidențialitate. Numele complet atașat " +"contului va fi arătat public." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u recenzie în total" +msgstr[1] "%u recenzii în total" +msgstr[2] "%u de recenzii în total" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "din 5 stele" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Necunoscut" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Puteți raporta recenzii ca fiind abuzive, nepoliticoase sau discriminatoare." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Odată raportată, recenzia va fi ascunsă până când va fi verificată de un " +"administrator." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Raportați recenzia?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Raportează" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Se elimină recenzia?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Eliminarea unei recenzii nu poate fi anulată." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Îmi place recenzia" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Nu-mi place recenzia" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Raportează…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Elimină…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Aplicația nu este izolată, dar distribuția a verificat că nu este rău " +"intenționată" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Trebuie verificat dacă furnizorul este de încredere, deoarece aplicația nu " +"este izolată" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Nicio permisiune" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Aplicația este izolată complet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Acces la rețea" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Poate accesa internetul" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Nu are acces la rețea" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Nu poate accesa internetul" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Utilizează serviciile sistemului" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Poate cere date de la serviciile sistemului" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Utilizează serviciile sesiunii" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Poate cere date de la serviciile sesiunii" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Acces la dispozitivele utilizatorului" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Poate accesa dispozitive cum ar fi camere web sau controlere pentru jocuri" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Niciun acces la dispozitivele utilizatorului" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Nu poate accesa dispozitive cum ar fi camere web sau controlere pentru jocuri" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Acces la dispozitivele de intrare" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Acces la microfon și redare audio" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Poate asculta folosind microfoanele și reda audio fără a cere permisiune" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Acces la dispozitivele sistemului" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "Poate accesa dispozitivele de sistem care necesită permisiuni ridicate" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Acces la conținutul ecranului" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Poate accesa conținutul ecranului sau al altor ferestre" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Sistem vechi de ferestre" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Permisiuni arbitrare" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Configurări utilizator" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Acces total la citirea/scrierea sistemului de fișiere" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Poate citi și scrie toate datele de pe sistemul de fișiere" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Acces la citirea/scrierea dosarului personal" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Poate să citească/scrie toate datele din dosarul personal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Acces complet pentru citirea sistemului de fișiere" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Poate citi toate datele de pe sistemul de fișiere" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Acces de citire a dosarului personal" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Poate să citească toate datele din dosarul personal" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Acces de citire a dosarului „Descărcări”" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Poate să citească/scrie toate datele din dosarul „Descărcări”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Acces de citire pentru dosarul Descărcări" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Poate să citească toate datele din dosarul „Descărcări”" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Poate să citească și să scrie toate datele din director" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Poate să citească toate datele din director" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Nu are acces la sistemul de fișiere" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Nu poate accesa sistemul de fișiere deloc" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Programatorul aplicației este verificat" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Programatorul acestei aplicații a fost verificat că este cine pretinde a fi" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Dependențe nesigure" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Programul sau dependențele acestuia nu mai sunt întreținute sau pot fi " +"nesigure" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Această aplicație nu specifică sub ce licență este dezvoltată și poate fi " +"neliberă" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Acest program nu specifică sub ce licență este dezvoltat și poate fi neliber" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Cod neliber" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Codul sursă nu este public, așadar nu poate fi verificat independent deci " +"poate fi nesigur" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Această aplicație este dezvoltată sub licența specială „%s”." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Acest program este dezvoltat sub licența specială „%s”." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Cod verificabil" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Codul sursă este public și poate fi verificat independent, ceea ce face ca, " +"mult mai probabil, aplicația să fie sigură" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s este privilegiată" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s este sigură" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s probabil este sigură" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s este potențial nesigură" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s este nesigură" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Necunoscută" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Siguranța" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licența" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Sursa" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Această aplicație utilizează o versiune veche a platformei software (SDK) și " +"poate conține erori sau vulnerabilități de securitate care nu vor fi " +"remediate." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Captură de ecran anterioară" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Captură de ecran următoare" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Nicio captură de ecran" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Nu s-a găsit captura de ecran" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Imaginea nu a putut fi încărcată" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Mărimea capturii de ecarn nu a fost găsită" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Nu s-a putut creea cache" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Captură de ecran nevalidă" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Captură de ecran indisponibilă" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Captură de ecran" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "încă %u potrivire" +msgstr[1] "încă %u potriviri" +msgstr[2] "încă %u de potriviri" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Caută în pagină" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Căutați aplicații" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Nu s-a găsit nicio aplicație" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "„%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Nu s-au putut descărca actualizări" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Nu s-au putut descărca actualizări pentru microcod" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nu s-au putut descărcate actualizări pentru microcod de la %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nu s-au putut descărca actualizări de la %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Nu s-a putut actualiza: accesul la internet este necesar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Nu s-a putut actualiza: spațiu insuficient pe disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Nu s-au putut descărca actualizări de la %s: spațiu insuficient pe disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Nu s-a putut actualiza: autentificare necesară" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Nu s-a putut actualiza: autentificare greșită" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Nu s-a putut actualiza: permisiune necesară" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Nu s-au putut descărca actualizări: nu aveți permisiunea să instalați " +"aplicații" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Nu s-a putut obține lista de actualizări" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Nu s-a putut instala: descărcare nereușită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Nu s-a putut instala %s: n-a reușit descărcarea de la %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Nu s-a putut instala %s: descărcare nereușită" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Nu s-a putut instala: lipsește runtime" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Nu s-a putut instala %s: runtime-ul %s nu este disponibil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Nu s-a putut instala %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Nu s-a putut instala: accesul la internet este necesar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Nu s-a putut instala: aplicația nu are un format corect" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Nu s-a putut instala: spațiu insuficient pe disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Nu s-a putut instala %s: spațiu insuficient pe disc" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Nu s-a putut instala: autentificare necesară" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Nu s-a putut instala %s: autentificare necesară" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Nu s-a putut instala: autentificare greșită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Nu s-a putut instala %s: autentificare greșită" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Nu s-a putut instala: permisiune necesară" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Nu s-a putut instala %s: permisiune necesară" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Nu s-a putut instala: aparatul are nevoie de energie electrică" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Nu s-a putut instala %s: aparatul are nevoie de energie electrică" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Nu s-a putut instala: bateria e descărcată" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Nu s-a putut instala %s: bateria e descărcată" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Nu s-a putut actualiza %s de la %s: descărcare nereușită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Nu s-a putut actualiza %s: descărcare nereușită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Nu s-au putut instala actualizările de la %s: descărcare nereușită" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Nu s-a putut actualiza: descărcare nereușită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Nu s-a putut actualiza %s: spațiu insuficient pe disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Nu s-a putut actualiza %s: autentificare necesară" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Nu s-a putut actualiza %s: autentificare greșită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Nu s-a putut actualiza %s: permisiune necesară" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Nu s-a putut actualiza: aparatul are nevoie de energie electrică" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Nu s-a putut actualiza %s: aparatul are nevoie de energie electrică" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Nu s-a putut actualiza: bateria e descărcată" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Nu s-a putut actualiza %s: bateria e descărcată" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Nu s-a putut actualiza %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Nu s-a putut actualiza" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Nu s-a putut avansa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Nu s-a putut avansa la %s de la %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Nu s-a putut avansa: descărcare nereușită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Nu s-a putut avansa la %s: descărcare nereușită" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Nu s-a putut avansa: accesul la internet este necesar" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Nu s-a putut avansa la %s: accesul la internet este necesar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Nu s-a putut avansa: spațiu insuficient pe disc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Nu s-a putut avansa la %s: spațiu insuficient pe disc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Nu s-a putut avansa: autentificare necesară" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Nu s-a putut avansa la %s: autentificare necesară" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Nu s-a putut avansa: autentificare greșită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Nu s-a putut avansa la %s: autentificare greșită" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Nu s-a putut avansa: permisiune necesară" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Nu s-a putut avansa la %s: permisiune necesară" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Nu s-a putut avansa: aparatul are nevoie de energie electrică" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Nu s-a putut avansa la %s: aparatul are nevoie de energie electrică" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Nu s-a putut avansa: bateria e descărcată" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Nu s-a putut avansa la %s: bateria e descărcată" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nu s-a putut avansa la %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Nu s-a putut dezinstala: autentificare necesară" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Nu s-a putut dezinstala %s: autentificare necesară" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Nu s-a putut dezinstala: autentificare greșită" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Nu s-a putut dezinstala %s: autentificare greșită" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Nu s-a putut dezinstala: permisiune necesară" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Nu s-a putut dezinstala %s: permisiune necesară" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Nu s-a putut dezinstala: aparatul are nevoie de energie electrică" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Nu s-a putut dezinstala %s: aparatul are nevoie de energie electrică" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Nu s-a putut dezinstala: bateria e descărcată" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Nu s-a putut dezinstala %s: bateria e descărcată" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Nu s-a putut dezinstala %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Nu s-a putut porni %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Ceva nu a funcționat" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Nu s-a putut porni %s: %s nu este instalat" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Spațiu insuficient pe disc pentru operație" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Nu s-a putut instala: tip neacceptat de fișier" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Nu s-a putut instala: autentificare nereușită" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Nu s-a putut instala" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Nu s-a putut contacta %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Programul trebuie repornit pentru a utiliza modulele noi" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Aparatul are nevoie de energie electrică" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Nivelul bateriei este prea scăzut" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Depozite de aplicații" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Preferințe" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Scurtături" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "Despre _Aplicații" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Caută" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Opțiuni" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Caută aplicații" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Explorează" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalate" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Act_ualizări" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Înapoi" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Nespecificat" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Date aplicație" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Date necesare pentru funcționarea aplicației" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Datele utilizatorului" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Date create de utilizator cu aplicația" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Date cache" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Date stocate temporar" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Aplicația însăși" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Dependențe necesare" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Componente de sistem partajate cerute de această aplicație" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Necunoscută" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Datele din cache pot fi șterse din configurările _aplicației" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Stocare" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instalat)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Se instalează)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Se descarcă)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Se elimină)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detalii" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Examinează" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Instalate la data de %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Actualizări instalate" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Nu sunt instalate actualizări" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Actualizările sunt vechi" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Verifică dacă sunt disponibile actualizări" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Actualizare critică gata de instalat" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Actualizările critice trebuie instalate cât mai curând posibil" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Actualizări critice disponibile pentru descărcat" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Actualizările critice trebuie descărcate cât mai curând posibil" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Actualizări gata de instalat" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Actualizările sunt în așteptare și gata de instalat" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Actualizări disponibile pentru descărcat" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Actualizările pot fi descărcate" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aplicație actualizată — repornirea necesară" +msgstr[1] "%u aplicații actualizate — repornirea necesară" +msgstr[2] "%u de aplicații actualizate — repornirea necesară" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aplicație actualizată" +msgstr[1] "%u aplicații actualizate" +msgstr[2] "%u de aplicații actualizate" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s a fost actualizată." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Repornește aplicația." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s și %s au fost actualizate." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplicație necesită o repornire." +msgstr[1] "%u aplicații necesită o repornire." +msgstr[2] "%u de aplicații necesită o repornire." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Include %s, %s și %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Sistemul a ajuns la sfârșitul duratei de viață" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Trebuie avansat pentru a primi în continuare actualizări" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "O nouă versiune a %s este disponibilă pentru instalat" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Avansare a sistemului disponibilă" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Actualizarea aplicațiilor a eșuat" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Actualizările pregătite n-au fost instalate" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Arată detalii" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Avansare completă a sistemului" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Bun venit la %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Actualizarea aplicației a fost instalată" +msgstr[1] "Actualizări de aplicații instalate" +msgstr[2] "Actualizări de aplicații instalate" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "O actualizare importantă a sistemului a fost instalată." +msgstr[1] "Actualizări importante ale sistemului au fost instalate." +msgstr[2] "Actualizări importante ale sistemului au fost instalate." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Recenzează" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Actualizarea a eșuat" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Sistemul a fost deja actualizat." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Actualizarea a fost anulată." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Accesul la internet era necesar dar nu a fost disponibil. Asigurați-vă că " +"aveți acces la internet și încercați din nou." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Au apărut probleme de securitate la această actualizare. Consultați " +"furnizorul dumneavoastră de aplicații pentru mai multe detalii." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Insuficient spațiu disponibil pe disc. Eliberați spațiu și încercați din nou." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Instalarea actualizării nu a reușit. Așteptați o altă actualizare și " +"încercați din nou. Dacă problema persistă, contactați furnizorul de " +"aplicații." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Ultima căutare: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Oprire" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Caută actualizări" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s a încetat să mai primească actualizări de software critice" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Acest sistem nu mai primește actualizări software critice" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Se pot aplica taxe" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Verificarea actualizărilor când folosiți o conexiune mobilă de bandă largă " +"poate să conducă la suportarea unor taxe." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Verifică _oricum" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Actualizări majore de software descărcate" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Avansările sunt gata să fie instalate" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Caută actualizări" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Actualizări" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Pagina cu actualizări" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Se încarcă actualizările" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Acest lucru ar putea dura ceva timp" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Actualizat" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Utilizați datele mobile?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Verificarea actualizărilor când se utilizează banda largă mobilă poate avea " +"costuri" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "Verifi_că oricum" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Nu există conexiune" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Conectarea la internet e necesară pentru a verifica actualizările" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Preferi_nțe de rețea" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Eroare" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Actualizările sunt gestionate automat" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Actualizări întrerupte" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Actualizările automate ale programelor au fost suspendate din următoarele " +"motive:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Conexiunea actuală la rețea este contorizată" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Conexiunea actuală la rețea nu permite descărcări mari" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Economisirea energiei este activă" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Modul jocuri este activ" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Actualizări întrerupte" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Conexiunea la rețea este contorizată — actualizările sunt în pauză" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Conexiunea la rețea nu permite descărcări mari — actualizările sunt în pauză" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Economisirea energiei este activă — actualizările sunt în pauză" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Modul Jocuri este activ — actualizările sunt în pauză" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Repornește și actualizează…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Act_ualizează toate" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Actualizări software descărcate" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Actualizările sunt gata să fie instalate" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Microcod integrat" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Necesită repornirea" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Actualizări aplicații" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Microcod pentru dispozitive" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Descarcă" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s disponibilă" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s disponibil" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Detalii despre noua versiune" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s din %s descărcați" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% descărcat" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "O avansare majoră cu caracteristici noi și îmbunătățiri." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Anulează avansarea" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Repornește și avansează…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Se recomandă efectuarea unei copii de rezervă a datelor și fișierelor " +"înaintea avansării." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Detaliile erorii" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Copiază detaliile" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Nu s-a putut șterge fișierul „%s”: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Nu s-a putut șterge directorul „%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Adaugă, elimină sau actualizează aplicații pe acest calculator" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;Surse;Instalare;Dezinstalare;Aplicații;Depozite," +"Preferințe;Actualizare;Avansare;Magazin;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s este gata" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s este gata să fie activat și pregătit pentru următoarea pornire." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Activează" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Actualizări de sistem" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Actualizări generale ale sistemului, cum ar fi de securitate sau remedieri " +"de erori și îmbunătățiri ale performanței." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Actualizare %s cu caracteristici și remedieri noi." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Serviciul de actualizare EOS nu a putut aduce și aplica actualizarea." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Aplicație web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Aplicații web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Rulează aplicații web populare într-un navigator" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Avanseasă pentru ultimele caracteristici și îmbunătățiri de performanță și " +"stabilitate." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak este o platformă de aplicații pentru Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Dosar de sistem %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Subdosar personal %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Dosarele sistemului gazdă" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Configurarea sistemului gazdă de la /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Dosar desktop" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Subdosar desktop %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Dosar documente" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Subdosar documente %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Dosar muzică" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Subdosar de muzică %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Dosar poze" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Subdosar poze %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Dosar public de partajare" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Subdosar public de partajare %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Dosar video" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Subdosar video %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Dosar de șabloane" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Subdosar de șabloane %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Dosar cache al utilizatorului" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Subdosar cache al utilizatorului %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Dosar de configurare utilizator" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Subdosar configurare utilizator %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Dosarele de date ale utilizatorului" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Subdosar de date al utilizatorului %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Dosar de executare al utilizatorului" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Subdosar de executare al utilizatorului %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Accesul sistemului de fișiere la %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Se obțin metadatele flatpak pentru %s…" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Eșec la depanarea extensiei „%s”: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Instalarea utilizatorului" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Instalarea sistemului" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID-ul aplicației" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Nu s-a putut adăuga la instalare extensia „%s”: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Nu s-a putut adăuga la dezinstalare extensia „%s”: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"„%s” la distanță nu permite instalarea a „%s”, posibil din cauza filtrului " +"acestuia. Eliminați filtrul și repetați instalarea. Eroare detaliată: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Energie electrică insuficientă pentru a face actualizarea" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Energie electrică insuficientă pentru a face actualizarea (%u%%, necesită " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Dispozitivul este inaccesibil sau în afara razei wireless" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Energia bateriei este prea scăzută" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Energia bateriei este prea scăzută (%u%%, necesită %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Se așteaptă ca actualizarea să fie aplicată" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Aparatul trebuie conectat la o sursă de curent AC" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Aparatul nu poate fi folosit cu capacul închis" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Actualizare dispozitiv %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Actualizare sistem %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Actualizare controler încorporat %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Actualizare ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Actualizare ME corporatist %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Actualizare ME consumator %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Actualizare controler %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Actualizare controler Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Actualizare microcod CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Actualizare configurație %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Actualizarea stării bateriei %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Actualizarea camerei %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Actualizare TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Actualizarea panoului tactil %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Actualizarea mausului %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Actualizarea tastaturii %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Actualizare controler de stocare %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Actualizare de interfață de rețea %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Actualizarea ecranului %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Actualizare BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Actualizare receptor USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Actualizare unitate %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Actualizare unitate flash %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Actualizare SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Actualizare GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Actualizare dock %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Actualizare suport USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Microcod" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Actualizarea microcodului nu a putut fi aplicată: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Asistență pentru microcod" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Oferă asistență pentru avansarea microcodului" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Se instalează programul nesemnat?" + +# „manipulat” mi se pare mai sugestiv decât „alterat”/„modificat” +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Programul care urmează să fie instalat nu este semnat. Nu va fi posibilă " +"verificarea originii actualizărilor acestui program, sau dacă actualizările " +"au fost manipulate." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Se descarcă programul nesemnat?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Actualizări nesemnate sunt disponibile. Fără o semnătură, nu este posibilă " +"verificarea sursei actualizărilor, sau dacă acestea au fost falsificate." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Se actualizează programul nesemnat?" + +# nu e clar dacă e plural sau singular +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Actualizări nesemnate sunt disponibile. Fără o semnătură, nu este posibilă " +"verificarea originii actualizării, sau dacă a fost manipulată. Actualizările " +"for fi dezactivate până când actualizările nesemnate sunt fie eliminate, fie " +"actualizate." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Nu s-au putut instala actualizările: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Pachete" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Nu s-a putut încheia tranzacția înainte de descărcare: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Nu s-au putut descărca actualizările: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Nu s-a putut începe actualizarea: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Sistem de operare (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Magazinul Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Un snap este un pachet Linux universal" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistem" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Componentă de sistem" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Eliminarea lucrării sysupdate „%s” nu a reușit cu starea %i" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..e0f56e4 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,6852 @@ +# Russian translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Yuri Myasoedov , 2014, 2015. +# Ivan Komaritsyn , 2015. +# Pavel Elizaryev , 2016. +# Stas Solovey , 2013-2018, 2019. +# Maxim Taranov , 2017. +# Melman , 2021. +# Ivan Molodetskikh , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-28 12:53+0000\n" +"PO-Revision-Date: 2025-02-28 16:07+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<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 3.5\n" + +# перевод по аналогии с ubuntu software - центр приложений ubuntu +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Центр приложений" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Установка и обновление приложений" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Центр приложений позволяет находить и устанавливать новые приложения и " +"системные расширения, а также удалять уже установленные приложения." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Центр приложений предоставляет рекомендуемые и популярные приложения с " +"описанием и несколькими снимками экрана к ним. Приложения можно находить, " +"просматривая по категориям, либо с помощью функции поиска. Также центр " +"приложений позволяет обновлять систему с помощью отложенных обновлений." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Панель обзора" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Панель подробностей" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Панель установленного" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Панель обновлений" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Подробности об обновлении" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Проект GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Проверка ключа akmods в Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Для проверки ключа akmods в Shim UEFI требуется аутентификация" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Регистрация ключа akmods в Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Для регистрации ключа akmods в Shim UEFI требуется аутентификация" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Проверка ключа DKMS в Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Для проверки ключа DKMS в Shim UEFI требуется аутентификация" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Регистрация ключа DKMS в Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Для регистрации ключа DKMS в Shim UEFI требуется аутентификация" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Установить appstream-файл в систему" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Установка appstream-файла в систему" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Список совместимых проектов" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Это список совместимых проектов, которые мы должны показывать как GNOME, KDE " +"и XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Управлять обновлениями в центре приложений GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Если отключено, то центр приложений GNOME будет скрывать панель обновлений, " +"не будет выполнять автоматические обновления или предлагать их." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Автоматически загружать и устанавливать обновления" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Если включено, то центр приложений GNOME будет автоматически загружать " +"обновления в фоновом режиме, а также устанавливать те, которые не требуют " +"перезагрузки." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Уведомлять пользователя о ПО, обновлённом в фоновом режиме" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Если включено, центр приложений GNOME уведомляет пользователя об " +"обновлениях, которые произошли, пока пользователь отсутствовал." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Автоматически загружать обновления при тарифном подключении" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Если включено, то центр приложений GNOME будет выполнять обновления в " +"фоновом режиме даже при использовании тарифного подключения (впоследствии " +"загрузки некоторых метаданных, проверки обновлений и других действий, может " +"взиматься плата с пользователя)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Первый запуск центра приложений GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Показывать оценки приложений" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Фильтровать приложения на основе ветки, установленной по умолчанию для " +"удалённого источника" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Предупреждать при установке несвободных приложений" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Показывать диалог с предупреждением при установке несвободных приложений." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Метка времени последней проверки обновлений" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Временная метка последнего уведомления об обновлении" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Временная метка последнего уведомления об обновлении" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Метка времени первого обновления безопасности, очищенная после обновления" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Метка времени последнего обновления" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Время в секундах для проверки корректности исходного снимка экрана" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Чем больше значение, тем меньше обращений к удалённому серверу, но " +"обновление снимков экрана занимает более продолжительное время. «0» — " +"никогда не обращаться к серверу, если изображение уже есть в кэше." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Сервер, используемый для отзывов на приложения" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Минимальное значение кармы для отзывов" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Отзывы с кармой меньше этого числа не будут показаны." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Список официальных репозиториев, которые не будут считаться сторонними" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Список необходимых репозиториев, которые нельзя отключить или удалить" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Список официальных репозиториев, которые следует считать свободным ПО" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "Используемый URL лицензии, когда приложение считается свободным ПО" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Установить набор приложений для всех пользователей в системе, когда это " +"возможно" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Разрешить доступ к диалоговому окну репозиториев центра приложений" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Предлагать обновления для предварительных релизов" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Показывать элементы интерфейса, информирующие пользователя о том, что " +"приложение несвободное" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Показывать в списке установленных приложений размер приложения в " +"установленном виде" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://ru.wikipedia.org/wiki/Проприетарное_программное_обеспечение'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI, описывающий несвободное и проприетарное ПО" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Список URL, указывающих на appstream-файлы, которые будут загружены в папку " +"swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Установить appstream-файлы в общесистемную папку для всех пользователей. " +"Если значение false, файлы устанавливаются в нестандартный каталог " +"$XDG_DATA_HOME/swcatalog/xmls" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Приоритетный порядок предпочтительных форматов пакета, при этом более важные " +"форматы перечислены первыми. Пустой массив означает порядок по умолчанию. " +"Пропущенные форматы считаются перечисленными последними. Примеры форматов " +"пакета: deb, flatpak, rpm, snap. Форматы могут быть дополнительно указаны с " +"именем источника, разделенным двоеточием, например, 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Временная метка последней попытки удаления неиспользуемых сред выполнения " +"Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Установите значение \"true\", чтобы показывать только приложения со " +"свободной лицензией и скрыть все проприетарные приложения." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Установите значение \"true\", чтобы показывать только приложения от " +"разработчиков, чья личность была подтверждена." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Временная метка последнего полученного исторического обновления." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Строка, в которой хранится идентификатор gnome-online-account, используемый " +"для входа" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Общесистемный установщик AppStream центра приложений GNOME" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Не удалось разобрать аргументы командной строки" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Необходимо указать только одно имя файла" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Это приложение может быть использовано только администратором" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Не удалось проверить тип содержимого: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Не удалось переместить: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Установка приложений" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Установить выбранное программное обеспечение" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Мультяшное насилие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Нет информации о насилии в мультфильмах" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Насилие в стиле фэнтези" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Нет информации относительно фантазийного насилия" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Реалистичное насилие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Нет информации относительно реалистичного насилия" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Насилие, изображающее кровопролитие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Нет информации о кровопролитии" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Сексуальное насилие" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Нет информации о сексуальном насилии" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Алкоголь" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Нет информации относительно упоминаний об алкоголе" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Наркотики" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Нет информации относительно упоминаний о запрещенных наркотиках" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Табак" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Нет информации относительно упоминаний о табачных изделиях" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Нагота" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Нет информации о наготе любого рода" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Сексуальная тематика" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Нет информации об упоминаниях или изображениях сексуального характера" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Ругательства" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Нет информации, касающейся ненормативной лексики любого рода" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Неуместный юмор" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Нет информации о неуместном юморе" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Дискриминация" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Нет информации о дискриминационных высказываниях любого рода" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Реклама" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Нет информации о рекламе любого рода" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Азартные игры" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Нет информации, касающейся азартных игр любого рода" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Платное" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Нет информации относительно способности тратить деньги" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Общение между пользователями" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Нет информации о способах общения с другими пользователями" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Звуковое общение между пользователями" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Нет информации о способах разговора с другими пользователями" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Контактные данные" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Нет информации о совместном использовании имен пользователей социальных " +"сетей или адресов электронной почты" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Идентификационная информация" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Нет информации о передаче информации о пользователе третьим лицам" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Совместное использование местоположения" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Нет информации о совместном использовании физического местоположения с " +"другими пользователями" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Гомосексуализм" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Нет информации относительно упоминаний о гомосексуализме" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Проституция" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Нет информации относительно упоминаний о проституции" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Прелюбодеяние" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Нет информации относительно упоминаний о прелюбодеянии" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Сексуализированные персонажи" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Нет информации о сексуализированных персонажах" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Осквернение" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Нет информации относительно упоминаний об осквернении" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Человеческие останки" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Нет информации относительно видимых мертвых человеческих останков" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Рабство" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Нет информации относительно упоминаний о рабстве" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Не включает в себя упоминаний о наркотиках" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" +"Не включает в себя ругательства, ненормативную лексику и другие виды крепких " +"выражений" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Не включает в себя рекламу или денежные операции" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Не включает в себя секс или наготу" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Не включает в себя функцию неконтролируемого чата" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Не включает в себя насилие" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Наркотики" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Крепкие выражения" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Деньги" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Социальное" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Насилие" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Все" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "«%s» имеет неизвестный возрастной рейтинг" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "«%s» подходит для всех" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "«%s» подходит для малышей" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "«%s» подходит для маленьких детей" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "«%s» подходит для детей" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "«%s» подходит для подростков" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "«%s» подходит для взрослых" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "«%s» подходит для %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Возрастной рейтинг" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Как внести недостающую информацию" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Локальный файл" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Пакет" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Ожидают" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Ожидают установки" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Ожидают удаления" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Устанавливается" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Удаляется" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Загружается" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Установить" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Удалить…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Сеть" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Может общаться по сети" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Системные службы" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Может получить доступ к службам D-Bus на системной шине" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Службы сеанса" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Может получить доступ к службам D-Bus на шине сеанса" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Устройства" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Может получить доступ к произвольным устройствам, таким как веб-камеры" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Может получить доступ к устройствам ввода" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Может получить доступ к микрофонам и воспроизводить звук" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Может получить доступ к системным файлам устройства" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Содержимое экрана" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Может получить доступ к содержимому экрана" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Домашняя папка" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Может просматривать, редактировать и создавать файлы" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Может просматривать файлы" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Файловая система" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Папка для загрузок" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Настройки" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Можно просматривать и изменять любые настройки" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Устаревшая система отображения" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Использует старую, небезопасную систему отображения" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Выход из «песочницы»" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Может выходить из «песочницы» и обходить другие ограничения" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Описание обновления отсутствует." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Подробности обновления" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Требуются дополнительные разрешения" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Недопустимые данные о рейтингах, полученные от сервера" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Не удалось установить связь с сервером рейтингов" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Отзывы" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Для этого приложения не найдено отзывов." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Нет отзывов" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "История версий" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Новое в версии %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Версия %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Для этого релиза нет подробностей" + +# fix даты +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %b., %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Режим при запуске: «updates» (обновления), «updated» (обновлённые), " +"«installed» (установленные) или «overview» (обзор)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "РЕЖИМ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Поиск приложений" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ПОИСК" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Показать информацию о приложении (используя ID приложения)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Показать информацию о приложении (используя имя пакета)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "ИМЯ_ПАКЕТА" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Установить приложение (используя ID приложения)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Удалить приложение (используя ID приложения)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Открыть локальный файл пакета" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "ИМЯ_ФАЙЛА" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Какое взаимодействие ожидается для этого действия: «none» (отсутствует), " +"«notify» (уведомление), «full» (полное)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ВЗАИМОДЕЙСТВИЕ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Показать локальный файл metainfo или appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Включить вывод подробной отладки (от запущенного экземпляра, если он уже " +"запущен)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Устанавливать любые ожидающие обновления в фоновом режиме" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Показать параметры" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Закрыть запущенную копию" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Предпочитать локальные источники вместо AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Показать номер версии" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Авторское право © 2016-2023 Разработчики Центра приложений GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Станислав Соловей , 2013-2019.\n" +"Юрий Мясоедов , 2014.\n" +"Alexey Rubtsov , 2021.\n" +"Aleksandr Melman , 2022-2023" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Извините, но деталей о данном приложении нет." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Итоговый размер" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Включает %s данных и %s кэша" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Включает %s данных" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Включает %s кэша" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Использование кэша и данных неизвестно" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Размер загрузки" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Не требует дополнительных системных файлов" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Требуется неизвестный размер дополнительных системных файлов" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Требуется %s дополнительных системных файлов" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Размер неизвестен" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Нет разрешений" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Имеет доступ к сети" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Использует системные службы" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Использует службы сеанса" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Может получить доступ к устройствам" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Может получить доступ к системным устройствам" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Может читать/записывать все ваши данные" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Может считывать все ваши данные" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Может читать/записывать ваши загрузки" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Может читать ваши загрузки" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Может получить доступ к некоторым определенным файлам" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Может получить доступ и изменить настройки пользователя" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Использует устаревшую оконную систему" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Может получать произвольные разрешения" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Разработчик приложения проверен" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Проверено поставщиком ОС" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Проверено %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Предоставлено третьими лицами" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "ПО больше не поддерживается" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Аудируемый код" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Неизвестная лицензия" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Проприетарный код" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Специальная лицензия" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Привилегированное" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Безопасно" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Вероятно, безопасное" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Потенциально небезопасно" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Небезопасно" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Только для мобильных устройств" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Работает только на небольших экранах" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Только для ПК" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Работает только на больших экранах" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Ошибка с размером экрана" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Не поддерживает текущий размер экрана" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Требуется сенсорный экран" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Требуется клавиатура" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Требуется мышь" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Требуется игровой контроллер" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Для игры требуется игровой контроллер" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Адаптивное" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Работает на телефонах, планшетах и ПК" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Возможно требуется мышь или клавиатура" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Работает на ПК и ноутбуках" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Не содержит несоответствующего возрасту контента" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Информация о возрастной категории отсутствует" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Посетите сайт" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Установить…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Отменить" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Установить" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Загрузить" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Обновить" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Удалить…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Удаляется" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Критическое обновление" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Устройство не может быть использовано во время обновления." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Источник: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Переименовано с %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Остановлено получение обновлений" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Критическое обновление" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Установлено" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Помочь перевести %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"Приложение \"%s\" проектируется, разрабатывается и переводится международным " +"сообществом разработчиков.\n" +"\n" +"Это означает, что, хотя он еще не доступен на вашем языке, вы можете принять " +"участие и помочь перевести его самостоятельно." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Переводы" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Сайт перевода" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Требуется вход в удалённый узел %s (домен %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Требуется вход" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Отменить" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Вход" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Пользователь" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "П_ароль" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Другое" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Все" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Рекомендуемые" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Выбор редакции" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Новые и обновленные" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Подборки из Cети" + +# перевод по аналогии с ubuntu software - центр приложений ubuntu +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Другое ПО" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "Установлено: %s" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Необходима перезагрузка, чтобы изменения вступили в силу" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Приложение готово к использованию" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Установлены обновления системы" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Недавно установленные обновления доступны для просмотра" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Перезапустить" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Запустить" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Установить ПО?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Установить стороннее ПО?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Включить репозиторий ПО?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Включить репозиторий стороннего ПО?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s не является свободным и открытым приложением и предоставляется " +"«%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s предоставляется «%s»." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Для продолжения установки необходимо включить этот репозиторий ПО." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"В некоторых странах установка или использование %s могут быть незаконны." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"В некоторых странах установка или использование этого кодека могут быть " +"незаконны." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Больше не _предупреждать" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Включить и _установить" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Подробные сообщения об ошибках от менеджера пакетов:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Подробности" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Закрыть" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Подробности скопированы в буфер обмена" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Принять" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Обновление было установлено" +msgstr[1] "Обновления были установлены" +msgstr[2] "Обновления были установлены" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Приложение было удалено" +msgstr[1] "Приложения были удалены" +msgstr[2] "Приложения были удалены" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Необходима перезагрузка, чтобы применить изменение" +msgstr[1] "Необходима перезагрузка, чтобы применить изменения" +msgstr[2] "Необходима перезагрузка, чтобы применить изменения" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Не сейчас" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Сегодня" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Вчера" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d день назад" +msgstr[1] "%d дня назад" +msgstr[2] "%d дней назад" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d неделя назад" +msgstr[1] "%d недели назад" +msgstr[2] "%d недель назад" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d месяц назад" +msgstr[1] "%d месяца назад" +msgstr[2] "%d месяцев назад" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d год назад" +msgstr[1] "%d года назад" +msgstr[2] "%d лет назад" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Только что" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d минута назад" +msgstr[1] "%d минуты назад" +msgstr[2] "%d минут назад" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d час назад" +msgstr[1] "%d часа назад" +msgstr[2] "%d часов назад" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Все" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Рекомендуемые" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Трёхмерная графика" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Фотография" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Сканирование" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Векторная графика" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Приложения для просмотра" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Звуковые редакторы и рекордеры" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Музыкальные проигрыватели" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Все" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Рекомендуемые" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Календарь" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Базы данных" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Финансы" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Текстовые процессоры" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Текстовые редакторы" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Веб-браузеры" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Все" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Рекомендуемые" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Экшен" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Приключения" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Аркады" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Блоки" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Настольные" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Карточные" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Эмуляторы" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Детские" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Логические" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Ролевые" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Спортивные" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Стратегии" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Все" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Рекомендуемые" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Обмен сообщениями" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Все" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Рекомендуемые" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Искусственный интеллект" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Астрономия" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Химия" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Языки" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Математика" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Новости" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Робототехника" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Искусство" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Биография" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Комиксы" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Фантастика" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Здоровье" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "История" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Стиль жизни" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Политика" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Спорт" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Все" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Рекомендуемые" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Отладчики" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Среды разработки" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Кодеки" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Драйверы" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Шрифты" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Источники ввода" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Языковые пакеты" + +# Приложению требуется … +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Локализация" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Творчество" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Работа" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Игры" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Общение" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Познание" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Разработка" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Кодеки" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Драйверы оборудования" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Шрифты" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Источники ввода" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Языковые пакеты" + +# Приложению требуется … +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Локализация" + +# Приложению требуется … +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Приложение" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s требуется дополнительная поддержка файловых форматов." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Требуются дополнительные типы MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s требуются дополнительные шрифты." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Требуются дополнительные шрифты" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s требуются дополнительные мультимедиа-кодеки." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Требуются дополнительные мультимедиа-кодеки" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s требуются дополнительные драйверы для принтера." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Требуются дополнительные драйверы для принтера" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s требуются дополнительные пакеты." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Требуются дополнительные пакеты" + +# перевод по аналогии с ubuntu software - центр приложений ubuntu +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Найти в Центре приложений" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Показать больше" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Показать меньше" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Удаление…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Для завершения установки требуется перезапуск" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Для завершения удаления требуется перезапуск" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "В ожидании установки…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "В ожидании обновления…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Загрузка…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Подготавливается…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Удаляется…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "Приложение \"%s\" не установлено, но все еще присутствуют его данные." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Перезапустить" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Включить…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Установить…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "Приложение %s будет отображаться на английском языке" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Это приложение будет отображаться на английском языке" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Это ПО будет отображаться на английском языке" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Помочь _перевести" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Другие приложения от %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Разработчик %s подтвердил право собственности на %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Разработчик подтвердил право собственности на %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Для написания отзыва необходимо подключение к Интернету" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Это приложение больше не получает обновлений, включая исправления " +"безопасности" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Это приложение уже предоставлено вашим дистрибутивом и не может быть " +"заменено." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Это приложение не предоставляет никаких ссылок на сайт, репозиторий кода или " +"трекер проблем." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Это ПО больше не получает обновлений, включая исправления безопасности" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "Это ПО уже предоставлено вашим дистрибутивом и не может быть заменено." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Это ПО не предоставляет никаких ссылок на сайт, репозиторий кода или трекер " +"проблем." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"ПО не удалось получить информацию для «%s», и оно не может показать " +"подробные сведения об этом приложении." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Недопустимый ответ на отзыв, полученный от сервера" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Не удалось отправить отзыв для \"%s\": %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Страница подробностей" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Загрузка описания приложения" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Проверено" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Открыть" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Обновить" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Удалить" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Дополнения" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Этим приложением можно пользоваться только при наличии активного Интернет-" +"подключения." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Содержит репозиторий ПО" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Это приложение содержит репозиторий ПО, который предоставляет обновления " +"приложения, а также доступ к другому ПО." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Не содержит репозиторий ПО" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Приложение не содержит репозиторий ПО. Оно не будет обновляться при выходе " +"новых версий." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Определен репозиторий ПО" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Добавление этого репозитоия ПО предоставит доступ к дополнительным " +"приложениям и обновлениям." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Используйте только те репозитории ПО, которым доверяете." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Очистить данные приложения" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "У_далить данные" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Метаданные отсутствуют" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Сайт _проекта" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Пожертвовать" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Помочь с _переводами" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Сообщить о проблеме" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Сп_равка" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Связаться" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Написать о_тзыв" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Все отзывы" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Невозможно показать сведения о приложении" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Не удалось подготовить перезагрузку" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Неизвестная ошибка" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Ключ не найден" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Ключ не зарегистрирован" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Требуется регистрация MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Далее" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"На этом устройстве включена функция Secure Boot. Чтобы включить новые " +"драйверы, необходимо зарегистрировать новый ключ владельца машины (MOK). Для " +"этого требуется пароль, который необходимо ввести позже. Запишите следующий " +"пароль, связанный с ключом:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Я записал _пароль MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Перезапустить и зарегистрировать…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Инструкции по установке: Внимательно прочитайте" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"После перезапуска появится экран настройки устройства. Чтобы включить новые " +"драйверы, выполните шаги по настройке:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Выберите « Зарегистрировать MOK»\n" +"• Выберите «Да» для регистрации ключей\n" +"• Введите пароль MOK, когда появится запрос\n" +"• Затем выберите «Перезапустить»" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Последствия для безопасности" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"После успешной регистрации ключа имейте в виду, что любые последующие " +"обновления модуля или любого другого модуля будут доверяться неявно. Все " +"последующие обновления будут происходить прозрачно, без взаимодействия и " +"авторизации." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Дальнейшие указания можно найти на странице документации." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Загрузка дополнительных файлов с метаданными…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " и " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Доступный шрифт для написания %s" +msgstr[1] "Доступные шрифты для написания %s" +msgstr[2] "Доступные шрифты для написания %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Доступное ПО для %s" +msgstr[1] "Доступное ПО для %s" +msgstr[2] "Доступное ПО для %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Запрошенное приложение не найдено" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Не удалось найти заданное приложение" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s не найден" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "на сайте" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Не найдено ни одного приложения, которое предоставляло бы файл %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Сведения о %s, а также параметры для получения отсутствующих приложений, " +"можно найти на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Не найдено ни одного приложения для поддержки %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s недоступен." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Сведения о %s, а также параметры для получения приложения, которое " +"поддерживает этот формат, можно найти на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Отсутствуют доступные рукописные шрифты %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Сведения о %s, а также параметры для получения дополнительных шрифтов можно " +"найти на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Нет доступных кодеков для формата %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Сведения о %s, а также параметры для получения кодека, который может " +"воспроизводить этот формат, можно найти на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Не найдено ни одного ресурса Plasma для поддержки %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Сведения о %s, а также параметры для получения дополнительных ресурсов " +"Plasma можно найти на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Не найдено ни одного драйвера принтера для %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Сведения о %s, а также параметры для получения драйвера, который " +"поддерживает этот принтер можно найти на %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "документация" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Кодек %s, требующийся для %s, не найден. Подробную информацию прочтите здесь " +"- %s." +msgstr[1] "" +"Кодеки %s, требующиеся для %s, не найдены. Подробную информацию прочтите " +"здесь - %s." +msgstr[2] "" +"Кодеки %s, требующиеся для %s, не найдены. Подробную информацию прочтите " +"здесь - %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "Кодек %s не найден. Подробную информацию прочтите здесь - %s." +msgstr[1] "Кодеки %s не найдены. Подробную информацию прочтите здесь - %s." +msgstr[2] "Кодеки %s не найдены. Подробную информацию прочтите здесь - %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Не удалось получить результаты поиска: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Формат файла %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Установить _все" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Не удалось найти заданное приложение" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Страница кодеков" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Результаты не найдены" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Не удалось выполнить поиск" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Предыдущая" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Следующая" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Рекомендуемые приложения" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Поддержка ПК" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Поддерживает использование на большом экране" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Поддержка ПК неизвестна" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Недостаточно информации, чтобы понять, поддерживаются ли большие экраны" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Требуется большой экран" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "ПК не поддерживается" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Невозможно использовать на большом экране" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Поддержка мобильных устройств" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Поддерживает использование на маленьком экране" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Поддержка мобильных устройств неизвестна" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Недостаточно информации, чтобы понять, поддерживаются ли маленькие экраны" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Требуется маленький экран" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Мобильные устройства не поддерживается" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Невозможно использовать на маленьком экране" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Поддержка клавиатуры" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Поддержка клавиатуры не известна" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Недостаточно информации, чтобы понять, поддерживаются ли клавиатуры" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Требуется клавиатура" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Поддерживает клавиатуры" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Клавиатура не поддерживается" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Невозможно использовать с клавиатурой" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Поддержка мыши" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Требуется мышь или указатель" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Поддержка мыши неизвестна" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Недостаточно информации, чтобы понять, поддерживаются ли мыши или указатели" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Требуется мышь" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Поддержка мышей и указателей" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Мышь не поддерживается" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Невозможно использовать с мышью или указателем" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Поддержка сенсорного экрана" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Поддержка сенсорного экрана не известна" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Недостаточно информации, чтобы понять, поддерживаются ли сенсорные экраны" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Требуется сенсорный экран" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Поддерживает сенсорные экраны" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Сенсорный экран не поддерживается" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Невозможно использовать с сенсорным экраном" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Требуется игровой контроллер" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Требуется игровой контроллер" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Поддержка игрового контроллера" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Поддерживает игровые контроллеры" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "«%s», вероятно, работает на этом устройстве" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "«%s» работает на этом устройстве" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s, вероятно, работает на этом устройстве" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "«%s» не будет работать должным образом на этом устройстве" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "«%s» не будет работать на этом устройстве" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Поддержка оборудования" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Навигация" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Перейти на страницу обзора" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Перейти на страницу установленного" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Перейти на страницу обновлений" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Открыть панель поиска" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Окна" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Открыть параметры" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Открыть репозитории ПО" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Справка" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Открыть комбинации клавиш" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Установлено" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Страница установленного" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "В процессе" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Приложения" + +# Приложению требуется … - Неактуально по английскому тексту +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Веб-приложения" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Системные приложения" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Сделано сообществом" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Принять участие" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Это приложение разрабатывается в открытом режиме международным сообществом и " +"выпускается под %s лицензией.\n" +"\n" +"Вы можете принять участие и помочь сделать его еще лучше." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Это приложение разрабатывается в открытом режиме международным сообществом и " +"выпускается под лицензией %s.\n" +"\n" +"Вы можете принять участие и помочь сделать его еще лучше." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Это программное обеспечение разрабатывается в открытом режиме международным " +"сообществом и выпускается под %s лицензией.\n" +"\n" +"Вы можете принять участие и помочь сделать его еще лучше." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Это программное обеспечение разрабатывается в открытом режиме международным " +"сообществом и выпускается под лицензией %s.\n" +"\n" +"Вы можете принять участие и помочь сделать его еще лучше." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Неизвестная лицензия" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Узнать больше" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Это приложение не указывает под какой лицензией оно разработано, и оно может " +"быть проприетарным. Оно может быть небезопасным, и его трудно обнаружить, а " +"также может изменяться без надзора.\n" +"\n" +"Вы можете вносить или не вносить вклад в это приложение." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Это программном обеспечении не указывает, под какой лицензией оно " +"разработано, и оно может быть проприетарным. Оно может быть небезопасным, и " +"его трудно обнаружить, а также может изменяться без надзора.\n" +"\n" +"Вы можете вносить или не вносить вклад в это программное обеспечение." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Проприетарный код" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Это приложение не разрабатывается открыто, поэтому только его разработчики " +"знают, как оно работает. Оно может быть небезопасным в тех случаях, когда " +"его трудно проанализировать, и может изменяться без контроля.\n" +"\n" +"Возможно, вы не сможете внести свой вклад в это приложение." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Это программное обеспечение не разрабатывается открыто, поэтому только его " +"разработчики знают, как оно работает. Оно может быть небезопасным в тех " +"случаях, когда его трудно проанализировать, и может изменяться без " +"контроля.\n" +"\n" +"Возможно, вы не сможете внести свой вклад в это программное обеспечение." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Специальная лицензия" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Это приложение разработано под специальной лицензией %s.\n" +"\n" +"Вы можете вносить или не вносить вклад в это приложение." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Это приложение разработано под специальной лицензией \"%s\".\n" +"\n" +"Вы можете вносить или не вносить вклад в это приложение." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Это программное обеспечение разработано под специальной лицензией %s.\n" +"\n" +"Вы можете вносить или не вносить вклад в это программное обеспечение." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Это программное обеспечение разработано под специальной лицензией \"%s\".\n" +"\n" +"Вы можете вносить или не вносить вклад в это программное обеспечение." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Обновление данных" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Загрузка страницы" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Запуск" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Неизвестный источник" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Бета" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Пользовательская" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Дополнения" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Удаления" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Обновления" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Понижение версий" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "выбранных внешних источников" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Предоставляет доступ к дополнительному программному обеспечению из %s. " +"Включая некоторые проприетарные приложения.\n" +"\n" +"Вы можете включить эти репозитории позже в настройках Центра приложений." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Включить репозитории стороннего ПО?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Игнорировать" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Включить" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Доступно для вашей операционной системы" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Доступно для %s" + +# Не нравится этот перевод, но не смог придумать ничего другого +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Обзор" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Главная страница" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Доступные приложения" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Другие категории" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Данные приложения не найдены" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Неизвестный" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_ОК" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Пользователь отказался от установки" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Подготовка %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Уверены, что хотите удалить репозиторий %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Все приложения из %s будут удалены, и вам придется переустановить " +"репозиторий, чтобы использовать их снова." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Удалить %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "После удаления использовать %s будет невозможно." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"После удаления невозможно будет использовать приложения, зависящие от %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"После удаления использовать %s будет невозможно, а все документы, в которых " +"он используется, будут отображаться другим шрифтом." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"После удаления использовать %s будет невозможно. Это может означать, что " +"некоторые медиафайлы больше не будут воспроизводиться." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Оборудование, зависящее от %s, может перестать корректно работать после " +"удаления." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"После удаления использовать %s будет невозможно. Данные и настройки " +"приложения будут сохранены на диске, что позволит восстановить приложение в " +"будущем." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Параметры" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Обновления ПО" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Подробная информация" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"При проверке и загрузке обновлений расходуются данные и электроэнергия. " +"Поэтому функции автоматического обновления приостанавливаются при " +"использовании тарифных сетевых подключений и при включенном энергосбережении." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Автоматически" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Автоматически проверять и загружать обновления" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Вручную" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Проверка и загрузка обновлений выполняется вручную" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Уведомления об автоматических обновлениях" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Уведомлять когда обновления были установлены автоматически" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Фильтры содержимого" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Показывать только _свободное ПО" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Скрывать проприетарное ПО при просмотре каталога и поиске" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Показывать только _проверенных разработчиков" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Показывать только приложения от разработчиков, чья личность была подтверждена" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Установленное ПО несовместимо с %s и будет автоматически удалено во время " +"обновления." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Несовместимое ПО" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Обновить" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Удалить" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Данные и настройки приложения" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Сохранить" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Позволяет восстанавливать настройки и содержимое приложения" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "У_далить" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Безвозвратно удаляет данные для экономии дискового пространства" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "ПО, которое было установлено с \"%s\", перестанет получать обновления." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Отключить репозиторий?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Удалить репозиторий?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Отключить" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Удалить" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Включить новые репозитории" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Включить новые репозитории при их добавлении" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "больше информации" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Дополнительные репозитории от выбранных сторонних источников - %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Сторонние репозитории Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "операционная система" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Эти репозитории дополняют ПО по умолчанию, предоставленное %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Репозитории ПО" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Нет репозиторий" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u приложение установлено" +msgstr[1] "%u приложения установлено" +msgstr[2] "%u приложений установлено" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u дополнение установлено" +msgstr[1] "%u дополнения установлено" +msgstr[2] "%u дополнений установлено" + +# Приложению требуется … +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u приложение" +msgstr[1] "%u приложения" +msgstr[2] "%u приложений" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u дополнение" +msgstr[1] "%u дополнения" +msgstr[2] "%u дополнений" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s и %s установлено" +msgstr[1] "%s и %s установлено" +msgstr[2] "%s и %s установлено" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Проверка установленного ПО…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Удалить" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Ненавижу" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Не понравилось" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Нормально" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Понравилось" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Обожаю" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Выберите звезду, чтобы поставить оценку" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Пожалуйста, уделите больше времени написанию отзыва" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Выберите оценку" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Краткое описание должно быть длиннее" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Краткое описание слишком длинное" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Описание слишком короткое" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Описание слишком длинное" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Написать отзыв" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Отправить" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Пожалуйста, укажите рейтинг, краткое содержание и текст отзыва. Отзывы не " +"должны использоваться для сообщения о проблемах: вместо этого обратитесь к " +"разработчику или в службу поддержки." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Сводка отзывов" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Написать краткий отзыв" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Узнать какие данные передаются можно в нашей политике конфиденциальности. Полное имя, привязанное к " +"вашей учетной записи, будет отображаться в открытом доступе." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u отзывов всего" +msgstr[1] "%u отзыва всего" +msgstr[2] "%u отзывов всего" + +# перевод по аналогии с ubuntu software - центр приложений ubuntu +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "из 5 звезд" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Неизвестный" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Вы не можете публиковать отзывы из-за оскорбительного и грубого поведения." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "Ваш отзыв будет скрыт до тех пор, пока его не проверит администратор." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Отправить отзыв?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Отправить" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Удалить отзыв?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Удаление отзыва нельзя отменить." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Нравится отзыв" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Не нравится отзыв" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Пожаловаться…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Удалить…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Приложение не находится в песочнице, но дистрибутив проверил, что оно не " +"является вредоносным" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Убедитесь, что вы доверяете поставщику, поскольку приложение не находится в " +"песочнице" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Нет разрешений" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Приложение полностью изолировано" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Доступ к сети" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Может получить доступ к интернету" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Нет доступа к сети" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Не может получить доступ к интернету" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Использует системные службы" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Может запрашивать данные у системных служб" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Использует службы сеанса" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Может запрашивать данные у служб сеанса" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Доступ к устройству пользователя" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Может получить доступ к таким устройствам, как веб-камеры или игровые " +"контроллеры" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Нет доступа к устройству пользователя" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Не может получить доступ к таким устройствам, как веб-камеры или игровые " +"контроллеры" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Доступ к устройству ввода" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Доступ к микрофону и воспроизведение звука" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Может слушать с помощью микрофонов и воспроизводить звук, не спрашивая " +"разрешения" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Доступ к системному устройству" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Может получить доступ к системным устройствам, требующим повышенных " +"разрешений" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Доступ к содержимому экрана" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Может получить доступ к содержимому экрана или других окон" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Использует устаревшую оконную систему" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Произвольные разрешения" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Пользовательские настройки" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Полный доступ к файловой системе на чтение/запись" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Может читать и записывать все данные в файловой системе" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Доступ к домашней папке для чтения/записи" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Может читать и записывать все ваши данные в домашней папке" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Полный доступ к файловой системе на чтение" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Может читать все данные в файловой системе" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Доступ на чтение домашней папки" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Может читать все ваши данные в домашней папке" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Доступ для чтения/записи в папку загрузки" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Может читать и записывать все ваши данные в папке загрузки" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Доступ на чтение папки загрузки" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Может читать все ваши данные в папке загрузки" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Может читать и записывать все данные в папке" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Может читать все данные в папке" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Нет доступа к файловой системе" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Не может получить доступ к файловой системе" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Разработчик приложения проверен" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Разработчик этого приложения подтвердил, что является тем, за кого себя " +"выдает" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Небезопасные зависимости" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"ПО или его зависимости больше не поддерживаются и могут быть небезопасными" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Это приложение не указывает под какой лицензией оно разработано, и может " +"быть проприетарным" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Это программное обеспечение не указывает под какой лицензией оно " +"разработано, и может быть проприетарным" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Проприетарный код" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Исходный код не является открытым, поэтому не может быть подвергнут " +"независимому аудиту и может быть небезопасным" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Это приложение разработано под специальной лицензией \"%s\"" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "" +"Это программное обеспечение разработано под специальной лицензией \"%s\"" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Проверяемый код" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Исходный код является открытым и может быть подвергнут независимому аудиту, " +"что повышает вероятность того, что приложение безопасно" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s является привилегированным" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "«%s» безопасно" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s является, вероятно, безопасным" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "«%s» потенциально небезопасно" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "«%s» небезопасно" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Неизвестная" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Безопасность" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Лицензия" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Источник" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Это приложение использует устаревшую версию программной платформы (SDK) и " +"может содержать ошибки или уязвимости в системе безопасности, которые не " +"будут исправлены." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Предыдущий снимок экрана" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Следующий снимок экрана" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Нет снимков экрана" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Снимок экрана не найден" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Не удалось загрузить изображение" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Размер снимка экрана не найден" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Не удалось создать кэш" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Снимок экрана недействителен" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Снимок экрана недоступен" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Снимок экрана" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "ещё %u совпадение" +msgstr[1] "ещё %u совпадения" +msgstr[2] "ещё %u совпадений" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Страница поиска" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Поиск приложений" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Приложение не найдено" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Не удалось загрузить обновления" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Не удалось загрузить обновления прошивки" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Не удалось загрузить обновления прошивки из %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Не удалось загрузить обновления из %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Не удалось обновить: необходимо подключение к Интернету" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Не удалось обновить: недостаточно места на диске" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Не удалось загрузить обновления из %s: недостаточно места на диске" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Не удалось обновить: требуется аутентификация" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Не удалось обновить: ошибка аутентификации" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Не удалось обновить: требуется разрешение" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Не удалось загрузить обновления: недостаточно прав для установки ПО" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Не удалось получить список обновлений" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Не удалось установить: сбой загрузки" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Не удалось установить %s: сбой загрузки из %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Не удалось установить %s: сбой загрузки" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Не удалось установить: отсутствует среда выполнения" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Не удалось установить %s: среда выполнения %s не доступена" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Не удалось установить %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Не удалось установить: необходимо подключение к Интернету" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Не удалось установить: недопустимый формат приложения" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Не удалось установить: недостаточно места на диске" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Не удалось установить %s: недостаточно места на диске" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Не удалось установить: требуется аутентификация" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Не удалось установить %s: требуется аутентификация" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Не удалось установить: ошибка аутентификации" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Не удалось установить %s: ошибка аутентификации" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Не удалось установить: требуется разрешение" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Не удалось установить %s: требуется разрешение" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Не удалось установить: устройство должно быть подключено к сети" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Не удалось установить %s: устройство должно быть подключено к сети" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Не удалось установить : низкий заряд батареи" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Не удалось установить %s: низкий заряд батареи" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Не удалось обновить %s из %s: сбой загрузки" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Не удалось обновить %s: сбой загрузки" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Не удалось установить обновления из %s: сбой загрузки" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Не удалось обновить: сбой загрузки" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Не удалось обновить %s: недостаточно места на диске" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Не удалось обновить %s: требуется аутентификация" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Не удалось обновить %s: ошибка аутентификации" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Не удалось обновить %s: требуется разрешение" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Не удалось обновить: устройство должно быть подключено к сети" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Не удалось обновить %s: устройство должно быть подключено к сети" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Не удалось обновить: низкий заряд батареи" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Не удалось обновить %s: низкий заряд батареи" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Не удалось обновить %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Не удалось обновить" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Не удалось обновить" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Не удалось обновить до %s из %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Не удалось обновить: сбой загрузки" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Не удалось обновить до %s: сбой загрузки" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Не удалось обновить: необходимо подключение к Интернету" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Не удалось обновить до %s: необходимо подключение к Интернету" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Не удалось обновить: недостаточно места на диске" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Не удалось обновить до %s: недостаточно места на диске" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Не удалось обновить: требуется аутентификация" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Не удалось обновить до %s: требуется аутентификация" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Не удалось обновить: ошибка аутентификации" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Не удалось обновить до %s: ошибка аутентификации" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Не удалось обновить: требуется разрешение" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Не удалось обновить до %s: требуется разрешение" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Не удалось обновить: устройство должно быть подключено к сети" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Не удалось обновить до %s: устройство должно быть подключено к сети" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Не удалось обновить: низкий заряд батареи" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Не удалось обновить до %s: низкий заряд батареи" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Не удалось обновить до %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Не удалось удалить: требуется аутентификация" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Не удалось удалить %s: требуется аутентификация" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Не удалось удалить: ошибка аутентификации" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Не удалось удалить %s: ошибка аутентификации" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Не удалось удалить: требуется разрешение" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Не удалось удалить %s: требуется разрешение" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Не удалось удалить: устройство должно быть подключено к сети" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Не удалось удалить %s: устройство должно быть подключено к сети" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Не удалось удалить: низкий заряд батареи" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Не удалось удалить %s: низкий заряд батареи" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Не удалось удалить %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Не удалось запустить %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Извините, что-то пошло не так" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Не удалось запустить %s: приложение %s не установлено" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Недостаточно места на диске для операции" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Не удалось установить: тип файла не поддерживается" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Не удалось установить: сбой аутентификации" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Не удалось установить" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Не удалось связаться с %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1919 +msgid "Download failed" +msgstr "Не удалось загрузить" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Перезапустите Центр приложений, чтобы использовать новые плагины" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Устройство должно быть подключено к сети" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Слишком низкий уровень заряда батареи" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Репозитории ПО" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Параметры" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Комбинации клавиш" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_О приложении" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Поиск" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Главное меню" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Поиск приложений" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Обзор" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Установлено" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Обновления" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Назад" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Нет" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Данные приложения" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Данные, необходимые для запуска приложения" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Пользовательские данные" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Данные, созданные вами в приложении" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Данные кэша" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Временные кэшированные данные" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Само приложение" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Необходимые зависимости" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Общие системные компоненты, необходимые для данного приложения" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Неизвестно" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Кэшированные данные могут быть удалены из настроек _приложения" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Хранилище" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Установлено)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Устанавливается)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Загружается)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Удаляется)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "П_одробности" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Осмотреть" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Установлено %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Установленные обновления" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Обновления не установлены" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Обновления устарели" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Проверьте наличие доступных обновлений" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Критические обновления готовы к установке" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Установите критические обновления как можно скорее" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Критические обновления доступны для загрузки" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Загрузите критические обновления как можно скорее" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Обновления готовы к установке" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Обновления ПО готовы и в ожидании" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Обновления доступны для загрузки" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Обновления ПО можно загрузить" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u приложение обновлено — требуется перезагрузка" +msgstr[1] "%u приложения обновлено — требуется перезагрузка" +msgstr[2] "%u приложений обновлено — требуется перезагрузка" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u приложение обновлено" +msgstr[1] "%u приложения обновлено" +msgstr[2] "%u приложений обновлено" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s был обновлён." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Перезапустите приложение." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s и %s были обновлены." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u приложение требует перезапуска." +msgstr[1] "%u приложения требуют перезапуска." +msgstr[2] "%u приложений требуют перезапуска." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Включая %s, %s и %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Срок жизни системы истек" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "" +"Выполните обновление дистрибутива, чтобы продолжить получать обновления" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Для установки доступна новая версия %s" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Доступно обновление на новую версию ОС" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Не удалось обновить ПО" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Подготовленные обновления не были установлены" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Показать подробности" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Обновление системы завершено" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Добро пожаловать в %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Установлено обновление ПО" +msgstr[1] "Установлены обновления ПО" +msgstr[2] "Установлены обновления ПО" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Установлено важное обновление операционной системы." +msgstr[1] "Установлено важных обновления операционной системы." +msgstr[2] "Установлено важных обновлений операционной системы." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Просмотреть" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Сбой обновления" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Система уже обновлена." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Обновление отменено." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Доступ в Интернет требуется, но не был доступен. Убедитесь, что у вас есть " +"доступ в Интернет и попробуйте ещё раз." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Возникли проблемы безопасности с обновлением. Обратитесь к поставщику ПО для " +"получения более подробной информации." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Недостаточно места на диске. Освободите место и повторите попытку." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"К сожалению обновление не удалось установить. Подождите других обновлений и " +"повторите попытку. Если проблема не устраняется, обратитесь к поставщику ПО." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Последняя проверка: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Остановить" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Проверить наличие обновлений" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "ОС %s %s перестала получать критические обновления ПО" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Ваша операционная система перестала получать критические обновления ПО" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Возможны дополнительные расходы" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Проверка обновлений при использовании мобильного широкополосного доступа " +"может привести к перерасходу мобильного трафика и взиманию оператором " +"дополнительной платы." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "В_сё равно проверить" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Обновления ПО загружены" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Обновления готовы к установке" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Проверить наличие обновлений" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Обновления" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Страница обновлений" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Загрузка обновлений" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Это может занять некоторое время" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Актуально" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Использовать мобильные данные?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Проверка обновлений при использовании мобильного широкополосного доступа " +"может привести к дополнительным расходам" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Всё равно проверить" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Нет связи" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Чтобы проверить обновления, подключитесь к сети" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Настройки сети" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Ошибка" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Обновления выполняются автоматически" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Обновления ПО приостановлены" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Автоматические обновления ПО были приостановлены по следующим причинам:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Текущее сетевое подключение является тарифным" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Текущее сетевое подключение запрещает скачивать большие файлы" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Режим энергосбережения активен" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Игровой режим активен" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Обновления ПО приостановлены" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Тарифное сетевое подключение — обновления ПО приостановлены" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Сетевое подключение запрещает большие загрузки — обновления ПО приостановлены" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Режим энергосбережения активен — обновления ПО приостановлены" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Игровой режим активен — обновления ПО приостановлены" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Перезапустить и обновить…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "О_бновить всё" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Обновления ПО загружены" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Обновления готовы к установке" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Встроенная прошивка" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Требуется перезапуск" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Обновления приложений" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Прошивка устройства" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Загрузить" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Доступно обновление %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Доступно обновление %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Ознакомьтесь с новой версией" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s из %s загружено" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% загружено" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Крупное обновление, с новыми возможностями и улучшенным дизайном." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Отменить обновление" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Перезапуск и обновление…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Не забудьте создать резервную копию данных и файлов перед обновлением." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Информация об ошибке" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Копировать подробности" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Не удалось удалить файл \"%s\": %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Не удалось удалить каталог \"%s\": %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Установка, удаление и обновление ПО на компьютере" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Обновления;Источники;Репозитории;Параметры;Установить;Удалить;Программа;" +"Приложение;Магазин;ПО;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s готов" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s готов к включению и постановке для следующей загрузки." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Включить" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Обновления системы" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Общие обновления системы, такие как исправления безопасности или ошибок, а " +"также улучшения производительности." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Обновление %s с новыми функциями и исправлениями." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Служба обновлений EOS не смогла получить и применить обновления." + +# Приложению требуется … - Неактуально по английскому тексту +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Веб-приложение" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Поддержка веб-приложений" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Запуск популярных веб-приложений в браузере" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Обновите для получения последних возможностей и исправлений стабильности и " +"производительности." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Поддержка Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak — это платформа для приложений, запускаемых в Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Системная папка %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Подпапка Домашней папки %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Папки хост-системы" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Конфигурация хост-системы из /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Папка Рабочий стол" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Подпапка Рабочего стола %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Папка Документы" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Подпапка Документов %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Папка Музыка" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Подпапка Музыки %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Папка Изображения" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Подпапка Изображений %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Папка общего доступа" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Подпапка общего доступа %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Папка Видео" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Подпапка Видео %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Папка Шаблоны" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Подпапка Шаблонов %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Папка пользовательского кэша" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Подпапка пользовательского кэша %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Папка пользовательской конфигурации" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Подпапка пользовательской конфигурации %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Папка пользовательских данных" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Подпапка пользовательских данных %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Папка пользовательской среды выполнения" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Подпапка пользовательской среды выполнения %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Доступ файловой системы к %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1382 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Получение метаданных flatpak для %s…" + +#: plugins/flatpak/gs-flatpak.c:3608 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Не удалость уточнить дополнение '%s': %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Пользовательская установка" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Системная установка" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "ID приложения" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Не удалось добавить установку для дополнения '%s': %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Не удалось добавить удаление для дополнения '%s': %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Удаленный \"%s\" не позволяет установить \"%s\", возможно, из-за его " +"фильтра. Удалите фильтр и повторите установку. Подробная ошибка: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Питание системы слишком мало для выполнения обновления" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Питание системы слишком мало для выполнения обновления (%u%%, требуется %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "" +"Устройство недоступно или находится вне зоны действия беспроводной сети" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Заряд батареи устройства слишком мал" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Заряд батареи устройства слишком мал (%u%%, требуется %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Устройство ожидает применения обновления" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Устройству требуется подключение к сети" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Устройство не может быть использовано при закрытой крышке" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Обновление устройства %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Обновление %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Обновление контроллера %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Обновление системы управления %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Обновление корпоративной системы управления %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Обновление потребительской системы управления %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Обновление контроллера %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Обновление контроллера Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Обновление микрокода процессора %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Обновление конфигурации %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Обновление батареи %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Обновление камеры %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Обновление TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Обновление сенсорной панели %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Обновление мыши %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Обновление клавиатуры %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Обновление контроллера хранилища %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Обновление сетевого интерфейса %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Обновление дисплея %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Обновление BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Обновление USB-приемника %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Обновление накопителя %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Обновление флэш-накопителя %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Обновление SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Обновление GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Обновление Dock %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Обновление USB Dock %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Прошивка" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Не удалось применить обновление прошивки: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Поддержка обновления прошивок" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Предоставляет поддержку обновления прошивок" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Установить неподписанное ПО?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Программное обеспечение, которое должно быть установлено, не подписано. " +"Будет невозможно проверить происхождение обновлений этого программного " +"обеспечения или наличие изменений в обновлениях." + +# перевод по аналогии с ubuntu software - центр приложений ubuntu +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Загрузить неподписанное ПО?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Доступны неподписанные обновления. Без подписи невозможно проверить " +"происхождение обновления или то, было ли оно изменено." + +# перевод по аналогии с ubuntu software - центр приложений ubuntu +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Обновить неподписанное ПО?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Доступны неподписанные обновления. Без подписи невозможно проверить " +"происхождение обновления или то, было ли оно изменено. Обновления " +"программного обеспечения будут отключены до тех пор, пока неподписанные " +"обновления не будут удалены или обновлены." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Не удалось установить обновления: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Пакеты" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Не удалось дождаться окончания операции перед загрузкой: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Не удалось загрузить обновления: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Не удалось вызвать обновление: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Операционная система (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Магазин Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Поддержка Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap — универсальный формат пакетов для Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Система" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Системный компонент" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Удаление задания sysupdate '%s' не удалось со статусом %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Хороший способ управления программным обеспечением в вашей системе." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Введите число от 1 до %u: " + +# Приложению требуется … +#~ msgid "Choose an app:" +#~ msgstr "Выберите приложение:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "Приложение %s установлено" + +# Приложению требуется … +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Приложение было удалено" +#~ msgstr[1] "Приложения было удалено" +#~ msgstr[2] "Приложений было удалено" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Не удалось найти «%s»" + +#~ msgid "Moderate page" +#~ msgstr "Страница модерирования" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Нет отзывов для модерирования" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Был ли этот отзыв полезен для вас?" + +#~ msgid "Yes" +#~ msgstr "Да" + +#~ msgid "No" +#~ msgstr "Нет" + +#~ msgid "Meh" +#~ msgstr "Незначительно" + +#~ msgid "Outdated SDK version" +#~ msgstr "Устаревшая версия SDK" + +#~ msgid "Unable to install updates" +#~ msgstr "Не удалось установить обновления" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Не удалось удалить: ошибка аутентификации" + +#~ msgid "Network Settings" +#~ msgstr "Настройки сети" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Обновления операционной системы недоступны" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Не удалось установить важное обновление операционной системы." + +#~ msgid "No Network" +#~ msgstr "Нет сети" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Для проверки обновлений требуется подключение к Интернету." + +#~ msgid "Network _Settings" +#~ msgstr "_Настройки сети" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Обновления ПО были загружены и готовы к установке." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Обновления ПО были загружены и готовы к установке." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Загрузка сведений об обновлениях…" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Загрузка каталога приложений" + +#, c-format +#~ msgid "%s %s %s" +#~ msgstr "%s %s %s" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Важное обновление ПО готово к установке." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Важно: критичные обновления ПО ожидают применения." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Пожалуйста, загрузите ожидающие обновления ПО." + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Что вам понравилось в этом приложении? Если вы оставите свой отзыв с " +#~ "указанием причин, по которым вы оставляете отзыв, это будет полезно для " +#~ "других." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Автоматические обновления приоставлены" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Текущая сеть является тарифицированной, поэтому в ней могут быть " +#~ "установлены лимиты данных или взиматься плата. Для экономии данных " +#~ "автоматическое обновление приостановлено.\n" +#~ "\n" +#~ "Если сеть была неправильно определена как тарифицированная, это можно " +#~ "изменить в Настройках." + +#~ msgid "Open Network _Settings" +#~ msgstr "Открыть _настройки сети" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Тарифицированная сеть ‒ автоматические обновления приостановлены" + +#~ msgid "Find Out _More" +#~ msgstr "Узнать _больше" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "Не удалось загрузить обновления: требуется подключение к Интернету" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Не удалось загрузить обновления: недостаточно места на диске" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Не удалось загрузить обновления: требуется аутентификация" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Не удалось загрузить обновления: ошибка аутентификации" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "Не удалось установить %s: недостаточно прав для установки ПО" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Не удалось установить %s: низкий уровень заряда батареи" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Не удалось установить обновления: недостаточно места на диске" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Не удалось установить обновления: аутентификация обязательна" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Не удалось установить обновления: ошибка аутентификации" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "Не удалось обновить %s: недостаточно прав для обновления ПО" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Не удалось установить обновления: недостаточно прав для обновления ПО" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Не удалось установить обновления: требуется подключение к электросети" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Не удалось обновить %s: низкий уровень заряда батареи" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Не удалось установить обновления: низкий уровень заряда батареи" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Не удалось обновиться на %s: необходимо подключение к Интернету, но оно " +#~ "недоступно" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Не удалось обновить до %s: недостаточно прав для обновления" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Не удалось обновить до %s: низкий уровень заряда батареи" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Не удалось удалить %s: требуется аутентификация" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Не удалось удалить %s: ошибка аутентификации" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Не удалось удалить %s: недостаточно прав для удаления ПО" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Не удалось удалить %s: требуется подключение к электросети" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Не удалось удалить %s: низкий уровень заряда батареи" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Не удалось удалить %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Сбой при установке файла: не поддерживается" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Сбой при установке: не поддерживается" + +#~ msgid "AC power is required" +#~ msgstr "Требуется подключение к электросети" + +#~ msgid "Explore Pages" +#~ msgstr "Страница обзора" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Чтобы избежать денежных расходов и ограничения сети, обновления " +#~ "программного обеспечения не загружаются автоматически на мобильных или " +#~ "тарифицируемых соединениях." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Загружать и устанавливать обновления программного обеспечения в фоновом " +#~ "режиме, когда это возможно" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Показывать только _свободные приложения" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Показывать только приложения со свободной лицензией и скрыть все " +#~ "проприетарные приложения" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Загрузка описания обновления, пожалуйста, подождите…" + +#~ msgid "Downloading featured images…" +#~ msgstr "Загрузка изображений рекомендуемых приложений…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Показать подробную отладочную информацию" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Может получить доступ к произвольным файлам" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Уверены, что хотите удалить %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "Приложение %s будет удалено, для повторного использования приложения " +#~ "потребуется его установка." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Время, когда система была подключена и получила обновления в последний раз" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Выбранные дополнения будут установлены вместе с приложением." + +#~ msgid "Post Review" +#~ msgstr "Разместить отзыв" + +#~ msgid "_Post" +#~ msgstr "_Разместить" + +#~ msgid "No screenshot provided" +#~ msgstr "Снимок экрана не предоставлен" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Это программное обеспечение недоступно на вашем языке и будет " +#~ "отображаться на английском языке." + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Обновления" + +#~ msgid "Refresh" +#~ msgstr "Обновить" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s больше не поддерживается." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "" +#~ "Это означает, что система больше не будет получать обновления " +#~ "безопасности." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Рекомендуется выполнить обновление до более новой версии." + +# Приложению требуется … - Неактуально по английскому тексту +#~ msgid "Applications" +#~ msgstr "Приложения" + +# Приложению требуется … - Неактуально по английскому тексту +#~ msgid "Web Applications" +#~ msgstr "Веб-приложения" + +#~ msgid "Rating" +#~ msgstr "Рейтинг" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Напишите краткое описание отзыва, например: «Замечательное приложение, " +#~ "рекомендую»." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Отзыв" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Что вы думаете о приложении? Постарайтесь аргументировать ваше мнение." + +#~ msgid "Primary Menu" +#~ msgstr "Главное меню" + +#~ msgid "Application Updates" +#~ msgstr "Обновления приложения" + +#~ msgid "_Continue" +#~ msgstr "_Продолжить" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "GNOME Web" +#~ msgstr "Веб-браузер GNOME" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Обновления не были установлены на этой системе." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Менеджер приложений для GNOME" + +#~ msgid "Name" +#~ msgstr "Название" + +#~ msgid "user" +#~ msgstr "пользователь" + +#~ msgid "Channel" +#~ msgstr "Канал" + +#~ msgid "Branch" +#~ msgstr "Ветка" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Установка" + +#~ msgid "Version" +#~ msgstr "Версия" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Загрузка списка приложений" + +#~ msgid "Access arbitrary files" +#~ msgstr "Доступ к произвольным файлам" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Может получить доступ к произвольным файлам в файловой системе" + +#~ msgid "A list of popular applications" +#~ msgstr "Список популярных приложений" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "Список используемых приложений, переопределяющих системные." + +#~ msgid "Checking…" +#~ msgstr "Проверка…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Загружаю…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Загрузка рейтинга приложений…" diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..862ec10 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,8600 @@ +# Slovak translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Dušan Kazik , 2013, 2015. +# Matej Mrenica , 2021. +# Jose Riha , 2024. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-09-13 18:56+0000\n" +"PO-Revision-Date: 2024-09-14 15:53+0200\n" +"Last-Translator: Jose Riha \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" +"X-Generator: Poedit 3.4.2\n" +"X-DL-Team: sk\n" +"X-DL-Module: gnome-software\n" +"X-DL-Branch: master\n" +"X-DL-Domain: po\n" +"X-DL-State: Translating\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Softvér" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Inštalujte a inovujte aplikácie" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Aplikácia Softvér umožňuje vyhľadávať a inštalovať nové aplikácie a " +"systémové rozšírenia a odstraňovať aktuálne nainštalované aplikácie." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Aplikácia Softvér vám predstaví základné a obľúbené aplikácie vďaka " +"zrozumiteľnému popisu a niekoľkým snímkam obrazovky. Aplikácie môžete nájsť " +"buď manuálnym listovaním kategórií alebo pomocou vyhľadávania. Takisto vám " +"umožňuje aktualizovať váš systém aj bez pripojenia k sieti." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panel s prehľadom" + +# GtkLabel +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panel s podrobnosťami o softvéri" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panel s nainštalovaným softvérom" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel s aktualizáciami" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Podrobnosti o aktualizácii" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2625 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Projekt GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Otestovať kľúč akmod v UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Na otestovanie kľúča akmod v UEFI Shim je potrebné overenie totožnosti" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Zapísať kľúč akmod do UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Na zapísanie kľúča akmod do UEFI Shim je potrebné overenie totožnosti" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Otestovať kľúč DKMS v UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Na otestovanie kľúča DKMS v UEFI Shim je potrebné overenie totožnosti" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Zapísať kľúč DKMS do UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Na zapísanie kľúča DKMS do UEFI Shim je potrebné overenie totožnosti" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Inštalovať súbor appstream do systémového umiestnenia" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Inštalovanie súboru appstream do systémového umiestnenia" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Zoznam kompatibilných projektov" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Toto je zoznam kompatibilných projektov, ktoré by sa mali zobraziť ako " +"GNOME, KDE a XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Či sa majú spravovať aktualizácie a inovácie v aplikácii Softvér prostredia " +"GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Ak je táto možnosť vypnutá, softvér GNOME skryje panel s aktualizáciami, " +"nevykoná žiadne akcie automatických aktualizácií ani nevyzve na ich " +"aktualizáciu." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Automaticky prevziať a inštalovať aktualizácie" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Ak je táto voľba povolená, aplikácia Softvér prostredia GNOME bude " +"automaticky preberať aktualizácie softvéru na pozadí a nainštaluje tie, " +"ktoré nevyžadujú reštart." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Informovať používateľa o softvéri aktualizovanom na pozadí" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Ak je táto možnosť povolená, softvér GNOME upozorní používateľa na " +"aktualizácie, ktoré prebehli počas doby, kedy nebol aktívny." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Či sa majú automaticky aktualizovať informácie na meranom pripojení" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Ak je táto možnosť povolená, softvér GNOME bude na pozadí automaticky " +"aktualizovať informácie aj pri použití meraného pripojenia (prípadne " +"sťahovať metadáta, kontrolovať aktualizácie atď., čo môže používateľovi " +"spôsobiť náklady)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Či sa jedná o úplné prvé spustenie aplikácie Softvér prostredia GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Zobraziť hodnotenia reprezentované hviezdičkami pri aplikáciách" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtrovať aplikácie podľa predvolenej vetvy nastavenej pre vzdialené úložisko" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Pred inštaláciou neslobodných aplikácií zobrazovať varovné dialógové okno" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Pri inštalácii neslobodných aplikácií sa môže zobraziť dialógové okno s " +"upozornením. Táto voľba ovláda potlačenie tohto okna." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Dátum a čas poslednej kontroly aktualizácií" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Dátum a čas posledného upozornenia na inováciu" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Dátum a čas posledného upozornenia na aktualizáciu" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Dátum a čas prvej bezpečnostnej aktualizácie, odstráni sa po aktualizácii" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Dátum a čas poslednej aktualizácie" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Čas v sekundách, po uplynutí ktorého sa má overiť, či je snímka obrazovky z " +"hlavného zdroja stále platná" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Výber väčšej hodnoty bude znamenať menej návštev vzdialeného servera, ale " +"môže trvať dlhšie, než sa používateľovi zobrazí aktuálnejšia snímka. Hodnota " +"0 znamená, že sa kontrola na serveri nemajú robiť, ak je už snímka v pamäti " +"cache." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Server, ktorý sa použije pre recenzie aplikácií" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Minimálne body karmy pre recenzie" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Recenzie s karmou nižšou ako toto číslo nebudú zobrazené." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "" +"Zoznam oficiálnych repozitárov, ktoré by nemali byť považované za repozitáre " +"tretích strán" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Zoznam vyžadovaných repozitárov, ktoré nie je možné zakázať alebo odobrať" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Zoznam oficiálnych repozitárov, ktoré by mali byť považované za slobodný " +"softvér" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Adresa URL licencie, ktorá sa použije, keď je softvér považovaný za slobodný" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Kde je to možné, inštalovať sady aplikácií pre všetkých používateľov v " +"systéme" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Umožniť prístup k dialógovému oknu softvérových repozitárov" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Ponúknuť inováciu na predčasné vydania" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Zobraziť v rozhraní prkvy, ktoré informujú používateľa o tom, že aplikácia " +"nie je slobodná" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Zobrazovať veľkosť inštalácie pre aplikácie v zozname nainštalovaných " +"aplikácií" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://sk.wikipedia.org/wiki/Propriet%C3%A1rny_softv%C3%A9r'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Adresa URI, ktorá objasňuje neslobodný a uzavretý softvér" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Zoznam adries URL smerujúcich na súbory appstream, ktoré boli stiahnuté do " +"priečinka s swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Inštalovať súbory AppStream do systémového umiestnenia pre všetkých " +"používateľov. Ak je táto voľba vypnutá, súbory sa nainštalujú do " +"neštandardného priečinka $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Prioritné poradie formátov balíčkov, ktorým dávate prednosť, pričom " +"najdôležitejšie formátu sú uvedené ako prvé. Prázdne pole znamená predvolené " +"poradie. Predpokladá sa, že vynechané formátu budú uvedené ako posledné. " +"Príklady formátov balíčkov: deb, flatpak, rpm, snap. Formáty môžete " +"voliteľne uviesť s meno pôvodu oddeleného dvojbodkou, napríklad „flatpak:" +"flathub“." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Dátum a čas posledného pokusu o odobranie nepoužívaných runtime prostredí " +"Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Nastavte na „true“, ak chcete zobraziť iba aplikácie s otvorenou licenciou a " +"skryť všetky neslobodné aplikácie." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Nastavte na „true“, ak chcete zobraziť iba aplikácie od vývojárov, ktorých " +"identita bola overená." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Dátum a čas naposledy prijatých historických aktualizácií." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Reťazec obsahujúci ID účtu gnome-online používaný na prihlásenie" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Software AppStream systémový inštalátor" + +# title +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Zlyhalo analyzovanie parametrov príkazového riadka" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Musíte zadať presne jeden názov súboru" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Tento program môže použiť iba správca (root)" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Zlyhalo overenie typu obsahu: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Chyba pri presune: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Inštalácia softvéru" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Nainštaluje vybraný softvér do systému" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Kreslené násilie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Bez informácií o kreslenom násilí" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Násilie vo fantasy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Bez informácií o násilí vo fantasy" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistické násilie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Bez informácií o realistickom nasilí" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Násilie zobrazujúce krvácanie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Bez informácií o krvácaní" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Sexuálne násilie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Bez informácií o sexuálnom násilí" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Bez informácií o odkazoch na alkohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotiká" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Bez informácií o odkazoch na drogy" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tabak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Bez informácií o odkazoch na tabakové produkty" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nahota" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Bez informácií o nahote akéhokoľvek druhu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Sexuálna tématika" + +# cmdline description +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Bez informácií o odkazoch na alebo vyobrazeniach sexuálnej tématiky" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Vulgarizmy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Bez informácií o vulgaritách akéhokoľvek druhu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Neprimeraný humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Bez informácií o neprimeranom humore" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminácia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Bez informácií o diskriminačných prejavoch akékohoľvek druhu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklamy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Bez informácií o reklamách akéhokoľvek druhu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Hazard" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Bez informácií o hazarde akéhokoľvek druhu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Nakupovanie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Bez informácií o možnosti míňať peniaze" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Konverzácia medzi používateľmi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Bez informácií o spôsoboch konverzácie medzi používateľmi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Hlasová konverzácia medzi používateľmi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Bez informácií o spôsoboch hlasovej komunikácie medzi používateľmi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontaktné údaje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Bez informácií o zdieľaní mien používateľov na sociálnych sieťach alebo e-" +"mailových adries" + +# DK:cmd desc +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identifikačné údaje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Bez informácií o zdieľaní údajov o používateľoch s tretími stranami" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Zdieľanie polohy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Bez informácií o zdieľaní fyzickej polohy s ostatnými používateľmi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualita" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Bez informácií o odkazoch na homosexualitu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitúcia" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Bez informácií o odkazoch na prostitúciu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Cudzoložstvo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Bez informácií o odkazoch na cudzoložstvo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Sexualizované postavy" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Bez informácií o sexualizovaných postavách" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Znesvätenie" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Bez informácií o odkazoch na znesvätenie" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Ľudské ostatky" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Bez informácií o viditeľných ostatkoch mŕtvych ľudí" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Otroctvo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Bez informácií o odkazoch na otroctvo" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Neobsahuje odkazy na drogy" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Neobsahuje nadávky, vulgarity ani iné hrubé výrazy" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Neobsahuje reklamy ani peňažné operácie" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Neobsahuje sex ani nahotu" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Neobsahuje funkciu neusmerňovanej konverzácie" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Neobsahuje násilie" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Drogy" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Hrubé výrazy" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Peniaze" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sociálne siete" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Násilie" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +# GtkToggleButton +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Všetci" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "Aplikácia %s má neznáme vekové hodnotenie" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "Aplikácia %s je vhodná pre každého" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "Aplikácia %s je vhodná pre batoľatá" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "Aplikácia %s je vhodná pre malé deti" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "Aplikácia %s je vhodná pre deti" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "Aplikácia %s je vhodná pre dospievajúcu mládež" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "Aplikácia %s je vhodná pre dospelých" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "Aplikácia %s je vhodná pre %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Vhodné od veku" + +# DK:cmd desc +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:126 +msgid "_How to contribute missing information" +msgstr "_Ako pridať chýbajúce informácie" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "Miestny súbor" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "Balíček" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Čaká na spracovanie" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:407 +msgid "Pending install" +msgstr "Čaká na inštaláciu" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:414 +msgid "Pending remove" +msgstr "Čaká na odobranie" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:395 +msgid "Installing" +msgstr "Inštaluje sa" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Odoberá sa" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:400 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Preberá sa" + +# GtkButton +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:307 src/gs-details-page.c:1060 +#: src/gs-details-page.c:1095 src/gs-details-page.ui:243 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Inštalovať" + +# GtkButton +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1180 +msgid "_Uninstall…" +msgstr "_Odinštalovať…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Sieť" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Môže komunikovať prostredníctvom siete" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Systémové služby" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Môže pristupovať k službám zbernice D-Bus na systémovej zbernici" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Služby relácie" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Môže pristupovať k službám zbernice D-Bus na zbernici relácie" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Zariadenia" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Môže pristupovať k ľubovoľným zariadeniam ako napríklad kamery" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Môže pristupovať ku vstupným zariadeniam" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Môže pristupovať k mikrofónom" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Môže pristupovať k súborom systémových zariadení" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Obsah obrazovky" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Môže pristupovať k obsahu obrazovky" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Domovský priečinok" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Môže zobrazovať, upravovať a vytvárať súbory" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Môže zobrazovať súbory" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Súborový systém" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Priečinok Stiahnuté" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Nastavenia" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Môže zobrazovať a meniť akékoľvek nastavenia" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Zastaraný zobrazovací systém" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Používa starý a nezabezpečený zobrazovací systém" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Opustenie izolovaného prostredia (sandboxu)" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" +"Môže uniknúť z izolovaného prostredia a obísť akékoľvek ďalšie obmedzenia" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Nie je k dispozícii žiaden popis aktualizácie." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Podrobnosti o aktualizácii" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Vyžaduje dodatočné oprávnenia" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Recenzie" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "Pre túto aplikáciu neboli nájdené žiadne recenzie." + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "Žiadne recenzie" + +# GtkLabel +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "História verzií" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novinky vo verzii %s" + +# GtkLabel +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Verzia %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Pre toto vydanie nie sú k dispozícii žiadne podrobnosti" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e. %B %Y" + +# cmdline description +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Režim spustenia: buď „updates“ (aktualizácie), „updated“ (aktualizované), " +"„installed“ (nainštalované) alebo „overview“ (prehľad)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "REŽIM" + +# cmdline description +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Vyhľadá aplikácie" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "HĽADANIE" + +# cmdline description +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Zobrazí podrobnosti o aplikácii (použitím identifikátora aplikácie)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "IDENTIFIKÁTOR" + +# cmdline description +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Zobrazí podrobnosti o aplikácii (použitím názvu balíčka)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NÁZOV_BALÍČKA" + +# cmdline description +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Nainštaluje aplikáciu (použitím identifikátora aplikácie)" + +# cmdline description +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Odinštaluje aplikáciu (použitím identifikátora aplikácie)" + +# DK:cmd desc +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Otvorí miestny súbor s balíčkom" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NÁZOV_SÚBORU" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Očakávaný typ interakcie pre túto akciu: buď „none“ (žiadna), „notify“ " +"(upozorniť) alebo „full“ (úplná)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKCIA" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Zobrazí miestny súbor metainfo alebo appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Povolí podrobný ladiaci výstup (z bežiacej inštancie, ak je už spustená)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Nainštaluje akékoľvek čakajúce aktualizácie na pozadí" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Zobrazí predvoľby" + +# cmd line desc +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Ukončí spustenú inštanciu" + +# DK:cmd desc +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Uprednostní miestne zdroje súborov pred AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Zobrazí číslo verzie" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Autorské práva © 2016–2023 prispievatelia Softvéru GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Dušan Kazik \n" +"Jose Riha " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "" +"Je nám ľúto, ale pre túto aplikáciu nie sú k dispozícii žiadne podrobnosti." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Veľkosť po nainštalovaní" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Obsahuje %s dát a %s medzipamäte" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Obsahuje %s dát" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Obsahuje %s medzipamäte" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Využitie medzipamäte a dát nie je známe" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Veľkosť preberania" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Nepotrebuje prebrať žiadne ďalšie systémové súbory" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Potrebuje prebrať ďalšie systémové súbory neznámej veľkosti" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Potrebuje prebrať %s ďalších systémových súborov" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Veľkosť nie je známa" + +# GtkLabel +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Žiadne oprávnenia" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Má prístup k sieti" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Využíva služby systému" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Využíva služby sedenia" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Môže pristupovať k hardvérovým zariadeniam" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Môže pristupovať k systémovým zariadeniam" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Môže čítať/zapisovať všetky vaše dáta" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Môže čítať všetky vaše dáta" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Môže čítať/zapisovať z/do priečinka Stiahnuté" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Móže čítať z priečinka Stiahnuté" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Môže pristupovať k niektorým konkrétnym súborom" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Môže zobrazovať a meniť nastavenia používateľa" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Používa starý zobrazovací systém" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Môže získať ľubovoľné oprávnenia" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Softvérový repozitár je overený" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Skontrolované distribútorom OS" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Skontrolované %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Poskytované treťou stranou" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Softvér už viac nie je podporovaný" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Auditovateľný kód" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Neznáma licencia" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Uzavretý kód" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Zvláštna licencia" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Zvýhodnené" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Bezpečné" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Pravdepodobne bezpečné" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potenciálne nebezpečné" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Nebezpečné" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Iba pre mobilné zariadenia" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Funguje iba na malej obrazovke" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Iba pre PC" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Funguje iba na veľkej obrazovke" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Veľkosť obrazovky nesúhlasí" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Nepodporuje vašu súčasnú veľkosť obrazovky" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Vyžaduje dotykovú obrazovku" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Vyžaduje klávesnicu" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Vyžaduje myš" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Vyžaduje herný ovládač" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Na hranie vyžaduje herný ovládač" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Adaptívne" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Funguje na telefónoch, tabletoch a PC" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Pravdepodobne vyžaduje klávesnicu alebo myš" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Funguje na PC a laptopoch" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Neobsahuje žiadny vekovo nevhodný obsah" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Informácie o vekovej kategórii nie sú k dispozícii" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Navštíviť webovú stránku" + +# GtkButton +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Inštalovať…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Zrušiť" + +# GtkButton +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Inštalovať" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Prevziať" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Aktualizovať" + +# GtkButton +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Odinštalovať…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Odstraňuje sa" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 +#: src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "Kritická aktualizácia" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Zariadenie nie je možné počas aktualizácie používať." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Zdroj: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "Premenované z %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +msgid "Stopped Receiving Updates" +msgstr "Príjem aktualizácií bol pozastavený" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Kritická aktualizácia" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Nainštalované" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Pomôžte s prekladom %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"Aplikácia %s je navrhnutá, vyvinutá a preložená medzinárodnou komunitou " +"prispievateľov.\n" +"\n" +"To znamená, že aj keď ešte nie je k dispozícii vo vašom jazyku, môžete sa " +"zapojiť a pomôcť s jej prekladom." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Preklady" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Stránka prekladu" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Prihlásenie vyžaduje vzdialené %s (sféra %s)" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "Vyžaduje sa prihlásenie" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:300 src/gs-common.c:752 +#: src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-page.c:708 +#: src/gs-removal-dialog.ui:24 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:251 src/gs-review-dialog.ui:24 src/gs-review-row.c:239 +#: src/gs-review-row.c:263 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "_Zrušiť" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "_Prihlásenie" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Používateľ" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "Heslo" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Ostatné" + +# GtkToggleButton +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Všetko" + +# GtkLabel +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Softvér základnej výbavy" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Výber distribúcie" + +# GtkLabel +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nové a aktualizované" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Výber z webu" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Ďalší softvér" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s nainštalované" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Aby sa zmeny prejavili, je potrebné reštartovať" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Aplikácia je pripravená na používanie" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Systémové aktualizácie boli nainštalované" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Nedávno nainštalované aktualizácie sú dostupné na kontrolu" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:915 +msgid "Restart" +msgstr "Reštartovať" + +# DK: akcia po nainstalovani softveru +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Spustiť" + +#. TRANSLATORS: window title +#: src/gs-common.c:234 +msgid "Install Software?" +msgstr "Nainštalovať softvér?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Install Third-Party Software?" +msgstr "Inštalovať softvér tretej strany?" + +#. TRANSLATORS: window title +#: src/gs-common.c:240 +msgid "Enable Software Repository?" +msgstr "Povoliť softvérový repozitár?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:242 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Povoliť softvérový repozitár tretej strany?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:254 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s nie je slobodný softvér s otvoreným zdrojom a " +"poskytuje ho „%s“." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:264 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s poskytuje „%s“." + +#: src/gs-common.c:273 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Pre pokračovanie v inštalácii musíte povoliť tento softvérový repozitár." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:283 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Inštalácia alebo používanie softvéru %s môže byť v niektorých krajinách " +"nelegálne." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:289 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Inštalácia alebo používanie tohto kodeku môže byť v niektorých krajinách " +"nelegálne." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:303 +msgid "Don’t _Warn Again" +msgstr "_Vypnúť ďalšie upozornenia" + +#. TRANSLATORS: button text +#: src/gs-common.c:312 +msgid "Enable and _Install" +msgstr "_Povoliť a inštalovať" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:519 +msgid "Detailed errors from the package manager follow:" +msgstr "Nižšie sú uvedené podrobné chybové správy správcu balíčkov:" + +# GtkLabel +#: src/gs-common.c:526 src/gs-common.c:663 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Podrobnosti" + +#. TRANSLATORS: button text +#: src/gs-common.c:575 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Zavrieť" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:744 +msgid "_Accept" +msgstr "_Prijať" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:890 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Aktualizácie boli nainštalované" +msgstr[1] "Aktualizácia bola nainštalovaná" +msgstr[2] "Aktualizácie boli nainštalované" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:900 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Aplikácie boli nainštalované" +msgstr[1] "Aplikácia bola nainštalovaná" +msgstr[2] "Aplikácie boli nainštalované" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:906 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Na uplatnenie zmien v aplikáciach je potrebný reštart" +msgstr[1] "Na uplatnenie zmien v aplikácii je potrebný reštart." +msgstr[2] "Na uplatnenie zmien v aplikáciach je potrebný reštart." + +#. TRANSLATORS: button text +#: src/gs-common.c:913 +msgid "Not Now" +msgstr "Teraz nie" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1009 +msgid "Just now" +msgstr "Práve teraz" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "pred %d minútami" +msgstr[1] "pred %d minútou" +msgstr[2] "pred %d minútami" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "pred %d hodinami" +msgstr[1] "pred %d hodinou" +msgstr[2] "pred %d hodinami" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Pred %d dňami" +msgstr[1] "Pred %d dňom" +msgstr[2] "Pred %d dňami" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Pred %d týždňami" +msgstr[1] "Pred %d týždňom" +msgstr[2] "Pred %d týždňami" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "pred %d mesiacmi" +msgstr[1] "pred %d mesiacom" +msgstr[2] "pred %d mesiacmi" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "pred %d rokmi" +msgstr[1] "pred %d rokom" +msgstr[2] "pred %d rokmi" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1394 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +# GtkToggleButton +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Všetko" + +# GtkLabel +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Softvér základnej výbavy" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D grafika" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografia" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skenovanie" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorová grafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Prehliadače" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Tvorba a úprava zvuku" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Prehrávače hudby" + +# GtkToggleButton +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Všetko" + +# GtkLabel +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Softvér základnej výbavy" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendár" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Databáza" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Financie" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Textový procesor" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Textové editory" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Webové prehliadače" + +# GtkToggleButton +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Všetko" + +# GtkLabel +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Softvér základnej výbavy" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Akčné" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Adventúry" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkádové" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokové" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Stolové" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kartové" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulátory" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Detské" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logické" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Na hrdinov" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Šport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategické" + +# GtkToggleButton +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Všetko" + +# GtkLabel +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Softvér základnej výbavy" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Rozhovor" + +# GtkToggleButton +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Všetko" + +# GtkLabel +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Softvér základnej výbavy" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Umelá inteligencia" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronómia" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Chémia" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Jazyky" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Novinky" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Umenie" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Životopisy" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komiksy" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Beletria" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Zdravie" + +# GtkDialog title +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "História" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Životný štýl" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Športy" + +# GtkToggleButton +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Všetko" + +# GtkLabel +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Softvér základnej výbavy" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Nástroje na ladenie" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Integrované vývojové prostredia (IDE)" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeky" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Ovládače hardvéru" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Písma" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Zdroje vstupu" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Jazykové balíčky" + +# cmdline description +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalizácia" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Tvorba" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Práca" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Prehrávanie" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Socializácia" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Učenie" + +# GtkLabel +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Vývoj" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodeky" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Ovládače hardvéru" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Písma" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Zdroje vstupu" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Jazykové balíčky" + +# cmdline description +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalizácia" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Aplikácia" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s požaduje dodatočnú podporu formátu súborov." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Požadujú sa dodatočné typy MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s požaduje dodatočné písma." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Požadujú sa dodatočné písma" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s požaduje dodatočné multimediálne kodeky." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Požadujú sa dodatočné multimediálne kodeky" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s požaduje dodatočné ovládače tlačiarne." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Požadujú sa dodatočné ovládače tlačiarne" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s požaduje dodatočné balíčky." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Požadujú sa dodatočné balíčky" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Nájsť v aplikácii Softvér" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "Zo_braziť viac" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Zobraziť _menej" + +#: src/gs-details-page.c:390 +msgid "Removing…" +msgstr "Odstraňuje sa…" + +#: src/gs-details-page.c:405 +msgid "Requires restart to finish install" +msgstr "Vyžaduje reštart na dokončenie inštalácie" + +#: src/gs-details-page.c:412 +msgid "Requires restart to finish remove" +msgstr "Vyžaduje reštart na dokončenie odstraňovania" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:428 +msgid "Pending installation…" +msgstr "Čakajúca inštalácia…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:434 +msgid "Pending update…" +msgstr "Čakajúca aktualizácia…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:449 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Preberá sa…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:452 +msgid "Preparing…" +msgstr "Pripravuje sa…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:455 +msgid "Uninstalling…" +msgstr "Odstraňuje sa…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:582 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "" +"Aplikácia %s nie je nainštalovaná, ale jej údaje sú stále k dispozícii." + +#: src/gs-details-page.c:1077 src/gs-toast.c:65 +msgid "_Restart" +msgstr "R_eštartovať" + +#: src/gs-details-page.c:1083 +msgid "_Enable…" +msgstr "_Povoliť…" + +# GtkButton +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1109 +msgid "_Install…" +msgstr "_Inštalovať…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1325 +#, c-format +msgid "%s will appear in US English" +msgstr "Aplikácia %s bude používať americkú angličtinu" + +#: src/gs-details-page.c:1333 +msgid "This app will appear in US English" +msgstr "Táto aplikácia bude používať americkú angličtinu" + +#: src/gs-details-page.c:1335 +msgid "This software will appear in US English" +msgstr "Tento softvér bude používať americkú angličtinu" + +#: src/gs-details-page.c:1370 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "_Pomoc s prekladom" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1435 +#, c-format +msgid "Other Apps by %s" +msgstr "Iné aplikácie od %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1471 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Vývojár %s preukázal vlastníctvo %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1474 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Vývojár preukázal vlastníctvo %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1837 +msgid "You need internet access to write a review" +msgstr "Aby ste mohli napísať recenziu, musíte byť pripojený k internetu" + +#: src/gs-details-page.c:1938 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Táto aplikácia už nedostáva aktualizácie, vrátane opráv zabezpečenia" + +#: src/gs-details-page.c:1939 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Túto aplikáciu už poskytuje vaša distribúcia a nemali by ste ju nahradzovať." + +#: src/gs-details-page.c:1940 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Táto aplikácia neposkytuje žiadne odkazy na webové stránky, repozitáre s " +"kódom ani nástroj na hlásenie a sledovanie chýb." + +#: src/gs-details-page.c:1942 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Tento softvér už nedostáva aktualizácie, vrátane opráv zabezpečenia" + +#: src/gs-details-page.c:1943 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Tento softvér už poskytuje vaša distribúcia a nemali by ste ho nahradzovať." + +#: src/gs-details-page.c:1944 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Tento softvér neposkytuje žiadne odkazy na webové stránky, repozitáre s " +"kódom ani nástroj na hlásenie a sledovanie chýb." + +#: src/gs-details-page.c:2034 src/gs-details-page.c:2051 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Aplikácii Sotvér sa nepodarilo získať informácie o „%s“ a nemôže zobraziť " +"podrobonosti o tejto aplikácii." + +#: src/gs-details-page.c:2406 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Nepodarilo sa odoslať recenziu „%s“: %s" + +# GtkLabel +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Stránka s podrobnosťami" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Načítavajú sa podrobnosti o aplikácii" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Overené" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Otvoriť" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Aktualizovať" + +# GtkButton +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Odinštalovať" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "Doplnky" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Túto aplikáciu je možné používať iba pri aktívnom internetovom pripojení." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "Obsahuje softvérový repozitár" + +#: src/gs-details-page.ui:679 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Súčasťou tejto aplikácie je repozitár so softvérom, ktorý poskytuje " +"aktualizácie a prístup k ďalšiemu softvéru." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Neobsahuje softvérový repozitár" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"V tejto aplikácii nie je zahrnutý repozitár so softvérom. Preto nebude " +"priebežne aktualizovaná na novšie verzie." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "Softvérový repozitár bol rozpoznaný" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Pridaním tohto softvérového repozitára získate prístup k dodatočnému " +"softvéru a aktualizáciám." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Používajte iba tie softvérové repozitáre, ktorým dôverujete." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Vymazať údaje aplikácie" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "O_dstrániť údaje" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Žiadne metadáta" + +# GtkButton +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "_Webová stránka projektu" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "_Prispieť" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "P_rispieť k prekladu" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "_Nahlásiť chybu" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "_Pomocník" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontaktovať" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "Napí_sať recenziu" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Všetky recenzie" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "Nedajú sa zobraziť podrobnosti o aplikácií" + +# title +#: src/gs-dkms-dialog.c:67 +msgid "Failed to prepare reboot" +msgstr "Nepodarilo sa pripraviť na reštart" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "Neznáma chyba" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "Kľúč sa nenašiel" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "Kľúč nie je zapísaný" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Vyžaduje sa zapísanie kľúča MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "Ď_alej" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Toto zariadenie má zapnuté Bezpečné zavádzanie (Secure Boot). Pre povolenie " +"nových ovládačov je potrebné zapísať nový kľúč vlastníka počítača (MOK). V " +"neskoršej etape procesu je potrebné zadať heslo. Prosím, zapíšte si " +"nasledujúce heslo spojené s kľúčom:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "MOK _heslo som si zapísal(a)" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Reštartovať a zapísať…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Pokyny na nastavenie. Prosím, čítajte pozorne" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Po reštarte sa zobrazí okno s nastaveniami zariadenia. Pre povolenie nových " +"ovládačov pokračujte týmito krokmi:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Vyberte „Enroll MOK“ („Zapísať MOK“)\n" +"• Vyberte „Yes“ („Áno“), aby sa klúče zapísali\n" +"• Po zobrazení výzvy zadajte heslo MOK\n" +"• Následne vyberte „Reboot“ („Reštartovať“)" + +# cmdline description +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Dôsledky pre bezpečnosť" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Po úspešnom zapísaní kľúča majte napamäti, že všetky ďalšie aktualizácie " +"tohto alebo ľubovoľného iného modulu budú implicitne brané ako dôveryhodné. " +"Všetky budúce aktualizácie budú prebiehať transparentne bez interakcie alebo " +"overenia totožnosti." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Ďalšie pokyny nájdete na stránke s dokumentáciou." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Preberajú sa dodatočné súbory s metadátami…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " a " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Dostupné fonty pre písma %s" +msgstr[1] "Dostupné fonty pre písmo %s" +msgstr[2] "Dostupné fonty pre písma %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Dostupný softvér pre kodeky %s" +msgstr[1] "Dostupný softvér pre kodek %s" +msgstr[2] "Dostupný softvér pre kodeky %s" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Požadovaný softvér sa nenašiel" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Nepodarilo sa nájsť požadovaný softvér" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "Kodek %s sa nenašiel" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "na webovej stránke" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Nie sú dostupné žiadne aplikácie, ktoré by poskytovali súbor %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Informácie o kodeku %s, ako aj o možnostiach získania chýbajúcich aplikácií " +"môžete nájsť %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "Nie sú dostupné žiadne aplikácie s podporou pre %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "Doplnok %s nie je dostupný." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Informácie o kodeku %s, ako aj o možnostiach získania aplikácie s podporou " +"tohto formátu môžete nájsť %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Pre podporu písma %s nie sú k dispozícii žiadne fonty." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Informácie o písme %s, ako aj o možnostiach získania dodatočných písiem " +"môžete nájsť %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Nie sú dostupné žiadne doplnky s kodekmi pre formát %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Informácie o kodeku %s, ako aj o možnostiach získania kodeku na prehranie " +"tohto formátu môžete nájsť %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Nie sú dostupné žiadne zdroje prostredia Plasma s podporou pre %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Informácie o kodeku %s, ako aj o možnostiach získania dodatočných zdrojov " +"prostredia Plasma môžete nájsť %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Nie sú dostupné žiadne ovládače tlačiarne pre %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Informácie o tlačiarni %s, ako aj o možnostiach získania ovládača s podporou " +"tejto tlačiarne môžete nájsť %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "dokumentácie" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Nepodarilo sa nájsť kodeky %s vyžadované aplikáciou %s. Pre ďalšie " +"informácie nazrite, prosím, do %s." +msgstr[1] "" +"Nepodarilo sa nájsť kodek %s vyžadovaný aplikáciou %s. Pre ďalšie informácie " +"nazrite, prosím, do %s." +msgstr[2] "" +"Nepodarilo sa nájsť kodeky %s vyžadované aplikáciou %s. Pre ďalšie " +"informácie nazrite, prosím, do %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Nepodarilo sa nájsť kodeky %s, ktoré hľadáte. Pre ďalšie informácie nazrite, " +"prosím, do %s." +msgstr[1] "" +"Nepodarilo sa nájsť kodek %s, ktorý hľadáte. Pre ďalšie informácie nazrite, " +"prosím, do %s." +msgstr[2] "" +"Nepodarilo sa nájsť kodeky %s, ktoré hľadáte. Pre ďalšie informácie nazrite, " +"prosím, do %s." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Zlyhalo získanie akýchkoľvek výsledkov hľadania: %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "formát súboru %s" + +# GtkButton +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "_Inštalovať všetko" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "Nepodarilo sa nájsť požadovaný softvér" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Stránka s kodekmi" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "Nenašli sa žiadne výsledky" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "Nie je možné vykonať hľadanie" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Predchádzajúca" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Ďalšia" + +# GtkLabel +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Zoznam aplikácií základnej výbavy" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Podpora pre PC" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Podporuje zobrazenie na veľkej obrazovke" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Neznáma podpora pre PC" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Nie je dostatok informácií o tom, či je podporované zobrazenie na veľkej " +"obrazovke" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Vyžaduje veľkú obrazovku" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Nepodporuje stolné počítače" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Nedá sa použiť na veľkej obrazovke" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Podpora pre mobilné zariadenia" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Podporuje zobrazenie na malej obrazovke" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Neznáma podpora pre mobilné zariadenia" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Nie je dostatok informácií o tom, či je podporované zobrazenie na malej " +"obrazovke" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Vyžaduje malú obrazovku" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Nepodporuje mobilné zariadenia" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Nedá sa použiť na malej obrazovke" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Podpora klávesnice" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Neznáma podpora klávesnice" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Nie je dostatok informácií o tom, či sú podporované klávesnice" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Vyžaduje klávesnicu" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Podporuje klávesnice" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Nepodporuje klávesnicu" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Nedá sa použiť s klávesnicou" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Podpora myši" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Vyžaduje myš alebo ukazovacie zariadenie" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Neznáma podpora myši" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Nie je dostatok informácií o tom, či sú podporované myši alebo ukazovacie " +"zariadenia" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Vyžaduje myš" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Podporuje myši a ukazovacie zariadenia" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Nepodporuje myš" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Nedá sa používať s myšou alebo ukazovacím zariadením" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Podpora pre dotykové obrazovky" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Neznáma podpora pre dotykové obrazovky" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Nie je dostatok informácií o tom, či sú podporované dotykové obrazovky" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Vyžaduje dotykovú obrazovku" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Podporuje dotykové obrazovky" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Nepodporuje dotykovú obrazovku" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Nedá sa použiť s dotykovou obrazovkou" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Vyžaduje herný ovládač" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Vyžaduje herný ovládač" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Podpora herného ovládača" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Podporuje herné ovládače" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "Aplikácia %s bude na tomto zariadení pravdepodobne fungovať" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "Aplikácia %s na tomto zariadení funguje" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "Aplikácia %s bude na tomto zariadení možno fungovať" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "Aplikácia %s na tomto zaradení nebude správne fungovať" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "Aplikácia %s nebude na tomto zariadení fungovať" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Podpora hardvéru" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigácia" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Prejsť na stránku Objavujte" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Prejsť na stránku Nainštalované" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Prejsť na stránku Aktualizácie" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Otvoriť panel s hľadaním" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Okná" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Otvoriť predvoľby" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Otvoriť softvérové repozitáre" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Pomocník" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Otvoriť klávesové skratky" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Nainštalované" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Stránka s nainštalovanými" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "Prebieha" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplikácia" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "Webové aplikácie" + +# cmdline description +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "Systémové aplikácie" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Vybudované komunitou" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Zapojte sa" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Táto aplikácia je vyvíjaná otvorene medzinárodnou komunitou a je šírená pod " +"licenciou %s.\n" +"\n" +"Môžete sa zúčastniť a pomôcť ju ďalej vylepšiť." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Táto aplikácia je vyvíjaná otvorene medzinárodnou komunitou a je šírená pod " +"licenciou %s.\n" +"Môžete sa zúčastniť a pomôcť ju ďalej vylepšiť." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tento softvér je vyvíjaný otvorene medzinárodnou komunitou a je šírený pod " +"licenciou %s.\n" +"\n" +"Môžete sa zúčastniť a pomôcť ho ďalej vylepšiť." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Tento softvér je vyvíjaný otvorene medzinárodnou komunitou a je šírený pod " +"licenciou %s.\n" +"Môžete sa zúčastniť a pomôcť ho ďalej vylepšiť." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Neznáma licencia" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Zistiť viac" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Táto aplikácia nešpecifikuje, pod akou licenciou je vyvíjaná a nemusí byť " +"slobodná. Môže obsahovať bezpečnostné problémy, ktoré sa ťažko odhaľujú a " +"môže sa meniť bez toho, aby ste o tom vedeli.\n" +"\n" +"Je možné, že do nej nebudete môcť prispievať." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tento softvér nešpecifikuje, pod akou licenciou je vyvíjaný a nemusí byť " +"slobodný. Môže obsahovať bezpečnostné problémy, ktoré sa ťažko odhaľujú a " +"môže sa meniť bez toho, aby ste o tom vedeli.\n" +"\n" +"Je možné, že do tohto softvéru nebudete môcť prispievať." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Uzatvorený sofvér" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Táto aplikácia nie je vyvíjaná otvorene, takže o jej fungovaní vedia iba jej " +"vývojári. Môže obsahovať bezpečnostné problémy, ktoré sa ťažko odhaľujú a " +"môže sa meniť be toho, aby ste o tom vedeli.\n" +"\n" +"Je možné, že do tejto aplikácie nebudete môcť prispievať." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Tento softvér nie je vyvíjaný otvorene, takže o jeho fungovaní vedia iba " +"jeho vývojári. Môže obsahovať bezpečnostné problémy, ktoré sa ťažko odhaľujú " +"a môže sa meniť be toho, aby ste o tom vedeli.\n" +"\n" +"Je možné, že do tohto softvéru nebudete môcť prispievať." + +# GtkLabel +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Zvláštna licencia" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Táto aplikácia je vyvíjaná pod zvláštnou licenciou %s.\n" +"\n" +"Môžete, no nemusíte byť schopní do nej prispievať." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Táto aplikácia je vyvíjaná pod zvláštnou licenciou „%s“.\n" +"\n" +"Môžete, no nemusíte byť schopní do nej prispievať." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tento softvér je vyvíjaný pod zvláštnou licenciou %s.\n" +"\n" +"Môžete, no nemusíte byť schopní do neho prispievať." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Tento softvér je vyvíjaný pod zvláštnou licenciou „%s“.\n" +"\n" +"Môžete, no nemusíte byť schopní do neho prispievať." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Obnovujú sa dáta" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Načítava sa stránka" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Spúšťa sa" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Neznámy zdroj" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Pridávanie" + +# GtkButton +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Odstraňovanie" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Aktualizácie" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Návrat na nižšiu verziu" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "vybraných externých zdrojov" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Poskytuje prístup k ďalšiemu softvéru z %s. Súčasťou je aj nejaký uzatvorený " +"softvér.\n" +"\n" +"Tieto repozitáre môžete neskôr povoliť v predvoľbách Softvérových " +"repozitárov." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Povoliť softvérové repozitáre tretích strán?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "_Ignorovať" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Povoliť" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "Dostupné pre váš operačný systém" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "Dostupné pre %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Objavujte" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Strana s prehľadom" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Dostupné aplikácie" + +# GtkLabel +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Ďalšie kategórie" + +# GtkLabel +# PM: čo sú údaje aplikácie? nemá tu byť údaje o aplikácií? +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nenašli sa žiadne údaje o aplikácii" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Neznáma" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Používateľ odmietol inštaláciu" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Príprava aplikácie %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Naozaj chcete odobrať repozitár %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Všetky aplikácie pochádzajúce z repozitára %s budú odinštalované. Aby ste " +"ich mohli opäť používať, budete musieť repozitár znova nainštalovať." + +# GtkButton +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 +#: src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "Odinštalovať %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Po odobraní nebude možné aplikáciu %s používať." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Po odobraní nebudete môcť používať žiadne aplikácie, ktoré závisia na %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Po odobraní nebudete môcť používať písmo %s a všetky dokumenty, v ktorých sa " +"nachádza, budú zobrazené iným písmom." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Po odobraní nebudete môcť používať kodek %s. To môže znamenať, že niektoré " +"multimediálne súbory nebudete môcť prehrať." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Po odobraní nemusí už viac správne fungovať hardvér, ktorý zavisí na %s." + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "Nastavenia aplikácie a údajov" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:667 +msgid "_Keep" +msgstr "_Ponechať" + +#: src/gs-page.c:673 +msgid "Allows restoring app settings and content" +msgstr "Umožňuje obnovenie nastavení a obsahu aplikácie" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:682 +msgid "_Delete" +msgstr "O_dstrániť" + +#: src/gs-page.c:688 +msgid "Permanently deletes data to save disk space" +msgstr "Trvalo odstráni údaje, aby sa šetrilo miesto na disku" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:696 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Po odobraní nebudete môcť aplikáciu %s naďalej používať. Údaje a nastavenia " +"aplikácie budú uložené na disku, aby bolo možné aplikáciu v budúcnosti " +"obnoviť." + +# GtkButton +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:710 +msgid "_Uninstall" +msgstr "O_dinštalovať" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Predvoľby" + +# title +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Aktualizácie softvéru" + +# DK:cmd desc +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "Viac informácií" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Kontrola a preberanie aktualizácií vyžaduje dáta a energiu. Funkcie " +"automatických aktualizácií sú preto pozasatavené pri pripojení k meranej " +"sieti a pri zapnutom režime úspory energie." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatické" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Automaticky kontrolovať a preberať aktualizácie" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manuálne" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Kontrola a preberanie aktualizácií musí byť spustené ručne" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Oznamovať automatické aktualizácie" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Upozorniť na automatickú inštaláciu aktualizácie" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtre obsahu" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Zobrazovať iba _slobodný softvér" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Skrývať neslobodný softvér pri prechádzaní a hľadaní" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Zobrazovať iba o_verených vývojárov" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Zobrazovať iba aplikácie od vývojárov, ktorých identita bola overená" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Nainštalovaný softvér nie je kompatibilný s distribúciou %s. V prípade, že " +"budete pokračovať, počas inovácie dôjde k jeho odstráneniu." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Nekompatibilný softvér" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Aktualizovať" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Softvér nainštalovaný z repozitára „%s“ už nebude dostávať aktualizácie." + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Zakázať repozitár?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Odobrať repozitár?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "_Zakázať" + +# GtkButton +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:266 +msgid "_Remove" +msgstr "O_dstrániť" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Povoliť nové repozitáre" + +#: src/gs-repos-dialog.c:612 +msgid "Turn on new repositories when they are added" +msgstr "Zapnúť nové repozitáre po ich pridaní" + +# DK:cmd desc +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "viac informácií" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Ďašie repozitáre od vybraných tretín strán — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Repozitáre tretích strán operačného systému Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "operačného systému" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Tieto repozitáre doplňujú predvolenú ponuku softvéru poskytovaného " +"distribúciou %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Softvérové repozitáre" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "Žiadne repozitáre" + +# * https://bugzilla.gnome.org/show_bug.cgi?id=726990 +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "Bolo nainštalovaných %u aplikácií" +msgstr[1] "Bola nainštalovaná %u aplikácia" +msgstr[2] "Boli nainštalované %u aplikácie" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "Bolo nainštalovaných %u doplnkov" +msgstr[1] "Bol nainštalovaný %u doplnok" +msgstr[2] "Boli nainštalované %u doplnky" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u aplikácií" +msgstr[1] "%u aplikácia" +msgstr[2] "%u aplikácie" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u doplnkov" +msgstr[1] "%u doplnok" +msgstr[2] "%u doplnky" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s a %s nainštalovaných" +msgstr[1] "%s a %s nainštalovaný" +msgstr[2] "%s a %s nainštalované" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Kontrola nainštalovaného softvéru…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +# GtkButton +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Odstrániť" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Neznášam ju" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Nepáči sa mi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "Je v poriadku" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Páči sa mi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Zbožňujem ju" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Ak chcete pridať hodnotenie, vyberte hviezdičku" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Venujte, prosím, trochu času na napísanie recenzie" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Prosím, zvoľte hodnotenie pomocou hviezdičiek" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Celkové hodnotenie je príliš krátke" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Celkové hodnotenie je príliš dlhé" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "Popis je príliš krátky" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "Popis je príliš dlhý" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Napísať recenziu" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "O_doslať" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Uveďte, prosím, hodnotenie, celkový súhrn a text recenzie. Recenzie by ste " +"nemali používať na nahlasovanie problémov: miesto toho sa obráťte na " +"vývojára alebo svojho poskytovateľa podpory." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Celkový dojem" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "Napíšte krátku recenziu" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Zistite, aké údaje sú odosielané v našich Zásadách súkromia. Celé meno priradené k vášmu účtu sa bude " +"verejne zobrazovať." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "celkom %u recencií" +msgstr[1] "celkom %u recenzia" +msgstr[2] "celkom %u recenzie" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "z 5 hviezdičiek" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Neznáme" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:227 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Môžete nahlásiť recenzie, ktoré obsahujú urážky, nevhodný jazyk alebo " +"diskriminujú." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:232 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "Po nahlásení bude recenzia skrytá, až kým ju neskontroluje správca." + +# dialog title +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:237 +msgid "Report Review?" +msgstr "Nahlásiť recenziu?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:242 +msgid "_Report" +msgstr "_Nahlásiť" + +# dialog title +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:258 +msgid "Remove Review?" +msgstr "Odstrániť recenziu?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:261 +msgid "Removing a review cannot be undone." +msgstr "Odstránenie recenzie nie je možné odvolať." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Recenzia sa mi páči" + +# dialog title +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Recenzia sa mi nepáči" + +# GtkButton +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Nahlásiť…" + +# GtkButton +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Odstrániť…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Aplikácia sa nespúšťa v izolovanom prostredí, ale distribúcia preverila, že " +"sa v nej nenachádza škodlivý kód" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Skontrolujte, či dôverujete dodávateľovi, pretože aplikácia sa nespúšťa v " +"izolovanom prostredí" + +# GtkLabel +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Žiadne oprávnenia" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Aplikácia sa spúšťa v plne izolovanom prostredí" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Prístup k sieti" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Má prístup na internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Žiadny prístup k sieti" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Nemá prístup na internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Používa služby systému" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Môže si vyžiadať údaje zo služieb systému" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Využíva služby relácie" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Môže si vyžiadať údaje zo služieb relácie" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Prístup k zariadeniam používateľa" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Môže pristupovať k zariadeniam ako sú webkamery alebo herné ovládače" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Žiadny prístup k zariadeniam používateľa" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Nemôže pristupovať k zariadeniam ako sú webkamery alebo herné ovládače" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Prístup ku vstupným zariadeniam" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Prístup k mikrofónu" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "Môže počúvať cez mikrofóny bez žiadosti o povolenie" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Prístup k systémovým zariadeniam" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Môže pristupovať k systémovým zariadeniam, ktoré vyžadujú zvýšené oprávnenia" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Prístup k obsahu obrazovky" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Môže pristupovať k obsahu obrazovky alebo iných okien" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Pôvodný zobrazovací systém" + +# GtkLabel +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Ľubovoľné oprávnenia" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Nastavenia používateľa" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Plný prístup k súborovému systému na čítanie/zápis" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Môže čítať a zapisovať všetky údaje v súborovom systéme" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Prístup k domovskému priečinku na čítanie/zápis" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Môže čítať a zapisovať všetky údaje vo vašom domovskom priečinku" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Plný prístup k súborovému systému na čítanie" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Môže čítať všetky údaje v súborovom systéme" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Prístup k domovskému priečinku na čítanie" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Môže čítať všetky údaje vo vašom domovskom priečinku" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Prístup k priečinku so stiahnutými súbormi na čítanie/zápis" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "" +"Môže čítať a zapisovať všetky údaje vo vašom priečinku so stiahnutými súbormi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Prístup k priečinku so stiahnutými súbormi na čítanie" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Môže čítať všetky údaje vo vašom priečinku so stiahnutými súbormi" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Môže čítať a zapisovať všetky údaje v priečinku" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Môže čítať všetky údaje v priečinku" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Žiadny prístup k súborovému systému" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Vôbec nemôže pristupovať k súborovému systému" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Vývojár aplikácie je overený" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Bolo overené, že vývojár tejto aplikácie je ten, za koho sa vydáva" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Bezpečnostné riziká v závislotiach" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Softvér alebo jeho závislosti nie sú už ďalej podporované a môžu " +"predstavovať bezpečnostné riziko" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Táto aplikácia nešpecifikuje, pod akou licenciou je vyvíjaná a môže byť " +"neslobodná" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Tento softvér nešpecifikuje, pod akou licenciou je vyvíjaný a môže byť " +"neslobodný" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Uzavretý kód" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Zdrojový kód nie je verejný a tak ho nie je možné nezávisle skontrolovať. " +"Nemusí byť preto bezpečný" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Táto aplikácia je vyvíjaná pod zvláštnou licenciou „%s“" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Tento softvér je vyvíjaný pod zvláštnou licenciou „%s“" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Otvorený kód" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Zdrojový kód je verejný a môže byt nezávisle kontrolovaný. To zvyšuje šance, " +"že je aplikácia bezpečná" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "Aplikácia %s je zvýhodnená" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "Aplikácia %s je bezpečná" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "Aplikácia %s je pravdepodobne bezpečná" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "Aplikácia %s je potenciálne nebezpečná" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "Aplikácia %s nie je bezpečná" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "neznáma" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Bezpečnosť" + +# GtkLabel +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licencia" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "Zdroj" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Táto aplikácia používa zastaranú verziu softvérovej platformy (SDK) a môže " +"obsahovať chyby alebo slabé miesta zabezpečenia, ktoré nebudú opravené." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Predchádzajúca snímka obrazovky" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Nasledujúca snímka obrazovky" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Žiadne snímky obrazovky" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Snímka obrazovky sa nenašla" + +# title +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Zlyhalo načítanie obrázka" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Veľkosť snímky obrazovky sa nenašla" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Nepodarilo sa vytvoriť vyrovnávaciu pamäť" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Snímka obrazovky je neplatná" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Snímka obrazovky nie je dostupná" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Snímka obrazovky" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u ďalších výsledkov hľadania" +msgstr[1] "%u ďalší výsledok hľadania" +msgstr[2] "%u ďalšie výsledky hľadania" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Stránka hľadania" + +# cmdline description +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Hľadať aplikácie" + +# GtkLabel +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "Nenašla sa žiadna aplikácia" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "„%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Nedajú sa prevziať aktualizácie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "Nedajú sa prevziať aktualizácie firmvéru" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Nedajú sa prevziať aktualizácie firmvéru z %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Nedajú sa prevziať aktualizácie z %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "Aktualizáciu nie je možné vykonať: vyžaduje sa prístup na internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "Aktualizáciu nie je možné vykonať: nedostatok miesta na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Nedajú sa prevziať aktualizácie z %s: nedostatok miesta na disku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "Aktualizáciu nie je možné vykonať: vyžaduje sa overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "Aktualizáciu nie je možné vykonať: zlyhalo overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "Aktualizáciu nie je možné vykonať: vyžaduje sa oprávnenie" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Nedajú sa prevziať aktualizácie: nemáte dostatočné oprávenia na inštaláciu " +"softvéru" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Nie je možné získať zoznam aktualizácií" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "Inštaláciu nie je možné vykonať: chyba preberania" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "" +"Nie je možné nainštalovať aplikáciu %s: preberanie z lokality %s zlyhalo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Nedá sa nainštalovať aplikácia %s: preberanie zlyhalo" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "Inštaláciu nie je možné vykonať: chýba behové prostredie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "" +"Nie je možné nainštalovať aplikáciu %s: behové prostredie %s nie je k " +"dispozícii" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "Nie je možné nainštalovať aplikáciu %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "Inštaláciu nie je možné vykonať: je vyžadovaný prístup na internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "Inštaláciu nie je možné vykonát: neplatný formát aplikácie" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "Inštaláciu nie je možné vykonať: nedostatok miesta na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Nie je možné nainštalovať aplikáciu %s: nedostatok miesta na disku" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "Inštaláciu nie je možné vykonať: vyžaduje sa overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "" +"Nie je možné nainštalovať aplikáciu %s: vyžaduje sa overenie totožnosti" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "Inštaláciu nie je možné vykonať: zlyhalo overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Nie je možné nainštalovať aplikáciu %s: zlyhalo overenie totožnosti" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "Inštaláciu nie je možné vykonať: vyžaduje sa oprávnenie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Nie je možné nainštalovať aplikáciu %s: vyžaduje sa oprávnenie" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "Inštaláciu nie je možné vykonať: zariadenie musí byť napájané zo siete" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "" +"Nie je možné nainštalovať aplikáciu %s: zariadenie musí byť napájané zo siete" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "Inštaláciu nie je možné vykonať: nízka úroveň nabitia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Nie je možné nainštalovať aplikáciu %s: nízka úroveň nabitia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "" +"Nie je možné aktualizovať aplikáciu %s zo zdroja %s: zlyhalo preberanie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Nie je možné aktualizovať aplikáciu %s: zlyhalo preberanie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Nie je možné nainštalovať aktualizácie zo zdroja %s: zlyhalo preberanie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "Aktualizáciu nie je možné vykonať: zlyhalo preberanie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Nie je možné aktualizovať aplikáciu %s: nedostatok miesta na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "" +"Nie je možné aktualizovať aplikáciu %s: vyžaduje sa overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Nie je možné aktualizovať aplikáciu %s: zlyhalo overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Nie je možné aktualizovať aplikáciu %s: vyžaduje sa oprávnenie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "" +"Nie je možné aktualizovať aplikáciu %s: zariadenie musí byť napájané zo siete" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Nie je možné aktualizovať aplikáciu %s: vyžaduje sa napájanie zo siete" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "Aktualizáciu nie je možné vykonať: nízka úroveň nabitia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Nie je možné aktualizovať aplikáciu %s: nízka úroveň nabitia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "Nie je možné aktualizovať aplikáciu %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "Aktualizáciu nie je možné vykonať" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Nie je možné povýšiť verziu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Nie je možné povýšiť verziu systému na %s z %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "Povýšenie verzie nie je možné vykonať: zlyhalo preberanie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Nie je možné povýšiť verziu na %s: zlyhalo preberanie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "" +"Povýšenie verzie nie je možné vykonať: je vyžadovaný prístup na internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "" +"Nie je možné povýšiť verziu systému na %s: je vyžadovaný prístup na internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "Povýšenie verzie nie je možné vykonať: nedostatok miesta na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Nie je možné povýšiť verziu systému na %s: nedostatok miesta na disku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "Povýšenie verzie nie je možné vykonať: vyžaduje sa overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "" +"Nie je možné povýšiť verziu systému na %s: vyžaduje sa overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "Povýšenie verzie nie je možné vykonať: zlyhalo overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Nie je možné povýšiť verziu systému na %s: zlyhalo overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "Povýšenie verzie nie je možné vykonať: vyžaduje sa oprávnenie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Nie je možné povýšiť verziu systému na %s: vyžaduje sa oprávnenie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "" +"Povýšenie verzie nie je možné vykonať: zariadenie musí byť napájané zo siete" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Nie je možné povýšiť verziu systému na %s: zariadenie musí byť napájané zo " +"siete" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "Povýšenie verzie nie je možné vykonať: nízka úroveň nabitia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Nie je možné povýšiť verziu systému na %s: nízka úroveň nabitia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nie je možné povýšiť verziu systému na %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "Inštaláciu nie je možné vykonať: vyžaduje sa overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "" +"Nie je možné odinštalovať aplikáciu %s: vyžaduje sa overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +msgid "Unable to uninstall: invalid authentication" +msgstr "Nedá sa odinštalovať: zlyhalo overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Nie je možné odinštalovať aplikáciu %s: zlyhalo overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "Nedá sa odinštalovať: vyžaduje sa oprávnenie" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Nie je možné odinštalovať aplikáciu %s: vyžaduje sa oprávnenie" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "" +"Nie je možné odinštalovať aplikáciu %s: zariadenie musí byť napájané zo siete" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "" +"Nie je možné odinštalovať aplikáciu %s: zariadenie musí byť napájané zo siete" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "Nedá sa odinštalovať: nízka úroveň nabitia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Nie je možné odinštalovať aplikáciu %s: nízka úroveň nabitia" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Nie je možné odinštalovať aplikáciu %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "Nedá sa spustiť %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "Prepáčte, niekde nastala chyba" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Nie je možné spustiť aplikáciu %s: %s nie je nainštalované" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "Nedostatok miesta na disku pre operáciu" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "Inštaláciu nie je možné vykonať: typ súboru nie je podporovaný" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "Inštaláciu nie je možné vykonať: zlyhalo overenie totožnosti" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Inštaláciu nie je možné vykonať" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "Nedá sa kontaktovať lokalitu %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "" +"Aby ste mohli používať nové zásuvné moduly, reštartujte aplikáciu Softvér" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "Zariadenie musí byť napájané zo siete" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Úroveň nabitia batérie je príliš nízka" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "O aplikácii Softvér" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "_Softvérové repozitáre" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "_Klávesové skratky" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_Predvoľby" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Hľadať" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Hlavná ponuka" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "hľadať aplikácie" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "_Objavujte" + +# GtkToggleButton +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "Na_inštalované" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Aktualizácie" + +# GtkButton +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "Prejsť späť" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Žiadna" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Údaje aplikácie" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Údaje potrebné na spustenie aplikácie" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Údaje používateľa" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Vami vytvorené údaje v aplikácii" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Dáta medzipamäte" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dočasné údaje v medzipamäti" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Aplikácia samotná" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Vyžadované závislosti" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Zdieľané systémové komponenty vyžadované touto aplikáciou" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "neznáma" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Údaje uložené v medzipamäti je možné odstrániť v nastaveniach " +"_aplikácie" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Úložisko" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (nainštalované)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (inštaluje sa)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (preberá sa)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (odstraňuje sa)" + +# GtkLabel +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Podrobnosti" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Preskúmať" + +# DK: %s=dátum +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Nainštalované dňa %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "Nainštalované aktualizácie" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "Nie sú nainštalované žiadne aktualizácie" + +# title +#: src/gs-update-monitor.c:215 +msgid "Updates Are Out of Date" +msgstr "Údaje o aktualizáciach sú zastarané" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "Skontrolujte, prosím, dostupné aktualizácie" + +#: src/gs-update-monitor.c:222 +msgid "Critical Updates Ready to Install" +msgstr "Kritické aktualizácie sú pripravené na inštaláciu" + +#: src/gs-update-monitor.c:223 +msgid "Install critical updates as soon as possible" +msgstr "Nainštalujte kritické aktualizácie čo najskôr" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "Kritické aktualizácie sú k dispozícii na stiahnutie" + +#: src/gs-update-monitor.c:227 +msgid "Download critical updates as soon as possible" +msgstr "Stiahnite kritické aktualizácie čo najskôr" + +#: src/gs-update-monitor.c:233 +msgid "Updates Ready to Install" +msgstr "Aktualizácie sú pripravené na inštaláciu" + +#: src/gs-update-monitor.c:234 +msgid "Software updates are ready and waiting" +msgstr "Aktualizácie sú pripravené a čakajú" + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "Aktualizácie sú dostupné na stiahnutie" + +#: src/gs-update-monitor.c:241 +msgid "Software updates can be downloaded" +msgstr "Aktualizácie softvéru je možné stiahnuť" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u aktualizovaných aplikácií — je vyžadovaný reštart" +msgstr[1] "%u aktualizovaná aplikácia — je vyžadovaný reštart" +msgstr[2] "%u aktualizované aplikácie — je vyžadovaný reštart" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u aktualizovaných aplikácií" +msgstr[1] "%u aktualizovaná aplikácia" +msgstr[2] "%u aktualizované aplikácie" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "Aplikácia %s bola aktualizovaná." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "Prosím, reštartujte aplikáciu." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "Aplikácie %s a %s boli aktualizované." + +# * https://bugzilla.gnome.org/show_bug.cgi?id=726990 +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u aplikácií vyžaduje reštart." +msgstr[1] "%u aplikácia vyžaduje reštart." +msgstr[2] "%u aplikácie vyžadujú reštart." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Zahŕňa %s, %s a %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "Systém dosiahol koniec životnosti" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +msgid "Upgrade to continue receiving updates" +msgstr "Povýšte verziu, aby ste mohli naďalej prijímať aktualizácie" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Nová verzia systému %s je dostupná na inštaláciu" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "Je dostupné povýšenie verzie softvéru" + +# title +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "Aktualizácie softvéru zlyhali" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "Prepared updates were not installed" +msgstr "Pripravené aktualizácie neboli nainštalované" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Zobraziť podrobnosti" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Povýšenie verzie systému bolo dokončené" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Vitajte v distribúcii %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Aktualizácie softvéru boli nainštalované" +msgstr[1] "Aktualizácia softvéru bola nainštalovaná" +msgstr[2] "Aktualizácie softvéru boli nainštalované" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Dôležité aktualizácie operačného systému boli nainštalované." +msgstr[1] "Dôležitá aktualizácia operačného systému bola nainštalovaná." +msgstr[2] "Dôležité aktualizácie operačného systému boli nainštalované." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Prehľad" + +# title +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "Aktualizácia zlyhala" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "Systém už bol aktuálny." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "Aktualizácia bola zrušená." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Je vyžadovaný prístup na internet, ale nebol dostupný. Prosím, uistite sa, " +"že prístup na internet funguje a skúste to znovu." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Pri aktualizácii sa vyskytol problém so zabezpečením. Prosím, pre viac " +"informácií sa poraďte s vaším poskytovateľom softvéru." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Nebol dostupný dostatok priestoru na disku. Prosím, uvoľnite nejaký priestor " +"a skúste to znovu." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Ľutujeme: zlyhala inštalácia aktualizácie. Prosím, počkajte na ďalšiu " +"aktualizáciu a skúste to znovu. Ak problém pretrváva, kontaktujte vášho " +"poskytovateľa softvéru." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Posledná kontrola: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Zastaviť" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Skontrolovať dostupnosť aktualizácií" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "Distribúcia %s %s prestala dostávať kritické aktualizácie softvéru" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Váš operačný systém prestal dostávať kritické aktualizácie softvéru" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Možné spoplatnenie" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Zisťovanie dostupných aktualizácií pomocou mobilného širokopásmového " +"pripojenia môže byť spoplatnená vašim operátorom." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Napriek _tomu skontrolovať" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Stiahnuté povýšenia verzií softvéru" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Povýšenia verzií sú pripravené na inštaláciu" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "Zistiť dostupnosť aktualizácií" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Aktualizácie" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Stránka s aktualizáciami" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "Načítavajú sa aktualizácie" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "Môže to chvíľu trvať" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "Aktuálne" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "Použiť mobilné dáta?" + +#: src/gs-updates-page.ui:232 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Zisťovanie dostupných aktualizácií pri pripojení pomocou mobilného " +"širokopásmového pripojenia vám môže spôsobiť dodatočné náklady" + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "Napriek tomu _skontrolovať" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "Žiadne pripojenie" + +#: src/gs-updates-page.ui:255 +msgid "Go online to check for updates" +msgstr "Kvôli kontrole aktualizácií sa musíte pripojiť k sieti" + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "_Nastavenia siete" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "Chyba" + +#: src/gs-updates-page.ui:293 +msgid "Updates are automatically managed" +msgstr "Aktualizácie sú spravované automaticky" + +# title +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Aktualizácie softvéru boli pozastavené" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automatické aktualizácie softvéru boli pozastavené z nasledujúcich dôvodov:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Aktuálne sieťové pripojenie je merané" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Aktuálne sieťové pripojenie zakazuje sťahovanie veľkých objemov" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Režim úspory energie je aktívny" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Herný režim je aktívny" + +# title +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Aktualizácie softvéru boli pozastavené" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Sieťové pripojenie je merané — aktualizácie softvéru boli pozastavené" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Sieťové pripojenie zakazuje sťahovať veľké objemy dát — aktualizácie " +"softvéru boli pozastavené" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Herný režim je aktívny — aktualizácie softvéru boli pozastavené" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Herný režim je aktívny — aktualizácie softvéru boli pozastavené" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:321 +msgid "_Restart & Update…" +msgstr "_Reštartovať a aktualizovať…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:327 +msgid "U_pdate All" +msgstr "A_ktualizovať všetko" + +# title +#: src/gs-updates-section.c:404 +msgid "Software Updates Downloaded" +msgstr "Dokončilo sa preberanie softvérových aktualizácií" + +#: src/gs-updates-section.c:405 +msgid "Updates are ready to be installed" +msgstr "Aktualizácie sú pripravené na inštaláciu" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:496 +msgid "Integrated Firmware" +msgstr "Integrovaný firmvér" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:501 +msgid "Requires Restart" +msgstr "Vyžaduje sa reštart" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:506 +msgid "App Updates" +msgstr "Aktualizácie aplikácií" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:511 +msgid "Device Firmware" +msgstr "Firmvér zariadení" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Prevziať" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Je k dispozícii %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Je k dispozícii %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Ďalšie informácie o novej verzii" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Stiahnuté %s z %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Stiahnuté %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Povýšenie na novú verziu s novými funkciami a vylepšeniami." + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "_Reštartovať a aktualizovať…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "Pred povýšením verzie si nezabudnite odzálohovať vaše údaje a súbory." + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Nepodarilo sa odstrániť súbor „%s“: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Nepodarilo sa odstrániť adresár „%s“: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Pridať, odobrať alebo aktualizovať softvér na tomto počítači" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"aktualizácie;inovácia;povýšenie;zdroje;repozitáre;nastavenia;predvoľby;" +"inštalácia;inštalovanie;odinštalovanie;program;softvér;aplikácia;obchod;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s pripravené" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s je pripravené na povolenie počas ďalšieho spustenia systému." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Povoliť" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:71 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3167 +msgid "System Updates" +msgstr "Aktualizácie systému" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:76 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3172 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Všeobecné aktualizácie systému, ako sú opravy zabezpečenia, opravy chýb a " +"vylepšenie výkonu." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Aktualizácia %s prinášajúca nové funkcie a opravy." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Aktualizačnej službe EOS sa nepodarilo prebrať a nasadiť aktualizáciu." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Webová aplikácia" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Podpora webových aplikácií" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Spúšťajte obľúbené webové aplikácie v prehliadači" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Povýšte verziu a získajte tak najnovšie funkcie, vylepšenia výkonu a " +"stability." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Podpora nástroja Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak je systém pre správu desktopových aplikácií na Linuxe" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Systémový priečinok %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Podpriečinok %s v domovskom priečinku" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Priečinky hostiteľského systému" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "Konfigurácia hostiteľského systému z /etc" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Priečinok plochy" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Podpriečinok %s v priečinku plochy" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Priečinok dokumentov" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Podpriečinok %s v priečinku dokumentov" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Priečinok hudby" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Podpriečinok %s v priečinku hudby" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Priečinok obrázkov" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Podpriečinok %s v priečinku obrázkov" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Priečinok verejného zdieľania" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Podpriečinok %s v priečinku verejného zdieľania" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Priečinok videí" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Podpriečinok %s v priečinku videí" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Priečinok šablón" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Podpriečinok %s v priečinku šablón" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Priečinok medzipamäte používateľa" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Podpriečinok %s v priečinku medzipamäte používateľa" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Priečinok s nastaveniami používateľa" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Podpriečinok %s v priečinku s nastaveniami používateľa" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Priečinok s údajmi používateľa" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Podpriečinok %s v priečinku s údajmi používateľa" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Priečinok používateľa pre beh aplikácií" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Podpriečinok %s v priečinku používateľa pre beh aplikácií" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Prístup k súborovému systému v %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Získavajú sa metadáta nástroja Flatpak pre repozitár %s…" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Nepodarilo sa vylepšiť doplnok „%s“: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Používateľská inštalácia" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Systémová inštalácia" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "ID aplikácie" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Nepodarilo sa pridať doplnok „%s“ do inštalácie: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Nepodarilo sa pridať doplnok „%s“ na odinštalovanie: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Vzdialený server „%s“ nepovoľuje inštaláciu „%s“, pravdepodobne kvôli svojmu " +"filtru. Odstráňte filter a inštaláciu zopakujte. Podrobnosti chyby: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Systém nemá dostatok energie, aby mohol spustiť aktualizáciu" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Systém nemá dostatok energie, aby mohol spustiť aktualizáciu (%u%%, vyžaduje " +"sa %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Zariadenie je nedostupné alebo je mimo dosahu bezdrôtovej siete" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Úroveň nabitia batérie je príliš nízka" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Úroveň nabitia batérie je príliš nízka (%u%%, vyžaduje sa %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Zariadenie čaká na nasadenie aktualizácie" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Zariadenie vyžaduje pripojené napájanie zo siete" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Zariadenie nie je možné používať, ak je víko notebooku zatvorené" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s Device Update" +msgstr "Aktualizácia zariadenia %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s System Update" +msgstr "Aktualizácia systému pre %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Aktualizácia vstavaného radiča pre %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s ME Update" +msgstr "Aktualizácia ME pre %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Aktualizácia ME pre firmy pre %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:238 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Aktualizácia ME pre bežných spotrebiteľov pre %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:244 +#, c-format +msgid "%s Controller Update" +msgstr "Aktualizácia radiča pre %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Aktualizácia radiča Thunderbolt pre %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Aktualizácia mikrokódu procesora pre %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:260 +#, c-format +msgid "%s Configuration Update" +msgstr "Aktualizácia konfigurácie pre %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Battery Update" +msgstr "Aktualizácia batérie pre %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:269 +#, c-format +msgid "%s Camera Update" +msgstr "Aktualizácia kamery pre %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:273 +#, c-format +msgid "%s TPM Update" +msgstr "Aktualizácia TPM pre %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:277 +#, c-format +msgid "%s Touchpad Update" +msgstr "Aktualizácia Touchpadu pre %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:281 +#, c-format +msgid "%s Mouse Update" +msgstr "Aktualizácia myši pre %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:285 +#, c-format +msgid "%s Keyboard Update" +msgstr "Aktualizácia klávesnice pre %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Aktualizácia radiča diskov pre %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Network Interface Update" +msgstr "Aktualizácia sieťovej karty pre %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s Display Update" +msgstr "Aktualizácia displeja pre %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s BMC Update" +msgstr "Aktualizácia BMC pre %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:309 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Aktualizácia USB prijímača pre %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:313 +#, c-format +msgid "%s Drive Update" +msgstr "Aktualizácia disku pre %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Aktualizácia flash disku pre %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s SSD Update" +msgstr "Aktualizácia disku SSD pre %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s GPU Update" +msgstr "Aktualizácia grafickej karty pre %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s Dock Update" +msgstr "Aktualizácia dokovacej stanice pre %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:337 +#, c-format +msgid "%s USB Dock Update" +msgstr "Aktualizácia USB dokovacej stanice pre %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Firmvér" + +#: plugins/fwupd/gs-plugin-fwupd.c:1922 +msgid "Firmware update could not be applied: " +msgstr "Aktualizáciu firmvéru sa nepodarilo nasadiť: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Podpora aktualizácií firmvéru" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Poskytuje podporu pre povýšenie verzie firmvéru" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Nainštalovať nepodpísaný softvér?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Softvér, ktorý sa chystáte nainštalovať, nie je podpísaný. Nebude tak možné " +"overiť pôvod jeho aktualizácií alebo to, či niekto s aktualizáciami " +"nemanipuloval." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Prebrať nepodpísaný softvér?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Sú k dispozícii nepodpísané aktualizácie. Bez podpisu nie je možné overiť " +"pôvod aktualizácie alebo to, či s ňou niekto nemanipuloval." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Aktualizovať nepodpísaný softvér?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Sú k dispozícii nepodpísané aktualizácie. Bez podpisu nie je možné overiť " +"pôvod aktualizácie alebo to, či s ňou niekto nemanipuloval.Aktualizácie " +"softvéru nebudú povolené, kým nepodpísané aplikácie neodstránite alebo ich " +"neaktualizujete." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Nie je možné nainštalovať aktualizácie: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Balíčky" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1410 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1433 +msgid "Failed to wait on transaction end before download: " +msgstr "Zlyhalo čakanie na koniec transakcie pred stiahnutím: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1440 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1453 +msgid "Failed to download updates: " +msgstr "Nie je možné prevziať aktualizácie: " + +# title +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1492 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1502 +msgid "Failed to trigger update: " +msgstr "Zlyhalo spustenie aktualizácie: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3267 +msgid "Operating System (OSTree)" +msgstr "Operačný systém (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Obchod Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Podpora balíčkov Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap je univerzálnym balíčkom pre systém Linux" + +#~ msgid "GNOME Software" +#~ msgstr "Softvér prostredia GNOME" + +#~ msgid "Application manager for GNOME" +#~ msgstr "Správca aplikácií prostredia GNOME" + +# cmdline description +#~ msgid "A list of popular applications" +#~ msgstr "Zoznam obľúbených aplikácií" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Zoznam aplikácií, ktoré sa majú použiť, nahrádzajúc aplikácie určené " +#~ "systémom." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Posledná časová pečiatka, keď bol systém online a dostal nejaké " +#~ "aktualizácie" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Zobraziť otázku pri inštalácii repozitárov neslobodného softvéru" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Pohodlný spôsob správy softvéru vo vašom systéme." + +# GtkLabel +#, c-format +#~ msgid "Featured %s" +#~ msgstr "Softvér základnej výbavy kategórie %s" + +#~ msgid "Rating" +#~ msgstr "Hodnotenie" + +#~ msgid "Name" +#~ msgstr "Názov" + +#~ msgid "Show" +#~ msgstr "Zobraziť" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Ponuka filtra podkategórií" + +#~ msgid "Sort" +#~ msgstr "Usporiadať" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Ponuka usporiadania podkategórií" + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Prosím, zadajte číslo v rozsahu od 1 do %u: " + +# cmdline description +#~ msgid "Choose an application:" +#~ msgstr "Zvoľte aplikáciu:" + +# GtkToggleButton +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +#~ msgid "Audio & Video" +#~ msgstr "Zvuk a video" + +#~ msgid "Developer Tools" +#~ msgstr "Nástroje pre vývojárov" + +#~ msgid "Education & Science" +#~ msgstr "Vzdelávanie a veda" + +#~ msgid "Games" +#~ msgstr "Hry" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafika a fotografia" + +#~ msgid "Productivity" +#~ msgstr "Produktivita" + +#~ msgid "Communication & News" +#~ msgstr "Komunikácia a novinky" + +#~ msgid "Utilities" +#~ msgstr "Pomôcky" + +# cmdline description +#~ msgid "An application" +#~ msgstr "Aplikácia" + +#~| msgid "_Learn More" +#~ msgid "_Read More" +#~ msgstr "_Čítať viac" + +#~ msgid "_Read Less" +#~ msgstr "Čítať menej" + +# GtkButton +#~ msgid "_Launch" +#~ msgstr "_Spustiť" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Nie je možné zistiť, ku ktorým častiam systému môže táto aplikácia " +#~ "pristupovať. Je to obvyklé pri starších aplikáciách." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Nikdy" + +#~| msgid "Low" +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Nízke" + +#~| msgid "Medium" +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Stredné" + +#~| msgid "High" +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Vysoké" + +#~| msgid "Unknown" +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Neznáme" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Nie je možné nájsť „%s“" + +#~ msgid "Public domain" +#~ msgstr "Verejná doména" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://sk.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Používatelia sú viazaní týmito licenciami:" +#~ msgstr[1] "Používatelia sú viazaní touto licenciou:" +#~ msgstr[2] "Používatelia sú viazaní týmito licenciami:" + +#~| msgid "Removing…" +#~ msgid "Loading…" +#~ msgstr "Načítava sa…" + +# GtkButton +#~ msgid "Re_move shortcut" +#~ msgstr "O_dstrániť odkaz" + +#~ msgid "No screenshot provided" +#~ msgstr "Snímka obrazovky nebola poskytnutá" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Vybraté doplnky budú nainštalované spolu s aplikáciou." + +#~ msgid "Localized in your Language" +#~ msgstr "Lokalizovaný vo vašom jazyku" + +#~ msgid "Release Activity" +#~ msgstr "Aktivita vydaní" + +#~ msgid "Sandboxed" +#~ msgstr "V izolovanom priestore" + +#~ msgid "Channel" +#~ msgstr "Kanál" + +# GtkLabel +#~ msgid "Category" +#~ msgstr "Kategória" + +#~ msgid "Free" +#~ msgstr "Slobodná" + +#~| msgid "Unknown" +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Neznáme" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "To znamená, že softvér sa môže slobodne používať, kopírovať, šíriť, " +#~ "študovať a upravovať." + +#~ msgid "Proprietary Software" +#~ msgstr "Softvér s uzavretým zdrojom" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "To znamená, že softvér vlastní jednotlivec alebo spoločnosť. Často sú s " +#~ "jeho používaním spojené obmedzenia a jeho zdrojový kód nebýva obvykle " +#~ "sprístupnený." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Licenčné podmienky používania tohto softvéru nie sú známe." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Aplikácia bola takto ohodnotená, pretože obsahuje:" + +# DK:window title +#~ msgid "Welcome" +#~ msgstr "Vitajte" + +#~ msgid "Welcome to Software" +#~ msgstr "Vitajte v programe Softvér" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Program Softvér vám umožní z jedného miesta nainštalovať všetok softvér, " +#~ "ktorý potrebujete. Prezrite si naše odporúčania, prehliadajte kategórie, " +#~ "alebo vyhľadajte aplikácie, ktoré chcete." + +#~| msgid "Free Software" +#~ msgid "_Browse Software" +#~ msgstr "Prehliadať softvér" + +#~| msgid "Installed" +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Odinštalované" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Nainštalovaný" + +# GtkLabel +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Aktualizovaný" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Neznáma" + +# GtkDialog title +#~ msgid "History" +#~ msgstr "História" + +# cmdline description +#~| msgid "An application" +#~ msgid "Applications" +#~ msgstr "Aplikácie" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Prebieha preberanie katalógu so softvérom" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automatické aktualizácie pozastavené" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an un­metered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been in­correctly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "Aktuálna sieť je obmedzená. Obmedzené pripojenia majú obmedzené dáta a s " +#~ "tým sú spojené poplatky. Kvôli úspore dát boli preto automatické " +#~ "aktualizácie pozastavené.\n" +#~ "\n" +#~ "Automatické aktualizácie budú pokračovať, keď bude dostupná neobmedzená " +#~ "sieť. Dovtedy je možné inštalovať aktualizácie ručne.\n" +#~ "\n" +#~ "Alebo ak bolo obmedzenie aktuálnej siete nesprávne identifikované, môže " +#~ "byť toto nastavenie zmenené." + +#~ msgid "Open Network _Settings" +#~ msgstr "Otvoriť nastavenia _siete" + +#~ msgid "Moderate page" +#~ msgstr "Strana s moderovaním" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Neexistujú žiadne recenzie na moderovanie" + +#~ msgid "system" +#~ msgstr "systém" + +#~ msgid "user" +#~ msgstr "používateľ" + +#~ msgid "Branch" +#~ msgstr "Vetva" + +#~ msgid "URL" +#~ msgstr "URL" + +# GtkLabel +#~ msgid "Version" +#~ msgstr "Verzia" + +#~ msgid "More…" +#~ msgstr "Viac…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Odporúčané aplikácie na prácu so zvukom a videom" + +#~ msgid "Recommended Games" +#~ msgstr "Odporúčané hry" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Odporúčané grafické aplikácie" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Odporúčané aplikácie na zvýšenie produktivity" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Niektoré z týchto softvérov sú uzavreté, a preto majú obmedzenia v " +#~ "používaní, zdieľaní a prístupe k zdrojovému kódu." + +#~ msgid "Find out more…" +#~ msgstr "Zistiť viac…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Výber tvorcov" + +#~ msgid "Recent Releases" +#~ msgstr "Nedávne vydania" + +#, c-format +#~| msgid "Are you sure you want to purchase %s?" +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Naozaj chcete odinštalovať %s?" + +#, c-format +#~| msgid "" +#~| "%s will be removed, and you will have to install it to use it again." +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s sa odinštaluje a budete ho musieť znova nainštalovať, aby ste ho mohli " +#~ "znova použiť." + +#~ msgid "" +#~ "Automatic updates are disabled when on mobile or metered connections." +#~ msgstr "" +#~ "Automatické aktualizácie sú zakázané, keď ste pripojený na mobilné alebo " +#~ "obmedzené pripojenia." + +#~ msgid "_Continue" +#~ msgstr "_Pokračovať" + +# cmdline description +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u aplikácií" +#~ msgstr[1] "%u aplikácia" +#~ msgstr[2] "%u aplikácie" + +#, c-format +#~ msgid "Remove “%s”?" +#~ msgstr "Odstrániť repozitár „%s“?" + +#, c-format +#~ msgid "Disable “%s”?" +#~ msgstr "Zakázať repozitár „%s“?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Žiadne dodatočné repozitáre" + +# GtkButton +#~ msgid "_Remove…" +#~ msgstr "O_dstrániť…" + +#~ msgid "_Disable…" +#~ msgstr "_Zakázať…" + +#~ msgid "Disabling" +#~ msgstr "Zakazuje sa" + +#~ msgid "Enabled" +#~ msgstr "Povolený" + +#~ msgid "Disabled" +#~ msgstr "Zakázaný" + +#~ msgid "_Post" +#~ msgstr "O_doslať" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Napíšte krátky súhrn vašej recenzie, napríklad: „Výborná aplikácia, môžem " +#~ "odporučiť“." + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Čo si myslíte o aplikácii? Skúste napísať dôvody vašej recenzie." + +#~ msgid "ratings in total" +#~ msgstr "hodnotení celkom" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Bola táto recenzia pre vás užitočná?" + +#~ msgid "Yes" +#~ msgstr "Áno" + +#~ msgid "No" +#~ msgstr "Nie" + +#~ msgid "Meh" +#~ msgstr "Nestojí to za reč" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Nie je možné prevziať aktualizácie: bolo potrebné internetové pripojenie, " +#~ "ale nebolo dostupné" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Nie je možné prevziať aktualizácie: nedostatok miesta na disku" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "" +#~ "Nie je možné prevziať aktualizácie: bolo požadované overenie totožnosti" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "" +#~ "Nie je možné prevziať aktualizácie: overenie totožnosti nebolo platné" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Nie je možné nainštalovať aplikáciu %s: nemáte dostatočné práva na " +#~ "inštaláciu softvéru" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "" +#~ "Nie je možné nainštalovať aplikáciu %s: Úroveň nabitia batérie je príliš " +#~ "nízka" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Nie je možné nainštalovať aktualizácie: nedostatok miesta na disku" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "" +#~ "Nie je možné nainštalovať aktualizácie: bolo požadované overenie " +#~ "totožnosti" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "" +#~ "Nie je možné nainštalovať aktualizácie: overenie totožnosti nebolo platné" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Nie je možné aktualizovať aplikáciu %s: nemáte dostatočné práva na " +#~ "aktualizáciu softvéru" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Nie je možné nainštalovať aktualizácie: nemáte dostatočné práva na " +#~ "aktualizáciu softvéru" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Nie je možné nainštalovať aktualizácie: vyžaduje sa napájanie zo siete" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "" +#~ "Nie je možné aktualizovať aplikáciu %s: Úroveň nabitia batérie je príliš " +#~ "nízka" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "Nie je možné nainštalovať aktualizácie: Úroveň nabitia batérie je príliš " +#~ "nízka" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Nie je možné vykonať aktualizáciu na systém %s: bolo potrebné internetové " +#~ "pripojenie, ale nebolo dostupné" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Nie je možné aktualizovať na systém %s: nemáte dostatočné práva na " +#~ "aktualizáciu" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "" +#~ "Nie je možné vykonať aktualizáciu na systém %s: Úroveň nabitia batérie je " +#~ "príliš nízka" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "" +#~ "Nie je možné odstrániť aplikáciu %s: bolo požadované overenie totožnosti" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "" +#~ "Nie je možné odstrániť aplikáciu %s: overenie totožnosti nebolo platné" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Nie je možné odstrániť aplikáciu %s: nemáte dostatočné práva na " +#~ "odstránenie softvéru" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Nie je možné odstrániť aplikáciu %s: vyžaduje sa napájanie zo siete" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "" +#~ "Nie je možné odstrániť aplikáciu %s: Úroveň nabitia batérie je príliš " +#~ "nízka" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Zlyhala inštalácia súboru: bez podpory" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Zlyhala inštalácia: bez podpory" + +#~ msgid "AC power is required" +#~ msgstr "Požaduje sa napájanie zo siete" + +#~ msgid "Primary Menu" +#~ msgstr "Hlavné menu" + +#~ msgid "Restart Now" +#~ msgstr "Reštartovať teraz" + +#~ msgid "Find Out _More" +#~ msgstr "Z_istiť viac" + +#, c-format +#~ msgid "%s (needs attention)" +#~ msgstr "%s (vyžaduje pozornosť)" + +# GtkButton +#~ msgid "_Remove All" +#~ msgstr "O_dstrániť všetky" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "V tomto počítači neboli nainštalované žiadne aktualizácie." + +#~| msgid "An important OS update failed to be installed." +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Dôležitá aktualizácia softvéru je pripravená na inštaláciu." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Dôležité: dôležité aktualizácie softvéru čakajú." + +#~| msgid "Downloading firmware update…" +#~ msgid "Please download waiting software updates." +#~ msgstr "Stiahnite si čakajúce aktualizácie softvéru." + +#~ msgid "An important OS update failed to be installed." +#~ msgstr "Zlyhala inštalácia dôležitej aktualizácie operačného systému." + +#~ msgid "Looking for new updates…" +#~ msgstr "Vyhľadávajú sa nové aktualizácie…" + +#~ msgid "Setting up updates…" +#~ msgstr "Nastavujú sa aktualizácie…" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "Systém %s %s už viac nie je podporovaný." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "To znamená, že už neprijíma bezpečnostné aktualizácie." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Odporúča sa, aby ste vykonali aktualizáciu na novšiu verziu." + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "" +#~ "Na zistenie dostupnosti aktualizácií je potrebný prístup k internetu." + +#~ msgid "Checking…" +#~ msgstr "Kontroluje sa…" + +# GtkLabel +#~ msgid "Software is up to date" +#~ msgstr "Softvér je aktuálny" + +#~ msgid "Restart & Update" +#~ msgstr "Reštartovať a aktualizovať" + +#~ msgid "Update All" +#~ msgstr "Aktualizovať všetko" + +#~ msgid "Application Updates" +#~ msgstr "Aktualizácie aplikácií" + +#~ msgid "_Restart Now" +#~ msgstr "_Reštartovať teraz" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Aktualizácie budú použité po reštarte počítača." + +#, c-format +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Čaká sa na prevzatie distribúcie %s %s" + +#, c-format +#~ msgid "Downloading %s %s" +#~ msgstr "Preberá sa systém %s %s" + +#~ msgid "OS Updates" +#~ msgstr "Aktualizácie operačného systému" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Zahŕňa vylepšenia výkonu, stability a zvýšenia bezpečnosti." + +#~ msgid "Downloading featured images…" +#~ msgstr "Preberajú sa obrázky kategórie základnej výbavy…" + +#~ msgid "Endless OS" +#~ msgstr "Systém Endless OS" + +# title +#~ msgid "Failed to copy" +#~ msgstr "Kopírovanie zlyhalo" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Preberajú sa informácie o aktualizácii…" + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Preberá sa podpis aktualizácie firmvéru…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Preberajú sa metaúdaje aktualizácie firmvéru…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Preberajú sa hodnotenia aplikácií…" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS je služba poskytujúca používateľské recenzie aplikácií" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Povoliť repozitár s rozšíreniami Shellu prostredia GNOME" + +# GtkButton +#~ msgid "Select All" +#~ msgstr "Vybrať všetko" + +# GtkMenuItem +#~ msgid "Select None" +#~ msgstr "Zrušiť výber" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Kreslené postavy v nebezpečných situáciách" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Kreslené postavy v agresívnom konflikte" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Vyobrazené násilie zahŕňajúce kreslené postavy" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Postavy v nebezpečných situáciach ľahko odlíšiteľných od reality" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Postavy v agresívnom konflikte ľahko odlíšiteľnom od reality" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Vyobrazené násilie ľahko odlíšiteľné od reality" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Mierne skutočné postavy v nebezpečných situáciách" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Vyobrazenia skutočných postáv v agresívnom konflikte" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Vyobrazené násilie zahŕňajúce skutočné postavy" + +#~ msgid "No bloodshed" +#~ msgstr "Žiadne krviprelievanie" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Neskutočné krviprelievanie" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Skutočné krviprelievanie" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Vyobrazenia krviprelievania a zohavených častí tiel" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Znásilnenie alebo iné násilné sexuálne správanie" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Odkazy na alkoholické nápoje" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Požívanie alkoholických nápojov" + +#~ msgid "References to illicit drugs" +#~ msgstr "Odkazy na zakázané drogy" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Požívanie zakázaných drog" + +#~ msgid "References to tobacco products" +#~ msgstr "Odkazy na tabakové výrobky" + +#~ msgid "Use of tobacco products" +#~ msgstr "Požívanie tabakových výrobkov" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Občasná umelecká nahota" + +#~ msgid "Prolonged nudity" +#~ msgstr "Dlhotrvajúca nahota" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provokačné odkazy alebo vyobrazenia" + +# cmdline description +#~ msgid "Sexual references or depictions" +#~ msgstr "Sexuálne odkazy alebo vyobrazenia" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Vyobrazené sexuálne správanie" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Mierne alebo časte zneuctenie" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Stredne silné zneuctenie" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Silné alebo časté zneuctenie" + +#~ msgid "Slapstick humor" +#~ msgstr "Drsný humor" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgárny alebo kúpeľňový humor" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Sexuálny humor alebo humor pre dospelých" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Odpor voči špecifickej skupine ľudí" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Diskriminácia s následkami emočnej ujmy" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Jednoznačná diskriminácia založená na pohlaví, sexuálnej orientácii, rase " +#~ "alebo náboženstve" + +#~ msgid "Product placement" +#~ msgstr "Umiestnenie výrobku" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Jednoznačné odkazy na produkty špecifických značiek alebo označené " +#~ "obchodnou známkou" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "" +#~ "Používatelia sú vyzývaní na nákup špecifických položiek v skutočnom svete" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "" +#~ "Hazardovanie na náhodných podujatiach použitím žetónov alebo kreditov" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Hazardovanie s fiktívnymi peniazmi" + +#~ msgid "Gambling using real money" +#~ msgstr "Hazardovanie so skutočnými peniazmi" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Používatelia sú vyzývaní na darovanie skutočných peňazí" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Možnosť míňania skutočných peňazí v aplikácii" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Interakcie medzi používateľmi bez možnosti rozhovoru" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Moderované rozhovory medzi používateľmi" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Nekontrolovateľné zvukové alebo video rozhovory medzi používateľmi" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Zdieľanie používateľských mien alebo emailových adries zo sociálnych sietí" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Kontroluje sa najnovšia verzia aplikácie" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Sprístupnenie diagnostických údajov, ktoré neumožnia ostatným " +#~ "identifikovať používateľa" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Zdieľanie informácií, ktoré umožňujú ostatným identifikovať používateľa" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Zdieľanie fyzickej lokality ostatným používateľom" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Nepriame odkazy na homosexualitu" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Bozkávanie ľudí rovnakého pohlavia" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Nepriame odkazy na prostitúciu" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Priame odkazy na prostitúciu" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Grafické vyobrazenia aktu prostitúcie" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Nepriame odkazy na cudzoložstvo" + +#~ msgid "Direct references to adultery" +#~ msgstr "Priame odkazy na cudzoložstvo" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Grafické vyobrazenia aktu cudzoložstva" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Vyobrazenia alebo odkazy na historické znesvätenie" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Vyobrazenia ľudského znesvätenia modernej doby" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Grafické vyobrazenia znesvätenia modernej doby" + +#~ msgid "Visible dead human remains" +#~ msgstr "Viditeľné pozostatky mŕtvych ľudí" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Grafické vyobrazenia znesvätenia ľudských tiel" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Vyobrazenia alebo odkazy na historické otroctvo" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Vyobrazenia otroctva modernej doby" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Grafické vyobrazenie otroctva modernej doby" + +#~ msgid "General" +#~ msgstr "Všeobecné" + +#~ msgid "ALL" +#~ msgstr "VŠETCI" + +# GtkLabel +#~ msgid "Mature" +#~ msgstr "Dospievajúci" + +#~ msgid "Teen" +#~ msgstr "Mladiství" + +#~ msgid "Everyone 10+" +#~ msgstr "Každý s vekom nad 10 rokov" + +#~ msgid "Everyone" +#~ msgstr "Každý" + +#~ msgid "Early Childhood" +#~ msgstr "Skoré detstvo" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Neznáma" + +#~ msgid "this website" +#~ msgstr "túto webovú stránku" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Poďme nakupovať" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Odstránený" + +#~ msgid "Format" +#~ msgstr "Formát" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Naozaj chcete odstrániť %s?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Pre používanie nových zásuvných modulov musí byť aplikácia reštartovaná." + +#~ msgid "Security Updates Pending" +#~ msgstr "Čakajúce bezpečnostné aktualizácie" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Odporúča sa, aby ste bezpečnostné aktualizácie nainštalovali ihneď" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Dôležité aktualizácie operačného systému a aplikácií sú pripravené na " +#~ "inštaláciu" + +#~ msgid "View" +#~ msgstr "Zobraziť" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Včera o %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Včera o %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Pred troma dňami" + +#~ msgid "Four days ago" +#~ msgstr "Pred štyrmi dňami" + +#~ msgid "Five days ago" +#~ msgstr "Pred piatimi dňami" + +#~ msgid "Six days ago" +#~ msgstr "Pred šiestimi dňami" + +#~ msgid "Two weeks ago" +#~ msgstr "Pred dvoma týždňami" + +#~ msgid "About %s" +#~ msgstr "O aplikácii %s" + +#~ msgid "Extension Settings" +#~ msgstr "Nastavenia rozšírenia" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Rozšírenia sú použité na vlastné riziko. Ak pozorujete akékoľvek problémy " +#~ "so systémom, odporúča sa zakázať ich." + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Rozšírenia pre Shell" + +#~ msgid "GNOME" +#~ msgstr "GNOME" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Repozitár s rozšíreniami pre Shell prostredia GNOME" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Preberajú sa metaúdaje rozšírenia pre Shell…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Rozšírenie pre Shell prostredia GNOME" + +#~ msgid "Show the folder management UI" +#~ msgstr "Zobraziť používateľské rozhranie správy priečinkov" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +# GtkToggleButton +#~ msgid "_All" +#~ msgstr "_Všetko" + +#~ msgid "Folder Name" +#~ msgstr "Názov priečinka" + +#~ msgid "_Add" +#~ msgstr "_Pridať" + +# GsAppFolderDialog title, GtkLabel +#~ msgid "Add to Application Folder" +#~ msgstr "Pridanie do priečinka s aplikáciami" + +# cmdline description +#~ msgid "Show profiling information for the service" +#~ msgstr "Zobrazí profilovacie informácie pre službu" + +#~ msgid "To continue you need to sign in." +#~ msgstr "Pre pokračovanie sa musíte prihlásiť." + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Pre pokračovanie sa musíte prihlásiť do služby %s." + +#~ msgid "Email address" +#~ msgstr "Emailová adresa" + +#~ msgid "I have an account already" +#~ msgstr "Už mám účet" + +#~ msgid "I want to register for an account now" +#~ msgstr "Chcem si teraz zaregistrovať účet" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Prihlásiť ma automaticky nabudúce" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Zadajte váš jednorázový pin pre dvojfaktorové overenie totožnosti." + +#~ msgid "PIN" +#~ msgstr "PIN" + +# headerbar title +#~ msgid "Authenticate" +#~ msgstr "Overenie totožnosti" + +#~ msgid "Continue" +#~ msgstr "Pokračovať" + +# GtkLabel +#~ msgid "Top Rated" +#~ msgstr "Najlepšie hodnotené" + +#~ msgid "CSS validated OK!" +#~ msgstr "Overovanie CSS prebehlo v poriadku!" + +# title +#~ msgid "Failed to load file" +#~ msgstr "Zlyhalo načítanie súboru" + +#~ msgid "Unsaved changes" +#~ msgstr "Neuložené zmeny" + +#~ msgid "Merge documents" +#~ msgstr "Zlúčiť dokumenty" + +#~ msgid "Throw away changes" +#~ msgstr "Zahodiť zmeny" + +# dialog title +#~ msgid "Open AppStream File" +#~ msgstr "Otvorenie súboru AppStream" + +#~ msgid "_Save" +#~ msgstr "_Uložiť" + +#~ msgid "%s banner design deleted." +#~ msgstr "Návrh pútača aplikácie %s bol odstránený." + +#~ msgid "Banner design deleted." +#~ msgstr "Návrh pútača bol odstránený." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Zoznam aplikácií obsahuje neuložené zmeny." + +#~ msgid "Use verbose logging" +#~ msgstr "Použije rozsiahle zaznamenávanie" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Nástroj na návrh pútačov aplikácie Softvér prostredia GNOME" + +#~ msgid "No Designs" +#~ msgstr "Žiadne návrhy" + +#~ msgid "Error message here" +#~ msgstr "Sem patrí chybová hláška" + +# GtkLabel +#~ msgid "Category Featured" +#~ msgstr "Kategória Softvér základnej výbavy" + +#~ msgid "Undo" +#~ msgstr "Vrátiť späť" + +#~ msgid "Banner Designer" +#~ msgstr "Nástroj na návrh pútačov" + +#~ msgid "New Banner" +#~ msgstr "Nový pútač" + +#~ msgid "Import from file" +#~ msgstr "Importovať so súboru" + +#~ msgid "Export to file" +#~ msgstr "Exportovať do súboru" + +#~ msgid "Spacing" +#~ msgstr "Rozostupy" + +#~ msgid "The amount of space between children" +#~ msgstr "Veľkosť priestoru medzi potomkami" + +#~ msgid "Click on items to select them" +#~ msgstr "Kliknutím na položky ich vyberiete" + +# GtkButton +#~ msgid "Select" +#~ msgstr "Vybrať" + +# GsAppFolderDialog title, GtkLabel +#~ msgid "_Add to Folder…" +#~ msgstr "_Pridať do priečinka…" + +#~ msgid "_Move to Folder…" +#~ msgstr "P_resunuť do priečinka…" + +# title +#~ msgid "Software catalog is being loaded" +#~ msgstr "Prebieha načítavanie katalógu softvéru" + +#~ msgid "_About" +#~ msgstr "_O programe" + +#~ msgid "_Quit" +#~ msgstr "_Ukončiť" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "" +#~ "Aplikácia %s bude nainštalovaná a bude vám účtovaný poplatok vo výške %s." + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Informácie o formáte %s, ako aj o možnostiach získania kodeku na " +#~ "prehranie tohto formátu, môžete nájsť na webovej stránke." + +#~ msgid "A$%.2f" +#~ msgstr "%.2f A$" + +#~ msgid "C$%.2f" +#~ msgstr "%.2f C$" + +#~ msgid "CN¥%.2f" +#~ msgstr "%.2f CN¥" + +#~ msgid "€%.2f" +#~ msgstr "%.2f €" + +#~ msgid "£%.2f" +#~ msgstr "%.2f £" + +#~ msgid "¥%.2f" +#~ msgstr "%.2f ¥" + +#~ msgid "NZ$%.2f" +#~ msgstr "%.2f NZ$" + +#~ msgid "₽%.2f" +#~ msgstr "%.2f ₽" + +#~ msgid "US$%.2f" +#~ msgstr "%.2f US$" + +#~ msgid "%s %f" +#~ msgstr "%2$f %1$s" + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Kým sa nevyrieši tento problém, nebude možné inštalovať softvér." + +#~ msgid "For more information, visit %s." +#~ msgstr "Pre viac informácií navštívte adresu %s." + +#~ msgid "Downloading new updates…" +#~ msgstr "Preberajú sa nové aktualizácie…" + +# GtkButton +#~ msgid "Restart & _Install" +#~ msgstr "Reštartovať a _inštalovať" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "" +#~ "Navrhuje pútače aplikácií základnej výbavy pre Softvér prostredia GNOME" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;Softvér;App;" + +#~ msgid "Getting runtime source…" +#~ msgstr "Získava sa zdroj prostredia…" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "Limba umožňuje vývojárom jednoduché vytvárania softvérových balíkov" + +#~ msgid "Downloading application page…" +#~ msgstr "Preberá sa stránka s aplikáciami…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Platforma špičkovej zábavy od spoločnosti Valve" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Zoznam zdrojov navyše, ktoré boli predošle povolené" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Zoznam zdrojov, ktoré boli predošle povolené pri inštalovaní aplikácií " +#~ "tretích strán." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Zobraziť neslobodný softvér vo výsledkoch vyhľadávaní" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "Zoznam neslobodných zdrojov, ktoré môžu byť voliteľne povolené" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Prednastavené herné interakcie medzi hráčmi bez možnosti rozhovoru" + +#~ msgid "" +#~ "Provides access to additional software, including web browsers and games." +#~ msgstr "" +#~ "Poskytuje prístup k dodatočnému softvéru, vrátane webových prehliadačov a " +#~ "hier." + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Povoliť zdroje uzavretého softvéru?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Nie sú nainštalované žiadne aplikácie alebo doplnky. Ostatný softvér ale " +#~ "stále môže byť nainštalovaný." + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "" +#~ "Obvykle obsahuje obmedzenia spojené s používaním a prístupom k zdrojovému " +#~ "kódu." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Zdroje uzavretého softvéru" + +# GtkButton +#~ msgid "Remove Source" +#~ msgstr "Odstrániť zdroj" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Zdroje softvéru môžu byť prevzaté z internetu. Umožnia vám pristupovať k " +#~ "dodatočnému softvéru, ktorý nie je poskytovaný operačným systémom %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Odstránením zdroja bude tiež odstránený všetok softvér, ktorý ste z neho " +#~ "nainštalovali." + +#~ msgid "No software installed from this source" +#~ msgstr "\"Z tohto zdroja nie je nainštalovaný žiadny softvér" + +#~ msgid "Installed from this Source" +#~ msgstr "Nainštalovaný z tohto zdroja" + +#~ msgid "Last Checked" +#~ msgstr "Posledná kontrola" + +#~ msgid "Added" +#~ msgstr "Pridaný" + +# GtkButton +#~ msgid "Website" +#~ msgstr "Webová stránka" + +#~ msgid "“%s” [%s]" +#~ msgstr "„%s“ [%s]" + +# GtkToggleButton +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +#~ msgid "Total" +#~ msgstr "Celkom" + +#~ msgid "Other Updates" +#~ msgstr "Ostatné aktualizácie" + +#~ msgid "Installation of %s failed." +#~ msgstr "Inštalácia softvéru %s zlyhala." + +#~ msgid "Removal of %s failed." +#~ msgstr "Odstránenie softvéru %s zlyhalo." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Prosím, uistite sa, že máte prístup na internet a skúste to znovu." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Prosím, uvoľnite nejaký priestor a skúste to znovu." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Ak problém pretrváva, kontaktuje vášho poskytovateľa softvéru." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Žiadne" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Žiadne" + +# GtkToggleButton +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +# GtkToggleButton +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Všetko" + +# GtkLabel +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Softvér základnej výbavy" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronómia" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Chémia" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Zdroje softvéru vám umožňujú získať dodatočný softvér." + +#~ msgid "3rd party" +#~ msgstr "od tretej strany" + +#~ msgid "nonfree" +#~ msgstr "neslobodný" + +#~ msgid "shell extension" +#~ msgstr "rozšírenie pre shell" + +#~ msgid "_Installing" +#~ msgstr "_Inštaluje sa" + +#~ msgid "_Removing" +#~ msgstr "O_dstraňuje sa" + +#~ msgid " or " +#~ msgstr " alebo " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Neznáma" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Tento softvér pochádza od tretích strán." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Tento softvér pochádza od tretích strán a môže obsahovať neslobodné " +#~ "súčasti." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Tento softvér môže obsahovať neslobodné súčasti." + +#~ msgid "non-free" +#~ msgstr "neslobodný" + +#~ msgid "One Star" +#~ msgstr "Jedna hviezdička" + +#~ msgid "Two Stars" +#~ msgstr "Dve hviezdičky" + +#~ msgid "Three Stars" +#~ msgstr "Tri hviezdičky" + +#~ msgid "Four Stars" +#~ msgstr "Štyri hviezdičky" + +#~ msgid "Five Stars" +#~ msgstr "Päť hviezdičiek" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Vypočítava sa…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Neznáma" + +# GtkButton +#~ msgid "_History" +#~ msgstr "_História" + +# GtkLabel +#~ msgid "Size" +#~ msgstr "Veľkosť" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Odporúčané kancelárske aplikácie" + +#~ msgid "No AppStream data found" +#~ msgstr "Nenašli sa žiadne údaje toku AppStream" + +#~ msgid "Audio" +#~ msgstr "Audio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Upravovanie" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Databázy" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Napaľovanie diskov" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Amatérske rádio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Zmiešavače" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Hudba" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Nahrávače" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Sekvencéry" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Rádiá" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Zostavovanie" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Databázy" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "Integrované prostredia IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Profilovanie" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Vývoj webu" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biológia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Počítačová veda" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Vizualizácia údajov" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Ekonomika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Elektrina" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Strojníctvo" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geológia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geoveda" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "História" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Spracovanie obrázkov" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Literatúra" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Mapy" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Hudba" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Numerická analýza" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Súbežné spracovanie údajov" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fyzika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Spiritualita" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Strieľacie" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulačné" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Športové" + +#~ msgid "Graphics" +#~ msgstr "Grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "Rozpoznávanie znakov OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Publikovanie" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Rastrová grafika" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Spojenie vytáčaním" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Informačný kanál" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Prenos súborov" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Amatérske rádio" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Priama komunikácia" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "Klienti IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Monitorovanie" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonovanie" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Vývoj webu" + +#~ msgid "Office" +#~ msgstr "Kancelária" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Graf" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Správa kontaktov" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Slovník" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Plávajúci graf" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografia" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Správa projektov" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Publikovanie" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Tabuľkový zošit" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Prehliadač" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Umenie" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Umelá inteligencia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronómia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biológia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Chémia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Počítačová veda" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Konštrukcia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Vizualizácia údajov" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Ekonomika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Elektrina" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Strojníctvo" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geológia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geoveda" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "História" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humanita" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Spracovanie obrázkov" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Jazyky" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Literatúra" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Mapy" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Zdravotníctvo" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Numerická analýza" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Súbežné spracovanie údajov" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fyzika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Spiritualita" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Šport" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulátor" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Správca súborov" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Súborové nástroje" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Monitorovanie" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Zabezpečenie" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Emulátor terminálu" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Uľahčenie prístupu" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Archivácia" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Kalkulačka" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Hodiny" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Komprimácia" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Súborové nástroje" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Mapy" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Spiritualita" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Nástroje na telefonovanie" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Upravovanie" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Databáza" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Napaľovanie diskov" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Nahrávače" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "Televízia" + +#~ msgid "A previous update was unfinished." +#~ msgstr "Predchádzajúca aktualizácia nebola dokončená." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "Aktualizáciu sa nepodarilo nainštalovať. Toto často býva spôsobené " +#~ "samotnou aktualizáciou. Prosím, počkajte na ďalšiu aktualizáciu a skúste " +#~ "to znovu." + +#~ msgid "Internet Only Application" +#~ msgstr "Iba internetové aplikácie" + +# GsAppFolderDialog title, GtkLabel +#~ msgid "Enter GApplication service mode" +#~ msgstr "Vstúpi do servisného režimu GApplication" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Aktualizácia nebola správnym spôsobom podpísaná." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Bola vyžiadaná aktualizácia bez prístupu k sieti, no žiadne balíky " +#~ "nevyžadujú aktualizáciu." + +#~ msgid "No space was left on the drive." +#~ msgstr "Na jednotke nebol dostatok miesta." + +#~ msgid "An update failed to install correctly." +#~ msgstr "Zlyhala správna inštalácia aktualizácie." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Aktualizácia bez prístupu k sieti zlyhala neočakávaným spôsobom." + +#~ msgid "" +#~ "Depending on your country of residence, installing it could make you " +#~ "liable to prosecution." +#~ msgstr "" +#~ "V závislosti od krajiny kde žijete, inštalácia tohto softvéru môže viesť " +#~ "k možnému trestnému stíhaniu." + +#~ msgid "If you are uncertain about this, you should obtain legal advice." +#~ msgstr "" +#~ "Ak nie ste si o tomto istý, mali by ste vyhľadať právne poradenstvo." + +#~ msgid "Do you want to enable it?" +#~ msgstr "Chcete ho povoliť?" diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..0a7cd86 --- /dev/null +++ b/po/sl.po @@ -0,0 +1,6434 @@ +# Slovenian translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Martin Srebotnjak , 2023,2024,2025. +# Matej Urbančič , 2013–2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-01-30 17:45+0000\n" +"PO-Revision-Date: 2025-02-01 09:56+0100\n" +"Last-Translator: Martin Srebotnjak \n" +"Language-Team: Slovenščina \n" +"Language: sl_SI\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-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Poedit 2.2.1\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programi" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Namesti in posodobi programe" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Program omogoča iskanje, nameščanje novih programov in sistemskih razširitev " +"ter odstranjevanje obstoječih, nameščenih programov." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Program za nameščanje programske opreme namizja GNOME predstavlja " +"priljubljene programe s kratkimi opisi in zaslonskimi posnetki. Programe je " +"mogoče iskati ali pa jih pobrskati po seznamih. Obenem omogoča tudi " +"posodabljanje sistema s posodobitvami brez povezave." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Okno predogleda" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Okno podrobnosti" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Okno nameščenih programov" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Okno posodobitev" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Podrobnosti posodobitve" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2685 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Projekt GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Preizkusi ključ akmods v vmesniku Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Preverjanje pristnosti je potrebno za preizkušanje ključa akmods v vmesniku " +"Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Vpiši ključ akmods v Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Preverjanje pristnosti je potrebno za vpis ključa akmods v Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Preizkusi ključ DKMS v vmesniku UEFI Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" +"Preverjanje pristnosti je potrebno za preizkušanje ključa DKMS v vmesniku " +"Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Vpiši ključ DKMS v Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Preverjanje pristnosti je potrebno za vpis ključa DKMS v Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Namesti pretočno datoteko na sistemsko mesto" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Poteka nameščanje pretočne datoteke na sistemsko mesto" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Seznam skladnih projektov" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"To je seznam skladnih projektov, ki so na voljo, kot so GNOME, KDE in XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Ali naj bodo posodobitve upravljane z orodjem Programi GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Če možnost ni omogočena, program skrije okno posodobitev in ne izvaja " +"samodejnih posodobitev, niti ne obvešča o novostih." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Samodejno prejmi in namesti posodobitve" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Izbrana možnost omogoča, da bodo programske posodobitve v ozadju samodejno " +"prejete in nato nameščene, če posodobitev ne zahteva ponovnega zagona " +"sistema." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Obvesti uporabnika o posodobitvah programske opreme" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Izbrana možnost omogoča, da program obvesti uporabnika o posodobitvah, ko ta " +"na napravi ni bil dejaven." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Ali naj bodo posodobitve samodejno osvežene tudi na plačljivih povezavah" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Če je možnost omogočena, program v ozadju samodejno osveži seznam " +"programskih paketov, ne glede na vrsto vzpostavljene povezave (prejemanje " +"metapodatkov, posodobitev in drugih virov lahko vpliva na stroške " +"uporabnika)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Ali je to prvi zagon orodja za upravljanje programske opreme GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Ob programu pokaži tudi oceno z zvedzicami" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtrira programe na osnovi razvojne veje na oddaljenem gostitelju" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Pred namestitvijo se pri lastniški programski opremi pokaže opozorilo" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Pred namestitvijo lastniške programske opreme se pokaže opozorilo. " +"Nastavitev določa način prikazovanja sporočila." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Časovni žig zadnjega preverjanja za posodobitve" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Časovni žig zadnjega preverjanja za posodobitve" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Časovni žig zadnjega preverjanja za posodobitve" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Časovni žig prve varnostne posodobitve, ki je bila rešena po namestitvi" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Časovni žig zadnje posodobitve" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Čas za overjanje v sekundah, po katerem program preveri veljavnost prikazane " +"zaslonske slike" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Izbor večje vrednosti pomeni manjše število preverjanj podatkov na " +"oddaljenih strežnikih, hkrati pa pomeni tudi odzivnost zaslonskih posnetkov, " +"ki jih vidi uporabnik. Vrednost 0 pomeni, da program nikoli ne preveri, ali " +"je slika že v predpomnilniku na strežniku." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Strežnik za objavo ocen in mnenj o programski opremi" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Najmanjša ocena karme za objavljanje ocen in mnenj" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "" +"Mnenja uporabnikov, s karmo, manjšo od te vrednosti, ne bodo uporabljena." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Seznam uradnih virov, opredeljenih kot programska oprema tretjih oseb" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"Seznam zahtevanih skladišč, ki jih ni mogoče onemogočiti ali odstraniti" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Seznam uradnih virov, opredeljenih kot prosta programska oprema" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Naslov URL dovoljenja, ki mora biti navedeno, da se program opredeli kot " +"prosto programsko opremo" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Namesti programe za vse uporabnike v sistemu, kjer je to mogoče" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Dovoli dostop do nastavitev programskih virov" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Ponudi tudi posodobitve za predobjave" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Pokaži vidne oznake, ki kažejo, da programska oprema ni brezplačna" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Pokaže nameščeno velikost programa na seznamu nameščenih programov" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "" +"Naslov URI, prek katerega je dostop do opredelitev plačljive in lastniške " +"programske opreme" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Seznam naslovov URL, ki kažejo na datoteke programov appstream, ki bodo " +"prejete v mapo swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Namestitev datotek AppStream na sistemsko mesto za vse uporabnike: Če " +"možnost ni izbrana, so datoteke nameščene na neobičajno mesto v mapo " +"$XDG_DATA_HOME/swcatalog/xml." + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Prednostni vrstni red zapisov pakiranja, z bolj pomembnimi navedenimi " +"najprej. Prazna vrednost pomeni privzeti vrstni red. Izpuščeni zapisi so " +"nanizani nazadnje. Primer zapisov pakiranja so deb, flatpak, rpm, snap. " +"Zapise lahko po potrebi navedete z imenom izvora, ločene s podpičji, npr. " +"»flatpak:flathub«." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Časovni žig zadnjega poskusa odstranjevanja neuporabljenih izvajalnih " +"paketov Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Izbrana možnost omogoči prikaz le programov s prostimi dovoljenji in skrije " +"vse lastniške programe." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Izbrana možnost omogoči prikaz le programov, katerih istovetnost razvijalcev " +"je bila overjena in potrjena." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Časovni žig zadnjih prejetih zgodovinskih posodobitev." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Niz, ki shranjuje podatke ID programa gnome-online-account za prijavo" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Sistemski namestilnik programske opreme za GNOME prek AppStream" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Razčlenjevanje argumentov ukazne vrstice je spodletelo" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Določiti je treba natanko eno ime datoteke" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Za zagon programa so zahtevana skrbniška dovoljenja" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Poizvedba o vrsti vsebine za je spodletela: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Premikanje je spodletelo: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Nameščanje programske opreme" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Namesti izbrano programsko opremo v sistem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "‧Risano nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Ni podatkov o risanem prikazovanju nasilja" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "‧Fantazijsko nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Ni podatkov o fantazijskem prikazovanju nasilja" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "‧Realistično nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Ni podatkov o realističnem prikazovanju nasilja" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "‧Prelivanje krvi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Ni podatkov o prikazovanju prelivanja krvi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "‧Spolno nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Ni podatkov o prikazovanju spolnega nasilja" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "‧Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Ni podatkov o omenjanju alkoholnih pijač" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "‧Droge" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Ni podatkov o omenjanju prepovedanih drog" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "‧Tobak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Ni podatkov o omenjanju tobačnih izdelkov" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "‧Golota" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Ni podatkov o prikazu kakršnekoli golote" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "‧Spolne teme" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Ni podatkov o kakršnemkoli sklicevanju ali prikazovanju spolnosti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "‧Preklinjanje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Ni podatkov o kletvicah in preklinjanju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "‧Nekorekten humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Ni podatkov o neprimernem humorju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "‧Diskriminacija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Ni podatkov o kakršnemkoli diskriminatornem namigovanju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "‧Oglaševanje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Ni podatkov o kakršnemkoli oglaševanju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "‧Igre na srečo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Ni podatkov o sklicevanju na igre na srečo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "‧Nakupovanje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Ni podatkov o sklicevanju na zapravljanje" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "‧Klepet med uporabniki" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Ni podatkov o možnostih klepeta z drugimi uporabniki" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "‧Zvočni klepet med uporabniki" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Ni podatkov o možnostih pogovora z drugimi uporabniki" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "‧Podrobnosti stikov" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Ni podatkov o možnosti objavljanja uporabniških imen družbenih omrežij ali " +"elektronskih naslovov" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "‧Določevalne podrobnosti" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Ni podatkov o možnostih objavljanja uporabniških podrobnosti tretjim osebam" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "‧Objavljanje mesta" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Ni podatkov o možnosti objavljanja geolokacijskih podatkov drugim uporabnikom" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "‧Homoseksualnost" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Ni podatkov o sklicevanju na homoseksualnost" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "‧Prostitucija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Ni podatkov o sklicevanju na prostitucijo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "‧Nezvestoba" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Ni podatkov o sklicevanju na nezvestobo" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "‧Spolno izraženi posamezniki" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Ni podatkov o spolno izraženim lastnostih likov" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "‧Skrunitev" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Ni podatkov o sklicevanju na skrunjenje človeškega telesa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "‧Ostanki človeških teles" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Ni podatkov o prikazovanju ostankov mrtvih ljudi" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "‧Suženjstvo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Ni podatkov o sklicevanju na suženjstvo" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Ni omenjanja prepovedanih drog" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Ne vključuje preklinjanja, žaljivk in drugih vrst ostrega jezika" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Ne vključuje oglasov ali napeljevanja na kupovanje" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Ne vključuje golote ali spolnosti" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Ne vključuje nenadzorovane možnosti klepeta med uporabniki" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Ne vključuje nasilja" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "‧Droge" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Ostro jezikovno izražanje" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "‧Denar" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "‧Družbeno" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "‧Nasilje" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Vse" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "Program %s nima podatka o starostni omejitvi" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "Progam %s je primeren za vse uporabnike" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "Progam %s je primeren za malčke" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "Progam %s je primeren za majhne otroke" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "Progam %s je primeren za otroke" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "Progam %s je primeren za najstnike" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "Progam %s je primeren za odrasle" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "Progam %s je primeren za skupino %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Ocena starosti" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Kako prispevati manjkajoče podrobnosti" + +#: lib/gs-app.c:6367 +msgid "Local file" +msgstr "Krajevna datoteka" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6386 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6463 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paket" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Na čakanju" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Namestitev na čakanju" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Odstranitev na čakanju" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Nameščanje" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Odstranjevanje" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Prejemanje" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1047 +#: src/gs-details-page.c:1082 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Namesti" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1167 +msgid "_Uninstall…" +msgstr "_Odstrani namestitev …" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Omrežje" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Dovoljeno je sporočanje prek omrežja" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Sistemske storitve" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Dovoljen je dostop do storitev D-Bus sistemskega vodila" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Storitve seje" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Dovoljen je dostop do storitev D-Bus vodila seje" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Naprave" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Lahko dostopa do poljubnih naprav, kot so spletne kamere" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Lahko dostopa do vhodnih naprav" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Lahko dostopa do mikrofona in predvaja zvok" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Omogočen je dostop do sistemskih datotek naprave" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Zaslonska vsebina" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Omogočen je dostop do vsebine zaslona" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Osebna mapa" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Omogočeno je pregledovanje, urejanje in ustvarjanje datotek" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Omogočeno je pregledovanje datotek" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Datotečni sistem" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Mapa prejemanja" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Nastavitve" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Dovoljeno pregledovati in spreminjati nastavitve" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Opuščen zaslonski sistem" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Uporablja star, ne-varen zaslonski sistem" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Izvajanje v peskovniku mimo varnega okolja" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "" +"Omogoča izvajanje v peskovniku mimo varnega okolja kot obvod vseh vrst " +"omejitev" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Opis posodobitve ni na voljo." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Posodobi podrobnosti" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Zahteva dodatna dovoljenja" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Neveljavni podatki o ocenah, prejeti s strežnika" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2405 +msgid "Could not communicate with ratings server" +msgstr "Ni bilo mogoče komunicirati s strežnikom za ocenjevanje" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Mnenja" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Za ta program še ni nobene ocene." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Ni še vpisanih ocen" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Zgodovina različice" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novo v različici %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Različica %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Za to objavo ni podrobnosti" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e. %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Začetni zagon je lahko prikaz »posodobitev«, »posodobljenih«, »nameščenih« " +"ali »pregleda«." + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "NAČIN" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Poišči program" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "POIŠČI" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Pokaži podrobnosti programa (prek številke ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Pokaži podrobnosti programa (prek imena paketa)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "IME PAKETA" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Namesti programa (prek številke ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Odstrani namestitev programa (z uporabo številke ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Odpri krajevno namestitveno datoteko" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "IMEDATOTEKE" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Vrsta odziva, ki je pričakovan za to dejanje: možnost iso »brez«, »obvesti« " +"in »polno«" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKCIJA" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Pokaži krajevne metapodatke oziroma datoteko appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Omogoči podroben izpis razhroščevanja (iz delujočega primerka, če je že " +"zagnan)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Namesti vse posodobitve v ozadju" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Pokaži nastavitve" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Končaj izvajanje zagnanega primerka" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Prednostno išči krajevne datotečne vire" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Pokaži podatke različice" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Avtorske pravice © 2016–2023 Skupnost GNOME Software" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Matej Urbančič " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Za ta program podrobnosti niso na voljo." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Velikost namestitve" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Vključuje %s podatkov in %s predpomnilnika" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Vključuje %s podatkov" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Vključuje %s predpomnilnika" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Uporaba podatkov in predpomnilnika ni znana" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Velikost prejema" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Ne zahteva dodatnih sistemskih namestitev" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Zahteva neznano velikost dodatnih sistemskih namestitev" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Zahteva %s prostora za dodatne sistemske namestitve" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Velikost ni znana" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Ni posebnih zahtev" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Zahteva dostop do omrežja" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Uporablja sistemske storitve" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Uporablja storitve seje" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Uporablja strojno opremo" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Lahko dostopa do sistemskih naprav" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Bere in zapisuje vse podatke" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Bere vse podatke" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Bere in zapisuje v mapo za prejem datotek" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Bere mapo za prejem datotek" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Omogočen je dostop do nekaterih posebnih datotek" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Uporablja in spreminja nastavitve uporabnika" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Uporablja opuščen zaslonski sistem" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Zahteva dovoljenja po potrebi" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Razvijalec programa je preverjen" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Usklajeno s ponudnikom distribucije" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Usklajeno s %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "S podporo tretjih virov" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Nameščena programska oprema ni več podprta." + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Programska koda je odprta za pregled" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Neznano dovoljenje" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Lastniška programska koda" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Posebno dovoljenje" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Posebna dovoljenja" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Varno" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Verjetno varno" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Pogojno nevarno" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Nevarno" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Le za mobilno" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Le za male zaslone" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Le za namizja" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Le za velike zaslone" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Velikost zaslona ne ustreza" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Ne podpira trenutno nastavljene velikosti zaslona" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Zahteva večdotični zaslon" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Zahteva tipkovnico" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Zahteva miško" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Zahtevana je igralna konzola" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Zahteva uporabo igralne konzole" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Prilagodljivo" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Deluje na pametnih telefonih, tabličnih in namiznih računalnikih" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Najverjetneje zahteva uporabo miške in tipkovnice" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Deluje na namiznih in prenosnih računalnikih" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Program ne vsebuje nobene starostno pogojene vsebine" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Ni podatkov o morebitni starostno pogojeni vsebini" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Obiščite stran projekta" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Namesti …" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Prekliči" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Namesti" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Prejmi" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Posodobi" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Odstrani namestitev …" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Odstranjevanje namestitve" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritična posodobitev" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Naprave med posodabljanjem ni mogoče uporabljati." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Vir: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Preimenovano iz %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Ne prejema več posodobitev" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritična posodobitev" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Nameščeno" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Sodelujte pri prevajanju %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"Program %s je zasnovala, razvila in prevaja mednarodna skupnost " +"prostovoljcev.\n" +"\n" +"Ker še ni na voljo v vašem jeziku, se lahko tudi sami vključite in " +"sodelujete pri pripravi prevoda." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Prevodi" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Spletišče za prevajanje" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Prijavno ime in geslo za %s (območje %s)." + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Zahtevana je prijava" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:660 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Prekliči" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Prijava" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Uporabnik" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Geslo" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Drugo" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Vse" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Novosti v ospredju" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Uredniška izbira" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Novo in Posodobljeno" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Izbor s spleta" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Druga programska oprema" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s (nameščeno)" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Za uveljavitev sprememb je treba ponovno zagnati računalnik." + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Program je pripravljen za uporabo." + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Sistemske posodobitve so nameščene." + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Nedavno nameščene posodobitve so pripravljene za pregled." + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:828 +msgid "Restart" +msgstr "Ponoven zagon" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Zaženi" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Ali želite namestiti programsko opremo?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Ali naj bo nameščena programska oprema tretjih virov?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Ali želite omogočiti programsko shrambo?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Ali naj bodo omogočeni tudi programski viri tretjih oseb?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s ni prosta programska oprema, ponuja pa jo ponudnik “%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "Program %s ponuja ponudnik »%s«." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Ta programski vir mora biti omogočen za nadaljevanje namestitve." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Morda v nekaterih državah nameščanje ali uporaba %s ni dovoljena." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Morda v nekaterih državah nameščanje ali uporaba teh kodekov ni dovoljena." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_Ne opozori več" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Omogoči in _namesti" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Podrobne napake upravljalnika paketov so:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Podrobnosti" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Zapri" + +#: src/gs-common.c:578 +msgid "Details copied to clipboard" +msgstr "Podrobnosti so kopirane v odložišče" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:652 +msgid "_Accept" +msgstr "_Sprejmi" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:803 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Posodobitve so nameščene" +msgstr[1] "Posodobitev je nameščena" +msgstr[2] "Posodobitvi sta nameščeni" +msgstr[3] "Posodobitve so nameščene" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:813 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Programi so bili odstranjeni" +msgstr[1] "Program je bil odstranjen" +msgstr[2] "Programa sta bila odstranjena" +msgstr[3] "Programi so bili odstranjeni" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:819 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Spremembe ne bodo uveljavljene do ponovnega zagona" +msgstr[1] "Spremembe ne bodo uveljavljene do ponovnega zagona" +msgstr[2] "Spremembe ne bodo uveljavljene do ponovnega zagona" +msgstr[3] "Spremembe ne bodo uveljavljene do ponovnega zagona" + +#. TRANSLATORS: button text +#: src/gs-common.c:826 +msgid "Not Now" +msgstr "Ne zdaj" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:921 +msgid "Today" +msgstr "Danes" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:924 +msgid "Yesterday" +msgstr "Včeraj" + +#: src/gs-common.c:926 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Pred %d dnevi" +msgstr[1] "Pred %d dnem" +msgstr[2] "Pred %d dnevoma" +msgstr[3] "Pred %d dnevi" + +#: src/gs-common.c:930 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Pred %d tedni" +msgstr[1] "Pred %d tednom" +msgstr[2] "Pred %d tednoma" +msgstr[3] "Pred %d tedni" + +#: src/gs-common.c:934 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Pred %d meseci" +msgstr[1] "Pred %d mesecem" +msgstr[2] "Pred %d mesecema" +msgstr[3] "Pred %d meseci" + +#: src/gs-common.c:938 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Pred %d leti" +msgstr[1] "Pred %d letom" +msgstr[2] "Pred %d letoma" +msgstr[3] "Pred %d leti" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:995 +msgid "Just now" +msgstr "Ravnokar" + +#: src/gs-common.c:997 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Pred %d minutami" +msgstr[1] "Pred %d minuto" +msgstr[2] "Pred %d minutama" +msgstr[3] "Pred %d minutami" + +#: src/gs-common.c:999 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Pred %d urami" +msgstr[1] "Pred %d uro" +msgstr[2] "Pred %d urama" +msgstr[3] "Pred %d urami" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1362 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Vsi" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Novosti" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D-grafika" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografija" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Preiskovanje" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorska grafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Pregledovalniki" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Ustvarjanje in urejanje glasbe" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Predvajalniki glasbe" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Vsi" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Novosti" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Koledar" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Podatkovna zbirka" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finance" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Urejanje besedila" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Urejevalniki besedila" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Spletni brskalniki" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Vsi" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Novosti" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Akcijske igre" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Pustolovščine" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkadne igre" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Bloki" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Tabla" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Karte" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Posnemovalniki" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Za otroke" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logika" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Igra vlog" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Šport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strateške igre" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Vsi" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Novosti" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Klepet" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Vsi" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Novosti" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Umetna inteligenca" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomija" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kemija" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Jeziki" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Novice" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Umetnost" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografije" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Stripi" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fikcija" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Zdravje" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Zgodovina" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Življenjski slog" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Šport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Vsi" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Novosti" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Razhroščevalniki" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "Naprave IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeki" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Gonilniki strojne opreme" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Pisave" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Vhodni viri" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Jezikovni paketi" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Jezikovno prilagajanje" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Ustvarjanje" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Delo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Predvajalniki" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Družbeno" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Učna okolja" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Razvojna okolja" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodeki" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Gonilniki strojne opreme" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Pisave" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Vhodni viri" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Jezikovni paketi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Jezikovno prilagajanje" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Program" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "Program %s zahteva dodatno podporo za zapise datotek." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Zahtevane so dodatne vrste MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "Program %s zahteva dodatne pisave." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Zahtevane so dodatne pisave" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "Program %s zahteva dodatne predstavne kodeke." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Zahtevani so dodatni kodeki za predstavne vsebine" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "Program %s zahteva dodatne gonilnike za tiskalnik." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Zahtevani so dodatni gonilniki za tiskalnik" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "Program %s zahteva namestitev dodatnih paketov." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Zahtevani so dodatni paketi" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Najdi med programi" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "Pokaži več _podrobnosti" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Pokaži manj _podrobnosti" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Poteka odstranjevanje …" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Zahteva ponoven zagon za dokončanje namestitve" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Zahteva ponoven zagon pred dokončanjem odstranjevanja" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Namestitev na čakanju …" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Poteka nastavljanje posodobitev …" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Poteka prejemanje …" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Poteka priprava …" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Poteka odstranjevanje namestitve …" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "Paket %s trenutno ni nameščen, a ima še vedno shranjene podatke." + +#: src/gs-details-page.c:1064 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Ponovno zaženi" + +#: src/gs-details-page.c:1070 +msgid "_Enable…" +msgstr "_Omogoči …" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1096 +msgid "_Install…" +msgstr "_Namesti …" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1306 +#, c-format +msgid "%s will appear in US English" +msgstr "Program %s se bo zagnal v angleščini" + +#: src/gs-details-page.c:1314 +msgid "This app will appear in US English" +msgstr "Ta program se bo zagnal v angleščini" + +#: src/gs-details-page.c:1316 +msgid "This software will appear in US English" +msgstr "Ta program se bo zagnal v angleščini" + +#: src/gs-details-page.c:1351 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Sodelujte pri _prevajanju" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1416 +#, c-format +msgid "Other Apps by %s" +msgstr "Drugi programi %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1452 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Razvijalec %s je potrdil lastništvo nad %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1455 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Razvijalec je potrdil lastništvo nad %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1818 +msgid "You need internet access to write a review" +msgstr "Za objavo mnenja ali ocene je zahtevana internetna povezava." + +#: src/gs-details-page.c:1921 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Ta programska oprema ne prejema več posodobitev, vključno z varnostnimi " +"popravki" + +#: src/gs-details-page.c:1922 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Paket je že na voljo v osnovnem programskem viru in ga ni priporočljivo " +"zamenjati." + +#: src/gs-details-page.c:1923 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Program nima določenih povezav do spletne strani, skladišča kode ali " +"sledilnika napak." + +#: src/gs-details-page.c:1925 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Ta programska oprema ne prejema več posodobitev, vključno z varnostnimi " +"popravki" + +#: src/gs-details-page.c:1926 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Paket je že na voljo v osnovnem programskem viru in ga ni priporočljivo " +"zamenjati." + +#: src/gs-details-page.c:1927 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Program nima določenih povezav do spletne strani, skladišča kode ali " +"sledilnika napak." + +#: src/gs-details-page.c:2017 src/gs-details-page.c:2034 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Programska oprema ni pridobila podatkov za »%s« in ne more prikazati " +"podrobnosti za ta program." + +#: src/gs-details-page.c:2402 +msgid "Invalid review response received from server" +msgstr "S strežnika prejet neveljaven odgovor na oceno" + +#: src/gs-details-page.c:2412 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Pošiljanje ocene za »%s« je spodletelo: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Stran podrobnosti" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Poteka nalaganje podrobnosti programa …" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Overjeno" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Odpri" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Posodobi" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Odstrani namestitev" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Vstavki" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "Program je mogoče uporabljati le z dejavno internetno povezavo." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Programski vir je vključen" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Program vključuje tudi programski vir s posodobitvami in dostopom do dodatne " +"programske opreme." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Ni vključenega programskega vira" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Program ne vključuje dodatnih programskih virov in ne bo posodobljen na " +"novejšo različico." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Programski vir je določen" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Z dodajanjem programskega vira bo omogočen dostop do dodatne programske " +"opreme in posodobitev." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Uporabi le programske vire, ki so vredni zaupanja." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Počisti podatke programa" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Izbriši podatke" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Ni metapodatkov" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Spletišče projekta" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Doniraj" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Prispevajte _prevode" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Pošlji poročilo o napaki" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "Pomo_č" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Stopite v stik" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Napišite oceno" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Mnenja in ocene" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Podrobnosti o programu ni mogoče prikazati" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Priprava ponovnega zagona ni uspela" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Neznana napaka" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Ključa ni mogoče najti" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Ključ ni vpisan" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Zahtevan je vpis MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Naslednji" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"V tej napravi je omogočen varen zagon. Če želite omogočiti nove gonilnike, " +"morate vpisati nov ključ lastnika računalnika (MOK). Postopek zahteva " +"kasnejši vnos gesla. Zabeležite si naslednje geslo, povezano s ključem:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Zabeležil sem si _geslo MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Ponovno zaženi in se vpiši ..." + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Navodila za namestitev: pozorno jih preberite" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Po vnovičnem zagonu se prikaže zaslon za nastavitev naprave. Če želite " +"omogočiti nove gonilnike, nadaljujte s koraki nastavitve:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Izberite »Vpiši MOK«\n" +"• Izberite »Da« za vpis ključev\n" +"• Ko ste pozvani, vnesite geslo MOK\n" +"• Nato izberite »Ponovno zaženi«" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Varnostne posledice" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Po uspešnem vpisu ključa se zavedajte, da bodo vse prihodnje posodobitve " +"modula ali katerega koli drugega modula implicitno zaupanja vredne. Vse " +"prihodnje posodobitve bodo potekale pregledno brez interakcije in/ali " +"dovoljenja." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Nadaljnja navodila najdete na straneh dokumentacije." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Poteka prejemanje dodatnih datotek metapodatkov …" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " in " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Razpoložljive pisave za %s skriptov" +msgstr[1] "Razpoložljive pisave za %s skript" +msgstr[2] "Razpoložljive pisave za %s skripta" +msgstr[3] "Razpoložljive pisave za %s skripte" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Programska oprema za %s" +msgstr[1] "Programska oprema za %s" +msgstr[2] "Programska oprema za %s" +msgstr[3] "Programska oprema za %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Zahtevane programske opreme ni mogoče najti" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Iskanje zahtevane programske opreme je spodletelo" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s ni mogoče najti" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "na spletni strani" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Ni programa s podporo za datoteko %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Podrobnosti o %s in o možnostih za nameščanje manjkajočih programov je " +"mogoče najti na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Za podporo %s ni na voljo programa." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s ni na voljo." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Podrobnosti o %s in o možnostih za nameščanje programov za podporo tej vrsti " +"datotek je mogoče najti na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Za podporo %s ni na voljo dodatnih pisav." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Podrobnosti o %s in o možnostih za nameščanje dodatnih pisav je mogoče najti " +"na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Za zapis %s ni na voljo dodatnih kodekov." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Podrobnosti o %s in o možnostih nameščanja kodekov za predvajanje tega " +"zapisa je mogoče najti na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Za %s ni na voljo virov Plazma." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Podrobnosti o %s in o možnostih za nameščanje virov Plazma je mogoče najti " +"na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Za %s ni na voljo gonilnikov za tiskalnik." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Podrobnosti o %s in o možnostih za nameščanje gonilnikov za podporo " +"tiskalniku je mogoče najti na %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentacije" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Kodekov %s, ki jih zahteva program %s ni mogoče najti. Več podrobnosti je " +"zapisanih na straneh %s." +msgstr[1] "" +"Kodeka %s, ki ga zahteva program %s ni mogoče najti. Več podrobnosti je " +"zapisanih na straneh %s." +msgstr[2] "" +"Kodekov %s, ki ju zahteva program %s ni mogoče najti. Več podrobnosti je " +"zapisanih na straneh %s." +msgstr[3] "" +"Kodekov %s, ki jih zahteva program %s ni mogoče najti. Več podrobnosti je " +"zapisanih na straneh %s." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Kodekov %s ni mogoče najti. Več podrobnosti je zapisanih na straneh %s." +msgstr[1] "" +"Kodeka %s ni mogoče najti. Več podrobnosti je zapisanih na straneh %s." +msgstr[2] "" +"Kodekov %s ni mogoče najti. Več podrobnosti je zapisanih na straneh %s." +msgstr[3] "" +"Kodekov %s ni mogoče najti. Več podrobnosti je zapisanih na straneh %s." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Ni zadetkov za naveden iskalni niz: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Zapis %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Namesti _vse" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Ni mogoče najti zahtevane programske opreme" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Stran kodekov" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Ni najdenih zadetkov." + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Iskanja ni mogoče izvesti." + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Predhodni" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Naslednji" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Novosti programske opreme" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Namizna podpora" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Omogoča uporabo na velikih zaslonih" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Namizna podpora ni znana" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Ni dovolj podrobnosti o programu za določitev podpore velikim zaslonom" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Zahteva uporabo velikega zaslona" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Uporaba namizja ni podprta" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Uporaba na velikih zaslonih ni mogoča" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Podpora za mobilne naprave" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Omogoča uporabo na malih zaslonih" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Podpora za mobilne naprave ni znana" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Ni dovolj podrobnosti o programu za določitev podpore majhnim zaslonom" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Zahteva uporabo malega zaslona" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobilna okolja niso podprta" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Uporaba na malih zaslonih ni mogoča" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Podpora tipkovnice" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Podpora za tipkovnice ni določena" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Ni dovolj podatkov o podpori tipkovnice" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Zahtevana je uporaba tipkovnice" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Omogoča uporabo tipkovnice" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Uporaba tipkovnice ni podprta" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Uporaba s tipkovnico ni mogoča" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Podpora za miško" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Zahteva miško ali podobno sledilno napravo" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Podpora za miško ni znana" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Ni dovolj podrobnosti o programu za določitev podpore kazalnim napravam" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Zahtevana je uporaba miške" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Podprta je uporaba miške in kazalnih naprav" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Uporaba miške ni podprta" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Programa ni mogoče uporabljati z miško ali drugo kazalno napravo" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Podpora zaslonom na dotik" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Podpora za zaslone na dotik ni opredeljena" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Ni dovolj podatkov o podpori zaslonov na dotik" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Zahtevan je večdotični zaslon" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Podpira večdotične zaslone" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Zasloni na dotik niso podprti" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Ne deluje pri uporabi večdotičnega zaslona" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Zahtevana je igralna plošča" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Zahteva uporabo igralne plošče" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Podpora za igralno ploščo" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Program podpira uporabo igralnih konzol" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "Program %s je najverjetneje podprt za to napravo." + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "Program %s je podprt na tej napravi." + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "Program %s najverjetneje deluje na tej napravi." + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "Program %s na tej napravi ne bo deloval pravilno." + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "Program %s ni podprt na tej napravi." + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Strojna podpora" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Krmarjenje" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Skoči na stran pregleda" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Skočite na stran za nameščanje" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Skoči na stran posodobitev" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Odpri iskalno vrstico" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Okna" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Odpri nastavitve" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Odpri vire programske opreme" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Pomoč" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Odpri okno tipkovnih bližnjic" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Nameščeno" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Stran nameščenih" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "V teku" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Programi" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Spletni programi" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Sistemski programi" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Vzdržuje skupnost" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Sodelujte" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ta program je odprtokoden in ga razvija mednarodna skupnost prostovoljcev, " +"objavljen pa je pod pogoji dovoljenja %s.\n" +"\n" +"Vsakdo lahko sodeluje pri zasnovi in razvoju." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ta program je odprtokoden in ga razvija mednarodna skupnost prostovoljcev, " +"objavljen pa je z dovoljenjem %s.\n" +"\n" +"Vsakdo lahko sodeluje pri zasnovi in razvoju." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"To programsko opremo razvija skupnost prostovoljcev, objavljena pa je z " +"dovoljenjem %s.\n" +"\n" +"Vsakdo lahko, če se za to odloči, sodeluje pri zasnovi in razvoju programa." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"To programsko opremo razvija skupnost prostovoljcev, objavljena pa je z " +"dovoljenjem %s.\n" +"\n" +"Vsakdo lahko, če se za to odloči, sodeluje pri zasnovi in razvoju programa." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Neznano dovoljenje" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Več podrobnosti" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Za ta program ni navedeno, pod pogoji katerega dovoljenja je objavljena, in " +"je lahko zaščiten z lastništvom. Lahko je nezanesljiv na načine, ki jih je " +"težko odkriti, in se lahko spreminja brez nadzora.\n" +"\n" +"K tej programski opremi najverjetneje ni mogoče prispevati, niti ne vplivati " +"na razvoj." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Pri tej programski opremi ni navedeno pod pogoji katerega dovoljenja je " +"objavljena in je lahko zaščitena z lastništvom. Lahko je nezanesljiva na " +"načine, ki jih je težko odkriti, in se lahko spreminja brez nadzora.\n" +"\n" +"Pri razvoju te programske opreme morda je, morda ni mogoče sodelovati." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Lastniško" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Program ni prosta programska oprema, zato delovanje poznajo le razvijalci. " +"Morda je nezanesljiva na načine, ki jih je težko odkriti, in se lahko " +"spreminja brez nadzora.\n" +"\n" +"Pri razvoju tega programa morda je, morda ni mogoče sodelovati." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Razvoj te programske kode ni odprt za javnost, zato le razvijalci programa " +"vedo, kako deluje. Morda so določene omejitve uporabe, prav tako je težko " +"ugotoviti, ali je programska oprema zares varna. Delovanje programa se lahko " +"kadarkoli tudi spremeni.\n" +"\n" +"K tej programski opremi najverjetneje ni mogoče prispevati, niti ne vplivati " +"na razvoj." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Posebno dovoljenje" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Program je objavljen pod pogoji posebnega dovoljenja %s.\n" +"\n" +"Morda je, morda ni mogoče sodelovati pri razvoju tega programa" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Program je objavljen pod pogoji dovoljenja »%s«.\n" +"\n" +"Morda je, morda ni mogoče sodelovati pri razvoju tega programa." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ta programska oprema je objavljena pod pogoji dovoljenja %s..\n" +"\n" +"Pri razvoju te programske opreme morda je, morda ni mogoče sodelovati." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Programska oprema je objavljena pod pogoji dovoljenja »%s«.\n" +"\n" +"Morda je, morda ni mogoče sodelovati pri razvoju tega programa" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Osveževanje podatkov" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Nalaganje strani …" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Zaganjanje …" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Neznan vir" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Uporabnik" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Dodatni paketi" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Paketi, pripravljeni za odstranitev" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Posodobitve" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Povrnjeni paketi" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "izbrani zunanji viri" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Omogoča dostop do dodatne programske opreme %s, vključno s plačljivimi " +"programi.\n" +"\n" +"Ta skladišča lahko kasneje omogočite v nastavitvah Skladišč programske " +"opreme." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Ali naj bodo omogočeni tudi programski viri tretje roke?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Prezri" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Omogoči" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Na voljo za vaš operacijski sistem" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Na voljo za %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Razišči" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Stran pregleda" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Razpoložljivi programi" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Druge kategorije" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Podatkov o programu ni mogoče najti" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Neznano" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_V redu" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Uporabnik je zavrnil namestitev" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Pripravi %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Ali res želite odstraniti shrambo %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Vsi programi iz %s bodo odstranjeni. Za ponovno uporabo bo treba določiti " +"skladišče in jih znova namestiti." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Ali ste prepričani, da želite odstraniti %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Po odstranitvi programa %s ne bo mogoče uporabljati." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Po odstranitvi ne bo mogoče uporabljati programov, ki so odvisni od %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Po odstranitvi ne bo mogoče uporabljati %s in vsi dokumenti, ki ga " +"uporabljajo, bodo prikazani v drugi pisavi." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Po odstranitvi programa %s ne bo mogoče uporabiti. To lahko pomeni, da " +"nekaterih predstavnostnih datotek ne bo več mogoče predvajati." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Strojna oprema, ki je odvisna od %s, po odstranitvi morda ne bo več delovala " +"pravilno." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Po odstranitvi %s ne bo mogoče uporabljati. Podatki in nastavitve programa " +"bodo ostali shranjeni na disku, da ga bo mogoče v prihodnosti obnoviti." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Možnosti" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Posodobitve programske opreme" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Več podrobnosti" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Preverjanje in prejemanje posodobitev zahteva porabo podatkov in energije. " +"Samodejne posodobitve so zato ustavljene na plačljivih omrežjih in ko je " +"omogočeno varčno delovanje sistema." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Samodejno" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Samodejno preveri in prejmi posodobitve" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Ročno" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Preverjanje in prejemanje posodobitev mora biti zagnana ročno" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Obvestila _samodejnega posodabljanja" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Pokaži obvestilo, ko so posodobitve samodejno nameščene" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filtri vsebine" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Pokaži le _prosto programsko opremo" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Med iskanjem skrij lastniško programsko opremo" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Pokaži le programe overjenih razvijalcev" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Pokaži le programe, pri katerih je istovetnost razvijalcev overjena" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Nameščena programska oprema ni združljiva z okoljem %s in bo med nadgradnjo " +"samodejno odstranjena." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Neskladna programska oprema" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Nadgradi" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Odstrani namestitev" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Podatki in nastavitve programa" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Ohrani" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Omogoča obnavljanje nastavitev in vsebine programa" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Izbriši" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Trajno izbriše podatke za prihranek prostora na disku" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Programska oprema, nameščene z vira »%s«, ne bo več deležna posodobitev." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Ali želite onemogočiti shrambo?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Ali želite odstraniti shrambo?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Onemogoči" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Odstrani" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Omogoči nova skladišča" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Omogoči nova skladišča, ko so dodana." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "več podrobnosti" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Dodatna skladišča izbranih virov tretjih oseb –%s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Skladišča tretjih virov Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "operacijski sistem" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Ta skladišča so dodatek v privzeti programski opremi sistema %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Viri programske opreme" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Ni vpisanih skladišč" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u nameščenih programov" +msgstr[1] "%u nameščen program" +msgstr[2] "%u nameščena programa" +msgstr[3] "%u nameščeni programi" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u nameščenih vstavkov" +msgstr[1] "%u nameščen vstavek" +msgstr[2] "%u nameščena vstavka" +msgstr[3] "%u nameščeni vstavki" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u programov" +msgstr[1] "%u program" +msgstr[2] "%u programa" +msgstr[3] "%u programi" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u vstavkov" +msgstr[1] "%u vstavek" +msgstr[2] "%u vstavka" +msgstr[3] "%u vstavki" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "Nameščeno: %s in %s" +msgstr[1] "Nameščeno: %s in %s" +msgstr[2] "Nameščeno: %s in %s" +msgstr[3] "Nameščeno: %s in %s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Poteka preverjanje nameščene programske opreme …" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Odstrani" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Bedast je" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Ni mi všeč" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "V redu je" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Všeč mi je" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Noro dober je" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Izberite zvezdico, če želite podati oceno" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Priporočljivo je nameniti več časa pisanju mnenja ali ocene" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Izberite tudi oceno z zvedzicami" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Povzetek je prekratek" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Povzetek je predolg" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "Opis je prekratek" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "Opis je predolg" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Napišite oceno" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Pošlji" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Navesti je treba oceno, povzetek in poročilo pregleda. Teh mnenja ne smejo " +"biti uporabljena za prijavo napak: v tem primeru je najbolje stopiti v stik " +"z razvijalcem ali podporo." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Predogled povzetka" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "Napišite kratko oceno" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be shown " +"publicly." +msgstr "" +"Preglejte, kateri podatki so poslani, med pravili zasebnosti. Javno bo prikazano celotno ime, ki je " +"povezano z vašim računom." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u mnenj" +msgstr[1] "%u mnenje" +msgstr[2] "%u mnenji" +msgstr[3] "%u mnenja" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "od 5 zvezdic" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Neznano" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Objava mnenj je dovoljena tudi za nesramno, diskriminatorno, ali napadalno " +"vedenje." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Po objavi mnenje ali oceno pregleda skrbnik, preden se to pokaže tudi drugim " +"uporabnikom." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Ali želite objaviti mnenje in oceno?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Poročilo" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Ali želite objaviti oceno?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Odstranjevanja mnenja ni mogoče razveljaviti." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Všečkaj oceno" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Nevšečkaj oceno" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Poročilo …" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Odstrani …" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Program sicer ni sistemsko omejen, a je bil pred vključitvijo preverjen pri " +"ponudniku distribucije." + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Prepričajte se, da zaupate ponudniku, ker program ni sistemsko omejen." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Ni posebnih dovoljenj" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Program se v celoti izvaja v peskovniku" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Zahteva dostop do omrežja" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Omogočen je dostop do interneta" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Ne zahteva dostopa do omrežja" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Ni omogočenega dostopa do omrežja" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Uporablja sistemske storitve" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Lahko zahteva uporabo sistemskih storitev" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Uporablja storitve seje" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Lahko zahteva dostop do storitev seje" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Uporabniški dostop do naprave" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Lahko dostopa do naprav, kot so spletne kamere in igralne konzole" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Ne zahteva dostopa do povezanih naprav" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Nima dostopa do naprav, kot so spletne kamere in igralne konzole" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Dostop do vhodne naprave" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Dostop do mikrofona in predvajanja zvoka" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Omogočen je dostop do mikrofonov in predvaja zvok brez spraševanja za " +"dovoljenje" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Dostop do sistemske naprave" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Lahko dostopa do sistemskih naprav, ki zahtevajo višja dovoljenja" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Dostop do vsebine namizja" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Omogočen je dostop vsebine zaslona ali drugih oken" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Uporablja opuščen zaslonski sistem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Zahteva dovoljenja po potrebi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Uporabniške nastavitve" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Poln dostop za branje/pisanje vsebine datotečnega sistema" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Bere in zapisuje vse podatke datotečnega sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Dovoljenje za branje/pisanje vsebine v osebno mapo" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Bere in zapisuje vse podatke v osebni mapi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Poln dostop za branje vsebine datotečnega sistema" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Bere vse podatke datotečnega sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Dovoljenje za branje vsebine osebne mape" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Bere vse podatke v osebni mapi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Dovoljenje za branje/pisanje vsebine v mapo prejema" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Bere in zapisuje vse podatke v mapi prejemov" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Dovoljenje za branje vsebine mape prejema" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Bere vse podatke v mapi prejemov" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Lahko prebere in zapisuje vse podatke v mapi" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Lahko prebere vse podatke v mapi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Ne zahteva dostopa do datotečnega sistema" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Ne zahteva in nima dovoljenj za dostop do datotečnega sistema" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Razvijalci programa so preverjeni" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Istovetnost razvijalca tega programa je bila preverjena" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Ne-varne zahtevane odvisnosti" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Programska oprema ali kateri od odvisnih paketov ni več podprta in " +"najverjetneje ni varna za uporabo." + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Za program ni navedeno, pod pogoji katerega dovoljenja je bil razvit, in je " +"lahko lastniška." + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Za programsko opremo ni navedeno, pod pogoji katerega dovoljenja je bila " +"razvita, in je lahko lastniška." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Lastniška programska koda" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Izvorna koda ni javna, je ni mogoče preveriti, zato je program morda ni varen" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Program je objavljen pod pogoji posebnega dovoljenja »%s«." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Programska oprema je objavljena pod pogoji posebnega dovoljenja »%s«." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Koda je odprta za pregled" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Izvorna koda je javno dostopna in jo je mogoče skrbno pregledati, kar naredi " +"program veliko bolj varen" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "Program %s ima dodeljena posebna dovoljenja" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "Program %s varen za uporabo." + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "Program %s je najverjetneje varen za uporabo" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "Program %s morda ni povsem varen." + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "Program %s ni varen." + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Neznano" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Dovoljenja programa" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Dovoljenje" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Vir" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Ta program uporablja zastarelo različico programske platforme (SDK) in lahko " +"vsebuje napake ali varnostne ranljivosti, ki ne bodo odpravljene." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Predhodna zaslonska slika" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Naslednja zaslonska slika" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Ni zaslonskih slik" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:360 src/gs-screenshot-image.c:402 +#: src/gs-screenshot-image.c:606 +msgid "Screenshot not found" +msgstr "Zaslonske slike ni mogoče najti" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:412 +msgid "Failed to load image" +msgstr "Nalaganje slike je spodletelo" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:634 +msgid "Screenshot size not found" +msgstr "Velikosti zaslonske slike ni mogoče najti" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:723 +msgid "Could not create cache" +msgstr "Ni mogoče ustvariti predpomnilnika" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:737 +msgid "Screenshot not valid" +msgstr "Zaslonska slika ni veljavna" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:775 +msgid "Screenshot not available" +msgstr "Zaslonska slika ni na voljo" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Zaslonska slika" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "+ %u dodatnih" +msgstr[1] "+ %u dodaten" +msgstr[2] "+ %u dodatna" +msgstr[3] "+ %u dodatni" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Iskalna stran" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Poišči program" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Ni najdenih programov" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "»%s«" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "Prejemanje datotek posodobitev je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "Ni mogoče prejeti strojne programske opreme" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Ni mogoče prejeti posodobitev strojne programske opreme z %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Prejemanje datotek posodobitev z %s je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "Posodobitev je spodletela: zahtevan je dostop do interneta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "Posodobitev je spodletela: na disku ni dovolj prostora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Prenos posodobitev s %s je spodletelo: na disku ni dovolj prostora" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "Posodobitev je spodletela: zahtevana je overitev" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "Posodobitev je spodletela: overitev ni veljavna" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "Posodobitev je spodletela: zahtevana so posebna dovoljenja" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Posodobitev ni mogoče prenesti: nimate pravic za namestitev programske opreme" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "Pridobivanje seznama posodobitev je spodletelo" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "Namestitev je spodletela: prejemanje paketa je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Namestitev %s je spodletela: prejemanje paketa z %s je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Namestitev %s je spodletela: prejemanje je spodletelo" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "Namestitev je spodletela: manjka zagonsko okolje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Namestitev %s je spodletela: manjka zagonsko okolje %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "Namestitev %s ni mogoča" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "Namestitev je spodletela: zahtevan je dostop do interneta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "Namestitev je spodletela: program je shranjen v napačnem zapisu" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "Namestitev je spodletela: na disku ni dovolj prostora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Namestitev %s je spodletela: na disku ni dovolj prostora" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "Namestitev je spodletela: zahtevana je overitev" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Namestitev %s je spodletela: zahtevana je overitev" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "Namestitev je spodletela: overitev ni veljavna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Namestitev %s je spodletela: overitev ni veljavna" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "Namestitev je spodletela: zahtevana so posebna dovoljenja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s ni mogoče namestiti: potrebno je dovoljenje" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "Namestitev je spodletela: naprava mora biti priklopljena" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Namestitev %s je spodletela: naprava mora biti priklopljena" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "Namestitev je spodletela: napetost baterije je prenizka" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Namestitev %s je spodletela: napetost baterije je prenizka" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Posodobitev %s iz %s je spodletela: prejemanje je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Posodobitev %s je spodletela: prejemanje je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Namestitev posodobitev z %s je spodletela: prejemanje je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "Posodobitev je spodletela: prejemanje paketa je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Posodobitev %s je spodletela: na disku ni dovolj prostora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Posodobitev %s je spodletela: zahtevana je overitev" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Posodobitev %s je spodletela: overitev ni veljavna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Posodobitev %s je spodletela: zahtevana so posebna dovoljenja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "Posodobitev je spodletela: naprava mora biti priklopljena" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Posodobitev %s je spodletela: naprava mora biti priklopljena" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "Posodobitev je spodletela: napetost baterije je prenizka" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Posodobitev %s je spodletela: napetost baterije je prenizka" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "Posodobitev %s je spodletela" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "Posodobitev ni mogoča" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "Posodobitev je spodletela" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Posodobitev na %s iz %s je spodletela" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "Posodobitev je spodletela: prejemanje paketa je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Posodobitev na %s je spodletela: prejemanje je spodletelo" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "Posodobitev je spodletela: zahtevan je dostop do interneta" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Posodobitev na %s je spodletela: zahtevan je dostop do interneta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "Posodobitev je spodletela: na disku ni dovolj prostora" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Posodobitev na %s je spodletela: na disku ni dovolj prostora" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "Posodobitev je spodletela: zahtevana je overitev" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Posodobitev na %s je spodletela: zahtevana je overitev" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "Posodobitev je spodletela: overitev ni veljavna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Posodobitev na %s je spodletela: overitev ni veljavna" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "Posodobitev je spodletela: zahtevana so posebna dovoljenja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Posodobitev na %s je spodletela: zahtevana so posebna dovoljenja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Posodobitev je spodletela: naprava mora biti priklopljena" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Nadgradnja na %s ni mogoča: naprava mora biti priključena" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "Posodobitev je spodletela: napetost baterije je prenizka" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Nadgradnja na %s ni mogoča: skoraj prazna baterija" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Nadgradnja na %s ni možna" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "Odstranitev programa je spodletela: zahtevana je overitev" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Odstranitev programa %s je spodletela: zahtevana je overitev" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "Odstranitev programa je spodletela: overitev ni veljavna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Odstranitev programa %s je spodletela: overitev ni veljavna" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "Odstranitev programa je spodletela: zahtevana so posebna dovoljenja" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Odstranitev programa %s je spodletela: zahtevana so posebna dovoljenja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Odstranitev programa je spodletela: naprava mora biti priklopljena" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Odstranitev programa %s je spodletela: naprava mora biti priklopljena" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "Odstranitev programa je spodletela: nizka napetost baterije" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Odstranitev programa %s je spodletela: nizka napetost baterije" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Odstranitev programa %s je spodletela" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "Programa %s ni mogoče zagnati" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "Opravila ni bilo mogoče izvesti!" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Programa %s ni mogoče zagnati: %s ni nameščen" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "Za delovanje programa na disku ni dovolj prostora" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "Namestitev je spodletela: vrsta datoteke ni podprta" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "Namestitev je spodletela: overitev je spodletela" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "Programa ni mogoče namestiti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "Povezava s spletiščem %s ni mogoča." + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "Program je treba pred uporabo novih vstavkov ponovno zagnati." + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "Naprava mora biti priklopljena" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "Napetost baterije je prenizka" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Viri programske opreme" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Možnosti" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Tipkovne bližnjice" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_O programu Programi" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Iskanje" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Glavni meni" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Poišči programe" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Razišči" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Nameščeno" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Posodobitve" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Pojdi nazaj" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Brez" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Podatki programa" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Podatki, ključni za delovanje programa" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Uporabniški podatki" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Podatki, ki ste jih ustvarili z uporabo programa" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Podatki predpomnilnika" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Začasni podatki predpomnilnika" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Program sam" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Zahtevane odvisnosti" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Sistemsko dodeljene knjižnice, ki jih program zahteva" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Neznano" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Predpomnjene podatke je mogoče počistiti pod n_stavitvami " +"programa" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Mesta za shranjevanje" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (nameščeno)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (poteka nameščanje)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (poteka prejemanje ...)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (poteka odstranjevanje)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Podrobnosti" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Preuči" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Nameščeno na %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Nameščene posodobitve" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Ni nameščenih posodobitev" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Posodobitve programske opreme so zastarele" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Preveri za razpoložljive posodobitve" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Pomembne posodobitve so pripravljene za namestitev" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Pomembne posodobitve je priporočeno namestiti takoj, ko je to mogoče" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Pomembne posodobitve so pripravljene za prejem" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Pomembne posodobitve je priporočeno prejeti takoj, ko je to mogoče" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Posodobitve so pripravljene za namestitev" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Posodobitve so pripravljene za namestitev" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Posodobitve so pripravljene za prejem" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Posodobitve programske opreme je mogoče prejeti" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u posodobljenih programov – sistem zahteva ponovni zagon" +msgstr[1] "%u posodobljen program – sistem zahteva ponovni zagon" +msgstr[2] "%u posodobljena programa – sistem zahteva ponovni zagon" +msgstr[3] "%u posodobljeni programi – sistem zahteva ponovni zagon" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u posodobljenih programov" +msgstr[1] "%u posodobljen program" +msgstr[2] "%u posodobljena programa" +msgstr[3] "%u posodobljeni programi" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "Program %s je posodobljen." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Ponovno je treba zagnati program." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "Programa %s in %s sta posodobljena." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u programov zahteva ponovni zagon." +msgstr[1] "%u program zahteva ponovni zagon." +msgstr[2] "%u programa zahtevata ponovni zagon." +msgstr[3] "%u programi zahtevajo ponovni zagon." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Vključuje %s, %s in %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Sistem je dosegel konec življenjske dobe" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Nadgradite za nadaljnje prejemanje posodobitev." + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Za namestitev je na voljo je nova različica %s" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Na voljo so posodobitve programske opreme" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Posodabljanje programske opreme je spodletelo" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Pripravljene posodobitve niso bile nameščene" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Pokaži podrobnosti" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Sistemska posodobitev je končana" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Dobrodošli v namestitvi %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Paketi za posodobitev so nameščeni" +msgstr[1] "Paket za posodobitev so nameščen" +msgstr[2] "Paketa za posodobitev sta nameščena" +msgstr[3] "Paketi za posodobitev so nameščeni" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Posodobitev pomembnih posodobitev operacijskega sistema je končana." +msgstr[1] "Posodobitev pomembne posodobitve operacijskega sistema je končana." +msgstr[2] "Posodobitev pomembnih posodobitev operacijskega sistema je končana." +msgstr[3] "Posodobitev pomembnih posodobitev operacijskega sistema je končana." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Ocena" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Posodobitev je spodletela" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Sistem je že posodobljen." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Posodobitev je bila preklicana." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Zahtevana je omrežna povezava, ki pa ni na voljo. Vzpostavite povezavo z " +"internetom in poskusite znova." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Pri posodobitvi je prišlo do varnostnih težav. Za več podrobnosti stopite v " +"stik s ponudnikom programske opreme." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Ni dovolj prostora na disku. Naredite ga in poskusite znova." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Namestitev posodobitve je spodletela. Počakajte na naslednjo posodobitev in " +"poskusite znova. Če bo težava ostala, stopite v stik s ponudnikom programske " +"opreme." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Nazadnje preverjeno: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Zaustavi" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Preveri za posodobitve" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s ne prejema več kritičnih posodobitev programske opreme" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Nameščen operacijski sistem ne prejema več kritičnih posodobitev programske " +"opreme" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Uporaba lahko vpliva na višino računa" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Preverjanje za posodobitve z uporabo širokopasovnega mobilnega omrežja lahko " +"vpliva na višino računa za telefon." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Vseeno preveri" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Posodobitve programske opreme so prejete" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Nadgradnje so pripravljene za namestitev" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Preveri za posodobitve" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Posodobitve" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Stran posodobitev" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Poteka nalaganje posodobitev …" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Dejanje je lahko dolgotrajno." + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Posodobljeno" + +#: src/gs-updates-page.ui:180 +msgid "Use Mobile Data?" +msgstr "Ali želite uporabiti mobilne podatke?" + +#: src/gs-updates-page.ui:181 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Preverjanje za posodobitve z uporabo mobilne širokopasovne povezave lahko " +"povzroči nepričakovane stroške." + +#: src/gs-updates-page.ui:184 +msgid "_Check Anyway" +msgstr "_Vseeno preveri" + +#: src/gs-updates-page.ui:203 +msgid "No Connection" +msgstr "Brez povezave" + +#: src/gs-updates-page.ui:204 +msgid "Go online to check for updates" +msgstr "Preveri za posodobitve" + +#: src/gs-updates-page.ui:207 +msgid "_Network Settings" +msgstr "_Omrežne nastavitve" + +#: src/gs-updates-page.ui:227 src/gs-updates-page.ui:241 +msgid "Error" +msgstr "Napaka" + +#: src/gs-updates-page.ui:242 +msgid "Updates are automatically managed" +msgstr "Posodobitve se upravljalo samodejno." + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Posodabljanje programske opreme je ustavljeno" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Samodejne posodobitve programske opreme so ustavljene zaradi:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Trenutno uporabljeno omrežje je plačljivoThe current network connection is " +"metered" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Trenutno uporabljeno omrežje ne dovoli velikih prenosov" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Zagnan je način za varčevanje z energijo" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Zagnan je igralniški način" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Posodabljanje programske opreme je ustavljeno" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Omrežna povezava je plačljiva – posodabljanje je začasno ustavljeno" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Omrežna povezava zavrača velike prejeme – posodabljanje je začasno ustavljeno" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Varčni način delovanja je omogočen – posodabljanje je ustavljeno" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Igralni način delovanja je omogočen – posodabljanje je ustavljeno" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Ponovni zagon in namestitev …" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Posodobi _vse" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Posodobitve programske opreme so prejete" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Posodobitve so pripravljene za namestitev" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Vključena strojna programska oprema" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Zahteva ponoven zagon" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Posodobitev programa" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Strojna programska oprema naprave" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Prejmi" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Na voljo je posodobitev distribucije %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Na voljo je posodobitev distribucije %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Več o novi različici" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Prejeto je %s od %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Prejeto je %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Večja posodobitev z novimi zmožnostmi." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Prekliči nadgradnjo" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Ponovni zagon in posodobitev …" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Pred posodabljanjem je priporočljivo je ustvariti varnostno kopijo podatkov " +"in datotek." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Podrobnosti o napaki" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Kopiraj podrobnosti" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Brisanje datoteke »%s« je spodletelo: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Brisanje mape »%s« je spodletelo: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Dodajanje, odstranjevanje in posodabljanje programske opreme." + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Posodobitve;Posodobitev;Viri;Skladišča;Programi;Namestitev;Lastnosti;" +"Odnamestitev;App;Trgovina;Update;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s je pripravljen/a" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"%s je pripravljena za omogočanje in uveljavljanje ob naslednjem zagonu." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Omogoči" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3170 +msgid "System Updates" +msgstr "Sistemske posodobitve" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3175 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Splošne sistemske posodobitve, kot so varnostni popravki ali odprava " +"hroščev, izboljšanje delovanja." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Posodobitev %s z novimi zmožnostmi in popravki." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "S storitvijo EOS ni mogoče pridobiti in uveljaviti posodobitve." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Spletni program" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Podpora Web Apps" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Zaganjanje spletnih programov v oknu brskalnika" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Posodobite sistem za najnovejše zmožnosti, izboljšano delovanje in večjo " +"stabilnost." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Podpora Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak je okolje za podporo namiznim programom sistema Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Sistemska mapa %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Podrejena osebna mapa %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Sistemske gostiteljske mape" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "Nastavitve gostiteljevega sistema iz /etc" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Mapa namizja" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Podrejena mapa namizja %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Mapa dokumentov" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Podrejena mapa dokumentov %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Glasbena mapa" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Podrejena mapa glasbe %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Mapa s slikami" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Podrejena mapa slik %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Mapa javne souporabe" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Podrejena mapa javne souporabe %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Mapa video posnetkov" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Podrejena mapa videa %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Mapa predlog" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Podrejena mapa predlog %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Uporabnikova mapa predpomnilnika" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Podrejena mapa uporabnikovega predpomnilnika %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Mapa uporabniških nastavitev" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Podrejena mapa uporabniških nastavitev %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Uporabniška podatkovna mapa" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Podrejena mapa uporabnikovih podatkov %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Uporabniška izvajalna mapa" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Podrejena uporabnikova izvedbena mapa %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Dostopa do datotečnega sistema %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Pridobi metapodatke flatpak za %s …" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Ni mogoče določiti vstavka »%s«: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Uporabniška namestitev" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Sistemska namestitev" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "ID programa" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Dodajanje vstavka »%s« za namestitev je spodletelo: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Dodajanje vstavka »%s« za odstranitev je spodletelo: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Oddaljeno mesto »%s« ne dovoli namestitve »%s«, najverjetneje zaradi filtra. " +"Odstranite ga in poskusite znova. Podrobna napaka je: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Napolnjenost baterije je prenizka za izvedbo posodobitve" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Napolnjenost baterije je prenizka za izvedbo posodobitve (%u %%, zahtevano " +"je vsaj %u %%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Naprava je nedosegljiva ali je zunaj brezžičnega območja" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Napetost baterije naprave je prenizka" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "" +"Napolnjenost baterije naprave je prenizka (%u %%, zahtevano je vsaj %u %%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Naprava je pripravljena za uveljavitev posodobitve" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Naprava mora biti priključena na električno omrežje" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Naprave ni mogoče uporabiti, ko je pokrov zaprt" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:208 +#, c-format +msgid "%s Device Update" +msgstr "Posodobitev naprave %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s System Update" +msgstr "Posodobitev sistema %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Posodobitev vgrajenega nadzornika %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s ME Update" +msgstr "Posodobitev ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Posodobitev poslovnega upravljalnika %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Posodobitev uporabniškega upravljalnika %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:239 +#, c-format +msgid "%s Controller Update" +msgstr "Posodobitev upravljalnika krmilnika %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:245 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Posodobitev upravljalnika krmilnika Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Posodobitev mikrokode CPE %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s Configuration Update" +msgstr "Posodobitev nastavitev %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Battery Update" +msgstr "Posodobitev baterije %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Camera Update" +msgstr "Posodobitev kamere %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s TPM Update" +msgstr "Posodobitev modula okolja TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s Touchpad Update" +msgstr "Posodobitev sledilne ploščice %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Mouse Update" +msgstr "Posodobitev miške %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Keyboard Update" +msgstr "Posodobitev tipkovnice %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Posodobitev upravljalnika shrembe %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Network Interface Update" +msgstr "Posodobitev omrežnega vmesnika %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Display Update" +msgstr "Posodobitev zaslona %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s BMC Update" +msgstr "Posodobitev BMC %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Posodobitev pogona USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s Drive Update" +msgstr "Posodobitev naprave %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Posodobitev naprave %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s SSD Update" +msgstr "Posodobitev SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s GPU Update" +msgstr "Posodobitev modula GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s Dock Update" +msgstr "Posodobitev pogona %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s USB Dock Update" +msgstr "Posodobitev pogona USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Strojna programska oprema" + +#: plugins/fwupd/gs-plugin-fwupd.c:1938 +msgid "Firmware update could not be applied: " +msgstr "Posodobitve strojne programske opreme ni mogoče začeti: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Podpora nadgradnji strojne programske opreme" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Omogoča podporo za posodobitve strojne programske opreme" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Ali želite namestiti nepodpisano programsko opremo?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Programska oprema, pripravljena za namestitev ni podpisana. To pomeni, da ni " +"mogoče preveriti izvora posodobitve tega programa, niti ali je izvorna koda " +"kakorkoli prirejena." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Ali želite prejeti nepodpisano programsko opremo?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Na voljo so posodobitve nepodpisane programske opreme. To pomeni, da ni " +"mogoče preveriti izvora posodobitve tega programa, niti ali je izvorna koda " +"kakorkoli prirejena." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Ali želite posodobiti nepodpisano programsko opremo?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Na voljo so posodobitve nepodpisane programske opreme. To pomeni, da ni " +"mogoče preveriti izvora posodobitve tega programa, niti ali je izvorna koda " +"kakorkoli prirejena. Posodobitve bodo onemogočene, dokler te posodobitve " +"niso razrešene ali pa programi odstranjeni." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Namestitev posodobitev je spodletela: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paketi" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1436 +msgid "Failed to wait on transaction end before download: " +msgstr "Čakanje na konec transakcije pred prenosom je spodletelo: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1443 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1456 +msgid "Failed to download updates: " +msgstr "Prejemanje datotek posodobitev je spodletelo: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1495 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1505 +msgid "Failed to trigger update: " +msgstr "Proženje posodobitev je spodletelo: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3270 +msgid "Operating System (OSTree)" +msgstr "Operacijski sistem (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Trgovina Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Podpora Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "»Snap« je univerzalni paket operacijskega sistema Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistem" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Sistemska komponenta" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Odstranjevanje opravila sysupdate »%s« ni uspelo s stanjem %i" diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000..9776547 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,8624 @@ +# Serbian translation of gnome-software +# Courtesy of Prevod.org team (http://prevod.org/) -- 2012–2022. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Translators: +# Борисав Живановић , 2017. +# Мирослав Николић , 2013–2022. +# +# Марко М. Костић , 2015-2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-11-07 05:21+0000\n" +"PO-Revision-Date: 2024-11-11 23:27+0100\n" +"Last-Translator: Милош Поповић \n" +"Language-Team: Serbian >\n" +"Language: sr\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? 3 : n%10==1 && n%100!=11 ? 0 : " +"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" +"X-Project-Style: gnome\n" +"X-Generator: Gtranslator 46.1\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Програми" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Инсталирај и ажурирај програме" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Програми вам дозвољавају да пронађете и инсталирате нове програме и " +"проширења система и да уклоните постојеће инсталиране програме." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Програми приказују издвојене и популарне програме са корисним описима и " +"неколико снимака екрана по програму. Програми могу бити пронађени " +"прегледањем списка категорија или претраживањем. Такође вам омогућава " +"одржавање ажурног система коришћењем технологије ванмрежних ажурирања." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Панел прегледа" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Панел појединости" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Панел инсталираних" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Панел ажурирања" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Појединости ажурирања" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2645 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Гномов пројекат" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Испробај акмодс кључ за Шим УЕФИ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Потребна је пријава за тестирање акмодс кључа у Шим УЕФИ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Примени акмодс кључ за Шим УЕФИ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Потребна је пријава за примену акмодс кључа за Шим УЕФИ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Испробај ДКМС кључ за Шим УЕФИ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Потребна је пријава за тестирање ДКМС кључа за Шим УЕФИ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Примени ДКМС кључ за Шим УЕФИ" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Потребна је пријава за примену ДКМС круча за Шим УЕФИ" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Инсталирај датотеку тока у системску локацију" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Инсталирам датотеку тока у системску локацију" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Списак сагласних пројеката" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Ово је списак сагласних пројеката које треба приказати као што је Гном, КДЕ " +"и ИксФЦЕ." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Да ли Гномови програми треба да управљају ажурирањима и надоградњама" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Ако је искључено, Гномови програми ће сакрити површ за ажурирања, неће " +"извршавати било каква самостална ажурирања или питати за надоградње." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Самостално преузимај и инсталирај ажурирања" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Ако је укључено, Гномови програми ће сам преузети ажурирања у позадини и " +"инсталирати она која не захтевају поновно покретање уређаја." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Обавести корисника о програмима ажурираним у позадини" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Ако је омогућено, Гномови Програми ће обавестити корисника о ажурирањима " +"која сус е догодила док је корисник био ван рачунара." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Да ли треба вршити самостално освежавање на ограниченој вези" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Ако је укључено, Гномови програми ће се самостално освежавати у позадини " +"(преузимање метаподатака, провера нових доступних ажурирања и слично) чак и " +"преко ограничене везе што може довести до новчаних трошкова по корисника." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Да ли је ово прво покретање Гномових програма" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Приказује звездице оцењивања поред програма" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Филтрирај програме на основу подразумеване гране подешене за удаљено место" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Неслободни програми приказују прозорче упозорења пре инсталације" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Када се инсталирају неслободни програми може бити приказано прозорче " +"упозорења. Ово одлучује да ли је то прозорче потиснуто." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Временска ознака последње провере ажурирања" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Временска ознака обавештења последње надоградње" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Временска ознака обавештења последње ажурирања" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Временска ознака првог безбедносног ажурирања, очишћеног након ажурирања" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Временска ознака последњег ажурирања" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Старост у секундама након којих је потребно потврдити да је узводни снимак " +"екрана и даље исправан" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Бирање веће вредности ће узроковати мање обилазака ка удаљеном серверу али " +"ће ажурирање снимака екрана и приказ кориснику трајати дуже. Вредност „0“ " +"значи да се никада не проверава сервер уколико слика већ постоји у кешу." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Сервер који ће се користити за прегледе програма" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Најмањи резултат карме за прегледе" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Прегледи са кармом са мањим бројем од овог се неће приказивати." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Списак званичних извора који се не требају сматрати трећом страном" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Списак обавезних ризница које се не могу онемогућити или уклонити" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Списак званичних извора који се требају сматрати слободним софтвером" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Адреса дозволе за коришћење када се програм треба сматрати слободним " +"софтвером" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Инсталира скуп програма за све кориснике на систему где је то могуће" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Допусти приступ прозорчету извора софтвера" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Нуди надоградње за предиздања" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Приказује неке УИ елементе обавештавајући корисника да неки програм није " +"слободан" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Прикажи величину инсталираних програма у списку инсталираних програма" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://sr.wikipedia.org/wiki/Власнички_софтвер'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Путања која објашњава неслободан и власнички софтвер" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Списак УРЛ-ова који показују на датотеке тока које ће бити преузете у " +"swcatalog фасциклу" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Инсталирај датотеку тока у системску локацију, за све кориснике. Ако је " +"нетачно, датотеке биће инсталиране у нестандардни директоријум " +"$XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Поредак приоритета формата паковања који се желе, са прво исписаним важнијим " +"форматима. Празан низ значи основни поредак. Подразумева се да изостављени " +"формати буду наведени последњи. Примери формата паковања су: deb, flatpak, " +"rpm, snap. Ови формати по избору могу бити наведени са називом изворишта, " +"одвојено двотачком, на пример: 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Временска ознака последњег покушаја отклањања некоришћеног извршног Флатпак " +"пакета" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Постави на тачно („true“) да би приказали само апликације лиценциране за " +"слободно коришћење и сакриј све власничке апликације" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Постави на тачно („true“) да би се приказале само апликације програмера са " +"провереним идентитетом" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Временска ознака последње примљених историјских ажурирања." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Ниска која складишти gnome-online-account иб који се користи за пријаву" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Системски инсталатер датотека тока Гномових програма" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Нисам успео да обрадим аргументе линије наредби" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Морате навести тачно једно име датотеке" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Овај програм може користити само администратор" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Нисам успео да потврдим врсту садржаја: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Нисам успео да померим: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Инсталација програма" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Инсталирајте изабране програме на систем" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Цртано насиље" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Нема података о цртаном насиљу" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Фантазијско насиље" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Нема података о фантазијском насиљу" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Реалистично насиље" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Нема података о реалистичном насиљу" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Насиље са крвопролићем" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Нема података о крвопролићу" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Сексуално насиље" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Нема података о сексуалном насиљу" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Алкохол" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Нема података о упућивању на алкохол" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Наркотици" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Нема података о упућивању на забрањене дроге" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Дуван" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Нема података о упућивању на дуванске производе" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Нудизам" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Нема података о било каквој нагости" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Сексуалне теме" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Нема података о сексуалним приказима или упућивањима" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Псовке" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Нема података о било каквој вулгарности" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Неприкладан хумор" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Нема података о неумесном хумору" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Дискриминација" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Нема података о било каквом дискриминационом говору" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Оглашавање" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Нема података о било каквом оглашавању" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Коцкање" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Нема података о било каквом коцкању" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Куповина" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Нема података о способности трошења новца" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Ћаскање између корисника" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Нема података о начинима за ћаскање са другим корисницима" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Звучно ћаскање између корисника" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Нема података о начинима за разговор са другим корисницима" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Контакт појединости" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Нема података о дељењу корисничких имена на друштвеним мрежама или адреса " +"електронске поште" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Идентификујући подаци" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Нема података о дељењу корисничких података са трећим странама" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Дељење места" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Нема података о дељењу стварне локације са другим корисницима" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Хомосексуалност" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Нема података о упућивањима на хомосексуалност" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Проституција" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Нема података о упућивањима на проституцију" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Прељубништво" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Нема података о упућивањима на прељубу" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Сексуализовани карактери" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Нема података о сексуализованим карактерима" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Скрнављење" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Нема података о упућивањима на скрнављење" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Људски остаци" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Нема података о видљивим људским посмртним остацима" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Робовласништво" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Нема података о упућивањима на робовласништво" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Нема упућивања на забрањене дроге" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Не садржи псовање, вулгарност и друге врсте неприкладног говора" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Не садржи огласе или новчане трансакције" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Не садржи секс или нагост" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Нема неконтролисане могућности ћаскања" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Нема насиља" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Дроге" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Неприкладан говор" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Новац" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Друштвено" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Насиље" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Сви" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s има непознату оцену старости" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s програм одговара свима" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s програм је за малу децу" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s програм је за децу" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s програм је за децу" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s програм је за тинејџере" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s програм је само за одрасле" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s програм је за старосну групу %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Оцена старосне прикладности" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:126 +msgid "_How to contribute missing information" +msgstr "_Како додати недостајуће податке" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "Локална датотека" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "Пакет" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "На чекању" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:408 +msgid "Pending install" +msgstr "Чека на инсталирање" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:415 +msgid "Pending remove" +msgstr "Чека на уклањање" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:396 +msgid "Installing" +msgstr "Инсталирам" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Уклањам" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:401 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Преузимам" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:307 src/gs-details-page.c:1061 +#: src/gs-details-page.c:1096 src/gs-details-page.ui:243 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Инсталирај" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1181 +msgid "_Uninstall…" +msgstr "_Уклони…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Мрежа" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Може комуницирати преко мреже" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Системске услуге" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Може приступати услугама Д-сабирнице на системској сабирници" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Услуге сесије" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Може приступати услугама Д-сабирнице на сабирници сесије" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Уређаји" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Може приступати изборним уређајима као што су камере" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Може приступати улазним уређајима" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Може приступати микрофонима" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Може приступати системским датотекама уређаја" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Садржај екрана" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Може приступати садржају екрана" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Лична фасцикла" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Може прегледати, уређивати и стварати датотеке" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Може прегледати датотеке" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Систем датотека" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Фасцикла са преузимањима" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Подешавања" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Може прегледати и мењати било које подешавање" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Застарели систем приказа" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Користи стари, небезбедни систем приказа" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Бег из изолације" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Може изаћи из изолације и може заобићи било која друга ограничења" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Нема доступног описа ажурирања." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Појединости ажурирања" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Захтева додатна овлашћења" + +# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма. +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Прегледи" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "Нема прегледа за овај програм." + +# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма. +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "Нема прегледа" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "Историјат издања" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Ново у издању %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Издање %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Нема појединости за ово издање" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e. %B %Y." + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Режим покретања: „updates“ (ажурирања), „updated“ (ажурно), „installed“ " +"(инсталирано) или „overview“ (преглед)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "РЕЖИМ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Тражи програме" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ТРАЖИ" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Приказује појединости програма (користећи ИБ програма)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ИБ" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Приказује појединости програма (користећи назив пакета)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "НЗВПКТА" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Приказује програм (користећи ИБ програма)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Деинсталирај програм (користећи ИБ програма)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Отвара локалну датотеку са пакетом" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "НАЗИВ ДАТОТЕКЕ" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Врста интеракције која се очекује за ову радњу: било \"none\", \"notify\" " +"или \"full\"" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ИНТЕРАКЦИЈА" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Прикажи локалну метаинфо или апдата датотеку" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Омогући детаљан приказ излаза отклањања грешака (из извршавајуће инстанце, " +"ако се већ извршава)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Инсталира било које ажурирање на чекању, у позадини" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Прикажи поставке" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Затвара покренути примерак" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Даје предност локалним изворима датотека над током програма" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Приказује број издања" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Право на копирање © 2016–2023 доприносиоци Гномовим Програмима" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Мирослав Николић \n" +"Марко М. Костић \n" +"Борисав Живановић \n" +"\n" +"https://гном.срб — превод Гнома на српски језик." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Нажалост, нема података о датом програму." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Величина инсталираног" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Укључујући %s података и %s кеша" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Укључујући %s података" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Укључујући %s кеша" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Коришћење кеша и података непознато" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Величина преузетог" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Нема потребе за додатним преузимањима система" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Потребна је непозната величина додатних преузимања система" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Потребно је %s додатног преузимања система" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Величина је непозната" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Без овлашћења" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Има приступ мрежи" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Користи системске услуге" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Користи услуге сесије" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Може приступати хардверским уређајима" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Може приступати системским уређајима" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Може да чита/пише све ваше податке" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Може да чита све ваше податке" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Може да чита/пише ваша преузимања" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Може да чита ваша преузимања" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Може приступати одређеним датотекама" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Може приступати и мењати корисничка подешавања" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Користи стари прозорски систем" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Може добити већа овлашћења" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Програмер је препознат" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Прегледан је од дистрибутера ОС-а" + +# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма. +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Прегледано од стране дистрибуције „%s“" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Доставља га трећа страна" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Програм више није подржан" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Код испитивања" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Непозната дозвола софтвера" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Власнички код" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Специјална лиценца" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Привилегован" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Безбедан" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Вероватно је сигурно" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Потенцијално небезбедан" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Небезбедан" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Само мобилни" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Ради само на малом екрану" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Само стони" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Ради само на великом екрану" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Величина екрана не одговара" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Не подржава вашу тренутну величину екрана" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Захтева екран на додир" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Захтева тастатуру" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Захтева миша" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Потребна је играчка палица" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Захтева играчку палицу за играње" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Прилагодљив" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Ради на телефонима, таблицама и стоним рачунарима" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Вероватно захтева тастатуру или миша" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Ради на стоним и преносивим рачунарима" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Не садржи неприкладан садржај за било који узраст" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Нема описа о прикладности садржаја" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Посети веб страницу" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Инсталирај…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Откажи" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Инсталирај" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Преузми" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Ажурирај" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Уклони…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Уклањам" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 +#: src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "Критично ажурирање" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Уређај не може бити коришћен за време ажурирања." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Извор: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "Преименовано из „%s“" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +msgid "Stopped Receiving Updates" +msgstr "Нова ажурирања прекинута" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Критично ажурирање" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Инсталирано" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Помозите у преводу „%s“" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"„%s“ је осмишљен, развијен и превођен од стране међународне заједнице " +"добровољаца.\n" +"\n" +"Ово значи да ако још није доступан на српском језику, можете се придружити и " +"помоћи у превођењу." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Преводи" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Преводилачка с_траница" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Удаљена пријава %s потребна (област %s)" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "Пријава је потребан" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:300 src/gs-common.c:752 +#: src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-page.c:708 +#: src/gs-removal-dialog.ui:24 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:251 src/gs-review-dialog.ui:24 src/gs-review-row.c:239 +#: src/gs-review-row.c:263 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "_Откажи" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "_Пријава" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Корисник" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "Лозинка" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Друго" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Све" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Издвојено" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Избор уредника" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Ново и ажурно" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Одабрано са веба" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Други програми" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "Програм „%s“ инсталиран" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Потребно је поновно покретање како би измене ступиле на снагу" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Програм је спреман за употребу" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Ажурирања система инсталирана" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Преглед скоро инсталираних ажурирања је доступан" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:915 +msgid "Restart" +msgstr "Покрени поново" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Покрени" + +#. TRANSLATORS: window title +#: src/gs-common.c:234 +msgid "Install Software?" +msgstr "Инсталирати програм?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Install Third-Party Software?" +msgstr "Инсталирати програме треће стране?" + +#. TRANSLATORS: window title +#: src/gs-common.c:240 +msgid "Enable Software Repository?" +msgstr "Омогућити софтверску ризницу?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:242 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Желите ли омогућавање ризница са програмима треће стране?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:254 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"Програм „%s“ није слободан софтвер и софтвер отвореног изворног кода, а " +"обезбеђује га ризница „%s“." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:264 +#, c-format +msgid "%s is provided by “%s”." +msgstr "Програм %s обезбеђује ризница „%s“." + +#: src/gs-common.c:273 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Ова ризница програма мора бити укључена да бисте наставили инсталацију." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:283 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Инсталација или коришћење „%s“ може бити противзаконито у неком државама." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:289 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Инсталација или коришћење овог кодека може бити противзаконито у неком " +"државама." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:303 +msgid "Don’t _Warn Again" +msgstr "Не упозоравај _више" + +#. TRANSLATORS: button text +#: src/gs-common.c:312 +msgid "Enable and _Install" +msgstr "Укључи и _инсталирај" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:519 +msgid "Detailed errors from the package manager follow:" +msgstr "Опширније грешке управника пакета следе:" + +#: src/gs-common.c:526 src/gs-common.c:663 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Појединости" + +#. TRANSLATORS: button text +#: src/gs-common.c:575 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Затвори" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:744 +msgid "_Accept" +msgstr "Прихв_ати" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:890 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Ажурирање је инсталирано" +msgstr[1] "Ажурирања су инсталирана" +msgstr[2] "Ажурирања су инсталирана" +msgstr[3] "Ажурирање је инсталирано" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:900 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Програм је уклоњен" +msgstr[1] "Програми су уклоњени" +msgstr[2] "Програми су уклоњени" +msgstr[3] "Један програм је уклоњен" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:906 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Потребно је поновно покретање како би ступила у дејство" +msgstr[1] "Потребно је поновно покретање како би ступила у дејство" +msgstr[2] "Потребно је поновно покретање како би ступила у дејство" +msgstr[3] "Потребно је поновно покретање како би ступило у дејство" + +#. TRANSLATORS: button text +#: src/gs-common.c:913 +msgid "Not Now" +msgstr "Не сада" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1009 +msgid "Just now" +msgstr "Управо сада" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Пре %d минут" +msgstr[1] "Пре %d минута" +msgstr[2] "Пре %d минута" +msgstr[3] "Пре једног минута" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Пре %d сат" +msgstr[1] "Пре %d сата" +msgstr[2] "Пре %d сати" +msgstr[3] "Пре једног сат" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Пре %d дан" +msgstr[1] "Пре %d дана" +msgstr[2] "Пре %d дана" +msgstr[3] "Пре једног дана" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Пре %d недељу" +msgstr[1] "Пре %d недеље" +msgstr[2] "Пре %d недеља" +msgstr[3] "Пре једне недеље" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Пре %d месец" +msgstr[1] "Пре %d месеца" +msgstr[2] "Пре %d месеци" +msgstr[3] "Пре једног месеца" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Пре %d годину" +msgstr[1] "Пре %d године" +msgstr[2] "Пре %d година" +msgstr[3] "Пре једне године" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1394 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Све" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Издвојено" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3Д графика" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Фотографија" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Скенирање" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Векторска графика" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Прегледачи" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Стварање и уређивање звука" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Програми за музику" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Све" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Издвојено" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Календар" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "База података" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Финансије" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Обрађивање текста" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Уређивачи текста" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Веб прегледници" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Све" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Издвојено" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Акција" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Авантура" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Аркадне" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Блокови" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Табла" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Карте" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Опонашавачи" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Дечје игре" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Логика" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Играње улоге" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Спортови" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Стратегије" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Све" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Издвојено" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Ћаскање" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Све" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Издвојено" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Вештачка интелигенција" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Астрономија" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Хемија" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Језици" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Математика" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Вести" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Роботика" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Уметност" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Биографија" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Стрипови" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Фантастика" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Здравље" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Историја" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Начин живљења" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Политика" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Спортови" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Све" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Издвојено" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Прочишћавачи" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "ИРО" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kодеци" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Хардверски управљачки програми" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Слова" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Извори улаза" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Језички пакети" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Превод" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Стваралаштво" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Посао" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Игре" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Друштвено" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Учење" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Програмирање" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kодеци" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Хардверски управљачки програми" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Фонтови" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Извори улаза" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Језички пакети" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Превод" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Програм" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "„%s“ захтева додатну подршку за коришћење ове врсте датотеке." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Потребне су додатни МИМЕ формати" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "„%s“ захтева додатне словне ликове." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Потребни су додатни словни ликови" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "„%s“ захтева додатне мултимедијалне кодеке." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Потребни су додатни мултимедијални кодеци" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "„%s“ захтева додатне управљачке програме за штампаче." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Потребни су додатни управљачки програми штампача" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "„%s“ захтева додатне пакете." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Потребни су додатни пакети" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Нађи у Програмима" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "_Прикажи још" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "При_кажи мање" + +#: src/gs-details-page.c:391 +msgid "Removing…" +msgstr "Уклањам…" + +#: src/gs-details-page.c:406 +msgid "Requires restart to finish install" +msgstr "Захтева поновно покретање за довршавање инсталирања" + +#: src/gs-details-page.c:413 +msgid "Requires restart to finish remove" +msgstr "Захтева поновно покретање за довршавање уклањања" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:429 +msgid "Pending installation…" +msgstr "Чека на инсталирање…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:435 +msgid "Pending update…" +msgstr "Чека на ажурирање…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:450 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Преузимам…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:453 +msgid "Preparing…" +msgstr "Припремам…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:456 +msgid "Uninstalling…" +msgstr "Уклањам…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:583 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s није инсталиран, али још има присутне податке." + +#: src/gs-details-page.c:1078 src/gs-toast.c:65 +msgid "_Restart" +msgstr "Пок_рени поново" + +#: src/gs-details-page.c:1084 +msgid "_Enable…" +msgstr "_Омогући…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1110 +msgid "_Install…" +msgstr "_Инсталирај…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1326 +#, c-format +msgid "%s will appear in US English" +msgstr "%s ће се појавити на америчком енглеском" + +#: src/gs-details-page.c:1334 +msgid "This app will appear in US English" +msgstr "Ова апликација ће се појавити на америчком енглеском језику" + +#: src/gs-details-page.c:1336 +msgid "This software will appear in US English" +msgstr "Овај софтвер ће се појавити на америчком енглеском" + +#: src/gs-details-page.c:1371 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "Учес_твуј у преводу" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1436 +#, c-format +msgid "Other Apps by %s" +msgstr "Други програми од %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1472 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Програмер %s је доказао власништво над %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1475 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Програмер је доказао власништво над %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1838 +msgid "You need internet access to write a review" +msgstr "Потребна вам је веза са интернетом да бисте написали преглед" + +#: src/gs-details-page.c:1939 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Ова апликација више не прима исправке, укључујући безбедносне исправке" + +#: src/gs-details-page.c:1940 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Овај програм је већ доступан у ризницама ваше дистрибуције и не би требали " +"да га замените." + +#: src/gs-details-page.c:1941 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Овај програм не доставља никакву везу до веб странице, ризнице кода или " +"пратиоца проблема." + +#: src/gs-details-page.c:1943 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Ова апликација више не прима исправке, укључујући безбедносне исправке" + +#: src/gs-details-page.c:1944 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Овај програм је већ доступан у ризницама ваше дистрибуције и не би требали " +"да га замените." + +#: src/gs-details-page.c:1945 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Овај софтвер не доставља никакву везу до веб сајта, ризнице кода или " +"пратиоца проблема." + +#: src/gs-details-page.c:2035 src/gs-details-page.c:2052 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Програми нису успели да преузму податке за „%s“, па није могуће приказати " +"податке за овај програм." + +#: src/gs-details-page.c:2407 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Не могу да пошаљем преглед за „%s“: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Страница појединости" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Учитавам појединости програма" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Верификован" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Отвори" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Аж_урирај" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Уклони" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "Додаци" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "Овај програм се може користити само ако постоји веза са интернетом." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "Садржи ризницу програма" + +#: src/gs-details-page.ui:679 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Овај програм садржи ризницу програма из које ћете добијати ажурирања, као и " +"приступ другим програмима." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Не садржи ризницу програма" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Овај програм не садржи ризницу програма. Он неће бити ажуриран на нова " +"издања." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "Ризница програма је препозната" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Додавање ове ризнице програма ће вам омогућити приступ додатним програмима и " +"надоградњама." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Користите само проверене ризнице програма." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Очисти податке из апликације" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "Обриши по_датке" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Без метаподатака" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "Веб страница _пројекта" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "Пошаљи _донацију" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "Допри_неси преводу" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "П_ријави проблем" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "По_моћ" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_Контакт" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "Напиши пр_еглед" + +# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма. +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Сви прегледи" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "Не могу приказати појединости програма" + +#: src/gs-dkms-dialog.c:67 +msgid "Failed to prepare reboot" +msgstr "Нисам успео да припремим поновно покретање" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "Непозната грешка" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "Кључ није нађен" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "Кључ није примењен" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Упис у МОК је потребан" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Следеће" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Безбедно подизање система је омогућено на овом уређају. Да омогућите нове " +"управљачке програме, морате применити нови кључ власника уређаја (МОК). Овак " +"процес ће вас упитати да унесете лозинку. Запишите следећу лозинку која ће " +"бити везана за овај кључ:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Забележио сам МОК _лозинку" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "Поново пок_рени и упиши…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Упутства за подешавање: пажљиво прочитајте" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Након што се систем поново покрене, биће приказан екран за подешавање " +"уређаја. Да омогућите нове управљачке уређаје, наставите кроз следеће кораке " +"за подешавање:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Изаберите „Примени МОК“\n" +"• Изаберите „Да“ да примените кључеве\n" +"• Унесите лозинку за МОК кључ\n" +"• Изаберите „Поново покрени“" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Безбедносне импликације" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Након што кључ буде успешно примењен, уређај ће веровати у безбедност свих " +"наредних ажурирања било којег модула. Сва наредна ажурирања ће се дешавати " +"транспарентно без вашег знања или пријаве." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Додатна упутства можете наћи на страници са документацијом." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Преузимам додатне датотеке са метаподацима…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " и " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Доступан је словни лик за писмо „%s“" +msgstr[1] "Доступни су словни ликови за писмо „%s“" +msgstr[2] "Доступни су словни ликови за писмо „%s“" +msgstr[3] "Доступан је словни лик за писмо „%s“" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Доступан је програм за „%s“" +msgstr[1] "Доступни су програми за „%s“" +msgstr[2] "Доступни су програми за „%s“" +msgstr[3] "Доступан је програм за „%s“" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Тражени софтвер није нађен" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Не могу наћи тражени софтвер" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "Нисам пронашао „%s“" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "на веб страници" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Нису доступни програми који обезбеђују датотеку „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Податке о „%s“, као и упутства за преузимање програма који недостају можете " +"пронаћи на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "Нису доступни програми за „%s“ подршку." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "„%s“ није доступан." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Податке о „%s“, као и упутства за преузимање програма који може да подржи " +"овај формат можете пронаћи на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Нема доступних фонтова за писмо „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Податке о „%s“, као и начин набављања додатних фонтова можете пронаћи на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Нема додатних кодека за формат датотеке „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Податке о „%s“, као и начин набављања кодека који може да пусти ову врсту " +"записа можете наћи на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Нису доступна изворишта Плазме за „%s“ подршку." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Податке о „%s“, као и начин набављања додатних изворишта Плазме можете " +"пронаћи на %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Нису доступни управљачки програми штампача за „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Податке о „%s“, као и начин набављања управљачког програма који може да " +"подржи овај штампач можете наћи на %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "документација" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Не можемо наћи „%s“ кодек(е), које је затражио програм „%s“. Погледајте " +"одељак %s за више података." +msgstr[1] "" +"Не можемо наћи „%s“ кодек(е), које је затражио програм „%s“. Погледајте " +"одељак %s за више података." +msgstr[2] "" +"Не можемо наћи „%s“ кодек(е), које је затражио програм „%s“. Погледајте " +"одељак %s за више података." +msgstr[3] "" +"Не можемо наћи „%s“ кодек(е), које је затражио програм „%s“. Погледајте " +"одељак %s за више података." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Не можемо наћи „%s“ кодек(е), које сте тражили. Погледајте одељак %s за више " +"података." +msgstr[1] "" +"Не можемо наћи „%s“ кодек(е), које сте тражили. Погледајте одељак %s за више " +"података." +msgstr[2] "" +"Не можемо наћи „%s“ кодек(е), које сте тражили. Погледајте одељак %s за више " +"података." +msgstr[3] "" +"Не можемо наћи „%s“ кодек(е), које сте тражили. Погледајте одељак %s за више " +"података." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Нисам успео наћи било шта: %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "%s формат датотеке" + +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "Инсталир_ај све" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "Не могу да нађем потребне програме" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Страница кодека" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "Нема резултата" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "Претрага није могућа" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Претходно" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Следеће" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Списак издвојених програма" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Подршка за радну површ" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Подржава коришћење на великом екрану" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Подршка стоног рачунара није позната" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Нема довољно података да бисмо знали да ли су велики екрани подржани" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Захтева велики екран" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Радна површ није подржана" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Не може се користити на великом екрану" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Подршка за мобилне" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Подржава коришћење на малом екрану" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Подршка преносних није позната" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Нема довољно података да бисмо знали да ли су мали екрани подржани" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Захтева мали екран" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Преносни нису подржани" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Не може се користити на малом екрану" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Подршка за тастатуру" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Подршка тастатуре није позната" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Нема довољно података да бисмо знали да ли су тастатуре подржане" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Тастатура је обавезна" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Подржава тастатуре" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Тастатура није подржана" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Не може се користити са тастатуром" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Подршка за миша" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Захтева миша или показивачки уређај" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Подршка миша није позната" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Нема довољно података да бисмо знали да ли је миш или показивачки уређај " +"подржан" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Миш је обавезан" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Подржава миша и показивачке уређаје" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Миш није подржан" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Не може се користити са мишем или показивачким уређајем" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Подршка екрана на додир" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Подршка екрана на додир није позната" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Нема довољно података да бисмо знали да ли су екрани на додир подржани" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Додирна табла је обавезна" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Подржава екране на додир" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Екран на додир није подржан" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Не може се користити са екраном на додир" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Гејмпад је обавезан" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Захтева гејмпад" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Подршка за гејмпад" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Подржава играчке палице" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "„%s“ вероватно ради на овом уређају" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "„%s“ ради на овом уређају" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "„%s“ вероватно ради на овом уређају" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "„%s“ неће исправно радити на овом уређају" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "„%s“ неће радити на овом уређају" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Хардверска подршка" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Навигација" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Кретање до странице за истраживање" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Иди на страницу инсталираног" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Иди на страницу ажурирања" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Отвори траку за претраживање" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Виндоуз" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Отвори поставке" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Отвори ризнице програма" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Помоћ" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Отвори пречице тастатуре" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Инсталирано" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Страница инсталираног" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "У току" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Апликације" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "Веб апликације" + +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "Системски програми" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Изградња заједнице" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Прикључите се" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Овај програм се развија отворено од стране заједнице добровољаца, и издат је " +"под %s лиценцом.\n" +"\n" +"Можете допринети и помоћи да постане много бољи." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Овај програм се развија отворено од стране заједнице добровољаца, и издат је " +"под „%s“ лиценцом.\n" +"\n" +"Можете допринети и помоћи да постане много бољи." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Овај програм се развија отворено од стране заједнице добровољаца, и издат је " +"под %s лиценцом.\n" +"\n" +"Можете допринети и помоћи да постане много бољи." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Овај програм се развија отворено од стране заједнице добровољаца, и издат је " +"под „%s“ лиценцом.\n" +"\n" +"Можете допринети и помоћи да постане много бољи." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Непозната дозвола" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Сазнај више" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Овај програм не садржи лиценцу под којом је издат и може бити власнички " +"софтвер. Можда је небезбедан на начине које је тешко истражити, а програмери " +"га могу изменити без да вас о томе обавесте.\n" +"\n" +"Можда нећете бити у могућности да допринесете овом програму." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Овај софтвер не садржи лиценсу под којом је издат и може бити власнички. " +"Можда је небезбедан на начине које је тешко истражити, а програмери га могу " +"изменити без да вас о томе обавесте.\n" +"\n" +"Можда нећете бити у могућности да допринесете овом програму." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Власнички" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Овај програм није издат као слободан, тако да само његови програмери знају " +"како ради. Можда је небезбедан и теже је променити га по потреби.\n" +"\n" +"Нећете бити у могућности да допринесете овом софтверу." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Овај софтвер није развијен као слободан, тако да само његови програмери " +"знају како ради. Можда је небезбедан на начине које је тешко истражити, а " +"програмери га могу изменити без да вас о томе обавесте.\n" +"\n" +"Нећете бити у могућности да допринесете овом софтверу." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Посебна дозвола" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ова апликација је развијена под посебном лиценцом %s.\n" +"\n" +"Можете , али и не морате да допринесете овој апликацији." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ова апликација је развијена под посебном лиценцом „%s“.\n" +"\n" +"Можете , али и не морате да допринесете овој апликацији." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Овај софтвер је развијен под специјалном %s лиценцом.\n" +"\n" +"Можда нећете моћи да допринесете овом софтверу." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Овај софтвер је развијен под специјалном „%s“ лиценцом.\n" +"\n" +"Можда нећете моћи да допринесете овом софтверу." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Освежавам податке" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Учитавам страницу" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Покрећем се" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Непознати извор" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Бета" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Додато" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Уклоњено" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Ажурирања" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Уназађивања" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "изабраних спољних извора" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Обезбеђује приступ додатном софтверу из „%s“. Ту се налазе и неки власнички " +"програми.\n" +"\n" +"Можете омогућити ове ризнице касније у подешавањима ризница Програма." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Укључити ризнице програма треће стране?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "Занемар_и" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Омогући" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "Доступно за ваш оперативни систем" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "Доступан је за „%s“" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Истражи" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Страница прегледа" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Доступни програми" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Друге категорије" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Нема података о програмима" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Непознато" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "У _реду" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Корисник је одбио инсталирање" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Припремам „%s“" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Да ли сигурно желите да уклоните ризницу „%s“?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Сви програми из ризнице „%s“ ће бити уклоњени и морате поново да инсталирате " +"ризницу да бисте их користили." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 +#: src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "Уклонити „%s“?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "It will not be possible to use %s after removal." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Неће бити могуће да користите програме који зависе од „%s“ након што га " +"уклоните." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Нећете моћи да користите „%s“ након уклањања, а сви документи који га " +"користе ће бити приказани у другачијим фонтом." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Нећете моћи да користите „%s“ након што га уклоните. Ово можда значи да " +"нећете моћи да пуштате неке мултимедијалне датотеке." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Хардвер који зависи од „%s“ можда неће радити исправно након што уклоните " +"овај програм." + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "Подешавања програма и подаци" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:667 +msgid "_Keep" +msgstr "_Задржи" + +#: src/gs-page.c:673 +msgid "Allows restoring app settings and content" +msgstr "Дозволи враћање подешавања и садржаја програма" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:682 +msgid "_Delete" +msgstr "О_бриши" + +#: src/gs-page.c:688 +msgid "Permanently deletes data to save disk space" +msgstr "Трајно обриши податке и ослободи простор на диску" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:696 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Нећете моћи да користите „%s“ након што га уклоните. Подаци и подешавања ће " +"остати на диску како би могли да повратите програм касније." + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:710 +msgid "_Uninstall" +msgstr "_Уклони" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Поставке" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Ажурирања програма" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "Још података" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Провера и преузимање ажурирања користи податке и напајање. Аутоматска " +"ажурирања ће бити паузирана док сте на мрежи са ограниченом количином " +"података и када је укључен режим за чување енергије." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "С_амостално" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Самостално проверавај и преузимај ажурирања" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "Руч_но" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Морате ручно да обавите проверу и преузимања ажурирања" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Обавештења о самостал_ним ажурирањима" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Обавештавај о инсталирању самосталних ажурирања" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Филтери садржаја" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Само с_лободан софтвер" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Сакриј власнички софтвер приликом прегледања и претраге" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Прикажи само по_тврђене програмере" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Приказује програме само од програмера чији је идентитет потврђен" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Инсталирани софтвер није сагласан са „%s“ и биће аутоматски уклоњен приликом " +"надограгње." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Несагласан софтвер" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Надогради" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "Програми инсталирани из ризнице „%s“ више неће добијати ажурирања." + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Онемогућити ризницу?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Уклонити ризницу?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "Онемо_гући" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:266 +msgid "_Remove" +msgstr "_Уклони" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Омогући нове ризнице" + +#: src/gs-repos-dialog.c:612 +msgid "Turn on new repositories when they are added" +msgstr "Укључите нове ризнице када су додате" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "још података" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Додатни програми са извора пробраних трећих страна — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Fedora ризнице трећих страна" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "оперативни систем" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Ове ризнице допуњавају подразумеване програме које пружа дистрибуција „%s“." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Ризнице програма" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "Нема ризница" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u инсталиран програм" +msgstr[1] "%u инсталирана програма" +msgstr[2] "%u инсталираних програма" +msgstr[3] "Један инсталирани програм" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u инсталиран додатак" +msgstr[1] "%u инсталирана додатка" +msgstr[2] "%u инсталираних додатака" +msgstr[3] "Један инсталирани додатак" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u програм" +msgstr[1] "%u програма" +msgstr[2] "%u програма" +msgstr[3] "Један програм" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u додатак" +msgstr[1] "%u додатка" +msgstr[2] "%u додатака" +msgstr[3] "Један додатак" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s и %s су инсталирани" +msgstr[1] "%s и %s су инсталирана" +msgstr[2] "%s и %s је инсталирано" +msgstr[3] "%s и %s су инсталирани" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Проверавам инсталирани програм…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Уклони" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Никакав" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Не допада ми се" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "У реду је" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Добар је" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Одличан" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Изаберите звездицу да оставите оцену" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Утрошите мало више времена за писање прегледа" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Изаберите оцену звездицом" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Сажетак је прекратак" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Сажетак је предуг" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "Опис је прекратак" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "Опис је предуг" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Напиши преглед" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Пошаљи" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Оцените програм, додајте кратак опис или рецензију. Оцене не треба користити " +"за пријављивање проблема, па контактирајте програмере како би вам пружили " +"адекватну помоћ." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Сажетак прегледа" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "Напиши кратки преглед" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Погледајте појединости података које шаљемо у нашој политици приватности. Цело име и презиме везано за " +"ваш налог биће приказано јавно." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u преглед укупно" +msgstr[1] "%u прегледа укупно" +msgstr[2] "%u прегледа укупно" +msgstr[3] "1 преглед укупно" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "од 5 звездица" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Непознато" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:227 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Можете да пријавите да су прегледи увредљивог, грубог или дискриминаторског " +"понашања." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:232 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Након подношења, преглед ће бити скривен све док га не провери неко од " +"администратора." + +# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма. +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:237 +msgid "Report Review?" +msgstr "Да објавим преглед?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:242 +msgid "_Report" +msgstr "П_ријави" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:258 +msgid "Remove Review?" +msgstr "Уклонити преглед?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:261 +msgid "Removing a review cannot be undone." +msgstr "Нећете моћи да поништите уклањање резенције." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Свиђа ми се преглед" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Не свиђа ми се преглед" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Објави…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Уклони…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Програм није у безбедном окружењу али је дистрибуција проверила да није " +"злонамеран" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Провера да ли верујете продавцу, јер програм није у безбедном окружењу" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Без овлашћења" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Програм је у потпуности изолован" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Приступ мрежи" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Може приступати интернету" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Нема мрежни приступ" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Не може приступати интернету" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Користи системске услуге" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Може да захтева податке од услуга система" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Користи услуге сесије" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Може да захтева податке од услуга сесије" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Приступ уређају корисника" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Може да приступи уређајима као што су веб камерице или играчки контролери" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Нема приступ уређају корисника" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Не може да приступи уређајима као што су веб камерице или играчки контролери" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Приступ улазном уређају" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Приступ микрофону" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "Може да вас слуша преко микрофона без тражења дозволе" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Приступ уређајима на систему" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Може да приступи уређајима на систему без тражења дозволе" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Приступ садржају екрана" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Може да приступи садржају екрана или прозора програма" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Застарели прозорски систем" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Додатна овлашћења" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Корисничка подешавања" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Потпун приступ читања/писања датотеке система" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Може да чита и пише све податке на систему датотека" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Приступ читања/писања личне фасцикле" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Може да чита и пише све податке у вашој личној фасцикли" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Потпун приступ читања датотеке система" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Може да чита све податке на систему датотека" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Приступ читања личне фасцикле" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Може да чита све податке у вашој личној фасцикли" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Приступ читања/писања у фасцикли преузимања" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Може да чита и пише све податке у вашој фасцикли преузимања" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Приступ фасцикли са преузимањима" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Може да чита све податке у вашој фасцикли преузимања" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Може да чита и пише све податке у фасцикли" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Може да чита све податке у фасцикли" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Нема приступ систему датотека" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Не може уопште приступати систему датотека" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Програмер је проверен" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Програмер овог програма је проверен и јесте онај којим се и представио" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Небезбедне зависности" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Програм (или његове зависности) више није подржан и може бити небезбедан" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Овај програм није одредио лиценцу под којом је издат и може бити власнички " +"софтвер" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Овај софтвер није одредио лиценцу под којом је издат и може бити власнички" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Власнички код" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Изворни код није јавни, тако да не може бити независно испитан и може бити " +"небезбедан" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Овај програм је издат са специјалном „%s“ лиценцом" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Овај софтвер је издат под специјалном „%s “ лиценцом" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Код испитивања" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Изворни код је јавни и може бити независно испитан, што чини да програм " +"вероватније буде безбедан" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "„%s“ је привилегован" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "„%s“ је безбедан" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "„%s“ је вероватно безбедан" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "„%s“ је можда небезбедан" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "„%s“ је небезбедан" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Непознато" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Безбедност" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Лиценца" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "Извор" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "СДК" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Овај програм користи застарелу верзију софтверске платформе (СДК) и можда " +"има грешке или безбедоносне пропусте који неће бити поправљени." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Претходни снимак екрана" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Наредни снимак екрана" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Нема снимака екрана" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Нема снимака екрана" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Нисам успео да учитам слику" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Нисам пронашао величину снимка екрана" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Не могу да направим оставу" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Неисправан снимак екрана" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Снимак екрана није доступан" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Снимак екрана" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "још %u погодак" +msgstr[1] "још %u поготка" +msgstr[2] "још %u погодака" +msgstr[3] "још %u погодак" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Страница претраге" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Тражи програме" + +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "Није пронађен програм" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "„%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Не могу да преузмем ажурирања" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "Не могу да преузмем ажурирања фирмвера" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Не могу да преузмем ажурирања фирмвера са „%s“" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Не могу да преузмем ажурирања са извора „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "Не могу да ажурирам: потребан је приступ на интернет" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "Не могу да ажурирам: нема довољно простора на диску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Не могу да преузмем ажурирања са извора „%s“: нема довољно простора на диску" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "Не могу да ажурирам: потребна је пријава" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "Не могу да ажурирам: неисправна пријава" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "Не могу да ажурирам: потребна је дозвола" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Не могу да преузмем ажурирања: немате овлашћење за инсталирање програма" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Не могу да преузмем списак ажурирања" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "Не могу да инсталирам: није успело преузимање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Не могу да инсталирам „%s“: није успело преузимање са „%s“" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Не могу да инсталирам „%s“: није успело преузимање" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "Не могу да инсталирам: недостаје извршно време" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Не могу да инсталирам „%s“: није доступно извршно време „%s“" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "Не могу да инсталирам програм „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "Не могу да инсталирам: потребан је приступ на интернет" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "Не могу да инсталирам: неисправан формат програма" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "Не могу да инсталирам: нема довољно простора на диску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Не могу да инсталирам „%s“: нема довољно простора на диску" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "Не могу да инсталирам: потребна је пријава" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Не могу да инсталирам „%s“: потребна је пријава" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "Не могу да инсталирам: неисправна пријава" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Не могу да инсталирам „%s“: неисправна пријава" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "Не могу да инсталирам: потребна је дозвола" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Не могу да инсталирам „%s“: потребна је дозвола" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "Не могу да инсталирам: уређај мора бити прикључен на напајање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Не могу да инсталирам „%s“: уређај мора бити прикључен на напајање" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "Не могу да инсталирам: батерија је скоро празна" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Не могу да инсталирам „%s“: батерија је скоро празна" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Не могу да ажурирам „%s“ из „%s“: није успело преузимање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Не могу да ажурирам „%s“: није успело преузимање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Не могу да инсталирам ажурирања из „%s“: није успело преузимање" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "Не могу да ажурирам: није успело преузимање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Не могу да ажурирам „%s“: нема довољно простора на диску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Не могу да ажурирам „%s“: потребна је пријава" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Не могу да ажурирам „%s“: неисправна приава" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Не могу да ажурирам „%s“: потребна је дозвола" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "Не могу да ажурирам: уређај мора бити прикључен на напајање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Не могу да ажурирам „%s“: уређај мора бити прикључен на напајање" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "Не могу да ажурирам: батерија је скоро празна" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Не могу да ажурирам „%s“: батерија је скоро празна" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "Не могу да ажурирам програм „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "Не могу да ажурирам" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Не могу да надоградим" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Не могу да се надоградим са дистрибуције „%s“ на дистрибуцију „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "Не могу да надоградим: није успело преузимање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Не могу да надоградим на „%s“: није успело преузимање" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "Не могу да надоградим: потребан је приступ на интернет" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Не могу да надоградим на „%s“: потребан је приступ на интернет" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "Не могу да надоградим: нема довољно простора на диску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Не могу да надоградим на „%s“: нема довољно простора на диску" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "Не могу да надоградим: потребна је пријава" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Не могу да надоградим на „%s“: потребна је пријава" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "Не могу да надоградим: неисправна пријава" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Не могу да надоградим на „%s“: неисправна пријава" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "Не могу да надоградим: потребна је дозвола" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Не могу да надоградим на „%s“: потребна је дозвола" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Не могу да надоградим: уређај мора бити прикључен на напајање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Не могу да надоградим на „%s“: уређај мора бити прикључен на напајање" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "Не могу да надоградим: батерија је скоро празна" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Не могу да надоградим на „%s“: батерија је скоро празна" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Не могу да надоградим на „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "Не могу да уклоним: потребна је пријава" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Не могу да уклоним „%s“: потребна је пријава" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +msgid "Unable to uninstall: invalid authentication" +msgstr "Не могу да уклоним: неисправна пријава" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Не могу да уклоним „%s“: неисправна приава" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "Не могу да уклоним: потребна је дозвола" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Не могу да уклоним „%s“: потребна је дозвола" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Не могу да уклоним: уређај мора бити прикључен на напајање" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Не могу да уклоним „%s“: уређај мора бити прикључен на напајање" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "Не могу да уклоним: батерија је скоро празна" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Не могу да уклоним „%s“: батерија је скоро празна" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Не могу да уклоним „%s“" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "Не могу да покренем „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "Нажалост, нешто је пошло наопако" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Не могу да покренем програм „%s“: део „%s“ није инсталиран" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "Нема довољно слободног простора на диску за ову радњу" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "Не могу да инсталирам: врста датотеке није подржана" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "Не могу да инсталирам: није успела пријава" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Не могу да инсталирам" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "Не могу да контактирам извор „%s“" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "Поново покрените Програме да користите нове прикључке" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "Уређај мора бити прикључен на напајање" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Батерија је скоро празна" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "О Програмима" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "Р_изнице програма" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "Пречице _тастатуре" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_Поставке" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Претражи" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Главни мени" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Тражи програме" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "_Истражи" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Инсталирани" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Аж_урирања" + +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "Идите назад" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ништа" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Подаци програма" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Подаци потребни за програм да би се покренуо" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Кориснички подаци" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Подаци направљени у програму са ваше стране" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Подаци оставе" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Привремено смештени подаци" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Сам програм" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Захтеване зависности" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Дељене компоненте система захтеване овим програмом" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Непознато" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Привремени подаци могу бити очишћени из подешавања _програма" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Складиште" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Инсталиран)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Инсталирам)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (преузимање)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Уклањам)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "Поје_диности" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Испитај" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Инсталиран је %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "Инсталирана ажурирања" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "Ажурирања нису инсталирана" + +#: src/gs-update-monitor.c:215 +msgid "Updates Are Out of Date" +msgstr "Ажурирања програма су застарела" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "Проверите да ли су доступна ажурирања" + +#: src/gs-update-monitor.c:222 +msgid "Critical Updates Ready to Install" +msgstr "Хитно ажурирање је спремно за инсталирање" + +#: src/gs-update-monitor.c:223 +msgid "Install critical updates as soon as possible" +msgstr "Инсталирајте хитна ажурирања што пре" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "Хитна ажурирања су доступна за преузимање" + +#: src/gs-update-monitor.c:227 +msgid "Download critical updates as soon as possible" +msgstr "Преузмите хитна ажурирања што пре" + +#: src/gs-update-monitor.c:233 +msgid "Updates Ready to Install" +msgstr "Ажурирања су спремна за инсталирање" + +#: src/gs-update-monitor.c:234 +msgid "Software updates are ready and waiting" +msgstr "Ажурирања софтвера и спремна за инсталирање и налазе се на чекању" + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "Ажурирања спремна за преузимање" + +#: src/gs-update-monitor.c:241 +msgid "Software updates can be downloaded" +msgstr "Можете преузети ажурирања софтвера" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u програм је ажуриран — потребно је поновно покретање" +msgstr[1] "%u програма су ажурирана — потребно је поновно покретање" +msgstr[2] "%u програма је ажурирано — потребно је поновно покретање" +msgstr[3] "Програм је ажуриран — потребно је поновно покретање" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u програм је ажуриран" +msgstr[1] "%u програма су ажурирана" +msgstr[2] "%u програма је ажурирано" +msgstr[3] "Програм је ажуриран" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "Програм „%s“ је ажуриран." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "Поново покрените програм" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "Програми „%s“ и „%s“ су ажурирани." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u програм захтева поновно покретање." +msgstr[1] "%u програма захтевају поновно покретање." +msgstr[2] "%u програма захтевају поновно покретање." +msgstr[3] "Програм захтева поновно покретање." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Укључујући програме „%s“, „%s“ и „%s“." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "Систем више није подржан" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +msgid "Upgrade to continue receiving updates" +msgstr "Надоградите како би наставили да добијате ажурирања" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Нова верзија дистрибуције %s је доступна за инсталацију" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "Доступна су ажурирања програма" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "Ажурирање програма није успело" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "Prepared updates were not installed" +msgstr "Припремљена ажурирања нису инсталирана" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Прикажи појединости" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Наодградња система је готова" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Добро дошли у дистрибуцију %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Програм је ажуриран" +msgstr[1] "Програми су ажурирани" +msgstr[2] "Програми су ажурирани" +msgstr[3] "Један програм је ажуриран" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Важно ажурирање система је инсталирано." +msgstr[1] "Важна ажурирања система су инсталирана." +msgstr[2] "Важна ажурирања система су инсталирана." +msgstr[3] "Једно важно ажурирање система је инсталирано." + +# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма. +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Преглед" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "Неуспех при инсталирању ажурирања" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "Систем је већ ажуран." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "Ажурирање је отказано." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Нема излаза на интернет иако је то потребно. Постарајте се да имате приступ " +"интернету и покушајте поново." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Програми су наишли на безбедносне проблеме са ажурирањем. Поразговарајте са " +"добављачем ваших програма за више појединости." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Нема довољно слободног простора на диску. Ослободите простор на диску па " +"покушајте поново." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Нажалост, догодила се грешка приликом ажурирања. Сачекајте ново ажурирање па " +"покушајте поново. Уколико се ова грешка опет догоди, пријавите то добављачу " +"ваших програма." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Последња провера: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Заустави" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Провери да ли има ажурирања" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s је престао да добија хитна ажурирања софтвера" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Ваш оперативни систем више не добија хитна ажурирања софтвера" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Могу настати додатни новчани трошкови" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Провера ажурности приликом коришћења мобилне широкопојасне мреже може " +"довести до повећања трошкова на вашој картици." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Ип_ак провери" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Преузета су ажурирања софтвера" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Надоградње су спремне за инсталирање" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "Провери да ли има ажурирања" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Ажурирања" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Страница ажурирања" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "Учитавам ажурирања" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "Ово може потрајати неко време" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "Све је ажурно" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "Користити мобилне податке?" + +#: src/gs-updates-page.ui:232 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Провера ажурности приликом коришћења мобилног интернета може довести до " +"неочекиваних трошкова" + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "_Ипак провери" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "Нисте повезани" + +#: src/gs-updates-page.ui:255 +msgid "Go online to check for updates" +msgstr "Повежи се и потражи ажурирања" + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "_Подешавања мреже" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "Грeшкa" + +#: src/gs-updates-page.ui:293 +msgid "Updates are automatically managed" +msgstr "Ажурирања се самостално обављају" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Ажурирања програма су паузирана" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Аутоматска ажурирања софтвера су паузирана из следећих разлога:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Повезани сте на мрежу са ограниченом количином интернета" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Мрежна веза не дозвољава преузимање великих датотека" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Активан је режим за уштеду енергије" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Активан је режим за игрице" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Ажурирања програма су паузирана" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"Мрежа је повезана на интернет са ограниченом количином података — ажурирање " +"софтвера је паузирано" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Мрежа је повезана на интернет који је дозвољава преузимање великих датотеке " +"— ажурирање софтвера је паузирано" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Покренут је режим за уштеду енергије — ажурирања софтвера су паузирана" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Активирај не режим за игрице — ажурирања софтвера су паузирана" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:321 +msgid "_Restart & Update…" +msgstr "_Поново покрени и ажурирај…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:327 +msgid "U_pdate All" +msgstr "Аж_урирај све" + +#: src/gs-updates-section.c:404 +msgid "Software Updates Downloaded" +msgstr "Ажурирања софтвера су преузета" + +#: src/gs-updates-section.c:405 +msgid "Updates are ready to be installed" +msgstr "Ажурирања су спремна за инсталирање" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:496 +msgid "Integrated Firmware" +msgstr "Уграђени фирмвер" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:501 +msgid "Requires Restart" +msgstr "Захтева поновно покретање" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:506 +msgid "App Updates" +msgstr "Ажурирања програма" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:511 +msgid "Device Firmware" +msgstr "Фирмвер уређаја" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Преузми" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Дистрибуција %s %s је доступна" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Дистрибуција %s је доступна" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Сазнајте о новом издању" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s од %s је преузето" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% је преузето" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Велика надоградња, са новим функцијама и додатим исправкама." + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "По_ново покрени и надогради…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Не заборавите да направите резерву ваших података и датотека пре " +"надограђивања." + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Не могу да обришем датотеку „%s“: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Не могу да обришем директоријум „%s“: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Додајте, уклоните или ажурирајте програме на овом рачунару" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Ажурирања;освежења;доградње;надоградње;извори;ризнице;складишта;поставке;" +"инсталација;уклањање;програм;софтвер;апликација;радња;исправке;апдејтови;" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;ažuriranja;osveženja;dogradnje;nadogradnje;izvori;riznice;" +"skladišta;postavke;instalacija;uklanjanje;program;softver;aplikacija;radnja;" +"ispravke;apdejtovi;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s је спреман" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"%s је спреман и може бити омогућен и укључен приликом следећег подизања " +"система." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Укључи" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3170 +msgid "System Updates" +msgstr "Ажурирања система" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3175 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Општа ажурирања система као што су безбедносне исправке и исправке грешки, и " +"побољшања брзине рада." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s надоградња са новим функцијама и исправкама." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Услуга ажурирања ЕОС-а није могла добавити и применити ажурирање." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Веб програм" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Подршка за веб апликације" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Изврши популарне веб програме унутар прегледача" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Надоградите ваш систем ради нових могућности, побољшања брзине и боље " +"стабилности." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Подршка за Флетпек (Flatpak)" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Флетпек је радни оквир за Линукс програме" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Системска фасцикла %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Лична подфасцикла %s" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Фасцикле система домаћина" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "Подешавања из /etc система домаћина" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Фасцикал радне површи" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Подфасцикла радне површи %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Фасцикла са документима" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Подфасцикла са документима %s" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Фасцикла музике" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Подфасцикла музике %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Фасцикла са сликама" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Подфасцикла са сликама %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Фасцикла јавног дељења" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Подфасцикла јавног дељења %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Видео фасцикла" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Видео подфасцикла %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Фасцикла са шаблонима" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Подфасцикла шаблона %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Корисничка кеш фасцикла" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Корисничка кеш подфасцикла %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Фасцикла корисничких подешавања" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Подфасцикла корисничких подешавања %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Фасцикла корисничких података" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Корисничка подфасцикла са подацима %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Фасцикла корисничкох извршног окружења" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Корисничка подфасцикла извршног окружења %s" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Приступ путањи %s система датотека" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Добављам флетпек метаподатке за %s…" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Не могу да обрадим додатак „%s“: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Корисничка инсталација" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Системска инсталација" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "ИБ програма" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Неуспех при инсталирању додатка „%s“: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Неуспех при уклањању додатка „%s“: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Удаљени извор „%s“ не дозвољава инсталирање програма „%s“, највероватније " +"због свог филтера. Уклоните филтер и поновите инсталирање. Опширна грешка: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Снага система је превише мала да би се извршило ажурирање" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Снага система је превише мала да би се извршило ажурирање. (%u%%, захтева " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Уређај је недоступан или је ван бежичног домета" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Батерија уређаја је скоро празна" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Батерија уређаја је превише слаба (%u%%, захтева %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Уређај чека да се примени ажурирање" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Потребно је уређај укључити у струју да би се се повезао" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Уређај не може бити коришћен док је поклопац затворен" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:208 +#, c-format +msgid "%s Device Update" +msgstr "Ажурирање „%s“ уређаја" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s System Update" +msgstr "Ажурирање „%s“ система" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Ажурирање „%s“ угнежђеног контролера" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s ME Update" +msgstr "Ажурирање „%s“ управљачког мотора (ME)" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Ажурирање „%s“ корпоративног управљачког мотора (ME)" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Ажурирање „%s“ потрошачког управљачког мотора (ME)" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:239 +#, c-format +msgid "%s Controller Update" +msgstr "Ажурирање „%s“ контролера" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:245 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Ажурирање „%s“ тандерболт контролера" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Ажурирање „%s“ процесорског микрокода" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s Configuration Update" +msgstr "Ажурирање „%s“ подешавања хардвера" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Battery Update" +msgstr "Ажурирање „%s“ батерије" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Camera Update" +msgstr "Ажурирање „%s“ камере" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s TPM Update" +msgstr "Ажурирање „%s“ ТПМ-а" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s Touchpad Update" +msgstr "Ажурирање „%s“ додирне табле" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Mouse Update" +msgstr "Ажурирање „%s“ миша" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Keyboard Update" +msgstr "Ажурирање „%s“ тастатуре" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Ажурирање „%s“ контролера складишта" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Network Interface Update" +msgstr "Ажурирање „%s“ мрежне картице" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Display Update" +msgstr "Ажурирање „%s“ екрана" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s BMC Update" +msgstr "Ажурирање „%s“ baseboard управљачког контролера" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Ажурирање УСБ пријемника %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s Drive Update" +msgstr "Ажурирање диска %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Ажурирање флеш диска „%s“" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s SSD Update" +msgstr "Ажурирање ССД диска „%s“" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s GPU Update" +msgstr "Ажурирање графичког процесора „%s“" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s Dock Update" +msgstr "Ажурирање док уређаја „%s“" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s USB Dock Update" +msgstr "Ажурирање УСБ док уређаја %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Фирмвер" + +#: plugins/fwupd/gs-plugin-fwupd.c:1918 +msgid "Firmware update could not be applied: " +msgstr "Не могу да применим ажурирање фирмвера: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Подршка за надоградњу фирмвера" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Пружа подршку за надоградње фирмвера" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Инсталирати непотписани програм?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Програм који ће бити инсталиран није потписан. Није могуће проверити извор " +"ажурирања за овај софтвер или да ли је неко неовлашћено мењао исправке." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Преузети непотписани програм?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Непотписане исправке су доступне. Није могуће проверити извор ажурирања за " +"овај софтвер или да ли је неко неовлашћено мењао исправке, без потписа." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Ажурирати непотписани програм?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Непотписане исправке су доступне. Није могуће проверити извор ажурирања за " +"овај софтвер или да ли је неко неовлашћено мењао исправке. Исправке програма " +"биће онемогућене све док непотписане исправке нису исправљене или уклоњене." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Не могу да инсталирам ажурирања: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Пакети" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1436 +msgid "Failed to wait on transaction end before download: " +msgstr "Не могу да чекам крај преноса пре преузимања: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1443 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1456 +msgid "Failed to download updates: " +msgstr "Не могу да преузмем ажурирања: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1495 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1505 +msgid "Failed to trigger update: " +msgstr "Не могу да покренем ажурирање: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3270 +msgid "Operating System (OSTree)" +msgstr "Оперативни систем (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Складиште снепова" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Подршка за Снеп (Snap)" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Снеп је универзални Линукс пакет" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Фин начин за управљање програмима на вашем систему." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Унеси број од 1 до %u: " + +#, fuzzy +#~| msgid "Choose an application:" +#~ msgid "Choose an app:" +#~ msgstr "Одаберите програм:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "„%s“ је сада инсталиран" + +#, fuzzy +#~| msgid "An application has been removed" +#~| msgid_plural "Applications have been removed" +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Програм је уклоњен" +#~ msgstr[1] "Програм је уклоњен" +#~ msgstr[2] "Програм је уклоњен" +#~ msgstr[3] "Програм је уклоњен" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Не могу да пронађем „%s“" + +#, fuzzy +#~| msgid "Downloading software catalog" +#~ msgid "Downloading Software Catalog" +#~ msgstr "Преузимам каталог програма" + +#~ msgid "Moderate page" +#~ msgstr "Страница уређења" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Нема прегледа за уређење" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Да ли вам је овај преглед користио?" + +#~ msgid "Yes" +#~ msgstr "Јесте" + +#~ msgid "No" +#~ msgstr "Није" + +#~ msgid "Meh" +#~ msgstr "Онако" + +#~ msgid "Outdated SDK version" +#~ msgstr "Застарело СДК издање" + +#~ msgid "Unable to install updates" +#~ msgstr "Не могу да инсталирам ажурирања" + +#, fuzzy +#~| msgid "Unable to install %s: authentication was invalid" +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Не могу да инсталирам програм „%s“: пријава није била исправна" + +#~ msgid "Network Settings" +#~ msgstr "Подешавања мреже" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Ажурирања оперативног система нису доступна" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Није успело инсталирање важног ажурирања система." + +#~ msgid "No Network" +#~ msgstr "Нема мреже" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Потребан је приступ Интернету за проверу ажурирања." + +#, fuzzy +#~| msgid "Network Settings" +#~ msgid "Network _Settings" +#~ msgstr "Подешавања мреже" + +#, fuzzy +#~| msgid "Software updates are waiting and ready to be installed." +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Ажурирања програма су доступна и спремна за инсталирање." + +#, fuzzy +#~| msgid "Software updates are waiting and ready to be installed." +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Ажурирања програма су доступна и спремна за инсталирање." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Преузимам податке о надоградњи…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Последњи временски жиг када је систем био на мрежи и када је добио " +#~ "ажурирања" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Приказује опширне податке прочишћавања" + +#~ msgid "_User" +#~ msgstr "_Корисник" + +#~ msgid "An application" +#~ msgstr "Програм" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Изабрани додаци биће инсталирани са програмом." + +#~ msgid "Applications" +#~ msgstr "Програми" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Самостална ажурирања су паузирана" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an un­metered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been in­correctly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "Тренутна мрежа је ограничена. Ограничене мреже, осим самих ограничења, " +#~ "могу имати и додатне новчане трошкове. Да бисте уштедели податке, " +#~ "самостална ажурирања су паузирана.\n" +#~ "\n" +#~ "Самостална ажурирања биће настављена када се будете повезали на " +#~ "неограничену мрежу. До тада, могуће је ручно инсталирати ажурирања.\n" +#~ "\n" +#~ "Уколико је тренутна мрежа означена ограниченом грешком, ово подешавање се " +#~ "може променити." + +#~ msgid "Open Network _Settings" +#~ msgstr "Отвори по_дешавања мреже" + +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Да ли сигурно желите уклонити „%s“?" + +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "Програм „%s“ биће уклоњен, мораћете да га инсталирате поново да бисте га " +#~ "користили." + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Да бисмо избегли трошкове и ограничења мреже, ажурирања се не обављају " +#~ "самостално на мобилним или ограниченим везама." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible." +#~ msgstr "Преузима и инсталира ажурирања у позадини, када је то могуће." + +#~ msgid "_Continue" +#~ msgstr "_Настави" + +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u програм" +#~ msgstr[1] "%u програма" +#~ msgstr[2] "%u програма" +#~ msgstr[3] "Један програм" + +# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма. +#~ msgid "Post Review" +#~ msgstr "Објави преглед" + +#~ msgid "_Post" +#~ msgstr "_Објави" + +#~ msgid "Rating" +#~ msgstr "Оцењивање" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Укратко опишите ваше мишљење, на пример: „Одличан програм, препоручио бих " +#~ "га“." + +# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма. +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Преглед" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Шта мислите о програму? Покушајте да оправдате ваше виђење." + +#~ msgid "No screenshot provided" +#~ msgstr "Није достављен снимак екрана" + +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "Не могу да преузмем ажурирања: нема везе са интернетом" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Не могу да преузмем ажурирања: нема довољно простора на диску" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Не могу да преузмем ажурирања: потребна је пријава" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Не могу да преузмем ажурирања: пријава није исправна" + +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Не могу да инсталирам програм „%s“: немате овлашћење за инсталирање " +#~ "програма" + +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Не могу да инсталирам „%s“: ниво батерије је пренизак" + +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Не могу да инсталирам ажурирања: нема довољно простора на диску" + +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Не могу да инсталирам ажурирања: потребна је идентификација" + +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Не могу да инсталирам ажурирања: неисправна идентификација" + +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Не могу да ажурирам програм „%s“: немате овлашћење за ажурирање програма" + +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Не могу да инсталирам ажурирања: немате овлашћења за ажурирање програма" + +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Не могу да инсталирам ажурирања: уређај мора бити на наизменичном " +#~ "струјном напајању" + +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Не могу да ажурирам програм „%s“: ниво батерије је пренизак" + +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Не могу да инсталирам ажурирања: ниво батерије је пренизак" + +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Не могу да се надоградим на дистрибуцију „%s“: потребан је приступ " +#~ "интернету а тога нема" + +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Не могу да се надоградим на дистрибуцију „%s“: немате овлашћење за " +#~ "надограђивање" + +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "" +#~ "Не могу да се надоградим на дистрибуцију „%s“: ниво батерије је пренизак" + +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Не могу да уклоним програм „%s“: била је потребна пријава" + +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Не могу да уклоним програм „%s“: пријава није била исправна" + +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Не могу да уклоним програм „%s“: немате овлашћење за уклањање програма" + +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Не могу да уклоним програм „%s“: струјно напајање је потребно" + +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Не могу да уклоним програм „%s“: ниво батерије је пренизак" + +#~ msgid "Unable to remove %s" +#~ msgstr "Не могу да уклоним програм „%s“" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Нисам успео да инсталирам датотеку: није подржана" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Нисам успео да инсталирам: није подржано" + +#~ msgid "AC power is required" +#~ msgstr "Струјно напајање је потребно" + +#~ msgid "Restart Now" +#~ msgstr "Поново покрени" + +#~ msgid "Primary Menu" +#~ msgstr "Главни мени" + +#~ msgid "Find Out _More" +#~ msgstr "Саз_нај више" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Ажурирања" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Важно ажурирање програма је спремно за инсталирање." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Важно: хитна ажурирања програма су доступна." + +#~ msgid "%s %s is no longer supported." +#~ msgstr "Више нема подршке за дистрибуцију %s %s." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "То значи да више не добија безбедоносна ажурирања." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Препоручено је да надоградите систем на новије издање." + +#~ msgid "Update All" +#~ msgstr "Ажурирај све" + +#~ msgid "Application Updates" +#~ msgstr "Ажурирања програма" + +#~ msgid "Downloading featured images…" +#~ msgstr "Преузимам издвојене слике…" + +#~ msgid "GNOME Web" +#~ msgstr "Гномов веб" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Ниједно ажурирање није инсталирано на овај систем." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Гномов управник програма" + +#~ msgid "A list of popular applications" +#~ msgstr "Списак популарних програма" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Списак програма за коришћење, који преписује оне које одреди систем." + +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Каталог софтвера је преузет" + +#~ msgid "Name" +#~ msgstr "Назив" + +#~ msgid "system" +#~ msgstr "систем" + +#~ msgid "user" +#~ msgstr "корисник" + +#~ msgid "Channel" +#~ msgstr "Канал" + +#~ msgid "Branch" +#~ msgstr "Грана" + +#~ msgid "URL" +#~ msgstr "Адреса" + +#~ msgid "Installation" +#~ msgstr "Инсталација" + +#~ msgid "Version" +#~ msgstr "Издање" + +#~ msgid "Access arbitrary files" +#~ msgstr "Приступи изборним датотекама" + +#~| msgid "Can read all data on the file system" +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Може да приступи изборним датотекама на систему датотека" + +#~ msgid "Checking…" +#~ msgstr "Проверавам…" + +#~ msgid "Endless OS" +#~ msgstr "Ендлес ОС" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "Путања која упућује позадину за банер надоградње." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "Путања може да садржи највише три „%u“, који ће бити замењени издањем " +#~ "надоградње." + +#~ msgid "Loading…" +#~ msgstr "Учитавам…" + +#~ msgid "_Add shortcut" +#~ msgstr "_Додај пречицу" + +#~ msgid "Re_move shortcut" +#~ msgstr "_Уклони пречицу" + +#~ msgid "Welcome" +#~ msgstr "Добро дошли" + +#~ msgid "Welcome to Software" +#~ msgstr "Добро дошли у Програме" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Програми вам омогућавају да инсталирате све програме који вам требају, " +#~ "све са једног места. Погледајте наше препоруке, разгледајте категорије, " +#~ "или потражите програм који желите." + +#~ msgid "_Browse Software" +#~ msgstr "По_тражи програме" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Преузимам оцене програма…" + +#~ msgid "OS Updates" +#~ msgstr "Надоградње система" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "" +#~ "У надоградње су укључена побољшања стабилности, безбедности и рада " +#~ "система." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Преузимам потпис ажурирања фирмвера…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Преузимам ажурирања метаподатака фирмвера…" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Прикажи упит за инсталирање извора неслободног софтвера" + +#~ msgid "Select All" +#~ msgstr "Изабери све" + +#~ msgid "Select None" +#~ msgstr "Поништи избор" + +#~ msgid "Featured %s" +#~ msgstr "Издвојено у категорији „%s“" + +#~ msgid "Show" +#~ msgstr "Прикажи" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Мени филтера поткатегорија" + +#~ msgid "Sort" +#~ msgstr "Поређај по" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Мени сортирања поткатегорија" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgid "Audio & Video" +#~ msgstr "Звук и снимци" + +#~ msgid "Developer Tools" +#~ msgstr "Развојни алати" + +#~ msgid "Education & Science" +#~ msgstr "Образовање и наука" + +#~ msgid "Games" +#~ msgstr "Игре" + +#~ msgid "Graphics & Photography" +#~ msgstr "Графика и фотографија" + +#~ msgid "Productivity" +#~ msgstr "Продуктивност" + +#~ msgid "Communication & News" +#~ msgstr "Саопштења и вести" + +#~ msgid "Utilities" +#~ msgstr "Алатке" + +#~ msgid "_Read Less" +#~ msgstr "П_рочитај мање" + +#~ msgid "_Launch" +#~ msgstr "_Покрени" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Не могу да утврдим којим деловима система овај програм приступа. Ово је " +#~ "чест случај код старијих програма." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Никада" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Ниско" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Средње" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Високо" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Непознато" + +#~ msgid "Public domain" +#~ msgstr "Јавно власништво" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "" +#~ "https://sr.wikipedia.org/sr-ec/" +#~ "%D0%92%D0%BB%D0%B0%D1%81%D0%BD%D0%B8%D1%87%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw.sr" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Корисници су везани следећом дозволом:" +#~ msgstr[1] "Корисници су везани следећим дозволама:" +#~ msgstr[2] "Корисници су везани следећим дозволама:" +#~ msgstr[3] "Корисници су везани следећом дозволом:" + +#~ msgid "Localized in your Language" +#~ msgstr "Преведен на српски" + +#~ msgid "Documentation" +#~ msgstr "Документација" + +#~ msgid "Release Activity" +#~ msgstr "Одржаван програм" + +#~ msgid "Sandboxed" +#~ msgstr "Изолован" + +#~ msgid "Category" +#~ msgstr "Категорија" + +#~ msgid "Free" +#~ msgstr "Слободан" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Непознато" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "То значи да софтвер може бити слободно покренут, умножен, расподељен, " +#~ "проучаван и измењен." + +#~ msgid "Proprietary Software" +#~ msgstr "Власнички софтвер" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "То значи да је софтвер у власништву појединца или компаније. Често " +#~ "постоје ограничења његовог коришћења и његовом изворном кȏду обично се не " +#~ "може приступити." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Одредбе дозволе овог софтвера су непознате." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Програм је оцењен овако зато што га одликује следеће:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Нема појединости за ову оцену старосне прикладности." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Уклоњено" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Инсталиран" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Ажуриран" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Непознато" + +#~ msgid "History" +#~ msgstr "Историјат" + +#~ msgid "More…" +#~ msgstr "Још…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Препоручени аудио и видео програми" + +#~ msgid "Recommended Games" +#~ msgstr "Препоручене игре" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Препоручени графички програми" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Препоручени стваралачки програми" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Део ових програма је власнички те је дељење, коришћење и приступање " +#~ "изворном коду ограничено." + +#~ msgid "Find out more…" +#~ msgstr "Сазнај више…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Избори уредника" + +#~ msgid "Recent Releases" +#~ msgstr "Недавна издања" + +#~ msgid "Remove “%s”?" +#~ msgstr "Уклонити ризницу „%s“?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Онемогућити ризницу „%s“?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Нема додатних ризница" + +#~ msgid "_Remove…" +#~ msgstr "_Уклони…" + +#~ msgid "_Disable…" +#~ msgstr "О_немогући…" + +#~ msgid "Disabling" +#~ msgstr "Онемогућавам" + +#~ msgid "Enabled" +#~ msgstr "Омогућено" + +#~ msgid "Disabled" +#~ msgstr "Онемогућено" + +#~ msgid "ratings in total" +#~ msgstr "укупно оцена" + +#~ msgid "_Remove All" +#~ msgstr "_Уклони све" + +#~ msgid "Looking for new updates…" +#~ msgstr "Тражим нова ажурирања…" + +#~ msgid "Setting up updates…" +#~ msgstr "Подешавам ажурирања…" + +#~ msgid "Software is up to date" +#~ msgstr "Програми су ажурирани" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Ажурирања биће примењена након што се рачунар поново покрене." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Чекам на преузимање дистрибуције %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Преузимам дистрибуцију %s %s" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ОДРС је услуга која пружа прегледе програма од стране корисника" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Омогући ризницу за проширења Гномове шкољке" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Ликови из цртаћа у непожељним ситуацијама" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Ликови из цртаћа у агресивном сукобу" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Графичко насиље које укључује ликове из цртаћа" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Ликови у несигурним ситуацијама које се лако разликују од стварности" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Ликови у агресивном сукобу који се лако разликује од стварности" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Графичко насиље које се лако разликује од стварности" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Благо стварни ликови у несигурним ситуацијама" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Приказ стварних ликова у агресивном сукобу" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Графичко насиље које укључује стварне ликове" + +#~ msgid "No bloodshed" +#~ msgstr "Нема крвопролића" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Нереално крвопролиће" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Реално крвопролиће" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Приказ крвопролића и сакаћење делова тела" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Силовање или друго насилно сексуално понашање" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Упућивање на алкохолна пића" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Употреба алкохолних пића" + +#~ msgid "References to illicit drugs" +#~ msgstr "Упућивање на забрањене дроге" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Употреба забрањених дрога" + +#~ msgid "References to tobacco products" +#~ msgstr "Упућивање на дуванске производе" + +#~ msgid "Use of tobacco products" +#~ msgstr "Употреба дуванских производа" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Кратка уметничка голотиња" + +#~ msgid "Prolonged nudity" +#~ msgstr "Продужена голотиња" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Провокативне упуте или прикази" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Сексуалне упуте или прикази" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Графичко сексуално понашање" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Блага или ретка употреба псовки" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Умерена употреба псовки" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Јака или честа употреба псовки" + +#~ msgid "Slapstick humor" +#~ msgstr "Урнебесна комедија" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Вулгаран или неумесни хумор" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Еротски и хумор за одрасле" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Негативност према одређеној групи људи" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Дискриминација осмишљена да изазове емотивну повреду" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Експлицитна дискриминација на основу пола, сексуалности, расе или " +#~ "вероисповести" + +#~ msgid "Product placement" +#~ msgstr "Пласман производа" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Експлицитно упућивање на нарочите робне марке или заштићене производе" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Корисници се охрабрују да купују одређене ставке у стварном свету" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Коцкање на насумичним догађајима који користе жетоне или кредите" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Коцкање које користи „играчки“ новац (play)" + +#~ msgid "Gambling using real money" +#~ msgstr "Коцкање које користи стварни новац" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Корисници се охрабрују да донирају стварни новац" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Способност потрошње стварног новца у програму" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Међудејство између корисника без могућности ћаскања" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Умерена могућност ћаскања између корисника" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Неконтролисана могућност звучног и видео ћаскања између корисника" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Дељење корисничких имена на друштвеним мрежама или адреса електронске " +#~ "поште" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Проверава последње издање програма" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Деле се дијагностички подаци преко којих други не могу препознати " +#~ "корисника" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Деле се дијагностички подаци преко којих други могу препознати корисника" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Дељење стварне локације са другим корисницима" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Посредна упућивања на хомосексуалност" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Љубљење између особа истог пола" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Графичко сексуално понашање између особа истог пола" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Посредна упућивања на проституцију" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Непосредна упућивања на проституцију" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Графички прикази чина проституције" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Посредна упућивања на прељубу" + +#~ msgid "Direct references to adultery" +#~ msgstr "Непосредна упућивања на прељубу" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Графички прикази чина прељубе" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Оскудно обучени људски карактери" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Претерано сексуализовани људски карактери" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Прикази или упућивања ка историјским скрнављењима" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Прикази савременог људског скрнављења" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Графички прикази савременог скрнављења" + +#~ msgid "Visible dead human remains" +#~ msgstr "Са видљивим људским посмртним остацима" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Посмртни остаци људи који су изложени временским приликама" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Графички прикази скрнављења људских тела" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Прикази или упућивања ка историјском робовласништву" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Прикази савременог робовласништва" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Графички прикази савременог робовласништва" + +#~ msgid "General" +#~ msgstr "Опште" + +#~ msgid "ALL" +#~ msgstr "СВЕ" + +#~ msgid "Teen" +#~ msgstr "Тинејџери" + +#~ msgid "Everyone 10+" +#~ msgstr "Сви 10+ година" + +#~ msgid "Everyone" +#~ msgstr "Сви" + +#~ msgid "Early Childhood" +#~ msgstr "Рано детињство" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Непознато" + +#~ msgid "this website" +#~ msgstr "овом веб сајту" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Ајмо у куповину" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Уклоњен" + +#~ msgid "Format" +#~ msgstr "Врста" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Да ли сигурно желите да уклоните „%s“?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Овај програм се мора поново покренути да бисте користили нове додатке." + +#~ msgid "Security Updates Pending" +#~ msgstr "Има безбедносних ажурирања" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Препоручено је што раније инсталирање ових ажурирања" + +#~ msgid "Restart & Install" +#~ msgstr "Поново покрени и инсталирај" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Има важних ажурирања за систем и програме која су спремна за инсталирање" + +#~ msgid "View" +#~ msgstr "Погледај" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Јуче, у %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Јуче, у %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Пре три дана" + +#~ msgid "Four days ago" +#~ msgstr "Пре четири дана" + +#~ msgid "Five days ago" +#~ msgstr "Пре пет дана" + +#~ msgid "Six days ago" +#~ msgstr "Пре шест дана" + +#~ msgid "Two weeks ago" +#~ msgstr "Пре две недеље" + +#~ msgid "About %s" +#~ msgstr "О програму „%s“" + +#~ msgid "%s ME" +#~ msgstr "%s управљачки мотор (ME)" + +#~ msgid "Show the folder management UI" +#~ msgstr "Приказује сучеље управљања фасциклама" + +#~ msgid "Folder Name" +#~ msgstr "Назив фасцикле" + +#~ msgid "_Add" +#~ msgstr "_Додај" + +#~ msgid "Add to Application Folder" +#~ msgstr "Додај у фасциклу програма" + +#~ msgid "Top Rated" +#~ msgstr "Најбоље оцене" + +#~ msgid "Extension Settings" +#~ msgstr "Подешавања проширења" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Проширења користите на сопствену одговорност. Ако имате проблема са " +#~ "системом, препоручује вам се да их искључите." + +#~ msgid "Failed to load components" +#~ msgstr "Нисам успео да учитам делове" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS је успешно проверен!" + +#~ msgid "Failed to load file" +#~ msgstr "Нисам успео да учитам датотеку" + +#~ msgid "Unsaved changes" +#~ msgstr "Несачуване измене" + +#~ msgid "The application list is already loaded." +#~ msgstr "Списак са програмима је већ учитан." + +#~ msgid "Merge documents" +#~ msgstr "Споји документе" + +#~ msgid "Throw away changes" +#~ msgstr "Одбаци измене" + +#~ msgid "Open AppStream File" +#~ msgstr "Отвори AppStream датотеку" + +#~ msgid "Save AppStream File" +#~ msgstr "Сачувај AppStream датотеку" + +#~ msgid "_Save" +#~ msgstr "_Сачувај" + +#~ msgid "%s banner design deleted." +#~ msgstr "Дизајн банера за %s је обрисан." + +#~ msgid "Banner design deleted." +#~ msgstr "Дизајн банера је обрисан." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Списак програма садржи несачуване измене." + +#~ msgid "Use verbose logging" +#~ msgstr "Користи детаљно записивање" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Дизајнер банера за Гномове програме" + +#~ msgid "No Designs" +#~ msgstr "Нема дизајна" + +#~ msgid "Error message here" +#~ msgstr "Порука о грешци" + +#~ msgid "Category Featured" +#~ msgstr "Издвојено у категорији" + +#~ msgid "Undo" +#~ msgstr "Опозови" + +#~ msgid "Banner Designer" +#~ msgstr "Дизајнер банера" + +#~ msgid "New Banner" +#~ msgstr "Нови банер" + +#~ msgid "Import from file" +#~ msgstr "Увези из датотеке" + +#~ msgid "Export to file" +#~ msgstr "Извези у датотеку" + +#~ msgid "Spacing" +#~ msgstr "Размаци" + +#~ msgid "The amount of space between children" +#~ msgstr "Количина размака међу садржаним елементима" + +#~ msgid "Click on items to select them" +#~ msgstr "Притисните на ставке да их изаберете" + +#~ msgid "Select" +#~ msgstr "Изабери" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Додај у фасциклу…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Премести у фасциклу…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Уклони из фасцикле" + +#~ msgid "Featured Applications" +#~ msgstr "Издвојени програми" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Дизајнирај банере за Гномове прогрме" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "" +#~ "AppStream;Software;App;АппСтрим;Софтвер;Апликација;Програми;Апп;Programi;" +#~ "Softver;Aplikacija;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Проширења шкољке" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Ризница са проширењима Гномове шкољке" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Преузимам метаподатке проширења шкољке…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Проширења Гномове шкољке" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_Све" + +#~ msgid "Sign In / Register…" +#~ msgstr "Пријави се или региструј…" + +#~ msgid "Continue" +#~ msgstr "Настави" + +#~ msgid "Use" +#~ msgstr "Користи" + +#~ msgid "Add another…" +#~ msgstr "Додај друго…" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Каталог софтвера је учитан" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s ће бити инсталиран и биће вам наплаћено %s." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "Пријављен као %s" + +#~ msgid "Sign in…" +#~ msgstr "Пријави се…" + +#~ msgid "Sign out" +#~ msgstr "Одјава" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Не могу да купим програм „%s“: била је потребна пријава" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Не могу да купим програм „%s“: пријава није била исправна" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Не могу да купим програм „%s“: нема подешеног начина плаћања" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Не могу да купим програм „%s“: наплата је одбијена" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Да наставите, потребан вам је Убунту Један налог." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Да наставите, потребан је ваш Убунту Један налог." + +#~ msgid "..." +#~ msgstr "..." + +#~ msgid "Show profiling information for the service" +#~ msgstr "Приказује податке профилисања за услугу" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Да наставите треба да се пријавите на „%s“." + +#~ msgid "Email address" +#~ msgstr "Адреса е-поште" + +#~ msgid "I have an account already" +#~ msgstr "Већ имам налог" + +#~ msgid "I want to register for an account now" +#~ msgstr "Желим сада да се региструјем за налог" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Сам се пријави следећи пут" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "" +#~ "Унесите ваш једновремени пин за потврђивање идентитета са два чиниоца." + +#~ msgid "PIN" +#~ msgstr "ПИН" + +#~ msgid "Authenticate" +#~ msgstr "Потврди идентитет" + +#~ msgid "_About" +#~ msgstr "_О програму" + +#~ msgid "_Quit" +#~ msgstr "_Изађи" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Податке о „%s“, као и податке о набављању кодека који може пуштати ову " +#~ "врсту датотеке можете пронаћи на веб страници." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Не могу се инсталирати програми док се ово не разреши." + +#~ msgid "For more information, visit %s." +#~ msgstr "За више података, погледајте %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Не могу да ажурирам програм „%s“ из „%s“" + +#~ msgid "Downloading new updates…" +#~ msgstr "Преузимам нова ажурирања…" + +#~ msgid "Restart & _Install" +#~ msgstr "Поново покрени и _инсталирај" + +#~ msgid "Getting runtime source…" +#~ msgstr "Добављам извор извршног окружења…" + +#~ msgid "Downloading application page…" +#~ msgstr "Преузимам страницу програма…" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Лимба пружа програмерима једноставан начин за прављење програмских пакета" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Крајња платформа за забаву од Валва" + +#~ msgid "Sorted by Name" +#~ msgstr "Поређано по називу" + +#~ msgid "Sorted by Rating" +#~ msgstr "Поређано по оцени" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Списак додатних извора који су претходно били укључени" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Списак додатних извора који су претходно били укључени приликом " +#~ "инсталације програма трећих лица." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Приказује неслободан софтвер у резултатима претраге" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "Списак неслободних извора који се могу по избору укључити" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Претподешено међудејство између играча без могућности ћаскања" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Размена корисничких података са трећим странама" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Да укључим изворе власничког софтвера?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Нема инсталираних програма или додатака, друге врсте програма могу бити " +#~ "инсталиране" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Обично има ограничења на коришћење и на приступ изворном коду." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Извори власничког софтвера" + +#~ msgid "Remove Source" +#~ msgstr "Уклони извор" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Додатни извори програма се могу преузети са интернета. Они ће вам " +#~ "омогућити инсталирање програма који нису доступни у оперативном систему " +#~ "%s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Уклањањем извора уклонићете такође и све програме које сте са њега " +#~ "инсталирали." + +#~ msgid "No software installed from this source" +#~ msgstr "Нема програма инсталираних са овог извора" + +#~ msgid "Installed from this Source" +#~ msgstr "Инсталирани са овог извора" + +#~ msgid "Last Checked" +#~ msgstr "Последња провера" + +#~ msgid "Added" +#~ msgstr "Додат" + +#~ msgid "Website" +#~ msgstr "Веб страница" + +#~ msgid "page1" +#~ msgstr "страница1" + +#~ msgid "page2" +#~ msgstr "страница2" + +#~ msgid "“%s” [%s]" +#~ msgstr "„%s“ [%s]" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgid "Total" +#~ msgstr "Укупно" + +#~ msgid "Could not find '%s'" +#~ msgstr "Не могу да нађем „%s“" + +#~ msgid "Other Updates" +#~ msgstr "Друга ажурирања" + +#~ msgid "Installation of %s failed." +#~ msgstr "Нисам успео да инсталирам „%s“." + +#~ msgid "Removal of %s failed." +#~ msgstr "Нисам успео да уклоним „%s“." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Уверите се да имате приступ интернету и покушајте поново." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Ослободите простор на диску па покушајте поново." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Ако се проблем понови, обратите се достављачу софтвера." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Ништа" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Све" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Издвојено" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Астрономија" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Хемија" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Математика" + +#~ msgid "Science" +#~ msgstr "Наука" + +#~ msgid " or " +#~ msgstr " или " + +#~ msgid "3rd party" +#~ msgstr "трећих лица" + +#~ msgid "nonfree" +#~ msgstr "неслободни" + +#~ msgid "_Installing" +#~ msgstr "_Инсталирам" + +#~ msgid "_Removing" +#~ msgstr "_Уклањам" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Непозната" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Израчунавам…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Непозната" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Овај програм испоручују треће стране." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Овај програм испоручује трећа страна и можда садржи неслободне састојке." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Овај програм можда садржи неслободне састојке." + +#~ msgid "_History" +#~ msgstr "_Историјат" + +#~ msgid "Size" +#~ msgstr "Величина" + +#~ msgid "non-free" +#~ msgstr "неслободни" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Препоручени канцеларијски програми" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Извори програма вам дају приступ додатним програмима." + +#~ msgid "One Star" +#~ msgstr "Једна звездица" + +#~ msgid "Two Stars" +#~ msgstr "Две звездице" + +#~ msgid "Three Stars" +#~ msgstr "Три звездице" + +#~ msgid "Four Stars" +#~ msgstr "Четири звездице" + +#~ msgid "Five Stars" +#~ msgstr "Пет звездица" + +#~ msgid "No AppStream data found" +#~ msgstr "Нисам пронашао податке тока програма" + +#~ msgid "Audio" +#~ msgstr "Звук" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Уређивање" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Базе података" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Нарезивање диска" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Хам радио" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "МИДИ" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Мешачи" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Музика" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Снимачи" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Секвенцери" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Тјунери" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Изградња" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Базе података" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "ИРО" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Профилисање" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Веб програмирање" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Биологија" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Рачунарство" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Приказивање података" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Економија" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Електрика" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Електроника" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Инжењерство" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Геологија" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Геонаука" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Историја" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Обрада слика" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Литература" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Карте" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Музика" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Анализа бројева" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Паралелно рачунарство" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Физика" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Духовност" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Пуцачине" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Опонашање (симулације)" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Спортске игре" + +#~ msgid "Graphics" +#~ msgstr "Графика" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2Д графика" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "ОЦР" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Издаваштво" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Растер графика" + +#~ msgid "Internet" +#~ msgstr "Интернет" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Позивање (диал-ап)" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "Ел. пошта" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Довод" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Пренос датотека" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Хам радио" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Брзе поруке" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "ИРЦ клијенти" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Надзор" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "П2П" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Телефонија" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Веб програмирање" + +#~ msgid "Office" +#~ msgstr "Канцеларија" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Графикон" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Управљање контактима" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Речник" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "Ел. пошта" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Дијаграм тока" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "ЛДП (PDA)" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Фотографија" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Presentation" +#~ msgstr "Излагање" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Управљање пројектима" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Издаваштво" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Табеле" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Прегледач" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Уметност" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Вештачка интелигенција" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Астрономија" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Биологија" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Хемија" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Рачунарство" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Изградња" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Приказивање података" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Економија" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Електрика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Електроника" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Инжењерство" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Географија" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Геологија" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Геонаука" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Историја" + +# https://sr.wiktionary.org/sr/%D1%85%D1%83%D0%BC%D0%B0%D0%BD%D0%B8%D0%BE%D1%80%D0%B0 +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Хуманизам" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Обрада слика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Језици" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Литература" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Карте" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Математика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Медицина" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Анализа бројева" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Паралелно рачунарство" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Физика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Роботика" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Духовност" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Спортови" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Опонашавач (емулатор)" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Управник датотека" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Алатке за датотеке" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Праћење" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Безбедност" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Емулатор терминала" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Приступачност" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Архивирање" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Калкулатор" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Часовник" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Паковање" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Алатке датотека" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Карте" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Духовност" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Алати за телефонију" + +#~ msgid "Video" +#~ msgstr "Видео" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Уређивање" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "База података" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Нарезивање диска" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Снимачи" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "ТВ" + +#~ msgid "A previous update was unfinished." +#~ msgstr "Претходно ажурирање је остало недовршено." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "Ажурирање се не може инсталирати. Ово се често дешава уколико је проблем " +#~ "у самом ажурирању. Сачекајте ново ажурирање и онда покушајте поново." + +#~ msgid "Internet Only Application" +#~ msgstr "Мрежни програм" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Једно ажурирање није означено на прави начин." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Затражено је ажурирање ван мреже али ниједан пакет није затражио " +#~ "ажурирање." + +#~ msgid "No space was left on the drive." +#~ msgstr "Нема више простора на диску." + +#~ msgid "An update failed to install correctly." +#~ msgstr "Једно ажурирање није успело да се исправно инсталира." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Ажурирање ван мреже није успело на очекивани начин." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i инсталирани програм и %i додатак" +#~ msgstr[1] "%i инсталирана програма и %i додатка" +#~ msgstr[2] "%i инсталираних програма и %i додатака" +#~ msgstr[3] "Један инсталирани програм и један додатак" + +#~ msgid "Picks" +#~ msgstr "Изабрани" + +#~ msgid "Done" +#~ msgstr "Готово" + +#~ msgid "Set the specified debugging level" +#~ msgstr "Подешава ниво наведеног прочишћавања" + +#~ msgid "_Pending" +#~ msgstr "_На чекању" + +# timezone. +#~ msgid "Complicated!" +#~ msgstr "Замршено!" + +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "Базе података" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "Хам радио" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "Развој веба" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "Алатке за датотеке" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "Карте" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "Духовност" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "Словни ликови" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "Kодеци" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "Извори улаза" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "Пакети језика" + +#~ msgid "The search term to use when starting the UI" +#~ msgstr "Обрасци претраге за коришћење приликом покретања сучеља" + +#~ msgid "_Installed (%d)" +#~ msgstr "_Инсталираних (%d)" + +#~ msgid "_Updates (%d)" +#~ msgstr "_Освежења (%d)" diff --git a/po/sr@latin.po b/po/sr@latin.po new file mode 100644 index 0000000..ca751fe --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,8624 @@ +# Serbian translation of gnome-software +# Courtesy of Prevod.org team (http://prevod.org/) -- 2012–2022. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Translators: +# Borisav Živanović , 2017. +# Miroslav Nikolić , 2013–2022. +# +# Marko M. Kostić , 2015-2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-11-07 05:21+0000\n" +"PO-Revision-Date: 2024-11-11 23:27+0100\n" +"Last-Translator: Miloš Popović \n" +"Language-Team: Serbian >\n" +"Language: sr\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? 3 : n%10==1 && n%100!=11 ? 0 : " +"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" +"X-Project-Style: gnome\n" +"X-Generator: Gtranslator 46.1\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programi" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Instaliraj i ažuriraj programe" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Programi vam dozvoljavaju da pronađete i instalirate nove programe i " +"proširenja sistema i da uklonite postojeće instalirane programe." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Programi prikazuju izdvojene i popularne programe sa korisnim opisima i " +"nekoliko snimaka ekrana po programu. Programi mogu biti pronađeni " +"pregledanjem spiska kategorija ili pretraživanjem. Takođe vam omogućava " +"održavanje ažurnog sistema korišćenjem tehnologije vanmrežnih ažuriranja." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Panel pregleda" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Panel pojedinosti" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Panel instaliranih" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Panel ažuriranja" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Pojedinosti ažuriranja" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2645 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Gnomov projekat" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Isprobaj akmods ključ za Šim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Potrebna je prijava za testiranje akmods ključa u Šim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Primeni akmods ključ za Šim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Potrebna je prijava za primenu akmods ključa za Šim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Isprobaj DKMS ključ za Šim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Potrebna je prijava za testiranje DKMS ključa za Šim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Primeni DKMS ključ za Šim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Potrebna je prijava za primenu DKMS kruča za Šim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Instaliraj datoteku toka u sistemsku lokaciju" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Instaliram datoteku toka u sistemsku lokaciju" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Spisak saglasnih projekata" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Ovo je spisak saglasnih projekata koje treba prikazati kao što je Gnom, KDE " +"i IksFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Da li Gnomovi programi treba da upravljaju ažuriranjima i nadogradnjama" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Ako je isključeno, Gnomovi programi će sakriti površ za ažuriranja, neće " +"izvršavati bilo kakva samostalna ažuriranja ili pitati za nadogradnje." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Samostalno preuzimaj i instaliraj ažuriranja" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Ako je uključeno, Gnomovi programi će sam preuzeti ažuriranja u pozadini i " +"instalirati ona koja ne zahtevaju ponovno pokretanje uređaja." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Obavesti korisnika o programima ažuriranim u pozadini" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Ako je omogućeno, Gnomovi Programi će obavestiti korisnika o ažuriranjima " +"koja sus e dogodila dok je korisnik bio van računara." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Da li treba vršiti samostalno osvežavanje na ograničenoj vezi" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Ako je uključeno, Gnomovi programi će se samostalno osvežavati u pozadini " +"(preuzimanje metapodataka, provera novih dostupnih ažuriranja i slično) čak i " +"preko ograničene veze što može dovesti do novčanih troškova po korisnika." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Da li je ovo prvo pokretanje Gnomovih programa" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Prikazuje zvezdice ocenjivanja pored programa" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Filtriraj programe na osnovu podrazumevane grane podešene za udaljeno mesto" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Neslobodni programi prikazuju prozorče upozorenja pre instalacije" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Kada se instaliraju neslobodni programi može biti prikazano prozorče " +"upozorenja. Ovo odlučuje da li je to prozorče potisnuto." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Vremenska oznaka poslednje provere ažuriranja" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Vremenska oznaka obaveštenja poslednje nadogradnje" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Vremenska oznaka obaveštenja poslednje ažuriranja" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Vremenska oznaka prvog bezbednosnog ažuriranja, očišćenog nakon ažuriranja" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Vremenska oznaka poslednjeg ažuriranja" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Starost u sekundama nakon kojih je potrebno potvrditi da je uzvodni snimak " +"ekrana i dalje ispravan" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Biranje veće vrednosti će uzrokovati manje obilazaka ka udaljenom serveru ali " +"će ažuriranje snimaka ekrana i prikaz korisniku trajati duže. Vrednost „0“ " +"znači da se nikada ne proverava server ukoliko slika već postoji u kešu." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Server koji će se koristiti za preglede programa" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Najmanji rezultat karme za preglede" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Pregledi sa karmom sa manjim brojem od ovog se neće prikazivati." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Spisak zvaničnih izvora koji se ne trebaju smatrati trećom stranom" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Spisak obaveznih riznica koje se ne mogu onemogućiti ili ukloniti" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Spisak zvaničnih izvora koji se trebaju smatrati slobodnim softverom" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Adresa dozvole za korišćenje kada se program treba smatrati slobodnim " +"softverom" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Instalira skup programa za sve korisnike na sistemu gde je to moguće" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Dopusti pristup prozorčetu izvora softvera" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Nudi nadogradnje za predizdanja" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Prikazuje neke UI elemente obaveštavajući korisnika da neki program nije " +"slobodan" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Prikaži veličinu instaliranih programa u spisku instaliranih programa" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://sr.wikipedia.org/wiki/Vlasnički_softver'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Putanja koja objašnjava neslobodan i vlasnički softver" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Spisak URL-ova koji pokazuju na datoteke toka koje će biti preuzete u " +"swcatalog fasciklu" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Instaliraj datoteku toka u sistemsku lokaciju, za sve korisnike. Ako je " +"netačno, datoteke biće instalirane u nestandardni direktorijum " +"$XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Poredak prioriteta formata pakovanja koji se žele, sa prvo ispisanim važnijim " +"formatima. Prazan niz znači osnovni poredak. Podrazumeva se da izostavljeni " +"formati budu navedeni poslednji. Primeri formata pakovanja su: deb, flatpak, " +"rpm, snap. Ovi formati po izboru mogu biti navedeni sa nazivom izvorišta, " +"odvojeno dvotačkom, na primer: 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Vremenska oznaka poslednjeg pokušaja otklanjanja nekorišćenog izvršnog Flatpak " +"paketa" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Postavi na tačno („true“) da bi prikazali samo aplikacije licencirane za " +"slobodno korišćenje i sakrij sve vlasničke aplikacije" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Postavi na tačno („true“) da bi se prikazale samo aplikacije programera sa " +"proverenim identitetom" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Vremenska oznaka poslednje primljenih istorijskih ažuriranja." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Niska koja skladišti gnome-online-account ib koji se koristi za prijavu" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Sistemski instalater datoteka toka Gnomovih programa" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Nisam uspeo da obradim argumente linije naredbi" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Morate navesti tačno jedno ime datoteke" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Ovaj program može koristiti samo administrator" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Nisam uspeo da potvrdim vrstu sadržaja: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Nisam uspeo da pomerim: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Instalacija programa" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Instalirajte izabrane programe na sistem" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Crtano nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Nema podataka o crtanom nasilju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantazijsko nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Nema podataka o fantazijskom nasilju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistično nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Nema podataka o realističnom nasilju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Nasilje sa krvoprolićem" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Nema podataka o krvoproliću" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Seksualno nasilje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Nema podataka o seksualnom nasilju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Nema podataka o upućivanju na alkohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotici" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Nema podataka o upućivanju na zabranjene droge" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Duvan" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Nema podataka o upućivanju na duvanske proizvode" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nudizam" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Nema podataka o bilo kakvoj nagosti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Seksualne teme" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Nema podataka o seksualnim prikazima ili upućivanjima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Psovke" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Nema podataka o bilo kakvoj vulgarnosti" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Neprikladan humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nema podataka o neumesnom humoru" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminacija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Nema podataka o bilo kakvom diskriminacionom govoru" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Oglašavanje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Nema podataka o bilo kakvom oglašavanju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Kockanje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Nema podataka o bilo kakvom kockanju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Kupovina" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Nema podataka o sposobnosti trošenja novca" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Ćaskanje između korisnika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Nema podataka o načinima za ćaskanje sa drugim korisnicima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Zvučno ćaskanje između korisnika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Nema podataka o načinima za razgovor sa drugim korisnicima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontakt pojedinosti" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Nema podataka o deljenju korisničkih imena na društvenim mrežama ili adresa " +"elektronske pošte" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identifikujući podaci" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Nema podataka o deljenju korisničkih podataka sa trećim stranama" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Deljenje mesta" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Nema podataka o deljenju stvarne lokacije sa drugim korisnicima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homoseksualnost" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Nema podataka o upućivanjima na homoseksualnost" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitucija" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Nema podataka o upućivanjima na prostituciju" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Preljubništvo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Nema podataka o upućivanjima na preljubu" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Seksualizovani karakteri" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Nema podataka o seksualizovanim karakterima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Skrnavljenje" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Nema podataka o upućivanjima na skrnavljenje" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Ljudski ostaci" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Nema podataka o vidljivim ljudskim posmrtnim ostacima" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Robovlasništvo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Nema podataka o upućivanjima na robovlasništvo" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Nema upućivanja na zabranjene droge" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Ne sadrži psovanje, vulgarnost i druge vrste neprikladnog govora" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Ne sadrži oglase ili novčane transakcije" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Ne sadrži seks ili nagost" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Nema nekontrolisane mogućnosti ćaskanja" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Nema nasilja" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Droge" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Neprikladan govor" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Novac" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Društveno" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Nasilje" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Svi" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s ima nepoznatu ocenu starosti" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s program odgovara svima" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s program je za malu decu" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s program je za decu" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s program je za decu" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s program je za tinejdžere" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s program je samo za odrasle" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s program je za starosnu grupu %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Ocena starosne prikladnosti" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:126 +msgid "_How to contribute missing information" +msgstr "_Kako dodati nedostajuće podatke" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "Lokalna datoteka" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "Paket" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Na čekanju" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:408 +msgid "Pending install" +msgstr "Čeka na instaliranje" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:415 +msgid "Pending remove" +msgstr "Čeka na uklanjanje" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:396 +msgid "Installing" +msgstr "Instaliram" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Uklanjam" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:401 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Preuzimam" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:307 src/gs-details-page.c:1061 +#: src/gs-details-page.c:1096 src/gs-details-page.ui:243 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Instaliraj" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1181 +msgid "_Uninstall…" +msgstr "_Ukloni…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Mreža" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Može komunicirati preko mreže" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Sistemske usluge" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Može pristupati uslugama D-sabirnice na sistemskoj sabirnici" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Usluge sesije" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Može pristupati uslugama D-sabirnice na sabirnici sesije" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Uređaji" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Može pristupati izbornim uređajima kao što su kamere" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Može pristupati ulaznim uređajima" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Može pristupati mikrofonima" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Može pristupati sistemskim datotekama uređaja" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Sadržaj ekrana" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Može pristupati sadržaju ekrana" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Lična fascikla" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Može pregledati, uređivati i stvarati datoteke" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Može pregledati datoteke" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Sistem datoteka" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Fascikla sa preuzimanjima" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Podešavanja" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Može pregledati i menjati bilo koje podešavanje" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Zastareli sistem prikaza" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Koristi stari, nebezbedni sistem prikaza" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Beg iz izolacije" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Može izaći iz izolacije i može zaobići bilo koja druga ograničenja" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Nema dostupnog opisa ažuriranja." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Pojedinosti ažuriranja" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Zahteva dodatna ovlašćenja" + +# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa. +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Pregledi" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "Nema pregleda za ovaj program." + +# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa. +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "Nema pregleda" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "Istorijat izdanja" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Novo u izdanju %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Izdanje %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Nema pojedinosti za ovo izdanje" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e. %B %Y." + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Režim pokretanja: „updates“ (ažuriranja), „updated“ (ažurno), „installed“ " +"(instalirano) ili „overview“ (pregled)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "REŽIM" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Traži programe" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "TRAŽI" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Prikazuje pojedinosti programa (koristeći IB programa)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "IB" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Prikazuje pojedinosti programa (koristeći naziv paketa)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "NZVPKTA" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Prikazuje program (koristeći IB programa)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Deinstaliraj program (koristeći IB programa)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Otvara lokalnu datoteku sa paketom" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "NAZIV DATOTEKE" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Vrsta interakcije koja se očekuje za ovu radnju: bilo \"none\", \"notify\" " +"ili \"full\"" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKCIJA" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Prikaži lokalnu metainfo ili apdata datoteku" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Omogući detaljan prikaz izlaza otklanjanja grešaka (iz izvršavajuće instance, " +"ako se već izvršava)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Instalira bilo koje ažuriranje na čekanju, u pozadini" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Prikaži postavke" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Zatvara pokrenuti primerak" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Daje prednost lokalnim izvorima datoteka nad tokom programa" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Prikazuje broj izdanja" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Pravo na kopiranje © 2016–2023 doprinosioci Gnomovim Programima" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Miroslav Nikolić \n" +"Marko M. Kostić \n" +"Borisav Živanović \n" +"\n" +"https://gnom.srb — prevod Gnoma na srpski jezik." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Nažalost, nema podataka o datom programu." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Veličina instaliranog" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Uključujući %s podataka i %s keša" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Uključujući %s podataka" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Uključujući %s keša" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Korišćenje keša i podataka nepoznato" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Veličina preuzetog" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Nema potrebe za dodatnim preuzimanjima sistema" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Potrebna je nepoznata veličina dodatnih preuzimanja sistema" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Potrebno je %s dodatnog preuzimanja sistema" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Veličina je nepoznata" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Bez ovlašćenja" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Ima pristup mreži" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Koristi sistemske usluge" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Koristi usluge sesije" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Može pristupati hardverskim uređajima" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Može pristupati sistemskim uređajima" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Može da čita/piše sve vaše podatke" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Može da čita sve vaše podatke" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Može da čita/piše vaša preuzimanja" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Može da čita vaša preuzimanja" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Može pristupati određenim datotekama" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Može pristupati i menjati korisnička podešavanja" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Koristi stari prozorski sistem" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Može dobiti veća ovlašćenja" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Programer je prepoznat" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Pregledan je od distributera OS-a" + +# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa. +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Pregledano od strane distribucije „%s“" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Dostavlja ga treća strana" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Program više nije podržan" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Kod ispitivanja" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Nepoznata dozvola softvera" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Vlasnički kod" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Specijalna licenca" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Privilegovan" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Bezbedan" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Verovatno je sigurno" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Potencijalno nebezbedan" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Nebezbedan" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Samo mobilni" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Radi samo na malom ekranu" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Samo stoni" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Radi samo na velikom ekranu" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Veličina ekrana ne odgovara" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Ne podržava vašu trenutnu veličinu ekrana" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Zahteva ekran na dodir" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Zahteva tastaturu" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Zahteva miša" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Potrebna je igračka palica" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Zahteva igračku palicu za igranje" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Prilagodljiv" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Radi na telefonima, tablicama i stonim računarima" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Verovatno zahteva tastaturu ili miša" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Radi na stonim i prenosivim računarima" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Ne sadrži neprikladan sadržaj za bilo koji uzrast" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Nema opisa o prikladnosti sadržaja" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Poseti veb stranicu" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Instaliraj…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Otkaži" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Instaliraj" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Preuzmi" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Ažuriraj" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Ukloni…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Uklanjam" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 +#: src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "Kritično ažuriranje" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Uređaj ne može biti korišćen za vreme ažuriranja." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Izvor: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "Preimenovano iz „%s“" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +msgid "Stopped Receiving Updates" +msgstr "Nova ažuriranja prekinuta" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Kritično ažuriranje" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Instalirano" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Pomozite u prevodu „%s“" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"„%s“ je osmišljen, razvijen i prevođen od strane međunarodne zajednice " +"dobrovoljaca.\n" +"\n" +"Ovo znači da ako još nije dostupan na srpskom jeziku, možete se pridružiti i " +"pomoći u prevođenju." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Prevodi" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Prevodilačka s_tranica" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Udaljena prijava %s potrebna (oblast %s)" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "Prijava je potreban" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:300 src/gs-common.c:752 +#: src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-page.c:708 +#: src/gs-removal-dialog.ui:24 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:251 src/gs-review-dialog.ui:24 src/gs-review-row.c:239 +#: src/gs-review-row.c:263 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "_Otkaži" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "_Prijava" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Korisnik" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "Lozinka" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Drugo" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Sve" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Izdvojeno" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Izbor urednika" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Novo i ažurno" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Odabrano sa veba" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Drugi programi" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "Program „%s“ instaliran" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Potrebno je ponovno pokretanje kako bi izmene stupile na snagu" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Program je spreman za upotrebu" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Ažuriranja sistema instalirana" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Pregled skoro instaliranih ažuriranja je dostupan" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:915 +msgid "Restart" +msgstr "Pokreni ponovo" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Pokreni" + +#. TRANSLATORS: window title +#: src/gs-common.c:234 +msgid "Install Software?" +msgstr "Instalirati program?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Install Third-Party Software?" +msgstr "Instalirati programe treće strane?" + +#. TRANSLATORS: window title +#: src/gs-common.c:240 +msgid "Enable Software Repository?" +msgstr "Omogućiti softversku riznicu?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:242 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Želite li omogućavanje riznica sa programima treće strane?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:254 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"Program „%s“ nije slobodan softver i softver otvorenog izvornog koda, a " +"obezbeđuje ga riznica „%s“." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:264 +#, c-format +msgid "%s is provided by “%s”." +msgstr "Program %s obezbeđuje riznica „%s“." + +#: src/gs-common.c:273 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Ova riznica programa mora biti uključena da biste nastavili instalaciju." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:283 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Instalacija ili korišćenje „%s“ može biti protivzakonito u nekom državama." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:289 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Instalacija ili korišćenje ovog kodeka može biti protivzakonito u nekom " +"državama." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:303 +msgid "Don’t _Warn Again" +msgstr "Ne upozoravaj _više" + +#. TRANSLATORS: button text +#: src/gs-common.c:312 +msgid "Enable and _Install" +msgstr "Uključi i _instaliraj" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:519 +msgid "Detailed errors from the package manager follow:" +msgstr "Opširnije greške upravnika paketa slede:" + +#: src/gs-common.c:526 src/gs-common.c:663 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Pojedinosti" + +#. TRANSLATORS: button text +#: src/gs-common.c:575 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Zatvori" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:744 +msgid "_Accept" +msgstr "Prihv_ati" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:890 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Ažuriranje je instalirano" +msgstr[1] "Ažuriranja su instalirana" +msgstr[2] "Ažuriranja su instalirana" +msgstr[3] "Ažuriranje je instalirano" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:900 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Program je uklonjen" +msgstr[1] "Programi su uklonjeni" +msgstr[2] "Programi su uklonjeni" +msgstr[3] "Jedan program je uklonjen" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:906 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Potrebno je ponovno pokretanje kako bi stupila u dejstvo" +msgstr[1] "Potrebno je ponovno pokretanje kako bi stupila u dejstvo" +msgstr[2] "Potrebno je ponovno pokretanje kako bi stupila u dejstvo" +msgstr[3] "Potrebno je ponovno pokretanje kako bi stupilo u dejstvo" + +#. TRANSLATORS: button text +#: src/gs-common.c:913 +msgid "Not Now" +msgstr "Ne sada" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1009 +msgid "Just now" +msgstr "Upravo sada" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Pre %d minut" +msgstr[1] "Pre %d minuta" +msgstr[2] "Pre %d minuta" +msgstr[3] "Pre jednog minuta" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Pre %d sat" +msgstr[1] "Pre %d sata" +msgstr[2] "Pre %d sati" +msgstr[3] "Pre jednog sat" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Pre %d dan" +msgstr[1] "Pre %d dana" +msgstr[2] "Pre %d dana" +msgstr[3] "Pre jednog dana" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Pre %d nedelju" +msgstr[1] "Pre %d nedelje" +msgstr[2] "Pre %d nedelja" +msgstr[3] "Pre jedne nedelje" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Pre %d mesec" +msgstr[1] "Pre %d meseca" +msgstr[2] "Pre %d meseci" +msgstr[3] "Pre jednog meseca" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Pre %d godinu" +msgstr[1] "Pre %d godine" +msgstr[2] "Pre %d godina" +msgstr[3] "Pre jedne godine" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1394 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Izdvojeno" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D grafika" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografija" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skeniranje" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorska grafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Pregledači" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Stvaranje i uređivanje zvuka" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Programi za muziku" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Izdvojeno" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalendar" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Baza podataka" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finansije" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Obrađivanje teksta" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Uređivači teksta" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Veb preglednici" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Izdvojeno" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Akcija" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Avantura" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkadne" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Blokovi" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Tabla" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Karte" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Oponašavači" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Dečje igre" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logika" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Igranje uloge" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sportovi" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategije" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Izdvojeno" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Ćaskanje" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Izdvojeno" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Veštačka inteligencija" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomija" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Hemija" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Jezici" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Vesti" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Umetnost" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografija" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Stripovi" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Fantastika" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Zdravlje" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Istorija" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Način življenja" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politika" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sportovi" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Sve" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Izdvojeno" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Pročišćavači" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IRO" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodeci" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hardverski upravljački programi" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Slova" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Izvori ulaza" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Jezički paketi" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Prevod" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Stvaralaštvo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Posao" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Igre" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Društveno" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Učenje" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Programiranje" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodeci" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Hardverski upravljački programi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Fontovi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Izvori ulaza" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Jezički paketi" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Prevod" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Program" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "„%s“ zahteva dodatnu podršku za korišćenje ove vrste datoteke." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Potrebne su dodatni MIME formati" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "„%s“ zahteva dodatne slovne likove." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Potrebni su dodatni slovni likovi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "„%s“ zahteva dodatne multimedijalne kodeke." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Potrebni su dodatni multimedijalni kodeci" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "„%s“ zahteva dodatne upravljačke programe za štampače." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Potrebni su dodatni upravljački programi štampača" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "„%s“ zahteva dodatne pakete." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Potrebni su dodatni paketi" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Nađi u Programima" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "_Prikaži još" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Pri_kaži manje" + +#: src/gs-details-page.c:391 +msgid "Removing…" +msgstr "Uklanjam…" + +#: src/gs-details-page.c:406 +msgid "Requires restart to finish install" +msgstr "Zahteva ponovno pokretanje za dovršavanje instaliranja" + +#: src/gs-details-page.c:413 +msgid "Requires restart to finish remove" +msgstr "Zahteva ponovno pokretanje za dovršavanje uklanjanja" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:429 +msgid "Pending installation…" +msgstr "Čeka na instaliranje…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:435 +msgid "Pending update…" +msgstr "Čeka na ažuriranje…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:450 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Preuzimam…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:453 +msgid "Preparing…" +msgstr "Pripremam…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:456 +msgid "Uninstalling…" +msgstr "Uklanjam…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:583 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s nije instaliran, ali još ima prisutne podatke." + +#: src/gs-details-page.c:1078 src/gs-toast.c:65 +msgid "_Restart" +msgstr "Pok_reni ponovo" + +#: src/gs-details-page.c:1084 +msgid "_Enable…" +msgstr "_Omogući…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1110 +msgid "_Install…" +msgstr "_Instaliraj…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1326 +#, c-format +msgid "%s will appear in US English" +msgstr "%s će se pojaviti na američkom engleskom" + +#: src/gs-details-page.c:1334 +msgid "This app will appear in US English" +msgstr "Ova aplikacija će se pojaviti na američkom engleskom jeziku" + +#: src/gs-details-page.c:1336 +msgid "This software will appear in US English" +msgstr "Ovaj softver će se pojaviti na američkom engleskom" + +#: src/gs-details-page.c:1371 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "Učes_tvuj u prevodu" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1436 +#, c-format +msgid "Other Apps by %s" +msgstr "Drugi programi od %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1472 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Programer %s je dokazao vlasništvo nad %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1475 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Programer je dokazao vlasništvo nad %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1838 +msgid "You need internet access to write a review" +msgstr "Potrebna vam je veza sa internetom da biste napisali pregled" + +#: src/gs-details-page.c:1939 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Ova aplikacija više ne prima ispravke, uključujući bezbednosne ispravke" + +#: src/gs-details-page.c:1940 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Ovaj program je već dostupan u riznicama vaše distribucije i ne bi trebali " +"da ga zamenite." + +#: src/gs-details-page.c:1941 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Ovaj program ne dostavlja nikakvu vezu do veb stranice, riznice koda ili " +"pratioca problema." + +#: src/gs-details-page.c:1943 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "Ova aplikacija više ne prima ispravke, uključujući bezbednosne ispravke" + +#: src/gs-details-page.c:1944 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Ovaj program je već dostupan u riznicama vaše distribucije i ne bi trebali " +"da ga zamenite." + +#: src/gs-details-page.c:1945 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Ovaj softver ne dostavlja nikakvu vezu do veb sajta, riznice koda ili " +"pratioca problema." + +#: src/gs-details-page.c:2035 src/gs-details-page.c:2052 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Programi nisu uspeli da preuzmu podatke za „%s“, pa nije moguće prikazati " +"podatke za ovaj program." + +#: src/gs-details-page.c:2407 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Ne mogu da pošaljem pregled za „%s“: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Stranica pojedinosti" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Učitavam pojedinosti programa" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Verifikovan" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Otvori" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "Až_uriraj" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Ukloni" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "Dodaci" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "Ovaj program se može koristiti samo ako postoji veza sa internetom." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "Sadrži riznicu programa" + +#: src/gs-details-page.ui:679 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Ovaj program sadrži riznicu programa iz koje ćete dobijati ažuriranja, kao i " +"pristup drugim programima." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Ne sadrži riznicu programa" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Ovaj program ne sadrži riznicu programa. On neće biti ažuriran na nova " +"izdanja." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "Riznica programa je prepoznata" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Dodavanje ove riznice programa će vam omogućiti pristup dodatnim programima i " +"nadogradnjama." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Koristite samo proverene riznice programa." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Očisti podatke iz aplikacije" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "Obriši po_datke" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Bez metapodataka" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "Veb stranica _projekta" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "Pošalji _donaciju" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "Dopri_nesi prevodu" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "P_rijavi problem" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "Po_moć" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontakt" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "Napiši pr_egled" + +# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa. +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Svi pregledi" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "Ne mogu prikazati pojedinosti programa" + +#: src/gs-dkms-dialog.c:67 +msgid "Failed to prepare reboot" +msgstr "Nisam uspeo da pripremim ponovno pokretanje" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "Nepoznata greška" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "Ključ nije nađen" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "Ključ nije primenjen" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Upis u MOK je potreban" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Sledeće" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Bezbedno podizanje sistema je omogućeno na ovom uređaju. Da omogućite nove " +"upravljačke programe, morate primeniti novi ključ vlasnika uređaja (MOK). Ovak " +"proces će vas upitati da unesete lozinku. Zapišite sledeću lozinku koja će " +"biti vezana za ovaj ključ:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Zabeležio sam MOK _lozinku" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "Ponovo pok_reni i upiši…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Uputstva za podešavanje: pažljivo pročitajte" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Nakon što se sistem ponovo pokrene, biće prikazan ekran za podešavanje " +"uređaja. Da omogućite nove upravljačke uređaje, nastavite kroz sledeće korake " +"za podešavanje:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Izaberite „Primeni MOK“\n" +"• Izaberite „Da“ da primenite ključeve\n" +"• Unesite lozinku za MOK ključ\n" +"• Izaberite „Ponovo pokreni“" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Bezbednosne implikacije" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Nakon što ključ bude uspešno primenjen, uređaj će verovati u bezbednost svih " +"narednih ažuriranja bilo kojeg modula. Sva naredna ažuriranja će se dešavati " +"transparentno bez vašeg znanja ili prijave." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Dodatna uputstva možete naći na stranici sa dokumentacijom." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Preuzimam dodatne datoteke sa metapodacima…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " i " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Dostupan je slovni lik za pismo „%s“" +msgstr[1] "Dostupni su slovni likovi za pismo „%s“" +msgstr[2] "Dostupni su slovni likovi za pismo „%s“" +msgstr[3] "Dostupan je slovni lik za pismo „%s“" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Dostupan je program za „%s“" +msgstr[1] "Dostupni su programi za „%s“" +msgstr[2] "Dostupni su programi za „%s“" +msgstr[3] "Dostupan je program za „%s“" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Traženi softver nije nađen" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Ne mogu naći traženi softver" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "Nisam pronašao „%s“" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "na veb stranici" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Nisu dostupni programi koji obezbeđuju datoteku „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Podatke o „%s“, kao i uputstva za preuzimanje programa koji nedostaju možete " +"pronaći na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "Nisu dostupni programi za „%s“ podršku." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "„%s“ nije dostupan." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Podatke o „%s“, kao i uputstva za preuzimanje programa koji može da podrži " +"ovaj format možete pronaći na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Nema dostupnih fontova za pismo „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Podatke o „%s“, kao i način nabavljanja dodatnih fontova možete pronaći na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Nema dodatnih kodeka za format datoteke „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Podatke o „%s“, kao i način nabavljanja kodeka koji može da pusti ovu vrstu " +"zapisa možete naći na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Nisu dostupna izvorišta Plazme za „%s“ podršku." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Podatke o „%s“, kao i način nabavljanja dodatnih izvorišta Plazme možete " +"pronaći na %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Nisu dostupni upravljački programi štampača za „%s“." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Podatke o „%s“, kao i način nabavljanja upravljačkog programa koji može da " +"podrži ovaj štampač možete naći na %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "dokumentacija" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Ne možemo naći „%s“ kodek(e), koje je zatražio program „%s“. Pogledajte " +"odeljak %s za više podataka." +msgstr[1] "" +"Ne možemo naći „%s“ kodek(e), koje je zatražio program „%s“. Pogledajte " +"odeljak %s za više podataka." +msgstr[2] "" +"Ne možemo naći „%s“ kodek(e), koje je zatražio program „%s“. Pogledajte " +"odeljak %s za više podataka." +msgstr[3] "" +"Ne možemo naći „%s“ kodek(e), koje je zatražio program „%s“. Pogledajte " +"odeljak %s za više podataka." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Ne možemo naći „%s“ kodek(e), koje ste tražili. Pogledajte odeljak %s za više " +"podataka." +msgstr[1] "" +"Ne možemo naći „%s“ kodek(e), koje ste tražili. Pogledajte odeljak %s za više " +"podataka." +msgstr[2] "" +"Ne možemo naći „%s“ kodek(e), koje ste tražili. Pogledajte odeljak %s za više " +"podataka." +msgstr[3] "" +"Ne možemo naći „%s“ kodek(e), koje ste tražili. Pogledajte odeljak %s za više " +"podataka." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Nisam uspeo naći bilo šta: %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "%s format datoteke" + +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "Instalir_aj sve" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "Ne mogu da nađem potrebne programe" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Stranica kodeka" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "Nema rezultata" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "Pretraga nije moguća" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Prethodno" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Sledeće" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Spisak izdvojenih programa" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Podrška za radnu površ" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Podržava korišćenje na velikom ekranu" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Podrška stonog računara nije poznata" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Nema dovoljno podataka da bismo znali da li su veliki ekrani podržani" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Zahteva veliki ekran" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Radna površ nije podržana" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Ne može se koristiti na velikom ekranu" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Podrška za mobilne" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Podržava korišćenje na malom ekranu" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Podrška prenosnih nije poznata" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Nema dovoljno podataka da bismo znali da li su mali ekrani podržani" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Zahteva mali ekran" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Prenosni nisu podržani" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Ne može se koristiti na malom ekranu" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Podrška za tastaturu" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Podrška tastature nije poznata" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Nema dovoljno podataka da bismo znali da li su tastature podržane" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Tastatura je obavezna" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Podržava tastature" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tastatura nije podržana" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Ne može se koristiti sa tastaturom" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Podrška za miša" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Zahteva miša ili pokazivački uređaj" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Podrška miša nije poznata" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Nema dovoljno podataka da bismo znali da li je miš ili pokazivački uređaj " +"podržan" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Miš je obavezan" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Podržava miša i pokazivačke uređaje" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Miš nije podržan" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Ne može se koristiti sa mišem ili pokazivačkim uređajem" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Podrška ekrana na dodir" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Podrška ekrana na dodir nije poznata" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Nema dovoljno podataka da bismo znali da li su ekrani na dodir podržani" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Dodirna tabla je obavezna" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Podržava ekrane na dodir" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Ekran na dodir nije podržan" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Ne može se koristiti sa ekranom na dodir" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Gejmpad je obavezan" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Zahteva gejmpad" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Podrška za gejmpad" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Podržava igračke palice" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "„%s“ verovatno radi na ovom uređaju" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "„%s“ radi na ovom uređaju" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "„%s“ verovatno radi na ovom uređaju" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "„%s“ neće ispravno raditi na ovom uređaju" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "„%s“ neće raditi na ovom uređaju" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Hardverska podrška" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigacija" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Kretanje do stranice za istraživanje" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Idi na stranicu instaliranog" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Idi na stranicu ažuriranja" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Otvori traku za pretraživanje" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Vindouz" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Otvori postavke" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Otvori riznice programa" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Pomoć" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Otvori prečice tastature" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Instalirano" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Stranica instaliranog" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "U toku" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Aplikacije" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "Veb aplikacije" + +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "Sistemski programi" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Izgradnja zajednice" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Priključite se" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ovaj program se razvija otvoreno od strane zajednice dobrovoljaca, i izdat je " +"pod %s licencom.\n" +"\n" +"Možete doprineti i pomoći da postane mnogo bolji." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ovaj program se razvija otvoreno od strane zajednice dobrovoljaca, i izdat je " +"pod „%s“ licencom.\n" +"\n" +"Možete doprineti i pomoći da postane mnogo bolji." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ovaj program se razvija otvoreno od strane zajednice dobrovoljaca, i izdat je " +"pod %s licencom.\n" +"\n" +"Možete doprineti i pomoći da postane mnogo bolji." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ovaj program se razvija otvoreno od strane zajednice dobrovoljaca, i izdat je " +"pod „%s“ licencom.\n" +"\n" +"Možete doprineti i pomoći da postane mnogo bolji." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Nepoznata dozvola" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Saznaj više" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ovaj program ne sadrži licencu pod kojom je izdat i može biti vlasnički " +"softver. Možda je nebezbedan na načine koje je teško istražiti, a programeri " +"ga mogu izmeniti bez da vas o tome obaveste.\n" +"\n" +"Možda nećete biti u mogućnosti da doprinesete ovom programu." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ovaj softver ne sadrži licensu pod kojom je izdat i može biti vlasnički. " +"Možda je nebezbedan na načine koje je teško istražiti, a programeri ga mogu " +"izmeniti bez da vas o tome obaveste.\n" +"\n" +"Možda nećete biti u mogućnosti da doprinesete ovom programu." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Vlasnički" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Ovaj program nije izdat kao slobodan, tako da samo njegovi programeri znaju " +"kako radi. Možda je nebezbedan i teže je promeniti ga po potrebi.\n" +"\n" +"Nećete biti u mogućnosti da doprinesete ovom softveru." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Ovaj softver nije razvijen kao slobodan, tako da samo njegovi programeri " +"znaju kako radi. Možda je nebezbedan na načine koje je teško istražiti, a " +"programeri ga mogu izmeniti bez da vas o tome obaveste.\n" +"\n" +"Nećete biti u mogućnosti da doprinesete ovom softveru." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Posebna dozvola" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ova aplikacija je razvijena pod posebnom licencom %s.\n" +"\n" +"Možete , ali i ne morate da doprinesete ovoj aplikaciji." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ova aplikacija je razvijena pod posebnom licencom „%s“.\n" +"\n" +"Možete , ali i ne morate da doprinesete ovoj aplikaciji." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ovaj softver je razvijen pod specijalnom %s licencom.\n" +"\n" +"Možda nećete moći da doprinesete ovom softveru." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ovaj softver je razvijen pod specijalnom „%s“ licencom.\n" +"\n" +"Možda nećete moći da doprinesete ovom softveru." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Osvežavam podatke" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Učitavam stranicu" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Pokrećem se" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Nepoznati izvor" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Dodato" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Uklonjeno" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Ažuriranja" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Unazađivanja" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "izabranih spoljnih izvora" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Obezbeđuje pristup dodatnom softveru iz „%s“. Tu se nalaze i neki vlasnički " +"programi.\n" +"\n" +"Možete omogućiti ove riznice kasnije u podešavanjima riznica Programa." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Uključiti riznice programa treće strane?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "Zanemar_i" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Omogući" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "Dostupno za vaš operativni sistem" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "Dostupan je za „%s“" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Istraži" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Stranica pregleda" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Dostupni programi" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Druge kategorije" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Nema podataka o programima" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Nepoznato" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "U _redu" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Korisnik je odbio instaliranje" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Pripremam „%s“" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Da li sigurno želite da uklonite riznicu „%s“?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Svi programi iz riznice „%s“ će biti uklonjeni i morate ponovo da instalirate " +"riznicu da biste ih koristili." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 +#: src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "Ukloniti „%s“?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "It will not be possible to use %s after removal." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Neće biti moguće da koristite programe koji zavise od „%s“ nakon što ga " +"uklonite." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Nećete moći da koristite „%s“ nakon uklanjanja, a svi dokumenti koji ga " +"koriste će biti prikazani u drugačijim fontom." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Nećete moći da koristite „%s“ nakon što ga uklonite. Ovo možda znači da " +"nećete moći da puštate neke multimedijalne datoteke." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Hardver koji zavisi od „%s“ možda neće raditi ispravno nakon što uklonite " +"ovaj program." + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "Podešavanja programa i podaci" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:667 +msgid "_Keep" +msgstr "_Zadrži" + +#: src/gs-page.c:673 +msgid "Allows restoring app settings and content" +msgstr "Dozvoli vraćanje podešavanja i sadržaja programa" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:682 +msgid "_Delete" +msgstr "O_briši" + +#: src/gs-page.c:688 +msgid "Permanently deletes data to save disk space" +msgstr "Trajno obriši podatke i oslobodi prostor na disku" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:696 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Nećete moći da koristite „%s“ nakon što ga uklonite. Podaci i podešavanja će " +"ostati na disku kako bi mogli da povratite program kasnije." + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:710 +msgid "_Uninstall" +msgstr "_Ukloni" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Postavke" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Ažuriranja programa" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "Još podataka" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Provera i preuzimanje ažuriranja koristi podatke i napajanje. Automatska " +"ažuriranja će biti pauzirana dok ste na mreži sa ograničenom količinom " +"podataka i kada je uključen režim za čuvanje energije." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "S_amostalno" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Samostalno proveravaj i preuzimaj ažuriranja" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "Ruč_no" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Morate ručno da obavite proveru i preuzimanja ažuriranja" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Obaveštenja o samostal_nim ažuriranjima" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Obaveštavaj o instaliranju samostalnih ažuriranja" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Filteri sadržaja" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Samo s_lobodan softver" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Sakrij vlasnički softver prilikom pregledanja i pretrage" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Prikaži samo po_tvrđene programere" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Prikazuje programe samo od programera čiji je identitet potvrđen" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Instalirani softver nije saglasan sa „%s“ i biće automatski uklonjen prilikom " +"nadogragnje." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Nesaglasan softver" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Nadogradi" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "Programi instalirani iz riznice „%s“ više neće dobijati ažuriranja." + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Onemogućiti riznicu?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Ukloniti riznicu?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "Onemo_gući" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:266 +msgid "_Remove" +msgstr "_Ukloni" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Omogući nove riznice" + +#: src/gs-repos-dialog.c:612 +msgid "Turn on new repositories when they are added" +msgstr "Uključite nove riznice kada su dodate" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "još podataka" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Dodatni programi sa izvora probranih trećih strana — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Fedora riznice trećih strana" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "operativni sistem" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Ove riznice dopunjavaju podrazumevane programe koje pruža distribucija „%s“." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Riznice programa" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "Nema riznica" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u instaliran program" +msgstr[1] "%u instalirana programa" +msgstr[2] "%u instaliranih programa" +msgstr[3] "Jedan instalirani program" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u instaliran dodatak" +msgstr[1] "%u instalirana dodatka" +msgstr[2] "%u instaliranih dodataka" +msgstr[3] "Jedan instalirani dodatak" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u program" +msgstr[1] "%u programa" +msgstr[2] "%u programa" +msgstr[3] "Jedan program" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u dodatak" +msgstr[1] "%u dodatka" +msgstr[2] "%u dodataka" +msgstr[3] "Jedan dodatak" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s i %s su instalirani" +msgstr[1] "%s i %s su instalirana" +msgstr[2] "%s i %s je instalirano" +msgstr[3] "%s i %s su instalirani" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Proveravam instalirani program…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Ukloni" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Nikakav" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Ne dopada mi se" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "U redu je" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Dobar je" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Odličan" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Izaberite zvezdicu da ostavite ocenu" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Utrošite malo više vremena za pisanje pregleda" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Izaberite ocenu zvezdicom" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Sažetak je prekratak" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Sažetak je predug" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "Opis je prekratak" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "Opis je predug" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Napiši pregled" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Pošalji" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Ocenite program, dodajte kratak opis ili recenziju. Ocene ne treba koristiti " +"za prijavljivanje problema, pa kontaktirajte programere kako bi vam pružili " +"adekvatnu pomoć." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Sažetak pregleda" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "Napiši kratki pregled" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Pogledajte pojedinosti podataka koje šaljemo u našoj politici privatnosti. Celo ime i prezime vezano za " +"vaš nalog biće prikazano javno." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u pregled ukupno" +msgstr[1] "%u pregleda ukupno" +msgstr[2] "%u pregleda ukupno" +msgstr[3] "1 pregled ukupno" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "od 5 zvezdica" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Nepoznato" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:227 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Možete da prijavite da su pregledi uvredljivog, grubog ili diskriminatorskog " +"ponašanja." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:232 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Nakon podnošenja, pregled će biti skriven sve dok ga ne proveri neko od " +"administratora." + +# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa. +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:237 +msgid "Report Review?" +msgstr "Da objavim pregled?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:242 +msgid "_Report" +msgstr "P_rijavi" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:258 +msgid "Remove Review?" +msgstr "Ukloniti pregled?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:261 +msgid "Removing a review cannot be undone." +msgstr "Nećete moći da poništite uklanjanje rezencije." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Sviđa mi se pregled" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Ne sviđa mi se pregled" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Objavi…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Ukloni…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Program nije u bezbednom okruženju ali je distribucija proverila da nije " +"zlonameran" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "Provera da li verujete prodavcu, jer program nije u bezbednom okruženju" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Bez ovlašćenja" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Program je u potpunosti izolovan" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Pristup mreži" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Može pristupati internetu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Nema mrežni pristup" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Ne može pristupati internetu" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Koristi sistemske usluge" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Može da zahteva podatke od usluga sistema" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Koristi usluge sesije" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Može da zahteva podatke od usluga sesije" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Pristup uređaju korisnika" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Može da pristupi uređajima kao što su veb kamerice ili igrački kontroleri" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Nema pristup uređaju korisnika" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Ne može da pristupi uređajima kao što su veb kamerice ili igrački kontroleri" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Pristup ulaznom uređaju" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Pristup mikrofonu" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "Može da vas sluša preko mikrofona bez traženja dozvole" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Pristup uređajima na sistemu" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Može da pristupi uređajima na sistemu bez traženja dozvole" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Pristup sadržaju ekrana" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Može da pristupi sadržaju ekrana ili prozora programa" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Zastareli prozorski sistem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Dodatna ovlašćenja" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Korisnička podešavanja" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Potpun pristup čitanja/pisanja datoteke sistema" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Može da čita i piše sve podatke na sistemu datoteka" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Pristup čitanja/pisanja lične fascikle" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Može da čita i piše sve podatke u vašoj ličnoj fascikli" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Potpun pristup čitanja datoteke sistema" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Može da čita sve podatke na sistemu datoteka" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Pristup čitanja lične fascikle" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Može da čita sve podatke u vašoj ličnoj fascikli" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Pristup čitanja/pisanja u fascikli preuzimanja" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Može da čita i piše sve podatke u vašoj fascikli preuzimanja" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Pristup fascikli sa preuzimanjima" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Može da čita sve podatke u vašoj fascikli preuzimanja" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Može da čita i piše sve podatke u fascikli" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Može da čita sve podatke u fascikli" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Nema pristup sistemu datoteka" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Ne može uopšte pristupati sistemu datoteka" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Programer je proveren" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Programer ovog programa je proveren i jeste onaj kojim se i predstavio" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Nebezbedne zavisnosti" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Program (ili njegove zavisnosti) više nije podržan i može biti nebezbedan" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Ovaj program nije odredio licencu pod kojom je izdat i može biti vlasnički " +"softver" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Ovaj softver nije odredio licencu pod kojom je izdat i može biti vlasnički" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Vlasnički kod" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Izvorni kod nije javni, tako da ne može biti nezavisno ispitan i može biti " +"nebezbedan" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Ovaj program je izdat sa specijalnom „%s“ licencom" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Ovaj softver je izdat pod specijalnom „%s “ licencom" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Kod ispitivanja" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Izvorni kod je javni i može biti nezavisno ispitan, što čini da program " +"verovatnije bude bezbedan" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "„%s“ je privilegovan" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "„%s“ je bezbedan" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "„%s“ je verovatno bezbedan" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "„%s“ je možda nebezbedan" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "„%s“ je nebezbedan" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Nepoznato" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Bezbednost" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licenca" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "Izvor" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Ovaj program koristi zastarelu verziju softverske platforme (SDK) i možda " +"ima greške ili bezbedonosne propuste koji neće biti popravljeni." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Prethodni snimak ekrana" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Naredni snimak ekrana" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Nema snimaka ekrana" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Nema snimaka ekrana" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Nisam uspeo da učitam sliku" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Nisam pronašao veličinu snimka ekrana" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Ne mogu da napravim ostavu" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Neispravan snimak ekrana" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Snimak ekrana nije dostupan" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Snimak ekrana" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "još %u pogodak" +msgstr[1] "još %u pogotka" +msgstr[2] "još %u pogodaka" +msgstr[3] "još %u pogodak" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Stranica pretrage" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Traži programe" + +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "Nije pronađen program" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "„%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Ne mogu da preuzmem ažuriranja" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "Ne mogu da preuzmem ažuriranja firmvera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Ne mogu da preuzmem ažuriranja firmvera sa „%s“" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Ne mogu da preuzmem ažuriranja sa izvora „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "Ne mogu da ažuriram: potreban je pristup na internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "Ne mogu da ažuriram: nema dovoljno prostora na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "" +"Ne mogu da preuzmem ažuriranja sa izvora „%s“: nema dovoljno prostora na disku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "Ne mogu da ažuriram: potrebna je prijava" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "Ne mogu da ažuriram: neispravna prijava" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "Ne mogu da ažuriram: potrebna je dozvola" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Ne mogu da preuzmem ažuriranja: nemate ovlašćenje za instaliranje programa" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Ne mogu da preuzmem spisak ažuriranja" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "Ne mogu da instaliram: nije uspelo preuzimanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Ne mogu da instaliram „%s“: nije uspelo preuzimanje sa „%s“" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Ne mogu da instaliram „%s“: nije uspelo preuzimanje" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "Ne mogu da instaliram: nedostaje izvršno vreme" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Ne mogu da instaliram „%s“: nije dostupno izvršno vreme „%s“" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "Ne mogu da instaliram program „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "Ne mogu da instaliram: potreban je pristup na internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "Ne mogu da instaliram: neispravan format programa" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "Ne mogu da instaliram: nema dovoljno prostora na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Ne mogu da instaliram „%s“: nema dovoljno prostora na disku" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "Ne mogu da instaliram: potrebna je prijava" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Ne mogu da instaliram „%s“: potrebna je prijava" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "Ne mogu da instaliram: neispravna prijava" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Ne mogu da instaliram „%s“: neispravna prijava" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "Ne mogu da instaliram: potrebna je dozvola" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Ne mogu da instaliram „%s“: potrebna je dozvola" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "Ne mogu da instaliram: uređaj mora biti priključen na napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Ne mogu da instaliram „%s“: uređaj mora biti priključen na napajanje" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "Ne mogu da instaliram: baterija je skoro prazna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Ne mogu da instaliram „%s“: baterija je skoro prazna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Ne mogu da ažuriram „%s“ iz „%s“: nije uspelo preuzimanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Ne mogu da ažuriram „%s“: nije uspelo preuzimanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Ne mogu da instaliram ažuriranja iz „%s“: nije uspelo preuzimanje" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "Ne mogu da ažuriram: nije uspelo preuzimanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Ne mogu da ažuriram „%s“: nema dovoljno prostora na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Ne mogu da ažuriram „%s“: potrebna je prijava" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Ne mogu da ažuriram „%s“: neispravna priava" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Ne mogu da ažuriram „%s“: potrebna je dozvola" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "Ne mogu da ažuriram: uređaj mora biti priključen na napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Ne mogu da ažuriram „%s“: uređaj mora biti priključen na napajanje" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "Ne mogu da ažuriram: baterija je skoro prazna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Ne mogu da ažuriram „%s“: baterija je skoro prazna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "Ne mogu da ažuriram program „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "Ne mogu da ažuriram" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Ne mogu da nadogradim" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Ne mogu da se nadogradim sa distribucije „%s“ na distribuciju „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "Ne mogu da nadogradim: nije uspelo preuzimanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Ne mogu da nadogradim na „%s“: nije uspelo preuzimanje" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "Ne mogu da nadogradim: potreban je pristup na internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Ne mogu da nadogradim na „%s“: potreban je pristup na internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "Ne mogu da nadogradim: nema dovoljno prostora na disku" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Ne mogu da nadogradim na „%s“: nema dovoljno prostora na disku" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "Ne mogu da nadogradim: potrebna je prijava" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Ne mogu da nadogradim na „%s“: potrebna je prijava" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "Ne mogu da nadogradim: neispravna prijava" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Ne mogu da nadogradim na „%s“: neispravna prijava" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "Ne mogu da nadogradim: potrebna je dozvola" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Ne mogu da nadogradim na „%s“: potrebna je dozvola" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Ne mogu da nadogradim: uređaj mora biti priključen na napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Ne mogu da nadogradim na „%s“: uređaj mora biti priključen na napajanje" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "Ne mogu da nadogradim: baterija je skoro prazna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Ne mogu da nadogradim na „%s“: baterija je skoro prazna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Ne mogu da nadogradim na „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "Ne mogu da uklonim: potrebna je prijava" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Ne mogu da uklonim „%s“: potrebna je prijava" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +msgid "Unable to uninstall: invalid authentication" +msgstr "Ne mogu da uklonim: neispravna prijava" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Ne mogu da uklonim „%s“: neispravna priava" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "Ne mogu da uklonim: potrebna je dozvola" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Ne mogu da uklonim „%s“: potrebna je dozvola" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Ne mogu da uklonim: uređaj mora biti priključen na napajanje" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Ne mogu da uklonim „%s“: uređaj mora biti priključen na napajanje" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "Ne mogu da uklonim: baterija je skoro prazna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Ne mogu da uklonim „%s“: baterija je skoro prazna" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Ne mogu da uklonim „%s“" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "Ne mogu da pokrenem „%s“" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "Nažalost, nešto je pošlo naopako" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Ne mogu da pokrenem program „%s“: deo „%s“ nije instaliran" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "Nema dovoljno slobodnog prostora na disku za ovu radnju" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "Ne mogu da instaliram: vrsta datoteke nije podržana" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "Ne mogu da instaliram: nije uspela prijava" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Ne mogu da instaliram" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "Ne mogu da kontaktiram izvor „%s“" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "Ponovo pokrenite Programe da koristite nove priključke" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "Uređaj mora biti priključen na napajanje" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Baterija je skoro prazna" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "O Programima" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "R_iznice programa" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "Prečice _tastature" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_Postavke" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Pretraži" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Glavni meni" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Traži programe" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "_Istraži" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Instalirani" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Až_uriranja" + +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "Idite nazad" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ništa" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Podaci programa" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Podaci potrebni za program da bi se pokrenuo" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Korisnički podaci" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Podaci napravljeni u programu sa vaše strane" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Podaci ostave" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Privremeno smešteni podaci" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Sam program" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Zahtevane zavisnosti" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Deljene komponente sistema zahtevane ovim programom" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Nepoznato" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Privremeni podaci mogu biti očišćeni iz podešavanja _programa" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Skladište" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Instaliran)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Instaliram)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (preuzimanje)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Uklanjam)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "Poje_dinosti" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Ispitaj" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Instaliran je %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "Instalirana ažuriranja" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "Ažuriranja nisu instalirana" + +#: src/gs-update-monitor.c:215 +msgid "Updates Are Out of Date" +msgstr "Ažuriranja programa su zastarela" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "Proverite da li su dostupna ažuriranja" + +#: src/gs-update-monitor.c:222 +msgid "Critical Updates Ready to Install" +msgstr "Hitno ažuriranje je spremno za instaliranje" + +#: src/gs-update-monitor.c:223 +msgid "Install critical updates as soon as possible" +msgstr "Instalirajte hitna ažuriranja što pre" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "Hitna ažuriranja su dostupna za preuzimanje" + +#: src/gs-update-monitor.c:227 +msgid "Download critical updates as soon as possible" +msgstr "Preuzmite hitna ažuriranja što pre" + +#: src/gs-update-monitor.c:233 +msgid "Updates Ready to Install" +msgstr "Ažuriranja su spremna za instaliranje" + +#: src/gs-update-monitor.c:234 +msgid "Software updates are ready and waiting" +msgstr "Ažuriranja softvera i spremna za instaliranje i nalaze se na čekanju" + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "Ažuriranja spremna za preuzimanje" + +#: src/gs-update-monitor.c:241 +msgid "Software updates can be downloaded" +msgstr "Možete preuzeti ažuriranja softvera" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u program je ažuriran — potrebno je ponovno pokretanje" +msgstr[1] "%u programa su ažurirana — potrebno je ponovno pokretanje" +msgstr[2] "%u programa je ažurirano — potrebno je ponovno pokretanje" +msgstr[3] "Program je ažuriran — potrebno je ponovno pokretanje" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u program je ažuriran" +msgstr[1] "%u programa su ažurirana" +msgstr[2] "%u programa je ažurirano" +msgstr[3] "Program je ažuriran" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "Program „%s“ je ažuriran." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "Ponovo pokrenite program" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "Programi „%s“ i „%s“ su ažurirani." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u program zahteva ponovno pokretanje." +msgstr[1] "%u programa zahtevaju ponovno pokretanje." +msgstr[2] "%u programa zahtevaju ponovno pokretanje." +msgstr[3] "Program zahteva ponovno pokretanje." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Uključujući programe „%s“, „%s“ i „%s“." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "Sistem više nije podržan" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +msgid "Upgrade to continue receiving updates" +msgstr "Nadogradite kako bi nastavili da dobijate ažuriranja" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Nova verzija distribucije %s je dostupna za instalaciju" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "Dostupna su ažuriranja programa" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "Ažuriranje programa nije uspelo" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "Prepared updates were not installed" +msgstr "Pripremljena ažuriranja nisu instalirana" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Prikaži pojedinosti" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Naodgradnja sistema je gotova" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Dobro došli u distribuciju %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Program je ažuriran" +msgstr[1] "Programi su ažurirani" +msgstr[2] "Programi su ažurirani" +msgstr[3] "Jedan program je ažuriran" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Važno ažuriranje sistema je instalirano." +msgstr[1] "Važna ažuriranja sistema su instalirana." +msgstr[2] "Važna ažuriranja sistema su instalirana." +msgstr[3] "Jedno važno ažuriranje sistema je instalirano." + +# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa. +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Pregled" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "Neuspeh pri instaliranju ažuriranja" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "Sistem je već ažuran." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "Ažuriranje je otkazano." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Nema izlaza na internet iako je to potrebno. Postarajte se da imate pristup " +"internetu i pokušajte ponovo." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Programi su naišli na bezbednosne probleme sa ažuriranjem. Porazgovarajte sa " +"dobavljačem vaših programa za više pojedinosti." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Nema dovoljno slobodnog prostora na disku. Oslobodite prostor na disku pa " +"pokušajte ponovo." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Nažalost, dogodila se greška prilikom ažuriranja. Sačekajte novo ažuriranje pa " +"pokušajte ponovo. Ukoliko se ova greška opet dogodi, prijavite to dobavljaču " +"vaših programa." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Poslednja provera: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Zaustavi" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Proveri da li ima ažuriranja" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s je prestao da dobija hitna ažuriranja softvera" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Vaš operativni sistem više ne dobija hitna ažuriranja softvera" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Mogu nastati dodatni novčani troškovi" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Provera ažurnosti prilikom korišćenja mobilne širokopojasne mreže može " +"dovesti do povećanja troškova na vašoj kartici." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Ip_ak proveri" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Preuzeta su ažuriranja softvera" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Nadogradnje su spremne za instaliranje" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "Proveri da li ima ažuriranja" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Ažuriranja" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Stranica ažuriranja" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "Učitavam ažuriranja" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "Ovo može potrajati neko vreme" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "Sve je ažurno" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "Koristiti mobilne podatke?" + +#: src/gs-updates-page.ui:232 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Provera ažurnosti prilikom korišćenja mobilnog interneta može dovesti do " +"neočekivanih troškova" + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "_Ipak proveri" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "Niste povezani" + +#: src/gs-updates-page.ui:255 +msgid "Go online to check for updates" +msgstr "Poveži se i potraži ažuriranja" + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "_Podešavanja mreže" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "Greška" + +#: src/gs-updates-page.ui:293 +msgid "Updates are automatically managed" +msgstr "Ažuriranja se samostalno obavljaju" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Ažuriranja programa su pauzirana" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Automatska ažuriranja softvera su pauzirana iz sledećih razloga:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Povezani ste na mrežu sa ograničenom količinom interneta" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Mrežna veza ne dozvoljava preuzimanje velikih datoteka" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Aktivan je režim za uštedu energije" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Aktivan je režim za igrice" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Ažuriranja programa su pauzirana" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"Mreža je povezana na internet sa ograničenom količinom podataka — ažuriranje " +"softvera je pauzirano" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Mreža je povezana na internet koji je dozvoljava preuzimanje velikih datoteke " +"— ažuriranje softvera je pauzirano" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Pokrenut je režim za uštedu energije — ažuriranja softvera su pauzirana" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Aktiviraj ne režim za igrice — ažuriranja softvera su pauzirana" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:321 +msgid "_Restart & Update…" +msgstr "_Ponovo pokreni i ažuriraj…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:327 +msgid "U_pdate All" +msgstr "Až_uriraj sve" + +#: src/gs-updates-section.c:404 +msgid "Software Updates Downloaded" +msgstr "Ažuriranja softvera su preuzeta" + +#: src/gs-updates-section.c:405 +msgid "Updates are ready to be installed" +msgstr "Ažuriranja su spremna za instaliranje" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:496 +msgid "Integrated Firmware" +msgstr "Ugrađeni firmver" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:501 +msgid "Requires Restart" +msgstr "Zahteva ponovno pokretanje" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:506 +msgid "App Updates" +msgstr "Ažuriranja programa" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:511 +msgid "Device Firmware" +msgstr "Firmver uređaja" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Preuzmi" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Distribucija %s %s je dostupna" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Distribucija %s je dostupna" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Saznajte o novom izdanju" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s od %s je preuzeto" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% je preuzeto" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Velika nadogradnja, sa novim funkcijama i dodatim ispravkama." + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "Po_novo pokreni i nadogradi…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Ne zaboravite da napravite rezervu vaših podataka i datoteka pre " +"nadograđivanja." + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Ne mogu da obrišem datoteku „%s“: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Ne mogu da obrišem direktorijum „%s“: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Dodajte, uklonite ili ažurirajte programe na ovom računaru" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Ažuriranja;osveženja;dogradnje;nadogradnje;izvori;riznice;skladišta;postavke;" +"instalacija;uklanjanje;program;softver;aplikacija;radnja;ispravke;apdejtovi;" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;ažuriranja;osveženja;dogradnje;nadogradnje;izvori;riznice;" +"skladišta;postavke;instalacija;uklanjanje;program;softver;aplikacija;radnja;" +"ispravke;apdejtovi;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s je spreman" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"%s je spreman i može biti omogućen i uključen prilikom sledećeg podizanja " +"sistema." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Uključi" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3170 +msgid "System Updates" +msgstr "Ažuriranja sistema" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3175 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Opšta ažuriranja sistema kao što su bezbednosne ispravke i ispravke greški, i " +"poboljšanja brzine rada." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s nadogradnja sa novim funkcijama i ispravkama." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Usluga ažuriranja EOS-a nije mogla dobaviti i primeniti ažuriranje." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Veb program" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Podrška za veb aplikacije" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Izvrši popularne veb programe unutar pregledača" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Nadogradite vaš sistem radi novih mogućnosti, poboljšanja brzine i bolje " +"stabilnosti." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Podrška za Fletpek (Flatpak)" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Fletpek je radni okvir za Linuks programe" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Sistemska fascikla %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Lična podfascikla %s" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Fascikle sistema domaćina" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "Podešavanja iz /etc sistema domaćina" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Fascikal radne površi" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Podfascikla radne površi %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Fascikla sa dokumentima" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Podfascikla sa dokumentima %s" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Fascikla muzike" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Podfascikla muzike %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Fascikla sa slikama" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Podfascikla sa slikama %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Fascikla javnog deljenja" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Podfascikla javnog deljenja %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Video fascikla" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Video podfascikla %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Fascikla sa šablonima" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Podfascikla šablona %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Korisnička keš fascikla" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Korisnička keš podfascikla %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Fascikla korisničkih podešavanja" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Podfascikla korisničkih podešavanja %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Fascikla korisničkih podataka" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Korisnička podfascikla sa podacima %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Fascikla korisničkoh izvršnog okruženja" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Korisnička podfascikla izvršnog okruženja %s" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Pristup putanji %s sistema datoteka" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Dobavljam fletpek metapodatke za %s…" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Ne mogu da obradim dodatak „%s“: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Korisnička instalacija" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Sistemska instalacija" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "IB programa" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Neuspeh pri instaliranju dodatka „%s“: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Neuspeh pri uklanjanju dodatka „%s“: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Udaljeni izvor „%s“ ne dozvoljava instaliranje programa „%s“, najverovatnije " +"zbog svog filtera. Uklonite filter i ponovite instaliranje. Opširna greška: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Snaga sistema je previše mala da bi se izvršilo ažuriranje" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Snaga sistema je previše mala da bi se izvršilo ažuriranje. (%u%%, zahteva " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Uređaj je nedostupan ili je van bežičnog dometa" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Baterija uređaja je skoro prazna" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Baterija uređaja je previše slaba (%u%%, zahteva %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Uređaj čeka da se primeni ažuriranje" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Potrebno je uređaj uključiti u struju da bi se se povezao" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Uređaj ne može biti korišćen dok je poklopac zatvoren" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:208 +#, c-format +msgid "%s Device Update" +msgstr "Ažuriranje „%s“ uređaja" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s System Update" +msgstr "Ažuriranje „%s“ sistema" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Ažuriranje „%s“ ugnežđenog kontrolera" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s ME Update" +msgstr "Ažuriranje „%s“ upravljačkog motora (ME)" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Ažuriranje „%s“ korporativnog upravljačkog motora (ME)" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Ažuriranje „%s“ potrošačkog upravljačkog motora (ME)" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:239 +#, c-format +msgid "%s Controller Update" +msgstr "Ažuriranje „%s“ kontrolera" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:245 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Ažuriranje „%s“ tanderbolt kontrolera" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Ažuriranje „%s“ procesorskog mikrokoda" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s Configuration Update" +msgstr "Ažuriranje „%s“ podešavanja hardvera" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Battery Update" +msgstr "Ažuriranje „%s“ baterije" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Camera Update" +msgstr "Ažuriranje „%s“ kamere" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s TPM Update" +msgstr "Ažuriranje „%s“ TPM-a" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s Touchpad Update" +msgstr "Ažuriranje „%s“ dodirne table" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Mouse Update" +msgstr "Ažuriranje „%s“ miša" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Keyboard Update" +msgstr "Ažuriranje „%s“ tastature" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Ažuriranje „%s“ kontrolera skladišta" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Network Interface Update" +msgstr "Ažuriranje „%s“ mrežne kartice" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Display Update" +msgstr "Ažuriranje „%s“ ekrana" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s BMC Update" +msgstr "Ažuriranje „%s“ baseboard upravljačkog kontrolera" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Ažuriranje USB prijemnika %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s Drive Update" +msgstr "Ažuriranje diska %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Ažuriranje fleš diska „%s“" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s SSD Update" +msgstr "Ažuriranje SSD diska „%s“" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s GPU Update" +msgstr "Ažuriranje grafičkog procesora „%s“" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s Dock Update" +msgstr "Ažuriranje dok uređaja „%s“" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s USB Dock Update" +msgstr "Ažuriranje USB dok uređaja %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Firmver" + +#: plugins/fwupd/gs-plugin-fwupd.c:1918 +msgid "Firmware update could not be applied: " +msgstr "Ne mogu da primenim ažuriranje firmvera: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Podrška za nadogradnju firmvera" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Pruža podršku za nadogradnje firmvera" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Instalirati nepotpisani program?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Program koji će biti instaliran nije potpisan. Nije moguće proveriti izvor " +"ažuriranja za ovaj softver ili da li je neko neovlašćeno menjao ispravke." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Preuzeti nepotpisani program?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Nepotpisane ispravke su dostupne. Nije moguće proveriti izvor ažuriranja za " +"ovaj softver ili da li je neko neovlašćeno menjao ispravke, bez potpisa." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Ažurirati nepotpisani program?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Nepotpisane ispravke su dostupne. Nije moguće proveriti izvor ažuriranja za " +"ovaj softver ili da li je neko neovlašćeno menjao ispravke. Ispravke programa " +"biće onemogućene sve dok nepotpisane ispravke nisu ispravljene ili uklonjene." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Ne mogu da instaliram ažuriranja: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paketi" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1436 +msgid "Failed to wait on transaction end before download: " +msgstr "Ne mogu da čekam kraj prenosa pre preuzimanja: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1443 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1456 +msgid "Failed to download updates: " +msgstr "Ne mogu da preuzmem ažuriranja: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1495 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1505 +msgid "Failed to trigger update: " +msgstr "Ne mogu da pokrenem ažuriranje: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3270 +msgid "Operating System (OSTree)" +msgstr "Operativni sistem (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Skladište snepova" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Podrška za Snep (Snap)" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snep je univerzalni Linuks paket" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Fin način za upravljanje programima na vašem sistemu." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Unesi broj od 1 do %u: " + +#, fuzzy +#~| msgid "Choose an application:" +#~ msgid "Choose an app:" +#~ msgstr "Odaberite program:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "„%s“ je sada instaliran" + +#, fuzzy +#~| msgid "An application has been removed" +#~| msgid_plural "Applications have been removed" +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Program je uklonjen" +#~ msgstr[1] "Program je uklonjen" +#~ msgstr[2] "Program je uklonjen" +#~ msgstr[3] "Program je uklonjen" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Ne mogu da pronađem „%s“" + +#, fuzzy +#~| msgid "Downloading software catalog" +#~ msgid "Downloading Software Catalog" +#~ msgstr "Preuzimam katalog programa" + +#~ msgid "Moderate page" +#~ msgstr "Stranica uređenja" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Nema pregleda za uređenje" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Da li vam je ovaj pregled koristio?" + +#~ msgid "Yes" +#~ msgstr "Jeste" + +#~ msgid "No" +#~ msgstr "Nije" + +#~ msgid "Meh" +#~ msgstr "Onako" + +#~ msgid "Outdated SDK version" +#~ msgstr "Zastarelo SDK izdanje" + +#~ msgid "Unable to install updates" +#~ msgstr "Ne mogu da instaliram ažuriranja" + +#, fuzzy +#~| msgid "Unable to install %s: authentication was invalid" +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Ne mogu da instaliram program „%s“: prijava nije bila ispravna" + +#~ msgid "Network Settings" +#~ msgstr "Podešavanja mreže" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Ažuriranja operativnog sistema nisu dostupna" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Nije uspelo instaliranje važnog ažuriranja sistema." + +#~ msgid "No Network" +#~ msgstr "Nema mreže" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Potreban je pristup Internetu za proveru ažuriranja." + +#, fuzzy +#~| msgid "Network Settings" +#~ msgid "Network _Settings" +#~ msgstr "Podešavanja mreže" + +#, fuzzy +#~| msgid "Software updates are waiting and ready to be installed." +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Ažuriranja programa su dostupna i spremna za instaliranje." + +#, fuzzy +#~| msgid "Software updates are waiting and ready to be installed." +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Ažuriranja programa su dostupna i spremna za instaliranje." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Preuzimam podatke o nadogradnji…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Poslednji vremenski žig kada je sistem bio na mreži i kada je dobio " +#~ "ažuriranja" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Prikazuje opširne podatke pročišćavanja" + +#~ msgid "_User" +#~ msgstr "_Korisnik" + +#~ msgid "An application" +#~ msgstr "Program" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "Izabrani dodaci biće instalirani sa programom." + +#~ msgid "Applications" +#~ msgstr "Programi" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Samostalna ažuriranja su pauzirana" + +#~ msgid "" +#~ "The current network is metered. Metered connections have data limits or " +#~ "charges associated with them. To save data, automatic updates have " +#~ "therefore been paused.\n" +#~ "\n" +#~ "Automatic updates will be resumed when an un­metered network becomes " +#~ "available. Until then, it is still possible to manually install updates.\n" +#~ "\n" +#~ "Alternatively, if the current network has been in­correctly identified as " +#~ "being metered, this setting can be changed." +#~ msgstr "" +#~ "Trenutna mreža je ograničena. Ograničene mreže, osim samih ograničenja, " +#~ "mogu imati i dodatne novčane troškove. Da biste uštedeli podatke, " +#~ "samostalna ažuriranja su pauzirana.\n" +#~ "\n" +#~ "Samostalna ažuriranja biće nastavljena kada se budete povezali na " +#~ "neograničenu mrežu. Do tada, moguće je ručno instalirati ažuriranja.\n" +#~ "\n" +#~ "Ukoliko je trenutna mreža označena ograničenom greškom, ovo podešavanje se " +#~ "može promeniti." + +#~ msgid "Open Network _Settings" +#~ msgstr "Otvori po_dešavanja mreže" + +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Da li sigurno želite ukloniti „%s“?" + +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "Program „%s“ biće uklonjen, moraćete da ga instalirate ponovo da biste ga " +#~ "koristili." + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Da bismo izbegli troškove i ograničenja mreže, ažuriranja se ne obavljaju " +#~ "samostalno na mobilnim ili ograničenim vezama." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible." +#~ msgstr "Preuzima i instalira ažuriranja u pozadini, kada je to moguće." + +#~ msgid "_Continue" +#~ msgstr "_Nastavi" + +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u program" +#~ msgstr[1] "%u programa" +#~ msgstr[2] "%u programa" +#~ msgstr[3] "Jedan program" + +# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa. +#~ msgid "Post Review" +#~ msgstr "Objavi pregled" + +#~ msgid "_Post" +#~ msgstr "_Objavi" + +#~ msgid "Rating" +#~ msgstr "Ocenjivanje" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Ukratko opišite vaše mišljenje, na primer: „Odličan program, preporučio bih " +#~ "ga“." + +# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa. +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Pregled" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Šta mislite o programu? Pokušajte da opravdate vaše viđenje." + +#~ msgid "No screenshot provided" +#~ msgstr "Nije dostavljen snimak ekrana" + +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "Ne mogu da preuzmem ažuriranja: nema veze sa internetom" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Ne mogu da preuzmem ažuriranja: nema dovoljno prostora na disku" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Ne mogu da preuzmem ažuriranja: potrebna je prijava" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Ne mogu da preuzmem ažuriranja: prijava nije ispravna" + +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Ne mogu da instaliram program „%s“: nemate ovlašćenje za instaliranje " +#~ "programa" + +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Ne mogu da instaliram „%s“: nivo baterije je prenizak" + +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Ne mogu da instaliram ažuriranja: nema dovoljno prostora na disku" + +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Ne mogu da instaliram ažuriranja: potrebna je identifikacija" + +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Ne mogu da instaliram ažuriranja: neispravna identifikacija" + +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Ne mogu da ažuriram program „%s“: nemate ovlašćenje za ažuriranje programa" + +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Ne mogu da instaliram ažuriranja: nemate ovlašćenja za ažuriranje programa" + +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "" +#~ "Ne mogu da instaliram ažuriranja: uređaj mora biti na naizmeničnom " +#~ "strujnom napajanju" + +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Ne mogu da ažuriram program „%s“: nivo baterije je prenizak" + +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Ne mogu da instaliram ažuriranja: nivo baterije je prenizak" + +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Ne mogu da se nadogradim na distribuciju „%s“: potreban je pristup " +#~ "internetu a toga nema" + +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Ne mogu da se nadogradim na distribuciju „%s“: nemate ovlašćenje za " +#~ "nadograđivanje" + +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "" +#~ "Ne mogu da se nadogradim na distribuciju „%s“: nivo baterije je prenizak" + +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Ne mogu da uklonim program „%s“: bila je potrebna prijava" + +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Ne mogu da uklonim program „%s“: prijava nije bila ispravna" + +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Ne mogu da uklonim program „%s“: nemate ovlašćenje za uklanjanje programa" + +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Ne mogu da uklonim program „%s“: strujno napajanje je potrebno" + +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Ne mogu da uklonim program „%s“: nivo baterije je prenizak" + +#~ msgid "Unable to remove %s" +#~ msgstr "Ne mogu da uklonim program „%s“" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Nisam uspeo da instaliram datoteku: nije podržana" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Nisam uspeo da instaliram: nije podržano" + +#~ msgid "AC power is required" +#~ msgstr "Strujno napajanje je potrebno" + +#~ msgid "Restart Now" +#~ msgstr "Ponovo pokreni" + +#~ msgid "Primary Menu" +#~ msgstr "Glavni meni" + +#~ msgid "Find Out _More" +#~ msgstr "Saz_naj više" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Ažuriranja" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Važno ažuriranje programa je spremno za instaliranje." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Važno: hitna ažuriranja programa su dostupna." + +#~ msgid "%s %s is no longer supported." +#~ msgstr "Više nema podrške za distribuciju %s %s." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "To znači da više ne dobija bezbedonosna ažuriranja." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Preporučeno je da nadogradite sistem na novije izdanje." + +#~ msgid "Update All" +#~ msgstr "Ažuriraj sve" + +#~ msgid "Application Updates" +#~ msgstr "Ažuriranja programa" + +#~ msgid "Downloading featured images…" +#~ msgstr "Preuzimam izdvojene slike…" + +#~ msgid "GNOME Web" +#~ msgstr "Gnomov veb" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Nijedno ažuriranje nije instalirano na ovaj sistem." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Gnomov upravnik programa" + +#~ msgid "A list of popular applications" +#~ msgstr "Spisak popularnih programa" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Spisak programa za korišćenje, koji prepisuje one koje odredi sistem." + +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Katalog softvera je preuzet" + +#~ msgid "Name" +#~ msgstr "Naziv" + +#~ msgid "system" +#~ msgstr "sistem" + +#~ msgid "user" +#~ msgstr "korisnik" + +#~ msgid "Channel" +#~ msgstr "Kanal" + +#~ msgid "Branch" +#~ msgstr "Grana" + +#~ msgid "URL" +#~ msgstr "Adresa" + +#~ msgid "Installation" +#~ msgstr "Instalacija" + +#~ msgid "Version" +#~ msgstr "Izdanje" + +#~ msgid "Access arbitrary files" +#~ msgstr "Pristupi izbornim datotekama" + +#~| msgid "Can read all data on the file system" +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Može da pristupi izbornim datotekama na sistemu datoteka" + +#~ msgid "Checking…" +#~ msgstr "Proveravam…" + +#~ msgid "Endless OS" +#~ msgstr "Endles OS" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "Putanja koja upućuje pozadinu za baner nadogradnje." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "Putanja može da sadrži najviše tri „%u“, koji će biti zamenjeni izdanjem " +#~ "nadogradnje." + +#~ msgid "Loading…" +#~ msgstr "Učitavam…" + +#~ msgid "_Add shortcut" +#~ msgstr "_Dodaj prečicu" + +#~ msgid "Re_move shortcut" +#~ msgstr "_Ukloni prečicu" + +#~ msgid "Welcome" +#~ msgstr "Dobro došli" + +#~ msgid "Welcome to Software" +#~ msgstr "Dobro došli u Programe" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Programi vam omogućavaju da instalirate sve programe koji vam trebaju, " +#~ "sve sa jednog mesta. Pogledajte naše preporuke, razgledajte kategorije, " +#~ "ili potražite program koji želite." + +#~ msgid "_Browse Software" +#~ msgstr "Po_traži programe" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Preuzimam ocene programa…" + +#~ msgid "OS Updates" +#~ msgstr "Nadogradnje sistema" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "" +#~ "U nadogradnje su uključena poboljšanja stabilnosti, bezbednosti i rada " +#~ "sistema." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Preuzimam potpis ažuriranja firmvera…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Preuzimam ažuriranja metapodataka firmvera…" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Prikaži upit za instaliranje izvora neslobodnog softvera" + +#~ msgid "Select All" +#~ msgstr "Izaberi sve" + +#~ msgid "Select None" +#~ msgstr "Poništi izbor" + +#~ msgid "Featured %s" +#~ msgstr "Izdvojeno u kategoriji „%s“" + +#~ msgid "Show" +#~ msgstr "Prikaži" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Meni filtera potkategorija" + +#~ msgid "Sort" +#~ msgstr "Poređaj po" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Meni sortiranja potkategorija" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgid "Audio & Video" +#~ msgstr "Zvuk i snimci" + +#~ msgid "Developer Tools" +#~ msgstr "Razvojni alati" + +#~ msgid "Education & Science" +#~ msgstr "Obrazovanje i nauka" + +#~ msgid "Games" +#~ msgstr "Igre" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafika i fotografija" + +#~ msgid "Productivity" +#~ msgstr "Produktivnost" + +#~ msgid "Communication & News" +#~ msgstr "Saopštenja i vesti" + +#~ msgid "Utilities" +#~ msgstr "Alatke" + +#~ msgid "_Read Less" +#~ msgstr "P_ročitaj manje" + +#~ msgid "_Launch" +#~ msgstr "_Pokreni" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Ne mogu da utvrdim kojim delovima sistema ovaj program pristupa. Ovo je " +#~ "čest slučaj kod starijih programa." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Nikada" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Nisko" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Srednje" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Visoko" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Nepoznato" + +#~ msgid "Public domain" +#~ msgstr "Javno vlasništvo" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "" +#~ "https://sr.wikipedia.org/sr-ec/" +#~ "%D0%92%D0%BB%D0%B0%D1%81%D0%BD%D0%B8%D1%87%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw.sr" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Korisnici su vezani sledećom dozvolom:" +#~ msgstr[1] "Korisnici su vezani sledećim dozvolama:" +#~ msgstr[2] "Korisnici su vezani sledećim dozvolama:" +#~ msgstr[3] "Korisnici su vezani sledećom dozvolom:" + +#~ msgid "Localized in your Language" +#~ msgstr "Preveden na srpski" + +#~ msgid "Documentation" +#~ msgstr "Dokumentacija" + +#~ msgid "Release Activity" +#~ msgstr "Održavan program" + +#~ msgid "Sandboxed" +#~ msgstr "Izolovan" + +#~ msgid "Category" +#~ msgstr "Kategorija" + +#~ msgid "Free" +#~ msgstr "Slobodan" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Nepoznato" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "To znači da softver može biti slobodno pokrenut, umnožen, raspodeljen, " +#~ "proučavan i izmenjen." + +#~ msgid "Proprietary Software" +#~ msgstr "Vlasnički softver" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "To znači da je softver u vlasništvu pojedinca ili kompanije. Često " +#~ "postoje ograničenja njegovog korišćenja i njegovom izvornom kȏdu obično se ne " +#~ "može pristupiti." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Odredbe dozvole ovog softvera su nepoznate." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Program je ocenjen ovako zato što ga odlikuje sledeće:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Nema pojedinosti za ovu ocenu starosne prikladnosti." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Uklonjeno" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Instaliran" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Ažuriran" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Nepoznato" + +#~ msgid "History" +#~ msgstr "Istorijat" + +#~ msgid "More…" +#~ msgstr "Još…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Preporučeni audio i video programi" + +#~ msgid "Recommended Games" +#~ msgstr "Preporučene igre" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Preporučeni grafički programi" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Preporučeni stvaralački programi" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Deo ovih programa je vlasnički te je deljenje, korišćenje i pristupanje " +#~ "izvornom kodu ograničeno." + +#~ msgid "Find out more…" +#~ msgstr "Saznaj više…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Izbori urednika" + +#~ msgid "Recent Releases" +#~ msgstr "Nedavna izdanja" + +#~ msgid "Remove “%s”?" +#~ msgstr "Ukloniti riznicu „%s“?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Onemogućiti riznicu „%s“?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Nema dodatnih riznica" + +#~ msgid "_Remove…" +#~ msgstr "_Ukloni…" + +#~ msgid "_Disable…" +#~ msgstr "O_nemogući…" + +#~ msgid "Disabling" +#~ msgstr "Onemogućavam" + +#~ msgid "Enabled" +#~ msgstr "Omogućeno" + +#~ msgid "Disabled" +#~ msgstr "Onemogućeno" + +#~ msgid "ratings in total" +#~ msgstr "ukupno ocena" + +#~ msgid "_Remove All" +#~ msgstr "_Ukloni sve" + +#~ msgid "Looking for new updates…" +#~ msgstr "Tražim nova ažuriranja…" + +#~ msgid "Setting up updates…" +#~ msgstr "Podešavam ažuriranja…" + +#~ msgid "Software is up to date" +#~ msgstr "Programi su ažurirani" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Ažuriranja biće primenjena nakon što se računar ponovo pokrene." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Čekam na preuzimanje distribucije %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Preuzimam distribuciju %s %s" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS je usluga koja pruža preglede programa od strane korisnika" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Omogući riznicu za proširenja Gnomove školjke" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Likovi iz crtaća u nepoželjnim situacijama" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Likovi iz crtaća u agresivnom sukobu" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Grafičko nasilje koje uključuje likove iz crtaća" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Likovi u nesigurnim situacijama koje se lako razlikuju od stvarnosti" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Likovi u agresivnom sukobu koji se lako razlikuje od stvarnosti" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Grafičko nasilje koje se lako razlikuje od stvarnosti" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Blago stvarni likovi u nesigurnim situacijama" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Prikaz stvarnih likova u agresivnom sukobu" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Grafičko nasilje koje uključuje stvarne likove" + +#~ msgid "No bloodshed" +#~ msgstr "Nema krvoprolića" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Nerealno krvoproliće" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Realno krvoproliće" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Prikaz krvoprolića i sakaćenje delova tela" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Silovanje ili drugo nasilno seksualno ponašanje" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Upućivanje na alkoholna pića" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Upotreba alkoholnih pića" + +#~ msgid "References to illicit drugs" +#~ msgstr "Upućivanje na zabranjene droge" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Upotreba zabranjenih droga" + +#~ msgid "References to tobacco products" +#~ msgstr "Upućivanje na duvanske proizvode" + +#~ msgid "Use of tobacco products" +#~ msgstr "Upotreba duvanskih proizvoda" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Kratka umetnička golotinja" + +#~ msgid "Prolonged nudity" +#~ msgstr "Produžena golotinja" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provokativne upute ili prikazi" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Seksualne upute ili prikazi" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Grafičko seksualno ponašanje" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Blaga ili retka upotreba psovki" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Umerena upotreba psovki" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Jaka ili česta upotreba psovki" + +#~ msgid "Slapstick humor" +#~ msgstr "Urnebesna komedija" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgaran ili neumesni humor" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Erotski i humor za odrasle" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativnost prema određenoj grupi ljudi" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Diskriminacija osmišljena da izazove emotivnu povredu" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Eksplicitna diskriminacija na osnovu pola, seksualnosti, rase ili " +#~ "veroispovesti" + +#~ msgid "Product placement" +#~ msgstr "Plasman proizvoda" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Eksplicitno upućivanje na naročite robne marke ili zaštićene proizvode" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Korisnici se ohrabruju da kupuju određene stavke u stvarnom svetu" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Kockanje na nasumičnim događajima koji koriste žetone ili kredite" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Kockanje koje koristi „igrački“ novac (play)" + +#~ msgid "Gambling using real money" +#~ msgstr "Kockanje koje koristi stvarni novac" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Korisnici se ohrabruju da doniraju stvarni novac" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Sposobnost potrošnje stvarnog novca u programu" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Međudejstvo između korisnika bez mogućnosti ćaskanja" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Umerena mogućnost ćaskanja između korisnika" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Nekontrolisana mogućnost zvučnog i video ćaskanja između korisnika" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "" +#~ "Deljenje korisničkih imena na društvenim mrežama ili adresa elektronske " +#~ "pošte" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Proverava poslednje izdanje programa" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Dele se dijagnostički podaci preko kojih drugi ne mogu prepoznati " +#~ "korisnika" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Dele se dijagnostički podaci preko kojih drugi mogu prepoznati korisnika" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Deljenje stvarne lokacije sa drugim korisnicima" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Posredna upućivanja na homoseksualnost" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Ljubljenje između osoba istog pola" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Grafičko seksualno ponašanje između osoba istog pola" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Posredna upućivanja na prostituciju" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Neposredna upućivanja na prostituciju" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Grafički prikazi čina prostitucije" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Posredna upućivanja na preljubu" + +#~ msgid "Direct references to adultery" +#~ msgstr "Neposredna upućivanja na preljubu" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Grafički prikazi čina preljube" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Oskudno obučeni ljudski karakteri" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Preterano seksualizovani ljudski karakteri" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Prikazi ili upućivanja ka istorijskim skrnavljenjima" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Prikazi savremenog ljudskog skrnavljenja" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Grafički prikazi savremenog skrnavljenja" + +#~ msgid "Visible dead human remains" +#~ msgstr "Sa vidljivim ljudskim posmrtnim ostacima" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Posmrtni ostaci ljudi koji su izloženi vremenskim prilikama" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Grafički prikazi skrnavljenja ljudskih tela" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Prikazi ili upućivanja ka istorijskom robovlasništvu" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Prikazi savremenog robovlasništva" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Grafički prikazi savremenog robovlasništva" + +#~ msgid "General" +#~ msgstr "Opšte" + +#~ msgid "ALL" +#~ msgstr "SVE" + +#~ msgid "Teen" +#~ msgstr "Tinejdžeri" + +#~ msgid "Everyone 10+" +#~ msgstr "Svi 10+ godina" + +#~ msgid "Everyone" +#~ msgstr "Svi" + +#~ msgid "Early Childhood" +#~ msgstr "Rano detinjstvo" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Nepoznato" + +#~ msgid "this website" +#~ msgstr "ovom veb sajtu" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Ajmo u kupovinu" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Uklonjen" + +#~ msgid "Format" +#~ msgstr "Vrsta" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Da li sigurno želite da uklonite „%s“?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Ovaj program se mora ponovo pokrenuti da biste koristili nove dodatke." + +#~ msgid "Security Updates Pending" +#~ msgstr "Ima bezbednosnih ažuriranja" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Preporučeno je što ranije instaliranje ovih ažuriranja" + +#~ msgid "Restart & Install" +#~ msgstr "Ponovo pokreni i instaliraj" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Ima važnih ažuriranja za sistem i programe koja su spremna za instaliranje" + +#~ msgid "View" +#~ msgstr "Pogledaj" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Juče, u %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Juče, u %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Pre tri dana" + +#~ msgid "Four days ago" +#~ msgstr "Pre četiri dana" + +#~ msgid "Five days ago" +#~ msgstr "Pre pet dana" + +#~ msgid "Six days ago" +#~ msgstr "Pre šest dana" + +#~ msgid "Two weeks ago" +#~ msgstr "Pre dve nedelje" + +#~ msgid "About %s" +#~ msgstr "O programu „%s“" + +#~ msgid "%s ME" +#~ msgstr "%s upravljački motor (ME)" + +#~ msgid "Show the folder management UI" +#~ msgstr "Prikazuje sučelje upravljanja fasciklama" + +#~ msgid "Folder Name" +#~ msgstr "Naziv fascikle" + +#~ msgid "_Add" +#~ msgstr "_Dodaj" + +#~ msgid "Add to Application Folder" +#~ msgstr "Dodaj u fasciklu programa" + +#~ msgid "Top Rated" +#~ msgstr "Najbolje ocene" + +#~ msgid "Extension Settings" +#~ msgstr "Podešavanja proširenja" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Proširenja koristite na sopstvenu odgovornost. Ako imate problema sa " +#~ "sistemom, preporučuje vam se da ih isključite." + +#~ msgid "Failed to load components" +#~ msgstr "Nisam uspeo da učitam delove" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS je uspešno proveren!" + +#~ msgid "Failed to load file" +#~ msgstr "Nisam uspeo da učitam datoteku" + +#~ msgid "Unsaved changes" +#~ msgstr "Nesačuvane izmene" + +#~ msgid "The application list is already loaded." +#~ msgstr "Spisak sa programima je već učitan." + +#~ msgid "Merge documents" +#~ msgstr "Spoji dokumente" + +#~ msgid "Throw away changes" +#~ msgstr "Odbaci izmene" + +#~ msgid "Open AppStream File" +#~ msgstr "Otvori AppStream datoteku" + +#~ msgid "Save AppStream File" +#~ msgstr "Sačuvaj AppStream datoteku" + +#~ msgid "_Save" +#~ msgstr "_Sačuvaj" + +#~ msgid "%s banner design deleted." +#~ msgstr "Dizajn banera za %s je obrisan." + +#~ msgid "Banner design deleted." +#~ msgstr "Dizajn banera je obrisan." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Spisak programa sadrži nesačuvane izmene." + +#~ msgid "Use verbose logging" +#~ msgstr "Koristi detaljno zapisivanje" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Dizajner banera za Gnomove programe" + +#~ msgid "No Designs" +#~ msgstr "Nema dizajna" + +#~ msgid "Error message here" +#~ msgstr "Poruka o grešci" + +#~ msgid "Category Featured" +#~ msgstr "Izdvojeno u kategoriji" + +#~ msgid "Undo" +#~ msgstr "Opozovi" + +#~ msgid "Banner Designer" +#~ msgstr "Dizajner banera" + +#~ msgid "New Banner" +#~ msgstr "Novi baner" + +#~ msgid "Import from file" +#~ msgstr "Uvezi iz datoteke" + +#~ msgid "Export to file" +#~ msgstr "Izvezi u datoteku" + +#~ msgid "Spacing" +#~ msgstr "Razmaci" + +#~ msgid "The amount of space between children" +#~ msgstr "Količina razmaka među sadržanim elementima" + +#~ msgid "Click on items to select them" +#~ msgstr "Pritisnite na stavke da ih izaberete" + +#~ msgid "Select" +#~ msgstr "Izaberi" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Dodaj u fasciklu…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Premesti u fasciklu…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Ukloni iz fascikle" + +#~ msgid "Featured Applications" +#~ msgstr "Izdvojeni programi" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Dizajniraj banere za Gnomove progrme" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "" +#~ "AppStream;Software;App;AppStrim;Softver;Aplikacija;Programi;App;Programi;" +#~ "Softver;Aplikacija;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Proširenja školjke" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Riznica sa proširenjima Gnomove školjke" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Preuzimam metapodatke proširenja školjke…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Proširenja Gnomove školjke" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_Sve" + +#~ msgid "Sign In / Register…" +#~ msgstr "Prijavi se ili registruj…" + +#~ msgid "Continue" +#~ msgstr "Nastavi" + +#~ msgid "Use" +#~ msgstr "Koristi" + +#~ msgid "Add another…" +#~ msgstr "Dodaj drugo…" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Katalog softvera je učitan" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s će biti instaliran i biće vam naplaćeno %s." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "Prijavljen kao %s" + +#~ msgid "Sign in…" +#~ msgstr "Prijavi se…" + +#~ msgid "Sign out" +#~ msgstr "Odjava" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Ne mogu da kupim program „%s“: bila je potrebna prijava" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Ne mogu da kupim program „%s“: prijava nije bila ispravna" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Ne mogu da kupim program „%s“: nema podešenog načina plaćanja" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Ne mogu da kupim program „%s“: naplata je odbijena" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Da nastavite, potreban vam je Ubuntu Jedan nalog." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Da nastavite, potreban je vaš Ubuntu Jedan nalog." + +#~ msgid "..." +#~ msgstr "..." + +#~ msgid "Show profiling information for the service" +#~ msgstr "Prikazuje podatke profilisanja za uslugu" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Da nastavite treba da se prijavite na „%s“." + +#~ msgid "Email address" +#~ msgstr "Adresa e-pošte" + +#~ msgid "I have an account already" +#~ msgstr "Već imam nalog" + +#~ msgid "I want to register for an account now" +#~ msgstr "Želim sada da se registrujem za nalog" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Sam se prijavi sledeći put" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "" +#~ "Unesite vaš jednovremeni pin za potvrđivanje identiteta sa dva činioca." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Potvrdi identitet" + +#~ msgid "_About" +#~ msgstr "_O programu" + +#~ msgid "_Quit" +#~ msgstr "_Izađi" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Podatke o „%s“, kao i podatke o nabavljanju kodeka koji može puštati ovu " +#~ "vrstu datoteke možete pronaći na veb stranici." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Ne mogu se instalirati programi dok se ovo ne razreši." + +#~ msgid "For more information, visit %s." +#~ msgstr "Za više podataka, pogledajte %s." + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Ne mogu da ažuriram program „%s“ iz „%s“" + +#~ msgid "Downloading new updates…" +#~ msgstr "Preuzimam nova ažuriranja…" + +#~ msgid "Restart & _Install" +#~ msgstr "Ponovo pokreni i _instaliraj" + +#~ msgid "Getting runtime source…" +#~ msgstr "Dobavljam izvor izvršnog okruženja…" + +#~ msgid "Downloading application page…" +#~ msgstr "Preuzimam stranicu programa…" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba pruža programerima jednostavan način za pravljenje programskih paketa" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Krajnja platforma za zabavu od Valva" + +#~ msgid "Sorted by Name" +#~ msgstr "Poređano po nazivu" + +#~ msgid "Sorted by Rating" +#~ msgstr "Poređano po oceni" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Spisak dodatnih izvora koji su prethodno bili uključeni" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Spisak dodatnih izvora koji su prethodno bili uključeni prilikom " +#~ "instalacije programa trećih lica." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Prikazuje neslobodan softver u rezultatima pretrage" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "Spisak neslobodnih izvora koji se mogu po izboru uključiti" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Pretpodešeno međudejstvo između igrača bez mogućnosti ćaskanja" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Razmena korisničkih podataka sa trećim stranama" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Da uključim izvore vlasničkog softvera?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Nema instaliranih programa ili dodataka, druge vrste programa mogu biti " +#~ "instalirane" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Obično ima ograničenja na korišćenje i na pristup izvornom kodu." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Izvori vlasničkog softvera" + +#~ msgid "Remove Source" +#~ msgstr "Ukloni izvor" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Dodatni izvori programa se mogu preuzeti sa interneta. Oni će vam " +#~ "omogućiti instaliranje programa koji nisu dostupni u operativnom sistemu " +#~ "%s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Uklanjanjem izvora uklonićete takođe i sve programe koje ste sa njega " +#~ "instalirali." + +#~ msgid "No software installed from this source" +#~ msgstr "Nema programa instaliranih sa ovog izvora" + +#~ msgid "Installed from this Source" +#~ msgstr "Instalirani sa ovog izvora" + +#~ msgid "Last Checked" +#~ msgstr "Poslednja provera" + +#~ msgid "Added" +#~ msgstr "Dodat" + +#~ msgid "Website" +#~ msgstr "Veb stranica" + +#~ msgid "page1" +#~ msgstr "stranica1" + +#~ msgid "page2" +#~ msgstr "stranica2" + +#~ msgid "“%s” [%s]" +#~ msgstr "„%s“ [%s]" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgid "Total" +#~ msgstr "Ukupno" + +#~ msgid "Could not find '%s'" +#~ msgstr "Ne mogu da nađem „%s“" + +#~ msgid "Other Updates" +#~ msgstr "Druga ažuriranja" + +#~ msgid "Installation of %s failed." +#~ msgstr "Nisam uspeo da instaliram „%s“." + +#~ msgid "Removal of %s failed." +#~ msgstr "Nisam uspeo da uklonim „%s“." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Uverite se da imate pristup internetu i pokušajte ponovo." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Oslobodite prostor na disku pa pokušajte ponovo." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Ako se problem ponovi, obratite se dostavljaču softvera." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Ništa" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Sve" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "Izdvojeno" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomija" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Hemija" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgid "Science" +#~ msgstr "Nauka" + +#~ msgid " or " +#~ msgstr " ili " + +#~ msgid "3rd party" +#~ msgstr "trećih lica" + +#~ msgid "nonfree" +#~ msgstr "neslobodni" + +#~ msgid "_Installing" +#~ msgstr "_Instaliram" + +#~ msgid "_Removing" +#~ msgstr "_Uklanjam" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Nepoznata" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Izračunavam…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Nepoznata" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Ovaj program isporučuju treće strane." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Ovaj program isporučuje treća strana i možda sadrži neslobodne sastojke." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Ovaj program možda sadrži neslobodne sastojke." + +#~ msgid "_History" +#~ msgstr "_Istorijat" + +#~ msgid "Size" +#~ msgstr "Veličina" + +#~ msgid "non-free" +#~ msgstr "neslobodni" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Preporučeni kancelarijski programi" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Izvori programa vam daju pristup dodatnim programima." + +#~ msgid "One Star" +#~ msgstr "Jedna zvezdica" + +#~ msgid "Two Stars" +#~ msgstr "Dve zvezdice" + +#~ msgid "Three Stars" +#~ msgstr "Tri zvezdice" + +#~ msgid "Four Stars" +#~ msgstr "Četiri zvezdice" + +#~ msgid "Five Stars" +#~ msgstr "Pet zvezdica" + +#~ msgid "No AppStream data found" +#~ msgstr "Nisam pronašao podatke toka programa" + +#~ msgid "Audio" +#~ msgstr "Zvuk" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Uređivanje" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Baze podataka" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Narezivanje diska" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Ham radio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mešači" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Muzika" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Snimači" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Sekvenceri" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Tjuneri" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Izgradnja" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Baze podataka" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IRO" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Profilisanje" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Veb programiranje" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Računarstvo" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Prikazivanje podataka" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Ekonomija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Elektrika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Inženjerstvo" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geonauka" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Istorija" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Obrada slika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Karte" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Muzika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Analiza brojeva" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Paralelno računarstvo" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fizika" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Duhovnost" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Pucačine" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Oponašanje (simulacije)" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Sportske igre" + +#~ msgid "Graphics" +#~ msgstr "Grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D grafika" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Izdavaštvo" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Raster grafika" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Pozivanje (dial-ap)" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "El. pošta" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Dovod" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Prenos datoteka" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Ham radio" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Brze poruke" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC klijenti" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Nadzor" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefonija" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Veb programiranje" + +#~ msgid "Office" +#~ msgstr "Kancelarija" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Grafikon" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Upravljanje kontaktima" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Rečnik" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "El. pošta" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Dijagram toka" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "LDP (PDA)" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografija" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Presentation" +#~ msgstr "Izlaganje" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Upravljanje projektima" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Izdavaštvo" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Tabele" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Pregledač" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Umetnost" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Veštačka inteligencija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Hemija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Računarstvo" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Izgradnja" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Prikazivanje podataka" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Ekonomija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Elektrika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Elektronika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Inženjerstvo" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologija" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geonauka" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Istorija" + +# https://sr.wiktionary.org/sr/%D1%85%D1%83%D0%BC%D0%B0%D0%BD%D0%B8%D0%BE%D1%80%D0%B0 +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humanizam" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Obrada slika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Jezici" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Literatura" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Karte" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Medicina" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Analiza brojeva" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Paralelno računarstvo" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fizika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotika" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Duhovnost" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Sportovi" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Oponašavač (emulator)" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Upravnik datoteka" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Alatke za datoteke" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Praćenje" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Bezbednost" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Emulator terminala" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Pristupačnost" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Arhiviranje" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Kalkulator" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Časovnik" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Pakovanje" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Alatke datoteka" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Karte" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Duhovnost" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Alati za telefoniju" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Uređivanje" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Baza podataka" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Narezivanje diska" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Snimači" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" + +#~ msgid "A previous update was unfinished." +#~ msgstr "Prethodno ažuriranje je ostalo nedovršeno." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "Ažuriranje se ne može instalirati. Ovo se često dešava ukoliko je problem " +#~ "u samom ažuriranju. Sačekajte novo ažuriranje i onda pokušajte ponovo." + +#~ msgid "Internet Only Application" +#~ msgstr "Mrežni program" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "Jedno ažuriranje nije označeno na pravi način." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "Zatraženo je ažuriranje van mreže ali nijedan paket nije zatražio " +#~ "ažuriranje." + +#~ msgid "No space was left on the drive." +#~ msgstr "Nema više prostora na disku." + +#~ msgid "An update failed to install correctly." +#~ msgstr "Jedno ažuriranje nije uspelo da se ispravno instalira." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Ažuriranje van mreže nije uspelo na očekivani način." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i instalirani program i %i dodatak" +#~ msgstr[1] "%i instalirana programa i %i dodatka" +#~ msgstr[2] "%i instaliranih programa i %i dodataka" +#~ msgstr[3] "Jedan instalirani program i jedan dodatak" + +#~ msgid "Picks" +#~ msgstr "Izabrani" + +#~ msgid "Done" +#~ msgstr "Gotovo" + +#~ msgid "Set the specified debugging level" +#~ msgstr "Podešava nivo navedenog pročišćavanja" + +#~ msgid "_Pending" +#~ msgstr "_Na čekanju" + +# timezone. +#~ msgid "Complicated!" +#~ msgstr "Zamršeno!" + +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "Baze podataka" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "Ham radio" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "Razvoj veba" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "Alatke za datoteke" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "Karte" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "Duhovnost" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "Slovni likovi" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "Kodeci" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "Izvori ulaza" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "Paketi jezika" + +#~ msgid "The search term to use when starting the UI" +#~ msgstr "Obrasci pretrage za korišćenje prilikom pokretanja sučelja" + +#~ msgid "_Installed (%d)" +#~ msgstr "_Instaliranih (%d)" + +#~ msgid "_Updates (%d)" +#~ msgstr "_Osveženja (%d)" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..36703d3 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,8602 @@ +# Swedish translation for gnome-software. +# Copyright © 2014-2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Translators: +# Mattias Eriksson , 2014. +# Anders Jonsson , 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. +# Sebastian Rasmussen , 2016. +# Luna Jernberg , 2021, 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-05-10 17:57+0000\n" +"PO-Revision-Date: 2025-05-31 12:32+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.6\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Programvara" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Installera och uppdatera program" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Programvara gör det möjligt att hitta och installera nya program och " +"systemkomponenter, samt att ta bort redan installerade program." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Programvara förevisar föreslagna och populära program med användbara " +"beskrivningar och ett flertal skärmbilder per program. Program kan antingen " +"hittas genom att bläddra igenom kategorilistan eller genom att söka. Det gör " +"det även möjligt att uppdatera systemet genom ett frånkopplat " +"uppdateringsförfarande." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Översiktspanel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Detaljpanel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Installerat-panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Uppdateringspanel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Detaljerna för uppdateringen" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2789 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME-projektet" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Testa akmods-nyckel i mellanläggs-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Autentisering krävs för att testa akmods-nyckel i mellanläggs-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Registrera akmods-nyckel till mellanläggs-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Autentisering krävs för att registrera akmods-nyckel till mellanläggs-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Testa DKMS-nyckel i mellanläggs-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Autentisering krävs för att testa DKMS-nyckel i mellanläggs-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Registrera DKMS-nyckel till mellanläggs-UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" +"Autentisering krävs för att registrera DKMS-nyckel till mellanläggs-UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Installera en appstream-fil till en systemplats" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Installerar en appstream-fil till en systemplats" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "En lista över kompatibla projekt" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Detta är en lista över kompatibla projekt som vi bör visa som GNOME, KDE och " +"XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"Huruvida uppdateringar och uppgraderingar ska hanteras i GNOME Programvara" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Om inaktiverad kommer GNOME Programvara att dölja uppdateringspanelen och " +"inte utföra några automatiska uppdateringsåtgärder eller ställa frågor om " +"uppgraderingar." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Hämta och installera uppdateringar automatiskt" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Om aktiverat, kommer GNOME Programvara automatiskt att hämta " +"programvaruuppdateringar i bakgrunden och installera sådana som inte kräver " +"en omstart." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Avisera användaren om programvara som uppdaterats i bakgrunden" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Om aktiverat, kommer GNOME Programvara att avisera användaren om " +"uppdateringar som inträffade medan användaren var inaktiv." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "" +"Huruvida automatisk uppdatering ska ske för anslutning med begränsad " +"surfmängd" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Om aktiverad kommer GNOME Programvara att uppdatera automatiskt i bakgrunden " +"även på en anslutning med begränsad surfmängd (hämtar förr eller senare " +"metadata, söker efter uppdateringar o.s.v., vilket kan leda till kostnader " +"för användaren)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Huruvida det är den första körningen av GNOME Programvara" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Visa stjärnbetyg intill program" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Filtrera program baserat på standardgrenen som ställts in för fjärren" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Icke-fria program visar en varningsdialog före installation" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"När icke-fria program installeras kan en varningsdialog visas. Detta styr om " +"dialogen undertrycks." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Tidsstämpeln för den senaste uppdateringskontrollen" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Tidsstämpeln för den senaste uppgraderingsaviseringen" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Tidsstämpeln för den senaste uppdateringsaviseringen" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Tidsstämpeln för den första säkerhetsuppdateringen, rensas efter uppdatering" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Tidsstämpeln för den senaste uppdateringen" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Tiden i sekunder för att bekräfta att skärmbilden uppströms fortfarande är " +"giltig" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Att välja ett högre värde betyder färre omvägar till fjärrservern men det " +"kan ta längre tid innan uppdateringar till skärmbilderna visas för " +"användaren. Värdet 0 betyder att vi aldrig kontrollerar servern om bilden " +"redan finns i cachen." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Servern som används för programomdömen" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Den minsta karmapoängen för omdömen" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Omdömen med karma mindre än detta tal kommer inte att visas." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "En lista över officiella förråd som inte ska anses vara tredje part" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"En lista över nödvändiga förråd som inte kan inaktiveras eller tas bort" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "En lista över officiella förråd som ska anses vara fri programvara" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "Licens-URL att använda då ett program ska anses vara fri programvara" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Installera paketerade program för alla användare på systemet om möjligt" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Tillåt åtkomst till dialogen Programförråd" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Erbjud uppgraderingar för förhandsutgåvor" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Visa gränssnittselement som informerar användaren om att ett program är icke-" +"fritt" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Visa den installerade storleken för program i listan över installerade " +"program" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://sv.wikipedia.org/wiki/Propriet%C3%A4r_programvara'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI som förklarar icke-fri och proprietär programvara" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"En lista över URL:er som pekar till appstream-filer som kommer att hämtas " +"till en swcatalog-mapp" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Installera AppStream-filerna på en systemomfattande plats för alla " +"användare. Om false (falskt) installeras filer i icke-standardkatalogen " +"$XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Prioritetsordning för paketformat att föredra, med viktigare format listade " +"först. En tom vektor betyder standardordningen. Överhoppade format antas " +"vara listade sist. Exempel på paketformat är: deb, flatpak, rpm och snap. " +"Formaten kan valfritt anges med ett namn på källan, avskilt med ett kolon, " +"exempelvis ”flatpak:flathub”." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Tidsstämpeln för senaste försöket att ta bort oanvända flatpak-" +"exekveringsmiljöer" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Sätt till ”true” (sant) för att endast visa program med fri licens och dölja " +"alla proprietära program." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Sätt till ”true” (sant) för att endast visa program från utvecklare vars " +"identitet har verifierats." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Tidsstämpeln för de senaste historiska uppdateringarna." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"En sträng som lagrar gnome-online-account-ID:t som används för att logga in" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Programvaras systemomfattande Appstream-installerare" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Misslyckades med att tolka kommandoradsargument" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Du måste ange exakt ett filnamn" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Detta program kan endast köras av root-användaren" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Misslyckades med att validera innehållstyp: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Misslyckades med att flytta: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Installera programvara" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Installera valda programvaror på systemet" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Tecknat våld" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Ingen information angående tecknat våld" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Orealistiskt våld" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Ingen information angående orealistiskt våld" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Realistiskt våld" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Ingen information angående realistiskt våld" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Våld som skildrar blodsutgjutelse" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Ingen information angående blodsutgjutelse" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Sexuellt våld" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Ingen information angående sexuellt våld" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkohol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Ingen information angående referenser till alkohol" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Narkotika" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Ingen information angående referenser till illegala droger" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tobak" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Ingen information angående referenser till tobaksprodukter" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Nakenhet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Ingen information angående nakenhet av något slag" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Sexuella teman" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Ingen information angående sexuella referenser eller skildringar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Svordomar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Ingen information angående svordomar av något slag" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Olämplig humor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Ingen information angående olämplig humor" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminering" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Ingen information angående diskriminerande språkbruk av något slag" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Annonser" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Ingen information angående annonser av något slag" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Hasardspel" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Ingen information angående hasardspel av något slag" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Köp" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Ingen information angående möjlighet att spendera pengar" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Chatt mellan användare" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Ingen information angående sätt att chatta med andra användare" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Röstchatt mellan användare" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Ingen information angående sätt att prata med andra användare" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kontaktdetaljer" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Ingen information angående delning av e-postadresser eller användarnamn på " +"sociala nätverk" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Identifierande information" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Ingen information angående delning av användarinformation med tredje part" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Platsdelning" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Ingen information angående delning av fysisk plats med andra användare" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Homosexualitet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Ingen information angående referenser till homosexualitet" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Prostitution" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Ingen information angående referenser till prostitution" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Otrohet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Ingen information angående referenser till otrohet" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Sexualiserade figurer" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Ingen information angående sexualiserade figurer" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Skändning" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Ingen information angående referenser till skändning" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Mänskliga kvarlevor" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Ingen information angående synliga kvarlevor av människor" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Slaveri" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Ingen information angående referenser till slaveri" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Inkluderar inte referenser till droger" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Inkluderar inte svärande, hädelse och andra typer av hårt språk" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Inkluderar inte annonser eller pengaöverföring" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Inkluderar inte sex eller nakenhet" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Inkluderar inte okontrollerad chattfunktion mellan användare" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Inkluderar inte våld" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Droger" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Hårt språk" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Pengar" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Socialt" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Våld" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Alla" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s har okänd åldersklassificering" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s passar för alla" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s passar för småbarn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s passar för unga barn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s passar för barn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s passar för tonåringar" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s passar för vuxna" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s passar för %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Åldersklassificering" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Hur du bidrar med saknad information" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Lokal fil" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paket" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Väntar" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Väntar på att installeras" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Väntar på att tas bort" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Installerar" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Tar bort" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Hämtar" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Installera" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Avinstallera…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Nätverk" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Kan kommunicera över nätverket" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Systemtjänster" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Kan komma åt D-Bus-tjänster på systembussen" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Sessionstjänster" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Kan komma åt D-Bus-tjänster på sessionsbussen" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Enheter" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Kan komma åt godtyckliga enheter såsom webbkameror" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Kan komma åt inmatningsenheter" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Kan komma åt mikrofoner och spela upp ljud" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Kan komma åt systemets enhetsfiler" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Skärminnehåll" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Kan komma åt skärminnehåll" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Hemmapp" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Kan visa, redigera och skapa filer" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Kan visa filer" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Filsystem" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Hämtningsmapp" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Inställningar" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Kan visa och ändra alla inställningar" + +# Det är X11 som avses +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Gammalt fönstersystem" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Använder ett gammalt, osäkert fönstersystem" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Flykt från sandlåda" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Kan undkomma sandlådan och gå runt alla andra begränsningar" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Ingen beskrivning för uppdatering tillgänglig." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Uppdateringsdetaljer" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Kräver ytterligare behörigheter" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Ogiltiga betygsdata erhölls från servern" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Kunde inte kommunicera med betygsserver" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Omdömen" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Inga omdömen hittades för detta program." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Inga omdömen" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Versionshistorik" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Nytt i version %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Version %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Inga detaljer för denna utgåva" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Uppstartsläge: antingen ”updates” (uppdateringar) , ”updated” (uppdaterat), " +"”installed” (installerat) eller ”overview” (översikt)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "LÄGE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Sök efter program" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SÖKNING" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Visa programdetaljer (utifrån program-ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Visa programdetaljer (utifrån paketnamn)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKTNAMN" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Installera programmet (utifrån program-ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Avinstallera programmet (utifrån program-ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Öppna en lokal paketfil" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILNAMN" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Typen av interaktion som förväntas för denna åtgärd: antingen ”none” " +"(ingen), ”notify” (avisera) eller ”full”" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERAKTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Visa en lokal metainfo- eller appdata-fil" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Aktivera utförlig felsökningsutmatning (från den körande instansen om den " +"redan körs)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Installerar väntande uppdateringar i bakgrunden" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Visa inställningar" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Avsluta den körande instansen" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Föredra lokala filkällor framför AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Visa versionsnummer" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 Bidragsgivarna till GNOME Programvara" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Mattias Eriksson \n" +"Anders Jonsson \n" +"Luna Jernberg \n" +"\n" +"Skicka synpunkter på översättningen till\n" +"." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Det finns tyvärr inga detaljer för det programmet." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Installerad storlek" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Inkluderar %s data och %s cache" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Inkluderar %s data" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Inkluderar %s cache" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Okänd cache- och dataanvändning" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Hämtningsstorlek" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Behöver inga ytterligare systemhämtningar" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Behöver ytterligare systemhämtningar av okänd storlek" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Behöver %s ytterligare systemhämtningar" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Storlek okänd" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Ingen behörighet" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Har nätverksåtkomst" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Använder systemtjänster" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Använder sessionstjänster" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Kan komma åt hårdvaruenheter" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Kan komma åt systemenheter" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Kan läsa/skriva alla dina data" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Kan läsa alla dina data" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Kan läsa/skriva dina hämtningar" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Kan läsa dina hämtningar" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Kan komma åt vissa specifika filer" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Kan visa och ändra användarinställningar" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Använder ett gammalt fönstersystem" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Kan erhålla godtyckliga behörigheter" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Programvarans utvecklare har verifierats" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Granskat av OS-distributör" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Granskat av %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Tillhandahålls av en tredje part" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Programvaran stöds inte längre" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Granskningsbar kod" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Okänd licens" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Proprietär kod" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Speciell licens" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Privilegierat" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Säkert" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Troligen säkert" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potentiellt osäkert" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Osäkert" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Endast mobil" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Fungerar endast på en liten skärm" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Endast skrivbord" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Fungerar endast på en stor skärm" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Skärmstorleken stämmer inte" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Stöder inte din aktuella skärmstorlek" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Kräver en pekskärm" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Kräver ett tangentbord" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Kräver en mus" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Handkontroll behövs" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Kräver en handkontroll för att kunna spela" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Adaptivt" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Fungerar på telefoner, plattor och skrivbord" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Kräver troligen ett tangentbord eller en mus" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Fungerar på stationära och bärbara datorer" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Innehåller inget som är olämpligt för vissa åldrar" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Ingen information för åldersklassificering tillgänglig" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Besök webbplats" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Installera…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Avbryt" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Installera" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Hämta" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Uppdatera" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Avinstallera…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Avinstallerar" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritisk uppdatering" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Enheten kan inte användas under uppdatering." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Källa: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Har bytt namn från %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Har slutat ta emot uppdateringar" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritisk uppdatering" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Installerat" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Hjälp till att översätta %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s designas, utvecklas och översätts av en internationell gemenskap av " +"bidragsgivare.\n" +"\n" +"Detta betyder att även om det inte ännu är tillgängligt på ditt språk så kan " +"du engagera dig och själv hjälpa till att översätta det." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Översättningar" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "Ö_versättningswebbplats" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Inloggning krävde fjärren %s (rike %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Inloggning krävs" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "A_vbryt" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Logga in" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Användare" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Lösenord" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Övrigt" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Alla" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "I blickfånget" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Redaktionens val" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Nya & uppdaterade" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Val från webben" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Annan programvara" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s installerad" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "En omstart krävs för att ändringarna ska börja gälla" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Programmet är redo att användas" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Systemuppdateringar installerade" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Nyligen installerade uppdateringar finns tillgängliga för granskning" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Starta om" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Starta" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Installera programvara?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Installera tredjepartsprogramvara?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Aktivera programförråd?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Aktivera programförråd från tredje part?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s är inte programvara med fri och öppen källkod, och " +"tillhandahålls av ”%s”." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s tillhandahålls av ”%s”." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Detta programförråd måste vara aktiverat för att fortsätta installation." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Det kan vara olagligt att installera eller använda %s i vissa länder." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Det kan vara olagligt att installera eller använda denna kodek i vissa " +"länder." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "_Varna inte igen" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Aktivera och _installera" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Detaljerat felmeddelande från pakethanteraren lyder:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Detaljer" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "S_täng" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Detaljer kopierade till urklipp" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Acceptera" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "En uppdatering har installerats" +msgstr[1] "Uppdateringar har installerats" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Ett program har avinstallerats" +msgstr[1] "Program har avinstallerats" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "En omstart krävs för att den ska börja gälla" +msgstr[1] "En omstart krävs för att de ska börja gälla" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Inte nu" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "I dag" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "I går" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag sedan" +msgstr[1] "%d dagar sedan" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d vecka sedan" +msgstr[1] "%d veckor sedan" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d månad sedan" +msgstr[1] "%d månader sedan" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d år sedan" +msgstr[1] "%d år sedan" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Just nu" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minut sedan" +msgstr[1] "%d minuter sedan" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d timme sedan" +msgstr[1] "%d timmar sedan" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Alla" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "I blickfånget" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D-grafik" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotografi" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Bildinläsning" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektorgrafik" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Visare" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Skapande & redigering av ljud" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Musikspelare" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Alla" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "I blickfånget" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Kalender" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Databas" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finans" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Ordbehandlare" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Textredigerare" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Webbläsare" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Alla" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "I blickfånget" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Action" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Äventyr" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkad" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Klossar" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Brädspel" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kort" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulatorer" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Barn" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Logik" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rollspel" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategi" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Alla" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "I blickfånget" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chatt" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Alla" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "I blickfånget" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Artificiell intelligens" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomi" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kemi" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Språk" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematik" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Nyheter" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotik" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Konst" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biografi" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Serietidningar" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Skönlitteratur" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Hälsa" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Historia" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Livsstil" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politik" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Alla" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "I blickfånget" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Felsökare" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE-miljöer" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodekar" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Hårdvarudrivrutiner" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Typsnitt" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Inmatningskällor" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Språkpaket" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Lokalisering" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Skapa" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Arbeta" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Spela" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Var social" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Lär dig" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Utveckla" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodekar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Hårdvarudrivrutiner" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Typsnitt" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Inmatningskällor" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Språkpaket" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Lokalisering" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Ett program" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s efterfrågar ytterligare stöd för filformat." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Ytterligare MIME-typer krävs" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s efterfrågar ytterligare typsnitt." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Ytterligare typsnitt krävs" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s efterfrågar ytterligare multimediakodekar." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Ytterligare multimediakodekar krävs" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s efterfrågar ytterligare skrivardrivrutiner." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Ytterligare skrivardrivrutiner krävs" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s efterfrågar ytterligare paket." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Ytterligare paket krävs" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Sök i Programvara" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Visa mer" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Visa mindre" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Ta bort…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Kräver omstart för att slutföra installation" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Kräver omstart för att slutföra borttagning" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Väntar på att installeras…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Väntar på att uppdateras…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Hämtar…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Förbereder…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Avinstallerar…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s är inte installerat men har fortfarande kvar data." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Starta om" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Aktivera…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Installera…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s kommer visas på amerikansk engelska" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Detta program kommer visas på amerikansk engelska" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Denna programvara kommer visas på amerikansk engelska" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Hjälp _till att översätta" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Andra program av %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Utvecklaren %s har bevisat ägarskapet för %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Utvecklaren har bevisat ägarskapet för %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Du behöver vara ansluten till internet för att skriva ett omdöme" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Detta program tar inte längre emot uppdateringar, inklusive säkerhetsfixar" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Detta program tillhandahålls redan av din distribution och bör inte ersättas." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Detta program tillhandahåller inte någon länk till webbplats, kodförråd " +"eller ärendehanteringssystem." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Denna programvara tar inte längre emot uppdateringar, inklusive " +"säkerhetsfixar" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Denna programvara tillhandahålls redan av din distribution och bör inte " +"ersättas." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Denna programvara tillhandahåller inte någon länk till webbplats, kodförråd " +"eller ärendehanteringssystem." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Programvara misslyckades med att erhålla information för ”%s” och kan inte " +"visa detaljerna för detta program." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Ogiltigt omdömessvar erhölls från servern" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Misslyckades med att skicka in omdöme för ”%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Detaljsida" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Läser in programdetaljer" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Verifierad" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "Ö_ppna" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Uppdatera" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Avinstallera" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Tillägg" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Detta program kan endast användas när det finns en fungerande " +"internetanslutning." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Programförråd inkluderat" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Detta program inkluderar ett programförråd som tillhandahåller uppdateringar " +"och tillgång till annan programvara." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Inget programförråd inkluderad" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Detta program inkluderar inget programförråd. Det kommer inte att uppdateras " +"med nya versioner." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Programförråd identifierat" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Att lägga till denna programförråd ger dig tillgång till ytterligare " +"programvara och uppgraderingar." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Använd endast programförråd som du litar på." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Rensa programdata" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "_Ta bort data" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Inga metadata" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Projekt_webbplats" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Donera" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "_Bidra med översättningar" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Rapportera ett ärende" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Hjälp" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontakta" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "Skriv _ett omdöme" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Alla omdömen" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Kunde inte visa programdetaljer" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Misslyckades med att förebereda omstart" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Okänt fel" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Nyckeln kunde inte hittas" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Nyckeln är inte registrerad" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK-registrering krävs" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Nästa" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Denna enhet har Secure Boot aktiverat. För att nya drivrutiner ska aktiveras " +"behöver en ny maskinägarnyckel (MOK) registreras. Processen kräver att ett " +"lösenord matas in senare under processen. Anteckna följande lösenord som är " +"associerat med nyckeln:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Jag har antecknat MOK-_lösenordet" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "Sta_rta om och registrera…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Konfigurationsinstruktioner: läs noggrant" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Efter omstart kommer en konfigurationsskärm för enheten visas. Fortsätt " +"genom konfigurationsstegen för att aktivera nya drivrutiner:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Välj ”Registrera MOK”\n" +"• Välj ”Ja” för att registrera nycklar\n" +"• Mata när du tillfrågas in MOK-lösenordet\n" +"• Välj sedan ”Starta om”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Säkerhetskonsekvenser" + +# TODO: ev "and or" -> "or" +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Efter lyckad nyckelregistrering ska du vara medveten om att alla framtida " +"uppdateringar till modulen eller någon annan modul kommer vara implicit " +"betrodda. Alla framtida uppdateringar kommer hända transparent utan någon " +"interaktion eller auktorisering." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Vidare vägledning kan hittas på dokumentationssidan." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Hämtar extra metadatafiler…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " och " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Tillgängliga typsnitt för skriftspråket %s" +msgstr[1] "Tillgängliga typsnitt för skriftspråken %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Tillgänglig programvara för %s" +msgstr[1] "Tillgängliga programvaror för %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Begärd programvara kunde inte hittas" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Kunde inte hitta begärd programvara" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s kunde inte hittas" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "på webbplatsen" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Inga program finns tillgängliga som tillhandahåller filen %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Information om %s, samt alternativ för hur du införskaffar saknade program " +"kan hittas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Inga program finns tillgängliga för %s-stöd." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s är inte tillgängligt." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Information om %s, samt alternativ för hur du införskaffar ett program som " +"stöder detta format kan hittas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Inga typsnitt som stöder skriftspråket %s finns tillgängliga." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Information om %s, samt alternativ för hur du införskaffar ytterligare " +"typsnitt kan hittas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Inga kodek-tillägg finns tillgängliga för %s-formatet." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Information om %s, samt alternativ för hur du införskaffar en kodek som kan " +"spela detta format kan hittas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Inga Plasma-resurser finns tillgängliga för %s-stöd." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Information om %s, samt alternativ för hur du införskaffar ytterligare " +"Plasma-resurser kan hittas %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Inga skrivardrivrutiner finns tillgängliga för %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Information om %s, samt alternativ för hur du införskaffar en drivrutin som " +"stöder denna skrivare kan hittas %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "dokumentationen" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "%s som begärdes av %s kunde inte hittas. Se %s för mer information." +msgstr[1] "%s som begärdes av %s kunde inte hittas. Se %s för mer information." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "%s som du sökte efter kunde inte hittas. Se %s för mer information." +msgstr[1] "%s som du sökte efter kunde inte hittas. Se %s för mer information." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Kunde inte hitta några sökresultat: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s-filformat" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Installera _alla" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Kan inte hitta begärd programvara" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kodeksida" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Inga resultat hittades" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Kunde inte genomföra sökning" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Föregående" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Nästa" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Lista över program i blickfånget" + +# Stationär + bärbar dator +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Skrivbordsstöd" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Stöder att användas på en stor skärm" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Okänt skrivbordsstöd" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Det saknas information för att kunna veta om stora skärmar stöds" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Kräver en stor skärm" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Skrivbord stöds inte" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Kan inte användas på en stor skärm" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobilstöd" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Stöder att användas på en liten skärm" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Okänt mobilstöd" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Det saknas information för att kunna veta om små skärmar stöds" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Kräver en liten skärm" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobil stöds inte" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Kan inte användas på en liten skärm" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Tangentbordsstöd" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Okänt tangentbordsstöd" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Det saknas information för att kunna veta om skrivbord stöds" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Tangentbord krävs" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Stöder tangentbord" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Tangentbord stöds inte" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Kan inte användas med ett tangentbord" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Musstöd" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Kräver en mus eller ett pekdon" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Okänt musstöd" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "Det saknas information för att kunna veta om möss eller pekdon stöds" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Mus krävs" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Stöder möss och pekdon" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Mus stöds inte" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Kan inte användas med en mus eller ett pekdon" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Pekskärmsstöd" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Okänt pekskärmsstöd" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Det saknas information för att kunna veta om pekskärmar stöds" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Pekskärm krävs" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Stöder pekskärmar" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Pekskärm stöds inte" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Kan inte användas med en pekskärm" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Handkontroll krävs" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Kräver en handkontroll" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Handkontrollsstöd" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Stöder handkontroller" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s fungerar troligen på denna enhet" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s fungerar på denna enhet" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s fungerar kanske på denna enhet" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s kommer inte fungera som det ska på denna enhet" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s kommer inte fungera på denna enhet" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Hårdvarustöd" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigering" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Navigera till sidan Utforska" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Navigera till sidan Installerat" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Navigera till sidan Uppdateringar" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Öppna sökrad" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Fönster" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Öppna inställningar" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Öppna programförråd" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Hjälp" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Öppna tangentbordsgenvägar" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Installerade" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Installerat-sida" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Pågående" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Program" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Webbapplikationer" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Systemprogram" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Gemenskapsbyggd" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Engagera dig" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Detta program utvecklas öppet av en internationell gemenskap, och är släppt " +"under licensen %s.\n" +"\n" +"Du kan bidra och hjälpa till att göra det ännu bättre." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Detta program utvecklas öppet av en internationell gemenskap, och är släppt " +"under licensen %s.\n" +"\n" +"Du kan bidra och hjälpa till att göra det ännu bättre." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Denna programvara utvecklas öppet av en internationell gemenskap, och är " +"släppt under licensen %s.\n" +"\n" +"Du kan bidra och hjälpa till att göra den ännu bättre." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Denna programvara utvecklas öppet av en internationell gemenskap, och är " +"släppt under licensen %s.\n" +"\n" +"Du kan bidra och hjälpa till att göra den ännu bättre." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Okänd licens" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Läs mer" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Detta program anger inte vilken licens det utvecklas under, och kan vara " +"proprietärt. Det kan vara osäkert på sätt som är svåra att upptäcka, och det " +"kan ändras utan att du kan se vad som ändrats.\n" +"\n" +"Du kan kanske, eller kanske inte bidra till detta program." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Denna programvara anger inte vilken licens den utvecklas under, och kan vara " +"proprietär. Den kan vara osäker på sätt som är svåra att upptäcka, och den " +"kan ändras utan att du kan se vad som ändrats.\n" +"\n" +"Du kan kanske, eller kanske inte bidra till denna programvara." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Proprietär" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Detta program utvecklas inte öppet, så endast dess utvecklare vet hur det " +"fungerar. Det kan vara osäkert på sätt som är svåra att upptäcka, och det " +"kan ändras utan att du kan se vad som ändrats.\n" +"\n" +"Du kommer kanske inte kunna bidra till detta program." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Denna programvara utvecklas inte öppet, så endast dess utvecklare vet hur " +"den fungerar. Den kan vara osäker på sätt som är svåra att upptäcka, och den " +"kan ändras utan att du kan se vad som ändrats.\n" +"\n" +"Du kommer kanske inte kunna bidra till denna programvara." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Speciell licens" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Detta program utvecklas under den speciella licensen %s.\n" +"\n" +"Du kan kanske, eller kanske inte bidra till detta program." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Detta program utvecklas under den speciella licensen ”%s”.\n" +"\n" +"Du kan kanske, eller kanske inte bidra till detta program." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Denna programvara utvecklas under den speciella licensen %s.\n" +"\n" +"Du kan kanske, eller kanske inte bidra till denna programvara." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Denna programvara utvecklas under den speciella licensen ”%s”.\n" +"\n" +"Du kan kanske, eller kanske inte bidra till denna programvara." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Uppdaterar data" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Läser in sida" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Startar" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Okänd källa" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Användare" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Tillägg" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Borttagningar" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Uppdateringar" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Nedgraderingar" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "utvalda externa källor" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Ger åtkomst till ytterligare programvara från %s. Viss proprietär " +"programvara har inkluderats.\n" +"\n" +"Du kan aktivera dessa förråd senare i inställningarna för programförråd." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Aktivera programförråd från tredje part?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ignorera" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Aktivera" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Tillgängliga för operativsystemet" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Tillgängliga för %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Utforska" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Översiktssida" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Tillgängliga program" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Andra kategorier" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Inga programdata hittades" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Okänt" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Användaren nekade installation" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Förbered %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Är du säker att du vill ta bort förrådet %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Alla program från %s kommer att avinstalleras, och du måste installera om " +"förrådet för att använda dem igen." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Avinstallera %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Det kommer inte vara möjligt att använda %s efter borttagning." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Det kommer inte vara möjligt att använda program som beror på %s efter " +"borttagning." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Det kommer inte vara möjligt att använda %s efter borttagning, och dokument " +"som använder det kommer visas med ett annat typsnitt." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Det kommer inte vara möjligt att använda %s efter borttagning. Detta kan " +"medföra att vissa mediafiler inte längre kommer kunna spelas upp." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Hårdvara som beror på %s kanske inte längre fungerar korrekt efter " +"borttagning." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Det kommer inte vara möjligt att använda %s efter borttagning. Programdata " +"och inställningar kommer bevaras på disk för att möjliggöra att återställa " +"programmet i framtiden." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Inställningar" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Programvaruuppdateringar" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Mer information" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Att söka och hämta uppdateringar använder data och ström. Automatiska " +"uppdateringsfunktioner är därför pausade på nätverksanslutningar med " +"datakvot och när strömsparare är på." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Automatiska" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Sök och hämta uppdateringar automatiskt" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Manuella" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Att söka och hämta uppdateringar måste göras manuellt" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_Aviseringar för automatiska uppdateringar" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Meddela då uppdateringar har installerats automatiskt" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Innehållsfilter" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Visa endast _fri programvara" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Dölj proprietär programvara vid bläddring och sökning" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Visa endast _verifierade utvecklare" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Visa endast program från utvecklare vars identitet har verifierats" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Installerad programvara är inte kompatibel med %s, och kommer tas bort " +"automatiskt under uppgraderingen." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Inkompatibel programvara" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Uppgradera" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Avinstallera" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Inställningar och data för program" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Behåll" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Tillåter återställande av programinställningar och innehåll" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Ta bort" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Tar permanent bort data för att spara diskutrymme" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Programvara som har installerats från ”%s” kommer inte längre att erhålla " +"uppdateringar." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Inaktivera förråd?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Ta bort förråd?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Inaktivera" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Ta bort" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Aktivera nya förråd" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Slå på nya förråd när de läggs till" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "mer information" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Ytterligare utvalda förråd från tredje part — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Tredjepartsförråd för Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "operativsystemet" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Dessa förråd kompletterar den standardprogramvara som tillhandahålls av %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Programförråd" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Inga förråd" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u program installerat" +msgstr[1] "%u program installerade" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u tillägg installerat" +msgstr[1] "%u tillägg installerade" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u program" +msgstr[1] "%u program" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u tillägg" +msgstr[1] "%u tillägg" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s och %s installerade" +msgstr[1] "%s och %s installerade" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Kontrollerar installerad programvara…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Ta bort" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Hatar det" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Tycker inte om det" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Det är OK" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Tycker om det" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Älskar det" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Välj en stjärna för att lämna ett betyg" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Ta mer tid på dig att skriva omdömet" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Välj ett stjärnbetyg" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Sammanfattningen är för kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Sammanfattningen är för lång" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Beskrivningen är för kort" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Beskrivningen är för lång" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Skriv ett omdöme" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Skicka" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Tillhandahåll ett betyg, sammanfattning och recension. Recensioner ska inte " +"användas för att rapportera problem: kontakta i stället utvecklaren eller " +"din supportkontakt." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Sammanfattning av omdöme" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Skriv ett kort omdöme" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Se vilka data som skickas i vår sekretesspolicy. Det fullständiga namnet som är kopplat till " +"ditt konto kommer att visas offentligt." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u recension totalt" +msgstr[1] "%u recensioner totalt" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "av 5 stjärnor" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Okänt" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Du kan rapportera omdömen för kränkande, oförskämt eller diskriminerande " +"beteende." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"När det är rapporterat kommer omdömet att döljas tills det har kontrollerats " +"av en administratör." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Rapportera omdöme?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Rapportera" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Ta bort omdöme?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Borttagande av ett omdöme kan inte göras ogjort." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Gilla omdöme" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Ogilla omdöme" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Rapportera…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Ta bort…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Programmet körs inte i sandlåda men distributionen har kontrollerat att det " +"inte är skadligt" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Kontrollera att du litar på leverantören, eftersom programmet inte körs i " +"sandlåda" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Ingen behörighet" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Programmet körs fullständigt i sandlåda" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Nätverksåtkomst" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Kan ansluta till internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Ingen nätverksåtkomst" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Kan inte ansluta till internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Använder systemtjänster" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Kan begära data från systemtjänster" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Använder sessionstjänster" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Kan begära data från sessionstjänster" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Åtkomst till användarenheter" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Kan komma åt enheter som webbkameror eller spelkontroller" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Ingen åtkomst till användarenheter" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Kan inte komma åt enheter som webbkameror eller spelkontroller" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Åtkomst till inmatningsenheter" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Åtkomst till mikrofon och ljuduppspelning" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "Kan lyssna på mikrofoner och spela upp ljud utan att be om tillåtelse" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Åtkomst till systemenheter" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "Kan komma åt systemenheter som kräver höjda behörigheter" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Åtkomst till skärminnehåll" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Kan komma åt innehållet på skärmen eller andra fönster" + +# Det är X11 som avses +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Gammalt fönstersystem" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Godtyckliga behörigheter" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Användarinställningar" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Läs/skrivåtkomst för hela filsystemet" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Kan läsa och skriva alla data på filsystemet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Läs/skrivåtkomst för hemmapp" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Kan läsa och skriva alla data i din hemkatalog" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Läsåtkomst för hela filsystemet" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Kan läsa alla data på filsystemet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Läsåtkomst för hemmapp" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Kan läsa alla data i din hemkatalog" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Läs/skrivåtkomst för hämtningsmapp" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Kan läsa och skriva alla data i din hämtningskatalog" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Läsåtkomst för hämtningsmapp" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Kan läsa alla data i din hämtningskatalog" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Kan läsa och skriva alla data i katalogen" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Kan läsa alla data i katalogen" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Ingen filsystemsåtkomst" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Kan inte komma åt filsystemet alls" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Programmets utvecklare har verifierats" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Utvecklaren av detta program har bekräftats vara den de påstår sig vara" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Osäkra beroenden" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Programvaran eller dess beroenden stöds inte längre och kan vara osäker" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Detta program anger inte vilken licens det utvecklas under, och kan vara " +"proprietärt" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Denna programvara anger inte vilken licens den utvecklas under, och kan vara " +"proprietär" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Proprietär kod" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Källkoden är inte offentlig, så oberoende granskning kan inte utföras och " +"koden kan vara osäker" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Detta program utvecklas under den speciella licensen ”%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Denna programvara utvecklas under den speciella licensen ”%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Granskningsbar kod" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Källkoden är offentlig, så oberoende granskning kan utföras, vilket gör " +"programmet mer troligt att vara säkert" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s är privilegierat" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s är säkert" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s är troligen säkert" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s är potentiellt osäkert" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s är osäkert" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Okänd" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Säkerhet" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Licens" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Källa" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Detta program använder en gammal version av programplattformen (SDK) och kan " +"innehålla fel eller säkerhetssårbarheter som inte kommer fixas." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Föregående skärmbild" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Nästa skärmbild" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Inga skärmbilder" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Skärmbild kunde inte hittas" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Misslyckades med att läsa in bild" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Skärmbildsstorlek kunde inte hittas" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Kunde inte skapa katalog för temporärlagring" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Skärmbilden är ogiltig" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Skärmbilden inte tillgänglig" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Skärmbild" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u träff till" +msgstr[1] "%u träffar till" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Söksida" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Sök efter program" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Inget program hittades" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "”%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Kunde inte hämta uppdateringar" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Kunde inte hämta uppdateringar för fast programvara" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Kunde inte hämta uppdateringar för fast programvara från %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Kunde inte hämta uppdateringar från %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Kunde inte uppdatera: internetåtkomst krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Kunde inte uppdatera: för lite diskutrymme" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Kunde inte hämta uppdateringar %s: för lite diskutrymme" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Kunde inte uppdatera: autentisering krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Kunde inte uppdatera: ogiltig autentisering" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Kunde inte uppdatera: behörighet krävs" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Kunde inte hämta uppdateringar: du har inte behörighet att installera " +"programvara" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Kunde inte hämta lista över uppdateringar" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Kunde inte installera: hämtning misslyckades" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Kunde inte installera %s: hämtning misslyckades från %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Kunde inte installera %s: hämtning misslyckades" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Kunde inte installera: exekveringsmiljö saknas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Kunde inte installera %s: exekveringsmiljön %s är ej tillgänglig" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Kunde inte installera %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Kunde inte installera: internetåtkomst krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Kunde inte installera: ogiltigt programformat" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Kunde inte installera: för lite diskutrymme" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Kunde inte installera %s: för lite diskutrymme" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Kunde inte installera: autentisering krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Kunde inte installera %s: autentisering krävs" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Kunde inte installera: ogiltig autentisering" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Kunde inte installera %s: ogiltig autentisering" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Kunde inte installera: behörighet krävs" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Kunde inte installera %s: behörighet krävs" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Kunde inte installera: enheten måste vara inkopplad" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Kunde inte installera %s: enheten måste vara inkopplad" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Kunde inte installera: låg batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Kunde inte installera %s: låg batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Kunde inte uppdatera %s från %s: hämtning misslyckades" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Kunde inte uppdatera %s: hämtning misslyckades" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Kunde inte installera uppdateringar från %s: hämtning misslyckades" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Kunde inte uppdatera: hämtning misslyckades" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Kunde inte uppdatera %s: för lite diskutrymme" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Kunde inte uppdatera %s: autentisering krävs" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Kunde inte uppdatera %s: ogiltig autentisering" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Kunde inte uppdatera %s: behörighet krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Kunde inte uppdatera: enheten måste vara inkopplad" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Kunde inte uppdatera %s: enheten måste vara inkopplad" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Kunde inte uppdatera: låg batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Kunde inte uppdatera %s: låg batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Kunde inte uppdatera %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Kunde inte uppdatera" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Kunde inte uppgradera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Kunde inte uppgradera till %s från %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Kunde inte uppgradera: hämtning misslyckades" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Kunde inte uppgradera till %s: hämtning misslyckades" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Kunde inte uppgradera: internetåtkomst krävs" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Kunde inte uppgradera till %s: internetåtkomst krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Kunde inte uppgradera: för lite diskutrymme" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Kunde inte uppgradera till %s: för lite diskutrymme" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Kunde inte uppgradera: autentisering krävs" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Kunde inte uppgradera till %s: autentisering krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Kunde inte uppgradera: ogiltig autentisering" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Kunde inte uppgradera till %s: ogiltig autentisering" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Kunde inte uppgradera: behörighet krävs" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Kunde inte uppgradera till %s: behörighet krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Kunde inte uppgradera: enheten måste vara inkopplad" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Kunde inte uppgradera till %s: enheten måste vara inkopplad" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Kunde inte uppgradera: låg batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Kunde inte uppgradera till %s: låg batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Kunde inte uppgradera till %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Kunde inte avinstallera: autentisering krävs" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Kunde inte avinstallera %s: autentisering krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Kunde inte avinstallera: ogiltig autentisering" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Kunde inte avinstallera %s: ogiltig autentisering" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Kunde inte avinstallera: behörighet krävs" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Kunde inte avinstallera %s: behörighet krävs" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Kunde inte avinstallera: enheten måste vara inkopplad" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Kunde inte avinstallera %s: enheten måste vara inkopplad" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Kunde inte avinstallera: låg batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Kunde inte avinstallera %s: låg batterinivå" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Kunde inte avinstallera %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Kunde inte starta %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Något gick tyvärr fel" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Kunde inte köra %s: %s har inte installerats" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "För lite diskutrymme för åtgärden" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Kunde inte installera: filtypen stöds inte" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Kunde inte installera: autentisering misslyckades" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Kunde inte installera" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Kunde inte kontakta %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Starta om Programvara för att använda nya insticksmoduler" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Enheten måste vara inkopplad" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Batterinivån är för låg" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Programförråd" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Inställningar" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Tangentbordsgenvägar" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Om Programvara" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Sök" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Huvudmeny" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Sök program" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Utforska" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Installerat" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Uppdateringar" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Gå bakåt" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Ingen" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Programdata" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Data som behövs för att programmet ska kunna köras" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Användardata" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Data skapade av dig i programmet" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Cachedata" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Tillfälligt cachade data" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Själva programmet" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Beroenden som krävs" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Delade systemkomponenter som krävs av detta program" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Okänd" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Cachade data kan rensas från _programinställningar" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Lagring" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Installerad)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Installerar)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (hämtar)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Tar bort)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Detaljer" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Undersök" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Installerade på %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Installerade uppdateringar" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Inga uppdateringar installerade" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Uppdateringar är inaktuella" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Sök efter tillgängliga uppdateringar" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Kritiska uppdateringar är redo att installeras" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Installera kritiska uppdateringar så snart som möjligt" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Kritiska uppdateringar tillgängliga för hämtning" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Hämta kritiska uppdateringar så snart som möjligt" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Uppdateringar är redo att installeras" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Programvaruuppdateringar är redo och väntar" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Uppdateringar tillgängliga för hämtning" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Programvaruuppdateringar kan hämtas" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u program uppdaterades — Omstart krävs" +msgstr[1] "%u program uppdaterades — Omstart krävs" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u program uppdaterades" +msgstr[1] "%u program uppdaterades" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s har uppdaterats." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Starta om programmet." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s och %s har uppdaterats." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u program kräver en omstart." +msgstr[1] "%u program kräver en omstart." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Inkluderande %s, %s och %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Systemet har nått slutet på sin livstid" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Uppgradera för att fortsätta ta emot säkerhetsuppdateringar" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "En ny version av %s finns tillgänglig att installera" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Programvaruuppgradering tillgänglig" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Programvaruuppdatering misslyckades" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Förberedda uppdateringar installerades inte" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Visa detaljer" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Systemuppgradering slutförd" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Välkommen till %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Programvaruuppdatering installerad" +msgstr[1] "Programvaruuppdateringar installerade" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "En viktig uppdatering av operativsystemet har installerats." +msgstr[1] "Viktiga uppdateringar av operativsystemet har installerats." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Granska" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Misslyckades med att uppdatera" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Systemet var redan uppdaterat." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Uppdateringen avbröts." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Internetåtkomst krävdes men fanns inte tillgänglig. Försäkra dig om att du " +"har internetåtkomst och försök igen." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Det fanns säkerhetsproblem med uppdateringen. Konsultera din " +"programvaruleverantör för mer detaljer." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Det fanns inte tillräckligt diskutrymme. Frigör utrymme och försök igen." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Uppdateringen gick tyvärr inte att installera. Vänta på ännu en uppdatering " +"och försök igen. Kontakta din programvaruleverantör om problemet kvarstår." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Senaste sökning: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Stoppa" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Sök efter uppdateringar" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s har slutat ta emot kritiska programvaruuppdateringar" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Ditt operativsystem har slutat ta emot kritiska programvaruuppdateringar" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Kostnader kan tillkomma" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Att söka efter uppdateringar via mobilt bredband kan medföra kostnader." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Sök ändå" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Programvaruuppgraderingar hämtades" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Uppgraderingar är redo att installeras" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Sök efter tillgängliga uppdateringar" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Uppdateringar" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Uppdateringssida" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Läser in uppdateringar" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Detta kan ta ett tag" + +# Texten som ses i https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1388 +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Uppdaterat" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Använd mobildata?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "Att söka efter uppdateringar via mobilt bredband kan medföra kostnader" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Kontrollera ändå" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Ingen anslutning" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Anslut till nätverk för att söka efter uppdateringar" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "_Nätverksinställningar" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Fel" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Uppdateringar hanteras automatiskt" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Programvaruuppdateringar pausade" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Automatiska programvaruuppdateringar har pausats av följande orsaker:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Den aktuella nätverksanslutningen har datakvoter" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Den aktuella nätverksanslutningen förbjuder stora hämtningar" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Strömsparläge är aktivt" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Spelläge är aktivt" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Programvaruuppdateringar pausade" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Nätverksanslutningen har datakvoter — programvaruuppdateringar pausade" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Nätverksanslutningen förbjuder stora hämtningar — programvaruuppdateringar " +"pausade" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Strömsparläge är aktivt — programvaruuppdateringar pausade" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Spelläge är aktivt — programvaruuppdateringar pausade" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "Starta _om & uppdatera…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "U_ppdatera alla" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Programvaruuppdateringar hämtades" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Uppdateringar är redo att installeras" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integrerad fast programvara" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Kräver omstart" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Programuppdateringar" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Fast programvara för enheter" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Hämta" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s finns nu tillgänglig" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s tillgängligt" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Lär dig mer om den nya versionen" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s of %s hämtade" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% hämtat" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "En större uppgradering, bättre polerad och med nya funktioner." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Avbryt uppgradering" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "Starta _om & uppgradera…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Kom ihåg att säkerhetskopiera data och filer innan uppgradering." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Feldetaljer" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Kopiera detaljer" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Misslyckades med att ta bort filen ”%s”: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Misslyckades med att ta bort katalogen ”%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Lägg till, ta bort eller uppdatera programvara på denna dator" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "Uppdateringar;Uppgradera;Källor;Programvarukällor;Inställningar;Installera;Avinstallera;Program;Programvara;Mjukvara;Butik;App;Store;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s klar" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s är redo att aktiveras och iordningsställas för nästa uppstart." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Aktivera" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Systemuppdateringar" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Allmänna systemuppdateringar, såsom säkerhets- eller felfixar, samt " +"prestandaförbättringar." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s-uppdatering med nya funktioner och fixar." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS-uppdateringstjänsten kunde inte hämta och tillämpa uppdateringen." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Webbapplikation" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Stöd för webbapplikationer" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Kör populära webbapplikationer i en webbläsare" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Uppgradera för att få de senaste funktionerna och förbättringarna vad gäller " +"prestanda och stabilitet." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak-stöd" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak är ett ramverk för skrivbordsprogram på Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:361 +#, c-format +msgid "System folder %s" +msgstr "Systemmapp %s" + +#: plugins/flatpak/gs-flatpak.c:362 plugins/flatpak/gs-flatpak.c:363 +#, c-format +msgid "Home subfolder %s" +msgstr "Hemundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system folders" +msgstr "Värdsystemmappar" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Host system configuration from /etc" +msgstr "Värdsystemkonfiguration från /etc" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Desktop folder" +msgstr "Skrivbordsmapp" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Skrivbordsundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Documents folder" +msgstr "Dokumentmapp" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Documents subfolder %s" +msgstr "Dokumentundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Music folder" +msgstr "Musikmapp" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Music subfolder %s" +msgstr "Musikundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Pictures folder" +msgstr "Bildmapp" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Bildundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Public Share folder" +msgstr "Delningsmapp" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Delningsundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Videos folder" +msgstr "Videomapp" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videoundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "Templates folder" +msgstr "Mallmapp" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "Templates subfolder %s" +msgstr "Mallundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User cache folder" +msgstr "Användarcachemapp" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User cache subfolder %s" +msgstr "Användarcacheundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User configuration folder" +msgstr "Användarkonfigurationsmapp" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Användarkonfigurationsundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User data folder" +msgstr "Användardatamapp" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User data subfolder %s" +msgstr "Användardataundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:376 +msgid "User runtime folder" +msgstr "Användarkörningsmapp" + +#: plugins/flatpak/gs-flatpak.c:376 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Användarkörningsundermapp %s" + +#: plugins/flatpak/gs-flatpak.c:434 +#, c-format +msgid "Filesystem access to %s" +msgstr "Filsystemsåtkomst till %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1387 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Hämtar flatpak-metadata för %s…" + +#: plugins/flatpak/gs-flatpak.c:3613 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Misslyckades med att förfina tillägget ”%s”: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Användarinstallation" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Systeminstallation" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Program-ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Misslyckades med att lägga till tillägget ”%s” till installation: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Misslyckades med att lägga till tillägget ”%s” till avinstallation: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Fjärren ”%s” tillåter inte installation av ”%s”, möjligen på grund av dess " +"filter. Ta bort filtret och upprepa installationen. Detaljerat fel: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Systemet har för lite batteri för att utföra uppdateringen" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Systemet har för lite batteri för att utföra uppdateringen (%u%%, behöver " +"%u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Enheten kan inte nås, eller är utanför den trådlösa räckvidden" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Enheten har för lite batteri" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Enheten har för lite batteri (%u%%, behöver %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Enheten väntar på att uppdateringen ska tillämpas" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Enheten behöver vara ansluten till nätspänning" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Enheten kan inte användas när locket är stängt" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s-enhetsuppdatering" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s-systemuppdatering" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s inbäddad styrenhetsuppdatering" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME-uppdatering" + +# Behandlar det som ett namn då namnsättningen verkar vara starkt förknippad med Intel +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s Corporate ME-uppdatering" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s Consumer ME-uppdatering" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s-styrenhetsuppdatering" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt-styrenhetsuppdatering" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU-mikrokodsuppdatering" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s-konfigurationsuppdatering" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s-batteriuppdatering" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s-kamerauppdatering" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM-uppdatering" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s-pekplatteuppdatering" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s-musuppdatering" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s-tangentbordsuppdatering" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s-lagringsstyrenhetsuppdatering" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s-nätverksgränssnittsuppdatering" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s-skärmuppdatering" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC-uppdatering" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB-mottagaruppdatering" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s-enhetsuppdatering" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s-flashenhetsuppdatering" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD-uppdatering" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU-uppdatering" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s-dockuppdatering" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB-dockuppdatering" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Fast programvara" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Uppdatering av fast programvara kunde inte tillämpas: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Stöd för uppgradering av fast programvara" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Tillhandahåller stöd för uppgradering av fast programvara" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Installera osignerad programvara?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Programvara som ska installeras är inte signerad. Det kommer inte att vara " +"möjligt att verifiera ursprunget till uppdateringar av denna programvara, " +"eller om uppdateringar har manipulerats." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Hämta osignerad programvara?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Osignerade uppdateringar är tillgängliga. Utan en signatur är det inte " +"möjligt att verifiera ursprunget till uppdateringen, eller om den har " +"manipulerats." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Uppdatera osignerad programvara?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Osignerade uppdateringar är tillgängliga. Utan en signatur är det inte " +"möjligt att verifiera ursprunget till uppdateringen, eller om den har " +"manipulerats. Programuppdateringar kommer att inaktiveras tills osignerade " +"uppdateringar antingen tas bort eller uppdateras." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Misslyckades med att installera uppdateringar: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paket" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Misslyckades med att vänta på transaktionens slut innan hämtning: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Misslyckades med att hämta uppdateringar: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Misslyckades med att utlösa uppdatering: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Operativsystem (OSTree)" + +# Ägarna verkar vilja behandla det som ett namn om inte ordet store är helt okänt. https://forum.snapcraft.io/t/dont-translate-snap-store-name/11894 +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap-stöd" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "En snap är ett universellt Linuxpaket" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:774 +msgid "System" +msgstr "System" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:778 +msgid "System component" +msgstr "Systemkomponent" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1029 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "" +"Borttagning av systemuppdateringsjobbet ”%s” misslyckades med status %i" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Var detta omdöme användbart för dig?" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgid "No" +#~ msgstr "Nej" + +#~ msgid "_app settings" +#~ msgstr "_programinställningarna" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Operativsystemsuppdateringar ej tillgängliga" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "" +#~ "Misslyckades med att installera en viktig uppdatering av operativsystemet." + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Programvaruuppgraderingar har hämtats och är redo att installeras." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Programvaruuppdateringar har hämtats och är redo att installeras." + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Kunde inte hitta ”%s”" + +#~ msgid "Moderate page" +#~ msgstr "Modereringssida" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Det finns inga omdömen att moderera" + +#~ msgid "Meh" +#~ msgstr "Bah" + +#~ msgid "No Network" +#~ msgstr "Inget nätverk" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Internetförbindelse krävs för att söka efter uppdateringar." + +#~ msgid "Network _Settings" +#~ msgstr "Nätverks_inställningar" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Ett trevligt sätt att hantera programvaran på ditt system." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Ange ett tal från 1 till %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Välj ett program:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s har installerats" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Ett program har tagits bort" +#~ msgstr[1] "Program har tagits bort" + +#~ msgid "Outdated SDK version" +#~ msgstr "Föråldrad SDK-version" + +#~ msgid "Unable to install updates" +#~ msgstr "Kunde inte installera uppdateringar" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Kunde inte avinstallera: ogiltig autentisering" + +#~ msgid "Network Settings" +#~ msgstr "Nätverksinställningar" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Hämtar uppgraderingsinformation…" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Hämtar programvarukatalog" + +#, c-format +#~| msgid "%s %s" +#~ msgid "%s %s %s" +#~ msgstr "%s %s %s" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "En viktig programvaruuppdatering är redo att installeras." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Viktigt: kritiska programvaruuppdateringar väntar." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Hämta väntande programvaruuppdateringar." + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Vad tyckte du om programmet? Om du lämnar din återkoppling samt " +#~ "anledningen till omdömet så hjälper det andra." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Automatiska uppdateringar pausade" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Aktuellt nätverk har datakvot vilket kan medföra datagränser eller " +#~ "kostnader. För att spara data har automatisk uppdatering pausats.\n" +#~ "\n" +#~ "Ändra detta i Inställningar om nätverket felaktigt identifierats som att " +#~ "ha datakvoter." + +#~ msgid "Open Network _Settings" +#~ msgstr "Öppna nätverks_inställningar" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Nätverk med datakvot ‒ automatiska uppdateringar pausade" + +#~ msgid "Find Out _More" +#~ msgstr "Lär dig _mer" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Kunde inte hämta uppdateringar: internetanslutning krävdes men var inte " +#~ "tillgänglig" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Kunde inte hämta uppdateringar: för lite diskutrymme" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Kunde inte hämta uppdateringar: autentisering krävdes" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Kunde inte hämta uppdateringar: autentiseringen var ogiltig" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "" +#~ "Kunde inte installera %s: du har inte behörighet att installera " +#~ "programvara" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Kunde inte installera %s: Batterinivån är för låg" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Kunde inte installera uppdateringar: för lite diskutrymme" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Kunde inte installera uppdateringar: autentisering krävdes" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Kunde inte installera uppdateringar: autentiseringen var ogiltig" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "" +#~ "Kunde inte uppdatera %s: du har inte behörighet att uppdatera programvara" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Kunde inte installera uppdateringar: du har inte behörighet att uppdatera " +#~ "programvara" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Kunde inte installera uppdateringar: nätspänning krävs" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Kunde inte uppdatera %s: Batterinivån är för låg" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Kunde inte installera uppdateringar: Batterinivån är för låg" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Kunde inte uppgradera till %s: internetanslutning krävdes men var inte " +#~ "tillgänglig" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "" +#~ "Kunde inte uppgradera till %s: du har inte behörighet att uppgradera" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Kunde inte uppgradera till %s: Batterinivån är för låg" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Kunde inte ta bort %s: autentisering krävdes" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Kunde inte ta bort %s: autentiseringen var ogiltig" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "" +#~ "Kunde inte ta bort %s: du har inte behörighet att ta bort programvara" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Kunde inte ta bort %s: nätspänning krävs" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Kunde inte ta bort %s: Batterinivån är för låg" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Kunde inte ta bort %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Misslyckades med att installera fil: stöds inte" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Misslyckades med att installera: stöds inte" + +#~ msgid "AC power is required" +#~ msgstr "Nätspänning krävs" + +#~ msgid "Explore Pages" +#~ msgstr "Utforska sidor" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "För att undvika kostnader och nätverksbegränsningar hämtas " +#~ "programvaruuppdateringar inte automatiskt vid mobilanslutning eller " +#~ "anslutningar med datakvoter." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Hämtar och installerar programvaruuppdateringar i bakgrunden när möjligt" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Visa endast _fria program" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "Visa endast program med fri licens och dölj proprietära program" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "Läser in beskrivning för uppdatering, vänta…" + +#~ msgid "Downloading featured images…" +#~ msgstr "Hämtar bilder i blickfånget…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Visa utökad felsökningsinformation" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Kan komma åt godtyckliga filer" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Är du säker på att du vill avinstallera %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s kommer att avinstalleras, och du måste installera det för att använda " +#~ "det igen." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Den sista tidsstämpeln då systemet var anslutet och erhöll uppdateringar" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Valda tillägg kommer att installeras med programmet." + +#~ msgid "Post Review" +#~ msgstr "Skicka omdöme" + +#~ msgid "_Post" +#~ msgstr "_Skicka" + +#~ msgid "No screenshot provided" +#~ msgstr "Ingen skärmbild tillhandahållen" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Denna programvara finns inte tillgänglig på ditt språk och kommer visas " +#~ "på amerikansk engelska." + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Uppdateringar" + +#~ msgid "Refresh" +#~ msgstr "Uppdatera" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s stöds inte längre." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Detta betyder att det inte erhåller säkerhetsuppdateringar." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Du rekommenderas att nu uppgradera till en senare version." + +#~ msgid "Update All" +#~ msgstr "Uppdatera alla" + +#~ msgid "An application" +#~ msgstr "Ett program" + +#~ msgid "Applications" +#~ msgstr "Program" + +#~ msgid "Web Applications" +#~ msgstr "Webbapplikationer" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u program" +#~ msgstr[1] "%u program" + +#~ msgid "Rating" +#~ msgstr "Betyg" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Ge en kort sammanfattning av ditt omdöme, t.ex. ”Bra program, " +#~ "rekommenderas”." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Omdöme" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Vad tycker du om programmet? Försök att ge skäl till dina åsikter." + +#~ msgid "Primary Menu" +#~ msgstr "Primär meny" + +#~ msgid "Application Updates" +#~ msgstr "Programuppdateringar" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "_Continue" +#~ msgstr "_Fortsätt" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Webb" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Inga uppdateringar har installerats på detta system." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Programhanterare för GNOME" + +#~ msgid "Name" +#~ msgstr "Namn" + +#~ msgid "user" +#~ msgstr "användare" + +#~ msgid "Channel" +#~ msgstr "Kanal" + +#~ msgid "Branch" +#~ msgstr "Gren" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Installation" + +#~ msgid "Version" +#~ msgstr "Version" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Programvarukatalog hämtas" + +#~ msgid "A list of popular applications" +#~ msgstr "En lista över populära program" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "En lista över program att använda, som åsidosätter de som definieras av " +#~ "systemet." + +#~ msgid "Checking…" +#~ msgstr "Söker…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Läser in…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Hämtar omdömen för program…" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "URI:n som hänvisar till bakgrunden för en uppgraderingsbanderoll." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URI:n kan innehålla upp till tre ”%u”, vilka kommer ersättas med " +#~ "uppgraderingsversionen." + +#~ msgid "GNOME Software" +#~ msgstr "GNOME Programvara" + +#~ msgid "Welcome" +#~ msgstr "Välkommen" + +#~ msgid "Welcome to Software" +#~ msgstr "Välkommen till Programvara" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Programvara låter dig installera alla programvaror du behöver, allt från " +#~ "ett ställe. Se våra rekommendationer, bläddra i kategorierna, eller sök " +#~ "efter de program du vill ha." + +#~ msgid "_Browse Software" +#~ msgstr "_Bläddra bland programvara" + +#~ msgid "_Add shortcut" +#~ msgstr "_Lägg till genväg" + +#~ msgid "Re_move shortcut" +#~ msgstr "_Ta bort genväg" + +#~ msgid "OS Updates" +#~ msgstr "Systemuppdateringar" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Innehåller prestanda-, stabilitets- och säkerhetsförbättringar." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Hämtar signatur för uppdatering till fast programvara…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Hämtar metadata för uppdatering till fast programvara…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Programvaran har okända behörigheter" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Programvaran kommer från en betrodd källa" + +#~ msgid "Unknown Permissions" +#~ msgstr "Okända behörigheter" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Behörigheterna som detta program behöver är okända" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Programmet kommer från en betrodd källa" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "Din distribution har bekräftat att detta program är pålitligt" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "Ej optimerad för pekenheter eller telefoner" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Visa prompten för att installera icke-fria programförråd" + +#~ msgid "Editor’s Picks" +#~ msgstr "Redaktionens val" + +#~ msgid "Recently Updated" +#~ msgstr "Senast Uppdaterade" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgid "Audio & Video" +#~ msgstr "Ljud & video" + +#~ msgid "Developer Tools" +#~ msgstr "Utvecklarverktyg" + +#~ msgid "Education & Science" +#~ msgstr "Utbildning & vetenskap" + +#~ msgid "Games" +#~ msgstr "Spel" + +#~ msgid "Graphics & Photography" +#~ msgstr "Grafik & fotografi" + +#~ msgid "Productivity" +#~ msgstr "Produktivitet" + +#~ msgid "Communication & News" +#~ msgstr "Kommunikation & nyheter" + +#~ msgid "Utilities" +#~ msgstr "Verktyg" + +#~ msgid "_Read Less" +#~ msgstr "_Läs mindre" + +#~ msgid "_Launch" +#~ msgstr "_Starta" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Kan inte avgöra vilka delar av systemet som detta program har åtkomst " +#~ "till. Detta är typiskt för äldre program." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Aldrig" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Låg" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Medel" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Hög" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Okänd" + +#~ msgid "Public domain" +#~ msgstr "Allmän egendom" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Användare är bundna till följande licens:" +#~ msgstr[1] "Användare är bundna till följande licenser:" + +#~ msgid "Localized in your Language" +#~ msgstr "Lokalanpassad enligt ditt språk" + +#~ msgid "Release Activity" +#~ msgstr "Publiceringsaktivitet" + +#~ msgid "Sandboxed" +#~ msgstr "I sandlåda" + +#~ msgid "Category" +#~ msgstr "Kategori" + +#~ msgid "Free" +#~ msgstr "Fri" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Okänd" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Detta betyder att programvaran fritt kan köras, kopieras, distribueras, " +#~ "studeras och ändras." + +#~ msgid "Proprietary Software" +#~ msgstr "Proprietär programvara" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Detta innebär att programvaran ägs av en individ eller ett företag. Det " +#~ "finns ofta restriktioner på dess användning och dess källkod är " +#~ "vanligtvis inte åtkomlig." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Licensvillkoren för denna programvara är okända." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Programmet fick denna klassificering eftersom det innehåller:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Inga detaljer fanns tillgängliga för denna klassificering." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Avinstallerad" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Installerad" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Uppdaterad" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Okänt" + +#~ msgid "History" +#~ msgstr "Historik" + +#~ msgid "More…" +#~ msgstr "Mer…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Rekommenderade ljud- & videoprogram" + +#~ msgid "Recommended Games" +#~ msgstr "Rekommenderade Spel" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Rekommenderade grafikprogram" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Rekommenderade produktivitetsprogram" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Delar av denna programvara är proprietär och har därför restriktioner vad " +#~ "gäller användning, delning och åtkomst till källkod." + +#~ msgid "Find out more…" +#~ msgstr "Lär dig mer…" + +#~ msgid "Recent Releases" +#~ msgstr "Senaste utgåvor" + +#~ msgid "Remove “%s”?" +#~ msgstr "Ta bort ”%s”?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Inaktivera ”%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Inga ytterligare förråd" + +#~ msgid "_Remove…" +#~ msgstr "_Ta bort…" + +#~ msgid "_Disable…" +#~ msgstr "_Inaktivera…" + +#~ msgid "Disabling" +#~ msgstr "Inaktiverar" + +#~ msgid "Enabled" +#~ msgstr "Aktiverat" + +#~ msgid "Disabled" +#~ msgstr "Inaktiverat" + +#~ msgid "ratings in total" +#~ msgstr "totalt antal omdömen" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (kräver åtgärd)" + +#~ msgid "_Remove All" +#~ msgstr "_Ta bort alla" + +#~ msgid "Looking for new updates…" +#~ msgstr "Letar efter nya uppdateringar…" + +#~ msgid "Setting up updates…" +#~ msgstr "Förbereder uppdateringar…" + +#~ msgid "Software is up to date" +#~ msgstr "Programvara är uppdaterad" + +#~ msgid "_Restart Now" +#~ msgstr "Sta_rta om nu" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Uppdateringar kommer att tillämpas då datorn startas om." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Väntar på att hämta %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Hämtar %s %s" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS är en tjänst som tillhandahåller användaromdömen av program" + +#~ msgid "Featured %s" +#~ msgstr "%s i blickfånget" + +#~ msgid "Show" +#~ msgstr "Visa" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Filtermeny för underkategorier" + +#~ msgid "Sort" +#~ msgstr "Sortera" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Sorteringsmeny för underkategorier" + +#~ msgid "Select All" +#~ msgstr "Markera allt" + +#~ msgid "Select None" +#~ msgstr "Avmarkera allt" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Tecknade figurer i farliga situationer" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Tecknade figurer i aggressiv konflikt" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Våldsskildring som involverar tecknade figurer" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Figurer i farliga situationer lätt åtskiljbara från verkligheten" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Figurer i aggressiv konflikt lätt åtskiljbar från verkligheten" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Våldsskildring lätt åtskiljbar från verkligheten" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Någorlunda realistiska figurer i farliga situationer" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Skildringar av realistiska figurer i aggressiv konflikt" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Våldsskildring som involverar realistiska figurer" + +#~ msgid "No bloodshed" +#~ msgstr "Ingen blodsutgjutelse" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Orealistisk blodsutgjutelse" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Realistisk blodsutgjutelse" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Skildringar av blodsutgjutelse och lemlästning" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Våldtäkt eller annat våldsamt sexuellt beteende" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Referenser till alkoholhaltiga drycker" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Användning av alkoholhaltiga drycker" + +#~ msgid "References to illicit drugs" +#~ msgstr "Referenser till illegala droger" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Användning av illegala droger" + +#~ msgid "References to tobacco products" +#~ msgstr "Referenser till tobaksprodukter" + +#~ msgid "Use of tobacco products" +#~ msgstr "Användning av tobaksprodukter" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Kortvarig konstnärlig nakenhet" + +#~ msgid "Prolonged nudity" +#~ msgstr "Långvarig nakenhet" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Provokativa referenser eller skildringar" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Sexuella referenser eller skildringar" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Skildring av sexuellt beteende" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Milda eller tillfälligt förekommande svordomar" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Måttlig användning av svordomar" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Grova eller ofta förekommande svordomar" + +#~ msgid "Slapstick humor" +#~ msgstr "Slapstickhumor" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Vulgär humor eller badrumshumor" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Mogen eller sexuell humor" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Negativ inställning mot en specifik folkgrupp" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Diskriminering avsedd att orsaka emotionell smärta" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Explicit diskriminering baserad på kön, sexuell läggning, ras eller " +#~ "religion" + +#~ msgid "Product placement" +#~ msgstr "Produktplacering" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Explicita referenser till specifika varumärken eller varumärkesskyddade " +#~ "produkter" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Användare uppmanas att köpa specifika föremål i verkliga världen" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Spel på slumpbaserade händelser med marker eller poäng" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Spel med låtsaspengar" + +#~ msgid "Gambling using real money" +#~ msgstr "Spel med riktiga pengar" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Användare uppmanas att skänka riktiga pengar" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Möjlighet att spendera riktiga pengar i programmet" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Interaktion mellan användare utan chattfunktion" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Modererad chattfunktion mellan användare" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Okontrollerad ljud- eller videochattfunktion mellan användare" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Delning av e-postadresser eller användarnamn på sociala nätverk" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Söker efter den senaste programversionen" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Delning av diagnostiska data som inte låter andra identifiera användaren" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Delning av information som låter andra identifiera användaren" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Delning av fysisk plats med andra användare" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Indirekta referenser till homosexualitet" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Kyssande mellan personer av samma kön" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Skildring av sexuellt beteende mellan personer av samma kön" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Indirekta referenser till prostitution" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Direkta referenser till prostitution" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Skildringar av prostitution" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Indirekta referenser till otrohet" + +#~ msgid "Direct references to adultery" +#~ msgstr "Direkta referenser till otrohet" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Skildringar av otrohet" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Lättklädda mänskliga figurer" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Öppet sexualiserade mänskliga figurer" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Skildringar av eller referenser till historisk skändning" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Skildringar av nutida skändning av människor" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Realistiska skildringar av nutida skändning" + +#~ msgid "Visible dead human remains" +#~ msgstr "Synliga kvarlevor av människor" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Kvarlevor av döda människor som utsatts för väder och vind" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Realistiska skildringar av skändning av mänskliga kroppar" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Skildringar av eller referenser till historiskt slaveri" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Skildringar av nutida slaveri" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Grafiska skildringar av nutida slaveri" + +#~ msgid "General" +#~ msgstr "Allmänt" + +#~ msgid "ALL" +#~ msgstr "ALLA" + +#~ msgid "Teen" +#~ msgstr "Tonåring" + +#~ msgid "Everyone 10+" +#~ msgstr "Alla över 10 år" + +#~ msgid "Everyone" +#~ msgstr "Alla" + +#~ msgid "Early Childhood" +#~ msgstr "Tidig barndom" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Okänd" + +#~ msgid "Released" +#~ msgstr "Utgiven" + +#~ msgid "Format" +#~ msgstr "Format" + +#~ msgid "Three days ago" +#~ msgstr "Tre dagar sedan" + +#~ msgid "Four days ago" +#~ msgstr "Fyra dagar sedan" + +#~ msgid "Five days ago" +#~ msgstr "Fem dagar sedan" + +#~ msgid "Six days ago" +#~ msgstr "Sex dagar sedan" + +#~ msgid "Two weeks ago" +#~ msgstr "Två veckor sedan" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Aktivera förråd för GNOME Shell-tillägg" + +#~ msgid "this website" +#~ msgstr "denna webbplats" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Då sätter vi igång" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Borttagen" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Är du säker att du vill ta bort %s?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Detta program behöver startas om för att använda nya insticksmoduler." + +#~ msgid "Security Updates Pending" +#~ msgstr "Säkerhetsuppdateringar väntar" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Du rekommenderas att nu installera viktiga uppdateringar" + +#~ msgid "Restart & Install" +#~ msgstr "Starta om & installera" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "Viktiga system- och programuppdateringar är redo att installeras" + +#~ msgid "View" +#~ msgstr "Visa" + +#~ msgid "About %s" +#~ msgstr "Om %s" + +#~ msgid "%s ME" +#~ msgstr "%s ME" + +#~ msgid "Extension Settings" +#~ msgstr "Tilläggsinställningar" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Tillägg används på din egen risk. Om du får systemproblem rekommenderas " +#~ "det att du inaktiverar dem." + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Skaltillägg" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Förråd för GNOME Shell-tillägg" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Hämtar metadata för skaltillägg…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell-tillägg" + +#~ msgid "Spacing" +#~ msgstr "Utrymme" + +#~ msgid "The amount of space between children" +#~ msgstr "Mängden utrymme mellan barn" + +#~ msgid "Featured Applications" +#~ msgstr "Program i blickfånget" + +#~ msgid "Show the folder management UI" +#~ msgstr "Visa användargränssnittet för mapphantering" + +#~ msgid "Folder Name" +#~ msgstr "Mappnamn" + +#~ msgid "_Add" +#~ msgstr "_Lägg till" + +#~ msgid "Add to Application Folder" +#~ msgstr "Lägg till i programmapp" + +#~ msgid "Top Rated" +#~ msgstr "Högsta betyg" + +#~ msgid "Failed to load components" +#~ msgstr "Misslyckades med att läsa in komponenter" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS validerades utan problem!" + +#~ msgid "Failed to load file" +#~ msgstr "Misslyckades med att läsa in fil" + +#~ msgid "Unsaved changes" +#~ msgstr "Osparade ändringar" + +#~ msgid "The application list is already loaded." +#~ msgstr "Programlistan är redan inläst." + +#~ msgid "Merge documents" +#~ msgstr "Sammanfoga dokument" + +#~ msgid "Throw away changes" +#~ msgstr "Förkasta ändringar" + +#~ msgid "Open AppStream File" +#~ msgstr "Öppna AppStream-fil" + +#~ msgid "Save AppStream File" +#~ msgstr "Spara AppStream-fil" + +#~ msgid "_Save" +#~ msgstr "_Spara" + +#~ msgid "%s banner design deleted." +#~ msgstr "Banderolldesign för %s borttagen." + +#~ msgid "Banner design deleted." +#~ msgstr "Banderolldesign borttagen." + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Programlistan har osparade ändringar." + +#~ msgid "Use verbose logging" +#~ msgstr "Använd utförlig loggning" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME Programvaras banderolldesignverktyg" + +#~ msgid "No Designs" +#~ msgstr "Inga designer" + +#~ msgid "Error message here" +#~ msgstr "Felmeddelande här" + +#~ msgid "Category Featured" +#~ msgstr "I blickfånget för kategori" + +#~ msgid "Undo" +#~ msgstr "Ångra" + +#~ msgid "Banner Designer" +#~ msgstr "Banderolldesignverktyg" + +#~ msgid "New Banner" +#~ msgstr "Ny banderoll" + +#~ msgid "Import from file" +#~ msgstr "Importera från fil" + +#~ msgid "Export to file" +#~ msgstr "Exportera till fil" + +#~ msgid "Click on items to select them" +#~ msgstr "Klicka på poster för att välja dem" + +#~ msgid "Select" +#~ msgstr "Markera" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Lägg till i mapp…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Flytta till mapp…" + +#~ msgid "_Remove from Folder" +#~ msgstr "_Ta bort från mapp" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Designa banderollerna i blickfånget för GNOME Programvara" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Programvara;Mjukvara;App;" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_All" +#~ msgstr "_Allt" + +#~ msgid "Sign In / Register…" +#~ msgstr "Logga in / Registrera…" + +#~ msgid "Continue" +#~ msgstr "Fortsätt" + +#~ msgid "Use" +#~ msgstr "Använd" + +#~ msgid "Add another…" +#~ msgstr "Lägg till ännu ett…" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Programvarukatalog läses in" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s kommer att installeras, och du kommer få betala %s." + +#~ msgid "A$%.2f" +#~ msgstr "%.2fA$" + +#~ msgid "C$%.2f" +#~ msgstr "%.2fC$" + +# Eventuellt CNY i stället. +#~ msgid "CN¥%.2f" +#~ msgstr "%.2fCN¥" + +#~ msgid "€%.2f" +#~ msgstr "%.2f€" + +#~ msgid "£%.2f" +#~ msgstr "%.2f£" + +#~ msgid "¥%.2f" +#~ msgstr "%.2f¥" + +#~ msgid "NZ$%.2f" +#~ msgstr "%.2fNZ$" + +#~ msgid "₽%.2f" +#~ msgstr "%.2f₽" + +#~ msgid "US$%.2f" +#~ msgstr "%.2fUS$" + +#~ msgid "Signed in as %s" +#~ msgstr "Inloggad som %s" + +#~ msgid "Sign in…" +#~ msgstr "Logga in…" + +#~ msgid "Sign out" +#~ msgstr "Logga ut" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "Kunde inte köpa %s: autentisering krävdes" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "Kunde inte köpa %s: autentiseringen var ogiltig" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "Kunde inte köpa %s: ingen betalningsmetod konfigurerad" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "Kunde inte köpa %s: betalningen nekades" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "Du måste använda ett Ubuntu One-konto för att fortsätta." + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "Du måste använda ditt Ubuntu One-konto för att fortsätta." + +#~ msgid "..." +#~ msgstr "…" + +#~ msgid "Unable to update %s from %s" +#~ msgstr "Kunde inte uppdatera %s från %s" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Visa profileringsinformation för tjänsten" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Du måste logga in på %s för att fortsätta." + +#~ msgid "Email address" +#~ msgstr "E-postadress" + +#~ msgid "I have an account already" +#~ msgstr "Jag har redan ett konto" + +#~ msgid "I want to register for an account now" +#~ msgstr "Jag vill registrera ett konto nu" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Logga in automatiskt nästa gång" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Ange din engångs-pin för tvåfaktorsautentisering." + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Autentisera" + +#~ msgid "_About" +#~ msgstr "_Om" + +#~ msgid "_Quit" +#~ msgstr "_Avsluta" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Information om %s, samt alternativ för hur du införskaffar en kodek som " +#~ "kan spela detta format finns på webbplatsen." + +#~ msgid "Your %s account has been suspended." +#~ msgstr "Ditt %s-konto har stängts av." + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "" +#~ "Det är inte möjligt att installera programvara innan detta har lösts." + +#~ msgid "For more information, visit %s." +#~ msgstr "För mer information, besök %s." + +#~ msgid "Downloading new updates…" +#~ msgstr "Hämtar nya uppdateringar…" + +#~ msgid "Downloading application page…" +#~ msgstr "Hämtar programsida…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Den ultimata underhållningsplattformen från Valve" + +#~ msgid "Applications Updated" +#~ msgstr "Program uppdaterades" + +#~ msgid "Restart & _Install" +#~ msgstr "Starta om & _installera" + +#~ msgid "Getting runtime source…" +#~ msgstr "Hämtar källa för exekveringsmiljö…" + +#~ msgid "Limba Support" +#~ msgstr "Limba-stöd" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba tillhandahåller ett sätt för utvecklare att lätt skapa " +#~ "programvarubuntar" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "En lista över extra källor som tidigare har varit aktiverade" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "En lista över källor som tidigare har varit aktiverade vid installation " +#~ "av tredjepartsprogram." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Visa icke-fri programvara i sökresultat" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "En lista över icke-fria källor som valfritt kan aktiveras" + +#~ msgid "Sorted by Name" +#~ msgstr "Sorterat efter namn" + +#~ msgid "Sorted by Rating" +#~ msgstr "Sorterat efter betyg" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Aktivera proprietära programvarukällor?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Inga program eller tillägg installerade; annan programvara kan " +#~ "fortfarande vara det" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "" +#~ "Har vanligtvis restriktioner kring användning av och åtkomst till källkod." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Proprietära programvarukällor" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Programvarukällor kan hämtas från internet. De ger dig tillgång till " +#~ "ytterligare programvara som inte tillhandahålls av %s." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Borttagning av en programvarukälla kommer även att ta bort de " +#~ "programvaror som installerats via den." + +#~ msgid "No software installed from this source" +#~ msgstr "Ingen programvara installerad från denna källa" + +#~ msgid "Installed from this Source" +#~ msgstr "Installerad från denna källa" + +#~ msgid "Last Checked" +#~ msgstr "Senaste sökning" + +#~ msgid "Added" +#~ msgstr "Tillagd" + +#~ msgid "Website" +#~ msgstr "Webbplats" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "Förinställd interaktion mellan spelare utan chattfunktion" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "Delning av användarinformation med tredje part" + +#~ msgid "Remove Source" +#~ msgstr "Ta bort källa" + +#~ msgid "page1" +#~ msgstr "sida1" + +#~ msgid "page2" +#~ msgstr "sida2" + +#~ msgid "“%s” [%s]" +#~ msgstr "”%s” [%s]" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgid "Total" +#~ msgstr "Totalt" + +#~ msgid "Could not find '%s'" +#~ msgstr "Kunde inte hitta ”%s”" + +#~ msgid "Installation of %s failed." +#~ msgstr "Installationen av %s misslyckades." + +#~ msgid "Removal of %s failed." +#~ msgstr "Borttagning av %s misslyckades." + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "Försäkra dig om att du har internetåtkomst och försök igen." + +#~ msgid "Please free up some space and try again." +#~ msgstr "Frigör utrymme och försök igen." + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "Kontakta din programvaruleverantör om problemet kvarstår." + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "Alla" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "I blickfånget" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomi" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "Kemi" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "Matematik" + +#~ msgid "Science" +#~ msgstr "Vetenskap" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "Programvarukällor ger dig tillgång till ytterligare programvara." + +#~ msgid " or " +#~ msgstr " eller " + +#~ msgid "3rd party" +#~ msgstr "tredje part" + +#~ msgid "nonfree" +#~ msgstr "icke-fri" + +#~ msgid "_Installing" +#~ msgstr "_Installerar" + +#~ msgid "_Removing" +#~ msgstr "_Tar bort" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "Okänd" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "Beräknar…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "Okänd" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "Denna programvara kommer från en tredje part." + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "" +#~ "Denna programvara kommer från en tredje part och kan innehålla icke-fria " +#~ "komponenter." + +#~ msgid "This software may contain non-free components." +#~ msgstr "Denna programvara kan innehålla icke-fria komponenter." + +#~ msgid "_History" +#~ msgstr "_Historik" + +#~ msgid "Size" +#~ msgstr "Storlek" + +#~ msgid "non-free" +#~ msgstr "icke-fri" + +#~ msgid "Recommended Office Applications" +#~ msgstr "Rekommenderade produktivitetsprogram" + +#~ msgid "One Star" +#~ msgstr "En stjärna" + +#~ msgid "Two Stars" +#~ msgstr "Två stjärnor" + +#~ msgid "Three Stars" +#~ msgstr "Tre Stjärnor" + +#~ msgid "Four Stars" +#~ msgstr "Fyra stjärnor" + +#~ msgid "Five Stars" +#~ msgstr "Fem stjärnor" + +#~ msgid "No AppStream data found" +#~ msgstr "Inget AppStream-data hittades" + +#~ msgid "Audio" +#~ msgstr "Ljud" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "Redigering" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "Databaser" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "Bränna skivor" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "Amatörradio" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "Mixer" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "Musik" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "Inspelare" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "Ljudredigering" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "Mottagare" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "Bygga" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "Databaser" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "Profilering" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "Webbutveckling" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "Biologi" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "Datavetenskap" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "Datavisualisering" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "Ekonomi" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "Elektricitet" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "Elektronik" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "Ingenjörskonst" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "Geologi" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "Geovetenskap" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "Historia" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "Bildbehandling" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "Litteratur" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "Kartor" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "Musik" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "Numerisk analys" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "Parallella beräkningar" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "Fysik" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "Andlighet" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "Skjutspel" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "Simulering" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgid "Graphics" +#~ msgstr "Grafik" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D-grafik" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "Publicering" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "Rastrerad grafik" + +#~ msgid "Internet" +#~ msgstr "Internet" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "Uppringt" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "E-post" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "Flöde" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "Filöverföring" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "Amatörradio" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "Direktmeddelanden" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC-klienter" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "Övervakning" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "Telefoni" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "Webbutveckling" + +#~ msgid "Office" +#~ msgstr "Produktivitet" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "Diagram" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "Kontakthantering" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "Ordlista" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "E-post" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "Flödesschema" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "Fotografi" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "Projekthantering" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "Publicering" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "Kalkylark" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "Visare" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "Konst" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "Artificiell intelligens" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "Astronomi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "Biologi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "Kemi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "Datavetenskap" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "Konstruktion" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "Datavisualisering" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "Ekonomi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "Elektricitet" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "Elektronik" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "Ingenjörskonst" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "Geografi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "Geologi" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "Geovetenskap" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "Historia" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "Humaniora" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "Bildbehandling" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "Språk" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "Litteratur" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "Kartor" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "Matematik" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "Medicin" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "Numerisk analys" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "Parallella beräkningar" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "Fysik" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "Robotik" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "Andlighet" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "Sport" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "Emulator" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "Filhanterare" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "Filverktyg" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "Övervakning" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "Säkerhet" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "Terminalemulator" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "Tillgänglighet" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "Arkivering" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "Miniräknare" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "Klockor" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "Komprimering" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "Filverktyg" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "Kartor" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "Andlighet" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "Telefoniverktyg" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "Redigering" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "Databas" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "Bränna skivor" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "Inspelare" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "TV" + +#~ msgid "A previous update was unfinished." +#~ msgstr "En tidigare uppdatering har inte slutförts." + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "Uppdateringen kunde inte installeras. Detta är ofta ett problem med " +#~ "uppdateringen själv. Vänta på ännu en uppdatering och försök igen." + +#~ msgid "Internet Only Application" +#~ msgstr "Program som kräver internet" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "En uppdatering var inte korrekt signerad." + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "" +#~ "En frånkopplad uppdatering begärdes men inga paket behöver uppdateras." + +#~ msgid "No space was left on the drive." +#~ msgstr "Inget ledigt utrymme på enheten." + +#~ msgid "An update failed to install correctly." +#~ msgstr "En uppdatering kunde inte installeras korrekt." + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "Den frånkopplade uppdateringen misslyckades på ett oväntat sätt." + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "%i program och %i tillägg installerat" +#~ msgstr[1] "%i program och %i tillägg installerade" + +#~ msgid "" +#~ "Depending on your country of residence, installing it could make you " +#~ "liable to prosecution." +#~ msgstr "" +#~ "Beroende på vilket land du befinner dig i kan det möjliggöra åtal mot dig " +#~ "om du installerar den." + +#~ msgid "If you are uncertain about this, you should obtain legal advice." +#~ msgstr "Om du är osäker angående detta bör du söka juridisk rådgivning." + +#~ msgid "Do you want to enable it?" +#~ msgstr "Vill du aktivera den?" diff --git a/po/te.po b/po/te.po new file mode 100644 index 0000000..b7c43c4 --- /dev/null +++ b/po/te.po @@ -0,0 +1,1812 @@ +# Telugu translation for gnome-software. +# Copyright (C) 2014 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Praveen Illa , 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"software&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-18 08:33+0000\n" +"PO-Revision-Date: 2014-03-31 00:23+0530\n" +"Last-Translator: Praveen Illa \n" +"Language-Team: indlinux-telugu@lists.sourceforge.net\n" +"Language: te\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: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:1 +msgid "Application manager for GNOME" +msgstr "గ్నోమ్ కోసం అనువర్తన నిర్వాహకం" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:2 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:3 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "" + +#: ../src/app-folder-dialog.ui.h:1 +msgid "Add to Application Folder" +msgstr "అనువర్తన సంచయానికి జోడించు" + +#: ../src/app-folder-dialog.ui.h:2 ../src/gs-app-folder-dialog.c:325 +#: ../src/gs-shell-details.c:204 ../src/gs-shell-installed.c:593 +msgid "_Cancel" +msgstr "రద్దుచేయి (_C)" + +#: ../src/app-folder-dialog.ui.h:3 ../src/gs-app-folder-dialog.c:330 +msgid "_Add" +msgstr "జతచేయి (_A)" + +#: ../src/app-menu.ui.h:1 +msgid "_Software Sources" +msgstr "సాఫ్ట్‌వేర్ మూలాలు (_S)" + +#: ../src/app-menu.ui.h:2 +msgid "_About" +msgstr "గురించి (_A)" + +#: ../src/app-menu.ui.h:3 +msgid "_Quit" +msgstr "నిష్క్రమించు (_Q)" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is installed +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is installed +#: ../src/app-tile.ui.h:1 ../src/gs-app-tile.c:82 ../src/gs-app-tile.c:85 +#: ../src/gs-feature-tile.c:76 ../src/gs-history-dialog.c:88 +#: ../src/gs-popular-tile.c:79 ../src/gs-popular-tile.c:82 +#: ../src/popular-tile.ui.h:1 +msgid "Installed" +msgstr "స్థాపితం" + +#. TRANSLATORS: this is the application name +#. TRANSLATORS: this is the main window title +#: ../src/org.gnome.Software.desktop.in.h:1 ../src/gnome-software.ui.h:3 +#: ../src/gs-application.c:240 ../src/gs-shell.c:162 +msgid "Software" +msgstr "సాఫ్ట్‌వేర్" + +#: ../src/org.gnome.Software.desktop.in.h:2 +msgid "Add, remove or update software on this computer" +msgstr "ఈ కంప్యూటరుపై సాఫ్ట్‌వేరును జతచేయండి, తీసివేయండి లేదా నవీకరించండి." + +#: ../src/gnome-software-local-file.desktop.in.h:1 +msgid "Software Install" +msgstr "సాఫ్ట్‌వేర్ స్థాపన" + +#: ../src/gnome-software-local-file.desktop.in.h:2 +msgid "Install selected software on the system" +msgstr "ఎంచుకున్న సాఫ్ట్‌వేరును వ్యవస్థపై స్థాపించు" + +#: ../src/gnome-software.ui.h:1 +msgid "Select All" +msgstr "అన్నీ ఎంచుకొను" + +#: ../src/gnome-software.ui.h:2 +msgid "Select None" +msgstr "ఎంపిక రద్దు" + +#. vim: set noexpandtab: +#: ../src/gnome-software.ui.h:4 ../src/gs-update-dialog.ui.h:1 +msgid "Go back" +msgstr "వెనక్కి వెళ్ళు" + +#. Translators: A label for a button to show all available software. +#: ../src/gnome-software.ui.h:6 +msgid "_All" +msgstr "అన్నీ (_A)" + +#. Translators: A label for a button to show only software which is already installed. +#: ../src/gnome-software.ui.h:8 +msgid "_Installed" +msgstr "స్థాపితం (_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: ../src/gnome-software.ui.h:10 +msgid "_Updates" +msgstr "నవీకరణలు (_U)" + +#: ../src/gnome-software.ui.h:11 +msgid "Restart & _Install" +msgstr "పునఃప్రారంభించి, స్థాపించు (_I)" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#: ../src/gnome-software.ui.h:12 ../src/gs-shell-details.c:153 +msgid "_Install" +msgstr "స్థాపించు (_I)" + +#. TRANSLATORS: button text in the header when an application can be erased +#: ../src/gnome-software.ui.h:13 ../src/gs-shell-details.c:191 +msgid "_Remove" +msgstr "తొలగించు (_R)" + +#: ../src/gnome-software.ui.h:14 +msgid "Select" +msgstr "ఎంచుకొను" + +#: ../src/gnome-software.ui.h:15 +msgid "Check for updates" +msgstr "నవీకరణల కోసం చూడు" + +#: ../src/gnome-software.ui.h:16 +msgid "Overview page" +msgstr "అవలోకన పుట" + +#: ../src/gnome-software.ui.h:17 +#: ../src/plugins/gs-plugin-hardcoded-categories.c:160 +msgid "Featured" +msgstr "ప్రత్యేకం" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: ../src/gnome-software.ui.h:19 +msgid "Picks" +msgstr "ఏరికలు" + +#: ../src/gnome-software.ui.h:20 +msgid "Categories" +msgstr "వర్గాలు" + +#: ../src/gnome-software.ui.h:21 +msgid "No Application Data Found" +msgstr "ఏ అనువర్తన దత్తాంశం కనపడలేదు" + +#: ../src/gnome-software.ui.h:22 +msgid "Installed page" +msgstr "స్థాపన పుట" + +#: ../src/gnome-software.ui.h:23 +msgid "_Add to Folder…" +msgstr "సంచయానికి జతచేయి…(_A)" + +#: ../src/gnome-software.ui.h:24 +msgid "_Move to Folder…" +msgstr "సంచయానికి తరలించు...(_M)" + +#: ../src/gnome-software.ui.h:25 +msgid "_Remove from Folder" +msgstr "సంచయం నుండి తొలగించు (_R)" + +#: ../src/gnome-software.ui.h:26 +msgid "Search page" +msgstr "వెతుకులాట పుట" + +#: ../src/gnome-software.ui.h:27 +msgid "No Application Found" +msgstr "ఏ అనువర్తనం కనపడలేదు" + +#: ../src/gnome-software.ui.h:28 +msgid "Updates page" +msgstr "నవీకరణల పుట" + +#: ../src/gnome-software.ui.h:29 +msgid "Software is up to date" +msgstr "సాఫ్ట్‌వేర్ తాజాగానే ఉంది" + +#: ../src/gnome-software.ui.h:30 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" + +#: ../src/gnome-software.ui.h:31 +msgid "_Check Anyway" +msgstr "ఏదేమైనప్పటికీ తనిఖీచేయి (_C)" + +#: ../src/gnome-software.ui.h:32 +msgid "Go online to check for updates" +msgstr "నవీకరణల కోసం తనిఖీకై జాలానికి వెళ్ళండి" + +#: ../src/gnome-software.ui.h:33 +msgid "_Network Settings" +msgstr "నెట్‌వర్క్ అమరికలు (_n)" + +#: ../src/gnome-software.ui.h:34 +msgid "Details page" +msgstr "వివరాల పుట" + +#: ../src/gnome-software.ui.h:35 +msgid "Software Source Included" +msgstr "సాఫ్ట్‌వేర్ మూలం చేర్బబడింది" + +#: ../src/gnome-software.ui.h:36 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "" + +#: ../src/gnome-software.ui.h:37 +msgid "No Software Source Included" +msgstr "ఎటువంటి సాఫ్ట్‌వేర్ మూలం లేదు" + +#: ../src/gnome-software.ui.h:38 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "" + +#: ../src/gnome-software.ui.h:39 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" + +#: ../src/gnome-software.ui.h:40 +msgid "Software Source Identified" +msgstr "సాఫ్ట్‌వేర్ మూలం గుర్తించబడింది" + +#: ../src/gnome-software.ui.h:41 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "" + +#: ../src/gnome-software.ui.h:42 +msgid "Only use software sources that you trust." +msgstr "మీరు నమ్మే సాఫ్ట్‌వేర్ మూలాలను మాత్రమే ఉపయోగించండి." + +#: ../src/gnome-software.ui.h:43 +msgid "_Website" +msgstr "జాలగూడు (_W)" + +#: ../src/gnome-software.ui.h:44 +msgid "_History" +msgstr "చరిత్ర (_H)" + +#. Translators: A label for a button to execute the selected application. +#: ../src/gnome-software.ui.h:46 +msgid "_Launch" +msgstr "ఆరంభించు (_L)" + +#: ../src/gnome-software.ui.h:47 +msgid "Details" +msgstr "వివరాలు" + +#: ../src/gnome-software.ui.h:48 +msgid "Version" +msgstr "సంస్కరణ" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: ../src/gnome-software.ui.h:49 ../src/gs-history-dialog.c:93 +msgid "Updated" +msgstr "నవీకరించబడింది" + +#: ../src/gnome-software.ui.h:50 +msgid "Category" +msgstr "వర్గం" + +#: ../src/gnome-software.ui.h:51 +msgid "Source" +msgstr "మూలం" + +#: ../src/gnome-software.ui.h:52 +msgid "Licence" +msgstr "లైసెన్సు" + +#: ../src/gnome-software.ui.h:53 +msgid "Size" +msgstr "పరిమాణం" + +#: ../src/gnome-software.ui.h:54 +msgid "Developer" +msgstr "వికాసకుడు" + +#: ../src/gnome-software.ui.h:55 +msgid "Software Sources" +msgstr "సాఫ్ట్‌వేర్ మూలాలు" + +#: ../src/gnome-software.ui.h:56 +msgid "No sources found." +msgstr "ఎటువంటి మూలాలు దొరకలేదు." + +#: ../src/gnome-software.ui.h:57 +msgid "Software sources give you access to additional software." +msgstr "సాఫ్ట్‌వేర్ మూలాలు అదనపు సాఫ్ట్‌వేర్ ప్రాప్తిని కల్పిస్తాయి." + +#: ../src/gnome-software.ui.h:58 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "" +"మూలాన్ని తీసివేస్తే, దాని నుండి స్థాపించిన సాఫ్ట్‌వేర్ కూడా తొలగించబడుతుంది." + +#: ../src/gnome-software.ui.h:59 +msgid "No software installed from this source" +msgstr "ఈ మూలం నుండి ఎటువంటి సాఫ్ట్‌వేర్ స్థాపించబడలేదు" + +#: ../src/gnome-software.ui.h:60 +msgid "Installed from this Source" +msgstr "ఈ మూలం నుండి స్థాపించబడింది" + +#: ../src/gnome-software.ui.h:61 +msgid "Source Details" +msgstr "మూలం వివరాలు" + +#: ../src/gnome-software.ui.h:62 +msgid "Last Checked" +msgstr "చివరి తనిఖీ" + +#: ../src/gnome-software.ui.h:63 +msgid "Added" +msgstr "జోడించబడింది" + +#: ../src/gnome-software.ui.h:64 +msgid "Website" +msgstr "జాలగూడు" + +#: ../src/gnome-software.ui.h:65 +msgid "January 30, 2014" +msgstr "జనవరి 30, 2014" + +#: ../src/gnome-software.ui.h:66 ../src/gs-shell.c:600 +msgid "Remove Source" +msgstr "మూలాన్ని తీసివేయి" + +#: ../src/gs-app-folder-dialog.c:313 +msgid "Folder Name" +msgstr "సంచయం పేరు" + +#. TRANSLATORS: this is the title of the about window +#: ../src/gs-application.c:238 +msgid "About Software" +msgstr "సాఫ్ట్‌వేర్ గురించి" + +#. TRANSLATORS: well, we seem to think so, anyway +#: ../src/gs-application.c:243 +msgid "A nice way to manage the software on your system." +msgstr "మీ వ్యవస్థపై సాఫ్ట్‌వేర్ నిర్వహణకు ఒక సులభమైన మార్గం." + +#: ../src/gs-application.c:247 +msgid "translator-credits" +msgstr "Praveen Illa , 2014" + +#: ../src/gs-application.c:488 +msgid "Enter GApplication service mode" +msgstr "" + +#. TRANSLATORS: this is a command line option +#: ../src/gs-application.c:491 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" + +#: ../src/gs-application.c:491 +msgid "MODE" +msgstr "రీతి" + +#: ../src/gs-application.c:493 +msgid "Search for applications" +msgstr "అనువర్తనాల కోసం వెతకండి" + +#: ../src/gs-application.c:493 +msgid "SEARCH" +msgstr "వెతకండి" + +#: ../src/gs-application.c:495 ../src/gs-application.c:497 +msgid "Show application details" +msgstr "అనువర్తనం వివరాలు చూపించు" + +#: ../src/gs-application.c:495 ../src/gs-application.c:497 +#: ../src/gs-application.c:499 +msgid "ID" +msgstr "గుచి" + +#: ../src/gs-application.c:499 +msgid "Set the specified debugging level" +msgstr "" + +#: ../src/gs-application.c:501 +msgid "Show profiling information for the service" +msgstr "" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user there is an update for the installed +#. * application available +#: ../src/gs-app-tile.c:91 ../src/gs-app-tile.c:95 ../src/gs-feature-tile.c:81 +#: ../src/gs-popular-tile.c:88 ../src/gs-popular-tile.c:92 +msgid "Updates" +msgstr "నవీకరణలు" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-widget.c:200 +msgid "Visit website" +msgstr "జాలగూటిని సందర్శించండి" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: ../src/gs-app-widget.c:207 +msgid "Cancel" +msgstr "రద్దుచేయి" + +#. TRANSLATORS: this is a label that describes an application +#. * that has been queued for installation +#: ../src/gs-app-widget.c:210 +msgid "Pending" +msgstr "వాయిదా" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-widget.c:217 +msgid "Install" +msgstr "స్థాపించు" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: ../src/gs-app-widget.c:226 ../src/gs-shell-details.c:1057 +#: ../src/gs-shell-installed.c:205 ../src/gs-shell-search.c:164 +msgid "Remove" +msgstr "తొలగించు" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#: ../src/gs-app-widget.c:237 +msgid "Installing" +msgstr "స్థాపిస్తున్నాము" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#: ../src/gs-app-widget.c:246 +msgid "Removing" +msgstr "తొలగిస్తున్నాము" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: ../src/gs-category.c:174 +msgid "Other" +msgstr "ఇతరాలు" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: ../src/gs-history-dialog.c:82 +msgid "Removed" +msgstr "తీసివేయబడింది" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#. TRANSLATORS: this is where the licence is not known +#. TRANSLATORS: this is where the version is not known +#. TRANSLATORS: this is where the size is not known +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: ../src/gs-history-dialog.c:99 ../src/gs-shell-details.c:602 +#: ../src/gs-shell-details.c:621 ../src/gs-shell-details.c:631 +#: ../src/gs-shell-details.c:673 +msgid "Unknown" +msgstr "తెలియదు" + +#. vim: set noexpandtab: +#: ../src/gs-history-dialog.ui.h:1 +msgid "History" +msgstr "చరిత్ర" + +#. TRANSLATORS: this is when the offline update failed +#: ../src/gs-offline-updates.c:228 +msgid "Failed To Update" +msgstr "నవీకరించుటలో విఫలం" + +#. TRANSLATORS: the transaction could not be completed +#. * as a previous transaction was unfinished +#: ../src/gs-offline-updates.c:234 +msgid "A previous update was unfinished." +msgstr "క్రితం నవీకరణ పూర్తికాలేదు." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: ../src/gs-offline-updates.c:244 +msgid "Network access was required but not available." +msgstr "నెట్‌వర్కు ప్రాప్తి అవసరం కాని అందుబాటులోలేదు." + +#. TRANSLATORS: if the package is not signed correctly +#. * +#: ../src/gs-offline-updates.c:253 +msgid "An update was not signed in the correct way." +msgstr "నవీకరణ సరైన విధానంలో సంతకం చేయబడిలేదు." + +#. TRANSLATORS: the transaction failed in a way the user +#. * probably cannot comprehend. Package management systems +#. * really are teh suck. +#: ../src/gs-offline-updates.c:263 +msgid "The update could not be completed." +msgstr "నవీకరణ పూర్తికాలేదు." + +#. TRANSLATORS: the user aborted the update manually +#: ../src/gs-offline-updates.c:268 +msgid "The update was cancelled." +msgstr "నవీకరణ రద్దుచేయబడింది." + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: ../src/gs-offline-updates.c:274 +msgid "An offline update was requested but no packages required updating." +msgstr "ఆఫ్‌లైన్ నవీకరణ అభ్యర్ధించబడెను అయితే ఏ ప్యాకేజీలకు నవీకరణ అవసరంలేదు." + +#. TRANSLATORS: we ran out of disk space +#: ../src/gs-offline-updates.c:278 +msgid "No space was left on the drive." +msgstr "డ్రైవ్ నందు ఖాళీ లేదు." + +#. TRANSLATORS: the update process failed in a general +#. * way, usually this message will come from source distros +#. * like gentoo +#: ../src/gs-offline-updates.c:286 +msgid "An update failed to install correctly." +msgstr "నవీకరణ సరిగా స్థాపించుటలో విఫలమైంది." + +#. TRANSLATORS: We didn't handle the error type +#: ../src/gs-offline-updates.c:291 +msgid "The offline update failed in an unexpected way." +msgstr "ఆఫ్‌లైన్ నవీకరణ అనుకోని విధంగా విఫలమైంది." + +#. TRANSLATORS: these are geeky messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: ../src/gs-offline-updates.c:300 +msgid "Detailed errors from the package manager follow:" +msgstr "ప్యాకేజీ నిర్వాహకం నుండి విశదీకృత దోషాలు కింది విధంగా వున్నాయి:" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: ../src/gs-plugin-loader.c:764 +msgid "OS Updates" +msgstr "నివ్య నవీకరణలు" + +#. TRANSLATORS: this is a longer description of the +#. * os-update item +#: ../src/gs-plugin-loader.c:769 +msgid "" +"Includes performance, stability and security improvements for all users." +msgstr "" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-plugin-loader.c:1463 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "" + +#: ../src/gs-plugin-loader.c:1466 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: ../src/gs-screenshot-image.c:129 +msgid "Screenshot not found" +msgstr "తెరపట్టు కనబడలేదు" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: ../src/gs-screenshot-image.c:236 +msgid "Screenshot size not found" +msgstr "తెరపట్టు పరిమాణం కనపడలేదు" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: ../src/gs-screenshot-image.c:250 +msgid "Could not create cache" +msgstr "క్యాచిని సృష్టించుట వీలుకాలేదు" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: ../src/gs-screenshot-image.c:267 +msgid "Screenshot not valid" +msgstr "తెరపట్టు సరైనదికాదు" + +#. TRANSLATORS: this is when networking is not available +#: ../src/gs-screenshot-image.c:273 +msgid "Screenshot not available" +msgstr "తెరపట్టు అందుబాటులోలేదు" + +#: ../src/gs-screenshot-image.c:326 +msgid "Screenshot" +msgstr "తెరపట్టు" + +#: ../src/gs-shell.c:621 +msgid "Removing…" +msgstr "తొలగిస్తోంది..." + +#. TRANSLATORS: this source has no apps installed from it +#: ../src/gs-shell.c:871 +msgid "No software installed" +msgstr "ఎటువంటి సాఫ్ట్‌వేర్ స్థాపించబడిలేదు" + +#. TRANSLATORS: this source has some apps installed from it +#: ../src/gs-shell.c:874 +#, c-format +msgid "%i application installed" +msgid_plural "%i applications installed" +msgstr[0] "%i అనువర్తనం స్థాపించబడింది" +msgstr[1] "%i అనువర్తనాలు స్థాపించబడ్డాయి" + +#. TRANSLATORS: this source has some apps installed from it +#: ../src/gs-shell.c:879 +#, c-format +msgid "%i add-on installed" +msgid_plural "%i add-ons installed" +msgstr[0] "%i యాడ్ ఆన్ స్థాపించబడింది" +msgstr[1] "%i యాడ్ ఆన్లు స్థాపించబడ్డాయి" + +#. TRANSLATORS: this source has some apps and addons installed from it +#: ../src/gs-shell.c:884 +#, c-format +msgid "%i application and %i add-ons installed" +msgid_plural "%i applications and %i add-ons installed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/gs-shell-details.c:136 +msgid "_Pending" +msgstr "వాయిదా (_P)" + +#. TRANSLATORS: button text in the header when an application +#. * is in the process of being installed +#: ../src/gs-shell-details.c:164 +msgid "_Installing" +msgstr "స్థాపిస్తున్నాము (_I)" + +#. TRANSLATORS: button text in the header when an application can be installed +#: ../src/gs-shell-details.c:198 +msgid "_Removing" +msgstr "తొలగిస్తున్నాము (_R)" + +#. TRANSLATORS: this is where the licence is insanely +#. * complicated and the full string is put into the tooltip +#: ../src/gs-shell-details.c:607 +msgid "Complicated!" +msgstr "క్లిష్టం!" + +#. TRANSLATORS: this is where the size is being worked out +#: ../src/gs-shell-details.c:628 +msgid "Calculating…" +msgstr "లెక్కిస్తోంది..." + +#. TRANSLATORS: this is where the updated date is not known +#: ../src/gs-shell-details.c:644 +msgid "Never" +msgstr "ఎప్పటికీవద్దు" + +#. TRANSLATORS: this is the application isn't in any +#. * defined menu category +#: ../src/gs-shell-details.c:661 +msgid "None" +msgstr "ఏదీకాదు" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: ../src/gs-shell-details.c:1042 ../src/gs-shell-installed.c:190 +#: ../src/gs-shell-search.c:149 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "మీరు ఖచ్ఛితంగా %s ను తీసివేయాలనుకుంటున్నారా?" + +#. TRANSLATORS: longer dialog text +#: ../src/gs-shell-details.c:1054 ../src/gs-shell-installed.c:202 +#: ../src/gs-shell-search.c:161 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: these are extra things that add to existing programs, +#. * for instance fonts, codecs or language packs +#. TRANSLATORS: this is the main category for Add-ons +#: ../src/gs-shell-installed.c:512 ../src/gs-shell-updates.c:584 +#: ../src/plugins/gs-plugin-packagekit.c:576 +#: ../src/plugins/menu-spec-common.c:210 +msgid "Add-ons" +msgstr "యాడ్-ఆన్లు" + +#: ../src/gs-shell-installed.c:601 +msgid "Click on items to select them" +msgstr "అంశాలను ఎంచుకోవడానికి వాటిపై నొక్కండి" + +#. TRANSLATORS: Time in 24h format +#: ../src/gs-shell-updates.c:135 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: ../src/gs-shell-updates.c:138 +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: ../src/gs-shell-updates.c:143 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:204 +msgid "Setting up updates…" +msgstr "నవీకరణలను అమరుస్తూంది…" + +#: ../src/gs-shell-updates.c:205 ../src/gs-shell-updates.c:212 +msgid "(This could take a while)" +msgstr "(ఇందుకు కొంత సమయం పడుతుంది)" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:211 +msgid "Looking for new updates…" +msgstr "సరికొత్త నవీకరణల కోసం చూస్తూంది..." + +#. TRANSLATORS: this is when the updates panel is starting up +#: ../src/gs-shell-updates.c:218 +msgid "Checking for updates…" +msgstr "నవీకరణల కోసం చూస్తున్నాము..." + +#. TRANSLATORS: This is the time when we last checked for updates +#: ../src/gs-shell-updates.c:333 +#, c-format +msgid "Last checked: %s" +msgstr "చివరి తనిఖీ: %s" + +#. TRANSLATORS: window title to suggest that we are showing +#. * the offline updates that have just been applied +#: ../src/gs-shell-updates.c:468 +msgid "Recent Software Updates" +msgstr "ఇటీవలి సాఫ్ట్‌వేర్ నవీకరణలు" + +#. TRANSLATORS: can't do updates check +#: ../src/gs-shell-updates.c:776 +msgid "No Network" +msgstr "నెట్‌వర్కు లేదు" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:780 +msgid "Internet access is required to check for updates." +msgstr "నవీకరణల కోసం చూడాలంటే అంతర్జాల ప్రాప్తి అవసరం." + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:784 +msgid "Network Settings" +msgstr "నెట్‌వర్కు అమరికలు" + +#. TRANSLATORS: $$$ +#: ../src/gs-shell-updates.c:804 +msgid "Charges may apply" +msgstr "చార్జీలు వర్తించవచ్చు" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:808 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:812 +msgid "Check Anyway" +msgstr "ఏదేమైనప్పటికీ తనిఖీచేయి" + +#: ../src/gs-update-monitor.c:102 +msgid "Software Updates Available" +msgstr "సాఫ్ట్‌వేర్ నవీకరణలు ఉన్నాయి" + +#: ../src/gs-update-monitor.c:103 +msgid "Important OS and application updates are ready to be installed" +msgstr "" + +#: ../src/gs-update-monitor.c:106 +msgid "View" +msgstr "చూడండి" + +#: ../src/gs-update-monitor.c:107 +msgid "Not Now" +msgstr "ఇప్పుడు కాదు" + +#: ../src/gs-update-monitor.c:149 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "సాఫ్టువేర్ నవీకరణ‌ స్థాపించబడింది" +msgstr[1] "సాఫ్టువేర్ నవీకరణలు స్థాపించబడ్డాయి" + +#. TRANSLATORS: message when we've done offline updates +#: ../src/gs-update-monitor.c:153 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "ఒక ముఖ్యమైన నివ్య నవీకరణ స్థాపించబడెను." +msgstr[1] "ఒక ముఖ్యమైన నివ్య నవీకరణలు స్థాపించబడ్డాయి." + +#: ../src/gs-update-monitor.c:158 +msgid "Software Updates Failed" +msgstr "సాఫ్ట్‌వేర్ నవీకరణలు విఫలం" + +#. TRANSLATORS: message when we offline updates have failed +#: ../src/gs-update-monitor.c:160 +msgid "An important OS update failed to be installed." +msgstr "ఒక ముఖ్యమైన నివ్య నవీకరణ స్థాపన విఫలమైంది." + +#: ../src/gs-update-monitor.c:169 +msgid "Review" +msgstr "సమీక్ష" + +#: ../src/gs-update-monitor.c:171 +msgid "Show Details" +msgstr "వివరాలు చూపించు" + +#: ../src/gs-update-monitor.c:172 +msgid "OK" +msgstr "సరే" + +#. vim: set noexpandtab: +#: ../src/gs-star-widget.ui.h:1 +msgid "One Star" +msgstr "ఏక నక్షత్రం" + +#: ../src/gs-star-widget.ui.h:2 +msgid "Two Stars" +msgstr "రెండు నక్షత్రాలు" + +#: ../src/gs-star-widget.ui.h:3 +msgid "Three Stars" +msgstr "మూడు నక్షత్రాలు" + +#: ../src/gs-star-widget.ui.h:4 +msgid "Four Stars" +msgstr "నాలుగు నక్షత్రాలు" + +#: ../src/gs-star-widget.ui.h:5 +msgid "Five Stars" +msgstr "ఐదు నక్షత్రాలు" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: ../src/gs-utils.c:131 +#, c-format +msgid "%s is now installed" +msgstr "%s ఇప్పుడు స్థాపితం" + +#. TRANSLATORS: this is button that opens the newly installed application +#: ../src/gs-utils.c:135 +msgid "Launch" +msgstr "ప్రారంభించు" + +#: ../src/gs-utils.c:160 +msgid "Sorry, this did not work" +msgstr "క్షమించండి, ఇది పని చేయదు" + +#. TRANSLATORS: this is when the install fails +#: ../src/gs-utils.c:164 +#, c-format +msgid "Installation of %s failed." +msgstr "%s యొక్క స్థాపన విఫలమైంది." + +#. TRANSLATORS: this is when the remove fails +#: ../src/gs-utils.c:169 +#, c-format +msgid "Removal of %s failed." +msgstr "%s యొక్క తొలగింపు విఫలమైంది." + +#: ../src/plugins/gs-plugin-appstream.c:348 +#, c-format +msgid "No AppStream data found" +msgstr "ఎటువంటి ఆప్‌స్ట్రీమ్ దత్తాంశం దొరకలేదు" + +#. TRANSLATORS: this is when a webapp has no comment +#: ../src/plugins/gs-plugin-epiphany.c:143 +#, c-format +msgid "Web app" +msgstr "జాల అనువర్తనం" + +#. TRANSLATORS: this is the licence of the web-app +#: ../src/plugins/gs-plugin-epiphany.c:151 +msgid "Proprietary" +msgstr "యాజమాన్య" + +#. TRANSLATORS: audio/video decoders +#: ../src/plugins/gs-plugin-packagekit.c:580 +msgid "Codecs" +msgstr "కోడెక్లు" + +#. TRANSLATORS: fonts of different styles or languages +#: ../src/plugins/gs-plugin-packagekit.c:584 +msgid "Fonts" +msgstr "ఖతులు" + +#. TRANSLATORS: these are ways to enter text +#: ../src/plugins/gs-plugin-packagekit.c:588 +msgid "Input Sources" +msgstr "నివేశ మూలాలు" + +#. TRANSLATORS: additional languages for apps +#: ../src/plugins/gs-plugin-packagekit.c:592 +msgid "Language Packs" +msgstr "భాషా ప్యాక్లు" + +#. TRANSLATORS: this is where update details either are +#. * no longer available or were never provided in the first place +#: ../src/plugins/gs-plugin-packagekit-refine.c:414 +msgid "No update details were provided" +msgstr "ఎటువంటి నవీకరణ వివరాలు అందించలేదు" + +#. TRANSLATORS: this is the menu spec main category for Audio +#: ../src/plugins/menu-spec-common.c:30 +msgid "Audio" +msgstr "శ్రవ్యకం" + +#: ../src/plugins/menu-spec-common.c:31 +msgctxt "Menu subcategory of Audio" +msgid "Editing" +msgstr "కూర్పు" + +#: ../src/plugins/menu-spec-common.c:32 +msgctxt "Menu subcategory of Audio" +msgid "Databases" +msgstr "దత్తకోశాలు" + +#: ../src/plugins/menu-spec-common.c:33 +msgctxt "Menu subcategory of Audio" +msgid "Disc Burning" +msgstr "డిస్కు కాల్చుట" + +#: ../src/plugins/menu-spec-common.c:34 +msgctxt "Menu subcategory of Audio" +msgid "Ham Radio" +msgstr "హ్యామ్ రేడియో" + +#: ../src/plugins/menu-spec-common.c:35 +msgctxt "Menu subcategory of Audio" +msgid "MIDI" +msgstr "MIDI" + +#: ../src/plugins/menu-spec-common.c:36 +msgctxt "Menu subcategory of Audio" +msgid "Mixer" +msgstr "మిక్సర్" + +#: ../src/plugins/menu-spec-common.c:37 +msgctxt "Menu subcategory of Audio" +msgid "Music" +msgstr "సంగీతం" + +#: ../src/plugins/menu-spec-common.c:38 +msgctxt "Menu subcategory of Audio" +msgid "Players" +msgstr "ప్రదర్శకాలు" + +#: ../src/plugins/menu-spec-common.c:39 +msgctxt "Menu subcategory of Audio" +msgid "Recorders" +msgstr "రికార్డర్లు" + +#: ../src/plugins/menu-spec-common.c:40 +msgctxt "Menu subcategory of Audio" +msgid "Sequencers" +msgstr "సీక్వెన్సర్లు" + +#: ../src/plugins/menu-spec-common.c:41 +msgctxt "Menu subcategory of Audio" +msgid "Tuners" +msgstr "ట్యూనర్స్" + +#. TRANSLATORS: this is the menu spec main category for Development +#: ../src/plugins/menu-spec-common.c:43 +msgid "Development Tools" +msgstr "వికాస పనిముట్లు" + +#: ../src/plugins/menu-spec-common.c:44 +msgctxt "Menu subcategory of Development" +msgid "Building" +msgstr "నిర్మాణం" + +#: ../src/plugins/menu-spec-common.c:45 +msgctxt "Menu subcategory of Development" +msgid "Databases" +msgstr "దత్తకోశాలు" + +#: ../src/plugins/menu-spec-common.c:46 +msgctxt "Menu subcategory of Development" +msgid "Debuggers" +msgstr "దోషశుద్ధకాలు" + +#: ../src/plugins/menu-spec-common.c:47 +msgctxt "Menu subcategory of Development" +msgid "GUI Designers" +msgstr "GUI రూపకల్పకాలు" + +#: ../src/plugins/menu-spec-common.c:48 +msgctxt "Menu subcategory of Development" +msgid "IDE" +msgstr "IDE" + +#: ../src/plugins/menu-spec-common.c:49 +msgctxt "Menu subcategory of Development" +msgid "Profiling" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:50 +msgctxt "Menu subcategory of Development" +msgid "Project Management" +msgstr "పరియోజన నిర్వహణ" + +#: ../src/plugins/menu-spec-common.c:51 +msgctxt "Menu subcategory of Development" +msgid "Revision Control" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:52 +msgctxt "Menu subcategory of Development" +msgid "Translation" +msgstr "అనువాదం" + +#: ../src/plugins/menu-spec-common.c:53 +msgctxt "Menu subcategory of Development" +msgid "Web Development" +msgstr "జాల వికాసం" + +#. TRANSLATORS: this is the menu spec main category for Education +#: ../src/plugins/menu-spec-common.c:55 +msgid "Education" +msgstr "విద్య" + +#: ../src/plugins/menu-spec-common.c:56 +msgctxt "Menu subcategory of Education" +msgid "Art" +msgstr "కళ" + +#: ../src/plugins/menu-spec-common.c:57 +msgctxt "Menu subcategory of Education" +msgid "Artificial Intelligence" +msgstr "కృత్రిమ జ్ఞానం" + +#: ../src/plugins/menu-spec-common.c:58 +msgctxt "Menu subcategory of Education" +msgid "Astronomy" +msgstr "ఖగోళశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:59 +msgctxt "Menu subcategory of Education" +msgid "Biology" +msgstr "జీవశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:60 +msgctxt "Menu subcategory of Education" +msgid "Chemistry" +msgstr "రసాయనశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:61 +msgctxt "Menu subcategory of Education" +msgid "Computer Science" +msgstr "కంప్యూటరు విజ్ఞానశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:62 +msgctxt "Menu subcategory of Education" +msgid "Construction" +msgstr "నిర్మాణం" + +#: ../src/plugins/menu-spec-common.c:63 +msgctxt "Menu subcategory of Education" +msgid "Data Visualization" +msgstr "దత్తాంశ దృశ్యమానం" + +#: ../src/plugins/menu-spec-common.c:64 +msgctxt "Menu subcategory of Education" +msgid "Economy" +msgstr "ఆర్థికశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:65 +msgctxt "Menu subcategory of Education" +msgid "Electricity" +msgstr "విద్యుత్" + +#: ../src/plugins/menu-spec-common.c:66 +msgctxt "Menu subcategory of Education" +msgid "Electronics" +msgstr "ఎలక్ట్రానిక్స్" + +#: ../src/plugins/menu-spec-common.c:67 +msgctxt "Menu subcategory of Education" +msgid "Engineering" +msgstr "ఇంజనీరింగు" + +#: ../src/plugins/menu-spec-common.c:68 +msgctxt "Menu subcategory of Education" +msgid "Geography" +msgstr "భౌగోళికశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:69 +msgctxt "Menu subcategory of Education" +msgid "Geology" +msgstr "భూగర్భశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:70 +msgctxt "Menu subcategory of Education" +msgid "Geoscience" +msgstr "భూవిజ్ఞానశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:71 +msgctxt "Menu subcategory of Education" +msgid "History" +msgstr "చరిత్ర" + +#: ../src/plugins/menu-spec-common.c:72 +msgctxt "Menu subcategory of Education" +msgid "Humanities" +msgstr "మానవశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:73 +msgctxt "Menu subcategory of Education" +msgid "Image Processing" +msgstr "బొమ్మ ప్రక్రియాపనం" + +#: ../src/plugins/menu-spec-common.c:74 +msgctxt "Menu subcategory of Education" +msgid "Languages" +msgstr "భాషలు" + +#: ../src/plugins/menu-spec-common.c:75 +msgctxt "Menu subcategory of Education" +msgid "Literature" +msgstr "సాహిత్యం" + +#: ../src/plugins/menu-spec-common.c:76 +msgctxt "Menu subcategory of Education" +msgid "Maps" +msgstr "పటాలు" + +#: ../src/plugins/menu-spec-common.c:77 +msgctxt "Menu subcategory of Education" +msgid "Math" +msgstr "గణితం" + +#: ../src/plugins/menu-spec-common.c:78 +msgctxt "Menu subcategory of Education" +msgid "Medical" +msgstr "వైద్యశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:79 +msgctxt "Menu subcategory of Education" +msgid "Music" +msgstr "సంగీతం" + +#: ../src/plugins/menu-spec-common.c:80 +msgctxt "Menu subcategory of Education" +msgid "Numerical Analysis" +msgstr "సాంఖ్యిక విశ్లేషణ" + +#: ../src/plugins/menu-spec-common.c:81 +msgctxt "Menu subcategory of Education" +msgid "Parallel Computing" +msgstr "సమాంతర సంగణనం" + +#: ../src/plugins/menu-spec-common.c:82 +msgctxt "Menu subcategory of Education" +msgid "Physics" +msgstr "భౌతికశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:83 +msgctxt "Menu subcategory of Education" +msgid "Robotics" +msgstr "రోబోటిక్స్" + +#: ../src/plugins/menu-spec-common.c:84 +msgctxt "Menu subcategory of Education" +msgid "Spirituality" +msgstr "ఆధ్యాత్మికం" + +#: ../src/plugins/menu-spec-common.c:85 +msgctxt "Menu subcategory of Education" +msgid "Sports" +msgstr "క్రీడలు" + +#. TRANSLATORS: this is the menu spec main category for Games +#: ../src/plugins/menu-spec-common.c:87 +msgid "Games" +msgstr "ఆటలు" + +#: ../src/plugins/menu-spec-common.c:88 +msgctxt "Menu subcategory of Games" +msgid "Action" +msgstr "పోరాటం" + +#: ../src/plugins/menu-spec-common.c:89 +msgctxt "Menu subcategory of Games" +msgid "Adventure" +msgstr "సాహసం" + +#: ../src/plugins/menu-spec-common.c:90 +msgctxt "Menu subcategory of Games" +msgid "Arcade" +msgstr "ఆర్కేడ్" + +#: ../src/plugins/menu-spec-common.c:91 +msgctxt "Menu subcategory of Games" +msgid "Blocks" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:92 +msgctxt "Menu subcategory of Games" +msgid "Board" +msgstr "బోర్డు" + +#: ../src/plugins/menu-spec-common.c:93 +msgctxt "Menu subcategory of Games" +msgid "Card" +msgstr "కార్డు" + +#: ../src/plugins/menu-spec-common.c:94 +msgctxt "Menu subcategory of Games" +msgid "Emulators" +msgstr "ఎమ్యులేటర్లు" + +#: ../src/plugins/menu-spec-common.c:95 +msgctxt "Menu subcategory of Games" +msgid "Kids" +msgstr "పిల్లలు" + +#: ../src/plugins/menu-spec-common.c:96 +msgctxt "Menu subcategory of Games" +msgid "Logic" +msgstr "తర్కం" + +#: ../src/plugins/menu-spec-common.c:97 +msgctxt "Menu subcategory of Games" +msgid "Role Playing" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:98 +msgctxt "Menu subcategory of Games" +msgid "Shooter" +msgstr "గురికాడు" + +#: ../src/plugins/menu-spec-common.c:99 +msgctxt "Menu subcategory of Games" +msgid "Simulation" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:100 +msgctxt "Menu subcategory of Games" +msgid "Sports" +msgstr "క్రీడలు" + +#: ../src/plugins/menu-spec-common.c:101 +msgctxt "Menu subcategory of Games" +msgid "Strategy" +msgstr "వ్యూహం" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: ../src/plugins/menu-spec-common.c:103 +msgid "Graphics" +msgstr "రేఖాచిత్రాలు" + +#: ../src/plugins/menu-spec-common.c:104 +msgctxt "Menu subcategory of Graphics" +msgid "2D Graphics" +msgstr "2D రేఖాచిత్రాలు" + +#: ../src/plugins/menu-spec-common.c:105 +msgctxt "Menu subcategory of Graphics" +msgid "3D Graphics" +msgstr "3D రేఖాచిత్రాలు" + +#: ../src/plugins/menu-spec-common.c:106 +msgctxt "Menu subcategory of Graphics" +msgid "OCR" +msgstr "OCR" + +#: ../src/plugins/menu-spec-common.c:107 +msgctxt "Menu subcategory of Graphics" +msgid "Photography" +msgstr "ఛాయాచిత్రీకరణం" + +#: ../src/plugins/menu-spec-common.c:108 +msgctxt "Menu subcategory of Graphics" +msgid "Publishing" +msgstr "ప్రచురణ" + +#: ../src/plugins/menu-spec-common.c:109 +msgctxt "Menu subcategory of Graphics" +msgid "Raster Graphics" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:110 +msgctxt "Menu subcategory of Graphics" +msgid "Scanning" +msgstr "స్కానింగు" + +#: ../src/plugins/menu-spec-common.c:111 +msgctxt "Menu subcategory of Graphics" +msgid "Vector Graphics" +msgstr "సదిశా రేఖాచిత్రాలు" + +#: ../src/plugins/menu-spec-common.c:112 +msgctxt "Menu subcategory of Graphics" +msgid "Viewer" +msgstr "వీక్షకాలు" + +#. TRANSLATORS: this is the menu spec main category for Network +#: ../src/plugins/menu-spec-common.c:114 +msgid "Internet" +msgstr "అంతర్జాలం" + +#: ../src/plugins/menu-spec-common.c:115 +msgctxt "Menu subcategory of Network" +msgid "Chat" +msgstr "మాటామంతీ" + +#: ../src/plugins/menu-spec-common.c:116 +msgctxt "Menu subcategory of Network" +msgid "Dialup" +msgstr "డయలప్" + +#: ../src/plugins/menu-spec-common.c:117 +msgctxt "Menu subcategory of Network" +msgid "Email" +msgstr "ఈమెయిల్" + +#: ../src/plugins/menu-spec-common.c:118 +msgctxt "Menu subcategory of Network" +msgid "Feed" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:119 +msgctxt "Menu subcategory of Network" +msgid "File Transfer" +msgstr "దస్త్ర బదిలీ" + +#: ../src/plugins/menu-spec-common.c:120 +msgctxt "Menu subcategory of Network" +msgid "Ham Radio" +msgstr "హ్యామ్ రేడియో" + +#: ../src/plugins/menu-spec-common.c:121 +msgctxt "Menu subcategory of Network" +msgid "Instant Messaging" +msgstr "తక్షణ సందేశం" + +#: ../src/plugins/menu-spec-common.c:122 +msgctxt "Menu subcategory of Network" +msgid "IRC Clients" +msgstr "ఐఆర్‌సీ క్లయింట్లు" + +#: ../src/plugins/menu-spec-common.c:123 +msgctxt "Menu subcategory of Network" +msgid "Monitor" +msgstr "మానిటర్" + +#: ../src/plugins/menu-spec-common.c:124 +msgctxt "Menu subcategory of Network" +msgid "News" +msgstr "వార్తలు" + +#: ../src/plugins/menu-spec-common.c:125 +msgctxt "Menu subcategory of Network" +msgid "P2P" +msgstr "P2P" + +#: ../src/plugins/menu-spec-common.c:126 +msgctxt "Menu subcategory of Network" +msgid "Remote Access" +msgstr "సుదూర ప్రాప్తి" + +#: ../src/plugins/menu-spec-common.c:127 +msgctxt "Menu subcategory of Network" +msgid "Telephony" +msgstr "టెలీఫోనీ" + +#: ../src/plugins/menu-spec-common.c:128 +msgctxt "Menu subcategory of Network" +msgid "Video Conference" +msgstr "దృశ్య సమావేశం" + +#: ../src/plugins/menu-spec-common.c:129 +msgctxt "Menu subcategory of Network" +msgid "Web Browser" +msgstr "జాల విహారకం" + +#: ../src/plugins/menu-spec-common.c:130 +msgctxt "Menu subcategory of Network" +msgid "Web Development" +msgstr "జాల వికాసం" + +#. TRANSLATORS: this is the menu spec main category for Office +#: ../src/plugins/menu-spec-common.c:132 +msgid "Office" +msgstr "కార్యాలయం" + +#: ../src/plugins/menu-spec-common.c:133 +msgctxt "Menu subcategory of Office" +msgid "Calendar" +msgstr "క్యాలెండరు" + +#: ../src/plugins/menu-spec-common.c:134 +msgctxt "Menu subcategory of Office" +msgid "Chart" +msgstr "పటం" + +#: ../src/plugins/menu-spec-common.c:135 +msgctxt "Menu subcategory of Office" +msgid "Contact Management" +msgstr "పరిచయాల నిర్వహణ" + +#: ../src/plugins/menu-spec-common.c:136 +msgctxt "Menu subcategory of Office" +msgid "Database" +msgstr "దత్తకోశం" + +#: ../src/plugins/menu-spec-common.c:137 +msgctxt "Menu subcategory of Office" +msgid "Dictionary" +msgstr "నిఘంటువు" + +#: ../src/plugins/menu-spec-common.c:138 +msgctxt "Menu subcategory of Office" +msgid "Email" +msgstr "ఈమెయిల్" + +#: ../src/plugins/menu-spec-common.c:139 +msgctxt "Menu subcategory of Office" +msgid "Finance" +msgstr "ఆర్థికం" + +#: ../src/plugins/menu-spec-common.c:140 +msgctxt "Menu subcategory of Office" +msgid "Flow Chart" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:141 +msgctxt "Menu subcategory of Office" +msgid "PDA" +msgstr "PDA" + +#: ../src/plugins/menu-spec-common.c:142 +msgctxt "Menu subcategory of Office" +msgid "Photography" +msgstr "ఛాయాచిత్రీకరణం" + +#: ../src/plugins/menu-spec-common.c:143 +msgctxt "Menu subcategory of Office" +msgid "Presentation" +msgstr "సమర్పణం" + +#: ../src/plugins/menu-spec-common.c:144 +msgctxt "Menu subcategory of Office" +msgid "Project Management" +msgstr "పరియోజన నిర్వహణ" + +#: ../src/plugins/menu-spec-common.c:145 +msgctxt "Menu subcategory of Office" +msgid "Publishing" +msgstr "ప్రచురణ" + +#: ../src/plugins/menu-spec-common.c:146 +msgctxt "Menu subcategory of Office" +msgid "Spreadsheet" +msgstr "స్ప్రెడ్‌షీట్" + +#: ../src/plugins/menu-spec-common.c:147 +msgctxt "Menu subcategory of Office" +msgid "Viewer" +msgstr "వీక్షకం" + +#: ../src/plugins/menu-spec-common.c:148 +msgctxt "Menu subcategory of Office" +msgid "Word Processor" +msgstr "పద ప్రక్రియపకం" + +#. TRANSLATORS: this is the menu spec main category for Science +#: ../src/plugins/menu-spec-common.c:150 +msgid "Science" +msgstr "విజ్ఞానశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:151 +msgctxt "Menu subcategory of Science" +msgid "Art" +msgstr "కళ" + +#: ../src/plugins/menu-spec-common.c:152 +msgctxt "Menu subcategory of Science" +msgid "Artificial Intelligence" +msgstr "కృత్రిమ జ్ఞానం" + +#: ../src/plugins/menu-spec-common.c:153 +msgctxt "Menu subcategory of Science" +msgid "Astronomy" +msgstr "ఖగోళశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:154 +msgctxt "Menu subcategory of Science" +msgid "Biology" +msgstr "జీవశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:155 +msgctxt "Menu subcategory of Science" +msgid "Chemistry" +msgstr "రసాయనశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:156 +msgctxt "Menu subcategory of Science" +msgid "Computer Science" +msgstr "కంప్యూటరు విజ్ఞానశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:157 +msgctxt "Menu subcategory of Science" +msgid "Construction" +msgstr "నిర్మాణం" + +#: ../src/plugins/menu-spec-common.c:158 +msgctxt "Menu subcategory of Science" +msgid "Data Visualization" +msgstr "దత్తాంశ దృశ్యమానం" + +#: ../src/plugins/menu-spec-common.c:159 +msgctxt "Menu subcategory of Science" +msgid "Economy" +msgstr "ఆర్థికశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:160 +msgctxt "Menu subcategory of Science" +msgid "Electricity" +msgstr "విద్యుత్" + +#: ../src/plugins/menu-spec-common.c:161 +msgctxt "Menu subcategory of Science" +msgid "Electronics" +msgstr "ఎలక్ట్రానిక్స్" + +#: ../src/plugins/menu-spec-common.c:162 +msgctxt "Menu subcategory of Science" +msgid "Engineering" +msgstr "యంత్రశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:163 +msgctxt "Menu subcategory of Science" +msgid "Geography" +msgstr "భౌగోళికశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:164 +msgctxt "Menu subcategory of Science" +msgid "Geology" +msgstr "భూగర్భశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:165 +msgctxt "Menu subcategory of Science" +msgid "Geoscience" +msgstr "భూవిజ్ఞానశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:166 +msgctxt "Menu subcategory of Science" +msgid "History" +msgstr "చరిత్ర" + +#: ../src/plugins/menu-spec-common.c:167 +msgctxt "Menu subcategory of Science" +msgid "Humanities" +msgstr "మానవశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:168 +msgctxt "Menu subcategory of Science" +msgid "Image Processing" +msgstr "బొమ్మ ప్రక్రియాపనం" + +#: ../src/plugins/menu-spec-common.c:169 +msgctxt "Menu subcategory of Science" +msgid "Languages" +msgstr "భాషలు" + +#: ../src/plugins/menu-spec-common.c:170 +msgctxt "Menu subcategory of Science" +msgid "Literature" +msgstr "సాహిత్యం" + +#: ../src/plugins/menu-spec-common.c:171 +msgctxt "Menu subcategory of Science" +msgid "Maps" +msgstr "పటాలు" + +#: ../src/plugins/menu-spec-common.c:172 +msgctxt "Menu subcategory of Science" +msgid "Math" +msgstr "గణితం" + +#: ../src/plugins/menu-spec-common.c:173 +msgctxt "Menu subcategory of Science" +msgid "Medical" +msgstr "వైద్యశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:174 +msgctxt "Menu subcategory of Science" +msgid "Numerical Analysis" +msgstr "సాంఖ్యిక విశ్లేషణ" + +#: ../src/plugins/menu-spec-common.c:175 +msgctxt "Menu subcategory of Science" +msgid "Parallel Computing" +msgstr "సమాంతర సంగణనం" + +#: ../src/plugins/menu-spec-common.c:176 +msgctxt "Menu subcategory of Science" +msgid "Physics" +msgstr "భౌతికశాస్త్రం" + +#: ../src/plugins/menu-spec-common.c:177 +msgctxt "Menu subcategory of Science" +msgid "Robotics" +msgstr "రోబోటిక్స్" + +#: ../src/plugins/menu-spec-common.c:178 +msgctxt "Menu subcategory of Science" +msgid "Spirituality" +msgstr "ఆధ్యాత్మికం" + +#: ../src/plugins/menu-spec-common.c:179 +msgctxt "Menu subcategory of Science" +msgid "Sports" +msgstr "క్రీడలు" + +#. TRANSLATORS: this is the menu spec main category for System +#: ../src/plugins/menu-spec-common.c:181 +msgid "System" +msgstr "వ్యవస్థ" + +#: ../src/plugins/menu-spec-common.c:182 +msgctxt "Menu subcategory of System" +msgid "Emulator" +msgstr "ఎమ్యులేటర్" + +#: ../src/plugins/menu-spec-common.c:183 +msgctxt "Menu subcategory of System" +msgid "File Manager" +msgstr "దస్త్ర నిర్వాహకం" + +#: ../src/plugins/menu-spec-common.c:184 +msgctxt "Menu subcategory of System" +msgid "File System" +msgstr "దస్త్ర వ్యవస్థ" + +#: ../src/plugins/menu-spec-common.c:185 +msgctxt "Menu subcategory of System" +msgid "File Tools" +msgstr "దస్త్ర పనిముట్లు" + +#: ../src/plugins/menu-spec-common.c:186 +msgctxt "Menu subcategory of System" +msgid "Monitor" +msgstr "మానిటర్" + +#: ../src/plugins/menu-spec-common.c:187 +msgctxt "Menu subcategory of System" +msgid "Security" +msgstr "భద్రత" + +#: ../src/plugins/menu-spec-common.c:188 +msgctxt "Menu subcategory of System" +msgid "Terminal Emulator" +msgstr "టెర్మినల్ ఎములేటర్" + +#. TRANSLATORS: this is the menu spec main category for Utility +#: ../src/plugins/menu-spec-common.c:190 +msgid "Utilities" +msgstr "సౌలభ్యాలు" + +#: ../src/plugins/menu-spec-common.c:191 +msgctxt "Menu subcategory of Utility" +msgid "Accessibility" +msgstr "ప్రాపనీయత" + +#: ../src/plugins/menu-spec-common.c:192 +msgctxt "Menu subcategory of Utility" +msgid "Archiving" +msgstr "" + +#: ../src/plugins/menu-spec-common.c:193 +msgctxt "Menu subcategory of Utility" +msgid "Calculator" +msgstr "గణని" + +#: ../src/plugins/menu-spec-common.c:194 +msgctxt "Menu subcategory of Utility" +msgid "Clock" +msgstr "గడియారం" + +#: ../src/plugins/menu-spec-common.c:195 +msgctxt "Menu subcategory of Utility" +msgid "Compression" +msgstr "సంపీడనం" + +#: ../src/plugins/menu-spec-common.c:196 +msgctxt "Menu subcategory of Utility" +msgid "File Tools" +msgstr "దస్త్ర పనిముట్లు" + +#: ../src/plugins/menu-spec-common.c:197 +msgctxt "Menu subcategory of Utility" +msgid "Maps" +msgstr "పటాలు" + +#: ../src/plugins/menu-spec-common.c:198 +msgctxt "Menu subcategory of Utility" +msgid "Spirituality" +msgstr "ఆధ్యాత్మికం" + +#: ../src/plugins/menu-spec-common.c:199 +msgctxt "Menu subcategory of Utility" +msgid "Telephony Tools" +msgstr "టెలీఫోనీ పనిముట్లు" + +#: ../src/plugins/menu-spec-common.c:200 +msgctxt "Menu subcategory of Utility" +msgid "Text Editor" +msgstr "పాఠ్య కూర్పకం" + +#. TRANSLATORS: this is the menu spec main category for Video +#: ../src/plugins/menu-spec-common.c:202 +msgid "Video" +msgstr "దృశ్యకం" + +#: ../src/plugins/menu-spec-common.c:203 +msgctxt "Menu subcategory of Video" +msgid "Editing" +msgstr "కూర్పు" + +#: ../src/plugins/menu-spec-common.c:204 +msgctxt "Menu subcategory of Video" +msgid "Database" +msgstr "దత్తకోశం" + +#: ../src/plugins/menu-spec-common.c:205 +msgctxt "Menu subcategory of Video" +msgid "Disc Burning" +msgstr "డిస్కు కాల్చుట" + +#: ../src/plugins/menu-spec-common.c:206 +msgctxt "Menu subcategory of Video" +msgid "Players" +msgstr "ప్రదర్శకాలు" + +#: ../src/plugins/menu-spec-common.c:207 +msgctxt "Menu subcategory of Video" +msgid "Recorders" +msgstr "రికార్డర్లు" + +#: ../src/plugins/menu-spec-common.c:208 +msgctxt "Menu subcategory of Video" +msgid "TV" +msgstr "టీవీ" + +#: ../src/plugins/menu-spec-common.c:211 +msgctxt "Menu subcategory of Addons" +msgid "Fonts" +msgstr "ఖతులు" + +#: ../src/plugins/menu-spec-common.c:212 +msgctxt "Menu subcategory of Addons" +msgid "Codecs" +msgstr "కోడెక్లు" + +#: ../src/plugins/menu-spec-common.c:213 +msgctxt "Menu subcategory of Addons" +msgid "Input Sources" +msgstr "నివేశ మూలాలు" + +#: ../src/plugins/menu-spec-common.c:214 +msgctxt "Menu subcategory of Addons" +msgid "Language Packs" +msgstr "భాషా ప్యాక్లు" diff --git a/po/th.po b/po/th.po new file mode 100644 index 0000000..be5e4a5 --- /dev/null +++ b/po/th.po @@ -0,0 +1,7000 @@ +# Thai translation for gnome-software. +# Copyright (C) 2013-2016 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-software package. +# Akom Chotiphantawanon , 2013-2016. +# Atirut Wattanamongkol , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2024-11-02 08:47+0000\n" +"PO-Revision-Date: 2024-11-06 18:51+0700\n" +"Last-Translator: Atirut Wattanamongkol \n" +"Language-Team: Thai \n" +"Language: th\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/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "ซอฟต์แวร์" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "ติดตั้งและอัปเดตแอปต่างๆ" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "Software allows you to find and install new apps and system extensions and remove existing installed apps." +msgstr "\"ซอฟต์แวร์\" ช่วยคุณหาและติดตั้งแอปและส่วนขยายของระบบเพิ่มเติม และถอดถอนแอปที่ติดตั้งแล้ว" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and multiple screenshots per app. Apps can be found either " +"through browsing the list of categories or by searching. It also allows you to update your system using an offline update." +msgstr "" +"\"ซอฟต์แวร์\" จัดแสดงแอปที่เด่นและยอดนิยม พร้อมคำบรรยายที่เป็นประโยชน์และภาพหน้าจอหลายภาพต่อแอป คุณสามารถหาแอปผ่านการท่องดูตามหมวดหมู่หรือด้วยการค้นหาก็ได้ " +"นอกจากนี้ ยังให้คุณอัปเดตระบบของคุณโดยใช้การอัปเดตแบบออฟไลน์ได้" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "แผงภาพรวม" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "แผงรายละเอียด" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "แผงรายการติดตั้งแล้ว" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "แผงรายการอัปเดต" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "รายละเอียดของการอัปเดต" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2645 src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "โครงการ GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "ทดสอบคีย์ akmods ใน UEFI ของ Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "ต้องยืนยันตัวตนเพื่อทดสอบคีย์ akmods ใน UEFI ของ Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "ลงทะเบียนคีย์ akmods กับ UEFI ของ Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "ต้องยืนยันตัวตนเพื่อลงทะเบียนคีย์ akmods กับ UEFI ของ Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "ทดสอบคีย์ DKMS ใน UEFI ของ Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "ต้องยืนยันตัวตนเพื่อทดสอบคีย์ DKMS ใน UEFI ของ Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "ลงทะเบียนคีย์ DKMS กับ UEFI ของ Shim" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "ต้องยืนยันตัวตนเพื่อลงทะเบียนคีย์ DKMS กับ UEFI ของ Shim" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "ติดตั้งไฟล์ appstream ในตำแหน่งของระบบ" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "การติดตั้งไฟล์ appstream ในตำแหน่งระบบ" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "รายชื่อของโครงการที่เข้ากันได้" + +#: data/org.gnome.software.gschema.xml:6 +msgid "This is a list of compatible projects we should show such as GNOME, KDE and XFCE." +msgstr "นี่คือรายชื่อของโครงการที่เข้ากันได้ที่เราควรแสดง เช่น GNOME, KDE และ XFCE" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "กำหนดว่าจะจัดการรายการอัปเดตและอัปเกรดใน \"ซอฟต์แวร์\" ของ GNOME หรือไม่" + +#: data/org.gnome.software.gschema.xml:11 +msgid "If disabled, GNOME Software will hide the updates panel, not perform any automatic updates actions or prompt for upgrades." +msgstr "ถ้าปิดใช้ \"ซอฟต์แวร์\" ของ GNOME จะซ่อนแผงรายการอัปเดต ไม่ดำเนินการอัปเดตอัตโนมัติหรือแจ้งให้อัปเกรด" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "ดาวน์โหลดและติดตั้งรายการอัปเดตโดยอัตโนมัติ" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the background, also installing ones that do not require a " +"reboot." +msgstr "ถ้าเปิดใช้ \"ซอฟต์แวร์\" ของ GNOME จะดาวน์โหลดรายการอัปเดตซอฟต์แวร์โดยอัตโนมัติในเบื้องหลัง และติดตั้งรายการอัปเดตที่ติดตั้งได้โดยไม่จำเป็นต้องบูตระบบใหม่" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "แจ้งผู้ใช้เกี่ยวกับซอฟต์แวร์ที่อัปเดตในเบื้องหลัง" + +#: data/org.gnome.software.gschema.xml:21 +msgid "If enabled, GNOME Software notifies the user about updates that happened whilst the user was idle." +msgstr "ถ้าเปิดใช้ \"ซอฟต์แวร์\" ของ GNOME จะแจ้งผู้ใช้เกี่ยวกับการอัปเดตที่เกิดขึ้นในขณะที่ผู้ใช้ไม่ได้ใช้งาน" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "กำหนดว่าจะรีเฟรชโดยอัตโนมัติเมื่อใช้การเชื่อมต่อแบบคิดปริมาณหรือไม่" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even when using a metered connection (eventually downloading " +"some metadata, checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"ถ้าเปิดใช้ \"ซอฟต์แวร์\" ของ GNOME จะทำการรีเฟรชข้อมูลในเบื้องหลังโดยอัตโนมัติถึงแม้ว่าจะใช้การเชื่อมต่อแบบคิดปริมาณ (จะมีการดาวน์โหลดข้อมูลกำกับ ตรวจสอบการอัปเดต " +"ฯลฯ ซึ่งอาจสร้างภาระค่าใช้จ่ายให้กับผู้ใช้)" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "เป็นการเรียกทำงาน \"ซอฟต์แวร์\" ของ GNOME เป็นครั้งแรกหรือไม่" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "แสดงคะแนนดาวถัดจากแอปพลิเคชัน" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "กรองแอปพลิเคชันตามสาขาปริยายที่ตั้งไว้สำหรับระบบระยะไกล" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "แสดงกล่องโต้ตอบคำเตือนก่อนติดตั้งแอปพลิเคชันไม่เสรี" + +#: data/org.gnome.software.gschema.xml:43 +msgid "When non-free applications are installed a warning dialog can be shown. This controls if that dialog is suppressed." +msgstr "ให้แสดงกล่องโต้ตอบคำเตือนก่อนติดตั้งแอปพลิเคชันไม่เสรีได้ ตัวเลือกนี้จะควบคุมว่าจะระงับกล่องโต้ตอบดังกล่าวหรือไม่" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "เวลาที่ตรวจสอบการอัปเดตล่าสุด" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "เวลาที่แจ้งเตือนให้อัปเกรดครั้งล่าสุด" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "เวลาที่แจ้งเตือนให้อัปเดตครั้งล่าสุด" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "เวลาของรายการอัปเดตความปลอดภัยรายการแรก ซึ่งจะล้างหลังจากที่ได้อัปเดตแล้ว" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "เวลาที่อัปเดตครั้งล่าสุด" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but updates to the screenshots may take longer to show to the " +"user. A value of 0 means to never check the server if the image already exists in the cache." +msgstr "" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "เซิร์ฟเวอร์ที่จะใช้สำหรับอ่านบทวิจารณ์แอปพลิเคชัน" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "คะแนนกิจกรรมต่ำสุดสำหรับบทวิจารณ์" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "บทวิจารณ์ที่มีกิจกรรมต่ำกว่าค่านี้จะไม่แสดง" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "รายชื่อคลังซอฟต์แวร์ที่เป็นทางการที่จะไม่ถือเป็นบุคคลที่สาม" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "รายชื่อคลังซอฟต์แวร์ที่จำเป็นซึ่งไม่สามารถปิดใช้หรือลบออกได้" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "รายชื่อคลังซอฟต์แวร์ที่เป็นทางการที่จะถือเป็นซอฟต์แวร์เสรี" + +#: data/org.gnome.software.gschema.xml:98 +msgid "The licence URL to use when an application should be considered free software" +msgstr "URL สัญญาอนุญาตที่จะใช้เมื่อต้องการถือว่าแอปพลิเคชันเป็นซอฟต์แวร์เสรี" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "ติดตั้งแอปพลิเคชันที่แถมมาให้กับผู้ใช้ทุกคนในระบบเท่าที่จะเป็นไปได้" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "อนุญาตให้เข้าถึงกล่องโต้ตอบ “คลังซอฟต์แวร์”" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "เสนอการอัปเกรดสำหรับรุ่นก่อนเผยแพร่จริง" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "แสดงองค์ประกอบ UI บางส่วนที่แจ้งผู้ใช้ว่าแอปนั้นไม่เสรี" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "แสดงขนาดที่ติดตั้งสำหรับแอปต่างๆ ในรายชื่อแอปพลิเคชันที่ติดตั้ง" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://th.wikipedia.org/wiki/ซอฟต์แวร์จำกัดสิทธิ์'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI ที่อธิบายเกี่ยวกับซอฟต์แวร์ไม่เสรีและซอฟต์แวร์กรรมสิทธิ์" + +#: data/org.gnome.software.gschema.xml:127 +msgid "A list of URLs pointing to appstream files that will be downloaded into an swcatalog folder" +msgstr "รายชื่อ URL ที่ชี้ไปยังไฟล์ appstream ที่จะดาวน์โหลดลงในโฟลเดอร์ swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If false, files are installed in non-standard $XDG_DATA_HOME/" +"swcatalog/xml directory" +msgstr "" +"ติดตั้งไฟล์ AppStream ลงในตำแหน่งที่ตั้งทั่วทั้งระบบให้กับผู้ใช้ทุกคน ถ้าเป็น false ไฟล์จะถูกติดตั้งลงในไดเรกทอรี $XDG_DATA_HOME/swcatalog/xml ซึ่งไม่เป็นมาตรฐาน" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats listed first. An empty array means the default order. " +"Omitted formats are assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, snap. The formats can be optionally " +"specified with an origin name, divided by a colon, for example 'flatpak:flathub'." +msgstr "" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "เวลาของการพยายามลบรันไทม์ Flatpak ที่ไม่ได้ใช้แล้วออกครั้งล่าสุด" + +#: data/org.gnome.software.gschema.xml:143 +msgid "Set to 'true' to show only freely licensed apps and hide any proprietary apps." +msgstr "" + +#: data/org.gnome.software.gschema.xml:147 +msgid "Set to 'true' to show only apps from developers whose identity has been verified." +msgstr "" + +#: data/org.gnome.software.gschema.xml:151 +#, fuzzy +msgid "The timestamp of the last received historical updates." +msgstr "เวลาของรายการอัปเดตความปลอดภัยรายการแรก ซึ่งจะล้างหลังจากที่ได้อัปเดตแล้ว" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "เครื่องมือติดตั้งแบบทั้งระบบของ GNOME Software AppStream" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "วิเคราะห์อาร์กิวเมนต์ในบรรทัดคำสั่งไม่สำเร็จ" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "คุณต้องกำหนดชื่อไฟล์แค่ชื่อเดียว" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "โปรแกรมนี้ใช้ได้โดยผู้ใช้สิทธิ์ขั้นสูงเท่านั้น" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "ตรวจสอบความเหมาะสมของประเภทเนื้อหาไม่สำเร็จ: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "ย้ายไม่สำเร็จ: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "ติดตั้งซอฟต์แวร์" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "ติดตั้งซอฟต์แวร์ที่เลือกลงในระบบ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "ความรุนแรงในฉากการ์ตูน" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "ไม่มีข้อมูลเกี่ยวกับความรุนแรงในฉากการ์ตูน" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "ความรุนแรงในฉากแฟนตาซี" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "ไม่มีข้อมูลเกี่ยวกับความรุนแรงในฉากแฟนตาซี" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "ความรุนแรงสมจริง" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "ไม่มีข้อมูลเกี่ยวกับความรุนแรงสมจริง" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "ความรุนแรงที่สื่อถึงการนองเลือด" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "ไม่มีข้อมูลเกี่ยวกับความรุนแรงที่สื่อถึงการนองเลือด" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "ความรุนแรงทางเพศ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "ไม่มีข้อมูลเกี่ยวกับความรุนแรงทางเพศ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "แอลกอฮอล์" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างถึงแอลกอฮอล์" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "ยาเสพติด" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างถึงยาเสพติด" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "ยาสูบ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างถึงผลิตภัณฑ์ยาสูบ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "การเปลือยกาย" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "ไม่มีข้อมูลเกี่ยวกับการเปลือยกายทุกประเภท" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "หัวข้อเรื่องเพศ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างหรือการสื่อถึงธรรมชาติทางเพศ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "ถ้อยคำหยาบคาย" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "ไม่มีข้อมูลเกี่ยวกับถ้อยคำหยาบคายทุกประเภท" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "มุกตลกที่ไม่เหมาะสม" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "ไม่มีข้อมูลเกี่ยวกับมุกตลกที่ไม่เหมาะสม" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "การเหยียดหยาม" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "ไม่มีข้อมูลเกี่ยวกับการใช้ภาษาเชิงเหยียดหยามทุกประเภท" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "การโฆษณา" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "ไม่มีข้อมูลเกี่ยวกับการโฆษณาทุกประเภท" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "การพนัน" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "ไม่มีข้อมูลเกี่ยวกับการพนันทุกประเภท" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "การซื้อของ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "ไม่มีข้อมูลเกี่ยวกับความสามารถในการใช้จ่ายเงิน" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "การสนทนากันระหว่างผู้ใช้" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "ไม่มีข้อมูลเกี่ยวกับช่องทางสนทนากับผู้ใช้คนอื่นๆ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "การสนทนากันด้วยเสียงระหว่างผู้ใช้" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "ไม่มีข้อมูลเกี่ยวกับช่องทางพูดคุยกับผู้ใช้คนอื่นๆ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "รายละเอียดการติดต่อ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "No information regarding sharing of social network usernames or email addresses" +msgstr "ไม่มีข้อมูลเกี่ยวกับการแบ่งปันชื่อผู้ใช้หรือที่อยู่อีเมลที่ใช้ในเครือข่ายโซเชียล" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "ข้อมูลระบุตัวตน" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "ไม่มีข้อมูลเกี่ยวกับการแบ่งปันข้อมูลผู้ใช้กับบุคคลที่สาม" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "การแบ่งปันที่ตั้ง" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "ไม่มีข้อมูลเกี่ยวกับการแบ่งปันที่ตั้งทางกายภาพกับผู้ใช้คนอื่นๆ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "การรักร่วมเพศ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างถึงการรักร่วมเพศ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "การค้าประเวณี" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างถึงการค้าประเวณี" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "การคบชู้" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างถึงการคบชู้" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "ตัวละครที่เป็นวัตถุทางเพศ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "ไม่มีข้อมูลเกี่ยวกับตัวละครที่เป็นวัตถุทางเพศ" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "การดูหมิ่น" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างถึงการดูหมิ่น" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "ซากศพมนุษย์" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "ไม่มีข้อมูลเกี่ยวกับซากศพของมนุษย์ที่ตายแล้วซึ่งสามารถมองเห็นได้" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "ระบบทาส" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "ไม่มีข้อมูลเกี่ยวกับการอ้างถึงระบบทาส" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "ไม่มีการอ้างถึงยาเสพติด" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "Does not include swearing, profanity, and other kinds of strong language" +msgstr "ไม่มีถ้อยคำสบถ หยาบคาย รวมถึงถ้อยคำรุนแรงทุกประเภท" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "ไม่มีโฆษณาหรือธุรกรรมทางการเงิน" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "ไม่มีประเด็นเกี่ยวกับเพศหรือการเปลือยกาย" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "ไม่มีฟังก์ชันเกี่ยวกับการแช็ตที่ไม่สามารถควบคุมได้" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "ไม่มีความรุนแรง" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "ยาเสพติด" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "ถ้อยคำรุนแรง" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "เงิน" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "โซเชียล" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "ความรุนแรง" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "ทุกวัย" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s มีการจัดระดับอายุที่ไม่รู้จัก" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s เหมาะสำหรับทุกคน" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s เหมาะสำหรับเด็กเล็ก" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s เหมาะสำหรับเด็กอายุน้อย" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s เหมาะสำหรับเด็ก" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s เหมาะสำหรับวัยรุ่น" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s เหมาะสำหรับผู้ใหญ่" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s เหมาะสำหรับ %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "การจัดระดับอายุ" + +#: src/gs-age-rating-context-dialog.ui:61 src/gs-hardware-support-context-dialog.ui:63 src/gs-safety-context-dialog.ui:126 +msgid "_How to contribute missing information" +msgstr "_วิธีการร่วมให้ข้อมูลที่ยังขาดไป" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "ไฟล์ในเครื่อง" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "แพคเกจ" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "รออยู่" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:408 +msgid "Pending install" +msgstr "รอติดตั้ง" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:415 +msgid "Pending remove" +msgstr "รอถอดถอน" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:396 +msgid "Installing" +msgstr "กำลังติดตั้ง" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "กำลังถอดถอน" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:401 src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "กำลังดาวน์โหลด" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:307 src/gs-details-page.c:1061 src/gs-details-page.c:1096 src/gs-details-page.ui:243 +#: src/gs-page.c:425 plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_ติดตั้ง" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1181 +msgid "_Uninstall…" +msgstr "_ถอนการติดตั้ง…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "เครือข่าย" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "สามารถสื่อสารผ่านเครือข่ายได้" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "บริการระบบ" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "สามารถเข้าถึงบริการ D-Bus บนบัสระบบได้" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "บริการวาระ" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "สามารถเข้าถึงบริการ D-Bus บนบัสวาระได้" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "อุปกรณ์" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "สามารถเข้าถึงอุปกรณ์ต่างๆ เช่น เว็บแคมได้" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "สามารถเข้าถึงอุปกรณ์อินพุต" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "สามารถเข้าถึงไมโครโฟน" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "สามารถเข้าถึงไฟล์อุปกรณ์ระบบ" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "เนื้อหาหน้าจอ" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "สามารถเข้าถึงเนื้อหาหน้าจอ" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "โฟลเดอร์บ้าน" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "สามารถดู แก้ไข และสร้างไฟล์" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "สามารถดูไฟล์" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "ระบบไฟล์" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "โฟลเดอร์ดาวน์โหลด" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "การตั้งค่า" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "สามารถดูและเปลี่ยนแปลงการตั้งค่าต่างๆ ได้" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "ระบบดิสเพลย์ดั้งเดิม" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "ใช้ระบบดิสเพลย์ตัวเก่าซึ่งไม่ปลอดภัย" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "หลบเลี่ยงแซนด์บอกซ์" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "สามารถหลบเลี่ยงแซนด์บอกซ์และหลบหลีกข้อจำกัดอื่นๆ ได้" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "ไม่มีรายละเอียดการอัปเดต" + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "รายละเอียดการอัปเดต" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "ต้องการสิทธิ์เพิ่มเติม" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "บทวิจารณ์" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "ไม่พบบทวิจารณ์ใดสำหรับแอปนี้" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "ไม่มีบทวิจารณ์" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "ประวัติรุ่น" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "สิ่งใหม่ในรุ่น %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "รุ่น %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "ไม่มีรายละเอียดสำหรับรุ่นนี้" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:66 +msgid "%e %B %Y" +msgstr "%e %B %Ey" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"โหมดเริ่มทำงาน: เป็นค่า ‘updates’ (รายการอัปเดต), ‘updated’ (รายการอัปเดตแล้ว), ‘installed’ (รายการติดตั้งแล้ว) หรือ ‘overview’ (ภาพรวม) " +"อย่างใดอย่างหนึ่ง" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "โหมด" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "ค้นหาแอปพลิเคชัน" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "คำค้น" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "แสดงรายละเอียดของแอปพลิเคชัน (โดยใช้ ID แอปพลิเคชัน)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "แสดงรายละเอียดของแอปพลิเคชัน (โดยใช้ชื่อแพคเกจ)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "ชื่อแพคเกจ" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "ติดตั้งแอปพลิเคชัน (โดยใช้ ID แอปพลิเคชัน)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "ถอนการติดตั้งแอปพลิเคชัน (โดยใช้ ID แอปพลิเคชัน)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "เปิดไฟล์แพคเกจในเครื่อง" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "ชื่อไฟล์" + +#: src/gs-application.c:138 +msgid "The kind of interaction expected for this action: either ‘none’, ‘notify’, or ‘full’" +msgstr "" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "" + +#: src/gs-application.c:143 +msgid "Enable verbose debugging output (from the running instance, if already running)" +msgstr "" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "ติดตั้งรายการอัปเดตที่รอค้างอยู่ในเบื้องหลัง" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "แสดงการปรับแต่ง" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "ออกจากอินสแตนซ์ที่กำลังทำงานอยู่" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "พยายามใช้แหล่งไฟล์ในเครื่องก่อนใช้ AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "แสดงเลขรุ่น" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 GNOME Software contributors" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Akom Chotiphantawanon\n" +"Aefgh Threenine\n" +"Atirut Wattanamongkol" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "โทษที! ไม่มีรายละเอียดสำหรับแอปนั้น" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "ขนาดเมื่อติดตั้งแล้ว" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "รวมข้อมูล %s และแคช %s" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "รวมข้อมูล %s" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "รวมแคช %s" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "ไม่ทราบการใช้แคชและข้อมูล" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "ขนาดดาวน์โหลด" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "ไม่จำเป็นต้องดาวน์โหลดระบบเพิ่มเติม" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "ต้องการขนาดที่ไม่ทราบของการดาวน์โหลดระบบเพิ่มเติม" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "ต้องการดาวน์โหลดระบบเพิ่มเติม %s" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "ไม่ทราบขนาด" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "ไม่มีการขอสิทธิ์" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "มีการเข้าถึงเครือข่าย" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "ใช้บริการระบบ" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "ใช้บริการวาระ" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "สามารถเข้าถึงอุปกรณ์ฮาร์ดแวร์" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "สามารถเข้าถึงอุปกรณ์ระบบ" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "สามารถอ่าน/เขียนข้อมูลทั้งหมดของคุณ" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "สามารถอ่านข้อมูลทั้งหมดของคุณ" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "สามารถอ่าน/เขียนรายการดาวน์โหลดของคุณ" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "สามารถอ่านรายการดาวน์โหลดของคุณ" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "สามารถเข้าถึงไฟล์บางไฟล์ได้" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "สามารถเข้าถึงและเปลี่ยนการตั้งค่าผู้ใช้" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "ใช้ระบบหน้าต่างแบบดั้งเดิม" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "สามารถเข้าถือสิทธิ์แบบไม่เฉพาะเจาะจง" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "ผู้พัฒนาซอฟต์แวร์ผ่านการตรวจสอบแล้ว" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "ตรวจสอบโดยผู้จัดจำหน่ายระบบปฏิบัติการแล้ว" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "ตรวจสอบโดย %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "ให้บริการโดยบุคคลที่สาม" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "ซอฟต์แวร์ไม่มีการสนับสนุนแล้ว" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "โค้ดตรวจสอบได้" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "ไม่ทราบสัญญาอนุญาต" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "โค้ดกรรมสิทธิ์" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "สัญญาอนุญาตพิเศษ" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "สิทธิพิเศษ" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "ปลอดภัย" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "น่าจะปลอดภัย" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "อาจจะไม่ปลอดภัย" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "ไม่ปลอดภัย" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "มือถือเท่านั้น" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "ใช้งานได้บนหน้าจอขนาดเล็กเท่านั้น" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "คอมพิวเตอร์ตั้งโต๊ะเท่านั้น" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "ใช้งานได้เฉพาะบนหน้าจอขนาดใหญ่เท่านั้น" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "ขนาดหน้าจอไม่ตรงกัน" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "ไม่รองรับขนาดหน้าจอปัจจุบันของคุณ" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "ต้องใช้หน้าจอสัมผัส" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "ต้องใช้แป้นพิมพ์" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "ต้องใช้เมาส์" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "ต้องใช้เกมแพด" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "ต้องใช้เกมแพดในการเล่น" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "ปรับตัวได้" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "ใช้งานได้บนโทรศัพท์ แท็บเล็ต และคอมพิวเตอร์ตั้งโต๊ะ" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "อาจต้องใช้แป้นพิมพ์หรือเมาส์" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "ใช้งานได้บนคอมพิวเตอร์ตั้งโต๊ะและแล็ปท็อป" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "ไม่มีเนื้อหาที่ไม่เหมาะสมกับวัย" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "ไม่มีข้อมูลการจัดระดับอายุ" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "เยี่ยมชมเว็บไซต์" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "ติดตั้ง…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "ยกเลิก" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "ติดตั้ง" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "ดาวน์โหลด" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "อัปเดต" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "ถอนการติดตั้ง…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "กำลังถอนการติดตั้ง" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "รายการอัปเดตสำคัญ" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "อุปกรณ์ไม่สามารถใช้งานได้ในระหว่างอัปเดต" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "แหล่งที่มา: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "เปลี่ยนชื่อจาก %s แล้ว" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +msgid "Stopped Receiving Updates" +msgstr "หยุดรับรายการอัปเดตแล้ว" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "รายการอัปเดตสำคัญ" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "ติดตั้งแล้ว" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "ช่วยแปล %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get involved and help translate it yourself." +msgstr "" +"%s ถูกออกแบบ พัฒนา และแปลโดยชุมชนผู้มีส่วนร่วมนานาชาติ\n" +"\n" +"นี่หมายความว่าในขณะที่แอปดังกล่าวยังไม่มีให้ใช้ในภาษาของคุณ คุณก็สามารถเข้ามามีส่วนร่วมและช่วยแปลแอปดังกล่าวด้วยตัวคุณเองได้" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "การแปล" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "เว็บไซต์สำหรับการแ_ปล" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "ต้องเข้าสู่ระบบระยะไกล %s (realm %s)" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "ต้องเข้าสู่ระบบ" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:300 src/gs-common.c:752 src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-page.c:708 src/gs-removal-dialog.ui:24 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:251 src/gs-review-dialog.ui:24 src/gs-review-row.c:239 src/gs-review-row.c:263 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "_ยกเลิก" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "เ_ข้าสู่ระบบ" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "ผู้ใช้" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "รหัสผ่าน" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "อื่นๆ" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "ทั้งหมด" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "เด่น" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "คัดสรรโดยบรรณาธิการ" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "ใหม่และอัปเดตแล้ว" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "คัดสรรจากในเว็บ" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "ซอฟต์แวร์อื่นๆ" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "ติดตั้ง %s แล้ว" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "ต้องรีสตาร์ทเพื่อให้การเปลี่ยนแปลงมีผล" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "แอปพร้อมใช้งานแล้ว" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "ติดตั้งรายการอัปเดตระบบแล้ว" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "มีรายการอัปเดตที่ติดตั้งไปเมื่อสักครู่ให้ตรวจดู" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:915 +msgid "Restart" +msgstr "รีสตาร์ท" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "เรียกใช้งาน" + +#. TRANSLATORS: window title +#: src/gs-common.c:234 +msgid "Install Software?" +msgstr "ติดตั้งซอฟต์แวร์หรือไม่?" + +#. TRANSLATORS: window title +#: src/gs-common.c:236 +msgid "Install Third-Party Software?" +msgstr "ติดตั้งซอฟต์แวร์ของบุคคลที่สามหรือไม่?" + +#. TRANSLATORS: window title +#: src/gs-common.c:240 +msgid "Enable Software Repository?" +msgstr "เปิดใช้คลังซอฟต์แวร์หรือไม่?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:242 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "เปิดใช้คลังซอฟต์แวร์ของบุคคลที่สามหรือไม่?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:254 +#, c-format +msgid "" +"%s is not free and open source software, and is provided " +"by “%s”." +msgstr "%s ไม่ใช่ซอฟต์แวร์เสรีและโอเพนซอร์ส และจัดเตรียมโดย “%s”" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:264 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s จัดเตรียมโดย “%s”" + +#: src/gs-common.c:273 +msgid "This software repository must be enabled to continue installation." +msgstr "คลังซอฟต์แวร์นี้ต้องเปิดใช้ก่อนที่จะติดตั้งต่อไป" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:283 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "อาจจะผิดกฎหมายที่จะติดตั้งหรือใช้ %s ในบางประเทศ" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:289 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "อาจจะผิดกฎหมายที่จะติดตั้งหรือใช้ตัวอ่าน-ลงรหัสนี้ในบางประเทศ" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:303 +msgid "Don’t _Warn Again" +msgstr "ไ_ม่ต้องเตือนอีก" + +#. TRANSLATORS: button text +#: src/gs-common.c:312 +msgid "Enable and _Install" +msgstr "เปิดใช้แล้ว_ติดตั้ง" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:519 +msgid "Detailed errors from the package manager follow:" +msgstr "ข้อผิดพลาดโดยละเอียดจากโปรแกรมจัดการแพคเกจมีดังต่อไปนี้:" + +#: src/gs-common.c:526 src/gs-common.c:663 src/gs-safety-context-dialog.ui:67 src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "รายละเอียด" + +#. TRANSLATORS: button text +#: src/gs-common.c:575 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_ปิด" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:744 +msgid "_Accept" +msgstr "_ยอมรับ" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:890 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "ติดตั้งรายการอัปเดตแล้ว" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:900 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "ถอนการติดตั้งแอปแล้ว" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:906 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "ต้องรีสตาร์ทเพื่อให้มีผล" + +#. TRANSLATORS: button text +#: src/gs-common.c:913 +msgid "Not Now" +msgstr "ยังไม่ทำตอนนี้" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1009 +msgid "Just now" +msgstr "เมื่อสักครู่" + +#: src/gs-common.c:1011 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d นาทีก่อน" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ชั่วโมงก่อน" + +#: src/gs-common.c:1019 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d วันก่อน" + +#: src/gs-common.c:1023 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d สัปดาห์ก่อน" + +#: src/gs-common.c:1027 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d เดือนก่อน" + +#: src/gs-common.c:1031 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d ปีก่อน" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1394 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "ทั้งหมด" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "เด่น" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "กราฟิก 3 มิติ" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "การถ่ายภาพ" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "การสแกน" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "กราฟิกแบบเวกเตอร์" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "โปรแกรมดูภาพ" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "การสร้างและตัดต่อเสียง" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "โปรแกรมเล่นเพลง" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "ทั้งหมด" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "เด่น" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "ปฏิทิน" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "ฐานข้อมูล" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "การเงิน" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "โปรแกรมประมวลคำ" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "เครื่องมือแก้ไขข้อความ" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "เว็บเบราว์เซอร์" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "ทั้งหมด" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "เด่น" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "แอคชัน" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "ผจญภัย" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "เกมตู้" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "บล็อก" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "เกมกระดาน" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "ไพ่" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "โปรแกรมจำลอง" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "เด็ก" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "ตรรกะ" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "สวมบทบาท" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "กีฬา" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "แผนการ" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "ทั้งหมด" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "เด่น" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "สนทนา" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "ทั้งหมด" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "เด่น" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "ปัญญาประดิษฐ์" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "ดาราศาสตร์" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "เคมี" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "ภาษา" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "คณิตศาสตร์" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "ข่าว" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "วิทยาการหุ่นยนต์" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "ศิลปะ" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "ชีวประวัติ" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "การ์ตูน" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "บันเทิงคดี" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "สุขภาพ" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "ประวัติศาสตร์" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "วิถีชีวิต" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "การเมือง" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "กีฬา" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "ทั้งหมด" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "เด่น" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "เครื่องมือดีบั๊ก" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "ตัวอ่าน-ลงรหัส" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "ไดรเวอร์ฮาร์ดแวร์" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "แบบอักษร" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "แหล่งป้อนข้อความ" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "ชุดภาษา" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "การแปลภาษาท้องถิ่น" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "สร้าง" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "ทำงาน" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "เล่น" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "เข้าสังคม" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "เรียนรู้" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "พัฒนา" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "ตัวอ่าน-ลงรหัส" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "ไดรเวอร์ฮาร์ดแวร์" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "แบบอักษร" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "แหล่งป้อนข้อความ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "ชุดภาษา" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "การแปลภาษาท้องถิ่น" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "แอป" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s ร้องขอการรองรับฟอร์แมตไฟล์เพิ่มเติม" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "ต้องการชนิด MIME เพิ่มเติม" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s ร้องขอแบบอักษรเพิ่มเติม" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "ต้องการแบบอักษรเพิ่มเติม" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s ร้องขอตัวอ่าน-ลงรหัสสื่อผสมเพิ่มเติม" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "ต้องการตัวอ่าน-ลงรหัสสื่อผสมเพิ่มเติม" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s ร้องขอไดรเวอร์เครื่องพิมพ์เพิ่มเติม" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "ต้องการไดรเวอร์เครื่องพิมพ์เพิ่มเติม" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s ร้องขอแพคเกจเพิ่มเติม" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "ต้องการแพคเกจเพิ่มเติม" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "หาใน “ซอฟต์แวร์”" + +#: src/gs-description-box.c:93 src/gs-description-box.c:342 +msgid "_Show More" +msgstr "แ_สดงเพิ่มเติม" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "แ_สดงน้อยลง" + +#: src/gs-details-page.c:391 +msgid "Removing…" +msgstr "กำลังถอดถอน…" + +#: src/gs-details-page.c:406 +msgid "Requires restart to finish install" +msgstr "ต้องรีสตาร์ทเพื่อติดตั้งให้เสร็จ" + +#: src/gs-details-page.c:413 +msgid "Requires restart to finish remove" +msgstr "ต้องรีสตาร์ทเพื่อถอดถอนให้เสร็จ" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:429 +msgid "Pending installation…" +msgstr "กำลังรอติดตั้ง…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:435 +msgid "Pending update…" +msgstr "กำลังรออัปเดต…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:450 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "กำลังดาวน์โหลด…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:453 +msgid "Preparing…" +msgstr "กำลังเตรียม…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:456 +msgid "Uninstalling…" +msgstr "กำลังถอนการติดตั้ง…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:583 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "ไม่ได้ติดตั้ง %s แต่ยังคงมีข้อมูลอยู่" + +#: src/gs-details-page.c:1078 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_รีสตาร์ท" + +#: src/gs-details-page.c:1084 +msgid "_Enable…" +msgstr "เ_ปิดใช้" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1110 +msgid "_Install…" +msgstr "_ติดตั้ง…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1326 +#, c-format +msgid "%s will appear in US English" +msgstr "%s จะปรากฏเป็นภาษาอังกฤษแบบสหรัฐ" + +#: src/gs-details-page.c:1334 +msgid "This app will appear in US English" +msgstr "แอปนี้จะปรากฏเป็นภาษาอังกฤษแบบสหรัฐ" + +#: src/gs-details-page.c:1336 +msgid "This software will appear in US English" +msgstr "ซอฟต์แวร์นี้จะปรากฏเป็นภาษาอังกฤษแบบสหรัฐ" + +#: src/gs-details-page.c:1371 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "ช่วยแ_ปล" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1436 +#, c-format +msgid "Other Apps by %s" +msgstr "แอปอื่นๆ โดย %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1472 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "ผู้พัฒนา %s ได้พิสูจน์ความเป็นเจ้าของ %s แล้ว" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1475 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "ผู้พัฒนาได้พิสูจน์ความเป็นเจ้าของ %s แล้ว" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1838 +msgid "You need internet access to write a review" +msgstr "คุณต้องมีการเข้าถึงอินเทอร์เน็ตเพื่อเขียนบทวิจารณ์" + +#: src/gs-details-page.c:1939 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "แอปนี้ไม่ได้รับการอัปเดตอีกต่อไปแล้ว รวมถึงการแก้ไขด้านความปลอดภัย" + +#: src/gs-details-page.c:1940 +msgid "This app is already provided by your distribution and should not be replaced." +msgstr "แอปนี้ได้รับการจัดเตรียมไว้แล้วโดยผู้จัดจำหน่ายระบบของคุณและไม่ควรถูกแทนที่" + +#: src/gs-details-page.c:1941 +msgid "This app doesn’t provide any links to a website, code repository or issue tracker." +msgstr "แอปนี้ไม่มีลิงก์ไปยังเว็บไซต์ ที่เก็บโค้ด หรือเครื่องมือติดตามปัญหา" + +#: src/gs-details-page.c:1943 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "ซอฟต์แวร์นี้ไม่ได้รับการอัปเดตอีกต่อไปแล้ว รวมถึงการแก้ไขด้านความปลอดภัย" + +#: src/gs-details-page.c:1944 +msgid "This software is already provided by your distribution and should not be replaced." +msgstr "ซอฟต์แวร์นี้จัดเตรียมโดยชุดจัดแจกของคุณอยู่แล้ว และไม่ควรแทนที่" + +#: src/gs-details-page.c:1945 +msgid "This software doesn’t provide any links to a website, code repository or issue tracker." +msgstr "ซอฟต์แวร์นี้ไม่มีลิงก์ไปยังเว็บไซต์ ที่เก็บโค้ด หรือเครื่องมือติดตามปัญหา" + +#: src/gs-details-page.c:2035 src/gs-details-page.c:2052 +#, c-format +msgid "Software failed to retrieve information for “%s” and is unable to show the details for this app." +msgstr "" + +#: src/gs-details-page.c:2407 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "ไม่สามารถส่งบทวิจารณ์สำหรับ “%s” ได้: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "หน้ารายละเอียด" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "กำลังโหลดรายละเอียดแอป" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "ตรวจสอบแล้ว" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "เ_ปิด" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "ป_รับรุ่น" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "ถอนการติดตั้ง" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "ส่วนเสริม" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "แอปนี้สามารถใช้งานได้เฉพาะเมื่อมีการเชื่อมต่ออินเตอร์เน็ตเท่านั้น" + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "มีคลังซอฟต์แวร์" + +#: src/gs-details-page.ui:679 +msgid "This app includes a software repository which provides updates, as well as access to other software." +msgstr "แอปนี้รวมคลังซอฟต์แวร์ซึ่งให้การอัปเดต รวมถึงการเข้าถึงซอฟต์แวร์อื่นๆ" + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "ไม่มีคลังซอฟต์แวร์" + +#: src/gs-details-page.ui:717 +msgid "This app does not include a software repository. It will not be updated with new versions." +msgstr "แอปนี้ไม่มีคลังซอฟต์แวร์ ดังนั้นจะไม่ได้รับการอัปเดตเป็นรุ่นใหม่" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "ตรวจพบคลังซอฟต์แวร์" + +#: src/gs-details-page.ui:786 +msgid "Adding this software repository will give you access to additional software and upgrades." +msgstr "การเพิ่มคลังซอฟต์แวร์นี้จะทำให้คุณสามารถเข้าถึงซอฟต์แวร์และการอัปเกรดเพิ่มเติมได้" + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "ใช้เฉพาะคลังซอฟต์แวร์ที่คุณเชื่อถือเท่านั้น" + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "ล้างข้อมูลแอป" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "_ลบข้อมูล" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "ไม่มีข้อมูลกำกับ" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "เ_ว็บไซต์โครงการ" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "_บริจาค" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "มีส่วนร่วมแ_ปล" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "_รายงานปัญหา" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "วิ_ธีใช้" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_ติดต่อ" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "เ_ขียนบทวิจารณ์" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "บทวิจารณ์ทั้งหมด" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "ไม่สามารถแสดงรายละเอียดแอปได้" + +#: src/gs-dkms-dialog.c:67 +msgid "Failed to prepare reboot" +msgstr "การเตรียมการรีบูตล้มเหลว" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "ข้อผิดพลาดไม่ทราบสาเหตุ" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "ไม่พบคีย์" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +#, fuzzy +msgid "MOK Enrollment Required" +msgstr "ต้องใช้เมาส์" + +#: src/gs-dkms-dialog.ui:36 +#, fuzzy +msgid "_Next" +msgstr "ถัดไป" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a new machine owner key (MOK) must be enrolled. The process " +"requires a password to be entered later in the process. Please note down the following password associated with the key:" +msgstr "" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "" + +#: src/gs-dkms-dialog.ui:128 +#, fuzzy +msgid "_Restart & Enroll…" +msgstr "เ_ปิดเครื่องใหม่ทันที…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "" + +#: src/gs-dkms-dialog.ui:166 +msgid "After restart, a device setup screen will be shown. To enable new drivers, proceed through the setup steps:" +msgstr "" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "ผลกระทบต่อความปลอดภัย" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the module or any other module will be implicitly trusted. All " +"future updates will happen transparently with no interaction and or authorization." +msgstr "" + +#: src/gs-dkms-dialog.ui:244 +msgid "Further guidance can be found on the docs page." +msgstr "" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "กำลังดาวน์โหลดไฟล์ข้อมูลกำกับเพิ่มเติม…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " และ " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "แบบอักษรที่มีสำหรับอักษร %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "ซอฟต์แวร์ที่มีสำหรับ %s" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "ไม่พบซอฟต์แวร์ที่ร้องขอ" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "ไม่สามารถหาซอฟต์แวร์ที่ร้องขอ" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "ไม่พบ %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "ที่เว็บไซต์" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "ไม่มีแอปที่จัดเตรียมไฟล์ %s" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "Information about %s, as well as options for how to get missing apps might be found %s." +msgstr "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับแอปที่ขาดได้ %s" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "ไม่มีแอปสำหรับรองรับ %s" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "ไม่มี %s" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "Information about %s, as well as options for how to get an app that can support this format might be found %s." +msgstr "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับแอปที่สามารถรองรับฟอร์แมตนี้ได้ %s" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "ไม่มีแบบอักษรสำหรับรองรับอักษร %s" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "Information about %s, as well as options for how to get additional fonts might be found %s." +msgstr "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับแบบอักษรเพิ่มเติมได้ %s" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "ไม่มีส่วนเสริมของตัวอ่าน-ลงรหัสสำหรับรูปแบบ %s" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "Information about %s, as well as options for how to get a codec that can play this format might be found %s." +msgstr "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับตัวอ่าน-ลงรหัสที่สามารถเล่นฟอร์แมตนี้ได้ %s" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "ไม่มีทรัพยากรพลาสมาสำหรับรองรับ %s" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "Information about %s, as well as options for how to get additional Plasma resources might be found %s." +msgstr "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับทรัพยากรพลาสมาเพิ่มเติมได้ %s" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "ไม่มีไดรเวอร์เครื่องพิมพ์สำหรับ %s" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "Information about %s, as well as options for how to get a driver that supports this printer might be found %s." +msgstr "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับไดรเวอร์ที่รองรับเครื่องพิมพ์นี้ได้ %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "เอกสารคู่มือ" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "ไม่พบ %s ตามที่ร้องขอโดย %s กรุณาอ่านข้อมูลเพิ่มเติมที่%s" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "Unable to find the %s you were searching for. Please see %s for more information." +msgid_plural "Unable to find the %s you were searching for. Please see %s for more information." +msgstr[0] "ไม่พบ %s ตามที่คุณค้นหา กรุณาอ่านข้อมูลเพิ่มเติมที่%s" + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "ไม่พบผลการค้นหาใดๆ: %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "ฟอร์แมตไฟล์ %s" + +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "ติดตั้งทั้ง_หมด" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "ไม่สามารถหาซอฟต์แวร์ที่ร้องขอ" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "หน้าของตัวอ่าน-ลงรหัส" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "ไม่พบผลลัพธ์" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "ก่อนหน้า" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "ถัดไป" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "รายชื่อแอปเด่น" + +#: src/gs-hardware-support-context-dialog.c:589 src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "การรองรับคอมพิวเตอร์ตั้งโต๊ะ" + +#: src/gs-hardware-support-context-dialog.c:590 src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "รองรับการใช้บนหน้าจอขนาดใหญ่" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "ไม่ทราบข้อมูลการรองรับคอมพิวเตอร์ตั้งโต๊ะ" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "มีข้อมูลไม่เพียงพอที่จะทราบได้ว่ารองรับหน้าจอขนาดใหญ่หรือไม่" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "จำเป็นต้องใช้หน้าจอขนาดใหญ่" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "ไม่รองรับคอมพิวเตอร์ตั้งโต๊ะ" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "ไม่สามารถใช้บนหน้าจอขนาดใหญ่ได้" + +#: src/gs-hardware-support-context-dialog.c:609 src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "การรองรับมือถือ" + +#: src/gs-hardware-support-context-dialog.c:610 src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "รองรับการใช้บนหน้าจอขนาดเล็ก" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "ไม่ทราบข้อมูลการรองรับมือถือ" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "มีข้อมูลไม่เพียงพอที่จะทราบได้ว่ารองรับหน้าจอขนาดเล็กหรือไม่" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "จำเป็นต้องใช้หน้าจอขนาดเล็ก" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "ไม่รองรับมือถือ" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "ไม่สามารถใช้บนหน้าจอขนาดเล็กได้" + +#: src/gs-hardware-support-context-dialog.c:645 src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "การรองรับแป้นพิมพ์" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "ไม่ทราบข้อมูลการรองรับแป้นพิมพ์" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "มีข้อมูลไม่เพียงพอที่จะทราบได้ว่ารองรับแป้นพิมพ์หรือไม่" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "ต้องใช้แป้นพิมพ์" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "รองรับแป้นพิมพ์" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "ไม่รองรับแป้นพิมพ์" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "ไม่สามารถใช้ร่วมกับแป้นพิมพ์ได้" + +#: src/gs-hardware-support-context-dialog.c:665 src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "การรองรับเมาส์" + +#: src/gs-hardware-support-context-dialog.c:666 src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "จำเป็นต้องใช้เมาส์หรืออุปกรณ์ชี้ตำแหน่ง" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "ไม่ทราบข้อมูลการรองรับเมาส์" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "Not enough information to know if mice or pointing devices are supported" +msgstr "มีข้อมูลไม่เพียงพอที่จะทราบได้ว่ารองรับเมาส์หรืออุปกรณ์ชี้ตำแหน่งหรือไม่" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "ต้องใช้เมาส์" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "รองรับเมาส์และอุปกรณ์ชี้ตำแหน่ง" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "ไม่รองรับเมาส์" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "ไม่สามารถใช้ร่วมกับเมาส์หรืออุปกรณ์ชี้ตำแหน่งได้" + +#: src/gs-hardware-support-context-dialog.c:685 src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "การรองรับจอสัมผัส" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "ไม่ทราบข้อมูลการรองรับจอสัมผัส" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "มีข้อมูลไม่เพียงพอที่จะทราบได้ว่ารองรับจอสัมผัสหรือไม่" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "ต้องใช้จอสัมผัส" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "รองรับจอสัมผัส" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "ไม่รองรับจอสัมผัส" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "ไม่สามารถใช้ร่วมกับจอสัมผัสได้" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "ต้องใช้เกมแพด" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "จำเป็นต้องใช้เกมแพด" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "การรองรับเกมแพด" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "รองรับเกมแพด" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s น่าจะใช้งานได้บนอุปกรณ์นี้" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s ใช้งานได้บนอุปกรณ์นี้" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s อาจใช้งานได้บนอุปกรณ์นี้" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s ใช้งานได้ไม่ดีบนอุปกรณ์นี้" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s ใช้งานไม่ได้บนอุปกรณ์นี้" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "การรองรับฮาร์ดแวร์" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "การนำทาง" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "นำทางไปที่หน้าสำรวจ" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "นำทางไปที่หน้ารายการติดตั้งแล้ว" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "นำทางไปที่หน้ารายการอัปเดต" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "เปิดแถบค้นหา" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "หน้าต่าง" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "เปิดการปรับแต่ง" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "เปิดคลังซอฟต์แวร์" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "วิธีใช้" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "เปิดปุ่มลัดแป้นพิมพ์" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "ติดตั้งแล้ว" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "หน้ารายการติดตั้งแล้ว" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "ดำเนินอยู่" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "แอป" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "เว็บแอป" + +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "แอประบบ" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "สร้างโดยชุมชน" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_มีส่วนร่วม" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"แอปนี้ได้รับการพัฒนาแบบเปิดโดยชุมชนนานาชาติ และเผยแพร่ภายใต้สัญญาอนุญาต %s\n" +"\n" +"คุณสามารถมีส่วนร่วมและช่วยทำให้แอปนี้ดีขึ้นได้" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"แอปนี้ได้รับการพัฒนาแบบเปิดโดยชุมชนนานาชาติ และเผยแพร่ภายใต้สัญญาอนุญาต %s\n" +"\n" +"คุณสามารถมีส่วนร่วมและช่วยทำให้แอปนี้ดีขึ้นได้" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ซอฟต์แวร์นี้ได้รับการพัฒนาแบบเปิดโดยชุมชนนานาชาติ และเผยแพร่ภายใต้สัญญาอนุญาต %s\n" +"\n" +"คุณสามารถมีส่วนร่วมและช่วยทำให้ซอฟต์แวร์นี้ดีขึ้นได้" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"ซอฟต์แวร์นี้ได้รับการพัฒนาแบบเปิดโดยชุมชนนานาชาติ และเผยแพร่ภายใต้สัญญาอนุญาต %s\n" +"\n" +"คุณสามารถมีส่วนร่วมและช่วยทำให้ซอฟต์แวร์นี้ดีขึ้นได้" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "ไม่ทราบสัญญาอนุญาต" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "เ_รียนรู้เพิ่มเติม" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be proprietary. It may be insecure in ways that are hard to " +"detect, and it may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"แอปนี้ไม่ได้ระบุว่าพัฒนาภายใต้สัญญาอนุญาตใด และอาจเป็นกรรมสิทธิ์ แอปอาจไม่ปลอดภัยในลักษณะที่ยากต่อการตรวจจับ และอาจเปลี่ยนแปลงได้โดยไม่มีการควบคุมดูแล\n" +"\n" +"คุณอาจมีส่วนสนับสนุนแอปนี้หรือไม่ก็ได้" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may be proprietary. It may be insecure in ways that are hard " +"to detect, and it may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ซอฟต์แวร์นี้ไม่ได้ระบุว่าพัฒนาภายใต้สัญญาอนุญาตใด และอาจเป็นกรรมสิทธิ์ ซอฟต์แวร์อาจไม่ปลอดภัยในลักษณะที่ยากต่อการตรวจจับ และอาจเปลี่ยนแปลงได้โดยไม่มีการควบคุมดูแล\n" +"\n" +"คุณอาจมีส่วนสนับสนุนซอฟต์แวร์นี้หรือไม่ก็ได้" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "กรรมสิทธิ์" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it works. It may be insecure in ways that are hard to detect, " +"and it may change without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"แอปนี้ไม่ได้รับการพัฒนาแบบเปิด ดังนั้นเฉพาะนักพัฒนาเท่านั้นที่รู้ว่าแอปนี้ทำงานอย่างไร แอปอาจไม่ปลอดภัยในลักษณะที่ตรวจจับได้ยาก และอาจเปลี่ยนแปลงได้เองโดยไม่มีใครดูแล\n" +"\n" +"คุณอาจไม่สามารถมีส่วนสนับสนุนแอปนี้ได้" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how it works. It may be insecure in ways that are hard to " +"detect, and it may change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"ซอฟต์แวร์นี้ไม่ได้รับการพัฒนาแบบเปิด ดังนั้นเฉพาะนักพัฒนาเท่านั้นที่รู้ว่าแอปนี้ทำงานอย่างไร แอปอาจไม่ปลอดภัยในลักษณะที่ตรวจจับได้ยาก " +"และอาจเปลี่ยนแปลงได้เองโดยไม่มีใครดูแล\n" +"\n" +"คุณอาจไม่สามารถมีส่วนสนับสนุนซอฟต์แวร์นี้ได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "สัญญาอนุญาตพิเศษ" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"แอปนี้ได้รับการพัฒนาภายใต้สัญญาอนุญาตพิเศษ %s\n" +"\n" +"คุณอาจหรืออาจไม่สามารถมีส่วนร่วมในแอปนี้ได้" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"แอปนี้ได้รับการพัฒนาภายใต้สัญญาอนุญาตพิเศษ %s\n" +"\n" +"คุณอาจหรืออาจไม่สามารถมีส่วนร่วมในแอปนี้ได้" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ซอฟต์แวร์นี้ได้รับการพัฒนาภายใต้สัญญาอนุญาตพิเศษ %s\n" +"\n" +"คุณอาจหรืออาจไม่สามารถมีส่วนร่วมในซอฟต์แวร์นี้ได้" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"ซอฟต์แวร์นี้ได้รับการพัฒนาภายใต้สัญญาอนุญาตพิเศษ %s\n" +"\n" +"คุณอาจหรืออาจไม่สามารถมีส่วนร่วมในซอฟต์แวร์นี้ได้" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "กำลังรีเฟรชข้อมูล" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "กำลังโหลดหน้า" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "กำลังเริ่มทำงาน" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "ไม่ทราบแหล่ง" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "เบตา" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "เพิ่มเติม" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "ถอดถอน" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "อัปเดต" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "ดาวน์เกรด" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"ให้สิทธิ์เข้าถึงซอฟต์แวร์เพิ่มเติมจาก %s ได้ มีซอฟต์แวร์ที่เป็นกรรมสิทธิ์บางส่วนรวมอยู่ด้วย\n" +"\n" +"คุณสามารถเปิดใช้งานแเหล่านี้ได้ในภายหลังในการตั้งค่าที่เก็บข้อมูลซอฟต์แวร์" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "เปิดใช้คลังซอฟต์แวร์ของบุคคลที่สามหรือไม่?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "เ_พิกเฉย" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "เ_ปิดใช้" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "มีให้ใช้สำหรับระบบปฏิบัติการของคุณ" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "มีให้ใช้สำหรับ %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "สำรวจ" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "หน้าภาพรวม" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "แอปที่มีให้ใช้" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "หมวดอื่นๆ" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "ไม่พบข้อมูลแอป" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "ไม่ทราบ" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_ตกลง" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "เตรียม %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "คุณแน่ใจหรือไม่ว่าต้องการถอดถอนคลังซอฟต์แวร์ %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, c-format +msgid "All apps from %s will be uninstalled, and you will have to re-install the repository to use them again." +msgstr "ทุกแอปจาก %s จะถูกถอนการติดตั้ง และคุณจะต้องติดตั้งคลังซอฟต์แวร์ดังกล่าวใหม่หากต้องการใช้งานอีกครั้ง" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "ถอนการติดตั้ง %s หรือไม่?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "คุณจะไม่สามารถใช้งาน %s ได้หลังจากที่ถอดถอนออกไป" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, c-format +msgid "It will not be possible to use any apps which depend on %s after removal." +msgstr "จะไม่สามารถใช้แอปใดๆ ที่ต้องใช้ %s ได้หลังจากการลบออก" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, c-format +msgid "It will not be possible to use %s after removal, and any documents which use it will appear in a different font." +msgstr "จะไม่สามารถใช้ %s ได้หลังจากลบออก และเอกสารใด ๆ ที่ใช้จะปรากฏด้วยแบบอักษรที่แตกต่างกัน" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, c-format +msgid "It will not be possible to use %s after removal. This may mean some media files will no longer be playable." +msgstr "จะไม่สามารถใช้ %s ได้หลังจากลบออก ซึ่งอาจหมายความว่าไฟล์สื่อบางไฟล์จะไม่สามารถเล่นได้อีกต่อไป" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "Hardware which depends on %s may no longer function correctly after removal." +msgstr "" + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "การตั้งค่าและข้อมูลแอป" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:667 +msgid "_Keep" +msgstr "เ_ก็บไว้" + +#: src/gs-page.c:673 +msgid "Allows restoring app settings and content" +msgstr "ให้เรียกคืนการตั้งค่าและเนื้อหาของแอปได้" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:682 +msgid "_Delete" +msgstr "_ลบ" + +#: src/gs-page.c:688 +msgid "Permanently deletes data to save disk space" +msgstr "ลบข้อมูลถาวรเพื่อประหยัดเนื้อที่ดิสก์" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:696 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will be kept on disk, to allow restoring the app in the future." +msgstr "คุณจะไม่สามารถใช้งาน %s ได้หลังจากที่ถอดถอนออกไป ข้อมูลและการตั้งค่าของแอปจะยังเก็บอยู่ในดิสก์ เพื่อให้สามารถเรียกคืนตัวแอปในอนาคตได้" + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:710 +msgid "_Uninstall" +msgstr "_ถอนการติดตั้ง" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "ปรับแต่ง" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "การอัปเดตซอฟต์แวร์" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "ข้อมูลเพิ่มเติม" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update features are therefore paused when on metered network " +"connections and when power saver is on." +msgstr "" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_อัตโนมัติ" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "ตรวจสอบและดาวน์โหลดรายการอัปเดตโดยอัตโนมัติ" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_ด้วยตนเอง" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "ตรวจสอบและดาวน์โหลดรายการอัปเดตด้วยตนเอง" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "_การแจ้งเตือนการอัปเดตอัตโนมัติ" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "แจ้งเตือนเมื่อมีการติดตั้งรายการอัปเดตโดยอัตโนมัติ" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "ตัวกรองเนื้อหา" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "แสดงเฉพาะซอฟต์แวร์เสรีเท่านั้น" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "Installed software is incompatible with %s, and will be automatically removed during upgrade." +msgstr "" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "ซอฟต์แวร์ที่ไม่เข้ากัน" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "Software that has been installed from “%s” will cease to receive updates." +msgstr "" + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "ต้องการปิดใช้คลังซอฟต์แวร์หรือไม่?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "ต้องการถอดถอนคลังซอฟต์แวร์หรือไม่?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "_ปิดใช้" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:266 +msgid "_Remove" +msgstr "_ถอดถอน" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "เปิดใช้งานคลังซอฟต์แวร์ใหม่" + +#: src/gs-repos-dialog.c:612 +msgid "Turn on new repositories when they are added" +msgstr "เปิดใช้งานคลังซอฟต์แวร์ใหม่เมื่อมีการเพิ่ม" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "ข้อมูลเพิ่มเติม" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "คลังซอฟต์แวร์เพิ่มเติมจากบุคคลที่สามที่เลือก — %s" + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "คลังซอฟต์แวร์บุคคลที่สามจาก Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "ระบบปฏิบัติการ" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "คลังซอฟต์แวร์เหล่านี้เสริมของซอฟต์แวร์เริ่มต้นที่จัดทำโดย %s" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "คลังซอฟต์แวร์" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "ไม่มีคลังซอฟต์แวร์" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "ติดตั้งไว้แล้ว %u แอป" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "ติดตั้งไว้แล้ว %u ส่วนเสริม" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u แอป" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u ส่วนเสริม" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "ติดตั้งไว้แล้ว %sและ %s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "กำลังตรวจสอบซอฟต์แวร์ที่ติดตั้งแล้ว…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "ถอดถอน" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "เกลียด" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "ไม่ชอบ" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "ใช้ได้" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "ชอบ" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "โปรดปราน" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "เลือกดาวเพื่อให้คะแนน" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "กรุณาใช้เวลาเขียนบทวิจารณ์มากกว่านี้" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "กรุณาเลือกคะแนนดาว" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "สรุปสั้นเกินไป" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "สรุปยาวเกินไป" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "คำบรรยายสั้นเกินไป" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "คำบรรยายยาวเกินไป" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "เขียนบทวิจารณ์" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_ส่ง" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used to report problems: instead, contact the developer or " +"your support provider." +msgstr "โปรดให้คะแนน สรุป และข้อความวิจารณ์ ไม่ควรใช้บทวิจารณ์เพื่อรายงานปัญหา แต่ให้ติดต่อผู้พัฒนาหรือผู้ให้บริการสนับสนุนของคุณแทน" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "สรุปบทวิจารณ์" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "เขียนบทวิจารณ์สั้นๆ" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account " +"will be shown publicly." +msgstr "" +"ดูว่าข้อมูลที่อะไรที่จะส่งในนโยบายความเป็นส่วนตัวของเรา ชื่อนามสกุลที่แนบกับบัญชีของคุณจะปรากฏต่อสาธารณะ" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "ทั้งหมด %u บทวิจารณ์" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "จาก 5 ดาว" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:59 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "ไม่ทราบ" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:227 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "คุณสามารถรายงานบทวิจารณ์ที่ไม่เหมาะสม หยาบคาย หรือมีพฤติกรรมเหยียดผู้อื่นได้" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:232 +msgid "Once reported, a review will be hidden until it has been checked by an administrator." +msgstr "บทวิจารณ์ที่ถูกรายงานจะถูกซ่อนไว้ จนกว่าจะได้รับการตรวจสอบโดยผู้ดูแลระบบ" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:237 +msgid "Report Review?" +msgstr "รายงานบทวิจารณ์หรือไม่?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:242 +msgid "_Report" +msgstr "_รายงาน" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:258 +msgid "Remove Review?" +msgstr "ลบบทวิจารณ์หรือไม่?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:261 +msgid "Removing a review cannot be undone." +msgstr "" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "ชอบบทวิจารณ์" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "ไม่ชอบบทวิจารณ์" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "รายงาน…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "ลบออก…" + +#: src/gs-safety-context-dialog.c:154 +msgid "App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "แอปไม่ได้ถูกแซนด์บ็อกซ์ แต่ผู้แจกจ่ายได้ตรวจสอบแล้วว่าไม่เป็นอันตราย" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "ตรวจสอบว่าคุณเชื่อถือผู้จำหน่ายได้หรือไม่ เนื่องจากแอปไม่ได้ถูกแซนด์บ็อกซ์" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "ไม่มีการขอสิทธิ์" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "แอปถูกแซนด์บ็อกซ์อย่างสมบูรณ์" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "การเข้าถึงเครือข่าย" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "สามารถเข้าถึงอินเตอร์เน็ตได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "ไม่มีการเข้าถึงเครือข่าย" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "ไม่สามารถเข้าถึงอินเตอร์เน็ตได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "การใช้บริการของระบบ" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "สามารถขอข้อมูลจากการบริการของระบบได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "ใช้บริการของเซสชั่น" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "สามารถขอข้อมูลจากบริการของเซสชั่นได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "การเข้าถึงอุปกรณ์ของผู้ใช้" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "สามารถเข้าถึงอุปกรณ์ต่างๆ เช่น เว็บแคม หรือตัวควบคุมเกมได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "ไม่มีการเข้าถึงอุปกรณ์ของผู้ใช้" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "ไม่สามารถเข้าถึงอุปกรณ์ต่างๆ เช่น เว็บแคม หรือตัวควบคุมเกมได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "การเข้าถึงอุปกรณ์ป้อนข้อมูล" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "การเข้าถึงไมโครโฟน" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "สามารถฟังโดยใช้ไมโครโฟนได้โดยไม่ต้องขออนุญาต" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "การเข้าถึงอุปกรณ์ระบบ" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "สามารถเข้าถึงอุปกรณ์ระบบที่ต้องมีสิทธิ์ระดับสูงได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "การเข้าถึงเนื้อหาบนหน้าจอ" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "สามารถเข้าถึงเนื้อหาของหน้าจอหรือหน้าต่างอื่นๆได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "ระบบหน้าต่างแบบเก่า" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "สิทธิ์โดยพลการ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "การตั้งค่าของผู้ใช้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "การเข้าถึงอ่าน/เขียนระบบไฟล์แบบเต็มที่" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "สามารถอ่านและเขียนข้อมูลทั้งหมดบนระบบไฟล์ได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "การเข้าถึงอ่าน/เขียนโฟลเดอร์บ้าน" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "สามารถอ่านและเขียนข้อมูลทั้งหมดในไดเรกทอรีบ้านของคุณได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "การเข้าถึงอ่านระบบไฟล์แบบเต็มที่" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "สามารถอ่านข้อมูลทั้งหมดบนระบบไฟล์ได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "การเข้าถึงอ่านโฟลเดอร์บ้าน" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "สามารถอ่านข้อมูลทั้งหมดในไดเรกทอรีบ้านของคุณได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "การเข้าถึงอ่าน/เขียนโฟลเดอร์ดาวน์โหลด" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "สามารถอ่านและเขียนข้อมูลทั้งหมดในไดเรกทอรีดาวน์โหลดของคุณได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "การเข้าถึงอ่านโฟลเดอร์ดาวน์โหลด" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "สามารถอ่านข้อมูลทั้งหมดในไดเรกทอรีดาวน์โหลดของคุณได้" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "สามารถอ่านและเขียนข้อมูลทั้งหมดในไดเรกทอรีได้" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "สามารถอ่านข้อมูลทั้งหมดในไดเรกทอรีได้" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "ไม่มีการเข้าถึงระบบไฟล์" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "ไม่สามารถเข้าถึงระบบไฟล์ได้" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "ผู้พัฒนาแอปได้รับการตรวจสอบแล้ว" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "ผู้พัฒนาแอปนี้ได้รับการยืนยันแล้วว่าเป็นบุคคลที่อ้าง" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "" + +#: src/gs-safety-context-dialog.c:399 +msgid "Software or its dependencies are no longer supported and may be insecure" +msgstr "" + +#: src/gs-safety-context-dialog.c:412 +msgid "This app does not specify what license it is developed under, and may be proprietary" +msgstr "แอปนี้ไม่ได้ระบุว่าได้รับการพัฒนาภายใต้ใบอนุญาตใดและอาจเป็นกรรมสิทธิ์" + +#: src/gs-safety-context-dialog.c:413 +msgid "This software does not specify what license it is developed under, and may be proprietary" +msgstr "ซอฟต์แวร์นี้ไม่ได้ระบุว่าได้รับการพัฒนาภายใต้ใบอนุญาตใดและอาจเป็นกรรมสิทธิ์" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "โค้ดกรรมสิทธิ์" + +#: src/gs-safety-context-dialog.c:427 +msgid "The source code is not public, so it cannot be independently audited and might be unsafe" +msgstr "ซอร์สโค้ดไม่ได้เปิดเผยต่อสาธารณะ ดังนั้นจึงไม่สามารถตรวจสอบได้โดยอิสระ และอาจไม่ปลอดภัย" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "แอปนี้ได้รับการพัฒนาภายใต้ใบอนุญาตพิเศษ “%s”" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "ซอฟต์แวร์นี้ได้รับการพัฒนาภายใต้ใบอนุญาตพิเศษ “%s”" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "โค้ดตรวจสอบได้" + +#: src/gs-safety-context-dialog.c:452 +msgid "The source code is public and can be independently audited, which makes the app more likely to be safe" +msgstr "ซอร์สโค้ดเป็นสาธารณะและสามารถตรวจสอบได้โดยอิสระ ซึ่งทำให้แอปมีแนวโน้มที่จะปลอดภัยมากขึ้น" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s มีสิทธิพิเศษ" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s ปลอดภัย" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s น่าจะปลอดภัย" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s อาจจะไม่ปลอดภัย" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s ไม่ปลอดภัย" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "ไม่ทราบ" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "ความปลอดภัย" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "สัญญาอนุญาต" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "แหล่งที่มา" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might contain bugs or security vulnerabilities which will not be " +"fixed." +msgstr "แอปนี้ใช้แพลตฟอร์มซอฟต์แวร์ (SDK) เวอร์ชันเก่าและอาจมีข้อบกพร่องหรือช่องโหว่ด้านความปลอดภัยที่ไม่ได้รับการแก้ไข" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "ภาพหน้าจอที่แล้ว" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "ภาพหน้าจอถัดไป" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "ไม่มีภาพหน้าจอ" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "ไม่พบภาพหน้าจอ" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "โหลดภาพไม่สำเร็จ" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "ไม่พบขนาดภาพหน้าจอ" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "ไม่สามารถสร้างแคชได้" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "ภาพหน้าจอไม่ถูกต้อง" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "ไม่มีภาพหน้าจอ" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "ภาพหน้าจอ" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "มีที่ตรงกันอีก %u รายการ" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "หน้าค้นหา" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "ค้นหาแอป" + +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "ไม่พบแอป" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "ไม่สามารถดาวน์โหลดรายการอัปเดต" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "ไม่สามารถดาวน์โหลดรายการอัปเดตเฟิร์มแวร์" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "ไม่สามารถดาวน์โหลดรายการอัปเดตเฟิร์มแวร์จาก %s ได้" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "ไม่สามารถดาวน์โหลดรายการอัปเดตจาก %s ได้" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "ไม่สามารถอัปเดต: ต้องใช้การเชื่อมต่ออินเทอร์เน็ต" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "ไม่สามารถอัปเดต: พื้นที่ว่างดิสก์ไม่เพียงพอ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "ไม่สามารถดาวน์โหลดรายการอัปเดตจาก %s ได้: พื้นที่ว่างดิสก์ไม่เพียงพอ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "ไม่สามารถอัปเดต: ต้องยืนยันตัวตน" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "ไม่สามารถอัปเดต: การยืนยันตัวตนไม่ถูกต้อง" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "ไม่สามารถอัปเดต: ต้องมีสิทธิ์" + +#: src/gs-shell.c:1304 +msgid "Unable to download updates: you do not have permission to install software" +msgstr "" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "ไม่สามารถรับรายชื่อการอัปเดต" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "ไม่สามารถติดตั้ง: ดาวน์โหลดล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "ไม่สามารถติดตั้ง %s ได้: การดาวน์โหลดจาก %s ล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "ไม่สามารถติดตั้ง %s ได้: การดาวน์โหลดล้มเหลว" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "ไม่สามารถติดตั้ง: รันไทม์ขาดไป" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "ไม่สามารถติดตั้ง %s ได้: รันไทม์ %s ไม่พร้อมใช้งาน" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "ไม่สามารถติดตั้ง %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "ไม่สามารถติดตั้ง: ต้องใช้การเชื่อมต่ออินเทอร์เน็ต" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "ไม่สามารถติดตั้ง: รูปแบบของแอปไม่ถูกต้อง" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "ไม่สามารถติดตั้ง: พื้นที่ว่างดิสก์ไม่เพียงพอ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "ไม่สามารถติดตั้ง %s ได้: พื้นที่ดิสก์ไม่เพียงพอ" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "ไม่สามารถติดตั้ง: ต้องยืนยันตัวตน" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "ไม่สามารถติดตั้ง %s ได้: ต้องยืนยันตัวตน" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "ไม่สามารถติดตั้ง: การยืนยันตัวตนไม่ถูกต้อง" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "ไม่สามารถติดตั้ง %s ได้: การยืนยันตัวตนไม่ถูกต้อง" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "ไม่สามารถติดตั้ง: ต้องมีสิทธิ์" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "ไม่สามารถติดตั้ง %s ได้: ต้องใช้การเชื่อมต่ออินเทอร์เน็ต" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "ไม่สามารถติดตั้ง: ต้องเสียบปลั๊กไฟอุปกรณ์" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "ไม่สามารถติดตั้ง %s ได้: ต้องเสียบปลั๊กไฟอุปกรณ์" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "ไม่สามารถติดตั้ง: แบตเตอรี่เหลือน้อย" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "ไม่สามารถติดตั้ง %s ได้: แบตเตอรี่เหลือน้อย" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "ไม่สามารถอัปเดต %s จาก %s ได้: ดาวน์โหลดล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "ไม่สามารถอัปเดต %s ได้: การดาวน์โหลดล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "ไม่สามารถติดตั้งอัปเดตจาก %s ได้: ดาวน์โหลดล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "ไม่สามารถอัปเดต: ดาวน์โหลดล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "ไม่สามารถอัปเดต %s ได้: พื้นที่ว่างดิสก์ไม่เพียงพอ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "ไม่สามารถอัปเดต %s ได้: ต้องยืนยันตัวตน" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "ไม่สามารถอัปเดต %s ได้: การยืนยันตัวตนไม่ถูกต้อง" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "ไม่สามารถอัปเดต %s ได้: ต้องมีสิทธิ์" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "ไม่สามารถอัปเดต: ต้องเสียบปลั๊กไฟอุปกรณ์" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "ไม่สามารถอัปเดต %s ได้: ต้องเสียบปลั๊กไฟอุปกรณ์" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "ไม่สามารถอัปเดต: แบตเตอรี่เหลือน้อย" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "ไม่สามารถอัปเดต %s ได้: แบตเตอรี่เหลือน้อย" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "ไม่สามารถอัปเดต %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "ไม่สามารถอัปเดต %s ได้" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "ไม่สามารถอัปเกรด" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "ไม่สามารถอัปเกรด %s จาก %s ได้" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "ไม่สามารถอัปเกรด: ดาวน์โหลดล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "ไม่สามารถอัปเกรด %s ได้: ดาวน์โหลดล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "ไม่สามารถอัปเกรด: ต้องใช้การเชื่อมต่ออินเทอร์เน็ต" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "ไม่สามารถอัปเกรด %s ได้: ต้องใช้การเชื่อมต่ออินเทอร์เน็ต" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "ไม่สามารถอัปเกรด: พื้นที่ว่างดิสก์ไม่เพียงพอ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "ไม่สามารถอัปเกรด %s ได้: พื้นที่ว่างดิสก์ไม่เพียงพอ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "ไม่สามารถอัปเกรด: ต้องยืนยันตัวตน" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "ไม่สามารถอัปเกรด %s ได้: ต้องยืนยันตัวตน" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "ไม่สามารถอัปเกรด: การยืนยันตัวตนไม่ถูกต้อง" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "ไม่สามารถอัปเกรด %s ได้: การยืนยันตัวตนไม่ถูกต้อง" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "ไม่สามารถอัปเกรด: ต้องมีสิทธิ์" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "ไม่สามารถอัปเกรด %s ได้: ต้องมีสิทธิ์" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "ไม่สามารถอัปเกรด: ต้องเสียบปลั๊กไฟอุปกรณ์" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "ไม่สามารถอัปเกรด %s ได้: ต้องเสียบปลั๊กไฟอุปกรณ์" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "ไม่สามารถอัปเกรด: แบตเตอรี่เหลือน้อย" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "ไม่สามารถอัปเกรด %s ได้: แบตเตอรี่เหลือน้อย" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "ไม่สามารถอัปเกรด %s ได้" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "ไม่สามารถถอนการติดตั้ง: ต้องยืนยันตัวตน" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "ไม่สามารถถอนการติดตั้ง %s ได้: ต้องยืนยันตัวตน" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +msgid "Unable to uninstall: invalid authentication" +msgstr "ไม่สามารถถอนการติดตั้งได้: การยืนยันตัวตนไม่ถูกต้อง" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "ไม่สามารถถอนการติดตั้ง %s ได้: การยืนยันตัวตนไม่ถูกต้อง" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "ไม่สามารถถอนการติดตั้ง: ต้องมีสิทธิ์" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "ไม่สามารถถอนการติดตั้ง %s ได้: ต้องมีสิทธิ์" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "ไม่สามารถถอนการติดตั้ง: ต้องเสียบปลั๊กไฟอุปกรณ์" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "ไม่สามารถถอนการติดตั้ง %s ได้: ต้องเสียบปลั๊กไฟอุปกรณ์" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "ไม่สามารถถอนการติดตั้ง: แบตเตอรี่เหลือน้อย" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "ไม่สามารถถอนการติดตั้ง %s ได้: แบตเตอรี่เหลือน้อย" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "ไม่สามารถถอนการติดตั้ง %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "ไม่สามารถเรียกใช้ %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "ขออภัย มีบางอย่างผิดพลาด" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "ไม่สามารถเรียกใช้งาน %s ได้: ไม่ได้ติดตั้ง %s ไว้" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "เนื้อที่ว่างในดิสก์ไม่เพียงพอสำหรับการทำงาน" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "ไม่สามารถติดตั้ง: ไม่รองรับชนิดไฟล์" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "ไม่สามารถติดตั้ง: ยืนยันตัวตนล้มเหลว" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "ไม่สามารถติดตั้ง" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "ไม่สามารถติดต่อ %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "เริ่ม “ซอฟต์แวร์” ใหม่เพื่อใช้ปลั๊กอินตัวใหม่" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "ต้องเสียบปลั๊กอุปกรณ์" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "ระดับแบตเตอรี่ต่ำเกินไป" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "เกี่ยวกับ “ซอฟต์แวร์”" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "_คลังซอฟต์แวร์" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "ปุ่_มลัดแป้นพิมพ์" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_ปรับแต่ง" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "ค้นหา" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "เมนูหลัก" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "ค้นหาแอป" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "สำ_รวจ" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_ติดตั้งแล้ว" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_อัปเดต" + +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "กลับไป" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "ไม่มี" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "ข้อมูลแอป" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "ข้อมูลที่แอปต้องใช้ในการเรียกทำงาน" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "ข้อมูลผู้ใช้" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "ข้อมูลที่คุณสร้างขึ้นภายในแอป" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "ข้อมูลแคช" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "ข้อมูลที่แคชไว้ชั่วคราว" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "ตัวแอปเอง" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "การขึ้นต่อกันที่ต้องการ" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "องค์ประกอบระบบที่ใช้ร่วมกันซึ่งแอปนี้ต้องการ" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "ไม่ทราบ" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "พื้นที่จัดเก็บ" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (ติดตั้งอยู่)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (กำลังติดตั้ง)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (กำลังดาวน์โหลด)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (กำลังถอดถอน)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_รายละเอียด" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_ตรวจสอบ" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "ติดตั้งเมื่อ %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "รายการอัปเดตที่ติดตั้งแล้ว" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "ไม่มีรายการอัปเดตที่ติดตั้งแล้ว" + +#: src/gs-update-monitor.c:215 +msgid "Updates Are Out of Date" +msgstr "รายการอัปเดตล้าสมัย" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "โปรดทำการตรวจหารายการอัปเดต" + +#: src/gs-update-monitor.c:222 +msgid "Critical Updates Ready to Install" +msgstr "รายการอัปเดตที่สำคัญพร้อมติดตั้ง" + +#: src/gs-update-monitor.c:223 +msgid "Install critical updates as soon as possible" +msgstr "ติดตั้งรายการอัปเดตที่สำคัญโดยเร็วที่สุด" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "รายการอัปเดตซอฟต์แวร์ที่สำคัญพร้อมให้ดาวน์โหลด" + +#: src/gs-update-monitor.c:227 +msgid "Download critical updates as soon as possible" +msgstr "ดาวน์โหลดรายการอัปเดตที่สำคัญโดยเร็วที่สุด" + +#: src/gs-update-monitor.c:233 +msgid "Updates Ready to Install" +msgstr "อัปเดตพร้อมติดตั้งแล้ว" + +#: src/gs-update-monitor.c:234 +msgid "Software updates are ready and waiting" +msgstr "รายการอัปเดตซอฟต์แวร์รออยู่และพร้อมสำหรับติดตั้งแล้ว" + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "รายการอัปเดตพร้อมให้ดาวน์โหลด" + +#: src/gs-update-monitor.c:241 +msgid "Software updates can be downloaded" +msgstr "สามารถดาวน์โหลดอัปเดตซอฟต์แวร์ได้" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "อัปเดตแล้ว %u แอป — ต้องรีสตาร์ท" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "อัปเดตแล้ว %u แอป" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "อัปเดต %s แล้ว" + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "โปรดเริ่มแอปใหม่" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "อัปเดต %s และ %s แล้ว" + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "ต้องเริ่มใหม่ %u แอป" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "รวมถึง %s, %s และ %s" + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "ระบบถึงจุดสิ้นสุดอายุการใช้งานแล้ว" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +msgid "Upgrade to continue receiving updates" +msgstr "อัปเกรดเพื่อรับการอัปเดตต่อไป" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s รุ่นใหม่พร้อมให้ติดตั้งแล้ว" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "มีการอัปเดตซอฟต์แวร์" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "อัปเดตซอฟต์แวร์ไม่สำเร็จ" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "Prepared updates were not installed" +msgstr "อัปเดตที่เตรียมไว้ไม่ได้รับการติดตั้ง" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "แสดงรายละเอียด" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "อัปเกรดระบบสำเร็จ" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "ยินดีต้อนรับสู่ %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "ติดตั้งรายการอัปเดตซอฟต์แวร์แล้ว" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "ติดตั้งรายการอัปเดตที่สำคัญของระบบปฏิบัติการสำเร็จแล้ว" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "ทวนดู" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "อัปเดตไม่สำเร็จ" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "ระบบเป็นรุ่นใหม่ล่าสุดแล้ว" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "การอัปเดตถูกยกเลิก" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "Internet access was required but wasn’t available. Please make sure that you have internet access and try again." +msgstr "ต้องใช้การเชื่อมต่ออินเทอร์เน็ต แต่ไม่สามารถใช้ได้ กรุณาตรวจสอบให้แน่ใจว่าคุณมีการเข้าถึงอินเทอร์เน็ตแล้วลองใหม่" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "There were security issues with the update. Please consult your software provider for more details." +msgstr "มีปัญหาด้านความปลอดภัยในอัปเดต กรุณาสอบถามรายละเอียดเพิ่มเติมจากผู้ให้บริการซอฟต์แวร์ของคุณ" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "There wasn’t enough disk space. Please free up some space and try again." +msgstr "เนื้อที่ว่างในดิสก์ไม่เพียงพอ กรุณาคืนเนื้อที่ว่างแล้วลองใหม่" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update and try again. If the problem persists, contact your " +"software provider." +msgstr "ขออภัย: ติดตั้งแพคเกจอัปเดตไม่สำเร็จ กรุณารอการอัปเดตครั้งถัดไปแล้วลองใหม่ ถ้าปัญหายังคงอยู่ กรุณาติดต่อผู้ให้บริการซอฟต์แวร์ของคุณ" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "ตรวจสอบล่าสุด: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "หยุด" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "ตรวจสอบการอัปเดต" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "อาจมีค่าใช้จ่าย" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "Checking for updates while using mobile broadband could cause you to incur charges." +msgstr "การตรวจสอบการอัปเดตขณะใช้บรอดแบนด์มือถืออาจทำให้คุณเสียค่าบริการ" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "ตรวจสอบ_ต่อไป" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "ดาวน์โหลดการอัปเดตซอฟต์แวร์แล้ว" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "อัปเดตพร้อมติดตั้งแล้ว" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "ตรวจสอบการอัปเดต" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "รายการอัปเดต" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "หน้ารายการอัปเดต" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "กำลังโหลดรายการอัปเดตใหม่…" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "อาจใช้เวลาสักครู่" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "เป็นรุ่นล่าสุดแล้ว" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "ใช้ข้อมูลมือถือหรือไม่?" + +#: src/gs-updates-page.ui:232 +msgid "Checking for updates when using mobile broadband could cause you to incur charges" +msgstr "การตรวจสอบการอัปเดตขณะใช้บรอดแบนด์มือถืออาจทำให้คุณเสียค่าบริการ" + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "_ตรวจสอบต่อไป" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "ไม่มีการเชื่อมต่อ" + +#: src/gs-updates-page.ui:255 +msgid "Go online to check for updates" +msgstr "เชื่อมต่ออินเทอร์เน็ตเพื่อตรวจสอบการอัปเดต" + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "ตั้งค่าเ_ครือข่าย" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "ข้อผิดพลาด" + +#: src/gs-updates-page.ui:293 +msgid "Updates are automatically managed" +msgstr "การอัปเดตมีการจัดการโดยอัตโนมัติ" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "การอัปเดตซอฟต์แวร์ถูกหยุดชั่วคราว" + +#: src/gs-updates-paused-banner.c:47 +msgid "Automatic software updates have been paused for the following reasons:\n" +msgstr "การอัปเดตซอฟต์แวร์อัตโนมัติถูกหยุดชั่วคราวเนื่องจากเหตุผลต่อไปนี้:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• การเชื่อมต่อเครือข่ายปัจจุบันมีการวัดการใช้งาน" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• การเชื่อมต่อเครือข่ายปัจจุบันห้ามการดาวน์โหลดขนาดใหญ่" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• โหมดประหยัดพลังงานเปิดใช้งานอยู่" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• โหมดเล่นเกมเปิดใช้งานอยู่" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "การอัปเดตซอฟต์แวร์ถูกหยุดชั่วคราว" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "การเชื่อมต่อเครือข่ายมีการวัดการใช้งาน - การอัปเดตซอฟต์แวร์ถูกหยุดชั่วคราว" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "การเชื่อมต่อเครือข่ายห้ามการดาวน์โหลดขนาดใหญ่ - การอัปเดตซอฟต์แวร์ถูกหยุดชั่วคราว" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "โหมดประหยัดพลังงานเปิดใช้งานอยู่ - การอัปเดตซอฟต์แวร์ถูกหยุดชั่วคราว" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "โหมดเล่นเกมเปิดใช้งานอยู่ - การอัปเดตซอฟต์แวร์ถูกหยุดชั่วคราว" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:321 +msgid "_Restart & Update…" +msgstr "_รีสตาร์ทและอัปเดต…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:327 +msgid "U_pdate All" +msgstr "_อัปเดตทั้งหมด" + +#: src/gs-updates-section.c:404 +msgid "Software Updates Downloaded" +msgstr "ดาวน์โหลดรายการอัปเดตซอฟต์แวร์แล้ว" + +#: src/gs-updates-section.c:405 +msgid "Updates are ready to be installed" +msgstr "อัปเดตพร้อมติดตั้งแล้ว" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:496 +msgid "Integrated Firmware" +msgstr "" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:501 +msgid "Requires Restart" +msgstr "ต้องรีสตาร์ท" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:506 +msgid "App Updates" +msgstr "อัปเดตแอป" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:511 +msgid "Device Firmware" +msgstr "เฟิร์มแวร์อุปกรณ์" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_ดาวน์โหลด" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s มีให้ติดตั้งแล้ว" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s มีให้ติดตั้งแล้ว" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "เรียนรู้เกี่ยวกับรุ่นใหม่" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "ดาวน์โหลดไปแล้ว %s จาก %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "ดาวน์โหลดไปแล้ว %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "การอัปเกรดใหญ่ พร้อมความสามารถใหม่และการปรับปรุงเพิ่มเติม" + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "_รีสตาร์ทและอัปเกรด…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "อย่าลืมสำรองข้อมูลและไฟล์ต่างๆ ก่อนการอัปเกรด" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "ไม่สามารถลบไฟล์ “%s”: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "ไม่สามารถลบไดเรกทอรี “%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "เพิ่ม ลบ หรืออัปเดตซอฟต์แวร์ในคอมพิวเตอร์นี้" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "อัปเดต;อัปเกรด;แหล่งซอฟต์แวร์;คลังซอฟต์แวร์;ปรับแต่ง;ติดตั้ง;ถอดถอน;โปรแกรม;ซอฟต์แวร์;แอป;ร้าน;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "เปิดใช้" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3170 +msgid "System Updates" +msgstr "อัปเดตของระบบ" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3175 +msgid "General system updates, such as security or bug fixes, and performance improvements." +msgstr "การอัปเดตระบบทั่วไป เช่น การแก้ไขความปลอดภัยหรือจุดบกพร่อง และการปรับปรุงประสิทธิภาพ" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "อัปเดตของ %s พร้อมความสามารถและการปรับปรุงใหม่" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "Upgrade for the latest features, performance and stability improvements." +msgstr "อัปเกรดเพื่อรับความสามารถ ประสิทธิภาพการทำงาน และการปรับปรุงเสถียรภาพล่าสุด" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "การรองรับ Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "โฟลเดอร์ระบบ %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "โฟลเดอร์ย่อยบ้าน %s" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "โฟลเดอร์ระบบของโฮสต์" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "การกำหนดค่าของระบบโฮสต์จาก /etc" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "โฟลเดอร์เดสก์ท็อป" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "โฟลเดอร์เดสก์ท็อปย่อย %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "โฟลเดอร์เอกสาร" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "โฟลเดอร์เอกสารย่อย %s" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "โฟลเดอร์เพลง" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "โฟลเดอร์เพลงย่อย %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "โฟลเดอร์รูปภาพ" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "โฟลเดอร์รูปภาพย่อย %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "โฟลเดอร์แชร์สาธารณะ" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "โฟลเดอร์แชร์สาธารณะย่อย %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "โฟลเดอร์วิดีโอ" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "โฟลเดอร์วิดีโอย่อย %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "โฟลเดอร์เทมเพลต" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "โฟลเดอร์เทมเพลตย่อย %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "โฟลเดอร์แคชของผู้ใช้" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "โฟลเดอร์แคชย่อยของผู้ใช้ %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "โฟลเดอร์การกำหนดค่าของผู้ใช้" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "โฟลเดอร์การกำหนดค่าย่อยของผู้ใช้ %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "โฟลเดอร์ข้อมูลของผู้ใช้" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "โฟลเดอร์ข้อมูลของย่อยผู้ใช้ %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "โฟลเดอร์รันไทม์ของผู้ใช้" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "โฟลเดอร์รันไทม์ย่อยของผู้ใช้ %s" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "การเข้าถึงระบบไฟล์ %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "การติดตั้งของผู้ใช้" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "การติดตั้งของระบบ" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "ID ของแอป" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. Remove the filter and repeat the install. Detailed error: %s" +msgstr "รีโมต “%s” ไม่อนุญาตให้ติดตั้ง “%s” โดยอาจเป็นเพราะตัวกรองของรีโมต ลบตัวกรองออกแล้วติดตั้งใหม่ ข้อผิดพลาดโดยละเอียด: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "พลังงานของระบบต่ำเกินไปที่จะดำเนินการอัปเดต" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "พลังงานของระบบต่ำเกินไปที่จะดำเนินการอัปเดต (%u%% ต้องใช้ %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "ไม่สามารถเข้าถึงอุปกรณ์ได้หรืออยู่นอกระยะไร้สาย" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "พลังงานแบตเตอรี่ของอุปกรณ์ต่ำเกินไป" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "พลังงานแบตเตอรี่ของอุปกรณ์ต่ำเกินไป (%u%% ต้องใช้ %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "อุปกรณ์กำลังรอการนำอัปเดตมาใช้" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "อุปกรณ์ต้องเชื่อมต่อไฟฟ้า AC" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "ไม่สามารถใช้งานอุปกรณ์ได้ในขณะที่ฝาปิดอยู่" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:208 +#, c-format +msgid "%s Device Update" +msgstr "อัปเดตอุปกรณ์ %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s System Update" +msgstr "อัปเดตระบบ %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "อัปเดตตัวควบคุมแบบฝังตัว %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s ME Update" +msgstr "อัปเดต ME %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s Corporate ME Update" +msgstr "อัปเดต ME ระดับองค์กร %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Consumer ME Update" +msgstr "อัปเดต ME ระดับผู้บริโภค %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:239 +#, c-format +msgid "%s Controller Update" +msgstr "อัปเดตตัวควบคุม %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:245 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "อัปเดตตัวควบคุม Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "อัปเดตไมโครโค้ด CPU %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s Configuration Update" +msgstr "อัปเดตการกำหนดค่า %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Battery Update" +msgstr "อัปเดตแบตเตอรี่ %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Camera Update" +msgstr "อัปเดตกล้อง %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s TPM Update" +msgstr "อัปเดต TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s Touchpad Update" +msgstr "อัปเดตทัชแพด %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Mouse Update" +msgstr "อัปเดตเมาส์ %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Keyboard Update" +msgstr "อัปเดตแป้นพิมพ์ %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Storage Controller Update" +msgstr "อัปเดตตัวควบคุมการจัดเก็บข้อมูล %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Network Interface Update" +msgstr "อัปเดตอินเทอร์เฟซเครือข่าย %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Display Update" +msgstr "อัปเดตระบบแสดงผล %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s BMC Update" +msgstr "อัปเดต BMC %ss" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s USB Receiver Update" +msgstr "อัปเดตตัวรับ USB %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s Drive Update" +msgstr "อัปเดตไดรฟ์ %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Flash Drive Update" +msgstr "อัปเดตแฟลชไดรฟ์ %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s SSD Update" +msgstr "อัปเดต SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s GPU Update" +msgstr "อัปเดต GPU %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s Dock Update" +msgstr "อัปเดตด็อค %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s USB Dock Update" +msgstr "อัปเดตด็อค USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "เฟิร์มแวร์" + +#: plugins/fwupd/gs-plugin-fwupd.c:1918 +msgid "Firmware update could not be applied: " +msgstr "ไม่สามารถนำการอัปเดตเฟิร์มแวร์ไปใช้ได้:" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "การรองรับการอัปเกรดเฟิร์มแวร์" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "จัดเตรียมการรองรับสำหรับการอัปเกรดเฟิร์มแวร์" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "ติดตั้งซอฟต์แวร์ที่ไม่ได้ลงลายเซ็นไว้หรือไม่?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to verify the origin of updates to this software, or whether " +"updates have been tampered with." +msgstr "" +"ซอฟต์แวร์ที่กำลังจะติดตั้งนั้นไม่ได้มีการลงลายเซ็นไว้ ทำให้ไม่สามารถตรวจสอบที่มาของรายการอัปเดตสำหรับซอฟต์แวร์นี้ " +"หรือตรวจสอบได้ว่ามีบางสิ่งที่เป็นอันตรายในรายการอัปเดตหรือไม่" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "ดาวน์โหลดซอฟต์แวร์ที่ไม่ได้ลงลายเซ็นไว้หรือไม่?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to verify the origin of the update, or whether it has been " +"tampered with." +msgstr "" +"มีรายการอัปเดตที่ไม่ได้ลงลายเซ็นไว้ให้ติดตั้งได้ แต่เนื่องจากไม่มีลายเซ็นรับรอง จึงทำให้ไม่สามารถตรวจสอบที่มาของรายการอัปเดตได้ " +"หรือตรวจสอบได้ว่ามีบางสิ่งที่เป็นอันตรายในรายการอัปเดตหรือไม่" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "อัปเดตซอฟต์แวร์ที่ไม่ได้ลงลายเซ็นไว้หรือไม่?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to verify the origin of the update, or whether it has been " +"tampered with. Software updates will be disabled until unsigned updates are either removed or updated." +msgstr "" +"มีรายการอัปเดตที่ไม่ได้ลงลายเซ็นไว้ให้ติดตั้งได้ แต่เนื่องจากไม่มีลายเซ็นรับรอง จึงทำให้ไม่สามารถตรวจสอบที่มาของรายการอัปเดตได้ " +"หรือตรวจสอบได้ว่ามีบางสิ่งที่เป็นอันตรายในรายการอัปเดตหรือไม่ การอัปเดตซอฟต์แวร์จะถูกปิดใช้จนกว่ารายการอัปเดตที่ไม่ได้ลงลายเซ็นเหล่านั้นจะถูกถอดออกไปหรือถูกปรับปรุงใหม่" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "ติดตั้งรายการอัปเดตไม่สำเร็จ: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "แพคเกจ" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1436 +msgid "Failed to wait on transaction end before download: " +msgstr "" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1443 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1456 +msgid "Failed to download updates: " +msgstr "ไม่สามารถดาวน์โหลดรายการอัปเดตได้: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1495 plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1505 +msgid "Failed to trigger update: " +msgstr "ไม่สามารถเริ่มการอัพเดตได้: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3270 +msgid "Operating System (OSTree)" +msgstr "ระบบปฏิบัติการ (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "การรองรับ Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "snap เป็นแพคเกจ Linux แบบสากล" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "วิธีที่ดีในการจัดการซอฟต์แวร์ในระบบของคุณ" + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "โปรดป้อนตัวเลขจาก 1 ถึง %u: " + +#~ msgid "Choose an app:" +#~ msgstr "เลือกแอป:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s ติดตั้งเสร็จแล้ว" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "ถอดถอนแอปแล้ว" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "ไม่พบ “%s”" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "กำลังดาวน์โหลดแค็ตตาล็อกซอฟต์แวร์" + +#~ msgid "Moderate page" +#~ msgstr "กลั่นกรองเนื้อหา" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "ไม่มีบทวิจารณ์ที่จะกลั่นกรอง" + +#~ msgid "Was this review useful to you?" +#~ msgstr "บทวิจารณ์นี้เป็นประโยชน์กับคุณหรือไม่?" + +#~ msgid "Yes" +#~ msgstr "มี" + +#~ msgid "No" +#~ msgstr "ไม่มี" + +#~ msgid "Meh" +#~ msgstr "กลางๆ" + +#~ msgid "Outdated SDK version" +#~ msgstr "SDK ตกรุ่นแล้ว" + +#~ msgid "Unable to install updates" +#~ msgstr "ไม่สามารถติดตั้งรายการอัปเดต" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "ไม่สามารถถอนการติดตั้ง: การยืนยันตัวตนไม่ถูกต้อง" + +#~ msgid "Network Settings" +#~ msgstr "ตั้งค่าเครือข่าย" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "ไม่มีรายการอัปเดตระบบปฏิบัติการ" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "ติดตั้งรายการอัปเดตที่สำคัญของระบบปฏิบัติการไม่สำเร็จ" + +#~ msgid "No Network" +#~ msgstr "ไม่มีเครือข่าย" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "จำเป็นต้องเข้าถึงอินเทอร์เน็ตเพื่อตรวจสอบการอัปเดต" + +#~ msgid "Network _Settings" +#~ msgstr "_ตั้งค่าเครือข่าย" + +#~ msgid "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "การอัปเกรดซอฟต์แวร์ได้รับการดาวน์โหลดและพร้อมที่จะติดตั้งแล้ว" + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "รายการอัปเดตซอฟต์แวร์ได้รับการดาวน์โหลดและพร้อมที่จะติดตั้งแล้ว" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "กำลังดาวน์โหลดข้อมูลการอัปเกรด…" + +#~ msgid "What did you like about this app? Leaving your feedback along with your reasons for leaving a review is helpful for others." +#~ msgstr "คุณชอบอะไรเกี่ยวกับแอปนี้บ้าง? การเขียนความคิดเห็นของคุณพร้อมระบุเหตุผลของบทวิจารณ์เป็นสิ่งที่จะมีประโยชน์ต่อผู้อื่น" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "รายการอัปเดตซอฟต์แวร์สำคัญพร้อมสำหรับติดตั้งแล้ว" + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "สำคัญ: มีรายการอัปเดตซอฟต์แวร์สำคัญกำลังรออยู่" + +#~ msgid "Please download waiting software updates." +#~ msgstr "โปรดดาวน์โหลดรายการอัปเดตซอฟต์แวร์ที่รออยู่" + +#, fuzzy +#~| msgid "No update description available." +#~ msgid "Loading update description, please wait…" +#~ msgstr "ไม่มีรายละเอียดการอัปเดต" + +#, fuzzy +#~| msgid "Network Settings" +#~ msgid "Open Network _Settings" +#~ msgstr "ตั้งค่าเครือข่าย" + +#, fuzzy +#~| msgid "Network access was required but not available." +#~ msgid "Unable to download updates: internet access was required but wasn’t available" +#~ msgstr "ต้องใช้การเชื่อมต่อเครือข่ายแต่ไม่สามารถเชื่อมต่อได้" + +#, fuzzy +#~| msgid "Find in Software" +#~ msgid "Find Out _More" +#~ msgstr "หาใน \"ซอฟต์แวร์\"" + +#~ msgid "GNOME Software" +#~ msgstr "\"ซอฟต์แวร์\" ของ GNOME" + +#~ msgid "Application manager for GNOME" +#~ msgstr "เครื่องมือจัดการโปรแกรมสำหรับ GNOME" + +#~ msgid "A list of popular applications" +#~ msgstr "รายชื่อโปรแกรมยอดนิยม" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "รายชื่อของแหล่งเพิ่มเติมที่ได้เปิดใช้ก่อนหน้า" + +#~ msgid "The list of sources that have been previously enabled when installing third-party applications." +#~ msgstr "รายชื่อของแหล่งซอฟต์แวร์ที่ได้เปิดใช้ก่อนหน้านี้ขณะติดตั้งโปรแกรมบุคคลที่สาม" + +#~ msgid "Add to Application Folder" +#~ msgstr "เพิ่มเข้าโฟลเดอร์โปรแกรม" + +#~ msgid "_Add" +#~ msgstr "เ_พิ่ม" + +#~ msgid "Select All" +#~ msgstr "เลือกทั้งหมด" + +#~ msgid "Select None" +#~ msgstr "ไม่เลือก" + +#~ msgid "_All" +#~ msgstr "_ทั้งหมด" + +#~ msgid " or " +#~ msgstr " หรือ " + +#~ msgid "Public domain" +#~ msgstr "สาธารณสมบัติ" + +#~ msgid "Folder Name" +#~ msgstr "ชื่อโฟลเดอร์" + +#~ msgid "Show profiling information for the service" +#~ msgstr "แสดงข้อมูลการวัดประสิทธิภาพของบริการ" + +#~ msgid "3rd party" +#~ msgstr "บุคคลที่ 3" + +#~ msgid "nonfree" +#~ msgstr "ไม่เสรี" + +#~ msgid "An application" +#~ msgstr "มีโปรแกรมหนึ่ง" + +#~ msgid "Welcome" +#~ msgstr "ยินดีต้อนรับ" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. See our recommendations, browse the categories, or search " +#~ "for the applications you want." +#~ msgstr "\"ซอฟต์แวร์\" ช่วยคุณติดตั้งซอฟต์แวร์ใดๆ ที่คุณต้องการได้โดยสั่งจากที่นี่ที่เดียว คุณสามารถดูซอฟต์แวร์แนะนำ ท่องดูหมวดต่างๆ หรือค้นหาโปรแกรมที่คุณต้องการได้" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "ไ_ปช็อปกันเลย" + +#~ msgid "Spacing" +#~ msgstr "ช่องว่าง" + +#~ msgid "The amount of space between children" +#~ msgstr "จำนวนช่องว่างระหว่างรายการลูก" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "ถอดถอนแล้ว" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "ติดตั้งอยู่" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "อัปเดตแล้ว" + +#, c-format +#~ msgid "Information about %s, as well as options for how to get a codec that can play this format can be found on the website." +#~ msgstr "ข้อมูลเกี่ยวกับ %s และตัวเลือกสำหรับวิธีการรับตัวอ่าน-ลงรหัสที่สามารถเล่นรูปแบบนี้ มีอยู่ในในเว็บไซต์" + +#~ msgid "Post Review" +#~ msgstr "แปะประกาศบทวิจารณ์" + +#~ msgid "_Post" +#~ msgstr "แ_ปะประกาศ" + +#~ msgid "Give a short summary of your review, for example: “Great app, would recommend”." +#~ msgstr "เขียนสรุปบทวิจารณ์ของคุณสั้นๆ ตัวอย่างเช่น: “ยอดเยี่ยม ขอแนะนำ”" + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "บทวิจารณ์" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "คุณคิดเห็นอย่างไรเกี่ยวกับโปรแกรมนี้? พยายามให้เหตุผลประกอบทัศนะของคุณ" + +#~ msgid "Total" +#~ msgstr "ทั้งหมด" + +#~ msgid "Extensions are used at your own risk. If you have any system problems, it is recommended to disable them." +#~ msgstr "คุณต้องรับความเสียงเองเมื่อใช้ส่วนขยายต่างๆ ถ้าคุณมีปัญหาใดๆ กับระบบ ขอแนะนำให้ปิดส่วนขยายต่างๆ" + +#~ msgid "Extension Settings" +#~ msgstr "ตั้งค่าส่วนขยาย" + +#~ msgid "_Installing" +#~ msgstr "กำลัง_ติดตั้ง" + +#~ msgid "_Removing" +#~ msgstr "กำลัง_ถอดถอน" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "ไม่ทราบ" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "ไม่ทราบ" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "กำลังคำนวณ…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "ไม่ทราบ" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "ไม่เคย" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "ไม่ทราบ" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "ซอฟต์แวร์นี้มาจากบุคคลที่ 3" + +#~ msgid "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "ซอฟต์แวร์นี้มาจากบุคคลที่ 3 และอาจมีองค์ประกอบที่ไม่เสรี" + +#~ msgid "This software may contain non-free components." +#~ msgstr "ซอฟต์แวร์นี้อาจมีองค์ประกอบที่ไม่เสรี" + +#, c-format +#~ msgid "Could not find '%s'" +#~ msgstr "หา '%s' ไม่พบ" + +#~ msgid "_Launch" +#~ msgstr "เ_รียกทำงาน" + +#~ msgid "_History" +#~ msgstr "_ประวัติ" + +#~ msgid "Localized in your Language" +#~ msgstr "มีการแปลเป็นภาษาของคุณ" + +#~ msgid "Release Activity" +#~ msgstr "รุ่นที่เคลื่อนไหว" + +#~ msgid "Category" +#~ msgstr "หมวด" + +#~ msgid "Size" +#~ msgstr "ขนาด" + +#~ msgid "non-free" +#~ msgstr "ไม่เสรี" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "ส่วนเสริมที่เลือกจะถูกติดตั้งพร้อมกับโปรแกรม" + +#~ msgid "this website" +#~ msgstr "เว็บไซต์นี้" + +#~ msgid "Click on items to select them" +#~ msgstr "คลิกที่รายการที่จะเลือก" + +#~ msgid "Select" +#~ msgstr "เลือก" + +#~ msgid "_Add to Folder…" +#~ msgstr "เ_พิ่มเข้าโฟลเดอร์…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_ย้ายไปโฟลเดอร์…" + +#~ msgid "Recommended Audio Applications" +#~ msgstr "โปรแกรมเสียงที่แนะนำ" + +#~ msgid "Recommended Games" +#~ msgstr "เกมที่แนะนำ" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "โปรแกรมกราฟิกส์ที่แนะนำ" + +#~ msgid "Recommended Office Applications" +#~ msgstr "โปรแกรมสำนักงานที่แนะนำ" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "เมื่อวาน %R น." + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "เมื่อวาน %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "สามวันก่อน" + +#~ msgid "Four days ago" +#~ msgstr "สี่วันก่อน" + +#~ msgid "Five days ago" +#~ msgstr "ห้าวันก่อน" + +#~ msgid "Six days ago" +#~ msgstr "หกวันก่อน" + +#~ msgid "Two weeks ago" +#~ msgstr "สองสัปดาห์ที่แล้ว" + +#~ msgid "Looking for new updates…" +#~ msgstr "กำลังค้นหารายการอัปเดตใหม่…" + +#~ msgid "Restart & _Install" +#~ msgstr "เริ่มใหม่และ_ติดตั้ง" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "ไม่มีโปรแกรมหรือส่วนเสริมติดตั้งอยู่ ซอฟต์แวร์อื่นๆ อาจยังมีอยู่" + +#, c-format +#~ msgid "%i application" +#~ msgid_plural "%i applications" +#~ msgstr[0] "โปรแกรม %i รายการ" + +#~ msgid "Remove Source" +#~ msgstr "ลบแหล่ง" + +#, c-format +#~ msgid "Software sources can be downloaded from the internet. They give you access to additional software that is not provided by %s." +#~ msgstr "แหล่งซอฟต์แวร์สามารถดาวน์โหลดได้จากอินเทอร์เน็ต ซึ่งช่วยให้คุณเข้าถึงซอฟต์แวร์เพิ่มเติมที่ไม่ได้จัดเตรียมไว้โดย %s" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "แหล่งซอฟต์แวร์จะเปิดให้คุณเข้าถึงซอฟต์แวร์เพิ่มเติมได้" + +#~ msgid "Removing a source will also remove any software you have installed from it." +#~ msgstr "การลบแหล่งจะเป็นการลบซอฟต์แวร์ใดๆ ที่คุณได้ติดตั้งจากแหล่งนั้นด้วย" + +#~ msgid "No software installed from this source" +#~ msgstr "ไม่มีซอฟต์แวร์ที่ติดตั้งจากแหล่งนี้" + +#~ msgid "Installed from this Source" +#~ msgstr "ติดตั้งจากแหล่งนี้" + +#~ msgid "Last Checked" +#~ msgstr "ตรวจสอบล่าสุด" + +#~ msgid "Added" +#~ msgstr "วันที่เพิ่ม" + +#~ msgid "Website" +#~ msgstr "เว็บไซต์" + +#~ msgid "One Star" +#~ msgstr "หนึ่งดาว" + +#~ msgid "Two Stars" +#~ msgstr "สองดาว" + +#~ msgid "Three Stars" +#~ msgstr "สามดาว" + +#~ msgid "Four Stars" +#~ msgstr "สี่ดาว" + +#~ msgid "Five Stars" +#~ msgstr "ห้าดาว" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "ไม่มีการติดตั้งรายการอัปเดตในระบบนี้" + +#~ msgid "Security Updates Pending" +#~ msgstr "มีรายการอัปเดตด้านความปลอดภัยรออยู่" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "ขอแนะนำให้คุณติดตั้งรายการอัปเดตที่สำคัญเดี๋ยวนี้" + +#~ msgid "Restart & Install" +#~ msgstr "เริ่มใหม่และติดตั้ง" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "การอัปเดตที่สำคัญของ OS และโปรแกรมต่างๆ พร้อมที่จะติดตั้งแล้ว" + +#~ msgid "View" +#~ msgstr "ดู" + +#, c-format +#~ msgid "Installation of %s failed." +#~ msgstr "ติดตั้ง %s ไม่สำเร็จ" + +#, c-format +#~ msgid "Removal of %s failed." +#~ msgstr "ถอดถอน %s ไม่สำเร็จ" + +#~ msgid "_About" +#~ msgstr "เ_กี่ยวกับ" + +#~ msgid "_Quit" +#~ msgstr "_ออก" + +#~ msgid "Audio" +#~ msgstr "เสียง" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "การแก้ไข" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "ฐานข้อมูล" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "การเขียนแผ่น" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "วิทยุสมัครเล่น" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "เครื่องมือปรับเสียง" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "ดนตรี" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "เครื่องมืออัด" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "เครื่องเรียบเรียงดนตรี" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "เครื่องมือตั้งเสียง" + +#~ msgid "Development Tools" +#~ msgstr "เครื่องมือพัฒนา" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "การประกอบสร้าง" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "ฐานข้อมูล" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "GUI Designers" +#~ msgstr "เครื่องมือออกแบบ GUI" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "ชุดเครื่องมือพัฒนาเบ็ดเสร็จ" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "เครื่องมือวัดประสิทธิภาพ" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "การจัดการโครงการ" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Revision Control" +#~ msgstr "การควบคุมฉบับแก้ไข" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "การพัฒนาเว็บ" + +#~ msgid "Education" +#~ msgstr "การศึกษา" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "ชีววิทยา" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "วิทยาการคอมพิวเตอร์" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "การแสดงภาพข้อมูล" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "เศรษฐกิจ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "ไฟฟ้า" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "อิเล็กทรอนิกส์" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "วิศวกรรมศาสตร์" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "ธรณีวิทยา" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "ธรณีศาสตร์" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "ประวัติศาสตร์" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "การประมวลผลภาพ" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "วรรณกรรม" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "แผนที่" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Medical" +#~ msgstr "การแพทย์" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "ดนตรี" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "การวิเคราะห์เชิงตัวเลข" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "การคำนวณแบบขนาน" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "ฟิสิกส์" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "จิตวิญญาณ" + +#~ msgid "Games" +#~ msgstr "เกม" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "ยิง" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "จำลอง" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "กีฬา" + +#~ msgid "Graphics" +#~ msgstr "กราฟิกส์" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "กราฟิกส์ 2 มิติ" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "เครื่องอ่านอักขระด้วยแสง" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "การพิมพ์" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "กราฟิกส์แบบแรสเตอร์" + +#~ msgid "Internet" +#~ msgstr "อินเทอร์เน็ต" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "เชื่อมต่อโมเด็ม" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "อีเมล" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "ข่าวป้อน" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "ถ่ายโอนแฟ้ม" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "วิทยุสมัครเล่น" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "ข้อความทันใจ" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "ลูกข่าย IRC" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "เฝ้าสังเกต" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "ระบบโทรศัพท์" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "การพัฒนาเว็บ" + +#~ msgid "Office" +#~ msgstr "สำนักงาน" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "แผนภูมิ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "การจัดการสมุดผู้ติดต่อ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "พจนานุกรม" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "อีเมล" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "ผังงาน" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "การถ่ายภาพ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Presentation" +#~ msgstr "การนำเสนอ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "การจัดการโครงการ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "การพิมพ์" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "ตารางคำนวณ" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "โปรแกรมดูเอกสาร" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "ศิลปะ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "ปัญญาประดิษฐ์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "ดาราศาสตร์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "ชีววิทยา" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "เคมี" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "วิทยาการคอมพิวเตอร์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "การก่อสร้าง" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "การแสดงภาพข้อมูล" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "เศรษฐกิจ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "ไฟฟ้า" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "อิเล็กทรอนิกส์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "วิศวกรรมศาสตร์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "ภูมิศาสตร์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "ธรณีวิทยา" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "ธรณีศาสตร์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "ประวัติศาสตร์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "มนุษยศาสตร์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "การประมวลผลภาพ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "ภาษา" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "วรรณกรรม" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "แผนที่" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "คณิตศาสตร์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "การแพทย์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "การวิเคราะห์เชิงตัวเลข" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "การคำนวณแบบขนาน" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "ฟิสิกส์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "วิทยาการหุ่นยนต์" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "จิตวิญญาณ" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "กีฬา" + +#~ msgid "System" +#~ msgstr "ระบบ" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "โปรแกรมเลียนแบบ" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "โปรแกรมจัดการแฟ้ม" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "เครื่องมือแฟ้ม" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "เฝ้าสังเกต" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "การรักษาความปลอดภัย" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "เทอร์มินัลเทียม" + +#~ msgid "Utilities" +#~ msgstr "อรรถประโยชน์" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "สิ่งอำนวยความสะดวก" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "การจัดเก็บแฟ้ม" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "เครื่องคิดเลข" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "นาฬิกา" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "เครื่องมือแฟ้ม" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "แผนที่" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "จิตวิญญาณ" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "เครื่องมือระบบโทรศัพท์" + +#~ msgid "Video" +#~ msgstr "วีดิทัศน์" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "การแก้ไข" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "ฐานข้อมูล" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "เขียนแผ่น" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Players" +#~ msgstr "เครื่องมือเล่น" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "เครื่องมืออัด" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "โทรทัศน์" + +#~ msgctxt "Menu subcategory of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "ส่วนขยายของเชลล์" + +#~ msgid "No AppStream data found" +#~ msgstr "ไม่พบข้อมูล AppStream" + +#~ msgid "A previous update was unfinished." +#~ msgstr "การอัปเดตครั้งก่อนยังไม่แล้วเสร็จ" + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update itself. Please wait for another update and try again." +#~ msgstr "แพกเกจอัปเดตไม่สามารถติดตั้งได้ ซึ่งมักจะเกิดจากปัญหาของตัวแพกเกจอัปเดตเอง กรุณารอการอัปเดตครั้งถัดไปแล้วลองใหม่" + +#~ msgid "Internet Only Application" +#~ msgstr "โปรแกรมผ่านอินเทอร์เน็ตเท่านั้น" + +#~ msgid "Checking for updates…" +#~ msgstr "กำลังตรวจสอบการอัปเดต…" + +#~ msgid "Enter GApplication service mode" +#~ msgstr "เข้าโหมดบริการ GApplication" + +#~ msgid "No software installed" +#~ msgstr "ไม่มีซอฟต์แวร์ที่ติดตั้งไว้" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "รายการอัปเดตไม่ได้เซ็นกำกับอย่างถูกต้อง" + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "มีการร้องขอการอัปเดตแบบออฟไลน์ แต่ไม่มีแพกเกจใดที่ต้องอัปเดต" + +#~ msgid "No space was left on the drive." +#~ msgstr "ไม่เหลือพื้นที่ว่างในไดรว์" + +#~ msgid "An update failed to install correctly." +#~ msgstr "รายการอัปเดตไม่สามารถติดตั้งได้อย่างถูกต้อง" + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "อัปเดตแบบออฟไลน์ไม่สำเร็จในแบบที่ไม่คาดหมาย" + +#~ msgid "%i application and %i add-ons installed" +#~ msgid_plural "%i applications and %i add-ons installed" +#~ msgstr[0] "มีโปรแกรม %i รายการ และส่วนเสริม %i รายการติดตั้งไว้" + +#~ msgid "You're About to Install Non-Free Software" +#~ msgstr "คุณกำลังติดตั้งซอฟต์แวร์ที่ไม่ใช่ซอฟต์แวร์เสรี" + +#~ msgid "%s is not %sfree and open source software%s." +#~ msgstr "%s ไม่ใช่ %sซอฟต์แวร์เสรีและโอเพนซอร์ส%s" + +#~ msgid "Depending on your country of residence, installing it could make you liable to prosecution." +#~ msgstr "ขึ้นอยู่กับประเทศที่คุณอาศัยอยู่ การติดตั้งอาจทำให้คุณต้องรับผิดชอบการฟ้องร้องคดีอาญา" + +#~ msgid "If you are uncertain about this, you should obtain legal advice." +#~ msgstr "ถ้าคุณไม่แน่ใจเกี่ยวกับเรื่องนี้ คุณก็ควรขอคำปรึกษาทางกฎหมาย" + +#~ msgid "Do you want to enable it?" +#~ msgstr "คุณต้องการเปิดใช้หรือไม่?" + +#~ msgid "Set the specified debugging level" +#~ msgstr "ตั้งระดับการดีบั๊กตามที่ระบุ" + +#~ msgid "Picks" +#~ msgstr "คัดสรร" + +#~ msgctxt "license" +#~ msgid "Complicated!" +#~ msgstr "ซับซ้อน!" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "วิทยุสมัครเล่น" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "การพัฒนาเว็บ" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "เครื่องมือแฟ้ม" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "แผนที่" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "จิตวิญญาณ" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "แบบอักษร" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "ตัวอ่าน-ลงรหัส" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "แหล่งป้อนข้อความ" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "ชุดภาษา" + +#~ msgid "_Pending" +#~ msgstr "_รอติดตั้ง" + +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "ฐานข้อมูล" + +#~ msgid "January 30, 2014" +#~ msgstr "30 มกราคม 2557" + +#~ msgid "Done" +#~ msgstr "เสร็จสิ้น" + +#~ msgid "_Installed (%d)" +#~ msgstr "_ติดตั้งอยู่ (%d)" + +#~ msgid "_Updates (%d)" +#~ msgstr "_มีรุ่นใหม่ (%d)" + +#~ msgid "Goals:" +#~ msgstr "วัตถุประสงค์:" + +#~ msgid "" +#~ "
        • View installed applications
        • Remove installed applications
        • View available application updates
        • " +#~ "
        • Install available updates
        • Find new applications
        • Install new applications
        • Find an application to " +#~ "handle a specific type of file
        • Installed apps and updates should be available when offline
        • " +#~ msgstr "" +#~ "
        • ดูโปรแกรมที่ติดตั้งแล้ว
        • ถอดถอนโปรแกรมที่ติดตั้งแล้ว
        • ดูโปรแกรมที่สามารถอัปเดตได้
        • ติดตั้งการอัปเดตที่มีให้
        • " +#~ "
        • หาโปรแกรมใหม่
        • ติดตั้งโปรแกรมใหม่
        • หาโปรแกรมที่จะจัดการชนิดเฉพาะของแฟ้ม
        • ติดตั้งโปรแกรมและอัปเดตที่มีให้เมื่อออฟไลน์
        • " + +#~ msgid "New" +#~ msgstr "ใหม่" + +#~ msgid "Related" +#~ msgstr "ที่เกี่ยวข้อง" + +#~ msgid "Popular" +#~ msgstr "นิยม" + +#~ msgid "Shotwell is a digital photo organiser that runs on Linux. It is the default photo manager in Ubuntu and Fedora." +#~ msgstr "Shotwell เป็นโปรแกรมจัดการภาพถ่ายดิจิทัลที่ทำงานบนลินุกซ์ และเป็นโปรแกรมจัดการภาพถ่ายมาตรฐานของอูบุนตูและฟีดอรา" + +#~ msgid "More ▾" +#~ msgstr "เพิ่มเติม ▾" + +#~ msgid "Waiting for package manager..." +#~ msgstr "กำลังรอโปรแกรมจัดการแพกเกจ..." + +#~ msgid "Querying..." +#~ msgstr "กำลังสอบถาม..." + +#~ msgid "Setting up..." +#~ msgstr "กำลังตั้งค่า..." + +#~ msgid "The author of this software has not included a 'Description' in the desktop file..." +#~ msgstr "ผู้เขียนซอฟต์แวร์นี้ไม่ได้ให้ 'Description' (คำบรรยาย) ไว้ในแฟ้มเดสก์ท็อป..." diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..868804c --- /dev/null +++ b/po/tr.po @@ -0,0 +1,6345 @@ +# Turkish translation for gnome-software. +# Copyright (C) 2014-2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# +# Gökhan Gurbetoğlu , 2014. +# Necdet Yücel , 2015. +# İbrahim Aydın , 2017. +# Yunus Can Kapucu , 2017. +# Furkan Ahmet Kara , 2018. +# Ahmet Elgun , 2020. +# Muhammet Kara , 2014-2021. +# Sabri Ünal , 2014, 2019, 2022-2025. +# Emin Tufan Çetin , 2017-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-03 08:17+0000\n" +"PO-Revision-Date: 2025-02-03 15:02+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.5\n" +"X-POOTLE-MTIME: 1433975102.000000\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Yazılımlar" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Uygulamaları kur ve güncelle" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Yazılımlar; yeni uygulama ve sistem uzantıları bulup kurmanızı, kurulu " +"uygulamaları kaldırmanızı sağlar." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Yazılımlar; seçkin ve gözde uygulamaları, her uygulama için anlaşılır " +"açıklama ve çoklu ekran görüntüleriyle beğeninize sunar. Uygulamalar, " +"kategori listesinde gezinerek veya arayarak bulunabilir. Ayrıca çevrim dışı " +"güncelleme kullanarak sisteminizi güncellemenizi sağlar." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Genel bakış bölmesi" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Ayrıntılar bölmesi" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Kurulan bölmesi" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Güncellemeler bölmesi" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Güncelleme ayrıntıları" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME Projesi" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Shim UEFI’deki akmods anahtarını sına" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Shim UEFI’deki akmods anahtarını sınamak için kimlik doğrulama gereklidir" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Shim UEFI’ye akmods anahtarı kaydet" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Shim UEFI’ye akmdos anahtarı kaydetmek için kimlik doğrulama gereklidir" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Shim UEFI’deki DKMS anahtarını sına" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" +"Shim UEFI’deki DKMS anahtarını sınamak için kimlik doğrulama gereklidir" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Shim UEFI’ye DKMS anahtarı kaydet" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Shim UEFI’ye DKMS anahtarı kaydetmek için kimlik doğrulama gereklidir" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Appstream dosyasını sistem konumuna kur" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Appstream dosyası sistem konumuna kuruluyor" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Uyumlu projeler listesi" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Bu; GNOME, KDE ve XFCE gibi, göstermemiz gereken uyumlu projelerin " +"listesidir." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "GNOME Yazılımlar’da güncellemelerin ve yükseltmelerin yönetilmesi" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Eğer devre dışıysa, GNOME Yazılımlar güncellemeler bölmesini gizleyecek ve " +"herhangi bir kendiliğinden güncelleme eylemi gerçekleştirmeyecek veya " +"yükseltmeler için harekete geçilmeyecek." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Güncellemeleri kendiliğinden indir ve kur" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Eğer etkinse, GNOME Yazılımlar güncellemeleri arka planda kendiliğinden " +"indirir, ayrıca yeniden başlatma gerektirmeyenleri kurar." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Yazılım arka planda güncellendiğinde kullanıcıyı bilgilendir" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Eğer etkinse; GNOME Yazılımlar, kullanıcı uzaktayken güncelleme " +"gerçekleşirse kullanıcıyı bilgilendirir." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Ölçülen bağlantıda kendiliğinden yenilemenin olup olmadığı" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Eğer etkinse, GNOME Yazılımlar ölçülen bağlantı kullanılsa bile arka planda " +"kendini yenileyecek (kullanıcı için ücrete neden olsa da sonunda bazı üst " +"verileri indirecek, güncellemeleri denetleyecek vb.)" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "GNOME Yazılımlar’ın ilk kez çalıştırılışı olup olmadığı" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Uygulamaların yanında yıldızlı puanlamaları göster" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Uygulamaları uzak depo için öntanımlı dala göre süz" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Özgür olmayan uygulamalar kurulmadan önce bir uyarı penceresi gösterir" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Özgür olmayan uygulamalar kurulduğunda, bir uyarı penceresi gösterilebilir. " +"Bu, o iletişim penceresinin baskılanıp baskılanmayacağını denetler." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Son güncelleme denetiminin zaman damgası" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Son yükseltme bildirimi zaman damgası" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Son güncelleme bildirimi zaman damgası" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Güncellemeden sonra temizlenmiş ilk güvenlik güncellemesinin zaman damgası" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Son güncelleme zaman damgası" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Kaynak ekran görüntüsünü doğrulamak için saniye türünden yaş hala geçerlidir" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Daha büyük sayılar seçmek uzak sunucuya giden tur sayısını azaltır ama ekran " +"görüntülerindeki güncellemeleri kullanıcının görmesi daha uzun sürebilir. " +"Değeri 0 seçmek eğer görüntü zaten önbellekteyse sunucunun asla " +"denetlenmeyeceği anlamına gelir." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Uygulama incelemeleri için kullanılacak sunucu" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "İncelemeler için gereken en düşük karma puanı" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Bu sayıdan daha az karması olan incelemeler gösterilmeyecek." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Üçüncü taraf olarak düşünülmemesi gereken resmi depolar listesi" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Devre dışı bırakılamayan veya kaldırılamayan gerekli depoların listesi" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Özgür yazılım olarak düşünülmemesi gereken resmi depolar listesi" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Bir uygulama özgür yazılım olarak anıldığında kullanılacak lisans adresi" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "Olabildiğinde yığın uygulamaları sistemdeki tüm kullanıcılar için kur" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Yazılım Depoları penceresine erişme izni ver" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Ön sürümler için yükseltmeler sağla" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Uygulamanın özgür olmadığını kullanıcıya bildiren bazı ögeler göster" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Kurulan uygulamalar listesinde uygulamalar için kurulu boyutu göster" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://tr.wikipedia.org/wiki/Sahipli_yazılım'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Özgür olmayan ve sahipli yazılımı açıklayan URI" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Bir swcatalog klasörüne indirilecek appstream dosyalarına işaret eden " +"URL’lerin listesi" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"AppStream dosyalarını tüm kullanıcılar için sistem geneli bir konuma kur. " +"Eğer yanlışsa, dosyalar standart olmayan $XDG_DATA_HOME/swcatalog/xml " +"dizinine kurulacaktır" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Daha önemli biçimin önce listelendiği, yeğlenen paketleme biçimlerinin " +"öncelik sıralaması. Boş dizge öntanımlı sıralama anlamına gelir. Atlanan " +"biçimler en sonda sayılacaktır. Örnek paketleme biçimleri: deb, flatpak, " +"rpm, snap. Biçimler isteğe bağlı olarak, iki nokta üst üste ile bölünen " +"kaynak adıyla belirtilebilir, örneğin 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Kullanılmayan Flatpak çalışma zamanlarını kaldırmaya yönelik son girişimin " +"zaman damgası" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Yalnızca özgür lisanslı uygulamaları göstermek ve sahiplileri gizlemek için " +"'true' (doğru) olarak ayarla." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Yalnızca kimliği doğrulanmış geliştiricilerin uygulamalarını göstermek için " +"'true' (doğru) olarak ayarla." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Son alınan tarihsel güncellemelerin zaman damgası." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "Giriş için kullanılan gnome-online-account kimliğini depolayan dizge" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Yazılımlar AppStream sistem geneli kurucusu" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Komut satırı argümanları ayrıştırılamadı" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Yalnız bir dosya adı belirtmeniz gerekiyor" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Bu program yalnızca kök kullanıcıca kullanılabilir" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "İçerik türü doğrulanamadı: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Taşınamadı: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Yazılım Kur" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Seçili yazılımı sisteme kur" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Çizgi Dizisi Şiddeti" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Çizgi dizisi şiddetiyle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantezi Şiddeti" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Fantezi şiddetiyle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Gerçekçi Şiddet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Gerçekçi şiddetle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Kan Dökülmesini Betimleyen Şiddet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Kan dökülmesiyle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Cinsel Şiddet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Cinsel şiddetle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Alkol" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Alkole atıflarla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Uyuşturucular" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Yasadışı ilaçlara atıflarla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tütün" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Tütün ürünlerine atıflarla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Çıplaklık" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Herhangi biçimde çıplaklıkla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Cinsel Temalar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Cinsel doğaya atıf veya betimlemelerle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Sövgü" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Herhangi türde küfürlerle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Uygunsuz Mizah" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Uygunsuz mizahla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Ayrımcılık" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Herhangi türde ayrımcı dille ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklam" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Herhangi türde reklamla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Kumar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Herhangi türde kumarla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Satın Alım" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Para harcama yeteneğiyle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Kullanıcılar Arası Sohbet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Diğer kullanıcılarla sohbet etme yollarıyla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Kullanıcılar Arası Sesli Sohbet" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Diğer kullanıcılarla konuşma yollarıyla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Kişi Ayrıntıları" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Sosyal ağ kullanıcı adlarının veya e-posta adreslerinin paylaşımıyla ilgili " +"bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Tanımlayıcı Bilgi" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Üçüncü şahıslarla kullanıcı bilgisi paylaşımıyla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Konum Paylaşımı" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Diğer kullanıcılarla fiziksel konum paylaşımıyla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Eş Cinsellik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Eş cinselliğe atıflarla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Fuhuş" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Fuhşa atıflarla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Zina" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Eş aldatmaya atıflarla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Cinselleştirilmiş Karakterler" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Cinselleştirilmiş karakterlerle ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Saygısızlık" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Kutsala saygısızlığa atıflarla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "İnsan Kalıntıları" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Görününür ölü insan kalıntılarıyla ilgili bilgi yok" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Kölelik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Köleliğe atıflarla ilgili bilgi yok" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Yasadışı ilaçlara atıf içermez" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Küfür, sövgü ve diğer türlerde sert dil içermez" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Reklam veya parasal işlemler içermez" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Cinsellik veya çıplaklık içermez" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Denetimsiz sohbet işlevi içermez" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Şiddet içermez" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Uyuşturucu" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Sert Dil" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Para" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Sosyal" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Şiddet" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Tümü" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s yaş derecelendirmesi bilinmiyor" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s, herkese uygundur" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s, bebeklere uygundur" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s, küçük çocuklara uygundur" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s, çocuklara uygundur" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s, ergenlere uygundur" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s, yetişkinlere uygundur" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s, %s için uygundur" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Yaş Derecelendirmesi" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "Eksik bilgilere _nasıl katkıda bulunulur" + +#: lib/gs-app.c:6367 +msgid "Local file" +msgstr "Yerel dosya" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6386 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6463 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paket" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Beklemede" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Kurulum bekleniyor" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Kaldırma bekleniyor" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Kuruluyor" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Kaldırılıyor" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "İndiriliyor" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Kur" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Kaldır…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Ağ" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Ağ üzerinden iletişim kurabilir" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Sistem Hizmetleri" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Sistem veri yolundaki D-Bus hizmetlerine erişebilir" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Oturum Hizmetleri" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Oturum veri yolundaki D-Bus hizmetlerine erişebilir" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Aygıtlar" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Web kameraları gibi gelişigüzel aygıtlara erişebilir" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Girdi aygıtlarına erişebilir" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "Mikrofonlara erişebilir ve ses oynatabilir" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Sistem aygıt dosyalarına erişebilir" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Ekran içerikleri" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Ekran içeriklerine erişebilir" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Ev klasörü" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Dosyaları görüntüleyebilir, düzenleyebilir ve oluşturabilir" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Dosyaları görüntüleyebilir" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Dosya sistemi" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "İndirilenler klasörü" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Ayarlar" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Ayarları görüntüleyebilir ve değiştirebilir" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Eski görüntü sistemi" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Eski, güvenli olmayan bir görüntü sistemi kullanır" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Yalıtılmış alandan kaçış" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Yalıtılmış alandan kaçabilir ve diğer kısıtlamaları aşabilir" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Güncelleme tanımı yok." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Güncelleme Ayrıntıları" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Ek izinler gerektirir" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Sunucudan alınan puanlama verileri geçersiz" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Puanlama sunucusu ile iletişim kurulamadı" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "İncelemeler" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Bu uygulama için inceleme bulunamadı." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "İnceleme Yok" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Sürüm Geçmişi" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "%s Sürümü Yenilikleri" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Sürüm %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Bu sürüm için ayrıntı yok" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Başlangıç kipi: ‘updates’ (güncellemeler), ‘updated’ (güncellendi), " +"‘installed’ (kuruldu) ya da ‘overview’ (genel görünüm)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "KİP" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Uygulamalarda ara" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "ARA" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Uygulama ayrıntılarını göster (uygulama kimliğini kullanarak)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "Kimlik" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Uygulama ayrıntılarını göster (paket adını kullanarak)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKTADI" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Uygulama kur (uygulama kimliğini kullanarak)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Uygulama kaldır (uygulama kimliğini kullanarak)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Yerel paket dosyası aç" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "DOSYAADI" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Bu eylem için beklenen etkileşim türü: ‘none’ (hiçbiri), ‘notify’ (bildir), " +"veya ‘full’ (dolu)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ETKİLEŞİM" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Yerel metainfo veya appdata dosyası göster" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Ayrıntılı hata ayıklama çıktısını etkinleştir (çalışıyorsa, çalışan örnekten)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Bekleyen güncellemeleri arka planda kurar" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Tercihleri göster" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Çalışan oluşumdan çık" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "AppStream yerine yerel dosya kaynaklarını yeğle" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Sürüm numarasını göster" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Telif Hakkı © 2016–2023 GNOME Yazılımlar katkıcıları" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Emin Tufan Çetin \n" +"Sabri Ünal \n" +"Muhammet Kara " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Üzgünüz! Bu uygulama için ayrıntı yok." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Kurulu Boyut" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "%s veri ve %s önbellek içerir" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "%s veri içerir" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "%s önbellek içerir" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Önbellek ve veri kullanımı bilinmiyor" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "İndirme Boyutu" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Ek sistem indirmeleri gerektirmez" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Bilinmeyen boyutta ek sistem indirmeleri gerektirir" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "%s ek sistem indirmeleri gerektirir" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Boyut bilinmiyor" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "İzin yok" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Ağ erişimi var" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Sistem hizmetleri kullanır" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Oturum hizmetleri kullanır" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Donanım aygıtlarına erişebilir" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Sistem aygıtlarına erişebilir" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Tüm verinizi okuyabilir/yazabilir" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Tüm verinizi okuyabilir" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "İndirmelerinizi okuyabilir/yazabilir" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "İndirmelerinizi okuyabilir" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Kimi belirli dosyalara erişebilir" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Kullanıcı ayarlarına erişebilir ve değiştirebilir" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Eski pencereleme sistemi kullanır" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "İsteğe bağlı izinler edinir" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Yazılım geliştirici doğrulandı" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "İS dağıtıcısınca incelendi" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "%s tarafından incelendi" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Üçüncü tarafça sağlanmış" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Yazılım artık desteklenmiyor" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Denetlenebilir kod" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Bilinmeyen lisans" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Sahipli kod" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Özel lisans" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Ayrıcalıklı" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "Güvenli" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Olası Güvenli" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Güvenli Olmayabilir" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Güvenli Değil" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Yalnızca Mobil" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Yalnızca küçük ekranda çalışır" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Yalnızca Masaüstü" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Yalnızca büyük ekranda çalışır" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Ekran Boyutu Uygunsuzluğu" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Geçerli ekran boyutunuzu desteklemiyor" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Dokunmatik ekran gerektirir" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Klavye gerektirir" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Fare gerektirir" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Oyun Kolu Gereklidir" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Oynamak için oyun kolu gerektirir" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Uyarlanır" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Telefonlarda, tabletlerde ve masaüstülerde çalışır" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Klavye veya fare gerektirebilir" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Masaüstülerde ve dizüstülerde çalışır" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Yaş uygunsuz içerik barındırmaz" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Yaş derecelendirme bilgisi yok" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Web Sitesini Gör" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Kur…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "İptal" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Kur" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "İndir" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Güncelle" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Kaldır…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Kaldırılıyor" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Kritik güncelleme" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Aygıt güncelleme sırasında kullanılamaz." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Kaynak: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "%s yeniden adlandırıldı" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Güncellemelerin Alınması Durduruldu" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Kritik Güncelleme" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Kuruldu" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "%s Çevirisine Yardım Et" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s uluslararası katkıcı topluluğunca tasarlandı, geliştirildi ve çevrildi.\n" +"\n" +"Henüz dilinizde kullanılamıyorsa çevrilmesine yardım edebilirsiniz." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Çeviriler" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Çeviri Web Sitesi" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "%s (%s etki alanı) giriş gerektiriyor" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Giriş Gerekiyor" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:660 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_İptal" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Giriş" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Kullanıcı" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Parola" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Diğer" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Tümü" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Vitrin" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Editörün Seçimi" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Yeni ve Güncellenen" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Web’den Seçkiler" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Diğer Yazılım" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s Kuruldu" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Değişikliklerin etkili olması için yeniden başlatmanız gerekiyor" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Uygulama kullanıma hazır" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Sistem Güncellemeleri Kuruldu" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Son olarak kurulan güncellemeler gözden geçirme için uygun" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:828 +msgid "Restart" +msgstr "Yeniden Başlat" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Başlat" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Yazılım Kurulsun Mu?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Üçüncü Taraf Yazılım Kurulsun Mu?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Yazılım Deposu Etkinleştirilsin Mi?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Üçüncü Taraf Yazılım Deposu Etkinleştirilsin Mi?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s, özgür ve açık kaynak kodlu yazılım " +"değildir, “%s” tarafından sağlanır." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s, “%s” tarafından sağlanıyor." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "Kurulumu sürdürmek için bu yazılım deposu etkinleştirilmelidir." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"%s yazılımını kurmak ya da kullanmak, bazı ülkelerde yasa dışı olabilir." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Bu kod çözücüyü kurmak ya da kullanmak, bazı ülkelerde yasa dışı olabilir." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Bir Daha _Uyarma" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Etkinleştir ve _Kur" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Paket yöneticisinden gelen hata ayrıntıları:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Ayrıntılar" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Kapat" + +#: src/gs-common.c:578 +msgid "Details copied to clipboard" +msgstr "Ayrıntılar panoya kopyalandı" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:652 +msgid "_Accept" +msgstr "_Kabul Et" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:803 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Güncellemeler kuruldu" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:813 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Uygulama(lar) kaldırıldı" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:819 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Bunların etkili olması için yeniden başlatma gerekiyor" + +#. TRANSLATORS: button text +#: src/gs-common.c:826 +msgid "Not Now" +msgstr "Şimdi Değil" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:921 +msgid "Today" +msgstr "Bugün" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:924 +msgid "Yesterday" +msgstr "Dün" + +#: src/gs-common.c:926 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d gün önce" + +#: src/gs-common.c:930 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d hafta önce" + +#: src/gs-common.c:934 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d ay önce" + +#: src/gs-common.c:938 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d yıl önce" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:995 +msgid "Just now" +msgstr "Şimdi" + +#: src/gs-common.c:997 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d dakika önce" + +#: src/gs-common.c:999 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d saat önce" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1362 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Tümü" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Vitrin" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3B Grafik" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotoğrafçılık" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Tarama" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektör Grafikleri" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Görüntüleyiciler" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Ses Oluşturma ve Düzenleme" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Müzik Oynatıcılar" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Tümü" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Vitrin" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Takvim" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Veri Tabanı" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Finans" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Sözcük İşlemci" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Metin Düzenleyiciler" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Web Tarayıcıları" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Tümü" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Vitrin" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Aksiyon" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Macera" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arcade" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Bloklar" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Tahta" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Kart" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Öykünücüler" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Çocuklar" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Mantık" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rol Yapma" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Spor" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strateji" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Tümü" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Vitrin" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Sohbet" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Tümü" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Vitrin" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Yapay Zeka" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomi" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kimya" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Diller" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematik" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Haberler" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robotik" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Sanat" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Biyografi" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Çizgi Romanlar" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Kurgu" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Sağlık" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Tarih" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Yaşam Tarzı" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Politik" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Spor" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Tümü" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Vitrin" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Hata Ayıklayıcılar" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE’ler" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kod Çözücüler" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Donanım Sürücüleri" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Yazı Tipleri" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Girdi Kaynakları" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Dil Paketleri" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Yerelleştirme" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Yarat" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Çalış" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Oyna" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Sosyalleş" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Öğren" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Geliştir" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kod Çözücüler" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Donanım Sürücüleri" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Yazı Tipleri" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Girdi Kaynakları" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Dil Paketleri" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Yerelleştirme" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Bir uygulama" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s, ek dosya biçimi desteği istiyor." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Ek MIME (Dosya) Türleri Gerekli" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s, ek yazı tipleri istiyor." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Ek Yazı Tipleri Gerekli" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s, ek çokluortam kod çözücüleri istiyor." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Ek Çokluortam Kod Çözücüleri Gerekli" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s, ek yazıcı sürücüleri istiyor." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Ek Yazıcı Sürücüleri Gerekli" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s, ek paketler istiyor." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Ek Paketler Gerekli" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Yazılımlar’da Bul" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "Daha Çoğunu Gö_ster" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "Daha Az _Göster" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Kaldırılıyor…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Kurulumu bitirmek için yeniden başlatma gerekir" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Kaldırmayı bitirmek için yeniden başlatma gerekir" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Kurulum bekleniyor…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Güncellemeler bekleniyor…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "İndiriliyor…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Hazırlanıyor…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Kaldırılıyor…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s kurulmamış, ancak yine de verisi var." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Yeniden Başlat" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Etkinleştir…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Kur…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s Amerikan İngilizcesinde görünecek" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Bu uygulama Amerikan İngilizcesinde görünecek" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Bu yazılım Amerikan İngilizcesinde görünecek" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Çeviriye _Yardım Et" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Diğer %s Uygulamaları" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Geliştirici %s, %s sahipliğini kanıtladı" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Geliştirici %s sahipliğini kanıtladı" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Değerlendirme yazmanız için İnternet erişimi gerekiyor" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Bu uygulama artık güvenlik düzeltmelerini de içeren hiçbir güncelleme almıyor" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Bu uygulama halihazırda dağıtımınızca sağlanmaktadır ve değiştirilmemelidir." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Bu uygulama bir web sitesine, kod deposuna veya sorun izleyicisine bağlantı " +"sağlamıyor." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Bu yazılım artık güvenlik düzeltmelerini de içeren hiçbir güncelleme almıyor" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Bu yazılım halihazırda dağıtımınızca sağlanmaktadır ve değiştirilmemelidir." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Bu yazılım bir web sitesine, kod deposuna veya sorun izleyicisine bağlantı " +"sağlamıyor." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Yazılımlar, “%s” için bilgi alamadı ve bu uygulamanın ayrıntılarını " +"gösteremeyecek." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Sunucudan alınan inceleme yanıtı geçersiz" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "“%s” için yorum gönderilemedi: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Ayrıntılar sayfası" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Uygulama Ayrıntıları Yükleniyor" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Doğrulanmış" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Aç" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Güncelle" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Kaldır" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Eklentiler" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Bu uygulama yalnızca etkin İnternet bağlantısı olduğunda kullanılabilir." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Yazılımı Deposu İçerir" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Bu uygulama, güncellemelerin yanı sıra başka yazılımlara erişim sağlayan " +"yazılım deposu içerir." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Yazılım Deposu İçermez" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Bu uygulama yazılım deposu içermez. Yeni sürümleri çıktığında " +"güncellenmeyecek." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Yazılım Deposu Belirlendi" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Bu yazılım deposunu eklemek, ek yazılımlara ve yükseltmelere erişmenizi " +"sağlar." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Yalnızca güvendiğiniz yazılım depolarını kullanın." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Uygulama verisini temizle" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Verileri _Sil" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Üst Veri Yok" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Proje _Web Sitesi" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Bağış Yap" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Çevirilere _Katkı Yap" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "Sorun _Bildir" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Yardım" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "İletişim _Kur" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "İnceleme _Yaz" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Tüm İncelemeler" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Uygulama Ayrıntıları Gösterilemedi" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Yeniden başlatma hazırlanamadı" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Bilinmeyen hata" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Anahtar bulunamadı" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Anahtar kaydedilmedi" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK Kaydı Gerekli" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Sonraki" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Bu aygıtta Güvenli Önyükleme etkindir. Yeni sürücülerin etkinleştirilmesi " +"için yeni makine sahibi anahtarı (MOK) kaydedilmelidir. Süreç, sürecin " +"sonrasında bir parolanın girilmesini gerektirir. Anahtara ilişik şu parolayı " +"lütfen not edin:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "MOK _parolasını not ettim" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "Yeniden _Başlat ve Kaydol…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Kurulum Yönergeleri: Lütfen Özenle Okuyun" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Yeniden başlayınca aygıt kurulum ekranı görünecek. Yeni sürücüleri " +"etkinleştirmek için kurulum adımlarını izleyin:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• “MOK Kaydet”i seç\n" +"• Anahtarları kaydetmek için “Evet”i seç\n" +"• Sorulduğunda MOK parolasını gir\n" +"• Sonrasında “Yeniden Başlat”ı seç" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Güvenlik Etkileri" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Başarılı anahtar kaydından sonra modülün ya da diğer herhangi bir modülün " +"gelecek güncellemelerine tümüyle güvenileceğini göz önünde bulundurun. Tüm " +"gelecek güncellemeler etkileşim ya da yetkilendirme olmaksızın saydam " +"olarakgerçekleşecek." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"İleri kılavuz belgelendirme sayfasında bulunabilir." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Ek üst veri dosyaları indiriliyor…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " ve " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s betiği/betikleri için kullanılabilir yazı tipleri" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s için kullanılabilir yazılım" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "İstenen yazılım bulunamadı" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "İstenen yazılım bulunamadı" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s bulunamadı" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "web sitesinde" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "%s dosyasını sağlayan, kullanılabilir uygulama yok." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"%s ve eksik uygulamaları nasıl edinebileceğinizle ilgili seçenekleri %s " +"bulabilirsiniz." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s desteği için kullanılabilir uygulama yok." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s kullanılabilir değil." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"%s ve bu biçimi oynatabilen uygulamayı nasıl edinebileceğinizle ilgili " +"seçenekleri %s bulabilirsiniz." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s betik desteği için kullanılabilir yazı tipi yok." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"%s ve ek yazı tiplerini nasıl edinebileceğinizle ilgili seçenekleri %s " +"bulabilirsiniz." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s biçimi için kullanılabilir ek kodek yok." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"%s ve bu biçimi oynatabilen kod çözücüyü nasıl edinebileceğinizle ilgili " +"seçenekleri %s bulabilirsiniz." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s desteği için kullanılabilir Plasma kaynağı yok." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"%s ve ek Plasma kaynaklarını nasıl edinebileceğinizle ilgili seçenekleri %s " +"bulabilirsiniz." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s için kullanılabilir yazıcı sürücüsü yok." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"%s ve bu sürücüyü nasıl edinebileceğinizle ilgili seçenekleri %s " +"bulabilirsiniz." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "belgelendirmeye" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"%2$s tarafından istenen %1$s bulunamadı. Daha çok bilgi için lütfen %3$s " +"bakın." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "Aradığınız %s bulunamadı. Daha çok bilgi için lütfen %s bakın." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Herhangi bir arama sonucu bulunamadı: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s dosya biçimi" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "_Tümünü Kur" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "İstenen Yazılım Bulunamadı" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kod çözücüler sayfası" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Sonuç Bulunamadı" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Arama Gerçekleştirilemedi" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Önceki" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Sonraki" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Öne Çıkan Uygulamalar Listesi" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Masaüstü Desteği" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Büyük ekranda kullanımı destekler" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Masaüstü Desteği Bilinmiyor" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Büyük ekran desteğini bilecek yeterli bilgi yok" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Büyük ekran gerektirir" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Masaüstü Desteklenmez" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Büyük ekranda kullanılamaz" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobil Desteği" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Küçük ekranda kullanımı destekler" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobil Desteği Bilinmiyor" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Küçük ekran desteğini bilecek yeterli bilgi yok" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Küçük ekran gerektirir" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobil Desteklenmiyor" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Küçük ekranda kullanılamaz" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Klavye Desteği" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Klavye Desteği Bilinmiyor" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Klavye desteğini bilecek yeterli bilgi yok" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Klavye Gereklidir" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Klavyeleri destekler" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Klavye Desteklemez" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Klavyeyle kullanılamaz" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Fare Desteği" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Fare veya imleyici aygıt gerektirir" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Fare Desteği Bilinmiyor" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "Fare veya imleyici aygıt desteğini bilecek yeterli bilgi yok" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Fare Gereklidir" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Fare ve imleyici aygıtları destekler" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Fare Desteklenmez" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Fare veya imleyici aygıtla kullanılamaz" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Dokunmatik Ekran Desteği" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Dokunmatik Ekran Desteği Bilinmiyor" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Dokunmatik ekran desteğini bilecek yeterli bilgi yok" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Dokunmatik Ekran Gereklidir" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Dokunmatik ekranları destekler" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Dokunmatik Ekran Desteklenmez" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Dokunmatik ekranlarla kullanılamaz" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Oyun Kolu Gereklidir" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Oyun kolu gerektirir" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Oyun Kolu Desteği" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Oyun kollarını destekler" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s, büyük olasılıkla bu aygıtta çalışır" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s, bu aygıtta çalışır" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s, bu aygıtta çalışması olasıdır" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s, bu aygıtta doğru çalışmayacaktır" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s, bu aygıtta çalışmayacaktır" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Donanım Desteği" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Gezinim" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Keşfet Sayfasına git" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Kurulan Sayfasına Git" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Güncellemeler Sayfasına Git" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Arama Çubuğunu Aç" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Pencereler" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Tercihleri Aç" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Yazılım Depolarını Aç" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Yardım" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Klavye Kısayollarını Aç" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Kurulu" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Kurulan sayfa" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Sürüyor" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Uygulamalar" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Web Uygulamaları" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Sistem Uygulamaları" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Topluluk İnşası" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Katıl" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Bu uygulama, katkıcı topluluğunca açık olarak geliştirilmiş ve %s lisansıyla dağıtılmıştır.\n" +"\n" +"Katılarak daha iyi olmasını sağlayabilirsiniz." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Bu uygulama, katkıcı topluluğunca açık olarak geliştirilmiş ve %s lisansıyla " +"dağıtılmıştır.\n" +"\n" +"Katılarak daha iyi olmasını sağlayabilirsiniz." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Bu yazılım, katkıcı topluluğunca açık olarak geliştirilmiş ve %s lisansıyla dağıtılmıştır.\n" +"\n" +"Katılarak daha iyi olmasını sağlayabilirsiniz." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Bu yazılım, katkıcı topluluğunca açık olarak geliştirilmiş ve %s lisansıyla " +"dağıtılmıştır.\n" +"\n" +"Katılarak daha iyi olmasını sağlayabilirsiniz." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Bilinmeyen Lisans" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Daha Çoğunu Öğren" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Bu uygulama, hangi lisans altında geliştirildiğini belirtmemiştir ve sahipli " +"olabilir. Saptanması zor biçimde güvensiz olabilir ve gözetimsizce " +"değişebilir.\n" +"\n" +"Bu uygulamaya katkıda bulunabilir veya bulunamayabilirsiniz." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Bu yazılım, hangi lisans altında geliştirildiğini belirtmemiştir ve sahipli " +"olabilir. Saptanması zor biçimde güvensiz olabilir ve gözetimsizce " +"değişebilir.\n" +"\n" +"Bu yazılıma katkıda bulunabilir veya bulunamayabilirsiniz." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Sahipli" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Bu uygulama açık olarak geliştirilmemiştir, nasıl çalıştığını yalnızca kendi " +"geliştiricileri bilir. Saptanması zor biçimde güvensiz olabilir ve " +"gözetimsizce değişebilir.\n" +"\n" +"Bu uygulamaya katkıda bulunamayabilirsiniz." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Bu yazılım açık olarak geliştirilmemiştir, nasıl çalıştığını yalnızca kendi " +"geliştiricileri bilir. Saptanması zor biçimde güvensiz olabilir ve " +"gözetimsizce değişebilir.\n" +"\n" +"Bu yazılıma katkıda bulunamayabilirsiniz." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Özel Lisans" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Bu uygulama özel %s lisansı altında geliştirilmiştir.\n" +"\n" +"Bu uygulamaya katkıda bulunabilir veya bulunamayabilirsiniz." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Bu uygulama özel “%s” lisansı altında geliştirilmiştir.\n" +"\n" +"Bu uygulamaya katkıda bulunabilir veya bulunamayabilirsiniz." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Bu yazılım özel %s lisansı altında geliştirilmiştir.\n" +"\n" +"Bu yazılıma katkıda bulunabilir veya bulunamayabilirsiniz." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Bu yazılım özel “%s” lisansı altında geliştirilmiştir.\n" +"\n" +"Bu yazılıma katkıda bulunabilir veya bulunamayabilirsiniz." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Veriler Yenileniyor" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Sayfa yükleniyor" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Başlatılıyor" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Bilinmeyen kaynak" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Kullanıcı" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Eklentiler" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Kaldırılanlar" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Güncellemeler" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Sürüm Düşürmeler" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "Seçili dış kaynaklardan" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"%s ek yazılıma erişim sağlar. Bazı sahipli yazılımları içerir.\n" +"\n" +"Bu depoları daha sonra Yazılım Depoları tercihlerinden " +"etkinleştirebilirsiniz." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Üçüncü Taraf Yazılım Depoları Etkinleştirilsin Mi?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Yok Say" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Etkinleştir" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "İşletim sisteminiz için kullanılabilir" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "%s için kullanılabilir" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Keşfet" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Genel bakış sayfası" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Kullanılabilir Uygulamalar" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Diğer Kategoriler" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Uygulama Verisi Bulunamadı" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Bilinmeyen" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Tamam" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Kullanıcı kurulumu reddetti" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "%s Uygulamasını Hazırla" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "%s deposunu kaldırmak istediğinizden emin misiniz?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"%s kaynağından olan tüm uygulamalar kaldırılacak ve yeniden kullanmak için " +"depoyu yeniden kurmanız gerekecek." + +# Açılır pencere başlığı olduğu için başlık düzeni tercih edildi. +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "%s Kaldırılsın Mı?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Kaldırdıktan sonra %s kullanılamayacak." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "Kaldırdıktan sonra %s bağlantılı uygulamalar kullanılamayacak." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Kaldırdıktan sonra %s kullanılamayacak ve bunu kullanan tüm belgeler başka " +"yazı tipinde görünecek." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Kaldırdıktan sonra %s kullanılamayacak. Bu, kimi ortam dosyalarının " +"oynatılamayacağı anlamına da gelebilir." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "%s bağımlı donanım kaldırıldıktan sonra artık düzgün çalışmayabilir." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Kaldırdıktan sonra %s kullanılamayacak. Gelecekte uygulamanın geri " +"yüklenmesini sağlamak için uygulama verileri ve ayarları diskte korunacak." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Tercihler" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Yazılım Güncellemeleri" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Daha çok bilgi" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Güncellemelerin denetlenmesi ve indirilmesi veri ve güç kullanır. Bu " +"nedenle, kendiliğinden güncelleme özellikleri ölçülen ağ bağlantılarında ve " +"güç tutumu açıkken duraklatılır." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Kendiliğinden" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Güncellemeleri kendiliğinden denetle ve indir" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Elle" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Güncellemelerin denetlenmesi ve indirilmesi elle yapılmalıdır" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Kendiliğinden Güncelleme _Bildirimleri" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Güncellemeler kendiliğinden kurulduğunda bildir" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "İçerik Süzgeçleri" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Yalnızca _Özgür Yazılımları Göster" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Göz atarken ve ararken sahipli yazılımları gizle" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Yalnızca _Onaylı Geliştiricileri Göster" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Yalnızca kimliği doğrulanmış geliştiricilerin uygulamalarını göster" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Kurulu yazılım %s ile uyumsuz ve yükseltme sırasında kendiliğinden " +"kaldırılacak." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Uyumsuz Yazılım" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Yükselt" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "_Kaldır" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Uygulama Ayarları ve Veriler" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Koru" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Uygulama ayarlarının ve içeriğinin geri yüklenmesine izin verir" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Sil" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Disk alanını korumak için verileri kalıcı olarak siler" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "“%s” kaynağından kurulan yazılımlar güncelleme almayacak." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Depoyu Devre Dışı Bırakılsın Mı?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Depo Kaldırılsın Mı?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "_Devre Dışı Bırak" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_Kaldır" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Yeni Depoları Etkinleştir" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Yeni depolar eklendiğinde etkinleştir" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "daha çok bilgi" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Seçilen üçüncü taraflardan ek depolar — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora Üçüncü Taraf Depolar" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "işletim sistemi" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Bu depolar %s tarafından sağlanan öntanımlı yazılımı tamamlar." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Yazılım Depoları" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Depo Yok" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u uygulama kuruldu" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u eklenti kuruldu" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u uygulama" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u eklenti" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s ve %s kuruldu" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Kurulu yazılım denetleniyor…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Kaldır" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Berbat" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Pek iyi değil" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "İdare eder" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Güzel" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Harika" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Oylama İçin Yıldız Seçin" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Lütfen inceleme yazmaya biraz daha zaman ayırın" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Lütfen yıldız puanlaması seçin" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Özet çok kısa" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Özet çok uzun" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Açıklama çok kısa" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Açıklama çok uzun" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "İnceleme Yaz" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Gönder" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Lütfen puanlama, özet ve inceleme metni sağlayın. İncelemeler hata bildirmek " +"için kullanılmamalıdır: bunun yerine geliştirici ya da destek sağlayıcınızla " +"iletişime geçin." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "İnceleme Özeti" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Kısa inceleme yaz" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Ne verisinin gönderildiğini gizlilik ilkemizde bulabilirsiniz. Hesabınıza ilişik tam " +"adınız açıkça gösterilecektir." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "Toplam %u inceleme" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "/ 5 yıldız" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Bilinmeyen" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Küfürlü, kaba veya ayrımcı tutum içeren incelemeleri bildirebilirsiniz." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"İnceleme bildirildikten sonra yöneticice denetlenene dek gizlenecektir." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "İnceleme Bildirilsin Mi?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Bildir" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "İnceleme Kaldırılsın Mı?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "İncelemenin kaldırılması geri alınamaz." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "İncelemeyi Beğendim" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "İncelemeyi Beğenmedim" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Bildir…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Kaldır…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Uygulama yalıtılmış alanda değil ancak dağıtım zararsız olduğunu doğruladı" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Sağlayıcıya güveninizi gözden geçirin çünkü uygulama yalıtılmış alanda değil" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "İzin Yok" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Uygulama tümüyle yalıtılmış alandadır" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Ağ Erişimi" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "İnternete erişebilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Ağ Erişimi Yok" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "İnternete erişemez" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Sistem Hizmetlerini Kullanır" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Sistem hizmetlerinden veri isteyebilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Oturum Hizmetlerini Kullanır" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Oturum hizmetlerinden veri isteyebilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Kullanıcı Aygıtı Erişimi" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Web kameraları veya oyun denetçileri gibi aygıtlara erişebilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Kullanıcı Aygıtı Erişimi Yok" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Web kameraları veya oyun denetçileri gibi aygıtlara erişemez" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Girdi Aygıtı Erişimi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "Mikrofon Erişimi ve Ses Oynatımı" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "İzin istemeden mikrofonlarla dinleyebilir ve sesleri oynatabilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Sistem Aygıtı Erişimi" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Yükseltilmiş izinler gerektiren sistem aygıtlarına erişebilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Ekran İçerikleri Erişimi" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Ekranın ya da diğer pencerelerin içeriklerine erişebilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Eski Pencereleme Sistemi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "İsteğe Bağlı İzinler" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Kullanıcı Ayarları" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Tüm Dosya Sistemini Okuma/Yazma Erişimi" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Dosya sistemindeki tüm veriyi okuyabilir ve yazabilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Ev Klasörü Okuma/Yazma Erişimi" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Ev dizininizdeki tüm veriyi okuyabilir ve yazabilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Tüm Dosya Sistemini Okuma Erişimi" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Dosya sistemindeki tüm veriyi okuyabilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Ev Klasörü Okuma Erişimi" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Ev dizininizdeki tüm verinizi okuyabilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "İndirilenler Klasörü Okuma/Yazma Erişimi" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "İndirilenler dizininizdeki tüm veriyi okuyabilir ve yazabilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "İndirilenler Klasörü Okuma Erişimi" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "İndirilenler dizininizdeki tüm veriyi okuyabilir" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Dizindeki tüm veriyi okuyabilir ve yazabilir" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Dizindeki tüm veriyi okuyabilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Dosya Sistemi Erişimi Yok" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Dosya sistemine tümüyle erişemez" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Uygulama geliştirici doğrulandı" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "Bu uygulamanın geliştiricisinin söylediği kişi olduğu doğrulandı" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Güvensiz Bağımlılıklar" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "Yazılım veya bağımlılıkları artık desteklenmiyor ve güvensiz olabilir" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Bu uygulama, hangi lisans altında geliştirildiğini belirtmemiştir ve sahipli " +"olabilir" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Bu yazılım, hangi lisans altında geliştirildiğini belirtmemiştir ve sahipli " +"olabilir" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Sahipli Kod" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Kaynak kod halka açık değildir, bu nedenle bağımsızca denetlenemez ve " +"güvenilir olmayabilir" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Bu uygulama özel “%s” lisansı altında geliştirilmiştir" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Bu yazılım özel “%s” lisansı altında geliştirilmiştir." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Denetlenebilir Kod" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Kaynak kod halka açıktır ve bağımsızca denetlenebilir, bu uygulamayı daha " +"güvenilir kılar" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s ayrıcalıklı" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s güvenilir" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s muhtemelen güvenli" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s güvenilir olmayabilir" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s güvenilir değil" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Bilinmeyen" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Güvenlik" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Lisans" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Kaynak" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Bu uygulama, yazılım platformunun (SDK) eski sürümünü kullanıyor ve " +"düzeltilmeyecek hatalar ya da güvenlik açıkları içerebilir." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Önceki Ekran Görüntüsü" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Sonraki Ekran Görüntüsü" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Ekran Görüntüsü Yok" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:360 src/gs-screenshot-image.c:402 +#: src/gs-screenshot-image.c:606 +msgid "Screenshot not found" +msgstr "Ekran görüntüsü bulunamadı" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:412 +msgid "Failed to load image" +msgstr "Resim yüklenemedi" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:634 +msgid "Screenshot size not found" +msgstr "Ekran görüntüsü boyutu bulunamadı" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:723 +msgid "Could not create cache" +msgstr "Önbellek oluşturulamadı" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:737 +msgid "Screenshot not valid" +msgstr "Ekran görüntüsü geçerli değil" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:775 +msgid "Screenshot not available" +msgstr "Ekran görüntüsü kullanılamaz" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Ekran Görüntüsü" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "%u eşleşme daha" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Arama sayfası" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Uygulamalarda Ara" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Uygulama Bulunamadı" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "Güncellemeler indirilemiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "Donanım yazılımı güncellemeleri indirilemiyor" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "%s kaynağından donanım yazılımı güncellemeleri indirilemiyor" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "%s kaynağından güncellemeler indirilemiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "Güncellenemiyor: İnternet erişimi gerekli" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "Güncellenemiyor: yetersiz disk alanı" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "%s kaynağından güncellemeler indirilemiyor: yetersiz disk alanı" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "Güncellenemiyor: kimlik doğrulama gerekli" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "Güncellenemiyor: kimlik doğrulama geçersiz" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "Güncellenemiyor: izin gerekli" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Güncellemeler indirilemiyor: yazılım kurma izniniz yok" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "Güncellemelerin listesi alınamıyor" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "Kurulamıyor: indirme başarısız" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s kurulamıyor: %s kaynağından indirilemiyor" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s kurulamıyor: indirme başarısız" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "Kurulamıyor: çalışma zamanı eksik" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s kurulamıyor: %s çalışma zamanı kullanılamıyor" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "%s kurulamıyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "Kurulamıyor: İnternet erişimi gerekli" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "Kurulamıyor: uygulamanın biçimi geçersiz" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "Kurulamıyor: yetersiz disk alanı" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s kurulamıyor: yetersiz disk alanı" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "Kurulamıyor: kimlik doğrulama gerekli" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s kurulamıyor: kimlik doğrulama gerekli" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "Kurulamıyor: kimlik doğrulama geçersiz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s kurulamıyor: kimlik doğrulama geçersiz" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "Kurulamıyor: izin gerekli" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s kurulamıyor: izin gerekli" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "Kurulamıyor: aygıt takılı olmalıdır" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s kurulamıyor: aygıt takılı olmalıdır" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "Kurulamıyor: düşük pil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s kurulamıyor: düşük pil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%s, %s kaynağından güncellenemiyor: indirme başarısız" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s güncellenemiyor: indirme başarısız" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "%s kaynağından güncellemeler kurulamıyor: indirme başarısız" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "Güncellenemiyor: indirme başarısız" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s güncellenemiyor: yetersiz disk alanı" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s güncellenemiyor: kimlik doğrulama gerekli" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s güncellenemiyor: kimlik doğrulama geçersiz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s güncellenemiyor: izin gerekli" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "Güncellenemiyor: aygıt takılı olmalıdır" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s güncellenemiyor: aygıt takılı olmalıdır" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "Güncellenemiyor: düşük pil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s güncellenemiyor: düşük pil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "%s güncellenemiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "Güncellenemiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "Yükseltilemiyor" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%s, %s kaynağından yükseltilemiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "Yükseltilemiyor: indirme başarısız" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "%s yükseltilemiyor: indirme başarısız" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "Yükseltilemiyor: İnternet erişimi gerekli" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "%s yükseltilemiyor: İnternet erişimi gerekli" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "Yükseltilemiyor: yetersiz disk alanı" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "%s yükseltilemiyor: yetersiz disk alanı" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "Yükseltilemiyor: kimlik doğrulama gerekiyor" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "%s yükseltilemiyor: kimlik doğrulama gerekiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "Yükseltilemiyor: kimlik doğrulama geçersiz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "%s yükseltilemiyor: kimlik doğrulama geçersiz" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "Yükseltilemiyor: izin gerekli" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "%s yükseltilemiyor: izin gerekli" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Yükseltilemiyor: aygıt takılı olmalıdır" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "%s yükseltilemiyor: aygıt takılı olmalıdır" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "Yükseltilemiyor: düşük pil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "%s yükseltilemiyor: düşük pil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "%s yükseltilemiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "Kaldırılamıyor: kimlik doğrulama gerekiyor" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s kaldırılamıyor: kimlik doğrulama gerekiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "Kaldırılamıyor: kimlik doğrulama geçersiz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s kurulamıyor: kimlik doğrulama geçersiz" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "Kaldırılamıyor: izin gerekli" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s kaldırılamıyor: izin gerekli" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Kaldırılamıyor: aygıt takılı olmalıdır" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s kaldırılamıyor: aygıt takılı olmalıdır" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "Kaldırılamıyor: düşük pil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s kaldırılamıyor: düşük pil" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s kaldırılamıyor" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "%s başlatılamıyor" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "Üzgünüz, bir şeyler yanlış gitti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s başlatılamıyor: %s kurulmamış" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "İşlem için yeterli disk alanı yok" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "Kurulamıyor: dosya türü desteklenmiyor" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "Kurulamıyor: kimlik doğrulama başarısız" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "Kurulamıyor" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "%s ile iletişim kurulamıyor" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "Yeni eklentileri kullanmak için Yazılımlarʼı yeniden başlat" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "Aygıt takılı olmalıdır" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "Pil düzeyi çok düşük" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Yazılım Depoları" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Tercihler" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Klavye Kısayolları" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "Yazılımlar _Hakkında" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Ara" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Ana Menü" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Uygulama ara" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Keşfet" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Kurulu" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Güncellemeler" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Geri git" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Yok" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Uygulama Verisi" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Uygulamanın çalışması için veri gerekli" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Kullanıcı Verisi" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Uygulamada oluşturduğunuz veri" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Önbellek Verisi" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Geçici önbellekli veri" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Uygulamanın kendisi" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Gerekli Bağımlılıklar" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Bu uygulamaca gereksinilen paylaşımlı sistem bileşenleri" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Bilinmiyor" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "Önbellekli veri _uygulama ayarlarından temizlenebilir" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Depolama" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Kuruldu)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Kuruluyor)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (İndiriliyor)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Kaldırılıyor)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Ayrıntılar" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "İ_ncele" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "%s tarihinde kuruldu" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Kurulan Güncellemeler" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Güncelleme Kurulmadı" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Güncellemelerinin Tarihi Geçmiş" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Kullanılabilir güncellemeleri denetleyin" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "Kritik Güncellemeler Kuruluma Hazır" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Kritik güncellemeleri en kısa sürede kur" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Kritik Güncellemeler İndirilebilir" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Kritik güncellemeleri en kısa sürede indir" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Güncellemeler Kuruluma Hazır" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Yazılım güncellemeleri hazır ve bekliyor" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Güncellemeler İndirilebilir" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Yazılım güncellemeleri indirilebilir" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u Uygulama Güncellendi — Yeniden Başlatma Gerekiyor" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u Uygulama Güncellendi" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s güncellendi." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Lütfen uygulamayı yeniden başlatın." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s ve %s güncellendi." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u uygulama yeniden başlatma gerektiriyor." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s, %s ve %s içerir." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Sistem Ömrünün Sonuna Ulaştı" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Güncellemeleri almayı sürdürmek için yükselt" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s dağıtımının yeni sürümü kuruluma hazır" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Yazılım Yükseltmesi Var" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Yazılım Güncellemeleri Başarısız Oldu" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Hazırlanan güncellemeler kurulamadı" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Ayrıntıları Göster" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Sistem Yükseltmesi Tamamlandı" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "%s %s’a Hoş Geldiniz!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Yazılım Güncellemeleri Kuruldu" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Önemli işletim sistemi güncellemeleri kuruldu." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Gözden Geçir" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Güncellenemedi" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Sistem zaten güncel." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Güncelleme iptal edildi." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"İnternet erişimine gereksinim duyuldu ancak bulunamadı. Lütfen internet " +"erişiminiz olduğuna emin olun ve yeniden deneyin." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Güncellemede güvenlik sorunları var. Lütfen daha çok ayrıntı için yazılım " +"sağlayıcınızla iletişime geçin." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Yeterince boş disk alanı yok. Lütfen biraz yer açın ve yeniden deneyin." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Özür dileriz: güncelleme kurma başarısız. Lütfen başka güncelleme bekleyin " +"ve yeniden deneyin. Eğer sorun sürerse yazılım sağlayıcınızla görüşün." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Son denetim: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Durdur" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Güncellemeleri Denetle" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s kritik yazılım güncellemelerini almayı durdurdu" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "İşletim sisteminiz kritik yazılım güncellemelerini almayı durdurdu" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Ücret Uygulanabilir" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Mobil geniş bant kullanımında güncellemeleri denetlemek sizin için ek " +"masrafa neden olabilir." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Yine de _Denetle" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Yazılım Yükseltmeleri İndirildi" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Yükseltmeler kurulmaya hazır" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Güncellemeleri denetle" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Güncellemeler" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Güncellemeler sayfası" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Güncellemeler Yükleniyor" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Biraz uzun sürebilir" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Güncel" + +#: src/gs-updates-page.ui:180 +msgid "Use Mobile Data?" +msgstr "Mobil Veri Kullanılsın Mı?" + +#: src/gs-updates-page.ui:181 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Mobil geniş bant kullanırken güncellemeleri denetlemek ek masrafa neden " +"olabilir" + +#: src/gs-updates-page.ui:184 +msgid "_Check Anyway" +msgstr "Yine de _Denetle" + +#: src/gs-updates-page.ui:203 +msgid "No Connection" +msgstr "Bağlantı Yok" + +#: src/gs-updates-page.ui:204 +msgid "Go online to check for updates" +msgstr "Güncellemeleri denetlemek için çevrim içi ol" + +#: src/gs-updates-page.ui:207 +msgid "_Network Settings" +msgstr "_Ağ Ayarları" + +#: src/gs-updates-page.ui:227 src/gs-updates-page.ui:241 +msgid "Error" +msgstr "Hata" + +#: src/gs-updates-page.ui:242 +msgid "Updates are automatically managed" +msgstr "Güncellemeler kendiliğinden yönetilir" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Yazılım Güncellemeleri Duraklatıldı" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Kendiliğinden yazılım güncellemeleri şu nedenlerle duraklatıldı:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Geçerli ağ bağlantısı ölçülüdür" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Geçerli ağ bağlantısı büyük indirmeleri engelliyor" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Güç tutumu kipi etkin" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Oyun kipi etkin" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Yazılım güncellemeleri duraklatıldı" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Ağ bağlantısı ölçülü — yazılım güncellemeleri duraklatıldı" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Ağ bağlantısı büyük indirmeleri engelliyor — yazılım güncellemeleri " +"duraklatıldı" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Güç tutumu kipi etkin — yazılım güncellemeleri duraklatıldı" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Oyun kipi etkin — yazılım güncellemeleri duraklatıldı" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Yeniden Başlat ve Güncelle…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Tümünü _Güncelle" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Yazılım Güncellemeleri İndirildi" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Güncellemeler kurulmaya hazır" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Tümleşik Donanım Yazılımı" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Yeniden Başlatma Gerektirir" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Uygulama Güncellemeleri" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Aygıt Donanım Yazılımı" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_İndir" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s Kullanılabilir" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s Kullanılabilir" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Yeni sürümü öğren" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s / %s indirildi" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%%%u indirildi" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Yeni özellikler ve düzeltmeler içeren büyük güncelleme." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Yükseltmeyi İptal Et" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Yeniden Başlat ve Yükselt…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "Yükseltmeden önce verinizi ve dosyalarınızı yedeklemeyi unutmayın." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Hata Ayrıntıları" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Ayrıntıları Kopyala" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "“%s” dosyası silinemedi: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "“%s” dizini silinemedi: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Bu bilgisayara yazılım ekle, kaldır ya da güncelle" + +# https://gitlab.gnome.org/GNOME/glib/-/issues/443 hatası sebebiyle uygulama adı dahil ingilizce hallerini de koruyalım. +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;Güncellemeler;Güncelleştirmeler;Yükseltme;Depolar;Sürüm " +"Depoları;Tercihler;Yeğler;Yükle;Kur;Kaldır;Program;Yazılım;Uygulama;Mağaza;" +"Market;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s Hazır" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s etkinleştirilmeye hazır ve sonraki önyüklemeye planlandı." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Etkinleştir" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3170 +msgid "System Updates" +msgstr "Sistem Güncellemeleri" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3175 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Güvenlik veya hata giderimleri gibi genel sistem güncellemeleri ve başarım " +"geliştirmeleri." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Yeni özellikler ve düzeltmeler içeren %s güncellemesi." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS güncelleme hizmeti güncelleme alamadı ve uygulayamadı." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Web Uygulaması" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Web Uygulamaları Desteği" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Gözde web uygulamalarını tarayıcıda çalıştır" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"En son özellikler, performans ve kararlılık iyileştirmeleri için yükselt." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak Desteği" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak, Linux’taki masaüstü uygulamaları için çerçevedir" + +# Notes: +# Add Note +# +# Extracted comments: +# TRANSLATORS: the entire system, e.g. all internal devices, +# * the first %s is the device name, e.g. 'ThinkPad P50` +# +# +# Format: +# C +# +# Paths: +# plugins/fwupd/gs-fwupd-app.c:141 +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "Sistem klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "Ev alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "Ana makine sistem klasörleri" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "/etc dizininden ana makine sistem yapılandırması" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "Masaüstü klasörü" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Masaüstü alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "Belgeler klasörü" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "Belgeler alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "Müzik klasörü" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "Müzik alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "Resimler klasörü" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Resimler alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "Paylaşılanlar klasörü" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Paylaşılanlar alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "Videolar klasörü" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videolar alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "Şablonlar klasörü" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "Şablonlar alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "Kullanıcı ön bellek klasörü" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "Kullanıcı ön bellek alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "Kullanıcı yapılandırma klasörü" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Kullanıcı yapılandırma alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "Kullanıcı veri klasörü" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "Kullanıcı verisi alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "Kullanıcı çalışma zamanı klasörü" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Kullanıcı çalışma zamanı alt klasörü %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "Dosya sistemi erişimi %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "%s için flatpak üst verisi alınıyor…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "‘%s’ eklentisi arıtılamadı: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Kullanıcı Kurulumu" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Sistem Kurulumu" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "Uygulama Kimliği" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "‘%s’ eklentisi için kurulum eklenemedi: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "‘%s’ eklentisi için kaldırma eklenemedi: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Uzak “%s”, büyük olasılıkla süzgecinden dolayı “%s” kurulumunu önlüyor. " +"Süzgeci kaldırıp kurulumu yineleyin. Ayrıntılı hata: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Sistem gücü yükseltme için çok düşük" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "Sistem gücü yükseltme için çok düşük (%%%u, %%%u gerekir)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Aygıta erişilemiyor ya da kablosuz kapsama alanı dışında" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Aygıt pil gücü çok düşük" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Aygıt pil gücü çok düşük (%%%u, %%%u gerekir)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Aygıt güncellemenin uygulanmasını bekliyor" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Aygıt, AC gücün bağlanmasını gerektiriyor" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Dizüstü kapağı kapalıyken aygıt kullanılamaz" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:208 +#, c-format +msgid "%s Device Update" +msgstr "%s Aygıt Güncellemesi" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s System Update" +msgstr "%s Sistem Güncellemesi" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s Gömülü Denetleyici Güncellemesi" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s ME Update" +msgstr "%s ME Güncellemesi" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s Kurumsal ME Güncellemesi" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s Tüketici ME Güncellemesi" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:239 +#, c-format +msgid "%s Controller Update" +msgstr "%s Denetleyici Güncellemesi" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:245 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt Denetleyici Güncellemesi" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s MİB Mikrokod Güncellemesi" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s Configuration Update" +msgstr "%s Yapılandırma Güncellemesi" + +# Notes: +# Add Note +# +# Extracted comments: +# TRANSLATORS: the entire system, e.g. all internal devices, +# * the first %s is the device name, e.g. 'ThinkPad P50` +# +# +# Format: +# C +# +# Paths: +# plugins/fwupd/gs-fwupd-app.c:141 +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Battery Update" +msgstr "%s Pil Güncellemesi" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Camera Update" +msgstr "%s Kamera Güncellemesi" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM Güncellemesi" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s Dokunmatik Yüzey Güncellemesi" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Mouse Update" +msgstr "%s Fare Güncellemesi" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s Klavye Güncellemesi" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s Depolama Denetleyici Güncellemesi" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s Ağ Arayüzü Güncellemesi" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Display Update" +msgstr "%s Ekran Güncellemesi" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC Güncellemesi" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB Alıcı Güncellemesi" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s Drive Update" +msgstr "%s Sürücü Güncellemesi" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s Flaş Sürücü Güncellemesi" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD Güncellemesi" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU Güncellemesi" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s Dock Update" +msgstr "%s Rıhtım Güncellemesi" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB Rıhtım Güncellemesi" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Donanım Yazılımı" + +#: plugins/fwupd/gs-plugin-fwupd.c:1938 +msgid "Firmware update could not be applied: " +msgstr "Donanım yazılımı güncellemesi uygulanamadı: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Donanım Yazılımı Yükseltme Desteği" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Donanım yazılımı yükseltmeleri için destek sağlar" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "İmzasız Yazılım Kurulsun Mu?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Kurulacak yazılım imzalanmamış. Bu yazılıma yönelik güncellemelerinin " +"kaynağı veya güncellemelerin değiştirilip değiştirilmediği " +"doğrulanamayacaktır." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "İmzasız Yazılım İndirilsin Mi?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"İmzalanmamış güncellemeler var. İmza olmadan güncellemenin kaynağı veya " +"üstünde değişiklik yapılıp yapılmadığı doğrulanamaz." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "İmzasız Yazılım Güncellensin Mi?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"İmzalanmamış güncellemeler var. İmza olmadan güncellemenin kaynağı veya " +"üstünde değişiklik yapılıp yapılmadığı doğrulanamaz. İmzasız güncellemeler " +"kaldırılana veya güncellenene dek yazılım güncellemeleri devre dışı " +"kalacaktır." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Güncellemeler kurulamadı: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paketler" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1436 +msgid "Failed to wait on transaction end before download: " +msgstr "İndirmeden önce işlem bitişi beklenemedi: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1443 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1456 +msgid "Failed to download updates: " +msgstr "Güncellemeler indirilemedi: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1495 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1505 +msgid "Failed to trigger update: " +msgstr "Güncelleme tetiklenemedi: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3270 +msgid "Operating System (OSTree)" +msgstr "İşletim Sistemi (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Mağazası" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap Desteği" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap, bir evrensel Linux paketidir" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistem" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Sistem bileşeni" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "'%s' sysupdate görevini kaldırma %i durumuyla başarısız oldu" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..1dec9ae --- /dev/null +++ b/po/uk.po @@ -0,0 +1,7585 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Daniel Korostil , 2013, 2014, 2015, 2016, 2017. +# Yuri Chornoivan , 2020, 2021, 2022, 2023, 2024, 2025. +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-03-16 10:06+0000\n" +"PO-Revision-Date: 2025-03-19 23:06+0200\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=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Lokalize 23.04.3\n" +"X-Project-Style: gnome\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Програми" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Встановлення і оновлення програм" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Програми дозволяють знайти і встановити нові програми та системні " +"розширення, вилучити встановлені програми." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"«Програми» показують рекомендовані та популярні програми з корисним описом і " +"кількома знімками для кожної. Програми можна знайти переглядом списку " +"категорій або через пошук. Також можна оновлювати вашу систему через " +"безмережеве оновлення." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Панель огляду" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Панель подробиць" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Панель установлення" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Панель оновлення" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Подробиці оновлення" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2768 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Проєкт GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Перевірка ключа akmods у Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Щоб отримати доступ до перевірки ключа akmods у Shim UEFI, слід пройти " +"розпізнавання" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Уповноваження ключа akmods у Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Щоб отримати доступ до уповноваження ключа akmods у Shim UEFI, слід пройти " +"розпізнавання" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Перевірка ключа DKMS у Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" +"Щоб отримати доступ до перевірки ключа DKMS у Shim UEFI, слід пройти " +"розпізнавання" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Уповноваження ключа DKMS у Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" +"Щоб отримати доступ до уповноваження ключа DKMS у Shim UEFI, слід пройти " +"розпізнавання" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Встановити файл appstream до загальносистемної теки" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Встановлюємо файл appstream до загальносистемної теки" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Список сумісних проєктів" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Це список таких сумісних проєктів, які слід показувати, як GNOME, KDE і XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Чи опрацьовувати оновлення через «Програми» GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Якщо вимкнено, «Програми» не будуть показувати панель оновлень, не " +"виконуватиме ніяких дій щодо оновлення і не надсилатимуть запитів щодо " +"встановлення нових версій системи." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Автоматично отримувати і встановлювати оновлення" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Якщо увімкнено, «Програми» GNOME автоматично отримуватимуть оновлення " +"програмного забезпечення у фоновому режимі і встановлюватимуть ті з них, які " +"не потребують перезавантаження системи." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"Сповіщати користувача щодо оновлення програмного забезпечення у фоновому " +"режимі" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Якщо увімкнено, «Програми» GNOME сповіщатимуть користувача про оновлення, " +"які було виконано під час бездіяльності з боку користувача." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Чи автоматично оновлювати, коли є тарифний зв'язок" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Якщо ввімкнено, Програми автоматично оновлюються у тлі, навіть якщо " +"використовується тарифний зв'язок (звантаження даних, перевіряння на " +"оновлення тощо, які можуть коштувати для користувача)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Чи це самий перший запуск Програм" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Показувати рейтинг зірочок біля програм" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Відсіювати програми на основі типової гілки" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "Невільні програми показують попередження перед їхнім встановленням" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Коли невільні програми встановлено може з'явитись вікно з попередженням. Це " +"вказує, чи замовчувати це вікно." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Остання часова мітка перевіряння на оновлення" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Останнє сповіщення часова мітка оновлення" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Часова позначка останнього сповіщення про оновлення" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "Часова мітка першого оновлення захисту, очищеного після оновлення" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Остання часова мітка оновлення" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "Тривалість у секундах, щоб перевіряти чи знімок ще дійсний" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Більше значення — більше запитів до віддаленого сервера і тривалість " +"оновлення зображення може забрати більше часу. 0 — ніколи не надсилати запит " +"до сервера, якщо зображення вже збережено." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Сервер, який використовується для огляду програм" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Мінімальний бал карми за огляд" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Огляди з кармою меншою за це число не буде показано." + +#: data/org.gnome.software.gschema.xml:86 +msgid "" +"A list of official repositories that should not be considered 3rd party" +msgstr "Список офіційних сховищ, які слід не вважати сторонніми" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Список обов'язкових сховищ, які не можна вимикати або вилучати" + +#: data/org.gnome.software.gschema.xml:94 +msgid "" +"A list of official repositories that should be considered free software" +msgstr "" +"Перелік офіційних сховищ, які містять програми, які слід вважати відкритими" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "Посилання на ліцензію, коли програму слід вважати відкритою" + +#: data/org.gnome.software.gschema.xml:102 +msgid "" +"Install bundled applications for all users on the system where possible" +msgstr "" +"Встановити збірку програм для всіх користувачів у системі, де це можливо" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Дозволити доступ до вікна сховищ програм" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Пропонувати оновлення до основних випусків" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "Показувати інтерфейс, який повідомляє, що програма не є відкрита" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "Показувати розмір встановлених програм у списку встановлених програм" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" +"'https://uk.wikipedia.org/wiki/" +"%D0%9F%D1%80%D0%BE%D0%BF%D1%80%D1%96%D1%94%D1%82%D0%B0%D1%80%D0%BD%D0%B5_%D0" +"%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BD%D0%B5_%D0%B7%D0%B0%D0%B1%D0%B5" +"%D0%B7%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8F'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Посилання, яке пояснює про невідкриті/закриті програми" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Список адрес, які вказують на файли appstream, які буде отримано до теки " +"каталогу програмного забезпечення" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Встановлювати файли AppStream до загальносистемної теки для усіх " +"користувачів. Якщо матиме значення «false», файли буде встановлено до " +"нестандартного каталогу $XDG_DATA_HOME//swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Порядок пріоритетності форматів пакунків. Важливіші формати передують у " +"списку. Порожній масив означає типове упорядкування. Пропущені формати буде " +"пересунуто у кінець списку. Приклади форматів пакунків: deb, flatpak, rpm, " +"snap. Формати можна вказати додатково разом із початковою назвою, " +"відокремивши їх двокрапкою. Приклад: «flatpak:flathub»." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Часова позначка останньої спроби вилучення невикористаних середовищ Flatpak" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Встановіть значення «true», щоб було показано лише програми із вільними " +"умовами ліцензування і приховано програми із закритим кодом" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Встановіть значення «true», щоб програма показувала лише програми " +"розробників, чию ідентичність було перевірено." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Часова мітка останніх отриманих оновлень." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Рядок, у якому зберігається ідентифікатор gnome-online-account, який " +"використовуватиметься для входу до системи" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Керування програмами у GNOME по всій системі" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Не вдалося розібрати аргумент рядка" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Потрібно вказати лише назву одного файла" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Ця програма може запускатись лише з правами адміністратора" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Не вдалося перевірити тип вмісту: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Не вдалося пересунути: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Установлення програм" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Встановити у систему вибрані програми" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Насильство щодо мультиплікаційних персонажів" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Немає відомостей щодо насильства у мультфільмах" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Насильство щодо уявних персонажів" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Немає відомостей щодо фантазійного насильства" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Реалістичне насильство" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Немає відомостей щодо реалістичного насильства" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Зображення насильства із кривавими сценами" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Немає відомостей щодо кривавого насильства" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Сексуальне насильство" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Немає відомостей щодо сексуального насильства" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Алкоголь" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Немає відомостей щодо згадування про алкогольні напої" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Наркотики" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Немає відомостей щодо згадування про заборонені медикаменти" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Тютюн" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Немає відомостей щодо згадування про тютюнові вироби" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Оголення" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Немає відомостей щодо всякої оголеності" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Сексуальні теми" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Немає відомостей щодо згадування або зображень сексуального характеру" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Лайка" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Немає відомостей щодо усіляких нецензурних виразів" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Сумнівний гумор" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Немає відомостей щодо сумнівного гумору" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Дискримінація" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Немає відомостей щодо дискримінацій у будь-яких її проявах" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Рекламний" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Немає відомостей щодо реклами у будь-яких її проявах" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Азартні ігри" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Немає відомостей щодо азартних ігор у будь-яких її проявах" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Придбання товарів" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Немає відомостей щодо витрачання справжніх грошей у грі" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Спілкування між користувачами" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Немає відомостей щодо можливості спілкування із іншими користувачами" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Звукове спілкування між користувачами" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "" +"Немає відомостей щодо можливості звукового спілкування із іншими " +"користувачами" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Подробиці про контакт" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "Немає відомостей щодо оприлюднення даних соціальної мережі" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Ідентифікаційні дані" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "" +"No information regarding sharing of user information with third parties" +msgstr "Немає відомостей щодо надання даних користувача стороннім особам" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Надання даних щодо місця перебування" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Немає відомостей щодо надання даних щодо фізичного перебування користувача " +"іншим користувачам" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Гомосексуальна поведінка" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Немає відомостей щодо згадування гомосексуальності" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Проституція" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Немає відомостей щодо згадування проституції" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Перелюб" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Немає відомостей щодо згадування перелюбу" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Сексуальні персонажі" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Немає відомостей щодо сексуальних персонажів" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Знущання" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Немає відомостей щодо згадування знущання над людьми" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Рештки мертвих людей" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Немає відомостей щодо показу решток мертвих людей" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Рабство" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Немає відомостей щодо згадування рабства" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Не містить згадок про наркотики" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Не містить нецензурних виразів та інших типів лайки" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Не містить реклами або пропозицій переказів грошей" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Не містить сексуальних сцен та оголеності" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Не містить можливості безконтрольного спілкування між користувачами" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Не містить насильства" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Наркотики" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Нецензурні вирази" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Гроші" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Соціальні мережі" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Насильство" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Усі" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s має невідомий віковий рейтинг" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s може користуватися особа будь-якого віку" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s можуть користуватися немовлята" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s можуть користуватися малі діти" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s можуть користуватися діти" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s можуть користуватися підлітки" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s створено для дорослих" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s можуть користуватися особи віком %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Віковий рейтинг" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Як надати відомості, яких не вистачає" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Локальний файл" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Пакунок" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "У черзі" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Очікуємо на встановлення" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Очікуємо на вилучення" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Встановлення" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "Вилучення" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Отримання" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Встановити" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "В_илучити…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Мережа" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Може обмінюватися даними мережею" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Служби системи" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Може отримувати доступ до служб D-Bus на каналі системи" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Служби сеансу" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Може отримувати доступ до служб D-Bus на каналі сеансу" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Пристрої" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Може отримувати доступ до довільних пристроїв, зокрема вебкамер" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Може отримувати доступ до пристроїв введення" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Може отримувати доступ до мікрофонів і відтворювати звукові дані" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Може отримувати доступ до файлів пристроїв системи" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Вміст екрана" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Може отримувати доступ до вмісту екрана" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Домашня тека" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Може переглядати, редагувати та створювати файли" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Може переглядати файли" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Файлова система" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Тека отриманих даних" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Параметри" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Може переглядати і змінювати будь-які параметри" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Застаріла система керування дисплеєм" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Використовує застарілу небезпечну систему керування дисплеєм" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Втеча з «пісочниці»" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Може подолати обмеження «пісочниці» і обійти будь-які інші обмеження" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Немає доступного опису оновлення." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Подробиці оновлення" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Потребує додаткових прав доступу" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "З сервера отримано некоректні дані щодо оцінок" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Не вдалося обмінятися даними із сервером оцінок" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Огляди" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Для цієї програми не знайдено оглядів." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Немає оглядів" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Журнал версій" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Нове у версії %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Версія %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Немає подробиць щодо цього випуску" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Стартовий режим, один із: «updates», «updated» «installed» або «overview»" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "РЕЖИМ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Пошук програм" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Показувати подробиці програм (через ідентифікатор програми)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "Ідентифікатор" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Показувати подробиць програм (через назву пакунка)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Встановити програму (через ідентифікатор програми)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Вилучити програму (через ідентифікатор програми)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Відкрити локальний файл пакунку" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "НАЗВАФАЙЛА" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Тип взаємодії, які очікується від цієї дії: або «none», або «notify», або " +"«full»" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "ВЗАЄМОДІЯ" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Показати локальну метаінформацію або файл appdata" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Увімкнути докладне діагностичне виведення (від запущеного екземпляра, якщо " +"програму вже запущено)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Встановлює будь-які оновлення з черги у фоновому режимі" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Показати налаштування" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Вийти із запущеного зразку " + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Віддавати перевагу локальним джерелам файлів для AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Показати номер версії" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "© Учасники розробки «Програм GNOME», 2016–2023" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Daniel Korostil " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Вибачте! Не маємо подробиць щодо цієї програми." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Розмір встановлення" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Включає %s даних і %s кешу" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Включає %s даних" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Включає %s кешу" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Використання кешу і даних є невідомим" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Розмір звантаження" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Не потребує додаткового отримання даних системи" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Потребує невідомого обсягу отримання додаткових даних системи" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Потребує додаткового отримання %s системою" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Невідомий розмір" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Права доступу не потрібні" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Має доступ до мережі" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Використовує служби системи" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Використовує служби сеансу" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Може отримувати доступ до апаратних пристроїв" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Може отримувати доступ до пристроїв системи" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Має доступ до читання/запису усіх ваших даних" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Може читати усі ваші дані" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Може читати/записувати дані до теки отриманих вами з інтернету даних" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Може читати дані з теки отриманих вами з інтернету даних" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Може отримувати доступ до певних файлів" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Може отримувати доступ і змінювати параметри роботи користувача" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Використовує застарілу систему керування дисплеєм" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "Може надсилати доступ щодо отримання довільних прав доступу" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Розробник програми є перевіреним" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Рецензовано дистрибутивом ОС" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Рецензовано %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Надано сторонньою компанією" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Підтримку програмного забезпечення припинено" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Придатний до перевірки код" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Невідоме ліцензування" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Закритий код" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Особливе ліцензування" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Привілейований" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Безпечна" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Умовно безпечна" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Потенційно небезпечна" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Небезпечна" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Лише для мобільних" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Працює лише на малих екранах" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Лише для комп'ютерів" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Працює лише на великих екранах" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Невідповідність розміру екрана" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Підтримки поточних розмірів екрана не передбачено" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Потребує сенсорного екрана" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Потребує клавіатури" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Потребує миші" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Потрібен ігровий пульт" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "Потребує для гри ігрового пульта" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Адаптивна" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Працює на телефонах, планшетах та комп'ютерах" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Можливо, потребує клавіатури або миші" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Працює на комп'ютерах та ноутбуках" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Місить неприйнятні для заданого віку дані" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Дані щодо обмежень за віком є недоступними" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Відвідати сайт" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Встановити…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Скасувати" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Встановити" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Отримати" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Оновлення" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Вилучити…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Вилучення" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Критичне оновлення" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Пристрій неможливо використовувати протягом оновлення." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Джерело: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "Перейменовано з %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Отримання оновлень припинено" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Критичне оновлення" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Встановлено" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Допомогти у перекладі %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s спроєктовано, розроблено і перекладено міжнародною спільнотою охочих " +"людей.\n" +"\n" +"Це означає, що хоча програма ще не доступна вашою рідною мовою, ви можете " +"взяти участь у проєкті і допомогти із її перекладом власноруч." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Переклади" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "С_айт перекладу" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Для входу до сховища %s потрібне ім'я користувача (область %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Потрібна реєстрація" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Скасувати" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "_Увійти" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "_Користувач" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Пароль" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Інше" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Усі" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Особливе" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Відібране редактором" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Нове і оновлене" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Відбірне з мережі" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Інші програми" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s встановлено" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Для набуття змінами чинності слід перезапустити систему" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Програма готова до використання" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Оновлення системи встановлено" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Свіже оновлення встановлене і готове до використання" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Перезапустити" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Запустити" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Встановити програмне забезпечення?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Встановити програму третьої сторони?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Увімкнути сховище програмного забезпечення?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Увімкнути сторонні сховища програмного забезпечення?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s — не вільний та відкритий програмний засіб, і його постачає " +"«%s»." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s постачається через «%s»." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"Для продовження встановлення слід увімкнути це сховище програмного " +"забезпечення." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"В деяких країнах встановлення або використання %s може бути незаконне." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"В деяких країнах встановлення або використання цього кодеку може бути " +"незаконне." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Більше _не попереджати" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Увімкнути та _встановити" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Докладні помилки з керування пакунками:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Подробиці" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "З_акрити" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Подробиці скопійовано до буфера" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "При_йняти" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Було встановлено оновлення" +msgstr[1] "Було встановлено оновлення" +msgstr[2] "Було встановлено оновлення" +msgstr[3] "Було встановлено оновлення" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Програми було вилучено" +msgstr[1] "Програми було вилучено" +msgstr[2] "Програми було вилучено" +msgstr[3] "Програму було вилучено" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Для набуття ними чинності слід перезавантажити систему" +msgstr[1] "Для набуття ними чинності слід перезавантажити систему" +msgstr[2] "Для набуття ними чинності слід перезавантажити систему" +msgstr[3] "Для набуття ним чинності слід перезавантажити систему" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Не зараз" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Сьогодні" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Вчора" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d день тому" +msgstr[1] "%d дні тому" +msgstr[2] "%d днів тому" +msgstr[3] "%d день тому" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d тиждень тому" +msgstr[1] "%d тижні тому" +msgstr[2] "%d тижнів тому" +msgstr[3] "%d тиждень тому" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d місяць тому" +msgstr[1] "%d місяці тому" +msgstr[2] "%d місяців тому" +msgstr[3] "%d місяць тому" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d рік тому" +msgstr[1] "%d роки тому" +msgstr[2] "%d років тому" +msgstr[3] "%d рік тому" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Просто зараз" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d хвилину тому" +msgstr[1] "%d хвилини тому" +msgstr[2] "%d хвилин тому" +msgstr[3] "%d хвилину тому" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d годину тому" +msgstr[1] "%d години тому" +msgstr[2] "%d годин тому" +msgstr[3] "%d годину тому" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Усі" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Рекомендовані" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Просторова графіка" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Фотографія" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Сканування" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Векторна графіка" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Переглядачі" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Створення та редагування звукових даних" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Програвачі музики" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Усі" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Рекомендовані" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Календар" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "База даних" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Фінанси" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Текстовий процесор" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Текстові редактори" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Переглядачі інтернету" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Усі" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Рекомендовані" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Дійовик" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Пригоди" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Аркада" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Мозаїка" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Настільні" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Карти" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Емулятори" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Дитячі" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Логіка" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Рольові ігри" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Спорт" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Стратегія" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Усі" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Рекомендовані" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Спілкування" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Усі" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Рекомендовані" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Штучний інтелект" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Астрономія" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Хімія" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Мови" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Математика" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Новини" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Робототехніка" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Мистецтво" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Біографія" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Комікси" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Фантастика" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Здоров'я" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Історія" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Стиль життя" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Політика" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Спорт" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Усі" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Рекомендовані" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Засоби діагностики" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Кодеки" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Драйвери апаратури" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Шрифти" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Джерела введення" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Мовні пакети" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Локалізація" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Творчість" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Робота" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Гра" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Соціалізація" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Навчання" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Розробка" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Кодеки" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Драйвери апаратури" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Шрифти" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Джерела введення" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Мовні пакети" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Локалізація" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Програма" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s потребує підтримування додаткового формату файлів." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Потрібно додаткові типи MIME" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s потребує додаткові шрифти." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Потрібно додаткові шрифти" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s потребує додаткові кодеки." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Потрібно додаткові кодеки" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s потребує додаткові драйвера до принтера." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Потребує додаткові драйвера до принтера" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s потребує додаткові пакунки." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Потрібно додаткові пакунки" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Знайти серед програм" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Показати більше" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Показати менше" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Вилучення…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "Потребує перезапуску системи для завершення встановлення" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "Потребує перезапуску системи для завершення вилучення" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Очікуємо на встановлення…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Оновлення у черзі…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Отримання…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Приготування…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Вилучаємо…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s не встановлено, але у системі все ще лишаються її дані." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Перезапустити" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Увімкнути…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Встановити…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s буде показано американською англійською" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Інтерфейс цієї програми буде показано американською англійською" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Інтерфейс цієї програми буде показано американською англійською" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Допомогти у п_ерекладі" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Інші програми %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Розробником %s підтверджено належність %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Розробником підтверджено належність %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Щоб написати відгук, потрібен інтернет" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "Ця програма більше не підлягає оновленню, зокрема виправленню захисту" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Цю програму вже забезпечено вашим дистрибутивом і її не варто заміняти." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Авторами цієї програми не надано жодних посилань на сайти, сховища коду або " +"сторінку системи стеження за вадами." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Це програмне забезпечення більше не підлягає оновленню, зокрема виправленню " +"захисту" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Цю програму вже забезпечено вашим дистрибутивом і її не варто заміняти." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Авторами цієї програми не надано жодних посилань на сайти, сховища коду або " +"сторінку системи стеження за вадами." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"«Програмам» не вдалося отримати дані щодо «%s» — програма не може показати " +"подробиці щодо цієї програми." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Від сервера отримано некоректну відповідь щодо рецензування" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Не вдалося надіслати відгук щодо «%s»: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Сторінка подробиць" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Завантаження подробиць щодо програми" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Перевірено" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "_Відкрити" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Оновити" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "Вилучити" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Додатки" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Цю програму можна використовувати лише, коли є з'єднання з інтернетом. " + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Визначено сховище програмного забезпечення" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"До запису цієї програми включено сховище програмного забезпечення, яке надає " +"оновлення, а також доступ до іншого програмного забезпечення." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Не визначено сховища програмного забезпечення" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Запис цієї програми не містить даних щодо сховища, звідки її можна " +"встановити. Її не буде оновлено до нової версії." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Виявлено сховище програм" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Додавання цього сховища програм надасть доступ до додаткових програм і " +"оновлень." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Використовувати тільки ті сховища програм, яким ви довіряєте." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Вилучити дані програми" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "Ви_лучити дані" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Немає метаданих" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "_Сайт проєкту" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Підтримати фінансово" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "Д_опомогти із перекладом" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "По_відомити про ваду" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Довідка" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Контакт" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "_Написати рецензію" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Усі огляди" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Не вдалося показати подробиці щодо програми" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Не вдалося приготувати перезавантаження" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Невідома помилка" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Ключ не знайдено" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Цей ключ не уповноважено" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Потрібен уповноваження MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "_Далі" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"На цьому пристрої увімкнено Secure Boot. Щоб уможливити вмикання нових " +"драйверів, потрібно зареєструвати новий ключ власника машини (MOK). Процес " +"потребує введення пароля на наступному етапі. Будь ласка, запишіть наступний " +"пароль, пов'язаний з ключем:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Мною записано п_ароль MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "П_ерезапустити і уповноважити…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Настанови з налаштовування: будь ласка, прочитайте уважно" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Після перезапуску буде показано сторінку налаштовування пристроїв. Щоб " +"увімкнути нові драйвери, виконайте такі кроки з налаштовування:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Виберіть «Уповноважити MOK»\n" +"• Виберіть «Так», щоб уповноважити ключі\n" +"• Введіть пароль MOK у відповідь на запит\n" +"• Виберіть «Перезавантажити»" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Зауваження щодо безпеки" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Після успішного уповноваження ключа майте на увазі, що будь-які майбутні " +"оновлення модуля або будь-якого іншого модуля будуть неявним чином " +"довіреними. Усі майбутні оновлення відбуватимуться прозоро без взаємодії та/" +"або авторизації." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Подальші настанови можна знайти на сторінці документації." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Отримання додаткових файлів метаданих…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " і " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Доступні шрифти для писемностей %s" +msgstr[1] "Доступні шрифти для писемностей %s" +msgstr[2] "Доступні шрифти для писемностей %s" +msgstr[3] "Доступний шрифт для писемності %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Доступні програми для %s" +msgstr[1] "Доступні програми для %s" +msgstr[2] "Доступні програми для %s" +msgstr[3] "Доступна програма для %s" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Потрібного програмного забезпечення не знайдено" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "Не вдалося знайти потрібного вам програмного забезпечення" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s не знайдено" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "на сайті" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Немає жодної програми, яка б забезпечувала файл %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "Відомості про %s, як і варіанти одержання програми, можна знайти %s. " + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "Немає жодної програми, яка підтримує %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s — недоступна." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Відомості про %s, як і варіанти одержання програми, що підтримує це формат, " +"можна знайти %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Не знайдено жодного доступного шрифту для підтримування скрипту %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Відомості про %s, як і варіанти одержання додаткових шрифтів, можна знайти " +"%s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Немає жодного кодеку для формату %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Відомості про %s, як і варіанти одержання кодеків, що можуть програти цей " +"формат, можна знайти %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Немає жодного ресурсу плазми, що підтримує %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Відомості про %s, як і варіанти одержання додаткових ресурсів плазми, можна " +"знайти %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Немає жодного доступного драйвера принтера для %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Відомості про %s, як і варіанти одержання драйвера, що підтримують цей " +"принтер, можна знайти %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "документацією" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Не вдалося знайти %s, потрібної для %s. Будь ласка, ознайомтеся із %s, щоб " +"дізнатися більше." +msgstr[1] "" +"Не вдалося знайти %s, потрібної для %s. Будь ласка, ознайомтеся із %s, щоб " +"дізнатися більше." +msgstr[2] "" +"Не вдалося знайти %s, потрібної для %s. Будь ласка, ознайомтеся із %s, щоб " +"дізнатися більше." +msgstr[3] "" +"Не вдалося знайти %s, потрібної для %s. Будь ласка, ознайомтеся із %s, щоб " +"дізнатися більше." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Не вдалося знайти потрібного вам %s. Будь ласка, ознайомтеся із %s, щоб " +"дізнатися більше." +msgstr[1] "" +"Не вдалося знайти потрібного вам %s. Будь ласка, ознайомтеся із %s, щоб " +"дізнатися більше." +msgstr[2] "" +"Не вдалося знайти потрібного вам %s. Будь ласка, ознайомтеся із %s, щоб " +"дізнатися більше." +msgstr[3] "" +"Не вдалося знайти потрібного вам %s. Будь ласка, ознайомтеся із %s, щоб " +"дізнатися більше." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Нічого не знайдено: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "Формат файла %s" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "Встановити _усе" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Неможливо знайти потрібну програму" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Сторінка кодека" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Нічого не знайдено" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Не вдалося виконати пошук" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Назад" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Далі" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Список рекомендованих програм" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Підтримка звичайних комп'ютерів" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Підтримка користування на великому екрані" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Немає даних щодо підтримки звичайних комп'ютерів" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Недостатньо даних для визначення, чи передбачено підтримку великих екранів" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Потребує великого екрана" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Не передбачено підтримки звичайних комп'ютерів" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Не можна користуватися на великих екранах" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Підтримка мобільних пристроїв" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Підтримка користування на малому екрані" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Немає даних щодо підтримки мобільних пристроїв" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Недостатньо даних для визначення, чи передбачено підтримку малих екранів" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Потребує малого екрана" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Підтримки мобільних пристроїв не передбачено" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Не можна користуватися на малих екранах" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Підтримка клавіатури" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Немає даних щодо підтримки клавіатури" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Недостатньо даних для визначення, чи передбачено підтримку клавіатур" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Потрібна клавіатура" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Підтримує клавіатуру" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Не передбачено підтримки клавіатури" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Не можна користуватися за допомогою клавіатури" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Підтримка миші" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Потрібна миша або координатний пристрій" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Немає даних щодо підтримки миші" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Недостатньо даних для визначення, чи передбачено підтримку мишей або " +"координатних пристроїв" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Потрібна миша" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Підтримує миші і координатні пристрої" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Підтримки миші не передбачено" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Не можна користуватися за допомогою миші або координатного пристрою" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Підтримка сенсорних екранів" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Немає даних щодо підтримки сенсорних екранів" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Недостатньо даних для визначення, чи передбачено підтримку сенсорних екранів" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Потрібен сенсорний екран" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Підтримує сенсорні екрани" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Підтримки сенсорних екранів не передбачено" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Не можна користуватися за допомогою сенсорного екрана" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Потрібен ігровий пульт" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Потребує ігрового пульта" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Підтримка ігрових пультів" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Підтримує ігрові пульти" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s ймовірно працюватиме на цьому пристрої" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s працюватиме на цьому пристрої" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s ймовірно працюватиме на цьому пристрої" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s не працюватиме належним чином на цьому пристрої" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s на працюватиме на цьому пристрої" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Підтримка апаратної частини" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Навігація" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Перейти до сторінки ознайомлення" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Перейти до сторінки встановлених" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Перейти до сторінки оновлень" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Відкрити панель пошуку" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Вікна" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Відкрити налаштування" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Відкрити сховища програм" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Довідка" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Відкрити вікно клавіатурних скорочень" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Встановлено" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Сторінка встановлених" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Обробка" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Програми" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Вебпрограми" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Системні програми" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Збірка спільноти" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "Вз_яти участь" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Розробка цієї програми відкрито ведеться міжнародною спільнотою. Випуск " +"здійснюється за умов ліцензування %s.\n" +"\n" +"Ви можете взяти участь у розробці і покращити програму." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Розробка цієї програми відкрито ведеться міжнародною спільнотою. Випуск " +"здійснюється за умов ліцензування %s.\n" +"\n" +"Ви можете взяти участь у розробці і покращити програму." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Розробка цього програмного забезпечення відкрито ведеться міжнародною " +"спільнотою. Випуск здійснюється за умов ліцензування %s.\n" +"\n" +"Ви можете взяти участь у розробці і покращити програму." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Розробка цього програмного забезпечення відкрито ведеться міжнародною " +"спільнотою. Випуск здійснюється за умов ліцензування %s.\n" +"\n" +"Ви можете взяти участь у розробці і покращити програму." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Невідоме ліцензування" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Дізнатись більше" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Для цієї програми не вказано умов ліцензування, які було використано під час " +"її розробки. Її початковий код може бути закритим. У неї можуть бути " +"проблеми із захистом, які важко виявити і які можуть з'явитися без належного " +"нагляду.\n" +"\n" +"Невідомо, чи зможете ви робити внески у розвиток цієї програми." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Для цього програмного забезпечення не вказано умов ліцензування, які було " +"використано під час її розробки. Її початковий код може бути закритим. У неї " +"можуть бути проблеми із захистом, які важко виявити і які можуть з'явитися " +"без належного нагляду.\n" +"\n" +"Невідомо, чи зможете ви робити внески у розвиток цієї програми." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Закритий код" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Розробка цієї програми виконується у закритому режимі, отже лише розробникам " +"відомі принципи її роботи. У неї можуть бути проблеми із захистом, які важко " +"виявити і які можуть з'явитися без належного нагляду.\n" +"\n" +"Ви не зможете робити внески у розвиток цієї програми." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Розробка цієї програми виконується у закритому режимі, отже лише розробникам " +"відомі принципи її роботи. У неї можуть бути проблеми із захистом, які важко " +"виявити і які можуть з'явитися без належного нагляду.\n" +"\n" +"Ви не зможете робити внески у розвиток цієї програми." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Особливе ліцензування" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Цю програму розроблено зі спеціальними умовами ліцензування %s.\n" +"\n" +"Можливі різні варіанти можливості брати участь у розробці цієї програми." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Цю програму розроблено зі спеціальними умовами ліцензування «%s».\n" +"\n" +"Можливі різні варіанти можливості брати участь у розробці цієї програми." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Це програмне забезпечення розроблено зі спеціальними умовами ліцензування %s.\n" +"\n" +"Можливі різні варіанти можливості брати участь у розробці цього програмного " +"забезпечення." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Це програмне забезпечення розроблено зі спеціальними умовами ліцензування " +"«%s».\n" +"\n" +"Можливі різні варіанти можливості брати участь у розробці цього програмного " +"забезпечення." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Освіження даних" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Завантаження сторінки" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Запуск" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Невідоме джерело" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Бета" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Користувач" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Додавання" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Вилучення" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Оновлення" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Зниження версій" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "вибраних зовнішніх джерел" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Надає доступ до додаткового програмного забезпечення з %s. Включено частину " +"програмного забезпечення із закритим кодом.\n" +"\n" +"Ви можете увімкнути ці сховища пізніше у налаштуваннях сховищ програмного " +"забезпечення." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Увімкнути сторонні сховища програмного забезпечення?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_Ігнорувати" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Увімкнути" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Доступні для вашої операційної системи" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "Доступні для %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Ознайомлення" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Сторінка огляду" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Доступні програми" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Інші категорії" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Не знайдено даних про програму" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Невідома" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_Гаразд" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Користувач відмовив у встановленні" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Підготувати %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Вилучити запис сховища %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Всі програми з %s буде вилучено, потрібно перевстановити сховище, щоб " +"використовувати його знову." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "Вилучити %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Після вилучення ви не зможете користуватися %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Після вилучення ви не зможете користуватися будь-якою програмою, яка " +"залежить від %s." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Після вилучення ви не зможете користуватися %s. Усі документи, де його " +"використано буде показано іншим шрифтом." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Після вилучення ви не зможете користуватися %s. Це означає, що не можна буде " +"відтворити деякі мультимедійні файли." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Після вилучення обладнання, робота якого залежить від %s, може почати " +"працювати нештатно." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Після вилучення ви не зможете користуватися %s. Дані і параметри програми " +"буде збережено на диску, щоб стан програми можна було відновити у " +"майбутньому." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Налаштування" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Оновлення програм" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Докладніше" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Пошук і отримання оновлень призводить до обміну даними та витрачання " +"енергії. Через це можливості з автоматичного оновлення буде призупинено при " +"використанні з'єднань мережею із обліком обміну даними та у режимах " +"енергозаощадження." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Автоматично" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Автоматично шукати і отримувати оновлення" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "В_ручну" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Пошук і отримання оновлень має бути виконано вручну" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "С_повіщення щодо автоматичних оновлень" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Показувати сповіщення, коли програма автоматично встановлює оновлення" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Фільтри даних" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Показувати лише ві_льні програми" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Приховати закриті програми при навігації та пошуку" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Показувати лише _перевірених розробників" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Показувати лише програми розробників, чию ідентичність було перевірено" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Встановлене програмне забезпечення є несумісним із %s. Його буде автоматично " +"вилучено протягом оновлення." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Несумісні програми" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Оновити" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "В_илучити" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Параметри і дані програми" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Зберегти" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Уможливлює відновлення параметрів і даних програми" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "В_илучити" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Остаточно вилучити дані для заощадження місця на диску" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"Програмне забезпечення, яке було встановлено з «%s», не отримуватиме " +"оновлень." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Вимкнути сховище?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Вилучити сховище?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "Ви_мкнути" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "В_илучити" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Увімкнути нові сховища" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Увімкнути нові сховища після додавання" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "докладніше" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Додаткові сховища з вибраних сторонніх — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Сторонні сховища Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "операційна система" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Ці сховища доповнюють типове програмне забезпечення, яке надається %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Сховища програм" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Немає сховищ" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "Встановлено %u програму" +msgstr[1] "Встановлено %u програми" +msgstr[2] "Встановлено %u програм" +msgstr[3] "Встановлено одну програму" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "Встановлено %u додаток" +msgstr[1] "Встановлено %u додатки" +msgstr[2] "Встановлено %u додатків" +msgstr[3] "Встановлено один додаток" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u програму" +msgstr[1] "%u програми" +msgstr[2] "%u програм" +msgstr[3] "%u програму" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u додаток" +msgstr[1] "%u додатки" +msgstr[2] "%u додатків" +msgstr[3] "%u додаток" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "Встановлено %s і %s" +msgstr[1] "Встановлено %s і %s" +msgstr[2] "Встановлено %s і %s" +msgstr[3] "Встановлено %s і %s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Перевіряємо встановлене програмне забезпечення…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Вилучити" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Ненавиджу" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Не подобається" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Може бути" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Подобається" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Обожнюю" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Виберіть зірку, щоб залишити оцінку" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Приділіть трохи уваги написанню огляду, будь ласка" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Виберіть рейтинг зірок" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Підсумок закороткий" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Підсумок задовгий" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Опис закороткий" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Опис задовгий" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Написати рецензію" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Надіслати" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Будь ласка, додайте оцінку, резюме та текст рецензії. Рецензіями не слід " +"користуватися для сповіщень про вади: для надсилання звітів про вади " +"зв'яжіться із розробником або службою надання підтримки." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Резюме рецензії" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Написати коротку рецензію" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Ознайомтеся із переліком даних, які буде надіслано, на нашій сторінці правил конфіденційності. Кожен зможе бачити ім'я повністю, яке пов'язане з вашим обліковим " +"записом." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "%u рецензія загалом" +msgstr[1] "%u рецензії загалом" +msgstr[2] "%u рецензій загалом" +msgstr[3] "%u рецензія загалом" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "з 5 зірок" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Невідоме" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "Можете звітувати про образливу, грубу або дискримінаційну поведінку." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Якщо зазвітовано, огляд буде сховано, поки його не перевірить адміністратор." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Зазвітувати про огляд?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "_Повідомити" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Вилучити рецензію?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Вилучення рецензії є незворотною дією." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Уподобати рецензію" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Не уподобати рецензію" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Зазвітувати…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Вилучити…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Програма працюватиме не у «пісочниці», але автори дистрибутива перевірили — " +"у ній немає доданого шахраями коду" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Вкажіть, що ви довіряєте постачальнику, оскільки програма працюватиме не у " +"«пісочниці»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Права доступу не потрібні" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Програма повністю працює у «пісочниці»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Доступ до мережі" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Може отримувати доступ до мережі" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Без доступу до мережі" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Не може отримувати доступ до інтернету" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Використовує служби системи" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Може надсилати запити щодо даних служб системи" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Використовує служби сеансу" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Може надсилати запити щодо даних служб сеансу" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Доступ користувачів до пристроїв" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Може отримувати доступ до пристроїв, подібних до вебкамер та ігрових " +"контролерів" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Без доступу користувача до пристроїв" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Не може отримувати доступ до пристроїв, подібних до вебкамер та ігрових " +"контролерів" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Доступ до пристроїв введення" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Доступ до мікрофонів і відтворення звукових даних" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Може отримувати дані з мікрофонів і відтворювати звукові дані без надсилання " +"запиту щодо дозволів" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Доступ до пристроїв системи" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "" +"Може отримувати доступ до пристроїв системи, що потребує розширення прав " +"доступу" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Доступ до вмісту екрана" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Може отримувати доступ до вмісту екрана або інших вікон" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Застаріла система керування вікнами" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "Довільні права доступу" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Параметри користувача" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "Доступ до читання-запису усієї файлової системи" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Може читати і записувати усі дані у файловій системі" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Доступ до читання-запису домашньої теки" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Може читати і записувати усі дані у вашому домашньому каталозі" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "Доступ до читання усієї файлової системи" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Може читати усі дані у файловій системі" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Доступ до читання з домашньої теки" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Може читати усі дані з вашого домашнього каталогу" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Доступ на читання-запис до теки отриманих з інтернету даних" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "" +"Може читати і записувати усі дані з теки отриманих вами з інтернету даних" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Доступ до читання теки отриманих з інтернету даних" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Може читати усі дані з теки отриманих вами з інтернету даних" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Може читати і записувати усі дані у каталозі" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Може читати усі дані у каталозі" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Без доступу до файлової системи" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Не може отримувати доступ до файлової системи взагалі" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Розробник програми є перевіреним" + +#: src/gs-safety-context-dialog.c:386 +msgid "" +"The developer of this app has been verified to be who they say they are" +msgstr "Виконано перевірку ідентифікації розробника цієї програми" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Небезпечні залежності" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Підтримку програмного забезпечення або його залежностей припинено — безпека " +"користування ним під сумнівом" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Умови ліцензування цієї програми не вказано. Її код може бути закритим" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Умови ліцензування цього програмного забезпечення не вказано. Її код може " +"бути закритим" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Закритий код" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Початковий код не є загальнодоступним, тому його незалежний аналіз не є " +"можливим — він може бути небезпечним" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Цю програму розроблено зі спеціальними умовами ліцензування «%s»" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "" +"Це програмне забезпечення розроблено зі спеціальними умовами ліцензування " +"«%s»" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Придатний до перевірки код" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Початковий код є загальнодоступним і може бути проаналізований незалежними " +"фахівцями — це робить ймовірність того, що програма є безпечною, вищою" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s є привілейованою" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s є безпечною" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s є умовно безпечною" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s є потенційно небезпечною" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s не є безпечною" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Невідоме" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Безпека" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Ліцензія" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Джерело" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"У цій програмі використано застарілу версію платформи для розробки (SDK), " +"отже, у ній можуть міститися вади або вразливості захисту, які не було " +"виправлено." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Попередній знімок вікна" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Наступний знімок вікна" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Немає знімків" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Знімок не знайдено" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Не вдалося завантажити зображення " + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Розмір знімка не знайдено" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Неможливо створити кеш" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Знімок — неправильний" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Знімок недоступний" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Знімок" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "і ще %u відповідник" +msgstr[1] "і ще %u відповідники" +msgstr[2] "і ще %u відповідників" +msgstr[3] "і ще %u відповідник" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Сторінка пошуку" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Пошук програм" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Програм не знайдено" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "«%s»" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Неможливо звантажити оновлення" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Не вдалося отримати оновлення мікропрограми" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Не вдалося отримати оновлення мікропрограми з %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Неможливо звантажити оновлення з %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Не вдалося оновити: потрібен доступ до інтернету" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Не вдалося оновити: бракує місця на диску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Неможливо звантажити оновлення з %s: бракує місця на диску" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Не вдалося оновити: слід пройти розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Не вдалося оновити: некоректне розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Не вдалося оновити: потрібні права доступу" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Неможливо звантажити оновлення: бракує прав для встановлення програм" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Неможливо одержати перелік оновлень" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "Не вдалося встановити: не вдалося отримати дані" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Не вдалося встановити %s: не вдалося отримати з %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Не вдалося встановити %s: не вдалося отримати дані" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "Не вдалося встановити: немає середовища виконання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Неможливо встановити %s, бо бракує бібліотеки %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "Неможливо встановити %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "Не вдалося встановити: потрібен доступ до інтернету" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "Не вдалося встановити: некоректний формат програми" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "Не вдалося встановити: бракує місця на диску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Не вдалося встановити %s: бракує місця на диску" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "Не вдалося встановити: слід пройти розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Не вдалося встановити %s: слід пройти розпізнавання" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "Не вдалося встановити: некоректне розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Не вдалося встановити %s: некоректне розпізнавання" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Не вдалося встановити: потрібні права доступу" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Не вдалося встановити %s: потрібні права доступу" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "Не вдалося встановити: пристрій має бути з'єднано із мережею струму" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "" +"Не вдалося встановити %s: пристрій має бути з'єднано із мережею струму" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "Не вдалося встановити: низький рівень заряду акумулятора" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Не вдалося встановити %s: низький рівень заряду акумулятора" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Не вдалося оновити %s з %s, оскільки не вдалося отримати дані" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Не вдалося оновити %s: не вдалося отримати дані" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "" +"Не вдалося встановити оновлення з %s, оскільки не вдалося отримати дані" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Не вдалося оновити: не вдалося отримати дані" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Не вдалося оновити %s: бракує місця на диску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Не вдалося оновити %s: слід пройти розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Не вдалося оновити %s: некоректне розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Не вдалося оновити %s: потрібні права доступу" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Не вдалося оновити: пристрій має бути з'єднано із мережею струму" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Не вдалося оновити %s: пристрій має бути з'єднано із мережею струму" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Не вдалося оновити: низький рівень заряду акумулятора" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Не вдалося оновити %s: низький рівень заряду акумулятора" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "Неможливо оновити %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Не вдалося оновити" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Не вдалося оновити" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Неможливо оновитись до %s з %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Не вдалося оновити: не вдалося отримати дані" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Не вдалося оновити до %s: не вдалося отримати дані" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Не вдалося оновити: потрібен доступ до інтернету" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Не вдалося оновити до %s: потрібен доступ до інтернету" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Не вдалося оновити: бракує місця на диску" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Неможливо оновитись до %s: бракує місця на диску" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Не вдалося оновити: слід пройти розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Неможливо оновитись до %s: потрібне засвідчення" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Не вдалося оновити: некоректне розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Не вдалося оновити до %s: некоректне розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Не вдалося оновити: потрібні права доступу" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Не вдалося оновити до %s: потрібні права доступу" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Не вдалося оновити: пристрій має бути з'єднано із мережею струму" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "" +"Не вдалося оновити до %s: пристрій має бути з'єднано із мережею струму" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Не вдалося оновити: низький рівень заряду акумулятора" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Не вдалося оновити до %s: низький рівень заряду акумулятора" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Не вдалося оновити до %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Не вдалося вилучити: слід пройти розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Не вдалося вилучити %s: слід пройти розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Не вдалося вилучити: некоректне розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Не вдалося вилучити %s: некоректне розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Не вдалося вилучити: потрібні права доступу" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Не вдалося вилучити до %s: потрібні права доступу" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Не вдалося вилучити: пристрій має бути з'єднано із мережею струму" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Не вдалося вилучити %s: пристрій має бути з'єднано із мережею струму" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Не вдалося вилучити: низький рівень заряду акумулятора" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Не вдалося вилучити %s: низький рівень заряду акумулятора" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Не вдалося вилучити %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "Не вдалося запустити %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Вибачте, щось не спрацювало" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Неможливо запустити %s: %s не встановлено" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "На диску недостатньо місця для виконання дії" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Не вдалося встановити: не передбачено підтримки цього типу файлів" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "Не вдалося встановити: не вдалося пройти розпізнавання" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "Не вдалося встановити" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "Неможливо під'єднатись до %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "Перезапустіть програму, щоб скористатися новими додатками" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Пристрій має бути з'єднано" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Рівень заряду акумуляторів є надто низьким" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "Сховища _програм" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Налаштування" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Клавіатурні скорочення" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Про «Програми»" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Пошук" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Головне меню" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Шукати серед програм" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_Дослідити" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Встановлено" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Оновлено" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Повернутися" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Немає" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Дані програми" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Дані, які потрібні для роботи програми" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Дані користувача" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Дані, які створено вами у програмі" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Дані кешу" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Тимчасово кешовані дані" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Сама програма" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Потрібні залежності" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Спільні компоненти системи, які потрібні цій програмі" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Невідомий" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Дані з кешу можна витерти за допомогою _параметрів програми." + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Сховище даних" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (встановлено)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (встановлення)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (отримання)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (вилучення)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "Подро_биці" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_Вивчити" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Встановлено на %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "Встановлені оновлення" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Оновлення не встановлено" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Оновлення втратило актуальність" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Будь ласка, виконайте пошук доступних оновлень" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "До встановлення готові критичні оновлення" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Встановіть критичні оновлення якомога швидше" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Доступні до отримання критичні оновлення" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Отримайте критичні оновлення якомога швидше" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "Готові до встановлення оновлення" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Оновлення програмного забезпечення готові і очікують" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Доступні до отримання оновлення" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Можна отримати оновлення програмного забезпечення" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "Оновлено %u програму — слід перезавантажити систему" +msgstr[1] "Оновлено %u програми — слід перезавантажити систему" +msgstr[2] "Оновлено %u програм — слід перезавантажити систему" +msgstr[3] "Оновлено %u програму — слід перезавантажити систему" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "Оновлено %u програму" +msgstr[1] "Оновлено %u програми" +msgstr[2] "Оновлено %u програм" +msgstr[3] "Оновлено %u програму" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "Оновлено %s." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Будь ласка, перезапустіть програму." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "Було оновлено %s і %s." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u програма потребує перезапуску." +msgstr[1] "%u програми потребують перезапуску." +msgstr[2] "%u програм потребують перезапуску." +msgstr[3] "%u програма потребує перезапуску." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Включає %s, %s і %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Термін придатності системи завершено" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Оновіть систему, щоб продовжити отримувати оновлення" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Нова версія %s доступна для встановлення" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Доступні оновлення програм" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Не вдалось оновити програми" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Приготовані оновлення не було встановлено" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Показати подробиці" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Оновлення системи завершено" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Вітаємо у %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Оновлення встановлено" +msgstr[1] "Оновлення встановлено" +msgstr[2] "Оновлення встановлено" +msgstr[3] "Оновлення встановлено" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Важливе оновлення системи встановлено." +msgstr[1] "Важливі оновлення системи встановлено." +msgstr[2] "Важливі оновлення системи встановлено." +msgstr[3] "Важливе оновлення системи встановлено." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Переглянути" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Не вдалось оновити" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Систему вже оновлено." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Оновлення скасовано." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Потрібний доступ до інтернету, проте його немає. Переконайтесь, що ви маєте " +"доступ до інтернету і спробуйте ще раз." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Є кілька проблем з оновленням безпеки. Порадьтесь з постачальником програм " +"про подальші дії." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Недостатньо місця на диску. Спорожніть місце і спробуйте заново." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"На жаль: оновлення не вдалося встановити. Заждіть іншого оновлення і " +"спробуйте ще раз. Якщо проблема повториться, зв'яжіться з постачальником " +"програм." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Востаннє перевірено: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Зупинити" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Перевірити наявність оновлень" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "Отримання критичних оновлень %s %s припинено" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "Отримання критичних оновлень для вашої операційної системи припинено" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Може стягуватися сплата за обмін даними" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Перевіряння на оновлення під час використання мобільного інтернету може " +"забрати чимало трафіку." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "Перевірити поп_ри це" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Отримано нові версії програм" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Оновлення готові до встановлення" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Перевірити на оновлення" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Оновлення" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Сторінка оновлень" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Завантаження оновлень" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Дія може бути досить тривалою" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Актуальне" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Використовувати мобільне з'єднання?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Перевіряння на оновлення, коли використання мобільного інтернету може " +"прискорити розрядження батареї" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "Все одно п_еревірити" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Немає з'єднання" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "З'єднатися з інтернетом для пошуку оновлень" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Параметри _мережі" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Помилка" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Оновлення автоматично опрацьовуються" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Оновлення програмного забезпечення призупинено" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Автоматичне оновлення програмного забезпечення було призупинено з таких " +"причин:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• У поточному з'єднанні з мережею ведеться облік обміну даними" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Для поточного з'єднання з мережею заборонено отримання значних обсягів " +"даних" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Активним є режим заощадження енергії" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Активним є ігровий режим" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Оновлення програмного забезпечення призупинено" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "" +"У з'єднанні з мережею ведеться облік обміну даними — оновлення програмного " +"забезпечення призупинено" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Для поточного з'єднання з мережею заборонено отримання значних обсягів даних " +"— оновлення програмного забезпечення призупинено" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "" +"Активним є режим заощадження енергії — оновлення програмного забезпечення " +"призупинено" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "" +"Активним є ігровий режим — оновлення програмного забезпечення призупинено" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "П_ерезавантажити і оновити…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "О_новити все" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Отримано оновлення програм" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Оновлення готові до встановлення" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Вбудовані мікроконтролери" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Потрібно перезавантажити" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Оновлення програми" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Прошиті програми для пристроїв" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Звантажити" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "Доступна %s %s" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "Доступна %s" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Дізнатися більше про нову версію" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Отримано %s з %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Отримано %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Велике оновлення, з новими можливостями і виправленнями." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Скасувати оновлення" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "П_ерезавантажити і оновити…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Не забудьте створити резервні копії ваших даних і файлів до оновлення." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Подробиці щодо помилки" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Копіювати подробиці" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Не вдалося вилучити файл «%s»: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "Не вдалося вилучити каталог «%s»: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Встановити, вилучити або оновити програмні засоби на комп'ютері" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Оновлення;Джерело;Сховище;Параметри;Налаштування;Встановити;Вилучити;" +"Програма;Магазин;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s приготовано" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "" +"%s приготовано до вмикання, яке заплановано на наступне завантаження системи." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Увімкнути" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Оновлення системи" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Загальні оновлення системи, зокрема виправлення, пов'язані із безпекою та " +"вадами, а також удосконалення швидкодії." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "Оновлення %s із новими можливостями і виправленнями." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Службі оновлень EOS не вдалося отримати і застосувати оновлення." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Вебпрограма" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Підтримка вебпрограм" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Запуск популярних вебпрограм у програмі для перегляду інтернету" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Оновіть систему, щоб отримати доступу до найсвіжіших можливостей, поліпшеної " +"швидкодії та стабільності роботи." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Підтримка Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "" +"Flatpak — система програм і бібліотек для роботи із програмами для робочих " +"станцій на Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Тека системи %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Підтека домашньої теки %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Теки основної системи" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Налаштування основної системи з /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Тека стільниці" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Підтека стільниці %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Тека документів" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Підтека документів %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Тека музики" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Підтека музики %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Тека зображень" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Підтека зображень %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Тека спільного ресурсу" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Підтека спільного ресурсу %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Тека відео" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Підтека відео %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Тека шаблонів" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Підтека шаблонів %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Тека кешу користувача" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Підтека кешу користувача %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Тека налаштувань користувача" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Підтека налаштувань користувача %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Тека даних користувача" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Підтека даних користувача %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Тека середовища виконання користувача" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Підтека середовища виконання користувача %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "Доступ до файлової системи %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Отримуємо метадані flatpak для %s…" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Не вдалося очистити додаток «%s»: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Встановлення для користувача" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Загальносистемне встановлення" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Ідентифікатор програми" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Не вдалося додати для встановлення додатка «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Не вдалося додати для вилучення додатка «%s»: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Віддалене сховище «%s» забороняє встановлення «%s», ймовірно, через його " +"фільтр. Вилучіть фільтр і повторіть встановлення. Докладне повідомлення про " +"помилку: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "" +"Живлення системи перебуває на надто низькому рівні, щоб виконати оновлення" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "" +"Живлення системи перебуває на надто низькому рівні, щоб виконати оновлення " +"(%u%%, потрібно %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "" +"Пристрій є недоступним або перебуває поза діапазоном роботи бездротової " +"мережі" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Заряд акумулятора пристрою є надто низьким" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Заряд акумулятора пристрою є надто низьким (%u%%, потрібно %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Пристрій очікує на застосування оновлення" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "" +"Пристрій потребує живлення від мережі змінного струму для встановлення " +"з'єднання" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Пристроєм не можна користуватися, доки закрито кришку" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "Оновлення для пристрою %s" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "Оновлення системи для %s" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "Оновлення для вбудованого контролера %s" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "Оновлення ME для %s" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "Оновлення корпоративного ME для %s" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "Оновлення клієнтського ME для %s" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "Оновлення для контролера %s" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "Оновлення для контролера Thunderbolt %s" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "Оновлення для мікропрограми процесора %s" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "Оновлення налаштувань %s" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "Оновлення для акумулятора %s" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "Оновлення для камери %s" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "Оновлення для TPM %s" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "Оновлення для сенсорної панелі %s" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "Оновлення для миші %s" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "Оновлення для клавіатури %s" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "Оновлення для контролера сховища даних %s" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "Оновлення для інтерфейсу мережі %s" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "Оновлення для дисплея %s" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "Оновлення BMC для %s" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "Оновлення для USB-приймача %s" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "Оновлення для пристрою %s" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "Оновлення флеш-диска %s" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "Оновлення SSD %s" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "Оновлення графічного процесора %s" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "Оновлення док-станції %s" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "Оновлення док-станції USB %s" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Мікропрограма" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Не вдалося оновити мікропрограму:" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Підтримка оновлення мікропрограм" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Надає підтримку оновлення мікропрограм" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Встановити непідписану програму?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Програму, яку має бути встановлено, не підписано. Система не зможе " +"перевірити походження оновлень цієї програми і те, чи не було втручання " +"сторонніх осіб у таке оновлення." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Отримати непідписану програму?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Доступні непідписані оновлення. Без підпису система не зможе перевірити " +"походження оновлення, а також те, чи не втручалися в оновлення сторонні " +"особи." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Оновити непідписану програму?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Доступні непідписані оновлення. Без підпису система не зможе перевірити " +"походження оновлення, а також те, чи не втручалися в оновлення сторонні " +"особи. Оновлення програм буде вимкнено, аж доки непідписані оновлення не " +"буде вилучено або оновлено до підписаних." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Не вдалося встановити оновлення: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Пакунки" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Не вдалося дочекатися завершення дії перед завантаженням: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Не вдалося отримати оновлення: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Не вдалося активувати оновлення: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Операційна система (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Крамниця Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Підтримка Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap — універсальний пакунок Linux" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Система" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Компонент системи" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "Вилучаємо завдання sysupdate «%s» — стан %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Гарний спосіб керуванням програмами на вашій системі." + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Неможливо знайти «%s»" + +#~ msgid "Moderate page" +#~ msgstr "Модерувати сторінку" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Немає оглядів для модерування" + +#~ msgid "Was this review useful to you?" +#~ msgstr "Огляд був корисний для вас?" + +#~ msgid "Yes" +#~ msgstr "Так" + +#~ msgid "No" +#~ msgstr "Ні" + +#~ msgid "Meh" +#~ msgstr "Таке собі" + +#~ msgid "Outdated SDK version" +#~ msgstr "Застаріла версія SDK" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Оновлення операційної системи недоступні" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Не вдалося встановити важливі оновлення операційної системи." + +#~ msgid "No Network" +#~ msgstr "Немає мережі" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Потрібен інтернет, щоб перевірити оновлення." + +#~ msgid "Network _Settings" +#~ msgstr "Параметри мере_жі" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Отримано нові версії програмного забезпечення, тепер їх можна встановити." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "" +#~ "Отримано оновлення програмного забезпечення, тепер їх можна встановити." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Будь ласка, введіть число від 1 до %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Виберіть програму:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s вже встановлено" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Було вилучено програми" +#~ msgstr[1] "Було вилучено програми" +#~ msgstr[2] "Було вилучено програми" +#~ msgstr[3] "Було вилучено програму" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Отримання каталогу програмного забезпечення" + +#~ msgid "Unable to install updates" +#~ msgstr "Не вдалося встановити оновлення" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "Не вдалося вилучити: некоректне розпізнавання" + +#~ msgid "Network Settings" +#~ msgstr "Параметри мережі" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Отримання даних щодо оновлень…" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Готове до встановлення важливе оновлення програмного забезпечення." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "" +#~ "Важливо: очікуємо на встановлення критичних оновлень програмного " +#~ "забезпечення." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Будь ласка, отримайте оновлення програмного забезпечення." + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Що подобається вам у програмі? Ваш відгук, разом із вашою аргументацією " +#~ "щодо оцінки, буде корисним для інших користувачів." + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Автоматичне оновлення призупинено" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "У поточній мережі ведеться облік обміну даними. Для з'єднань із обліком " +#~ "даних передбачено обмеження на обсяг даних або стягування сплати за обмін " +#~ "даними. Щоб заощадити ваші ресурси, автоматичне оновлення було " +#~ "призупинено.\n" +#~ "\n" +#~ "Якщо програма неправильно визначила характеристики поточної мережі як " +#~ "мережі із обліком, ви можете змінити значення параметра заборони оновлень " +#~ "у мережі з обліком у «Параметрах»." + +#~ msgid "Open Network _Settings" +#~ msgstr "Відкрити «Параметри _мережі»" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Неможливо звантажити оновлення: потрібен доступ до інтернету, але його " +#~ "немає " + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Неможливо звантажити оновлення: бракує місця на диску" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Неможливо звантажити оновлення: потрібне засвідчення" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Неможливо звантажити оновлення: неправильне засвідчення" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "Неможливо встановити %s: бракує прав для встановлення програм" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Не вдалося встановити %s: рівень заряду акумулятора є надто низьким" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Не вдалося встановити оновлення: недостатньо місця на диску" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Неможливо встановити оновлення: слід пройти розпізнавання" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Не вдалося встановити оновлення: некоректні дані для розпізнавання" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "Неможливо оновити %s: бракує прав для оновлення програм" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "" +#~ "Не вдалося встановити оновлення: у вас немає прав доступу до оновлення " +#~ "програмного забезпечення" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Не вдалося встановити оновлення: потрібне мережеве живлення струмом" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Не вдалося оновити %s: рівень заряду акумулятора є надто низьким" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "" +#~ "Не вдалося встановити оновлення: рівень заряду акумулятора є надто низьким" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "" +#~ "Не вдалося оновитися до %s: потрібен доступ до інтернету, але його немає" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Неможливо оновитись до %s: бракує прав для оновлення програм" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "" +#~ "Не вдалося оновитися до %s: рівень заряду акумулятора є надто низьким" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Неможливо вилучити %s: потрібне засвідчення" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Неможливо вилучити %s: хибне засвідчення" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Неможливо вилучити %s: бракує прав для вилучення програм" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Неможливо вилучити %s: потрібне живлення" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Не вдалося вилучити %s: рівень заряду акумулятора є надто низьким" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Неможливо вилучити %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Не вдалося встановити файл: підтримки таких файлів не передбачено" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Не вдалося встановити: не передбачено підтримки" + +#~ msgid "AC power is required" +#~ msgstr "Потрібне живлення" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Мережа із обліком — автоматичне оновлення призупинено" + +#~ msgid "Find Out _More" +#~ msgstr "З'ясувати _більше" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Щоб уникнути додаткових сплат та вичерпання мережевих квот, отримання " +#~ "оновлень програмного забезпечення не відбуватиметься, якщо ви " +#~ "користуєтеся мобільним з'єднанням або з'єднанням із обліком даних." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Отримує та встановлює будь-які оновлення програмного забезпечення у " +#~ "фоновому режимі, якщо це можливо" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Показати лише _вільні програми" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Показувати лише програми із вільними умовами ліцензування і приховувати " +#~ "програми із закритим кодом" + +#~| msgid "No update description available." +#~ msgid "Loading update description, please wait…" +#~ msgstr "Завантажуємо опис оновлення, будь ласка, зачекайте…" + +#~ msgid "Downloading featured images…" +#~ msgstr "Отримання рекомендованих зображень…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Показати розширену зневаджувальну інформацію" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Може отримувати доступ до довільних файлів" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Ви справді хочете вилучити %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s буде вилучено. Щоб її використовувати знову, потрібно встановити її." + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Остання часова позначка, коли система працювала у мережі і отримала якісь " +#~ "оновлення" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Вибрані додатки буде встановлено з цією програмою." + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Інтерфейс цієї програми ще не перекладено вашою рідною мовою — його буде " +#~ "показано англійською мовою." + +#~ msgid "Applications" +#~ msgstr "Програми" + +#~ msgid "Web Applications" +#~ msgstr "Вебпрограми" + +#~ msgid "Post Review" +#~ msgstr "Оприлюднити огляд" + +#~ msgid "_Post" +#~ msgstr "_Оприлюднити" + +#~ msgid "Rating" +#~ msgstr "Рейтинг" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Надайте короткий підсумок огляду, наприклад: «Чудова програма, " +#~ "рекомендую»." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Оцінити" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "Що думаєте про програму? Надайте більше аргументів вашому огляду." + +#~ msgid "No screenshot provided" +#~ msgstr "Не надано знімку" + +#~ msgid "Restart Now" +#~ msgstr "Перезавантажити зараз" + +#~ msgid "Primary Menu" +#~ msgstr "Основне меню" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Оновлення" + +#~ msgid "Refresh" +#~ msgstr "Освіжити" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "Підтримку %s %s припинено." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Це означає, що система не отримує оновлень захисту." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Рекомендуємо вам оновитися до сучаснішої версії." + +#~ msgid "Application Updates" +#~ msgstr "Оновлення програм" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "GNOME Web" +#~ msgstr "Тенета GNOME" + +#~ msgid "_Continue" +#~ msgstr "_Далі" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Не встановлено жодного оновлення на цій системі." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Керування програмами в середовищі GNOME" + +#~ msgid "Name" +#~ msgstr "Назва" + +#~ msgid "user" +#~ msgstr "користувач" + +#~ msgid "Channel" +#~ msgstr "Канал" + +#~ msgid "Branch" +#~ msgstr "Гілка" + +#~ msgid "URL" +#~ msgstr "Адреса" + +#~ msgid "Installation" +#~ msgstr "Встановлення" + +#~ msgid "Version" +#~ msgstr "Версія" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Каталог програм звантажується" + +#~ msgid "Access arbitrary files" +#~ msgstr "Доступ до довільних файлів" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Може отримувати доступ до довільних файлів у файловій системі" + +#~ msgid "A list of popular applications" +#~ msgstr "Перелік популярних програм" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Перелік програм, які використовуються, не враховуючи визначених системою." + +#~ msgid "Checking…" +#~ msgstr "Перевіряємо…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "Завантаження…" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Отримуємо рейтинги програм…" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "Адреса тла банера оновлення." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "У адресі може міститися до трьох записів «%u», які буде замінено на " +#~ "версію оновлення." + +#~ msgid "Welcome" +#~ msgstr "Вітаємо" + +#~ msgid "Welcome to Software" +#~ msgstr "Ласкаво просимо в Програми" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "«Програми» надають змогу установлювати програми, які вам потрібні. Усі " +#~ "можливості зібрано докупи: перегляньте наші рекомендації, ознайомтеся із " +#~ "категоріями або просто знайдіть бажані програми." + +#~ msgid "_Browse Software" +#~ msgstr "_Навігація програмами" + +#~ msgid "_Add shortcut" +#~ msgstr "_Додати скорочення" + +#~ msgid "Re_move shortcut" +#~ msgstr "В_илучити скорочення" + +#~ msgid "OS Updates" +#~ msgstr "Оновлення системи" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Зокрема покращення швидкодії, стабільності та безпеки." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Отримуємо підпис оновлення мікропрограми…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Отримуємо метадані оновлення мікропрограми…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Права доступу програми є невідомими" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Програма походить з надійного джерела" + +#~ msgid "Unknown Permissions" +#~ msgstr "Невідомі права доступу" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Права доступу, потрібні для цієї програми, є невідомими" + +#~ msgid "App comes from a trusted source" +#~ msgstr "Програма походить з надійного джерела" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "" +#~ "Можливість довіри до цієї програми засвідчено розробниками вашого " +#~ "дистрибутива" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "Не оптимізовано для сенсорних пристроїв або телефонів" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "" +#~ "Показувати запити у відповідь на спроби встановлення зі сховищ закрити " +#~ "програм" + +#~ msgid "_Read More" +#~ msgstr "П_овні дані" + +#~ msgid "_Read Less" +#~ msgstr "С_корочені дані" + +#~ msgid "_Launch" +#~ msgstr "_Запустити" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Частина із цього програмного забезпечення є закритою, тому має обмеження " +#~ "на користування, поширення та доступ до початкового коду." + +#~ msgid "Find out more…" +#~ msgstr "З'ясувати більше…" + +#~ msgid "_Remove All" +#~ msgstr "В_илучити всі" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Оновлення буде застосовано під час перезавантаження комп'ютера." + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Очікуємо на отримання %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "Звантаження %s %s" + +#~ msgid "Recently Updated" +#~ msgstr "Нещодавно оновлені" + +#~ msgid "Recent Releases" +#~ msgstr "Нещодавні випуски" + +#~ msgid "Remove “%s”?" +#~ msgstr "Вилучити «%s»?" + +#~ msgid "Disable “%s”?" +#~ msgstr "Вимкнути «%s»?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Немає додаткових джерел" + +#~ msgid "_Remove…" +#~ msgstr "Ви_лучити…" + +#~ msgid "_Disable…" +#~ msgstr "Ви_мкнути…" + +#~ msgid "Enabling" +#~ msgstr "Вмикання" + +#~ msgid "Disabling" +#~ msgstr "Вимикання" + +#~ msgid "Enabled" +#~ msgstr "Увімкнено" + +#~ msgid "Disabled" +#~ msgstr "Вимкнено" + +#~ msgid "More…" +#~ msgstr "Ще…" + +#~ msgid "Recommended Games" +#~ msgstr "Рекомендовані ігри" + +#~ msgid "Recommended Creation Applications" +#~ msgstr "Рекомендовані творчі програми" + +#~ msgid "Recommended Work Applications" +#~ msgstr "Рекомендовані програми для роботи" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Ніколи" + +#~ msgctxt "origin" +#~ msgid "Unknown" +#~ msgstr "Невідомо" + +#~ msgid "Localized in your Language" +#~ msgstr "Перекладено на вашу мову" + +#~ msgid "Documentation" +#~ msgstr "Документація" + +#~ msgid "Release Activity" +#~ msgstr "Частота випусків" + +#~ msgid "Developer" +#~ msgstr "Розробник" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Вилучено" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Встановлено" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Оновлено" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Невідомо" + +#~ msgid "History" +#~ msgstr "Історія" + +#~ msgid "%s is Safe" +#~ msgstr "%s є безпечною" + +#~ msgid "Requires a specific screen size" +#~ msgstr "Потребує певного розміру екрана" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s (потребує уваги)" + +#~ msgid "Setting Up Updates…" +#~ msgstr "Підготування оновлень…" + +#~ msgid "Looking for New Updates…" +#~ msgstr "Пошук нових оновлень…" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Усе" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Особливе" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "All" +#~ msgstr "Усі" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Усі" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Рекомендовані" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Усе" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Особливе" + +#~ msgid "Audio & Video" +#~ msgstr "Відео та звук" + +#~ msgid "Developer Tools" +#~ msgstr "Засоби розробляння" + +#~ msgid "Education & Science" +#~ msgstr "Освіта та наука" + +#~ msgid "Games" +#~ msgstr "Ігри" + +#~ msgid "Graphics & Photography" +#~ msgstr "Фотографія та графіка" + +#~ msgid "Productivity" +#~ msgstr "Офіс" + +#~ msgid "Communication & News" +#~ msgstr "Спілкування та новини" + +#~ msgid "Utilities" +#~ msgstr "Засоби" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Рекомендовані звукові та відеопрограми" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Рекомендовані офісні програми" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Не вдалося визначити, доступ до яких частин системи потрібен цій " +#~ "програмі. Це стандартна ситуація для застарілих програм." + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Низькі" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Середні" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Високі" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Невідомі" + +#~ msgid "Public domain" +#~ msgstr "Відкритий домен" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "" +#~ "https://uk.wikipedia.org/wiki/" +#~ "%D0%A1%D1%83%D1%81%D0%BF%D1%96%D0%BB%D1%8C%D0%BD%D0%B5_%D0%BD%D0%B0%D0%B4%D0%B1%D0%B0%D0%BD%D0%BD%D1%8F" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Користувачі пов'язані з такою ліцензією:" +#~ msgstr[1] "Користувачі пов'язані з такими ліцензіями:" +#~ msgstr[2] "Користувачі пов'язані з такими ліцензіями:" +#~ msgstr[3] "Користувач пов'язаний з такою ліцензією:" + +#~ msgid "Sandboxed" +#~ msgstr "В пісочниці" + +#~ msgid "Category" +#~ msgstr "Категорія" + +#~ msgid "Free" +#~ msgstr "Вільна" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Невідома" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Це означає, що програма вільно запускається, копіюється, поширюється, " +#~ "досліджується і редагується." + +#~ msgid "Proprietary Software" +#~ msgstr "Закриті програми" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Це означає, що програма належить особі або компанії. Часто бувають " +#~ "обмеження на використання і код зазвичай недоступний." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Умови ліцензії цієї програми — невідомі." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Для програми було встановлено рейтинг з таких причин:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Немає подробиць щодо цього рейтингу." + +#~ msgid "ratings in total" +#~ msgstr "рейтинг загалом" + +#~ msgid "Software is up to date" +#~ msgstr "Всі програми оновлено" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS — служба, яка надає дані рецензування програм користувачами" + +#~ msgid "Featured %s" +#~ msgstr "Рекомендовані у «%s»" + +#~ msgid "Show" +#~ msgstr "Показати" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Меню фільтрування підкатегорій" + +#~ msgid "Sort" +#~ msgstr "Критерій упорядковування" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Меню упорядковування за підкатегоріями" + +#~ msgid "Select All" +#~ msgstr "Вибрати все" + +#~ msgid "Select None" +#~ msgstr "Зняти вибране" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Казковий персонаж у небезпеці" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Казковий персонаж у сутичці" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Графічна жорстокість застосовується до казкового персонажа" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "Персонаж у небезпеці легко розрізняється від дійсності" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "Персонаж у сутичці легко розрізняється від дійсності" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Графічна жорстокість легко розрізняється від дійсності" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Наполовину вигаданий персонаж у небезпеці" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Картинки про дійсного персонажа в сутичці" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Графічна жорстокість застосовується до дійсного персонажа" + +#~ msgid "No bloodshed" +#~ msgstr "Без кровопролиття" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Неправдоподібне кровопролиття" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Правдоподібне кровопролиття" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Картинки кровопролиття і орудування частинами тіла" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Ґвалтування або інші насильні сексуальні поведінки" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Згадування про алкогольні напої" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Вживання алкогольних напоїв" + +#~ msgid "References to illicit drugs" +#~ msgstr "Згадування про заборонені медикаменти" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Вживання заборонених медикаментів" + +#~ msgid "References to tobacco products" +#~ msgstr "Згадування про тютюнові виробів" + +#~ msgid "Use of tobacco products" +#~ msgstr "Вживання тютюнових виробів" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Коротка художня оголеність" + +#~ msgid "Prolonged nudity" +#~ msgstr "Тривала оголеність" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Згадування або картинки задирливого характеру" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Згадування або картинки сексуального характеру" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Графічна сексуальна поведінка" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Часткове використання богохульства" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Помірне використання богохульства" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Надмірне використання богохульства" + +#~ msgid "Slapstick humor" +#~ msgstr "Блазенський гумор" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Вульгарний або туалетний гумор" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Дорослий або сороміцький гумор" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Негативне ставлення до певних груп людей" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Образи на підґрунті дискримінації" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Чітка дискримінація, яка ґрунтується на статевій, сексуальний, расовій " +#~ "або релігійній ознаці" + +#~ msgid "Product placement" +#~ msgstr "Розміщення виробів" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "Чітке згадування про певний бренд або торгову марку" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Користувачам пропонують придбати певні матеріальні товари" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "" +#~ "Азартні ігри на випадкових подіях з використанням жетонів або кредитів" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Азартні ігри з використанням ігрових грошей" + +#~ msgid "Gambling using real money" +#~ msgstr "Азартні ігри з використанням справжніх грошей" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Користувачам пропонують вкладати реальні гроші" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Можливість витрачати справжні гроші у програмі" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "" +#~ "Безпосередня взаємодія між користувачами без можливостей спілкування" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Можливості зі спілкування між користувачами із модерацією" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "" +#~ "Неконтрольовані можливості із звукового та відеоспілкування між " +#~ "користувачами" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Оприлюднення даних соціальної мережі" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Пошук найсвіжішої версії програми" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Оприлюднення діагностичних даних, які не надають безпосередньої змоги " +#~ "ідентифікувати користувача" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "Оприлюднення даних, які уможливлюють ідентифікацію користувача" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Оприлюднення фізичного розміщення іншим користувачам" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Опосередковане згадування гомосексуальності" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Цілунки між людьми однієї статі" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Відверта сексуальна поведінка між людьми однієї статі" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Опосередковане згадування проституції" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Безпосереднє згадування проституції" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Відверте зображення акту проституції" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Опосередковані згадування перелюбу" + +#~ msgid "Direct references to adultery" +#~ msgstr "Безпосередні згадування перелюбу" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Відверті зображення актів перелюбу" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Напівоголені людські персонажі" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Відверто сексуальні людські персонажі" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Зображення або згадування знущання над людьми у минулому" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Відверті зображення сучасного знущання над людьми" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Відверті зображення сучасного знущання над людьми" + +#~ msgid "Visible dead human remains" +#~ msgstr "Показ решток мертвих людей" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Докладний показ решток мертвих людей" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Відверте зображення осквернення людських тіл" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Зображення або згадки рабства у минулому" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Зображення сучасного рабства" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Відверте зображення сучасного рабства" + +#~ msgid "General" +#~ msgstr "Загальне" + +#~ msgid "ALL" +#~ msgstr "Усі" + +#~ msgid "Teen" +#~ msgstr "Для підлітків" + +#~ msgid "Everyone 10+" +#~ msgstr "Для усіх 10+" + +#~ msgid "Everyone" +#~ msgstr "Для усіх" + +#~ msgid "Early Childhood" +#~ msgstr "Для маленьких дітей" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Невідомо" + +#~ msgid "Released" +#~ msgstr "Випущено" + +#~ msgid "Format" +#~ msgstr "Формат" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Вчора, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Три дні тому" + +#~ msgid "Four days ago" +#~ msgstr "Чотири дні тому" + +#~ msgid "Five days ago" +#~ msgstr "П'ять днів тому" + +#~ msgid "Six days ago" +#~ msgstr "Шість днів тому" + +#~ msgid "Two weeks ago" +#~ msgstr "Два тижні тому" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Вилучено" + +#~ msgid "Security Updates Pending" +#~ msgstr "Опитування оновлень безпеки" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Радимо встановити важливі оновлення зараз же" + +#~ msgid "Restart & Install" +#~ msgstr "Перезапустити та встановити" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "Важливі оновлення системи і програм уже можна встановити" + +#~ msgid "View" +#~ msgstr "Переглянути" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Нумо на закупи" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Увімкнути сховище розширень GNOME Shell" + +#~ msgid "this website" +#~ msgstr "цей сайт" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "Щоб використати новий додаток, треба перезапустити програму." + +#~ msgid "About %s" +#~ msgstr "Про %s" + +#~ msgid "%s ME" +#~ msgstr "ME %s" diff --git a/po/uz.po b/po/uz.po new file mode 100644 index 0000000..cb4f28a --- /dev/null +++ b/po/uz.po @@ -0,0 +1,6412 @@ +# Uzbek (Latin) translation for gnome-software. +# Copyright (C) 2025 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# Baxrom Raxmatov , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software gnome-48\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-04-02 14:26+0000\n" +"PO-Revision-Date: 2025-04-04 21:19+0500\n" +"Last-Translator: \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=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.6\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Dasturiy ta'minot" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Ilovalarni o'rnating va yangilang" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Dastur sizga yangi ilovalar va tizim kengaytmalarini topish va o'rnatish " +"hamda mavjud o'rnatilgan ilovalarni o'chirish imkonini beradi." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Dasturiy ta'minot foydali tavsiflari va har bir ilova uchun bir nechta ekran " +"tasvirlari bilan taniqli va mashhur ilovalarni namoyish etadi. Ilovalarni " +"toifalar ro'yxatini ko'rish yoki qidirish orqali topish mumkin. Shuningdek, " +"u tizimingizni oflayn yangilash yordamida yangilash imkonini beradi." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Umumiy ko'rinish paneli" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Tafsilotlar paneli" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "O'rnatilgan panel" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Yangilanishlar paneli" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Yangilanish tafsilotlari" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2768 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME loyihasi" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Shim UEFI da akmods kalitini sinab ko'ring" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "" +"Shim UEFI da akmods kalitini sinash uchun autentifikatsiya talab qilinadi" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Shim UEFI-ga akmods kalitini yozing" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "" +"Shim UEFI’ga akmods kalitini ro‘yxatdan o‘tkazish uchun autentifikatsiya " +"talab qilinadi" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Shim UEFI da DKMS kalitini sinab ko'ring" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "" +"Shim UEFI da DKMS kalitini sinash uchun autentifikatsiya talab qilinadi" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "DKMS kalitini Shim UEFI-ga yozing" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "" +"Shim UEFI’ga DKMS kalitini ro‘yxatdan o‘tkazish uchun autentifikatsiya talab " +"qilinadi" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Appstream faylini tizim joylashgan joyga o'rnating" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Appstream faylini tizim joylashgan joyga o'rnatish" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Mos keladigan loyihalar ro'yxati" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Bu GNOME, KDE va XFCE kabi biz ko'rsatishimiz kerak bo'lgan mos loyihalar " +"ro'yxati." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "" +"GNOME dasturiy ta'minotida yangilanishlar va yangilanishlarni boshqarish " +"kerakmi" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Agar o'chirilgan bo'lsa, GNOME dasturiy ta'minoti yangilanishlar panelini " +"yashiradi, avtomatik yangilash amallarini bajarmaydi yoki yangilanishlarni " +"so'ramaydi." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Yangilanishlarni avtomatik ravishda yuklab oling va o'rnating" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Agar yoqilgan bo'lsa, GNOME Software dasturiy ta'minot yangilanishlarini " +"fonda avtomatik ravishda yuklab oladi, shuningdek, qayta yuklashni talab " +"qilmaydiganlarini o'rnatadi." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "" +"Orqa fonda yangilangan dasturiy ta'minot haqida foydalanuvchini xabardor " +"qiling" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Agar yoqilgan bo'lsa, GNOME dasturiy ta'minoti foydalanuvchini bo'sh turgan " +"paytda sodir bo'lgan yangilanishlar haqida xabardor qiladi." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Hisoblangan ulanishda avtomatik yangilanish kerakmi" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Agar yoqilgan bo'lsa, GNOME dasturiy ta'minoti hisoblangan ulanishdan " +"foydalanilganda ham avtomatik ravishda fonda yangilanadi (oxir-oqibat ba'zi " +"metama'lumotlarni yuklab olish, yangilanishlarni tekshirish va h.k., bu " +"foydalanuvchi uchun xarajatlarga olib kelishi mumkin)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Bu GNOME dasturiy ta'minotining birinchi versiyasi bo'ladimi" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Ilovalar yonida yulduzcha baholarni ko'rsatish" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "" +"Ilovalarni masofadan boshqarish pulti uchun o'rnatilgan standart tarmoq " +"asosida filtrlang" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Bepul bo'lmagan ilovalar o'rnatishdan oldin ogohlantirish dialogini " +"ko'rsatadi" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Bepul bo'lmagan ilovalar o'rnatilganda ogohlantirish dialog oynasi " +"ko'rsatilishi mumkin. Bu dialog oynasi bosilganligini nazorat qiladi." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Oxirgi yangilanishni tekshirish vaqt belgisi" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Oxirgi yangilanish bildirishnomasi" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Oxirgi yangilanish bildirishnomasi vaqt tamg'asi" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Birinchi xavfsizlik yangilanishining vaqt tamg'asi, yangilanishdan keyin " +"tozalanadi" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Oxirgi yangilanish vaqt tamg'asi" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Yuqoridagi skrinshotni tekshirish uchun soniyalardagi yosh hali ham amal " +"qiladi" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Kattaroq qiymatni tanlash masofaviy serverga kamroq aylanishni anglatadi, " +"ammo skrinshotlarga yangilanishlar foydalanuvchiga ko'proq vaqt olishi " +"mumkin. 0 qiymati, agar tasvir keshda allaqachon mavjud bo'lsa, serverni " +"hech qachon tekshirmaslikni anglatadi." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Ilovalarni ko'rib chiqish uchun foydalaniladigan server" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Sharhlar uchun minimal karma balli" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Bu raqamdan kam karma bo'lgan sharhlar ko'rsatilmaydi." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Uchinchi tomon hisoblanmasligi kerak bo'lgan rasmiy omborlar ro'yxati" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "" +"O'chirib bo'lmaydigan yoki olib tashlanmaydigan kerakli omborlar ro'yxati" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "" +"Bepul dasturiy ta'minot deb hisoblanishi kerak bo'lgan rasmiy omborlar " +"ro'yxati" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Ilova bepul dasturiy ta'minot sifatida ko'rib chiqilishi kerak bo'lganda " +"foydalanish uchun litsenziya URL manzili" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Iloji bo'lsa, tizimdagi barcha foydalanuvchilar uchun to'plangan ilovalarni " +"o'rnating" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Dasturiy ta'minot omborlari muloqot oynasiga kirishga ruxsat bering" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Pre-relizlar uchun yangilanishlarni taklif qiling" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Ilova bepul emasligi haqida foydalanuvchiga xabar beruvchi baʼzi UI " +"elementlarini koʻrsating" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"O'rnatilgan ilovalar ro'yxatida ilovalar uchun o'rnatilgan hajmni ko'rsating" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "Erkin bo'lmagan va xususiy dasturiy ta'minotni tushuntiruvchi URI" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Skatalog jildiga yuklab olinadigan ilovalar oqimi fayllariga ishora qiluvchi " +"URL manzillar roʻyxati" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"AppStream fayllarini barcha foydalanuvchilar uchun tizim bo'ylab joylashgan " +"joyga o'rnating. Agar noto'g'ri bo'lsa, fayllar nostandart $XDG_DATA_HOME/" +"swcatalog/xml katalogiga o'rnatiladi" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Qadoqlash formatlarining ustuvor tartibi, birinchi navbatda muhimroq " +"formatlar ko'rsatilgan. Bo'sh massiv standart tartibni bildiradi. O'tkazib " +"yuborilgan formatlar oxirgi ro'yxatga kiritilgan deb taxmin qilinadi. " +"Qadoqlash formatlariga misol: deb, flatpak, rpm, snap. Formatlar ixtiyoriy " +"ravishda ikkita nuqta bilan boʻlingan manba nomi bilan koʻrsatilishi mumkin, " +"masalan, “flatpak:flathub”." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Foydalanilmayotgan Flatpak ish vaqtlarini olib tashlashga oxirgi urinishning " +"vaqt tamg'asi" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Faqat erkin litsenziyalangan ilovalarni ko‘rsatish va har qanday xususiy " +"ilovalarni yashirish uchun “haqiqiy”ga sozlang." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "" +"Faqat identifikatori tasdiqlangan ishlab chiquvchilarning ilovalarini " +"ko‘rsatish uchun “haqiqiy” qilib sozlang." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Oxirgi qabul qilingan tarixiy yangilanishlarning vaqt tamg‘asi." + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Kirish uchun ishlatiladigan gnome-online-hisob identifikatorini saqlaydigan " +"qator" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME Software AppStream tizim bo'ylab o'rnatuvchisi" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Buyruqlar qatori argumentlarini tahlil qilib bo‘lmadi" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Aynan bitta fayl nomini ko'rsatishingiz kerak" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Ushbu dastur faqat root foydalanuvchi tomonidan ishlatilishi mumkin" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Kontent turini tasdiqlab bo‘lmadi: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Ko‘chirib bo‘lmadi: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Dasturiy ta'minot o'rnatish" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Tanlangan dasturiy ta'minotni tizimga o'rnating" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Multfilm zo'ravonlik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Multfilmdagi zo'ravonlik haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Fantaziya zo'ravonlik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Fantaziya zo'ravonligi haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Haqiqiy zo'ravonlik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Haqiqiy zo'ravonlik haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Qon to'kilishi tasvirlangan zo'ravonlik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Qon to'kilishi haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Jinsiy zo'ravonlik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Jinsiy zo'ravonlik haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Spirtli ichimliklar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Spirtli ichimliklar haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Giyohvand moddalar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Noqonuniy giyohvand moddalarga havolalar haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Tamaki" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Tamaki mahsulotlariga havolalar haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Yalang'ochlik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Yalang'ochlik haqida hech qanday ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Jinsiy mavzular" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Jinsiy tabiatga havolalar yoki tasvirlar haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Bekorchilik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Har qanday haqorat haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Noto'g'ri hazil" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Nomaqbul hazil haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Diskriminatsiya" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Hech qanday kamsituvchi til haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Reklama" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Har qanday turdagi reklama haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Qimor o'yinlari" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Qimor o'yinlari haqida hech qanday ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Sotib olish" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Pul sarflash qobiliyati haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Foydalanuvchilar o'rtasida suhbat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "" +"Boshqa foydalanuvchilar bilan suhbatlashish usullari haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Foydalanuvchilar o'rtasidagi audio suhbat" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Boshqa foydalanuvchilar bilan gaplashish usullari haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Aloqa ma'lumotlari" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Ijtimoiy tarmoq foydalanuvchi nomlari yoki elektron pochta manzillarini " +"almashish haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Ma'lumotni aniqlash" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "" +"Foydalanuvchi ma'lumotlarini uchinchi shaxslar bilan bo'lishish haqida " +"ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Joylashuvni ulashish" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "" +"Jismoniy joylashuvni boshqa foydalanuvchilar bilan baham ko'rish haqida " +"ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Gomoseksualizm" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Gomoseksualizm haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Fohishalik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Fohishalik haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Zino" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Zinoga havolalar haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Jinsiylashtirilgan belgilar" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Jinsiylashtirilgan belgilar haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Tahqirlash" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Obro'sizlanish haqida havolalar haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Inson qoldiqlari" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Ko'rinadigan o'lik odam qoldiqlari haqida ma'lumot yo'q" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Qullik" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Qullikka havolalar haqida ma'lumot yo'q" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Dori vositalariga havolalarni o'z ichiga olmaydi" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "" +"So'kinish, so'kish va boshqa turdagi kuchli so'zlarni o'z ichiga olmaydi" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Reklama yoki pul operatsiyalarini o'z ichiga olmaydi" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Jinsiy aloqa yoki yalang'ochlikni o'z ichiga olmaydi" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Nazoratsiz chat funksiyasini o'z ichiga olmaydi" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Zo'ravonlikni o'z ichiga olmaydi" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Giyohvand moddalar" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Kuchli til" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Pul" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Ijtimoiy tarmoq" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Zo'ravonlik" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Barchasi" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s nomaʼlum yosh reytingiga ega" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s hamma uchun mos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s kichkintoylar uchun mos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s yosh bolalar uchun mos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s bolalar uchun mos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s oʻsmirlar uchun mos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s kattalar uchun mos" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s %s uchun mos" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Yosh reytingi" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "_Yo'qolgan ma'lumotni qanday kiritish mumkin" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "Mahalliy fayl" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:535 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:772 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "Paket" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Kutilmoqda" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "Oʻrnatish kutilmoqda" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "Oʻchirish kutilmoqda" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "Oʻrnatilmoqda" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "O'chirish" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "Yuklab olinmoqda" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_O‘rnatish" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "_Oʻchirish…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Tarmoq" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Tarmoq orqali muloqot qilish mumkin" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Tizim xizmatlari" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Tizim avtobusida D-Bus xizmatlariga kirish mumkin" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Sessiya xizmatlari" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Seans avtobusida D-Bus xizmatlariga kirish mumkin" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Qurilmalar" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Veb-kameralar kabi ixtiyoriy qurilmalarga kirishi mumkin" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:338 +#: src/gs-safety-context-dialog.c:227 +msgid "Can access input devices" +msgstr "Kirish qurilmalariga kirish mumkin" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:345 +msgid "Can access microphones and play audio" +msgstr "Mikrofonlarga kirish va audio o'ynash mumkin" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Tizim qurilmasi fayllariga kira oladi" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Ekran tarkibi" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:359 +msgid "Can access screen contents" +msgstr "Ekran tarkibiga kirish mumkin" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Uy papkasi" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "Fayllarni ko'rish, tahrirlash va yaratish mumkin" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "Fayllarni ko'rish mumkin" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Fayllar tizimi" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Yuklashlar papkasi" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Sozlamalar" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Har qanday sozlamalarni ko'rish va o'zgartirish mumkin" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Eski displey tizimi" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Eski, xavfsiz bo'lmagan displey tizimidan foydalanadi" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Sandboxdan qochish" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Sandboxdan qochish va boshqa cheklovlarni chetlab o'tish mumkin" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "Yangilanish tavsifi mavjud emas." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "Tafsilotlarni yangilash" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "Qo'shimcha ruxsatlarni talab qiladi" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "Serverdan olingan reyting maʼlumotlari notoʻgʻri" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "Baholash serveri bilan bogʻlanib boʻlmadi" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "Sharhlar" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "Ushbu ilova uchun hech qanday sharh topilmadi." + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "Sharhlar yo'q" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "Versiya tarixi" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "%s-versiyada yangi" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Versiya %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Ushbu nashr uchun tafsilotlar yo'q" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y, %R" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Ishga tushirish rejimi: \"yangilanishlar\", \"yangilangan\", \"o'rnatilgan\" " +"yoki \"umumiy ko'rish\"" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "_rekursiv rejimini yoqing" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Ilovalarni qidirish" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "IZLASH" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Ilova tafsilotlarini ko'rsatish (ilova identifikatori yordamida)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Ilova tafsilotlarini ko'rsatish (paket nomidan foydalanib)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Ilovani o'rnating (ilova identifikatori yordamida)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Ilovani o'chirib tashlang (ilova identifikatori yordamida)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Mahalliy paket faylini oching" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FAYL NOMI" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Bu harakat uchun kutilayotgan oʻzaro taʼsir turi: “yoʻq”, “xabar berish” " +"yoki “toʻliq”" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "O'zaro ta'sir" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Mahalliy metainfo yoki appdata faylini ko'rsatish" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "" +"Batafsil disk raskadrovka chiqishini yoqish (agar ishlayotgan bo'lsa, " +"ishlayotgan misoldan)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Har qanday kutilayotgan yangilanishlarni fonda o'rnatadi" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Afzalliklarni ko’rsatish" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Ishlayotgan misoldan chiqing" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "AppStream uchun mahalliy fayl manbalarini afzal ko'ring" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Versiya raqamini ko'rsatish" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Mualliflik huquqi © 2016–2023 GNOME dasturiy ta'minot mualliflari" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Baxrom Raxmatov " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Kechirasiz! Ushbu ilova uchun tafsilotlar yo'q." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "O'rnatilgan o'lcham" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "%s ta maʼlumot va %s ta keshni oʻz ichiga oladi" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "%s ta maʼlumotni oʻz ichiga oladi" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "%s ta keshni oʻz ichiga oladi" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Kesh va maʼlumotlardan foydalanish nomaʼlum" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Yuklab olish hajmi" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Qo'shimcha tizim yuklab olishlari shart emas" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Qo'shimcha tizim yuklamalarining noma'lum hajmi kerak" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "%s ta qoʻshimcha tizim yuklab olishlari kerak" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Hajmi noma'lum" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:293 +msgid "No permissions" +msgstr "Ruxsatlar" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:310 +msgid "Has network access" +msgstr "Tarmoqqa kirish imkoniyati mavjud" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:317 +msgid "Uses system services" +msgstr "Tizim xizmatlaridan foydalanadi" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:324 +msgid "Uses session services" +msgstr "Seans xizmatlaridan foydalanadi" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:331 +msgid "Can access hardware devices" +msgstr "Uskuna qurilmalariga kirish mumkin" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:352 +msgid "Can access system devices" +msgstr "Tizim qurilmalariga kirish mumkin" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:371 +msgid "Can read/write all your data" +msgstr "Barcha ma'lumotlarni o'qish/yozish mumkin" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:383 +msgid "Can read all your data" +msgstr "Barcha ma'lumotlaringizni o'qiy oladi" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:390 +msgid "Can read/write your downloads" +msgstr "Yuklashlaringizni o'qish/yozish mumkin" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:397 +msgid "Can read your downloads" +msgstr "Yuklab olishlaringizni o'qish mumkin" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:404 +msgid "Can access some specific files" +msgstr "Ba'zi maxsus fayllarga kirish mumkin" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:411 src/gs-safety-context-dialog.c:275 +msgid "Can access and change user settings" +msgstr "Foydalanuvchi sozlamalariga kirishi va oʻzgartirishi mumkin" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:418 src/gs-safety-context-dialog.c:259 +msgid "Uses a legacy windowing system" +msgstr "Eski oynalash tizimidan foydalanadi" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:425 src/gs-safety-context-dialog.c:267 +msgid "Can acquire arbitrary permissions" +msgstr "O'zboshimchalik bilan ruxsat olish mumkin" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:437 +msgid "Software developer is verified" +msgstr "Dastur ishlab chiqaruvchisi tasdiqlangan" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:455 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "OS distribyutori tomonidan ko'rib chiqilgan" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:461 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Ko‘rib chiqqan: %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:477 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Uchinchi tomon tomonidan taqdim etilgan" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:487 +msgid "Software no longer supported" +msgstr "Dasturiy ta'minot endi qo'llab-quvvatlanmaydi" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:499 +msgid "Auditable code" +msgstr "Tekshirish mumkin bo'lgan kod" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:505 +msgid "Unknown license" +msgstr "Noma'lum litsenziya" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:512 +msgid "Proprietary code" +msgstr "Xususiy kod" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:519 +msgid "Special license" +msgstr "Maxsus litsenziya" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:533 src/gs-app-context-bar.c:816 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:541 +msgid "Privileged" +msgstr "Imtiyozli FUSE fayl tizimlarini o'rnating va foydalaning" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:548 +msgid "Safe" +msgstr "Xavfsiz" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:555 +msgid "Probably Safe" +msgstr "Ehtimol, xavfsiz" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:562 +msgid "Potentially Unsafe" +msgstr "Potentsial xavfli" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:569 +msgid "Unsafe" +msgstr "Xavfli" + +#: src/gs-app-context-bar.c:647 src/gs-app-context-bar.c:679 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Faqat mobil" + +#: src/gs-app-context-bar.c:648 +msgid "Only works on a small screen" +msgstr "Faqat kichik ekranda ishlaydi" + +#: src/gs-app-context-bar.c:653 src/gs-app-context-bar.c:686 +#: src/gs-app-context-bar.c:693 src/gs-app-context-bar.c:743 +#: src/gs-app-context-bar.c:748 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Faqat ish stoli" + +#: src/gs-app-context-bar.c:654 +msgid "Only works on a large screen" +msgstr "Faqat katta ekranda ishlaydi" + +#: src/gs-app-context-bar.c:658 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Ekran oʻlchami mos kelmasligi" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Sizning joriy ekran o'lchamingizni qo'llab-quvvatlamaydi" + +#: src/gs-app-context-bar.c:680 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Sensorli ekranni talab qiladi" + +#: src/gs-app-context-bar.c:687 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Klaviatura kerak" + +#: src/gs-app-context-bar.c:694 +msgid "Requires a mouse" +msgstr "Sichqonchani talab qiladi" + +#: src/gs-app-context-bar.c:705 +msgid "Gamepad Needed" +msgstr "Gamepad kerak" + +#: src/gs-app-context-bar.c:706 +msgid "Requires a gamepad to play" +msgstr "O'ynash uchun geympad kerak" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:730 +msgid "Adaptive" +msgstr "Moslashuvchan" + +#: src/gs-app-context-bar.c:731 +msgid "Works on phones, tablets and desktops" +msgstr "Telefonlar, planshetlar va ish stollarida ishlaydi" + +#: src/gs-app-context-bar.c:744 +msgid "Probably requires a keyboard or mouse" +msgstr "Ehtimol, klaviatura yoki sichqonchani talab qiladi" + +#: src/gs-app-context-bar.c:749 +msgid "Works on desktops and laptops" +msgstr "Ish stollari va noutbuklarda ishlaydi" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:791 +msgid "Contains no age-inappropriate content" +msgstr "Yoshga mos kelmaydigan tarkibni o'z ichiga olmaydi" + +#: src/gs-app-context-bar.c:839 +msgid "No age rating information available" +msgstr "Yosh reytingi haqida ma'lumot yo'q" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Veb-saytga tashrif buyuring" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "O'rnatish…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Bekor qilish" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "O'rnatish" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "Yuklash" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Yangilash" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Oʻchirish..." + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Oʻchirish" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "Muhim yangilanish" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Yangilash vaqtida qurilmadan foydalanib boʻlmaydi." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Manba: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "%s nomidan oʻzgartirildi" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "Yangilanishlarni olishni toʻxtatdi" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "Muhim yangilanish" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "O'rnatilgan" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "%s tarjimasiga yordam bering" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s xalqaro hamjamiyat tomonidan ishlab chiqilgan, ishlab chiqilgan va " +"tarjima qilingan.\n" +"\n" +"Bu sizning tilingizda hali mavjud bo'lmasa-da, siz ishtirok etishingiz va " +"uni o'zingiz tarjima qilishga yordam berishingiz mumkinligini anglatadi." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Tarjimalar" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Tarjima veb-sayti" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Kirish kerak masofadan %s (soha: %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "Kirish shart" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "_Bekor qilish" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "Domen administratoriga kirish" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "Foydalanuvchi" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "_Parol" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Boshqa" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Barchasi" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Tanlangan" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Muharrir tanlovi" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Yangi va yangilangan" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Internetdan tanlovlar" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Boshqa dasturiy ta'minot" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s Oʻrnatildi" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "O'zgarishlar kuchga kirishi uchun qayta ishga tushirish kerak" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Ilova foydalanishga tayyor" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Tizim yangilanishlari o'rnatildi" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Yaqinda o'rnatilgan yangilanishlar ko'rib chiqilishi mumkin" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "Qayta ishga tushirish" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Ishga tushirish" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "Dasturiy ta'minot o'rnatilsinmi?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "Uchinchi tomon dasturiy ta'minotini o'rnatasizmi?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "Dasturiy ta'minot ombori yoqilsinmi?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "Uchinchi tomon dasturlari ombori yoqilsinmi?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s bepul va ochiq kodli dasturiy taʼminot emas va “%s” " +"tomonidan taqdim etilgan." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s “%s” tomonidan taqdim etilgan." + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "" +"O'rnatishni davom ettirish uchun ushbu dasturiy ta'minot ombori yoqilgan " +"bo'lishi kerak." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "" +"Ayrim mamlakatlarda %s ilovasini oʻrnatish yoki undan foydalanish noqonuniy " +"boʻlishi mumkin." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Ba'zi mamlakatlarda ushbu kodekni o'rnatish yoki ishlatish noqonuniy " +"bo'lishi mumkin." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "Qayta _Ogohlantirmang" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "Yoqish va _O'rnatish" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "Paket menejerining batafsil xatolari quyidagilardan iborat:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "Tafsilotlar" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "_Yopish" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "Tafsilotlar vaqtinchalik xotiraga nusxalandi" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "_Qabul qilmoq" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Yangilanish o'rnatildi" +msgstr[1] "Yangilanishlar o'rnatildi" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Ilova oʻchirib tashlandi" +msgstr[1] "Ilovalar oʻchirib tashlandi" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Uning kuchga kirishi uchun qayta ishga tushirish kerak" +msgstr[1] "Ular kuchga kirishi uchun qayta ishga tushirish talab qilinadi" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "Hozir emas" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "Bugun" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "Kecha" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d kun oldin" +msgstr[1] "%d kun oldin" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d hafta oldin" +msgstr[1] "%d hafta oldin" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d oy oldin" +msgstr[1] "%d oy oldin" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d yil oldin" +msgstr[1] "%d yil oldin" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "Hozirgina" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d daqiqa oldin" +msgstr[1] "%d daqiqa oldin" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d soat oldin" +msgstr[1] "%d soatlar oldin" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Barchasi" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Tanlangan" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D grafika" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Fotosurat" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Skanerlash" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Vektor grafika" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Tomoshabinlar" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Audio yaratish va tahrirlash" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Musiqa pleyerlar" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Barchasi" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Tanlangan" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Taqvim" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Ma'lumotlar bazasi" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Moliya" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Word protsessor" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Matn muharrirlari" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Veb-brauzerlar" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Barchasi" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Tanlangan" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Amal" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Sarguzasht" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Arkada" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Bloklar" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Kengash" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Karta" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Emulyatorlar" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Bolalar" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Mantiq" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Rol o'ynash" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Strategiya" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Barchasi" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Tanlangan" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chat" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Barchasi" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Tanlangan" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Sun'iy intellekt" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Astronomiya" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Kimyo" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Tillar" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Matematika" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Yangiliklar" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Robototexnika" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "San’at" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Tarjimai hol" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Komikslar" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Badiiy adabiyot" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Salomatlik" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Tarix" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Hayot tarzi" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Siyosat" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Sport" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Barchasi" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Tanlangan" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Nosozliklarni tuzatuvchilar" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDElar" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Kodekslar" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Uskuna Drayverlari" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Shriftlar" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Kirish manbalari" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Til paketlari" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Mahalliylashtirish" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Яратиш" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Ish" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "O'ynang" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Ijtimoiylashish" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "O'rganing" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Rivojlantiring" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Kodekslar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Uskuna Drayverlari" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Shriftlar" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Kirish manbalari" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Til paketlari" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Mahalliylashtirish" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Ilova" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s qoʻshimcha fayl formatini qoʻllab-quvvatlashni soʻramoqda." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Qo'shimcha MIME turlari talab qilinadi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s qoʻshimcha shriftlarni soʻramoqda." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Qo'shimcha shriftlar talab qilinadi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s qo‘shimcha multimedia kodeklarini so‘ramoqda." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Qo'shimcha multimedia kodeklari talab qilinadi" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s qo‘shimcha printer drayverlarini talab qilmoqda." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Qo'shimcha printer drayverlari talab qilinadi" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s qo‘shimcha paketlarni so‘ramoqda." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Qo'shimcha paketlar talab qilinadi" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "_Dasturiy taʼminotda toping" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Ko'proq ko'rsatish" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Kamroq ko'rsatish" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "Olib tashlanmoqda..." + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "O'rnatishni tugatish uchun qayta ishga tushirishni talab qiladi" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "O'chirishni tugatish uchun qayta ishga tushirishni talab qiladi" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "Oʻrnatish kutilmoqda…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "Yangilanish kutilmoqda…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Yuklab olinmoqda…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "Tayyorlanmoqda…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "Oʻchirib tashlanmoqda…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s oʻrnatilmagan, lekin unda hali ham maʼlumotlar mavjud." + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Qayta yoqish" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "_Yoqish…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "_Oʻrnatish…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s AQSH ingliz tilida chiqadi" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "Bu ilova AQSH ingliz tilida paydo boʻladi" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "Ushbu dastur AQSh ingliz tilida paydo bo'ladi" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "Yordam _Translate" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "Boshqa ilovalar: %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Dasturchi %s %s egasi ekanligini isbotladi" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Dasturchi %s egasi ekanligini isbotladi" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "Sharh yozish uchun internetga kirish kerak" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Bu ilova endi yangilanishlarni, jumladan, xavfsizlik tuzatishlarini ham " +"olmaydi" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Ushbu ilova allaqachon tarqatish tomonidan taqdim etilgan va uni almashtirib " +"bo'lmaydi." + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Ushbu ilova veb-saytga, kodlar omboriga yoki muammolarni kuzatuvchisiga " +"havolalarni taqdim etmaydi." + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Bu dasturiy taʼminot endi yangilanishlarni, jumladan, xavfsizlik " +"tuzatishlarini ham olmaydi" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Ushbu dasturiy ta'minot allaqachon tarqatish tomonidan taqdim etilgan va uni " +"almashtirib bo'lmaydi." + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Ushbu dastur veb-saytga, kodlar omboriga yoki muammolarni kuzatuvchisiga " +"havolalarni taqdim etmaydi." + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Dastur “%s” uchun maʼlumot ololmadi va bu ilova tafsilotlarini koʻrsata " +"olmadi." + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "Serverdan noto‘g‘ri ko‘rib chiqish javobi qabul qilindi" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "“%s” uchun sharhni yuborib bo‘lmadi: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Tafsilotlar sahifasi" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "Ilova tafsilotlari yuklanmoqda" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "Tasdiqlangan" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "Oching" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Yangilanish" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "O'chirish" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "Add-ons" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "" +"Ushbu ilovadan faqat faol internet aloqasi mavjud bo'lganda foydalanish " +"mumkin." + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "Dasturiy ta'minot ombori kiritilgan" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Ushbu ilova yangilanishlarni, shuningdek, boshqa dasturlarga kirishni " +"ta'minlaydigan dasturiy ta'minot omborini o'z ichiga oladi." + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "Hech qanday dasturiy ta'minot ombori mavjud emas" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Ushbu ilova dasturiy ta'minot omborini o'z ichiga olmaydi. U yangi " +"versiyalar bilan yangilanmaydi." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "Dasturiy ta'minot ombori aniqlandi" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Ushbu dasturiy ta'minot omborini qo'shish sizga qo'shimcha dasturiy ta'minot " +"va yangilanishlarga kirish imkonini beradi." + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "Faqat o'zingiz ishonadigan dasturiy ta'minot omborlaridan foydalaning." + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "Ilova ma'lumotlarini tozalash" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "D_elete ma'lumotlari" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "Meta-maʼlumot yoʻq" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "Loyiha _Veb-sayt" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "_Xayriya qiling" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "_Muammo haqida xabar berish" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "_Yordam" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "_Kontakt qo'shish" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +#, fuzzy +msgid "Write R_eview" +msgstr "R_eview yozing" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "Barcha sharhlar" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "Ilova tafsilotlarini ko‘rsatib bo‘lmadi" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "Qayta ishga tushirishga tayyorlanmadi" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "Nama'lum xatolik" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "Kalit topilmadi" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "Kalit ro'yxatga olinmagan" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "MOK ro'yxatdan o'tish talab qilinadi" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "Keyingi kirishda o'rnatiladi" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Bu qurilmada Secure Boot funksiyasi yoqilgan. Yangi drayverlarni yoqishga " +"ruxsat berish uchun yangi mashina egasi kalitini (MOK) ro'yxatdan o'tkazish " +"kerak. Jarayon keyinroq parolni kiritishni talab qiladi. Iltimos, kalit " +"bilan bog'langan quyidagi parolga e'tibor bering:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Men MOK _paroliga eslatma qo'ydim" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Qayta ishga tushirish va roʻyxatdan oʻtish…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "O'rnatish bo'yicha ko'rsatmalar: Iltimos, diqqat bilan o'qing" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Qayta ishga tushirilgandan so'ng, qurilmani sozlash ekrani ko'rsatiladi. " +"Yangi drayverlarni yoqish uchun sozlash bosqichlarini bajaring:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• “MOKni ro‘yxatdan o‘tkazish”ni tanlang\n" +"• Kalitlarni ro‘yxatga olish uchun “Ha” ni tanlang\n" +"• So'ralganda MOK parolini kiriting\n" +"• Keyin “Qayta yuklash” ni tanlang" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Xavfsizlik oqibatlari" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Muvaffaqiyatli kalit ro'yxatdan o'tgandan so'ng, modul yoki boshqa modulning " +"kelajakdagi yangilanishlari so'zsiz ishonchli bo'lishini yodda tuting. " +"Kelajakdagi barcha yangilanishlar hech qanday shovqin va ruxsatsiz shaffof " +"tarzda amalga oshiriladi." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Qo'shimcha ko'rsatmalarni hujjatlar sahifasida topishingiz mumkin." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "Qoʻshimcha metamaʼlumotlar fayllari yuklab olinmoqda…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " va " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s skripti uchun mavjud shriftlar" +msgstr[1] "%s ta skriptlar uchun mavjud shriftlar" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s uchun mavjud dasturiy taʼminot" +msgstr[1] "%s uchun mavjud dasturiy taʼminot" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "Soʻralgan dasturiy taʼminot topilmadi" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "So‘ralgan dastur topilmadi" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "%s topilmadi" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "veb-saytida" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "%s faylini taqdim etadigan ilovalar mavjud emas." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"%s haqida maʼlumot, shuningdek, etishmayotgan ilovalarni olish imkoniyatlari " +"%s boʻlishi mumkin." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "%s yordami uchun hech qanday ilova mavjud emas." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s mavjud emas." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"%s haqidagi maʼlumot, shuningdek, ushbu formatni qoʻllab-quvvatlaydigan " +"ilovani qanday olish mumkinligi haqida maʼlumotni %s topish mumkin." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "%s skriptini qoʻllab-quvvatlash uchun shriftlar mavjud emas." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"%s haqida maʼlumot, shuningdek, qoʻshimcha shriftlarni olish variantlari %s " +"boʻlishi mumkin." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "%s formati uchun qoʻshimcha kodeklar mavjud emas." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"%s haqidagi maʼlumot, shuningdek, ushbu formatni oʻynay oladigan kodekni " +"qanday olish mumkinligi haqida maʼlumotni %s topish mumkin." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "%s qoʻllab-quvvatlashi uchun plazma manbalari mavjud emas." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"%s haqida maʼlumot, shuningdek, qoʻshimcha Plazma resurslarini olish " +"variantlari %s boʻlishi mumkin." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "%s uchun printer drayverlari mavjud emas." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"%s haqida maʼlumot, shuningdek, ushbu printerni qoʻllab-quvvatlaydigan " +"drayverni qanday olish mumkinligi haqidagi maʼlumotlar %s boʻlishi mumkin." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "hujjatlar" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"%s tomonidan soʻralgan %s topilmadi. Qoʻshimcha maʼlumot uchun %s ga qarang." +msgstr[1] "" +"%s tomonidan soʻralgan %s topilmadi. Qoʻshimcha maʼlumot uchun %s ga qarang." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Siz qidirayotgan %s topilmadi. Batafsil maʼlumot uchun %s ga qarang." +msgstr[1] "" +"Siz qidirayotgan %s topilmadi. Batafsil maʼlumot uchun %s ga qarang." + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Hech qanday qidiruv natijalari topilmadi: %s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s fayl formati" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "_Barchasini o'rnating" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "Soʻralgan dasturiy taʼminotni topib boʻlmadi" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Kodekslar sahifasi" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "Hech qanday natija topilmadi" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "Qidiruvni amalga oshirib bo‘lmadi" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Oldingi" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Keyingi" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Tanlangan ilovalar roʻyxati" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Ish stolini qo'llab-quvvatlash" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Katta ekranda foydalanishni qo'llab-quvvatlaydi" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Ish stolini qo'llab-quvvatlash noma'lum" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "" +"Katta ekranlar qo'llab-quvvatlanishini bilish uchun etarli ma'lumot yo'q" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Katta ekranni talab qiladi" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Ish stoli qo'llab-quvvatlanmaydi" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Katta ekranda foydalanish mumkin emas" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Mobil yordam" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Kichik ekranda foydalanishni qo'llab-quvvatlaydi" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Mobil yordam noma'lum" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "" +"Kichik ekranlar qo'llab-quvvatlanishini bilish uchun etarli ma'lumot yo'q" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Kichik ekranni talab qiladi" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Mobil qurilma qo'llab-quvvatlanmaydi" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Kichik ekranda foydalanish mumkin emas" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Klaviaturani qo'llab-quvvatlash" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Klaviaturani qoʻllab-quvvatlash nomaʼlum" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "" +"Klaviaturalar qo'llab-quvvatlanishini bilish uchun etarli ma'lumot yo'q" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Klaviatura kerak" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Klaviaturalarni qo'llab-quvvatlaydi" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Klaviatura qo'llab-quvvatlanmaydi" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Klaviatura bilan ishlatib bo'lmaydi" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Sichqonchani qo'llab-quvvatlash" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Sichqoncha yoki ishora qiluvchi qurilma kerak" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Sichqonchani qo'llab-quvvatlash noma'lum" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Sichqoncha yoki ko'rsatuvchi qurilmalar qo'llab-quvvatlanishini bilish uchun " +"etarli ma'lumot yo'q" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Sichqoncha kerak" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Sichqoncha va ko'rsatuvchi qurilmalarni qo'llab-quvvatlaydi" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Sichqoncha qo'llab-quvvatlanmaydi" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Sichqoncha yoki ishora qiluvchi qurilma bilan ishlatib bo'lmaydi" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Sensorli ekranni qo'llab-quvvatlash" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Sensorli ekranni qo'llab-quvvatlash noma'lum" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "" +"Sensorli ekranlar qo'llab-quvvatlanishini bilish uchun etarli ma'lumot yo'q" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Sensorli ekran kerak" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Sensorli ekranlarni qo'llab-quvvatlaydi" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Sensorli ekran qo'llab-quvvatlanmaydi" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Sensorli ekran bilan ishlatib bo'lmaydi" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Gamepad kerak" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Geympadni talab qiladi" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Gamepad qo'llab-quvvatlash" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Geympadlarni qo'llab-quvvatlaydi" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s bu qurilmada ishlashi mumkin" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s ushbu qurilmada ishlaydi" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s bu qurilmada ishlashi mumkin" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s bu qurilmada to‘g‘ri ishlamaydi" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s bu qurilmada ishlamaydi" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Uskuna yordami" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Navigatsiya" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Oʻrganish sahifasiga oʻting" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "O'rnatilgan sahifaga o'ting" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Yangilanishlar sahifasiga o'ting" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Qidiruv panelini oching" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Windows" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Parametrlarni oching" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Dasturiy ta'minot omborlarini oching" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Yordam" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Klaviatura yorliqlarini oching" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "O'rnatilgan" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "O'rnatilgan sahifa" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "Skanerlash davom etmoqda" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Ilovalar" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "Veb-ilovalar" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "Tizim ilovalari" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Jamiyat qurilgan" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_ Ishtirok eting" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Bu ilova xalqaro hamjamiyat tomonidan ochiq holda ishlab chiqilgan va %s litsenziyasi ostida chiqarilgan. Siz ishtirok etishingiz " +"va uni yanada yaxshilashga yordam berishingiz mumkin." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Bu ilova xalqaro hamjamiyat tomonidan ochiq holda ishlab chiqilgan va %s " +"litsenziyasi ostida chiqarilgan.\n" +"\n" +"Siz ishtirok etishingiz va uni yanada yaxshilashga yordam berishingiz mumkin." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Ushbu dastur xalqaro hamjamiyat tomonidan ochiq holda ishlab chiqilgan va %s litsenziyasi ostida chiqarilgan. Siz ishtirok etishingiz " +"va uni yanada yaxshilashga yordam berishingiz mumkin." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Bu dastur xalqaro hamjamiyat tomonidan ochiq holda ishlab chiqilgan va %s " +"litsenziyasi ostida chiqarilgan.\n" +"\n" +"Siz ishtirok etishingiz va uni yanada yaxshilashga yordam berishingiz mumkin." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:409 +msgid "Unknown License" +msgstr "Noma'lum litsenziya" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Batafsil ma'lumot" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ushbu ilova qaysi litsenziya asosida ishlab chiqilganligini aniqlamaydi va u " +"xususiy bo'lishi mumkin. Bu aniqlash qiyin bo'lgan yo'llar bilan xavfli " +"bo'lishi mumkin va u nazoratsiz o'zgarishi mumkin.\n" +"\n" +"Siz ushbu ilovaga hissa qo'sha olmaysiz yoki qo'sha olmaysiz." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ushbu dastur qaysi litsenziya asosida ishlab chiqilganligini aniqlamaydi va " +"u xususiy bo'lishi mumkin. Bu aniqlash qiyin bo'lgan yo'llar bilan xavfli " +"bo'lishi mumkin va u nazoratsiz o'zgarishi mumkin.\n" +"\n" +"Siz ushbu dasturiy ta'minotga hissa qo'sha olmaysiz yoki qo'sha olmaysiz." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:574 +msgid "Proprietary" +msgstr "Xususiy" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Ushbu ilova ochiq holda ishlab chiqilmagan, shuning uchun uning qanday " +"ishlashini faqat ishlab chiquvchilar biladi. Bu aniqlash qiyin bo'lgan " +"yo'llar bilan xavfli bo'lishi mumkin va u nazoratsiz o'zgarishi mumkin.\n" +"\n" +"Siz ushbu ilovaga hissa qoʻsha olmasligingiz mumkin." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Ushbu dastur ochiq holda ishlab chiqilmagan, shuning uchun uning qanday " +"ishlashini faqat uni ishlab chiquvchilar biladi. Bu aniqlash qiyin bo'lgan " +"yo'llar bilan xavfli bo'lishi mumkin va u nazoratsiz o'zgarishi mumkin.\n" +"\n" +"Siz ushbu dasturiy ta'minotga hissa qo'sha olmasligingiz mumkin." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:446 +msgid "Special License" +msgstr "Maxsus litsenziya" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Bu ilova maxsus litsenziya %s ostida ishlab chiqilgan. " +"Siz ushbu ilovaga hissa qo'sha olmaysiz yoki qo'sha olmaysiz." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Bu ilova “%s” maxsus litsenziyasi ostida ishlab chiqilgan.\n" +"\n" +"Siz ushbu ilovaga hissa qo'sha olmaysiz yoki qo'sha olmaysiz." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ushbu dastur maxsus litsenziya %s ostida ishlab " +"chiqilgan. Siz ushbu dasturiy ta'minotga hissa qo'sha olmaysiz yoki qo'sha " +"olmaysiz." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Ushbu dastur “%s” maxsus litsenziyasi ostida ishlab chiqilgan.\n" +"\n" +"Siz ushbu dasturiy ta'minotga hissa qo'sha olmaysiz yoki qo'sha olmaysiz." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Ma'lumotlarni yangilash" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Sahifa yuklanmoqda" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Ishga kirishish" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Noma'lum manba" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Foydalanuvchi" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "Qo'shimchalar" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "Olib tashlashlar" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Yangilanishlar" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "Past darajalar" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "tanlangan tashqi manbalar" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"%s ilovasidan qoʻshimcha dasturlarga kirish imkonini beradi. Ba'zi xususiy " +"dasturiy ta'minot kiritilgan.\n" +"\n" +"Siz ushbu omborlarni keyinchalik Dasturiy ta'minot omborlari sozlamalarida " +"yoqishingiz mumkin." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "Uchinchi tomon dasturlari omborlari yoqilsinmi?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "_E’tibor bermang" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "_Yoqish" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "Operatsion tizimingiz uchun mavjud" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "%s uchun mavjud" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "Tadqiq qiling" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Umumiy ko'rinish sahifasi" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Mavjud ilovalar" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Boshqa toifalar" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Ilova maʼlumotlari topilmadi" + +#: lib/gs-plugin-loader.c:2754 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Nomaʼlum" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Foydalanuvchi o‘rnatishni rad etdi" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Tayyorlash: %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Haqiqatan ham %s omborini oʻchirib tashlamoqchimisiz?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"%s dan barcha ilovalar oʻchirib tashlanadi va ularni qayta ishlatish uchun " +"omborni qayta oʻrnatishingiz kerak boʻladi." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "%s oʻchirib tashlansinmi?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Oʻchirishdan keyin %s ishlatib boʻlmaydi." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Oʻchirib tashlangandan keyin %s ga bogʻliq boʻlgan ilovalardan foydalanish " +"imkonsiz boʻladi." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Oʻchirilgandan soʻng %s ishlatib boʻlmaydi va undan foydalanadigan hujjatlar " +"boshqa shriftda koʻrinadi." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Oʻchirishdan keyin %s ishlatib boʻlmaydi. Bu ba'zi media fayllarni endi " +"o'ynatib bo'lmasligini anglatishi mumkin." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"%s ga bogʻliq boʻlgan uskuna olib tashlanganidan keyin toʻgʻri ishlamasligi " +"mumkin." + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Oʻchirishdan keyin %s ishlatib boʻlmaydi. Ilova maʼlumotlari va sozlamalari " +"diskda saqlanadi, bu kelajakda ilovani qayta tiklash imkonini beradi." + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Afzalliklar" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Dasturiy ta'minot yangilanishlari" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "Batafsil" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Yangilanishlarni tekshirish va yuklab olish uchun maʼlumotlar va quvvat " +"sarflanadi. Avtomatik yangilash funksiyalari shuning uchun hisoblangan " +"tarmoq ulanishlarida va quvvat tejamkori yoqilganda pauza qilinadi." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Avtomatik" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Yangilanishlarni avtomatik tekshirish va yuklab olish" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Qo'llanma" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "" +"Yangilanishlarni tekshirish va yuklab olish qo'lda amalga oshirilishi kerak" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Avtomatik yangilash _Bildirishnomalar" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Yangilanishlar avtomatik ravishda o'rnatilgani haqida xabar bering" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Kontent filtrlari" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Faqat _Bepul dasturiy ta'minotni ko'rsatish" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Ko'rish va qidirishda xususiy dasturiy ta'minotni yashiring" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Faqat _Tasdiqlangan dasturchilarni ko'rsatish" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "" +"Faqat identifikatori tasdiqlangan dasturchilarning ilovalarini ko‘rsating" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Oʻrnatilgan dastur %s bilan mos kelmaydi va yangilanish vaqtida avtomatik " +"ravishda oʻchirib tashlanadi." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Mos kelmaydigan dasturiy ta'minot" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "%d versiyasidan yangilanib bo‘lmadi" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "Tizim kengaytmalarini oʻchirib boʻlmadi" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "Ilova sozlamalari & Ma'lumotlar" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "_Aspekt nisbatini saqlang" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "Ilova sozlamalari va tarkibini tiklash imkonini beradi" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "_Oʻchirish" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "Diskdagi joyni tejash uchun ma'lumotlarni doimiy ravishda o'chiradi" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "" +"“%s”dan oʻrnatilgan dasturiy taʼminot yangilanishlarni olishni toʻxtatadi." + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "Repository o'chirilsinmi?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "Repository olib tashlansinmi?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "Yozish keshini o'chirib qo'ying" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "_O’chirish" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "Yangi omborlarni yoqing" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "Yangi omborlar qo'shilganda ularni yoqing" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "qo'shimcha ma'lumot" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Tanlangan uchinchi tomonlarning qoʻshimcha omborlari — %s." + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora uchinchi tomon omborlari" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "operatsion tizim" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "" +"Ushbu omborlar %s tomonidan taqdim etilgan standart dasturiy ta'minotni " +"to'ldiradi." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Dasturiy ta'minot omborlari" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "Uchinchi tomon omborlari" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u ta ilova oʻrnatildi" +msgstr[1] "%u ta ilova oʻrnatildi" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u qoʻshimchasi oʻrnatildi" +msgstr[1] "%u ta qoʻshimcha oʻrnatildi" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u ilovasi" +msgstr[1] "%u ta ilova" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u qoʻshimchasi" +msgstr[1] "%u ta qoʻshimcha" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s va %s oʻrnatildi" +msgstr[1] "%s va %s oʻrnatildi" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Oʻrnatilgan dasturiy taʼminot tekshirilmoqda…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Olib tashlang" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "Nafratlanmoq" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "Bu yoqmaydi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "Hammasi joyida; shu bo'ladi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "Yoqdi" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "Juda yoqtirdim" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "Baho qoldirish uchun yulduzni tanlang" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "Iltimos, sharh yozish uchun ko'proq vaqt ajrating" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "Iltimos, yulduzcha reytingini tanlang" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "Xulosa juda qisqa" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "Xulosa juda uzun" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "Tavsif juda qisqa" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "Tavsif juda uzun" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Sharh yozing" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Yuborish" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Iltimos, reyting, xulosa va sharh matnini taqdim eting. Sharhlar muammolar " +"haqida xabar berish uchun ishlatilmasligi kerak: buning o'rniga dasturchi " +"yoki qo'llab-quvvatlash provayderingizga murojaat qiling." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Sharh xulosasi" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "Qisqa sharh yozing" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Maxfiylik siyosatimizda " +"qanday ma'lumotlar yuborilganligini toping. Hisobingizga biriktirilgan " +"toʻliq ismingiz hammaga koʻrinadi." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "Jami %u koʻrib chiqish" +msgstr[1] "Jami %u ta sharh" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "5 yulduzdan" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Nomaʼlum" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Siz haqoratli, qo'pol yoki kamsituvchi xatti-harakatlar uchun sharhlar " +"haqida xabar berishingiz mumkin." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Xabar berilsa, tekshiruv administrator tomonidan tekshirilgunga qadar " +"yashiriladi." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "Ko‘rib chiqilsinmi?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "Hisobot vaqtinchalik xotiraga nusxalandi" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "Sharh olib tashlansinmi?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "Sharhni olib tashlashni ortga qaytarib bo‘lmaydi." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Ko'rib chiqish kabi" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Sharhni yoqtirmaslik" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Xabar berish…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Oʻchirish…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Ilova sinovdan o'tkazilmagan, ammo tarqatish uning zararli emasligini " +"tekshirdi" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Sotuvchiga ishonganingizni tekshiring, chunki ilova sinov muhitida emas" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:176 +msgid "No Permissions" +msgstr "Ruxsatlar" + +#: src/gs-safety-context-dialog.c:177 +msgid "App is fully sandboxed" +msgstr "Ilova toʻliq sinov muhitiga kiritilgan" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:188 +msgid "Network Access" +msgstr "Tarmoqqa kirish" + +#: src/gs-safety-context-dialog.c:189 +msgid "Can access the internet" +msgstr "Internetga kirish mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:192 +msgid "No Network Access" +msgstr "Tarmoqqa kirish yo'q" + +#: src/gs-safety-context-dialog.c:193 +msgid "Cannot access the internet" +msgstr "Internetga kirish imkonsiz" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:199 +msgid "Uses System Services" +msgstr "Tizim xizmatlaridan foydalanadi" + +#: src/gs-safety-context-dialog.c:200 +msgid "Can request data from system services" +msgstr "Tizim xizmatlaridan ma'lumotlarni so'rashi mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:207 +msgid "Uses Session Services" +msgstr "Sessiya xizmatlaridan foydalanadi" + +#: src/gs-safety-context-dialog.c:208 +msgid "Can request data from session services" +msgstr "Seans xizmatlaridan ma'lumotlarni so'rashi mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:215 +msgid "User Device Access" +msgstr "Foydalanuvchi qurilmasiga kirish" + +#: src/gs-safety-context-dialog.c:216 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "" +"Veb-kameralar yoki o'yin kontrollerlari kabi qurilmalarga kirish mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:219 +msgid "No User Device Access" +msgstr "Foydalanuvchi qurilmasiga kirish imkoni yo'q" + +#: src/gs-safety-context-dialog.c:220 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "" +"Veb-kameralar yoki oʻyin kontrollerlari kabi qurilmalarga kirish imkoni yoʻq" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:226 +msgid "Input Device Access" +msgstr "Kirish qurilmasiga kirish" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:234 +msgid "Microphone Access and Audio Playback" +msgstr "Mikrofonga kirish va audio tinglash" + +#: src/gs-safety-context-dialog.c:235 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "" +"Ruxsat so'ramasdan mikrofonlar yordamida tinglashi va audio ijro etishi " +"mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:242 +msgid "System Device Access" +msgstr "Tizim qurilmasiga kirish" + +#: src/gs-safety-context-dialog.c:243 +msgid "Can access system devices which require elevated permissions" +msgstr "Yuqori ruxsatlarni talab qiladigan tizim qurilmalariga kirish mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:250 +msgid "Screen Contents Access" +msgstr "Ekran tarkibiga kirish" + +#: src/gs-safety-context-dialog.c:251 +msgid "Can access the contents of the screen or other windows" +msgstr "Ekran yoki boshqa oynalar mazmuniga kira oladi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:258 +msgid "Legacy Windowing System" +msgstr "Eski oynalash tizimi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:266 +msgid "Arbitrary Permissions" +msgstr "O'zboshimchalik bilan ruxsatlar" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:274 +msgid "User Settings" +msgstr "Foydalanuvchi sozlamalari" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:286 +msgid "Full File System Read/Write Access" +msgstr "To'liq fayl tizimi o'qish/yozish ruxsati" + +#: src/gs-safety-context-dialog.c:287 +msgid "Can read and write all data on the file system" +msgstr "Fayl tizimidagi barcha ma'lumotlarni o'qiy oladi va yoza oladi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:295 +msgid "Home Folder Read/Write Access" +msgstr "Uy papkasini o'qish/yozish uchun ruxsat" + +#: src/gs-safety-context-dialog.c:296 +msgid "Can read and write all data in your home directory" +msgstr "Uy katalogingizdagi barcha ma'lumotlarni o'qishi va yozishi mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:304 +msgid "Full File System Read Access" +msgstr "To'liq fayl tizimi o'qishga kirish" + +#: src/gs-safety-context-dialog.c:305 +msgid "Can read all data on the file system" +msgstr "Fayl tizimidagi barcha ma'lumotlarni o'qiy oladi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:314 +msgid "Home Folder Read Access" +msgstr "Uy papkasini o'qishga kirish" + +#: src/gs-safety-context-dialog.c:315 +msgid "Can read all data in your home directory" +msgstr "Uy katalogingizdagi barcha ma'lumotlarni o'qiy oladi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:324 +msgid "Download Folder Read/Write Access" +msgstr "Papkani o'qish/yozish ruxsatini yuklab oling" + +#: src/gs-safety-context-dialog.c:325 +msgid "Can read and write all data in your downloads directory" +msgstr "Yuklashlar katalogidagi barcha ma'lumotlarni o'qish va yozish mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:336 +msgid "Download Folder Read Access" +msgstr "Papkani o'qish uchun ruxsatni yuklab oling" + +#: src/gs-safety-context-dialog.c:337 +msgid "Can read all data in your downloads directory" +msgstr "Yuklashlar katalogingizdagi barcha ma'lumotlarni o'qiy oladi" + +#: src/gs-safety-context-dialog.c:347 +msgid "Can read and write all data in the directory" +msgstr "Katalogdagi barcha ma'lumotlarni o'qiy oladi va yoza oladi" + +#: src/gs-safety-context-dialog.c:358 +msgid "Can read all data in the directory" +msgstr "Katalogdagi barcha ma'lumotlarni o'qiy oladi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:374 +msgid "No File System Access" +msgstr "Fayl tizimiga kirish imkoni yo'q" + +#: src/gs-safety-context-dialog.c:375 +msgid "Cannot access the file system at all" +msgstr "Fayl tizimiga umuman kirish mumkin emas" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:385 +msgid "App developer is verified" +msgstr "Ilova ishlab chiqaruvchisi tasdiqlangan" + +#: src/gs-safety-context-dialog.c:386 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Ushbu ilovani ishlab chiquvchisi ular aytgan shaxs ekanligi tasdiqlandi" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:397 +msgid "Insecure Dependencies" +msgstr "Ishonchsiz qaramliklar" + +#: src/gs-safety-context-dialog.c:398 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Dasturiy ta'minot yoki uning bog'liqliklari endi qo'llab-quvvatlanmaydi va " +"ular xavfli bo'lishi mumkin" + +#: src/gs-safety-context-dialog.c:411 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Ushbu ilova qaysi litsenziya asosida ishlab chiqilganligini aniqlamaydi va u " +"xususiy bo'lishi mumkin" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Ushbu dastur qaysi litsenziya asosida ishlab chiqilganligini aniqlamaydi va " +"u xususiy bo'lishi mumkin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:425 +msgid "Proprietary Code" +msgstr "Mulk kodeksi" + +#: src/gs-safety-context-dialog.c:426 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Manba kodi ochiq emas, shuning uchun uni mustaqil tekshirish mumkin emas va " +"xavfli bo'lishi mumkin" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:434 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Bu ilova “%s” maxsus litsenziyasi ostida ishlab chiqilgan" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:437 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Ushbu dastur “%s” maxsus litsenziyasi ostida ishlab chiqilgan" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:450 +msgid "Auditable Code" +msgstr "Tekshirish mumkin bo'lgan kod" + +#: src/gs-safety-context-dialog.c:451 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Manba kodi ommaviydir va mustaqil ravishda tekshirilishi mumkin, bu esa " +"ilovani xavfsizroq qiladi" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:460 +#, c-format +msgid "%s is privileged" +msgstr "%s imtiyozli" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:467 +#, c-format +msgid "%s is safe" +msgstr "%s xavfsiz" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:474 +#, c-format +msgid "%s is probably safe" +msgstr "%s xavfsiz" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:481 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s xavfli" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:488 +#, c-format +msgid "%s is unsafe" +msgstr "%s xavfsiz emas" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:571 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Nomaʼlum" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "Xavfsizlik" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Litsenziya" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "Manba" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Bu ilova dasturiy platformaning (SDK) eskirgan versiyasidan foydalanadi va " +"tuzatib boʻlmaydigan xatolar yoki xavfsizlik zaifliklarini oʻz ichiga olishi " +"mumkin." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Oldingi skrinshot" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Keyingi skrinshot" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Skrinshotlar" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "Skrinshot topilmadi" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "Rasm yuklanmadi" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "Skrinshot hajmi topilmadi" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "Keshni yaratib bo‘lmadi" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "Skrinshot yaroqsiz" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "Skrinshot mavjud emas" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Skrinshot" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "yana %u ta moslik" +msgstr[1] "yana %u ta moslik" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Qidiruv sahifasi" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Ilovalarni qidiring" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "Hech qanday ilova topilmadi" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1135 src/gs-shell.c:1140 src/gs-shell.c:1155 +#: src/gs-shell.c:1159 +#, c-format +msgid "“%s”" +msgstr "< %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1213 src/gs-shell.c:1265 +msgid "Unable to download updates" +msgstr "Yangilanishlarni yuklab bo‘lmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1218 +msgid "Unable to download firmware updates" +msgstr "Mikrodastur yangilanishlarini yuklab bo'lmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1221 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "%s proshivka yangilanishlarini yuklab boʻlmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1226 +#, c-format +msgid "Unable to download updates from %s" +msgstr "%s yangilanishlarini yuklab boʻlmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1233 src/gs-shell.c:1451 +msgid "Unable to update: internet access required" +msgstr "Yangilash imkonsiz: internetga kirish kerak" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1236 src/gs-shell.c:1454 +msgid "Unable to update: not enough disk space" +msgstr "Yangilab bo'lmadi: diskda joy yetarli emas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1241 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "%s dan yangilanishlarni yuklab boʻlmadi: diskda joy yetarli emas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1465 +msgid "Unable to update: authentication required" +msgstr "Yangilab bo‘lmadi: autentifikatsiya zarur" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1476 +msgid "Unable to update: invalid authentication" +msgstr "Yangilab bo‘lmadi: autentifikatsiya noto‘g‘ri" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1255 src/gs-shell.c:1487 +msgid "Unable to update: permission required" +msgstr "Yangilash imkonsiz: ruxsat talab qilinadi" + +#: src/gs-shell.c:1256 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "" +"Yangilanishlarni yuklab bo'lmadi: dasturiy ta'minotni o'rnatishga " +"ruxsatingiz yo'q" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1268 +msgid "Unable to get list of updates" +msgstr "Yangilanishlar roʻyxatini olib boʻlmadi" + +#: src/gs-shell.c:1303 +msgid "Unable to install: download failed" +msgstr "O‘rnatib bo‘lmadi: yuklab olinmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1309 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "%s oʻrnatib boʻlmadi: %s dan yuklab boʻlmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1314 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "%s oʻrnatib boʻlmadi: yuklab boʻlmadi" + +#: src/gs-shell.c:1320 +msgid "Unable to install: missing runtime" +msgstr "O‘rnatib bo‘lmadi: ish vaqti etishmayapti" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1326 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "%s oʻrnatib boʻlmadi: ish vaqti %s mavjud emas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1329 src/gs-shell.c:1385 src/gs-shell.c:1387 +#, c-format +msgid "Unable to install %s" +msgstr "%s oʻrnatib boʻlmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1335 +msgid "Unable to install: internet access required" +msgstr "O‘rnatib bo‘lmadi: internetga kirish kerak" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1338 +msgid "Unable to install: invalid app format" +msgstr "O‘rnatib bo‘lmadi: ilova formati noto‘g‘ri" + +#: src/gs-shell.c:1341 +msgid "Unable to install: not enough disk space" +msgstr "O'rnatib bo'lmadi: diskda joy yetarli emas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1344 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "%s oʻrnatib boʻlmadi: diskda joy yetarli emas" + +#: src/gs-shell.c:1348 +msgid "Unable to install: authentication required" +msgstr "O‘rnatib bo‘lmadi: autentifikatsiya talab qilinadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1350 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "%s oʻrnatib boʻlmadi: autentifikatsiya zarur" + +#: src/gs-shell.c:1354 +msgid "Unable to install: invalid authentication" +msgstr "O‘rnatib bo‘lmadi: autentifikatsiya noto‘g‘ri" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "%s oʻrnatib boʻlmadi: autentifikatsiya notoʻgʻri" + +#: src/gs-shell.c:1361 +msgid "Unable to install: permission required" +msgstr "Oʻrnatib boʻlmadi: ruxsat talab qilinadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1364 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "%s oʻrnatib boʻlmadi: ruxsat kerak" + +#: src/gs-shell.c:1368 +msgid "Unable to install: device must be plugged in" +msgstr "O‘rnatib bo‘lmadi: qurilma rozetkaga ulangan bo‘lishi kerak" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1371 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "%s oʻrnatib boʻlmadi: qurilma rozetkaga ulangan boʻlishi kerak" + +#: src/gs-shell.c:1374 +msgid "Unable to install: low battery" +msgstr "O'rnatib bo'lmadi: batareya quvvati past" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1377 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "%s oʻrnatib boʻlmadi: batareya quvvati kam" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1430 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "%s dan %s yangilanmadi: yuklab olinmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1436 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "%s yangilanmadi: yuklab olinmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1443 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "%s yangilanishlarini oʻrnatib boʻlmadi: yuklab olinmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1447 +msgid "Unable to update: download failed" +msgstr "Yangilab bo‘lmadi: yuklab olinmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1459 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "%s yangilanmadi: diskda joy yetarli emas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1470 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "%s yangilanmadi: autentifikatsiya zarur" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1481 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "%s yangilanmadi: autentifikatsiya noto‘g‘ri" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1492 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "%s yangilanmadi: ruxsat kerak" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1498 +msgid "Unable to update: device must be plugged in" +msgstr "Yangilab bo‘lmadi: qurilma rozetkaga ulangan bo‘lishi kerak" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1503 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "%s yangilanmadi: qurilma rozetkaga ulangan boʻlishi kerak" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1508 +msgid "Unable to update: low battery" +msgstr "Yangilash imkonsiz: batareya quvvati past" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1513 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "%s yangilanmadi: batareya quvvati past" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1524 +#, c-format +msgid "Unable to update %s" +msgstr "%s yangilanmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1528 +msgid "Unable to update" +msgstr "Yangilash imkonsiz" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1565 src/gs-shell.c:1638 +msgid "Unable to upgrade" +msgstr "Yangilash imkonsiz" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1569 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "%s dan %s ga yangilab boʻlmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1573 +msgid "Unable to upgrade: download failed" +msgstr "Yangilash imkonsiz: yuklab olinmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1576 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "%s ga yangilab boʻlmadi: yuklab olinmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1582 +msgid "Unable to upgrade: internet access required" +msgstr "Yangilash imkonsiz: internetga kirish kerak" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1585 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "%s ga yangilab boʻlmadi: internetga kirish zarur" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1589 +msgid "Unable to upgrade: not enough disk space" +msgstr "Yangilash imkonsiz: diskda boʻsh joy yetarli emas" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1592 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "%s ga yangilab boʻlmadi: diskda joy yetarli emas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1597 +msgid "Unable to upgrade: authentication required" +msgstr "Yangilash imkonsiz: autentifikatsiya zarur" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1600 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "%s ga yangilab bo‘lmadi: autentifikatsiya zarur" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1605 +msgid "Unable to upgrade: invalid authentication" +msgstr "Yangilab bo‘lmadi: autentifikatsiya noto‘g‘ri" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1608 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "%s ga yangilab bo‘lmadi: autentifikatsiya noto‘g‘ri" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 +msgid "Unable to upgrade: permission required" +msgstr "Yangilash imkonsiz: ruxsat talab qilinadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1616 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "%s ga yangilab boʻlmadi: ruxsat kerak" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Yangilash imkonsiz: qurilma rozetkaga ulangan bo‘lishi kerak" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "%s ga yangilab boʻlmadi: qurilma rozetkaga ulangan boʻlishi kerak" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1628 +msgid "Unable to upgrade: low battery" +msgstr "Yangilash imkonsiz: batareya quvvati past" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1631 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "%s ga yangilab boʻlmadi: batareya quvvati past" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1641 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "%s ga yangilab boʻlmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1675 +msgid "Unable to uninstall: authentication required" +msgstr "Oʻchirib boʻlmadi: autentifikatsiya talab qilinadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1678 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "%s oʻchirib boʻlmadi: autentifikatsiya zarur" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1683 +msgid "Unable to uninstall: invalid authentication" +msgstr "Oʻchirib boʻlmadi: autentifikatsiya notoʻgʻri" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1686 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "%s oʻchirib boʻlmadi: autentifikatsiya notoʻgʻri" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1691 +msgid "Unable to uninstall: permission required" +msgstr "Oʻchirib boʻlmadi: ruxsat talab qilinadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1694 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "%s oʻchirib boʻlmadi: ruxsat talab qilinadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1699 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Oʻchirib boʻlmadi: qurilma ulangan boʻlishi kerak" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1702 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "%s oʻchirib boʻlmadi: qurilma ulangan boʻlishi kerak" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1706 +msgid "Unable to uninstall: low battery" +msgstr "Oʻchirib boʻlmadi: batareya quvvati kam" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1709 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "%s oʻchirib boʻlmadi: batareya quvvati kam" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1720 +#, c-format +msgid "Unable to uninstall %s" +msgstr "%s oʻchirib boʻlmadi" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1759 +#, c-format +msgid "Unable to launch %s" +msgstr "%s ishga tushirilmadi" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1764 src/gs-shell.c:1792 src/gs-shell.c:1836 +#: src/gs-shell.c:1880 src/gs-shell.c:1919 src/gs-shell.c:1944 +msgid "Sorry, something went wrong" +msgstr "Kechirasiz, nimadir xato ketdi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1772 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "%s ishga tushirilmadi: %s oʻrnatilmagan" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1782 src/gs-shell.c:1826 src/gs-shell.c:1870 +#: src/gs-shell.c:1924 +msgid "Not enough disk space for operation" +msgstr "Ishlash uchun disk maydoni yetarli emas" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 +msgid "Unable to install: file type not supported" +msgstr "Oʻrnatib boʻlmadi: fayl turi qoʻllab-quvvatlanmaydi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1822 src/gs-shell.c:1866 +msgid "Unable to install: authentication failed" +msgstr "O‘rnatib bo‘lmadi: autentifikatsiya amalga oshmadi" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1862 +msgid "Unable to install" +msgstr "O‘rnatib bo‘lmadi" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1913 +#, c-format +msgid "Unable to contact %s" +msgstr "%s bilan bogʻlanib boʻlmadi" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1928 +msgid "Restart Software to use new plugins" +msgstr "" +"Yangi plaginlardan foydalanish uchun dasturiy ta'minotni qayta ishga " +"tushiring" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1932 +msgid "Device needs to be plugged in" +msgstr "Qurilma rozetkaga ulanishi kerak" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1935 +msgid "Battery level is too low" +msgstr "Batareya quvvati juda past" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "_Dasturiy ta'minot omborlari" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "_Afzalliklar" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "_Klaviatura yorliqlari" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "_Dasturiy ta'minot haqida" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "Qidiruv" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "Asosiy menyu" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "Ilovalarni qidirish" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "_O'rganing" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "_Oʻrnatilgan" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "Yangilanishlarni qayta ishga tushiring va o'rnating" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "Orqaga qaytish" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Hech biri" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Ilova ma'lumotlari" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Ilovaning ishlashi uchun zarur maʼlumotlar" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Foydalanuvchi ma'lumotlari" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Ilovada siz yaratgan maʼlumotlar" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Kesh ma'lumotlari" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Vaqtinchalik keshlangan ma'lumotlar" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Ilovaning o'zi" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Majburiy bog'liqliklar" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Ushbu ilova tomonidan talab qilinadigan umumiy tizim komponentlari" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Nomaʼlum" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Keshlangan ma'lumotlarni _app sozlamalaridan tozalash mumkin" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Saqlash" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Oʻrnatilgan)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Oʻrnatish)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Yuklab olinmoqda)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Oʻchirish)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "_Tafsilotlar" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "_ Tekshirish" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "Oʻrnatilgan: %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "O'rnatilgan yangilanishlar" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "Hech qanday yangilanish oʻrnatilmagan" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "Yangilanishlar eskirgan" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "Iltimos, mavjud yangilanishlarni tekshiring" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "O'rnatishga tayyor muhim yangilanishlar" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "Muhim yangilanishlarni imkon qadar tezroq o'rnating" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "Muhim yangilanishlarni yuklab olish mumkin" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "Muhim yangilanishlarni imkon qadar tezroq yuklab oling" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "O'rnatishga tayyor yangilanishlar" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "Dasturiy ta'minot yangilanishlari tayyor va kutilmoqda" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "Yangilanishlarni yuklab olish mumkin" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "Dasturiy ta'minot yangilanishlarini yuklab olish mumkin" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u Ilova yangilandi — qayta ishga tushirish talab qilinadi" +msgstr[1] "%u Ilovalar yangilandi — qayta ishga tushirish talab qilinadi" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u Ilova yangilandi" +msgstr[1] "%u Ilova yangilandi" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s yangilandi." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "Iltimos, ilovani qayta ishga tushiring." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s va %s yangilandi." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u ilovasi qayta ishga tushirishni talab qiladi." +msgstr[1] "%u ta ilova qayta ishga tushirishni talab qiladi." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "%s, %s va %s oʻz ichiga oladi." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "Tizim umrining oxiriga yetdi" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "Yangilanishlarni olishni davom ettirish uchun yangilang" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s yangi versiyasini oʻrnatish mumkin" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "Dasturiy ta'minotni yangilash mavjud" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "Dasturiy ta'minot yangilanmadi" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "Tayyorlangan yangilanishlar o'rnatilmagan" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "Tafsilotlarni ko'rsatish" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "Tizimni yangilash tugallandi" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "%s %s ga xush kelibsiz!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Dasturiy ta'minot yangilanishi o'rnatildi" +msgstr[1] "Dasturiy ta'minot yangilanishlari o'rnatildi" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Muhim operatsion tizim yangilanishi o'rnatildi." +msgstr[1] "Muhim operatsion tizim yangilanishlari o'rnatildi." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "Ko‘rib chiqish" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "Yangilash amalga oshmadi" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "Tizim allaqachon yangilangan edi." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "Yangilash bekor qilindi." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Internetga kirish kerak edi, lekin mavjud emas edi. Iltimos, internetga " +"kirish imkoningiz borligiga ishonch hosil qiling va qayta urinib ko'ring." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Yangilanishda xavfsizlik bilan bog'liq muammolar mavjud edi. Batafsil " +"ma'lumot uchun dasturiy ta'minot provayderingiz bilan maslahatlashing." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "" +"Diskda joy yetarli emas edi. Biroz joy boʻshating va qayta urinib koʻring." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Kechirasiz: yangilanishni o'rnatib bo'lmadi. Iltimos, boshqa yangilanishni " +"kuting va qaytadan urining. Muammo davom etsa, dasturiy ta'minot " +"provayderingizga murojaat qiling." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "Oxirgi tekshirilgan: %s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "Stop" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "Yangilanishlarni tekshiring" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s muhim dasturiy yangilanishlarni olishni toʻxtatdi" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Sizning operatsion tizimingiz muhim dasturiy ta'minot yangilanishlarini " +"olishni to'xtatdi" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Toʻlovlar olinishi mumkin" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Mobil keng polosali ulanishdan foydalanganda yangilanishlarni tekshirish " +"sizga to'lovlarni olib kelishi mumkin." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Baribir tekshiring" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Yuklab olingan dasturiy ta'minotni yangilash" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Yangilanishlar o'rnatishga tayyor" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "Yangiliklarni tekshirish" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Yangilanishlar" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Yangilanishlar sahifasi" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "Yangilanishlar yuklanmoqda" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "Bu biroz vaqt olishi mumkin" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "Hozirgi kungacha" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "Mobil internet ishlatilsinmi?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Mobil keng polosali ulanishdan foydalanganda yangilanishlarni tekshirish " +"sizga to'lovlarni olib kelishi mumkin" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "_Baribir tekshiring" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "Ma'lumotlar ulanishi" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "Yangilanishlarni tekshirish uchun internetga kiring" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "Past darajadagi tarmoq sozlamalarini o'zgartiring" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "Xatolik" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "Yangilanishlar avtomatik ravishda boshqariladi" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Dasturiy ta'minot yangilanishi to'xtatildi" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "" +"Avtomatik dasturiy ta'minot yangilanishlari quyidagi sabablarga ko'ra " +"to'xtatildi:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Joriy tarmoq ulanishi o'lchanadi" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Joriy tarmoq ulanishi katta hajmdagi yuklab olishni taqiqlaydi" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Quvvat tejash rejimi faol" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• O‘yin rejimi faol" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Dasturiy ta'minot yangilanishlari to'xtatildi" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Tarmoq ulanishi o'lchandi — dasturiy ta'minot yangilanishi to'xtatildi" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "" +"Tarmoq ulanishi katta hajmdagi yuklab olishni taqiqlaydi — dasturiy ta'minot " +"yangilanishi to'xtatildi" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Quvvat tejash rejimi faol — dasturiy taʼminot yangilanishi toʻxtatildi" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Oʻyin rejimi faol — dasturiy taʼminot yangilanishi toʻxtatildi" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Qayta ishga tushirish va yangilash…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +#, fuzzy +msgid "U_pdate All" +msgstr "Hammasini yangilang" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Dasturiy ta'minot yangilanishlari yuklab olindi" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Kengaytma yangilanishlari o'rnatishga tayyor" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Integratsiyalashgan proshivka" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Qayta ishga tushirishni talab qiladi" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Ilova yangilanishlari" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Qurilma proshivka" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Yuklab olish" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s Mavjud" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s Mavjud" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Yangi versiya haqida bilib oling" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "%s / %s yuklab olindi" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% dyuklangan" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Katta yangilanish, yangi xususiyatlar va qo'shimcha jilo." + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "Yangilanishni bekor qilish" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "_Qayta ishga tushirish va yangilash…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "" +"Yangilashdan oldin ma'lumotlar va fayllarning zaxira nusxasini yaratishni " +"unutmang." + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "Xato tafsilotlari" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "Tafsilotlarni nusxalash" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "“%s” faylini o‘chirib bo‘lmadi: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "“%s” katalogini o‘chirib bo‘lmadi: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "" +"Ushbu kompyuterda dasturiy ta'minotni qo'shish, olib tashlash yoki yangilash" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "Yangilanishlar;Yangilash;Manbalar;Repozitoriylar;Sozlamalar;O'rnatish;O'chirish;Dastur;Dastur;Ilova;Do'kon;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s Tayyor" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s ishga tushirilishi va keyingi yuklash uchun tayyor." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Yoqish" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Tizim yangilanishlari" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Umumiy tizim yangilanishlari, masalan, xavfsizlik yoki xatolarni tuzatish va " +"ishlashni yaxshilash." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s yangi funksiyalar va tuzatishlar bilan yangilang." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS yangilash xizmati yangilanishni olib bo'lmadi va qo'llanilmadi." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Veb ilova" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Veb-ilovalarni qo'llab-quvvatlash" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Brauzerda mashhur veb-ilovalarni ishga tushiring" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Eng yangi xususiyatlar, unumdorlik va barqarorlikni yaxshilash uchun " +"yangilang." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak qo'llab-quvvatlash" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak - bu Linuxda ish stoli ilovalari uchun ramka" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:360 +#, c-format +msgid "System folder %s" +msgstr "Tizim jildi %s" + +#: plugins/flatpak/gs-flatpak.c:361 plugins/flatpak/gs-flatpak.c:362 +#, c-format +msgid "Home subfolder %s" +msgstr "Asosiy pastki jild %s" + +#: plugins/flatpak/gs-flatpak.c:363 +msgid "Host system folders" +msgstr "Xost tizim papkalari" + +#: plugins/flatpak/gs-flatpak.c:364 +msgid "Host system configuration from /etc" +msgstr "Xost tizimining konfiguratsiyasi /etc" + +#: plugins/flatpak/gs-flatpak.c:365 +msgid "Desktop folder" +msgstr "Ish stoli papkasi" + +#: plugins/flatpak/gs-flatpak.c:365 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Ish stoli pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:366 +msgid "Documents folder" +msgstr "Hujjatlar papkasi" + +#: plugins/flatpak/gs-flatpak.c:366 +#, c-format +msgid "Documents subfolder %s" +msgstr "Hujjatlar pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:367 +msgid "Music folder" +msgstr "Musiqa papkasi" + +#: plugins/flatpak/gs-flatpak.c:367 +#, c-format +msgid "Music subfolder %s" +msgstr "Musiqa pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:368 +msgid "Pictures folder" +msgstr "Rasmlar papkasi" + +#: plugins/flatpak/gs-flatpak.c:368 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Rasmlar pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:369 +msgid "Public Share folder" +msgstr "Umumiy almashish papkasi" + +#: plugins/flatpak/gs-flatpak.c:369 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Ommaga ulashish pastki papkasi: %s" + +#: plugins/flatpak/gs-flatpak.c:370 +msgid "Videos folder" +msgstr "Videolar papkasi" + +#: plugins/flatpak/gs-flatpak.c:370 +#, c-format +msgid "Videos subfolder %s" +msgstr "Videolar pastki papkasi: %s" + +#: plugins/flatpak/gs-flatpak.c:371 +msgid "Templates folder" +msgstr "Shablonlar papkasi" + +#: plugins/flatpak/gs-flatpak.c:371 +#, c-format +msgid "Templates subfolder %s" +msgstr "Shablonlar pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:372 +msgid "User cache folder" +msgstr "Foydalanuvchi kesh papkasi" + +#: plugins/flatpak/gs-flatpak.c:372 +#, c-format +msgid "User cache subfolder %s" +msgstr "Foydalanuvchi keshi pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:373 +msgid "User configuration folder" +msgstr "Foydalanuvchi konfiguratsiyasi papkasi" + +#: plugins/flatpak/gs-flatpak.c:373 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Foydalanuvchi konfiguratsiyasi pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:374 +msgid "User data folder" +msgstr "Foydalanuvchi ma'lumotlari papkasi" + +#: plugins/flatpak/gs-flatpak.c:374 +#, c-format +msgid "User data subfolder %s" +msgstr "Foydalanuvchi maʼlumotlari pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:375 +msgid "User runtime folder" +msgstr "Foydalanuvchining ishlash vaqti papkasi" + +#: plugins/flatpak/gs-flatpak.c:375 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Foydalanuvchining ishlash vaqti pastki papkasi %s" + +#: plugins/flatpak/gs-flatpak.c:433 +#, c-format +msgid "Filesystem access to %s" +msgstr "%s fayl tizimiga kirish" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1380 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "%s uchun flatpak metamaʼlumotlari olinmoqda…" + +#: plugins/flatpak/gs-flatpak.c:3606 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "“%s” qo‘shimchasini aniqlab bo‘lmadi: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Foydalanuvchi o'rnatish" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Tizimni o'rnatish" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "Ilova identifikatori" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "“%s” qo‘shimchasini o‘rnatishga qo‘shib bo‘lmadi: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "“%s” qo‘shimchasini o‘chirishga qo‘shib bo‘lmadi: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1963 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Masofaviy “%s” “%s”ni oʻrnatishga ruxsat bermaydi, ehtimol uning filtri. " +"Filtrni olib tashlang va o'rnatishni takrorlang. Batafsil xato: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "Yangilashni amalga oshirish uchun tizim quvvati juda past" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "Tizim quvvati yangilanish uchun juda kam (%u%%, %u%%) kerak" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "Qurilmaga ulanish imkonsiz yoki simsiz aloqa diapazonidan tashqarida" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "Qurilma batareya quvvati juda kam" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Qurilma batareya quvvati juda kam (%u%%, %u%%) talab qiladi" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "Qurilma yangilanishni qo'llashni kutmoqda" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "Qurilma AC quvvatini ulashni talab qiladi" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "Qopqoq yopiq holda qurilmadan foydalanish mumkin emas" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s Qurilmani yangilash" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s Tizim yangilanishi" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s Oʻrnatilgan kontroller yangilanishi" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s ME yangilash" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s Korporativ ME yangilanishi" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s Consumer ME yangilanishi" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s Controller yangilanishi" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Thunderbolt Controller yangilanishi" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s CPU mikrokodi yangilanishi" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s Konfiguratsiya yangilanishi" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s Batareya yangilanishi" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s Kamera yangilanishi" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s TPM yangilanishi" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s Sensorli panelni yangilash" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s Sichqonchani yangilash" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s Klaviatura yangilanishi" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s Xotira boshqaruvchisi yangilanishi" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s Tarmoq interfeysini yangilash" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s Yangilanishni koʻrsatish" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s BMC yangilanishi" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB qabul qiluvchini yangilash" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s Drive yangilanishi" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s Flash Drive yangilanishi" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s SSD yangilanishi" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s GPU yangilanishi" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s Dock yangilanishi" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB dock yangilanishi" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "Prashifka" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "Prashifka yangilab boʻlmadi: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Prashifka yangilashni qo'llab-quvvatlash" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Prashifka yangilash uchun yordam beradi" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Imzolanmagan dasturiy ta'minot o'rnatilsinmi?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"O'rnatilishi kerak bo'lgan dasturiy ta'minot imzolanmagan. Ushbu dasturiy " +"ta'minot yangilanishlarining kelib chiqishini yoki yangilanishlar " +"o'zgartirilganligini tekshirish mumkin bo'lmaydi." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Imzolanmagan dasturiy ta'minotni yuklab olingmi?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Imzolanmagan yangilanishlar mavjud. Imzosiz yangilanishning kelib chiqishini " +"yoki uning buzilganligini tekshirish mumkin emas." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Imzolanmagan dasturiy ta'minot yangilansinmi?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Imzolanmagan yangilanishlar mavjud. Imzosiz yangilanishning kelib chiqishini " +"yoki uning buzilganligini tekshirish mumkin emas. Imzosiz yangilanishlar " +"olib tashlanmaguncha yoki yangilanmaguncha dasturiy ta'minot yangilanishlari " +"o'chiriladi." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Yangilanishlarni o‘rnatib bo‘lmadi: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Paketlar" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Yuklab olishdan oldin tranzaksiya tugashini kutib bo‘lmadi: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Yangilanishlarni yuklab bo‘lmadi: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Yangilashni ishga tushirib bo‘lmadi: " + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Operatsion tizim (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap Store" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap qo'llab-quvvatlash" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap universal Linux paketidir" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "Sistema" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "Tizim komponenti" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "“%s” tizimni yangilash vazifasi %i holatida olib tashlanmadi" diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..f4c11a6 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,7712 @@ +# Bản dịch tiếng Việt dành cho gói gnome-software. +# This file is distributed under the same license as the gnome-software package. +# Translators: +# Roddy Shuler , 2016-2017 +# Trần Ngọc Quân , 2020-2023. +# Cas Pascal , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software main\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-13 00:27+0000\n" +"PO-Revision-Date: 2025-02-18 23:21+0700\n" +"Last-Translator: Cas Pascal \n" +"Language-Team: Vietnamese \n" +"Language: vi\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 47.1\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:27 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "Phần mềm" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "Cài đặt và nâng cấp các ứng dụng" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"Phần mềm cho phép bạn tìm kiếm và cài đặt các ứng dụng mới và phần mở rộng " +"hệ thống, cũng như loại bỏ các ứng dụng đã cài đặt hiện có." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"Phần mềm hiển thị các ứng dụng nổi bật và phổ biến với các mô tả hữu ích và " +"nhiều ảnh chụp màn hình cho mỗi ứng dụng. Có thể tìm được các ứng dụng nhờ " +"tìm duyệt danh sách các danh mục hoặc bằng cách tìm kiếm. Nó cũng cho phép " +"bạn cập nhật hệ thống của mình bằng một bản cập nhật ngoại tuyến." + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "Bảng tổng thể" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "Bảng chi tiết" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "Bảng đã cài đặt" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "Bảng cập nhật" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "Chi tiết cập nhật" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2689 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "Dự án GNOME" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "Kiểm tra khoá akmods trong Shim UEFI\t" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "Cần xác minh người dùng để kiểm tra khoá akmods trong Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "Đăng kí khoá akmods vào Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "Cần xác minh người dùng để đăng kí khoá akmods vào Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "Kiểm tra khoá DKMS trong Shim UEFIK" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "Cần xác minh người dùng để kiểm tra khoá DKMS trong Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "Đăng kí khoá DKMS vào Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "Cần xác minh người dùng để đăng kí khoá DKMS vào Shim UEFI" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "Cài đặt một tập tin appstream vào một vị trí trong hệ thống" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "Đang cài đặt một tập tin appstream vào một vị trí trong hệ thống" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "Danh sách các dự án tương thích" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "" +"Đây là danh sách các dự án tương thích mà chúng ta nên hiển thị như GNOME, " +"KDE và XFCE." + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "Có quản lý các cập nhật và nâng cấp trong Phần mềm GNOME" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"Nếu bị tắt, Phần mềm GNOME sẽ ẩn bảng cập nhật và cũng không thực hiện bất " +"kỳ hành động cập nhật hay nâng cấp tự động nào." + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "Tự động tải xuống và cài đặt bản cập nhật" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"Khi được kích hoạt, Phần mềm GNOME sẽ tự động tải về các bản cập nhật phần " +"mềm chạy dưới nền, cũng đồng thời cài đặt những cái không yêu cầu phải khởi " +"động lại." + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "Thống báo người dùng về phần mềm được cập nhật ở dưới nền hệ thống" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "" +"Nếu cho phép, Phần mềm GNOME sẽ thông báo người dùng về các cập nhật cái mà " +"xảy ra trong khi người dùng nghỉ." + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "Có tự động làm mới khi đang duy trì kết nối được đo lưu lượng không" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"Nếu được kích hoạt, Phần mềm GNOME sẽ tự động làm mới trên nền ngay cả khi " +"sử dụng kết nối được đo lưu lượng (sẽ dẫn đến việc tải về một số siêu dữ " +"liệu, kiểm tra cập nhật, v.v., có thể làm phát sinh chi phí cho người dùng)." + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "Dù đó là lần đầu tiên chạy Phần mềm GNOME" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "Hiển thị đánh giá bằng sao kế bên các ứng dụng" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "Các ứng dụng bộ lọc dựa trên bộ nhánh mặc định cho điều khiển từ xa" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "" +"Các ứng dụng không miễn phí đều hiển thị một hộp thoại cảnh báo trước khi " +"cài đặt" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"Khi các ứng dụng không miễn phí được cài đặt, một hộp thoại cảnh báo có thể " +"sẽ hiển thị. Mục này kiểm soát việc có bỏ hộp thoại đó không." + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "Nhãn thời gian kiểm tra cập nhật gần nhất" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "Dấu thời gian truy cập thông báo nâng cấp gần nhất" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "Dấu thời gian thông báo nâng cấp gần nhất" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "" +"Dấu thời gian của lần cập nhật bảo mật đầu tiên, đã xóa sau khi cập nhật" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "Dấu vết thời gian cập nhật cuối cùng" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "" +"Độ tuổi tính theo giây để xác định ảnh chụp màn hình ngược tuyến vẫn còn " +"hiệu lực" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"Chọn giá trị lớn hơn sẽ có nghĩa là giảm thời gian trễ trọn vòng đến máy chủ " +"từ xa, nhưng sẽ kéo dài thời gian hiển thị cho người dùng thấy các cập nhật " +"về ảnh chụp màn hình. Giá trị bằng 0 nghĩa là không bao giờ kiểm tra máy chủ " +"xem liệu hình ảnh đã tồn tại trong bộ nhớ đệm." + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "Máy chủ sử dụng để đánh giá ứng dụng" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "Điểm nghiệp tối thiểu để đánh giá" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "Đánh giá với số lượt nhỏ hơn con số này sẽ không được hiển thị." + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "Danh sách các nguồn chính thức không nên được xem là bên thứ ba" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "Một danh sách các kho yêu cầu cái mà không thể tắt hay xóa bỏ" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "Một danh sách các kho chính thức có thể coi là phần mềm tự do" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "" +"Địa chỉ URL cấp phép để sử dụng khi một ứng dụng có thể coi là phần mềm miễn " +"phí" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "" +"Cài đặt các ứng dụng tích hợp sẵn cho mọi người dùng trên hệ thống nếu có thể" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "Cho phép truy cập vào hộp thoại Các kho chứa Phần mềm" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "Cung cấp các bản nâng cấp cho các bản phát hành trước" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "" +"Hiển thị một số yếu tố giao diện người dùng cho người dùng biết rằng ứng " +"dụng là không tự do" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "" +"Hiển thị dung lượng đã cài đặt cho các ứng dụng trong danh sách các ứng dụng " +"đã cài đặt" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "" +"'https://vi.wikipedia.org/wiki/" +"Ph%E1%BA%A7n_m%E1%BB%81m_s%E1%BB%9F_h%E1%BB%AFu_%C4%91%E1%BB%99c_quy%E1%BB%81n'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "URI giải thích phần mềm sở hữu độc quyền và không miễn phí" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "" +"Một danh sách các URL chỉ dẫn đến các tệp appstream cái mà sẽ được tải về " +"một thư mục swcatalog" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"Cài đặt các tập tin AppStream vào một vị trí dễ tiếp cận trên toàn hệ thống " +"cho tất cả người dùng. Nếu sai, các tập tin sẽ được cài đặt vào thư mục " +"không tiêu chuẩn là $XDG_DATA_HOME/swcatalog/xml" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"Thứ tự ưu tiên của các định dạng đóng gói ưa thích, các định dạng quan trọng " +"hơn được liệt kê đầu tiên. Mảng để trống có nghĩa là thứ tự mặc định. Các " +"định dạng bị bỏ qua được cho được liệt kê cuối cùng. Các định dạng ví dụ " +"như: deb, flatpak, rpm, snap. Các định dạng có thể tùy chọn chỉ định với tên " +"gốc, ngăn cách bằng dấu hai chấm, ví dụ như 'flatpak:flathub'." + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "" +"Dấu vết thời gian của lần cố gắng cuối cùng gõ bỏ phần thực thi Flatpak " +"không dùng" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "" +"Chọn nó nếu chỉ muốn hiển thị các ứng dụng với giấy phép tự do và ẩn các ứng " +"dụng độc quyền." + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "Bật để chỉ hiển thị ứng dụng từ các người phát triển đã được xác minh." + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "Dấu thời gian của lần cập nhật cuối cùng" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "" +"Một chuỗi lưu trữ id tài khoản gnome trực tuyến được sử dụng để đăng nhập" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "Trình cài đặt Phần mềm GNOME trên toàn hệ thống Appstream" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "Không phân tách được các đối số dòng lệnh" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "Bạn cần ghi chính xác một tên tệp" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "Chỉ người dùng chủ mới có thể sử dụng chương trình này" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "Gặp lỗi khi kiểm định kiểu của nội dung: %s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "Gặp lỗi khi di chuyển: %s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "Cài đặt Phần mềm" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "Cài đặt phần mềm đã chọn vào hệ thống" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "Bạo lực biếm họa" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "Không có thông tin về bạo lực biếm họa" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "Bạo lực giả tưởng" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "Không có thông tin về bạo lực giả tưởng" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "Bạo lực thực tế" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "Không có thông tin về bạo lực thực tế" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "Miêu tả chém giết bạo lực" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "Không có thông tin về nội dung chém giết" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "Bạo lực tình dục" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "Không có thông tin về bạo lực tình dục" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "Rượu" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "Không có thông tin về rượu bia" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "Thuốc mê" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "Không có thông tin về thuốc cấm" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "Thuốc lá" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "Không có thông tin có liên quan đến các sản phẩm thuốc lá" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "Khỏa thân" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "Không có thông tin về khỏa thân nào" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "Đề tài tính dục" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "Không có thông tin về dẫn chiếu hoặc mô tả bản năng tình dục" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "Báng bổ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "Không có thông tin bất kỳ về báng bổ dưới mọi hình thức" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "Đùa cợt không thích hợp" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "Không có thông tin về đùa cợt không thích hợp" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "Phân biệt chủng tộc" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "Không có thông tin về dạng ngôn ngữ mang tính kỳ thị nào" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "Quảng cáo" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "Không có thông tin về quảng cáo dưới mọi hình thức" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "Cờ bạc" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "Không có thông tin về cờ bạc nào dưới mọi hình thức" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "Mua" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "Không có thông tin về khả năng tiêu tiền" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "Chát giữa những người dùng" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "Không có thông tin về trò chuyện với những người dùng khác" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "Trò chuyện âm thanh giữa người dùng" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "Không có thông tin về trò chuyện với người dùng khác" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "Chi tiết liên lạc" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "" +"Không có thông tin về chia sẻ tên người dùng hay địa chỉ email dùng trên " +"mạng xã hội" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "Thông tin định danh" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "Không có thông tin về chia sẻ thông tin người dùng với các bên thứ ba" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "Chia sẻ vị trí" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "Không có thông tin về chia sẻ vị trí địa lý với những người dùng khác" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "Tính dục đồng giới" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "Không có thông tin có liên quan đến đồng tính luyến ái" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "Mại dâm" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "Không có thông tin có liên quan đến đến mại dâm" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "Ngoại tình" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "Không có thông tin có liên quan đến đến ngoại tình" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "Nhân vật tình dục" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "Không có thông tin về nhân vật tình dục" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "Mạo phạm" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "Không có thông tin có liên quan đến đến mạo phạm" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "Hài cốt người" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "Không thông tin liên quan đến hiển thị hài cốt người chết" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "Nô lệ" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "Không có thông tin có liên quan đến đến chế độ nô lệ" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "Không bao gồm có liên quan đến đến thuốc cấm" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "Không bao gồm chửi thề, báng bỏ, và các loại ngôn ngữ tục tĩu" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "Không bao gồm quảng cáo hay giao dịch tiền bạc" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "Không bao gồm tình dục hay khỏa thân" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "Không bao gồm tính năng chát không bị kiểm soát giữa những người dùng" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "Không bao gồm bạo lực" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "Ma túy" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "Ngôn ngữ tục tĩu" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "Tiền" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "Xã hội" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "Bạo lực" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "Tất cả" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s có xếp hạng độ tuổi không xác định" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s phù hợp với tất cả mọi người" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s phù hợp với trẻ tập đi" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s phù hợp với trẻ con bé" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s phù hợp với trẻ con" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s phù hợp với trẻ vị thành niên" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s phù hợp với người lớn" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s phù hợp với %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "Quy định tuổi" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:126 +msgid "_How to contribute missing information" +msgstr "Làm thế nào để đóng góp thông tin còn thiếu" + +#: lib/gs-app.c:6365 +msgid "Local file" +msgstr "Tập tin nội bộ" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6384 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6461 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:90 +msgid "Package" +msgstr "Gói" + +#: src/gs-app-addon-row.c:95 src/gs-app-row.c:528 +msgid "Pending" +msgstr "Đang chờ xử lý" + +#: src/gs-app-addon-row.c:99 src/gs-app-row.c:532 src/gs-details-page.c:408 +msgid "Pending install" +msgstr "Chờ để cài đặt" + +#: src/gs-app-addon-row.c:103 src/gs-app-row.c:536 src/gs-details-page.c:415 +msgid "Pending remove" +msgstr "Chờ gỡ bỏ" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:107 src/gs-app-row.c:215 src/gs-details-page.c:396 +msgid "Installing" +msgstr "Đang cài đặt" + +#: src/gs-app-addon-row.c:111 +msgid "Removing" +msgstr "Đang xóa" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:115 src/gs-app-row.c:229 src/gs-details-page.c:401 +#: src/gs-details-page.ui:356 +msgid "Downloading" +msgstr "Đang tải về" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:66 src/gs-common.c:310 src/gs-details-page.c:1061 +#: src/gs-details-page.c:1096 src/gs-details-page.ui:243 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "_Cài đặt" + +#: src/gs-app-addon-row.ui:73 src/gs-details-page.c:1181 +msgid "_Uninstall…" +msgstr "Gỡ cài đặt…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "Mạng" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "Không thể liên lạc qua mạng" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "Dịch vụ Hệ thống" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "Có thể truy cập các dịch vụ D-Bus trên bus hệ thống" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "Dịch vụ phiên làm việc" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "Có thể truy cập các dịch vụ D-Bus trên bus phiên làm việc" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "Thiết bị" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "Có thể truy cập các thiết bị tùy ý như các webcam" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "Có thể truy cập các thiết bị đầu vào" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones" +msgstr "Có thể truy cập máy ghi âm" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "Không thể truy cập các tập tin thiết bị hệ thống" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "Nội dung màn hình" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "Có thể truy cập nội dung màn hình" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "Thư mục riêng (Home)" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:146 +msgid "Can view, edit and create files" +msgstr "Có thể xem, sửa và tạo các tập tin" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:141 +msgid "Can view files" +msgstr "Có thể xem các tập tin" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "Hệ thống tập tin" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "Thư mục tải về" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "Các cài đặt" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "Có thể xem và thay đổi bất kỳ cài đặt nào" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "Hệ thống hiển thị cũ" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "Dùng một hệ thống hiển thị cũ và thiếu an toàn" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "Thoát khỏi sandbox" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "Có thể thoát khỏi sandbox và phá vỡ bất kỳ hạn chế nào khác" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:216 +msgid "No update description available." +msgstr "Không có mô tả cập nhật." + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:239 +msgid "Update Details" +msgstr "Chi tiết cập nhật" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:592 +msgid "Requires additional permissions" +msgstr "Yêu cầu quyền bổ sung" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1085 +msgid "Reviews" +msgstr "Đánh giá" + +#: src/gs-app-reviews-dialog.ui:21 +msgid "No reviews were found for this app." +msgstr "Không tìm thấy bất kỳ đánh giá nào cho ứng dụng này." + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No Reviews" +msgstr "Không có đánh giá nào" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552 +msgid "Version History" +msgstr "Lịch sử Phiên bản" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "Điểm mới trong phiên bản %s" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "Phiên bản %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "Không có thông tin chi tiết cho bản phát hành này" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%e %B %Y" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"Chế độ khởi chạy: \"bản cập nhật\", \"đã cập nhật\", \"đã cài đặt\" hoặc " +"\"tổng quan\"" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "CHẾ_ĐỘ" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "Tìm kiếm các ứng dụng" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "TÌM_KIẾM" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "Hiển thị chi tiết ứng dụng (sử dụng ID ứng dụng)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "Hiển thị thông tin chi tiết về ứng dụng (sử dụng tên gói)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "TÊN_GÓI" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "Cài đặt ứng dụng (sử dụng ID ứng dụng)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "Gỡ bỏ ứng dụng (sử dụng ID ứng dụng)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "Mở một tập tin gói trong nội bộ" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "TÊN_TẬP_TIN" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"Kiểu tương tác cần có cho hành động này: có thể là \"không\", \"thông báo\" " +"hoặc \"đầy đủ\"" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "TƯƠNG_TÁC" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "Hiển thị một tập tin metainfo hay appdata nội bộ" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "Bật đầu ra gỡ lỗi chi tiết (từ phiên bản đang chạy, nếu đã chạy)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "Cài đặt bất kỳ bản cập nhật đang chờ xử lý nào trong nền" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "Hiển thị tuỳ thích" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "Thoát tiến trình đang chạy" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "Thích nguồn tập tin cục bộ hơn là AppStream" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "Hiển thị số phiên bản" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Bản quyền © 2016–2023 những người đóng góp cho Phần mềm GNOME" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "Nhóm Việt hóa GNOME " + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "Rất tiếc! Không có bất cứ thông tin nào cho ứng dụng đó." + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "Kích cỡ cài đặt" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "Bao gồm %s trong dữ liệu và %s trong bộ nhớ đệm" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "Bao gồm %s trong dữ liệu" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "Bao gồm %s trong bộ nhớ đệm" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "Không biết tiêu dùng bộ nhớ đệm và bộ nhớ dữ liệu bao nhiêu" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "Kích cỡ tải xuống" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "Không cần tải xuống hệ thống bổ sung" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "Chưa biết cần tần tải thêm bao nhiêu các bản tải về hệ thống bổ sung" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "Cần tải thêm %s của các bản tải về hệ thống bổ sung" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "Không biết kích thước" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "Không có quyền" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "Có truy cập mạng" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "Sử dụng dịch vụ hệ thống" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "Dùng dịch vụ phiên làm việc" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "Có thể truy cập các thiết bị hệ thống" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "Có thể truy cập các thiết bị hệ thống" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "Có thể đọc/ghi mọi dữ liệu của bạn" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "Có thể đọc mọi dữ liệu của bạn" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "Có thể đọc/ghi tải về của bạn" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "Có thể đọc các phần tải về của bạn" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "Có thể truy cập một số tập tin cụ thể" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "Có truy cập và thay đổi các cài đặt người dùng" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "Dùng một hệ thống hiển thị cửa sổ cũ" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "Có thể thu thập các quyền tùy ý" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "Nhà phát triển phần mềm đã được thẩm định" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "Được đánh giá bởi bản phân phối HĐH" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "Đánh giá bởi %s" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "Cung cấp bởi bên thứ ba" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "Phần mềm không còn được hỗ trợ" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "Mã có thể kiểm tra" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "Bản quyền phần mềm không xác định" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "Mã độc quyền" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "Giấy phép đặc biệt" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr "; " + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "Đặc quyền" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "An toàn" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "Có lẽ an toàn" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "Tiềm ẩn thiếu an toàn" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "Không an toàn" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "Chỉ trên di động" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "Chỉ hoạt động trên một màn hình nhỏ" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "Chỉ máy tính để bàn" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "Chỉ hoạt động trên một màn hình lớn" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "Kích cỡ màn hình không khớp nhau" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "Không hỗ trợ cỡ màn hình hiện tại của bạn" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "Cần phải có màn hình cảm ứng" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "Cần phải có bàn phím" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "Cần phải có con chuột" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "Cần phải có tay chơi game" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "Cần phải có tay chơi game để phát" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "Thích nghi" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "Làm việc trên điện thoại, máy tính bảng và máy tính để bàn" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "Có thẻ cần một bàn phím hoặc con chuột" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "Làm việc trên máy tính để bàn và máy tính xách tay" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "Ứng dụng không chứa nội dung không phù hợp" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "Không có thông tin đánh giá tuổi sẵn có" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "Truy cập trang thông tin điện tử" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "Cài đặt…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "Hủy" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "Cài đặt" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "_Tải xuống" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "Cập nhật" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "Gỡ bỏ…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "Đang gỡ bỏ" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 src/gs-os-update-page.c:153 +#: src/gs-os-update-page.c:156 src/gs-os-update-page.c:183 +msgid "Critical update" +msgstr "Cập nhật quan trọng" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "Không thể sử dụng thiết bị trong suốt quá trình cập nhật." + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "Nguồn: %s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:599 +#, c-format +msgid "Renamed from %s" +msgstr "Được đổi tên từ %s" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:636 src/gs-details-page.ui:575 +msgid "Stopped Receiving Updates" +msgstr "Đã dừng nhận các Cập nhật" + +#: src/gs-app-row.ui:58 +msgid "Critical Update" +msgstr "Cập nhật quan trọng" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "Đã cài đặt" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "Giúp dịch %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s được thiết kế, phát triển và dịch bởi một cộng đồng tình nguyện viên quốc " +"tế.\n" +"\n" +"Điều này có nghĩa là trong khi nó chưa có sẵn trong ngôn ngữ của bạn, bạn có " +"thể tham gia và giúp tự dịch nó." + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "Các bản dịch" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "_Trang thông tin điện tử dịch" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:82 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "Máy chủ %s yêu cầu đăng nhập (lĩnh vực %s)" + +#: src/gs-basic-auth-dialog.ui:8 +msgid "Login Required" +msgstr "Yêu cầu đăng nhập" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:17 src/gs-common.c:303 src/gs-common.c:755 +#: src/gs-details-page.ui:331 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-page.c:701 +#: src/gs-removal-dialog.ui:24 src/gs-repos-dialog.c:175 +#: src/gs-repos-dialog.c:251 src/gs-review-dialog.ui:24 src/gs-review-row.c:236 +#: src/gs-review-row.c:260 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:202 +msgid "_Cancel" +msgstr "_Hủy" + +#: src/gs-basic-auth-dialog.ui:29 +msgid "_Login" +msgstr "Đăn_g nhập" + +#. Translators: Placeholder text for a login entry. +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-basic-auth-dialog.ui:65 src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "Tài khoản" + +#. Translators: Placeholder text for a login entry. +#: src/gs-basic-auth-dialog.ui:78 +msgid "Password" +msgstr "Mật khẩu" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "Khác" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "Tất cả" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "Nổi bật" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "Lựa chọn của Biên tập viên" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "Mới & Đã cập nhật" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "Chọn từ Web" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "Phần mềm khác" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s đã cài đặt" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "Cần khởi động lại để các thay đổi được áp dụng." + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "Ứng dụng sẵn sàng để sử dụng." + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "Đã cài đặt bản cập nhật hệ thống" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "Các bản cập nhật vừa được cài đặt gần đây có thể được xem lại" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:920 +msgid "Restart" +msgstr "Khởi động lại" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "Khởi chạy" + +#. TRANSLATORS: window title +#: src/gs-common.c:237 +msgid "Install Software?" +msgstr "Cài đặt phần mềm?" + +#. TRANSLATORS: window title +#: src/gs-common.c:239 +msgid "Install Third-Party Software?" +msgstr "Cài đặt Phần mềm Bên thứ ba?" + +#. TRANSLATORS: window title +#: src/gs-common.c:243 +msgid "Enable Software Repository?" +msgstr "Kích hoạt Kho Phần mềm?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:245 src/gs-repos-dialog.c:172 +msgid "Enable Third-Party Software Repository?" +msgstr "Kích hoạt Kho Phần mềm Bên Thứ ba?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:257 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s không phải là phần mềm tự do và nguồn mở, phần mềm này do “%s” cung " +"cấp." + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:267 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s được cung cấp bởi “%s”." + +#: src/gs-common.c:276 +msgid "This software repository must be enabled to continue installation." +msgstr "Cần phải kích hoạt kho phần mềm để tiếp tục cài đặt." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:286 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "Việc cài đặt hoặc sử dụng %s có thể là trái phép tại một số quốc gia." + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:292 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "" +"Việc cài đặt hay sử dụng bộ mã hóa - giải mã này ở một số nước có thể là phi " +"pháp." + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:306 +msgid "Don’t _Warn Again" +msgstr "Không cảnh _báo lại" + +#. TRANSLATORS: button text +#: src/gs-common.c:315 +msgid "Enable and _Install" +msgstr "Bật và Cà_i đặt" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:522 +msgid "Detailed errors from the package manager follow:" +msgstr "Lỗi chi tiết từ trình quản lý gói phần mềm như sau:" + +#: src/gs-common.c:529 src/gs-common.c:666 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 +msgid "Details" +msgstr "Chi tiết" + +#. TRANSLATORS: button text +#: src/gs-common.c:578 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "Đón_g" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:747 +msgid "_Accept" +msgstr "_Chấp nhận" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:895 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "Một (số) bản cập nhật đã được cài đặt" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:905 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "Một (số) ứng dụng đã được gỡ bỏ" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:911 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "Cần khởi động lại để áp dụng" + +#. TRANSLATORS: button text +#: src/gs-common.c:918 +msgid "Not Now" +msgstr "Không phải Bây giờ" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1014 +msgid "Just now" +msgstr "Vừa xong" + +#: src/gs-common.c:1016 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d phút trước" + +#: src/gs-common.c:1020 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d giờ trước" + +#: src/gs-common.c:1024 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d ngày trước" + +#: src/gs-common.c:1028 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d tuần trước" + +#: src/gs-common.c:1032 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d tháng trước" + +#: src/gs-common.c:1036 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d năm trước" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1399 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "Tất cả" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "Nổi bật" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "Đồ họa 3D" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "Nhiếp ảnh" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "Quét ảnh" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "Đồ họa Vector" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "Bộ xem ảnh" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "Tạo & Chỉnh sửa Âm thanh" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "Trình phát nhạc" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "Tất cả" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "Nổi bật" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "Lịch" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "Cơ sở dữ liệu" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "Tài chính" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "Trình xử lý văn bản" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "Trình soạn thảo văn bản" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "Trình duyệt Web" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "Tất cả" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "Nổi bật" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "Hành động" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "Phiêu lưu" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "Trò chơi điện tử" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "Hình khối" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "Bàn" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "Thẻ" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "Giả lập" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "Trẻ em" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "Lô-gíc" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "Nhập vai" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "Thể thao" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "Chiến lược" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "Tất cả" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "Nổi bật" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "Chat" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "Tất cả" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "Nổi bật" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "Trí tuệ nhân tạo" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "Thiên văn học" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "Hóa học" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "Ngôn ngữ" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "Toán học" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "Tin tức" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "Rô bốt" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "Nghệ thuật" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "Tiểu sử" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "Truyện tranh" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "Tiểu thuyết" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "Sức khỏe" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "Lịch sử" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "Lối sống" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "Chính trị" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "Thể thao" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "Tất cả" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "Nổi bật" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "Trình gỡ lỗi" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE (Môi trường Phát triển Tích hợp)" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "Bộ mã hóa và giải mã" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "Trình điều khiển Phần cứng" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "Phông chữ" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "Nguồn nhập liệu" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "Các gói ngôn ngữ" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "Bản địa hóa" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "Tạo" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "Công việc" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "Phát" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "Xã hội hóa" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "Học tập" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "Phát triển" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "Mã hóa" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "Trình điều khiển Phần cứng" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "Phông chữ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "Nguồn nhập liệu" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "Các gói ngôn ngữ" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "Bản địa hóa" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "Một ứng dụng" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s đang yêu cầu bổ sung hỗ trợ định dạng tập tin." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "Yêu Cầu Các Loại MIME Bổ Sung" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s đang yêu cầu bổ sung kiểu chữ." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "Yêu cầu Bổ sung Kiểu chữ" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s đang yêu cầu bổ sung bộ mã hóa - giải mã đa phương tiện." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "Cần có Bộ Mã hóa - Giải mã Đa phương tiện Bổ sung" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s đang yêu cầu bổ sung trình điều khiển máy in." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "Phải Bổ sung Trình Điều khiển Máy in" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s đang yêu cầu các gói bổ sung." + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "Phải Bổ sung Gói phần mềm" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "Tìm trong Phần mềm" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "_Hiển thị thêm" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "_Hiển thị ít" + +#: src/gs-details-page.c:391 +msgid "Removing…" +msgstr "Đang xóa…" + +#: src/gs-details-page.c:406 +msgid "Requires restart to finish install" +msgstr "Cần phải khởi động lại để hoàn tất cài đặt" + +#: src/gs-details-page.c:413 +msgid "Requires restart to finish remove" +msgstr "Cần phải khởi động lại để hoàn tất việc gỡ bỏ" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:429 +msgid "Pending installation…" +msgstr "Cài đặt đang chờ…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:435 +msgid "Pending update…" +msgstr "Cập nhật đang chờ…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:450 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "Đang tải về…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:453 +msgid "Preparing…" +msgstr "Đang chuẩn bị…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:456 +msgid "Uninstalling…" +msgstr "Đang gỡ bỏ…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:583 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s chưa được cài đặt nhưng vẫn có dữ liệu." + +#: src/gs-details-page.c:1078 src/gs-toast.c:65 +msgid "_Restart" +msgstr "_Khởi động lại" + +#: src/gs-details-page.c:1084 +msgid "_Enable…" +msgstr "_Bật…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1110 +msgid "_Install…" +msgstr "_Cài đặt…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1326 +#, c-format +msgid "%s will appear in US English" +msgstr "%s sẽ xuất hiện trong tiếng Anh (Mỹ)" + +#: src/gs-details-page.c:1334 +msgid "This app will appear in US English" +msgstr "Ứng dụng này sẽ xuất hiện trong tiếng Anh (Mỹ)" + +#: src/gs-details-page.c:1336 +msgid "This software will appear in US English" +msgstr "Ứng dụng này sẽ xuất hiện trong tiếng Anh (Mỹ)" + +#: src/gs-details-page.c:1371 src/gs-details-page.ui:76 +msgid "Help _Translate" +msgstr "Hỗ trợ _dịch" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1436 +#, c-format +msgid "Other Apps by %s" +msgstr "Ứng dụng khác của %s" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1472 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "Nhà phát triển %s đẵ khẳng định quyền sở hữu %s" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1475 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "Nhà phát triển đẵ khẳng định quyền sở hữu %s" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1838 +msgid "You need internet access to write a review" +msgstr "Bạn cần truy cập internet để viết bình luận" + +#: src/gs-details-page.c:1939 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "" +"Phần mềm này không còn nhận được các bản cập nhật nữa, kể cả các bản sửa lỗi " +"bảo mật" + +#: src/gs-details-page.c:1940 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "" +"Phần mềm này đã được nhà phân phối của bạn cung cấp và không nên bị thay thế." + +#: src/gs-details-page.c:1941 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "" +"Phần mềm này không cung cấp liên kết đến trang thông tin điện tử, kho mã " +"nguồn hay hệ thống theo dõi và báo cáo lỗi." + +#: src/gs-details-page.c:1943 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "" +"Phần mềm này không còn nhận được các bản cập nhật, kể cả các bản sửa lỗi bảo " +"mật" + +#: src/gs-details-page.c:1944 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "" +"Phần mềm này đã được nhà phân phối của bạn cung cấp và không nên được thay " +"thế." + +#: src/gs-details-page.c:1945 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "" +"Phần mềm này không cung cấp liên kết đến trang thông tin điện tử, kho mã " +"nguồn hay hệ thống theo dõi và báo cáo lỗi." + +#: src/gs-details-page.c:2035 src/gs-details-page.c:2052 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "" +"Phần mềm gặp lỗi khi lấy thông tin của “%s” và không thể hiển thị chi tiết " +"về ứng dụng này." + +#: src/gs-details-page.c:2407 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "Gặp lỗi khi gửi đánh giá cho “%s”: %s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "Trang thông tin chi tiết" + +#: src/gs-details-page.ui:54 +msgid "Loading App Details" +msgstr "Đang tải chi tiết về ứng dụng" + +#: src/gs-details-page.ui:186 +msgid "Verified" +msgstr "Đã xác minh" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:260 +msgid "_Open" +msgstr "_Mở" + +#: src/gs-details-page.ui:276 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "_Cập nhật" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:294 src/gs-details-page.ui:304 +msgid "Uninstall" +msgstr "Gỡ bỏ" + +#: src/gs-details-page.ui:493 src/gs-installed-page.ui:136 +msgid "Add-ons" +msgstr "Tiện ích bổ sung" + +#: src/gs-details-page.ui:646 +msgid "This app can only be used when there is an active internet connection." +msgstr "Chỉ có thể dùng ứng dụng này khi có kết nối internet hoạt động." + +#: src/gs-details-page.ui:669 +msgid "Software Repository Included" +msgstr "Kho phần mềm đã được bao gồm" + +#: src/gs-details-page.ui:679 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "" +"Ứng dụng này bao gồm một kho phần mềm cung cấp các cập nhật cũng như quyền " +"truy cập đến phần mềm khác." + +#: src/gs-details-page.ui:707 +msgid "No Software Repository Included" +msgstr "Chưa có kho Phần mềm nào được bao gồm" + +#: src/gs-details-page.ui:717 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "" +"Ứng dụng này không bao gồm một kho phần mềm. Ứng dụng sẽ không được cập nhật " +"lên các phiên bản mới." + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:776 +msgid "Software Repository Identified" +msgstr "Kho phần mềm được xác định" + +#: src/gs-details-page.ui:786 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "" +"Việc thêm kho phần mềm này sẽ cho phép bạn truy cập vào phần mềm bổ sung và " +"các bản nâng cấp." + +#: src/gs-details-page.ui:793 +msgid "Only use software repositories that you trust." +msgstr "Chỉ sử dụng các kho phần mềm mà bạn tin tưởng." + +#: src/gs-details-page.ui:834 +msgid "Clear app data" +msgstr "Xóa dữ liệu ứng dụng" + +#: src/gs-details-page.ui:851 +msgid "D_elete Data" +msgstr "_Xóa dữ liệu" + +#: src/gs-details-page.ui:927 +msgid "No Metadata" +msgstr "Không có siêu dữ liệu" + +#: src/gs-details-page.ui:964 +msgid "Project _Website" +msgstr "Trang _web dự án" + +#: src/gs-details-page.ui:980 +msgid "_Donate" +msgstr "_Quyên góp" + +#: src/gs-details-page.ui:996 +msgid "Contribute _Translations" +msgstr "Những người đóng góp _dịch" + +#: src/gs-details-page.ui:1012 +msgid "_Report an Issue" +msgstr "_Báo cáo một lỗi" + +#: src/gs-details-page.ui:1028 +msgid "_Help" +msgstr "_Trợ giúp" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1044 +msgctxt "verb" +msgid "_Contact" +msgstr "_Liên hệ" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1125 +msgid "Write R_eview" +msgstr "_Viết đánh giá" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1142 +msgid "All Reviews" +msgstr "Mọi đánh giá" + +#: src/gs-details-page.ui:1214 +msgid "Unable to Show App Details" +msgstr "Không Thể Hiện Chi tiết Ứng dụng" + +#: src/gs-dkms-dialog.c:67 +msgid "Failed to prepare reboot" +msgstr "Gặp lỗi khi chuẩn bị khởi động lại" + +#: src/gs-dkms-dialog.c:93 +msgid "Unknown error" +msgstr "Lỗi không xác định" + +#: src/gs-dkms-dialog.c:99 +msgid "The key was not found" +msgstr "Không tìm thấy khoá" + +#: src/gs-dkms-dialog.c:102 +msgid "The key is not enrolled" +msgstr "Khoá này chưa được đăng kí" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "Yêu cầu Đăng kí MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "Kế tiếp" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"Thiết bị này đang bật Secure Boot. Để cho phép bật các driver, một khoá " +"Machine Owner Key (MOK) cần phải được đăng kí. Quá trình này sẽ cần nhập một " +"mật khẩu. Hãy ghi lại mật khẩu đi kèm với khoá này:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "Tôi đã ghi nhớ mật khẩu MOK" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "_Khởi động lại & Đăng kí…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "Hướng dẫn Setup: Hãy đọc kĩ" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"Sau khi khởi động lại, màn hình setup thiết bị sẽ hiển thị. Để bật các " +"driver mới, làm theo các chỉ dẫn này:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• Chọn “Enroll MOK”\n" +"• Chọn “Yes” để đăng kí các khoá\n" +"• Nhập mật khẩu MOK khi được yêu cầu\n" +"• Chọn “Reboot”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "Ý nghĩa Bảo mật" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"Sau khi đăng kí khoá thành công, hãy nhớ rằng các bản cập nhật tương lai về " +"các module sẽ coi như được tin tưởng. Mọi bản cập nhật tiếp theo sẽ được " +"thực hiện không thông qua bất kì tương tác hay xác minh nào." + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"Hướng dẫn thêm có sẵn tại trang web tài liệu." + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:272 +msgid "Downloading extra metadata files…" +msgstr "Đang tải thêm tập tin siêu dữ liệu…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:143 +msgid " and " +msgstr " và " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:146 +msgid ", " +msgstr ", " + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:172 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "Kiểu chữ có sẵn cho bộ chữ viết %s" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:180 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "Phần mềm khả dụng dành cho %s" + +#: src/gs-extras-page.c:241 +msgid "Requested software not found" +msgstr "Không thể tìm thấy Phần mềm đã yêu cầu" + +#: src/gs-extras-page.c:243 +msgid "Failed to find requested software" +msgstr "Gặp lỗi khi tìm phần mềm theo đã yêu cầu" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:425 +#, c-format +msgid "%s not found" +msgstr "Không tìm thấy %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:429 +msgid "on the website" +msgstr "trên website" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:436 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "Không có sẵn các ứng dụng cung cấp tập tin %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:440 src/gs-extras-page.c:451 src/gs-extras-page.c:462 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "" +"Có thể tìm thấy thông tin về %s cũng như các tùy chọn về cách lấy được các " +"ứng dụng còn thiếu ở %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:447 src/gs-extras-page.c:469 +#, c-format +msgid "No apps are available for %s support." +msgstr "Không có sẵn các ứng dụng để hỗ trợ %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:458 +#, c-format +msgid "%s is not available." +msgstr "%s không khả dụng." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:473 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "" +"Thông tin về %s, cũng như các tùy chọn về cách có thể tìm được ứng dụng hỗ " +"trợ định dạng này có thể tìm thấy tại %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:480 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "Không có phông chữ nào hỗ trợ kịch bản %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:484 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "" +"Có thể tìm thấy thông tin về %s cũng như các tùy chọn về cách có được thêm " +"kiểu chữ trên trang web %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:491 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "Không có sẵn các bộ mã hóa-giải mã add-on cho định dạng %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:495 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"Thông tin về %s, cũng như các tùy chọn về cách có thể tìm được codec phát " +"được định dạng này %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:502 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "Không có các tài nguyên Plasma khả dụng để hỗ trợ %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"Thông tin về %s, cũng như các tùy chọn về cách có thể tìm được tài nguyên " +"Plasma bổ sung %s." + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:513 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "Không có trình điều khiển máy in khả dụng cho %s." + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:517 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"Có thể tìm thấy thông tin về %s cũng như các tùy chọn về cách có được một " +"trình điều khiển hỗ trợ máy in này trên trang web %s." + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:563 +msgid "the documentation" +msgstr "tài liệu" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:569 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "" +"Không thể tìm thấy %s cái được yêu cầu bởi %s. Vui lòng tham khảo %s để biết " +"thêm thông tin." + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:578 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "" +"Không thể tìm thấy %s mà bạn đang tìm kiếm. Vui lòng tham khảo %s để biết " +"thêm thông tin." + +#: src/gs-extras-page.c:656 src/gs-extras-page.c:713 src/gs-extras-page.c:753 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "Gặp lỗi khi tìm bất kỳ kết quả tìm kiếm nào: %s" + +#: src/gs-extras-page.c:970 +#, c-format +msgid "%s file format" +msgstr "Định dạng tập tin %s" + +#: src/gs-extras-page.c:1328 +msgid "Install _All" +msgstr "Cài đặt tất _cả" + +#: src/gs-extras-page.c:1358 +msgid "Unable to Find Requested Software" +msgstr "Không thể Tìm thấy Phần mềm theo Yêu cầu" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "Trang mã hóa - giải mã" + +#: src/gs-extras-page.ui:88 +msgid "No Results Found" +msgstr "Không có kết quả" + +#: src/gs-extras-page.ui:100 +msgid "Unable To Perform Search" +msgstr "Không thể tìm kiếm" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "Kế trước" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "Kế tiếp" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "Danh sách Ứng dụng Nổi bật" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "Hỗ trợ máy tính để bàn" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "Hỗ trợ dùng trên một màn hình lớn" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "Không biết có hỗ trợ máy tính để bàn hay không" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "Không đủ thông tin để biết màn hình lớn có được hỗ trợ hay không" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "Cần có một màn hình lớn" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "Không hỗ trợ máy tính để bàn" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "Không thể được dùng trên một màn hình lớn" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "Hỗ trợ di động" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "Hỗ trợ dùng trên một màn hình nhỏ" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "Không biết có hỗ trợ di động hay không" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "Không đủ thông tin để biết màn hình nhỏ có được hỗ trợ hay không" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "Cần phải dùng trên màn hình nhỏ" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "Không hỗ trợ dùng trên di động" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "Không thể được dùng trên một màn hình nhỏ" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "Hỗ trợ bàn phím" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "Không biết có hỗ trợ bàn phím hay không" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "Không đủ thông tin để biết bàn phím có được hỗ trợ hay không" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "Cần bàn phím" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "Hỗ trợ bàn phím" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "Không hỗ trợ bàn phím" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "Không thể dùng với bàn phím" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "Hỗ trợ con chuột" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "Cần phải có con chuột hoặc thiết bị chỉ" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "Không biết có hỗ trợ con chuột không" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "" +"Không đủ thông tin để biết con chuột hay thiết bị trỏ có được hỗ trợ hay " +"không" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "Cần có chuột" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "Hỗ trợ con chuột và thiết bị trỏ" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "Không hỗ trợ con chuột" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "Không thể được dùng với con chuột hay thiết bị trỏ" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "Hỗ trợ màn hình cảm ứng" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "Không biết có hỗ trợ màn hình cảm ứng hay không" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "Không đủ thông tin để biết màn hình cảm ứng có được hỗ trợ hay không" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "Cần phải có màn hình cảm ứng" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "Hỗ trợ màn hình cảm ứng" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "Không hỗ trợ màn hình cảm ứng" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "Không thể dùng với màn hình cảm ứng" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "Cần phải có tay chơi game" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "Cần phải có tay chơi game" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "Hỗ trợ tay chơi game" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "Hỗ trợ tay chơi game" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s có thể hoạt động trên thiết bị này" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s hoạt động trên thiết bị này" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s có thể không hoạt động trên thiết bị này" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s sẽ không thể hoạt động đúng trên thiết bị này" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s sẽ không làm việc trên thiết bị này" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "Hỗ trợ phần cứng" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "Chuyển hướng" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "Chuyển hướng đến Trang duyệt" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "Chuyển hướng đến Trang đã cài đặt" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "Chuyển hướng đến Trang cập nhật" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "Mở Thanh kiếm trang" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "Cửa sổ" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "Mở Tuỳ thích" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "Mở Kho Phần mềm" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "Trợ giúp" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "Mở Phím tắt bàn phím" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:823 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "Đã cài đặt" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "Trang đã cài đặt" + +#: src/gs-installed-page.ui:56 +msgid "In Progress" +msgstr "Đang tiến hành" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:76 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "Các ứng dụng" + +#: src/gs-installed-page.ui:96 +msgid "Web Apps" +msgstr "Ứng dụng Web" + +#: src/gs-installed-page.ui:116 +msgid "System Apps" +msgstr "Ứng dụng Hệ thống" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "Bản biên dịch từ cộng đồng" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "_Muốn tham gia" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Phần mềm này được phát triển mở bởi một cộng đồng tình nguyện viên, và phát " +"hành dưới giấy phép %s.\n" +"\n" +"Bạn có thể đóng góp và giúp đỡ để làm nó tốt hơn." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Phần mềm này được phát triển mở bởi một cộng đồng tình nguyện viên, và phát " +"hành dưới giấy phép %s\n" +"\n" +"Bạn có thể đóng góp và giúp đỡ để làm nó tốt hơn." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Phần mềm này được phát triển mở bởi một cộng đồng tình nguyện viên, và phát " +"hành dưới giấy phép %s.\n" +"\n" +"Bạn có thể đóng góp và giúp đỡ để làm nó tốt hơn." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"Phần mềm này được phát triển mở bởi một cộng đồng tình nguyện viên, và phát " +"hành dưới giấy phép %s\n" +"\n" +"Bạn có thể đóng góp và giúp đỡ để làm nó tốt hơn." + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "Bản quyền phần mềm không xác định" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "_Tìm hiểu thêm" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Phần mềm này không chỉ ra nó được phát triển theo giấy phép nào, và nó có " +"thể là độc quyền. Nó có thể không an toàn, khó mà điều tra được, và nó có " +"thể âm thầm thay đổi.\n" +"\n" +"Bạn có thể và không thể đóng góp cho phần mềm này." + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Phần mềm này không chỉ ra nó được phát triển theo giấy phép nào, và nó có " +"thể là độc quyền. Nó có thể không an toàn, khó mà điều tra được, và nó có " +"thể âm thầm thay đổi.\n" +"\n" +"Bạn có thể và không thể đóng góp cho phần mềm này." + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "Quyền sở hữu" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"Phần mềm này không được phát triển mở, do đó chỉ có những người phát triển " +"của nó là biết nó chạy thế nào. Nó có thể không an toàn, khó mà điều tra " +"được, và nó có thể âm thầm thay đổi.\n" +"\n" +"Bạn không thể đóng góp cho phần mềm này." + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"Phần mềm này không được phát triển mở, do đó chỉ có những người phát triển " +"của nó là biết nó chạy thế nào. Nó có thể không an toàn, khó mà điều tra " +"được, và nó có thể âm thầm thay đổi.\n" +"\n" +"Bạn không thể đóng góp cho phần mềm này." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "Giấy phép đặc biệt" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ứng dụng này được phát triển dưới giấy phép đặc biệt %s.\n" +"\n" +"Bạn có hoặc không thể đóng góp cho ứng dụng này." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"Ứng dụng này được phát triển dưới giấy phép đặc biệt “%s”.\n" +"\n" +"Bạn có hoặc không thể đóng góp cho ứng dụng này." + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Phần mềm này được phát triển dưới giấy phép đặc biệt %s.\n" +"\n" +"Bạn có hoặc không thể đóng góp cho ứng dụng này." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"Phần mềm này được phát triển dưới giấy phép đặc biệt “%s”.\n" +"\n" +"Bạn có hoặc không thể đóng góp cho phần mềm này." + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "Đang làm mới dữ liệu" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "Đang tải trang" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "Đang khởi động" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "Không rõ nguồn" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:284 +msgid "Additions" +msgstr "Các phần bổ sung" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:288 +msgid "Removals" +msgstr "Gỡ bỏ" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:292 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "Cập nhật" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:296 +msgid "Downgrades" +msgstr "Hạ cấp" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:733 +msgid "selected external sources" +msgstr "các nguồn bên ngoài đã chọn" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:737 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"Cung cấp quyền truy cập các phần mềm bổ sung từ %s. Một số phần mềm độc " +"quyền được bao gồm.\n" +"\n" +"Bạn có thể bật những kho này sau trong Tùy thích Kho Phần mềm." + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:741 +msgid "Enable Third Party Software Repositories?" +msgstr "Kích hoạt Kho Phần mềm Bên Thứ ba?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:746 +msgid "_Ignore" +msgstr "_Bỏ qua" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:748 src/gs-repos-dialog.c:177 +msgid "_Enable" +msgstr "_Bật" + +#: src/gs-overview-page.c:951 +msgid "Available for your operating system" +msgstr "Sẵn có cho hệ điều hành của bạn" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:955 +#, c-format +msgid "Available for %s" +msgstr "Sẵn có cho %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1252 +msgid "Explore" +msgstr "Khám phá" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "Trang tổng quan" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "Các ứng dụng sẵn có" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "Danh mục khác" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "Không Tìm thấy Dữ liệu Ứng dụng" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "Không rõ" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "_OK" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "Người dùng quyết định cài đặt" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "Chuẩn bị %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:563 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "Bạn có chắc là bạn muốn gỡ kho %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:567 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "" +"Mọi ứng dụng từ %s sẽ được gỡ bỏ, và bạn sẽ phải cài đặt lại kho nguồn để sử " +"dụng lại các ứng dụng này." + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:576 src/gs-page.c:587 src/gs-page.c:598 src/gs-page.c:609 +#: src/gs-page.c:620 src/gs-page.c:632 +#, c-format +msgid "Uninstall %s?" +msgstr "Gỡ bỏ %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:580 src/gs-page.c:644 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "Sẽ không thể sử dụng %s sau khi xóa." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:591 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "" +"Sẽ không thể sử dụng bất kì ứng dụng nào đang phụ thuộc vào %s sau khi gỡ bỏ." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:601 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"Sẽ không thể sử dụng %s sau khi gỡ bỏ, nhiều tài liệu sử dụng nó sẽ sử dụng " +"một phông chữ khác." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:612 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "" +"Sẽ không thể sử dụng %s sau khi gỡ bỏ. Một số tập tin media sẽ không xem " +"được." + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:623 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "" +"Các phần cứng phụ thuộc vào %s có thể hoạt động sai cách sao khi gỡ bỏ." + +#: src/gs-page.c:641 +msgid "App Settings & Data" +msgstr "Dữ liệu & Cài đặt của Ứng dụng" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-page.c:664 +msgid "_Keep" +msgstr "_Giữ lại" + +#: src/gs-page.c:669 +msgid "Allows restoring app settings and content" +msgstr "Cho phép khôi phục cài đặt và nội dung ứng dụng" + +#. Translators: this is part of section about deleting app's data +#: src/gs-page.c:677 +msgid "_Delete" +msgstr "_Xóa" + +#: src/gs-page.c:682 +msgid "Permanently deletes data to save disk space" +msgstr "Xóa triệt để để tiết kiệm chỗ trên đĩa" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:689 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"Sẽ không thể swr dụng %s sau khi gỡ bỏ. Dữ liệu và cài đặt sẽ được giữ lại " +"trên đĩa, để có thể dùng lại ứng dụng trong tương lai." + +#. TRANSLATORS: this is button text to remove the app +#: src/gs-page.c:703 +msgid "_Uninstall" +msgstr "_Gỡ bỏ cài đặt" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "Tùy thích" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "Các cập nhật phần mềm" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:104 +msgid "More Information" +msgstr "Thông tin thêm" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"Kiểm tra và tải về các cập nhật dùng dữ liệu và năng lượng. Các tính năng " +"cập nhật tự động do đó tạm dừng khi kết nối mạng giới hạn và khi chế độ tiết " +"kiệm điện được bật." + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "_Tự động" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "Tự động kiểm tra và tải xuống các bản cập nhật" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "_Thủ công" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "Kiểm tra và tải xuống các cài đặt thực hiện một cách thủ công" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "Thông _báo khi tự động cập nhật bật" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "Hiện thông báo khi bản cập nhật đã được cài đặt tự động" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "Lọc nội dung" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "Chỉ hiển thị các Phần mềm Tự do" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "Ẩn các phần mềm độc quyền khi duyệt và tìm kiếm" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "Chỉ Hiển thị Những Nhà phát triển Đã Xác Minh" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "Chỉ hiển thị ứng dụng từ những người phát triển đã được xác minh" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"Một số phần mềm hiện được cài đặt không tương thích với %s và sẽ tự động " +"được gỡ bỏ trong quá trình nâng cấp." + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "Phần mềm Không tương thích" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "_Nâng cấp" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:244 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "Phần mềm đã được cài đặt từ “%s” sẽ không còn nhận được bản cập nhật." + +#. ask for confirmation +#: src/gs-repos-dialog.c:248 +msgid "Disable Repository?" +msgstr "Tắt Kho Phần mềm?" + +#: src/gs-repos-dialog.c:248 +msgid "Remove Repository?" +msgstr "Xóa Kho Phần mềm?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:255 +msgid "_Disable" +msgstr "_Tắt" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:259 src/gs-review-row.c:263 +msgid "_Remove" +msgstr "Gỡ _bỏ" + +#: src/gs-repos-dialog.c:611 +msgid "Enable New Repositories" +msgstr "Bật kho phần mềm mới" + +#: src/gs-repos-dialog.c:612 +msgid "Turn on new repositories when they are added" +msgstr "Bật kho phần mềm mới khi chúng được thêm vào." + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:619 +msgid "more information" +msgstr "thêm thông tin" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:624 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "Kho phần mềm bổ sung từ các nguồn bên thứ ba được chọn — %s." + +#: src/gs-repos-dialog.c:629 +msgid "Fedora Third Party Repositories" +msgstr "Kho phần mềm bên thứ ba Fedora" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:783 +msgid "the operating system" +msgstr "hệ điều hành" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:839 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "Các kho này bổ sung phần mềm mặc định được cung cấp bởi %s." + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "Kho Phần mềm" + +#: src/gs-repos-dialog.ui:46 +msgid "No Repositories" +msgstr "Không có kho Phần mềm" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "%u ứng dụng đã cài đặt" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "%u tiện ích đã cài đặt" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u ứng dụng" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u tiện ích" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s và %s đã được cài đặt" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "Đang kiểm tra các phần mềm đã cài đặt…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "Xóa" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:88 +msgid "Hate it" +msgstr "Ghét nó" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:92 +msgid "Don’t like it" +msgstr "Không thích nó" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:96 +msgid "It’s OK" +msgstr "Dùng ổn" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:100 +msgid "Like it" +msgstr "Thích nó" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:104 +msgid "Love it" +msgstr "Yêu nó" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:108 +msgid "Select a Star to Leave a Rating" +msgstr "Chọn sao để đánh giá" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:126 +msgid "Please take more time writing the review" +msgstr "Vui lòng dành thêm thời gian để viết đánh giá" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:129 +msgid "Please choose a star rating" +msgstr "Vui lòng chọn một loại xếp hạng sao" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:132 +msgid "The summary is too short" +msgstr "Tóm tắt quá ngắn" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:135 +msgid "The summary is too long" +msgstr "Tóm tắt quá dài" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:138 +msgid "The description is too short" +msgstr "Mô tả quá ngắn" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:141 +msgid "The description is too long" +msgstr "Mô tả quá dài" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "Viết đánh giá" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "_Gửi" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"Hãy viết một đánh giá: tóm tắt và lời đáng giá. Không nên dùng phần đánh giá " +"để báo cáo lỗi: thay vào đó, hãy liên lạc với người phát triển hoặc người hỗ " +"trợ." + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "Tóm tắt đánh giá" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:108 +msgctxt "app review" +msgid "Write a short review" +msgstr "Viết đánh giá ngắn" + +#: src/gs-review-dialog.ui:150 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"Tìm dữ liệu nào được gửi trong chính sách bảo mật của chúng tôi. Tên đầy đủ đính kèm với tài " +"khoản của bạn sẽ được hiển thị công khai." + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "tổng %u đánh giá" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "trên tổng 5 sao" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "Không rõ" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:224 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "" +"Bạn có thể báo cáo đánh giá về hành vi lăng mạ, thô lỗ, hoặc phân biệt đối " +"xử." + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:229 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "" +"Khi được báo cáo, đánh giá sẽ bị ẩn đến khi được quản trị viên kiểm tra." + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:234 +msgid "Report Review?" +msgstr "Báo Cáo Đánh Giá?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:239 +msgid "_Report" +msgstr "_Báo cáo" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:255 +msgid "Remove Review?" +msgstr "Gỡ bỏ đánh giá?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:258 +msgid "Removing a review cannot be undone." +msgstr "Sẽ không thể hoàn tác việc gỡ bỏ đánh giá." + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "Thích đánh giá này" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "Không thích đánh giá này" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "Báo cáo…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "Xóa bỏ…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "" +"Ứng dụng không được sandbox nhưng bản phân phối đã nó không phải là độc hại" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "" +"Hãy kiểm tra độ tin cậy của vendor, bởi vì ứng dụng này không được sandbox" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "Không quyền hạn" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "Ứng dụng này được sandbox đầy đủ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "Truy cập mạng" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "Có thể truy cập mạng Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "Không truy cập mạng" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "Không thể truy cập mạng Internet" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "Sử dụng dịch vụ hệ thống" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "Có thể yêu cầu dữ liệu từ các dịch vụ hệ thống" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "Dùng dịch vụ phiên làm việc" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "Có thể yêu cầu dữ liệu từ các dịch vụ phiên làm việc" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "Truy cập thiết bị người dùng" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "Truy cập thiết bị như là webcam hay tay chơi game" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "Không truy cập thiết bị người dùng" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "Không truy cập thiết bị như là webcam hay tay chơi game" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "Truy cập thiết bị đầu vào" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access" +msgstr "Truy cập máy ghi âm" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones without asking permission" +msgstr "Có thể nghe từ máy ghi âm mà không hỏi" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "Truy cập thiết bị hệ thống" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "Không thể truy cập các thiết bị hệ thống cái mà yêu cầu quyền cao" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "Truy cập nội dung màn hình" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "Có thể truy cập nội dung của màn hình hay các cửa sổ khác" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "Hệ thống cửa sổ cũ" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "Quyền hạn tự ý" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "Cài đặt người dùng" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "Truy cập đọc ghi hệ thống tập tin đầy đủ" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "Có thể đọc và ghi mọi dữ liệu trên hệ thống tập tin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "Truy cập đọc ghi thư mục riêng" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "Có thể đọc và ghi mọi dữ liệu lên thư mục riêng của bạn" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "Truy cập đọc hệ thống tập tin đầy đủ" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "Có thể đọc mọi dữ liệu trên hệ thống tập tin" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "Truy cập đọc thư mục riêng" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "Có thể đọc và ghi mọi dữ liệu trên thư mục riêng của bạn" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "Truy cập đọc/ghi thư mục Tải về của bạn" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "Có thể đọc và ghi mọi dữ liệu trên thư mục Tải về của bạn" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "Truy cập đọc thư mục Tải về của bạn" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "Có thể đọc mọi dữ liệu trên thư mục tải về của bạn" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "Có thể đọc và ghi mọi dữ liệu lên thư mục" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "Có thể đọc mọi dữ liệu trong thư mục" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "Không truy cập Hệ thống tập tin" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "Không thể truy cập hệ thống tập tin" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "Nhà phát triển ứng dụng đã được xác thực" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "" +"Nhà phát triển phần mềm của ứng dụng này đã được xác thực để có thể nó họ là " +"ai" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "Các phần phụ thuộc không an toàn" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "" +"Phần mềm hoặc các thành phần phục thuộc của nó không còn được hỗ trợ nữa và " +"có thể dẫn đến mất an toàn" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "" +"Ứng dụng không chỉ rõ được phát triển theo giấy phép nào, và có lẽ là độc " +"quyền" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "" +"Phần mềm không chỉ rõ được phát triển theo giấy phép nào, và có lẽ là độc " +"quyền" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "Mã độc quyền" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "" +"Mã nguồn không công khai, do đó nó không thể thực hiện kiểm tra một cách độc " +"lập và có thể thiếu an toàn" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "Ứng dụng này được phát triển dưới giấy phép đặc biệt “%s”." + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "Phần mềm này được phát triển dưới giấy phép đặc biệt “%s”." + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "Mã kiểm định được" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "" +"Mã nguồn công khai và có thể kiểm tra một cách độc lập, việc này làm cho ứng " +"dụng trở nên an toàn hơn" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s yêu cầu đặc quyền" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s an toàn" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s chắc là an toàn" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s có thể không an toàn" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s không an toàn" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "Không rõ" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "An toàn" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "Giấy phép" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:80 +msgid "Source" +msgstr "Mã nguồn" + +#: src/gs-safety-context-dialog.ui:100 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:148 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"Ứng dụng này sử dụng một nền tảng phầm mềm (SDK) đã lạc hậu và có thể chứa " +"lỗi hoặc rủi ro về an ninh mà sẽ không được sửa." + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "Ảnh chụp màn hình kế trước" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "Ảnh chụp màn hình kế tiếp" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "Không ảnh chụp màn hình" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:369 src/gs-screenshot-image.c:426 +#: src/gs-screenshot-image.c:646 +msgid "Screenshot not found" +msgstr "Không tìm thấy ảnh chụp màn hình" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:447 +msgid "Failed to load image" +msgstr "Không thể tải hình ảnh" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:674 +msgid "Screenshot size not found" +msgstr "Không tìm thấy kích cỡ ảnh chụp màn hình" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:763 +msgid "Could not create cache" +msgstr "Không thể tạo bộ nhớ đệm" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not valid" +msgstr "Ảnh chụp màn hình không hợp lệ" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:827 +msgid "Screenshot not available" +msgstr "Ảnh chụp màn hình không khả dụng" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "Ảnh chụp màn hình" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:179 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "Thêm %u nội dung trùng khớp" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "Tìm kiếm trang" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "Tìm kiếm các ứng dụng" + +#: src/gs-search-page.ui:47 +msgid "No App Found" +msgstr "Không tìm thấy ứng dụng nào" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1183 src/gs-shell.c:1188 src/gs-shell.c:1203 +#: src/gs-shell.c:1207 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1261 src/gs-shell.c:1313 +msgid "Unable to download updates" +msgstr "Không thể cập nhật các cập nhật" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1266 +msgid "Unable to download firmware updates" +msgstr "Không thể tải về các cập nhật firmware" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1269 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "Không thể tải về các cập nhật firmware từ %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1274 +#, c-format +msgid "Unable to download updates from %s" +msgstr "Không thể tải về các cập nhật từ %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1281 src/gs-shell.c:1499 +msgid "Unable to update: internet access required" +msgstr "Không thể cập nhật: cần truy cập internet nhưng không có sẵn" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1284 src/gs-shell.c:1502 +msgid "Unable to update: not enough disk space" +msgstr "Không thể cập nhật: không đủ chỗ trống trên ổ đĩa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1289 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "Không thể tải về các cập nhật từ %s: không đủ chỗ trống trên ổ đĩa" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1295 src/gs-shell.c:1513 +msgid "Unable to update: authentication required" +msgstr "Không thể cập nhật: cần có chứng thực" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1299 src/gs-shell.c:1524 +msgid "Unable to update: invalid authentication" +msgstr "Không thể cập nhật: chứng thực không hợp lệ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1303 src/gs-shell.c:1535 +msgid "Unable to update: permission required" +msgstr "Không thể cập nhật: bị từ chối" + +#: src/gs-shell.c:1304 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "Không thể tải về các cập nhật: bạn không có quyền cài đặt phần mềm" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1316 +msgid "Unable to get list of updates" +msgstr "Không thể nhận danh sách các cập nhật" + +#: src/gs-shell.c:1351 +msgid "Unable to install: download failed" +msgstr "Không thể cài đặt: không tải về được" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1357 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "Không thể cài đặt %s: không tải về được từ %s" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1362 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "Không thể cài đặt %s: không tải về được" + +#: src/gs-shell.c:1368 +msgid "Unable to install: missing runtime" +msgstr "Không thể cài đặt: thiếu chạy thực" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1374 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "Không thể cài đặt %s: %s chạy thực không khả dụng" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1377 src/gs-shell.c:1433 src/gs-shell.c:1435 +#, c-format +msgid "Unable to install %s" +msgstr "Không thể cài đặt %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1383 +msgid "Unable to install: internet access required" +msgstr "Không thể cài đặt: yêu cầy truy cập internet " + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1386 +msgid "Unable to install: invalid app format" +msgstr "Không thể cài đặt: ứng dụng có định dạng không hợp lệ" + +#: src/gs-shell.c:1389 +msgid "Unable to install: not enough disk space" +msgstr "Không thể cài đặt: không đủ chỗ trống trên ổ đĩa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1392 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "Không thể cài đặt %s: không đủ chỗ trống trên ổ đĩa" + +#: src/gs-shell.c:1396 +msgid "Unable to install: authentication required" +msgstr "Không thể cài đặt: phải có chứng thực" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1398 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "Không thể cài đặt %s: phải có chứng thực" + +#: src/gs-shell.c:1402 +msgid "Unable to install: invalid authentication" +msgstr "Gặp lỗi khi cài đặt tập tin: quá trình chứng thực thất bại" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1405 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "Không thể cài đặt %s: chứng thực không hợp lệ" + +#: src/gs-shell.c:1409 +msgid "Unable to install: permission required" +msgstr "Không thể cài đặt: yêu cầu sự cho phép" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1412 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "Không thể cài đặt %s: yêu cầu sự cho phép" + +#: src/gs-shell.c:1416 +msgid "Unable to install: device must be plugged in" +msgstr "Không thể cài đặt %s: thiết bị phải được sạc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1419 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "Không thể cài đặt %s: thiết bị phải được sạc" + +#: src/gs-shell.c:1422 +msgid "Unable to install: low battery" +msgstr "Không thể cài đặt: pin yếu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1425 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "Không thể cài đặt %s: pin yếu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1478 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "Không thể cập nhật %s từ %s: không tải về được" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1484 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "Không thể cập nhật %s: không tải về được" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1491 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "Không thể cài đặt cập nhật từ %s: không tải về được" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1495 +msgid "Unable to update: download failed" +msgstr "Không thể cập nhật %s: không tải về được" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1507 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "Không thể cập nhật %s: không đủ chỗ trống trên ổ đĩa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1518 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "Không thể cập nhật %s: cần có chứng thực" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1529 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "Không thể cập nhật %s: chứng thực không hợp lệ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1540 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "Không thể cập nhật %s: cần sự cho phép" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1546 +msgid "Unable to update: device must be plugged in" +msgstr "Không thể cập nhật: thiết bị phải được sạc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1551 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "Không thể cập nhật %s: thiết bị phải được sạc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1556 +msgid "Unable to update: low battery" +msgstr "Không thể cập nhật: pin yếu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1561 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "Không thể cập nhật %s\" pin yếu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to update %s" +msgstr "Không thể cập nhật %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1576 +msgid "Unable to update" +msgstr "Không thể cập nhật" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1613 src/gs-shell.c:1686 +msgid "Unable to upgrade" +msgstr "Không thể nâng cấp" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1617 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "Không thể nâng cấp lên %s từ %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1621 +msgid "Unable to upgrade: download failed" +msgstr "Không thể nâng cấp lên %s: không tải về được" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1624 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "Không thể nâng cấp lên %s: không tải về được" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1630 +msgid "Unable to upgrade: internet access required" +msgstr "Không thể nâng cấp: yêu cầu internet" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1633 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "Không thể nâng cấp lên %s: yêu cầu internet" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1637 +msgid "Unable to upgrade: not enough disk space" +msgstr "Không thể nâng cấp lên: không đủ chỗ trống trên ổ đĩa" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1640 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "Không thể nâng cấp lên %s: không đủ chỗ trống trên ổ đĩa" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1645 +msgid "Unable to upgrade: authentication required" +msgstr "Không thể nâng cấp: cần có chứng thực" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1648 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "Không thể nâng cấp lên %s: cần có chứng thực" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1653 +msgid "Unable to upgrade: invalid authentication" +msgstr "Không thể nâng cấp: chứng thực không hợp lệ" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1656 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "Không thể nâng cấp lên %s: chứng thực không hợp lệ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1661 +msgid "Unable to upgrade: permission required" +msgstr "Không thể nâng cấp: yêu cầu sự cho phép" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1664 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "Không thể nâng cấp lên %s: yêu cầu sự cho phép" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1669 +msgid "Unable to upgrade: device must be plugged in" +msgstr "Không thể nâng cấp: thiết bị phải đang được sạc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1672 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "Không thể nâng cấp lên %s: thiết bị phải đang được sạc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1676 +msgid "Unable to upgrade: low battery" +msgstr "Không thể nâng cấp: pin yếu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1679 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "Không thể nâng cấp lên %s: pin yếu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1689 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "Không thể nâng cấp lên %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1723 +msgid "Unable to uninstall: authentication required" +msgstr "Không thể gỡ cài đặt: phải có chứng thực" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1726 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "Không thể gỡ cài đặt %s: phải có chứng thực" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1731 +msgid "Unable to uninstall: invalid authentication" +msgstr "Không thể gỡ cài đặt: quá trình chứng thực thất bại" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1734 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "Không thể gỡ cài đặt %s: quá trình chứng thực thất bại" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1739 +msgid "Unable to uninstall: permission required" +msgstr "Không thể gỡ cài đặt: yêu cầu sự cho phép" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1742 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "Không thể gỡ cài đặt %s: yêu cầu sự cho phép" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1747 +msgid "Unable to uninstall: device must be plugged in" +msgstr "Không thể gỡ cài đặt: thiết bị phải đang được sạc" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1750 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "Không thể gỡ cài đặt %s: thiết bị phải đang được sạc" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1754 +msgid "Unable to uninstall: low battery" +msgstr "Không thể gỡ cài đặt: pin yếu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1757 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "Không thể gỡ cài đặt %s: pin yếu" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to uninstall %s" +msgstr "Không thể gỡ cài đặt %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1807 +#, c-format +msgid "Unable to launch %s" +msgstr "Không thể khởi chạy %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1812 src/gs-shell.c:1840 src/gs-shell.c:1884 +#: src/gs-shell.c:1928 src/gs-shell.c:1988 +msgid "Sorry, something went wrong" +msgstr "Rấc tiếc, đã có lỗi xảy ra" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1820 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "Không thể khởi chạy %s: %s chưa được cài đặt" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1830 src/gs-shell.c:1874 src/gs-shell.c:1918 +#: src/gs-shell.c:1968 +msgid "Not enough disk space for operation" +msgstr "Không đủ chỗ trống trên ổ đĩa cho hoạt động" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1866 +msgid "Unable to install: file type not supported" +msgstr "Không thể cài đặt: kiểu tập tin không được hỗ trợ" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1870 src/gs-shell.c:1914 +msgid "Unable to install: authentication failed" +msgstr "Không thể cài đặt: chứng thực thất bại" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1910 +msgid "Unable to install" +msgstr "Không thể gỡ cài đặt" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1961 +#, c-format +msgid "Unable to contact %s" +msgstr "Không thể liên hệ %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1972 +msgid "Restart Software to use new plugins" +msgstr "Khởi động lại Phần mềm để sử dụng các trình cắm mới" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1976 +msgid "Device needs to be plugged in" +msgstr "Thiết bị phải được gắn kết" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1979 +msgid "Battery level is too low" +msgstr "Pin quá yếu" + +#. TRANSLATORS: this is the menu item that opens the about window +#: src/gs-shell.c:2154 +msgid "About Software" +msgstr "Giới thiệu Phần mềm" + +#: src/gs-shell.ui:7 +msgid "_Software Repositories" +msgstr "_Kho Phần mềm" + +#: src/gs-shell.ui:12 +msgid "_Keyboard Shortcuts" +msgstr "_Phím tắt bàn phím" + +#: src/gs-shell.ui:16 +msgid "_Preferences" +msgstr "_Tuỳ thích" + +#: src/gs-shell.ui:134 src/gs-shell.ui:136 +msgid "Search" +msgstr "Tìm kiếm" + +#: src/gs-shell.ui:150 src/gs-shell.ui:152 +msgid "Main Menu" +msgstr "Trình đơn chính" + +#: src/gs-shell.ui:179 +msgid "Search apps" +msgstr "Tìm kiếm các ứng dụng" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:203 +msgid "_Explore" +msgstr "_Khám phá" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:217 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "Đã cà_i đặt" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:239 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "_Bản cập nhật" + +#: src/gs-shell.ui:275 src/gs-shell.ui:346 +msgid "Go back" +msgstr "Trở lại" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "Không" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "Dữ liệu Ứng dụng" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "Dữ liệu cần thiết cho ứng dụng chạy được" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "Dữ liệu người dùng" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "Dữ liệu được tạo bởi bạn bằng ứng dụng" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "Dữ liệu nhớ đệm" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "Dữ liệu nhớ đệm tạm thời" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "Bản thân ứng dụng" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "Các phần phụ thuộc yêu cầu" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "Các thành phần hệ thống chia sẽ được yêu cầu bởi ứng dụng này" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "Không rõ" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "" +"Dữ liệu đệm có thể được xóa đi ở _các cài đặt ứng dụng." + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "Lưu trữ" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s (Đã cài đặt)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s (Đang cài đặt)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s (Đang tải về)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s (Đang gỡ bỏ)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "Chi tiết" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "Kiểm nghiệm" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:109 +#, c-format +msgid "Installed on %s" +msgstr "Đã cài đặt vào %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:131 +msgid "Installed Updates" +msgstr "Bản Cập nhật Đã Cài đặt" + +#: src/gs-update-dialog.ui:66 +msgid "No Updates Installed" +msgstr "Không Cài đặt Cập nhật nào" + +#: src/gs-update-monitor.c:215 +msgid "Updates Are Out of Date" +msgstr "Các cập nhật phần mềm đã quá cũ" + +#: src/gs-update-monitor.c:216 +msgid "Please check for available updates" +msgstr "Vui lòng kiểm tra cập nhật phần mềm" + +#: src/gs-update-monitor.c:222 +msgid "Critical Updates Ready to Install" +msgstr "Các Bản cập nhật Phần mềm Quan Trọng đã sẵn sàng để cài đặt" + +#: src/gs-update-monitor.c:223 +msgid "Install critical updates as soon as possible" +msgstr "Hãy cài đặt các bản cập nhật quan trọng sớm nhất có thể" + +#: src/gs-update-monitor.c:226 +msgid "Critical Updates Available to Download" +msgstr "Đã có các Bản cập nhật Phần mềm Quan trọng để tải về" + +#: src/gs-update-monitor.c:227 +msgid "Download critical updates as soon as possible" +msgstr "Hãy tải về các bản cập nhật quan trọng sớm nhất có thể" + +#: src/gs-update-monitor.c:233 +msgid "Updates Ready to Install" +msgstr "Các Bản cập nhật Phần mềm đã sẵn sàng để cài đặt" + +#: src/gs-update-monitor.c:234 +msgid "Software updates are ready and waiting" +msgstr "Đã có các bản cập nhật đang đợi và sẵn để được cài đặt" + +#: src/gs-update-monitor.c:240 +msgid "Updates Available to Download" +msgstr "Đã có các Bản cập nhật Phần mềm để tải về" + +#: src/gs-update-monitor.c:241 +msgid "Software updates can be downloaded" +msgstr "Cập nhật phần mềm có thể được tải về" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:357 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u Ứng dụng đã cập nhật — Yêu cầu khởi động lại" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u Ứng dụng đã cập nhật" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:374 +#, c-format +msgid "%s has been updated." +msgstr "%s đã được cập nhật." + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:377 +msgid "Please restart the app." +msgstr "Vui lòng khởi động lại ứng dụng." + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:385 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s và %s vừa mới được cập nhật." + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:391 src/gs-update-monitor.c:410 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u ứng dụng cần được khởi động lại." + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:403 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "Bao gồm %s, %s và %s." + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:703 +msgid "System Has Reached End of Life" +msgstr "Hệ thống Không Còn Được Hỗ trợ" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:705 +msgid "Upgrade to continue receiving updates" +msgstr "Hãy nâng cấp để tiếp tục nhận các cập nhật bảo mật" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:760 +#, c-format +msgid "A new version of %s is available to install" +msgstr "Đã có một phiên bản mới của %s để cài đặt" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:764 +msgid "Software Upgrade Available" +msgstr "Có Bản Cập Nhật Phần Mềm" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1211 +msgid "Software Updates Failed" +msgstr "Không Thể Cập Nhật Ứng Dụng" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1213 +msgid "Prepared updates were not installed" +msgstr "Các bản cập nhật chưa được cài đặt" + +#: src/gs-update-monitor.c:1214 +msgid "Show Details" +msgstr "Hiển thị chi tiết" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1259 +msgid "System Upgrade Complete" +msgstr "Nâng cấp Hệ thống Hoàn tất" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1264 +#, c-format +msgid "Welcome to %s %s!" +msgstr "Chào mừng đến với %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1273 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "Đã cài đặt các Bản cập nhật Phần mềm" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1277 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "Các bản cập nhật hệ điều hành quan trọng đã được cài đặt." + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1288 +msgctxt "updates" +msgid "Review" +msgstr "Đánh giá" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1341 +msgid "Failed To Update" +msgstr "Cập nhật gặp lỗi" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1346 +msgid "The system was already up to date." +msgstr "Hệ thống này đã được cập nhật." + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1351 +msgid "The update was cancelled." +msgstr "Bản cập nhật đã bị hủy bỏ." + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1356 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "" +"Cần truy cập Internet nhưng lại không có sẵn. Vui lòng đảm bảo rằng bạn có " +"truy cập internet và thử lại." + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1361 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "" +"Có vấn đề về an ninh với bản cập nhật. Vui lòng tham vấn nhà cung cấp phần " +"mềm của bạn để biết thêm chi tiết." + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1366 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "Đĩa không đủ chỗ trống. Vui lòng xóa bớt dữ liệu và thử lại." + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1370 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"Chúng tôi rất tiếc: không cài đặt được bản cập nhật này. Vui lòng đợi bản " +"cập nhật khác và thử lại. Nếu vấn đề còn tiếp diễn, hãy liên hệ với nhà cung " +"cấp phần mềm của bạn." + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:256 +#, c-format +msgid "Last checked: %s" +msgstr "Lần cuối kiểm tra: %s" + +#: src/gs-updates-page.c:313 +msgid "Stop" +msgstr "Dừng" + +#: src/gs-updates-page.c:322 src/gs-updates-page.c:334 +msgid "Check for Updates" +msgstr "Kiểm tra cập nhật" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s đã dừng nhận các cập nhật quan trọng" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "" +"Hệ điều hành của bạn không còn được nhận được các cập nhật quan trọng nữa" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "Có thể mất chi phí" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "" +"Việc kiểm tra cập nhật thông qua mạng di động có thể phát sinh thêm chi phí." + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "_Vẫn cứ xem" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "Các bản cập nhật đã được tải về" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "Các bản cập nhật sẵn sàng để được cài đặt" + +#: src/gs-updates-page.c:1220 +msgid "Check for updates" +msgstr "Kiểm tra cập nhật" + +#: src/gs-updates-page.c:1256 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "Các cập nhật" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "Trang cập nhật" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:59 +msgid "Loading Updates" +msgstr "Đang tải các cập nhật" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:72 +msgid "This could take a while" +msgstr "Việc này có thể mất một lúc" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:192 +msgid "Up to Date" +msgstr "Đã cập nhật" + +#: src/gs-updates-page.ui:231 +msgid "Use Mobile Data?" +msgstr "Sử dụng dữ liệu từ mạng di động?" + +#: src/gs-updates-page.ui:232 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "" +"Việc kiểm tra cập nhật thông qua mạng di động có thể phát sinh thêm chi phí." + +#: src/gs-updates-page.ui:235 +msgid "_Check Anyway" +msgstr "_Cứ Kiểm tra" + +#: src/gs-updates-page.ui:254 +msgid "No Connection" +msgstr "Không có kết nối" + +#: src/gs-updates-page.ui:255 +msgid "Go online to check for updates" +msgstr "Kết nối mạng để kiểm tra cập nhật" + +#: src/gs-updates-page.ui:258 +msgid "_Network Settings" +msgstr "Cài đặt mạ_ng" + +#: src/gs-updates-page.ui:278 src/gs-updates-page.ui:292 +msgid "Error" +msgstr "Lỗi" + +#: src/gs-updates-page.ui:293 +msgid "Updates are automatically managed" +msgstr "Các cập nhật được quản lý tự động" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "Đã Tạm dừng Cập nhật" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "Tự động cập nhật đã tạm dừng vì các lý do sau:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• Kết nối hiện tại có đo dung lượng" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• Kết nối hiện tại không cho phép tải dung lượng lớn" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• Đang bật tiết kiệm pin" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• Đang bật chế độ game" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "Đã tạm dừng cập nhật" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "Kết nối đang được đo lường — đã tạm dừng cập nhật" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "Kết nối không cho phép tải dung lượng lớn — đã tạm dừng cập nhật" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "Đang bật tiết kiệm pin — đã tạm dừng cập nhật" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "Đang bật chế độ game — đã tạm dừng cập nhật" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "_Khởi động lại & Cập nhật…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "Cập nhật Tất cả" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "Cập nhật phần mềm đã được tải về" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "Các bản cập nhật sẵn sàng để cài đặt" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "Firmware Tích hợp" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "Cần phải Khởi động lại" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "Các cập nhật ứng dụng" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "Phần dẻo Thiết bị" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "_Tải xuống" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s Đã sẵn sàng" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s Sẵn có" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "Tìm hiểu về phiên bản mới" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "Đã tải về %s trên %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "Đã tải về %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "Bản nâng cấp lớn với nhiều tính năng mới và trải nghiệm tốt hơn." + +#: src/gs-upgrade-banner.ui:188 +msgid "_Restart & Upgrade…" +msgstr "_Khởi động lại & Nâng cấp…" + +#: src/gs-upgrade-banner.ui:216 +msgid "Remember to back up data and files before upgrading." +msgstr "Nên lưu dữ liệu trước khi nâng cấp lên phiên bản mới hơn." + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "Gặp lỗi khi xóa bỏ tập tin “%s”: %s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "gặp lỗi khi xóa thư mục “%s”: %s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "Cài đặt, gỡ bỏ hoặc cập nhật phần mềm trên máy tính này" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;Bản " +"cập nhật;Nâng cấp;Mã nguồn;Kho chứa;Ưu tiên;Cài đặt;Gỡ bỏ;Chương trình;Phần " +"mềm;Ứng dụng;Cửa hàng;Cap nhat;Ung dung;Phan mem;Go bo;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s Sẵn sàng" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s sãn sàng và sẽ được thực hiện trong lần khởi động tiếp theo." + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "Bật" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "Cập nhật Hệ thống" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "" +"Các cập nhật hệ thống chung, như là bảo mật hoặc sửa lỗi, và các cải tiến " +"nâng cao hiệu suất." + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s cập nhật với các tính năng và bản sửa lỗi mới." + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "Dịch vụ cập nhật EOS không thể lấy và áp dụng bản cập nhật." + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "Ứng dụng Web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "Hỗ trợ Ứng dụng Web" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "Chạy các ứng dụng web phổ biến trên một trình duyệt" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "" +"Nâng cấp hệ thống để cải thiện tính năng mới nhất, hiệu suất và sự ổn định." + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Hỗ trợ Flatpak" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "" +"Flatpak là một chương trình khung cho các ứng dụng máy tính chạy trên Linux" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:342 +#, c-format +msgid "System folder %s" +msgstr "Thư mục hệ thống %s" + +#: plugins/flatpak/gs-flatpak.c:343 plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "Home subfolder %s" +msgstr "Thư mục con của thư mục riêng %s" + +#: plugins/flatpak/gs-flatpak.c:345 +msgid "Host system folders" +msgstr "Thư mục hệ thống chủ" + +#: plugins/flatpak/gs-flatpak.c:346 +msgid "Host system configuration from /etc" +msgstr "Cấu hình hệ thống chủ từ /etc" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Desktop folder" +msgstr "Thư mục nền" + +#: plugins/flatpak/gs-flatpak.c:347 +#, c-format +msgid "Desktop subfolder %s" +msgstr "Thư mục con thư mục màn hình nền %s" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Documents folder" +msgstr "Thư mục chứa tài liệu" + +#: plugins/flatpak/gs-flatpak.c:348 +#, c-format +msgid "Documents subfolder %s" +msgstr "Thư mục con của thư mục chứa tài liệu %s" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Music folder" +msgstr "Thư mục nhạc" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Music subfolder %s" +msgstr "Thư mục con âm nhạc %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Pictures folder" +msgstr "Thư mục ảnh" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Pictures subfolder %s" +msgstr "Thư mục chứa Ảnh %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Public Share folder" +msgstr "Thư mục chia sẻ công khai" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Public Share subfolder %s" +msgstr "Thư mục con chia sẻ công khai %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Videos folder" +msgstr "Thư mục chứa phim" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Videos subfolder %s" +msgstr "Thư mục con chứa phim %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Templates folder" +msgstr "Thư mục chứa mẫu" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Templates subfolder %s" +msgstr "Thư mục con chứa mẫu %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "User cache folder" +msgstr "Thư mục dữ liệu đệm người dùng" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "User cache subfolder %s" +msgstr "Thư mục con chứa bộ nhớ đệm người dùng %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "User configuration folder" +msgstr "Thư mục cấu hình người dùng" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "User configuration subfolder %s" +msgstr "Thư mục con của thư mục cấu hình người dùng %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User data folder" +msgstr "Thư mục dữ liệu người dùng" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User data subfolder %s" +msgstr "Thư mục con chứa dữ liệu người dùng %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User runtime folder" +msgstr "Thư mục chạy người dùng" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User runtime subfolder %s" +msgstr "Thư mục con chứa phần chạy của người dùng %s" + +#: plugins/flatpak/gs-flatpak.c:415 +#, c-format +msgid "Filesystem access to %s" +msgstr "Truy cập hệ thống tập tin đến %s" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1374 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "Đang tải siêu dữ liệu flatpak cho %s…" + +#: plugins/flatpak/gs-flatpak.c:3590 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "Gặp lỗi khi tinh lọc phần bổ sung ‘%s’: %s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "Cài đặt người dùng" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "Cài đặt hệ thống" + +#: plugins/flatpak/gs-flatpak-utils.c:271 +msgid "App ID" +msgstr "ID Ứng dụng" + +#: plugins/flatpak/gs-plugin-flatpak.c:1353 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "Gặp lỗi khi thêm để cài đặt cho phần bổ sung ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1367 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "Gặp lỗi khi thêm để gỡ bỏ cho phần bổ sung ‘%s’: %s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1956 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"Máy chủ “%s” không cho phép cài đặt “%s”, có thể là do bộ lọc của nó. Hãy gỡ " +"bỏ bộ lọc và thử lại. Chi tiết lỗi: %s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:66 +msgid "System power is too low to perform the update" +msgstr "Nguồn điện hệ thống quá thấp để cập nhật" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "Nguồn điện hệ thống quá thấp để cập nhật (%u%%, cần %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:76 +msgid "Device is unreachable, or out of wireless range" +msgstr "Thiết bị không tiếp cận được, hoặc nằm ngoài vùng phủ sóng" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:82 +#, c-format +msgid "Device battery power is too low" +msgstr "Pin thiết bị quá yếu" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:85 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "Nguồn pin của thiết bị quá thấp (%u%%, cần %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:91 +msgid "Device is waiting for the update to be applied" +msgstr "Thiết bị này đang đợi cho cập nhật được áp dụng" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device requires AC power to be connected" +msgstr "Thiết bị yêu cầu được cắm nguồn điện lưới" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device cannot be used while the lid is closed" +msgstr "Không thể sử dụng thiết bị trong khi lid bị đóng" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:208 +#, c-format +msgid "%s Device Update" +msgstr "%s Cập nhật thiết bị" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:213 +#, c-format +msgid "%s System Update" +msgstr "%s Cập nhật Hệ thống" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:218 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s Cập nhật bộ điều khiển nhúng" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:223 +#, c-format +msgid "%s ME Update" +msgstr "%s Cập nhật ME" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:228 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s Cập nhật ME doanh nghiệp" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:233 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s Cập nhật ME người tiêu dùng" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:239 +#, c-format +msgid "%s Controller Update" +msgstr "%s Cập nhật điều khiển" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:245 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s Cập nhật điều khiển Thunderbolt" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:250 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s Cập nhật vi mã CPU" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:255 +#, c-format +msgid "%s Configuration Update" +msgstr "%s Cập nhật cấu hình" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Battery Update" +msgstr "%s Cập nhật Pin" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:264 +#, c-format +msgid "%s Camera Update" +msgstr "%s Cập nhật Camera" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s TPM Update" +msgstr "%s Cập nhật TPM" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s Cập nhật Touchpad" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Mouse Update" +msgstr "%s Cập nhật con chuột" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s Cập nhật Bàn phím" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s Cập nhật điều khiển thiết bị lưu trữ" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:289 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s Cập nhật điều khiển mạng" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:294 +#, c-format +msgid "%s Display Update" +msgstr "%s Cập nhật hiển thị" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:299 +#, c-format +msgid "%s BMC Update" +msgstr "%s Cập nhật BMC" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:304 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s Cập nhật thiết bị nhận qua USB" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s Drive Update" +msgstr "%s Cập nhật Đĩa" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s Cập nhật Đĩa Flash" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:317 +#, c-format +msgid "%s SSD Update" +msgstr "%s Cập nhật SSD" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:322 +#, c-format +msgid "%s GPU Update" +msgstr "%s Cập nhật GPU" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:327 +#, c-format +msgid "%s Dock Update" +msgstr "%s Cập nhật Dock" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:332 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s Cập nhật Dock USB" + +#: plugins/fwupd/gs-plugin-fwupd.c:914 +msgid "Firmware" +msgstr "Firmware" + +#: plugins/fwupd/gs-plugin-fwupd.c:1938 +msgid "Firmware update could not be applied: " +msgstr "Nâng cấp firmware không được áp dụng: " + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "Hỗ trợ Nâng cấp Firmware" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "Cung cấp hỗ trợ cho các bản nâng cấp phần dẻo" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "Cài đặt phần mềm chưa ký?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"Phần mềm cái mà được cài đặt chưa được ký. Sẽ không thể xác minh nguồn gốc " +"của các bản cập nhật cho phần mềm này hoặc liệu các bản cập nhật có bị giả " +"mạo hay không." + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "Tải về phần mềm chưa ký?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"Các bản cập nhật chưa được ký sẵn có. Nếu không có chữ ký, không thể xác " +"minh nguồn gốc của bản cập nhật hoặc liệu bản cập nhật có bị giả mạo hay " +"không." + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "Cập nhật phần mềm chưa ký?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"Các bản cập nhật chưa được ký có sẵn. Nếu không có chữ ký, không thể xác " +"minh nguồn gốc của bản cập nhật hoặc liệu bản cập nhật có bị giả mạo hay " +"không. Các bản cập nhật phần mềm sẽ bị vô hiệu hóa cho đến khi các bản cập " +"nhật chưa được ký được gỡ bỏ hoặc cập nhật." + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "Gặp lỗi khi cài đặt bản cập nhật: " + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "Gói phần mềm" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "Không thể đợi kết thúc giao dịch trước khi tải về:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "Không thể tải xuống bản cập nhật:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "Gặp lỗi khi kích hoạt cập nhật:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "Hệ điều hành (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Kho Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Hỗ trợ Snap" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "" +"Snap (tệp ứng dụng chạy độc lập) là một gói ứng dụng dùng được trên nhiều " +"bản Linux khác nhau" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "Một cách hay để quản lý phần mềm trên hệ thống của bạn." + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "Vui lòng nhập một số từ 1 đến %u: " + +#~ msgid "Choose an app:" +#~ msgstr "Chọn một ứng dụng:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s giờ đã được cài đặt" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "Ứng dụng vừa bị gỡ bỏ" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "Không tìm thấy “%s”" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "Đang tải danh sách thể loại phần mềm" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "Tự động cập nhật bị tạm dừng" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "Mạng hiện thời được đo lưu lượng vì thế nó có lưu lượng giới hạn hoặc các " +#~ "tính phí theo lượng dữ liệu tiêu dùng. Để tiết kiệm, các bản cập nhật tự " +#~ "động bị tạm dừng.\n" +#~ "\n" +#~ "Nếu mạng hiện tại không phải là mạng đo lưu lượng, thì thay đổi nó trong " +#~ "Cài đặt." + +#~ msgid "Open Network _Settings" +#~ msgstr "Mở _Cài đặt Mạng" + +#~ msgid "Moderate page" +#~ msgstr "Trang kiểm soát" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "Không có đánh giá nào để kiểm soát" + +#~ msgid "Explore Pages" +#~ msgstr "Trang duyệt" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "Bạn đã thích gì ứng dụng này? Để lại phản hồi và lý do sẽ giúp ích cho " +#~ "những người khác." + +#~ msgid "Was this review useful to you?" +#~ msgstr "Đánh giá này có hữu ích đối với bạn không?" + +#~ msgid "Yes" +#~ msgstr "Có" + +#~ msgid "No" +#~ msgstr "Không" + +#~ msgid "Meh" +#~ msgstr "Thờ ơ" + +#~ msgid "Outdated SDK version" +#~ msgstr "Phiên bản SDK đã lỗi thời" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "" +#~ "Không thể tải về các bản cập nhật: cần truy cập internet mà không có sẵn" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "Không thể tải về các cập nhật: không đủ chỗ trống trên ổ đĩa" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "Không thể tải về các cập nhật: phải có chứng thực" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "Không thể tải về các bản cập nhật: xác thực không hợp lệ" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "Không thể cài đặt %s: bạn không có quyền cài đặt phần mềm" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "Không thể cài đặt %s: Pin quá yếu" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "Không thể cài đặt cập nhật: không đủ chỗ trống trên đĩa" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "Không thể cài đặt cập nhật: phải có chứng thực" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "Không thể cài đặt cập nhật: chứng thực không hợp lệ" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "Không thể cập nhật %s: bạn không được phép cập nhật phần mềm" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "Không thể cập nhật nâng cấp: bạn không được phép cập nhật phần mềm" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "Không thể cài đặt các cập nhật: Cần phải cắm máy vào điện lưới" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "Không thể cài đặt cập nhật %s: Pin quá yếu" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "Không thể cài đặt các cập nhật: Pin quá yếu" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "Không thể nâng cấp lên %s: cần truy cập internet nhưng không có sẵn" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "Không thể nâng cấp lên %s: bạn không có quyền nâng cấp" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "Không thể nâng cấp lên %s: Pin quá yếu" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "Không thể gỡ bỏ %s: cần có chứng thực" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "Không thể gỡ bỏ %s: chứng thực không hợp lệ" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "Không thể xóa bỏ %s: bạn không được phép xóa bỏ phần mềm" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "Không thể di chuyển %s: cần phải cắm máy vào điện lưới" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "Không thể gỡ bỏ %s: Pin quá yếu" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "Không thể gỡ bỏ %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "Gặp lỗi khi cài đặt tập tin: không được hỗ trợ" + +#~ msgid "Failed to install: not supported" +#~ msgstr "Gặp lỗi khi cài đặt: không được hỗ trợ" + +#~ msgid "AC power is required" +#~ msgstr "Cần phải cắm máy vào điện lưới" + +#~ msgid "Network Settings" +#~ msgstr "Cài đặt Mạng" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "Mạng hạn chế lưu lượng - Tự động cập nhật bị tạm dừng" + +#~ msgid "Find Out _More" +#~ msgstr "Tì_m thêm nữa" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "Sẵn có một bản cập nhật phần mềm quan trọng để cài đặt." + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "Quan trọng: các cập nhật phần mềm nguy cấp đang còn đợi." + +#~ msgid "Please download waiting software updates." +#~ msgstr "Vui lòng tải xuống các cập nhật còn đang đợi." + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "Cập nhật Hệ điều hành Không Khả dụng" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "Gặp lỗi khi cài đặt một bản cập nhật hệ điều hành quan trọng." + +#~ msgid "No Network" +#~ msgstr "Không có Mạng" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "Cần truy cập Internet để tìm xem các bản cập nhật." + +#~ msgid "Network _Settings" +#~ msgstr "_Cài đặt Mạng" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "Đã có các bản cập nhật đã được tải về và sẵn sàng để cài đặt." + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "Đã có các bản cập nhật đã được tải về và sẵn sàng để được cài đặt." + +#~ msgid "Downloading upgrade information…" +#~ msgstr "Đang tải xuống thông tin nâng cấp…" + +#, fuzzy +#~| msgid "No update description available." +#~ msgid "Loading update description, please wait…" +#~ msgstr "Không có mô tả cập nhật." + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "Để tránh các thay đổi và lưu lượng mạng, các cập nhật sẽ không tự động " +#~ "được tải về trên thiết bị di dộng hay các kết nối trả phí theo lưu lượng." + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "" +#~ "Tải và cài đặt các bản cập nhật phần mềm trong nền hệ thống khi có thể" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "Chỉ hiển thị ứng dụng tự _do" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "" +#~ "Chỉ hiển thị các ứng dụng với giấy phép tự do và ẩn các ứng dụng độc quyền" + +#~ msgid "Show verbose debugging information" +#~ msgstr "Hiển thị thông tin gỡ rối chi tiết" + +#~ msgid "Can access arbitrary files" +#~ msgstr "Không thể truy cập các tập tin tùy ý" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "Bạn có chắc là bạn muốn cài đặt %s?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "" +#~ "%s sẽ được gỡ bỏ, và bạn sẽ phải cài đặt lại nếu lại muốn sử dụng nó." + +#~ msgid "Downloading featured images…" +#~ msgstr "Đang tải hình ảnh đặc sắc…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "" +#~ "Dấu vết thời gian cuối cùng khi hệ thống trực tuyến và nhận bất kỳ bản " +#~ "cập nhật nào" + +#~ msgid "Selected add-ons will be installed with the app." +#~ msgstr "Các tiện tích bổ sung được chọn sẽ được cài đặt cùng với ứng dụng." + +#~ msgid "Application manager for GNOME" +#~ msgstr "Quản lý ứng dụng dành cho GNOME" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "" +#~ "Phần mềm này không sẵn có bằng ngôn ngữ của bạn và sẽ hiển thị bằng tiếng " +#~ "Anh Mỹ." + +#~ msgid "Applications" +#~ msgstr "Ứng dụng" + +#~ msgid "Web Applications" +#~ msgstr "Ứng dụng Web" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "Ca-ta-lô phần mềm đang được tải xuống" + +#~ msgid "Name" +#~ msgstr "Tên" + +#~ msgid "system" +#~ msgstr "hệ thống" + +#~ msgid "user" +#~ msgstr "người dùng" + +#~ msgid "Channel" +#~ msgstr "Kênh" + +#~ msgid "Branch" +#~ msgstr "Nhánh" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "Cài đặt" + +#~ msgid "Version" +#~ msgstr "Phiên bản" + +#~ msgid "_Continue" +#~ msgstr "_Tiếp tục" + +#~ msgid "Post Review" +#~ msgstr "Đăng đánh giá" + +#~ msgid "_Post" +#~ msgstr "Đăn_g" + +#~ msgid "Rating" +#~ msgstr "Đánh giá" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "" +#~ "Viết một câu tóm tắt ngắn về đánh giá của bạn, ví dụ: \"Ứng dụng tuyệt " +#~ "vời, sẽ giới thiệu mọi người dùng nó\"." + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "Đánh giá" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "" +#~ "Bạn nghĩ gì về ứng dụng này? Hãy cố đưa ra các lý do cho nhận xét của bạn." + +#~ msgid "No screenshot provided" +#~ msgstr "Không có ảnh màn hình nào được cung cấp" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "Khởi động lại ngay" + +#~ msgid "Primary Menu" +#~ msgstr "Trình đơn chính" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "Các cập nhật" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "Chưa có cập nhật nào được cài đặt trên hệ thống này." + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s không còn được hỗ trợ." + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "Điều này có nghĩa là nó không còn nhận được những cập nhật bảo mật." + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "Bạn nên nâng cấp lên phiên bản mới hơn." + +#~ msgid "Update All" +#~ msgstr "Cập nhật Tất cả" + +#~ msgid "Application Updates" +#~ msgstr "Các bản cập nhật Ứng dụng" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME Web" + +#~ msgid "Access arbitrary files" +#~ msgstr "Truy cập các tập tin tùy ý" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "Có thể truy cập các tập tin tùy ý trên hệ thống tập tin" + +#~ msgid "A list of popular applications" +#~ msgstr "Một danh sách các ứng dụng phổ biến" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "" +#~ "Một danh sách các ứng dụng để sử dụng, đè lên những ứng dụng được hệ " +#~ "thống định nghĩa." + +#~ msgid "Checking…" +#~ msgstr "Đang kiểm tra…" + +#~ msgid "Endless OS" +#~ msgstr "HĐH Endless" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "URI cái mà tham chiếu nền cho biểu ngữ nâng cấp." + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "" +#~ "URI có thể chứa tối đa ba '%u', sẽ được thay thế bằng phiên bản nâng cấp." + +#~ msgid "Loading…" +#~ msgstr "Đang tải…" + +#~ msgid "_Add shortcut" +#~ msgstr "_Thêm phím tắt" + +#~ msgid "Re_move shortcut" +#~ msgstr "_Xóa lối tắt" + +#~ msgid "Welcome" +#~ msgstr "Chào mừng" + +#~ msgid "Welcome to Software" +#~ msgstr "Chào mừng bạn dùng Phần mềm" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "Phần mềm cho phép bạn cài đặt mọi phần mềm bạn cần chỉ từ một nơi. Hãy " +#~ "xem đề xuất của chúng tôi, duyệt các danh mục hoặc tìm kiếm các ứng dụng " +#~ "mà bạn muốn." + +#~ msgid "_Browse Software" +#~ msgstr "_Duyệt phần mềm" + +#~ msgid "Downloading application ratings…" +#~ msgstr "Đang tải xếp hạng ứng dụng…" + +#~ msgid "OS Updates" +#~ msgstr "Cập nhật Hệ điều hành" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "Bao gồm cải thiện về hiệu suất, tính ổn định và bảo mật." + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "Đang tải chữ ký cập nhật firmware…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "Đang tải siêu dữ liệu cập nhật firmware…" + +#~ msgid "Software has unknown permissions" +#~ msgstr "Phần mềm có quyền chưa biết" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "Phần mềm đến từ nguồn đáng tin cậy" + +#~ msgid "Unknown Permissions" +#~ msgstr "Quyền hạn chưa biết" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "Các quyền cần thiết bởi ứng dụng này chưa được biết" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "Hiển thị lời nhắc cài đặt các nguồn phần mềm không tự do" + +#~ msgid "Select All" +#~ msgstr "Chọn tất cả" + +#~ msgid "Select None" +#~ msgstr "Chọn Không có" + +#, c-format +#~ msgid "Featured %s" +#~ msgstr "Nổi bật %s" + +#~ msgid "Show" +#~ msgstr "Hiện" + +#~ msgid "Subcategories filter menu" +#~ msgstr "Trình đơn bộ lọc thể loại con" + +#~ msgid "Sort" +#~ msgstr "Sắp xếp" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "Trình đơn sắp xếp phân loại con" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "Tất cả" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "Nổi bật" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "Tất cả" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "Nổi bật" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "Tất cả" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "Nổi bật" + +#~ msgid "Audio & Video" +#~ msgstr "Phim & Nhạc" + +#~ msgid "Developer Tools" +#~ msgstr "Công cụ dành cho nhà phát triển" + +#~ msgid "Education & Science" +#~ msgstr "Giáo dục & Khoa học" + +#~ msgid "Games" +#~ msgstr "Trò chơi" + +#~ msgid "Graphics & Photography" +#~ msgstr "Đồ họa & Nhiếp ảnh" + +#~ msgid "Productivity" +#~ msgstr "Năng suất" + +#~ msgid "Communication & News" +#~ msgstr "Cộng đồng & Tin tức" + +#~ msgid "Utilities" +#~ msgstr "Các tiện ích" + +#~ msgid "_Read More" +#~ msgstr "_Tìm hiểu thêm" + +#~ msgid "_Read Less" +#~ msgstr "Đọc ít _hơn" + +#~ msgid "_Launch" +#~ msgstr "_Khởi chạy" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "Không thể xác định phần nào của hệ thống mà ứng dụng này truy nhập. Điều " +#~ "này là điển hình cho các ứng dụng cũ." + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "Chưa bao giờ" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "Thấp" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "Trung bình" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "Cao" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "Không rõ" + +#~ msgid "Public domain" +#~ msgstr "Phạm vi công cộng" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://en.wikipedia.org/wiki/Public_domain" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "Người dùng bị ràng buộc trong các quyền sử dụng sau đây:" + +#~ msgid "Localized in your Language" +#~ msgstr "Được địa phương hóa theo Ngôn ngữ của bạn" + +#~ msgid "Release Activity" +#~ msgstr "Phát hành tích cực" + +#~ msgid "Sandboxed" +#~ msgstr "Đã bảo vệ bằng sandbox" + +#~ msgid "Category" +#~ msgstr "Danh mục" + +#~ msgid "Free" +#~ msgstr "Miễn phí" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "Không rõ" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "" +#~ "Điều này có nghĩa là phần mềm có thể được chạy, sao chép, phân phối, " +#~ "nghiên cứu và chỉnh sửa miễn phí." + +#~ msgid "Proprietary Software" +#~ msgstr "Phần mềm Sở hữu độc quyền" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "Điều này có nghĩa là phần mềm này được sở hữu bởi một cá nhân hoặc một " +#~ "công ty. Thông thường, việc sử dụng phần mềm này sẽ bị giới hạn và thường " +#~ "không thể truy cập được mã nguồn của nó." + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "Các điều khoản cấp phép cho phần mềm này còn khuyết." + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "Ứng dụng được đánh giá như thế này vì nó có các tính năng:" + +#~ msgid "No details were available for this rating." +#~ msgstr "Không có thông tin chi tiết nào khả dụng cho đánh giá này." + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "Đã gỡ bỏ" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "Đã cài đặt" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "Đã cập nhật" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "Không xác định" + +#~ msgid "History" +#~ msgstr "Lịch sử" + +#~ msgid "More…" +#~ msgstr "Thêm…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "Ứng dụng Âm nhạc & Phim được đề xuất" + +#~ msgid "Recommended Games" +#~ msgstr "Trò chơi được Đề xuất" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "Ứng dụng Đồ họa được Đề xuất" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "Ứng dụng về Sản xuất Khuyên dùng" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "Một số phần mềm này là độc quyền và do đó có những hạn chế về việc sử " +#~ "dụng, chia sẻ và truy cập vào mã nguồn." + +#~ msgid "Find out more…" +#~ msgstr "Tìm hiểu thêm…" + +#~ msgid "Editor’s Picks" +#~ msgstr "Lựa chọn của Biên tập viên" + +#~ msgid "Recent Releases" +#~ msgstr "Bản phát hành gần đây" + +#, c-format +#~ msgid "Remove “%s”?" +#~ msgstr "Xóa bỏ “%s”?" + +#, c-format +#~ msgid "Disable “%s”?" +#~ msgstr "Tắt “%s”?" + +#~ msgid "No Additional Repositories" +#~ msgstr "Không có kho Bổ sung" + +#~ msgid "_Remove…" +#~ msgstr "_Xóa bỏ…" + +#~ msgid "_Disable…" +#~ msgstr "_Tắt…" + +#~ msgid "Disabling" +#~ msgstr "Đang tắt" + +#~ msgid "Enabled" +#~ msgstr "Bật" + +#~ msgid "Disabled" +#~ msgstr "Bị tắt" + +#~ msgid "ratings in total" +#~ msgstr "tổng số đánh giá" + +#~ msgid "_Remove All" +#~ msgstr "_Gỡ bỏ tất cả" + +#~ msgid "Looking for new updates…" +#~ msgstr "Đang tìm kiếm các cập nhật mới…" + +#~ msgid "Setting up updates…" +#~ msgstr "Đang thiết lập các cài đặt…" + +#~ msgid "Software is up to date" +#~ msgstr "Phần mềm hiện đã cập nhật" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "Cập nhật sẽ được áp dụng khi máy tính khởi động lại." + +#, c-format +#~ msgid "Waiting to Download %s %s" +#~ msgstr "Chờ để tải về %s %s" + +#, c-format +#~ msgid "Downloading %s %s" +#~ msgstr "Đang tải về %s %s" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "" +#~ "ODRS là một dịch vụ cung cấp các nhận xét, bình luận của người dùng về " +#~ "các ứng dụng" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "Bật kho phần mở rộng GNOME Shell" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "Các nhân vật hoạt hình trong các tình huống nguy hiểm" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "Các nhân vật hoạt hình với mâu thuẫn dữ dội" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "Đồ họa cảnh bạo lực với các nhân vật hoạt hình" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "" +#~ "Các nhân vật trong các tình huống không an toàn dễ dàng xa rời thực tế" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "" +#~ "Các nhân vật có mâu thuẫn dữ dội có thể dễ dàng phân biệt với thực tế" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "Bạo lực đồ họa dễ dàng phân biệt với thực tế" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "Các nhân vật thực tế ôn hòa trong các tình huống không an toàn" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "Miêu tả nhân vật thực tế trong trạng thái vô cùng mâu thuẫn" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "Đồ họa cảnh bạo lực với các nhân vật thực tế" + +#~ msgid "No bloodshed" +#~ msgstr "Không có nội dung chém giết" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "Cảnh giết chóc phi thực tế" + +#~ msgid "Realistic bloodshed" +#~ msgstr "Sự giết chóc thực tế" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "Diễn tả cảnh đổ máu và phanh thây" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "Cưỡng hiếp hoặc hành vi tình dục bạo lực khác" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "Dẫn chiếu đến các thức uống có cồn" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "Sử dụng các đồ uống có cồn" + +#~ msgid "References to illicit drugs" +#~ msgstr "Nhắc đến các loại thuốc cấm" + +#~ msgid "Use of illicit drugs" +#~ msgstr "Sử dụng ma túy trái phép" + +#~ msgid "References to tobacco products" +#~ msgstr "Dẫn chiếu đến các sản phẩm thuốc lá" + +#~ msgid "Use of tobacco products" +#~ msgstr "Sử dụng các sản phẩm thuốc lá" + +#~ msgid "Brief artistic nudity" +#~ msgstr "Ảnh khoả thân nghệ thuật ngắn" + +#~ msgid "Prolonged nudity" +#~ msgstr "Ảnh khoả thân kéo dài" + +#~ msgid "Provocative references or depictions" +#~ msgstr "Các dẫn chiếu hoặc mô tả mang tính khiêu khích" + +#~ msgid "Sexual references or depictions" +#~ msgstr "Diễn tả hoặc nhắc đến nội dung tình dục" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "Đồ họa hành vi giới tính" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "Sử dụng lời lẽ tục tĩu ở mức nhẹ hoặc không thường xuyên" + +#~ msgid "Moderate use of profanity" +#~ msgstr "Sử dụng từ ngữ thô tục ở mức trung bình" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "Sử dụng từ ngữ thô tục ở mức mạnh hay thường xuyên" + +#~ msgid "Slapstick humor" +#~ msgstr "Hài hước vui nhộn" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "Đùa cợt tục tĩu hoặc khiếm nhã" + +#~ msgid "Mature or sexual humor" +#~ msgstr "Đùa cợt người lớn hoặc về giới tính" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "Tính chất cấm đoán đối với một nhóm người cụ thể" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "Sự phân biệt đối xử được tạo ra để gây tổn thương tinh thần" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "" +#~ "Sự phân biệt đối xử rõ rệt về giới tính, thiên hướng tình dục, sắc tộc " +#~ "hoặc tôn giáo" + +#~ msgid "Product placement" +#~ msgstr "Quảng Cáo Sản Phẩm" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "" +#~ "Dẫn chiếu rõ ràng đến các thương hiệu hoặc sản phẩm có nhãn hiệu cụ thể" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "Người dùng được khuyến khích mua các mặt hàng cụ thể ngoài đời thật" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "Cờ bạc về các sự kiện ngẫu nhiên bằng hiện vật hoặc thẻ tín dụng" + +#~ msgid "Gambling using “play” money" +#~ msgstr "Chơi cờ bạc bằng tiền \"ảo\"" + +#~ msgid "Gambling using real money" +#~ msgstr "Đánh bạc bằng tiền thật" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "Người dùng được khuyến khích quyên góp tiền thật" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "Khả năng tiêu tiền thật trong ứng dụng" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "Tương tác giữa những người dùng mà không có tính năng chat" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "Tính năng chat vừa phải giữa những người dùng" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "Không có tính năng điều khiển âm thanh hoặc video những người dùng" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "Chia sẻ tên người dùng mạng xã hội hoặc địa chỉ thư điện tử" + +#~ msgid "Checking for the latest application version" +#~ msgstr "Kiểm tra phiên bản ứng dụng mới nhất" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "" +#~ "Chia sẻ dữ liệu chẩn đoán không cho phép người khác xác định người dùng" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "" +#~ "Chia sẻ thông tin người dùng cái mà làm cho người khác định danh người " +#~ "dùng" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "Chia sẻ vị trí địa lý với những người dùng khác" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "Tham chiếu gián tiếp về đồng tính luyến ái" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "Hôn nhau giữa những người cùng giới tính" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "Hành vi tình dục đồ họa giữa những người cùng giới tính" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "Tham chiếu gián tiếp đến mại dâm" + +#~ msgid "Direct references to prostitution" +#~ msgstr "Tham chiếu trực tiếp đến mại dâm" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "Mô tả đồ họa về hành vi mại dâm" + +#~ msgid "Indirect references to adultery" +#~ msgstr "Tham chiếu gián tiếp đến ngoại tình" + +#~ msgid "Direct references to adultery" +#~ msgstr "Tham chiếu trực tiếp đến ngoại tình" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "Mô tả đồ họa về hành vi ngoại tình" + +#~ msgid "Scantily clad human characters" +#~ msgstr "Nhân vật Scantily clad con người" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "Nhân vật con người tính dục công khai" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "Mô tả hoặc tham chiếu đến sự xúc phạm lịch sử" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "Miêu tả sự xúc phạm con người thời hiện đại" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "Hình vẽ miêu tả sự xúc phạm con người thời hiện đại" + +#~ msgid "Visible dead human remains" +#~ msgstr "Hiển thị hài cốt người chết" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "Hài cốt con người đã chết cái mà đab phân hủy thành nhiều mảnh" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "Mô tả đồ họa về sự xúc phạm cơ thể con người" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "Mô tả hoặc tham chiếu đến chế độ nô lệ lịch sử" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "Mô tả chế độ nô lệ thời hiện đại" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "Mô tả đồ họa về chế độ nô lệ thời hiện đại" + +#~ msgid "General" +#~ msgstr "Chung" + +#~ msgid "ALL" +#~ msgstr "Tất cả" + +#~ msgid "Teen" +#~ msgstr "Tuổi tin" + +#~ msgid "Everyone 10+" +#~ msgstr "Mọi người 10+" + +#~ msgid "Everyone" +#~ msgstr "Mọi người" + +#~ msgid "Early Childhood" +#~ msgstr "Thời thơ ấu" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "Không rõ" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "_Cùng mua sắm" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "Đã gỡ bỏ" + +#~ msgid "Format" +#~ msgstr "Định dạng" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "Bạn có chắc là bạn muốn gỡ %s?" + +#~ msgid "Security Updates Pending" +#~ msgstr "Chờ Cập nhật Bảo mật" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "Bạn nên cài đặt các bản cập nhật quan trọng ngay bây giờ" + +#~ msgid "Restart & Install" +#~ msgstr "Khởi động lại & Cài đặt" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "" +#~ "Các cập nhật ứng dụng và hệ điều hành quan trọng đã sẵn sàng để được cài " +#~ "đặt" + +#~ msgid "View" +#~ msgstr "Xem" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Yesterday, %R" +#~ msgstr "Hôm qua, %R" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "Hôm qua, %l:%M %p" + +#~ msgid "Three days ago" +#~ msgstr "Cách đây ba ngày" + +#~ msgid "Four days ago" +#~ msgstr "Bốn ngày trước" + +#~ msgid "Five days ago" +#~ msgstr "Năm ngày trước" + +#~ msgid "Six days ago" +#~ msgstr "Sáu ngày trước" + +#~ msgid "Two weeks ago" +#~ msgstr "Hai tuần trước" + +#~ msgid "this website" +#~ msgstr "website này" + +#~ msgid "" +#~ "Unfortunately, the %s you were searching for could not be found. Please " +#~ "see %s for more information." +#~ msgid_plural "" +#~ "Unfortunately, the %s you were searching for could not be found. Please " +#~ "see %s for more information." +#~ msgstr[0] "" +#~ "Rất tiếc, không thể tìm thấy %s mà bạn đang tìm kiếm. Vui lòng xem %s để " +#~ "biết thêm thông tin." + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "" +#~ "Cần phải khởi động lại ứng dụng này để sử dụng các tiện ích (plugin) mới." + +#~ msgid "Show the folder management UI" +#~ msgstr "Hiển thị UI (giao diện người dùng) quản lý thư mục" + +#~ msgid "Folder Name" +#~ msgstr "Tên Thư mục" + +#~ msgid "_Add" +#~ msgstr "_Thêm" + +#~ msgid "Add to Application Folder" +#~ msgstr "Thêm vào Thư Mục Ứng Dụng" + +#~ msgid "About %s" +#~ msgstr "Giới thiệu %s" + +#, fuzzy +#~| msgid "Updated" +#~ msgid "Top Rated" +#~ msgstr "Đã cập nhật" + +#~ msgid "Extension Settings" +#~ msgstr "Cài đặt Phần mở rộng" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "Bạn tự chịu trách nhiệm trong việc sử dụng các tiện ích bổ sung. Nếu bạn " +#~ "gặp bất kỳ vấn đề hệ thống nào, bạn nên tắt các tiện ích này." + +#~ msgid "Failed to load components" +#~ msgstr "Gặp lỗi khi tải các thành phần" + +#~ msgid "CSS validated OK!" +#~ msgstr "Đã xác thực CSS OK!" + +#~ msgid "Failed to load file" +#~ msgstr "Không thể tải file" + +#~ msgid "Unsaved changes" +#~ msgstr "Thay đổi chưa lưu" + +#~ msgid "The application list is already loaded." +#~ msgstr "Đã tải danh sách ứng dụng." + +#~ msgid "Merge documents" +#~ msgstr "Hợp nhất tài liệu" + +#~ msgid "Throw away changes" +#~ msgstr "Hủy thay đổi" + +#~ msgid "Open AppStream File" +#~ msgstr "Mở File AppStream" + +#~ msgid "Save AppStream File" +#~ msgstr "Lưu tập tin AppStream" + +#~ msgid "_Save" +#~ msgstr "_Lưu" + +#~ msgid "%s banner design deleted." +#~ msgstr "Đã xóa thiết kế banner %s." + +#~ msgid "Banner design deleted." +#~ msgstr "Đã xóa thiết kế banner" + +#~ msgid "The application list has unsaved changes." +#~ msgstr "Có thay đổi chưa lưu trong danh sách ứng dụng" + +#~ msgid "Use verbose logging" +#~ msgstr "Sử dụng phương pháp đăng nhập đa thông tin" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "Nhà thiết kế Banner Phần mềm GNOME" + +#~ msgid "No Designs" +#~ msgstr "Không có Thiết kế" + +#~ msgid "Error message here" +#~ msgstr "Gửi tin nhắn về lỗi tại đây" + +#~ msgid "Category Featured" +#~ msgstr "Hạng mục Nổi bật" + +#~ msgid "Undo" +#~ msgstr "Hoàn tác" + +#~ msgid "Banner Designer" +#~ msgstr "Nhà thiết kế Banner" + +#~ msgid "New Banner" +#~ msgstr "Banner Mới" + +#~ msgid "Import from file" +#~ msgstr "Nhập từ file" + +#~ msgid "Export to file" +#~ msgstr "Xuất ra file" + +#~ msgid "Spacing" +#~ msgstr "Giãn cách" + +#~ msgid "The amount of space between children" +#~ msgstr "Lượng không gian giữa trẻ em với nhau" + +#~ msgid "Click on items to select them" +#~ msgstr "Nhấp vào các mục để chọn" + +#~ msgid "Select" +#~ msgstr "Chọn" + +#~ msgid "_Add to Folder…" +#~ msgstr "_Thêm Vào Thư Mục…" + +#~ msgid "_Move to Folder…" +#~ msgstr "_Chuyển đến Thư mục..." + +#~ msgid "_Remove from Folder" +#~ msgstr "_Gỡ khỏi Thư mục" + +#~ msgid "Featured Applications" +#~ msgstr "Ứng dụng Nổi bật" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "Thiết kế các banner đặc sắc cho Phần mềm GNOME" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Phần mềm;Ứng dụng;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Các tiện ích mở rộng" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "Kho phần mở rộng vỏ GNOME" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "Đang tải siêu dữ liệu cho phần mở rộng Shell..." + +#~ msgid "GNOME Shell Extension" +#~ msgstr "Phần mở rộng Hệ vỏ Gnome" + +#~ msgid "Whether to automatically perform updates" +#~ msgstr "Có tự động tiến hành cập nhật hay không" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "Danh sách các mã nguồn bổ sung đã được kích hoạt trước đây" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "" +#~ "Danh sách các nguồn đã được kích hoạt trước đó khi cài đặt ứng dụng của " +#~ "bên thứ ba." + +#~ msgid "Show non-free software in search results" +#~ msgstr "Hiển thị phần mềm không miễn phí trong kết quả tìm kiếm" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "" +#~ "Một danh sách các nguồn không miễn phí có thể được tùy chọn kích hoạt" + +#~ msgid "Sorts the apps shown in the overview in alphabetical order" +#~ msgstr "" +#~ "Sắp xếp các ứng dụng hiển thị trong màn hình tổng quan theo thứ tự bảng " +#~ "chữ cái" + +#~ msgid "" +#~ "Overrides the name of the \"Featured\" entry in the side-filter (category " +#~ "list)" +#~ msgstr "" +#~ "Ghi đè tên của mục \"Nổi bật\" trong bộ lọc bên (danh sách thể loại)" + +#~ msgid "system-software-install" +#~ msgstr "hệ thống-phần mềm-cài đặt" + +#~ msgid "_All" +#~ msgstr "_Tất cả" + +#~ msgid "Show profiling information for the service" +#~ msgstr "Hiển thị thông tin hồ sơ cá nhân cho dịch vụ" + +#~ msgid "To continue you need to sign in." +#~ msgstr "Bạn cần đăng nhập để thực hiện tiếp." + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "Để tiếp tục, bạn cần phải đăng nhập vào %s." + +#~ msgid "Email address" +#~ msgstr "Địa chỉ email" + +#~ msgid "I have an account already" +#~ msgstr "Tôi đã có tài khoản" + +#~ msgid "I want to register for an account now" +#~ msgstr "Tôi muốn đăng ký một tài khoản ngay bây giờ" + +#~ msgid "Sign in automatically next time" +#~ msgstr "Tự động đăng nhập lần sau" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "Nhập mã pin dùng-một-lần của bạn để thực hiện xác thực hai yếu tố" + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "Xác thực" + +#~ msgid "Continue" +#~ msgstr "Tiếp tục" + +#~ msgid "Scheduled update" +#~ msgstr "Cập nhật theo lịch" + +#~ msgid "Available in a USB drive" +#~ msgstr "Có sẵn trong ổ USB" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "" +#~ "Tương tác cài sẵn giữa các người chơi mà không có chức năng trò chuyện" + +#~ msgid "_Add to Desktop" +#~ msgstr "_Thêm vào Màn hình nền" + +#~ msgid "Developer _Website" +#~ msgstr "Website _Lập trình viên" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "Đang tải danh mục phần mềm" + +#~ msgid "_About" +#~ msgstr "_Giới thiệu" + +#~ msgid "_Quit" +#~ msgstr "_Thoát ra" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "Kích hoạt Các nguồn Phần mềm Sở hữu độc quyền?" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "%s sẽ được cài đặt và bạn sẽ bị tính phí %s." + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "Trên website có thể tìm thấy thông tin về %s cũng như các tùy chọn về " +#~ "cách tải một bộ mã hóa-giải mã có thể phát định dạng này." + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "Không thể cài đặt phần mềm khi vấn đề này chưa được giải quyết." + +#~ msgid "For more information, visit %s." +#~ msgstr "Để biết thêm thông tin, hãy truy cập %s." + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "" +#~ "Không có ứng dụng hoặc tiện ích bổ sung nào được cài đặt; các ứng dụng " +#~ "khác có thể vẫn được cài đặt" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "Thông thường bị hạn chế quyền sử dụng và truy cập mã nguồn." + +#~ msgid "Proprietary Software Sources" +#~ msgstr "Nguồn Phần mềm Sở hữu độc quyền" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "" +#~ "Có thể tải các mã nguồn phần mềm từ internet. Chúng cho phép bạn truy cập " +#~ "vào phần mềm bổ sung mà %s không cung cấp." + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "" +#~ "Khi gỡ một nguồn, bất kỳ phần mềm nào mà bạn đã cài đặt từ đó cũng sẽ bị " +#~ "gỡ." + +#~ msgid "Installed from this Source" +#~ msgstr "Đã được cài đặt từ Nguồn này" + +#~ msgid "Last Checked" +#~ msgstr "Lần cuối Kiểm tra" + +#~ msgid "Added" +#~ msgstr "Đã thêm" + +#~ msgid "automatic updates off" +#~ msgstr "Tự động cập nhật ở chế độ tắt" + +#~ msgid "Restart & _Install" +#~ msgstr "Khởi động lại & _Cài đặt" + +#~ msgid "App Center" +#~ msgstr "Trung tâm Ứng dụng" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "Tất cả" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "Nổi bật" + +#~ msgctxt "Menu of Reference" +#~ msgid "Feed" +#~ msgstr "Nguồn cấp tin" + +#~ msgctxt "Menu of Reference" +#~ msgid "News" +#~ msgstr "Tin tức" + +#~ msgid "Multimedia" +#~ msgstr "Đa phương tiện" + +#~ msgid "Dev Tools" +#~ msgstr "Lập trình" + +#~ msgid "USB" +#~ msgstr "USB" + +#~ msgid "Could not launch this application." +#~ msgstr "Không thể khởi chạy ứng dụng này" + +#~ msgid "Framework for applications" +#~ msgstr "Khung cho các ứng dụng" + +#~ msgid "" +#~ "The app %s is missing its runtime. Update the app to repair this problem." +#~ msgstr "" +#~ "Ứng dụng %s bị thiếu các thành phần hỗ trợ chạy chương trình. Hãy cập " +#~ "nhật ứng dụng để khắc phục lỗi này." + +#~ msgid "Getting runtime source…" +#~ msgstr "Đang nhận nguồn thời gian chạy..." + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "" +#~ "Limba mang đến cho các lập trình viên một cách tạo các gói phần mềm dễ " +#~ "dàng" + +#~ msgid "Downloading application page…" +#~ msgstr "Đang tải xuống trang ứng dụng..." + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Nền tảng giải trí tối ưu từ Valve" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..8f2568f --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,8325 @@ +# Chinese (China) translation for gnome-software. +# Copyright (C) 2013-2021 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# tuhaihe <1132321739qq@gmail.com>, 2013. +# eternalhui , 2013 +# Wylmer Wang , 2013. +# YunQiang Su , 2014. +# Sphinx Jiang , 2014. +# Tong Hui , 2014. +# Mingye Wang , 2015, 2016. +# Mingcong Bai , 2015, 2016, 2018. +# Bin Li , 2016. +# Michael Chen , 2016. +# Mandy Wang , 2016. +# Boyuan Yang <073plan@gmail.com>, 2018, 2021. +# Zhou Nan , 2021. +# Dingzhong Chen , 2015-2021. +# Starccy <452276725@qq.com>, 2023. +# Nanling , 2023. +# lumingzh , 2021-2025. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-21 13:46+0000\n" +"PO-Revision-Date: 2025-02-25 08: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 47.1\n" +"X-DamnedLies-Scope: partial\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "软件" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "安装和更新应用" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "“软件”允许您查找并安装新的应用和系统扩展,移除已安装的应用。" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"软件向您展示特色和流行的应用,并提供每个应用的描述、截图等有用信息。您可以通" +"过浏览分类列表或搜索来找到应用。您还可以用它离线更新您的系统。" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "概览面板" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "详情面板" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "已安装面板" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "更新面板" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "更新详情" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME 项目" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "在 Shim UEFI 中测试 akmod 密钥" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "在 Shim UEFI 中测试 akmod 密钥需要认证" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "将 akmod 密钥登记至 Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "将 akmod 密钥登记至 Shim UEFI 需要认证" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "在 Shim UEFI 中测试 DKMS 密钥" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "在 Shim UEFI 中测试 DKMS 密钥需要认证" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "将 DKMS 密钥登记至 Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "将 DKMS 密钥登记至 Shim UEFI 需要认证" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "安装 AppStream 文件到系统位置" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "正在安装 AppStream 文件到系统位置" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "兼容项目的列表" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "这是一个应显示的兼容项目的列表,如 GNOME、KDE 和 XFCE。" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "是否在 GNOME 软件中管理更新和升级" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"如果禁用,GNOME 软件 将隐藏更新面板,且不执行任何自动更新的操作或提示用户进行" +"升级。" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "自动下载并安装更新" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"如果启用,GNOME 软件 将自动在后台下载更新,并安装那些不需要重启的更新。" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "通知用户软件已在后台更新" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "如果启用,GNOME 软件 将在用户空闲时通知已完成的更新。" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "是否在流量计费连接上自动刷新" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"如果启用,GNOME 软件将在后台自动刷新,即使使用的是流量计费连接(最终会下载一" +"些元数据、检查更新等,可能对用户产生费用)。" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "GNOME 软件是否是初次启动" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "在应用程序旁显示星级评分" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "基于远程设置的默认分支筛选应用程序" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "在安装非自由应用程序前显示警告对话框" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "在安装非自由应用程序时显示警告对话框。该选项控制是否禁用此对话框。" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "最近更新检查的时间戳" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "上次升级通知的时间戳" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "上次更新通知的时间戳" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "第一次安全更新的时间戳,更新后清空" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "上次更新的时间戳" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "以秒计算的时长,用于验证上游的屏幕截图是否仍然有效" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"选择更大的数值意味着更少往返远程服务器,但是屏幕截图的更新可能需要更长时间才" +"能显示给用户。数值 0 代表从不检查服务器如果图像已经存在于缓存中。" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "应用程序评价使用的服务器" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "评论的最小回报分数" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "低于此回报分数的评论将被隐藏。" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "不应当作第三方的官方仓库列表" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "必需且不能被禁用或移除的仓库列表" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "应当作自由软件的官方仓库列表" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "应用程序为自由软件时要使用的许可 URL" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "尝试为系统上所有的用户安装套装软件" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "允许访问软件仓库对话框" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "为预发行版本提供升级" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "通过显示某些界面元素来通知用户软件为非自由" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "显示已安装应用程序列表里应用的安装大小" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://zh.wikipedia.org/wiki/专有软件'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "解释非自由和专有软件的网址" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "指向将下载到 swcatalog 文件夹的 AppStream 文件的 URL 列表" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"为所有用户安装 AppStream 文件到系统级位置。如果为假,文件将被安装在非标准的 " +"$XDG_DATA_HOME/swcatalog/xml 目录中" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"首选的打包格式优先顺序,格式越重要越靠前列出。空数组代表默认顺序。省略的格式" +"将被列于后方。作为举例的打包格式有:deb、flatpak、rpm、snap。也可以使用原始名" +"称指定格式,以冒号作为分割,例如:flatpak:flathub。" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "上次尝试删除未使用的 Flatpak 运行时的时间戳" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "设置为“true”来仅显示自由许可的应用并隐藏任何专有应用。" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "设置为“true”来仅显示已验证身份的开发者提供的应用。" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "最后收到历史更新的时间戳。" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "存储用于登录的 gnome-online-account id 的字符串" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "GNOME 软件 AppStream 系统级安装器" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "解析命令行参数失败" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "您需要指定正好一个文件名" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "该程序只能被 root 用户使用" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "验证内容类型失败:%s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "移动失败:%s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "软件安装" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "安装选中的软件到系统上" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "卡通暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "没有关于卡通暴力的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "幻想暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "没有关于幻想暴力的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "写实暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "没有关于写实暴力的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "描述血腥的暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "没有关于血腥暴力的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "性暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "没有关于性暴力的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "酒精" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "没有关于酒精的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "毒品" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "没有关于违禁药品的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "烟草" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "没有关于烟草产品的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "裸体" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "没有关于任何形式裸体的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "性主题" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "没有关于性主题或对其描述的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "猥亵语言" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "没有关于任何类型猥亵语言的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "不良笑话" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "没有关于不良笑话的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "歧视" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "没有关于任何类型歧视性语言的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "广告" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "没有关于任何类型广告的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "赌博" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "没有关于任何类型赌博的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "购买" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "没有关于花费金钱功能的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "用户间聊天" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "没有关于与其他用户聊天方式的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "用户间语音聊天" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "没有关于与其他用户语音交流方式的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "联系人详情" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "没有关于共享社交网络用户名或电子邮箱地址的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "身份信息" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "没有关于与第三方组织共享用户信息的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "位置分享" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "没有关于与其他用户共享物理定位的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "同性恋" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "没有关于同性恋的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "卖淫" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "没有关于卖淫的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "通奸" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "没有关于通奸的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "性暗示角色" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "没有关于性暗示角色的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "亵渎" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "没有关于亵渎行为的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "人体残骸" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "没有关于可见死亡人类遗骸的信息" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "奴隶" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "没有关于奴役的信息" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "不包含对毒品的暗示" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "不包含发誓、亵渎和其它类型的强烈性语言" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "不包含广告或货币交易" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "不包含性或裸体" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "不包含不受控制的聊天功能" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "不包含暴力内容" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "毒品" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "强烈性语言" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "金钱" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "社交" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "暴力" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "全部" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "%s 具有未知年龄分级" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "%s 适合所有人" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "%s 适合幼儿" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "%s 适合幼童" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "%s 适合儿童" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "%s 适合青少年" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "%s 适合成年人" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "%s 适合 %s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "年龄分级" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "如何贡献缺失的信息(_H)" + +#: lib/gs-app.c:6390 +msgid "Local file" +msgstr "本地文件" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6409 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s(%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6486 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "软件包" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "等待中" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "等待安装" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "等待移除" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "安装中" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "移除中" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "正在下载" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "安装(_I)" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "卸载(_U)…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "网络" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "可以通过网络进行通信" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "系统服务" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "可以访问在系统总线上访问 D-Bus 服务" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "会话服务" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "可以在会话总线上访问 D-Bus 服务" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "设备" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "可访问任意设备如摄像头" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "可以访问输入设备" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "可以访问麦克风和播放音频" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "可访问系统设备文件" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "屏幕内容" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "可以访问屏幕内容" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "主目录" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "可以查看、编辑和创建文件" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "可以查看文件" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "文件系统" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "下载文件夹" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "设置" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "可以查看和更改任意设置" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "过时显示系统" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "使用旧式、不安全的显示系统" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "沙箱逃逸" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "可以逃脱沙箱并绕过任何其他限制" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "没有可用的更新描述。" + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "更新详情" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "要求额外的权限" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "从服务器接收的无效评级数据" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "无法与评级服务器通信" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "评论" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "未找到对该应用的评论。" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "没有评论" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "版本历史" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "版本 %s 的新变化" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "版本 %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "此发布版本未提供详细信息" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%Y年%-m月%-d日" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "启动模式:可选“updates”“updated”“installed”或“overview”" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "模式" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "搜索应用程序" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "搜索" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "显示应用程序详情(使用应用程序标识)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "标识" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "显示应用程序详情(使用软件包名)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "软件包名" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "安装应用程序(使用应用程序标识)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "卸载应用程序(使用应用程序标识)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "打开本地软件包文件" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "文件名" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "此操作期望的交互类型:可选“none”“notify”或“full”" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "交互" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "显示本地元信息或应用数据文件" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "启用详细调试输出(如果已经运行则来自运行的实例)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "在后台安装任何等待的更新" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "显示首选项" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "退出运行中的实例" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "对 AppStream 优先使用本地文件源" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "显示版本号" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "版权所有 © 2016–2023 GNOME 软件贡献者" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"eternalhui , 2013\n" +"tuhaihe <1132321739qq@gmail.com>, 2013, 2020\n" +"Wylmer Wang , 2013\n" +"YunQiang Su , 2014\n" +"Sphinx Jiang , 2014\n" +"Tong Hui , 2014\n" +"Mingye Wang , 2015, 2016\n" +"Mingcong Bai , 2015, 2018\n" +"Bin Li , 2016\n" +"Michael Chen , 2016\n" +"Mandy Wang , 2016\n" +"Dingzhong Chen , 2015-2021\n" +"lumingzh , 2022-2025\n" +"Nanling , 2023" + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "抱歉!该应用程序没有详细信息。" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "安装大小" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "包括 %s 数据和 %s 缓存" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "包括 %s 数据" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "包括 %s 缓存" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "缓存和数据使用量未知" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "下载大小" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "无需额外的系统下载" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "需要未知大小的额外系统下载" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "需要 %s 的额外系统下载" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "大小未知" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "无需权限" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "可访问网络" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "使用系统服务" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "使用会话服务" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "可访问硬件设备" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "可访问系统设备" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "可读写所有用户数据" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "可读取所有用户数据" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "可读写下载目录" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "可读取下载目录" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "可访问一些特定文件" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "可访问和更改用户设置" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "使用过时窗口系统" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "可获取任意额外权限" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "软件开发者已经过验证" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "已由系统发行版审查" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "已由 %s 审查" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "由第三方提供" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "该软件不再受到支持" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "可审计代码" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "未知的许可证" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "专有软件" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "特殊许可证" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr ";" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "有特权的" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "安全的" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "可能安全" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "潜在危险" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "不安全的" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "仅适用移动设备" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "只适用于小屏幕" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "仅适用于台式机" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "仅适用于大屏幕" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "屏幕尺寸不匹配" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "不支持您当前的屏幕尺寸" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "需要触摸屏" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "需要键盘" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "需要鼠标" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "需要手柄" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "需要使用手柄操作" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "自适应" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "适用于手机、平板电脑和台式机" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "可能需要键盘或鼠标" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "适用于台式机和笔记本电脑" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "不包含不适龄内容" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "无可用年龄分级信息" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "访问网站" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "安装…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "取消" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "安装" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "下载" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "更新" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "卸载…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "卸载中" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "关键更新" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "升级期间设备无法使用。" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "来源:%s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "从 %s 改名" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "已停止接收更新" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "关键更新" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "已安装" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "帮助翻译 %s" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"%s 由国际贡献者社区设计、开发和翻译。\n" +"\n" +"这意味着即使它还未提供您的语言,您也可以参与其中并帮助翻译它。" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "翻译" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "翻译网站(_T)" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "远程服务 %s(%s 域)需要登录" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "需要登录" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "取消(_C)" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "登录(_L)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "用户(_U)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "密码(_P)" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "其他" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "全部" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "特色软件" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "编辑精选" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "最近更新" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "来自网页" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "其它软件" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s 已安装" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "需要重新启动以使更新生效" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "应用已就绪" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "已安装系统更新" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "可以查看最近安装的更新" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "重新启动" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "启动" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "安装软件吗?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "安装第三方软件?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "要启用软件仓库吗?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "要启用第三方软件仓库吗?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"%s 不是 自由开源软件,它由 “%s” 提供。" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "%s 由 %s 提供。" + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "要继续安装必须启用此软件仓库。" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "在一些国家安装或使用 %s 可能是非法的。" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "在一些国家安装或使用此编码解码器可能是非法的。" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "不再警告(_W)" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "启用并安装(_I)" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "包管理器提供的详细错误如下:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "详细信息" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "关闭(_C)" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "详情已复制到剪贴板" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "接受(_A)" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "已安装更新" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "已卸载应用" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "需要重新启动以生效" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "现在不" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "今天" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "昨天" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d 天前" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d 周前" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d 个月前" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d 年前" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "刚刚" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d 分钟前" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d 小时前" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "特别推荐" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D 图形" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "摄影" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "扫描" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "矢量图形" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "查看器" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "音频创建与编辑" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "音乐播放器" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "特别推荐" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "日历" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "数据库" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "财务" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "文字处理" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "文本编辑器" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "网页浏览器" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "特别推荐" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "动作" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "冒险" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "街机" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "益智" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "棋类" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "纸牌" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "模拟器" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "儿童" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "逻辑" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "角色扮演" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "体育" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "策略" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "特别推荐" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "聊天" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "特别推荐" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "人工智能" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "天文学" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "化学" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "语言学" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "数学" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "新闻" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "机器人学" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "艺术" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "传记" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "漫画" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "小说" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "健康" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "历史" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "生活" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "政治" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "体育" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "特别推荐" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "调试器" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "集成开发环境" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "编解码器" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "硬件驱动" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "字体" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "输入源" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "语言包" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "本地化" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "创造" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "工作" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "游玩" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "社交" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "学习" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "开发" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "编解码器" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "硬件驱动" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "字体" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "输入源" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "语言包" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "本地化" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "应用" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "%s 需要额外的文件格式的支持。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "需要额外的 MIME 类型" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "%s 需要额外的字体。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "需要额外的字体" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "%s 需要额外的多媒体编解码器。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "需要额外的多媒体编解码器" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "%s 需要额外的打印机驱动程序。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "需要额外的打印机驱动程序" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "%s 需要额外的软件包。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "需要额外的软件包" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "在“软件”中查找" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "显示更多(_S)" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "显示更少(_S)" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "正在移除…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "需要重新启动以完成安装" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "需要重新启动以完成移除" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "等待安装…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "等待更新…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "正在下载…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "正在准备…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "正在卸载…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s 没有被安装,但它仍然有数据存在。" + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "重新启动(_R)" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "启用(_E)…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "安装(_I)…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s 将以美式英文显示" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "此应用将以美式英文显示" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "此软件将以美式英文显示" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "帮助翻译(_T)" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "%s 的其它应用" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "开发者%s已证实对%s的所有权" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "开发者已证实对%s的所有权" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "您需要互联网连接以编写评论" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "该应用不再接收更新,包括安全修复" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "该应用已由您的发行版提供,而且不应被替换。" + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "此应用未提供任何网站、代码仓库或问题追踪的链接。" + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "此软件不再接收更新,包括安全修复" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "此软件已由您的发行版提供,而且不应被替换。" + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "此软件未提供任何网站、代码仓库或问题追踪的链接。" + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "获取“%s”的信息失败且无法显示该应用的详情。" + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "从服务器接收的无效评论反应" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "提交对“%s”的评论失败:%s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "详细信息页面" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "正在加载应用详情" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "已验证" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "打开(_O)" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "更新(_U)" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "卸载" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "附加组件" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "这个应用只能在联网情况下使用。" + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "包含软件仓库" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "该应用中包含了提供更新和其他软件的软件仓库。" + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "不含软件仓库" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "该应用不包括软件仓库。不会自动更新到新版本。" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "探测到软件仓库" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "添加此软件仓库以获取其他软件和升级。" + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "仅使用您信任的软件仓库。" + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "清除应用数据" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "删除数据(_E)" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "无元数据" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "项目网站(_W)" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "捐赠(_D)" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "贡献翻译(_T)" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "报告问题(_R)" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "帮助(_H)" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "联系人(_C)" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "编写评论(_E)" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "全部评论" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "无法显示应用详情" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "准备重启失败" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "未知错误" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "未找到密钥" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "密钥未登记" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "需要 MOK 登记" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "下一步(_N)" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"该设备已启用安全启动。为了允许启用新驱动,必须登记新的设备拥有者密钥(MOK)。" +"该进程需要随后输入密码。请记下后面与该密钥关联的密码:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "我已记下该 MOK 密码(_P)" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "重启并登记(_R)…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "部署指导:请仔细阅读" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"重启之后,屏幕上将显示设备部署画面。要启用新驱动,请继续进行以下部署步骤:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• 选择“登记 MOK”\n" +"• 选择“是”来登记密钥\n" +"• 出现提示时输入 MOK 密码\n" +"• 然后选择“重启”" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "安全影响" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"密钥登记成功后,请注意未来任何对该模块或其它任何模块的更新都将默认获得信任。" +"未来所有更新都将不再需要交互和/或认证的默默执行。" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"更多指引可在该文档页面找到。" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "正在下载额外的元数据文件…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " 和 " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr "、" + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "%s 书写系统可用的字体" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "%s 可用的软件" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "未找到请求的软件" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "查找请求的软件失败" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "未找到 %s" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "在网站上" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "没有提供 %s 文件的可用程序。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "%s 的相关信息,以及如何获取缺失的应用的选项有可能在 %s 找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "没有支持 %s 的可用程序。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "%s 不可用。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "%s 的相关信息,以及如何获取支持此格式的应用的选项有可能在 %s 找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "没有支持 %s 书写系统的可用字体。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "%s 的相关信息,以及如何获取额外字体的选项有可能在 %s 找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "没有对应 %s 格式的附加编解码器。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "%s 的相关信息,以及如何获取播放该格式的解码器的选项有可能在 %s 找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "没有支持 %s 的可用 Plasma 资源。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "%s 的相关信息,以及如何获取附加 Plsama 资源的选项有可能在 %s 找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "没有对 %s 可用的打印机驱动。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "%s 的相关信息,以及如何获取支持此打印机的驱动的选项有可能在 %s 找到。" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "文档" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "没有找到 %2$s 请求的 %1$s。请访问 %3$s 获取更多相关信息。" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "没有找到您要搜索的 %s。请访问 %s 获取更多相关信息。" + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "未找到任何搜索结果:%s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "%s 文件格式" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "全部安装(_A)" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "未找到相应的软件" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "编解码器页面" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "未找到结果" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "无法执行搜索" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "上一页" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "下一页" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "特色应用列表" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "桌面支持" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "支持在大屏幕上使用" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "桌面支持未知" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "没有足够信息来得知是否支持大屏幕" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "需要大屏幕" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "桌面未支持" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "无法在大屏幕上使用" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "移动支持" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "支持在小屏幕上使用" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "移动支持未知" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "没有足够信息来得知是否支持小屏幕" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "需要小屏幕" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "移动未支持" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "无法在小屏幕上使用" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "键盘支持" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "键盘支持未知" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "没有足够信息来得知是否支持键盘" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "需要键盘" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "支持键盘" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "不支持键盘" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "无法使用键盘操控" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "鼠标支持" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "需要鼠标或指针设备" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "鼠标支持未知" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "没有足够信息来得知是否支持鼠标或指针设备" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "需要鼠标" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "支持鼠标和指针设备" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "不支持鼠标" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "无法使用鼠标或指针设备操控" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "触摸屏支持" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "触摸屏支持未知" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "没有足够信息来得知是否支持触摸屏" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "需要触摸屏" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "支持触摸屏" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "触摸屏未支持" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "无法使用触摸屏操控" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "需要手柄" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "需要使用手柄操控" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "手柄支持" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "支持手柄" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "%s 可能可以工作在这个设备上" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "%s 可以工作在这个设备上" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "%s 可能可以工作在这个设备上" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "%s 不能正常工作在这个设备上" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "%s 不能工作在这个设备上" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "硬件支持" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "导航" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "导航到“浏览”页面" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "导航到“已安装”页面" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "导航到“更新”页面" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "打开搜索栏" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "窗口" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "打开首选项" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "打开软件仓库" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "帮助" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "打开键盘快捷键" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "已安装" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "已安装页面" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "正在进行" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "应用" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "网页应用" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "系统应用" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "社区构建" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "参与贡献(_G)" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"此应用由一个国际社区公开地开发,并在 %s 许可证下发布。\n" +"\n" +"您可以贡献并帮助完善它。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"此应用由一个国际社区公开地开发,并在 %s 许可证下发布。\n" +"\n" +"您可以贡献并帮助完善它。" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"此软件由一个国际社区公开地开发,并在 %s 许可证下发布。\n" +"\n" +"您可以贡献并帮助完善它。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"此软件由一个国际社区公开地开发,并在 %s 许可证下发布。\n" +"\n" +"您可以贡献并帮助完善它。" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "未知的许可证" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "了解更多(_L)" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"此应用未指明其开发所用的许可证,且可能是专有软件。由于难以检测,该应用可能并" +"不安全,且可能在没有监管的情况下进行更改。\n" +"\n" +"您可能无法参与贡献此应用。" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"此软件未指明其开发所用的许可证,且可能是专有软件。由于难以检测,该应用可能并" +"不安全,且可能在没有监管的情况下进行更改。\n" +"\n" +"您可能无法参与贡献此软件。" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "专有软件" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"此应用的开发不公开,所以只有它的开发者知道它的工作方式。由于难以检测可能并不" +"安全,且可能在没有监管的情况下进行更改。\n" +"\n" +"您可能无法参与贡献此应用。" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"此软件的开发不公开,所以只有它的开发者知道它的工作方式。由于难以检测可能并不" +"安全,且可能在没有监管的情况下进行更改。\n" +"\n" +"您可能无法参与贡献此软件。" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "特殊许可证" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"该应用使用特殊的许可证 %s 进行开发。\n" +"\n" +"您也许可以对该应用进行贡献。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"该应用使用特殊的许可证 %s 进行开发。\n" +"\n" +"您也许可以对该应用进行贡献。" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"该软件使用特殊的许可证 %s 进行开发。\n" +"\n" +"您也许可以对该软件进行贡献。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"该软件使用特殊的许可证 %s 进行开发。\n" +"\n" +"您也许可以对该软件进行贡献。" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "正在刷新数据" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "正在载入页面" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "正在启动" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "未知源" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "测试版" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "用户" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "添加" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "移除" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "更新" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "降级" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "选择的额外来源" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"提供获取来自 %s 的附加软件。也包括一些专有软件。\n" +"\n" +"稍后您可以在软件仓库首选项中启用这些仓库。" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "要启用第三方软件仓库吗?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "忽略(_I)" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "启用(_E)" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "适用于您的操作系统" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "适用于 %s" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "浏览" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "概览页" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "可用应用" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "其它类别" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "未找到应用数据" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "未知" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "确定(_O)" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "用户拒绝安装" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "准备 %s" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "您确定要移除 %s 仓库吗?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "所有来自 %s 的应用将被卸载,想再次使用它们您必须重新安装仓库。" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "卸载 %s 吗?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "移除之后将无法使用 %s。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "移除之后将无法使用任何依赖 %s 的应用。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "移除之后将无法使用 %s,且任何使用它的文档都将以不同的字体显示。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "移除之后将无法使用 %s。这意味着一些媒体文件将无法播放。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "移除之后依赖 %s 的硬件可能将无法再正常工作。" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"移除之后将无法使用 %s。应用数据和设置将保留在磁盘上,以允许在未来恢复应用。" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "首选项" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "软件更新" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "更多信息" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"检查和下载更新会消耗流量和电量。因此,当使用按流量计费的网络连接或处于省电模" +"式时,自动更新功能将暂停。" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "自动(_A)" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "自动检查和下载更新" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "手动(_M)" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "必须手动检查和下载更新" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "自动更新通知(_N)" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "自动安装更新时发出通知" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "内容筛选器" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "仅显示自由软件(_F)" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "浏览和搜索时隐藏专有软件" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "仅显示已验证的开发人员(_V)" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "仅显示已验证身份的开发者提供的应用" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "" +"当前已安装的一些软件与 %s 不兼容。如果您想继续,升级过程中下列软件将被自动移" +"除。" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "不兼容的软件" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "升级(_U)" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "卸载(_U)" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "应用设置和数据" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "保留(_K)" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "允许恢复应用设置和内容" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "删除(_D)" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "永久删除数据来节省磁盘空间" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "从“%s”安装的软件将停止收到更新。" + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "禁用仓库?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "移除仓库?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "禁用(_D)" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "移除(_R)" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "启用新仓库" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "在新仓库添加的同时将其启用" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "更多信息" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "选择的第三方附加仓库 — %s。" + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora 第三方仓库" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "操作系统" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "这些仓库内的软件可替代 %s 提供的默认软件。" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "软件仓库" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "无仓库" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "已安装 %u 款应用" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "已安装 %u 个附加组件" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u 款应用" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u 个附加组件" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "%s 和 %s 已安装" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "正在检查安装的软件…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "移除" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "差评" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "反感" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "一般" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "喜欢" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "最喜欢了" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "选择一个星级进行评分" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "请花多点时间来编写评论" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "请选择一个星级评分" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "摘要太短了" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "摘要太长了" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "描述太短了" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "描述太长了" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "编写评论" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "发送(_S)" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"请提供评分、摘要和评论。不应使用评论来报告问题:相反,请与开发人员或您的支持" +"提供商联系。" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "评论摘要" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "编写简短评论" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"在我们的 隐私政策 中查看发送了" +"什么数据。您账号附加的全名将会公开显示。" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "总共 %u 条评价" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "满分 5 星" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "未知" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "您可以举报粗暴、不文明及带有歧视性质的评价。" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "一旦被举报,该评价在管理员检查之前将被隐藏。" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "要举报评论吗?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "举报(_R)" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "移除评论吗?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "移除评论将无法撤消。" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "赞同评论" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "反对评论" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "举报…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "移除…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "应用未沙盒化,但发行版已检查并确认其并非恶意程序" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "因该应用未沙盒化,请确认您信任软件提供者" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "无需权限" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "应用已完全沙盒化" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "网络访问" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "可以访问互联网" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "无网络访问" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "不能访问互联网" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "使用系统服务" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "可以从系统服务请求数据" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "使用会话服务" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "可以从会话服务请求数据" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "用户设备访问" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "可以访问网络摄像头或游戏控制器等设备" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "无用户设备访问权限" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "不能访问网络摄像头或游戏控制器等设备" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "输入设备访问" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "麦克风访问和音频播放" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "无需请求权限即可监听麦克风和播放音频" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "系统设备访问" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "可以访问需要提升权限的系统设备" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "屏幕内容访问" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "可以访问屏幕或其他窗口的内容" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "过时窗口系统" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "任意权限" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "用户设置" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "完全的文件系统读写权限" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "可以读写文件系统上的所有数据" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "主目录读写权限" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "可以读写您的用户主目录中的所有数据" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "完全的文件系统读取权限" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "可以读取文件系统上的所有数据" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "主目录读权限" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "可以读取您的用户主目录中的所有数据" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "下载文件夹读写权限" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "可以读写您的下载文件夹中的所有数据" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "下载文件夹读权限" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "可以读取您的下载文件夹中的所有数据" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "可以读取和写入目录中的所有数据" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "可以读取目录中的所有数据" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "无文件系统访问" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "完全无法访问文件系统" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "应用开发者已验证" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "此应用的开发者已经被验证为他们所声称的人" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "不安全的依赖" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "软件或其依赖不再受到支持因此可能不安全" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "该应用未指定其开发所用的许可证,因此可能是专有软件" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "该软件未指定其开发所用的许可证,因此可能是专有软件" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "专有代码" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "源代码不是公开的,所以它不能被独立地审计且可能不安全" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "该应用使用特殊的许可证“%s”进行开发。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "该软件使用特殊的许可证“%s”进行开发。" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "可审计代码" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "源代码是公开的且可以被独立地审计,这使得应用可以更安全" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "%s 是有特权的" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "%s 是安全的" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "%s 可能是安全的" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "%s 可能是不安全的" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "%s 不安全" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "未知" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "安全性" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "许可证" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "来源" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"该应用使用了过期版本的软件平台(SDK)且可能包含不再会被修复的缺陷或安全漏洞。" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "上一张截图" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "下一张截图" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "无截图" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "未找到截图" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "加载图片失败" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "未找到截图尺寸" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "无法创建缓存" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "截图无效" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "截图不可用" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "截图" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "还有 %u 个匹配项" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "搜索页" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "搜索应用" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "未找到应用" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "“%s”" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "无法下载更新" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "无法下载固件更新" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "无法从 %s 下载固件更新" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "无法从 %s 下载更新" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "无法更新:需要互联网连接" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "无法更新:磁盘空间不足" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "无法从 %s 下载更新:磁盘空间不足" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "无法更新:需要身份验证" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "无法更新:身份验证失败" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "无法更新:需要权限" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "无法下载更新:您没有安装软件的权限" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "无法获取更新列表" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "无法安装:下载失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "无法安装 %s:从 %s 下载失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "无法安装%s:下载失败" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "无法安装:缺少运行环境" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "无法安装 %s:运行库 %s 不可用" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "无法安装 %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "无法安装:需要互联网连接" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "无法安装:无效的应用格式" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "无法安装:磁盘空间不足" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "无法安装 %s:磁盘空间不足" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "无法安装:需要身份验证" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "无法安装 %s:需要身份验证" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "无法安装:身份验证失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "无法安装 %s:身份验证失败" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "无法安装:需要权限" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "无法安装 %s:需要权限" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "无法安装:设备必须接入电源" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "无法安装 %s:设备必须接入电源" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "无法安装:电池电量低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "无法安装 %s:电池电量低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "无法从 %2$s 更新 %1$s:下载失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "无法更新 %s:下载失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "无法从 %s 安装更新:下载失败" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "无法更新:下载失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "无法更新 %s:磁盘空间不足" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "无法更新 %s:需要身份验证" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "无法更新 %s:身份验证失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "无法更新 %s:需要权限" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "无法更新:设备必须接入电源" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "无法更新 %s:设备必须接入电源" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "无法更新:电池电量低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "无法更新 %s:电池电量低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "无法更新 %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "无法更新" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "无法升级" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "无法从 %2$s 升级到 %1$s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "无法升级:下载失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "无法升级到 %s:下载失败" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "无法升级:需要互联网连接" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "无法升级到 %s:需要互联网连接" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "无法升级:磁盘空间不足" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "无法升级到 %s:磁盘空间不足" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "无法升级:需要身份验证" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "无法升级到 %s:需要身份验证" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "无法升级:身份验证失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "无法升级到 %s:身份验证失败" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "无法升级:需要权限" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "无法升级到 %s:需要权限" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "无法升级:设备必须接入电源" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "无法升级到 %s:设备必须接入电源" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "无法升级:电池电量低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "无法升级到 %s:电池电量低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "无法升级到 %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "无法卸载:需要身份验证" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "无法卸载 %s:需要身份验证" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "无法卸载 %s:身份验证失败" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "无法卸载 %s:身份验证失败" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "无法卸载:需要权限" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "无法卸载 %s:需要权限" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "无法卸载:设备必须接入电源" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "无法卸载 %s:设备必须接入电源" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "无法卸载:电池电量低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "无法卸载 %s:电池电量低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "无法卸载 %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "无法启动 %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "抱歉,出现了一些问题" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "无法启动 %s:%s 还未安装" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "磁盘空间不足,无法执行操作" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "无法安装:不支持的文件类型" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "无法安装:身份验证失败" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "无法安装" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "无法联系 %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "重新启动“软件”以使用新插件" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "设备需要接入电源" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "电池电量过低" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "软件仓库(_S)" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "首选项(_P)" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "键盘快捷键(_K)" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "关于软件(_A)" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "搜索" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "主菜单" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "搜索应用" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "浏览(_E)" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "已安装(_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "更新(_U)" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "返回" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "无" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "应用数据" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "应用运行所需数据" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "用户数据" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "应用中由您创建的数据" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "缓存数据" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "临时缓存数据" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "应用自身" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "必需依赖" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "此应用所需的共享系统组件" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "未知" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "缓存数据可以从应用设置(_A)中清除" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "存储" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s(已安装)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s(安装中)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s(下载中)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s(移除中)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "详细信息(_D)" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "检查(_E)" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "已在 %s 上安装" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "已安装的更新" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "未安装更新" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "更新已过时" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "请检查可用的更新" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "准备好安装的关键更新" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "尽快安装关键更新" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "可供下载的关键更新" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "尽快下载关键更新" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "准备好安装的更新" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "软件更新已准备就绪,正在等待" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "可供下载的更新" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "可以下载的软件更新" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "已更新 %u 款应用——需要重启" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "已更新 %u 款应用" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "%s 已经更新。" + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "请重启应用。" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "%s 和 %s 已经更新。" + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "%u 款应用需要重启。" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "包括 %s、%s 和 %s。" + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "系统已达到支持期限" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "请升级以继续接收更新" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "%s 有新版本可用" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "有可用的软件升级" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "软件更新失败" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "准备的更新没有安装" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "显示详细信息" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "系统升级完成" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "欢迎使用 %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "软件更新已安装" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "重要的操作系统更新已安装。" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "回顾" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "更新失败" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "该系统已是最新的。" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "更新被取消。" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "需要互联网连接但是未发现有效连接。请确认您有接入互联网并在此尝试。" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "本次更新有安全性问题。请联系您的软件提供商以获取更多信息。" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "没有足够的磁盘空间。请释放一些空间后再试一次。" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"很抱歉:更新安装失败。请等待下一次更新时再试一次。如果问题仍存在,请联系您的" +"软件提供商。" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "上次检查:%s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "停止" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "检查更新" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s 已停止接收关键软件更新" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "您的操作系统已停止接收关键软件更新" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "可能需要收费" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "使用移动宽带检查更新可能会花费流量。" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "依然检查(_A)" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "软件升级已下载" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "已准备好安装升级" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "检查更新" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "更新" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "更新页面" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "正在加载更新" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "这可能需要一段时间" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "已是最新状态" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "使用移动数据?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "使用移动宽带时检查更新可能会导致产生费用" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "依然检查(_C)" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "无连接" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "联机以检查更新" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "网络设置(_N)" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "错误" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "更新将被自动管理" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "软件更新已暂停" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "由于以下原因,自动软件更新已暂停:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• 当前网络连接按流量计费" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• 当前网络连接禁止大量下载" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• 省电模式已启用" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• 游戏模式已启用" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "软件更新已暂停" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "网络连接按流量计费 — 软件更新已暂停" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "网络连接禁止大量下载 — 软件更新已暂停" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "省电模式已启用 — 软件更新已暂停" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "游戏模式已启用 — 软件更新已暂停" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "重启并更新(_R)…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "全部更新(_P)" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "软件更新已下载" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "已准备好安装更新" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "集成固件" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "重新启动" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "应用更新" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "设备固件" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "下载(_D)" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s 可用" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s 可用" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "了解新版本的更多信息" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "已下载 %s,共 %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "%u%% 已下载" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "主要升级,附带新特性并添加优化。" + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "取消升级" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "重启并更新(_R)…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "建议您在更新前备份数据和文件。" + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "错误详情" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "复制详情" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "删除文件失败“%s”:%s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "删除目录失败“%s”:%s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "添加、移除或更新计算机软件" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;更新;升级;源;仓库;首选项;安装;卸载;程序;软件;应用;商店;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s 已准备" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "已准备好启用 %s 并等待下次系统启动。" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "启用" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "系统更新" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "常规系统更新,比如安全或缺陷修复和性能提升。" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s 更新了新特性和缺陷修复。" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "EOS 更新服务无法获取和应用更新。" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "网页应用" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "网页应用支持" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "在浏览器里运行流行的网页应用程序" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "升级以获取最新的功能、性能和稳定性改进。" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak 支持" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "Flatpak 是用于 Linux 上桌面应用的框架" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "系统文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "主目录子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "主机系统文件夹" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "来自 /etc 的主机系统配置" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "桌面文件夹" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "桌面子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "文档文件夹" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "文档子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "音乐文件夹" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "音乐子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "图片文件夹" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "图片子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "共享文件夹" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "共享子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "视频文件夹" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "视频子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "模板文件夹" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "模板子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "用户缓存文件夹" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "用户缓存子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "用户配置文件夹" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "用户配置子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "用户数据文件夹" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "用户数据子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "用户运行时文件夹" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "用户运行时子文件夹 %s" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "对 %s 的文件系统访问" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "正在获取 %s 的 flatpak 元数据…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "无法细化扩展“%s”:%s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "用户级安装" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "系统级安装" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "应用 ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "无法将扩展“%s”添加来安装:%s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "无法将扩展“%s”添加来卸载:%s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"远程仓库“%s”不允许安装“%s”,可能是因为它的筛选器。移除筛选器并重复安装。错误" +"详情:%s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "系统电量过低,无法执行更新" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "系统电量过低,无法执行更新 (%u%%, 需要 %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "设备无法访问或超出无线范围" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "设备电池电量太低" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "设备电池电量过低 (%u%%, 需要 %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "设备正在等待应用更新" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "设备需要连接交流电源" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "屏幕合上时无法使用设备" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "%s 设备更新" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "%s 系统更新" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "%s 嵌入式控制器(EC)更新" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "%s 管理引擎(ME)更新" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "%s 企业级管理引擎(ME)更新" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "%s 消费级管理引擎(ME)更新" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "%s 控制器更新" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "%s 雷电接口控制器更新" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "%s 处理器微码更新" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "%s 配置更新" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "%s 电池更新" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "%s 摄像头更新" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "%s 可信平台模块(TPM)更新" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "%s 触摸板更新" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "%s 鼠标更新" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "%s 键盘更新" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "%s 存储控制器更新" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "%s 网络接口更新" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "%s 显示器更新" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "%s 基板管理控制器(BMC)更新" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "%s USB 接收器更新" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "%s 磁盘驱动器更新" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "%s 闪存驱动器更新" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "%s 固态硬盘更新" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "%s 显卡更新" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "%s 扩展坞更新" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "%s USB 扩展坞更新" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "固件" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "固件更新无法应用:" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "固件升级支持" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "提供固件升级的支持" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "安装未签名的软件吗?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "即将安装的软件未被签名。将无法验证该软件的更新源或更新是否已被篡改。" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "下载未签名的软件吗?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "未签名的更新已可用。没有签名将无法验证更新源或更新是否已被篡改。" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "更新未签名的软件吗?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"未签名的更新已可用。没有签名将无法验证更新源或更新是否已被篡改。软件更新将被" +"禁用直到未签名的更新被移除或被更新。" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "安装更新失败:" + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "软件包" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "在下载前等待事务结束失败:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "下载更新失败:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "触发更新失败:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "操作系统(OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap 商店" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap 支持" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "Snap 是个通用的 Linux 程序包" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "系统" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "系统组件" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "移除系统更新任务“%s”失败,状态为 %i" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "一种管理您系统中软件的好方法。" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "无法找到“%s”" + +#~ msgid "Moderate page" +#~ msgstr "管理页面" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "没有需要管理的评价" + +#~ msgid "Was this review useful to you?" +#~ msgstr "这条评论对您有用吗?" + +#~ msgid "Yes" +#~ msgstr "是" + +#~ msgid "No" +#~ msgstr "否" + +#~ msgid "Meh" +#~ msgstr "随便" + +#~ msgid "Outdated SDK version" +#~ msgstr "过期的 SDK 版本" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "操作系统更新不再提供" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "重要的操作系统更新安装失败。" + +#~ msgid "No Network" +#~ msgstr "无网络连接" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "检查更新需要可访问网络。" + +#~ msgid "Network _Settings" +#~ msgstr "网络设置(_S)" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "软件升级已下载并且已准备好安装。" + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "软件更新已下载并且已准备好安装。" + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "请输入 1 至 %u 的任一数字:" + +#~ msgid "Choose an app:" +#~ msgstr "选择应用:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "%s 已安装" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "应用已移除" + +#~ msgid "Unable to install updates" +#~ msgstr "无法安装更新" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "无法卸载:身份验证无效" + +#~ msgid "Network Settings" +#~ msgstr "网络设置" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "正在下载升级信息…" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "正在下载软件目录" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "自动更新已暂停" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "当前网络为流量计费网络。计费连接有流量限制或产生相关费用。为了节省流量,自" +#~ "动更新已暂停。\n" +#~ "\n" +#~ "如果当前网络被错误识别为流量计费,您可以在设置中更改当前行为。" + +#~ msgid "Open Network _Settings" +#~ msgstr "打开网络设置(_S)" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "您喜欢这个应用吗?留下您的反馈及缘由,这会对其他人很有帮助。" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "无法下载更新:需要互联网连接,但互联网连接不可用" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "无法下载更新:磁盘空间不足" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "无法下载更新:需要身份验证" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "无法下载更新:身份验证无效" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "无法安装 %s:您没有安装软件的权限" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "无法安装 %s:电池电量太低" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "无法安装更新:磁盘空间不足" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "无法安装更新:需要身份验证" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "无法安装更新:身份验证无效" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "无法更新 %s:您没有更新软件的权限" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "无法更新更新:您没有更新软件的权限" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "无法安装更新:需要交流电源" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "无法更新 %s:电池电量太低" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "无法安装更新:电池电量太低" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "无法升级到 %s:需要互联网连接,但互联网连接不可用" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "无法升级到 %s:您没有升级的权限" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "无法升级到 %s:电池电量太低" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "无法移除 %s:需要身份验证" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "无法移除 %s:身份验证无效" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "无法移除 %s:您没有移除软件的权限" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "无法移除 %s:需要交流电源" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "无法移除 %s:电池电量太低" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "无法移除 %s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "无法安装文件:不支持" + +#~ msgid "Failed to install: not supported" +#~ msgstr "无法安装:不支持" + +#~ msgid "AC power is required" +#~ msgstr "需要交流电源" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "流量计费网络 - 自动更新已暂停" + +#~ msgid "Find Out _More" +#~ msgstr "了解更多(_M)" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "重要的软件更新已经准备好安装。" + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "重要:关键软件更新正在等待。" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "为了避免收费和网络限制,软件更新不会在移动或计量连接上自动下载。" + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "在可能的情况下,在后台下载和安装软件更新" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "只显示自由应用(_F)" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "仅显示自由许可的应用并隐藏任何专有应用" + +#~ msgid "Loading update description, please wait…" +#~ msgstr "正在加载更新描述,请稍等…" + +#~ msgid "Downloading featured images…" +#~ msgstr "正在下载特别推荐的图像…" + +#~ msgid "Show verbose debugging information" +#~ msgstr "显示详细的调试信息" + +#~ msgid "Can access arbitrary files" +#~ msgstr "可访问任意文件" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "您确定要卸载 %s 吗?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "%s 将被卸载,想再次使用它您必须重新安装。" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "最后一次系统上线并获取了更新的时间戳" + +#~ msgid "An application" +#~ msgstr "应用程序" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "此软件不提供您使用的语言的支持;它将使用美式英文界面显示。" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "选中的附加组件将随应用程序一起安装。" + +#~ msgid "Applications" +#~ msgstr "应用程序" + +#~ msgid "_Continue" +#~ msgstr "继续(_C)" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u 款应用程序" + +#~ msgid "Post Review" +#~ msgstr "发布评论" + +#~ msgid "_Post" +#~ msgstr "发布(_P)" + +#~ msgid "Rating" +#~ msgstr "评分" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "给您的评论一段简短的摘要,例如:“很棒的应用,推荐使用”。" + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "评论" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "您认为该应用怎么样?尝试为您的意见列出理由。" + +#~ msgid "No screenshot provided" +#~ msgstr "没有截图" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "立即重启" + +#~ msgid "Primary Menu" +#~ msgstr "主菜单" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "更新" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "不再支持 %s %s。" + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "这意味着它不会收到安全更新。" + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "建议您升级到更新的版本。" + +#~ msgid "Update All" +#~ msgstr "全部更新" + +#~ msgid "Application Updates" +#~ msgstr "应用程序更新" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME 浏览器" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "此系统未安装过更新。" + +#~ msgid "Application manager for GNOME" +#~ msgstr "GNOME 应用程序管理器" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Name" +#~ msgstr "名称" + +#~ msgid "user" +#~ msgstr "用户" + +#~ msgid "Channel" +#~ msgstr "频道" + +#~ msgid "Branch" +#~ msgstr "分支" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "安装位置" + +#~ msgid "Version" +#~ msgstr "版本" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "正在下载软件目录" + +#~ msgid "Access arbitrary files" +#~ msgstr "访问任意文件" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "可以访问文件系统上的任意文件" + +#~ msgid "A list of popular applications" +#~ msgstr "热门应用程序列表" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "要使用的应用程序列表,覆盖系统定义。" + +#~ msgid "Checking…" +#~ msgstr "正在检查……" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "Loading…" +#~ msgstr "正在加载……" + +#~ msgid "Downloading application ratings…" +#~ msgstr "正在下载应用程序评分……" + +#~ msgid "The URI that references the background for an upgrade banner." +#~ msgstr "升级横幅背景所引用的 URI。" + +#~ msgid "" +#~ "The URI can contain up to three '%u', which will be replaced by the " +#~ "upgrade version." +#~ msgstr "URI 可以包含三个“%u”,它们会被替换为升级版本。" + +#~ msgid "Welcome" +#~ msgstr "欢迎" + +#~ msgid "Welcome to Software" +#~ msgstr "欢迎使用" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "“软件”让您在一个地方安装所有软件。请查看我们的推荐,浏览分类或者搜索想要的" +#~ "软件。" + +#~ msgid "_Browse Software" +#~ msgstr "浏览软件(_B)" + +#~ msgid "_Add shortcut" +#~ msgstr "添加快捷方式(_A)" + +#~ msgid "Re_move shortcut" +#~ msgstr "移除快捷方式(_M)" + +#~ msgid "OS Updates" +#~ msgstr "操作系统更新" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "包括性能、稳定性及安全改进。" + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "正在下载固件更新签名……" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "正在下载固件更新元数据……" + +#~ msgid "Software has unknown permissions" +#~ msgstr "软件所需权限未知" + +#~ msgid "Software comes from a trusted source" +#~ msgstr "软件由可信来源提供" + +#~ msgid "Unknown Permissions" +#~ msgstr "未知权限" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "该应用所需的权限未知" + +#~ msgid "App comes from a trusted source" +#~ msgstr "应用来源可信" + +#~ msgid "Your distribution has verified that this app can be trusted" +#~ msgstr "您的发行版已经验证了此应用可被信任" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "显示安装非自由软件源的提示" + +#~ msgid "Not optimized for touch devices or phones" +#~ msgstr "未针对触屏设备或手机进行优化" + +#~ msgid "Editor’s Picks" +#~ msgstr "编辑精选" + +#~ msgid "Recently Updated" +#~ msgstr "最近更新" + +#~ msgid "_Read More" +#~ msgstr "阅读更多信息(_R)" + +#~ msgid "_Read Less" +#~ msgstr "阅读简略信息(_R)" + +#~ msgid "_Launch" +#~ msgstr "启动(_L)" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "未知" + +#~ msgid "Localized in your Language" +#~ msgstr "本地语言" + +#~ msgid "Release Activity" +#~ msgstr "发行活动" + +#~ msgid "Developer" +#~ msgstr "开发者" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "已卸载" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "已安装" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "已更新" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "未知" + +#~ msgid "History" +#~ msgstr "历史" + +#~ msgid "More…" +#~ msgstr "更多…" + +#~ msgid "Recommended Games" +#~ msgstr "推荐的游戏" + +#, fuzzy +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Creation Applications" +#~ msgstr "推荐的图形类应用" + +#, fuzzy +#~| msgid "Recommended Graphics Applications" +#~ msgid "Recommended Work Applications" +#~ msgstr "推荐的图形类应用" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "某些软件使用专有协议,因而对使用、分享及源代码访问有限制。" + +#~ msgid "Find out more…" +#~ msgstr "了解更多…" + +#~ msgid "Recent Releases" +#~ msgstr "最近发布版本" + +#~ msgid "Remove “%s”?" +#~ msgstr "确定要移除“%s”吗?" + +#~ msgid "Disable “%s”?" +#~ msgstr "确定要禁用“%s”吗?" + +#~ msgid "No Additional Repositories" +#~ msgstr "没有更多软件源" + +#~ msgid "_Remove…" +#~ msgstr "移除(_R)…" + +#~ msgid "_Disable…" +#~ msgstr "禁用(_D)…" + +#~ msgid "Disabling" +#~ msgstr "正在禁用" + +#~ msgid "Enabled" +#~ msgstr "已启用" + +#~ msgid "Disabled" +#~ msgstr "已禁用" + +#~ msgid "_Remove All" +#~ msgstr "全部移除(_R)" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "更新将在计算机重启后应用。" + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "正在等待下载 %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "正在下载 %s %s" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgid "Audio & Video" +#~ msgstr "影音" + +#~ msgid "Developer Tools" +#~ msgstr "开发工具" + +#~ msgid "Education & Science" +#~ msgstr "教育与科学" + +#~ msgid "Games" +#~ msgstr "游戏" + +#~ msgid "Graphics & Photography" +#~ msgstr "图像与摄影" + +#~ msgid "Productivity" +#~ msgstr "生产力" + +#~ msgid "Communication & News" +#~ msgstr "通信与新闻" + +#~ msgid "Utilities" +#~ msgstr "实用工具" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "无法确认此应用程序可以访问系统的哪一部分。这是旧版应用程序的特征。" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "低" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "中" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "高" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "未知" + +#~ msgid "Public domain" +#~ msgstr "公有领域" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://zh.wikipedia.org/wiki/公有领域" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw.zh-cn" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "用户受以下许可证的约束:" + +#~ msgid "Sandboxed" +#~ msgstr "隔离环境" + +#~ msgid "Category" +#~ msgstr "软件分类" + +#~ msgid "Free" +#~ msgstr "自由" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "未知" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "这表示该软件可以被自由地运行、复制、分发、研究和修改。" + +#~ msgid "Proprietary Software" +#~ msgstr "专有软件" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "这表示该软件由个人或公司拥有。对该软件的使用常常伴有限制而且它的源码通常也" +#~ "无法被获取。" + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "该软件的发行协议未知。" + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "该应用程序被分到此级因为它包含:" + +#~ msgid "No details were available for this rating." +#~ msgstr "没有对应此分级可用的详细信息。" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "推荐的影音应用" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "推荐的生产力应用" + +#~ msgid "ratings in total" +#~ msgstr "评分总计" + +#~ msgid "%s (needs attention)" +#~ msgstr "%s(需要注意)" + +#~ msgid "Setting Up Updates…" +#~ msgstr "正在设置更新……" + +#~ msgid "Looking for New Updates…" +#~ msgstr "正在查找新更新……" + +#~ msgid "Select All" +#~ msgstr "全选" + +#~ msgid "Select None" +#~ msgstr "全不选" + +#~ msgid "Featured %s" +#~ msgstr "特色 %s 软件" + +#~ msgid "Show" +#~ msgstr "显示" + +#~ msgid "Subcategories filter menu" +#~ msgstr "子分类过滤菜单" + +#~ msgid "Sort" +#~ msgstr "排序" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "子分类排序菜单" + +#~ msgid "Software is up to date" +#~ msgstr "软件已为最新" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS 是一款提供应用程序用户评价的服务" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "启用 GNOME Shell 扩展源" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "动画角色处于危险境地" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "动画角色处于激烈冲突" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "包含动画角色的写实暴力" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "角色处于易于与现实区分的危险境地" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "角色参与易于与现实区分的激烈冲突" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "角色参与易于与现实区分的写实暴力" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "较逼真角色处于危险境地" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "描写逼真角色参与激烈冲突" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "逼真角色参与的写实暴力" + +#~ msgid "No bloodshed" +#~ msgstr "无流血" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "不逼真的血" + +#~ msgid "Realistic bloodshed" +#~ msgstr "逼真的血" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "描写流血及肢体伤害" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "强奸及其他暴力的性行为" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "对酒精饮料的暗示" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "饮用酒精饮料" + +#~ msgid "References to illicit drugs" +#~ msgstr "对非法药物的暗示" + +#~ msgid "Use of illicit drugs" +#~ msgstr "吸食非法药物" + +#~ msgid "References to tobacco products" +#~ msgstr "对烟草产品的暗示" + +#~ msgid "Use of tobacco products" +#~ msgstr "吸食烟草产品" + +#~ msgid "Brief artistic nudity" +#~ msgstr "短暂且艺术性的裸体" + +#~ msgid "Prolonged nudity" +#~ msgstr "长时间的裸体描写" + +#~ msgid "Provocative references or depictions" +#~ msgstr "挑衅性暗示或描写" + +#~ msgid "Sexual references or depictions" +#~ msgstr "性暗示或描写" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "生动的性行为" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "少量粗俗语言" + +#~ msgid "Moderate use of profanity" +#~ msgstr "中等数量的粗俗语言" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "大量粗俗语言" + +#~ msgid "Slapstick humor" +#~ msgstr "闹剧式笑话" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "粗俗或浴室笑话" + +#~ msgid "Mature or sexual humor" +#~ msgstr "荤笑话" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "对特定人群负面的语言" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "伤害情感的歧视性语言" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "针对性别、性向、种族或宗教的歧视性语言" + +#~ msgid "Product placement" +#~ msgstr "植入式广告" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "对特定产品的品牌或商标的明显暗示" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "鼓励用户购买特定的真实商品" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "通过随机事件使用游戏票券赌博" + +#~ msgid "Gambling using “play” money" +#~ msgstr "使用游戏货币赌博" + +#~ msgid "Gambling using real money" +#~ msgstr "使用真实货币赌博" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "鼓励用户捐赠真实货币" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "应用中可使用真实货币" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "在用户之间不带聊天功能的交互功能" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "在用户之间受监控的聊天功能" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "在用户之间不受控制的音频或视频聊天功能" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "共享社交网络的用户名或电子邮件地址" + +#~ msgid "Checking for the latest application version" +#~ msgstr "正在检查最新应用程序版本" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "分享无法识别用户身份的诊断数据" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "分享可以识别用户身份的信息" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "与其他用户共享物理位置" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "对同性恋的间接暗示" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "同性别人类之间的亲吻" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "含有同性别人类之间性行为的图像" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "对卖淫的间接暗示" + +#~ msgid "Direct references to prostitution" +#~ msgstr "对卖淫的直接暗示" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "卖淫行为的图像描写" + +#~ msgid "Indirect references to adultery" +#~ msgstr "对通奸的间接暗示" + +#~ msgid "Direct references to adultery" +#~ msgstr "对通奸的直接暗示" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "通奸的图像描写" + +#~ msgid "Scantily clad human characters" +#~ msgstr "穿着暴露的人类角色" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "具有明显性暗示的人类角色" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "亵渎历史的描写或暗示" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "对当代人类亵渎的描写" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "亵渎当代社会的图像描写" + +#~ msgid "Visible dead human remains" +#~ msgstr "有可见死亡人类尸体" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "有死亡人类尸体并展示其内容物" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "对亵渎人体行为的图像描写" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "对历史上奴役行为的描写或暗示" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "对当代奴役行为的描写" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "对当代奴役行为的图片描写" + +#~ msgid "General" +#~ msgstr "常规" + +#~ msgid "ALL" +#~ msgstr "全部" + +#~ msgid "Teen" +#~ msgstr "青少年" + +#~ msgid "Everyone 10+" +#~ msgstr "十岁及以上" + +#~ msgid "Everyone" +#~ msgstr "任何人" + +#~ msgid "Early Childhood" +#~ msgstr "儿童" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "未知" + +#~ msgid "this website" +#~ msgstr "这个网站" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "去逛逛(_L)" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "已移除" + +#~ msgid "Format" +#~ msgstr "格式" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "您确定要移除 %s 吗?" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "此应用程序需要重启才能使用新插件。" + +#~ msgid "Security Updates Pending" +#~ msgstr "等待的安全更新" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "建议您现在安装重要更新" + +#~ msgid "Restart & Install" +#~ msgstr "重启并安装" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "重要系统和应用程序更新安装准备就绪" + +#~ msgid "View" +#~ msgstr "查看" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%p %l:%M" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "昨天%p,%l:%M" + +#~ msgid "Three days ago" +#~ msgstr "三天前" + +#~ msgid "Four days ago" +#~ msgstr "四天前" + +#~ msgid "Five days ago" +#~ msgstr "五天前" + +#~ msgid "Six days ago" +#~ msgstr "六天前" + +#~ msgid "Two weeks ago" +#~ msgstr "两周前" + +#~ msgid "About %s" +#~ msgstr "关于 %s" + +#~ msgid "%s ME" +#~ msgstr "%s 管理引擎(ME)" + +#~ msgid "Show the folder management UI" +#~ msgstr "显示文件夹管理界面" + +#~ msgid "Folder Name" +#~ msgstr "目录名" + +#~ msgid "_Add" +#~ msgstr "添加(_A)" + +#~ msgid "Add to Application Folder" +#~ msgstr "添加到应用程序文件夹" + +#~ msgid "Top Rated" +#~ msgstr "最受欢迎" + +#~ msgid "Extension Settings" +#~ msgstr "扩展设置" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "使用扩展时风险自负。如果您遇到了系统问题,推荐禁用这些扩展。" + +#~ msgid "Failed to load components" +#~ msgstr "加载组件失败" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS 验证正确!" + +#~ msgid "Failed to load file" +#~ msgstr "加载文件失败" + +#~ msgid "Unsaved changes" +#~ msgstr "未保存的更改" + +#~ msgid "The application list is already loaded." +#~ msgstr "应用程序列表已加载。" + +#~ msgid "Merge documents" +#~ msgstr "合并文档" + +#~ msgid "Throw away changes" +#~ msgstr "放弃更改" + +#~ msgid "Open AppStream File" +#~ msgstr "打开 AppStream 文件" + +#~ msgid "Save AppStream File" +#~ msgstr "保存 AppStream 文件" + +#~ msgid "_Save" +#~ msgstr "保存(_S)" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s 的横幅设计已删除。" + +#~ msgid "Banner design deleted." +#~ msgstr "横幅设计已删除。" + +#~ msgid "The application list has unsaved changes." +#~ msgstr "应用程序列表有未保存的更改。" + +#~ msgid "Use verbose logging" +#~ msgstr "使用详细日志记录" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME 软件横幅设计工具" + +#~ msgid "No Designs" +#~ msgstr "无设计" + +#~ msgid "Error message here" +#~ msgstr "此处为错误消息" + +#~ msgid "Category Featured" +#~ msgstr "特色分类" + +#~ msgid "Undo" +#~ msgstr "撤销" + +#~ msgid "Banner Designer" +#~ msgstr "横幅设计工具" + +#~ msgid "New Banner" +#~ msgstr "新横幅" + +#~ msgid "Import from file" +#~ msgstr "从文件导入" + +#~ msgid "Export to file" +#~ msgstr "导出到文件" + +#~ msgid "Spacing" +#~ msgstr "间距" + +#~ msgid "The amount of space between children" +#~ msgstr "子部件间的间距总和" + +#~ msgid "Click on items to select them" +#~ msgstr "点击项目来选择它们" + +#~ msgid "Select" +#~ msgstr "选择" + +#~ msgid "_Add to Folder…" +#~ msgstr "添加到文件夹(_A)…" + +#~ msgid "_Move to Folder…" +#~ msgstr "移动到文件夹(_M)…" + +#~ msgid "_Remove from Folder" +#~ msgstr "从文件夹移除(_R)" + +#~ msgid "Featured Applications" +#~ msgstr "特色应用" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "为“GNOME 软件”设计特色横幅" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;软件;应用;" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell 扩展" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "GNOME Shell 扩展软件源" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "正在下载 shell 扩展元数据…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell 扩展" + +#~ msgid "_All" +#~ msgstr "全部(_A)" + +#~ msgid "Sign In / Register…" +#~ msgstr "登录/注册…" + +#~ msgid "Continue" +#~ msgstr "继续" + +#~ msgid "Use" +#~ msgstr "使用" + +#~ msgid "Add another…" +#~ msgstr "添加另一个…" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "将安装 %s,您将扣费 %s。" + +#~ msgid "A$%.2f" +#~ msgstr "澳大利亚元 $%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "加拿大元$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "人民币 %.2f" + +#~ msgid "€%.2f" +#~ msgstr "欧元 %.2f" + +#~ msgid "£%.2f" +#~ msgstr "英镑 %.2f" + +#~ msgid "¥%.2f" +#~ msgstr "日元 %.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "新西兰元 %.2f" + +#~ msgid "₽%.2f" +#~ msgstr "俄罗斯卢布 %.2f" + +#~ msgid "US$%.2f" +#~ msgstr "美元 %.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "已登录为 %s" + +#~ msgid "Sign in…" +#~ msgstr "登录…" + +#~ msgid "Sign out" +#~ msgstr "登出" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "无法购买 %s:需要身份验证" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "无法购买 %s:身份验证无效" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "无法购买 %s:未设置付款方式" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "无法购买 %s:付款被拒绝" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "请使用 Ubuntu One 帐号以继续。" + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "需要使用你的 Ubuntu One 帐号以继续。" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Show profiling information for the service" +#~ msgstr "显示服务分析信息" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "需要登录到 %s 以继续。" + +#~ msgid "Email address" +#~ msgstr "电子邮件地址" + +#~ msgid "I have an account already" +#~ msgstr "我已有帐号" + +#~ msgid "I want to register for an account now" +#~ msgstr "我希望现在注册帐号" + +#~ msgid "Sign in automatically next time" +#~ msgstr "下次自动登录" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "输入您的一次性 PIN 以进行双重认证。" + +#~ msgid "PIN" +#~ msgstr "PIN" + +#~ msgid "Authenticate" +#~ msgstr "认证" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "正在载入软件目录" + +#~ msgid "_About" +#~ msgstr "关于(_A)" + +#~ msgid "_Quit" +#~ msgstr "退出(_Q)" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "可在网络上找到关于 %s 及如何获取播放该格式的编解码器的信息。" + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "没有解决了这个问题之前无法安装。" + +#~ msgid "For more information, visit %s." +#~ msgstr "更多信息请访问 %s。" + +#~ msgid "Unable to update %s from %s" +#~ msgstr "无法从 %2$s 更新 %1$s" + +#~ msgid "Downloading new updates…" +#~ msgstr "正在下载最新的更新…" + +#~ msgid "Restart & _Install" +#~ msgstr "重启并安装(_I)" + +#~ msgid "Getting runtime source…" +#~ msgstr "正在获取运行库源…" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "Limba 提供给开发者一个轻松创建软件组合包的方法" + +#~ msgid "Downloading application page…" +#~ msgstr "正在下载应用程序页面…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "来自 Valve 的终极娱乐平台" + +#~ msgid "Sorted by Name" +#~ msgstr "按名称排序" + +#~ msgid "Sorted by Rating" +#~ msgstr "按评分排序" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "之前开启的额外来源列表" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "之前开启的,用于安装第三方应用程序的额外来源列表。" + +#~ msgid "Show non-free software in search results" +#~ msgstr "在搜索结果里显示非自由软件" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "可选启用的非自由软件列表" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "启用专有软件源?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "未安装应用程序或扩展;可能还有其他软件" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "通常在使用和源码的获取上有限制。" + +#~ msgid "Proprietary Software Sources" +#~ msgstr "专有软件源" + +#~ msgid "Remove Source" +#~ msgstr "移除源" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "软件源可以从网络上下载程序。他们让您能访问未由 %s 提供的额外软件。" + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "移除源将会移除您从该源安装的任何软件。" + +#~ msgid "No software installed from this source" +#~ msgstr "没有软件是从这个源安装的" + +#~ msgid "Installed from this Source" +#~ msgstr "从这个源安装的软件" + +#~ msgid "Last Checked" +#~ msgstr "上次检查" + +#~ msgid "Added" +#~ msgstr "已添加" + +#~ msgid "Website" +#~ msgstr "网站" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "在玩家之间不带聊天功能的预设交互" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "与第三方共享用户信息" + +#~ msgid "page1" +#~ msgstr "第一页" + +#~ msgid "page2" +#~ msgstr "第二页" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "特别推荐" + +#~ msgid "“%s” [%s]" +#~ msgstr "“%s” [%s]" + +#~ msgid "Total" +#~ msgstr "总计" + +#~ msgid "Could not find '%s'" +#~ msgstr "找不到 %s" + +#~ msgid "Installation of %s failed." +#~ msgstr "安装 %s 失败。" + +#~ msgid "Removal of %s failed." +#~ msgstr "移除 %s 失败。" + +#~ msgid "Upgrade to %s failed." +#~ msgstr "升级到 %s 失败。" + +#~ msgid "Internet access was required but wasn’t available." +#~ msgstr "需要互联网连接,但其不可用。" + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "请确认您已接入互联网并重试。" + +#~ msgid "There wasn’t enough disk space." +#~ msgstr "磁盘空间不足。" + +#~ msgid "Please free up some space and try again." +#~ msgstr "请释放一些空间后再试一次。" + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "如问题依然存在,请联系您的软件提供商。" + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "特色软件" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "特色软件" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "天文学" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "化学" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "数学" + +#~ msgid "Science" +#~ msgstr "科学" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "软件源可以让您获取基他软件。" + +#~ msgid "3rd party" +#~ msgstr "第三方" + +#~ msgid "nonfree" +#~ msgstr "非自由" + +#~ msgid "shell extension" +#~ msgstr "GNOME Shell 扩展" + +#~ msgid "_Installing" +#~ msgstr "正在安装(_I)" + +#~ msgid "_Removing" +#~ msgstr "正在移除(_P)" + +#~ msgid " or " +#~ msgstr " 或 " + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "未知" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "该软件来自第三方。" + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "该软件来自第三方而且可能包含非自由组件。" + +#~ msgid "This software may contain non-free components." +#~ msgstr "该软件可能包含非自由组件。" + +#~ msgid "non-free" +#~ msgstr "非自由" + +#~ msgid "One Star" +#~ msgstr "一星" + +#~ msgid "Two Stars" +#~ msgstr "二星" + +#~ msgid "Three Stars" +#~ msgstr "三星" + +#~ msgid "Four Stars" +#~ msgstr "四星" + +#~ msgid "Five Stars" +#~ msgstr "五星" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "未知" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "无分类" + +#~ msgid "_History" +#~ msgstr "历史(_H)" + +#~ msgid "Size" +#~ msgstr "大小" + +#~ msgid "Recommended Office Applications" +#~ msgstr "推荐的办公应用" + +#~ msgid "Audio" +#~ msgstr "音频" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "编辑" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "数据库" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "光盘刻录" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "业余无线电" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "混音器" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "音乐" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "录音机" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "音序器" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "调谐器" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "实时构建" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "数据库" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "性能分析" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "项目管理" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "网络开发" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "生物学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "计算机科学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "数据可视化" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "经济学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "电力学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "电子学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "工程学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "地质学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "地球科学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "历史学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "图像处理" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "文学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "地图" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "音乐" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "数值分析" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "并行计算" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "物理学" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "灵性(宗教)" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "射击" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "模拟" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "竞技" + +#~ msgid "Graphics" +#~ msgstr "图形" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D 图形" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "光学字符识别" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "出版" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "光栅图形" + +#~ msgid "Internet" +#~ msgstr "互联网" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "拨号" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "邮件" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "消息订阅" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "文件传输" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "业余无线电" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "即时通讯" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC 客户端" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "监视器" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "电话" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "网络开发" + +#~ msgid "Office" +#~ msgstr "办公" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "图表" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "联系人管理" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "字典" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "电子邮件" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "流程图" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "摄影" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "项目管理" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "出版" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "电子表格" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "查看器" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "艺术" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "人工智能" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "天文学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "生物学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "化学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "计算机科学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "建筑学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "数据可视化" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "经济学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "电力学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "电子学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "工程学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "地理学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "地质学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "地球科学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "历史学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "人文学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "图像处理" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "语言学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "文学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "地图" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "数学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "医学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "数值分析" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "并行计算" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "物理学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "机器人学" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "灵性(宗教)" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "体育" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "模拟器" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "文件管理器" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "文件工具" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "监视器" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "安全" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "虚拟终端" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "辅助功能" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "归档管理" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "计算器" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "时钟" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "压缩" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "文件工具" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "地图" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "灵性(宗教)" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "电话通讯工具" + +#~ msgid "Video" +#~ msgstr "视频" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "编辑" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "数据库" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "光盘刻录" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "录影机" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "电视" + +#~ msgid "No AppStream data found" +#~ msgstr "未找到 AppStream 数据" diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100644 index 0000000..bc92dcf --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,2086 @@ +# Chinese (Hong Kong) translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"software&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-08-30 19:40+0000\n" +"PO-Revision-Date: 2014-08-31 15:55+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (Hong Kong) \n" +"Language: zh_HK\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.3\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:1 +msgid "Application manager for GNOME" +msgstr "為 GNOME 設計的應用程式管理員" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:2 +msgid "" +"Software allows you to find and install new applications and system " +"extensions and remove existing installed applications." +msgstr "《軟件》讓你可以找尋、安裝新程式與系統擴充套件,以及移除所安裝的應用程式。" + +#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:3 +msgid "" +"GNOME Software showcases featured and popular applications with useful " +"descriptions and multiple screenshots per application. Applications can be " +"found either through browsing the list of categories or by searching. It " +"also allows you to update your system using an offline update." +msgstr "GNOME Software 陳列各種具有特色,以及廣受歡迎的應用程式,並附上有用的描述與多張螢幕擷圖。除了瀏覽類別清單之外,你還可以透過搜尋的方式來找出想要的應用程式。此外,它也可讓你採用離線更新的方式更新系統。" + +#: ../src/app-folder-dialog.ui.h:1 +msgid "Add to Application Folder" +msgstr "加入到應用程式資料夾中" + +#: ../src/app-folder-dialog.ui.h:2 ../src/gs-app-folder-dialog.c:337 +#: ../src/gs-shell-details.c:232 ../src/gs-shell-installed.c:580 +msgid "_Cancel" +msgstr "取消(_C)" + +#: ../src/app-folder-dialog.ui.h:3 ../src/gs-app-folder-dialog.c:342 +msgid "_Add" +msgstr "加入(_A)" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is installed +#: ../src/app-tile.ui.h:1 ../src/gs-app-addon-row.c:103 +#: ../src/gs-app-tile.c:72 ../src/gs-app-tile.c:75 ../src/gs-feature-tile.c:66 +#: ../src/gs-popular-tile.c:73 ../src/gs-popular-tile.c:76 +#: ../src/popular-tile.ui.h:1 +msgid "Installed" +msgstr "已安裝" + +#. TRANSLATORS: this is the application name +#. set the window title back to default +#. TRANSLATORS: this is the main window title +#: ../src/org.gnome.Software.desktop.in.h:1 ../src/gnome-software.ui.h:3 +#: ../src/gs-application.c:265 ../src/gs-shell.c:156 +msgid "Software" +msgstr "軟件" + +#: ../src/org.gnome.Software.desktop.in.h:2 +msgid "Add, remove or update software on this computer" +msgstr "在這臺電腦上加入、移除,或更新軟件" + +#: ../src/org.gnome.Software.desktop.in.h:3 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;;更新;升級;來源;套件庫;軟件庫;倉庫;偏好設定;安裝;解除安裝;程式;軟件;應用;商店;" + +#: ../src/gnome-software-local-file.desktop.in.h:1 +msgid "Software Install" +msgstr "軟件安裝" + +#: ../src/gnome-software-local-file.desktop.in.h:2 +msgid "Install selected software on the system" +msgstr "安裝選取的軟件到系統中" + +#: ../src/gnome-software.ui.h:1 +msgid "Select All" +msgstr "全選" + +#: ../src/gnome-software.ui.h:2 +msgid "Select None" +msgstr "全不選" + +#. vim: set noexpandtab: +#: ../src/gnome-software.ui.h:4 ../src/gs-sources-dialog.ui.h:2 +#: ../src/gs-update-dialog.ui.h:1 +msgid "Go back" +msgstr "返回" + +#. Translators: A label for a button to show all available software. +#: ../src/gnome-software.ui.h:6 +msgid "_All" +msgstr "全部(_A)" + +#. Translators: A label for a button to show only software which is already installed. +#: ../src/gnome-software.ui.h:8 +msgid "_Installed" +msgstr "已安裝(_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: ../src/gnome-software.ui.h:10 +msgid "_Updates" +msgstr "更新(_U)" + +#: ../src/gnome-software.ui.h:11 +msgid "Restart & _Install" +msgstr "重新啟動並安裝(_I)" + +#: ../src/gnome-software.ui.h:12 +msgid "Select" +msgstr "選取" + +#: ../src/gnome-software.ui.h:13 +msgid "Check for updates" +msgstr "檢查軟件更新" + +#: ../src/gs-app-folder-dialog.c:325 +msgid "Folder Name" +msgstr "資料夾名稱" + +#. TRANSLATORS: this is the title of the about window +#: ../src/gs-application.c:263 +msgid "About Software" +msgstr "關於《軟件》" + +#. TRANSLATORS: well, we seem to think so, anyway +#: ../src/gs-application.c:268 +msgid "A nice way to manage the software on your system." +msgstr "管理系統中軟件的絕佳方式。" + +#: ../src/gs-application.c:272 +msgid "translator-credits" +msgstr "Cheng-Chia Tseng , 2013-14." + +#: ../src/gs-application.c:531 +msgid "Enter GApplication service mode" +msgstr "請輸入 GApplication 服務模式" + +#. TRANSLATORS: this is a command line option +#: ../src/gs-application.c:534 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "初始啟動模式:可以是「updates」(更新)、「updated」(已更新)、「installed」(已安裝) 或「overview」(概覽)" + +#: ../src/gs-application.c:534 +msgid "MODE" +msgstr "模式" + +#: ../src/gs-application.c:536 +msgid "Search for applications" +msgstr "搜尋用程式" + +#: ../src/gs-application.c:536 +msgid "SEARCH" +msgstr "搜尋" + +#: ../src/gs-application.c:538 +msgid "Show application details" +msgstr "顯示應用程式細節" + +#: ../src/gs-application.c:538 +msgid "ID" +msgstr "ID" + +#: ../src/gs-application.c:540 +msgid "Open a local package file" +msgstr "開啟本機軟件包檔案" + +#: ../src/gs-application.c:540 +msgid "FILENAME" +msgstr "FILENAME" + +#: ../src/gs-application.c:542 +msgid "Show verbose debugging information" +msgstr "詳細顯示除錯用訊息" + +#: ../src/gs-application.c:544 +msgid "Show profiling information for the service" +msgstr "顯示該服務的評測資訊" + +#: ../src/gs-application.c:546 +msgid "Prefer local file sources to AppStream" +msgstr "AppStream 偏好使用本地端檔案來源" + +#. TRANSLATORS: this is a label that describes an application +#. * that has been queued for installation +#: ../src/gs-app-addon-row.c:98 ../src/gs-app-row.c:201 +#: ../src/gs-shell-details.ui.h:4 +msgid "Pending" +msgstr "擱置中" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being installed +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being installing +#: ../src/gs-app-addon-row.c:107 ../src/gs-app-row.c:228 +#: ../src/gs-app-tile.c:81 ../src/gs-app-tile.c:84 +msgid "Installing" +msgstr "安裝中" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an application being erased +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user the application is being removed +#: ../src/gs-app-addon-row.c:111 ../src/gs-app-row.c:237 +#: ../src/gs-app-tile.c:90 ../src/gs-app-tile.c:93 +msgid "Removing" +msgstr "移除中" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-row.c:191 +msgid "Visit website" +msgstr "造訪網站" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the application +#: ../src/gs-app-row.c:198 +msgid "Cancel" +msgstr "取消" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily installed +#: ../src/gs-app-row.c:208 +msgid "Install" +msgstr "安裝" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the application to be easily removed +#. TRANSLATORS: this is button text to remove the application +#: ../src/gs-app-row.c:217 ../src/gs-shell-details.c:1114 +#: ../src/gs-shell-installed.c:182 ../src/gs-shell-search.c:162 +msgid "Remove" +msgstr "移除" + +#. TRANSLATORS: this is the small blue label on the tile +#. * that tells the user there is an update for the installed +#. * application available +#: ../src/gs-app-tile.c:99 ../src/gs-app-tile.c:103 +#: ../src/gs-feature-tile.c:71 ../src/gs-popular-tile.c:82 +#: ../src/gs-popular-tile.c:86 +msgid "Updates" +msgstr "更新" + +#. TRANSLATORS: this is where all applications that don't +#. * fit in other groups are put +#: ../src/gs-category.c:215 +msgid "Other" +msgstr "其他" + +#. vim: set noexpandtab: +#: ../src/gs-first-run-dialog.ui.h:1 +msgid "Welcome" +msgstr "歡迎" + +#: ../src/gs-first-run-dialog.ui.h:2 +msgid "Welcome to Software" +msgstr "歡迎使用《軟件》" + +#: ../src/gs-first-run-dialog.ui.h:3 +msgid "" +"Software lets you install all the software you need, all from one place. See " +"our recommendations, browse the categories, or search for the applications " +"you want." +msgstr "《軟件》讓你安裝所有你需要的軟件,在一個地方滿足所有需求。請看看我們的推薦項目,瀏覽各項分類,或是直接搜尋你想要使用的應用程式。" + +#: ../src/gs-first-run-dialog.ui.h:4 +msgid "_Let’s Go Shopping" +msgstr "出發去購物(_L)" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was removed +#: ../src/gs-history-dialog.c:82 +msgctxt "app status" +msgid "Removed" +msgstr "已移除" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was installed +#: ../src/gs-history-dialog.c:88 +msgctxt "app status" +msgid "Installed" +msgstr "已安裝" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing the application was updated +#: ../src/gs-history-dialog.c:93 +msgctxt "app status" +msgid "Updated" +msgstr "已更新" + +#. TRANSLATORS: this is the status in the history UI, +#. * where we are showing that something happened to the +#. * application but we don't know what +#: ../src/gs-history-dialog.c:99 +msgctxt "app status" +msgid "Unknown" +msgstr "不明" + +#. vim: set noexpandtab: +#: ../src/gs-history-dialog.ui.h:1 +msgid "History" +msgstr "歷史" + +#. TRANSLATORS: this is when the offline update failed +#: ../src/gs-offline-updates.c:249 +msgid "Failed To Update" +msgstr "無法更新" + +#. TRANSLATORS: the transaction could not be completed +#. * as a previous transaction was unfinished +#: ../src/gs-offline-updates.c:255 +msgid "A previous update was unfinished." +msgstr "上個更新尚未完成。" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: ../src/gs-offline-updates.c:265 +msgid "Network access was required but not available." +msgstr "需要有網絡存取但卻無法使用。" + +#. TRANSLATORS: if the package is not signed correctly +#. * +#: ../src/gs-offline-updates.c:274 +msgid "An update was not signed in the correct way." +msgstr "有項更新的簽署方式不正確。" + +#. TRANSLATORS: the transaction failed in a way the user +#. * probably cannot comprehend. Package management systems +#. * really are teh suck. +#: ../src/gs-offline-updates.c:284 +msgid "The update could not be completed." +msgstr "無法完成更新。" + +#. TRANSLATORS: the user aborted the update manually +#: ../src/gs-offline-updates.c:289 +msgid "The update was cancelled." +msgstr "更新已取消。" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: ../src/gs-offline-updates.c:295 +msgid "An offline update was requested but no packages required updating." +msgstr "已請求離線更新,但沒有軟件包需要更新。" + +#. TRANSLATORS: we ran out of disk space +#: ../src/gs-offline-updates.c:299 +msgid "No space was left on the drive." +msgstr "裝置剩餘空間不足。" + +#. TRANSLATORS: the update process failed in a general +#. * way, usually this message will come from source distros +#. * like gentoo +#: ../src/gs-offline-updates.c:307 +msgid "An update failed to install correctly." +msgstr "無法正確安裝更新。" + +#. TRANSLATORS: We didn't handle the error type +#: ../src/gs-offline-updates.c:312 +msgid "The offline update failed in an unexpected way." +msgstr "離線更新以不如預期的方式失敗。" + +#. TRANSLATORS: these are geeky messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: ../src/gs-offline-updates.c:321 +msgid "Detailed errors from the package manager follow:" +msgstr "軟件包管理程式的詳細錯誤資訊如下:" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: ../src/gs-plugin-loader.c:900 +msgid "OS Updates" +msgstr "作業系統更新" + +#. TRANSLATORS: this is a longer description of the +#. * os-update item +#: ../src/gs-plugin-loader.c:905 +msgid "Includes performance, stability and security improvements." +msgstr "包括效能、穩定性、安全性等改善。" + +#. TRANSLATORS: this is when we know about an application or +#. * addon, but it can't be listed for some reason +#: ../src/gs-plugin-loader.c:1503 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "沒有可用的 %s 格式附加編解碼器。" + +#: ../src/gs-plugin-loader.c:1506 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format can be found on the website." +msgstr "%s 的相關資訊,以及網站上提供的該如何取得可播放此格式的編解碼器之選項。" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: ../src/gs-screenshot-image.c:220 +msgid "Screenshot not found" +msgstr "找不到螢幕擷圖" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: ../src/gs-screenshot-image.c:238 +msgid "Failed to load image" +msgstr "無法載入影像" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: ../src/gs-screenshot-image.c:366 +msgid "Screenshot size not found" +msgstr "找不到螢幕擷圖的大小" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: ../src/gs-screenshot-image.c:385 +msgid "Could not create cache" +msgstr "無法建立快取" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: ../src/gs-screenshot-image.c:402 +msgid "Screenshot not valid" +msgstr "螢幕擷圖無效" + +#. TRANSLATORS: this is when networking is not available +#: ../src/gs-screenshot-image.c:408 +msgid "Screenshot not available" +msgstr "螢幕擷圖無法使用" + +#: ../src/gs-screenshot-image.c:461 +msgid "Screenshot" +msgstr "螢幕擷圖" + +#. TRANSLATORS: button text in the header when an application +#. * can be installed +#: ../src/gs-shell-details.c:182 ../src/gs-shell-details.ui.h:2 +msgid "_Install" +msgstr "安裝(_I)" + +#. TRANSLATORS: button text in the header when an application +#. * is in the process of being installed +#: ../src/gs-shell-details.c:193 +msgid "_Installing" +msgstr "安裝中(_I)" + +#. TRANSLATORS: button text in the header when an application can be erased +#: ../src/gs-shell-details.c:219 ../src/gs-shell-details.ui.h:3 +msgid "_Remove" +msgstr "移除(_R)" + +#. TRANSLATORS: button text in the header when an application can be installed +#: ../src/gs-shell-details.c:226 +msgid "_Removing" +msgstr "移除中(_R)" + +#. TRANSLATORS: this is where the licence is not known +#: ../src/gs-shell-details.c:591 +msgctxt "license" +msgid "Unknown" +msgstr "不明" + +#. TRANSLATORS: this is where the version is not known +#: ../src/gs-shell-details.c:604 +msgctxt "version" +msgid "Unknown" +msgstr "不明" + +#. TRANSLATORS: this is where the size is being worked out +#: ../src/gs-shell-details.c:610 +msgctxt "size" +msgid "Calculating…" +msgstr "計算中…" + +#. TRANSLATORS: this is where the size is not known +#: ../src/gs-shell-details.c:613 +msgctxt "size" +msgid "Unknown" +msgstr "不明" + +#. TRANSLATORS: this is where the updated date is not known +#: ../src/gs-shell-details.c:625 +msgctxt "updated" +msgid "Never" +msgstr "永不" + +#. TRANSLATORS: this is the application isn't in any +#. * defined menu category +#: ../src/gs-shell-details.c:640 +msgctxt "menu category" +msgid "None" +msgstr "無" + +#. TRANSLATORS: this is where we don't know the origin of the +#. * application +#: ../src/gs-shell-details.c:650 +msgctxt "origin" +msgid "Unknown" +msgstr "不明" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an application summary, e.g. 'GNOME Clocks' +#: ../src/gs-shell-details.c:1099 ../src/gs-shell-installed.c:167 +#: ../src/gs-shell-search.c:147 +#, c-format +msgid "Are you sure you want to remove %s?" +msgstr "你確定要移除 %s?" + +#. TRANSLATORS: longer dialog text +#: ../src/gs-shell-details.c:1111 ../src/gs-shell-installed.c:179 +#: ../src/gs-shell-search.c:159 +#, c-format +msgid "%s will be removed, and you will have to install it to use it again." +msgstr "%s 將被移除,將來若你想使用時則須再次安裝。" + +#. vim: set noexpandtab: +#: ../src/gs-shell-details.ui.h:1 +msgid "Details page" +msgstr "細節頁" + +#: ../src/gs-shell-details.ui.h:5 +msgid "Software Source Included" +msgstr "內含軟件來源" + +#: ../src/gs-shell-details.ui.h:6 +msgid "" +"This application includes a software source which provides updates, as well " +"as access to other software." +msgstr "此應用程式內含可提供更新,並存取其他軟件的軟件來源。" + +#: ../src/gs-shell-details.ui.h:7 +msgid "No Software Source Included" +msgstr "未含軟件來源" + +#: ../src/gs-shell-details.ui.h:8 +msgid "" +"This application does not include a software source. It will not be updated " +"with new versions." +msgstr "此應用程式不含軟件來源。它不會被新版本更新。" + +#: ../src/gs-shell-details.ui.h:9 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "此軟件已經由你的散布版提供,不應替換。" + +#. Translators: a repository file used for installing software has been discovered. +#: ../src/gs-shell-details.ui.h:11 +msgid "Software Source Identified" +msgstr "已識明軟件來源" + +#: ../src/gs-shell-details.ui.h:12 +msgid "" +"Adding this software source will give you access to additional software and " +"upgrades." +msgstr "加入此軟件來源可讓你存取更多軟件與升級。" + +#: ../src/gs-shell-details.ui.h:13 +msgid "Only use software sources that you trust." +msgstr "請務必只使用你信任的軟件來源。" + +#: ../src/gs-shell-details.ui.h:14 +msgid "Internet Only Application" +msgstr "唯互聯網應用程式" + +#: ../src/gs-shell-details.ui.h:15 +msgid "" +"This application can only be used when there is an active internet " +"connection." +msgstr "此類應用程式僅可在有互聯網連線時可以使用。" + +#: ../src/gs-shell-details.ui.h:16 +msgid "_Website" +msgstr "網站(_W)" + +#: ../src/gs-shell-details.ui.h:17 +msgid "_History" +msgstr "歷史(_H)" + +#. Translators: A label for a button to execute the selected application. +#: ../src/gs-shell-details.ui.h:19 +msgid "_Launch" +msgstr "啟動(_L)" + +#: ../src/gs-shell-details.ui.h:20 +msgid "Details" +msgstr "細節" + +#: ../src/gs-shell-details.ui.h:21 ../src/gs-sources-dialog.ui.h:9 +msgid "Version" +msgstr "版本" + +#: ../src/gs-shell-details.ui.h:22 +msgid "Updated" +msgstr "已更新" + +#: ../src/gs-shell-details.ui.h:23 +msgid "Category" +msgstr "類別" + +#: ../src/gs-shell-details.ui.h:24 +msgid "Source" +msgstr "來源" + +#: ../src/gs-shell-details.ui.h:25 +msgid "License" +msgstr "授權" + +#: ../src/gs-shell-details.ui.h:26 +msgid "Size" +msgstr "大小" + +#: ../src/gs-shell-details.ui.h:27 +msgid "Developer" +msgstr "開發者" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the addons +#. TRANSLATORS: this is the main category for Add-ons +#: ../src/gs-shell-details.ui.h:28 ../src/gs-shell-installed.c:492 +#: ../src/gs-update-list.c:88 ../src/plugins/menu-spec-common.c:210 +msgid "Add-ons" +msgstr "附加元件" + +#: ../src/gs-shell-details.ui.h:29 +msgid "Selected add-ons will be installed with the application." +msgstr "選取的附加元件會隨該程式一併安裝。" + +#. TRANSLATORS: This is the header dividing the normal +#. * applications and the system ones +#: ../src/gs-shell-installed.c:482 +msgid "System Applications" +msgstr "系統應用程式" + +#: ../src/gs-shell-installed.c:588 +msgid "Click on items to select them" +msgstr "點按項目可以選取" + +#. vim: set noexpandtab: +#: ../src/gs-shell-installed.ui.h:1 +msgid "Installed page" +msgstr "已安裝頁" + +#: ../src/gs-shell-installed.ui.h:2 +msgid "_Add to Folder…" +msgstr "加入到資料夾中(_A)…" + +#: ../src/gs-shell-installed.ui.h:3 +msgid "_Move to Folder…" +msgstr "移動到資料夾中(_M)" + +#: ../src/gs-shell-installed.ui.h:4 +msgid "_Remove from Folder" +msgstr "從資料夾中移除(_R)" + +#. TRANSLATORS: this is a heading for audio applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:338 +msgid "Recommended Audio Applications" +msgstr "推薦的音訊應用程式" + +#. TRANSLATORS: this is a heading for games which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:343 +msgid "Recommended Games" +msgstr "推薦的遊戲" + +#. TRANSLATORS: this is a heading for graphics applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:348 +msgid "Recommended Graphics Applications" +msgstr "推薦的美工圖形應用程式" + +#. TRANSLATORS: this is a heading for office applications which have been featured ('recommended') by the distribution +#: ../src/gs-shell-overview.c:353 +msgid "Recommended Office Applications" +msgstr "推薦的辦公應用程式" + +#. vim: set noexpandtab: +#: ../src/gs-shell-overview.ui.h:1 +msgid "Overview page" +msgstr "概覽頁" + +#: ../src/gs-shell-overview.ui.h:2 +msgid "Featured Application" +msgstr "特色應用程式" + +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: ../src/gs-shell-overview.ui.h:4 +msgid "Editor's Picks" +msgstr "編輯精選" + +#: ../src/gs-shell-overview.ui.h:5 +msgid "Categories" +msgstr "類別" + +#: ../src/gs-shell-overview.ui.h:6 +msgid "No Application Data Found" +msgstr "找不到應用程式資料" + +#. vim: set noexpandtab: +#: ../src/gs-shell-search.ui.h:1 +msgid "Search page" +msgstr "搜尋頁" + +#: ../src/gs-shell-search.ui.h:2 +msgid "No Application Found" +msgstr "找不到應用程式" + +#. TRANSLATORS: Time in 24h format +#: ../src/gs-shell-updates.c:145 +msgid "%R" +msgstr "%R" + +#. TRANSLATORS: Time in 12h format +#: ../src/gs-shell-updates.c:148 +msgid "%l:%M %p" +msgstr "%p %l:%M" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../src/gs-shell-updates.c:154 +msgid "Yesterday, %R" +msgstr "昨日 %R" + +#. TRANSLATORS: This is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 PM" +#: ../src/gs-shell-updates.c:158 +msgid "Yesterday, %l:%M %p" +msgstr "昨日%p %l:%M" + +#: ../src/gs-shell-updates.c:161 +msgid "Two days ago" +msgstr "兩天前" + +#: ../src/gs-shell-updates.c:163 +msgid "Three days ago" +msgstr "三天前" + +#: ../src/gs-shell-updates.c:165 +msgid "Four days ago" +msgstr "四天前" + +#: ../src/gs-shell-updates.c:167 +msgid "Five days ago" +msgstr "五天前" + +#: ../src/gs-shell-updates.c:169 +msgid "Six days ago" +msgstr "六天前" + +#: ../src/gs-shell-updates.c:171 +msgid "One week ago" +msgstr "一週前" + +#: ../src/gs-shell-updates.c:173 +msgid "Two weeks ago" +msgstr "兩週前" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: ../src/gs-shell-updates.c:177 +msgid "%e %B %Y" +msgstr "%Y年%m月%e日" + +#. TRANSLATORS: the updates are being downloaded +#: ../src/gs-shell-updates.c:196 +msgid "Downloading new updates…" +msgstr "下載新的更新中…" + +#. TRANSLATORS: the update panel is doing *something* vague +#: ../src/gs-shell-updates.c:200 +msgid "Looking for new updates…" +msgstr "尋找新的更新中…" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:254 +msgid "Setting up updates…" +msgstr "設置更新中…" + +#. TRANSLATORS: the updates panel is starting up +#: ../src/gs-shell-updates.c:255 ../src/gs-shell-updates.c:262 +msgid "(This could take a while)" +msgstr "(這可能會花上一段時間)" + +#. TRANSLATORS: this is when the updates panel is starting up +#: ../src/gs-shell-updates.c:268 +msgid "Checking for updates…" +msgstr "正檢查是否有更新…" + +#. TRANSLATORS: This is the time when we last checked for updates +#: ../src/gs-shell-updates.c:402 +#, c-format +msgid "Last checked: %s" +msgstr "上次檢查:%s" + +#. TRANSLATORS: can't do updates check +#: ../src/gs-shell-updates.c:753 +msgid "No Network" +msgstr "沒有網絡" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:757 +msgid "Internet access is required to check for updates." +msgstr "需要存取互聯網以檢查更新。" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:761 +msgid "Network Settings" +msgstr "網絡設定值" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: ../src/gs-shell-updates.c:780 +msgid "Charges may apply" +msgstr "可能需要費用" + +#. TRANSLATORS: we need network +#. * to do the updates check +#: ../src/gs-shell-updates.c:784 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "使用流動寬頻檢查更新,可能讓你負擔額外的數據傳輸費用。" + +#. TRANSLATORS: this is a link to the +#. * control-center network panel +#: ../src/gs-shell-updates.c:788 +msgid "Check Anyway" +msgstr "無論如何都檢查" + +#. vim: set noexpandtab: +#: ../src/gs-shell-updates.ui.h:1 +msgid "Updates page" +msgstr "更新頁" + +#: ../src/gs-shell-updates.ui.h:2 +msgid "Software is up to date" +msgstr "軟件處於最新狀態" + +#: ../src/gs-shell-updates.ui.h:3 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "使用流動寬頻檢查更新,可能讓你負擔額外的數據傳輸費用" + +#: ../src/gs-shell-updates.ui.h:4 +msgid "_Check Anyway" +msgstr "無論如何都檢查(_C)" + +#: ../src/gs-shell-updates.ui.h:5 +msgid "Go online to check for updates" +msgstr "上線以檢查更新" + +#: ../src/gs-shell-updates.ui.h:6 +msgid "_Network Settings" +msgstr "網絡設定值(_N)" + +#. TRANSLATORS: this source has no apps installed from it +#: ../src/gs-sources-dialog.c:91 +msgid "No software installed" +msgstr "未安裝軟件" + +#. TRANSLATORS: this source has some apps installed from it +#: ../src/gs-sources-dialog.c:94 +#, c-format +msgid "%i application installed" +msgid_plural "%i applications installed" +msgstr[0] "已安裝 %i 項應用程式" + +#. TRANSLATORS: this source has some apps installed from it +#: ../src/gs-sources-dialog.c:99 +#, c-format +msgid "%i add-on installed" +msgid_plural "%i add-ons installed" +msgstr[0] "已安裝 %i 個附加元件" + +#. TRANSLATORS: this source has some apps and addons installed from it +#: ../src/gs-sources-dialog.c:104 +#, c-format +msgid "%i application and %i add-ons installed" +msgid_plural "%i applications and %i add-ons installed" +msgstr[0] "已安裝 %i 項應用程式、%i 個附加元件" + +#: ../src/gs-sources-dialog.c:296 ../src/gs-sources-dialog.ui.h:13 +msgid "Remove Source" +msgstr "移除來源" + +#: ../src/gs-sources-dialog.c:311 +msgid "Removing…" +msgstr "移除中…" + +#. vim: set noexpandtab: +#: ../src/gs-sources-dialog.ui.h:1 +msgid "Software Sources" +msgstr "軟件來源" + +#: ../src/gs-sources-dialog.ui.h:3 +msgid "No sources found." +msgstr "找不到來源。" + +#: ../src/gs-sources-dialog.ui.h:4 +msgid "Software sources give you access to additional software." +msgstr "軟件來源讓你存取更多軟件。" + +#: ../src/gs-sources-dialog.ui.h:5 +msgid "" +"Removing a source will also remove any software you have installed from it." +msgstr "移除來源也會移除你先前從該來源安裝過的任何軟件。" + +#: ../src/gs-sources-dialog.ui.h:6 +msgid "No software installed from this source" +msgstr "沒有從此來源安裝的軟件" + +#: ../src/gs-sources-dialog.ui.h:7 +msgid "Installed from this Source" +msgstr "從此來源安裝的軟件" + +#: ../src/gs-sources-dialog.ui.h:8 +msgid "Source Details" +msgstr "來源細節" + +#: ../src/gs-sources-dialog.ui.h:10 +msgid "Last Checked" +msgstr "上次檢查" + +#: ../src/gs-sources-dialog.ui.h:11 +msgid "Added" +msgstr "加入時間" + +#: ../src/gs-sources-dialog.ui.h:12 +msgid "Website" +msgstr "網站" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: ../src/gs-update-dialog.c:167 +msgid "Installed Updates" +msgstr "已安裝的更新" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window +#: ../src/gs-update-dialog.c:180 +#, c-format +msgid "Installed on %s" +msgstr "已安裝於 %s" + +#: ../src/gs-update-monitor.c:99 +msgid "Software Updates Available" +msgstr "有軟件更新可用" + +#: ../src/gs-update-monitor.c:100 +msgid "Important OS and application updates are ready to be installed" +msgstr "已備妥重要的作業系統與應用程式更新可供安裝" + +#: ../src/gs-update-monitor.c:103 +msgid "View" +msgstr "檢視" + +#: ../src/gs-update-monitor.c:104 +msgid "Not Now" +msgstr "現在不是時候" + +#: ../src/gs-update-monitor.c:144 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "軟件更新已安裝" + +#. TRANSLATORS: message when we've done offline updates +#: ../src/gs-update-monitor.c:148 +msgid "An important OS update has been installed." +msgid_plural "Important OS updates have been installed." +msgstr[0] "重要的作業系統更新已安裝。" + +#: ../src/gs-update-monitor.c:153 +msgid "Software Updates Failed" +msgstr "軟件更新失敗" + +#. TRANSLATORS: message when we offline updates have failed +#: ../src/gs-update-monitor.c:155 +msgid "An important OS update failed to be installed." +msgstr "重要的作業系統更新安裝失敗。" + +#: ../src/gs-update-monitor.c:164 +msgid "Review" +msgstr "檢閱" + +#: ../src/gs-update-monitor.c:166 +msgid "Show Details" +msgstr "顯示細節" + +#: ../src/gs-update-monitor.c:167 +msgid "OK" +msgstr "確定" + +#. vim: set noexpandtab: +#: ../src/gs-star-widget.ui.h:1 +msgid "One Star" +msgstr "一顆星" + +#: ../src/gs-star-widget.ui.h:2 +msgid "Two Stars" +msgstr "兩顆星" + +#: ../src/gs-star-widget.ui.h:3 +msgid "Three Stars" +msgstr "三顆星" + +#: ../src/gs-star-widget.ui.h:4 +msgid "Four Stars" +msgstr "四顆星" + +#: ../src/gs-star-widget.ui.h:5 +msgid "Five Stars" +msgstr "五顆星" + +#. TRANSLATORS: this is the summary of a notification that an application +#. * has been successfully installed +#: ../src/gs-utils.c:131 +#, c-format +msgid "%s is now installed" +msgstr "%s 現已安裝" + +#. TRANSLATORS: this is button that opens the newly installed application +#: ../src/gs-utils.c:135 +msgid "Launch" +msgstr "啟動" + +#: ../src/gs-utils.c:159 +msgid "Sorry, this did not work" +msgstr "很抱歉,那沒有用" + +#. TRANSLATORS: this is when the install fails +#: ../src/gs-utils.c:163 +#, c-format +msgid "Installation of %s failed." +msgstr "%s 安裝失敗。" + +#. TRANSLATORS: this is when the remove fails +#: ../src/gs-utils.c:168 +#, c-format +msgid "Removal of %s failed." +msgstr "%s 移除失敗。" + +#: ../src/plugins/gs-plugin-appstream.c:162 +#, c-format +msgid "No AppStream data found" +msgstr "找不到 AppStream 資料" + +#. TRANSLATORS: This is how we join the licences and can +#. * be considered a "Conjunctive AND Operator" according +#. * to the SPDX specification. For example: +#. * "LGPL-2.1 and MIT and BSD-2-Clause" +#: ../src/plugins/gs-plugin-appstream.c:312 +msgid " and " +msgstr " and " + +#. TRANSLATORS: This is how we join the licences and can +#. * be considered a "Disjunctive OR Operator" according +#. * to the SPDX specification. For example: +#. * "LGPL-2.1 or MIT" +#: ../src/plugins/gs-plugin-appstream.c:320 +msgid " or " +msgstr " or " + +#. TRANSLATORS: this is when a webapp has no comment +#: ../src/plugins/gs-plugin-epiphany.c:143 +#, c-format +msgid "Web app" +msgstr "網絡程式" + +#. TRANSLATORS: this is the licence of the web-app +#: ../src/plugins/gs-plugin-epiphany.c:151 +msgid "Proprietary" +msgstr "專有授權" + +#: ../src/plugins/gs-plugin-hardcoded-categories.c:160 +msgid "Featured" +msgstr "特色" + +#. TRANSLATORS: this is the menu spec main category for Audio +#: ../src/plugins/menu-spec-common.c:30 +msgid "Audio" +msgstr "音訊" + +#: ../src/plugins/menu-spec-common.c:31 +msgctxt "Menu subcategory of Audio" +msgid "Editing" +msgstr "編輯" + +#: ../src/plugins/menu-spec-common.c:32 +msgctxt "Menu subcategory of Audio" +msgid "Databases" +msgstr "資料庫" + +#: ../src/plugins/menu-spec-common.c:33 +msgctxt "Menu subcategory of Audio" +msgid "Disc Burning" +msgstr "光碟燒錄" + +#: ../src/plugins/menu-spec-common.c:34 +msgctxt "Menu subcategory of Audio" +msgid "Ham Radio" +msgstr "自製無線電" + +#: ../src/plugins/menu-spec-common.c:35 +msgctxt "Menu subcategory of Audio" +msgid "MIDI" +msgstr "MIDI" + +#: ../src/plugins/menu-spec-common.c:36 +msgctxt "Menu subcategory of Audio" +msgid "Mixer" +msgstr "混音器" + +#: ../src/plugins/menu-spec-common.c:37 +msgctxt "Menu subcategory of Audio" +msgid "Music" +msgstr "樂譜" + +#: ../src/plugins/menu-spec-common.c:38 +msgctxt "Menu subcategory of Audio" +msgid "Players" +msgstr "播放器" + +#: ../src/plugins/menu-spec-common.c:39 +msgctxt "Menu subcategory of Audio" +msgid "Recorders" +msgstr "錄製器" + +#: ../src/plugins/menu-spec-common.c:40 +msgctxt "Menu subcategory of Audio" +msgid "Sequencers" +msgstr "序段編輯器" + +#: ../src/plugins/menu-spec-common.c:41 +msgctxt "Menu subcategory of Audio" +msgid "Tuners" +msgstr "調諧器" + +#. TRANSLATORS: this is the menu spec main category for Development +#: ../src/plugins/menu-spec-common.c:43 +msgid "Development Tools" +msgstr "開發工具" + +#: ../src/plugins/menu-spec-common.c:44 +msgctxt "Menu subcategory of Development Tools" +msgid "Building" +msgstr "建置" + +#: ../src/plugins/menu-spec-common.c:45 +msgctxt "Menu subcategory of Development Tools" +msgid "Databases" +msgstr "資料庫" + +#: ../src/plugins/menu-spec-common.c:46 +msgctxt "Menu subcategory of Development Tools" +msgid "Debuggers" +msgstr "除錯器" + +#: ../src/plugins/menu-spec-common.c:47 +msgctxt "Menu subcategory of Development Tools" +msgid "GUI Designers" +msgstr "GUI 設計工具" + +#: ../src/plugins/menu-spec-common.c:48 +msgctxt "Menu subcategory of Development Tools" +msgid "IDE" +msgstr "IDE" + +#: ../src/plugins/menu-spec-common.c:49 +msgctxt "Menu subcategory of Development Tools" +msgid "Profiling" +msgstr "效能評測" + +#: ../src/plugins/menu-spec-common.c:50 +msgctxt "Menu subcategory of Development Tools" +msgid "Project Management" +msgstr "專案管理" + +#: ../src/plugins/menu-spec-common.c:51 +msgctxt "Menu subcategory of Development Tools" +msgid "Revision Control" +msgstr "修訂版控制" + +#: ../src/plugins/menu-spec-common.c:52 +msgctxt "Menu subcategory of Development Tools" +msgid "Translation" +msgstr "翻譯" + +#: ../src/plugins/menu-spec-common.c:53 +msgctxt "Menu subcategory of Development Tools" +msgid "Web Development" +msgstr "網頁開發" + +#. TRANSLATORS: this is the menu spec main category for Education +#: ../src/plugins/menu-spec-common.c:55 +msgid "Education" +msgstr "教育" + +#: ../src/plugins/menu-spec-common.c:56 +msgctxt "Menu subcategory of Education" +msgid "Art" +msgstr "藝術" + +#: ../src/plugins/menu-spec-common.c:57 +msgctxt "Menu subcategory of Education" +msgid "Artificial Intelligence" +msgstr "人工智能" + +#: ../src/plugins/menu-spec-common.c:58 +msgctxt "Menu subcategory of Education" +msgid "Astronomy" +msgstr "天文" + +#: ../src/plugins/menu-spec-common.c:59 +msgctxt "Menu subcategory of Education" +msgid "Biology" +msgstr "生物" + +#: ../src/plugins/menu-spec-common.c:60 +msgctxt "Menu subcategory of Education" +msgid "Chemistry" +msgstr "化學" + +#: ../src/plugins/menu-spec-common.c:61 +msgctxt "Menu subcategory of Education" +msgid "Computer Science" +msgstr "電腦科學" + +#: ../src/plugins/menu-spec-common.c:62 +msgctxt "Menu subcategory of Education" +msgid "Construction" +msgstr "建築" + +#: ../src/plugins/menu-spec-common.c:63 +msgctxt "Menu subcategory of Education" +msgid "Data Visualization" +msgstr "資料示現" + +#: ../src/plugins/menu-spec-common.c:64 +msgctxt "Menu subcategory of Education" +msgid "Economy" +msgstr "經濟" + +#: ../src/plugins/menu-spec-common.c:65 +msgctxt "Menu subcategory of Education" +msgid "Electricity" +msgstr "電學" + +#: ../src/plugins/menu-spec-common.c:66 +msgctxt "Menu subcategory of Education" +msgid "Electronics" +msgstr "電子學" + +#: ../src/plugins/menu-spec-common.c:67 +msgctxt "Menu subcategory of Education" +msgid "Engineering" +msgstr "工程" + +#: ../src/plugins/menu-spec-common.c:68 +msgctxt "Menu subcategory of Education" +msgid "Geography" +msgstr "地理" + +#: ../src/plugins/menu-spec-common.c:69 +msgctxt "Menu subcategory of Education" +msgid "Geology" +msgstr "地質" + +#: ../src/plugins/menu-spec-common.c:70 +msgctxt "Menu subcategory of Education" +msgid "Geoscience" +msgstr "地球科學" + +#: ../src/plugins/menu-spec-common.c:71 +msgctxt "Menu subcategory of Education" +msgid "History" +msgstr "歷史" + +#: ../src/plugins/menu-spec-common.c:72 +msgctxt "Menu subcategory of Education" +msgid "Humanities" +msgstr "人文" + +#: ../src/plugins/menu-spec-common.c:73 +msgctxt "Menu subcategory of Education" +msgid "Image Processing" +msgstr "影像處理" + +#: ../src/plugins/menu-spec-common.c:74 +msgctxt "Menu subcategory of Education" +msgid "Languages" +msgstr "語言" + +#: ../src/plugins/menu-spec-common.c:75 +msgctxt "Menu subcategory of Education" +msgid "Literature" +msgstr "文學" + +#: ../src/plugins/menu-spec-common.c:76 +msgctxt "Menu subcategory of Education" +msgid "Maps" +msgstr "地圖" + +#: ../src/plugins/menu-spec-common.c:77 +msgctxt "Menu subcategory of Education" +msgid "Math" +msgstr "數學" + +#: ../src/plugins/menu-spec-common.c:78 +msgctxt "Menu subcategory of Education" +msgid "Medical" +msgstr "醫學" + +#: ../src/plugins/menu-spec-common.c:79 +msgctxt "Menu subcategory of Education" +msgid "Music" +msgstr "音樂" + +#: ../src/plugins/menu-spec-common.c:80 +msgctxt "Menu subcategory of Education" +msgid "Numerical Analysis" +msgstr "數值分析" + +#: ../src/plugins/menu-spec-common.c:81 +msgctxt "Menu subcategory of Education" +msgid "Parallel Computing" +msgstr "平行計算" + +#: ../src/plugins/menu-spec-common.c:82 +msgctxt "Menu subcategory of Education" +msgid "Physics" +msgstr "物理" + +#: ../src/plugins/menu-spec-common.c:83 +msgctxt "Menu subcategory of Education" +msgid "Robotics" +msgstr "機械人學" + +#: ../src/plugins/menu-spec-common.c:84 +msgctxt "Menu subcategory of Education" +msgid "Spirituality" +msgstr "靈性" + +#: ../src/plugins/menu-spec-common.c:85 +msgctxt "Menu subcategory of Education" +msgid "Sports" +msgstr "運動" + +#. TRANSLATORS: this is the menu spec main category for Games +#: ../src/plugins/menu-spec-common.c:87 +msgid "Games" +msgstr "遊戲" + +#: ../src/plugins/menu-spec-common.c:88 +msgctxt "Menu subcategory of Games" +msgid "Action" +msgstr "動作" + +#: ../src/plugins/menu-spec-common.c:89 +msgctxt "Menu subcategory of Games" +msgid "Adventure" +msgstr "冒險" + +#: ../src/plugins/menu-spec-common.c:90 +msgctxt "Menu subcategory of Games" +msgid "Arcade" +msgstr "機臺" + +#: ../src/plugins/menu-spec-common.c:91 +msgctxt "Menu subcategory of Games" +msgid "Blocks" +msgstr "方塊" + +#: ../src/plugins/menu-spec-common.c:92 +msgctxt "Menu subcategory of Games" +msgid "Board" +msgstr "棋盤" + +#: ../src/plugins/menu-spec-common.c:93 +msgctxt "Menu subcategory of Games" +msgid "Card" +msgstr "啤牌" + +#: ../src/plugins/menu-spec-common.c:94 +msgctxt "Menu subcategory of Games" +msgid "Emulators" +msgstr "模擬器" + +#: ../src/plugins/menu-spec-common.c:95 +msgctxt "Menu subcategory of Games" +msgid "Kids" +msgstr "孩童" + +#: ../src/plugins/menu-spec-common.c:96 +msgctxt "Menu subcategory of Games" +msgid "Logic" +msgstr "邏輯" + +#: ../src/plugins/menu-spec-common.c:97 +msgctxt "Menu subcategory of Games" +msgid "Role Playing" +msgstr "角色扮演" + +#: ../src/plugins/menu-spec-common.c:98 +msgctxt "Menu subcategory of Games" +msgid "Shooter" +msgstr "射擊" + +#: ../src/plugins/menu-spec-common.c:99 +msgctxt "Menu subcategory of Games" +msgid "Simulation" +msgstr "模擬" + +#: ../src/plugins/menu-spec-common.c:100 +msgctxt "Menu subcategory of Games" +msgid "Sports" +msgstr "運動" + +#: ../src/plugins/menu-spec-common.c:101 +msgctxt "Menu subcategory of Games" +msgid "Strategy" +msgstr "策略" + +#. TRANSLATORS: this is the menu spec main category for Graphics +#: ../src/plugins/menu-spec-common.c:103 +msgid "Graphics" +msgstr "美工繪圖" + +#: ../src/plugins/menu-spec-common.c:104 +msgctxt "Menu subcategory of Graphics" +msgid "2D Graphics" +msgstr "2D 圖形" + +#: ../src/plugins/menu-spec-common.c:105 +msgctxt "Menu subcategory of Graphics" +msgid "3D Graphics" +msgstr "3D 圖形" + +#: ../src/plugins/menu-spec-common.c:106 +msgctxt "Menu subcategory of Graphics" +msgid "OCR" +msgstr "OCR" + +#: ../src/plugins/menu-spec-common.c:107 +msgctxt "Menu subcategory of Graphics" +msgid "Photography" +msgstr "攝影" + +#: ../src/plugins/menu-spec-common.c:108 +msgctxt "Menu subcategory of Graphics" +msgid "Publishing" +msgstr "出版" + +#: ../src/plugins/menu-spec-common.c:109 +msgctxt "Menu subcategory of Graphics" +msgid "Raster Graphics" +msgstr "光柵圖形" + +#: ../src/plugins/menu-spec-common.c:110 +msgctxt "Menu subcategory of Graphics" +msgid "Scanning" +msgstr "掃描" + +#: ../src/plugins/menu-spec-common.c:111 +msgctxt "Menu subcategory of Graphics" +msgid "Vector Graphics" +msgstr "向量圖形" + +#: ../src/plugins/menu-spec-common.c:112 +msgctxt "Menu subcategory of Graphics" +msgid "Viewer" +msgstr "檢視器" + +#. TRANSLATORS: this is the menu spec main category for Network +#: ../src/plugins/menu-spec-common.c:114 +msgid "Internet" +msgstr "互聯網" + +#: ../src/plugins/menu-spec-common.c:115 +msgctxt "Menu subcategory of Internet" +msgid "Chat" +msgstr "聊天" + +#: ../src/plugins/menu-spec-common.c:116 +msgctxt "Menu subcategory of Internet" +msgid "Dialup" +msgstr "撥號" + +#: ../src/plugins/menu-spec-common.c:117 +msgctxt "Menu subcategory of Internet" +msgid "Email" +msgstr "電子郵件" + +#: ../src/plugins/menu-spec-common.c:118 +msgctxt "Menu subcategory of Internet" +msgid "Feed" +msgstr "消息來源" + +#: ../src/plugins/menu-spec-common.c:119 +msgctxt "Menu subcategory of Internet" +msgid "File Transfer" +msgstr "檔案傳輸" + +#: ../src/plugins/menu-spec-common.c:120 +msgctxt "Menu subcategory of Internet" +msgid "Ham Radio" +msgstr "自製無線電" + +#: ../src/plugins/menu-spec-common.c:121 +msgctxt "Menu subcategory of Internet" +msgid "Instant Messaging" +msgstr "即時通訊" + +#: ../src/plugins/menu-spec-common.c:122 +msgctxt "Menu subcategory of Internet" +msgid "IRC Clients" +msgstr "IRC 客戶端" + +#: ../src/plugins/menu-spec-common.c:123 +msgctxt "Menu subcategory of Internet" +msgid "Monitor" +msgstr "顯示器" + +#: ../src/plugins/menu-spec-common.c:124 +msgctxt "Menu subcategory of Internet" +msgid "News" +msgstr "新聞" + +#: ../src/plugins/menu-spec-common.c:125 +msgctxt "Menu subcategory of Internet" +msgid "P2P" +msgstr "P2P" + +#: ../src/plugins/menu-spec-common.c:126 +msgctxt "Menu subcategory of Internet" +msgid "Remote Access" +msgstr "遠端存取" + +#: ../src/plugins/menu-spec-common.c:127 +msgctxt "Menu subcategory of Internet" +msgid "Telephony" +msgstr "電話學" + +#: ../src/plugins/menu-spec-common.c:128 +msgctxt "Menu subcategory of Internet" +msgid "Video Conference" +msgstr "視像會議" + +#: ../src/plugins/menu-spec-common.c:129 +msgctxt "Menu subcategory of Internet" +msgid "Web Browser" +msgstr "網頁瀏覽器" + +#: ../src/plugins/menu-spec-common.c:130 +msgctxt "Menu subcategory of Internet" +msgid "Web Development" +msgstr "網頁開發" + +#. TRANSLATORS: this is the menu spec main category for Office +#: ../src/plugins/menu-spec-common.c:132 +msgid "Office" +msgstr "辦公" + +#: ../src/plugins/menu-spec-common.c:133 +msgctxt "Menu subcategory of Office" +msgid "Calendar" +msgstr "行事曆" + +#: ../src/plugins/menu-spec-common.c:134 +msgctxt "Menu subcategory of Office" +msgid "Chart" +msgstr "圖表" + +#: ../src/plugins/menu-spec-common.c:135 +msgctxt "Menu subcategory of Office" +msgid "Contact Management" +msgstr "聯絡人管理" + +#: ../src/plugins/menu-spec-common.c:136 +msgctxt "Menu subcategory of Office" +msgid "Database" +msgstr "資料庫" + +#: ../src/plugins/menu-spec-common.c:137 +msgctxt "Menu subcategory of Office" +msgid "Dictionary" +msgstr "字典" + +#: ../src/plugins/menu-spec-common.c:138 +msgctxt "Menu subcategory of Office" +msgid "Email" +msgstr "電子郵件" + +#: ../src/plugins/menu-spec-common.c:139 +msgctxt "Menu subcategory of Office" +msgid "Finance" +msgstr "財經" + +#: ../src/plugins/menu-spec-common.c:140 +msgctxt "Menu subcategory of Office" +msgid "Flow Chart" +msgstr "流程圖" + +#: ../src/plugins/menu-spec-common.c:141 +msgctxt "Menu subcategory of Office" +msgid "PDA" +msgstr "PDA" + +#: ../src/plugins/menu-spec-common.c:142 +msgctxt "Menu subcategory of Office" +msgid "Photography" +msgstr "攝影" + +#: ../src/plugins/menu-spec-common.c:143 +msgctxt "Menu subcategory of Office" +msgid "Presentation" +msgstr "簡報" + +#: ../src/plugins/menu-spec-common.c:144 +msgctxt "Menu subcategory of Office" +msgid "Project Management" +msgstr "專案管理" + +#: ../src/plugins/menu-spec-common.c:145 +msgctxt "Menu subcategory of Office" +msgid "Publishing" +msgstr "出版" + +#: ../src/plugins/menu-spec-common.c:146 +msgctxt "Menu subcategory of Office" +msgid "Spreadsheet" +msgstr "試算表" + +#: ../src/plugins/menu-spec-common.c:147 +msgctxt "Menu subcategory of Office" +msgid "Viewer" +msgstr "檢視器" + +#: ../src/plugins/menu-spec-common.c:148 +msgctxt "Menu subcategory of Office" +msgid "Word Processor" +msgstr "文書處理器" + +#. TRANSLATORS: this is the menu spec main category for Science +#: ../src/plugins/menu-spec-common.c:150 +msgid "Science" +msgstr "科學" + +#: ../src/plugins/menu-spec-common.c:151 +msgctxt "Menu subcategory of Science" +msgid "Art" +msgstr "藝術" + +#: ../src/plugins/menu-spec-common.c:152 +msgctxt "Menu subcategory of Science" +msgid "Artificial Intelligence" +msgstr "人工智能" + +#: ../src/plugins/menu-spec-common.c:153 +msgctxt "Menu subcategory of Science" +msgid "Astronomy" +msgstr "天文" + +#: ../src/plugins/menu-spec-common.c:154 +msgctxt "Menu subcategory of Science" +msgid "Biology" +msgstr "生物" + +#: ../src/plugins/menu-spec-common.c:155 +msgctxt "Menu subcategory of Science" +msgid "Chemistry" +msgstr "化學" + +#: ../src/plugins/menu-spec-common.c:156 +msgctxt "Menu subcategory of Science" +msgid "Computer Science" +msgstr "電腦科學" + +#: ../src/plugins/menu-spec-common.c:157 +msgctxt "Menu subcategory of Science" +msgid "Construction" +msgstr "建築" + +#: ../src/plugins/menu-spec-common.c:158 +msgctxt "Menu subcategory of Science" +msgid "Data Visualization" +msgstr "資料示現" + +#: ../src/plugins/menu-spec-common.c:159 +msgctxt "Menu subcategory of Science" +msgid "Economy" +msgstr "經濟" + +#: ../src/plugins/menu-spec-common.c:160 +msgctxt "Menu subcategory of Science" +msgid "Electricity" +msgstr "電學" + +#: ../src/plugins/menu-spec-common.c:161 +msgctxt "Menu subcategory of Science" +msgid "Electronics" +msgstr "電子學" + +#: ../src/plugins/menu-spec-common.c:162 +msgctxt "Menu subcategory of Science" +msgid "Engineering" +msgstr "工程" + +#: ../src/plugins/menu-spec-common.c:163 +msgctxt "Menu subcategory of Science" +msgid "Geography" +msgstr "地理" + +#: ../src/plugins/menu-spec-common.c:164 +msgctxt "Menu subcategory of Science" +msgid "Geology" +msgstr "地質學" + +#: ../src/plugins/menu-spec-common.c:165 +msgctxt "Menu subcategory of Science" +msgid "Geoscience" +msgstr "地球科學" + +#: ../src/plugins/menu-spec-common.c:166 +msgctxt "Menu subcategory of Science" +msgid "History" +msgstr "歷史" + +#: ../src/plugins/menu-spec-common.c:167 +msgctxt "Menu subcategory of Science" +msgid "Humanities" +msgstr "人文" + +#: ../src/plugins/menu-spec-common.c:168 +msgctxt "Menu subcategory of Science" +msgid "Image Processing" +msgstr "影像處理" + +#: ../src/plugins/menu-spec-common.c:169 +msgctxt "Menu subcategory of Science" +msgid "Languages" +msgstr "語言" + +#: ../src/plugins/menu-spec-common.c:170 +msgctxt "Menu subcategory of Science" +msgid "Literature" +msgstr "文學" + +#: ../src/plugins/menu-spec-common.c:171 +msgctxt "Menu subcategory of Science" +msgid "Maps" +msgstr "地圖" + +#: ../src/plugins/menu-spec-common.c:172 +msgctxt "Menu subcategory of Science" +msgid "Math" +msgstr "數學" + +#: ../src/plugins/menu-spec-common.c:173 +msgctxt "Menu subcategory of Science" +msgid "Medical" +msgstr "醫學" + +#: ../src/plugins/menu-spec-common.c:174 +msgctxt "Menu subcategory of Science" +msgid "Numerical Analysis" +msgstr "數值分析" + +#: ../src/plugins/menu-spec-common.c:175 +msgctxt "Menu subcategory of Science" +msgid "Parallel Computing" +msgstr "平行計算" + +#: ../src/plugins/menu-spec-common.c:176 +msgctxt "Menu subcategory of Science" +msgid "Physics" +msgstr "物理" + +#: ../src/plugins/menu-spec-common.c:177 +msgctxt "Menu subcategory of Science" +msgid "Robotics" +msgstr "機械人學" + +#: ../src/plugins/menu-spec-common.c:178 +msgctxt "Menu subcategory of Science" +msgid "Spirituality" +msgstr "靈性" + +#: ../src/plugins/menu-spec-common.c:179 +msgctxt "Menu subcategory of Science" +msgid "Sports" +msgstr "運動" + +#. TRANSLATORS: this is the menu spec main category for System +#: ../src/plugins/menu-spec-common.c:181 +msgid "System" +msgstr "系統" + +#: ../src/plugins/menu-spec-common.c:182 +msgctxt "Menu subcategory of System" +msgid "Emulator" +msgstr "模擬器" + +#: ../src/plugins/menu-spec-common.c:183 +msgctxt "Menu subcategory of System" +msgid "File Manager" +msgstr "檔案管理器" + +#: ../src/plugins/menu-spec-common.c:184 +msgctxt "Menu subcategory of System" +msgid "File System" +msgstr "檔案系統" + +#: ../src/plugins/menu-spec-common.c:185 +msgctxt "Menu subcategory of System" +msgid "File Tools" +msgstr "檔案工具" + +#: ../src/plugins/menu-spec-common.c:186 +msgctxt "Menu subcategory of System" +msgid "Monitor" +msgstr "監控" + +#: ../src/plugins/menu-spec-common.c:187 +msgctxt "Menu subcategory of System" +msgid "Security" +msgstr "安全" + +#: ../src/plugins/menu-spec-common.c:188 +msgctxt "Menu subcategory of System" +msgid "Terminal Emulator" +msgstr "終端機模擬器" + +#. TRANSLATORS: this is the menu spec main category for Utility +#: ../src/plugins/menu-spec-common.c:190 +msgid "Utilities" +msgstr "公用程式" + +#: ../src/plugins/menu-spec-common.c:191 +msgctxt "Menu subcategory of Utilities" +msgid "Accessibility" +msgstr "無障礙環境" + +#: ../src/plugins/menu-spec-common.c:192 +msgctxt "Menu subcategory of Utilities" +msgid "Archiving" +msgstr "檔案封存" + +#: ../src/plugins/menu-spec-common.c:193 +msgctxt "Menu subcategory of Utilities" +msgid "Calculator" +msgstr "計數機" + +#: ../src/plugins/menu-spec-common.c:194 +msgctxt "Menu subcategory of Utilities" +msgid "Clock" +msgstr "時鐘" + +#: ../src/plugins/menu-spec-common.c:195 +msgctxt "Menu subcategory of Utilities" +msgid "Compression" +msgstr "壓縮" + +#: ../src/plugins/menu-spec-common.c:196 +msgctxt "Menu subcategory of Utilities" +msgid "File Tools" +msgstr "檔案工具" + +#: ../src/plugins/menu-spec-common.c:197 +msgctxt "Menu subcategory of Utilities" +msgid "Maps" +msgstr "地圖" + +#: ../src/plugins/menu-spec-common.c:198 +msgctxt "Menu subcategory of Utilities" +msgid "Spirituality" +msgstr "靈性" + +#: ../src/plugins/menu-spec-common.c:199 +msgctxt "Menu subcategory of Utilities" +msgid "Telephony Tools" +msgstr "電話工具" + +#: ../src/plugins/menu-spec-common.c:200 +msgctxt "Menu subcategory of Utilities" +msgid "Text Editor" +msgstr "文字編輯器" + +#. TRANSLATORS: this is the menu spec main category for Video +#: ../src/plugins/menu-spec-common.c:202 +msgid "Video" +msgstr "視像" + +#: ../src/plugins/menu-spec-common.c:203 +msgctxt "Menu subcategory of Video" +msgid "Editing" +msgstr "編輯" + +#: ../src/plugins/menu-spec-common.c:204 +msgctxt "Menu subcategory of Video" +msgid "Database" +msgstr "資料庫" + +#: ../src/plugins/menu-spec-common.c:205 +msgctxt "Menu subcategory of Video" +msgid "Disc Burning" +msgstr "光碟燒錄" + +#: ../src/plugins/menu-spec-common.c:206 +msgctxt "Menu subcategory of Video" +msgid "Players" +msgstr "播放器" + +#: ../src/plugins/menu-spec-common.c:207 +msgctxt "Menu subcategory of Video" +msgid "Recorders" +msgstr "錄製器" + +#: ../src/plugins/menu-spec-common.c:208 +msgctxt "Menu subcategory of Video" +msgid "TV" +msgstr "電視" + +#: ../src/plugins/menu-spec-common.c:211 +msgctxt "Menu subcategory of Add-ons" +msgid "Fonts" +msgstr "字型" + +#: ../src/plugins/menu-spec-common.c:212 +msgctxt "Menu subcategory of Add-ons" +msgid "Codecs" +msgstr "編解碼器" + +#: ../src/plugins/menu-spec-common.c:213 +msgctxt "Menu subcategory of Add-ons" +msgid "Input Sources" +msgstr "輸入來源" + +#: ../src/plugins/menu-spec-common.c:214 +msgctxt "Menu subcategory of Add-ons" +msgid "Language Packs" +msgstr "語言包" + +#: ../src/menus.ui.h:1 +msgid "_Software Sources" +msgstr "軟件來源(_S)" + +#: ../src/menus.ui.h:2 +msgid "_About" +msgstr "關於(_A)" + +#: ../src/menus.ui.h:3 +msgid "_Quit" +msgstr "退出(_Q)" + +#~ msgid "Set the specified debugging level" +#~ msgstr "設定指定的除錯等級" + +#~ msgid "Picks" +#~ msgstr "精選" + +#~ msgid "January 30, 2014" +#~ msgstr "2014年1月30日" + +#~ msgid "_Pending" +#~ msgstr "擱置中(_P)" + +#~ msgid "Complicated!" +#~ msgstr "超複雜!" + +#~ msgid "Recent Software Updates" +#~ msgstr "最近軟體更新" + +#~ msgid "No update details were provided" +#~ msgstr "未提供更新的詳細資訊" + +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "資料庫" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "自製無線電" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "網頁開發" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "檔案工具" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "地圖" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "心靈" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "字型" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "編解碼器" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "輸入來源" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "語言包" + +#~ msgid "Done" +#~ msgstr "完成" + +#~ msgid "_Done" +#~ msgstr "完成(_D)" + +#~ msgid "Application _Folders" +#~ msgstr "應用程式資料夾(_F)" + +#~ msgid "" +#~ "Add or remove folders. Your application folders can be found in the " +#~ "Activities Overview." +#~ msgstr "新增或移除資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "" +#~ "Choose a folder for %s. Your application folders can be found in the " +#~ "Activities Overview." +#~ msgstr "為 %s 選個資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "" +#~ "Choose a folder for %s and %s. Your application folders can be found in " +#~ "the Activities Overview." +#~ msgstr "為 %s 與 %s 選個資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "" +#~ "Choose a folder for %s, %s and %s. Your application folders can be found " +#~ "in the Activities Overview." +#~ msgstr "" +#~ "為 %s、%s 與 %s 選個資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "" +#~ "Choose a folder for the selected applications. Your application folders " +#~ "can be found in the Activities Overview." +#~ msgstr "" +#~ "為選取的應用程式選個資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "Software has the following goals:" +#~ msgstr "軟體有下列目標:" + +#~ msgid "View installed applications" +#~ msgstr "檢視安裝的應用程式" + +#~ msgid "View available application updates" +#~ msgstr "檢視可用的應用程式更新" + +#~ msgid "Install available updates" +#~ msgstr "安裝可用的更新" + +#~ msgid "Find an application to handle a specific type of file" +#~ msgstr "尋找應用程式以處理特定類型的檔案" + +#~ msgid "Installed apps and updates should be available when offline" +#~ msgstr "已安裝的程式與更新應該可在離線時使用" + +#~ msgid "Update" +#~ msgstr "更新" + +#~ msgid "_Installed (%d)" +#~ msgstr "已安裝 (%d)(_I)" + +#~ msgid "_Updates (%d)" +#~ msgstr "更新 (%d)(_U)" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..d682261 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,8492 @@ +# Chinese (Taiwan) translation for gnome-software. +# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-software package. +# FIRST AUTHOR , YEAR. +# Freddy Cheng , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-software master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n" +"POT-Creation-Date: 2025-02-17 17:44+0000\n" +"PO-Revision-Date: 2025-02-20 16:38+0800\n" +"Last-Translator: Cheng-Chia Tseng \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=1; plural=0;\n" +"X-Generator: Poedit 3.5\n" +"X-DamnedLies-Scope: partial\n" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:7 src/gs-shell.ui:35 +#: src/org.gnome.Software.desktop.in:3 +msgid "Software" +msgstr "軟體" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:8 +msgid "Install and update apps" +msgstr "安裝與更新應用程式" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:10 +msgid "" +"Software allows you to find and install new apps and system extensions and " +"remove existing installed apps." +msgstr "" +"《軟體》能讓您尋找及安裝新的程式與系統擴充套件,也能對已安裝的程式進行移除動" +"作。" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:14 +msgid "" +"Software showcases featured and popular apps with useful descriptions and " +"multiple screenshots per app. Apps can be found either through browsing the " +"list of categories or by searching. It also allows you to update your system " +"using an offline update." +msgstr "" +"《軟體》中陳列了各式各樣富有特色又受歡迎的程式,並提供描述與螢幕快照等實用訊" +"息讓您能深入瞭解。您可以透過瀏覽分類列表或是使用搜尋功能找出所需的程式,亦可" +"透過離線更新的方式更新系統。" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:25 +msgid "Overview panel" +msgstr "概覽面板" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:29 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:33 +msgid "Details panel" +msgstr "詳細資訊面板" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:37 +msgid "Installed panel" +msgstr "已安裝面板" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:41 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:45 +msgid "Updates panel" +msgstr "更新面板" + +#: data/metainfo/org.gnome.Software.metainfo.xml.in:49 +msgid "The update details" +msgstr "更新的詳細資訊" + +#. developer_name tag deprecated with Appstream 1.0 +#: data/metainfo/org.gnome.Software.metainfo.xml.in:2703 +#: src/gs-application.c:263 +msgid "The GNOME Project" +msgstr "GNOME 專案" + +#: data/org.gnome.software.dkms-helper.policy.in.in:11 +msgid "Test akmods key in Shim UEFI" +msgstr "在 Shim UEFI 中測試 akmods 金鑰" + +#: data/org.gnome.software.dkms-helper.policy.in.in:12 +msgid "Authentication is required to test akmods key in Shim UEFI" +msgstr "在 Shim UEFI 中測試 akmods 金鑰需要通過身分核對" + +#: data/org.gnome.software.dkms-helper.policy.in.in:22 +msgid "Enroll akmods key to Shim UEFI" +msgstr "將 akmods 金鑰登記到 Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:23 +msgid "Authentication is required to enroll akmods key to Shim UEFI" +msgstr "將 akmods 金鑰登記到 Shim UEFI 需要通過身分核對" + +#: data/org.gnome.software.dkms-helper.policy.in.in:33 +msgid "Test DKMS key in Shim UEFI" +msgstr "在 Shim UEFI 中測試 DKMS 金鑰" + +#: data/org.gnome.software.dkms-helper.policy.in.in:34 +msgid "Authentication is required to test DKMS key in Shim UEFI" +msgstr "在 Shim UEFI 中測試 DKMS 金鑰需要通過身分核對" + +#: data/org.gnome.software.dkms-helper.policy.in.in:44 +msgid "Enroll DKMS key to Shim UEFI" +msgstr "將 DKMS 金鑰登記到 Shim UEFI" + +#: data/org.gnome.software.dkms-helper.policy.in.in:45 +msgid "Authentication is required to enroll DKMS key to Shim UEFI" +msgstr "將 DKMS 金鑰登記到 Shim UEFI 需要通過身分核對" + +#: data/org.gnome.software.external-appstream.policy.in.in:11 +msgid "Install an appstream file into a system location" +msgstr "將 appstream 檔案安裝至系統位置" + +#: data/org.gnome.software.external-appstream.policy.in.in:12 +msgid "Installing an appstream file into a system location" +msgstr "正在將 appstream 檔案安裝至系統位置" + +#: data/org.gnome.software.gschema.xml:5 +msgid "A list of compatible projects" +msgstr "相容專案的列表" + +#: data/org.gnome.software.gschema.xml:6 +msgid "" +"This is a list of compatible projects we should show such as GNOME, KDE and " +"XFCE." +msgstr "這個列表決定要顯示在哪些相容的專案,如《GNOME》、《KDE》、《XFCE》等。" + +#: data/org.gnome.software.gschema.xml:10 +msgid "Whether to manage updates and upgrades in GNOME Software" +msgstr "是否要以《軟體》來管理更新與升級" + +#: data/org.gnome.software.gschema.xml:11 +msgid "" +"If disabled, GNOME Software will hide the updates panel, not perform any " +"automatic updates actions or prompt for upgrades." +msgstr "" +"若設為「False」,則會於《軟體》中隱藏更新面板,且不會進行任何自動更新動作或是" +"升級提醒。" + +#: data/org.gnome.software.gschema.xml:15 +msgid "Automatically download and install updates" +msgstr "自動下載與安裝更新" + +#: data/org.gnome.software.gschema.xml:16 +msgid "" +"If enabled, GNOME Software automatically downloads software updates in the " +"background, also installing ones that do not require a reboot." +msgstr "" +"若設為「True」,《軟體》會自動於背景下載軟體更新,並安裝無需重新啟動的更新。" + +#: data/org.gnome.software.gschema.xml:20 +msgid "Notify the user about software updated in the background" +msgstr "通知使用者軟體已在背景更新" + +#: data/org.gnome.software.gschema.xml:21 +msgid "" +"If enabled, GNOME Software notifies the user about updates that happened " +"whilst the user was idle." +msgstr "若設為「True」,《軟體》會在電腦閒置時通知已更新的項目。" + +#: data/org.gnome.software.gschema.xml:25 +msgid "Whether to automatically refresh when on a metered connection" +msgstr "是否在使用計量連線時自動重新整理" + +#: data/org.gnome.software.gschema.xml:26 +msgid "" +"If enabled, GNOME Software automatically refreshes in the background even " +"when using a metered connection (eventually downloading some metadata, " +"checking for updates, etc., which may incur in costs for the user)." +msgstr "" +"若設為「True」,即使正在透過計量連線使用網路,《軟體》仍會在背景自動重新整理" +"(甚至下載一些中介資料、檢查更新…等,使用者可能需負擔額外費用)。" + +#: data/org.gnome.software.gschema.xml:30 +msgid "Whether it’s the very first run of GNOME Software" +msgstr "是否為第一次執行《軟體》" + +#: data/org.gnome.software.gschema.xml:34 +msgid "Show star ratings next to applications" +msgstr "在應用程式旁顯示星級評等" + +#: data/org.gnome.software.gschema.xml:38 +msgid "Filter applications based on the default branch set for the remote" +msgstr "根據遠端預設的分支設定過濾應用程式" + +#: data/org.gnome.software.gschema.xml:42 +msgid "Non-free applications show a warning dialog before install" +msgstr "安裝非自由應用程式前顯示警告對話框" + +#: data/org.gnome.software.gschema.xml:43 +msgid "" +"When non-free applications are installed a warning dialog can be shown. This " +"controls if that dialog is suppressed." +msgstr "" +"安裝非自由的應用程式時會顯示警告對話框。該設定鍵控制是否停用這個對話框。" + +#: data/org.gnome.software.gschema.xml:47 +msgid "The last update check timestamp" +msgstr "上次檢查更新的時間戳記" + +#: data/org.gnome.software.gschema.xml:51 +msgid "The last upgrade notification timestamp" +msgstr "上次彈出升級通知的時間戳記" + +#: data/org.gnome.software.gschema.xml:55 +msgid "The last update notification timestamp" +msgstr "上次彈出更新通知的時間戳記" + +#: data/org.gnome.software.gschema.xml:59 +msgid "The timestamp of the first security update, cleared after update" +msgstr "首次進行安全性更新的時間戳記(會在更新之後清除)" + +#: data/org.gnome.software.gschema.xml:63 +msgid "The last update timestamp" +msgstr "上次更新的時間戳記" + +#: data/org.gnome.software.gschema.xml:67 +msgid "The age in seconds to verify the upstream screenshot is still valid" +msgstr "用來核驗上游螢幕快照仍否有效的時間秒數" + +#: data/org.gnome.software.gschema.xml:68 +msgid "" +"Choosing a larger value will mean less round-trips to the remote server but " +"updates to the screenshots may take longer to show to the user. A value of 0 " +"means to never check the server if the image already exists in the cache." +msgstr "" +"若數值較大,則代表較少與遠端伺服器來回,更新的螢幕快照可能要花上較長時間才能" +"夠顯示。數值為 0 表示倘若快取中已下載過螢幕快照,則永不從伺服器檢查更新。" + +#: data/org.gnome.software.gschema.xml:77 +msgid "The server to use for application reviews" +msgstr "用於應用程式評論的伺服器" + +#: data/org.gnome.software.gschema.xml:81 +msgid "The minimum karma score for reviews" +msgstr "評論的最低業值" + +#: data/org.gnome.software.gschema.xml:82 +msgid "Reviews with karma less than this number will not be shown." +msgstr "小於這個數字的業值將不會顯示。" + +#: data/org.gnome.software.gschema.xml:86 +msgid "A list of official repositories that should not be considered 3rd party" +msgstr "不應視為第三方軟體庫的官方軟體庫列表" + +#: data/org.gnome.software.gschema.xml:90 +msgid "A list of required repositories that cannot be disabled or removed" +msgstr "無法停用或移除的必要軟體庫列表" + +#: data/org.gnome.software.gschema.xml:94 +msgid "A list of official repositories that should be considered free software" +msgstr "應視為自由軟體的官方軟體庫列表" + +#: data/org.gnome.software.gschema.xml:98 +msgid "" +"The licence URL to use when an application should be considered free software" +msgstr "應用程式為自由軟體時所使用的授權條款 URL 位址" + +#: data/org.gnome.software.gschema.xml:102 +msgid "Install bundled applications for all users on the system where possible" +msgstr "允許情況下為系統上所有使用者安裝應用程式組合" + +#: data/org.gnome.software.gschema.xml:106 +msgid "Allow access to the Software Repositories dialog" +msgstr "是否允許取用「軟體庫」對話框" + +#: data/org.gnome.software.gschema.xml:110 +msgid "Offer upgrades for pre-releases" +msgstr "提供預先發行版本的升級" + +#: data/org.gnome.software.gschema.xml:114 +msgid "Show some UI elements informing the user that an app is non-free" +msgstr "透過一些使用者介面元素告知使用者程式授權並非自由軟體" + +#: data/org.gnome.software.gschema.xml:118 +msgid "Show the installed size for apps in the list of installed applications" +msgstr "在已安裝應用程式的列表中顯示應用程式安裝後的大小" + +#. Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. +#: data/org.gnome.software.gschema.xml:122 +msgid "'https://en.wikipedia.org/wiki/Proprietary_software'" +msgstr "'https://zh.wikipedia.org/zh-tw/%E4%B8%93%E6%9C%89%E8%BD%AF%E4%BB%B6'" + +#: data/org.gnome.software.gschema.xml:123 +msgid "The URI that explains nonfree and proprietary software" +msgstr "解釋何謂非自由軟體和專有軟體的 URL 位址" + +#: data/org.gnome.software.gschema.xml:127 +msgid "" +"A list of URLs pointing to appstream files that will be downloaded into an " +"swcatalog folder" +msgstr "一份要下載至「swcatalog」資料夾中的 AppStream 檔案所指向之 URL 清單" + +#: data/org.gnome.software.gschema.xml:131 +msgid "" +"Install the AppStream files to a system-wide location for all users. If " +"false, files are installed in non-standard $XDG_DATA_HOME/swcatalog/xml " +"directory" +msgstr "" +"將所有使用者的 AppStream 檔案安裝到系統層級位置上。若設為「False」,則檔案會" +"在非標準的「$XDG_DATA_HOME/swcatalog/xml」目錄中安裝" + +#: data/org.gnome.software.gschema.xml:135 +msgid "" +"Priority order of packaging formats to prefer, with more important formats " +"listed first. An empty array means the default order. Omitted formats are " +"assumed to be listed last. Example packaging formats are: deb, flatpak, rpm, " +"snap. The formats can be optionally specified with an origin name, divided " +"by a colon, for example 'flatpak:flathub'." +msgstr "" +"偏好的軟體包格式優先順序,愈重要的格式愈往前列出。空白陣列表示使用預設順序;" +"省略的格式則列在後方。軟體包格式範例有:「deb」、「flatpak」、「rpm」、" +"「snap」等。可以選擇使用原始名稱指定格式,並用冒號分隔,例如「flatpak:" +"flathub」。" + +#: data/org.gnome.software.gschema.xml:139 +msgid "The timestamp of the last attempt to remove unused Flatpak runtimes" +msgstr "上次嘗試移除未使用的 Flatpak 執行階段的時間戳記" + +#: data/org.gnome.software.gschema.xml:143 +msgid "" +"Set to 'true' to show only freely licensed apps and hide any proprietary " +"apps." +msgstr "設定為「true」 只顯示自由授權的程式並隱藏任何專有程式。" + +#: data/org.gnome.software.gschema.xml:147 +msgid "" +"Set to 'true' to show only apps from developers whose identity has been " +"verified." +msgstr "設定為「true」 只顯示身分已通過驗證的開發者的程式。" + +#: data/org.gnome.software.gschema.xml:151 +msgid "The timestamp of the last received historical updates." +msgstr "上次接收歷史更新的時間戳記。" + +#: data/org.gnome.software.gschema.xml:158 +msgid "A string storing the gnome-online-account id used to login" +msgstr "儲存用於登入《gnome-online-account》ID 的字串" + +#. TRANSLATORS: tool that is used when moving profiles system-wide +#: gs-install-appstream/gs-install-appstream.c:185 +msgid "GNOME Software AppStream system-wide installer" +msgstr "《軟體》的 AppStrem 系統層級安裝程式" + +#: gs-install-appstream/gs-install-appstream.c:187 +msgid "Failed to parse command line arguments" +msgstr "無法解析命令列參數" + +#. TRANSLATORS: user did not specify a valid filename +#: gs-install-appstream/gs-install-appstream.c:194 +msgid "You need to specify exactly one filename" +msgstr "您需要指定單一個檔名" + +#. TRANSLATORS: only able to install files as root +#: gs-install-appstream/gs-install-appstream.c:201 +msgid "This program can only be used by the root user" +msgstr "此程式僅能由 Root 使用者使用" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:209 +#, c-format +msgid "Failed to validate content type: %s" +msgstr "無法核驗內容類型:%s" + +#. TRANSLATORS: error details +#: gs-install-appstream/gs-install-appstream.c:220 +#, c-format +msgid "Failed to move: %s" +msgstr "無法移動:%s" + +#: src/gnome-software-local-file-flatpak.desktop.in:3 +#: src/gnome-software-local-file-fwupd.desktop.in:3 +#: src/gnome-software-local-file-packagekit.desktop.in:3 +#: src/gnome-software-local-file-snap.desktop.in:3 +msgid "Software Install" +msgstr "安裝軟體" + +#: src/gnome-software-local-file-flatpak.desktop.in:4 +#: src/gnome-software-local-file-fwupd.desktop.in:4 +#: src/gnome-software-local-file-packagekit.desktop.in:4 +#: src/gnome-software-local-file-snap.desktop.in:4 +msgid "Install selected software on the system" +msgstr "將所選的軟體安裝至系統" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:134 +msgid "Cartoon Violence" +msgstr "漫畫暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:136 +msgid "No information regarding cartoon violence" +msgstr "無漫畫暴力資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:144 +msgid "Fantasy Violence" +msgstr "幻想暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:146 +msgid "No information regarding fantasy violence" +msgstr "無幻想暴力資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:154 +msgid "Realistic Violence" +msgstr "現實暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:156 +msgid "No information regarding realistic violence" +msgstr "無現實暴力資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:164 +msgid "Violence Depicting Bloodshed" +msgstr "血腥暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:166 +msgid "No information regarding bloodshed" +msgstr "無血腥暴力資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:174 +msgid "Sexual Violence" +msgstr "性暴力" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:176 +msgid "No information regarding sexual violence" +msgstr "無性暴力資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:184 +msgid "Alcohol" +msgstr "酒精" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:186 +msgid "No information regarding references to alcohol" +msgstr "無涉及酒精資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:194 +msgid "Narcotics" +msgstr "毒品" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:196 +msgid "No information regarding references to illicit drugs" +msgstr "無涉及毒品資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:204 +msgid "Tobacco" +msgstr "香煙" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:206 +msgid "No information regarding references to tobacco products" +msgstr "無涉及香煙資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:214 +#: src/gs-age-rating-context-dialog.c:543 +msgid "Nudity" +msgstr "裸體" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:216 +msgid "No information regarding nudity of any sort" +msgstr "無任何形式之裸體資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:224 +msgid "Sexual Themes" +msgstr "性事主題" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:226 +msgid "No information regarding references to or depictions of sexual nature" +msgstr "無涉及性事或描繪性事資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:234 +msgid "Profanity" +msgstr "辱罵" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:236 +msgid "No information regarding profanity of any kind" +msgstr "無任何形式之辱駡資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:244 +msgid "Inappropriate Humor" +msgstr "不適切之幽默" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:246 +msgid "No information regarding inappropriate humor" +msgstr "無不適切之幽默資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:254 +msgid "Discrimination" +msgstr "歧視" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:256 +msgid "No information regarding discriminatory language of any kind" +msgstr "無任何形式之歧視用語資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:264 +msgid "Advertising" +msgstr "行銷" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:266 +msgid "No information regarding advertising of any kind" +msgstr "無任何形式之行銷資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:274 +msgid "Gambling" +msgstr "賭博" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:276 +msgid "No information regarding gambling of any kind" +msgstr "無任何形式之賭博資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:284 +msgid "Purchasing" +msgstr "購買" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:286 +msgid "No information regarding the ability to spend money" +msgstr "無金錢花費之資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:294 +msgid "Chat Between Users" +msgstr "使用者間聊天" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:296 +msgid "No information regarding ways to chat with other users" +msgstr "無與其他使用者聊天之資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:304 +msgid "Audio Chat Between Users" +msgstr "使用者間語音聊天" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:306 +msgid "No information regarding ways to talk with other users" +msgstr "無與其他使用者進行對談之資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:314 +msgid "Contact Details" +msgstr "聯絡資訊" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:316 +msgid "" +"No information regarding sharing of social network usernames or email " +"addresses" +msgstr "無分社群網站的使用者名稱或電子郵件位址之資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:324 +msgid "Identifying Information" +msgstr "身分辨識資訊" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:326 +msgid "No information regarding sharing of user information with third parties" +msgstr "無分享使用者資訊給第三方單位之資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:334 +msgid "Location Sharing" +msgstr "位置資訊分享" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:336 +msgid "No information regarding sharing of physical location with other users" +msgstr "無分享實體位置給其他使用者之資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:360 +msgid "Homosexuality" +msgstr "同性戀" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:362 +msgid "No information regarding references to homosexuality" +msgstr "無涉及同性戀資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:370 +msgid "Prostitution" +msgstr "賣淫" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:372 +msgid "No information regarding references to prostitution" +msgstr "無涉及賣淫資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:380 +msgid "Adultery" +msgstr "通姦" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:382 +msgid "No information regarding references to adultery" +msgstr "無涉及通姦資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:390 +msgid "Sexualized Characters" +msgstr "性化角色" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:392 +msgid "No information regarding sexualized characters" +msgstr "無涉及性化角色資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:400 +msgid "Desecration" +msgstr "褻瀆" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:402 +msgid "No information regarding references to desecration" +msgstr "無涉及褻瀆資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:410 +msgid "Human Remains" +msgstr "亡者遺體" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:412 +msgid "No information regarding visible dead human remains" +msgstr "無可見亡者遺體資訊" + +#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:420 +msgid "Slavery" +msgstr "奴隸行為" + +#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ +#: src/gs-age-rating-context-dialog.c:422 +msgid "No information regarding references to slavery" +msgstr "無涉及奴隸行為資訊" + +#: src/gs-age-rating-context-dialog.c:494 +msgid "Does not include references to drugs" +msgstr "不涉及藥物" + +#: src/gs-age-rating-context-dialog.c:496 +msgid "" +"Does not include swearing, profanity, and other kinds of strong language" +msgstr "不含詛咒、辱駡或其他激烈語言" + +#: src/gs-age-rating-context-dialog.c:498 +msgid "Does not include ads or monetary transactions" +msgstr "不含廣告或金錢交易功能" + +#: src/gs-age-rating-context-dialog.c:500 +msgid "Does not include sex or nudity" +msgstr "不含性事或裸體" + +#: src/gs-age-rating-context-dialog.c:502 +msgid "Does not include uncontrolled chat functionality" +msgstr "不含不受控制的聊天功能" + +#: src/gs-age-rating-context-dialog.c:504 +msgid "Does not include violence" +msgstr "不含暴力" + +#: src/gs-age-rating-context-dialog.c:537 +msgid "Drugs" +msgstr "藥物" + +#: src/gs-age-rating-context-dialog.c:539 +msgid "Strong Language" +msgstr "激烈語言" + +#: src/gs-age-rating-context-dialog.c:541 +msgid "Money" +msgstr "金錢" + +#: src/gs-age-rating-context-dialog.c:545 +msgid "Social" +msgstr "社交" + +#: src/gs-age-rating-context-dialog.c:547 +msgid "Violence" +msgstr "暴力" + +#. Translators: This is used to join two list items together in +#. * a compressed way of displaying a list of descriptions of age +#. * ratings for apps. The order of the items does not matter. +#: src/gs-age-rating-context-dialog.c:659 +#, c-format +msgid "%s • %s" +msgstr "%s • %s" + +#. Translators: The app is considered suitable to be run by all ages of people. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-age-rating-context-dialog.c:936 +msgctxt "Age rating" +msgid "All" +msgstr "所有" + +#. Translators: This is displayed for the download size in an +#. * app’s context tile if the size is unknown. It should be short +#. * (at most a couple of characters wide). +#. Translators: This is shown in a bubble if the storage +#. * size of an app is not known. The bubble is small, +#. * so the string should be as short as possible. +#: src/gs-age-rating-context-dialog.c:949 src/gs-app-context-bar.c:206 +#: src/gs-storage-context-dialog.c:89 +msgid "?" +msgstr "?" + +#. Translators: It’s unknown what age rating this app has. The +#. * placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1010 +#, c-format +msgid "%s has an unknown age rating" +msgstr "《%s》年齡分級未知" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for all ages. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1021 +#, c-format +msgid "%s is suitable for everyone" +msgstr "《%s》適合任何人" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 3. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1025 +#, c-format +msgid "%s is suitable for toddlers" +msgstr "《%s》適合學齡前幼兒" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 5. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1029 +#, c-format +msgid "%s is suitable for young children" +msgstr "《%s》適合幼兒" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for children up to around age 12. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1033 +#, c-format +msgid "%s is suitable for children" +msgstr "《%s》適合兒童" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people up to around age 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1037 +#, c-format +msgid "%s is suitable for teenagers" +msgstr "《%s》適合青少年" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for people aged up to and over 18. The placeholder is the app name. +#: src/gs-age-rating-context-dialog.c:1041 +#, c-format +msgid "%s is suitable for adults" +msgstr "《%s》適合成人" + +#. Translators: This is a dialogue title which indicates that an app is suitable +#. * for a specified age group. The first placeholder is the app name, the second +#. * is the age group. +#: src/gs-age-rating-context-dialog.c:1046 +#, c-format +msgid "%s is suitable for %s" +msgstr "《%s》適合%s" + +#. Translators: This is the title of the dialog which contains information about the suitability of an app for different ages. +#. this one’s not a placeholder +#: src/gs-age-rating-context-dialog.ui:6 src/gs-app-context-bar.ui:217 +msgid "Age Rating" +msgstr "年齡分級" + +#: src/gs-age-rating-context-dialog.ui:61 +#: src/gs-hardware-support-context-dialog.ui:63 +#: src/gs-safety-context-dialog.ui:130 +msgid "_How to contribute missing information" +msgstr "如何貢獻缺少的資訊(_H)" + +#: lib/gs-app.c:6367 +msgid "Local file" +msgstr "本機檔案" + +#. TRANSLATORS: the first %s is replaced with an origin name; +#. the second %s is replaced with the packaging format. +#. Example string: "Local file (RPM)" +#. Translators: The first placeholder is an app runtime +#. * name, the second is its version number. +#: lib/gs-app.c:6386 src/gs-safety-context-dialog.c:536 +#, c-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#. Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). +#: lib/gs-app.c:6463 src/gs-safety-context-dialog.c:773 +#: src/gs-safety-context-dialog.ui:92 +msgid "Package" +msgstr "軟體包" + +#: src/gs-app-addon-row.c:93 src/gs-app-row.c:528 +msgid "Pending" +msgstr "待處置" + +#: src/gs-app-addon-row.c:97 src/gs-app-row.c:532 src/gs-details-page.c:394 +msgid "Pending install" +msgstr "安裝待處置" + +#: src/gs-app-addon-row.c:101 src/gs-app-row.c:536 src/gs-details-page.c:401 +msgid "Pending remove" +msgstr "移除待處置" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being installed +#: src/gs-app-addon-row.c:105 src/gs-app-row.c:215 src/gs-details-page.c:382 +msgid "Installing" +msgstr "正在安裝" + +#: src/gs-app-addon-row.c:109 +msgid "Removing" +msgstr "正在移除" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being downloaded +#: src/gs-app-addon-row.c:113 src/gs-app-row.c:229 src/gs-details-page.c:387 +#: src/gs-details-page.ui:316 +msgid "Downloading" +msgstr "正在下載" + +#. TRANSLATORS: button text +#. TRANSLATORS: button text in the header when an app +#. * can be installed +#. TRANSLATORS: button text in the header when firmware +#. * can be live-installed +#. TRANSLATORS: update the fw +#: src/gs-app-addon-row.ui:21 src/gs-common.c:279 src/gs-details-page.c:1056 +#: src/gs-details-page.c:1091 src/gs-details-page.ui:203 src/gs-page.c:425 +#: plugins/packagekit/gs-packagekit-task.c:149 +msgid "_Install" +msgstr "安裝(_I)" + +#: src/gs-app-addon-row.ui:29 src/gs-details-page.c:1176 +msgid "_Uninstall…" +msgstr "解除安裝(_U)…" + +#: src/gs-app-details-page.c:60 +msgid "Network" +msgstr "網路" + +#: src/gs-app-details-page.c:60 +msgid "Can communicate over the network" +msgstr "可以透過網路通訊" + +#: src/gs-app-details-page.c:61 +msgid "System Services" +msgstr "系統服務" + +#: src/gs-app-details-page.c:61 +msgid "Can access D-Bus services on the system bus" +msgstr "可以取用系統匯流排的《D-Bus》服務" + +#: src/gs-app-details-page.c:62 +msgid "Session Services" +msgstr "作業階段服務" + +#: src/gs-app-details-page.c:62 +msgid "Can access D-Bus services on the session bus" +msgstr "可以取用作業階段匯流排的《D-Bus》服務" + +#: src/gs-app-details-page.c:63 src/gs-app-details-page.c:64 +#: src/gs-app-details-page.c:65 src/gs-app-details-page.c:66 +msgid "Devices" +msgstr "裝置" + +#: src/gs-app-details-page.c:63 +msgid "Can access arbitrary devices such as webcams" +msgstr "可以取用如網路攝影機等任意裝置" + +#. Translators: This indicates an app can access input devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:64 src/gs-app-context-bar.c:339 +#: src/gs-safety-context-dialog.c:228 +msgid "Can access input devices" +msgstr "可以取用輸入裝置" + +#. Translators: This indicates an app can access audio devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:65 src/gs-app-context-bar.c:346 +msgid "Can access microphones and play audio" +msgstr "可以取用麥克風與播放音訊" + +#: src/gs-app-details-page.c:66 +msgid "Can access system device files" +msgstr "可以取用系統裝置檔案" + +#: src/gs-app-details-page.c:67 +msgid "Screen contents" +msgstr "螢幕內容" + +#. Translators: This indicates an app can access the screen/display contents. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-details-page.c:67 src/gs-app-context-bar.c:360 +msgid "Can access screen contents" +msgstr "可以取用螢幕內容" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:69 +msgid "Home folder" +msgstr "家目錄" + +#: src/gs-app-details-page.c:68 src/gs-app-details-page.c:70 +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:144 +msgid "Can view, edit and create files" +msgstr "可以檢視、編輯與建立檔案" + +#: src/gs-app-details-page.c:69 src/gs-app-details-page.c:71 +#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:139 +msgid "Can view files" +msgstr "可以檢視檔案" + +#: src/gs-app-details-page.c:70 src/gs-app-details-page.c:71 +msgid "File system" +msgstr "檔案系統" + +#. The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists +#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:74 +msgid "Downloads folder" +msgstr "下載資料夾" + +#: src/gs-app-details-page.c:75 +msgid "Settings" +msgstr "設定值" + +#: src/gs-app-details-page.c:75 +msgid "Can view and change any settings" +msgstr "可以檢視並更改任何設定" + +#: src/gs-app-details-page.c:76 +msgid "Legacy display system" +msgstr "舊世代顯示系統" + +#: src/gs-app-details-page.c:76 +msgid "Uses an old, insecure display system" +msgstr "使用舊式、不安全的顯示系統" + +#: src/gs-app-details-page.c:77 +msgid "Sandbox escape" +msgstr "沙盒跳脫" + +#: src/gs-app-details-page.c:77 +msgid "Can escape the sandbox and circumvent any other restrictions" +msgstr "可以跳脫沙盒並繞過任何限制" + +#. TRANSLATORS: this is where the packager did not write +#. * a description for the update +#: src/gs-app-details-page.c:210 +msgid "No update description available." +msgstr "未提供更新的詳細資訊。" + +#. FIXME support app == NULL +#. set page title +#: src/gs-app-details-page.c:234 +msgid "Update Details" +msgstr "更新詳細資訊" + +#: src/gs-app-details-page.ui:27 src/gs-app-row.c:591 +msgid "Requires additional permissions" +msgstr "需要開通其他取用權" + +#: src/gs-app-reviews-dialog.c:129 +msgid "Invalid ratings data received from server" +msgstr "從伺服器擷取的評級資料無效" + +#: src/gs-app-reviews-dialog.c:132 src/gs-details-page.c:2414 +msgid "Could not communicate with ratings server" +msgstr "無法與評級伺服器通訊" + +#. Translators: Header of the section with other users' opinions about the app. +#: src/gs-app-reviews-dialog.ui:6 src/gs-details-page.ui:1045 +msgid "Reviews" +msgstr "評論" + +#: src/gs-app-reviews-dialog.ui:23 +msgid "No reviews were found for this app." +msgstr "找不到這個程式的評論。" + +#: src/gs-app-reviews-dialog.ui:25 +msgid "No Reviews" +msgstr "沒有評論" + +#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:512 +msgid "Version History" +msgstr "版本歷史紀錄" + +#: src/gs-app-version-history-row.c:135 +#, c-format +msgid "New in Version %s" +msgstr "版本 %s 的更新內容" + +#: src/gs-app-version-history-row.c:142 +#, c-format +msgid "Version %s" +msgstr "版本 %s" + +#: src/gs-app-version-history-row.c:144 +msgid "No details for this release" +msgstr "沒有此次發行版本的詳細資訊" + +#. TRANSLATORS: This is the date string with: day number, month name, year. +#. i.e. "25 May 2012" +#: src/gs-app-version-history-row.c:158 src/gs-review-row.c:63 +msgid "%e %B %Y" +msgstr "%Y年%-m月%-d日" + +#. TRANSLATORS: this is a command line option +#: src/gs-application.c:124 +msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’" +msgstr "" +"初始啟動模式:可以是「updates」(更新)、「updated」(已更新)、「installed」" +"(已安裝)或「overview」(概覽)" + +#: src/gs-application.c:124 +msgid "MODE" +msgstr "MODE" + +#: src/gs-application.c:126 +msgid "Search for applications" +msgstr "搜尋應用程式" + +#: src/gs-application.c:126 +msgid "SEARCH" +msgstr "SEARCH" + +#: src/gs-application.c:128 +msgid "Show application details (using application ID)" +msgstr "顯示應用程式詳細資訊(使用應用程式 ID)" + +#: src/gs-application.c:128 src/gs-application.c:132 src/gs-application.c:134 +msgid "ID" +msgstr "ID" + +#: src/gs-application.c:130 +msgid "Show application details (using package name)" +msgstr "顯示應用程式詳細資訊(使用軟體包名稱)" + +#: src/gs-application.c:130 +msgid "PKGNAME" +msgstr "PKGNAME" + +#: src/gs-application.c:132 +msgid "Install the application (using application ID)" +msgstr "安裝應用程式(使用應用程式 ID)" + +#: src/gs-application.c:134 +msgid "Uninstall the application (using application ID)" +msgstr "解除安裝應用程式(使用應用程式 ID)" + +#: src/gs-application.c:136 +msgid "Open a local package file" +msgstr "開啟本機軟體包檔案" + +#: src/gs-application.c:136 src/gs-application.c:141 +msgid "FILENAME" +msgstr "FILENAME" + +#: src/gs-application.c:138 +msgid "" +"The kind of interaction expected for this action: either ‘none’, ‘notify’, " +"or ‘full’" +msgstr "" +"這個動作預期的互動種類:可以是「none」(沒有)、「notify」(通知)或「full」" +"(完整)" + +#: src/gs-application.c:139 +msgid "INTERACTION" +msgstr "INTERACTION" + +#: src/gs-application.c:141 +msgid "Show a local metainfo or appdata file" +msgstr "顯示本機中介資料或 appdata 檔案" + +#: src/gs-application.c:143 +msgid "" +"Enable verbose debugging output (from the running instance, if already " +"running)" +msgstr "啟用詳盡除錯輸出(從執行中實體,如果已經在執行中)" + +#: src/gs-application.c:145 +msgid "Installs any pending updates in the background" +msgstr "在背景安裝任何待處置的更新" + +#: src/gs-application.c:147 +msgid "Show preferences" +msgstr "顯示偏好設定" + +#: src/gs-application.c:149 +msgid "Quit the running instance" +msgstr "退出執行中的實體" + +#: src/gs-application.c:151 +msgid "Prefer local file sources to AppStream" +msgstr "《AppStream》優先使用本機的檔案來源" + +#: src/gs-application.c:153 +msgid "Show version number" +msgstr "顯示版本號碼" + +#: src/gs-application.c:270 +msgid "Copyright © 2016–2023 GNOME Software contributors" +msgstr "Copyright © 2016–2023 GNOME《軟體》貢獻者" + +#: src/gs-application.c:272 +msgid "translator-credits" +msgstr "" +"Cheng-Chia Tseng , 2013-2020, 2022-2023.\n" +"Yi-Jyun Pan , 2020.\n" +"Freddy Cheng , 2022." + +#. TRANSLATORS: we tried to show an app that did not exist +#: src/gs-application.c:508 +msgid "Sorry! There are no details for that application." +msgstr "抱歉!沒有該應用程式的詳細資訊。" + +#. Translators: The disk usage of an app when installed. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:162 src/gs-storage-context-dialog.c:133 +msgid "Installed Size" +msgstr "安裝大小" + +#: src/gs-app-context-bar.c:165 +#, c-format +msgid "Includes %s of data and %s of cache" +msgstr "包括 %s 的資料與 %s 的快取" + +#: src/gs-app-context-bar.c:168 +#, c-format +msgid "Includes %s of data" +msgstr "包括 %s 的資料" + +#: src/gs-app-context-bar.c:171 +#, c-format +msgid "Includes %s of cache" +msgstr "包括 %s 的快取" + +#: src/gs-app-context-bar.c:174 +msgid "Cache and data usage unknown" +msgstr "快取與資料使用量未知" + +#. Translators: The download size of an app. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:187 src/gs-storage-context-dialog.c:165 +msgid "Download Size" +msgstr "下載大小" + +#: src/gs-app-context-bar.c:191 +msgid "Needs no additional system downloads" +msgstr "無需額外的下載" + +#: src/gs-app-context-bar.c:193 +msgid "Needs an unknown size of additional system downloads" +msgstr "需要未知大小的額外下載" + +#. Translators: The placeholder is for a size string, +#. * such as ‘150 MB’ or ‘1.5 GB’. +#: src/gs-app-context-bar.c:198 +#, c-format +msgid "Needs %s of additional system downloads" +msgstr "需要 %s 的額外下載" + +#. Translators: Displayed if the download or installed size of +#. * an app could not be determined. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:212 +msgid "Size is unknown" +msgstr "未知大小" + +#. Translators: This indicates an app requires no permissions to run. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:294 +msgid "No permissions" +msgstr "沒有取用權" + +#. Translators: This indicates an app uses the network. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:311 +msgid "Has network access" +msgstr "可以取用網路" + +#. Translators: This indicates an app uses D-Bus system services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:318 +msgid "Uses system services" +msgstr "使用系統服務" + +#. Translators: This indicates an app uses D-Bus session services. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:325 +msgid "Uses session services" +msgstr "使用作業階段服務" + +#. Translators: This indicates an app can access arbitrary hardware devices. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:332 +msgid "Can access hardware devices" +msgstr "可以取用硬體裝置" + +#. Translators: This indicates an app can access system devices such as /dev/shm. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:353 +msgid "Can access system devices" +msgstr "可以取用系統裝置" + +#. Translators: This indicates an app can read/write to the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:372 +msgid "Can read/write all your data" +msgstr "可以讀取/寫入所有您的資料" + +#. Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:384 +msgid "Can read all your data" +msgstr "可以讀取您的所有資料" + +#. Translators: This indicates an app can read/write to the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:391 +msgid "Can read/write your downloads" +msgstr "可以讀取/寫入您的下載目錄" + +#. Translators: This indicates an app can read (but not write) from the user’s Downloads directory. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:398 +msgid "Can read your downloads" +msgstr "可以讀取您的下載目錄" + +#. Translators: This indicates an app can access data in the system unknown to the Software. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:405 +msgid "Can access some specific files" +msgstr "可以取用一些特定檔案" + +#. Translators: This indicates an app can access or change user settings. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:412 src/gs-safety-context-dialog.c:276 +msgid "Can access and change user settings" +msgstr "可以取用並更改使用者設定" + +#. Translators: This indicates an app uses the X11 windowing system. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:419 src/gs-safety-context-dialog.c:260 +msgid "Uses a legacy windowing system" +msgstr "使用舊世代視窗顯示系統" + +#. Translators: This indicates an app can escape its sandbox. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:426 src/gs-safety-context-dialog.c:268 +msgid "Can acquire arbitrary permissions" +msgstr "可以擁有任意取用權" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:438 +msgid "Software developer is verified" +msgstr "軟體開發者已通過核驗" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:456 src/gs-safety-context-dialog.c:144 +msgid "Reviewed by OS distributor" +msgstr "由作業系統散布單位檢閱" + +#. Translators: This indicates that an app has been packaged +#. * by the user’s distribution and is probably safe. +#. * It’s used in a context tile, so should be short. +#. * The '%s' is replaced by the distribution name. +#. Translators: The '%s' is replaced by the distribution name. +#: src/gs-app-context-bar.c:462 src/gs-safety-context-dialog.c:147 +#, c-format +msgid "Reviewed by %s" +msgstr "由 %s 檢閱" + +#. Translators: This indicates that an app has been packaged +#. * by someone other than the user’s distribution, so might not be safe. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:478 src/gs-safety-context-dialog.c:161 +msgid "Provided by a third party" +msgstr "由第三方提供" + +#. Translators: This indicates an app or its runtime reached its end of life. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:488 +msgid "Software no longer supported" +msgstr "不再支援的軟體" + +#. Translators: This indicates an app’s source code is freely available, so can be audited for security. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:500 +msgid "Auditable code" +msgstr "可稽核的程式碼" + +#. Translators: This indicates an app does not specify which license it's developed under. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:506 +msgid "Unknown license" +msgstr "未知的授權" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:513 +msgid "Proprietary code" +msgstr "專有授權程式碼" + +#. Translators: This indicates an app is not licensed under a free software license. +#. * It’s used in a context tile, so should be short. +#: src/gs-app-context-bar.c:520 +msgid "Special license" +msgstr "特殊授權" + +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been marked as +#. * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: +#. * “App comes from a trusted source; Auditable code; No permissions” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#. Translators: This string is used to join various other translated +#. * strings into an inline list of reasons why an app has been given a +#. * certain content rating. For example: +#. * “References to alcoholic beverages; Moderated chat functionality between users” +#. * If concatenating strings as a list using a separator like this is not +#. * possible in your language, please file an issue against gnome-software: +#. * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ +#: src/gs-app-context-bar.c:534 src/gs-app-context-bar.c:817 +msgid "; " +msgstr ";" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:542 +msgid "Privileged" +msgstr "享有特權" + +#. Translators: The app is considered safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:549 +msgid "Safe" +msgstr "安全" + +#. Translators: The app is considered probably safe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:556 +msgid "Probably Safe" +msgstr "可能安全" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:563 +msgid "Potentially Unsafe" +msgstr "可能不安全" + +#. Translators: The app is considered unsafe to install and run. +#. * This is displayed in a context tile, so the string should be short. +#: src/gs-app-context-bar.c:570 +msgid "Unsafe" +msgstr "不安全" + +#: src/gs-app-context-bar.c:648 src/gs-app-context-bar.c:680 +#: src/gs-hardware-support-context-dialog.c:615 +msgid "Mobile Only" +msgstr "僅適用於行動裝置" + +#: src/gs-app-context-bar.c:649 +msgid "Only works on a small screen" +msgstr "僅能在小螢幕上運作" + +#: src/gs-app-context-bar.c:654 src/gs-app-context-bar.c:687 +#: src/gs-app-context-bar.c:694 src/gs-app-context-bar.c:744 +#: src/gs-app-context-bar.c:749 src/gs-hardware-support-context-dialog.c:595 +msgid "Desktop Only" +msgstr "僅適用於桌面環境" + +#: src/gs-app-context-bar.c:655 +msgid "Only works on a large screen" +msgstr "僅能在大螢幕上運作" + +#: src/gs-app-context-bar.c:659 src/gs-hardware-support-context-dialog.c:633 +msgid "Screen Size Mismatch" +msgstr "螢幕大小不相符" + +#: src/gs-app-context-bar.c:660 src/gs-hardware-support-context-dialog.c:634 +msgid "Doesn’t support your current screen size" +msgstr "不支援目前的螢幕大小" + +#: src/gs-app-context-bar.c:681 src/gs-hardware-support-context-dialog.c:686 +#: src/gs-hardware-support-context-dialog.c:692 +msgid "Requires a touchscreen" +msgstr "需要觸控板" + +#: src/gs-app-context-bar.c:688 src/gs-hardware-support-context-dialog.c:646 +#: src/gs-hardware-support-context-dialog.c:652 +msgid "Requires a keyboard" +msgstr "需要鍵盤" + +#: src/gs-app-context-bar.c:695 +msgid "Requires a mouse" +msgstr "需要滑鼠" + +#: src/gs-app-context-bar.c:706 +msgid "Gamepad Needed" +msgstr "需要遊戲手把" + +#: src/gs-app-context-bar.c:707 +msgid "Requires a gamepad to play" +msgstr "需要遊戲手把才能玩" + +#. Translators: This is used in a context tile to indicate that +#. * an app works on phones, tablets *and* desktops. It should be +#. * short and in title case. +#: src/gs-app-context-bar.c:731 +msgid "Adaptive" +msgstr "適應性" + +#: src/gs-app-context-bar.c:732 +msgid "Works on phones, tablets and desktops" +msgstr "可運作於手機、平板及桌面環境" + +#: src/gs-app-context-bar.c:745 +msgid "Probably requires a keyboard or mouse" +msgstr "可能需要鍵盤或滑鼠" + +#: src/gs-app-context-bar.c:750 +msgid "Works on desktops and laptops" +msgstr "可運作於桌上型與筆記型電腦" + +#. Translators: This indicates that the content rating for an +#. * app says it can be used by all ages of people, as it contains +#. * no objectionable content. +#: src/gs-app-context-bar.c:792 +msgid "Contains no age-inappropriate content" +msgstr "不含不適齡內容" + +#: src/gs-app-context-bar.c:840 +msgid "No age rating information available" +msgstr "無年齡分級資訊" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:156 +msgid "Visit Website" +msgstr "造訪網站" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed. +#. * The ellipsis indicates that further steps are required +#: src/gs-app-row.c:162 +msgid "Install…" +msgstr "安裝…" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows to cancel a queued install of the app +#: src/gs-app-row.c:170 src/gs-updates-section.ui:63 +msgid "Cancel" +msgstr "取消" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily installed +#: src/gs-app-row.c:178 +msgid "Install" +msgstr "安裝" + +#. TRANSLATORS: this is a button in the updates panel +#: src/gs-app-row.c:187 +msgid "Download" +msgstr "下載" + +#. TRANSLATORS: this is a button in the updates panel +#. * that allows the app to be easily updated live +#: src/gs-app-row.c:191 +msgid "Update" +msgstr "更新" + +#. TRANSLATORS: this is a button next to the search results that +#. * allows the app to be easily removed +#: src/gs-app-row.c:198 src/gs-app-row.c:208 +msgid "Uninstall…" +msgstr "解除安裝…" + +#. TRANSLATORS: this is a button next to the search results that +#. * shows the status of an app being erased +#: src/gs-app-row.c:222 +msgid "Uninstalling" +msgstr "正在解除安裝" + +#: src/gs-app-row.c:323 src/gs-app-row.ui:60 +msgid "Critical update" +msgstr "重大更新" + +#. TRANSLATORS: during the update the device +#. * will restart into a special update-only mode +#: src/gs-app-row.c:401 +msgid "Device cannot be used during update." +msgstr "更新過程中不能使用裝置。" + +#. TRANSLATORS: this refers to where the app came from +#: src/gs-app-row.c:411 src/gs-shell-search-provider.c:270 +#, c-format +msgid "Source: %s" +msgstr "來源:%s" + +#. Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. +#: src/gs-app-row.c:598 +#, c-format +msgid "Renamed from %s" +msgstr "由《%s》改名而來" + +#. Replace user-provided non-localized string with a localized text +#: src/gs-app-row.c:635 src/gs-details-page.ui:535 +msgid "Stopped Receiving Updates" +msgstr "停止接收更新" + +#: src/gs-app-row.ui:58 src/gs-os-update-page.c:142 +msgid "Critical Update" +msgstr "重大更新" + +#: src/gs-app-row.ui:227 src/gs-feature-tile.c:621 +msgctxt "Single app" +msgid "Installed" +msgstr "已安裝" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:68 +#, c-format +msgid "Help Translate %s" +msgstr "協助翻譯《%s》" + +#. Translators: The placeholder is an app name +#: src/gs-app-translation-dialog.c:71 +#, c-format +msgid "" +"%s is designed, developed, and translated by an international community of " +"contributors.\n" +"\n" +"This means that while it’s not yet available in your language, you can get " +"involved and help translate it yourself." +msgstr "" +"《%s》是由世界各地的社群貢獻者所設計、開發、翻譯的。\n" +"\n" +"這意味著即便該軟體尚未提供您所使用的語言,您依然可以參與其中並協助翻譯。" + +#: src/gs-app-translation-dialog.ui:6 +msgid "Translations" +msgstr "翻譯" + +#: src/gs-app-translation-dialog.ui:87 +msgid "_Translation Website" +msgstr "翻譯網站(_T)" + +#. TRANSLATORS: This is a description for entering user/password +#: src/gs-basic-auth-dialog.c:88 +#, c-format +msgid "Login required remote %s (realm %s)" +msgstr "需登入遠端「%s」(領域 %s)" + +#: src/gs-basic-auth-dialog.ui:6 +msgid "Login Required" +msgstr "登入請求" + +#. TRANSLATORS: button text +#: src/gs-basic-auth-dialog.ui:18 src/gs-common.c:272 src/gs-common.c:678 +#: src/gs-details-page.ui:291 src/gs-dkms-dialog.ui:28 +#: src/gs-dkms-dialog.ui:120 src/gs-page.c:423 src/gs-removal-dialog.ui:24 +#: src/gs-remove-app-dialog.ui:14 src/gs-repos-dialog.c:174 +#: src/gs-repos-dialog.c:250 src/gs-review-dialog.ui:24 src/gs-review-row.c:235 +#: src/gs-review-row.c:259 src/gs-updates-page.c:852 +#: src/gs-upgrade-banner.ui:198 +msgid "_Cancel" +msgstr "取消(_C)" + +#: src/gs-basic-auth-dialog.ui:27 +msgid "_Login" +msgstr "登入(_L)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:45 +msgid "_User" +msgstr "使用者(_U)" + +#. Translators: Title for a login entry. +#: src/gs-basic-auth-dialog.ui:54 +msgid "_Password" +msgstr "密碼(_P)" + +#. TRANSLATORS: this is where all apps that don't +#. * fit in other groups are put +#: lib/gs-category.c:209 +msgid "Other" +msgstr "其他" + +#. TRANSLATORS: this is a subcategory matching all the +#. * different apps in the parent category, e.g. "Games" +#: lib/gs-category.c:214 +msgctxt "Category" +msgid "All" +msgstr "全部" + +#. TRANSLATORS: this is a subcategory of featured apps +#: lib/gs-category.c:218 +msgid "Featured" +msgstr "特別推薦" + +#. Heading for featured apps on a category page +#. Translators: This is a heading for software which has been featured ('picked') by the distribution. +#: src/gs-category-page.ui:40 src/gs-overview-page.ui:68 +msgid "Editor’s Choice" +msgstr "編輯精選" + +#. Heading for recently updated apps on a category page +#. Translators: This is a heading for software which has been recently released upstream. +#: src/gs-category-page.ui:69 src/gs-overview-page.ui:93 +msgid "New & Updated" +msgstr "新上架與近期更新" + +#. Heading for web apps on a category page +#: src/gs-category-page.ui:98 +msgid "Picks from the Web" +msgstr "網路應用程式" + +#. Heading for the rest of the apps on a category page +#: src/gs-category-page.ui:126 +msgid "Other Software" +msgstr "其他" + +#. TRANSLATORS: this is the summary of a notification that an app +#. * has been successfully installed +#. TRANSLATORS: this is the summary of a notification that a component +#. * has been successfully installed +#: src/gs-common.c:65 src/gs-common.c:88 +#, c-format +msgid "%s Installed" +msgstr "%s 已安裝" + +#. TRANSLATORS: an app has been installed, but +#. * needs a reboot to complete the installation +#: src/gs-common.c:69 src/gs-common.c:92 +msgid "A restart is required for the changes to take effect" +msgstr "需要重新啟動才能讓改變生效" + +#. TRANSLATORS: this is the body of a notification that an app +#. * has been successfully installed +#: src/gs-common.c:73 +msgid "The app is ready to be used" +msgstr "程式已準備好可使用" + +#. TRANSLATORS: this is the summary of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:81 +msgid "System Updates Installed" +msgstr "系統更新已安裝" + +#. TRANSLATORS: this is the body of a notification that OS updates +#. * have been successfully installed +#: src/gs-common.c:84 +msgid "Recently installed updates are available to review" +msgstr "可以查看近期所安裝的更新" + +#. TRANSLATORS: button text +#: src/gs-common.c:103 src/gs-common.c:846 +msgid "Restart" +msgstr "重新啟動" + +#: src/gs-common.c:109 +msgid "Launch" +msgstr "啟動" + +#. TRANSLATORS: window title +#: src/gs-common.c:208 +msgid "Install Software?" +msgstr "是否要安裝軟體?" + +#. TRANSLATORS: window title +#: src/gs-common.c:210 +msgid "Install Third-Party Software?" +msgstr "要安裝第三方軟體嗎?" + +#. TRANSLATORS: window title +#: src/gs-common.c:214 +msgid "Enable Software Repository?" +msgstr "要啟用軟體庫嗎?" + +#. TRANSLATORS: window title +#. ask for confirmation +#. TRANSLATORS: "Enable Third-Party Software Repository?" is +#. * the confirmation dialog title +#: src/gs-common.c:216 src/gs-repos-dialog.c:171 +msgid "Enable Third-Party Software Repository?" +msgstr "要啟用第三方軟體庫嗎?" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#. +#: src/gs-common.c:228 +#, c-format +msgid "" +"%s is not free and open source software, and is provided by “%s”." +msgstr "" +"《%s》並非 自由及開源軟體,由「%s」提供。" + +#. TRANSLATORS: the replacements are as follows: +#. * 1. App name, e.g. "Firefox" +#. * 2. Software repository name, e.g. fedora-optional +#: src/gs-common.c:238 +#, c-format +msgid "%s is provided by “%s”." +msgstr "《%s》由「%s」提供。" + +#: src/gs-common.c:247 +msgid "This software repository must be enabled to continue installation." +msgstr "需啟用該軟體庫才能繼續安裝。" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:257 +#, c-format +msgid "It may be illegal to install or use %s in some countries." +msgstr "在某些國家安裝或使用《%s》可能是違法的。" + +#. TRANSLATORS: Laws are geographical, urgh... +#: src/gs-common.c:263 +msgid "It may be illegal to install or use this codec in some countries." +msgstr "在某些國家安裝或使用該編解碼器可能是違法的。" + +#. TRANSLATORS: this is button text to not ask about non-free content again +#: src/gs-common.c:275 +msgid "Don’t _Warn Again" +msgstr "不再警告(_W)" + +#. TRANSLATORS: button text +#: src/gs-common.c:284 +msgid "Enable and _Install" +msgstr "啟用並安裝(_I)" + +#. TRANSLATORS: these are show_detailed_error messages from the +#. * package manager no mortal is supposed to understand, +#. * but google might know what they mean +#: src/gs-common.c:495 +msgid "Detailed errors from the package manager follow:" +msgstr "軟體包管理器的詳細錯誤資訊如下:" + +#: src/gs-common.c:500 src/gs-safety-context-dialog.ui:67 +#: src/gs-updates-paused-banner.c:77 src/gs-utils-error-dialog-simple.ui:31 +msgid "Details" +msgstr "詳細資訊" + +#. TRANSLATORS: button text +#: src/gs-common.c:558 src/gs-updates-paused-banner.c:64 +msgid "_Close" +msgstr "關閉(_C)" + +#: src/gs-common.c:590 +msgid "Details copied to clipboard" +msgstr "詳細資訊已複製到剪貼簿" + +#. Translators: an accept button label, in a Cancel/Accept dialog +#: src/gs-common.c:670 +msgid "_Accept" +msgstr "接受(_A)" + +#. TRANSLATORS: we've just live-updated some apps +#: src/gs-common.c:821 +msgid "An update has been installed" +msgid_plural "Updates have been installed" +msgstr[0] "已安裝更新" + +#. TRANSLATORS: we've just uninstalled some apps +#: src/gs-common.c:831 +msgid "An app has been uninstalled" +msgid_plural "Apps have been uninstalled" +msgstr[0] "已經解除安裝程式" + +#. TRANSLATORS: the new apps will not be run until we restart +#: src/gs-common.c:837 +msgid "A restart is required for it to take effect" +msgid_plural "A restart is required for them to take effect" +msgstr[0] "需要重新啟動才能讓改變生效" + +#. TRANSLATORS: button text +#: src/gs-common.c:844 +msgid "Not Now" +msgstr "現在不要" + +#. TRANSLATORS: something happened less than a day ago +#: src/gs-common.c:939 +msgid "Today" +msgstr "今日" + +#. TRANSLATORS: something happened more than a day ago but less than 2 days ago +#: src/gs-common.c:942 +msgid "Yesterday" +msgstr "昨日" + +#: src/gs-common.c:944 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d 天前" + +#: src/gs-common.c:948 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d 週前" + +#: src/gs-common.c:952 +#, c-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d 個月前" + +#: src/gs-common.c:956 +#, c-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d 年前" + +#. TRANSLATORS: something happened less than 5 minutes ago +#: src/gs-common.c:1013 +msgid "Just now" +msgstr "就在剛才" + +#: src/gs-common.c:1015 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d 分鐘前" + +#: src/gs-common.c:1017 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d 小時前" + +#. Translators: This is to construct a disk size string consisting of the value and its unit, while +#. * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". +#. * Make sure you'll preserve the no break space between the values. +#. * Example result: "13.0 MB" +#: src/gs-common.c:1380 +#, c-format +msgctxt "format-size" +msgid "%s %s" +msgstr "%s %s" + +#: lib/gs-desktop-data.c:16 +msgctxt "Menu of Graphics & Photography" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:20 +msgctxt "Menu of Graphics & Photography" +msgid "Featured" +msgstr "特別推薦" + +#: lib/gs-desktop-data.c:24 +msgctxt "Menu of Graphics & Photography" +msgid "3D Graphics" +msgstr "3D 圖形" + +#: lib/gs-desktop-data.c:27 +msgctxt "Menu of Graphics & Photography" +msgid "Photography" +msgstr "攝影" + +#: lib/gs-desktop-data.c:30 +msgctxt "Menu of Graphics & Photography" +msgid "Scanning" +msgstr "掃描" + +#: lib/gs-desktop-data.c:33 +msgctxt "Menu of Graphics & Photography" +msgid "Vector Graphics" +msgstr "向量圖形" + +#: lib/gs-desktop-data.c:36 +msgctxt "Menu of Graphics & Photography" +msgid "Viewers" +msgstr "檢視器" + +#: lib/gs-desktop-data.c:39 +msgctxt "Menu of Audio & Video" +msgid "Audio Creation & Editing" +msgstr "音訊創作和編輯" + +#: lib/gs-desktop-data.c:45 +msgctxt "Menu of Audio & Video" +msgid "Music Players" +msgstr "音樂播放器" + +#: lib/gs-desktop-data.c:53 +msgctxt "Menu of Productivity" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:58 +msgctxt "Menu of Productivity" +msgid "Featured" +msgstr "特別推薦" + +#: lib/gs-desktop-data.c:62 +msgctxt "Menu of Productivity" +msgid "Calendar" +msgstr "行事曆" + +#: lib/gs-desktop-data.c:66 +msgctxt "Menu of Productivity" +msgid "Database" +msgstr "資料庫" + +#: lib/gs-desktop-data.c:69 +msgctxt "Menu of Productivity" +msgid "Finance" +msgstr "財經" + +#: lib/gs-desktop-data.c:73 +msgctxt "Menu of Productivity" +msgid "Word Processor" +msgstr "文書處理器" + +#: lib/gs-desktop-data.c:77 +msgctxt "Menu of Utilities" +msgid "Text Editors" +msgstr "文字編輯器" + +#: lib/gs-desktop-data.c:80 +msgctxt "Menu of Communication & News" +msgid "Web Browsers" +msgstr "網頁瀏覽器" + +#: lib/gs-desktop-data.c:87 +msgctxt "Menu of Audio & Video" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:90 +msgctxt "Menu of Audio & Video" +msgid "Featured" +msgstr "特別推薦" + +#: lib/gs-desktop-data.c:93 +msgctxt "Menu of Games" +msgid "Action" +msgstr "動作" + +#: lib/gs-desktop-data.c:96 +msgctxt "Menu of Games" +msgid "Adventure" +msgstr "冒險" + +#: lib/gs-desktop-data.c:99 +msgctxt "Menu of Games" +msgid "Arcade" +msgstr "機臺" + +#: lib/gs-desktop-data.c:102 +msgctxt "Menu of Games" +msgid "Blocks" +msgstr "方塊" + +#: lib/gs-desktop-data.c:105 +msgctxt "Menu of Games" +msgid "Board" +msgstr "棋盤" + +#: lib/gs-desktop-data.c:108 +msgctxt "Menu of Games" +msgid "Card" +msgstr "紙牌" + +#: lib/gs-desktop-data.c:111 +msgctxt "Menu of Games" +msgid "Emulators" +msgstr "模擬器" + +#: lib/gs-desktop-data.c:114 +msgctxt "Menu of Games" +msgid "Kids" +msgstr "孩童" + +#: lib/gs-desktop-data.c:117 +msgctxt "Menu of Games" +msgid "Logic" +msgstr "邏輯" + +#: lib/gs-desktop-data.c:121 +msgctxt "Menu of Games" +msgid "Role Playing" +msgstr "角色扮演" + +#: lib/gs-desktop-data.c:124 +msgctxt "Menu of Games" +msgid "Sports" +msgstr "運動" + +#: lib/gs-desktop-data.c:127 +msgctxt "Menu of Games" +msgid "Strategy" +msgstr "策略" + +#: lib/gs-desktop-data.c:134 +msgctxt "Menu of Communication & News" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:137 +msgctxt "Menu of Communication & News" +msgid "Featured" +msgstr "特別推薦" + +#: lib/gs-desktop-data.c:140 +msgctxt "Menu of Communication & News" +msgid "Chat" +msgstr "聊天" + +#: lib/gs-desktop-data.c:151 +msgctxt "Menu of Education & Science" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:158 +msgctxt "Menu of Education & Science" +msgid "Featured" +msgstr "特別推薦" + +#: lib/gs-desktop-data.c:163 +msgctxt "Menu of Education & Science" +msgid "Artificial Intelligence" +msgstr "人工智慧" + +#: lib/gs-desktop-data.c:166 +msgctxt "Menu of Education & Science" +msgid "Astronomy" +msgstr "天文" + +#: lib/gs-desktop-data.c:170 +msgctxt "Menu of Education & Science" +msgid "Chemistry" +msgstr "化學" + +#: lib/gs-desktop-data.c:174 +msgctxt "Menu of Education & Science" +msgid "Languages" +msgstr "語言" + +#: lib/gs-desktop-data.c:178 +msgctxt "Menu of Education & Science" +msgid "Math" +msgstr "數學" + +#: lib/gs-desktop-data.c:185 +msgctxt "Menu of Communication & News" +msgid "News" +msgstr "新聞" + +#: lib/gs-desktop-data.c:189 +msgctxt "Menu of Education & Science" +msgid "Robotics" +msgstr "機器人" + +#: lib/gs-desktop-data.c:192 +msgctxt "Menu of Art" +msgid "Art" +msgstr "藝術" + +#: lib/gs-desktop-data.c:195 +msgctxt "Menu of Reference" +msgid "Biography" +msgstr "傳記" + +#: lib/gs-desktop-data.c:198 +msgctxt "Menu of Reference" +msgid "Comics" +msgstr "漫畫" + +#: lib/gs-desktop-data.c:201 +msgctxt "Menu of Reference" +msgid "Fiction" +msgstr "小說" + +#: lib/gs-desktop-data.c:204 +msgctxt "Menu of Reference" +msgid "Health" +msgstr "健康" + +#: lib/gs-desktop-data.c:207 +msgctxt "Menu of Reference" +msgid "History" +msgstr "歷史" + +#: lib/gs-desktop-data.c:210 +msgctxt "Menu of Reference" +msgid "Lifestyle" +msgstr "生活風格" + +#: lib/gs-desktop-data.c:213 +msgctxt "Menu of Reference" +msgid "Politics" +msgstr "政治" + +#: lib/gs-desktop-data.c:216 +msgctxt "Menu of Reference" +msgid "Sports" +msgstr "運動" + +#: lib/gs-desktop-data.c:223 +msgctxt "Menu of Developer Tools" +msgid "All" +msgstr "全部" + +#: lib/gs-desktop-data.c:226 +msgctxt "Menu of Developer Tools" +msgid "Featured" +msgstr "特別推薦" + +#: lib/gs-desktop-data.c:229 +msgctxt "Menu of Developer Tools" +msgid "Debuggers" +msgstr "除錯器" + +#: lib/gs-desktop-data.c:232 +msgctxt "Menu of Developer Tools" +msgid "IDEs" +msgstr "IDE" + +#: lib/gs-desktop-data.c:240 +msgctxt "Menu of Add-ons" +msgid "Codecs" +msgstr "編解碼器" + +#: lib/gs-desktop-data.c:247 +msgctxt "Menu of Add-ons" +msgid "Hardware Drivers" +msgstr "硬體驅動程式" + +#: lib/gs-desktop-data.c:254 +msgctxt "Menu of Add-ons" +msgid "Fonts" +msgstr "字型" + +#: lib/gs-desktop-data.c:261 +msgctxt "Menu of Add-ons" +msgid "Input Sources" +msgstr "輸入來源" + +#: lib/gs-desktop-data.c:268 +msgctxt "Menu of Add-ons" +msgid "Language Packs" +msgstr "語言包" + +#: lib/gs-desktop-data.c:275 +msgctxt "Menu of Add-ons" +msgid "Localization" +msgstr "在地化" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:285 +msgid "Create" +msgstr "創作" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:287 +msgid "Work" +msgstr "工作" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:289 +msgid "Play" +msgstr "遊玩" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:291 +msgid "Socialize" +msgstr "社交" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:293 +msgid "Learn" +msgstr "學習" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:295 +msgid "Develop" +msgstr "開發" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:298 +msgid "Codecs" +msgstr "編解碼器" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:300 +msgid "Hardware Drivers" +msgstr "硬體驅動程式" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:302 +msgid "Fonts" +msgstr "字型" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:304 +msgid "Input Sources" +msgstr "輸入來源" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:306 +msgid "Language Packs" +msgstr "語言包" + +#. Translators: this is a menu category +#: lib/gs-desktop-data.c:308 +msgid "Localization" +msgstr "在地化" + +#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown +#: src/gs-dbus-helper.c:291 +msgid "An app" +msgstr "程式" + +#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types. +#: src/gs-dbus-helper.c:297 +#, c-format +msgid "%s is requesting additional file format support." +msgstr "《%s》要求額外的檔案格式支援。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:299 +msgid "Additional MIME Types Required" +msgstr "需要額外的 MIME 類型" + +#. TRANSLATORS: this is a notification displayed when an app needs additional fonts. +#: src/gs-dbus-helper.c:303 +#, c-format +msgid "%s is requesting additional fonts." +msgstr "《%s》要求額外的字型。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:305 +msgid "Additional Fonts Required" +msgstr "需要額外的字型" + +#. TRANSLATORS: this is a notification displayed when an app needs additional codecs. +#: src/gs-dbus-helper.c:309 +#, c-format +msgid "%s is requesting additional multimedia codecs." +msgstr "《%s》要求額外的多媒體編解碼器支援。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:311 +msgid "Additional Multimedia Codecs Required" +msgstr "需要額外的多媒體編解碼器" + +#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. +#: src/gs-dbus-helper.c:315 +#, c-format +msgid "%s is requesting additional printer drivers." +msgstr "《%s》要求額外的印表機驅動程式支援。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:317 +msgid "Additional Printer Drivers Required" +msgstr "需要額外的印表機驅動程式" + +#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages. +#: src/gs-dbus-helper.c:321 +#, c-format +msgid "%s is requesting additional packages." +msgstr "《%s》要求額外的軟體包。" + +#. TRANSLATORS: notification title +#: src/gs-dbus-helper.c:323 +msgid "Additional Packages Required" +msgstr "需要額外的軟體包" + +#. TRANSLATORS: this is a button that launches gnome-software +#: src/gs-dbus-helper.c:338 +msgid "Find in Software" +msgstr "在《軟體》中尋找" + +#: src/gs-description-box.c:93 src/gs-description-box.c:348 +msgid "_Show More" +msgstr "顯示更多(_S)" + +#: src/gs-description-box.c:93 +msgid "_Show Less" +msgstr "顯示較少(_S)" + +#: src/gs-details-page.c:377 +msgid "Removing…" +msgstr "正在移除…" + +#: src/gs-details-page.c:392 +msgid "Requires restart to finish install" +msgstr "需重新啟動以完成安裝" + +#: src/gs-details-page.c:399 +msgid "Requires restart to finish remove" +msgstr "需重新啟動以完成移除" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be installed soon +#: src/gs-details-page.c:415 +msgid "Pending installation…" +msgstr "安裝待處置…" + +#. TRANSLATORS: This is a label on top of the app's progress +#. * bar to inform the user that the app should be updated soon +#: src/gs-details-page.c:421 +msgid "Pending update…" +msgstr "更新待處置…" + +#. Translators: This string is shown when downloading an app before install. +#: src/gs-details-page.c:436 src/gs-upgrade-banner.c:180 +msgid "Downloading…" +msgstr "正在下載…" + +#. Translators: This string is shown when preparing to download and install an app. +#: src/gs-details-page.c:439 +msgid "Preparing…" +msgstr "正在準備…" + +#. Translators: This string is shown when uninstalling an app. +#: src/gs-details-page.c:442 +msgid "Uninstalling…" +msgstr "正在解除安裝…" + +#. Translators: the "%s" is replaced with an app name +#: src/gs-details-page.c:569 +#, c-format +msgid "%s is not installed, but it still has data present." +msgstr "%s 未安裝,但是仍有資料存在。" + +#: src/gs-details-page.c:1073 src/gs-toast.c:65 +msgid "_Restart" +msgstr "重新啟動(_R)" + +#: src/gs-details-page.c:1079 +msgid "_Enable…" +msgstr "啟用(_E)…" + +#. TRANSLATORS: this is a button that allows the apps to +#. * be installed. +#. * The ellipsis indicates that further steps are required, +#. * e.g. enabling software repositories or the like +#: src/gs-details-page.c:1105 +msgid "_Install…" +msgstr "安裝(_I)…" + +#. Translators: %s is the user-visible app name +#: src/gs-details-page.c:1315 +#, c-format +msgid "%s will appear in US English" +msgstr "%s 會以美式英文顯示" + +#: src/gs-details-page.c:1323 +msgid "This app will appear in US English" +msgstr "這個程式會以美式英文顯示" + +#: src/gs-details-page.c:1325 +msgid "This software will appear in US English" +msgstr "這個軟體會以美式英文顯示" + +#: src/gs-details-page.c:1360 src/gs-details-page.ui:36 +msgid "Help _Translate" +msgstr "協助翻譯(_T)" + +#. Translators: the '%s' is replaced with a developer name or a project group +#: src/gs-details-page.c:1425 +#, c-format +msgid "Other Apps by %s" +msgstr "「%s」開發的其他應用程式" + +#. Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id +#: src/gs-details-page.c:1461 +#, c-format +msgid "Developer %s has proven the ownership of %s" +msgstr "開發者 %s 已證實是 %s 的擁有者" + +#. Translators: the %s is replaced with the app id +#: src/gs-details-page.c:1464 +#, c-format +msgid "Developer has proven the ownership of %s" +msgstr "開發者已證實是 %s 的擁有者" + +#. TRANSLATORS: we need a remote server to process +#: src/gs-details-page.c:1827 +msgid "You need internet access to write a review" +msgstr "需連接網際網路才能撰寫評論" + +#: src/gs-details-page.c:1930 +msgid "This app is no longer receiving updates, including security fixes" +msgstr "這個程式不再接收更新,包括安全性修正" + +#: src/gs-details-page.c:1931 +msgid "" +"This app is already provided by your distribution and should not be replaced." +msgstr "該程式已經由您的散布版提供,不應將其替換。" + +#: src/gs-details-page.c:1932 +msgid "" +"This app doesn’t provide any links to a website, code repository or issue " +"tracker." +msgstr "該程式未提供任何網站、程式碼儲存庫或議題追蹤器的連結。" + +#: src/gs-details-page.c:1934 +msgid "This software is no longer receiving updates, including security fixes" +msgstr "該軟體不再接收更新,包括安全性修正" + +#: src/gs-details-page.c:1935 +msgid "" +"This software is already provided by your distribution and should not be " +"replaced." +msgstr "該軟體已經由您的散布版提供,不應將其替換。" + +#: src/gs-details-page.c:1936 +msgid "" +"This software doesn’t provide any links to a website, code repository or " +"issue tracker." +msgstr "該軟體不提供任何網站、程式碼儲存庫或議題追蹤器連結。" + +#: src/gs-details-page.c:2026 src/gs-details-page.c:2043 +#, c-format +msgid "" +"Software failed to retrieve information for “%s” and is unable to show the " +"details for this app." +msgstr "《軟體》無法從「%s」擷取資訊,且無法顯示該程式的詳細資料。" + +#: src/gs-details-page.c:2411 +msgid "Invalid review response received from server" +msgstr "從伺服器收到無效的評論回應" + +#: src/gs-details-page.c:2421 +#, c-format +msgid "Failed to submit review for “%s”: %s" +msgstr "無法為「%s」提交評論︰%s" + +#: src/gs-details-page.ui:7 +msgid "Details page" +msgstr "詳細資訊頁面" + +#: src/gs-details-page.ui:22 +msgid "Loading App Details" +msgstr "正載入程式詳細資訊" + +#: src/gs-details-page.ui:146 +msgid "Verified" +msgstr "已驗證" + +#. TRANSLATORS: A label for a button to execute the selected app. +#: src/gs-details-page.ui:220 +msgid "_Open" +msgstr "開啟(_O)" + +#: src/gs-details-page.ui:236 plugins/packagekit/gs-packagekit-task.c:159 +msgid "_Update" +msgstr "更新(_U)" + +#. TRANSLATORS: button text in the header when an app can be erased +#: src/gs-details-page.ui:254 src/gs-details-page.ui:264 +msgid "Uninstall" +msgstr "解除安裝" + +#: src/gs-details-page.ui:453 src/gs-installed-page.ui:126 +msgid "Add-ons" +msgstr "附加元件" + +#: src/gs-details-page.ui:606 +msgid "This app can only be used when there is an active internet connection." +msgstr "該程式僅能在連接網際網路後使用。" + +#: src/gs-details-page.ui:629 +msgid "Software Repository Included" +msgstr "附帶軟體庫" + +#: src/gs-details-page.ui:639 +msgid "" +"This app includes a software repository which provides updates, as well as " +"access to other software." +msgstr "該程式附帶能提供更新及其他軟體的軟體庫。" + +#: src/gs-details-page.ui:667 +msgid "No Software Repository Included" +msgstr "未附帶軟體庫" + +#: src/gs-details-page.ui:677 +msgid "" +"This app does not include a software repository. It will not be updated with " +"new versions." +msgstr "該程式並未附帶軟體庫,無法提供版本更新。" + +#. Translators: a repository file used for installing software has been discovered. +#: src/gs-details-page.ui:736 +msgid "Software Repository Identified" +msgstr "已識別的軟體庫" + +#: src/gs-details-page.ui:746 +msgid "" +"Adding this software repository will give you access to additional software " +"and upgrades." +msgstr "加入該軟體庫便能取得額外的軟體與升級。" + +#: src/gs-details-page.ui:753 +msgid "Only use software repositories that you trust." +msgstr "僅使用您所信任的軟體庫。" + +#: src/gs-details-page.ui:794 +msgid "Clear app data" +msgstr "清除程式資料" + +#: src/gs-details-page.ui:811 +msgid "D_elete Data" +msgstr "刪除資料(_E)" + +#: src/gs-details-page.ui:887 +msgid "No Metadata" +msgstr "沒有中介資料" + +#: src/gs-details-page.ui:924 +msgid "Project _Website" +msgstr "專案網站(_W)" + +#: src/gs-details-page.ui:940 +msgid "_Donate" +msgstr "捐款贊助(_D)" + +#: src/gs-details-page.ui:956 +msgid "Contribute _Translations" +msgstr "貢獻翻譯(_T)" + +#: src/gs-details-page.ui:972 +msgid "_Report an Issue" +msgstr "回報議題(_R)" + +#: src/gs-details-page.ui:988 +msgid "_Help" +msgstr "求助(_H)" + +#. Translators: This is a verb, used on a button to ‘contact the developer’ +#: src/gs-details-page.ui:1004 +msgctxt "verb" +msgid "_Contact" +msgstr "聯絡(_C)" + +#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps. +#: src/gs-details-page.ui:1085 +msgid "Write R_eview" +msgstr "撰寫評論(_E)" + +#. Translators: Button opening a dialog showing all reviews for an app. +#: src/gs-details-page.ui:1102 +msgid "All Reviews" +msgstr "所有評論" + +#: src/gs-details-page.ui:1174 +msgid "Unable to Show App Details" +msgstr "無法顯示程式詳細資料" + +#: src/gs-dkms-dialog.c:66 +msgid "Failed to prepare reboot" +msgstr "重新開機準備失敗" + +#: src/gs-dkms-dialog.c:92 +msgid "Unknown error" +msgstr "未知錯誤" + +#: src/gs-dkms-dialog.c:98 +msgid "The key was not found" +msgstr "找不到金鑰" + +#: src/gs-dkms-dialog.c:101 +msgid "The key is not enrolled" +msgstr "金鑰尚未登記" + +#: src/gs-dkms-dialog.ui:17 src/gs-dkms-dialog.ui:108 +msgid "MOK Enrollment Required" +msgstr "需要登記 MOK" + +#: src/gs-dkms-dialog.ui:36 +msgid "_Next" +msgstr "下一步(_N)" + +#: src/gs-dkms-dialog.ui:55 +msgid "" +"This device has Secure Boot enabled. To allow new drivers to be enabled, a " +"new machine owner key (MOK) must be enrolled. The process requires a " +"password to be entered later in the process. Please note down the following " +"password associated with the key:" +msgstr "" +"該裝置有啟用「安全開機」。若要允許新的驅動程式啟用,必須登記新的機器擁有者金" +"鑰 (MOK, machine owner key)。該程序需要密碼,要在之後的過程中輸入。請記錄下列" +"與金鑰相關聯的密碼:" + +#: src/gs-dkms-dialog.ui:83 +msgid "I have made a note of the MOK _password" +msgstr "我已經記錄好 MOK 密碼(_P)" + +#: src/gs-dkms-dialog.ui:128 +msgid "_Restart & Enroll…" +msgstr "重新啟動並登記(_R)…" + +#: src/gs-dkms-dialog.ui:149 +msgid "Setup Instructions: Please Read Carefully" +msgstr "設置指示:請謹慎閱讀" + +#: src/gs-dkms-dialog.ui:166 +msgid "" +"After restart, a device setup screen will be shown. To enable new drivers, " +"proceed through the setup steps:" +msgstr "" +"在重新開機之後,會顯示裝置設置畫面。若要啟用新的驅動程式,請依設置步驟走過程" +"序:" + +#: src/gs-dkms-dialog.ui:179 +msgid "" +"• Select “Enroll MOK”\n" +"• Select “Yes” to enroll keys\n" +"• Enter the MOK password when prompted\n" +"• Then select “Reboot”" +msgstr "" +"• 選取「登記 MOK」\n" +"• 選取「是」登記金鑰\n" +"• 提示時輸入 MOK 密碼\n" +"• 接著選取「重新開機」" + +#: src/gs-dkms-dialog.ui:211 +msgid "Security Implications" +msgstr "安全性疑慮" + +#: src/gs-dkms-dialog.ui:230 +msgid "" +"After successful key enrollment, be aware that any future updates to the " +"module or any other module will be implicitly trusted. All future updates " +"will happen transparently with no interaction and or authorization." +msgstr "" +"在金鑰登記成功後,請注意該模組或任何其他模組未來的任何更新,將不懷疑直接信" +"任。所有未來更新,會在沒有任何互動或授權的情況下透明發生。" + +#: src/gs-dkms-dialog.ui:244 +msgid "" +"Further guidance can be found on the docs page." +msgstr "" +"更深入的指引可以在文件頁面中查看。" + +#. TRANSLATORS: status text when downloading +#: lib/gs-external-appstream-utils.c:293 +msgid "Downloading extra metadata files…" +msgstr "下載額外的中介資料檔案中…" + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:142 +msgid " and " +msgstr " 與 " + +#. TRANSLATORS: separator for a list of items +#: src/gs-extras-page.c:145 +msgid ", " +msgstr "、" + +#. TRANSLATORS: App window title for fonts installation. +#. %s will be replaced by name of the script we're searching for. +#: src/gs-extras-page.c:171 +#, c-format +msgid "Available fonts for the %s script" +msgid_plural "Available fonts for the %s scripts" +msgstr[0] "「%s」文書可用的字型" + +#. TRANSLATORS: App window title for codec installation. +#. %s will be replaced by actual codec name(s) +#: src/gs-extras-page.c:179 +#, c-format +msgid "Available software for %s" +msgid_plural "Available software for %s" +msgstr[0] "「%s」可用的軟體" + +#: src/gs-extras-page.c:225 +msgid "Requested software not found" +msgstr "找不到要求的軟體" + +#: src/gs-extras-page.c:227 +msgid "Failed to find requested software" +msgstr "無法找到要求的軟體" + +#. TRANSLATORS: This string is used for codecs that weren't found +#: src/gs-extras-page.c:409 +#, c-format +msgid "%s not found" +msgstr "找不到「%s」" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:413 +msgid "on the website" +msgstr "網站" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:420 +#, c-format +msgid "No apps are available that provide the file %s." +msgstr "沒有提供「%s」檔案的程式。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:424 src/gs-extras-page.c:435 src/gs-extras-page.c:446 +#, c-format +msgid "" +"Information about %s, as well as options for how to get missing apps might " +"be found %s." +msgstr "「%s」的相關資訊,以及如何取得遺漏之程式的選項可於%s中找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:431 src/gs-extras-page.c:453 +#, c-format +msgid "No apps are available for %s support." +msgstr "沒有程式支援「%s」。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:442 +#, c-format +msgid "%s is not available." +msgstr "「%s」無法使用。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:457 +#, c-format +msgid "" +"Information about %s, as well as options for how to get an app that can " +"support this format might be found %s." +msgstr "要瞭解「%s」的相關資訊及如何取得支援此格式之程式的選項可於%s中找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:464 +#, c-format +msgid "No fonts are available for the %s script support." +msgstr "沒有「%s」文字系統可用的字型。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:468 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional fonts " +"might be found %s." +msgstr "要瞭解「%s」的相關資訊及如何取得額外字型的選項可於%s中找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:475 +#, c-format +msgid "No addon codecs are available for the %s format." +msgstr "沒有「%s」格式可用的附加編解碼器。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:479 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a codec that can " +"play this format might be found %s." +msgstr "" +"要瞭解「%s」的相關資訊及如何取得可播放該格式之編解碼器的選項可於%s中找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:486 +#, c-format +msgid "No Plasma resources are available for %s support." +msgstr "沒有「%s」可用的《Plasma》資源。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:490 +#, c-format +msgid "" +"Information about %s, as well as options for how to get additional Plasma " +"resources might be found %s." +msgstr "" +"要瞭解「%s」的相關資訊及如何取得額外之《Plasma》資源的選項可於%s中找到。" + +#. TRANSLATORS: this is when we know about an app or +#. * addon, but it can't be listed for some reason +#: src/gs-extras-page.c:497 +#, c-format +msgid "No printer drivers are available for %s." +msgstr "沒有「%s」可用的印表機驅動程式。" + +#. TRANSLATORS: first %s is the codec name, and second %s is a +#. * hyperlink with the "on the website" text +#: src/gs-extras-page.c:501 +#, c-format +msgid "" +"Information about %s, as well as options for how to get a driver that " +"supports this printer might be found %s." +msgstr "" +"要瞭解「%s」的相關資訊及如何取得支援該印表機之驅動程式的選項可於%s中找到。" + +#. TRANSLATORS: hyperlink title +#: src/gs-extras-page.c:547 +msgid "the documentation" +msgstr "文件" + +#. TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), +#. the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" +#: src/gs-extras-page.c:553 +#, c-format +msgid "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgid_plural "" +"Unable to find the %s requested by %s. Please see %s for more information." +msgstr[0] "找不到《%2$s》所要求的「%1$s」。請參閱%3$s以深入瞭解資訊。" + +#. TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" +#: src/gs-extras-page.c:562 +#, c-format +msgid "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgid_plural "" +"Unable to find the %s you were searching for. Please see %s for more " +"information." +msgstr[0] "找不到您所搜尋的內容「%s」。請參閱%s深入瞭解資訊。" + +#: src/gs-extras-page.c:640 src/gs-extras-page.c:697 src/gs-extras-page.c:737 +#, c-format +msgid "Failed to find any search results: %s" +msgstr "找不到任何搜尋結果:%s" + +#: src/gs-extras-page.c:954 +#, c-format +msgid "%s file format" +msgstr "「%s」檔案格式" + +#: src/gs-extras-page.c:1312 +msgid "Install _All" +msgstr "全部安裝(_A)" + +#: src/gs-extras-page.c:1342 +msgid "Unable to Find Requested Software" +msgstr "無法尋找要求的軟體" + +#: src/gs-extras-page.ui:7 +msgid "Codecs page" +msgstr "編解碼器頁面" + +#: src/gs-extras-page.ui:81 +msgid "No Results Found" +msgstr "找不到結果" + +#: src/gs-extras-page.ui:93 +msgid "Unable To Perform Search" +msgstr "無法執行搜尋" + +#: src/gs-featured-carousel.ui:43 +msgid "Previous" +msgstr "上一個" + +#: src/gs-featured-carousel.ui:66 +msgid "Next" +msgstr "下一個" + +#: src/gs-featured-carousel.ui:83 +msgid "Featured Apps List" +msgstr "特別推薦的應用程式列表" + +#: src/gs-hardware-support-context-dialog.c:589 +#: src/gs-hardware-support-context-dialog.c:598 +msgid "Desktop Support" +msgstr "桌面支援" + +#: src/gs-hardware-support-context-dialog.c:590 +#: src/gs-hardware-support-context-dialog.c:599 +msgid "Supports being used on a large screen" +msgstr "支援在大螢幕上使用" + +#: src/gs-hardware-support-context-dialog.c:592 +msgid "Desktop Support Unknown" +msgstr "桌面支援狀況未知" + +#: src/gs-hardware-support-context-dialog.c:593 +msgid "Not enough information to know if large screens are supported" +msgstr "資訊不足,無法得知是否支援大螢幕" + +#: src/gs-hardware-support-context-dialog.c:596 +msgid "Requires a large screen" +msgstr "需為大螢幕" + +#: src/gs-hardware-support-context-dialog.c:601 +msgid "Desktop Not Supported" +msgstr "不支援桌面" + +#: src/gs-hardware-support-context-dialog.c:602 +msgid "Cannot be used on a large screen" +msgstr "不適用於大螢幕" + +#: src/gs-hardware-support-context-dialog.c:609 +#: src/gs-hardware-support-context-dialog.c:618 +msgid "Mobile Support" +msgstr "行動裝置支援" + +#: src/gs-hardware-support-context-dialog.c:610 +#: src/gs-hardware-support-context-dialog.c:619 +msgid "Supports being used on a small screen" +msgstr "支援在小螢幕上使用" + +#: src/gs-hardware-support-context-dialog.c:612 +msgid "Mobile Support Unknown" +msgstr "行動裝置支援狀況未知" + +#: src/gs-hardware-support-context-dialog.c:613 +msgid "Not enough information to know if small screens are supported" +msgstr "資訊不足,無法得知是否支援小螢幕" + +#: src/gs-hardware-support-context-dialog.c:616 +msgid "Requires a small screen" +msgstr "需為小螢幕" + +#: src/gs-hardware-support-context-dialog.c:621 +msgid "Mobile Not Supported" +msgstr "不支援行動裝置" + +#: src/gs-hardware-support-context-dialog.c:622 +msgid "Cannot be used on a small screen" +msgstr "不適用於小螢幕" + +#: src/gs-hardware-support-context-dialog.c:645 +#: src/gs-hardware-support-context-dialog.c:654 +msgid "Keyboard Support" +msgstr "鍵盤支援" + +#: src/gs-hardware-support-context-dialog.c:648 +msgid "Keyboard Support Unknown" +msgstr "鍵盤支援狀況未知" + +#: src/gs-hardware-support-context-dialog.c:649 +msgid "Not enough information to know if keyboards are supported" +msgstr "資訊不足,無法得知是否支援鍵盤" + +#: src/gs-hardware-support-context-dialog.c:651 +msgid "Keyboard Required" +msgstr "需要鍵盤" + +#: src/gs-hardware-support-context-dialog.c:655 +msgid "Supports keyboards" +msgstr "支援鍵盤" + +#: src/gs-hardware-support-context-dialog.c:657 +msgid "Keyboard Not Supported" +msgstr "不支援鍵盤" + +#: src/gs-hardware-support-context-dialog.c:658 +msgid "Cannot be used with a keyboard" +msgstr "無法搭配鍵盤使用" + +#: src/gs-hardware-support-context-dialog.c:665 +#: src/gs-hardware-support-context-dialog.c:674 +msgid "Mouse Support" +msgstr "滑鼠支援" + +#: src/gs-hardware-support-context-dialog.c:666 +#: src/gs-hardware-support-context-dialog.c:672 +msgid "Requires a mouse or pointing device" +msgstr "需要滑鼠或指向裝置" + +#: src/gs-hardware-support-context-dialog.c:668 +msgid "Mouse Support Unknown" +msgstr "滑鼠支援狀況未知" + +#: src/gs-hardware-support-context-dialog.c:669 +msgid "" +"Not enough information to know if mice or pointing devices are supported" +msgstr "資訊不足,無法得知是否支援滑鼠或指向裝置" + +#: src/gs-hardware-support-context-dialog.c:671 +msgid "Mouse Required" +msgstr "需要滑鼠" + +#: src/gs-hardware-support-context-dialog.c:675 +msgid "Supports mice and pointing devices" +msgstr "支援滑鼠與指向裝置" + +#: src/gs-hardware-support-context-dialog.c:677 +msgid "Mouse Not Supported" +msgstr "不支援滑鼠" + +#: src/gs-hardware-support-context-dialog.c:678 +msgid "Cannot be used with a mouse or pointing device" +msgstr "無法搭配滑鼠或指向裝置使用" + +#: src/gs-hardware-support-context-dialog.c:685 +#: src/gs-hardware-support-context-dialog.c:694 +msgid "Touchscreen Support" +msgstr "觸控螢幕支援" + +#: src/gs-hardware-support-context-dialog.c:688 +msgid "Touchscreen Support Unknown" +msgstr "觸控螢幕支援狀況未知" + +#: src/gs-hardware-support-context-dialog.c:689 +msgid "Not enough information to know if touchscreens are supported" +msgstr "資訊不足,無法得知是否支援觸控螢幕" + +#: src/gs-hardware-support-context-dialog.c:691 +msgid "Touchscreen Required" +msgstr "需要觸控螢幕" + +#: src/gs-hardware-support-context-dialog.c:695 +msgid "Supports touchscreens" +msgstr "支援觸控螢幕" + +#: src/gs-hardware-support-context-dialog.c:697 +msgid "Touchscreen Not Supported" +msgstr "不支援觸控螢幕" + +#: src/gs-hardware-support-context-dialog.c:698 +msgid "Cannot be used with a touchscreen" +msgstr "無法搭配觸控螢幕使用" + +#: src/gs-hardware-support-context-dialog.c:711 +msgid "Gamepad Required" +msgstr "需要遊戲手把" + +#: src/gs-hardware-support-context-dialog.c:712 +msgid "Requires a gamepad" +msgstr "需要遊戲手把" + +#: src/gs-hardware-support-context-dialog.c:714 +msgid "Gamepad Support" +msgstr "遊戲手把支援" + +#: src/gs-hardware-support-context-dialog.c:715 +msgid "Supports gamepads" +msgstr "支援遊戲手把" + +#. Translators: It’s unknown whether this app is supported on +#. * the current hardware. The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:724 +#, c-format +msgid "%s probably works on this device" +msgstr "《%s》或許能運作於此裝置" + +#. Translators: The app will work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:731 +#, c-format +msgid "%s works on this device" +msgstr "《%s》能運作於此裝置" + +#. Translators: The app will possbily work on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:738 +#, c-format +msgid "%s possibly works on this device" +msgstr "《%s》有可能運作於此裝置" + +#. Translators: The app may not work fully on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:745 +#, c-format +msgid "%s will not work properly on this device" +msgstr "《%s》無法正常運作於此裝置" + +#. Translators: The app will not work properly on the current hardware. +#. * The placeholder is the app name. +#: src/gs-hardware-support-context-dialog.c:752 +#, c-format +msgid "%s will not work on this device" +msgstr "《%s》無法運作於此裝置" + +#. Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app +#: src/gs-hardware-support-context-dialog.ui:6 +msgid "Hardware Support" +msgstr "硬體支援" + +#: src/gs-help-overlay.ui:13 +msgid "Navigation" +msgstr "導覽" + +#: src/gs-help-overlay.ui:18 +msgid "Navigate to Explore Page" +msgstr "引導至探索頁面" + +#: src/gs-help-overlay.ui:24 +msgid "Navigate to Installed Page" +msgstr "引導至已安裝頁面" + +#: src/gs-help-overlay.ui:30 +msgid "Navigate to Updates Page" +msgstr "引導至更新頁面" + +#: src/gs-help-overlay.ui:36 +msgid "Open Search Bar" +msgstr "開啟搜尋列" + +#: src/gs-help-overlay.ui:44 +msgid "Windows" +msgstr "視窗" + +#: src/gs-help-overlay.ui:49 +msgid "Open Preferences" +msgstr "開啟偏好設定" + +#: src/gs-help-overlay.ui:55 +msgid "Open Software Repositories" +msgstr "開啟軟體庫" + +#: src/gs-help-overlay.ui:63 +msgid "Help" +msgstr "求助" + +#: src/gs-help-overlay.ui:68 +msgid "Open Keyboard Shortcuts" +msgstr "開啟鍵盤快捷鍵" + +#. Translators: This is in the context of a list of apps which are installed on the system. +#: src/gs-installed-page.c:820 +msgctxt "List of installed apps" +msgid "Installed" +msgstr "已安裝" + +#: src/gs-installed-page.ui:7 +msgid "Installed page" +msgstr "已安裝頁面" + +#: src/gs-installed-page.ui:46 +msgid "In Progress" +msgstr "正在進行" + +#. origin_ui on a remote is the repo dialogue section name, +#. * not the remote title +#: src/gs-installed-page.ui:66 plugins/flatpak/gs-flatpak-utils.c:107 +msgid "Apps" +msgstr "程式" + +#: src/gs-installed-page.ui:86 +msgid "Web Apps" +msgstr "網頁程式" + +#: src/gs-installed-page.ui:106 +msgid "System Apps" +msgstr "系統程式" + +#: src/gs-license-tile.c:102 +msgid "Community Built" +msgstr "由社群建置" + +#: src/gs-license-tile.c:113 src/gs-license-tile.ui:87 +msgid "_Get Involved" +msgstr "參與貢獻(_G)" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:121 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"該程式是在開放條件下由世界各地的社群一同開發,並採用 %s 授權條" +"款。\n" +"\n" +"您可以參與協作讓它更加美好。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:128 +#, c-format +msgid "" +"This app is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"該程式是在開放條件下由世界各地的社群一同開發,並採用 %s 授權條款。\n" +"\n" +"您可以參與協作讓它更加美好。" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:135 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"該軟體是在開放條件下由世界各地的社群一同開發,並採用 %s 授權條" +"款。\n" +"\n" +"您可以參與協作讓它更加美好。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:142 +#, c-format +msgid "" +"This software is developed in the open by an international community, and " +"released under the %s license.\n" +"\n" +"You can participate and help make it even better." +msgstr "" +"該軟體是在開放條件下由世界各地的社群一同開發,並採用 %s 授權條款。\n" +"\n" +"您可以參與協作讓它更加美好。" + +#. Translators: This indicates an app does not specify which license it's developed under. +#: src/gs-license-tile.c:148 src/gs-safety-context-dialog.c:410 +msgid "Unknown License" +msgstr "未知授權" + +#: src/gs-license-tile.c:154 src/gs-license-tile.c:172 +#: src/gs-license-tile.c:196 +msgid "_Learn More" +msgstr "深入瞭解(_L)" + +#: src/gs-license-tile.c:157 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"該程式未指定其開發所採用的授權條款,可能是專有程式。並且由於難以監測其安全" +"性,無法保證該軟體是否安全。\n" +"\n" +"您也許能,也許不能為該程式做些貢獻。" + +#: src/gs-license-tile.c:161 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary. It may be insecure in ways that are hard to detect, and it " +"may change without oversight.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"該軟體未指定其開發所採用的授權條款,可能是專有軟體。並且由於難以監測其安全" +"性,無法保證該軟體是否安全。\n" +"\n" +"您也許能,也許不能為該軟體做些貢獻。" + +#. Translators: This is used for "License Proprietary" +#: src/gs-license-tile.c:166 src/gs-safety-context-dialog.c:575 +msgid "Proprietary" +msgstr "專有授權" + +#: src/gs-license-tile.c:175 +msgid "" +"This app is not developed in the open, so only its developers know how it " +"works. It may be insecure in ways that are hard to detect, and it may change " +"without oversight.\n" +"\n" +"You may not be able to contribute to this app." +msgstr "" +"該程式並非在開放條件下開發,只有軟體開發者知道它的運作方式。並且由於難以監測" +"其安全性,無法保證該軟體是否安全。\n" +"\n" +"您可能無法為該程式做些貢獻。" + +#: src/gs-license-tile.c:179 +msgid "" +"This software is not developed in the open, so only its developers know how " +"it works. It may be insecure in ways that are hard to detect, and it may " +"change without oversight.\n" +"\n" +"You may not be able to contribute to this software." +msgstr "" +"該軟體並非在開放條件下開發,只有軟體開發者知道它的運作方式。並且由於難以監測" +"其安全性,無法保證該軟體是否安全。\n" +"\n" +"您可能無法為該軟體做些貢獻。" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-license-tile.c:190 src/gs-safety-context-dialog.c:447 +msgid "Special License" +msgstr "特殊授權" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:201 +#, c-format +msgid "" +"This app is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"該程式採用特殊授權條款 %s 開發。\n" +"\n" +"您也許能、也許不能為該程式做出貢獻。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:208 +#, c-format +msgid "" +"This app is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this app." +msgstr "" +"該程式採用特殊授權條款「%s」開發。\n" +"\n" +"您也許能、也許不能為該程式做出貢獻。" + +#. Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. +#: src/gs-license-tile.c:215 +#, c-format +msgid "" +"This software is developed under the special license %s.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"該軟體採用特殊授權條款 %s 開發。\n" +"\n" +"您也許能、也許不能為該程式做出貢獻。" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-license-tile.c:223 +#, c-format +msgid "" +"This software is developed under the special license “%s”.\n" +"\n" +"You may or may not be able to contribute to this software." +msgstr "" +"該軟體採用特殊授權條款「%s」開發。\n" +"\n" +"您也許能、也許不能為該程式做出貢獻。" + +#. TRANSLATORS: initial start +#: src/gs-loading-page.c:80 +msgid "Refreshing Data" +msgstr "正在重新整理資料" + +#: src/gs-loading-page.ui:7 +msgid "Loading page" +msgstr "正在載入頁面" + +#: src/gs-loading-page.ui:12 +msgid "Starting Up" +msgstr "正在啟動" + +#: src/gs-origin-popover-row.c:105 +msgid "Unknown source" +msgstr "未知來源" + +#. Translators: It's like a beta version of the software, a test version +#: src/gs-origin-popover-row.ui:105 +msgid "Beta" +msgstr "Beta" + +#. Translators: It's an origin scope, 'User' or 'System' installation +#: src/gs-origin-popover-row.ui:131 +msgid "User" +msgstr "使用者" + +#. TRANSLATORS: This is the header for package additions during +#. * a system update +#: src/gs-os-update-page.c:237 +msgid "Additions" +msgstr "新增" + +#. TRANSLATORS: This is the header for package removals during +#. * a system update +#: src/gs-os-update-page.c:241 +msgid "Removals" +msgstr "移除" + +#. TRANSLATORS: This is the header for package updates during +#. * a system update +#: src/gs-os-update-page.c:245 +msgctxt "Packages to be updated during a system upgrade" +msgid "Updates" +msgstr "更新" + +#. TRANSLATORS: This is the header for package downgrades during +#. * a system update +#: src/gs-os-update-page.c:249 +msgid "Downgrades" +msgstr "降級" + +#. Translators: This is a clickable link on the third party repositories message dialog. It's +#. part of a constructed sentence: "Provides access to additional software from [selected external sources]. +#. Some proprietary software is included." +#: src/gs-overview-page.c:735 +msgid "selected external sources" +msgstr "已選擇的外部來源" + +#. Translators: This is the third party repositories message dialog. +#. The %s is replaced with "selected external sources" link. +#. Repositories Preferences is an item from Software's main menu. +#: src/gs-overview-page.c:739 +#, c-format +msgid "" +"Provides access to additional software from %s. Some proprietary software is " +"included.\n" +"\n" +"You can enable those repositories later in Software Repositories preferences." +msgstr "" +"您可以自%s取用額外軟體,此處也包含一些專有軟體。\n" +"\n" +"您可以稍後在軟體庫偏好設置中啟用這些資料庫。" + +#. TRANSLATORS: Heading asking whether to turn third party software repositories on of off. +#: src/gs-overview-page.c:743 +msgid "Enable Third Party Software Repositories?" +msgstr "啟用第三方軟體庫?" + +#. TRANSLATORS: button to keep the third party software repositories off +#: src/gs-overview-page.c:748 +msgid "_Ignore" +msgstr "略過(_I)" + +#. TRANSLATORS: button to turn on third party software repositories +#. TRANSLATORS: button to accept the agreement +#: src/gs-overview-page.c:750 src/gs-repos-dialog.c:176 +msgid "_Enable" +msgstr "啟用(_E)" + +#: src/gs-overview-page.c:953 +msgid "Available for your operating system" +msgstr "可在您的作業系統上使用" + +#. Translators: the '%s' is replaced with the distribution name, constructing +#. for example: "Available for Fedora Linux" +#: src/gs-overview-page.c:957 +#, c-format +msgid "Available for %s" +msgstr "可在 %s 上使用" + +#. Translators: This is the title of the main page of the UI. +#: src/gs-overview-page.c:1256 +msgid "Explore" +msgstr "探索" + +#: src/gs-overview-page.ui:7 +msgid "Overview page" +msgstr "概覽頁面" + +#. Translators: This is a heading for a section with all available apps. +#: src/gs-overview-page.ui:146 +msgid "Available Apps" +msgstr "可用的程式" + +#. Translators: This is a heading for a list of categories. +#: src/gs-overview-page.ui:173 +msgid "Other Categories" +msgstr "其他類別" + +#: src/gs-overview-page.ui:215 +msgid "No App Data Found" +msgstr "找不到程式資料" + +#: lib/gs-plugin-loader.c:2744 +msgctxt "Distribution name" +msgid "Unknown" +msgstr "未知" + +#. TRANSLATORS: button text +#: src/gs-page.c:91 +msgid "_OK" +msgstr "確定(_O)" + +#: src/gs-page.c:272 +msgid "User declined installation" +msgstr "使用者拒絕安裝" + +#. TRANSLATORS: this is a prompt message, and +#. * '%s' is an app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:418 +#, c-format +msgid "Prepare %s" +msgstr "準備《%s》" + +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * repository name, e.g. 'GNOME Nightly' +#: src/gs-page.c:566 +#, c-format +msgid "Are you sure you want to remove the %s repository?" +msgstr "確定要移除「%s」嗎?" + +#. TRANSLATORS: Longer dialog text. The placeholder is a repository name. +#: src/gs-page.c:570 +#, c-format +msgid "" +"All apps from %s will be uninstalled, and you will have to re-install the " +"repository to use them again." +msgstr "所有來自「%s」的程式都將移除,欲再次使用必須重新安裝軟體庫。" + +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of an addon or an input method +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a runtime +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a font +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a codec +#. TRANSLATORS: this is a prompt message, and '%s' is the +#. * name of a firmware +#. TRANSLATORS: this is a prompt message, and '%s' is an +#. * app summary, e.g. 'GNOME Clocks' +#: src/gs-page.c:579 src/gs-page.c:590 src/gs-page.c:601 src/gs-page.c:612 +#: src/gs-page.c:623 src/gs-page.c:635 +#, c-format +msgid "Uninstall %s?" +msgstr "解除安裝 %s?" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of an addon or an input method. +#. Translators: the '%s' is replaced with the app name +#: src/gs-page.c:583 src/gs-page.c:642 +#, c-format +msgid "It will not be possible to use %s after removal." +msgstr "在移除之後,不再可能使用 %s。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name +#. * of a runtime. +#: src/gs-page.c:594 +#, c-format +msgid "" +"It will not be possible to use any apps which depend on %s after removal." +msgstr "在移除之後,任何依賴 %s 的程式都無法再使用。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a font. +#: src/gs-page.c:604 +#, c-format +msgid "" +"It will not be possible to use %s after removal, and any documents which use " +"it will appear in a different font." +msgstr "" +"在移除之後,不再可能使用 %s,且任何使用到它的文件都會改用不同字型顯示。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. +#: src/gs-page.c:615 +#, c-format +msgid "" +"It will not be possible to use %s after removal. This may mean some media " +"files will no longer be playable." +msgstr "在移除之後,不再可能使用 %s。這代表有些媒體檔案可能不再能播放。" + +#. TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware +#: src/gs-page.c:626 +#, c-format +msgid "" +"Hardware which depends on %s may no longer function correctly after removal." +msgstr "在移除之後,依賴 %s 的硬體可能不再能正常作用。" + +#. TRANSLATORS: Longer dialog text. The placeholder is +#. * the name of an app. +#: src/gs-page.c:650 +#, c-format +msgid "" +"It will not be possible to use %s after removal. App data and settings will " +"be kept on disk, to allow restoring the app in the future." +msgstr "" +"在移除之後,不再可能使用 %s。程式資料與設定會保留在磁碟上,允許程式在未來得以" +"還原。" + +#: src/gs-prefs-dialog.ui:6 +msgid "Preferences" +msgstr "偏好設定" + +#: src/gs-prefs-dialog.ui:12 +msgid "Software Updates" +msgstr "軟體更新" + +#: src/gs-prefs-dialog.ui:15 src/gs-safety-context-dialog.ui:108 +msgid "More Information" +msgstr "更多資訊" + +#: src/gs-prefs-dialog.ui:26 +msgid "" +"Checking for and downloading updates uses data and power. Automatic update " +"features are therefore paused when on metered network connections and when " +"power saver is on." +msgstr "" +"檢查並下載更新會消耗數據流量與電量。自動更新功能在使用計量網路連線,以及開啟" +"省電模式時會暫停。" + +#: src/gs-prefs-dialog.ui:42 +msgid "_Automatic" +msgstr "自動(_A)" + +#: src/gs-prefs-dialog.ui:43 +msgid "Automatically check for and download updates" +msgstr "自動檢查與安裝更新" + +#: src/gs-prefs-dialog.ui:57 +msgid "_Manual" +msgstr "手動(_M)" + +#: src/gs-prefs-dialog.ui:58 +msgid "Checking for and downloading updates must be done manually" +msgstr "必須手動檢查與下載更新" + +#: src/gs-prefs-dialog.ui:76 +msgid "Automatic Update _Notifications" +msgstr "自動更新通知(_N)" + +#: src/gs-prefs-dialog.ui:77 +msgid "Notify when updates have been automatically installed" +msgstr "自動更新安裝完成後顯示通知" + +#: src/gs-prefs-dialog.ui:86 +msgid "Content Filters" +msgstr "內容過濾" + +#: src/gs-prefs-dialog.ui:89 +msgid "Only Show _Free Software" +msgstr "僅顯示自由軟體(_F)" + +#: src/gs-prefs-dialog.ui:90 +msgid "Hide proprietary software when browsing and searching" +msgstr "瀏覽與搜尋時隱藏專有軟體" + +#: src/gs-prefs-dialog.ui:97 +msgid "Only Show _Verified Developers" +msgstr "僅顯示通過驗證的開發者(_V)" + +#: src/gs-prefs-dialog.ui:98 +msgid "Show only apps from developers whose identity has been verified" +msgstr "僅顯示身分已通過驗證的開發者的程式" + +#. TRANSLATORS: This is a text displayed during a distro upgrade. %s +#. will be replaced by the name and version of distro, e.g. 'Fedora 23'. +#: src/gs-removal-dialog.c:96 +#, c-format +msgid "" +"Installed software is incompatible with %s, and will be automatically " +"removed during upgrade." +msgstr "已安裝軟體和 %s 不相容,繼續升級會將下列軟體移除。" + +#: src/gs-removal-dialog.ui:6 +msgid "Incompatible Software" +msgstr "不相容的軟體" + +#: src/gs-removal-dialog.ui:33 +msgid "_Upgrade" +msgstr "升級(_U)" + +#: src/gs-remove-app-dialog.ui:15 +msgid "_Uninstall" +msgstr "解除安裝(_U)" + +#: src/gs-remove-app-dialog.ui:19 +msgid "App Settings & Data" +msgstr "程式設定與資料" + +#. Translators: this is part of section about deleting app's data, where the 'keep' means 'keep the data' +#: src/gs-remove-app-dialog.ui:22 +msgid "_Keep" +msgstr "保留(_K)" + +#: src/gs-remove-app-dialog.ui:23 +msgid "Allows restoring app settings and content" +msgstr "允許還原程式設定與內容" + +#. Translators: this is part of section about deleting app's data +#: src/gs-remove-app-dialog.ui:37 +msgid "_Delete" +msgstr "刪除(_D)" + +#: src/gs-remove-app-dialog.ui:38 +msgid "Permanently deletes data to save disk space" +msgstr "永久刪除資料以節省磁碟空間" + +#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" +#: src/gs-repos-dialog.c:243 +#, c-format +msgid "" +"Software that has been installed from “%s” will cease to receive updates." +msgstr "自「%s」安裝的軟體將無法繼續接收更新。" + +#. ask for confirmation +#: src/gs-repos-dialog.c:247 +msgid "Disable Repository?" +msgstr "要停用軟體庫嗎?" + +#: src/gs-repos-dialog.c:247 +msgid "Remove Repository?" +msgstr "要移除軟體庫嗎?" + +#. TRANSLATORS: this is button text to disable a repo +#: src/gs-repos-dialog.c:254 +msgid "_Disable" +msgstr "停用(_D)" + +#. TRANSLATORS: this is button text to remove a repo +#. TRANSLATORS: button text when +#. * removing a review +#: src/gs-repos-dialog.c:258 src/gs-review-row.c:262 +msgid "_Remove" +msgstr "移除(_R)" + +#: src/gs-repos-dialog.c:605 +msgid "Enable New Repositories" +msgstr "啟用新軟體庫" + +#: src/gs-repos-dialog.c:606 +msgid "Turn on new repositories when they are added" +msgstr "新增軟體庫時隨即啟用" + +#. TRANSLATORS: this is the clickable +#. * link on the third party repositories info bar +#: src/gs-repos-dialog.c:613 +msgid "more information" +msgstr "更多資訊" + +#. TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced +#. with a link consisting a text "more information", which constructs a sentence: +#. "Additional repositories from selected third parties - more information." +#: src/gs-repos-dialog.c:618 +#, c-format +msgid "Additional repositories from selected third parties — %s." +msgstr "從已選擇的第三方來源取用額外軟體庫—%s。" + +#: src/gs-repos-dialog.c:623 +msgid "Fedora Third Party Repositories" +msgstr "Fedora 第三方軟體庫" + +#. TRANSLATORS: this is the fallback text we use if we can't +#. figure out the name of the operating system +#: src/gs-repos-dialog.c:777 +msgid "the operating system" +msgstr "作業系統" + +#. TRANSLATORS: This is the description text displayed in the Software Repositories dialog. +#. %s gets replaced by the name of the actual distro, e.g. Fedora. +#: src/gs-repos-dialog.c:833 +#, c-format +msgid "These repositories supplement the default software provided by %s." +msgstr "這些軟體庫可以補充 %s 所預裝軟體。" + +#: src/gs-repos-dialog.ui:6 +msgid "Software Repositories" +msgstr "軟體庫" + +#: src/gs-repos-dialog.ui:39 +msgid "No Repositories" +msgstr "沒有軟體庫" + +#. TRANSLATORS: This string states how many apps have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of apps. +#: src/gs-repo-row.c:182 +#, c-format +msgid "%u app installed" +msgid_plural "%u apps installed" +msgstr[0] "已安裝 %u 個程式" + +#. TRANSLATORS: This string states how many add-ons have been +#. * installed from a particular repo, and is displayed on a row +#. * describing that repo. The placeholder is the number of add-ons. +#: src/gs-repo-row.c:190 +#, c-format +msgid "%u add-on installed" +msgid_plural "%u add-ons installed" +msgstr[0] "已安裝 %u 個附加元件" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of apps, and the translated +#. * string will be substituted in for the first placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:201 +#, c-format +msgid "%u app" +msgid_plural "%u apps" +msgstr[0] "%u 個程式" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The placeholder is the number of add-ons, and the translated +#. * string will be substituted in for the second placeholder in the +#. * string “%s and %s installed”. +#: src/gs-repo-row.c:210 +#, c-format +msgid "%u add-on" +msgid_plural "%u add-ons" +msgstr[0] "%u 個附加元件" + +#. TRANSLATORS: This string is used to construct the 'X apps +#. and Y add-ons installed' sentence, stating how many things have been +#. * installed from a particular repo. It’s displayed on a row describing +#. * that repo. The first placeholder is the translated string “%u app” or +#. * “%u apps”. The second placeholder is the translated string “%u add-on” +#. * or “%u add-ons”. +#. * +#. * The choice of plural form for this string is determined by the total +#. * number of apps plus add-ons. For example, +#. * - “1 app and 2 add-ons installed” - uses count 3 +#. * - “2 apps and 1 add-on installed” - uses count 3 +#. * - “4 apps and 5 add-ons installed” - uses count 9 +#. +#: src/gs-repo-row.c:226 +#, c-format +msgid "%s and %s installed" +msgid_plural "%s and %s installed" +msgstr[0] "已安裝%s與%s" + +#: src/gs-repo-row.c:242 +msgid "Checking installed software…" +msgstr "正在檢查安裝的軟體…" + +#. Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', +#. the second '%s' is replaced with a text like '10 apps installed'. +#: src/gs-repo-row.c:250 +#, c-format +msgctxt "repo-row" +msgid "%s • %s" +msgstr "%s • %s" + +#: src/gs-repo-row.c:400 +msgid "Remove" +msgstr "移除" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really bad app +#: src/gs-review-dialog.c:92 +msgid "Hate it" +msgstr "厭惡" + +#. TRANSLATORS: lighthearted star rating description; +#. * Not a great app +#: src/gs-review-dialog.c:96 +msgid "Don’t like it" +msgstr "不喜歡" + +#. TRANSLATORS: lighthearted star rating description; +#. * A fairly-good app +#: src/gs-review-dialog.c:100 +msgid "It’s OK" +msgstr "尚可" + +#. TRANSLATORS: lighthearted star rating description; +#. * A good app +#: src/gs-review-dialog.c:104 +msgid "Like it" +msgstr "喜歡" + +#. TRANSLATORS: lighthearted star rating description; +#. * A really awesome app +#: src/gs-review-dialog.c:108 +msgid "Love it" +msgstr "超讚" + +#. TRANSLATORS: lighthearted star rating description; +#. * No star has been clicked yet +#: src/gs-review-dialog.c:112 +msgid "Select a Star to Leave a Rating" +msgstr "選擇星星以留下評分" + +#. TRANSLATORS: the review can't just be copied and pasted +#: src/gs-review-dialog.c:130 +msgid "Please take more time writing the review" +msgstr "麻煩您花點時間寫下評論" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:133 +msgid "Please choose a star rating" +msgstr "請選擇星級評等" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:136 +msgid "The summary is too short" +msgstr "摘要太短" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:139 +msgid "The summary is too long" +msgstr "摘要太長" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:142 +msgid "The description is too short" +msgstr "描述太短" + +#. TRANSLATORS: the review is not acceptable +#: src/gs-review-dialog.c:145 +msgid "The description is too long" +msgstr "描述太長" + +#. Translators: Title of the dialog box where the users can write and publish their opinions about the apps. +#: src/gs-review-dialog.ui:6 +msgid "Write a Review" +msgstr "撰寫評論" + +#. Translators: A button to publish the user's opinion about the app. +#: src/gs-review-dialog.ui:32 +msgid "_Send" +msgstr "送出(_S)" + +#: src/gs-review-dialog.ui:42 +msgid "" +"Please provide a rating, summary and review text. Reviews should not be used " +"to report problems: instead, contact the developer or your support provider." +msgstr "" +"請提供星評、摘要、評論內容。評論不應該用來回報問題;如要回報問題,請聯絡開發" +"者或您的支援提供者。" + +#: src/gs-review-dialog.ui:76 +msgid "Review Summary" +msgstr "評論摘要" + +#. Translators: This is where the users enter their opinions about the apps. +#: src/gs-review-dialog.ui:110 +msgctxt "app review" +msgid "Write a short review" +msgstr "撰寫簡短評論" + +#: src/gs-review-dialog.ui:152 +msgid "" +"Find what data is sent in our privacy policy. The full name attached to your account will be " +"shown publicly." +msgstr "" +"參閱我們的隱私權政策以瞭解哪些" +"資料會被傳送。同時,您的帳號全名也會被公開顯示。" + +#: src/gs-review-histogram.c:72 +#, c-format +msgid "%u review total" +msgid_plural "%u reviews total" +msgstr[0] "共有 %u 則評論" + +#: src/gs-review-histogram.ui:88 +msgid "out of 5 stars" +msgstr "滿分為 5 顆星" + +#. TRANSLATORS: this is when a user doesn't specify a name +#: src/gs-review-row.c:56 +msgctxt "Reviewer name" +msgid "Unknown" +msgstr "未知" + +#. TRANSLATORS: we explain what the action is going to do +#: src/gs-review-row.c:223 +msgid "You can report reviews for abusive, rude, or discriminatory behavior." +msgstr "您可以檢舉侮辱、粗俗、歧視等評論。" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:228 +msgid "" +"Once reported, a review will be hidden until it has been checked by an " +"administrator." +msgstr "檢舉後評論會被隱藏,等待管理員進行審核。" + +#. TRANSLATORS: window title when reporting a user-submitted review +#. * for moderation +#: src/gs-review-row.c:233 +msgid "Report Review?" +msgstr "要檢舉評論嗎?" + +#. TRANSLATORS: button text when +#. * * sending a review for moderation +#: src/gs-review-row.c:238 +msgid "_Report" +msgstr "檢舉(_R)" + +#. TRANSLATORS: window title when the user attempts to remove their +#. * review +#: src/gs-review-row.c:254 +msgid "Remove Review?" +msgstr "移除評論?" + +#. TRANSLATORS: we ask the user if they really want to do this +#: src/gs-review-row.c:257 +msgid "Removing a review cannot be undone." +msgstr "移除評論的動作無法取消。" + +#: src/gs-review-row.ui:89 +msgid "Like Review" +msgstr "喜歡評論" + +#: src/gs-review-row.ui:101 +msgid "Dislike Review" +msgstr "不喜歡評論" + +#: src/gs-review-row.ui:117 +msgid "Report…" +msgstr "檢舉…" + +#: src/gs-review-row.ui:130 +msgid "Remove…" +msgstr "移除…" + +#: src/gs-safety-context-dialog.c:154 +msgid "" +"App isn’t sandboxed but the distribution has checked that it is not malicious" +msgstr "雖然程式並未完全運作於沙盒中,但您的散布版已查核並非惡意程式" + +#: src/gs-safety-context-dialog.c:162 +msgid "Check that you trust the vendor, as the app isn’t sandboxed" +msgstr "由於程式並未完全運作於沙盒中,請確保這是您信任的提供者" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:177 +msgid "No Permissions" +msgstr "沒有取用權" + +#: src/gs-safety-context-dialog.c:178 +msgid "App is fully sandboxed" +msgstr "應用程式完全運作於沙盒" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:189 +msgid "Network Access" +msgstr "網路取用權" + +#: src/gs-safety-context-dialog.c:190 +msgid "Can access the internet" +msgstr "可以取用網際網路" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:193 +msgid "No Network Access" +msgstr "沒有網路取用權" + +#: src/gs-safety-context-dialog.c:194 +msgid "Cannot access the internet" +msgstr "無法取用網際網路" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:200 +msgid "Uses System Services" +msgstr "使用系統服務" + +#: src/gs-safety-context-dialog.c:201 +msgid "Can request data from system services" +msgstr "可以請求系統服務的資料" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:208 +msgid "Uses Session Services" +msgstr "使用作業階段服務" + +#: src/gs-safety-context-dialog.c:209 +msgid "Can request data from session services" +msgstr "可以請求作業階段服務的資料" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:216 +msgid "User Device Access" +msgstr "使用者裝置取用權" + +#: src/gs-safety-context-dialog.c:217 +msgid "Can access devices such as webcams or gaming controllers" +msgstr "可以取用如網路攝像機、遊戲控制器之類的裝置" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:220 +msgid "No User Device Access" +msgstr "沒有使用者裝置取用權" + +#: src/gs-safety-context-dialog.c:221 +msgid "Cannot access devices such as webcams or gaming controllers" +msgstr "無法取用如網路攝像機、遊戲控制器之類的裝置" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:227 +msgid "Input Device Access" +msgstr "輸入裝置取用權" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:235 +msgid "Microphone Access and Audio Playback" +msgstr "麥克風取用權與音訊回放" + +#: src/gs-safety-context-dialog.c:236 +msgid "Can listen using microphones and play audio without asking permission" +msgstr "可以在不請求許可之下就使用麥克風與播放音訊" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:243 +msgid "System Device Access" +msgstr "系統裝置取用權" + +#: src/gs-safety-context-dialog.c:244 +msgid "Can access system devices which require elevated permissions" +msgstr "可以透過提升的權限取用系統裝置檔案" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:251 +msgid "Screen Contents Access" +msgstr "螢幕內容取用權" + +#: src/gs-safety-context-dialog.c:252 +msgid "Can access the contents of the screen or other windows" +msgstr "可以取用螢幕或其他視窗的內容" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:259 +msgid "Legacy Windowing System" +msgstr "舊世代視窗顯示系統" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:267 +msgid "Arbitrary Permissions" +msgstr "任意取用權" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:275 +msgid "User Settings" +msgstr "使用者設定值" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:287 +msgid "Full File System Read/Write Access" +msgstr "完整的檔案系統/讀取寫入權" + +#: src/gs-safety-context-dialog.c:288 +msgid "Can read and write all data on the file system" +msgstr "可以讀取與寫入檔案系統中的所有資料" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:296 +msgid "Home Folder Read/Write Access" +msgstr "家目錄的讀取/寫入權" + +#: src/gs-safety-context-dialog.c:297 +msgid "Can read and write all data in your home directory" +msgstr "可以讀取與寫入家目錄中的所有資料" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:305 +msgid "Full File System Read Access" +msgstr "完整的檔案系統讀取權" + +#: src/gs-safety-context-dialog.c:306 +msgid "Can read all data on the file system" +msgstr "可以讀取檔案系統中的所有資料" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:315 +msgid "Home Folder Read Access" +msgstr "家目錄的讀取權" + +#: src/gs-safety-context-dialog.c:316 +msgid "Can read all data in your home directory" +msgstr "可以讀取家目錄中的所有資料" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:325 +msgid "Download Folder Read/Write Access" +msgstr "下載資料夾的讀取/寫入權" + +#: src/gs-safety-context-dialog.c:326 +msgid "Can read and write all data in your downloads directory" +msgstr "可以讀取與寫入下載目錄中的所有資料" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:337 +msgid "Download Folder Read Access" +msgstr "下載資料夾的讀取權" + +#: src/gs-safety-context-dialog.c:338 +msgid "Can read all data in your downloads directory" +msgstr "可以讀取下載目錄中的所有資料" + +#: src/gs-safety-context-dialog.c:348 +msgid "Can read and write all data in the directory" +msgstr "可以讀取與寫入該目錄中的所有資料" + +#: src/gs-safety-context-dialog.c:359 +msgid "Can read all data in the directory" +msgstr "可以讀取該目錄中的所有資料" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:375 +msgid "No File System Access" +msgstr "沒有檔案系統取用權" + +#: src/gs-safety-context-dialog.c:376 +msgid "Cannot access the file system at all" +msgstr "無法取用檔案系統" + +#. Translators: This indicates an app was written and released by a developer who has been verified. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:386 +msgid "App developer is verified" +msgstr "程式開發者已通過核驗" + +#: src/gs-safety-context-dialog.c:387 +msgid "The developer of this app has been verified to be who they say they are" +msgstr "應用程式的開發者通過核驗為其所言之人" + +#. Translators: This indicates an app uses an outdated SDK. +#. * It’s used in a context tile, so should be short. +#: src/gs-safety-context-dialog.c:398 +msgid "Insecure Dependencies" +msgstr "不安全的依賴關係" + +#: src/gs-safety-context-dialog.c:399 +msgid "" +"Software or its dependencies are no longer supported and may be insecure" +msgstr "軟體本身或其依賴關係已不再被支援,可能造成安全性問題" + +#: src/gs-safety-context-dialog.c:412 +msgid "" +"This app does not specify what license it is developed under, and may be " +"proprietary" +msgstr "該程式未指定其開發所採用的授權條款,可能是專有程式" + +#: src/gs-safety-context-dialog.c:413 +msgid "" +"This software does not specify what license it is developed under, and may " +"be proprietary" +msgstr "該軟體未指定其開發所採用的授權條款,可能是專有軟體" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:426 +msgid "Proprietary Code" +msgstr "專有授權程式碼" + +#: src/gs-safety-context-dialog.c:427 +msgid "" +"The source code is not public, so it cannot be independently audited and " +"might be unsafe" +msgstr "源始碼未開放,無法獨立稽核及確保安全性" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:435 +#, c-format +msgid "This app is developed under the special license “%s”" +msgstr "該程式採用特殊授權條款「%s」開發" + +#. Translators: The placeholder here is the name of a software license. +#: src/gs-safety-context-dialog.c:438 +#, c-format +msgid "This software is developed under the special license “%s”" +msgstr "該軟體採用特殊授權條款「%s」開發" + +#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. +#: src/gs-safety-context-dialog.c:451 +msgid "Auditable Code" +msgstr "可稽核程式碼" + +#: src/gs-safety-context-dialog.c:452 +msgid "" +"The source code is public and can be independently audited, which makes the " +"app more likely to be safe" +msgstr "可以獨立稽核的開放源始碼,使應用程式的安全性較有保障" + +#. Translators: The app is considered privileged, aka provided by the distribution. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:461 +#, c-format +msgid "%s is privileged" +msgstr "《%s》享有特權" + +#. Translators: The app is considered safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:468 +#, c-format +msgid "%s is safe" +msgstr "《%s》安全" + +#. Translators: The app is considered probably safe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:475 +#, c-format +msgid "%s is probably safe" +msgstr "《%s》可能安全" + +#. Translators: The app is considered potentially unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:482 +#, c-format +msgid "%s is potentially unsafe" +msgstr "《%s》可能不安全" + +#. Translators: The app is considered unsafe to install and run. +#. * The placeholder is the app name. +#: src/gs-safety-context-dialog.c:489 +#, c-format +msgid "%s is unsafe" +msgstr "《%s》不安全" + +#. Translators: This is used for "License Unknown" +#: src/gs-safety-context-dialog.c:572 +msgctxt "Unknown license" +msgid "Unknown" +msgstr "未知" + +#. Translators: This is the title of the dialog which contains information about the permissions of an app +#: src/gs-safety-context-dialog.ui:6 +msgid "Safety" +msgstr "安全" + +#: src/gs-safety-context-dialog.ui:70 +msgid "License" +msgstr "授權" + +#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’). +#: src/gs-safety-context-dialog.ui:81 +msgid "Source" +msgstr "來源" + +#: src/gs-safety-context-dialog.ui:103 +msgid "SDK" +msgstr "SDK" + +#: src/gs-safety-context-dialog.ui:152 +msgid "" +"This app uses an outdated version of the software platform (SDK) and might " +"contain bugs or security vulnerabilities which will not be fixed." +msgstr "" +"該程式採用過期的軟體平臺 (SDK) 版本,且可能有無法修正的臭蟲或安全性弱點。" + +#. Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:46 +msgid "Previous Screenshot" +msgstr "上一張螢幕快照" + +#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. +#: src/gs-screenshot-carousel.ui:74 +msgid "Next Screenshot" +msgstr "下一張螢幕快照" + +#. Translators: Shortened form of “no screenshots available” when showing an app’s details. +#: src/gs-screenshot-carousel.ui:130 +msgid "No Screenshots" +msgstr "沒有螢幕快照" + +#. TRANSLATORS: this is when we try to download a screenshot and +#. * we get back 404 +#: src/gs-screenshot-image.c:363 src/gs-screenshot-image.c:404 +#: src/gs-screenshot-image.c:608 +msgid "Screenshot not found" +msgstr "找不到螢幕快照" + +#. TRANSLATORS: possibly image file corrupt or not an image +#: src/gs-screenshot-image.c:414 +msgid "Failed to load image" +msgstr "無法載入影像" + +#. TRANSLATORS: this is when we request a screenshot size that +#. * the generator did not create or the parser did not add +#: src/gs-screenshot-image.c:636 +msgid "Screenshot size not found" +msgstr "找不到螢幕快照的大小" + +#. TRANSLATORS: this is when we try create the cache directory +#. * but we were out of space or permission was denied +#: src/gs-screenshot-image.c:725 +msgid "Could not create cache" +msgstr "無法建立快取" + +#. TRANSLATORS: this is when we try to download a screenshot +#. * that was not a valid URL +#: src/gs-screenshot-image.c:739 +msgid "Screenshot not valid" +msgstr "螢幕快照無效" + +#. TRANSLATORS: this is when networking is not available +#: src/gs-screenshot-image.c:777 +msgid "Screenshot not available" +msgstr "螢幕快照無法使用" + +#: src/gs-screenshot-image.ui:6 +msgid "Screenshot" +msgstr "螢幕快照" + +#. TRANSLATORS: this is when there are too many search results +#. * to show in in the search page +#: src/gs-search-page.c:176 +#, c-format +msgid "%u more match" +msgid_plural "%u more matches" +msgstr[0] "其他 %u 項符合" + +#: src/gs-search-page.ui:7 +msgid "Search page" +msgstr "搜尋頁面" + +#: src/gs-search-page.ui:18 +msgid "Search for Apps" +msgstr "搜尋應用程式" + +#: src/gs-search-page.ui:39 +msgid "No App Found" +msgstr "找不到程式" + +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the truncated hostname, e.g. +#. * 'alt.fedoraproject.org' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is the origin id, e.g. 'fedora' +#. TRANSLATORS: this is part of the in-app notification, +#. * where the %s is a multi-word localised app name +#. * e.g. 'Getting things GNOME!" +#: src/gs-shell.c:1131 src/gs-shell.c:1136 src/gs-shell.c:1151 +#: src/gs-shell.c:1155 +#, c-format +msgid "“%s”" +msgstr "《%s》" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1209 src/gs-shell.c:1261 +msgid "Unable to download updates" +msgstr "無法下載更新" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1214 +msgid "Unable to download firmware updates" +msgstr "無法下載韌體更新" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1217 +#, c-format +msgid "Unable to download firmware updates from %s" +msgstr "無法從 %s 下載韌體更新" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1222 +#, c-format +msgid "Unable to download updates from %s" +msgstr "無法自 %s 下載更新" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1229 src/gs-shell.c:1447 +msgid "Unable to update: internet access required" +msgstr "無法更新:需要取用網際網路" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1232 src/gs-shell.c:1450 +msgid "Unable to update: not enough disk space" +msgstr "無法更新:磁碟空間不足" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the source (e.g. "alt.fedoraproject.org") +#: src/gs-shell.c:1237 +#, c-format +msgid "Unable to download updates from %s: not enough disk space" +msgstr "無法自 %s 下載更新:磁碟空間不足" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1243 src/gs-shell.c:1461 +msgid "Unable to update: authentication required" +msgstr "無法更新:需要核對身分" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1247 src/gs-shell.c:1472 +msgid "Unable to update: invalid authentication" +msgstr "無法更新:身分核對無效" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1251 src/gs-shell.c:1483 +msgid "Unable to update: permission required" +msgstr "無法更新:需要取用權" + +#: src/gs-shell.c:1252 +msgid "" +"Unable to download updates: you do not have permission to install software" +msgstr "無法下載更新:您沒有安裝軟體的許可權" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1264 +msgid "Unable to get list of updates" +msgstr "無法取得更新列表" + +#: src/gs-shell.c:1299 +msgid "Unable to install: download failed" +msgstr "無法安裝:下載失敗" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1305 +#, c-format +msgid "Unable to install %s: failed download from %s" +msgstr "無法安裝 %s:無法從 %s 下載" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1310 +#, c-format +msgid "Unable to install %s: download failed" +msgstr "無法安裝 %s:下載失敗" + +#: src/gs-shell.c:1316 +msgid "Unable to install: missing runtime" +msgstr "無法安裝:缺少執行時期環境" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1322 +#, c-format +msgid "Unable to install %s: runtime %s unavailable" +msgstr "無法安裝 %s:執行時期環境 %s 無法使用" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1325 src/gs-shell.c:1381 src/gs-shell.c:1383 +#, c-format +msgid "Unable to install %s" +msgstr "無法安裝 %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1331 +msgid "Unable to install: internet access required" +msgstr "無法安裝:需要取用網際網路" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1334 +msgid "Unable to install: invalid app format" +msgstr "無法安裝:程式格式無效" + +#: src/gs-shell.c:1337 +msgid "Unable to install: not enough disk space" +msgstr "無法安裝:磁碟空間不足" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1340 +#, c-format +msgid "Unable to install %s: not enough disk space" +msgstr "無法安裝 %s:磁碟空間不足" + +#: src/gs-shell.c:1344 +msgid "Unable to install: authentication required" +msgstr "無法安裝:需要核對身分" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1346 +#, c-format +msgid "Unable to install %s: authentication required" +msgstr "無法安裝 %s:需要核對身分" + +#: src/gs-shell.c:1350 +msgid "Unable to install: invalid authentication" +msgstr "無法安裝:無法核對身分" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1353 +#, c-format +msgid "Unable to install %s: invalid authentication" +msgstr "無法安裝 %s:身分核對無效" + +#: src/gs-shell.c:1357 +msgid "Unable to install: permission required" +msgstr "無法安裝:需要取用權" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1360 +#, c-format +msgid "Unable to install %s: permission required" +msgstr "無法安裝 %s:需要取用權" + +#: src/gs-shell.c:1364 +msgid "Unable to install: device must be plugged in" +msgstr "無法安裝:裝置必須接上電源" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1367 +#, c-format +msgid "Unable to install %s: device must be plugged in" +msgstr "無法安裝 %s:裝置必須接上電源" + +#: src/gs-shell.c:1370 +msgid "Unable to install: low battery" +msgstr "無法安裝:低電量" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1373 +#, c-format +msgid "Unable to install %s: low battery" +msgstr "無法安裝 %s:低電量" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") and +#. * the second %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1426 +#, c-format +msgid "Unable to update %s from %s: download failed" +msgstr "無法從 %2$s 更新 %1$s:下載失敗" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1432 +#, c-format +msgid "Unable to update %s: download failed" +msgstr "無法更新 %s:下載失敗" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1439 +#, c-format +msgid "Unable to install updates from %s: download failed" +msgstr "無法從 %s 安裝更新:下載失敗" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1443 +msgid "Unable to update: download failed" +msgstr "無法更新:下載失敗" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1455 +#, c-format +msgid "Unable to update %s: not enough disk space" +msgstr "無法更新 %s:磁碟空間不足" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1466 +#, c-format +msgid "Unable to update %s: authentication required" +msgstr "無法更新 %s:需要核對身分" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1477 +#, c-format +msgid "Unable to update %s: invalid authentication" +msgstr "無法更新 %s:身分核對無效" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1488 +#, c-format +msgid "Unable to update %s: permission required" +msgstr "無法更新 %s:需要取用權" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1494 +msgid "Unable to update: device must be plugged in" +msgstr "無法更新:裝置必須接上電源" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1499 +#, c-format +msgid "Unable to update %s: device must be plugged in" +msgstr "無法更新 %s:裝置必須接上電源" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1504 +msgid "Unable to update: low battery" +msgstr "無法更新:過量過低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "Dell XPS 13") +#: src/gs-shell.c:1509 +#, c-format +msgid "Unable to update %s: low battery" +msgstr "無法更新 %s:過量過低" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1520 +#, c-format +msgid "Unable to update %s" +msgstr "無法更新 %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1524 +msgid "Unable to update" +msgstr "無法更新" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1561 src/gs-shell.c:1634 +msgid "Unable to upgrade" +msgstr "無法升級" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the distro name (e.g. "Fedora 25") and +#. * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1565 +#, c-format +msgid "Unable to upgrade to %s from %s" +msgstr "無法自 %2$s 升級至 %1$s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1569 +msgid "Unable to upgrade: download failed" +msgstr "無法升級:下載失敗" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1572 +#, c-format +msgid "Unable to upgrade to %s: download failed" +msgstr "無法升級至 %s:下載失敗" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1578 +msgid "Unable to upgrade: internet access required" +msgstr "無法升級:需要取用網際網路" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1581 +#, c-format +msgid "Unable to upgrade to %s: internet access required" +msgstr "無法升級至 %s:需要取用網際網路" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1585 +msgid "Unable to upgrade: not enough disk space" +msgstr "無法升級:磁碟空間不足" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1588 +#, c-format +msgid "Unable to upgrade to %s: not enough disk space" +msgstr "無法升級至 %s:磁碟空間不足" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1593 +msgid "Unable to upgrade: authentication required" +msgstr "無法升級:需要核對身分" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1596 +#, c-format +msgid "Unable to upgrade to %s: authentication required" +msgstr "無法升級至 %s:需要核對身分" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1601 +msgid "Unable to upgrade: invalid authentication" +msgstr "無法升級:身分核對無效" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1604 +#, c-format +msgid "Unable to upgrade to %s: invalid authentication" +msgstr "無法升級至 %s:身分核對無效" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1609 +msgid "Unable to upgrade: permission required" +msgstr "無法升級:需要取用權" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1612 +#, c-format +msgid "Unable to upgrade to %s: permission required" +msgstr "無法升級至 %s:需要取用權" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1617 +msgid "Unable to upgrade: device must be plugged in" +msgstr "無法升級:裝置必須接上電源" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1620 +#, c-format +msgid "Unable to upgrade to %s: device must be plugged in" +msgstr "無法升級至 %s:裝置必須接上電源" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1624 +msgid "Unable to upgrade: low battery" +msgstr "無法升級:低電量" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1627 +#, c-format +msgid "Unable to upgrade to %s: low battery" +msgstr "無法升級至 %s:低電量" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the distro name (e.g. "Fedora 25") +#: src/gs-shell.c:1637 +#, c-format +msgid "Unable to upgrade to %s" +msgstr "無法升級至 %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1671 +msgid "Unable to uninstall: authentication required" +msgstr "無法解除安裝:需要核對身分" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1674 +#, c-format +msgid "Unable to uninstall %s: authentication required" +msgstr "無法解除安裝 %s:需要核對身分" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1679 +msgid "Unable to uninstall: invalid authentication" +msgstr "無法解除安裝:身分核對無效" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1682 +#, c-format +msgid "Unable to uninstall %s: invalid authentication" +msgstr "無法解除安裝 %s:身分核對無效" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1687 +msgid "Unable to uninstall: permission required" +msgstr "無法解除安裝:需要取用權" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1690 +#, c-format +msgid "Unable to uninstall %s: permission required" +msgstr "無法解除安裝 %s:需要取用權" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1695 +msgid "Unable to uninstall: device must be plugged in" +msgstr "無法解除安裝:裝置必須接上電源" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1698 +#, c-format +msgid "Unable to uninstall %s: device must be plugged in" +msgstr "無法解除安裝 %s:裝置必須接上電源" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1702 +msgid "Unable to uninstall: low battery" +msgstr "無法解除安裝:低電量" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1705 +#, c-format +msgid "Unable to uninstall %s: low battery" +msgstr "無法解除安裝 %s:低電量" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the %s is the app name (e.g. "GIMP") +#: src/gs-shell.c:1716 +#, c-format +msgid "Unable to uninstall %s" +msgstr "無法解除安裝 %s" + +#. TRANSLATORS: failure text for the in-app notification, where the '%s' is +#. replaced with the app name (e.g. "GIMP") +#: src/gs-shell.c:1755 +#, c-format +msgid "Unable to launch %s" +msgstr "無法啟動 %s" + +#. TRANSLATORS: failure text for the in-app notification +#. TRANSLATORS: we failed to get a proper error code +#: src/gs-shell.c:1760 src/gs-shell.c:1788 src/gs-shell.c:1832 +#: src/gs-shell.c:1876 src/gs-shell.c:1936 +msgid "Sorry, something went wrong" +msgstr "很抱歉,發生問題" + +#. TRANSLATORS: failure text for the in-app notification, +#. * where the first %s is the app name (e.g. "GIMP") +#. * and the second %s is the name of the runtime, e.g. +#. * "GNOME SDK [flatpak.gnome.org]" +#: src/gs-shell.c:1768 +#, c-format +msgid "Unable to launch %s: %s is not installed" +msgstr "無法啟動%s:未安裝 %s" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1778 src/gs-shell.c:1822 src/gs-shell.c:1866 +#: src/gs-shell.c:1916 +msgid "Not enough disk space for operation" +msgstr "磁碟空間不足無法操作" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1814 +msgid "Unable to install: file type not supported" +msgstr "無法安裝:檔案類型未支援" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1818 src/gs-shell.c:1862 +msgid "Unable to install: authentication failed" +msgstr "無法安裝:身分核對失敗" + +#. TRANSLATORS: failure text for the in-app notification +#: src/gs-shell.c:1858 +msgid "Unable to install" +msgstr "無法安裝" + +#. TRANSLATORS: failure text for the in-app notification, +#. * the %s is the origin, e.g. "Fedora" or +#. * "Fedora Project [fedoraproject.org]" +#: src/gs-shell.c:1909 +#, c-format +msgid "Unable to contact %s" +msgstr "無法聯絡 %s" + +#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. +#: src/gs-shell.c:1920 +msgid "Restart Software to use new plugins" +msgstr "《軟體》需重新啟動才能使用新的外掛元件" + +#. TRANSLATORS: need to be connected to the AC power +#: src/gs-shell.c:1924 +msgid "Device needs to be plugged in" +msgstr "裝置需要接上電源" + +#. TRANSLATORS: not enough juice to do this safely +#: src/gs-shell.c:1927 +msgid "Battery level is too low" +msgstr "電池低電量" + +#: src/gs-shell.ui:8 +msgid "_Software Repositories" +msgstr "軟體庫(_S)" + +#: src/gs-shell.ui:15 +msgid "_Preferences" +msgstr "偏好設定(_P)" + +#: src/gs-shell.ui:19 +msgid "_Keyboard Shortcuts" +msgstr "鍵盤快捷鍵(_K)" + +#: src/gs-shell.ui:23 +msgid "_About Software" +msgstr "關於《軟體》(_A)" + +#: src/gs-shell.ui:142 src/gs-shell.ui:144 +msgid "Search" +msgstr "搜尋" + +#: src/gs-shell.ui:158 src/gs-shell.ui:160 +msgid "Main Menu" +msgstr "主選單" + +#: src/gs-shell.ui:187 +msgid "Search apps" +msgstr "搜尋程式" + +#. Translators: A label for a button to show all available software. +#: src/gs-shell.ui:213 +msgid "_Explore" +msgstr "探索(_E)" + +#. Translators: A label for a button to show only software which is already installed. +#: src/gs-shell.ui:227 +msgctxt "List of installed apps" +msgid "_Installed" +msgstr "已安裝(_I)" + +#. Translators: A label for a button to show only updates which are available to install. +#: src/gs-shell.ui:249 +msgctxt "Header bar button for list of apps to be updated" +msgid "_Updates" +msgstr "更新(_U)" + +#: src/gs-shell.ui:287 src/gs-shell.ui:358 +msgid "Go back" +msgstr "返回" + +#. Translators: This is shown in a bubble to represent a 0 byte +#. * storage size, so its context is “storage size: none”. The +#. * bubble is small, so the string should be as short as +#. * possible. +#: src/gs-storage-context-dialog.c:95 +msgid "None" +msgstr "無" + +#: src/gs-storage-context-dialog.c:139 +msgid "App Data" +msgstr "程式資料" + +#: src/gs-storage-context-dialog.c:140 +msgid "Data needed for the app to run" +msgstr "執行程式所需的資料" + +#: src/gs-storage-context-dialog.c:145 +msgid "User Data" +msgstr "使用者資料" + +#: src/gs-storage-context-dialog.c:146 +msgid "Data created by you in the app" +msgstr "您在程式中所建立的資料" + +#: src/gs-storage-context-dialog.c:153 +msgid "Cache Data" +msgstr "快取資料" + +#: src/gs-storage-context-dialog.c:154 +msgid "Temporary cached data" +msgstr "暫存的快取資料" + +#: src/gs-storage-context-dialog.c:172 +msgid "The app itself" +msgstr "程式本身" + +#: src/gs-storage-context-dialog.c:177 +msgid "Required Dependencies" +msgstr "所需的依賴關係" + +#: src/gs-storage-context-dialog.c:178 +msgid "Shared system components required by this app" +msgstr "程式所需的系統共享元件" + +#: src/gs-storage-context-dialog.c:188 +msgctxt "Download size" +msgid "Unknown" +msgstr "未知" + +#. TRANSLATORS: "" and "" should not be touched. +#: src/gs-storage-context-dialog.c:262 +msgid "Cached data can be cleared from the _app settings" +msgstr "快取資料可以從程式設定中清除(_A)" + +#. Translators: This is the title of the dialog which contains information about the storage or download size needed for an app +#: src/gs-storage-context-dialog.ui:6 +msgid "Storage" +msgstr "儲存空間" + +#: src/gs-summary-tile.c:139 +#, c-format +msgid "%s (Installed)" +msgstr "%s(已安裝)" + +#: src/gs-summary-tile.c:144 +#, c-format +msgid "%s (Installing)" +msgstr "%s(正在安裝)" + +#: src/gs-summary-tile.c:149 +#, c-format +msgid "%s (Downloading)" +msgstr "%s(正在下載)" + +#: src/gs-summary-tile.c:154 +#, c-format +msgid "%s (Removing)" +msgstr "%s(正在移除)" + +#: src/gs-toast.c:58 src/gs-toast.c:68 +msgid "_Details" +msgstr "詳細資訊(_D)" + +#: src/gs-toast.c:62 +msgid "_Examine" +msgstr "檢視(_E)" + +#. TRANSLATORS: this is the subtitle of the installed updates dialog window. +#. %s will be replaced by the date when the updates were installed. +#. The date format is defined by the locale's preferred date representation +#. ("%x" in strftime.) +#: src/gs-update-dialog.c:107 +#, c-format +msgid "Installed on %s" +msgstr "安裝於 %s" + +#. TRANSLATORS: this is the title of the installed updates dialog window +#: src/gs-update-dialog.c:129 +msgid "Installed Updates" +msgstr "已安裝的更新" + +#: src/gs-update-dialog.ui:59 +msgid "No Updates Installed" +msgstr "未安裝更新" + +#: src/gs-update-monitor.c:217 +msgid "Updates Are Out of Date" +msgstr "更新資料已過期" + +#: src/gs-update-monitor.c:218 +msgid "Please check for available updates" +msgstr "請檢查軟體更新" + +#: src/gs-update-monitor.c:224 +msgid "Critical Updates Ready to Install" +msgstr "重大更新已準備安裝" + +#: src/gs-update-monitor.c:225 +msgid "Install critical updates as soon as possible" +msgstr "請盡快安裝重大更新" + +#: src/gs-update-monitor.c:228 +msgid "Critical Updates Available to Download" +msgstr "重大更新已可下載" + +#: src/gs-update-monitor.c:229 +msgid "Download critical updates as soon as possible" +msgstr "請盡快下載重大更新" + +#: src/gs-update-monitor.c:235 +msgid "Updates Ready to Install" +msgstr "更新已準備安裝" + +#: src/gs-update-monitor.c:236 +msgid "Software updates are ready and waiting" +msgstr "軟體更新已準備就緒並等待中" + +#: src/gs-update-monitor.c:242 +msgid "Updates Available to Download" +msgstr "更新已可下載" + +#: src/gs-update-monitor.c:243 +msgid "Software updates can be downloaded" +msgstr "軟體更新已可下載" + +#. TRANSLATORS: apps were auto-updated and restart is required +#: src/gs-update-monitor.c:363 +#, c-format +msgid "%u App Updated — Restart Required" +msgid_plural "%u Apps Updated — Restart Required" +msgstr[0] "%u 個程式已更新—需重新啟動" + +#. TRANSLATORS: apps were auto-updated +#: src/gs-update-monitor.c:369 +#, c-format +msgid "%u App Updated" +msgid_plural "%u Apps Updated" +msgstr[0] "%u 個程式已更新" + +#. TRANSLATORS: %1 is an app name, e.g. Firefox +#: src/gs-update-monitor.c:380 +#, c-format +msgid "%s has been updated." +msgstr "《%s》已更新。" + +#. TRANSLATORS: the app needs restarting +#: src/gs-update-monitor.c:383 +msgid "Please restart the app." +msgstr "請重新啟動程式。" + +#. TRANSLATORS: %1 and %2 are both app names, e.g. Firefox +#: src/gs-update-monitor.c:391 +#, c-format +msgid "%s and %s have been updated." +msgstr "《%s》與《%s》已更新。" + +#. TRANSLATORS: at least one app needs restarting +#: src/gs-update-monitor.c:397 src/gs-update-monitor.c:416 +#, c-format +msgid "%u app requires a restart." +msgid_plural "%u apps require a restart." +msgstr[0] "有 %u 個程式需重新啟動。" + +#. TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox +#: src/gs-update-monitor.c:409 +#, c-format +msgid "Includes %s, %s and %s." +msgstr "包括《%s》、《%s》以及《%s》。" + +#. TRANSLATORS: this is when the current operating system version goes end-of-life +#: src/gs-update-monitor.c:711 +msgid "System Has Reached End of Life" +msgstr "系統已達生命週期" + +#. TRANSLATORS: this is the message dialog for the distro EOL notice +#: src/gs-update-monitor.c:713 +msgid "Upgrade to continue receiving updates" +msgstr "請升級以繼續接收更新" + +#. TRANSLATORS: this is a distro upgrade, the replacement would be the +#. * distro name, e.g. 'Fedora' +#: src/gs-update-monitor.c:768 +#, c-format +msgid "A new version of %s is available to install" +msgstr "新版的 %s 已可安裝" + +#. TRANSLATORS: this is a distro upgrade +#: src/gs-update-monitor.c:772 +msgid "Software Upgrade Available" +msgstr "有可用的軟體升級" + +#. TRANSLATORS: title when we offline updates have failed +#: src/gs-update-monitor.c:1270 +msgid "Software Updates Failed" +msgstr "軟體更新失敗" + +#. TRANSLATORS: message when we offline updates have failed +#: src/gs-update-monitor.c:1272 +msgid "Prepared updates were not installed" +msgstr "準備的更新並未安裝" + +#: src/gs-update-monitor.c:1273 +msgid "Show Details" +msgstr "顯示詳細資訊" + +#. TRANSLATORS: Notification title when we've done a distro upgrade +#: src/gs-update-monitor.c:1318 +msgid "System Upgrade Complete" +msgstr "系統升級已完成" + +#. TRANSLATORS: This is the notification body when we've done a +#. * distro upgrade. First %s is the distro name and the 2nd %s +#. * is the version, e.g. "Welcome to Fedora 28!" +#: src/gs-update-monitor.c:1323 +#, c-format +msgid "Welcome to %s %s!" +msgstr "歡迎使用 %s %s!" + +#. TRANSLATORS: title when we've done offline updates +#: src/gs-update-monitor.c:1332 +msgid "Software Update Installed" +msgid_plural "Software Updates Installed" +msgstr[0] "軟體更新已安裝" + +#. TRANSLATORS: message when we've done offline updates +#: src/gs-update-monitor.c:1336 +msgid "An important operating system update has been installed." +msgid_plural "Important operating system updates have been installed." +msgstr[0] "重要的作業系統更新已安裝。" + +#. TRANSLATORS: Button to look at the updates that were installed. +#. * Note that it has nothing to do with the app reviews, the +#. * users can't express their opinions here. In some languages +#. * "Review (evaluate) something" is a different translation than +#. * "Review (browse) something." +#: src/gs-update-monitor.c:1347 +msgctxt "updates" +msgid "Review" +msgstr "檢視" + +#. TRANSLATORS: this is when the offline update failed +#: src/gs-update-monitor.c:1400 +msgid "Failed To Update" +msgstr "無法更新" + +#. TRANSLATORS: the user must have updated manually after +#. * the updates were prepared +#: src/gs-update-monitor.c:1405 +msgid "The system was already up to date." +msgstr "系統已是最新狀態。" + +#. TRANSLATORS: the user aborted the update manually +#: src/gs-update-monitor.c:1410 +msgid "The update was cancelled." +msgstr "更新已取消。" + +#. TRANSLATORS: the package manager needed to download +#. * something with no network available +#: src/gs-update-monitor.c:1415 +msgid "" +"Internet access was required but wasn’t available. Please make sure that you " +"have internet access and try again." +msgstr "需要網際網路連接卻無法使用。請確保網際網路連接正常後重試。" + +#. TRANSLATORS: if the package is not signed correctly +#: src/gs-update-monitor.c:1420 +msgid "" +"There were security issues with the update. Please consult your software " +"provider for more details." +msgstr "本次更新存在安全性問題;請向您的軟體提供者詢問以深入瞭解資訊。" + +#. TRANSLATORS: we ran out of disk space +#: src/gs-update-monitor.c:1425 +msgid "" +"There wasn’t enough disk space. Please free up some space and try again." +msgstr "磁碟空間不足。請釋出部分空間後重試。" + +#. TRANSLATORS: We didn't handle the error type +#: src/gs-update-monitor.c:1429 +msgid "" +"We’re sorry: the update failed to install. Please wait for another update " +"and try again. If the problem persists, contact your software provider." +msgstr "" +"很抱歉:更新無法安裝;請等待下次更新時重試。倘若問題持續出現,請向您的軟體提" +"供者詢問。" + +#. TRANSLATORS: This is the time when we last checked for updates +#: src/gs-updates-page.c:261 +#, c-format +msgid "Last checked: %s" +msgstr "上次檢查時間:%s" + +#: src/gs-updates-page.c:314 +msgid "Stop" +msgstr "停止" + +#: src/gs-updates-page.c:323 src/gs-updates-page.c:335 +msgid "Check for Updates" +msgstr "檢查軟體更新" + +#. TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' +#. * and the second %s is the distro version, e.g. '25' +#: src/gs-updates-page.c:586 +#, c-format +msgid "%s %s has stopped receiving critical software updates" +msgstr "%s %s 已停止接收關鍵軟體更新" + +#. TRANSLATORS: This message is meant to tell users that they need to upgrade +#. * or else their distro will not get important updates. +#: src/gs-updates-page.c:592 +msgid "Your operating system has stopped receiving critical software updates" +msgstr "您的作業系統已停止接收關鍵軟體更新" + +#. TRANSLATORS: this is to explain that downloading updates may cost money +#: src/gs-updates-page.c:848 +msgid "Charges May Apply" +msgstr "可能需要費用" + +#. TRANSLATORS: we need network to do the updates check +#: src/gs-updates-page.c:850 +msgid "" +"Checking for updates while using mobile broadband could cause you to incur " +"charges." +msgstr "使用行動寬頻檢查更新可能會產生額外的資料傳輸費用。" + +#. TRANSLATORS: this is a link to the control-center network panel +#: src/gs-updates-page.c:854 +msgid "Check _Anyway" +msgstr "無論如何都檢查(_A)" + +#: src/gs-updates-page.c:892 +msgid "Software Upgrades Downloaded" +msgstr "已下載軟體升級" + +#: src/gs-updates-page.c:893 +msgid "Upgrades are ready to be installed" +msgstr "升級已準備好安裝" + +#: src/gs-updates-page.c:1228 +msgid "Check for updates" +msgstr "檢查軟體更新" + +#: src/gs-updates-page.c:1264 +msgctxt "Apps to be updated" +msgid "Updates" +msgstr "更新" + +#: src/gs-updates-page.ui:7 +msgid "Updates page" +msgstr "更新頁面" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:28 +msgid "Loading Updates" +msgstr "正載入更新" + +#. TRANSLATORS: the updates panel is starting up. +#: src/gs-updates-page.ui:29 +msgid "This could take a while" +msgstr "這可能會花上一段時間" + +#. TRANSLATORS: This means all software (plural) installed on this system is up to date. +#: src/gs-updates-page.ui:141 +msgid "Up to Date" +msgstr "已是最新狀態" + +#: src/gs-updates-page.ui:179 +msgid "Use Mobile Data?" +msgstr "使用行動數據連線?" + +#: src/gs-updates-page.ui:180 +msgid "" +"Checking for updates when using mobile broadband could cause you to incur " +"charges" +msgstr "使用行動寬頻檢查更新,可能會產生額外的資料傳輸費用" + +#: src/gs-updates-page.ui:183 +msgid "_Check Anyway" +msgstr "無論如何都檢查(_C)" + +#: src/gs-updates-page.ui:202 +msgid "No Connection" +msgstr "沒有連線" + +#: src/gs-updates-page.ui:203 +msgid "Go online to check for updates" +msgstr "請連上網路以檢查更新" + +#: src/gs-updates-page.ui:206 +msgid "_Network Settings" +msgstr "網路設定(_N)" + +#: src/gs-updates-page.ui:226 src/gs-updates-page.ui:240 +msgid "Error" +msgstr "錯誤" + +#: src/gs-updates-page.ui:241 +msgid "Updates are automatically managed" +msgstr "更新為自動化管理" + +#: src/gs-updates-paused-banner.c:44 +msgid "Software Updates Paused" +msgstr "軟體更新已暫停" + +#: src/gs-updates-paused-banner.c:47 +msgid "" +"Automatic software updates have been paused for the following reasons:\n" +msgstr "依下列因素,軟體自動更新已暫停:\n" + +#: src/gs-updates-paused-banner.c:49 +msgid "" +"\n" +"• The current network connection is metered" +msgstr "" +"\n" +"• 目前的網路連線為計量付費網路" + +#: src/gs-updates-paused-banner.c:51 +msgid "" +"\n" +"• The current network connection prohibits large downloads" +msgstr "" +"\n" +"• 目前的網路連線禁止大量下載" + +#: src/gs-updates-paused-banner.c:53 +msgid "" +"\n" +"• Power saver mode is active" +msgstr "" +"\n" +"• 省電模式使用中" + +#: src/gs-updates-paused-banner.c:55 +msgid "" +"\n" +"• Game mode is active" +msgstr "" +"\n" +"• 遊戲模式使用中" + +#: src/gs-updates-paused-banner.c:79 +msgid "Software updates paused" +msgstr "軟體更新已暫停" + +#: src/gs-updates-paused-banner.c:84 +msgid "Network connection is metered — software updates paused" +msgstr "網路連線為計量型網路 — 軟體更新已暫停" + +#: src/gs-updates-paused-banner.c:86 +msgid "Network connection prohibits large downloads — software updates paused" +msgstr "網路連線禁止大量下載 — 軟體更新已暫停" + +#: src/gs-updates-paused-banner.c:88 +msgid "Power saver mode is active — software updates paused" +msgstr "省電模式使用中 — 軟體更新已暫停" + +#: src/gs-updates-paused-banner.c:90 +msgid "Game mode is active — software updates paused" +msgstr "遊戲模式使用中 — 軟體更新已暫停" + +#. TRANSLATORS: This is the button for installing all +#. * offline updates +#: src/gs-updates-section.c:320 +msgid "_Restart & Update…" +msgstr "重新啟動並更新(_R)…" + +#. TRANSLATORS: This is the button for upgrading all +#. * online-updatable apps +#: src/gs-updates-section.c:326 +msgid "U_pdate All" +msgstr "全部更新(_P)" + +#: src/gs-updates-section.c:403 +msgid "Software Updates Downloaded" +msgstr "已下載軟體更新" + +#: src/gs-updates-section.c:404 +msgid "Updates are ready to be installed" +msgstr "已準備好安裝更新" + +#. TRANSLATORS: This is the header for system firmware that +#. * requires a reboot to apply +#: src/gs-updates-section.c:495 +msgid "Integrated Firmware" +msgstr "整合的韌體" + +#. TRANSLATORS: This is the header for offline OS and offline +#. * app updates that require a reboot to apply +#: src/gs-updates-section.c:500 +msgid "Requires Restart" +msgstr "需要重新啟動" + +#. TRANSLATORS: This is the header for online runtime and +#. * app updates, typically flatpaks or snaps +#: src/gs-updates-section.c:505 +msgid "App Updates" +msgstr "程式更新" + +#. TRANSLATORS: This is the header for device firmware that can +#. * be installed online +#: src/gs-updates-section.c:510 +msgid "Device Firmware" +msgstr "裝置韌體" + +#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:73 +#: plugins/packagekit/gs-packagekit-task.c:154 +msgid "_Download" +msgstr "下載(_D)" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The first %s is the distro name +#. * and the 2nd %s is the version, e.g. "Fedora 35 Available" +#: src/gs-upgrade-banner.c:91 +#, c-format +msgid "%s %s Available" +msgstr "%s %s 已推出" + +#. TRANSLATORS: This is the text displayed when a distro +#. * upgrade is available. The %s is the distro name, +#. * e.g. "GNOME OS Available" +#: src/gs-upgrade-banner.c:96 +#, c-format +msgid "%s Available" +msgstr "%s 已推出新版本" + +#: src/gs-upgrade-banner.c:155 +msgid "Learn about the new version" +msgstr "深入瞭解新版本" + +#. Translators: the first '%s' is replaced with the downloaded size, the second '%s' +#. with the total download size, forming text like "135 MB of 2 GB downloaded" +#: src/gs-upgrade-banner.c:198 +#, c-format +msgid "%s of %s downloaded" +msgstr "已下載 %s,共 %s" + +#. Translators: the '%u' is replaced with the actual percentage being already +#. downloaded, forming text like "13% downloaded" +#: src/gs-upgrade-banner.c:202 +#, c-format +msgid "%u%% downloaded" +msgstr "已下載 %u%%" + +#: src/gs-upgrade-banner.ui:43 +msgid "A major upgrade, with new features and added polish." +msgstr "重大升級,包含新功能和加入改進。" + +#: src/gs-upgrade-banner.ui:153 +msgid "Cancel Upgrade" +msgstr "取消升級" + +#: src/gs-upgrade-banner.ui:184 +msgid "_Restart & Upgrade…" +msgstr "重新啟動並升級(_R)…" + +#: src/gs-upgrade-banner.ui:212 +msgid "Remember to back up data and files before upgrading." +msgstr "升級之前,記得備份您的資料與檔案。" + +#: src/gs-utils-error-dialog-simple.ui:4 +msgid "Error Details" +msgstr "錯誤詳細資訊" + +#: src/gs-utils-error-dialog-simple.ui:34 +msgid "Copy Details" +msgstr "複製詳細資訊" + +#: lib/gs-utils.c:581 lib/gs-utils.c:612 +#, c-format +msgid "Failed to delete file “%s”: %s" +msgstr "無法刪除「%s」檔案︰%s" + +#: lib/gs-utils.c:623 +#, c-format +msgid "Failed to delete directory “%s”: %s" +msgstr "無法刪除「%s」目錄︰%s" + +#: src/org.gnome.Software.desktop.in:4 +msgid "Add, remove or update software on this computer" +msgstr "在電腦上加入、移除、或更新軟體" + +#. Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +#: src/org.gnome.Software.desktop.in:12 +msgid "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;" +msgstr "" +"Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;" +"Software;App;Store;;更新;升級;來源;套件庫;軟體庫;倉庫;偏好設定;安裝;解除安裝;" +"程式;軟體;應用;商店;" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the first part of a system notification. +#: plugins/dkms/gs-plugin-dkms.c:176 +#, c-format +msgid "%s Ready" +msgstr "%s 已準備就緒" + +#. Translators: The "%s" is replaced with an app name, like "NVIDIA Linux Graphics Driver". +#. This is the second part of a system notification, which looks like: +#. +#. NVIDIA Linux Graphics Driver Ready +#. +#. The NVIDIA Linux Graphics Driver is ready to be enabled and staged for the next boot. +#. +#: plugins/dkms/gs-plugin-dkms.c:184 +#, c-format +msgid "The %s is ready to be enabled and staged for the next boot." +msgstr "%s 已準備好啟用,備待下次開機。" + +#: plugins/dkms/gs-plugin-dkms.c:189 +msgid "Enable" +msgstr "啟用" + +#. TRANSLATORS: this is a group of updates that are not +#. * packages and are not shown in the main list +#: plugins/core/gs-plugin-generic-updates.c:69 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3173 +msgid "System Updates" +msgstr "系統更新" + +#. TRANSLATORS: this is a longer description of the +#. * "System Updates" string +#: plugins/core/gs-plugin-generic-updates.c:74 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3178 +msgid "" +"General system updates, such as security or bug fixes, and performance " +"improvements." +msgstr "一般的系統更新,像是安全性問題或錯誤修正、效能改善等。" + +#. Translators: The '%s' is replaced with the OS name, like "Endless OS" +#: plugins/eos-updater/gs-plugin-eos-updater.c:688 +#, c-format +msgid "%s update with new features and fixes." +msgstr "%s 的更新,包含新功能與錯誤修正。" + +#: plugins/eos-updater/gs-plugin-eos-updater.c:1331 +msgid "EOS update service could not fetch and apply the update." +msgstr "無法取得 EOS 更新服務並套用更新。" + +#: plugins/epiphany/gs-plugin-epiphany.c:496 +#: plugins/epiphany/gs-plugin-epiphany.c:500 +msgid "Web App" +msgstr "網頁程式" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6 +msgid "Web Apps Support" +msgstr "網頁應用程式支援" + +#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:7 +msgid "Run popular web applications in a browser" +msgstr "在瀏覽器中執行知名的網頁應用程式" + +#. TRANSLATORS: this is a title for Fedora distro upgrades +#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:417 +#: plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c:95 +msgid "" +"Upgrade for the latest features, performance and stability improvements." +msgstr "升級系統以取得最新功能、效能與穩定性改善等。" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6 +msgid "Flatpak Support" +msgstr "Flatpak 支援" + +#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7 +msgid "Flatpak is a framework for desktop apps on Linux" +msgstr "《Flatpak》為一種用於 Linux 的桌面程式框架" + +#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264 +#: plugins/flatpak/gs-flatpak.c:344 +#, c-format +msgid "System folder %s" +msgstr "系統資料夾 %s" + +#: plugins/flatpak/gs-flatpak.c:345 plugins/flatpak/gs-flatpak.c:346 +#, c-format +msgid "Home subfolder %s" +msgstr "家目錄中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:347 +msgid "Host system folders" +msgstr "主機系統資料夾" + +#: plugins/flatpak/gs-flatpak.c:348 +msgid "Host system configuration from /etc" +msgstr "/etc 中的主機系統設定值" + +#: plugins/flatpak/gs-flatpak.c:349 +msgid "Desktop folder" +msgstr "桌面資料夾" + +#: plugins/flatpak/gs-flatpak.c:349 +#, c-format +msgid "Desktop subfolder %s" +msgstr "「桌面」中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:350 +msgid "Documents folder" +msgstr "文件資料夾" + +#: plugins/flatpak/gs-flatpak.c:350 +#, c-format +msgid "Documents subfolder %s" +msgstr "「文件」中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:351 +msgid "Music folder" +msgstr "音樂資料夾" + +#: plugins/flatpak/gs-flatpak.c:351 +#, c-format +msgid "Music subfolder %s" +msgstr "「音樂」中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:352 +msgid "Pictures folder" +msgstr "圖片資料夾" + +#: plugins/flatpak/gs-flatpak.c:352 +#, c-format +msgid "Pictures subfolder %s" +msgstr "「圖片」中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:353 +msgid "Public Share folder" +msgstr "公共資料夾" + +#: plugins/flatpak/gs-flatpak.c:353 +#, c-format +msgid "Public Share subfolder %s" +msgstr "「公共」中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:354 +msgid "Videos folder" +msgstr "影片資料夾" + +#: plugins/flatpak/gs-flatpak.c:354 +#, c-format +msgid "Videos subfolder %s" +msgstr "「影片」中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:355 +msgid "Templates folder" +msgstr "模本資料夾" + +#: plugins/flatpak/gs-flatpak.c:355 +#, c-format +msgid "Templates subfolder %s" +msgstr "「模本」中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:356 +msgid "User cache folder" +msgstr "使用者快取資料夾" + +#: plugins/flatpak/gs-flatpak.c:356 +#, c-format +msgid "User cache subfolder %s" +msgstr "使用者快取中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:357 +msgid "User configuration folder" +msgstr "使用者設定值資料夾" + +#: plugins/flatpak/gs-flatpak.c:357 +#, c-format +msgid "User configuration subfolder %s" +msgstr "使用者設定值中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:358 +msgid "User data folder" +msgstr "使用者資料資料夾" + +#: plugins/flatpak/gs-flatpak.c:358 +#, c-format +msgid "User data subfolder %s" +msgstr "使用者資料中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:359 +msgid "User runtime folder" +msgstr "使用者執行時期資料夾" + +#: plugins/flatpak/gs-flatpak.c:359 +#, c-format +msgid "User runtime subfolder %s" +msgstr "使用者執行時期中的 %s 資料夾" + +#: plugins/flatpak/gs-flatpak.c:417 +#, c-format +msgid "Filesystem access to %s" +msgstr "%s 的檔案系統取用權" + +#. TRANSLATORS: status text when downloading new metadata +#: plugins/flatpak/gs-flatpak.c:1371 +#, c-format +msgid "Getting flatpak metadata for %s…" +msgstr "正在取得《%s》的 flatpak 中介資料…" + +#: plugins/flatpak/gs-flatpak.c:3597 +#, c-format +msgid "Failed to refine addon ‘%s’: %s" +msgstr "無法將附加元件「%s」最佳化︰%s" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "User Installation" +msgstr "使用者安裝" + +#: plugins/flatpak/gs-flatpak-utils.c:94 +msgid "System Installation" +msgstr "系統安裝" + +#: plugins/flatpak/gs-flatpak-utils.c:273 +msgid "App ID" +msgstr "程式 ID" + +#: plugins/flatpak/gs-plugin-flatpak.c:1368 +#, c-format +msgid "Failed to add to install for addon ‘%s’: %s" +msgstr "無法將附加元件「%s」加入至安裝︰%s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1382 +#, c-format +msgid "Failed to add to uninstall for addon ‘%s’: %s" +msgstr "無法將附加元件「%s」加入至解除安裝︰%s" + +#: plugins/flatpak/gs-plugin-flatpak.c:1971 +#, c-format +msgid "" +"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. " +"Remove the filter and repeat the install. Detailed error: %s" +msgstr "" +"「%s」遠端不允許安裝「%s」,可能是其過濾器所造成的。\n" +"請移除過濾器並重試。詳細錯誤資訊:%s" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:70 +msgid "System power is too low to perform the update" +msgstr "系統電量太低無法執行更新" + +#. TRANSLATORS: as in laptop battery power +#: plugins/fwupd/gs-fwupd-app.c:74 +#, c-format +msgid "System power is too low to perform the update (%u%%, requires %u%%)" +msgstr "系統電量太低無法執行更新 (%u%%,需要 %u%%)" + +#. TRANSLATORS: for example, a Bluetooth mouse that is in powersave mode +#: plugins/fwupd/gs-fwupd-app.c:80 +msgid "Device is unreachable, or out of wireless range" +msgstr "裝置無法觸及或超出無線範圍" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:86 +#, c-format +msgid "Device battery power is too low" +msgstr "裝置電池低電量" + +#. TRANSLATORS: for example the batteries *inside* the Bluetooth mouse +#: plugins/fwupd/gs-fwupd-app.c:89 +#, c-format +msgid "Device battery power is too low (%u%%, requires %u%%)" +msgstr "裝置電池低電量 (%u%%,需要 %u%%)" + +#. TRANSLATORS: usually this is when we're waiting for a reboot +#: plugins/fwupd/gs-fwupd-app.c:95 +msgid "Device is waiting for the update to be applied" +msgstr "裝置正在等待套用更新" + +#. TRANSLATORS: as in, wired mains power for a laptop +#: plugins/fwupd/gs-fwupd-app.c:99 +msgid "Device requires AC power to be connected" +msgstr "裝置需要連接交流電源" + +#. TRANSLATORS: lid means "laptop top cover" +#: plugins/fwupd/gs-fwupd-app.c:103 +msgid "Device cannot be used while the lid is closed" +msgstr "上蓋闔上時裝置無法使用" + +#. TRANSLATORS: a specific part of hardware, +#. * the first %s is the device name, e.g. 'Unifying Receiver` +#: plugins/fwupd/gs-fwupd-app.c:212 +#, c-format +msgid "%s Device Update" +msgstr "「%s」裝置更新" + +#. TRANSLATORS: the entire system, e.g. all internal devices, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:217 +#, c-format +msgid "%s System Update" +msgstr "「%s」系統更新" + +#. TRANSLATORS: the EC is typically the keyboard controller chip, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:222 +#, c-format +msgid "%s Embedded Controller Update" +msgstr "「%s」內嵌控制器更新" + +#. TRANSLATORS: ME stands for Management Engine, the Intel AMT thing, +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:227 +#, c-format +msgid "%s ME Update" +msgstr "「%s」ME 更新" + +#. TRANSLATORS: ME stands for Management Engine (with Intel AMT), +#. * where the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:232 +#, c-format +msgid "%s Corporate ME Update" +msgstr "「%s」企業級 ME 更新" + +#. TRANSLATORS: ME stands for Management Engine, where +#. * the first %s is the device name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:237 +#, c-format +msgid "%s Consumer ME Update" +msgstr "「%s」消費者級 ME 更新" + +#. TRANSLATORS: the controller is a device that has other devices +#. * plugged into it, for example ThunderBolt, FireWire or USB, +#. * the first %s is the device name, e.g. 'Intel ThunderBolt` +#: plugins/fwupd/gs-fwupd-app.c:243 +#, c-format +msgid "%s Controller Update" +msgstr "「%s」控制器更新" + +#. TRANSLATORS: the Thunderbolt controller is a device that +#. * has other high speed Thunderbolt devices plugged into it; +#. * the first %s is the system name, e.g. 'ThinkPad P50` +#: plugins/fwupd/gs-fwupd-app.c:249 +#, c-format +msgid "%s Thunderbolt Controller Update" +msgstr "「%s」Thunderbolt 控制器更新" + +#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU +#. * at system bootup +#: plugins/fwupd/gs-fwupd-app.c:254 +#, c-format +msgid "%s CPU Microcode Update" +msgstr "「%s」CPU 微碼更新" + +#. TRANSLATORS: configuration refers to hardware state, +#. * e.g. a security database or a default power value +#: plugins/fwupd/gs-fwupd-app.c:259 +#, c-format +msgid "%s Configuration Update" +msgstr "「%s」組態設定更新" + +#. TRANSLATORS: battery refers to the system power source +#: plugins/fwupd/gs-fwupd-app.c:263 +#, c-format +msgid "%s Battery Update" +msgstr "「%s」電池更新" + +#. TRANSLATORS: camera can refer to the laptop internal +#. * camera in the bezel or external USB webcam +#: plugins/fwupd/gs-fwupd-app.c:268 +#, c-format +msgid "%s Camera Update" +msgstr "「%s」相機更新" + +#. TRANSLATORS: TPM refers to a Trusted Platform Module +#: plugins/fwupd/gs-fwupd-app.c:272 +#, c-format +msgid "%s TPM Update" +msgstr "「%s」TPM 更新" + +#. TRANSLATORS: TouchPad refers to a flat input device +#: plugins/fwupd/gs-fwupd-app.c:276 +#, c-format +msgid "%s Touchpad Update" +msgstr "「%s」觸控板更新" + +#. TRANSLATORS: Mouse refers to a handheld input device +#: plugins/fwupd/gs-fwupd-app.c:280 +#, c-format +msgid "%s Mouse Update" +msgstr "「%s」滑鼠更新" + +#. TRANSLATORS: Keyboard refers to an input device for typing +#: plugins/fwupd/gs-fwupd-app.c:284 +#, c-format +msgid "%s Keyboard Update" +msgstr "「%s」鍵盤更新" + +#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter +#: plugins/fwupd/gs-fwupd-app.c:288 +#, c-format +msgid "%s Storage Controller Update" +msgstr "「%s」儲存控制器更新" + +#. TRANSLATORS: Network Interface refers to the physical +#. * PCI card, not the logical wired connection +#: plugins/fwupd/gs-fwupd-app.c:293 +#, c-format +msgid "%s Network Interface Update" +msgstr "「%s」網路介面更新" + +#. TRANSLATORS: Video Display refers to the laptop internal display or +#. * external monitor +#: plugins/fwupd/gs-fwupd-app.c:298 +#, c-format +msgid "%s Display Update" +msgstr "「%s」顯示器更新" + +#. TRANSLATORS: BMC refers to baseboard management controller which +#. * is the device that updates all the other firmware on the system +#: plugins/fwupd/gs-fwupd-app.c:303 +#, c-format +msgid "%s BMC Update" +msgstr "「%s」BMC 更新" + +#. TRANSLATORS: Receiver refers to a radio device, e.g. a tiny Bluetooth +#. * device that stays in the USB port so the wireless peripheral works +#: plugins/fwupd/gs-fwupd-app.c:308 +#, c-format +msgid "%s USB Receiver Update" +msgstr "「%s」USB 接收器更新" + +#. TRANSLATORS: drive refers to a storage device, e.g. SATA disk +#: plugins/fwupd/gs-fwupd-app.c:312 +#, c-format +msgid "%s Drive Update" +msgstr "「%s」磁碟更新" + +#. TRANSLATORS: flash refers to solid state storage, e.g. UFS or eMMC +#: plugins/fwupd/gs-fwupd-app.c:316 +#, c-format +msgid "%s Flash Drive Update" +msgstr "「%s」快閃碟更新" + +#. TRANSLATORS: SSD refers to a Solid State Drive, e.g. non-rotating +#. * SATA or NVMe disk +#: plugins/fwupd/gs-fwupd-app.c:321 +#, c-format +msgid "%s SSD Update" +msgstr "「%s」SSD 更新" + +#. TRANSLATORS: GPU refers to a Graphics Processing Unit, e.g. +#. * the "video card" +#: plugins/fwupd/gs-fwupd-app.c:326 +#, c-format +msgid "%s GPU Update" +msgstr "「%s」GPU 更新" + +#. TRANSLATORS: Dock refers to the port replicator hardware laptops are +#. * cradled in, or lowered onto +#: plugins/fwupd/gs-fwupd-app.c:331 +#, c-format +msgid "%s Dock Update" +msgstr "「%s」擴充座更新" + +#. TRANSLATORS: Dock refers to the port replicator device connected +#. * by plugging in a USB cable -- which may or may not also provide power +#: plugins/fwupd/gs-fwupd-app.c:336 +#, c-format +msgid "%s USB Dock Update" +msgstr "「%s」USB 擴充座更新" + +#: plugins/fwupd/gs-plugin-fwupd.c:921 +msgid "Firmware" +msgstr "韌體" + +#: plugins/fwupd/gs-plugin-fwupd.c:1945 +msgid "Firmware update could not be applied: " +msgstr "無法套用韌體更新:" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6 +msgid "Firmware Upgrade Support" +msgstr "韌體升級支援" + +#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7 +msgid "Provides support for firmware upgrades" +msgstr "提供韌體升級支援" + +#: plugins/packagekit/gs-packagekit-task.c:147 +msgid "Install Unsigned Software?" +msgstr "是否要安裝未經簽署的軟體?" + +#: plugins/packagekit/gs-packagekit-task.c:148 +msgid "" +"Software that is to be installed is not signed. It will not be possible to " +"verify the origin of updates to this software, or whether updates have been " +"tampered with." +msgstr "" +"欲安裝的軟體未經簽署。因此無法核驗該軟體的更新來源,也無法得知更新是否曾遭竄" +"改。" + +#: plugins/packagekit/gs-packagekit-task.c:152 +msgid "Download Unsigned Software?" +msgstr "是否要下載未經簽署的軟體?" + +#: plugins/packagekit/gs-packagekit-task.c:153 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with." +msgstr "" +"未經簽署的軟體有更新。但由於沒有簽章,因此無法核驗更新來源,也無法得知更新是" +"否曾遭竄改。" + +#: plugins/packagekit/gs-packagekit-task.c:157 +msgid "Update Unsigned Software?" +msgstr "是否要更新未經簽署的軟體?" + +#: plugins/packagekit/gs-packagekit-task.c:158 +msgid "" +"Unsigned updates are available. Without a signature, it is not possible to " +"verify the origin of the update, or whether it has been tampered with. " +"Software updates will be disabled until unsigned updates are either removed " +"or updated." +msgstr "" +"未經簽署的軟體有更新。但由於沒有簽章,因此無法核驗更新來源,也無法得知更新是" +"否曾遭竄改。在未經簽署的軟體移除或更新之前,軟體更新會持續停用。" + +#: plugins/packagekit/gs-plugin-packagekit.c:1473 +msgid "Failed to install updates: " +msgstr "無法安裝更新:" + +#: plugins/packagekit/gs-plugin-packagekit.c:1568 +msgid "Packages" +msgstr "軟體包" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1413 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1439 +msgid "Failed to wait on transaction end before download: " +msgstr "無法在下載前等候處理事項結束:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1446 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1459 +msgid "Failed to download updates: " +msgstr "無法下載更新:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1498 +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:1508 +msgid "Failed to trigger update: " +msgstr "無法觸發更新:" + +#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:3273 +msgid "Operating System (OSTree)" +msgstr "作業系統 (OSTree)" + +#. TRANSLATORS: default snap store name +#: plugins/snap/gs-plugin-snap.c:300 +msgid "Snap Store" +msgstr "Snap 商店" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6 +msgid "Snap Support" +msgstr "Snap 支援" + +#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7 +msgid "A snap is a universal Linux package" +msgstr "《Snap》為一種通用的 Linux 軟體包" + +#. TRANSLATORS: this is the system OS upgrade +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:766 +msgid "System" +msgstr "系統" + +#. TRANSLATORS: this is the system component update +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:770 +msgid "System component" +msgstr "系統組件" + +#: plugins/systemd-sysupdate/gs-plugin-systemd-sysupdate.c:1021 +#, c-format +msgid "Removing sysupdate job '%s' failed with status %i" +msgstr "移除系統更新工作「%s」失敗,狀態碼為 %i" + +#~ msgid "How to contribute missing information" +#~ msgstr "如何加入遺漏的資訊" + +#~ msgid "A nice way to manage the software on your system." +#~ msgstr "管理系統軟體的絕佳方式。" + +#, c-format +#~ msgid "Please enter a number from 1 to %u: " +#~ msgstr "請輸入 1 至 %u 間的數字:" + +#~ msgid "Choose an app:" +#~ msgstr "選擇程式:" + +#, c-format +#~ msgid "%s is now installed" +#~ msgstr "已安裝《%s》" + +#~ msgid "A restart is required for the changes to take effect." +#~ msgstr "需要重新啟動才能使更動生效。" + +#~ msgid "App is ready to be used." +#~ msgstr "程式已可使用。" + +#~ msgid "System updates are now installed" +#~ msgstr "系統更新已安裝" + +#~ msgid "An app has been removed" +#~ msgid_plural "Apps have been removed" +#~ msgstr[0] "已移除程式" + +#~ msgid "A restart is required for it to take effect." +#~ msgid_plural "A restart is required for them to take effect." +#~ msgstr[0] "需重新啟動才能使更動生效。" + +#, c-format +#~ msgid "Unable to find “%s”" +#~ msgstr "找不到《%s》" + +#~ msgid "Downloading Software Catalog" +#~ msgstr "正下載軟體型錄" + +#~ msgid "Moderate page" +#~ msgstr "審核頁面" + +#~ msgid "There are no reviews to moderate" +#~ msgstr "沒有評論需要審核" + +#~ msgid "Turn on new repositories when they are added." +#~ msgstr "新增的軟體庫會立即啟用。" + +#~ msgid "Was this review useful to you?" +#~ msgstr "這則評論對您而言有用嗎?" + +#~ msgid "Yes" +#~ msgstr "是" + +#~ msgid "No" +#~ msgstr "否" + +#~ msgid "Meh" +#~ msgstr "無所謂" + +#~ msgid "Outdated SDK version" +#~ msgstr "過時的 SDK 版本" + +#~ msgid "Unable to install updates" +#~ msgstr "無法安裝更新" + +#~ msgid "Unable to uninstall: authentication invalid" +#~ msgstr "無法解除安裝:身分核對無效" + +#~ msgid "" +#~ "Cached data can be cleared from the _app settings." +#~ msgstr "快取資料可以從程式設定中清除。" + +#~ msgid "Examine Disk" +#~ msgstr "檢查磁碟" + +#~ msgid "Network Settings" +#~ msgstr "網路設定值" + +#~ msgid "_Restart Now…" +#~ msgstr "立刻重新啟動(_R)…" + +#~ msgid "Operating System Updates Unavailable" +#~ msgstr "沒有作業系統更新" + +#~ msgid "Upgrade to continue receiving security updates." +#~ msgstr "升級以繼續接收安全性更新。" + +#~ msgid "An important operating system update failed to be installed." +#~ msgstr "無法安裝重要的作業系統更新。" + +#~ msgid "No Network" +#~ msgstr "沒有網路" + +#~ msgid "Internet access is required to check for updates." +#~ msgstr "需連接網際網路以檢查更新。" + +#~ msgid "Network _Settings" +#~ msgstr "網路設定值(_S)" + +#~ msgid "" +#~ "Software upgrades have been downloaded and are ready to be installed." +#~ msgstr "已下載好軟體升級,並準備好安裝。" + +#~ msgid "Network connection is metered - software updates paused" +#~ msgstr "網路連線為計價網路 - 軟體更新已暫停" + +#~ msgid "" +#~ "Network connection prohibits large downloads - software updates paused" +#~ msgstr "網路連線禁止大量下載 - 軟體更新已暫停" + +#~ msgid "Power saver mode is active - software updates paused" +#~ msgstr "省電模式使用中 - 軟體更新已暫停" + +#~ msgid "Game mode is active - software updates paused" +#~ msgstr "遊戲模式使用中 - 軟體更新已暫停" + +#~ msgid "Software updates have been downloaded and are ready to be installed." +#~ msgstr "已下載好軟體更新,並準備好安裝。" + +#~ msgid "Downloading upgrade information…" +#~ msgstr "正在下載升級資訊…" + +#~ msgid "Automatic Updates Paused" +#~ msgstr "自動更新已暫停" + +#~ msgid "" +#~ "The current network is metered, so it may have data limits or charges " +#~ "associated with it. To save data, automatic updates have been paused.\n" +#~ "\n" +#~ "If the network has been incorrectly identified as metered, this can be " +#~ "changed in Settings." +#~ msgstr "" +#~ "目前的網路環境為計量連線,因此會有資料傳輸量上限,或可能產生額外費用。為了" +#~ "節省數據流量,已暫停自動更新。\n" +#~ "\n" +#~ "倘若目前網路是被誤認為計量連線的話,您可以在《設定值》中更改。" + +#~ msgid "Open Network _Settings" +#~ msgstr "開啟網路設定值(_S)" + +#~ msgid "" +#~ "To avoid charges and network caps, software updates are not automatically " +#~ "downloaded on mobile or metered connections." +#~ msgstr "" +#~ "為避免產生額外費用與超過資料傳輸量上限,使用行動網路或計量連線時不會自動下" +#~ "載軟體更新。" + +#~ msgid "" +#~ "Downloads and installs software updates in the background, when possible" +#~ msgstr "允許時會在背景下載並安裝軟體更新" + +#~ msgid "Show Only _Free Apps" +#~ msgstr "只顯示自由軟體(_F)" + +#~ msgid "Show only freely licensed apps and hide any proprietary apps" +#~ msgstr "只顯示自由授權的程式並隱藏任何專有程式" + +#~ msgid "" +#~ "What did you like about this app? Leaving your feedback along with your " +#~ "reasons for leaving a review is helpful for others." +#~ msgstr "" +#~ "你喜歡這個程式的什麼?留下您的反饋以及留下評論的原因對其他人很有幫助。" + +#~ msgid "" +#~ "Unable to download updates: internet access was required but wasn’t " +#~ "available" +#~ msgstr "無法下載更新:需要網際網路連接卻無法使用" + +#~ msgid "Unable to download updates: not enough disk space" +#~ msgstr "無法下載更新:磁碟空間不足" + +#~ msgid "Unable to download updates: authentication was required" +#~ msgstr "無法下載更新:需要核對身分" + +#~ msgid "Unable to download updates: authentication was invalid" +#~ msgstr "無法下載更新:身分核對無效" + +#, c-format +#~ msgid "Unable to install %s as download failed from %s" +#~ msgstr "無法安裝%s,從 %s 下載時發生錯誤" + +#, c-format +#~ msgid "Unable to install %s as runtime %s not available" +#~ msgstr "無法安裝%s,%s 執行時期無法使用" + +#, c-format +#~ msgid "Unable to install %s: you do not have permission to install software" +#~ msgstr "無法安裝%s:您沒有安裝軟體的許可權" + +#, c-format +#~ msgid "Unable to install %s: The battery level is too low" +#~ msgstr "無法安裝%s:電池電量過低" + +#, c-format +#~ msgid "Unable to update %s from %s as download failed" +#~ msgstr "無法自 %2$s 更新%1$s,下載失敗" + +#, c-format +#~ msgid "Unable to install updates from %s as download failed" +#~ msgstr "無法自 %s 安裝更新,下載失敗" + +#, c-format +#~ msgid "Unable to install updates: not enough disk space" +#~ msgstr "無法安裝更新:磁碟空間不足" + +#, c-format +#~ msgid "Unable to install updates: authentication was required" +#~ msgstr "無法安裝更新:需要核對身分" + +#, c-format +#~ msgid "Unable to install updates: authentication was invalid" +#~ msgstr "無法安裝更新:身分核對無效" + +#, c-format +#~ msgid "Unable to update %s: you do not have permission to update software" +#~ msgstr "無法更新%s:您沒有更新軟體的許可權" + +#, c-format +#~ msgid "" +#~ "Unable to install updates: you do not have permission to update software" +#~ msgstr "無法安裝更新:您沒有更新軟體的許可權" + +#, c-format +#~ msgid "Unable to install updates: AC power is required" +#~ msgstr "無法安裝更新:需接上交流電源" + +#, c-format +#~ msgid "Unable to update %s: The battery level is too low" +#~ msgstr "無法安裝%s:電池電量過低" + +#, c-format +#~ msgid "Unable to install updates: The battery level is too low" +#~ msgstr "無法安裝更新:電池電量過低" + +#, c-format +#~ msgid "" +#~ "Unable to upgrade to %s: internet access was required but wasn’t available" +#~ msgstr "無法升級 %s:需要網際網路連接卻無法使用" + +#, c-format +#~ msgid "Unable to upgrade to %s: you do not have permission to upgrade" +#~ msgstr "無法升級 %s:您沒有升級的許可權" + +#, c-format +#~ msgid "Unable to upgrade to %s: The battery level is too low" +#~ msgstr "無法升級 %s:電池電量過低" + +#, c-format +#~ msgid "Unable to remove %s: authentication was required" +#~ msgstr "無法移除%s:需要核對身分" + +#, c-format +#~ msgid "Unable to remove %s: authentication was invalid" +#~ msgstr "無法移除%s:身分核對無效" + +#, c-format +#~ msgid "Unable to remove %s: you do not have permission to remove software" +#~ msgstr "無法移除%s:您沒有移除軟體的許可權" + +#, c-format +#~ msgid "Unable to remove %s: AC power is required" +#~ msgstr "無法移除%s:需接上交流電源" + +#, c-format +#~ msgid "Unable to remove %s: The battery level is too low" +#~ msgstr "無法移除%s:電池電量過低" + +#, c-format +#~ msgid "Unable to remove %s" +#~ msgstr "無法移除%s" + +#~ msgid "Failed to install file: not supported" +#~ msgstr "無法安裝檔案:未提供支援" + +#~ msgid "Failed to install: not supported" +#~ msgstr "無法安裝:未提供支援" + +#~ msgid "AC power is required" +#~ msgstr "需要交流電源" + +#~ msgid "Metered network ‒ automatic updates paused" +#~ msgstr "按流量計費的網路 ‒ 自動更新已暫停" + +#~ msgid "Find Out _More" +#~ msgstr "深入瞭解(_M)" + +#~ msgid "An important software update is ready to be installed." +#~ msgstr "重大軟體更新已準備好安裝。" + +#~ msgid "Important: critical software updates are waiting." +#~ msgstr "重要:重大軟體更新正在等待。" + +#~ msgid "Show verbose debugging information" +#~ msgstr "顯示詳細除錯資訊" + +#~ msgid "Can access arbitrary files" +#~ msgstr "可以取用任意檔案" + +#, c-format +#~ msgid "Are you sure you want to uninstall %s?" +#~ msgstr "確定要解除安裝《%s》嗎?" + +#, c-format +#~ msgid "" +#~ "%s will be uninstalled, and you will have to install it to use it again." +#~ msgstr "《%s》將被解除安裝,欲再次使用必須重新安裝。" + +#~ msgid "Downloading featured images…" +#~ msgstr "正在下載精選影像…" + +#~ msgid "The last timestamp when the system was online and got any updates" +#~ msgstr "上次系統連上網路並取得更新的時間戳記" + +#~ msgid "An application" +#~ msgstr "應用程式" + +#~ msgid "" +#~ "This software is not available in your language and will appear in US " +#~ "English." +#~ msgstr "該軟體並未提供您所使用的語言,將以美式英文顯示。" + +#~ msgid "Selected add-ons will be installed with the application." +#~ msgstr "所選的附加元件會隨應用程式一併安裝。" + +#~ msgid "Applications" +#~ msgstr "應用程式" + +#~ msgid "_Continue" +#~ msgstr "繼續(_C)" + +#, c-format +#~ msgid "%u application" +#~ msgid_plural "%u applications" +#~ msgstr[0] "%u 個應用程式" + +#~ msgid "Post Review" +#~ msgstr "張貼評論" + +#~ msgid "_Post" +#~ msgstr "張貼(_P)" + +#~ msgid "Rating" +#~ msgstr "評等" + +#~ msgid "" +#~ "Give a short summary of your review, for example: “Great app, would " +#~ "recommend”." +#~ msgstr "為您的評論下一個簡短的摘要,例如:「很棒的程式,極力推薦」。" + +#~ msgctxt "app review" +#~ msgid "Review" +#~ msgstr "評論" + +#~ msgid "What do you think of the app? Try to give reasons for your views." +#~ msgstr "您覺得這個應用程式如何呢?試著以您的觀點提出原因。" + +#~ msgid "No screenshot provided" +#~ msgstr "未提供螢幕快照" + +#, c-format +#~ msgid "%s…" +#~ msgstr "%s…" + +#~ msgid "Restart Now" +#~ msgstr "立即重新啟動" + +#~ msgid "Primary Menu" +#~ msgstr "主選單" + +#~ msgctxt "Header bar button for list of apps to be updated" +#~ msgid "Updates" +#~ msgstr "更新" + +#, c-format +#~ msgid "%s %s is no longer supported." +#~ msgstr "%s %s 不再提供支援。" + +#~ msgid "This means that it does not receive security updates." +#~ msgstr "這代表它無法接收安全性更新。" + +#~ msgid "It is recommended that you upgrade to a more recent version." +#~ msgstr "建議您升級到較新的版本。" + +#~ msgid "Update All" +#~ msgstr "全部更新" + +#~ msgid "Application Updates" +#~ msgstr "應用程式更新" + +#~ msgid "GNOME Web" +#~ msgstr "GNOME《網頁》" + +#~ msgid "Application manager for GNOME" +#~ msgstr "GNOME 的應用程式管理器" + +#~ msgid "No updates have been installed on this system." +#~ msgstr "系統尚未安裝過更新。" + +#, c-format +#~ msgid "%s %s" +#~ msgstr "%s %s" + +#~ msgid "Software catalog is being downloaded" +#~ msgstr "正在下載軟體目錄" + +#~ msgid "Name" +#~ msgstr "名稱" + +#~ msgid "user" +#~ msgstr "使用者層級" + +#~ msgid "Channel" +#~ msgstr "頻道" + +#~ msgid "Branch" +#~ msgstr "分支" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Installation" +#~ msgstr "安裝於" + +#~ msgid "Version" +#~ msgstr "版本" + +#~ msgid "Access arbitrary files" +#~ msgstr "取用任意檔案" + +#~ msgid "Can access arbitrary files on the file system" +#~ msgstr "可以取用檔案系統上的任意資料" + +#~ msgid "A list of popular applications" +#~ msgstr "熱門應用程式列表" + +#~ msgid "A list of applications to use, overriding the system defined ones." +#~ msgstr "要使用的應用程式列表,凌駕系統定義的程式列表。" + +#~ msgid "Checking…" +#~ msgstr "正在檢查…" + +#~ msgid "Endless OS" +#~ msgstr "Endless OS" + +#~ msgid "GNOME Software" +#~ msgstr "GNOME 軟體" + +#~ msgid "Loading…" +#~ msgstr "載入中…" + +#~ msgid "_Add shortcut" +#~ msgstr "加入捷徑(_A)" + +#~ msgid "Re_move shortcut" +#~ msgstr "移除捷徑(_M)" + +#~ msgid "Welcome" +#~ msgstr "歡迎" + +#~ msgid "Welcome to Software" +#~ msgstr "歡迎使用《軟體》" + +#~ msgid "" +#~ "Software lets you install all the software you need, all from one place. " +#~ "See our recommendations, browse the categories, or search for the " +#~ "applications you want." +#~ msgstr "" +#~ "《軟體》讓您安裝所有您需要的軟體,在一個地方滿足所有需求。請看看我們的推薦" +#~ "項目,瀏覽各項分類,或是直接搜尋您想要使用的應用程式。" + +#~ msgid "_Browse Software" +#~ msgstr "瀏覽軟體(_B)" + +#~ msgid "Downloading application ratings…" +#~ msgstr "下載應用程式評等中…" + +#~ msgid "Unknown Permissions" +#~ msgstr "權限不明" + +#~ msgid "The permissions needed by this app aren’t known" +#~ msgstr "尚未得知此程式所需要的取用權" + +#~ msgid "OS Updates" +#~ msgstr "作業系統更新" + +#~ msgid "Includes performance, stability and security improvements." +#~ msgstr "包括效能、穩定性、安全性等改善。" + +#~ msgid "Downloading firmware update signature…" +#~ msgstr "下載韌體更新簽章中…" + +#~ msgid "Downloading firmware update metadata…" +#~ msgstr "下載韌體更新中介資料中…" + +#~ msgid "Show the prompt to install nonfree software repositories" +#~ msgstr "安裝非自由軟體庫時顯示提示" + +#~ msgid "Select All" +#~ msgstr "全選" + +#~ msgid "Select None" +#~ msgstr "全不選" + +#~ msgid "Featured %s" +#~ msgstr "%s特選" + +#~ msgid "Show" +#~ msgstr "顯示" + +#~ msgid "Subcategories filter menu" +#~ msgstr "子類別過濾選單" + +#~ msgid "Sort" +#~ msgstr "排序" + +#~ msgid "Subcategories sorting menu" +#~ msgstr "子類別排序選單" + +#~ msgctxt "Menu of Games" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Games" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Utilities" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Utilities" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Reference" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Reference" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgid "Audio & Video" +#~ msgstr "音訊和視訊" + +#~ msgid "Developer Tools" +#~ msgstr "開發者工具" + +#~ msgid "Education & Science" +#~ msgstr "教育和科學" + +#~ msgid "Games" +#~ msgstr "遊戲" + +#~ msgid "Graphics & Photography" +#~ msgstr "圖形和攝影" + +#~ msgid "Productivity" +#~ msgstr "生產力" + +#~ msgid "Communication & News" +#~ msgstr "溝通和新聞" + +#~ msgid "Utilities" +#~ msgstr "公用程式" + +#~ msgid "_Read Less" +#~ msgstr "閱讀更少(_R)" + +#~ msgid "_Launch" +#~ msgstr "啟動(_L)" + +#~ msgid "" +#~ "Unable to determine which parts of the system this application accesses. " +#~ "This is typical for older applications." +#~ msgstr "" +#~ "無法判定此應用程式可存取系統的什麼部份。這對於老舊應用程式來說很常見。" + +#~ msgctxt "updated" +#~ msgid "Never" +#~ msgstr "永不" + +#~ msgctxt "App permissions" +#~ msgid "Low" +#~ msgstr "低" + +#~ msgctxt "App permissions" +#~ msgid "Medium" +#~ msgstr "中" + +#~ msgctxt "App permissions" +#~ msgid "High" +#~ msgstr "高" + +#~ msgctxt "App permissions" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgid "Public domain" +#~ msgstr "公版著作" + +#~ msgid "https://en.wikipedia.org/wiki/Public_domain" +#~ msgstr "https://zh.wikipedia.org/zh-tw/%E5%85%AC%E6%9C%89%E9%A2%86%E5%9F%9F" + +#~ msgid "https://www.gnu.org/philosophy/free-sw" +#~ msgstr "https://www.gnu.org/philosophy/free-sw.zh-tw.html" + +#~ msgid "Users are bound by the following license:" +#~ msgid_plural "Users are bound by the following licenses:" +#~ msgstr[0] "使用者受下列授權條款約束:" + +#~ msgid "Localized in your Language" +#~ msgstr "支援您的本地語言" + +#~ msgid "Release Activity" +#~ msgstr "發行活躍" + +#~ msgid "Sandboxed" +#~ msgstr "沙盒運行" + +#~ msgid "Category" +#~ msgstr "類別" + +#~ msgid "Free" +#~ msgstr "自由授權" + +#~ msgctxt "Application license" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgid "" +#~ "This means that the software can be freely run, copied, distributed, " +#~ "studied and modified." +#~ msgstr "這代表該軟體著作可以讓您自由運用、複製、散布、研究、和修改。" + +#~ msgid "Proprietary Software" +#~ msgstr "專有軟體" + +#~ msgid "" +#~ "This means that the software is owned by an individual or a company. " +#~ "There are often restrictions on its use and its source code cannot " +#~ "usually be accessed." +#~ msgstr "" +#~ "這代表該軟體著作屬於特定人士或公司所有。他們通常會限制您的使用方式,而且一" +#~ "般來說無法存取其軟體源始碼。" + +#~ msgid "The license terms of this software are unknown." +#~ msgstr "此軟體的授權條款細則尚未可知。" + +#~ msgid "The application was rated this way because it features:" +#~ msgstr "該應用程式因下列特點而列於此分級:" + +#~ msgid "No details were available for this rating." +#~ msgstr "此分級沒有可用的詳細資訊。" + +#~ msgctxt "app status" +#~ msgid "Uninstalled" +#~ msgstr "已解除安裝" + +#~ msgctxt "app status" +#~ msgid "Installed" +#~ msgstr "已安裝" + +#~ msgctxt "app status" +#~ msgid "Updated" +#~ msgstr "已更新" + +#~ msgctxt "app status" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgid "History" +#~ msgstr "歷史" + +#~ msgid "More…" +#~ msgstr "更多…" + +#~ msgid "Recommended Audio & Video Applications" +#~ msgstr "推薦的音訊和視訊應用程式" + +#~ msgid "Recommended Games" +#~ msgstr "推薦的遊戲" + +#~ msgid "Recommended Graphics Applications" +#~ msgstr "推薦的圖形藝術應用程式" + +#~ msgid "Recommended Productivity Applications" +#~ msgstr "推薦的生產力應用程式" + +#~ msgid "" +#~ "Some of this software is proprietary and therefore has restrictions on " +#~ "use, sharing, and access to source code." +#~ msgstr "" +#~ "此軟體有部分是專有授權,因此對於使用、分享、存取軟體源碼等都有所限制。" + +#~ msgid "Find out more…" +#~ msgstr "深入瞭解…" + +#~ msgid "Editor’s Picks" +#~ msgstr "編輯精選" + +#~ msgid "Recent Releases" +#~ msgstr "最近發行" + +#~ msgid "Remove “%s”?" +#~ msgstr "移除「%s」?" + +#~ msgid "Disable “%s”?" +#~ msgstr "停用「%s」?" + +#~ msgid "No Additional Repositories" +#~ msgstr "無額外軟體庫" + +#~ msgid "_Remove…" +#~ msgstr "移除(_R)…" + +#~ msgid "_Disable…" +#~ msgstr "停用(_D)…" + +#~ msgid "Disabling" +#~ msgstr "停用中" + +#~ msgid "Enabled" +#~ msgstr "已啟用" + +#~ msgid "Disabled" +#~ msgstr "已停用" + +#~ msgid "ratings in total" +#~ msgstr "總評論數" + +#~ msgid "_Remove All" +#~ msgstr "全部移除(_R)" + +#~ msgid "Looking for new updates…" +#~ msgstr "尋找新的更新中…" + +#~ msgid "Setting up updates…" +#~ msgstr "設置更新中…" + +#~ msgid "Software is up to date" +#~ msgstr "軟體處於最新狀態" + +#~ msgid "Updates will be applied when the computer is restarted." +#~ msgstr "更新會在電腦重新啟動時套用。" + +#~ msgid "Waiting to Download %s %s" +#~ msgstr "正在等候下載 %s %s" + +#~ msgid "Downloading %s %s" +#~ msgstr "正在下載 %s %s" + +#~ msgid "%s %s Ready to be Installed" +#~ msgstr "%s %s 已準備好可以安裝" + +#~ msgid "ODRS is a service providing user reviews of applications" +#~ msgstr "ODRS 是個提供應用程式使用者發表評論的服務" + +#~ msgid "Cartoon characters in unsafe situations" +#~ msgstr "漫畫角色處在非安全的情況下" + +#~ msgid "Cartoon characters in aggressive conflict" +#~ msgstr "漫畫角色有強勢衝突" + +#~ msgid "Graphic violence involving cartoon characters" +#~ msgstr "涉及漫畫角色的圖像暴力" + +#~ msgid "Characters in unsafe situations easily distinguishable from reality" +#~ msgstr "人物處在非安全的情況下但容易與現實區隔" + +#~ msgid "" +#~ "Characters in aggressive conflict easily distinguishable from reality" +#~ msgstr "人物有強勢衝突但容易與現實區隔" + +#~ msgid "Graphic violence easily distinguishable from reality" +#~ msgstr "圖像暴力但容易與現實區隔" + +#~ msgid "Mildly realistic characters in unsafe situations" +#~ msgstr "輕微真實人物處在非安全的情況下" + +#~ msgid "Depictions of realistic characters in aggressive conflict" +#~ msgstr "真實人物有強勢衝突的描繪" + +#~ msgid "Graphic violence involving realistic characters" +#~ msgstr "涉及真實人物的圖像暴力" + +#~ msgid "No bloodshed" +#~ msgstr "沒有殺人" + +#~ msgid "Unrealistic bloodshed" +#~ msgstr "非寫實的殺人" + +#~ msgid "Realistic bloodshed" +#~ msgstr "寫實的殺人" + +#~ msgid "Depictions of bloodshed and the mutilation of body parts" +#~ msgstr "殺人及殘害身體的描繪" + +#~ msgid "Rape or other violent sexual behavior" +#~ msgstr "強暴或其他暴力式性行為" + +#~ msgid "References to alcoholic beverages" +#~ msgstr "涉及酒精性飲料" + +#~ msgid "Use of alcoholic beverages" +#~ msgstr "使用到酒精性飲料" + +#~ msgid "References to illicit drugs" +#~ msgstr "涉及非法藥物" + +#~ msgid "Use of illicit drugs" +#~ msgstr "使用到非法藥物" + +#~ msgid "References to tobacco products" +#~ msgstr "涉及菸草產品" + +#~ msgid "Use of tobacco products" +#~ msgstr "使用到菸草產品" + +#~ msgid "Brief artistic nudity" +#~ msgstr "短暫藝術性裸體" + +#~ msgid "Prolonged nudity" +#~ msgstr "長時間裸體" + +#~ msgid "Provocative references or depictions" +#~ msgstr "涉及刺激或描繪刺激" + +#~ msgid "Sexual references or depictions" +#~ msgstr "涉及性或描繪性" + +#~ msgid "Graphic sexual behavior" +#~ msgstr "圖像式性行為" + +#~ msgid "Mild or infrequent use of profanity" +#~ msgstr "輕微或少有使用辱駡" + +#~ msgid "Moderate use of profanity" +#~ msgstr "偶爾使用辱駡" + +#~ msgid "Strong or frequent use of profanity" +#~ msgstr "強烈或經常使用辱駡" + +#~ msgid "Slapstick humor" +#~ msgstr "低俗鬧劇式幽默" + +#~ msgid "Vulgar or bathroom humor" +#~ msgstr "粗俗或廁所式幽默" + +#~ msgid "Mature or sexual humor" +#~ msgstr "成人或性相關幽默" + +#~ msgid "Negativity towards a specific group of people" +#~ msgstr "排斥特定群體" + +#~ msgid "Discrimination designed to cause emotional harm" +#~ msgstr "刻意造成情緒傷害之歧視" + +#~ msgid "Explicit discrimination based on gender, sexuality, race or religion" +#~ msgstr "根據性別、性能力、種族、信仰所作的針對性歧視" + +#~ msgid "Product placement" +#~ msgstr "置入性產品行銷" + +#~ msgid "Explicit references to specific brands or trademarked products" +#~ msgstr "明確指涉特定廠牌或註冊商標之產品" + +#~ msgid "Users are encouraged to purchase specific real-world items" +#~ msgstr "鼓吹使用者購買特定真實世界商品" + +#~ msgid "Gambling on random events using tokens or credits" +#~ msgstr "使用代幣或儲值之隨機活動性賭博" + +#~ msgid "Gambling using “play” money" +#~ msgstr "使用「遊戲」財物之賭博" + +#~ msgid "Gambling using real money" +#~ msgstr "使用實體金錢的賭博" + +#~ msgid "Users are encouraged to donate real money" +#~ msgstr "鼓勵使用者捐贈實體金錢" + +#~ msgid "Ability to spend real money in-app" +#~ msgstr "可在程式中花費實體金錢" + +#~ msgid "User-to-user interactions without chat functionality" +#~ msgstr "使用者與使用者間之互動不含聊天功能" + +#~ msgid "Moderated chat functionality between users" +#~ msgstr "受審查的使用者間聊天功能" + +#~ msgid "Uncontrolled audio or video chat functionality between users" +#~ msgstr "未受管制的使用者間音訊或視訊聊天功能" + +#~ msgid "Sharing social network usernames or email addresses" +#~ msgstr "分享社交網路使用者名稱或電子郵件位址" + +#~ msgid "Checking for the latest application version" +#~ msgstr "檢查最新的應用程式版本" + +#~ msgid "Sharing diagnostic data that does not let others identify the user" +#~ msgstr "分享無法讓他人辨識出使用者的診斷性數據資料" + +#~ msgid "Sharing information that lets others identify the user" +#~ msgstr "分享可以讓其他人辨識出使用者的資訊" + +#~ msgid "Sharing physical location with other users" +#~ msgstr "與其他使用者分享實際地理位置" + +#~ msgid "Indirect references to homosexuality" +#~ msgstr "間接涉及同性戀議題" + +#~ msgid "Kissing between people of the same gender" +#~ msgstr "人類同性別親吻" + +#~ msgid "Graphic sexual behavior between people of the same gender" +#~ msgstr "圖像式人類同性別性行為" + +#~ msgid "Indirect references to prostitution" +#~ msgstr "間接涉及賣淫" + +#~ msgid "Direct references to prostitution" +#~ msgstr "直接涉及賣淫" + +#~ msgid "Graphic depictions of the act of prostitution" +#~ msgstr "圖像式賣淫動作描繪" + +#~ msgid "Indirect references to adultery" +#~ msgstr "間接涉及通姦" + +#~ msgid "Direct references to adultery" +#~ msgstr "直接涉及通姦" + +#~ msgid "Graphic depictions of the act of adultery" +#~ msgstr "圖像式通姦行為描繪" + +#~ msgid "Scantily clad human characters" +#~ msgstr "衣著覆蓋極少的人類角色" + +#~ msgid "Overtly sexualized human characters" +#~ msgstr "刻意性化的人類角色" + +#~ msgid "Depictions of or references to historical desecration" +#~ msgstr "描繪或涉及史實上的褻瀆" + +#~ msgid "Depictions of modern-day human desecration" +#~ msgstr "描繪當代人體褻瀆" + +#~ msgid "Graphic depictions of modern-day desecration" +#~ msgstr "圖像式當代褻瀆描繪" + +#~ msgid "Visible dead human remains" +#~ msgstr "會看見亡者遺體" + +#~ msgid "Dead human remains that are exposed to the elements" +#~ msgstr "亡者遺體暴露在相關元素中" + +#~ msgid "Graphic depictions of desecration of human bodies" +#~ msgstr "圖像式褻瀆人體的描繪" + +#~ msgid "Depictions of or references to historical slavery" +#~ msgstr "描繪或涉及史實上的奴隸行為" + +#~ msgid "Depictions of modern-day slavery" +#~ msgstr "描繪當代的奴隸行為" + +#~ msgid "Graphic depictions of modern-day slavery" +#~ msgstr "圖像式當代奴隸行為描繪" + +#~ msgid "General" +#~ msgstr "一般" + +#~ msgid "ALL" +#~ msgstr "所有" + +#~ msgid "Teen" +#~ msgstr "青少年 (13-19)" + +#~ msgid "Everyone 10+" +#~ msgstr "十歲以上 (10+)" + +#~ msgid "Everyone" +#~ msgstr "任何人" + +#~ msgid "Early Childhood" +#~ msgstr "幼兒 (3+)" + +#~ msgctxt "version" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgid "Released" +#~ msgstr "發行時間" + +#~ msgid "_Let’s Go Shopping" +#~ msgstr "出發去購物(_L)" + +#~ msgctxt "app status" +#~ msgid "Removed" +#~ msgstr "已移除" + +#~ msgid "Format" +#~ msgstr "格式" + +#~ msgid "Are you sure you want to remove %s?" +#~ msgstr "您確定要移除 %s?" + +#~ msgid "Security Updates Pending" +#~ msgstr "擱置的安全性更新" + +#~ msgid "It is recommended that you install important updates now" +#~ msgstr "建議您現在安裝重要更新" + +#~ msgid "Restart & Install" +#~ msgstr "重新啟動並安裝更新" + +#~ msgid "Important OS and application updates are ready to be installed" +#~ msgstr "已備妥重要的作業系統與應用程式更新可供安裝" + +#~ msgid "View" +#~ msgstr "檢視" + +#~ msgid "%R" +#~ msgstr "%R" + +#~ msgid "%l:%M %p" +#~ msgstr "%p %l:%M" + +#~ msgid "Yesterday, %l:%M %p" +#~ msgstr "昨日%p %l:%M" + +#~ msgid "Three days ago" +#~ msgstr "三天前" + +#~ msgid "Four days ago" +#~ msgstr "四天前" + +#~ msgid "Five days ago" +#~ msgstr "五天前" + +#~ msgid "Six days ago" +#~ msgstr "六天前" + +#~ msgid "Two weeks ago" +#~ msgstr "兩週前" + +#~ msgid "Enable GNOME Shell extensions repository" +#~ msgstr "啟用 GNOME Shell 擴充套件庫" + +#~ msgid "this website" +#~ msgstr "這個網站" + +#~ msgid "This application needs to be restarted to use new plugins." +#~ msgstr "這個應用程式需要重新開機才能使用新的外掛程式。" + +#~ msgid "About %s" +#~ msgstr "關於《%s》" + +#~ msgid "%s ME" +#~ msgstr "%s ME" + +#~ msgid "Extension Settings" +#~ msgstr "擴充套件設定值" + +#~ msgid "" +#~ "Extensions are used at your own risk. If you have any system problems, it " +#~ "is recommended to disable them." +#~ msgstr "" +#~ "請自行承擔擴充套件的使用風險。若您遇上任何系統問題,建議將擴充套件停用。" + +#~ msgctxt "Menu of Add-ons" +#~ msgid "Shell Extensions" +#~ msgstr "Shell 擴充套件" + +#~ msgid "GNOME Shell Extensions Repository" +#~ msgstr "GNOME Shell 擴充套件庫" + +#~ msgid "Downloading shell extension metadata…" +#~ msgstr "下載擴充套件中介資料中…" + +#~ msgid "GNOME Shell Extension" +#~ msgstr "GNOME Shell 擴充套件" + +#~ msgid "Show the folder management UI" +#~ msgstr "顯示資料夾管理之使用者介面" + +#~ msgid "_All" +#~ msgstr "全部(_A)" + +#~ msgid "Folder Name" +#~ msgstr "資料夾名稱" + +#~ msgid "_Add" +#~ msgstr "加入(_A)" + +#~ msgid "Add to Application Folder" +#~ msgstr "加入到應用程式資料夾中" + +#~ msgid "Sign In / Register…" +#~ msgstr "登入 / 註冊…" + +#~ msgid "Continue" +#~ msgstr "繼續" + +#~ msgid "Use" +#~ msgstr "使用" + +#~ msgid "Add another…" +#~ msgstr "加入其他…" + +#~ msgid "Top Rated" +#~ msgstr "最高評等" + +#~ msgid "CSS validated OK!" +#~ msgstr "CSS 驗證 OK!" + +#~ msgid "Failed to load file" +#~ msgstr "無法載入檔案" + +#~ msgid "Unsaved changes" +#~ msgstr "尚未儲存變更" + +#~ msgid "The application list is already loaded." +#~ msgstr "應用程式清單已經載入。" + +#~ msgid "Merge documents" +#~ msgstr "合併文件" + +#~ msgid "Throw away changes" +#~ msgstr "放棄變更" + +#~ msgid "Open AppStream File" +#~ msgstr "開啟 AppStream 檔案" + +#~ msgid "_Save" +#~ msgstr "儲存(_S)" + +#~ msgid "Failed to save file" +#~ msgstr "無法儲存檔案" + +#~ msgid "%s banner design deleted." +#~ msgstr "%s 橫幅設計已刪除。" + +#~ msgid "Banner design deleted." +#~ msgstr "橫幅設計已刪除。" + +#~ msgid "The application list has unsaved changes." +#~ msgstr "尚未儲存應用程式清單的更動。" + +#~ msgid "Use verbose logging" +#~ msgstr "使用詳盡紀錄" + +#~ msgid "GNOME Software Banner Designer" +#~ msgstr "GNOME 軟體橫幅設計師" + +#~ msgid "No Designs" +#~ msgstr "沒有設計" + +#~ msgid "Error message here" +#~ msgstr "這裡是錯誤訊息" + +#~ msgid "Category Featured" +#~ msgstr "類別特選" + +#~ msgid "Undo" +#~ msgstr "取消動作" + +#~ msgid "Banner Designer" +#~ msgstr "橫幅設計師" + +#~ msgid "New Banner" +#~ msgstr "新橫幅" + +#~ msgid "Import from file" +#~ msgstr "從檔案匯入" + +#~ msgid "Export to file" +#~ msgstr "匯出成檔案" + +#~ msgid "Spacing" +#~ msgstr "間距" + +#~ msgid "The amount of space between children" +#~ msgstr "子元件之間的間距" + +#~ msgid "Click on items to select them" +#~ msgstr "點按項目可以選取" + +#~ msgid "Select" +#~ msgstr "選取" + +#~ msgid "_Add to Folder…" +#~ msgstr "加入到資料夾中(_A)…" + +#~ msgid "_Move to Folder…" +#~ msgstr "移動到資料夾中(_M)" + +#~ msgid "_Remove from Folder" +#~ msgstr "從資料夾中移除(_R)" + +#~ msgid "Featured Applications" +#~ msgstr "特色應用程式" + +#~ msgid "%s will be installed, and you will be charged %s." +#~ msgstr "即將安裝 %s,並且向您收取 %s。" + +#~ msgid "A$%.2f" +#~ msgstr "A$%.2f" + +#~ msgid "C$%.2f" +#~ msgstr "C$%.2f" + +#~ msgid "CN¥%.2f" +#~ msgstr "CN¥%.2f" + +#~ msgid "€%.2f" +#~ msgstr "€%.2f" + +#~ msgid "£%.2f" +#~ msgstr "£%.2f" + +#~ msgid "¥%.2f" +#~ msgstr "¥%.2f" + +#~ msgid "NZ$%.2f" +#~ msgstr "NZ$%.2f" + +#~ msgid "₽%.2f" +#~ msgstr "₽%.2f" + +#~ msgid "US$%.2f" +#~ msgstr "US$%.2f" + +#~ msgid "Signed in as %s" +#~ msgstr "已登入為 %s" + +#~ msgid "Sign in…" +#~ msgstr "登入…" + +#~ msgid "Sign out" +#~ msgstr "登出" + +#~ msgid "Unable to purchase %s: authentication was required" +#~ msgstr "無法購買 %s:需要核對身份" + +#~ msgid "Unable to purchase %s: authentication was invalid" +#~ msgstr "無法購買 %s:身份核對無效" + +#~ msgid "Unable to purchase %s: no payment method setup" +#~ msgstr "無法購買 %s:尚未設置支付方式" + +#~ msgid "Unable to purchase %s: payment was declined" +#~ msgstr "無法購買 %s:拒絕支付" + +#~ msgid "Design the featured banners for GNOME Software" +#~ msgstr "設計 GNOME《軟體》的特選橫幅" + +#~ msgid "AppStream;Software;App;" +#~ msgstr "AppStream;Software;App;軟體;程式;" + +#~ msgid "To continue, you need to use an Ubuntu One account." +#~ msgstr "若要繼續,您需要使用 Ubuntu One 帳號。" + +#~ msgid "To continue, you need to use your Ubuntu One account." +#~ msgstr "若要繼續,需要登入您的 Ubuntu One 帳號。" + +#~ msgid "system-software-install" +#~ msgstr "system-software-install" + +#~ msgid "_About" +#~ msgstr "關於(_A)" + +#~ msgid "Show profiling information for the service" +#~ msgstr "顯示該服務的評測資訊" + +#~ msgid "To continue you need to sign in to %s." +#~ msgstr "若要繼續,需要您登入 %s。" + +#~ msgid "Email address" +#~ msgstr "電子郵件位址" + +#~ msgid "I have an account already" +#~ msgstr "我已有帳號" + +#~ msgid "I want to register for an account now" +#~ msgstr "我想要立刻註冊帳號" + +#~ msgid "I have forgotten my password" +#~ msgstr "我竟然忘記密碼" + +#~ msgid "Sign in automatically next time" +#~ msgstr "下次自動登入" + +#~ msgid "Enter your one-time pin for two-factor authentication." +#~ msgstr "請輸入雙因素身份認證的一次性 PIN 碼。" + +#~ msgid "PIN" +#~ msgstr "PIN 碼" + +#~ msgid "Authenticate" +#~ msgstr "核對" + +#~ msgid "Software catalog is being loaded" +#~ msgstr "正在載入軟體目錄" + +#~ msgid "" +#~ "Information about %s, as well as options for how to get a codec that can " +#~ "play this format can be found on the website." +#~ msgstr "" +#~ "%s 的相關資訊,以及網站上提供的該如何取得可播放此格式的編解碼器之選項。" + +#~ msgid "Your %s account has been suspended." +#~ msgstr "您的 %s 帳號已經停用。" + +#~ msgid "It is not possible to install software until this has been resolved." +#~ msgstr "除非此問題得到解決,否則無法安裝程式。" + +#~ msgid "For more information, visit %s." +#~ msgstr "若想瞭解詳細資訊,請造訪 %s。" + +#~ msgid "Unable to update %s from %s" +#~ msgstr "無法安裝 %s,來源為 %s" + +#~ msgid "Downloading new updates…" +#~ msgstr "下載新的更新中…" + +#~ msgid "org.gnome.Software" +#~ msgstr "org.gnome.Software" + +#~ msgid "Downloading application page…" +#~ msgstr "下載應用程式頁面中…" + +#~ msgid "The ultimate entertainment platform from Valve" +#~ msgstr "Valve 提供的終極娛樂平臺" + +#~ msgid "_Quit" +#~ msgstr "退出(_Q)" + +#~ msgid "Applications Updated" +#~ msgstr "已更新應用程式" + +#~ msgid "Includes: ." +#~ msgstr "包含:." + +#~ msgid "Restart & _Install" +#~ msgstr "重新啟動並安裝(_I)" + +#~ msgid "Getting runtime source…" +#~ msgstr "取得執行時期來源中…" + +#~ msgid "Limba Support" +#~ msgstr "Limba 支援" + +#~ msgid "Limba provides developers a way to easily create software bundles" +#~ msgstr "Limba 為開發人員提供了一個輕鬆建立軟體捆綁的方法" + +#~ msgid "The list of extra sources that have been previously enabled" +#~ msgstr "之前已啟用過的額外來源列表" + +#~ msgid "" +#~ "The list of sources that have been previously enabled when installing " +#~ "third-party applications." +#~ msgstr "之前在安裝第三方應用程式時啟用過的來源列表。" + +#~ msgid "Show non-free software in search results" +#~ msgstr "在搜尋結果中顯示非自由軟體" + +#~ msgid "A list of non-free sources that can be optionally enabled" +#~ msgstr "可選擇性啟用的非自由軟體來源清單" + +#~ msgid "Sorted by Name" +#~ msgstr "依名稱排序" + +#~ msgid "Sorted by Rating" +#~ msgstr "依評等排序" + +#~ msgid "Enable Proprietary Software Sources?" +#~ msgstr "啟用專有軟體來源?" + +#~ msgid "No applications or addons installed; other software might still be" +#~ msgstr "沒有安裝應用程式或附加程式;可能還有其他軟體" + +#~ msgid "Typically has restrictions on use and access to source code." +#~ msgstr "一般會限制軟體的使用用途、並限制其源始碼的存取。" + +#~ msgid "Proprietary Software Sources" +#~ msgstr "專有軟體來源" + +#~ msgid "" +#~ "Software sources can be downloaded from the internet. They give you " +#~ "access to additional software that is not provided by %s." +#~ msgstr "軟體來源可以從網際網路下載。它們讓您存取更多 %s 沒有提供的軟體。" + +#~ msgid "" +#~ "Removing a source will also remove any software you have installed from " +#~ "it." +#~ msgstr "移除來源也會移除您先前從該來源安裝過的任何軟體。" + +#~ msgid "No software installed from this source" +#~ msgstr "沒有從此來源安裝的軟體" + +#~ msgid "Installed from this Source" +#~ msgstr "從此來源安裝的軟體" + +#~ msgid "Last Checked" +#~ msgstr "上次檢查" + +#~ msgid "Added" +#~ msgstr "加入時間" + +#~ msgid "Website" +#~ msgstr "網站" + +#~ msgid "Player-to-player preset interactions without chat functionality" +#~ msgstr "玩家與玩家間預先設置性互動,不含聊天功能" + +#~ msgid "Sharing user information with 3rd parties" +#~ msgstr "和第三方團體或單位分享使用者資訊" + +#~ msgid "Remove Source" +#~ msgstr "移除來源" + +#~ msgid "page1" +#~ msgstr "page1" + +#~ msgid "page2" +#~ msgstr "page2" + +#~ msgid "“%s” [%s]" +#~ msgstr "「%s」[%s]" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of AudioVideo" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Development" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Development" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Education and Science" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Graphics" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Graphics" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Office" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Office" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Communication" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Communication" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Utility" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Utility" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgid "Total" +#~ msgstr "合計" + +#~ msgid "Installation of %s failed." +#~ msgstr "%s 安裝失敗。" + +#~ msgid "Removal of %s failed." +#~ msgstr "%s 移除失敗。" + +#~ msgid "Please make sure that you have internet access and try again." +#~ msgstr "請確定您能使用網際網路後再試一次。" + +#~ msgid "Please free up some space and try again." +#~ msgstr "請挪出部分空間後再試一次。" + +#~ msgid "If the problem persists, contact your software provider." +#~ msgstr "如果問題持續發生,請聯絡您的軟體供應商。" + +#~ msgctxt "content rating violence-fantasy" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating violence-realistic" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating violence-bloodshed" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating violence-sexual" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating drugs-alcohol" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating drugs-narcotics" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating sex-nudity" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating sex-themes" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating language-profanity" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating language-humor" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating language-discrimination" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating money-advertising" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating money-gambling" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating money-purchasing" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating social-chat" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating social-audio" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating social-contacts" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating social-info" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "content rating social-location" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "Menu of Education" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Education" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Science" +#~ msgid "All" +#~ msgstr "全部" + +#~ msgctxt "Menu of Science" +#~ msgid "Featured" +#~ msgstr "特選" + +#~ msgctxt "Menu of Science" +#~ msgid "Astronomy" +#~ msgstr "天文" + +#~ msgctxt "Menu of Science" +#~ msgid "Chemistry" +#~ msgstr "化學" + +#~ msgctxt "Menu of Science" +#~ msgid "Math" +#~ msgstr "數學" + +#~ msgid "Science" +#~ msgstr "科學" + +#~ msgid "Software sources give you access to additional software." +#~ msgstr "軟體來源讓您存取更多軟體。" + +#~ msgid " or " +#~ msgstr " or " + +#~ msgid "3rd party" +#~ msgstr "第三方協力廠商" + +#~ msgid "nonfree" +#~ msgstr "非自由" + +#~ msgid "shell extension" +#~ msgstr "shell 擴充套件" + +#~ msgid "_Installing" +#~ msgstr "安裝中(_I)" + +#~ msgid "_Removing" +#~ msgstr "移除中(_R)" + +#~ msgctxt "license" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgctxt "menu category" +#~ msgid "None" +#~ msgstr "無" + +#~ msgid "This software comes from a 3rd party." +#~ msgstr "這個軟體是來自第三方協力廠商。" + +#~ msgid "" +#~ "This software comes from a 3rd party and may contain non-free components." +#~ msgstr "這個軟體來自第三方協力廠商,並可能包含非自由的元件。" + +#~ msgid "This software may contain non-free components." +#~ msgstr "這個軟體可能包含非自由的元件。" + +#~ msgid "non-free" +#~ msgstr "非自由" + +#~ msgid "Recommended Office Applications" +#~ msgstr "推薦的辦公應用程式" + +#~ msgid "One Star" +#~ msgstr "一顆星" + +#~ msgid "Two Stars" +#~ msgstr "兩顆星" + +#~ msgid "Three Stars" +#~ msgstr "三顆星" + +#~ msgid "Four Stars" +#~ msgstr "四顆星" + +#~ msgid "Five Stars" +#~ msgstr "五顆星" + +#~ msgid "Audio" +#~ msgstr "音訊" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Editing" +#~ msgstr "編輯" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Databases" +#~ msgstr "資料庫" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Disc Burning" +#~ msgstr "碟片燒錄" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Ham Radio" +#~ msgstr "自製無線電" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "MIDI" +#~ msgstr "MIDI" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Mixer" +#~ msgstr "混音器" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Music" +#~ msgstr "音樂" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Recorders" +#~ msgstr "錄製器" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Sequencers" +#~ msgstr "序段編輯器" + +#~ msgctxt "Menu subcategory of Audio" +#~ msgid "Tuners" +#~ msgstr "調諧器" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Building" +#~ msgstr "建置" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Databases" +#~ msgstr "資料庫" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "IDE" +#~ msgstr "IDE" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Profiling" +#~ msgstr "效能評測" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Project Management" +#~ msgstr "專案管理" + +#~ msgctxt "Menu subcategory of Development Tools" +#~ msgid "Web Development" +#~ msgstr "網頁開發" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Biology" +#~ msgstr "生物" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Computer Science" +#~ msgstr "電腦科學" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Data Visualization" +#~ msgstr "資料示現" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Economy" +#~ msgstr "經濟" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electricity" +#~ msgstr "電學" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Electronics" +#~ msgstr "電子學" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Engineering" +#~ msgstr "工程" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geology" +#~ msgstr "地質" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Geoscience" +#~ msgstr "地球科學" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "History" +#~ msgstr "歷史" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Image Processing" +#~ msgstr "影像處理" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Literature" +#~ msgstr "文學" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Maps" +#~ msgstr "地圖" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Music" +#~ msgstr "音樂" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Numerical Analysis" +#~ msgstr "數值分析" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Parallel Computing" +#~ msgstr "平行計算" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Physics" +#~ msgstr "物理" + +#~ msgctxt "Menu subcategory of Education" +#~ msgid "Spirituality" +#~ msgstr "靈性" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Shooter" +#~ msgstr "射擊" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Simulation" +#~ msgstr "模擬" + +#~ msgctxt "Menu subcategory of Games" +#~ msgid "Sports" +#~ msgstr "運動" + +#~ msgid "Graphics" +#~ msgstr "美工繪圖" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "2D Graphics" +#~ msgstr "2D 圖形" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "OCR" +#~ msgstr "OCR" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Publishing" +#~ msgstr "出版" + +#~ msgctxt "Menu subcategory of Graphics" +#~ msgid "Raster Graphics" +#~ msgstr "光柵圖形" + +#~ msgid "Internet" +#~ msgstr "網際網路" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Dialup" +#~ msgstr "撥接" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Email" +#~ msgstr "電子郵件" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Feed" +#~ msgstr "消息來源" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "File Transfer" +#~ msgstr "檔案傳輸" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Ham Radio" +#~ msgstr "自製無線電" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Instant Messaging" +#~ msgstr "即時通訊" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "IRC Clients" +#~ msgstr "IRC 客戶端" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Monitor" +#~ msgstr "顯示器" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "P2P" +#~ msgstr "P2P" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Telephony" +#~ msgstr "電話學" + +#~ msgctxt "Menu subcategory of Internet" +#~ msgid "Web Development" +#~ msgstr "網頁開發" + +#~ msgid "Office" +#~ msgstr "辦公" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Chart" +#~ msgstr "圖表" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Contact Management" +#~ msgstr "聯絡人管理" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Dictionary" +#~ msgstr "字典" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Email" +#~ msgstr "電子郵件" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Flow Chart" +#~ msgstr "流程圖" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Photography" +#~ msgstr "攝影" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Project Management" +#~ msgstr "專案管理" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Publishing" +#~ msgstr "出版" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Spreadsheet" +#~ msgstr "試算表" + +#~ msgctxt "Menu subcategory of Office" +#~ msgid "Viewer" +#~ msgstr "檢視器" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Art" +#~ msgstr "藝術" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Artificial Intelligence" +#~ msgstr "人工智慧" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Astronomy" +#~ msgstr "天文" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Biology" +#~ msgstr "生物" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Chemistry" +#~ msgstr "化學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Computer Science" +#~ msgstr "電腦科學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Construction" +#~ msgstr "建築" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Data Visualization" +#~ msgstr "資料示現" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Economy" +#~ msgstr "經濟" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electricity" +#~ msgstr "電學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Electronics" +#~ msgstr "電子學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Engineering" +#~ msgstr "工程" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geography" +#~ msgstr "地理" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geology" +#~ msgstr "地質學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Geoscience" +#~ msgstr "地球科學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "History" +#~ msgstr "歷史" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Humanities" +#~ msgstr "人文" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Image Processing" +#~ msgstr "影像處理" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Languages" +#~ msgstr "語言" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Literature" +#~ msgstr "文學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Maps" +#~ msgstr "地圖" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Math" +#~ msgstr "數學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Medical" +#~ msgstr "醫學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Numerical Analysis" +#~ msgstr "數值分析" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Parallel Computing" +#~ msgstr "平行計算" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Physics" +#~ msgstr "物理" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Robotics" +#~ msgstr "機器人學" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Spirituality" +#~ msgstr "靈性" + +#~ msgctxt "Menu subcategory of Science" +#~ msgid "Sports" +#~ msgstr "運動" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Emulator" +#~ msgstr "模擬器" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Manager" +#~ msgstr "檔案管理器" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "File Tools" +#~ msgstr "檔案工具" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Monitor" +#~ msgstr "監控" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Security" +#~ msgstr "安全" + +#~ msgctxt "Menu subcategory of System" +#~ msgid "Terminal Emulator" +#~ msgstr "終端機模擬器" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Accessibility" +#~ msgstr "無障礙環境" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Archiving" +#~ msgstr "檔案封存" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Calculator" +#~ msgstr "計算機" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Clock" +#~ msgstr "時鐘" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Compression" +#~ msgstr "壓縮" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "File Tools" +#~ msgstr "檔案工具" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Maps" +#~ msgstr "地圖" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Spirituality" +#~ msgstr "靈性" + +#~ msgctxt "Menu subcategory of Utilities" +#~ msgid "Telephony Tools" +#~ msgstr "電話工具" + +#~ msgid "Video" +#~ msgstr "視訊" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Editing" +#~ msgstr "編輯" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Database" +#~ msgstr "資料庫" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Disc Burning" +#~ msgstr "碟片燒錄" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "Recorders" +#~ msgstr "錄製器" + +#~ msgctxt "Menu subcategory of Video" +#~ msgid "TV" +#~ msgstr "電視" + +#~ msgctxt "size" +#~ msgid "Calculating…" +#~ msgstr "計算中…" + +#~ msgctxt "size" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgid "_History" +#~ msgstr "歷史(_H)" + +#~ msgid "Size" +#~ msgstr "大小" + +#~ msgid "No AppStream data found" +#~ msgstr "找不到 AppStream 資料" + +#~ msgid "A previous update was unfinished." +#~ msgstr "上個更新尚未完成。" + +#~ msgid "" +#~ "The update couldn’t be installed; this is often a problem with the update " +#~ "itself. Please wait for another update and try again." +#~ msgstr "" +#~ "這個更新無法安裝;這通常是更新檔本身的問題。請等待下一次更新時再試一次。" + +#~ msgid "Internet Only Application" +#~ msgstr "唯網際網路應用程式" + +#~ msgid "An update was not signed in the correct way." +#~ msgstr "有項更新的簽署方式不正確。" + +#~ msgid "An offline update was requested but no packages required updating." +#~ msgstr "已請求離線更新,但沒有軟體包需要更新。" + +#~ msgid "No space was left on the drive." +#~ msgstr "裝置剩餘空間不足。" + +#~ msgid "An update failed to install correctly." +#~ msgstr "無法正確安裝更新。" + +#~ msgid "The offline update failed in an unexpected way." +#~ msgstr "離線更新以不如預期的方式失敗。" + +#~ msgid "No sources found." +#~ msgstr "找不到來源。" + +#~ msgid "Set the specified debugging level" +#~ msgstr "設定指定的除錯等級" + +#~ msgid "Picks" +#~ msgstr "精選" + +#~ msgid "January 30, 2014" +#~ msgstr "2014年1月30日" + +#~ msgid "_Pending" +#~ msgstr "擱置中(_P)" + +#~ msgid "Complicated!" +#~ msgstr "超複雜!" + +#~ msgctxt "Menu subcategory of Development" +#~ msgid "Databases" +#~ msgstr "資料庫" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Ham Radio" +#~ msgstr "自製無線電" + +#~ msgctxt "Menu subcategory of Network" +#~ msgid "Web Development" +#~ msgstr "網頁開發" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "File Tools" +#~ msgstr "檔案工具" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Maps" +#~ msgstr "地圖" + +#~ msgctxt "Menu subcategory of Utility" +#~ msgid "Spirituality" +#~ msgstr "心靈" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Fonts" +#~ msgstr "字型" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Codecs" +#~ msgstr "編解碼器" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Input Sources" +#~ msgstr "輸入來源" + +#~ msgctxt "Menu subcategory of Addons" +#~ msgid "Language Packs" +#~ msgstr "語言包" + +#~ msgid "Done" +#~ msgstr "完成" + +#~ msgid "" +#~ "Add or remove folders. Your application folders can be found in the " +#~ "Activities Overview." +#~ msgstr "新增或移除資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "" +#~ "Choose a folder for %s. Your application folders can be found in the " +#~ "Activities Overview." +#~ msgstr "為 %s 選個資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "" +#~ "Choose a folder for %s and %s. Your application folders can be found in " +#~ "the Activities Overview." +#~ msgstr "為 %s 與 %s 選個資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "" +#~ "Choose a folder for %s, %s and %s. Your application folders can be found " +#~ "in the Activities Overview." +#~ msgstr "" +#~ "為 %s、%s 與 %s 選個資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "" +#~ "Choose a folder for the selected applications. Your application folders " +#~ "can be found in the Activities Overview." +#~ msgstr "" +#~ "為選取的應用程式選個資料夾。您可以在「概覽」畫面中找到應用程式資料夾。" + +#~ msgid "Software has the following goals:" +#~ msgstr "軟體有下列目標:" + +#~ msgid "View installed applications" +#~ msgstr "檢視安裝的應用程式" + +#~ msgid "View available application updates" +#~ msgstr "檢視可用的應用程式更新" + +#~ msgid "Install available updates" +#~ msgstr "安裝可用的更新" + +#~ msgid "Find an application to handle a specific type of file" +#~ msgstr "尋找應用程式以處理特定類型的檔案" + +#~ msgid "Installed apps and updates should be available when offline" +#~ msgstr "已安裝的程式與更新應該可在離線時使用" + +#~ msgid "_Installed (%d)" +#~ msgstr "已安裝 (%d)(_I)" + +#~ msgid "_Updates (%d)" +#~ msgstr "更新 (%d)(_U)" diff --git a/src/gnome-software-local-file-flatpak.desktop.in b/src/gnome-software-local-file-flatpak.desktop.in new file mode 100644 index 0000000..803a581 --- /dev/null +++ b/src/gnome-software-local-file-flatpak.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=Software Install +Comment=Install selected software on the system +Categories=System; +Exec=gnome-software --local-filename %f +Terminal=false +Type=Application +Icon=system-software-install +StartupNotify=true +NoDisplay=true +MimeType=application/vnd.flatpak;application/vnd.flatpak.repo;application/vnd.flatpak.ref; diff --git a/src/gnome-software-local-file-fwupd.desktop.in b/src/gnome-software-local-file-fwupd.desktop.in new file mode 100644 index 0000000..01a1d86 --- /dev/null +++ b/src/gnome-software-local-file-fwupd.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=Software Install +Comment=Install selected software on the system +Categories=System; +Exec=gnome-software --local-filename %f +Terminal=false +Type=Application +Icon=system-software-install +StartupNotify=true +NoDisplay=true +MimeType=application/vnd.ms-cab-compressed; diff --git a/src/gnome-software-local-file-packagekit.desktop.in b/src/gnome-software-local-file-packagekit.desktop.in new file mode 100644 index 0000000..39a86b6 --- /dev/null +++ b/src/gnome-software-local-file-packagekit.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=Software Install +Comment=Install selected software on the system +Categories=System; +Exec=gnome-software --local-filename %f +Terminal=false +Type=Application +Icon=system-software-install +StartupNotify=true +NoDisplay=true +MimeType=application/x-rpm;application/x-redhat-package-manager;application/x-deb;application/vnd.debian.binary-package;application/x-app-package; diff --git a/src/gnome-software-local-file-snap.desktop.in b/src/gnome-software-local-file-snap.desktop.in new file mode 100644 index 0000000..d2ab5f6 --- /dev/null +++ b/src/gnome-software-local-file-snap.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=Software Install +Comment=Install selected software on the system +Categories=System; +Exec=gnome-software --local-filename %f +Terminal=false +Type=Application +Icon=system-software-install +StartupNotify=true +NoDisplay=true +MimeType=application/vnd.snap; diff --git a/src/gnome-software.gresource.xml b/src/gnome-software.gresource.xml new file mode 100644 index 0000000..f750d57 --- /dev/null +++ b/src/gnome-software.gresource.xml @@ -0,0 +1,143 @@ + + + + gs-age-rating-context-dialog.ui + gs-app-addon-row.ui + gs-app-context-bar.ui + gs-app-details-page.ui + gs-app-reviews-dialog.ui + gs-app-version-history-dialog.ui + gs-app-version-history-row.ui + gs-app-row.ui + gs-app-translation-dialog.ui + gs-basic-auth-dialog.ui + gs-category-page.ui + gs-category-tile.ui + gs-context-dialog-row.ui + gs-details-page.ui + gs-dkms-dialog.ui + gs-extras-page.ui + gs-feature-tile.ui + gs-featured-carousel.ui + gs-hardware-support-context-dialog.ui + gs-info-window.ui + gs-installed-page.ui + gs-license-tile.ui + gs-loading-page.ui + gs-lozenge.ui + gs-overview-page.ui + gs-origin-popover-row.ui + gs-os-update-page.ui + gs-prefs-dialog.ui + gs-progress-button.ui + gs-removal-dialog.ui + gs-remove-app-dialog.ui + gs-repo-row.ui + gs-repos-dialog.ui + gs-review-dialog.ui + gs-review-histogram.ui + gs-review-row.ui + gs-safety-context-dialog.ui + gs-screenshot-carousel.ui + gs-screenshot-image.ui + gs-search-page.ui + gs-shell.ui + gs-star-widget.ui + gs-storage-context-dialog.ui + gs-summary-tile.ui + gs-update-dialog.ui + gs-updates-page.ui + gs-updates-section.ui + gs-upgrade-banner.ui + gs-utils-error-dialog-simple.ui + gs-help-overlay.ui + org.freedesktop.PackageKit.xml + style.css + style-dark.css + style-hc.css + ../data/assets/up-to-date.svg + + ../data/icons/org.gnome.Software.Generic.svg + ../data/icons/org.gnome.Software.Create.svg + ../data/icons/org.gnome.Software.Develop.svg + ../data/icons/org.gnome.Software.Generic.svg + ../data/icons/org.gnome.Software.Learn.svg + ../data/icons/org.gnome.Software.Play.svg + ../data/icons/org.gnome.Software.Socialize.svg + ../data/icons/org.gnome.Software.Work.svg + + ../data/icons/symbolic/app-remove-symbolic.svg + ../data/icons/symbolic/contact-symbolic.svg + ../data/icons/symbolic/document-edit-symbolic.svg + ../data/icons/symbolic/donate-symbolic.svg + ../data/icons/symbolic/external-link-symbolic.svg + ../data/icons/symbolic/help-link-symbolic.svg + ../data/icons/symbolic/info-symbolic.svg + ../data/icons/symbolic/review-symbolic.svg + ../data/icons/symbolic/review-rate-negative-symbolic.svg + ../data/icons/symbolic/review-rate-positive-symbolic.svg + ../data/icons/symbolic/review-report-symbolic.svg + ../data/icons/symbolic/software-explore-symbolic.svg + ../data/icons/symbolic/software-installed-symbolic.svg + ../data/icons/symbolic/software-updates-symbolic.svg + ../data/icons/symbolic/translations-symbolic.svg + ../data/icons/symbolic/webpage-symbolic.svg + ../data/icons/symbolic/ratings/advertising-none-symbolic.svg + ../data/icons/symbolic/ratings/advertising-symbolic.svg + ../data/icons/symbolic/ratings/alcohol-use-none-symbolic.svg + ../data/icons/symbolic/ratings/alcohol-use-symbolic.svg + ../data/icons/symbolic/ratings/audio-chat-none-symbolic.svg + ../data/icons/symbolic/ratings/audio-chat-symbolic.svg + ../data/icons/symbolic/ratings/drug-use-none-symbolic.svg + ../data/icons/symbolic/ratings/nudity-symbolic.svg + ../data/icons/symbolic/ratings/gambling-none-symbolic.svg + ../data/icons/symbolic/ratings/gambling-symbolic.svg + ../data/icons/symbolic/ratings/gay-content-none-symbolic.svg + ../data/icons/symbolic/ratings/gay-content-symbolic.svg + ../data/icons/symbolic/ratings/human-remains-symbolic.svg + ../data/icons/symbolic/ratings/messaging-none-symbolic.svg + ../data/icons/symbolic/ratings/messaging-symbolic.svg + ../data/icons/symbolic/ratings/money-none-symbolic.svg + ../data/icons/symbolic/ratings/money-symbolic.svg + ../data/icons/symbolic/ratings/nudity-none-symbolic.svg + ../data/icons/symbolic/ratings/nudity-symbolic.svg + ../data/icons/symbolic/ratings/smoking-none-symbolic.svg + ../data/icons/symbolic/ratings/smoking-symbolic.svg + ../data/icons/symbolic/ratings/strong-language-none-symbolic.svg + ../data/icons/symbolic/ratings/strong-language-symbolic.svg + ../data/icons/symbolic/ratings/violence-none-symbolic.svg + ../data/icons/symbolic/ratings/violence-symbolic.svg + ../data/icons/symbolic/package-flatpak-symbolic.svg + ../data/icons/symbolic/package-generic-symbolic.svg + ../data/icons/symbolic/package-snap-symbolic.svg + ../data/icons/symbolic/app-beta-software-symbolic.svg + ../data/icons/symbolic/app-info-loading-symbolic.svg + ../data/icons/symbolic/app-installed-symbolic.svg + ../data/icons/symbolic/app-safety-ok-symbolic.svg + ../data/icons/symbolic/app-safety-unknown-symbolic.svg + ../data/icons/symbolic/app-safety-unknown-symbolic.svg + ../data/icons/symbolic/app-verified-symbolic.svg + ../data/icons/symbolic/auditable-code-symbolic.svg + ../data/icons/symbolic/community-approved-symbolic.svg + ../data/icons/symbolic/community-blocked-symbolic.svg + ../data/icons/symbolic/community-none-symbolic.svg + ../data/icons/symbolic/community-supported-symbolic.svg + ../data/icons/symbolic/community-symbolic.svg + ../data/icons/symbolic/device-support-adaptive-symbolic.svg + ../data/icons/symbolic/device-support-desktop-symbolic.svg + ../data/icons/symbolic/device-support-mobile-symbolic.svg + ../data/icons/symbolic/device-support-touch-symbolic.svg + ../data/icons/symbolic/device-support-unknown-symbolic.svg + ../data/icons/symbolic/device-supported-symbolic.svg + ../data/icons/symbolic/permissions-legacy-windowing-system-symbolic.svg + ../data/icons/symbolic/permissions-microphone-symbolic.svg + ../data/icons/symbolic/permissions-sandboxed-symbolic.svg + ../data/icons/symbolic/permissions-screen-contents-symbolic.svg + ../data/icons/symbolic/permissions-system-devices-symbolic.svg + ../data/icons/symbolic/permissions-warning-symbolic.svg + ../data/icons/symbolic/proprietary-code-symbolic.svg + ../data/icons/symbolic/software-license-symbolic.svg + ../data/icons/symbolic/starred-symbolic.svg + ../data/icons/symbolic/warning-outline-symbolic.svg + + diff --git a/src/gnome-software.xml b/src/gnome-software.xml new file mode 100644 index 0000000..fba2f8b --- /dev/null +++ b/src/gnome-software.xml @@ -0,0 +1,131 @@ + + + + + + + gnome-software + GNOME + + Maintainer + Richard + Hughes + richard@hughsie.com + + + 2013 + Richard Hughes + + + + + gnome-software + 1 + User Commands + + + + gnome-software + Install and update apps + + + + + gnome-software + OPTION + + + + + Description + + gnome-software allows you to add and remove + apps and update your system. + + + + + Options + + + =MODE + Start gnome-software in the given mode. MODE can be updates, updated, installed or overview. The default mode is overview. + + + =SEARCH + Search for apps. + + + =ID + Show app details (using app ID). + + + =PKGNAME + Show app details (using package name). + + + =ID + Install the app (using app ID). + + + =ID + Uninstall the app (using app ID). + + + =FILENAME + Open a local package file. + + + =INTERACTION + The kind of interaction expected for this action: either none, notify, or full. + + + =FILENAME + Show a local metainfo or appdata file. + + + + Enable verbose debugging output (from the running instance, if already running). + + + + Install any pending updates in the background. + + + + Show preferences. + + + + Quit the running instance. + + + + Prefer local file sources to AppStream. + + + + Print version and exit. + + + , + Display help and exit. + + + Other standard GNOME options not listed here are also supported. + + + + Bugs + The bug tracker can be reached by visiting the website + . + + + + + Author + This manual page was written by Richard Hughes richard@hughsie.com. + + + diff --git a/src/gs-age-rating-context-dialog.c b/src/gs-age-rating-context-dialog.c new file mode 100644 index 0000000..2a90ae6 --- /dev/null +++ b/src/gs-age-rating-context-dialog.c @@ -0,0 +1,1264 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-age-rating-context-dialog + * @short_description: A dialog showing age rating information about an app + * + * #GsAgeRatingContextDialog is a dialog which shows detailed information + * about the suitability of the content in an app for different ages. It gives + * a breakdown of which content is more or less suitable for younger audiences. + * This information is derived from the `` element in the app’s + * appdata. + * + * It is designed to show a more detailed view of the information which the + * app’s age rating tile in #GsAppContextBar is derived from. + * + * The widget has no special appearance if the app is unset, so callers will + * typically want to hide the dialog in that case. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-app.h" +#include "gs-common.h" +#include "gs-context-dialog-row.h" +#include "gs-age-rating-context-dialog.h" + +typedef enum { + GS_AGE_RATING_GROUP_TYPE_DRUGS, + GS_AGE_RATING_GROUP_TYPE_LANGUAGE, + GS_AGE_RATING_GROUP_TYPE_MONEY, + GS_AGE_RATING_GROUP_TYPE_SEX, + GS_AGE_RATING_GROUP_TYPE_SOCIAL, + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, +} GsAgeRatingGroupType; + +#define GS_AGE_RATING_GROUP_TYPE_COUNT (GS_AGE_RATING_GROUP_TYPE_VIOLENCE+1) + +typedef struct { + gchar *id; + gchar *icon_name; + GsContextDialogRowImportance importance; + gchar *title; + gchar *description; +} GsAgeRatingAttribute; + +struct _GsAgeRatingContextDialog +{ + GsInfoWindow parent_instance; + + GsApp *app; /* (nullable) (owned) */ + gulong app_notify_handler_content_rating; + gulong app_notify_handler_name; + GsContextDialogRow *rows[GS_AGE_RATING_GROUP_TYPE_COUNT]; /* (unowned) */ + GList *attributes[GS_AGE_RATING_GROUP_TYPE_COUNT]; /* (element-type GsAgeRatingAttribute) */ + + GsLozenge *lozenge; + GtkLabel *title; + GtkListBox *attributes_list; /* (element-type GsContextDialogRow) */ +}; + +G_DEFINE_TYPE (GsAgeRatingContextDialog, gs_age_rating_context_dialog, GS_TYPE_INFO_WINDOW) + +typedef enum { + PROP_APP = 1, +} GsAgeRatingContextDialogProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +static GsAgeRatingAttribute * +gs_age_rating_attribute_new (const gchar *id, + const gchar *icon_name, + GsContextDialogRowImportance importance, + const gchar *title, + const gchar *description) +{ + GsAgeRatingAttribute *attributes; + + g_assert (icon_name != NULL); + g_assert (title != NULL); + g_assert (description != NULL); + + attributes = g_new0 (GsAgeRatingAttribute, 1); + attributes->id = g_strdup (id); + attributes->icon_name = g_strdup (icon_name); + attributes->importance = importance; + attributes->title = g_strdup (title); + attributes->description = g_strdup (description); + + return attributes; +} + +static void +gs_age_rating_attribute_free (GsAgeRatingAttribute *attributes) +{ + g_free (attributes->id); + g_free (attributes->icon_name); + g_free (attributes->title); + g_free (attributes->description); + g_free (attributes); +} + +/* FIXME: Ideally this data would move into libappstream, to be next to the + * other per-attribute strings and data which it already stores. */ +static const struct { + const gchar *id; /* (not nullable) */ + GsAgeRatingGroupType group_type; + const gchar *title; /* (not nullable) */ + const gchar *unknown_description; /* (not nullable) */ + const gchar *icon_name; /* (not nullable) */ + const gchar *icon_name_negative; /* (nullable) */ +} attribute_details[] = { + /* v1.0 */ + { + "violence-cartoon", + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Cartoon Violence"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding cartoon violence"), + "violence-symbolic", + "violence-none-symbolic", + }, + { + "violence-fantasy", + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Fantasy Violence"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding fantasy violence"), + "violence-symbolic", + "violence-none-symbolic", + }, + { + "violence-realistic", + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Realistic Violence"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding realistic violence"), + "violence-symbolic", + "violence-none-symbolic", + }, + { + "violence-bloodshed", + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Violence Depicting Bloodshed"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding bloodshed"), + "violence-symbolic", + "violence-none-symbolic", + }, + { + "violence-sexual", + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Sexual Violence"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding sexual violence"), + "violence-symbolic", + "violence-none-symbolic", + }, + { + "drugs-alcohol", + GS_AGE_RATING_GROUP_TYPE_DRUGS, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Alcohol"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to alcohol"), + "alcohol-use-symbolic", + "alcohol-use-none-symbolic", + }, + { + "drugs-narcotics", + GS_AGE_RATING_GROUP_TYPE_DRUGS, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Narcotics"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to illicit drugs"), + "drug-use-symbolic", + "drug-use-none-symbolic", + }, + { + "drugs-tobacco", + GS_AGE_RATING_GROUP_TYPE_DRUGS, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Tobacco"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to tobacco products"), + "smoking-symbolic", + "smoking-none-symbolic", + }, + { + "sex-nudity", + GS_AGE_RATING_GROUP_TYPE_SEX, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Nudity"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding nudity of any sort"), + "nudity-symbolic", + "nudity-none-symbolic", + }, + { + "sex-themes", + GS_AGE_RATING_GROUP_TYPE_SEX, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Sexual Themes"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to or depictions of sexual nature"), + "nudity-symbolic", + "nudity-none-symbolic", + }, + { + "language-profanity", + GS_AGE_RATING_GROUP_TYPE_LANGUAGE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Profanity"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding profanity of any kind"), + "strong-language-symbolic", + "strong-language-none-symbolic", + }, + { + "language-humor", + GS_AGE_RATING_GROUP_TYPE_LANGUAGE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Inappropriate Humor"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding inappropriate humor"), + "strong-language-symbolic", + "strong-language-none-symbolic", + }, + { + "language-discrimination", + GS_AGE_RATING_GROUP_TYPE_SOCIAL, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Discrimination"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding discriminatory language of any kind"), + "strong-language-symbolic", + "strong-language-none-symbolic", + }, + { + "money-advertising", + GS_AGE_RATING_GROUP_TYPE_MONEY, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Advertising"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding advertising of any kind"), + "advertising-symbolic", + "advertising-none-symbolic", + }, + { + "money-gambling", + GS_AGE_RATING_GROUP_TYPE_MONEY, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Gambling"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding gambling of any kind"), + "gambling-symbolic", + "gambling-none-symbolic", + }, + { + "money-purchasing", + GS_AGE_RATING_GROUP_TYPE_MONEY, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Purchasing"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding the ability to spend money"), + "money-symbolic", + "money-none-symbolic", + }, + { + "social-chat", + GS_AGE_RATING_GROUP_TYPE_SOCIAL, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Chat Between Users"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding ways to chat with other users"), + "messaging-symbolic", + "messaging-none-symbolic", + }, + { + "social-audio", + GS_AGE_RATING_GROUP_TYPE_SOCIAL, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Audio Chat Between Users"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding ways to talk with other users"), + "audio-chat-symbolic", + "audio-chat-none-symbolic", + }, + { + "social-contacts", + GS_AGE_RATING_GROUP_TYPE_SOCIAL, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Contact Details"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding sharing of social network usernames or email addresses"), + "contacts-symbolic", + NULL, + }, + { + "social-info", + GS_AGE_RATING_GROUP_TYPE_SOCIAL, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Identifying Information"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding sharing of user information with third parties"), + "social-info-symbolic", + NULL, + }, + { + "social-location", + GS_AGE_RATING_GROUP_TYPE_SOCIAL, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Location Sharing"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding sharing of physical location with other users"), + "location-services-active-symbolic", + "location-services-disabled-symbolic", + }, + + /* v1.1 */ + { + /* Why is there an OARS category which discriminates based on sexual orientation? + * It’s because there are, very unfortunately, still countries in the world in + * which homosexuality, or software which refers to it, is illegal. In order to be + * able to ship FOSS in those countries, there needs to be a mechanism for apps to + * describe whether they refer to anything illegal, and for ratings mechanisms in + * those countries to filter out any apps which describe themselves as such. + * + * As a counterpoint, it’s illegal in many more countries to discriminate on the + * basis of sexual orientation, so this category is treated exactly the same as + * sex-themes (once the intensities of the ratings levels for both categories are + * normalised) in those countries. + * + * The differences between countries are handled through handling #AsContentRatingSystem + * values differently. */ + "sex-homosexuality", + GS_AGE_RATING_GROUP_TYPE_SEX, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Homosexuality"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to homosexuality"), + "gay-content-symbolic", + "gay-content-none-symbolic", + }, + { + "sex-prostitution", + GS_AGE_RATING_GROUP_TYPE_SEX, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Prostitution"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to prostitution"), + "nudity-symbolic", + "nudity-none-symbolic", + }, + { + "sex-adultery", + GS_AGE_RATING_GROUP_TYPE_SEX, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Adultery"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to adultery"), + "nudity-symbolic", + "nudity-none-symbolic", + }, + { + "sex-appearance", + GS_AGE_RATING_GROUP_TYPE_SEX, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Sexualized Characters"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding sexualized characters"), + "nudity-symbolic", + "nudity-none-symbolic", + }, + { + "violence-worship", + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Desecration"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to desecration"), + "violence-symbolic", + "violence-none-symbolic", + }, + { + "violence-desecration", + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Human Remains"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding visible dead human remains"), + "human-remains-symbolic", + NULL, + }, + { + "violence-slavery", + GS_AGE_RATING_GROUP_TYPE_VIOLENCE, + /* TRANSLATORS: content rating title, see https://hughsie.github.io/oars/ */ + N_("Slavery"), + /* TRANSLATORS: content rating description, see https://hughsie.github.io/oars/ */ + N_("No information regarding references to slavery"), + "violence-symbolic", + "violence-none-symbolic", + }, +}; + +/* Get the `icon_name` (or, if @negative_version is %TRUE, the + * `icon_name_negative`) from @attribute_details for the given @attribute. + * If `icon_name_negative` is %NULL, fall back to returning `icon_name`. */ +static const gchar * +content_rating_attribute_get_icon_name (const gchar *attribute, + gboolean negative_version) +{ + for (gsize i = 0; i < G_N_ELEMENTS (attribute_details); i++) { + if (g_str_equal (attribute, attribute_details[i].id)) { + if (negative_version && attribute_details[i].icon_name_negative != NULL) + return attribute_details[i].icon_name_negative; + return attribute_details[i].icon_name; + } + } + + /* Attribute not handled */ + g_assert_not_reached (); +} + +/* Get the `title` from @attribute_details for the given @attribute. */ +static const gchar * +content_rating_attribute_get_title (const gchar *attribute) +{ + for (gsize i = 0; i < G_N_ELEMENTS (attribute_details); i++) { + if (g_str_equal (attribute, attribute_details[i].id)) { + return _(attribute_details[i].title); + } + } + + /* Attribute not handled */ + g_assert_not_reached (); +} + +/* Get the `unknown_description` from @attribute_details for the given @attribute. */ +static const gchar * +content_rating_attribute_get_unknown_description (const gchar *attribute) +{ + for (gsize i = 0; i < G_N_ELEMENTS (attribute_details); i++) { + if (g_str_equal (attribute, attribute_details[i].id)) { + return _(attribute_details[i].unknown_description); + } + } + + /* Attribute not handled */ + g_assert_not_reached (); +} + +/* Get the `title` from @attribute_details for the given @attribute. */ +static GsAgeRatingGroupType +content_rating_attribute_get_group_type (const gchar *attribute) +{ + for (gsize i = 0; i < G_N_ELEMENTS (attribute_details); i++) { + if (g_str_equal (attribute, attribute_details[i].id)) { + return attribute_details[i].group_type; + } + } + + /* Attribute not handled */ + g_assert_not_reached (); +} + +static const gchar * +content_rating_group_get_description (GsAgeRatingGroupType group_type) +{ + switch (group_type) { + case GS_AGE_RATING_GROUP_TYPE_DRUGS: + return _("Does not include references to drugs"); + case GS_AGE_RATING_GROUP_TYPE_LANGUAGE: + return _("Does not include swearing, profanity, and other kinds of strong language"); + case GS_AGE_RATING_GROUP_TYPE_MONEY: + return _("Does not include ads or monetary transactions"); + case GS_AGE_RATING_GROUP_TYPE_SEX: + return _("Does not include sex or nudity"); + case GS_AGE_RATING_GROUP_TYPE_SOCIAL: + return _("Does not include uncontrolled chat functionality"); + case GS_AGE_RATING_GROUP_TYPE_VIOLENCE: + return _("Does not include violence"); + default: + g_assert_not_reached (); + } +} + +static const gchar * +content_rating_group_get_icon_name (GsAgeRatingGroupType group_type, + gboolean negative_version) +{ + switch (group_type) { + case GS_AGE_RATING_GROUP_TYPE_DRUGS: + return negative_version ? "smoking-none-symbolic" : "smoking-symbolic"; + case GS_AGE_RATING_GROUP_TYPE_LANGUAGE: + return negative_version ? "strong-language-none-symbolic" : "strong-language-symbolic"; + case GS_AGE_RATING_GROUP_TYPE_MONEY: + return negative_version ? "money-none-symbolic" : "money-symbolic"; + case GS_AGE_RATING_GROUP_TYPE_SEX: + return negative_version ? "nudity-none-symbolic" : "nudity-symbolic"; + case GS_AGE_RATING_GROUP_TYPE_SOCIAL: + return negative_version ? "messaging-none-symbolic" : "messaging-symbolic"; + case GS_AGE_RATING_GROUP_TYPE_VIOLENCE: + return negative_version ? "violence-none-symbolic" : "violence-symbolic"; + default: + g_assert_not_reached (); + } +} + +static const gchar * +content_rating_group_get_title (GsAgeRatingGroupType group_type) +{ + switch (group_type) { + case GS_AGE_RATING_GROUP_TYPE_DRUGS: + return _("Drugs"); + case GS_AGE_RATING_GROUP_TYPE_LANGUAGE: + return _("Strong Language"); + case GS_AGE_RATING_GROUP_TYPE_MONEY: + return _("Money"); + case GS_AGE_RATING_GROUP_TYPE_SEX: + return _("Nudity"); + case GS_AGE_RATING_GROUP_TYPE_SOCIAL: + return _("Social"); + case GS_AGE_RATING_GROUP_TYPE_VIOLENCE: + return _("Violence"); + default: + g_assert_not_reached (); + } +} + +static GsContextDialogRowImportance +content_rating_value_get_importance (AsContentRatingValue value) +{ + switch (value) { + case AS_CONTENT_RATING_VALUE_NONE: + return GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT; + case AS_CONTENT_RATING_VALUE_UNKNOWN: + return GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL; + case AS_CONTENT_RATING_VALUE_MILD: + return GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION; + case AS_CONTENT_RATING_VALUE_MODERATE: + return GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING; + case AS_CONTENT_RATING_VALUE_INTENSE: + return GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT; + default: + g_assert_not_reached (); + } +} + +static gint +attributes_compare (GsAgeRatingAttribute *attributes1, + GsAgeRatingAttribute *attributes2) +{ + if (attributes1->importance != attributes2->importance) { + /* Sort neutral attributes before unimportant ones. */ + if (attributes1->importance == GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL && + attributes2->importance == GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT) + return -1; + if (attributes1->importance == GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT && + attributes2->importance == GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL) + return 1; + + /* Important attributes come first */ + return attributes2->importance - attributes1->importance; + } else { + /* Sort by alphabetical ID order */ + return g_strcmp0 (attributes1->id, attributes2->id); + } +} + +static void +update_attribute_row (GsAgeRatingContextDialog *self, + GsAgeRatingGroupType group_type) +{ + const GsAgeRatingAttribute *first; + const gchar *group_icon_name; + const gchar *group_title; + const gchar *group_description; + g_autofree char *new_description = NULL; + + first = (GsAgeRatingAttribute *) self->attributes[group_type]->data; + + if (g_list_length (self->attributes[group_type]) == 1) { + g_object_set (self->rows[group_type], + "icon-name", first->icon_name, + "importance", first->importance, + "subtitle", first->description, + "title", first->title, + NULL); + + return; + } + + if (first->importance == GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT) { + gboolean only_unimportant = TRUE; + + for (GList *l = self->attributes[group_type]->next; l; l = l->next) { + GsAgeRatingAttribute *attribute = (GsAgeRatingAttribute *) l->data; + + if (attribute->importance != GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT) { + only_unimportant = FALSE; + break; + } + } + + if (only_unimportant) { + group_icon_name = content_rating_group_get_icon_name (group_type, first->importance == GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT); + group_title = content_rating_group_get_title (group_type); + group_description = content_rating_group_get_description (group_type); + + g_object_set (self->rows[group_type], + "icon-name", group_icon_name, + "importance", first->importance, + "subtitle", group_description, + "title", group_title, + NULL); + + return; + } + + } + + group_icon_name = content_rating_group_get_icon_name (group_type, FALSE); + group_title = content_rating_group_get_title (group_type); + new_description = g_strdup (first->description); + + for (GList *l = self->attributes[group_type]->next; l; l = l->next) { + GsAgeRatingAttribute *attribute = (GsAgeRatingAttribute *) l->data; + char *s; + + if (attribute->importance == GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT) + break; + + /* Translators: This is used to join two list items together in + * a compressed way of displaying a list of descriptions of age + * ratings for apps. The order of the items does not matter. */ + s = g_strdup_printf (_("%s • %s"), + new_description, + ((GsAgeRatingAttribute *) l->data)->description); + g_free (new_description); + new_description = s; + } + + g_object_set (self->rows[group_type], + "icon-name", group_icon_name, + "importance", first->importance, + "subtitle", new_description, + "title", group_title, + NULL); +} + +static void +add_attribute_row (GsAgeRatingContextDialog *self, + const gchar *attribute, + AsContentRatingValue value) +{ + GsAgeRatingGroupType group_type; + GsContextDialogRowImportance rating; + const gchar *icon_name, *title, *description; + GsAgeRatingAttribute *attributes; + + group_type = content_rating_attribute_get_group_type (attribute); + rating = content_rating_value_get_importance (value); + icon_name = content_rating_attribute_get_icon_name (attribute, value == AS_CONTENT_RATING_VALUE_NONE); + title = content_rating_attribute_get_title (attribute); + if (value == AS_CONTENT_RATING_VALUE_UNKNOWN) + description = content_rating_attribute_get_unknown_description (attribute); + else + description = as_content_rating_attribute_get_description (attribute, value); + + attributes = gs_age_rating_attribute_new (attribute, icon_name, rating, title, description); + + if (self->attributes[group_type] != NULL) { + self->attributes[group_type] = g_list_insert_sorted (self->attributes[group_type], + attributes, + (GCompareFunc) attributes_compare); + + update_attribute_row (self, group_type); + } else { + self->attributes[group_type] = g_list_prepend (self->attributes[group_type], attributes); + self->rows[group_type] = GS_CONTEXT_DIALOG_ROW (gs_context_dialog_row_new (icon_name, rating, title, description)); + gtk_list_box_append (self->attributes_list, GTK_WIDGET (self->rows[group_type])); + } +} + +/** + * gs_age_rating_context_dialog_process_attributes: + * @content_rating: content rating data from an app, retrieved using + * gs_app_dup_content_rating() + * @show_worst_only: %TRUE to only process the worst content rating attributes, + * %FALSE to process all of them + * @callback: callback to call for each attribute being processed + * @user_data: data to pass to @callback + * + * Loop through all the defined content rating attributes, and decide which ones + * are relevant to show to the user. For each of the relevant attributes, call + * @callback with the attribute name and value. + * + * If @show_worst_only is %TRUE, only the attributes which cause the overall + * rating of the app to be as high as it is are considered relevant. If it is + * %FALSE, all attributes are relevant. + * + * If the app has an overall age rating of 0, @callback is called exactly once, + * with the attribute name set to %NULL, to indicate that the app is suitable + * for all in every attribute. + * + * Since: 41 + */ +void +gs_age_rating_context_dialog_process_attributes (AsContentRating *content_rating, + gboolean show_worst_only, + GsAgeRatingContextDialogAttributeFunc callback, + gpointer user_data) +{ + g_autofree const gchar **rating_ids = as_content_rating_get_all_rating_ids (); + AsContentRatingValue value_bad = AS_CONTENT_RATING_VALUE_NONE; + guint age_bad = 0; + + /* Ordered from worst to best, these are all OARS 1.0/1.1 categories */ + const gchar * const violence_group[] = { + "violence-bloodshed", + "violence-realistic", + "violence-fantasy", + "violence-cartoon", + NULL + }; + const gchar * const social_group[] = { + "social-audio", + "social-chat", + "social-contacts", + "social-info", + NULL + }; + const gchar * const coalesce_groups[] = { + "sex-themes", + "sex-homosexuality", + NULL + }; + + /* Get the worst category. */ + for (gsize i = 0; rating_ids[i] != NULL; i++) { + guint rating_age; + AsContentRatingValue rating_value; + + rating_value = as_content_rating_get_value (content_rating, rating_ids[i]); + rating_age = as_content_rating_attribute_to_csm_age (rating_ids[i], rating_value); + + if (rating_age > age_bad) + age_bad = rating_age; + if (rating_value > value_bad) + value_bad = rating_value; + } + + /* If the worst category is nothing, great! Show a more specific message + * than a big listing of all the groups. */ + if (show_worst_only && (value_bad == AS_CONTENT_RATING_VALUE_NONE || age_bad == 0)) { + callback (NULL, AS_CONTENT_RATING_VALUE_UNKNOWN, user_data); + return; + } + + /* Add a description for each rating category which contributes to the + * @age_bad being as it is. Handle the groups separately. + * Intentionally coalesce some categories if they have the same values, + * to avoid confusion */ + for (gsize i = 0; rating_ids[i] != NULL; i++) { + guint rating_age; + AsContentRatingValue rating_value; + + if (g_strv_contains (violence_group, rating_ids[i]) || + g_strv_contains (social_group, rating_ids[i])) + continue; + + rating_value = as_content_rating_get_value (content_rating, rating_ids[i]); + rating_age = as_content_rating_attribute_to_csm_age (rating_ids[i], rating_value); + + if (show_worst_only && rating_age < age_bad) + continue; + + /* Coalesce down to the first element in @coalesce_groups, + * unless this group’s value differs. Currently only one + * coalesce group is supported. */ + if (g_strv_contains (coalesce_groups + 1, rating_ids[i]) && + as_content_rating_attribute_to_csm_age (coalesce_groups[0], + as_content_rating_get_value (content_rating, + coalesce_groups[0])) >= rating_age) + continue; + + callback (rating_ids[i], rating_value, user_data); + } + + for (gsize i = 0; violence_group[i] != NULL; i++) { + guint rating_age; + AsContentRatingValue rating_value; + + rating_value = as_content_rating_get_value (content_rating, violence_group[i]); + rating_age = as_content_rating_attribute_to_csm_age (violence_group[i], rating_value); + + if (show_worst_only && rating_age < age_bad) + continue; + + callback (violence_group[i], rating_value, user_data); + } + + for (gsize i = 0; social_group[i] != NULL; i++) { + guint rating_age; + AsContentRatingValue rating_value; + + rating_value = as_content_rating_get_value (content_rating, social_group[i]); + rating_age = as_content_rating_attribute_to_csm_age (social_group[i], rating_value); + + if (show_worst_only && rating_age < age_bad) + continue; + + callback (social_group[i], rating_value, user_data); + } +} + +static void +add_attribute_rows_cb (const gchar *attribute, + AsContentRatingValue value, + gpointer user_data) +{ + GsAgeRatingContextDialog *self = GS_AGE_RATING_CONTEXT_DIALOG (user_data); + + add_attribute_row (self, attribute, value); +} + +/* Wrapper around as_content_rating_system_format_age() which returns the short + * form of the content rating. This doesn’t make a difference for most ratings + * systems, but it does for ESRB which normally produces quite long strings. + * + * FIXME: This should probably be upstreamed into libappstream once it’s been in + * the GNOME 41 release and stabilised. */ +gchar * +gs_age_rating_context_dialog_format_age_short (AsContentRatingSystem system, + guint age) +{ + if (system == AS_CONTENT_RATING_SYSTEM_ESRB) { + if (age >= 18) + return g_strdup ("AO"); + if (age >= 17) + return g_strdup ("M"); + if (age >= 13) + return g_strdup ("T"); + if (age >= 10) + return g_strdup ("E10+"); + if (age >= 6) + return g_strdup ("E"); + + return g_strdup ("EC"); + } + + return as_content_rating_system_format_age (system, age); +} + +/** + * gs_age_rating_context_dialog_update_lozenge: + * @app: the #GsApp to rate + * @lozenge: a #GsLozenge widget + * @is_unknown_out: (out caller-allocates) (not optional): return location for + * a boolean indicating whether the age rating is unknown, rather than a + * specific age + * + * Update the @lozenge widget to indicate the overall age rating for @app. + * This involves changing its CSS class and label content. + * + * If the overall age rating for @app is unknown (because the app doesn’t + * provide a complete `` element in its appdata), the lozenge is + * set to show a question mark, and @is_unknown_out is set to %TRUE. + * + * Since: 41 + */ +void +gs_age_rating_context_dialog_update_lozenge (GsApp *app, + GsLozenge *lozenge, + gboolean *is_unknown_out) +{ + const gchar *css_class; + const gchar *locale; + AsContentRatingSystem system; + g_autoptr(AsContentRating) content_rating = NULL; + const gchar *css_age_classes[] = { + "details-rating-18", + "details-rating-15", + "details-rating-12", + "details-rating-5", + "details-rating-0", + }; + guint age = G_MAXUINT; + g_autofree gchar *age_text = NULL; + + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (GS_IS_LOZENGE (lozenge)); + g_return_if_fail (is_unknown_out != NULL); + + /* get the content rating system from the locale */ + locale = setlocale (LC_MESSAGES, NULL); + system = as_content_rating_system_from_locale (locale); + g_debug ("content rating system is guessed as %s from %s", + as_content_rating_system_to_string (system), + locale); + + content_rating = gs_app_dup_content_rating (app); + if (content_rating != NULL) + age = as_content_rating_get_minimum_age (content_rating); + + if (age != G_MAXUINT) + age_text = gs_age_rating_context_dialog_format_age_short (system, age); + + /* Some ratings systems (PEGI) don’t start at age 0 */ + if (content_rating != NULL && age_text == NULL && age == 0) + /* Translators: The app is considered suitable to be run by all ages of people. + * This is displayed in a context tile, so the string should be short. */ + age_text = g_strdup (C_("Age rating", "All")); + + /* We currently only support OARS-1.0 and OARS-1.1 */ + if (age_text == NULL || + (content_rating != NULL && + g_strcmp0 (as_content_rating_get_kind (content_rating), "oars-1.0") != 0 && + g_strcmp0 (as_content_rating_get_kind (content_rating), "oars-1.1") != 0)) { + /* Translators: This app has no age rating information available. + * This string is displayed like an icon. Please use any + * similarly short punctuation character, word or acronym which + * will be widely understood in your region, in this context. + * This is displayed in a context tile, so the string should be short. */ + g_free (age_text); + age_text = g_strdup (_("?")); + css_class = "grey"; + *is_unknown_out = TRUE; + } else { + /* Update the CSS */ + if (age >= 18) + css_class = css_age_classes[0]; + else if (age >= 15) + css_class = css_age_classes[1]; + else if (age >= 12) + css_class = css_age_classes[2]; + else if (age >= 5) + css_class = css_age_classes[3]; + else + css_class = css_age_classes[4]; + + *is_unknown_out = FALSE; + } + + /* Update the UI. */ + gs_lozenge_set_text (lozenge, age_text); + + for (gsize i = 0; i < G_N_ELEMENTS (css_age_classes); i++) + gtk_widget_remove_css_class (GTK_WIDGET (lozenge), css_age_classes[i]); + gtk_widget_remove_css_class (GTK_WIDGET (lozenge), "grey"); + + gtk_widget_add_css_class (GTK_WIDGET (lozenge), css_class); +} + +static void +update_attributes_list (GsAgeRatingContextDialog *self) +{ + g_autoptr(AsContentRating) content_rating = NULL; + gboolean is_unknown; + g_autofree gchar *title = NULL; + + /* Clear existing state. */ + gs_widget_remove_all (GTK_WIDGET (self->attributes_list), (GsRemoveFunc) gtk_list_box_remove); + + for (GsAgeRatingGroupType group_type = 0; group_type < GS_AGE_RATING_GROUP_TYPE_COUNT; group_type++) { + g_list_free_full (self->attributes[group_type], + (GDestroyNotify) gs_age_rating_attribute_free); + self->attributes[group_type] = NULL; + + self->rows[group_type] = NULL; + } + + /* UI state is undefined if app is not set. */ + if (self->app == NULL) + return; + + /* Update lozenge and title */ + content_rating = gs_app_dup_content_rating (self->app); + gs_age_rating_context_dialog_update_lozenge (self->app, + self->lozenge, + &is_unknown); + + /* Title */ + if (is_unknown) { + /* Translators: It’s unknown what age rating this app has. The + * placeholder is the app name. */ + title = g_strdup_printf (_("%s has an unknown age rating"), gs_app_get_name (self->app)); + } else { + guint age; + + /* if content_rating is NULL, is_unknown should be TRUE */ + g_assert (content_rating != NULL); + age = as_content_rating_get_minimum_age (content_rating); + + if (age == 0) + /* Translators: This is a dialogue title which indicates that an app is suitable + * for all ages. The placeholder is the app name. */ + title = g_strdup_printf (_("%s is suitable for everyone"), gs_app_get_name (self->app)); + else if (age <= 3) + /* Translators: This is a dialogue title which indicates that an app is suitable + * for children up to around age 3. The placeholder is the app name. */ + title = g_strdup_printf (_("%s is suitable for toddlers"), gs_app_get_name (self->app)); + else if (age <= 5) + /* Translators: This is a dialogue title which indicates that an app is suitable + * for children up to around age 5. The placeholder is the app name. */ + title = g_strdup_printf (_("%s is suitable for young children"), gs_app_get_name (self->app)); + else if (age <= 12) + /* Translators: This is a dialogue title which indicates that an app is suitable + * for children up to around age 12. The placeholder is the app name. */ + title = g_strdup_printf (_("%s is suitable for children"), gs_app_get_name (self->app)); + else if (age <= 18) + /* Translators: This is a dialogue title which indicates that an app is suitable + * for people up to around age 18. The placeholder is the app name. */ + title = g_strdup_printf (_("%s is suitable for teenagers"), gs_app_get_name (self->app)); + else if (age < G_MAXUINT) + /* Translators: This is a dialogue title which indicates that an app is suitable + * for people aged up to and over 18. The placeholder is the app name. */ + title = g_strdup_printf (_("%s is suitable for adults"), gs_app_get_name (self->app)); + else + /* Translators: This is a dialogue title which indicates that an app is suitable + * for a specified age group. The first placeholder is the app name, the second + * is the age group. */ + title = g_strdup_printf (_("%s is suitable for %s"), gs_app_get_name (self->app), + gs_lozenge_get_text (self->lozenge)); + } + + gtk_label_set_text (self->title, title); + + /* Update the rows */ + gs_age_rating_context_dialog_process_attributes (content_rating, + FALSE, + add_attribute_rows_cb, + self); +} + +static void +app_notify_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GsAgeRatingContextDialog *self = GS_AGE_RATING_CONTEXT_DIALOG (user_data); + + update_attributes_list (self); +} + +static gint +sort_cb (GtkListBoxRow *row1, + GtkListBoxRow *row2, + gpointer user_data) +{ + GsContextDialogRow *_row1 = GS_CONTEXT_DIALOG_ROW (row1); + GsContextDialogRow *_row2 = GS_CONTEXT_DIALOG_ROW (row2); + GsContextDialogRowImportance importance1, importance2; + const gchar *title1, *title2; + + importance1 = gs_context_dialog_row_get_importance (_row1); + importance2 = gs_context_dialog_row_get_importance (_row2); + + if (importance1 != importance2) + return importance2 - importance1; + + title1 = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (_row1)); + title2 = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (_row2)); + + return g_strcmp0 (title1, title2); +} + +static void +contribute_info_row_activated_cb (AdwButtonRow *row, + GsAgeRatingContextDialog *self) +{ + GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (self))); + + gs_show_uri (GTK_WINDOW (toplevel), "help:gnome-software/software-metadata#age-rating"); +} + +static void +gs_age_rating_context_dialog_init (GsAgeRatingContextDialog *self) +{ + g_type_ensure (GS_TYPE_LOZENGE); + + gtk_widget_init_template (GTK_WIDGET (self)); + + /* Sort the list so the most important rows are at the top. */ + gtk_list_box_set_sort_func (self->attributes_list, sort_cb, NULL, NULL); +} + +static void +gs_age_rating_context_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsAgeRatingContextDialog *self = GS_AGE_RATING_CONTEXT_DIALOG (object); + + switch ((GsAgeRatingContextDialogProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_age_rating_context_dialog_get_app (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_age_rating_context_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsAgeRatingContextDialog *self = GS_AGE_RATING_CONTEXT_DIALOG (object); + + switch ((GsAgeRatingContextDialogProperty) prop_id) { + case PROP_APP: + gs_age_rating_context_dialog_set_app (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_age_rating_context_dialog_dispose (GObject *object) +{ + GsAgeRatingContextDialog *self = GS_AGE_RATING_CONTEXT_DIALOG (object); + + gs_age_rating_context_dialog_set_app (self, NULL); + + G_OBJECT_CLASS (gs_age_rating_context_dialog_parent_class)->dispose (object); +} + +static void +gs_age_rating_context_dialog_class_init (GsAgeRatingContextDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_age_rating_context_dialog_get_property; + object_class->set_property = gs_age_rating_context_dialog_set_property; + object_class->dispose = gs_age_rating_context_dialog_dispose; + + /** + * GsAgeRatingContextDialog:app: (nullable) + * + * The app to display the age_rating context details for. + * + * This may be %NULL; if so, the content of the widget will be + * undefined. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-age-rating-context-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsAgeRatingContextDialog, lozenge); + gtk_widget_class_bind_template_child (widget_class, GsAgeRatingContextDialog, title); + gtk_widget_class_bind_template_child (widget_class, GsAgeRatingContextDialog, attributes_list); + + gtk_widget_class_bind_template_callback (widget_class, contribute_info_row_activated_cb); +} + +/** + * gs_age_rating_context_dialog_new: + * @app: (nullable): the app to display age_rating context information for, or %NULL + * + * Create a new #GsAgeRatingContextDialog and set its initial app to @app. + * + * Returns: (transfer full): a new #GsAgeRatingContextDialog + * Since: 41 + */ +GsAgeRatingContextDialog * +gs_age_rating_context_dialog_new (GsApp *app) +{ + g_return_val_if_fail (app == NULL || GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_AGE_RATING_CONTEXT_DIALOG, + "app", app, + NULL); +} + +/** + * gs_age_rating_context_dialog_get_app: + * @self: a #GsAgeRatingContextDialog + * + * Gets the value of #GsAgeRatingContextDialog:app. + * + * Returns: (nullable) (transfer none): app whose age_rating context information is + * being displayed, or %NULL if none is set + * Since: 41 + */ +GsApp * +gs_age_rating_context_dialog_get_app (GsAgeRatingContextDialog *self) +{ + g_return_val_if_fail (GS_IS_AGE_RATING_CONTEXT_DIALOG (self), NULL); + + return self->app; +} + +/** + * gs_age_rating_context_dialog_set_app: + * @self: a #GsAgeRatingContextDialog + * @app: (nullable) (transfer none): the app to display age_rating context + * information for, or %NULL for none + * + * Set the value of #GsAgeRatingContextDialog:app. + * + * Since: 41 + */ +void +gs_age_rating_context_dialog_set_app (GsAgeRatingContextDialog *self, + GsApp *app) +{ + g_return_if_fail (GS_IS_AGE_RATING_CONTEXT_DIALOG (self)); + g_return_if_fail (app == NULL || GS_IS_APP (app)); + + if (app == self->app) + return; + + g_clear_signal_handler (&self->app_notify_handler_content_rating, self->app); + g_clear_signal_handler (&self->app_notify_handler_name, self->app); + + g_set_object (&self->app, app); + + if (self->app != NULL) { + self->app_notify_handler_content_rating = g_signal_connect (self->app, "notify::content-rating", G_CALLBACK (app_notify_cb), self); + self->app_notify_handler_name = g_signal_connect (self->app, "notify::name", G_CALLBACK (app_notify_cb), self); + } + + /* Update the UI. */ + update_attributes_list (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); +} diff --git a/src/gs-age-rating-context-dialog.h b/src/gs-age-rating-context-dialog.h new file mode 100644 index 0000000..9d64931 --- /dev/null +++ b/src/gs-age-rating-context-dialog.h @@ -0,0 +1,49 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" +#include "gs-info-window.h" +#include "gs-lozenge.h" + +G_BEGIN_DECLS + +#define GS_TYPE_AGE_RATING_CONTEXT_DIALOG (gs_age_rating_context_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAgeRatingContextDialog, gs_age_rating_context_dialog, GS, AGE_RATING_CONTEXT_DIALOG, GsInfoWindow) + +GsAgeRatingContextDialog *gs_age_rating_context_dialog_new (GsApp *app); + +GsApp *gs_age_rating_context_dialog_get_app (GsAgeRatingContextDialog *self); +void gs_age_rating_context_dialog_set_app (GsAgeRatingContextDialog *self, + GsApp *app); + +gchar *gs_age_rating_context_dialog_format_age_short (AsContentRatingSystem system, + guint age); +void gs_age_rating_context_dialog_update_lozenge (GsApp *app, + GsLozenge *lozenge, + gboolean *is_unknown_out); + + +typedef void (*GsAgeRatingContextDialogAttributeFunc) (const gchar *attribute, + AsContentRatingValue value, + gpointer user_data); + +void gs_age_rating_context_dialog_process_attributes (AsContentRating *content_rating, + gboolean show_worst_only, + GsAgeRatingContextDialogAttributeFunc callback, + gpointer user_data); + +G_END_DECLS diff --git a/src/gs-age-rating-context-dialog.ui b/src/gs-age-rating-context-dialog.ui new file mode 100644 index 0000000..294e403 --- /dev/null +++ b/src/gs-age-rating-context-dialog.ui @@ -0,0 +1,72 @@ + + + + + + diff --git a/src/gs-app-addon-row.c b/src/gs-app-addon-row.c new file mode 100644 index 0000000..b531025 --- /dev/null +++ b/src/gs-app-addon-row.c @@ -0,0 +1,279 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012-2013 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-app-addon-row.h" + +struct _GsAppAddonRow +{ + AdwActionRow parent_instance; + + GsApp *app; + GtkWidget *label; + GtkWidget *buttons_stack; + GtkWidget *button_install; + GtkWidget *button_remove; +}; + +G_DEFINE_TYPE (GsAppAddonRow, gs_app_addon_row, ADW_TYPE_ACTION_ROW) + +enum { + SIGNAL_INSTALL_BUTTON_CLICKED, + SIGNAL_REMOVE_BUTTON_CLICKED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +static void +app_addon_install_button_cb (GtkWidget *widget, GsAppAddonRow *row) +{ + g_signal_emit (row, signals[SIGNAL_INSTALL_BUTTON_CLICKED], 0); +} + +static void +app_addon_remove_button_cb (GtkWidget *widget, GsAppAddonRow *row) +{ + g_signal_emit (row, signals[SIGNAL_REMOVE_BUTTON_CLICKED], 0); +} + +/** + * gs_app_addon_row_get_summary: + * + * Return value: PangoMarkup + **/ +static GString * +gs_app_addon_row_get_summary (GsAppAddonRow *row) +{ + const gchar *tmp = NULL; + g_autofree gchar *escaped = NULL; + + /* try all these things in order */ + if (gs_app_get_state (row->app) == GS_APP_STATE_UNAVAILABLE) + tmp = gs_app_get_summary_missing (row->app); + if (tmp == NULL || (tmp != NULL && tmp[0] == '\0')) + tmp = gs_app_get_summary (row->app); + if (tmp == NULL || (tmp != NULL && tmp[0] == '\0')) + tmp = gs_app_get_description (row->app); + + escaped = g_markup_escape_text (tmp, -1); + return g_string_new (escaped); +} + +void +gs_app_addon_row_refresh (GsAppAddonRow *row) +{ + g_autoptr(GString) str = NULL; + gboolean show_install = FALSE, show_remove = FALSE; + + if (row->app == NULL) + return; + + /* join the lines */ + str = gs_app_addon_row_get_summary (row); + gs_utils_gstring_replace (str, "\n", " "); + adw_action_row_set_subtitle (ADW_ACTION_ROW (row), str->str); + adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), + gs_app_get_name (row->app)); + + /* update the state label */ + switch (gs_app_get_state (row->app)) { + case GS_APP_STATE_QUEUED_FOR_INSTALL: + gtk_widget_set_visible (row->label, TRUE); + gtk_label_set_label (GTK_LABEL (row->label), _("Pending")); + break; + case GS_APP_STATE_PENDING_INSTALL: + gtk_widget_set_visible (row->label, TRUE); + gtk_label_set_label (GTK_LABEL (row->label), _("Pending install")); + break; + case GS_APP_STATE_PENDING_REMOVE: + gtk_widget_set_visible (row->label, TRUE); + gtk_label_set_label (GTK_LABEL (row->label), _("Pending remove")); + break; + case GS_APP_STATE_INSTALLING: + gtk_widget_set_visible (row->label, TRUE); + gtk_label_set_label (GTK_LABEL (row->label), _("Installing")); + break; + case GS_APP_STATE_REMOVING: + gtk_widget_set_visible (row->label, TRUE); + gtk_label_set_label (GTK_LABEL (row->label), _("Removing")); + break; + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_visible (row->label, TRUE); + gtk_label_set_label (GTK_LABEL (row->label), _("Downloading")); + break; + default: + gtk_widget_set_visible (row->label, FALSE); + break; + } + + /* update the checkbox, remove button, and activatable state */ + switch (gs_app_get_state (row->app)) { + case GS_APP_STATE_QUEUED_FOR_INSTALL: + show_install = FALSE; + show_remove = !gs_app_has_quirk (row->app, GS_APP_QUIRK_COMPULSORY); + gtk_widget_set_sensitive (row->button_remove, !gs_app_has_quirk (row->app, GS_APP_QUIRK_COMPULSORY)); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE); + break; + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_AVAILABLE_LOCAL: + show_install = TRUE; + show_remove = FALSE; + gtk_widget_set_sensitive (row->button_install, TRUE); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE); + break; + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_UPDATABLE_LIVE: + case GS_APP_STATE_INSTALLED: + show_install = FALSE; + show_remove = !gs_app_has_quirk (row->app, GS_APP_QUIRK_COMPULSORY); + gtk_widget_set_sensitive (row->button_remove, !gs_app_has_quirk (row->app, GS_APP_QUIRK_COMPULSORY)); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE); + break; + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_DOWNLOADING: + show_install = FALSE; + show_remove = TRUE; + gtk_widget_set_sensitive (row->button_remove, FALSE); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE); + break; + default: + show_install = TRUE; + show_remove = FALSE; + gtk_widget_set_sensitive (row->button_install, FALSE); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE); + break; + } + + g_assert (!(show_install && show_remove)); + + gtk_widget_set_visible (row->buttons_stack, show_install || show_remove); + gtk_stack_set_visible_child (GTK_STACK (row->buttons_stack), show_install ? row->button_install : row->button_remove); +} + +GsApp * +gs_app_addon_row_get_addon (GsAppAddonRow *row) +{ + g_return_val_if_fail (GS_IS_APP_ADDON_ROW (row), NULL); + return row->app; +} + +static gboolean +gs_app_addon_row_refresh_idle (gpointer user_data) +{ + GsAppAddonRow *row = GS_APP_ADDON_ROW (user_data); + + gs_app_addon_row_refresh (row); + + g_object_unref (row); + return G_SOURCE_REMOVE; +} + +static void +gs_app_addon_row_notify_props_changed_cb (GsApp *app, + GParamSpec *pspec, + GsAppAddonRow *row) +{ + g_idle_add (gs_app_addon_row_refresh_idle, g_object_ref (row)); +} + +static void +gs_app_addon_row_set_addon (GsAppAddonRow *row, GsApp *app) +{ + row->app = g_object_ref (app); + + g_signal_connect_object (row->app, "notify::state", + G_CALLBACK (gs_app_addon_row_notify_props_changed_cb), + row, 0); + gs_app_addon_row_refresh (row); +} + +static void +gs_app_addon_row_dispose (GObject *object) +{ + GsAppAddonRow *row = GS_APP_ADDON_ROW (object); + + if (row->app) + g_signal_handlers_disconnect_by_func (row->app, gs_app_addon_row_notify_props_changed_cb, row); + + g_clear_object (&row->app); + + G_OBJECT_CLASS (gs_app_addon_row_parent_class)->dispose (object); +} + +static void +gs_app_addon_row_class_init (GsAppAddonRowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_app_addon_row_dispose; + + signals [SIGNAL_INSTALL_BUTTON_CLICKED] = + g_signal_new ("install-button-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals [SIGNAL_REMOVE_BUTTON_CLICKED] = + g_signal_new ("remove-button-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-app-addon-row.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsAppAddonRow, label); + gtk_widget_class_bind_template_child (widget_class, GsAppAddonRow, buttons_stack); + gtk_widget_class_bind_template_child (widget_class, GsAppAddonRow, button_install); + gtk_widget_class_bind_template_child (widget_class, GsAppAddonRow, button_remove); +} + +static void +gs_app_addon_row_init (GsAppAddonRow *row) +{ + gtk_widget_init_template (GTK_WIDGET (row)); + + g_signal_connect (row->button_install, "clicked", + G_CALLBACK (app_addon_install_button_cb), row); + g_signal_connect (row->button_remove, "clicked", + G_CALLBACK (app_addon_remove_button_cb), row); +} + +void +gs_app_addon_row_activate (GsAppAddonRow *row) +{ + GtkWidget *button; + + g_return_if_fail (GS_IS_APP_ADDON_ROW (row)); + + if (!gtk_widget_get_visible (row->buttons_stack)) + return; + + button = gtk_stack_get_visible_child (GTK_STACK (row->buttons_stack)); + if (gtk_widget_get_sensitive (button)) + gtk_widget_activate (button); +} + +GtkWidget * +gs_app_addon_row_new (GsApp *app) +{ + GtkWidget *row; + + g_return_val_if_fail (GS_IS_APP (app), NULL); + + row = g_object_new (GS_TYPE_APP_ADDON_ROW, NULL); + gs_app_addon_row_set_addon (GS_APP_ADDON_ROW (row), app); + return row; +} diff --git a/src/gs-app-addon-row.h b/src/gs-app-addon-row.h new file mode 100644 index 0000000..8f09a1c --- /dev/null +++ b/src/gs-app-addon-row.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012 Richard Hughes + * Copyright (C) 2014-2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_ADDON_ROW (gs_app_addon_row_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppAddonRow, gs_app_addon_row, GS, APP_ADDON_ROW, AdwActionRow) + +GtkWidget *gs_app_addon_row_new (GsApp *app); +void gs_app_addon_row_refresh (GsAppAddonRow *row); +void gs_app_addon_row_activate (GsAppAddonRow *row); +GsApp *gs_app_addon_row_get_addon (GsAppAddonRow *row); + +G_END_DECLS diff --git a/src/gs-app-addon-row.ui b/src/gs-app-addon-row.ui new file mode 100644 index 0000000..ff09858 --- /dev/null +++ b/src/gs-app-addon-row.ui @@ -0,0 +1,37 @@ + + + + + diff --git a/src/gs-app-context-bar.c b/src/gs-app-context-bar.c new file mode 100644 index 0000000..17c9ecc --- /dev/null +++ b/src/gs-app-context-bar.c @@ -0,0 +1,1073 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-app-context-bar + * @short_description: A bar containing context tiles describing an app + * + * #GsAppContextBar is a bar which contains ‘context tiles’ to describe some of + * the key features of an app. Each tile describes one aspect of the app, such + * as its download/installed size, hardware requirements, or content rating. + * Tiles are intended to convey the most pertinent information about aspects of + * the app, leaving further detail to be shown in a more detailed dialog. + * + * The widget has no special appearance if the app is unset, so callers will + * typically want to hide the bar in that case. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-age-rating-context-dialog.h" +#include "gs-app.h" +#include "gs-app-context-bar.h" +#include "gs-common.h" +#include "gs-hardware-support-context-dialog.h" +#include "gs-lozenge.h" +#include "gs-safety-context-dialog.h" +#include "gs-storage-context-dialog.h" + +typedef struct +{ + GtkWidget *tile; + GtkWidget *lozenge; + GtkLabel *title; + GtkLabel *description; +} GsAppContextTile; + +typedef enum +{ + STORAGE_TILE, + SAFETY_TILE, + HARDWARE_SUPPORT_TILE, + AGE_RATING_TILE, +} GsAppContextTileType; +#define N_TILE_TYPES (AGE_RATING_TILE + 1) + +struct _GsAppContextBar +{ + GtkBox parent_instance; + + GsApp *app; /* (nullable) (owned) */ + gulong app_notify_handler; + + GsAppContextTile tiles[N_TILE_TYPES]; +}; + +G_DEFINE_TYPE (GsAppContextBar, gs_app_context_bar, GTK_TYPE_BOX) + +typedef enum { + PROP_APP = 1, +} GsAppContextBarProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +/* Certain tiles only make sense for apps which the user can run, and + * not for (say) fonts. + * + * Update the visibility of the tile’s parent box to hide it if both tiles + * are hidden. */ +static gboolean +show_tile_for_non_applications (GsAppContextBar *self, + GsAppContextTileType tile_type) +{ + GtkWidget *sibling; + GtkBox *parent_box; + gboolean any_siblings_visible; + AsComponentKind app_kind = gs_app_get_kind (self->app); + gboolean is_application = (app_kind == AS_COMPONENT_KIND_DESKTOP_APP || + app_kind == AS_COMPONENT_KIND_CONSOLE_APP || + app_kind == AS_COMPONENT_KIND_WEB_APP); + + gtk_widget_set_visible (self->tiles[tile_type].tile, is_application); + + parent_box = GTK_BOX (gtk_widget_get_parent (self->tiles[tile_type].tile)); + g_assert (GTK_IS_BOX (parent_box)); + + any_siblings_visible = FALSE; + + for (sibling = gtk_widget_get_first_child (GTK_WIDGET (parent_box)); + sibling != NULL; + sibling = gtk_widget_get_next_sibling (sibling)) { + g_assert (GTK_IS_BUTTON (sibling)); + any_siblings_visible |= gtk_widget_get_visible (sibling); + } + + gtk_widget_set_visible (GTK_WIDGET (parent_box), any_siblings_visible); + + return is_application; +} + +static void +update_storage_tile (GsAppContextBar *self) +{ + g_autofree gchar *lozenge_text = NULL; + gboolean lozenge_text_is_markup = FALSE; + const gchar *title; + g_autofree gchar *description = NULL; + guint64 size_bytes; + GsSizeType size_type; + + g_assert (self->app != NULL); + + if (gs_app_is_installed (self->app)) { + guint64 size_installed, size_user_data, size_cache_data; + GsSizeType size_installed_type, size_user_data_type, size_cache_data_type; + g_autofree gchar *size_user_data_str = NULL; + g_autofree gchar *size_cache_data_str = NULL; + + size_installed_type = gs_app_get_size_installed (self->app, &size_installed); + size_user_data_type = gs_app_get_size_user_data (self->app, &size_user_data); + size_cache_data_type = gs_app_get_size_cache_data (self->app, &size_cache_data); + + /* Treat `0` sizes as `unknown`, to not show `0 bytes` in the text. */ + if (size_user_data == 0) + size_user_data_type = GS_SIZE_TYPE_UNKNOWN; + if (size_cache_data == 0) + size_cache_data_type = GS_SIZE_TYPE_UNKNOWN; + + /* If any installed sizes are unknowable, ignore them. This + * means the stated installed size is a lower bound on the + * actual installed size. + * Don’t include dependencies in the stated installed size, + * because uninstalling the app won’t reclaim that space unless + * it’s the last app using those dependencies. */ + size_bytes = size_installed; + size_type = size_installed_type; + if (size_user_data_type == GS_SIZE_TYPE_VALID) + size_bytes += size_user_data; + if (size_cache_data_type == GS_SIZE_TYPE_VALID) + size_bytes += size_cache_data; + + size_user_data_str = g_format_size (size_user_data); + size_cache_data_str = g_format_size (size_cache_data); + + /* Translators: The disk usage of an app when installed. + * This is displayed in a context tile, so the string should be short. */ + title = _("Installed Size"); + + if (size_user_data_type == GS_SIZE_TYPE_VALID && size_cache_data_type == GS_SIZE_TYPE_VALID) + description = g_strdup_printf (_("Includes %s of data and %s of cache"), + size_user_data_str, size_cache_data_str); + else if (size_user_data_type == GS_SIZE_TYPE_VALID) + description = g_strdup_printf (_("Includes %s of data"), + size_user_data_str); + else if (size_cache_data_type == GS_SIZE_TYPE_VALID) + description = g_strdup_printf (_("Includes %s of cache"), + size_cache_data_str); + else + description = g_strdup (_("Cache and data usage unknown")); + } else { + guint64 app_download_size_bytes, dependencies_download_size_bytes; + GsSizeType app_download_size_type, dependencies_download_size_type; + + app_download_size_type = gs_app_get_size_download (self->app, &app_download_size_bytes); + dependencies_download_size_type = gs_app_get_size_download_dependencies (self->app, &dependencies_download_size_bytes); + + size_bytes = app_download_size_bytes; + size_type = app_download_size_type; + + /* Translators: The download size of an app. + * This is displayed in a context tile, so the string should be short. */ + title = _("Download Size"); + + if (dependencies_download_size_type == GS_SIZE_TYPE_VALID && + dependencies_download_size_bytes == 0) { + description = g_strdup (_("Needs no additional system downloads")); + } else if (dependencies_download_size_type != GS_SIZE_TYPE_VALID) { + description = g_strdup (_("Needs an unknown size of additional system downloads")); + } else { + g_autofree gchar *size = g_format_size (dependencies_download_size_bytes); + /* Translators: The placeholder is for a size string, + * such as ‘150 MB’ or ‘1.5 GB’. */ + description = g_strdup_printf (_("Needs %s of additional system downloads"), size); + } + } + + if (size_type != GS_SIZE_TYPE_VALID) { + /* Translators: This is displayed for the download size in an + * app’s context tile if the size is unknown. It should be short + * (at most a couple of characters wide). */ + lozenge_text = g_strdup (_("?")); + + g_free (description); + /* Translators: Displayed if the download or installed size of + * an app could not be determined. + * This is displayed in a context tile, so the string should be short. */ + description = g_strdup (_("Size is unknown")); + } else { + lozenge_text = gs_utils_format_size (size_bytes, &lozenge_text_is_markup); + } + + if (lozenge_text_is_markup) + gs_lozenge_set_markup (GS_LOZENGE (self->tiles[STORAGE_TILE].lozenge), lozenge_text); + else + gs_lozenge_set_text (GS_LOZENGE (self->tiles[STORAGE_TILE].lozenge), lozenge_text); + gtk_label_set_text (self->tiles[STORAGE_TILE].title, title); + gtk_label_set_text (self->tiles[STORAGE_TILE].description, description); +} + +typedef enum +{ + /* The code in this file relies on the fact that these enum values + * numerically increase as they get more unsafe. */ + SAFETY_SAFE, + SAFETY_PRIVILEGED, + SAFETY_PROBABLY_SAFE, + SAFETY_POTENTIALLY_UNSAFE, + SAFETY_UNSAFE +} SafetyRating; + +static void +add_to_safety_rating_full (SafetyRating *chosen_rating, + GPtrArray *descriptions, + SafetyRating item_rating, + const gchar *item_description, + gboolean can_clear_descriptions) +{ + if (item_rating > *chosen_rating) { + if (can_clear_descriptions) + g_ptr_array_set_size (descriptions, 0); + *chosen_rating = item_rating; + } + + if (item_rating == *chosen_rating) + g_ptr_array_add (descriptions, (gpointer) item_description); +} + +static void +add_to_safety_rating (SafetyRating *chosen_rating, + GPtrArray *descriptions, + SafetyRating item_rating, + const gchar *item_description) +{ + /* Clear the existing descriptions and replace with @item_description if + * this item increases the @chosen_rating. This means the final list of + * @descriptions will only be the items which caused @chosen_rating to + * be so high. */ + add_to_safety_rating_full (chosen_rating, descriptions, item_rating, item_description, TRUE); +} + +static void +update_safety_tile (GsAppContextBar *self) +{ + const gchar *icon_name, *title, *css_class; + /* keep @reviewd_by global for the function, because it's added as-is into the @descriptions array, not copied */ + g_autofree gchar *reviewed_by = NULL; + g_autofree gchar *description = NULL; + g_autoptr(GPtrArray) descriptions = g_ptr_array_new_with_free_func (NULL); + g_autoptr(GsAppPermissions) permissions = NULL; + GsAppPermissionsFlags perm_flags = GS_APP_PERMISSIONS_FLAGS_NONE; + + /* Treat everything as safe to begin with, and downgrade its safety + * based on app properties. */ + SafetyRating chosen_rating = SAFETY_SAFE; + + g_assert (self->app != NULL); + + permissions = gs_app_dup_permissions (self->app); + if (permissions != NULL) + perm_flags = gs_app_permissions_get_flags (permissions); + + if ((permissions == NULL || gs_app_permissions_is_empty (permissions)) && + (permissions != NULL || !gs_app_has_quirk (self->app, GS_APP_QUIRK_PROVENANCE))) { + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_SAFE, + /* Translators: This indicates an app requires no permissions to run. + * It’s used in a context tile, so should be short. */ + _("No permissions")); + } + + for (GsAppPermissionsFlags i = (1 << 0); i < GS_APP_PERMISSIONS_FLAGS_LAST; i <<= 1) { + if (!(perm_flags & i)) + continue; + + switch (i) { + case GS_APP_PERMISSIONS_FLAGS_NETWORK: + add_to_safety_rating (&chosen_rating, descriptions, + /* This isn’t actually safe (network access can expand a local + * vulnerability into a remotely exploitable one), but it’s + * needed commonly enough that marking it as + * %SAFETY_POTENTIALLY_UNSAFE is too noisy. */ + SAFETY_PROBABLY_SAFE, + /* Translators: This indicates an app uses the network. + * It’s used in a context tile, so should be short. */ + _("Has network access")); + break; + case GS_APP_PERMISSIONS_FLAGS_SYSTEM_BUS: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app uses D-Bus system services. + * It’s used in a context tile, so should be short. */ + _("Uses system services")); + break; + case GS_APP_PERMISSIONS_FLAGS_SESSION_BUS: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app uses D-Bus session services. + * It’s used in a context tile, so should be short. */ + _("Uses session services")); + break; + case GS_APP_PERMISSIONS_FLAGS_DEVICES: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can access arbitrary hardware devices. + * It’s used in a context tile, so should be short. */ + _("Can access hardware devices")); + break; + case GS_APP_PERMISSIONS_FLAGS_INPUT_DEVICES: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_PROBABLY_SAFE, + /* Translators: This indicates an app can access input devices. + * It’s used in a context tile, so should be short. */ + _("Can access input devices")); + break; + case GS_APP_PERMISSIONS_FLAGS_AUDIO_DEVICES: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_PROBABLY_SAFE, + /* Translators: This indicates an app can access audio devices. + * It’s used in a context tile, so should be short. */ + _("Can access microphones and play audio")); + break; + case GS_APP_PERMISSIONS_FLAGS_SYSTEM_DEVICES: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can access system devices such as /dev/shm. + * It’s used in a context tile, so should be short. */ + _("Can access system devices")); + break; + case GS_APP_PERMISSIONS_FLAGS_SCREEN: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can access the screen/display contents. + * It’s used in a context tile, so should be short. */ + _("Can access screen contents")); + break; + case GS_APP_PERMISSIONS_FLAGS_HOME_FULL: + case GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL: + /* Don’t add twice. */ + if (i == GS_APP_PERMISSIONS_FLAGS_HOME_FULL && (perm_flags & GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL)) + break; + + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can read/write to the user’s home or the entire filesystem. + * It’s used in a context tile, so should be short. */ + _("Can read/write all your data")); + break; + case GS_APP_PERMISSIONS_FLAGS_HOME_READ: + case GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ: + /* Don’t add twice. */ + if (i == GS_APP_PERMISSIONS_FLAGS_HOME_READ && (perm_flags & GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ)) + break; + + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can read (but not write) from the user’s home or the entire filesystem. + * It’s used in a context tile, so should be short. */ + _("Can read all your data")); + break; + case GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can read/write to the user’s Downloads directory. + * It’s used in a context tile, so should be short. */ + _("Can read/write your downloads")); + break; + case GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_READ: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can read (but not write) from the user’s Downloads directory. + * It’s used in a context tile, so should be short. */ + _("Can read your downloads")); + break; + case GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can access data in the system unknown to the Software. + * It’s used in a context tile, so should be short. */ + _("Can access some specific files")); + break; + case GS_APP_PERMISSIONS_FLAGS_SETTINGS: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can access or change user settings. + * It’s used in a context tile, so should be short. */ + _("Can access and change user settings")); + break; + case GS_APP_PERMISSIONS_FLAGS_X11: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app uses the X11 windowing system. + * It’s used in a context tile, so should be short. */ + _("Uses a legacy windowing system")); + break; + case GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX: + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app can escape its sandbox. + * It’s used in a context tile, so should be short. */ + _("Can acquire arbitrary permissions")); + break; + default: + break; + } + } + + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_DEVELOPER_VERIFIED)) + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_SAFE, + /* Translators: This indicates an app was written and released by a developer who has been verified. + * It’s used in a context tile, so should be short. */ + _("Software developer is verified")); + + /* Unknown permissions (`permissions == NULL`) typically come from non-sandboxed packaging + * systems like RPM or DEB. Telling the user the software has unknown + * permissions is unhelpful; it’s more relevant to say it’s not + * sandboxed but is (or is not) packaged by a trusted vendor. They will + * have (at least) done some basic checks to make sure the software is + * not overtly malware. That doesn’t protect the user from exploitable + * bugs in the software, but it does mean they’re not accidentally + * installing something which is actively malicious. */ + if (permissions == NULL && + gs_app_has_quirk (self->app, GS_APP_QUIRK_PROVENANCE)) { + /* It's a new key suggested at https://github.com/systemd/systemd/issues/27777 */ + g_autofree gchar *name = g_get_os_info ("VENDOR_NAME"); + if (name == NULL) { + /* Translators: This indicates that an app has been packaged + * by the user’s distribution and is probably safe. + * It’s used in a context tile, so should be short. */ + reviewed_by = g_strdup (_("Reviewed by OS distributor")); + } else { + /* Translators: This indicates that an app has been packaged + * by the user’s distribution and is probably safe. + * It’s used in a context tile, so should be short. + * The '%s' is replaced by the distribution name. */ + reviewed_by = g_strdup_printf (_("Reviewed by %s"), name); + } + + /* Show as 'probably safe' when the app is considered safe until now and it's provided by the distribution */ + if (chosen_rating == SAFETY_SAFE) + chosen_rating = SAFETY_PRIVILEGED; + + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_PRIVILEGED, + reviewed_by); + } else if (permissions == NULL) { + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates that an app has been packaged + * by someone other than the user’s distribution, so might not be safe. + * It’s used in a context tile, so should be short. */ + _("Provided by a third party")); + } + + if (gs_app_get_metadata_item (self->app, "GnomeSoftware::EolReason") != NULL || ( + gs_app_get_runtime (self->app) != NULL && + gs_app_get_metadata_item (gs_app_get_runtime (self->app), "GnomeSoftware::EolReason") != NULL)) + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_POTENTIALLY_UNSAFE, + /* Translators: This indicates an app or its runtime reached its end of life. + * It’s used in a context tile, so should be short. */ + _("Software no longer supported")); + + /* Is the code FOSS and hence inspectable? This doesn’t distinguish + * between closed source and open-source-but-not-FOSS software, even + * though the code of the latter is technically publicly auditable. This + * is because I don’t want to get into the business of maintaining lists + * of ‘auditable’ source code licenses. */ + if (gs_app_get_license_is_free (self->app)) { + add_to_safety_rating (&chosen_rating, descriptions, + SAFETY_SAFE, + /* Translators: This indicates an app’s source code is freely available, so can be audited for security. + * It’s used in a context tile, so should be short. */ + _("Auditable code")); + } else if (gs_app_get_license (self->app) == NULL) { + add_to_safety_rating_full (&chosen_rating, descriptions, + SAFETY_PRIVILEGED, + /* Translators: This indicates an app does not specify which license it's developed under. + * It’s used in a context tile, so should be short. */ + _("Unknown license"), + FALSE); + } else if (g_ascii_strncasecmp (gs_app_get_license (self->app), "LicenseRef-proprietary", strlen ("LicenseRef-proprietary")) == 0) { + add_to_safety_rating_full (&chosen_rating, descriptions, + SAFETY_PROBABLY_SAFE, + /* Translators: This indicates an app is not licensed under a free software license. + * It’s used in a context tile, so should be short. */ + _("Proprietary code"), + FALSE); + } else { + add_to_safety_rating_full (&chosen_rating, descriptions, + SAFETY_PROBABLY_SAFE, + /* Translators: This indicates an app is not licensed under a free software license. + * It’s used in a context tile, so should be short. */ + _("Special license"), + FALSE); + } + + g_assert (descriptions->len > 0); + + g_ptr_array_add (descriptions, NULL); + /* Translators: This string is used to join various other translated + * strings into an inline list of reasons why an app has been marked as + * ‘safe’, ‘potentially safe’ or ‘unsafe’. For example: + * “App comes from a trusted source; Auditable code; No permissions” + * If concatenating strings as a list using a separator like this is not + * possible in your language, please file an issue against gnome-software: + * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ */ + description = g_strjoinv (_("; "), (gchar **) descriptions->pdata); + + /* Update the UI. */ + switch (chosen_rating) { + case SAFETY_PRIVILEGED: + icon_name = "app-safety-ok-symbolic"; + /* Translators: The app is considered privileged, aka provided by the distribution. + * This is displayed in a context tile, so the string should be short. */ + title = _("Privileged"); + css_class = "grey"; + break; + case SAFETY_SAFE: + icon_name = "app-safety-ok-symbolic"; + /* Translators: The app is considered safe to install and run. + * This is displayed in a context tile, so the string should be short. */ + title = _("Safe"); + css_class = "green"; + break; + case SAFETY_PROBABLY_SAFE: + icon_name = "app-safety-ok-symbolic"; + /* Translators: The app is considered probably safe to install and run. + * This is displayed in a context tile, so the string should be short. */ + title = _("Probably Safe"); + css_class = "yellow"; + break; + case SAFETY_POTENTIALLY_UNSAFE: + icon_name = "app-safety-unknown-symbolic"; + /* Translators: The app is considered potentially unsafe to install and run. + * This is displayed in a context tile, so the string should be short. */ + title = _("Potentially Unsafe"); + css_class = "orange"; + break; + case SAFETY_UNSAFE: + icon_name = "app-safety-unsafe-symbolic"; + /* Translators: The app is considered unsafe to install and run. + * This is displayed in a context tile, so the string should be short. */ + title = _("Unsafe"); + css_class = "red"; + break; + default: + g_assert_not_reached (); + } + + gs_lozenge_set_icon_name (GS_LOZENGE (self->tiles[SAFETY_TILE].lozenge), icon_name); + gtk_label_set_text (self->tiles[SAFETY_TILE].title, title); + gtk_label_set_text (self->tiles[SAFETY_TILE].description, description); + + gtk_widget_remove_css_class (self->tiles[SAFETY_TILE].lozenge, "green"); + gtk_widget_remove_css_class (self->tiles[SAFETY_TILE].lozenge, "grey"); + gtk_widget_remove_css_class (self->tiles[SAFETY_TILE].lozenge, "yellow"); + gtk_widget_remove_css_class (self->tiles[SAFETY_TILE].lozenge, "orange"); + gtk_widget_remove_css_class (self->tiles[SAFETY_TILE].lozenge, "red"); + + gtk_widget_add_css_class (self->tiles[SAFETY_TILE].lozenge, css_class); +} + +typedef struct { + guint min; + guint max; +} Range; + +static void +update_hardware_support_tile (GsAppContextBar *self) +{ + g_autoptr(GPtrArray) relations = NULL; + AsRelationKind control_relations[AS_CONTROL_KIND_LAST] = { AS_RELATION_KIND_UNKNOWN, }; + GdkDisplay *display; + GdkMonitor *monitor = NULL; + gboolean any_control_relations_set; + const gchar *icon_name = NULL, *title = NULL, *description = NULL, *css_class = NULL; + gboolean has_touchscreen = FALSE, has_keyboard = FALSE, has_mouse = FALSE; + + g_assert (self->app != NULL); + + /* Don’t show the hardware support tile for non-desktop apps. */ + if (!show_tile_for_non_applications (self, HARDWARE_SUPPORT_TILE)) + return; + + relations = gs_app_get_relations (self->app); + + /* Extract the %AS_RELATION_ITEM_KIND_CONTROL relations and summarise + * them. */ + display = gtk_widget_get_display (GTK_WIDGET (self)); + gs_hardware_support_context_dialog_get_control_support (display, relations, + &any_control_relations_set, + control_relations, + &has_touchscreen, + &has_keyboard, + &has_mouse); + + /* Warn about screen size mismatches. Compare against the largest + * monitor associated with this widget’s #GdkDisplay, defaulting to + * the primary monitor. + * + * See https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-requires-recommends-display_length + * for the semantics of the display length relations.*/ + if (display != NULL) + monitor = gs_hardware_support_context_dialog_get_largest_monitor (display); + + if (monitor != NULL) { + AsRelationKind desktop_relation_kind, mobile_relation_kind, current_relation_kind; + gboolean desktop_match, mobile_match, current_match; + + gs_hardware_support_context_dialog_get_display_support (monitor, relations, + NULL, + &desktop_match, &desktop_relation_kind, + &mobile_match, &mobile_relation_kind, + ¤t_match, ¤t_relation_kind); + + /* If the current screen size is not supported, try and + * summarise the restrictions into a single context tile. */ + if (!current_match && + !mobile_match && mobile_relation_kind == AS_RELATION_KIND_REQUIRES) { + icon_name = "device-support-mobile-symbolic"; + title = _("Mobile Only"); + description = _("Only works on a small screen"); + css_class = "red"; + } else if (!current_match && + !desktop_match && desktop_relation_kind == AS_RELATION_KIND_REQUIRES) { + icon_name = "device-support-desktop-symbolic"; + title = _("Desktop Only"); + description = _("Only works on a large screen"); + css_class = "red"; + } else if (!current_match && current_relation_kind == AS_RELATION_KIND_REQUIRES) { + icon_name = "device-support-desktop-symbolic"; + title = _("Screen Size Mismatch"); + description = _("Doesn’t support your current screen size"); + css_class = "red"; + } + } + + /* Warn about missing touchscreen or keyboard support. There are some + * assumptions here that certain input devices are only available on + * certain platforms; they can change in future. + * + * As with the rest of the tile contents in this function, tile contents + * which are checked lower down in the function are only used if nothing + * more important has already been set earlier. + * + * The available information is being summarised to quite an extreme + * degree here, and it’s likely this code will have to evolve for + * corner cases in future. */ + if (icon_name == NULL && + control_relations[AS_CONTROL_KIND_TOUCH] == AS_RELATION_KIND_REQUIRES && + !has_touchscreen) { + icon_name = "device-support-mobile-symbolic"; + title = _("Mobile Only"); + description = _("Requires a touchscreen"); + css_class = "red"; + } else if (icon_name == NULL && + control_relations[AS_CONTROL_KIND_KEYBOARD] == AS_RELATION_KIND_REQUIRES && + !has_keyboard) { + icon_name = "input-keyboard-symbolic"; + title = _("Desktop Only"); + description = _("Requires a keyboard"); + css_class = "red"; + } else if (icon_name == NULL && + control_relations[AS_CONTROL_KIND_POINTING] == AS_RELATION_KIND_REQUIRES && + !has_mouse) { + icon_name = "input-mouse-symbolic"; + title = _("Desktop Only"); + description = _("Requires a mouse"); + css_class = "red"; + } + + /* Say if the app requires a gamepad. We can’t reliably detect whether + * the computer has a gamepad, as it might be unplugged unless the user + * is currently playing a game. So this might be shown even if the user + * has a gamepad available. */ + if (icon_name == NULL && + control_relations[AS_CONTROL_KIND_GAMEPAD] == AS_RELATION_KIND_REQUIRES) { + icon_name = "input-gaming-symbolic"; + title = _("Gamepad Needed"); + description = _("Requires a gamepad to play"); + css_class = "yellow"; + } + + /* Otherwise, is it adaptive? Note that %AS_RELATION_KIND_RECOMMENDS + * means more like ‘supports’ than ‘recommends’. */ +#if AS_CHECK_VERSION(0, 15, 0) + if (icon_name == NULL && + (control_relations[AS_CONTROL_KIND_TOUCH] == AS_RELATION_KIND_RECOMMENDS || + control_relations[AS_CONTROL_KIND_TOUCH] == AS_RELATION_KIND_SUPPORTS) && + (control_relations[AS_CONTROL_KIND_KEYBOARD] == AS_RELATION_KIND_RECOMMENDS || + control_relations[AS_CONTROL_KIND_KEYBOARD] == AS_RELATION_KIND_SUPPORTS) && + (control_relations[AS_CONTROL_KIND_POINTING] == AS_RELATION_KIND_RECOMMENDS || + control_relations[AS_CONTROL_KIND_POINTING] == AS_RELATION_KIND_SUPPORTS)) { +#else + if (icon_name == NULL && + control_relations[AS_CONTROL_KIND_TOUCH] == AS_RELATION_KIND_RECOMMENDS && + control_relations[AS_CONTROL_KIND_KEYBOARD] == AS_RELATION_KIND_RECOMMENDS && + control_relations[AS_CONTROL_KIND_POINTING] == AS_RELATION_KIND_RECOMMENDS) { +#endif + icon_name = "device-support-adaptive-symbolic"; + /* Translators: This is used in a context tile to indicate that + * an app works on phones, tablets *and* desktops. It should be + * short and in title case. */ + title = _("Adaptive"); + description = _("Works on phones, tablets and desktops"); + css_class = "green"; + } + + /* Fallback. At the moment (June 2021) almost no apps have any metadata + * about hardware support, so this case will be hit most of the time. + * + * So in the absence of any other information, assume that all apps + * support desktop, and none support mobile. */ + if (icon_name == NULL) { + if (!has_keyboard || !has_mouse) { + icon_name = "device-support-desktop-symbolic"; + title = _("Desktop Only"); + description = _("Probably requires a keyboard or mouse"); + css_class = "yellow"; + } else { + icon_name = "device-support-desktop-symbolic"; + title = _("Desktop Only"); + description = _("Works on desktops and laptops"); + css_class = "grey"; + } + } + + /* Update the UI. The `device-support-adaptive-symbolic` icon needs a special size to + * be set, as it is wider than it is tall. Setting the size ensures it’s + * rendered at the right height. */ + gs_lozenge_set_icon_name (GS_LOZENGE (self->tiles[HARDWARE_SUPPORT_TILE].lozenge), icon_name); + gs_lozenge_set_pixel_size (GS_LOZENGE (self->tiles[HARDWARE_SUPPORT_TILE].lozenge), g_str_equal (icon_name, "device-support-adaptive-symbolic") ? 56 : -1); + + gtk_label_set_text (self->tiles[HARDWARE_SUPPORT_TILE].title, title); + gtk_label_set_text (self->tiles[HARDWARE_SUPPORT_TILE].description, description); + + gtk_widget_remove_css_class (self->tiles[HARDWARE_SUPPORT_TILE].lozenge, "green"); + gtk_widget_remove_css_class (self->tiles[HARDWARE_SUPPORT_TILE].lozenge, "grey"); + gtk_widget_remove_css_class (self->tiles[HARDWARE_SUPPORT_TILE].lozenge, "yellow"); + gtk_widget_remove_css_class (self->tiles[HARDWARE_SUPPORT_TILE].lozenge, "red"); + + gtk_widget_add_css_class (self->tiles[HARDWARE_SUPPORT_TILE].lozenge, css_class); + + if (g_str_equal (icon_name, "device-support-adaptive-symbolic")) + gtk_widget_add_css_class (self->tiles[HARDWARE_SUPPORT_TILE].lozenge, "wide-image"); + else + gtk_widget_remove_css_class (self->tiles[HARDWARE_SUPPORT_TILE].lozenge, "wide-image"); +} + +static void +build_age_rating_description_cb (const gchar *attribute, + AsContentRatingValue value, + gpointer user_data) +{ + GPtrArray *descriptions = user_data; + const gchar *description; + + /* (attribute == NULL) is used by the caller to indicate that no + * attributes apply. This callback will be called at most once like + * that. */ + if (attribute == NULL) + /* Translators: This indicates that the content rating for an + * app says it can be used by all ages of people, as it contains + * no objectionable content. */ + description = _("Contains no age-inappropriate content"); + else + description = as_content_rating_attribute_get_description (attribute, value); + + g_ptr_array_add (descriptions, (gpointer) description); +} + +static gchar * +build_age_rating_description (AsContentRating *content_rating) +{ + g_autoptr(GPtrArray) descriptions = g_ptr_array_new_with_free_func (NULL); + + gs_age_rating_context_dialog_process_attributes (content_rating, + TRUE, + build_age_rating_description_cb, + descriptions); + + g_ptr_array_add (descriptions, NULL); + /* Translators: This string is used to join various other translated + * strings into an inline list of reasons why an app has been given a + * certain content rating. For example: + * “References to alcoholic beverages; Moderated chat functionality between users” + * If concatenating strings as a list using a separator like this is not + * possible in your language, please file an issue against gnome-software: + * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/ */ + return g_strjoinv (_("; "), (gchar **) descriptions->pdata); +} + +static void +update_age_rating_tile (GsAppContextBar *self) +{ + g_autoptr(AsContentRating) content_rating = NULL; + gboolean is_unknown; + g_autofree gchar *description = NULL; + + g_assert (self->app != NULL); + + /* Don’t show the age rating tile for non-desktop apps. */ + if (!show_tile_for_non_applications (self, AGE_RATING_TILE)) + return; + + content_rating = gs_app_dup_content_rating (self->app); + gs_age_rating_context_dialog_update_lozenge (self->app, + GS_LOZENGE (self->tiles[AGE_RATING_TILE].lozenge), + &is_unknown); + + /* Description */ + if (content_rating == NULL || is_unknown) { + description = g_strdup (_("No age rating information available")); + } else { + description = build_age_rating_description (content_rating); + } + + gtk_label_set_text (self->tiles[AGE_RATING_TILE].description, description); + + /* Disable the button if no content rating information is available, as + * it would only show a dialogue full of rows saying ‘Unknown’ */ + gtk_widget_set_sensitive (self->tiles[AGE_RATING_TILE].tile, (content_rating != NULL)); +} + +static void +update_tiles (GsAppContextBar *self) +{ + if (self->app == NULL) + return; + + update_storage_tile (self); + update_safety_tile (self); + update_hardware_support_tile (self); + update_age_rating_tile (self); +} + +static void +app_notify_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GsAppContextBar *self = GS_APP_CONTEXT_BAR (user_data); + + update_tiles (self); +} + +static void +tile_clicked_cb (GtkWidget *widget, + gpointer user_data) +{ + GsAppContextBar *self = GS_APP_CONTEXT_BAR (user_data); + AdwDialog *dialog; + + if (widget == self->tiles[STORAGE_TILE].tile) + dialog = ADW_DIALOG (gs_storage_context_dialog_new (self->app)); + else if (widget == self->tiles[SAFETY_TILE].tile) + dialog = ADW_DIALOG (gs_safety_context_dialog_new (self->app)); + else if (widget == self->tiles[HARDWARE_SUPPORT_TILE].tile) + dialog = ADW_DIALOG (gs_hardware_support_context_dialog_new (self->app)); + else if (widget == self->tiles[AGE_RATING_TILE].tile) + dialog = ADW_DIALOG (gs_age_rating_context_dialog_new (self->app)); + else + g_assert_not_reached (); + + adw_dialog_present (dialog, GTK_WIDGET (self)); + +} + +static void +gs_app_context_bar_init (GsAppContextBar *self) +{ + g_type_ensure (GS_TYPE_LOZENGE); + + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +gs_app_context_bar_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsAppContextBar *self = GS_APP_CONTEXT_BAR (object); + + switch ((GsAppContextBarProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_app_context_bar_get_app (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_context_bar_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsAppContextBar *self = GS_APP_CONTEXT_BAR (object); + + switch ((GsAppContextBarProperty) prop_id) { + case PROP_APP: + gs_app_context_bar_set_app (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_context_bar_dispose (GObject *object) +{ + GsAppContextBar *self = GS_APP_CONTEXT_BAR (object); + + if (self->app_notify_handler != 0) { + g_signal_handler_disconnect (self->app, self->app_notify_handler); + self->app_notify_handler = 0; + } + g_clear_object (&self->app); + + G_OBJECT_CLASS (gs_app_context_bar_parent_class)->dispose (object); +} + +static void +gs_app_context_bar_class_init (GsAppContextBarClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_app_context_bar_get_property; + object_class->set_property = gs_app_context_bar_set_property; + object_class->dispose = gs_app_context_bar_dispose; + + /** + * GsAppContextBar:app: (nullable) + * + * The app to display the context details for. + * + * This may be %NULL; if so, the content of the widget will be + * undefined. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_css_name (widget_class, "app-context-bar"); + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-app-context-bar.ui"); + + gtk_widget_class_bind_template_child_full (widget_class, "storage_tile", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[STORAGE_TILE].tile)); + gtk_widget_class_bind_template_child_full (widget_class, "storage_tile_lozenge", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[STORAGE_TILE].lozenge)); + gtk_widget_class_bind_template_child_full (widget_class, "storage_tile_title", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[STORAGE_TILE].title)); + gtk_widget_class_bind_template_child_full (widget_class, "storage_tile_description", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[STORAGE_TILE].description)); + gtk_widget_class_bind_template_child_full (widget_class, "safety_tile", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[SAFETY_TILE].tile)); + gtk_widget_class_bind_template_child_full (widget_class, "safety_tile_lozenge", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[SAFETY_TILE].lozenge)); + gtk_widget_class_bind_template_child_full (widget_class, "safety_tile_title", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[SAFETY_TILE].title)); + gtk_widget_class_bind_template_child_full (widget_class, "safety_tile_description", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[SAFETY_TILE].description)); + gtk_widget_class_bind_template_child_full (widget_class, "hardware_support_tile", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[HARDWARE_SUPPORT_TILE].tile)); + gtk_widget_class_bind_template_child_full (widget_class, "hardware_support_tile_lozenge", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[HARDWARE_SUPPORT_TILE].lozenge)); + gtk_widget_class_bind_template_child_full (widget_class, "hardware_support_tile_title", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[HARDWARE_SUPPORT_TILE].title)); + gtk_widget_class_bind_template_child_full (widget_class, "hardware_support_tile_description", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[HARDWARE_SUPPORT_TILE].description)); + gtk_widget_class_bind_template_child_full (widget_class, "age_rating_tile", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[AGE_RATING_TILE].tile)); + gtk_widget_class_bind_template_child_full (widget_class, "age_rating_tile_lozenge", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[AGE_RATING_TILE].lozenge)); + gtk_widget_class_bind_template_child_full (widget_class, "age_rating_tile_title", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[AGE_RATING_TILE].title)); + gtk_widget_class_bind_template_child_full (widget_class, "age_rating_tile_description", FALSE, G_STRUCT_OFFSET (GsAppContextBar, tiles[AGE_RATING_TILE].description)); + gtk_widget_class_bind_template_callback (widget_class, tile_clicked_cb); +} + +/** + * gs_app_context_bar_new: + * @app: (nullable): the app to display context tiles for, or %NULL + * + * Create a new #GsAppContextBar and set its initial app to @app. + * + * Returns: (transfer full): a new #GsAppContextBar + * Since: 41 + */ +GtkWidget * +gs_app_context_bar_new (GsApp *app) +{ + g_return_val_if_fail (app == NULL || GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_APP_CONTEXT_BAR, + "app", app, + NULL); +} + +/** + * gs_app_context_bar_get_app: + * @self: a #GsAppContextBar + * + * Gets the value of #GsAppContextBar:app. + * + * Returns: (nullable) (transfer none): app whose context tiles are being + * displayed, or %NULL if none is set + * Since: 41 + */ +GsApp * +gs_app_context_bar_get_app (GsAppContextBar *self) +{ + g_return_val_if_fail (GS_IS_APP_CONTEXT_BAR (self), NULL); + + return self->app; +} + +/** + * gs_app_context_bar_set_app: + * @self: a #GsAppContextBar + * @app: (nullable) (transfer none): the app to display context tiles for, + * or %NULL for none + * + * Set the value of #GsAppContextBar:app. + * + * Since: 41 + */ +void +gs_app_context_bar_set_app (GsAppContextBar *self, + GsApp *app) +{ + g_return_if_fail (GS_IS_APP_CONTEXT_BAR (self)); + g_return_if_fail (app == NULL || GS_IS_APP (app)); + + if (app == self->app) + return; + + if (self->app_notify_handler != 0) { + g_signal_handler_disconnect (self->app, self->app_notify_handler); + self->app_notify_handler = 0; + } + + g_set_object (&self->app, app); + + if (self->app != NULL) + self->app_notify_handler = g_signal_connect (self->app, "notify", G_CALLBACK (app_notify_cb), self); + + /* Update the tiles. */ + update_tiles (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); +} diff --git a/src/gs-app-context-bar.h b/src/gs-app-context-bar.h new file mode 100644 index 0000000..c99964b --- /dev/null +++ b/src/gs-app-context-bar.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_CONTEXT_BAR (gs_app_context_bar_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppContextBar, gs_app_context_bar, GS, APP_CONTEXT_BAR, GtkBox) + +GtkWidget *gs_app_context_bar_new (GsApp *app); + +GsApp *gs_app_context_bar_get_app (GsAppContextBar *self); +void gs_app_context_bar_set_app (GsAppContextBar *self, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-app-context-bar.ui b/src/gs-app-context-bar.ui new file mode 100644 index 0000000..dd26cb4 --- /dev/null +++ b/src/gs-app-context-bar.ui @@ -0,0 +1,257 @@ + + + + + + + vertical + + + + + + + + diff --git a/src/gs-app-details-page.c b/src/gs-app-details-page.c new file mode 100644 index 0000000..6878434 --- /dev/null +++ b/src/gs-app-details-page.c @@ -0,0 +1,482 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * Copyright (C) 2021 Purism SPC + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-app-details-page + * @title: GsAppDetailsPage + * @include: gnome-software.h + * @stability: Stable + * @short_description: A small page showing an app's details + * + * This is a page from #GsUpdateDialog. + */ + +#include "config.h" + +#include + +#include "gs-app-details-page.h" +#include "gs-app-row.h" +#include "gs-update-list.h" +#include "gs-common.h" + +typedef enum { + PROP_APP = 1, + PROP_PLUGIN_LOADER, +} GsAppDetailsPageProperty; + +static GParamSpec *obj_props[PROP_PLUGIN_LOADER + 1] = { NULL, }; + +struct _GsAppDetailsPage +{ + GtkBox parent_instance; + + GtkStack *stack_details; + GtkWidget *label_details; + GtkWidget *permissions_section; + GtkWidget *permissions_section_list; + GtkWidget *status_page; + GtkWidget *status_page_clamp; + + GsPluginLoader *plugin_loader; /* (owned) */ + GsApp *app; /* (owned) (nullable) */ + GCancellable *refine_cancellable; /* (owned) (nullable) */ +}; + +G_DEFINE_TYPE (GsAppDetailsPage, gs_app_details_page, ADW_TYPE_NAVIGATION_PAGE) + +static const struct { + GsAppPermissionsFlags permission; + const char *title; + const char *subtitle; +} permission_display_data[] = { + { GS_APP_PERMISSIONS_FLAGS_NETWORK, N_("Network"), N_("Can communicate over the network") }, + { GS_APP_PERMISSIONS_FLAGS_SYSTEM_BUS, N_("System Services"), N_("Can access D-Bus services on the system bus") }, + { GS_APP_PERMISSIONS_FLAGS_SESSION_BUS, N_("Session Services"), N_("Can access D-Bus services on the session bus") }, + { GS_APP_PERMISSIONS_FLAGS_DEVICES, N_("Devices"), N_("Can access arbitrary devices such as webcams") }, + { GS_APP_PERMISSIONS_FLAGS_INPUT_DEVICES, N_("Devices"), N_("Can access input devices") }, + { GS_APP_PERMISSIONS_FLAGS_AUDIO_DEVICES, N_("Devices"), N_("Can access microphones and play audio") }, + { GS_APP_PERMISSIONS_FLAGS_SYSTEM_DEVICES, N_("Devices"), N_("Can access system device files") }, + { GS_APP_PERMISSIONS_FLAGS_SCREEN, N_("Screen contents"), N_("Can access screen contents") }, + { GS_APP_PERMISSIONS_FLAGS_HOME_FULL, N_("Home folder"), N_("Can view, edit and create files") }, + { GS_APP_PERMISSIONS_FLAGS_HOME_READ, N_("Home folder"), N_("Can view files") }, + { GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL, N_("File system"), N_("Can view, edit and create files") }, + { GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ, N_("File system"), N_("Can view files") }, + /* The GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER is used only as a flag, with actual files being part of the read/full lists */ + { GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL, N_("Downloads folder"), N_("Can view, edit and create files") }, + { GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_READ, N_("Downloads folder"), N_("Can view files") }, + { GS_APP_PERMISSIONS_FLAGS_SETTINGS, N_("Settings"), N_("Can view and change any settings") }, + { GS_APP_PERMISSIONS_FLAGS_X11, N_("Legacy display system"), N_("Uses an old, insecure display system") }, + { GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX, N_("Sandbox escape"), N_("Can escape the sandbox and circumvent any other restrictions") }, +}; + +static void +add_permissions_row (GsAppDetailsPage *page, + const gchar *title, + const gchar *subtitle, + gboolean is_warning_row) +{ + GtkWidget *row, *image; + + row = adw_action_row_new (); + if (is_warning_row) + gtk_widget_add_css_class (row, "permission-row-warning"); + + image = gtk_image_new_from_icon_name ("permissions-warning-symbolic"); + if (!is_warning_row) + gtk_widget_set_opacity (image, 0); + + adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (row), FALSE); + adw_action_row_add_prefix (ADW_ACTION_ROW (row), image); + adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), title); + adw_action_row_set_subtitle (ADW_ACTION_ROW (row), subtitle); + + gtk_list_box_append (GTK_LIST_BOX (page->permissions_section_list), row); +} + +static void +populate_permissions_filesystem (GsAppDetailsPage *page, + const GPtrArray *titles, /* (element-type utf-8) */ + const gchar *subtitle, + gboolean is_warning_row) +{ + if (titles == NULL) + return; + + for (guint i = 0; i < titles->len; i++) { + const gchar *title = g_ptr_array_index (titles, i); + add_permissions_row (page, title, subtitle, is_warning_row); + } +} + +static void +populate_permissions_section (GsAppDetailsPage *page, + GsAppPermissions *permissions) +{ + GsAppPermissionsFlags flags = gs_app_permissions_get_flags (permissions); + + gs_widget_remove_all (page->permissions_section_list, (GsRemoveFunc) gtk_list_box_remove); + + for (gsize i = 0; i < G_N_ELEMENTS (permission_display_data); i++) { + if ((flags & permission_display_data[i].permission) == 0) + continue; + + add_permissions_row (page, + _(permission_display_data[i].title), + _(permission_display_data[i].subtitle), + (permission_display_data[i].permission & ~MEDIUM_PERMISSIONS) != 0); + } + + populate_permissions_filesystem (page, + gs_app_permissions_get_filesystem_read (permissions), + _("Can view files"), + (GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ & ~MEDIUM_PERMISSIONS) != 0); + + populate_permissions_filesystem (page, + gs_app_permissions_get_filesystem_full (permissions), + _("Can view, edit and create files"), + (GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL & ~MEDIUM_PERMISSIONS) != 0); +} + +static void +set_update_description (GsAppDetailsPage *self, + gboolean can_call_refine); + +static void +refine_app_finished_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + GsAppDetailsPage *self = user_data; + g_autoptr(GError) error = NULL; + + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_clear_object (&self->refine_cancellable); + g_warning ("Failed to refine app: %s", error->message); + } + return; + } + + g_clear_object (&self->refine_cancellable); + + set_update_description (self, FALSE); +} + +static void +set_update_description (GsAppDetailsPage *self, + gboolean can_call_refine) +{ + const gchar *update_details; + + update_details = gs_app_get_update_details_markup (self->app); + if (update_details == NULL && self->plugin_loader != NULL && + can_call_refine && !gs_app_get_update_details_set (self->app)) { + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* to not refine the app again, when there is no description */ + gs_app_set_update_details_text (self->app, NULL); + + /* Keep the label visible, to have allocated proper height for the row, + thus the row does not resize when the details are on-line text only. + It will resize when the details are multiple lines of text. */ + gtk_label_set_text (GTK_LABEL (self->label_details), ""); + gtk_stack_set_visible_child_name (self->stack_details, "spinner"); + + g_assert (self->refine_cancellable == NULL); + self->refine_cancellable = g_cancellable_new (); + plugin_job = gs_plugin_job_refine_new_for_app (self->app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS); + gs_plugin_job_set_interactive (plugin_job, TRUE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->refine_cancellable, + refine_app_finished_cb, + self); + + return; + } + + if (update_details == NULL || *update_details == '\0') { + /* TRANSLATORS: this is where the packager did not write + * a description for the update */ + update_details = _("No update description available."); + } + + gtk_label_set_markup (GTK_LABEL (self->label_details), update_details); + gtk_stack_set_visible_child_name (self->stack_details, "label"); +} + +static void +set_updates_description_ui (GsAppDetailsPage *page, GsApp *app) +{ + g_autoptr(GIcon) icon = NULL; + guint icon_size; + GdkDisplay *display; + g_autoptr (GtkIconPaintable) paintable = NULL; + g_autofree gchar *escaped_summary = NULL; + + if (page->refine_cancellable != NULL) { + g_cancellable_cancel (page->refine_cancellable); + g_clear_object (&page->refine_cancellable); + } + + /* FIXME support app == NULL */ + + /* set page title */ + adw_navigation_page_set_title (ADW_NAVIGATION_PAGE (page), _("Update Details")); + + /* set update header */ + set_update_description (page, TRUE); + if (gs_app_get_summary (app) != NULL) + escaped_summary = g_markup_escape_text (gs_app_get_summary (app), -1); + adw_status_page_set_title (ADW_STATUS_PAGE (page->status_page), gs_app_get_name (app)); + adw_status_page_set_description (ADW_STATUS_PAGE (page->status_page), escaped_summary != NULL ? escaped_summary : ""); + + /* set the icon; fall back to 64px if 96px isn’t available, which sometimes + * happens at 2× scale factor (hi-DPI) */ + icon_size = 96; + icon = gs_app_get_icon_for_size (app, + icon_size, + gtk_widget_get_scale_factor (GTK_WIDGET (page)), + NULL); + if (icon == NULL) { + icon_size = 64; + icon = gs_app_get_icon_for_size (app, + icon_size, + gtk_widget_get_scale_factor (GTK_WIDGET (page)), + NULL); + } + if (icon == NULL) { + icon_size = 96; + icon = gs_app_get_icon_for_size (app, + icon_size, + gtk_widget_get_scale_factor (GTK_WIDGET (page)), + "org.gnome.Software.Generic"); + } + + display = gdk_display_get_default (); + paintable = gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_for_display (display), + icon, + icon_size, + gtk_widget_get_scale_factor (GTK_WIDGET (page)), + gtk_widget_get_direction (GTK_WIDGET (page)), + GTK_ICON_LOOKUP_FORCE_REGULAR); + adw_status_page_set_paintable (ADW_STATUS_PAGE (page->status_page), GDK_PAINTABLE (paintable)); + + if (gs_app_has_quirk (app, GS_APP_QUIRK_NEW_PERMISSIONS)) { + g_autoptr(GsAppPermissions) permissions = gs_app_dup_update_permissions (app); + gtk_widget_set_visible (page->permissions_section, TRUE); + populate_permissions_section (page, permissions); + } else { + gtk_widget_set_visible (page->permissions_section, FALSE); + } +} + +/** + * gs_app_details_page_get_app: + * @page: a #GsAppDetailsPage + * + * Get the value of #GsAppDetailsPage:app. + * + * Returns: (nullable) (transfer none): the app + * + * Since: 41 + */ +GsApp * +gs_app_details_page_get_app (GsAppDetailsPage *page) +{ + g_return_val_if_fail (GS_IS_APP_DETAILS_PAGE (page), NULL); + return page->app; +} + +/** + * gs_app_details_page_set_app: + * @page: a #GsAppDetailsPage + * @app: (transfer none) (nullable): new app + * + * Set the value of #GsAppDetailsPage:app. + * + * Since: 41 + */ +void +gs_app_details_page_set_app (GsAppDetailsPage *page, GsApp *app) +{ + g_return_if_fail (GS_IS_APP_DETAILS_PAGE (page)); + g_return_if_fail (!app || GS_IS_APP (app)); + + if (page->app == app) + return; + + g_set_object (&page->app, app); + + set_updates_description_ui (page, app); + + g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_APP]); +} + +static void +gs_app_details_page_dispose (GObject *object) +{ + GsAppDetailsPage *page = GS_APP_DETAILS_PAGE (object); + + if (page->refine_cancellable) + g_cancellable_cancel (page->refine_cancellable); + + g_clear_object (&page->refine_cancellable); + g_clear_object (&page->plugin_loader); + g_clear_object (&page->app); + + G_OBJECT_CLASS (gs_app_details_page_parent_class)->dispose (object); +} + +static void +gs_app_details_page_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsAppDetailsPage *page = GS_APP_DETAILS_PAGE (object); + + switch ((GsAppDetailsPageProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_app_details_page_get_app (page)); + break; + case PROP_PLUGIN_LOADER: + g_value_set_object (value, gs_app_details_page_get_plugin_loader (page)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_details_page_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsAppDetailsPage *page = GS_APP_DETAILS_PAGE (object); + + switch ((GsAppDetailsPageProperty) prop_id) { + case PROP_APP: + gs_app_details_page_set_app (page, g_value_get_object (value)); + break; + case PROP_PLUGIN_LOADER: + g_assert (page->plugin_loader == NULL); + page->plugin_loader = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_details_page_init (GsAppDetailsPage *page) +{ + GtkWidget *widget; + + gtk_widget_init_template (GTK_WIDGET (page)); + + /* The "icon-dropshadow" cannot be applied on the top widget, because + it influences also GtkSpinner drawing. The AdwStatusPage does not + provide access to the internal GtkImage widget, which this CSS class + is for, thus do this workaround to set the CSS class on an upper widget + in the AdwStatusPage hierarchy. + * + * FIXME: See https://gitlab.gnome.org/GNOME/libadwaita/-/issues/718 */ + widget = gtk_widget_get_prev_sibling (page->status_page_clamp); + if (widget == NULL) + widget = gtk_widget_get_next_sibling (page->status_page_clamp); + if (widget != NULL) + gtk_widget_add_css_class (widget, "icon-dropshadow"); + else + g_warning ("%s: Failed to find sibling for 'icon-dropshadow'", G_STRFUNC); +} + +static void +gs_app_details_page_class_init (GsAppDetailsPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_app_details_page_dispose; + object_class->get_property = gs_app_details_page_get_property; + object_class->set_property = gs_app_details_page_set_property; + + /** + * GsAppDetailsPage:app: (nullable) + * + * The app to present. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppDetailsPage:plugin-loader: (nullable) + * + * A plugin loader to use to refine apps. + * + * If this is %NULL, no refine will be executed. + * + * Since: 45 + */ + obj_props[PROP_PLUGIN_LOADER] = + g_param_spec_object ("plugin-loader", NULL, NULL, + GS_TYPE_PLUGIN_LOADER, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-app-details-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsAppDetailsPage, stack_details); + gtk_widget_class_bind_template_child (widget_class, GsAppDetailsPage, label_details); + gtk_widget_class_bind_template_child (widget_class, GsAppDetailsPage, permissions_section); + gtk_widget_class_bind_template_child (widget_class, GsAppDetailsPage, permissions_section_list); + gtk_widget_class_bind_template_child (widget_class, GsAppDetailsPage, status_page); + gtk_widget_class_bind_template_child (widget_class, GsAppDetailsPage, status_page_clamp); +} + +/** + * gs_app_details_page_new: + * @plugin_loader: (nullable): a #GsPluginLoader + * + * Create a new #GsAppDetailsPage. + * + * Returns: (transfer full): a new #GsAppDetailsPage + * Since: 45 + */ +GtkWidget * +gs_app_details_page_new (GsPluginLoader *plugin_loader) +{ + g_return_val_if_fail (plugin_loader == NULL || GS_IS_PLUGIN_LOADER (plugin_loader), NULL); + + return g_object_new (GS_TYPE_APP_DETAILS_PAGE, + "plugin-loader", plugin_loader, + NULL); +} + +/** + * gs_app_details_page_get_plugin_loader: + * @page: a #GsAppDetailsPage + * + * Returns the #GsPluginLoader the @page was created with + * + * Returns: (transfer none) (nullable): the #GsPluginLoader the @page was created with + * Since: 45 + **/ +GsPluginLoader * +gs_app_details_page_get_plugin_loader (GsAppDetailsPage *page) +{ + g_return_val_if_fail (GS_IS_APP_DETAILS_PAGE (page), NULL); + + return page->plugin_loader; +} diff --git a/src/gs-app-details-page.h b/src/gs-app-details-page.h new file mode 100644 index 0000000..0aac68f --- /dev/null +++ b/src/gs-app-details-page.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Purism SPC + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_DETAILS_PAGE (gs_app_details_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppDetailsPage, gs_app_details_page, GS, APP_DETAILS_PAGE, AdwNavigationPage) + +GtkWidget *gs_app_details_page_new (GsPluginLoader *plugin_loader); +GsPluginLoader *gs_app_details_page_get_plugin_loader (GsAppDetailsPage *page); +GsApp *gs_app_details_page_get_app (GsAppDetailsPage *page); +void gs_app_details_page_set_app (GsAppDetailsPage *page, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-app-details-page.ui b/src/gs-app-details-page.ui new file mode 100644 index 0000000..4bb09f9 --- /dev/null +++ b/src/gs-app-details-page.ui @@ -0,0 +1,107 @@ + + + + + + diff --git a/src/gs-app-reviews-dialog.c b/src/gs-app-reviews-dialog.c new file mode 100644 index 0000000..8e2bb05 --- /dev/null +++ b/src/gs-app-reviews-dialog.c @@ -0,0 +1,689 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) Adrien Plazas + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-app-reviews-dialog.h" + +#include "gnome-software-private.h" +#include "gs-common.h" +#include "gs-review-row.h" +#include + +struct _GsAppReviewsDialog +{ + AdwDialog parent_instance; + GtkWidget *toast_overlay; + GtkWidget *listbox; + GtkWidget *stack; + + GsPluginLoader *plugin_loader; /* (owned) (nullable) */ + GsApp *app; /* (owned) (nullable) */ + GCancellable *cancellable; /* (owned) */ + GCancellable *refine_cancellable; /* (owned) (nullable) */ + GsOdrsProvider *odrs_provider; /* (nullable) (owned), NULL if reviews are disabled */ +}; + +G_DEFINE_TYPE (GsAppReviewsDialog, gs_app_reviews_dialog, ADW_TYPE_DIALOG) + +typedef enum { + PROP_APP = 1, + PROP_ODRS_PROVIDER, + PROP_PLUGIN_LOADER, +} GsAppReviewsDialogProperty; + +typedef struct { + GsReviewRow *row; /* (not nullable) (unowned) */ + GsAppReviewsDialog *dialog; /* (not nullable) (unowned) */ + GsReviewAction action; +} AsyncReviewData; + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (AsyncReviewData, g_free) + +static GParamSpec *obj_props[PROP_PLUGIN_LOADER + 1] = { NULL, }; + +enum { + SIGNAL_REVIEWS_UPDATED, + SIGNAL_LAST +}; + +static guint signals[SIGNAL_LAST] = { 0 }; + +static void refresh_reviews (GsAppReviewsDialog *self); + +static void +display_error_toast (GsAppReviewsDialog *dialog, + const gchar *error_text) +{ + AdwToast *toast; + + g_return_if_fail (GS_IS_APP_REVIEWS_DIALOG (dialog)); + g_return_if_fail (error_text != NULL); + + toast = adw_toast_new (error_text); + + adw_toast_overlay_add_toast (ADW_TOAST_OVERLAY (dialog->toast_overlay), toast); +} + +static gint +sort_reviews (AsReview **a, AsReview **b) +{ + return -g_date_time_compare (as_review_get_date (*a), as_review_get_date (*b)); +} + +static void +review_action_completed_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsOdrsProvider *odrs_provider = GS_ODRS_PROVIDER (source_object); + g_autoptr(GError) local_error = NULL; + g_autoptr(AsyncReviewData) data = g_steal_pointer (&user_data); + gboolean success; + + /* enable review actions after action completion */ + gs_review_row_actions_set_sensitive (data->row, TRUE); + + if (g_cancellable_is_cancelled (g_task_get_cancellable (G_TASK (result)))) + return; + + switch (data->action) { + case GS_REVIEW_ACTION_UPVOTE: + success = gs_odrs_provider_upvote_review_finish (odrs_provider, result, &local_error); + break; + case GS_REVIEW_ACTION_DOWNVOTE: + success = gs_odrs_provider_downvote_review_finish (odrs_provider, result, &local_error); + break; + case GS_REVIEW_ACTION_REPORT: + success = gs_odrs_provider_report_review_finish (odrs_provider, result, &local_error); + break; + case GS_REVIEW_ACTION_REMOVE: + success = gs_odrs_provider_remove_review_finish (odrs_provider, result, &local_error); + /* update the local app */ + if (success) { + gs_app_remove_review (data->dialog->app, gs_review_row_get_review (data->row)); + refresh_reviews (data->dialog); + } + break; + default: + g_assert_not_reached (); + } + + if (!success) { + const char *translatable_message; + + g_assert (local_error != NULL); + + g_warning ("failed to %s review on %s: %s", + gs_review_row_action_to_string (data->action), + gs_app_get_id (data->dialog->app), + local_error->message); + + if (g_error_matches (local_error, GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA)) { + translatable_message = _("Invalid ratings data received from server"); + } else if (g_error_matches (local_error, GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_SERVER_ERROR)) { + translatable_message = _("Could not communicate with ratings server"); + } else { + /* likely a programming error in gnome-software, so don’t + * waste a translatable string on it */ + translatable_message = local_error->message; + } + + display_error_toast (data->dialog, translatable_message); + return; + } +} + +static void +review_button_clicked_cb (GsReviewRow *row, + GsReviewAction action, + GsAppReviewsDialog *self) +{ + AsReview *review = gs_review_row_get_review (row); + g_autoptr(GError) local_error = NULL; + g_autoptr(AsyncReviewData) data = g_new0 (AsyncReviewData, 1); + + g_assert (self->odrs_provider != NULL); + + data->row = row; + data->dialog = self; + data->action = action; + + /* avoid submitting duplicate requests */ + gs_review_row_actions_set_sensitive (row, FALSE); + + switch (action) { + case GS_REVIEW_ACTION_UPVOTE: + gs_odrs_provider_upvote_review_async (self->odrs_provider, self->app, + review, self->cancellable, + review_action_completed_cb, + g_steal_pointer (&data)); + + return; + case GS_REVIEW_ACTION_DOWNVOTE: + gs_odrs_provider_downvote_review_async (self->odrs_provider, self->app, + review, self->cancellable, + review_action_completed_cb, + g_steal_pointer (&data)); + + return; + case GS_REVIEW_ACTION_REPORT: + gs_odrs_provider_report_review_async (self->odrs_provider, self->app, + review, self->cancellable, + review_action_completed_cb, + g_steal_pointer (&data)); + + return; + case GS_REVIEW_ACTION_REMOVE: + gs_odrs_provider_remove_review_async (self->odrs_provider, self->app, + review, self->cancellable, + review_action_completed_cb, + g_steal_pointer (&data)); + + return; + default: + g_assert_not_reached (); + } +} + +static GSList * /* (transfer container) */ +gather_listbox_rows (GtkWidget *listbox) +{ + GSList *rows = NULL; + GtkWidget *widget; + + widget = gtk_widget_get_first_child (listbox); + while (widget) { + rows = g_slist_prepend (rows, widget); + widget = gtk_widget_get_next_sibling (widget); + } + + return g_slist_reverse (rows); +} + +static void +populate_reviews (GsAppReviewsDialog *self) +{ + GPtrArray *reviews; + GSList *rows, *link; + gboolean show_reviews = FALSE; + guint64 possible_actions = 0; + guint i; + GsReviewAction all_actions[] = { + GS_REVIEW_ACTION_UPVOTE, + GS_REVIEW_ACTION_DOWNVOTE, + GS_REVIEW_ACTION_REPORT, + GS_REVIEW_ACTION_REMOVE, + }; + + /* nothing to show */ + if (self->app == NULL) { + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "empty"); + + return; + } + + /* show or hide the entire reviews section */ + switch (gs_app_get_kind (self->app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + case AS_COMPONENT_KIND_FONT: + case AS_COMPONENT_KIND_INPUT_METHOD: + case AS_COMPONENT_KIND_WEB_APP: + /* don't show a missing rating on a local file */ + if (gs_app_get_state (self->app) != GS_APP_STATE_AVAILABLE_LOCAL && + self->odrs_provider != NULL) + show_reviews = TRUE; + break; + default: + break; + } + + /* some apps are unreviewable */ + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NOT_REVIEWABLE)) + show_reviews = FALSE; + + /* check that reviews are available */ + reviews = gs_app_get_reviews (self->app); + if (reviews->len == 0) + show_reviews = FALSE; + + if (!show_reviews) { + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "empty"); + + return; + } + + /* find what the plugins support */ + for (i = 0; i < G_N_ELEMENTS (all_actions); i++) { + if (self->odrs_provider != NULL) + possible_actions |= (1u << all_actions[i]); + } + + /* add all the reviews */ + rows = gather_listbox_rows (self->listbox); + g_ptr_array_sort (reviews, (GCompareFunc) sort_reviews); + for (i = 0, link = rows; i < reviews->len; i++, link = g_slist_next (link)) { + AsReview *review = g_ptr_array_index (reviews, i); + GtkWidget *row = NULL; + guint64 actions; + + /* Try to merge with existing rows, to preserve cursor (focused) row + and window scroll position. */ + if (link != NULL) { + GtkWidget *existing_row = link->data; + if (gs_review_row_get_review (GS_REVIEW_ROW (existing_row)) == review) + row = existing_row; + else + gtk_list_box_remove (GTK_LIST_BOX (self->listbox), existing_row); + } + + if (row == NULL) { + row = gs_review_row_new (review); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE); + gtk_list_box_append (GTK_LIST_BOX (self->listbox), row); + + g_signal_connect (row, "button-clicked", + G_CALLBACK (review_button_clicked_cb), self); + } + + if (as_review_get_flags (review) & AS_REVIEW_FLAG_SELF) + actions = possible_actions & (1 << GS_REVIEW_ACTION_REMOVE); + else + actions = possible_actions & ~(1u << GS_REVIEW_ACTION_REMOVE); + gs_review_row_set_actions (GS_REVIEW_ROW (row), actions); + gs_review_row_actions_set_sensitive (GS_REVIEW_ROW (row), + GS_IS_PLUGIN_LOADER (self->plugin_loader) && gs_plugin_loader_get_network_available (self->plugin_loader)); + } + + while (link != NULL) { + GtkWidget *existing_row = link->data; + gtk_list_box_remove (GTK_LIST_BOX (self->listbox), existing_row); + link = g_slist_next (link); + } + + g_slist_free (rows); + + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "reviews"); +} + +static void +refresh_reviews (GsAppReviewsDialog *self) +{ + if (!gtk_widget_get_realized (GTK_WIDGET (self))) + return; + + populate_reviews (self); + + g_signal_emit (self, signals[SIGNAL_REVIEWS_UPDATED], 0); +} + +static void +gs_app_reviews_dialog_app_refine_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + GsAppReviewsDialog *self = user_data; + g_autoptr(GError) error = NULL; + + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_warning ("failed to refine %s: %s", + gs_app_get_id (self->app), + error->message); + } + return; + } + + refresh_reviews (self); +} + +static void +gs_app_reviews_dialog_app_refine (GsAppReviewsDialog *self) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + + if (self->refine_cancellable != NULL) { + g_cancellable_cancel (self->refine_cancellable); + g_clear_object (&self->refine_cancellable); + } + + if (self->plugin_loader == NULL || self->app == NULL) + return; + + self->refine_cancellable = g_cancellable_new (); + + /* If this task fails (e.g. because we have no networking) then + * it's of no huge importance if we don't get the required data. + */ + plugin_job = gs_plugin_job_refine_new_for_app (self->app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->refine_cancellable, + gs_app_reviews_dialog_app_refine_cb, + self); +} + +static void +gs_app_reviews_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsAppReviewsDialog *self = GS_APP_REVIEWS_DIALOG (object); + + switch ((GsAppReviewsDialogProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_app_reviews_dialog_get_app (self)); + break; + case PROP_ODRS_PROVIDER: + g_value_set_object (value, gs_app_reviews_dialog_get_odrs_provider (self)); + break; + case PROP_PLUGIN_LOADER: + g_value_set_object (value, gs_app_reviews_dialog_get_plugin_loader (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_reviews_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsAppReviewsDialog *self = GS_APP_REVIEWS_DIALOG (object); + + switch ((GsAppReviewsDialogProperty) prop_id) { + case PROP_APP: + gs_app_reviews_dialog_set_app (self, g_value_get_object (value)); + break; + case PROP_ODRS_PROVIDER: + gs_app_reviews_dialog_set_odrs_provider (self, g_value_get_object (value)); + break; + case PROP_PLUGIN_LOADER: + gs_app_reviews_dialog_set_plugin_loader (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_reviews_dialog_dispose (GObject *object) +{ + GsAppReviewsDialog *self = GS_APP_REVIEWS_DIALOG (object); + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + + if (self->refine_cancellable != NULL) { + g_cancellable_cancel (self->refine_cancellable); + g_clear_object (&self->refine_cancellable); + } + + if (self->plugin_loader) + g_signal_handlers_disconnect_by_func (self->plugin_loader, + refresh_reviews, self); + g_clear_object (&self->plugin_loader); + + g_clear_object (&self->app); + g_clear_object (&self->odrs_provider); + + G_OBJECT_CLASS (gs_app_reviews_dialog_parent_class)->dispose (object); +} + +static void +gs_app_reviews_dialog_class_init (GsAppReviewsDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_app_reviews_dialog_get_property; + object_class->set_property = gs_app_reviews_dialog_set_property; + object_class->dispose = gs_app_reviews_dialog_dispose; + + /** + * GsAppReviewsDialog:app: (nullable) + * + * An app whose reviews should be displayed. + * + * If this is %NULL, ratings and reviews will be disabled. + * + * Since: 42 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsAppReviewsDialog:odrs-provider: (nullable) + * + * An ODRS provider to give access to ratings and reviews information + * for the app being displayed. + * + * If this is %NULL, ratings and reviews will be disabled. + * + * Since: 42 + */ + obj_props[PROP_ODRS_PROVIDER] = + g_param_spec_object ("odrs-provider", NULL, NULL, + GS_TYPE_ODRS_PROVIDER, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsAppReviewsDialog:plugin-loader: (nullable) + * + * A plugin loader to provide network availability. + * + * If this is %NULL, ratings and reviews will be disabled. + * + * Since: 42 + */ + obj_props[PROP_PLUGIN_LOADER] = + g_param_spec_object ("plugin-loader", NULL, NULL, + GS_TYPE_PLUGIN_LOADER, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + /** + * GsAppReviewsDialog::reviews-updated: + * + * Emitted when reviews are updated. + * + * Since: 42 + */ + signals[SIGNAL_REVIEWS_UPDATED] = + g_signal_new ("reviews-updated", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 0); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-app-reviews-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsAppReviewsDialog, toast_overlay); + gtk_widget_class_bind_template_child (widget_class, GsAppReviewsDialog, listbox); + gtk_widget_class_bind_template_child (widget_class, GsAppReviewsDialog, stack); +} + +static void +gs_app_reviews_dialog_init (GsAppReviewsDialog *self) +{ + self->cancellable = g_cancellable_new (); + + gtk_widget_init_template (GTK_WIDGET (self)); + + g_signal_connect_swapped (self, "realize", + G_CALLBACK (refresh_reviews), self); +} + +/** + * gs_app_reviews_dialog_new: + * @app: (nullable): a #GsApp, or %NULL + * @odrs_provider: (nullable): a #GsOdrsProvider, or %NULL + * @plugin_loader: (nullable): a #GsPluginLoader, or %NULL + * + * Create a new #GsAppReviewsDialog and set its initial app, ODRS + * provider and plugin loader to @app, @odrs_provider and + * @plugin_loader respectively. + * + * Returns: (transfer full): a new #GsAppReviewsDialog + * Since: 42 + */ +GtkWidget * +gs_app_reviews_dialog_new (GsApp *app, GsOdrsProvider *odrs_provider, GsPluginLoader *plugin_loader) +{ + GsAppReviewsDialog *self; + + g_return_val_if_fail (app == NULL || GS_IS_APP (app), NULL); + g_return_val_if_fail (odrs_provider == NULL || GS_IS_ODRS_PROVIDER (odrs_provider), NULL); + g_return_val_if_fail (plugin_loader == NULL ||GS_IS_PLUGIN_LOADER (plugin_loader), NULL); + + self = g_object_new (GS_TYPE_APP_REVIEWS_DIALOG, + "app", app, + "odrs-provider", odrs_provider, + "plugin-loader", plugin_loader, + NULL); + + return GTK_WIDGET (self); +} + +/** + * gs_app_reviews_dialog_get_app: + * @self: a #GsAppReviewsDialog + * + * Get the value of #GsAppReviewsDialog:app. + * + * Returns: (nullable) (transfer none): a #GsApp, or %NULL if unset + * Since: 42 + */ +GsApp * +gs_app_reviews_dialog_get_app (GsAppReviewsDialog *self) +{ + g_return_val_if_fail (GS_IS_APP_REVIEWS_DIALOG (self), NULL); + + return self->app; +} + +/** + * gs_app_reviews_dialog_set_app: + * @self: a #GsAppReviewsDialog + * @app: (nullable) (transfer none): new #GsApp or %NULL + * + * Set the value of #GsAppReviewsDialog:app. + * + * Since: 42 + */ +void +gs_app_reviews_dialog_set_app (GsAppReviewsDialog *self, + GsApp *app) +{ + g_return_if_fail (GS_IS_APP_REVIEWS_DIALOG (self)); + g_return_if_fail (app == NULL || GS_IS_APP (app)); + + if (g_set_object (&self->app, app)) { + gs_app_reviews_dialog_app_refine (self); + refresh_reviews (self); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); + } +} + +/** + * gs_app_reviews_dialog_get_odrs_provider: + * @self: a #GsAppReviewsDialog + * + * Get the value of #GsAppReviewsDialog:odrs-provider. + * + * Returns: (nullable) (transfer none): a #GsOdrsProvider, or %NULL if unset + * Since: 42 + */ +GsOdrsProvider * +gs_app_reviews_dialog_get_odrs_provider (GsAppReviewsDialog *self) +{ + g_return_val_if_fail (GS_IS_APP_REVIEWS_DIALOG (self), NULL); + + return self->odrs_provider; +} + +/** + * gs_app_reviews_dialog_set_odrs_provider: + * @self: a #GsAppReviewsDialog + * @odrs_provider: (nullable) (transfer none): new #GsOdrsProvider or %NULL + * + * Set the value of #GsAppReviewsDialog:odrs-provider. + * + * Since: 42 + */ +void +gs_app_reviews_dialog_set_odrs_provider (GsAppReviewsDialog *self, + GsOdrsProvider *odrs_provider) +{ + g_return_if_fail (GS_IS_APP_REVIEWS_DIALOG (self)); + g_return_if_fail (odrs_provider == NULL || GS_IS_ODRS_PROVIDER (odrs_provider)); + + if (g_set_object (&self->odrs_provider, odrs_provider)) { + refresh_reviews (self); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_ODRS_PROVIDER]); + } +} + +/** + * gs_app_reviews_dialog_get_plugin_loader: + * @self: a #GsAppReviewsDialog + * + * Get the value of #GsAppReviewsDialog:plugin-loader. + * + * Returns: (nullable) (transfer none): a #GsPluginLoader, or %NULL if unset + * Since: 42 + */ +GsPluginLoader * +gs_app_reviews_dialog_get_plugin_loader (GsAppReviewsDialog *self) +{ + g_return_val_if_fail (GS_IS_APP_REVIEWS_DIALOG (self), NULL); + + return self->plugin_loader; +} + +/** + * gs_app_reviews_dialog_set_plugin_loader: + * @self: a #GsAppReviewsDialog + * @plugin_loader: (nullable) (transfer none): new #GsPluginLoader or %NULL + * + * Set the value of #GsAppReviewsDialog:plugin-loader. + * + * Since: 42 + */ +void +gs_app_reviews_dialog_set_plugin_loader (GsAppReviewsDialog *self, + GsPluginLoader *plugin_loader) +{ + g_return_if_fail (GS_IS_APP_REVIEWS_DIALOG (self)); + g_return_if_fail (plugin_loader == NULL || GS_IS_PLUGIN_LOADER (plugin_loader)); + + if (self->plugin_loader) + g_signal_handlers_disconnect_by_func (self->plugin_loader, + refresh_reviews, self); + + if (g_set_object (&self->plugin_loader, plugin_loader)) { + gs_app_reviews_dialog_app_refine (self); + g_signal_connect_swapped (self->plugin_loader, "notify::network-available", + G_CALLBACK (refresh_reviews), self); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_PLUGIN_LOADER]); + } +} diff --git a/src/gs-app-reviews-dialog.h b/src/gs-app-reviews-dialog.h new file mode 100644 index 0000000..d90eed6 --- /dev/null +++ b/src/gs-app-reviews-dialog.h @@ -0,0 +1,37 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Adrien Plazas + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_REVIEWS_DIALOG (gs_app_reviews_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppReviewsDialog, gs_app_reviews_dialog, GS, APP_REVIEWS_DIALOG, AdwDialog) + +GtkWidget *gs_app_reviews_dialog_new (GsApp *app, + GsOdrsProvider *odrs_provider, + GsPluginLoader *plugin_loader); + +GsApp *gs_app_reviews_dialog_get_app (GsAppReviewsDialog *self); +void gs_app_reviews_dialog_set_app (GsAppReviewsDialog *self, + GsApp *app); + +GsOdrsProvider *gs_app_reviews_dialog_get_odrs_provider (GsAppReviewsDialog *self); +void gs_app_reviews_dialog_set_odrs_provider (GsAppReviewsDialog *self, + GsOdrsProvider *odrs_provider); + +GsPluginLoader *gs_app_reviews_dialog_get_plugin_loader (GsAppReviewsDialog *self); +void gs_app_reviews_dialog_set_plugin_loader (GsAppReviewsDialog *self, + GsPluginLoader *plugin_loader); + +G_END_DECLS diff --git a/src/gs-app-reviews-dialog.ui b/src/gs-app-reviews-dialog.ui new file mode 100644 index 0000000..e30d088 --- /dev/null +++ b/src/gs-app-reviews-dialog.ui @@ -0,0 +1,58 @@ + + + + + + diff --git a/src/gs-app-row.c b/src/gs-app-row.c new file mode 100644 index 0000000..360c209 --- /dev/null +++ b/src/gs-app-row.c @@ -0,0 +1,1365 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-app-row.h" +#include "gs-star-widget.h" +#include "gs-progress-button.h" +#include "gs-common.h" + +typedef struct +{ + GsApp *app; + GtkWidget *image; + GtkWidget *name_box; + GtkWidget *name_label; + GtkWidget *version_box; + GtkWidget *version_current_label; + GtkWidget *version_arrow_label; + GtkWidget *version_update_label; + GtkWidget *system_updates_label; /* Only for "System Updates" app */ + GtkWidget *update_critical_image; + GtkWidget *star; + GtkWidget *description_label; + GtkWidget *button_box; + GtkWidget *button_revealer; + GtkWidget *button; + GtkWidget *spinner; + GtkWidget *label; + GtkWidget *box_tag; + GtkWidget *label_warning; + GtkWidget *label_origin; + GtkWidget *label_installed_box; + GtkWidget *label_installed; + GtkWidget *label_app_size; + gboolean colorful; + gboolean show_buttons; + gboolean show_rating; + gboolean show_description; + gboolean show_source; + gboolean show_update; + gboolean show_installed_size; + gboolean show_installed; + guint pending_refresh_id; + guint unreveal_in_idle_id; + gboolean is_narrow; +} GsAppRowPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsAppRow, gs_app_row, GTK_TYPE_LIST_BOX_ROW) + +enum { + SIGNAL_BUTTON_CLICKED, + SIGNAL_UNREVEALED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +typedef enum { + PROP_APP = 1, + PROP_COLORFUL, + PROP_SHOW_DESCRIPTION, + PROP_SHOW_SOURCE, + PROP_SHOW_BUTTONS, + PROP_SHOW_RATING, + PROP_SHOW_UPDATE, + PROP_SHOW_INSTALLED_SIZE, + PROP_SHOW_INSTALLED, + PROP_IS_NARROW, +} GsAppRowProperty; + +static GParamSpec *obj_props[PROP_IS_NARROW + 1] = { NULL, }; + +/* + * gs_app_row_get_description: + * + * Return value: PangoMarkup or text + */ +static GString * +gs_app_row_get_description (GsAppRow *app_row, + gboolean *out_is_markup) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + const gchar *tmp = NULL; + + *out_is_markup = FALSE; + + /* convert the markdown update description into PangoMarkup */ + if (priv->show_update) { + tmp = gs_app_get_update_details_markup (priv->app); + if (tmp != NULL && tmp[0] != '\0') { + *out_is_markup = TRUE; + return g_string_new (tmp); + } + } + + /* if missing summary is set, return it without escaping in order to + * correctly show hyperlinks */ + if (gs_app_get_state (priv->app) == GS_APP_STATE_UNAVAILABLE) { + tmp = gs_app_get_summary_missing (priv->app); + if (tmp != NULL && tmp[0] != '\0') + return g_string_new (tmp); + } + + /* try all these things in order */ + if (tmp == NULL || (tmp != NULL && tmp[0] == '\0')) + tmp = gs_app_get_summary (priv->app); + if (tmp == NULL || (tmp != NULL && tmp[0] == '\0')) + tmp = gs_app_get_description (priv->app); + if (tmp == NULL || (tmp != NULL && tmp[0] == '\0')) + tmp = gs_app_get_name (priv->app); + if (tmp == NULL) + return NULL; + return g_string_new (tmp); +} + +static void +gs_app_row_update_button_reveal (GsAppRow *app_row) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + gboolean sensitive = gtk_widget_get_sensitive (priv->button); + + gtk_widget_set_visible (priv->button_revealer, sensitive || !priv->is_narrow); +} + +static void +gs_app_row_refresh_button (GsAppRow *app_row, gboolean missing_search_result) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + /* disabled */ + if (!priv->show_buttons) { + gs_app_row_update_button_reveal (app_row); + gtk_widget_set_visible (priv->button, FALSE); + return; + } + + gtk_widget_set_sensitive (priv->button, TRUE); + + /* label */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_UNAVAILABLE: + gtk_widget_set_visible (priv->button, TRUE); + if (missing_search_result) { + /* TRANSLATORS: this is a button next to the search results that + * allows the app to be easily installed */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Visit Website")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), NULL); + } else { + /* TRANSLATORS: this is a button next to the search results that + * allows the app to be easily installed. + * The ellipsis indicates that further steps are required */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Install…")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), NULL); + } + break; + case GS_APP_STATE_QUEUED_FOR_INSTALL: + gtk_widget_set_visible (priv->button, TRUE); + /* TRANSLATORS: this is a button next to the search results that + * allows to cancel a queued install of the app */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Cancel")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), "edit-delete-symbolic"); + break; + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_AVAILABLE_LOCAL: + gtk_widget_set_visible (priv->button, TRUE); + /* TRANSLATORS: this is a button next to the search results that + * allows the app to be easily installed */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Install")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), "list-add-symbolic"); + break; + case GS_APP_STATE_UPDATABLE_LIVE: + gtk_widget_set_visible (priv->button, TRUE); + if (priv->show_update) { + if (gs_app_has_quirk (priv->app, GS_APP_QUIRK_NEEDS_REBOOT) && + !gs_app_is_downloaded (priv->app)) { + /* TRANSLATORS: this is a button in the updates panel */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Download")); + } else { + /* TRANSLATORS: this is a button in the updates panel + * that allows the app to be easily updated live */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Update")); + } + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), "software-update-available-symbolic"); + gtk_widget_set_sensitive (priv->button, !gs_app_has_quirk (priv->app, GS_APP_QUIRK_NEEDS_USER_ACTION)); + } else { + /* TRANSLATORS: this is a button next to the search results that + * allows the app to be easily removed */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Uninstall…")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), "app-remove-symbolic"); + } + break; + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_INSTALLED: + if (!gs_app_has_quirk (priv->app, GS_APP_QUIRK_COMPULSORY)) + gtk_widget_set_visible (priv->button, TRUE); + /* TRANSLATORS: this is a button next to the search results that + * allows the app to be easily removed */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Uninstall…")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), "app-remove-symbolic"); + break; + case GS_APP_STATE_INSTALLING: + gtk_widget_set_visible (priv->button, TRUE); + /* TRANSLATORS: this is a button next to the search results that + * shows the status of an app being installed */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Installing")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), NULL); + break; + case GS_APP_STATE_REMOVING: + gtk_widget_set_visible (priv->button, TRUE); + /* TRANSLATORS: this is a button next to the search results that + * shows the status of an app being erased */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Uninstalling")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), NULL); + break; + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_visible (priv->button, TRUE); + /* TRANSLATORS: this is a button next to the search results that + * shows the status of an app being downloaded */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (priv->button), _("Downloading")); + gs_progress_button_set_icon_name (GS_PROGRESS_BUTTON (priv->button), NULL); + break; + default: + break; + } + + /* visible */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_UNAVAILABLE: + case GS_APP_STATE_QUEUED_FOR_INSTALL: + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_AVAILABLE_LOCAL: + case GS_APP_STATE_UPDATABLE_LIVE: + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_visible (priv->button, TRUE); + break; + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_INSTALLED: + gtk_widget_set_visible (priv->button, + !gs_app_has_quirk (priv->app, + GS_APP_QUIRK_COMPULSORY)); + break; + default: + gtk_widget_set_visible (priv->button, FALSE); + break; + } + + /* colorful */ + if (!priv->colorful) { + gtk_widget_remove_css_class (priv->button, "destructive-action"); + } else { + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_INSTALLED: + gtk_widget_add_css_class (priv->button, "destructive-action"); + break; + case GS_APP_STATE_UPDATABLE_LIVE: + if (priv->show_update) + gtk_widget_remove_css_class (priv->button, "destructive-action"); + else + gtk_widget_add_css_class (priv->button, "destructive-action"); + break; + default: + gtk_widget_remove_css_class (priv->button, "destructive-action"); + break; + } + } + + /* always insensitive when in selection mode */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_sensitive (priv->button, FALSE); + break; + default: + gtk_widget_set_sensitive (priv->button, TRUE); + break; + } + + gs_app_row_update_button_reveal (app_row); +} + +static void +append_to_name_if_meaningful (GPtrArray *name_parts, GtkLabel *label) +{ + const gchar *text = gtk_label_get_text (label); + if (gtk_widget_is_visible (GTK_WIDGET (label)) && text != NULL && text[0] != '\0') { + g_ptr_array_add (name_parts, (gpointer) text); + } +} + +static void +gs_app_row_update_accessible_name (GsAppRow *app_row) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + /* typically not more than 3-4 of these widgets are actually visible, hence 5 below */ + g_autoptr(GPtrArray) parts = g_ptr_array_new_null_terminated (5, NULL, TRUE); + g_autofree char *accessible_name = NULL; + gboolean is_rtl = gtk_widget_get_direction (GTK_WIDGET (app_row)) == GTK_TEXT_DIR_RTL; + + /* As this is a complex widget, the screen reader doesn’t read it all + * out correctly by default, so we provide an override label. The label + * contains the textual versions of most of the widgets in the row, in + * the order they appear visually. This order differs in RTL + * environments, where each sub-row of the app row is reversed. In + * practice, that means only the name/critical and the version. */ + + g_ptr_array_add (parts, (gpointer) gtk_label_get_text (GTK_LABEL (priv->name_label))); + + if (gtk_widget_get_visible (priv->update_critical_image)) + g_ptr_array_insert (parts, is_rtl ? 0 : -1, _("Critical update")); + + append_to_name_if_meaningful (parts, GTK_LABEL (priv->description_label)); + + if (!is_rtl) { + append_to_name_if_meaningful (parts, GTK_LABEL (priv->version_current_label)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->version_arrow_label)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->version_update_label)); + } else { + append_to_name_if_meaningful (parts, GTK_LABEL (priv->version_update_label)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->version_arrow_label)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->version_current_label)); + } + + /* each of these are visually on a separate row, so don’t need RTL treatment */ + append_to_name_if_meaningful (parts, GTK_LABEL (priv->label_installed)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->label_app_size)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->label_origin)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->system_updates_label)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->label_warning)); + append_to_name_if_meaningful (parts, GTK_LABEL (priv->label)); + + accessible_name = g_strjoinv (" ", (gchar **) parts->pdata); + gtk_accessible_update_property (GTK_ACCESSIBLE (app_row), + GTK_ACCESSIBLE_PROPERTY_LABEL, accessible_name, + -1); +} + +static void +gs_app_row_actually_refresh (GsAppRow *app_row) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + GString *str = NULL; + const gchar *tmp; + gboolean missing_search_result; + gboolean is_markup = FALSE; + guint64 size_installed_bytes = 0; + GsSizeType size_installed_type = GS_SIZE_TYPE_UNKNOWN; + g_autoptr(GIcon) icon = NULL; + + if (priv->app == NULL) + return; + + /* is this a missing search result from the extras page? */ + missing_search_result = (gs_app_get_state (priv->app) == GS_APP_STATE_UNAVAILABLE && + gs_app_get_url_missing (priv->app) != NULL); + + /* do a fill bar for the current progress */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_DOWNLOADING: + gs_progress_button_set_progress (GS_PROGRESS_BUTTON (priv->button), + gs_app_get_progress (priv->app)); + gs_progress_button_set_show_progress (GS_PROGRESS_BUTTON (priv->button), TRUE); + break; + default: + gs_progress_button_set_show_progress (GS_PROGRESS_BUTTON (priv->button), FALSE); + break; + } + + /* join the description lines */ + str = gs_app_row_get_description (app_row, &is_markup); + if (str != NULL) { + gs_utils_gstring_replace (str, "\n", " "); + if (is_markup) + gtk_label_set_markup (GTK_LABEL (priv->description_label), str->str); + else + gtk_label_set_label (GTK_LABEL (priv->description_label), str->str); + g_string_free (str, TRUE); + } else { + gtk_label_set_text (GTK_LABEL (priv->description_label), NULL); + } + + /* add warning */ + if (gs_app_has_quirk (priv->app, GS_APP_QUIRK_UNUSABLE_DURING_UPDATE)) { + gtk_label_set_text (GTK_LABEL (priv->label_warning), + /* TRANSLATORS: during the update the device + * will restart into a special update-only mode */ + _("Device cannot be used during update.")); + gtk_widget_set_visible (priv->label_warning, TRUE); + } + + /* where did this app come from */ + if (priv->show_source) { + tmp = gs_app_get_origin_hostname (priv->app); + if (tmp != NULL) { + g_autofree gchar *origin_tmp = NULL; + /* TRANSLATORS: this refers to where the app came from */ + origin_tmp = g_strdup_printf (_("Source: %s"), tmp); + gtk_label_set_label (GTK_LABEL (priv->label_origin), origin_tmp); + } + gtk_widget_set_visible (priv->label_origin, tmp != NULL); + } else { + gtk_widget_set_visible (priv->label_origin, FALSE); + } + + /* installed tag */ + if (!priv->show_buttons) { + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_UPDATABLE_LIVE: + case GS_APP_STATE_INSTALLED: + gtk_widget_set_visible (priv->label_installed_box, priv->show_installed); + break; + default: + gtk_widget_set_visible (priv->label_installed_box, FALSE); + break; + } + } else { + gtk_widget_set_visible (priv->label_installed_box, FALSE); + } + + /* name */ + gtk_label_set_label (GTK_LABEL (priv->name_label), + gs_app_get_name (priv->app)); + + if (priv->show_update) { + const gchar *version_current = NULL; + const gchar *version_update = NULL; + + /* current version */ + tmp = gs_app_get_version_ui (priv->app); + if (tmp != NULL && tmp[0] != '\0') { + version_current = tmp; + gtk_label_set_label (GTK_LABEL (priv->version_current_label), + version_current); + gtk_widget_set_visible (priv->version_current_label, TRUE); + } else { + gtk_widget_set_visible (priv->version_current_label, FALSE); + } + + /* update version */ + tmp = gs_app_get_update_version_ui (priv->app); + if (tmp != NULL && tmp[0] != '\0' && + g_strcmp0 (tmp, version_current) != 0) { + version_update = tmp; + gtk_label_set_label (GTK_LABEL (priv->version_update_label), + version_update); + gtk_widget_set_visible (priv->version_update_label, TRUE); + } else { + gtk_widget_set_visible (priv->version_update_label, FALSE); + } + + /* have both: show arrow */ + gtk_widget_set_visible (priv->version_arrow_label, + (version_current != NULL && + version_update != NULL && + g_strcmp0 (version_current, version_update) != 0)); + + /* ensure the arrow is the right way round for the text direction, + * as arrows are not bidi-mirrored automatically + * See section 2 of http://www.unicode.org/L2/L2017/17438-bidi-math-fdbk.html */ + switch (gtk_widget_get_direction (priv->version_box)) { + case GTK_TEXT_DIR_RTL: + gtk_label_set_label (GTK_LABEL (priv->version_arrow_label), "←"); + break; + case GTK_TEXT_DIR_NONE: + case GTK_TEXT_DIR_LTR: + default: + gtk_label_set_label (GTK_LABEL (priv->version_arrow_label), "→"); + break; + } + + /* show the box if we have either of the versions */ + gtk_widget_set_visible (priv->version_box, + (version_current != NULL || version_update != NULL)); + + gtk_widget_set_visible (priv->star, FALSE); + } else { + gtk_widget_set_visible (priv->version_box, FALSE); + if (missing_search_result || gs_app_get_rating (priv->app) <= 0 || !priv->show_rating) { + gtk_widget_set_visible (priv->star, FALSE); + } else { + gtk_widget_set_visible (priv->star, TRUE); + gtk_widget_set_sensitive (priv->star, FALSE); + gs_star_widget_set_rating (GS_STAR_WIDGET (priv->star), + gs_app_get_rating (priv->app)); + } + } + + if (priv->show_update && gs_app_get_special_kind (priv->app) == GS_APP_SPECIAL_KIND_OS_UPDATE) { + gtk_label_set_label (GTK_LABEL (priv->system_updates_label), gs_app_get_summary (priv->app)); + gtk_widget_set_visible (priv->system_updates_label, TRUE); + } else { + gtk_widget_set_visible (priv->system_updates_label, FALSE); + } + + gtk_widget_set_visible (priv->update_critical_image, priv->show_update && gs_app_get_update_urgency (priv->app) >= AS_URGENCY_KIND_CRITICAL); + + /* pixbuf */ + icon = gs_app_get_icon_for_size (priv->app, + gtk_image_get_pixel_size (GTK_IMAGE (priv->image)), + gtk_widget_get_scale_factor (priv->image), + "org.gnome.Software.Generic"); + gtk_image_set_from_gicon (GTK_IMAGE (priv->image), icon); + + if (missing_search_result) + gtk_widget_add_css_class (priv->image, "dimmer-label"); + else + gtk_widget_remove_css_class (priv->image, "dimmer-label"); + + /* pending label */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_QUEUED_FOR_INSTALL: + gtk_widget_set_visible (priv->label, TRUE); + gtk_label_set_label (GTK_LABEL (priv->label), _("Pending")); + break; + case GS_APP_STATE_PENDING_INSTALL: + gtk_widget_set_visible (priv->label, TRUE); + gtk_label_set_label (GTK_LABEL (priv->label), _("Pending install")); + break; + case GS_APP_STATE_PENDING_REMOVE: + gtk_widget_set_visible (priv->label, TRUE); + gtk_label_set_label (GTK_LABEL (priv->label), _("Pending remove")); + break; + default: + gtk_widget_set_visible (priv->label, FALSE); + break; + } + + /* spinner */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_REMOVING: + gtk_widget_set_visible (priv->spinner, TRUE); + break; + default: + gtk_widget_set_visible (priv->spinner, FALSE); + break; + } + + /* button */ + gs_app_row_refresh_button (app_row, missing_search_result); + + /* hide buttons in the update list, unless the app is live updatable */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_UPDATABLE_LIVE: + gtk_widget_set_visible (priv->button_box, + !priv->show_update || + !gs_app_has_quirk (priv->app, GS_APP_QUIRK_NEEDS_USER_ACTION)); + break; + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_visible (priv->button_box, TRUE); + break; + default: + gtk_widget_set_visible (priv->button_box, !priv->show_update); + break; + } + + /* show the right size */ + if (priv->show_installed_size) { + size_installed_type = gs_app_get_size_installed (priv->app, &size_installed_bytes); + } + if (size_installed_type == GS_SIZE_TYPE_VALID && size_installed_bytes > 0) { + g_autofree gchar *sizestr = NULL; + sizestr = g_format_size (size_installed_bytes); + gtk_label_set_label (GTK_LABEL (priv->label_app_size), sizestr); + gtk_widget_set_visible (priv->label_app_size, TRUE); + } else { + gtk_widget_set_visible (priv->label_app_size, FALSE); + } + + /* add warning */ + if (priv->show_update) { + g_autoptr(GString) warning = g_string_new (NULL); + const gchar *renamed_from; + + if (gs_app_has_quirk (priv->app, GS_APP_QUIRK_NEW_PERMISSIONS)) + g_string_append (warning, _("Requires additional permissions")); + + renamed_from = gs_app_get_renamed_from (priv->app); + if (renamed_from && g_strcmp0 (renamed_from, gs_app_get_name (priv->app)) != 0) { + if (warning->len > 0) + g_string_append (warning, "\n"); + /* Translators: A message to indicate that an app has been renamed. The placeholder is the old human-readable name. */ + g_string_append_printf (warning, _("Renamed from %s"), renamed_from); + } + + if (gs_app_has_quirk (priv->app, GS_APP_QUIRK_NEEDS_USER_ACTION)) { + const gchar *problems; + problems = gs_app_get_metadata_item (priv->app, "GnomeSoftware::problems"); + if (problems != NULL && *problems != '\0') { + if (warning->len > 0) + g_string_append_c (warning, '\n'); + g_string_append (warning, problems); + } + } + + if (warning->len > 0) { + gtk_label_set_text (GTK_LABEL (priv->label_warning), warning->str); + gtk_widget_set_tooltip_text (priv->label_warning, warning->str); + gtk_widget_set_visible (priv->label_warning, TRUE); + } + } else if (priv->show_installed) { + g_autofree gchar *warning_tmp = NULL; + const gchar *problems, *eol_reason; + problems = gs_app_get_metadata_item (priv->app, "GnomeSoftware::problems"); + if (problems == NULL || *problems == '\0') { + /* Show runtime problems on the apps which use them, unless they have their own problems */ + GsApp *runtime = gs_app_get_runtime (priv->app); + if (runtime != NULL) + problems = gs_app_get_metadata_item (runtime, "GnomeSoftware::problems"); + } + eol_reason = gs_app_get_metadata_item (priv->app, "GnomeSoftware::EolReason"); + if (eol_reason == NULL || *eol_reason == '\0') { + /* Show runtime EOL on the apps which use them, unless they have their own EOL */ + GsApp *runtime = gs_app_get_runtime (priv->app); + if (runtime != NULL) + eol_reason = gs_app_get_metadata_item (runtime, "GnomeSoftware::EolReason"); + } + if (eol_reason != NULL && *eol_reason != '\0') { + /* Replace user-provided non-localized string with a localized text */ + eol_reason = _("Stopped Receiving Updates"); + if (problems != NULL && *problems != '\0') { + warning_tmp = g_strconcat (problems, "\n", eol_reason, NULL); + problems = warning_tmp; + } else { + problems = eol_reason; + } + } + if (problems != NULL && *problems != '\0') { + gtk_label_set_text (GTK_LABEL (priv->label_warning), problems); + gtk_widget_set_tooltip_text (priv->label_warning, problems); + gtk_widget_set_visible (priv->label_warning, TRUE); + } + } + + gtk_widget_set_visible (priv->box_tag, + gtk_widget_get_visible (priv->label_origin) || + gtk_widget_get_visible (priv->label_installed_box) || + gtk_widget_get_visible (priv->label_warning)); + + gtk_label_set_max_width_chars (GTK_LABEL (priv->name_label), + gtk_widget_get_visible (priv->description_label) ? 20 : -1); + + gs_app_row_update_accessible_name (app_row); +} + +static void +finish_unreveal (GsAppRow *app_row) +{ + gtk_widget_set_visible (GTK_WIDGET (app_row), FALSE); + + g_signal_emit (app_row, signals[SIGNAL_UNREVEALED], 0); +} + +static void +child_unrevealed (GObject *revealer, GParamSpec *pspec, gpointer user_data) +{ + GsAppRow *app_row = user_data; + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + /* return immediately if we are in destruction (this doesn't, however, + * catch the case where we are being removed from a container without + * having been destroyed first.) + */ + if (priv->app == NULL || !gtk_widget_get_mapped (GTK_WIDGET (app_row))) + return; + + finish_unreveal (app_row); +} + +static gboolean +child_unrevealed_unmapped_cb (gpointer user_data) +{ + GsAppRow *app_row = user_data; + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + priv->unreveal_in_idle_id = 0; + + finish_unreveal (app_row); + + return G_SOURCE_REMOVE; +} + +/** + * gs_app_row_unreveal: + * @app_row: a #GsAppRow + * + * Hide the row with an animation. Once the animation is done + * the GsAppRow:unrevealed signal is emitted. This handles + * the case when the widget is not mapped as well, in which case + * the GsAppRow:unrevealed signal is emitted from an idle + * callback, to ensure async nature of the function call and + * the signal emission. + * + * Calling the function multiple times has no effect. + **/ +void +gs_app_row_unreveal (GsAppRow *app_row) +{ + GtkWidget *child; + GtkWidget *revealer; + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + child = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (app_row)); + + /* This means the row is already hiding */ + if (GTK_IS_REVEALER (child)) + return; + + gtk_widget_set_sensitive (child, FALSE); + + /* Revealer does not animate when the widget is not mapped */ + if (!gtk_widget_get_mapped (GTK_WIDGET (app_row))) { + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + if (priv->unreveal_in_idle_id == 0) + priv->unreveal_in_idle_id = g_idle_add_full (G_PRIORITY_HIGH, child_unrevealed_unmapped_cb, app_row, NULL); + return; + } + + revealer = gtk_revealer_new (); + gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), TRUE); + gtk_widget_set_visible (revealer, TRUE); + + g_object_ref (child); + gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (app_row), revealer); + gtk_revealer_set_child (GTK_REVEALER (revealer), child); + g_object_unref (child); + + g_signal_connect (revealer, "notify::child-revealed", + G_CALLBACK (child_unrevealed), app_row); + gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), FALSE); +} + +GsApp * +gs_app_row_get_app (GsAppRow *app_row) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + g_return_val_if_fail (GS_IS_APP_ROW (app_row), NULL); + return priv->app; +} + +static gboolean +gs_app_row_refresh_idle_cb (gpointer user_data) +{ + GsAppRow *app_row = GS_APP_ROW (user_data); + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + priv->pending_refresh_id = 0; + gs_app_row_actually_refresh (app_row); + return G_SOURCE_REMOVE; +} + +/* Schedule an idle call to gs_app_row_actually_refresh() unless one’s already pending. */ +static void +gs_app_row_schedule_refresh (GsAppRow *app_row) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + if (priv->pending_refresh_id > 0) + return; + priv->pending_refresh_id = g_idle_add (gs_app_row_refresh_idle_cb, app_row); +} + +static void +gs_app_row_notify_props_changed_cb (GsApp *app, + GParamSpec *pspec, + GsAppRow *app_row) +{ + gs_app_row_schedule_refresh (app_row); +} + +static void +gs_app_row_set_app (GsAppRow *app_row, GsApp *app) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + priv->app = g_object_ref (app); + + g_signal_connect_object (priv->app, "notify::state", + G_CALLBACK (gs_app_row_notify_props_changed_cb), + app_row, 0); + g_signal_connect_object (priv->app, "notify::rating", + G_CALLBACK (gs_app_row_notify_props_changed_cb), + app_row, 0); + g_signal_connect_object (priv->app, "notify::progress", + G_CALLBACK (gs_app_row_notify_props_changed_cb), + app_row, 0); + g_signal_connect_object (priv->app, "notify::allow-cancel", + G_CALLBACK (gs_app_row_notify_props_changed_cb), + app_row, 0); + + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_APP]); +} + +static void +gs_app_row_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsAppRow *app_row = GS_APP_ROW (object); + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + switch ((GsAppRowProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, priv->app); + break; + case PROP_COLORFUL: + g_value_set_boolean (value, priv->colorful); + break; + case PROP_SHOW_DESCRIPTION: + g_value_set_boolean (value, gs_app_row_get_show_description (app_row)); + break; + case PROP_SHOW_SOURCE: + g_value_set_boolean (value, priv->show_source); + break; + case PROP_SHOW_BUTTONS: + g_value_set_boolean (value, priv->show_buttons); + break; + case PROP_SHOW_RATING: + g_value_set_boolean (value, priv->show_rating); + break; + case PROP_SHOW_UPDATE: + g_value_set_boolean (value, priv->show_update); + break; + case PROP_SHOW_INSTALLED_SIZE: + g_value_set_boolean (value, priv->show_installed_size); + break; + case PROP_SHOW_INSTALLED: + g_value_set_boolean (value, priv->show_installed); + break; + case PROP_IS_NARROW: + g_value_set_boolean (value, gs_app_row_get_is_narrow (app_row)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_row_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsAppRow *app_row = GS_APP_ROW (object); + + switch ((GsAppRowProperty) prop_id) { + case PROP_APP: + gs_app_row_set_app (app_row, g_value_get_object (value)); + break; + case PROP_COLORFUL: + gs_app_row_set_colorful (app_row, g_value_get_boolean (value)); + break; + case PROP_SHOW_DESCRIPTION: + gs_app_row_set_show_description (app_row, g_value_get_boolean (value)); + break; + case PROP_SHOW_SOURCE: + gs_app_row_set_show_source (app_row, g_value_get_boolean (value)); + break; + case PROP_SHOW_BUTTONS: + gs_app_row_set_show_buttons (app_row, g_value_get_boolean (value)); + break; + case PROP_SHOW_RATING: + gs_app_row_set_show_rating (app_row, g_value_get_boolean (value)); + break; + case PROP_SHOW_UPDATE: + gs_app_row_set_show_update (app_row, g_value_get_boolean (value)); + break; + case PROP_SHOW_INSTALLED_SIZE: + gs_app_row_set_show_installed_size (app_row, g_value_get_boolean (value)); + break; + case PROP_SHOW_INSTALLED: + gs_app_row_set_show_installed (app_row, g_value_get_boolean (value)); + break; + case PROP_IS_NARROW: + gs_app_row_set_is_narrow (app_row, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_row_dispose (GObject *object) +{ + GsAppRow *app_row = GS_APP_ROW (object); + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + if (priv->app) + g_signal_handlers_disconnect_by_func (priv->app, gs_app_row_notify_props_changed_cb, app_row); + + g_clear_object (&priv->app); + g_clear_handle_id (&priv->pending_refresh_id, g_source_remove); + g_clear_handle_id (&priv->unreveal_in_idle_id, g_source_remove); + + G_OBJECT_CLASS (gs_app_row_parent_class)->dispose (object); +} + +static void +gs_app_row_class_init (GsAppRowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_app_row_get_property; + object_class->set_property = gs_app_row_set_property; + object_class->dispose = gs_app_row_dispose; + + /** + * GsAppRow:app: + * + * The #GsApp to show in this row. + * + * Since: 3.38 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GsAppRow:colorful: + * + * Whether the buttons can be colorized in the row. + * + * Since: 42.1 + */ + obj_props[PROP_COLORFUL] = + g_param_spec_boolean ("colorful", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppRow:show-description: + * + * Show the description of the app in the row. + * + * Since: 41 + */ + obj_props[PROP_SHOW_DESCRIPTION] = + g_param_spec_boolean ("show-description", NULL, NULL, + TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppRow:show-source: + * + * Show the source of the app in the row. + * + * Since: 3.38 + */ + obj_props[PROP_SHOW_SOURCE] = + g_param_spec_boolean ("show-source", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppRow:show-buttons: + * + * Show buttons (such as Install, Cancel or Update) in the app row. + * + * Since: 3.38 + */ + obj_props[PROP_SHOW_BUTTONS] = + g_param_spec_boolean ("show-buttons", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppRow:show-rating: + * + * Show app rating in the app row. + * + * Since: 42.1 + */ + obj_props[PROP_SHOW_RATING] = + g_param_spec_boolean ("show-rating", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppRow:show-update: + * + * Show update (version) information in the app row. + * + * Since: 42.1 + */ + obj_props[PROP_SHOW_UPDATE] = + g_param_spec_boolean ("show-update", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppRow:show-installed: + * + * Show an "Installed" check in the app row, when the app is installed. + * + * Since: 42.1 + */ + obj_props[PROP_SHOW_INSTALLED] = + g_param_spec_boolean ("show-installed", NULL, NULL, + TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppRow:show-installed-size: + * + * Show the installed size of the app in the row. + * + * Since: 3.38 + */ + obj_props[PROP_SHOW_INSTALLED_SIZE] = + g_param_spec_boolean ("show-installed-size", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsAppRow:is-narrow: + * + * Whether the row is in narrow mode. + * + * In narrow mode, the row will take up less horizontal space, doing so + * by e.g. using icons rather than labels in buttons. This is needed to + * keep the UI useable on small form-factors like smartphones. + * + * Since: 41 + */ + obj_props[PROP_IS_NARROW] = + g_param_spec_boolean ("is-narrow", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + signals [SIGNAL_BUTTON_CLICKED] = + g_signal_new ("button-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsAppRowClass, button_clicked), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals [SIGNAL_UNREVEALED] = + g_signal_new ("unrevealed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsAppRowClass, unrevealed), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-app-row.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, image); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, name_box); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, name_label); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, version_box); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, version_current_label); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, version_arrow_label); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, version_update_label); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, system_updates_label); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, update_critical_image); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, star); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, description_label); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, button_box); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, button_revealer); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, button); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, spinner); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, label); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, box_tag); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, label_warning); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, label_origin); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, label_installed_box); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, label_installed); + gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, label_app_size); +} + +static void +button_clicked (GtkWidget *widget, GsAppRow *app_row) +{ + g_signal_emit (app_row, signals[SIGNAL_BUTTON_CLICKED], 0); +} + +static void +gs_app_row_init (GsAppRow *app_row) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + priv->show_description = TRUE; + priv->show_installed = TRUE; + + g_type_ensure (GS_TYPE_PROGRESS_BUTTON); + g_type_ensure (GS_TYPE_STAR_WIDGET); + + gtk_widget_init_template (GTK_WIDGET (app_row)); + + g_signal_connect (priv->button, "clicked", + G_CALLBACK (button_clicked), app_row); + + /* A fix for this is included in 4.6.4, apply workaround, if not running with new-enough gtk. */ + if (gtk_get_major_version () < 4 || + (gtk_get_major_version () == 4 && gtk_get_minor_version () < 6) || + (gtk_get_major_version () == 4 && gtk_get_minor_version () == 6 && gtk_get_micro_version () < 4)) { + g_object_set (G_OBJECT (priv->name_label), + "wrap", FALSE, + "lines", 1, + NULL); + g_object_set (G_OBJECT (priv->description_label), + "wrap", FALSE, + "lines", 1, + NULL); + g_object_set (G_OBJECT (priv->label_warning), + "wrap", FALSE, + "lines", 1, + NULL); + g_object_set (G_OBJECT (priv->system_updates_label), + "wrap", FALSE, + "lines", 1, + NULL); + } +} + +void +gs_app_row_set_size_groups (GsAppRow *app_row, + GtkSizeGroup *name, + GtkSizeGroup *button_label, + GtkSizeGroup *button_image) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + if (name != NULL) + gtk_size_group_add_widget (name, priv->name_box); + gs_progress_button_set_size_groups (GS_PROGRESS_BUTTON (priv->button), button_label, button_image); +} + +void +gs_app_row_set_colorful (GsAppRow *app_row, gboolean colorful) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + if ((!priv->colorful) == (!colorful)) + return; + + priv->colorful = colorful; + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_COLORFUL]); +} + +void +gs_app_row_set_show_buttons (GsAppRow *app_row, gboolean show_buttons) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + if ((!priv->show_buttons) == (!show_buttons)) + return; + + priv->show_buttons = show_buttons; + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_SHOW_BUTTONS]); +} + +void +gs_app_row_set_show_rating (GsAppRow *app_row, gboolean show_rating) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + if ((!priv->show_rating) == (!show_rating)) + return; + + priv->show_rating = show_rating; + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_SHOW_RATING]); +} + +/** + * gs_app_row_get_show_description: + * @app_row: a #GsAppRow + * + * Get the value of #GsAppRow:show-description. + * + * Returns: %TRUE if the description is shown, %FALSE otherwise + * + * Since: 41 + */ +gboolean +gs_app_row_get_show_description (GsAppRow *app_row) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_val_if_fail (GS_IS_APP_ROW (app_row), FALSE); + + return priv->show_description; +} + +/** + * gs_app_row_set_show_description: + * @app_row: a #GsAppRow + * @show_description: %TRUE to show the description, %FALSE otherwise + * + * Set the value of #GsAppRow:show-description. + * + * Since: 41 + */ +void +gs_app_row_set_show_description (GsAppRow *app_row, gboolean show_description) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + show_description = !!show_description; + + if (priv->show_description == show_description) + return; + + priv->show_description = show_description; + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_SHOW_DESCRIPTION]); +} + +void +gs_app_row_set_show_source (GsAppRow *app_row, gboolean show_source) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + if ((!priv->show_source) == (!show_source)) + return; + + priv->show_source = show_source; + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_SHOW_SOURCE]); +} + +void +gs_app_row_set_show_installed_size (GsAppRow *app_row, gboolean show_size) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + if ((!priv->show_installed_size) == (!show_size)) + return; + + priv->show_installed_size = show_size; + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_SHOW_INSTALLED_SIZE]); +} + +/** + * gs_app_row_get_is_narrow: + * @app_row: a #GsAppRow + * + * Get the value of #GsAppRow:is-narrow. + * + * Retruns: %TRUE if the row is in narrow mode, %FALSE otherwise + * + * Since: 41 + */ +gboolean +gs_app_row_get_is_narrow (GsAppRow *app_row) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_val_if_fail (GS_IS_APP_ROW (app_row), FALSE); + + return priv->is_narrow; +} + +/** + * gs_app_row_set_is_narrow: + * @app_row: a #GsAppRow + * @is_narrow: %TRUE to set the row in narrow mode, %FALSE otherwise + * + * Set the value of #GsAppRow:is-narrow. + * + * Since: 41 + */ +void +gs_app_row_set_is_narrow (GsAppRow *app_row, gboolean is_narrow) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + is_narrow = !!is_narrow; + + if (priv->is_narrow == is_narrow) + return; + + priv->is_narrow = is_narrow; + gs_app_row_update_button_reveal (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_IS_NARROW]); +} + +/** + * gs_app_row_set_show_update: + * + * Only really useful for the update panel to call + **/ +void +gs_app_row_set_show_update (GsAppRow *app_row, gboolean show_update) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + if ((!priv->show_update) == (!show_update)) + return; + + priv->show_update = show_update; + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_SHOW_UPDATE]); +} + +/** + * gs_app_row_set_show_installed: + * @app_row: a #GsAppRow + * @show_installed: value to set + * + * Set whether to show "installed" label. Default is %TRUE. This has effect only + * when not showing buttons (gs_app_row_set_show_buttons()). + * + * Since: 42.1 + **/ +void +gs_app_row_set_show_installed (GsAppRow *app_row, + gboolean show_installed) +{ + GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); + + g_return_if_fail (GS_IS_APP_ROW (app_row)); + + if ((!show_installed) != (!priv->show_installed)) { + priv->show_installed = show_installed; + gs_app_row_schedule_refresh (app_row); + g_object_notify_by_pspec (G_OBJECT (app_row), obj_props[PROP_SHOW_INSTALLED]); + } +} + +GtkWidget * +gs_app_row_new (GsApp *app) +{ + g_return_val_if_fail (GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_APP_ROW, + "app", app, + NULL); +} diff --git a/src/gs-app-row.h b/src/gs-app-row.h new file mode 100644 index 0000000..c6a7729 --- /dev/null +++ b/src/gs-app-row.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_ROW (gs_app_row_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsAppRow, gs_app_row, GS, APP_ROW, GtkListBoxRow) + +struct _GsAppRowClass +{ + GtkListBoxRowClass parent_class; + void (*button_clicked) (GsAppRow *app_row); + void (*unrevealed) (GsAppRow *app_row); +}; + +GtkWidget *gs_app_row_new (GsApp *app); +void gs_app_row_unreveal (GsAppRow *app_row); +void gs_app_row_set_colorful (GsAppRow *app_row, + gboolean colorful); +void gs_app_row_set_show_buttons (GsAppRow *app_row, + gboolean show_buttons); +void gs_app_row_set_show_rating (GsAppRow *app_row, + gboolean show_rating); +gboolean gs_app_row_get_show_description (GsAppRow *app_row); +void gs_app_row_set_show_description (GsAppRow *app_row, + gboolean show_description); +void gs_app_row_set_show_source (GsAppRow *app_row, + gboolean show_source); +void gs_app_row_set_show_update (GsAppRow *app_row, + gboolean show_update); +void gs_app_row_set_show_installed (GsAppRow *app_row, + gboolean show_installed); +GsApp *gs_app_row_get_app (GsAppRow *app_row); +void gs_app_row_set_size_groups (GsAppRow *app_row, + GtkSizeGroup *name, + GtkSizeGroup *button_label, + GtkSizeGroup *button_image); +void gs_app_row_set_show_installed_size (GsAppRow *app_row, + gboolean show_size); +gboolean gs_app_row_get_is_narrow (GsAppRow *app_row); +void gs_app_row_set_is_narrow (GsAppRow *app_row, + gboolean is_narrow); + +G_END_DECLS diff --git a/src/gs-app-row.ui b/src/gs-app-row.ui new file mode 100644 index 0000000..39b1499 --- /dev/null +++ b/src/gs-app-row.ui @@ -0,0 +1,287 @@ + + + + + diff --git a/src/gs-app-tile.c b/src/gs-app-tile.c new file mode 100644 index 0000000..2bd1908 --- /dev/null +++ b/src/gs-app-tile.c @@ -0,0 +1,183 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2019 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-app-tile.h" +#include "gs-common.h" + +typedef struct { + GsApp *app; + guint app_notify_idle_id; +} GsAppTilePrivate; + +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GsAppTile, gs_app_tile, GTK_TYPE_FLOW_BOX_CHILD) + +typedef enum { + PROP_APP = 1, +} GsAppTileProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +static void +gs_app_tile_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsAppTile *self = GS_APP_TILE (object); + GsAppTilePrivate *priv = gs_app_tile_get_instance_private (self); + + switch ((GsAppTileProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, priv->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_tile_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsAppTile *self = GS_APP_TILE (object); + + switch ((GsAppTileProperty) prop_id) { + case PROP_APP: + gs_app_tile_set_app (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_tile_dispose (GObject *object) +{ + GsAppTile *self = GS_APP_TILE (object); + + gs_app_tile_set_app (self, NULL); + + G_OBJECT_CLASS (gs_app_tile_parent_class)->dispose (object); +} + +/** + * gs_app_tile_get_app: + * @self: a #GsAppTile + * + * Get the value of #GsAppTile:app. + * + * Returns: (nullable) (transfer none): the #GsAppTile:app property + */ +GsApp * +gs_app_tile_get_app (GsAppTile *self) +{ + GsAppTilePrivate *priv = gs_app_tile_get_instance_private (self); + g_return_val_if_fail (GS_IS_APP_TILE (self), NULL); + return priv->app; +} + +static gboolean +gs_app_tile_app_notify_idle_cb (gpointer user_data) +{ + GsAppTile *self = GS_APP_TILE (user_data); + GsAppTileClass *klass = GS_APP_TILE_GET_CLASS (self); + GsAppTilePrivate *priv = gs_app_tile_get_instance_private (self); + + priv->app_notify_idle_id = 0; + klass->refresh (self); + + return G_SOURCE_REMOVE; +} + +static void +gs_app_tile_app_notify_cb (GsApp *app, GParamSpec *pspec, GsAppTile *self) +{ + GsAppTilePrivate *priv = gs_app_tile_get_instance_private (self); + + /* Already pending */ + if (priv->app_notify_idle_id != 0) + return; + + priv->app_notify_idle_id = g_idle_add (gs_app_tile_app_notify_idle_cb, self); +} + +/** + * gs_app_tile_set_app: + * @self: a #GsAppTile + * @app: (transfer none) (nullable): the new value for #GsAppTile:app + * + * Set the value of #GsAppTile:app. + */ +void +gs_app_tile_set_app (GsAppTile *self, GsApp *app) +{ + GsAppTileClass *klass = GS_APP_TILE_GET_CLASS (self); + GsAppTilePrivate *priv = gs_app_tile_get_instance_private (self); + + g_return_if_fail (GS_IS_APP_TILE (self)); + g_return_if_fail (!app || GS_IS_APP (app)); + + /* cancel pending refresh */ + g_clear_handle_id (&priv->app_notify_idle_id, g_source_remove); + + /* disconnect old app */ + if (priv->app != NULL) + g_signal_handlers_disconnect_by_func (priv->app, gs_app_tile_app_notify_cb, self); + g_set_object (&priv->app, app); + + /* optional refresh */ + if (klass->refresh != NULL && priv->app != NULL) { + g_signal_connect (app, "notify", + G_CALLBACK (gs_app_tile_app_notify_cb), self); + klass->refresh (self); + } + + if (app) + gtk_widget_add_css_class (GTK_WIDGET (self), "activatable"); + else + gtk_widget_remove_css_class (GTK_WIDGET (self), "activatable"); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); +} + +void +gs_app_tile_class_init (GsAppTileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gs_app_tile_get_property; + object_class->set_property = gs_app_tile_set_property; + object_class->dispose = gs_app_tile_dispose; + + /** + * GsAppTile:app: (nullable) + * + * The app to display in this tile. + * + * Set this to %NULL to display a loading/empty tile. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", "App", + "The app to display in this tile.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +void +gs_app_tile_init (GsAppTile *self) +{ + GsAppTilePrivate *priv = gs_app_tile_get_instance_private (self); + priv->app_notify_idle_id = 0; + + gtk_widget_add_css_class (GTK_WIDGET (self), "card"); +} diff --git a/src/gs-app-tile.h b/src/gs-app-tile.h new file mode 100644 index 0000000..32aeafd --- /dev/null +++ b/src/gs-app-tile.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2019 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_TILE (gs_app_tile_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsAppTile, gs_app_tile, GS, APP_TILE, GtkFlowBoxChild) + +struct _GsAppTileClass +{ + GtkFlowBoxChildClass parent_class; + void (*refresh) (GsAppTile *self); +}; + +GsApp *gs_app_tile_get_app (GsAppTile *self); +void gs_app_tile_set_app (GsAppTile *self, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-app-translation-dialog.c b/src/gs-app-translation-dialog.c new file mode 100644 index 0000000..f1fa724 --- /dev/null +++ b/src/gs-app-translation-dialog.c @@ -0,0 +1,275 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-app-translation-dialog + * @short_description: A dialog showing translation information about an app + * + * #GsAppTranslationDialog is a dialog which shows a message about the + * translation status of an app, and provides information and a link for how + * to contribute more translations to the app. + * + * It is intended to be shown if the app is not sufficiently translated to the + * current locale. + * + * The widget has no special appearance if the app is unset, so callers will + * typically want to hide the dialog in that case. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-app.h" +#include "gs-app-translation-dialog.h" +#include "gs-common.h" +#include "gs-lozenge.h" + +struct _GsAppTranslationDialog +{ + GsInfoWindow parent_instance; + + GsApp *app; /* (not nullable) (owned) */ + gulong app_notify_name_handler; + + GtkLabel *title; + GtkLabel *description; +}; + +G_DEFINE_TYPE (GsAppTranslationDialog, gs_app_translation_dialog, GS_TYPE_INFO_WINDOW) + +typedef enum { + PROP_APP = 1, +} GsAppTranslationDialogProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +static void +update_labels (GsAppTranslationDialog *self) +{ + g_autofree gchar *title = NULL; + g_autofree gchar *description = NULL; + + /* Translators: The placeholder is an app name */ + title = g_strdup_printf (_("Help Translate %s"), gs_app_get_name (self->app)); + + /* Translators: The placeholder is an app name */ + description = g_strdup_printf (_("%s is designed, developed, and translated by an " + "international community of contributors." + "\n\n" + "This means that while it’s not yet available in " + "your language, you can get involved and help " + "translate it yourself."), gs_app_get_name (self->app)); + + gtk_label_set_text (self->title, title); + gtk_label_set_text (self->description, description); +} + +static void +app_notify_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GsAppTranslationDialog *self = GS_APP_TRANSLATION_DIALOG (user_data); + + update_labels (self); +} + +static const gchar * +get_url_for_app (GsApp *app) +{ + const gchar *url; + + /* Try the translate URL, or a fallback */ + url = gs_app_get_url (app, AS_URL_KIND_TRANSLATE); +#if AS_CHECK_VERSION(0, 15, 3) + if (url == NULL) + url = gs_app_get_url (app, AS_URL_KIND_CONTRIBUTE); +#endif + if (url == NULL) + url = gs_app_get_url (app, AS_URL_KIND_BUGTRACKER); + + return url; +} + +static void +button_clicked_cb (GtkButton *button, + gpointer user_data) +{ + GsAppTranslationDialog *self = GS_APP_TRANSLATION_DIALOG (user_data); + const gchar *url = get_url_for_app (self->app); + GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (self))); + + gs_show_uri (GTK_WINDOW (toplevel), url); +} + +static void +gs_app_translation_dialog_init (GsAppTranslationDialog *self) +{ + g_type_ensure (GS_TYPE_LOZENGE); + + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +gs_app_translation_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsAppTranslationDialog *self = GS_APP_TRANSLATION_DIALOG (object); + + switch ((GsAppTranslationDialogProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_app_translation_dialog_get_app (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_translation_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsAppTranslationDialog *self = GS_APP_TRANSLATION_DIALOG (object); + + switch ((GsAppTranslationDialogProperty) prop_id) { + case PROP_APP: + /* Construct only */ + g_assert (self->app == NULL); + g_assert (self->app_notify_name_handler == 0); + + self->app = g_value_dup_object (value); + self->app_notify_name_handler = g_signal_connect (self->app, "notify::name", G_CALLBACK (app_notify_cb), self); + + /* Update the UI. */ + update_labels (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_translation_dialog_dispose (GObject *object) +{ + GsAppTranslationDialog *self = GS_APP_TRANSLATION_DIALOG (object); + + g_clear_signal_handler (&self->app_notify_name_handler, self->app); + g_clear_object (&self->app); + + G_OBJECT_CLASS (gs_app_translation_dialog_parent_class)->dispose (object); +} + +static void +gs_app_translation_dialog_class_init (GsAppTranslationDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_app_translation_dialog_get_property; + object_class->set_property = gs_app_translation_dialog_set_property; + object_class->dispose = gs_app_translation_dialog_dispose; + + /** + * GsAppTranslationDialog:app: (not nullable) + * + * The app to display the translation details for. + * + * This must not be %NULL. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-app-translation-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsAppTranslationDialog, title); + gtk_widget_class_bind_template_child (widget_class, GsAppTranslationDialog, description); + + gtk_widget_class_bind_template_callback (widget_class, button_clicked_cb); +} + +/** + * gs_app_translation_dialog_new: + * @app: (not nullable): the app to display translation information for + * + * Create a new #GsAppTranslationDialog and set its initial app to @app. + * + * Returns: (transfer full): a new #GsAppTranslationDialog + * Since: 41 + */ +GsAppTranslationDialog * +gs_app_translation_dialog_new (GsApp *app) +{ + g_return_val_if_fail (GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_APP_TRANSLATION_DIALOG, + "app", app, + NULL); +} + +/** + * gs_app_translation_dialog_get_app: + * @self: a #GsAppTranslationDialog + * + * Gets the value of #GsAppTranslationDialog:app. + * + * Returns: (not nullable) (transfer none): app whose translation information is + * being displayed + * Since: 41 + */ +GsApp * +gs_app_translation_dialog_get_app (GsAppTranslationDialog *self) +{ + g_return_val_if_fail (GS_IS_APP_TRANSLATION_DIALOG (self), NULL); + + return self->app; +} + +/** + * gs_app_translation_dialog_app_has_url: + * @app: a #GsApp + * + * Check @app to see if it has appropriate URLs set on it to allow the user + * to be linked to a page relevant to translating the app. + * + * Generally this should be used to work out whether to show a + * #GsAppTranslationDialog dialog for a given @app. + * + * Returns: %TRUE if an URL exists, %FALSE otherwise + * Since: 41 + */ +gboolean +gs_app_translation_dialog_app_has_url (GsApp *app) +{ + g_return_val_if_fail (GS_IS_APP (app), FALSE); + + return (get_url_for_app (app) != NULL); +} diff --git a/src/gs-app-translation-dialog.h b/src/gs-app-translation-dialog.h new file mode 100644 index 0000000..387c31d --- /dev/null +++ b/src/gs-app-translation-dialog.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" +#include "gs-info-window.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_TRANSLATION_DIALOG (gs_app_translation_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppTranslationDialog, gs_app_translation_dialog, GS, APP_TRANSLATION_DIALOG, GsInfoWindow) + +GsAppTranslationDialog *gs_app_translation_dialog_new (GsApp *app); + +GsApp *gs_app_translation_dialog_get_app (GsAppTranslationDialog *self); + +gboolean gs_app_translation_dialog_app_has_url (GsApp *app); + +G_END_DECLS diff --git a/src/gs-app-translation-dialog.ui b/src/gs-app-translation-dialog.ui new file mode 100644 index 0000000..21931e0 --- /dev/null +++ b/src/gs-app-translation-dialog.ui @@ -0,0 +1,109 @@ + + + + + + diff --git a/src/gs-app-version-history-dialog.c b/src/gs-app-version-history-dialog.c new file mode 100644 index 0000000..4351fad --- /dev/null +++ b/src/gs-app-version-history-dialog.c @@ -0,0 +1,92 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Matthew Leeds + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-app-version-history-dialog.h" + +#include "gnome-software-private.h" +#include "gs-common.h" +#include "gs-app-version-history-row.h" +#include + +struct _GsAppVersionHistoryDialog +{ + AdwDialog parent_instance; + GsApp *app; + GtkWidget *listbox; +}; + +G_DEFINE_TYPE (GsAppVersionHistoryDialog, gs_app_version_history_dialog, ADW_TYPE_DIALOG) + +static void +populate_version_history (GsAppVersionHistoryDialog *dialog, + GsApp *app) +{ + g_autoptr(GPtrArray) version_history = NULL; + + /* remove previous */ + gs_widget_remove_all (dialog->listbox, (GsRemoveFunc) gtk_list_box_remove); + + version_history = gs_app_get_version_history (app); + if (version_history == NULL || version_history->len == 0) { + GtkWidget *row; + row = gs_app_version_history_row_new (); + gs_app_version_history_row_set_always_expanded (GS_APP_VERSION_HISTORY_ROW (row), TRUE); + gs_app_version_history_row_set_info (GS_APP_VERSION_HISTORY_ROW (row), + gs_app_get_version (app), + gs_app_get_release_date (app), NULL); + gtk_list_box_append (GTK_LIST_BOX (dialog->listbox), row); + gtk_widget_set_visible (row, TRUE); + return; + } + + /* add each */ + for (guint i = 0; i < version_history->len; i++) { + GtkWidget *row; + AsRelease *version = g_ptr_array_index (version_history, i); + + row = gs_app_version_history_row_new (); + gs_app_version_history_row_set_always_expanded (GS_APP_VERSION_HISTORY_ROW (row), TRUE); + gs_app_version_history_row_set_info (GS_APP_VERSION_HISTORY_ROW (row), + as_release_get_version (version), + as_release_get_timestamp (version), + as_release_get_description (version)); + + gtk_list_box_append (GTK_LIST_BOX (dialog->listbox), row); + gtk_widget_set_visible (row, TRUE); + } +} + +static void +gs_app_version_history_dialog_init (GsAppVersionHistoryDialog *dialog) +{ + gtk_widget_init_template (GTK_WIDGET (dialog)); +} + +static void +gs_app_version_history_dialog_class_init (GsAppVersionHistoryDialogClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-app-version-history-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsAppVersionHistoryDialog, listbox); +} + +GtkWidget * +gs_app_version_history_dialog_new (GsApp *app) +{ + GsAppVersionHistoryDialog *dialog; + + dialog = g_object_new (GS_TYPE_APP_VERSION_HISTORY_DIALOG, + NULL); + populate_version_history (dialog, app); + + return GTK_WIDGET (dialog); +} diff --git a/src/gs-app-version-history-dialog.h b/src/gs-app-version-history-dialog.h new file mode 100644 index 0000000..fac77d7 --- /dev/null +++ b/src/gs-app-version-history-dialog.h @@ -0,0 +1,23 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Matthew Leeds + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_VERSION_HISTORY_DIALOG (gs_app_version_history_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppVersionHistoryDialog, gs_app_version_history_dialog, GS, APP_VERSION_HISTORY_DIALOG, AdwDialog) + +GtkWidget *gs_app_version_history_dialog_new (GsApp *app); + +G_END_DECLS diff --git a/src/gs-app-version-history-dialog.ui b/src/gs-app-version-history-dialog.ui new file mode 100644 index 0000000..7de6143 --- /dev/null +++ b/src/gs-app-version-history-dialog.ui @@ -0,0 +1,33 @@ + + + + + + diff --git a/src/gs-app-version-history-row.c b/src/gs-app-version-history-row.c new file mode 100644 index 0000000..487a46a --- /dev/null +++ b/src/gs-app-version-history-row.c @@ -0,0 +1,198 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Matthew Leeds + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-app-version-history-row.h" +#include "gs-description-box.h" + +#include "gs-common.h" + +struct _GsAppVersionHistoryRow +{ + GtkListBoxRow parent_instance; + + GtkWidget *version_number_label; + GtkWidget *version_date_label; + GtkWidget *version_description_box; +}; + +G_DEFINE_TYPE (GsAppVersionHistoryRow, gs_app_version_history_row, GTK_TYPE_LIST_BOX_ROW) + +typedef enum { + PROP_ALWAYS_EXPANDED = 1, +} GsAppVersionHistoryRowProperty; + +static GParamSpec *obj_props[PROP_ALWAYS_EXPANDED + 1] = { NULL, }; + +static void +gs_app_version_history_row_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsAppVersionHistoryRow *self = GS_APP_VERSION_HISTORY_ROW (object); + + switch ((GsAppVersionHistoryRowProperty) prop_id) { + case PROP_ALWAYS_EXPANDED: + g_value_set_boolean (value, gs_app_version_history_row_get_always_expanded (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_version_history_row_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsAppVersionHistoryRow *self = GS_APP_VERSION_HISTORY_ROW (object); + + switch ((GsAppVersionHistoryRowProperty) prop_id) { + case PROP_ALWAYS_EXPANDED: + gs_app_version_history_row_set_always_expanded (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_app_version_history_row_class_init (GsAppVersionHistoryRowClass *klass) +{ + GObjectClass *object_class; + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = gs_app_version_history_row_get_property; + object_class->set_property = gs_app_version_history_row_set_property; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-app-version-history-row.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsAppVersionHistoryRow, version_number_label); + gtk_widget_class_bind_template_child (widget_class, GsAppVersionHistoryRow, version_date_label); + gtk_widget_class_bind_template_child (widget_class, GsAppVersionHistoryRow, version_description_box); + + /** + * GsAppVersionHistoryRow:always-expanded: + * + * A proxy property for internal GsDescriptionBox:always-expanded. + * + * Since: 44 + */ + obj_props[PROP_ALWAYS_EXPANDED] = + g_param_spec_boolean ("always-expanded", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +static void +gs_app_version_history_row_init (GsAppVersionHistoryRow *row) +{ + g_type_ensure (GS_TYPE_DESCRIPTION_BOX); + + gtk_widget_init_template (GTK_WIDGET (row)); +} + +/** + * gs_app_version_history_row_set_info: + * @row: a #GsAppVersionHistoryRow + * @version_number: (nullable): version number of the release, or %NULL if unknown + * @version_date: release date of the version, as seconds since the Unix epoch, + * or `0` if unknown + * @version_description: (nullable): Pango Markup for the full human readable + * description of the release, or %NULL if unknown + * + * Set information about the release represented by this version history row. + */ +void +gs_app_version_history_row_set_info (GsAppVersionHistoryRow *row, + const char *version_number, + guint64 version_date, + const char *version_description) +{ + g_autofree char *version_date_string = NULL; + g_autofree char *version_date_string_tooltip = NULL; + + if (version_number == NULL || *version_number == '\0') + return; + + if (version_description != NULL && *version_description != '\0') { + g_autofree char *version_tmp = NULL; + version_tmp = g_strdup_printf (_("New in Version %s"), version_number); + gtk_label_set_label (GTK_LABEL (row->version_number_label), version_tmp); + gs_description_box_set_text (GS_DESCRIPTION_BOX (row->version_description_box), version_description); + gtk_widget_remove_css_class (row->version_description_box, "dim-label"); + } else { + g_autofree char *version_tmp = NULL; + const gchar *version_description_fallback; + version_tmp = g_strdup_printf (_("Version %s"), version_number); + gtk_label_set_label (GTK_LABEL (row->version_number_label), version_tmp); + version_description_fallback = _("No details for this release"); + gs_description_box_set_text (GS_DESCRIPTION_BOX (row->version_description_box), version_description_fallback); + gtk_widget_add_css_class (row->version_description_box, "dim-label"); + } + + if (version_date != 0) { + g_autoptr(GDateTime) date_time = NULL; + const gchar *format_string; + + /* this is the date in the form of "x weeks ago" or "y months ago" */ + version_date_string = gs_utils_time_to_datestring ((gint64) version_date); + + /* TRANSLATORS: This is the date string with: day number, month name, year. + i.e. "25 May 2012" */ + format_string = _("%e %B %Y"); + date_time = g_date_time_new_from_unix_local (version_date); + version_date_string_tooltip = g_date_time_format (date_time, format_string); + } + + if (version_date_string == NULL) + gtk_widget_set_visible (row->version_date_label, FALSE); + else { + gtk_label_set_label (GTK_LABEL (row->version_date_label), version_date_string); + gtk_widget_set_visible (row->version_date_label, TRUE); + } + + if (version_date_string_tooltip != NULL) + gtk_widget_set_tooltip_text (row->version_date_label, version_date_string_tooltip); +} + +GtkWidget * +gs_app_version_history_row_new (void) +{ + GsAppVersionHistoryRow *row; + + row = g_object_new (GS_TYPE_APP_VERSION_HISTORY_ROW, NULL); + return GTK_WIDGET (row); +} + +gboolean +gs_app_version_history_row_get_always_expanded (GsAppVersionHistoryRow *self) +{ + g_return_val_if_fail (GS_IS_APP_VERSION_HISTORY_ROW (self), FALSE); + + return gs_description_box_get_always_expanded (GS_DESCRIPTION_BOX (self->version_description_box)); +} + +void +gs_app_version_history_row_set_always_expanded (GsAppVersionHistoryRow *self, + gboolean always_expanded) +{ + g_return_if_fail (GS_IS_APP_VERSION_HISTORY_ROW (self)); + + gs_description_box_set_always_expanded (GS_DESCRIPTION_BOX (self->version_description_box), always_expanded); +} diff --git a/src/gs-app-version-history-row.h b/src/gs-app-version-history-row.h new file mode 100644 index 0000000..89965c0 --- /dev/null +++ b/src/gs-app-version-history-row.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Matthew Leeds + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_APP_VERSION_HISTORY_ROW (gs_app_version_history_row_get_type ()) + +G_DECLARE_FINAL_TYPE (GsAppVersionHistoryRow, gs_app_version_history_row, GS, APP_VERSION_HISTORY_ROW, GtkListBoxRow) + +GtkWidget *gs_app_version_history_row_new (void); +void gs_app_version_history_row_set_info (GsAppVersionHistoryRow *row, + const char *version_number, + guint64 version_date, + const char *version_description); +gboolean gs_app_version_history_row_get_always_expanded + (GsAppVersionHistoryRow *self); +void gs_app_version_history_row_set_always_expanded + (GsAppVersionHistoryRow *self, + gboolean always_expanded); + +G_END_DECLS diff --git a/src/gs-app-version-history-row.ui b/src/gs-app-version-history-row.ui new file mode 100644 index 0000000..64ca49b --- /dev/null +++ b/src/gs-app-version-history-row.ui @@ -0,0 +1,55 @@ + + + + + diff --git a/src/gs-application.c b/src/gs-application.c new file mode 100644 index 0000000..e3f5c1f --- /dev/null +++ b/src/gs-application.c @@ -0,0 +1,1574 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2013-2018 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-application.h" + +#include +#include +#include +#include + +#ifdef HAVE_PACKAGEKIT +#include "gs-dbus-helper.h" +#endif + +#include "gs-build-ident.h" +#include "gs-common.h" +#include "gs-debug.h" +#include "gs-shell.h" +#include "gs-update-monitor.h" +#include "gs-shell-search-provider.h" + +#define ENABLE_REPOS_DIALOG_CONF_KEY "enable-repos-dialog" + +struct _GsApplication { + AdwApplication parent; + GCancellable *cancellable; + GsPluginLoader *plugin_loader; + gint pending_apps; + GtkWindow *main_window; + GsShell *shell; + GsUpdateMonitor *update_monitor; +#ifdef HAVE_PACKAGEKIT + GsDbusHelper *dbus_helper; +#endif + GsShellSearchProvider *search_provider; /* (nullable) (owned) */ + GSettings *settings; + GSimpleActionGroup *action_map; + guint shell_loaded_handler_id; + GsDebug *debug; /* (owned) (not nullable) */ + + /* Created/freed on demand */ + GHashTable *withdraw_notifications; /* gchar *notification_id ~> GUINT_TO_POINTER (timeout_id) */ +}; + +G_DEFINE_TYPE (GsApplication, gs_application, ADW_TYPE_APPLICATION); + +typedef enum { + PROP_DEBUG = 1, +} GsApplicationProperty; + +static GParamSpec *obj_props[PROP_DEBUG + 1] = { NULL, }; + +enum { + INSTALL_RESOURCES_DONE, + REPOSITORY_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static const char * +get_version (void) +{ + if (g_strcmp0 (BUILD_TYPE, "release") == 0) + return VERSION; + else + return GS_BUILD_IDENTIFIER; +} + +typedef struct { + GsApplication *app; + GSimpleAction *action; + GVariant *action_param; /* (nullable) */ +} GsActivationHelper; + +static GsActivationHelper * +gs_activation_helper_new (GsApplication *app, + GSimpleAction *action, + GVariant *parameter) +{ + GsActivationHelper *helper = g_slice_new0 (GsActivationHelper); + helper->app = app; + helper->action = G_SIMPLE_ACTION (action); + helper->action_param = (parameter != NULL) ? g_variant_ref_sink (parameter) : NULL; + + return helper; +} + +static void +gs_activation_helper_free (GsActivationHelper *helper) +{ + g_clear_pointer (&helper->action_param, g_variant_unref); + g_slice_free (GsActivationHelper, helper); +} + +gboolean +gs_application_has_active_window (GsApplication *application) +{ + GList *windows; + + windows = gtk_application_get_windows (GTK_APPLICATION (application)); + for (GList *l = windows; l != NULL; l = l->next) { + if (gtk_window_is_active (GTK_WINDOW (l->data))) + return TRUE; + } + return FALSE; +} + +static void +gs_application_init (GsApplication *application) +{ + const GOptionEntry options[] = { + { "mode", '\0', 0, G_OPTION_ARG_STRING, NULL, + /* TRANSLATORS: this is a command line option */ + _("Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’"), _("MODE") }, + { "search", '\0', 0, G_OPTION_ARG_STRING, NULL, + _("Search for applications"), _("SEARCH") }, + { "details", '\0', 0, G_OPTION_ARG_STRING, NULL, + _("Show application details (using application ID)"), _("ID") }, + { "details-pkg", '\0', 0, G_OPTION_ARG_STRING, NULL, + _("Show application details (using package name)"), _("PKGNAME") }, + { "install", '\0', 0, G_OPTION_ARG_STRING, NULL, + _("Install the application (using application ID)"), _("ID") }, + { "uninstall", '\0', 0, G_OPTION_ARG_STRING, NULL, + _("Uninstall the application (using application ID)"), _("ID") }, + { "local-filename", '\0', 0, G_OPTION_ARG_FILENAME, NULL, + _("Open a local package file"), _("FILENAME") }, + { "interaction", '\0', 0, G_OPTION_ARG_STRING, NULL, + _("The kind of interaction expected for this action: either " + "‘none’, ‘notify’, or ‘full’"), _("INTERACTION") }, + { "show-metainfo", '\0', 0, G_OPTION_ARG_FILENAME, NULL, + _("Show a local metainfo or appdata file"), _("FILENAME") }, + { "verbose", '\0', 0, G_OPTION_ARG_NONE, NULL, + _("Enable verbose debugging output (from the running instance, if already running)"), NULL }, + { "autoupdate", 0, 0, G_OPTION_ARG_NONE, NULL, + _("Installs any pending updates in the background"), NULL }, + { "prefs", 0, 0, G_OPTION_ARG_NONE, NULL, + _("Show preferences"), NULL }, + { "quit", 0, 0, G_OPTION_ARG_NONE, NULL, + _("Quit the running instance"), NULL }, + { "prefer-local", '\0', 0, G_OPTION_ARG_NONE, NULL, + _("Prefer local file sources to AppStream"), NULL }, + { "version", 0, 0, G_OPTION_ARG_NONE, NULL, + _("Show version number"), NULL }, + { NULL } + }; + + g_application_add_main_option_entries (G_APPLICATION (application), options); +} + +static gboolean +gs_application_dbus_register (GApplication *application, + GDBusConnection *connection, + const gchar *object_path, + GError **error) +{ + GsApplication *app = GS_APPLICATION (application); + app->search_provider = gs_shell_search_provider_new (); + return gs_shell_search_provider_register (app->search_provider, connection, error); +} + +static void +gs_application_dbus_unregister (GApplication *application, + GDBusConnection *connection, + const gchar *object_path) +{ + GsApplication *app = GS_APPLICATION (application); + + if (app->search_provider != NULL) + gs_shell_search_provider_unregister (app->search_provider); +} + +static void +gs_application_shutdown (GApplication *application) +{ + GsApplication *app = GS_APPLICATION (application); + + g_cancellable_cancel (app->cancellable); + g_clear_object (&app->cancellable); + + g_clear_object (&app->shell); + + G_APPLICATION_CLASS (gs_application_parent_class)->shutdown (application); +} + +static void +gs_application_shell_loaded_cb (GsShell *shell, GsApplication *app) +{ + g_signal_handler_disconnect (app->shell, app->shell_loaded_handler_id); + app->shell_loaded_handler_id = 0; +} + +static void +gs_application_present_window (GsApplication *app, const gchar *startup_id) +{ + GList *windows; + GtkWindow *window; + + windows = gtk_application_get_windows (GTK_APPLICATION (app)); + if (windows) { + window = windows->data; + + if (startup_id != NULL) + gtk_window_set_startup_id (window, startup_id); + gtk_window_present (window); + } +} + +static void +sources_activated (GSimpleAction *action, + GVariant *parameter, + gpointer app) +{ + gs_shell_show_sources (GS_APPLICATION (app)->shell); +} + +static void +prefs_activated (GSimpleAction *action, GVariant *parameter, gpointer app) +{ + gs_shell_show_prefs (GS_APPLICATION (app)->shell); +} + +static void +about_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GsApplication *app = GS_APPLICATION (user_data); + const gchar *developers[] = { + "Richard Hughes", + "Matthias Clasen", + "Kalev Lember", + "Allan Day", + "Ryan Lerch", + "William Jon McCann", + "Milan Crha", + "Joaquim Rocha", + "Robert Ancell", + "Philip Withnall", + NULL + }; + + const gchar *designers[] = { + "Allan Day", + "Jakub Steiner", + "William Jon McCann", + "Tobias Bernard", + NULL + }; + +adw_show_about_dialog (GTK_WIDGET (app->main_window), + "application-name", g_get_application_name (), + "application-icon", APPLICATION_ID, + "developer-name", _("The GNOME Project"), + "version", get_version(), + "website", "https://apps.gnome.org/Software", + "support-url", "https://discourse.gnome.org/tag/gnome-software", + "issue-url", "https://gitlab.gnome.org/GNOME/gnome-software/-/issues", + "developers", developers, + "designers", designers, + "copyright", _("Copyright \xc2\xa9 2016–2023 GNOME Software contributors"), + "license-type", GTK_LICENSE_GPL_2_0, + "translator-credits", _("translator-credits"), + NULL); +} + +static void +cancel_trigger_failed_cb (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GsApplication *app = GS_APPLICATION (user_data); + g_autoptr(GError) error = NULL; + if (!gs_plugin_loader_job_action_finish (app->plugin_loader, res, &error)) { + g_warning ("failed to cancel trigger: %s", error->message); + return; + } +} + +static void +reboot_failed_cb (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GsApplication *app = GS_APPLICATION (user_data); + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get result */ + if (gs_utils_invoke_reboot_finish (source, res, &error)) + return; + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_debug ("Calling reboot had been cancelled"); + else if (error != NULL) + g_warning ("Calling reboot failed: %s", error->message); + + /* cancel trigger */ + plugin_job = gs_plugin_job_cancel_offline_update_new (GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_NONE); + gs_plugin_loader_job_process_async (app->plugin_loader, plugin_job, + app->cancellable, + cancel_trigger_failed_cb, + app); +} + +static void +reboot_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + gs_utils_invoke_reboot_async (NULL, NULL, NULL); +} + +static void +job_manager_shutdown_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsApplication) self = user_data; + g_autoptr(GError) error = NULL; + + if (!gs_job_manager_shutdown_finish (GS_JOB_MANAGER (source_object), result, &error)) + g_warning ("Failed to shutdown jobs: %s", error->message); + else + g_debug ("Job manager shutdown finished, going to quit the application."); + + g_application_quit (G_APPLICATION (self)); +} + +static void +shutdown_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *self = GS_APPLICATION (data); + GsJobManager *job_manager = gs_plugin_loader_get_job_manager (self->plugin_loader); + + g_debug ("Initiating shutdown of the job manager from %s()", G_STRFUNC); + gs_job_manager_shutdown_async (job_manager, NULL, job_manager_shutdown_ready_cb, g_object_ref (self)); +} + +static void offline_update_get_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void offline_update_cb (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GsApplication *app); + +static void +reboot_and_install (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + + gs_plugin_loader_get_system_app_async (app->plugin_loader, app->cancellable, + offline_update_get_app_cb, app); +} + +static void +offline_update_get_app_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsApplication *app = GS_APPLICATION (user_data); + g_autoptr(GsApp) system_app = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GError) local_error = NULL; + + system_app = gs_plugin_loader_get_system_app_finish (app->plugin_loader, + result, + &local_error); + + if (system_app == NULL) { + g_warning ("Failed to trigger offline update: %s", local_error->message); + return; + } + + list = gs_app_list_new (); + gs_app_list_add (list, system_app); + + plugin_job = gs_plugin_job_update_apps_new (list, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD); + gs_plugin_loader_job_process_async (app->plugin_loader, plugin_job, + app->cancellable, + (GAsyncReadyCallback) offline_update_cb, + app); +} + +static void +offline_update_cb (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GsApplication *app) +{ + g_autoptr(GError) error = NULL; + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + g_warning ("Failed to trigger offline update: %s", error->message); + return; + } + + gs_utils_invoke_reboot_async (NULL, reboot_failed_cb, app); +} + +static void +quit_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GsApplication *self = GS_APPLICATION (user_data); + GsJobManager *job_manager; + GApplicationFlags flags; + GList *windows; + GtkWidget *window; + + flags = g_application_get_flags (G_APPLICATION (self)); + + if (flags & G_APPLICATION_IS_SERVICE) { + windows = gtk_application_get_windows (GTK_APPLICATION (self)); + if (windows) { + window = windows->data; + gtk_widget_set_visible (window, FALSE); + } + + return; + } + + job_manager = gs_plugin_loader_get_job_manager (self->plugin_loader); + + g_debug ("Initiating shutdown of the job manager from %s()", G_STRFUNC); + gs_job_manager_shutdown_async (job_manager, NULL, job_manager_shutdown_ready_cb, g_object_ref (self)); +} + +static void +activate_on_shell_loaded_cb (GsActivationHelper *helper) +{ + GsApplication *app = helper->app; + + g_action_activate (G_ACTION (helper->action), helper->action_param); + + g_signal_handlers_disconnect_by_data (app->shell, helper); + gs_activation_helper_free (helper); +} + +static void +set_mode_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *mode; + + gs_application_present_window (app, NULL); + + gs_shell_reset_state (app->shell); + + mode = g_variant_get_string (parameter, NULL); + if (g_strcmp0 (mode, "updates") == 0) { + gs_shell_set_mode (app->shell, GS_SHELL_MODE_UPDATES); + } else if (g_strcmp0 (mode, "installed") == 0) { + gs_shell_set_mode (app->shell, GS_SHELL_MODE_INSTALLED); + } else if (g_strcmp0 (mode, "overview") == 0) { + gs_shell_set_mode (app->shell, GS_SHELL_MODE_OVERVIEW); + } else if (g_strcmp0 (mode, "updated") == 0) { + gs_shell_set_mode (app->shell, GS_SHELL_MODE_UPDATES); + gs_shell_show_installed_updates (app->shell); + } else { + g_warning ("Mode '%s' not recognised", mode); + } +} + +static void +search_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *search; + + gs_application_present_window (app, NULL); + + search = g_variant_get_string (parameter, NULL); + gs_shell_reset_state (app->shell); + gs_shell_show_search (app->shell, search); +} + +static void +_search_launchable_details_cb (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GsApp *a; + GsApplication *app = GS_APPLICATION (user_data); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + list = gs_plugin_loader_job_process_finish (app->plugin_loader, res, &error); + if (list == NULL) { + g_warning ("failed to find application: %s", error->message); + return; + } + if (gs_app_list_length (list) == 0) { + gs_shell_set_mode (app->shell, GS_SHELL_MODE_OVERVIEW); + gs_shell_show_notification (app->shell, + /* TRANSLATORS: we tried to show an app that did not exist */ + _("Sorry! There are no details for that application.")); + return; + } + a = gs_app_list_index (list, 0); + gs_shell_reset_state (app->shell); + gs_shell_show_app (app->shell, a); +} + +static void +gs_application_app_to_show_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsApplication *gs_app = user_data; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + + app = gs_plugin_loader_app_create_finish (GS_PLUGIN_LOADER (source_object), result, &error); + if (app == NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) + g_warning ("Failed to create application: %s", error->message); + } else { + g_return_if_fail (GS_IS_APPLICATION (gs_app)); + + gs_shell_reset_state (gs_app->shell); + gs_shell_show_app (gs_app->shell, app); + } +} + +static void +details_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *id; + const gchar *search; + + gs_application_present_window (app, NULL); + + g_variant_get (parameter, "(&s&s)", &id, &search); + g_debug ("trying to activate %s:%s for details", id, search); + if (search != NULL && search[0] != '\0') { + gs_shell_reset_state (app->shell); + gs_shell_show_search_result (app->shell, id, search); + } else { + g_autofree gchar *data_id = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[] = { id, NULL }; + + data_id = gs_utils_unique_id_compat_convert (id); + if (data_id != NULL) { + gs_plugin_loader_app_create_async (app->plugin_loader, data_id, app->cancellable, + gs_application_app_to_show_created_cb, app); + return; + } + + /* find by launchable */ + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "sort-func", gs_utils_app_sort_match_value, + "license-type", gs_shell_get_query_license_type (app->shell), + "developer-verified-type", gs_shell_get_query_developer_verified_type (app->shell), + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + gs_plugin_loader_job_process_async (app->plugin_loader, plugin_job, + app->cancellable, + _search_launchable_details_cb, + app); + } +} + +static void +details_pkg_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *name; + const gchar *plugin_name; + g_autoptr (GsApp) a = NULL; + + gs_application_present_window (app, NULL); + + g_variant_get (parameter, "(&s&s)", &name, &plugin_name); + a = gs_app_new (NULL); + gs_app_add_source (a, name); + if (strcmp (plugin_name, "") != 0) { + GsPlugin *plugin = gs_plugin_loader_find_plugin (app->plugin_loader, plugin_name); + gs_app_set_management_plugin (a, plugin); + } + + gs_shell_reset_state (app->shell); + gs_shell_show_app (app->shell, a); +} + +static void +details_url_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *url; + g_autoptr (GsApp) a = NULL; + + gs_application_present_window (app, NULL); + + g_variant_get (parameter, "(&s)", &url); + + /* this is only used as a wrapper to transport the URL to + * the gs_shell_change_mode() function -- not in the GsAppList */ + a = gs_app_new (NULL); + gs_app_set_metadata (a, "GnomeSoftware::from-url", url); + gs_shell_reset_state (app->shell); + gs_shell_show_app (app->shell, a); +} + +typedef struct { + GWeakRef gs_app_weakref; + gchar *data_id; + GsShellInteraction interaction; +} InstallActivatedHelper; + +static void +gs_application_app_to_install_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + InstallActivatedHelper *helper = user_data; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + + app = gs_plugin_loader_app_create_finish (GS_PLUGIN_LOADER (source_object), result, &error); + if (app == NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) + g_warning ("Failed to create application '%s': %s", helper->data_id, error->message); + } else { + g_autoptr(GsApplication) gs_app = NULL; + + gs_app = g_weak_ref_get (&helper->gs_app_weakref); + if (gs_app != NULL) { + gs_shell_reset_state (gs_app->shell); + gs_shell_install (gs_app->shell, app, helper->interaction); + } + } + + g_weak_ref_clear (&helper->gs_app_weakref); + g_free (helper->data_id); + g_slice_free (InstallActivatedHelper, helper); +} + +static void +install_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *id; + GsShellInteraction interaction; + InstallActivatedHelper *helper; + g_autofree gchar *data_id = NULL; + + g_variant_get (parameter, "(&su)", &id, &interaction); + data_id = gs_utils_unique_id_compat_convert (id); + if (data_id == NULL) { + g_warning ("Need to use a valid unique-id: %s", id); + return; + } + + if (interaction == GS_SHELL_INTERACTION_FULL) + gs_application_present_window (app, NULL); + + helper = g_slice_new0 (InstallActivatedHelper); + g_weak_ref_init (&helper->gs_app_weakref, app); + helper->data_id = g_strdup (data_id); + helper->interaction = interaction; + + gs_plugin_loader_app_create_async (app->plugin_loader, data_id, app->cancellable, + gs_application_app_to_install_created_cb, helper); +} + +typedef struct { + GWeakRef gs_application_weakref; + gchar *data_id; +} UninstallActivatedHelper; + +static void +gs_application_app_to_uninstall_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + UninstallActivatedHelper *helper = user_data; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + g_autoptr (GsApplication) self = g_weak_ref_get (&helper->gs_application_weakref); + + app = gs_plugin_loader_app_create_finish (GS_PLUGIN_LOADER (source_object), result, &error); + + if (app == NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_warning ("Failed to create application '%s': %s", helper->data_id, error->message); + } + } else { + if (self != NULL) { + gs_shell_reset_state (self->shell); + gs_shell_uninstall (self->shell, app); + } + } + + g_weak_ref_clear (&helper->gs_application_weakref); + g_free (helper->data_id); +} + + +static void +uninstall_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *self = GS_APPLICATION (data); + const gchar *id; + g_autofree gchar *data_id = NULL; + UninstallActivatedHelper *helper; + + g_variant_get (parameter, "&s", &id); + + data_id = gs_utils_unique_id_compat_convert (id); + if (data_id == NULL) { + g_warning ("Need to use a valid unique-id: %s", id); + return; + } + + gs_application_present_window (self, NULL); + + helper = g_slice_new0 (UninstallActivatedHelper); + g_weak_ref_init (&helper->gs_application_weakref, self); + helper->data_id = g_strdup (data_id); + + gs_plugin_loader_app_create_async (self->plugin_loader, data_id, self->cancellable, + gs_application_app_to_uninstall_created_cb, helper); +} + +static GFile * +_copy_file_to_cache (GFile *file_src, GError **error) +{ + g_autoptr(GFile) file_dest = NULL; + g_autofree gchar *cache_dir = NULL; + g_autofree gchar *cache_fn = NULL; + g_autofree gchar *basename = NULL; + + /* get destination location */ + cache_dir = g_dir_make_tmp ("gnome-software-XXXXXX", error); + if (cache_dir == NULL) + return NULL; + basename = g_file_get_basename (file_src); + cache_fn = g_build_filename (cache_dir, basename, NULL); + + /* copy file to cache */ + file_dest = g_file_new_for_path (cache_fn); + if (!g_file_copy (file_src, file_dest, + G_FILE_COPY_OVERWRITE, + NULL, /* cancellable */ + NULL, NULL, /* progress */ + error)) { + return NULL; + } + return g_steal_pointer (&file_dest); +} + +static void +filename_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *filename; + g_autoptr(GFile) file = NULL; + + g_variant_get (parameter, "(&s)", &filename); + + /* this could go away at any moment, so make a local copy */ + if (g_str_has_prefix (filename, "/tmp") || + g_str_has_prefix (filename, "/var/tmp")) { + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file_src = g_file_new_for_path (filename); + file = _copy_file_to_cache (file_src, &error); + if (file == NULL) { + g_warning ("failed to copy file, falling back to %s: %s", + filename, error->message); + file = g_file_new_for_path (filename); + } + } else { + file = g_file_new_for_path (filename); + } + gs_shell_reset_state (app->shell); + gs_shell_show_local_file (app->shell, file); +} + +static void +show_metainfo_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *filename; + g_autoptr(GFile) file = NULL; + + g_variant_get (parameter, "(^&ay)", &filename); + + file = g_file_new_for_path (filename); + + gs_shell_reset_state (app->shell); + gs_shell_show_metainfo (app->shell, file); +} + +static void +launch_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *self = GS_APPLICATION (data); + GsApp *app = NULL; + const gchar *id, *management_plugin_name; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsPluginJob) search_job = NULL; + g_autoptr(GsPluginJob) launch_job = NULL; + g_autoptr(GError) error = NULL; + guint ii, len; + GsPlugin *management_plugin; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + + g_variant_get (parameter, "(&s&s)", &id, &management_plugin_name); + + keywords[0] = id; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME, + "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT, + "sort-func", gs_utils_app_sort_match_value, + "license-type", gs_shell_get_query_license_type (self->shell), + "developer-verified-type", gs_shell_get_query_developer_verified_type (self->shell), + NULL); + search_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + list = gs_plugin_loader_job_process (self->plugin_loader, search_job, self->cancellable, &error); + if (!list) { + g_warning ("Failed to search for application '%s' (from '%s'): %s", id, management_plugin_name, error ? error->message : "Unknown error"); + return; + } + + management_plugin = gs_plugin_loader_find_plugin (self->plugin_loader, management_plugin_name); + + len = gs_app_list_length (list); + for (ii = 0; ii < len && !app; ii++) { + GsApp *list_app = gs_app_list_index (list, ii); + + if (gs_app_is_installed (list_app) && + gs_app_has_management_plugin (list_app, management_plugin)) + app = list_app; + } + + if (!app) { + g_warning ("Did not find application '%s' from '%s'", id, management_plugin_name); + return; + } + + launch_job = gs_plugin_job_launch_new (app, GS_PLUGIN_LAUNCH_FLAGS_NONE); + if (!gs_plugin_loader_job_action (self->plugin_loader, launch_job, self->cancellable, &error)) { + g_warning ("Failed to launch app: %s", error->message); + return; + } +} + +static void +show_offline_updates_error (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + + gs_application_present_window (app, NULL); + + gs_shell_reset_state (app->shell); + gs_shell_set_mode (app->shell, GS_SHELL_MODE_UPDATES); + gs_update_monitor_show_error (app->update_monitor, app->main_window); +} + +static void +autoupdate_activated (GSimpleAction *action, GVariant *parameter, gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + gs_shell_reset_state (app->shell); + gs_shell_set_mode (app->shell, GS_SHELL_MODE_UPDATES); + gs_update_monitor_autoupdate (app->update_monitor); +} + +static void +install_resources_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *mode; + const gchar *startup_id; + const gchar *desktop_id; + const gchar *ident; + g_autofree gchar **resources = NULL; + + g_variant_get (parameter, "(&s^a&s&s&s&s)", &mode, &resources, &startup_id, &desktop_id, &ident); + + gs_application_present_window (app, startup_id); + + gs_shell_reset_state (app->shell); + gs_shell_show_extras_search (app->shell, mode, resources, desktop_id, ident); +} + +static void +verbose_activated (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + gs_debug_set_verbose (app->debug, TRUE); +} + +static GActionEntry actions[] = { + { "about", about_activated, NULL, NULL, NULL }, + { "quit", quit_activated, NULL, NULL, NULL }, + { "verbose", verbose_activated, NULL, NULL, NULL }, + { "nop", NULL, NULL, NULL } +}; + +static GActionEntry actions_after_loading[] = { + { "reboot-and-install", reboot_and_install, NULL, NULL, NULL }, + { "reboot", reboot_activated, NULL, NULL, NULL }, + { "shutdown", shutdown_activated, NULL, NULL, NULL }, + { "launch", launch_activated, "(ss)", NULL, NULL }, + { "show-offline-update-error", show_offline_updates_error, NULL, NULL, NULL }, + { "autoupdate", autoupdate_activated, NULL, NULL, NULL }, + { "sources", sources_activated, NULL, NULL, NULL }, + { "prefs", prefs_activated, NULL, NULL, NULL }, + { "set-mode", set_mode_activated, "s", NULL, NULL }, + { "search", search_activated, "s", NULL, NULL }, + { "details", details_activated, "(ss)", NULL, NULL }, + { "details-pkg", details_pkg_activated, "(ss)", NULL, NULL }, + { "details-url", details_url_activated, "(s)", NULL, NULL }, + { "install", install_activated, "(su)", NULL, NULL }, + { "uninstall", uninstall_activated, "s", NULL, NULL }, + { "filename", filename_activated, "(s)", NULL, NULL }, + { "install-resources", install_resources_activated, "(sassss)", NULL, NULL }, + { "show-metainfo", show_metainfo_activated, "(ay)", NULL, NULL }, + { "nop", NULL, NULL, NULL } +}; + +static void +gs_application_update_software_sources_presence (GApplication *self) +{ + GsApplication *app = GS_APPLICATION (self); + GSimpleAction *action; + gboolean enable_sources; + + action = G_SIMPLE_ACTION (g_action_map_lookup_action (G_ACTION_MAP (self), + "sources")); + enable_sources = g_settings_get_boolean (app->settings, + ENABLE_REPOS_DIALOG_CONF_KEY); + g_simple_action_set_enabled (action, enable_sources); +} + +static void +gs_application_settings_changed_cb (GApplication *self, + const gchar *key, + gpointer data) +{ + if (g_strcmp0 (key, ENABLE_REPOS_DIALOG_CONF_KEY) == 0) { + gs_application_update_software_sources_presence (self); + } +} + +static void +wrapper_action_activated_cb (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GsApplication *app = GS_APPLICATION (data); + const gchar *action_name = g_action_get_name (G_ACTION (action)); + GAction *real_action = g_action_map_lookup_action (G_ACTION_MAP (app->action_map), + action_name); + + if (app->shell_loaded_handler_id != 0) { + GsActivationHelper *helper = gs_activation_helper_new (app, + G_SIMPLE_ACTION (real_action), + parameter); + + g_signal_connect_swapped (app->shell, "loaded", + G_CALLBACK (activate_on_shell_loaded_cb), helper); + return; + } + + g_action_activate (real_action, parameter); +} + +static void +gs_application_add_wrapper_actions (GApplication *application) +{ + GsApplication *app = GS_APPLICATION (application); + GActionMap *map = NULL; + + app->action_map = g_simple_action_group_new (); + map = G_ACTION_MAP (app->action_map); + + /* add the real actions to a different map and add wrapper actions to the + * application instead; the wrapper actions will call the real ones but + * after the "loading state" has finished */ + + g_action_map_add_action_entries (G_ACTION_MAP (map), actions_after_loading, + G_N_ELEMENTS (actions_after_loading), + application); + + for (guint i = 0; i < G_N_ELEMENTS (actions_after_loading); ++i) { + const GActionEntry *entry = &actions_after_loading[i]; + GAction *action = g_action_map_lookup_action (map, entry->name); + g_autoptr (GSimpleAction) simple_action = NULL; + + simple_action = g_simple_action_new (g_action_get_name (action), + g_action_get_parameter_type (action)); + g_signal_connect (simple_action, "activate", + G_CALLBACK (wrapper_action_activated_cb), + application); + g_object_bind_property (simple_action, "enabled", action, + "enabled", G_BINDING_DEFAULT); + g_action_map_add_action (G_ACTION_MAP (application), + G_ACTION (simple_action)); + } +} + +static void startup_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +static void +gs_application_startup (GApplication *application) +{ + GSettings *settings; + GsApplication *app = GS_APPLICATION (application); + g_auto(GStrv) plugin_blocklist = NULL; + g_auto(GStrv) plugin_allowlist = NULL; + const gchar *tmp; + + G_APPLICATION_CLASS (gs_application_parent_class)->startup (application); + + gs_application_add_wrapper_actions (application); + + g_action_map_add_action_entries (G_ACTION_MAP (application), + actions, G_N_ELEMENTS (actions), + application); + + /* allow for debugging */ + tmp = g_getenv ("GNOME_SOFTWARE_PLUGINS_BLOCKLIST"); + if (tmp != NULL) + plugin_blocklist = g_strsplit (tmp, ",", -1); + tmp = g_getenv ("GNOME_SOFTWARE_PLUGINS_ALLOWLIST"); + if (tmp != NULL) + plugin_allowlist = g_strsplit (tmp, ",", -1); + + app->plugin_loader = gs_plugin_loader_new (g_application_get_dbus_connection (application), NULL); + if (g_file_test (LOCALPLUGINDIR, G_FILE_TEST_EXISTS)) + gs_plugin_loader_add_location (app->plugin_loader, LOCALPLUGINDIR); + + gs_shell_search_provider_setup (app->search_provider, app->plugin_loader); + +#ifdef HAVE_PACKAGEKIT + app->dbus_helper = gs_dbus_helper_new (g_application_get_dbus_connection (application)); +#endif + settings = g_settings_new ("org.gnome.software"); + app->settings = settings; + g_signal_connect_swapped (settings, "changed", + G_CALLBACK (gs_application_settings_changed_cb), + application); + + /* setup UI */ + app->shell = gs_shell_new (); + app->cancellable = g_cancellable_new (); + + app->shell_loaded_handler_id = g_signal_connect (app->shell, "loaded", + G_CALLBACK (gs_application_shell_loaded_cb), + app); + + app->main_window = GTK_WINDOW (app->shell); + gtk_application_add_window (GTK_APPLICATION (app), app->main_window); + + gs_application_update_software_sources_presence (application); + + /* Remove possibly obsolete notifications */ + g_application_withdraw_notification (application, "installed"); + g_application_withdraw_notification (application, "restart-required"); + g_application_withdraw_notification (application, "updates-available"); + g_application_withdraw_notification (application, "updates-downloaded"); + g_application_withdraw_notification (application, "updates-installed"); + g_application_withdraw_notification (application, "upgrades-available"); + g_application_withdraw_notification (application, "upgrades-downloaded"); + g_application_withdraw_notification (application, "offline-updates"); + g_application_withdraw_notification (application, "eol"); + #ifdef ENABLE_DKMS + g_application_withdraw_notification (application, "dkms-key-pending"); + #endif + + /* Set up the plugins. */ + gs_plugin_loader_setup_async (app->plugin_loader, + (const gchar * const *) plugin_allowlist, + (const gchar * const *) plugin_blocklist, + NULL, + startup_cb, + app); +} + +static void +startup_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsApplication *app = GS_APPLICATION (user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) local_error = NULL; + + if (!gs_plugin_loader_setup_finish (plugin_loader, + result, + &local_error)) { + g_warning ("Failed to setup plugins: %s", local_error->message); + exit (1); + } + + /* show the priority of each plugin */ + gs_plugin_loader_dump_state (plugin_loader); + + app->update_monitor = gs_update_monitor_new (app, app->plugin_loader); + + /* Setup the shell only after the plugin loader finished its setup, + thus all plugins are loaded and ready for the jobs. */ + gs_shell_setup (app->shell, app->plugin_loader, app->cancellable); +} + +static void +gs_application_activate (GApplication *application) +{ + GsApplication *app = GS_APPLICATION (application); + + if (app->shell_loaded_handler_id == 0) + gs_shell_set_mode (app->shell, GS_SHELL_MODE_OVERVIEW); + + gs_shell_activate (GS_APPLICATION (application)->shell); +} + +static void +gs_application_constructed (GObject *object) +{ + GsApplication *self = GS_APPLICATION (object); + + G_OBJECT_CLASS (gs_application_parent_class)->constructed (object); + + /* This is needed when the the application's ID isn't + * org.gnome.Software, e.g. for the development profile (when + * `BUILD_PROFILE` is defined). Without this, icon resources can't + * be loaded appropriately. */ + g_application_set_resource_base_path (G_APPLICATION (self), + "/org/gnome/Software"); + + /* Check on our construct-only properties */ + g_assert (self->debug != NULL); +} + +static void +gs_application_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsApplication *self = GS_APPLICATION (object); + + switch ((GsApplicationProperty) prop_id) { + case PROP_DEBUG: + g_value_set_object (value, self->debug); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_application_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsApplication *self = GS_APPLICATION (object); + + switch ((GsApplicationProperty) prop_id) { + case PROP_DEBUG: + /* Construct only */ + g_assert (self->debug == NULL); + self->debug = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_application_dispose (GObject *object) +{ + GsApplication *app = GS_APPLICATION (object); + + g_clear_object (&app->search_provider); + g_clear_object (&app->plugin_loader); + g_clear_object (&app->update_monitor); +#ifdef HAVE_PACKAGEKIT + g_clear_object (&app->dbus_helper); +#endif + g_clear_object (&app->settings); + g_clear_object (&app->action_map); + g_clear_object (&app->debug); + g_clear_pointer (&app->withdraw_notifications, g_hash_table_unref); + + G_OBJECT_CLASS (gs_application_parent_class)->dispose (object); +} + +static GsShellInteraction +get_page_interaction_from_string (const gchar *interaction) +{ + if (g_strcmp0 (interaction, "notify") == 0) + return GS_SHELL_INTERACTION_NOTIFY; + else if (g_strcmp0 (interaction, "none") == 0) + return GS_SHELL_INTERACTION_NONE; + return GS_SHELL_INTERACTION_FULL; +} + +static int +gs_application_handle_local_options (GApplication *app, GVariantDict *options) +{ + const gchar *id; + const gchar *pkgname; + const gchar *local_filename; + const gchar *mode; + const gchar *search; + gint rc = -1; + g_autoptr(GError) error = NULL; + + /* prefer local sources */ + if (g_variant_dict_contains (options, "prefer-local")) + g_setenv ("GNOME_SOFTWARE_PREFER_LOCAL", "true", TRUE); + + if (g_variant_dict_contains (options, "version")) { + g_print ("gnome-software %s\n", get_version()); + return 0; + } + + if (!g_application_register (app, NULL, &error)) { + g_printerr ("%s\n", error->message); + return 1; + } + + if (g_variant_dict_contains (options, "verbose")) { + g_action_group_activate_action (G_ACTION_GROUP (app), + "verbose", + NULL); + } + + if (g_variant_dict_contains (options, "autoupdate")) { + g_action_group_activate_action (G_ACTION_GROUP (app), + "autoupdate", + NULL); + } + if (g_variant_dict_contains (options, "prefs")) { + g_action_group_activate_action (G_ACTION_GROUP (app), + "prefs", + NULL); + } + if (g_variant_dict_contains (options, "quit")) { + GsApplication *self = GS_APPLICATION (app); + if (!g_application_get_is_remote (app) && (self->shell == NULL || !gs_shell_is_running (self->shell))) { + g_application_quit (app); + g_debug ("Early exit due to --quit option"); + /* early exit, to not continue with setup, plugin initialization and so on */ + return 0; + } + /* The 'quit' command-line option shuts down everything, + * including the backend service */ + g_action_group_activate_action (G_ACTION_GROUP (app), + "shutdown", + NULL); + return 0; + } + + if (g_variant_dict_lookup (options, "mode", "&s", &mode)) { + g_action_group_activate_action (G_ACTION_GROUP (app), + "set-mode", + g_variant_new_string (mode)); + rc = 0; + } else if (g_variant_dict_lookup (options, "search", "&s", &search)) { + g_action_group_activate_action (G_ACTION_GROUP (app), + "search", + g_variant_new_string (search)); + rc = 0; + } else if (g_variant_dict_lookup (options, "details", "&s", &id)) { + g_action_group_activate_action (G_ACTION_GROUP (app), + "details", + g_variant_new ("(ss)", id, "")); + rc = 0; + } else if (g_variant_dict_lookup (options, "details-pkg", "&s", &pkgname)) { + g_action_group_activate_action (G_ACTION_GROUP (app), + "details-pkg", + g_variant_new ("(ss)", pkgname, "")); + rc = 0; + } else if (g_variant_dict_lookup (options, "install", "&s", &id)) { + GsShellInteraction interaction = GS_SHELL_INTERACTION_FULL; + const gchar *str_interaction = NULL; + + if (g_variant_dict_lookup (options, "interaction", "&s", + &str_interaction)) + interaction = get_page_interaction_from_string (str_interaction); + + g_action_group_activate_action (G_ACTION_GROUP (app), + "install", + g_variant_new ("(su)", id, + interaction)); + rc = 0; + } else if (g_variant_dict_lookup (options, "uninstall", "&s", &id)) { + g_action_group_activate_action (G_ACTION_GROUP (app), + "uninstall", + g_variant_new_string (id)); + rc = 0; + } else if (g_variant_dict_lookup (options, "local-filename", "^&ay", &local_filename)) { + g_autoptr(GFile) file = NULL; + g_autofree gchar *absolute_filename = NULL; + + file = g_file_new_for_path (local_filename); + absolute_filename = g_file_get_path (file); + g_action_group_activate_action (G_ACTION_GROUP (app), + "filename", + g_variant_new ("(s)", absolute_filename)); + rc = 0; + } else if (g_variant_dict_lookup (options, "show-metainfo", "^&ay", &local_filename)) { + g_autoptr(GFile) file = NULL; + g_autofree gchar *absolute_filename = NULL; + + file = g_file_new_for_path (local_filename); + absolute_filename = g_file_get_path (file); + g_action_group_activate_action (G_ACTION_GROUP (app), + "show-metainfo", + g_variant_new ("(^ay)", absolute_filename)); + rc = 0; + } + + return rc; +} + +static void +gs_application_open (GApplication *application, + GFile **files, + gint n_files, + const gchar *hint) +{ + GsApplication *app = GS_APPLICATION (application); + gint i; + + for (i = 0; i < n_files; i++) { + g_autofree gchar *str = g_file_get_uri (files[i]); + g_action_group_activate_action (G_ACTION_GROUP (app), + "details-url", + g_variant_new ("(s)", str)); + } +} + +static void +gs_application_class_init (GsApplicationClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GApplicationClass *application_class = G_APPLICATION_CLASS (klass); + + object_class->constructed = gs_application_constructed; + object_class->get_property = gs_application_get_property; + object_class->set_property = gs_application_set_property; + object_class->dispose = gs_application_dispose; + + application_class->startup = gs_application_startup; + application_class->activate = gs_application_activate; + application_class->handle_local_options = gs_application_handle_local_options; + application_class->open = gs_application_open; + application_class->dbus_register = gs_application_dbus_register; + application_class->dbus_unregister = gs_application_dbus_unregister; + application_class->shutdown = gs_application_shutdown; + + /** + * GsApplication:debug: (nullable) + * + * A #GsDebug object to control debug and logging output from the + * application and everything within it. + * + * This may be %NULL if you don’t care about log output. + * + * Since: 40 + */ + obj_props[PROP_DEBUG] = + g_param_spec_object ("debug", NULL, NULL, + GS_TYPE_DEBUG, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + /** + * GsApplication::install-resources-done: + * @ident: Operation identificator, as string + * @op_error: (nullable): an install #GError, or %NULL on success + * + * Emitted after a resource installation operation identified by @ident + * had finished. The @op_error can hold eventual error message, when + * the installation failed. + */ + signals[INSTALL_RESOURCES_DONE] = g_signal_new ( + "install-resources-done", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, + 0, + NULL, NULL, + NULL, + G_TYPE_NONE, 2, + G_TYPE_STRING, G_TYPE_ERROR); + + /** + * GsApplication::repository-changed: + * @repository: a #GsApp of the repository + * + * Emitted when the repository changed, usually when it is enabled or disabled. + * + * Since: 40 + */ + signals[REPOSITORY_CHANGED] = g_signal_new ( + "repository-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_ACTION | G_SIGNAL_NO_RECURSE, + 0, + NULL, NULL, + NULL, + G_TYPE_NONE, 1, + GS_TYPE_APP); +} + +/** + * gs_application_new: + * @debug: (transfer none) (not nullable): a #GsDebug for the application instance + * + * Create a new #GsApplication. + * + * Returns: (transfer full): a new #GsApplication + * Since: 40 + */ +GsApplication * +gs_application_new (GsDebug *debug) +{ + return g_object_new (GS_APPLICATION_TYPE, + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_HANDLES_OPEN, + "inactivity-timeout", 12000, + "debug", debug, + NULL); +} + +void +gs_application_emit_install_resources_done (GsApplication *application, + const gchar *ident, + const GError *op_error) +{ + g_signal_emit (application, signals[INSTALL_RESOURCES_DONE], 0, ident, op_error, NULL); +} + +static gboolean +gs_application_withdraw_notification_cb (gpointer user_data) +{ + GApplication *application = g_application_get_default (); + const gchar *notification_id = user_data; + + gs_application_withdraw_notification (GS_APPLICATION (application), notification_id); + + return G_SOURCE_REMOVE; +} + +/** + * gs_application_send_notification: + * @self: a #GsApplication + * @notification_id: the @notification ID + * @notification: a #GNotification + * @timeout_minutes: how many minutes to wait, before withdraw the notification; 0 for not withdraw + * + * Sends the @notification and schedules withdraw of it after + * @timeout_minutes. This is used to auto-hide notifications + * after certain period of time. The @timeout_minutes set to 0 + * means to not auto-withdraw it. + * + * Since: 43 + **/ +void +gs_application_send_notification (GsApplication *self, + const gchar *notification_id, + GNotification *notification, + guint timeout_minutes) +{ + guint timeout_id; + + g_return_if_fail (GS_IS_APPLICATION (self)); + g_return_if_fail (notification_id != NULL); + g_return_if_fail (G_IS_NOTIFICATION (notification)); + g_return_if_fail (timeout_minutes < G_MAXUINT / 60); + + g_application_send_notification (G_APPLICATION (self), notification_id, notification); + + if (timeout_minutes > 0) { + if (self->withdraw_notifications == NULL) + self->withdraw_notifications = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + timeout_id = GPOINTER_TO_UINT (g_hash_table_lookup (self->withdraw_notifications, notification_id)); + if (timeout_id) + g_source_remove (timeout_id); + timeout_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, timeout_minutes * 60, + gs_application_withdraw_notification_cb, g_strdup (notification_id), g_free); + g_hash_table_insert (self->withdraw_notifications, g_strdup (notification_id), GUINT_TO_POINTER (timeout_id)); + } else if (self->withdraw_notifications != NULL) { + timeout_id = GPOINTER_TO_UINT (g_hash_table_lookup (self->withdraw_notifications, notification_id)); + if (timeout_id) { + g_source_remove (timeout_id); + g_hash_table_remove (self->withdraw_notifications, notification_id); + } + } +} + +/** + * gs_application_withdraw_notification: + * @self: a #GsApplication + * @notification_id: a #GNotification ID + * + * Immediately withdraws the notification @notification_id and + * removes any previously scheduled withdraw by gs_application_schedule_withdraw_notification(). + * + * Since: 43 + **/ +void +gs_application_withdraw_notification (GsApplication *self, + const gchar *notification_id) +{ + g_return_if_fail (GS_IS_APPLICATION (self)); + g_return_if_fail (notification_id != NULL); + + g_application_withdraw_notification (G_APPLICATION (self), notification_id); + + if (self->withdraw_notifications != NULL) { + g_hash_table_remove (self->withdraw_notifications, notification_id); + if (g_hash_table_size (self->withdraw_notifications) == 0) + g_clear_pointer (&self->withdraw_notifications, g_hash_table_unref); + } +} diff --git a/src/gs-application.h b/src/gs-application.h new file mode 100644 index 0000000..56f5163 --- /dev/null +++ b/src/gs-application.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" +#include "gs-debug.h" + +#define GS_APPLICATION_TYPE (gs_application_get_type ()) + +G_DECLARE_FINAL_TYPE (GsApplication, gs_application, GS, APPLICATION, AdwApplication) + +GsApplication *gs_application_new (GsDebug *debug); +gboolean gs_application_has_active_window (GsApplication *application); +void gs_application_emit_install_resources_done + (GsApplication *application, + const gchar *ident, + const GError *op_error); +void gs_application_send_notification (GsApplication *self, + const gchar *notification_id, + GNotification *notification, + guint timeout_minutes); +void gs_application_withdraw_notification (GsApplication *self, + const gchar *notification_id); diff --git a/src/gs-basic-auth-dialog.c b/src/gs-basic-auth-dialog.c new file mode 100644 index 0000000..0f3226b --- /dev/null +++ b/src/gs-basic-auth-dialog.c @@ -0,0 +1,153 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-basic-auth-dialog.h" + +#include +#include +#include + +struct _GsBasicAuthDialog +{ + AdwDialog parent_instance; + + GsBasicAuthCallback callback; + gpointer callback_data; + + /* template widgets */ + GtkButton *login_button; + AdwPreferencesPage *page; + AdwEntryRow *user_entry; + AdwEntryRow *password_entry; +}; + +G_DEFINE_TYPE (GsBasicAuthDialog, gs_basic_auth_dialog, ADW_TYPE_DIALOG) + +static void +cancel_button_clicked_cb (GsBasicAuthDialog *dialog) +{ + if (dialog->callback != NULL) { + /* abort the basic auth request */ + dialog->callback (NULL, NULL, dialog->callback_data); + dialog->callback = NULL; + } + + adw_dialog_close (ADW_DIALOG (dialog)); +} + +static void +login_button_clicked_cb (GsBasicAuthDialog *dialog) +{ + const gchar *user; + const gchar *password; + + user = gtk_editable_get_text (GTK_EDITABLE (dialog->user_entry)); + password = gtk_editable_get_text (GTK_EDITABLE (dialog->password_entry)); + + if (dialog->callback != NULL) { + /* submit the user/password to basic auth */ + dialog->callback (user, password, dialog->callback_data); + dialog->callback = NULL; + } + + adw_dialog_close (ADW_DIALOG (dialog)); +} + +static void +dialog_validate (GsBasicAuthDialog *dialog) +{ + const gchar *user; + const gchar *password; + gboolean valid_user; + gboolean valid_password; + + /* require user */ + user = gtk_editable_get_text (GTK_EDITABLE (dialog->user_entry)); + valid_user = user != NULL && strlen (user) != 0; + + /* require password */ + password = gtk_editable_get_text (GTK_EDITABLE (dialog->password_entry)); + valid_password = password != NULL && strlen (password) != 0; + + gtk_widget_set_sensitive (GTK_WIDGET (dialog->login_button), valid_user && valid_password); +} + +static void +update_description (GsBasicAuthDialog *dialog, const gchar *remote, const gchar *realm) +{ + g_autofree gchar *description = NULL; + + /* TRANSLATORS: This is a description for entering user/password */ + description = g_strdup_printf (_("Login required remote %s (realm %s)"), + remote, realm); + adw_preferences_page_set_description (dialog->page, description); +} + +static gboolean +close_cb (GtkWidget *widget, GVariant *args, gpointer user_data) +{ + GsBasicAuthDialog *dialog = GS_BASIC_AUTH_DIALOG (widget); + + cancel_button_clicked_cb (dialog); + + return GDK_EVENT_STOP; +} + +static void +gs_basic_auth_dialog_map (GtkWidget *widget) +{ + GTK_WIDGET_CLASS (gs_basic_auth_dialog_parent_class)->map (widget); + gtk_widget_grab_focus (GTK_WIDGET (GS_BASIC_AUTH_DIALOG (widget)->user_entry)); +} + +static void +gs_basic_auth_dialog_init (GsBasicAuthDialog *dialog) +{ + gtk_widget_init_template (GTK_WIDGET (dialog)); +} + +static void +gs_basic_auth_dialog_class_init (GsBasicAuthDialogClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + widget_class->map = gs_basic_auth_dialog_map; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-basic-auth-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsBasicAuthDialog, login_button); + gtk_widget_class_bind_template_child (widget_class, GsBasicAuthDialog, page); + gtk_widget_class_bind_template_child (widget_class, GsBasicAuthDialog, user_entry); + gtk_widget_class_bind_template_child (widget_class, GsBasicAuthDialog, password_entry); + + gtk_widget_class_bind_template_callback (widget_class, dialog_validate); + gtk_widget_class_bind_template_callback (widget_class, cancel_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, login_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, close_cb); +} + +GtkWidget * +gs_basic_auth_dialog_new (const gchar *remote, + const gchar *realm, + GsBasicAuthCallback callback, + gpointer callback_data) +{ + GsBasicAuthDialog *dialog; + + dialog = g_object_new (GS_TYPE_BASIC_AUTH_DIALOG, + NULL); + dialog->callback = callback; + dialog->callback_data = callback_data; + + update_description (dialog, remote, realm); + dialog_validate (dialog); + + return GTK_WIDGET (dialog); +} diff --git a/src/gs-basic-auth-dialog.h b/src/gs-basic-auth-dialog.h new file mode 100644 index 0000000..2ec3555 --- /dev/null +++ b/src/gs-basic-auth-dialog.h @@ -0,0 +1,28 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +typedef void (*GsBasicAuthCallback) (const gchar *user, const gchar *password, gpointer callback_data); + +#define GS_TYPE_BASIC_AUTH_DIALOG (gs_basic_auth_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsBasicAuthDialog, gs_basic_auth_dialog, GS, BASIC_AUTH_DIALOG, AdwDialog) + +GtkWidget *gs_basic_auth_dialog_new (const gchar *remote, + const gchar *realm, + GsBasicAuthCallback callback, + gpointer callback_data); + +G_END_DECLS diff --git a/src/gs-basic-auth-dialog.ui b/src/gs-basic-auth-dialog.ui new file mode 100644 index 0000000..4c11550 --- /dev/null +++ b/src/gs-basic-auth-dialog.ui @@ -0,0 +1,76 @@ + + + + + + + horizontal + + + + + + diff --git a/src/gs-category-page.c b/src/gs-category-page.c new file mode 100644 index 0000000..4b55ee6 --- /dev/null +++ b/src/gs-category-page.c @@ -0,0 +1,951 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-app-list-private.h" +#include "gs-common.h" +#include "gs-featured-carousel.h" +#include "gs-summary-tile.h" +#include "gs-category-page.h" +#include "gs-utils.h" + +struct _GsCategoryPage +{ + GsPage parent_instance; + + GsPluginLoader *plugin_loader; + GCancellable *cancellable; + GsCategory *category; + GsCategory *subcategory; + gboolean content_valid; + + GtkWidget *top_carousel; + GtkWidget *other_heading; + GtkWidget *category_detail_box; + GtkWidget *scrolledwindow_category; + GtkWidget *featured_flow_box; + GtkWidget *recently_updated_flow_box; + GtkWidget *web_apps_flow_box; +}; + +G_DEFINE_TYPE (GsCategoryPage, gs_category_page, GS_TYPE_PAGE) + +/* See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2053 + * for the rationale behind the numbers */ +#define MAX_RECENT_APPS_TO_DISPLAY 12 +#define MIN_RECENT_APPS_REQUIRED 50 +#define MIN_SECTION_APPS 3 + +#define validate_app_buckets() \ + n_total_apps = n_carousel_apps + n_featured_apps + n_recently_updated_apps + n_web_apps + n_other_apps; \ + print_app_bucket_stats (self, n_carousel_apps, n_featured_apps, n_recently_updated_apps, n_web_apps, n_other_apps, n_category_apps); \ + \ + g_assert (n_total_apps == n_category_apps); \ + g_assert (n_featured_apps == 0 || n_featured_apps == featured_app_tiles->len); \ + g_assert (n_recently_updated_apps == 0 || n_recently_updated_apps == recently_updated_app_tiles->len); \ + g_assert (n_web_apps == 0 || n_web_apps == web_app_tiles->len); \ + g_assert (n_other_apps == 0 || n_other_apps == other_app_tiles->len); \ + +typedef enum { + PROP_CATEGORY = 1, + /* Override properties: */ + PROP_TITLE, +} GsCategoryPageProperty; + +static GParamSpec *obj_props[PROP_CATEGORY + 1] = { NULL, }; + +typedef enum { + SIGNAL_APP_CLICKED, +} GsCategoryPageSignal; + +static guint obj_signals[SIGNAL_APP_CLICKED + 1] = { 0, }; + +static void +app_activated_cb (GsCategoryPage *self, GsAppTile *tile) +{ + GsApp *app; + + app = gs_app_tile_get_app (tile); + + if (!app) + return; + + g_signal_emit (self, obj_signals[SIGNAL_APP_CLICKED], 0, app); +} + +static void +top_carousel_app_clicked_cb (GsFeaturedCarousel *carousel, + GsApp *app, + gpointer user_data) +{ + GsCategoryPage *self = GS_CATEGORY_PAGE (user_data); + + g_signal_emit (self, obj_signals[SIGNAL_APP_CLICKED], 0, app); +} + +static void +gs_category_page_add_placeholders (GsCategoryPage *self, + GtkFlowBox *flow_box, + guint n_placeholders) +{ + gs_widget_remove_all (GTK_WIDGET (flow_box), (GsRemoveFunc) gtk_flow_box_remove); + + for (guint i = 0; i < n_placeholders; ++i) { + GtkWidget *tile = gs_summary_tile_new (NULL); + gtk_flow_box_insert (flow_box, tile, -1); + } + + gtk_widget_set_visible (GTK_WIDGET (flow_box), TRUE); +} + +typedef struct { + GsCategoryPage *page; /* (owned) */ + GHashTable *featured_app_ids; /* (owned) (nullable) (element-type utf8 utf8) */ + gboolean get_featured_apps_finished; + GsAppList *apps; /* (owned) (nullable) */ + gboolean get_main_apps_finished; + gboolean cancelled; +} LoadCategoryData; + +static void +load_category_data_free (LoadCategoryData *data) +{ + g_clear_object (&data->page); + g_clear_pointer (&data->featured_app_ids, g_hash_table_unref); + g_clear_object (&data->apps); + g_free (data); +} + +static void load_category_finish (LoadCategoryData *data); + +static void +gs_category_page_get_featured_apps_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + LoadCategoryData *data = user_data; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) local_error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GHashTable) featured_app_ids = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, + res, + &local_error); + if (list == NULL) { + if (!g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get featured apps for category apps: %s", local_error->message); + else + data->cancelled = TRUE; + data->get_featured_apps_finished = TRUE; + load_category_finish (data); + return; + } + + featured_app_ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + g_hash_table_add (featured_app_ids, g_strdup (gs_app_get_id (app))); + } + + data->featured_app_ids = g_steal_pointer (&featured_app_ids); + data->get_featured_apps_finished = TRUE; + load_category_finish (data); +} + +static void +gs_category_page_get_apps_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + LoadCategoryData *data = user_data; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) local_error = NULL; + g_autoptr(GsAppList) list = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, + res, + &local_error); + if (list == NULL) { + if (!g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get apps for category apps: %s", local_error->message); + else + data->cancelled = TRUE; + data->get_main_apps_finished = TRUE; + load_category_finish (data); + return; + } + + data->apps = g_steal_pointer (&list); + data->get_main_apps_finished = TRUE; + load_category_finish (data); +} + +static gboolean +app_has_hi_res_icon (GsCategoryPage *self, + GsApp *app) +{ + g_autoptr(GIcon) icon = NULL; + + /* This is the minimum icon size needed by `GsFeatureTile`. */ + icon = gs_app_get_icon_for_size (app, + 128, + gtk_widget_get_scale_factor (GTK_WIDGET (self)), + NULL); + + /* Returning TRUE means to keep the app in the list */ + return (icon != NULL); +} + +static GsAppList * +choose_top_carousel_apps (LoadCategoryData *data, + guint64 recently_updated_cutoff_secs) +{ + guint n_top_carousel_apps; + g_autoptr(GPtrArray) candidates = g_ptr_array_new_with_free_func (NULL); + g_autoptr(GsAppList) top_carousel_apps = gs_app_list_new (); + guint top_carousel_seed; + g_autoptr(GRand) top_carousel_rand = NULL; + + if (data->apps == NULL || + gs_app_list_length (data->apps) < 20) { + g_debug ("%u is not enough category apps, hiding top carousel", data->apps == NULL ? 0 : gs_app_list_length (data->apps)); + return g_steal_pointer (&top_carousel_apps); + } + + /* See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2053 for design rationale */ + if (gs_app_list_length (data->apps) < 40) + n_top_carousel_apps = 3; + else + n_top_carousel_apps = 5; + + /* The top carousel should contain @n_top_carousel_apps, taken from the + * set of featured apps which have hi-res icons. + * + * The apps in the top carousel should be changed on a fixed schedule, + * once a week. + */ + top_carousel_seed = (g_get_real_time () / G_USEC_PER_SEC) / (7 * 24 * 60 * 60); + top_carousel_rand = g_rand_new_with_seed (top_carousel_seed); + g_debug ("Top carousel seed: %u", top_carousel_seed); + + for (guint i = 0; i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + gboolean is_featured, is_hi_res; + + is_featured = (data->featured_app_ids != NULL && + g_hash_table_contains (data->featured_app_ids, gs_app_get_id (app))); + is_hi_res = app_has_hi_res_icon (data->page, app); + + if (is_featured && is_hi_res) + g_ptr_array_add (candidates, app); + } + + /* If there aren’t enough candidate apps to populate the top carousel, + * return an empty app list. */ + if (candidates->len < n_top_carousel_apps) { + g_debug ("Only %u candidate apps for top carousel, needed at least %u; returning empty", candidates->len, n_top_carousel_apps); + goto out; + } + + /* Select @n_top_carousel_apps from @candidates uniformly randomly + * without replacement. */ + for (guint i = 0; i < n_top_carousel_apps; i++) { + guint random_index = g_rand_int_range (top_carousel_rand, 0, candidates->len); + GsApp *app = g_ptr_array_index (candidates, random_index); + + gs_app_list_add (top_carousel_apps, app); + g_ptr_array_remove_index_fast (candidates, random_index); + } + + out: + g_assert (gs_app_list_length (top_carousel_apps) == 0 || + gs_app_list_length (top_carousel_apps) == n_top_carousel_apps); + + return g_steal_pointer (&top_carousel_apps); +} + +static gint +app_name_flowbox_sort_func (GtkFlowBoxChild *child1, + GtkFlowBoxChild *child2, + gpointer user_data) +{ + GsAppTile *tile1 = GS_APP_TILE (child1); + GsAppTile *tile2 = GS_APP_TILE (child2); + GsApp *app1 = gs_app_tile_get_app (tile1); + GsApp *app2 = gs_app_tile_get_app (tile2); + + /* Placeholder tiles have no app. */ + if (app1 == NULL && app2 == NULL) + return 0; + if (app1 == NULL) + return 1; + if (app2 == NULL) + return -1; + + return gs_utils_app_sort_name (app1, app2, NULL); +} + +static gint +release_date_sort_func (GsAppTile *tile1, + GsAppTile *tile2) +{ + GsApp *app1 = gs_app_tile_get_app (tile1); + GsApp *app2 = gs_app_tile_get_app (tile2); + guint64 release_date1, release_date2; + + /* Placeholder tiles have no app. */ + if (app1 == NULL && app2 == NULL) + return 0; + if (app1 == NULL) + return 1; + if (app2 == NULL) + return -1; + + release_date1 = gs_app_get_release_date (app1); + release_date2 = gs_app_get_release_date (app2); + + if (release_date1 == release_date2) + return gs_utils_app_sort_name (app1, app2, NULL); + + return release_date1 < release_date2 ? 1 : -1; +} + +static gint +release_date_gptrarray_sort_func (gconstpointer tile1, + gconstpointer tile2) +{ + GsAppTile *tile_a = (*(GsAppTile **) tile1); + GsAppTile *tile_b = (*(GsAppTile **) tile2); + + return release_date_sort_func (tile_a, tile_b); +} + +static gint +release_date_flowbox_sort_func (GtkFlowBoxChild *child1, + GtkFlowBoxChild *child2, + gpointer user_data) +{ + GsAppTile *tile1 = GS_APP_TILE (child1); + GsAppTile *tile2 = GS_APP_TILE (child2); + + return release_date_sort_func (tile1, tile2); +} + + +/* Sort all flow boxes in this page, if 'enable' is TRUE, else disable + sorting on all flow boxes. Sorting should always be enabled, except + for cases when doing bulk additions, where sorting once after the + bulk addition will offer better performance. */ +static void +gs_category_page_set_sort (GsCategoryPage *self, gboolean enable) +{ + GtkFlowBoxSortFunc name_sort_func = NULL; + GtkFlowBoxSortFunc recent_sort_func = NULL; + + if (enable) { + name_sort_func = app_name_flowbox_sort_func; + recent_sort_func = release_date_flowbox_sort_func; + } + + /* Sort the featured apps flowbox by app name, when sorting is + enabled. */ + gtk_flow_box_set_sort_func (GTK_FLOW_BOX (self->featured_flow_box), + name_sort_func, + NULL, + NULL); + + /* Sort the recent apps flowbox by release date, when sorting + is enabled. Note that recent apps flowbox is already + sorted. This call is there to account for the case + (possibly in future), where app tiles are added to the + flowbox after the initial population in 'populate_flow_boxes ()'. */ + gtk_flow_box_set_sort_func (GTK_FLOW_BOX (self->recently_updated_flow_box), + recent_sort_func, + NULL, + NULL); + + /* Sort the web apps flowbox by app name, when sorting is enabled. */ + gtk_flow_box_set_sort_func (GTK_FLOW_BOX (self->web_apps_flow_box), + name_sort_func, + NULL, + NULL); + + /* Sort the other apps flowbox by app name, when sorting is enabled. */ + gtk_flow_box_set_sort_func (GTK_FLOW_BOX (self->category_detail_box), + name_sort_func, + NULL, + NULL); +} + +static void +populate_flow_boxes (GsCategoryPage *self, + GPtrArray *featured_app_tiles, + GPtrArray *recently_updated_app_tiles, + GPtrArray *web_app_tiles, + GPtrArray *other_app_tiles) +{ + guint i; + GtkWidget *tile; + + /* Disable sorting on all flowboxes so we don't sort on each + flowbox insertion which is not good for performance. */ + gs_category_page_set_sort (self, FALSE); + + /* Populate featured flowbox */ + if (featured_app_tiles) { + for (i = 0; i < featured_app_tiles->len; i++) { + tile = g_ptr_array_index (featured_app_tiles, i); + gtk_flow_box_insert (GTK_FLOW_BOX (self->featured_flow_box), tile, -1); + } + } + + /* Populate recently updated flowbox */ + if (recently_updated_app_tiles) { + for (i = 0; i < recently_updated_app_tiles->len; i++) { + guint64 release_date; + g_autofree gchar *release_date_tooltip = NULL; + tile = g_ptr_array_index (recently_updated_app_tiles, i); + + /* Shows the latest release date of the app in + relative format (e.g. "10 days ago") on hover. */ + release_date = gs_app_get_release_date (gs_app_tile_get_app (GS_APP_TILE (tile))); + release_date_tooltip = gs_utils_time_to_datestring (release_date); + gtk_widget_set_tooltip_text (tile, release_date_tooltip); + + gtk_flow_box_insert (GTK_FLOW_BOX (self->recently_updated_flow_box), tile, -1); + } + } + + /* Populate web apps flowbox */ + if (web_app_tiles) { + for (i = 0; i < web_app_tiles->len; i++) { + tile = g_ptr_array_index (web_app_tiles, i); + gtk_flow_box_insert (GTK_FLOW_BOX (self->web_apps_flow_box), tile, -1); + } + } + + /* Populate other apps flowbox */ + if (other_app_tiles) { + for (i = 0; i < other_app_tiles->len; i++) { + tile = g_ptr_array_index (other_app_tiles, i); + gtk_flow_box_insert (GTK_FLOW_BOX (self->category_detail_box), tile, -1); + } + } + + /* Re-enable sorting on all flowboxes now that they are fully + populated */ + gs_category_page_set_sort (self, TRUE); +} + +static void +print_app_bucket_stats (GsCategoryPage *self, + guint64 n_carousel_apps, + guint64 n_featured_apps, + guint64 n_recently_updated_apps, + guint64 n_web_apps, + guint64 n_other_apps, + guint64 n_total_apps) +{ + g_debug ("[%s] Carousel apps: %" G_GUINT64_FORMAT ", Featured apps: %" G_GUINT64_FORMAT ", Recent apps: %" G_GUINT64_FORMAT ", " + "Web apps: %" G_GUINT64_FORMAT ", Other apps: %" G_GUINT64_FORMAT ", Total apps: %" G_GUINT64_FORMAT, + gs_category_get_name (self->category), + n_carousel_apps, n_featured_apps, n_recently_updated_apps, + n_web_apps, n_other_apps, n_total_apps); +} + +static void +load_category_finish (LoadCategoryData *data) +{ + GsCategoryPage *self = data->page; + guint64 recently_updated_cutoff_secs; + guint64 n_recently_updated_apps = 0; + guint64 n_featured_apps = 0; + guint64 n_web_apps = 0; + guint64 n_carousel_apps = 0; + guint64 n_other_apps = 0; + guint64 n_category_apps = 0; + guint64 n_total_apps; + g_autoptr(GPtrArray) featured_app_tiles = g_ptr_array_new (); + g_autoptr(GPtrArray) recently_updated_app_tiles = g_ptr_array_new (); + g_autoptr(GPtrArray) web_app_tiles = g_ptr_array_new (); + g_autoptr(GPtrArray) other_app_tiles = NULL; + g_autoptr(GsAppList) top_carousel_apps = NULL; + GtkWidget *tile; + + if (!data->get_featured_apps_finished || + !data->get_main_apps_finished) + return; + + if (data->cancelled) { + load_category_data_free (data); + return; + } + + /* Remove the loading tiles. */ + gs_widget_remove_all (self->featured_flow_box, (GsRemoveFunc) gtk_flow_box_remove); + gs_widget_remove_all (self->recently_updated_flow_box, (GsRemoveFunc) gtk_flow_box_remove); + gs_widget_remove_all (self->web_apps_flow_box, (GsRemoveFunc) gtk_flow_box_remove); + gs_widget_remove_all (self->category_detail_box, (GsRemoveFunc) gtk_flow_box_remove); + + /* Last 30 days */ + recently_updated_cutoff_secs = g_get_real_time () / G_USEC_PER_SEC - 30 * 24 * 60 * 60; + + if (data->apps) + n_category_apps = gs_app_list_length (data->apps); + + /* High probability that all apps could land here */ + other_app_tiles = g_ptr_array_sized_new (n_category_apps); + + /* Apps to go in the top carousel */ + top_carousel_apps = choose_top_carousel_apps (data, recently_updated_cutoff_secs); + + for (guint i = 0; data->apps != NULL && i < gs_app_list_length (data->apps); i++) { + GsApp *app = gs_app_list_index (data->apps, i); + gboolean is_featured, is_recently_updated; + guint64 release_date; + + /* To be listed in the top carousel? */ + if (gs_app_list_lookup (top_carousel_apps, gs_app_get_unique_id (app)) != NULL) { + n_carousel_apps++; + continue; + } + + release_date = gs_app_get_release_date (app); + is_featured = (data->featured_app_ids != NULL && + g_hash_table_contains (data->featured_app_ids, gs_app_get_id (app))); + is_recently_updated = (release_date > recently_updated_cutoff_secs); + + tile = gs_summary_tile_new (app); + + if (is_featured) { + n_featured_apps++; + g_ptr_array_add (featured_app_tiles, tile); + } else if (is_recently_updated) { + n_recently_updated_apps++; + g_ptr_array_add (recently_updated_app_tiles, tile); + } else if (gs_app_get_kind (app) == AS_COMPONENT_KIND_WEB_APP) { + n_web_apps++; + g_ptr_array_add (web_app_tiles, tile); + } else { + n_other_apps++; + g_ptr_array_add (other_app_tiles, tile); + } + } + + validate_app_buckets (); + + /* If these sections end up being too empty (which looks odd), merge them into the main section. + * See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2053 */ + if (n_featured_apps > 0 && n_featured_apps < MIN_SECTION_APPS) { + g_debug ("\tOnly %" G_GUINT64_FORMAT " featured apps, needed at least %d; moving apps to others", + n_featured_apps, MIN_SECTION_APPS); + g_ptr_array_extend_and_steal (other_app_tiles, g_steal_pointer (&featured_app_tiles)); + n_other_apps += n_featured_apps; + n_featured_apps = 0; + } + + + if (n_web_apps > 0 && n_web_apps < MIN_SECTION_APPS) { + g_debug ("\tOnly %" G_GUINT64_FORMAT " web apps, needed at least %d; moving apps to others", + n_web_apps, MIN_SECTION_APPS); + g_ptr_array_extend_and_steal (other_app_tiles, g_steal_pointer (&web_app_tiles)); + n_other_apps += n_web_apps; + n_web_apps = 0; + } + + /* Show 'New & Updated' section only if there had been enough of them recognized. + * See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2053 */ + if (n_recently_updated_apps > 0) { + if (n_recently_updated_apps < MIN_RECENT_APPS_REQUIRED) { + g_debug ("\tOnly %" G_GUINT64_FORMAT " recent apps, needed at least %d; moving apps to others", + n_recently_updated_apps, MIN_RECENT_APPS_REQUIRED); + g_ptr_array_extend_and_steal (other_app_tiles, g_steal_pointer (&recently_updated_app_tiles)); + n_other_apps += n_recently_updated_apps; + n_recently_updated_apps = 0; + } else { + guint n_apps_to_move; + + /* Defer sorting till we're sure that sorted + data will be actually useful */ + g_ptr_array_sort (recently_updated_app_tiles, release_date_gptrarray_sort_func); + + g_assert (n_recently_updated_apps >= MAX_RECENT_APPS_TO_DISPLAY); + n_apps_to_move = n_recently_updated_apps - MAX_RECENT_APPS_TO_DISPLAY; + + if (n_apps_to_move > 0) { + g_debug ("\tAlready %" G_GUINT64_FORMAT " recent apps, needed at most %d; moving %u apps to others", + n_recently_updated_apps, MAX_RECENT_APPS_TO_DISPLAY, n_apps_to_move); + + for (guint j = 0; j < n_apps_to_move; j++) { + /* keep removing at the same index */ + tile = g_ptr_array_steal_index_fast (recently_updated_app_tiles, MAX_RECENT_APPS_TO_DISPLAY); + g_ptr_array_add (other_app_tiles, tile); + } + + n_recently_updated_apps -= n_apps_to_move; + n_other_apps += n_apps_to_move; + } + } + } + + validate_app_buckets (); + + /* Populate all flowboxes. */ + populate_flow_boxes (self, featured_app_tiles, recently_updated_app_tiles, web_app_tiles, other_app_tiles); + + /* Show carousel only if it has apps */ + gtk_widget_set_visible (self->top_carousel, gs_app_list_length (top_carousel_apps) > 0); + gs_featured_carousel_set_apps (GS_FEATURED_CAROUSEL (self->top_carousel), top_carousel_apps); + + /* Show each of the flow boxes only if they have apps. */ + gtk_widget_set_visible (self->featured_flow_box, n_featured_apps > 0); + gtk_widget_set_visible (self->recently_updated_flow_box, n_recently_updated_apps > 0); + gtk_widget_set_visible (self->web_apps_flow_box, n_web_apps > 0); + gtk_widget_set_visible (self->category_detail_box, n_other_apps > 0); + + /* Don't show "Other Software" heading if it's the only heading */ + gtk_widget_set_visible (self->other_heading, gtk_widget_get_visible (self->category_detail_box) && ( + gtk_widget_get_visible (self->featured_flow_box) || + gtk_widget_get_visible (self->recently_updated_flow_box) || + gtk_widget_get_visible (self->web_apps_flow_box))); + + self->content_valid = data->apps != NULL; + + load_category_data_free (data); +} + +static void +gs_category_page_load_category (GsCategoryPage *self) +{ + GsCategory *featured_subcat = NULL; + g_autoptr(GsPluginJob) featured_plugin_job = NULL; + g_autoptr(GsAppQuery) main_query = NULL; + g_autoptr(GsPluginJob) main_plugin_job = NULL; + LoadCategoryData *load_data = NULL; + + g_assert (self->subcategory != NULL); + + if (!gs_page_is_active (GS_PAGE (self))) + return; + + featured_subcat = gs_category_find_child (self->category, "featured"); + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + self->cancellable = g_cancellable_new (); + + g_debug ("search using %s/%s", + gs_category_get_id (self->category), + gs_category_get_id (self->subcategory)); + + /* Add placeholders only when the content is not valid */ + if (!self->content_valid) { + gs_featured_carousel_set_apps (GS_FEATURED_CAROUSEL (self->top_carousel), NULL); + gtk_widget_set_visible (self->web_apps_flow_box, FALSE); + gtk_widget_set_visible (self->other_heading, FALSE); + + if (featured_subcat != NULL) { + gs_category_page_add_placeholders (self, GTK_FLOW_BOX (self->recently_updated_flow_box), MAX_RECENT_APPS_TO_DISPLAY); + + /* set up the placeholders as having the featured category is a good + * indicator that there will be featured apps */ + gs_category_page_add_placeholders (self, GTK_FLOW_BOX (self->featured_flow_box), 6); + gtk_widget_set_visible (self->top_carousel, TRUE); + gtk_widget_set_visible (self->featured_flow_box, TRUE); + gtk_widget_set_visible (self->recently_updated_flow_box, TRUE); + gtk_widget_set_visible (self->category_detail_box, FALSE); + } else { + gs_category_page_add_placeholders (self, GTK_FLOW_BOX (self->category_detail_box), + MIN (30, gs_category_get_size (self->subcategory))); + gs_widget_remove_all (self->featured_flow_box, (GsRemoveFunc) gtk_flow_box_remove); + gtk_widget_set_visible (self->top_carousel, FALSE); + gtk_widget_set_visible (self->featured_flow_box, FALSE); + gtk_widget_set_visible (self->recently_updated_flow_box, FALSE); + gtk_widget_set_visible (self->category_detail_box, TRUE); + } + } + + /* Load the list of apps in the category, and also the list of all + * featured apps, in parallel. + * + * The list of featured apps has to be loaded separately (we can’t just + * query each app for its featured status) since it’s provided by a + * separate appstream file (org.gnome.Software.Featured.xml) and hence + * produces separate `GsApp` instances with stub data. In particular, + * they don’t have enough category data to match the main category + * query. + * + * Once both queries have returned, turn the list of featured apps into + * a filter, and split the main list in four: + * - Featured apps + * - Recently updated apps + * - Web apps + * - Everything else + * Then populate the UI. + * + * The `featured_subcat` can be `NULL` when loading the special ‘addons’ + * category. + */ + load_data = g_new0 (LoadCategoryData, 1); + load_data->page = g_object_ref (self); + + if (featured_subcat != NULL) { + g_autoptr(GsAppQuery) featured_query = NULL; + + featured_query = gs_app_query_new ("category", featured_subcat, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + featured_plugin_job = gs_plugin_job_list_apps_new (featured_query, + GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (self->plugin_loader, + featured_plugin_job, + self->cancellable, + gs_category_page_get_featured_apps_cb, + load_data); + } else { + /* Skip it */ + load_data->get_featured_apps_finished = TRUE; + } + + main_query = gs_app_query_new ("category", self->subcategory, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + main_plugin_job = gs_plugin_job_list_apps_new (main_query, + GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (self->plugin_loader, + main_plugin_job, + self->cancellable, + gs_category_page_get_apps_cb, + load_data); +} + +static void +gs_category_page_reload (GsPage *page) +{ + GsCategoryPage *self = GS_CATEGORY_PAGE (page); + + if (self->subcategory == NULL) + return; + + gs_category_page_load_category (self); +} + +void +gs_category_page_set_category (GsCategoryPage *self, GsCategory *category) +{ + GsCategory *all_subcat = NULL; + + /* this means we've come from the app-view -> back */ + if (self->category == category) + return; + + /* set the category */ + all_subcat = gs_category_find_child (category, "all"); + + g_set_object (&self->category, category); + g_set_object (&self->subcategory, all_subcat); + + /* load the apps from it */ + if (all_subcat != NULL) { + GtkAdjustment *adj = NULL; + + /* scroll the list of apps to the beginning, otherwise it will show + * with the previous scroll value, for the previous category */ + adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_category)); + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj)); + + self->content_valid = FALSE; + + gs_category_page_load_category (self); + } + + /* notify of the updates — the category’s title will have changed too */ + g_object_notify (G_OBJECT (self), "category"); + g_object_notify (G_OBJECT (self), "title"); +} + +GsCategory * +gs_category_page_get_category (GsCategoryPage *self) +{ + return self->category; +} + +static void +gs_category_page_init (GsCategoryPage *self) +{ + g_type_ensure (GS_TYPE_FEATURED_CAROUSEL); + + gtk_widget_init_template (GTK_WIDGET (self)); + + /* Enable sorting on all flowboxes by default. */ + gs_category_page_set_sort (self, TRUE); + + gs_featured_carousel_set_apps (GS_FEATURED_CAROUSEL (self->top_carousel), NULL); +} + +static void +gs_category_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsCategoryPage *self = GS_CATEGORY_PAGE (object); + + switch ((GsCategoryPageProperty) prop_id) { + case PROP_TITLE: + if (self->category != NULL) + g_value_set_string (value, gs_category_get_name (self->category)); + else + g_value_set_string (value, NULL); + break; + case PROP_CATEGORY: + g_value_set_object (value, self->category); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_category_page_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsCategoryPage *self = GS_CATEGORY_PAGE (object); + + switch ((GsCategoryPageProperty) prop_id) { + case PROP_TITLE: + /* Read only */ + g_assert_not_reached (); + break; + case PROP_CATEGORY: + gs_category_page_set_category (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_category_page_dispose (GObject *object) +{ + GsCategoryPage *self = GS_CATEGORY_PAGE (object); + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + + g_clear_object (&self->category); + g_clear_object (&self->subcategory); + g_clear_object (&self->plugin_loader); + + G_OBJECT_CLASS (gs_category_page_parent_class)->dispose (object); +} + +static gboolean +gs_category_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsCategoryPage *self = GS_CATEGORY_PAGE (page); + + self->plugin_loader = g_object_ref (plugin_loader); + + return TRUE; +} + +static void +gs_category_page_class_init (GsCategoryPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPageClass *page_class = GS_PAGE_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_category_page_get_property; + object_class->set_property = gs_category_page_set_property; + object_class->dispose = gs_category_page_dispose; + + page_class->reload = gs_category_page_reload; + page_class->setup = gs_category_page_setup; + + /** + * GsCategoryPage:category: (nullable) + * + * The category to display the apps from. + * + * This may be %NULL if no category is selected. If so, the behaviour + * of the widget will be safe, but undefined. + * + * Since: 41 + */ + obj_props[PROP_CATEGORY] = + g_param_spec_object ("category", NULL, NULL, + GS_TYPE_CATEGORY, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + g_object_class_override_property (object_class, PROP_TITLE, "title"); + + /** + * GsCategoryPage::app-clicked: + * @app: the #GsApp which was clicked on + * + * Emitted when one of the app tiles is clicked. Typically the caller + * should display the details of the given app in the callback. + * + * Since: 41 + */ + obj_signals[SIGNAL_APP_CLICKED] = + g_signal_new ("app-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, GS_TYPE_APP); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-category-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsCategoryPage, top_carousel); + gtk_widget_class_bind_template_child (widget_class, GsCategoryPage, other_heading); + gtk_widget_class_bind_template_child (widget_class, GsCategoryPage, category_detail_box); + gtk_widget_class_bind_template_child (widget_class, GsCategoryPage, scrolledwindow_category); + gtk_widget_class_bind_template_child (widget_class, GsCategoryPage, featured_flow_box); + gtk_widget_class_bind_template_child (widget_class, GsCategoryPage, recently_updated_flow_box); + gtk_widget_class_bind_template_child (widget_class, GsCategoryPage, web_apps_flow_box); + + gtk_widget_class_bind_template_callback (widget_class, top_carousel_app_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, app_activated_cb); +} + +GsCategoryPage * +gs_category_page_new (void) +{ + return g_object_new (GS_TYPE_CATEGORY_PAGE, NULL); +} diff --git a/src/gs-category-page.h b/src/gs-category-page.h new file mode 100644 index 0000000..3997048 --- /dev/null +++ b/src/gs-category-page.h @@ -0,0 +1,25 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_CATEGORY_PAGE (gs_category_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsCategoryPage, gs_category_page, GS, CATEGORY_PAGE, GsPage) + +GsCategoryPage *gs_category_page_new (void); +void gs_category_page_set_category (GsCategoryPage *self, + GsCategory *category); +GsCategory *gs_category_page_get_category (GsCategoryPage *self); + +G_END_DECLS diff --git a/src/gs-category-page.ui b/src/gs-category-page.ui new file mode 100644 index 0000000..264a3c2 --- /dev/null +++ b/src/gs-category-page.ui @@ -0,0 +1,158 @@ + + + + + + diff --git a/src/gs-category-tile.c b/src/gs-category-tile.c new file mode 100644 index 0000000..48ea914 --- /dev/null +++ b/src/gs-category-tile.c @@ -0,0 +1,213 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + * SECTION:gs-category-tile + * @short_description: A UI tile for presenting a category + * + * #GsCategoryTile is a UI widget to show a category to the user. It’s generally + * aimed to be used in a list box, to provide navigation options to all the + * categories. + * + * It will display the category’s name, and potentially a background image which + * is styled to match the category’s content. + * + * Since: 41 + */ + +#include "config.h" + +#include "gs-category-tile.h" +#include "gs-common.h" + +struct _GsCategoryTile +{ + GtkFlowBoxChild parent_instance; + + GsCategory *category; /* (owned) (not nullable) */ + GtkWidget *label; + GtkWidget *image; + GtkBox *box; +}; + +G_DEFINE_TYPE (GsCategoryTile, gs_category_tile, GTK_TYPE_FLOW_BOX_CHILD) + +typedef enum { + PROP_CATEGORY = 1, +} GsCategoryTileProperty; + +static GParamSpec *obj_props[PROP_CATEGORY + 1] = { NULL, }; + +static void +gs_category_tile_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsCategoryTile *self = GS_CATEGORY_TILE (object); + + switch ((GsCategoryTileProperty) prop_id) { + case PROP_CATEGORY: + g_value_set_object (value, gs_category_tile_get_category (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_category_tile_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsCategoryTile *self = GS_CATEGORY_TILE (object); + + switch ((GsCategoryTileProperty) prop_id) { + case PROP_CATEGORY: + gs_category_tile_set_category (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * gs_category_tile_get_category: + * @tile: a #GsCategoryTile + * + * Get the value of #GsCategoryTile:category. + * + * Returns: (transfer none) (not nullable): a category + * Since: 41 + */ +GsCategory * +gs_category_tile_get_category (GsCategoryTile *tile) +{ + g_return_val_if_fail (GS_IS_CATEGORY_TILE (tile), NULL); + + return tile->category; +} + +static void +gs_category_tile_refresh (GsCategoryTile *tile) +{ + const gchar *icon_name = gs_category_get_icon_name (tile->category); + + /* set labels */ + gtk_label_set_label (GTK_LABEL (tile->label), + gs_category_get_name (tile->category)); + + gtk_image_set_from_icon_name (GTK_IMAGE (tile->image), icon_name); + gtk_widget_set_visible (tile->image, icon_name != NULL); + + /* Update the icon class. */ + if (icon_name != NULL) + gtk_widget_remove_css_class (GTK_WIDGET (tile), "category-tile-iconless"); + else + gtk_widget_add_css_class (GTK_WIDGET (tile), "category-tile-iconless"); + + /* The label should be left-aligned for iconless categories and centred otherwise. */ + gtk_widget_set_halign (GTK_WIDGET (tile->box), + (icon_name != NULL) ? GTK_ALIGN_CENTER : GTK_ALIGN_START); +} + +/** + * gs_category_tile_set_category: + * @tile: a #GsCategoryTile + * @cat: (transfer none) (not nullable): a #GsCategory + * + * Set the value of #GsCategoryTile:category to @cat. + * + * Since: 41 + */ +void +gs_category_tile_set_category (GsCategoryTile *tile, GsCategory *cat) +{ + g_return_if_fail (GS_IS_CATEGORY_TILE (tile)); + g_return_if_fail (GS_IS_CATEGORY (cat)); + + /* Remove the old category ID. */ + if (tile->category != NULL) { + g_autofree gchar *class_name = g_strdup_printf ("category-%s", gs_category_get_id (tile->category)); + gtk_widget_remove_css_class (GTK_WIDGET (tile), class_name); + } + + if (g_set_object (&tile->category, cat)) { + g_autofree gchar *class_name = g_strdup_printf ("category-%s", gs_category_get_id (tile->category)); + + /* Add the new category’s ID as a CSS class, to get + * category-specific styling. */ + gtk_widget_add_css_class (GTK_WIDGET (tile), class_name); + + gs_category_tile_refresh (tile); + g_object_notify_by_pspec (G_OBJECT (tile), obj_props[PROP_CATEGORY]); + } +} + +static void +gs_category_tile_dispose (GObject *object) +{ + GsCategoryTile *tile = GS_CATEGORY_TILE (object); + + g_clear_object (&tile->category); + + G_OBJECT_CLASS (gs_category_tile_parent_class)->dispose (object); +} + +static void +gs_category_tile_init (GsCategoryTile *tile) +{ + gtk_widget_init_template (GTK_WIDGET (tile)); +} + +static void +gs_category_tile_class_init (GsCategoryTileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_category_tile_get_property; + object_class->set_property = gs_category_tile_set_property; + object_class->dispose = gs_category_tile_dispose; + + /** + * GsCategoryTile:category: (not nullable) + * + * The category to display in this tile. + * + * This must not be %NULL. + * + * Since: 41 + */ + obj_props[PROP_CATEGORY] = + g_param_spec_object ("category", NULL, NULL, + GS_TYPE_CATEGORY, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-category-tile.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsCategoryTile, label); + gtk_widget_class_bind_template_child (widget_class, GsCategoryTile, image); + gtk_widget_class_bind_template_child (widget_class, GsCategoryTile, box); +} + +/** + * gs_category_tile_new: + * @cat: (transfer none) (not nullable): a #GsCategory + * + * Create a new #GsCategoryTile to represent @cat. + * + * Returns: (transfer full) (type GsCategoryTile): a new #GsCategoryTile + * Since: 41 + */ +GtkWidget * +gs_category_tile_new (GsCategory *cat) +{ + return g_object_new (GS_TYPE_CATEGORY_TILE, + "category", cat, + NULL); +} diff --git a/src/gs-category-tile.h b/src/gs-category-tile.h new file mode 100644 index 0000000..848ff3e --- /dev/null +++ b/src/gs-category-tile.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_CATEGORY_TILE (gs_category_tile_get_type ()) + +G_DECLARE_FINAL_TYPE (GsCategoryTile, gs_category_tile, GS, CATEGORY_TILE, GtkFlowBoxChild) + +GtkWidget *gs_category_tile_new (GsCategory *cat); +GsCategory *gs_category_tile_get_category (GsCategoryTile *tile); +void gs_category_tile_set_category (GsCategoryTile *tile, + GsCategory *cat); + +G_END_DECLS diff --git a/src/gs-category-tile.ui b/src/gs-category-tile.ui new file mode 100644 index 0000000..1f723e1 --- /dev/null +++ b/src/gs-category-tile.ui @@ -0,0 +1,34 @@ + + + + + diff --git a/src/gs-common.c b/src/gs-common.c new file mode 100644 index 0000000..7c626ac --- /dev/null +++ b/src/gs-common.c @@ -0,0 +1,1477 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2015 Richard Hughes + * Copyright (C) 2016-2019 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include +#ifndef TESTDATADIR +#include "gs-application.h" +#endif + +#include "gs-common.h" + +#include + +void +gs_widget_remove_all (GtkWidget *container, + GsRemoveFunc remove_func) +{ + GtkWidget *child; + while ((child = gtk_widget_get_first_child (container)) != NULL) { + if (remove_func) + remove_func (container, child); + else + gtk_widget_unparent (child); + } +} + +static void +grab_focus (GtkWidget *widget) +{ + g_signal_handlers_disconnect_by_func (widget, grab_focus, NULL); + gtk_widget_grab_focus (widget); +} + +void +gs_grab_focus_when_mapped (GtkWidget *widget) +{ + if (gtk_widget_get_mapped (widget)) + gtk_widget_grab_focus (widget); + else + g_signal_connect_after (widget, "map", + G_CALLBACK (grab_focus), NULL); +} + +void +gs_app_notify_installed (GsApp *app) +{ + g_autofree gchar *summary = NULL; + const gchar *body = NULL; + g_autoptr(GNotification) n = NULL; + + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + /* TRANSLATORS: this is the summary of a notification that an app + * has been successfully installed */ + summary = g_strdup_printf (_("%s Installed"), gs_app_get_name (app)); + if (gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) { + /* TRANSLATORS: an app has been installed, but + * needs a reboot to complete the installation */ + body = _("A restart is required for the changes to take effect"); + } else { + /* TRANSLATORS: this is the body of a notification that an app + * has been successfully installed */ + body = _("The app is ready to be used"); + } + break; + default: + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_GENERIC && + gs_app_get_special_kind (app) == GS_APP_SPECIAL_KIND_OS_UPDATE) { + /* TRANSLATORS: this is the summary of a notification that OS updates + * have been successfully installed */ + summary = g_strdup (_("System Updates Installed")); + /* TRANSLATORS: this is the body of a notification that OS updates + * have been successfully installed */ + body = _("Recently installed updates are available to review"); + } else { + /* TRANSLATORS: this is the summary of a notification that a component + * has been successfully installed */ + summary = g_strdup_printf (_("%s Installed"), gs_app_get_name (app)); + if (gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) { + /* TRANSLATORS: an app has been installed, but + * needs a reboot to complete the installation */ + body = _("A restart is required for the changes to take effect"); + } + } + break; + } + n = g_notification_new (summary); + if (body != NULL) + g_notification_set_body (n, body); + + if (gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) { + /* TRANSLATORS: button text */ + g_notification_add_button_with_target (n, _("Restart"), + "app.reboot", NULL); + } else if (gs_app_get_kind (app) == AS_COMPONENT_KIND_DESKTOP_APP) { + /* TRANSLATORS: this is button that opens the newly installed app */ + g_autoptr(GsPlugin) plugin = gs_app_dup_management_plugin (app); + const gchar *plugin_name = (plugin != NULL) ? gs_plugin_get_name (plugin) : ""; + g_notification_add_button_with_target (n, _("Launch"), + "app.launch", "(ss)", + gs_app_get_id (app), + plugin_name); + } + + if (gs_app_has_icons (app)) { + g_autoptr(GIcon) icon = NULL; + icon = gs_app_get_icon_for_size (app, 48, 1, NULL); + if (icon) + g_notification_set_icon (n, icon); + } + + g_notification_set_default_action_and_target (n, "app.details", "(ss)", + gs_app_get_unique_id (app), ""); + #ifdef TESTDATADIR + g_application_send_notification (g_application_get_default (), "installed", n); + #else + gs_application_send_notification (GS_APPLICATION (g_application_get_default ()), "installed", n, 24 * 60); + #endif +} + +typedef enum { + GS_APP_LICENSE_FREE = 0, + GS_APP_LICENSE_NONFREE = 1, + GS_APP_LICENSE_PATENT_CONCERN = 2 +} GsAppLicenseHint; + +static void +async_result_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **result_out = user_data; + + g_assert (*result_out == NULL); + *result_out = g_object_ref (result); + g_main_context_wakeup (g_main_context_get_thread_default ()); +} + +static gboolean +gs_common_app_is_from_official_repository (GsApp *app, + GSettings *settings) +{ + g_auto(GStrv) official_repos = NULL; + const gchar *origin = gs_app_get_origin (app); + + if (origin == NULL) + return FALSE; + official_repos = g_settings_get_strv (settings, "official-repos"); + return official_repos && + gs_utils_strv_fnmatch ((gchar **) official_repos, origin); +} + +GtkResponseType +gs_app_notify_unavailable (GsApp *app, GtkWidget *parent) +{ + GsAppLicenseHint hint = GS_APP_LICENSE_FREE; + AdwDialog *dialog; + const gchar *license; + gboolean already_enabled = FALSE; /* FIXME */ + g_autofree gchar *origin_ui = NULL; + guint i; + struct { + const gchar *str; + GsAppLicenseHint hint; + } keywords[] = { + { "NonFree", GS_APP_LICENSE_NONFREE }, + { "PatentConcern", GS_APP_LICENSE_PATENT_CONCERN }, + { "Proprietary", GS_APP_LICENSE_NONFREE }, + { NULL, 0 } + }; + g_autoptr(GSettings) settings = NULL; + g_autoptr(GString) body = NULL; + const gchar *title; + g_autoptr(GAsyncResult) result = NULL; + const char *response; + int response_id = GTK_RESPONSE_NONE; + + /* this is very crude */ + license = gs_app_get_license (app); + if (license != NULL) { + for (i = 0; keywords[i].str != NULL; i++) { + if (g_strstr_len (license, -1, keywords[i].str) != NULL) + hint |= keywords[i].hint; + } + } else { + /* use the worst-case assumption */ + hint = GS_APP_LICENSE_NONFREE | GS_APP_LICENSE_PATENT_CONCERN; + } + + /* check if the user has already dismissed */ + settings = g_settings_new ("org.gnome.software"); + if (!g_settings_get_boolean (settings, "prompt-for-nonfree")) + return GTK_RESPONSE_OK; + + if (already_enabled) { + title = gs_common_app_is_from_official_repository (app, settings) ? + /* TRANSLATORS: window title */ + _("Install Software?") : + /* TRANSLATORS: window title */ + _("Install Third-Party Software?"); + } else { + title = gs_common_app_is_from_official_repository (app, settings) ? + /* TRANSLATORS: window title */ + _("Enable Software Repository?") : + /* TRANSLATORS: window title */ + _("Enable Third-Party Software Repository?"); + } + + body = g_string_new (""); + origin_ui = gs_app_dup_origin_ui (app, TRUE); + + if (hint & GS_APP_LICENSE_NONFREE) { + g_string_append_printf (body, + /* TRANSLATORS: the replacements are as follows: + * 1. App name, e.g. "Firefox" + * 2. Software repository name, e.g. fedora-optional + */ + _("%s is not " + "free and open source software, " + "and is provided by “%s”."), + gs_app_get_name (app), + origin_ui); + } else { + g_string_append_printf (body, + /* TRANSLATORS: the replacements are as follows: + * 1. App name, e.g. "Firefox" + * 2. Software repository name, e.g. fedora-optional */ + _("%s is provided by “%s”."), + gs_app_get_name (app), + origin_ui); + } + + /* tell the use what needs to be done */ + if (!already_enabled) { + g_string_append (body, " "); + g_string_append (body, + _("This software repository must be " + "enabled to continue installation.")); + } + + /* be aware of patent clauses */ + if (hint & GS_APP_LICENSE_PATENT_CONCERN) { + g_string_append (body, "\n\n"); + if (gs_app_get_kind (app) != AS_COMPONENT_KIND_CODEC) { + g_string_append_printf (body, + /* TRANSLATORS: Laws are geographical, urgh... */ + _("It may be illegal to install " + "or use %s in some countries."), + gs_app_get_name (app)); + } else { + g_string_append (body, + /* TRANSLATORS: Laws are geographical, urgh... */ + _("It may be illegal to install or use " + "this codec in some countries.")); + } + } + + dialog = adw_alert_dialog_new (title, body->str); + adw_alert_dialog_set_body_use_markup (ADW_ALERT_DIALOG (dialog), TRUE); + + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (dialog), + "cancel", _("_Cancel")); + + /* TRANSLATORS: this is button text to not ask about non-free content again */ + if (0) adw_alert_dialog_add_response (ADW_ALERT_DIALOG (dialog), "dont-warn-again", _("Don’t _Warn Again")); + if (already_enabled) { + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (dialog), + /* TRANSLATORS: button text */ + "install", _("_Install")); + + } else { + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (dialog), + /* TRANSLATORS: button text */ + "install", _("Enable and _Install")); + } + + adw_alert_dialog_set_close_response (ADW_ALERT_DIALOG (dialog), "cancel"); + + /* Run. + * FIXME: Make this properly async, see https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2741 */ + adw_alert_dialog_choose (ADW_ALERT_DIALOG (dialog), parent, NULL, async_result_cb, &result); + + while (result == NULL) + g_main_context_iteration (NULL, TRUE); + + response = adw_alert_dialog_choose_finish (ADW_ALERT_DIALOG (dialog), result); + + /* Map responses. */ + if (g_strcmp0 (response, "install") == 0) { + response_id = GTK_RESPONSE_OK; + } else if (g_strcmp0 (response, "dont-warn-again") == 0) { + response_id = GTK_RESPONSE_OK; + g_settings_set_boolean (settings, "prompt-for-nonfree", FALSE); + } else { + response_id = GTK_RESPONSE_CANCEL; + } + + return response_id; +} + +gboolean +gs_utils_is_current_desktop (const gchar *name) +{ + const gchar *tmp; + g_auto(GStrv) names = NULL; + tmp = g_getenv ("XDG_CURRENT_DESKTOP"); + if (tmp == NULL) + return FALSE; + names = g_strsplit (tmp, ":", -1); + return g_strv_contains ((const gchar * const *) names, name); +} + +static void +gs_utils_widget_css_parsing_error_cb (GtkCssProvider *provider, + GtkCssSection *section, + GError *error, + gpointer user_data) +{ + const GtkCssLocation *start_location; + + start_location = gtk_css_section_get_start_location (section); + g_warning ("CSS parse error %" G_GSIZE_FORMAT ":%" G_GSIZE_FORMAT ": %s", + start_location->lines + 1, + start_location->line_chars, + error->message); +} + +/** + * gs_utils_set_key_colors_in_css: + * @css: some CSS + * @app: a #GsApp to get the key colors from + * + * Replace placeholders in @css with the key colors from @app, returning a copy + * of the CSS with the key colors inlined as `rgb()` literals. + * + * The key color placeholders are of the form `@keycolor-XX@`, where `XX` is a + * two digit counter. The first counter (`00`) will be replaced with the first + * key color in @app, the second counter (`01`) with the second, etc. + * + * CSS may be %NULL, in which case %NULL is returned. + * + * Returns: (transfer full): a copy of @css with the key color placeholders + * replaced, free with g_free() + * Since: 40 + */ +gchar * +gs_utils_set_key_colors_in_css (const gchar *css, + GsApp *app) +{ + GArray *key_colors; + g_autoptr(GString) css_new = NULL; + + if (css == NULL) + return NULL; + + key_colors = gs_app_get_key_colors (app); + + /* Do we not need to do any replacements? */ + if (key_colors->len == 0 || + g_strstr_len (css, -1, "@keycolor") == NULL) + return g_strdup (css); + + /* replace key color values */ + css_new = g_string_new (css); + for (guint j = 0; j < key_colors->len; j++) { + const GdkRGBA *color = &g_array_index (key_colors, GdkRGBA, j); + g_autofree gchar *key = NULL; + g_autofree gchar *value = NULL; + key = g_strdup_printf ("@keycolor-%02u@", j); + value = g_strdup_printf ("rgb(%.0f,%.0f,%.0f)", + color->red * 255.f, + color->green * 255.f, + color->blue * 255.f); + gs_utils_gstring_replace (css_new, key, value); + } + + return g_string_free (g_steal_pointer (&css_new), FALSE); +} + +/** + * gs_utils_widget_set_css: + * @widget: a widget + * @provider: (inout) (transfer full) (not optional) (nullable): pointer to a + * #GtkCssProvider to use + * @css: (nullable): CSS to set on the widget, or %NULL to clear custom CSS + * + * Set custom CSS on the given @widget instance. This uses the widget's name + * property to identify it. If the widget is unnamed, which means its name is + * %NULL, the empty string, or its type name, it will receive a unique name. + * + * @provider must be a pointer to a #GtkCssProvider pointer, typically within + * your widget’s private data struct. This function will return a + * #GtkCssProvider in the provided pointer, reusing any old @provider if + * possible. When your widget is destroyed, you must destroy the returned + * @provider. If @css is %NULL, this function will destroy the @provider. + */ +void +gs_utils_widget_set_css (GtkWidget *widget, GtkCssProvider **provider, const gchar *css) +{ + GdkDisplay *display; + const gchar *widget_name; + g_autoptr(GString) str = NULL; + + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (provider != NULL); + g_return_if_fail (provider == NULL || *provider == NULL || GTK_IS_STYLE_PROVIDER (*provider)); + + display = gtk_widget_get_display (widget); + + /* remove custom CSS if NULL */ + if (css == NULL) { + if (*provider != NULL) + gtk_style_context_remove_provider_for_display (display, GTK_STYLE_PROVIDER (*provider)); + g_clear_object (provider); + return; + } + + widget_name = gtk_widget_get_name (widget); + + /* give the widget a unique name if NULL */ + if (widget_name == NULL || + *widget_name == '\0' || + g_strcmp0 (widget_name, G_OBJECT_TYPE_NAME (widget)) == 0) { + gchar tmp[26]; /* "widget-0x", up to 16 hex digits, and '\0'. */ + g_assert ((gsize) g_snprintf (tmp, sizeof (tmp), "widget-%p", widget) < sizeof (tmp)); + gtk_widget_set_name (widget, (const gchar *) tmp); + widget_name = gtk_widget_get_name (widget); + } + + /* prepare the CSS code */ + str = g_string_sized_new (1024); + g_string_append_printf (str, "#%s {\n", widget_name); + g_string_append_printf (str, "%s\n", css); + g_string_append (str, "}"); + + /* create a new provider if needed */ + if (*provider == NULL) { + *provider = gtk_css_provider_new (); + g_signal_connect (*provider, "parsing-error", + G_CALLBACK (gs_utils_widget_css_parsing_error_cb), NULL); + } + + /* set up custom provider and store on the widget */ + #if GTK_CHECK_VERSION(4, 12, 0) + gtk_css_provider_load_from_string (*provider, str->str); + #else + gtk_css_provider_load_from_data (*provider, str->str, -1); + #endif + gtk_style_context_add_provider_for_display (display, GTK_STYLE_PROVIDER (*provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); +} + +static void +unset_focus (GtkWidget *widget, gpointer data) +{ + if (GTK_IS_WINDOW (widget)) + gtk_window_set_focus (GTK_WINDOW (widget), NULL); +} + +/** + * insert_details_widget: + * @dialog: the message dialog where the widget will be inserted + * @details: the detailed message text to display + * + * Inserts a widget displaying the detailed message into the message dialog. + */ +static void +insert_details_widget (AdwAlertDialog *dialog, + const gchar *details, + gboolean add_prefix) +{ + GtkWidget *group, *sw, *tv; + GtkTextBuffer *buffer; + g_autoptr(GString) msg = NULL; + + g_assert (ADW_IS_ALERT_DIALOG (dialog)); + g_assert (details != NULL); + + if (add_prefix) { + msg = g_string_new (""); + g_string_append_printf (msg, "%s\n\n%s", + /* TRANSLATORS: these are show_detailed_error messages from the + * package manager no mortal is supposed to understand, + * but google might know what they mean */ + _("Detailed errors from the package manager follow:"), + details); + } + + group = adw_preferences_group_new (); + adw_preferences_group_set_title (ADW_PREFERENCES_GROUP (group), _("Details")); + adw_alert_dialog_set_extra_child (ADW_ALERT_DIALOG (dialog), group); + + sw = gtk_scrolled_window_new (); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (sw), 150); + gtk_widget_set_overflow (sw, GTK_OVERFLOW_HIDDEN); + gtk_widget_set_vexpand (sw, TRUE); + gtk_widget_add_css_class (sw, "card"); + + tv = gtk_text_view_new (); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tv)); + gtk_text_view_set_editable (GTK_TEXT_VIEW (tv), FALSE); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (tv), GTK_WRAP_WORD); + gtk_text_view_set_monospace (GTK_TEXT_VIEW (tv), TRUE); + gtk_widget_add_css_class (tv, "inline"); + gtk_widget_add_css_class (tv, "monospace"); + gtk_text_view_set_top_margin (GTK_TEXT_VIEW (tv), 12); + gtk_text_view_set_bottom_margin (GTK_TEXT_VIEW (tv), 12); + gtk_text_view_set_right_margin (GTK_TEXT_VIEW (tv), 12); + gtk_text_view_set_left_margin (GTK_TEXT_VIEW (tv), 12); + + gtk_text_buffer_set_text (buffer, msg ? msg->str : details, -1); + + gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), tv); + + adw_preferences_group_add (ADW_PREFERENCES_GROUP (group), sw); + + g_signal_connect (dialog, "map", G_CALLBACK (unset_focus), NULL); +} + +/** + * gs_utils_show_error_dialog: + * @parent: transient parent, or NULL for none + * @title: the title for the dialog + * @msg: the message for the dialog + * @details: (allow-none): the detailed error message, or NULL for none + * + * Shows a message dialog for displaying error messages. + */ +void +gs_utils_show_error_dialog (GtkWidget *parent, + const gchar *title, + const gchar *msg, + const gchar *details) +{ + AdwDialog *dialog; + + dialog = adw_alert_dialog_new (title, msg); + if (details != NULL) { + insert_details_widget (ADW_ALERT_DIALOG (dialog), details, TRUE); + adw_dialog_set_follows_content_size (dialog, FALSE); + adw_dialog_set_content_width (dialog, 500); + } + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (dialog), + /* TRANSLATORS: button text */ + "close", _("_Close")); + adw_dialog_present (dialog, parent); +} + +#ifndef TESTDATADIR +typedef struct { + AdwToastOverlay *toast_overlay; + GtkTextView *text_view; +} ErrorDialogCopyData; + +static void +error_dialog_copy_data_free (ErrorDialogCopyData *data) +{ + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ErrorDialogCopyData, error_dialog_copy_data_free) + +static void +copy_error_text_clicked_cb (GtkButton *button, + void *user_data) +{ + ErrorDialogCopyData *data = user_data; + GdkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET (data->text_view)); + GtkTextBuffer *buffer = gtk_text_view_get_buffer (data->text_view); + GtkTextIter start, end; + g_autofree gchar *text = NULL; + + gtk_text_buffer_get_bounds (buffer, &start, &end); + text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); + gdk_clipboard_set_text (clipboard, text); + + adw_toast_overlay_add_toast (data->toast_overlay, adw_toast_new (_("Details copied to clipboard"))); +} +#endif + +/** + * gs_utils_show_error_dialog_simple: + * @parent: transient parent, or %NULL for none + * @title: the title the dialog + * @text: the detailed error text + * + * Shows a dialog with title @title to display an error + * message @text. + * + * Since: 44 + */ +void +gs_utils_show_error_dialog_simple (GtkWidget *parent, + const gchar *title, + const gchar *text) +{ +#ifndef TESTDATADIR + g_autoptr(GtkBuilder) builder = NULL; + AdwDialog *dialog; + GtkButton *button; + GtkLabel *label; + GtkTextView *text_view; + g_autoptr(ErrorDialogCopyData) data = NULL; + + builder = gtk_builder_new_from_resource ("/org/gnome/Software/gs-utils-error-dialog-simple.ui"); + dialog = ADW_DIALOG (gtk_builder_get_object (builder, "dialog")); + button = GTK_BUTTON (gtk_builder_get_object (builder, "button")); + label = GTK_LABEL (gtk_builder_get_object (builder, "label")); + text_view = GTK_TEXT_VIEW (gtk_builder_get_object (builder, "text_view")); + + gtk_label_set_label (GTK_LABEL (label), title); + gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)), text, -1); + + data = g_new0 (ErrorDialogCopyData, 1); + data->toast_overlay = ADW_TOAST_OVERLAY (gtk_builder_get_object (builder, "toast_overlay")); + data->text_view = GTK_TEXT_VIEW (gtk_builder_get_object (builder, "text_view")); + + g_signal_connect_data (button, "clicked", + G_CALLBACK (copy_error_text_clicked_cb), g_steal_pointer (&data), + (GClosureNotify) ((gpointer) error_dialog_copy_data_free), G_CONNECT_DEFAULT); + + adw_dialog_present (dialog, parent); +#endif /* TESTDATADIR */ +} + +/** + * gs_utils_ask_user_accepts: + * @parent: (nullable): modal parent, or %NULL for none + * @title: the title for the dialog + * @msg: the message for the dialog + * @details: (nullable): the detailed error message, or %NULL for none + * @accept_label: (nullable): a label of the 'accept' button, or %NULL to use 'Accept' + * + * Shows a modal question dialog for displaying an accept/cancel question to the user. + * + * Returns: whether the user accepted the question + * + * Since: 42 + **/ +gboolean +gs_utils_ask_user_accepts (GtkWidget *parent, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label) +{ + AdwDialog *dialog; + g_autoptr(GAsyncResult) result = NULL; + const char *response; + int response_id = GTK_RESPONSE_NONE; + + g_return_val_if_fail (title != NULL, FALSE); + g_return_val_if_fail (msg != NULL, FALSE); + + if (accept_label == NULL || *accept_label == '\0') { + /* Translators: an accept button label, in a Cancel/Accept dialog */ + accept_label = _("_Accept"); + } + + dialog = adw_alert_dialog_new (title, msg); + if (details != NULL) + insert_details_widget (ADW_ALERT_DIALOG (dialog), details, FALSE); + adw_alert_dialog_add_responses (ADW_ALERT_DIALOG (dialog), + /* TRANSLATORS: button text */ + "cancel", _("_Cancel"), + /* TRANSLATORS: button text */ + "accept", accept_label, + NULL); + + adw_alert_dialog_set_close_response (ADW_ALERT_DIALOG (dialog), "cancel"); + + /* Run. + * FIXME: Make this properly async, see https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2741 */ + adw_alert_dialog_choose (ADW_ALERT_DIALOG (dialog), parent, NULL, async_result_cb, &result); + + while (result == NULL) + g_main_context_iteration (NULL, TRUE); + + response = adw_alert_dialog_choose_finish (ADW_ALERT_DIALOG (dialog), result); + + /* Map responses. */ + if (g_strcmp0 (response, "accept") == 0) + response_id = GTK_RESPONSE_OK; + else + response_id = GTK_RESPONSE_CANCEL; + + return response_id == GTK_RESPONSE_OK; +} + +/** + * gs_utils_get_error_value: + * @error: A GError + * + * Gets the machine-readable value stored in the error message. + * The machine readable string is after the first "@", e.g. + * message = "Requires authentication with @aaa" + * + * Returns: a string, or %NULL + */ +const gchar * +gs_utils_get_error_value (const GError *error) +{ + gchar *str; + if (error == NULL) + return NULL; + str = g_strstr_len (error->message, -1, "@"); + if (str == NULL) + return NULL; + return (const gchar *) str + 1; +} + +/** + * gs_utils_build_unique_id_kind: + * @kind: A #AsComponentKind + * @id: An application ID + * + * Converts the ID valid into a wildcard unique ID of a specific kind. + * If @id is already a unique ID, then it is returned unchanged. + * + * Returns: (transfer full): a unique ID, or %NULL + */ +gchar * +gs_utils_build_unique_id_kind (AsComponentKind kind, const gchar *id) +{ + if (as_utils_data_id_valid (id)) + return g_strdup (id); + return gs_utils_build_unique_id (AS_COMPONENT_SCOPE_UNKNOWN, + AS_BUNDLE_KIND_UNKNOWN, + NULL, + id, + NULL); +} + +/** + * gs_utils_list_has_component_fuzzy: + * @list: A #GsAppList + * @app: A #GsApp + * + * Finds out if any app in the list would match a given app, + * where the match is valid for a matching D-Bus bus name, + * the label in the UI or the same icon. + * + * This function is normally used to work out if the source should be shown + * in a GsAppRow. + * + * Returns: %TRUE if the app is visually the "same" + */ +gboolean +gs_utils_list_has_component_fuzzy (GsAppList *list, GsApp *app) +{ + guint i; + GsApp *tmp; + + for (i = 0; i < gs_app_list_length (list); i++) { + tmp = gs_app_list_index (list, i); + + /* ignore if the same object */ + if (app == tmp) + continue; + + /* ignore with the same source */ + if (g_strcmp0 (gs_app_get_origin_hostname (tmp), + gs_app_get_origin_hostname (app)) == 0) { + continue; + } + + /* same D-Bus ID */ + if (g_strcmp0 (gs_app_get_id (tmp), + gs_app_get_id (app)) == 0) { + return TRUE; + } + + /* same name */ + if (g_strcmp0 (gs_app_get_name (tmp), + gs_app_get_name (app)) == 0) { + return TRUE; + } + } + return FALSE; +} + +void +gs_utils_reboot_notify (GsAppList *list, + gboolean is_install) +{ + g_autoptr(GNotification) n = NULL; + g_autofree gchar *tmp = NULL; + const gchar *app_name = NULL; + const gchar *title; + const gchar *body; + + if (gs_app_list_length (list) == 1) { + GsApp *app = gs_app_list_index (list, 0); + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_DESKTOP_APP) { + app_name = gs_app_get_name (app); + if (!*app_name) + app_name = NULL; + } + } + + if (is_install) { + if (app_name) { + /* TRANSLATORS: The '%s' is replaced with the app name */ + tmp = g_strdup_printf ("“%s” Installed", app_name); + title = tmp; + } else { + /* TRANSLATORS: we've just live-updated some apps */ + title = ngettext ("An update has been installed", + "Updates have been installed", + gs_app_list_length (list)); + } + } else if (app_name) { + /* TRANSLATORS: The '%s' is replaced with the app name */ + tmp = g_strdup_printf ("“%s” Uninstalled", app_name); + title = tmp; + } else { + /* TRANSLATORS: we've just uninstalled some apps */ + title = ngettext ("An app has been uninstalled", + "Apps have been uninstalled", + gs_app_list_length (list)); + } + + /* TRANSLATORS: the new apps will not be run until we restart */ + body = ngettext ("A restart is required for it to take effect", + "A restart is required for them to take effect", + gs_app_list_length (list)); + + n = g_notification_new (title); + g_notification_set_body (n, body); + /* TRANSLATORS: button text */ + g_notification_add_button (n, _("Not Now"), "app.nop"); + /* TRANSLATORS: button text */ + g_notification_add_button_with_target (n, _("Restart"), "app.reboot", NULL); + g_notification_set_default_action_and_target (n, "app.set-mode", "s", "updates"); + g_notification_set_priority (n, G_NOTIFICATION_PRIORITY_URGENT); + #ifdef TESTDATADIR + g_application_send_notification (g_application_get_default (), "restart-required", n); + #else + gs_application_send_notification (GS_APPLICATION (g_application_get_default ()), "restart-required", n, 0); + #endif +} + +/** + * gs_utils_split_time_difference: + * @unix_time_seconds: Time since the epoch in seconds + * @out_minutes_ago: (out) (nullable): how many minutes elapsed + * @out_hours_ago: (out) (nullable): how many hours elapsed + * @out_days_ago: (out) (nullable): how many days elapsed + * @out_weeks_ago: (out) (nullable): how many weeks elapsed + * @out_months_ago: (out) (nullable): how many months elapsed + * @out_years_ago: (out) (nullable): how many years elapsed + * + * Calculates the difference between the @unix_time_seconds and the current time + * and splits it into separate values. + * + * Returns: whether the out parameters had been set + * + * Since: 41 + **/ +gboolean +gs_utils_split_time_difference (gint64 unix_time_seconds, + gint *out_minutes_ago, + gint *out_hours_ago, + gint *out_days_ago, + gint *out_weeks_ago, + gint *out_months_ago, + gint *out_years_ago) +{ + gint minutes_ago, hours_ago, days_ago; + gint weeks_ago, months_ago, years_ago; + g_autoptr(GDateTime) date_time = NULL; + g_autoptr(GDateTime) now = NULL; + GTimeSpan timespan; + + if (unix_time_seconds <= 0) + return FALSE; + + date_time = g_date_time_new_from_unix_local (unix_time_seconds); + now = g_date_time_new_now_local (); + timespan = g_date_time_difference (now, date_time); + + minutes_ago = (gint) (timespan / G_TIME_SPAN_MINUTE); + hours_ago = (gint) (timespan / G_TIME_SPAN_HOUR); + days_ago = (gint) (timespan / G_TIME_SPAN_DAY); + weeks_ago = days_ago / 7; + months_ago = days_ago / 30; + years_ago = weeks_ago / 52; + + if (out_minutes_ago) + *out_minutes_ago = minutes_ago; + if (out_hours_ago) + *out_hours_ago = hours_ago; + if (out_days_ago) + *out_days_ago = days_ago; + if (out_weeks_ago) + *out_weeks_ago = weeks_ago; + if (out_months_ago) + *out_months_ago = months_ago; + if (out_years_ago) + *out_years_ago = years_ago; + + return TRUE; +} + +/* + * gs_utils_split_time_to_datestring: + * @days_ago: number of days since the event we want to fetch the relative date as + * @weeks_ago: number of weeks since the event we want to fetch the relative date as + * @months_ago: number of months since the event we want to fetch the relative date as + * @years_ago: number of years since the event we want to fetch the relative date as + * + * Converts a time split in days/weeks/months/years difference + * to a relative date string such as "5 days ago" or "2 weeks ago" + * + * This function returns up to a day level accurate string. + * This should not be used outside of gs_utils_time_to_datestring() + * or gs_utils_time_to_timestring(). + * + * Returns: (transfer full): the relative date string + */ +static gchar * +gs_utils_split_time_to_datestring (gint days_ago, gint weeks_ago, gint months_ago, gint years_ago) +{ + if (days_ago < 1) { + /* TRANSLATORS: something happened less than a day ago */ + return g_strdup (_("Today")); + } else if (days_ago < 2) + /* TRANSLATORS: something happened more than a day ago but less than 2 days ago */ + return g_strdup (_("Yesterday")); + else if (days_ago < 15) + return g_strdup_printf (ngettext ("%d day ago", + "%d days ago", days_ago), + days_ago); + else if (weeks_ago < 8) + return g_strdup_printf (ngettext ("%d week ago", + "%d weeks ago", weeks_ago), + weeks_ago); + else if (years_ago < 1) + return g_strdup_printf (ngettext ("%d month ago", + "%d months ago", months_ago), + months_ago); + else + return g_strdup_printf (ngettext ("%d year ago", + "%d years ago", years_ago), + years_ago); +} + +/** + * gs_utils_time_to_datestring: + * @unix_time_seconds: Time since the epoch in seconds + * + * Converts a time to a relative date string such as "5 days ago" or "2 weeks ago" + * + * This function returns up to a day level accurate string. + * This should be used in places like app release date etc. + * For accuracy to the minute gs_utils_time_to_timestring() should be used. + * + * Returns: (transfer full): the relative date string, or %NULL if + * @unix_time_seconds is not valid + */ +gchar * +gs_utils_time_to_datestring (gint64 unix_time_seconds) +{ + gint minutes_ago, hours_ago, days_ago; + gint weeks_ago, months_ago, years_ago; + + if (!gs_utils_split_time_difference (unix_time_seconds, + &minutes_ago, &hours_ago, &days_ago, + &weeks_ago, &months_ago, &years_ago)) + return NULL; + + return gs_utils_split_time_to_datestring (days_ago, weeks_ago, months_ago, years_ago); +} + +/** + * gs_utils_time_to_timestring: + * @unix_time_seconds: Time since the epoch in seconds + * + * Converts a time to a relative string such as "5 minutes ago" or "2 hours ago" + * + * This function returns up to a minute level accurate string. + * For accuracy to the date gs_utils_time_to_datestring() should be used. + * + * Returns: (transfer full): the relative time string, or %NULL if + * @unix_time_seconds is not valid + */ +gchar * +gs_utils_time_to_timestring (gint64 unix_time_seconds) +{ + gint minutes_ago, hours_ago, days_ago; + gint weeks_ago, months_ago, years_ago; + + if (!gs_utils_split_time_difference (unix_time_seconds, + &minutes_ago, &hours_ago, &days_ago, + &weeks_ago, &months_ago, &years_ago)) + return NULL; + + if (minutes_ago < 5) { + /* TRANSLATORS: something happened less than 5 minutes ago */ + return g_strdup (_("Just now")); + } else if (hours_ago < 1) + return g_strdup_printf (ngettext ("%d minute ago", "%d minutes ago", minutes_ago), minutes_ago); + else if (days_ago < 1) + return g_strdup_printf (ngettext ("%d hour ago", "%d hours ago", hours_ago), hours_ago); + else + return gs_utils_split_time_to_datestring (days_ago, weeks_ago, months_ago, years_ago); +} + +static void +gs_utils_reboot_call_done_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + g_autoptr(GError) local_error = NULL; + + /* get result */ + if (gs_utils_invoke_reboot_finish (source, res, &local_error)) + return; + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_debug ("Calling reboot had been cancelled"); + else if (local_error != NULL) + g_warning ("Calling reboot failed: %s", local_error->message); +} + +static void +gs_utils_invoke_reboot_ready3_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GVariant) ret_val = NULL; + g_autoptr(GError) local_error = NULL; + + ret_val = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), result, &local_error); + if (ret_val != NULL) { + g_task_return_boolean (task, TRUE); + } else { + const gchar *method_name = g_task_get_task_data (task); + g_dbus_error_strip_remote_error (local_error); + g_prefix_error (&local_error, "Failed to call %s: ", method_name); + g_task_return_error (task, g_steal_pointer (&local_error)); + } +} + +static void +gs_utils_invoke_reboot_ready2_got_session_bus_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GDBusConnection) bus = NULL; + g_autoptr(GError) local_error = NULL; + GCancellable *cancellable; + + bus = g_bus_get_finish (result, &local_error); + if (bus == NULL) { + g_dbus_error_strip_remote_error (local_error); + g_prefix_error_literal (&local_error, "Failed to get D-Bus session bus: "); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + cancellable = g_task_get_cancellable (task); + + /* Make sure file buffers are written to the disk before invoking reboot */ + sync (); + + g_task_set_task_data (task, (gpointer) "org.gnome.SessionManager.Reboot", NULL); + g_dbus_connection_call (bus, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + "Reboot", + NULL, NULL, G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, cancellable, + gs_utils_invoke_reboot_ready3_cb, + g_steal_pointer (&task)); +} + +static void +gs_utils_invoke_reboot_ready2_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GVariant) ret_val = NULL; + g_autoptr(GError) local_error = NULL; + + ret_val = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), result, &local_error); + if (ret_val != NULL) { + g_task_return_boolean (task, TRUE); + } else { + GCancellable *cancellable; + const gchar *method_name = g_task_get_task_data (task); + + g_dbus_error_strip_remote_error (local_error); + g_prefix_error (&local_error, "Failed to call %s: ", method_name); + + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_debug ("%s", local_error->message); + g_clear_error (&local_error); + + cancellable = g_task_get_cancellable (task); + + g_bus_get (G_BUS_TYPE_SESSION, cancellable, + gs_utils_invoke_reboot_ready2_got_session_bus_cb, + g_steal_pointer (&task)); + } +} + +static void +gs_utils_invoke_reboot_ready1_got_system_bus_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GDBusConnection) bus = NULL; + g_autoptr(GError) local_error = NULL; + GCancellable *cancellable; + + bus = g_bus_get_finish (result, &local_error); + if (bus == NULL) { + g_dbus_error_strip_remote_error (local_error); + g_prefix_error_literal (&local_error, "Failed to get D-Bus system bus: "); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + cancellable = g_task_get_cancellable (task); + + /* Make sure file buffers are written to the disk before invoking reboot */ + sync (); + + g_task_set_task_data (task, (gpointer) "org.freedesktop.login1.Manager.Reboot", NULL); + g_dbus_connection_call (bus, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + "Reboot", + g_variant_new ("(b)", TRUE), /* interactive */ + NULL, G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, cancellable, + gs_utils_invoke_reboot_ready2_cb, + g_steal_pointer (&task)); +} + +static void +gs_utils_invoke_reboot_ready1_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GVariant) ret_val = NULL; + g_autoptr(GError) local_error = NULL; + + ret_val = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), result, &local_error); + if (ret_val != NULL) { + g_task_return_boolean (task, TRUE); + } else { + GCancellable *cancellable; + const gchar *method_name = g_task_get_task_data (task); + + g_dbus_error_strip_remote_error (local_error); + g_prefix_error (&local_error, "Failed to call %s: ", method_name); + + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + g_debug ("%s", local_error->message); + g_clear_error (&local_error); + + cancellable = g_task_get_cancellable (task); + + g_bus_get (G_BUS_TYPE_SYSTEM, cancellable, + gs_utils_invoke_reboot_ready1_got_system_bus_cb, + g_steal_pointer (&task)); + } +} + +static void +gs_utils_invoke_reboot_got_session_bus_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GDBusConnection) bus = NULL; + g_autoptr(GError) local_error = NULL; + GCancellable *cancellable; + const gchar *xdg_desktop; + gboolean call_session_manager = FALSE; + + bus = g_bus_get_finish (result, &local_error); + if (bus == NULL) { + g_dbus_error_strip_remote_error (local_error); + g_prefix_error_literal (&local_error, "Failed to get D-Bus session bus: "); + g_task_return_error (task, g_steal_pointer (&local_error)); + return; + } + + /* Make sure file buffers are written to the disk before invoking reboot */ + sync (); + + cancellable = g_task_get_cancellable (task); + + xdg_desktop = g_getenv ("XDG_CURRENT_DESKTOP"); + if (xdg_desktop != NULL) { + if (strstr (xdg_desktop, "KDE")) { + g_task_set_task_data (task, (gpointer) "org.kde.Shutdown.logoutAndReboot", NULL); + g_dbus_connection_call (bus, + "org.kde.Shutdown", + "/Shutdown", + "org.kde.Shutdown", + "logoutAndReboot", + NULL, NULL, G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, cancellable, + gs_utils_invoke_reboot_ready1_cb, + g_steal_pointer (&task)); + } else if (strstr (xdg_desktop, "LXDE")) { + g_task_set_task_data (task, (gpointer) "org.lxde.SessionManager.RequestReboot", NULL); + g_dbus_connection_call (bus, + "org.lxde.SessionManager", + "/org/lxde/SessionManager", + "org.lxde.SessionManager", + "RequestReboot", + NULL, NULL, G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, cancellable, + gs_utils_invoke_reboot_ready1_cb, + g_steal_pointer (&task)); + } else if (strstr (xdg_desktop, "MATE")) { + g_task_set_task_data (task, (gpointer) "org.gnome.SessionManager.RequestReboot", NULL); + g_dbus_connection_call (bus, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + "RequestReboot", + NULL, NULL, G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, cancellable, + gs_utils_invoke_reboot_ready1_cb, + g_steal_pointer (&task)); + } else if (strstr (xdg_desktop, "XFCE")) { + g_task_set_task_data (task, (gpointer) "org.xfce.Session.Manager.Restart", NULL); + g_dbus_connection_call (bus, + "org.xfce.SessionManager", + "/org/xfce/SessionManager", + "org.xfce.Session.Manager", + "Restart", + g_variant_new ("(b)", TRUE), /* allow_save */ + NULL, G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, cancellable, + gs_utils_invoke_reboot_ready1_cb, + g_steal_pointer (&task)); + } else { + /* Let the "GNOME" and "X-Cinnamon" be the default */ + call_session_manager = TRUE; + } + } else { + call_session_manager = TRUE; + } + + if (call_session_manager) { + g_task_set_task_data (task, (gpointer) "org.gnome.SessionManager.Reboot", NULL); + g_dbus_connection_call (bus, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + "Reboot", + NULL, NULL, G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, cancellable, + gs_utils_invoke_reboot_ready3_cb, + g_steal_pointer (&task)); + } +} + +/** + * gs_utils_invoke_reboot_async: + * @cancellable: (nullable): a %GCancellable for the call, or %NULL + * @ready_callback: (nullable): a callback to be called after the call is finished, or %NULL + * @user_data: user data for the @ready_callback + * + * Asynchronously invokes a reboot request. Finish the operation + * with gs_utils_invoke_reboot_finish(). + * + * When the @ready_callback is %NULL, a default callback is used, which shows + * a runtime warning (using g_warning) on the console when the call fails. + * + * Since: 41 + **/ +void +gs_utils_invoke_reboot_async (GCancellable *cancellable, + GAsyncReadyCallback ready_callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + + if (!ready_callback) + ready_callback = gs_utils_reboot_call_done_cb; + + task = g_task_new (NULL, cancellable, ready_callback, user_data); + g_task_set_source_tag (task, gs_utils_invoke_reboot_async); + + g_bus_get (G_BUS_TYPE_SESSION, cancellable, + gs_utils_invoke_reboot_got_session_bus_cb, + g_steal_pointer (&task)); +} + +/** + * gs_utils_invoke_reboot_finish: + * @source_object: the source object provided in the ready callback + * @result: the result object provided in the ready callback + * @error: a #GError, or %NULL + * + * Finishes gs_utils_invoke_reboot_async() call. + * + * Returns: Whether succeeded. If failed, the @error is set. + * + * Since: 43 + **/ +gboolean +gs_utils_invoke_reboot_finish (GObject *source_object, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_TASK (result), FALSE); + g_return_val_if_fail (g_task_is_valid (result, source_object), FALSE); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gs_utils_invoke_reboot_async, FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +/** + * gs_utils_format_size: + * @size_bytes: size to format, in bytes + * @out_is_markup: (out) (not nullable): stores whther the returned string is a markup + * + * Similar to `g_format_size`, only splits the value and the unit into + * separate parts and draws the unit with a smaller font, in case + * the relevant code is available in GLib while compiling. + * + * The @out_is_markup is always set, providing the information about + * used format of the returned string. + * + * Returns: (transfer full): a new string, containing the @size_bytes formatted as string + * + * Since: 43 + **/ +gchar * +gs_utils_format_size (guint64 size_bytes, + gboolean *out_is_markup) +{ +#ifdef HAVE_G_FORMAT_SIZE_ONLY_VALUE + g_autofree gchar *value_str = g_format_size_full (size_bytes, G_FORMAT_SIZE_ONLY_VALUE); + g_autofree gchar *unit_str = g_format_size_full (size_bytes, G_FORMAT_SIZE_ONLY_UNIT); + g_autofree gchar *value_escaped = g_markup_escape_text (value_str, -1); + g_autofree gchar *unit_escaped = g_markup_printf_escaped ("%s", unit_str); + g_return_val_if_fail (out_is_markup != NULL, NULL); + *out_is_markup = TRUE; + /* Translators: This is to construct a disk size string consisting of the value and its unit, while + * the unit is drawn with a smaller font. If you need to flip the order, then you can use "%2$s %1$s". + * Make sure you'll preserve the no break space between the values. + * Example result: "13.0 MB" */ + return g_strdup_printf (C_("format-size", "%s\302\240%s"), value_escaped, unit_escaped); +#else /* HAVE_G_FORMAT_SIZE_ONLY_VALUE */ + g_return_val_if_fail (out_is_markup != NULL, NULL); + *out_is_markup = FALSE; + return g_format_size (size_bytes); +#endif /* HAVE_G_FORMAT_SIZE_ONLY_VALUE */ +} + +/** + * gs_show_uri: + * @parent: (nullable): parent window + * @uri: the uri to show + * + * This function launches the default application for showing + * a given uri, or shows an error dialog if that fails. + * + * Since: 44 + **/ +void +gs_show_uri (GtkWindow *parent, + const char *uri) +{ + g_autoptr (GtkUriLauncher) launcher = NULL; + + launcher = gtk_uri_launcher_new (uri); + gtk_uri_launcher_launch (launcher, parent, NULL, NULL, NULL); +} + +/** + * gs_utils_get_app_data_dir: + * @app: a #GsApp + * + * Returns @app's data directory, if known. It also checks + * whether the directory exists and returns %NULL, when not. + * + * Returns: (nullable) (transfer full): existing @app's data directory, + * or #NULL, when not known or does not exist + * + * Since: 45 + **/ +gchar * +gs_utils_get_app_data_dir (GsApp *app) +{ + g_return_val_if_fail (GS_IS_APP (app), NULL); + + if (gs_app_get_id (app) == NULL) + return NULL; + + /* do this only for Flatpak for now */ + if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_FLATPAK) { + g_autofree gchar *data_dir = g_build_filename (g_get_home_dir (), ".var", "app", gs_app_get_id (app), NULL); + if (g_file_test (data_dir, G_FILE_TEST_EXISTS)) + return g_steal_pointer (&data_dir); + return NULL; + } + + return NULL; +} + +/** + * gs_utils_remove_app_data_dir: + * @app: a #GsApp + * @plugin_loader: a #GsPluginLoader where to pass any errors + * + * Removes @app's data dir, as returned from gs_utils_get_app_data_dir(). + * The function does nothing when the app has no or unknown data dir. + * Any errors of the removal are passed to the @plugin_loader, while + * it's not an error when the directory does not exist. + * + * Returns: %TRUE, when @app's data dir had been successfully removed + * + * Since: 45 + **/ +gboolean +gs_utils_remove_app_data_dir (GsApp *app, + GsPluginLoader *plugin_loader) +{ + g_autofree gchar *dir = NULL; + g_autoptr(GError) error = NULL; + + g_return_val_if_fail (GS_IS_APP (app), FALSE); + g_return_val_if_fail (GS_IS_PLUGIN_LOADER (plugin_loader), FALSE); + + dir = gs_utils_get_app_data_dir (app); + if (dir == NULL) + return FALSE; + + gs_utils_rmtree (dir, &error); + + if (error != NULL && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { + gs_utils_error_convert_gio (&error); + gs_plugin_loader_claim_error (plugin_loader, NULL, GS_PLUGIN_ACTION_UNKNOWN, + app, TRUE, error); + return FALSE; + } + + return TRUE; +} diff --git a/src/gs-common.h b/src/gs-common.h new file mode 100644 index 0000000..d41a42a --- /dev/null +++ b/src/gs-common.h @@ -0,0 +1,80 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +typedef void (*GsRemoveFunc) (GtkWidget *container, + GtkWidget *child); + +void gs_widget_remove_all (GtkWidget *container, + GsRemoveFunc remove_func); +void gs_grab_focus_when_mapped (GtkWidget *widget); + +void gs_app_notify_installed (GsApp *app); +GtkResponseType + gs_app_notify_unavailable (GsApp *app, + GtkWidget *parent); + +gboolean gs_utils_is_current_desktop (const gchar *name); +gchar *gs_utils_set_key_colors_in_css (const gchar *css, + GsApp *app); +void gs_utils_widget_set_css (GtkWidget *widget, + GtkCssProvider **provider, + const gchar *css); +const gchar *gs_utils_get_error_value (const GError *error); +void gs_utils_show_error_dialog (GtkWidget *parent, + const gchar *title, + const gchar *msg, + const gchar *details); +void gs_utils_show_error_dialog_simple + (GtkWidget *parent, + const gchar *title, + const gchar *text); +gboolean gs_utils_ask_user_accepts (GtkWidget *parent, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label); +gchar *gs_utils_build_unique_id_kind (AsComponentKind kind, + const gchar *id); +gboolean gs_utils_list_has_component_fuzzy (GsAppList *list, + GsApp *app); +void gs_utils_reboot_notify (GsAppList *list, + gboolean is_install); +gchar *gs_utils_time_to_datestring (gint64 unix_time_seconds); +gchar *gs_utils_time_to_timestring (gint64 unix_time_seconds); +void gs_utils_invoke_reboot_async (GCancellable *cancellable, + GAsyncReadyCallback ready_callback, + gpointer user_data); +gboolean gs_utils_invoke_reboot_finish (GObject *source_object, + GAsyncResult *result, + GError **error); +gboolean gs_utils_split_time_difference (gint64 unix_time_seconds, + gint *out_minutes_ago, + gint *out_hours_ago, + gint *out_days_ago, + gint *out_weeks_ago, + gint *out_months_ago, + gint *out_years_ago); +gchar *gs_utils_format_size (guint64 size_bytes, + gboolean *out_is_markup); +void gs_show_uri (GtkWindow *parent, + const char *uri); +gchar *gs_utils_get_app_data_dir (GsApp *app); +gboolean gs_utils_remove_app_data_dir (GsApp *app, + GsPluginLoader *plugin_loader); + +G_END_DECLS diff --git a/src/gs-context-dialog-row.c b/src/gs-context-dialog-row.c new file mode 100644 index 0000000..a4952ff --- /dev/null +++ b/src/gs-context-dialog-row.c @@ -0,0 +1,376 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-context-dialog-row + * @short_description: A list box row for context dialogs + * + * #GsContextDialogRow is a #GtkListBox row designed to be used in context + * dialogs such as #GsHardwareSupportContextDialog. Each row indicates how well + * the app supports a certain feature, attribute or permission. Each row + * contains an image in a lozenge, a title, a description, and has an + * ‘importance’ which is primarily indicated through the colour of the image. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "gs-context-dialog-row.h" +#include "gs-lozenge.h" +#include "gs-enums.h" + +struct _GsContextDialogRow +{ + AdwActionRow parent_instance; + + GsContextDialogRowImportance importance; + + GsLozenge *lozenge; /* (unowned) */ +}; + +G_DEFINE_TYPE (GsContextDialogRow, gs_context_dialog_row, ADW_TYPE_ACTION_ROW) + +typedef enum { + PROP_ICON_NAME = 1, + PROP_CONTENT, + PROP_IMPORTANCE, +} GsContextDialogRowProperty; + +static GParamSpec *obj_props[PROP_IMPORTANCE + 1] = { NULL, }; + +/* These match the CSS classes from gtk-style.css. */ +static const gchar * +css_class_for_importance (GsContextDialogRowImportance importance) +{ + switch (importance) { + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL: + return "grey"; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT: + return "green"; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION: + return "yellow"; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING: + return "orange"; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT: + return "red"; + default: + g_assert_not_reached (); + } +} + +static void +gs_context_dialog_row_init (GsContextDialogRow *self) +{ + g_type_ensure (GS_TYPE_LOZENGE); + + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +gs_context_dialog_row_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsContextDialogRow *self = GS_CONTEXT_DIALOG_ROW (object); + + switch ((GsContextDialogRowProperty) prop_id) { + case PROP_ICON_NAME: + g_value_set_string (value, gs_context_dialog_row_get_icon_name (self)); + break; + case PROP_CONTENT: + g_value_set_string (value, gs_context_dialog_row_get_content (self)); + break; + case PROP_IMPORTANCE: + g_value_set_enum (value, gs_context_dialog_row_get_importance (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_context_dialog_row_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsContextDialogRow *self = GS_CONTEXT_DIALOG_ROW (object); + + switch ((GsContextDialogRowProperty) prop_id) { + case PROP_ICON_NAME: + gs_lozenge_set_icon_name (self->lozenge, g_value_get_string (value)); + break; + case PROP_CONTENT: + gs_lozenge_set_text (self->lozenge, g_value_get_string (value)); + break; + case PROP_IMPORTANCE: { + const gchar *css_class; + + self->importance = g_value_get_enum (value); + css_class = css_class_for_importance (self->importance); + + gtk_widget_remove_css_class (GTK_WIDGET (self->lozenge), "green"); + gtk_widget_remove_css_class (GTK_WIDGET (self->lozenge), "yellow"); + gtk_widget_remove_css_class (GTK_WIDGET (self->lozenge), "red"); + gtk_widget_remove_css_class (GTK_WIDGET (self->lozenge), "grey"); + + gtk_widget_add_css_class (GTK_WIDGET (self->lozenge), css_class); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_context_dialog_row_class_init (GsContextDialogRowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_context_dialog_row_get_property; + object_class->set_property = gs_context_dialog_row_set_property; + + /** + * GsContextDialogRow:icon-name: (nullable) + * + * Name of the icon to display in the row. + * + * This must be %NULL if #GsContextDialogRow:content is set, + * and non-%NULL otherwise. + * + * Since: 41 + */ + obj_props[PROP_ICON_NAME] = + g_param_spec_string ("icon-name", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GsContextDialogRow:content: (nullable) + * + * Text content to display in the row. + * + * This must be %NULL if #GsContextDialogRow:icon-name is set, + * and non-%NULL otherwise. + * + * Since: 41 + */ + obj_props[PROP_CONTENT] = + g_param_spec_string ("content", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GsContextDialogRow:importance: + * + * Importance of the information in the row to the user’s decision + * making about an app. This is primarily represented as the row’s + * colour. + * + * Since: 41 + */ + obj_props[PROP_IMPORTANCE] = + g_param_spec_enum ("importance", NULL, NULL, + GS_TYPE_CONTEXT_DIALOG_ROW_IMPORTANCE, GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + /* This uses the same CSS name as a standard #GtkListBoxRow in order to + * get the default styling from GTK. */ + gtk_widget_class_set_css_name (widget_class, "row"); + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-context-dialog-row.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsContextDialogRow, lozenge); +} + +/** + * gs_context_dialog_row_new: + * @icon_name: (not nullable): name of the icon for the row + * @importance: importance of the information in the row + * @title: (not nullable): title for the row + * @description: (not nullable): description for the row + * + * Create a new #GsContextDialogRow with an icon inside the lozenge. + * + * Returns: (transfer full): a new #GsContextDialogRow + * Since: 41 + */ +GtkListBoxRow * +gs_context_dialog_row_new (const gchar *icon_name, + GsContextDialogRowImportance importance, + const gchar *title, + const gchar *description) +{ + g_return_val_if_fail (icon_name != NULL, NULL); + g_return_val_if_fail (title != NULL, NULL); + g_return_val_if_fail (description != NULL, NULL); + + return g_object_new (GS_TYPE_CONTEXT_DIALOG_ROW, + "icon-name", icon_name, + "importance", importance, + "title", title, + "subtitle", description, + NULL); +} + +/** + * gs_context_dialog_row_new_text: + * @content: (not nullable): text to put in the lozenge + * @importance: importance of the information in the row + * @title: (not nullable): title for the row + * @description: (not nullable): description for the row + * + * Create a new #GsContextDialogRow with text inside the lozenge. + * + * Returns: (transfer full): a new #GsContextDialogRow + * Since: 41 + */ +GtkListBoxRow * +gs_context_dialog_row_new_text (const gchar *content, + GsContextDialogRowImportance importance, + const gchar *title, + const gchar *description) +{ + g_return_val_if_fail (content != NULL, NULL); + g_return_val_if_fail (title != NULL, NULL); + g_return_val_if_fail (description != NULL, NULL); + + return g_object_new (GS_TYPE_CONTEXT_DIALOG_ROW, + "content", content, + "importance", importance, + "title", title, + "subtitle", description, + NULL); +} + +/** + * gs_context_dialog_row_get_icon_name: + * @self: a #GsContextDialogRow + * + * Get the value of #GsContextDialogRow:icon-name. + * + * Returns: the name of the icon used in the row + * Since: 41 + */ +const gchar * +gs_context_dialog_row_get_icon_name (GsContextDialogRow *self) +{ + g_return_val_if_fail (GS_IS_CONTEXT_DIALOG_ROW (self), NULL); + + return gs_lozenge_get_icon_name (self->lozenge); +} + +/** + * gs_context_dialog_row_get_content: + * @self: a #GsContextDialogRow + * + * Get the value of #GsContextDialogRow:content. + * + * Returns: the text content used in the row + * Since: 41 + */ +const gchar * +gs_context_dialog_row_get_content (GsContextDialogRow *self) +{ + g_return_val_if_fail (GS_IS_CONTEXT_DIALOG_ROW (self), NULL); + + return gs_lozenge_get_text (self->lozenge); +} + +/** + * gs_context_dialog_row_get_content_is_markup: + * @self: a #GsContextDialogRow + * + * Get whether the #GsContextDialogRow:content is markup. + * + * Returns: %TRUE when then content text is markup + * Since: 43 + */ +gboolean +gs_context_dialog_row_get_content_is_markup (GsContextDialogRow *self) +{ + g_return_val_if_fail (GS_IS_CONTEXT_DIALOG_ROW (self), FALSE); + + return gs_lozenge_get_use_markup (self->lozenge); +} + +/** + * gs_context_dialog_row_set_content_markup: + * @self: a #GsContextDialogRow + * @markup: markup to set + * + * Set the @markup content as markup. + * + * Since: 43 + */ +void +gs_context_dialog_row_set_content_markup (GsContextDialogRow *self, + const gchar *markup) +{ + g_return_if_fail (GS_IS_CONTEXT_DIALOG_ROW (self)); + + gs_lozenge_set_markup (self->lozenge, markup); +} + +/** + * gs_context_dialog_row_get_importance: + * @self: a #GsContextDialogRow + * + * Get the value of #GsContextDialogRow:importance. + * + * Returns: the importance of the information in the row + * Since: 41 + */ +GsContextDialogRowImportance +gs_context_dialog_row_get_importance (GsContextDialogRow *self) +{ + g_return_val_if_fail (GS_IS_CONTEXT_DIALOG_ROW (self), GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL); + + return self->importance; +} + +/** + * gs_context_dialog_row_set_size_groups: + * @self: a #GsContextDialogRow + * @lozenge: (nullable) (transfer none): a #GtkSizeGroup for the lozenge, or %NULL + * @title: (nullable) (transfer none): a #GtkSizeGroup for the title, or %NULL + * @description: (nullable) (transfer none): a #GtkSizeGroup for the description, or %NULL + * + * Add widgets from the #GsContextDialogRow to the given size groups. If a size + * group is %NULL, the corresponding widget will not be changed. + * + * Since: 41 + */ +void +gs_context_dialog_row_set_size_groups (GsContextDialogRow *self, + GtkSizeGroup *lozenge, + GtkSizeGroup *title, + GtkSizeGroup *description) +{ + g_return_if_fail (GS_IS_CONTEXT_DIALOG_ROW (self)); + g_return_if_fail (lozenge == NULL || GTK_IS_SIZE_GROUP (lozenge)); + g_return_if_fail (title == NULL || GTK_IS_SIZE_GROUP (title)); + g_return_if_fail (description == NULL || GTK_IS_SIZE_GROUP (description)); + + if (lozenge != NULL) + gtk_size_group_add_widget (lozenge, GTK_WIDGET (self->lozenge)); +} diff --git a/src/gs-context-dialog-row.h b/src/gs-context-dialog-row.h new file mode 100644 index 0000000..7c31ba5 --- /dev/null +++ b/src/gs-context-dialog-row.h @@ -0,0 +1,71 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +/** + * GsContextDialogRowImportance: + * @GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL: neutral or unknown importance + * @GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT: unimportant + * @GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION: a notice-like importance (Since: 45) + * @GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING: a bit important + * @GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT: definitely important + * + * The importance of the information in a #GsContextDialogRow. The values + * increase from less important to more important. + * + * Since: 41 + */ +typedef enum +{ + /* The code in this file relies on the fact that these enum values + * numerically increase as they get more important. */ + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT, +} GsContextDialogRowImportance; + +#define GS_TYPE_CONTEXT_DIALOG_ROW (gs_context_dialog_row_get_type ()) + +G_DECLARE_FINAL_TYPE (GsContextDialogRow, gs_context_dialog_row, GS, CONTEXT_DIALOG_ROW, AdwActionRow) + +GtkListBoxRow *gs_context_dialog_row_new (const gchar *icon_name, + GsContextDialogRowImportance importance, + const gchar *title, + const gchar *description); +GtkListBoxRow *gs_context_dialog_row_new_text (const gchar *content, + GsContextDialogRowImportance importance, + const gchar *title, + const gchar *description); + +const gchar *gs_context_dialog_row_get_icon_name (GsContextDialogRow *self); +const gchar *gs_context_dialog_row_get_content (GsContextDialogRow *self); +GsContextDialogRowImportance gs_context_dialog_row_get_importance (GsContextDialogRow *self); +gboolean gs_context_dialog_row_get_content_is_markup + (GsContextDialogRow *self); +void gs_context_dialog_row_set_content_markup + (GsContextDialogRow *self, + const gchar *markup); + +void gs_context_dialog_row_set_size_groups (GsContextDialogRow *self, + GtkSizeGroup *lozenge, + GtkSizeGroup *title, + GtkSizeGroup *description); + +G_END_DECLS diff --git a/src/gs-context-dialog-row.ui b/src/gs-context-dialog-row.ui new file mode 100644 index 0000000..fc462ed --- /dev/null +++ b/src/gs-context-dialog-row.ui @@ -0,0 +1,22 @@ + + + + + + diff --git a/src/gs-css.c b/src/gs-css.c new file mode 100644 index 0000000..288b91a --- /dev/null +++ b/src/gs-css.c @@ -0,0 +1,313 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-css + * @title: GsCss + * @stability: Unstable + * @short_description: Parse, validate and rewrite CSS resources + */ + +#include "config.h" + +#include +#include + +#include "lib/gs-utils.h" +#include "gs-css.h" + +struct _GsCss +{ + GObject parent_instance; + GHashTable *ids; + GsCssRewriteFunc rewrite_func; + gpointer rewrite_func_data; +}; + +G_DEFINE_TYPE (GsCss, gs_css, G_TYPE_OBJECT) + +static void +_cleanup_string (GString *str) +{ + /* remove leading newlines */ + while (g_str_has_prefix (str->str, "\n") || g_str_has_prefix (str->str, " ")) + g_string_erase (str, 0, 1); + + /* remove trailing newlines */ + while (g_str_has_suffix (str->str, "\n") || g_str_has_suffix (str->str, " ")) + g_string_truncate (str, str->len - 1); +} + +/** + * gs_css_parse: + * @self: a #GsCss + * @markup: come CSS, or %NULL + * @error: a #GError or %NULL + * + * Parses the CSS markup and does some basic validation checks on the input. + * + * Returns: %TRUE for success + */ +gboolean +gs_css_parse (GsCss *self, const gchar *markup, GError **error) +{ + g_auto(GStrv) parts = NULL; + g_autoptr(GString) markup_str = NULL; + + /* no data */ + if (markup == NULL || markup[0] == '\0') + return TRUE; + + /* old style, no IDs */ + markup_str = g_string_new (markup); + gs_utils_gstring_replace (markup_str, "@datadir@", DATADIR); + if (!g_str_has_prefix (markup_str->str, "#")) { + g_hash_table_insert (self->ids, + g_strdup ("tile"), + g_string_free (g_steal_pointer (&markup_str), FALSE)); + return TRUE; + } + + /* split up CSS into ID chunks, e.g. + * + * #tile {border-radius: 0;} + * #name {color: white;} + */ + parts = g_strsplit (markup_str->str + 1, "\n#", -1); + for (guint i = 0; parts[i] != NULL; i++) { + g_autoptr(GString) current_css = NULL; + g_autoptr(GString) current_key = NULL; + for (guint j = 1; parts[i][j] != '\0'; j++) { + const gchar ch = parts[i][j]; + if (ch == '{') { + if (current_key != NULL || current_css != NULL) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "invalid '{'"); + return FALSE; + } + current_key = g_string_new_len (parts[i], j); + current_css = g_string_new (NULL); + _cleanup_string (current_key); + + /* already added */ + if (g_hash_table_lookup (self->ids, current_key->str) != NULL) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "duplicate ID '%s'", + current_key->str); + return FALSE; + } + continue; + } + if (ch == '}') { + if (current_key == NULL || current_css == NULL) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "invalid '}'"); + return FALSE; + } + _cleanup_string (current_css); + g_hash_table_insert (self->ids, + g_string_free (current_key, FALSE), + g_string_free (current_css, FALSE)); + current_key = NULL; + current_css = NULL; + continue; + } + if (current_css != NULL) + g_string_append_c (current_css, ch); + } + if (current_key != NULL || current_css != NULL) { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "missing '}'"); + return FALSE; + } + } + + /* success */ + return TRUE; +} + +/** + * gs_css_get_markup_for_id: + * @self: a #GsCss + * @id: an ID, or %NULL for the default + * + * Gets the CSS markup for a specific ID. + * + * Returns: %TRUE for success + */ +const gchar * +gs_css_get_markup_for_id (GsCss *self, const gchar *id) +{ + if (id == NULL) + id = "tile"; + return g_hash_table_lookup (self->ids, id); +} + +static void +_css_parsing_error_cb (GtkCssProvider *provider, + GtkCssSection *section, + GError *error, + gpointer user_data) +{ + GError **error_parse = (GError **) user_data; + if (*error_parse != NULL) { + const GtkCssLocation *start_location; + + start_location = gtk_css_section_get_start_location (section); + g_warning ("ignoring parse error %" G_GSIZE_FORMAT ":%" G_GSIZE_FORMAT ": %s", + start_location->lines + 1, + start_location->line_chars, + error->message); + return; + } + *error_parse = g_error_copy (error); +} + +static gboolean +gs_css_validate_part (GsCss *self, const gchar *markup, GError **error) +{ + g_autofree gchar *markup_new = NULL; + g_autoptr(GError) error_parse = NULL; + g_autoptr(GString) str = NULL; + g_autoptr(GtkCssProvider) provider = NULL; + + /* nothing set */ + if (markup == NULL) + return TRUE; + + /* remove custom class if NULL */ + str = g_string_new (NULL); + g_string_append (str, ".themed-widget {"); + if (self->rewrite_func != NULL) { + markup_new = self->rewrite_func (self->rewrite_func_data, + markup, + error); + if (markup_new == NULL) + return FALSE; + } else { + markup_new = g_strdup (markup); + } + g_string_append (str, markup_new); + g_string_append (str, "}"); + + /* set up custom provider */ + provider = gtk_css_provider_new (); + g_signal_connect (provider, "parsing-error", + G_CALLBACK (_css_parsing_error_cb), &error_parse); + gtk_style_context_add_provider_for_display (gdk_display_get_default (), + GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + #if GTK_CHECK_VERSION(4, 12, 0) + gtk_css_provider_load_from_string (provider, str->str); + #else + gtk_css_provider_load_from_data (provider, str->str, -1); + #endif + if (error_parse != NULL) { + if (error != NULL) + *error = g_error_copy (error_parse); + return FALSE; + } + return TRUE; +} + +/** + * gs_css_validate: + * @self: a #GsCss + * @error: a #GError or %NULL + * + * Validates each part of the CSS markup. + * + * Returns: %TRUE for success + */ +gboolean +gs_css_validate (GsCss *self, GError **error) +{ + g_autoptr(GList) keys = NULL; + + /* check each CSS ID */ + keys = g_hash_table_get_keys (self->ids); + for (GList *l = keys; l != NULL; l = l->next) { + const gchar *tmp; + const gchar *id = l->data; + if (g_strcmp0 (id, "tile") != 0 && + g_strcmp0 (id, "name") != 0 && + g_strcmp0 (id, "summary") != 0) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Invalid CSS ID '%s'", + id); + return FALSE; + } + tmp = g_hash_table_lookup (self->ids, id); + if (!gs_css_validate_part (self, tmp, error)) + return FALSE; + } + + /* success */ + return TRUE; +} + +/** + * gs_css_set_rewrite_func: + * @self: a #GsCss + * @func: a #GsCssRewriteFunc or %NULL + * @user_data: user data to pass to @func + * + * Sets a function to be used when rewriting CSS before it is parsed. + * + * Returns: %TRUE for success + */ +void +gs_css_set_rewrite_func (GsCss *self, GsCssRewriteFunc func, gpointer user_data) +{ + self->rewrite_func = func; + self->rewrite_func_data = user_data; +} + +static void +gs_css_finalize (GObject *object) +{ + GsCss *self = GS_CSS (object); + g_hash_table_unref (self->ids); + G_OBJECT_CLASS (gs_css_parent_class)->finalize (object); +} + +static void +gs_css_class_init (GsCssClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_css_finalize; +} + +static void +gs_css_init (GsCss *self) +{ + self->ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); +} + +/** + * gs_css_new: + * + * Return value: a new #GsCss object. + **/ +GsCss * +gs_css_new (void) +{ + GsCss *self; + self = g_object_new (GS_TYPE_CSS, NULL); + return GS_CSS (self); +} diff --git a/src/gs-css.h b/src/gs-css.h new file mode 100644 index 0000000..6884333 --- /dev/null +++ b/src/gs-css.h @@ -0,0 +1,36 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_CSS (gs_css_get_type ()) + +G_DECLARE_FINAL_TYPE (GsCss, gs_css, GS, CSS, GObject) + +typedef gchar *(*GsCssRewriteFunc) (gpointer user_data, + const gchar *markup, + GError **error); + +GsCss *gs_css_new (void); +const gchar *gs_css_get_markup_for_id (GsCss *self, + const gchar *id); +gboolean gs_css_parse (GsCss *self, + const gchar *markup, + GError **error); +gboolean gs_css_validate (GsCss *self, + GError **error); +void gs_css_set_rewrite_func (GsCss *self, + GsCssRewriteFunc func, + gpointer user_data); + +G_END_DECLS diff --git a/src/gs-dbus-helper.c b/src/gs-dbus-helper.c new file mode 100644 index 0000000..2b1263a --- /dev/null +++ b/src/gs-dbus-helper.c @@ -0,0 +1,970 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "gnome-software-private.h" + +#include "gs-application.h" +#include "gs-dbus-helper.h" +#include "gs-packagekit-generated.h" +#include "gs-packagekit-modify2-generated.h" +#include "gs-resources.h" +#include "gs-extras-page.h" + +struct _GsDbusHelper { + GObject parent; + GDBusInterfaceSkeleton *query_interface; + GDBusInterfaceSkeleton *modify_interface; + GDBusInterfaceSkeleton *modify2_interface; + PkTask *task; + guint dbus_own_name_id; + + GDBusConnection *bus_connection; /* (owned) (not nullable) */ +}; + +G_DEFINE_TYPE (GsDbusHelper, gs_dbus_helper, G_TYPE_OBJECT) + +typedef enum { + PROP_BUS_CONNECTION = 1, +} GsDbusHelperProperty; + +static GParamSpec *obj_props[PROP_BUS_CONNECTION + 1] = { NULL, }; + +typedef struct { + GDBusMethodInvocation *invocation; + GsDbusHelper *dbus_helper; + gboolean show_confirm_deps; + gboolean show_confirm_install; + gboolean show_confirm_search; + gboolean show_finished; + gboolean show_progress; + gboolean show_warning; +} GsDbusHelperTask; + +static void +gs_dbus_helper_task_free (GsDbusHelperTask *dtask) +{ + if (dtask->dbus_helper != NULL) + g_object_unref (dtask->dbus_helper); + + g_free (dtask); +} + +static void +gs_dbus_helper_task_set_interaction (GsDbusHelperTask *dtask, const gchar *interaction) +{ + guint i; + g_auto(GStrv) interactions = NULL; + + interactions = g_strsplit (interaction, ",", -1); + for (i = 0; interactions[i] != NULL; i++) { + if (g_strcmp0 (interactions[i], "show-warnings") == 0) + dtask->show_warning = TRUE; + else if (g_strcmp0 (interactions[i], "hide-warnings") == 0) + dtask->show_warning = FALSE; + else if (g_strcmp0 (interactions[i], "show-progress") == 0) + dtask->show_progress = TRUE; + else if (g_strcmp0 (interactions[i], "hide-progress") == 0) + dtask->show_progress = FALSE; + else if (g_strcmp0 (interactions[i], "show-finished") == 0) + dtask->show_finished = TRUE; + else if (g_strcmp0 (interactions[i], "hide-finished") == 0) + dtask->show_finished = FALSE; + else if (g_strcmp0 (interactions[i], "show-confirm-search") == 0) + dtask->show_confirm_search = TRUE; + else if (g_strcmp0 (interactions[i], "hide-confirm-search") == 0) + dtask->show_confirm_search = FALSE; + else if (g_strcmp0 (interactions[i], "show-confirm-install") == 0) + dtask->show_confirm_install = TRUE; + else if (g_strcmp0 (interactions[i], "hide-confirm-install") == 0) + dtask->show_confirm_install = FALSE; + else if (g_strcmp0 (interactions[i], "show-confirm-deps") == 0) + dtask->show_confirm_deps = TRUE; + else if (g_strcmp0 (interactions[i], "hide-confirm-deps") == 0) + dtask->show_confirm_deps = FALSE; + } +} + +static void +gs_dbus_helper_progress_cb (PkProgress *progress, PkProgressType type, gpointer data) +{ +} + +static void +gs_dbus_helper_query_is_installed_cb (GObject *source, GAsyncResult *res, gpointer data) +{ + GsDbusHelperTask *dtask = (GsDbusHelperTask *) data; + PkClient *client = PK_CLIENT (source); + g_autoptr(GError) error = NULL; + g_autoptr(PkError) error_code = NULL; + g_autoptr(PkResults) results = NULL; + g_autoptr(GPtrArray) array = NULL; + + /* get the results */ + results = pk_client_generic_finish (client, res, &error); + if (results == NULL) { + g_dbus_method_invocation_return_error (dtask->invocation, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "failed to resolve: %s", + error->message); + goto out; + } + + /* check error code */ + error_code = pk_results_get_error_code (results); + if (error_code != NULL) { + g_dbus_method_invocation_return_error (dtask->invocation, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "failed to resolve: %s", + pk_error_get_details (error_code)); + goto out; + } + + /* get results */ + array = pk_results_get_package_array (results); + gs_package_kit_query_complete_is_installed (GS_PACKAGE_KIT_QUERY (dtask->dbus_helper->query_interface), + dtask->invocation, + array->len > 0); +out: + gs_dbus_helper_task_free (dtask); +} + +static void +gs_dbus_helper_query_search_file_cb (GObject *source, GAsyncResult *res, gpointer data) +{ + g_autoptr(GError) error = NULL; + GsDbusHelperTask *dtask = (GsDbusHelperTask *) data; + PkClient *client = PK_CLIENT (source); + PkInfoEnum info; + PkPackage *item; + g_autoptr(GPtrArray) array = NULL; + g_autoptr(PkError) error_code = NULL; + g_autoptr(PkResults) results = NULL; + + /* get the results */ + results = pk_client_generic_finish (client, res, &error); + if (results == NULL) { + g_dbus_method_invocation_return_error (dtask->invocation, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "failed to search: %s", + error->message); + return; + } + + /* check error code */ + error_code = pk_results_get_error_code (results); + if (error_code != NULL) { + g_dbus_method_invocation_return_error (dtask->invocation, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "failed to search: %s", + pk_error_get_details (error_code)); + return; + } + + /* get results */ + array = pk_results_get_package_array (results); + if (array->len == 0) { + //TODO: org.freedesktop.PackageKit.Query.unknown + g_dbus_method_invocation_return_error (dtask->invocation, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "failed to find any packages"); + return; + } + + /* get first item */ + item = g_ptr_array_index (array, 0); + info = pk_package_get_info (item); + gs_package_kit_query_complete_search_file (GS_PACKAGE_KIT_QUERY (dtask->dbus_helper->query_interface), + dtask->invocation, + info == PK_INFO_ENUM_INSTALLED, + pk_package_get_name (item)); +} + +static gboolean +handle_query_search_file (GsPackageKitQuery *skeleton, + GDBusMethodInvocation *invocation, + const gchar *file_name, + const gchar *interaction, + gpointer user_data) +{ + GsDbusHelper *dbus_helper = user_data; + GsDbusHelperTask *dtask; + g_auto(GStrv) names = NULL; + + g_debug ("****** SearchFile"); + + dtask = g_new0 (GsDbusHelperTask, 1); + dtask->dbus_helper = g_object_ref (dbus_helper); + dtask->invocation = invocation; + gs_dbus_helper_task_set_interaction (dtask, interaction); + names = g_strsplit (file_name, "&", -1); + pk_client_search_files_async (PK_CLIENT (dbus_helper->task), + pk_bitfield_value (PK_FILTER_ENUM_NEWEST), + names, NULL, + gs_dbus_helper_progress_cb, dtask, + gs_dbus_helper_query_search_file_cb, dtask); + + return TRUE; +} + +static gboolean +handle_query_is_installed (GsPackageKitQuery *skeleton, + GDBusMethodInvocation *invocation, + const gchar *package_name, + const gchar *interaction, + gpointer user_data) +{ + GsDbusHelper *dbus_helper = user_data; + GsDbusHelperTask *dtask; + g_auto(GStrv) names = NULL; + + g_debug ("****** IsInstalled"); + + dtask = g_new0 (GsDbusHelperTask, 1); + dtask->dbus_helper = g_object_ref (dbus_helper); + dtask->invocation = invocation; + gs_dbus_helper_task_set_interaction (dtask, interaction); + names = g_strsplit (package_name, "|", 1); + pk_client_resolve_async (PK_CLIENT (dbus_helper->task), + pk_bitfield_value (PK_FILTER_ENUM_INSTALLED), + names, NULL, + gs_dbus_helper_progress_cb, dtask, + gs_dbus_helper_query_is_installed_cb, dtask); + + return TRUE; +} + +static gboolean +is_show_confirm_search_set (const gchar *interaction) +{ + GsDbusHelperTask *dtask; + gboolean ret; + + dtask = g_new0 (GsDbusHelperTask, 1); + dtask->show_confirm_search = TRUE; + gs_dbus_helper_task_set_interaction (dtask, interaction); + ret = dtask->show_confirm_search; + gs_dbus_helper_task_free (dtask); + + return ret; +} + +static void +notify_search_resources (GsExtrasPageMode mode, + const gchar *desktop_id, + gchar **resources, + const gchar *ident) +{ + const gchar *app_name = NULL; + const gchar *mode_string; + const gchar *title = NULL; + g_autofree gchar *body = NULL; + g_autoptr(GDesktopAppInfo) app_info = NULL; + g_autoptr(GNotification) n = NULL; + + if (desktop_id != NULL) { + app_info = gs_utils_get_desktop_app_info (desktop_id); + if (app_info != NULL) + app_name = g_app_info_get_name (G_APP_INFO (app_info)); + } + + if (app_name == NULL) { + /* TRANSLATORS: this is a what we use in notifications if the app's name is unknown */ + app_name = _("An app"); + } + + switch (mode) { + case GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES: + /* TRANSLATORS: this is a notification displayed when an app needs additional MIME types. */ + body = g_strdup_printf (_("%s is requesting additional file format support."), app_name); + /* TRANSLATORS: notification title */ + title = _("Additional MIME Types Required"); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES: + /* TRANSLATORS: this is a notification displayed when an app needs additional fonts. */ + body = g_strdup_printf (_("%s is requesting additional fonts."), app_name); + /* TRANSLATORS: notification title */ + title = _("Additional Fonts Required"); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES: + /* TRANSLATORS: this is a notification displayed when an app needs additional codecs. */ + body = g_strdup_printf (_("%s is requesting additional multimedia codecs."), app_name); + /* TRANSLATORS: notification title */ + title = _("Additional Multimedia Codecs Required"); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS: + /* TRANSLATORS: this is a notification displayed when an app needs additional printer drivers. */ + body = g_strdup_printf (_("%s is requesting additional printer drivers."), app_name); + /* TRANSLATORS: notification title */ + title = _("Additional Printer Drivers Required"); + break; + default: + /* TRANSLATORS: this is a notification displayed when an app wants to install additional packages. */ + body = g_strdup_printf (_("%s is requesting additional packages."), app_name); + /* TRANSLATORS: notification title */ + title = _("Additional Packages Required"); + break; + } + + mode_string = gs_extras_page_mode_to_string (mode); + + /* Make sure non-NULL values are used */ + if (desktop_id == NULL) + desktop_id = ""; + if (ident == NULL) + ident = ""; + + n = g_notification_new (title); + g_notification_set_body (n, body); + /* TRANSLATORS: this is a button that launches gnome-software */ + g_notification_add_button_with_target (n, _("Find in Software"), "app.install-resources", "(s^assss)", mode_string, resources, "", desktop_id, ident); + g_notification_set_default_action_and_target (n, "app.install-resources", "(s^assss)", mode_string, resources, "", desktop_id, ident); + gs_application_send_notification (GS_APPLICATION (g_application_get_default ()), "install-resources", n, 60); +} + +typedef struct _InstallResourcesData { + void (* done_func) (GsPackageKitModify2 *object, GDBusMethodInvocation *invocation); + GsPackageKitModify2 *object; + GDBusMethodInvocation *invocation; + gchar *ident; + gulong install_resources_done_id; +} InstallResourcesData; + +static void +install_resources_data_free (gpointer data, + GClosure *closure) +{ + InstallResourcesData *ird = data; + + if (ird) { + g_clear_object (&ird->object); + g_clear_object (&ird->invocation); + g_free (ird->ident); + g_slice_free (InstallResourcesData, ird); + } +} + +static void +install_resources_done_cb (GApplication *app, + const gchar *ident, + const GError *op_error, + gpointer user_data) +{ + InstallResourcesData *ird = user_data; + + g_return_if_fail (ird != NULL); + + if (!ident || g_strcmp0 (ird->ident, ident) == 0) { + if (op_error) + g_dbus_method_invocation_return_gerror (ird->invocation, op_error); + else + ird->done_func (ird->object, ird->invocation); + + g_signal_handler_disconnect (app, ird->install_resources_done_id); + } +} + +static void +install_resources (GsExtrasPageMode mode, + gchar **resources, + const gchar *interaction, + const gchar *desktop_id, + GVariant *platform_data, + void (* done_func) (GsPackageKitModify2 *object, GDBusMethodInvocation *invocation), + GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation) +{ + GApplication *app; + const gchar *mode_string; + const gchar *startup_id = NULL; + gchar *ident = NULL; + + app = g_application_get_default (); + + if (done_func) { + InstallResourcesData *ird; + + ident = g_strdup_printf ("%p", invocation); + + ird = g_slice_new (InstallResourcesData); + ird->done_func = done_func; + ird->object = g_object_ref (object); + ird->invocation = g_object_ref (invocation); + ird->ident = ident; /* takes ownership */ + ird->install_resources_done_id = g_signal_connect_data (app, "install-resources-done", + G_CALLBACK (install_resources_done_cb), ird, + install_resources_data_free, 0); + } + + if (is_show_confirm_search_set (interaction)) { + notify_search_resources (mode, desktop_id, resources, ident); + return; + } + + if (platform_data != NULL) { + g_variant_lookup (platform_data, "desktop-startup-id", + "&s", &startup_id); + } + + /* Make sure non-NULL values are used */ + if (desktop_id == NULL) + desktop_id = ""; + if (startup_id == NULL) + startup_id = ""; + + mode_string = gs_extras_page_mode_to_string (mode); + g_action_group_activate_action (G_ACTION_GROUP (app), "install-resources", + g_variant_new ("(s^assss)", mode_string, resources, startup_id, desktop_id, ident ? ident : "")); +} + +static gboolean +handle_modify_install_package_files (GsPackageKitModify *object, + GDBusMethodInvocation *invocation, + guint arg_xid, + gchar **arg_files, + const gchar *arg_interaction, + gpointer user_data) +{ + g_debug ("****** Modify.InstallPackageFiles"); + + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES, NULL, arg_files, NULL); + gs_package_kit_modify_complete_install_package_files (object, invocation); + + return TRUE; +} + +static gboolean +handle_modify_install_provide_files (GsPackageKitModify *object, + GDBusMethodInvocation *invocation, + guint arg_xid, + gchar **arg_files, + const gchar *arg_interaction, + gpointer user_data) +{ + g_debug ("****** Modify.InstallProvideFiles"); + + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES, NULL, arg_files, NULL); + gs_package_kit_modify_complete_install_provide_files (object, invocation); + + return TRUE; +} + +static gboolean +handle_modify_install_package_names (GsPackageKitModify *object, + GDBusMethodInvocation *invocation, + guint arg_xid, + gchar **arg_package_names, + const gchar *arg_interaction, + gpointer user_data) +{ + g_debug ("****** Modify.InstallPackageNames"); + + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES, NULL, arg_package_names, NULL); + gs_package_kit_modify_complete_install_package_names (object, invocation); + + return TRUE; +} + +static gboolean +handle_modify_install_mime_types (GsPackageKitModify *object, + GDBusMethodInvocation *invocation, + guint arg_xid, + gchar **arg_mime_types, + const gchar *arg_interaction, + gpointer user_data) +{ + g_debug ("****** Modify.InstallMimeTypes"); + + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES, NULL, arg_mime_types, NULL); + gs_package_kit_modify_complete_install_mime_types (object, invocation); + + return TRUE; +} + +static gboolean +handle_modify_install_fontconfig_resources (GsPackageKitModify *object, + GDBusMethodInvocation *invocation, + guint arg_xid, + gchar **arg_resources, + const gchar *arg_interaction, + gpointer user_data) +{ + g_debug ("****** Modify.InstallFontconfigResources"); + + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES, NULL, arg_resources, NULL); + gs_package_kit_modify_complete_install_fontconfig_resources (object, invocation); + + return TRUE; +} + +static gboolean +handle_modify_install_gstreamer_resources (GsPackageKitModify *object, + GDBusMethodInvocation *invocation, + guint arg_xid, + gchar **arg_resources, + const gchar *arg_interaction, + gpointer user_data) +{ + g_debug ("****** Modify.InstallGStreamerResources"); + + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES, NULL, arg_resources, NULL); + gs_package_kit_modify_complete_install_gstreamer_resources (object, invocation); + + return TRUE; +} + +static gboolean +handle_modify_install_resources (GsPackageKitModify *object, + GDBusMethodInvocation *invocation, + guint arg_xid, + const gchar *arg_type, + gchar **arg_resources, + const gchar *arg_interaction, + gpointer user_data) +{ + gboolean ret; + + g_debug ("****** Modify.InstallResources"); + + if (g_strcmp0 (arg_type, "plasma-service") == 0) { + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES, NULL, arg_resources, NULL); + ret = TRUE; + } else { + ret = FALSE; + } + gs_package_kit_modify_complete_install_resources (object, invocation); + + return ret; +} + +static gboolean +handle_modify_install_printer_drivers (GsPackageKitModify *object, + GDBusMethodInvocation *invocation, + guint arg_xid, + gchar **arg_device_ids, + const gchar *arg_interaction, + gpointer user_data) +{ + g_debug ("****** Modify.InstallPrinterDrivers"); + + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS, NULL, arg_device_ids, NULL); + gs_package_kit_modify_complete_install_printer_drivers (object, invocation); + + return TRUE; +} + +static gboolean +handle_modify2_install_package_files (GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation, + gchar **arg_files, + const gchar *arg_interaction, + const gchar *arg_desktop_id, + GVariant *arg_platform_data, + gpointer user_data) +{ + g_debug ("****** Modify2.InstallPackageFiles"); + + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES, arg_files, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_package_files, object, invocation); + + return TRUE; +} + +static gboolean +handle_modify2_install_provide_files (GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation, + gchar **arg_files, + const gchar *arg_interaction, + const gchar *arg_desktop_id, + GVariant *arg_platform_data, + gpointer user_data) +{ + g_debug ("****** Modify2.InstallProvideFiles"); + + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES, arg_files, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_provide_files, object, invocation); + + return TRUE; +} + +static gboolean +handle_modify2_install_package_names (GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation, + gchar **arg_package_names, + const gchar *arg_interaction, + const gchar *arg_desktop_id, + GVariant *arg_platform_data, + gpointer user_data) +{ + g_debug ("****** Modify2.InstallPackageNames"); + + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES, arg_package_names, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_package_names, object, invocation); + + return TRUE; +} + +static gboolean +handle_modify2_install_mime_types (GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation, + gchar **arg_mime_types, + const gchar *arg_interaction, + const gchar *arg_desktop_id, + GVariant *arg_platform_data, + gpointer user_data) +{ + g_debug ("****** Modify2.InstallMimeTypes"); + + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES, arg_mime_types, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_mime_types, object, invocation); + + return TRUE; +} + +static gboolean +handle_modify2_install_fontconfig_resources (GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation, + gchar **arg_resources, + const gchar *arg_interaction, + const gchar *arg_desktop_id, + GVariant *arg_platform_data, + gpointer user_data) +{ + g_debug ("****** Modify2.InstallFontconfigResources"); + + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_fontconfig_resources, object, invocation); + + return TRUE; +} + +static gboolean +handle_modify2_install_gstreamer_resources (GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation, + gchar **arg_resources, + const gchar *arg_interaction, + const gchar *arg_desktop_id, + GVariant *arg_platform_data, + gpointer user_data) +{ + g_debug ("****** Modify2.InstallGStreamerResources"); + + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_gstreamer_resources, object, invocation); + + return TRUE; +} + +static gboolean +handle_modify2_install_resources (GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation, + const gchar *arg_type, + gchar **arg_resources, + const gchar *arg_interaction, + const gchar *arg_desktop_id, + GVariant *arg_platform_data, + gpointer user_data) +{ + gboolean ret; + + g_debug ("****** Modify2.InstallResources"); + + if (g_strcmp0 (arg_type, "plasma-service") == 0) { + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_resources, object, invocation); + ret = TRUE; + } else { + ret = FALSE; + gs_package_kit_modify2_complete_install_resources (object, invocation); + } + + return ret; +} + +static gboolean +handle_modify2_install_printer_drivers (GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation, + gchar **arg_device_ids, + const gchar *arg_interaction, + const gchar *arg_desktop_id, + GVariant *arg_platform_data, + gpointer user_data) +{ + g_debug ("****** Modify2.InstallPrinterDrivers"); + + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS, arg_device_ids, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_printer_drivers, object, invocation); + + return TRUE; +} + +static void +gs_dbus_helper_name_acquired_cb (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_debug ("acquired session service"); +} + +static void +gs_dbus_helper_name_lost_cb (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_warning ("lost session service"); +} + +static void +export_objects (GsDbusHelper *dbus_helper) +{ + g_autoptr(GDesktopAppInfo) app_info = NULL; + g_autoptr(GError) error = NULL; + + /* Query interface */ + dbus_helper->query_interface = G_DBUS_INTERFACE_SKELETON (gs_package_kit_query_skeleton_new ()); + + g_signal_connect (dbus_helper->query_interface, "handle-is-installed", + G_CALLBACK (handle_query_is_installed), dbus_helper); + g_signal_connect (dbus_helper->query_interface, "handle-search-file", + G_CALLBACK (handle_query_search_file), dbus_helper); + + if (!g_dbus_interface_skeleton_export (dbus_helper->query_interface, + dbus_helper->bus_connection, + "/org/freedesktop/PackageKit", + &error)) { + g_warning ("Could not export dbus interface: %s", error->message); + return; + } + + /* Modify interface */ + dbus_helper->modify_interface = G_DBUS_INTERFACE_SKELETON (gs_package_kit_modify_skeleton_new ()); + + g_signal_connect (dbus_helper->modify_interface, "handle-install-package-files", + G_CALLBACK (handle_modify_install_package_files), dbus_helper); + g_signal_connect (dbus_helper->modify_interface, "handle-install-provide-files", + G_CALLBACK (handle_modify_install_provide_files), dbus_helper); + g_signal_connect (dbus_helper->modify_interface, "handle-install-package-names", + G_CALLBACK (handle_modify_install_package_names), dbus_helper); + g_signal_connect (dbus_helper->modify_interface, "handle-install-mime-types", + G_CALLBACK (handle_modify_install_mime_types), dbus_helper); + g_signal_connect (dbus_helper->modify_interface, "handle-install-fontconfig-resources", + G_CALLBACK (handle_modify_install_fontconfig_resources), dbus_helper); + g_signal_connect (dbus_helper->modify_interface, "handle-install-gstreamer-resources", + G_CALLBACK (handle_modify_install_gstreamer_resources), dbus_helper); + g_signal_connect (dbus_helper->modify_interface, "handle-install-resources", + G_CALLBACK (handle_modify_install_resources), dbus_helper); + g_signal_connect (dbus_helper->modify_interface, "handle-install-printer-drivers", + G_CALLBACK (handle_modify_install_printer_drivers), dbus_helper); + + if (!g_dbus_interface_skeleton_export (dbus_helper->modify_interface, + dbus_helper->bus_connection, + "/org/freedesktop/PackageKit", + &error)) { + g_warning ("Could not export dbus interface: %s", error->message); + return; + } + + /* Modify2 interface */ + dbus_helper->modify2_interface = G_DBUS_INTERFACE_SKELETON (gs_package_kit_modify2_skeleton_new ()); + + g_signal_connect (dbus_helper->modify2_interface, "handle-install-package-files", + G_CALLBACK (handle_modify2_install_package_files), dbus_helper); + g_signal_connect (dbus_helper->modify2_interface, "handle-install-provide-files", + G_CALLBACK (handle_modify2_install_provide_files), dbus_helper); + g_signal_connect (dbus_helper->modify2_interface, "handle-install-package-names", + G_CALLBACK (handle_modify2_install_package_names), dbus_helper); + g_signal_connect (dbus_helper->modify2_interface, "handle-install-mime-types", + G_CALLBACK (handle_modify2_install_mime_types), dbus_helper); + g_signal_connect (dbus_helper->modify2_interface, "handle-install-fontconfig-resources", + G_CALLBACK (handle_modify2_install_fontconfig_resources), dbus_helper); + g_signal_connect (dbus_helper->modify2_interface, "handle-install-gstreamer-resources", + G_CALLBACK (handle_modify2_install_gstreamer_resources), dbus_helper); + g_signal_connect (dbus_helper->modify2_interface, "handle-install-resources", + G_CALLBACK (handle_modify2_install_resources), dbus_helper); + g_signal_connect (dbus_helper->modify2_interface, "handle-install-printer-drivers", + G_CALLBACK (handle_modify2_install_printer_drivers), dbus_helper); + + /* Look up our own localized name and export it as a property on the bus */ + app_info = g_desktop_app_info_new ("org.gnome.Software.desktop"); + if (app_info != NULL) { + const gchar *app_name = g_app_info_get_name (G_APP_INFO (app_info)); + if (app_name != NULL) + g_object_set (G_OBJECT (dbus_helper->modify2_interface), + "display-name", app_name, + NULL); + } + + if (!g_dbus_interface_skeleton_export (dbus_helper->modify2_interface, + dbus_helper->bus_connection, + "/org/freedesktop/PackageKit", + &error)) { + g_warning ("Could not export dbus interface: %s", error->message); + return; + } + + dbus_helper->dbus_own_name_id = g_bus_own_name_on_connection (dbus_helper->bus_connection, + "org.freedesktop.PackageKit", + G_BUS_NAME_OWNER_FLAGS_NONE, + gs_dbus_helper_name_acquired_cb, + gs_dbus_helper_name_lost_cb, + NULL, NULL); +} + +static void +gs_dbus_helper_init (GsDbusHelper *dbus_helper) +{ + dbus_helper->task = pk_task_new (); +} + +static void +gs_dbus_helper_constructed (GObject *object) +{ + GsDbusHelper *dbus_helper = GS_DBUS_HELPER (object); + + G_OBJECT_CLASS (gs_dbus_helper_parent_class)->constructed (object); + + /* Check all required properties have been set. */ + g_assert (dbus_helper->bus_connection != NULL); + + /* Export the objects. + * + * FIXME: This is failable and asynchronous, so should really happen + * as the result of an explicit method call on some + * gs_dbus_helper_start_async() call or similar, but that can wait until + * a future refactoring. */ + export_objects (dbus_helper); +} + +static void +gs_dbus_helper_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsDbusHelper *dbus_helper = GS_DBUS_HELPER (object); + + switch ((GsDbusHelperProperty) prop_id) { + case PROP_BUS_CONNECTION: + g_value_set_object (value, dbus_helper->bus_connection); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_dbus_helper_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsDbusHelper *dbus_helper = GS_DBUS_HELPER (object); + + switch ((GsDbusHelperProperty) prop_id) { + case PROP_BUS_CONNECTION: + /* Construct only */ + g_assert (dbus_helper->bus_connection == NULL); + dbus_helper->bus_connection = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_dbus_helper_dispose (GObject *object) +{ + GsDbusHelper *dbus_helper = GS_DBUS_HELPER (object); + + if (dbus_helper->dbus_own_name_id != 0) { + g_bus_unown_name (dbus_helper->dbus_own_name_id); + dbus_helper->dbus_own_name_id = 0; + } + + if (dbus_helper->query_interface != NULL) { + g_dbus_interface_skeleton_unexport (dbus_helper->query_interface); + g_clear_object (&dbus_helper->query_interface); + } + + if (dbus_helper->modify_interface != NULL) { + g_dbus_interface_skeleton_unexport (dbus_helper->modify_interface); + g_clear_object (&dbus_helper->modify_interface); + } + + if (dbus_helper->modify2_interface != NULL) { + g_dbus_interface_skeleton_unexport (dbus_helper->modify2_interface); + g_clear_object (&dbus_helper->modify2_interface); + } + + g_clear_object (&dbus_helper->task); + g_clear_object (&dbus_helper->bus_connection); + + G_OBJECT_CLASS (gs_dbus_helper_parent_class)->dispose (object); +} + +static void +gs_dbus_helper_class_init (GsDbusHelperClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = gs_dbus_helper_constructed; + object_class->get_property = gs_dbus_helper_get_property; + object_class->set_property = gs_dbus_helper_set_property; + object_class->dispose = gs_dbus_helper_dispose; + + /** + * GsDbusHelper:bus-connection: (not nullable) + * + * A connection to the D-Bus session bus. + * + * This must be set at construction time and will not be %NULL + * afterwards. + * + * Since: 43 + */ + obj_props[PROP_BUS_CONNECTION] = + g_param_spec_object ("bus-connection", NULL, NULL, + G_TYPE_DBUS_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +/** + * gs_dbus_helper_new: + * @bus_connection: a #GDBusConnection to export the helper methods on + * + * Create a new #GsDbusHelper and export it on @bus_connection. + * + * Returns: (transfer full): a new #GsDbusHelper + * Since: 43 + */ +GsDbusHelper * +gs_dbus_helper_new (GDBusConnection *bus_connection) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (bus_connection), NULL); + + return GS_DBUS_HELPER (g_object_new (GS_TYPE_DBUS_HELPER, + "bus-connection", bus_connection, + NULL)); +} diff --git a/src/gs-dbus-helper.h b/src/gs-dbus-helper.h new file mode 100644 index 0000000..5c07315 --- /dev/null +++ b/src/gs-dbus-helper.h @@ -0,0 +1,23 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_DBUS_HELPER (gs_dbus_helper_get_type ()) + +G_DECLARE_FINAL_TYPE (GsDbusHelper, gs_dbus_helper, GS, DBUS_HELPER, GObject) + +GsDbusHelper *gs_dbus_helper_new (GDBusConnection *bus_connection); + +G_END_DECLS diff --git a/src/gs-description-box.c b/src/gs-description-box.c new file mode 100644 index 0000000..a09b731 --- /dev/null +++ b/src/gs-description-box.c @@ -0,0 +1,540 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2020 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-desription-box + * @title: GsDescriptionBox + * @stability: Stable + * @short_description: Show description text in a way that can show more/less lines + * + * Show a description in an expandable form with "Show More" button when + * there are too many lines to be shown. The button is hidden when + * the description is short enough. The button changes to "Show Less" + * to be able to collapse it. + */ + +#include "config.h" + +#include + +#include "gs-description-box.h" + +#define MAX_COLLAPSED_LINES 4 + +/* How many lines should be hidden at least, to not "save" + less space than the button height. */ +#define MIN_HIDDEN_LINES 3 + +struct _GsDescriptionBox { + GtkWidget parent; + GtkWidget *box; + GtkLabel *label; + GtkButton *button; + gchar *text; + gboolean is_collapsed; + gboolean always_expanded; + gboolean needs_recalc; + gint last_width; + gint last_height; + guint idle_update_id; +}; + +G_DEFINE_TYPE (GsDescriptionBox, gs_description_box, GTK_TYPE_WIDGET) + +typedef enum { + PROP_ALWAYS_EXPANDED = 1, + PROP_COLLAPSED, + PROP_TEXT, +} GsDescriptionBoxProperty; + +static GParamSpec *obj_props[PROP_TEXT + 1] = { NULL, }; + +static void +gs_description_box_update_content (GsDescriptionBox *box) +{ + gint width, height; + PangoLayout *layout; + gint n_lines; + gboolean visible; + const gchar *text; + + if (!box->text || !*(box->text)) { + gtk_widget_set_visible (GTK_WIDGET (box), FALSE); + box->needs_recalc = TRUE; + return; + } + + width = gtk_widget_get_width (GTK_WIDGET (box)); + height = gtk_widget_get_height (GTK_WIDGET (box)); + + if (!box->needs_recalc && box->last_width == width && box->last_height == height) + return; + + if ((!gtk_widget_get_visible (GTK_WIDGET (box->button))) == (!box->always_expanded)) + gtk_widget_set_visible (GTK_WIDGET (box->button), !box->always_expanded); + + box->needs_recalc = width <= 1 || height <= 1; + box->last_width = width; + box->last_height = height; + + if (box->always_expanded) { + gtk_widget_set_visible (GTK_WIDGET (box->button), FALSE); + gtk_label_set_markup (box->label, box->text); + gtk_label_set_lines (box->label, -1); + gtk_label_set_ellipsize (box->label, PANGO_ELLIPSIZE_NONE); + return; + } + + text = box->is_collapsed ? _("_Show More") : _("_Show Less"); + /* FIXME: Work around a flickering issue in GTK: + * https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/3949 */ + if (g_strcmp0 (text, gtk_button_get_label (box->button)) != 0) + gtk_button_set_label (box->button, text); + + gtk_label_set_markup (box->label, box->text); + gtk_label_set_lines (box->label, -1); + gtk_label_set_ellipsize (box->label, PANGO_ELLIPSIZE_NONE); + + layout = gtk_label_get_layout (box->label); + n_lines = pango_layout_get_line_count (layout); + visible = n_lines > MAX_COLLAPSED_LINES && n_lines - MAX_COLLAPSED_LINES >= MIN_HIDDEN_LINES; + + gtk_widget_set_visible (GTK_WIDGET (box->button), visible); + + if (box->is_collapsed && visible) { + PangoLayoutLine *line; + GString *str; + GSList *opened_markup = NULL; + gint start_index, line_index, in_markup = 0; + + line = pango_layout_get_line_readonly (layout, MAX_COLLAPSED_LINES); + + line_index = line->start_index; + + /* Pango does not count markup in the text, thus calculate the position manually */ + for (start_index = 0; box->text[start_index] && line_index > 0; start_index++) { + if (box->text[start_index] == '<') { + if (box->text[start_index + 1] == '/') { + if (opened_markup == NULL) { + /* do nothing when the markup text is broken and starts with a closing element; + it might not happen when it's taken from a well-formatted Appstream data XML, + but better to stay on a safe side */ + } else { + g_autofree gchar *value = opened_markup->data; + opened_markup = g_slist_remove (opened_markup, value); + } + } else { + const gchar *end = strchr (box->text + start_index, '>'); + opened_markup = g_slist_prepend (opened_markup, g_strndup (box->text + start_index + 1, end - (box->text + start_index) - 1)); + } + in_markup++; + } else if (box->text[start_index] == '>') { + g_warn_if_fail (in_markup > 0); + in_markup--; + } else if (!in_markup) { + /* Encoded characters count as one */ + if (box->text[start_index] == '&') { + const gchar *end = strchr (box->text + start_index, ';'); + if (end) + start_index += end - box->text - start_index; + } + + line_index--; + } + } + str = g_string_sized_new (start_index); + g_string_append_len (str, box->text, start_index); + + /* Cut white spaces from the end of the string, thus it doesn't look bad when it's ellipsized. */ + while (str->len > 0 && strchr ("\r\n\t ", str->str[str->len - 1])) { + str->len--; + } + + str->str[str->len] = '\0'; + + /* Close any opened tags after cutting the text */ + for (GSList *link = opened_markup; link; link = g_slist_next (link)) { + const gchar *tag = link->data; + g_string_append_printf (str, "", tag); + } + + gtk_label_set_lines (box->label, MAX_COLLAPSED_LINES); + gtk_label_set_ellipsize (box->label, PANGO_ELLIPSIZE_END); + gtk_label_set_markup (box->label, str->str); + + g_slist_free_full (opened_markup, g_free); + g_string_free (str, TRUE); + } +} + +static void +gs_description_box_read_button_clicked_cb (GtkButton *button, + gpointer user_data) +{ + GsDescriptionBox *box = user_data; + + g_return_if_fail (GS_IS_DESCRIPTION_BOX (box)); + + box->is_collapsed = !box->is_collapsed; + box->needs_recalc = TRUE; + + gs_description_box_update_content (box); +} + +static gboolean +update_description_in_idle_cb (gpointer data) +{ + GsDescriptionBox *box = GS_DESCRIPTION_BOX (data); + + gs_description_box_update_content (box); + box->idle_update_id = 0; + + return G_SOURCE_REMOVE; +} + +static void +gs_description_box_measure (GtkWidget *widget, + GtkOrientation orientation, + gint for_size, + gint *minimum, + gint *natural, + gint *minimum_baseline, + gint *natural_baseline) +{ + GsDescriptionBox *box = GS_DESCRIPTION_BOX (widget); + + gtk_widget_measure (box->box, orientation, + for_size, + minimum, natural, + minimum_baseline, + natural_baseline); + + if (!box->idle_update_id) + box->idle_update_id = g_idle_add (update_description_in_idle_cb, box); +} + +static void +gs_description_box_size_allocate (GtkWidget *widget, + int width, + int height, + int baseline) +{ + GsDescriptionBox *box = GS_DESCRIPTION_BOX (widget); + GtkAllocation allocation; + + allocation.x = 0; + allocation.y = 0; + allocation.width = width; + allocation.height = height; + + gtk_widget_size_allocate (box->box, &allocation, baseline); + + if (!box->idle_update_id) + box->idle_update_id = g_idle_add (update_description_in_idle_cb, box); +} + +static GtkSizeRequestMode +gs_description_box_get_request_mode (GtkWidget *widget) +{ + return gtk_widget_get_request_mode (GS_DESCRIPTION_BOX (widget)->box); +} + +static void +gs_description_box_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsDescriptionBox *self = GS_DESCRIPTION_BOX (object); + + switch ((GsDescriptionBoxProperty) prop_id) { + case PROP_ALWAYS_EXPANDED: + g_value_set_boolean (value, gs_description_box_get_always_expanded (self)); + break; + case PROP_COLLAPSED: + g_value_set_boolean (value, gs_description_box_get_collapsed (self)); + break; + case PROP_TEXT: + g_value_set_string (value, gs_description_box_get_text (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_description_box_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsDescriptionBox *self = GS_DESCRIPTION_BOX (object); + + switch ((GsDescriptionBoxProperty) prop_id) { + case PROP_ALWAYS_EXPANDED: + gs_description_box_set_always_expanded (self, g_value_get_boolean (value)); + break; + case PROP_COLLAPSED: + gs_description_box_set_collapsed (self, g_value_get_boolean (value)); + break; + case PROP_TEXT: + gs_description_box_set_text (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_description_box_dispose (GObject *object) +{ + GsDescriptionBox *box = GS_DESCRIPTION_BOX (object); + + g_clear_handle_id (&box->idle_update_id, g_source_remove); + g_clear_pointer (&box->box, gtk_widget_unparent); + + G_OBJECT_CLASS (gs_description_box_parent_class)->dispose (object); +} + +static void +gs_description_box_finalize (GObject *object) +{ + GsDescriptionBox *box = GS_DESCRIPTION_BOX (object); + + g_clear_pointer (&box->text, g_free); + + G_OBJECT_CLASS (gs_description_box_parent_class)->finalize (object); +} + +static void +gs_description_box_init (GsDescriptionBox *box) +{ + GtkWidget *widget; + + box->is_collapsed = TRUE; + box->always_expanded = FALSE; + + box->box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 24); + gtk_widget_set_parent (GTK_WIDGET (box->box), GTK_WIDGET (box)); + + gtk_widget_add_css_class (GTK_WIDGET (box), "application-details-description"); + + widget = gtk_label_new (""); + g_object_set (G_OBJECT (widget), + "hexpand", TRUE, + "halign", GTK_ALIGN_FILL, + "vexpand", FALSE, + "valign", GTK_ALIGN_START, + "visible", TRUE, + "max-width-chars", 40, + "selectable", TRUE, + "wrap", TRUE, + "xalign", 0.0, + NULL); + + gtk_box_append (GTK_BOX (box->box), widget); + + gtk_widget_add_css_class (GTK_WIDGET (box), "label"); + + box->label = GTK_LABEL (widget); + + widget = gtk_button_new_with_mnemonic (_("_Show More")); + + g_object_set (G_OBJECT (widget), + "hexpand", FALSE, + "halign", GTK_ALIGN_CENTER, + "vexpand", FALSE, + "valign", GTK_ALIGN_CENTER, + "visible", TRUE, + NULL); + + gtk_box_append (GTK_BOX (box->box), widget); + + gtk_widget_add_css_class (widget, "button"); + gtk_widget_add_css_class (widget, "circular"); + + box->button = GTK_BUTTON (widget); + + g_signal_connect (box->button, "clicked", + G_CALLBACK (gs_description_box_read_button_clicked_cb), box); +} + +static void +gs_description_box_class_init (GsDescriptionBoxClass *klass) +{ + GObjectClass *object_class; + GtkWidgetClass *widget_class; + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = gs_description_box_get_property; + object_class->set_property = gs_description_box_set_property; + object_class->dispose = gs_description_box_dispose; + object_class->finalize = gs_description_box_finalize; + + widget_class = GTK_WIDGET_CLASS (klass); + widget_class->get_request_mode = gs_description_box_get_request_mode; + widget_class->measure = gs_description_box_measure; + widget_class->size_allocate = gs_description_box_size_allocate; + + /** + * GsDescriptionBox:always-expanded: + * + * If always expanded, the ‘Show More’ button will be hidden, and the box’s + * content will not be truncated. It will all always be shown. + * + * This property is useful to allow a single widget tree using #GsDescriptionBox + * to be used in situations where sometimes its expanding/truncating behaviour + * isn’t needed. + * + * The text is not shown as always expanded by default. + * + * Since: 44 + */ + obj_props[PROP_ALWAYS_EXPANDED] = + g_param_spec_boolean ("always-expanded", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsDescriptionBox:collapsed: + * + * Whether the text is currently collapsed. When being collapsed, + * and the text is long enough, there's a "Show More" button shown. + * + * The text is collapsed by default. + * + * Since: 44 + */ + obj_props[PROP_COLLAPSED] = + g_param_spec_boolean ("collapsed", NULL, NULL, + TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsDescriptionBox:text: + * + * Text shown in the description box. It's interpreted + * as a markup, not as a plain text. + * + * Since: 44 + */ + obj_props[PROP_TEXT] = + g_param_spec_string ("text", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +GtkWidget * +gs_description_box_new (void) +{ + return g_object_new (GS_TYPE_DESCRIPTION_BOX, NULL); +} + +const gchar * +gs_description_box_get_text (GsDescriptionBox *box) +{ + g_return_val_if_fail (GS_IS_DESCRIPTION_BOX (box), NULL); + + return box->text; +} + +void +gs_description_box_set_text (GsDescriptionBox *box, + const gchar *text) +{ + g_return_if_fail (GS_IS_DESCRIPTION_BOX (box)); + + if (g_strcmp0 (text, box->text) != 0) { + g_free (box->text); + box->text = g_strdup (text); + box->needs_recalc = TRUE; + + gtk_widget_set_visible (GTK_WIDGET (box), text && *text); + + /* Set the text and everything immediately, to avoid screen flickering + when no button will be shown anyway */ + if (box->always_expanded) + gs_description_box_update_content (box); + + gtk_widget_queue_resize (GTK_WIDGET (box)); + + g_object_notify_by_pspec (G_OBJECT (box), obj_props[PROP_TEXT]); + } +} + +gboolean +gs_description_box_get_collapsed (GsDescriptionBox *box) +{ + g_return_val_if_fail (GS_IS_DESCRIPTION_BOX (box), FALSE); + + return box->is_collapsed; +} + +void +gs_description_box_set_collapsed (GsDescriptionBox *box, + gboolean collapsed) +{ + g_return_if_fail (GS_IS_DESCRIPTION_BOX (box)); + + if ((!collapsed) != (!box->is_collapsed)) { + box->is_collapsed = collapsed; + box->needs_recalc = TRUE; + + gtk_widget_queue_resize (GTK_WIDGET (box)); + + g_object_notify_by_pspec (G_OBJECT (box), obj_props[PROP_COLLAPSED]); + } +} + +gboolean +gs_description_box_get_always_expanded (GsDescriptionBox *box) +{ + g_return_val_if_fail (GS_IS_DESCRIPTION_BOX (box), FALSE); + + return box->always_expanded; +} + +/** + * gs_description_box_set_always_expanded: + * @box: a #GsDescriptionBox + * @always_expanded: %TRUE to always expand the box, %FALSE otherwise + * + * Set whether to always expand the box. + * + * If always expanded, the ‘Show More’ button will be hidden, and the box’s + * content will not be truncated. It will all always be shown. + * + * This property is useful to allow a single widget tree using #GsDescriptionBox + * to be used in situations where sometimes its expanding/truncating behaviour + * isn’t needed. + * + * Since: 44 + */ +void +gs_description_box_set_always_expanded (GsDescriptionBox *box, + gboolean always_expanded) +{ + g_return_if_fail (GS_IS_DESCRIPTION_BOX (box)); + + if ((!always_expanded) != (!box->always_expanded)) { + box->always_expanded = always_expanded; + box->needs_recalc = TRUE; + + /* Hide the button immediately, because the rest is loaded on resize, + which shows it in the GUI otherwise */ + if (box->always_expanded) + gtk_widget_set_visible (GTK_WIDGET (box->button), FALSE); + + gtk_widget_queue_resize (GTK_WIDGET (box)); + g_object_notify_by_pspec (G_OBJECT (box), obj_props[PROP_ALWAYS_EXPANDED]); + } +} diff --git a/src/gs-description-box.h b/src/gs-description-box.h new file mode 100644 index 0000000..37ba2e0 --- /dev/null +++ b/src/gs-description-box.h @@ -0,0 +1,34 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2020 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define GS_TYPE_DESCRIPTION_BOX (gs_description_box_get_type ()) + +G_DECLARE_FINAL_TYPE (GsDescriptionBox, gs_description_box, GS, DESCRIPTION_BOX, GtkWidget) + +GtkWidget *gs_description_box_new (void); +const gchar *gs_description_box_get_text (GsDescriptionBox *box); +void gs_description_box_set_text (GsDescriptionBox *box, + const gchar *text); +gboolean gs_description_box_get_collapsed + (GsDescriptionBox *box); +void gs_description_box_set_collapsed + (GsDescriptionBox *box, + gboolean collapsed); +gboolean gs_description_box_get_always_expanded + (GsDescriptionBox *box); +void gs_description_box_set_always_expanded + (GsDescriptionBox *box, + gboolean always_expanded); + +G_END_DECLS diff --git a/src/gs-details-page.c b/src/gs-details-page.c new file mode 100644 index 0000000..a77d653 --- /dev/null +++ b/src/gs-details-page.c @@ -0,0 +1,3210 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2019 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include + +#include "lib/gs-appstream.h" + +#include "gs-common.h" +#include "gs-utils.h" + +#include "gs-details-page.h" +#include "gs-app-addon-row.h" +#include "gs-app-context-bar.h" +#include "gs-app-reviews-dialog.h" +#include "gs-app-translation-dialog.h" +#include "gs-app-version-history-row.h" +#include "gs-app-version-history-dialog.h" +#include "gs-description-box.h" +#include "gs-license-tile.h" +#include "gs-origin-popover-row.h" +#include "gs-progress-button.h" +#include "gs-screenshot-carousel.h" +#include "gs-star-widget.h" +#include "gs-summary-tile.h" +#include "gs-review-histogram.h" +#include "gs-review-dialog.h" +#include "gs-review-row.h" + +#ifdef ENABLE_DKMS +#include "gs-dkms-private.h" +#include "gs-dkms-dialog.h" +#endif + +/* the number of reviews to show before clicking the 'More Reviews' button */ +#define SHOW_NR_REVIEWS_INITIAL 4 + +/* How many other developer apps can be shown; should be divisible by 3 and 2, + to catch full width and smaller width without bottom gap */ +#define N_DEVELOPER_APPS 18 + +#define GS_DETAILS_PAGE_REFINE_FLAGS GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CONTENT_RATING | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROJECT_GROUP | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE_DATA | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL | \ + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION + +static void gs_details_page_refresh_addons (GsDetailsPage *self); +static void gs_details_page_refresh_all (GsDetailsPage *self); +static void gs_details_page_refresh_progress (GsDetailsPage *self); +static void gs_details_page_refresh_buttons (GsDetailsPage *self); +static void gs_details_page_app_refine_cb (GObject *source, GAsyncResult *res, gpointer user_data); + +typedef enum { + GS_DETAILS_PAGE_STATE_LOADING, + GS_DETAILS_PAGE_STATE_READY, + GS_DETAILS_PAGE_STATE_FAILED +} GsDetailsPageState; + +struct _GsDetailsPage +{ + GsPage parent_instance; + + GsPluginLoader *plugin_loader; + GCancellable *cancellable; + GCancellable *app_cancellable; + GsApp *app; + GsApp *app_local_file; + GsShell *shell; + gboolean show_all_reviews; + GSettings *settings; + GsOdrsProvider *odrs_provider; /* (nullable) (owned), NULL if reviews are disabled */ + GAppInfoMonitor *app_info_monitor; /* (owned) */ + gchar **packaging_format_preference; /* (owned) */ + GtkWidget *app_reviews_dialog; + GtkWidget *review_dialog; + GtkCssProvider *origin_css_provider; /* (nullable) (owned) */ + GtkCssProvider *developer_verified_image_css_provider; /* (nullable) (owned) */ + GtkCssProvider *developer_verified_label_css_provider; /* (nullable) (owned) */ + gboolean origin_by_packaging_format; /* when TRUE, change the 'app' to the most preferred + packaging format when the alternatives are found */ + gboolean is_narrow; + gboolean title_visible; + + guint job_manager_watch_id; + + GtkWidget *application_details_icon; + GtkWidget *application_details_summary; + GtkWidget *application_details_title; + GtkWidget *box_addons; + GtkWidget *box_details; + GtkWidget *box_details_description; + GtkWidget *box_details_header; + GtkWidget *box_details_header_not_icon; + GtkWidget *label_webapp_warning; + GtkWidget *star; + GtkWidget *label_review_count; + GtkWidget *screenshot_carousel; + GtkWidget *button_details_launch; + GtkStack *links_stack; + GtkWidget *label_no_metadata_info; + AdwActionRow *project_website_row; + AdwActionRow *donate_row; + AdwActionRow *translate_row; + AdwActionRow *report_an_issue_row; + AdwActionRow *help_row; + AdwActionRow *contact_row; + GtkWidget *button_install; + GtkWidget *button_update; + GtkWidget *button_remove; + GsProgressButton *button_cancel; + GtkWidget *infobar_details_eol; + GtkWidget *label_eol; + GtkWidget *infobar_details_problems_label; + GtkWidget *infobar_details_app_norepo; + GtkWidget *infobar_details_app_repo; + GtkWidget *infobar_details_package_baseos; + GtkWidget *label_package_baseos; + GtkWidget *infobar_details_repo; + GtkWidget *infobar_app_data; + GtkWidget *infobar_app_data_label; + GtkWidget *label_progress_percentage; + GtkWidget *label_progress_status; + GsAppContextBar *context_bar; + GtkLabel *developer_name_label; + GtkWidget *developer_verified_image; + GtkWidget *developer_verified_label; + AdwStatusPage *page_failed; + GtkWidget *list_box_addons; + GtkWidget *list_box_featured_review; + GtkWidget *list_box_reviews_summary; + GtkWidget *list_box_version_history; + GtkWidget *row_latest_version; + GtkWidget *version_history_button_row; + GtkWidget *box_reviews; + GtkWidget *box_reviews_internal; + GtkWidget *histogram; + GtkWidget *histogram_row; + GtkWidget *write_review_button_row; + GtkWidget *scrolledwindow_details; + GtkWidget *stack_details; + GtkWidget *box_with_source; + GtkWidget *origin_popover; + GtkWidget *origin_popover_list_box; + GtkWidget *origin_box; + GtkWidget *origin_packaging_image; + GtkWidget *origin_packaging_label; + GtkWidget *box_license; + GsLicenseTile *license_tile; + AdwBanner *translation_banner; + GtkWidget *developer_apps_heading; + GtkWidget *box_developer_apps; + gchar *last_developer_name; +}; + +G_DEFINE_TYPE (GsDetailsPage, gs_details_page, GS_TYPE_PAGE) + +enum { + SIGNAL_METAINFO_LOADED, + SIGNAL_APP_CLICKED, + SIGNAL_LAST +}; + +typedef enum { + PROP_ODRS_PROVIDER = 1, + PROP_IS_NARROW, + /* Override properties: */ + PROP_TITLE, +} GsDetailsPageProperty; + +static GParamSpec *obj_props[PROP_IS_NARROW + 1] = { NULL, }; +static guint signals[SIGNAL_LAST] = { 0 }; + +static void +gs_details_page_cancel_cb (GCancellable *cancellable, + GsDetailsPage *self) +{ + if (self->app_reviews_dialog) + adw_dialog_force_close (ADW_DIALOG (self->app_reviews_dialog)); + if (self->review_dialog) + adw_dialog_force_close (ADW_DIALOG (self->review_dialog)); +} + +static GsDetailsPageState +gs_details_page_get_state (GsDetailsPage *self) +{ + const gchar *visible_child_name = gtk_stack_get_visible_child_name (GTK_STACK (self->stack_details)); + + if (g_str_equal (visible_child_name, "spinner")) + return GS_DETAILS_PAGE_STATE_LOADING; + else if (g_str_equal (visible_child_name, "ready")) + return GS_DETAILS_PAGE_STATE_READY; + else if (g_str_equal (visible_child_name, "failed")) + return GS_DETAILS_PAGE_STATE_FAILED; + else + g_assert_not_reached (); +} + +static void +gs_details_page_set_state (GsDetailsPage *self, + GsDetailsPageState state) +{ + if (state == gs_details_page_get_state (self)) + return; + + /* stack */ + switch (state) { + case GS_DETAILS_PAGE_STATE_LOADING: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_details), "spinner"); + break; + case GS_DETAILS_PAGE_STATE_READY: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_details), "ready"); + break; + case GS_DETAILS_PAGE_STATE_FAILED: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_details), "failed"); + break; + default: + g_assert_not_reached (); + } + + /* the page title will have changed */ + g_object_notify (G_OBJECT (self), "title"); +} + +static gboolean +gs_details_page_app_has_pending_action (GsDetailsPage *self) +{ + GsJobManager *job_manager = gs_plugin_loader_get_job_manager (self->plugin_loader); + g_autoptr(GPtrArray) pending_jobs_for_app = NULL; /* (element-type GsPluginJob) */ + GsAppState app_state = gs_app_get_state (self->app); + + /* sanitize the pending state change by verifying we're in one of the + * expected states */ + if (app_state != GS_APP_STATE_AVAILABLE && + app_state != GS_APP_STATE_UPDATABLE_LIVE && + app_state != GS_APP_STATE_UPDATABLE && + app_state != GS_APP_STATE_QUEUED_FOR_INSTALL) + return FALSE; + + pending_jobs_for_app = gs_job_manager_get_pending_jobs_for_app (job_manager, self->app); + + return (gs_app_get_pending_action (self->app) != GS_PLUGIN_ACTION_UNKNOWN) || + (gs_app_get_state (self->app) == GS_APP_STATE_QUEUED_FOR_INSTALL) || + pending_jobs_for_app->len > 0; +} + +static void +gs_details_page_update_origin_button (GsDetailsPage *self, + gboolean sensitive) +{ + const gchar *packaging_icon; + const gchar *packaging_base_css_color; + g_autofree gchar *css = NULL; + g_autofree gchar *origin_ui = NULL; + + if (self->app == NULL || + gs_shell_get_mode (self->shell) != GS_SHELL_MODE_DETAILS) { + gtk_widget_set_visible (self->origin_box, FALSE); + return; + } + + origin_ui = gs_app_dup_origin_ui (self->app, FALSE); + gtk_label_set_text (GTK_LABEL (self->origin_packaging_label), origin_ui != NULL ? origin_ui : ""); + + gtk_widget_set_sensitive (self->origin_box, sensitive); + gtk_widget_set_visible (self->origin_box, TRUE); + + packaging_icon = gs_app_get_metadata_item (self->app, "GnomeSoftware::PackagingIcon"); + if (packaging_icon == NULL) + packaging_icon = "package-generic-symbolic"; + + packaging_base_css_color = gs_app_get_metadata_item (self->app, "GnomeSoftware::PackagingBaseCssColor"); + + gtk_image_set_from_icon_name (GTK_IMAGE (self->origin_packaging_image), packaging_icon); + + if (packaging_base_css_color != NULL) + css = g_strdup_printf ("color: @%s;\n", packaging_base_css_color); + + gs_utils_widget_set_css (self->origin_packaging_image, &self->origin_css_provider, css); + gs_utils_widget_set_css (self->developer_verified_image, &self->developer_verified_image_css_provider, css); + gs_utils_widget_set_css (self->developer_verified_label, &self->developer_verified_label_css_provider, css); +} + +static void +gs_details_page_switch_to (GsPage *page) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (page); + GtkAdjustment *adj; + + if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_DETAILS) { + g_warning ("Called switch_to(details) when in mode %s", + gs_shell_get_mode_string (self->shell)); + return; + } + + /* Always refresh other developer apps */ + g_clear_pointer (&self->last_developer_name, g_free); + + /* hide the alternates for now until the query is complete */ + gtk_widget_set_visible (self->origin_box, FALSE); + + /* not set, perhaps file-to-app */ + if (self->app == NULL) + return; + + adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_details)); + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj)); + + gs_grab_focus_when_mapped (self->scrolledwindow_details); +} + +static void +gs_details_page_refresh_progress (GsDetailsPage *self) +{ + GsJobManager *job_manager = gs_plugin_loader_get_job_manager (self->plugin_loader); + guint percentage; + GsAppState state; + + /* cancel button */ + state = gs_app_get_state (self->app); + switch (state) { + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_visible (GTK_WIDGET (self->button_cancel), TRUE); + /* If the app is installing, the user can only cancel it if + * 1) They haven't already, and + * 2) the plugin hasn't said that they can't, for example if a + * package manager has already gone 'too far' + */ + gtk_widget_set_sensitive (GTK_WIDGET (self->button_cancel), + !g_cancellable_is_cancelled (self->app_cancellable) && + gs_app_get_allow_cancel (self->app)); + break; + default: + gtk_widget_set_visible (GTK_WIDGET (self->button_cancel), FALSE); + break; + } + if (gs_details_page_app_has_pending_action (self)) { + gtk_widget_set_visible (GTK_WIDGET (self->button_cancel), TRUE); + gtk_widget_set_sensitive (GTK_WIDGET (self->button_cancel), + !g_cancellable_is_cancelled (self->app_cancellable) && + gs_app_get_allow_cancel (self->app)); + } + + /* progress status label */ + switch (state) { + case GS_APP_STATE_REMOVING: + gtk_widget_set_visible (self->label_progress_status, TRUE); + gtk_label_set_label (GTK_LABEL (self->label_progress_status), + _("Removing…")); + break; + case GS_APP_STATE_INSTALLING: + gtk_widget_set_visible (self->label_progress_status, TRUE); + gtk_label_set_label (GTK_LABEL (self->label_progress_status), + _("Installing")); + break; + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_visible (self->label_progress_status, TRUE); + gtk_label_set_label (GTK_LABEL (self->label_progress_status), + _("Downloading")); + break; + case GS_APP_STATE_PENDING_INSTALL: + gtk_widget_set_visible (self->label_progress_status, TRUE); + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT)) + gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Requires restart to finish install")); + else + gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Pending install")); + break; + case GS_APP_STATE_PENDING_REMOVE: + gtk_widget_set_visible (self->label_progress_status, TRUE); + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT)) + gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Requires restart to finish remove")); + else + gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Pending remove")); + break; + + default: + gtk_widget_set_visible (self->label_progress_status, FALSE); + break; + } + if (gs_details_page_app_has_pending_action (self)) { + gtk_widget_set_visible (self->label_progress_status, TRUE); + + if (gs_job_manager_app_has_pending_job_type (job_manager, self->app, GS_TYPE_PLUGIN_JOB_INSTALL_APPS)) { + gtk_label_set_label (GTK_LABEL (self->label_progress_status), + /* TRANSLATORS: This is a label on top of the app's progress + * bar to inform the user that the app should be installed soon */ + _("Pending installation…")); + } else if (gs_job_manager_app_has_pending_job_type (job_manager, self->app, GS_TYPE_PLUGIN_JOB_UPDATE_APPS) || + gs_job_manager_app_has_pending_job_type (job_manager, self->app, GS_TYPE_PLUGIN_JOB_DOWNLOAD_UPGRADE)) { + gtk_label_set_label (GTK_LABEL (self->label_progress_status), + /* TRANSLATORS: This is a label on top of the app's progress + * bar to inform the user that the app should be updated soon */ + _("Pending update…")); + } else { + gtk_widget_set_visible (self->label_progress_status, FALSE); + } + } + + /* percentage bar */ + switch (state) { + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_DOWNLOADING: + percentage = gs_app_get_progress (self->app); + if (percentage == GS_APP_PROGRESS_UNKNOWN) { + if (state == GS_APP_STATE_DOWNLOADING) { + /* Translators: This string is shown when downloading an app before install. */ + gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Downloading…")); + } else if (state == GS_APP_STATE_INSTALLING) { + /* Translators: This string is shown when preparing to download and install an app. */ + gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Preparing…")); + } else { + /* Translators: This string is shown when uninstalling an app. */ + gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Uninstalling…")); + } + + gtk_widget_set_visible (self->label_progress_status, TRUE); + gtk_widget_set_visible (self->label_progress_percentage, FALSE); + gs_progress_button_set_progress (self->button_cancel, percentage); + gs_progress_button_set_show_progress (self->button_cancel, TRUE); + break; + } else if (percentage <= 100) { + g_autofree gchar *str = g_strdup_printf ("%u%%", percentage); + gtk_label_set_label (GTK_LABEL (self->label_progress_percentage), str); + gtk_widget_set_visible (self->label_progress_percentage, TRUE); + gs_progress_button_set_progress (self->button_cancel, percentage); + gs_progress_button_set_show_progress (self->button_cancel, TRUE); + break; + } + /* FALLTHROUGH */ + default: + gtk_widget_set_visible (self->label_progress_percentage, FALSE); + gs_progress_button_set_show_progress (self->button_cancel, FALSE); + gs_progress_button_set_progress (self->button_cancel, 0); + break; + } + if (gs_details_page_app_has_pending_action (self)) { + gs_progress_button_set_progress (self->button_cancel, 0); + gs_progress_button_set_show_progress (self->button_cancel, TRUE); + } +} + +static gboolean +gs_details_page_refresh_progress_idle (gpointer user_data) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + gs_details_page_refresh_progress (self); + g_object_unref (self); + return G_SOURCE_REMOVE; +} + +static void +gs_details_page_progress_changed_cb (GsApp *app, + GParamSpec *pspec, + GsDetailsPage *self) +{ + g_idle_add (gs_details_page_refresh_progress_idle, g_object_ref (self)); +} + +static gboolean +gs_details_page_allow_cancel_changed_idle (gpointer user_data) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + gtk_widget_set_sensitive (GTK_WIDGET (self->button_cancel), + gs_app_get_allow_cancel (self->app)); + g_object_unref (self); + return G_SOURCE_REMOVE; +} + +static void +gs_details_page_allow_cancel_changed_cb (GsApp *app, + GParamSpec *pspec, + GsDetailsPage *self) +{ + g_idle_add (gs_details_page_allow_cancel_changed_idle, + g_object_ref (self)); +} + +static gboolean +gs_details_page_refresh_idle (gpointer user_data) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + + if (gs_shell_get_mode (self->shell) == GS_SHELL_MODE_DETAILS) { + /* update widgets */ + gs_details_page_refresh_all (self); + } + + g_object_unref (self); + return G_SOURCE_REMOVE; +} + +static void +gs_details_page_notify_state_changed_cb (GsApp *app, + GParamSpec *pspec, + GsDetailsPage *self) +{ + g_idle_add (gs_details_page_refresh_idle, g_object_ref (self)); +} + +static void +gs_details_page_refresh_app_data_info (GsDetailsPage *self) +{ + g_autofree gchar *dir = NULL; + gboolean visible = TRUE; + AsBundleKind bundle_kind; + + if (self->app == NULL || gs_app_is_installed (self->app)) { + gtk_widget_set_visible (self->infobar_app_data, FALSE); + return; + } + + dir = gs_utils_get_app_data_dir (self->app); + if (dir == NULL) { + gtk_widget_set_visible (self->infobar_app_data, FALSE); + return; + } + + bundle_kind = gs_app_get_bundle_kind (self->app); + + /* Multiple remotes can provide the app, thus check whether + any alternative is a flatpak and is installed. */ + for (GtkWidget *child = gtk_widget_get_first_child (self->origin_popover_list_box); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + GsApp *alternative_app; + + g_assert (GS_IS_ORIGIN_POPOVER_ROW (child)); + + alternative_app = gs_origin_popover_row_get_app (GS_ORIGIN_POPOVER_ROW (child)); + if (gs_app_get_bundle_kind (alternative_app) == bundle_kind && + gs_app_is_installed (alternative_app)) { + visible = FALSE; + break; + } + } + + if (visible) { + g_autofree gchar *tmp = NULL; + /* Translators: the "%s" is replaced with an app name */ + tmp = g_strdup_printf (_("%s is not installed, but it still has data present."), gs_app_get_name (self->app)); + gtk_label_set_label (GTK_LABEL (self->infobar_app_data_label), tmp); + } + + gtk_widget_set_visible (self->infobar_app_data, visible); +} + +static void +gs_details_page_app_data_clear_button_cb (GtkWidget *widget, GsDetailsPage *self) +{ + if (gs_utils_remove_app_data_dir (self->app, self->plugin_loader)) + gs_details_page_refresh_app_data_info (self); +} + +static void +job_manager_jobs_changed_cb (GsJobManager *job_manager, + GsPluginJob *job, + gpointer user_data) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + + /* The set of pending jobs for self->app has changed, so update the UI. */ + gs_details_page_refresh_progress (self); + gs_details_page_refresh_buttons (self); +} + +static void +gs_details_page_link_row_activated_cb (AdwActionRow *row, GsDetailsPage *self) +{ + gs_shell_show_uri (self->shell, adw_action_row_get_subtitle (row)); +} + +static void +gs_details_page_license_tile_get_involved_activated_cb (GsLicenseTile *license_tile, + GsDetailsPage *self) +{ + g_autofree gchar *license_url = NULL; + const gchar *uri = NULL; + + if (gs_app_get_license_is_free (self->app)) { +#if AS_CHECK_VERSION(0, 15, 3) + uri = gs_app_get_url (self->app, AS_URL_KIND_CONTRIBUTE); +#endif + if (uri == NULL) + uri = gs_app_get_url (self->app, AS_URL_KIND_HOMEPAGE); + } else { + if (gs_app_get_license (self->app) == NULL) { + uri = "help:gnome-software/software-metadata#license"; + } else { + license_url = as_get_license_url (gs_app_get_license (self->app)); + + if (license_url != NULL && *license_url != '\0') { + uri = license_url; + } else { + /* Page to explain the differences between FOSS and proprietary + * software. This is a page on the gnome-software wiki for now, + * so that we can update the content independently of the release + * cycle. Likely, we will link to a more authoritative source + * to explain the differences. + * Ultimately, we could ship a user manual page to explain the + * differences (so that it’s available offline), but that’s too + * much work for right now. */ + uri = "help:gnome-software/software-licensing"; + } + } + } + + gs_shell_show_uri (self->shell, uri); +} + +static void +gs_details_page_translation_banner_clicked_cb (GsDetailsPage *self) +{ + AdwDialog *dialog; + + dialog = ADW_DIALOG (gs_app_translation_dialog_new (self->app)); + adw_dialog_present (dialog, GTK_WIDGET (self)); +} + +static void +gs_details_page_set_description (GsDetailsPage *self, const gchar *tmp) +{ + gs_description_box_set_text (GS_DESCRIPTION_BOX (self->box_details_description), tmp); + gs_description_box_set_collapsed (GS_DESCRIPTION_BOX (self->box_details_description), TRUE); + gtk_widget_set_visible (self->label_webapp_warning, gs_app_get_kind (self->app) == AS_COMPONENT_KIND_WEB_APP); +} + +static gboolean +app_origin_equal (GsApp *a, + GsApp *b) +{ + g_autofree gchar *a_origin_ui = NULL, *b_origin_ui = NULL; + GFile *a_local_file, *b_local_file; + + if (a == b) + return TRUE; + + a_origin_ui = gs_app_dup_origin_ui (a, TRUE); + b_origin_ui = gs_app_dup_origin_ui (b, TRUE); + + a_local_file = gs_app_get_local_file (a); + b_local_file = gs_app_get_local_file (b); + + /* Compare all the fields used in GsOriginPopoverRow. */ + if (g_strcmp0 (a_origin_ui, b_origin_ui) != 0) + return FALSE; + + if (!((a_local_file == NULL && b_local_file == NULL) || + (a_local_file != NULL && b_local_file != NULL && + g_file_equal (a_local_file, b_local_file)))) + return FALSE; + + if (g_strcmp0 (gs_app_get_origin_hostname (a), + gs_app_get_origin_hostname (b)) != 0) + return FALSE; + + if (gs_app_get_bundle_kind (a) != gs_app_get_bundle_kind (b)) + return FALSE; + + if (gs_app_get_scope (a) != gs_app_get_scope (b)) + return FALSE; + + if (g_strcmp0 (gs_app_get_branch (a), gs_app_get_branch (b)) != 0) + return FALSE; + + if (g_strcmp0 (gs_app_get_version (a), gs_app_get_version (b)) != 0) + return FALSE; + + return TRUE; +} + +static gint +gs_details_page_get_app_packaging_format_preference_index (GsDetailsPage *self, + GsApp *app) +{ + const gchar *packaging_format; + guint packaging_format_len; + + /* Index 0 means unspecified packaging format in the preference array */ + if (self->packaging_format_preference == NULL) + return 0; + + packaging_format = gs_app_get_packaging_format_raw (app); + if (packaging_format == NULL) + return 0; + + packaging_format_len = strlen (packaging_format); + + /* The preference can be defined either as the packaging format + on its own, like "rpm", or with an origin name, like "flatpak:flathub". + The packaging format can be empty too, then is prefered the origin, + like: ":system" prefers any "system" origin.*/ + for (guint i = 0; self->packaging_format_preference[i]; i++) { + const gchar *preference = self->packaging_format_preference[i]; + if (preference[0] == ':') { + const gchar *origin = gs_app_get_origin (app); + if (origin != NULL && + g_ascii_strcasecmp (origin, preference + 1) == 0) + return (gint) i + 1; + } else if (g_ascii_strncasecmp (preference, packaging_format, packaging_format_len) == 0) { + if (preference[packaging_format_len] == '\0') + return (gint) i + 1; + if (preference[packaging_format_len] == ':') { + const gchar *origin = gs_app_get_origin (app); + if (origin != NULL && + g_ascii_strcasecmp (origin, preference + packaging_format_len + 1) == 0) + return (gint) i + 1; + } + } + } + + return 0; +} + +static gint +sort_by_packaging_format_preference (GsApp *app1, + GsApp *app2, + gpointer user_data) +{ + GsDetailsPage *self = user_data; + gint index1, index2; + + index1 = gs_details_page_get_app_packaging_format_preference_index (self, app1); + index2 = gs_details_page_get_app_packaging_format_preference_index (self, app2); + + if (index1 == index2) { + gboolean app1_verified = gs_app_has_quirk (app1, GS_APP_QUIRK_DEVELOPER_VERIFIED); + gboolean app2_verified = gs_app_has_quirk (app2, GS_APP_QUIRK_DEVELOPER_VERIFIED); + g_autofree gchar *a1_origin = NULL; + g_autofree gchar *a2_origin = NULL; + + /* Prefer verified before unverified formats */ + if (app1_verified != app2_verified) + return app1_verified ? -1 : 1; + + a1_origin = gs_app_dup_origin_ui (app1, TRUE); + a2_origin = gs_app_dup_origin_ui (app2, TRUE); + + return gs_utils_sort_strcmp (a1_origin, a2_origin); + } + + /* Index 0 means unspecified packaging format in the preference array, + thus move these at the end. */ + if (index1 == 0 || index2 == 0) + return index1 == 0 ? 1 : -1; + + return index1 - index2; +} + +static void +gs_details_page_refresh_screenshots (GsDetailsPage *self) +{ + if (self->app != NULL) { + gboolean is_online = gs_plugin_loader_get_network_available (self->plugin_loader); + gboolean has_screenshots; + + gs_screenshot_carousel_load_screenshots (GS_SCREENSHOT_CAROUSEL (self->screenshot_carousel), self->app, is_online, NULL); + has_screenshots = gs_screenshot_carousel_get_has_screenshots (GS_SCREENSHOT_CAROUSEL (self->screenshot_carousel)); + gtk_widget_set_visible (self->screenshot_carousel, has_screenshots); + } else { + gtk_widget_set_visible (self->screenshot_carousel, FALSE); + } +} + +static void _set_app (GsDetailsPage *self, GsApp *app); + +static void +gs_details_page_get_alternates_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + gboolean instance_changed = FALSE; + gboolean origin_by_packaging_format = self->origin_by_packaging_format; + GtkWidget *first_row = NULL; + GtkWidget *select_row = NULL; + GtkWidget *origin_row_by_packaging_format = NULL; + gint origin_row_by_packaging_format_index = 0; + guint n_rows = 0; + + self->origin_by_packaging_format = FALSE; + gs_widget_remove_all (self->origin_popover_list_box, (GsRemoveFunc) gtk_list_box_remove); + + /* Did we switch away from the page in the meantime? */ + if (!gs_page_is_active (GS_PAGE (self))) { + gtk_widget_set_visible (self->origin_box, FALSE); + return; + } + + list = gs_plugin_loader_job_process_finish (plugin_loader, + res, + &error); + if (list == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get alternates: %s", error->message); + gtk_widget_set_visible (self->origin_box, FALSE); + return; + } + + /* deduplicate the list; duplicates can get in the list if + * get_alternates() returns the old/new version of a renamed app, which + * happens to come from the same origin; see + * https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1192 + * + * This nested loop is OK as the origin list is normally only 2 or 3 + * items long. */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *i_app = gs_app_list_index (list, i); + gboolean did_remove = FALSE; + + for (guint j = i + 1; j < gs_app_list_length (list);) { + GsApp *j_app = gs_app_list_index (list, j); + + if (app_origin_equal (i_app, j_app)) { + gs_app_list_remove (list, j_app); + did_remove = TRUE; + } else { + j++; + } + } + + /* Needed to catch cases when the same pointer is in the array multiple times, + interleaving with another pointer. The removal can skip the first occurrence + due to the g_ptr_array_remove() removing the first instance in the array, + which shifts the array content. */ + if (did_remove) + i--; + } + + /* add the local file to the list so that we can carry it over when + * switching between alternates */ + if (self->app_local_file != NULL) { + if (gs_app_get_state (self->app_local_file) != GS_APP_STATE_INSTALLED && + gs_app_get_local_file (self->app_local_file) != NULL) { + gboolean already_in_list = FALSE; + /* The app itself can be returned as an alternative too, thus check for it */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *i_app = gs_app_list_index (list, i); + if (app_origin_equal (i_app, self->app_local_file)) { + already_in_list = TRUE; + break; + } + } + if (!already_in_list) { + GtkWidget *row = gs_origin_popover_row_new (self->app_local_file); + gtk_widget_set_visible (row, TRUE); + gtk_list_box_append (GTK_LIST_BOX (self->origin_popover_list_box), row); + first_row = row; + select_row = row; + n_rows++; + } + } + + /* Do not allow change of the app by the packaging format when it's a local file */ + origin_by_packaging_format = FALSE; + } + + /* Do not allow change of the app by the packaging format when it's installed */ + origin_by_packaging_format = origin_by_packaging_format && + self->app != NULL && + gs_app_get_state (self->app) != GS_APP_STATE_INSTALLED && + gs_app_get_state (self->app) != GS_APP_STATE_UPDATABLE && + gs_app_get_state (self->app) != GS_APP_STATE_UPDATABLE_LIVE; + + /* Sort the alternates by the user's packaging preferences and by origin name */ + gs_app_list_sort (list, sort_by_packaging_format_preference, self); + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + GtkWidget *row = gs_origin_popover_row_new (app); + gtk_widget_set_visible (row, TRUE); + n_rows++; + if (first_row == NULL) + first_row = row; + if (app == self->app || ( + (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_UNKNOWN || + gs_app_get_bundle_kind (app) == gs_app_get_bundle_kind (self->app)) && + (gs_app_get_scope (app) == AS_COMPONENT_SCOPE_UNKNOWN || + gs_app_get_scope (app) == gs_app_get_scope (self->app)) && + g_strcmp0 (gs_app_get_origin (app), gs_app_get_origin (self->app)) == 0 && + g_strcmp0 (gs_app_get_branch (app), gs_app_get_branch (self->app)) == 0 && + g_strcmp0 (gs_app_get_version (app), gs_app_get_version (self->app)) == 0 && + (self->app_local_file == NULL || self->app != self->app_local_file))) { + /* This can happen on reload of the page */ + if (app != self->app) { + _set_app (self, app); + instance_changed = TRUE; + } + select_row = row; + } + gtk_list_box_append (GTK_LIST_BOX (self->origin_popover_list_box), row); + + if (origin_by_packaging_format) { + gint index = gs_details_page_get_app_packaging_format_preference_index (self, app); + if (index > 0 && (index < origin_row_by_packaging_format_index || origin_row_by_packaging_format_index == 0)) { + origin_row_by_packaging_format_index = index; + origin_row_by_packaging_format = row; + } + } + } + + if (origin_row_by_packaging_format) { + GsOriginPopoverRow *row = GS_ORIGIN_POPOVER_ROW (origin_row_by_packaging_format); + GsApp *app = gs_origin_popover_row_get_app (row); + select_row = origin_row_by_packaging_format; + if (app != self->app) { + _set_app (self, app); + instance_changed = TRUE; + } + } + + if (select_row == NULL && first_row != NULL) { + GsOriginPopoverRow *row = GS_ORIGIN_POPOVER_ROW (first_row); + GsApp *app = gs_origin_popover_row_get_app (row); + select_row = first_row; + if (app != self->app) { + _set_app (self, app); + instance_changed = TRUE; + } + } + + /* Do not show the "selected" check when there's only one app in the list */ + if (select_row && n_rows > 1) + gs_origin_popover_row_set_selected (GS_ORIGIN_POPOVER_ROW (select_row), TRUE); + else if (select_row) + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (select_row), FALSE); + + if (select_row != NULL) + gs_details_page_update_origin_button (self, TRUE); + else + gtk_widget_set_visible (self->origin_box, FALSE); + + if (instance_changed) { + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* Make sure the changed instance contains the reviews and such */ + plugin_job = gs_plugin_job_refine_new_for_app (self->app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + gs_details_page_app_refine_cb, + self); + + /* To refresh also developer apps, to not have shown the same instance + of the app in the flowbox, because it won't change the Details page + when it is clicked. */ + g_clear_pointer (&self->last_developer_name, g_free); + + gs_details_page_refresh_screenshots (self); + gs_details_page_refresh_all (self); + } else { + gs_details_page_refresh_app_data_info (self); + } +} + +static gboolean +gs_details_page_can_launch_app (GsDetailsPage *self) +{ + const gchar *desktop_id; + GDesktopAppInfo *desktop_appinfo; + g_autoptr(GAppInfo) appinfo = NULL; + + if (!self->app) + return FALSE; + + switch (gs_app_get_state (self->app)) { + case GS_APP_STATE_INSTALLED: + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_UPDATABLE_LIVE: + break; + default: + return FALSE; + } + + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NOT_LAUNCHABLE) || + gs_app_has_quirk (self->app, GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE)) + return FALSE; + + /* don't show the launch button if the app doesn't have a desktop ID */ + if (gs_app_get_id (self->app) == NULL) + return FALSE; + + desktop_id = gs_app_get_launchable (self->app, AS_LAUNCHABLE_KIND_DESKTOP_ID); + if (!desktop_id) + desktop_id = gs_app_get_id (self->app); + if (!desktop_id) + return FALSE; + + desktop_appinfo = gs_utils_get_desktop_app_info (desktop_id); + if (!desktop_appinfo) + return FALSE; + + appinfo = G_APP_INFO (desktop_appinfo); + + return g_app_info_should_show (appinfo); +} + +static void +gs_details_page_refresh_buttons (GsDetailsPage *self) +{ + GsAppState state; + GtkWidget *buttons_in_order[] = { + self->button_details_launch, + self->button_install, + self->button_update, + self->button_remove, + }; + GtkWidget *highlighted_button = NULL; + gboolean remove_is_destructive = TRUE; + gboolean is_mok_key_related = FALSE; + + state = gs_app_get_state (self->app); + + /* install button */ + switch (state) { + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_AVAILABLE_LOCAL: + gtk_widget_set_visible (self->button_install, TRUE); + /* TRANSLATORS: button text in the header when an app + * can be installed */ + gtk_button_set_label (GTK_BUTTON (self->button_install), _("_Install")); + break; + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_visible (self->button_install, FALSE); + break; + case GS_APP_STATE_UNKNOWN: + case GS_APP_STATE_INSTALLED: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_QUEUED_FOR_INSTALL: + gtk_widget_set_visible (self->button_install, FALSE); + break; + case GS_APP_STATE_PENDING_INSTALL: + case GS_APP_STATE_PENDING_REMOVE: + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT)) { + gtk_widget_set_visible (self->button_install, TRUE); + gtk_button_set_label (GTK_BUTTON (self->button_install), _("_Restart")); + #ifdef ENABLE_DKMS + if (g_strcmp0 (gs_app_get_metadata_item (self->app, "GnomeSoftware::requires-akmods-key"), "True") == 0 || + g_strcmp0 (gs_app_get_metadata_item (self->app, "GnomeSoftware::requires-dkms-key"), "True") == 0) { + is_mok_key_related = TRUE; + if (!gs_app_get_mok_key_pending (self->app)) + gtk_button_set_label (GTK_BUTTON (self->button_install), _("_Enable…")); + } + #endif + } else { + gtk_widget_set_visible (self->button_install, FALSE); + } + break; + case GS_APP_STATE_UPDATABLE_LIVE: + if (gs_app_get_kind (self->app) == AS_COMPONENT_KIND_FIRMWARE) { + gtk_widget_set_visible (self->button_install, TRUE); + /* TRANSLATORS: button text in the header when firmware + * can be live-installed */ + gtk_button_set_label (GTK_BUTTON (self->button_install), _("_Install")); + } else { + gtk_widget_set_visible (self->button_install, FALSE); + } + break; + case GS_APP_STATE_UNAVAILABLE: + if (gs_app_get_url_missing (self->app) != NULL) { + gtk_widget_set_visible (self->button_install, FALSE); + } else { + gtk_widget_set_visible (self->button_install, TRUE); + /* TRANSLATORS: this is a button that allows the apps to + * be installed. + * The ellipsis indicates that further steps are required, + * e.g. enabling software repositories or the like */ + gtk_button_set_label (GTK_BUTTON (self->button_install), _("_Install…")); + } + break; + default: + g_warning ("App unexpectedly in state %s", + gs_app_state_to_string (state)); + g_assert_not_reached (); + } + + /* update button */ + switch (state) { + case GS_APP_STATE_UPDATABLE_LIVE: + if (gs_app_get_kind (self->app) == AS_COMPONENT_KIND_FIRMWARE) { + gtk_widget_set_visible (self->button_update, FALSE); + } else { + gtk_widget_set_visible (self->button_update, TRUE); + } + break; + default: + gtk_widget_set_visible (self->button_update, FALSE); + break; + } + + /* launch button */ + gtk_widget_set_visible (self->button_details_launch, gs_details_page_can_launch_app (self)); + + /* remove button */ + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_COMPULSORY) || + gs_app_get_kind (self->app) == AS_COMPONENT_KIND_FIRMWARE) { + gtk_widget_set_visible (self->button_remove, FALSE); + } else { + switch (state) { + case GS_APP_STATE_INSTALLED: + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_UPDATABLE_LIVE: + gtk_widget_set_visible (self->button_remove, TRUE); + gtk_widget_set_sensitive (self->button_remove, TRUE); + break; + case GS_APP_STATE_PENDING_INSTALL: + gtk_widget_set_visible (self->button_remove, is_mok_key_related); + gtk_widget_set_sensitive (self->button_remove, is_mok_key_related); + break; + case GS_APP_STATE_AVAILABLE_LOCAL: + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_DOWNLOADING: + case GS_APP_STATE_UNAVAILABLE: + case GS_APP_STATE_UNKNOWN: + case GS_APP_STATE_QUEUED_FOR_INSTALL: + case GS_APP_STATE_PENDING_REMOVE: + gtk_widget_set_visible (self->button_remove, FALSE); + break; + default: + g_warning ("App unexpectedly in state %s", + gs_app_state_to_string (state)); + g_assert_not_reached (); + } + } + + if (gs_details_page_app_has_pending_action (self)) { + gtk_widget_set_visible (self->button_install, FALSE); + gtk_widget_set_visible (self->button_update, FALSE); + gtk_widget_set_visible (self->button_details_launch, FALSE); + gtk_widget_set_visible (self->button_remove, FALSE); + } + + if (!gtk_widget_get_visible (self->button_details_launch) && + !gtk_widget_get_visible (self->button_install) && + !gtk_widget_get_visible (self->button_update)) { + remove_is_destructive = FALSE; + gtk_button_set_label (GTK_BUTTON (self->button_remove), _("_Uninstall…")); + } else { + gtk_button_set_icon_name (GTK_BUTTON (self->button_remove), "user-trash-symbolic"); + } + + /* Update the styles so that the first visible button gets + * `suggested-action` or `destructive-action` and the rest are + * unstyled. This draws the user’s attention to the most likely + * action to perform. */ + for (gsize i = 0; i < G_N_ELEMENTS (buttons_in_order); i++) { + if (highlighted_button != NULL) { + gtk_widget_remove_css_class (buttons_in_order[i], "suggested-action"); + gtk_widget_remove_css_class (buttons_in_order[i], "destructive-action"); + } else if (gtk_widget_get_visible (buttons_in_order[i])) { + highlighted_button = buttons_in_order[i]; + + if (buttons_in_order[i] == self->button_remove) { + if (remove_is_destructive) + gtk_widget_add_css_class (buttons_in_order[i], "destructive-action"); + else + gtk_widget_remove_css_class (buttons_in_order[i], "destructive-action"); + } else + gtk_widget_add_css_class (buttons_in_order[i], "suggested-action"); + } + } +} + +static gboolean +update_action_row_from_link (AdwActionRow *row, + GsApp *app, + AsUrlKind url_kind) +{ + const gchar *url = gs_app_get_url (app, url_kind); + + adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (row), FALSE); + adw_action_row_set_subtitle_selectable (row, TRUE); + + if (url != NULL) + adw_action_row_set_subtitle (row, url); + + gtk_widget_set_visible (GTK_WIDGET (row), url != NULL); + + return (url != NULL); +} + +static void +app_activated_cb (GsDetailsPage *self, GsAppTile *tile) +{ + GsApp *app; + + app = gs_app_tile_get_app (tile); + + if (!app) + return; + + g_signal_emit (self, signals[SIGNAL_APP_CLICKED], 0, app); +} + +/* Consider app IDs with and without the ".desktop" suffix being the same app */ +static gboolean +gs_details_page_app_id_equal (GsApp *app1, + GsApp *app2) +{ + const gchar *id1, *id2; + + id1 = gs_app_get_id (app1); + id2 = gs_app_get_id (app2); + if (g_strcmp0 (id1, id2) == 0) + return TRUE; + + if (id1 == NULL || id2 == NULL) + return FALSE; + + if (g_str_has_suffix (id1, ".desktop")) { + return !g_str_has_suffix (id2, ".desktop") && + strlen (id1) == strlen (id2) + 8 /* strlen (".desktop") */ && + g_str_has_prefix (id1, id2); + } + + return g_str_has_suffix (id2, ".desktop") && + !g_str_has_suffix (id1, ".desktop") && + strlen (id2) == strlen (id1) + 8 /* strlen (".desktop") */ && + g_str_has_prefix (id2, id1); +} + +static void +gs_details_page_search_developer_apps_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) local_error = NULL; + guint n_added = 0; + + list = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (source_object), result, &local_error); + if (list == NULL) { + if (g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("search cancelled"); + return; + } + g_warning ("failed to get other apps: %s", local_error->message); + return; + } + + if (!self->app || !gs_page_is_active (GS_PAGE (self))) + return; + + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + if (app != self->app && !gs_details_page_app_id_equal (app, self->app)) { + GtkWidget *tile = gs_summary_tile_new (app); + gtk_flow_box_insert (GTK_FLOW_BOX (self->box_developer_apps), tile, -1); + + n_added++; + if (n_added == N_DEVELOPER_APPS) + break; + } + } + + gtk_widget_set_visible (self->box_developer_apps, n_added > 0); +} + +static void +gs_details_page_refresh_all (GsDetailsPage *self) +{ + g_autoptr(GIcon) icon = NULL; + const gchar *tmp; + g_autoptr(GPtrArray) version_history = NULL; + gboolean link_rows_visible; + + /* change widgets */ + tmp = gs_app_get_name (self->app); + if (tmp != NULL && tmp[0] != '\0') { + g_autofree gchar *title = NULL; + gtk_label_set_label (GTK_LABEL (self->application_details_title), tmp); + gtk_widget_set_visible (self->application_details_title, TRUE); + /* Translators: %s is the user-visible app name */ + title = g_strdup_printf (_("%s will appear in US English"), tmp); + adw_banner_set_title (self->translation_banner, title); + } else { + gtk_widget_set_visible (self->application_details_title, FALSE); + } + tmp = gs_app_get_summary (self->app); + if (tmp != NULL && tmp[0] != '\0') { + if (gs_app_is_application (self->app)) + adw_banner_set_title (self->translation_banner, _("This app will appear in US English")); + else + adw_banner_set_title (self->translation_banner, _("This software will appear in US English")); + gtk_label_set_label (GTK_LABEL (self->application_details_summary), tmp); + gtk_widget_set_visible (self->application_details_summary, TRUE); + } else { + gtk_widget_set_visible (self->application_details_summary, FALSE); + } + + tmp = gs_app_get_metadata_item (self->app, "GnomeSoftware::problems"); + if (tmp == NULL || *tmp == '\0') { + /* Show runtime problems on the apps which use them, unless they have their own problems */ + GsApp *runtime = gs_app_get_runtime (self->app); + if (runtime != NULL) + tmp = gs_app_get_metadata_item (runtime, "GnomeSoftware::problems"); + } + gtk_label_set_text (GTK_LABEL (self->infobar_details_problems_label), (tmp != NULL && *tmp != '\0') ? tmp : ""); + gtk_widget_set_visible (self->infobar_details_problems_label, tmp != NULL && *tmp != '\0'); + + tmp = gs_app_get_metadata_item (self->app, "GnomeSoftware::EolReason"); + if (tmp == NULL || *tmp == '\0') { + /* Show runtime EOL on the apps which use them, unless they have their own EOL */ + GsApp *runtime = gs_app_get_runtime (self->app); + if (runtime != NULL) + tmp = gs_app_get_metadata_item (runtime, "GnomeSoftware::EolReason"); + } + /* ignore the provided EOL reason, which might not be localized */ + gtk_widget_set_visible (self->infobar_details_eol, tmp != NULL && *tmp != '\0'); + + /* refresh buttons */ + gs_details_page_refresh_buttons (self); + + /* Set up the translation infobar. Assume that translations can be + * contributed to if an app is FOSS and it has provided a link for + * contributing translations. */ + if (gs_app_translation_dialog_app_has_url (self->app) && gs_app_get_license_is_free (self->app)) { + adw_banner_set_button_label (self->translation_banner, + _("Help _Translate")); + } else { + adw_banner_set_button_label (self->translation_banner, NULL); + } + + adw_banner_set_revealed (self->translation_banner, + gs_app_get_has_translations (self->app) && + !gs_app_has_kudo (self->app, GS_APP_KUDO_MY_LANGUAGE)); + + /* set the description */ + tmp = gs_app_get_description (self->app); + gs_details_page_set_description (self, tmp); + + /* set the icon; fall back to 96px and 64px if 128px isn’t available, + * which sometimes happens at 2× scale factor (hi-DPI) */ + { + const struct { + guint icon_size; + const gchar *fallback_icon_name; /* (nullable) */ + } icon_fallbacks[] = { + { 128, NULL }, + { 96, NULL }, + { 64, NULL }, + { 128, "org.gnome.Software.Generic" }, + }; + + for (gsize i = 0; i < G_N_ELEMENTS (icon_fallbacks) && icon == NULL; i++) { + icon = gs_app_get_icon_for_size (self->app, + icon_fallbacks[i].icon_size, + gtk_widget_get_scale_factor (self->application_details_icon), + icon_fallbacks[i].fallback_icon_name); + } + } + + gtk_image_set_from_gicon (GTK_IMAGE (self->application_details_icon), icon); + + /* Set various external links. If none are visible, show a fallback + * message instead. */ + link_rows_visible = FALSE; + link_rows_visible = update_action_row_from_link (self->project_website_row, self->app, AS_URL_KIND_HOMEPAGE) || link_rows_visible; + link_rows_visible = update_action_row_from_link (self->donate_row, self->app, AS_URL_KIND_DONATION) || link_rows_visible; + link_rows_visible = update_action_row_from_link (self->translate_row, self->app, AS_URL_KIND_TRANSLATE) || link_rows_visible; + link_rows_visible = update_action_row_from_link (self->report_an_issue_row, self->app, AS_URL_KIND_BUGTRACKER) || link_rows_visible; + link_rows_visible = update_action_row_from_link (self->help_row, self->app, AS_URL_KIND_HELP) || link_rows_visible; + link_rows_visible = update_action_row_from_link (self->contact_row, self->app, AS_URL_KIND_CONTACT) || link_rows_visible; + + gtk_stack_set_visible_child_name (self->links_stack, link_rows_visible ? "links" : "empty"); + + tmp = gs_app_get_developer_name (self->app); + if (tmp != NULL) { + gtk_label_set_label (GTK_LABEL (self->developer_name_label), tmp); + + if (g_strcmp0 (tmp, self->last_developer_name) != 0) { + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autofree gchar *heading = NULL; + const gchar *names[2] = { NULL, NULL }; + + /* Hide the section, it will be shown only if any other app had been found */ + gtk_widget_set_visible (self->box_developer_apps, FALSE); + + g_clear_pointer (&self->last_developer_name, g_free); + self->last_developer_name = g_strdup (tmp); + + /* Translators: the '%s' is replaced with a developer name or a project group */ + heading = g_strdup_printf (_("Other Apps by %s"), self->last_developer_name); + gtk_label_set_label (GTK_LABEL (self->developer_apps_heading), heading); + gs_widget_remove_all (self->box_developer_apps, (GsRemoveFunc) gtk_flow_box_remove); + + names[0] = self->last_developer_name; + query = gs_app_query_new ("developers", names, + "max-results", N_DEVELOPER_APPS * 3, /* Ask for more, some can be skipped */ + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_KEY_ID, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, + GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + + g_debug ("searching other apps for: '%s'", names[0]); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + gs_details_page_search_developer_apps_cb, + self); + } + } else if (tmp == NULL) { + g_clear_pointer (&self->last_developer_name, g_free); + gs_widget_remove_all (self->box_developer_apps, (GsRemoveFunc) gtk_flow_box_remove); + gtk_widget_set_visible (self->box_developer_apps, FALSE); + } + + gtk_widget_set_visible (GTK_WIDGET (self->developer_name_label), tmp != NULL); + gtk_widget_set_visible (self->developer_verified_image, gs_app_has_quirk (self->app, GS_APP_QUIRK_DEVELOPER_VERIFIED)); + + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_DEVELOPER_VERIFIED)) { + g_autofree gchar *tooltip = NULL; + + if (tmp != NULL) + /* Translators: the first %s is replaced with the developer name, the second %s is replaced with the app id */ + tooltip = g_strdup_printf (_("Developer %s has proven the ownership of %s"), tmp, gs_app_get_id (self->app)); + else + /* Translators: the %s is replaced with the app id */ + tooltip = g_strdup_printf (_("Developer has proven the ownership of %s"), gs_app_get_id (self->app)); + + gtk_widget_set_tooltip_text (self->developer_verified_image, tooltip); + } + + /* set version history */ + version_history = gs_app_get_version_history (self->app); + if (version_history == NULL || version_history->len == 0) { + const gchar *version = gs_app_get_version_ui (self->app); + if (version == NULL || *version == '\0') + gtk_widget_set_visible (self->list_box_version_history, FALSE); + else { + gs_app_version_history_row_set_info (GS_APP_VERSION_HISTORY_ROW (self->row_latest_version), + version, gs_app_get_release_date (self->app), NULL); + gtk_widget_set_visible (self->list_box_version_history, TRUE); + } + } else { + AsRelease *latest_version = g_ptr_array_index (version_history, 0); + const gchar *version = gs_app_get_version_ui (self->app); + if (version == NULL || *version == '\0') { + gs_app_version_history_row_set_info (GS_APP_VERSION_HISTORY_ROW (self->row_latest_version), + as_release_get_version (latest_version), + as_release_get_timestamp (latest_version), + as_release_get_description (latest_version)); + } else { + gboolean same_version = g_strcmp0 (version, as_release_get_version (latest_version)) == 0; + /* Inherit the description from the release history, when the versions match */ + gs_app_version_history_row_set_info (GS_APP_VERSION_HISTORY_ROW (self->row_latest_version), + version, gs_app_get_release_date (self->app), + same_version ? as_release_get_description (latest_version) : NULL); + } + gtk_widget_set_visible (self->list_box_version_history, TRUE); + } + + gtk_widget_set_visible (self->version_history_button_row, version_history != NULL && version_history->len > 1); + + /* are we trying to replace something in the baseos */ + gtk_widget_set_visible (self->infobar_details_package_baseos, + gs_app_has_quirk (self->app, GS_APP_QUIRK_COMPULSORY) && + gs_app_get_state (self->app) == GS_APP_STATE_AVAILABLE_LOCAL); + + switch (gs_app_get_kind (self->app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + /* installing an app with a repo file */ + gtk_widget_set_visible (GTK_WIDGET (self->context_bar), TRUE); + gtk_widget_set_visible (GTK_WIDGET (self->license_tile), TRUE); + gtk_widget_set_visible (self->infobar_details_app_repo, + gs_app_has_quirk (self->app, + GS_APP_QUIRK_HAS_SOURCE) && + gs_app_get_state (self->app) == GS_APP_STATE_AVAILABLE_LOCAL); + gtk_widget_set_visible (self->infobar_details_repo, FALSE); + break; + case AS_COMPONENT_KIND_GENERIC: + /* installing a repo-release package */ + gtk_widget_set_visible (GTK_WIDGET (self->context_bar), TRUE); + gtk_widget_set_visible (GTK_WIDGET (self->license_tile), TRUE); + gtk_widget_set_visible (self->infobar_details_app_repo, FALSE); + gtk_widget_set_visible (self->infobar_details_repo, + gs_app_has_quirk (self->app, + GS_APP_QUIRK_HAS_SOURCE) && + gs_app_get_state (self->app) == GS_APP_STATE_AVAILABLE_LOCAL); + break; + case AS_COMPONENT_KIND_WEB_APP: + gtk_widget_set_visible (GTK_WIDGET (self->context_bar), TRUE); + gtk_widget_set_visible (GTK_WIDGET (self->license_tile), TRUE); + gtk_widget_set_visible (self->infobar_details_app_repo, FALSE); + gtk_widget_set_visible (self->infobar_details_repo, FALSE); + break; + default: + gtk_widget_set_visible (GTK_WIDGET (self->context_bar), FALSE); + gtk_widget_set_visible (GTK_WIDGET (self->license_tile), FALSE); + gtk_widget_set_visible (self->infobar_details_app_repo, FALSE); + gtk_widget_set_visible (self->infobar_details_repo, FALSE); + break; + } + + /* installing a app without a repo file */ + switch (gs_app_get_kind (self->app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + if (gs_app_get_kind (self->app) == AS_COMPONENT_KIND_FIRMWARE) { + gtk_widget_set_visible (self->infobar_details_app_norepo, FALSE); + } else { + gtk_widget_set_visible (self->infobar_details_app_norepo, + !gs_app_has_quirk (self->app, + GS_APP_QUIRK_HAS_SOURCE) && + gs_app_get_state (self->app) == GS_APP_STATE_AVAILABLE_LOCAL); + } + break; + default: + gtk_widget_set_visible (self->infobar_details_app_norepo, FALSE); + break; + } + + /* update progress */ + gs_details_page_refresh_progress (self); + + gs_details_page_refresh_addons (self); + gs_details_page_refresh_app_data_info (self); +} + +static gint +list_sort_func (GtkListBoxRow *a, + GtkListBoxRow *b, + gpointer user_data) +{ + GsApp *a1 = gs_app_addon_row_get_addon (GS_APP_ADDON_ROW (a)); + GsApp *a2 = gs_app_addon_row_get_addon (GS_APP_ADDON_ROW (b)); + + return gs_utils_sort_strcmp (gs_app_get_name (a1), + gs_app_get_name (a2)); +} + +static void +addons_list_row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + GsDetailsPage *self) +{ + g_return_if_fail (GS_IS_APP_ADDON_ROW (row)); + + gs_app_addon_row_activate (GS_APP_ADDON_ROW (row)); +} + +static void +version_history_list_row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + GsDetailsPage *self) +{ + GtkWidget *dialog; + + /* Only the row with the arrow is clickable */ + if (GS_IS_APP_VERSION_HISTORY_ROW (row)) + return; + + dialog = gs_app_version_history_dialog_new (self->app); + adw_dialog_present (ADW_DIALOG (dialog), GTK_WIDGET (self)); +} + +static void gs_details_page_refresh_reviews (GsDetailsPage *self); + +static void +app_reviews_dialog_destroy_cb (GsDetailsPage *self) +{ + self->app_reviews_dialog = NULL; +} + +static void +featured_review_list_row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + GsDetailsPage *self) +{ + /* Only the row with the arrow is clickable */ + if (GS_IS_REVIEW_ROW (row)) + return; + + g_assert (GS_IS_ODRS_PROVIDER (self->odrs_provider)); + + if (self->app_reviews_dialog == NULL) { + self->app_reviews_dialog = + gs_app_reviews_dialog_new (self->app, + self->odrs_provider, self->plugin_loader); + g_object_bind_property (self, "odrs-provider", + self->app_reviews_dialog, "odrs-provider", 0); + g_signal_connect_swapped (self->app_reviews_dialog, "reviews-updated", + G_CALLBACK (gs_details_page_refresh_reviews), self); + g_signal_connect_swapped (self->app_reviews_dialog, "destroy", + G_CALLBACK (app_reviews_dialog_destroy_cb), self); + } + + adw_dialog_present (ADW_DIALOG (self->app_reviews_dialog), GTK_WIDGET (self)); +} + +static void gs_details_page_addon_install_cb (GsAppAddonRow *row, gpointer user_data); +static void gs_details_page_addon_remove_cb (GsAppAddonRow *row, gpointer user_data); + +static void +gs_details_page_refresh_addons (GsDetailsPage *self) +{ + g_autoptr(GsAppList) addons = NULL; + gboolean sensitive; + guint i, rows = 0; + + gs_widget_remove_all (self->list_box_addons, (GsRemoveFunc) gtk_list_box_remove); + + /* Make addons installable only if the app itself is installed */ + sensitive = gs_app_get_state (self->app) == GS_APP_STATE_INSTALLED || + gs_app_get_state (self->app) == GS_APP_STATE_UPDATABLE || + gs_app_get_state (self->app) == GS_APP_STATE_UPDATABLE_LIVE; + + addons = gs_app_dup_addons (self->app); + for (i = 0; addons != NULL && i < gs_app_list_length (addons); i++) { + GsApp *addon; + GtkWidget *row; + + addon = gs_app_list_index (addons, i); + if (gs_app_get_state (addon) == GS_APP_STATE_UNKNOWN || + gs_app_get_state (addon) == GS_APP_STATE_UNAVAILABLE) + continue; + + if (gs_app_has_quirk (addon, GS_APP_QUIRK_HIDE_EVERYWHERE)) + continue; + + row = gs_app_addon_row_new (addon); + + gtk_widget_set_sensitive (row, sensitive); + + g_signal_connect (row, "install-button-clicked", + G_CALLBACK (gs_details_page_addon_install_cb), + self); + g_signal_connect (row, "remove-button-clicked", + G_CALLBACK (gs_details_page_addon_remove_cb), + self); + + gtk_list_box_append (GTK_LIST_BOX (self->list_box_addons), row); + + rows++; + } + + gtk_widget_set_visible (self->box_addons, rows > 0); +} + +static AsReview * +get_featured_review (GPtrArray *reviews) +{ + AsReview *featured; + g_autoptr(GDateTime) now_utc = NULL; + g_autoptr(GDateTime) min_date = NULL; + gint featured_priority; + + g_assert (reviews->len > 0); + + now_utc = g_date_time_new_now_utc (); + min_date = g_date_time_add_months (now_utc, -6); + + featured = g_ptr_array_index (reviews, 0); + featured_priority = as_review_get_priority (featured); + + for (gsize i = 1; i < reviews->len; i++) { + AsReview *new = g_ptr_array_index (reviews, i); + gint new_priority = as_review_get_priority (new); + + /* Skip reviews older than 6 months for the featured pick */ + if (g_date_time_compare (as_review_get_date (new), min_date) < 0) + continue; + + if (featured_priority > new_priority || + (featured_priority == new_priority && + g_date_time_compare (as_review_get_date (featured), as_review_get_date (new)) > 0)) { + featured = new; + featured_priority = new_priority; + } + } + + return featured; +} + +static void +gs_details_page_refresh_reviews (GsDetailsPage *self) +{ + GArray *review_ratings = NULL; + GPtrArray *reviews; + gboolean show_review_button = TRUE; + gboolean show_reviews = FALSE; + guint n_reviews = 0; + guint i; + GtkWidget *child; + + /* nothing to show */ + if (self->app == NULL) + return; + + /* show or hide the entire reviews section */ + switch (gs_app_get_kind (self->app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + case AS_COMPONENT_KIND_FONT: + case AS_COMPONENT_KIND_INPUT_METHOD: + case AS_COMPONENT_KIND_WEB_APP: + /* don't show a missing rating on a local file */ + if (gs_app_get_state (self->app) != GS_APP_STATE_AVAILABLE_LOCAL && + self->odrs_provider != NULL) + show_reviews = TRUE; + break; + default: + break; + } + + /* some apps are unreviewable */ + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NOT_REVIEWABLE)) + show_reviews = FALSE; + + /* set the star rating */ + if (show_reviews) { + gtk_widget_set_sensitive (self->star, gs_app_get_rating (self->app) >= 0); + gs_star_widget_set_rating (GS_STAR_WIDGET (self->star), + gs_app_get_rating (self->app)); + + review_ratings = gs_app_get_review_ratings (self->app); + if (review_ratings != NULL) { + gs_review_histogram_set_ratings (GS_REVIEW_HISTOGRAM (self->histogram), + gs_app_get_rating (self->app), + review_ratings); + } + if (review_ratings != NULL) { + for (i = 0; i < review_ratings->len; i++) + n_reviews += (guint) g_array_index (review_ratings, guint32, i); + } else if (gs_app_get_reviews (self->app) != NULL) { + n_reviews = gs_app_get_reviews (self->app)->len; + } + } + + /* enable appropriate widgets */ + gtk_widget_set_visible (self->star, show_reviews); + gtk_widget_set_visible (self->histogram_row, review_ratings != NULL && review_ratings->len > 0); + gtk_widget_set_visible (self->label_review_count, n_reviews > 0); + + /* update the review label next to the star widget */ + if (n_reviews > 0) { + g_autofree gchar *text = NULL; + gtk_widget_set_visible (self->label_review_count, TRUE); + text = g_strdup_printf ("(%u)", n_reviews); + gtk_label_set_text (GTK_LABEL (self->label_review_count), text); + } + + /* no point continuing */ + if (!show_reviews) { + gtk_widget_set_visible (self->box_reviews, FALSE); + return; + } + + /* add all the reviews */ + while ((child = gtk_widget_get_first_child (self->list_box_featured_review)) != NULL) { + if (GS_IS_REVIEW_ROW (child)) + gtk_list_box_remove (GTK_LIST_BOX (self->list_box_featured_review), child); + else + break; + } + + reviews = gs_app_get_reviews (self->app); + if (reviews->len > 0) { + AsReview *review = get_featured_review (reviews); + GtkWidget *row = gs_review_row_new (review); + + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE); + gtk_list_box_prepend (GTK_LIST_BOX (self->list_box_featured_review), row); + + gs_review_row_actions_set_sensitive (GS_REVIEW_ROW (row), + gs_plugin_loader_get_network_available (self->plugin_loader)); + } + + /* show the button only if the user never reviewed */ + gtk_widget_set_visible (self->write_review_button_row, show_review_button); + if (!gs_app_is_installed (self->app)) { + gtk_widget_set_visible (self->write_review_button_row, FALSE); + gtk_widget_set_sensitive (self->write_review_button_row, FALSE); + gtk_widget_set_sensitive (self->star, FALSE); + } else if (gs_plugin_loader_get_network_available (self->plugin_loader)) { + gtk_widget_set_sensitive (self->write_review_button_row, TRUE); + gtk_widget_set_sensitive (self->star, TRUE); + gtk_widget_set_tooltip_text (self->write_review_button_row, NULL); + } else { + gtk_widget_set_sensitive (self->write_review_button_row, FALSE); + gtk_widget_set_sensitive (self->star, FALSE); + gtk_widget_set_tooltip_text (self->write_review_button_row, + /* TRANSLATORS: we need a remote server to process */ + _("You need internet access to write a review")); + } + + gtk_widget_set_visible (self->list_box_featured_review, reviews->len > 0); + + /* Update the overall container. */ + gtk_widget_set_visible (self->list_box_reviews_summary, + show_reviews && + (gtk_widget_get_visible (self->histogram_row) || + gtk_widget_get_visible (self->write_review_button_row))); + gtk_widget_set_visible (self->box_reviews, + reviews->len > 0 || + gtk_widget_get_visible (self->list_box_reviews_summary)); +} + +static void +gs_details_page_app_refine_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + g_autoptr(GError) error = NULL; + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_warning ("failed to refine %s: %s", + gs_app_get_id (self->app), + error->message); + } + return; + } + gs_details_page_refresh_reviews (self); + gs_details_page_refresh_addons (self); +} + +static void +_set_app (GsDetailsPage *self, GsApp *app) +{ + GsJobManager *job_manager; + + if (self->app == app) + return; + + job_manager = gs_plugin_loader_get_job_manager (self->plugin_loader); + + /* do not show all the reviews by default */ + self->show_all_reviews = FALSE; + + /* disconnect the old handlers */ + if (self->app != NULL) { + g_signal_handlers_disconnect_by_func (self->app, gs_details_page_notify_state_changed_cb, self); + g_signal_handlers_disconnect_by_func (self->app, gs_details_page_progress_changed_cb, self); + g_signal_handlers_disconnect_by_func (self->app, gs_details_page_allow_cancel_changed_cb, + self); + gs_job_manager_remove_watch (job_manager, self->job_manager_watch_id); + self->job_manager_watch_id = 0; + } + + /* save app */ + g_set_object (&self->app, app); + + gs_app_context_bar_set_app (self->context_bar, app); + gs_license_tile_set_app (self->license_tile, app); + + /* title/app name will have changed */ + g_object_notify (G_OBJECT (self), "title"); + + if (self->app == NULL) { + g_set_object (&self->app_cancellable, NULL); + return; + } + + g_set_object (&self->app_cancellable, gs_app_get_cancellable (app)); + + self->job_manager_watch_id = gs_job_manager_add_watch (job_manager, + app, + G_TYPE_INVALID, + job_manager_jobs_changed_cb, + job_manager_jobs_changed_cb, + self, + NULL); + + g_signal_connect_object (self->app, "notify::state", + G_CALLBACK (gs_details_page_notify_state_changed_cb), + self, 0); + g_signal_connect_object (self->app, "notify::size", + G_CALLBACK (gs_details_page_notify_state_changed_cb), + self, 0); + g_signal_connect_object (self->app, "notify::quirk", + G_CALLBACK (gs_details_page_notify_state_changed_cb), + self, 0); + g_signal_connect_object (self->app, "notify::progress", + G_CALLBACK (gs_details_page_progress_changed_cb), + self, 0); + g_signal_connect_object (self->app, "notify::allow-cancel", + G_CALLBACK (gs_details_page_allow_cancel_changed_cb), + self, 0); + g_signal_connect_object (self->app, "notify::pending-action", + G_CALLBACK (gs_details_page_notify_state_changed_cb), + self, 0); + + if (gs_app_is_application (self->app)) { + gtk_label_set_text (GTK_LABEL (self->label_eol), _("This app is no longer receiving updates, including security fixes")); + gtk_label_set_text (GTK_LABEL (self->label_package_baseos), _("This app is already provided by your distribution and should not be replaced.")); + gtk_label_set_text (GTK_LABEL (self->label_no_metadata_info), _("This app doesn’t provide any links to a website, code repository or issue tracker.")); + } else { + gtk_label_set_text (GTK_LABEL (self->label_eol), _("This software is no longer receiving updates, including security fixes")); + gtk_label_set_text (GTK_LABEL (self->label_package_baseos), _("This software is already provided by your distribution and should not be replaced.")); + gtk_label_set_text (GTK_LABEL (self->label_no_metadata_info), _("This software doesn’t provide any links to a website, code repository or issue tracker.")); + } +} + +static gboolean +gs_details_page_filter_origin (GsApp *app, + gpointer user_data) +{ + /* Keep only local apps or those, which have an origin set */ + return gs_app_get_state (app) == GS_APP_STATE_AVAILABLE_LOCAL || + gs_app_get_local_file (app) != NULL || + gs_app_get_origin (app) != NULL; +} + +/* show the UI and do operations that should not block page load */ +static void +gs_details_page_load_stage2 (GsDetailsPage *self, + gboolean continue_loading) +{ + g_autofree gchar *tmp = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job1 = NULL; + g_autoptr(GsPluginJob) plugin_job2 = NULL; + + /* print what we've got */ + tmp = gs_app_to_string (self->app); + g_debug ("%s", tmp); + + /* update UI */ + gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_READY); + gs_details_page_refresh_screenshots (self); + gs_details_page_refresh_reviews (self); + gs_details_page_refresh_all (self); + gs_details_page_update_origin_button (self, FALSE); + + if (!continue_loading) + return; + + /* if these tasks fail (e.g. because we have no networking) then it's + * of no huge importance if we don't get the required data */ + plugin_job1 = gs_plugin_job_refine_new_for_app (self->app, + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE); + + query = gs_app_query_new ("alternate-of", self->app, + "refine-flags", GS_DETAILS_PAGE_REFINE_FLAGS, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_NONE, + "filter-func", gs_details_page_filter_origin, + "sort-func", gs_utils_app_sort_priority, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + plugin_job2 = gs_plugin_job_list_apps_new (query, + GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job1, + self->cancellable, + gs_details_page_app_refine_cb, + self); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job2, + self->cancellable, + gs_details_page_get_alternates_cb, + self); +} + +static void +gs_details_page_load_stage1_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + g_autoptr(GError) error = NULL; + + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { + g_warning ("failed to refine %s: %s", + gs_app_get_id (self->app), + error->message); + } else { + return; + } + } + if (gs_app_get_kind (self->app) == AS_COMPONENT_KIND_UNKNOWN || + gs_app_get_state (self->app) == GS_APP_STATE_UNKNOWN) { + g_autofree gchar *str = NULL; + const gchar *id = gs_app_get_id (self->app); + str = g_strdup_printf (_("Software failed to retrieve information for “%s” and is unable to show the details for this app."), + id == NULL ? gs_app_get_source_default (self->app) : id); + adw_status_page_set_description (ADW_STATUS_PAGE (self->page_failed), str); + gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_FAILED); + return; + } + + /* Hide the app if it’s not suitable for the user, but only if it’s not + * already installed — a parent could have decided that a particular + * app *is* actually suitable for their child, despite its age rating. + * + * Make it look like the app doesn’t exist, to not tantalise the + * child. */ + if (!gs_app_is_installed (self->app) && + gs_app_has_quirk (self->app, GS_APP_QUIRK_PARENTAL_FILTER)) { + g_autofree gchar *str = NULL; + const gchar *id = gs_app_get_id (self->app); + str = g_strdup_printf (_("Software failed to retrieve information for “%s” and is unable to show the details for this app."), + id == NULL ? gs_app_get_source_default (self->app) : id); + adw_status_page_set_description (ADW_STATUS_PAGE (self->page_failed), str); + gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_FAILED); + return; + } + + /* do 2nd stage refine */ + gs_details_page_load_stage2 (self, TRUE); +} + +static void +gs_details_page_file_to_app_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) error = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, + res, + &error); + if (list == NULL) { + g_warning ("failed to convert file to GsApp: %s", error->message); + /* go back to the overview */ + gs_shell_set_mode (self->shell, GS_SHELL_MODE_OVERVIEW); + } else { + GsApp *app = gs_app_list_index (list, 0); + g_set_object (&self->app_local_file, app); + _set_app (self, app); + gs_details_page_load_stage2 (self, TRUE); + } +} + +static void +gs_details_page_url_to_app_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) error = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, + res, + &error); + if (list == NULL) { + g_warning ("failed to convert URL to GsApp: %s", error->message); + /* go back to the overview */ + gs_shell_set_mode (self->shell, GS_SHELL_MODE_OVERVIEW); + } else { + GsApp *app = gs_app_list_index (list, 0); + g_set_object (&self->app_local_file, app); + _set_app (self, app); + gs_details_page_load_stage2 (self, TRUE); + } +} + +void +gs_details_page_set_local_file (GsDetailsPage *self, GFile *file) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_LOADING); + g_clear_object (&self->app_local_file); + _set_app (self, NULL); + self->origin_by_packaging_format = FALSE; + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE); + gs_plugin_job_set_refine_flags (plugin_job, GS_DETAILS_PAGE_REFINE_FLAGS); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + gs_details_page_file_to_app_cb, + self); +} + +void +gs_details_page_set_url (GsDetailsPage *self, const gchar *url) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_LOADING); + g_clear_object (&self->app_local_file); + _set_app (self, NULL); + self->origin_by_packaging_format = FALSE; + plugin_job = gs_plugin_job_url_to_app_new (url, GS_PLUGIN_URL_TO_APP_FLAGS_INTERACTIVE); + gs_plugin_job_set_refine_flags (plugin_job, GS_DETAILS_PAGE_REFINE_FLAGS | + GS_PLUGIN_REFINE_FLAGS_ALLOW_PACKAGES); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + gs_details_page_url_to_app_cb, + self); +} + +/* refines a GsApp */ +static void +gs_details_page_load_stage1 (GsDetailsPage *self) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GCancellable) cancellable = g_cancellable_new (); + + /* update UI */ + gs_page_switch_to (GS_PAGE (self)); + gs_page_scroll_up (GS_PAGE (self)); + gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_LOADING); + + g_cancellable_cancel (self->cancellable); + g_set_object (&self->cancellable, cancellable); + g_cancellable_connect (self->cancellable, G_CALLBACK (gs_details_page_cancel_cb), self, NULL); + + /* get extra details about the app */ + plugin_job = gs_plugin_job_refine_new_for_app (self->app, GS_DETAILS_PAGE_REFINE_FLAGS); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + gs_details_page_load_stage1_cb, + self); + + /* update UI with loading page */ + gs_details_page_refresh_all (self); +} + +static void +gs_details_page_reload (GsPage *page) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (page); + if (self->app != NULL && gs_shell_get_mode (self->shell) == GS_SHELL_MODE_DETAILS) { + GsAppState state = gs_app_get_state (self->app); + /* Do not reload the page when the app is "doing something" */ + if (state == GS_APP_STATE_INSTALLING || + state == GS_APP_STATE_REMOVING || + state == GS_APP_STATE_DOWNLOADING || + state == GS_APP_STATE_PURCHASING) + return; + gs_details_page_load_stage1 (self); + } +} + +static void +origin_popover_row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + gpointer user_data) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + GsApp *app; + + gtk_popover_popdown (GTK_POPOVER (self->origin_popover)); + + app = gs_origin_popover_row_get_app (GS_ORIGIN_POPOVER_ROW (row)); + if (app != self->app) { + _set_app (self, app); + gs_details_page_load_stage1 (self); + } +} + +static void +gs_details_page_read_packaging_format_preference (GsDetailsPage *self) +{ + g_auto(GStrv) preference = NULL; + + g_clear_pointer (&self->packaging_format_preference, g_strfreev); + + preference = g_settings_get_strv (self->settings, "packaging-format-preference"); + /* Ignore empty arrays or arrays with a single empty string item */ + if (preference == NULL || preference[0] == NULL || + (preference[0][0] == '\0' && preference[1] == NULL)) + return; + + self->packaging_format_preference = g_steal_pointer (&preference); +} + +static void +settings_changed_cb (GsDetailsPage *self, const gchar *key, gpointer data) +{ + if (g_strcmp0 (key, "packaging-format-preference") == 0) { + gs_details_page_read_packaging_format_preference (self); + return; + } + + if (self->app == NULL) + return; + if (g_strcmp0 (key, "show-nonfree-ui") == 0) { + gs_details_page_refresh_all (self); + } +} + +static void +gs_details_page_app_info_changed_cb (GAppInfoMonitor *monitor, + gpointer user_data) +{ + GsDetailsPage *self = user_data; + + g_return_if_fail (GS_IS_DETAILS_PAGE (self)); + + if (!self->app || !gs_page_is_active (GS_PAGE (self))) + return; + + gs_details_page_refresh_buttons (self); +} + +/* this is being called from GsShell */ +void +gs_details_page_set_app (GsDetailsPage *self, GsApp *app) +{ + g_return_if_fail (GS_IS_DETAILS_PAGE (self)); + g_return_if_fail (GS_IS_APP (app)); + + /* clear old state */ + g_clear_object (&self->app_local_file); + + /* save GsApp */ + _set_app (self, app); + self->origin_by_packaging_format = TRUE; + gs_details_page_load_stage1 (self); +} + +GsApp * +gs_details_page_get_app (GsDetailsPage *self) +{ + return self->app; +} + +static void +gs_details_page_remove_app (GsDetailsPage *self) +{ + g_set_object (&self->app_cancellable, gs_app_get_cancellable (self->app)); + gs_page_remove_app (GS_PAGE (self), self->app, self->app_cancellable); +} + +static void +gs_details_page_app_remove_button_cb (GtkWidget *widget, GsDetailsPage *self) +{ + gs_details_page_remove_app (self); +} + +static void +gs_details_page_app_cancel_button_cb (GtkWidget *widget, GsDetailsPage *self) +{ + g_cancellable_cancel (self->app_cancellable); + gtk_widget_set_sensitive (widget, FALSE); + + /* reset the pending-action from the app if needed */ + gs_app_set_pending_action (self->app, GS_PLUGIN_ACTION_UNKNOWN); + + /* FIXME: We should be able to revert the QUEUED_FOR_INSTALL without + * having to pretend to remove the app */ + if (gs_app_get_state (self->app) == GS_APP_STATE_QUEUED_FOR_INSTALL) + gs_details_page_remove_app (self); +} + +static void +gs_details_page_app_install_button_cb (GtkWidget *widget, GsDetailsPage *self) +{ + switch (gs_app_get_state (self->app)) { + case GS_APP_STATE_PENDING_INSTALL: + #ifdef ENABLE_DKMS + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT) && + (g_strcmp0 (gs_app_get_metadata_item (self->app, "GnomeSoftware::requires-akmods-key"), "True") == 0 || + g_strcmp0 (gs_app_get_metadata_item (self->app, "GnomeSoftware::requires-dkms-key"), "True") == 0) && + !gs_app_get_mok_key_pending (self->app)) { + gs_dkms_dialog_run (GTK_WIDGET (self), self->app); + return; + } + #endif + /* falls through */ + case GS_APP_STATE_PENDING_REMOVE: + g_return_if_fail (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT)); + gs_utils_invoke_reboot_async (NULL, NULL, NULL); + return; + default: + break; + } + + g_set_object (&self->app_cancellable, gs_app_get_cancellable (self->app)); + + if (gs_app_get_state (self->app) == GS_APP_STATE_UPDATABLE_LIVE) { + gs_page_update_app (GS_PAGE (self), self->app, self->app_cancellable); + return; + } + + gs_page_install_app (GS_PAGE (self), self->app, GS_SHELL_INTERACTION_FULL, + self->app_cancellable); +} + +static void +gs_details_page_app_update_button_cb (GtkWidget *widget, GsDetailsPage *self) +{ + g_set_object (&self->app_cancellable, gs_app_get_cancellable (self->app)); + gs_page_update_app (GS_PAGE (self), self->app, self->app_cancellable); +} + +static void +gs_details_page_addon_install_cb (GsAppAddonRow *row, + gpointer user_data) +{ + GsApp *addon; + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + + addon = gs_app_addon_row_get_addon (row); + gs_page_install_app (GS_PAGE (self), addon, GS_SHELL_INTERACTION_FULL, NULL); +} + +static void +gs_details_page_addon_remove_cb (GsAppAddonRow *row, gpointer user_data) +{ + GsApp *addon; + GsDetailsPage *self = GS_DETAILS_PAGE (user_data); + + addon = gs_app_addon_row_get_addon (row); + gs_page_remove_app (GS_PAGE (self), addon, NULL); +} + +static void +gs_details_page_app_launch_button_cb (GtkWidget *widget, GsDetailsPage *self) +{ + g_autoptr(GCancellable) cancellable = g_cancellable_new (); + + /* hide the notification */ + g_application_withdraw_notification (g_application_get_default (), + "installed"); + + g_set_object (&self->cancellable, cancellable); + g_cancellable_connect (cancellable, G_CALLBACK (gs_details_page_cancel_cb), self, NULL); + gs_page_launch_app (GS_PAGE (self), self->app, self->cancellable); +} + +typedef struct { + GsDetailsPage *details_page; /* (not nullable) (unowned) */ + GWeakRef dialog_weak; /* (element-type GsReviewDialog) (owned) */ + GsApp *app; /* (not nullable) (owned) */ +} ReviewSubmitData; + +static void +submit_review_data_free (ReviewSubmitData *data) +{ + g_clear_object (&data->app); + g_weak_ref_clear (&data->dialog_weak); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ReviewSubmitData, submit_review_data_free); + +static void +review_submitted_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsOdrsProvider *odrs_provider = GS_ODRS_PROVIDER (source_object); + g_autoptr(ReviewSubmitData) data = g_steal_pointer (&user_data); + GsDetailsPage *self = data->details_page; + g_autoptr(GsReviewDialog) review_dialog = g_weak_ref_get (&data->dialog_weak); + g_autoptr(GError) local_error = NULL; + + /* enable submit action after action completion */ + gs_review_dialog_submit_set_sensitive (review_dialog, TRUE); + + /* if the dialog which triggered this callback is open. */ + if (!gs_odrs_provider_submit_review_finish (odrs_provider, result, &local_error)) { + g_autofree gchar *tmp = NULL; + const char *translatable_message; + + /* Print a warning with the full error message, before we simplify + * it for display in the UI. */ + g_warning ("Failed to submit review for “%s”: %s", + gs_app_get_name (data->app), + local_error->message); + + if (g_error_matches (local_error, GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_PARSING_DATA)) { + translatable_message = _("Invalid review response received from server"); + } else if (g_error_matches (local_error, GS_ODRS_PROVIDER_ERROR, + GS_ODRS_PROVIDER_ERROR_SERVER_ERROR)) { + translatable_message = _("Could not communicate with ratings server"); + } else { + /* likely a programming error in gnome-software, so don’t + * waste a translatable string on it */ + translatable_message = local_error->message; + } + + tmp = g_strdup_printf (_("Failed to submit review for “%s”: %s"), gs_app_get_name (data->app), translatable_message); + if (review_dialog != NULL) + gs_review_dialog_set_error_text (review_dialog, tmp); + + return; + } + + gs_details_page_refresh_reviews (self); + + /* ensure the dialog is now closed */ + if (review_dialog != NULL) + adw_dialog_force_close (ADW_DIALOG (review_dialog)); +} + +static void +gs_details_page_review_send_cb (GsReviewDialog *dialog, + GsDetailsPage *self) +{ + g_autofree gchar *text = NULL; + g_autoptr(GDateTime) now = NULL; + g_autoptr(AsReview) review = NULL; + g_autoptr(ReviewSubmitData) user_data = NULL; + GsReviewDialog *rdialog = GS_REVIEW_DIALOG (dialog); + + review = as_review_new (); + as_review_set_summary (review, gs_review_dialog_get_summary (rdialog)); + text = gs_review_dialog_get_text (rdialog); + as_review_set_description (review, text); + as_review_set_rating (review, gs_review_dialog_get_rating (rdialog)); + as_review_set_version (review, gs_app_get_version (self->app)); + now = g_date_time_new_now_local (); + as_review_set_date (review, now); + + /* call into the plugins to set the new value */ + g_assert (self->odrs_provider != NULL); + + user_data = g_new0 (ReviewSubmitData, 1); + user_data->details_page = self; + g_weak_ref_init (&user_data->dialog_weak, rdialog); + user_data->app = g_object_ref (self->app); + + /* avoid submitting duplicate requests */ + gs_review_dialog_submit_set_sensitive (rdialog, FALSE); + gs_odrs_provider_submit_review_async (self->odrs_provider, self->app, review, + self->cancellable, review_submitted_cb, g_steal_pointer (&user_data)); +} + +static void +review_dialog_closed_cb (GsDetailsPage *self, + GtkWidget *review_dialog) +{ + if (review_dialog == self->review_dialog) + self->review_dialog = NULL; +} + +static void +gs_details_page_write_review (GsDetailsPage *self) +{ + self->review_dialog = gs_review_dialog_new (); + g_signal_connect (self->review_dialog, "send", + G_CALLBACK (gs_details_page_review_send_cb), self); + g_signal_connect_swapped (self->review_dialog, "closed", + G_CALLBACK (review_dialog_closed_cb), self); + + adw_dialog_present (ADW_DIALOG (self->review_dialog), GTK_WIDGET (self)); +} + +static void +gs_details_page_app_installed (GsPage *page, GsApp *app) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (page); + g_autoptr(GsAppList) addons = NULL; + guint i; + + /* if the app is just an addon, no need for a full refresh */ + addons = gs_app_dup_addons (self->app); + for (i = 0; addons != NULL && i < gs_app_list_length (addons); i++) { + GsApp *addon; + addon = gs_app_list_index (addons, i); + if (addon == app) + return; + } + + gs_details_page_reload (page); +} + +static void +gs_details_page_app_removed (GsPage *page, GsApp *app) +{ + gs_details_page_app_installed (page, app); +} + +static void +gs_details_page_network_available_notify_cb (GsPluginLoader *plugin_loader, + GParamSpec *pspec, + GsDetailsPage *self) +{ + gs_details_page_refresh_reviews (self); +} + +static void +gs_details_page_star_pressed_cb (GtkGestureClick *click, + gint n_press, + gdouble x, + gdouble y, + GsDetailsPage *self) +{ + gs_details_page_write_review (self); +} + +static void +gs_details_page_shell_allocation_width_cb (GObject *shell, + GParamSpec *pspec, + GsDetailsPage *self) +{ + gint allocation_width = 0; + GtkOrientation orientation; + + g_object_get (shell, "allocation-width", &allocation_width, NULL); + + if (allocation_width > 0 && allocation_width < 500) + orientation = GTK_ORIENTATION_VERTICAL; + else + orientation = GTK_ORIENTATION_HORIZONTAL; + + if (orientation != gtk_orientable_get_orientation (GTK_ORIENTABLE (self->box_details_header_not_icon))) + gtk_orientable_set_orientation (GTK_ORIENTABLE (self->box_details_header_not_icon), orientation); +} + +static gboolean +gs_details_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (page); + + g_return_val_if_fail (GS_IS_DETAILS_PAGE (self), FALSE); + + self->shell = shell; + + self->plugin_loader = g_object_ref (plugin_loader); + self->cancellable = g_cancellable_new (); + g_cancellable_connect (cancellable, G_CALLBACK (gs_details_page_cancel_cb), self, NULL); + + g_signal_connect_object (self->shell, "notify::allocation-width", + G_CALLBACK (gs_details_page_shell_allocation_width_cb), + self, 0); + + /* hide some UI when offline */ + g_signal_connect_object (self->plugin_loader, "notify::network-available", + G_CALLBACK (gs_details_page_network_available_notify_cb), + self, 0); + return TRUE; +} + +static gboolean +gs_details_page_should_show_title (GsDetailsPage *self) +{ + /* only when not scrolled at the very top */ + return ((gint) gs_details_page_get_vscroll_position (self)) >= 1; +} + +static void +gs_details_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (object); + + switch ((GsDetailsPageProperty) prop_id) { + case PROP_TITLE: + switch (gs_details_page_get_state (self)) { + case GS_DETAILS_PAGE_STATE_LOADING: + /* 'Loading' is shown in the page already, no need to repeat it in the title */ + g_value_set_string (value, NULL); + break; + case GS_DETAILS_PAGE_STATE_READY: + self->title_visible = gs_details_page_should_show_title (self); + if (self->title_visible) + g_value_set_string (value, gs_app_get_name (self->app)); + else + g_value_set_string (value, NULL); + break; + case GS_DETAILS_PAGE_STATE_FAILED: + g_value_set_string (value, NULL); + break; + default: + g_assert_not_reached (); + } + break; + case PROP_ODRS_PROVIDER: + g_value_set_object (value, gs_details_page_get_odrs_provider (self)); + break; + case PROP_IS_NARROW: + g_value_set_boolean (value, gs_details_page_get_is_narrow (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_details_page_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (object); + + switch ((GsDetailsPageProperty) prop_id) { + case PROP_TITLE: + /* Read only */ + g_assert_not_reached (); + break; + case PROP_ODRS_PROVIDER: + gs_details_page_set_odrs_provider (self, g_value_get_object (value)); + break; + case PROP_IS_NARROW: + gs_details_page_set_is_narrow (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_details_page_dispose (GObject *object) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (object); + + _set_app (self, NULL); + + g_clear_pointer (&self->packaging_format_preference, g_strfreev); + g_clear_object (&self->origin_css_provider); + g_clear_object (&self->developer_verified_image_css_provider); + g_clear_object (&self->developer_verified_label_css_provider); + g_clear_object (&self->app_local_file); + g_clear_object (&self->app_reviews_dialog); + g_clear_object (&self->plugin_loader); + g_clear_object (&self->cancellable); + g_clear_object (&self->app_cancellable); + g_clear_object (&self->odrs_provider); + g_clear_object (&self->app_info_monitor); + g_clear_pointer (&self->last_developer_name, g_free); + + G_OBJECT_CLASS (gs_details_page_parent_class)->dispose (object); +} + +static void +gs_details_page_class_init (GsDetailsPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPageClass *page_class = GS_PAGE_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_details_page_get_property; + object_class->set_property = gs_details_page_set_property; + object_class->dispose = gs_details_page_dispose; + + page_class->app_installed = gs_details_page_app_installed; + page_class->app_removed = gs_details_page_app_removed; + page_class->switch_to = gs_details_page_switch_to; + page_class->reload = gs_details_page_reload; + page_class->setup = gs_details_page_setup; + + /** + * GsDetailsPage:odrs-provider: (nullable) + * + * An ODRS provider to give access to ratings and reviews information + * for the app being displayed. + * + * If this is %NULL, ratings and reviews will be disabled. + * + * Since: 41 + */ + obj_props[PROP_ODRS_PROVIDER] = + g_param_spec_object ("odrs-provider", NULL, NULL, + GS_TYPE_ODRS_PROVIDER, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsDetailsPage:is-narrow: + * + * Whether the page is in narrow mode. + * + * In narrow mode, the page will take up less horizontal space, doing so + * by e.g. turning horizontal boxes into vertical ones. This is needed + * to keep the UI useable on small form-factors like smartphones. + * + * Since: 41 + */ + obj_props[PROP_IS_NARROW] = + g_param_spec_boolean ("is-narrow", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + g_object_class_override_property (object_class, PROP_TITLE, "title"); + + /** + * GsDetailsPage::metainfo-loaded: + * @app: a #GsApp + * + * Emitted after a custom metainfo @app is loaded in the page, but before + * it's fully shown. + * + * Since: 42 + */ + signals[SIGNAL_METAINFO_LOADED] = + g_signal_new ("metainfo-loaded", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, GS_TYPE_APP); + + /** + * GsDetailsPage::app-clicked: + * @app: the #GsApp which was clicked on + * + * Emitted when one of the app tiles is clicked. Typically the caller + * should display the details of the given app in the callback. + * + * Since: 43 + */ + signals[SIGNAL_APP_CLICKED] = + g_signal_new ("app-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, GS_TYPE_APP); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-details-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, application_details_icon); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, application_details_summary); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, application_details_title); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_addons); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_details); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_details_description); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_details_header); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_details_header_not_icon); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_webapp_warning); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, star); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_review_count); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, screenshot_carousel); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, button_details_launch); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, links_stack); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_no_metadata_info); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, project_website_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, donate_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, translate_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, report_an_issue_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, help_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, contact_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, button_install); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, button_update); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, button_remove); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, button_cancel); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, infobar_details_eol); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_eol); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, infobar_details_problems_label); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, infobar_details_app_norepo); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, infobar_details_app_repo); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, infobar_details_package_baseos); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_package_baseos); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, infobar_details_repo); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, infobar_app_data); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, infobar_app_data_label); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, context_bar); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_progress_percentage); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_progress_status); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, developer_name_label); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, developer_verified_image); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, developer_verified_label); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, page_failed); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, list_box_addons); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, list_box_featured_review); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, list_box_reviews_summary); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, list_box_version_history); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, row_latest_version); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, version_history_button_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_reviews); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_reviews_internal); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, histogram); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, histogram_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, write_review_button_row); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, scrolledwindow_details); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, stack_details); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_with_source); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, origin_popover); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, origin_popover_list_box); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, origin_box); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, origin_packaging_image); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, origin_packaging_label); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_license); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, license_tile); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, translation_banner); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, developer_apps_heading); + gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_developer_apps); + + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_link_row_activated_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_license_tile_get_involved_activated_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_translation_banner_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_star_pressed_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_app_install_button_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_app_update_button_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_app_remove_button_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_app_cancel_button_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_app_launch_button_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_details_page_app_data_clear_button_cb); + gtk_widget_class_bind_template_callback (widget_class, origin_popover_row_activated_cb); + gtk_widget_class_bind_template_callback (widget_class, app_activated_cb); +} + +static gboolean +narrow_to_orientation (GBinding *binding, const GValue *from_value, GValue *to_value, gpointer user_data) +{ + if (g_value_get_boolean (from_value)) + g_value_set_enum (to_value, GTK_ORIENTATION_VERTICAL); + else + g_value_set_enum (to_value, GTK_ORIENTATION_HORIZONTAL); + + return TRUE; +} + +static gboolean +narrow_to_spacing (GBinding *binding, const GValue *from_value, GValue *to_value, gpointer user_data) +{ + if (g_value_get_boolean (from_value)) + g_value_set_int (to_value, 12); + else + g_value_set_int (to_value, 24); + + return TRUE; +} + +static gboolean +narrow_to_halign (GBinding *binding, const GValue *from_value, GValue *to_value, gpointer user_data) +{ + if (g_value_get_boolean (from_value)) + g_value_set_enum (to_value, GTK_ALIGN_START); + else + g_value_set_enum (to_value, GTK_ALIGN_END); + + return TRUE; +} + +static void +scrolledwindow_details_value_changed_cb (GtkAdjustment *adjustment, + GsDetailsPage *self) +{ + gboolean title_visible = gs_details_page_should_show_title (self); + if ((!title_visible) != (!self->title_visible)) + g_object_notify (G_OBJECT (self), "title"); +} + +static void +gs_details_page_init (GsDetailsPage *self) +{ + GtkAdjustment *adjustment; + + g_type_ensure (GS_TYPE_APP_CONTEXT_BAR); + g_type_ensure (GS_TYPE_APP_VERSION_HISTORY_ROW); + g_type_ensure (GS_TYPE_DESCRIPTION_BOX); + g_type_ensure (GS_TYPE_LICENSE_TILE); + g_type_ensure (GS_TYPE_PROGRESS_BUTTON); + g_type_ensure (GS_TYPE_REVIEW_HISTOGRAM); + g_type_ensure (GS_TYPE_SCREENSHOT_CAROUSEL); + g_type_ensure (GS_TYPE_STAR_WIDGET); + + gtk_widget_init_template (GTK_WIDGET (self)); + + self->settings = g_settings_new ("org.gnome.software"); + g_signal_connect_swapped (self->settings, "changed", + G_CALLBACK (settings_changed_cb), + self); + self->app_info_monitor = g_app_info_monitor_get (); + g_signal_connect_object (self->app_info_monitor, "changed", + G_CALLBACK (gs_details_page_app_info_changed_cb), self, 0); + + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->list_box_addons), + list_sort_func, + self, NULL); + + g_signal_connect (self->list_box_addons, "row-activated", + G_CALLBACK (addons_list_row_activated_cb), self); + + g_signal_connect (self->list_box_version_history, "row-activated", + G_CALLBACK (version_history_list_row_activated_cb), self); + + g_signal_connect_swapped (self->list_box_reviews_summary, "row-activated", + G_CALLBACK (gs_details_page_write_review), self); + + g_signal_connect (self->list_box_featured_review, "row-activated", + G_CALLBACK (featured_review_list_row_activated_cb), self); + + gs_details_page_read_packaging_format_preference (self); + + g_object_bind_property_full (self, "is-narrow", self->box_details_header, "spacing", G_BINDING_SYNC_CREATE, + narrow_to_spacing, NULL, NULL, NULL); + g_object_bind_property_full (self, "is-narrow", self->box_with_source, "halign", G_BINDING_SYNC_CREATE, + narrow_to_halign, NULL, NULL, NULL); + g_object_bind_property_full (self, "is-narrow", self->box_license, "orientation", G_BINDING_SYNC_CREATE, + narrow_to_orientation, NULL, NULL, NULL); + g_object_bind_property_full (self, "is-narrow", self->context_bar, "orientation", G_BINDING_SYNC_CREATE, + narrow_to_orientation, NULL, NULL, NULL); + g_object_bind_property_full (self, "is-narrow", self->box_reviews_internal, "orientation", G_BINDING_SYNC_CREATE, + narrow_to_orientation, NULL, NULL, NULL); + + adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_details)); + g_signal_connect_object (adjustment, "value-changed", + G_CALLBACK (scrolledwindow_details_value_changed_cb), self, 0); +} + +GsDetailsPage * +gs_details_page_new (void) +{ + return GS_DETAILS_PAGE (g_object_new (GS_TYPE_DETAILS_PAGE, NULL)); +} + +/** + * gs_details_page_get_odrs_provider: + * @self: a #GsDetailsPage + * + * Get the value of #GsDetailsPage:odrs-provider. + * + * Returns: (nullable) (transfer none): a #GsOdrsProvider, or %NULL if unset + * Since: 41 + */ +GsOdrsProvider * +gs_details_page_get_odrs_provider (GsDetailsPage *self) +{ + g_return_val_if_fail (GS_IS_DETAILS_PAGE (self), NULL); + + return self->odrs_provider; +} + +/** + * gs_details_page_set_odrs_provider: + * @self: a #GsDetailsPage + * @odrs_provider: (nullable) (transfer none): new #GsOdrsProvider or %NULL + * + * Set the value of #GsDetailsPage:odrs-provider. + * + * Since: 41 + */ +void +gs_details_page_set_odrs_provider (GsDetailsPage *self, + GsOdrsProvider *odrs_provider) +{ + g_return_if_fail (GS_IS_DETAILS_PAGE (self)); + g_return_if_fail (odrs_provider == NULL || GS_IS_ODRS_PROVIDER (odrs_provider)); + + if (g_set_object (&self->odrs_provider, odrs_provider)) { + gs_details_page_refresh_reviews (self); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_ODRS_PROVIDER]); + } +} + +/** + * gs_details_page_get_is_narrow: + * @self: a #GsDetailsPage + * + * Get the value of #GsDetailsPage:is-narrow. + * + * Returns: %TRUE if the page is in narrow mode, %FALSE otherwise + * + * Since: 41 + */ +gboolean +gs_details_page_get_is_narrow (GsDetailsPage *self) +{ + g_return_val_if_fail (GS_IS_DETAILS_PAGE (self), FALSE); + + return self->is_narrow; +} + +/** + * gs_details_page_set_is_narrow: + * @self: a #GsDetailsPage + * @is_narrow: %TRUE to set the page in narrow mode, %FALSE otherwise + * + * Set the value of #GsDetailsPage:is-narrow. + * + * Since: 41 + */ +void +gs_details_page_set_is_narrow (GsDetailsPage *self, gboolean is_narrow) +{ + g_return_if_fail (GS_IS_DETAILS_PAGE (self)); + + is_narrow = !!is_narrow; + + if (self->is_narrow == is_narrow) + return; + + self->is_narrow = is_narrow; + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_IS_NARROW]); +} + +static void +gs_details_page_metainfo_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (source_object); + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + + app = g_task_propagate_pointer (G_TASK (result), &error); + if (error) { + adw_status_page_set_description (ADW_STATUS_PAGE (self->page_failed), error->message); + gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_FAILED); + return; + } + + g_set_object (&self->app_local_file, app); + _set_app (self, app); + gs_details_page_load_stage2 (self, FALSE); + + g_signal_emit (self, signals[SIGNAL_METAINFO_LOADED], 0, app); +} + +static void +gs_details_page_metainfo_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GsDetailsPage *self = GS_DETAILS_PAGE (g_task_get_source_object (task)); + g_autofree gchar *path = NULL; + g_autofree gchar *icon_path = NULL; + g_autoptr(XbBuilder) builder = NULL; + g_autoptr(XbBuilderSource) builder_source = NULL; + g_autoptr(XbSilo) silo = NULL; + g_autoptr(GPtrArray) nodes = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GFile) tmp_file = NULL; + GFile *file = task_data; + XbNode *component; + + path = g_file_get_path (file); + if (path && strstr (path, ",icon=")) { + gchar *pos = strstr (path, ",icon="); + + *pos = '\0'; + + tmp_file = g_file_new_for_path (path); + file = tmp_file; + + pos += 6; + if (*pos) + icon_path = g_strdup (pos); + } + g_clear_pointer (&path, g_free); + + builder_source = xb_builder_source_new (); + if (!xb_builder_source_load_file (builder_source, file, XB_BUILDER_SOURCE_FLAG_NONE, cancellable, &error)) { + g_task_return_error (task, g_steal_pointer (&error)); + return; + } + + builder = xb_builder_new (); + + gs_appstream_add_current_locales (builder); + + xb_builder_import_source (builder, builder_source); + + silo = xb_builder_compile (builder, XB_BUILDER_COMPILE_FLAG_IGNORE_INVALID | XB_BUILDER_COMPILE_FLAG_SINGLE_LANG, cancellable, &error); + if (silo == NULL) { + g_task_return_error (task, g_steal_pointer (&error)); + return; + } + + nodes = xb_silo_query (silo, "component", 0, NULL); + if (nodes == NULL) + nodes = xb_silo_query (silo, "application", 0, NULL); + if (nodes == NULL) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "%s", + "Passed-in file doesn't have a 'component' (nor 'app') top-level element"); + return; + } + + if (nodes->len != 1) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "Only one top-level element expected, received %u instead", nodes->len); + return; + } + + component = g_ptr_array_index (nodes, 0); + + app = gs_appstream_create_app (NULL, silo, component, NULL, AS_COMPONENT_SCOPE_UNKNOWN, &error); + if (app == NULL) { + g_task_return_error (task, g_steal_pointer (&error)); + return; + } + + if (!gs_appstream_refine_app (NULL, app, silo, component, GS_DETAILS_PAGE_REFINE_FLAGS, NULL, NULL, AS_COMPONENT_SCOPE_UNKNOWN, &error)) { + g_task_return_error (task, g_steal_pointer (&error)); + return; + } + + path = g_file_get_path (file); + gs_app_set_origin (app, path); + + if (icon_path) { + g_autoptr(GFile) icon_file = g_file_new_for_path (icon_path); + g_autoptr(GIcon) icon = g_file_icon_new (icon_file); + gs_icon_set_width (icon, (guint) -1); + gs_app_add_icon (app, G_ICON (icon)); + } else { + g_autoptr(SoupSession) soup_session = NULL; + guint maximum_icon_size, scale; + + /* Currently a 160px icon is needed for #GsFeatureTile, at most. + */ + maximum_icon_size = 160; + scale = gtk_widget_get_scale_factor (GTK_WIDGET (self)); + + soup_session = gs_build_soup_session (); + gs_app_ensure_icons_downloaded (app, soup_session, maximum_icon_size, scale, cancellable); + } + + gs_app_set_state (app, GS_APP_STATE_UNKNOWN); + + g_task_return_pointer (task, g_steal_pointer (&app), g_object_unref); +} + +/** + * gs_details_page_set_metainfo: + * @self: a #GsDetailsPage + * @file: path to a metainfo file to display + * + * Load and show the given metainfo @file on the details page. + * + * The file must be a single metainfo file, not an appstream file + * containing multiple components. It will be shown as if it came + * from a configured repository. This function is intended to be + * used by application developers wanting to test how their metainfo + * will appear to users. + * + * Since: 42 + */ +void +gs_details_page_set_metainfo (GsDetailsPage *self, + GFile *file) +{ + g_autoptr(GTask) task = NULL; + + g_return_if_fail (GS_IS_DETAILS_PAGE (self)); + g_return_if_fail (G_IS_FILE (file)); + gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_LOADING); + g_clear_object (&self->app_local_file); + _set_app (self, NULL); + self->origin_by_packaging_format = FALSE; + task = g_task_new (self, self->cancellable, gs_details_page_metainfo_ready_cb, NULL); + g_task_set_source_tag (task, gs_details_page_set_metainfo); + g_task_set_task_data (task, g_object_ref (file), g_object_unref); + g_task_run_in_thread (task, gs_details_page_metainfo_thread); +} + +gdouble +gs_details_page_get_vscroll_position (GsDetailsPage *self) +{ + GtkAdjustment *adj; + + g_return_val_if_fail (GS_IS_DETAILS_PAGE (self), -1); + + adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_details)); + return gtk_adjustment_get_value (adj); +} + +void +gs_details_page_set_vscroll_position (GsDetailsPage *self, + gdouble value) +{ + GtkAdjustment *adj; + + g_return_if_fail (GS_IS_DETAILS_PAGE (self)); + + adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_details)); + if (value >= 0.0) + gtk_adjustment_set_value (adj, value); +} + diff --git a/src/gs-details-page.h b/src/gs-details-page.h new file mode 100644 index 0000000..316131d --- /dev/null +++ b/src/gs-details-page.h @@ -0,0 +1,44 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_DETAILS_PAGE (gs_details_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsDetailsPage, gs_details_page, GS, DETAILS_PAGE, GsPage) + +GsDetailsPage *gs_details_page_new (void); +void gs_details_page_set_app (GsDetailsPage *self, + GsApp *app); +void gs_details_page_set_local_file(GsDetailsPage *self, + GFile *file); +void gs_details_page_set_url (GsDetailsPage *self, + const gchar *url); +GsApp *gs_details_page_get_app (GsDetailsPage *self); + +GsOdrsProvider *gs_details_page_get_odrs_provider (GsDetailsPage *self); +void gs_details_page_set_odrs_provider (GsDetailsPage *self, + GsOdrsProvider *odrs_provider); + +gboolean gs_details_page_get_is_narrow (GsDetailsPage *self); +void gs_details_page_set_is_narrow (GsDetailsPage *self, + gboolean is_narrow); +void gs_details_page_set_metainfo (GsDetailsPage *self, + GFile *file); +gdouble gs_details_page_get_vscroll_position + (GsDetailsPage *self); +void gs_details_page_set_vscroll_position + (GsDetailsPage *self, + gdouble value); + +G_END_DECLS diff --git a/src/gs-details-page.ui b/src/gs-details-page.ui new file mode 100644 index 0000000..460ea92 --- /dev/null +++ b/src/gs-details-page.ui @@ -0,0 +1,1230 @@ + + + + + + + + + + + + + + False + + + + true + true + 600 + true + + + none + true + start + + + + + + + + horizontal + + + + + + + + + + + + + + + + + diff --git a/src/gs-dkms-dialog.c b/src/gs-dkms-dialog.c new file mode 100644 index 0000000..2736008 --- /dev/null +++ b/src/gs-dkms-dialog.c @@ -0,0 +1,273 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "config.h" + +#include +#include + +#include "gs-common.h" +#include "gs-dkms-private.h" + +#include "gs-dkms-dialog.h" + +#define PASSWORD_LEN 4 + +struct _GsDkmsDialog +{ + AdwDialog parent_instance; + + AdwNavigationView *navigation_view; + GtkLabel *password_label; + GtkWidget *apply_button; + + GsApp *app; + GCancellable *cancellable; + + gchar password[PASSWORD_LEN + 1]; +}; + +typedef enum { + PROP_APP = 1, +} GsDkmsDialogProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +G_DEFINE_TYPE (GsDkmsDialog, gs_dkms_dialog, ADW_TYPE_DIALOG) + +static void +gs_dkms_dialog_cancel_button_clicked_cb (GtkWidget *button, + GsDkmsDialog *self) +{ + if (self->cancellable != NULL) + g_cancellable_cancel (self->cancellable); + + adw_dialog_force_close (ADW_DIALOG (self)); +} + +static void +gs_dkms_dialog_prepare_reboot_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GError) local_error = NULL; + + if (!g_task_propagate_boolean (G_TASK (result), &local_error)) { + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + g_debug ("dkms-dialog: Failed to prepare reboot: %s", local_error->message); + /* The code 126 is returned when the admin/root password prompt is dismissed */ + if (!g_error_matches (local_error, G_SPAWN_EXIT_ERROR, 126)) { + gs_utils_show_error_dialog (GTK_WIDGET (source_object), + _("Failed to prepare reboot"), + "", + local_error->message); + } + } else { + gs_utils_invoke_reboot_async (NULL, NULL, NULL); + adw_dialog_force_close (ADW_DIALOG (source_object)); + } +} + +static void +gs_dkms_dialog_enrolled_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GTask) task = user_data; + g_autoptr(GError) local_error = NULL; + GsDkmsState state; + + state = gs_dkms_enroll_finish (result, &local_error); + + if (local_error == NULL) { + /* needs an explicit GError, no tell the user what failed and to not continue with the reboot */ + switch (state) { + default: + case GS_DKMS_STATE_ERROR: + g_set_error_literal (&local_error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Unknown error")); + break; + case GS_DKMS_STATE_ENROLLED: + case GS_DKMS_STATE_PENDING: + break; + case GS_DKMS_STATE_NOT_FOUND: + g_set_error_literal (&local_error, G_IO_ERROR, G_IO_ERROR_FAILED, _("The key was not found")); + break; + case GS_DKMS_STATE_NOT_ENROLLED: + g_set_error_literal (&local_error, G_IO_ERROR, G_IO_ERROR_FAILED, _("The key is not enrolled")); + break; + } + } + + if (local_error != NULL) + g_task_return_error (task, g_steal_pointer (&local_error)); + else + g_task_return_boolean (task, TRUE); +} + +static void +gs_dkms_dialog_apply_button_clicked_cb (GtkWidget *button, + GsDkmsDialog *self) +{ + g_autoptr(GTask) task = NULL; + GsDkmsKeyKind key_kind; + + if (self->cancellable != NULL) { + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + } + + self->cancellable = g_cancellable_new (); + + task = g_task_new (self, self->cancellable, gs_dkms_dialog_prepare_reboot_cb, NULL); + g_task_set_source_tag (task, gs_dkms_dialog_apply_button_clicked_cb); + if (g_strcmp0 (gs_app_get_metadata_item (self->app, "GnomeSoftware::requires-dkms-key"), "True") == 0) + key_kind = GS_DKMS_KEY_KIND_DKMS; + else if (g_strcmp0 (gs_app_get_metadata_item (self->app, "GnomeSoftware::requires-akmods-key"), "True") == 0) + key_kind = GS_DKMS_KEY_KIND_AKMODS; + else + g_assert_not_reached (); + + gs_dkms_enroll_async (key_kind, self->password, self->cancellable, gs_dkms_dialog_enrolled_cb, g_steal_pointer (&task)); +} + +static void +gs_dkms_dialog_next_button_clicked_cb (GtkWidget *button, + GsDkmsDialog *self) +{ + adw_navigation_view_push_by_tag (self->navigation_view, "final-page"); +} + +static void +gs_dkms_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsDkmsDialog *self = GS_DKMS_DIALOG (object); + + switch ((GsDkmsDialogProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, self->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_dkms_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsDkmsDialog *self = GS_DKMS_DIALOG (object); + + switch ((GsDkmsDialogProperty) prop_id) { + case PROP_APP: + g_assert (self->app == NULL); + self->app = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_dkms_dialog_constructed (GObject *object) +{ + GsDkmsDialog *self = GS_DKMS_DIALOG (object); + + G_OBJECT_CLASS (gs_dkms_dialog_parent_class)->constructed (object); + + gtk_label_set_label (self->password_label, self->password); +} + +static void +gs_dkms_dialog_dispose (GObject *object) +{ + GsDkmsDialog *self = GS_DKMS_DIALOG (object); + + if (self->cancellable) { + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + } + + g_clear_object (&self->app); + + G_OBJECT_CLASS (gs_dkms_dialog_parent_class)->dispose (object); +} + +static void +gs_dkms_dialog_class_init (GsDkmsDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_dkms_dialog_get_property; + object_class->set_property = gs_dkms_dialog_set_property; + object_class->constructed = gs_dkms_dialog_constructed; + object_class->dispose = gs_dkms_dialog_dispose; + + /* + * GsDkmsDialog:app: (nullable) + * + * The app to display the dialog for. + * + * This may be %NULL; if so, the content of the widget will be + * undefined. + * + * Since: 47 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-dkms-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsDkmsDialog, navigation_view); + gtk_widget_class_bind_template_child (widget_class, GsDkmsDialog, password_label); + gtk_widget_class_bind_template_child (widget_class, GsDkmsDialog, apply_button); + gtk_widget_class_bind_template_callback (widget_class, gs_dkms_dialog_cancel_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_dkms_dialog_apply_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_dkms_dialog_next_button_clicked_cb); +} + +static void +gs_dkms_dialog_init (GsDkmsDialog *self) +{ + g_autoptr(GRand) rand = NULL; + + gtk_widget_init_template (GTK_WIDGET (self)); + + /* hide leftover notification, if any */ + g_application_withdraw_notification (g_application_get_default (), "dkms-key-pending"); + + rand = g_rand_new_with_seed ((guint32) g_get_real_time ()); + for (guint i = 0; i < PASSWORD_LEN; i++) { + self->password[i] = '0' + g_rand_int_range (rand, 1, 10); + } + + self->password[PASSWORD_LEN] = '\0'; +} + +void +gs_dkms_dialog_run (GtkWidget *parent, + GsApp *app) +{ + GsDkmsDialog *self; + + self = g_object_new (GS_TYPE_DKMS_DIALOG, + "app", app, + NULL); + adw_dialog_present (ADW_DIALOG (self), parent); +} diff --git a/src/gs-dkms-dialog.h b/src/gs-dkms-dialog.h new file mode 100644 index 0000000..dead7b0 --- /dev/null +++ b/src/gs-dkms-dialog.h @@ -0,0 +1,23 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2024 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include "gs-app.h" + +G_BEGIN_DECLS + +#define GS_TYPE_DKMS_DIALOG (gs_dkms_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsDkmsDialog, gs_dkms_dialog, GS, DKMS_DIALOG, AdwDialog) + +void gs_dkms_dialog_run (GtkWidget *parent, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-dkms-dialog.ui b/src/gs-dkms-dialog.ui new file mode 100644 index 0000000..0f92023 --- /dev/null +++ b/src/gs-dkms-dialog.ui @@ -0,0 +1,264 @@ + + + + + + + diff --git a/src/gs-extras-page.c b/src/gs-extras-page.c new file mode 100644 index 0000000..52f0ec6 --- /dev/null +++ b/src/gs-extras-page.c @@ -0,0 +1,1448 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2015-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-extras-page.h" + +#include "gs-app-row.h" +#include "gs-application.h" +#include "gs-language.h" +#include "gs-shell.h" +#include "gs-common.h" +#include "gs-utils.h" +#include "gs-vendor.h" + +#include + +typedef enum { + GS_EXTRAS_PAGE_STATE_LOADING, + GS_EXTRAS_PAGE_STATE_READY, + GS_EXTRAS_PAGE_STATE_NO_RESULTS, + GS_EXTRAS_PAGE_STATE_FAILED +} GsExtrasPageState; + +typedef struct { + gchar *title; + gchar *search; + GsAppQueryProvidesType search_provides_type; + gchar *search_filename; + gchar *package_filename; + gchar *url_not_found; + GsExtrasPage *self; +} SearchData; + +struct _GsExtrasPage +{ + GsPage parent_instance; + + GsPluginLoader *plugin_loader; + GCancellable *search_cancellable; + GsShell *shell; + GsExtrasPageState state; + GtkSizeGroup *sizegroup_name; + GtkSizeGroup *sizegroup_button_label; + GtkSizeGroup *sizegroup_button_image; + GPtrArray *array_search_data; + GsExtrasPageMode mode; + GsLanguage *language; + GsVendor *vendor; + guint pending_search_cnt; + gchar *caller_app_name; + gchar *install_resources_ident; + + AdwStatusPage *failed_page; + AdwStatusPage *no_results_page; + GtkWidget *list_box_results; + GtkWidget *scrolledwindow; + GtkWidget *stack; + GtkWidget *button_install_all; +}; + +G_DEFINE_TYPE (GsExtrasPage, gs_extras_page, GS_TYPE_PAGE) + +typedef enum { + PROP_VADJUSTMENT = 1, + PROP_TITLE, +} GsExtrasPageProperty; + +static void +search_data_free (SearchData *search_data) +{ + if (search_data->self != NULL) + g_object_unref (search_data->self); + g_free (search_data->title); + g_free (search_data->search); + g_free (search_data->search_filename); + g_free (search_data->package_filename); + g_free (search_data->url_not_found); + g_slice_free (SearchData, search_data); +} + +static GsExtrasPageMode +gs_extras_page_mode_from_string (const gchar *str) +{ + if (g_strcmp0 (str, "install-package-files") == 0) + return GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES; + if (g_strcmp0 (str, "install-provide-files") == 0) + return GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES; + if (g_strcmp0 (str, "install-package-names") == 0) + return GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES; + if (g_strcmp0 (str, "install-mime-types") == 0) + return GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES; + if (g_strcmp0 (str, "install-fontconfig-resources") == 0) + return GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES; + if (g_strcmp0 (str, "install-gstreamer-resources") == 0) + return GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES; + if (g_strcmp0 (str, "install-plasma-resources") == 0) + return GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES; + if (g_strcmp0 (str, "install-printer-drivers") == 0) + return GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS; + + g_assert_not_reached (); +} + +const gchar * +gs_extras_page_mode_to_string (GsExtrasPageMode mode) +{ + if (mode == GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES) + return "install-package-files"; + if (mode == GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES) + return "install-provide-files"; + if (mode == GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES) + return "install-package-names"; + if (mode == GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES) + return "install-mime-types"; + if (mode == GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES) + return "install-fontconfig-resources"; + if (mode == GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES) + return "install-gstreamer-resources"; + if (mode == GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES) + return "install-plasma-resources"; + if (mode == GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS) + return "install-printer-drivers"; + + g_assert_not_reached (); +} + +static gchar * +build_comma_separated_list (gchar **items) +{ + guint len; + + len = g_strv_length (items); + if (len == 2) { + /* TRANSLATORS: separator for a list of items */ + return g_strjoinv (_(" and "), items); + } else { + /* TRANSLATORS: separator for a list of items */ + return g_strjoinv (_(", "), items); + } +} + +static gchar * +build_title (GsExtrasPage *self) +{ + guint i; + g_autofree gchar *titles = NULL; + g_autoptr(GPtrArray) title_array = NULL; + + title_array = g_ptr_array_new (); + for (i = 0; i < self->array_search_data->len; i++) { + SearchData *search_data; + + search_data = g_ptr_array_index (self->array_search_data, i); + g_ptr_array_add (title_array, search_data->title); + } + g_ptr_array_add (title_array, NULL); + + titles = build_comma_separated_list ((gchar **) title_array->pdata); + + switch (self->mode) { + case GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES: + /* TRANSLATORS: App window title for fonts installation. + %s will be replaced by name of the script we're searching for. */ + return g_strdup_printf (ngettext ("Available fonts for the %s script", + "Available fonts for the %s scripts", + self->array_search_data->len), + titles); + break; + default: + /* TRANSLATORS: App window title for codec installation. + %s will be replaced by actual codec name(s) */ + return g_strdup_printf (ngettext ("Available software for %s", + "Available software for %s", + self->array_search_data->len), + titles); + break; + } +} + +static void +gs_extras_page_update_ui_state (GsExtrasPage *self) +{ + if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_EXTRAS) + return; + + /* stack */ + switch (self->state) { + case GS_EXTRAS_PAGE_STATE_LOADING: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "spinner"); + break; + case GS_EXTRAS_PAGE_STATE_READY: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "results"); + break; + case GS_EXTRAS_PAGE_STATE_NO_RESULTS: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "no-results"); + break; + case GS_EXTRAS_PAGE_STATE_FAILED: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "failed"); + break; + default: + g_assert_not_reached (); + break; + } +} + +static void +gs_extras_page_maybe_emit_installed_resources_done (GsExtrasPage *self) +{ + if (self->install_resources_ident && ( + self->state == GS_EXTRAS_PAGE_STATE_LOADING || + self->state == GS_EXTRAS_PAGE_STATE_NO_RESULTS || + self->state == GS_EXTRAS_PAGE_STATE_FAILED)) { + GsApplication *application; + GError *op_error = NULL; + + /* When called during the LOADING state, it means the package is already installed */ + if (self->state == GS_EXTRAS_PAGE_STATE_NO_RESULTS) { + g_set_error_literal (&op_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("Requested software not found")); + } else if (self->state == GS_EXTRAS_PAGE_STATE_FAILED) { + g_set_error_literal (&op_error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Failed to find requested software")); + } + + application = GS_APPLICATION (g_application_get_default ()); + gs_application_emit_install_resources_done (application, self->install_resources_ident, op_error); + + g_clear_pointer (&self->install_resources_ident, g_free); + g_clear_error (&op_error); + } +} + +static void +gs_extras_page_set_state (GsExtrasPage *self, + GsExtrasPageState state) +{ + if (self->state == state) + return; + + self->state = state; + + g_object_notify (G_OBJECT (self), "title"); + gs_extras_page_update_ui_state (self); + gs_extras_page_maybe_emit_installed_resources_done (self); +} + +static gboolean +gs_extras_page_can_install_app (GsApp *app) +{ + return gs_app_get_state (app) == GS_APP_STATE_AVAILABLE || + gs_app_get_state (app) == GS_APP_STATE_AVAILABLE_LOCAL || + (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE && gs_app_get_url_missing (app) == NULL); +} + +static void +app_row_button_clicked_cb (GsAppRow *app_row, + GsExtrasPage *self) +{ + GsApp *app = gs_app_row_get_app (app_row); + + if (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE && + gs_app_get_url_missing (app) != NULL) { + gs_shell_show_uri (self->shell, + gs_app_get_url_missing (app)); + } else if (gs_extras_page_can_install_app (app)) { + gs_page_install_app (GS_PAGE (self), app, GS_SHELL_INTERACTION_FULL, + self->search_cancellable); + } else if (gs_app_get_state (app) == GS_APP_STATE_INSTALLED) { + gs_page_remove_app (GS_PAGE (self), app, self->search_cancellable); + } else { + g_critical ("extras: app in unexpected state %u", gs_app_get_state (app)); + } +} + +static void +gs_extras_page_button_install_all_cb (GtkWidget *button, + GsExtrasPage *self) +{ + for (GtkWidget *child = gtk_widget_get_first_child (self->list_box_results); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + GsApp *app; + + /* Might be a separator from list_header_func(). */ + if (!GS_IS_APP_ROW (child)) + continue; + + app = gs_app_row_get_app (GS_APP_ROW (child)); + + if (gs_extras_page_can_install_app (app)) { + gs_page_install_app (GS_PAGE (self), app, GS_SHELL_INTERACTION_FULL, + self->search_cancellable); + } + } +} + +static void +gs_extras_page_app_notify_state_cb (GsApp *app, + GParamSpec *param, + GsExtrasPage *self) +{ + GtkWidget *child; + guint n_can_install = 0; + + /* No need to insensitive the button, when it's not visible */ + if (!gtk_widget_get_visible (self->button_install_all)) + return; + + if (gs_app_get_state (app) == GS_APP_STATE_INSTALLING || + gs_app_get_state (app) == GS_APP_STATE_REMOVING || + gs_app_get_state (app) == GS_APP_STATE_DOWNLOADING) { + gtk_widget_set_sensitive (self->button_install_all, FALSE); + return; + } + + for (child = gtk_widget_get_first_child (self->list_box_results); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + GsApp *existing_app; + + /* Might be a separator from list_header_func(). */ + if (!GS_IS_APP_ROW (child)) + continue; + + existing_app = gs_app_row_get_app (GS_APP_ROW (child)); + if (gs_extras_page_can_install_app (existing_app)) { + n_can_install++; + if (n_can_install > 1) + break; + } + } + + gtk_widget_set_sensitive (self->button_install_all, n_can_install > 1); +} + +static void +gs_extras_page_add_app (GsExtrasPage *self, GsApp *app, GsAppList *list, SearchData *search_data) +{ + GtkWidget *app_row, *child; + guint n_can_install = 0; + guint n_codecs = 0; + + /* Don't add same app twice */ + for (child = gtk_widget_get_first_child (self->list_box_results); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + GsApp *existing_app; + + /* Might be a separator from list_header_func(). */ + if (!GS_IS_APP_ROW (child)) + continue; + + existing_app = gs_app_row_get_app (GS_APP_ROW (child)); + if (app == existing_app) { + g_signal_handlers_disconnect_by_func (existing_app, G_CALLBACK (gs_extras_page_app_notify_state_cb), self); + gtk_list_box_remove (GTK_LIST_BOX (self->list_box_results), child); + } else { + if (gs_extras_page_can_install_app (existing_app)) + n_can_install++; + if (gs_app_get_kind (existing_app) == AS_COMPONENT_KIND_CODEC) + n_codecs++; + } + } + + if (gs_extras_page_can_install_app (app)) + n_can_install++; + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_CODEC) + n_codecs++; + + app_row = gs_app_row_new (app); + gs_app_row_set_colorful (GS_APP_ROW (app_row), TRUE); + gs_app_row_set_show_buttons (GS_APP_ROW (app_row), TRUE); + + g_object_set_data_full (G_OBJECT (app_row), "missing-title", g_strdup (search_data->title), g_free); + + g_signal_connect (app_row, "button-clicked", + G_CALLBACK (app_row_button_clicked_cb), + self); + g_signal_connect_object (app, "notify::state", G_CALLBACK (gs_extras_page_app_notify_state_cb), self, 0); + + gtk_list_box_append (GTK_LIST_BOX (self->list_box_results), app_row); + gs_app_row_set_size_groups (GS_APP_ROW (app_row), + self->sizegroup_name, + self->sizegroup_button_label, + self->sizegroup_button_image); + + gtk_widget_set_sensitive (self->button_install_all, TRUE); + /* let install in bulk only codecs */ + gtk_widget_set_visible (self->button_install_all, n_can_install > 1 && n_can_install == n_codecs); +} + +static GsApp * +create_missing_app (SearchData *search_data) +{ + GsExtrasPage *self = search_data->self; + GsApp *app; + GString *summary_missing; + g_autofree gchar *name = NULL; + g_autofree gchar *url = NULL; + + app = gs_app_new ("missing-codec"); + + /* TRANSLATORS: This string is used for codecs that weren't found */ + name = g_strdup_printf (_("%s not found"), search_data->title); + gs_app_set_name (app, GS_APP_QUALITY_HIGHEST, name); + + /* TRANSLATORS: hyperlink title */ + url = g_strdup_printf ("%s", search_data->url_not_found, _("on the website")); + + summary_missing = g_string_new (""); + switch (self->mode) { + case GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES: + /* TRANSLATORS: this is when we know about an app or + * addon, but it can't be listed for some reason */ + g_string_append_printf (summary_missing, _("No apps are available that provide the file %s."), search_data->title); + g_string_append (summary_missing, "\n"); + /* TRANSLATORS: first %s is the codec name, and second %s is a + * hyperlink with the "on the website" text */ + g_string_append_printf (summary_missing, _("Information about %s, as well as options " + "for how to get missing apps " + "might be found %s."), search_data->title, url); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES: + /* TRANSLATORS: this is when we know about an app or + * addon, but it can't be listed for some reason */ + g_string_append_printf (summary_missing, _("No apps are available for %s support."), search_data->title); + g_string_append (summary_missing, "\n"); + /* TRANSLATORS: first %s is the codec name, and second %s is a + * hyperlink with the "on the website" text */ + g_string_append_printf (summary_missing, _("Information about %s, as well as options " + "for how to get missing apps " + "might be found %s."), search_data->title, url); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES: + /* TRANSLATORS: this is when we know about an app or + * addon, but it can't be listed for some reason */ + g_string_append_printf (summary_missing, _("%s is not available."), search_data->title); + g_string_append (summary_missing, "\n"); + /* TRANSLATORS: first %s is the codec name, and second %s is a + * hyperlink with the "on the website" text */ + g_string_append_printf (summary_missing, _("Information about %s, as well as options " + "for how to get missing apps " + "might be found %s."), search_data->title, url); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES: + /* TRANSLATORS: this is when we know about an app or + * addon, but it can't be listed for some reason */ + g_string_append_printf (summary_missing, _("No apps are available for %s support."), search_data->title); + g_string_append (summary_missing, "\n"); + /* TRANSLATORS: first %s is the codec name, and second %s is a + * hyperlink with the "on the website" text */ + g_string_append_printf (summary_missing, _("Information about %s, as well as options " + "for how to get an app that can support this format " + "might be found %s."), search_data->title, url); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES: + /* TRANSLATORS: this is when we know about an app or + * addon, but it can't be listed for some reason */ + g_string_append_printf (summary_missing, _("No fonts are available for the %s script support."), search_data->title); + g_string_append (summary_missing, "\n"); + /* TRANSLATORS: first %s is the codec name, and second %s is a + * hyperlink with the "on the website" text */ + g_string_append_printf (summary_missing, _("Information about %s, as well as options " + "for how to get additional fonts " + "might be found %s."), search_data->title, url); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES: + /* TRANSLATORS: this is when we know about an app or + * addon, but it can't be listed for some reason */ + g_string_append_printf (summary_missing, _("No addon codecs are available for the %s format."), search_data->title); + g_string_append (summary_missing, "\n"); + /* TRANSLATORS: first %s is the codec name, and second %s is a + * hyperlink with the "on the website" text */ + g_string_append_printf (summary_missing, _("Information about %s, as well as options " + "for how to get a codec that can play this format " + "might be found %s."), search_data->title, url); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES: + /* TRANSLATORS: this is when we know about an app or + * addon, but it can't be listed for some reason */ + g_string_append_printf (summary_missing, _("No Plasma resources are available for %s support."), search_data->title); + g_string_append (summary_missing, "\n"); + /* TRANSLATORS: first %s is the codec name, and second %s is a + * hyperlink with the "on the website" text */ + g_string_append_printf (summary_missing, _("Information about %s, as well as options " + "for how to get additional Plasma resources " + "might be found %s."), search_data->title, url); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS: + /* TRANSLATORS: this is when we know about an app or + * addon, but it can't be listed for some reason */ + g_string_append_printf (summary_missing, _("No printer drivers are available for %s."), search_data->title); + g_string_append (summary_missing, "\n"); + /* TRANSLATORS: first %s is the codec name, and second %s is a + * hyperlink with the "on the website" text */ + g_string_append_printf (summary_missing, _("Information about %s, as well as options " + "for how to get a driver that supports this printer " + "might be found %s."), search_data->title, url); + + break; + default: + g_assert_not_reached (); + break; + } + gs_app_set_summary_missing (app, g_string_free (summary_missing, FALSE)); + + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + gs_app_set_url_missing (app, search_data->url_not_found); + + return app; +} + +static gchar * +build_no_results_label (GsExtrasPage *self) +{ + GsApp *app = NULL; + guint num = 0; + g_autofree gchar *codec_titles = NULL; + g_autofree gchar *url = NULL; + g_autoptr(GPtrArray) array = NULL; + GtkWidget *child; + + array = g_ptr_array_new (); + for (child = gtk_widget_get_first_child (self->list_box_results); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + /* Might be a separator from list_header_func(). */ + if (!GS_IS_APP_ROW (child)) + continue; + + app = gs_app_row_get_app (GS_APP_ROW (child)); + g_ptr_array_add (array, + g_object_get_data (G_OBJECT (child), "missing-title")); + num++; + } + g_ptr_array_add (array, NULL); + + url = g_strdup_printf ("%s", + gs_app_get_url_missing (app), + /* TRANSLATORS: hyperlink title */ + _("the documentation")); + + codec_titles = build_comma_separated_list ((gchar **) array->pdata); + if (self->caller_app_name) { + /* TRANSLATORS: no codecs were found. The first %s will be replaced by actual codec name(s), + the second %s is the app name, which requested the codecs, the third %s is a link titled "the documentation" */ + return g_strdup_printf (ngettext ("Unable to find the %s requested by %s. Please see %s for more information.", + "Unable to find the %s requested by %s. Please see %s for more information.", + num), + codec_titles, + self->caller_app_name, + url); + } + + /* TRANSLATORS: no codecs were found. First %s will be replaced by actual codec name(s), second %s is a link titled "the documentation" */ + return g_strdup_printf (ngettext ("Unable to find the %s you were searching for. Please see %s for more information.", + "Unable to find the %s you were searching for. Please see %s for more information.", + num), + codec_titles, + url); +} + +static void +show_search_results (GsExtrasPage *self) +{ + GtkWidget *first_child, *child; + GsApp *app; + guint n_children; + guint n_missing; + + /* count the number of rows with missing codecs */ + n_children = n_missing = 0; + first_child = gtk_widget_get_first_child (self->list_box_results); + for (child = first_child; + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + /* Might be a separator from list_header_func(). */ + if (!GS_IS_APP_ROW (child)) + continue; + + app = gs_app_row_get_app (GS_APP_ROW (child)); + if (g_strcmp0 (gs_app_get_id (app), "missing-codec") == 0) { + n_missing++; + } + n_children++; + } + + if (n_children == 0 || n_children == n_missing) { + g_autofree gchar *str = NULL; + + /* no results */ + g_debug ("extras: failed to find any results, %u", n_missing); + str = build_no_results_label (self); + adw_status_page_set_description (self->no_results_page, str); + gs_extras_page_set_state (self, GS_EXTRAS_PAGE_STATE_NO_RESULTS); + } else { + /* show what we got */ + g_debug ("extras: got %u search results, showing", n_children); + gs_extras_page_set_state (self, GS_EXTRAS_PAGE_STATE_READY); + + if (n_children == 1) { + /* switch directly to details view */ + g_debug ("extras: found one result, showing in details view"); + g_assert (first_child != NULL); + app = gs_app_row_get_app (GS_APP_ROW (first_child)); + gs_shell_show_app (self->shell, app); + if (gs_app_is_installed (app)) + gs_extras_page_maybe_emit_installed_resources_done (self); + } + } +} + +static void +search_files_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + SearchData *search_data = (SearchData *) user_data; + GsExtrasPage *self = search_data->self; + g_autoptr(GsAppList) list = NULL; + guint i; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) error = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + g_autofree gchar *str = NULL; + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("extras: search files cancelled"); + return; + } + g_warning ("failed to find any search results: %s", error->message); + str = g_strdup_printf (_("Failed to find any search results: %s"), error->message); + adw_status_page_set_description (self->failed_page, str); + gs_extras_page_set_state (self, GS_EXTRAS_PAGE_STATE_FAILED); + return; + } + + /* add missing item */ + if (gs_app_list_length (list) == 0) { + g_autoptr(GsApp) app = NULL; + g_debug ("extras: no search result for %s, showing as missing", + search_data->title); + app = create_missing_app (search_data); + gs_app_list_add (list, app); + } + + for (i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + g_debug ("%s\n\n", gs_app_to_string (app)); + gs_extras_page_add_app (self, app, list, search_data); + } + + self->pending_search_cnt--; + + /* have all searches finished? */ + if (self->pending_search_cnt == 0) + show_search_results (self); +} + +static void +file_to_app_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + SearchData *search_data = (SearchData *) user_data; + GsExtrasPage *self = search_data->self; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) error = NULL; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsAppList) list = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("extras: search what provides cancelled"); + return; + } + if (g_error_matches (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_FAILED)) { + g_debug ("extras: no search result for %s, showing as missing", search_data->title); + app = create_missing_app (search_data); + } else { + g_autofree gchar *str = NULL; + + g_warning ("failed to find any search results: %s", error->message); + str = g_strdup_printf (_("Failed to find any search results: %s"), error->message); + adw_status_page_set_description (self->failed_page, str); + gs_extras_page_set_state (self, GS_EXTRAS_PAGE_STATE_FAILED); + return; + } + } else { + app = g_object_ref (gs_app_list_index (list, 0)); + } + + g_debug ("%s\n\n", gs_app_to_string (app)); + gs_extras_page_add_app (self, app, list, search_data); + + self->pending_search_cnt--; + + /* have all searches finished? */ + if (self->pending_search_cnt == 0) + show_search_results (self); +} + +static void +get_search_what_provides_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + SearchData *search_data = (SearchData *) user_data; + GsExtrasPage *self = search_data->self; + g_autoptr(GsAppList) list = NULL; + guint i; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) error = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + g_autofree gchar *str = NULL; + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("extras: search what provides cancelled"); + return; + } + g_warning ("failed to find any search results: %s", error->message); + str = g_strdup_printf (_("Failed to find any search results: %s"), error->message); + adw_status_page_set_description (self->failed_page, str); + gs_extras_page_set_state (self, GS_EXTRAS_PAGE_STATE_FAILED); + return; + } + + /* add missing item */ + if (gs_app_list_length (list) == 0) { + g_autoptr(GsApp) app = NULL; + g_debug ("extras: no search result for %s, showing as missing", + search_data->title); + app = create_missing_app (search_data); + gs_app_list_add (list, app); + } + + for (i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + + g_debug ("%s\n\n", gs_app_to_string (app)); + gs_extras_page_add_app (self, app, list, search_data); + } + + self->pending_search_cnt--; + + /* have all searches finished? */ + if (self->pending_search_cnt == 0) + show_search_results (self); +} + +static void +gs_extras_page_load (GsExtrasPage *self, GPtrArray *array_search_data) +{ + GtkWidget *child; + guint i; + + /* cancel any pending searches */ + g_cancellable_cancel (self->search_cancellable); + g_clear_object (&self->search_cancellable); + self->search_cancellable = g_cancellable_new (); + + gtk_widget_set_visible (self->button_install_all, FALSE); + + if (array_search_data != NULL) { + if (self->array_search_data != NULL) + g_ptr_array_unref (self->array_search_data); + self->array_search_data = g_ptr_array_ref (array_search_data); + } + + self->pending_search_cnt = 0; + + /* remove old entries */ + while ((child = gtk_widget_get_first_child (self->list_box_results)) != NULL) { + if (GS_IS_APP_ROW (child)) { + GsApp *app = gs_app_row_get_app (GS_APP_ROW (child)); + g_signal_handlers_disconnect_by_func (app, G_CALLBACK (gs_extras_page_app_notify_state_cb), self); + } + + gtk_list_box_remove (GTK_LIST_BOX (self->list_box_results), child); + } + + /* set state as loading */ + self->state = GS_EXTRAS_PAGE_STATE_LOADING; + + /* start new searches, separate one for each codec */ + for (i = 0; i < self->array_search_data->len; i++) { + GsPluginRefineFlags refine_flags; + SearchData *search_data; + + refine_flags = GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_ALLOW_PACKAGES; + + search_data = g_ptr_array_index (self->array_search_data, i); + if (search_data->search_filename != NULL) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + const gchar *provides_files[2] = { search_data->search_filename, NULL }; + + query = gs_app_query_new ("provides-files", provides_files, + "refine-flags", refine_flags, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, + GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + + g_debug ("searching filename: '%s'", search_data->search_filename); + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->search_cancellable, + search_files_cb, + search_data); + } else if (search_data->package_filename != NULL) { + g_autoptr (GFile) file = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + file = g_file_new_for_path (search_data->package_filename); + plugin_job = gs_plugin_job_file_to_app_new (file, GS_PLUGIN_FILE_TO_APP_FLAGS_INTERACTIVE); + gs_plugin_job_set_refine_flags (plugin_job, refine_flags); + g_debug ("resolving filename to app: '%s'", search_data->package_filename); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->search_cancellable, + file_to_app_cb, + search_data); + } else { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + + query = gs_app_query_new ("provides-tag", search_data->search, + "provides-type", search_data->search_provides_type, + "refine-flags", refine_flags, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, + GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + + g_debug ("searching what provides: '%s'", search_data->search); + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->search_cancellable, + get_search_what_provides_cb, + search_data); + } + self->pending_search_cnt++; + } + + /* the page title will have changed */ + g_object_notify (G_OBJECT (self), "title"); +} + +static void +gs_extras_page_reload (GsPage *page) +{ + GsExtrasPage *self = GS_EXTRAS_PAGE (page); + if (self->array_search_data != NULL) + gs_extras_page_load (self, NULL); +} + +static void +gs_extras_page_search_package_files (GsExtrasPage *self, gchar **files) +{ + g_autoptr(GPtrArray) array_search_data = g_ptr_array_new_with_free_func ((GDestroyNotify) search_data_free); + guint i; + + for (i = 0; files[i] != NULL; i++) { + SearchData *search_data; + + search_data = g_slice_new0 (SearchData); + search_data->title = g_strdup (files[i]); + search_data->package_filename = g_strdup (files[i]); + search_data->url_not_found = gs_vendor_get_not_found_url (self->vendor, GS_VENDOR_URL_TYPE_DEFAULT); + search_data->self = g_object_ref (self); + g_ptr_array_add (array_search_data, search_data); + } + + gs_extras_page_load (self, array_search_data); +} + +static void +gs_extras_page_search_provide_files (GsExtrasPage *self, gchar **files) +{ + g_autoptr(GPtrArray) array_search_data = g_ptr_array_new_with_free_func ((GDestroyNotify) search_data_free); + guint i; + + for (i = 0; files[i] != NULL; i++) { + SearchData *search_data; + + search_data = g_slice_new0 (SearchData); + search_data->title = g_strdup (files[i]); + search_data->search_filename = g_strdup (files[i]); + search_data->url_not_found = gs_vendor_get_not_found_url (self->vendor, GS_VENDOR_URL_TYPE_DEFAULT); + search_data->self = g_object_ref (self); + g_ptr_array_add (array_search_data, search_data); + } + + gs_extras_page_load (self, array_search_data); +} + +static void +gs_extras_page_search_package_names (GsExtrasPage *self, gchar **package_names) +{ + g_autoptr(GPtrArray) array_search_data = g_ptr_array_new_with_free_func ((GDestroyNotify) search_data_free); + guint i; + + for (i = 0; package_names[i] != NULL; i++) { + SearchData *search_data; + + search_data = g_slice_new0 (SearchData); + search_data->title = g_strdup (package_names[i]); + search_data->search = g_strdup (package_names[i]); + search_data->search_provides_type = GS_APP_QUERY_PROVIDES_PACKAGE_NAME; + search_data->url_not_found = gs_vendor_get_not_found_url (self->vendor, GS_VENDOR_URL_TYPE_DEFAULT); + search_data->self = g_object_ref (self); + g_ptr_array_add (array_search_data, search_data); + } + + gs_extras_page_load (self, array_search_data); +} + +static void +gs_extras_page_search_mime_types (GsExtrasPage *self, gchar **mime_types) +{ + g_autoptr(GPtrArray) array_search_data = g_ptr_array_new_with_free_func ((GDestroyNotify) search_data_free); + guint i; + + for (i = 0; mime_types[i] != NULL; i++) { + SearchData *search_data; + + search_data = g_slice_new0 (SearchData); + search_data->title = g_strdup_printf (_("%s file format"), mime_types[i]); + search_data->search = g_strdup (mime_types[i]); + search_data->search_provides_type = GS_APP_QUERY_PROVIDES_MIME_HANDLER; + search_data->url_not_found = gs_vendor_get_not_found_url (self->vendor, GS_VENDOR_URL_TYPE_MIME); + search_data->self = g_object_ref (self); + g_ptr_array_add (array_search_data, search_data); + } + + gs_extras_page_load (self, array_search_data); +} + +static gchar * +font_tag_to_lang (const gchar *tag) +{ + if (g_str_has_prefix (tag, ":lang=")) + return g_strdup (tag + 6); + + return NULL; +} + +static gchar * +gs_extras_page_font_tag_to_localised_name (GsExtrasPage *self, const gchar *tag) +{ + gchar *name; + g_autofree gchar *lang = NULL; + g_autofree gchar *language = NULL; + + /* use fontconfig to get the language code */ + lang = font_tag_to_lang (tag); + if (lang == NULL) { + g_warning ("Could not parse language tag '%s'", tag); + return NULL; + } + + /* convert to localisable name */ + language = gs_language_iso639_to_language (self->language, lang); + if (language == NULL) { + g_warning ("Could not match language code '%s' to an ISO639 language", lang); + return NULL; + } + + /* get translation, or return untranslated string */ + name = g_strdup (dgettext("iso_639", language)); + if (name == NULL) + name = g_strdup (language); + + return name; +} + +static void +gs_extras_page_search_fontconfig_resources (GsExtrasPage *self, gchar **resources) +{ + g_autoptr(GPtrArray) array_search_data = g_ptr_array_new_with_free_func ((GDestroyNotify) search_data_free); + guint i; + + for (i = 0; resources[i] != NULL; i++) { + SearchData *search_data; + + search_data = g_slice_new0 (SearchData); + search_data->title = gs_extras_page_font_tag_to_localised_name (self, resources[i]); + search_data->search = g_strdup (resources[i]); + search_data->search_provides_type = GS_APP_QUERY_PROVIDES_FONT; + search_data->url_not_found = gs_vendor_get_not_found_url (self->vendor, GS_VENDOR_URL_TYPE_FONT); + search_data->self = g_object_ref (self); + g_ptr_array_add (array_search_data, search_data); + } + + gs_extras_page_load (self, array_search_data); +} + +static void +gs_extras_page_search_gstreamer_resources (GsExtrasPage *self, gchar **resources) +{ + g_autoptr(GPtrArray) array_search_data = g_ptr_array_new_with_free_func ((GDestroyNotify) search_data_free); + guint i; + + for (i = 0; resources[i] != NULL; i++) { + SearchData *search_data; + g_auto(GStrv) parts = NULL; + + parts = g_strsplit (resources[i], "|", 2); + + search_data = g_slice_new0 (SearchData); + search_data->title = g_strdup (parts[0]); + search_data->search = g_strdup (parts[1]); + search_data->search_provides_type = GS_APP_QUERY_PROVIDES_GSTREAMER; + search_data->url_not_found = gs_vendor_get_not_found_url (self->vendor, GS_VENDOR_URL_TYPE_CODEC); + search_data->self = g_object_ref (self); + g_ptr_array_add (array_search_data, search_data); + } + + gs_extras_page_load (self, array_search_data); +} + +static void +gs_extras_page_search_plasma_resources (GsExtrasPage *self, gchar **resources) +{ + g_autoptr(GPtrArray) array_search_data = g_ptr_array_new_with_free_func ((GDestroyNotify) search_data_free); + guint i; + + for (i = 0; resources[i] != NULL; i++) { + SearchData *search_data; + + search_data = g_slice_new0 (SearchData); + search_data->title = g_strdup (resources[i]); + search_data->search = g_strdup (resources[i]); + search_data->search_provides_type = GS_APP_QUERY_PROVIDES_PLASMA; + search_data->url_not_found = gs_vendor_get_not_found_url (self->vendor, GS_VENDOR_URL_TYPE_DEFAULT); + search_data->self = g_object_ref (self); + g_ptr_array_add (array_search_data, search_data); + } + + gs_extras_page_load (self, array_search_data); +} + +static void +gs_extras_page_search_printer_drivers (GsExtrasPage *self, gchar **device_ids) +{ + g_autoptr(GPtrArray) array_search_data = g_ptr_array_new_with_free_func ((GDestroyNotify) search_data_free); + guint i, j; + guint len; + + len = g_strv_length (device_ids); + if (len > 1) + /* hardcode for now as we only support one at a time */ + len = 1; + + /* make a list of provides tags */ + for (i = 0; i < len; i++) { + SearchData *search_data; + gchar *p; + g_autofree gchar *tag = NULL; + g_autofree gchar *mfg = NULL; + g_autofree gchar *mdl = NULL; + g_auto(GStrv) fields = NULL; + + fields = g_strsplit (device_ids[i], ";", 0); + for (j = 0; fields != NULL && fields[j] != NULL && (mfg == NULL || mdl == NULL); j++) { + if (mfg == NULL && g_str_has_prefix (fields[j], "MFG:")) + mfg = g_strdup (fields[j] + 4); + else if (mdl == NULL && g_str_has_prefix (fields[j], "MDL:")) + mdl = g_strdup (fields[j] + 4); + } + + if (!mfg || !mdl) { + g_warning("invalid line '%s', missing field", + device_ids[i]); + continue; + } + + tag = g_strdup_printf ("%s;%s;", mfg, mdl); + + /* Replace spaces with underscores */ + for (p = tag; *p != '\0'; p++) + if (*p == ' ') + *p = '_'; + + search_data = g_slice_new0 (SearchData); + search_data->title = g_strdup_printf ("%s %s", mfg, mdl); + search_data->search = g_ascii_strdown (tag, -1); + search_data->search_provides_type = GS_APP_QUERY_PROVIDES_PS_DRIVER; + search_data->url_not_found = gs_vendor_get_not_found_url (self->vendor, GS_VENDOR_URL_TYPE_HARDWARE); + search_data->self = g_object_ref (self); + g_ptr_array_add (array_search_data, search_data); + } + + gs_extras_page_load (self, array_search_data); +} + +static gchar * +gs_extras_page_get_app_name (const gchar *desktop_id) +{ + g_autoptr(GDesktopAppInfo) app_info = NULL; + + if (!desktop_id || !*desktop_id) + return NULL; + + app_info = g_desktop_app_info_new (desktop_id); + if (!app_info) + return NULL; + + return g_strdup (g_app_info_get_display_name (G_APP_INFO (app_info))); +} + +void +gs_extras_page_search (GsExtrasPage *self, + const gchar *mode_str, + gchar **resources, + const gchar *desktop_id, + const gchar *ident) +{ + GsExtrasPageMode old_mode; + + old_mode = self->mode; + self->mode = gs_extras_page_mode_from_string (mode_str); + + if (old_mode != self->mode) + g_object_notify (G_OBJECT (self), "title"); + + g_clear_pointer (&self->caller_app_name, g_free); + self->caller_app_name = gs_extras_page_get_app_name (desktop_id); + g_clear_pointer (&self->install_resources_ident, g_free); + self->install_resources_ident = (ident && *ident) ? g_strdup (ident) : NULL; + + switch (self->mode) { + case GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES: + gs_extras_page_search_package_files (self, resources); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES: + gs_extras_page_search_provide_files (self, resources); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES: + gs_extras_page_search_package_names (self, resources); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES: + gs_extras_page_search_mime_types (self, resources); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES: + gs_extras_page_search_fontconfig_resources (self, resources); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES: + gs_extras_page_search_gstreamer_resources (self, resources); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES: + gs_extras_page_search_plasma_resources (self, resources); + break; + case GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS: + gs_extras_page_search_printer_drivers (self, resources); + break; + default: + g_assert_not_reached (); + break; + } +} + +static void +gs_extras_page_switch_to (GsPage *page) +{ + GsExtrasPage *self = GS_EXTRAS_PAGE (page); + + if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_EXTRAS) { + g_warning ("Called switch_to(codecs) when in mode %s", + gs_shell_get_mode_string (self->shell)); + return; + } + + gs_extras_page_update_ui_state (self); +} + +static void +row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + GsExtrasPage *self) +{ + GsApp *app; + + app = gs_app_row_get_app (GS_APP_ROW (row)); + + if (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE && + gs_app_get_url_missing (app) != NULL) { + gs_shell_show_uri (self->shell, + gs_app_get_url_missing (app)); + } else { + gs_shell_show_app (self->shell, app); + } +} + +static gchar * +get_app_sort_key (GsApp *app) +{ + GString *key = NULL; + g_autofree gchar *sort_name = NULL; + + key = g_string_sized_new (64); + + /* sort missing apps as last */ + switch (gs_app_get_state (app)) { + case GS_APP_STATE_UNAVAILABLE: + g_string_append (key, "9:"); + break; + default: + g_string_append (key, "1:"); + break; + } + + /* finally, sort by short name */ + if (gs_app_get_name (app) != NULL) { + sort_name = gs_utils_sort_key (gs_app_get_name (app)); + g_string_append (key, sort_name); + } + + return g_string_free (key, FALSE); +} + +static gint +list_sort_func (GtkListBoxRow *a, + GtkListBoxRow *b, + gpointer user_data) +{ + GsApp *a1 = gs_app_row_get_app (GS_APP_ROW (a)); + GsApp *a2 = gs_app_row_get_app (GS_APP_ROW (b)); + g_autofree gchar *key1 = get_app_sort_key (a1); + g_autofree gchar *key2 = get_app_sort_key (a2); + + /* compare the keys according to the algorithm above */ + return g_strcmp0 (key1, key2); +} + +static void +list_header_func (GtkListBoxRow *row, + GtkListBoxRow *before, + gpointer user_data) +{ + GtkWidget *header; + + /* first entry */ + header = gtk_list_box_row_get_header (row); + if (before == NULL) { + gtk_list_box_row_set_header (row, NULL); + return; + } + + /* already set */ + if (header != NULL) + return; + + /* set new */ + header = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_list_box_row_set_header (row, header); +} + +static gboolean +gs_extras_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsExtrasPage *self = GS_EXTRAS_PAGE (page); + GtkWidget *box; + + g_return_val_if_fail (GS_IS_EXTRAS_PAGE (self), TRUE); + + self->shell = shell; + + self->plugin_loader = g_object_ref (plugin_loader); + + g_signal_connect (self->list_box_results, "row-activated", + G_CALLBACK (row_activated_cb), self); + gtk_list_box_set_header_func (GTK_LIST_BOX (self->list_box_results), + list_header_func, + self, NULL); + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->list_box_results), + list_sort_func, + self, NULL); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gs_page_set_header_end_widget (GS_PAGE (self), box); + self->button_install_all = gtk_button_new_with_mnemonic (_("Install _All")); + gtk_widget_set_visible (self->button_install_all, FALSE); + gtk_box_prepend (GTK_BOX (box), self->button_install_all); + g_signal_connect (self->button_install_all, "clicked", + G_CALLBACK (gs_extras_page_button_install_all_cb), + self); + + return TRUE; +} + +static void +gs_extras_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsExtrasPage *self = GS_EXTRAS_PAGE (object); + + switch ((GsExtrasPageProperty) prop_id) { + case PROP_VADJUSTMENT: + g_value_set_object (value, gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow))); + break; + case PROP_TITLE: + switch (self->state) { + case GS_EXTRAS_PAGE_STATE_LOADING: + case GS_EXTRAS_PAGE_STATE_READY: + g_value_take_string (value, build_title (self)); + break; + case GS_EXTRAS_PAGE_STATE_NO_RESULTS: + case GS_EXTRAS_PAGE_STATE_FAILED: + g_value_set_string (value, _("Unable to Find Requested Software")); + break; + default: + g_assert_not_reached (); + break; + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_extras_page_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch ((GsExtrasPageProperty) prop_id) { + case PROP_VADJUSTMENT: + case PROP_TITLE: + /* Read-only */ + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_extras_page_dispose (GObject *object) +{ + GsExtrasPage *self = GS_EXTRAS_PAGE (object); + + g_cancellable_cancel (self->search_cancellable); + g_clear_object (&self->search_cancellable); + + g_clear_object (&self->sizegroup_name); + g_clear_object (&self->sizegroup_button_label); + g_clear_object (&self->sizegroup_button_image); + g_clear_object (&self->language); + g_clear_object (&self->vendor); + g_clear_object (&self->plugin_loader); + + g_clear_pointer (&self->array_search_data, g_ptr_array_unref); + g_clear_pointer (&self->caller_app_name, g_free); + g_clear_pointer (&self->install_resources_ident, g_free); + + G_OBJECT_CLASS (gs_extras_page_parent_class)->dispose (object); +} + +static void +gs_extras_page_init (GsExtrasPage *self) +{ + g_autoptr(GError) error = NULL; + + gtk_widget_init_template (GTK_WIDGET (self)); + + self->state = GS_EXTRAS_PAGE_STATE_LOADING; + self->sizegroup_name = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_button_label = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_button_image = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->vendor = gs_vendor_new (); + + /* map ISO639 to language names */ + self->language = gs_language_new (); + gs_language_populate (self->language, &error); + if (error != NULL) + g_error ("Failed to map ISO639 to language names: %s", error->message); +} + +static void +gs_extras_page_class_init (GsExtrasPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPageClass *page_class = GS_PAGE_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_extras_page_get_property; + object_class->set_property = gs_extras_page_set_property; + object_class->dispose = gs_extras_page_dispose; + + page_class->switch_to = gs_extras_page_switch_to; + page_class->reload = gs_extras_page_reload; + page_class->setup = gs_extras_page_setup; + + g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment"); + g_object_class_override_property (object_class, PROP_TITLE, "title"); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-extras-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsExtrasPage, failed_page); + gtk_widget_class_bind_template_child (widget_class, GsExtrasPage, no_results_page); + gtk_widget_class_bind_template_child (widget_class, GsExtrasPage, list_box_results); + gtk_widget_class_bind_template_child (widget_class, GsExtrasPage, scrolledwindow); + gtk_widget_class_bind_template_child (widget_class, GsExtrasPage, stack); +} + +GsExtrasPage * +gs_extras_page_new (void) +{ + GsExtrasPage *self; + self = g_object_new (GS_TYPE_EXTRAS_PAGE, NULL); + return GS_EXTRAS_PAGE (self); +} diff --git a/src/gs-extras-page.h b/src/gs-extras-page.h new file mode 100644 index 0000000..aed7bbd --- /dev/null +++ b/src/gs-extras-page.h @@ -0,0 +1,41 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_EXTRAS_PAGE (gs_extras_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsExtrasPage, gs_extras_page, GS, EXTRAS_PAGE, GsPage) + +typedef enum { + GS_EXTRAS_PAGE_MODE_UNKNOWN, + GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES, + GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES, + GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES, + GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES, + GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES, + GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES, + GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES, + GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS, + GS_EXTRAS_PAGE_MODE_LAST +} GsExtrasPageMode; + +const gchar *gs_extras_page_mode_to_string (GsExtrasPageMode mode); +GsExtrasPage *gs_extras_page_new (void); +void gs_extras_page_search (GsExtrasPage *self, + const gchar *mode, + gchar **resources, + const gchar *desktop_id, + const gchar *ident); + +G_END_DECLS diff --git a/src/gs-extras-page.ui b/src/gs-extras-page.ui new file mode 100644 index 0000000..6533a6b --- /dev/null +++ b/src/gs-extras-page.ui @@ -0,0 +1,102 @@ + + + + + + diff --git a/src/gs-feature-tile.c b/src/gs-feature-tile.c new file mode 100644 index 0000000..3e1bde2 --- /dev/null +++ b/src/gs-feature-tile.c @@ -0,0 +1,774 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2019 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-feature-tile.h" +#include "gs-layout-manager.h" +#include "gs-common.h" +#include "gs-css.h" + +#define GS_TYPE_FEATURE_TILE_LAYOUT (gs_feature_tile_layout_get_type ()) +G_DECLARE_FINAL_TYPE (GsFeatureTileLayout, gs_feature_tile_layout, GS, FEATURE_TILE_LAYOUT, GsLayoutManager) + +struct _GsFeatureTileLayout +{ + GsLayoutManager parent_instance; + + gboolean narrow_mode; +}; + +G_DEFINE_TYPE (GsFeatureTileLayout, gs_feature_tile_layout, GS_TYPE_LAYOUT_MANAGER) + +enum { + SIGNAL_NARROW_MODE_CHANGED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +/* Foreground (text) colours for the feature tile, hard coded here because they + * can’t be queried from CSS unless they’re actively in use. */ +static const GdkRGBA fg_light_rgba = { 1.0, 1.0, 1.0, 1.0 }; +static const GdkRGBA fg_dark_rgba = { 0.0, 0.0, 0.0, 1.0 }; + +static void +gs_feature_tile_layout_allocate (GtkLayoutManager *layout_manager, + GtkWidget *widget, + gint width, + gint height, + gint baseline) +{ + GsFeatureTileLayout *self = GS_FEATURE_TILE_LAYOUT (layout_manager); + gboolean narrow_mode; + + GTK_LAYOUT_MANAGER_CLASS (gs_feature_tile_layout_parent_class)->allocate (layout_manager, + widget, width, height, baseline); + + /* Engage ‘narrow mode’ if the allocation becomes too narrow. The exact + * choice of width is arbitrary here. */ + narrow_mode = (width < 600); + if (self->narrow_mode != narrow_mode) { + self->narrow_mode = narrow_mode; + g_signal_emit (self, signals[SIGNAL_NARROW_MODE_CHANGED], 0, self->narrow_mode); + } +} + +static void +gs_feature_tile_layout_class_init (GsFeatureTileLayoutClass *klass) +{ + GtkLayoutManagerClass *layout_manager_class = GTK_LAYOUT_MANAGER_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + layout_manager_class->allocate = gs_feature_tile_layout_allocate; + + signals [SIGNAL_NARROW_MODE_CHANGED] = + g_signal_new ("narrow-mode-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); +} + +static void +gs_feature_tile_layout_init (GsFeatureTileLayout *self) +{ +} + +/* ********************************************************************* */ + +struct _GsFeatureTile +{ + GtkButton parent_instance; + GtkWidget *stack; + GtkWidget *image; + GtkWidget *title; + GtkWidget *subtitle; + const gchar *markup_cache; /* (unowned) (nullable) */ + GtkCssProvider *tile_provider; /* (owned) (nullable) */ + GtkCssProvider *title_provider; /* (owned) (nullable) */ + GtkCssProvider *subtitle_provider; /* (owned) (nullable) */ + GArray *key_colors_cache; /* (unowned) (nullable) */ + gboolean narrow_mode; + GsApp *app; + guint refresh_id; +}; + +typedef enum { + PROP_APP = 1, +} GsFeatureTileProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +static void gs_feature_tile_refresh (GsFeatureTile *self); + +static gboolean +gs_feature_tile_refresh_idle_cb (gpointer user_data) +{ + GsFeatureTile *tile = user_data; + + tile->refresh_id = 0; + + gs_feature_tile_refresh (tile); + + return G_SOURCE_REMOVE; +} + +static void +schedule_refresh (GsFeatureTile *self) +{ + /* Already pending */ + if (self->refresh_id != 0) + return; + + self->refresh_id = g_idle_add (gs_feature_tile_refresh_idle_cb, self); +} + +static void +gs_feature_tile_layout_narrow_mode_changed_cb (GtkLayoutManager *layout_manager, + gboolean narrow_mode, + gpointer user_data) +{ + GsFeatureTile *self = GS_FEATURE_TILE (user_data); + + if (self->narrow_mode != narrow_mode) { + self->narrow_mode = narrow_mode; + schedule_refresh (self); + } +} + +/* A colour represented in hue, saturation, brightness form; with an additional + * field for its contrast calculated with respect to some external colour. + * + * See https://en.wikipedia.org/wiki/HSL_and_HSV */ +typedef struct +{ + gfloat hue; /* [0.0, 1.0] */ + gfloat saturation; /* [0.0, 1.0] */ + gfloat brightness; /* [0.0, 1.0]; also known as lightness (HSL) or value (HSV) */ + gfloat contrast; /* (0.047, 21] */ +} GsHSBC; + +G_DEFINE_TYPE (GsFeatureTile, gs_feature_tile, GTK_TYPE_BUTTON) + +static void +gs_feature_tile_dispose (GObject *object) +{ + GsFeatureTile *tile = GS_FEATURE_TILE (object); + + gs_feature_tile_set_app (tile, NULL); + + g_clear_object (&tile->tile_provider); + g_clear_object (&tile->title_provider); + g_clear_object (&tile->subtitle_provider); + + G_OBJECT_CLASS (gs_feature_tile_parent_class)->dispose (object); +} + +static void +gs_feature_tile_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsFeatureTile *self = GS_FEATURE_TILE (object); + + switch ((GsFeatureTileProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, self->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_feature_tile_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsFeatureTile *self = GS_FEATURE_TILE (object); + + switch ((GsFeatureTileProperty) prop_id) { + case PROP_APP: + gs_feature_tile_set_app (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* These are subjectively chosen. See below. */ +static const gfloat min_valid_saturation = 0.5; +static const gfloat max_valid_saturation = 0.85; + +/* The minimum absolute contrast ratio between the foreground and background + * colours, from WCAG: + * https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html */ +static const gfloat min_abs_contrast = 4.5; + +/* Sort two candidate background colours for the feature tile, ranking them by + * suitability for being chosen as the background colour, with the most suitable + * first. + * + * There are several criteria being used here: + * 1. First, colours are sorted by whether their saturation is in the range + * [0.5, 0.85], which is a subjectively-chosen range of ‘light, but not too + * saturated’ colours. + * 2. Colours with saturation in that valid range are then sorted by contrast, + * with higher contrast being preferred. The contrast is calculated against + * an external colour by the caller. + * 3. Colours with saturation outside that valid range are sorted by their + * absolute distance from the range, so that colours which are nearer to + * having a valid saturation are preferred. This is useful in the case where + * none of the key colours in this array have valid saturations; the caller + * will want the one which is closest to being valid. + */ +static gboolean +saturation_is_valid (const GsHSBC *hsbc, + gfloat *distance_from_valid_range) +{ + *distance_from_valid_range = (hsbc->saturation > max_valid_saturation) ? hsbc->saturation - max_valid_saturation : min_valid_saturation - hsbc->saturation; + return (hsbc->saturation >= min_valid_saturation && hsbc->saturation <= max_valid_saturation); +} + +static gint +colors_sort_cb (gconstpointer a, + gconstpointer b) +{ + const GsHSBC *hsbc_a = a; + const GsHSBC *hsbc_b = b; + gfloat hsbc_a_distance_from_range, hsbc_b_distance_from_range; + gboolean hsbc_a_saturation_in_range = saturation_is_valid (hsbc_a, &hsbc_a_distance_from_range); + gboolean hsbc_b_saturation_in_range = saturation_is_valid (hsbc_b, &hsbc_b_distance_from_range); + + if (hsbc_a_saturation_in_range && !hsbc_b_saturation_in_range) + return -1; + else if (!hsbc_a_saturation_in_range && hsbc_b_saturation_in_range) + return 1; + else if (!hsbc_a_saturation_in_range && !hsbc_b_saturation_in_range) + return hsbc_a_distance_from_range - hsbc_b_distance_from_range; + else + return ABS (hsbc_b->contrast) - ABS (hsbc_a->contrast); +} + +static gint +colors_sort_contrast_cb (gconstpointer a, + gconstpointer b) +{ + const GsHSBC *hsbc_a = a; + const GsHSBC *hsbc_b = b; + + return hsbc_b->contrast - hsbc_a->contrast; +} + +/* Calculate the relative luminance of @colour. This is [0.0, 1.0], where 0.0 is + * the darkest black, and 1.0 is the lightest white. + * + * https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef */ +static gfloat +relative_luminance (const GsHSBC *colour) +{ + gfloat red, green, blue; + gfloat r, g, b; + gfloat luminance; + + /* Convert to sRGB */ + gtk_hsv_to_rgb (colour->hue, colour->saturation, colour->brightness, + &red, &green, &blue); + + r = (red <= 0.03928) ? red / 12.92 : pow ((red + 0.055) / 1.055, 2.4); + g = (green <= 0.03928) ? green / 12.92 : pow ((green + 0.055) / 1.055, 2.4); + b = (blue <= 0.03928) ? blue / 12.92 : pow ((blue + 0.055) / 1.055, 2.4); + + luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b; + g_assert (luminance >= 0.0 && luminance <= 1.0); + return luminance; +} + +/* Calculate the WCAG contrast ratio between the two colours. The returned ratio + * is in the range (0.047, 21]. + * + * https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html#contrast-ratiodef */ +static gfloat +wcag_contrast (const GsHSBC *foreground, + const GsHSBC *background) +{ + const GsHSBC *lighter, *darker; + gfloat ratio; + + if (foreground->brightness >= background->brightness) { + lighter = foreground; + darker = background; + } else { + lighter = background; + darker = foreground; + } + + ratio = (relative_luminance (lighter) + 0.05) / (relative_luminance (darker) + 0.05); + g_assert (ratio > 0.047 && ratio <= 21); + return ratio; +} + +/* Calculate a new brightness value for @background which improves its contrast + * (as calculated using wcag_contrast()) with @foreground to at least + * @desired_contrast. + * + * The return value is in the range [0.0, 1.0]. + */ +static gfloat +wcag_contrast_find_brightness (const GsHSBC *foreground, + const GsHSBC *background, + gfloat desired_contrast) +{ + GsHSBC modified_background; + + g_assert (desired_contrast > 0.047 && desired_contrast <= 21); + + /* This is an optimisation problem of modifying @background until + * the WCAG contrast is at least @desired_contrast. There might be a + * closed-form solution to this but I can’t be bothered to work it out + * right now. An optimisation loop should work. + * + * wcag_contrast() compares the lightest and darkest of the two colours, + * so ensure the background brightness is modified in the correct + * direction (increased or decreased) depending on whether the + * foreground colour is originally the brighter. This gives the largest + * search space for the background colour brightness, and ensures the + * optimisation works with dark and light themes. */ + for (modified_background = *background; + modified_background.brightness >= 0.0 && + modified_background.brightness <= 1.0 && + wcag_contrast (foreground, &modified_background) < desired_contrast; + modified_background.brightness += ((foreground->brightness > 0.5) ? -0.1 : 0.1)) { + /* Nothing to do here */ + } + + return CLAMP (modified_background.brightness, 0.0, 1.0); +} + +static void +gs_feature_tile_refresh (GsFeatureTile *tile) +{ + GsApp *app = tile->app; + const gchar *markup = NULL; + g_autofree gchar *name = NULL; + g_autoptr(GIcon) icon = NULL; + guint icon_size; + + if (app == NULL) + return; + + gtk_stack_set_visible_child_name (GTK_STACK (tile->stack), "content"); + + /* Set the narrow mode. */ + if (tile->narrow_mode) + gtk_widget_add_css_class (GTK_WIDGET (tile), "narrow"); + else + gtk_widget_remove_css_class (GTK_WIDGET (tile), "narrow"); + + /* Update the icon. Try a 160px version if not in narrow mode, and it’s + * available; otherwise use 128px. */ + if (!tile->narrow_mode) { + icon = gs_app_get_icon_for_size (app, + 160, + gtk_widget_get_scale_factor (tile->image), + NULL); + icon_size = 160; + } + if (icon == NULL) { + icon = gs_app_get_icon_for_size (app, + 128, + gtk_widget_get_scale_factor (tile->image), + NULL); + icon_size = 128; + } + + if (icon != NULL) { + gtk_image_set_from_gicon (GTK_IMAGE (tile->image), icon); + gtk_image_set_pixel_size (GTK_IMAGE (tile->image), icon_size); + gtk_widget_set_visible (tile->image, TRUE); + } else { + gtk_widget_set_visible (tile->image, FALSE); + } + + /* Update text and let it wrap if the widget is narrow. */ + gtk_label_set_label (GTK_LABEL (tile->title), gs_app_get_name (app)); + gtk_label_set_label (GTK_LABEL (tile->subtitle), gs_app_get_summary (app)); + + gtk_label_set_wrap (GTK_LABEL (tile->subtitle), tile->narrow_mode); + gtk_label_set_lines (GTK_LABEL (tile->subtitle), tile->narrow_mode ? 2 : 1); + + /* perhaps set custom css; cache it so that images don’t get reloaded + * unnecessarily. The custom CSS is direction-dependent, and will be + * reloaded when the direction changes. If RTL CSS isn’t set, fall back + * to the LTR CSS. */ + if (gtk_widget_get_direction (GTK_WIDGET (tile)) == GTK_TEXT_DIR_RTL) + markup = gs_app_get_metadata_item (app, "GnomeSoftware::FeatureTile-css-rtl"); + if (markup == NULL) + markup = gs_app_get_metadata_item (app, "GnomeSoftware::FeatureTile-css"); + + if (tile->markup_cache != markup && markup != NULL) { + g_autoptr(GsCss) css = gs_css_new (); + g_autofree gchar *modified_markup = gs_utils_set_key_colors_in_css (markup, app); + if (modified_markup != NULL) + gs_css_parse (css, modified_markup, NULL); + gs_utils_widget_set_css (GTK_WIDGET (tile), &tile->tile_provider, + gs_css_get_markup_for_id (css, "tile")); + gs_utils_widget_set_css (tile->title, &tile->title_provider, + gs_css_get_markup_for_id (css, "name")); + gs_utils_widget_set_css (tile->subtitle, &tile->subtitle_provider, + gs_css_get_markup_for_id (css, "summary")); + tile->markup_cache = markup; + } else if (markup == NULL) { + GdkRGBA chosen_color_by_app; + GsColorScheme color_scheme = adw_style_manager_get_dark (adw_style_manager_get_for_display ( + gtk_widget_get_display (GTK_WIDGET (tile)))) ? GS_COLOR_SCHEME_DARK : GS_COLOR_SCHEME_LIGHT; + if (gs_app_get_key_color_for_color_scheme (app, color_scheme, &chosen_color_by_app)) { + g_autofree gchar *css = NULL; + GsHSBC hsbc, fg_light_hsbc, fg_dark_hsbc; + GdkRGBA fg_rgba; + + /* Choose good contrast text color for the provided background */ + gtk_rgb_to_hsv (chosen_color_by_app.red, chosen_color_by_app.green, chosen_color_by_app.blue, + &hsbc.hue, &hsbc.saturation, &hsbc.brightness); + gtk_rgb_to_hsv (fg_light_rgba.red, fg_light_rgba.green, fg_light_rgba.blue, + &fg_light_hsbc.hue, &fg_light_hsbc.saturation, &fg_light_hsbc.brightness); + gtk_rgb_to_hsv (fg_dark_rgba.red, fg_dark_rgba.green, fg_dark_rgba.blue, + &fg_dark_hsbc.hue, &fg_dark_hsbc.saturation, &fg_dark_hsbc.brightness); + + /* Choose the foreground (text) colour by how well it contrasts with the app-controlled background colour */ + if (wcag_contrast (&fg_light_hsbc, &hsbc) >= wcag_contrast (&fg_dark_hsbc, &hsbc)) + fg_rgba = fg_light_rgba; + else + fg_rgba = fg_dark_rgba; + + g_debug ("Using provided background colour for %s color scheme for %s RGB: (%f, %f, %f) with text color RGB (%f, %f, %f)", + color_scheme == GS_COLOR_SCHEME_LIGHT ? "ligth" : "dark", + gs_app_get_id (app), + chosen_color_by_app.red, chosen_color_by_app.green, chosen_color_by_app.blue, + fg_rgba.red, fg_rgba.green, fg_rgba.blue); + + css = g_strdup_printf ("background-color: rgb(%.0f,%.0f,%.0f); color: rgb(%.0f,%.0f,%.0f);", + chosen_color_by_app.red * 255.f, + chosen_color_by_app.green * 255.f, + chosen_color_by_app.blue * 255.f, + fg_rgba.red * 255.f, + fg_rgba.green * 255.f, + fg_rgba.blue * 255.f); + + gs_utils_widget_set_css (GTK_WIDGET (tile), &tile->tile_provider, css); + gs_utils_widget_set_css (tile->title, &tile->title_provider, NULL); + gs_utils_widget_set_css (tile->subtitle, &tile->subtitle_provider, NULL); + } else { + GArray *key_colors = gs_app_get_key_colors (app); + g_autofree gchar *css = NULL; + + /* If there is no override CSS for the app, default to a solid + * background colour based on the app’s key colors. + * + * Choose an arbitrary key color from the app’s key colors, and + * ensure that it’s: + * - a light, not too saturated version of the dominant color + * of the icon + * - always light enough that grey text is visible on it + * + * Cache the result until the app’s key colours change, as the + * amount of calculation going on here is not entirely trivial. + */ + if (key_colors != tile->key_colors_cache) { + g_autoptr(GArray) colors = NULL; + GdkRGBA fg_rgba; + GsHSBC fg_hsbc; + const GsHSBC *chosen_hsbc; + GsHSBC chosen_hsbc_modified; + gboolean use_chosen_hsbc = FALSE; + + /* Look up the foreground colour for the feature tile, + * which is the colour of the text. This should always + * be provided as a named colour by the theme. + * + * Knowing the foreground colour allows calculation of + * the contrast between candidate background colours and + * the foreground which will be rendered on top of them. + * + * We want to choose a background colour with at least + * @min_abs_contrast contrast with the foreground, so + * that the text is legible. + */ + gtk_widget_get_color (GTK_WIDGET (tile), &fg_rgba); + + gtk_rgb_to_hsv (fg_rgba.red, fg_rgba.green, fg_rgba.blue, + &fg_hsbc.hue, &fg_hsbc.saturation, &fg_hsbc.brightness); + + g_debug ("FG color: RGB: (%f, %f, %f), HSB: (%f, %f, %f)", + fg_rgba.red, fg_rgba.green, fg_rgba.blue, + fg_hsbc.hue, fg_hsbc.saturation, fg_hsbc.brightness); + + /* Convert all the RGBA key colours to HSB, and + * calculate their contrast against the foreground + * colour. + * + * The contrast is calculated as the Weber contrast, + * which is valid for small amounts of foreground colour + * (i.e. text) against larger background areas. Contrast + * is strictly calculated using luminance, but it’s OK + * to subjectively calculate it using brightness, as + * brightness is the subjective impression of luminance. + */ + if (key_colors != NULL) + colors = g_array_sized_new (FALSE, FALSE, sizeof (GsHSBC), key_colors->len); + + g_debug ("Candidate background colors for %s:", gs_app_get_id (app)); + for (guint i = 0; key_colors != NULL && i < key_colors->len; i++) { + const GdkRGBA *rgba = &g_array_index (key_colors, GdkRGBA, i); + GsHSBC hsbc; + + gtk_rgb_to_hsv (rgba->red, rgba->green, rgba->blue, + &hsbc.hue, &hsbc.saturation, &hsbc.brightness); + hsbc.contrast = wcag_contrast (&fg_hsbc, &hsbc); + g_array_append_val (colors, hsbc); + + g_debug (" • RGB: (%f, %f, %f), HSB: (%f, %f, %f), contrast: %f", + rgba->red, rgba->green, rgba->blue, + hsbc.hue, hsbc.saturation, hsbc.brightness, + hsbc.contrast); + } + + /* Sort the candidate background colours to find the + * most appropriate one. */ + g_array_sort (colors, colors_sort_cb); + + /* If the developer/distro has provided override colours, + * use them. If there’s more than one override colour, + * use the one with the highest contrast with the + * foreground colour, unmodified. If there’s only one, + * modify it as below. + * + * If there are no override colours, take the top colour + * after sorting above. If it’s not good enough, modify + * its brightness to improve the contrast, and clamp its + * saturation to the valid range. + * + * If there are no colours, fall through and leave @css + * as %NULL. */ + if (gs_app_get_user_key_colors (app) && + colors != NULL && + colors->len > 1) { + g_array_sort (colors, colors_sort_contrast_cb); + + chosen_hsbc = &g_array_index (colors, GsHSBC, 0); + chosen_hsbc_modified = *chosen_hsbc; + + use_chosen_hsbc = TRUE; + } else if (colors != NULL && colors->len > 0) { + chosen_hsbc = &g_array_index (colors, GsHSBC, 0); + chosen_hsbc_modified = *chosen_hsbc; + + chosen_hsbc_modified.saturation = CLAMP (chosen_hsbc->saturation, min_valid_saturation, max_valid_saturation); + + if (chosen_hsbc->contrast >= -min_abs_contrast && + chosen_hsbc->contrast <= min_abs_contrast) + chosen_hsbc_modified.brightness = wcag_contrast_find_brightness (&fg_hsbc, &chosen_hsbc_modified, min_abs_contrast); + + use_chosen_hsbc = TRUE; + } + + if (use_chosen_hsbc) { + GdkRGBA chosen_rgba; + + gtk_hsv_to_rgb (chosen_hsbc_modified.hue, + chosen_hsbc_modified.saturation, + chosen_hsbc_modified.brightness, + &chosen_rgba.red, &chosen_rgba.green, &chosen_rgba.blue); + + g_debug ("Chosen background colour for %s (saturation %s, brightness %s): RGB: (%f, %f, %f), HSB: (%f, %f, %f)", + gs_app_get_id (app), + (chosen_hsbc_modified.saturation == chosen_hsbc->saturation) ? "not modified" : "modified", + (chosen_hsbc_modified.brightness == chosen_hsbc->brightness) ? "not modified" : "modified", + chosen_rgba.red, chosen_rgba.green, chosen_rgba.blue, + chosen_hsbc_modified.hue, chosen_hsbc_modified.saturation, chosen_hsbc_modified.brightness); + + css = g_strdup_printf ("background-color: rgb(%.0f,%.0f,%.0f);", + chosen_rgba.red * 255.f, + chosen_rgba.green * 255.f, + chosen_rgba.blue * 255.f); + } + + gs_utils_widget_set_css (GTK_WIDGET (tile), &tile->tile_provider, css); + gs_utils_widget_set_css (tile->title, &tile->title_provider, NULL); + gs_utils_widget_set_css (tile->subtitle, &tile->subtitle_provider, NULL); + + tile->key_colors_cache = key_colors; + } + } + } + + switch (gs_app_get_state (app)) { + case GS_APP_STATE_INSTALLED: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_UPDATABLE_LIVE: + name = g_strdup_printf ("%s (%s)", + gs_app_get_name (app), + C_("Single app", "Installed")); + break; + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_DOWNLOADING: + default: + name = g_strdup (gs_app_get_name (app)); + break; + } + + if (name != NULL) { + gtk_accessible_update_property (GTK_ACCESSIBLE (tile), + GTK_ACCESSIBLE_PROPERTY_LABEL, name, + GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, gs_app_get_summary (app), + -1); + } +} + +static void +gs_feature_tile_direction_changed (GtkWidget *widget, GtkTextDirection previous_direction) +{ + GsFeatureTile *tile = GS_FEATURE_TILE (widget); + + gs_feature_tile_refresh (tile); +} + +static void +gs_feature_tile_css_changed (GtkWidget *widget, + GtkCssStyleChange *css_change) +{ + GsFeatureTile *tile = GS_FEATURE_TILE (widget); + + /* Clear the key colours cache, as the tile background colour will + * potentially need recalculating if the widget’s foreground colour has + * changed. */ + tile->key_colors_cache = NULL; + + gs_feature_tile_refresh (tile); + + GTK_WIDGET_CLASS (gs_feature_tile_parent_class)->css_changed (widget, css_change); +} + +static void +gs_feature_tile_init (GsFeatureTile *tile) +{ + GtkLayoutManager *layout_manager; + + gtk_widget_init_template (GTK_WIDGET (tile)); + + layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (tile)); + g_warn_if_fail (layout_manager != NULL); + g_signal_connect_object (layout_manager, "narrow-mode-changed", + G_CALLBACK (gs_feature_tile_layout_narrow_mode_changed_cb), tile, 0); +} + +static void +gs_feature_tile_class_init (GsFeatureTileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_feature_tile_dispose; + object_class->get_property = gs_feature_tile_get_property; + object_class->set_property = gs_feature_tile_set_property; + + widget_class->css_changed = gs_feature_tile_css_changed; + widget_class->direction_changed = gs_feature_tile_direction_changed; + + /** + * GsFeatureTile:app: + * + * The app to display in this tile. + * + * Set this to %NULL to display a loading/empty tile. + * + * Since: 45 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", "App", + "The app to display in this tile.", + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-feature-tile.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsFeatureTile, stack); + gtk_widget_class_bind_template_child (widget_class, GsFeatureTile, image); + gtk_widget_class_bind_template_child (widget_class, GsFeatureTile, title); + gtk_widget_class_bind_template_child (widget_class, GsFeatureTile, subtitle); + + gtk_widget_class_set_css_name (widget_class, "feature-tile"); + gtk_widget_class_set_layout_manager_type (widget_class, GS_TYPE_FEATURE_TILE_LAYOUT); +} + +GtkWidget * +gs_feature_tile_new (GsApp *app) +{ + return g_object_new (GS_TYPE_FEATURE_TILE, + "vexpand", FALSE, + "app", app, + NULL); +} + +/** + * gs_feature_tile_get_app: + * @self: a #GsFeatureTile + * + * Get the value of #GsFeatureTile:app. + * + * Returns: (nullable) (transfer none): the #GsFeatureTile:app property + * + * Since: 45 + */ +GsApp * +gs_feature_tile_get_app (GsFeatureTile *self) +{ + g_return_val_if_fail (GS_IS_FEATURE_TILE (self), NULL); + return self->app; +} + +/** + * gs_feature_tile_set_app: + * @self: a #GsFeatureTile + * @app: (transfer none) (nullable): the new value for #GsFeatureTile:app + * + * Set the value of #GsFeatureTile:app. + * + * Since: 45 + */ +void +gs_feature_tile_set_app (GsFeatureTile *self, GsApp *app) +{ + g_return_if_fail (GS_IS_FEATURE_TILE (self)); + g_return_if_fail (!app || GS_IS_APP (app)); + + /* cancel pending refresh */ + g_clear_handle_id (&self->refresh_id, g_source_remove); + + /* disconnect old app */ + if (self->app != NULL) + g_signal_handlers_disconnect_by_func (self->app, schedule_refresh, self); + + g_set_object (&self->app, app); + + if (self->app != NULL) { + g_signal_connect_swapped (app, "notify", + G_CALLBACK (schedule_refresh), self); + schedule_refresh (self); + } + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); +} diff --git a/src/gs-feature-tile.h b/src/gs-feature-tile.h new file mode 100644 index 0000000..ce70f89 --- /dev/null +++ b/src/gs-feature-tile.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-app.h" + +G_BEGIN_DECLS + +#define GS_TYPE_FEATURE_TILE (gs_feature_tile_get_type ()) + +G_DECLARE_FINAL_TYPE (GsFeatureTile, gs_feature_tile, GS, FEATURE_TILE, GtkButton) + +GtkWidget *gs_feature_tile_new (GsApp *app); + +GsApp *gs_feature_tile_get_app (GsFeatureTile *self); +void gs_feature_tile_set_app (GsFeatureTile *self, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-feature-tile.ui b/src/gs-feature-tile.ui new file mode 100644 index 0000000..f415f08 --- /dev/null +++ b/src/gs-feature-tile.ui @@ -0,0 +1,86 @@ + + + + + + diff --git a/src/gs-featured-carousel.c b/src/gs-featured-carousel.c new file mode 100644 index 0000000..ce183ab --- /dev/null +++ b/src/gs-featured-carousel.c @@ -0,0 +1,436 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-featured-carousel + * @short_description: A carousel widget containing #GsFeatureTile instances + * + * #GsFeaturedCarousel is a carousel widget which rotates through a set of + * #GsFeatureTiles, displaying them to the user to advertise a given set of + * featured apps, set with gs_featured_carousel_set_apps(). + * + * The widget has no special appearance if the app list is empty, so callers + * will typically want to hide the carousel in that case. + * + * Since: 40 + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "gs-app-list.h" +#include "gs-common.h" +#include "gs-feature-tile.h" +#include "gs-featured-carousel.h" + +#define FEATURED_ROTATE_TIME 15 /* seconds */ + +struct _GsFeaturedCarousel +{ + GtkBox parent_instance; + + GsAppList *apps; /* (nullable) (owned) */ + guint rotation_timer_id; + + AdwCarousel *carousel; + GtkButton *next_button; + GtkButton *previous_button; +}; + +G_DEFINE_TYPE (GsFeaturedCarousel, gs_featured_carousel, GTK_TYPE_BOX) + +typedef enum { + PROP_APPS = 1, +} GsFeaturedCarouselProperty; + +static GParamSpec *obj_props[PROP_APPS + 1] = { NULL, }; + +typedef enum { + SIGNAL_APP_CLICKED, +} GsFeaturedCarouselSignal; + +static guint obj_signals[SIGNAL_APP_CLICKED + 1] = { 0, }; + +static GtkWidget * +get_nth_page_widget (GsFeaturedCarousel *self, + guint page_number) +{ + GtkWidget *page = gtk_widget_get_first_child (GTK_WIDGET (self->carousel)); + guint i = 0; + + while (page && i++ < page_number) + page = gtk_widget_get_next_sibling (page); + return page; +} + +static void +show_relative_page (GsFeaturedCarousel *self, + gint delta) +{ + gdouble current_page = adw_carousel_get_position (self->carousel); + guint n_pages = adw_carousel_get_n_pages (self->carousel); + gdouble new_page; + GtkWidget *new_page_widget; + gboolean animate = TRUE; + + if (n_pages == 0) + return; + + /* FIXME: This would be simpler if AdwCarousel had a way to scroll to + * a page by index, rather than by GtkWidget pointer. + * See https://gitlab.gnome.org/GNOME/libhandy/-/issues/413 */ + new_page = ((guint) current_page + delta + n_pages) % n_pages; + new_page_widget = get_nth_page_widget (self, new_page); + g_assert (new_page_widget != NULL); + + /* Don’t animate if we’re wrapping from the last page back to the first + * or from the first page to the last going backwards as it means rapidly + * spooling through all the pages, which looks confusing. */ + if ((new_page == 0.0 && delta > 0) || (new_page == n_pages - 1 && delta < 0)) + animate = FALSE; + + /* Disable all animations if accessibility settings say so. */ + if (!adw_get_enable_animations (GTK_WIDGET (self))) + animate = FALSE; + + adw_carousel_scroll_to (self->carousel, new_page_widget, animate); +} + +static gboolean +rotate_cb (gpointer user_data) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (user_data); + + show_relative_page (self, +1); + + return G_SOURCE_CONTINUE; +} + +static void +start_rotation_timer (GsFeaturedCarousel *self) +{ + if (self->rotation_timer_id == 0) { + self->rotation_timer_id = g_timeout_add_seconds (FEATURED_ROTATE_TIME, + rotate_cb, self); + } +} + +static void +maybe_start_rotation_timer (GsFeaturedCarousel *self) +{ + if (self->apps != NULL && gs_app_list_length (self->apps) > 0 && + gtk_widget_get_mapped (GTK_WIDGET (self))) + start_rotation_timer (self); +} + +static void +stop_rotation_timer (GsFeaturedCarousel *self) +{ + if (self->rotation_timer_id != 0) { + g_source_remove (self->rotation_timer_id); + self->rotation_timer_id = 0; + } +} + +static void +carousel_notify_position_cb (GsFeaturedCarousel *self) +{ + /* Reset the rotation timer in case it’s about to fire. */ + stop_rotation_timer (self); + start_rotation_timer (self); +} + +static void +next_button_clicked_cb (GtkButton *button, + gpointer user_data) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (user_data); + + show_relative_page (self, +1); +} + +static void +previous_button_clicked_cb (GtkButton *button, + gpointer user_data) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (user_data); + + show_relative_page (self, -1); +} + +static void +tile_clicked_cb (GsFeatureTile *tile, + gpointer user_data) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (user_data); + GsApp *app; + + app = gs_feature_tile_get_app (tile); + g_signal_emit (self, obj_signals[SIGNAL_APP_CLICKED], 0, app); +} + +static void +gs_featured_carousel_init (GsFeaturedCarousel *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + /* Disable scrolling through the carousel, as it’s typically used + * in app pages which are themselves scrollable. */ + adw_carousel_set_allow_scroll_wheel (self->carousel, FALSE); +} + +static void +gs_featured_carousel_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (object); + + switch ((GsFeaturedCarouselProperty) prop_id) { + case PROP_APPS: + g_value_set_object (value, gs_featured_carousel_get_apps (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_featured_carousel_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (object); + + switch ((GsFeaturedCarouselProperty) prop_id) { + case PROP_APPS: + gs_featured_carousel_set_apps (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_featured_carousel_dispose (GObject *object) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (object); + + stop_rotation_timer (self); + g_clear_object (&self->apps); + + G_OBJECT_CLASS (gs_featured_carousel_parent_class)->dispose (object); +} + +static void +gs_featured_carousel_map (GtkWidget *widget) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (widget); + + GTK_WIDGET_CLASS (gs_featured_carousel_parent_class)->map (widget); + + maybe_start_rotation_timer (self); +} + +static void +gs_featured_carousel_unmap (GtkWidget *widget) +{ + GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (widget); + + stop_rotation_timer (self); + + GTK_WIDGET_CLASS (gs_featured_carousel_parent_class)->unmap (widget); +} + +static gboolean +key_pressed_cb (GtkEventControllerKey *controller, + guint keyval, + guint keycode, + GdkModifierType state, + GsFeaturedCarousel *self) +{ + if (gtk_widget_is_visible (GTK_WIDGET (self->previous_button)) && + gtk_widget_is_sensitive (GTK_WIDGET (self->previous_button)) && + ((gtk_widget_get_direction (GTK_WIDGET (self->previous_button)) == GTK_TEXT_DIR_LTR && keyval == GDK_KEY_Left) || + (gtk_widget_get_direction (GTK_WIDGET (self->previous_button)) == GTK_TEXT_DIR_RTL && keyval == GDK_KEY_Right))) { + gtk_widget_activate (GTK_WIDGET (self->previous_button)); + return GDK_EVENT_STOP; + } + + if (gtk_widget_is_visible (GTK_WIDGET (self->next_button)) && + gtk_widget_is_sensitive (GTK_WIDGET (self->next_button)) && + ((gtk_widget_get_direction (GTK_WIDGET (self->next_button)) == GTK_TEXT_DIR_LTR && keyval == GDK_KEY_Right) || + (gtk_widget_get_direction (GTK_WIDGET (self->next_button)) == GTK_TEXT_DIR_RTL && keyval == GDK_KEY_Left))) { + gtk_widget_activate (GTK_WIDGET (self->next_button)); + return GDK_EVENT_STOP; + } + + return GDK_EVENT_PROPAGATE; +} + +static void +gs_featured_carousel_class_init (GsFeaturedCarouselClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_featured_carousel_get_property; + object_class->set_property = gs_featured_carousel_set_property; + object_class->dispose = gs_featured_carousel_dispose; + + widget_class->map = gs_featured_carousel_map; + widget_class->unmap = gs_featured_carousel_unmap; + + /** + * GsFeaturedCarousel:apps: (nullable) + * + * The list of featured apps to display in the carousel. This should + * typically be 4–8 apps. They will be displayed in the order listed, + * so the caller may want to randomise that order first, using + * gs_app_list_randomize(). + * + * This may be %NULL if no apps have been set. This is equivalent to + * an empty #GsAppList. + * + * Since: 40 + */ + obj_props[PROP_APPS] = + g_param_spec_object ("apps", NULL, NULL, + GS_TYPE_APP_LIST, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + /** + * GsFeaturedCarousel::app-clicked: + * @app: the #GsApp which was clicked on + * + * Emitted when one of the app tiles is clicked. Typically the caller + * should display the details of the given app in the callback. + * + * Since: 40 + */ + obj_signals[SIGNAL_APP_CLICKED] = + g_signal_new ("app-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, GS_TYPE_APP); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-featured-carousel.ui"); + gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GROUP); + + gtk_widget_class_bind_template_child (widget_class, GsFeaturedCarousel, carousel); + gtk_widget_class_bind_template_child (widget_class, GsFeaturedCarousel, next_button); + gtk_widget_class_bind_template_child (widget_class, GsFeaturedCarousel, previous_button); + gtk_widget_class_bind_template_callback (widget_class, carousel_notify_position_cb); + gtk_widget_class_bind_template_callback (widget_class, next_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, previous_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, key_pressed_cb); +} + +/** + * gs_featured_carousel_new: + * @apps: (nullable): a list of apps to display in the carousel, or %NULL + * + * Create a new #GsFeaturedCarousel and set its initial app list to @apps. + * + * Returns: (transfer full): a new #GsFeaturedCarousel + * Since: 40 + */ +GtkWidget * +gs_featured_carousel_new (GsAppList *apps) +{ + g_return_val_if_fail (apps == NULL || GS_IS_APP_LIST (apps), NULL); + + return g_object_new (GS_TYPE_FEATURED_CAROUSEL, + "apps", apps, + NULL); +} + +/** + * gs_featured_carousel_get_apps: + * @self: a #GsFeaturedCarousel + * + * Gets the value of #GsFeaturedCarousel:apps. + * + * Returns: (nullable) (transfer none): list of apps in the carousel, or %NULL + * if none are set + * Since: 40 + */ +GsAppList * +gs_featured_carousel_get_apps (GsFeaturedCarousel *self) +{ + g_return_val_if_fail (GS_IS_FEATURED_CAROUSEL (self), NULL); + + return self->apps; +} + +/** + * gs_featured_carousel_set_apps: + * @self: a #GsFeaturedCarousel + * @apps: (nullable) (transfer none): list of apps to display in the carousel, + * or %NULL for none + * + * Set the value of #GsFeaturedCarousel:apps. + * + * Since: 40 + */ +void +gs_featured_carousel_set_apps (GsFeaturedCarousel *self, + GsAppList *apps) +{ + g_return_if_fail (GS_IS_FEATURED_CAROUSEL (self)); + g_return_if_fail (apps == NULL || GS_IS_APP_LIST (apps)); + + /* Need to cleanup the content also after the widget is created, + * thus always pass through for the NULL 'apps'. */ + if (apps != NULL && apps == self->apps) + return; + + stop_rotation_timer (self); + gs_widget_remove_all (GTK_WIDGET (self->carousel), (GsRemoveFunc) adw_carousel_remove); + + g_set_object (&self->apps, apps); + + if (apps != NULL) { + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + GtkWidget *tile = gs_feature_tile_new (app); + gtk_widget_set_hexpand (tile, TRUE); + gtk_widget_set_vexpand (tile, TRUE); + gtk_widget_set_can_focus (tile, FALSE); + g_signal_connect (tile, "clicked", + G_CALLBACK (tile_clicked_cb), self); + adw_carousel_append (self->carousel, tile); + } + } else { + GtkWidget *tile = gs_feature_tile_new (NULL); + gtk_widget_set_hexpand (tile, TRUE); + gtk_widget_set_vexpand (tile, TRUE); + gtk_widget_set_can_focus (tile, FALSE); + adw_carousel_append (self->carousel, tile); + } + + gtk_widget_set_visible (GTK_WIDGET (self->next_button), self->apps != NULL && gs_app_list_length (self->apps) > 1); + gtk_widget_set_visible (GTK_WIDGET (self->previous_button), self->apps != NULL && gs_app_list_length (self->apps) > 1); + + maybe_start_rotation_timer (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APPS]); +} diff --git a/src/gs-featured-carousel.h b/src/gs-featured-carousel.h new file mode 100644 index 0000000..dffec2a --- /dev/null +++ b/src/gs-featured-carousel.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app-list.h" + +G_BEGIN_DECLS + +#define GS_TYPE_FEATURED_CAROUSEL (gs_featured_carousel_get_type ()) + +G_DECLARE_FINAL_TYPE (GsFeaturedCarousel, gs_featured_carousel, GS, FEATURED_CAROUSEL, GtkBox) + +GtkWidget *gs_featured_carousel_new (GsAppList *apps); + +GsAppList *gs_featured_carousel_get_apps (GsFeaturedCarousel *self); +void gs_featured_carousel_set_apps (GsFeaturedCarousel *self, + GsAppList *apps); + +G_END_DECLS diff --git a/src/gs-featured-carousel.ui b/src/gs-featured-carousel.ui new file mode 100644 index 0000000..38d85c5 --- /dev/null +++ b/src/gs-featured-carousel.ui @@ -0,0 +1,86 @@ + + + + + + diff --git a/src/gs-hardware-support-context-dialog.c b/src/gs-hardware-support-context-dialog.c new file mode 100644 index 0000000..6c0dd9c --- /dev/null +++ b/src/gs-hardware-support-context-dialog.c @@ -0,0 +1,951 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-hardware-support-context-dialog + * @short_description: A dialog showing hardware support information about an app + * + * #GsHardwareSupportContextDialog is a dialog which shows detailed information + * about what hardware an app requires or recommends to be used when running it. + * For example, what input devices it requires, and what display sizes it + * supports. This information is derived from the ``, + * `` and `` elements in the app’s appdata. + * + * Currently, `` is treated as a synonym of `` as it’s + * only just been introduced into the appstream standard, and many apps which + * should be using `` are still using ``. + * + * It is designed to show a more detailed view of the information which the + * app’s hardware support tile in #GsAppContextBar is derived from. + * + * The widget has no special appearance if the app is unset, so callers will + * typically want to hide the dialog in that case. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-app.h" +#include "gs-common.h" +#include "gs-context-dialog-row.h" +#include "gs-hardware-support-context-dialog.h" +#include "gs-lozenge.h" + +struct _GsHardwareSupportContextDialog +{ + GsInfoWindow parent_instance; + + GsApp *app; /* (nullable) (owned) */ + gulong app_notify_handler_relations; + gulong app_notify_handler_name; + + GtkWidget *lozenge; + GtkLabel *title; + GtkListBox *relations_list; +}; + +G_DEFINE_TYPE (GsHardwareSupportContextDialog, gs_hardware_support_context_dialog, GS_TYPE_INFO_WINDOW) + +typedef enum { + PROP_APP = 1, +} GsHardwareSupportContextDialogProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +typedef enum { + MATCH_STATE_NO_MATCH = 0, + MATCH_STATE_MATCH = 1, + MATCH_STATE_UNKNOWN, +} MatchState; + +/* The `icon_name_*`, `title_*` and `description_*` arguments are all nullable. + * If a row would be added with %NULL values, it is not added. */ +static void +add_relation_row (GtkListBox *list_box, + GsContextDialogRowImportance *chosen_rating, + AsRelationKind control_relation_kind, + MatchState match_state, + gboolean any_control_relations_set, + const gchar *icon_name_required_matches, + const gchar *title_required_matches, + const gchar *description_required_matches, + const gchar *icon_name_no_relation, + const gchar *title_no_relation, + const gchar *description_no_relation, + const gchar *icon_name_required_no_match, + const gchar *title_required_no_match, + const gchar *description_required_no_match, + const gchar *icon_name_recommends, + const gchar *title_recommends, + const gchar *description_recommends, + const gchar *icon_name_unsupported, + const gchar *title_unsupported, + const gchar *description_unsupported) +{ + GtkListBoxRow *row; + GsContextDialogRowImportance rating; + const gchar *icon_name, *title, *description; + + g_assert (control_relation_kind == AS_RELATION_KIND_UNKNOWN || any_control_relations_set); + + switch (control_relation_kind) { + case AS_RELATION_KIND_UNKNOWN: + if (!any_control_relations_set) { + rating = GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL; + icon_name = icon_name_no_relation; + title = title_no_relation; + description = description_no_relation; + } else { + rating = GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING; + icon_name = icon_name_unsupported; + title = title_unsupported; + description = description_unsupported; + } + break; + case AS_RELATION_KIND_REQUIRES: + if (match_state == MATCH_STATE_MATCH) { + rating = GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT; + icon_name = icon_name_required_matches; + title = title_required_matches; + description = description_required_matches; + } else { + rating = (match_state == MATCH_STATE_NO_MATCH) ? GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT : GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING; + icon_name = icon_name_required_no_match; + title = title_required_no_match; + description = description_required_no_match; + } + break; + case AS_RELATION_KIND_RECOMMENDS: +#if AS_CHECK_VERSION(0, 15, 0) + case AS_RELATION_KIND_SUPPORTS: +#endif + rating = GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT; + icon_name = icon_name_recommends; + title = title_recommends; + description = description_recommends; + break; + default: + g_assert_not_reached (); + } + + if (icon_name == NULL) + return; + + if (rating > *chosen_rating) + *chosen_rating = rating; + + row = gs_context_dialog_row_new (icon_name, rating, title, description); + gtk_list_box_append (list_box, GTK_WIDGET (row)); +} + +/** + * gs_hardware_support_context_dialog_get_largest_monitor: + * @display: a #GdkDisplay + * + * Get the largest monitor associated with @display, comparing the larger of the + * monitor’s width and height, and breaking ties between equally-large monitors + * using gdk_monitor_is_primary(). + * + * Returns: (nullable) (transfer none): the largest monitor from @display, or + * %NULL if no monitor information is available + * Since: 41 + */ +GdkMonitor * +gs_hardware_support_context_dialog_get_largest_monitor (GdkDisplay *display) +{ + GListModel *monitors; /* (unowned) */ + GdkMonitor *monitor; /* (unowned) */ + int monitor_max_dimension; + guint n_monitors; + + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + + monitors = gdk_display_get_monitors (display); + n_monitors = g_list_model_get_n_items (monitors); + monitor_max_dimension = 0; + monitor = NULL; + + for (guint i = 0; i < n_monitors; i++) { + g_autoptr(GdkMonitor) monitor2 = g_list_model_get_item (monitors, i); + GdkRectangle monitor_geometry; + int monitor2_max_dimension; + + if (monitor2 == NULL) + continue; + + gdk_monitor_get_geometry (monitor2, &monitor_geometry); + monitor2_max_dimension = MAX (monitor_geometry.width, monitor_geometry.height); + + if (monitor2_max_dimension > monitor_max_dimension) { + monitor = monitor2; + monitor_max_dimension = monitor2_max_dimension; + continue; + } + } + + return monitor; +} + +/* Unfortunately the integer values of #AsRelationKind don’t have the same order + * as we want. */ +static AsRelationKind +max_relation_kind (AsRelationKind kind1, + AsRelationKind kind2) +{ + /* cases are ordered from maximum to minimum */ + if (kind1 == AS_RELATION_KIND_REQUIRES || kind2 == AS_RELATION_KIND_REQUIRES) + return AS_RELATION_KIND_REQUIRES; + if (kind1 == AS_RELATION_KIND_RECOMMENDS || kind2 == AS_RELATION_KIND_RECOMMENDS) + return AS_RELATION_KIND_RECOMMENDS; +#if AS_CHECK_VERSION(0, 15, 0) + if (kind1 == AS_RELATION_KIND_SUPPORTS || kind2 == AS_RELATION_KIND_SUPPORTS) + return AS_RELATION_KIND_SUPPORTS; +#endif + return AS_RELATION_KIND_UNKNOWN; +} + +typedef struct { + guint min; + guint max; +} Range; + +/* + * evaluate_display_comparison: + * @comparand1: + * @comparator: + * @comparand2: + * + * Evaluate `comparand1 comparator comparand2` and return the result. For + * example, `comparand1 EQ comparand2` or `comparand1 GT comparand2`. + * + * Comparisons are done as ranges, so depending on @comparator, sometimes the + * #Range.min value of a comparand is compared, sometimes #Range.max, and + * sometimes both. See the code for details. + * + * Returns: %TRUE if the comparison is true, %FALSE otherwise + * Since: 41 + */ +static gboolean +evaluate_display_comparison (Range comparand1, + AsRelationCompare comparator, + Range comparand2) +{ + switch (comparator) { + case AS_RELATION_COMPARE_EQ: + return (comparand1.min == comparand2.min && + comparand1.max == comparand2.max); + case AS_RELATION_COMPARE_NE: + return (comparand1.min != comparand2.min || + comparand1.max != comparand2.max); + case AS_RELATION_COMPARE_LT: + return (comparand1.max < comparand2.min); + case AS_RELATION_COMPARE_GT: + return (comparand1.min > comparand2.max); + case AS_RELATION_COMPARE_LE: + return (comparand1.max <= comparand2.max); + case AS_RELATION_COMPARE_GE: + return (comparand1.min >= comparand2.min); + case AS_RELATION_COMPARE_UNKNOWN: + case AS_RELATION_COMPARE_LAST: + default: + g_assert_not_reached (); + } +} + +/** + * gs_hardware_support_context_dialog_get_control_support: + * @display: a #GdkDisplay + * @relations: (element-type AsRelation): relations retrieved from a #GsApp + * using gs_app_get_relations() + * @any_control_relations_set_out: (out caller-allocates) (optional): return + * location for a boolean indicating whether any control relations are set + * in @relations + * @control_relations: (out caller-allocates) (array length=AS_CONTROL_KIND_LAST): + * array mapping #AsControlKind to #AsRelationKind; must be at least + * %AS_CONTROL_KIND_LAST elements long, doesn’t need to be initialised + * @has_touchscreen_out: (out caller-allocates) (optional): return location for + * a boolean indicating whether @display has a touchscreen + * @has_keyboard_out: (out caller-allocates) (optional): return location for + * a boolean indicating whether @display has a keyboard + * @has_mouse_out: (out caller-allocates) (optional): return location for + * a boolean indicating whether @display has a mouse + * + * Query @display and @relations and summarise the information in the output + * arguments. + * + * Each element of @control_relations will be set to the highest type of + * relation seen for that type of control. So if the appdata represented by + * @relations contains `keyboard`, + * `control_relations[AS_CONTROL_KIND_KEYBOARD]` will be set to + * %AS_RELATION_KIND_REQUIRES. All elements of @control_relations are set to + * %AS_RELATION_KIND_UNKNOWN by default. + * + * @any_control_relations_set_out is set to %TRUE if any elements of + * @control_relations are changed from %AS_RELATION_KIND_UNKNOWN. + * + * @has_touchscreen_out, @has_keyboard_out and @has_mouse_out are set to %TRUE + * if the default seat attached to @display has the relevant input device + * (%GDK_SEAT_CAPABILITY_TOUCH, %GDK_SEAT_CAPABILITY_KEYBOARD, + * %GDK_SEAT_CAPABILITY_POINTER respectively). + * + * Since: 41 + */ +void +gs_hardware_support_context_dialog_get_control_support (GdkDisplay *display, + GPtrArray *relations, + gboolean *any_control_relations_set_out, + AsRelationKind *control_relations, + gboolean *has_touchscreen_out, + gboolean *has_keyboard_out, + gboolean *has_mouse_out) +{ + gboolean any_control_relations_set; + gboolean has_touchscreen, has_keyboard, has_mouse; + + g_return_if_fail (display == NULL || GDK_IS_DISPLAY (display)); + g_return_if_fail (control_relations != NULL); + + any_control_relations_set = FALSE; + has_touchscreen = FALSE; + has_keyboard = FALSE; + has_mouse = FALSE; + + /* Initialise @control_relations */ + for (gint i = 0; i < AS_CONTROL_KIND_LAST; i++) + control_relations[i] = AS_RELATION_KIND_UNKNOWN; + + /* Set @control_relations to the maximum relation kind found for each control */ + for (guint i = 0; relations != NULL && i < relations->len; i++) { + AsRelation *relation = AS_RELATION (g_ptr_array_index (relations, i)); + AsRelationKind kind = as_relation_get_kind (relation); + + if (as_relation_get_item_kind (relation) == AS_RELATION_ITEM_KIND_CONTROL) { + AsControlKind control_kind = as_relation_get_value_control_kind (relation); + control_relations[control_kind] = MAX (control_relations[control_kind], kind); + + if (kind == AS_RELATION_KIND_REQUIRES || +#if AS_CHECK_VERSION(0, 15, 0) + kind == AS_RELATION_KIND_SUPPORTS || +#endif + kind == AS_RELATION_KIND_RECOMMENDS) + any_control_relations_set = TRUE; + } + } + + /* Work out what input devices are available. */ + if (display != NULL) { + GdkSeat *seat = gdk_display_get_default_seat (display); + GdkSeatCapabilities seat_capabilities = gdk_seat_get_capabilities (seat); + + has_touchscreen = (seat_capabilities & GDK_SEAT_CAPABILITY_TOUCH); + has_keyboard = (seat_capabilities & GDK_SEAT_CAPABILITY_KEYBOARD); + has_mouse = (seat_capabilities & GDK_SEAT_CAPABILITY_POINTER); + } + + if (any_control_relations_set_out != NULL) + *any_control_relations_set_out = any_control_relations_set; + if (has_touchscreen_out != NULL) + *has_touchscreen_out = has_touchscreen; + if (has_keyboard_out != NULL) + *has_keyboard_out = has_keyboard; + if (has_mouse_out != NULL) + *has_mouse_out = has_mouse; +} + +/** + * gs_hardware_support_context_dialog_get_display_support: + * @monitor: the largest #GdkMonitor currently connected + * @relations: (element-type AsRelation): (element-type AsRelation): relations retrieved from a #GsApp + * using gs_app_get_relations() + * @any_display_relations_set_out: (out caller-allocates) (optional): return + * location for a boolean indicating whether any display relations are set + * in @relations + * @desktop_match_out: (out caller-allocates) (not optional): return location + * for a boolean indicating whether @relations claims support for desktop + * displays + * @desktop_relation_kind_out: (out caller-allocates) (not optional): return + * location for an #AsRelationKind indicating what kind of support the app + * has for desktop displays + * @mobile_match_out: (out caller-allocates) (not optional): return location + * for a boolean indicating whether @relations claims support for mobile + * displays (phones) + * @mobile_relation_kind_out: (out caller-allocates) (not optional): return + * location for an #AsRelationKind indicating what kind of support the app + * has for mobile displays + * @current_match_out: (out caller-allocates) (not optional): return location + * for a boolean indicating whether @relations claims support for the + * currently connected @monitor + * @current_relation_kind_out: (out caller-allocates) (not optional): return + * location for an #AsRelationKind indicating what kind of support the app + * has for the currently connected monitor + * + * Query @monitor and @relations and summarise the information in the output + * arguments. + * + * @any_display_relations_set_out is set to %TRUE if any elements of @relations + * have type %AS_RELATION_ITEM_KIND_DISPLAY_LENGTH, i.e. if the app has provided + * any information about what displays it supports/requires. + * + * @desktop_match_out is set to %TRUE if the display relations in @relations + * indicate that the app supports desktop displays (currently, larger than + * 1024 pixels). + * + * @desktop_relation_kind_out is set to the type of support the app has for + * desktop displays: whether they’re required (%AS_RELATION_KIND_REQUIRES), + * supported but not required (%AS_RELATION_KIND_RECOMMENDS or + * %AS_RELATION_KIND_SUPPORTS) or whether there’s no information + * (%AS_RELATION_KIND_UNKNOWN). + * + * @mobile_match_out and @mobile_relation_kind_out behave similarly, but for + * mobile displays (smaller than 768 pixels). + * + * @current_match_out and @current_relation_kind_out behave similarly, but for + * the dimensions of @monitor. + * + * Since: 41 + */ +void +gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor, + GPtrArray *relations, + gboolean *any_display_relations_set_out, + gboolean *desktop_match_out, + AsRelationKind *desktop_relation_kind_out, + gboolean *mobile_match_out, + AsRelationKind *mobile_relation_kind_out, + gboolean *current_match_out, + AsRelationKind *current_relation_kind_out) +{ + GdkRectangle current_screen_size; + gboolean any_display_relations_set; + + g_return_if_fail (GDK_IS_MONITOR (monitor)); + g_return_if_fail (desktop_match_out != NULL); + g_return_if_fail (desktop_relation_kind_out != NULL); + g_return_if_fail (mobile_match_out != NULL); + g_return_if_fail (mobile_relation_kind_out != NULL); + g_return_if_fail (current_match_out != NULL); + g_return_if_fail (current_relation_kind_out != NULL); + + gdk_monitor_get_geometry (monitor, ¤t_screen_size); + + /* Set default output */ + any_display_relations_set = FALSE; + *desktop_match_out = FALSE; + *desktop_relation_kind_out = AS_RELATION_KIND_UNKNOWN; + *mobile_match_out = FALSE; + *mobile_relation_kind_out = AS_RELATION_KIND_UNKNOWN; + *current_match_out = FALSE; + *current_relation_kind_out = AS_RELATION_KIND_UNKNOWN; + + for (guint i = 0; relations != NULL && i < relations->len; i++) { + AsRelation *relation = AS_RELATION (g_ptr_array_index (relations, i)); + + /* All lengths here are in logical/app pixels, + * not device pixels. */ + if (as_relation_get_item_kind (relation) == AS_RELATION_ITEM_KIND_DISPLAY_LENGTH) { + AsRelationCompare comparator = as_relation_get_compare (relation); + Range current_display_comparand, relation_comparand = { 0, G_MAXUINT }; + +#if !AS_CHECK_VERSION(1, 0, 0) + /* From https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-requires-recommends-display_length */ + Range display_lengths[] = { + [AS_DISPLAY_LENGTH_KIND_XSMALL] = { 0, 360 }, + [AS_DISPLAY_LENGTH_KIND_SMALL] = { 360, 768 }, + [AS_DISPLAY_LENGTH_KIND_MEDIUM] = { 768, 1024 }, + [AS_DISPLAY_LENGTH_KIND_LARGE] = { 1024, 3840 }, + [AS_DISPLAY_LENGTH_KIND_XLARGE] = { 3840, G_MAXUINT }, + }; +#else + enum { + AS_DISPLAY_LENGTH_KIND_SMALL, + AS_DISPLAY_LENGTH_KIND_LARGE, + }; + Range display_lengths[] = { + [AS_DISPLAY_LENGTH_KIND_SMALL] = { 360, 768 }, + [AS_DISPLAY_LENGTH_KIND_LARGE] = { 1024, 3840 }, + }; +#endif + + any_display_relations_set = TRUE; + + switch (as_relation_get_display_side_kind (relation)) { + case AS_DISPLAY_SIDE_KIND_SHORTEST: + current_display_comparand.min = current_display_comparand.max = MIN (current_screen_size.width, current_screen_size.height); + relation_comparand.min = relation_comparand.max = as_relation_get_value_px (relation); + break; + case AS_DISPLAY_SIDE_KIND_LONGEST: + current_display_comparand.min = current_display_comparand.max = MAX (current_screen_size.width, current_screen_size.height); + relation_comparand.min = relation_comparand.max = as_relation_get_value_px (relation); + break; + case AS_DISPLAY_SIDE_KIND_UNKNOWN: + case AS_DISPLAY_SIDE_KIND_LAST: + default: + current_display_comparand.min = current_display_comparand.max = MAX (current_screen_size.width, current_screen_size.height); +#if !AS_CHECK_VERSION(1, 0, 0) + relation_comparand.min = display_lengths[as_relation_get_value_display_length_kind (relation)].min; + relation_comparand.max = display_lengths[as_relation_get_value_display_length_kind (relation)].max; +#endif + break; + } + + if (evaluate_display_comparison (display_lengths[AS_DISPLAY_LENGTH_KIND_SMALL], comparator, relation_comparand)) { + *mobile_relation_kind_out = max_relation_kind (*mobile_relation_kind_out, as_relation_get_kind (relation)); + *mobile_match_out = TRUE; + } + + if (evaluate_display_comparison (display_lengths[AS_DISPLAY_LENGTH_KIND_LARGE], comparator, relation_comparand)) { + *desktop_relation_kind_out = max_relation_kind (*desktop_relation_kind_out, as_relation_get_kind (relation)); + *desktop_match_out = TRUE; + } + + if (evaluate_display_comparison (current_display_comparand, comparator, relation_comparand)) { + *current_relation_kind_out = max_relation_kind (*current_relation_kind_out, as_relation_get_kind (relation)); + *current_match_out = TRUE; + } + } + } + + /* Output */ + if (any_display_relations_set_out != NULL) + *any_display_relations_set_out = any_display_relations_set; +} + +static void +update_relations_list (GsHardwareSupportContextDialog *self) +{ + const gchar *icon_name, *css_class; + g_autofree gchar *title = NULL; + g_autoptr(GPtrArray) relations = NULL; + AsRelationKind control_relations[AS_CONTROL_KIND_LAST] = { AS_RELATION_KIND_UNKNOWN, }; + GdkDisplay *display; + GdkMonitor *monitor = NULL; + GdkRectangle current_screen_size; + gboolean any_control_relations_set; + gboolean has_touchscreen = FALSE, has_keyboard = FALSE, has_mouse = FALSE; + GsContextDialogRowImportance chosen_rating; + + /* Treat everything as unknown to begin with, and downgrade its hardware + * support based on app properties. */ + chosen_rating = GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL; + + gs_widget_remove_all (GTK_WIDGET (self->relations_list), (GsRemoveFunc) gtk_list_box_remove); + + /* UI state is undefined if app is not set. */ + if (self->app == NULL) + return; + + relations = gs_app_get_relations (self->app); + + /* Extract the %AS_RELATION_ITEM_KIND_CONTROL relations and summarise + * them. */ + display = gtk_widget_get_display (GTK_WIDGET (self)); + gs_hardware_support_context_dialog_get_control_support (display, relations, + &any_control_relations_set, + control_relations, + &has_touchscreen, + &has_keyboard, + &has_mouse); + + if (display != NULL) + monitor = gs_hardware_support_context_dialog_get_largest_monitor (display); + + if (monitor != NULL) + gdk_monitor_get_geometry (monitor, ¤t_screen_size); + + /* For each of the screen sizes we understand, add a row to the dialogue. + * In the unlikely case that (monitor == NULL), don’t bother providing + * fallback rows. */ + if (monitor != NULL) { + AsRelationKind desktop_relation_kind, mobile_relation_kind, current_relation_kind; + gboolean desktop_match, mobile_match, current_match; + gboolean any_display_relations_set; + + gs_hardware_support_context_dialog_get_display_support (monitor, relations, + &any_display_relations_set, + &desktop_match, &desktop_relation_kind, + &mobile_match, &mobile_relation_kind, + ¤t_match, ¤t_relation_kind); + + add_relation_row (self->relations_list, &chosen_rating, + desktop_relation_kind, + desktop_match ? MATCH_STATE_MATCH : MATCH_STATE_NO_MATCH, + any_display_relations_set, + "device-support-desktop-symbolic", + _("Desktop Support"), + _("Supports being used on a large screen"), + "device-support-unknown-symbolic", + _("Desktop Support Unknown"), + _("Not enough information to know if large screens are supported"), + "device-support-desktop-symbolic", + _("Desktop Only"), + _("Requires a large screen"), + "device-support-desktop-symbolic", + _("Desktop Support"), + _("Supports being used on a large screen"), + "device-support-desktop-symbolic", + _("Desktop Not Supported"), + _("Cannot be used on a large screen")); + + add_relation_row (self->relations_list, &chosen_rating, + mobile_relation_kind, + mobile_match ? MATCH_STATE_MATCH : MATCH_STATE_NO_MATCH, + any_display_relations_set, + "device-support-mobile-symbolic", + _("Mobile Support"), + _("Supports being used on a small screen"), + "device-support-unknown-symbolic", + _("Mobile Support Unknown"), + _("Not enough information to know if small screens are supported"), + "device-support-mobile-symbolic", + _("Mobile Only"), + _("Requires a small screen"), + "device-support-mobile-symbolic", + _("Mobile Support"), + _("Supports being used on a small screen"), + "device-support-mobile-symbolic", + _("Mobile Not Supported"), + _("Cannot be used on a small screen")); + + /* Other display relations should only be listed if they are a + * requirement. They will typically be for special apps. */ + add_relation_row (self->relations_list, &chosen_rating, + current_relation_kind, + current_match ? MATCH_STATE_MATCH : MATCH_STATE_NO_MATCH, + any_display_relations_set, + NULL, NULL, NULL, + NULL, NULL, NULL, + "video-joined-displays-symbolic", + _("Screen Size Mismatch"), + _("Doesn’t support your current screen size"), + NULL, NULL, NULL, + NULL, NULL, NULL); + } + + /* For each of the control devices we understand, add a row to the dialogue. */ + add_relation_row (self->relations_list, &chosen_rating, + control_relations[AS_CONTROL_KIND_KEYBOARD], + has_keyboard ? MATCH_STATE_MATCH : MATCH_STATE_NO_MATCH, + any_control_relations_set, + "input-keyboard-symbolic", + _("Keyboard Support"), + _("Requires a keyboard"), + "device-support-unknown-symbolic", + _("Keyboard Support Unknown"), + _("Not enough information to know if keyboards are supported"), + "input-keyboard-symbolic", + _("Keyboard Required"), + _("Requires a keyboard"), + "input-keyboard-symbolic", + _("Keyboard Support"), + _("Supports keyboards"), + "input-keyboard-symbolic", + _("Keyboard Not Supported"), + _("Cannot be used with a keyboard")); + + add_relation_row (self->relations_list, &chosen_rating, + control_relations[AS_CONTROL_KIND_POINTING], + has_mouse ? MATCH_STATE_MATCH : MATCH_STATE_NO_MATCH, + any_control_relations_set, + "input-mouse-symbolic", + _("Mouse Support"), + _("Requires a mouse or pointing device"), + "device-support-unknown-symbolic", + _("Mouse Support Unknown"), + _("Not enough information to know if mice or pointing devices are supported"), + "input-mouse-symbolic", + _("Mouse Required"), + _("Requires a mouse or pointing device"), + "input-mouse-symbolic", + _("Mouse Support"), + _("Supports mice and pointing devices"), + "input-mouse-symbolic", + _("Mouse Not Supported"), + _("Cannot be used with a mouse or pointing device")); + + add_relation_row (self->relations_list, &chosen_rating, + control_relations[AS_CONTROL_KIND_TOUCH], + has_touchscreen ? MATCH_STATE_MATCH : MATCH_STATE_NO_MATCH, + any_control_relations_set, + "device-support-touch-symbolic", + _("Touchscreen Support"), + _("Requires a touchscreen"), + "device-support-unknown-symbolic", + _("Touchscreen Support Unknown"), + _("Not enough information to know if touchscreens are supported"), + "device-support-touch-symbolic", + _("Touchscreen Required"), + _("Requires a touchscreen"), + "device-support-touch-symbolic", + _("Touchscreen Support"), + _("Supports touchscreens"), + "device-support-touch-symbolic", + _("Touchscreen Not Supported"), + _("Cannot be used with a touchscreen")); + + /* Gamepads are a little different; only show the row if the appdata + * explicitly mentions gamepads, and don’t vary the row based on whether + * a gamepad is plugged in, since users often leave their gamepads + * unplugged until they’re actually needed. */ + add_relation_row (self->relations_list, &chosen_rating, + control_relations[AS_CONTROL_KIND_GAMEPAD], + MATCH_STATE_UNKNOWN, + any_control_relations_set, + NULL, NULL, NULL, + NULL, NULL, NULL, + "input-gaming-symbolic", + _("Gamepad Required"), + _("Requires a gamepad"), + "input-gaming-symbolic", + _("Gamepad Support"), + _("Supports gamepads"), + NULL, NULL, NULL); + + /* Update the UI. */ + switch (chosen_rating) { + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL: + icon_name = "device-support-desktop-symbolic"; + /* Translators: It’s unknown whether this app is supported on + * the current hardware. The placeholder is the app name. */ + title = g_strdup_printf (_("%s probably works on this device"), gs_app_get_name (self->app)); + css_class = "grey"; + break; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT: + icon_name = "device-supported-symbolic"; + /* Translators: The app will work on the current hardware. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s works on this device"), gs_app_get_name (self->app)); + css_class = "green"; + break; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION: + icon_name = "device-supported-symbolic"; + /* Translators: The app will possbily work on the current hardware. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s possibly works on this device"), gs_app_get_name (self->app)); + css_class = "yellow"; + break; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING: + icon_name = "device-support-unknown-symbolic"; + /* Translators: The app may not work fully on the current hardware. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s will not work properly on this device"), gs_app_get_name (self->app)); + css_class = "orange"; + break; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT: + icon_name = "dialog-warning-symbolic"; + /* Translators: The app will not work properly on the current hardware. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s will not work on this device"), gs_app_get_name (self->app)); + css_class = "red"; + break; + default: + g_assert_not_reached (); + } + + gs_lozenge_set_icon_name (GS_LOZENGE (self->lozenge), icon_name); + gtk_label_set_text (self->title, title); + + gtk_widget_remove_css_class (self->lozenge, "green"); + gtk_widget_remove_css_class (self->lozenge, "yellow"); + gtk_widget_remove_css_class (self->lozenge, "orange"); + gtk_widget_remove_css_class (self->lozenge, "red"); + gtk_widget_remove_css_class (self->lozenge, "grey"); + + gtk_widget_add_css_class (self->lozenge, css_class); +} + +static void +app_notify_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GsHardwareSupportContextDialog *self = GS_HARDWARE_SUPPORT_CONTEXT_DIALOG (user_data); + + update_relations_list (self); +} + +static void +contribute_info_row_activated_cb (AdwButtonRow *row, + GsHardwareSupportContextDialog *self) +{ + GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (self))); + + gs_show_uri (GTK_WINDOW (toplevel), "help:gnome-software/software-metadata#hardware-support"); +} + +static void +gs_hardware_support_context_dialog_init (GsHardwareSupportContextDialog *self) +{ + g_type_ensure (GS_TYPE_LOZENGE); + + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +gs_hardware_support_context_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsHardwareSupportContextDialog *self = GS_HARDWARE_SUPPORT_CONTEXT_DIALOG (object); + + switch ((GsHardwareSupportContextDialogProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_hardware_support_context_dialog_get_app (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_hardware_support_context_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsHardwareSupportContextDialog *self = GS_HARDWARE_SUPPORT_CONTEXT_DIALOG (object); + + switch ((GsHardwareSupportContextDialogProperty) prop_id) { + case PROP_APP: + gs_hardware_support_context_dialog_set_app (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_hardware_support_context_dialog_dispose (GObject *object) +{ + GsHardwareSupportContextDialog *self = GS_HARDWARE_SUPPORT_CONTEXT_DIALOG (object); + + gs_hardware_support_context_dialog_set_app (self, NULL); + + G_OBJECT_CLASS (gs_hardware_support_context_dialog_parent_class)->dispose (object); +} + +static void +gs_hardware_support_context_dialog_class_init (GsHardwareSupportContextDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_hardware_support_context_dialog_get_property; + object_class->set_property = gs_hardware_support_context_dialog_set_property; + object_class->dispose = gs_hardware_support_context_dialog_dispose; + + /** + * GsHardwareSupportContextDialog:app: (nullable) + * + * The app to display the hardware support context details for. + * + * This may be %NULL; if so, the content of the widget will be + * undefined. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-hardware-support-context-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsHardwareSupportContextDialog, lozenge); + gtk_widget_class_bind_template_child (widget_class, GsHardwareSupportContextDialog, title); + gtk_widget_class_bind_template_child (widget_class, GsHardwareSupportContextDialog, relations_list); + + gtk_widget_class_bind_template_callback (widget_class, contribute_info_row_activated_cb); +} + +/** + * gs_hardware_support_context_dialog_new: + * @app: (nullable): the app to display hardware support context information for, or %NULL + * + * Create a new #GsHardwareSupportContextDialog and set its initial app to @app. + * + * Returns: (transfer full): a new #GsHardwareSupportContextDialog + * Since: 41 + */ +GsHardwareSupportContextDialog * +gs_hardware_support_context_dialog_new (GsApp *app) +{ + g_return_val_if_fail (app == NULL || GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_HARDWARE_SUPPORT_CONTEXT_DIALOG, + "app", app, + NULL); +} + +/** + * gs_hardware_support_context_dialog_get_app: + * @self: a #GsHardwareSupportContextDialog + * + * Gets the value of #GsHardwareSupportContextDialog:app. + * + * Returns: (nullable) (transfer none): app whose hardware support context information is + * being displayed, or %NULL if none is set + * Since: 41 + */ +GsApp * +gs_hardware_support_context_dialog_get_app (GsHardwareSupportContextDialog *self) +{ + g_return_val_if_fail (GS_IS_HARDWARE_SUPPORT_CONTEXT_DIALOG (self), NULL); + + return self->app; +} + +/** + * gs_hardware_support_context_dialog_set_app: + * @self: a #GsHardwareSupportContextDialog + * @app: (nullable) (transfer none): the app to display hardware support context + * information for, or %NULL for none + * + * Set the value of #GsHardwareSupportContextDialog:app. + * + * Since: 41 + */ +void +gs_hardware_support_context_dialog_set_app (GsHardwareSupportContextDialog *self, + GsApp *app) +{ + g_return_if_fail (GS_IS_HARDWARE_SUPPORT_CONTEXT_DIALOG (self)); + g_return_if_fail (app == NULL || GS_IS_APP (app)); + + if (app == self->app) + return; + + g_clear_signal_handler (&self->app_notify_handler_relations, self->app); + g_clear_signal_handler (&self->app_notify_handler_name, self->app); + + g_set_object (&self->app, app); + + if (self->app != NULL) { + self->app_notify_handler_relations = g_signal_connect (self->app, "notify::relations", G_CALLBACK (app_notify_cb), self); + self->app_notify_handler_name = g_signal_connect (self->app, "notify::name", G_CALLBACK (app_notify_cb), self); + } + + /* Update the UI. */ + update_relations_list (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); +} diff --git a/src/gs-hardware-support-context-dialog.h b/src/gs-hardware-support-context-dialog.h new file mode 100644 index 0000000..46d0d09 --- /dev/null +++ b/src/gs-hardware-support-context-dialog.h @@ -0,0 +1,51 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" +#include "gs-info-window.h" + +G_BEGIN_DECLS + +#define GS_TYPE_HARDWARE_SUPPORT_CONTEXT_DIALOG (gs_hardware_support_context_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsHardwareSupportContextDialog, gs_hardware_support_context_dialog, GS, HARDWARE_SUPPORT_CONTEXT_DIALOG, GsInfoWindow) + +GsHardwareSupportContextDialog *gs_hardware_support_context_dialog_new (GsApp *app); + +GsApp *gs_hardware_support_context_dialog_get_app (GsHardwareSupportContextDialog *self); +void gs_hardware_support_context_dialog_set_app (GsHardwareSupportContextDialog *self, + GsApp *app); + +void gs_hardware_support_context_dialog_get_control_support (GdkDisplay *display, + GPtrArray *relations, + gboolean *any_control_relations_set_out, + AsRelationKind *control_relations, + gboolean *has_touchscreen_out, + gboolean *has_keyboard_out, + gboolean *has_mouse_out); + +GdkMonitor *gs_hardware_support_context_dialog_get_largest_monitor (GdkDisplay *display); +void gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor, + GPtrArray *relations, + gboolean *any_display_relations_set_out, + gboolean *desktop_match_out, + AsRelationKind *desktop_relation_kind_out, + gboolean *mobile_match_out, + AsRelationKind *mobile_relation_kind_out, + gboolean *other_match_out, + AsRelationKind *other_relation_kind_out); + +G_END_DECLS diff --git a/src/gs-hardware-support-context-dialog.ui b/src/gs-hardware-support-context-dialog.ui new file mode 100644 index 0000000..4d39d7e --- /dev/null +++ b/src/gs-hardware-support-context-dialog.ui @@ -0,0 +1,74 @@ + + + + + + diff --git a/src/gs-help-overlay.ui b/src/gs-help-overlay.ui new file mode 100644 index 0000000..cb86cc8 --- /dev/null +++ b/src/gs-help-overlay.ui @@ -0,0 +1,76 @@ + + + + + 1 + + + shortcuts + 12 + + + + Navigation + display + + + <Alt>1 + Navigate to Explore Page + + + + + <Alt>2 + Navigate to Installed Page + + + + + <Alt>3 + Navigate to Updates Page + + + + + <Primary>F + Open Search Bar + + + + + + + + Windows + overview + + + <Primary>comma + Open Preferences + + + + + <Primary>period + Open Software Repositories + + + + + + + + Help + overview + + + <Primary>question + Open Keyboard Shortcuts + + + + + + + + diff --git a/src/gs-info-window.c b/src/gs-info-window.c new file mode 100644 index 0000000..e973a8c --- /dev/null +++ b/src/gs-info-window.c @@ -0,0 +1,122 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Purism SPC + * + * Author: Adrien Plazas + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-info-window + * @short_description: A minimalist window designed to present information + * + * #GsInfoWindow is a window with floating window buttons which can be closed + * by pressing the Escape key. It is intended to present information and to not + * give the user many interaction possibilities. + * + * Since: 42 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-common.h" +#include "gs-info-window.h" + +typedef struct +{ + GtkWidget *view; +} GsInfoWindowPrivate; + +static void gs_info_window_buildable_init (GtkBuildableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GsInfoWindow, gs_info_window, ADW_TYPE_DIALOG, + G_ADD_PRIVATE (GsInfoWindow) + G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, gs_info_window_buildable_init)) + +static GtkBuildableIface *parent_buildable_iface; + +static void +gs_info_window_init (GsInfoWindow *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +gs_info_window_buildable_add_child (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const char *type) +{ + GsInfoWindow *self = GS_INFO_WINDOW (buildable); + GsInfoWindowPrivate *priv = gs_info_window_get_instance_private (self); + + if (!priv->view) + parent_buildable_iface->add_child (buildable, builder, child, type); + else if (GTK_IS_WIDGET (child)) + gs_info_window_set_child (self, GTK_WIDGET (child)); + else + GTK_BUILDER_WARN_INVALID_CHILD_TYPE (buildable, type); +} + +static void +gs_info_window_buildable_init (GtkBuildableIface *iface) +{ + parent_buildable_iface = g_type_interface_peek_parent (iface); + + iface->add_child = gs_info_window_buildable_add_child; + +} + +static void +gs_info_window_class_init (GsInfoWindowClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-info-window.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, GsInfoWindow, view); +} + +/** + * gs_info_window_new: + * + * Create a new #GsInfoWindow. + * + * Returns: (transfer full): a new #GsInfoWindow + * Since: 42 + */ +GsInfoWindow * +gs_info_window_new (void) +{ + return g_object_new (GS_TYPE_INFO_WINDOW, NULL); +} + +/** + * gs_info_window_set_child: + * @self: a #GsInfoWindow + * @widget: (nullable): the new child of @self + * + * Create a new #GsInfoWindow. + * + * Since: 42 + */ +void +gs_info_window_set_child (GsInfoWindow *self, + GtkWidget *widget) +{ + GsInfoWindowPrivate *priv; + g_return_if_fail (GS_IS_INFO_WINDOW (self)); + g_return_if_fail (widget == NULL || GTK_IS_WIDGET (widget)); + + priv = gs_info_window_get_instance_private (self); + adw_toolbar_view_set_content (ADW_TOOLBAR_VIEW (priv->view), widget); +} diff --git a/src/gs-info-window.h b/src/gs-info-window.h new file mode 100644 index 0000000..f6a6d57 --- /dev/null +++ b/src/gs-info-window.h @@ -0,0 +1,33 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Purism SPC + * + * Author: Adrien Plazas + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_INFO_WINDOW (gs_info_window_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsInfoWindow, gs_info_window, GS, INFO_WINDOW, AdwDialog) + +struct _GsInfoWindowClass +{ + AdwDialogClass parent_class; +}; + +GsInfoWindow *gs_info_window_new (void); + +void gs_info_window_set_child (GsInfoWindow *self, + GtkWidget *widget); +G_END_DECLS diff --git a/src/gs-info-window.ui b/src/gs-info-window.ui new file mode 100644 index 0000000..a3b6e5b --- /dev/null +++ b/src/gs-info-window.ui @@ -0,0 +1,23 @@ + + + + + + diff --git a/src/gs-installed-page.c b/src/gs-installed-page.c new file mode 100644 index 0000000..75bc2c9 --- /dev/null +++ b/src/gs-installed-page.c @@ -0,0 +1,981 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-shell.h" +#include "gs-installed-page.h" +#include "gs-common.h" +#include "gs-app-row.h" +#include "gs-utils.h" + +struct _GsInstalledPage +{ + GsPage parent_instance; + + GsPluginLoader *plugin_loader; + GCancellable *cancellable; + GtkSizeGroup *sizegroup_name; + GtkSizeGroup *sizegroup_button_label; + GtkSizeGroup *sizegroup_button_image; + gboolean cache_valid; + gboolean waiting; + GsShell *shell; + GSettings *settings; + guint pending_apps_counter; + gboolean is_narrow; + + GtkWidget *group_install_in_progress; + GtkWidget *group_install_apps; + GtkWidget *group_install_system_apps; + GtkWidget *group_install_addons; + GtkWidget *group_install_web_apps; + + GtkWidget *list_box_install_in_progress; + GtkWidget *list_box_install_apps; + GtkWidget *list_box_install_system_apps; + GtkWidget *list_box_install_addons; + GtkWidget *list_box_install_web_apps; + GtkWidget *scrolledwindow_install; + GtkWidget *stack_install; +}; + +G_DEFINE_TYPE (GsInstalledPage, gs_installed_page, GS_TYPE_PAGE) + +typedef enum { + PROP_IS_NARROW = 1, + /* Overrides: */ + PROP_VADJUSTMENT, + PROP_TITLE, +} GsInstalledPageProperty; + +static GParamSpec *obj_props[PROP_IS_NARROW + 1] = { NULL, }; + +static void gs_installed_page_pending_apps_refined_cb (GObject *source, + GAsyncResult *res, + gpointer user_data); +static GsPluginRefineFlags gs_installed_page_get_refine_flags (GsInstalledPage *self); +static void gs_installed_page_notify_state_changed_cb (GsApp *app, + GParamSpec *pspec, + GsInstalledPage *self); + +typedef enum { + GS_UPDATE_LIST_SECTION_INSTALLING_AND_REMOVING, + GS_UPDATE_LIST_SECTION_REMOVABLE_APPS, + GS_UPDATE_LIST_SECTION_SYSTEM_APPS, + GS_UPDATE_LIST_SECTION_ADDONS, + GS_UPDATE_LIST_SECTION_WEB_APPS, + GS_UPDATE_LIST_SECTION_LAST +} GsInstalledPageSection; + +/* This must mostly mirror gs_installed_page_get_app_sort_key() otherwise apps + * will end up sorted into a section they don’t belong in. */ +static GsInstalledPageSection +gs_installed_page_get_app_section (GsApp *app) +{ + GsAppState state = gs_app_get_state (app); + AsComponentKind kind = gs_app_get_kind (app); + + if (state == GS_APP_STATE_INSTALLING || + state == GS_APP_STATE_QUEUED_FOR_INSTALL || + state == GS_APP_STATE_REMOVING || + state == GS_APP_STATE_DOWNLOADING || + state == GS_APP_STATE_PENDING_INSTALL || + state == GS_APP_STATE_PENDING_REMOVE) + return GS_UPDATE_LIST_SECTION_INSTALLING_AND_REMOVING; + + if (kind == AS_COMPONENT_KIND_DESKTOP_APP) { + if (gs_app_has_quirk (app, GS_APP_QUIRK_COMPULSORY)) + return GS_UPDATE_LIST_SECTION_SYSTEM_APPS; + return GS_UPDATE_LIST_SECTION_REMOVABLE_APPS; + } + + if (kind == AS_COMPONENT_KIND_WEB_APP) + return GS_UPDATE_LIST_SECTION_WEB_APPS; + + return GS_UPDATE_LIST_SECTION_ADDONS; +} + +static void +update_groups (GsInstalledPage *self) +{ + gtk_widget_set_visible (self->group_install_in_progress, + gtk_widget_get_first_child (self->list_box_install_in_progress) != NULL); + gtk_widget_set_visible (self->group_install_apps, + gtk_widget_get_first_child (self->list_box_install_apps) != NULL); + gtk_widget_set_visible (self->group_install_system_apps, + gtk_widget_get_first_child (self->list_box_install_system_apps) != NULL); + gtk_widget_set_visible (self->group_install_addons, + gtk_widget_get_first_child (self->list_box_install_addons) != NULL); + gtk_widget_set_visible (self->group_install_web_apps, + gtk_widget_get_first_child (self->list_box_install_web_apps) != NULL); +} + +static GsInstalledPageSection +gs_installed_page_get_row_section (GsInstalledPage *self, + GsAppRow *app_row) +{ + GtkWidget *parent; + + g_return_val_if_fail (GS_IS_INSTALLED_PAGE (self), GS_UPDATE_LIST_SECTION_LAST); + g_return_val_if_fail (GS_IS_APP_ROW (app_row), GS_UPDATE_LIST_SECTION_LAST); + + parent = gtk_widget_get_parent (GTK_WIDGET (app_row)); + if (parent == self->list_box_install_in_progress) + return GS_UPDATE_LIST_SECTION_INSTALLING_AND_REMOVING; + if (parent == self->list_box_install_apps) + return GS_UPDATE_LIST_SECTION_REMOVABLE_APPS; + if (parent == self->list_box_install_system_apps) + return GS_UPDATE_LIST_SECTION_SYSTEM_APPS; + if (parent == self->list_box_install_addons) + return GS_UPDATE_LIST_SECTION_ADDONS; + if (parent == self->list_box_install_web_apps) + return GS_UPDATE_LIST_SECTION_WEB_APPS; + + g_warn_if_reached (); + + return GS_UPDATE_LIST_SECTION_LAST; +} + +static void +gs_installed_page_invalidate (GsInstalledPage *self) +{ + self->cache_valid = FALSE; +} + +static void +gs_installed_page_app_row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + GsInstalledPage *self) +{ + GsApp *app; + app = gs_app_row_get_app (GS_APP_ROW (row)); + gs_shell_show_app (self->shell, app); +} + +static void +row_unrevealed (GObject *row, GParamSpec *pspec, gpointer data) +{ + GsInstalledPage *self = GS_INSTALLED_PAGE (gtk_widget_get_ancestor (GTK_WIDGET (row), + GS_TYPE_INSTALLED_PAGE)); + GtkWidget *list; + + list = gtk_widget_get_parent (GTK_WIDGET (row)); + if (list == NULL) + return; + gtk_list_box_remove (GTK_LIST_BOX (list), GTK_WIDGET (row)); + update_groups (self); +} + +static void +gs_installed_page_unreveal_row (GsAppRow *app_row) +{ + GsApp *app = gs_app_row_get_app (app_row); + if (app != NULL) { + g_signal_handlers_disconnect_matched (app, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, + G_CALLBACK (gs_installed_page_notify_state_changed_cb), NULL); + } + + g_signal_connect (app_row, "unrevealed", + G_CALLBACK (row_unrevealed), NULL); + gs_app_row_unreveal (app_row); +} + +static GsAppRow * /* (transfer none) */ +gs_installed_page_find_app_row (GsInstalledPage *self, + GsApp *app) +{ + GtkWidget *lists[] = { + self->list_box_install_in_progress, + self->list_box_install_apps, + self->list_box_install_system_apps, + self->list_box_install_addons, + self->list_box_install_web_apps, + NULL + }; + + for (gsize i = 0; lists[i]; i++) { + for (GtkWidget *child = gtk_widget_get_first_child (lists[i]); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + GsAppRow *app_row = GS_APP_ROW (child); + if (gs_app_row_get_app (app_row) == app) { + return app_row; + } + } + } + + return NULL; +} + + +static void +gs_installed_page_app_removed (GsPage *page, GsApp *app) +{ + GsInstalledPage *self = GS_INSTALLED_PAGE (page); + GsAppRow *app_row = gs_installed_page_find_app_row (self, app); + if (app_row != NULL) + gs_installed_page_unreveal_row (app_row); +} + +static void +gs_installed_page_app_remove_cb (GsAppRow *app_row, + GsInstalledPage *self) +{ + GsApp *app; + + app = gs_app_row_get_app (app_row); + gs_page_remove_app (GS_PAGE (self), app, self->cancellable); +} + +static void +gs_installed_page_maybe_move_app_row (GsInstalledPage *self, + GsAppRow *app_row) +{ + GsInstalledPageSection current_section, expected_section; + + current_section = gs_installed_page_get_row_section (self, app_row); + g_return_if_fail (current_section != GS_UPDATE_LIST_SECTION_LAST); + + expected_section = gs_installed_page_get_app_section (gs_app_row_get_app (app_row)); + if (expected_section != current_section) { + GtkWidget *widget = GTK_WIDGET (app_row); + + g_object_ref (app_row); + gtk_list_box_remove (GTK_LIST_BOX (gtk_widget_get_parent (widget)), widget); + switch (expected_section) { + case GS_UPDATE_LIST_SECTION_INSTALLING_AND_REMOVING: + widget = self->list_box_install_in_progress; + break; + case GS_UPDATE_LIST_SECTION_REMOVABLE_APPS: + widget = self->list_box_install_apps; + break; + case GS_UPDATE_LIST_SECTION_SYSTEM_APPS: + widget = self->list_box_install_system_apps; + break; + case GS_UPDATE_LIST_SECTION_ADDONS: + widget = self->list_box_install_addons; + break; + case GS_UPDATE_LIST_SECTION_WEB_APPS: + widget = self->list_box_install_web_apps; + break; + default: + g_warn_if_reached (); + widget = NULL; + break; + } + + if (widget != NULL) + gtk_list_box_append (GTK_LIST_BOX (widget), GTK_WIDGET (app_row)); + + g_object_unref (app_row); + update_groups (self); + } +} + +static void +gs_installed_page_notify_state_changed_cb (GsApp *app, + GParamSpec *pspec, + GsInstalledPage *self) +{ + GsAppState state = gs_app_get_state (app); + GsAppRow *app_row = gs_installed_page_find_app_row (self, app); + + g_assert (app_row != NULL); + + gtk_list_box_row_changed (GTK_LIST_BOX_ROW (app_row)); + + /* Filter which apps can be shown in the installed page */ + if (state != GS_APP_STATE_INSTALLING && + state != GS_APP_STATE_INSTALLED && + state != GS_APP_STATE_REMOVING && + state != GS_APP_STATE_DOWNLOADING && + state != GS_APP_STATE_UPDATABLE && + state != GS_APP_STATE_UPDATABLE_LIVE && + state != GS_APP_STATE_PENDING_INSTALL && + state != GS_APP_STATE_PENDING_REMOVE) + gs_installed_page_unreveal_row (app_row); + else + gs_installed_page_maybe_move_app_row (self, app_row); +} + +static gboolean +should_show_installed_size (GsInstalledPage *self) +{ + return g_settings_get_boolean (self->settings, + "installed-page-show-size"); +} + +static gboolean +gs_installed_page_is_actual_app (GsApp *app) +{ + if (gs_app_get_description (app) != NULL) + return TRUE; + + /* special snowflake */ + if (g_strcmp0 (gs_app_get_id (app), "google-chrome.desktop") == 0) + return TRUE; + + /* web apps sometimes don't have descriptions */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_WEB_APP) + return TRUE; + + g_debug ("%s is not an actual app", gs_app_get_unique_id (app)); + return FALSE; +} + +static void +gs_installed_page_add_app (GsInstalledPage *self, GsAppList *list, GsApp *app) +{ + GtkWidget *app_row; + + /* only show if is an actual app */ + if (!gs_installed_page_is_actual_app (app)) + return; + + app_row = g_object_new (GS_TYPE_APP_ROW, + "app", app, + "show-buttons", TRUE, + "show-source", gs_utils_list_has_component_fuzzy (list, app), + "show-installed-size", !gs_app_has_quirk (app, GS_APP_QUIRK_COMPULSORY) && should_show_installed_size (self), + NULL); + + g_signal_connect (app_row, "button-clicked", + G_CALLBACK (gs_installed_page_app_remove_cb), self); + g_signal_connect_object (app, "notify::state", + G_CALLBACK (gs_installed_page_notify_state_changed_cb), + self, 0); + + switch (gs_installed_page_get_app_section (app)) { + case GS_UPDATE_LIST_SECTION_INSTALLING_AND_REMOVING: + gtk_list_box_append (GTK_LIST_BOX (self->list_box_install_in_progress), app_row); + break; + case GS_UPDATE_LIST_SECTION_REMOVABLE_APPS: + gtk_list_box_append (GTK_LIST_BOX (self->list_box_install_apps), app_row); + break; + case GS_UPDATE_LIST_SECTION_SYSTEM_APPS: + gtk_list_box_append (GTK_LIST_BOX (self->list_box_install_system_apps), app_row); + break; + case GS_UPDATE_LIST_SECTION_ADDONS: + gtk_list_box_append (GTK_LIST_BOX (self->list_box_install_addons), app_row); + break; + case GS_UPDATE_LIST_SECTION_WEB_APPS: + gtk_list_box_append (GTK_LIST_BOX (self->list_box_install_web_apps), app_row); + break; + default: + g_assert_not_reached (); + } + + update_groups (self); + + gs_app_row_set_size_groups (GS_APP_ROW (app_row), + self->sizegroup_name, + self->sizegroup_button_label, + self->sizegroup_button_image); + + gs_app_row_set_show_description (GS_APP_ROW (app_row), FALSE); + gs_app_row_set_show_source (GS_APP_ROW (app_row), FALSE); + g_object_bind_property (self, "is-narrow", app_row, "is-narrow", G_BINDING_SYNC_CREATE); +} + +static void +gs_installed_page_get_installed_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + guint i; + GsApp *app; + GsInstalledPage *self = GS_INSTALLED_PAGE (user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) pending = gs_plugin_loader_get_pending (plugin_loader); + g_autoptr(GsPluginJob) plugin_job = NULL; + + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_install), "view"); + + self->waiting = FALSE; + self->cache_valid = TRUE; + + list = gs_plugin_loader_job_process_finish (plugin_loader, + res, + &error); + if (list == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get installed apps: %s", error->message); + goto out; + } + for (i = 0; i < gs_app_list_length (list); i++) { + app = gs_app_list_index (list, i); + gs_installed_page_add_app (self, list, app); + } +out: + if (gs_app_list_length (pending) > 0) { + plugin_job = gs_plugin_job_refine_new (pending, + gs_installed_page_get_refine_flags (self)); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + gs_installed_page_pending_apps_refined_cb, + self); + + } +} + +static void +gs_installed_page_remove_all_cb (GtkWidget *container, + GtkWidget *child) +{ + if (GS_IS_APP_ROW (child)) { + GsApp *app = gs_app_row_get_app (GS_APP_ROW (child)); + if (app != NULL) { + g_signal_handlers_disconnect_matched (app, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, + G_CALLBACK (gs_installed_page_notify_state_changed_cb), NULL); + } + } else { + g_warn_if_reached (); + } + + gtk_list_box_remove (GTK_LIST_BOX (container), child); +} + +static gboolean +filter_app_kinds_cb (GsApp *app, + gpointer user_data) +{ + /* Remove invalid apps. */ + if (!gs_plugin_loader_app_is_valid (app, GS_PLUGIN_REFINE_FLAGS_NONE)) + return FALSE; + + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_OPERATING_SYSTEM: + case AS_COMPONENT_KIND_CODEC: + case AS_COMPONENT_KIND_FONT: + g_debug ("app invalid as %s: %s", + as_component_kind_to_string (gs_app_get_kind (app)), + gs_app_get_unique_id (app)); + return FALSE; + default: + return TRUE; + } +} + +static GsPluginRefineFlags +gs_installed_page_get_refine_flags (GsInstalledPage *self) +{ + GsPluginRefineFlags flags; + + flags = GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING; + + if (should_show_installed_size (self)) + flags |= GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE; + + return flags; +} + +static void +gs_installed_page_load (GsInstalledPage *self) +{ + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + if (self->waiting) + return; + self->waiting = TRUE; + + /* remove old entries */ + gs_widget_remove_all (self->list_box_install_in_progress, gs_installed_page_remove_all_cb); + gs_widget_remove_all (self->list_box_install_apps, gs_installed_page_remove_all_cb); + gs_widget_remove_all (self->list_box_install_system_apps, gs_installed_page_remove_all_cb); + gs_widget_remove_all (self->list_box_install_addons, gs_installed_page_remove_all_cb); + gs_widget_remove_all (self->list_box_install_web_apps, gs_installed_page_remove_all_cb); + update_groups (self); + + /* get installed apps */ + query = gs_app_query_new ("is-installed", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", gs_installed_page_get_refine_flags (self), + "filter-func", filter_app_kinds_cb, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->cancellable, + gs_installed_page_get_installed_cb, + self); + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_install), "spinner"); +} + +static void +gs_installed_page_reload (GsPage *page) +{ + GsInstalledPage *self = GS_INSTALLED_PAGE (page); + gs_installed_page_invalidate (self); + gs_installed_page_load (self); +} + +static void +gs_installed_page_switch_to (GsPage *page) +{ + GsInstalledPage *self = GS_INSTALLED_PAGE (page); + + if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_INSTALLED) { + g_warning ("Called switch_to(installed) when in mode %s", + gs_shell_get_mode_string (self->shell)); + return; + } + + if (gs_shell_get_mode (self->shell) == GS_SHELL_MODE_INSTALLED) { + gs_grab_focus_when_mapped (self->scrolledwindow_install); + } + + /* no need to refresh */ + if (self->cache_valid) + return; + + gs_installed_page_load (self); +} + +/** + * gs_installed_page_get_app_sort_key: + * + * Get a sort key to achive this: + * + * 1. state:installing apps + * 2. state: apps queued for installing + * 3. state:removing apps + * 4. kind:normal apps + * 5. kind:system apps + * + * Within each of these groups, they are sorted by the install date and then + * by name. + **/ +static gchar * +gs_installed_page_get_app_sort_key (GsApp *app) +{ + GString *key; + g_autofree gchar *sort_name = NULL; + + key = g_string_sized_new (64); + + /* sort installed, removing, other */ + switch (gs_app_get_state (app)) { + case GS_APP_STATE_DOWNLOADING: + g_string_append (key, "1:"); + break; + case GS_APP_STATE_INSTALLING: + g_string_append (key, "2:"); + break; + case GS_APP_STATE_QUEUED_FOR_INSTALL: + g_string_append (key, "3:"); + break; + case GS_APP_STATE_REMOVING: + g_string_append (key, "4:"); + break; + default: + g_string_append (key, "5:"); + break; + } + + /* sort apps by kind */ + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + g_string_append (key, "2:"); + break; + case AS_COMPONENT_KIND_WEB_APP: + g_string_append (key, "3:"); + break; + case AS_COMPONENT_KIND_RUNTIME: + g_string_append (key, "4:"); + break; + case AS_COMPONENT_KIND_ADDON: + g_string_append (key, "5:"); + break; + case AS_COMPONENT_KIND_CODEC: + g_string_append (key, "6:"); + break; + case AS_COMPONENT_KIND_FONT: + g_string_append (key, "6:"); + break; + case AS_COMPONENT_KIND_INPUT_METHOD: + g_string_append (key, "7:"); + break; + default: + if (gs_app_get_special_kind (app) == GS_APP_SPECIAL_KIND_OS_UPDATE) + g_string_append (key, "1:"); + else + g_string_append (key, "8:"); + break; + } + + /* sort normal, compulsory */ + if (!gs_app_has_quirk (app, GS_APP_QUIRK_COMPULSORY)) + g_string_append (key, "1:"); + else + g_string_append (key, "2:"); + + /* finally, sort by short name */ + if (gs_app_get_name (app) != NULL) { + sort_name = gs_utils_sort_key (gs_app_get_name (app)); + g_string_append (key, sort_name); + } + + return g_string_free (key, FALSE); +} + +static gint +gs_installed_page_sort_func (GtkListBoxRow *a, + GtkListBoxRow *b, + gpointer user_data) +{ + GsApp *a1, *a2; + g_autofree gchar *key1 = NULL; + g_autofree gchar *key2 = NULL; + + a1 = gs_app_row_get_app (GS_APP_ROW (a)); + a2 = gs_app_row_get_app (GS_APP_ROW (b)); + key1 = gs_installed_page_get_app_sort_key (a1); + key2 = gs_installed_page_get_app_sort_key (a2); + + /* compare the keys according to the algorithm above */ + return g_strcmp0 (key1, key2); +} + +static gboolean +gs_installed_page_has_app (GsInstalledPage *self, + GsApp *app) +{ + GtkWidget *lists[] = { + self->list_box_install_in_progress, + self->list_box_install_apps, + self->list_box_install_system_apps, + self->list_box_install_addons, + self->list_box_install_web_apps, + NULL + }; + + for (gsize i = 0; lists[i]; i++) { + for (GtkWidget *child = gtk_widget_get_first_child (lists[i]); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + GsAppRow *app_row = GS_APP_ROW (child); + if (gs_app_row_get_app (app_row) == app) + return TRUE; + } + } + + return FALSE; +} + +static void +gs_installed_page_add_pending_apps (GsInstalledPage *self, + GsAppList *list, + gboolean should_install) +{ + guint pending_apps_count = 0; + + for (guint i = 0; i < gs_app_list_length (list); ++i) { + GsApp *app = gs_app_list_index (list, i); + if (gs_app_is_installed (app) && + gs_app_get_state (app) != GS_APP_STATE_PENDING_INSTALL && + gs_app_get_state (app) != GS_APP_STATE_PENDING_REMOVE) + continue; + + /* never show OS upgrades, we handle the scheduling and + * cancellation in GsUpgradeBanner */ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_OPERATING_SYSTEM) + continue; + + if (gs_app_get_state (app) == GS_APP_STATE_AVAILABLE) + gs_app_set_state (app, GS_APP_STATE_QUEUED_FOR_INSTALL); + + if (should_install && + gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL && + gs_plugin_loader_get_network_available (self->plugin_loader) && + !gs_plugin_loader_get_network_metered (self->plugin_loader)) + gs_page_install_app (GS_PAGE (self), app, + GS_SHELL_INTERACTION_FULL, + gs_app_get_cancellable (app)); + + ++pending_apps_count; + if (!gs_installed_page_has_app (self, app)) + gs_installed_page_add_app (self, list, app); + } + + /* update the number of on-going operations */ + if (pending_apps_count != self->pending_apps_counter) { + self->pending_apps_counter = pending_apps_count; + g_object_notify (G_OBJECT (self), "counter"); + } +} + +static void +gs_installed_page_pending_apps_refined_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + GsInstalledPage *self = GS_INSTALLED_PAGE (user_data); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = gs_plugin_loader_job_process_finish (plugin_loader, + res, + &error); + if (list == NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) + g_warning ("failed to refine pending apps: %s", error->message); + return; + } + + /* we add the pending apps and install them because this is called after we + * populate the page, and there may be pending apps coming from the saved list + * (i.e. after loading the saved pending apps from the disk) */ + gs_installed_page_add_pending_apps (self, list, TRUE); +} + +static void +gs_installed_page_pending_apps_changed_cb (GsPluginLoader *plugin_loader, + GsInstalledPage *self) +{ + g_autoptr(GsAppList) pending = gs_plugin_loader_get_pending (plugin_loader); + /* we don't call install every time the pending apps list changes because + * it may be queued in the plugin loader */ + gs_installed_page_add_pending_apps (self, pending, FALSE); +} + +static gboolean +gs_installed_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsInstalledPage *self = GS_INSTALLED_PAGE (page); + + g_return_val_if_fail (GS_IS_INSTALLED_PAGE (self), TRUE); + + self->shell = shell; + self->plugin_loader = g_object_ref (plugin_loader); + g_signal_connect (self->plugin_loader, "pending-apps-changed", + G_CALLBACK (gs_installed_page_pending_apps_changed_cb), + self); + + self->cancellable = g_object_ref (cancellable); + + /* setup installed */ + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->list_box_install_in_progress), + gs_installed_page_sort_func, + self, NULL); + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->list_box_install_apps), + gs_installed_page_sort_func, + self, NULL); + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->list_box_install_system_apps), + gs_installed_page_sort_func, + self, NULL); + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->list_box_install_addons), + gs_installed_page_sort_func, + self, NULL); + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->list_box_install_web_apps), + gs_installed_page_sort_func, + self, NULL); + return TRUE; +} + +static void +gs_installed_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsInstalledPage *self = GS_INSTALLED_PAGE (object); + + switch ((GsInstalledPageProperty) prop_id) { + case PROP_IS_NARROW: + g_value_set_boolean (value, gs_installed_page_get_is_narrow (self)); + break; + case PROP_VADJUSTMENT: + g_value_set_object (value, gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_install))); + break; + case PROP_TITLE: + /* Translators: This is in the context of a list of apps which are installed on the system. */ + g_value_set_string (value, C_("List of installed apps", "Installed")); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_installed_page_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsInstalledPage *self = GS_INSTALLED_PAGE (object); + + switch ((GsInstalledPageProperty) prop_id) { + case PROP_IS_NARROW: + gs_installed_page_set_is_narrow (self, g_value_get_boolean (value)); + break; + case PROP_VADJUSTMENT: + case PROP_TITLE: + /* Read only. */ + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_installed_page_dispose (GObject *object) +{ + GsInstalledPage *self = GS_INSTALLED_PAGE (object); + + g_clear_object (&self->sizegroup_name); + g_clear_object (&self->sizegroup_button_label); + g_clear_object (&self->sizegroup_button_image); + + g_clear_object (&self->plugin_loader); + g_clear_object (&self->cancellable); + g_clear_object (&self->settings); + + G_OBJECT_CLASS (gs_installed_page_parent_class)->dispose (object); +} + +static void +gs_installed_page_class_init (GsInstalledPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPageClass *page_class = GS_PAGE_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_installed_page_get_property; + object_class->set_property = gs_installed_page_set_property; + object_class->dispose = gs_installed_page_dispose; + + page_class->app_removed = gs_installed_page_app_removed; + page_class->switch_to = gs_installed_page_switch_to; + page_class->reload = gs_installed_page_reload; + page_class->setup = gs_installed_page_setup; + + /** + * GsInstalledPage:is-narrow: + * + * Whether the page is in narrow mode. + * + * In narrow mode, the page will take up less horizontal space, doing so + * by e.g. using icons rather than labels in buttons. This is needed to + * keep the UI useable on small form-factors like smartphones. + * + * Since: 41 + */ + obj_props[PROP_IS_NARROW] = + g_param_spec_boolean ("is-narrow", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment"); + g_object_class_override_property (object_class, PROP_TITLE, "title"); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-installed-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, group_install_in_progress); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, group_install_apps); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, group_install_system_apps); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, group_install_addons); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, group_install_web_apps); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, list_box_install_in_progress); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, list_box_install_apps); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, list_box_install_system_apps); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, list_box_install_addons); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, list_box_install_web_apps); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, scrolledwindow_install); + gtk_widget_class_bind_template_child (widget_class, GsInstalledPage, stack_install); + + gtk_widget_class_bind_template_callback (widget_class, gs_installed_page_app_row_activated_cb); +} + +static void +gs_installed_page_init (GsInstalledPage *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + self->sizegroup_name = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_button_label = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_button_image = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + self->settings = g_settings_new ("org.gnome.software"); +} + +/** + * gs_installed_page_get_is_narrow: + * @self: a #GsInstalledPage + * + * Get the value of #GsInstalledPage:is-narrow. + * + * Returns: %TRUE if the page is in narrow mode, %FALSE otherwise + * + * Since: 41 + */ +gboolean +gs_installed_page_get_is_narrow (GsInstalledPage *self) +{ + g_return_val_if_fail (GS_IS_INSTALLED_PAGE (self), FALSE); + + return self->is_narrow; +} + +/** + * gs_installed_page_set_is_narrow: + * @self: a #GsInstalledPage + * @is_narrow: %TRUE to set the page in narrow mode, %FALSE otherwise + * + * Set the value of #GsInstalledPage:is-narrow. + * + * Since: 41 + */ +void +gs_installed_page_set_is_narrow (GsInstalledPage *self, gboolean is_narrow) +{ + g_return_if_fail (GS_IS_INSTALLED_PAGE (self)); + + is_narrow = !!is_narrow; + + if (self->is_narrow == is_narrow) + return; + + self->is_narrow = is_narrow; + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_IS_NARROW]); +} + +GsInstalledPage * +gs_installed_page_new (void) +{ + GsInstalledPage *self; + self = g_object_new (GS_TYPE_INSTALLED_PAGE, NULL); + return GS_INSTALLED_PAGE (self); +} diff --git a/src/gs-installed-page.h b/src/gs-installed-page.h new file mode 100644 index 0000000..04534dc --- /dev/null +++ b/src/gs-installed-page.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_INSTALLED_PAGE (gs_installed_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsInstalledPage, gs_installed_page, GS, INSTALLED_PAGE, GsPage) + +GsInstalledPage *gs_installed_page_new (void); + +gboolean gs_installed_page_get_is_narrow (GsInstalledPage *self); +void gs_installed_page_set_is_narrow (GsInstalledPage *self, + gboolean is_narrow); + +G_END_DECLS diff --git a/src/gs-installed-page.ui b/src/gs-installed-page.ui new file mode 100644 index 0000000..acd2164 --- /dev/null +++ b/src/gs-installed-page.ui @@ -0,0 +1,157 @@ + + + + + + diff --git a/src/gs-language.c b/src/gs-language.c new file mode 100644 index 0000000..43b1c40 --- /dev/null +++ b/src/gs-language.c @@ -0,0 +1,163 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2008 Richard Hughes + * Copyright (C) 2015-2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-language.h" + +struct _GsLanguage +{ + GObject parent_instance; + + GHashTable *hash; +}; + +G_DEFINE_TYPE (GsLanguage, gs_language, G_TYPE_OBJECT) + +static void +gs_language_parser_start_element (GMarkupParseContext *context, const gchar *element_name, + const gchar **attribute_names, const gchar **attribute_values, + gpointer user_data, GError **error) +{ + guint i, len; + const gchar *code1 = NULL; + const gchar *code2b = NULL; + const gchar *name = NULL; + GsLanguage *language = user_data; + + if (strcmp (element_name, "iso_639_entry") != 0) + return; + + /* find data */ + len = g_strv_length ((gchar**)attribute_names); + for (i=0; ihash, g_strdup (code1), g_strdup (name)); + if (code2b != NULL) + g_hash_table_insert (language->hash, g_strdup (code2b), g_strdup (name)); +} + +/* trivial parser */ +static const GMarkupParser gs_language_markup_parser = +{ + gs_language_parser_start_element, + NULL, /* end_element */ + NULL, /* characters */ + NULL, /* passthrough */ + NULL /* error */ +}; + +/** + * gs_language_populate: + * + * + **/ +gboolean +gs_language_populate (GsLanguage *language, GError **error) +{ + gsize size; + g_autofree gchar *contents = NULL; + g_autofree gchar *filename = NULL; + g_autoptr(GMarkupParseContext) context = NULL; + + /* find filename */ + filename = g_build_filename (DATADIR, "xml", "iso-codes", "iso_639.xml", NULL); + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) { + g_free (filename); + filename = g_build_filename ("/usr", "share", "xml", "iso-codes", "iso_639.xml", NULL); + } + /* FreeBSD and OpenBSD ports */ + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) { + g_free (filename); + filename = g_build_filename ("/usr", "local", "share", "xml", "iso-codes", "iso_639.xml", NULL); + } + /* NetBSD pkgsrc */ + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) { + g_free (filename); + filename = g_build_filename ("/usr", "pkg", "share", "xml", "iso-codes", "iso_639.xml", NULL); + } + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) { + g_set_error (error, 1, 0, "cannot find source file : '%s'", filename); + return FALSE; + } + + /* get contents */ + if (!g_file_get_contents (filename, &contents, &size, error)) + return FALSE; + + /* create parser */ + context = g_markup_parse_context_new (&gs_language_markup_parser, G_MARKUP_PREFIX_ERROR_POSITION, language, NULL); + + /* parse data */ + if (!g_markup_parse_context_parse (context, contents, (gssize) size, error)) + return FALSE; + + return TRUE;; +} + +gchar * +gs_language_iso639_to_language (GsLanguage *language, const gchar *iso639) +{ + return g_strdup (g_hash_table_lookup (language->hash, iso639)); +} + +static void +gs_language_finalize (GObject *object) +{ + GsLanguage *language; + + g_return_if_fail (GS_IS_LANGUAGE (object)); + + language = GS_LANGUAGE (object); + + g_hash_table_unref (language->hash); + + G_OBJECT_CLASS (gs_language_parent_class)->finalize (object); +} + +static void +gs_language_init (GsLanguage *language) +{ + language->hash = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_free); +} + +static void +gs_language_class_init (GsLanguageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_language_finalize; +} + +/** + * gs_language_new: + * + * Return value: a new GsLanguage object. + **/ +GsLanguage * +gs_language_new (void) +{ + GsLanguage *language; + language = g_object_new (GS_TYPE_LANGUAGE, NULL); + return GS_LANGUAGE (language); +} diff --git a/src/gs-language.h b/src/gs-language.h new file mode 100644 index 0000000..6815010 --- /dev/null +++ b/src/gs-language.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2008 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define GS_TYPE_LANGUAGE (gs_language_get_type ()) + +G_DECLARE_FINAL_TYPE (GsLanguage, gs_language, GS, LANGUAGE, GObject) + +GsLanguage *gs_language_new (void); +gboolean gs_language_populate (GsLanguage *language, + GError **error); +gchar *gs_language_iso639_to_language (GsLanguage *language, + const gchar *iso639); + +G_END_DECLS diff --git a/src/gs-layout-manager.c b/src/gs-layout-manager.c new file mode 100644 index 0000000..239e3b5 --- /dev/null +++ b/src/gs-layout-manager.c @@ -0,0 +1,110 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Georges Basile Stavracas Neto + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-layout-manager.h" + +/* + * The GsLayoutManager is a copy of the GtkBoxLayout, only + * declared as a derivable class, to avoid code duplication. + */ + +G_DEFINE_TYPE (GsLayoutManager, gs_layout_manager, GTK_TYPE_LAYOUT_MANAGER) + +static void +gs_layout_manager_measure (GtkLayoutManager *layout_manager, + GtkWidget *widget, + GtkOrientation orientation, + gint for_size, + gint *minimum, + gint *natural, + gint *minimum_baseline, + gint *natural_baseline) +{ + GtkWidget *child; + gint min = 0; + gint nat = 0; + + for (child = gtk_widget_get_first_child (widget); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + gint child_min_baseline = -1; + gint child_nat_baseline = -1; + gint child_min = 0; + gint child_nat = 0; + + if (!gtk_widget_should_layout (child)) + continue; + + gtk_widget_measure (child, orientation, + for_size, + &child_min, &child_nat, + &child_min_baseline, + &child_nat_baseline); + + min = MAX (min, child_min); + nat = MAX (nat, child_nat); + + if (child_min_baseline > -1) + *minimum_baseline = MAX (*minimum_baseline, child_min_baseline); + if (child_nat_baseline > -1) + *natural_baseline = MAX (*natural_baseline, child_nat_baseline); + } + + *minimum = min; + *natural = nat; +} + +static void +gs_layout_manager_allocate (GtkLayoutManager *layout_manager, + GtkWidget *widget, + gint width, + gint height, + gint baseline) +{ + GtkWidget *child; + + for (child = gtk_widget_get_first_child (widget); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + if (child && gtk_widget_should_layout (child)) + gtk_widget_allocate (child, width, height, baseline, NULL); + } +} + +static void +gs_layout_manager_class_init (GsLayoutManagerClass *klass) +{ + GtkLayoutManagerClass *layout_manager_class = GTK_LAYOUT_MANAGER_CLASS (klass); + + layout_manager_class->measure = gs_layout_manager_measure; + layout_manager_class->allocate = gs_layout_manager_allocate; +} + +static void +gs_layout_manager_init (GsLayoutManager *self) +{ +} + +/** + * gs_layout_manager_new: + * + * Create a new #GsLayoutManager. + * + * Returns: (transfer full): a new #GsLayoutManager + * + * Since: 43 + **/ +GtkLayoutManager * +gs_layout_manager_new (void) +{ + return g_object_new (GS_TYPE_LAYOUT_MANAGER, NULL); +} diff --git a/src/gs-layout-manager.h b/src/gs-layout-manager.h new file mode 100644 index 0000000..52d5b11 --- /dev/null +++ b/src/gs-layout-manager.h @@ -0,0 +1,29 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Georges Basile Stavracas Neto + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_LAYOUT_MANAGER (gs_layout_manager_get_type ()) +G_DECLARE_DERIVABLE_TYPE (GsLayoutManager, gs_layout_manager, GS, LAYOUT_MANAGER, GtkLayoutManager) + +struct _GsLayoutManagerClass { + GtkLayoutManagerClass parent_class; +}; + +GtkLayoutManager * + gs_layout_manager_new (void); + +G_END_DECLS diff --git a/src/gs-license-tile.c b/src/gs-license-tile.c new file mode 100644 index 0000000..970cae9 --- /dev/null +++ b/src/gs-license-tile.c @@ -0,0 +1,423 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-license-tile + * @short_description: A tile for displaying license information about an app + * + * #GsLicenseTile is a tile which displays high-level license information about + * an app. Broadly, whether it is FOSS or proprietary. + * + * It checks the license information in the provided #GsApp. If + * #GsLicenseTile:app is %NULL, the behaviour of the widget is undefined. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "gs-common.h" +#include "gs-license-tile.h" +#include "gs-lozenge.h" + +struct _GsLicenseTile +{ + GtkWidget parent_instance; + + GsApp *app; /* (nullable) (owned) */ + gulong notify_license_handler; + gulong notify_urls_handler; + + GtkWidget *lozenges[3]; + GtkLabel *title_label; + GtkLabel *description_label; + AdwButtonRow *get_involved_button_row; +}; + +G_DEFINE_TYPE (GsLicenseTile, gs_license_tile, GTK_TYPE_WIDGET) + +typedef enum { + PROP_APP = 1, +} GsLicenseTileProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +typedef enum { + SIGNAL_GET_INVOLVED_ACTIVATED, +} GsFeaturedCarouselSignal; + +static guint obj_signals[SIGNAL_GET_INVOLVED_ACTIVATED + 1] = { 0, }; + +static void +gs_license_tile_init (GsLicenseTile *self) +{ + g_type_ensure (GS_TYPE_LOZENGE); + + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +gs_license_tile_row_activated_cb (GtkListBox *box, + GtkListBoxRow *row, + gpointer user_data) +{ + GsLicenseTile *self = GS_LICENSE_TILE (user_data); + + /* The ‘Get Involved’ row is the only activatable one */ + g_signal_emit (self, obj_signals[SIGNAL_GET_INVOLVED_ACTIVATED], 0); +} + +static void +gs_license_tile_refresh (GsLicenseTile *self) +{ + const gchar *title, *css_class; + const gchar *lozenge_icon_names[3]; + g_autofree gchar *description = NULL; + gboolean is_application; + gboolean get_involved_visible; + const gchar *get_involved_label; + + /* Widget behaviour is undefined if the app is unspecified. */ + if (self->app == NULL) + return; + + is_application = gs_app_is_application (self->app); + + if (gs_app_get_license_is_free (self->app)) { + const gchar *license_spdx; + g_autofree gchar *license_url = NULL; + + title = _("Community Built"); + css_class = "green"; + lozenge_icon_names[0] = "community-supported-symbolic"; + lozenge_icon_names[1] = "community-symbolic"; + lozenge_icon_names[2] = "community-approved-symbolic"; +#if AS_CHECK_VERSION(0, 15, 3) + get_involved_visible = (gs_app_get_url (self->app, AS_URL_KIND_HOMEPAGE) != NULL || + gs_app_get_url (self->app, AS_URL_KIND_CONTRIBUTE) != NULL); +#else + get_involved_visible = (gs_app_get_url (self->app, AS_URL_KIND_HOMEPAGE) != NULL); +#endif + get_involved_label = _("_Get Involved"); + + license_spdx = gs_app_get_license (self->app); + license_url = as_get_license_url (license_spdx); + + if (is_application) { + if (license_url != NULL) { + /* Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This app is developed in the open by an international community, and released under the %s license." + "\n\n" + "You can participate and help make it even better."), + license_url, + license_spdx); + } else { + /* Translators: The placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This app is developed in the open by an international community, and released under the %s license." + "\n\n" + "You can participate and help make it even better."), + license_spdx); + } + } else if (license_url != NULL) { + /* Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This software is developed in the open by an international community, and released under the %s license." + "\n\n" + "You can participate and help make it even better."), + license_url, + license_spdx); + } else { + /* Translators: The placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This software is developed in the open by an international community, and released under the %s license." + "\n\n" + "You can participate and help make it even better."), + license_spdx); + } + } else if (gs_app_get_license (self->app) == NULL) { + title = _("Unknown License"); + css_class = "grey"; + lozenge_icon_names[0] = "community-blocked-symbolic"; + lozenge_icon_names[1] = "dialog-warning-symbolic"; + lozenge_icon_names[2] = "software-license-symbolic"; + get_involved_visible = TRUE; + get_involved_label = _("_Learn More"); + + if (is_application) { + description = g_strdup (_("This app does not specify what license it is developed under, and may be proprietary. It may be insecure in ways that are hard to detect, and it may change without oversight." + "\n\n" + "You may or may not be able to contribute to this app.")); + } else { + description = g_strdup (_("This software does not specify what license it is developed under, and may be proprietary. It may be insecure in ways that are hard to detect, and it may change without oversight." + "\n\n" + "You may or may not be able to contribute to this software.")); + } + } else if (g_ascii_strncasecmp (gs_app_get_license (self->app), "LicenseRef-proprietary", strlen ("LicenseRef-proprietary")) == 0) { + title = _("Proprietary"); + css_class = "yellow"; + lozenge_icon_names[0] = "community-blocked-symbolic"; + lozenge_icon_names[1] = "proprietary-code-symbolic"; + lozenge_icon_names[2] = "software-license-symbolic"; + get_involved_visible = TRUE; + get_involved_label = _("_Learn More"); + + if (is_application) { + description = g_strdup (_("This app is not developed in the open, so only its developers know how it works. It may be insecure in ways that are hard to detect, and it may change without oversight." + "\n\n" + "You may not be able to contribute to this app.")); + } else { + description = g_strdup (_("This software is not developed in the open, so only its developers know how it works. It may be insecure in ways that are hard to detect, and it may change without oversight." + "\n\n" + "You may not be able to contribute to this software.")); + } + } else { + const gchar *license_spdx; + g_autofree gchar *license_url = NULL; + + license_spdx = gs_app_get_license (self->app); + license_url = as_get_license_url (license_spdx); + + title = _("Special License"); + css_class = "yellow"; + lozenge_icon_names[0] = "community-blocked-symbolic"; + lozenge_icon_names[1] = "software-license-symbolic"; + lozenge_icon_names[2] = "community-none-symbolic"; + get_involved_visible = FALSE; + get_involved_label = _("_Learn More"); + + if (is_application) { + if (license_url != NULL) { + /* Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This app is developed under the special license %s." + "\n\n" + "You may or may not be able to contribute to this app."), + license_url, + license_spdx); + } else { + /* Translators: The placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This app is developed under the special license “%s”." + "\n\n" + "You may or may not be able to contribute to this app."), + license_spdx); + } + } else if (license_url != NULL) { + /* Translators: The first placeholder here is a link to information about the license, and the second placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This software is developed under the special license %s." + "\n\n" + "You may or may not be able to contribute to this software."), + license_url, + license_spdx); + } else { + get_involved_visible = TRUE; + /* Translators: The placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This software is developed under the special license “%s”." + "\n\n" + "You may or may not be able to contribute to this software."), + license_spdx); + } + } + + for (gsize i = 0; i < G_N_ELEMENTS (self->lozenges); i++) { + gtk_widget_remove_css_class (self->lozenges[i], "green"); + gtk_widget_remove_css_class (self->lozenges[i], "yellow"); + gtk_widget_add_css_class (self->lozenges[i], css_class); + gs_lozenge_set_icon_name (GS_LOZENGE (self->lozenges[i]), lozenge_icon_names[i]); + } + + gtk_label_set_label (self->title_label, title); + gtk_label_set_label (self->description_label, description); + gtk_widget_set_visible (GTK_WIDGET (self->get_involved_button_row), get_involved_visible); + adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->get_involved_button_row), get_involved_label); +} + +static void +notify_license_or_urls_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + gs_license_tile_refresh (GS_LICENSE_TILE (user_data)); +} + +static void +gs_license_tile_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsLicenseTile *self = GS_LICENSE_TILE (object); + + switch ((GsLicenseTileProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_license_tile_get_app (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_license_tile_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsLicenseTile *self = GS_LICENSE_TILE (object); + + switch ((GsLicenseTileProperty) prop_id) { + case PROP_APP: + gs_license_tile_set_app (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_license_tile_dispose (GObject *object) +{ + GsLicenseTile *self = GS_LICENSE_TILE (object); + + gs_license_tile_set_app (self, NULL); + gs_widget_remove_all (GTK_WIDGET (self), NULL); + + G_OBJECT_CLASS (gs_license_tile_parent_class)->dispose (object); +} + +static void +gs_license_tile_class_init (GsLicenseTileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_license_tile_get_property; + object_class->set_property = gs_license_tile_set_property; + object_class->dispose = gs_license_tile_dispose; + + /** + * GsLicenseTile:app: (nullable) + * + * App to display license information for. + * + * If this is %NULL, the state of the widget is undefined. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + /** + * GsLicenseTile::get-involved-activated: + * + * Emitted when the ‘Get Involved’ button is clicked, for a #GsApp which + * is FOSS licensed. + * + * Typically the caller should open the app’s ‘get involved’ link or + * homepage when this signal is emitted. + * + * Since: 41 + */ + obj_signals[SIGNAL_GET_INVOLVED_ACTIVATED] = + g_signal_new ("get-involved-activated", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-license-tile.ui"); + + gtk_widget_class_bind_template_child_full (widget_class, "lozenge0", FALSE, G_STRUCT_OFFSET (GsLicenseTile, lozenges[0])); + gtk_widget_class_bind_template_child_full (widget_class, "lozenge1", FALSE, G_STRUCT_OFFSET (GsLicenseTile, lozenges[1])); + gtk_widget_class_bind_template_child_full (widget_class, "lozenge2", FALSE, G_STRUCT_OFFSET (GsLicenseTile, lozenges[2])); + gtk_widget_class_bind_template_child (widget_class, GsLicenseTile, title_label); + gtk_widget_class_bind_template_child (widget_class, GsLicenseTile, description_label); + gtk_widget_class_bind_template_child (widget_class, GsLicenseTile, get_involved_button_row); + + gtk_widget_class_bind_template_callback (widget_class, gs_license_tile_row_activated_cb); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); +} + +/** + * gs_license_tile_new: + * @app: (nullable) (transfer none): app to display the license information for + * + * Create a new #GsLicenseTile. + * + * Returns: (transfer full) (type GsLicenseTile): a new #GsLicenseTile + * Since: 41 + */ +GtkWidget * +gs_license_tile_new (GsApp *app) +{ + g_return_val_if_fail (app == NULL || GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_LICENSE_TILE, + "app", app, + NULL); +} + +/** + * gs_license_tile_get_app: + * @self: a #GsLicenseTile + * + * Get the value of #GsLicenseTile:app. + * + * Returns: (transfer none) (nullable): the app being displayed in the tile + * Since: 41 + */ +GsApp * +gs_license_tile_get_app (GsLicenseTile *self) +{ + g_return_val_if_fail (GS_IS_LICENSE_TILE (self), NULL); + + return self->app; +} + +/** + * gs_license_tile_set_app: + * @self: a #GsLicenseTile + * @app: (nullable) (transfer none): new app to display in the tile + * + * Set the value of #GsLicenseTile:app to @app. + * + * Since: 41 + */ +void +gs_license_tile_set_app (GsLicenseTile *self, + GsApp *app) +{ + g_return_if_fail (GS_IS_LICENSE_TILE (self)); + g_return_if_fail (app == NULL || GS_IS_APP (app)); + + if (self->app == app) + return; + + g_clear_signal_handler (&self->notify_license_handler, self->app); + g_clear_signal_handler (&self->notify_urls_handler, self->app); + + g_set_object (&self->app, app); + + if (self->app != NULL) { + self->notify_license_handler = g_signal_connect (self->app, "notify::license", G_CALLBACK (notify_license_or_urls_cb), self); + self->notify_urls_handler = g_signal_connect (self->app, "notify::urls", G_CALLBACK (notify_license_or_urls_cb), self); + } + + gs_license_tile_refresh (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); +} diff --git a/src/gs-license-tile.h b/src/gs-license-tile.h new file mode 100644 index 0000000..9aba436 --- /dev/null +++ b/src/gs-license-tile.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" + +G_BEGIN_DECLS + +#define GS_TYPE_LICENSE_TILE (gs_license_tile_get_type ()) + +G_DECLARE_FINAL_TYPE (GsLicenseTile, gs_license_tile, GS, LICENSE_TILE, GtkWidget) + +GtkWidget *gs_license_tile_new (GsApp *app); + +GsApp *gs_license_tile_get_app (GsLicenseTile *self); +void gs_license_tile_set_app (GsLicenseTile *self, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-license-tile.ui b/src/gs-license-tile.ui new file mode 100644 index 0000000..c9609c8 --- /dev/null +++ b/src/gs-license-tile.ui @@ -0,0 +1,95 @@ + + + + + + diff --git a/src/gs-loading-page.c b/src/gs-loading-page.c new file mode 100644 index 0000000..b7ee672 --- /dev/null +++ b/src/gs-loading-page.c @@ -0,0 +1,257 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * Copyright (C) 2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-shell.h" +#include "gs-loading-page.h" + +typedef struct { + GsPluginLoader *plugin_loader; + GCancellable *cancellable; + GsShell *shell; + + GtkWidget *progressbar; + GtkWidget *status_page; + gboolean progress_is_pulsing; + guint progress_pulse_id; +} GsLoadingPagePrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsLoadingPage, gs_loading_page, GS_TYPE_PAGE) + +enum { + SIGNAL_REFRESHED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +static gboolean +_pulse_cb (gpointer user_data) +{ + GsLoadingPage *self = GS_LOADING_PAGE (user_data); + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progressbar)); + return TRUE; +} + +static void +stop_progress_pulse (GsLoadingPage *self) +{ + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + + if (priv->progress_pulse_id != 0) { + g_source_remove (priv->progress_pulse_id); + priv->progress_pulse_id = 0; + } +} + +static void +maybe_schedule_progress_pulse (GsLoadingPage *self) +{ + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + + if (!priv->progress_is_pulsing || !gtk_widget_get_mapped (GTK_WIDGET (self))) + return; + + g_assert (priv->progress_pulse_id == 0); + priv->progress_pulse_id = g_timeout_add (50, _pulse_cb, self); +} + +static void +gs_loading_page_job_progress_cb (GsPluginJobRefreshMetadata *plugin_job, + guint progress_percent, + gpointer user_data) +{ + GsLoadingPage *self = GS_LOADING_PAGE (user_data); + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + + /* update title */ + adw_status_page_set_title (ADW_STATUS_PAGE (priv->status_page), + /* TRANSLATORS: initial start */ + _("Refreshing Data")); + + /* update progressbar */ + stop_progress_pulse (self); + + if (progress_percent == G_MAXUINT) { + priv->progress_is_pulsing = TRUE; + maybe_schedule_progress_pulse (self); + } else { + priv->progress_is_pulsing = FALSE; + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progressbar), + (gdouble) progress_percent / 100.0f); + } +} + +static void +gs_loading_page_refresh_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + GsLoadingPage *self = GS_LOADING_PAGE (user_data); + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + g_autoptr(GError) error = NULL; + + /* no longer care */ + g_signal_handlers_disconnect_by_data (plugin_loader, self); + + /* not sure how to handle this */ + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + g_warning ("failed to load metadata: %s", error->message); + } + + /* no more pulsing */ + priv->progress_is_pulsing = FALSE; + stop_progress_pulse (self); + + /* UI is good to go */ + g_signal_emit (self, signals[SIGNAL_REFRESHED], 0); +} + +static void +gs_loading_page_load (GsLoadingPage *self) +{ + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GSettings) settings = NULL; + guint64 cache_age_secs; + + /* Ensure that at least some metadata of any age is present, and also + * spin up the plugins enough as to prime caches. If this is the first + * run of gnome-software, set the cache age to 24h to ensure that the + * metadata is refreshed if, for example, this is the first boot of a + * computer which has been in storage (after manufacture) for a while. + * Otherwise, set the cache age to the maximum, to only refresh if we’re + * completely missing app data — otherwise, we want to start up as fast + * as possible. */ + settings = g_settings_new ("org.gnome.software"); + if (g_settings_get_boolean (settings, "first-run")) { + g_settings_set_boolean (settings, "first-run", FALSE); + cache_age_secs = 60 * 60 * 24; /* 24 hours */ + } else + cache_age_secs = G_MAXUINT64; + + plugin_job = gs_plugin_job_refresh_metadata_new (cache_age_secs, + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + g_signal_connect (plugin_job, "progress", G_CALLBACK (gs_loading_page_job_progress_cb), self); + gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job, + priv->cancellable, + gs_loading_page_refresh_cb, + self); +} + +static void +gs_loading_page_switch_to (GsPage *page) +{ + GsLoadingPage *self = GS_LOADING_PAGE (page); + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + + if (gs_shell_get_mode (priv->shell) != GS_SHELL_MODE_LOADING) { + g_warning ("Called switch_to(loading) when in mode %s", + gs_shell_get_mode_string (priv->shell)); + return; + } + gs_loading_page_load (self); +} + +static gboolean +gs_loading_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsLoadingPage *self = GS_LOADING_PAGE (page); + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + + g_return_val_if_fail (GS_IS_LOADING_PAGE (self), TRUE); + + priv->shell = shell; + priv->plugin_loader = g_object_ref (plugin_loader); + priv->cancellable = g_object_ref (cancellable); + return TRUE; +} + +static void +gs_loading_page_dispose (GObject *object) +{ + GsLoadingPage *self = GS_LOADING_PAGE (object); + GsLoadingPagePrivate *priv = gs_loading_page_get_instance_private (self); + + stop_progress_pulse (self); + + g_clear_object (&priv->plugin_loader); + g_clear_object (&priv->cancellable); + + G_OBJECT_CLASS (gs_loading_page_parent_class)->dispose (object); +} + +static void +gs_loading_page_map (GtkWidget *widget) +{ + GsLoadingPage *self = GS_LOADING_PAGE (widget); + + GTK_WIDGET_CLASS (gs_loading_page_parent_class)->map (widget); + + maybe_schedule_progress_pulse (self); +} + +static void +gs_loading_page_unmap (GtkWidget *widget) +{ + GsLoadingPage *self = GS_LOADING_PAGE (widget); + + stop_progress_pulse (self); + + GTK_WIDGET_CLASS (gs_loading_page_parent_class)->unmap (widget); +} + +static void +gs_loading_page_class_init (GsLoadingPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPageClass *page_class = GS_PAGE_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_loading_page_dispose; + + widget_class->map = gs_loading_page_map; + widget_class->unmap = gs_loading_page_unmap; + + page_class->switch_to = gs_loading_page_switch_to; + page_class->setup = gs_loading_page_setup; + + signals [SIGNAL_REFRESHED] = + g_signal_new ("refreshed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsLoadingPageClass, refreshed), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-loading-page.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, GsLoadingPage, progressbar); + gtk_widget_class_bind_template_child_private (widget_class, GsLoadingPage, status_page); +} + +static void +gs_loading_page_init (GsLoadingPage *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +GsLoadingPage * +gs_loading_page_new (void) +{ + GsLoadingPage *self; + self = g_object_new (GS_TYPE_LOADING_PAGE, NULL); + return GS_LOADING_PAGE (self); +} diff --git a/src/gs-loading-page.h b/src/gs-loading-page.h new file mode 100644 index 0000000..7064ec7 --- /dev/null +++ b/src/gs-loading-page.h @@ -0,0 +1,29 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes + * Copyright (C) 2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_LOADING_PAGE (gs_loading_page_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsLoadingPage, gs_loading_page, GS, LOADING_PAGE, GsPage) + +struct _GsLoadingPageClass +{ + GsPageClass parent_class; + + void (*refreshed) (GsLoadingPage *self); +}; + +GsLoadingPage *gs_loading_page_new (void); + +G_END_DECLS diff --git a/src/gs-loading-page.ui b/src/gs-loading-page.ui new file mode 100644 index 0000000..e9d1f78 --- /dev/null +++ b/src/gs-loading-page.ui @@ -0,0 +1,33 @@ + + + + + + diff --git a/src/gs-lozenge.c b/src/gs-lozenge.c new file mode 100644 index 0000000..5a17098 --- /dev/null +++ b/src/gs-lozenge.c @@ -0,0 +1,470 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Red Hat (www.redhat.com) + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-lozenge.h" +#include "gs-layout-manager.h" + +#define GS_TYPE_LOZENGE_LAYOUT (gs_lozenge_layout_get_type ()) +G_DECLARE_FINAL_TYPE (GsLozengeLayout, gs_lozenge_layout, GS, LOZENGE_LAYOUT, GsLayoutManager) + +struct _GsLozengeLayout +{ + GsLayoutManager parent_instance; + + gboolean circular; +}; + +G_DEFINE_TYPE (GsLozengeLayout, gs_lozenge_layout, GS_TYPE_LAYOUT_MANAGER) + +static void +gs_lozenge_layout_measure (GtkLayoutManager *layout_manager, + GtkWidget *widget, + GtkOrientation orientation, + gint for_size, + gint *minimum, + gint *natural, + gint *minimum_baseline, + gint *natural_baseline) +{ + GsLozengeLayout *self = GS_LOZENGE_LAYOUT (layout_manager); + + GTK_LAYOUT_MANAGER_CLASS (gs_lozenge_layout_parent_class)->measure (layout_manager, + widget, orientation, for_size, minimum, natural, minimum_baseline, natural_baseline); + + if (self->circular) { + *minimum = MAX (for_size, *minimum); + *natural = *minimum; + *natural_baseline = *minimum_baseline; + } + + if (*natural_baseline > *natural) + *natural_baseline = *natural; + if (*minimum_baseline > *minimum) + *minimum_baseline = *minimum; +} + +static void +gs_lozenge_layout_class_init (GsLozengeLayoutClass *klass) +{ + GtkLayoutManagerClass *layout_manager_class = GTK_LAYOUT_MANAGER_CLASS (klass); + + layout_manager_class->measure = gs_lozenge_layout_measure; +} + +static void +gs_lozenge_layout_init (GsLozengeLayout *self) +{ +} + +/* ********************************************************************* */ + +struct _GsLozenge +{ + GtkBox parent_instance; + + GtkWidget *image; /* (unowned) */ + GtkWidget *label; /* (unowned) */ + + gchar *icon_name; + gchar *text; + gchar *markup; + gboolean circular; + gint pixel_size; +}; + +G_DEFINE_TYPE (GsLozenge, gs_lozenge, GTK_TYPE_BOX) + +typedef enum { + PROP_CIRCULAR = 1, + PROP_ICON_NAME, + PROP_PIXEL_SIZE, + PROP_TEXT, + PROP_MARKUP +} GsLozengeProperty; + +static GParamSpec *obj_props[PROP_MARKUP + 1] = { NULL, }; + +static void +gs_lozenge_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsLozenge *self = GS_LOZENGE (object); + + switch ((GsLozengeProperty) prop_id) { + case PROP_CIRCULAR: + g_value_set_boolean (value, gs_lozenge_get_circular (self)); + break; + case PROP_ICON_NAME: + g_value_set_string (value, gs_lozenge_get_icon_name (self)); + break; + case PROP_PIXEL_SIZE: + g_value_set_int (value, gs_lozenge_get_pixel_size (self)); + break; + case PROP_TEXT: + g_value_set_string (value, gs_lozenge_get_text (self)); + break; + case PROP_MARKUP: + g_value_set_string (value, gs_lozenge_get_markup (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_lozenge_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsLozenge *self = GS_LOZENGE (object); + + switch ((GsLozengeProperty) prop_id) { + case PROP_CIRCULAR: + gs_lozenge_set_circular (self, g_value_get_boolean (value)); + break; + case PROP_ICON_NAME: + gs_lozenge_set_icon_name (self, g_value_get_string (value)); + break; + case PROP_PIXEL_SIZE: + gs_lozenge_set_pixel_size (self, g_value_get_int (value)); + break; + case PROP_TEXT: + gs_lozenge_set_text (self, g_value_get_string (value)); + break; + case PROP_MARKUP: + gs_lozenge_set_markup (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_lozenge_dispose (GObject *object) +{ + GsLozenge *self = GS_LOZENGE (object); + + g_clear_pointer (&self->icon_name, g_free); + g_clear_pointer (&self->text, g_free); + g_clear_pointer (&self->markup, g_free); + + G_OBJECT_CLASS (gs_lozenge_parent_class)->dispose (object); +} + +static void +gs_lozenge_class_init (GsLozengeClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_lozenge_get_property; + object_class->set_property = gs_lozenge_set_property; + object_class->dispose = gs_lozenge_dispose; + + /** + * GsLozenge:circular: + * + * Whether the lozenge should be circular/square widget. + * + * Since: 43 + */ + obj_props[PROP_CIRCULAR] = + g_param_spec_boolean ("circular", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsLozenge:icon-name: + * + * An icon name for the lozenge. Setting this property turns + * the lozenge into the icon mode, which mean showing the icon, + * not the markup. + * + * Since: 43 + */ + obj_props[PROP_ICON_NAME] = + g_param_spec_string ("icon-name", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsLozenge:pixel-size: + * + * An icon pixel size for the lozenge. + * + * Since: 43 + */ + obj_props[PROP_PIXEL_SIZE] = + g_param_spec_int ("pixel-size", NULL, NULL, + 0, G_MAXINT, 16, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsLozenge:text: + * + * A plain text for the lozenge. Setting this property turns + * the lozenge into the text mode, which mean showing the text, + * not the icon. + * + * Since: 43 + */ + obj_props[PROP_TEXT] = + g_param_spec_string ("text", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsLozenge:markup: + * + * A markup text for the lozenge. Setting this property turns + * the lozenge into the text mode, which mean showing the markup, + * not the icon. + * + * Since: 43 + */ + obj_props[PROP_MARKUP] = + g_param_spec_string ("markup", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_layout_manager_type (widget_class, GS_TYPE_LOZENGE_LAYOUT); + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-lozenge.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsLozenge, image); + gtk_widget_class_bind_template_child (widget_class, GsLozenge, label); +} + +static void +gs_lozenge_init (GsLozenge *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + self->pixel_size = 16; +} + +/** + * gs_lozenge_new: + * + * Returns: (transfer full): a new #GsLozenge + * + * Since: 43 + **/ +GtkWidget * +gs_lozenge_new (void) +{ + return g_object_new (GS_TYPE_LOZENGE, NULL); +} + +const gchar * +gs_lozenge_get_icon_name (GsLozenge *self) +{ + g_return_val_if_fail (GS_IS_LOZENGE (self), NULL); + + return self->icon_name; +} + +gboolean +gs_lozenge_get_circular (GsLozenge *self) +{ + g_return_val_if_fail (GS_IS_LOZENGE (self), FALSE); + + return self->circular; +} + +void +gs_lozenge_set_circular (GsLozenge *self, + gboolean value) +{ + GtkLayoutManager *layout_manager; + + g_return_if_fail (GS_IS_LOZENGE (self)); + + if ((!self->circular) == (!value)) + return; + + self->circular = value; + + layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (self)); + GS_LOZENGE_LAYOUT (layout_manager)->circular = self->circular; + gtk_layout_manager_layout_changed (layout_manager); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CIRCULAR]); +} + +void +gs_lozenge_set_icon_name (GsLozenge *self, + const gchar *value) +{ + g_return_if_fail (GS_IS_LOZENGE (self)); + + if (value != NULL && *value == '\0') + value = NULL; + + if (g_strcmp0 (self->icon_name, value) == 0) + return; + + g_clear_pointer (&self->icon_name, g_free); + self->icon_name = g_strdup (value); + + if (self->icon_name == NULL) { + gtk_widget_set_visible (self->image, FALSE); + gtk_widget_set_visible (self->label, TRUE); + } else { + gtk_image_set_from_icon_name (GTK_IMAGE (self->image), self->icon_name); + gtk_widget_set_visible (self->label, FALSE); + gtk_widget_set_visible (self->image, TRUE); + } + + /* Clean up the other properties before notifying of the changed property name */ + + if (self->text != NULL) { + g_clear_pointer (&self->text, g_free); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_TEXT]); + } + + if (self->markup != NULL) { + g_clear_pointer (&self->markup, g_free); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_MARKUP]); + } + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_ICON_NAME]); +} + +gint +gs_lozenge_get_pixel_size (GsLozenge *self) +{ + g_return_val_if_fail (GS_IS_LOZENGE (self), 0); + + return self->pixel_size; +} + +void +gs_lozenge_set_pixel_size (GsLozenge *self, + gint value) +{ + g_return_if_fail (GS_IS_LOZENGE (self)); + + if (self->pixel_size == value) + return; + + self->pixel_size = value; + + gtk_image_set_pixel_size (GTK_IMAGE (self->image), self->pixel_size); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_PIXEL_SIZE]); +} + +gboolean +gs_lozenge_get_use_markup (GsLozenge *self) +{ + g_return_val_if_fail (GS_IS_LOZENGE (self), FALSE); + return gtk_label_get_use_markup (GTK_LABEL (self->label)); +} + +const gchar * +gs_lozenge_get_text (GsLozenge *self) +{ + g_return_val_if_fail (GS_IS_LOZENGE (self), NULL); + + return self->text; +} + +void +gs_lozenge_set_text (GsLozenge *self, + const gchar *value) +{ + g_return_if_fail (GS_IS_LOZENGE (self)); + + if (value != NULL && *value == '\0') + value = NULL; + + if (g_strcmp0 (self->text, value) == 0) + return; + + g_clear_pointer (&self->text, g_free); + self->text = g_strdup (value); + + if (self->text == NULL) { + gtk_widget_set_visible (self->label, FALSE); + gtk_widget_set_visible (self->image, TRUE); + } else { + gtk_label_set_text (GTK_LABEL (self->label), self->text); + gtk_widget_set_visible (self->image, FALSE); + gtk_widget_set_visible (self->label, TRUE); + } + + /* Clean up the other properties before notifying of the changed property name */ + + if (self->icon_name != NULL) { + g_clear_pointer (&self->icon_name, g_free); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_ICON_NAME]); + } + + if (self->markup != NULL) { + g_clear_pointer (&self->markup, g_free); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_MARKUP]); + } + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_TEXT]); +} + +const gchar * +gs_lozenge_get_markup (GsLozenge *self) +{ + g_return_val_if_fail (GS_IS_LOZENGE (self), NULL); + + return self->markup; +} + +void +gs_lozenge_set_markup (GsLozenge *self, + const gchar *value) +{ + g_return_if_fail (GS_IS_LOZENGE (self)); + + if (value != NULL && *value == '\0') + value = NULL; + + if (g_strcmp0 (self->markup, value) == 0) + return; + + g_clear_pointer (&self->markup, g_free); + self->markup = g_strdup (value); + + if (self->markup == NULL) { + gtk_widget_set_visible (self->label, FALSE); + gtk_widget_set_visible (self->image, TRUE); + } else { + gtk_label_set_markup (GTK_LABEL (self->label), self->markup); + gtk_widget_set_visible (self->image, FALSE); + gtk_widget_set_visible (self->label, TRUE); + } + + /* Clean up the other properties before notifying of the changed property name */ + + if (self->icon_name != NULL) { + g_clear_pointer (&self->icon_name, g_free); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_ICON_NAME]); + } + + if (self->text != NULL) { + g_clear_pointer (&self->text, g_free); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_TEXT]); + } + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_MARKUP]); +} diff --git a/src/gs-lozenge.h b/src/gs-lozenge.h new file mode 100644 index 0000000..deae9c0 --- /dev/null +++ b/src/gs-lozenge.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2022 Red Hat (www.redhat.com) + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_LOZENGE (gs_lozenge_get_type ()) +G_DECLARE_FINAL_TYPE (GsLozenge, gs_lozenge, GS, LOZENGE, GtkBox) + +GtkWidget * gs_lozenge_new (void); +gboolean gs_lozenge_get_circular (GsLozenge *self); +void gs_lozenge_set_circular (GsLozenge *self, + gboolean value); +const gchar * gs_lozenge_get_icon_name (GsLozenge *self); +void gs_lozenge_set_icon_name (GsLozenge *self, + const gchar *value); +gint gs_lozenge_get_pixel_size (GsLozenge *self); +void gs_lozenge_set_pixel_size (GsLozenge *self, + gint value); +gboolean gs_lozenge_get_use_markup (GsLozenge *self); +const gchar * gs_lozenge_get_text (GsLozenge *self); +void gs_lozenge_set_text (GsLozenge *self, + const gchar *value); +const gchar * gs_lozenge_get_markup (GsLozenge *self); +void gs_lozenge_set_markup (GsLozenge *self, + const gchar *value); + +G_END_DECLS diff --git a/src/gs-lozenge.ui b/src/gs-lozenge.ui new file mode 100644 index 0000000..a7c9d17 --- /dev/null +++ b/src/gs-lozenge.ui @@ -0,0 +1,33 @@ + + + + + diff --git a/src/gs-main.c b/src/gs-main.c new file mode 100644 index 0000000..5b0719c --- /dev/null +++ b/src/gs-main.c @@ -0,0 +1,51 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2012-2013 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-application.h" +#include "gs-debug.h" + +int +main (int argc, char **argv) +{ + int status = 0; + g_autoptr(GDesktopAppInfo) appinfo = NULL; + g_autoptr(GsApplication) application = NULL; + g_autoptr(GsDebug) debug = gs_debug_new_from_environment (); + + setlocale (LC_ALL, ""); + + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + /* Override the umask to 022 to make it possible to share files between + * the gnome-software process and flatpak system helper process. + * Ideally this should be set when needed in the flatpak plugin, but + * umask is thread-unsafe so there is really no local way to fix this. + */ + umask (022); + + /* redirect logs */ + application = gs_application_new (debug); + appinfo = g_desktop_app_info_new ("org.gnome.Software.desktop"); + if (appinfo != NULL) + g_set_application_name (g_app_info_get_name (G_APP_INFO (appinfo))); + status = g_application_run (G_APPLICATION (application), argc, argv); + return status; +} diff --git a/src/gs-origin-popover-row.c b/src/gs-origin-popover-row.c new file mode 100644 index 0000000..b18beb3 --- /dev/null +++ b/src/gs-origin-popover-row.c @@ -0,0 +1,204 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-common.h" + +#include "gs-origin-popover-row.h" + +#include + +typedef struct +{ + GsApp *app; + GtkCssProvider *css_provider; + GtkWidget *name_label; + GtkWidget *info_label; + GtkWidget *installed_image; + GtkWidget *packaging_box; + GtkWidget *packaging_image; + GtkWidget *packaging_label; + GtkWidget *beta_box; + GtkWidget *user_scope_box; + GtkWidget *selected_image; +} GsOriginPopoverRowPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsOriginPopoverRow, gs_origin_popover_row, GTK_TYPE_LIST_BOX_ROW) + +static void +refresh_ui (GsOriginPopoverRow *row) +{ + GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row); + const gchar *packaging_base_css_color, *packaging_icon; + g_autofree gchar *packaging_format = NULL; + g_autofree gchar *info = NULL; + g_autofree gchar *css = NULL; + g_autofree gchar *origin_ui = NULL; + g_autofree gchar *url = NULL; + + g_assert (GS_IS_ORIGIN_POPOVER_ROW (row)); + g_assert (GS_IS_APP (priv->app)); + + origin_ui = gs_app_dup_origin_ui (priv->app, FALSE); + if (origin_ui != NULL) + gtk_label_set_text (GTK_LABEL (priv->name_label), origin_ui); + + if (gs_app_get_state (priv->app) == GS_APP_STATE_AVAILABLE_LOCAL || + gs_app_get_local_file (priv->app) != NULL) { + GFile *local_file = gs_app_get_local_file (priv->app); + url = g_file_get_basename (local_file); + } else { + url = g_strdup (gs_app_get_origin_hostname (priv->app)); + } + + if (gs_app_get_bundle_kind (priv->app) == AS_BUNDLE_KIND_SNAP) { + const gchar *branch = NULL, *version = NULL; + const gchar *order[3]; + const gchar *items[7] = { NULL, }; + guint index = 0; + + branch = gs_app_get_branch (priv->app); + version = gs_app_get_version (priv->app); + + if (gtk_widget_get_direction (GTK_WIDGET (row)) == GTK_TEXT_DIR_RTL) { + order[0] = version; + order[1] = branch; + order[2] = url; + } else { + order[0] = url; + order[1] = branch; + order[2] = version; + } + + for (guint ii = 0; ii < G_N_ELEMENTS (order); ii++) { + const gchar *value = order[ii]; + + if (value != NULL) { + if (index > 0) { + items[index] = "•"; + index++; + } + items[index] = value; + index++; + } + } + + if (index > 0) { + g_assert (index + 1 < G_N_ELEMENTS (items)); + items[index] = NULL; + + info = g_strjoinv (" ", (gchar **) items); + } + } else { + info = g_steal_pointer (&url); + } + + if (info != NULL) + gtk_label_set_text (GTK_LABEL (priv->info_label), info); + else + gtk_label_set_text (GTK_LABEL (priv->info_label), _("Unknown source")); + + gtk_widget_set_visible (priv->installed_image, gs_app_is_installed (priv->app)); + gtk_widget_set_visible (priv->beta_box, gs_app_has_quirk (priv->app, GS_APP_QUIRK_DEVELOPMENT_SOURCE)); + + if (gs_app_get_bundle_kind (priv->app) == AS_BUNDLE_KIND_FLATPAK && + gs_app_get_scope (priv->app) != AS_COMPONENT_SCOPE_UNKNOWN) { + AsComponentScope scope = gs_app_get_scope (priv->app); + gtk_widget_set_visible (priv->user_scope_box, scope == AS_COMPONENT_SCOPE_USER); + } else { + gtk_widget_set_visible (priv->user_scope_box, FALSE); + } + + packaging_base_css_color = gs_app_get_metadata_item (priv->app, "GnomeSoftware::PackagingBaseCssColor"); + packaging_icon = gs_app_get_metadata_item (priv->app, "GnomeSoftware::PackagingIcon"); + packaging_format = gs_app_get_packaging_format (priv->app); + + gtk_label_set_text (GTK_LABEL (priv->packaging_label), packaging_format); + + if (packaging_icon != NULL) + gtk_image_set_from_icon_name (GTK_IMAGE (priv->packaging_image), packaging_icon); + + if (packaging_base_css_color != NULL) + css = g_strdup_printf (" color: @%s;\n", packaging_base_css_color); + + gs_utils_widget_set_css (priv->packaging_box, &priv->css_provider, css); +} + +static void +gs_origin_popover_row_set_app (GsOriginPopoverRow *row, GsApp *app) +{ + GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row); + + g_assert (priv->app == NULL); + + priv->app = g_object_ref (app); + refresh_ui (row); +} + +GsApp * +gs_origin_popover_row_get_app (GsOriginPopoverRow *row) +{ + GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row); + return priv->app; +} + +void +gs_origin_popover_row_set_selected (GsOriginPopoverRow *row, gboolean selected) +{ + GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row); + + gtk_widget_set_visible (priv->selected_image, selected); +} + +static void +gs_origin_popover_row_dispose (GObject *object) +{ + GsOriginPopoverRow *row = GS_ORIGIN_POPOVER_ROW (object); + GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row); + + g_clear_object (&priv->app); + g_clear_object (&priv->css_provider); + + G_OBJECT_CLASS (gs_origin_popover_row_parent_class)->dispose (object); +} + +static void +gs_origin_popover_row_init (GsOriginPopoverRow *row) +{ + gtk_widget_init_template (GTK_WIDGET (row)); +} + +static void +gs_origin_popover_row_class_init (GsOriginPopoverRowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_origin_popover_row_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-origin-popover-row.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, name_label); + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, info_label); + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, installed_image); + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, packaging_box); + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, packaging_image); + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, packaging_label); + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, beta_box); + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, user_scope_box); + gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, selected_image); +} + +GtkWidget * +gs_origin_popover_row_new (GsApp *app) +{ + GsOriginPopoverRow *row = g_object_new (GS_TYPE_ORIGIN_POPOVER_ROW, NULL); + gs_origin_popover_row_set_app (row, app); + return GTK_WIDGET (row); +} diff --git a/src/gs-origin-popover-row.h b/src/gs-origin-popover-row.h new file mode 100644 index 0000000..674daaa --- /dev/null +++ b/src/gs-origin-popover-row.h @@ -0,0 +1,30 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gnome-software-private.h" +#include + +G_BEGIN_DECLS + +#define GS_TYPE_ORIGIN_POPOVER_ROW (gs_origin_popover_row_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsOriginPopoverRow, gs_origin_popover_row, GS, ORIGIN_POPOVER_ROW, GtkListBoxRow) + +struct _GsOriginPopoverRowClass +{ + GtkListBoxRowClass parent_class; +}; + +GtkWidget *gs_origin_popover_row_new (GsApp *app); +GsApp *gs_origin_popover_row_get_app (GsOriginPopoverRow *row); +void gs_origin_popover_row_set_selected (GsOriginPopoverRow *row, + gboolean selected); + +G_END_DECLS diff --git a/src/gs-origin-popover-row.ui b/src/gs-origin-popover-row.ui new file mode 100644 index 0000000..46605da --- /dev/null +++ b/src/gs-origin-popover-row.ui @@ -0,0 +1,155 @@ + + + + + diff --git a/src/gs-os-update-page.c b/src/gs-os-update-page.c new file mode 100644 index 0000000..4b73091 --- /dev/null +++ b/src/gs-os-update-page.c @@ -0,0 +1,461 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * Copyright (C) 2021 Purism SPC + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-os-update-page + * @title: GsOsUpdatePage + * @include: gnome-software.h + * @stability: Stable + * @short_description: A small page showing OS updates + * + * This is a page from #GsUpdateDialog. + */ + +#include "config.h" + +#include + +#include "gs-os-update-page.h" +#include "gs-common.h" + +typedef enum { + GS_OS_UPDATE_PAGE_SECTION_ADDITIONS, + GS_OS_UPDATE_PAGE_SECTION_REMOVALS, + GS_OS_UPDATE_PAGE_SECTION_UPDATES, + GS_OS_UPDATE_PAGE_SECTION_DOWNGRADES, + GS_OS_UPDATE_PAGE_SECTION_LAST, +} GsOsUpdatePageSection; + +typedef enum { + PROP_APP = 1, +} GsOsUpdatePageProperty; + +enum { + SIGNAL_APP_ACTIVATED, + SIGNAL_LAST +}; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +static guint signals[SIGNAL_LAST] = { 0 }; + +struct _GsOsUpdatePage +{ + AdwNavigationPage parent_instance; + + GtkWidget *page; + + GsApp *app; /* (owned) (nullable) */ + GtkWidget *list_boxes[GS_OS_UPDATE_PAGE_SECTION_LAST]; + GtkWidget *groups[GS_OS_UPDATE_PAGE_SECTION_LAST]; +}; + +G_DEFINE_TYPE (GsOsUpdatePage, gs_os_update_page, ADW_TYPE_NAVIGATION_PAGE) + +static void +row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + GsOsUpdatePage *page) +{ + GsApp *app; + + app = GS_APP (g_object_get_data (G_OBJECT (row), "app")); + g_assert (app != NULL); + + g_signal_emit (page, signals[SIGNAL_APP_ACTIVATED], 0, app); +} + +static gchar * +format_version_update (GsApp *app, GtkTextDirection direction) +{ + const gchar *tmp; + const gchar *version_current = NULL; + const gchar *version_update = NULL; + + /* current version */ + tmp = gs_app_get_version (app); + if (tmp != NULL && tmp[0] != '\0') + version_current = tmp; + + /* update version */ + tmp = gs_app_get_update_version (app); + if (tmp != NULL && tmp[0] != '\0') + version_update = tmp; + + /* have both */ + if (version_current != NULL && version_update != NULL && + g_strcmp0 (version_current, version_update) != 0) { + switch (direction) { + case GTK_TEXT_DIR_RTL: + /* ensure the arrow is the right way round for the text direction, + * as arrows are not bidi-mirrored automatically + * See section 2 of http://www.unicode.org/L2/L2017/17438-bidi-math-fdbk.html + * Also escaping an LTR mark character at the beginning of the string to + * prevent versions without a letter in them (e.g., +rc1) from messing up. */ + return g_strdup_printf ("\xE2\x80\x8E%s ← %s", + version_update, + version_current); + case GTK_TEXT_DIR_NONE: + case GTK_TEXT_DIR_LTR: + default: + return g_strdup_printf ("%s → %s", + version_current, + version_update); + } + } + + /* just update */ + if (version_update) + return g_strdup (version_update); + + /* we have nothing, nada, zilch */ + return NULL; +} + +static GtkWidget * +create_app_row (GsApp *app) +{ + GtkWidget *row; + + row = adw_action_row_new (); + + g_object_set_data_full (G_OBJECT (row), + "app", + g_object_ref (app), + g_object_unref); + + adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), gs_app_get_source_default (app)); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE); + + if (gs_app_get_update_urgency (app) >= AS_URGENCY_KIND_CRITICAL) { + GtkWidget *image; + + image = gtk_image_new_from_icon_name ("emblem-important-symbolic"); + gtk_image_set_pixel_size (GTK_IMAGE (image), 16); + gtk_widget_set_tooltip_text (image, _("Critical Update")); + gtk_widget_set_margin_end (image, 6); + gtk_widget_add_css_class (image, "warning"); + adw_action_row_add_suffix (ADW_ACTION_ROW (row), image); + } + + if (gs_app_get_state (app) == GS_APP_STATE_UPDATABLE || + gs_app_get_state (app) == GS_APP_STATE_UPDATABLE_LIVE) { + g_autofree gchar *verstr = format_version_update (app, gtk_widget_get_direction (row)); + adw_action_row_set_subtitle (ADW_ACTION_ROW (row), verstr); + } else { + adw_action_row_set_subtitle (ADW_ACTION_ROW (row), gs_app_get_version (app)); + } + + adw_action_row_add_suffix (ADW_ACTION_ROW (row), gtk_image_new_from_icon_name ("go-next-symbolic")); + + return row; +} + +static gboolean +is_downgrade (const gchar *evr1, + const gchar *evr2) +{ + gint rc; + + if (evr1 == NULL || evr2 == NULL) + return FALSE; + + rc = gs_utils_compare_versions (evr1, evr2); + if (rc != 0) + return rc > 0; + + return FALSE; +} + +static GsOsUpdatePageSection +get_app_section (GsApp *app) +{ + GsOsUpdatePageSection section; + + /* Sections: + * 1. additions + * 2. removals + * 3. updates + * 4. downgrades */ + switch (gs_app_get_state (app)) { + case GS_APP_STATE_AVAILABLE: + section = GS_OS_UPDATE_PAGE_SECTION_ADDITIONS; + break; + case GS_APP_STATE_UNAVAILABLE: + case GS_APP_STATE_INSTALLED: + section = GS_OS_UPDATE_PAGE_SECTION_REMOVALS; + break; + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_UPDATABLE_LIVE: + if (is_downgrade (gs_app_get_version (app), + gs_app_get_update_version (app))) + section = GS_OS_UPDATE_PAGE_SECTION_DOWNGRADES; + else + section = GS_OS_UPDATE_PAGE_SECTION_UPDATES; + break; + default: + g_warning ("get_app_section: unhandled state %s for %s", + gs_app_state_to_string (gs_app_get_state (app)), + gs_app_get_unique_id (app)); + section = GS_OS_UPDATE_PAGE_SECTION_UPDATES; + break; + } + + return section; +} + +static gint +os_updates_sort_func (GtkListBoxRow *a, + GtkListBoxRow *b, + gpointer user_data) +{ + GObject *o1 = G_OBJECT (a); + GObject *o2 = G_OBJECT (b); + GsApp *a1 = g_object_get_data (o1, "app"); + GsApp *a2 = g_object_get_data (o2, "app"); + const gchar *key1 = gs_app_get_source_default (a1); + const gchar *key2 = gs_app_get_source_default (a2); + + return g_strcmp0 (key1, key2); +} + +static const gchar * +get_section_title (GsOsUpdatePageSection section) +{ + const gchar *title = NULL; + + if (section == GS_OS_UPDATE_PAGE_SECTION_ADDITIONS) { + /* TRANSLATORS: This is the header for package additions during + * a system update */ + title = _("Additions"); + } else if (section == GS_OS_UPDATE_PAGE_SECTION_REMOVALS) { + /* TRANSLATORS: This is the header for package removals during + * a system update */ + title = _("Removals"); + } else if (section == GS_OS_UPDATE_PAGE_SECTION_UPDATES) { + /* TRANSLATORS: This is the header for package updates during + * a system update */ + title = C_("Packages to be updated during a system upgrade", "Updates"); + } else if (section == GS_OS_UPDATE_PAGE_SECTION_DOWNGRADES) { + /* TRANSLATORS: This is the header for package downgrades during + * a system update */ + title = _("Downgrades"); + } else { + g_assert_not_reached (); + } + + return title; +} + +static void +create_section (GsOsUpdatePage *page, GsOsUpdatePageSection section) +{ + page->list_boxes[section] = gtk_list_box_new (); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (page->list_boxes[section]), + GTK_SELECTION_NONE); + gtk_list_box_set_sort_func (GTK_LIST_BOX (page->list_boxes[section]), + os_updates_sort_func, + page, NULL); + g_signal_connect (GTK_LIST_BOX (page->list_boxes[section]), "row-activated", + G_CALLBACK (row_activated_cb), page); + adw_preferences_group_add (ADW_PREFERENCES_GROUP (page->groups[section]), page->list_boxes[section]); + gtk_widget_set_visible (page->groups[section], TRUE); + + /* make rounded edges */ + gtk_widget_set_overflow (page->list_boxes[section], GTK_OVERFLOW_HIDDEN); + gtk_widget_add_css_class (page->list_boxes[section], "boxed-list"); +} + +/** + * gs_os_update_page_get_app: + * @page: a #GsOsUpdatePage + * + * Get the value of #GsOsUpdatePage:app. + * + * Returns: (nullable) (transfer none): the app + * + * Since: 41 + */ +GsApp * +gs_os_update_page_get_app (GsOsUpdatePage *page) +{ + g_return_val_if_fail (GS_IS_OS_UPDATE_PAGE (page), NULL); + return page->app; +} + +/** + * gs_os_update_page_set_app: + * @page: a #GsOsUpdatePage + * @app: (transfer none) (nullable): new app + * + * Set the value of #GsOsUpdatePage:app. + * + * Since: 41 + */ +void +gs_os_update_page_set_app (GsOsUpdatePage *page, GsApp *app) +{ + GsAppList *related; + GsApp *app_related; + GsOsUpdatePageSection section; + GtkWidget *row; + + g_return_if_fail (GS_IS_OS_UPDATE_PAGE (page)); + g_return_if_fail (!app || GS_IS_APP (app)); + + if (page->app == app) + return; + + g_set_object (&page->app, app); + + /* clear existing data */ + for (guint i = 0; i < GS_OS_UPDATE_PAGE_SECTION_LAST; i++) { + gtk_widget_set_visible (page->groups[i], FALSE); + if (page->list_boxes[i] != NULL) { + adw_preferences_group_remove (ADW_PREFERENCES_GROUP (page->groups[i]), page->list_boxes[i]); + page->list_boxes[i] = NULL; + } + } + + if (app) { + adw_navigation_page_set_title (ADW_NAVIGATION_PAGE (page), gs_app_get_name (app)); + adw_preferences_page_set_description (ADW_PREFERENCES_PAGE (page->page), gs_app_get_description (app)); + + /* add new apps */ + related = gs_app_get_related (app); + for (guint i = 0; i < gs_app_list_length (related); i++) { + app_related = gs_app_list_index (related, i); + + section = get_app_section (app_related); + if (page->list_boxes[section] == NULL) + create_section (page, section); + + row = create_app_row (app_related); + gtk_list_box_append (GTK_LIST_BOX (page->list_boxes[section]), row); + } + } else { + adw_navigation_page_set_title (ADW_NAVIGATION_PAGE (page), NULL); + adw_preferences_page_set_description (ADW_PREFERENCES_PAGE (page->page), NULL); + } + + g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_APP]); +} + +static void +gs_os_update_page_dispose (GObject *object) +{ + GsOsUpdatePage *page = GS_OS_UPDATE_PAGE (object); + + g_clear_object (&page->app); + + G_OBJECT_CLASS (gs_os_update_page_parent_class)->dispose (object); +} + +static void +gs_os_update_page_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsOsUpdatePage *page = GS_OS_UPDATE_PAGE (object); + + switch ((GsOsUpdatePageProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_os_update_page_get_app (page)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_os_update_page_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsOsUpdatePage *page = GS_OS_UPDATE_PAGE (object); + + switch ((GsOsUpdatePageProperty) prop_id) { + case PROP_APP: + gs_os_update_page_set_app (page, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_os_update_page_init (GsOsUpdatePage *page) +{ + gtk_widget_init_template (GTK_WIDGET (page)); + + for (guint i = 0; i < GS_OS_UPDATE_PAGE_SECTION_LAST; i++) { + page->groups[i] = adw_preferences_group_new (); + gtk_widget_set_visible (page->groups[i], FALSE); + adw_preferences_group_set_title (ADW_PREFERENCES_GROUP (page->groups[i]), get_section_title (i)); + adw_preferences_page_add (ADW_PREFERENCES_PAGE (page->page), ADW_PREFERENCES_GROUP (page->groups[i])); + } +} + +static void +gs_os_update_page_class_init (GsOsUpdatePageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_os_update_page_dispose; + object_class->get_property = gs_os_update_page_get_property; + object_class->set_property = gs_os_update_page_set_property; + + /** + * GsOsUpdatePage:app: (nullable) + * + * The app to present. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + /** + * GsOsUpdatePage:app-activated: + * @app: a #GsApp + * + * Emitted when an app listed in this page got activated and the + * #GsUpdateDialog containing this page is expected to present its + * details via a #GsAppDetailsPage. + * + * Since: 41 + */ + signals[SIGNAL_APP_ACTIVATED] = + g_signal_new ("app-activated", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_generic, + G_TYPE_NONE, 1, GS_TYPE_APP); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-os-update-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsOsUpdatePage, page); +} + +/** + * gs_os_update_page_new: + * + * Create a new #GsOsUpdatePage. + * + * Returns: (transfer full): a new #GsOsUpdatePage + * Since: 41 + */ +GtkWidget * +gs_os_update_page_new (void) +{ + return GTK_WIDGET (g_object_new (GS_TYPE_OS_UPDATE_PAGE, NULL)); +} diff --git a/src/gs-os-update-page.h b/src/gs-os-update-page.h new file mode 100644 index 0000000..1a14529 --- /dev/null +++ b/src/gs-os-update-page.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Purism SPC + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_OS_UPDATE_PAGE (gs_os_update_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsOsUpdatePage, gs_os_update_page, GS, OS_UPDATE_PAGE, AdwNavigationPage) + +GtkWidget *gs_os_update_page_new (void); +GsApp *gs_os_update_page_get_app (GsOsUpdatePage *page); +void gs_os_update_page_set_app (GsOsUpdatePage *page, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-os-update-page.ui b/src/gs-os-update-page.ui new file mode 100644 index 0000000..3a8933a --- /dev/null +++ b/src/gs-os-update-page.ui @@ -0,0 +1,19 @@ + + + + + + diff --git a/src/gs-overview-page.c b/src/gs-overview-page.c new file mode 100644 index 0000000..fe04986 --- /dev/null +++ b/src/gs-overview-page.c @@ -0,0 +1,1363 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-shell.h" +#include "gs-overview-page.h" +#include "gs-app-list-private.h" +#include "gs-featured-carousel.h" +#include "gs-category-tile.h" +#include "gs-common.h" +#include "gs-summary-tile.h" + +/* Chosen as it has 2 and 3 as factors, so will form an even 2-column and + * 3-column layout. */ +#define N_TILES 12 + +/* Even when asking for N_TILES apps, the curated apps can be less than N_TILES */ +#define MIN_CURATED_APPS 6 + +/* Show all apps in the overview page when there are less than these apps */ +#define MIN_CATEGORIES_APPS 100 + +struct _GsOverviewPage +{ + GsPage parent_instance; + + GsPluginLoader *plugin_loader; + GCancellable *cancellable; + gboolean cache_valid; + GsShell *shell; + gint action_cnt; + gboolean loading_featured; + gboolean loading_curated; + gboolean loading_deployment_featured; + gboolean loading_recent; + gboolean loading_categories; + gboolean empty; + gboolean featured_overwritten; + GHashTable *category_hash; /* id : GsCategory */ + GsFedoraThirdParty *third_party; + gboolean third_party_needs_question; + gchar **deployment_featured; + + AdwDialog *dialog_third_party; + GtkWidget *featured_carousel; + GtkWidget *box_curated; + GtkWidget *box_recent; + GtkWidget *box_deployment_featured; + GtkWidget *box_all_apps; + GtkWidget *heading_all_apps; + GtkWidget *flowbox_categories; + GtkWidget *flowbox_iconless_categories; + GtkWidget *iconless_categories_heading; + GtkWidget *curated_heading; + GtkWidget *recent_heading; + GtkWidget *deployment_featured_heading; + GtkWidget *scrolledwindow_overview; + GtkWidget *stack_overview; +}; + +G_DEFINE_TYPE (GsOverviewPage, gs_overview_page, GS_TYPE_PAGE) + +typedef enum { + PROP_VADJUSTMENT = 1, + PROP_TITLE, +} GsOverviewPageProperty; + +enum { + SIGNAL_REFRESHED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +static void +third_party_response_cb (AdwAlertDialog *dialog, + const gchar *response, + GsOverviewPage *self); + +static void +gs_overview_page_invalidate (GsOverviewPage *self) +{ + self->cache_valid = FALSE; +} + +static void +app_activated_cb (GsOverviewPage *self, GsAppTile *tile) +{ + GsApp *app; + + app = gs_app_tile_get_app (tile); + + if (!app) + return; + + gs_shell_show_app (self->shell, app); +} + +static void +featured_carousel_app_clicked_cb (GsFeaturedCarousel *carousel, + GsApp *app, + gpointer user_data) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (user_data); + + gs_shell_show_app (self->shell, app); +} + +static void +gs_overview_page_decrement_action_cnt (GsOverviewPage *self) +{ + /* every job increments this */ + if (self->action_cnt == 0) { + g_warning ("action_cnt already zero!"); + return; + } + if (--self->action_cnt > 0) + return; + + /* all done */ + self->cache_valid = TRUE; + g_signal_emit (self, signals[SIGNAL_REFRESHED], 0); + self->loading_categories = FALSE; + self->loading_deployment_featured = FALSE; + self->loading_featured = FALSE; + self->loading_curated = FALSE; + self->loading_recent = FALSE; +} + +static void +gs_overview_page_get_curated_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + guint i; + GsApp *app; + GtkWidget *tile; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + /* get curated apps */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get curated apps: %s", error->message); + goto out; + } + + /* not enough to show */ + if (gs_app_list_length (list) < MIN_CURATED_APPS) { + g_warning ("Only %u apps for curated list, hiding", + gs_app_list_length (list)); + gtk_widget_set_visible (self->box_curated, FALSE); + gtk_widget_set_visible (self->curated_heading, FALSE); + goto out; + } + + g_assert (gs_app_list_length (list) >= MIN_CURATED_APPS && gs_app_list_length (list) <= N_TILES); + + /* Ensure as it has 2 and 3 as factors, so it will form an even + * 2-column and 3-column layout. */ + while (gs_app_list_length (list) > 0 && + ((gs_app_list_length (list) % 3) != 0 || + (gs_app_list_length (list) % 2) != 0)) { + /* Remove the last app from the list */ + gs_app_list_remove (list, gs_app_list_index (list, gs_app_list_length (list) - 1)); + } + + gs_widget_remove_all (self->box_curated, (GsRemoveFunc) gtk_flow_box_remove); + + for (i = 0; i < gs_app_list_length (list); i++) { + app = gs_app_list_index (list, i); + tile = gs_summary_tile_new (app); + gtk_flow_box_insert (GTK_FLOW_BOX (self->box_curated), tile, -1); + } + gtk_widget_set_visible (self->box_curated, TRUE); + gtk_widget_set_visible (self->curated_heading, TRUE); + + self->empty = FALSE; + +out: + gs_overview_page_decrement_action_cnt (self); +} + +static gint +gs_overview_page_sort_recent_cb (GsApp *app1, + GsApp *app2, + gpointer user_data) +{ + if (gs_app_get_release_date (app1) < gs_app_get_release_date (app2)) + return 1; + if (gs_app_get_release_date (app1) == gs_app_get_release_date (app2)) + return g_strcmp0 (gs_app_get_name (app1), gs_app_get_name (app2)); + return -1; +} + +static gboolean +gs_overview_page_filter_recent_cb (GsApp *app, + gpointer user_data) +{ + return (!gs_app_has_quirk (app, GS_APP_QUIRK_COMPULSORY) && + gs_app_get_kind (app) == AS_COMPONENT_KIND_DESKTOP_APP); +} + +static void +gs_overview_page_get_recent_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + guint i; + GsApp *app; + GtkWidget *tile; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + /* get recent apps */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get recent apps: %s", error->message); + goto out; + } + + /* not enough to show */ + if (gs_app_list_length (list) < N_TILES) { + g_warning ("Only %u apps for recent list, hiding", + gs_app_list_length (list)); + gtk_widget_set_visible (self->box_recent, FALSE); + gtk_widget_set_visible (self->recent_heading, FALSE); + goto out; + } + + g_assert (gs_app_list_length (list) <= N_TILES); + + gs_widget_remove_all (self->box_recent, (GsRemoveFunc) gtk_flow_box_remove); + + for (i = 0; i < gs_app_list_length (list); i++) { + guint64 release_date; + g_autofree gchar *release_date_tooltip = NULL; + + app = gs_app_list_index (list, i); + tile = gs_summary_tile_new (app); + + /* Shows the latest release date of the app in + relative format (e.g. "10 days ago") on hover. */ + release_date = gs_app_get_release_date (app); + release_date_tooltip = gs_utils_time_to_datestring (release_date); + gtk_widget_set_tooltip_text (tile, release_date_tooltip); + + gtk_flow_box_insert (GTK_FLOW_BOX (self->box_recent), tile, -1); + } + gtk_widget_set_visible (self->box_recent, TRUE); + gtk_widget_set_visible (self->recent_heading, TRUE); + + self->empty = FALSE; + +out: + gs_overview_page_decrement_action_cnt (self); +} + +static gboolean +filter_hi_res_icon (GsApp *app, gpointer user_data) +{ + g_autoptr(GIcon) icon = NULL; + GtkWidget *overview_page = GTK_WIDGET (user_data); + + /* This is the minimum icon size needed by `GsFeatureTile`. */ + icon = gs_app_get_icon_for_size (app, + 128, + gtk_widget_get_scale_factor (overview_page), + NULL); + + /* Returning TRUE means to keep the app in the list */ + return (icon != NULL); +} + +static void +gs_overview_page_get_featured_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + goto out; + + if (self->featured_overwritten) { + g_debug ("Skipping set of featured apps, because being overwritten"); + goto out; + } + + if (list == NULL || gs_app_list_length (list) == 0) { + g_warning ("failed to get featured apps: %s", + (error != NULL) ? error->message : "no apps to show"); + gtk_widget_set_visible (self->featured_carousel, FALSE); + goto out; + } + + gtk_widget_set_visible (self->featured_carousel, gs_app_list_length (list) > 0); + gs_featured_carousel_set_apps (GS_FEATURED_CAROUSEL (self->featured_carousel), list); + + self->empty = self->empty && (gs_app_list_length (list) == 0); + +out: + gs_overview_page_decrement_action_cnt (self); +} + +static void +gs_overview_page_get_deployment_featured_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (user_data); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + guint i; + GsApp *app; + GtkWidget *tile; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + /* get deployment-featured apps */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) + g_warning ("failed to get deployment-featured apps: %s", error->message); + goto out; + } + + /* not enough to show */ + if (gs_app_list_length (list) < N_TILES) { + g_warning ("Only %u apps for deployment-featured list, hiding", + gs_app_list_length (list)); + gtk_widget_set_visible (self->box_deployment_featured, FALSE); + gtk_widget_set_visible (self->deployment_featured_heading, FALSE); + goto out; + } + + g_assert (gs_app_list_length (list) == N_TILES); + gs_widget_remove_all (self->box_deployment_featured, (GsRemoveFunc) gtk_flow_box_remove); + + for (i = 0; i < gs_app_list_length (list); i++) { + app = gs_app_list_index (list, i); + tile = gs_summary_tile_new (app); + gtk_flow_box_insert (GTK_FLOW_BOX (self->box_deployment_featured), tile, -1); + } + gtk_widget_set_visible (self->box_deployment_featured, TRUE); + gtk_widget_set_visible (self->deployment_featured_heading, TRUE); + + self->empty = FALSE; + + out: + gs_overview_page_decrement_action_cnt (self); +} + +typedef struct { + GsOverviewPage *self; /* (owned) */ + GsAppList *list; /* (owned) */ + gint n_pending; +} GatherAppsData; + +static void +decrement_gather_apps (GatherAppsData *data) +{ + if (!g_atomic_int_dec_and_test (&data->n_pending)) + return; + + g_debug ("%s: gathered %u apps", G_STRFUNC, gs_app_list_length (data->list)); + + gtk_widget_set_visible (data->self->heading_all_apps, gs_app_list_length (data->list) > 0); + gtk_widget_set_visible (data->self->box_all_apps, gs_app_list_length (data->list) > 0); + + gs_app_list_sort (data->list, gs_utils_app_sort_name, NULL); + + for (guint i = 0; i < gs_app_list_length (data->list); i++) { + GsApp *app = gs_app_list_index (data->list, i); + GtkWidget *tile; + + tile = gs_summary_tile_new (app); + gtk_flow_box_insert (GTK_FLOW_BOX (data->self->box_all_apps), tile, -1); + } + + data->self->empty = data->self->empty && gs_app_list_length (data->list) == 0; + + gs_overview_page_decrement_action_cnt (data->self); + + g_clear_object (&data->self); + g_clear_object (&data->list); + g_free (data); +} + +static void +gs_overview_page_gather_apps_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GatherAppsData *data = user_data; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* ignore errors */ + } else if (list != NULL) { + gs_app_list_add_list (data->list, list); + } + + decrement_gather_apps (data); +} + +static void +category_activated_cb (GsOverviewPage *self, GsCategoryTile *tile) +{ + GsCategory *category; + + category = gs_category_tile_get_category (tile); + gs_shell_show_category (self->shell, category); +} + +typedef struct { + GsOverviewPage *page; /* (unowned) */ + GsPluginJobListCategories *job; /* (owned) */ + guint n_pending_ops; +} GetCategoriesData; + +static void +get_categories_data_free (GetCategoriesData *data) +{ + g_clear_object (&data->job); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GetCategoriesData, get_categories_data_free) + +static guint +update_categories_sections (GsOverviewPage *self, + GPtrArray *list) /* (element-type GsCategory) */ +{ + GsCategory *cat; + GtkFlowBox *flowbox; + GtkWidget *tile; + guint added_cnt = 0; + guint found_apps_cnt = 0; + + if (g_cancellable_is_cancelled (self->cancellable)) + return found_apps_cnt; + + gs_widget_remove_all (self->flowbox_categories, (GsRemoveFunc) gtk_flow_box_remove); + gs_widget_remove_all (self->flowbox_iconless_categories, (GsRemoveFunc) gtk_flow_box_remove); + + gtk_widget_set_visible (self->heading_all_apps, FALSE); + gtk_widget_set_visible (self->box_all_apps, FALSE); + gs_widget_remove_all (self->box_all_apps, (GsRemoveFunc) gtk_flow_box_remove); + + /* Add categories to the flowboxes. Categories with icons are deemed to + * be visually important, and are listed near the top of the page. + * Categories without icons are listed in a separate flowbox at the + * bottom of the page. Typically they are addons. */ + for (guint i = 0; list != NULL && i < list->len; i++) { + cat = GS_CATEGORY (g_ptr_array_index (list, i)); + if (gs_category_get_size (cat) == 0) + continue; + tile = gs_category_tile_new (cat); + + if (gs_category_get_icon_name (cat) != NULL) { + found_apps_cnt += gs_category_get_size (cat); + g_debug ("overview page found category '%s' which claims %u apps", gs_category_get_name (cat), gs_category_get_size (cat)); + flowbox = GTK_FLOW_BOX (self->flowbox_categories); + } else + flowbox = GTK_FLOW_BOX (self->flowbox_iconless_categories); + + gtk_flow_box_insert (flowbox, tile, -1); + added_cnt++; + + /* we save these for the 'More...' buttons */ + g_hash_table_insert (self->category_hash, + g_strdup (gs_category_get_id (cat)), + g_object_ref (cat)); + } + + /* Show the heading for the iconless categories iff there are any. */ + gtk_widget_set_visible (self->iconless_categories_heading, + gtk_flow_box_get_child_at_index (GTK_FLOW_BOX (self->flowbox_iconless_categories), 0) != NULL); + + if (added_cnt > 0) + self->empty = FALSE; + + /* If there are too few apps available, show them all on the overview + * page rather than showing the category buttons. Effectively, this + * hides the category pages entirely, as with too few apps these pages + * will be too empty to look nice. + * See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2053 */ + gtk_widget_set_visible (self->flowbox_categories, found_apps_cnt >= MIN_CATEGORIES_APPS); + + return found_apps_cnt; +} + +static void +finish_verify_category_op (GetCategoriesData *op_data) +{ + g_autoptr(GetCategoriesData) data = g_steal_pointer (&op_data); + GsOverviewPage *self = GS_OVERVIEW_PAGE (data->page); + guint i, found_apps_cnt; + GPtrArray *list; /* (element-type GsCategory) */ + + data->n_pending_ops--; + if (data->n_pending_ops > 0) { + /* to not be freed */ + g_steal_pointer (&data); + return; + } + + list = gs_plugin_job_list_categories_get_result_list (data->job); + found_apps_cnt = update_categories_sections (self, list); + + g_debug ("overview page found %u category apps", found_apps_cnt); + if (found_apps_cnt < MIN_CATEGORIES_APPS && found_apps_cnt > 0) { + GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE; + GatherAppsData *gather_apps_data = g_new0 (GatherAppsData, 1); + + gather_apps_data->n_pending = 1; + gather_apps_data->self = g_object_ref (self); + gather_apps_data->list = gs_app_list_new (); + + for (i = 0; list != NULL && i < list->len; i++) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + GsCategory *cat, *subcat; + + cat = GS_CATEGORY (g_ptr_array_index (list, i)); + if (gs_category_get_size (cat) == 0 || + gs_category_get_icon_name (cat) == NULL) + continue; + + subcat = gs_category_find_child (cat, "all"); + if (subcat == NULL) + continue; + + query = gs_app_query_new ("category", subcat, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, flags); + + g_atomic_int_inc (&gather_apps_data->n_pending); + + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->cancellable, + gs_overview_page_gather_apps_cb, + gather_apps_data); + } + + decrement_gather_apps (gather_apps_data); + + /* inherit the action count */ + return; + } + + gs_overview_page_decrement_action_cnt (self); +} + +typedef struct { + GsOverviewPage *page; /* (unowned) */ + GetCategoriesData *op_data; /* (unowned) */ + GsCategory *category; /* (owned) */ +} VerifyCategoryData; + +static void +verify_category_data_free (VerifyCategoryData *data) +{ + g_clear_object (&data->category); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (VerifyCategoryData, verify_category_data_free) + +static void +gs_overview_page_verify_category_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + g_autoptr(VerifyCategoryData) data = user_data; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) local_error = NULL; + g_autoptr(GsAppList) list = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &local_error); + if (list == NULL) { + if (!g_error_matches (local_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get apps for category: %s", local_error->message); + g_debug ("Failed to get category content '%s' for overview page: %s", gs_category_get_id (data->category), local_error->message); + } else { + GsCategory *all_subcat = gs_category_find_child (data->category, "all"); + guint size = gs_app_list_length (list); + g_debug ("overview page verify category '%s' size:%u~>%u subcat:'%s' size:%u~>%u", + gs_category_get_id (data->category), gs_category_get_size (data->category), size, + gs_category_get_id (all_subcat), gs_category_get_size (all_subcat), size); + gs_category_set_size (data->category, size); + gs_category_set_size (all_subcat, size); + } + + finish_verify_category_op (data->op_data); +} + +static void +gs_overview_page_get_categories_list_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + g_autoptr(GetCategoriesData) data = g_steal_pointer (&user_data); + GsOverviewPage *self = GS_OVERVIEW_PAGE (data->page); + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GError) error = NULL; + + g_assert (data->n_pending_ops == 0); + + data->n_pending_ops++; + + /* The apps can be mentioned in the appstream data, but no plugin may provide actual app, + thus try to get the content as the Categories page and fine tune the numbers appropriately. */ + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get categories: %s", error->message); + } else { + g_autoptr(GPtrArray) verify_categories = NULL; /* (element-type GsCategory) */ + GPtrArray *list = NULL; /* (element-type GsCategory) */ + guint found_apps_cnt; + + list = gs_plugin_job_list_categories_get_result_list (data->job); + found_apps_cnt = update_categories_sections (self, list); + + if (found_apps_cnt >= MIN_CATEGORIES_APPS) { + verify_categories = g_ptr_array_new_full (list != NULL ? list->len : 0, g_object_unref); + for (guint i = 0; list != NULL && i < list->len; i++) { + GsCategory *category = g_ptr_array_index (list, i); + if (gs_category_get_size (category) > 0 && + gs_category_find_child (category, "all") != NULL) { + g_ptr_array_add (verify_categories, g_object_ref (category)); + } + } + } + + if (verify_categories != NULL && verify_categories->len > 0 && !g_cancellable_is_cancelled (self->cancellable)) { + for (guint i = 0; i < verify_categories->len; i++) { + GsCategory *category = g_ptr_array_index (verify_categories, i); + GsCategory *all_subcat = gs_category_find_child (category, "all"); + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + VerifyCategoryData *ver_data; + + g_assert (all_subcat != NULL); + + data->n_pending_ops++; + + ver_data = g_new0 (VerifyCategoryData, 1); + ver_data->page = self; + ver_data->op_data = data; + ver_data->category = g_object_ref (category); + + query = gs_app_query_new ("category", all_subcat, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + gs_plugin_loader_job_process_async (plugin_loader, + plugin_job, + self->cancellable, + gs_overview_page_verify_category_cb, + ver_data); + } + + finish_verify_category_op (g_steal_pointer (&data)); + return; + } + } + + finish_verify_category_op (g_steal_pointer (&data)); +} + +static void +third_party_destroy_cb (GtkWindow *window, + GsOverviewPage *self) +{ + self->dialog_third_party = NULL; +} + +static void +refresh_third_party_repo (GsOverviewPage *self) +{ + if (!gtk_widget_get_mapped (GTK_WIDGET (self))) + return; + + if (self->third_party_needs_question && !self->dialog_third_party) { + AdwDialog *dialog; + g_autofree gchar *link = NULL; + g_autofree gchar *body = NULL; + + link = g_strdup_printf ("%s", + "https://docs.fedoraproject.org/en-US/workstation-working-group/third-party-repos/", + /* Translators: This is a clickable link on the third party repositories message dialog. It's + part of a constructed sentence: "Provides access to additional software from [selected external sources]. + Some proprietary software is included." */ + _("selected external sources")); + /* Translators: This is the third party repositories message dialog. + The %s is replaced with "selected external sources" link. + Repositories Preferences is an item from Software's main menu. */ + body = g_strdup_printf (_("Provides access to additional software from %s. Some proprietary software is included.\n\nYou can enable those repositories later in Software Repositories preferences."), + link); + + /* TRANSLATORS: Heading asking whether to turn third party software repositories on of off. */ + dialog = adw_alert_dialog_new (_("Enable Third Party Software Repositories?"), + body); + adw_alert_dialog_set_body_use_markup (ADW_ALERT_DIALOG (dialog), TRUE); + adw_alert_dialog_add_responses (ADW_ALERT_DIALOG (dialog), + /* TRANSLATORS: button to keep the third party software repositories off */ + "ignore", _("_Ignore"), + /* TRANSLATORS: button to turn on third party software repositories */ + "enable", _("_Enable"), + NULL); + g_signal_connect (dialog, "response", + G_CALLBACK (third_party_response_cb), self); + adw_dialog_present (dialog, GTK_WIDGET (self->shell)); + g_signal_connect (dialog, "destroy", + G_CALLBACK (third_party_destroy_cb), self); + + self->dialog_third_party = dialog; + } else if (!self->third_party_needs_question && self->dialog_third_party) { + adw_dialog_force_close (self->dialog_third_party); + } +} + +static gboolean +is_fedora (void) +{ + const gchar *id = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + + os_release = gs_os_release_new (NULL); + if (os_release == NULL) + return FALSE; + + id = gs_os_release_get_id (os_release); + if (g_strcmp0 (id, "fedora") == 0) + return TRUE; + + return FALSE; +} + +static void +fedora_third_party_query_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsFedoraThirdPartyState state = GS_FEDORA_THIRD_PARTY_STATE_UNKNOWN; + g_autoptr(GsOverviewPage) self = user_data; + g_autoptr(GError) error = NULL; + + if (!gs_fedora_third_party_query_finish (GS_FEDORA_THIRD_PARTY (source_object), result, &state, &error)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + g_warning ("Failed to query 'fedora-third-party': %s", error->message); + } else { + self->third_party_needs_question = state == GS_FEDORA_THIRD_PARTY_STATE_ASK; + } + + refresh_third_party_repo (self); +} + +static void +reload_third_party_repo (GsOverviewPage *self) +{ + /* Fedora-specific functionality */ + if (!is_fedora ()) + return; + + if (!gs_fedora_third_party_is_available (self->third_party)) + return; + + gs_fedora_third_party_query (self->third_party, self->cancellable, fedora_third_party_query_done_cb, g_object_ref (self)); +} + +static void +fedora_third_party_enable_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsOverviewPage) self = user_data; + g_autoptr(GError) error = NULL; + + if (!gs_fedora_third_party_switch_finish (GS_FEDORA_THIRD_PARTY (source_object), result, &error)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + g_warning ("Failed to enable 'fedora-third-party': %s", error->message); + } + + refresh_third_party_repo (self); +} + +static void +fedora_third_party_enable (GsOverviewPage *self) +{ + gs_fedora_third_party_switch (self->third_party, TRUE, FALSE, self->cancellable, fedora_third_party_enable_done_cb, g_object_ref (self)); +} + +static void +fedora_third_party_disable_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsOverviewPage) self = user_data; + g_autoptr(GError) error = NULL; + + if (!gs_fedora_third_party_opt_out_finish (GS_FEDORA_THIRD_PARTY (source_object), result, &error)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + g_warning ("Failed to disable 'fedora-third-party': %s", error->message); + } + + refresh_third_party_repo (self); +} + +static void +fedora_third_party_disable (GsOverviewPage *self) +{ + gs_fedora_third_party_opt_out (self->third_party, self->cancellable, fedora_third_party_disable_done_cb, g_object_ref (self)); +} + +static gchar * +gs_overview_page_dup_deployment_featured_filename (void) +{ + g_autofree gchar *filename = NULL; + const gchar * const *sys_dirs; + + #define FILENAME "deployment-featured.ini" + + filename = g_build_filename (SYSCONFDIR, "gnome-software", FILENAME, NULL); + if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { + g_debug ("Found '%s'", filename); + return g_steal_pointer (&filename); + } + g_debug ("File '%s' does not exist, trying next", filename); + g_clear_pointer (&filename, g_free); + + sys_dirs = g_get_system_config_dirs (); + + for (guint i = 0; sys_dirs != NULL && sys_dirs[i]; i++) { + g_autofree gchar *tmp = g_build_filename (sys_dirs[i], "gnome-software", FILENAME, NULL); + if (g_file_test (tmp, G_FILE_TEST_IS_REGULAR)) { + g_debug ("Found '%s'", tmp); + return g_steal_pointer (&tmp); + } + g_debug ("File '%s' does not exist, trying next", tmp); + } + + sys_dirs = g_get_system_data_dirs (); + + for (guint i = 0; sys_dirs != NULL && sys_dirs[i]; i++) { + g_autofree gchar *tmp = g_build_filename (sys_dirs[i], "gnome-software", FILENAME, NULL); + if (g_file_test (tmp, G_FILE_TEST_IS_REGULAR)) { + g_debug ("Found '%s'", tmp); + return g_steal_pointer (&tmp); + } + g_debug ("File '%s' does not exist, %s", tmp, sys_dirs[i + 1] ? "trying next" : "no more files to try"); + } + + #undef FILENAME + + return NULL; +} + +static gboolean +gs_overview_page_read_deployment_featured_keys (gchar **out_label, + gchar ***out_deployment_featured) +{ + g_autoptr(GKeyFile) key_file = NULL; + g_autoptr(GPtrArray) array = NULL; + g_auto(GStrv) selector = NULL; + g_autoptr(GError) error = NULL; + g_autofree gchar *filename = NULL; + + filename = gs_overview_page_dup_deployment_featured_filename (); + + if (filename == NULL) + return FALSE; + + key_file = g_key_file_new (); + if (!g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, &error)) { + g_debug ("Failed to read '%s': %s", filename, error->message); + return FALSE; + } + + selector = g_key_file_get_string_list (key_file, "Deployment Featured Apps", "Selector", NULL, NULL); + + /* Sanitize the content */ + if (selector == NULL) + return FALSE; + + array = g_ptr_array_sized_new (g_strv_length (selector) + 1); + + for (guint i = 0; selector[i] != NULL; i++) { + const gchar *value = g_strstrip (selector[i]); + if (*value != '\0') + g_ptr_array_add (array, g_strdup (value)); + } + + if (array->len == 0) + return FALSE; + + g_ptr_array_add (array, NULL); + + *out_deployment_featured = (gchar **) g_ptr_array_free (g_steal_pointer (&array), FALSE); + *out_label = g_key_file_get_locale_string (key_file, "Deployment Featured Apps", "Title", NULL, NULL); + + if (*out_label == NULL || **out_label == '\0') { + g_autoptr(GsOsRelease) os_release = gs_os_release_new (NULL); + const gchar *name = NULL; + if (os_release != NULL) + name = gs_os_release_get_name (os_release); + g_free (*out_label); + if (name == NULL) { + *out_label = g_strdup (_("Available for your operating system")); + } else { + /* Translators: the '%s' is replaced with the distribution name, constructing + for example: "Available for Fedora Linux" */ + *out_label = g_strdup_printf (_("Available for %s"), name); + } + } + + return TRUE; +} + +static void +gs_overview_page_load (GsOverviewPage *self) +{ + self->empty = TRUE; + + if (!self->loading_featured) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE; + + query = gs_app_query_new ("is-featured", GS_APP_QUERY_TRISTATE_TRUE, + "max-results", 5, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "filter-func", filter_hi_res_icon, + "filter-user-data", self, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, flags); + + self->loading_featured = TRUE; + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->cancellable, + gs_overview_page_get_featured_cb, + self); + self->action_cnt++; + } + + if (!self->loading_deployment_featured && self->deployment_featured != NULL) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE; + + self->loading_deployment_featured = TRUE; + + query = gs_app_query_new ("deployment-featured", self->deployment_featured, + "max-results", N_TILES, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, flags); + + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->cancellable, + gs_overview_page_get_deployment_featured_cb, + self); + self->action_cnt++; + } + + if (!self->loading_curated) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE; + + query = gs_app_query_new ("is-curated", GS_APP_QUERY_TRISTATE_TRUE, + "max-results", N_TILES, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, flags); + + self->loading_curated = TRUE; + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->cancellable, + gs_overview_page_get_curated_cb, + self); + self->action_cnt++; + } + + if (!self->loading_recent) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GDateTime) now = NULL; + g_autoptr(GDateTime) released_since = NULL; + g_autoptr(GsAppQuery) query = NULL; + GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE; + + now = g_date_time_new_now_local (); + released_since = g_date_time_add_seconds (now, -(60 * 60 * 24 * 30)); + query = gs_app_query_new ("released-since", released_since, + "max-results", N_TILES, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_KEY_ID | + GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "sort-func", gs_overview_page_sort_recent_cb, + "filter-func", gs_overview_page_filter_recent_cb, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + + plugin_job = gs_plugin_job_list_apps_new (query, flags); + + self->loading_recent = TRUE; + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->cancellable, + gs_overview_page_get_recent_cb, + self); + self->action_cnt++; + } + + if (!self->loading_categories) { + g_autoptr(GsPluginJob) plugin_job = NULL; + GsPluginRefineCategoriesFlags flags = GS_PLUGIN_REFINE_CATEGORIES_FLAGS_INTERACTIVE | + GS_PLUGIN_REFINE_CATEGORIES_FLAGS_SIZE; + g_autoptr(GetCategoriesData) data = NULL; + + self->loading_categories = TRUE; + plugin_job = gs_plugin_job_list_categories_new (flags); + + data = g_new0 (GetCategoriesData, 1); + data->page = self; + data->job = g_object_ref (GS_PLUGIN_JOB_LIST_CATEGORIES (plugin_job)); + + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, gs_overview_page_get_categories_list_cb, + g_steal_pointer (&data)); + self->action_cnt++; + } + + reload_third_party_repo (self); +} + +static void +gs_overview_page_reload (GsPage *page) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (page); + self->featured_overwritten = FALSE; + gs_overview_page_invalidate (self); + gs_overview_page_load (self); +} + +static void +gs_overview_page_switch_to (GsPage *page) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (page); + + if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_OVERVIEW) { + g_warning ("Called switch_to(overview) when in mode %s", + gs_shell_get_mode_string (self->shell)); + return; + } + + gs_grab_focus_when_mapped (self->scrolledwindow_overview); + + if (self->cache_valid || self->action_cnt > 0) + return; + gs_overview_page_load (self); +} + +static void +gs_overview_page_refresh_cb (GsPluginLoader *plugin_loader, + GAsyncResult *result, + GsOverviewPage *self) +{ + gboolean success; + g_autoptr(GError) error = NULL; + + success = gs_plugin_loader_job_action_finish (plugin_loader, result, &error); + if (!success && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to refresh: %s", error->message); + + if (success) + g_signal_emit_by_name (self->plugin_loader, "reload", 0, NULL); +} + +static void +third_party_response_cb (AdwAlertDialog *dialog, + const gchar *response, + GsOverviewPage *self) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + + if (g_strcmp0 (response, "enable") == 0) + fedora_third_party_enable (self); + else /* "ignore" or "close" */ + fedora_third_party_disable (self); + + self->third_party_needs_question = FALSE; + + plugin_job = gs_plugin_job_refresh_metadata_new (1, + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + (GAsyncReadyCallback) gs_overview_page_refresh_cb, + self); +} + +static gboolean +gs_overview_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (page); + GtkWidget *tile; + gint i; + + g_return_val_if_fail (GS_IS_OVERVIEW_PAGE (self), TRUE); + + self->plugin_loader = g_object_ref (plugin_loader); + self->third_party = gs_fedora_third_party_new (plugin_loader); + self->cancellable = g_object_ref (cancellable); + self->category_hash = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) g_object_unref); + + /* create message dialog if not already dismissed in initial-setup */ + g_signal_connect (self, "map", + G_CALLBACK (refresh_third_party_repo), NULL); + reload_third_party_repo (self); + + /* avoid a ref cycle */ + self->shell = shell; + + for (i = 0; i < N_TILES; i++) { + tile = gs_summary_tile_new (NULL); + gtk_flow_box_insert (GTK_FLOW_BOX (self->box_curated), tile, -1); + } + + for (i = 0; i < N_TILES; i++) { + tile = gs_summary_tile_new (NULL); + gtk_flow_box_insert (GTK_FLOW_BOX (self->box_recent), tile, -1); + } + + return TRUE; +} + +static void +refreshed_cb (GsOverviewPage *self, gpointer user_data) +{ + g_debug ("Overview refresh finished: setting UI to %s", self->empty ? "empty" : "show results"); + + if (self->empty) { + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_overview), "no-results"); + } else { + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_overview), "overview"); + } +} + +static void +gs_overview_page_init (GsOverviewPage *self) +{ + g_autofree gchar *tmp_label = NULL; + + g_type_ensure (GS_TYPE_FEATURED_CAROUSEL); + + gtk_widget_init_template (GTK_WIDGET (self)); + + gs_featured_carousel_set_apps (GS_FEATURED_CAROUSEL (self->featured_carousel), NULL); + + g_signal_connect (self, "refreshed", G_CALLBACK (refreshed_cb), self); + + if (gs_overview_page_read_deployment_featured_keys (&tmp_label, &self->deployment_featured)) + gtk_label_set_text (GTK_LABEL (self->deployment_featured_heading), tmp_label); +} + +static void +gs_overview_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (object); + + switch ((GsOverviewPageProperty) prop_id) { + case PROP_VADJUSTMENT: + g_value_set_object (value, gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_overview))); + break; + case PROP_TITLE: + /* Translators: This is the title of the main page of the UI. */ + g_value_set_string (value, _("Explore")); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_overview_page_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch ((GsOverviewPageProperty) prop_id) { + case PROP_VADJUSTMENT: + case PROP_TITLE: + /* Read only. */ + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_overview_page_dispose (GObject *object) +{ + GsOverviewPage *self = GS_OVERVIEW_PAGE (object); + + g_clear_object (&self->plugin_loader); + g_clear_object (&self->cancellable); + g_clear_object (&self->third_party); + g_clear_pointer (&self->category_hash, g_hash_table_unref); + g_clear_pointer (&self->deployment_featured, g_strfreev); + if (self->dialog_third_party) + adw_dialog_force_close (self->dialog_third_party); + + G_OBJECT_CLASS (gs_overview_page_parent_class)->dispose (object); +} + +static void +gs_overview_page_class_init (GsOverviewPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPageClass *page_class = GS_PAGE_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_overview_page_get_property; + object_class->set_property = gs_overview_page_set_property; + object_class->dispose = gs_overview_page_dispose; + + page_class->switch_to = gs_overview_page_switch_to; + page_class->reload = gs_overview_page_reload; + page_class->setup = gs_overview_page_setup; + + g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment"); + g_object_class_override_property (object_class, PROP_TITLE, "title"); + + signals [SIGNAL_REFRESHED] = + g_signal_new ("refreshed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-overview-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, featured_carousel); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, box_curated); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, box_recent); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, box_deployment_featured); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, box_all_apps); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, heading_all_apps); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, flowbox_categories); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, flowbox_iconless_categories); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, iconless_categories_heading); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, curated_heading); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, recent_heading); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, deployment_featured_heading); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, scrolledwindow_overview); + gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, stack_overview); + gtk_widget_class_bind_template_callback (widget_class, featured_carousel_app_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, category_activated_cb); + gtk_widget_class_bind_template_callback (widget_class, app_activated_cb); +} + +GsOverviewPage * +gs_overview_page_new (void) +{ + return GS_OVERVIEW_PAGE (g_object_new (GS_TYPE_OVERVIEW_PAGE, NULL)); +} + +void +gs_overview_page_override_featured (GsOverviewPage *self, + GsApp *app) +{ + g_autoptr(GsAppList) list = NULL; + + g_return_if_fail (GS_IS_OVERVIEW_PAGE (self)); + g_return_if_fail (GS_IS_APP (app)); + + self->featured_overwritten = TRUE; + + list = gs_app_list_new (); + gs_app_list_add (list, app); + gs_featured_carousel_set_apps (GS_FEATURED_CAROUSEL (self->featured_carousel), list); +} diff --git a/src/gs-overview-page.h b/src/gs-overview-page.h new file mode 100644 index 0000000..e6e4fb3 --- /dev/null +++ b/src/gs-overview-page.h @@ -0,0 +1,25 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_OVERVIEW_PAGE (gs_overview_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsOverviewPage, gs_overview_page, GS, OVERVIEW_PAGE, GsPage) + +GsOverviewPage *gs_overview_page_new (void); +void gs_overview_page_override_featured + (GsOverviewPage *self, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-overview-page.ui b/src/gs-overview-page.ui new file mode 100644 index 0000000..d990201 --- /dev/null +++ b/src/gs-overview-page.ui @@ -0,0 +1,224 @@ + + + + + + diff --git a/src/gs-page.c b/src/gs-page.c new file mode 100644 index 0000000..9a88300 --- /dev/null +++ b/src/gs-page.c @@ -0,0 +1,1012 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-application.h" +#include "gs-download-utils.h" +#include "gs-page.h" +#include "gs-common.h" +#include "gs-screenshot-image.h" + +typedef struct +{ + GsPluginLoader *plugin_loader; + GsShell *shell; + GtkWidget *header_start_widget; + GtkWidget *header_end_widget; + gboolean is_active; +} GsPagePrivate; + +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GsPage, gs_page, GTK_TYPE_WIDGET) + +typedef enum { + PROP_TITLE = 1, + PROP_COUNTER, + PROP_VADJUSTMENT, +} GsPageProperty; + +static GParamSpec *obj_props[PROP_VADJUSTMENT + 1] = { NULL, }; + +GsShell * +gs_page_get_shell (GsPage *page) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + return priv->shell; +} + +typedef struct { + GsApp *app; + GsPage *page; + GCancellable *cancellable; + gulong notify_quirk_id; + AdwDialog *dialog_install; + GsPluginJob *job; /* (not nullable) (owned) */ + GsShellInteraction interaction; + gboolean propagate_error; + gboolean remove_app_data_dir; + gulong app_needs_user_action_id; +} GsPageHelper; + +static void +gs_page_helper_free (GsPageHelper *helper) +{ + if (helper->notify_quirk_id > 0) + g_signal_handler_disconnect (helper->app, helper->notify_quirk_id); + if (helper->app_needs_user_action_id != 0) + g_signal_handler_disconnect (helper->job, helper->app_needs_user_action_id); + g_clear_object (&helper->job); + if (helper->app != NULL) + g_object_unref (helper->app); + if (helper->page != NULL) + g_object_unref (helper->page); + if (helper->cancellable != NULL) + g_object_unref (helper->cancellable); + g_slice_free (GsPageHelper, helper); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsPageHelper, gs_page_helper_free); + +static void +gs_page_show_update_message (GsPageHelper *helper, AsScreenshot *ss) +{ + GsPagePrivate *priv = gs_page_get_instance_private (helper->page); + GPtrArray *images; + AdwDialog *dialog; + g_autofree gchar *escaped = NULL; + + escaped = g_markup_escape_text (as_screenshot_get_caption (ss), -1); + dialog = adw_alert_dialog_new (gs_app_get_name (helper->app), escaped); + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (dialog), + /* TRANSLATORS: button text */ + "ok", _("_OK")); + + /* image is optional */ + images = as_screenshot_get_images (ss); + if (images->len) { + GtkWidget *ssimg; + g_autoptr(SoupSession) soup_session = NULL; + + /* load screenshot */ + soup_session = gs_build_soup_session (); + ssimg = gs_screenshot_image_new (soup_session); + gs_screenshot_image_set_screenshot (GS_SCREENSHOT_IMAGE (ssimg), ss); + gs_screenshot_image_set_size (GS_SCREENSHOT_IMAGE (ssimg), 400, 225); + gs_screenshot_image_load_async (GS_SCREENSHOT_IMAGE (ssimg), + helper->cancellable); + gtk_widget_set_margin_start (ssimg, 24); + gtk_widget_set_margin_end (ssimg, 24); + adw_alert_dialog_set_extra_child (ADW_ALERT_DIALOG (dialog), ssimg); + } + + adw_dialog_present (dialog, GTK_WIDGET (priv->shell)); +} + +static void +gs_page_app_installed_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + GsPage *page = helper->page; + gboolean ret; + g_autoptr(GError) error = NULL; + + ret = gs_plugin_loader_job_action_finish (plugin_loader, + res, + &error); + + gs_application_emit_install_resources_done (GS_APPLICATION (g_application_get_default ()), NULL, error); + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("App install cancelled with error: %s", error->message); + return; + } + if (!ret) { + if (helper->propagate_error) { + gs_plugin_loader_claim_job_error (plugin_loader, + NULL, + helper->job, + error); + } else { + g_warning ("failed to install %s: %s", gs_app_get_id (helper->app), error->message); + } + return; + } + + /* the single update needs system reboot, e.g. for firmware */ + if (gs_app_has_quirk (helper->app, GS_APP_QUIRK_NEEDS_REBOOT)) { + g_autoptr(GsAppList) list = gs_app_list_new (); + gs_app_list_add (list, helper->app); + gs_utils_reboot_notify (list, TRUE); + } + + /* tell the user what they have to do */ + if (gs_app_get_kind (helper->app) == AS_COMPONENT_KIND_FIRMWARE && + gs_app_has_quirk (helper->app, GS_APP_QUIRK_NEEDS_USER_ACTION)) { + AsScreenshot *ss = gs_app_get_action_screenshot (helper->app); + if (ss != NULL && as_screenshot_get_caption (ss) != NULL) + gs_page_show_update_message (helper, ss); + } + + /* only show this if the window is not active */ + if (gs_app_is_installed (helper->app) && + GS_IS_PLUGIN_JOB_INSTALL_APPS (helper->job) && + !gtk_window_is_active (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (helper->page), GTK_TYPE_WINDOW))) && + ((helper->interaction) & GS_SHELL_INTERACTION_NOTIFY) != 0) + gs_app_notify_installed (helper->app); + + if (gs_app_is_installed (helper->app) && + GS_PAGE_GET_CLASS (page)->app_installed != NULL) { + GS_PAGE_GET_CLASS (page)->app_installed (page, helper->app); + } +} + +static void +gs_page_app_removed_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + GsPage *page = helper->page; + gboolean ret; + g_autoptr(GError) error = NULL; + + ret = gs_plugin_loader_job_action_finish (plugin_loader, + res, + &error); + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("%s", error->message); + return; + } + if (!ret) { + if (helper->propagate_error) { + gs_plugin_loader_claim_job_error (plugin_loader, + NULL, + helper->job, + error); + } else { + g_warning ("failed to uninstall %s: %s", gs_app_get_id (helper->app), error->message); + } + return; + } + + if (helper->remove_app_data_dir) + gs_utils_remove_app_data_dir (helper->app, plugin_loader); + + /* the app removal needs system reboot, e.g. for rpm-ostree */ + if (gs_app_has_quirk (helper->app, GS_APP_QUIRK_NEEDS_REBOOT)) { + g_autoptr(GsAppList) list = gs_app_list_new (); + gs_app_list_add (list, helper->app); + gs_utils_reboot_notify (list, FALSE); + } + + if (!gs_app_is_installed (helper->app) && + GS_PAGE_GET_CLASS (page)->app_removed != NULL) { + GS_PAGE_GET_CLASS (page)->app_removed (page, helper->app); + } +} + +GtkWidget * +gs_page_get_header_start_widget (GsPage *page) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + + return priv->header_start_widget; +} + +void +gs_page_set_header_start_widget (GsPage *page, GtkWidget *widget) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + + g_set_object (&priv->header_start_widget, widget); +} + +GtkWidget * +gs_page_get_header_end_widget (GsPage *page) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + + return priv->header_end_widget; +} + +void +gs_page_set_header_end_widget (GsPage *page, GtkWidget *widget) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + + g_set_object (&priv->header_end_widget, widget); +} + +void +gs_page_install_app (GsPage *page, + GsApp *app, + GsShellInteraction interaction, + GCancellable *cancellable) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + GsPageHelper *helper; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* probably non-free */ + if (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE) { + GtkResponseType response; + + response = gs_app_notify_unavailable (app, GTK_WIDGET (page)); + if (response != GTK_RESPONSE_OK) { + g_autoptr(GError) error_local = NULL; + g_set_error_literal (&error_local, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("User declined installation")); + gs_application_emit_install_resources_done (GS_APPLICATION (g_application_get_default ()), NULL, error_local); + return; + } + } + + helper = g_slice_new0 (GsPageHelper); + helper->app = g_object_ref (app); + helper->page = g_object_ref (page); + helper->cancellable = g_object_ref (cancellable != NULL ? cancellable : gs_app_get_cancellable (app)); + helper->interaction = interaction; + helper->propagate_error = TRUE; + + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) { + plugin_job = gs_plugin_job_manage_repository_new (helper->app, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL | + ((interaction == GS_SHELL_INTERACTION_FULL) ? + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE : 0)); + } else { + g_autoptr(GsAppList) list = gs_app_list_new (); + gs_app_list_add (list, app); + plugin_job = gs_plugin_job_install_apps_new (list, + (interaction == GS_SHELL_INTERACTION_FULL) ? GS_PLUGIN_INSTALL_APPS_FLAGS_INTERACTIVE : GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + } + + g_assert (helper->job == NULL); + helper->job = g_object_ref (plugin_job); + gs_plugin_job_set_propagate_error (plugin_job, helper->propagate_error); + + gs_plugin_loader_job_process_async (priv->plugin_loader, + plugin_job, + helper->cancellable, + gs_page_app_installed_cb, + helper); + g_steal_pointer (&helper); +} + +static void +gs_page_update_app_response_cb (AdwAlertDialog *dialog, + const gchar *response, + gpointer user_data) +{ + g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data; + GsPagePrivate *priv = gs_page_get_instance_private (helper->page); + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppList) list = NULL; + + /* not agreed */ + if (g_strcmp0 (response, "install") != 0) + return; + + g_debug ("update %s", gs_app_get_id (helper->app)); + + list = gs_app_list_new (); + gs_app_list_add (list, helper->app); + + plugin_job = gs_plugin_job_update_apps_new (list, + GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + + g_assert (helper->job == NULL); + helper->job = g_object_ref (plugin_job); + gs_plugin_job_set_propagate_error (plugin_job, helper->propagate_error); + + gs_plugin_loader_job_process_async (priv->plugin_loader, + plugin_job, + helper->cancellable, + gs_page_app_installed_cb, + helper); + g_steal_pointer (&helper); +} + +static void +gs_page_notify_quirk_cb (GsApp *app, GParamSpec *pspec, GsPageHelper *helper) +{ + adw_alert_dialog_set_response_enabled (ADW_ALERT_DIALOG (helper->dialog_install), + "install", + !gs_app_has_quirk (helper->app, + GS_APP_QUIRK_NEEDS_USER_ACTION)); +} + +static void update_app_needs_user_action_cb (GsPluginJobUpdateApps *plugin_job, + GsApp *app, + AsScreenshot *action_screenshot, + gpointer user_data); + +void +gs_page_update_app (GsPage *page, GsApp *app, GCancellable *cancellable) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + GsPageHelper *helper; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppList) list = NULL; + + /* non-firmware apps do not have to be prepared */ + helper = g_slice_new0 (GsPageHelper); + helper->app = g_object_ref (app); + helper->page = g_object_ref (page); + helper->cancellable = g_object_ref (cancellable != NULL ? cancellable : gs_app_get_cancellable (app)); + helper->propagate_error = TRUE; + + /* generic fallback */ + list = gs_app_list_new (); + gs_app_list_add (list, app); + + plugin_job = gs_plugin_job_update_apps_new (list, + GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + + g_assert (helper->job == NULL); + helper->job = g_object_ref (plugin_job); + gs_plugin_job_set_propagate_error (plugin_job, helper->propagate_error); + + helper->app_needs_user_action_id = + g_signal_connect (plugin_job, "app-needs-user-action", + G_CALLBACK (update_app_needs_user_action_cb), helper); + + gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job, + helper->cancellable, + gs_page_app_installed_cb, + helper); + g_steal_pointer (&helper); +} + +static void +update_app_needs_user_action_cb (GsPluginJobUpdateApps *plugin_job, + GsApp *app, + AsScreenshot *action_screenshot, + gpointer user_data) +{ + GsPageHelper *orig_helper = user_data, *new_helper; + AdwDialog *dialog; + g_autofree gchar *heading = NULL; + g_autofree gchar *escaped = NULL; + GsPagePrivate *priv = gs_page_get_instance_private (orig_helper->page); + + g_assert (orig_helper->app == app); + + /* Make a copy of the helper, because the original is freed in gs_page_app_installed_cb() + before this dialog is closed by the user. */ + new_helper = g_slice_new0 (GsPageHelper); + new_helper->app = g_object_ref (orig_helper->app); + new_helper->page = g_object_ref (orig_helper->page); + new_helper->cancellable = g_object_ref (orig_helper->cancellable); + new_helper->propagate_error = orig_helper->propagate_error; + + /* TRANSLATORS: this is a prompt message, and + * '%s' is an app summary, e.g. 'GNOME Clocks' */ + heading = g_strdup_printf (_("Prepare %s"), gs_app_get_name (orig_helper->app)); + escaped = g_markup_escape_text (as_screenshot_get_caption (action_screenshot), -1); + dialog = adw_alert_dialog_new (heading, escaped); + adw_alert_dialog_set_body_use_markup (ADW_ALERT_DIALOG (dialog), TRUE); + adw_alert_dialog_add_responses (ADW_ALERT_DIALOG (dialog), + "cancel", _("_Cancel"), + /* TRANSLATORS: update the fw */ + "install", _("_Install"), + NULL); + + /* this will be enabled when the device is in the right mode */ + new_helper->dialog_install = dialog; + new_helper->notify_quirk_id = + g_signal_connect (new_helper->app, "notify::quirk", + G_CALLBACK (gs_page_notify_quirk_cb), + new_helper); + adw_alert_dialog_set_response_enabled (ADW_ALERT_DIALOG (dialog), + "install", + !gs_app_has_quirk (new_helper->app, GS_APP_QUIRK_NEEDS_USER_ACTION)); + + /* load screenshot */ + if (as_screenshot_is_valid (action_screenshot)) { + g_autoptr(SoupSession) soup_session = NULL; + GtkWidget *ssimg; + + soup_session = gs_build_soup_session (); + ssimg = gs_screenshot_image_new (soup_session); + gs_screenshot_image_set_screenshot (GS_SCREENSHOT_IMAGE (ssimg), action_screenshot); + gs_screenshot_image_set_size (GS_SCREENSHOT_IMAGE (ssimg), 400, 225); + gs_screenshot_image_load_async (GS_SCREENSHOT_IMAGE (ssimg), + new_helper->cancellable); + gtk_widget_set_margin_start (ssimg, 24); + gtk_widget_set_margin_end (ssimg, 24); + adw_alert_dialog_set_extra_child (ADW_ALERT_DIALOG (dialog), ssimg); + } + + /* handle this async */ + g_signal_connect (dialog, "response", + G_CALLBACK (gs_page_update_app_response_cb), new_helper); + + adw_dialog_present (dialog, GTK_WIDGET (priv->shell)); +} + +static void +gs_page_remove_app_response_cb (AdwAlertDialog *dialog, + const gchar *response, + gpointer user_data) +{ + g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data; + GsPagePrivate *priv = gs_page_get_instance_private (helper->page); + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* not agreed */ + if (g_strcmp0 (response, "uninstall") != 0) + return; + + g_debug ("uninstall %s", gs_app_get_id (helper->app)); + if (gs_app_get_kind (helper->app) == AS_COMPONENT_KIND_REPOSITORY) { + plugin_job = gs_plugin_job_manage_repository_new (helper->app, + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE | + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + } else { + g_autoptr(GsAppList) app_list = gs_app_list_new (); + gs_app_list_add (app_list, helper->app); + plugin_job = gs_plugin_job_uninstall_apps_new (app_list, + GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + } + + g_assert (helper->job == NULL); + helper->job = g_object_ref (plugin_job); + gs_plugin_job_set_propagate_error (plugin_job, helper->propagate_error); + + gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job, + helper->cancellable, + gs_page_app_removed_cb, + helper); + g_steal_pointer (&helper); +} + +static void +check_delete_toggled_cb (GtkCheckButton *check_delete, + gpointer user_data) +{ + gboolean *premove_app_data_dir = user_data; + *premove_app_data_dir = gtk_check_button_get_active (check_delete); +} + +void +gs_page_remove_app (GsPage *page, GsApp *app, GCancellable *cancellable) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + GsPageHelper *helper; + g_autoptr(GtkBuilder) builder = NULL; + AdwDialog *dialog; + AdwPreferencesGroup *preferences_group; + g_autofree gchar *message = NULL; + g_autofree gchar *title = NULL; + g_autofree gchar *app_data_dir = NULL; + + g_return_if_fail (GS_IS_PAGE (page)); + g_return_if_fail (GS_IS_APP (app)); + + builder = gtk_builder_new_from_resource ("/org/gnome/Software/gs-remove-app-dialog.ui"); + + /* Is the app actually removable? */ + if (gs_app_has_quirk (app, GS_APP_QUIRK_COMPULSORY)) + return; + + /* pending install */ + helper = g_slice_new0 (GsPageHelper); + helper->app = g_object_ref (app); + helper->page = g_object_ref (page); + helper->cancellable = g_object_ref (cancellable != NULL ? cancellable : gs_app_get_cancellable (app)); + helper->propagate_error = TRUE; + helper->interaction = GS_SHELL_INTERACTION_FULL; + if (gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppList) app_list = NULL; + + if (helper->cancellable != gs_app_get_cancellable (app)) { + /* cancel any ongoing job, this allows to e.g. cancel pending + * installations, updates, or other ops that may have been queued + * in the plugin loader (due to reaching the max parallel ops allowed) */ + g_cancellable_cancel (gs_app_get_cancellable (app)); + } + + app_list = gs_app_list_new (); + gs_app_list_add (app_list, app); + plugin_job = gs_plugin_job_uninstall_apps_new (app_list, GS_PLUGIN_UNINSTALL_APPS_FLAGS_INTERACTIVE); + + g_assert (helper->job == NULL); + helper->job = g_object_ref (plugin_job); + gs_plugin_job_set_propagate_error (plugin_job, helper->propagate_error); + + g_debug ("uninstall %s", gs_app_get_id (app)); + gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job, + helper->cancellable, + gs_page_app_removed_cb, + helper); + g_steal_pointer (&helper); + return; + } + + /* use different name and summary */ + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_REPOSITORY: + /* TRANSLATORS: this is a prompt message, and '%s' is an + * repository name, e.g. 'GNOME Nightly' */ + title = g_strdup_printf (_("Are you sure you want to remove " + "the %s repository?"), + gs_app_get_name (app)); + /* TRANSLATORS: Longer dialog text. The placeholder is a repository name. */ + message = g_strdup_printf (_("All apps from %s will be " + "uninstalled, and you will have to " + "re-install the repository to use them again."), + gs_app_get_name (app)); + break; + case AS_COMPONENT_KIND_ADDON: + case AS_COMPONENT_KIND_INPUT_METHOD: + /* TRANSLATORS: this is a prompt message, and '%s' is the + * name of an addon or an input method */ + title = g_strdup_printf (_("Uninstall %s?"), + gs_app_get_name (app)); + /* TRANSLATORS: Longer dialog text. The placeholder is the name + * of an addon or an input method. */ + message = g_strdup_printf (_("It will not be possible to " + "use %s after removal."), + gs_app_get_name (app)); + break; + case AS_COMPONENT_KIND_RUNTIME: + /* TRANSLATORS: this is a prompt message, and '%s' is the + * name of a runtime */ + title = g_strdup_printf (_("Uninstall %s?"), + gs_app_get_name (app)); + /* TRANSLATORS: Longer dialog text. The placeholder is the name + * of a runtime. */ + message = g_strdup_printf (_("It will not be possible to use " + "any apps which depend on %s after removal."), + gs_app_get_name (app)); + break; + case AS_COMPONENT_KIND_FONT: + /* TRANSLATORS: this is a prompt message, and '%s' is the + * name of a font */ + title = g_strdup_printf (_("Uninstall %s?"), + gs_app_get_name (app)); + /* TRANSLATORS: Longer dialog text. The placeholder is the name of a font. */ + message = g_strdup_printf (_("It will not be possible to use %s " + "after removal, and any documents which use " + "it will appear in a different font."), + gs_app_get_name (app)); + break; + case AS_COMPONENT_KIND_CODEC: + /* TRANSLATORS: this is a prompt message, and '%s' is the + * name of a codec */ + title = g_strdup_printf (_("Uninstall %s?"), + gs_app_get_name (app)); + /* TRANSLATORS: Longer dialog text. The placeholder is the name of a codec. */ + message = g_strdup_printf (_("It will not be possible to use %s " + "after removal. This may mean some media files " + "will no longer be playable."), + gs_app_get_name (app)); + break; + case AS_COMPONENT_KIND_FIRMWARE: + /* TRANSLATORS: this is a prompt message, and '%s' is the + * name of a firmware */ + title = g_strdup_printf (_("Uninstall %s?"), + gs_app_get_name (app)); + /* TRANSLATORS: Longer dialog text. The placeholder is the name of a firmware */ + message = g_strdup_printf (_("Hardware which depends on %s may no " + "longer function correctly after removal."), + gs_app_get_name (app)); + break; + default: + app_data_dir = gs_utils_get_app_data_dir (app); + + /* TRANSLATORS: this is a prompt message, and '%s' is an + * app summary, e.g. 'GNOME Clocks' */ + title = g_strdup_printf (_("Uninstall %s?"), + gs_app_get_name (app)); + if (app_data_dir != NULL) { + GtkCheckButton *check_delete; + check_delete = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, "check_delete")); + + /* Translators: the '%s' is replaced with the app name */ + message = g_strdup_printf (_("It will not be possible to use %s after removal."), + gs_app_get_name (app)); + + g_signal_connect (check_delete, "toggled", + G_CALLBACK (check_delete_toggled_cb), &(helper->remove_app_data_dir)); + } else { + /* TRANSLATORS: Longer dialog text. The placeholder is + * the name of an app. */ + message = g_strdup_printf (_("It will not be possible to use %s after removal. " + "App data and settings will be kept on disk, to allow " + "restoring the app in the future."), + gs_app_get_name (app)); + } + + preferences_group = ADW_PREFERENCES_GROUP (gtk_builder_get_object (builder, "preferences_group")); + gtk_widget_set_visible (GTK_WIDGET (preferences_group), app_data_dir != NULL); + + break; + } + + /* ask for confirmation */ + dialog = ADW_DIALOG (gtk_builder_get_object (builder, "dialog")); + + adw_alert_dialog_set_heading (ADW_ALERT_DIALOG (dialog), title); + adw_alert_dialog_set_body (ADW_ALERT_DIALOG (dialog), message); + + /* handle this async */ + g_signal_connect (dialog, "response", + G_CALLBACK (gs_page_remove_app_response_cb), helper); + + adw_dialog_present (dialog, GTK_WIDGET (priv->shell)); +} + +static void +gs_page_app_launched_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + g_autoptr(GsPluginJob) plugin_job = user_data; + g_autoptr(GError) error = NULL; + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + gs_plugin_loader_claim_job_error (plugin_loader, NULL, plugin_job, error); + return; + } +} + +void +gs_page_launch_app (GsPage *page, GsApp *app, GCancellable *cancellable) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + g_autoptr(GsPluginJob) plugin_job = NULL; + plugin_job = gs_plugin_job_launch_new (app, GS_PLUGIN_LAUNCH_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job, + cancellable, + gs_page_app_launched_cb, + g_object_ref (plugin_job)); +} + +gboolean +gs_page_is_active (GsPage *page) +{ + GsPagePrivate *priv = gs_page_get_instance_private (page); + g_return_val_if_fail (GS_IS_PAGE (page), FALSE); + return priv->is_active; +} + +/** + * gs_page_is_active_and_focused: + * @self: a #GsPage + * + * Similar to gs_page_is_active(), only verifies, that also the application + * window is visible and focused, aka the user interacts with the page. + * + * Returns: whether the page is active and focused + * + * Since: 45 + **/ +gboolean +gs_page_is_active_and_focused (GsPage *self) +{ + GsPagePrivate *priv = gs_page_get_instance_private (self); + g_return_val_if_fail (GS_IS_PAGE (self), FALSE); + + return gs_page_is_active (self) && + priv->shell != NULL && + gtk_widget_get_visible (GTK_WIDGET (priv->shell)) && + gtk_window_is_active (GTK_WINDOW (priv->shell)); +} + +/** + * gs_page_get_title: + * @page: a #GsPage + * + * Get the value of #GsPage:title. + * + * Returns: (nullable): human readable title for the page, or %NULL if one isn’t set + * + * Since: 40 + */ +const gchar * +gs_page_get_title (GsPage *page) +{ + g_auto(GValue) value = G_VALUE_INIT; + + g_return_val_if_fail (GS_IS_PAGE (page), NULL); + + /* The property is typically overridden by subclasses; the + * implementation in #GsPage itself is just a placeholder. */ + g_object_get_property (G_OBJECT (page), "title", &value); + + return g_value_get_string (&value); +} + +/** + * gs_page_get_counter: + * @page: a #GsPage + * + * Get the value of #GsPage:counter. + * + * Returns: a counter of the number of available updates, installed packages, + * etc. on this page + * + * Since: 40 + */ +guint +gs_page_get_counter (GsPage *page) +{ + g_auto(GValue) value = G_VALUE_INIT; + + g_return_val_if_fail (GS_IS_PAGE (page), 0); + + /* The property is typically overridden by subclasses; the + * implementation in #GsPage itself is just a placeholder. */ + g_object_get_property (G_OBJECT (page), "counter", &value); + + return g_value_get_uint (&value); +} + +/** + * gs_page_get_vadjustment: + * @page: a #GsPage + * + * Get the #GtkAdjustment used for vertical scrolling. + * + * Returns: (nullable) (transfer none): the #GtkAdjustment used for vertical scrolling + * + * Since: 41 + */ +GtkAdjustment * +gs_page_get_vadjustment (GsPage *page) +{ + g_auto(GValue) value = G_VALUE_INIT; + + g_return_val_if_fail (GS_IS_PAGE (page), NULL); + + /* The property is typically overridden by subclasses; the + * implementation in #GsPage itself is just a placeholder. */ + g_object_get_property (G_OBJECT (page), "vadjustment", &value); + + return g_value_get_object (&value); +} + +/** + * gs_page_switch_to: + * + * Pure virtual method that subclasses have to override to show page specific + * widgets. + */ +void +gs_page_switch_to (GsPage *page) +{ + GsPageClass *klass = GS_PAGE_GET_CLASS (page); + GsPagePrivate *priv = gs_page_get_instance_private (page); + priv->is_active = TRUE; + if (klass->switch_to != NULL) + klass->switch_to (page); +} + +/** + * gs_page_switch_from: + * + * Pure virtual method that subclasses have to override to show page specific + * widgets. + */ +void +gs_page_switch_from (GsPage *page) +{ + GsPageClass *klass = GS_PAGE_GET_CLASS (page); + GsPagePrivate *priv = gs_page_get_instance_private (page); + priv->is_active = FALSE; + if (klass->switch_from != NULL) + klass->switch_from (page); +} + +/** + * gs_page_scroll_up: + * @page: a #GsPage + * + * Scroll the page to the top of its content, if it supports scrolling. + * + * If it doesn’t support scrolling, this is a no-op. + * + * Since: 40 + */ +void +gs_page_scroll_up (GsPage *page) +{ + GtkAdjustment *adj; + + g_return_if_fail (GS_IS_PAGE (page)); + + adj = gs_page_get_vadjustment (page); + if (adj) + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj)); +} + +void +gs_page_reload (GsPage *page) +{ + GsPageClass *klass; + g_return_if_fail (GS_IS_PAGE (page)); + klass = GS_PAGE_GET_CLASS (page); + if (klass->reload != NULL) + klass->reload (page); +} + +gboolean +gs_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsPageClass *klass; + GsPagePrivate *priv = gs_page_get_instance_private (page); + + g_return_val_if_fail (GS_IS_PAGE (page), FALSE); + + klass = GS_PAGE_GET_CLASS (page); + g_assert (klass->setup != NULL); + + priv->plugin_loader = g_object_ref (plugin_loader); + priv->shell = shell; + + return klass->setup (page, shell, plugin_loader, cancellable, error); +} + +static void +gs_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + switch ((GsPageProperty) prop_id) { + case PROP_TITLE: + /* Should be overridden by subclasses. */ + g_value_set_string (value, NULL); + break; + case PROP_COUNTER: + /* Should be overridden by subclasses. */ + g_value_set_uint (value, 0); + break; + case PROP_VADJUSTMENT: + /* Should be overridden by subclasses. */ + g_value_set_object (value, NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_page_dispose (GObject *object) +{ + GsPage *page = GS_PAGE (object); + GsPagePrivate *priv = gs_page_get_instance_private (page); + + gs_widget_remove_all (GTK_WIDGET (page), NULL); + + g_clear_object (&priv->plugin_loader); + g_clear_object (&priv->header_start_widget); + g_clear_object (&priv->header_end_widget); + + G_OBJECT_CLASS (gs_page_parent_class)->dispose (object); +} + +static void +gs_page_init (GsPage *page) +{ + gtk_widget_set_hexpand (GTK_WIDGET (page), TRUE); + gtk_widget_set_vexpand (GTK_WIDGET (page), TRUE); +} + +static void +gs_page_class_init (GsPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_page_get_property; + object_class->dispose = gs_page_dispose; + + /** + * GsPage:title: (nullable) + * + * A human readable title for this page, or %NULL if one isn’t set or + * doesn’t make sense. + * + * Since: 40 + */ + obj_props[PROP_TITLE] = + g_param_spec_string ("title", NULL, NULL, + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsPage:counter: + * + * A counter indicating the number of installed packages, available + * updates, etc. on this page. + * + * Since: 40 + */ + obj_props[PROP_COUNTER] = + g_param_spec_uint ("counter", NULL, NULL, + 0, G_MAXUINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GsPage:vadjustment: (nullable) + * + * The #GtkAdjustment used for vertical scrolling. + * This will be %NULL if the page is not vertically scrollable. + * + * Since: 41 + */ + obj_props[PROP_VADJUSTMENT] = + g_param_spec_object ("vadjustment", NULL, NULL, + GTK_TYPE_ADJUSTMENT, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); +} + +GsPage * +gs_page_new (void) +{ + return GS_PAGE (g_object_new (GS_TYPE_PAGE, NULL)); +} + +GsAppQueryLicenseType +gs_page_get_query_license_type (GsPage *self) +{ + GsPagePrivate *priv = gs_page_get_instance_private (self); + g_return_val_if_fail (GS_IS_PAGE (self), GS_APP_QUERY_LICENSE_ANY); + g_return_val_if_fail (priv->shell != NULL, GS_APP_QUERY_LICENSE_ANY); + return gs_shell_get_query_license_type (priv->shell); +} + +GsAppQueryDeveloperVerifiedType +gs_page_get_query_developer_verified_type (GsPage *self) +{ + GsPagePrivate *priv = gs_page_get_instance_private (self); + g_return_val_if_fail (GS_IS_PAGE (self), GS_APP_QUERY_DEVELOPER_VERIFIED_ANY); + g_return_val_if_fail (priv->shell != NULL, GS_APP_QUERY_DEVELOPER_VERIFIED_ANY); + return gs_shell_get_query_developer_verified_type (priv->shell); +} diff --git a/src/gs-page.h b/src/gs-page.h new file mode 100644 index 0000000..0bc9165 --- /dev/null +++ b/src/gs-page.h @@ -0,0 +1,79 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-shell.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PAGE (gs_page_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsPage, gs_page, GS, PAGE, GtkWidget) + +struct _GsPageClass +{ + GtkWidgetClass parent_class; + + void (*app_installed) (GsPage *page, + GsApp *app); + void (*app_removed) (GsPage *page, + GsApp *app); + void (*switch_to) (GsPage *page); + void (*switch_from) (GsPage *page); + void (*reload) (GsPage *page); + gboolean (*setup) (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error); +}; + +GsPage *gs_page_new (void); +GsShell *gs_page_get_shell (GsPage *page); +GtkWidget *gs_page_get_header_start_widget (GsPage *page); +void gs_page_set_header_start_widget (GsPage *page, + GtkWidget *widget); +GtkWidget *gs_page_get_header_end_widget (GsPage *page); +void gs_page_set_header_end_widget (GsPage *page, + GtkWidget *widget); +void gs_page_install_app (GsPage *page, + GsApp *app, + GsShellInteraction interaction, + GCancellable *cancellable); +void gs_page_remove_app (GsPage *page, + GsApp *app, + GCancellable *cancellable); +void gs_page_update_app (GsPage *page, + GsApp *app, + GCancellable *cancellable); +void gs_page_launch_app (GsPage *page, + GsApp *app, + GCancellable *cancellable); +void gs_page_switch_to (GsPage *page); +void gs_page_switch_from (GsPage *page); +void gs_page_scroll_up (GsPage *page); +void gs_page_reload (GsPage *page); +gboolean gs_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error); +gboolean gs_page_is_active (GsPage *page); +gboolean gs_page_is_active_and_focused (GsPage *self); + +const gchar *gs_page_get_title (GsPage *page); +guint gs_page_get_counter (GsPage *page); +GtkAdjustment *gs_page_get_vadjustment (GsPage *page); +GsAppQueryLicenseType gs_page_get_query_license_type (GsPage *self); +GsAppQueryDeveloperVerifiedType + gs_page_get_query_developer_verified_type + (GsPage *self); + +G_END_DECLS diff --git a/src/gs-prefs-dialog.c b/src/gs-prefs-dialog.c new file mode 100644 index 0000000..bf1234b --- /dev/null +++ b/src/gs-prefs-dialog.c @@ -0,0 +1,142 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-prefs-dialog.h" + +#include "gnome-software-private.h" +#include "gs-common.h" +#include "gs-os-release.h" +#include "gs-repo-row.h" +#include + +struct _GsPrefsDialog +{ + AdwPreferencesDialog parent_instance; + GSettings *settings; + + GCancellable *cancellable; + GsPluginLoader *plugin_loader; + GtkWidget *automatic_updates_radio; + GtkWidget *manual_updates_radio; + GtkLabel *updates_info_label; + AdwActionRow *automatic_updates_row; + AdwActionRow *manual_updates_row; + AdwActionRow *automatic_update_notifications_row; + AdwActionRow *show_only_free_apps_row; + AdwActionRow *show_only_verified_apps_row; +}; + +G_DEFINE_TYPE (GsPrefsDialog, gs_prefs_dialog, ADW_TYPE_PREFERENCES_DIALOG) + +static void +gs_prefs_dialog_filters_changed_cb (GsPrefsDialog *self) +{ + g_signal_emit_by_name (self->plugin_loader, "reload", 0); +} + +static void +popover_show_cb (GsPrefsDialog *self) +{ + const char *label = gtk_label_get_label (self->updates_info_label); + + gtk_accessible_announce (GTK_ACCESSIBLE (self), + label, + GTK_ACCESSIBLE_ANNOUNCEMENT_PRIORITY_MEDIUM); +} + +static gboolean +gs_prefs_dialog_automatic_updates_to_radio_cb (GValue *value, + GVariant *variant, + gpointer user_data) +{ + GsPrefsDialog *self = user_data; + if (!g_variant_get_boolean (variant)) + gtk_check_button_set_active (GTK_CHECK_BUTTON (self->manual_updates_radio), TRUE); + g_value_set_boolean (value, g_variant_get_boolean (variant)); + return TRUE; +} + +static void +gs_prefs_dialog_dispose (GObject *object) +{ + GsPrefsDialog *dialog = GS_PREFS_DIALOG (object); + g_clear_object (&dialog->plugin_loader); + g_cancellable_cancel (dialog->cancellable); + g_clear_object (&dialog->cancellable); + g_clear_object (&dialog->settings); + + G_OBJECT_CLASS (gs_prefs_dialog_parent_class)->dispose (object); +} + +static void +gs_prefs_dialog_init (GsPrefsDialog *dialog) +{ + gtk_widget_init_template (GTK_WIDGET (dialog)); + + dialog->cancellable = g_cancellable_new (); + dialog->settings = g_settings_new ("org.gnome.software"); + g_settings_bind (dialog->settings, + "download-updates-notify", + dialog->automatic_update_notifications_row, + "active", + G_SETTINGS_BIND_DEFAULT); + g_settings_bind_with_mapping (dialog->settings, + "download-updates", + dialog->automatic_updates_radio, + "active", + G_SETTINGS_BIND_DEFAULT, + gs_prefs_dialog_automatic_updates_to_radio_cb, + NULL, dialog, NULL); + g_settings_bind (dialog->settings, + "show-only-free-apps", + dialog->show_only_free_apps_row, + "active", + G_SETTINGS_BIND_DEFAULT); + g_settings_bind (dialog->settings, + "show-only-verified-apps", + dialog->show_only_verified_apps_row, + "active", + G_SETTINGS_BIND_DEFAULT); + g_signal_connect_object (dialog->show_only_free_apps_row, "notify::active", + G_CALLBACK (gs_prefs_dialog_filters_changed_cb), dialog, G_CONNECT_SWAPPED); + g_signal_connect_object (dialog->show_only_verified_apps_row, "notify::active", + G_CALLBACK (gs_prefs_dialog_filters_changed_cb), dialog, G_CONNECT_SWAPPED); +} + +static void +gs_prefs_dialog_class_init (GsPrefsDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_prefs_dialog_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-prefs-dialog.ui"); + gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, automatic_updates_radio); + gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, manual_updates_radio); + gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, updates_info_label); + gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, automatic_updates_row); + gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, manual_updates_row); + gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, automatic_update_notifications_row); + gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, show_only_free_apps_row); + gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, show_only_verified_apps_row); + + gtk_widget_class_bind_template_callback (widget_class, popover_show_cb); +} + +GtkWidget * +gs_prefs_dialog_new (GsPluginLoader *plugin_loader) +{ + GsPrefsDialog *dialog; + dialog = g_object_new (GS_TYPE_PREFS_DIALOG, + NULL); + dialog->plugin_loader = g_object_ref (plugin_loader); + return GTK_WIDGET (dialog); +} diff --git a/src/gs-prefs-dialog.h b/src/gs-prefs-dialog.h new file mode 100644 index 0000000..e220dde --- /dev/null +++ b/src/gs-prefs-dialog.h @@ -0,0 +1,24 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2018 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_PREFS_DIALOG (gs_prefs_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsPrefsDialog, gs_prefs_dialog, GS, PREFS_DIALOG, AdwPreferencesDialog) + +GtkWidget *gs_prefs_dialog_new (GsPluginLoader *plugin_loader); + +G_END_DECLS diff --git a/src/gs-prefs-dialog.ui b/src/gs-prefs-dialog.ui new file mode 100644 index 0000000..4156349 --- /dev/null +++ b/src/gs-prefs-dialog.ui @@ -0,0 +1,108 @@ + + + + + + diff --git a/src/gs-progress-button.c b/src/gs-progress-button.c new file mode 100644 index 0000000..dbcdc48 --- /dev/null +++ b/src/gs-progress-button.c @@ -0,0 +1,349 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2014 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-app.h" +#include "gs-common.h" +#include "gs-progress-button.h" + +struct _GsProgressButton +{ + GtkButton parent_instance; + + GtkWidget *image; + GtkWidget *label; + GtkWidget *stack; + + GtkCssProvider *css_provider; + char *label_text; + char *icon_name; + gboolean show_icon; +}; + +G_DEFINE_TYPE (GsProgressButton, gs_progress_button, GTK_TYPE_BUTTON) + +typedef enum { + PROP_ICON_NAME = 1, + PROP_SHOW_ICON, + /* Overrides: */ + PROP_LABEL, +} GsProgressButtonProperty; + +static GParamSpec *obj_props[PROP_SHOW_ICON + 1] = { NULL, }; + +void +gs_progress_button_set_progress (GsProgressButton *button, guint percentage) +{ + gchar tmp[64]; /* Large enough to hold the string below. */ + const gchar *css; + + if (percentage == GS_APP_PROGRESS_UNKNOWN) { + css = " background-size: 25%;\n" + " animation: install-progress-unknown-move infinite linear 2s;"; + } else { + percentage = MIN (percentage, 100); /* No need to clamp an unsigned to 0, it produces errors. */ + g_assert ((gsize) g_snprintf (tmp, sizeof (tmp), "background-size: %u%%;", percentage) < sizeof (tmp)); + css = tmp; + } + + gs_utils_widget_set_css (GTK_WIDGET (button), &button->css_provider, css); +} + +void +gs_progress_button_set_show_progress (GsProgressButton *button, gboolean show_progress) +{ + if (show_progress) + gtk_widget_add_css_class (GTK_WIDGET (button), "install-progress"); + else + gtk_widget_remove_css_class (GTK_WIDGET (button), "install-progress"); +} + +/** + * gs_progress_button_get_label: + * @button: a #GsProgressButton + * + * Get the label of @button. + * + * It should be used rather than gtk_button_get_label() as it can only retrieve + * the text from the label set by gtk_button_set_label(), which also cannot be + * used. + * + * Returns: the label of @button + * + * Since: 41 + */ +const gchar * +gs_progress_button_get_label (GsProgressButton *button) +{ + g_return_val_if_fail (GS_IS_PROGRESS_BUTTON (button), NULL); + + return button->label_text; +} + +/** + * gs_progress_button_set_label: + * @button: a #GsProgressButton + * @label: a string + * + * Set the label of @button. + * + * It should be used rather than gtk_button_set_label() as it will replace the + * content of @button by a new label, breaking it. + * + * Since: 41 + */ +void +gs_progress_button_set_label (GsProgressButton *button, const gchar *label) +{ + g_return_if_fail (GS_IS_PROGRESS_BUTTON (button)); + + if (g_strcmp0 (button->label_text, label) == 0) + return; + + g_free (button->label_text); + button->label_text = g_strdup (label); + + g_object_notify (G_OBJECT (button), "label"); +} + +/** + * gs_progress_button_get_icon_name: + * @button: a #GsProgressButton + * + * Get the value of #GsProgressButton:icon-name. + * + * Returns: (nullable): the name of the icon + * + * Since: 41 + */ +const gchar * +gs_progress_button_get_icon_name (GsProgressButton *button) +{ + g_return_val_if_fail (GS_IS_PROGRESS_BUTTON (button), NULL); + + return button->icon_name; +} + +/** + * gs_progress_button_set_icon_name: + * @button: a #GsProgressButton + * @icon_name: (nullable): the name of the icon + * + * Set the value of #GsProgressButton:icon-name. + * + * Since: 41 + */ +void +gs_progress_button_set_icon_name (GsProgressButton *button, const gchar *icon_name) +{ + g_return_if_fail (GS_IS_PROGRESS_BUTTON (button)); + + if (g_strcmp0 (button->icon_name, icon_name) == 0) + return; + + g_free (button->icon_name); + button->icon_name = g_strdup (icon_name); + + g_object_notify_by_pspec (G_OBJECT (button), obj_props[PROP_ICON_NAME]); +} + +/** + * gs_progress_button_get_show_icon: + * @button: a #GsProgressButton + * + * Get the value of #GsProgressButton:show-icon. + * + * Returns: %TRUE if the icon is shown, %FALSE if the label is shown + * + * Since: 41 + */ +gboolean +gs_progress_button_get_show_icon (GsProgressButton *button) +{ + g_return_val_if_fail (GS_IS_PROGRESS_BUTTON (button), FALSE); + + return button->show_icon; +} + +/** + * gs_progress_button_set_show_icon: + * @button: a #GsProgressButton + * @show_icon: %TRUE to set show the icon, %FALSE to show the label + * + * Set the value of #GsProgressButton:show-icon. + * + * Since: 41 + */ +void +gs_progress_button_set_show_icon (GsProgressButton *button, gboolean show_icon) +{ + g_return_if_fail (GS_IS_PROGRESS_BUTTON (button)); + + show_icon = !!show_icon; + + if (button->show_icon == show_icon) + return; + + button->show_icon = show_icon; + + if (show_icon) { + gtk_stack_set_visible_child (GTK_STACK (button->stack), button->image); + gtk_widget_remove_css_class (GTK_WIDGET (button), "text-button"); + gtk_widget_add_css_class (GTK_WIDGET (button), "image-button"); + } else { + gtk_stack_set_visible_child (GTK_STACK (button->stack), button->label); + gtk_widget_remove_css_class (GTK_WIDGET (button), "image-button"); + gtk_widget_add_css_class (GTK_WIDGET (button), "text-button"); + } + + g_object_notify_by_pspec (G_OBJECT (button), obj_props[PROP_SHOW_ICON]); +} + +/** + * gs_progress_button_set_size_groups: + * @button: a #GsProgressButton + * @label: the #GtkSizeGroup for the label + * @image: the #GtkSizeGroup for the image + * + * Groups the size of different buttons while keeping adaptiveness. + * + * Since: 41 + */ +void +gs_progress_button_set_size_groups (GsProgressButton *button, GtkSizeGroup *label, GtkSizeGroup *image) +{ + g_return_if_fail (GS_IS_PROGRESS_BUTTON (button)); + + if (label != NULL) + gtk_size_group_add_widget (label, button->label); + if (image != NULL) + gtk_size_group_add_widget (image, button->image); +} + +static void +gs_progress_button_page_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsProgressButton *self = GS_PROGRESS_BUTTON (object); + + switch ((GsProgressButtonProperty) prop_id) { + case PROP_LABEL: + g_value_set_string (value, gs_progress_button_get_label (self)); + break; + case PROP_ICON_NAME: + g_value_set_string (value, gs_progress_button_get_icon_name (self)); + break; + case PROP_SHOW_ICON: + g_value_set_boolean (value, gs_progress_button_get_show_icon (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_progress_button_page_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GsProgressButton *self = GS_PROGRESS_BUTTON (object); + + switch ((GsProgressButtonProperty) prop_id) { + case PROP_LABEL: + gs_progress_button_set_label (self, g_value_get_string (value)); + break; + case PROP_ICON_NAME: + gs_progress_button_set_icon_name (self, g_value_get_string (value)); + break; + case PROP_SHOW_ICON: + gs_progress_button_set_show_icon (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_progress_button_dispose (GObject *object) +{ + GsProgressButton *button = GS_PROGRESS_BUTTON (object); + + g_clear_object (&button->css_provider); + + G_OBJECT_CLASS (gs_progress_button_parent_class)->dispose (object); +} + +static void +gs_progress_button_finalize (GObject *object) +{ + GsProgressButton *button = GS_PROGRESS_BUTTON (object); + + g_clear_pointer (&button->label_text, g_free); + g_clear_pointer (&button->icon_name, g_free); + + G_OBJECT_CLASS (gs_progress_button_parent_class)->finalize (object); +} + +static void +gs_progress_button_init (GsProgressButton *button) +{ + gtk_widget_init_template (GTK_WIDGET (button)); +} + +static void +gs_progress_button_class_init (GsProgressButtonClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_progress_button_page_get_property; + object_class->set_property = gs_progress_button_page_set_property; + object_class->dispose = gs_progress_button_dispose; + object_class->finalize = gs_progress_button_finalize; + + /** + * GsProgressButton:icon-name: (nullable): + * + * The name of the icon for the button. + * + * Since: 41 + */ + obj_props[PROP_ICON_NAME] = + g_param_spec_string ("icon-name", NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsProgressButton:show-icon: + * + * Whether to show the icon in place of the label. + * + * Since: 41 + */ + obj_props[PROP_SHOW_ICON] = + g_param_spec_boolean ("show-icon", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + g_object_class_override_property (object_class, PROP_LABEL, "label"); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-progress-button.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsProgressButton, image); + gtk_widget_class_bind_template_child (widget_class, GsProgressButton, label); + gtk_widget_class_bind_template_child (widget_class, GsProgressButton, stack); +} + +GtkWidget * +gs_progress_button_new (void) +{ + return g_object_new (GS_TYPE_PROGRESS_BUTTON, NULL); +} diff --git a/src/gs-progress-button.h b/src/gs-progress-button.h new file mode 100644 index 0000000..f3701ce --- /dev/null +++ b/src/gs-progress-button.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2014 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define GS_TYPE_PROGRESS_BUTTON (gs_progress_button_get_type ()) + +G_DECLARE_FINAL_TYPE (GsProgressButton, gs_progress_button, GS, PROGRESS_BUTTON, GtkButton) + +GtkWidget *gs_progress_button_new (void); +const gchar *gs_progress_button_get_label (GsProgressButton *button); +void gs_progress_button_set_label (GsProgressButton *button, + const gchar *label); +const gchar *gs_progress_button_get_icon_name (GsProgressButton *button); +void gs_progress_button_set_icon_name (GsProgressButton *button, + const gchar *icon_name); +gboolean gs_progress_button_get_show_icon (GsProgressButton *button); +void gs_progress_button_set_show_icon (GsProgressButton *button, + gboolean show_icon); +void gs_progress_button_set_progress (GsProgressButton *button, + guint percentage); +void gs_progress_button_set_show_progress (GsProgressButton *button, + gboolean show_progress); +void gs_progress_button_set_size_groups (GsProgressButton *button, + GtkSizeGroup *label, + GtkSizeGroup *image); + +G_END_DECLS diff --git a/src/gs-progress-button.ui b/src/gs-progress-button.ui new file mode 100644 index 0000000..200ae45 --- /dev/null +++ b/src/gs-progress-button.ui @@ -0,0 +1,36 @@ + + + + + diff --git a/src/gs-removal-dialog.c b/src/gs-removal-dialog.c new file mode 100644 index 0000000..5cd00bf --- /dev/null +++ b/src/gs-removal-dialog.c @@ -0,0 +1,169 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-removal-dialog.h" +#include "gs-utils.h" + +#include +#include +#include + +struct _GsRemovalDialog +{ + AdwDialog parent_instance; + AdwPreferencesPage *prefs_page; + GtkWidget *listbox; +}; + +G_DEFINE_TYPE (GsRemovalDialog, gs_removal_dialog, ADW_TYPE_DIALOG) + +enum { + SIGNAL_RESPONSE, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +static gint +list_sort_func (GtkListBoxRow *a, + GtkListBoxRow *b, + gpointer user_data) +{ + GObject *o1 = G_OBJECT (gtk_list_box_row_get_child (a)); + GObject *o2 = G_OBJECT (gtk_list_box_row_get_child (b)); + const gchar *key1 = g_object_get_data (o1, "sort"); + const gchar *key2 = g_object_get_data (o2, "sort"); + return g_strcmp0 (key1, key2); +} + +static void +add_app (GtkListBox *listbox, GsApp *app) +{ + GtkWidget *box; + GtkWidget *widget; + GtkWidget *row; + g_autofree gchar *sort_key = NULL; + + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_widget_set_margin_top (box, 12); + gtk_widget_set_margin_start (box, 12); + gtk_widget_set_margin_bottom (box, 12); + gtk_widget_set_margin_end (box, 12); + + widget = gtk_label_new (gs_app_get_name (app)); + gtk_widget_set_halign (widget, GTK_ALIGN_START); + gtk_widget_set_tooltip_text (widget, gs_app_get_name (app)); + gtk_label_set_ellipsize (GTK_LABEL (widget), PANGO_ELLIPSIZE_END); + gtk_box_append (GTK_BOX (box), widget); + + if (gs_app_get_name (app) != NULL) { + sort_key = gs_utils_sort_key (gs_app_get_name (app)); + } + + g_object_set_data_full (G_OBJECT (box), + "sort", + g_steal_pointer (&sort_key), + g_free); + + gtk_list_box_prepend (listbox, box); + gtk_widget_set_visible (widget, TRUE); + gtk_widget_set_visible (box, TRUE); + + row = gtk_widget_get_parent (box); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE); +} + +void +gs_removal_dialog_show_upgrade_removals (GsRemovalDialog *self, + GsApp *upgrade) +{ + GsAppList *removals; + g_autofree gchar *text = NULL; + g_autofree gchar *name_version = NULL; + + name_version = g_strdup_printf ("%s %s", + gs_app_get_name (upgrade), + gs_app_get_version (upgrade)); + /* TRANSLATORS: This is a text displayed during a distro upgrade. %s + will be replaced by the name and version of distro, e.g. 'Fedora 23'. */ + text = g_strdup_printf (_("Installed software is incompatible with %s, " + "and will be automatically removed during upgrade."), + name_version); + + adw_preferences_page_set_description (self->prefs_page, text); + + removals = gs_app_get_related (upgrade); + for (guint i = 0; i < gs_app_list_length (removals); i++) { + GsApp *app = gs_app_list_index (removals, i); + g_autofree gchar *tmp = NULL; + + if (gs_app_get_state (app) != GS_APP_STATE_UNAVAILABLE) + continue; + tmp = gs_app_to_string (app); + g_debug ("removal %u: %s", i, tmp); + add_app (GTK_LIST_BOX (self->listbox), app); + } +} + +static void +cancel_clicked_cb (GtkWidget *widget, + GsRemovalDialog *self) +{ + g_signal_emit (self, signals[SIGNAL_RESPONSE], 0, GTK_RESPONSE_CANCEL); +} + +static void +upgrade_clicked_cb (GtkWidget *widget, + GsRemovalDialog *self) +{ + g_signal_emit (self, signals[SIGNAL_RESPONSE], 0, GTK_RESPONSE_ACCEPT); +} + +static void +gs_removal_dialog_init (GsRemovalDialog *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->listbox), + list_sort_func, + self, NULL); +} + +static void +gs_removal_dialog_class_init (GsRemovalDialogClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-removal-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsRemovalDialog, prefs_page); + gtk_widget_class_bind_template_child (widget_class, GsRemovalDialog, listbox); + gtk_widget_class_bind_template_callback (widget_class, cancel_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, upgrade_clicked_cb); + + signals[SIGNAL_RESPONSE] = g_signal_new ("response", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + NULL, + G_TYPE_NONE, 1, + G_TYPE_INT); +} + +GtkWidget * +gs_removal_dialog_new (void) +{ + GsRemovalDialog *dialog; + + dialog = g_object_new (GS_TYPE_REMOVAL_DIALOG, + NULL); + return GTK_WIDGET (dialog); +} diff --git a/src/gs-removal-dialog.h b/src/gs-removal-dialog.h new file mode 100644 index 0000000..957162b --- /dev/null +++ b/src/gs-removal-dialog.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_REMOVAL_DIALOG (gs_removal_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsRemovalDialog, gs_removal_dialog, GS, REMOVAL_DIALOG, AdwDialog) + +GtkWidget *gs_removal_dialog_new (void); +void gs_removal_dialog_show_upgrade_removals (GsRemovalDialog *self, + GsApp *upgrade); + +G_END_DECLS diff --git a/src/gs-removal-dialog.ui b/src/gs-removal-dialog.ui new file mode 100644 index 0000000..03b613d --- /dev/null +++ b/src/gs-removal-dialog.ui @@ -0,0 +1,62 @@ + + + + + + diff --git a/src/gs-remove-app-dialog.ui b/src/gs-remove-app-dialog.ui new file mode 100644 index 0000000..f2c4237 --- /dev/null +++ b/src/gs-remove-app-dialog.ui @@ -0,0 +1,53 @@ + + + + + + + True + cancel + cancel + + _Cancel + _Uninstall + + + + App Settings &amp; Data + + + _Keep + Allows restoring app settings and content + True + False + check_keep + + + center + True + + + + + + + _Delete + Permanently deletes data to save disk space + True + False + check_delete + + + center + check_keep + + + + + + + + diff --git a/src/gs-repo-row.c b/src/gs-repo-row.c new file mode 100644 index 0000000..c3cca96 --- /dev/null +++ b/src/gs-repo-row.c @@ -0,0 +1,596 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2015-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-repo-row.h" + +typedef struct +{ + GsApp *repo; + GtkWidget *name_label; + GtkWidget *hostname_label; + GtkWidget *comment_label; + GtkWidget *remove_button; + GtkWidget *disable_switch; + gulong switch_handler_id; + guint refresh_idle_id; + guint busy_counter; + gboolean supports_remove; + gboolean supports_enable_disable; + gboolean always_allow_enable_disable; + gboolean related_loaded; +} GsRepoRowPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsRepoRow, gs_repo_row, GTK_TYPE_LIST_BOX_ROW) + +typedef enum { + PROP_RELATED_LOADED = 1, +} GsRepoRowProperty; + +enum { + SIGNAL_REMOVE_CLICKED, + SIGNAL_SWITCH_CLICKED, + SIGNAL_LAST +}; + +static GParamSpec *obj_props[PROP_RELATED_LOADED + 1] = { NULL, }; +static guint signals [SIGNAL_LAST] = { 0 }; + +static void +refresh_ui (GsRepoRow *row) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (row); + GtkListBox *listbox; + gboolean active = FALSE; + gboolean state_sensitive = FALSE; + gboolean busy = priv->busy_counter> 0; + gboolean is_provenance; + gboolean is_compulsory; + + if (priv->repo == NULL) { + gtk_widget_set_sensitive (priv->disable_switch, FALSE); + gtk_switch_set_active (GTK_SWITCH (priv->disable_switch), FALSE); + return; + } + + g_signal_handler_block (priv->disable_switch, priv->switch_handler_id); + gtk_widget_set_sensitive (priv->disable_switch, TRUE); + + switch (gs_app_get_state (priv->repo)) { + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_AVAILABLE_LOCAL: + active = FALSE; + state_sensitive = TRUE; + break; + case GS_APP_STATE_INSTALLED: + active = TRUE; + break; + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_DOWNLOADING: + active = TRUE; + busy = TRUE; + break; + case GS_APP_STATE_REMOVING: + active = FALSE; + busy = TRUE; + break; + case GS_APP_STATE_UNAVAILABLE: + g_signal_handler_unblock (priv->disable_switch, priv->switch_handler_id); + listbox = GTK_LIST_BOX (gtk_widget_get_parent (GTK_WIDGET (row))); + g_assert (listbox != NULL); + gtk_list_box_remove (listbox, GTK_WIDGET (row)); + return; + default: + state_sensitive = TRUE; + break; + } + + is_provenance = gs_app_has_quirk (priv->repo, GS_APP_QUIRK_PROVENANCE); + is_compulsory = gs_app_has_quirk (priv->repo, GS_APP_QUIRK_COMPULSORY); + + /* Disable for the system repos, if installed */ + gtk_widget_set_sensitive (priv->disable_switch, priv->supports_enable_disable && (state_sensitive || !is_compulsory || priv->always_allow_enable_disable)); + gtk_widget_set_visible (priv->remove_button, priv->supports_remove && !is_provenance && !is_compulsory); + + /* Set only the 'state' to visually indicate the state is not saved yet */ + if (busy) + gtk_switch_set_state (GTK_SWITCH (priv->disable_switch), active); + else + gtk_switch_set_active (GTK_SWITCH (priv->disable_switch), active); + + g_signal_handler_unblock (priv->disable_switch, priv->switch_handler_id); +} + +static gboolean +refresh_idle (gpointer user_data) +{ + g_autofree GWeakRef *weak_ref = user_data; + g_autoptr(GsRepoRow) row = NULL; + + row = g_weak_ref_get (weak_ref); + if (row != NULL) { + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (row); + + priv->refresh_idle_id = 0; + + /* The row can be removed from the list box between scheduling the idle + callback and dispatching it. */ + if (gtk_widget_get_parent (GTK_WIDGET (row)) != NULL) + refresh_ui (row); + } + + g_weak_ref_clear (weak_ref); + + return G_SOURCE_REMOVE; +} + +static void +repo_state_changed_cb (GsApp *repo, GParamSpec *pspec, GsRepoRow *row) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (row); + GWeakRef *weak_ref; + + if (priv->refresh_idle_id > 0) + return; + + weak_ref = g_new0 (GWeakRef, 1); + g_weak_ref_init (weak_ref, row); + priv->refresh_idle_id = g_idle_add (refresh_idle, weak_ref); +} + +static gchar * +get_repo_installed_text (GsApp *repo) +{ + GsAppList *related; + guint cnt_addon = 0; + guint cnt_apps = 0; + g_autofree gchar *addons_text = NULL; + g_autofree gchar *apps_text = NULL; + + related = gs_app_get_related (repo); + for (guint i = 0; i < gs_app_list_length (related); i++) { + GsApp *app_tmp = gs_app_list_index (related, i); + switch (gs_app_get_kind (app_tmp)) { + case AS_COMPONENT_KIND_WEB_APP: + case AS_COMPONENT_KIND_DESKTOP_APP: + cnt_apps++; + break; + case AS_COMPONENT_KIND_FONT: + case AS_COMPONENT_KIND_CODEC: + case AS_COMPONENT_KIND_INPUT_METHOD: + case AS_COMPONENT_KIND_ADDON: + cnt_addon++; + break; + default: + break; + } + } + + if (cnt_addon == 0) { + /* TRANSLATORS: This string states how many apps have been + * installed from a particular repo, and is displayed on a row + * describing that repo. The placeholder is the number of apps. */ + return g_strdup_printf (ngettext ("%u app installed", + "%u apps installed", + cnt_apps), cnt_apps); + } + if (cnt_apps == 0) { + /* TRANSLATORS: This string states how many add-ons have been + * installed from a particular repo, and is displayed on a row + * describing that repo. The placeholder is the number of add-ons. */ + return g_strdup_printf (ngettext ("%u add-on installed", + "%u add-ons installed", + cnt_addon), cnt_addon); + } + + /* TRANSLATORS: This string is used to construct the 'X apps + and Y add-ons installed' sentence, stating how many things have been + * installed from a particular repo. It’s displayed on a row describing + * that repo. The placeholder is the number of apps, and the translated + * string will be substituted in for the first placeholder in the + * string “%s and %s installed”. */ + apps_text = g_strdup_printf (ngettext ("%u app", + "%u apps", + cnt_apps), cnt_apps); + /* TRANSLATORS: This string is used to construct the 'X apps + and Y add-ons installed' sentence, stating how many things have been + * installed from a particular repo. It’s displayed on a row describing + * that repo. The placeholder is the number of add-ons, and the translated + * string will be substituted in for the second placeholder in the + * string “%s and %s installed”. */ + addons_text = g_strdup_printf (ngettext ("%u add-on", + "%u add-ons", + cnt_addon), cnt_addon); + /* TRANSLATORS: This string is used to construct the 'X apps + and Y add-ons installed' sentence, stating how many things have been + * installed from a particular repo. It’s displayed on a row describing + * that repo. The first placeholder is the translated string “%u app” or + * “%u apps”. The second placeholder is the translated string “%u add-on” + * or “%u add-ons”. + * + * The choice of plural form for this string is determined by the total + * number of apps plus add-ons. For example, + * - “1 app and 2 add-ons installed” - uses count 3 + * - “2 apps and 1 add-on installed” - uses count 3 + * - “4 apps and 5 add-ons installed” - uses count 9 + */ + return g_strdup_printf (ngettext ("%s and %s installed", + "%s and %s installed", + cnt_apps + cnt_addon), + apps_text, addons_text); +} + +static void +refresh_comment_label (GsRepoRow *self) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + g_autofree gchar *comment = NULL; + const gchar *tmp; + + if (priv->related_loaded) + comment = get_repo_installed_text (priv->repo); + else + comment = g_strdup (_("Checking installed software…")); + + tmp = gs_app_get_metadata_item (priv->repo, "GnomeSoftware::InstallationKind"); + if (tmp != NULL && *tmp != '\0') { + gchar *cnt; + + /* Translators: The first '%s' is replaced with installation kind, like in case of Flatpak 'User Installation', + the second '%s' is replaced with a text like '10 apps installed'. */ + cnt = g_strdup_printf (C_("repo-row", "%s • %s"), tmp, comment); + g_clear_pointer (&comment, g_free); + comment = cnt; + } + + gtk_label_set_label (GTK_LABEL (priv->comment_label), comment); +} + +static void +gs_repo_row_set_repo (GsRepoRow *self, GsApp *repo) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + g_autoptr(GsPlugin) plugin = NULL; + const gchar *tmp; + + g_assert (priv->repo == NULL); + + priv->repo = g_object_ref (repo); + g_signal_connect_object (priv->repo, "notify::state", + G_CALLBACK (repo_state_changed_cb), + self, 0); + + plugin = gs_app_dup_management_plugin (repo); + if (plugin) { + GsPluginClass *plugin_class = GS_PLUGIN_GET_CLASS (plugin); + priv->supports_remove = plugin_class != NULL && plugin_class->remove_repository_async != NULL; + priv->supports_enable_disable = plugin_class != NULL && + plugin_class->enable_repository_async != NULL && + plugin_class->disable_repository_async != NULL; + } else { + priv->supports_remove = FALSE; + priv->supports_enable_disable = FALSE; + } + + gtk_label_set_label (GTK_LABEL (priv->name_label), gs_app_get_name (repo)); + + gtk_widget_set_visible (priv->hostname_label, FALSE); + + tmp = gs_app_get_url (repo, AS_URL_KIND_HOMEPAGE); + if (tmp != NULL && *tmp != '\0') { + g_autoptr(GUri) uri = NULL; + + uri = g_uri_parse (tmp, SOUP_HTTP_URI_FLAGS, NULL); + if (uri && g_uri_get_host (uri) != NULL && *g_uri_get_host (uri) != '\0') { + gtk_label_set_label (GTK_LABEL (priv->hostname_label), g_uri_get_host (uri)); + gtk_widget_set_visible (priv->hostname_label, TRUE); + } + } + + refresh_comment_label (self); + refresh_ui (self); +} + +GsApp * +gs_repo_row_get_repo (GsRepoRow *self) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + g_return_val_if_fail (GS_IS_REPO_ROW (self), NULL); + return priv->repo; +} + +static void +disable_switch_clicked_cb (GtkWidget *widget, + GParamSpec *param, + GsRepoRow *row) +{ + g_return_if_fail (GS_IS_REPO_ROW (row)); + gs_repo_row_emit_switch_clicked (row); +} + +static void +gs_repo_row_remove_button_clicked_cb (GtkWidget *button, + GsRepoRow *row) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (row); + + g_return_if_fail (GS_IS_REPO_ROW (row)); + + if (priv->repo == NULL || priv->busy_counter) + return; + + g_signal_emit (row, signals[SIGNAL_REMOVE_CLICKED], 0); +} + +static void +gs_repo_row_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsRepoRow *self = GS_REPO_ROW (object); + + switch ((GsRepoRowProperty) prop_id) { + case PROP_RELATED_LOADED: + g_value_set_boolean (value, gs_repo_row_get_related_loaded (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_repo_row_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsRepoRow *self = GS_REPO_ROW (object); + + switch ((GsRepoRowProperty) prop_id) { + case PROP_RELATED_LOADED: + gs_repo_row_set_related_loaded (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_repo_row_dispose (GObject *object) +{ + GsRepoRow *self = GS_REPO_ROW (object); + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + + if (priv->repo != NULL) { + g_signal_handlers_disconnect_by_func (priv->repo, repo_state_changed_cb, self); + g_clear_object (&priv->repo); + } + + if (priv->refresh_idle_id != 0) { + g_source_remove (priv->refresh_idle_id); + priv->refresh_idle_id = 0; + } + + G_OBJECT_CLASS (gs_repo_row_parent_class)->dispose (object); +} + +static void +gs_repo_row_init (GsRepoRow *self) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + GtkWidget *image; + + gtk_widget_init_template (GTK_WIDGET (self)); + priv->switch_handler_id = g_signal_connect (priv->disable_switch, "notify::active", + G_CALLBACK (disable_switch_clicked_cb), self); + image = gtk_image_new_from_icon_name ("user-trash-symbolic"); + gtk_button_set_child (GTK_BUTTON (priv->remove_button), image); + gtk_widget_set_tooltip_text(priv->remove_button, _("Remove")); + g_signal_connect (priv->remove_button, "clicked", + G_CALLBACK (gs_repo_row_remove_button_clicked_cb), self); +} + +static void +gs_repo_row_class_init (GsRepoRowClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gs_repo_row_get_property; + object_class->set_property = gs_repo_row_set_property; + object_class->dispose = gs_repo_row_dispose; + + /** + * GsRepoRow:related-loaded: + * + * Whether the related apps for this repo have been successfully + * loaded. If so, the number of apps/installed apps is shown in + * the row. + * + * Since: 45 + */ + obj_props[PROP_RELATED_LOADED] = + g_param_spec_boolean ("related-loaded", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + signals [SIGNAL_REMOVE_CLICKED] = + g_signal_new ("remove-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsRepoRowClass, remove_clicked), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + signals [SIGNAL_SWITCH_CLICKED] = + g_signal_new ("switch-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsRepoRowClass, switch_clicked), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-repo-row.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, GsRepoRow, name_label); + gtk_widget_class_bind_template_child_private (widget_class, GsRepoRow, hostname_label); + gtk_widget_class_bind_template_child_private (widget_class, GsRepoRow, comment_label); + gtk_widget_class_bind_template_child_private (widget_class, GsRepoRow, remove_button); + gtk_widget_class_bind_template_child_private (widget_class, GsRepoRow, disable_switch); +} + +/* + * gs_repo_row_new: + * @repo: a #GsApp to represent the repo in the new row + * @always_allow_enable_disable: always allow enabled/disable of the @repo + * + * The @always_allow_enable_disable, when %TRUE, means that the @repo in this row + * can be always enabled/disabled by the user, if supported by the related plugin, + * regardless of the other heuristics, which can avoid the repo enable/disable. + * + * Returns: (transfer full): a newly created #GsRepoRow + */ +GtkWidget * +gs_repo_row_new (GsApp *repo, + gboolean always_allow_enable_disable) +{ + GsRepoRow *row = g_object_new (GS_TYPE_REPO_ROW, NULL); + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (row); + priv->always_allow_enable_disable = always_allow_enable_disable; + gs_repo_row_set_repo (row, repo); + return GTK_WIDGET (row); +} + +static void +gs_repo_row_change_busy (GsRepoRow *self, + gboolean value) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + + g_return_if_fail (GS_IS_REPO_ROW (self)); + + if (value) + g_return_if_fail (priv->busy_counter + 1 > priv->busy_counter); + else + g_return_if_fail (priv->busy_counter > 0); + + priv->busy_counter += (value ? 1 : -1); + + if (value && priv->busy_counter == 1) + gtk_widget_set_sensitive (priv->disable_switch, FALSE); + else if (!value && !priv->busy_counter) + refresh_ui (self); +} + +/** + * gs_repo_row_mark_busy: + * @row: a #GsRepoRow + * + * Mark the @row as busy, that is the @row has pending operation(s). + * Unmark the @row as busy with gs_repo_row_unmark_busy() once + * the operation is done. This can be called mutliple times, only call + * the gs_repo_row_unmark_busy() as many times as this function had + * been called. + * + * Since: 41 + **/ +void +gs_repo_row_mark_busy (GsRepoRow *row) +{ + gs_repo_row_change_busy (row, TRUE); +} + +/** + * gs_repo_row_unmark_busy: + * @row: a #GsRepoRow + * + * A pair function for gs_repo_row_mark_busy(). + * + * Since: 41 + **/ +void +gs_repo_row_unmark_busy (GsRepoRow *row) +{ + gs_repo_row_change_busy (row, FALSE); +} + +/** + * gs_repo_row_get_is_busy: + * @row: a #GsRepoRow + * + * Returns: %TRUE, when there is any pending operation for the @row + * + * Since: 41 + **/ +gboolean +gs_repo_row_get_is_busy (GsRepoRow *row) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (row); + + g_return_val_if_fail (GS_IS_REPO_ROW (row), FALSE); + + return priv->busy_counter > 0; +} + +/** + * gs_repo_row_emit_switch_clicked: + * @self: a #GsRepoRow + * + * Emits the GsRepoRow:switch-clicked signal, if applicable. + * + * Since: 41 + **/ +void +gs_repo_row_emit_switch_clicked (GsRepoRow *self) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + + g_return_if_fail (GS_IS_REPO_ROW (self)); + + if (priv->repo == NULL || priv->busy_counter > 0 || + !gtk_widget_get_visible (priv->disable_switch) || + !gtk_widget_get_sensitive (priv->disable_switch)) + return; + + g_signal_emit (self, signals[SIGNAL_SWITCH_CLICKED], 0); +} + +gboolean +gs_repo_row_get_related_loaded (GsRepoRow *self) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + + g_return_val_if_fail (GS_IS_REPO_ROW (self), FALSE); + + return priv->related_loaded; +} + +void +gs_repo_row_set_related_loaded (GsRepoRow *self, + gboolean value) +{ + GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (self); + + g_return_if_fail (GS_IS_REPO_ROW (self)); + + if (!priv->related_loaded == !value) + return; + + priv->related_loaded = value; + + refresh_comment_label (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_RELATED_LOADED]); +} diff --git a/src/gs-repo-row.h b/src/gs-repo-row.h new file mode 100644 index 0000000..eca8359 --- /dev/null +++ b/src/gs-repo-row.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2015-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gnome-software-private.h" +#include + +G_BEGIN_DECLS + +#define GS_TYPE_REPO_ROW (gs_repo_row_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsRepoRow, gs_repo_row, GS, REPO_ROW, GtkListBoxRow) + +struct _GsRepoRowClass +{ + GtkListBoxRowClass parent_class; + void (*remove_clicked) (GsRepoRow *row); + void (*switch_clicked) (GsRepoRow *row); +}; + +GtkWidget *gs_repo_row_new (GsApp *repo, + gboolean always_allow_enable_disable); +GsApp *gs_repo_row_get_repo (GsRepoRow *row); +void gs_repo_row_mark_busy (GsRepoRow *row); +void gs_repo_row_unmark_busy (GsRepoRow *row); +gboolean gs_repo_row_get_is_busy (GsRepoRow *row); +void gs_repo_row_emit_switch_clicked (GsRepoRow *self); +gboolean gs_repo_row_get_related_loaded (GsRepoRow *row); +void gs_repo_row_set_related_loaded (GsRepoRow *row, + gboolean value); + +G_END_DECLS diff --git a/src/gs-repo-row.ui b/src/gs-repo-row.ui new file mode 100644 index 0000000..c6e6a5d --- /dev/null +++ b/src/gs-repo-row.ui @@ -0,0 +1,99 @@ + + + + + diff --git a/src/gs-repos-dialog.c b/src/gs-repos-dialog.c new file mode 100644 index 0000000..26f1229 --- /dev/null +++ b/src/gs-repos-dialog.c @@ -0,0 +1,866 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-repos-dialog.h" + +#include "gnome-software-private.h" +#include "gs-common.h" +#include "gs-os-release.h" +#include "gs-repo-row.h" +#include "gs-repos-section.h" +#include "gs-utils.h" +#include + +struct _GsReposDialog +{ + AdwDialog parent_instance; + GSettings *settings; + GsFedoraThirdParty *third_party; + gboolean third_party_enabled; + GHashTable *third_party_repos; /* (nullable) (owned), mapping from owned repo ID → owned plugin name */ + GHashTable *sections; /* gchar * ~> GsReposSection * */ + + GCancellable *cancellable; + GsPluginLoader *plugin_loader; + GtkWidget *status_empty; + GtkWidget *content_page; + GtkWidget *stack; +}; + +G_DEFINE_TYPE (GsReposDialog, gs_repos_dialog, ADW_TYPE_DIALOG) + +static void reload_third_party_repos (GsReposDialog *dialog); + +typedef struct { + GsReposDialog *dialog; + GsApp *repo; + GWeakRef row_weakref; + GsPluginManageRepositoryFlags operation; +} InstallRemoveData; + +static void +install_remove_data_free (InstallRemoveData *data) +{ + g_clear_object (&data->dialog); + g_clear_object (&data->repo); + g_weak_ref_clear (&data->row_weakref); + g_slice_free (InstallRemoveData, data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(InstallRemoveData, install_remove_data_free); + +static void +repo_enabled_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + g_autoptr(InstallRemoveData) install_remove_data = (InstallRemoveData *) user_data; + g_autoptr(GError) error = NULL; + g_autoptr(GsRepoRow) row = NULL; + const gchar *operation_str; + + operation_str = install_remove_data->operation == GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL ? "install" : + install_remove_data->operation == GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE ? "remove" : + install_remove_data->operation == GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE ? "enable" : + install_remove_data->operation == GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE ? "disable" : NULL; + g_assert (operation_str != NULL); + + row = g_weak_ref_get (&install_remove_data->row_weakref); + if (row) + gs_repo_row_unmark_busy (row); + + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("repo %s cancelled", operation_str); + return; + } + + g_warning ("failed to %s repo: %s", operation_str, error->message); + return; + } + + g_debug ("finished %s repo %s", operation_str, gs_app_get_id (install_remove_data->repo)); +} + +static void +_enable_repo (InstallRemoveData *install_data) +{ + GsReposDialog *dialog = install_data->dialog; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GCancellable) cancellable = gs_app_peek_cancellable (install_data->repo); + if (cancellable != NULL) { + g_cancellable_cancel (cancellable); + g_clear_object (&cancellable); + } + cancellable = g_object_ref (gs_app_get_cancellable (install_data->repo)); + g_debug ("enabling repo %s", gs_app_get_id (install_data->repo)); + plugin_job = gs_plugin_job_manage_repository_new (install_data->repo, + install_data->operation | GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (dialog->plugin_loader, plugin_job, + cancellable, + repo_enabled_cb, + install_data); +} + +static void +enable_repo_response_cb (AdwAlertDialog *confirm_dialog, + const gchar *response, + gpointer user_data) +{ + g_autoptr(InstallRemoveData) install_data = (InstallRemoveData *) user_data; + + /* not agreed */ + if (g_strcmp0 (response, "enable") != 0) { + g_autoptr(GsRepoRow) row = g_weak_ref_get (&install_data->row_weakref); + if (row) + gs_repo_row_unmark_busy (row); + return; + } + + _enable_repo (g_steal_pointer (&install_data)); +} + +static void +enable_repo (GsReposDialog *dialog, + GsRepoRow *row, + GsApp *repo) +{ + g_autoptr(InstallRemoveData) install_data = NULL; + + install_data = g_slice_new0 (InstallRemoveData); + install_data->operation = GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_ENABLE; + install_data->dialog = g_object_ref (dialog); + install_data->repo = g_object_ref (repo); + g_weak_ref_init (&install_data->row_weakref, row); + + gs_repo_row_mark_busy (row); + + /* user needs to confirm acceptance of an agreement */ + if (gs_app_get_agreement (repo) != NULL) { + AdwDialog *confirm_dialog; + g_autofree gchar *message = NULL; + g_autoptr(GError) error = NULL; + + /* convert from AppStream markup */ +#if AS_CHECK_VERSION(1, 0, 0) + message = as_markup_convert (gs_app_get_agreement (repo), AS_MARKUP_KIND_TEXT, &error); +#else + message = as_markup_convert_simple (gs_app_get_agreement (repo), &error); +#endif + if (message == NULL) { + /* failed, so just try and show the original markup */ + message = g_strdup (gs_app_get_agreement (repo)); + g_warning ("Failed to process AppStream markup: %s", + error->message); + } + + /* ask for confirmation */ + /* TRANSLATORS: "Enable Third-Party Software Repository?" is + * the confirmation dialog title */ + confirm_dialog = adw_alert_dialog_new (_("Enable Third-Party Software Repository?"), + message); + adw_alert_dialog_add_responses (ADW_ALERT_DIALOG (confirm_dialog), + "cancel", _("_Cancel"), + /* TRANSLATORS: button to accept the agreement */ + "enable", _("_Enable"), + NULL); + + /* handle this async */ + g_signal_connect (confirm_dialog, "response", + G_CALLBACK (enable_repo_response_cb), + g_steal_pointer (&install_data)); + + adw_dialog_present (confirm_dialog, GTK_WIDGET (dialog)); + return; + } + + /* no prompt required */ + _enable_repo (g_steal_pointer (&install_data)); +} + +static void +remove_repo_response_cb (AdwAlertDialog *confirm_dialog, + const gchar *response, + gpointer user_data) +{ + g_autoptr(InstallRemoveData) remove_data = (InstallRemoveData *) user_data; + GsReposDialog *dialog = remove_data->dialog; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GCancellable) cancellable = gs_app_peek_cancellable (remove_data->repo); + + /* not agreed */ + if (g_strcmp0 (response, "disable") != 0 && + g_strcmp0 (response, "remove") != 0) { + g_autoptr(GsRepoRow) row = g_weak_ref_get (&remove_data->row_weakref); + if (row) + gs_repo_row_unmark_busy (row); + return; + } + + if (cancellable != NULL) { + g_cancellable_cancel (cancellable); + g_clear_object (&cancellable); + } + cancellable = g_object_ref (gs_app_get_cancellable (remove_data->repo)); + g_debug ("removing repo %s", gs_app_get_id (remove_data->repo)); + plugin_job = gs_plugin_job_manage_repository_new (remove_data->repo, + remove_data->operation | + GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (dialog->plugin_loader, plugin_job, + cancellable, + repo_enabled_cb, + g_steal_pointer (&remove_data)); +} + +static void +remove_confirm_repo (GsReposDialog *dialog, + GsRepoRow *row, + GsApp *repo, + GsPluginManageRepositoryFlags operation) +{ + InstallRemoveData *remove_data; + AdwDialog *confirm_dialog; + g_autofree gchar *message = NULL; + + remove_data = g_slice_new0 (InstallRemoveData); + remove_data->operation = operation; + remove_data->dialog = g_object_ref (dialog); + remove_data->repo = g_object_ref (repo); + g_weak_ref_init (&remove_data->row_weakref, row); + + /* TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64" */ + message = g_strdup_printf (_("Software that has been installed from “%s” will cease to receive updates."), + gs_app_get_name (repo)); + + /* ask for confirmation */ + confirm_dialog = adw_alert_dialog_new (operation == GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE ? _("Disable Repository?") : _("Remove Repository?"), + message); + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (confirm_dialog), + "cancel", _("_Cancel")); + + if (operation == GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE) { + /* TRANSLATORS: this is button text to disable a repo */ + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (confirm_dialog), "disable", _("_Disable")); + adw_alert_dialog_set_response_appearance (ADW_ALERT_DIALOG (confirm_dialog), "disable", ADW_RESPONSE_DESTRUCTIVE); + } else { + /* TRANSLATORS: this is button text to remove a repo */ + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (confirm_dialog), "remove", _("_Remove")); + adw_alert_dialog_set_response_appearance (ADW_ALERT_DIALOG (confirm_dialog), "remove", ADW_RESPONSE_DESTRUCTIVE); + } + + /* handle this async */ + g_signal_connect (confirm_dialog, "response", + G_CALLBACK (remove_repo_response_cb), remove_data); + + adw_dialog_present (confirm_dialog, GTK_WIDGET (dialog)); + + gs_repo_row_mark_busy (row); +} + +static void +repo_section_switch_clicked_cb (GsReposSection *section, + GsRepoRow *row, + GsReposDialog *dialog) +{ + GsApp *repo; + + repo = gs_repo_row_get_repo (row); + + switch (gs_app_get_state (repo)) { + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_AVAILABLE_LOCAL: + enable_repo (dialog, row, repo); + break; + case GS_APP_STATE_INSTALLED: + remove_confirm_repo (dialog, row, repo, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE); + break; + default: + g_warning ("repo %s button clicked in unexpected state %s", + gs_app_get_id (repo), + gs_app_state_to_string (gs_app_get_state (repo))); + break; + } +} + +static void +repo_section_remove_clicked_cb (GsReposSection *section, + GsRepoRow *row, + GsReposDialog *dialog) +{ + GsApp *repo = gs_repo_row_get_repo (row); + remove_confirm_repo (dialog, row, repo, GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE); +} + +static void +fedora_third_party_switch_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsReposDialog) self = user_data; + g_autoptr(GError) error = NULL; + + if (!gs_fedora_third_party_switch_finish (GS_FEDORA_THIRD_PARTY (source_object), result, &error)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + g_warning ("Failed to switch 'fedora-third-party' config: %s", error->message); + } + + /* Reload the state, because the user could dismiss the authentication prompt + or the repos could change their state. */ + reload_third_party_repos (self); +} + +static void +fedora_third_party_repos_switch_notify_cb (GObject *object, + GParamSpec *param, + gpointer user_data) +{ + GsReposDialog *self = user_data; + + gs_fedora_third_party_switch (self->third_party, + adw_switch_row_get_active (ADW_SWITCH_ROW (object)), + TRUE, + self->cancellable, + fedora_third_party_switch_done_cb, + g_object_ref (self)); +} + +static gboolean +is_third_party_repo (GsReposDialog *dialog, + GsApp *repo) +{ + g_autoptr(GsPlugin) plugin = gs_app_dup_management_plugin (repo); + const gchar *plugin_name = (plugin != NULL) ? gs_plugin_get_name (plugin) : NULL; + + return gs_app_get_scope (repo) == AS_COMPONENT_SCOPE_SYSTEM && + gs_fedora_third_party_util_is_third_party_repo (dialog->third_party_repos, + gs_app_get_id (repo), + plugin_name); +} + +static void +add_repo (GsReposDialog *dialog, + GsApp *repo, + GSList **third_party_repos) +{ + GsAppState state; + GtkWidget *section; + g_autofree gchar *origin_ui = NULL; + + state = gs_app_get_state (repo); + if (!(state == GS_APP_STATE_AVAILABLE || + state == GS_APP_STATE_AVAILABLE_LOCAL || + state == GS_APP_STATE_INSTALLED || + state == GS_APP_STATE_INSTALLING || + state == GS_APP_STATE_DOWNLOADING || + state == GS_APP_STATE_REMOVING)) { + g_warning ("repo %s in invalid state %s", + gs_app_get_id (repo), + gs_app_state_to_string (state)); + return; + } + + if (third_party_repos && is_third_party_repo (dialog, repo)) { + *third_party_repos = g_slist_prepend (*third_party_repos, repo); + return; + } + + origin_ui = gs_app_dup_origin_ui (repo, TRUE); + if (!origin_ui) + origin_ui = gs_app_get_packaging_format (repo); + if (!origin_ui) { + g_autoptr(GsPlugin) plugin = gs_app_dup_management_plugin (repo); + origin_ui = (plugin != NULL) ? g_strdup (gs_plugin_get_name (plugin)) : NULL; + } + + section = g_hash_table_lookup (dialog->sections, origin_ui); + if (section == NULL) { + section = gs_repos_section_new (FALSE); + adw_preferences_group_set_title (ADW_PREFERENCES_GROUP (section), + origin_ui); + g_signal_connect_object (section, "remove-clicked", + G_CALLBACK (repo_section_remove_clicked_cb), dialog, 0); + g_signal_connect_object (section, "switch-clicked", + G_CALLBACK (repo_section_switch_clicked_cb), dialog, 0); + g_hash_table_insert (dialog->sections, g_steal_pointer (&origin_ui), section); + gs_repos_section_set_related_loaded (GS_REPOS_SECTION (section), FALSE); + } + + gs_repos_section_add_repo (GS_REPOS_SECTION (section), repo); +} + +static gint +repos_dialog_compare_sections_cb (gconstpointer aa, + gconstpointer bb) +{ + GsReposSection *section_a = (GsReposSection *) aa; + GsReposSection *section_b = (GsReposSection *) bb; + const gchar *section_sort_key_a; + const gchar *section_sort_key_b; + g_autofree gchar *title_sort_key_a = NULL; + g_autofree gchar *title_sort_key_b = NULL; + gint res; + + section_sort_key_a = gs_repos_section_get_sort_key (section_a); + section_sort_key_b = gs_repos_section_get_sort_key (section_b); + + res = g_strcmp0 (section_sort_key_a, section_sort_key_b); + if (res != 0) + return res; + + title_sort_key_a = gs_utils_sort_key (adw_preferences_group_get_title (ADW_PREFERENCES_GROUP (section_a))); + title_sort_key_b = gs_utils_sort_key (adw_preferences_group_get_title (ADW_PREFERENCES_GROUP (section_b))); + + return g_strcmp0 (title_sort_key_a, title_sort_key_b); +} +typedef struct { + GsReposDialog *dialog; /* not owned */ + GsAppList *list; /* owned */ +} RefineData; + +static void +refine_data_free (RefineData *self) +{ + g_object_unref (self->list); + g_free (self); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(RefineData, refine_data_free) + +static void +refine_sources_related_finish (GsReposDialog *dialog) +{ + GHashTableIter iter; + gpointer value; + + g_hash_table_iter_init (&iter, dialog->sections); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + if (GS_IS_REPOS_SECTION (value)) + gs_repos_section_set_related_loaded (GS_REPOS_SECTION (value), TRUE); + } +} + +static void +refine_sources_related_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + GsReposDialog *dialog = user_data; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("refine sources' related cancelled"); + return; + } else { + g_warning ("failed to refine sources' related: %s", error->message); + } + } + + refine_sources_related_finish (dialog); +} + +static void +refine_sources_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(RefineData) rd = user_data; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) related_list = NULL; + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("refine sources cancelled"); + } else { + g_warning ("failed to refine sources: %s", error->message); + refine_sources_related_finish (rd->dialog); + } + return; + } + + /* refine related apps with generic or unknown kind, thus the GsRepoRow can use proper data */ + related_list = gs_app_list_new (); + for (guint j = 0; j < gs_app_list_length (rd->list); j++) { + GsApp *source = gs_app_list_index (rd->list, j); + GsAppList *related = gs_app_get_related (source); + for (guint i = 0; i < gs_app_list_length (related); i++) { + GsApp *app = gs_app_list_index (related, i); + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN || + gs_app_get_kind (app) == AS_COMPONENT_KIND_GENERIC) { + gs_app_list_add (related_list, app); + } + } + } + + if (gs_app_list_length (related_list) > 0) { + g_autoptr(GsPluginJob) plugin_job = NULL; + + plugin_job = gs_plugin_job_refine_new (related_list, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID); + gs_plugin_loader_job_process_async (plugin_loader, plugin_job, + rd->dialog->cancellable, + refine_sources_related_cb, + rd->dialog); + } else { + refine_sources_related_finish (rd->dialog); + } +} + +static void +get_sources_cb (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GsReposDialog *dialog) +{ + GsApp *app; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) refine_list = NULL; + g_autoptr(GSList) other_repos = NULL; + g_autoptr(GList) sections = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + RefineData *rd; + AdwPreferencesGroup *added_section; + GHashTableIter iter; + + /* get the results */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("get sources cancelled"); + return; + } else { + g_warning ("failed to get sources: %s", error->message); + } + gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "empty"); + return; + } + + /* remove previous */ + g_hash_table_iter_init (&iter, dialog->sections); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&added_section)) { + adw_preferences_page_remove (ADW_PREFERENCES_PAGE (dialog->content_page), + added_section); + g_hash_table_iter_remove (&iter); + } + + /* no results */ + if (gs_app_list_length (list) == 0) { + g_debug ("no sources to show"); + gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "empty"); + return; + } + + refine_list = gs_app_list_new (); + + /* add each */ + gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "sources"); + for (guint i = 0; i < gs_app_list_length (list); i++) { + app = gs_app_list_index (list, i); + add_repo (dialog, app, &other_repos); + gs_app_list_add (refine_list, app); + } + + sections = g_hash_table_get_values (dialog->sections); + sections = g_list_sort (sections, repos_dialog_compare_sections_cb); + for (GList *link = sections; link; link = g_list_next (link)) { + AdwPreferencesGroup *section = link->data; + adw_preferences_page_add (ADW_PREFERENCES_PAGE (dialog->content_page), section); + } + + gtk_widget_set_visible (dialog->content_page, sections != NULL); + + if (other_repos) { + GsReposSection *section; + GtkWidget *widget; + GtkWidget *row; + g_autofree gchar *anchor = NULL; + g_autofree gchar *hint = NULL; + g_autofree gchar *section_id = NULL; + + row = adw_switch_row_new (); + adw_switch_row_set_active (ADW_SWITCH_ROW (row), dialog->third_party_enabled); + g_signal_connect_object (row, "notify::active", + G_CALLBACK (fedora_third_party_repos_switch_notify_cb), dialog, 0); + adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (row), FALSE); + adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), _("Enable New Repositories")); + adw_action_row_set_subtitle (ADW_ACTION_ROW (row), _("Turn on new repositories when they are added")); + gtk_widget_set_visible (row, TRUE); + + anchor = g_strdup_printf ("%s", + "https://docs.fedoraproject.org/en-US/workstation-working-group/third-party-repos/", + /* TRANSLATORS: this is the clickable + * link on the third party repositories info bar */ + _("more information")); + hint = g_strdup_printf ( + /* TRANSLATORS: this is the third party repositories info bar. The '%s' is replaced + with a link consisting a text "more information", which constructs a sentence: + "Additional repositories from selected third parties - more information."*/ + _("Additional repositories from selected third parties — %s."), + anchor); + + widget = adw_preferences_group_new (); + adw_preferences_group_set_title (ADW_PREFERENCES_GROUP (widget), + _("Fedora Third Party Repositories")); + + adw_preferences_group_set_description (ADW_PREFERENCES_GROUP (widget), hint); + + gtk_widget_set_visible (widget, TRUE); + adw_preferences_group_add (ADW_PREFERENCES_GROUP (widget), row); + adw_preferences_page_add (ADW_PREFERENCES_PAGE (dialog->content_page), + ADW_PREFERENCES_GROUP (widget)); + + /* use something unique, not clashing with the other section names */ + section_id = g_strdup_printf ("fedora-third-party::1::%p", widget); + g_hash_table_insert (dialog->sections, g_steal_pointer (§ion_id), widget); + + section = GS_REPOS_SECTION (gs_repos_section_new (TRUE)); + gs_repos_section_set_sort_key (section, "900"); + gs_repos_section_set_related_loaded (section, FALSE); + g_signal_connect_object (section, "switch-clicked", + G_CALLBACK (repo_section_switch_clicked_cb), dialog, 0); + gtk_widget_set_visible (GTK_WIDGET (section), TRUE); + + for (GSList *link = other_repos; link; link = g_slist_next (link)) { + GsApp *repo = link->data; + gs_repos_section_add_repo (section, repo); + gs_app_list_add (refine_list, repo); + } + + /* use something unique, not clashing with the other section names */ + section_id = g_strdup_printf ("fedora-third-party::2::%p", section); + g_hash_table_insert (dialog->sections, g_steal_pointer (§ion_id), section); + + adw_preferences_page_add (ADW_PREFERENCES_PAGE (dialog->content_page), + ADW_PREFERENCES_GROUP (section)); + } + + rd = g_new0 (RefineData, 1); + rd->dialog = dialog; + rd->list = g_object_ref (refine_list); + plugin_job = gs_plugin_job_refine_new (refine_list, GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED); + gs_plugin_loader_job_process_async (dialog->plugin_loader, plugin_job, + dialog->cancellable, + refine_sources_cb, + rd); +} + +static void +reload_sources (GsReposDialog *dialog) +{ + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get the list of non-core software repositories */ + query = gs_app_query_new ("is-source", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_NONE, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (dialog->plugin_loader, plugin_job, + dialog->cancellable, + (GAsyncReadyCallback) get_sources_cb, + dialog); +} + +static void +fedora_third_party_list_repos_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsReposDialog) self = user_data; + g_autoptr(GHashTable) repos = NULL; + g_autoptr(GError) error = NULL; + + if (!gs_fedora_third_party_list_finish (GS_FEDORA_THIRD_PARTY (source_object), result, &repos, &error)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + g_warning ("Failed to list 'fedora-third-party' repos: %s", error->message); + } else { + self->third_party_repos = g_steal_pointer (&repos); + } + + reload_sources (self); +} + +static void +fedora_third_party_query_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsFedoraThirdPartyState state = GS_FEDORA_THIRD_PARTY_STATE_UNKNOWN; + g_autoptr(GsReposDialog) self = user_data; + g_autoptr(GError) error = NULL; + + if (!gs_fedora_third_party_query_finish (GS_FEDORA_THIRD_PARTY (source_object), result, &state, &error)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + g_warning ("Failed to query 'fedora-third-party': %s", error->message); + } else { + self->third_party_enabled = state == GS_FEDORA_THIRD_PARTY_STATE_ENABLED; + } + + gs_fedora_third_party_list (self->third_party, self->cancellable, + fedora_third_party_list_repos_done_cb, g_object_ref (self)); +} + +static gboolean +is_fedora (void) +{ + const gchar *id = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + + os_release = gs_os_release_new (NULL); + if (os_release == NULL) + return FALSE; + + id = gs_os_release_get_id (os_release); + if (g_strcmp0 (id, "fedora") == 0) + return TRUE; + + return FALSE; +} + +static void +reload_third_party_repos (GsReposDialog *dialog) +{ + /* Fedora-specific functionality */ + if (!is_fedora ()) { + reload_sources (dialog); + return; + } + + gs_fedora_third_party_invalidate (dialog->third_party); + + if (!gs_fedora_third_party_is_available (dialog->third_party)) { + reload_sources (dialog); + return; + } + + g_clear_pointer (&dialog->third_party_repos, g_hash_table_unref); + + gs_fedora_third_party_query (dialog->third_party, dialog->cancellable, fedora_third_party_query_done_cb, g_object_ref (dialog)); +} + +static gchar * +get_os_name (void) +{ + gchar *name = NULL; + g_autoptr(GsOsRelease) os_release = NULL; + + os_release = gs_os_release_new (NULL); + if (os_release != NULL) + name = g_strdup (gs_os_release_get_name (os_release)); + if (name == NULL) { + /* TRANSLATORS: this is the fallback text we use if we can't + figure out the name of the operating system */ + name = g_strdup (_("the operating system")); + } + + return name; +} + +static void +reload_cb (GsPluginLoader *plugin_loader, GsReposDialog *dialog) +{ + reload_third_party_repos (dialog); +} + +static void +set_plugin_loader (GsReposDialog *dialog, GsPluginLoader *plugin_loader) +{ + dialog->plugin_loader = g_object_ref (plugin_loader); + g_signal_connect (dialog->plugin_loader, "reload", + G_CALLBACK (reload_cb), dialog); +} + +static void +gs_repos_dialog_dispose (GObject *object) +{ + GsReposDialog *dialog = GS_REPOS_DIALOG (object); + + if (dialog->plugin_loader != NULL) { + g_signal_handlers_disconnect_by_func (dialog->plugin_loader, reload_cb, dialog); + g_clear_object (&dialog->plugin_loader); + } + + g_cancellable_cancel (dialog->cancellable); + g_clear_pointer (&dialog->third_party_repos, g_hash_table_unref); + g_clear_pointer (&dialog->sections, g_hash_table_unref); + g_clear_object (&dialog->third_party); + g_clear_object (&dialog->cancellable); + g_clear_object (&dialog->settings); + + G_OBJECT_CLASS (gs_repos_dialog_parent_class)->dispose (object); +} + +static void +gs_repos_dialog_init (GsReposDialog *dialog) +{ + g_autofree gchar *label_empty_text = NULL; + g_autofree gchar *os_name = NULL; + + gtk_widget_init_template (GTK_WIDGET (dialog)); + + dialog->cancellable = g_cancellable_new (); + dialog->settings = g_settings_new ("org.gnome.software"); + dialog->sections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + os_name = get_os_name (); + + /* TRANSLATORS: This is the description text displayed in the Software Repositories dialog. + %s gets replaced by the name of the actual distro, e.g. Fedora. */ + label_empty_text = g_markup_printf_escaped (_("These repositories supplement the default software provided by %s."), + os_name); + adw_status_page_set_description (ADW_STATUS_PAGE (dialog->status_empty), label_empty_text); +} + +static void +gs_repos_dialog_class_init (GsReposDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_repos_dialog_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-repos-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsReposDialog, status_empty); + gtk_widget_class_bind_template_child (widget_class, GsReposDialog, content_page); + gtk_widget_class_bind_template_child (widget_class, GsReposDialog, stack); +} + +GtkWidget * +gs_repos_dialog_new (GsPluginLoader *plugin_loader) +{ + GsReposDialog *dialog; + + dialog = g_object_new (GS_TYPE_REPOS_DIALOG, + NULL); + dialog->third_party = gs_fedora_third_party_new (plugin_loader); + set_plugin_loader (dialog, plugin_loader); + gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "waiting"); + reload_third_party_repos (dialog); + + return GTK_WIDGET (dialog); +} diff --git a/src/gs-repos-dialog.h b/src/gs-repos-dialog.h new file mode 100644 index 0000000..6eb979f --- /dev/null +++ b/src/gs-repos-dialog.h @@ -0,0 +1,25 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_REPOS_DIALOG (gs_repos_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsReposDialog, gs_repos_dialog, GS, REPOS_DIALOG, AdwDialog) + +GtkWidget *gs_repos_dialog_new (GsPluginLoader *plugin_loader); + +G_END_DECLS diff --git a/src/gs-repos-dialog.ui b/src/gs-repos-dialog.ui new file mode 100644 index 0000000..7e64411 --- /dev/null +++ b/src/gs-repos-dialog.ui @@ -0,0 +1,61 @@ + + + + + + diff --git a/src/gs-repos-section.c b/src/gs-repos-section.c new file mode 100644 index 0000000..72d6d85 --- /dev/null +++ b/src/gs-repos-section.c @@ -0,0 +1,282 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-repo-row.h" +#include "gs-repos-section.h" + +struct _GsReposSection +{ + AdwPreferencesGroup parent_instance; + GtkWidget *title; + GtkListBox *list; + gchar *sort_key; + gboolean always_allow_enable_disable; + gboolean related_loaded; +}; + +G_DEFINE_TYPE (GsReposSection, gs_repos_section, ADW_TYPE_PREFERENCES_GROUP) + +typedef enum { + PROP_RELATED_LOADED = 1, +} GsReposSectionProperty; + +enum { + SIGNAL_REMOVE_CLICKED, + SIGNAL_SWITCH_CLICKED, + SIGNAL_LAST +}; + +static GParamSpec *obj_props[PROP_RELATED_LOADED + 1] = { NULL, }; +static guint signals [SIGNAL_LAST] = { 0 }; + +static void +repo_remove_clicked_cb (GsRepoRow *row, + GsReposSection *section) +{ + g_signal_emit (section, signals[SIGNAL_REMOVE_CLICKED], 0, row); +} + +static void +repo_switch_clicked_cb (GsRepoRow *row, + GsReposSection *section) +{ + g_signal_emit (section, signals[SIGNAL_SWITCH_CLICKED], 0, row); +} + +static void +gs_repos_section_row_activated_cb (GtkListBox *box, + GtkListBoxRow *row, + gpointer user_data) +{ + GsReposSection *section = user_data; + g_return_if_fail (GS_IS_REPOS_SECTION (section)); + gs_repo_row_emit_switch_clicked (GS_REPO_ROW (row)); +} + +static gchar * +_get_app_sort_key (GsApp *app) +{ + if (gs_app_get_name (app) != NULL) + return gs_utils_sort_key (gs_app_get_name (app)); + + return NULL; +} + +static gint +_list_sort_func (GtkListBoxRow *a, GtkListBoxRow *b, gpointer user_data) +{ + GsApp *a1 = gs_repo_row_get_repo (GS_REPO_ROW (a)); + GsApp *a2 = gs_repo_row_get_repo (GS_REPO_ROW (b)); + g_autofree gchar *key1 = _get_app_sort_key (a1); + g_autofree gchar *key2 = _get_app_sort_key (a2); + + return g_strcmp0 (key1, key2); +} + +static void +gs_repos_section_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsReposSection *self = GS_REPOS_SECTION (object); + + switch ((GsReposSectionProperty) prop_id) { + case PROP_RELATED_LOADED: + g_value_set_boolean (value, gs_repos_section_get_related_loaded (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_repos_section_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsReposSection *self = GS_REPOS_SECTION (object); + + switch ((GsReposSectionProperty) prop_id) { + case PROP_RELATED_LOADED: + gs_repos_section_set_related_loaded (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_repos_section_finalize (GObject *object) +{ + GsReposSection *self = GS_REPOS_SECTION (object); + + g_free (self->sort_key); + + G_OBJECT_CLASS (gs_repos_section_parent_class)->finalize (object); +} + +static void +gs_repos_section_class_init (GsReposSectionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gs_repos_section_get_property; + object_class->set_property = gs_repos_section_set_property; + object_class->finalize = gs_repos_section_finalize; + + /** + * GsReposSection:related-loaded: + * + * Whether the related apps for this repo section have been + * successfully loaded. If so, the number of apps/installed + * apps is shown in each row. + * + * Since: 45 + */ + obj_props[PROP_RELATED_LOADED] = + g_param_spec_boolean ("related-loaded", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + signals [SIGNAL_REMOVE_CLICKED] = + g_signal_new ("remove-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, GS_TYPE_REPO_ROW); + + signals [SIGNAL_SWITCH_CLICKED] = + g_signal_new ("switch-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, GS_TYPE_REPO_ROW); +} + +static void +gs_repos_section_init (GsReposSection *self) +{ + self->list = GTK_LIST_BOX (gtk_list_box_new ()); + g_object_set (G_OBJECT (self->list), + "visible", TRUE, + "selection-mode", GTK_SELECTION_NONE, + NULL); + gtk_list_box_set_sort_func (self->list, _list_sort_func, self, NULL); + + gtk_widget_add_css_class (GTK_WIDGET (self->list), "boxed-list"); + + adw_preferences_group_add (ADW_PREFERENCES_GROUP (self), GTK_WIDGET (self->list)); + + g_signal_connect (self->list, "row-activated", + G_CALLBACK (gs_repos_section_row_activated_cb), self); +} + +/* + * gs_repos_section_new: + * @always_allow_enable_disable: always allow enable/disable of the repos in this section + * + * Creates a new #GsReposSection. @always_allow_enable_disable is passed to each + * #GsRepoRow. + * + * The @always_allow_enable_disable, when %TRUE, means that every repo in this section + * can be enabled/disabled by the user, if supported by the related plugin, regardless + * of the other heuristics, which can avoid the repo enable/disable. + * + * Returns: (transfer full): a newly created #GsReposSection + */ +GtkWidget * +gs_repos_section_new (gboolean always_allow_enable_disable) +{ + GsReposSection *self; + + self = g_object_new (GS_TYPE_REPOS_SECTION, NULL); + + self->always_allow_enable_disable = always_allow_enable_disable; + + return GTK_WIDGET (self); +} + +void +gs_repos_section_add_repo (GsReposSection *self, + GsApp *repo) +{ + GtkWidget *row; + + g_return_if_fail (GS_IS_REPOS_SECTION (self)); + g_return_if_fail (GS_IS_APP (repo)); + + /* Derive the sort key from the repository. All repositories of the same kind + should have set the same sort key. It's because there's no other way to provide + the section sort key by the plugin without breaking the abstraction. */ + if (!self->sort_key) + self->sort_key = g_strdup (gs_app_get_metadata_item (repo, "GnomeSoftware::SortKey")); + + row = gs_repo_row_new (repo, self->always_allow_enable_disable); + g_object_bind_property (self, "related-loaded", + row, "related-loaded", + G_BINDING_SYNC_CREATE); + g_signal_connect (row, "remove-clicked", + G_CALLBACK (repo_remove_clicked_cb), self); + g_signal_connect (row, "switch-clicked", + G_CALLBACK (repo_switch_clicked_cb), self); + + gtk_list_box_prepend (self->list, row); + gtk_widget_set_visible (row, TRUE); +} + +const gchar * +gs_repos_section_get_sort_key (GsReposSection *self) +{ + g_return_val_if_fail (GS_IS_REPOS_SECTION (self), NULL); + + return self->sort_key; +} + +void +gs_repos_section_set_sort_key (GsReposSection *self, + const gchar *sort_key) +{ + g_return_if_fail (GS_IS_REPOS_SECTION (self)); + + if (g_strcmp0 (sort_key, self->sort_key) != 0) { + g_free (self->sort_key); + self->sort_key = g_strdup (sort_key); + } +} + +gboolean +gs_repos_section_get_related_loaded (GsReposSection *self) +{ + g_return_val_if_fail (GS_IS_REPOS_SECTION (self), FALSE); + + return self->related_loaded; +} + +void +gs_repos_section_set_related_loaded (GsReposSection *self, + gboolean value) +{ + g_return_if_fail (GS_IS_REPOS_SECTION (self)); + + if (!self->related_loaded == !value) + return; + + self->related_loaded = value; + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_RELATED_LOADED]); +} diff --git a/src/gs-repos-section.h b/src/gs-repos-section.h new file mode 100644 index 0000000..7390d38 --- /dev/null +++ b/src/gs-repos-section.h @@ -0,0 +1,34 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Red Hat + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gnome-software-private.h" +#include "gs-app.h" + +G_BEGIN_DECLS + +#define GS_TYPE_REPOS_SECTION (gs_repos_section_get_type ()) + +G_DECLARE_FINAL_TYPE (GsReposSection, gs_repos_section, GS, REPOS_SECTION, AdwPreferencesGroup) + +GtkWidget *gs_repos_section_new (gboolean always_allow_enable_disable); +void gs_repos_section_add_repo (GsReposSection *self, + GsApp *repo); +const gchar *gs_repos_section_get_title (GsReposSection *self); +const gchar *gs_repos_section_get_sort_key (GsReposSection *self); +void gs_repos_section_set_sort_key (GsReposSection *self, + const gchar *sort_key); +gboolean gs_repos_section_get_related_loaded (GsReposSection *self); +void gs_repos_section_set_related_loaded (GsReposSection *self, + gboolean value); + +G_END_DECLS diff --git a/src/gs-restarter.c b/src/gs-restarter.c new file mode 100644 index 0000000..770d564 --- /dev/null +++ b/src/gs-restarter.c @@ -0,0 +1,216 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#define GS_BINARY_NAME "gnome-software" +#define GS_DBUS_BUS_NAME "org.gnome.Software" +#define GS_DBUS_OBJECT_PATH "/org/gnome/Software" +#define GS_DBUS_INTERFACE_NAME "org.gtk.Actions" + +typedef struct { + GMainLoop *loop; + GDBusConnection *connection; + gboolean is_running; + gboolean timed_out; +} GsRestarterPrivate; + +static void +gs_restarter_on_name_appeared_cb (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + GsRestarterPrivate *priv = (GsRestarterPrivate *) user_data; + priv->is_running = TRUE; + g_debug ("%s appeared", GS_DBUS_BUS_NAME); + if (g_main_loop_is_running (priv->loop)) + g_main_loop_quit (priv->loop); +} + +static void +gs_restarter_on_name_vanished_cb (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GsRestarterPrivate *priv = (GsRestarterPrivate *) user_data; + priv->is_running = FALSE; + g_debug ("%s vanished", GS_DBUS_BUS_NAME); + if (g_main_loop_is_running (priv->loop)) + g_main_loop_quit (priv->loop); +} + +static gboolean +gs_restarter_loop_timeout_cb (gpointer user_data) +{ + GsRestarterPrivate *priv = (GsRestarterPrivate *) user_data; + priv->timed_out = TRUE; + g_main_loop_quit (priv->loop); + return TRUE; +} + +static gboolean +gs_restarter_wait_for_timeout (GsRestarterPrivate *priv, + guint timeout_ms, + GError **error) +{ + guint timer_id; + priv->timed_out = FALSE; + timer_id = g_timeout_add (timeout_ms, gs_restarter_loop_timeout_cb, priv); + g_main_loop_run (priv->loop); + g_source_remove (timer_id); + if (priv->timed_out) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_TIMED_OUT, + "Waited for %ums", timeout_ms); + return FALSE; + } + return TRUE; +} + +static GsRestarterPrivate * +gs_restarter_private_new (void) +{ + GsRestarterPrivate *priv = g_new0 (GsRestarterPrivate, 1); + priv->loop = g_main_loop_new (NULL, FALSE); + return priv; +} + +static void +gs_restarter_private_free (GsRestarterPrivate *priv) +{ + if (priv->connection != NULL) + g_object_unref (priv->connection); + g_main_loop_unref (priv->loop); + g_free (priv); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsRestarterPrivate, gs_restarter_private_free) + +static gboolean +gs_restarter_create_new_process (GsRestarterPrivate *priv, GError **error) +{ + g_autofree gchar *binary_filename = NULL; + + /* start executable */ + binary_filename = g_build_filename (BINDIR, GS_BINARY_NAME, NULL); + g_debug ("starting new binary %s", binary_filename); + if (!g_spawn_command_line_async (binary_filename, error)) + return FALSE; + + /* wait for the bus name to appear */ + if (!gs_restarter_wait_for_timeout (priv, 15000, error)) { + g_prefix_error (error, "%s did not appear: ", GS_DBUS_BUS_NAME); + return FALSE; + } + + return TRUE; +} + +static gboolean +gs_restarter_destroy_old_process (GsRestarterPrivate *priv, GError **error) +{ + GVariantBuilder args_params; + GVariantBuilder args_platform_data; + g_autoptr(GVariant) reply = NULL; + + /* call a GtkAction */ + g_variant_builder_init (&args_params, g_variant_type_new ("av")); + g_variant_builder_init (&args_platform_data, g_variant_type_new ("a{sv}")); + reply = g_dbus_connection_call_sync (priv->connection, + GS_DBUS_BUS_NAME, + GS_DBUS_OBJECT_PATH, + GS_DBUS_INTERFACE_NAME, + "Activate", + g_variant_new ("(sava{sv})", + "shutdown", + &args_params, + &args_platform_data), + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + 5000, + NULL, + error); + if (reply == NULL) { + g_prefix_error (error, "Failed to send RequestShutdown: "); + return FALSE; + } + + /* wait for the name to disappear from the bus */ + if (!gs_restarter_wait_for_timeout (priv, 30000, error)) { + g_prefix_error (error, "Failed to see %s vanish: ", GS_DBUS_BUS_NAME); + return FALSE; + } + + return TRUE; +} + +static gboolean +gs_restarter_setup_watcher (GsRestarterPrivate *priv, GError **error) +{ + /* watch the name appear and vanish */ + priv->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error); + if (priv->connection == NULL) { + g_prefix_error (error, "Failed to get D-Bus connection: "); + return FALSE; + } + g_bus_watch_name_on_connection (priv->connection, + GS_DBUS_BUS_NAME, + G_BUS_NAME_WATCHER_FLAGS_NONE, + gs_restarter_on_name_appeared_cb, + gs_restarter_on_name_vanished_cb, + priv, + NULL); + + /* wait for one of the callbacks to be called */ + if (!gs_restarter_wait_for_timeout (priv, 50, error)) { + g_prefix_error (error, "Failed to watch %s: ", GS_DBUS_BUS_NAME); + return FALSE; + } + + return TRUE; +} + +int +main (int argc, char **argv) +{ + g_autoptr(GsRestarterPrivate) priv = NULL; + g_autoptr(GError) error = NULL; + + /* show all debugging */ + g_setenv ("G_MESSAGES_DEBUG", "all", TRUE); + + /* set up the watcher */ + priv = gs_restarter_private_new (); + if (!gs_restarter_setup_watcher (priv, &error)) { + g_warning ("Failed to set up: %s", error->message); + return EXIT_FAILURE; + } + + /* kill the old process */ + if (priv->is_running) { + if (!gs_restarter_destroy_old_process (priv, &error)) { + g_warning ("Failed to quit service: %s", error->message); + return EXIT_FAILURE; + } + } + + /* start a new process */ + if (!gs_restarter_create_new_process (priv, &error)) { + g_warning ("Failed to start service: %s", error->message); + return EXIT_FAILURE; + } + + /* success */ + g_debug ("%s process successfully restarted", GS_DBUS_BUS_NAME); + return EXIT_SUCCESS; +} diff --git a/src/gs-review-bar.c b/src/gs-review-bar.c new file mode 100644 index 0000000..54215ed --- /dev/null +++ b/src/gs-review-bar.c @@ -0,0 +1,72 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Canonical Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-review-bar.h" + +struct _GsReviewBar +{ + GtkWidget parent_instance; + gdouble fraction; +}; + +G_DEFINE_TYPE (GsReviewBar, gs_review_bar, GTK_TYPE_WIDGET) + +void +gs_review_bar_set_fraction (GsReviewBar *bar, gdouble fraction) +{ + g_return_if_fail (GS_IS_REVIEW_BAR (bar)); + bar->fraction = fraction; +} + +static void +gs_review_bar_init (GsReviewBar *bar) +{ +} + +static void +gs_review_bar_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) +{ + gdouble bar_width, bar_height; + GdkRGBA color; + + gtk_widget_get_color (widget, &color); + + bar_width = round (GS_REVIEW_BAR (widget)->fraction * gtk_widget_get_width (widget)); + bar_height = gtk_widget_get_height (widget); + + gtk_snapshot_append_color (snapshot, + &color, + &GRAPHENE_RECT_INIT (0, + 0, + bar_width, + bar_height)); + + GTK_WIDGET_CLASS (gs_review_bar_parent_class)->snapshot (widget, snapshot); +} + +static void +gs_review_bar_class_init (GsReviewBarClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + widget_class->snapshot = gs_review_bar_snapshot; + + gtk_widget_class_set_css_name (widget_class, "review-bar"); +} + +GtkWidget * +gs_review_bar_new (void) +{ + GsReviewBar *bar; + bar = g_object_new (GS_TYPE_REVIEW_BAR, NULL); + return GTK_WIDGET (bar); +} diff --git a/src/gs-review-bar.h b/src/gs-review-bar.h new file mode 100644 index 0000000..b9de131 --- /dev/null +++ b/src/gs-review-bar.h @@ -0,0 +1,24 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Canonical Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define GS_TYPE_REVIEW_BAR (gs_review_bar_get_type ()) + +G_DECLARE_FINAL_TYPE (GsReviewBar, gs_review_bar, GS, REVIEW_BAR, GtkWidget) + +GtkWidget *gs_review_bar_new (void); + +void gs_review_bar_set_fraction (GsReviewBar *bar, + gdouble fraction); + +G_END_DECLS diff --git a/src/gs-review-dialog.c b/src/gs-review-dialog.c new file mode 100644 index 0000000..a861f26 --- /dev/null +++ b/src/gs-review-dialog.c @@ -0,0 +1,360 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Canonical Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-review-dialog.h" +#include "gs-star-widget.h" + +#define DESCRIPTION_LENGTH_MAX 3000 /* chars */ +#define DESCRIPTION_LENGTH_MIN 15 /* chars */ +#define SUMMARY_LENGTH_MAX 70 /* chars */ +#define SUMMARY_LENGTH_MIN 3 /* chars */ +#define WRITING_TIME_MIN 5 /* seconds */ + +struct _GsReviewDialog +{ + AdwDialog parent_instance; + + GtkWidget *toast_overlay; + GtkWidget *star; + GtkWidget *label_rating_desc; + GtkWidget *summary_entry; + GtkWidget *cancel_button; + GtkWidget *post_button; + GtkWidget *review_row; + GtkWidget *text_box; + GtkWidget *text_box_label; + GtkWidget *edit_icon; + GtkWidget *text_view; + guint timer_id; +}; + +G_DEFINE_TYPE (GsReviewDialog, gs_review_dialog, ADW_TYPE_DIALOG) + +enum { + SIGNAL_SEND, + SIGNAL_LAST +}; + +static guint signals[SIGNAL_LAST] = { 0 }; + +gint +gs_review_dialog_get_rating (GsReviewDialog *dialog) +{ + return gs_star_widget_get_rating (GS_STAR_WIDGET (dialog->star)); +} + +void +gs_review_dialog_set_rating (GsReviewDialog *dialog, gint rating) +{ + gs_star_widget_set_rating (GS_STAR_WIDGET (dialog->star), rating); +} + +const gchar * +gs_review_dialog_get_summary (GsReviewDialog *dialog) +{ + return gtk_editable_get_text (GTK_EDITABLE (dialog->summary_entry)); +} + +gchar * +gs_review_dialog_get_text (GsReviewDialog *dialog) +{ + GtkTextBuffer *buffer; + GtkTextIter start, end; + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->text_view)); + gtk_text_buffer_get_start_iter (buffer, &start); + gtk_text_buffer_get_end_iter (buffer, &end); + return gtk_text_buffer_get_text (buffer, &start, &end, FALSE); +} + +static void +gs_review_dialog_update_review_comment (GsReviewDialog *dialog) +{ + const gchar *msg = NULL; + gint perc; + + /* update the rating description */ + perc = gs_star_widget_get_rating (GS_STAR_WIDGET (dialog->star)); + if (perc == 20) { + /* TRANSLATORS: lighthearted star rating description; + * A really bad app */ + msg = _("Hate it"); + } else if (perc == 40) { + /* TRANSLATORS: lighthearted star rating description; + * Not a great app */ + msg = _("Don’t like it"); + } else if (perc == 60) { + /* TRANSLATORS: lighthearted star rating description; + * A fairly-good app */ + msg = _("It’s OK"); + } else if (perc == 80) { + /* TRANSLATORS: lighthearted star rating description; + * A good app */ + msg = _("Like it"); + } else if (perc == 100) { + /* TRANSLATORS: lighthearted star rating description; + * A really awesome app */ + msg = _("Love it"); + } else { + /* TRANSLATORS: lighthearted star rating description; + * No star has been clicked yet */ + msg = _("Select a Star to Leave a Rating"); + } + gtk_label_set_label (GTK_LABEL (dialog->label_rating_desc), msg); +} + +/* (nullable) - when NULL, all is okay */ +static const gchar * +gs_review_dialog_validate (GsReviewDialog *dialog) +{ + GtkTextBuffer *buffer; + const gchar *msg = NULL; + glong summary_length; + + /* require rating, summary and long review */ + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->text_view)); + summary_length = g_utf8_strlen (gtk_editable_get_text (GTK_EDITABLE (dialog->summary_entry)), -1); + if (dialog->timer_id != 0) { + /* TRANSLATORS: the review can't just be copied and pasted */ + msg = _("Please take more time writing the review"); + } else if (gs_star_widget_get_rating (GS_STAR_WIDGET (dialog->star)) == 0) { + /* TRANSLATORS: the review is not acceptable */ + msg = _("Please choose a star rating"); + } else if (summary_length < SUMMARY_LENGTH_MIN) { + /* TRANSLATORS: the review is not acceptable */ + msg = _("The summary is too short"); + } else if (summary_length > SUMMARY_LENGTH_MAX) { + /* TRANSLATORS: the review is not acceptable */ + msg = _("The summary is too long"); + } else if (gtk_text_buffer_get_char_count (buffer) < DESCRIPTION_LENGTH_MIN) { + /* TRANSLATORS: the review is not acceptable */ + msg = _("The description is too short"); + } else if (gtk_text_buffer_get_char_count (buffer) > DESCRIPTION_LENGTH_MAX) { + /* TRANSLATORS: the review is not acceptable */ + msg = _("The description is too long"); + } + + return msg; +} + +static void +gs_review_dialog_changed_cb (GsReviewDialog *dialog) +{ + const gchar *error_text; + + /* update review text */ + gs_review_dialog_update_review_comment (dialog); + + error_text = gs_review_dialog_validate (dialog); + + /* tell the user what's happening */ + gtk_widget_set_tooltip_text (dialog->post_button, error_text); + + /* can the user submit this? */ + gtk_widget_set_receives_default (dialog->post_button, error_text == NULL); + if (error_text == NULL) + gtk_widget_add_css_class (dialog->post_button, "suggested-action"); + else + gtk_widget_remove_css_class (dialog->post_button, "suggested-action"); +} + +static gboolean +gs_review_dialog_timeout_cb (gpointer user_data) +{ + GsReviewDialog *dialog = GS_REVIEW_DIALOG (user_data); + + dialog->timer_id = 0; + + gs_review_dialog_changed_cb (dialog); + + return FALSE; +} + +static void +gs_review_dialog_post_button_clicked_cb (GsReviewDialog *self) +{ + const gchar *error_text = gs_review_dialog_validate (self); + + if (error_text != NULL) { + gs_review_dialog_set_error_text (self, error_text); + } else { + g_signal_emit (self, signals[SIGNAL_SEND], 0, NULL); + } +} + +static void +gs_review_dialog_text_box_clicked_cb (GtkGestureClick *gesture, + gint n_press, + gdouble x, + gdouble y, + gpointer user_data) +{ + GsReviewDialog *self = user_data; + if (n_press == 1) + gtk_widget_grab_focus (self->text_view); +} + +static void +gs_review_dialog_text_box_notify_is_focus_cb (GtkEventControllerFocus *controller, + GParamSpec *param, + gpointer user_data) +{ + GsReviewDialog *self = user_data; + gboolean value = gtk_event_controller_focus_is_focus (controller); + + gtk_widget_set_visible (self->edit_icon, !value); + + if (value) + gtk_widget_add_css_class (self->review_row, "focused"); + else + gtk_widget_remove_css_class (self->review_row, "focused"); + + if (!value) { + GtkTextBuffer *buffer; + GtkTextIter start, end; + gboolean is_empty; + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->text_view)); + gtk_text_buffer_get_start_iter (buffer, &start); + gtk_text_buffer_get_end_iter (buffer, &end); + is_empty = gtk_text_iter_compare (&start, &end) == 0; + + value = !is_empty; + } + + gtk_widget_remove_css_class (self->text_box_label, value ? "title" : "subtitle"); + gtk_widget_add_css_class (self->text_box_label, value ? "subtitle" : "title"); +} + +static void +gs_review_dialog_init (GsReviewDialog *dialog) +{ + g_autoptr(GdkCursor) cursor = NULL; + GtkGesture *gesture; + GtkEventController *controller; + GtkTextBuffer *buffer; + + g_type_ensure (GS_TYPE_STAR_WIDGET); + + gtk_widget_init_template (GTK_WIDGET (dialog)); + + /* require the user to spend at least 5 seconds on writing a review */ + dialog->timer_id = g_timeout_add_seconds (WRITING_TIME_MIN, + gs_review_dialog_timeout_cb, + dialog); + + /* update UI */ + g_signal_connect_swapped (dialog->star, "rating-changed", + G_CALLBACK (gs_review_dialog_changed_cb), dialog); + g_signal_connect_swapped (dialog->summary_entry, "notify::text", + G_CALLBACK (gs_review_dialog_changed_cb), dialog); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->text_view)); + g_signal_connect_swapped (buffer, "changed", + G_CALLBACK (gs_review_dialog_changed_cb), dialog); + g_signal_connect_swapped (dialog->cancel_button, "clicked", + G_CALLBACK (adw_dialog_force_close), dialog); + g_signal_connect_swapped (dialog->post_button, "clicked", + G_CALLBACK (gs_review_dialog_post_button_clicked_cb), dialog); + + gs_review_dialog_changed_cb (dialog); + + cursor = gdk_cursor_new_from_name ("text", NULL); + gtk_widget_set_cursor (dialog->text_box, cursor); + + gesture = gtk_gesture_click_new (); + g_signal_connect_object (gesture, "released", + G_CALLBACK (gs_review_dialog_text_box_clicked_cb), dialog, 0); + gtk_widget_add_controller (dialog->text_box, GTK_EVENT_CONTROLLER (gesture)); + + controller = gtk_event_controller_focus_new (); + g_signal_connect_object (controller, "notify::is-focus", + G_CALLBACK (gs_review_dialog_text_box_notify_is_focus_cb), dialog, 0); + gtk_widget_add_controller (dialog->text_view, controller); +} + +static void +gs_review_dialog_dispose (GObject *object) +{ + GsReviewDialog *dialog = GS_REVIEW_DIALOG (object); + if (dialog->timer_id > 0) { + g_source_remove (dialog->timer_id); + dialog->timer_id = 0; + } + G_OBJECT_CLASS (gs_review_dialog_parent_class)->dispose (object); +} + +static void +gs_review_dialog_class_init (GsReviewDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_review_dialog_dispose; + + /** + * GsReviewDialog::send: + * @self: the #GsReviewDialog + * + * Emitted when the user clicks on the Send button to send the review. + * + * Since: 45 + */ + signals[SIGNAL_SEND] = + g_signal_new ("send", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-review-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, toast_overlay); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, star); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, label_rating_desc); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, summary_entry); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, review_row); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, text_box); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, text_box_label); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, edit_icon); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, text_view); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, cancel_button); + gtk_widget_class_bind_template_child (widget_class, GsReviewDialog, post_button); +} + +GtkWidget * +gs_review_dialog_new (void) +{ + return GTK_WIDGET (g_object_new (GS_TYPE_REVIEW_DIALOG, + NULL)); +} + +void +gs_review_dialog_set_error_text (GsReviewDialog *dialog, + const gchar *error_text) +{ + AdwToast *toast; + + g_return_if_fail (GS_IS_REVIEW_DIALOG (dialog)); + g_return_if_fail (error_text != NULL); + + toast = adw_toast_new (error_text); + + adw_toast_overlay_add_toast (ADW_TOAST_OVERLAY (dialog->toast_overlay), toast); +} + +void +gs_review_dialog_submit_set_sensitive (GsReviewDialog *dialog, + gboolean sensitive) +{ + gtk_widget_set_sensitive (dialog->post_button, sensitive); +} diff --git a/src/gs-review-dialog.h b/src/gs-review-dialog.h new file mode 100644 index 0000000..0de02ff --- /dev/null +++ b/src/gs-review-dialog.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Canonical Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define GS_TYPE_REVIEW_DIALOG (gs_review_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsReviewDialog, gs_review_dialog, GS, REVIEW_DIALOG, AdwDialog) + +GtkWidget *gs_review_dialog_new (void); +gint gs_review_dialog_get_rating (GsReviewDialog *dialog); +void gs_review_dialog_set_rating (GsReviewDialog *dialog, + gint rating); +const gchar *gs_review_dialog_get_summary (GsReviewDialog *dialog); +gchar *gs_review_dialog_get_text (GsReviewDialog *dialog); +void gs_review_dialog_set_error_text(GsReviewDialog *dialog, + const gchar *error_text); +void gs_review_dialog_submit_set_sensitive (GsReviewDialog *dialog, + gboolean sensitive); + +G_END_DECLS diff --git a/src/gs-review-dialog.ui b/src/gs-review-dialog.ui new file mode 100644 index 0000000..2ea9eee --- /dev/null +++ b/src/gs-review-dialog.ui @@ -0,0 +1,178 @@ + + + + + + + horizontal + + + + + + diff --git a/src/gs-review-histogram.c b/src/gs-review-histogram.c new file mode 100644 index 0000000..5f63f30 --- /dev/null +++ b/src/gs-review-histogram.c @@ -0,0 +1,138 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Canonical Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-common.h" +#include "gs-review-histogram.h" +#include "gs-review-bar.h" +#include "gs-star-image.h" + +typedef struct +{ + GtkWidget *bar1; + GtkWidget *bar2; + GtkWidget *bar3; + GtkWidget *bar4; + GtkWidget *bar5; + GtkWidget *label_value; + GtkWidget *label_total; + GtkWidget *star_value_1; + GtkWidget *star_value_2; + GtkWidget *star_value_3; + GtkWidget *star_value_4; + GtkWidget *star_value_5; +} GsReviewHistogramPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsReviewHistogram, gs_review_histogram, GTK_TYPE_WIDGET) + +void +gs_review_histogram_set_ratings (GsReviewHistogram *histogram, + gint rating_percent, + GArray *review_ratings) +{ + GsReviewHistogramPrivate *priv = gs_review_histogram_get_instance_private (histogram); + g_autofree gchar *text = NULL; + gdouble fraction[6] = { 0.0f }; + guint32 max = 0; + guint32 total = 0; + + g_return_if_fail (GS_IS_REVIEW_HISTOGRAM (histogram)); + + /* sanity check */ + if (review_ratings->len != 6) { + g_warning ("ratings data incorrect expected 012345"); + return; + } + + /* idx 0 is '0 stars' which we don't support in the UI */ + for (guint i = 1; i < review_ratings->len; i++) { + guint32 c = g_array_index (review_ratings, guint32, i); + max = MAX (c, max); + } + for (guint i = 1; i < review_ratings->len; i++) { + guint32 c = g_array_index (review_ratings, guint32, i); + fraction[i] = max > 0 ? (gdouble) c / (gdouble) max : 0.f; + total += c; + } + + gs_review_bar_set_fraction (GS_REVIEW_BAR (priv->bar5), fraction[5]); + gs_review_bar_set_fraction (GS_REVIEW_BAR (priv->bar4), fraction[4]); + gs_review_bar_set_fraction (GS_REVIEW_BAR (priv->bar3), fraction[3]); + gs_review_bar_set_fraction (GS_REVIEW_BAR (priv->bar2), fraction[2]); + gs_review_bar_set_fraction (GS_REVIEW_BAR (priv->bar1), fraction[1]); + + text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%u review total", "%u reviews total", total), total); + gtk_label_set_text (GTK_LABEL (priv->label_total), text); + + g_clear_pointer (&text, g_free); + + /* Round explicitly, to avoid rounding inside the printf() call and to use + the same value also for the stars fraction. */ + fraction[0] = total > 0 ? round (((gdouble) rating_percent ) * 50.0 / 100.0) / 10.0 : 0.0; + text = g_strdup_printf ("%.01f", fraction[0]); + gtk_label_set_text (GTK_LABEL (priv->label_value), text); + + gs_star_image_set_fraction (GS_STAR_IMAGE (priv->star_value_1), CLAMP (fraction[0], 0.0, 1.0)); + gs_star_image_set_fraction (GS_STAR_IMAGE (priv->star_value_2), CLAMP (fraction[0], 1.0, 2.0) - 1.0); + gs_star_image_set_fraction (GS_STAR_IMAGE (priv->star_value_3), CLAMP (fraction[0], 2.0, 3.0) - 2.0); + gs_star_image_set_fraction (GS_STAR_IMAGE (priv->star_value_4), CLAMP (fraction[0], 3.0, 4.0) - 3.0); + gs_star_image_set_fraction (GS_STAR_IMAGE (priv->star_value_5), CLAMP (fraction[0], 4.0, 5.0) - 4.0); +} + +static void +gs_review_histogram_dispose (GObject *object) +{ + gs_widget_remove_all (GTK_WIDGET (object), NULL); + + G_OBJECT_CLASS (gs_review_histogram_parent_class)->dispose (object); +} + +static void +gs_review_histogram_init (GsReviewHistogram *histogram) +{ + g_type_ensure (GS_TYPE_REVIEW_BAR); + g_type_ensure (GS_TYPE_STAR_IMAGE); + + gtk_widget_init_template (GTK_WIDGET (histogram)); +} + +static void +gs_review_histogram_class_init (GsReviewHistogramClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_review_histogram_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-review-histogram.ui"); + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); + + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, bar5); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, bar4); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, bar3); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, bar2); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, bar1); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, label_value); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, label_total); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, star_value_1); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, star_value_2); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, star_value_3); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, star_value_4); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewHistogram, star_value_5); +} + +GtkWidget * +gs_review_histogram_new (void) +{ + GsReviewHistogram *histogram; + histogram = g_object_new (GS_TYPE_REVIEW_HISTOGRAM, NULL); + return GTK_WIDGET (histogram); +} diff --git a/src/gs-review-histogram.h b/src/gs-review-histogram.h new file mode 100644 index 0000000..1e43a4d --- /dev/null +++ b/src/gs-review-histogram.h @@ -0,0 +1,30 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Canonical Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define GS_TYPE_REVIEW_HISTOGRAM (gs_review_histogram_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsReviewHistogram, gs_review_histogram, GS, REVIEW_HISTOGRAM, GtkWidget) + +struct _GsReviewHistogramClass +{ + GtkWidgetClass parent_class; +}; + +GtkWidget *gs_review_histogram_new (void); + +void gs_review_histogram_set_ratings (GsReviewHistogram *histogram, + gint rating_percent, + GArray *review_ratings); + +G_END_DECLS diff --git a/src/gs-review-histogram.ui b/src/gs-review-histogram.ui new file mode 100644 index 0000000..30afb73 --- /dev/null +++ b/src/gs-review-histogram.ui @@ -0,0 +1,390 @@ + + + + + diff --git a/src/gs-review-row.c b/src/gs-review-row.c new file mode 100644 index 0000000..7e89e89 --- /dev/null +++ b/src/gs-review-row.c @@ -0,0 +1,338 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Canonical Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-review-row.h" +#include "gs-star-widget.h" + +typedef struct +{ + AsReview *review; + gboolean enable_actions; + guint64 actions; + GtkWidget *stars; + GtkWidget *summary_label; + GtkWidget *author_label; + GtkWidget *date_label; + GtkWidget *text_label; + GtkWidget *button_like; + GtkWidget *button_dislike; + GtkWidget *button_report; + GtkWidget *button_remove; + GtkWidget *box_voting; +} GsReviewRowPrivate; + +enum { + SIGNAL_BUTTON_CLICKED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +G_DEFINE_TYPE_WITH_PRIVATE (GsReviewRow, gs_review_row, GTK_TYPE_LIST_BOX_ROW) + +static void +gs_review_row_refresh (GsReviewRow *row) +{ + GsReviewRowPrivate *priv = gs_review_row_get_instance_private (row); + const gchar *reviewer; + GDateTime *date; + g_autofree gchar *text = NULL; + + gs_star_widget_set_rating (GS_STAR_WIDGET (priv->stars), + as_review_get_rating (priv->review)); + reviewer = as_review_get_reviewer_name (priv->review); + if (reviewer == NULL) { + /* TRANSLATORS: this is when a user doesn't specify a name */ + reviewer = C_("Reviewer name", "Unknown"); + } + gtk_label_set_text (GTK_LABEL (priv->author_label), reviewer); + date = as_review_get_date (priv->review); + if (date != NULL) + /* TRANSLATORS: This is the date string with: day number, month name, year. + i.e. "25 May 2012" */ + text = g_date_time_format (date, _("%e %B %Y")); + else + text = g_strdup (""); + gtk_label_set_text (GTK_LABEL (priv->date_label), text); + gtk_label_set_text (GTK_LABEL (priv->summary_label), + as_review_get_summary (priv->review)); + gtk_widget_set_tooltip_text (priv->summary_label, + as_review_get_summary (priv->review)); + gtk_label_set_text (GTK_LABEL (priv->text_label), + as_review_get_description (priv->review)); + + /* if we voted, we can't do any actions */ + if (as_review_get_flags (priv->review) & AS_REVIEW_FLAG_VOTED) + priv->actions = 0; + + /* set actions up */ + if ((priv->actions & (1 << GS_REVIEW_ACTION_UPVOTE | + 1 << GS_REVIEW_ACTION_DOWNVOTE)) == 0) { + gtk_widget_set_visible (priv->box_voting, FALSE); + } else { + gtk_widget_set_visible (priv->box_voting, TRUE); + gtk_widget_set_visible (priv->button_like, + priv->actions & 1 << GS_REVIEW_ACTION_UPVOTE); + gtk_widget_set_visible (priv->button_dislike, + priv->actions & 1 << GS_REVIEW_ACTION_DOWNVOTE); + } + gtk_widget_set_visible (priv->button_remove, + priv->actions & 1 << GS_REVIEW_ACTION_REMOVE); + gtk_widget_set_visible (priv->button_report, + priv->actions & 1 << GS_REVIEW_ACTION_REPORT); + + if (priv->enable_actions) { + gtk_widget_set_sensitive (priv->button_like, TRUE); + gtk_widget_set_sensitive (priv->button_dislike, TRUE); + gtk_widget_set_sensitive (priv->button_remove, TRUE); + gtk_widget_set_sensitive (priv->button_report, TRUE); + } else { + gtk_widget_set_sensitive (priv->button_like, FALSE); + gtk_widget_set_sensitive (priv->button_dislike, FALSE); + gtk_widget_set_sensitive (priv->button_remove, FALSE); + gtk_widget_set_sensitive (priv->button_report, FALSE); + } +} + +void +gs_review_row_actions_set_sensitive (GsReviewRow *review_row, gboolean sensitive) +{ + GsReviewRowPrivate *priv = gs_review_row_get_instance_private (review_row); + priv->enable_actions = sensitive; + gs_review_row_refresh (review_row); +} + +static gboolean +gs_review_row_refresh_idle (gpointer user_data) +{ + GsReviewRow *row = GS_REVIEW_ROW (user_data); + + gs_review_row_refresh (row); + + g_object_unref (row); + return G_SOURCE_REMOVE; +} + +static void +gs_review_row_notify_props_changed_cb (GsApp *app, + GParamSpec *pspec, + GsReviewRow *row) +{ + g_idle_add (gs_review_row_refresh_idle, g_object_ref (row)); +} + +static void +gs_review_row_init (GsReviewRow *row) +{ + GsReviewRowPrivate *priv = gs_review_row_get_instance_private (row); + + priv->enable_actions = TRUE; + + g_type_ensure (GS_TYPE_STAR_WIDGET); + + gtk_widget_init_template (GTK_WIDGET (row)); +} + +static void +gs_review_row_dispose (GObject *object) +{ + GsReviewRow *row = GS_REVIEW_ROW (object); + GsReviewRowPrivate *priv = gs_review_row_get_instance_private (row); + + g_clear_object (&priv->review); + + G_OBJECT_CLASS (gs_review_row_parent_class)->dispose (object); +} + +static void +gs_review_row_class_init (GsReviewRowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_review_row_dispose; + + signals [SIGNAL_BUTTON_CLICKED] = + g_signal_new ("button-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsReviewRowClass, button_clicked), + NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-review-row.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, stars); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, summary_label); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, author_label); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, date_label); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, text_label); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, button_like); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, button_dislike); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, button_report); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, button_remove); + gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, box_voting); +} + +static void +gs_review_row_button_clicked_upvote_cb (GtkButton *button, GsReviewRow *row) +{ + g_signal_emit (row, signals[SIGNAL_BUTTON_CLICKED], 0, + GS_REVIEW_ACTION_UPVOTE); +} + +static void +gs_review_row_button_clicked_downvote_cb (GtkButton *button, GsReviewRow *row) +{ + g_signal_emit (row, signals[SIGNAL_BUTTON_CLICKED], 0, + GS_REVIEW_ACTION_DOWNVOTE); +} + +static void +gs_review_row_confirm_cb (AdwAlertDialog *dialog, const gchar *response, GsReviewRow *row) +{ + if (g_strcmp0 (response, "report") == 0) { + g_signal_emit (row, signals[SIGNAL_BUTTON_CLICKED], 0, + GS_REVIEW_ACTION_REPORT); + } + + if (g_strcmp0 (response, "remove") == 0) { + g_signal_emit (row, signals[SIGNAL_BUTTON_CLICKED], 0, + GS_REVIEW_ACTION_REMOVE); + } +} + +static void +gs_review_row_button_clicked_report_cb (GtkButton *button, GsReviewRow *row) +{ + AdwDialog *dialog; + g_autoptr(GString) str = NULL; + + str = g_string_new (""); + + /* TRANSLATORS: we explain what the action is going to do */ + g_string_append (str, _("You can report reviews for abusive, rude, or " + "discriminatory behavior.")); + g_string_append (str, " "); + + /* TRANSLATORS: we ask the user if they really want to do this */ + g_string_append (str, _("Once reported, a review will be hidden until " + "it has been checked by an administrator.")); + + /* TRANSLATORS: window title when reporting a user-submitted review + * for moderation */ + dialog = adw_alert_dialog_new (_("Report Review?"), str->str); + adw_alert_dialog_add_responses (ADW_ALERT_DIALOG (dialog), + "cancel", _("_Cancel"), + /* TRANSLATORS: button text when + * * sending a review for moderation */ + "report", _("_Report"), + NULL); + adw_alert_dialog_set_response_appearance (ADW_ALERT_DIALOG (dialog), + "report", ADW_RESPONSE_DESTRUCTIVE); + g_signal_connect (dialog, "response", + G_CALLBACK (gs_review_row_confirm_cb), row); + adw_dialog_present (dialog, GTK_WIDGET (row)); +} + +static void +gs_review_row_button_clicked_remove_cb (GtkButton *button, GsReviewRow *row) +{ + AdwDialog *dialog; + + /* TRANSLATORS: window title when the user attempts to remove their + * review */ + dialog = adw_alert_dialog_new (_("Remove Review?"), NULL); + + /* TRANSLATORS: we ask the user if they really want to do this */ + adw_alert_dialog_set_body (ADW_ALERT_DIALOG (dialog), _("Removing a review cannot be undone.")); + adw_alert_dialog_add_responses (ADW_ALERT_DIALOG (dialog), + "cancel", _("_Cancel"), + /* TRANSLATORS: button text when + * removing a review */ + "remove", _("_Remove"), + NULL); + adw_alert_dialog_set_response_appearance (ADW_ALERT_DIALOG (dialog), + "remove", ADW_RESPONSE_DESTRUCTIVE); + g_signal_connect (dialog, "response", + G_CALLBACK (gs_review_row_confirm_cb), row); + adw_dialog_present (dialog, GTK_WIDGET (row)); +} + +AsReview * +gs_review_row_get_review (GsReviewRow *review_row) +{ + GsReviewRowPrivate *priv = gs_review_row_get_instance_private (review_row); + return priv->review; +} + +void +gs_review_row_set_actions (GsReviewRow *review_row, guint64 actions) +{ + GsReviewRowPrivate *priv = gs_review_row_get_instance_private (review_row); + priv->actions = actions; + gs_review_row_refresh (review_row); +} + +const gchar * +gs_review_row_action_to_string (GsReviewAction action) +{ + if (action == GS_REVIEW_ACTION_UPVOTE) + return "upvote"; + if (action == GS_REVIEW_ACTION_DOWNVOTE) + return "downvote"; + if (action == GS_REVIEW_ACTION_REPORT) + return "report"; + if (action == GS_REVIEW_ACTION_REMOVE) + return "remove"; + + g_assert_not_reached (); +} + +/** + * gs_review_row_new: + * @review: The review to show + * + * Create a widget suitable for showing an app review. + * + * Return value: A new @GsReviewRow. + **/ +GtkWidget * +gs_review_row_new (AsReview *review) +{ + GsReviewRow *row; + GsReviewRowPrivate *priv; + + g_return_val_if_fail (AS_IS_REVIEW (review), NULL); + + row = g_object_new (GS_TYPE_REVIEW_ROW, NULL); + priv = gs_review_row_get_instance_private (row); + priv->review = g_object_ref (review); + g_signal_connect_object (priv->review, "notify::flags", + G_CALLBACK (gs_review_row_notify_props_changed_cb), + row, 0); + g_signal_connect_object (priv->button_like, "clicked", + G_CALLBACK (gs_review_row_button_clicked_upvote_cb), + row, 0); + g_signal_connect_object (priv->button_dislike, "clicked", + G_CALLBACK (gs_review_row_button_clicked_downvote_cb), + row, 0); + g_signal_connect_object (priv->button_report, "clicked", + G_CALLBACK (gs_review_row_button_clicked_report_cb), + row, 0); + g_signal_connect_object (priv->button_remove, "clicked", + G_CALLBACK (gs_review_row_button_clicked_remove_cb), + row, 0); + gs_review_row_refresh (row); + + return GTK_WIDGET (row); +} diff --git a/src/gs-review-row.h b/src/gs-review-row.h new file mode 100644 index 0000000..8102cfc --- /dev/null +++ b/src/gs-review-row.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Canonical Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +/** + * GsReviewAction: + * @GS_REVIEW_ACTION_UPVOTE: Add a vote to the review. + * @GS_REVIEW_ACTION_DOWNVOTE: Remove a vote from the review. + * @GS_REVIEW_ACTION_REPORT: Report the review for inappropriate content. + * @GS_REVIEW_ACTION_REMOVE: Remove one of your own reviews. + * + * Actions which can be performed on a review. + * + * Since: 41 + */ +typedef enum +{ + GS_REVIEW_ACTION_UPVOTE, + GS_REVIEW_ACTION_DOWNVOTE, + GS_REVIEW_ACTION_REPORT, + GS_REVIEW_ACTION_REMOVE, +} GsReviewAction; + +#define GS_TYPE_REVIEW_ROW (gs_review_row_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsReviewRow, gs_review_row, GS, REVIEW_ROW, GtkListBoxRow) + +struct _GsReviewRowClass +{ + GtkListBoxRowClass parent_class; + void (*button_clicked) (GsReviewRow *review_row, + GsPluginAction action); +}; + +GtkWidget *gs_review_row_new (AsReview *review); +AsReview *gs_review_row_get_review (GsReviewRow *review_row); +void gs_review_row_set_actions (GsReviewRow *review_row, + guint64 actions); +void gs_review_row_actions_set_sensitive (GsReviewRow *review_row, + gboolean sensitive); +const gchar *gs_review_row_action_to_string (GsReviewAction action); + +G_END_DECLS diff --git a/src/gs-review-row.ui b/src/gs-review-row.ui new file mode 100644 index 0000000..03f3184 --- /dev/null +++ b/src/gs-review-row.ui @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/gs-safety-context-dialog.c b/src/gs-safety-context-dialog.c new file mode 100644 index 0000000..3cfc367 --- /dev/null +++ b/src/gs-safety-context-dialog.c @@ -0,0 +1,788 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-safety-context-dialog + * @short_description: A dialog showing safety information about an app + * + * #GsSafetyContextDialog is a dialog which shows detailed information about + * how safe or trustworthy an app is. This information is derived from the + * permissions the app requires to run, its runtime, origin, and various other + * sources. + * + * It is designed to show a more detailed view of the information which the + * app’s safety tile in #GsAppContextBar is derived from. + * + * The widget has no special appearance if the app is unset, so callers will + * typically want to hide the dialog in that case. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-app.h" +#include "gs-common.h" +#include "gs-context-dialog-row.h" +#include "gs-lozenge.h" +#include "gs-safety-context-dialog.h" + +struct _GsSafetyContextDialog +{ + GsInfoWindow parent_instance; + + GsApp *app; /* (nullable) (owned) */ + gulong app_notify_handler_permissions; + gulong app_notify_handler_name; + gulong app_notify_handler_quirk; + gulong app_notify_handler_license; + gulong app_notify_handler_related; + + GtkWidget *lozenge; + GtkLabel *title; + GtkListBox *permissions_list; + + AdwActionRow *license_row; + GBinding *license_label_binding; /* (owned) (nullable) */ + AdwActionRow *source_row; + GBinding *source_label_binding; /* (owned) (nullable) */ + GtkWidget *packagename_row; + GtkWidget *sdk_row; + GtkWidget *sdk_eol_button; +}; + +G_DEFINE_TYPE (GsSafetyContextDialog, gs_safety_context_dialog, GS_TYPE_INFO_WINDOW) + +typedef enum { + PROP_APP = 1, +} GsSafetyContextDialogProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +/* @icon_name_without_permission, @title_without_permission and + * @description_without_permission are all nullable. If they are NULL, no row + * is added if @has_permission is false. */ +static void +add_permission_row (GtkListBox *list_box, + GsContextDialogRowImportance *chosen_rating, + gboolean has_permission, + GsContextDialogRowImportance item_rating, + const gchar *icon_name_with_permission, + const gchar *title_with_permission, + const gchar *description_with_permission, + const gchar *icon_name_without_permission, + const gchar *title_without_permission, + const gchar *description_without_permission) +{ + GtkListBoxRow *row; + + if (has_permission && item_rating > *chosen_rating) + *chosen_rating = item_rating; + + if (!has_permission && title_without_permission == NULL) + return; + + row = gs_context_dialog_row_new (has_permission ? icon_name_with_permission : icon_name_without_permission, + has_permission ? item_rating : GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT, + has_permission ? title_with_permission : title_without_permission, + has_permission ? description_with_permission : description_without_permission); + gtk_list_box_append (list_box, GTK_WIDGET (row)); +} + +static void +update_permissions_list (GsSafetyContextDialog *self) +{ + const gchar *icon_name, *css_class; + g_autofree gchar *title = NULL; + g_autoptr(GsAppPermissions) permissions = NULL; + GsAppPermissionsFlags perm_flags = GS_APP_PERMISSIONS_FLAGS_NONE; + GsContextDialogRowImportance chosen_rating; + GsContextDialogRowImportance license_rating; + + /* Treat everything as safe to begin with, and downgrade its safety + * based on app properties. */ + chosen_rating = GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT; + + gs_widget_remove_all (GTK_WIDGET (self->permissions_list), (GsRemoveFunc) gtk_list_box_remove); + + /* UI state is undefined if app is not set. */ + if (self->app == NULL) + return; + + permissions = gs_app_dup_permissions (self->app); + if (permissions != NULL) + perm_flags = gs_app_permissions_get_flags (permissions); + + /* Handle unknown permissions. This means the app isn’t + * sandboxed, so we can only really base decisions on whether it was + * packaged by an organisation we trust or not. + * + * FIXME: See the comment for GS_APP_PERMISSIONS_FLAGS_UNKNOWN in + * gs-app-context-bar.c. */ + if (permissions == NULL) { + chosen_rating = GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL; + + if (gs_app_has_quirk (self->app, GS_APP_QUIRK_PROVENANCE)) { + /* It's a new key suggested at https://github.com/systemd/systemd/issues/27777 */ + g_autofree gchar *name = g_get_os_info ("VENDOR_NAME"); + g_autofree gchar *reviewed_by = NULL; + if (name == NULL) { + reviewed_by = g_strdup (_("Reviewed by OS distributor")); + } else { + /* Translators: The '%s' is replaced by the distribution name. */ + reviewed_by = g_strdup_printf (_("Reviewed by %s"), name); + } + add_permission_row (self->permissions_list, &chosen_rating, + TRUE, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL, + "channel-secure-symbolic", + reviewed_by, + _("App isn’t sandboxed but the distribution has checked that it is not malicious"), + NULL, NULL, NULL); + } else { + add_permission_row (self->permissions_list, &chosen_rating, + TRUE, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "channel-insecure-symbolic", + _("Provided by a third party"), + _("Check that you trust the vendor, as the app isn’t sandboxed"), + NULL, NULL, NULL); + } + } else { + const GPtrArray *filesystem_read, *filesystem_full; + + filesystem_read = gs_app_permissions_get_filesystem_read (permissions); + filesystem_full = gs_app_permissions_get_filesystem_full (permissions); + + add_permission_row (self->permissions_list, &chosen_rating, + gs_app_permissions_is_empty (permissions), + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT, + "permissions-sandboxed-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("No Permissions"), + _("App is fully sandboxed"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_NETWORK) != 0, + /* This isn’t actually unimportant (network access can expand a local + * vulnerability into a remotely exploitable one), but it’s + * needed commonly enough that marking it as + * %GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING is too noisy. */ + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION, + "network-wireless-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Network Access"), + _("Can access the internet"), + "network-wireless-disabled-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("No Network Access"), + _("Cannot access the internet")); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_SYSTEM_BUS) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "emblem-system-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Uses System Services"), + _("Can request data from system services"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_SESSION_BUS) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "emblem-system-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Uses Session Services"), + _("Can request data from session services"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_DEVICES) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "camera-photo-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("User Device Access"), + _("Can access devices such as webcams or gaming controllers"), + "camera-disabled-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("No User Device Access"), + _("Cannot access devices such as webcams or gaming controllers")); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_INPUT_DEVICES) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION, + "input-keyboard-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Input Device Access"), + _("Can access input devices"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_AUDIO_DEVICES) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION, + "permissions-microphone-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Microphone Access and Audio Playback"), + _("Can listen using microphones and play audio without asking permission"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_SYSTEM_DEVICES) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "permissions-system-devices-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("System Device Access"), + _("Can access system devices which require elevated permissions"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_SCREEN) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "permissions-screen-contents-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Screen Contents Access"), + _("Can access the contents of the screen or other windows"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_X11) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "permissions-legacy-windowing-system-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Legacy Windowing System"), + _("Uses a legacy windowing system"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "permissions-warning-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Arbitrary Permissions"), + _("Can acquire arbitrary permissions"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_SETTINGS) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "emblem-system-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("User Settings"), + _("Can access and change user settings"), + NULL, NULL, NULL); + + /* File system permissions are a bit more complex, since there are + * varying scopes of what’s readable/writable, and a difference between + * read-only and writable access. */ + add_permission_row (self->permissions_list, &chosen_rating, + (perm_flags & GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL) != 0, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "folder-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Full File System Read/Write Access"), + _("Can read and write all data on the file system"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + ((perm_flags & GS_APP_PERMISSIONS_FLAGS_HOME_FULL) != 0 && + !(perm_flags & GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL)), + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "user-home-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Home Folder Read/Write Access"), + _("Can read and write all data in your home directory"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + ((perm_flags & GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ) != 0 && + !(perm_flags & GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL)), + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "folder-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Full File System Read Access"), + _("Can read all data on the file system"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + ((perm_flags & GS_APP_PERMISSIONS_FLAGS_HOME_READ) != 0 && + !(perm_flags & (GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL | + GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ))), + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "user-home-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Home Folder Read Access"), + _("Can read all data in your home directory"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + ((perm_flags & GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL) != 0 && + !(perm_flags & (GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL | + GS_APP_PERMISSIONS_FLAGS_HOME_FULL))), + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "folder-download-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Download Folder Read/Write Access"), + _("Can read and write all data in your downloads directory"), + NULL, NULL, NULL); + add_permission_row (self->permissions_list, &chosen_rating, + ((perm_flags & GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_READ) != 0 && + !(perm_flags & (GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL | + GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ | + GS_APP_PERMISSIONS_FLAGS_HOME_FULL | + GS_APP_PERMISSIONS_FLAGS_HOME_READ))), + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "folder-download-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Download Folder Read Access"), + _("Can read all data in your downloads directory"), + NULL, NULL, NULL); + + for (guint i = 0; filesystem_full != NULL && i < filesystem_full->len; i++) { + const gchar *fs_title = g_ptr_array_index (filesystem_full, i); + add_permission_row (self->permissions_list, &chosen_rating, + TRUE, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "folder-symbolic", + fs_title, + _("Can read and write all data in the directory"), + NULL, NULL, NULL); + } + + for (guint i = 0; filesystem_read != NULL && i < filesystem_read->len; i++) { + const gchar *fs_title = g_ptr_array_index (filesystem_read, i); + add_permission_row (self->permissions_list, &chosen_rating, + TRUE, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "folder-symbolic", + fs_title, + _("Can read all data in the directory"), + NULL, NULL, NULL); + } + + add_permission_row (self->permissions_list, &chosen_rating, + !(perm_flags & (GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_FULL | + GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_READ | + GS_APP_PERMISSIONS_FLAGS_FILESYSTEM_OTHER | + GS_APP_PERMISSIONS_FLAGS_HOME_FULL | + GS_APP_PERMISSIONS_FLAGS_HOME_READ | + GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_FULL | + GS_APP_PERMISSIONS_FLAGS_DOWNLOADS_READ)) && + filesystem_read == NULL && filesystem_full == NULL, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT, + "folder-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("No File System Access"), + _("Cannot access the file system at all"), + NULL, NULL, NULL); + } + + add_permission_row (self->permissions_list, &chosen_rating, + gs_app_has_quirk (self->app, GS_APP_QUIRK_DEVELOPER_VERIFIED), + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT, + "app-verified-symbolic", + /* Translators: This indicates an app was written and released by a developer who has been verified. + * It’s used in a context tile, so should be short. */ + _("App developer is verified"), + _("The developer of this app has been verified to be who they say they are"), + NULL, NULL, NULL); + + add_permission_row (self->permissions_list, &chosen_rating, + gs_app_get_metadata_item (self->app, "GnomeSoftware::EolReason") != NULL || ( + gs_app_get_runtime (self->app) != NULL && + gs_app_get_metadata_item (gs_app_get_runtime (self->app), "GnomeSoftware::EolReason") != NULL), + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING, + "permissions-warning-symbolic", + /* Translators: This indicates an app uses an outdated SDK. + * It’s used in a context tile, so should be short. */ + _("Insecure Dependencies"), + _("Software or its dependencies are no longer supported and may be insecure"), + NULL, NULL, NULL); + + license_rating = GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION; + + if (gs_app_get_license (self->app) == NULL) { + add_permission_row (self->permissions_list, &chosen_rating, + TRUE, + GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL, + "permissions-warning-symbolic", + /* Translators: This indicates an app does not specify which license it's developed under. */ + _("Unknown License"), + gs_app_is_application (self->app) ? + _("This app does not specify what license it is developed under, and may be proprietary") : + _("This software does not specify what license it is developed under, and may be proprietary"), + NULL, NULL, NULL); + /* Is the code FOSS and hence inspectable? This doesn’t distinguish + * between closed source and open-source-but-not-FOSS software, even + * though the code of the latter is technically publicly auditable. This + * is because I don’t want to get into the business of maintaining lists + * of ‘auditable’ source code licenses. */ + } else if (g_ascii_strncasecmp (gs_app_get_license (self->app), "LicenseRef-proprietary", strlen ("LicenseRef-proprietary")) == 0) { + add_permission_row (self->permissions_list, &chosen_rating, + TRUE, + license_rating, + "proprietary-code-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Proprietary Code"), + _("The source code is not public, so it cannot be independently audited and might be unsafe"), + NULL, NULL, NULL); + } else { + g_autofree gchar *description = NULL; + + if (!gs_app_get_license_is_free (self->app)) { + if (gs_app_is_application (self->app)) { + /* Translators: The placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This app is developed under the special license “%s”"), gs_app_get_license (self->app)); + } else { + /* Translators: The placeholder here is the name of a software license. */ + description = g_strdup_printf (_("This software is developed under the special license “%s”"), gs_app_get_license (self->app)); + } + } + + add_permission_row (self->permissions_list, &chosen_rating, + !gs_app_get_license_is_free (self->app), + license_rating, + "software-license-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Special License"), + description, + "auditable-code-symbolic", + /* Translators: This refers to permissions (for example, from flatpak) which an app requests from the user. */ + _("Auditable Code"), + _("The source code is public and can be independently audited, which makes the app more likely to be safe")); + } + + /* Update the UI. */ + switch (chosen_rating) { + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL: + icon_name = "app-safety-ok-symbolic"; + /* Translators: The app is considered privileged, aka provided by the distribution. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s is privileged"), gs_app_get_name (self->app)); + css_class = "grey"; + break; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT: + icon_name = "app-safety-ok-symbolic"; + /* Translators: The app is considered safe to install and run. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s is safe"), gs_app_get_name (self->app)); + css_class = "green"; + break; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_INFORMATION: + icon_name = "app-safety-ok-symbolic"; + /* Translators: The app is considered probably safe to install and run. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s is probably safe"), gs_app_get_name (self->app)); + css_class = "yellow"; + break; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING: + icon_name = "app-safety-unknown-symbolic"; + /* Translators: The app is considered potentially unsafe to install and run. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s is potentially unsafe"), gs_app_get_name (self->app)); + css_class = "orange"; + break; + case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT: + icon_name = "permissions-warning-symbolic"; + /* Translators: The app is considered unsafe to install and run. + * The placeholder is the app name. */ + title = g_strdup_printf (_("%s is unsafe"), gs_app_get_name (self->app)); + css_class = "red"; + break; + default: + g_assert_not_reached (); + } + + gs_lozenge_set_icon_name (GS_LOZENGE (self->lozenge), icon_name); + gtk_label_set_text (self->title, title); + + gtk_widget_remove_css_class (self->lozenge, "green"); + gtk_widget_remove_css_class (self->lozenge, "yellow"); + gtk_widget_remove_css_class (self->lozenge, "orange"); + gtk_widget_remove_css_class (self->lozenge, "red"); + + gtk_widget_add_css_class (self->lozenge, css_class); +} + +static void +app_notify_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GsSafetyContextDialog *self = GS_SAFETY_CONTEXT_DIALOG (user_data); + + update_permissions_list (self); +} + +static void +update_sdk (GsSafetyContextDialog *self) +{ + GsApp *runtime; + + /* UI state is undefined if app is not set. */ + if (self->app == NULL) + return; + + runtime = gs_app_get_runtime (self->app); + + if (runtime != NULL) { + g_autofree gchar *label = NULL; + const gchar *version = gs_app_get_version_ui (runtime); + gboolean is_eol = gs_app_get_metadata_item (runtime, "GnomeSoftware::EolReason") != NULL; + + if (version != NULL) { + /* Translators: The first placeholder is an app runtime + * name, the second is its version number. */ + label = g_strdup_printf (_("%s (%s)"), + gs_app_get_name (runtime), + version); + } else { + label = g_strdup (gs_app_get_name (runtime)); + } + + adw_action_row_set_subtitle (ADW_ACTION_ROW (self->sdk_row), label); + + gtk_widget_set_visible (self->sdk_eol_button, is_eol); + } + + /* Only show the row if a runtime was found. */ + gtk_widget_set_visible (self->sdk_row, (runtime != NULL)); +} + +static void +app_notify_related_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GsSafetyContextDialog *self = GS_SAFETY_CONTEXT_DIALOG (user_data); + + update_sdk (self); +} + +static gboolean +sanitize_license_text_cb (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + const gchar *license = g_value_get_string (from_value); + + if (license == NULL) + /* Translators: This is used for "License Unknown" */ + g_value_set_string (to_value, C_("Unknown license", "Unknown")); + else if (g_ascii_strncasecmp (license, "LicenseRef-proprietary", strlen ("LicenseRef-proprietary")) == 0) + /* Translators: This is used for "License Proprietary" */ + g_value_set_string (to_value, _("Proprietary")); + else + g_value_set_string (to_value, license); + + return TRUE; +} + +static void +contribute_info_row_activated_cb (AdwButtonRow *row, + GsSafetyContextDialog *self) +{ + GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (self))); + + gs_show_uri (GTK_WINDOW (toplevel), "help:gnome-software/software-metadata#safety"); +} + +static void +gs_safety_context_dialog_init (GsSafetyContextDialog *self) +{ + g_type_ensure (GS_TYPE_LOZENGE); + + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +gs_safety_context_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsSafetyContextDialog *self = GS_SAFETY_CONTEXT_DIALOG (object); + + switch ((GsSafetyContextDialogProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_safety_context_dialog_get_app (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_safety_context_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsSafetyContextDialog *self = GS_SAFETY_CONTEXT_DIALOG (object); + + switch ((GsSafetyContextDialogProperty) prop_id) { + case PROP_APP: + gs_safety_context_dialog_set_app (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_safety_context_dialog_dispose (GObject *object) +{ + GsSafetyContextDialog *self = GS_SAFETY_CONTEXT_DIALOG (object); + + gs_safety_context_dialog_set_app (self, NULL); + + G_OBJECT_CLASS (gs_safety_context_dialog_parent_class)->dispose (object); +} + +static void +gs_safety_context_dialog_class_init (GsSafetyContextDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_safety_context_dialog_get_property; + object_class->set_property = gs_safety_context_dialog_set_property; + object_class->dispose = gs_safety_context_dialog_dispose; + + /** + * GsSafetyContextDialog:app: (nullable) + * + * The app to display the safety context details for. + * + * This may be %NULL; if so, the content of the widget will be + * undefined. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-safety-context-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, lozenge); + gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, title); + gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, permissions_list); + gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, license_row); + gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, source_row); + gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, packagename_row); + gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, sdk_row); + gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, sdk_eol_button); + + gtk_widget_class_bind_template_callback (widget_class, contribute_info_row_activated_cb); +} + +/** + * gs_safety_context_dialog_new: + * @app: (nullable): the app to display safety context information for, or %NULL + * + * Create a new #GsSafetyContextDialog and set its initial app to @app. + * + * Returns: (transfer full): a new #GsSafetyContextDialog + * Since: 41 + */ +GsSafetyContextDialog * +gs_safety_context_dialog_new (GsApp *app) +{ + g_return_val_if_fail (app == NULL || GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_SAFETY_CONTEXT_DIALOG, + "app", app, + NULL); +} + +/** + * gs_safety_context_dialog_get_app: + * @self: a #GsSafetyContextDialog + * + * Gets the value of #GsSafetyContextDialog:app. + * + * Returns: (nullable) (transfer none): app whose safety context information is + * being displayed, or %NULL if none is set + * Since: 41 + */ +GsApp * +gs_safety_context_dialog_get_app (GsSafetyContextDialog *self) +{ + g_return_val_if_fail (GS_IS_SAFETY_CONTEXT_DIALOG (self), NULL); + + return self->app; +} + +/** + * gs_safety_context_dialog_set_app: + * @self: a #GsSafetyContextDialog + * @app: (nullable) (transfer none): the app to display safety context + * information for, or %NULL for none + * + * Set the value of #GsSafetyContextDialog:app. + * + * Since: 41 + */ +void +gs_safety_context_dialog_set_app (GsSafetyContextDialog *self, + GsApp *app) +{ + g_return_if_fail (GS_IS_SAFETY_CONTEXT_DIALOG (self)); + g_return_if_fail (app == NULL || GS_IS_APP (app)); + + if (app == self->app) + return; + + g_clear_signal_handler (&self->app_notify_handler_permissions, self->app); + g_clear_signal_handler (&self->app_notify_handler_name, self->app); + g_clear_signal_handler (&self->app_notify_handler_quirk, self->app); + g_clear_signal_handler (&self->app_notify_handler_license, self->app); + g_clear_signal_handler (&self->app_notify_handler_related, self->app); + + g_clear_object (&self->license_label_binding); + g_clear_object (&self->source_label_binding); + + g_set_object (&self->app, app); + + if (self->app != NULL) { + const gchar *packagename_value; + + self->app_notify_handler_permissions = g_signal_connect (self->app, "notify::permissions", G_CALLBACK (app_notify_cb), self); + self->app_notify_handler_name = g_signal_connect (self->app, "notify::name", G_CALLBACK (app_notify_cb), self); + self->app_notify_handler_quirk = g_signal_connect (self->app, "notify::quirk", G_CALLBACK (app_notify_cb), self); + self->app_notify_handler_license = g_signal_connect (self->app, "notify::license", G_CALLBACK (app_notify_cb), self); + + self->app_notify_handler_related = g_signal_connect (self->app, "notify::related", G_CALLBACK (app_notify_related_cb), self); + + self->license_label_binding = g_object_bind_property_full (self->app, "license", self->license_row, "subtitle", G_BINDING_SYNC_CREATE, + sanitize_license_text_cb, NULL, NULL, NULL); + self->source_label_binding = g_object_bind_property (self->app, "origin-ui", self->source_row, "subtitle", G_BINDING_SYNC_CREATE); + + packagename_value = gs_app_get_metadata_item (app, "GnomeSoftware::packagename-value"); + if (packagename_value != NULL && *packagename_value != '\0') { + const gchar *packagename_title = gs_app_get_metadata_item (app, "GnomeSoftware::packagename-title"); + if (packagename_title == NULL || *packagename_title == '\0') { + /* Translators: This is a heading for a row showing the package name of an app (such as ‘gnome-software-46.0-1’). */ + packagename_title = _("Package"); + } + adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->packagename_row), packagename_title); + adw_action_row_set_subtitle (ADW_ACTION_ROW (self->packagename_row), packagename_value); + } + + gtk_widget_set_visible (self->packagename_row, packagename_value != NULL && *packagename_value != '\0'); + } else { + gtk_widget_set_visible (self->packagename_row, FALSE); + } + + /* Update the UI. */ + update_permissions_list (self); + update_sdk (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); +} diff --git a/src/gs-safety-context-dialog.h b/src/gs-safety-context-dialog.h new file mode 100644 index 0000000..562399f --- /dev/null +++ b/src/gs-safety-context-dialog.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" +#include "gs-info-window.h" + +G_BEGIN_DECLS + +#define GS_TYPE_SAFETY_CONTEXT_DIALOG (gs_safety_context_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsSafetyContextDialog, gs_safety_context_dialog, GS, SAFETY_CONTEXT_DIALOG, GsInfoWindow) + +GsSafetyContextDialog *gs_safety_context_dialog_new (GsApp *app); + +GsApp *gs_safety_context_dialog_get_app (GsSafetyContextDialog *self); +void gs_safety_context_dialog_set_app (GsSafetyContextDialog *self, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-safety-context-dialog.ui b/src/gs-safety-context-dialog.ui new file mode 100644 index 0000000..047aedf --- /dev/null +++ b/src/gs-safety-context-dialog.ui @@ -0,0 +1,161 @@ + + + + + + + bottom + False + + + center + 6 + 6 + 6 + 6 + This app uses an outdated version of the software platform (SDK) and might contain bugs or security vulnerabilities which will not be fixed. + True + 50 + center + + True + + + + diff --git a/src/gs-screenshot-carousel.c b/src/gs-screenshot-carousel.c new file mode 100644 index 0000000..d269af6 --- /dev/null +++ b/src/gs-screenshot-carousel.c @@ -0,0 +1,364 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2015-2019 Kalev Lember + * Copyright (C) 2019 Joaquim Rocha + * Copyright (C) 2021 Adrien Plazas + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-screenshot-carousel + * @short_description: A carousel presenting the screenshots of a #GsApp + * + * #GsScreenshotCarousel loads screenshots from a #GsApp and present them to the + * users. + * + * If the carousel doesn't have any screenshot to display, an empty state + * fallback will be presented, and it will be considered to have screenshots as + * long as it is trying to load some. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "gs-common.h" +#include "gs-download-utils.h" +#include "gs-utils.h" + +#include "gs-screenshot-carousel.h" +#include "gs-screenshot-image.h" + +struct _GsScreenshotCarousel +{ + GtkWidget parent_instance; + + SoupSession *session; /* (owned) (not nullable) */ + gboolean has_screenshots; + + GtkWidget *button_next; + GtkWidget *button_next_revealer; + GtkWidget *button_previous; + GtkWidget *button_previous_revealer; + GtkWidget *carousel; + GtkWidget *carousel_indicator; + GtkStack *stack; +}; + +typedef enum { + PROP_HAS_SCREENSHOTS = 1, +} GsScreenshotCarouselProperty; + +static GParamSpec *obj_props[PROP_HAS_SCREENSHOTS + 1] = { NULL, }; + +G_DEFINE_TYPE (GsScreenshotCarousel, gs_screenshot_carousel, GTK_TYPE_WIDGET) + +static void +_set_state (GsScreenshotCarousel *self, guint length, gboolean allow_fallback, gboolean is_online) +{ + gboolean has_screenshots; + + gtk_widget_set_visible (self->carousel_indicator, length > 1); + gtk_stack_set_visible_child_name (self->stack, length > 0 ? "carousel" : "fallback"); + + has_screenshots = length > 0 || (allow_fallback && is_online); + if (self->has_screenshots != has_screenshots) { + self->has_screenshots = has_screenshots; + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_HAS_SCREENSHOTS]); + } +} + +static void +gs_screenshot_carousel_img_clicked_cb (GtkWidget *ssimg, + gpointer user_data) +{ + GsScreenshotCarousel *self = user_data; + adw_carousel_scroll_to (ADW_CAROUSEL (self->carousel), ssimg, TRUE); +} + +/** + * gs_screenshot_carousel_load_screenshots: + * @self: a #GsScreenshotCarousel + * @app: app to load the screenshots for + * @is_online: %TRUE if the network is expected to work to load screenshots, %FALSE otherwise + * + * Clear the existing set of screenshot images, and load the + * screenshots for @app instead. Display them, or display a + * fallback if no screenshots could be loaded (and the fallback + * is enabled). + * + * This will start some asynchronous network requests to download + * screenshots. Those requests may continue after this function + * call returns. + * + * Since: 41 + */ +void +gs_screenshot_carousel_load_screenshots (GsScreenshotCarousel *self, GsApp *app, gboolean is_online, GCancellable *cancellable) +{ + GPtrArray *screenshots; + gboolean allow_fallback; + guint num_screenshots_loaded = 0; + + g_return_if_fail (GS_IS_SCREENSHOT_CAROUSEL (self)); + g_return_if_fail (GS_IS_APP (app)); + + /* fallback warning */ + screenshots = gs_app_get_screenshots (app); + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_GENERIC: + case AS_COMPONENT_KIND_CODEC: + case AS_COMPONENT_KIND_ADDON: + case AS_COMPONENT_KIND_REPOSITORY: + case AS_COMPONENT_KIND_FIRMWARE: + case AS_COMPONENT_KIND_DRIVER: + case AS_COMPONENT_KIND_INPUT_METHOD: + case AS_COMPONENT_KIND_LOCALIZATION: + case AS_COMPONENT_KIND_RUNTIME: + allow_fallback = FALSE; + break; + default: + allow_fallback = TRUE; + break; + } + + /* reset screenshots */ + gs_widget_remove_all (self->carousel, (GsRemoveFunc) adw_carousel_remove); + + for (guint i = 0; i < screenshots->len && !g_cancellable_is_cancelled (cancellable); i++) { + AsScreenshot *ss = g_ptr_array_index (screenshots, i); + GtkWidget *ssimg = gs_screenshot_image_new (self->session); + gtk_widget_set_can_focus (gtk_widget_get_first_child (ssimg), FALSE); + gs_screenshot_image_set_screenshot (GS_SCREENSHOT_IMAGE (ssimg), ss); + gs_screenshot_image_set_size (GS_SCREENSHOT_IMAGE (ssimg), + GS_IMAGE_NORMAL_WIDTH, + GS_IMAGE_NORMAL_HEIGHT); + gtk_widget_add_css_class (ssimg, "screenshot-image-main"); + gs_screenshot_image_load_async (GS_SCREENSHOT_IMAGE (ssimg), cancellable); + + /* when we're offline, the load will be immediate, so we + * can check if it succeeded, and just skip it and its + * thumbnails otherwise */ + if (!is_online && + !gs_screenshot_image_is_showing (GS_SCREENSHOT_IMAGE (ssimg))) { + g_object_ref_sink (ssimg); + g_object_unref (ssimg); + continue; + } + + g_signal_connect_object (ssimg, "clicked", + G_CALLBACK (gs_screenshot_carousel_img_clicked_cb), self, 0); + + adw_carousel_append (ADW_CAROUSEL (self->carousel), ssimg); + gtk_widget_set_visible (ssimg, TRUE); + gs_screenshot_image_set_description (GS_SCREENSHOT_IMAGE (ssimg), + as_screenshot_get_caption (ss)); + ++num_screenshots_loaded; + } + + _set_state (self, num_screenshots_loaded, allow_fallback, is_online); +} + +/** + * gs_screenshot_carousel_get_has_screenshots: + * @self: a #GsScreenshotCarousel + * + * Get whether the carousel contains any screenshots. + * + * Returns: %TRUE if there are screenshots, %FALSE otherwise + * + * Since: 41 + */ +gboolean +gs_screenshot_carousel_get_has_screenshots (GsScreenshotCarousel *self) +{ + g_return_val_if_fail (GS_IS_SCREENSHOT_CAROUSEL (self), FALSE); + + return self->has_screenshots; +} + +static void +_carousel_navigate (AdwCarousel *carousel, AdwNavigationDirection direction) +{ + g_autoptr (GList) children = NULL; + GtkWidget *child; + gdouble position; + guint n_children; + + n_children = 0; + for (child = gtk_widget_get_first_child (GTK_WIDGET (carousel)); + child != NULL; + child = gtk_widget_get_next_sibling (child)) { + children = g_list_prepend (children, child); + n_children++; + } + children = g_list_reverse (children); + + position = adw_carousel_get_position (carousel); + position += (direction == ADW_NAVIGATION_DIRECTION_BACK) ? -1 : 1; + /* Round the position to the closest integer in the valid range. */ + position = round (position); + position = MIN (position, n_children - 1); + position = MAX (0, position); + + child = g_list_nth_data (children, position); + if (child) + adw_carousel_scroll_to (carousel, child, TRUE); +} + +static void +gs_screenshot_carousel_update_buttons (GsScreenshotCarousel *self) +{ + gdouble position = adw_carousel_get_position (ADW_CAROUSEL (self->carousel)); + guint n_pages = adw_carousel_get_n_pages (ADW_CAROUSEL (self->carousel)); + gtk_revealer_set_reveal_child (GTK_REVEALER (self->button_previous_revealer), position >= 0.5); + gtk_revealer_set_reveal_child (GTK_REVEALER (self->button_next_revealer), position < n_pages - 1.5); +} + +static void +gs_screenshot_carousel_notify_n_pages_cb (GsScreenshotCarousel *self) +{ + gs_screenshot_carousel_update_buttons (self); +} + +static void +gs_screenshot_carousel_notify_position_cb (GsScreenshotCarousel *self) +{ + gs_screenshot_carousel_update_buttons (self); +} + +static void +gs_screenshot_carousel_button_previous_clicked_cb (GsScreenshotCarousel *self) +{ + _carousel_navigate (ADW_CAROUSEL (self->carousel), + ADW_NAVIGATION_DIRECTION_BACK); +} + +static void +gs_screenshot_carousel_button_next_clicked_cb (GsScreenshotCarousel *self) +{ + _carousel_navigate (ADW_CAROUSEL (self->carousel), + ADW_NAVIGATION_DIRECTION_FORWARD); +} + +static void +gs_screenshot_carousel_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsScreenshotCarousel *self = GS_SCREENSHOT_CAROUSEL (object); + + switch ((GsScreenshotCarouselProperty) prop_id) { + case PROP_HAS_SCREENSHOTS: + g_value_set_boolean (value, self->has_screenshots); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_screenshot_carousel_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + switch ((GsScreenshotCarouselProperty) prop_id) { + case PROP_HAS_SCREENSHOTS: + /* Read only */ + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_screenshot_carousel_dispose (GObject *object) +{ + GsScreenshotCarousel *self = GS_SCREENSHOT_CAROUSEL (object); + + gs_widget_remove_all (GTK_WIDGET (self), NULL); + + g_clear_object (&self->session); + + G_OBJECT_CLASS (gs_screenshot_carousel_parent_class)->dispose (object); +} + +static void +gs_screenshot_carousel_class_init (GsScreenshotCarouselClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_screenshot_carousel_dispose; + object_class->get_property = gs_screenshot_carousel_get_property; + object_class->set_property = gs_screenshot_carousel_set_property; + + /** + * GsScreenshotCarousel:has-screenshots: + * + * Whether the carousel contains any screenshots. + * + * Since: 41 + */ + obj_props[PROP_HAS_SCREENSHOTS] = + g_param_spec_boolean ("has-screenshots", NULL, NULL, + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-screenshot-carousel.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsScreenshotCarousel, button_next); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotCarousel, button_next_revealer); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotCarousel, button_previous); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotCarousel, button_previous_revealer); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotCarousel, carousel); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotCarousel, carousel_indicator); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotCarousel, stack); + + gtk_widget_class_bind_template_callback (widget_class, gs_screenshot_carousel_notify_n_pages_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_screenshot_carousel_notify_position_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_screenshot_carousel_button_previous_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_screenshot_carousel_button_next_clicked_cb); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); + gtk_widget_class_set_css_name (widget_class, "screenshot-carousel"); +} + +static void +gs_screenshot_carousel_init (GsScreenshotCarousel *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + /* Disable scrolling through the carousel, as it’s typically used + * in app pages which are themselves scrollable. */ + adw_carousel_set_allow_scroll_wheel (ADW_CAROUSEL (self->carousel), FALSE); + + /* setup networking */ + self->session = gs_build_soup_session (); +} + +/** + * gs_screenshot_carousel_new: + * + * Create a new #GsScreenshotCarousel. + * + * Returns: (transfer full): a new #GsScreenshotCarousel + * + * Since: 41 + */ +GsScreenshotCarousel * +gs_screenshot_carousel_new (void) +{ + return GS_SCREENSHOT_CAROUSEL (g_object_new (GS_TYPE_SCREENSHOT_CAROUSEL, NULL)); +} diff --git a/src/gs-screenshot-carousel.h b/src/gs-screenshot-carousel.h new file mode 100644 index 0000000..d12758d --- /dev/null +++ b/src/gs-screenshot-carousel.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Adrien Plazas + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include "gs-app.h" + +G_BEGIN_DECLS + +#define GS_TYPE_SCREENSHOT_CAROUSEL (gs_screenshot_carousel_get_type ()) + +G_DECLARE_FINAL_TYPE (GsScreenshotCarousel, gs_screenshot_carousel, GS, SCREENSHOT_CAROUSEL, GtkWidget) + +GsScreenshotCarousel *gs_screenshot_carousel_new (void); +void gs_screenshot_carousel_load_screenshots (GsScreenshotCarousel *self, + GsApp *app, + gboolean is_online, + GCancellable *cancellable); +gboolean gs_screenshot_carousel_get_has_screenshots (GsScreenshotCarousel *self); + +G_END_DECLS diff --git a/src/gs-screenshot-carousel.ui b/src/gs-screenshot-carousel.ui new file mode 100644 index 0000000..4e5cb2b --- /dev/null +++ b/src/gs-screenshot-carousel.ui @@ -0,0 +1,146 @@ + + + + + + diff --git a/src/gs-screenshot-image.c b/src/gs-screenshot-image.c new file mode 100644 index 0000000..a8278f3 --- /dev/null +++ b/src/gs-screenshot-image.c @@ -0,0 +1,902 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-screenshot-image.h" +#include "gs-common.h" + +#define SPINNER_TIMEOUT_SECS 2 + +struct _GsScreenshotImage +{ + GtkWidget parent_instance; + + AsScreenshot *screenshot; + GtkWidget *spinner; + GtkWidget *stack; + GtkWidget *box_error; + GtkWidget *image1; + GtkWidget *image2; + GtkWidget *video; + GtkWidget *label_error; + GSettings *settings; + SoupSession *session; + SoupMessage *message; + GCancellable *cancellable; + gchar *filename; + const gchar *current_image; + guint width; + guint height; + guint scale; + guint load_timeout_id; + gboolean showing_image; +}; + +G_DEFINE_TYPE (GsScreenshotImage, gs_screenshot_image, GTK_TYPE_WIDGET) + +enum { + SIGNAL_CLICKED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +static void +gs_screenshot_image_clicked_cb (GtkGestureClick *gesture, + gint n_press, + gdouble x, + gdouble y, + gpointer user_data) +{ + GsScreenshotImage *self = user_data; + if (n_press == 1) + g_signal_emit (self, signals[SIGNAL_CLICKED], 0); +} + +AsScreenshot * +gs_screenshot_image_get_screenshot (GsScreenshotImage *ssimg) +{ + g_return_val_if_fail (GS_IS_SCREENSHOT_IMAGE (ssimg), NULL); + return ssimg->screenshot; +} + +static void +gs_screenshot_image_start_spinner (GsScreenshotImage *ssimg) +{ + gtk_widget_set_visible (ssimg->spinner, TRUE); +} + +static void +gs_screenshot_image_stop_spinner (GsScreenshotImage *ssimg) +{ + gtk_widget_set_visible (ssimg->spinner, FALSE); +} + +static void +gs_screenshot_image_set_error (GsScreenshotImage *ssimg, const gchar *message) +{ + gint width, height; + + gtk_stack_set_visible_child_name (GTK_STACK (ssimg->stack), "error"); + gtk_label_set_label (GTK_LABEL (ssimg->label_error), message); + gtk_widget_get_size_request (ssimg->stack, &width, &height); + gtk_widget_set_visible (ssimg->label_error, (width >= 200)); + ssimg->showing_image = FALSE; + gs_screenshot_image_stop_spinner (ssimg); +} + +static void +as_screenshot_show_image (GsScreenshotImage *ssimg) +{ + if (as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_VIDEO) { + gtk_video_set_filename (GTK_VIDEO (ssimg->video), ssimg->filename); + ssimg->current_image = "video"; + } else { + g_autoptr(GdkPixbuf) pixbuf = NULL; + g_autoptr(GdkTexture) texture = NULL; + + /* no need to composite */ + if (ssimg->width == G_MAXUINT || ssimg->height == G_MAXUINT) { + pixbuf = gdk_pixbuf_new_from_file (ssimg->filename, NULL); + } else { + /* this is always going to have alpha */ + pixbuf = gdk_pixbuf_new_from_file_at_scale (ssimg->filename, + (gint) (ssimg->width * ssimg->scale), + (gint) (ssimg->height * ssimg->scale), + FALSE, NULL); + } + + if (pixbuf != NULL) + texture = gdk_texture_new_for_pixbuf (pixbuf); + + /* show icon */ + if (g_strcmp0 (ssimg->current_image, "image1") == 0) { + if (texture != NULL) + gtk_picture_set_paintable (GTK_PICTURE (ssimg->image2), GDK_PAINTABLE (texture)); + ssimg->current_image = "image2"; + } else { + if (texture != NULL) + gtk_picture_set_paintable (GTK_PICTURE (ssimg->image1), GDK_PAINTABLE (texture)); + ssimg->current_image = "image1"; + } + } + + gtk_stack_set_visible_child_name (GTK_STACK (ssimg->stack), ssimg->current_image); + + gtk_widget_set_visible (GTK_WIDGET (ssimg), TRUE); + ssimg->showing_image = TRUE; + + gs_screenshot_image_stop_spinner (ssimg); +} + +static GdkPixbuf * +gs_pixbuf_resample (GdkPixbuf *original, + guint width, + guint height, + gboolean blurred) +{ + g_autoptr(GdkPixbuf) pixbuf = NULL; + guint tmp_height; + guint tmp_width; + guint pixbuf_height; + guint pixbuf_width; + g_autoptr(GdkPixbuf) pixbuf_tmp = NULL; + + /* never set */ + if (original == NULL) + return NULL; + + /* 0 means 'default' */ + if (width == 0) + width = (guint) gdk_pixbuf_get_width (original); + if (height == 0) + height = (guint) gdk_pixbuf_get_height (original); + + /* don't do anything to an image with the correct size */ + pixbuf_width = (guint) gdk_pixbuf_get_width (original); + pixbuf_height = (guint) gdk_pixbuf_get_height (original); + if (width == pixbuf_width && height == pixbuf_height) + return g_object_ref (original); + + /* is the aspect ratio of the source perfectly 16:9 */ + if ((pixbuf_width / 16) * 9 == pixbuf_height) { + pixbuf = gdk_pixbuf_scale_simple (original, + (gint) width, (gint) height, + GDK_INTERP_HYPER); + if (blurred) + gs_utils_pixbuf_blur (pixbuf, 5, 3); + return g_steal_pointer (&pixbuf); + } + + /* create new 16:9 pixbuf with alpha padding */ + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + TRUE, 8, + (gint) width, + (gint) height); + gdk_pixbuf_fill (pixbuf, 0x00000000); + /* check the ratio to see which property needs to be fitted and which needs + * to be reduced */ + if (pixbuf_width * 9 > pixbuf_height * 16) { + tmp_width = width; + tmp_height = width * pixbuf_height / pixbuf_width; + } else { + tmp_width = height * pixbuf_width / pixbuf_height; + tmp_height = height; + } + pixbuf_tmp = gdk_pixbuf_scale_simple (original, + (gint) tmp_width, + (gint) tmp_height, + GDK_INTERP_HYPER); + if (blurred) + gs_utils_pixbuf_blur (pixbuf_tmp, 5, 3); + gdk_pixbuf_copy_area (pixbuf_tmp, + 0, 0, /* of src */ + (gint) tmp_width, + (gint) tmp_height, + pixbuf, + (gint) (width - tmp_width) / 2, + (gint) (height - tmp_height) / 2); + return g_steal_pointer (&pixbuf); +} + +static gboolean +gs_pixbuf_save_filename (GdkPixbuf *pixbuf, + const gchar *filename, + guint width, + guint height, + GError **error) +{ + g_autoptr(GdkPixbuf) pb = NULL; + + /* resample & save pixbuf */ + pb = gs_pixbuf_resample (pixbuf, width, height, FALSE); + return gdk_pixbuf_save (pb, + filename, + "png", + error, + NULL); +} + +static void +gs_screenshot_image_show_blurred (GsScreenshotImage *ssimg, + const gchar *filename_thumb) +{ + g_autoptr(GdkPixbuf) pb_src = NULL; + g_autoptr(GdkPixbuf) pb = NULL; + g_autoptr(GdkTexture) texture = NULL; + + pb_src = gdk_pixbuf_new_from_file (filename_thumb, NULL); + if (pb_src == NULL) + return; + pb = gs_pixbuf_resample (pb_src, + ssimg->width * ssimg->scale, + ssimg->height * ssimg->scale, + TRUE /* blurred */); + if (pb == NULL) + return; + + texture = gdk_texture_new_for_pixbuf (pb); + if (texture == NULL) + return; + + if (g_strcmp0 (ssimg->current_image, "video") == 0) { + ssimg->current_image = "image1"; + gtk_stack_set_visible_child_name (GTK_STACK (ssimg->stack), ssimg->current_image); + } + + if (g_strcmp0 (ssimg->current_image, "image1") == 0) { + gtk_picture_set_paintable (GTK_PICTURE (ssimg->image1), GDK_PAINTABLE (texture)); + } else { + gtk_picture_set_paintable (GTK_PICTURE (ssimg->image2), GDK_PAINTABLE (texture)); + } +} + +static gboolean +gs_screenshot_image_save_downloaded_img (GsScreenshotImage *ssimg, + GdkPixbuf *pixbuf, + GError **error) +{ + gboolean ret; + const GPtrArray *images; + g_autoptr(GError) error_local = NULL; + g_autofree char *filename = NULL; + g_autofree char *size_dir = NULL; + g_autofree char *cache_kind = NULL; + g_autofree char *basename = NULL; + guint width = ssimg->width; + guint height = ssimg->height; + + ret = gs_pixbuf_save_filename (pixbuf, ssimg->filename, + ssimg->width * ssimg->scale, + ssimg->height * ssimg->scale, + error); + + if (!ret) + return FALSE; + + if (ssimg->screenshot == NULL) + return TRUE; + + images = as_screenshot_get_images (ssimg->screenshot); + if (images->len > 1) + return TRUE; + + if (width == GS_IMAGE_THUMBNAIL_WIDTH && + height == GS_IMAGE_THUMBNAIL_HEIGHT) { + width = GS_IMAGE_NORMAL_WIDTH; + height = GS_IMAGE_NORMAL_HEIGHT; + } else { + width = GS_IMAGE_THUMBNAIL_WIDTH; + height = GS_IMAGE_THUMBNAIL_HEIGHT; + } + + width *= ssimg->scale; + height *= ssimg->scale; + basename = g_path_get_basename (ssimg->filename); + size_dir = g_strdup_printf ("%ux%u", width, height); + cache_kind = g_build_filename ("screenshots", size_dir, NULL); + filename = gs_utils_get_cache_filename (cache_kind, basename, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + &error_local); + + if (filename == NULL) { + /* if we cannot get a cache filename, warn about that but do not + * set a user's visible error because this is a complementary + * operation */ + g_warning ("Failed to get cache filename for counterpart " + "screenshot '%s' in folder '%s': %s", basename, + cache_kind, error_local->message); + return TRUE; + } + + ret = gs_pixbuf_save_filename (pixbuf, filename, + width, height, + &error_local); + + if (!ret) { + /* if we cannot save this screenshot, warn about that but do not + * set a user's visible error because this is a complementary + * operation */ + g_warning ("Failed to save screenshot '%s': %s", filename, + error_local->message); + } + + return TRUE; +} + +static void +gs_screenshot_image_complete_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsScreenshotImage) ssimg = GS_SCREENSHOT_IMAGE (user_data); + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GdkPixbuf) pixbuf = NULL; + g_autoptr(GInputStream) stream = NULL; + guint status_code; + g_autoptr(GBytes) bytes = NULL; + g_autofree gchar *uri = NULL; + SoupMessage *msg; + + msg = soup_session_get_async_result_message (SOUP_SESSION (source_object), result); + uri = g_uri_to_string (soup_message_get_uri (msg)); + + bytes = soup_session_send_and_read_finish (SOUP_SESSION (source_object), result, &error); + if (bytes == NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_warning ("Failed to download screenshot '%s': %s", uri, error->message); + /* Reset the width request, thus the image shrinks when the window width is small */ + gtk_widget_set_size_request (ssimg->stack, -1, (gint) ssimg->height); + gs_screenshot_image_stop_spinner (ssimg); + gs_screenshot_image_set_error (ssimg, _("Screenshot not found")); + } + return; + } + + status_code = soup_message_get_status (msg); + if (ssimg->load_timeout_id) { + g_source_remove (ssimg->load_timeout_id); + ssimg->load_timeout_id = 0; + } + + /* return immediately if the message was cancelled or if we're in destruction */ + if (ssimg->session == NULL) + return; + + /* Reset the width request, thus the image shrinks when the window width is small */ + gtk_widget_set_size_request (ssimg->stack, -1, (gint) ssimg->height); + + if (status_code == SOUP_STATUS_NOT_MODIFIED) { + g_debug ("screenshot has not been modified"); + as_screenshot_show_image (ssimg); + gs_screenshot_image_stop_spinner (ssimg); + return; + } + if (status_code != SOUP_STATUS_OK) { + /* Ignore failures due to being offline */ + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_HOST_UNREACHABLE) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NETWORK_UNREACHABLE)) { + const gchar *reason_phrase; + reason_phrase = soup_message_get_reason_phrase (msg); + g_warning ("Screenshot download '%s' failed with " + "status code '%u': %s", uri, status_code, + reason_phrase); + } + gs_screenshot_image_stop_spinner (ssimg); + /* if we're already showing an image, then don't set the error + * as having an image (even if outdated) is better */ + if (ssimg->showing_image) + return; + /* TRANSLATORS: this is when we try to download a screenshot and + * we get back 404 */ + gs_screenshot_image_set_error (ssimg, _("Screenshot not found")); + return; + } + + stream = g_memory_input_stream_new_from_bytes (bytes); + + /* load the image */ + pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, NULL); + if (pixbuf == NULL) { + /* TRANSLATORS: possibly image file corrupt or not an image */ + gs_screenshot_image_set_error (ssimg, _("Failed to load image")); + return; + } + + /* is image size destination size unknown or exactly the correct size */ + if (ssimg->width == G_MAXUINT || ssimg->height == G_MAXUINT || + (ssimg->width * ssimg->scale == (guint) gdk_pixbuf_get_width (pixbuf) && + ssimg->height * ssimg->scale == (guint) gdk_pixbuf_get_height (pixbuf))) { + ret = gs_pixbuf_save_filename (pixbuf, ssimg->filename, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + &error); + if (!ret) { + gs_screenshot_image_set_error (ssimg, error->message); + return; + } + } else if (!gs_screenshot_image_save_downloaded_img (ssimg, pixbuf, + &error)) { + gs_screenshot_image_set_error (ssimg, error->message); + return; + } + + /* got image, so show */ + as_screenshot_show_image (ssimg); +} + +void +gs_screenshot_image_set_screenshot (GsScreenshotImage *ssimg, + AsScreenshot *screenshot) +{ + g_return_if_fail (GS_IS_SCREENSHOT_IMAGE (ssimg)); + g_return_if_fail (AS_IS_SCREENSHOT (screenshot)); + + if (ssimg->screenshot == screenshot) + return; + if (ssimg->screenshot) + g_object_unref (ssimg->screenshot); + ssimg->screenshot = g_object_ref (screenshot); + + /* we reset this flag here too because it referred to the previous + * screenshot, and thus avoids potentially assuming that the new + * screenshot is shown when it is the previous one instead */ + ssimg->showing_image = FALSE; +} + +void +gs_screenshot_image_set_size (GsScreenshotImage *ssimg, + guint width, guint height) +{ + g_return_if_fail (GS_IS_SCREENSHOT_IMAGE (ssimg)); + g_return_if_fail (width != 0); + g_return_if_fail (height != 0); + + ssimg->width = width; + ssimg->height = height; + /* Reset the width request, thus the image shrinks when the window width is small */ + gtk_widget_set_size_request (ssimg->stack, -1, (gint) height); +} + +static gchar * +gs_screenshot_get_cachefn_for_url (const gchar *url) +{ + g_autofree gchar *basename = NULL; + g_autofree gchar *checksum = NULL; + checksum = g_compute_checksum_for_string (G_CHECKSUM_SHA256, url, -1); + basename = g_path_get_basename (url); + return g_strdup_printf ("%s-%s", checksum, basename); +} + +static void +gs_screenshot_soup_msg_set_modified_request (SoupMessage *msg, GFile *file) +{ +#ifndef GLIB_VERSION_2_62 + GTimeVal time_val; +#endif + g_autoptr(GDateTime) date_time = NULL; + g_autoptr(GFileInfo) info = NULL; + g_autofree gchar *mod_date = NULL; + + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_TIME_MODIFIED, + G_FILE_QUERY_INFO_NONE, + NULL, + NULL); + if (info == NULL) + return; +#ifdef GLIB_VERSION_2_62 + date_time = g_file_info_get_modification_date_time (info); +#else + g_file_info_get_modification_time (info, &time_val); + date_time = g_date_time_new_from_timeval_local (&time_val); +#endif + mod_date = g_date_time_format (date_time, "%a, %d %b %Y %H:%M:%S %Z"); + soup_message_headers_append (soup_message_get_request_headers (msg), + "If-Modified-Since", + mod_date); +} + +static gboolean +gs_screenshot_show_spinner_cb (gpointer user_data) +{ + GsScreenshotImage *ssimg = user_data; + + ssimg->load_timeout_id = 0; + gs_screenshot_image_start_spinner (ssimg); + + return FALSE; +} + +static const gchar * +gs_screenshot_image_get_url (GsScreenshotImage *ssimg) +{ + const gchar *url = NULL; + + /* load an image according to the scale factor */ + ssimg->scale = (guint) gtk_widget_get_scale_factor (GTK_WIDGET (ssimg)); + + if (as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_VIDEO) { + GPtrArray *videos; + AsVideo *best_video = NULL; + gint64 best_size = G_MAXINT64; + gint64 wh = (gint64) ssimg->width * ssimg->scale * ssimg->height * ssimg->scale; + + videos = as_screenshot_get_videos (ssimg->screenshot); + for (guint i = 0; videos != NULL && i < videos->len; i++) { + AsVideo *adept = g_ptr_array_index (videos, i); + gint64 tmp; + + tmp = ABS (wh - (gint64) (as_video_get_width (adept) * as_video_get_height (adept))); + if (tmp < best_size) { + best_size = tmp; + best_video = adept; + if (!tmp) + break; + } + } + + if (best_video) + url = as_video_get_url (best_video); + } else if (as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_IMAGE) { + AsImage *im; + +#if AS_CHECK_VERSION(1, 0, 0) + im = as_screenshot_get_image (ssimg->screenshot, + ssimg->width, + ssimg->height, + ssimg->scale); +#else + im = as_screenshot_get_image (ssimg->screenshot, + ssimg->width * ssimg->scale, + ssimg->height * ssimg->scale); +#endif + + /* if we've failed to load a HiDPI image, fallback to LoDPI */ + if (im == NULL && ssimg->scale > 1) { + ssimg->scale = 1; +#if AS_CHECK_VERSION(1, 0, 0) + im = as_screenshot_get_image (ssimg->screenshot, + ssimg->width, + ssimg->height, + 1); +#else + im = as_screenshot_get_image (ssimg->screenshot, + ssimg->width, + ssimg->height); +#endif + } + + if (im) + url = as_image_get_url (im); + } + + return url; +} + +static void +gs_screenshot_video_downloaded_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GsScreenshotImage) ssimg = user_data; + g_autoptr(GError) error = NULL; + + if (gs_download_file_finish (ssimg->session, result, &error) || + g_error_matches (error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) { + gs_screenshot_image_stop_spinner (ssimg); + as_screenshot_show_image (ssimg); + + g_clear_object (&ssimg->cancellable); + } else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("Failed to download screenshot video: %s", error->message); + /* Reset the width request, thus the image shrinks when the window width is small */ + gtk_widget_set_size_request (ssimg->stack, -1, (gint) ssimg->height); + gs_screenshot_image_stop_spinner (ssimg); + gs_screenshot_image_set_error (ssimg, _("Screenshot not found")); + } +} + +void +gs_screenshot_image_load_async (GsScreenshotImage *ssimg, + GCancellable *cancellable) +{ + const gchar *url; + g_autofree gchar *basename = NULL; + g_autofree gchar *cache_kind = NULL; + g_autofree gchar *cachefn_thumb = NULL; + g_autofree gchar *sizedir = NULL; + g_autoptr(GUri) base_uri = NULL; + + g_return_if_fail (GS_IS_SCREENSHOT_IMAGE (ssimg)); + + g_return_if_fail (AS_IS_SCREENSHOT (ssimg->screenshot)); + g_return_if_fail (ssimg->width != 0); + g_return_if_fail (ssimg->height != 0); + + /* Reset the width request, thus the image shrinks when the window width is small */ + gtk_widget_set_size_request (ssimg->stack, -1, (gint) ssimg->height); + + url = gs_screenshot_image_get_url (ssimg); + if (url == NULL) { + /* TRANSLATORS: this is when we request a screenshot size that + * the generator did not create or the parser did not add */ + gs_screenshot_image_set_error (ssimg, _("Screenshot size not found")); + return; + } + + /* check if the URL points to a local file */ + if (g_str_has_prefix (url, "file://")) { + g_free (ssimg->filename); + ssimg->filename = g_strdup (url + 7); + if (g_file_test (ssimg->filename, G_FILE_TEST_EXISTS)) { + as_screenshot_show_image (ssimg); + return; + } + } + + basename = gs_screenshot_get_cachefn_for_url (url); + if (ssimg->width == G_MAXUINT || ssimg->height == G_MAXUINT) { + sizedir = g_strdup ("unknown"); + } else { + sizedir = g_strdup_printf ("%ux%u", ssimg->width * ssimg->scale, ssimg->height * ssimg->scale); + } + cache_kind = g_build_filename ("screenshots", sizedir, NULL); + g_free (ssimg->filename); + ssimg->filename = gs_utils_get_cache_filename (cache_kind, + basename, + GS_UTILS_CACHE_FLAG_NONE, + NULL); + g_assert (ssimg->filename != NULL); + + /* does local file already exist and has recently been downloaded */ + if (g_file_test (ssimg->filename, G_FILE_TEST_EXISTS)) { + guint64 age_max; + g_autoptr(GFile) file = NULL; + + /* show the image we have in cache while we're checking for the + * new screenshot (which probably won't have changed) */ + as_screenshot_show_image (ssimg); + + /* verify the cache age against the maximum allowed */ + age_max = g_settings_get_uint (ssimg->settings, + "screenshot-cache-age-maximum"); + file = g_file_new_for_path (ssimg->filename); + /* image new enough, not re-requesting from server */ + if (age_max > 0 && gs_utils_get_file_age (file) < age_max) + return; + } + + /* if we're not showing a full-size image, we try loading a blurred + * smaller version of it straight away */ + if (!ssimg->showing_image && + as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_IMAGE && + ssimg->width > GS_IMAGE_THUMBNAIL_WIDTH && + ssimg->height > GS_IMAGE_THUMBNAIL_HEIGHT) { + const gchar *url_thumb; + g_autofree gchar *basename_thumb = NULL; + g_autofree gchar *cache_kind_thumb = NULL; + AsImage *im; +#if AS_CHECK_VERSION(1, 0, 0) + im = as_screenshot_get_image (ssimg->screenshot, + GS_IMAGE_THUMBNAIL_WIDTH, + GS_IMAGE_THUMBNAIL_HEIGHT, + ssimg->scale); +#else + im = as_screenshot_get_image (ssimg->screenshot, + GS_IMAGE_THUMBNAIL_WIDTH * ssimg->scale, + GS_IMAGE_THUMBNAIL_HEIGHT * ssimg->scale); +#endif + url_thumb = as_image_get_url (im); + basename_thumb = gs_screenshot_get_cachefn_for_url (url_thumb); + cache_kind_thumb = g_build_filename ("screenshots", "112x63", NULL); + cachefn_thumb = gs_utils_get_cache_filename (cache_kind_thumb, + basename_thumb, + GS_UTILS_CACHE_FLAG_NONE, + NULL); + g_assert (cachefn_thumb != NULL); + if (g_file_test (cachefn_thumb, G_FILE_TEST_EXISTS)) + gs_screenshot_image_show_blurred (ssimg, cachefn_thumb); + } + + /* re-request the cache filename, which might be different as it needs + * to be writable this time */ + g_free (ssimg->filename); + ssimg->filename = gs_utils_get_cache_filename (cache_kind, + basename, + GS_UTILS_CACHE_FLAG_WRITEABLE | + GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY, + NULL); + if (ssimg->filename == NULL) { + /* TRANSLATORS: this is when we try create the cache directory + * but we were out of space or permission was denied */ + gs_screenshot_image_set_error (ssimg, _("Could not create cache")); + return; + } + + /* download file */ + g_debug ("downloading %s to %s", url, ssimg->filename); + base_uri = g_uri_parse (url, SOUP_HTTP_URI_FLAGS, NULL); + if (base_uri == NULL || + (g_strcmp0 (g_uri_get_scheme (base_uri), "http") != 0 && + g_strcmp0 (g_uri_get_scheme (base_uri), "https") != 0) || + g_uri_get_host (base_uri) == NULL || + g_uri_get_path (base_uri) == NULL) { + /* TRANSLATORS: this is when we try to download a screenshot + * that was not a valid URL */ + gs_screenshot_image_set_error (ssimg, _("Screenshot not valid")); + return; + } + + if (ssimg->load_timeout_id) { + g_source_remove (ssimg->load_timeout_id); + ssimg->load_timeout_id = 0; + } + + /* cancel any previous messages */ + if (ssimg->cancellable != NULL) { + g_cancellable_cancel (ssimg->cancellable); + g_clear_object (&ssimg->cancellable); + } + + if (ssimg->message != NULL) { + g_clear_object (&ssimg->message); + } + + if (as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_VIDEO) { + g_autofree gchar *uri_str = g_uri_to_string (base_uri); + g_autoptr(GFile) output_file = NULL; + + ssimg->cancellable = g_cancellable_new (); + output_file = g_file_new_for_path (ssimg->filename); + + /* Make sure the spinner takes approximately the size the screenshot will use */ + gtk_widget_set_size_request (ssimg->stack, (gint) ssimg->width, (gint) ssimg->height); + + gs_download_file_async (ssimg->session, uri_str, output_file, G_PRIORITY_DEFAULT, NULL, NULL, + ssimg->cancellable, gs_screenshot_video_downloaded_cb, g_object_ref (ssimg)); + + return; + } + + ssimg->message = soup_message_new_from_uri (SOUP_METHOD_GET, base_uri); + if (ssimg->message == NULL) { + /* TRANSLATORS: this is when networking is not available */ + gs_screenshot_image_set_error (ssimg, _("Screenshot not available")); + return; + } + + /* not all servers support If-Modified-Since, but worst case we just + * re-download the entire file again every 30 days */ + if (g_file_test (ssimg->filename, G_FILE_TEST_EXISTS)) { + g_autoptr(GFile) file = g_file_new_for_path (ssimg->filename); + gs_screenshot_soup_msg_set_modified_request (ssimg->message, file); + } + + ssimg->load_timeout_id = g_timeout_add_seconds (SPINNER_TIMEOUT_SECS, + gs_screenshot_show_spinner_cb, ssimg); + + /* send async */ + ssimg->cancellable = g_cancellable_new (); + soup_session_send_and_read_async (ssimg->session, ssimg->message, G_PRIORITY_DEFAULT, ssimg->cancellable, + gs_screenshot_image_complete_cb, g_object_ref (ssimg)); +} + +gboolean +gs_screenshot_image_is_showing (GsScreenshotImage *ssimg) +{ + return ssimg->showing_image; +} + +void +gs_screenshot_image_set_description (GsScreenshotImage *ssimg, + const gchar *description) +{ + gtk_accessible_update_property (GTK_ACCESSIBLE (ssimg->image1), + GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, description, + -1); + gtk_accessible_update_property (GTK_ACCESSIBLE (ssimg->image2), + GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, description, + -1); +} + +static void +gs_screenshot_image_dispose (GObject *object) +{ + GsScreenshotImage *ssimg = GS_SCREENSHOT_IMAGE (object); + + if (ssimg->load_timeout_id) { + g_source_remove (ssimg->load_timeout_id); + ssimg->load_timeout_id = 0; + } + + if (ssimg->cancellable != NULL) { + g_cancellable_cancel (ssimg->cancellable); + g_clear_object (&ssimg->cancellable); + } + + if (ssimg->message != NULL) { + g_clear_object (&ssimg->message); + } + gs_widget_remove_all (GTK_WIDGET (ssimg), NULL); + g_clear_object (&ssimg->screenshot); + g_clear_object (&ssimg->session); + g_clear_object (&ssimg->settings); + + g_clear_pointer (&ssimg->filename, g_free); + + G_OBJECT_CLASS (gs_screenshot_image_parent_class)->dispose (object); +} + +static void +gs_screenshot_image_init (GsScreenshotImage *ssimg) +{ + GtkGesture *gesture; + + ssimg->settings = g_settings_new ("org.gnome.software"); + ssimg->showing_image = FALSE; + + gtk_widget_init_template (GTK_WIDGET (ssimg)); + + gesture = gtk_gesture_click_new (); + g_signal_connect_object (gesture, "released", + G_CALLBACK (gs_screenshot_image_clicked_cb), ssimg, 0); + gtk_widget_add_controller (GTK_WIDGET (ssimg), GTK_EVENT_CONTROLLER (gesture)); +} + +static void +gs_screenshot_image_class_init (GsScreenshotImageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_screenshot_image_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, + "/org/gnome/Software/gs-screenshot-image.ui"); + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); + gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_IMG); + + gtk_widget_class_bind_template_child (widget_class, GsScreenshotImage, spinner); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotImage, stack); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotImage, image1); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotImage, image2); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotImage, video); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotImage, box_error); + gtk_widget_class_bind_template_child (widget_class, GsScreenshotImage, label_error); + + /** + * GsScreenshotImage::clicked: + * + * Emitted when the screenshot is clicked. + * + * Since: 43 + */ + signals [SIGNAL_CLICKED] = + g_signal_new ("clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +GtkWidget * +gs_screenshot_image_new (SoupSession *session) +{ + GsScreenshotImage *ssimg; + ssimg = g_object_new (GS_TYPE_SCREENSHOT_IMAGE, NULL); + ssimg->session = g_object_ref (session); + return GTK_WIDGET (ssimg); +} diff --git a/src/gs-screenshot-image.h b/src/gs-screenshot-image.h new file mode 100644 index 0000000..6e45f5d --- /dev/null +++ b/src/gs-screenshot-image.h @@ -0,0 +1,45 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_SCREENSHOT_IMAGE (gs_screenshot_image_get_type ()) + +G_DECLARE_FINAL_TYPE (GsScreenshotImage, gs_screenshot_image, GS, SCREENSHOT_IMAGE, GtkWidget) + +#define GS_IMAGE_LARGE_HEIGHT 423 +#define GS_IMAGE_LARGE_WIDTH 752 +#define GS_IMAGE_NORMAL_HEIGHT 351 +#define GS_IMAGE_NORMAL_WIDTH 624 +#define GS_IMAGE_THUMBNAIL_HEIGHT 63 +#define GS_IMAGE_THUMBNAIL_WIDTH 112 + +GtkWidget *gs_screenshot_image_new (SoupSession *session); + +AsScreenshot *gs_screenshot_image_get_screenshot (GsScreenshotImage *ssimg); +void gs_screenshot_image_set_screenshot (GsScreenshotImage *ssimg, + AsScreenshot *screenshot); +void gs_screenshot_image_set_size (GsScreenshotImage *ssimg, + guint width, + guint height); +void gs_screenshot_image_load_async (GsScreenshotImage *ssimg, + GCancellable *cancellable); +gboolean gs_screenshot_image_is_showing (GsScreenshotImage *ssimg); +void gs_screenshot_image_set_description (GsScreenshotImage *ssimg, + const gchar *description); + +G_END_DECLS diff --git a/src/gs-screenshot-image.ui b/src/gs-screenshot-image.ui new file mode 100644 index 0000000..a450d70 --- /dev/null +++ b/src/gs-screenshot-image.ui @@ -0,0 +1,96 @@ + + + + + diff --git a/src/gs-search-page.c b/src/gs-search-page.c new file mode 100644 index 0000000..cd3cb26 --- /dev/null +++ b/src/gs-search-page.c @@ -0,0 +1,593 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-search-page.h" +#include "gs-shell.h" +#include "gs-common.h" +#include "gs-app-row.h" + +#define GS_SEARCH_PAGE_MAX_RESULTS 50 + +struct _GsSearchPage +{ + GsPage parent_instance; + + GsPluginLoader *plugin_loader; + GCancellable *cancellable; + GCancellable *search_cancellable; + GtkSizeGroup *sizegroup_name; + GtkSizeGroup *sizegroup_button_label; + GtkSizeGroup *sizegroup_button_image; + GsShell *shell; + gchar *appid_to_show; + gchar *value; + guint waiting_id; + guint max_results; + guint stamp; + gboolean changed; + + GtkWidget *list_box_search; + GtkWidget *scrolledwindow_search; + GtkWidget *stack_search; +}; + +G_DEFINE_TYPE (GsSearchPage, gs_search_page, GS_TYPE_PAGE) + +typedef enum { + PROP_VADJUSTMENT = 1, +} GsSearchPageProperty; + +static void +gs_search_page_app_row_clicked_cb (GsAppRow *app_row, + GsSearchPage *self) +{ + GsApp *app; + app = gs_app_row_get_app (app_row); + if (gs_app_get_state (app) == GS_APP_STATE_AVAILABLE) + gs_page_install_app (GS_PAGE (self), app, GS_SHELL_INTERACTION_FULL, + self->cancellable); + else if (gs_app_get_state (app) == GS_APP_STATE_INSTALLED) + gs_page_remove_app (GS_PAGE (self), app, self->cancellable); + else if (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE) { + if (gs_app_get_url_missing (app) == NULL) { + gs_page_install_app (GS_PAGE (self), app, + GS_SHELL_INTERACTION_FULL, + self->cancellable); + return; + } + gs_shell_show_uri (self->shell, + gs_app_get_url_missing (app)); + } +} + +static void +gs_search_page_waiting_cancel (GsSearchPage *self) +{ + if (self->waiting_id > 0) + g_source_remove (self->waiting_id); + self->waiting_id = 0; +} + +static void +gs_search_page_app_to_show_created_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GsSearchPage *self = user_data; + g_autoptr(GsApp) app = NULL; + g_autoptr(GError) error = NULL; + + app = gs_plugin_loader_app_create_finish (GS_PLUGIN_LOADER (source_object), result, &error); + if (app != NULL) { + g_return_if_fail (GS_IS_SEARCH_PAGE (self)); + + gs_shell_show_app (self->shell, app); + } +} + +typedef struct { + GsSearchPage *self; + guint stamp; +} GetSearchData; + +static void +gs_search_page_get_search_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + guint i; + g_autofree GetSearchData *search_data = user_data; + GsApp *app; + GsSearchPage *self = search_data->self; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + GtkWidget *app_row; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + /* different stamps means another search had been started before this one finished */ + if (search_data->stamp != self->stamp) + return; + + /* don't do the delayed spinner */ + gs_search_page_waiting_cancel (self); + + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("search cancelled"); + return; + } + g_warning ("failed to get search apps: %s", error->message); + if (self->value && self->value[0]) + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_search), "no-results"); + else + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_search), "no-search"); + return; + } + + /* no results */ + if (gs_app_list_length (list) == 0) { + g_debug ("no search results to show"); + if (self->value && self->value[0]) + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_search), "no-results"); + else + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_search), "no-search"); + return; + } + + /* remove old entries */ + gs_widget_remove_all (self->list_box_search, (GsRemoveFunc) gtk_list_box_remove); + + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_search), "results"); + for (i = 0; i < gs_app_list_length (list); i++) { + app = gs_app_list_index (list, i); + app_row = gs_app_row_new (app); + gs_app_row_set_show_rating (GS_APP_ROW (app_row), TRUE); + g_signal_connect (app_row, "button-clicked", + G_CALLBACK (gs_search_page_app_row_clicked_cb), + self); + gtk_list_box_append (GTK_LIST_BOX (self->list_box_search), app_row); + gs_app_row_set_size_groups (GS_APP_ROW (app_row), + self->sizegroup_name, + self->sizegroup_button_label, + self->sizegroup_button_image); + gtk_widget_set_visible (app_row, TRUE); + } + + /* too many results */ + if (gs_app_list_has_flag (list, GS_APP_LIST_FLAG_IS_TRUNCATED)) { + GtkWidget *w = gtk_label_new (NULL); + g_autofree gchar *str = NULL; + + /* TRANSLATORS: this is when there are too many search results + * to show in in the search page */ + str = g_strdup_printf (ngettext("%u more match", + "%u more matches", + gs_app_list_get_size_peak (list) - gs_app_list_length (list)), + gs_app_list_get_size_peak (list) - gs_app_list_length (list)); + gtk_label_set_label (GTK_LABEL (w), str); + gtk_widget_set_margin_bottom (w, 20); + gtk_widget_set_margin_top (w, 20); + gtk_widget_set_margin_start (w, 20); + gtk_widget_set_margin_end (w, 20); + gtk_widget_add_css_class (w, "dim-label"); + gtk_list_box_append (GTK_LIST_BOX (self->list_box_search), w); + gtk_widget_set_visible (w, TRUE); + } else { + /* reset to default */ + self->max_results = GS_SEARCH_PAGE_MAX_RESULTS; + } + + if (self->appid_to_show != NULL) { + g_autoptr (GsApp) a = NULL; + if (as_utils_data_id_valid (self->appid_to_show)) { + gs_plugin_loader_app_create_async (self->plugin_loader, self->appid_to_show, self->cancellable, + gs_search_page_app_to_show_created_cb, self); + } else { + a = gs_app_new (self->appid_to_show); + } + + if (a) + gs_shell_show_app (self->shell, a); + + g_clear_pointer (&self->appid_to_show, g_free); + } +} + +static gboolean +gs_search_page_waiting_show_cb (gpointer user_data) +{ + GsSearchPage *self = GS_SEARCH_PAGE (user_data); + + /* show spinner */ + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_search), "spinner"); + gs_search_page_waiting_cancel (self); + return FALSE; +} + +static gchar * +gs_search_page_get_app_sort_key (GsApp *app) +{ + GString *key = g_string_sized_new (64); + + /* sort apps before runtimes and extensions */ + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + g_string_append (key, "9:"); + break; + default: + g_string_append (key, "1:"); + break; + } + + /* sort missing codecs before apps */ + switch (gs_app_get_state (app)) { + case GS_APP_STATE_UNAVAILABLE: + g_string_append (key, "9:"); + break; + default: + g_string_append (key, "1:"); + break; + } + + /* sort by the search key */ + g_string_append_printf (key, "%05x:", gs_app_get_match_value (app)); + + /* sort by rating */ + g_string_append_printf (key, "%03i:", gs_app_get_rating (app)); + + /* sort by kudos */ + g_string_append_printf (key, "%03u:", gs_app_get_kudos_percentage (app)); + + return g_string_free (key, FALSE); +} + +static gint +gs_search_page_sort_cb (GsApp *app1, GsApp *app2, gpointer user_data) +{ + g_autofree gchar *key1 = NULL; + g_autofree gchar *key2 = NULL; + key1 = gs_search_page_get_app_sort_key (app1); + key2 = gs_search_page_get_app_sort_key (app2); + return g_strcmp0 (key2, key1); +} + +static void +gs_search_page_load (GsSearchPage *self) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + const gchar *keywords[2] = { NULL, }; + g_autofree GetSearchData *search_data = NULL; + + self->changed = FALSE; + + /* cancel any pending searches */ + g_cancellable_cancel (self->search_cancellable); + g_clear_object (&self->search_cancellable); + self->search_cancellable = g_cancellable_new (); + self->stamp++; + + /* Show the spinner if this is a new search from scratch. But don’t + * immediately show it if we’re already showing some search results, as + * that could result in very briefly flashing the spinner before + * switching to the new results, which is jarring. */ + gs_search_page_waiting_cancel (self); + if (g_strcmp0 (gtk_stack_get_visible_child_name (GTK_STACK (self->stack_search)), "no-search") == 0) + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_search), "spinner"); + else + self->waiting_id = g_timeout_add (250, gs_search_page_waiting_show_cb, self); + + /* search for apps */ + search_data = g_new0 (GetSearchData, 1); + search_data->self = self; + search_data->stamp = self->stamp; + + keywords[0] = self->value; + query = gs_app_query_new ("keywords", keywords, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "max-results", self->max_results, + "sort-func", gs_search_page_sort_cb, + "sort-user-data", self, + "license-type", gs_page_get_query_license_type (GS_PAGE (self)), + "developer-verified-type", gs_page_get_query_developer_verified_type (GS_PAGE (self)), + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->search_cancellable, + gs_search_page_get_search_cb, + g_steal_pointer (&search_data)); +} + +static void +gs_search_page_app_row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + GsSearchPage *self) +{ + GsApp *app; + + /* increase the maximum allowed, and re-request the search */ + if (!GS_IS_APP_ROW (row)) { + self->max_results *= 4; + gs_search_page_load (self); + return; + } + + app = gs_app_row_get_app (GS_APP_ROW (row)); + gs_shell_show_app (self->shell, app); +} + +static void +gs_search_page_reload (GsPage *page) +{ + GsSearchPage *self = GS_SEARCH_PAGE (page); + if (self->value != NULL) + gs_search_page_load (self); +} + +/** + * gs_search_page_set_appid_to_show: + * + * Switch to the specified app id after loading the search results. + **/ +void +gs_search_page_set_appid_to_show (GsSearchPage *self, const gchar *appid) +{ + if (appid == self->appid_to_show || + g_strcmp0 (appid, self->appid_to_show) == 0) + return; + + g_free (self->appid_to_show); + self->appid_to_show = g_strdup (appid); + + self->changed = TRUE; +} + +const gchar * +gs_search_page_get_text (GsSearchPage *self) +{ + return self->value; +} + +void +gs_search_page_set_text (GsSearchPage *self, const gchar *value) +{ + if (value == self->value || + g_strcmp0 (value, self->value) == 0) + return; + + g_free (self->value); + self->value = g_strdup (value); + + /* Load immediately, when the page is active */ + if (self->value && gs_page_is_active (GS_PAGE (self))) + gs_search_page_load (self); + else + self->changed = TRUE; +} + +/** + * gs_search_page_clear: + * @self: a #GsSearchPage + * + * Clear the search page. + * + * This changes the view back to the initial one, clearing any existing search + * results. It cancels any ongoing searches. + * + * Since: 48 + */ +void +gs_search_page_clear (GsSearchPage *self) +{ + g_return_if_fail (GS_IS_SEARCH_PAGE (self)); + + g_cancellable_cancel (self->search_cancellable); + g_clear_object (&self->search_cancellable); + g_clear_pointer (&self->value, g_free); + + /* Reset the UI so we don’t show a glimpse of old search results when + * next switching to the search page. */ + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_search), "no-search"); +} + +static void +gs_search_page_switch_to (GsPage *page) +{ + GsSearchPage *self = GS_SEARCH_PAGE (page); + + if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_SEARCH) { + g_warning ("Called switch_to(search) when in mode %s", + gs_shell_get_mode_string (self->shell)); + return; + } + + if (self->value && self->changed) + gs_search_page_load (self); +} + +static void +gs_search_page_switch_from (GsPage *page) +{ + GsSearchPage *self = GS_SEARCH_PAGE (page); + + g_cancellable_cancel (self->search_cancellable); + g_clear_object (&self->search_cancellable); +} + +static void +gs_search_page_cancel_cb (GCancellable *cancellable, + GsSearchPage *self) +{ + g_cancellable_cancel (self->search_cancellable); +} + +static void +gs_search_page_app_installed (GsPage *page, GsApp *app) +{ + gs_search_page_reload (page); +} + +static void +gs_search_page_app_removed (GsPage *page, GsApp *app) +{ + gs_search_page_reload (page); +} + +static gboolean +gs_search_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsSearchPage *self = GS_SEARCH_PAGE (page); + + g_return_val_if_fail (GS_IS_SEARCH_PAGE (self), TRUE); + + self->plugin_loader = g_object_ref (plugin_loader); + self->cancellable = g_object_ref (cancellable); + self->shell = shell; + + /* connect the cancellables */ + g_cancellable_connect (self->cancellable, + G_CALLBACK (gs_search_page_cancel_cb), + self, NULL); + + /* setup search */ + g_signal_connect (self->list_box_search, "row-activated", + G_CALLBACK (gs_search_page_app_row_activated_cb), self); + return TRUE; +} + +static void +gs_search_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsSearchPage *self = GS_SEARCH_PAGE (object); + + switch ((GsSearchPageProperty) prop_id) { + case PROP_VADJUSTMENT: + g_value_set_object (value, gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_search))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_search_page_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch ((GsSearchPageProperty) prop_id) { + case PROP_VADJUSTMENT: + /* Not supported yet */ + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_search_page_dispose (GObject *object) +{ + GsSearchPage *self = GS_SEARCH_PAGE (object); + + g_clear_object (&self->sizegroup_name); + g_clear_object (&self->sizegroup_button_label); + g_clear_object (&self->sizegroup_button_image); + + g_clear_object (&self->plugin_loader); + g_clear_object (&self->cancellable); + g_clear_object (&self->search_cancellable); + + G_OBJECT_CLASS (gs_search_page_parent_class)->dispose (object); +} + +static void +gs_search_page_finalize (GObject *object) +{ + GsSearchPage *self = GS_SEARCH_PAGE (object); + + g_free (self->appid_to_show); + g_free (self->value); + + G_OBJECT_CLASS (gs_search_page_parent_class)->finalize (object); +} + +static void +gs_search_page_class_init (GsSearchPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPageClass *page_class = GS_PAGE_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_search_page_get_property; + object_class->set_property = gs_search_page_set_property; + object_class->dispose = gs_search_page_dispose; + object_class->finalize = gs_search_page_finalize; + + page_class->app_installed = gs_search_page_app_installed; + page_class->app_removed = gs_search_page_app_removed; + page_class->switch_to = gs_search_page_switch_to; + page_class->switch_from = gs_search_page_switch_from; + page_class->reload = gs_search_page_reload; + page_class->setup = gs_search_page_setup; + + g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment"); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-search-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsSearchPage, list_box_search); + gtk_widget_class_bind_template_child (widget_class, GsSearchPage, scrolledwindow_search); + gtk_widget_class_bind_template_child (widget_class, GsSearchPage, stack_search); +} + +static void +gs_search_page_init (GsSearchPage *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + self->sizegroup_name = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_button_label = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_button_image = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + self->max_results = GS_SEARCH_PAGE_MAX_RESULTS; +} + +GsSearchPage * +gs_search_page_new (void) +{ + GsSearchPage *self; + self = g_object_new (GS_TYPE_SEARCH_PAGE, NULL); + return GS_SEARCH_PAGE (self); +} diff --git a/src/gs-search-page.h b/src/gs-search-page.h new file mode 100644 index 0000000..f7fdd7b --- /dev/null +++ b/src/gs-search-page.h @@ -0,0 +1,28 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_SEARCH_PAGE (gs_search_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsSearchPage, gs_search_page, GS, SEARCH_PAGE, GsPage) + +GsSearchPage *gs_search_page_new (void); +void gs_search_page_set_appid_to_show (GsSearchPage *self, + const gchar *appid); +const gchar *gs_search_page_get_text (GsSearchPage *self); +void gs_search_page_set_text (GsSearchPage *self, + const gchar *value); +void gs_search_page_clear (GsSearchPage *self); + +G_END_DECLS diff --git a/src/gs-search-page.ui b/src/gs-search-page.ui new file mode 100644 index 0000000..162d891 --- /dev/null +++ b/src/gs-search-page.ui @@ -0,0 +1,84 @@ + + + + + + diff --git a/src/gs-self-test.c b/src/gs-self-test.c new file mode 100644 index 0000000..7edee45 --- /dev/null +++ b/src/gs-self-test.c @@ -0,0 +1,52 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gnome-software-private.h" + +#include "gs-css.h" +#include "gs-test.h" + +static void +gs_css_func (void) +{ + const gchar *tmp; + gboolean ret; + g_autoptr(GError) error = NULL; + g_autoptr(GsCss) css = gs_css_new (); + + /* no IDs */ + ret = gs_css_parse (css, "border: 0;", &error); + g_assert_no_error (error); + g_assert (ret); + tmp = gs_css_get_markup_for_id (css, "tile"); + g_assert_cmpstr (tmp, ==, "border: 0;"); + + /* with IDs */ + ret = gs_css_parse (css, "#tile2{\nborder: 0;}\n#name {color: white;\n}", &error); + g_assert_no_error (error); + g_assert (ret); + tmp = gs_css_get_markup_for_id (css, "NotGoingToExist"); + g_assert_cmpstr (tmp, ==, NULL); + tmp = gs_css_get_markup_for_id (css, "tile2"); + g_assert_cmpstr (tmp, ==, "border: 0;"); + tmp = gs_css_get_markup_for_id (css, "name"); + g_assert_cmpstr (tmp, ==, "color: white;"); +} + +int +main (int argc, char **argv) +{ + gs_test_init (&argc, &argv); + + /* tests go here */ + g_test_add_func ("/gnome-software/src/css", gs_css_func); + + return g_test_run (); +} diff --git a/src/gs-shell-search-provider.c b/src/gs-shell-search-provider.c new file mode 100644 index 0000000..55f10e5 --- /dev/null +++ b/src/gs-shell-search-provider.c @@ -0,0 +1,415 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * gs-shell-search-provider.c - Implementation of a GNOME Shell + * search provider + * + * Copyright (C) 2013 Matthias Clasen + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include +#include +#include + +#include "gs-shell-search-provider-generated.h" +#include "gs-shell-search-provider.h" +#include "gs-common.h" + +#define GS_SHELL_SEARCH_PROVIDER_MAX_RESULTS 20 + +typedef struct { + GsShellSearchProvider *provider; + GDBusMethodInvocation *invocation; +} PendingSearch; + +struct _GsShellSearchProvider { + GObject parent; + + GsShellSearchProvider2 *skeleton; + GsPluginLoader *plugin_loader; + GCancellable *cancellable; + + GHashTable *metas_cache; + GsAppList *search_results; +}; + +G_DEFINE_TYPE (GsShellSearchProvider, gs_shell_search_provider, G_TYPE_OBJECT) + +static void +pending_search_free (PendingSearch *search) +{ + g_object_unref (search->invocation); + g_slice_free (PendingSearch, search); +} + +static gint +search_sort_by_kudo_cb (GsApp *app1, GsApp *app2, gpointer user_data) +{ + guint pa, pb; + pa = gs_app_get_kudos_percentage (app1); + pb = gs_app_get_kudos_percentage (app2); + if (pa < pb) + return 1; + else if (pa > pb) + return -1; + return 0; +} + +static void +search_done_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + PendingSearch *search = user_data; + GsShellSearchProvider *self = search->provider; + guint i; + GVariantBuilder builder; + g_autoptr(GsAppList) list = NULL; + + /* cache no longer valid */ + gs_app_list_remove_all (self->search_results); + + list = gs_plugin_loader_job_process_finish (self->plugin_loader, res, NULL); + if (list == NULL) { + g_dbus_method_invocation_return_value (search->invocation, g_variant_new ("(as)", NULL)); + pending_search_free (search); + g_application_release (g_application_get_default ()); + return; + } + + /* sort by kudos, as there is no ratings data by default */ + gs_app_list_sort (list, search_sort_by_kudo_cb, NULL); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); + for (i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + g_variant_builder_add (&builder, "s", gs_app_get_unique_id (app)); + + /* cache this in case we need the app in GetResultMetas */ + gs_app_list_add (self->search_results, app); + } + g_dbus_method_invocation_return_value (search->invocation, g_variant_new ("(as)", &builder)); + + pending_search_free (search); + g_application_release (g_application_get_default ()); +} + +static gchar * +gs_shell_search_provider_get_app_sort_key (GsApp *app) +{ + GString *key = g_string_sized_new (64); + + /* sort available apps before installed ones */ + switch (gs_app_get_state (app)) { + case GS_APP_STATE_AVAILABLE: + g_string_append (key, "9:"); + break; + default: + g_string_append (key, "1:"); + break; + } + + /* sort apps before runtimes and extensions */ + switch (gs_app_get_kind (app)) { + case AS_COMPONENT_KIND_DESKTOP_APP: + g_string_append (key, "9:"); + break; + default: + g_string_append (key, "1:"); + break; + } + + /* sort by the search key */ + g_string_append_printf (key, "%05x:", gs_app_get_match_value (app)); + + /* tie-break with id */ + g_string_append (key, gs_app_get_unique_id (app)); + + return g_string_free (key, FALSE); +} + +static gint +gs_shell_search_provider_sort_cb (GsApp *app1, GsApp *app2, gpointer user_data) +{ + g_autofree gchar *key1 = NULL; + g_autofree gchar *key2 = NULL; + key1 = gs_shell_search_provider_get_app_sort_key (app1); + key2 = gs_shell_search_provider_get_app_sort_key (app2); + return g_strcmp0 (key2, key1); +} + +static void +execute_search (GsShellSearchProvider *self, + GDBusMethodInvocation *invocation, + gchar **terms) +{ + PendingSearch *pending_search; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GSettings) settings = NULL; + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + + /* don't attempt searches for a single character */ + if (g_strv_length (terms) == 1 && + g_utf8_strlen (terms[0], -1) == 1) { + g_dbus_method_invocation_return_value (invocation, g_variant_new ("(as)", NULL)); + return; + } + + pending_search = g_slice_new (PendingSearch); + pending_search->provider = self; + pending_search->invocation = g_object_ref (invocation); + + g_application_hold (g_application_get_default ()); + self->cancellable = g_cancellable_new (); + + settings = g_settings_new ("org.gnome.software"); + + query = gs_app_query_new ("keywords", terms, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME, + "dedupe-flags", GS_APP_LIST_FILTER_FLAG_PREFER_INSTALLED | + GS_APP_LIST_FILTER_FLAG_KEY_ID_PROVIDES, + "max-results", GS_SHELL_SEARCH_PROVIDER_MAX_RESULTS, + "sort-func", gs_shell_search_provider_sort_cb, + "sort-user-data", self, + "license-type", g_settings_get_boolean (settings, "show-only-free-apps") ? GS_APP_QUERY_LICENSE_FOSS : GS_APP_QUERY_LICENSE_ANY, + "developer-verified-type", g_settings_get_boolean (settings, "show-only-verified-apps") ? + GS_APP_QUERY_DEVELOPER_VERIFIED_ONLY : GS_APP_QUERY_DEVELOPER_VERIFIED_ANY, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + search_done_cb, + pending_search); +} + +static gboolean +handle_get_initial_result_set (GsShellSearchProvider2 *skeleton, + GDBusMethodInvocation *invocation, + gchar **terms, + gpointer user_data) +{ + GsShellSearchProvider *self = user_data; + + g_debug ("****** GetInitialResultSet"); + execute_search (self, invocation, terms); + return TRUE; +} + +static gboolean +handle_get_subsearch_result_set (GsShellSearchProvider2 *skeleton, + GDBusMethodInvocation *invocation, + gchar **previous_results, + gchar **terms, + gpointer user_data) +{ + GsShellSearchProvider *self = user_data; + + g_debug ("****** GetSubSearchResultSet"); + execute_search (self, invocation, terms); + return TRUE; +} + +static gboolean +handle_get_result_metas (GsShellSearchProvider2 *skeleton, + GDBusMethodInvocation *invocation, + gchar **results, + gpointer user_data) +{ + GsShellSearchProvider *self = user_data; + GVariantBuilder meta; + GVariant *meta_variant; + gint i; + GVariantBuilder builder; + + g_debug ("****** GetResultMetas"); + + for (i = 0; results[i]; i++) { + GsApp *app; + g_autoptr(GIcon) icon = NULL; + g_autofree gchar *description = NULL; + + /* already built */ + if (g_hash_table_lookup (self->metas_cache, results[i]) != NULL) + continue; + + /* get previously found app */ + app = gs_app_list_lookup (self->search_results, results[i]); + if (app == NULL) { + g_warning ("failed to refine find app %s in cache", results[i]); + continue; + } + + g_variant_builder_init (&meta, G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_add (&meta, "{sv}", "id", g_variant_new_string (gs_app_get_unique_id (app))); + g_variant_builder_add (&meta, "{sv}", "name", g_variant_new_string (gs_app_get_name (app))); + + /* ICON_SIZE is defined as 24px in js/ui/search.js in gnome-shell */ + icon = gs_app_get_icon_for_size (app, 24, 1, NULL); + if (icon != NULL) { + g_autofree gchar *icon_str = g_icon_to_string (icon); + if (icon_str != NULL) { + g_variant_builder_add (&meta, "{sv}", "gicon", g_variant_new_string (icon_str)); + } else { + g_autoptr(GVariant) icon_serialized = g_icon_serialize (icon); + g_variant_builder_add (&meta, "{sv}", "icon", icon_serialized); + } + } + + if (gs_utils_list_has_component_fuzzy (self->search_results, app) && + gs_app_get_origin_hostname (app) != NULL) { + /* TRANSLATORS: this refers to where the app came from */ + g_autofree gchar *source_text = g_strdup_printf (_("Source: %s"), + gs_app_get_origin_hostname (app)); + description = g_strdup_printf ("%s %s", + gs_app_get_summary (app), + source_text); + } else { + description = g_strdup (gs_app_get_summary (app)); + } + g_variant_builder_add (&meta, "{sv}", "description", g_variant_new_string (description)); + + meta_variant = g_variant_builder_end (&meta); + g_hash_table_insert (self->metas_cache, + g_strdup (gs_app_get_unique_id (app)), + g_variant_ref_sink (meta_variant)); + + } + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}")); + for (i = 0; results[i]; i++) { + meta_variant = (GVariant*)g_hash_table_lookup (self->metas_cache, results[i]); + if (meta_variant == NULL) + continue; + g_variant_builder_add_value (&builder, meta_variant); + } + + g_dbus_method_invocation_return_value (invocation, g_variant_new ("(aa{sv})", &builder)); + + return TRUE; +} + +static gboolean +handle_activate_result (GsShellSearchProvider2 *skeleton, + GDBusMethodInvocation *invocation, + gchar *result, + gchar **terms, + guint32 timestamp, + gpointer user_data) +{ + GApplication *app = g_application_get_default (); + g_autofree gchar *string = NULL; + + string = g_strjoinv (" ", terms); + + g_action_group_activate_action (G_ACTION_GROUP (app), "details", + g_variant_new ("(ss)", result, string)); + + gs_shell_search_provider2_complete_activate_result (skeleton, invocation); + return TRUE; +} + +static gboolean +handle_launch_search (GsShellSearchProvider2 *skeleton, + GDBusMethodInvocation *invocation, + gchar **terms, + guint32 timestamp, + gpointer user_data) +{ + GApplication *app = g_application_get_default (); + g_autofree gchar *string = g_strjoinv (" ", terms); + + g_action_group_activate_action (G_ACTION_GROUP (app), "search", + g_variant_new ("s", string)); + + gs_shell_search_provider2_complete_launch_search (skeleton, invocation); + return TRUE; +} + +gboolean +gs_shell_search_provider_register (GsShellSearchProvider *self, + GDBusConnection *connection, + GError **error) +{ + return g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->skeleton), + connection, + "/org/gnome/Software/SearchProvider", error); +} + +void +gs_shell_search_provider_unregister (GsShellSearchProvider *self) +{ + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (self->skeleton)); +} + +static void +search_provider_dispose (GObject *obj) +{ + GsShellSearchProvider *self = GS_SHELL_SEARCH_PROVIDER (obj); + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + + if (self->metas_cache != NULL) { + g_hash_table_destroy (self->metas_cache); + self->metas_cache = NULL; + } + + g_clear_object (&self->search_results); + g_clear_object (&self->plugin_loader); + g_clear_object (&self->skeleton); + + G_OBJECT_CLASS (gs_shell_search_provider_parent_class)->dispose (obj); +} + +static void +gs_shell_search_provider_init (GsShellSearchProvider *self) +{ + self->metas_cache = g_hash_table_new_full ((GHashFunc) as_utils_data_id_hash, + (GEqualFunc) as_utils_data_id_equal, + g_free, + (GDestroyNotify) g_variant_unref); + + self->search_results = gs_app_list_new (); + self->skeleton = gs_shell_search_provider2_skeleton_new (); + + g_signal_connect (self->skeleton, "handle-get-initial-result-set", + G_CALLBACK (handle_get_initial_result_set), self); + g_signal_connect (self->skeleton, "handle-get-subsearch-result-set", + G_CALLBACK (handle_get_subsearch_result_set), self); + g_signal_connect (self->skeleton, "handle-get-result-metas", + G_CALLBACK (handle_get_result_metas), self); + g_signal_connect (self->skeleton, "handle-activate-result", + G_CALLBACK (handle_activate_result), self); + g_signal_connect (self->skeleton, "handle-launch-search", + G_CALLBACK (handle_launch_search), self); +} + +static void +gs_shell_search_provider_class_init (GsShellSearchProviderClass *klass) +{ + GObjectClass *oclass = G_OBJECT_CLASS (klass); + + oclass->dispose = search_provider_dispose; +} + +GsShellSearchProvider * +gs_shell_search_provider_new (void) +{ + return g_object_new (gs_shell_search_provider_get_type (), NULL); +} + +void +gs_shell_search_provider_setup (GsShellSearchProvider *provider, + GsPluginLoader *loader) +{ + provider->plugin_loader = g_object_ref (loader); +} diff --git a/src/gs-shell-search-provider.h b/src/gs-shell-search-provider.h new file mode 100644 index 0000000..272ed88 --- /dev/null +++ b/src/gs-shell-search-provider.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * gs-shell-search-provider.h - Implementation of a GNOME Shell + * search provider + * + * Copyright (C) 2013 Matthias Clasen + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gnome-software-private.h" + +#define GS_TYPE_SHELL_SEARCH_PROVIDER gs_shell_search_provider_get_type() + +G_DECLARE_FINAL_TYPE (GsShellSearchProvider, gs_shell_search_provider, GS, SHELL_SEARCH_PROVIDER, GObject) + +gboolean gs_shell_search_provider_register (GsShellSearchProvider *self, + GDBusConnection *connection, + GError **error); +void gs_shell_search_provider_unregister (GsShellSearchProvider *self); +GsShellSearchProvider *gs_shell_search_provider_new (void); +void gs_shell_search_provider_setup (GsShellSearchProvider *provider, + GsPluginLoader *loader); diff --git a/src/gs-shell.c b/src/gs-shell.c new file mode 100644 index 0000000..85a6aba --- /dev/null +++ b/src/gs-shell.c @@ -0,0 +1,2689 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2020 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include +#include + +#ifdef HAVE_MOGWAI +#include +#endif + +#include "gs-common.h" +#include "gs-shell.h" +#include "gs-basic-auth-dialog.h" +#include "gs-details-page.h" +#include "gs-installed-page.h" +#include "gs-loading-page.h" +#include "gs-search-page.h" +#include "gs-overview-page.h" +#include "gs-updates-page.h" +#include "gs-updates-paused-banner.h" +#include "gs-category-page.h" +#include "gs-extras-page.h" +#include "gs-repos-dialog.h" +#include "gs-prefs-dialog.h" +#include "gs-toast.h" +#include "gs-update-dialog.h" +#include "gs-update-monitor.h" +#include "gs-utils.h" + +#define NARROW_WIDTH_THRESHOLD 800 + +static const gchar *page_name[] = { + "unknown", + "overview", + "installed", + "search", + "updates", + "details", + "category", + "extras", + "loading", +}; + +typedef struct { + GsShellMode mode; + GtkWidget *focus; + GsCategory *category; + gchar *search; + GsApp *app; + gdouble vscroll_position; +} BackEntry; + +struct _GsShell +{ + AdwApplicationWindow parent_object; + + GSettings *settings; + GCancellable *cancellable; + GsPluginLoader *plugin_loader; + GtkWidget *header_start_widget; + GtkWidget *header_end_widget; + GtkWidget *sub_header_end_widget; + GQueue *back_entry_stack; + AdwLeaflet *main_leaflet; + AdwLeaflet *details_leaflet; + AdwViewStack *stack_loading; + AdwViewStack *stack_main; + AdwViewStack *stack_sub; + GsPage *page; + + GBinding *sub_page_header_title_binding; + +#ifdef HAVE_MOGWAI + MwscScheduler *scheduler; + gboolean scheduler_held; + gulong scheduler_invalidated_handler; +#endif /* HAVE_MOGWAI */ + + GtkWidget *main_header; + GtkWidget *details_header; + GtkWidget *updates_paused_banner; + GtkWidget *search_button; + GtkWidget *entry_search; + GtkWidget *search_bar; + GtkWidget *button_back; + GtkWidget *button_back2; + GtkWidget *toast_overlay; + GtkWidget *primary_menu; + GtkWidget *sub_header; + GtkWidget *sub_page_header_title; + + gboolean activate_after_setup; + gboolean is_narrow; + gint allocation_width; + guint allocation_changed_cb_id; + + GsPage *pages[GS_SHELL_MODE_LAST]; +}; + +G_DEFINE_TYPE (GsShell, gs_shell, ADW_TYPE_APPLICATION_WINDOW) + +typedef enum { + PROP_IS_NARROW = 1, + PROP_ALLOCATION_WIDTH, +} GsShellProperty; + +enum { + SIGNAL_LOADED, + SIGNAL_LAST +}; + +static GParamSpec *obj_props[PROP_ALLOCATION_WIDTH + 1] = { NULL, }; + +static guint signals [SIGNAL_LAST] = { 0 }; + +void +gs_shell_activate (GsShell *shell) +{ + /* Waiting for plugin loader to setup first */ + if (shell->plugin_loader == NULL) { + shell->activate_after_setup = TRUE; + return; + } + + gtk_widget_set_visible (GTK_WIDGET (shell), TRUE); + gtk_window_present (GTK_WINDOW (shell)); +} + +static void +gs_shell_set_header_start_widget (GsShell *shell, GtkWidget *widget) +{ + GtkWidget *old_widget; + + old_widget = shell->header_start_widget; + + if (shell->header_start_widget == widget) + return; + + if (widget != NULL) { + g_object_ref (widget); + adw_header_bar_pack_start (ADW_HEADER_BAR (shell->main_header), widget); + } + + shell->header_start_widget = widget; + + if (old_widget != NULL) { + adw_header_bar_remove (ADW_HEADER_BAR (shell->main_header), old_widget); + g_object_unref (old_widget); + } +} + +static void +gs_shell_set_header_end_widget (GsShell *shell, GtkWidget *widget) +{ + GtkWidget *old_widget; + + old_widget = shell->header_end_widget; + + if (shell->header_end_widget == widget) + return; + + if (widget != NULL) { + g_object_ref (widget); + adw_header_bar_pack_end (ADW_HEADER_BAR (shell->main_header), widget); + } + + shell->header_end_widget = widget; + + if (old_widget != NULL) { + adw_header_bar_remove (ADW_HEADER_BAR (shell->main_header), old_widget); + g_object_unref (old_widget); + } +} + +static void +gs_shell_set_sub_header_end_widget (GsShell *shell, GtkWidget *widget) +{ + GtkWidget *old_widget; + + old_widget = shell->sub_header_end_widget; + + if (shell->sub_header_end_widget == widget) + return; + + if (widget != NULL) { + g_object_ref (widget); + adw_header_bar_pack_end (ADW_HEADER_BAR (shell->sub_header), widget); + } + + shell->sub_header_end_widget = widget; + + if (old_widget != NULL) { + adw_header_bar_remove (ADW_HEADER_BAR (shell->sub_header), old_widget); + g_object_unref (old_widget); + } +} + +static void +gs_shell_refresh_auto_updates_ui (GsShell *shell) +{ + gboolean automatic_updates_enabled; + GsUpdatesPausedBannerFlags flags = GS_UPDATES_PAUSED_BANNER_FLAGS_NONE; + + automatic_updates_enabled = g_settings_get_boolean (shell->settings, "download-updates"); + if (!automatic_updates_enabled || gs_shell_get_mode (shell) == GS_SHELL_MODE_LOADING) + return; + +#ifdef HAVE_MOGWAI + if (shell->scheduler == NULL || !mwsc_scheduler_get_allow_downloads (shell->scheduler)) + flags |= GS_UPDATES_PAUSED_BANNER_FLAGS_NO_LARGE_DOWNLOADS; +#else + if (gs_plugin_loader_get_network_metered (shell->plugin_loader)) + flags |= GS_UPDATES_PAUSED_BANNER_FLAGS_METERED; +#endif + if (gs_plugin_loader_get_power_saver (shell->plugin_loader)) + flags |= GS_UPDATES_PAUSED_BANNER_FLAGS_POWER_SAVER; + if (gs_plugin_loader_get_game_mode (shell->plugin_loader)) + flags |= GS_UPDATES_PAUSED_BANNER_FLAGS_GAME_MODE; + + gs_updates_paused_banner_set_flags (GS_UPDATES_PAUSED_BANNER (shell->updates_paused_banner), + flags); +} + +static void +gs_shell_download_updates_changed_cb (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + GsShell *shell = user_data; + + gs_shell_refresh_auto_updates_ui (shell); +} + +static void +gs_shell_network_metered_notify_cb (GsPluginLoader *plugin_loader, + GParamSpec *pspec, + gpointer user_data) +{ +#ifndef HAVE_MOGWAI + GsShell *shell = user_data; + + /* @automatic_updates_paused only depends on network-metered if we’re + * compiled without Mogwai. */ + gs_shell_refresh_auto_updates_ui (shell); +#endif +} + +#ifdef HAVE_MOGWAI +static void +scheduler_invalidated_cb (GsShell *shell) +{ + /* The scheduler shouldn’t normally be invalidated, since we Hold() it + * until we’re done with it. However, if the scheduler is stopped by + * systemd (`systemctl stop mogwai-scheduled`) this signal will be + * emitted. It may also be invalidated while our main window is hidden, + * as we release our Hold() then. */ + g_signal_handler_disconnect (shell->scheduler, + shell->scheduler_invalidated_handler); + shell->scheduler_invalidated_handler = 0; + shell->scheduler_held = FALSE; + + g_clear_object (&shell->scheduler); +} + +static void +scheduler_allow_downloads_changed_cb (GsShell *shell) +{ + gs_shell_refresh_auto_updates_ui (shell); +} + +static void +scheduler_hold_cb (GObject *source_object, + GAsyncResult *result, + gpointer data) +{ + g_autoptr(GError) error_local = NULL; + MwscScheduler *scheduler = (MwscScheduler *) source_object; + g_autoptr(GsShell) shell = data; /* reference added when starting the async operation */ + + if (mwsc_scheduler_hold_finish (scheduler, result, &error_local)) { + shell->scheduler_held = TRUE; + } else if (!g_error_matches (error_local, G_DBUS_ERROR, G_DBUS_ERROR_FAILED)) { + g_warning ("Couldn't hold the Mogwai Scheduler daemon: %s", + error_local->message); + } + + g_clear_error (&error_local); + + shell->scheduler_invalidated_handler = + g_signal_connect_swapped (scheduler, "invalidated", + (GCallback) scheduler_invalidated_cb, + shell); + + g_signal_connect_object (scheduler, "notify::allow-downloads", + (GCallback) scheduler_allow_downloads_changed_cb, + shell, + G_CONNECT_SWAPPED); + + g_assert (shell->scheduler == NULL); + shell->scheduler = scheduler; + + /* Update the UI accordingly. */ + gs_shell_refresh_auto_updates_ui (shell); +} + +static void +scheduler_release_cb (GObject *source_object, + GAsyncResult *result, + gpointer data) +{ + MwscScheduler *scheduler = (MwscScheduler *) source_object; + g_autoptr(GsShell) shell = data; /* reference added when starting the async operation */ + g_autoptr(GError) error_local = NULL; + + if (!mwsc_scheduler_release_finish (scheduler, result, &error_local)) + g_warning ("Couldn't release the Mogwai Scheduler daemon: %s", + error_local->message); + + shell->scheduler_held = FALSE; + g_clear_object (&shell->scheduler); +} + +static void +scheduler_ready_cb (GObject *source_object, + GAsyncResult *result, + gpointer data) +{ + MwscScheduler *scheduler; + g_autoptr(GError) error_local = NULL; + g_autoptr(GsShell) shell = data; /* reference added when starting the async operation */ + + scheduler = mwsc_scheduler_new_finish (result, &error_local); + + if (scheduler == NULL) { + g_warning ("%s: Error getting Mogwai Scheduler: %s", G_STRFUNC, + error_local->message); + return; + } + + mwsc_scheduler_hold_async (scheduler, + "monitoring allow-downloads property", + NULL, + scheduler_hold_cb, + g_object_ref (shell)); +} +#endif /* HAVE_MOGWAI */ + +static void +gs_shell_basic_auth_start_cb (GsPluginLoader *plugin_loader, + const gchar *remote, + const gchar *realm, + GsBasicAuthCallback callback, + gpointer callback_data, + GsShell *shell) +{ + GtkWidget *dialog; + + dialog = gs_basic_auth_dialog_new (remote, realm, callback, callback_data); + adw_dialog_present (ADW_DIALOG (dialog), GTK_WIDGET (shell)); +} + +static gboolean +gs_shell_ask_untrusted_cb (GsPluginLoader *plugin_loader, + const gchar *title, + const gchar *msg, + const gchar *details, + const gchar *accept_label, + GsShell *shell) +{ + return gs_utils_ask_user_accepts (GTK_WIDGET (shell), title, msg, details, accept_label); +} + +static void +free_back_entry (BackEntry *entry) +{ + if (entry->focus != NULL) + g_object_remove_weak_pointer (G_OBJECT (entry->focus), + (gpointer *) &entry->focus); + g_clear_object (&entry->category); + g_clear_object (&entry->app); + g_free (entry->search); + g_free (entry); +} + +static void +gs_shell_clean_back_entry_stack (GsShell *shell) +{ + BackEntry *entry; + + while ((entry = g_queue_pop_head (shell->back_entry_stack)) != NULL) { + free_back_entry (entry); + } +} + +static gboolean +gs_shell_get_mode_is_main (GsShellMode mode) +{ + switch (mode) { + case GS_SHELL_MODE_OVERVIEW: + case GS_SHELL_MODE_INSTALLED: + case GS_SHELL_MODE_SEARCH: + case GS_SHELL_MODE_UPDATES: + case GS_SHELL_MODE_LOADING: + return TRUE; + case GS_SHELL_MODE_DETAILS: + case GS_SHELL_MODE_CATEGORY: + case GS_SHELL_MODE_EXTRAS: + return FALSE; + default: + return TRUE; + } +} + +static void search_bar_search_mode_enabled_changed_cb (GtkSearchBar *search_bar, + GParamSpec *pspec, + GsShell *shell); +static void gs_overview_page_button_cb (GtkWidget *widget, GsShell *shell); + +static void +update_header_widgets (GsShell *shell) +{ + GsShellMode mode = gs_shell_get_mode (shell); + + /* only show the search button in overview and search pages */ + g_signal_handlers_block_by_func (shell->search_bar, search_bar_search_mode_enabled_changed_cb, shell); + + /* hide unless we're going to search */ + gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (shell->search_bar), + mode == GS_SHELL_MODE_SEARCH); + + g_signal_handlers_unblock_by_func (shell->search_bar, search_bar_search_mode_enabled_changed_cb, shell); +} + +static void +stack_notify_visible_child_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GsShell *shell = GS_SHELL (user_data); + GsPage *page; + GtkWidget *widget; + GsShellMode mode = gs_shell_get_mode (shell); + + update_header_widgets (shell); + + /* do action for mode */ + page = shell->pages[mode]; + + if (mode == GS_SHELL_MODE_OVERVIEW || + mode == GS_SHELL_MODE_INSTALLED || + mode == GS_SHELL_MODE_UPDATES) + gs_shell_clean_back_entry_stack (shell); + + if (shell->page != NULL) + gs_page_switch_from (shell->page); + g_set_object (&shell->page, page); + gs_page_switch_to (page); + + /* update header bar widgets */ + switch (mode) { + case GS_SHELL_MODE_OVERVIEW: + case GS_SHELL_MODE_INSTALLED: + case GS_SHELL_MODE_SEARCH: + gtk_widget_set_visible (shell->search_button, TRUE); + break; + case GS_SHELL_MODE_UPDATES: + gtk_widget_set_visible (shell->search_button, FALSE); + break; + default: + /* We don't care about changing the visibility of the search + * button in modes appearing in sub-pages. */ + break; + } + + widget = gs_page_get_header_start_widget (page); + switch (mode) { + case GS_SHELL_MODE_OVERVIEW: + case GS_SHELL_MODE_INSTALLED: + case GS_SHELL_MODE_UPDATES: + case GS_SHELL_MODE_SEARCH: + gs_shell_set_header_start_widget (shell, widget); + break; + default: + g_assert (widget == NULL); + break; + } + + widget = gs_page_get_header_end_widget (page); + switch (mode) { + case GS_SHELL_MODE_OVERVIEW: + case GS_SHELL_MODE_INSTALLED: + case GS_SHELL_MODE_UPDATES: + case GS_SHELL_MODE_SEARCH: + gs_shell_set_header_end_widget (shell, widget); + break; + case GS_SHELL_MODE_EXTRAS: + gs_shell_set_sub_header_end_widget (shell, widget); + break; + default: + g_assert (widget == NULL); + break; + } + + g_clear_object (&shell->sub_page_header_title_binding); + shell->sub_page_header_title_binding = g_object_bind_property (adw_view_stack_get_visible_child (shell->stack_sub), "title", + shell->sub_page_header_title, "label", + G_BINDING_SYNC_CREATE); + + /* refresh the updates bar when moving out of the loading mode, but only + * if the Mogwai scheduler state is already known, to avoid spuriously + * showing the updates bar */ +#ifdef HAVE_MOGWAI + if (shell->scheduler != NULL) +#else + if (TRUE) +#endif + gs_shell_refresh_auto_updates_ui (shell); +} + +void +gs_shell_change_mode (GsShell *shell, + GsShellMode mode, + gpointer data, + gboolean scroll_up) +{ + GsApp *app; + GsPage *page; + gboolean mode_is_main = gs_shell_get_mode_is_main (mode); + + if (gs_shell_get_mode (shell) == mode && + (mode != GS_SHELL_MODE_DETAILS || + data == gs_details_page_get_app (GS_DETAILS_PAGE (shell->pages[mode])))) { + return; + } + + /* switch page */ + if (mode == GS_SHELL_MODE_LOADING) { + adw_view_stack_set_visible_child_name (shell->stack_loading, "loading"); + return; + } + + adw_view_stack_set_visible_child_name (shell->stack_loading, "main"); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + if (mode == GS_SHELL_MODE_DETAILS) { + adw_leaflet_set_visible_child_name (shell->details_leaflet, "details"); + } else { + adw_leaflet_set_visible_child_name (shell->details_leaflet, "main"); + /* We only change the main leaflet when not reaching the details + * page to preserve the navigation history in the UI's state. + * First change the page, then the leaflet, to avoid load of + * the previously shown page, which will be changed shortly after. */ + adw_view_stack_set_visible_child_name (mode_is_main ? shell->stack_main : shell->stack_sub, page_name[mode]); + adw_leaflet_set_visible_child_name (shell->main_leaflet, mode_is_main ? "main" : "sub"); + } +G_GNUC_END_IGNORE_DEPRECATIONS + + /* do any mode-specific actions */ + page = shell->pages[mode]; + + if (mode == GS_SHELL_MODE_SEARCH) { + /* Use scroll_up as a hint that the mode change is not meant to preserve context */ + if (scroll_up) + gs_search_page_clear (GS_SEARCH_PAGE (page)); + + gs_search_page_set_text (GS_SEARCH_PAGE (page), data); + gtk_editable_set_text (GTK_EDITABLE (shell->entry_search), data); + gtk_editable_set_position (GTK_EDITABLE (shell->entry_search), -1); + } else if (mode == GS_SHELL_MODE_DETAILS) { + app = GS_APP (data); + if (gs_app_get_metadata_item (app, "GnomeSoftware::show-metainfo") != NULL) { + gs_details_page_set_metainfo (GS_DETAILS_PAGE (page), + gs_app_get_local_file (app)); + } else if (gs_app_get_local_file (app) != NULL) { + gs_details_page_set_local_file (GS_DETAILS_PAGE (page), + gs_app_get_local_file (app)); + } else if (gs_app_get_metadata_item (app, "GnomeSoftware::from-url") != NULL) { + gs_details_page_set_url (GS_DETAILS_PAGE (page), + gs_app_get_metadata_item (app, "GnomeSoftware::from-url")); + } else { + gs_details_page_set_app (GS_DETAILS_PAGE (page), data); + } + } else if (mode == GS_SHELL_MODE_CATEGORY) { + gs_category_page_set_category (GS_CATEGORY_PAGE (page), + GS_CATEGORY (data)); + } + + if (scroll_up) + gs_page_scroll_up (page); +} + +static void +gs_overview_page_button_cb (GtkWidget *widget, GsShell *shell) +{ + GsShellMode mode; + mode = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), + "gnome-software::overview-mode")); + gs_shell_change_mode (shell, mode, NULL, TRUE); +} + +static void +save_back_entry (GsShell *shell) +{ + BackEntry *entry; + + entry = g_new0 (BackEntry, 1); + entry->mode = gs_shell_get_mode (shell); + + entry->focus = gtk_window_get_focus (GTK_WINDOW (shell)); + if (entry->focus != NULL) + g_object_add_weak_pointer (G_OBJECT (entry->focus), + (gpointer *) &entry->focus); + + switch (entry->mode) { + case GS_SHELL_MODE_CATEGORY: + entry->category = gs_category_page_get_category (GS_CATEGORY_PAGE (shell->pages[GS_SHELL_MODE_CATEGORY])); + g_object_ref (entry->category); + g_debug ("pushing back entry for %s with %s", + page_name[entry->mode], + gs_category_get_id (entry->category)); + break; + case GS_SHELL_MODE_SEARCH: + entry->search = g_strdup (gs_search_page_get_text (GS_SEARCH_PAGE (shell->pages[GS_SHELL_MODE_SEARCH]))); + g_debug ("pushing back entry for %s with %s", + page_name[entry->mode], entry->search); + break; + case GS_SHELL_MODE_DETAILS: + entry->app = g_object_ref (gs_details_page_get_app (GS_DETAILS_PAGE (shell->pages[GS_SHELL_MODE_DETAILS]))); + entry->vscroll_position = gs_details_page_get_vscroll_position (GS_DETAILS_PAGE (shell->pages[GS_SHELL_MODE_DETAILS])); + break; + default: + g_debug ("pushing back entry for %s", page_name[entry->mode]); + break; + } + + g_queue_push_head (shell->back_entry_stack, entry); +} + +static void +gs_shell_plugin_events_no_space_cb (GsShell *shell) +{ + g_autoptr(GError) error = NULL; + if (!g_spawn_command_line_async ("baobab", &error)) + g_warning ("failed to exec baobab: %s", error->message); +} + +static void +gs_shell_plugin_events_details_text_cb (GsShell *shell, + AdwToast *toast) +{ + const gchar *details_message; + const gchar *details_text; + + details_message = gs_toast_get_details_message (toast); + details_text = gs_toast_get_details_text (toast); + + if (details_message == NULL || *details_message == '\0') + details_message = adw_toast_get_title (toast); + + gs_utils_show_error_dialog_simple (GTK_WIDGET (shell), + details_message, + details_text); +} + +static void +gs_shell_plugin_events_details_uri_cb (GsShell *shell, + AdwToast *toast) +{ + /* in this case the details text contains a URI to be opened */ + const gchar *uri = gs_toast_get_details_text (toast); + g_autoptr(GError) error = NULL; + + g_return_if_fail (uri != NULL); + + if (!g_app_info_launch_default_for_uri (uri, NULL, &error)) { + g_warning ("failed to launch URI %s: %s", + uri, error->message); + } +} + +static void +gs_shell_plugin_events_restart_required_cb (GsShell *shell) +{ + g_autoptr(GError) error = NULL; + if (!g_spawn_command_line_async (LIBEXECDIR "/gnome-software-restarter", &error)) + g_warning ("failed to restart: %s", error->message); +} + +static void gs_shell_rescan_events (GsShell *shell); + +static void +gs_shell_plugin_event_dismissed_cb (GsShell *shell) +{ + guint i; + g_autoptr(GPtrArray) events = NULL; + + /* mark any events currently showing as invalid */ + events = gs_plugin_loader_get_events (shell->plugin_loader); + for (i = 0; i < events->len; i++) { + GsPluginEvent *event = g_ptr_array_index (events, i); + if (gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_VISIBLE)) { + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INVALID); + gs_plugin_event_remove_flag (event, GS_PLUGIN_EVENT_FLAG_VISIBLE); + } + } + + /* show the next event */ + gs_shell_rescan_events (shell); +} + +static void +gs_shell_go_back (GsShell *shell) +{ + BackEntry *entry; + + /* nothing to do */ + if (g_queue_is_empty (shell->back_entry_stack)) { + g_debug ("no back stack, showing overview"); + gs_shell_change_mode (shell, GS_SHELL_MODE_OVERVIEW, NULL, FALSE); + return; + } + + entry = g_queue_pop_head (shell->back_entry_stack); + + switch (entry->mode) { + case GS_SHELL_MODE_UNKNOWN: + case GS_SHELL_MODE_LOADING: + /* happens when using --search, --details, --install, etc. options */ + g_debug ("popping back entry for %s", page_name[entry->mode]); + gs_shell_change_mode (shell, GS_SHELL_MODE_OVERVIEW, NULL, FALSE); + break; + case GS_SHELL_MODE_CATEGORY: + g_debug ("popping back entry for %s with %s", + page_name[entry->mode], + gs_category_get_id (entry->category)); + gs_shell_change_mode (shell, entry->mode, entry->category, FALSE); + break; + case GS_SHELL_MODE_SEARCH: + g_debug ("popping back entry for %s with %s", + page_name[entry->mode], entry->search); + + /* set the mode directly */ + gs_shell_change_mode (shell, entry->mode, + (gpointer) entry->search, FALSE); + break; + case GS_SHELL_MODE_DETAILS: + g_debug ("popping back entry for %s with app %s and vscroll position %f", + page_name[entry->mode], + gs_app_get_unique_id (entry->app), + entry->vscroll_position); + gs_shell_change_mode (shell, entry->mode, entry->app, FALSE); + gs_details_page_set_vscroll_position (GS_DETAILS_PAGE (shell->pages[GS_SHELL_MODE_DETAILS]), entry->vscroll_position); + break; + default: + g_debug ("popping back entry for %s", page_name[entry->mode]); + gs_shell_change_mode (shell, entry->mode, NULL, FALSE); + break; + } + + if (entry->focus != NULL) + gtk_widget_grab_focus (entry->focus); + + free_back_entry (entry); +} + +static void +gs_shell_details_back_button_cb (GtkWidget *widget, GsShell *shell) +{ + gs_shell_go_back (shell); +} + +static void +gs_shell_back_button_cb (GtkWidget *widget, GsShell *shell) +{ + gs_shell_go_back (shell); +} + +static void +gs_shell_reload_cb (GsPluginLoader *plugin_loader, GsShell *shell) +{ + for (gsize i = 0; i < G_N_ELEMENTS (shell->pages); i++) { + GsPage *page = shell->pages[i]; + if (page != NULL) + gs_page_reload (page); + } +} + +static void +gs_shell_details_page_metainfo_loaded_cb (GtkWidget *details_page, + GsApp *app, + GsShell *self) +{ + g_return_if_fail (GS_IS_APP (app)); + g_return_if_fail (GS_IS_SHELL (self)); + + /* If the user has manually loaded some metainfo to + * preview, override the featured carousel with it too, + * so they can see how it looks in the carousel. */ + gs_overview_page_override_featured (GS_OVERVIEW_PAGE (self->pages[GS_SHELL_MODE_OVERVIEW]), app); +} + +static gboolean +change_mode_idle (gpointer user_data) +{ + GsShell *shell = user_data; + + gs_page_reload (GS_PAGE (shell->pages[GS_SHELL_MODE_UPDATES])); + gs_page_reload (GS_PAGE (shell->pages[GS_SHELL_MODE_INSTALLED])); + + /* Switch only when still on the loading page, otherwise the page + could be changed from the command line or such, which would mean + hiding the chosen page. */ + if (gs_shell_get_mode (shell) == GS_SHELL_MODE_LOADING) + gs_shell_change_mode (shell, GS_SHELL_MODE_OVERVIEW, NULL, TRUE); + + return G_SOURCE_REMOVE; +} + +static void +overview_page_refresh_done (GsOverviewPage *overview_page, gpointer data) +{ + GsShell *shell = data; + + g_signal_handlers_disconnect_by_func (overview_page, overview_page_refresh_done, data); + + /* now that we're finished with the loading page, connect the reload signal handler */ + g_signal_connect (shell->plugin_loader, "reload", + G_CALLBACK (gs_shell_reload_cb), shell); + + /* schedule to change the mode in an idle callback, since it can take a + * while and this callback handler is typically called at the end of a + * long main context iteration already */ + g_idle_add (change_mode_idle, shell); +} + +static void +initial_refresh_done (GsLoadingPage *loading_page, gpointer data) +{ + GsShell *shell = data; + gboolean been_overview; + + g_signal_handlers_disconnect_by_func (loading_page, initial_refresh_done, data); + + been_overview = gs_shell_get_mode (shell) == GS_SHELL_MODE_OVERVIEW; + + g_signal_emit (shell, signals[SIGNAL_LOADED], 0); + + /* if the "loaded" signal handler didn't change the mode, kick off async + * overview page refresh, and switch to the page once done */ + if (gs_shell_get_mode (shell) == GS_SHELL_MODE_LOADING || been_overview) { + g_signal_connect (shell->pages[GS_SHELL_MODE_OVERVIEW], "refreshed", + G_CALLBACK (overview_page_refresh_done), shell); + gs_page_reload (GS_PAGE (shell->pages[GS_SHELL_MODE_OVERVIEW])); + return; + } + + /* now that we're finished with the loading page, connect the reload signal handler */ + g_signal_connect (shell->plugin_loader, "reload", + G_CALLBACK (gs_shell_reload_cb), shell); +} + +static gboolean +window_keypress_handler (GtkEventControllerKey *key_controller, + guint keyval, + guint keycode, + GdkModifierType state, + GsShell *shell) +{ + GdkModifierType modifiers = state & GDK_MODIFIER_MASK; + + /* handle ctrl+f shortcut */ + if ((modifiers == GDK_CONTROL_MASK && keyval == GDK_KEY_f) || + (modifiers == (GDK_CONTROL_MASK | GDK_LOCK_MASK) && keyval == GDK_KEY_F)) { + if (!gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (shell->search_bar))) { + GsShellMode mode = gs_shell_get_mode (shell); + + gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (shell->search_bar), TRUE); + gtk_widget_grab_focus (shell->entry_search); + + /* If the mode doesn't have a search button, + * switch to the search page right away, + * otherwise we would show the search bar + * without a button to toggle it. */ + switch (mode) { + case GS_SHELL_MODE_OVERVIEW: + case GS_SHELL_MODE_INSTALLED: + case GS_SHELL_MODE_SEARCH: + break; + default: + gs_shell_show_search (shell, ""); + break; + } + } else { + gtk_widget_grab_focus (shell->entry_search); + } + return GDK_EVENT_STOP; + } + + return GDK_EVENT_PROPAGATE; +} + +static void +search_changed_handler (GObject *entry, GsShell *shell) +{ + g_autofree gchar *text = NULL; + + text = g_strdup (gtk_editable_get_text (GTK_EDITABLE (entry))); + if (strlen (text) >= 2) { + if (gs_shell_get_mode (shell) != GS_SHELL_MODE_SEARCH) { + save_back_entry (shell); + gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, + (gpointer) text, TRUE); + } else { + gs_search_page_set_text (GS_SEARCH_PAGE (shell->pages[GS_SHELL_MODE_SEARCH]), text); + gs_page_switch_to (shell->pages[GS_SHELL_MODE_SEARCH]); + } + } +} + +static void +search_bar_search_mode_enabled_changed_cb (GtkSearchBar *search_bar, + GParamSpec *pspec, + GsShell *shell) +{ + /* go back when exiting the search view */ + if (gs_shell_get_mode (shell) == GS_SHELL_MODE_SEARCH && + !gtk_search_bar_get_search_mode (search_bar)) + gs_shell_go_back (shell); +} + +static void +go_back (GsShell *shell) +{ +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + if (adw_leaflet_get_adjacent_child (shell->details_leaflet, + ADW_NAVIGATION_DIRECTION_BACK)) { + gtk_widget_activate (shell->button_back2); + } else { + gtk_widget_activate (shell->button_back); + } +G_GNUC_END_IGNORE_DEPRECATIONS +} + +static gboolean +window_key_pressed_cb (GtkEventControllerKey *key_controller, + guint keyval, + guint keycode, + GdkModifierType state, + GsShell *shell) +{ + gboolean is_rtl = gtk_widget_get_direction (shell->button_back) == GTK_TEXT_DIR_RTL; + gboolean is_alt = (state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_ALT_MASK)) == GDK_ALT_MASK; + + if ((!is_rtl && is_alt && keyval == GDK_KEY_Left) || + (is_rtl && is_alt && keyval == GDK_KEY_Right) || + keyval == GDK_KEY_Back) { + go_back (shell); + return GDK_EVENT_STOP; + } + + return GDK_EVENT_PROPAGATE; +} + +static void +window_button_pressed_cb (GtkGestureClick *click_gesture, + gint n_press, + gdouble x, + gdouble y, + GsShell *shell) +{ + go_back (shell); + + gtk_gesture_set_state (GTK_GESTURE (click_gesture), GTK_EVENT_SEQUENCE_CLAIMED); +} + +static gboolean +main_window_closed_cb (GtkWidget *dialog, gpointer user_data) +{ + GsShell *shell = user_data; + + /* hide any notifications */ + g_application_withdraw_notification (g_application_get_default (), + "installed"); + g_application_withdraw_notification (g_application_get_default (), + "install-resources"); + + /* release our hold on the download scheduler */ +#ifdef HAVE_MOGWAI + if (shell->scheduler != NULL) { + if (shell->scheduler_invalidated_handler > 0) + g_signal_handler_disconnect (shell->scheduler, + shell->scheduler_invalidated_handler); + shell->scheduler_invalidated_handler = 0; + + if (shell->scheduler_held) + mwsc_scheduler_release_async (shell->scheduler, + NULL, + scheduler_release_cb, + g_object_ref (shell)); + else + g_clear_object (&shell->scheduler); + } +#endif /* HAVE_MOGWAI */ + + gs_shell_clean_back_entry_stack (shell); + gtk_widget_set_visible (dialog, FALSE); + +#ifdef __GLIBC__ + /* Free unused memory with GNU extension of malloc.h */ + malloc_trim (0); +#endif + + return TRUE; +} + +static void +gs_shell_main_window_mapped_cb (GtkWidget *widget, GsShell *shell) +{ + gs_plugin_loader_set_scale (shell->plugin_loader, + (guint) gtk_widget_get_scale_factor (widget)); + + /* Set up the updates bar. Do this here rather than in gs_shell_setup() + * since we only want to hold the scheduler open while the gnome-software + * main window is visible, and not while we’re running in the background. */ +#ifdef HAVE_MOGWAI + if (shell->scheduler == NULL) + mwsc_scheduler_new_async (shell->cancellable, + (GAsyncReadyCallback) scheduler_ready_cb, + g_object_ref (shell)); +#else + gs_shell_refresh_auto_updates_ui (shell); +#endif /* HAVE_MOGWAI */ +} + +static void +gs_shell_main_window_realized_cb (GtkWidget *widget, GsShell *shell) +{ + GdkRectangle geometry; + GdkSurface *surface; + GdkDisplay *display; + GdkMonitor *monitor; + + display = gtk_widget_get_display (GTK_WIDGET (shell)); + surface = gtk_native_get_surface (GTK_NATIVE (shell)); + monitor = gdk_display_get_monitor_at_surface (display, surface); + + /* adapt the window for low and medium resolution screens */ + if (monitor != NULL) { + gdk_monitor_get_geometry (monitor, &geometry); + if (geometry.width < 800 || geometry.height < 600) { + } else if (geometry.width < 1366 || geometry.height < 768) { + gtk_window_set_default_size (GTK_WINDOW (shell), 1050, 600); + } + } +} + +static gboolean +gs_shell_has_disk_examination_app (void) +{ + g_autofree gchar *baobab = g_find_program_in_path ("baobab"); + return (baobab != NULL); +} + +static void +gs_shell_show_event_app_notify (GsShell *shell, + const gchar *title, + GsToastButton button, + const gchar *details_text, + const gchar *details_message) +{ + g_autoptr(AdwToast) toast = NULL; + + toast = gs_toast_new (title, button, details_message, details_text); + + if (details_text != NULL) + button = GS_TOAST_BUTTON_NONE; + + g_signal_connect_object (toast, "dismissed", + G_CALLBACK (gs_shell_plugin_event_dismissed_cb), shell, G_CONNECT_SWAPPED); + + switch (button) { + case GS_TOAST_BUTTON_NO_SPACE: + if (gs_shell_has_disk_examination_app ()) { + g_signal_connect_object (toast, "button-clicked", + G_CALLBACK (gs_shell_plugin_events_no_space_cb), shell, G_CONNECT_SWAPPED); + } + break; + case GS_TOAST_BUTTON_RESTART_REQUIRED: + g_signal_connect_object (toast, "button-clicked", + G_CALLBACK (gs_shell_plugin_events_restart_required_cb), shell, G_CONNECT_SWAPPED); + break; + case GS_TOAST_BUTTON_DETAILS_URI: + g_signal_connect_object (toast, "button-clicked", + G_CALLBACK (gs_shell_plugin_events_details_uri_cb), shell, G_CONNECT_SWAPPED); + break; + default: + g_warn_if_reached (); + /* fall-through */ + case GS_TOAST_BUTTON_NONE: + case GS_TOAST_BUTTON_LAST: + if (details_text != NULL) { + g_signal_connect_object (toast, "button-clicked", + G_CALLBACK (gs_shell_plugin_events_details_text_cb), shell, G_CONNECT_SWAPPED); + } + break; + } + + adw_toast_overlay_add_toast (ADW_TOAST_OVERLAY (shell->toast_overlay), g_steal_pointer (&toast)); +} + +void +gs_shell_show_notification (GsShell *shell, const gchar *title) +{ + gs_shell_show_event_app_notify (shell, title, GS_TOAST_BUTTON_NONE, NULL, NULL); +} + +static gchar * +gs_shell_get_title_from_origin (GsApp *app) +{ + /* get a title, falling back */ + if (gs_app_get_origin_hostname (app) != NULL) { + /* TRANSLATORS: this is part of the in-app notification, + * where the %s is the truncated hostname, e.g. + * 'alt.fedoraproject.org' */ + return g_strdup_printf (_("“%s”"), gs_app_get_origin_hostname (app)); + } + if (gs_app_get_origin (app) != NULL) { + /* TRANSLATORS: this is part of the in-app notification, + * where the %s is the origin id, e.g. 'fedora' */ + return g_strdup_printf (_("“%s”"), gs_app_get_origin (app)); + } + return g_strdup_printf ("“%s”", gs_app_get_id (app)); +} + +/* return a name for the app, using quotes if the name is more than one word */ +static gchar * +gs_shell_get_title_from_app (GsApp *app) +{ + const gchar *tmp = gs_app_get_name (app); + if (tmp != NULL) { + if (g_strstr_len (tmp, -1, " ") != NULL) { + /* TRANSLATORS: this is part of the in-app notification, + * where the %s is a multi-word localised app name + * e.g. 'Getting things GNOME!" */ + return g_strdup_printf (_("“%s”"), tmp); + } + return g_strdup (tmp); + } + return g_strdup_printf (_("“%s”"), gs_app_get_id (app)); +} + +/* returns whether the `out_details_text` is a URI */ +static gboolean +gs_shell_handle_events_more_info (GsShell *self, + GsApp *origin, + const gchar *suggested_details_text, + const gchar *suggested_details_message, + const gchar **out_details_text, + const gchar **out_details_message) +{ + const gchar *uri; + + /* Prefer detailed error message against origin's help URL */ + if (suggested_details_text != NULL && *suggested_details_text != '\0') { + if (out_details_message != NULL) + *out_details_message = suggested_details_message; + *out_details_text = suggested_details_text; + return FALSE; + } + + if (origin == NULL) + return FALSE; + + uri = gs_app_get_url (origin, AS_URL_KIND_HELP); + if (uri != NULL) { + *out_details_text = uri; + return TRUE; + } + + return FALSE; +} + +static gboolean +gs_shell_show_event_refresh (GsShell *shell, GsPluginEvent *event) +{ + GsApp *origin = gs_plugin_event_get_origin (event); + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *details_text = NULL; + const gchar *details_message = NULL; + const gchar *suggested_details_text = NULL; + g_autofree gchar *suggested_details_message = NULL; + g_autofree gchar *str_origin = NULL; + GsPluginJob *job = gs_plugin_event_get_job (event); + + /* ignore any errors from background downloads */ + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE)) + return TRUE; + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_DOWNLOAD_FAILED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to download updates"); + if (origin != NULL) { + str_origin = gs_shell_get_title_from_origin (origin); + if (gs_app_get_bundle_kind (origin) == AS_BUNDLE_KIND_CABINET) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to download firmware updates"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the source (e.g. "alt.fedoraproject.org") */ + suggested_details_message = g_strdup_printf (_("Unable to download firmware updates from %s"), + str_origin); + } else { + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the source (e.g. "alt.fedoraproject.org") */ + suggested_details_message = g_strdup_printf (_("Unable to download updates from %s"), + str_origin); + } + } + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: internet access required"); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: not enough disk space"); + if (origin != NULL) { + str_origin = gs_shell_get_title_from_origin (origin); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the source (e.g. "alt.fedoraproject.org") */ + suggested_details_message = g_strdup_printf (_("Unable to download updates from %s: not enough disk space"), + str_origin); + } + button = GS_TOAST_BUTTON_NO_SPACE; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_REQUIRED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: authentication required"); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: invalid authentication"); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: permission required"); + suggested_details_message = g_strdup (_("Unable to download updates: you do not have permission to install software")); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + if (GS_IS_PLUGIN_JOB_UPDATE_APPS (job) && + !(gs_plugin_job_update_apps_get_flags (GS_PLUGIN_JOB_UPDATE_APPS (job)) & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to download updates"); + } else { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to get list of updates"); + } + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, origin, suggested_details_text, suggested_details_message, &details_text, &details_message)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, details_message); + return TRUE; +} + +static gboolean +gs_shell_show_event_install (GsShell *shell, GsPluginEvent *event) +{ + GsApp *app = gs_plugin_event_get_app (event); + GsApp *origin = gs_plugin_event_get_origin (event); + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *details_text = NULL; + const gchar *details_message = NULL; + const gchar *suggested_details_text = NULL; + g_autofree gchar *suggested_details_message = NULL; + g_autofree gchar *tmp_toast_text = NULL; + g_autofree gchar *str_app = NULL; + g_autofree gchar *str_origin = NULL; + + str_app = gs_shell_get_title_from_app (app); + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_DOWNLOAD_FAILED)) { + toast_text = _("Unable to install: download failed"); + if (origin != NULL) { + str_origin = gs_shell_get_title_from_origin (origin); + /* TRANSLATORS: failure text for the in-app notification, + * where the first %s is the app name (e.g. "GIMP") and + * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: failed download from %s"), + str_app, str_origin); + } else { + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: download failed"), + str_app); + } + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) { + if (origin != NULL) { + toast_text = _("Unable to install: missing runtime"); + str_origin = gs_shell_get_title_from_origin (origin); + /* TRANSLATORS: failure text for the in-app notification, + * where the first %s is the app name (e.g. "GIMP") + * and the second %s is the name of the runtime, e.g. + * "GNOME SDK [flatpak.gnome.org]" */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: runtime %s unavailable"), + str_app, str_origin); + } else { + tmp_toast_text = g_strdup_printf (_("Unable to install %s"), str_app); + toast_text = tmp_toast_text; + } + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to install: internet access required"); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to install: invalid app format"); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + toast_text = _("Unable to install: not enough disk space"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: not enough disk space"), + str_app); + button = GS_TOAST_BUTTON_NO_SPACE; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_REQUIRED)) { + toast_text = _("Unable to install: authentication required"); + /* TRANSLATORS: failure text for the in-app notification */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: authentication required"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) { + toast_text = _("Unable to install: invalid authentication"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: invalid authentication"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) { + toast_text = _("Unable to install: permission required"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: permission required"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_REQUIRED)) { + toast_text = _("Unable to install: device must be plugged in"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "Dell XPS 13") */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: device must be plugged in"), + str_app); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW)) { + toast_text = _("Unable to install: low battery"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "Dell XPS 13") */ + suggested_details_message = g_strdup_printf (_("Unable to install %s: low battery"), + str_app); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + tmp_toast_text = g_strdup_printf (_("Unable to install %s"), str_app); + toast_text = tmp_toast_text; + suggested_details_message = g_strdup_printf (_("Unable to install %s"), str_app); + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, origin, suggested_details_text, suggested_details_message, &details_text, &details_message)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, details_message); + return TRUE; +} + +static gboolean +gs_shell_show_event_update (GsShell *shell, GsPluginEvent *event) +{ + GsApp *app = gs_plugin_event_get_app (event); + GsApp *origin = gs_plugin_event_get_origin (event); + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *details_text = NULL; + const gchar *details_message = NULL; + const gchar *suggested_details_text = NULL; + g_autofree gchar *suggested_details_message = NULL; + g_autofree gchar *tmp_toast_text = NULL; + g_autofree gchar *str_app = NULL; + g_autofree gchar *str_origin = NULL; + + /* ignore any errors from background downloads */ + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE)) + return TRUE; + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_DOWNLOAD_FAILED)) { + if (app != NULL && origin != NULL) { + str_app = gs_shell_get_title_from_app (app); + str_origin = gs_shell_get_title_from_origin (origin); + /* TRANSLATORS: failure text for the in-app notification, + * where the first %s is the app name (e.g. "GIMP") and + * the second %s is the origin, e.g. "Fedora" or + * "Fedora Project [fedoraproject.org]" */ + suggested_details_message = g_strdup_printf (_("Unable to update %s from %s: download failed"), + str_app, str_origin); + } else if (app != NULL) { + str_app = gs_shell_get_title_from_app (app); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to update %s: download failed"), + str_app); + } else if (origin != NULL) { + str_origin = gs_shell_get_title_from_origin (origin); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the origin, e.g. "Fedora" or + * "Fedora Project [fedoraproject.org]" */ + suggested_details_message = g_strdup_printf (_("Unable to install updates from %s: download failed"), + str_origin); + } + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: download failed"); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: internet access required"); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: not enough disk space"); + if (app != NULL) { + str_app = gs_shell_get_title_from_app (app); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to update %s: not enough disk space"), + str_app); + } + button = GS_TOAST_BUTTON_NO_SPACE; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_REQUIRED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: authentication required"); + if (app != NULL) { + str_app = gs_shell_get_title_from_app (app); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to update %s: authentication required"), + str_app); + } + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: invalid authentication"); + if (app != NULL) { + str_app = gs_shell_get_title_from_app (app); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to update %s: invalid authentication"), + str_app); + } + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: permission required"); + if (app != NULL) { + str_app = gs_shell_get_title_from_app (app); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to update %s: permission required"), + str_app); + } + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_REQUIRED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: device must be plugged in"); + if (app != NULL) { + str_app = gs_shell_get_title_from_app (app); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "Dell XPS 13") */ + suggested_details_message = g_strdup_printf (_("Unable to update %s: device must be plugged in"), + str_app); + } + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update: low battery"); + if (app != NULL) { + str_app = gs_shell_get_title_from_app (app); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "Dell XPS 13") */ + suggested_details_message = g_strdup_printf (_("Unable to update %s: low battery"), + str_app); + } + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + if (app != NULL) { + str_app = gs_shell_get_title_from_app (app); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + tmp_toast_text = g_strdup_printf (_("Unable to update %s"), str_app); + toast_text = tmp_toast_text; + } else { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to update"); + } + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, origin, suggested_details_text, suggested_details_message, &details_text, &details_message)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, details_message); + return TRUE; +} + +static gboolean +gs_shell_show_event_upgrade (GsShell *shell, GsPluginEvent *event) +{ + GsApp *app = gs_plugin_event_get_app (event); + GsApp *origin = gs_plugin_event_get_origin (event); + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *details_text = NULL; + const gchar *details_message = NULL; + const gchar *suggested_details_text = NULL; + g_autofree gchar *suggested_details_message = NULL; + g_autofree gchar *str_app = NULL; + g_autofree gchar *str_origin = NULL; + + str_app = g_strdup_printf ("%s %s", gs_app_get_name (app), gs_app_get_version (app)); + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_DOWNLOAD_FAILED)) { + if (origin != NULL) { + str_origin = gs_shell_get_title_from_origin (origin); + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade"); + /* TRANSLATORS: failure text for the in-app notification, + * where the first %s is the distro name (e.g. "Fedora 25") and + * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s from %s"), + str_app, str_origin); + } else { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade: download failed"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s: download failed"), + str_app); + } + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade: internet access required"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the distro name (e.g. "Fedora 25") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s: internet access required"), + str_app); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade: not enough disk space"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the distro name (e.g. "Fedora 25") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s: not enough disk space"), + str_app); + button = GS_TOAST_BUTTON_NO_SPACE; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_REQUIRED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade: authentication required"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the distro name (e.g. "Fedora 25") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s: authentication required"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade: invalid authentication"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the distro name (e.g. "Fedora 25") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s: invalid authentication"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade: permission required"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the distro name (e.g. "Fedora 25") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s: permission required"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_REQUIRED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade: device must be plugged in"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the distro name (e.g. "Fedora 25") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s: device must be plugged in"), + str_app); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade: low battery"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the distro name (e.g. "Fedora 25") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s: low battery"), + str_app); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to upgrade"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the distro name (e.g. "Fedora 25") */ + suggested_details_message = g_strdup_printf (_("Unable to upgrade to %s"), str_app); + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, origin, suggested_details_text, suggested_details_message, &details_text, &details_message)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, details_message); + return TRUE; +} + +static gboolean +gs_shell_show_event_remove (GsShell *shell, GsPluginEvent *event) +{ + GsApp *app = gs_plugin_event_get_app (event); + GsApp *origin = gs_plugin_event_get_origin (event); + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *details_text = NULL; + const gchar *details_message = NULL; + const gchar *suggested_details_text = NULL; + g_autofree gchar *suggested_details_message = NULL; + g_autofree gchar *tmp_toast_text = NULL; + g_autofree gchar *str_app = NULL; + + str_app = gs_shell_get_title_from_app (app); + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_REQUIRED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to uninstall: authentication required"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to uninstall %s: authentication required"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to uninstall: invalid authentication"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to uninstall %s: invalid authentication"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to uninstall: permission required"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to uninstall %s: permission required"), + str_app); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_REQUIRED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to uninstall: device must be plugged in"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to uninstall %s: device must be plugged in"), + str_app); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to uninstall: low battery"); + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + suggested_details_message = g_strdup_printf (_("Unable to uninstall %s: low battery"), + str_app); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + /* non-interactive generic */ + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE)) + return TRUE; + /* TRANSLATORS: failure text for the in-app notification, + * where the %s is the app name (e.g. "GIMP") */ + tmp_toast_text = g_strdup_printf (_("Unable to uninstall %s"), str_app); + toast_text = tmp_toast_text; + suggested_details_message = g_strdup (toast_text); + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, origin, suggested_details_text, suggested_details_message, &details_text, &details_message)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, details_message); + return TRUE; +} + +static gboolean +gs_shell_show_event_launch (GsShell *shell, GsPluginEvent *event) +{ + GsApp *app = gs_plugin_event_get_app (event); + GsApp *origin = gs_plugin_event_get_origin (event); + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *details_text = NULL; + const gchar *details_message = NULL; + const gchar *suggested_details_text = NULL; + g_autofree gchar *suggested_details_message = NULL; + g_autofree gchar *tmp_toast_text = NULL; + g_autofree gchar *str_app = NULL; + g_autofree gchar *str_origin = NULL; + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) { + if (app != NULL) + str_app = gs_shell_get_title_from_app (app); + if (str_app != NULL) { + /* TRANSLATORS: failure text for the in-app notification, where the '%s' is + replaced with the app name (e.g. "GIMP") */ + tmp_toast_text = g_strdup_printf (_("Unable to launch %s"), + str_app); + toast_text = tmp_toast_text; + } else { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Sorry, something went wrong"); + } + if (str_app != NULL && origin != NULL) { + str_origin = gs_shell_get_title_from_origin (origin); + /* TRANSLATORS: failure text for the in-app notification, + * where the first %s is the app name (e.g. "GIMP") + * and the second %s is the name of the runtime, e.g. + * "GNOME SDK [flatpak.gnome.org]" */ + suggested_details_message = g_strdup_printf (_("Unable to launch %s: %s is not installed"), + str_app, str_origin); + } else { + /* non-interactive generic */ + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE)) + return FALSE; + } + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Not enough disk space for operation"); + button = GS_TOAST_BUTTON_NO_SPACE; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + /* non-interactive generic */ + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE)) + return TRUE; + /* TRANSLATORS: we failed to get a proper error code */ + toast_text = _("Sorry, something went wrong"); + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, origin, suggested_details_text, suggested_details_message, &details_text, &details_message)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, details_message); + return TRUE; +} + +static gboolean +gs_shell_show_event_file_to_app (GsShell *shell, GsPluginEvent *event) +{ + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *suggested_details_text = NULL; + const gchar *details_text = NULL; + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to install: file type not supported"); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to install: authentication failed"); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Not enough disk space for operation"); + button = GS_TOAST_BUTTON_NO_SPACE; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + /* non-interactive generic */ + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE)) + return TRUE; + /* TRANSLATORS: we failed to get a proper error code */ + toast_text = _("Sorry, something went wrong"); + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, NULL, suggested_details_text, NULL, &details_text, NULL)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, NULL); + return TRUE; +} + +static gboolean +gs_shell_show_event_url_to_app (GsShell *shell, GsPluginEvent *event) +{ + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *suggested_details_text = NULL; + const gchar *details_text = NULL; + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to install"); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Unable to install: authentication failed"); + suggested_details_text = error->message; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Not enough disk space for operation"); + button = GS_TOAST_BUTTON_NO_SPACE; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + /* non-interactive generic */ + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE)) + return TRUE; + /* TRANSLATORS: we failed to get a proper error code */ + toast_text = _("Sorry, something went wrong"); + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, NULL, suggested_details_text, NULL, &details_text, NULL)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, NULL); + return TRUE; +} + +static gboolean +gs_shell_show_event_fallback (GsShell *shell, GsPluginEvent *event) +{ + GsApp *origin = gs_plugin_event_get_origin (event); + GsToastButton button = GS_TOAST_BUTTON_NONE; + const GError *error = gs_plugin_event_get_error (event); + const gchar *toast_text = NULL; + const gchar *suggested_details_text = NULL; + const gchar *details_text = NULL; + g_autofree gchar *tmp_toast_text = NULL; + g_autofree gchar *str_origin = NULL; + + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_DOWNLOAD_FAILED)) { + if (origin != NULL) { + str_origin = gs_shell_get_title_from_origin (origin); + /* TRANSLATORS: failure text for the in-app notification, + * the %s is the origin, e.g. "Fedora" or + * "Fedora Project [fedoraproject.org]" */ + tmp_toast_text = g_strdup_printf (_("Unable to contact %s"), + str_origin); + toast_text = tmp_toast_text; + suggested_details_text = error->message; + } else { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Sorry, something went wrong"); + suggested_details_text = error->message; + } + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + /* TRANSLATORS: failure text for the in-app notification */ + toast_text = _("Not enough disk space for operation"); + button = GS_TOAST_BUTTON_NO_SPACE; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_RESTART_REQUIRED)) { + /* TRANSLATORS: failure text for the in-app notification, where the 'Software' means this app, aka 'GNOME Software'. */ + toast_text = _("Restart Software to use new plugins"); + button = GS_TOAST_BUTTON_RESTART_REQUIRED; + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_REQUIRED)) { + /* TRANSLATORS: need to be connected to the AC power */ + toast_text = _("Device needs to be plugged in"); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW)) { + /* TRANSLATORS: not enough juice to do this safely */ + toast_text = _("Battery level is too low"); + } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* Do nothing. */ + } else { + /* non-interactive generic */ + if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE)) + return TRUE; + /* TRANSLATORS: we failed to get a proper error code */ + toast_text = _("Sorry, something went wrong"); + suggested_details_text = error->message; + } + + if (toast_text == NULL) + return FALSE; + + if (gs_shell_handle_events_more_info (shell, origin, suggested_details_text, NULL, &details_text, NULL)) + button = GS_TOAST_BUTTON_DETAILS_URI; + + /* show in-app notification */ + gs_shell_show_event_app_notify (shell, toast_text, button, details_text, NULL); + return TRUE; +} + +static gboolean +gs_shell_show_event (GsShell *shell, GsPluginEvent *event) +{ + const GError *error; + GsPluginAction action; + GsPluginJob *job; + + /* get error */ + error = gs_plugin_event_get_error (event); + if (error == NULL) + return FALSE; + + /* name and shame the plugin */ + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_TIMED_OUT)) { + gs_shell_show_event_app_notify (shell, error->message, + GS_TOAST_BUTTON_NONE, NULL, NULL); + return TRUE; + } + + job = gs_plugin_event_get_job (event); + if (GS_IS_PLUGIN_JOB_REFRESH_METADATA (job)) + return gs_shell_show_event_refresh (shell, event); + else if (GS_IS_PLUGIN_JOB_UPDATE_APPS (job) && + !(gs_plugin_job_update_apps_get_flags (GS_PLUGIN_JOB_UPDATE_APPS (job)) & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD)) + return gs_shell_show_event_refresh (shell, event); + else if (GS_IS_PLUGIN_JOB_UPDATE_APPS (job) && + !(gs_plugin_job_update_apps_get_flags (GS_PLUGIN_JOB_UPDATE_APPS (job)) & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY)) + return gs_shell_show_event_update (shell, event); + else if (GS_IS_PLUGIN_JOB_INSTALL_APPS (job)) + return gs_shell_show_event_install (shell, event); + else if (GS_IS_PLUGIN_JOB_UNINSTALL_APPS (job)) + return gs_shell_show_event_remove (shell, event); + else if (GS_IS_PLUGIN_JOB_DOWNLOAD_UPGRADE (job)) + return gs_shell_show_event_upgrade (shell, event); + + /* split up the events by action */ + action = gs_plugin_event_get_action (event); + switch (action) { + case GS_PLUGIN_ACTION_INSTALL_REPO: + case GS_PLUGIN_ACTION_ENABLE_REPO: + return gs_shell_show_event_install (shell, event); + case GS_PLUGIN_ACTION_REMOVE_REPO: + case GS_PLUGIN_ACTION_DISABLE_REPO: + return gs_shell_show_event_remove (shell, event); + case GS_PLUGIN_ACTION_LAUNCH: + return gs_shell_show_event_launch (shell, event); + case GS_PLUGIN_ACTION_FILE_TO_APP: + return gs_shell_show_event_file_to_app (shell, event); + case GS_PLUGIN_ACTION_URL_TO_APP: + return gs_shell_show_event_url_to_app (shell, event); + default: + break; + } + + /* capture some warnings every time */ + return gs_shell_show_event_fallback (shell, event); +} + +static void +gs_shell_rescan_events (GsShell *shell) +{ + g_autoptr(GsPluginEvent) event = NULL; + + /* find the first active event and show it */ + event = gs_plugin_loader_get_event_default (shell->plugin_loader); + if (event != NULL) { + GsPluginAction action = gs_plugin_event_get_action (event); + const GError *error = gs_plugin_event_get_error (event); + if (error != NULL && + !g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + if (error->domain == GS_PLUGIN_ERROR) { + g_debug ("%sinteractive action '%s' failed with error '%s': %s", + gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE) ? "" : "non-", + gs_plugin_action_to_string (action), + gs_plugin_error_to_string (error->code), + error->message); + } else { + g_debug ("%sinteractive action '%s' failed with error '%s::%d': %s", + gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE) ? "" : "non-", + gs_plugin_action_to_string (action), + g_quark_to_string (error->domain), + error->code, + error->message); + } + } + if (!gs_shell_show_event (shell, event)) { + if (error != NULL && + !g_error_matches (error, + GS_PLUGIN_ERROR, + GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, + G_IO_ERROR, + G_IO_ERROR_CANCELLED)) { + g_autofree gchar *msg = NULL; + g_autofree gchar *error_ident = NULL; + if (error->domain == GS_PLUGIN_ERROR) { + error_ident = g_strdup (gs_plugin_error_to_string (error->code)); + } else { + error_ident = g_strdup_printf ("%s::%d", + g_quark_to_string (error->domain), + error->code); + } + msg = g_strdup_printf ("not handling %sinteractive error '%s' for action '%s': %s", + gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE) ? "" : "non-", + error_ident, + gs_plugin_action_to_string (action), + error->message); + if (g_strcmp0 (BUILD_TYPE, "debug") == 0) + g_warning ("%s", msg); + else + g_debug ("%s", msg); + } + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INVALID); + return; + } + gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_VISIBLE); + return; + } +} + +static void +gs_shell_events_notify_cb (GsPluginLoader *plugin_loader, + GParamSpec *pspec, + GsShell *shell) +{ + gs_shell_rescan_events (shell); +} + +static void +gs_shell_setup_pages (GsShell *shell) +{ + for (gsize i = 0; i < G_N_ELEMENTS (shell->pages); i++) { + g_autoptr(GError) error = NULL; + GsPage *page = shell->pages[i]; + if (page != NULL && + !gs_page_setup (page, shell, + shell->plugin_loader, + shell->cancellable, + &error)) { + g_warning ("Failed to setup panel: %s", error->message); + } + } +} + +static void +updates_page_notify_counter_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GsPage *page = GS_PAGE (obj); + GsShell *shell = GS_SHELL (user_data); + AdwViewStackPage *stack_page; + gboolean needs_attention; + + /* Update the needs-attention child property of the page in the + * AdwViewStack. There’s no need to account for whether it’s the currently + * visible page, as the CSS rules do that for us. This can’t be a simple + * property binding, though, as it’s a binding between an object + * property and a child property. */ + needs_attention = (gs_page_get_counter (page) > 0); + + stack_page = adw_view_stack_get_page (shell->stack_main, GTK_WIDGET (page)); + adw_view_stack_page_set_needs_attention (stack_page, needs_attention); +} + +static void +category_page_app_clicked_cb (GsCategoryPage *page, + GsApp *app, + gpointer user_data) +{ + GsShell *shell = GS_SHELL (user_data); + + gs_shell_show_app (shell, app); +} + +static void +details_page_app_clicked_cb (GsDetailsPage *page, + GsApp *app, + gpointer user_data) +{ + GsShell *shell = GS_SHELL (user_data); + + gs_shell_show_app (shell, app); +} + +/** + * gs_shell_is_running: + * @self: a #GsShell + * + * Check whether the @self has been already set up, which roughly means + * the gs_shell_setup() has been called. + * + * Returns: whether the @self has been already set up + * + * Since: 48 + **/ +gboolean +gs_shell_is_running (GsShell *self) +{ + return self->plugin_loader != NULL; +} + +void +gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *cancellable) +{ + GsOdrsProvider *odrs_provider; + + g_return_if_fail (GS_IS_SHELL (shell)); + + shell->plugin_loader = g_object_ref (plugin_loader); + g_signal_connect_object (shell->plugin_loader, "notify::events", + G_CALLBACK (gs_shell_events_notify_cb), + shell, 0); + g_signal_connect_object (shell->plugin_loader, "notify::network-metered", + G_CALLBACK (gs_shell_network_metered_notify_cb), + shell, 0); + g_signal_connect_object (shell->plugin_loader, "basic-auth-start", + G_CALLBACK (gs_shell_basic_auth_start_cb), + shell, 0); + g_signal_connect_object (shell->plugin_loader, "ask-untrusted", + G_CALLBACK (gs_shell_ask_untrusted_cb), + shell, 0); + + g_object_bind_property (shell->plugin_loader, "allow-updates", + shell->pages[GS_SHELL_MODE_UPDATES], "visible", + G_BINDING_SYNC_CREATE); + + shell->cancellable = g_object_ref (cancellable); + + shell->settings = g_settings_new ("org.gnome.software"); + + /* set up pages */ + gs_shell_setup_pages (shell); + + /* set up the metered data info bar and mogwai */ + g_signal_connect (shell->settings, "changed::download-updates", + (GCallback) gs_shell_download_updates_changed_cb, shell); + + odrs_provider = gs_plugin_loader_get_odrs_provider (shell->plugin_loader); + gs_details_page_set_odrs_provider (GS_DETAILS_PAGE (shell->pages[GS_SHELL_MODE_DETAILS]), odrs_provider); + + /* coldplug */ + gs_shell_rescan_events (shell); + + if (g_settings_get_boolean (shell->settings, "download-updates")) { + /* show loading page, which triggers the initial refresh */ + gs_shell_change_mode (shell, GS_SHELL_MODE_LOADING, NULL, TRUE); + } else { + g_debug ("Skipped refresh of the repositories due to 'download-updates' disabled"); + initial_refresh_done (GS_LOADING_PAGE (shell->pages[GS_SHELL_MODE_LOADING]), shell); + + if (g_settings_get_boolean (shell->settings, "first-run")) + g_settings_set_boolean (shell->settings, "first-run", FALSE); + } + + if (shell->activate_after_setup) { + shell->activate_after_setup = FALSE; + gs_shell_activate (shell); + } +} + +void +gs_shell_reset_state (GsShell *shell) +{ + /* reset to overview, unless we're in the loading state which advances + * to overview on its own */ + if (gs_shell_get_mode (shell) != GS_SHELL_MODE_LOADING) + gs_shell_change_mode (shell, GS_SHELL_MODE_OVERVIEW, NULL, TRUE); + + gs_shell_clean_back_entry_stack (shell); +} + +void +gs_shell_set_mode (GsShell *shell, GsShellMode mode) +{ + gs_shell_change_mode (shell, mode, NULL, TRUE); +} + +GsShellMode +gs_shell_get_mode (GsShell *shell) +{ + const gchar *name; + + if (g_strcmp0 (adw_view_stack_get_visible_child_name (shell->stack_loading), "loading") == 0) + return GS_SHELL_MODE_LOADING; + +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + if (g_strcmp0 (adw_leaflet_get_visible_child_name (shell->details_leaflet), "details") == 0) + return GS_SHELL_MODE_DETAILS; + + if (g_strcmp0 (adw_leaflet_get_visible_child_name (shell->main_leaflet), "main") == 0) + name = adw_view_stack_get_visible_child_name (shell->stack_main); + else + name = adw_view_stack_get_visible_child_name (shell->stack_sub); +G_GNUC_END_IGNORE_DEPRECATIONS + + for (gsize i = 0; i < G_N_ELEMENTS (page_name); i++) + if (g_strcmp0 (page_name[i], name) == 0) + return i; + + g_assert_not_reached (); +} + +const gchar * +gs_shell_get_mode_string (GsShell *shell) +{ + GsShellMode mode = gs_shell_get_mode (shell); + return page_name[mode]; +} + +void +gs_shell_install (GsShell *shell, GsApp *app, GsShellInteraction interaction) +{ + save_back_entry (shell); + gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, + (gpointer) app, TRUE); + gs_page_install_app (shell->pages[GS_SHELL_MODE_DETAILS], app, interaction, shell->cancellable); +} + +void +gs_shell_uninstall (GsShell *shell, GsApp *app) +{ + save_back_entry (shell); + gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, (gpointer) app, TRUE); + gs_page_remove_app (shell->pages[GS_SHELL_MODE_DETAILS], app, shell->cancellable); +} + +void +gs_shell_show_installed_updates (GsShell *shell) +{ + GtkWidget *dialog; + + dialog = gs_update_dialog_new (shell->plugin_loader); + + adw_dialog_present (ADW_DIALOG (dialog), GTK_WIDGET (shell)); +} + +void +gs_shell_show_sources (GsShell *shell) +{ + GtkWidget *dialog; + + dialog = gs_repos_dialog_new (shell->plugin_loader); + adw_dialog_present (ADW_DIALOG (dialog), GTK_WIDGET (shell)); +} + +void +gs_shell_show_prefs (GsShell *shell) +{ + GtkWidget *dialog; + + dialog = gs_prefs_dialog_new (shell->plugin_loader); + adw_dialog_present (ADW_DIALOG (dialog), GTK_WIDGET (shell)); +} + +void +gs_shell_show_app (GsShell *shell, GsApp *app) +{ + save_back_entry (shell); + gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, app, TRUE); + gs_shell_activate (shell); +} + +void +gs_shell_show_category (GsShell *shell, GsCategory *category) +{ + save_back_entry (shell); + gs_shell_change_mode (shell, GS_SHELL_MODE_CATEGORY, category, TRUE); +} + +void gs_shell_show_extras_search (GsShell *shell, const gchar *mode, gchar **resources, const gchar *desktop_id, const gchar *ident) +{ + save_back_entry (shell); + gs_extras_page_search (GS_EXTRAS_PAGE (shell->pages[GS_SHELL_MODE_EXTRAS]), mode, resources, desktop_id, ident); + gs_shell_change_mode (shell, GS_SHELL_MODE_EXTRAS, NULL, TRUE); + gs_shell_activate (shell); +} + +void +gs_shell_show_search (GsShell *shell, const gchar *search) +{ + save_back_entry (shell); + gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, + (gpointer) search, TRUE); +} + +void +gs_shell_show_local_file (GsShell *shell, GFile *file) +{ + g_autoptr(GsApp) app = gs_app_new (NULL); + save_back_entry (shell); + gs_app_set_local_file (app, file); + gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, + (gpointer) app, TRUE); + gs_shell_activate (shell); +} + +/** + * gs_shell_show_metainfo: + * @shell: a #GsShell + * @file: path to a metainfo file to display + * + * Open a metainfo file and display it on the details page as if it were + * published in a repository configured on the system. + * + * This is intended for app developers to be able to test their metainfo files + * locally. + * + * Since: 42 + */ +void +gs_shell_show_metainfo (GsShell *shell, GFile *file) +{ + g_autoptr(GsApp) app = gs_app_new (NULL); + + g_return_if_fail (GS_IS_SHELL (shell)); + g_return_if_fail (G_IS_FILE (file)); + save_back_entry (shell); + gs_app_set_metadata (app, "GnomeSoftware::show-metainfo", "1"); + gs_app_set_local_file (app, file); + gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, + (gpointer) app, TRUE); + gs_shell_activate (shell); +} + +void +gs_shell_show_search_result (GsShell *shell, const gchar *id, const gchar *search) +{ + save_back_entry (shell); + gs_search_page_set_appid_to_show (GS_SEARCH_PAGE (shell->pages[GS_SHELL_MODE_SEARCH]), id); + gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, + (gpointer) search, TRUE); +} + +void +gs_shell_show_uri (GsShell *shell, const gchar *url) +{ + gs_show_uri (GTK_WINDOW (shell), url); +} + +/** + * gs_shell_get_is_narrow: + * @shell: a #GsShell + * + * Get the value of #GsShell:is-narrow. + * + * Returns: %TRUE if the window is in narrow mode, %FALSE otherwise + * + * Since: 41 + */ +gboolean +gs_shell_get_is_narrow (GsShell *shell) +{ + g_return_val_if_fail (GS_IS_SHELL (shell), FALSE); + + return shell->is_narrow; +} + +static gint +gs_shell_get_allocation_width (GsShell *self) +{ + return self->allocation_width; +} + +static void +gs_shell_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GsShell *shell = GS_SHELL (object); + + switch ((GsShellProperty) prop_id) { + case PROP_IS_NARROW: + g_value_set_boolean (value, gs_shell_get_is_narrow (shell)); + break; + case PROP_ALLOCATION_WIDTH: + g_value_set_int (value, gs_shell_get_allocation_width (shell)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_shell_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + switch ((GsShellProperty) prop_id) { + case PROP_IS_NARROW: + case PROP_ALLOCATION_WIDTH: + /* Read only. */ + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_shell_dispose (GObject *object) +{ + GsShell *shell = GS_SHELL (object); + + g_clear_object (&shell->sub_page_header_title_binding); + + if (shell->back_entry_stack != NULL) { + g_queue_free_full (shell->back_entry_stack, (GDestroyNotify) free_back_entry); + shell->back_entry_stack = NULL; + } + g_clear_object (&shell->cancellable); + g_clear_object (&shell->plugin_loader); + g_clear_object (&shell->header_start_widget); + g_clear_object (&shell->header_end_widget); + g_clear_object (&shell->sub_header_end_widget); + g_clear_object (&shell->page); + g_clear_object (&shell->settings); + +#ifdef HAVE_MOGWAI + if (shell->scheduler != NULL) { + if (shell->scheduler_invalidated_handler > 0) + g_signal_handler_disconnect (shell->scheduler, + shell->scheduler_invalidated_handler); + + if (shell->scheduler_held) + mwsc_scheduler_release_async (shell->scheduler, + NULL, + scheduler_release_cb, + g_object_ref (shell)); + else + g_clear_object (&shell->scheduler); + } +#endif /* HAVE_MOGWAI */ + + G_OBJECT_CLASS (gs_shell_parent_class)->dispose (object); +} + +static gboolean +allocation_changed_cb (gpointer user_data) +{ + GsShell *shell = GS_SHELL (user_data); + gint width; + gboolean is_narrow; + + width = gtk_widget_get_width (GTK_WIDGET (shell)); + is_narrow = width <= NARROW_WIDTH_THRESHOLD; + + if (shell->is_narrow != is_narrow) { + shell->is_narrow = is_narrow; + g_object_notify_by_pspec (G_OBJECT (shell), obj_props[PROP_IS_NARROW]); + } + + if (shell->allocation_width != width) { + shell->allocation_width = width; + g_object_notify_by_pspec (G_OBJECT (shell), obj_props[PROP_ALLOCATION_WIDTH]); + } + + shell->allocation_changed_cb_id = 0; + + if (is_narrow) + gtk_widget_add_css_class (GTK_WIDGET (shell), "narrow"); + else + gtk_widget_remove_css_class (GTK_WIDGET (shell), "narrow"); + + return G_SOURCE_REMOVE; +} + +static void +gs_shell_size_allocate (GtkWidget *widget, + gint width, + gint height, + gint baseline) +{ + GsShell *shell = GS_SHELL (widget); + + GTK_WIDGET_CLASS (gs_shell_parent_class)->size_allocate (widget, + width, + height, + baseline); + + /* Delay updating is-narrow so children can adapt to it, which isn't + * possible during the widget's allocation phase as it would break their + * size request. + */ + if (shell->allocation_changed_cb_id == 0) + shell->allocation_changed_cb_id = g_idle_add (allocation_changed_cb, shell); +} + +static void +gs_shell_class_init (GsShellClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_shell_get_property; + object_class->set_property = gs_shell_set_property; + object_class->dispose = gs_shell_dispose; + + widget_class->size_allocate = gs_shell_size_allocate; + + /** + * GsShell:is-narrow: + * + * Whether the window is in narrow mode. + * + * Pages can track this property to adapt to the available width. + * + * Since: 41 + */ + obj_props[PROP_IS_NARROW] = + g_param_spec_boolean ("is-narrow", NULL, NULL, + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GsShell:allocation-width: + * + * The last allocation width for the window. + * + * The pages can track this property, possibly in combination with the #GsShell:is-narrow, + * to adapt its content to the available width. + * + * Since: 43 + */ + obj_props[PROP_ALLOCATION_WIDTH] = + g_param_spec_int ("allocation-width", NULL, NULL, + G_MININT, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + signals [SIGNAL_LOADED] = + g_signal_new ("loaded", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-shell.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsShell, main_header); + gtk_widget_class_bind_template_child (widget_class, GsShell, main_leaflet); + gtk_widget_class_bind_template_child (widget_class, GsShell, details_header); + gtk_widget_class_bind_template_child (widget_class, GsShell, details_leaflet); + gtk_widget_class_bind_template_child (widget_class, GsShell, stack_loading); + gtk_widget_class_bind_template_child (widget_class, GsShell, stack_main); + gtk_widget_class_bind_template_child (widget_class, GsShell, stack_sub); + gtk_widget_class_bind_template_child (widget_class, GsShell, updates_paused_banner); + gtk_widget_class_bind_template_child (widget_class, GsShell, search_button); + gtk_widget_class_bind_template_child (widget_class, GsShell, entry_search); + gtk_widget_class_bind_template_child (widget_class, GsShell, search_bar); + gtk_widget_class_bind_template_child (widget_class, GsShell, button_back); + gtk_widget_class_bind_template_child (widget_class, GsShell, button_back2); + gtk_widget_class_bind_template_child (widget_class, GsShell, toast_overlay); + gtk_widget_class_bind_template_child (widget_class, GsShell, primary_menu); + gtk_widget_class_bind_template_child (widget_class, GsShell, sub_header); + gtk_widget_class_bind_template_child (widget_class, GsShell, sub_page_header_title); + + gtk_widget_class_bind_template_child_full (widget_class, "overview_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_OVERVIEW])); + gtk_widget_class_bind_template_child_full (widget_class, "updates_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_UPDATES])); + gtk_widget_class_bind_template_child_full (widget_class, "installed_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_INSTALLED])); + gtk_widget_class_bind_template_child_full (widget_class, "loading_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_LOADING])); + gtk_widget_class_bind_template_child_full (widget_class, "search_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_SEARCH])); + gtk_widget_class_bind_template_child_full (widget_class, "details_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_DETAILS])); + gtk_widget_class_bind_template_child_full (widget_class, "category_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_CATEGORY])); + gtk_widget_class_bind_template_child_full (widget_class, "extras_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_EXTRAS])); + + gtk_widget_class_bind_template_callback (widget_class, gs_shell_main_window_mapped_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_shell_main_window_realized_cb); + gtk_widget_class_bind_template_callback (widget_class, main_window_closed_cb); + gtk_widget_class_bind_template_callback (widget_class, window_key_pressed_cb); + gtk_widget_class_bind_template_callback (widget_class, window_keypress_handler); + gtk_widget_class_bind_template_callback (widget_class, window_button_pressed_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_shell_details_back_button_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_shell_back_button_cb); + gtk_widget_class_bind_template_callback (widget_class, gs_overview_page_button_cb); + gtk_widget_class_bind_template_callback (widget_class, updates_page_notify_counter_cb); + gtk_widget_class_bind_template_callback (widget_class, category_page_app_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, search_bar_search_mode_enabled_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, search_changed_handler); + gtk_widget_class_bind_template_callback (widget_class, stack_notify_visible_child_cb); + gtk_widget_class_bind_template_callback (widget_class, initial_refresh_done); + gtk_widget_class_bind_template_callback (widget_class, gs_shell_details_page_metainfo_loaded_cb); + gtk_widget_class_bind_template_callback (widget_class, details_page_app_clicked_cb); + + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_q, GDK_CONTROL_MASK, "window.close", NULL); +} + +static void +gs_shell_init (GsShell *shell) +{ + g_type_ensure (GS_TYPE_CATEGORY_PAGE); + g_type_ensure (GS_TYPE_DETAILS_PAGE); + g_type_ensure (GS_TYPE_EXTRAS_PAGE); + g_type_ensure (GS_TYPE_INSTALLED_PAGE); + g_type_ensure (GS_TYPE_LOADING_PAGE); + g_type_ensure (GS_TYPE_OVERVIEW_PAGE); + g_type_ensure (GS_TYPE_SEARCH_PAGE); + g_type_ensure (GS_TYPE_UPDATES_PAGE); + g_type_ensure (GS_TYPE_UPDATES_PAUSED_BANNER); + + gtk_widget_init_template (GTK_WIDGET (shell)); + + gtk_search_bar_connect_entry (GTK_SEARCH_BAR (shell->search_bar), GTK_EDITABLE (shell->entry_search)); + + shell->back_entry_stack = g_queue_new (); +} + +GsShell * +gs_shell_new (void) +{ + return GS_SHELL (g_object_new (GS_TYPE_SHELL, NULL)); +} + +GsAppQueryLicenseType +gs_shell_get_query_license_type (GsShell *self) +{ + g_return_val_if_fail (GS_IS_SHELL (self), GS_APP_QUERY_LICENSE_ANY); + + if (g_settings_get_boolean (self->settings, "show-only-free-apps")) + return GS_APP_QUERY_LICENSE_FOSS; + return GS_APP_QUERY_LICENSE_ANY; +} + +GsAppQueryDeveloperVerifiedType +gs_shell_get_query_developer_verified_type (GsShell *self) +{ + g_return_val_if_fail (GS_IS_SHELL (self), GS_APP_QUERY_DEVELOPER_VERIFIED_ANY); + + if (g_settings_get_boolean (self->settings, "show-only-verified-apps")) + return GS_APP_QUERY_DEVELOPER_VERIFIED_ONLY; + return GS_APP_QUERY_DEVELOPER_VERIFIED_ANY; +} diff --git a/src/gs-shell.h b/src/gs-shell.h new file mode 100644 index 0000000..053ecac --- /dev/null +++ b/src/gs-shell.h @@ -0,0 +1,94 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2014-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_SHELL (gs_shell_get_type ()) + +G_DECLARE_FINAL_TYPE (GsShell, gs_shell, GS, SHELL, AdwApplicationWindow) + +typedef enum { + GS_SHELL_MODE_UNKNOWN, + GS_SHELL_MODE_OVERVIEW, + GS_SHELL_MODE_INSTALLED, + GS_SHELL_MODE_SEARCH, + GS_SHELL_MODE_UPDATES, + GS_SHELL_MODE_DETAILS, + GS_SHELL_MODE_CATEGORY, + GS_SHELL_MODE_EXTRAS, + GS_SHELL_MODE_LOADING, + GS_SHELL_MODE_LAST +} GsShellMode; + +typedef enum { + GS_SHELL_INTERACTION_NONE = (0u), + GS_SHELL_INTERACTION_NOTIFY = (1u << 0), + GS_SHELL_INTERACTION_FULL = (1u << 1) | GS_SHELL_INTERACTION_NOTIFY, + GS_SHELL_INTERACTION_LAST +} GsShellInteraction; + +GsShell *gs_shell_new (void); +void gs_shell_activate (GsShell *shell); +void gs_shell_change_mode (GsShell *shell, + GsShellMode mode, + gpointer data, + gboolean scroll_up); +void gs_shell_reset_state (GsShell *shell); +void gs_shell_set_mode (GsShell *shell, + GsShellMode mode); +GsShellMode gs_shell_get_mode (GsShell *shell); +const gchar *gs_shell_get_mode_string (GsShell *shell); +void gs_shell_install (GsShell *shell, + GsApp *app, + GsShellInteraction interaction); +void gs_shell_uninstall (GsShell *shell, + GsApp *app); +void gs_shell_show_installed_updates(GsShell *shell); +void gs_shell_show_sources (GsShell *shell); +void gs_shell_show_prefs (GsShell *shell); +void gs_shell_show_app (GsShell *shell, + GsApp *app); +void gs_shell_show_category (GsShell *shell, + GsCategory *category); +void gs_shell_show_search (GsShell *shell, + const gchar *search); +void gs_shell_show_local_file (GsShell *shell, + GFile *file); +void gs_shell_show_search_result (GsShell *shell, + const gchar *id, + const gchar *search); +void gs_shell_show_extras_search (GsShell *shell, + const gchar *mode, + gchar **resources, + const gchar *desktop_id, + const gchar *ident); +void gs_shell_show_uri (GsShell *shell, + const gchar *url); +gboolean gs_shell_is_running (GsShell *self); +void gs_shell_setup (GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable); +void gs_shell_show_notification (GsShell *shell, + const gchar *title); +gboolean gs_shell_get_is_narrow (GsShell *shell); +void gs_shell_show_metainfo (GsShell *shell, + GFile *file); +GsAppQueryLicenseType gs_shell_get_query_license_type (GsShell *self); +GsAppQueryDeveloperVerifiedType + gs_shell_get_query_developer_verified_type + (GsShell *self); + +G_END_DECLS diff --git a/src/gs-shell.ui b/src/gs-shell.ui new file mode 100644 index 0000000..3c985aa --- /dev/null +++ b/src/gs-shell.ui @@ -0,0 +1,408 @@ + + + + + +
          + + _Software Repositories + app.sources + action-disabled + +
          +
          + + _Preferences + app.prefs + + + _Keyboard Shortcuts + win.show-help-overlay + + + _About Software + app.about + +
          +
          + + +
          diff --git a/src/gs-star-image.c b/src/gs-star-image.c new file mode 100644 index 0000000..82b915f --- /dev/null +++ b/src/gs-star-image.c @@ -0,0 +1,242 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-star-image + * @title: GsStarImage + * @stability: Unstable + * @short_description: Draw a star image, which can be partially filled + * + * Depending on the #GsStarImage:fraction property, the starred image can be + * drawn as filled only partially or fully or not at all, with the non-starred + * image taking the rest of the space up. + * + * ## CSS nodes + * + * ``` + * star-image + * ├── image.starred + * ╰── image.non-starred + * ``` + * + * Since: 41 + */ + +#include "config.h" + +#include "gs-common.h" +#include "gs-star-image.h" + +#include + +struct _GsStarImage +{ + GtkWidget parent_instance; + + GtkWidget *starred; + GtkWidget *non_starred; + gdouble fraction; + gdouble pixel_size; +}; + +G_DEFINE_TYPE (GsStarImage, gs_star_image, GTK_TYPE_WIDGET) + +enum { + PROP_FRACTION = 1, + PROP_PIXEL_SIZE, +}; + +/* Floating points are imprecise, we can't use `<= 0.0` and `>= 1.0` */ +#define FRACTION_IS_MIN(f) (f < 0.01) +#define FRACTION_IS_MAX(f) (f > 0.99) + +static void +gs_star_image_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + switch (param_id) { + case PROP_FRACTION: + g_value_set_double (value, gs_star_image_get_fraction (GS_STAR_IMAGE (object))); + break; + case PROP_PIXEL_SIZE: + g_value_set_int (value, gs_star_image_get_pixel_size (GS_STAR_IMAGE (object))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +gs_star_image_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (param_id) { + case PROP_FRACTION: + gs_star_image_set_fraction (GS_STAR_IMAGE (object), g_value_get_double (value)); + break; + case PROP_PIXEL_SIZE: + gs_star_image_set_pixel_size (GS_STAR_IMAGE (object), g_value_get_int (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +gs_star_image_dispose (GObject *object) +{ + gs_widget_remove_all (GTK_WIDGET (object), NULL); + + G_OBJECT_CLASS (gs_star_image_parent_class)->dispose (object); +} + +static void +gs_star_image_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) +{ + GsStarImage *self = GS_STAR_IMAGE (widget); + + if (FRACTION_IS_MIN (self->fraction)) { + gtk_widget_snapshot_child (widget, self->non_starred, snapshot); + } else if (FRACTION_IS_MAX (self->fraction)) { + gtk_widget_snapshot_child (widget, self->starred, snapshot); + } else { + int width, height; + int starred_width; + + width = gtk_widget_get_width (widget); + height = gtk_widget_get_height (widget); + starred_width = width * self->fraction; + + if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL) + gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT(width - starred_width, 0, starred_width, height)); + else + gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT(0, 0, starred_width, height)); + gtk_widget_snapshot_child (widget, self->starred, snapshot); + gtk_snapshot_pop (snapshot); + + if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL) + gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT(0, 0, width - starred_width, height)); + else + gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT(starred_width, 0, width - starred_width, height)); + gtk_widget_snapshot_child (widget, self->non_starred, snapshot); + gtk_snapshot_pop (snapshot); + } +} + +static void +gs_star_image_class_init (GsStarImageClass *klass) +{ + GObjectClass *object_class; + GtkWidgetClass *widget_class; + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = gs_star_image_get_property; + object_class->set_property = gs_star_image_set_property; + object_class->dispose = gs_star_image_dispose; + + widget_class = GTK_WIDGET_CLASS (klass); + widget_class->snapshot = gs_star_image_snapshot; + + g_object_class_install_property (object_class, + PROP_FRACTION, + g_param_spec_double ("fraction", NULL, NULL, + 0.0, 1.0, 1.0, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY)); + + g_object_class_install_property (object_class, + PROP_PIXEL_SIZE, + g_param_spec_int ("pixel-size", NULL, NULL, + -1, G_MAXINT, -1, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY)); + + gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_METER); + gtk_widget_class_set_css_name (widget_class, "star-image"); + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); +} + +static void +gs_star_image_init (GsStarImage *self) +{ + self->starred = gtk_image_new_from_icon_name ("starred-symbolic"); + gtk_widget_set_child_visible (self->starred, TRUE); + gtk_widget_set_parent (self->starred, GTK_WIDGET (self)); + gtk_widget_add_css_class (self->starred, "starred"); + + self->non_starred = gtk_image_new_from_icon_name ("starred-symbolic"); + gtk_widget_set_child_visible (self->non_starred, FALSE); + gtk_widget_set_parent (self->non_starred, GTK_WIDGET (self)); + gtk_widget_add_css_class (self->non_starred, "non-starred"); + + self->fraction = 1.0; +} + +GtkWidget * +gs_star_image_new (void) +{ + return g_object_new (GS_TYPE_STAR_IMAGE, NULL); +} + +void +gs_star_image_set_fraction (GsStarImage *self, + gdouble fraction) +{ + g_return_if_fail (GS_IS_STAR_IMAGE (self)); + + if (self->fraction == fraction) + return; + + self->fraction = fraction; + + gtk_widget_set_child_visible (self->starred, !FRACTION_IS_MIN (self->fraction)); + gtk_widget_set_child_visible (self->non_starred, !FRACTION_IS_MAX (self->fraction)); + + g_object_notify (G_OBJECT (self), "fraction"); + + gtk_widget_queue_draw (GTK_WIDGET (self)); +} + +gdouble +gs_star_image_get_fraction (GsStarImage *self) +{ + g_return_val_if_fail (GS_IS_STAR_IMAGE (self), -1.0); + + return self->fraction; +} + +void +gs_star_image_set_pixel_size (GsStarImage *self, + gint pixel_size) +{ + g_return_if_fail (GS_IS_STAR_IMAGE (self)); + g_return_if_fail (pixel_size >= -1); + + if (self->pixel_size == pixel_size) + return; + + self->pixel_size = pixel_size; + + gtk_image_set_pixel_size (GTK_IMAGE (self->starred), pixel_size); + gtk_image_set_pixel_size (GTK_IMAGE (self->non_starred), pixel_size); + + g_object_notify (G_OBJECT (self), "pixel-size"); + + gtk_widget_queue_resize (GTK_WIDGET (self)); +} + +gint +gs_star_image_get_pixel_size (GsStarImage *self) +{ + g_return_val_if_fail (GS_IS_STAR_IMAGE (self), -1); + + return self->pixel_size; +} diff --git a/src/gs-star-image.h b/src/gs-star-image.h new file mode 100644 index 0000000..d8689e1 --- /dev/null +++ b/src/gs-star-image.h @@ -0,0 +1,25 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define GS_TYPE_STAR_IMAGE (gs_star_image_get_type ()) + +G_DECLARE_FINAL_TYPE (GsStarImage, gs_star_image, GS, STAR_IMAGE, GtkWidget) + +GtkWidget * gs_star_image_new (void); +void gs_star_image_set_fraction (GsStarImage *self, + gdouble fraction); +gdouble gs_star_image_get_fraction (GsStarImage *self); +void gs_star_image_set_pixel_size (GsStarImage *self, + gint fraction); +gint gs_star_image_get_pixel_size (GsStarImage *self); + +G_END_DECLS diff --git a/src/gs-star-widget.c b/src/gs-star-widget.c new file mode 100644 index 0000000..8dddc40 --- /dev/null +++ b/src/gs-star-widget.c @@ -0,0 +1,392 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2014-2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-common.h" +#include "gs-star-image.h" +#include "gs-star-widget.h" + +#define STAR_SPACING 2 /* pixels */ + +typedef struct +{ + gboolean interactive; + gint selected_rating; + gint rating; + guint icon_size; + GtkWidget *box1; + GtkWidget *images[5]; +} GsStarWidgetPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsStarWidget, gs_star_widget, GTK_TYPE_WIDGET) + +typedef enum { + PROP_ICON_SIZE = 1, + PROP_INTERACTIVE, + PROP_RATING, +} GsStarWidgetProperty; + +enum { + RATING_CHANGED, + SIGNAL_LAST +}; + +static GParamSpec *properties[PROP_RATING + 1] = { 0, }; +static guint signals [SIGNAL_LAST] = { 0 }; + +const gint rate_to_star[] = {20, 40, 60, 80, 100, -1}; + +static void gs_star_widget_refresh (GsStarWidget *star); + +gint +gs_star_widget_get_rating (GsStarWidget *star) +{ + GsStarWidgetPrivate *priv; + g_return_val_if_fail (GS_IS_STAR_WIDGET (star), -1); + priv = gs_star_widget_get_instance_private (star); + return priv->rating; +} + +void +gs_star_widget_set_icon_size (GsStarWidget *star, guint pixel_size) +{ + GsStarWidgetPrivate *priv; + g_return_if_fail (GS_IS_STAR_WIDGET (star)); + priv = gs_star_widget_get_instance_private (star); + + if (priv->icon_size == pixel_size) + return; + + priv->icon_size = pixel_size; + g_object_notify_by_pspec (G_OBJECT (star), properties[PROP_ICON_SIZE]); + gs_star_widget_refresh (star); +} + +static void +gs_star_widget_button_clicked_cb (GtkButton *button, GsStarWidget *star) +{ + GsStarWidgetPrivate *priv; + gint rating; + + priv = gs_star_widget_get_instance_private (star); + if (!priv->interactive) + return; + + rating = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), + "GsStarWidget::value")); + gs_star_widget_set_rating (star, rating); + g_signal_emit (star, signals[RATING_CHANGED], 0, priv->rating); + priv->selected_rating = priv->rating; +} + +static void +gs_star_widget_button_entered_cb (GtkEventControllerMotion *controller, + gdouble x, gdouble y, + GsStarWidget *star) +{ + GsStarWidgetPrivate *priv; + gint rating; + GtkWidget *button; + + priv = gs_star_widget_get_instance_private (star); + if (!priv->interactive) + return; + + button = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (controller)); + rating = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), + "GsStarWidget::value")); + gs_star_widget_set_rating (star, rating); + g_signal_emit (star, signals[RATING_CHANGED], 0, priv->rating); +} + +static void +gs_star_widget_button_left_cb (GtkEventControllerMotion *controller, + gdouble x, gdouble y, + GsStarWidget *star) +{ + GsStarWidgetPrivate *priv; + + priv = gs_star_widget_get_instance_private (star); + if (!priv->interactive) + return; + + gs_star_widget_set_rating (star, priv->selected_rating > 0 ? priv->selected_rating: 0); + g_signal_emit (star, signals[RATING_CHANGED], 0, priv->rating); +} + +/* Round to one digit, the same as the GsReviewHistogram */ +#define GS_ROUND(x) (round (((gdouble) (x)) * 10.0) / 10.0) + +/* Update the star styles to display the new rating */ +static void +gs_star_widget_refresh_rating (GsStarWidget *star) +{ + GsStarWidgetPrivate *priv = gs_star_widget_get_instance_private (star); + + if (!gtk_widget_get_realized (GTK_WIDGET (star))) + return; + + for (guint i = 0; i < G_N_ELEMENTS (priv->images); i++) { + GtkWidget *im = GTK_WIDGET (priv->images[i]); + gdouble fraction; + + if (priv->rating >= rate_to_star[i]) + fraction = 1.0; + else if (!i) + fraction = GS_ROUND (priv->rating / 20.0); + else if (priv->rating > rate_to_star[i - 1]) + fraction = GS_ROUND ((priv->rating - rate_to_star[i - 1]) / 20.0); + else + fraction = 0.0; + + gs_star_image_set_fraction (GS_STAR_IMAGE (im), fraction); + } +} + +static void +gs_star_widget_refresh (GsStarWidget *star) +{ + GsStarWidgetPrivate *priv = gs_star_widget_get_instance_private (star); + + if (!gtk_widget_get_realized (GTK_WIDGET (star))) + return; + + /* remove all existing widgets */ + gs_widget_remove_all (priv->box1, (GsRemoveFunc) gtk_box_remove); + + for (guint i = 0; i < G_N_ELEMENTS (priv->images); i++) { + GtkWidget *w; + GtkWidget *im; + + /* create image */ + im = gs_star_image_new (); + gs_star_image_set_pixel_size (GS_STAR_IMAGE (im), (gint) priv->icon_size); + + /* Add right margin for all but the last star. We use + * this rather than GtkBox child 'spacing' property, + * so the motion controllers attached to the buttons + * will not trigger a 'leave' signal once the pointer + * moves into the GtkBox 'spacing' area between the + * stars, clearing the star selection */ + if (i < G_N_ELEMENTS (priv->images) - 1) + gtk_widget_set_margin_end (im, STAR_SPACING); + + priv->images[i] = im; + + /* create button */ + if (priv->interactive) { + GtkEventController *controller; + w = gtk_button_new (); + g_signal_connect (w, "clicked", + G_CALLBACK (gs_star_widget_button_clicked_cb), star); + g_object_set_data (G_OBJECT (w), + "GsStarWidget::value", + GINT_TO_POINTER (rate_to_star[i])); + gtk_button_set_child (GTK_BUTTON (w), im); + gtk_widget_set_visible (im, TRUE); + controller = gtk_event_controller_motion_new (); + gtk_widget_add_controller (w, controller); + g_signal_connect (controller, "enter", + G_CALLBACK (gs_star_widget_button_entered_cb), star); + g_signal_connect (controller, "leave", + G_CALLBACK (gs_star_widget_button_left_cb), star); + } else { + w = im; + } + gtk_widget_set_sensitive (w, priv->interactive); + gtk_widget_add_css_class (w, "star"); + gtk_widget_set_visible (w, TRUE); + gtk_box_append (GTK_BOX (priv->box1), w); + } + + gs_star_widget_refresh_rating (star); +} + +void +gs_star_widget_set_interactive (GsStarWidget *star, gboolean interactive) +{ + GsStarWidgetPrivate *priv; + g_return_if_fail (GS_IS_STAR_WIDGET (star)); + priv = gs_star_widget_get_instance_private (star); + + if (priv->interactive == interactive) + return; + + priv->interactive = interactive; + g_object_notify_by_pspec (G_OBJECT (star), properties[PROP_INTERACTIVE]); + gs_star_widget_refresh (star); +} + +void +gs_star_widget_set_rating (GsStarWidget *star, + gint rating) +{ + GsStarWidgetPrivate *priv; + g_return_if_fail (GS_IS_STAR_WIDGET (star)); + priv = gs_star_widget_get_instance_private (star); + + if (priv->rating == rating) + return; + + priv->rating = rating; + g_object_notify_by_pspec (G_OBJECT (star), properties[PROP_RATING]); + gs_star_widget_refresh_rating (star); +} + +static void +gs_star_widget_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsStarWidget *self = GS_STAR_WIDGET (object); + GsStarWidgetPrivate *priv = gs_star_widget_get_instance_private (self); + + switch ((GsStarWidgetProperty) prop_id) { + case PROP_ICON_SIZE: + g_value_set_uint (value, priv->icon_size); + break; + case PROP_INTERACTIVE: + g_value_set_boolean (value, priv->interactive); + break; + case PROP_RATING: + g_value_set_int (value, priv->rating); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_star_widget_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsStarWidget *self = GS_STAR_WIDGET (object); + + switch ((GsStarWidgetProperty) prop_id) { + case PROP_ICON_SIZE: + gs_star_widget_set_icon_size (self, g_value_get_uint (value)); + break; + case PROP_INTERACTIVE: + gs_star_widget_set_interactive (self, g_value_get_boolean (value)); + break; + case PROP_RATING: + gs_star_widget_set_rating (self, g_value_get_int (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_star_widget_realize (GtkWidget *widget) +{ + GTK_WIDGET_CLASS (gs_star_widget_parent_class)->realize (widget); + + /* Create child widgets. */ + gs_star_widget_refresh (GS_STAR_WIDGET (widget)); +} + +static void +gs_star_widget_dispose (GObject *object) +{ + gs_widget_remove_all (GTK_WIDGET (object), NULL); + + G_OBJECT_CLASS (gs_star_widget_parent_class)->dispose (object); +} + +static void +gs_star_widget_init (GsStarWidget *star) +{ + gtk_widget_init_template (GTK_WIDGET (star)); +} + +static void +gs_star_widget_class_init (GsStarWidgetClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_star_widget_dispose; + + widget_class->realize = gs_star_widget_realize; + object_class->get_property = gs_star_widget_get_property; + object_class->set_property = gs_star_widget_set_property; + + /** + * GsStarWidget:icon-size: + * + * Size of the star icons to use in the widget, in pixels. + * + * Since: 3.38 + */ + properties[PROP_ICON_SIZE] = + g_param_spec_uint ("icon-size", + "Icon Size", + "Size of icons to use, in pixels", + 0, G_MAXUINT, 12, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT); + + /** + * GsStarWidget:interactive: + * + * Whether the widget accepts user input to change #GsStarWidget:rating. + * + * Since: 3.38 + */ + properties[PROP_INTERACTIVE] = + g_param_spec_boolean ("interactive", + "Interactive", + "Whether the rating is interactive", + FALSE, + G_PARAM_READWRITE); + + /** + * GsStarWidget:rating: + * + * The rating to display on the widget, as a percentage. `-1` indicates + * that the rating is unknown. + * + * Since: 3.38 + */ + properties[PROP_RATING] = + g_param_spec_int ("rating", + "Rating", + "Rating, out of 100%, or -1 for unknown", + -1, 100, -1, + G_PARAM_READWRITE); + + signals [RATING_CHANGED] = + g_signal_new ("rating-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsStarWidgetClass, rating_changed), + NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (properties), properties); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-star-widget.ui"); + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); + gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, box1); +} + +GtkWidget * +gs_star_widget_new (void) +{ + GsStarWidget *star; + star = g_object_new (GS_TYPE_STAR_WIDGET, NULL); + return GTK_WIDGET (star); +} diff --git a/src/gs-star-widget.h b/src/gs-star-widget.h new file mode 100644 index 0000000..6649cf8 --- /dev/null +++ b/src/gs-star-widget.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_STAR_WIDGET (gs_star_widget_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsStarWidget, gs_star_widget, GS, STAR_WIDGET, GtkWidget) + +struct _GsStarWidgetClass +{ + GtkWidgetClass parent_class; + + void (*rating_changed) (GsStarWidget *star); +}; + +GtkWidget *gs_star_widget_new (void); +gint gs_star_widget_get_rating (GsStarWidget *star); +void gs_star_widget_set_rating (GsStarWidget *star, + gint rating); +void gs_star_widget_set_icon_size (GsStarWidget *star, + guint pixel_size); +void gs_star_widget_set_interactive (GsStarWidget *star, + gboolean interactive); + +G_END_DECLS diff --git a/src/gs-star-widget.ui b/src/gs-star-widget.ui new file mode 100644 index 0000000..f2221e6 --- /dev/null +++ b/src/gs-star-widget.ui @@ -0,0 +1,18 @@ + + + + + diff --git a/src/gs-storage-context-dialog.c b/src/gs-storage-context-dialog.c new file mode 100644 index 0000000..4757d6a --- /dev/null +++ b/src/gs-storage-context-dialog.c @@ -0,0 +1,419 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * SECTION:gs-storage-context-dialog + * @short_description: A dialog showing storage information about an app + * + * #GsStorageContextDialog is a dialog which shows detailed information + * about the download size of an uninstalled app, or the storage usage of + * an installed one. It shows how those sizes are broken down into components + * such as user data, cached data, or dependencies, where possible. + * + * It is designed to show a more detailed view of the information which the + * app’s storage tile in #GsAppContextBar is derived from. + * + * The widget has no special appearance if the app is unset, so callers will + * typically want to hide the dialog in that case. + * + * Since: 41 + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gs-app.h" +#include "gs-common.h" +#include "gs-context-dialog-row.h" +#include "gs-lozenge.h" +#include "gs-storage-context-dialog.h" + +struct _GsStorageContextDialog +{ + GsInfoWindow parent_instance; + + GsApp *app; /* (nullable) (owned) */ + gulong app_notify_handler; + + GtkSizeGroup *lozenge_size_group; + GtkWidget *lozenge; + GtkLabel *title; + GtkListBox *sizes_list; + GtkLabel *manage_storage_label; +}; + +G_DEFINE_TYPE (GsStorageContextDialog, gs_storage_context_dialog, GS_TYPE_INFO_WINDOW) + +typedef enum { + PROP_APP = 1, +} GsStorageContextDialogProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +typedef enum { + MATCH_STATE_NO_MATCH = 0, + MATCH_STATE_MATCH = 1, + MATCH_STATE_UNKNOWN, +} MatchState; + +/* The arguments are all non-nullable. */ +static void +add_size_row (GtkListBox *list_box, + GtkSizeGroup *lozenge_size_group, + GsSizeType size_type, + guint64 size_bytes, + const gchar *title, + const gchar *description) +{ + GtkListBoxRow *row; + g_autofree gchar *size_bytes_str = NULL; + gboolean is_markup = FALSE; + + if (size_type != GS_SIZE_TYPE_VALID) + /* Translators: This is shown in a bubble if the storage + * size of an app is not known. The bubble is small, + * so the string should be as short as possible. */ + size_bytes_str = g_strdup (_("?")); + else if (size_bytes == 0) + /* Translators: This is shown in a bubble to represent a 0 byte + * storage size, so its context is “storage size: none”. The + * bubble is small, so the string should be as short as + * possible. */ + size_bytes_str = g_strdup (_("None")); + else + size_bytes_str = gs_utils_format_size (size_bytes, &is_markup); + + row = gs_context_dialog_row_new_text (size_bytes_str, GS_CONTEXT_DIALOG_ROW_IMPORTANCE_NEUTRAL, + title, description); + if (is_markup) + gs_context_dialog_row_set_content_markup (GS_CONTEXT_DIALOG_ROW (row), size_bytes_str); + gs_context_dialog_row_set_size_groups (GS_CONTEXT_DIALOG_ROW (row), lozenge_size_group, NULL, NULL); + gtk_list_box_append (list_box, GTK_WIDGET (row)); +} + +static void +update_sizes_list (GsStorageContextDialog *self) +{ + GsSizeType title_size_type; + guint64 title_size_bytes; + g_autofree gchar *title_size_bytes_str = NULL; + const gchar *title; + gboolean cache_row_added = FALSE; + gboolean is_markup = FALSE; + + gs_widget_remove_all (GTK_WIDGET (self->sizes_list), (GsRemoveFunc) gtk_list_box_remove); + + /* UI state is undefined if app is not set. */ + if (self->app == NULL) + return; + + if (gs_app_is_installed (self->app)) { + guint64 size_installed_bytes, size_user_data_bytes, size_cache_data_bytes; + GsSizeType size_installed_type, size_user_data_type, size_cache_data_type; + + /* Don’t list the size of the dependencies as that space likely + * won’t be reclaimed unless many other apps are removed. */ + size_installed_type = gs_app_get_size_installed (self->app, &size_installed_bytes); + size_user_data_type = gs_app_get_size_user_data (self->app, &size_user_data_bytes); + size_cache_data_type = gs_app_get_size_cache_data (self->app, &size_cache_data_bytes); + + title = _("Installed Size"); + title_size_bytes = size_installed_bytes; + title_size_type = size_installed_type; + + add_size_row (self->sizes_list, self->lozenge_size_group, + size_installed_type, size_installed_bytes, + _("App Data"), + _("Data needed for the app to run")); + + if (size_user_data_type == GS_SIZE_TYPE_VALID) { + add_size_row (self->sizes_list, self->lozenge_size_group, + size_user_data_type, size_user_data_bytes, + _("User Data"), + _("Data created by you in the app")); + title_size_bytes += size_user_data_bytes; + } + + if (size_cache_data_type == GS_SIZE_TYPE_VALID) { + add_size_row (self->sizes_list, self->lozenge_size_group, + size_cache_data_type, size_cache_data_bytes, + _("Cache Data"), + _("Temporary cached data")); + title_size_bytes += size_cache_data_bytes; + cache_row_added = TRUE; + } + } else { + guint64 size_download_bytes, size_download_dependencies_bytes; + GsSizeType size_download_type, size_download_dependencies_type; + + size_download_type = gs_app_get_size_download (self->app, &size_download_bytes); + size_download_dependencies_type = gs_app_get_size_download_dependencies (self->app, &size_download_dependencies_bytes); + + title = _("Download Size"); + title_size_bytes = size_download_bytes; + title_size_type = size_download_type; + + add_size_row (self->sizes_list, self->lozenge_size_group, + size_download_type, size_download_bytes, + gs_app_get_name (self->app), + _("The app itself")); + + if (size_download_dependencies_type == GS_SIZE_TYPE_VALID) { + add_size_row (self->sizes_list, self->lozenge_size_group, + size_download_dependencies_type, size_download_dependencies_bytes, + _("Required Dependencies"), + _("Shared system components required by this app")); + title_size_bytes += size_download_dependencies_bytes; + } + + /* FIXME: Addons, Potential Additional Downloads */ + } + + if (title_size_type == GS_SIZE_TYPE_VALID) + title_size_bytes_str = gs_utils_format_size (title_size_bytes, &is_markup); + else + title_size_bytes_str = g_strdup (C_("Download size", "Unknown")); + + if (is_markup) + gs_lozenge_set_markup (GS_LOZENGE (self->lozenge), title_size_bytes_str); + else + gs_lozenge_set_text (GS_LOZENGE (self->lozenge), title_size_bytes_str); + + gtk_label_set_text (self->title, title); + + /* Update the Manage Storage label. */ + gtk_widget_set_visible (GTK_WIDGET (self->manage_storage_label), cache_row_added); +} + +static void +app_notify_cb (GObject *obj, + GParamSpec *pspec, + gpointer user_data) +{ + GsStorageContextDialog *self = GS_STORAGE_CONTEXT_DIALOG (user_data); + GQuark pspec_name_quark = g_param_spec_get_name_quark (pspec); + + if (pspec_name_quark == g_quark_from_static_string ("state") || + pspec_name_quark == g_quark_from_static_string ("size-installed") || + pspec_name_quark == g_quark_from_static_string ("size-installed-dependencies") || + pspec_name_quark == g_quark_from_static_string ("size-download") || + pspec_name_quark == g_quark_from_static_string ("size-download-dependencies") || + pspec_name_quark == g_quark_from_static_string ("size-cache-data") || + pspec_name_quark == g_quark_from_static_string ("size-user-data")) + update_sizes_list (self); +} + +static gboolean +manage_storage_activate_link_cb (GtkLabel *label, + const gchar *uri, + gpointer user_data) +{ + GsStorageContextDialog *self = GS_STORAGE_CONTEXT_DIALOG (user_data); + g_autoptr(GError) local_error = NULL; + const gchar *desktop_id; + const gchar *argv[] = { + "gnome-control-center", + "applications", + "", /* application ID */ + NULL + }; + + /* Button shouldn’t have been sensitive if the launchable ID isn’t available. */ + desktop_id = gs_app_get_launchable (self->app, AS_LAUNCHABLE_KIND_DESKTOP_ID); + g_assert (desktop_id != NULL); + + argv[2] = desktop_id; + + if (!g_spawn_async (NULL, (gchar **) argv, NULL, + G_SPAWN_SEARCH_PATH | + G_SPAWN_STDOUT_TO_DEV_NULL | + G_SPAWN_STDERR_TO_DEV_NULL | + G_SPAWN_CLOEXEC_PIPES, + NULL, NULL, NULL, &local_error)) { + g_warning ("Error opening GNOME Control Center: %s", + local_error->message); + return TRUE; + } + + return TRUE; +} + +static void +gs_storage_context_dialog_init (GsStorageContextDialog *self) +{ + const gchar *label = NULL; + + gtk_widget_init_template (GTK_WIDGET (self)); + + /* TRANSLATORS: "" and "" should not be touched. */ + label = _("Cached data can be cleared from the _app settings"); + + gtk_label_set_label (self->manage_storage_label, label); +} + +static void +gs_storage_context_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsStorageContextDialog *self = GS_STORAGE_CONTEXT_DIALOG (object); + + switch ((GsStorageContextDialogProperty) prop_id) { + case PROP_APP: + g_value_set_object (value, gs_storage_context_dialog_get_app (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_storage_context_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsStorageContextDialog *self = GS_STORAGE_CONTEXT_DIALOG (object); + + switch ((GsStorageContextDialogProperty) prop_id) { + case PROP_APP: + gs_storage_context_dialog_set_app (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_storage_context_dialog_dispose (GObject *object) +{ + GsStorageContextDialog *self = GS_STORAGE_CONTEXT_DIALOG (object); + + gs_storage_context_dialog_set_app (self, NULL); + + G_OBJECT_CLASS (gs_storage_context_dialog_parent_class)->dispose (object); +} + +static void +gs_storage_context_dialog_class_init (GsStorageContextDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_storage_context_dialog_get_property; + object_class->set_property = gs_storage_context_dialog_set_property; + object_class->dispose = gs_storage_context_dialog_dispose; + + /** + * GsStorageContextDialog:app: (nullable) + * + * The app to display the storage context details for. + * + * This may be %NULL; if so, the content of the widget will be + * undefined. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-storage-context-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsStorageContextDialog, lozenge_size_group); + gtk_widget_class_bind_template_child (widget_class, GsStorageContextDialog, lozenge); + gtk_widget_class_bind_template_child (widget_class, GsStorageContextDialog, title); + gtk_widget_class_bind_template_child (widget_class, GsStorageContextDialog, sizes_list); + gtk_widget_class_bind_template_child (widget_class, GsStorageContextDialog, manage_storage_label); + + gtk_widget_class_bind_template_callback (widget_class, manage_storage_activate_link_cb); +} + +/** + * gs_storage_context_dialog_new: + * @app: (nullable): the app to display storage context information for, or %NULL + * + * Create a new #GsStorageContextDialog and set its initial app to @app. + * + * Returns: (transfer full): a new #GsStorageContextDialog + * Since: 41 + */ +GsStorageContextDialog * +gs_storage_context_dialog_new (GsApp *app) +{ + g_return_val_if_fail (app == NULL || GS_IS_APP (app), NULL); + + return g_object_new (GS_TYPE_STORAGE_CONTEXT_DIALOG, + "app", app, + NULL); +} + +/** + * gs_storage_context_dialog_get_app: + * @self: a #GsStorageContextDialog + * + * Gets the value of #GsStorageContextDialog:app. + * + * Returns: (nullable) (transfer none): app whose storage context information is + * being displayed, or %NULL if none is set + * Since: 41 + */ +GsApp * +gs_storage_context_dialog_get_app (GsStorageContextDialog *self) +{ + g_return_val_if_fail (GS_IS_STORAGE_CONTEXT_DIALOG (self), NULL); + + return self->app; +} + +/** + * gs_storage_context_dialog_set_app: + * @self: a #GsStorageContextDialog + * @app: (nullable) (transfer none): the app to display storage context + * information for, or %NULL for none + * + * Set the value of #GsStorageContextDialog:app. + * + * Since: 41 + */ +void +gs_storage_context_dialog_set_app (GsStorageContextDialog *self, + GsApp *app) +{ + g_return_if_fail (GS_IS_STORAGE_CONTEXT_DIALOG (self)); + g_return_if_fail (app == NULL || GS_IS_APP (app)); + + if (app == self->app) + return; + + g_clear_signal_handler (&self->app_notify_handler, self->app); + + g_set_object (&self->app, app); + + if (self->app != NULL) + self->app_notify_handler = g_signal_connect (self->app, "notify", G_CALLBACK (app_notify_cb), self); + + /* Update the UI. */ + update_sizes_list (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_APP]); +} diff --git a/src/gs-storage-context-dialog.h b/src/gs-storage-context-dialog.h new file mode 100644 index 0000000..e2df4d3 --- /dev/null +++ b/src/gs-storage-context-dialog.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2021 Endless OS Foundation LLC + * + * Author: Philip Withnall + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include +#include + +#include "gs-app.h" +#include "gs-info-window.h" + +G_BEGIN_DECLS + +#define GS_TYPE_STORAGE_CONTEXT_DIALOG (gs_storage_context_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsStorageContextDialog, gs_storage_context_dialog, GS, STORAGE_CONTEXT_DIALOG, GsInfoWindow) + +GsStorageContextDialog *gs_storage_context_dialog_new (GsApp *app); + +GsApp *gs_storage_context_dialog_get_app (GsStorageContextDialog *self); +void gs_storage_context_dialog_set_app (GsStorageContextDialog *self, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-storage-context-dialog.ui b/src/gs-storage-context-dialog.ui new file mode 100644 index 0000000..3b21516 --- /dev/null +++ b/src/gs-storage-context-dialog.ui @@ -0,0 +1,78 @@ + + + + + + + + horizontal + + diff --git a/src/gs-summary-tile.c b/src/gs-summary-tile.c new file mode 100644 index 0000000..7c17f6f --- /dev/null +++ b/src/gs-summary-tile.c @@ -0,0 +1,297 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2019 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-summary-tile.h" +#include "gs-layout-manager.h" +#include "gs-common.h" + +#define GS_TYPE_SUMMARY_TILE_LAYOUT (gs_summary_tile_layout_get_type ()) +G_DECLARE_FINAL_TYPE (GsSummaryTileLayout, gs_summary_tile_layout, GS, SUMMARY_TILE_LAYOUT, GsLayoutManager) + +struct _GsSummaryTileLayout +{ + GsLayoutManager parent_instance; + + gint preferred_width; +}; + +G_DEFINE_TYPE (GsSummaryTileLayout, gs_summary_tile_layout, GS_TYPE_LAYOUT_MANAGER) + +static void +gs_summary_tile_layout_measure (GtkLayoutManager *layout_manager, + GtkWidget *widget, + GtkOrientation orientation, + gint for_size, + gint *minimum, + gint *natural, + gint *minimum_baseline, + gint *natural_baseline) +{ + GsSummaryTileLayout *self = GS_SUMMARY_TILE_LAYOUT (layout_manager); + + GTK_LAYOUT_MANAGER_CLASS (gs_summary_tile_layout_parent_class)->measure (layout_manager, + widget, orientation, for_size, minimum, natural, minimum_baseline, natural_baseline); + + /* Limit the natural width */ + if (self->preferred_width > 0 && orientation == GTK_ORIENTATION_HORIZONTAL) + *natural = MAX (*minimum, self->preferred_width); +} + +static void +gs_summary_tile_layout_class_init (GsSummaryTileLayoutClass *klass) +{ + GtkLayoutManagerClass *layout_manager_class = GTK_LAYOUT_MANAGER_CLASS (klass); + layout_manager_class->measure = gs_summary_tile_layout_measure; +} + +static void +gs_summary_tile_layout_init (GsSummaryTileLayout *self) +{ +} + +/* ********************************************************************* */ + +struct _GsSummaryTile +{ + GsAppTile parent_instance; + + GtkWidget *image; + GtkWidget *image_stack; + GtkWidget *name; + GtkWidget *summary; + GtkWidget *bin; + GtkWidget *stack; + gint preferred_width; + + GsAppIconsState current_app_icons_state; +}; + +G_DEFINE_TYPE (GsSummaryTile, gs_summary_tile, GS_TYPE_APP_TILE) + +typedef enum { + PROP_PREFERRED_WIDTH = 1, +} GsSummaryTileProperty; + +static GParamSpec *obj_props[PROP_PREFERRED_WIDTH + 1] = { NULL, }; + +static void +gs_summary_tile_refresh (GsAppTile *self) +{ + GsSummaryTile *tile = GS_SUMMARY_TILE (self); + GsAppIconsState app_icons_state; + GsApp *app = gs_app_tile_get_app (self); + gboolean installed; + g_autofree gchar *name = NULL; + const gchar *summary; + + if (app == NULL) + return; + + gtk_image_set_pixel_size (GTK_IMAGE (tile->image), 64); + gtk_stack_set_visible_child_name (GTK_STACK (tile->stack), "content"); + + /* set name */ + gtk_label_set_label (GTK_LABEL (tile->name), gs_app_get_name (app)); + + summary = gs_app_get_summary (app); + gtk_label_set_label (GTK_LABEL (tile->summary), summary); + gtk_widget_set_visible (tile->summary, summary && summary[0]); + + app_icons_state = gs_app_get_icons_state (app); + if (tile->current_app_icons_state != app_icons_state) { + g_autoptr(GIcon) icon = NULL; + + switch (app_icons_state) { + case GS_APP_ICONS_STATE_AVAILABLE: + icon = gs_app_get_icon_for_size (app, + gtk_image_get_pixel_size (GTK_IMAGE (tile->image)), + gtk_widget_get_scale_factor (tile->image), + "org.gnome.Software.Generic"); + gtk_image_set_from_gicon (GTK_IMAGE (tile->image), icon); + gtk_stack_set_visible_child_name (GTK_STACK (tile->image_stack), "image"); + break; + case GS_APP_ICONS_STATE_UNKNOWN: + case GS_APP_ICONS_STATE_PENDING_DOWNLOAD: + case GS_APP_ICONS_STATE_DOWNLOADING: + default: + gtk_stack_set_visible_child_name (GTK_STACK (tile->image_stack), "loading"); + break; + } + + tile->current_app_icons_state = app_icons_state; + } + + switch (gs_app_get_state (app)) { + case GS_APP_STATE_INSTALLED: + case GS_APP_STATE_UPDATABLE: + case GS_APP_STATE_UPDATABLE_LIVE: + installed = TRUE; + name = g_strdup_printf (_("%s (Installed)"), + gs_app_get_name (app)); + break; + case GS_APP_STATE_INSTALLING: + installed = FALSE; + name = g_strdup_printf (_("%s (Installing)"), + gs_app_get_name (app)); + break; + case GS_APP_STATE_DOWNLOADING: + installed = FALSE; + name = g_strdup_printf (_("%s (Downloading)"), + gs_app_get_name (app)); + break; + case GS_APP_STATE_REMOVING: + installed = TRUE; + name = g_strdup_printf (_("%s (Removing)"), + gs_app_get_name (app)); + break; + case GS_APP_STATE_QUEUED_FOR_INSTALL: + case GS_APP_STATE_AVAILABLE: + default: + installed = FALSE; + name = g_strdup (gs_app_get_name (app)); + break; + } + + gtk_widget_set_visible (tile->bin, installed); + + if (name != NULL) { + gtk_accessible_update_property (GTK_ACCESSIBLE (tile), + GTK_ACCESSIBLE_PROPERTY_LABEL, name, + GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, gs_app_get_summary (app), + -1); + } +} + +static void +gs_summary_tile_init (GsSummaryTile *tile) +{ + tile->current_app_icons_state = GS_APP_ICONS_STATE_UNKNOWN; + tile->preferred_width = -1; + gtk_widget_init_template (GTK_WIDGET (tile)); +} + +static void +gs_summary_tile_notify (GObject *object, + GParamSpec *pspec) +{ + GsSummaryTile *self = GS_SUMMARY_TILE (object); + + /* If the app of this tile changes, we have to reload its icon */ + if (g_strcmp0 (pspec->name, "app") == 0) + self->current_app_icons_state = GS_APP_ICONS_STATE_UNKNOWN; + + if (G_OBJECT_CLASS (gs_summary_tile_parent_class)->notify) + G_OBJECT_CLASS (gs_summary_tile_parent_class)->notify (object, pspec); +} + +static void +gs_summary_tile_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsSummaryTile *app_tile = GS_SUMMARY_TILE (object); + + switch ((GsSummaryTileProperty) prop_id) { + case PROP_PREFERRED_WIDTH: + g_value_set_int (value, app_tile->preferred_width); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_summary_tile_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsSummaryTile *app_tile = GS_SUMMARY_TILE (object); + GtkLayoutManager *layout_manager; + + switch ((GsSummaryTileProperty) prop_id) { + case PROP_PREFERRED_WIDTH: + app_tile->preferred_width = g_value_get_int (value); + layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (app_tile)); + GS_SUMMARY_TILE_LAYOUT (layout_manager)->preferred_width = app_tile->preferred_width; + gtk_layout_manager_layout_changed (layout_manager); + g_object_notify_by_pspec (object, obj_props[PROP_PREFERRED_WIDTH]); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_summary_tile_class_init (GsSummaryTileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GsAppTileClass *tile_class = GS_APP_TILE_CLASS (klass); + + object_class->get_property = gs_summary_tile_get_property; + object_class->set_property = gs_summary_tile_set_property; + object_class->notify = gs_summary_tile_notify; + + tile_class->refresh = gs_summary_tile_refresh; + + /** + * GsAppTile:preferred-width: + * + * The only purpose of this property is to be retrieved as the + * natural width by gtk_widget_get_preferred_width() fooling the + * parent #GtkFlowBox container and making it switch to more columns + * (children per row) if it is able to place n+1 children in a row + * having this specified width. If this value is less than a minimum + * width of this app tile then the minimum is returned instead. Set + * this property to -1 to turn off this feature and return the default + * natural width instead. + */ + obj_props[PROP_PREFERRED_WIDTH] = + g_param_spec_int ("preferred-width", + "Preferred width", + "The preferred width of this widget, its only purpose is to trick the parent container", + -1, G_MAXINT, -1, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-summary-tile.ui"); + gtk_widget_class_set_layout_manager_type (widget_class, GS_TYPE_SUMMARY_TILE_LAYOUT); + /* Override the 'button' class name, to be able to turn off hover states */ + gtk_widget_class_set_css_name (widget_class, "gs-summary-tile"); + + gtk_widget_class_bind_template_child (widget_class, GsSummaryTile, + image); + gtk_widget_class_bind_template_child (widget_class, GsSummaryTile, + image_stack); + gtk_widget_class_bind_template_child (widget_class, GsSummaryTile, + name); + gtk_widget_class_bind_template_child (widget_class, GsSummaryTile, + summary); + gtk_widget_class_bind_template_child (widget_class, GsSummaryTile, + bin); + gtk_widget_class_bind_template_child (widget_class, GsSummaryTile, + stack); +} + +GtkWidget * +gs_summary_tile_new (GsApp *app) +{ + return g_object_new (GS_TYPE_SUMMARY_TILE, + "app", app, + NULL); +} diff --git a/src/gs-summary-tile.h b/src/gs-summary-tile.h new file mode 100644 index 0000000..247990f --- /dev/null +++ b/src/gs-summary-tile.h @@ -0,0 +1,21 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Matthias Clasen + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-app-tile.h" + +G_BEGIN_DECLS + +#define GS_TYPE_SUMMARY_TILE (gs_summary_tile_get_type ()) + +G_DECLARE_FINAL_TYPE (GsSummaryTile, gs_summary_tile, GS, SUMMARY_TILE, GsAppTile) + +GtkWidget *gs_summary_tile_new (GsApp *app); + +G_END_DECLS diff --git a/src/gs-summary-tile.ui b/src/gs-summary-tile.ui new file mode 100644 index 0000000..55b400d --- /dev/null +++ b/src/gs-summary-tile.ui @@ -0,0 +1,153 @@ + + + + + + diff --git a/src/gs-toast.c b/src/gs-toast.c new file mode 100644 index 0000000..df5b9c5 --- /dev/null +++ b/src/gs-toast.c @@ -0,0 +1,193 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 204 Red Hat www.redhat.com + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-enums.h" + +#include "gs-toast.h" + +/* Being able to derive from AdwToast (it's a final type), a descendant would be here instead */ +#define GS_TOAST_DATA_KEY "GsToastData" + +typedef struct _GsToastData +{ + GsToastButton button; + gchar *details_message; + gchar *details_text; +} GsToastData; + +static void +gs_toast_data_free (gpointer ptr) +{ + GsToastData *data = (GsToastData *) ptr; + + if (data) { + g_clear_pointer (&data->details_message, g_free); + g_clear_pointer (&data->details_text, g_free); + g_free (data); + } +} + +static GsToastData * +gs_toast_get_data (AdwToast *toast) +{ + return g_object_get_data (G_OBJECT (toast), GS_TOAST_DATA_KEY); +} + +static void +gs_toast_setup (AdwToast *self) +{ + GsToastButton button = gs_toast_get_button (self); + const gchar *details_text = gs_toast_get_details_text (self); + + if (button != GS_TOAST_BUTTON_NONE && + button != GS_TOAST_BUTTON_DETAILS_URI && + details_text != NULL) + g_warning ("GsToast has set both button and details text, the Details button is being used"); + + if (details_text != NULL) { + adw_toast_set_button_label (self, _("_Details")); + } else if (button != GS_TOAST_BUTTON_NONE) { + switch (button) { + case GS_TOAST_BUTTON_NO_SPACE: + adw_toast_set_button_label (self, _("_Examine")); + break; + case GS_TOAST_BUTTON_RESTART_REQUIRED: + adw_toast_set_button_label (self, _("_Restart")); + break; + case GS_TOAST_BUTTON_DETAILS_URI: + adw_toast_set_button_label (self, _("_Details")); + break; + default: + g_warn_if_reached (); + break; + } + } +} + +/** + * gs_toast_new: + * @title: a toast title + * @button: what button to show, if any + * @details_message: (optional): details message to use, or %NULL + * @details_text: (optional): details text to use, or %NULL + * + * Creates a new #AdwToast with set properties from the argument. + * The @details_message is ignored when @details_text is %NULL. + * + * Non-%NULL @details_text can be used only with %GS_TOAST_BUTTON_NONE @button, + * because this adds button "Details", which will show the @details_text + * as error details and either @details_message or AdwToast:title as + * the dialog message. + * + * All @button variants expect the creator to listen to AdwToast::button-clicked + * signal and respond to it accordingly. + * + * Returns: (transfer full): a new #AdwToast + * + * Since: 46 + **/ +AdwToast * +gs_toast_new (const gchar *title, + GsToastButton button, + const gchar *details_message, + const gchar *details_text) +{ + AdwToast *toast; + GsToastData *data; + + toast = adw_toast_new (title); + adw_toast_set_timeout (toast, 0); + + data = g_new0 (GsToastData, 1); + data->button = button; + data->details_message = g_strdup (details_message); + data->details_text = g_strdup (details_text); + + g_object_set_data_full (G_OBJECT (toast), GS_TOAST_DATA_KEY, data, gs_toast_data_free); + + gs_toast_setup (toast); + + return toast; +} + +/** + * gs_toast_get_button: + * @self: an #AdwToast, previously created with gs_toast_new() + * + * Returns a #GsToastButton constant the @self was created with. + * + * Returns: a button constant the @self was created with. + * + * Since: 46 + **/ +GsToastButton +gs_toast_get_button (AdwToast *self) +{ + GsToastData *data; + + g_return_val_if_fail (ADW_IS_TOAST (self), GS_TOAST_BUTTON_NONE); + + data = gs_toast_get_data (self); + if (data == NULL) + return GS_TOAST_BUTTON_NONE; + + return data->button; +} + +/** + * gs_toast_get_details_message: + * @self: an #AdwToast, previously created with gs_toast_new() + * + * Returns a details message the @self was created with. It can be %NULL. + * + * Returns: (nullable): a details message the @self was created with. + * + * Since: 46 + **/ +const gchar * +gs_toast_get_details_message (AdwToast *self) +{ + GsToastData *data; + + g_return_val_if_fail (ADW_IS_TOAST (self), NULL); + + data = gs_toast_get_data (self); + if (data == NULL) + return NULL; + + return data->details_message; +} + +/** + * gs_toast_get_details_text: + * @self: an #AdwToast, previously created with gs_toast_new() + * + * Returns a details text the @self was created with. It can be %NULL. + * + * Returns: (nullable): a details text the @self was created with. + * + * Since: 46 + **/ +const gchar * +gs_toast_get_details_text (AdwToast *self) +{ + GsToastData *data; + + g_return_val_if_fail (ADW_IS_TOAST (self), NULL); + + data = gs_toast_get_data (self); + if (data == NULL) + return NULL; + + return data->details_text; +} diff --git a/src/gs-toast.h b/src/gs-toast.h new file mode 100644 index 0000000..25331ba --- /dev/null +++ b/src/gs-toast.h @@ -0,0 +1,33 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 204 Red Hat www.redhat.com + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +typedef enum { + GS_TOAST_BUTTON_NONE, + GS_TOAST_BUTTON_NO_SPACE, + GS_TOAST_BUTTON_RESTART_REQUIRED, + GS_TOAST_BUTTON_DETAILS_URI, + GS_TOAST_BUTTON_LAST +} GsToastButton; + +/* Wrapper functions around AdwToast, because AdwToast is a final type, thus it cannot be derived from */ + +AdwToast *gs_toast_new (const gchar *title, + GsToastButton button, + const gchar *details_message, + const gchar *details_text); +GsToastButton gs_toast_get_button (AdwToast *self); +const gchar *gs_toast_get_details_message (AdwToast *self); +const gchar *gs_toast_get_details_text (AdwToast *self); + +G_END_DECLS diff --git a/src/gs-update-dialog.c b/src/gs-update-dialog.c new file mode 100644 index 0000000..b081021 --- /dev/null +++ b/src/gs-update-dialog.c @@ -0,0 +1,348 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-update-dialog.h" +#include "gs-app-details-page.h" +#include "gs-app-row.h" +#include "gs-os-update-page.h" +#include "gs-update-list.h" +#include "gs-common.h" + +struct _GsUpdateDialog +{ + AdwDialog parent_instance; + + GCancellable *cancellable; + GsPluginLoader *plugin_loader; + GsApp *app; + GtkWidget *navigation_view; + GtkWidget *list_box_installed_updates; + GtkWidget *spinner; + GtkWidget *stack; + AdwWindowTitle *window_title; + AdwNavigationPage *default_page; + gboolean showing_installed_updates; +}; + +G_DEFINE_TYPE (GsUpdateDialog, gs_update_dialog, ADW_TYPE_DIALOG) + +typedef enum { + PROP_PLUGIN_LOADER = 1, + PROP_APP, +} GsUpdateDialogProperty; + +static GParamSpec *obj_props[PROP_APP + 1] = { NULL, }; + +static void gs_update_dialog_show_installed_updates (GsUpdateDialog *dialog); +static void gs_update_dialog_show_update_details (GsUpdateDialog *dialog, GsApp *app); + +static void +installed_updates_row_activated_cb (GsUpdateList *update_list, + GsApp *app, + GsUpdateDialog *dialog) +{ + gs_update_dialog_show_update_details (dialog, app); +} + +static void +get_installed_updates_cb (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GsUpdateDialog *dialog) +{ + guint i; + guint64 install_date; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GError) error = NULL; + + /* get the results */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + + /* if we're in teardown, short-circuit and return immediately without + * dereferencing priv variables */ + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + dialog->spinner == NULL) { + g_debug ("get installed updates cancelled"); + return; + } + + /* error */ + if (list == NULL) { + g_warning ("failed to get installed updates: %s", error->message); + gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "empty"); + return; + } + + /* no results */ + if (gs_app_list_length (list) == 0) { + g_debug ("no installed updates to show"); + gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "empty"); + return; + } + + /* set the header title using any one of the apps */ + install_date = gs_app_get_install_date (gs_app_list_index (list, 0)); + if (install_date > 0) { + g_autoptr(GDateTime) date = NULL; + g_autofree gchar *date_str = NULL; + g_autofree gchar *subtitle = NULL; + + date = g_date_time_new_from_unix_utc ((gint64) install_date); + date_str = g_date_time_format (date, "%x"); + + /* TRANSLATORS: this is the subtitle of the installed updates dialog window. + %s will be replaced by the date when the updates were installed. + The date format is defined by the locale's preferred date representation + ("%x" in strftime.) */ + subtitle = g_strdup_printf (_("Installed on %s"), date_str); + adw_window_title_set_subtitle (dialog->window_title, subtitle); + } + + gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "installed-updates-list"); + + gs_update_list_remove_all (GS_UPDATE_LIST (dialog->list_box_installed_updates)); + for (i = 0; i < gs_app_list_length (list); i++) { + gs_update_list_add_app (GS_UPDATE_LIST (dialog->list_box_installed_updates), + gs_app_list_index (list, i)); + } +} + +static void +gs_update_dialog_show_installed_updates (GsUpdateDialog *dialog) +{ + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + dialog->showing_installed_updates = TRUE; + + /* TRANSLATORS: this is the title of the installed updates dialog window */ + adw_navigation_page_set_title (dialog->default_page, _("Installed Updates")); + + gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "spinner"); + + query = gs_app_query_new ("is-historical-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + gs_plugin_loader_job_process_async (dialog->plugin_loader, plugin_job, + dialog->cancellable, + (GAsyncReadyCallback) get_installed_updates_cb, + dialog); +} + +static void +unset_focus (GtkWidget *widget) +{ + GtkWidget *focus; + + focus = adw_dialog_get_focus (ADW_DIALOG (widget)); + if (GTK_IS_LABEL (focus)) + gtk_label_select_region (GTK_LABEL (focus), 0, 0); +} + +static void +app_activated_cb (GtkWidget *widget, GsApp *app, GsUpdateDialog *page) +{ + gs_update_dialog_show_update_details (page, app); +} + +static void +gs_update_dialog_show_update_details (GsUpdateDialog *dialog, GsApp *app) +{ + GtkWidget *page; + AsComponentKind kind; + g_autofree gchar *str = NULL; + + /* debug */ + str = gs_app_to_string (app); + g_debug ("%s", str); + + /* workaround a gtk+ issue where the dialog comes up with a label selected, + * https://bugzilla.gnome.org/show_bug.cgi?id=734033 */ + unset_focus (GTK_WIDGET (dialog)); + + /* set update description */ + kind = gs_app_get_kind (app); + if (kind == AS_COMPONENT_KIND_GENERIC && + gs_app_get_special_kind (app) == GS_APP_SPECIAL_KIND_OS_UPDATE) { + page = gs_os_update_page_new (); + gs_os_update_page_set_app (GS_OS_UPDATE_PAGE (page), app); + g_signal_connect (page, "app-activated", + G_CALLBACK (app_activated_cb), dialog); + } else { + page = gs_app_details_page_new (dialog->plugin_loader); + gs_app_details_page_set_app (GS_APP_DETAILS_PAGE (page), app); + } + + adw_navigation_view_push (ADW_NAVIGATION_VIEW (dialog->navigation_view), ADW_NAVIGATION_PAGE (page)); +} + +static void +gs_update_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsUpdateDialog *dialog = GS_UPDATE_DIALOG (object); + + switch ((GsUpdateDialogProperty) prop_id) { + case PROP_PLUGIN_LOADER: + g_value_set_object (value, dialog->plugin_loader); + break; + case PROP_APP: + g_value_set_object (value, dialog->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_update_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsUpdateDialog *dialog = GS_UPDATE_DIALOG (object); + + switch ((GsUpdateDialogProperty) prop_id) { + case PROP_PLUGIN_LOADER: + dialog->plugin_loader = g_object_ref (g_value_get_object (value)); + break; + case PROP_APP: + dialog->app = g_value_get_object (value); + if (dialog->app != NULL) + g_object_ref (dialog->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_update_dialog_constructed (GObject *object) +{ + GsUpdateDialog *dialog = GS_UPDATE_DIALOG (object); + + g_assert (dialog->plugin_loader); + + if (dialog->app) { + adw_navigation_view_replace (ADW_NAVIGATION_VIEW (dialog->navigation_view), NULL, 0); + + gs_update_dialog_show_update_details (dialog, dialog->app); + } else { + gs_update_dialog_show_installed_updates (dialog); + } + + G_OBJECT_CLASS (gs_update_dialog_parent_class)->constructed (object); +} + +static void +gs_update_dialog_dispose (GObject *object) +{ + GsUpdateDialog *dialog = GS_UPDATE_DIALOG (object); + + g_cancellable_cancel (dialog->cancellable); + g_clear_object (&dialog->cancellable); + + g_clear_object (&dialog->plugin_loader); + g_clear_object (&dialog->app); + + G_OBJECT_CLASS (gs_update_dialog_parent_class)->dispose (object); +} + +static void +gs_update_dialog_init (GsUpdateDialog *dialog) +{ + g_type_ensure (GS_TYPE_UPDATE_LIST); + + gtk_widget_init_template (GTK_WIDGET (dialog)); + + dialog->cancellable = g_cancellable_new (); + + g_signal_connect (dialog->list_box_installed_updates, "show-update", + G_CALLBACK (installed_updates_row_activated_cb), dialog); + + g_signal_connect_after (dialog, "show", G_CALLBACK (unset_focus), NULL); +} + +static void +gs_update_dialog_class_init (GsUpdateDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_update_dialog_get_property; + object_class->set_property = gs_update_dialog_set_property; + object_class->constructed = gs_update_dialog_constructed; + object_class->dispose = gs_update_dialog_dispose; + + /** + * GsUpdateDialog:plugin-loader + * + * The plugin loader of the dialog. + * + * Since: 41 + */ + obj_props[PROP_PLUGIN_LOADER] = + g_param_spec_object ("plugin-loader", NULL, NULL, + GS_TYPE_PLUGIN_LOADER, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /** + * GsUpdateDialog:app: (nullable) + * + * The app whose details to display. + * + * If none is set, the intalled updates will be displayed. + * + * Since: 41 + */ + obj_props[PROP_APP] = + g_param_spec_object ("app", NULL, NULL, + GS_TYPE_APP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-update-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, navigation_view); + gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, list_box_installed_updates); + gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, spinner); + gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, stack); + gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, window_title); + gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, default_page); +} + +GtkWidget * +gs_update_dialog_new (GsPluginLoader *plugin_loader) +{ + return GTK_WIDGET (g_object_new (GS_TYPE_UPDATE_DIALOG, + "plugin-loader", plugin_loader, + NULL)); +} + +GtkWidget * +gs_update_dialog_new_for_app (GsPluginLoader *plugin_loader, GsApp *app) +{ + return GTK_WIDGET (g_object_new (GS_TYPE_UPDATE_DIALOG, + "plugin-loader", plugin_loader, + "app", app, + NULL)); +} diff --git a/src/gs-update-dialog.h b/src/gs-update-dialog.h new file mode 100644 index 0000000..5450c7f --- /dev/null +++ b/src/gs-update-dialog.h @@ -0,0 +1,27 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2014-2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_UPDATE_DIALOG (gs_update_dialog_get_type ()) + +G_DECLARE_FINAL_TYPE (GsUpdateDialog, gs_update_dialog, GS, UPDATE_DIALOG, AdwDialog) + +GtkWidget *gs_update_dialog_new (GsPluginLoader *plugin_loader); +GtkWidget *gs_update_dialog_new_for_app (GsPluginLoader *plugin_loader, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-update-dialog.ui b/src/gs-update-dialog.ui new file mode 100644 index 0000000..d34d607 --- /dev/null +++ b/src/gs-update-dialog.ui @@ -0,0 +1,91 @@ + + + + + + diff --git a/src/gs-update-list.c b/src/gs-update-list.c new file mode 100644 index 0000000..4103ec1 --- /dev/null +++ b/src/gs-update-list.c @@ -0,0 +1,151 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-update-list.h" + +#include "gs-app-row.h" +#include "gs-common.h" + +typedef struct +{ + GtkSizeGroup *sizegroup_name; + GtkListBox *listbox; +} GsUpdateListPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsUpdateList, gs_update_list, GTK_TYPE_WIDGET) + +enum { + SIGNAL_SHOW_UPDATE, +}; + +static guint signals [SIGNAL_SHOW_UPDATE + 1] = { 0 }; + +static void +installed_updates_row_activated_cb (GtkListBox *list_box, + GtkListBoxRow *row, + GsUpdateList *self) +{ + GsApp *app = gs_app_row_get_app (GS_APP_ROW (row)); + + g_signal_emit (self, signals[SIGNAL_SHOW_UPDATE], 0, app); +} + +static void +gs_update_list_app_state_notify_cb (GsApp *app, GParamSpec *pspec, gpointer user_data) +{ + if (gs_app_get_state (app) == GS_APP_STATE_INSTALLED) { + GsAppRow *app_row = GS_APP_ROW (user_data); + gs_app_row_unreveal (app_row); + } +} + +void +gs_update_list_add_app (GsUpdateList *update_list, GsApp *app) +{ + GsUpdateListPrivate *priv = gs_update_list_get_instance_private (update_list); + GtkWidget *app_row; + + app_row = gs_app_row_new (app); + gs_app_row_set_show_description (GS_APP_ROW (app_row), FALSE); + gs_app_row_set_show_update (GS_APP_ROW (app_row), FALSE); + gs_app_row_set_show_buttons (GS_APP_ROW (app_row), FALSE); + gs_app_row_set_show_installed (GS_APP_ROW (app_row), FALSE); + gtk_list_box_append (priv->listbox, app_row); + gs_app_row_set_size_groups (GS_APP_ROW (app_row), + priv->sizegroup_name, + NULL, + NULL); + g_signal_connect_object (app, "notify::state", + G_CALLBACK (gs_update_list_app_state_notify_cb), + app_row, 0); + gtk_widget_set_visible (app_row, TRUE); +} + +static gint +list_sort_func (GtkListBoxRow *a, + GtkListBoxRow *b, + gpointer user_data) +{ + GsApp *a1 = gs_app_row_get_app (GS_APP_ROW (a)); + GsApp *b1 = gs_app_row_get_app (GS_APP_ROW (b)); + + return gs_utils_app_sort_kind (a1, b1); +} + +static void +gs_update_list_dispose (GObject *object) +{ + GsUpdateList *update_list = GS_UPDATE_LIST (object); + GsUpdateListPrivate *priv = gs_update_list_get_instance_private (update_list); + + if (priv->listbox != NULL) { + gtk_widget_unparent (GTK_WIDGET (priv->listbox)); + priv->listbox = NULL; + } + + g_clear_object (&priv->sizegroup_name); + + G_OBJECT_CLASS (gs_update_list_parent_class)->dispose (object); +} + +static void +gs_update_list_init (GsUpdateList *update_list) +{ + GsUpdateListPrivate *priv = gs_update_list_get_instance_private (update_list); + priv->sizegroup_name = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + priv->listbox = GTK_LIST_BOX (gtk_list_box_new ()); + gtk_list_box_set_selection_mode (priv->listbox, GTK_SELECTION_NONE); + gtk_widget_set_parent (GTK_WIDGET (priv->listbox), GTK_WIDGET (update_list)); + gtk_list_box_set_sort_func (priv->listbox, list_sort_func, update_list, NULL); + gtk_widget_add_css_class (GTK_WIDGET (priv->listbox), "boxed-list"); + + g_signal_connect (priv->listbox, "row-activated", + G_CALLBACK (installed_updates_row_activated_cb), update_list); +} + +static void +gs_update_list_class_init (GsUpdateListClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_update_list_dispose; + + signals [SIGNAL_SHOW_UPDATE] = + g_signal_new ("show-update", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, GS_TYPE_APP); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); +} + +GtkWidget * +gs_update_list_new (void) +{ + GsUpdateList *update_list; + update_list = g_object_new (GS_TYPE_UPDATE_LIST, NULL); + return GTK_WIDGET (update_list); +} + +void +gs_update_list_remove_all (GsUpdateList *update_list) +{ + GsUpdateListPrivate *priv; + + g_return_if_fail (GS_IS_UPDATE_LIST (update_list)); + + priv = gs_update_list_get_instance_private (update_list); + gs_widget_remove_all (GTK_WIDGET (priv->listbox), (GsRemoveFunc) gtk_list_box_remove); +} diff --git a/src/gs-update-list.h b/src/gs-update-list.h new file mode 100644 index 0000000..a8a12ec --- /dev/null +++ b/src/gs-update-list.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2014-2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_UPDATE_LIST (gs_update_list_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsUpdateList, gs_update_list, GS, UPDATE_LIST, GtkWidget) + +struct _GsUpdateListClass +{ + GtkWidgetClass parent_class; +}; + +GtkWidget *gs_update_list_new (void); +void gs_update_list_remove_all (GsUpdateList *update_list); +void gs_update_list_add_app (GsUpdateList *update_list, + GsApp *app); + +G_END_DECLS diff --git a/src/gs-update-monitor.c b/src/gs-update-monitor.c new file mode 100644 index 0000000..df5d8dc --- /dev/null +++ b/src/gs-update-monitor.c @@ -0,0 +1,1642 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2018 Richard Hughes + * Copyright (C) 2013 Matthias Clasen + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include +#include + +#include "gs-update-monitor.h" +#include "gs-common.h" + +#define SECONDS_IN_AN_HOUR (60 * 60) +#define SECONDS_IN_A_DAY (SECONDS_IN_AN_HOUR * 24) +#define MINUTES_IN_A_DAY (SECONDS_IN_A_DAY / 60) + +struct _GsUpdateMonitor { + GObject parent; + + GsApplication *application; + + /* We use three cancellables: + * - @shutdown_cancellable is cancelled only during shutdown/dispose of + * the #GsUpdateMonitor, to avoid long-running operations keeping the + * monitor alive. + * - @update_cancellable is for update/upgrade operations, and is + * cancelled if they should be cancelled, such as if the computer has + * to start trying to save power. + * - @refresh_cancellable is for refreshes and other inconsequential + * operations which can be cancelled more readily than + * @update_cancellable with fewer consequences. It’s cancelled if the + * computer is going into low power mode, or if network connectivity + * changes. + */ + GCancellable *shutdown_cancellable; /* (owned) (not nullable) */ + GCancellable *update_cancellable; /* (owned) (not nullable) */ + GCancellable *refresh_cancellable; /* (owned) (not nullable) */ + + GSettings *settings; + GsPluginLoader *plugin_loader; + GDBusProxy *proxy_upower; + GError *last_offline_error; + + GNetworkMonitor *network_monitor; + guint network_changed_handler; + +#if GLIB_CHECK_VERSION(2, 69, 1) + GPowerProfileMonitor *power_profile_monitor; /* (owned) (nullable) */ + gulong power_profile_changed_handler; +#endif + + guint cleanup_notifications_id; /* at startup */ + guint check_startup_id; /* 60s after startup */ + guint check_hourly_id; /* and then every hour */ + guint check_daily_id; /* every 3rd day */ + + gint64 last_notification_time_usec; /* to notify once per day only */ + gint64 last_get_updates; /* used when automatic updates are off */ + gint randomized_hour; /* to avoid all clients checking at same small interval */ +}; + +G_DEFINE_TYPE (GsUpdateMonitor, gs_update_monitor, G_TYPE_OBJECT) + +typedef struct { + GsUpdateMonitor *monitor; + gint64 check_timestamp; /* "check-timestamp" to set, or 0 to not set it */ +} DownloadUpdatesData; + +static void +download_updates_data_free (DownloadUpdatesData *data) +{ + g_clear_object (&data->monitor); + g_slice_free (DownloadUpdatesData, data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(DownloadUpdatesData, download_updates_data_free); + +typedef struct { + GsUpdateMonitor *monitor; + GsApp *app; +} WithAppData; + +static WithAppData * +with_app_data_new (GsUpdateMonitor *monitor, + GsApp *app) +{ + WithAppData *data; + data = g_slice_new0 (WithAppData); + data->monitor = g_object_ref (monitor); + data->app = g_object_ref (app); + return data; +} + +static void +with_app_data_free (WithAppData *data) +{ + g_clear_object (&data->monitor); + g_clear_object (&data->app); + g_slice_free (WithAppData, data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(WithAppData, with_app_data_free); + +static void +check_updates_kind (GsAppList *apps, + gboolean *out_has_important, + gboolean *out_all_downloaded, + gboolean *out_any_downloaded) +{ + gboolean has_important, all_downloaded, any_downloaded; + guint ii, len; + GsApp *app; + + len = gs_app_list_length (apps); + has_important = FALSE; + all_downloaded = len > 0; + any_downloaded = FALSE; + + for (ii = 0; ii < len && (!has_important || all_downloaded || !any_downloaded); ii++) { + gboolean is_important; + + app = gs_app_list_index (apps, ii); + + is_important = gs_app_get_update_urgency (app) >= AS_URGENCY_KIND_CRITICAL; + has_important = has_important || is_important; + + if (gs_app_is_downloaded (app)) + any_downloaded = TRUE; + else + all_downloaded = FALSE; + } + + *out_has_important = has_important; + *out_all_downloaded = all_downloaded; + *out_any_downloaded = any_downloaded; +} + +static gboolean +get_timestamp_difference_days (GsUpdateMonitor *monitor, const gchar *timestamp, gint64 *out_days) +{ + gint64 tmp; + g_autoptr(GDateTime) last_update = NULL; + g_autoptr(GDateTime) now = NULL; + + g_return_val_if_fail (out_days != NULL, FALSE); + + g_settings_get (monitor->settings, timestamp, "x", &tmp); + if (tmp == 0) + return FALSE; + + last_update = g_date_time_new_from_unix_local (tmp); + if (last_update == NULL) { + g_warning ("failed to set timestamp %" G_GINT64_FORMAT, tmp); + return FALSE; + } + + now = g_date_time_new_now_local (); + + *out_days = g_date_time_difference (now, last_update) / G_TIME_SPAN_DAY; + + return TRUE; +} + +static gboolean +check_if_timestamp_more_than_days_ago (GsUpdateMonitor *monitor, const gchar *timestamp, guint days) +{ + gint64 timestamp_days; + + if (!get_timestamp_difference_days (monitor, timestamp, ×tamp_days)) + return TRUE; + + return timestamp_days >= days; +} + +static gboolean +should_download_updates (GsUpdateMonitor *monitor) +{ +#ifdef HAVE_MOGWAI + return TRUE; +#else + return g_settings_get_boolean (monitor->settings, "download-updates"); +#endif +} + +/* The days below are discussed at https://gitlab.gnome.org/GNOME/gnome-software/-/issues/947 + and https://gitlab.gnome.org/Teams/Design/software-mockups/-/raw/master/old/updates-logic.png */ +static gboolean +should_notify_about_pending_updates (GsUpdateMonitor *monitor, + GsAppList *apps, + gboolean can_download, + const gchar **out_title, + const gchar **out_body) +{ + gboolean has_important = FALSE, all_downloaded = FALSE, any_downloaded = FALSE; + gboolean should_download, res = FALSE; + gint64 timestamp_days; + + if (!get_timestamp_difference_days (monitor, "update-notification-timestamp", ×tamp_days)) { + /* Large-enough number to succeed for the initial test */ + timestamp_days = 365; + } + + should_download = should_download_updates (monitor); + if (apps != NULL) + check_updates_kind (apps, &has_important, &all_downloaded, &any_downloaded); + + if (apps == NULL || !gs_app_list_length (apps)) { + /* Notify only when the download is disabled, or cannot download, and it's the 4th day or it's more than 7 days */ + if ((!should_download || !can_download) && (timestamp_days >= 7 || timestamp_days == 4)) { + *out_title = _("Updates Are Out of Date"); + *out_body = _("Please check for available updates"); + res = TRUE; + } + } else if (has_important) { + if (timestamp_days >= 1) { + if (all_downloaded) { + *out_title = _("Critical Updates Ready to Install"); + *out_body = _("Install critical updates as soon as possible"); + res = TRUE; + } else if (!should_download) { + *out_title = _("Critical Updates Available to Download"); + *out_body = _("Download critical updates as soon as possible"); + res = TRUE; + } + } + } else if (all_downloaded) { + if (timestamp_days >= 3) { + *out_title = _("Updates Ready to Install"); + *out_body = _("Software updates are ready and waiting"); + res = TRUE; + } + /* To not hide downloaded updates for 14 days when new updates were discovered meanwhile. + Never show "Available to Download" when it's supposed to download the updates. */ + } else if (!should_download && timestamp_days >= 14) { + *out_title = _("Updates Available to Download"); + *out_body = _("Software updates can be downloaded"); + res = TRUE; + } + + g_debug ("%s: last_test_days:%" G_GINT64_FORMAT " n-apps:%u should_download:%d can_download:%d has_important:%d " + "all_downloaded:%d any_downloaded:%d res:%d%s%s%s%s", G_STRFUNC, + timestamp_days, apps == NULL ? 0 : gs_app_list_length (apps), should_download, can_download, has_important, + all_downloaded, any_downloaded, res, + res ? " reason:" : "", + res ? *out_title : "", + res ? "|" : "", + res ? *out_body : ""); + + return res; +} + +static void +reset_update_notification_timestamp (GsUpdateMonitor *monitor) +{ + g_autoptr(GDateTime) now = NULL; + + now = g_date_time_new_now_local (); + g_settings_set (monitor->settings, "update-notification-timestamp", "x", + g_date_time_to_unix (now)); +} + +static void +notify_about_pending_updates (GsUpdateMonitor *monitor, + GsAppList *apps, + gboolean can_download) +{ + const gchar *title = NULL, *body = NULL; + gint64 time_diff_sec; + g_autoptr(GNotification) nn = NULL; + + time_diff_sec = (g_get_real_time () - monitor->last_notification_time_usec) / G_USEC_PER_SEC; + if (time_diff_sec < SECONDS_IN_A_DAY) { + g_debug ("Skipping update notification daily check, because made one only %" G_GINT64_FORMAT "s ago", + time_diff_sec); + return; + } + + if (!should_notify_about_pending_updates (monitor, apps, can_download, &title, &body)) { + g_debug ("No update notification needed"); + return; + } + + if (can_download) { + /* To force reload of the Updates page, thus it reflects what + the update-monitor notifies about */ + gs_plugin_loader_emit_updates_changed (monitor->plugin_loader); + } + + monitor->last_notification_time_usec = g_get_real_time (); + + g_debug ("Notify about update: '%s'", title); + + nn = g_notification_new (title); + g_notification_set_body (nn, body); + g_notification_set_default_action_and_target (nn, "app.set-mode", "s", "updates"); + gs_application_send_notification (monitor->application, "updates-available", nn, MINUTES_IN_A_DAY); + + /* Keep the old notification time if we cannot download updates (in which case apps == NULL), + * or when there are no updates and the update download is disabled, + * to notify the user every day after 7 days of no update check */ + if (apps != NULL && (gs_app_list_length (apps) > 0 || + should_download_updates (monitor))) + reset_update_notification_timestamp (monitor); +} + +static gboolean +_filter_by_app_kind (GsApp *app, gpointer user_data) +{ + AsComponentKind kind = GPOINTER_TO_UINT (user_data); + return gs_app_get_kind (app) == kind; +} + +static gboolean +_sort_by_rating_cb (GsApp *app1, GsApp *app2, gpointer user_data) +{ + if (gs_app_get_rating (app1) < gs_app_get_rating (app2)) + return -1; + if (gs_app_get_rating (app1) > gs_app_get_rating (app2)) + return 1; + return 0; +} + +static GNotification * +_build_autoupdated_notification (GsUpdateMonitor *monitor, GsAppList *list) +{ + guint need_restart_cnt = 0; + g_autoptr(GsAppList) list_apps = NULL; + g_autoptr(GNotification) n = NULL; + g_autoptr(GString) body = g_string_new (NULL); + g_autofree gchar *title = NULL; + + /* filter out apps */ + list_apps = gs_app_list_copy (list); + gs_app_list_filter (list_apps, + _filter_by_app_kind, + GUINT_TO_POINTER(AS_COMPONENT_KIND_DESKTOP_APP)); + gs_app_list_sort (list_apps, _sort_by_rating_cb, NULL); + /* FIXME: add the apps that are currently active that use one + * of the updated runtimes */ + if (gs_app_list_length (list_apps) == 0) { + g_debug ("no desktop apps in updated list, ignoring"); + return NULL; + } + + /* how many apps needs updating */ + for (guint i = 0; i < gs_app_list_length (list_apps); i++) { + GsApp *app = gs_app_list_index (list_apps, i); + if (gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) + need_restart_cnt++; + } + + /* >1 app updated */ + if (gs_app_list_length (list_apps) > 0) { + if (need_restart_cnt > 0) { + /* TRANSLATORS: apps were auto-updated and restart is required */ + title = g_strdup_printf (ngettext ("%u App Updated — Restart Required", + "%u Apps Updated — Restart Required", + gs_app_list_length (list_apps)), + gs_app_list_length (list_apps)); + } else { + /* TRANSLATORS: apps were auto-updated */ + title = g_strdup_printf (ngettext ("%u App Updated", + "%u Apps Updated", + gs_app_list_length (list_apps)), + gs_app_list_length (list_apps)); + } + } + + /* 1 app updated */ + if (gs_app_list_length (list_apps) == 1) { + GsApp *app = gs_app_list_index (list_apps, 0); + /* TRANSLATORS: %1 is an app name, e.g. Firefox */ + g_string_append_printf (body, _("%s has been updated."), gs_app_get_name (app)); + if (need_restart_cnt > 0) { + /* TRANSLATORS: the app needs restarting */ + g_string_append_printf (body, " %s", _("Please restart the app.")); + } + + /* 2 apps updated */ + } else if (gs_app_list_length (list_apps) == 2) { + GsApp *app1 = gs_app_list_index (list_apps, 0); + GsApp *app2 = gs_app_list_index (list_apps, 1); + /* TRANSLATORS: %1 and %2 are both app names, e.g. Firefox */ + g_string_append_printf (body, _("%s and %s have been updated."), + gs_app_get_name (app1), + gs_app_get_name (app2)); + if (need_restart_cnt > 0) { + g_string_append (body, " "); + /* TRANSLATORS: at least one app needs restarting */ + g_string_append_printf (body, ngettext ("%u app requires a restart.", + "%u apps require a restart.", + need_restart_cnt), + need_restart_cnt); + } + + /* 3+ apps */ + } else if (gs_app_list_length (list_apps) >= 3) { + GsApp *app1 = gs_app_list_index (list_apps, 0); + GsApp *app2 = gs_app_list_index (list_apps, 1); + GsApp *app3 = gs_app_list_index (list_apps, 2); + /* TRANSLATORS: %1, %2 and %3 are all app names, e.g. Firefox */ + g_string_append_printf (body, _("Includes %s, %s and %s."), + gs_app_get_name (app1), + gs_app_get_name (app2), + gs_app_get_name (app3)); + if (need_restart_cnt > 0) { + g_string_append (body, " "); + /* TRANSLATORS: at least one app needs restarting */ + g_string_append_printf (body, ngettext ("%u app requires a restart.", + "%u apps require a restart.", + need_restart_cnt), + need_restart_cnt); + } + } + + /* create the notification */ + n = g_notification_new (title); + if (body->len > 0) + g_notification_set_body (n, body->str); + g_notification_set_default_action_and_target (n, "app.set-mode", "s", "updated"); + return g_steal_pointer (&n); +} + +typedef struct { + GsUpdateMonitor *monitor; /* (owned) */ + GsPluginJob *job; /* (owned) */ +} UpdateAppsData; + +static void +update_apps_data_free (UpdateAppsData *data) +{ + g_clear_object (&data->monitor); + g_clear_object (&data->job); + g_free (data); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (UpdateAppsData, update_apps_data_free) + +static void +update_finished_cb (GObject *object, GAsyncResult *res, gpointer user_data) +{ + g_autoptr(UpdateAppsData) data = g_steal_pointer (&user_data); + GsUpdateMonitor *monitor = data->monitor; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + /* get result */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + gs_plugin_loader_claim_job_error (plugin_loader, + NULL, + data->job, + error); + return; + } + + /* notifications are optional */ + if (g_settings_get_boolean (monitor->settings, "download-updates-notify")) { + g_autoptr(GNotification) n = NULL; + gs_application_withdraw_notification (monitor->application, "updates-installed"); + n = _build_autoupdated_notification (monitor, list); + if (n != NULL) + gs_application_send_notification (monitor->application, "updates-installed", n, MINUTES_IN_A_DAY); + } +} + +static gboolean +_should_auto_update (GsApp *app) +{ + if (gs_app_get_state (app) != GS_APP_STATE_UPDATABLE_LIVE) + return FALSE; + if (gs_app_has_quirk (app, GS_APP_QUIRK_NEW_PERMISSIONS)) + return FALSE; + if (gs_app_has_quirk (app, GS_APP_QUIRK_DO_NOT_AUTO_UPDATE)) + return FALSE; + return TRUE; +} + +static void +download_finished_cb (GObject *object, GAsyncResult *res, gpointer user_data) +{ + g_autoptr(UpdateAppsData) data = g_steal_pointer (&user_data); + GsUpdateMonitor *monitor = data->monitor; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + g_autoptr(GsAppList) update_online = NULL; + g_autoptr(GsAppList) update_offline = NULL; + GsAppList *job_apps; + + /* the returned list is always empty, the existence indicates success */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + gs_plugin_loader_claim_job_error (plugin_loader, + NULL, + data->job, + error); + return; + } + + job_apps = gs_plugin_job_update_apps_get_apps (GS_PLUGIN_JOB_UPDATE_APPS (data->job)); + update_online = gs_app_list_new (); + update_offline = gs_app_list_new (); + for (guint i = 0; i < gs_app_list_length (job_apps); i++) { + GsApp *app = gs_app_list_index (job_apps, i); + if (_should_auto_update (app)) { + g_debug ("auto-updating %s", gs_app_get_unique_id (app)); + gs_app_list_add (update_online, app); + } else { + gs_app_list_add (update_offline, app); + } + } + + /* install any apps that can be installed LIVE */ + if (gs_app_list_length (update_online) > 0) { + g_autoptr(GsPluginJob) plugin_job = NULL; + + plugin_job = gs_plugin_job_update_apps_new (update_online, + GS_PLUGIN_UPDATE_APPS_FLAGS_NONE); + gs_plugin_job_set_propagate_error (plugin_job, TRUE); + gs_plugin_loader_job_process_async (monitor->plugin_loader, + plugin_job, + monitor->update_cancellable, + update_finished_cb, + g_steal_pointer (&data)); + } + + /* show a notification for offline updates */ + if (gs_app_list_length (update_offline) > 0) + notify_about_pending_updates (monitor, update_offline, TRUE); +} + +static void +get_updates_finished_cb (GObject *object, GAsyncResult *res, gpointer user_data) +{ + g_autoptr(DownloadUpdatesData) download_updates_data = (DownloadUpdatesData *) user_data; + GsUpdateMonitor *monitor = download_updates_data->monitor; + guint64 security_timestamp = 0; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) apps = NULL; + gboolean install_timestamp_outdated; + gboolean should_download; + + /* get result */ + apps = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (object), res, &error); + if (apps == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_warning ("failed to get updates: %s", error->message); + notify_about_pending_updates (monitor, NULL, TRUE); + } + return; + } + + /* Update the check-timestamp, when this call is part of the auto-update */ + if (download_updates_data->check_timestamp > 0) + g_settings_set (monitor->settings, "check-timestamp", "x", download_updates_data->check_timestamp); + + /* no updates */ + if (gs_app_list_length (apps) == 0) { + g_debug ("no updates; withdrawing updates-available notification"); + gs_application_withdraw_notification (monitor->application, "updates-available"); + return; + } + + /* find security updates */ + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + guint64 size_download_bytes; + GsSizeType size_download_type = gs_app_get_size_download (app, &size_download_bytes); + + if (gs_app_get_update_urgency (app) >= AS_URGENCY_KIND_CRITICAL && + size_download_type == GS_SIZE_TYPE_VALID && + size_download_bytes > 0) { + security_timestamp = (guint64) g_get_real_time (); + break; + } + } + if (security_timestamp > 0) { + g_settings_set (monitor->settings, + "security-timestamp", "x", security_timestamp); + } + + g_debug ("got %u updates", gs_app_list_length (apps)); + + should_download = should_download_updates (monitor); + install_timestamp_outdated = check_if_timestamp_more_than_days_ago (monitor, "install-timestamp", 14); + + if (should_download && (security_timestamp > 0 || install_timestamp_outdated)) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(UpdateAppsData) data = NULL; + + /* download any updates; individual plugins are responsible for deciding + * whether it’s appropriate to unconditionally download the updates, or + * to schedule the download in accordance with the user’s metered data + * preferences */ + plugin_job = gs_plugin_job_update_apps_new (apps, + GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY); + gs_plugin_job_set_propagate_error (plugin_job, TRUE); + + data = g_new0 (UpdateAppsData, 1); + data->monitor = g_object_ref (monitor); + data->job = g_object_ref (plugin_job); + + g_debug ("Getting updates, because%s%s%s", security_timestamp > 0 ? + " security timestamp changed" : "", (security_timestamp > 0 && install_timestamp_outdated) ? + " and" : "", + install_timestamp_outdated ? + " install timestamp is more than 14 days ago" : ""); + gs_plugin_loader_job_process_async (monitor->plugin_loader, + plugin_job, + monitor->refresh_cancellable, + download_finished_cb, + g_steal_pointer (&data)); + } else { + g_autoptr(GsAppList) update_online = NULL; + g_autoptr(GsAppList) update_offline = NULL; + GsAppList *notify_list; + + update_online = gs_app_list_new (); + update_offline = gs_app_list_new (); + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + if (_should_auto_update (app)) { + g_debug ("download for auto-update %s", gs_app_get_unique_id (app)); + gs_app_list_add (update_online, app); + } else { + gs_app_list_add (update_offline, app); + } + } + + g_debug ("Received %u apps to update, %u are online and %u offline updates; will%s download online updates", + gs_app_list_length (apps), + gs_app_list_length (update_online), + gs_app_list_length (update_offline), + should_download ? "" : " not"); + + if (should_download && gs_app_list_length (update_online) > 0) { + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(UpdateAppsData) data = NULL; + + plugin_job = gs_plugin_job_update_apps_new (update_online, + GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY); + gs_plugin_job_set_propagate_error (plugin_job, TRUE); + + data = g_new0 (UpdateAppsData, 1); + data->monitor = g_object_ref (monitor); + data->job = g_object_ref (plugin_job); + + g_debug ("Getting %u online updates", gs_app_list_length (update_online)); + gs_plugin_loader_job_process_async (monitor->plugin_loader, + plugin_job, + monitor->refresh_cancellable, + download_finished_cb, + g_steal_pointer (&data)); + } + + if (should_download) + notify_list = update_offline; + else + notify_list = apps; + + notify_about_pending_updates (monitor, notify_list, TRUE); + } +} + +static gboolean +should_show_upgrade_notification (GsUpdateMonitor *monitor) +{ + return check_if_timestamp_more_than_days_ago (monitor, "upgrade-notification-timestamp", 7); +} + +static void +get_system_finished_cb (GObject *object, GAsyncResult *res, gpointer data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object); + GsUpdateMonitor *monitor = data; + g_autoptr(GError) error = NULL; + g_autoptr(GNotification) n = NULL; + g_autoptr(GsApp) app = NULL; + + /* get result */ + app = gs_plugin_loader_get_system_app_finish (plugin_loader, res, &error); + if (app == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to get system: %s", error->message); + return; + } + + /* might be already showing, so just withdraw it and re-issue it */ + gs_application_withdraw_notification (monitor->application, "eol"); + + /* do not show when the main window is active */ + if (gs_application_has_active_window (monitor->application)) + return; + + /* is not EOL */ + if (gs_app_get_state (app) != GS_APP_STATE_UNAVAILABLE) + return; + + /* TRANSLATORS: this is when the current operating system version goes end-of-life */ + n = g_notification_new (_("System Has Reached End of Life")); + /* TRANSLATORS: this is the message dialog for the distro EOL notice */ + g_notification_set_body (n, _("Upgrade to continue receiving updates")); + g_notification_set_default_action_and_target (n, "app.set-mode", "s", "updates"); + gs_application_send_notification (monitor->application, "eol", n, MINUTES_IN_A_DAY); +} + +static void +get_upgrades_finished_cb (GObject *object, + GAsyncResult *res, + gpointer data) +{ + GsUpdateMonitor *monitor = GS_UPDATE_MONITOR (data); + GsApp *app; + g_autofree gchar *body = NULL; + g_autoptr(GDateTime) now = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(GNotification) n = NULL; + g_autoptr(GsAppList) apps = NULL; + + /* get result */ + apps = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (object), res, &error); + if (apps == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_warning ("failed to get upgrades: %s", + error->message); + } + return; + } + + /* no results */ + if (gs_app_list_length (apps) == 0) { + g_debug ("no upgrades; withdrawing upgrades-available notification"); + gs_application_withdraw_notification (monitor->application, "upgrades-available"); + return; + } + + /* do not show if gnome-software is already open */ + if (gs_application_has_active_window (monitor->application)) + return; + + /* only nag about upgrades once per week */ + if (!should_show_upgrade_notification (monitor)) + return; + + g_debug ("showing distro upgrade notification"); + now = g_date_time_new_now_local (); + g_settings_set (monitor->settings, "upgrade-notification-timestamp", "x", + g_date_time_to_unix (now)); + + /* rely on the app list already being sorted with the + * chronologically newest release last */ + app = gs_app_list_index (apps, gs_app_list_length (apps) - 1); + + /* TRANSLATORS: this is a distro upgrade, the replacement would be the + * distro name, e.g. 'Fedora' */ + body = g_strdup_printf (_("A new version of %s is available to install"), + gs_app_get_name (app)); + + /* TRANSLATORS: this is a distro upgrade */ + n = g_notification_new (_("Software Upgrade Available")); + g_notification_set_body (n, body); + g_notification_set_default_action_and_target (n, "app.set-mode", "s", "updates"); + gs_application_send_notification (monitor->application, "upgrades-available", n, MINUTES_IN_A_DAY); +} + +static void +get_updates (GsUpdateMonitor *monitor, + gint64 check_timestamp) +{ + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(DownloadUpdatesData) download_updates_data = NULL; + + /* disabled in gsettings or from a plugin */ + if (!gs_plugin_loader_get_allow_updates (monitor->plugin_loader)) { + g_debug ("not getting updates as not enabled"); + return; + } + + download_updates_data = g_slice_new0 (DownloadUpdatesData); + download_updates_data->monitor = g_object_ref (monitor); + download_updates_data->check_timestamp = check_timestamp; + + /* NOTE: this doesn't actually do any network access */ + g_debug ("Getting updates"); + query = gs_app_query_new ("is-for-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + gs_plugin_loader_job_process_async (monitor->plugin_loader, + plugin_job, + monitor->update_cancellable, + get_updates_finished_cb, + g_steal_pointer (&download_updates_data)); +} + +void +gs_update_monitor_autoupdate (GsUpdateMonitor *monitor) +{ + get_updates (monitor, 0); +} + +typedef enum { + UP_DEVICE_LEVEL_UNKNOWN, + UP_DEVICE_LEVEL_NONE, + UP_DEVICE_LEVEL_DISCHARGING, + UP_DEVICE_LEVEL_LOW, + UP_DEVICE_LEVEL_CRITICAL, + UP_DEVICE_LEVEL_ACTION, + UP_DEVICE_LEVEL_LAST +} UpDeviceLevel; + +static void +get_upgrades (GsUpdateMonitor *monitor) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* disabled in gsettings or from a plugin */ + if (!gs_plugin_loader_get_allow_updates (monitor->plugin_loader)) { + g_debug ("not getting upgrades as not enabled"); + return; + } + + /* never refresh when the battery is low */ + if (monitor->proxy_upower != NULL) { + g_autoptr(GVariant) val = NULL; + val = g_dbus_proxy_get_cached_property (monitor->proxy_upower, + "WarningLevel"); + if (val != NULL) { + guint32 level = g_variant_get_uint32 (val); + if (level >= UP_DEVICE_LEVEL_LOW) { + g_debug ("not getting upgrades on low power"); + return; + } + } + } else { + g_debug ("no UPower support, so not doing power level checks"); + } + + /* do not run when in power saver mode */ + if (gs_plugin_loader_get_power_saver (monitor->plugin_loader)) { + g_debug ("Not checking for upgrades with power saver enabled"); + return; + } + + if (gs_plugin_loader_get_game_mode (monitor->plugin_loader)) { + g_debug ("Not getting upgrades with enabled GameMode"); + return; + } + + /* NOTE: this doesn't actually do any network access, it relies on the + * AppStream data being up to date, either by the appstream-data + * package being up-to-date, or the metadata being auto-downloaded */ + g_debug ("Getting upgrades"); + plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE, + GS_PLUGIN_REFINE_FLAGS_NONE); + gs_plugin_loader_job_process_async (monitor->plugin_loader, + plugin_job, + monitor->update_cancellable, + get_upgrades_finished_cb, + monitor); +} + +static void +get_system (GsUpdateMonitor *monitor) +{ + g_debug ("Getting system"); + gs_plugin_loader_get_system_app_async (monitor->plugin_loader, monitor->update_cancellable, + get_system_finished_cb, monitor); +} + +static void +refresh_cache_finished_cb (GObject *object, + GAsyncResult *res, + gpointer data) +{ + GsUpdateMonitor *monitor = data; + g_autoptr(GDateTime) now = NULL; + g_autoptr(GError) error = NULL; + + if (!gs_plugin_loader_job_action_finish (GS_PLUGIN_LOADER (object), res, &error)) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("failed to refresh the cache: %s", error->message); + return; + } + + /* update the last checked timestamp */ + now = g_date_time_new_now_local (); + get_updates (monitor, g_date_time_to_unix (now)); +} + +static void +install_language_pack_cb (GObject *object, GAsyncResult *res, gpointer data) +{ + g_autoptr(GError) error = NULL; + g_autoptr(WithAppData) with_app_data = data; + + if (!gs_plugin_loader_job_action_finish (GS_PLUGIN_LOADER (object), res, &error)) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_debug ("failed to install language pack: %s", error->message); + return; + } else { + g_debug ("language pack for %s installed", + gs_app_get_name (with_app_data->app)); + } +} + +static void +get_language_pack_cb (GObject *object, GAsyncResult *res, gpointer data) +{ + GsUpdateMonitor *monitor = GS_UPDATE_MONITOR (data); + GsApp *app; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) app_list = NULL; + + app_list = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (object), res, &error); + if (app_list == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_debug ("failed to find language pack: %s", error->message); + return; + } + + /* none found */ + if (gs_app_list_length (app_list) == 0) { + g_debug ("no language pack found"); + return; + } + + /* there should be one langpack for a given locale */ + app = g_object_ref (gs_app_list_index (app_list, 0)); + if (!gs_app_is_installed (app)) { + WithAppData *with_app_data; + g_autoptr(GsPluginJob) plugin_job = NULL; + + with_app_data = with_app_data_new (monitor, app); + + plugin_job = gs_plugin_job_install_apps_new (app_list, + GS_PLUGIN_INSTALL_APPS_FLAGS_NONE); + gs_plugin_loader_job_process_async (monitor->plugin_loader, + plugin_job, + monitor->update_cancellable, + install_language_pack_cb, + with_app_data); + } +} + +/* + * determines active locale and looks for langpacks + * installs located language pack, if not already + */ +static void +check_language_pack (GsUpdateMonitor *monitor) { + + const gchar *locale; + g_autoptr(GsPluginJob) plugin_job = NULL; + + locale = setlocale (LC_MESSAGES, NULL); + plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_LANGPACKS, + "search", locale, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON, + NULL); + gs_plugin_loader_job_process_async (monitor->plugin_loader, + plugin_job, + monitor->update_cancellable, + get_language_pack_cb, + monitor); +} + +/* + * sets a random delay hour in [0, 6) for daily update check + */ +static void +update_randomized_hour (GsUpdateMonitor *monitor) +{ + monitor->randomized_hour = g_random_int_range (0, 6); +} + +/* + * gets the midnight of the current day, for daily update datetime comparison + */ +static GDateTime* +get_midnight (GDateTime *datetime) +{ + gint year, month, day; + GDateTime *midnight = NULL; + + g_date_time_get_ymd (datetime, &year, &month, &day); + midnight = g_date_time_new_local (year, month, day, 0, 0, 0); + g_assert (midnight != NULL); + return midnight; +} + +static void +check_updates (GsUpdateMonitor *monitor) +{ + gboolean can_download; + gint64 tmp; + g_autoptr(GDateTime) last_refreshed = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* never refresh when the battery is low */ + if (monitor->proxy_upower != NULL) { + g_autoptr(GVariant) val = NULL; + val = g_dbus_proxy_get_cached_property (monitor->proxy_upower, + "WarningLevel"); + if (val != NULL) { + guint32 level = g_variant_get_uint32 (val); + if (level >= UP_DEVICE_LEVEL_LOW) { + g_debug ("not getting updates on low power"); + return; + } + } + } else { + g_debug ("no UPower support, so not doing power level checks"); + } + + g_settings_get (monitor->settings, "check-timestamp", "x", &tmp); + last_refreshed = g_date_time_new_from_unix_local (tmp); + if (last_refreshed != NULL) { + gint now_hour; + GTimeSpan day_interval; + g_autoptr(GDateTime) now = NULL; + g_autoptr(GDateTime) last_refreshed_midnight = NULL; + g_autoptr(GDateTime) now_midnight = NULL; + + now = g_date_time_new_now_local (); + + now_midnight = get_midnight (now); + now_hour = g_date_time_get_hour (now); + + last_refreshed_midnight = get_midnight (last_refreshed); + + day_interval = g_date_time_difference (now_midnight, last_refreshed_midnight); + + /* check that it is the next day */ + if (day_interval < G_TIME_SPAN_DAY) { + g_debug ("Not getting updates, did so not more than a day ago"); + return; + } + + /* ...and past 6-11am (with randomized hour), if interval is within 2 days */ + if (day_interval < 2 * G_TIME_SPAN_DAY && !(now_hour >= 6 + monitor->randomized_hour)) { + g_debug ("Not getting updates, it's too early"); + return; + } + + /* or the update has been delayed another day + * randomized_hour should not be used in this case + */ + if (day_interval >= 2 * G_TIME_SPAN_DAY && !(now_hour >= 6)) { + g_debug ("Not getting updates, it's before 6 am"); + return; + } + } + + /* never check for updates when offline */ + can_download = gs_plugin_loader_get_network_available (monitor->plugin_loader); + + if (!can_download) + g_debug ("Not getting updates without network"); + + if (can_download) { + gboolean refresh_on_metered; + +#ifdef HAVE_MOGWAI + refresh_on_metered = TRUE; +#else + refresh_on_metered = g_settings_get_boolean (monitor->settings, + "refresh-when-metered"); +#endif + + if (!refresh_on_metered && + gs_plugin_loader_get_network_metered (monitor->plugin_loader)) { + g_debug ("Not getting updates on metered network"); + can_download = FALSE; + } + } + + if (can_download) { + /* never refresh when in power saver mode */ + if (gs_plugin_loader_get_power_saver (monitor->plugin_loader)) { + g_debug ("Not getting updates with power saver enabled"); + can_download = FALSE; + } else if (monitor->power_profile_monitor == NULL) { + g_debug ("No power profile monitor support, so not doing power profile checks"); + } + } + + if (can_download) { + if (gs_plugin_loader_get_game_mode (monitor->plugin_loader)) { + g_debug ("Not getting updates with enabled GameMode"); + can_download = FALSE; + } + } + + if (can_download) { + /* check for language pack */ + check_language_pack (monitor); + } else { + /* will notify about outdated updates when needed, not always */ + notify_about_pending_updates (monitor, NULL, FALSE); + return; + } + + if (!should_download_updates (monitor)) { + gint64 now_secs; + + /* cannot update "check-timestamp", because it corresponds + to the cache refresh, not when only asking plugins what + cached updates are available */ + now_secs = g_get_real_time () / G_USEC_PER_SEC; + if ((now_secs - monitor->last_get_updates) >= SECONDS_IN_A_DAY) { + monitor->last_get_updates = now_secs; + get_updates (monitor, 0); + } + return; + } + + g_debug ("Daily update check due"); + /* update randomized_hour for next daily update check */ + if (last_refreshed != NULL) + update_randomized_hour (monitor); + plugin_job = gs_plugin_job_refresh_metadata_new (60 * 60 * 24, + GS_PLUGIN_REFRESH_METADATA_FLAGS_NONE); + gs_plugin_loader_job_process_async (monitor->plugin_loader, plugin_job, + monitor->refresh_cancellable, + refresh_cache_finished_cb, + monitor); +} + +static gboolean +check_hourly_cb (gpointer data) +{ + GsUpdateMonitor *monitor = data; + + g_debug ("Hourly updates check"); + check_updates (monitor); + + return G_SOURCE_CONTINUE; +} + +static gboolean +check_thrice_daily_cb (gpointer data) +{ + GsUpdateMonitor *monitor = data; + + g_debug ("Daily upgrades check"); + get_upgrades (monitor); + get_system (monitor); + + return G_SOURCE_CONTINUE; +} + +static void +stop_upgrades_check (GsUpdateMonitor *monitor) +{ + if (monitor->check_daily_id == 0) + return; + + g_source_remove (monitor->check_daily_id); + monitor->check_daily_id = 0; +} + +static void +restart_upgrades_check (GsUpdateMonitor *monitor) +{ + stop_upgrades_check (monitor); + get_upgrades (monitor); + + monitor->check_daily_id = g_timeout_add_seconds (SECONDS_IN_A_DAY / 3, + check_thrice_daily_cb, + monitor); +} + +static void +stop_updates_check (GsUpdateMonitor *monitor) +{ + if (monitor->check_hourly_id == 0) + return; + + g_source_remove (monitor->check_hourly_id); + monitor->check_hourly_id = 0; +} + +static void +restart_updates_check (GsUpdateMonitor *monitor) +{ + stop_updates_check (monitor); + check_updates (monitor); + + monitor->check_hourly_id = g_timeout_add_seconds (SECONDS_IN_AN_HOUR, check_hourly_cb, + monitor); +} + +static gboolean +check_updates_on_startup_cb (gpointer data) +{ + GsUpdateMonitor *monitor = data; + + g_debug ("First hourly updates check"); + restart_updates_check (monitor); + + if (gs_plugin_loader_get_allow_updates (monitor->plugin_loader)) + restart_upgrades_check (monitor); + + monitor->check_startup_id = 0; + return G_SOURCE_REMOVE; +} + +static void +check_updates_upower_changed_cb (GDBusProxy *proxy, + GParamSpec *pspec, + GsUpdateMonitor *monitor) +{ + g_debug ("upower changed updates check"); + check_updates (monitor); +} + +static void +network_available_notify_cb (GsPluginLoader *plugin_loader, + GParamSpec *pspec, + GsUpdateMonitor *monitor) +{ + check_updates (monitor); +} + +static void +get_updates_historical_cb (GObject *object, GAsyncResult *res, gpointer data) +{ + GsUpdateMonitor *monitor = data; + GsApp *os_upgrade_app = NULL; + guint64 latest_install_date = 0, now; + guint64 time_last_notified; + gboolean did_clamp = FALSE; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) apps = NULL; + g_autoptr(GNotification) notification = NULL; + + /* get result */ + apps = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (object), res, &error); + if (apps == NULL) { + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_debug ("Failed to get historical updates: %s", error->message); + g_clear_error (&monitor->last_offline_error); + return; + } + + /* save this in case the user clicks the + * 'Show Details' button from the notification below */ + g_clear_error (&monitor->last_offline_error); + monitor->last_offline_error = g_error_copy (error); + + /* TRANSLATORS: title when we offline updates have failed */ + notification = g_notification_new (_("Software Updates Failed")); + /* TRANSLATORS: message when we offline updates have failed */ + g_notification_set_body (notification, _("Prepared updates were not installed")); + g_notification_add_button (notification, _("Show Details"), "app.show-offline-update-error"); + g_notification_set_default_action (notification, "app.show-offline-update-error"); + gs_application_send_notification (monitor->application, "offline-updates", notification, MINUTES_IN_A_DAY); + return; + } + + /* no results */ + if (gs_app_list_length (apps) == 0) { + g_debug ("no historical updates; withdrawing notification"); + gs_application_withdraw_notification (monitor->application, "offline-updates"); + return; + } + + for (guint i = 0; i < gs_app_list_length (apps); i++) { + GsApp *app = gs_app_list_index (apps, i); + if (!latest_install_date || latest_install_date < gs_app_get_install_date (app)) + latest_install_date = gs_app_get_install_date (app); + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_OPERATING_SYSTEM) + os_upgrade_app = app; + } + + /* have we notified about this before */ + g_settings_get (monitor->settings, + "install-timestamp", "x", &time_last_notified); + now = (guint64) g_get_real_time (); + if (time_last_notified > now) { + time_last_notified = now; + did_clamp = TRUE; + } + if (latest_install_date > now) { + latest_install_date = now; + did_clamp = TRUE; + } + if (time_last_notified >= latest_install_date) { + if (did_clamp) { + g_settings_set (monitor->settings, + "install-timestamp", "x", latest_install_date); + } + return; + } + + if (os_upgrade_app != NULL) { + g_autofree gchar *message = NULL; + + /* TRANSLATORS: Notification title when we've done a distro upgrade */ + notification = g_notification_new (_("System Upgrade Complete")); + + /* TRANSLATORS: This is the notification body when we've done a + * distro upgrade. First %s is the distro name and the 2nd %s + * is the version, e.g. "Welcome to Fedora 28!" */ + message = g_strdup_printf (_("Welcome to %s %s!"), + gs_app_get_name (os_upgrade_app), + gs_app_get_version (os_upgrade_app)); + g_notification_set_body (notification, message); + } else { + const gchar *message; + const gchar *title; + + /* TRANSLATORS: title when we've done offline updates */ + title = ngettext ("Software Update Installed", + "Software Updates Installed", + gs_app_list_length (apps)); + /* TRANSLATORS: message when we've done offline updates */ + message = ngettext ("An important operating system update has been installed.", + "Important operating system updates have been installed.", + gs_app_list_length (apps)); + + notification = g_notification_new (title); + g_notification_set_body (notification, message); + /* TRANSLATORS: Button to look at the updates that were installed. + * Note that it has nothing to do with the app reviews, the + * users can't express their opinions here. In some languages + * "Review (evaluate) something" is a different translation than + * "Review (browse) something." */ + g_notification_add_button_with_target (notification, C_("updates", "Review"), "app.set-mode", "s", "updated"); + g_notification_set_default_action_and_target (notification, "app.set-mode", "s", "updated"); + } + gs_application_send_notification (monitor->application, "offline-updates", notification, MINUTES_IN_A_DAY); + + /* update the timestamp so we don't show again */ + g_settings_set (monitor->settings, + "install-timestamp", "x", latest_install_date); + + reset_update_notification_timestamp (monitor); +} + +static gboolean +cleanup_notifications_cb (gpointer user_data) +{ + GsUpdateMonitor *monitor = user_data; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* this doesn't do any network access, and is only called once just + * after startup, so don’t cancel it with refreshes/updates */ + g_debug ("getting historical updates for fresh session"); + query = gs_app_query_new ("is-historical-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION | + GS_PLUGIN_REFINE_FLAGS_DISABLE_FILTERING, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE); + gs_plugin_job_set_propagate_error (plugin_job, TRUE); + gs_plugin_loader_job_process_async (monitor->plugin_loader, + plugin_job, + monitor->shutdown_cancellable, + get_updates_historical_cb, + monitor); + + /* wait until first check to show */ + gs_application_withdraw_notification (monitor->application, "offline-updates"); + + monitor->cleanup_notifications_id = 0; + return G_SOURCE_REMOVE; +} + +void +gs_update_monitor_show_error (GsUpdateMonitor *monitor, GtkWindow *window) +{ + const gchar *title; + const gchar *msg; + gboolean show_detailed_error; + + /* can this happen in reality? */ + if (monitor->last_offline_error == NULL) + return; + + /* TRANSLATORS: this is when the offline update failed */ + title = _("Failed To Update"); + + if (g_error_matches (monitor->last_offline_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) { + /* TRANSLATORS: the user must have updated manually after + * the updates were prepared */ + msg = _("The system was already up to date."); + show_detailed_error = TRUE; + } else if (g_error_matches (monitor->last_offline_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (monitor->last_offline_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + /* TRANSLATORS: the user aborted the update manually */ + msg = _("The update was cancelled."); + show_detailed_error = FALSE; + } else if (g_error_matches (monitor->last_offline_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) { + /* TRANSLATORS: the package manager needed to download + * something with no network available */ + msg = _("Internet access was required but wasn’t available. " + "Please make sure that you have internet access and try again."); + show_detailed_error = FALSE; + } else if (g_error_matches (monitor->last_offline_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) { + /* TRANSLATORS: if the package is not signed correctly */ + msg = _("There were security issues with the update. " + "Please consult your software provider for more details."); + show_detailed_error = TRUE; + } else if (g_error_matches (monitor->last_offline_error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) { + /* TRANSLATORS: we ran out of disk space */ + msg = _("There wasn’t enough disk space. Please free up some space and try again."); + show_detailed_error = FALSE; + } else { + /* TRANSLATORS: We didn't handle the error type */ + msg = _("We’re sorry: the update failed to install. " + "Please wait for another update and try again. " + "If the problem persists, contact your software provider."); + show_detailed_error = TRUE; + } + + gs_utils_show_error_dialog (GTK_WIDGET (window), + title, + msg, + show_detailed_error ? monitor->last_offline_error->message : NULL); +} + +static void +allow_updates_notify_cb (GsPluginLoader *plugin_loader, + GParamSpec *pspec, + GsUpdateMonitor *monitor) +{ + if (gs_plugin_loader_get_allow_updates (plugin_loader)) { + /* We restart the updates check here to avoid the user + * potentially waiting for the hourly check */ + restart_updates_check (monitor); + restart_upgrades_check (monitor); + } else { + stop_upgrades_check (monitor); + } +} + +static void +gs_update_monitor_network_changed_cb (GNetworkMonitor *network_monitor, + gboolean available, + GsUpdateMonitor *monitor) +{ + /* cancel an on-going refresh if we're now in a metered connection */ + if (!g_settings_get_boolean (monitor->settings, "refresh-when-metered") && + g_network_monitor_get_network_metered (network_monitor)) { + g_cancellable_cancel (monitor->refresh_cancellable); + g_object_unref (monitor->refresh_cancellable); + monitor->refresh_cancellable = g_cancellable_new (); + } else { + /* Else, it might be time to check for updates */ + check_updates (monitor); + } +} + +#if GLIB_CHECK_VERSION(2, 69, 1) +static void +gs_update_monitor_power_profile_changed_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GsUpdateMonitor *self = GS_UPDATE_MONITOR (user_data); + + if (g_power_profile_monitor_get_power_saver_enabled (self->power_profile_monitor)) { + /* Cancel ongoing jobs, if we’re now in power saving mode. */ + g_cancellable_cancel (self->refresh_cancellable); + g_object_unref (self->refresh_cancellable); + self->refresh_cancellable = g_cancellable_new (); + + g_cancellable_cancel (self->update_cancellable); + g_object_unref (self->update_cancellable); + self->update_cancellable = g_cancellable_new (); + } else { + /* Else, it might be time to check for updates */ + check_updates (self); + } +} +#endif + +static void +gs_update_monitor_init (GsUpdateMonitor *monitor) +{ + GNetworkMonitor *network_monitor; + g_autoptr(GError) error = NULL; + monitor->settings = g_settings_new ("org.gnome.software"); + + /* cleanup at startup */ + monitor->cleanup_notifications_id = + g_idle_add (cleanup_notifications_cb, monitor); + + /* do a first check 60 seconds after login, and then every hour */ + monitor->check_startup_id = + g_timeout_add_seconds (60, check_updates_on_startup_cb, monitor); + + /* a randomized delay to avoid clients rushing within one hour */ + update_randomized_hour (monitor); + + /* we use three cancellables because we want to be able to cancel refresh + * operations more opportunistically than other operations, since + * they’re less important and cancelling them doesn’t result in much + * wasted work, and we want to be able to cancel some operations only on + * shutdown. */ + monitor->shutdown_cancellable = g_cancellable_new (); + monitor->update_cancellable = g_cancellable_new (); + monitor->refresh_cancellable = g_cancellable_new (); + + /* connect to UPower to get the system power state */ + monitor->proxy_upower = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.UPower", + "/org/freedesktop/UPower/devices/DisplayDevice", + "org.freedesktop.UPower.Device", + NULL, + &error); + if (monitor->proxy_upower != NULL) { + g_signal_connect (monitor->proxy_upower, "notify", + G_CALLBACK (check_updates_upower_changed_cb), + monitor); + } else { + g_warning ("failed to connect to upower: %s", error->message); + } + + network_monitor = g_network_monitor_get_default (); + if (network_monitor != NULL) { + monitor->network_monitor = g_object_ref (network_monitor); + monitor->network_changed_handler = g_signal_connect (monitor->network_monitor, + "network-changed", + G_CALLBACK (gs_update_monitor_network_changed_cb), + monitor); + } + +#if GLIB_CHECK_VERSION(2, 69, 1) + monitor->power_profile_monitor = g_power_profile_monitor_dup_default (); + if (monitor->power_profile_monitor != NULL) + monitor->power_profile_changed_handler = g_signal_connect (monitor->power_profile_monitor, + "notify::power-saver-enabled", + G_CALLBACK (gs_update_monitor_power_profile_changed_cb), + monitor); +#endif +} + +static void +gs_update_monitor_dispose (GObject *object) +{ + GsUpdateMonitor *monitor = GS_UPDATE_MONITOR (object); + + if (monitor->network_changed_handler != 0) { + g_signal_handler_disconnect (monitor->network_monitor, + monitor->network_changed_handler); + monitor->network_changed_handler = 0; + } + +#if GLIB_CHECK_VERSION(2, 69, 1) + g_clear_signal_handler (&monitor->power_profile_changed_handler, monitor->power_profile_monitor); + g_clear_object (&monitor->power_profile_monitor); +#endif + + g_cancellable_cancel (monitor->update_cancellable); + g_clear_object (&monitor->update_cancellable); + g_cancellable_cancel (monitor->refresh_cancellable); + g_clear_object (&monitor->refresh_cancellable); + g_cancellable_cancel (monitor->shutdown_cancellable); + g_clear_object (&monitor->shutdown_cancellable); + + stop_updates_check (monitor); + stop_upgrades_check (monitor); + + if (monitor->check_startup_id != 0) { + g_source_remove (monitor->check_startup_id); + monitor->check_startup_id = 0; + } + if (monitor->cleanup_notifications_id != 0) { + g_source_remove (monitor->cleanup_notifications_id); + monitor->cleanup_notifications_id = 0; + } + if (monitor->plugin_loader != NULL) { + g_signal_handlers_disconnect_by_func (monitor->plugin_loader, + network_available_notify_cb, + monitor); + g_clear_object (&monitor->plugin_loader); + } + g_clear_object (&monitor->settings); + g_clear_object (&monitor->proxy_upower); + + G_OBJECT_CLASS (gs_update_monitor_parent_class)->dispose (object); +} + +static void +gs_update_monitor_finalize (GObject *object) +{ + GsUpdateMonitor *monitor = GS_UPDATE_MONITOR (object); + + g_application_release (G_APPLICATION (monitor->application)); + g_clear_error (&monitor->last_offline_error); + + G_OBJECT_CLASS (gs_update_monitor_parent_class)->finalize (object); +} + +static void +gs_update_monitor_class_init (GsUpdateMonitorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->dispose = gs_update_monitor_dispose; + object_class->finalize = gs_update_monitor_finalize; +} + +GsUpdateMonitor * +gs_update_monitor_new (GsApplication *application, + GsPluginLoader *plugin_loader) +{ + GsUpdateMonitor *monitor; + + monitor = GS_UPDATE_MONITOR (g_object_new (GS_TYPE_UPDATE_MONITOR, NULL)); + monitor->application = application; + g_application_hold (G_APPLICATION (monitor->application)); + + monitor->plugin_loader = g_object_ref (plugin_loader); + g_signal_connect (monitor->plugin_loader, "notify::allow-updates", + G_CALLBACK (allow_updates_notify_cb), monitor); + g_signal_connect (monitor->plugin_loader, "notify::network-available", + G_CALLBACK (network_available_notify_cb), monitor); + + return monitor; +} diff --git a/src/gs-update-monitor.h b/src/gs-update-monitor.h new file mode 100644 index 0000000..ec7dd24 --- /dev/null +++ b/src/gs-update-monitor.h @@ -0,0 +1,29 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2016 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-application.h" +#include "gs-shell.h" + +G_BEGIN_DECLS + +#define GS_TYPE_UPDATE_MONITOR (gs_update_monitor_get_type ()) + +G_DECLARE_FINAL_TYPE (GsUpdateMonitor, gs_update_monitor, GS, UPDATE_MONITOR, GObject) + +GsUpdateMonitor *gs_update_monitor_new (GsApplication *app, + GsPluginLoader *plugin_loader); +void gs_update_monitor_autoupdate (GsUpdateMonitor *monitor); +void gs_update_monitor_show_error (GsUpdateMonitor *monitor, + GtkWindow *window); + +G_END_DECLS diff --git a/src/gs-updates-page.c b/src/gs-updates-page.c new file mode 100644 index 0000000..9f6bdbd --- /dev/null +++ b/src/gs-updates-page.c @@ -0,0 +1,1466 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-shell.h" +#include "gs-updates-page.h" +#include "gs-common.h" +#include "gs-app-row.h" +#include "gs-plugin-private.h" +#include "gs-removal-dialog.h" +#include "gs-update-monitor.h" +#include "gs-updates-section.h" +#include "gs-upgrade-banner.h" +#include "gs-application.h" + +/* The "updates-changed" is delays by 3 seconds; give it twice time to be delivered + and the page reload ignored when the signal comes within this time limit. It's + because the plugins can emit the signal when the they are refreshing metadata. */ +#define IGNORE_UPDATES_CHANGED_WITHIN_SECS 6 + +typedef enum { + GS_UPDATES_PAGE_FLAG_NONE = 0, + GS_UPDATES_PAGE_FLAG_HAS_UPDATES = 1 << 0, + GS_UPDATES_PAGE_FLAG_HAS_UPGRADES = 1 << 1, + GS_UPDATES_PAGE_FLAG_LAST +} GsUpdatesPageFlags; + +typedef enum { + GS_UPDATES_PAGE_STATE_STARTUP, + GS_UPDATES_PAGE_STATE_ACTION_REFRESH, + GS_UPDATES_PAGE_STATE_ACTION_GET_UPDATES, + GS_UPDATES_PAGE_STATE_MANAGED, + GS_UPDATES_PAGE_STATE_IDLE, + GS_UPDATES_PAGE_STATE_FAILED, + GS_UPDATES_PAGE_STATE_LAST, +} GsUpdatesPageState; + +struct _GsUpdatesPage +{ + GsPage parent_instance; + + GsPluginLoader *plugin_loader; + GCancellable *cancellable; + GCancellable *cancellable_refresh; + GCancellable *cancellable_upgrade; + GSettings *settings; + GSettings *desktop_settings; + gboolean cache_valid; + guint action_cnt; + GsShell *shell; + GsUpdatesPageState state; + GsUpdatesPageFlags result_flags; + GtkWidget *button_refresh; + GtkWidget *header_spinner_start; + GtkWidget *header_start_box; + gboolean has_agreed_to_mobile_data; + gboolean ampm_available; + guint updates_counter; + gboolean is_narrow; + + GtkWidget *updates_box; + GtkWidget *button_updates_mobile; + GtkWidget *button_updates_offline; + GtkWidget *updates_failed_page; + GtkLabel *uptodate_description; + GtkLabel *label_last_checked; + GtkWidget *scrolledwindow_updates; + GtkWidget *stack_updates; + GtkWidget *upgrade_banner; + GtkWidget *banner_end_of_life; + GtkWidget *label_end_of_life; + GtkWidget *up_to_date_image; + + GtkSizeGroup *sizegroup_name; + GtkSizeGroup *sizegroup_button_label; + GtkSizeGroup *sizegroup_button_image; + GtkSizeGroup *sizegroup_header; + GsUpdatesSection *sections[GS_UPDATES_SECTION_KIND_LAST]; + + guint refresh_last_checked_id; + gint64 last_loaded_time; +}; + +enum { + COLUMN_UPDATE_APP, + COLUMN_UPDATE_NAME, + COLUMN_UPDATE_VERSION, + COLUMN_UPDATE_LAST +}; + +G_DEFINE_TYPE (GsUpdatesPage, gs_updates_page, GS_TYPE_PAGE) + +typedef enum { + PROP_IS_NARROW = 1, + /* Overrides: */ + PROP_VADJUSTMENT, + PROP_TITLE, + PROP_COUNTER, +} GsUpdatesPageProperty; + +static GParamSpec *obj_props[PROP_IS_NARROW + 1] = { NULL, }; + +static void +gs_updates_page_set_flag (GsUpdatesPage *self, GsUpdatesPageFlags flag) +{ + self->result_flags |= flag; +} + +static void +gs_updates_page_clear_flag (GsUpdatesPage *self, GsUpdatesPageFlags flag) +{ + self->result_flags &= ~flag; +} + +static const gchar * +gs_updates_page_state_to_string (GsUpdatesPageState state) +{ + if (state == GS_UPDATES_PAGE_STATE_STARTUP) + return "startup"; + if (state == GS_UPDATES_PAGE_STATE_ACTION_REFRESH) + return "action-refresh"; + if (state == GS_UPDATES_PAGE_STATE_ACTION_GET_UPDATES) + return "action-get-updates"; + if (state == GS_UPDATES_PAGE_STATE_MANAGED) + return "managed"; + if (state == GS_UPDATES_PAGE_STATE_IDLE) + return "idle"; + if (state == GS_UPDATES_PAGE_STATE_FAILED) + return "failed"; + return NULL; +} + +static void +gs_updates_page_invalidate (GsUpdatesPage *self) +{ + self->cache_valid = FALSE; +} + +static GsUpdatesSectionKind +_get_app_section (GsApp *app) +{ + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_OPERATING_SYSTEM && + gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) + return GS_UPDATES_SECTION_KIND_OFFLINE; + + if (!gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT) && + (gs_app_get_state (app) == GS_APP_STATE_UPDATABLE_LIVE || + gs_app_get_state (app) == GS_APP_STATE_INSTALLING || + gs_app_get_state (app) == GS_APP_STATE_DOWNLOADING)) { + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_FIRMWARE) + return GS_UPDATES_SECTION_KIND_ONLINE_FIRMWARE; + return GS_UPDATES_SECTION_KIND_ONLINE; + } + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_FIRMWARE) + return GS_UPDATES_SECTION_KIND_OFFLINE_FIRMWARE; + return GS_UPDATES_SECTION_KIND_OFFLINE; +} + +static GsAppList * +_get_all_apps (GsUpdatesPage *self) +{ + GsAppList *apps = gs_app_list_new (); + for (guint i = 0; i < GS_UPDATES_SECTION_KIND_LAST; i++) { + GsAppList *list = gs_updates_section_get_list (self->sections[i]); + gs_app_list_add_list (apps, list); + } + return apps; +} + +static guint +_get_num_updates (GsUpdatesPage *self) +{ + guint count = 0; + g_autoptr(GsAppList) apps = _get_all_apps (self); + + for (guint i = 0; i < gs_app_list_length (apps); ++i) { + GsApp *app = gs_app_list_index (apps, i); + if (gs_app_is_updatable (app) || + gs_app_get_state (app) == GS_APP_STATE_INSTALLING || + gs_app_get_state (app) == GS_APP_STATE_DOWNLOADING) + ++count; + } + return count; +} + +static gchar * +gs_updates_page_last_checked_time_string (GsUpdatesPage *self, + gint *out_hours_ago, + gint *out_days_ago) +{ + gint64 last_checked; + gchar *res; + + g_settings_get (self->settings, "check-timestamp", "x", &last_checked); + res = gs_utils_time_to_timestring (last_checked); + if (res) { + g_assert (gs_utils_split_time_difference (last_checked, NULL, out_hours_ago, out_days_ago, NULL, NULL, NULL)); + } + + return res; +} + +static void +refresh_headerbar_updates_counter (GsUpdatesPage *self) +{ + guint new_updates_counter; + + new_updates_counter = _get_num_updates (self); + if (!gs_plugin_loader_get_allow_updates (self->plugin_loader) || + self->state == GS_UPDATES_PAGE_STATE_FAILED) + new_updates_counter = 0; + + if (new_updates_counter == self->updates_counter) + return; + + self->updates_counter = new_updates_counter; + g_object_notify (G_OBJECT (self), "counter"); +} + +static void +gs_updates_page_remove_last_checked_timeout (GsUpdatesPage *self) +{ + if (self->refresh_last_checked_id) { + g_source_remove (self->refresh_last_checked_id); + self->refresh_last_checked_id = 0; + } +} + +static void +gs_updates_page_refresh_last_checked (GsUpdatesPage *self); + +static gboolean +gs_updates_page_refresh_last_checked_cb (gpointer user_data) +{ + GsUpdatesPage *self = user_data; + gs_updates_page_refresh_last_checked (self); + return G_SOURCE_REMOVE; +} + +static void +gs_updates_page_refresh_last_checked (GsUpdatesPage *self) +{ + g_autofree gchar *checked_str = NULL; + gint hours_ago, days_ago; + checked_str = gs_updates_page_last_checked_time_string (self, &hours_ago, &days_ago); + if (checked_str != NULL) { + g_autofree gchar *last_checked = NULL; + guint interval; + + /* TRANSLATORS: This is the time when we last checked for updates */ + last_checked = g_strdup_printf (_("Last checked: %s"), checked_str); + + /* only shown in uptodate view */ + gtk_label_set_label (self->uptodate_description, last_checked); + gtk_widget_set_visible (GTK_WIDGET (self->uptodate_description), TRUE); + + /* shown when updates are available */ + gtk_label_set_label (self->label_last_checked, last_checked); + gtk_widget_set_visible (GTK_WIDGET (self->label_last_checked), TRUE); + + if (hours_ago < 1) + interval = 60; + else if (days_ago < 7) + interval = 60 * 60; + else + interval = 60 * 60 * 24; + + gs_updates_page_remove_last_checked_timeout (self); + + self->refresh_last_checked_id = g_timeout_add_seconds (interval, + gs_updates_page_refresh_last_checked_cb, self); + } else { + gtk_widget_set_visible (GTK_WIDGET (self->uptodate_description), FALSE); + gtk_widget_set_visible (GTK_WIDGET (self->label_last_checked), FALSE); + } +} + +static void +gs_updates_page_update_ui_state (GsUpdatesPage *self) +{ + const gchar *visible_child_name; + gboolean allow_mobile_refresh = TRUE; + + gs_updates_page_remove_last_checked_timeout (self); + + if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_UPDATES) + return; + + /* spinners */ + switch (self->state) { + case GS_UPDATES_PAGE_STATE_STARTUP: + case GS_UPDATES_PAGE_STATE_ACTION_GET_UPDATES: + default: + gtk_spinner_stop (GTK_SPINNER (self->header_spinner_start)); + gtk_widget_set_visible (self->header_spinner_start, FALSE); + break; + } + + /* headerbar refresh icon */ + switch (self->state) { + case GS_UPDATES_PAGE_STATE_ACTION_REFRESH: + case GS_UPDATES_PAGE_STATE_ACTION_GET_UPDATES: + gtk_button_set_icon_name (GTK_BUTTON (self->button_refresh), "media-playback-stop-symbolic"); + gtk_widget_set_tooltip_text(self->button_refresh, _("Stop")); + gtk_widget_set_visible (self->button_refresh, TRUE); + break; + case GS_UPDATES_PAGE_STATE_STARTUP: + case GS_UPDATES_PAGE_STATE_MANAGED: + gtk_widget_set_visible (self->button_refresh, FALSE); + break; + case GS_UPDATES_PAGE_STATE_IDLE: + gtk_button_set_icon_name (GTK_BUTTON (self->button_refresh), "view-refresh-symbolic"); + gtk_widget_set_tooltip_text(self->button_refresh, _("Check for Updates")); + if (self->result_flags != GS_UPDATES_PAGE_FLAG_NONE) { + gtk_widget_set_visible (self->button_refresh, TRUE); + } else { + if (gs_plugin_loader_get_network_metered (self->plugin_loader) && + !self->has_agreed_to_mobile_data) + allow_mobile_refresh = FALSE; + gtk_widget_set_visible (self->button_refresh, allow_mobile_refresh); + } + break; + case GS_UPDATES_PAGE_STATE_FAILED: + gtk_button_set_icon_name (GTK_BUTTON (self->button_refresh), "view-refresh-symbolic"); + gtk_widget_set_tooltip_text(self->button_refresh, _("Check for Updates")); + gtk_widget_set_visible (self->button_refresh, TRUE); + break; + default: + g_assert_not_reached (); + break; + } + gtk_widget_set_sensitive (self->button_refresh, + gs_plugin_loader_get_network_available (self->plugin_loader)); + + /* stack */ + switch (self->state) { + case GS_UPDATES_PAGE_STATE_MANAGED: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates), "managed"); + break; + case GS_UPDATES_PAGE_STATE_FAILED: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates), "failed"); + break; + case GS_UPDATES_PAGE_STATE_ACTION_GET_UPDATES: + case GS_UPDATES_PAGE_STATE_ACTION_REFRESH: + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates), "spinner"); + break; + case GS_UPDATES_PAGE_STATE_STARTUP: + case GS_UPDATES_PAGE_STATE_IDLE: + + /* if have updates, just show the view, otherwise show network */ + if (self->result_flags != GS_UPDATES_PAGE_FLAG_NONE) { + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates), "view"); + break; + } + + /* check we have a "free" network connection */ + if (gs_plugin_loader_get_network_available (self->plugin_loader) && + !gs_plugin_loader_get_network_metered (self->plugin_loader)) { + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates), "uptodate"); + break; + } + + /* expensive network connection */ + if (gs_plugin_loader_get_network_metered (self->plugin_loader)) { + if (self->has_agreed_to_mobile_data) { + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates), "uptodate"); + } else { + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates), "mobile"); + } + break; + } + + /* no network connection */ + gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates), "offline"); + break; + default: + g_assert_not_reached (); + break; + } + + /* any updates? */ + gtk_widget_set_visible (self->updates_box, + self->result_flags & GS_UPDATES_PAGE_FLAG_HAS_UPDATES); + + /* last checked label */ + visible_child_name = gtk_stack_get_visible_child_name (GTK_STACK (self->stack_updates)); + if (g_strcmp0 (visible_child_name, "uptodate") == 0 || + g_strcmp0 (visible_child_name, "view") == 0) + gs_updates_page_refresh_last_checked (self); + + /* update the counter in headerbar */ + refresh_headerbar_updates_counter (self); +} + +static void +gs_updates_page_set_state (GsUpdatesPage *self, GsUpdatesPageState state) +{ + g_debug ("setting state from %s to %s (has-update:%i, has-upgrade:%i)", + gs_updates_page_state_to_string (self->state), + gs_updates_page_state_to_string (state), + (self->result_flags & GS_UPDATES_PAGE_FLAG_HAS_UPDATES) > 0, + (self->result_flags & GS_UPDATES_PAGE_FLAG_HAS_UPGRADES) > 0); + self->state = state; + gs_updates_page_update_ui_state (self); +} + +static void +gs_updates_page_decrement_refresh_count (GsUpdatesPage *self) +{ + /* every job increments this */ + if (self->action_cnt == 0) { + g_warning ("action_cnt already zero!"); + return; + } + if (--self->action_cnt > 0) + return; + + /* all done */ + gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_IDLE); +} + +static void +gs_updates_page_network_available_notify_cb (GsPluginLoader *plugin_loader, + GParamSpec *pspec, + GsUpdatesPage *self) +{ + gs_updates_page_update_ui_state (self); +} + +static void +gs_updates_page_get_updates_cb (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GsUpdatesPage *self) +{ + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + self->cache_valid = TRUE; + + /* get the results */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + g_autofree gchar *escaped_text = NULL; + gs_updates_page_clear_flag (self, GS_UPDATES_PAGE_FLAG_HAS_UPDATES); + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("updates-shell: failed to get updates: %s", error->message); + escaped_text = g_markup_escape_text (error->message, -1); + adw_status_page_set_description (ADW_STATUS_PAGE (self->updates_failed_page), escaped_text); + gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_FAILED); + refresh_headerbar_updates_counter (self); + return; + } + + self->last_loaded_time = g_get_real_time (); + + /* add the results */ + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + GsUpdatesSectionKind section = _get_app_section (app); + gs_updates_section_add_app (self->sections[section], app); + } + + /* update the counter in headerbar */ + refresh_headerbar_updates_counter (self); + + /* no results */ + if (gs_app_list_length (list) == 0) { + g_debug ("updates-shell: no updates to show"); + gs_updates_page_clear_flag (self, GS_UPDATES_PAGE_FLAG_HAS_UPDATES); + } else { + gs_updates_page_set_flag (self, GS_UPDATES_PAGE_FLAG_HAS_UPDATES); + } + + /* only when both set */ + gs_updates_page_decrement_refresh_count (self); +} + +static void +gs_updates_page_get_upgrades_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + GsUpdatesPage *self = GS_UPDATES_PAGE (user_data); + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + + /* get the results */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + gs_updates_page_clear_flag (self, GS_UPDATES_PAGE_FLAG_HAS_UPGRADES); + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_warning ("updates-shell: failed to get upgrades: %s", + error->message); + } + } else if (gs_app_list_length (list) == 0) { + g_debug ("updates-shell: no upgrades to show"); + gs_updates_page_clear_flag (self, GS_UPDATES_PAGE_FLAG_HAS_UPGRADES); + gtk_widget_set_visible (self->upgrade_banner, FALSE); + } else { + /* rely on the app list already being sorted with the + * chronologically newest release last */ + GsApp *app = gs_app_list_index (list, gs_app_list_length (list) - 1); + g_debug ("got upgrade %s", gs_app_get_id (app)); + gs_upgrade_banner_set_app (GS_UPGRADE_BANNER (self->upgrade_banner), app); + gs_updates_page_set_flag (self, GS_UPDATES_PAGE_FLAG_HAS_UPGRADES); + gtk_widget_set_visible (self->upgrade_banner, TRUE); + } + + /* only when both set */ + gs_updates_page_decrement_refresh_count (self); +} + +typedef struct { + GsApp *app; /* (owned) */ + GsUpdatesPage *self; /* (owned) */ + GsPluginJob *job; /* (owned) */ +} GsPageHelper; + +static GsPageHelper * +gs_page_helper_new (GsUpdatesPage *self, + GsApp *app, + GsPluginJob *job) +{ + GsPageHelper *helper; + helper = g_slice_new0 (GsPageHelper); + helper->self = g_object_ref (self); + helper->app = g_object_ref (app); + helper->job = g_object_ref (job); + return helper; +} + +static void +gs_page_helper_free (GsPageHelper *helper) +{ + g_clear_object (&helper->app); + g_clear_object (&helper->job); + g_clear_object (&helper->self); + g_slice_free (GsPageHelper, helper); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsPageHelper, gs_page_helper_free); + +static void +gs_updates_page_refine_system_finished_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + g_autoptr(GsPageHelper) helper = user_data; + GsUpdatesPage *self = helper->self; + GsApp *app = helper->app; + g_autofree char *str = NULL; + g_autoptr(GError) error = NULL; + + /* get result */ + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Failed to refine system: %s", error->message); + return; + } + + /* show or hide the end of life notification */ + if (gs_app_get_state (app) != GS_APP_STATE_UNAVAILABLE) { + adw_banner_set_revealed (ADW_BANNER (self->banner_end_of_life), FALSE); + return; + } + + /* construct a sufficiently scary message */ + if (gs_app_get_name (app) != NULL) { + /* TRANSLATORS: the first %s is the distro name, e.g. 'Fedora' + * and the second %s is the distro version, e.g. '25' */ + str = g_strdup_printf (_("%s %s has stopped receiving critical software updates"), + gs_app_get_name (app), + gs_app_get_version (app)); + } else { + /* TRANSLATORS: This message is meant to tell users that they need to upgrade + * or else their distro will not get important updates. */ + str = _("Your operating system has stopped receiving critical software updates"); + } + + adw_banner_set_title (ADW_BANNER (self->banner_end_of_life), str); + adw_banner_set_revealed (ADW_BANNER (self->banner_end_of_life), TRUE); +} + +static void +gs_updates_page_get_system_finished_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + guint64 refine_flags; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object); + GsUpdatesPage *self = user_data; + GsPageHelper *helper; + g_autoptr(GsApp) app = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GError) error = NULL; + + app = gs_plugin_loader_get_system_app_finish (plugin_loader, res, &error); + if (app == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Failed to get system: %s", error->message); + return; + } + + g_return_if_fail (GS_IS_UPDATES_PAGE (self)); + + refine_flags = GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION; + + plugin_job = gs_plugin_job_refine_new_for_app (app, refine_flags); + gs_plugin_job_set_interactive (plugin_job, TRUE); + helper = gs_page_helper_new (self, app, plugin_job); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + gs_updates_page_refine_system_finished_cb, + helper); +} + +static void +gs_updates_page_load (GsUpdatesPage *self) +{ + guint64 refine_flags; + g_autoptr(GsAppQuery) query = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + if (self->action_cnt > 0) + return; + + /* remove all existing apps */ + for (guint i = 0; i < GS_UPDATES_SECTION_KIND_LAST; i++) + gs_updates_section_remove_all (self->sections[i]); + + refine_flags = GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY | + GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION; + gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_ACTION_GET_UPDATES); + self->action_cnt++; + query = gs_app_query_new ("is-for-update", GS_APP_QUERY_TRISTATE_TRUE, + "refine-flags", refine_flags, + NULL); + plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + (GAsyncReadyCallback) gs_updates_page_get_updates_cb, + self); + + /* get the system state */ + gs_plugin_loader_get_system_app_async (self->plugin_loader, self->cancellable, + gs_updates_page_get_system_finished_cb, self); + + /* don't refresh every each time */ + if ((self->result_flags & GS_UPDATES_PAGE_FLAG_HAS_UPGRADES) == 0) { + refine_flags |= GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPGRADE_REMOVED; + g_object_unref (plugin_job); + plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_INTERACTIVE, + refine_flags); + gs_plugin_loader_job_process_async (self->plugin_loader, + plugin_job, + self->cancellable, + gs_updates_page_get_upgrades_cb, + self); + self->action_cnt++; + } +} + +static void +gs_updates_page_reload (GsPage *page) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (page); + + if (self->state == GS_UPDATES_PAGE_STATE_ACTION_REFRESH) { + g_debug ("ignoring reload as refresh is already in progress"); + return; + } + + gs_updates_page_invalidate (self); + gs_updates_page_load (self); +} + +static void +gs_updates_page_switch_to (GsPage *page) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (page); + + if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_UPDATES) { + g_warning ("Called switch_to(updates) when in mode %s", + gs_shell_get_mode_string (self->shell)); + return; + } + + gtk_widget_set_visible (self->button_refresh, TRUE); + + /* no need to refresh */ + if (self->cache_valid) { + gs_updates_page_update_ui_state (self); + return; + } + + if (self->state == GS_UPDATES_PAGE_STATE_ACTION_GET_UPDATES) { + gs_updates_page_update_ui_state (self); + return; + } + gs_updates_page_load (self); +} + +static void +gs_updates_page_switch_from (GsPage *page) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (page); + gs_updates_page_remove_last_checked_timeout (self); +} + +static void +gs_updates_page_refresh_cb (GsPluginLoader *plugin_loader, + GAsyncResult *res, + GsUpdatesPage *self) +{ + gboolean ret; + g_autoptr(GDateTime) now = NULL; + g_autoptr(GError) error = NULL; + + /* get the results */ + ret = gs_plugin_loader_job_action_finish (plugin_loader, res, &error); + if (!ret) { + g_autofree gchar *escaped_text = NULL; + /* user cancel */ + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_IDLE); + return; + } + g_warning ("failed to refresh: %s", error->message); + escaped_text = g_markup_escape_text (error->message, -1); + adw_status_page_set_description (ADW_STATUS_PAGE (self->updates_failed_page), escaped_text); + gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_FAILED); + return; + } + + /* update the last checked timestamp */ + now = g_date_time_new_now_local (); + g_settings_set (self->settings, "check-timestamp", "x", + g_date_time_to_unix (now)); + + /* get the new list */ + gs_updates_page_invalidate (self); + gs_page_switch_to (GS_PAGE (self)); + gs_page_scroll_up (GS_PAGE (self)); +} + +static void +gs_updates_page_get_new_updates (GsUpdatesPage *self) +{ + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* force a check for updates and download */ + gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_ACTION_REFRESH); + + g_cancellable_cancel (self->cancellable_refresh); + g_clear_object (&self->cancellable_refresh); + self->cancellable_refresh = g_cancellable_new (); + + plugin_job = gs_plugin_job_refresh_metadata_new (1, + GS_PLUGIN_REFRESH_METADATA_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable_refresh, + (GAsyncReadyCallback) gs_updates_page_refresh_cb, + self); +} + +static void +gs_updates_page_show_network_settings (GsUpdatesPage *self) +{ + g_autoptr(GError) error = NULL; + if (!g_spawn_command_line_async ("gnome-control-center wifi", &error)) + g_warning ("Failed to open the control center: %s", error->message); +} + +static void +gs_updates_page_refresh_check_cb (AdwAlertDialog *dialog, + const gchar *response, + GsUpdatesPage *self) +{ + if (g_strcmp0 (response, "check") == 0) { + self->has_agreed_to_mobile_data = TRUE; + gs_updates_page_get_new_updates (self); + } +} + +static void +gs_updates_page_button_network_settings_cb (GtkWidget *widget, + GsUpdatesPage *self) +{ + gs_updates_page_show_network_settings (self); +} + +static void +gs_updates_page_button_mobile_refresh_cb (GtkWidget *widget, + GsUpdatesPage *self) +{ + self->has_agreed_to_mobile_data = TRUE; + gs_updates_page_get_new_updates (self); +} + +static void +gs_updates_page_button_refresh_cb (GtkWidget *widget, + GsUpdatesPage *self) +{ + AdwDialog *dialog; + + /* cancel existing action? */ + if (self->state == GS_UPDATES_PAGE_STATE_ACTION_REFRESH) { + g_cancellable_cancel (self->cancellable_refresh); + g_clear_object (&self->cancellable_refresh); + return; + } + + /* check we have a "free" network connection */ + if (gs_plugin_loader_get_network_available (self->plugin_loader) && + !gs_plugin_loader_get_network_metered (self->plugin_loader)) { + gs_updates_page_get_new_updates (self); + + /* expensive network connection */ + } else if (gs_plugin_loader_get_network_available (self->plugin_loader) && + gs_plugin_loader_get_network_metered (self->plugin_loader)) { + if (self->has_agreed_to_mobile_data) { + gs_updates_page_get_new_updates (self); + return; + } + /* TRANSLATORS: this is to explain that downloading updates may cost money */ + dialog = adw_alert_dialog_new (_("Charges May Apply"), + /* TRANSLATORS: we need network to do the updates check */ + _("Checking for updates while using mobile broadband could cause you to incur charges.")); + adw_alert_dialog_add_responses (ADW_ALERT_DIALOG (dialog), + "cancel", _("_Cancel"), + /* TRANSLATORS: this is a link to the control-center network panel */ + "check", _("Check _Anyway"), + NULL); + g_signal_connect (dialog, "response", + G_CALLBACK (gs_updates_page_refresh_check_cb), + self); + adw_dialog_present (dialog, GTK_WIDGET (self)); + } +} + +static void +gs_updates_page_pending_apps_changed_cb (GsPluginLoader *plugin_loader, + GsUpdatesPage *self) +{ + gs_updates_page_invalidate (self); +} + +static void +upgrade_download_finished_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source); + g_autoptr(GsPageHelper) helper = user_data; + g_autoptr(GError) error = NULL; + + g_clear_object (&helper->self->cancellable_upgrade); + + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + gs_plugin_loader_claim_job_error (plugin_loader, + NULL, + helper->job, + error); + } else if (!gs_page_is_active_and_focused (GS_PAGE (helper->self))) { + g_autoptr(GNotification) notif = NULL; + + notif = g_notification_new (_("Software Upgrades Downloaded")); + g_notification_set_body (notif, _("Upgrades are ready to be installed")); + g_notification_set_default_action_and_target (notif, "app.set-mode", "s", "updates"); + /* last the notification for an hour */ + gs_application_send_notification (GS_APPLICATION (g_application_get_default ()), "upgrades-downloaded", notif, 60); + } +} + +static void +gs_updates_page_upgrade_download_cb (GsUpgradeBanner *upgrade_banner, + GsUpdatesPage *self) +{ + GsApp *app; + GsPageHelper *helper; + g_autoptr(GsPluginJob) plugin_job = NULL; + + g_application_withdraw_notification (g_application_get_default (), "upgrades-downloaded"); + + app = gs_upgrade_banner_get_app (upgrade_banner); + if (app == NULL) { + g_warning ("no upgrade available to download"); + return; + } + + g_clear_object (&self->cancellable_upgrade); + self->cancellable_upgrade = g_cancellable_new (); + g_debug ("Starting upgrade download with cancellable %p", self->cancellable_upgrade); + plugin_job = gs_plugin_job_download_upgrade_new (app, GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_INTERACTIVE); + gs_plugin_job_set_propagate_error (plugin_job, TRUE); + helper = gs_page_helper_new (self, app, plugin_job); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable_upgrade, + upgrade_download_finished_cb, + helper); +} + +static void +_cancel_trigger_failed_cb (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (user_data); + g_autoptr(GError) error = NULL; + if (!gs_plugin_loader_job_action_finish (self->plugin_loader, res, &error)) { + g_warning ("failed to cancel trigger: %s", error->message); + return; + } +} + +static void +upgrade_reboot_failed_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsUpdatesPage *self = (GsUpdatesPage *) user_data; + GsApp *app; + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get result */ + if (gs_utils_invoke_reboot_finish (source, res, &error)) + return; + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_debug ("Calling reboot had been cancelled"); + else if (error != NULL) + g_warning ("Calling reboot failed: %s", error->message); + + app = gs_upgrade_banner_get_app (GS_UPGRADE_BANNER (self->upgrade_banner)); + if (app == NULL) { + g_warning ("no upgrade to cancel"); + return; + } + + /* cancel trigger */ + plugin_job = gs_plugin_job_cancel_offline_update_new (GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + _cancel_trigger_failed_cb, + self); +} + +static void +upgrade_trigger_finished_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GsUpdatesPage *self = (GsUpdatesPage *) user_data; + g_autoptr(GError) error = NULL; + + g_clear_object (&self->cancellable_upgrade); + + /* get the results */ + if (!gs_plugin_loader_job_action_finish (self->plugin_loader, res, &error)) { + g_warning ("Failed to trigger offline update: %s", error->message); + return; + } + + /* trigger reboot */ + gs_utils_invoke_reboot_async (NULL, upgrade_reboot_failed_cb, self); +} + +static void +trigger_upgrade (GsUpdatesPage *self) +{ + GsApp *upgrade; + g_autoptr(GsPluginJob) plugin_job = NULL; + + upgrade = gs_upgrade_banner_get_app (GS_UPGRADE_BANNER (self->upgrade_banner)); + if (upgrade == NULL) { + g_warning ("no upgrade available to install"); + return; + } + + g_clear_object (&self->cancellable_upgrade); + self->cancellable_upgrade = g_cancellable_new (); + + plugin_job = gs_plugin_job_trigger_upgrade_new (upgrade, GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable_upgrade, + upgrade_trigger_finished_cb, + self); +} + +static void +gs_updates_page_upgrade_confirm_cb (GtkDialog *dialog, + GtkResponseType response_type, + GsUpdatesPage *self) +{ + /* unmap the dialog */ + gtk_window_destroy (GTK_WINDOW (dialog)); + + switch (response_type) { + case GTK_RESPONSE_ACCEPT: + g_debug ("agreed to upgrade removing apps"); + trigger_upgrade (self); + break; + case GTK_RESPONSE_CANCEL: + g_debug ("cancelled removal dialog"); + break; + case GTK_RESPONSE_DELETE_EVENT: + break; + default: + g_assert_not_reached (); + } +} + +static void +gs_updates_page_upgrade_install_cb (GsUpgradeBanner *upgrade_banner, + GsUpdatesPage *self) +{ + GsAppList *removals; + GsApp *upgrade; + GtkWidget *dialog; + guint cnt = 0; + guint i; + + upgrade = gs_upgrade_banner_get_app (GS_UPGRADE_BANNER (self->upgrade_banner)); + if (upgrade == NULL) { + g_warning ("no upgrade available to install"); + return; + } + + /* count the removals */ + removals = gs_app_get_related (upgrade); + for (i = 0; i < gs_app_list_length (removals); i++) { + GsApp *app = gs_app_list_index (removals, i); + if (gs_app_get_state (app) != GS_APP_STATE_UNAVAILABLE) + continue; + cnt++; + } + + if (cnt == 0) { + /* no need for a removal confirmation dialog */ + trigger_upgrade (self); + return; + } + + dialog = gs_removal_dialog_new (); + g_signal_connect (dialog, "response", + G_CALLBACK (gs_updates_page_upgrade_confirm_cb), + self); + gs_removal_dialog_show_upgrade_removals (GS_REMOVAL_DIALOG (dialog), + upgrade); + adw_dialog_present (ADW_DIALOG (dialog), GTK_WIDGET (self)); +} + +static void +gs_updates_page_invalidate_downloaded_upgrade (GsUpdatesPage *self) +{ + GsApp *app; + app = gs_upgrade_banner_get_app (GS_UPGRADE_BANNER (self->upgrade_banner)); + if (app == NULL) + return; + if (gs_app_get_state (app) != GS_APP_STATE_UPDATABLE) + return; + gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + g_debug ("resetting %s to AVAILABLE as the updates have changed", + gs_app_get_id (app)); +} + +static gboolean +gs_shell_update_are_updates_in_progress (GsUpdatesPage *self) +{ + g_autoptr(GsAppList) list = _get_all_apps (self); + for (guint i = 0; i < gs_app_list_length (list); i++) { + GsApp *app = gs_app_list_index (list, i); + switch (gs_app_get_state (app)) { + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_REMOVING: + case GS_APP_STATE_DOWNLOADING: + return TRUE; + break; + default: + break; + } + } + return FALSE; +} + +static void +gs_updates_page_changed_cb (GsPluginLoader *plugin_loader, + GsUpdatesPage *self) +{ + gint64 diff_secs; + + /* if we do a live update and the upgrade is waiting to be deployed + * then make sure all new packages are downloaded */ + gs_updates_page_invalidate_downloaded_upgrade (self); + + /* check to see if any apps in the app list are in a processing state */ + if (gs_shell_update_are_updates_in_progress (self)) { + g_debug ("updates-page: ignoring updates-changed as updates in progress"); + return; + } + + diff_secs = (g_get_real_time () - self->last_loaded_time) / G_USEC_PER_SEC; + if (diff_secs <= IGNORE_UPDATES_CHANGED_WITHIN_SECS) { + g_debug ("updates-page: ignoring updates-changed as did load only %" G_GINT64_FORMAT " secs ago", diff_secs); + return; + } + + /* refresh updates list */ + gs_updates_page_reload (GS_PAGE (self)); +} + +static void +gs_updates_page_status_changed_cb (GsPluginLoader *plugin_loader, + GsApp *app, + GsPluginStatus status, + GsUpdatesPage *self) +{ + gs_updates_page_update_ui_state (self); +} + +static void +gs_updates_page_allow_updates_notify_cb (GsPluginLoader *plugin_loader, + GParamSpec *pspec, + GsUpdatesPage *self) +{ + if (!gs_plugin_loader_get_allow_updates (plugin_loader)) { + gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_MANAGED); + return; + } + gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_IDLE); +} + +static void +gs_updates_page_upgrade_cancel_cb (GsUpgradeBanner *upgrade_banner, + GsUpdatesPage *self) +{ + g_debug ("Cancelling upgrade with %p", self->cancellable_upgrade); + g_cancellable_cancel (self->cancellable_upgrade); +} + +static gboolean +gs_updates_page_setup (GsPage *page, + GsShell *shell, + GsPluginLoader *plugin_loader, + GCancellable *cancellable, + GError **error) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (page); + + g_return_val_if_fail (GS_IS_UPDATES_PAGE (self), TRUE); + + for (guint i = 0; i < GS_UPDATES_SECTION_KIND_LAST; i++) { + self->sections[i] = gs_updates_section_new (i, plugin_loader, page); + gs_updates_section_set_size_groups (self->sections[i], + self->sizegroup_name, + self->sizegroup_button_label, + self->sizegroup_button_image, + self->sizegroup_header); + gtk_widget_set_vexpand (GTK_WIDGET (self->sections[i]), FALSE); + g_object_bind_property (G_OBJECT (self), "is-narrow", + self->sections[i], "is-narrow", + G_BINDING_SYNC_CREATE); + gtk_box_append (GTK_BOX (self->updates_box), GTK_WIDGET (self->sections[i])); + } + + self->shell = shell; + + self->plugin_loader = g_object_ref (plugin_loader); + g_signal_connect (self->plugin_loader, "pending-apps-changed", + G_CALLBACK (gs_updates_page_pending_apps_changed_cb), + self); + g_signal_connect (self->plugin_loader, "status-changed", + G_CALLBACK (gs_updates_page_status_changed_cb), + self); + g_signal_connect (self->plugin_loader, "updates-changed", + G_CALLBACK (gs_updates_page_changed_cb), + self); + g_signal_connect_object (self->plugin_loader, "notify::allow-updates", + G_CALLBACK (gs_updates_page_allow_updates_notify_cb), + self, 0); + g_signal_connect_object (self->plugin_loader, "notify::network-available", + G_CALLBACK (gs_updates_page_network_available_notify_cb), + self, 0); + self->cancellable = g_object_ref (cancellable); + + /* setup system upgrades */ + g_signal_connect (self->upgrade_banner, "download-clicked", + G_CALLBACK (gs_updates_page_upgrade_download_cb), self); + g_signal_connect (self->upgrade_banner, "install-clicked", + G_CALLBACK (gs_updates_page_upgrade_install_cb), self); + g_signal_connect (self->upgrade_banner, "cancel-clicked", + G_CALLBACK (gs_updates_page_upgrade_cancel_cb), self); + + self->header_start_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_widget_set_visible (self->header_start_box, TRUE); + gs_page_set_header_start_widget (GS_PAGE (self), self->header_start_box); + + self->header_spinner_start = gtk_spinner_new (); + gtk_box_prepend (GTK_BOX (self->header_start_box), self->header_spinner_start); + + /* setup update details window */ + self->button_refresh = gtk_button_new_from_icon_name ("view-refresh-symbolic"); + gtk_accessible_update_property (GTK_ACCESSIBLE (self->button_refresh), + GTK_ACCESSIBLE_PROPERTY_LABEL, _("Check for updates"), + -1); + gtk_box_prepend (GTK_BOX (self->header_start_box), self->button_refresh); + g_signal_connect (self->button_refresh, "clicked", + G_CALLBACK (gs_updates_page_button_refresh_cb), + self); + + g_signal_connect (self->button_updates_mobile, "clicked", + G_CALLBACK (gs_updates_page_button_mobile_refresh_cb), + self); + g_signal_connect (self->button_updates_offline, "clicked", + G_CALLBACK (gs_updates_page_button_network_settings_cb), + self); + + /* set initial state */ + if (!gs_plugin_loader_get_allow_updates (self->plugin_loader)) + self->state = GS_UPDATES_PAGE_STATE_MANAGED; + return TRUE; +} + +static void +gs_updates_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (object); + + switch ((GsUpdatesPageProperty) prop_id) { + case PROP_IS_NARROW: + g_value_set_boolean (value, gs_updates_page_get_is_narrow (self)); + break; + case PROP_VADJUSTMENT: + g_value_set_object (value, gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_updates))); + break; + case PROP_TITLE: + g_value_set_string (value, C_("Apps to be updated", "Updates")); + break; + case PROP_COUNTER: + g_value_set_uint (value, self->updates_counter); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_updates_page_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (object); + + switch ((GsUpdatesPageProperty) prop_id) { + case PROP_IS_NARROW: + gs_updates_page_set_is_narrow (self, g_value_get_boolean (value)); + break; + case PROP_VADJUSTMENT: + case PROP_TITLE: + case PROP_COUNTER: + /* Read only */ + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_updates_page_dispose (GObject *object) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (object); + + gs_updates_page_remove_last_checked_timeout (self); + + g_cancellable_cancel (self->cancellable_refresh); + g_clear_object (&self->cancellable_refresh); + g_cancellable_cancel (self->cancellable_upgrade); + g_clear_object (&self->cancellable_upgrade); + + for (guint i = 0; i < GS_UPDATES_SECTION_KIND_LAST; i++) { + if (self->sections[i] != NULL) { + gtk_widget_unparent (GTK_WIDGET (self->sections[i])); + self->sections[i] = NULL; + } + } + + g_clear_object (&self->plugin_loader); + g_clear_object (&self->cancellable); + g_clear_object (&self->settings); + g_clear_object (&self->desktop_settings); + + g_clear_object (&self->sizegroup_name); + g_clear_object (&self->sizegroup_button_label); + g_clear_object (&self->sizegroup_button_image); + g_clear_object (&self->sizegroup_header); + + G_OBJECT_CLASS (gs_updates_page_parent_class)->dispose (object); +} + +static void +gs_updates_page_unmap (GtkWidget *widget) +{ + GsUpdatesPage *self = GS_UPDATES_PAGE (widget); + + /* Don’t need to update the ‘last checked’ label while the UI isn’t + * visible. The timer will be reinstated by update_ui_state() when the + * UI is next shown. */ + gs_updates_page_remove_last_checked_timeout (self); + + GTK_WIDGET_CLASS (gs_updates_page_parent_class)->unmap (widget); +} + +static void +gs_updates_page_class_init (GsUpdatesPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GsPageClass *page_class = GS_PAGE_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_updates_page_get_property; + object_class->set_property = gs_updates_page_set_property; + object_class->dispose = gs_updates_page_dispose; + + widget_class->unmap = gs_updates_page_unmap; + + page_class->switch_to = gs_updates_page_switch_to; + page_class->switch_from = gs_updates_page_switch_from; + page_class->reload = gs_updates_page_reload; + page_class->setup = gs_updates_page_setup; + + /** + * GsUpdatesPage:is-narrow: + * + * Whether the page is in narrow mode. + * + * In narrow mode, the page will take up less horizontal space, doing so + * by e.g. using icons rather than labels in buttons. This is needed to + * keep the UI useable on small form-factors like smartphones. + * + * Since: 41 + */ + obj_props[PROP_IS_NARROW] = + g_param_spec_boolean ("is-narrow", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment"); + g_object_class_override_property (object_class, PROP_TITLE, "title"); + g_object_class_override_property (object_class, PROP_COUNTER, "counter"); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-updates-page.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, updates_box); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, button_updates_mobile); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, button_updates_offline); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, updates_failed_page); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, uptodate_description); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, label_last_checked); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, scrolledwindow_updates); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, stack_updates); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, upgrade_banner); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, banner_end_of_life); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, up_to_date_image); +} + +static void +gs_updates_page_init (GsUpdatesPage *self) +{ + g_type_ensure (GS_TYPE_UPGRADE_BANNER); + + gtk_widget_init_template (GTK_WIDGET (self)); + + self->state = GS_UPDATES_PAGE_STATE_STARTUP; + self->settings = g_settings_new ("org.gnome.software"); + self->desktop_settings = g_settings_new ("org.gnome.desktop.interface"); + + self->sizegroup_name = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_button_label = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_button_image = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + self->sizegroup_header = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL); + +} + +/** + * gs_updates_page_get_is_narrow: + * @self: a #GsUpdatesPage + * + * Get the value of #GsUpdatesPage:is-narrow. + * + * Returns: %TRUE if the page is in narrow mode, %FALSE otherwise + * + * Since: 41 + */ +gboolean +gs_updates_page_get_is_narrow (GsUpdatesPage *self) +{ + g_return_val_if_fail (GS_IS_UPDATES_PAGE (self), FALSE); + + return self->is_narrow; +} + +/** + * gs_updates_page_set_is_narrow: + * @self: a #GsUpdatesPage + * @is_narrow: %TRUE to set the page in narrow mode, %FALSE otherwise + * + * Set the value of #GsUpdatesPage:is-narrow. + * + * Since: 41 + */ +void +gs_updates_page_set_is_narrow (GsUpdatesPage *self, gboolean is_narrow) +{ + g_return_if_fail (GS_IS_UPDATES_PAGE (self)); + + is_narrow = !!is_narrow; + + if (self->is_narrow == is_narrow) + return; + + self->is_narrow = is_narrow; + if (self->is_narrow) + gtk_image_set_pixel_size (GTK_IMAGE (self->up_to_date_image), 280); + else + gtk_image_set_pixel_size (GTK_IMAGE (self->up_to_date_image), 300); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_IS_NARROW]); +} + +GsUpdatesPage * +gs_updates_page_new (void) +{ + return GS_UPDATES_PAGE (g_object_new (GS_TYPE_UPDATES_PAGE, NULL)); +} diff --git a/src/gs-updates-page.h b/src/gs-updates-page.h new file mode 100644 index 0000000..83a6bc7 --- /dev/null +++ b/src/gs-updates-page.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_UPDATES_PAGE (gs_updates_page_get_type ()) + +G_DECLARE_FINAL_TYPE (GsUpdatesPage, gs_updates_page, GS, UPDATES_PAGE, GsPage) + +GsUpdatesPage *gs_updates_page_new (void); + +gboolean gs_updates_page_get_is_narrow (GsUpdatesPage *self); +void gs_updates_page_set_is_narrow (GsUpdatesPage *self, + gboolean is_narrow); + +G_END_DECLS diff --git a/src/gs-updates-page.ui b/src/gs-updates-page.ui new file mode 100644 index 0000000..0390461 --- /dev/null +++ b/src/gs-updates-page.ui @@ -0,0 +1,252 @@ + + + + + + diff --git a/src/gs-updates-paused-banner.c b/src/gs-updates-paused-banner.c new file mode 100644 index 0000000..03c2e88 --- /dev/null +++ b/src/gs-updates-paused-banner.c @@ -0,0 +1,196 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright © 2024 Joshua Lee + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include + +#include "gs-enums.h" +#include "gs-updates-paused-banner.h" + +struct _GsUpdatesPausedBanner +{ + AdwBin parent_instance; + + GtkWidget *banner; + + GsUpdatesPausedBannerFlags updates_paused_flags; +}; + +G_DEFINE_TYPE (GsUpdatesPausedBanner, gs_updates_paused_banner, ADW_TYPE_BIN) + +typedef enum { + PROP_UPDATES_PAUSED_FLAGS = 1, +} GsUpdatesPausedBannerProperty; + +static GParamSpec *obj_props[PROP_UPDATES_PAUSED_FLAGS + 1] = { NULL, }; + +static void +details_button_clicked_cb (GsUpdatesPausedBanner *self) +{ + GtkRoot *root; + AdwDialog *dialog; + g_autoptr(GString) body = NULL; + GtkWidget *label; + + g_assert (GS_IS_UPDATES_PAUSED_BANNER (self)); + + root = gtk_widget_get_root (GTK_WIDGET (self)); + dialog = adw_alert_dialog_new (_("Software Updates Paused"), + NULL); + + body = g_string_new (_("Automatic software updates have been paused for the following reasons:\n")); + if (self->updates_paused_flags & GS_UPDATES_PAUSED_BANNER_FLAGS_METERED) + body = g_string_append (body, _("\n• The current network connection is metered")); + if (self->updates_paused_flags & GS_UPDATES_PAUSED_BANNER_FLAGS_NO_LARGE_DOWNLOADS) + body = g_string_append (body, _("\n• The current network connection prohibits large downloads")); + if (self->updates_paused_flags & GS_UPDATES_PAUSED_BANNER_FLAGS_POWER_SAVER) + body = g_string_append (body, _("\n• Power saver mode is active")); + if (self->updates_paused_flags & GS_UPDATES_PAUSED_BANNER_FLAGS_GAME_MODE) + body = g_string_append (body, _("\n• Game mode is active")); + + label = gtk_label_new (body->str); + gtk_label_set_wrap (GTK_LABEL (label), TRUE); + gtk_label_set_wrap_mode (GTK_LABEL (label), PANGO_WRAP_WORD_CHAR); + gtk_label_set_max_width_chars (GTK_LABEL (label), 40); + + adw_alert_dialog_set_extra_child (ADW_ALERT_DIALOG (dialog), label); + adw_alert_dialog_add_response (ADW_ALERT_DIALOG (dialog), + "close", _("_Close")); + + adw_dialog_present (dialog, GTK_WIDGET (root)); +} + +static void +update_banner_title (GsUpdatesPausedBanner *self) +{ + char *title; + + g_assert (GS_IS_UPDATES_PAUSED_BANNER (self)); + + if ((self->updates_paused_flags & (self->updates_paused_flags - 1)) != 0) { + adw_banner_set_button_label (ADW_BANNER (self->banner), _("Details")); + + title = _("Software updates paused"); + } else { + adw_banner_set_button_label (ADW_BANNER (self->banner), NULL); + + if (self->updates_paused_flags & GS_UPDATES_PAUSED_BANNER_FLAGS_METERED) + title = _("Network connection is metered — software updates paused"); + else if (self->updates_paused_flags & GS_UPDATES_PAUSED_BANNER_FLAGS_NO_LARGE_DOWNLOADS) + title = _("Network connection prohibits large downloads — software updates paused"); + else if (self->updates_paused_flags & GS_UPDATES_PAUSED_BANNER_FLAGS_POWER_SAVER) + title = _("Power saver mode is active — software updates paused"); + else if (self->updates_paused_flags & GS_UPDATES_PAUSED_BANNER_FLAGS_GAME_MODE) + title = _("Game mode is active — software updates paused"); + else + g_assert_not_reached (); + } + + adw_banner_set_title (ADW_BANNER (self->banner), title); +} + +static void +gs_updates_paused_banner_dispose (GObject *object) +{ + GsUpdatesPausedBanner *self = GS_UPDATES_PAUSED_BANNER (object); + + g_clear_object (&self->banner); + + G_OBJECT_CLASS (gs_updates_paused_banner_parent_class)->dispose (object); +} + +static void +gs_updates_paused_banner_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsUpdatesPausedBanner *self = GS_UPDATES_PAUSED_BANNER (object); + + switch ((GsUpdatesPausedBannerProperty) prop_id) { + case PROP_UPDATES_PAUSED_FLAGS: + g_value_set_flags (value, self->updates_paused_flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_updates_paused_banner_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsUpdatesPausedBanner *self = GS_UPDATES_PAUSED_BANNER (object); + + switch ((GsUpdatesPausedBannerProperty) prop_id) { + case PROP_UPDATES_PAUSED_FLAGS: + gs_updates_paused_banner_set_flags (self, g_value_get_flags (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_updates_paused_banner_init (GsUpdatesPausedBanner *self) +{ + self->banner = g_object_ref_sink (adw_banner_new ("")); + adw_bin_set_child (ADW_BIN (self), self->banner); + + g_signal_connect_swapped (self->banner, "button-clicked", + G_CALLBACK (details_button_clicked_cb), + self); +} + +static void +gs_updates_paused_banner_class_init (GsUpdatesPausedBannerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gs_updates_paused_banner_get_property; + object_class->set_property = gs_updates_paused_banner_set_property; + object_class->dispose = gs_updates_paused_banner_dispose; + + /** + * GsUpdatesPausedBanner:updates-paused-flags: + * + * The flags specifying the reason(s) automatic updates are paused. + * + * Since: 46 + */ + obj_props[PROP_UPDATES_PAUSED_FLAGS] = + g_param_spec_flags ("updates-paused-flags", NULL, NULL, + GS_TYPE_UPDATES_PAUSED_BANNER_FLAGS, GS_UPDATES_PAUSED_BANNER_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); +} + +void +gs_updates_paused_banner_set_flags (GsUpdatesPausedBanner *self, + GsUpdatesPausedBannerFlags flags) +{ + g_return_if_fail (GS_IS_UPDATES_PAUSED_BANNER (self)); + + if (self->updates_paused_flags == flags) + return; + + self->updates_paused_flags = flags; + + if (self->updates_paused_flags != GS_UPDATES_PAUSED_BANNER_FLAGS_NONE) { + update_banner_title (self); + adw_banner_set_revealed (ADW_BANNER (self->banner), TRUE); + } else { + adw_banner_set_revealed (ADW_BANNER (self->banner), FALSE); + } +} diff --git a/src/gs-updates-paused-banner.h b/src/gs-updates-paused-banner.h new file mode 100644 index 0000000..8f4147c --- /dev/null +++ b/src/gs-updates-paused-banner.h @@ -0,0 +1,46 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright © 2024 Joshua Lee + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +/** + * GsUpdatesPausedBannerFlags: + * @GS_UPDATES_PAUSED_BANNER_FLAGS_NONE No flags set + * @GS_UPDATES_PAUSED_BANNER_FLAGS_METERED Connection is metered + * @GS_UPDATES_PAUSED_BANNER_FLAGS_NO_LARGE_DOWNLOADS Connection prohibits large downloads + * @GS_UPDATES_PAUSED_BANNER_FLAGS_POWER_SAVER System is using Power Saver mode + * @GS_UPDATES_PAUSED_BANNER_FLAGS_GAME_MODE System is using GameMode + * + * The flags specifying the reason(s) automatic updates are paused. + * + * Since: 46 + **/ + +typedef enum { + GS_UPDATES_PAUSED_BANNER_FLAGS_NONE = 0, + GS_UPDATES_PAUSED_BANNER_FLAGS_METERED = 1 << 0, + GS_UPDATES_PAUSED_BANNER_FLAGS_NO_LARGE_DOWNLOADS = 1 << 1, + GS_UPDATES_PAUSED_BANNER_FLAGS_POWER_SAVER = 1 << 2, + GS_UPDATES_PAUSED_BANNER_FLAGS_GAME_MODE = 1 << 3, +} GsUpdatesPausedBannerFlags; + +#define GS_TYPE_UPDATES_PAUSED_BANNER (gs_updates_paused_banner_get_type ()) + +G_DECLARE_FINAL_TYPE (GsUpdatesPausedBanner, gs_updates_paused_banner, GS, UPDATES_PAUSED_BANNER, AdwBin) + +GtkWidget *gs_updates_paused_banner_new (void); + +void gs_updates_paused_banner_set_flags (GsUpdatesPausedBanner *self, + GsUpdatesPausedBannerFlags flags); + +G_END_DECLS diff --git a/src/gs-updates-section.c b/src/gs-updates-section.c new file mode 100644 index 0000000..cf1d7c5 --- /dev/null +++ b/src/gs-updates-section.c @@ -0,0 +1,778 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013-2017 Richard Hughes + * Copyright (C) 2014-2018 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-app-list-private.h" +#include "gs-app-row.h" +#include "gs-application.h" +#include "gs-page.h" +#include "gs-common.h" +#include "gs-progress-button.h" +#include "gs-update-dialog.h" +#include "gs-updates-section.h" +#include "gs-utils.h" + +struct _GsUpdatesSection +{ + GtkBox parent_instance; + + GtkWidget *button_cancel; + GtkWidget *button_download; + GtkWidget *button_stack; + GtkWidget *button_update; + GtkWidget *description; + GtkWidget *listbox; + GtkWidget *listbox_box; + GtkWidget *section_header; + GtkWidget *title; + + GsAppList *list; + GsUpdatesSectionKind kind; + GCancellable *cancellable; + GsPage *page; /* (transfer none) */ + GsPluginLoader *plugin_loader; + GtkSizeGroup *sizegroup_name; + GtkSizeGroup *sizegroup_button_label; + GtkSizeGroup *sizegroup_button_image; + GtkSizeGroup *sizegroup_header; + gboolean is_narrow; +}; + +G_DEFINE_TYPE (GsUpdatesSection, gs_updates_section, GTK_TYPE_BOX) + +typedef enum { + PROP_IS_NARROW = 1, +} GsUpdatesSectionProperty; + +static GParamSpec *obj_props[PROP_IS_NARROW + 1] = { NULL, }; + +GsAppList * +gs_updates_section_get_list (GsUpdatesSection *self) +{ + return self->list; +} + +static gboolean +_listbox_keynav_failed_cb (GsUpdatesSection *self, GtkDirectionType direction, GtkListBox *listbox) +{ + GtkRoot *root = gtk_widget_get_root (GTK_WIDGET (listbox)); + + if (!root) + return FALSE; + + if (direction != GTK_DIR_UP && direction != GTK_DIR_DOWN) + return FALSE; + + return gtk_widget_child_focus (GTK_WIDGET (root), direction == GTK_DIR_UP ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD); +} + +static void +gs_updates_section_run_download (GsUpdatesSection *self, + GsApp *only_app); + +static void +_app_row_button_clicked_cb (GsAppRow *app_row, GsUpdatesSection *self) +{ + GsApp *app = gs_app_row_get_app (app_row); + if (gs_app_get_state (app) != GS_APP_STATE_UPDATABLE_LIVE) + return; + if (gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT) && + !gs_app_is_downloaded (app)) { + gs_updates_section_run_download (self, app); + return; + } + gs_page_update_app (GS_PAGE (self->page), app, gs_app_get_cancellable (app)); +} + +static void +_row_unrevealed_cb (GObject *row, GParamSpec *pspec, gpointer data) +{ + GtkWidget *widget; + GsUpdatesSection *self; + + widget = gtk_widget_get_parent (GTK_WIDGET (row)); + if (widget == NULL) + return; + + widget = gtk_widget_get_ancestor (GTK_WIDGET (row), GS_TYPE_UPDATES_SECTION); + g_return_if_fail (GS_IS_UPDATES_SECTION (widget)); + self = GS_UPDATES_SECTION (widget); + + gs_app_list_remove (self->list, gs_app_row_get_app (GS_APP_ROW (row))); + + gtk_list_box_remove (GTK_LIST_BOX (self->listbox), GTK_WIDGET (row)); + + if (!gs_app_list_length (self->list)) + gtk_widget_set_visible (widget, FALSE); +} + +static void +_unreveal_row (GsAppRow *app_row) +{ + g_signal_connect (app_row, "unrevealed", + G_CALLBACK (_row_unrevealed_cb), NULL); + gs_app_row_unreveal (app_row); +} + +static void +_app_state_notify_cb (GsApp *app, GParamSpec *pspec, gpointer user_data) +{ + if (gs_app_get_state (app) == GS_APP_STATE_INSTALLED) { + GsAppRow *app_row = GS_APP_ROW (user_data); + _unreveal_row (app_row); + } +} + +void +gs_updates_section_add_app (GsUpdatesSection *self, GsApp *app) +{ + GtkWidget *app_row; + app_row = gs_app_row_new (app); + gs_app_row_set_show_description (GS_APP_ROW (app_row), FALSE); + gs_app_row_set_show_update (GS_APP_ROW (app_row), TRUE); + gs_app_row_set_show_buttons (GS_APP_ROW (app_row), TRUE); + g_signal_connect (app_row, "button-clicked", + G_CALLBACK (_app_row_button_clicked_cb), + self); + gtk_list_box_append (GTK_LIST_BOX (self->listbox), app_row); + gs_app_list_add (self->list, app); + + gs_app_row_set_size_groups (GS_APP_ROW (app_row), + self->sizegroup_name, + self->sizegroup_button_label, + self->sizegroup_button_image); + g_signal_connect_object (app, "notify::state", + G_CALLBACK (_app_state_notify_cb), + app_row, 0); + g_object_bind_property (G_OBJECT (self), "is-narrow", + app_row, "is-narrow", + G_BINDING_SYNC_CREATE); + gtk_widget_set_visible (GTK_WIDGET (self), TRUE); +} + +void +gs_updates_section_remove_all (GsUpdatesSection *self) +{ + GtkWidget *child; + while ((child = gtk_widget_get_first_child (self->listbox)) != NULL) + gtk_list_box_remove (GTK_LIST_BOX (self->listbox), child); + gs_app_list_remove_all (self->list); + gtk_widget_set_visible (GTK_WIDGET (self), FALSE); + g_clear_object (&self->cancellable); +} + +typedef struct { + GsUpdatesSection *self; + gboolean do_reboot; + gboolean do_reboot_notification; + GsPluginJob *job; /* (owned) */ +} GsUpdatesSectionUpdateHelper; + +static gint +_list_sort_func (GtkListBoxRow *a, GtkListBoxRow *b, gpointer user_data) +{ + GsApp *a1 = gs_app_row_get_app (GS_APP_ROW (a)); + GsApp *a2 = gs_app_row_get_app (GS_APP_ROW (b)); + + return gs_utils_app_sort_kind (a1, a2); +} + +static void +_update_helper_free (GsUpdatesSectionUpdateHelper *helper) +{ + g_clear_object (&helper->job); + g_object_unref (helper->self); + g_free (helper); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsUpdatesSectionUpdateHelper, _update_helper_free); + +static void +_cancel_trigger_failed_cb (GObject *source, GAsyncResult *res, gpointer user_data) +{ + g_autoptr(GsUpdatesSection) self = GS_UPDATES_SECTION (g_steal_pointer (&user_data)); + g_autoptr(GError) error = NULL; + + if (!gs_plugin_loader_job_action_finish (self->plugin_loader, res, &error)) { + g_warning ("failed to cancel trigger: %s", error->message); + return; + } +} + +static void +_reboot_failed_cb (GObject *source, GAsyncResult *res, gpointer user_data) +{ + g_autoptr(GsUpdatesSection) self = GS_UPDATES_SECTION (g_steal_pointer (&user_data)); + g_autoptr(GError) error = NULL; + g_autoptr(GsPluginJob) plugin_job = NULL; + + /* get result */ + if (gs_utils_invoke_reboot_finish (source, res, &error)) + return; + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_debug ("Calling reboot had been cancelled"); + else if (error != NULL) + g_warning ("Calling reboot failed: %s", error->message); + + /* Cancel trigger. The app list might have changed while this async + * function was in flight. If so, ignore it. */ + if (self->list != NULL && gs_app_list_length (self->list) > 0) { + plugin_job = gs_plugin_job_cancel_offline_update_new (GS_PLUGIN_CANCEL_OFFLINE_UPDATE_FLAGS_INTERACTIVE); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + NULL, + _cancel_trigger_failed_cb, + g_object_ref (self)); + } else { + g_debug ("App list changed while waiting for reboot; not cancelling reboot trigger."); + } +} + +static gboolean +_all_offline_updates_downloaded (GsUpdatesSection *self) +{ + /* use the download size to figure out what is downloaded and what not */ + for (guint i = 0; i < gs_app_list_length (self->list); i++) { + GsApp *app = gs_app_list_index (self->list, i); + if (!gs_app_is_downloaded (app)) + return FALSE; + } + + return TRUE; +} + +static guint +gs_updates_section_count_busy_apps (GsUpdatesSection *self) +{ + guint ii, busy = 0; + + for (ii = 0; ii < gs_app_list_length (self->list); ii++) { + GsApp *app = gs_app_list_index (self->list, ii); + GsAppState state = gs_app_get_state (app); + + if (state == GS_APP_STATE_INSTALLING || + state == GS_APP_STATE_REMOVING || + state == GS_APP_STATE_DOWNLOADING) { + busy++; + } + } + + return busy; +} + +/* Hide progress buttons in the stack pages, to avoid gdk_frame_clock_paint_idle() + * being called even when the button is not visible. + * + * FIXME: This is a workaround for https://gitlab.gnome.org/GNOME/gtk/-/issues/1025 */ +static void +_set_button_stack_visible_child (GsUpdatesSection *self, + const gchar *child_name) +{ + if (self->button_cancel != NULL) + gtk_widget_set_visible (self->button_cancel, g_strcmp0 (child_name, "cancel") == 0); + if (self->button_download != NULL) + gtk_widget_set_visible (self->button_download, g_strcmp0 (child_name, "download") == 0); + if (self->button_update != NULL) + gtk_widget_set_visible (self->button_update, g_strcmp0 (child_name, "update") == 0); + + gtk_stack_set_visible_child_name (GTK_STACK (self->button_stack), child_name); +} + +static void +_update_buttons (GsUpdatesSection *self) +{ + guint busy, len; + + /* operation in progress */ + if (self->cancellable != NULL) { + gtk_widget_set_sensitive (self->button_cancel, + !g_cancellable_is_cancelled (self->cancellable)); + _set_button_stack_visible_child (self, "cancel"); + gtk_widget_set_visible (GTK_WIDGET (self->button_stack), TRUE); + return; + } + + len = gs_app_list_length (self->list); + busy = gs_updates_section_count_busy_apps (self); + + gtk_widget_set_sensitive (self->button_update, busy == 0 || busy < len); + + if (self->kind == GS_UPDATES_SECTION_KIND_OFFLINE_FIRMWARE || + self->kind == GS_UPDATES_SECTION_KIND_OFFLINE) { + if (_all_offline_updates_downloaded (self)) + _set_button_stack_visible_child (self, "update"); + else + _set_button_stack_visible_child (self, "download"); + + gtk_widget_set_visible (GTK_WIDGET (self->button_stack), TRUE); + /* TRANSLATORS: This is the button for installing all + * offline updates */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (self->button_update), _("_Restart & Update…")); + } else if (self->kind == GS_UPDATES_SECTION_KIND_ONLINE) { + _set_button_stack_visible_child (self, "update"); + gtk_widget_set_visible (GTK_WIDGET (self->button_stack), TRUE); + /* TRANSLATORS: This is the button for upgrading all + * online-updatable apps */ + gs_progress_button_set_label (GS_PROGRESS_BUTTON (self->button_update), _("U_pdate All")); + } else { + gtk_widget_set_visible (GTK_WIDGET (self->button_stack), FALSE); + } + +} + +static void +_perform_update_cb (GsPluginLoader *plugin_loader, GAsyncResult *res, gpointer user_data) +{ + g_autoptr(GError) error = NULL; + g_autoptr(GsUpdatesSectionUpdateHelper) helper = (GsUpdatesSectionUpdateHelper *) user_data; + GsUpdatesSection *self = helper->self; + + /* get the results */ + if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + gs_plugin_loader_claim_job_error (plugin_loader, + NULL, + helper->job, + error); + } + goto out; + } + + /* trigger reboot if any app was not updatable live */ + if (helper->do_reboot) { + gs_utils_invoke_reboot_async (NULL, _reboot_failed_cb, g_object_ref (self)); + + /* when we are not doing an offline update, show a notification + * if any app requires a reboot */ + } else if (helper->do_reboot_notification) { + gs_utils_reboot_notify (self->list, TRUE); + } + +out: + g_clear_object (&self->cancellable); + _update_buttons (self); +} + +static void +_button_cancel_clicked_cb (GsUpdatesSection *self) +{ + g_cancellable_cancel (self->cancellable); + /* cancel also individual app's cancellables */ + for (guint i = 0; i < gs_app_list_length (self->list); i++) { + GsApp *app = gs_app_list_index (self->list, i); + g_autoptr(GCancellable) cancellable = gs_app_peek_cancellable (app); + if (cancellable != NULL) + g_cancellable_cancel (cancellable); + } + _update_buttons (self); +} + +static void +_download_finished_cb (GObject *object, GAsyncResult *res, gpointer user_data) +{ + g_autoptr(GsUpdatesSectionUpdateHelper) helper = user_data; + g_autoptr(GError) error = NULL; + g_autoptr(GsAppList) list = NULL; + GsUpdatesSection *self = helper->self; + GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (object); + + /* get result */ + list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error); + if (list == NULL) { + if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + gs_plugin_loader_claim_job_error (plugin_loader, + NULL, + helper->job, + error); + } + } else if (!gs_page_is_active_and_focused (self->page)) { + g_autoptr(GNotification) notif = NULL; + + notif = g_notification_new (_("Software Updates Downloaded")); + g_notification_set_body (notif, _("Updates are ready to be installed")); + g_notification_set_default_action_and_target (notif, "app.set-mode", "s", "updates"); + /* last the notification for an hour */ + gs_application_send_notification (GS_APPLICATION (g_application_get_default ()), "updates-downloaded", notif, 60); + } + + g_clear_object (&self->cancellable); + _update_buttons (self); +} + +static void +gs_updates_section_run_download (GsUpdatesSection *self, + GsApp *only_app) /* (optional) */ +{ + g_autoptr(GCancellable) cancellable = g_cancellable_new (); + g_autoptr(GsPluginJob) plugin_job = NULL; + g_autoptr(GsAppList) list = NULL; + GsUpdatesSectionUpdateHelper *helper; + + g_application_withdraw_notification (g_application_get_default (), "updates-downloaded"); + + if (only_app != NULL) { + list = gs_app_list_new (); + gs_app_list_add (list, only_app); + } else { + list = g_object_ref (self->list); + } + + g_set_object (&self->cancellable, cancellable); + plugin_job = gs_plugin_job_update_apps_new (list, + GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY | GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + gs_plugin_job_set_propagate_error (plugin_job, TRUE); + helper = g_new0 (GsUpdatesSectionUpdateHelper, 1); + helper->self = g_object_ref (self); + helper->job = g_object_ref (plugin_job); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + _download_finished_cb, + helper); + _update_buttons (self); +} + +static void +_button_download_clicked_cb (GsUpdatesSection *self) +{ + gs_updates_section_run_download (self, NULL); +} + +static void +_button_update_all_clicked_cb (GsUpdatesSection *self) +{ + g_autoptr(GCancellable) cancellable = g_cancellable_new (); + g_autoptr(GsPluginJob) plugin_job = NULL; + GsUpdatesSectionUpdateHelper *helper = g_new0 (GsUpdatesSectionUpdateHelper, 1); + + helper->self = g_object_ref (self); + + if (self->kind == GS_UPDATES_SECTION_KIND_OFFLINE_FIRMWARE || + self->kind == GS_UPDATES_SECTION_KIND_OFFLINE) { + helper->do_reboot = TRUE; + } + + /* look at each app in turn */ + for (guint i = 0; (!helper->do_reboot || !helper->do_reboot_notification) && i < gs_app_list_length (self->list); i++) { + GsApp *app = gs_app_list_index (self->list, i); + if (!helper->do_reboot && gs_app_get_state (app) == GS_APP_STATE_UPDATABLE) + helper->do_reboot = TRUE; + if (!helper->do_reboot_notification && gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) + helper->do_reboot_notification = TRUE; + } + + g_set_object (&self->cancellable, cancellable); + plugin_job = gs_plugin_job_update_apps_new (self->list, + GS_PLUGIN_UPDATE_APPS_FLAGS_INTERACTIVE); + gs_plugin_job_set_propagate_error (plugin_job, TRUE); + helper->job = g_object_ref (plugin_job); + gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job, + self->cancellable, + (GAsyncReadyCallback) _perform_update_cb, + helper); + _update_buttons (self); +} + +static void +_setup_section_header (GsUpdatesSection *self) +{ + /* get labels and buttons for everything */ + switch (self->kind) { + case GS_UPDATES_SECTION_KIND_OFFLINE_FIRMWARE: + /* TRANSLATORS: This is the header for system firmware that + * requires a reboot to apply */ + gtk_label_set_label (GTK_LABEL (self->title), _("Integrated Firmware")); + break; + case GS_UPDATES_SECTION_KIND_OFFLINE: + /* TRANSLATORS: This is the header for offline OS and offline + * app updates that require a reboot to apply */ + gtk_label_set_label (GTK_LABEL (self->title), _("Requires Restart")); + break; + case GS_UPDATES_SECTION_KIND_ONLINE: + /* TRANSLATORS: This is the header for online runtime and + * app updates, typically flatpaks or snaps */ + gtk_label_set_label (GTK_LABEL (self->title), _("App Updates")); + break; + case GS_UPDATES_SECTION_KIND_ONLINE_FIRMWARE: + /* TRANSLATORS: This is the header for device firmware that can + * be installed online */ + gtk_label_set_label (GTK_LABEL (self->title), _("Device Firmware")); + break; + default: + g_assert_not_reached (); + } +} + +static void +_app_row_activated_cb (GsUpdatesSection *self, GtkListBoxRow *row) +{ + GsApp *app = gs_app_row_get_app (GS_APP_ROW (row)); + GtkWidget *dialog; + g_autofree gchar *str = NULL; + + /* debug */ + str = gs_app_to_string (app); + g_debug ("%s", str); + + dialog = gs_update_dialog_new_for_app (self->plugin_loader, app); + adw_dialog_present (ADW_DIALOG (dialog), GTK_WIDGET (gs_page_get_shell (self->page))); +} + +static void +gs_updates_section_show (GtkWidget *widget) +{ + _update_buttons (GS_UPDATES_SECTION (widget)); + + GTK_WIDGET_CLASS (gs_updates_section_parent_class)->show (widget); +} + +static void +gs_updates_section_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GsUpdatesSection *self = GS_UPDATES_SECTION (object); + + switch ((GsUpdatesSectionProperty) prop_id) { + case PROP_IS_NARROW: + g_value_set_boolean (value, gs_updates_section_get_is_narrow (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_updates_section_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GsUpdatesSection *self = GS_UPDATES_SECTION (object); + + switch ((GsUpdatesSectionProperty) prop_id) { + case PROP_IS_NARROW: + gs_updates_section_set_is_narrow (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gs_updates_section_dispose (GObject *object) +{ + GsUpdatesSection *self = GS_UPDATES_SECTION (object); + + g_clear_object (&self->cancellable); + g_clear_object (&self->list); + g_clear_object (&self->plugin_loader); + g_clear_object (&self->sizegroup_name); + g_clear_object (&self->sizegroup_button_label); + g_clear_object (&self->sizegroup_button_image); + g_clear_object (&self->sizegroup_header); + self->button_download = NULL; + self->button_update = NULL; + self->button_cancel = NULL; + self->button_stack = NULL; + self->page = NULL; + + G_OBJECT_CLASS (gs_updates_section_parent_class)->dispose (object); +} + +static void +gs_updates_section_class_init (GsUpdatesSectionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->get_property = gs_updates_section_get_property; + object_class->set_property = gs_updates_section_set_property; + object_class->dispose = gs_updates_section_dispose; + widget_class->show = gs_updates_section_show; + + /** + * GsUpdatesSection:is-narrow: + * + * Whether the section is in narrow mode. + * + * In narrow mode, the section will take up less horizontal space, doing + * so by e.g. using icons rather than labels in buttons. This is needed + * to keep the UI useable on small form-factors like smartphones. + * + * Since: 41 + */ + obj_props[PROP_IS_NARROW] = + g_param_spec_boolean ("is-narrow", NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, G_N_ELEMENTS (obj_props), obj_props); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-updates-section.ui"); + + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, button_cancel); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, button_download); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, button_stack); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, button_update); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, description); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, listbox); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, listbox_box); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, section_header); + gtk_widget_class_bind_template_child (widget_class, GsUpdatesSection, title); + gtk_widget_class_bind_template_callback (widget_class, _app_row_activated_cb); + gtk_widget_class_bind_template_callback (widget_class, _button_cancel_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, _button_download_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, _button_update_all_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, _listbox_keynav_failed_cb); +} + +void +gs_updates_section_set_size_groups (GsUpdatesSection *self, + GtkSizeGroup *name, + GtkSizeGroup *button_label, + GtkSizeGroup *button_image, + GtkSizeGroup *header) +{ + g_return_if_fail (GS_IS_UPDATES_SECTION (self)); + + g_set_object (&self->sizegroup_name, name); + g_set_object (&self->sizegroup_button_label, button_label); + g_set_object (&self->sizegroup_button_image, button_image); + g_set_object (&self->sizegroup_header, header); + + gs_progress_button_set_size_groups (GS_PROGRESS_BUTTON (self->button_cancel), button_label, button_image); + gs_progress_button_set_size_groups (GS_PROGRESS_BUTTON (self->button_download), button_label, button_image); + gs_progress_button_set_size_groups (GS_PROGRESS_BUTTON (self->button_update), button_label, button_image); + gtk_size_group_add_widget (self->sizegroup_header, self->section_header); +} + +static void +gs_updates_section_progress_notify_cb (GsAppList *list, + GParamSpec *pspec, + GsUpdatesSection *self) +{ + if (self->button_cancel == NULL) + return; + + gs_progress_button_set_progress (GS_PROGRESS_BUTTON (self->button_cancel), + gs_app_list_get_progress (list)); +} + +static void +gs_updates_section_app_state_changed_cb (GsAppList *list, + GsApp *in_app, + GsUpdatesSection *self) +{ + guint busy, len; + + len = gs_app_list_length (self->list); + busy = gs_updates_section_count_busy_apps (self); + + if (busy == len && busy > 0 && self->cancellable == NULL) { + /* this will show the "Cancel" button, instead of "Update All" */ + self->cancellable = g_cancellable_new (); + } else if (busy == 0 && self->cancellable != NULL) { + g_clear_object (&self->cancellable); + } + + _update_buttons (self); +} + +static void +gs_updates_section_init (GsUpdatesSection *self) +{ + g_type_ensure (GS_TYPE_PROGRESS_BUTTON); + + gtk_widget_init_template (GTK_WIDGET (self)); + + self->list = gs_app_list_new (); + gs_app_list_add_flag (self->list, + GS_APP_LIST_FLAG_WATCH_APPS | + GS_APP_LIST_FLAG_WATCH_APPS_ADDONS | + GS_APP_LIST_FLAG_WATCH_APPS_RELATED); + g_signal_connect_object (self->list, "notify::progress", + G_CALLBACK (gs_updates_section_progress_notify_cb), + self, 0); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->listbox), + GTK_SELECTION_NONE); + gtk_list_box_set_sort_func (GTK_LIST_BOX (self->listbox), + _list_sort_func, + self, NULL); +} + +/** + * gs_updates_section_get_is_narrow: + * @self: a #GsUpdatesSection + * + * Get the value of #GsUpdatesSection:is-narrow. + * + * Returns: %TRUE if the section is in narrow mode, %FALSE otherwise + * + * Since: 41 + */ +gboolean +gs_updates_section_get_is_narrow (GsUpdatesSection *self) +{ + g_return_val_if_fail (GS_IS_UPDATES_SECTION (self), FALSE); + + return self->is_narrow; +} + +/** + * gs_updates_section_set_is_narrow: + * @self: a #GsUpdatesSection + * @is_narrow: %TRUE to set the section in narrow mode, %FALSE otherwise + * + * Set the value of #GsUpdatesSection:is-narrow. + * + * Since: 41 + */ +void +gs_updates_section_set_is_narrow (GsUpdatesSection *self, gboolean is_narrow) +{ + g_return_if_fail (GS_IS_UPDATES_SECTION (self)); + + is_narrow = !!is_narrow; + + if (self->is_narrow == is_narrow) + return; + + self->is_narrow = is_narrow; + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_IS_NARROW]); +} + +GsUpdatesSection * +gs_updates_section_new (GsUpdatesSectionKind kind, + GsPluginLoader *plugin_loader, + GsPage *page) +{ + GsUpdatesSection *self; + self = g_object_new (GS_TYPE_UPDATES_SECTION, NULL); + self->kind = kind; + self->plugin_loader = g_object_ref (plugin_loader); + self->page = page; + _setup_section_header (self); + + if (self->kind == GS_UPDATES_SECTION_KIND_ONLINE) { + g_signal_connect_object (self->list, "app-state-changed", + G_CALLBACK (gs_updates_section_app_state_changed_cb), + self, 0); + } + + return self; +} diff --git a/src/gs-updates-section.h b/src/gs-updates-section.h new file mode 100644 index 0000000..9338061 --- /dev/null +++ b/src/gs-updates-section.h @@ -0,0 +1,48 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2013 Richard Hughes + * Copyright (C) 2015-2017 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gs-app-list.h" +#include "gs-plugin-loader.h" +#include "gs-page.h" + +G_BEGIN_DECLS + +#define GS_TYPE_UPDATES_SECTION (gs_updates_section_get_type ()) + +G_DECLARE_FINAL_TYPE (GsUpdatesSection, gs_updates_section, GS, UPDATES_SECTION, GtkBox) + +typedef enum { + GS_UPDATES_SECTION_KIND_OFFLINE_FIRMWARE, + GS_UPDATES_SECTION_KIND_OFFLINE, + GS_UPDATES_SECTION_KIND_ONLINE, + GS_UPDATES_SECTION_KIND_ONLINE_FIRMWARE, + GS_UPDATES_SECTION_KIND_LAST +} GsUpdatesSectionKind; + +GsUpdatesSection *gs_updates_section_new (GsUpdatesSectionKind kind, + GsPluginLoader *plugin_loader, + GsPage *page); +GsAppList *gs_updates_section_get_list (GsUpdatesSection *self); +void gs_updates_section_add_app (GsUpdatesSection *self, + GsApp *app); +void gs_updates_section_remove_all (GsUpdatesSection *self); +void gs_updates_section_set_size_groups (GsUpdatesSection *self, + GtkSizeGroup *name, + GtkSizeGroup *button_label, + GtkSizeGroup *button_image, + GtkSizeGroup *header); +gboolean gs_updates_section_get_is_narrow (GsUpdatesSection *self); +void gs_updates_section_set_is_narrow (GsUpdatesSection *self, + gboolean is_narrow); + +G_END_DECLS diff --git a/src/gs-updates-section.ui b/src/gs-updates-section.ui new file mode 100644 index 0000000..f79cdd9 --- /dev/null +++ b/src/gs-updates-section.ui @@ -0,0 +1,110 @@ + + + + + diff --git a/src/gs-upgrade-banner.c b/src/gs-upgrade-banner.c new file mode 100644 index 0000000..c77f221 --- /dev/null +++ b/src/gs-upgrade-banner.c @@ -0,0 +1,420 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Kalev Lember + * Copyright (C) 2016 Richard Hughes + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include +#include + +#include "gs-upgrade-banner.h" +#include "gs-common.h" + +typedef struct +{ + GsApp *app; + + GtkWidget *box_upgrades_info; + GtkWidget *box_upgrades_download; + GtkWidget *box_upgrades_downloading; + GtkWidget *box_upgrades_install; + GtkWidget *button_upgrades_download; + GtkWidget *button_upgrades_install; + GtkWidget *button_upgrades_cancel; + GtkWidget *button_upgrades_install_cancel; + GtkWidget *label_upgrades_summary; + GtkWidget *label_upgrades_title; + GtkWidget *label_download_info; + GtkWidget *label_upgrades_downloading; + GtkWidget *progressbar; + guint progress_pulse_id; + GtkCssProvider *banner_provider; /* (owned) (nullable) */ +} GsUpgradeBannerPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GsUpgradeBanner, gs_upgrade_banner, ADW_TYPE_BIN) + +enum { + SIGNAL_DOWNLOAD_CLICKED, + SIGNAL_INSTALL_CLICKED, + SIGNAL_CANCEL_CLICKED, + SIGNAL_LAST +}; + +static guint signals [SIGNAL_LAST] = { 0 }; + +static gboolean +_pulse_cb (gpointer user_data) +{ + GsUpgradeBanner *self = GS_UPGRADE_BANNER (user_data); + GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self); + + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progressbar)); + + return G_SOURCE_CONTINUE; +} + +static void +stop_progress_pulsing (GsUpgradeBanner *self) +{ + GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self); + + if (priv->progress_pulse_id != 0) { + g_source_remove (priv->progress_pulse_id); + priv->progress_pulse_id = 0; + } +} + +static void +gs_upgrade_banner_refresh (GsUpgradeBanner *self) +{ + GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self); + const gchar *uri, *summary, *version; + g_autofree gchar *str = NULL; + guint percentage; + GsSizeType size_download_type; + guint64 size_download_bytes; + + if (priv->app == NULL) + return; + + version = gs_app_get_version (priv->app); + + if (version != NULL && *version != '\0') { + /* TRANSLATORS: This is the text displayed when a distro + * upgrade is available. The first %s is the distro name + * and the 2nd %s is the version, e.g. "Fedora 35 Available" */ + str = g_strdup_printf (_("%s %s Available"), gs_app_get_name (priv->app), version); + } else { + /* TRANSLATORS: This is the text displayed when a distro + * upgrade is available. The %s is the distro name, + * e.g. "GNOME OS Available" */ + str = g_strdup_printf (_("%s Available"), gs_app_get_name (priv->app)); + } + gtk_label_set_text (GTK_LABEL (priv->label_upgrades_title), str); + + /* Normally a distro upgrade state goes from + * + * AVAILABLE (available to download) to + * INSTALLING (downloading packages for later installation) to + * UPDATABLE (packages are downloaded and upgrade is ready to go) + * PENDING_INSTALL (upgrade is preparing, will ask to reboot when finished) + */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_AVAILABLE: + case GS_APP_STATE_QUEUED_FOR_INSTALL: + gtk_widget_set_visible (priv->box_upgrades_download, TRUE); + gtk_widget_set_visible (priv->box_upgrades_downloading, FALSE); + gtk_widget_set_visible (priv->box_upgrades_install, FALSE); + break; + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_DOWNLOADING: + gtk_widget_set_visible (priv->box_upgrades_download, FALSE); + gtk_widget_set_visible (priv->box_upgrades_downloading, TRUE); + gtk_widget_set_visible (priv->box_upgrades_install, FALSE); + break; + case GS_APP_STATE_UPDATABLE: + gtk_widget_set_visible (priv->box_upgrades_download, FALSE); + gtk_widget_set_visible (priv->box_upgrades_downloading, FALSE); + gtk_widget_set_visible (priv->box_upgrades_install, TRUE); + gtk_widget_set_visible (priv->button_upgrades_install, TRUE); + gtk_widget_set_visible (priv->button_upgrades_install_cancel, FALSE); + break; + case GS_APP_STATE_PENDING_INSTALL: + gtk_widget_set_visible (priv->box_upgrades_download, FALSE); + gtk_widget_set_visible (priv->box_upgrades_downloading, FALSE); + gtk_widget_set_visible (priv->box_upgrades_install, TRUE); + gtk_widget_set_visible (priv->button_upgrades_install, FALSE); + gtk_widget_set_visible (priv->button_upgrades_install_cancel, TRUE); + break; + default: + g_critical ("Unexpected app state ‘%s’ of app ‘%s’", + gs_app_state_to_string (gs_app_get_state (priv->app)), + gs_app_get_unique_id (priv->app)); + break; + } + + /* Hide the upgrade box until the app state is known. */ + gtk_widget_set_visible (GTK_WIDGET (self), + (gs_app_get_state (priv->app) != GS_APP_STATE_UNKNOWN)); + + /* Refresh the summary if we got anything better than the default blurb */ + summary = gs_app_get_summary (priv->app); + if (summary != NULL) + gtk_label_set_text (GTK_LABEL (priv->label_upgrades_summary), summary); + + uri = gs_app_get_url (priv->app, AS_URL_KIND_HOMEPAGE); + size_download_type = gs_app_get_size_download (priv->app, &size_download_bytes); + + if (uri != NULL) { + g_autofree gchar *link = NULL; + link = g_markup_printf_escaped ("%s", uri, _("Learn about the new version")); + gtk_label_set_markup (GTK_LABEL (priv->label_download_info), link); + gtk_widget_set_visible (priv->label_download_info, TRUE); + } else if (size_download_type == GS_SIZE_TYPE_VALID && + size_download_bytes > 0) { + g_autofree gchar *tmp = NULL; + g_clear_pointer (&str, g_free); + tmp = g_format_size (size_download_bytes); + /* Translators: the '%s' is replaced with the download size, forming text like "2 GB download" */ + str = g_strdup_printf ("%s download", tmp); + gtk_label_set_text (GTK_LABEL (priv->label_download_info), str); + gtk_widget_set_visible (priv->label_download_info, TRUE); + } else { + gtk_widget_set_visible (priv->label_download_info, FALSE); + } + + /* do a fill bar for the current progress */ + switch (gs_app_get_state (priv->app)) { + case GS_APP_STATE_INSTALLING: + case GS_APP_STATE_DOWNLOADING: + percentage = gs_app_get_progress (priv->app); + if (percentage == GS_APP_PROGRESS_UNKNOWN) { + if (priv->progress_pulse_id == 0) + priv->progress_pulse_id = g_timeout_add (50, _pulse_cb, self); + + gtk_label_set_text (GTK_LABEL (priv->label_upgrades_downloading), _("Downloading…")); + break; + } else if (percentage <= 100) { + stop_progress_pulsing (self); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progressbar), + (gdouble) percentage / 100.f); + g_clear_pointer (&str, g_free); + + if (size_download_type == GS_SIZE_TYPE_VALID) { + g_autofree gchar *tmp = NULL; + g_autofree gchar *downloaded_tmp = NULL; + guint64 downloaded; + + downloaded = size_download_bytes * percentage / 100.0; + downloaded_tmp = g_format_size (downloaded); + tmp = g_format_size (size_download_bytes); + /* Translators: the first '%s' is replaced with the downloaded size, the second '%s' + with the total download size, forming text like "135 MB of 2 GB downloaded" */ + str = g_strdup_printf (_("%s of %s downloaded"), downloaded_tmp, tmp); + } else { + /* Translators: the '%u' is replaced with the actual percentage being already + downloaded, forming text like "13% downloaded" */ + str = g_strdup_printf (_("%u%% downloaded"), percentage); + } + gtk_label_set_text (GTK_LABEL (priv->label_upgrades_downloading), str); + break; + } + break; + default: + stop_progress_pulsing (self); + break; + } +} + +static gboolean +app_refresh_idle (gpointer user_data) +{ + GsUpgradeBanner *self = GS_UPGRADE_BANNER (user_data); + + gs_upgrade_banner_refresh (self); + + g_object_unref (self); + return G_SOURCE_REMOVE; +} + +static void +schedule_app_refresh (GsUpgradeBanner *self) +{ + g_idle_add (app_refresh_idle, g_object_ref (self)); +} + +static void +app_state_changed (GsApp *app, GParamSpec *pspec, GsUpgradeBanner *self) +{ + schedule_app_refresh (self); +} + +static void +app_progress_changed (GsApp *app, GParamSpec *pspec, GsUpgradeBanner *self) +{ + schedule_app_refresh (self); +} + +static void +download_button_cb (GtkWidget *widget, GsUpgradeBanner *self) +{ + g_signal_emit (self, signals[SIGNAL_DOWNLOAD_CLICKED], 0); +} + +static void +install_button_cb (GtkWidget *widget, GsUpgradeBanner *self) +{ + g_signal_emit (self, signals[SIGNAL_INSTALL_CLICKED], 0); +} + +static void +cancel_button_cb (GtkWidget *widget, GsUpgradeBanner *self) +{ + g_signal_emit (self, signals[SIGNAL_CANCEL_CLICKED], 0); +} + +void +gs_upgrade_banner_set_app (GsUpgradeBanner *self, GsApp *app) +{ + GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self); + const gchar *css; + g_autofree gchar *modified_css = NULL; + + g_return_if_fail (GS_IS_UPGRADE_BANNER (self)); + g_return_if_fail (GS_IS_APP (app) || app == NULL); + + if (priv->app) { + g_signal_handlers_disconnect_by_func (priv->app, app_state_changed, self); + g_signal_handlers_disconnect_by_func (priv->app, app_progress_changed, self); + } + + g_set_object (&priv->app, app); + if (!app) + return; + + g_signal_connect (priv->app, "notify::state", + G_CALLBACK (app_state_changed), self); + g_signal_connect (priv->app, "notify::progress", + G_CALLBACK (app_progress_changed), self); + + /* perhaps set custom css */ + css = gs_app_get_metadata_item (app, "GnomeSoftware::UpgradeBanner-css"); + modified_css = gs_utils_set_key_colors_in_css (css, app); + gs_utils_widget_set_css (priv->box_upgrades_info, &priv->banner_provider, modified_css); + + gs_upgrade_banner_refresh (self); +} + +GsApp * +gs_upgrade_banner_get_app (GsUpgradeBanner *self) +{ + GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self); + + g_return_val_if_fail (GS_IS_UPGRADE_BANNER (self), NULL); + + return priv->app; +} + +static void +gs_upgrade_banner_dispose (GObject *object) +{ + GsUpgradeBanner *self = GS_UPGRADE_BANNER (object); + GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self); + + stop_progress_pulsing (self); + + if (priv->app) { + g_signal_handlers_disconnect_by_func (priv->app, app_state_changed, self); + g_signal_handlers_disconnect_by_func (priv->app, app_progress_changed, self); + } + + g_clear_object (&priv->app); + g_clear_object (&priv->banner_provider); + + G_OBJECT_CLASS (gs_upgrade_banner_parent_class)->dispose (object); +} + +static void +gs_upgrade_banner_map (GtkWidget *widget) +{ + GsUpgradeBanner *self = GS_UPGRADE_BANNER (widget); + + GTK_WIDGET_CLASS (gs_upgrade_banner_parent_class)->map (widget); + + schedule_app_refresh (self); +} + +static void +gs_upgrade_banner_unmap (GtkWidget *widget) +{ + GsUpgradeBanner *self = GS_UPGRADE_BANNER (widget); + + stop_progress_pulsing (self); + + GTK_WIDGET_CLASS (gs_upgrade_banner_parent_class)->unmap (widget); +} + +static void +gs_upgrade_banner_init (GsUpgradeBanner *self) +{ + GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self); + + gtk_widget_init_template (GTK_WIDGET (self)); + + g_signal_connect (priv->button_upgrades_download, "clicked", + G_CALLBACK (download_button_cb), + self); + g_signal_connect (priv->button_upgrades_install, "clicked", + G_CALLBACK (install_button_cb), + self); + g_signal_connect (priv->button_upgrades_cancel, "clicked", + G_CALLBACK (cancel_button_cb), + self); + g_signal_connect (priv->button_upgrades_install_cancel, "clicked", + G_CALLBACK (cancel_button_cb), + self); +} + +static void +gs_upgrade_banner_class_init (GsUpgradeBannerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gs_upgrade_banner_dispose; + + widget_class->map = gs_upgrade_banner_map; + widget_class->unmap = gs_upgrade_banner_unmap; + + signals [SIGNAL_DOWNLOAD_CLICKED] = + g_signal_new ("download-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsUpgradeBannerClass, download_clicked), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals [SIGNAL_INSTALL_CLICKED] = + g_signal_new ("install-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsUpgradeBannerClass, install_clicked), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals [SIGNAL_CANCEL_CLICKED] = + g_signal_new ("cancel-clicked", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsUpgradeBannerClass, cancel_clicked), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-upgrade-banner.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, box_upgrades_info); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, box_upgrades_download); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, box_upgrades_downloading); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, box_upgrades_install); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, button_upgrades_download); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, button_upgrades_install); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, button_upgrades_cancel); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, button_upgrades_install_cancel); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, label_upgrades_summary); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, label_upgrades_title); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, label_download_info); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, label_upgrades_downloading); + gtk_widget_class_bind_template_child_private (widget_class, GsUpgradeBanner, progressbar); +} + +GtkWidget * +gs_upgrade_banner_new (void) +{ + GsUpgradeBanner *self; + self = g_object_new (GS_TYPE_UPGRADE_BANNER, + "vexpand", FALSE, + NULL); + return GTK_WIDGET (self); +} diff --git a/src/gs-upgrade-banner.h b/src/gs-upgrade-banner.h new file mode 100644 index 0000000..518ebbd --- /dev/null +++ b/src/gs-upgrade-banner.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "gnome-software-private.h" + +G_BEGIN_DECLS + +#define GS_TYPE_UPGRADE_BANNER (gs_upgrade_banner_get_type ()) + +G_DECLARE_DERIVABLE_TYPE (GsUpgradeBanner, gs_upgrade_banner, GS, UPGRADE_BANNER, AdwBin) + +struct _GsUpgradeBannerClass +{ + AdwBinClass parent_class; + + void (*download_clicked) (GsUpgradeBanner *self); + void (*install_clicked) (GsUpgradeBanner *self); + void (*cancel_clicked) (GsUpgradeBanner *self); +}; + +GtkWidget *gs_upgrade_banner_new (void); +void gs_upgrade_banner_set_app (GsUpgradeBanner *self, + GsApp *app); +GsApp *gs_upgrade_banner_get_app (GsUpgradeBanner *self); + +G_END_DECLS diff --git a/src/gs-upgrade-banner.ui b/src/gs-upgrade-banner.ui new file mode 100644 index 0000000..a9cadd6 --- /dev/null +++ b/src/gs-upgrade-banner.ui @@ -0,0 +1,234 @@ + + + + + + + horizontal + + + + + + diff --git a/src/gs-utils-error-dialog-simple.ui b/src/gs-utils-error-dialog-simple.ui new file mode 100644 index 0000000..12c5ea5 --- /dev/null +++ b/src/gs-utils-error-dialog-simple.ui @@ -0,0 +1,75 @@ + + + + Error Details + 500 + 350 + + + + + + + + + + + + + + True + center + + + + + + + + Details + + + Copy Details + edit-copy-symbolic + center + + + + + + True + hidden + + + + False + word-char + 12 + 12 + 12 + 12 + True + + + + + + + + + + + + + + + diff --git a/src/gs-vendor.c b/src/gs-vendor.c new file mode 100644 index 0000000..6e14ec6 --- /dev/null +++ b/src/gs-vendor.c @@ -0,0 +1,127 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2008 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include "gs-vendor.h" + +struct _GsVendor +{ + GObject parent_instance; + + GKeyFile *file; +}; + +G_DEFINE_TYPE (GsVendor, gs_vendor, G_TYPE_OBJECT) + +#ifdef HAVE_PACKAGEKIT +static const gchar * +gs_vendor_type_to_string (GsVendorUrlType type) +{ + if (type == GS_VENDOR_URL_TYPE_CODEC) + return "CodecUrl"; + if (type == GS_VENDOR_URL_TYPE_FONT) + return "FontUrl"; + if (type == GS_VENDOR_URL_TYPE_MIME) + return "MimeUrl"; + if (type == GS_VENDOR_URL_TYPE_HARDWARE) + return "HardwareUrl"; + return "DefaultUrl"; +} +#endif + +gchar * +gs_vendor_get_not_found_url (GsVendor *vendor, GsVendorUrlType type) +{ +#ifdef HAVE_PACKAGEKIT + const gchar *key; + gchar *url = NULL; + + /* get data */ + key = gs_vendor_type_to_string (type); + url = g_key_file_get_string (vendor->file, "PackagesNotFound", key, NULL); + + /* none is a special value */ + if (g_strcmp0 (url, "none") == 0) { + g_free (url); + url = NULL; + } + + /* got a valid URL */ + if (url != NULL) + goto out; + + /* default has no fallback */ + if (type == GS_VENDOR_URL_TYPE_DEFAULT) + goto out; + + /* get fallback data */ + g_debug ("using fallback"); + key = gs_vendor_type_to_string (GS_VENDOR_URL_TYPE_DEFAULT); + url = g_key_file_get_string (vendor->file, "PackagesNotFound", key, NULL); + + /* none is a special value */ + if (g_strcmp0 (url, "none") == 0) { + g_free (url); + url = NULL; + } +out: + g_debug ("url=%s", url); + return url; +#else + return NULL; +#endif +} + +static void +gs_vendor_init (GsVendor *vendor) +{ +#ifdef HAVE_PACKAGEKIT + g_autoptr(GError) local_error = NULL; + const gchar *fn = "/etc/PackageKit/Vendor.conf"; + gboolean ret; + + vendor->file = g_key_file_new (); + ret = g_key_file_load_from_file (vendor->file, fn, G_KEY_FILE_NONE, &local_error); + if (!ret && local_error && !g_error_matches (local_error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) + g_warning ("Failed to read '%s': %s", fn, local_error->message); +#endif +} + +static void +gs_vendor_finalize (GObject *object) +{ + GsVendor *vendor = GS_VENDOR (object); + + if (vendor->file != NULL) + g_key_file_free (vendor->file); + + G_OBJECT_CLASS (gs_vendor_parent_class)->finalize (object); +} + +static void +gs_vendor_class_init (GsVendorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gs_vendor_finalize; +} + +/** + * gs_vendor_new: + * + * Return value: a new GsVendor object. + **/ +GsVendor * +gs_vendor_new (void) +{ + GsVendor *vendor; + vendor = g_object_new (GS_TYPE_VENDOR, NULL); + return GS_VENDOR (vendor); +} + diff --git a/src/gs-vendor.h b/src/gs-vendor.h new file mode 100644 index 0000000..e0472a9 --- /dev/null +++ b/src/gs-vendor.h @@ -0,0 +1,33 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2008 Richard Hughes + * Copyright (C) 2015 Kalev Lember + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define GS_TYPE_VENDOR (gs_vendor_get_type ()) + +G_DECLARE_FINAL_TYPE (GsVendor, gs_vendor, GS, VENDOR, GObject) + +typedef enum +{ + GS_VENDOR_URL_TYPE_CODEC, + GS_VENDOR_URL_TYPE_FONT, + GS_VENDOR_URL_TYPE_MIME, + GS_VENDOR_URL_TYPE_HARDWARE, + GS_VENDOR_URL_TYPE_DEFAULT +} GsVendorUrlType; + +GsVendor *gs_vendor_new (void); +gchar *gs_vendor_get_not_found_url (GsVendor *vendor, + GsVendorUrlType type); + +G_END_DECLS diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..9b4f38c --- /dev/null +++ b/src/meson.build @@ -0,0 +1,327 @@ +cargs = ['-DG_LOG_DOMAIN="Gs"'] +cargs += ['-DLOCALPLUGINDIR=""'] + +resources_src = gnome.compile_resources( + 'gs-resources', + 'gnome-software.gresource.xml', + source_dir : '.', + c_name : 'gs' +) + +gdbus_src = gnome.gdbus_codegen( + 'gs-shell-search-provider-generated', + 'shell-search-provider-dbus-interfaces.xml', + interface_prefix : 'org.gnome.', + namespace : 'Gs', + extra_args : [ '--glib-min-required=' + glib.version() ], +) + +enums = gnome.mkenums_simple('gs-enums', + sources : [ + 'gs-context-dialog-row.h', + 'gs-updates-paused-banner.h', + ], + install_header : false, +) + +gnome_software_sources = [ + 'gs-age-rating-context-dialog.c', + 'gs-app-addon-row.c', + 'gs-app-reviews-dialog.c', + 'gs-app-version-history-dialog.c', + 'gs-app-version-history-row.c', + 'gs-application.c', + 'gs-app-context-bar.c', + 'gs-app-details-page.c', + 'gs-app-row.c', + 'gs-app-tile.c', + 'gs-app-translation-dialog.c', + 'gs-basic-auth-dialog.c', + 'gs-category-page.c', + 'gs-category-tile.c', + 'gs-common.c', + 'gs-context-dialog-row.c', + 'gs-css.c', + 'gs-description-box.c', + 'gs-details-page.c', + 'gs-extras-page.c', + 'gs-feature-tile.c', + 'gs-featured-carousel.c', + 'gs-hardware-support-context-dialog.c', + 'gs-info-window.c', + 'gs-installed-page.c', + 'gs-language.c', + 'gs-layout-manager.c', + 'gs-license-tile.c', + 'gs-loading-page.c', + 'gs-lozenge.c', + 'gs-main.c', + 'gs-overview-page.c', + 'gs-origin-popover-row.c', + 'gs-os-update-page.c', + 'gs-page.c', + 'gs-prefs-dialog.c', + 'gs-progress-button.c', + 'gs-removal-dialog.c', + 'gs-repos-dialog.c', + 'gs-repos-section.c', + 'gs-repo-row.c', + 'gs-review-bar.c', + 'gs-review-dialog.c', + 'gs-review-histogram.c', + 'gs-review-row.c', + 'gs-safety-context-dialog.c', + 'gs-screenshot-carousel.c', + 'gs-screenshot-image.c', + 'gs-search-page.c', + 'gs-shell.c', + 'gs-shell-search-provider.c', + 'gs-star-image.c', + 'gs-star-widget.c', + 'gs-storage-context-dialog.c', + 'gs-summary-tile.c', + 'gs-toast.c', + 'gs-update-dialog.c', + 'gs-update-list.c', + 'gs-update-monitor.c', + 'gs-updates-page.c', + 'gs-updates-paused-banner.c', + 'gs-updates-section.c', + 'gs-upgrade-banner.c', + 'gs-vendor.c' +] + +gnome_software_dependencies = [ + appstream, + gio_unix, + glib, + gmodule, + gtk, + json_glib, + libgnomesoftware_dep, + libadwaita, + libm, + libsoup, + libxmlb, +] + +if get_option('dkms') + gnome_software_sources += [ + 'gs-dkms-dialog.h', + 'gs-dkms-dialog.c', + ] +endif + +if get_option('packagekit') + gnome_software_sources += [ + 'gs-dbus-helper.c', + ] + gnome_software_sources += gnome.gdbus_codegen( + 'gs-packagekit-generated', + 'org.freedesktop.PackageKit.xml', + interface_prefix : 'org.freedesktop.', + namespace : 'Gs', + extra_args : [ '--glib-min-required=' + glib.version() ], + ) + gnome_software_sources += gnome.gdbus_codegen( + 'gs-packagekit-modify2-generated', + 'org.freedesktop.PackageKit.Modify2.xml', + interface_prefix : 'org.freedesktop.', + namespace : 'Gs', + extra_args : [ '--glib-min-required=' + glib.version() ], + ) + gnome_software_dependencies += [packagekit] +endif + +if get_option('mogwai') + gnome_software_dependencies += [mogwai_schedule_client] +endif + +executable( + 'gnome-software', + resources_src, + gdbus_src, + sources : gnome_software_sources + enums, + include_directories : [ + include_directories('..'), + include_directories('../lib'), + ], + dependencies : gnome_software_dependencies, + c_args : cargs, + install : true, + install_dir : get_option('bindir'), + install_rpath : gs_private_libdir, +) + +executable( + 'gnome-software-restarter', + sources : 'gs-restarter.c', + include_directories : [ + include_directories('..'), + ], + dependencies : [ + gio_unix, + glib, + ], + c_args : cargs, + install : true, + install_dir : get_option('libexecdir') +) + +# no quoting +cdata = configuration_data() +cdata.set('bindir', join_paths(get_option('prefix'), + get_option('bindir'))) +if (get_option('apt')) + cdata.set('apthandler', 'x-scheme-handler/apt;') +else + cdata.set('apthandler', '') +endif +if (get_option('snap')) + cdata.set('snaphandler', 'x-scheme-handler/snap;') +else + cdata.set('snaphandler', '') +endif +if (get_option('flatpak')) + cdata.set('flatpakhandler', 'x-scheme-handler/flatpak+https;') +else + cdata.set('flatpakhandler', '') +endif +cdata.set('application_id', application_id) + +# replace @bindir@ +configure_file( + input : 'org.gnome.Software.service.in', + output : application_id + '.service', + install_dir: join_paths(get_option('datadir'), 'dbus-1/services'), + configuration : cdata +) + +i18n.merge_file( + input: + # replace mime-type handlers + configure_file( + input : 'org.gnome.Software.desktop.in', + output : 'org.gnome.Software.desktop.tmp', + configuration : cdata + ), + output: application_id + '.desktop', + type: 'desktop', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'applications') +) + +if get_option('flatpak') + i18n.merge_file( + input: 'gnome-software-local-file-flatpak.desktop.in', + output: 'gnome-software-local-file-flatpak.desktop', + type: 'desktop', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'applications') + ) +endif + +if get_option('fwupd') + i18n.merge_file( + input: 'gnome-software-local-file-fwupd.desktop.in', + output: 'gnome-software-local-file-fwupd.desktop', + type: 'desktop', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'applications') + ) +endif + +if get_option('packagekit') or get_option('rpm_ostree') + i18n.merge_file( + input: 'gnome-software-local-file-packagekit.desktop.in', + output: 'gnome-software-local-file-packagekit.desktop', + type: 'desktop', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'applications') + ) +endif + +if get_option('snap') + i18n.merge_file( + input: 'gnome-software-local-file-snap.desktop.in', + output: 'gnome-software-local-file-snap.desktop', + type: 'desktop', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'applications') + ) +endif + +install_data('org.gnome.Software-search-provider.ini', + install_dir : 'share/gnome-shell/search-providers') + +if get_option('man') + xsltproc = find_program('xsltproc') + custom_target('manfile-gnome-software', + input: 'gnome-software.xml', + output: 'gnome-software.1', + install: true, + install_dir: join_paths(get_option('mandir'), 'man1'), + command: [ + xsltproc, + '--nonet', + '--stringparam', 'man.output.quietly', '1', + '--stringparam', 'funcsynopsis.style', 'ansi', + '--stringparam', 'man.th.extra1.suppress', '1', + '--stringparam', 'man.authors.section.enabled', '0', + '--stringparam', 'man.copyright.section.enabled', '0', + '-o', '@OUTPUT@', + 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl', + '@INPUT@' + ] + ) +endif + +if get_option('packagekit') + # replace @bindir@ + configure_file( + input : 'org.freedesktop.PackageKit.service.in', + output : 'org.freedesktop.PackageKit.service', + install_dir: join_paths(get_option('datadir'), 'dbus-1', 'services'), + configuration : cdata + ) +endif + +if get_option('tests') + test_env = environment() + test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) + test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + + cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), '..', 'data') + '"'] + e = executable( + 'gs-self-test-src', + compiled_schemas, + sources : [ + 'gs-css.c', + 'gs-common.c', + 'gs-self-test.c', + ], + include_directories : [ + include_directories('..'), + include_directories('../lib'), + ], + dependencies : [ + appstream, + gio_unix, + glib, + gmodule, + gtk, + json_glib, + libadwaita, + libgnomesoftware_dep, + libm, + libsoup, + ], + c_args : cargs + ) + test('gs-self-test-src', e, suite: ['plugins', 'src'], env: test_env) +endif diff --git a/src/org.freedesktop.PackageKit.Modify2.xml b/src/org.freedesktop.PackageKit.Modify2.xml new file mode 100644 index 0000000..3a7f384 --- /dev/null +++ b/src/org.freedesktop.PackageKit.Modify2.xml @@ -0,0 +1,560 @@ + +]> + + + + + + + The interface used for modifying the package database (version 2). + + + + + + + + + + + Installs local package files or service packs. + + + + + + + + An array of file names. + + + + + + + + + An interaction mode that specifies which UI elements should be shown + or hidden different from the user default, e.g. + hide-confirm-search,hide-confirm-deps,hide-confirm-install,show-progress. + The show options are: + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning. + The hide options are: + hide-confirm-search,hide-confirm-deps,hide-confirm-install,hide-progress,hide-finished,hide-warning. + Convenience options such as: + never, defaults or always. + are also available. + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + + + Installs packages to provide files. + + + + + + + + An array of file names. + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + + + Installs packages from a configured software source. + + + + + + + + An array of package names. + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + + + Installs mimetype handlers from a configured software source. + + + + + + + + An array of mime types, e.g. text/plain + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + + + Installs fontconfig resources (usually fonts) from a configured software source. + + + + + + + + An array of font descriptors from fontconfig, e.g. :lang=mn + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + + + Installs GStreamer fontconfig resources (usually codecs) from a configured software source. + + + + + + + + An array of codecs descriptors from pk-gstreamer-install, e.g. + Advanced Streaming Format (ASF) demuxer|decoder-video/x-ms-asf + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + + + Installs resources of a given type from a configured software source. + + + + + + + + The type of resource to request, e.g. plasma-service + + + + + + + + + An array of resource descriptors + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + + + Removes packages that provide the given local files. + + + + + + + + An array of file names. + + + + + + + + + An interaction mode that specifies which UI elements should be shown + or hidden different from the user default, e.g. + hide-confirm-search,hide-confirm-deps,hide-confirm-install,show-progress. + The show options are: + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning. + The hide options are: + hide-confirm-search,hide-confirm-deps,hide-confirm-install,hide-progress,hide-finished,hide-warning. + Convenience options such as: + never, defaults or always. + are also available. + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + + Installs printer drivers from a configured software source. + + + + + + + + An array of printer model descriptors in IEEE 1284 + Device ID format, + e.g. MFG:Hewlett-Packard;MDL:HP LaserJet + 6MP;. + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + The desktop file ID of the calling app. + + + + + + + + + Additional platform specific data, in the form of GVariant + dictionary mapping strings to variants. As the name indicates, + the platform data may vary depending on the operating system. + Currently recognized keys are: + desktop-startup-id: startup notification + identifier that is used to transfer focus to the software installer app; + if the startup notification id is not available, this can be just "_TIMEeventtime", + where eventtime is the time stamp from the event triggering the call. + + + + + + + + + + + Translated, human readable name of the program implementing the interface, e.g. 'Software' for gnome-software. + + + + + + + diff --git a/src/org.freedesktop.PackageKit.service.in b/src/org.freedesktop.PackageKit.service.in new file mode 100644 index 0000000..54c0466 --- /dev/null +++ b/src/org.freedesktop.PackageKit.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.freedesktop.PackageKit +Exec=@bindir@/gnome-software --gapplication-service diff --git a/src/org.freedesktop.PackageKit.xml b/src/org.freedesktop.PackageKit.xml new file mode 100644 index 0000000..c70cac3 --- /dev/null +++ b/src/org.freedesktop.PackageKit.xml @@ -0,0 +1,506 @@ + +]> + + + + + + + The interface used for querying the package database. + + + + + + + + + + + Finds out if the package is installed. + + + + + + + + A package name, e.g. hal-info + + + + + + + + + An optional interaction mode, e.g. + timeout=10 + + + + + + + + + If the package is installed. + + + + + + + + + + + + + Finds the package name for an installed or available file + + + + + + + + A package name, e.g. /usr/share/help/gimp/index.html + + + + + + + + + An optional interaction mode, e.g. + timeout=10 + + + + + + + + + If the package is installed. + + + + + + + + + The package name of the file, e.g. hal-info + + + + + + + + + + + + + The interface used for modifying the package database. + + + + + + + + + + + Installs local package files or service packs. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + An array of file names. + + + + + + + + + An interaction mode that specifies which UI elements should be shown + or hidden different from the user default, e.g. + hide-confirm-search,hide-confirm-deps,hide-confirm-install,show-progress. + The show options are: + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning. + The hide options are: + hide-confirm-search,hide-confirm-deps,hide-confirm-install,hide-progress,hide-finished,hide-warning. + Convenience options such as: + never, defaults or always. + are also available. + + + + + + + + + + + + + Installs packages to provide files. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + An array of file names. + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + + + + + Installs packages from a configured software source. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + An array of package names. + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + + + + + Installs mimetype handlers from a configured software source. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + An array of mime types, e.g. text/plain + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + + + + + Installs fontconfig resources (usually fonts) from a configured software source. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + An array of font descriptors from fontconfig, e.g. :lang=mn + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + + + + + Installs GStreamer fontconfig resources (usually codecs) from a configured software source. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + An array of codecs descriptors from pk-gstreamer-install, e.g. + Advanced Streaming Format (ASF) demuxer|decoder-video/x-ms-asf + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + + + + + Installs resources of a given type from a configured software source. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + The type of resource to request, e.g. plasma-service + + + + + + + + + An array of resource descriptors + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + + + + + + Removes packages that provide the given local files. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + An array of file names. + + + + + + + + + An interaction mode that specifies which UI elements should be shown + or hidden different from the user default, e.g. + hide-confirm-search,hide-confirm-deps,hide-confirm-install,show-progress. + The show options are: + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning. + The hide options are: + hide-confirm-search,hide-confirm-deps,hide-confirm-install,hide-progress,hide-finished,hide-warning. + Convenience options such as: + never, defaults or always. + are also available. + + + + + + + + + + + + Installs printer drivers from a configured software source. + + + + + + + + The X window handle ID, used for focus stealing prevention and setting modality. + + + + + + + + + An array of printer model descriptors in IEEE 1284 + Device ID format, + e.g. MFG:Hewlett-Packard;MDL:HP LaserJet + 6MP;. + + + + + + + + + An optional interaction mode, e.g. + show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning + + + + + + + + diff --git a/src/org.gnome.Software-search-provider.ini b/src/org.gnome.Software-search-provider.ini new file mode 100644 index 0000000..7d8f809 --- /dev/null +++ b/src/org.gnome.Software-search-provider.ini @@ -0,0 +1,5 @@ +[Shell Search Provider] +DesktopId=org.gnome.Software.desktop +BusName=org.gnome.Software +ObjectPath=/org/gnome/Software/SearchProvider +Version=2 diff --git a/src/org.gnome.Software.desktop.in b/src/org.gnome.Software.desktop.in new file mode 100644 index 0000000..55a7836 --- /dev/null +++ b/src/org.gnome.Software.desktop.in @@ -0,0 +1,17 @@ +[Desktop Entry] +Name=Software +Comment=Add, remove or update software on this computer +# Translators: Do NOT translate or transliterate this text (this is an icon file name)! +Icon=@application_id@ +Exec=gnome-software %U +Terminal=false +Type=Application +Categories=GNOME;GTK;System;PackageManager; +# Translators: Search terms to find this app. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +Keywords=Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store; +StartupNotify=true +MimeType=x-scheme-handler/appstream;@apthandler@@snaphandler@@flatpakhandler@ +X-GNOME-UsesNotifications=true +DBusActivatable=true +# Translators: Do NOT translate or transliterate this text (these are enum types)! +X-Purism-FormFactor=Workstation;Mobile; diff --git a/src/org.gnome.Software.service.in b/src/org.gnome.Software.service.in new file mode 100644 index 0000000..5c39f0c --- /dev/null +++ b/src/org.gnome.Software.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=@application_id@ +Exec=@bindir@/gnome-software --gapplication-service diff --git a/src/shell-search-provider-dbus-interfaces.xml b/src/shell-search-provider-dbus-interfaces.xml new file mode 100644 index 0000000..f6840e2 --- /dev/null +++ b/src/shell-search-provider-dbus-interfaces.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/style-dark.css b/src/style-dark.css new file mode 100644 index 0000000..eed4f88 --- /dev/null +++ b/src/style-dark.css @@ -0,0 +1,117 @@ +@define-color flatpak_packaging_color @blue_2; + +.upgrade-banner-background { + background: linear-gradient(to bottom, @green_5, @blue_5); +} + +.context-tile-lozenge.green, +.context-tile-lozenge.details-rating-0 { + color: @green_1; + background-color: alpha(@green_4, .25); +} + +.context-tile-lozenge.blue, +.context-tile-lozenge.details-rating-5 { + color: @blue_1; +} + +.context-tile-lozenge.yellow, +.context-tile-lozenge.details-rating-12 { + color: @yellow_2; + background: alpha(#cd9309, .25); +} + +.context-tile-lozenge.orange, +.context-tile-lozenge.details-rating-15 { + color: @orange_1; +} + +.context-tile-lozenge.red, +.context-tile-lozenge.details-rating-18 { + color: #ff7b63; +} + +/* Dark styling for specific category buttons. */ +.category-tile.category-create { + background: linear-gradient(180deg, #9141ac 0%, #2D5AA8 100%); + color: white; +} +.category-tile.category-create:hover { + background: linear-gradient(180deg, shade(#9141ac, 1.07) 0%, shade(#2D5AA8, 1.1) 100%); +} +.category-tile.category-create:active { + background: linear-gradient(180deg, shade(#9141ac, .95) 0%, shade(#2D5AA8, .95) 100%); +} + +.category-tile.category-develop { + background: #4E4C54; + color: white; +} +.category-tile.category-develop:hover { + background: shade(#4E4C54, 1.2); +} +.category-tile.category-develop:active { + background-color: shade(#4E4C54, .95); +} + +.category-tile.category-learn { + background: linear-gradient(180deg, #28AA6E 30%, #1E7E52 100%); + color: white; +} +.category-tile.category-learn:hover { + background: linear-gradient(180deg, shade(#28AA6E, 1.06) 30%, shade(#1E7E52, 1.06) 100%); +} +.category-tile.category-learn:active { + background: linear-gradient(180deg, shade(#28AA6E, .95) 30%, shade(#1E7E52, .95) 100%); +} + +.category-tile.category-play { + background: linear-gradient(75deg, #E9CF90 0%, #C8499C 50%, #4B35BA 100%); + color: #393484; +} +.category-tile.category-play:hover { + background: linear-gradient(75deg, shade(#E9CF90, 1.07) 0%, shade(#C8499C, 1.07) 50%, shade(#4B35BA, 1.07) 100%); +} +.category-tile.category-play:active { + background: linear-gradient(75deg, shade(#E9CF90, .97) 0%, shade(#C8499C, .95) 50%, shade(#4B35BA, 1.07) 100%); +} + +.category-tile.category-socialize { + background: linear-gradient(90deg, #CC307F 0%, #DD6C62 100%); + color: alpha(black, 0.75); +} +.category-tile.category-socialize:hover { + background: linear-gradient(90deg, shade(#CC307F, 1.08) 0%, shade(#DD6C62, 1.08) 100%); +} +.category-tile.category-socialize:active { + background: linear-gradient(90deg, shade(#CC307F, .95) 0%, shade(#DD6C62, .95) 100%); +} + +.category-tile.category-work { + padding: 1px; /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color:#ECDDA8; + background-image: linear-gradient(#C2C1BE 1px, transparent 1px), + linear-gradient(90deg, #C2C1BE 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; +} +.category-tile.category-work:hover { + background-color: shade(#ECDDA8, 1.03); + background-image: linear-gradient(shade(#C2C1BE, 1.04) 1px, transparent 1px), + linear-gradient(90deg, shade(#C2C1BE, 1.04) 1px, transparent 1px); +} +.category-tile.category-work:active { + background-color: shade(#ECDDA8, .93); + background-image: linear-gradient(shade(#C2C1BE, .97) 1px, transparent 1px), + linear-gradient(90deg, shade(#C2C1BE, .97) 1px, transparent 1px); +} + +star-image { + color: @yellow_1; +} + +.review-histogram star-image { + /* Specificity bump */ + color: alpha(@theme_fg_color, .4); +} diff --git a/src/style-hc.css b/src/style-hc.css new file mode 100644 index 0000000..01161cd --- /dev/null +++ b/src/style-hc.css @@ -0,0 +1,33 @@ +.installed-overlay-box { + text-shadow: none; +} + +.category-tile:not(.category-tile-iconless) { + box-shadow: inset 0 0 0 1px alpha(@card_fg_color, .5); +} + +review-bar, +.review-histogram star-image { + color: alpha(@theme_fg_color, .8); +} + +star-image > image.starred { + color: inherit; +} + +star-image > image.non-starred { + opacity: 0.4; +} + +.origin-rounded-box { + box-shadow: inset 0 0 0 1px currentColor; +} + +.context-tile-lozenge { + box-shadow: inset 0 0 0 1px currentColor; +} + +app-context-bar .context-tile { + border-color: @borders; + box-shadow: none; +} diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..9790cee --- /dev/null +++ b/src/style.css @@ -0,0 +1,565 @@ +@define-color flatpak_packaging_color @blue_4; + +.details-page { + margin: 24px 0px; +} + +.installed-overlay-box { + font-size: smaller; + background-color: @accent_bg_color; + border-radius: 0; + color: @accent_fg_color; + text-shadow: 0 1px 0 rgba(0,0,0,0.5); +} + +screenshot-carousel box.frame { + border-width: 1px 0; +} + +screenshot-carousel button, +.featured-carousel button { + margin: 12px; +} + +.smaller { + font-size: smaller; +} + +.screenshot-image-main .image1, .screenshot-image-main .image2 { + margin-top: 6px; + margin-bottom: 12px; + margin-left: 6px; + margin-right: 6px; +} + +gs-summary-tile image.loading-icon { + background-color: @borders; + border-radius: 8px; +} + +.review-row > box { + margin: 12px; + border-spacing: 3px 0px; +} + +.review-row textview { + background: none; +} + +.review-row .edit-icon { + min-width: 24px; + min-height: 24px; + padding: 5px; +} + +.origin-rounded-box { + background-color: alpha(currentColor, .15); + border-radius: 999px; + padding: 0.25em 0.5em; +} + +.origin-rounded-box label { + font-size: 75%; + font-weight: 600; + text-transform: uppercase; +} + +.origin-beta { + color: @warning_color; +} + +.origin-button > button { + padding: 2px 8px; +} + +/* This mimicks the style of list and row from Adwaita, and of list.content from + * Libhandy. */ + +.category-tile { + /* We have to remove the padding: 160px - 2*10px = 140px */ + min-width: 140px; + padding: 20px 10px; + font-weight: 900; + font-size: larger; +} + +clamp.medium .category-tile:not(.category-tile-iconless) { + font-size: large; +} + +clamp.large .category-tile:not(.category-tile-iconless) { + font-size: larger; +} + +.category-tile.category-tile-iconless { + /* We have to remove the padding: 160px - 2*15px = 130px */ + min-width: 130px; + padding: 10px 15px; + font-size: 105%; + font-weight: normal; +} + +/* Styling for specific category buttons. */ +.category-tile.category-create { + background: linear-gradient(180deg, #ce8cd7 0%, #2861c6 100%); + color: white; +} +.category-tile.category-create:hover { + background: linear-gradient(180deg, shade(#ce8cd7, 1.07) 0%, shade(#2861c6, 1.1) 100%); +} +.category-tile.category-create:active { + background: linear-gradient(180deg, shade(#ce8cd7, .95) 0%, shade(#2861c6, .95) 100%); +} + +.category-tile.category-develop { + background: #5e5c64; + color: white; +} +.category-tile.category-develop:hover { + background: shade(#5e5c64, 1.2); +} +.category-tile.category-develop:active { + background-color: shade(#5e5c64, .95); +} + +.category-tile.category-learn { + background: linear-gradient(180deg, #2ec27e 30%, #27a66c 100%); + color: white; +} +.category-tile.category-learn:hover { + background: linear-gradient(180deg, shade(#2ec27e, 1.06) 30%, shade(#27a66c, 1.06) 100%); +} +.category-tile.category-learn:active { + background: linear-gradient(180deg, shade(#2ec27e, .95) 30%, shade(#27a66c, .95) 100%); +} + +.category-tile.category-play { + background: linear-gradient(75deg, #f9e2a7 0%, #eb5ec3 50%, #6d53e0 100%); + color: #393484; +} +.category-tile.category-play:hover { + background: linear-gradient(75deg, shade(#f9e2a7, 1.07) 0%, shade(#eb5ec3, 1.07) 50%, shade(#6d53e0, 1.07) 100%); +} +.category-tile.category-play:active { + background: linear-gradient(75deg, shade(#f9e2a7, .97) 0%, shade(#eb5ec3, .95) 50%, shade(#6d53e0, 1.07) 100%); +} + +.category-tile.category-socialize { + background: linear-gradient(90deg, #ef4e9b 0%, #f77466 100%); + color: alpha(black, 0.7); +} +.category-tile.category-socialize:hover { + background: linear-gradient(90deg, shade(#ef4e9b, 1.08) 0%, shade(#f77466, 1.08) 100%); +} +.category-tile.category-socialize:active { + background: linear-gradient(90deg, shade(#ef4e9b, .95) 0%, shade(#f77466, .95) 100%); +} + +.category-tile.category-work { + padding: 1px; /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color:#fdf8d7; + background-image: linear-gradient(#deddda 1px, transparent 1px), + linear-gradient(90deg, #deddda 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; +} +.category-tile.category-work:hover { + background-color: shade(#fdf8d7, 1.03); + background-image: linear-gradient(shade(#deddda, 1.04) 1px, transparent 1px), + linear-gradient(90deg, shade(#deddda, 1.04) 1px, transparent 1px); +} +.category-tile.category-work:active { + background-color: shade(#fdf8d7, .93); + background-image: linear-gradient(shade(#deddda, .97) 1px, transparent 1px), + linear-gradient(90deg, shade(#deddda, .97) 1px, transparent 1px); +} + +/* The rest of the featured-tile CSS is loaded at runtime in gs-feature-tile.c */ +.featured-tile { + all: unset; + padding: 0; + box-shadow: none; + color: @theme_fg_color; +} + +.featured-tile label.title-1 { + margin-top: 6px; + margin-bottom: 6px; +} + +.featured-tile.narrow label.title-1 { + font-size: 16pt; /* 80% of .title-1 */ +} + +.card.info { + background-color: mix(@accent_bg_color, @window_bg_color, .7); + color: @window_fg_color; +} + +.card.warning { + background-color: mix(@warning_bg_color, @window_bg_color, .7); + color: @window_fg_color; +} + +.infobox { + border-spacing: 6px; + padding: 12px; +} + +@keyframes install-progress-unknown-move { + 0% { background-position: 0%; } + 50% { background-position: 100%; } + 100% { background-position: 0%; } +} + +.application-details-description .button { + padding-left:24px; + padding-right:24px; +} + +.install-progress { + background-image: linear-gradient(to top, @accent_bg_color 2px, alpha(@accent_bg_color, 0) 2px); + background-repeat: no-repeat; + background-position: 0 bottom; + background-size: 0; + transition: none; +} + +.install-progress:dir(rtl) { background-position: 100% bottom; } + +.review-row > * { + margin: 12px; +} + +.review-row button { font-size: smaller; } + +.review-row .vote-buttons button { + margin-right: -1px; +} + +/* this is the separator between yes and no vote buttons, gtk+ 3.20 only */ +.review-row .vote-buttons button:not(:first-child) { + border-image: linear-gradient(to top, @borders, @borders) 0 0 0 1 / 5px 0 5px 1px; +} + +.review-row .vote-buttons button:hover, +.review-row .vote-buttons button:active, +.review-row .vote-buttons button:hover + button, +.review-row .vote-buttons button:active + button { + border-image: none; +} + +review-bar { + color: alpha(@theme_fg_color, .4); + background-image: none; + background-color: alpha(currentColor, .5); +} + +.review-histogram star-image { + color: alpha(@theme_fg_color, .4); +} + +.version-arrow-label { + font-size: x-small; +} + +.overview-more-button { + font-size: smaller; + padding: 0px 15px; +} + +.app-row-origin-text { + font-size: smaller; +} + +.app-listbox-header { + padding: 6px; + border-bottom: 1px solid @borders; +} + +.image-list { + background-color: transparent; +} + +box.star { + background-color: transparent; + background-image: none; +} + +button.star { + outline-offset: 0; + background-color: transparent; + background-image: none; + border-image: none; + border-radius: 0; + border-width: 0px; + padding: 0; + box-shadow: none; + outline-offset: -1px; +} + +/* i have no idea why GTK adds padding here */ +flowboxchild { + padding: 0px; +} + +star-image > image.starred { + color: @yellow_5; + transition-duration: 200ms; +} + +star-image > image.non-starred { + opacity: 0.2; + transition-duration: 200ms; +} + +.dimmer-label { + opacity: 0.25; +} + +.gs-rounded { + border-radius: 8px; +} + +.upgrade-banner { + padding: 0px; + border-radius: 8px; + border: none; +} + +.upgrade-banner-background { + background: linear-gradient(to bottom, @green_3, @blue_3); + color: white; +} + +.upgrade-buttons #button_upgrades_install, .upgrade-buttons #button_upgrades_install_cancel { + padding-left: 16px; + padding-right: 16px; +} + +/* The following style are taken from libhandy's AdwPreferencesPage style, which + * implements the style for titled lists of lists. + * FIXME: Drop these styles if the pages using it are ported to + * AdwPreferencesPage or its successor in Libadwaita, if their clamp size can be + * set as a property. */ + +scrolledwindow.list-page > viewport > clamp > box { + margin: 24px 12px; + border-spacing: 24px; +} + +/* The following style is taken from libhandy's AdwPreferencesGroup style, which + * implements the style for titled and described sections with a list box. + * FIXME: Drop this style if we use the successor of AdwPreferencesGroup in + * Libadwaita when porting to GTK 4. */ + +.section > label:not(:first-child) { margin-top: 6px; } + +.section > box:not(:first-child) { margin-top: 12px; } + +app-context-bar .context-tile { + border: 1px solid @card_shade_color; + background-color: transparent; + border-radius: 0; + padding: 24px 12px 21px 12px; + outline-offset: 5px; + transition-property: outline, outline-offset, background-image; + border-bottom: none; + border-right: none; +} + +app-context-bar .context-tile:hover { + background-image: image(alpha(currentColor, .03)); +} + +app-context-bar .context-tile.keyboard-activating, +app-context-bar .context-tile:active { + background-image: image(alpha(currentColor, .08)); +} + +app-context-bar .context-tile:focus:focus-visible { + outline-offset: -1px; +} + +app-context-bar box:first-child .context-tile:first-child { + border-top-left-radius: 12px; +} + +app-context-bar.horizontal box:last-child .context-tile:last-child, +app-context-bar.vertical box:first-child .context-tile:last-child { + border-top-right-radius: 12px; +} + +app-context-bar.horizontal box:first-child .context-tile:first-child, +app-context-bar.vertical box:last-child .context-tile:first-child { + border-bottom-left-radius: 12px; +} + +app-context-bar box:last-child .context-tile:last-child { + border-bottom-right-radius: 12px; +} + +app-context-bar.horizontal box:first-child .context-tile:first-child, +app-context-bar.vertical .context-tile:first-child { + border-left: none; +} + +app-context-bar.horizontal .context-tile, +app-context-bar.vertical box:first-child .context-tile { + border-top: none; +} + +.context-tile-lozenge { + font-size: 18px; + font-weight: bold; + border-radius: 99999px; + padding: 9px 11px; + min-width: 18px; /* 40px minus the left and right padding */ + min-height: 22px; /* 40px minus the top and bottom padding */ +} + +.context-tile-lozenge.large { + font-size: 24px; + padding: 15px 18px; + min-width: 24px; /* 60px minus the left and right padding */ + min-height: 30px; /* 60px minus the top and bottom padding */ +} + +.context-tile-lozenge.wide-image image { + /* GtkImage always renders image square, so if we want an image which + * is wide, but still the same height as all the others, we have to + * use this hack to make it zero-height and vertically centred. The + * vertical size group ensures that it does still actually have a + * height. */ + margin-top: -28px; + margin-bottom: -28px; +} + +.context-tile-lozenge image { -gtk-icon-style: symbolic; } + +.context-tile-lozenge.grey { + color: alpha(@window_fg_color, .75); + background-color: alpha(@window_fg_color, .15); +} + +.context-tile-lozenge.green, +.context-tile-lozenge.details-rating-0 { + color: @green_5; + background-color: alpha(@green_3, .25); +} + +.context-tile-lozenge.blue, +.context-tile-lozenge.details-rating-5 { + color: @blue_4; + background-color: alpha(@blue_3, .25); +} + +.context-tile-lozenge.yellow, +.context-tile-lozenge.details-rating-12 { + color: #ae7b03; + background: alpha(@yellow_5, .25); +} + +.context-tile-lozenge.orange, +.context-tile-lozenge.details-rating-15 { + color: @orange_5; + background-color: alpha(@orange_4, .25); +} + +.context-tile-lozenge.red, +.context-tile-lozenge.details-rating-18 { + color: @red_4; + background-color: alpha(@red_2, .25); +} + +window.narrow .app-title { + font-size: 16pt; +} + +window.narrow .app-developer { + font-size: small; +} + +.install-progress-label { + font-size: smaller; + font-feature-settings: "tnum"; +} + +/* FIXME: These are needed in the updates page until we can use AdwStatusPage + * again. See the note in gs-updates-page.ui. */ +scrolledwindow.fake-adw-status-page > viewport > box { margin: 36px 12px; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp:not(:last-child) > box { margin-bottom: 36px; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .icon:not(:last-child) { margin-bottom: 36px; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .title:not(:last-child) { margin-bottom: 12px; } + +statuspage.icon-dropshadow image.icon { + /* This copies the style of .icon-dropshadow from Adwaita. */ + -gtk-icon-shadow: 0 1px 12px rgba(0,0,0,0.05), + 0 -1px rgba(0,0,0,0.05), + 1px 0 rgba(0,0,0,0.1), + 0 1px rgba(0,0,0,0.3), + -1px 0 rgba(0,0,0,0.1); +} + +window.info scrollbar.vertical { + /* The size a typical headerbar takes: 46px + 1px for the bottom border. */ + margin-top: 47px; + + /* Revelant for scrollbars without .overlay-indicator. */ + background: none; + box-shadow: none; +} + +window.info scrollbar.vertical trough { + /* The size a typical headerbar takes: 46px + 1px for the bottom border. */ + margin-top: 0; +} + +box.history-row-header { + border-spacing: 12px 6px; +} + +/************ + * GsAppRow * + ************/ + +row.app > box.header { + margin-left: 12px; + margin-right: 12px; +} + +row.app > box.header { + border-spacing: 12px; +} + +row.app > box.header > image { + margin-top: 12px; + margin-bottom: 12px; +} + +row.app label.warning { + color: @error_color; +} + +/************** + * GtkSpinner * + **************/ + +/* Ensure the spinner is hidden before the animation is triggered. */ +@keyframes pre-delay { + from { opacity: 0; } + to { opacity: 0; } +} + +/* We don't use the opacity CSS property because it's used by the spinner and we + * want to leave it untouched. */ +@keyframes fade-in { + from { filter: opacity(0%); } +} + +/* Give a fade-in animation to spinners. */ +spinner.fade-in:checked { + animation: pre-delay 0.5s linear 1, fade-in 1s linear 1, spin 1s linear infinite; + animation-delay: 0s, 0.5s, 0.5s; +} diff --git a/subprojects/appstream.wrap b/subprojects/appstream.wrap new file mode 100644 index 0000000..b9a9c7d --- /dev/null +++ b/subprojects/appstream.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory = appstream +url = https://github.com/ximion/appstream.git +revision = v0.16.4 +depth = 1 diff --git a/subprojects/gnome-pwa-list.wrap b/subprojects/gnome-pwa-list.wrap new file mode 100644 index 0000000..d679a35 --- /dev/null +++ b/subprojects/gnome-pwa-list.wrap @@ -0,0 +1,6 @@ +[wrap-git] +directory = gnome-pwa-list +url = https://gitlab.gnome.org/mwleeds/gnome-pwa-list.git +# Note: The git submodule for this wrap should be updated when updating this +revision = 48ac9f7ed6a639eab7648f3e3b19105694eaf306 +depth = 1 diff --git a/subprojects/gnome-pwa-list/README.md b/subprojects/gnome-pwa-list/README.md new file mode 100644 index 0000000..b365319 --- /dev/null +++ b/subprojects/gnome-pwa-list/README.md @@ -0,0 +1,61 @@ +# GNOME PWA list + +This repository is a place to maintain a list of Progressive Web Apps that are +suitable for inclusion with GNOME Software. The goals of this initiative are: + +1. To facilitate the discovery of useful apps by pre-populating a list of web + apps in GNOME Software +2. To enable users to take advantage of the powerful features of PWAs, such as + offline functionality and desktop integration +3. To make the GNOME platform competitive with other platforms which already + make PWAs first-class citizens + +There is more context available in the discussion on [this issue](https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1575). + +## Criteria for inclusion + +To be eligible for inclusion, PWAs must: + +- either be released under an open source license (see below) or appear in the + popular apps category [here](https://www.findpwa.com/list/top-apps) or [here](https://appsco.pe/toplist) +- be served over HTTPS +- include a [web app manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest) with an + icon, name, and a `display` value of `fullscreen`, `standalone`, or + `minimal-ui`. The app having an Install button in Chrome means the app meets + and exceeds these criteria. +- be fully functional in GNOME Web +- not duplicate a native (non-Electron) app available for GNOME + +## Process for adding to the list + +1. Determine that the app meets all the criteria above. +2. Gather the information for each of the columns listed below. +2. If the license is [FSF-approved or OSI-approved](https://spdx.org/licenses/), + the app will go in `gnome-pwa-list-foss.csv`, otherwise `gnome-pwa-list-proprietary.csv`. +4. Add a new line in the format "URL,license,categories,content-rating,adaptive,custom-summary" to + either CSV file as appropriate. +5. Re-build the AppStream xml; see below. +6. Open a merge request [here](https://gitlab.gnome.org/mwleeds/gnome-pwa-list/-/merge_requests). + +| Column | Example value | Accepted values | +|---------|---------------|-----------------| +| URL | https://app.diagrams.net/ | the starting URL of the app | +| license | Apache-2.0 | the license(s) of the client side software in a format conforming to the AppStream [spec](https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-project_license) | +| categories | Graphics;Office | one or more main or additional categories as defined [here](https://specifications.freedesktop.org/menu-spec/latest/apa.html) | +| content-rating | social-info=intense;social-audio=moderate | a set of key-value pairs which are OARS 1.1 attributes and values; see [here](https://hughsie.github.io/oars/generate.html). "social-info=none" is appropriate if the service does not even store IP addresses | +| adaptive | adaptive | either "adaptive" or "not-adaptive" depending on whether mobile devices are supported | +| custom-summary | "Telegram web app based on the open API" | a one-sentence summary to use instead of the one in the manifest, or an empty string | + +## Re-generating AppStream xml + +The script `pwa-metainfo-generator.py` can take the CSV files mentioned above +and generate AppStream metainfo for them, which enables software centers to +display them with rich metadata such as screenshots. + +1. Install the `requests` and `bs4` python3 modules using pip3 or your package manager +2. To regenerate the FOSS xml: `python3 pwa-metainfo-generator.py gnome-pwa-list-foss.xml` +3. To regenerate the proprietary xml: `python3 pwa-metainfo-generator.py gnome-pwa-list-proprietary.xml` +4. You can check the validity using e.g. `appstreamcli validate + gnome-pwa-list-foss.xml`. It will complain about missing descriptions but + GNOME Software handles those gracefully. + diff --git a/subprojects/gnome-pwa-list/gnome-pwa-list-foss.csv b/subprojects/gnome-pwa-list/gnome-pwa-list-foss.csv new file mode 100644 index 0000000..e781ab6 --- /dev/null +++ b/subprojects/gnome-pwa-list/gnome-pwa-list-foss.csv @@ -0,0 +1,10 @@ +https://app.diagrams.net/,Apache-2.0,Graphics;Office;FlowChart,social-info=mild,adaptive, +https://pinafore.social/,AGPL-3.0-only,Chat,social-audio=intense;social-info=none,adaptive, +https://snapdrop.net/,GPL-3.0-only,FileTransfer;Utility,social-info=mild,adaptive,"Local network file sharing in your browser" +https://stackedit.io/app,Apache-2.0,TextEditor;Utility,social-info=mild,adaptive, +https://squoosh.app/,Apache-2.0,FileTools;Utility;ImageProcessing,social-info=moderate,adaptive, +https://excalidraw.com/,MIT,Office;Education,social-info=moderate,adaptive, +https://discourse.gnome.org/,GPL-2.0-or-later,Chat,social-info=moderate;social-audio=moderate;social-contacts=intense,adaptive, +https://discourse.flathub.org/,GPL-2.0-or-later,Chat,social-info=moderate;social-audio=moderate;social-contacts=intense,adaptive, +https://devdocs.io/,MPL-2.0,Documentation;Development,social-info=moderate,adaptive, +https://web.telegram.org/,GPL-3.0-only,Chat,social-info=mild,adaptive,"Telegram web app based on the MTProto protocol and Telegram's open API" diff --git a/subprojects/gnome-pwa-list/gnome-pwa-list-foss.xml b/subprojects/gnome-pwa-list/gnome-pwa-list-foss.xml new file mode 100644 index 0000000..f7d0a7a --- /dev/null +++ b/subprojects/gnome-pwa-list/gnome-pwa-list-foss.xml @@ -0,0 +1,310 @@ + + + + https://app.diagrams.net/ + https://app.diagrams.net/ + Apache-2.0 + FSFAP + Diagrams + org.gnome.Software.WebApp_527a2dd6729c3574227c145bbc447997f0048537.desktop + https://app.diagrams.net/images/android-chrome-512x512.png + + Graphics + Office + FlowChart + + + mild + + + pointing + keyboard + touch + small + + diagrams.net is a completely free diagram editor + + + https://pinafore.social/ + https://pinafore.social/ + AGPL-3.0-only + FSFAP + Pinafore + org.gnome.Software.WebApp_e636aa5f2069f6e9c02deccc7b65f43da7985e32.desktop + https://pinafore.social/icon-48.png + https://pinafore.social/icon-72.png + https://pinafore.social/icon-96.png + https://pinafore.social/icon-144.png + https://pinafore.social/icon-192.png + https://pinafore.social/icon-512.png + https://pinafore.social/icon-44.png + https://pinafore.social/icon-50.png + https://pinafore.social/icon-150.png + + + https://pinafore.social/screenshot-540-720-1.png + + + https://pinafore.social/screenshot-540-720-2.png + + + https://pinafore.social/screenshot-540-720-3.png + + + + Chat + + + intense + none + + + pointing + keyboard + touch + small + + An alternative web client for Mastodon, focused on speed and simplicity + + + https://snapdrop.net/ + https://snapdrop.net/ + GPL-3.0-only + FSFAP + Snapdrop + org.gnome.Software.WebApp_4dda9043da5b2d2aa57c6064c907c1ae3fe58941.desktop + https://snapdrop.net/images/android-chrome-192x192.png + https://snapdrop.net/images/android-chrome-512x512.png + https://snapdrop.net/images/favicon-96x96.png + + FileTransfer + Utility + + + mild + + + pointing + keyboard + touch + small + + Local network file sharing in your browser + + + https://stackedit.io/app + https://stackedit.io/app + Apache-2.0 + FSFAP + StackEdit + org.gnome.Software.WebApp_e7aada0261449b5239c5c458c48fe92717950d1a.desktop + https://stackedit.io/icon_512x512.bc1452c3b77b59eb0d8c449de1c77310.png + https://stackedit.io/icon_384x384.3f55b77300c8b37b4aa380c8460ee0a2.png + https://stackedit.io/icon_256x256.f406288343ae34c5c7bd1543700c2ac0.png + https://stackedit.io/icon_192x192.eec0feaecc5bef1a499b3de11bde6b27.png + https://stackedit.io/icon_128x128.43ad56ce3535a3ffe333a76a05c13267.png + https://stackedit.io/icon_96x96.1d93fc90dc62ceec6c921786ddab3f69.png + + TextEditor + Utility + + + mild + + + pointing + keyboard + touch + small + + Full-featured, open-source Markdown editor + + + https://squoosh.app/ + https://squoosh.app/ + Apache-2.0 + FSFAP + Squoosh + org.gnome.Software.WebApp_e41134be0ce95da0832878faa90cf3473b1b52d7.desktop + https://squoosh.app/c/icon-large-cb438cac.png + + + https://squoosh.app/c/screenshot1-0ff68546.png + + + https://squoosh.app/c/screenshot2-1f78c4db.jpg + + + https://squoosh.app/c/screenshot3-c1e02216.jpg + + + + FileTools + Utility + ImageProcessing + Photography + Office + + + moderate + + + pointing + keyboard + touch + small + + Compress and compare images with different codecs, right in your browser + + + https://excalidraw.com/ + https://excalidraw.com/ + MIT + FSFAP + Excalidraw + org.gnome.Software.WebApp_ea52ad18346faac27072cd1654243dfb7c70ef14.desktop + https://excalidraw.com/logo-180x180.png + https://excalidraw.com/apple-touch-icon.png + + + https://excalidraw.com/screenshots/virtual-whiteboard.png + + + https://excalidraw.com/screenshots/wireframe.png + + + https://excalidraw.com/screenshots/illustration.png + + + https://excalidraw.com/screenshots/shapes.png + + + https://excalidraw.com/screenshots/collaboration.png + + + https://excalidraw.com/screenshots/export.png + + + + Office + Education + + + moderate + + + pointing + keyboard + touch + small + + Excalidraw is a whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them + + + https://discourse.gnome.org/ + https://discourse.gnome.org/ + GPL-2.0-or-later + FSFAP + GNOME + org.gnome.Software.WebApp_dd7b0c5ff0c21c2984f8fc1a05d01c33aee4fe9d.desktop + https://discourse.gnome.org/uploads/default/optimized/1X/d7f8fbabd4cd13f5fdbf7c73bd203723a2ef36ea_2_512x512.png + + Chat + + + moderate + moderate + intense + + + pointing + keyboard + touch + small + + GNOME Project and Community related discussions + + + https://discourse.flathub.org/ + https://discourse.flathub.org/ + GPL-2.0-or-later + FSFAP + Flathub + org.gnome.Software.WebApp_02310f2fd700a63d17ecc2d4b261f6956d8a0193.desktop + https://discourse-flathub-org-uploads.s3.dualstack.us-east-1.amazonaws.com/optimized/1X/be4563846333bda6607c6c3c5b226dff9d213866_2_512x512.png + + Chat + + + moderate + moderate + intense + + + pointing + keyboard + touch + small + + A place for Flathub Contributors and Users + + + https://devdocs.io/ + https://devdocs.io/ + MPL-2.0 + FSFAP + DevDocs + org.gnome.Software.WebApp_962f69328d6450369f25a6fdb6bbd1764d11a3c8.desktop + https://devdocs.io/images/webapp-icon-32.png + https://devdocs.io/images/webapp-icon-60.png + https://devdocs.io/images/webapp-icon-80.png + https://devdocs.io/images/webapp-icon-128.png + https://devdocs.io/images/webapp-icon-192.png + https://devdocs.io/images/webapp-icon-256.png + https://devdocs.io/images/webapp-icon-512.png + + Documentation + Development + + + moderate + + + pointing + keyboard + touch + small + + API Documentation Browser + + + https://web.telegram.org/ + https://web.telegram.org/ + GPL-3.0-only + FSFAP + Telegram + org.gnome.Software.WebApp_78977f7aec98d1c072a768b6a366b8d99cde8df4.desktop + https://web.telegram.org/img/icons/icon16.png + https://web.telegram.org/img/icons/icon32.png + https://web.telegram.org/img/icons/icon60.png + https://web.telegram.org/img/icons/icon64.png + https://web.telegram.org/img/icons/icon90.png + https://web.telegram.org/img/icons/icon128.png + https://web.telegram.org/img/icons/icon192.png + https://web.telegram.org/img/icons/icon512.png + https://web.telegram.org/img/icons/icon.svg + + Chat + + + mild + + + pointing + keyboard + touch + small + + Telegram web app based on the MTProto protocol and Telegram's open API + + diff --git a/subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.csv b/subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.csv new file mode 100644 index 0000000..cb78d0c --- /dev/null +++ b/subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.csv @@ -0,0 +1,2 @@ +https://twitter.com/,LicenseRef-proprietary,Chat,social-info=intense;social-audio=moderate,adaptive, +https://www.photopea.com/,LicenseRef-proprietary,Photography;ImageProcessing,social-info=intense,not-adaptive,"Photopea is an advanced photo editor supporting PSD, XCF, Sketch, XD, and CDR formats" diff --git a/subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.xml b/subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.xml new file mode 100644 index 0000000..ba3752a --- /dev/null +++ b/subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.xml @@ -0,0 +1,62 @@ + + + + https://twitter.com/ + https://twitter.com/ + LicenseRef-proprietary + FSFAP + Twitter + org.gnome.Software.WebApp_5ea0d5a0681e425022d889f3e355de2f19f92070.desktop + https://abs.twimg.com/responsive-web/client-web-legacy/icon-default.ee534d85.png + https://abs.twimg.com/responsive-web/client-web-legacy/icon-default-large.8e027b65.png + + + https://abs.twimg.com/responsive-web/client-web-legacy/twitter-lite-data-saver-marketing.68059865.png + + + https://abs.twimg.com/responsive-web/client-web-legacy/twitter-lite-explore-marketing.fd45b025.png + + + https://abs.twimg.com/responsive-web/client-web-legacy/twitter-lite-timeline-marketing.befcdb45.png + + + + Chat + News + News + + + intense + moderate + + + pointing + keyboard + touch + small + + Get breaking news, politics, trending music, world events, sports scores, and the latest global news stories as they unfold - all with less data + + + https://www.photopea.com/ + https://www.photopea.com/ + LicenseRef-proprietary + FSFAP + Photopea + org.gnome.Software.WebApp_b38ea26683d13dabcfbbc10824fcd7f3b88af94b.desktop + https://www.photopea.com/promo/icon512.png + + Photography + ImageProcessing + + + intense + + + pointing + keyboard + medium + + Photopea is an advanced photo editor supporting PSD, XCF, Sketch, XD, and CDR formats + + diff --git a/subprojects/gnome-pwa-list/meson.build b/subprojects/gnome-pwa-list/meson.build new file mode 100644 index 0000000..b5846f3 --- /dev/null +++ b/subprojects/gnome-pwa-list/meson.build @@ -0,0 +1,14 @@ +project('gnome-pwa-list') + +python3 = find_program('python3') + +gnome_pwa_list_foss = configure_file( + input: 'gnome-pwa-list-foss.xml', + output: 'gnome-pwa-list-foss.xml', + copy: true, +) +gnome_pwa_list_proprietary = configure_file( + input: 'gnome-pwa-list-proprietary.xml', + output: 'gnome-pwa-list-proprietary.xml', + copy: true, +) diff --git a/subprojects/gnome-pwa-list/pwa-metainfo-generator.py b/subprojects/gnome-pwa-list/pwa-metainfo-generator.py new file mode 100755 index 0000000..ef7f24a --- /dev/null +++ b/subprojects/gnome-pwa-list/pwa-metainfo-generator.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright 2021-2022 Matthew Leeds +# SPDX-License-Identifier: GPL-2.0+ + +""" +Generates AppStream metainfo for a set of Progressive Web Apps + +Usage: pwa-metainfo-generator.py LIST.CSV + +The CSV format expected looks like this: + +https://app.diagrams.net/,Apache-2.0 +https://pinafore.social/,AGPL-3.0-only +... + +The output will be written to a file with the same name as the input but a .xml +file ending. + +This tool uses the web app's manifest to fill out the AppStream info, so an +Internet connection is required +""" + +import csv +import sys +import xml.etree.ElementTree as ET +import requests +import json +import hashlib +from urllib.parse import urljoin +from bs4 import BeautifulSoup + +# w3c categories: https://github.com/w3c/manifest/wiki/Categories +# appstream categories: https://specifications.freedesktop.org/menu-spec/latest/apa.html +# left out due to no corresponding appstream category: +# entertainment, food, government, kids, lifestyle, personalization, politics, shopping, travel +w3c_to_appstream_categories = { + "books": "Literature", + "business": "Office", + "education": "Education", + "finance": "Finance", + "fitness": "Sports", + "games": "Game", + "health": "MedicalSoftware", + "magazines": "News", + "medical": "MedicalSoftware", + "music": "Music", + "navigation": "Maps", + "news": "News", + "photo": "Photography", + "productivity": "Office", + "security": "Security", + "social": "Chat", + "sports": "Sports", + "utilities": "Utility", + "weather": "Utility" +} + + +def get_manifest_for_url(url): + response = requests.get(url) + response.raise_for_status() + soup = BeautifulSoup(response.text, 'html.parser') + + # Seems this link is broken for discourse, href value doesn't use quotes + if url.startswith('https://discourse.'): + manifest_path = '/manifest.webmanifest' + elif soup.head: + manifest_path = soup.head.find('link', rel='manifest', href=True)['href'] + else: + manifest_path = soup.find('link', rel='manifest', href=True)['href'] + + manifest_response = requests.get(urljoin(url, manifest_path)) + manifest_response.raise_for_status() + return json.loads(manifest_response.text) + +def copy_metainfo_from_manifest(url, app_component, manifest, categories, content_rating, adaptive, custom_summary): + # Short name seems more suitable in practice + try: + ET.SubElement(app_component, 'name').text = manifest['short_name'] + except KeyError: + ET.SubElement(app_component, 'name').text = manifest['name'] + + # Generate a unique app ID that meets the spec requirements. A different + # app ID will be used upon install that is determined by the backing browser + hashed_url = hashlib.sha1(url.encode('utf-8')).hexdigest() + app_id = 'org.gnome.Software.WebApp_' + hashed_url + '.desktop' + ET.SubElement(app_component, 'id').text = app_id + + # Avoid using maskable icons if we can, they don't have nice rounded edges + normal_icon_exists = False + for icon in manifest['icons']: + if 'purpose' not in icon or icon['purpose'] == 'any': + normal_icon_exists = True + + for icon in manifest['icons']: + if 'purpose' in icon and icon['purpose'] != 'any' and normal_icon_exists: + continue + icon_element = ET.SubElement(app_component, 'icon') + icon_element.text = urljoin(url, icon['src']) + icon_element.set('type', 'remote') + size = icon['sizes'].split(' ')[-1] + icon_element.set('width', size.split('x')[0]) + icon_element.set('height', size.split('x')[1]) + + if 'screenshots' in manifest: + screenshots_element = ET.SubElement(app_component, 'screenshots') + for screenshot in manifest['screenshots']: + screenshot_element = ET.SubElement(screenshots_element, 'screenshot') + screenshot_element.set('type', 'default') + image_element = ET.SubElement(screenshot_element, 'image') + image_element.text = urljoin(url, screenshot['src']) + size = screenshot['sizes'].split(' ')[-1] + image_element.set('width', size.split('x')[0]) + image_element.set('height', size.split('x')[1]) + if 'label' in screenshot: + ET.SubElement(screenshot_element, 'caption').text = screenshot['label'] + + categories_element = ET.SubElement(app_component, 'categories') + user_categories = categories.split(';') + for category in user_categories: + if len(category) > 0: + ET.SubElement(categories_element, 'category').text = category + if 'categories' in manifest: + for category in manifest['categories']: + try: + mapped_category = w3c_to_appstream_categories[category] + if mapped_category not in user_categories: + ET.SubElement(categories_element, 'category').text = mapped_category + except KeyError: + pass + + if len(content_rating) > 0: + ratings_element = ET.SubElement(app_component, 'content_rating') + ratings_element.set('type', 'oars-1.1') + content_ratings = content_rating.split(';') + for rating in content_ratings: + if len(rating) > 0: + rating_element = ET.SubElement(ratings_element, 'content_attribute') + rating_element.text = rating.split('=')[1] + rating_element.set('id', rating.split('=')[0]) + + if adaptive in ('adaptive', 'not-adaptive'): + recommends_element = ET.SubElement(app_component, 'recommends') + ET.SubElement(recommends_element, 'control').text = 'pointing' + ET.SubElement(recommends_element, 'control').text = 'keyboard' + if adaptive == 'adaptive': + ET.SubElement(recommends_element, 'control').text = 'touch' + display_element = ET.SubElement(recommends_element, 'display_length') + display_element.set('compare', 'ge') + if adaptive == 'adaptive': + display_element.text = 'small' + else: + display_element.text = 'medium' + + summary = '' + if len(custom_summary) > 0: + summary = custom_summary + elif 'description' in manifest: + summary = manifest['description'] + + if len(summary) > 0: + # appstreamcli validate recommends summary not ending with '.' + if summary.endswith('.'): summary = summary[:-1] + # ...and not containing newlines + summary = summary.replace('\n', ' ').strip() + ET.SubElement(app_component, 'summary').text = summary + +def main(): + if len(sys.argv) != 2 or not sys.argv[1].endswith('.csv'): + print('Usage: {} input.csv'.format(sys.argv[0])) + sys.exit(1) + + input_filename = sys.argv[1] + out_filename = input_filename.replace('.csv', '.xml') + with open(input_filename) as input_csv: + components = ET.Element('components') + components.set('version', '0.15') + reader = csv.reader(input_csv) + for (i, app) in enumerate(reader): + if len(app) != 6: + print('Line {} has the wrong number of columns!'.format(i+1), file=sys.stderr) + sys.exit(2) + + app_component = ET.SubElement(components, 'component') + app_component.set('type', 'web-application') + + launchable = ET.SubElement(app_component, 'launchable') + launchable.set('type', 'url') + launchable.text = app[0] + + url = ET.SubElement(app_component, 'url') + url.set('type', 'homepage') + url.text = app[0] + + project_license = ET.SubElement(app_component, 'project_license') + project_license.text = app[1] + + # metadata license is a required field but we don't have one, assume FSFAP? + metadata_license = ET.SubElement(app_component, 'metadata_license') + metadata_license.text = 'FSFAP' + + print('Processing entry \'{}\' from file \'{}\''.format(app[0], input_filename)) + copy_metainfo_from_manifest(app[0], app_component, get_manifest_for_url(app[0]), + app[2], app[3], app[4], app[5]) + + tree = ET.ElementTree(components) + ET.indent(tree) + tree.write(out_filename, xml_declaration=True, encoding='utf-8', method='xml') + + +if __name__=='__main__': + main() diff --git a/subprojects/gtk.wrap b/subprojects/gtk.wrap new file mode 100644 index 0000000..a640ea5 --- /dev/null +++ b/subprojects/gtk.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gtk +url=https://gitlab.gnome.org/GNOME/gtk.git +revision=4.16.0 +depth=1 diff --git a/subprojects/libadwaita.wrap b/subprojects/libadwaita.wrap new file mode 100644 index 0000000..1ae9168 --- /dev/null +++ b/subprojects/libadwaita.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=libadwaita +url=https://gitlab.gnome.org/GNOME/libadwaita.git +revision=1.6.0 +depth=1 diff --git a/subprojects/libglib-testing.wrap b/subprojects/libglib-testing.wrap new file mode 100644 index 0000000..e3c06f2 --- /dev/null +++ b/subprojects/libglib-testing.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory = libglib-testing +url = https://gitlab.gnome.org/pwithnall/libglib-testing.git +revision = 0.1.1 +depth = 1 diff --git a/subprojects/libxmlb.wrap b/subprojects/libxmlb.wrap new file mode 100644 index 0000000..8b46a7d --- /dev/null +++ b/subprojects/libxmlb.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory = libxmlb +url = https://github.com/hughsie/libxmlb.git +revision = main +depth = 1 diff --git a/subprojects/malcontent.wrap b/subprojects/malcontent.wrap new file mode 100644 index 0000000..e41381a --- /dev/null +++ b/subprojects/malcontent.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=malcontent +url=https://gitlab.freedesktop.org/pwithnall/malcontent.git +revision=ab75b35d91a32aae6179f42a8037a8ef28e2f3c5 +depth=1 diff --git a/subprojects/sysprof.wrap b/subprojects/sysprof.wrap new file mode 100644 index 0000000..6a807b1 --- /dev/null +++ b/subprojects/sysprof.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=sysprof +url=https://gitlab.gnome.org/GNOME/sysprof.git +revision=555ec04e322ec979c84a7a21d09a5afd9c02f672 +depth=1 diff --git a/tests/actions.py b/tests/actions.py new file mode 100755 index 0000000..3bb0268 --- /dev/null +++ b/tests/actions.py @@ -0,0 +1,61 @@ +#! /usr/bin/python + +# This a simple test, using the dogtail framework: +# +# Activate the app via the org.gtk.Application bus interface. +# Check that the expected actions are exported on the session bus. +# Activate each action and verify the result. + +import os +from gi.repository import Gio + +settings = Gio.Settings.new("org.gnome.desktop.interface") +settings.set_boolean ("toolkit-accessibility", True) + +from dogtail.tree import * +from dogtail.utils import * +from dogtail.procedural import * +from dogtail.rawinput import keyCombo + +try: + run('gnome-software') + + app = root.application('gnome-software') + + bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) + proxy = Gio.DBusProxy.new_sync(bus, Gio.DBusProxyFlags.NONE, + None, + 'org.gnome.Software', + '/org/gnome/Software', + 'org.gtk.Application') + proxy.call_sync('Activate', GLib.Variant('(a{sv})', ({},)), 0, -1, None) + + doDelay(1) + assert (len(app.children) == 1) + + dbus_actions = Gio.DBusProxy.new_sync(bus, Gio.DBusProxyFlags.NONE, + None, + 'org.gnome.Software', + '/org/gnome/Software', + 'org.gtk.Actions') + + names = dbus_actions.call_sync('List', None, 0, -1, None).unpack()[0] + assert (u'quit' in names) + assert (u'about' in names) + + dbus_actions.call_sync('Activate', + GLib.Variant('(sava{sv})', (u'about', [], {})), + 0, -1, None) + + doDelay (1) + assert (len(app.children) == 2) + keyCombo("") + doDelay (1) + assert (len(app.children) == 1) + + dbus_actions.call_sync('Activate', + GLib.Variant('(sava{sv})', (u'quit', [], {})), + 0, -1, None) + assert (len(app.children) == 0) +finally: + os.system("killall gnome-software") diff --git a/tests/basic.py b/tests/basic.py new file mode 100755 index 0000000..1006ecf --- /dev/null +++ b/tests/basic.py @@ -0,0 +1,151 @@ +#! /usr/bin/python + +# This a simple test, using the dogtail framework: +# +# Click on All, Installed, Updates and check that the button state +# and the main page content update as expected. Type a few characters +# on the overview page, hit Enter, and verify that we end up on the +# search page. Hit Escape and verify that we go back to the overview +# page. + +from gi.repository import Gio + +settings = Gio.Settings.new("org.gnome.desktop.interface") +settings.set_boolean ("toolkit-accessibility", True) + +import os +from dogtail.tree import * +from dogtail.utils import * +from dogtail.procedural import * + +try: + run('gnome-software') + + app_name = 'gnome-software' + app = root.application(app_name) + + all_button = app.child('All') + installed_button = app.child('Installed') + updates_button = app.child('Updates') + back_button = app.child('Go back') + + overview_page = app.child('Overview page') + installed_page = app.child('Installed page') + updates_page = app.child('Updates page') + search_page = app.child('Search page') + details_page = app.child('Details page') + install_button = details_page.child('Install') + uninstall_button = details_page.child('Uninstall') + + search_page_listbox = search_page.child(roleName='list box') + + all_button.click() + assert (all_button.checked) + assert (not installed_button.checked) + assert (not updates_button.checked) + assert (overview_page.showing) + assert (not installed_page.showing) + assert (not updates_page.showing) + assert (not search_page.showing) + + installed_button.click() + assert (not all_button.checked) + assert (installed_button.checked) + assert (not updates_button.checked) + assert (not overview_page.showing) + assert (installed_page.showing) + assert (not updates_page.showing) + assert (not search_page.showing) + + updates_button.click() + assert (not all_button.checked) + assert (not installed_button.checked) + assert (updates_button.checked) + assert (not overview_page.showing) + assert (not installed_page.showing) + assert (updates_page.showing) + assert (not search_page.showing) + + installed_button.click() + assert (not all_button.checked) + assert (installed_button.checked) + assert (not updates_button.checked) + assert (not overview_page.showing) + assert (installed_page.showing) + assert (not updates_page.showing) + assert (not search_page.showing) + + all_button.click() + assert (all_button.checked) + assert (not installed_button.checked) + assert (not updates_button.checked) + assert (overview_page.showing) + assert (not installed_page.showing) + assert (not updates_page.showing) + assert (not search_page.showing) + + type("archive\n") + doDelay(2) + assert (not all_button.checked) + assert (not installed_button.checked) + assert (not updates_button.checked) + assert (not overview_page.showing) + assert (not installed_page.showing) + assert (not updates_page.showing) + assert (search_page.showing) + + """Details page test section""" + search_page_listbox.child(roleName='label', name='Archive Manager').click() + doDelay(4) + assert (not overview_page.showing) + assert (not installed_page.showing) + assert (not updates_page.showing) + assert (not search_page.showing) + assert (details_page.showing) + assert (install_button.showing or uninstall_button.showing) + assert (back_button.showing) + assert (root.application(app_name).child('Details page') + .child(roleName='push button', name='History') + .states.contains(pyatspi.STATE_VISIBLE)) + assert (root.application(app_name).child('Details page') + .child(roleName='push button', name='Website') + .states.contains(pyatspi.STATE_VISIBLE)) + + if install_button.showing: + assert (not root.application(app_name).child('Details page') + .child(roleName='push button', name='Launch') + .states.contains(pyatspi.STATE_VISIBLE)) + else: + assert (root.application(app_name).child('Details page') + .child(roleName='push button', name='Launch') + .states.contains(pyatspi.STATE_VISIBLE)) + + back_button.click() + assert (not all_button.checked) + assert (not installed_button.checked) + assert (not updates_button.checked) + assert (not overview_page.showing) + assert (not installed_page.showing) + assert (not updates_page.showing) + assert (search_page.showing) + assert (not install_button.showing) + assert (not uninstall_button.showing) + assert (not back_button.showing) + + keyCombo("Escape") + assert (all_button.checked) + assert (not installed_button.checked) + assert (not updates_button.checked) + assert (overview_page.showing) + assert (not installed_page.showing) + assert (not updates_page.showing) + assert (not search_page.showing) + + super_menu = root.application('gnome-shell').child(roleName='menu', name='Software') + super_menu.click() + root.application('gnome-shell').child(roleName='label', name='Software Sources').click() + assert (len(app.children) == 2) + sources_dialog = app.children[-1] + assert (sources_dialog.child(roleName='label', name='Software Sources')) +finally: + os.system("killall gnome-software") diff --git a/tests/template.test.in b/tests/template.test.in new file mode 100644 index 0000000..9b72010 --- /dev/null +++ b/tests/template.test.in @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# SPDX-FileCopyrightText: 2025 GNOME Foundation, Inc. +[Test] +Type=session +Exec=@installed_tests_dir@/@program@ +Output=TAP